Home > 日記 > 日記2009後期 Archive

日記2009後期 Archive

Postgresをインストールしてみた

MySQLはJDBCからアクセスする時に全件取得するのでバッチ処理が書きづらいという理由でPostgreSQLをインストールしてみました。(フェッチサイズをInteger.MIN_VALUEに設定すれば1件づつの取得になりますが、この間に他のトランザクション走らせることができないので。)(あれ・・・コネクションを2本使えばいいのでは・・?)

インストールしたバージョンは8.4.2です。

ビルドします。

./configure --prefix=/lunar
make
make check
make install

DB初期化します。

initdb --encoding=utf-8 -U totoro --pgdata=/lunar/data/postgres

起動します。

pg_ctl -w -o "-i" -D /lunar/data/postgres -l /lunar/var/postgres.log start

スキーマを作ります。

createdb -E utf-8 -O totoro -W

 外部から接続できるように/lunar/data/postgres/pg_hba.confに設定を追加します。 allとか本当は良くないけど(・ε・)キニシナイ!!

host    all         all         192.168.0.0/24        md5

パスワードを設定しなおしました。

ALTER USER totoro with password 'xxxxxxxx';

他のホストから接続してみる。

psql -h 192.168.1.202 -U totoro postgres

手間はMySQLよりも1つ多いくらい。
やばい。。Postgresの設定パラメータの意味がわからない(´・ω・)
メモリ設定とかDISKのフラッシュ設定とかログ設定とか運用設定とか。

調べるか(´・ω・)

 

ClassLoaderを使って実行時にクラスを更新する方法(リロード処理)

JavaのClassLoaderの話をちょっとだけ。意外にClassLoaderを知らない人が居るようです。

ざっくりと説明をしますと、
クラスローダーにはBootstrapクラスローダーやシステムクラスローダー、コンテキストクラスローダーがあります。(あと拡張クラスローダーですかね)。そんでもって、クラスローダーは親子関係を持っています。委譲モデルと言って、あるクラスローダーにクラスをロードする依頼があると、親に依頼を委譲します。最初に発見されたクラスが実際にロードされるわけです。

1. Bootstrap (rt.jar)
2. 親クラスローダーA
3. 子クラスローダーB

こんなクラスローダーがあるとしてまだロードされていないクラスXをロードしようとした場合は次のように動作します。

  1. B.loadClass(X)
  2. Aに委譲
  3. Bootstrapに委譲
  4. BoostrapにXは存在しない
  5. AにXは存在しない
  6. BにXが存在するのでロードする。

ちなみにClassLoader#findClassをオーバーライドして自前の処理で上書きしてしまえば、この委譲モデルを破壊する事ができます。まぁそんな事は非推奨ですけど(´・ω・)

JVMプロセス内においては異なるClassLoaderで読み込んだクラスは例え同じバイナリでも異なるクラスとして扱われます。ClassLoaderAによってロードされたクラスXと、ClassLoaderBによってロードされたクラスXは別物です。
※クラスAとBが親子関係を持っていて、AがXをロードしている時にBでロードしても委譲モデルでAが既にロードしてあるXを使うので、こういう場合は同じ定義を指します。
TomcatのWebApps1とWebApps2の関係を想像すると理解しやすいと思います。

この特性を生かすとリロード処理が実現できるわけです。

ClassLoaderの細かい話はDeveloperWorksの記事が丁寧なのでそちらを参照した方が良いです。今回はTomcatにも実装されているリロード処理のサンプルを作ってみたいと思います。TomcatのドキュメントにTomcatのClassLoaderの戦略が書いてあるのでそれを参考にすると分かりやすいと思います。

例えばRPCサーバやスケジューラーを考えます。これらを設計する時には大きく二つに分けることができ、RPCサーバではサーバ本体と各命令、スケジューラーでも本体と各タスクという感じです。Tomcatの場合はServletエンジンとビジネスロジックを書いたServlet。(ビジネスロジックはServletに書くものではありませんけどね。)
RPCの命令、スケジューラーのタスク、ServletコンテナのServletは抽象化する事ができ、インターフェースを切ることが多いです。(HttpServletとかね。)

擬似コードだとこんな感じですね。

class MyServer {
  void run() {
    ITask task = getTask();
    task.execute();
  }
}

このMyServerとITaskを本体側のClassLoaderに、ITaskを実装したクラスを別のClassLoaderに読み込ませます。
例えば本体はCLASSPATHを指定してシステムクラスローダーに読み込ませます。(TomcatはBoostrap用のクラスを挟んでいますけどね。)
タスクは独自のクラスローダーをインスタンス化(このオブジェクトをc1とする)して(URLClassLoaderを直接でも良い)、そのClassLoaderを使ってクラス定義を読み込ませます。C言語だとdlopenみたいなイメージです。

異なるクラスローダーから読み込んだクラスは別のクラスになるので、リロードしたい場合はClassLoaderをもう1回インスタンス化(c2)してあげればいいのです。

文章だけで説明してもアレなので簡単なサンプルを書いてみました。
Thread#setContextClassLoaderを使うともっと簡単に書けると思います。

サンプルの内容は定期的にタスクを実行するだけのものです。Reload処理はJMX経由で行うようにしました。
Eclipse上で作る時はタスククラスは別プロジェクトで作るのが良いです。同じプロジェクトに入れてしまうとシステムクラスローダーによってタスクもロードされてしまうので。色々適当です。Sleepの代わりにSemaphoreを使っている理由はsleepの場合Future#cancelで割り込みが発生しなかったからです。Semaphoreだと割り込みが入ってすぐに終了できます。
tasklist.propertiesに登録したいタスクのクラス名を書く必要があります。まぁこんな事をしなくてもLunarClassLoaderに手を加えて特定のインターフェースを実装しているクラスを検索(列挙)すれば良いだけです。今回はそこまで余力がありませんでした。 タスク用のクラスパスはソースに直書きしています。自分の環境に合わせて修正してください。VMの引数に-Dhogehogeを指定してシステムプロパティとして読み込むのが一般的な方法かと思います。

package at.orz.lunar;

import java.io.File;
import java.lang.management.ManagementFactory;
import java.net.URL;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

import javax.management.MBeanServer;
import javax.management.ObjectName;

public class LunarBootstrap {

    public static void main(String[] args) throws Exception {

        URL[] urls = new URL[]{
            new File("C:/usr/local/eclipse3.5/workspace/lunar-subsystem/lunar-task.jar").toURI().toURL(),
            new File("C:/usr/local/eclipse3.5/workspace/lunar-subsystem/bin").toURI().toURL()
        };

        final ExecutorService service = Executors.newCachedThreadPool();
        final LunarServer lunarServer = LunarServer.newInstance(urls, Thread.currentThread().getContextClassLoader());
        final Future<?> future = service.submit(lunarServer);
        service.shutdown(); // 新規追加STOP

        MBeanServer mbServer = ManagementFactory.getPlatformMBeanServer();
        mbServer.registerMBean(new ServerOperationMXBean() {
            @Override
            public void stop() {
                lunarServer.stop();
                future.cancel(true);
                if (!service.isShutdown()) {
                    service.shutdown();
                }
            }
            @Override
            public void reload() {
                lunarServer.reload();
            }
        },  new ObjectName("at.orz.lunar.LunarBootstrap:name=LunarServer"));

    }

}

シングルインスタンスモデルにするか、プロトタイプモデルにするか迷ったのでclsMapとかでClass定義を保持しているわけです。今回はシングルインスタンスモデルにしたので実はclsMapは必要ありません。

package at.orz.lunar;

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Properties;

public class LunarClassLoader extends URLClassLoader {

    private HashMap<String, Class<? extends LunarTask>> clsMap = new HashMap<String, Class<? extends LunarTask>>();
    private HashMap<String, LunarTask> insMap = new HashMap<String, LunarTask>();

    public LunarClassLoader(URL[] urls, ClassLoader parent) {
        super(urls, parent);
        init();
    }

    @SuppressWarnings("unchecked")
    private void init() {

        try {

            Enumeration<URL> en = getResources("tasklist.properties");
            while (en.hasMoreElements()) {
                URL url =  en.nextElement();

                Properties prop = new Properties();
                InputStream is = url.openStream();
                prop.load(is);
                is.close();

                for (String clsName: prop.stringPropertyNames()) {
                    try {
                        Class<?> c = loadClass(clsName);
                        if (LunarTask.class.isAssignableFrom(c)) {
                            Class<? extends LunarTask> cls = (Class<? extends LunarTask>) c;
                            clsMap.put(clsName, cls);
                            System.out.printf("register class:%s%n", clsName);

                            LunarTask task = cls.newInstance();
                            task.init();
                            insMap.put(clsName, task);
                            System.out.printf("init class:%s%n", clsName);
                        }
                    } catch (ClassNotFoundException e) {
                        e.printStackTrace();
                    } catch (InstantiationException e) {
                        e.printStackTrace();
                    } catch (IllegalAccessException e) {
                        e.printStackTrace();
                    }
                }

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

    }

    void destroy() {
        for (LunarTask task : insMap.values()) {
            try {
                task.destroy();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        insMap.clear();
        clsMap.clear();
    }

    public LunarTask getTask(String className) {
        return insMap.get(className);
    }

    public Iterable<LunarTask> taskIterator() {
        return new HashMap<String, LunarTask>(insMap).values();
    }

}
package at.orz.lunar;

import java.net.URL;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;

public class LunarServer implements Runnable, ServerOperationMXBean {

    private LunarClassLoader loader;
    private volatile boolean running;
    private LunarServer() {

    }

    @Override
    public void run() {

        ExecutorService service = Executors.newFixedThreadPool(3);

        running = true;
        while (running) {
            for (final LunarTask task : loader.taskIterator()) {
                service.submit(new Runnable() {
                    @Override
                    public void run() {
                        task.execute();
                    }
                });
            }
            try {
                Semaphore sema = new Semaphore(0);
                sema.tryAcquire(10, TimeUnit.SECONDS);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        service.shutdown();

    }

    @Override
    public void reload() {
        LunarClassLoader curLoader = loader;
        LunarClassLoader newLoader = new LunarClassLoader(curLoader.getURLs(), curLoader.getParent());
        this.loader = newLoader;
        curLoader.destroy();
    }

    @Override
    public void stop() {
        running = false;
    }

    public static LunarServer newInstance(URL[] urls, ClassLoader parent) {
        LunarServer server = new LunarServer();
        server.loader = new LunarClassLoader(urls, parent);
        return server;
    }

}
package at.orz.lunar;

public interface LunarTask {
    public void init();
    public void destroy();
    public void execute();
}
package at.orz.lunar;

public interface ServerOperationMXBean {
    public void stop();
    public void reload();
}

ここからタスクです。Eclipse上では別プロジェクトにした方が良いです。今回は2つのクラスを登録します。

package at.orz.lunar.task;

import at.orz.lunar.LunarTask;

public class SampleTask1 implements LunarTask {
    @Override
    public void destroy() {
        System.out.println("SampleTask1.destroy()");
    }
    @Override
    public void execute() {
        System.out.println("☆SampleTask1.execute()");
    }
    @Override
    public void init() {
        System.out.println("SampleTask1.init()");
    }
}
package at.orz.lunar.task;

import at.orz.lunar.LunarTask;

public class SampleTask2 implements LunarTask {
    @Override
    public void destroy() {
        System.out.println("SampleTask2.destroy()");
    }
    @Override
    public void execute() {
        System.out.println("★SampleTask2.execute()");
    }
    @Override
    public void init() {
        System.out.println("SampleTask2.init()");
    }
}

クラスパスのルートにtasklist.propertiesを作成します。

at.orz.lunar.task.SampleTask1
at.orz.lunar.task.SampleTask2

実行した後にSampleTask2の内容を変更(★を★★★★★に変更)した後にjconsoleからreloadを呼び出した結果が↓です。

register class:at.orz.lunar.task.SampleTask2
SampleTask2.init()
init class:at.orz.lunar.task.SampleTask2
register class:at.orz.lunar.task.SampleTask1
SampleTask1.init()
init class:at.orz.lunar.task.SampleTask1
★SampleTask2.execute()
☆SampleTask1.execute()
★SampleTask2.execute()
☆SampleTask1.execute()
☆SampleTask1.execute()
★SampleTask2.execute()
☆SampleTask1.execute()
★SampleTask2.execute()
register class:at.orz.lunar.task.SampleTask2
SampleTask2.init()
init class:at.orz.lunar.task.SampleTask2
register class:at.orz.lunar.task.SampleTask1
SampleTask1.init()
init class:at.orz.lunar.task.SampleTask1
SampleTask1.destroy()
SampleTask2.destroy()
☆SampleTask1.execute()
★★★★★SampleTask2.execute()
☆SampleTask1.execute()
★★★★★SampleTask2.execute()

リロード処理の所にログ仕込むの忘れたのでリロードが発端になっているかは確認できませんが、リロード処理は呼ばれています(; ・`д・´)
そしてリ新しいクラスの内容が読み込まれているのも確認できます。

※途中から書くのが面倒になったのがソースからわかっちゃうと思いますが、サンプルなので気にしない(・ε・)

ただし、このような処理はちょっとミスするとPermGenが解放されずにOutOfMemoryErrorを引き起こす原因になりやすいので気をつけましょー。(IBMのVM使えばいいじゃんとかそういう野暮な事は言わないの。)

 

Solr1.4のbackupのバグ

Solr1.4ではとあるURLにアクセスする事でバックアップ(スナップショット)を取れるようになっています。

http://wiki.apache.org/solr/SolrReplication

↑のSolrのWikiにもあるようにReplicationの機能をONにする必要がありますが、スレーブの設定をしなくても動作するのでマスタのみでもきちんと動作します。
以下のURLにアクセスするとデータディレクトリと同列に「snapshot.日時」というディレクトリを作成します。

http://master_host:port/solr/replication?command=backup

この時、日付はyyyyMMddHHmmssという書式が指定されているはずなのですが、実はHHがhhになっており、午後の18時に実行しても18にならずに06になってしまいます。

SnapShooterというクラスのDATE_FMTの指定を見ると思いっきり小文字で指定されています。 

むむー。バグだよね。これは。

まぁだいたいが早朝にバックアップをすると思うから気がつかないんだと思うけど。。

Amazonの関連商品

AmazonにはProduct Advertising APIというサービスがあります。ECSとかAWSとか言われていたやつです。

関連商品の取得方法にはいくつか方法があり大きく分けると、サーチ系のAPIのResponseGroupにSimilaritiesを指定するかSimilarityLookupというAPIを使うかです。

ItemLookupのResponseGroupに指定すると5件、SimilarityLookupを使うと10件取得できます。SimilarityLookupのResponseGroupにSimilaritiesを指定するとさらにその10件の関連商品を取得できます。(まぁこの場合は殆どが被っていますが・・・。)

ただしAmazonのホームページを見ると70件近くの関連商品が表示されています。
SimilarityLookupで複数のItemIdを指定しRandom抽出(和集合)を取得するようにしても、同じ集合が取れません(´・ω・`)
商品Aの関連商品A1~A10のASINがあって、A-A1の和集合、A-A2の和集合.... をマージ等、色々試してみましたがやっぱり公式サイトと同じリストを再現できません。あそこのリストどうやって作っているのでしょう(´・ω・)

煮詰まってしまったので公式サイトのHTMLから引っこ抜いてみました。

http://www.amazon.co.jp/dp/{ASIN}

このページにアクセスしますが、User-AgentをきちんとAjaxをサポートしているブラウザのやつに指定する必要があります。適当なUser-Agentつけて送ったらJavaScriptのコードが出力されませんでした。Firefox3.5のUser-Agentを使ったらJavaScbriptのコードも出力されました。

var purchaseAsinList = new Array("aaa","bbb","ccc");

この様なコードが出力されているのでパースするだけです。Javaなら↓のようなコードでぱぱっと。

int beginIndex = html.indexOf("var purchaseAsinList");
int endIndex = html.indexOf("\n", beginIndex);
String pscript = (html.substring(beginIndex, endIndex));

Matcher m = Pattern.compile("\"(\\w+)\"").matcher(pscript);
while (m.find()) {
    System.out.println(m.group(1));
}

微妙・・。きちんとAPIを叩いて処理したいです(´・ω・)
というわけで情報募集です。

こんなコードを書いていた私涙目。

こちらの記事にあったので私はこんなコードを書いていましたという返信。

ttp://1978th.net/tech/promenade.cgi?id=68

インラインアセンブラです。
x86オンリーなのかもしれませんが私の場合は動作させる環境が固定なので。

static __inline__ void __attribute__ ((__always_inline__))
	atomic_add(volatile int *pv1, int v2)
{
	__asm__ volatile (
		"lock; addl %1,%0"
		: "=m" (*pv1)
		: "ir" (v2), "m" (*pv1));
}

これを、
#if defined(_GCC) とかそういうマクロで判定して使ってます。
速度?そんなの知りません( ゚Д゚)y─┛~~

簡単な人工無脳BOTを作ってみました

文章をしゃべらせてみた。

とりあえず10個ぶんです。

  • でも、そこは国の偉い人のクポ~。
  • モ~グリもできるならば脱皮したいくらいクポ~。
  • それに、錬金術ギルドのアズィマさんが東方のフェスティバルを炸裂させる過激な話を披露するらしいし、職人さんが考案した変てこなゲームの景品は、かつて暑い日が兵や冒険者の偉い人の肝いり。ちょっと恒例のお祭りらしいクポ~。
  • クポ? 別にモーグリだものでブリザガVを引き継いだけが、郊外ではラカポポダンサーズが強硬に組まれる宝楼ではラカポポダンサーズが集まってリニューアルオープンするって噂クポ
  • とにかく、ご主人さまも、商人さんもできるならば脱皮したいくらいクポ!(……ヒソヒソヒソ……気合いの入れようが東方のクポ~。
  • もうすぐ広場に主張した都市上空で踊ってク~んな時はな~んにもやる気が違うらしいクポ~。
  • モ~グリもできるならば脱皮したいくらいクポ~。
  • クポ? 別にモーグリだもので暑い日々を乗り切るクポ~ッ!!
  • この暑さが兵や冒険者の士気に影響を及ぼしたら大変!って噂クポ。
  • とにかく、ご主人さまァ~、な~んだか暑い時分に影響をお招きしようって主旨のお祭りらしいクポ? 別にモーグリだものでワイワイ楽しく遊んで、みんなでワイワイ楽しく遊んで踊って天から涼風をゲットしたクポッ!

元データはこちら。

ご主人さまァ~、な~んだか暑い日が続いてるクポね~ッ!
こ~んな時はな~んにもやる気がなくなるクポ~。
モ~グリもできるならば脱皮したいくらいクポ~。

クポ? 別にモーグリだけが、だらけてるわけじゃないクポよ~ッ!
この暑さには、職人さんも、商人さんも、衛兵さんも、み~んなうんざりしてるのクポ~。

でも、耳よりな話をゲットしたクポッ!
この暑さが兵や冒険者の士気に影響を及ぼしたら大変!ってことで、三国の偉い人たちが集まって話し合い、モグハウス管理組合にも働きかけて、なんと「あますず(天涼)祭り」の開催が決定されたクポ~ッ!

これは、かつて暑い時分に開かれていた恒例のフェスティバルを引き継いだもので、みんなでワイワイ楽しく遊んで踊って天から涼風をお招きしようって主旨のお祭りらしいクポ~。
でも、そこは国の偉い人の肝いり。ちょっと恒例のものとは気合いの入れようが違うらしいのクポ!(……ヒソヒソヒソ……気合いといっても、ある国の偉い人が強硬に主張した都市上空でブリザガVを炸裂させる過激な作戦は却下されたらしいから、安心してほしいクポ……)

もうすぐ広場に組まれる宝楼ではラカポポダンサーズが東方の納涼踊を披露するらしいし、郊外ではあの金魚すくい屋が豪華景品を引っさげてリニューアルオープンするって噂クポ。
それに、錬金術ギルドのアズィマさんが考案した変てこなゲームの景品は、なんと嬉し恥ずかしのッ?! ……ととっ、これ以上は口止めされてたクポッ!
とにかく、ご主人さまも「あますず祭り」に参加してク~ルな気分で暑い日々を乗り切るクポ~ッ!!
 

ありふれた方法を使いました。まだ工夫も何もしていません。
Yahoo!の形態素解析を使って単語を分解した後に、連続した品詞情報は複合品詞として処理して(名詞が複数続いた場合は複合名詞など)マルコフモデルを使いました。一応品詞情報も考慮してみました。適当に作ってもそこそこの文章ができるものですねー。精度を上げるには感情クラスタ、話題クラスタとかを求めて直近の話題に近い事を話すようにしたり、単語の連結コストを考慮したりするらしいです。

Solaris10(x86)でのtcucodec confの結果

SPARC機を探したのですが私の権限で触れるところにはありませんでした。
http://1978th.net/tech/promenade.cgi?id=39

というわけで私の家のSolarisでの結果を。
Core2Quad 9650上の64ビットLinux上にVMWareでSolarisを動かしている嘘んこ環境ですが・・。

SunOS tamsvr11 5.10 Generic_137138-09 i86pc i386 i86pc Solaris
 
[tamtam@tamsvr11 tokyocabinet-1.4.39]$ ./tcucodec conf
myconf(version): 1.4.39
myconf(sysname): SunOS
myconf(libver): 902
myconf(formatver): 1.0
myconf(prefix): /usr/local
myconf(includedir): /usr/local/include
myconf(libdir): /usr/local/lib
myconf(bindir): /usr/local/bin
myconf(libexecdir): /usr/local/libexec
myconf(appinc): -I/usr/local/include
myconf(applibs): -L/usr/local/lib -ltokyocabinet -lbz2 -lz -lrt -lpthread -lm -lc
myconf(bigend): 0
myconf(usezlib): 1
myconf(usebzip): 1
type(bool): size=1 align=1 offset=1 max=1
type(char): size=1 align=1 offset=1 max=127
type(short): size=2 align=2 offset=2 max=32767
type(int): size=4 align=4 offset=4 max=2147483647
type(long): size=4 align=4 offset=4 max=2147483647
type(long long): size=8 align=8 offset=4 max=9223372036854775807
type(float): size=4 align=4 offset=4 max=3.40282e+38
type(double): size=8 align=8 offset=4 max=1.79769e+308
type(long double): size=12 align=4 offset=4 max=1.18973e+4932
type(void *): size=4 align=4 offset=4
type(intptr_t): size=4 align=4 offset=4 max=2147483647
type(size_t): size=4 align=4 offset=4 max=4294967295
type(ptrdiff_t): size=4 align=4 offset=4 max=2147483647
type(wchar_t): size=4 align=4 offset=4 max=2147483647
type(sig_atomic_t): size=4 align=4 offset=4 max=2147483647
type(time_t): size=4 align=4 offset=4 max=2147483647
type(off_t): size=4 align=4 offset=4 max=2147483647
type(ino_t): size=4 align=4 offset=4 max=4294967295
type(tcgeneric_t): size=8 align=4 offset=4
macro(RAND_MAX): 32767
macro(PATH_MAX): 1024
macro(NAME_MAX): 255
macro(P_tmpdir): /var/tmp/
sysconf(_SC_CLK_TCK): 100
sysconf(_SC_OPEN_MAX): 256
sysconf(_SC_PAGESIZE): 4096
sysinfo(utime): 0.002330
sysinfo(stime): 0.005270
stat(st_uid): 100
stat(st_gid): 100
stat(st_blksize): 8192

社会人として

私は勤怠があんまり良くないので人のことをとやかく言えるわけではありませんが・・。

適切な服装(ビジネスカジュアル)が分からないとか、名刺交換の練習をするから名刺入れを持ってこいって言われたけど名刺も持っていく必要ありますか?とか、今まで名刺を財布に入れていて渡すときに汚れちゃってるけどそのまま渡しちゃってるとか、それってどーなのよ。

まじ勘弁して欲しい。

 

この前会った新人の人、すっごい礼儀正しいよなぁ・・。
新人のが社会人としての基礎が立派という・・。
そして貪欲さを感じた。フレッシュ!
分からない部分や納得できない部分を素直に聞くというのはすばらしい事ですよ!!

 

久しぶりに書く記事がこんなんか・・・。
別の記事でも書くか。

落とし物

yume.png

ぱんつ

近所の本屋は新刊の取りそろえが悪い!
そのわりにアマゾンで1ヶ月待ちの本が置いてあったりする。

「ぱんつ」大全

執拗におすすめしてくるのでぽちってみた。
そろそろPoserを7から8にバージョンアップさせて遊ぼうかと思いまして。資料として買っておこうかなと。
まぁ資料としてはイマイチでしたが・・。

後は近所の本屋に置いてあったので↓を。

プラナス・ガール 1 (ガンガンコミックスJOKER)  ちょく! 1 (ガンガンコミックスONLINE)

プラナス・ガール

合格発表の時に出会った一人の少女に一目惚れした槙。入学して偶然にも同じクラスになったがその少女はなんと男だった!! 果たして槙の恋の行方は!?

のほほんとしたそっち系ではない普通に面白いマンガです。

ちょく!

美少女ゲーム大好きで友達のいない高校生:水橋直は何故か男子トイレにいた芹花という女の子に出会う…。直に一目惚れしてしまった芹花は鼻血を出しながら告白するのであったが…。芹花の暴走っぷり、流血っぷりがもの凄い…!! 大流血ラブコメディー!!(オモシロアイテム付き)

色々ぶっとんでるマンガでした。ヒロインが普通にう○こ言います。バレンタインう○ことかシュールすぎる・・。 

両方ともスクエニ出版らしいのですが、スクエニの本こんなんばっかりだな!
・・・面白かったです(*´∀`)

あとはソウルイーターとかファイブとか。

ついでにAmazonで色々みてたら、今なら普通に買えるみたいですよ。ラブプラス。

ラブプラス

Memcached1.4.2をx86_Solaris10でビルドする

libevent-1.4.12とmemcached-1.4.2の組み合わせでビルド環境は↓のような感じです。

$uname -a
SunOS tamsvr11 5.10 Generic_137138-09 i86pc i386 i86pc Solaris

$gcc -v
/usr/local/lib/gcc/i386-pc-solaris2.10/3.4.6/specs から spec を読み込み中
コンフィグオプション: ../configure --with-as=/usr/ccs/bin/as --with-ld=/usr/ccs/bin/ld --enable-shared --enable-languages=c,c++,f77
スレッドモデル: posix
gcc バージョン 3.4.6

libeventは普通にconfigureしてgmake; gmake installで通ります。

memcachedは-pthreadなんてオプション知らないよ!怒られます。というわけで怒られないようにするには3種類の方法があります。1つはGCCを使わない(ぉぃ)。2つめはconfigure時に「--disable-coverage」をつける。3つめはMakefileの-pthreadを-pthreadsに置換する。(最後にsがついているのが違いです)

2番目のやり方だと以下のような感じになります。

./configure --prefix=/export/home/tamtam/service/memcached-1.4.
2 --with-libevent=/export/home/tamtam/service/libevent-1.4.12 --disable-coverage
gmake
gmake install

3番目のやり方だと以下のような感じになります。

./configure --prefix=/export/home/tamtam/service/memcached-1.4.
2 --with-libevent=/export/home/tamtam/service/libevent-1.4.12
perl -i -p -e "s/-pthread/-pthreads/g;" Makefile
gmake
gmake install

本当はLDFLAGSに-Rxxxとか指定してますが省略しました。

SOLR 1.4のIssueが0になってる!

というわけで今週中にはリリースされると期待!

http://issues.apache.org/jira/browse/SOLR?report=com.atlassian.jira.plugin.system.project:roadmap-panel

わくわくてかてか。

Apacheで2GB以上のファイルアップロードを扱う

久しぶりに記事を書いてみます。

今回はApache+Tomcatで2GB以上のファイルを扱う方法です。2GB以上のファイルがアップできないよーと言われたのが発端なのですが、まぁちょっと調べてみました。(2GB以上をアップする事なんて普通無いだろうと思うわけですが、それが結構あるんですよw)2GBの壁ということはsigned intのMAXという事になります。

問題になったシステムはSolaris10_x86(uいくつか忘れた。たぶん5くらい?w)にApache2.2.11+mod_proxy_ajp+Tomcat6.0.18 (JDK6u13)という構成です。原因はいくつかありますが、順番にチェックしていきました。

まずはログを調べてみたらTomcatがparseLongでエラーを吐いている。Content-Lengthの値がおかしいという事で、Tomcatにデバッガをしかけてチェック!。どうやら値がマイナス値のご様子。この時点でTomcatは悪くないという事に。(ちなみにTomcat6.0.13だとparseIntを使っているので注意)
次に簡単に調べられるところは、、、ApacheのログでContent-Lengthを出力するようにしてみた(${Content-Length}i)。見事にマイナス値。
この時点でおかしいのはApacheかブラウザという事に。

ブラウザが対応していないのではないか?説。

確かに検索をしてみるとブラウザによっては2GB以上のファイルはそもそもブラウザ側がPOST制限をかけている場合があるようです。その回避策としてはFLASHやJavaアプレットで分割させたりしましょうというらしい。で、問題になっているシステムはFlashでアップロードしていたのでした。どんな値を送っているのかな。と思ってWireSharkでパケットキャプチャ。ここでは見事に4GB以上のファイルも正の値で送信されていました。
原因はApacheにあり!

という事でApacheにログを仕込んでビルドしようと思ったけど、ビルドの時間を待つのが耐えられないのでソースを追ってみた。Content-Lengthでソースを検索すればそれっぽいのがいっぱい出てくる。server/util_script.cで処理しているみたい。さらにソースを読み進めていきます。

リクエストの情報はrequest_recという構造体に格納するようになっていて、Content-Lengthはそのclengthというメンバに格納される。この型はapr_off_t。これはsrclib/apr.hで定義されていてoff_tのtypedefである。で、off_tっていうのはlongで定義されているわけです。つまり32ビット!謎はとけました。

Solarisのマニュアルはこちら http://jp.sun.com/practice/software/solaris/jp/wp/Sol_file/sol_3.html

off_tを64ビット(long long)にするには、マクロを定義すればいいらしい。
Configure時にこうかな。「-D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64
本当は_FILE_OFFSET_BITS=64のみで良いらしいけど、一応前者もつけておく。

APR, APR-UTIL, Apacheをこのオプションつけてビルドすれば解決できそうです。
(ApacheだけあなくてAPRとAPR-UTILも必要ですよね・・?)

(追記)

家で見たソースはoff_tだったのに、問題のシステムのところのソースをみたらoff64_tで定義されてた。
あれー・・・。(´・ω・`)

IPAの辞書に送りがなの間違いが・・・?

iPhone購入した事やCEDECの事も書きたいのですが、それは後でじっくり書くとして。。

IPAの辞書とNAISTの辞書の動詞を見ていたら、以下を発見。

立あう,817,817,7150,動詞,自立,*,*,五段・ワ行促音便,基本形,立あう,タチアウ,タチアウ
立あわ,823,823,7150,動詞,自立,*,*,五段・ワ行促音便,未然形,立あう,タチアワ,タチアワ
立あお,820,820,7150,動詞,自立,*,*,五段・ワ行促音便,未然ウ接続,立あう,タチアオ,タチアオ
立あい,832,832,7253,動詞,自立,*,*,五段・ワ行促音便,連用形,立あう,タチアイ,タチアイ
立あっ,829,829,7150,動詞,自立,*,*,五段・ワ行促音便,連用タ接続,立あう,タチアッ,タチアッ
立あえ,814,814,7150,動詞,自立,*,*,五段・ワ行促音便,仮定形,立あう,タチアエ,タチアエ
立あえ,826,826,7150,動詞,自立,*,*,五段・ワ行促音便,命令e,立あう,タチアエ,タチアエ

たちあうって「立あう」じゃなくて「立ちあう」では・・・?

うーん・・。

相互リンク(MIKIOさん)追加しました

リンクを追加しました!

平林幹雄のホームページ

Hyper EstraierやTokyo Cabinet, Tokyo Tyrant等で有名なmikioさんです。
( ゚Д゚ノノ"☆パチパチパチパチ

技術的な事が沢山書いてあって大変参考になります!しかも日本語!最近ではWEB+DB Vol52の小飼 弾さんのアルファギークに逢ってきたに掲載されています。

最近長女を出産されましてパパになったようです!おめでたいです!
(まだ出産祝いを送っていません。ごめんなさい)

 

実は1回飲み会でご夫婦と同席した事がありまして、何かの機会に今度は弊社に遊びに来てくださいね~。

銀だこ

近所に銀だこがオープンしました。

夜11時までやっているという事で会社を22時に出れば良い感じに間に合います。

というわけで深夜残業をしないでさっさと帰るモチベーションが1つ増えました。

ワーイヽ(゚∀゚)メ(゚∀゚)メ(゚∀゚)ノワーイ

JDK6u16がリリース。ピンポイントでブレークポイントのバグが修正されてる!

この前u15が出たばっかりなのに、JDK6u16がリリースされていました。

リリースノートを見ると、修正内容は1件。
ピンポイントでブレークポイントのバグが直ってた!!

http://java.sun.com/javase/6/webnotes/6u16.html

(ちなみに、日本語のページはまだJDKu15でした)

さっそく試してみなければ。

ブログでも作ろうかな

MovableTypeはすてきなCMSだと思うのですが、最近のバージョンは機能を詰め込みすぎて私の中ではWindowsVistaのイメージ。なによりも処理が重くなったイメージ。共有レンタルサーバだと動かすのが辛い上に、たいしたアクセスもないのに再構築処理が面倒くさい。(再構築で静的なHTMLを出力しているのはREAD負荷対策だという認識です)

というわけで色々とご不満があるMT4。他にはワードプレスとかあるけど、まぁてっとり早く作ってしまえばいいのではないかと思いまして、マインドマップで機能を洗い出してみました。他にも色々あるとは思います。
例えば、「確認画面を不要にする」などなど。まぁそれは追々。

とりあえずこんな感じかなぁ。

ブレークポイントで止まらない件について

Eclipse3.5を入れて、CTRL+クリックでジャンプする時にInterfaceかImplemented Classかを選択する事ができるのがすごい便利なんです。特にInterfaceベースのDIをしまくるプログラムを書いていると重宝します。

で、ブレークポイントを設定しても止まってくれないのです。正確には、最初の1回だけは止まります。その後、全てのブレークポイントが無視されますΣ(゚д゚lll) なんでかなーと思ったら、同じ症状の人を発見しました。

どうやらEclipseは関係なく、JDK6u14のバグらしいです。u14から圧縮ポインタ(?)や新しいGCアルゴリズムが追加されているのですが、GCが悪さをしているのかなぁ。。BugID:6862295で登録されています。仕方ないのでJDK6u13を探そうとしたら、JDK6u15がリリースされていました。日本語のリリースノートも出ています。それによると、、

Java ™ Virtual Machine Tool Interface (JVM TI) のブレークポイントは、並列スカベンジガベージコレクタ (-XX:+UseParallelGC) または並列圧縮ガベージコレクタ (-XX:+UseParallelOldGC) が使用されている場合のみ信頼できます。

ほかのコレクタが使用されている場合は、ブレークポイントが機能しなくなることがあり、フル GC 処理の実行後に JVM TI オブジェクトタグが使用不可になることがあります。Java ™ Debug Interface (JDI) ThreadReference には、JVM TI オブジェクトタグに依存する埋め込みのスレッド ID があるため、この埋め込みのスレッド ID が予期せず変更されることがあります。これにより、スレッドベースの JDI イベントに混乱が発生する可能性があります。

シリアルガベージコレクタ (-XX:+UseSerialGC) はこの問題に対して脆弱ですが、一部のプラットフォームではデフォルトで選択されることに注意してください。この問題を回避するには、コマンド行オプション -XX:+UseParallelGC を使用して並列スカベンジコレクタを明示的に選択します。

との事です。(´ε`;)ウーン…。

JDK6u15ではタイムゾーン関連が更新されているようです。
tzdata2009iはバングラディッシュ関連??
それよりも「ヨルダンの新規則により、tzdata2009h 以降の SimpleTimeZone 解析に障害が発生する」これでしょう(;´Д`) タイムゾーンや夏時間は本当にめんどくさいですね(´・ω・)

追記:JDK6u16がさっそくリリースされてピンポイントで修正されていました。

新しい美容室に行ってきた

今まで担当してくれた美容師さんが1ヶ月ほど音信不通との事。
体調不良と聞いてはいるけどメールでも出してみようかな。。と思いつつ、新しい美容室に行ってきました(ぉぃ)

今日は東京ですごい雨が降りましたよね。あの時間にちょうど行ったのでひどい目に遭った(;´Д`)

新しい美容室はとても良い所でした。何よりも安くてびっくりしたΣ(゚д゚lll) 今まではカット・カラーで1万円くらい。パーマすると1.5万円くらい。それがカット・カラーで5500円くらいでした!

餃子の話でニンニクは牛乳じゃなくてリンゴジュースって話になって、となりのお客さんが「えっ!」っていうから
私「え、なんですか!?Σ(゚д゚)」
「地震!」
私「・・・・ほんとだ揺れてる。てっきりリンゴジュースに反応したのかと!」
「あ、それも気になってました」
がたがたがたがた・・・・!
すごい揺れだった。
東京は震度4だったみたい。
東京マグニチュード8.0のアニメを見てるので、あれを想像してしまった。

ところで、私もリンゴジュースは初めて聞きました。。しかも100%じゃないとダメらしい。・・・・ほんとかなw

とても良い美容室でした(`・ω・)

 

余談:とある美容師さん、柳原加奈子がネタでやってる美容師さんにそっくりだった(; ・`д・´)

物事の順番

物事には順番があります。

例えば、ソフトウェアを作る場合、何がしたいか、どこまでしたいか、を決めてから実際に作っていきます。いわゆるコンセプトに近い部分を先に決めます。(趣味でプログラムを楽しむなら別に突貫で作ろうが好きにすれば良いと思います)

この前の会議、私の作業工数を減らせ減らせ。って会議だった"みたい"ですが、私に「これ落とせますか?」って聞かれても、何をどこまでやりたいのか知らないんだからそもそも日数の見積もりだって適当だっつーのヽ(`Д´) それなのに私に聞かれても困るちゅーの(`Д´)

「え、それはこの前の会議である程度決まりましたよね?」
・・・決まったのは仕組みの方針だけで、その仕組みを使って何をするのかなんて私は知りませんが。

圧縮するだけ圧縮して私の作業だけで3ヶ月で47.5日溢れ。
私の上長も「これはもう単純に人足りないって事なんじゃないのかね」って言ってるのにスルーとかヒドイ!

とても違和感を感じた会議でした。

・・・絶対終わらせてやる。
終わらせてやんよ、コノヤロー!!(@w@)

「オンスケですが何か?」って言ってやる!

おすすめの音楽

YouTubeのUIってどんなだったっけと思って開いたら、すごく良い音楽に巡り会ったのでそれを紹介します!

YouTubeは音質が悪かったのでニコニコ動画の方を。

ParamoreのEmergency!!

 最近では映画「トワイライト~初恋~」の曲が有名みたいです↓

声質がAvrilに似てるよね!とても気に入りました。収録アルバムはこれ↓

All We Know Is Falling

 

もう1つはこれ!Leneの曲です。

 癒される(ノ´∀`*)  これの収録アルバムはこれ↓

Playing My Game

エンドレスでずっと聞いてました(ノ∀`)

Mecabに食わせる単語のデータ

φ(`д´)メモメモ...

Wikipediaのデータ
http://download.wikimedia.org/backup-index.html

all-titles-in-ns0.gzを使うと単語一覧が取得できる。

 

はてなキーワード
http://d.hatena.ne.jp/hatenadiary/20060922/1158908401

参考) http://d.hatena.ne.jp/code46/20090531/p1

 

GOOキーワードランキング
http://ranking.goo.ne.jp/keyword/

いま人気の検索語ランキングはあるURLにアクセスするとXMLでデータが取得できる。

 

例えばWikipediaのデータは"で始まる単語や??などの文字が含まれているものは除外します。あとは「事件」などの単語が入っているものも除外します。もっと言えば弊社の卑属語フィルタを通してチェックをした方が良いのかも。
あとは、はてなキーワードの参考のページにあるように、数字だけのものなどを除外します。

無題

タスクが無くなると言うので5,6個タスク作ってその作業をするように指示を出した。

その後タスクが止まるというので、自分の作業をSTOPして下準備を2,3日かけておこなった。

そういえば完了の報告を聞いていないので聞いてみた。

「やってないですけど、やったほうがいいですか?」

・・・。

 

 

リンク追加しました

相互リンクしようぜと言われまして、左のサイドバーにリンクを追加しました。

久しぶりに聞きました。相互リンク(´∀`*)

 

リンク名は「ティンコロイドとーる君」となっております。14時間働いた後の終電の中で考えたので決して洗練された名前ではありませんが、今回はこれで一つ。名前の由来はわかる人にはわかるはず。実はもう1つ候補があったのですが、これは墓の中まで持って行こうと思います。

Memcached関連のコミッターなので、「バグっぽいの見つけたけど、日本語しか分からないよう><」という場合は彼に言えば良いと思います。

 

ちなみに、彼は普段は英語でブログを書かれています。
・・・日本語でおk(´・ω・)

自己卑下

メッセに「私XXこと へたれ ふぬけやろーがこれからメールを出しますので、ご意見あれば返信ください。」

なんつー自己卑下だ(;´Д`)

今度私も使おうφ(`д´)

 

 

私がよくメールに書くのは、
「私のような若輩者が意見を言うのもおこがましいですが」
「釈迦に説法ではございますが」
なのですが、
・・・・最近使っていないのぅ。

というか、言葉通りにとらえる人って多い気がする。日本人特有の謙りが日本人に通じない。言葉通りにとらえるというか。なんというか。

 

(´・ω・`)愚痴ですよ

この日記も愚痴が多くなってきたのぅ・・。

考えて理解するという事は難しい事なのでしょうか。
昨日休日出勤して集中して作業してたんです。で、一気に集中力が切れたコードがありまして。

世の中にはMVCとかCRUDとかそういう言葉があると思います。例えばCRUDはCreate, Read, Update, Delete。メソッドやクラスだってそれっぽい名前をつけると思います。ある画面を表示するクラスがあって、それの名前がViewXXXX。その中で画像のアップロード処理をしているんです。
と書いて意味が分からないと思います。

Strutsを例にしてみます。

viewAction → 画面1 → postAction → 画面1

というものがあるとします。画面を表示して何かを操作するとpostActionで処理をして画面1を再表示します。このような構成でviewActionの中でなぜかPost処理をしているんです。意味がわかんねー・・・。
演算子のオーバーロードで+の処理を-に変更しているようなもんです。

画像処理は通常のビジネスロジックと比較するとコストの高い処理だと思います。
正規表現は重いからといって自前で汚いコードをがりがり書こうとするのに、1回ですむ処理を何回も画像処理のライブラリを読んでいたり。もう意味がわからないの。

 

もう限界かも。
正直、私が社会人としてスタートした会社の新人のコードよりもヒドイ。。

 

コードの修正には影響が伴います。当然ですね。1行変更すればシステム全体に影響を及ぼす場合もあるし、100行コードを追加しても既存の動きにはまったく問題ないものもあります。当然ですね。
まかせるタスクには難易度も考慮しているのですが影響範囲が小さいものをまかせるようにしています。でもそんなのお構いなしなの。

本当に「考える」って事をしていないんだろうなぁとつくづく思う。

この記事書いているだけで頭痛くなってきた。
新人教育している時よりも状況が悪い。
モバイルに詳しいと聞いているけど、私よりもモバイルの知識浅いし。
はぁー・・。限界。

趣味プログラミングとは違うんですよ。仕事なんですよ。複数人が何年も保守していくものなんですよ。

もういろいろめんどくさい。
どうにでもなーれ(AA略)

ビジネスマナー研修

ビジネスマナー研修を受けてきました。
10時30分~19時の長丁場です。

講師は帝国ホテルや船場吉兆などで働いていた人。
なっ・・・せんばきっちょうだと・・・!

なんという経歴!

 

それはさておき・・・。
頭の中で分かっていても出来ないものですね!!自分のへたれっぷりに凹みました。

言葉の使い方も「申し伝えます」という言葉なんぞ出てこない。
でもちょっとだけ自信がつきました。
1日つぶれたけど、それに見合ったものが得られました。

 

 

ちなみに面白かったのは、服装のダメな例を紹介。

その1。某役員だった○○さんはスーツなのに白い靴下。白はダメですね。それにスリッパも良くないです。時々穴空いてるんですよ。あれはちょっとヒドイですねー。

その2。某プランナーの偉い人は、ビジネスカジュアルという言葉を知らないのですかね。短パンはダメです。

他には、

某プログラマの偉い人は、元自衛隊だからお辞儀を直角でできますが、そこまで必要ないですからねー。
とか。

弊社にはこういうセミナーはとても良いと思いました。

本を買ってきました。

モノクロームファクターの2,3,4を買った・・・つもりだったのですが、よく見るとVI。

(つд⊂)ゴシゴシ

どうみてもVIです。ぐすん・・・。

あとはすんどめの7巻あたりを。最近のだめカンタービレの最新刊出ていないけどどうしたのかな・・・。

部屋の蛍光灯を取り替えました。

部屋の蛍光灯を取り替えました。

とっても明るいです!! 今までどれくらい暗かったんだろう(´・ω・)

電気屋さんに行くも、32か30か分からなくて一回帰宅。32+40のを購入すれば良いとの事でTOSHIBAのセットになっているやつを1580円で購入。その後スーパーに行ったら1380円で売ってたorz。

(´・ω・`)ぐすん。。

 

近所の電気屋はTOSHIBAしか売っていないのはなんでだろう。NECのほたるっくに興味があったんだけどなー。もう1つの電気もせっかくだから取り替えようかな。

これだけ明るいと気分も明るくなってくるヽ( `・ω・´)ノ

SharePoint互換製品

SharePointっぽいオープンソース。
Alfresco, O3Spaces。

O3Spacesのワークスペースアシスタントを起動しておくとSharePointのように扱える。OneNoteは対応していないのが残念。あと、このワークスペースは1秒に1回サーバにチェックしに行くので会社→家とかやると凄いことになりそうなので注意(;´Д`)

 

OneNoteはやっぱりWebdavを建てるのが無難かなぁ(´・ω・)

Officeのエンタープライズをボリュームライセンスで契約している会社は、従業員に対して2000円くらいでOfficeエンタープライズが購入できるサービスがあるんですね。HUPライセンスというものです。1年くらい前に、とある部署に問い合わせたときは、提供しないとか言ってたのに最近提供するようになったんです。おかげでOffice製品のStandard版を購入してしまっているわけですが、まぁOneNoteも使えるようになって便利便利。

MSProjectとVisioも2000円くらいで購入できるみたいなのですがこれは対象外みたい。ボリュームライセンス契約していないからか・・・。まぁMSDNサブスクリプション(Professional with MSDN Premium Subscription)を契約すればVisualStudioとOfficeとOSが使い放題なのでそれを契約すればいいんですけどね。お値段は・・・こちら

 

redmine

redmineを入れてみました。
プロジェクトでは影舞も使っているんですが運用ルールが覚えられないので個人用にredmineを。

チケット駆動開発が出来るのが良いですね。ただMylynは汎用コネクタで無理矢理データを抜き出しているものだから専用コネクタが欲しいところ。

個人的に気に入っているのは、チケットとレポジトリのコミットログがカレンダーに出るところ。その日何やったかというのが一目で分かって素晴らしい。週報書くのが楽になりそうだ。今まではOneNoteに朝一でTODOを列挙して適当にやっていたんだけど、Redmineに寄せていこうかな。

設定で困ったことは、Ruby1.9では動かなかった事と、日本語タイトルのメールがOutlookで文字化けすること。日本語のメールは先頭文字が英字だと化ける感じ(検証しているわけではないので適当な事言ってます)。Rubyは1.8系で、メールはPluginにそれらしいものを入れて解決できました。
PDF出力は使わないからいいやー!と思っていたんですが、いざ見てみるとなかなか綺麗な形で出力してくれるのでこれ後で日本語文字化けしないようにしてみよう。

なによりもUIが綺麗。あとは連続でチケットを登録できたり、一覧表から右クリックでメニューが出てきて少ない手間で状態を反映できたり。

あとはコミットログにrefs #チケット番号とか書けば関連づけてくれる。fixes #チケット番号でチケットを閉じてくれたり。チケット単体でも、このチケットが関連します。とかも設定できる。

なかなか素晴らしい!
Mylynと連携するならTracやBugzilla、Mantisが専用コネクタがあっていいんだけどね。

MPEG4のストリーミング

MPEG4のファイルをストリーミング再生するには(RTPプロトコル用の?)ヒントトラックを埋め込む必要があるらしい。

FFMPEGだけでは対応できず、FFMPEG → MP4BOXという流れが一般的のようです。

ウーン。対応は難しくないけど処理フェーズが1段増えるの嫌だなぁ。

Solaris10にIntelのPWLA8391GTを載せてみた

SolarisはなかなかめんどくさいOSですねぇ。自動認識でセットアップしてくれぬ。結構戸惑いましたが何とか認識させる事ができました。

蟹チップをFreeNICDriversForSolarisで動かしていたので、まずはこれを退避します。

mv hostname.rf0 _hostname.rf0
mv hostname6.rf0 _hostname6.rf0

/etc/driver_aliasesに以下の行を追加する。

e1000g "pci8086,1376"

次回起動時に自動的にデバイスの再構成を実行させる

touch /reconfigure

というわけで一回再起動します。

shutdown -y -g0 -i5

/var/adm/messagesに次のようなログが出ていれば認識に成功しています。

ホスト名 e1000g: [ID 766679 kern.info] Intel(R) PRO/1000 Network Connection, Driver Ver. 5.2.

この段階ではifconfigには出てきません。 次のコマンドを打ちます。

ifconfig e1000g0 plumb

/etc/hostname.e1000g0と/etc/hostname6.e1000g0を作成します。前者はホスト名を中に後者は空です。

echo "ホスト名" > /etc/hostname.e1000g0
touch /etc/hostname6.e1000g0

ここで再起動してNICが自動構成でONになっているかを確認しておきます。

次はジャンボフレームの対応です。

/kernel/drv/e1000g.confを修正します。

(変更前) #MaxFrameSize=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;
(変更後) MaxFrameSize=3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3;

/etc/hostname.e1000g0を変更する(16Kは大きすぎるので9000に変更)

echo "ホスト名 mtu 9000" > /etc/hostname.e1000g0

こんな感じで認識させることができました。インストール時に刺しておけばプライマリネットワークインターフェースとして色々と構成してくれるのかもしれません。

 

今回、ものすごく参考になったページは以下です。感謝ヽ( `・ω・´)ノ

http://jp.sun.com/communities/0603/feature02.html

ミート矢澤に行ってきたー

またまたミート矢澤に行ってきました。五反田にあるステーキ専門店です。

そんなわけで今日はさっさと会社を出る。
帰るときに「え?帰るんですか?」って言われたけど帰ります。(明日頑張る的な意味で)

なんとお知らせを見ると「常陸チャンピオン牛」というものが待ち構えているらしい。

例によって30分ほど並びました。

ステーキはあまり好きではないのでいつものハンバーグを頼みましたが、友達はチャンピョン牛を頼んでました!そのおかげかどうか知りませんが、二人席だったのにもう1個席がくっついて4人席を二人で使うことに。ぜ、贅沢だ・・・!(というか並んで居る人に申し訳ない) たぶんチャンピョン牛関係なくてたまたまだと思いますが。
お肉が柔らかいのはナイフで切っているのを見ているだけで分かったので感想を聞いてみると「すごい良い肉なのはわかる。でも旨いかどうかわからない」
な、なんですとー!

そんなんじゃ海原雄山にはなれないですよ!

会計の時に「今日のお肉はいかがでしたか?」とか聞かれてた!
これがチャンピョン牛の力なのか・・・!

ハンバーグも美味しいですよ(・∀・)
私は基本的に調味料をつけないでそのまま食べる派なんですがハンバーグも例外ではありません。
ここのハンバーグは普通のハンバーグよりも深い味がついている感じ。

あと、ここのお店ってサービスのクォリティが高い気がします。店員さんの気配りがすごい。ぱぱっと人数を数えると調理スタッフも併せて13人ほど居ました。多い!!それなのに暇そうな店員居ないの。

この後友達の弟の転勤について語る。
客観的に見るといろいろ危ないフラグが立ちすぎて転職した方が良いと思う。
1万円で説得してあげよう!と言ってみたものの、もう1週間ほどしか時間が無いらしくて話す機会もなさそう。
(そもそも人の人生の岐路に関わりたくなかったり)

でも敢えて言うね。
1年後はもっと不利な状況になるよ。

INTELのNICをぽちりました

昨日帰宅しようとしたらまたSolarisサーバがフリーズしていまして、dmesgを見る限りではNICが原因のようです。
kstatコマンドで転送量のグラフを作っていたのですがもしかしてこれが原因なのかも。。ただこれで2回目なので毎回電源をぽちっとするのも面倒だなぁーと。

そんなわけで、4000円くらいのINTELのNICをぽちりました。PCI-Eが使えるのか分からないので無難にPCIのやつを。まぁSolarisで使えなかったら家のサーバに使うので問題なし!

問題は会社のPCサーバに勝手にNICを刺すことだ!(*・ε・*)
細かいこたぁ(AA略

(追記)

私「INTEL NIC刺していいですか?」
上司「よかろう」

PSPで動画を見たい

ブルーレイレコーダーからPSPへダイレクトにダビングする機能があるのでPSPが欲しい。

初期型じゃなくて軽いやつを。。。

Solarisで認識するNIC

SolarisのNIC認識は鬼門です。
サーバ機ならともかく一般のPCは蟹チップがほとんどなので標準のドライバでは認識しない事が多いです。ユーザーが作ったドライバで認識させる事も可能ですが動作保証外なもので運用するのは精神的健康に良くないです。

SunのページでHCL(ハードウェア互換一覧)を確認できます。
http://www.sun.com/bigadmin/hcl/data/sol/components/views/networking_certified.page1.html

残念ながらRealtekはありませんでした。Reported to WorkにはあるのでFreeのドライバを入れれば認識させる事は可能です。INTELのNIC買うのが確実ですけどね!

六歌仙再びヽ( `・ω・´)ノ

金曜日に六歌仙行ってきました。

エビ!

カルビ!

フィレ!

もはや何も言うまい( ´∀` )

Lucene本

Apache Lucene 入門 ~Java・オープンソース・全文検索システムの構築

関口さんのLucene本ですが、Amazon等のメジャーなストアでは売り切れです。

だが、売っているところを見つけました・・・!

ブックサービス。
http://www.bookservice.jp/bs/PSRRES1001.do?doWindowDispatch=book&ssc=1&sk=01&scn=I4774127809

注文してみたのですが、先ほど発送通知が来ていましたヽ( `・ω・´)ノ

libx264と奇数

ffmpegでもリンクしているlibx264は奇数を処理できないらしい(´・ω・)

というわけで偶数に丸めてSizeを指定するようにしました。

これって高さだけなのかな。。横幅が奇数の動画ってどこかにないかな。

Home > 日記 > 日記2009後期 Archive

Search
Feeds

Return to page top