トップ(最新) | <前

nDiki : Java

Java

web

数値計算

Javaプログラムの起動を支援するツール

実行可能ファイルへの変換、ラッパー、ランチャなど。

スポンサード リンク

Related term

2005年9月22日 (木)

skkinput がよく落ちるので uim-skk に乗り換え このエントリーを含むはてなブックマーク

スポンサード リンク

メインのノート PC (Debian GNU/Linux sid)では XIMサーバとして skkinput を使っているのだが Firefox で入力をしていると、Firefox を道連れによく落ちてしまう。 何かの登録のためにフォーム入力していたり、WikiPage の編集をしているときに落ちてしまうとかなり辛い。

ということで遅ればせながら uim を試してみることにした。

@ インストール

ほぼ「Japanese - Debian GNU/Linux スレッドテンプレ」の通りに設定。

SKK用の辞書などは既にはいっているので

 apt-get install uim uim-skk

として uim 関連のファイルをインストール

~/.xinitrc の skkinput 関連の部分をコメントアウトして、

 if type uim-xim &> /dev/null ; then
   uim-xim &
 fi
 XMODIFIERS=@im=uim ; export XMODIFIERS
 GTK_IM_MODULE=uim ; export GTK_IM_MODULE
 UIM_IM_ENGINE=skk ; export UIM_IM_ENGINE

を追記。

これで Firefox でも問題なく uim-skk日本語入力ができた。

@ ツールバー

Window Manager 用システムトレイとして docker を使っているので、uim-toolbar-gtk-systray を使う。

 uim-toolbar-gtk-systray &

@ Emacs 用に設定を変更

初期状態だと C-j でも uim-skk がオンになる。 これだと Emacs を使っている時によろしくない。

uim-skk の方は Shift-space でトグルすればよいので、uim-pref-gtk 上の 「SKKキー設定1」の「モード遷移 - [SKK]オン」から Control-j を外しておいた。

@ 追記

@ Java アプリケーションでの入力。

J2SE (1.5.0_04) 上で日本語入力ができないのに気がつく。

~/.Xdefaults に

 *inputMethod: uim

を追加して入力できるように対応 (2005年9月24日追記)

◇ Twitter やってます。この記事が気にいったらぜひ twitter.com/Naney の follower になってください。
◇ 2GB 無料のオンラインストレージサービス Dropbox に次のリンク先から登録すると今なら 250MB プラス! → Dropbox


[ 9月22日全て ]

2005年11月14日 (月)

久しぶりに build.xml を書く このエントリーを含むはてなブックマーク

ソフトウェアレビュー日。 最近ミーティングの調整やドキュメントの作成などばかりで、ソースコードに触れる機会がほとんどなかったので Eclipse なんか入れちゃったりしてウキウキ。

……あれ? ビルドまだ自動化してないの? いや、普通まず最初にビルド自動化しておくでしょ。configure.ac とか Makefile.am とか Makefile とか Makefile.PL とか Build.PL とか書いちゃうでしょ。 Java ならまあ build.xml とか書いとくでしょ。 make dist (相当が)できるようなターゲット書いておくでしょ。

……無いのね。Eclipse でぬくぬく書いてるのね。コード書いている間はいいよ。 でもね、節目のビルドはね、そういうのでやってね。ビルドファイルの含めているソースアーカイブもコマンド一発で作れるようにしておいてね。

はい。では、書きますよ。今回は私が。 次はちゃんと書いてね。


[ 11月14日全て ]

2007年12月24日 (月)

今日のさえずり - スーツに着た回数を記録する仕組みが欲しい このエントリーを含むはてなブックマーク

naney:2140302022


[ 12月24日全て ]

2007年12月29日 (土)

Twitter ベイジアンフィルタプロキシ このエントリーを含むはてなブックマーク

Twitter で following が増えてくるにつれて、タイムラインに目を通すのが大変になってきた(という程きちんと見ている訳ではないが)。 さっとタイムラインをなめて面白そうな情報をピックアップしたい時は、「おはよう」とか「風呂入った」とか「トイレ」とかは除外して読みたい(そういう書き込み自体は嫌いじゃないのだが、人生はあまりにも短い)。

Twit や P3:PeraPeraPrv では NG ワード指定ができて、それらを含むステータスは表示しないようにできるのだが、Twitter の書き込みは揺らぎが激しすぎて指定しきれないという弱点がる。

ということでベイジアンフィルタでフィルタリングしてみることにした。

自前で Twitter クライアントを作る気はないので、proxy の形でさっと実装してみた。

 #!/usr/bin/perl

 use strict;
 use warnings;

 use HTTP::Proxy;
 use HTTP::Proxy::BodyFilter::complete;

 my $proxy = HTTP::Proxy->new(port => 8088);
 $proxy->push_filter(response => HTTP::Proxy::BodyFilter::complete->new,
                     mime     => 'application/xml');
 $proxy->push_filter(response => Bsfilter->new,
                     mime     => 'application/xml');
 $proxy->start;

 {

   package Bsfilter;

   use File::Temp qw/tempfile/;
   use XML::XPath;
   use base qw(HTTP::Proxy::BodyFilter);

   sub filter {
     my ($self, $dataref, $message, $protocol, $buffer) = @_;
     return unless defined($$dataref) && $$dataref ne '';
     eval {
       my $xml = XML::XPath->new(xml => $$dataref);
       my @nodes = $xml->findnodes('/statuses/status/text/text()');
       return unless @nodes;
       for my $node (@nodes) {
         my $text = $node->getNodeValue;
         if (is_NG($text)) {
           $node->setNodeValue("[NG] $text");
         }
       }
       $$dataref = qq(<?xml version="1.0" encoding="UTF-8"?>\n);
       $$dataref .= $xml->get_context->toString;
       utf8::encode($$dataref);
     };
     if ($@) {
       warn $@;
     }
   }

   sub will_modify { 1 }

   sub is_NG {
     my ($text) = @_;

     my ($fh, $filename) = tempfile();
     utf8::encode($text);
     print $fh $text;
     close($fh);
     my $result
       = system(
       "bsfilter --homedir ~/.twitter-bsfilter --ignore-header --auto-update $filename"
       );
     unlink($filename);

     return !$result;
   }
 }

@ HTTP proxy の作成

PerlHTTP proxy を作ろうとして真っ先に思い浮かんだのは POE だけれど、ちょっとヘビーなので今回は HTTP::Proxy をチョイス。 もともとフィルタリング HTTP proxy を作ることを念頭に置いた Perl モジュールなので今回の目的にぴったり。

1つはまった点といえば、filter の呼び出しがレスポンス全てを取得してからではなく一部分ずつの呼び出しになるところ。その仕様に気がつくのにちょっと時間がかかってしまった。 例えば XML 形式のレスポンスをフィルタしようとしても、普通に HTTP::Proxy を使うと XML の一部ずつがフィルタに渡されるため、XML のパースがうまくいかない。

これについては HTTP::Proxy::BodyFilter::complete を使うことで、まとめてフィルタに渡せるようになった。

@ レスポンスの処理

Twitter のタイムライン取得については P3:PeraPeraPrvXML 形式で取得しているので、そのタイプのレスポンスをフィルタするようにした。

XML::XPath でステータス部分を抜き出して NG 判定し、NG であれば先頭に [NG] を追加する。 これで Twitter クライアント側で [NG] を NG ワード指定すれば、表示されないようにすることができる。

@ bsfilter による NG 判定

NG 判定は普段メールspam フィルタとして使っている bsfilter を使った。 単純に system 関数で呼び出して結果を取得するだけ。

今回は対象がメールではないので --ignore-header を指定。また自動的に学習するように --auto-update を指定。 それと普段メールのフィルタリングに使っているのとは bsfilterデータベースを別にしたいので、--homedir も指定しておく。

@ NG と非 NG の学習。

NG ワードを twitter-NG.txt に、非 NG ワードを twitter-clean.txt に書いて以下のコマンドを実行。

 bsfilter --add-clean --ignore-header --homedir ~/.twitter-bsfilter twitter-clean.txt
 bsfilter --add-spam --ignore-header --homedir ~/.twitter-bsfilter twitter-NG.txt
 bsfilter --update --homedir ~/.twitter-bsfilter

自分の環境 (Debian GNU/Linux sid)では、UTF-8 で書いておいて問題なかった。

@ フィルタリングしてみる

あとは先の proxy を起動し、P3:PeraPeraPrv でプロキシとして localhost:8088 を指定すれば OK。

タイムラインを取得するたびに bsfilter が動いて NG なステータスには [NG] が挿入される。

@ フィルタリングの精度

これについては、まだまだチューンの必要ありかな。

  • 事前の学習データが少ない。
  • --auto-update していることもあり、最初に NG 判定が多いとそちら側に強化されすぎる。
  • 毎回 bsfilter を呼んでいるため、同じステータスが何度も学習される。

まだ使える精度まで上がってないけれど、教師データを増やせばそれなりにいけるかもしれない。

proxy の枠組ができたので、(@~は抜いてから bsfilter に渡すとか、前後の文脈も含めるとか)いろいろ試して遊べそうではある。 別に bsfilter にこだわらず、正規表現による判定などをしてもよいし。

この辺り P3 は Java で書かれているので、プラグインを書いて拡張できるよう将来になると面白いなと思ってみたり。


[ 12月29日全て ]

2008年6月23日 (月)

サブプロジェクトが使える GTD ツール ThinkingRock 2.0.1 このエントリーを含むはてなブックマーク

naney:2603837839

Task CoachGTD しているうちに、もっとスマートにできるツールがないかなと探して出会ったのがこれ。

  • Java で書かれており、Linux でも使える。
  • サブプロジェクトを作ってブレイクダウンしていける。

というのがイケてる。Web ベースの GTD ツールも多いが、ThinkingRock は普通のアプリケーションなのでインストールも簡単。RDBMS 等のセットアップも不要であり、すぐに使える。

GTD の流れを知っていればマニュアルをほとんど見なくても自然に使うことできる。 今日ダウンロードして使い始めたのだが、すぐに ThinkingRock ベースで GTD のプロセスをまわせるようになって驚いた。

GTD をしていて欲しいと思っていたプロジェクトテンプレートも作っておける。 チェックリスト的なプロジェクトを登録しておいて、必要な時にプロジェクトにコピーして使うような運用ができるようだ。

これホントいいんじゃない?

今後は

  • 仕事 -> ThinkingRock
  • リピートするアクション -> RTM (ThinkingRock にはリピートがない)
  • 外出先でチェックするアクション(買い物など) -> RTM (ThinkingRockケータイで見られない)
  • プライベート -> 手帳 (PC とは離れたプロジェクトが多い。一部は ThinkingRock にのせてもいいかもしれない。)

という形でまわしてみようと思う。


[ 6月23日全て ]

2009年3月13日 (金)

久しぶりの C++GNU Automake + CppUnit このエントリーを含むはてなブックマーク

ちょっとした文字列構文解析関係の C++ コードを書き始めた。 C++ は随分触ってなかったので「C++ で書き直すのを考慮してそれっぽく Perl で書くから後で書き直して」と最初は言っておいたのだが、それもあんまりだと思って C++ で書くことにした。

Debian GNU/Linux 上で書くので GNU Automake + CppUnit で。 「Perl + Test::Harness」や「Java + Eclipse + JUnit」や「C# + Visual C# + NUnit」などと比べるとやっぱりタルいな。

1つメソッド書くのに、

  • テストメソッドの宣言
  • テストメソッドの登録 (CPPUNIT_TEST())
  • テストメソッドの実装
  • メソッドの宣言
  • メソッドの実装

と 4ファイル5カ所編集しなければならない。 クラス追加時には Makefile.am にヘッダファイルとソースファイルをテストケース用のと含めて4ファイル書き加える必要があるし。

あー面倒。

でも C++ で書き始めると楽しいんだよなあ。


[ 3月13日全て ]

2009年3月24日 (火)

今日のさえずり - オフィスで最初に WBC の結果を口に出した人がサボリーマン このエントリーを含むはてなブックマーク

naney:3377462171

@ 2009年03月23日

@ 2009年03月24日


[ 3月24日全て ]

2009年8月20日 (木)

アクセサは foo と set_foo にしたい このエントリーを含むはてなブックマーク

オブジェクト指向プログラミングではほとんどの場合に必要となるアクセサについては命名規則にいくつかのパターンがある。

  1. 属性名に対して getter に get (get_)、setter に set (set_) をプレフィックスとしてつける。
  2. getter も setter も同じ名前とし属性名にする。
  3. setter のみ set (set_) を属性名にプレフィックスとしてつける。

1 番目は Java プログラミングでよく使われる。 またそれ以外でも広く使われている形式だ。 get と set 命名規則的に対になっていて規則的には美しい。 getter と setter を別々に検索するのも用意だし、プログラミング時にも誤解を招きにくい。

ただし例えば x、y、z のような短い名前の属性の取得の場合 obj->get_x などと、うるさい感じになってしまう。また obj->get_foo->get_var なども obj->foo->var などに比べてすっきり感がない。

2 番目は Perl でよく使われる。C# のプロパティへのアクセサは getter と setter が同じ名前になる。 呼び出し側ではコードが短くなりすっきりする。

ただし Perl の場合は引数の数を動的にチェックするために効率が若干犠牲になるのと、setter の機能が無いアクセサに引数を渡してもエラーにならないため見逃しやすいバグが潜んでしまう可能性があるなどの問題もある。Perl ベストプラクティスではこの形式ではなく1番目の形式を勧めている。

3 番目はあまり多くないかな。 getter に get がついていると個人的には重い印象を感じる。 getter を属性名だけにすることですっきりするとともに、setter は set_ と動詞がつくことでオブジェクトに働きかけるという印象を残すことができる。

命名規則が非対称なのでちょっと気持ち悪いといえば気持ち悪い。

Google C++ スタイルガイドではこの形式を採用している。

個人的には3番目がコードの見た感じにもすっきりしていて読みやすく、また getter と setter の区別も(1番目ほどではないにせよ)つきやすいので良いのではないかと思う。 2番目もよく使っていたのだが、しばらく3番目にしてみようかと思った今日このごろ。


[ 8月20日全て ]

2010年2月6日 (土)

Debianアップデートしたら Java プログラムが通信できなくなった このエントリーを含むはてなブックマーク

昨日 Debian GNU/Linux sidノート PC で久しぶりにアップデートをかけたら、無線 LAN がつながらなくなった。こちらは新しく入った linux-image を消したり、NetworkManager のフロントエンドを knetworkmanager から nm-applet に変えたりしているうちにつながるように。

これで大丈夫かと思ったら Web ブラウザなどは問題ないのに Java プログラムである Twitter クライアント P3:PeraPeraPrv が全くつながらなくなってしまっていた。こちらは有線 LAN でも駄目なので無線 LAN 関係は関係なさそう。

困ったなと思って調べていたら、java のコマンドライン引数で -Djava.net.preferIPv4Stack=true を指定すれば良さそうということで試しに

 java -Djava.net.preferIPv4Stack=true -jar PeraPeraPrv.jar

と起動したら無事アクセスできるようになった。ふう。

そこから調べてみると netbase 4.38 (2009年12月6日)から /etc/sysctl.d/bindv6only.conf で net.ipv6.bindv6only=1 と設定されるようになったのが影響しているようだ。

こちらの設定を以前と同様にするならば 0 に変更して

 invoke-rc.d procps restart

とのこと。


[ 2月6日全て ]

2010年3月29日 (月)

さらば GTD ツール ThinkingRock このエントリーを含むはてなブックマーク

1年9カ月ほど GTD ツールとして ThinkingRock をメインに使ってきた。 今まで使ったツールの中で一番 GTD らしい運用ができるツールだ。 いつでも PC を使える状況であれば、かなりグレイト。

しかし奴にも弱点がある。 その一つがモバイルで使えないこと。 ネットサービスとの連携はほぼ皆無なスタンドアローン Java アプリケーションなので、PC が使えない状況で各種リストにアクセスできない不便さがある。

こればかりは仕方がないので、外出先用のアクションを Remember The Milk に入力したり、いくつかのコンテキストのアクションをロルバーン「ポケット付きメモ」などに手書きしたりして運用していた(ちなみにリストを綺麗な PDF ファイルとして出力する機能があって、これを印刷して使ってみたりもしたんだけれど、更新のたびに印刷するが面倒で紙ももったいないのでしばらくしてやめた)。

今回 Android ケータイXperia 購入するにあたり、GTD ツールも見直し中。 今後は PC / スマートフォン両方で扱える GTD 環境にしたい。

で、いろいろ調べてみたりしたんだけれど、やはり Remember The Milk 以外に選択肢が見つからなかった。 Pro アカウントにすれば公式 Android アプリケーションが使えるようになるので、アップグレードするか。 サブタスクが使えないのがネックだが、タグ・スマートリストやタスクの名前付けの工夫などカバーする方法を考えよう。

ということで ThinkingRock サヨナラを決断。不要になったプロジェクト/アクションを捨てつつ一気にデータを Remember The Milk へ移した。 しばらく試行錯誤の日々が続きそうだ。


[ 3月29日全て ]

この日記のはてなブックマーク数 Add to Google RSS

Process Time: 0.051159s / load averages: 0.22, 0.27, 0.25
nDiki by WATANABE Yoshimasa (profile)
Powered by DiKicker
Base theme by Nana (for tDiary)