Monday, June 2, 2014

Suppress some Spotlight activities on Mac

I use git for work and most of the time, with a lot of branches. Every time I switch from branch to branch, and do a clean build, Spotlight gets so busy in the background (mds, mdworker). All those indexing work takes a lot CPU time and disk IO. But those efforts are pretty wasted. I use IDE for text search, and in another hour or two, I switch to another branch.

It is possible to suppress some Spotlight activities. From System Preferences, Spotlight, in the privacy tab, put the directory of git repository in the not-to-index list. Save CPU usage, battery, and generate less heat.

Saturday, February 2, 2013

Disable trackpoint on ThinkPad running Ubuntu

I run Ubuntu 12.04.1 LTS on ThinkPad. Most of the time, the track point gets in the way. I disable it with this command,

xinput -set-prop "TPPS/2 IBM TrackPoint" "Device Enabled" 0

Tuesday, July 10, 2012

GIMP 2.8 has arrived

GIMP (GNU IMAGE) 2.8 is here.

It just occurred to me the other day that GIMP was working on 2.8. I thought I would like to check it out.  When I got there (www.gimp.org), it is there.

I like the single view mode (under menu Windows, Single-Window-Mode).  It solved the only complaint I had with GIMP in the past. That is to click twice in order to re-focus on the other window when switching between tool/editor/layer windows.

I have not checked out what else is new in it. GIMP is one of a few open source projects I appreciated and used frequently. I would expect to continue creating a lot of digital assets from GIMP for my iPhone app projects.

Friday, March 30, 2012

Combine gmail and Java mail library to create your email compaign

If you use gmail for your company, you can run your own email campaign without paying those email campaign companies.  Write a small script or Java program to pull user data from your database and create a pretty HTML based email template. If you want to track them, insert the tracking in the HTML content.  Use the following code to start sending emails to your users.  Just be sure not to abuse the gmail account.


import java.io.File;
import java.util.Date;
import java.util.List;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;


public class Mailman extends javax.mail.Authenticator
{
    private String smtpServer;
    private String from;
    private String password;
    private boolean useAuth;


    public Mailman(String sender)
    {
        from = sender;
        smtpServer = "smtp.gmail.com";
    }


    public String getSmtpServer() { return smtpServer; }
    public void setSmtpServer(String svr) { smtpServer = svr; }


    public String getSender() { return from; }
    public void setSender(String fm) { from = fm; }


    public String getPassword() { return password; }
    public void setPassword(String passwd) {
        password = passwd;
        if (passwd != null && passwd.length() > 0) {
            useAuth = true;
        } else {
            useAuth = false;
        }
    }


    /*
     * This method sends plain text mail.
     */
    public void send(String subject, String body, String to, String cc)
    {
        try
        {
            Message msg = createMessage(subject, to, cc);
            msg.setText(body);
            Transport.send(msg);
        }
        catch (Exception ex) {
            throw new RuntimeException(ex);
        }
    }


    /*
     * this method sends mail with file attachments
     */
    public void send(String subject, String body, List<String> attachPaths, String to, String cc)
    {
        try
        {
            Message msg = createMessage(subject, to, cc);
            Multipart multipart = new MimeMultipart();
            MimeBodyPart messageBodyPart = new MimeBodyPart();
            messageBodyPart.setText(body);
            multipart.addBodyPart(messageBodyPart);


            for (String fileAttachment : attachPaths) {
                MimeBodyPart attachment = new MimeBodyPart();
                DataSource source = new FileDataSource(fileAttachment);
                attachment.setDataHandler(new DataHandler(source));
                attachment.setFileName(new File(fileAttachment).getName());
                multipart.addBodyPart(attachment);
            }
            msg.setContent(multipart);


            Transport.send(msg);
        }
        catch (Exception ex) {
            throw new RuntimeException(ex);
        }
    }


    protected Message createMessage(String subject, String to, String cc) throws Exception
    {
        Properties props = System.getProperties();
        props.put("mail.smtp.host", smtpServer);
        Session session = null;
        if ( useAuth ) {
            props.put("mail.smtp.starttls.enable","true");
            props.put("mail.smtp.auth", "true"); 
            // SSL
            props.put("mail.smtp.socketFactory.port", "465");
            props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
            props.put("mail.smtp.socketFactory.fallback", "false");


            session = Session.getInstance(props, this);
        } else {
            session = Session.getInstance(props);
        }
        // create a new message
        Message msg = new MimeMessage(session);


        if (from == null) {
          from = System.getProperty("user.name");
        }
        msg.setFrom(new InternetAddress(from));
        msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to, false));
        if (cc != null) {
            msg.setRecipients(Message.RecipientType.CC, InternetAddress.parse(cc, false));
        }


        // set the subjecttext
        msg.setSubject(subject);
        // set some other header information
        msg.setHeader("X-Mailer", "s3ar-JavaMail");
        msg.setSentDate(new Date());


        return msg;
    }


    @Override
    public PasswordAuthentication getPasswordAuthentication()
    {
        // you can read the password from a file
        // which should set mode as 0400


        return new PasswordAuthentication(from, password);
    }
}

Monday, March 26, 2012

Update xcodebuild path

The installation directory of Apple's IDE, Xcode, moved from /Developer to /Applications starting version 4.3.1. It caused some glitches for tools, such as xcodebuild, if invoked as a command-line utility.

To point it to the new installation base, use
sudo /usr/bin/xcode-select -switch /Applications/Xcode.app/

Verify the change with
/usr/bin/xcode-select -print-path

Monday, March 19, 2012

Examine multiple files in command less

To change to the next file after opening multiple files simultaneously in 'less' command, use this command

:n

And to change to the previous file, use

:p


The instruction should also be available from the man page.

Sunday, March 11, 2012

Create symbolic links in Windows 7

I was running XAMPP on Windows 7 and tried to use symbolic link point to the folders with PHP code. The soft link created in Cygwin (ln -s <directory> <link-name>) did not seem to be recognized by Apache. I found  I need to use native Windows command in the command prompt.

Run Command Prompt as administrator
> MKLINK /D <link-name> <target directory>

Note

I tried to use secpol.msc to grant myself with privilege for creating symbolic link.
secpol.msc via Start or Start → Run.
Open Security Settings → Local Policies → User Rights Assignment
It did not give me the permission to create symbolic link even after I re-log in. I have to run the command as administrator.