2014/01/31

Javaコマンドでクラスパスを指定する

地味に。
javaプログラムをコマンドラインで起動するのって難しいです。
メインクラスがjarの中の場合、フォルダの中(パッケージの中)の場合、クラスパスが必要な場合、jarライブラリを読み込まないといけない場合など、いろいろ合わさるともう絶望的にコマンド打てません。
ということでメモ。

基本

java <classファイル名>
もちろん「.class」は付けない。これはパッケージも使わないテストプログラムとかHelloWorldの場合。

メインクラスがJarファイルの中

java -jar <Jarファイル名>
このときはもちろん「.jar」を付ける(このようにコマンドで起動できるjarファイルを作るには中のマニフェストファイルをちゃんと作れば良い)。

メインクラスがパッケージの中

java jp\co\などパッケージ構成\<メインクラスファイル名>
「.class」は付けない。コンパイルするとフォルダが出来るのでついパッケージフォルダ内に移動してコマンド打ったりするがそれではダメ。パッケージのフォルダがあるフォルダでコマンドを打つ。

クラスパスを指定する(フォルダ)

java -classpath フォルダパス1;フォルダパス2;.\  <メインクラスファイル名>
ここが引っかかった。最後の「.\」はメインクラスのファイルが置いてある場所(パッケージならパッケージフォルダの場所か?)。
コマンドラインのカレントディレクトリによるが、普通は「;.\」を追加しておけば良いと思う。
メインクラスがパッケージなら
java -classpath フォルダパス1;フォルダパス2;.\   jp\co\パッケージ\<メインクラス>
jarの場合
java -jar <Jarファイル名>
jarの場合は-classpathは効かない。Jar内のマニフェストファイルに書かれたクラスパスだけになるらしい。

jarファイルをクラスパスに追加

java  -classpath <JarファイルのパスとJarファイル名>;.\  <メインクラスファイル名>
メインクラスがパッケージだったりJarファイルだったりするのは上と同じ。クラスパスは「.\commons.jar」のように「.jar」まで付ける。上記のようにjarを起動する際に-classpathでクラスパスは指定できない。
自分用のメモということでマニフェストファイルの例も残しておく。
Manifest-Version: 1.0
Ant-Version: Apache Ant 1.8.2
Created-By: 1.7.0_21-b11 (Oracle Corporation)
Main-Class: jp.co.simple_asta.test.Main
Implementation-Title: ${name}
Implementation-Version: ${version}
Implementation-Vendor: ${vendor}
Build-Id: ${ts} ([Windows 7 6.1 amd64])
Class-Path: mysql-connector-java-5.1.28-bin.jar ojdbc14.jar
まぁ重要なのはMain-ClassとClass-Pathだけかな?

2014/01/24

Meet the Parents

ミート・ザ・ペアレンツ」見ました。録画で。
しかし前半1時間(彼女一族の冷たい視線に見送られて惨めに家を辞去するシーン)で見るのを止めてしまった。主人公は悪くないのに悪い方に進んで行くっていう話かと思ったら、普通に主人公が嘘ばっか言って悪いことばっかしててイライラ…。たぶん後半の展開としてはうまくいっちゃうんだろうけどそれじゃもっと腹が立つと思ったので惨めに家を去るシーンで止めてやったw。あの主人公は行動のみならず細かい所作までチンピラみたいで非常に不愉快。ロバート・デニーロの映画なら外れないと思ってたが、ベン・スティラーという人が悪いらしい。今後は注意しよう。
私という病」 読みました。
他のエッセイで風俗店勤務の顛末をこの本に書いたと書いてあったのでちょっと気になってた。しかし描写が存外に詳しく、気持ち悪くてびっくりしたw
 後半の男性批判はなんていうか、身に覚えの無いことで言い掛かりを付けられてボコボコにされてる気分…。「男は」って括りで話をするからダメなんだよね。「こういう男は」って言えばいいのに。
 まぁ少なくとも「男は浮気をしても大目に見られ、風俗店に行っても笑われるくらいだ」なんてとても思えないんだけど著者は本気でそう思ってるらしい…。そりゃそういう感覚の人もいるだろうけど…。こういうのって周りの環境が影響するんだよね。そういうのが当たり前、な人達に囲まれて育ったらやっぱりそういう感覚になっちゃうだろうけど、自分含めて田舎育ちで繁華街なんて見たことも無く、普通の家庭で成長した人ならそんな感覚は持たないと思うなぁ。東京近郊で育った人がどうなのかは分からんが(夏休み時期のワイドショーの家出少女特集だのを見る限りどっちが多数派なのか不安にはなるw)。とりあえずこの著者の場合は男性恐怖症?とかそれなのにカッコいい男が大好きでホストクラブにはまるとか、作家という職業とか買い物依存症だとか、ぶっ飛んだ環境なのは間違いない。よく読むと「自分はこんな酷い経験をしてきたからこんな偏った意見になった」と書いてるところもあるんだけど、やっぱり「世間一般的に男はこうだ、女はこうだ」と書いてるところも多い。正直もうちょっと面白く読めるかと思ってたが、全体的にマジで病んでるんで引いてしまった。ココは違う、ココも違う、って思いながら読んで結局こういう考えの人とは分かりあえないだろうなぁと思った。

2014/01/17

HTML:Selectタグ内のアイテムに絞込み検索をかける



 JavaScriptを使ってセレクトタグ内の項目のキーワードによる絞込み検索を行う例(IEの人は下の方のを見てみて)。
 上記検索ボックス内に「a」とか「DEF」とかを入れるとリストがそれを含む項目だけに絞られる。
 あるWebシステムを作っていたとき、「リストの内容が増えすぎているので検索がしたい」と言われた。本当は検索キーワードをサーバーに送り、SQLを発行し直して…、と作るのが普通な気がするけど、「う~む、その要望なら別にそこまでしなくても良いんだけどなぁ」と思ってブラウザの表示上だけで出来るように作ったものだ。Selectタグ内のOptionのスタイルを切り替えてるだけなので軽い。正規表現を使うのがポイントと言えばポイントだがJavaScriptのソースも簡単でちょっと残しておくといろんなとこに応用出来そうだと思ったので載せる。
 以下のソースコードでは簡単にOnChangeにしか登録してないがOnKeyUp、Onblurにも同様に登録すると上記のようなインクリメンタルサーチ的動作になるぞ。
<script language="javascript" type="text/javascript"> 
var TEST_OBJECT = {
   onSearchFieldChange : function(value){
      var selectBox = document.getElementById("my_select_list");
      var items = selectBox.children;
      if (value === "") {
         for(var i=items.length-1; i>=0; i--){
            items[i].style.display = "";
            items[i].selected = false;
         }
         return;
      }
 
      var reg = new RegExp(".*"+value+".*","i");
      for(var i=items.length-1; i>=0; i--){
         if ( items[i].textContent.match(reg) ){
            items[i].style.display = "";
         } else {
            items[i].style.display = "none";
         }
         items[i].selected = false;
      }
   }
}
</script> 
 
<input onchange="TEST_OBJECT.onSearchFieldChange(this.value);"  
       style="width: 140px;" /><br />
<select id="my_select_list" size="3" style="width: 140px;">
 <option value="a1">abcdefg</option>
 <option value="a2">hijklmn</option>
 <option value="a3">opqrstu</option>
</select> 
サンプルのようにonchangeだけだとエンターキーを押すかフォーカスを外すなどで変更が確定した時に処理される。このページのソースも参考に(しかし複数のイベントに登録してるのでちょこっと入力したら2回も3回も処理されていると思う。もう少し工夫すると良いかも)。
 基本的に上記ソースをコピペで動くがSelectタグのid="my_select_list"がページ内で被らないことが大事。idを変更したならJavaScriptのdocument.getElementById("my_select_list")のidも同じになるように変更すると良い。
 new RegExpの第2引数"i"は大文字小文字を区別しない検索になるような指定「ignoreCase」のことだ。

(記事内にJavaScriptを埋め込んで動作出来るのか試してみたら普通に動くようだ)
 さてIEではSelect内のOptionタグのStyleにdisplay:noneを付けても消えない。よってこのコードはIEは対応しない…。
 IEでリストから消すにはRemoveしないといけないが、Removeでは無くなって再度表示できなくなるので、その前にリスト内容のコピーを取っておく、などと対応すると複雑になる。
 「残念出来ない」と思ったら諦める前にユーザの要望をもう一度確認しよう。今回の場合、IEでも動作する以下のような対応もありうる。「ユーザの要望を聞いて最初に思い付いた対応」と「ユーザの要望」は違うので詰まったらユーザの要望まで戻るのだ。



はい。
正規表現なんか使わなくても「 if ( items[i].textContent.indexOf(value) !== -1 )」で同じ効果になると思います。すいませんw

JavaScriptでparseInt

 珍しくJavaScriptで引っ掛かったので忘れないようにメモ。実はJavaScriptを書くのも久しぶりだったりする。 JavaScriptは変数の型が自由で、文字列の数字と数値の足し算が出来る。
var a = "10";
var answer = 0;
 
answer = 10 + a;
console.log(answer);
 
answer = 20 + parseInt(a);
console.log(answer);
 
answer = 30 + parseInt(a,10);
console.log(answer);
文字列と数値の足し算はJavaと同様に数値の文字表現で連結になる。よって数値として計算するためにparseIntを使う。これもまぁJavaと同様だが変数の型を意識しないことが多いのでうっかり忘れがち、というだけだ。
 記憶ではparseInt関数は8進数文字列がデフォルトなので明示的に10進数と指定しないと意図しない結果になっていたような気もするが改めて試すとそんなこともないようだ。

 調べ直すと、「"0"で始まる場合」8進数の文字列となる、という情報はある。以前はこれによく引っ掛かっていた。有名な「"0x"で始まれば16進数」、の8進数での決まりらしい。しかし今FireBugsで試すとやはりそんなこともないようだ。
answer = "10";
console.log(answer); // 10 となる
 
answer = parseInt("010");
console.log(answer); // 10 となった
 
answer = parseInt("0x10");
console.log(answer); // 16 となる

Ringerhut

 お昼にリンガーハットの長崎ちゃんぽんを食べたのだが、いつの間にこんな高級メニューになってたのか。標準メニューが590円とは…。390円とかじゃなかったっけ?
 590円になっても変わらず松屋のようなカウンター席が主で、しかも横の人との席の近さは限界に近い設定だ(太った人が隣に来ると辛いだろう…)。にもかかわらず混んでいて女性客も多かった。お昼休みの松屋はテイクアウト以外で女性客はほとんど見かけない。何でだ。長崎ちゃんぽんってそんなに人気だったのか?
 カップヌードルシーフード味に似てるので僕も嫌いではないがカップヌードルシーフードってジャンクフードの美味しさなんだけどなぁ。
 一応はテーブル席も用意されている日高屋のラーメンが390円、野菜たっぷりタンメンでも490円と考えるとこの店舗形態で590円で、というのはなかなかすごいことだと思う。個人的には日高屋の野菜たっぷりタンメンの方が良いと思うな。

 ところでお腹が弱い人向けにヨーグルト定食的なメニューがあれば流行るかもしれない。山盛りのヨーグルトをイチゴやバナナなどと一緒に食べられ、バリエーションとしてカスピ海ヨーグルトが選べる、など。

 再び行ってみたが麺2倍が無料とか誰得なんだ…。麺は1人前で良いから野菜2倍を無料にしろよとw
 それはそうと店内の券売機におつり9千円が放置されてたらしい。店内の誰かが取り忘れてる訳だが、どうすんのかと思って見てたら店員さんが発券記録を引っ張り出して12:20分の野菜たっぷり何とかを頼んだ奴が犯人てことまで分かったようだ(犯人じゃないが)。するとそのタイムスタンプの食券と席番号が注文記録に残っており、無事返せるというわけだ。そんなことより券売機におつりの札が残ってたらケタタマシイアラート音が鳴るようにしておけばいいのに(MUFJのATMのように。あの音が鳴るのが恐怖でササッと取ってしまう)。

2014/01/10

美味しいラーメンは北海道にしか存在しない!!

 北海道に帰省中、どうしても味噌ラーメンが食べたいとリクエストしたところ「けやき」へ案内された。行くことに決定したのが12時前、けやき(円山店)のラーメンを食べ始めたのが3時過ぎであった。
 別に並んでたのではなく、雪で高速道路に速度規制が掛かり想定以上に時間が掛かったのだ(札幌までラーメンを食べに行ったのではなく札幌に行ったついでに本場の味噌ラーメンを食べたという話だ)。久々に本気の味噌ラーメンを食べることが出来た。
 ラーメンとは言うが東京のそれと北海道のでは全く違う食べ物な気がする。東京に来たばかりのころは美味しいラーメン屋を探して食べ歩くこともあったが最近はすっかり諦めてしまった。東京で美味しいと言われるラーメンと僕が探している美味しいラーメンには根本的なズレがあること、僕が探しているラーメン屋も都内に数件はあること、しかし近所にないかな~などと期待するのは諦めた方が良いことが分かったのだ。
 今回食べた「けやき」は本場札幌の中でも上位の人気店だということだが、明らかに東京に存在する全てのラーメン屋より美味しい。しかしそれでも、と思う。けやきが東京に店を出しても流行らないだろうな、と。東京でのラーメンという名前の食べ物が北海道のラーメンと違うのだからどうしても「これじゃない」と思われてしまうだろう。しかしそれは僕が東京で入ったほぼ全てのラーメン屋で感じた「これじゃない」と同じものだ。

 本当に言いたいことは「東京にうまいラーメン屋は無い!! 北海道最高!!」ということではなく、「ラーメンには種類があり、人によって好みが違う」ということだ。いい大人ならそのくらいの理解はして、公共の場で〇〇の方が絶対的に優れている、などと言わないことだ。
と、思っていたのに「ラーメン発見伝」というクソ漫画で「札幌味噌ラーメンなんて総じてクソ。醤油ラーメンが最高。」のように言われているのだ。くそ・・・

 東京で食べられる札幌味噌ラーメンの数店とは「てつや」の高円寺店と「味の時計台」各店のことだ。「てつや」の方が格上だが店舗数のある「味の時計台」も貴重だ。その他の安易に北海道ラーメンと銘打たれているものには期待しない方が良い。

最近、地下鉄東西線神楽坂駅近くの「ふうふう亭」というラーメン屋の味噌ラーメンを食べたが北海道の札幌味噌ラーメンのようですごくうまかった。特に札幌味噌ラーメンというメニューではないし、お店としては塩ラーメンがお勧めのようだがこの店の味噌ラーメンはすごく美味しい。

2014/01/08

Cloud Atlas

クラウド アトラス」見ました。お正月にwowowで。
実家は特に映画好きって分けでもないのによくwowowを契約してるよなぁ。
まぁDVDレンタルはちょっと面倒だし、録画も合わせれば定額で垂れ流しってのはコストパフォーマンス的に悪くても暇潰しに良いのかもしれないと思った。個人的に利用するならHuluとかが良いと思うけど、実家の世代的にTV以外でってのは抵抗があるかもね。
 さてクラウドアトラス、家族内では、見る前から「面白いのか?」「長くね?」「R15指定とか危なくね?」など会議が開かれたものの結局見始めてしまった。6つの全く別なシナリオが切り替わりながら進み、しかもそれぞれには直接なんの関係もない(過去にこういう話があったから未来でこう繋がる、みたいなのが無い。いやあるんだろうけど薄い)。なもんで見終わった後に「なんか知らんが超大作を見た!!」という心地良い疲労感が感ぜられる。
 ただし6つのシナリオを追いかけるのはかなりしんどいというか無理で、「あぁそーいやこんなこともやってた」みたいになるはず。結局ソンミ451の話と文明崩壊後の未来の話だけで十分だと思った(R15は伊達じゃないので誰かと一緒に見るのは注意だ)。

麒麟の翼」を見ました。年末にテレビで。
しかし10時までは東京MXでやってた「進撃の巨人 一挙放送」を見てました。てか映画見るなら最初っから見ろよとw
 しかし進撃の巨人ってなんかうじうじしてる人ばっかりでやーね。ロードオブザリングでオークの大群に向かっていく人達を見習いなさいよ全く。
 キリンのツバサ、なんか面白そうだと思ったんだけど後味悪いですねぇ。てかこんなところにもゴローさん(井之頭)が出てたし。刑事のまなざしの方が面白いと思う。ま、殺人事件のミステリーなんて2時間ドラマで十分。

さて帰省中またウナギ食べてしまいましたなぁ…。今回はうな重弁当2つを一家四人で分けたので若干気が楽ですが、やっぱ止めた方が良いと思うんだよなぁw

年末年始に一挙放送していた進撃の巨人、帰省中に録り溜めていたので一挙に見ました。いや一挙に見るつもりは無かったんだけど、後半うじうじした人が減ったし自由の翼カッコいい(・∀・)し面白くて止まらなかった。てか25話まであるのにまだ全然途中じゃないですか。2期はあるのか?漫画読むしかないのか?漫画もまだ終わってないんじゃないのか?

2014/01/07

Microsoft Windows Installerでフォントをインストールしない

 インストーラでインストールする内容物に拡張子「ttf」のファイル(フォントファイル)が有ると、自動的にWindowsのFontsにインストールされる([Windows\Fonts]フォルダにショートカットがコピーされ、レジストリ[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts]にも登録される)。もしかしたら[ttc]など他のフォントの拡張子もこういう動作になるかも知れない。
 こちらとしてはただttfファイルをフォルダ内に入れたいだけなのに勝手に登録してくれるので困る。と言っても逆にフォントをインストールしたい場合にはどういうコマンドを出せばいいのかよく分からないのでこの機能は有難いだろう。

フォントファイルがあってもインストールしないようにするには、2つ対処がある。
1.InstallScript内で
Disable(SERVICE_ISFONTREG);
を実行する。
2.「動作とロジック」の「シーケンス」内のアクション「registerfonts」「unregisterfonts」を実行しないように条件に「0」を入れる。(あるいはシーケンスから削除しても良いだろうが復帰する方法がよく分からないので条件に「0」を入れて隅に寄せておけば十分だと思った)。
 Flexeraは1.を進めているようだが別に2.でも構わないと思う。