MySQL で、重複レコードを削除する。

重複レコードをSQLデータベースから一括削除:(Nucleusの使い方) にその方法が紹介されている。
  1. 対象のテーブルから重複レコードを除いて新しいテーブルにすべてのレコードを重複なしで書き出す
  2. もとのテーブルを削除
  3. 新しいテーブル名を変更
これはあまりスマートな方法を思えなかったので、他に方法はないか、あちこち探し回ってみたものの、うまい方法が見つからなかった。 SQL 文としては、以下のようになる。field_1、field_2(増やしてもよい)は、重複に関係するフィールドである。
CREATE TABLE temp_table as SELECT * FROM main_table GROUP BY field_1, field_2;
DROP TABLE main_table;
ALTER TABLE temp_table RENAME TO main_table;
重複レコードをSQLデータベースから一括削除:(Nucleusの使い方) にその方法が紹介されている。
  1. 対象のテーブルから重複レコードを除いて新しいテーブルにすべてのレコードを重複なしで書き出す
  2. もとのテーブルを削除
  3. 新しいテーブル名を変更
これはあまりスマートな方法を思えなかったので、他に方法はないか、あちこち探し回ってみたものの、うまい方法が見つからなかった。 SQL 文としては、以下のようになる。field_1、field_2(増やしてもよい)は、重複に関係するフィールドである。
CREATE TABLE temp_table as SELECT * FROM main_table GROUP BY field_1, field_2;
DROP TABLE main_table;
ALTER TABLE temp_table RENAME TO main_table;

Perl で、Base64 のファイルをデコードして元のバイナリファイルに戻す方法

メールに添付されてきた .pdf ファイルが巨大すぎてメールサーバによって分割されて自分のところに配信された結果、Base64 のデータがバラバラに届いたケースを考える。 このような場合は Perl が活躍する。まず、バラバラになった Base64 のファイルは仕方がないのでエディタを使って手作業でくっつけて 1つのファイルにする。そのあと、以下のコマンドを実行すればよい。 使用するモジュール use MIME::Base64;
perl -MMIME::Base64 -ne 'print decode_base64($_)'
< くっつけたBase64ファイル名.txt > 出力ファイル名.pdf

(上は、すべて1行に書く)
メールに添付されてきた .pdf ファイルが巨大すぎてメールサーバによって分割されて自分のところに配信された結果、Base64 のデータがバラバラに届いたケースを考える。 このような場合は Perl が活躍する。まず、バラバラになった Base64 のファイルは仕方がないのでエディタを使って手作業でくっつけて 1つのファイルにする。そのあと、以下のコマンドを実行すればよい。 使用するモジュール use MIME::Base64;
perl -MMIME::Base64 -ne 'print decode_base64($_)'
< くっつけたBase64ファイル名.txt > 出力ファイル名.pdf

(上は、すべて1行に書く)

Java で、ランダムな文字列を生成する方法

SecureRandom クラスを使う。以下は、16 バイトのランダムなバイト列を作る例。
import java.security.*;

...

public final static String RANDOM_ALGORITHM = "SHA1PRNG";
public final static int    RANDOM_LENGTH    = 16;

...

public byte[] getRandom() {

    try {

        SecureRandom random = SecureRandom.getInstance(RANDOM_ALGORITHM);
        byte seed[]         = random.generateSeed(RANDOM_LENGTH);
        byte b[]            = new byte[RANDOM_LENGTH];

        random.setSeed(seed);
        random.nextBytes(b);

    }catch(Exception e) {
        e.printStackTrace();
    }

    return b;
}
SecureRandom クラスを使う。以下は、16 バイトのランダムなバイト列を作る例。
import java.security.*;

...

public final static String RANDOM_ALGORITHM = "SHA1PRNG";
public final static int    RANDOM_LENGTH    = 16;

...

public byte[] getRandom() {

    try {

        SecureRandom random = SecureRandom.getInstance(RANDOM_ALGORITHM);
        byte seed[]         = random.generateSeed(RANDOM_LENGTH);
        byte b[]            = new byte[RANDOM_LENGTH];

        random.setSeed(seed);
        random.nextBytes(b);

    }catch(Exception e) {
        e.printStackTrace();
    }

    return b;
}

Java で、AES または DES でテキストを暗号化・復号化する方法

以下の encrypt メソッドの引数に String でテキスト文字列を渡すと、暗号化されたものがバイト列で返ってくる。復号は decrypt の引数にそのバイト列を渡す。両メソッド共、crypt_spec 引数に AES を指定すれば AES で暗号するし、DES を指定すれば DES で暗号化する。
import java.io.*;
import java.security.*;
import javax.crypto.*;
import javax.crypto.spec.*;

// CHANGE THIS VALUE DEPENDING ON WHAT YOU WANT
public static final int MESSAGE_LENGTH = 1024;

/**
* @param text
*            Message to encrypt
* @param secret_key
*            Secret Key
* @param crypt_spec
*            Crypt algorithm like "AES" or "DES"
* @return Encrypted Byte Strings
*/
public byte[] encrypt(String text, byte[] secret_key, String crypt_spec)
        throws InvalidKeyException, IllegalBlockSizeException, IOException,
        BadPaddingException {

    SecretKeySpec sKey = new SecretKeySpec(secret_key, crypt_spec);
    byte[] secret = new byte[MESSAGE_LENGTH];

    try {
        Cipher cipher = Cipher.getInstance(crypt_spec);
        cipher.init(Cipher.ENCRYPT_MODE, sKey);
        secret = cipher.doFinal(text.getBytes());
    } catch (Exception e) {
        System.out.println(this.getClass().getName()
                + ".encrypt: Exception:");
        e.printStackTrace();
    }
    return secret;
}

/**
* @param b
*            Encypted Byte Message
* @param crypt_spec
*            Crypt Algorithm like "AES" or "DES"
* @return Decrypted String
*/
public String decrypt(byte[] b, byte[] secret_key, String crypt_spec)
        throws InvalidKeyException, IllegalBlockSizeException, IOException,
        BadPaddingException {

    SecretKeySpec sKey = new SecretKeySpec(secret_key, crypt_spec);
    byte[] secret = new byte[MESSAGE_LENGTH];

    try {
        Cipher cipher = Cipher.getInstance(crypt_spec);
        cipher.init(Cipher.DECRYPT_MODE, sKey);
        secret = cipher.doFinal(b);
    } catch (Exception e) {
        System.out.println(this.getClass().getName()
                + ".decrypt: Exception:");
        e.printStackTrace();
    }
    return new String(secret);
}
以下の encrypt メソッドの引数に String でテキスト文字列を渡すと、暗号化されたものがバイト列で返ってくる。復号は decrypt の引数にそのバイト列を渡す。両メソッド共、crypt_spec 引数に AES を指定すれば AES で暗号するし、DES を指定すれば DES で暗号化する。
import java.io.*;
import java.security.*;
import javax.crypto.*;
import javax.crypto.spec.*;

// CHANGE THIS VALUE DEPENDING ON WHAT YOU WANT
public static final int MESSAGE_LENGTH = 1024;

/**
* @param text
*            Message to encrypt
* @param secret_key
*            Secret Key
* @param crypt_spec
*            Crypt algorithm like "AES" or "DES"
* @return Encrypted Byte Strings
*/
public byte[] encrypt(String text, byte[] secret_key, String crypt_spec)
        throws InvalidKeyException, IllegalBlockSizeException, IOException,
        BadPaddingException {

    SecretKeySpec sKey = new SecretKeySpec(secret_key, crypt_spec);
    byte[] secret = new byte[MESSAGE_LENGTH];

    try {
        Cipher cipher = Cipher.getInstance(crypt_spec);
        cipher.init(Cipher.ENCRYPT_MODE, sKey);
        secret = cipher.doFinal(text.getBytes());
    } catch (Exception e) {
        System.out.println(this.getClass().getName()
                + ".encrypt: Exception:");
        e.printStackTrace();
    }
    return secret;
}

/**
* @param b
*            Encypted Byte Message
* @param crypt_spec
*            Crypt Algorithm like "AES" or "DES"
* @return Decrypted String
*/
public String decrypt(byte[] b, byte[] secret_key, String crypt_spec)
        throws InvalidKeyException, IllegalBlockSizeException, IOException,
        BadPaddingException {

    SecretKeySpec sKey = new SecretKeySpec(secret_key, crypt_spec);
    byte[] secret = new byte[MESSAGE_LENGTH];

    try {
        Cipher cipher = Cipher.getInstance(crypt_spec);
        cipher.init(Cipher.DECRYPT_MODE, sKey);
        secret = cipher.doFinal(b);
    } catch (Exception e) {
        System.out.println(this.getClass().getName()
                + ".decrypt: Exception:");
        e.printStackTrace();
    }
    return new String(secret);
}