- 何か新しい趣味始めたい
- 卓球は京都だとなかなかやる場所が見つからないし、そもそも2人以上いないとできないから厳しい
- ボルダリング体験してみたけど、楽しさ分かる前に筋肉痛で続かない
- ybenjoがランニングをずっと続けているので、じゃあ自分もやってみよう
ということでやり始めました。9月終わり頃から始めたので、一ヶ月半くらい続いています。何か定期的に記録を取らないとモチベーションが続かないかも、ってことで木津川マラソンのハーフにエントリしてみました。2/1に走る。2時間前後くらいでゴールを目指したいなぁ。
1kmくらい走ると息上がるかと思ってたんですが、以外ともうちょい走れた。10km走るとかなり疲れが残るけど、一回5kmくらいだと丁度よい感じ。5:30/kmくらいならペース維持できるってのが分かってきました。毎回記録を取っておくことでかなりモチベーションの維持につながっています。会社帰りで最初は走っていたんだけど、なかなか時間が取れないこともあって、朝から走っています。朝だと出社しないといけない時間が後ろにあるからダラダラしなくなっていい感じです。
スニーカーで走ると明らかに足の負担がよくなさそうだったので、ABCマートとか入って店員さんに聞きながら1万くらいのやつを選びました。ランニング初心者はちょっとくらい重くてもクッションがちゃんとあるやつを買ったほうがいいということ。
Runkeeperでタイムとかをはかって、pebbleでペースを見ながら走る、というやり方。簡単に時間が見れて、信号で止まるときに簡単に止められるのですごくよい。
お腹に巻くやつ。iphoneをポケットに入れているとポケットの中で暴れて大変気をそぐ。このポーチはお腹にかなりフィットして、全く暴れない。もうこれがないと走れないって感じです。
秋から冬にかけて走ると耳が冷たくなり気分が悪くなることが多いので、耳が冷たくならないようにすることは必須。それでイヤーマフを買った。
8月からインターン生がくることもあり、(見栄で)机の上を整理しようと少し試行錯誤していた。仕事柄、論文を印刷しまくるので気を抜くと机の上が論文の海になって、必要な書類が出てこないなどの事態を引き起こす。院生のときは論文をカテゴリに分けていたが、大抵面倒で続かないということが起きた。よって手間がかからない方法が必要である。
今、手帳を日付毎に書いていているが、時系列に書くというのは特別なルールを必要としないし、自分の頭というのはいつ頃書いたというのは意外と覚えている。これを参考に、プリントも時系列で管理することを考えた。よくよく考えると43foldersというやつと同じかもしれない。
管理といってもこれに挟んでおくだけである。
これは31個のポケット(?)からなっているので、その日使ったプリントは基本的にその日のところに入れておけばよい。職場から帰るときに、その辺に散らかっているプリントをその日のポケットに放り込むだけである。頭を使う必要がない。アクセスが多い資料は基本的に最近のところに並ぶし、アクセスが少ない資料は最初の日のポケットに残り続ける。今はこれを2つ買っておいて、月が変わるときに入れ替える。また、「来週のこの日にこの資料が必要!」というのはその日のポケットに入れておけば存在を忘れておける、というのもなかなかうれしい。例えば、インターン生がくる初日に必要な資料はその日のポケットに入れておけばよい、というわけである
このファイルのいいところは、挟んでおくだけで資料が落ちないという仕掛けになっているので、プリンタを出し入れするコストが低い、ということである。
プリント落ちそうに思うでしょ?落ちないんです、これが。
毎日のプリント管理は上のやつで困っていないんだけど、毎月の資料というのをどうするか。毎月の整理にはこれを使っている。
今度はポケットが12個あるので、毎月月初めにLIHIT LAB スケジュール&仕分けファイルに挟んである資料を今月のポケットに放り込む。これだけである、簡単。あとは半年とか一年のスパンで資料を整理すればよい(このくらいのときは論文をカテゴリ毎に分類すればよい)。印刷した論文って、そのときは大事に思うからなかなか捨てにくいんだけど、半年くらい経つと何で印刷したのかよく分からない、ってことがかなりあると思う。なので、半年後には捨てていいかの判断がやりやすい、というのがメリットである。不必要なものはとにかく捨てる。
完全に43foldersのパクりっぽいけど、今のところはこれで結構うまく行っている。時系列というのは何も考えてないで勝手に整理されていくので本当に便利である。
上半期が終わりましたね。上半期の散財メモを書いておきます...。
一冊180円なので散財というかは微妙だけど。野鳥はとにかく頑丈なので、適用に扱っても問題ないし、一冊40枚しかないので一ヶ月程度で使い切れる(一冊のノードを使い切ったのとかいつぶりだろう)。すでに三冊目に突入した。野鳥にベルクロ付けて、文具王手帳にぺたっと張り付けています。パラパラするのは嫌なのでゴムを上から付けている。
野鳥に実験結果のグラフをペタペタ張り付けているが、色んなところに旅行や遊びにいったら、それも張り付けておきたい。ということで、シールで貼れるタイプのプリンタを買った。
- Amazon.co.jp: LG Electronics Japan スマートフォン連動プリンター Pocket Photo ホワイト PD239W: パソコン・周辺機器
- Amazon.co.jp: LG Electronics Japan ポータブルモバイルプリンター「Pocket Photo」専用ZINK用紙シールタイプ PS2313: パソコン・周辺機器
シールタイプはあまりコスパ(1枚50円程度)はよくないといえばそうなんだけど、写真があるとないとでは思い出す度合いが全然違うので、しばらく使ってみる(「写真はBlogに張っておけばいいじゃない」というがまともな意見かもしれないが、Blogだとメモを全然見直さないなと思って紙に回帰したのである)。二ヶ月で30枚を消費するくらいのペースで使っている。BluetoothでiPhoneと通信して写真を印刷できるのでケーブルがいらないし、充電もmicro USBでできるので鞄の底に入れておくと旅行にも持っていける。
Syncではないboogie board(BB-2など)は自宅でのコミュニケーションツールになったり、研究での殴り書きメモになっていて、大変役に立ってる。ただ、書いた結果をiPhoneに撮っておこうとすると光が反射するのでなかなか綺麗に取れない。Boogie Board SyncはiPhoneとbluetoothで書いたメモを同期してくれるので、その辺に書き散らしたものもiPhoneにどんどんためていける。研究会のポスター発表のときなどは特に重宝しそうだ。
スマートウォッチ。iPhoneの通知を時計に飛ばしたり、fitbitの今日の歩数みたいなのを表示したり、音楽プレーヤーの操作ができたり、明日の天気が表示できたり。自分のiPhoneケースは予備バッテリ込みのものになっていてかなり厚いのだが、pebbleがあると頻繁に取り出さなくて済むので便利。あと充電しなくても5日くらい持つので、電池の持ちもまあまあかな。さすがに自分でアプリを作ってまではいない(時間がない)。
後で買うときにメモっておかないと色々不便なので。
-
Amazon.co.jp: レイメイ藤井 システム手帳リフィル バイブルサイズ キーワード 徳用ノート・クリーム WWR510L: 文房具・オフィス用品
-
これにバシバシ書いていってるけど、あまりこだわりがない。字がでかいので罫線が細かいとダメ。ヨドバシで200枚で367円で買った。割安だったような記憶
-
Amazon.co.jp: 2014年版 バイブルサイズ 月間9 カレンダータイプ インデックス付 システム手帳リフィル 056: 文房具・オフィス用品
-
montly。月でのタスクとか行事とか他人の予定とかをおおざっぱに書き込んでいる
-
Amazon.co.jp: 2014年版 バイブルサイズ024 週間ダイアリー10 バーチカル 平日重視 システム手帳リフィル: 文房具・オフィス用品
-
weekly。いくつかの形式で試してみたけど、一番しっくりきた
-
アドレス帳。郵便番号とか会社の住所とか覚えてられっか、みたいなのをさっと引けるようにしてる。一枚しか使ってないが...
-
テスト使用中。ジョッターで使うときに試してみている。多少割高間が否めない。ジョッターで書くときにはインクがかすれてしまったりするので、一枚を下敷代わりに敷いておくとよさそう
-
文具王手帳の名刺入れに入れて使っている。紙の手帳でスケジュール管理をする上での影の立役者みたいな感じ。fixしていない予定をフセンに書いてペタペタ張って予定やToDoを移動させている。あと、今年読んだ本とか見た映画も読みたいリストに最初張っておいて、終わったら移動する、みたいな感じで使っている
相当でかい箱だったけど、IDC大塚さんがゴミ一つ残さず届けてくれた。10分もかからなかった、恐るべし。約2週間くらいで届いた。
手帳に使うペンをあれこれ試行錯誤している。最初はLAMY Safariの4色ボールペンを使っていたが、書くときに少しカチャカチャと音がするのが気になる。それと最近万年筆を使うようになったのだが、キャップが付いていると移動中だと付け外しが面倒(でも、さぼるとペン先が乾く)。キャップが付いてなくて万年筆で、という条件で探していった結果、これを買った(細字)。
ネットで調べた感じだと、キャップレス万年筆はLAMY dialog 3というのも有名らしいのだが、Lamyの万年筆は少し太いのである。万年筆初心者なので、高島屋に行って店員さんにあれこれ教えてもらいつつ試しながら決められたのでよかった。こういうものを買うときはネットより有名百貨店みたいなところがいいですね。ロフトでも万年筆は扱ってるけど、高島屋のほうが断然色々試させてくれて納得して買うことができた。手帳に書くので極細のほうがよいものかと思っていたのだが、実際書いてみると細字で十分だったし、書き味は細字のほうが好みだったので行って自分で試してみたほうがよさそうである。
若干衝動気味で買った文具王だったけど、予想よりもずっとよかったので続報。
これは文具王手帳に限らないのかもしれないけど、ジョッターが素晴しい。この手帳を買うまでジョッターという存在を恥ずかしながらそもそも知らなかった(こんな感じの)。手帳を開かなくても書けるから書くところを探すという行為をしなくてよいのですぐ書ける。電車とかバスの中でメモをするときにはうってつけな感じである(一日計2時間はあるのであなどってはいけない)。文具王手帳にはA4を4つ折りにしたやつを裏表で書けるので、かなりの量が書ける。ペンを付けるところも付いているから「紙はあるけど、ペンがない!」という事態が起きない。
最近、システム手帳を使っていなかったのでうとかったのだが、リフィル最近はすごい充実しているのね。monthlyとweeklyのスケジュールと普通にメモできる横罫の3種類を使っている。
- monthlyにはある程度決まった締め切り
- weeklyには今日のToDoとかやったこと
- 横罫には論文読んだメモ、本のクリッピング(引用とか)、今年読んだ本一覧、今年の目標
みたいな感じで使い分けている。手帳はデジタルツールと違って書き直しができない(or しづらい)という欠点があるけど、ポストイットを使うとあちこち行ったりきたりすることができるようになった。メモみたいなのはなぐり書きなので、修正ペンを使わずにぐちゃぐちゃっと塗りつぶす。
弊社の自販機は1000円より大きい紙幣を受け入れないので、「万札しかない」という事態が割と起こってしまう。そういうときとかに役に立っている。バイブルとA4の大きさの違いをうまく利用していてよい。
これは案外うまく使えていない。単語帳をしこんでみているが、それが続いていないのが大きい。
取り上げたいが、書くの面倒とか時間がないなどの話題。忘れないようにメモだけしておく。
- 確定拠出年金
- これがきっかけで投資(特にインデックス投資)に興味が出てきた
- アーロンチェア
- 腰が壊滅的にダメになってきたため、ついに購入。引っ越す前後から買う買うといっていたのだが、実際に座れるところがなかなかないので。IDC大塚家具というお店にはるばる行ってきたが、店員さんがアドバイザという形で一人ずつ付いてくれるので大変分かりやすかった。アーロンチェアの後継者であるというエンボディチェアというものを買った。再来週くらいにくる予定
文具を中心に色々買いました。
英単語を暗記するときに殴り書きとか、アイディアをなぐり書きとかをするときに重宝。書いてる感覚が紙に書いてるのと近いのがよい。一番大きいサイズを家と会社用に2枚ずつ買ってみました。iPadのメモアプリとかでもいいかなって思ったけど(実際、スタイラスとか数本買ってみた)、書くときに書く人間が気を使ってかかないといけない付近が気に食わなくて使わなかった。Boogie boardだとその辺気にしなくてよい。道具のほうが合わせろよと。
高いけど、これはいい買い物したと思う。ズボンのポケットにいつでもメモできるようにしておこうとしたことは前もあって、以前はPocketModとかを使っていたりしたけど、ペンがいいの見つからないとか肝心の紙がグチャグチャになってしまって使うときに萎えるという事態が多発した。薄いメモ帳はペンが常にセットになっているから肝心な時に書けないということがないし、皮のしっかりしたカバーが付いているので紙がぐちゃぐちゃになることがない。どこにでもあるA4を折り曲げるだけなので、気軽にメモできる(いい紙だと、気軽に書くのに心理的ハードルが上がってメモしないという悪循環がある)。A4一枚しか入っていないので、ポケットの中でかさばらない。あと、この折り曲げ方はすごいアイディアだと思う。プレゼントとかにも悪くないものだと思います。小さいポケットみたいなのが付いているので、ICCOCAを入れて使っております。
最近のメモはDay Oneに二年くらいとにかく取っているんだけど、思い付いたアイディアを時系列で眺めたいときはやっぱりアナログのほうがよくって紙の手帳に戻ろうかなと考えていた。薄い手帳を買うときに、丁度文具王手帳が目に入ってコンセプトが気に入って買ってみた(という割には高いのだが...)。購入時はリフィルやペンも付いていないのでそっけない感じに見えるのだが、手帳が厚くならないようにとかそれぞれのパーツの配置がよく考えられている。文具王の名に恥じない感じである。
ボールペンはLAMY 2000 4色ボールペンを入れて使っている。カンガルーホルダには連想式にみるみる身につく語源で英単語をA4 2ページくらいを自分でPDFに吐いた一覧表みたいなのを入れてる。ジョッターですぐにメモできる付近もなかなかすごいアイディアである。
今年はまだ二月くらいあるけれども...。まとめてみたところ、(前からそうだが)本当に本当に面倒なことが嫌いな人間であるということが分かった。何かができるようになったことより、何かをしなくなってよかったことに対して幸福感を感じる人間である。面倒なことをいかに頑張るかを考えるよりいかに面倒なことをしないでいいかを頑張ったほうがよい。
fitbit oneは誕生日プレゼントでもらったもの、fitbit ariaは自分で買った。
Fitbit Oneは
- 歩いた歩数
- 距離
- 階段の段数
- 消費カロリー
- アクティブな時間
を計測してくれるのだけれども、ズボンのポケットに付けておくだけでよい。充電も週に一度やれば十分。半年近く使ってて電池が切れたって状態になったことがない。継続させるにはいかに面倒でないか、意識しないでよいかが大事だと個人的に思っているけれども、邪魔にならないし面倒でもない(存在感がないので洗濯してしまわないように注意が必要である)。勝手にログが溜っていく。
父親にも父の日でプレゼントしたのだが、SNSの機能が付いていてFriendsにいる人がこの一週間でどれくらい歩いているかが分かる(一日の詳細レベルでは分からないようになっている)。父に負けるとなんか悔しい気がするので頑張るかという気がしてくるのと、一日頑張るより継続的に頑張るほうが楽であるというのを知ることができるという意味で割とよかった。あと多分実家へは生存確認できるという意味でいいのだと思う(三日くらい歩いてなかったら風邪引いてるのか分かる、みたいな)。
体重計に乗るだけでwifi経由でアップロードされ、長期間の体重がトラックされるというのは自分ではほとんど何もしなくていいので楽チン。ボタン押すとかアップロードされるまで待たないといけないとかそういう面倒なことがない。
元々Bluetoothのイヤホンを使っていた。Bluetoothなので、iPhoneからは切り離されたのだが、結局Bluetoothのコントローラーとイヤホンがコードでつながっているのでコードの呪縛からは解き放たれることはない。首にかけるものや後頭部に付けるタイプのものを買って使ってみたことはあるものの、存在感がありすぎて邪魔だったり、耳が痛くなったりしてよろしくなかった。
今度買ったこいつはそもそもコードというものが存在しないし、すごくコンパクトなので付けているのを忘れるときがあるのが心配なくらい。欠点といえば
- イヤホン側だけで音楽の前の曲次の曲に移動できないこと
- (前のBluetoothが8時間くらい持ったこともあり)バッテリの持ちが少し短かく感じられること
だがコードという面倒な存在が消えさったのがとても大きいのでよい買い物だった。片耳ばかりで聞いていると耳が悪くなってしまうのは心配だったから両耳用買ってしまっている。
IKEAで買って組立サービスで組み立ててもらった。引っ越した直後に組み立てたので場所があったが、そうじゃないと割と場所がいるので気を付けたほうがいいかもしれない。
ディスプレイ2枚並べて作業したいとか論文ちらかしつつ作業したいという欲求があるのだけど、横に長い机だと自分があちこち移動しないといけないので面倒。この机はL字型にできるので椅子のでくるくる回るとディスプレイを見るのと論文を見る、とかっていうのがシームレスにできてよい。また、別々に買ったものをL字型に組合せて使うと接続部分の段差が気になったりするが、このデスクの場合そういうことがなくてストレスなく作業できる(結構重要)。
確かここを見ていいなと思ったのであった。いいイスも買いたい...。
日本のClojure界隈では使ってみた系のエントリをほとんど見たことがない気がしますが、coreに最近入ったcore.typedを使ってみました。clojure自体のtype hintsは高速化には寄与するけど、型レベルの誤りなどを教えてくれるわけではありません。一方、core.typedは「コンパイル時に」型レベルのエラーを検知できます。最近、ネストしたリストなどを扱うことが多く、ネストのレベルを間違ってデータを突っ込んでしまうetcなどで困っていたので導入しよう、と思いました。
とりあえず練習用として、ネストしたvectorと再帰的な構造を例として書いてみました。
型レベルのエラーを出すことができるのもうれしいんですが、関数の引数の型を知ることができるのもうれしいところです。こんな感じで調べることができる。
(t/cf first)
(All [x]
(Fn
[(t/Option (I (Seqable x) (ExactCount 0))) -> nil]
[(I (Seqable x) (CountRange 1)) -> x]
[(t/Option (Seqable x)) -> (t/Option x)]))
clojureは例えばlistとかvectorのようなコレクション系の変数にはcoll
のような名前を付ける、とか暗黙的な命名規則(?)はあるけれども、型はないので保証まではしてくれない。だけれども、core.typeで型を付けておくと上のように変数の型を知ることができるので、何を投げればいいか実行せずともある程度知ることができます(これまではclojuredocからexampleを動かさないと分からない...ということ多数だった)。単純に型を付けることができるだけでなく、C++のtypedef
のようなこともできるので、意味のある型の情報(例えばSeqable
が入力でSeqable
が出力、程度ではなくてDocument
型からSentence
型を返すなどの情報が分かる)を得ることができるのも重要なことかな、と思います。
「testは書いてたんだけど、実行するの忘れいていつの間にかtestが通らなくなっていた...」とか「いつの間にかbuildできなくなっていた...」とかが多発したのでJenkinsを導入してみることにしました。あれこれ設定するのめんどくせぇ、ということでwarファイルを直接動かしている。~/.jenkins
とかに色々保存されている模様。jenkinsを導入したことで
- いつこけるようになったかを知ることができるようになった
- 通らなくなったのをそもそも早く知ることができるようになった
- これらを無意識(これ重要)のうちにできるようになった
付近がうれしいことです。特にテストの時間がかかるようになったとかはテストを動かすの面倒...ということにつながってくるので、自動化できるとうれしい。自分はGrowl連携とかでやっています。
趣味となって8ヶ月くらいは経過した写真撮影ですが、割と続いています(割と早く飽きるかと思っていた)。そういうわけで、Flickrのプロのアカウントを取得してみました。プロアカウントだと
- 枚数の上限なし(これはproじゃなくてもあるのかも)
- サムネイル画像の生成
- オリジナル画像の保持
- ISOやF値などの情報(Exif)が表示(これはproじゃなくてもあるのかも)
などがあります。写真を撮ってもっと上達したいなぁと思ったらあると助かる機能なので、使っていってもっとうまくなりたい。
ドラゴンボールの映画とか小学生(?)以来って感じですが、気になったので見てきた。
戦闘シーンとかは結構微妙な感じだったけど、ベジータが映画内でいいキャラになっていたのでよしとするw。
言語処理のアノテーター職人っぽい感じで見ていてよかった。
ただし、自分には向いていないように思う...。
タイトルがすでに複雑。マクロを使って関数を定義しまくるときに、関数にメタデータを付与したい。どういうメタデータを付与するかはマクロの引数によって決まるので決め打ちではない。以下のページを見ていると、vary-meta
という関数がまさにそれっぽい感じであった。
これを使うと関数定義時にメタデータをばしばし付与することができる。
(defmacro def-fn-with-meta [meta-map func-name args & body]
`(defn ~(apply vary-meta func-name merge meta-map) ~args ~@body))
(def-fn-with-meta {:feature-type "a" :bool true}
func-a [x] x)
(meta #'func-a) ; {:arglists ([x]), :ns #<Namespace user>, :name func-a, :feature-type "a", :bool true, :line 1, :file "NO_SOURCE_FILE"}
これがどんなときに役に立つかというと、適用する関数をある基準で選別したい、例えば上の例なら
- 素性のタイプがあるものだけフィルタリング
- 戻り値がboolのものだけ使う
とか、そんなことを後々したいときに便利に使うことができる。Clojure、マクロと名前空間のあれこれを抑え始めると大分パワーが上がってくる気がする。
この用途に関してはalter-meta!
というそのままな関数が存在したので、それでよさそうです。
(defn hoge [x] x)
(meta #'hoge) ; {:arglists ([x]), :ns #<Namespace example>, :name hoge, :line 1, :file "NO_SOURCE_FILE"}
(alter-meta! #'hoge assoc :aaa "yeah!!")
(meta #'hoge) ; {:arglists ([x]), :aaa "yeah!!", :ns #<Namespace example>, :name hoge, :line 1, :file "NO_SOURCE_FILE"}
久しぶりにRです。しかし、最近Rを使わなさすぎる。。。ちゃんとした実験っていうより予備予備実験程度のものは出力のファイル名すら考えるのが面倒、さらにそれをplotするためのスクリプトのファイル名を考えるのも面倒ってことがよくあります(怠惰)。そんなときはスクリプトの断片とかをDayOneとか(人によってはevernoteとか?)にペタペタ張っていくんでしょうが、そういうときにデータとコードが分離してしまうのは、それをリンクして考えないといけないコストが発生します。つまり、csvみたいなデータもコード中に含めてしまいたい。しかし、Rのread.csv
は文字列じゃなくてファイルを第一引数に取る...ということで少し考え込んだんですが、以下のようにtextConnection
を間に挟むとファイルっぽく見せてくれるようなので、便利でした。
raw_input <- "Number of documents, F-value
30, 0.418
50, 0.433
100, 0.472
200, 0.493
300, 0.506
342, 0.51"
d <- read.csv(textConnection(raw_input))
plot(d, type="b")
「実験しながら結果は見ておきたい、しかしログにも残しておきたい」というような要望があったときにtee
コマンドを使えば結果を見つつ、ファイルに出力する、ということができます。しかし、さらにパイプでつなぎたい場合(例えば結果をメールに転送しておきたい)はどうすればいいか?という場合にちょっと分からなくなったのでメモ。結論からいうと/dev/stderr
に送ってやればよい。
lein run | tee /dev/stderr | mail syou6162@localhost
/dev/stderr
で結果が表示されつつ、元の標準出力はmail
のほうに流れてくれる、という仕組み。
本当は自転車であちこち見に行こうと思ったけど、平日で結構疲れていたので、御所だけ見に行くことに。年度末ということもあって死ぬほどの人込みを予想していましたが、御所はそんなに混みまくっているわけではなく、桜自体もいい感じだったのでいいときに行けたようです。
よい年度末でした!
(よく知られた)黒魔術系です。よい子は安易には真似しないほうがよいらしいです。
Clojureはjavaの豊富なライブラリが使えてとてもよろしいのですが、ときどきjava側のライブラリの挙動を変更したくなります。with-redef
などで一時的に挙動を変えることやjavaのクラスを継承して元のソースを変更することなく、java側のライブラリの挙動を変更するという要望に応えることができます。しかし、java側のクラスに(protected
ならまだしも)private
が付いていると継承できなくなってしまうので困ります。
javaはほとんど知らないので初めて知ったのですが、リフレクションというものを使うとそのようなprivate
が付いたメソッドの継承やprivate
のフィールドにアクセス、変更することが可能になるようです。いわゆる黒魔術系?もちろん非推奨の技術だとは思うけど、private
なメソッドのテストを書きたいときなどに使われるようです(このようなケースでテストを書くべきかについては議論の余地があるっぽいけど、今回は知らないものとして扱う)。
そんなわけでリフレクションを使いたい。javaでリフレクションを使ってprivate
なメソッドやフィールドにアクセスするためには、まず
import java.lang.reflect.Field;
import java.lang.reflect.Method;
をしておきます。
例えばobj
というオブジェクトのtext
というフィールドがprivate
で修飾されているけど、アクセスしたいという場合には
Field field = obj.getClass().getDeclaredField("text");
field.setAccessible(true);
System.out.println((String)field.get(obj));
などとやるとよいようです。getClass
メソッドはオブジェクトの属するクラスを返すようなメソッドらしく(?)、継承元のクラスを得たい場合などはgetSuperclass
メソッドをさらにチェーンさせればよいようです(getClass().getSuperclass().getDeclaredField("text");
など)。field.get(obj)
の戻り値の方はObject
型なので、適当にキャストしてあげる必要があるようです。intが欲しい場合などはfield.getInt(obj)
などとする必要があるっぽい。詳しくはjavadoc参照。
privateなメソッドにアクセスしたい場合も上記とほぼ同様です。Field field
とやっていたのをMethod method
、getDeclaredField
とやっていたのをgetDeclaredMethod
とすれば動きます。呼び出したい場合はmethod.invoke(obj, arg1, arg2);
という具合。clojureで
もinvoke
というのをたまに見かけるけど、リフレクションを使っていたのね。
ただし、private
なメソッドがstatic
だった場合、これだけじゃいけないらしくしばらくはまっていました。欲しいメソッドの引数がString
だった場合
Method method = TargetClass.class.getDeclaredMethod("wantedMethod", String.class);
method.setAccessible(true);
という感じで指定して、呼び出す際には
method.invoke(null, "hogehoge");
などとやる必要があるらしい。インスタンスが必要ないからこういう感じか。
花灯路の期間中ということで、高台寺と清水寺に行ってきました。きつねの嫁入りを見れたんですが、写真はうまく取りきれなかった。。。
これ、最初に水面に映っているのに気がつかなかった。澄みきっている。
というわけで、夜の清水寺もいつもと雰囲気が違ってなかなか楽しめました。
ご無沙汰です。大変忙しく過しております。スライドとか原稿を作りまくるお仕事ばかりでコードが書きたいです。
pptxで図を作っていて、そいつをLaTeXの原稿に挿入したいってことがありました。まず、pptの印刷のところを選択して、現在のページのみを出力します。そして、実際にプリントアウトするのではなく、プレビューでpdfを開くを選択します。そのままでよければpdfとして出力し、余白を削る必要などがあれば選択して、コピー、クリップボードから新規作成をします。
これでpdfはできるのですが、LaTeXから吐いたときに余白ができてしまって困りました。以下のページを参考にするとうまくいきました。
\begin{figure*}[htbp]
\centering
\includegraphics[mediaboxonly=/CropBox,scale=0.30]{hoge.pdf}
\caption{I'm 6162!}
\label{This is label}
\end{figure*}
とりあえずこれでうまく行った。Omnigraffleだったらこんなことをしなくても素直にやってくれるのに。。。
関西方面にきていたyag_aysと京都水族館に行ってきました。8月に一度きたことがあるので、二度目の来館です。3回以上くることがあるなら年間パスを作っておくとよい感じだったので、作っておけばよかった。。。
京都駅から徒歩でも15分、市バスなら10分もかからずに着くところにあります。海がないのに水族館。
生まれて一ヶ月も経ってない赤ちゃんペンギン。ご飯食べてた。かわいい。。。
みんなで一斉にプールに向かっててシャッター切りまくっていた。
また行きましょう。
この日記でもそうだけど、句読点は「。、」で書いている。でも、日本語の論文の原稿とかは「.,」であることが慣例である。IMEの設定とかEmacsの設定で変えてしまえばいいんだけど、変えるのはこの原稿だけでいいって場合がある。Omakeを使ってTeXのファイルをコンパイルしているので、その前処理でそういうのをやってくれればいいなと思ったのでメモ。置換しているだけ。hoge.tex
ってファイルを編集していて、置換後のがfuga.tex
になっている。あとはいつも通り。
LATEX = platex
DVIPDFM = dvipdfmx
BIBTEX = jbibtex
DVIPDFMFLAGS = -p a4
LaTeXDocument(fuga, fuga)
fuga.tex: hoge.tex
.DEFAULT: fuga.pdf fuga.dvi
.BUILD_BEGIN:
nkf hoge.tex | tr "。、" ".," > fuga.tex
ちょこちょこ読んでます。
- Amazon.co.jp: 「大発見」の思考法 (文春新書): 山中 伸弥, 益川 敏英: 本
- Amazon.co.jp: 研究者という職業: 林 周二: 本
- Amazon.co.jp: 科学者として生き残る方法: フェデリコ・ロージ, テューダー・ジョンストン, 高橋 さきの: 本
プロゲーマーの本は思ったよりすごかった。
職場の先輩が貸してくれた本。
本じゃないけど、これはよい買い物だった。ダメ人間製造機。
重複または不足多々あるけど、忘備録的な感じで。
- 自分の記憶力を当てにするな
- 再現性を確保しろ
- データの前処理をしたのは一ヶ月前で、粛々と実験してたけど、前処理変更が必要。あれ、この前処理どうやったっけ
- 論文に貼り付ける図、csvファイルから作ってるんだけど、このcsvファイルはどのコマンドをパイプでつないで作ったファイルやねん...
というあるあるなこと。linuxのコマンドをペタっと貼っておくだけなんだからサボらずメモしておく。guiなソフトはこの辺、記録を元に同じのを作るのが不便なのでなるべくcuiで完結していたいところ。
gxpcなどでいくつものマシンにタスクを放り投げる際はコマンドの実行時から実行バイナリを上書きしてしまう可能性がありうる(ついさっきやってしまった…)ので、コンパイル済み or jarで固めたものは日付付きで取っておいて、そいつを指定するようにするとよいかもしれない。
標準出力とかに出しててもいいんだけど、いくつも並列で走らせてると覚えてるのが面倒。タスクの特徴を表すような名前のファイル(毎回考えるのが面倒ならある程度名前を表しているファイル名の生成規則で自動生成)にログを吐いたりすると後から安心して確認できたり、加工できる。多少多めにログを吐いておいたほうが何かと助かる。ディスク容量はあんまり気にしても仕方ない。ロガーを使いこなそう。容量が気になるのなら、全部終わった後に、目的のディレクトリに移動してtar zcvf hoge.tar.gz .
などとやれば圧縮もできる。
コマンドライン引数、食わせたファイルなどの情報も必ず吐かせて再現性の確保に努める。
動作の保証にもなるし、バグったときの足がかりになるし、動的言語だと入出力の型はどういうの食わせればいいか分からなくなるし。100%どうにかできるというものでもないが、確実にコストはペイできる見込みがあるのにどうして書かないのか。
前処理からパラメータ推定、デコード、グラフに出力とかまで全部一個のコマンドで済むのなら覚えておくことが一個だしよさげに見える。しかし、それは一回で済むのならという前提付きだ。そしてその前提は大抵成り立たない。実験は何回もやってうまくいくもんだし、グラフのlegendはよく変えたくなる。一個にまとまってるとどこかでミスをしていたときに全部やり直しになる。小さいのが複数あれば失敗したところからやり直せる。機能は細かく作ってcomposableなようにしておこう。
設定可用性なんて日本語があるのか知らないけど。実験の設定とかで変わりうるもの(食わせるデータ数、パラメータの初期値など)はとりあえず固定しておくのは簡単ではあるけど、あとあと変わってくるもの。with-redef
とかを使いまくるのはよくないけど、必要な設定はあとでrebindできるようにしておこう。設定するのが面倒ならばディフォルト引数を与えるようにするとか色々やりようはある。コンパイルが必要な言語では設定ファイルは別のリソースディレクトリにあると便利だろう。
MCMC系は乱数のSEEDを意識するのは重要だし、shuffle関数とかもseedを与えれるものを作っておくと便利だろう。
今年の年末年始はあっちへこっちへ行っていました。濃密で楽しかったです(えっ、これから2月終わりくらいまで忙しいんだからいいじゃないですか...)。
某イベントで友達と会うために東京へ。それぞれにお土産買ってたらすごい量になっていた。喜んでもらえたようでよかった。
年越しは@yag_ays宅で。ガキの使い見てたら年があけてた。
明けてから浅草寺へ初詣にも行った。
7時間くらいかけて新幹線で実家に帰ったけど、さすがに疲れた。実家ではゲームしたり、寝たりしていた。
彼女と初詣に行ってきました。あちこち行きまくって楽しかった。
今年もうまいもの食べていきたい。
職場では「2012年まとめ記事とか書くとあとで黒歴史化する」とか言われましたが、聞かなかったことにしよう。
恐れ多くも企業研究者の一員になってしまいました(ひよっこながらも)。インターンで来てたときからも感じていたけど、本当に自由にやらせてもらえる職場で、周りに優秀な人ばっかりいる職場です。一日に三回くらいは「俺ここにいていいんだろうか?」って思うくらい恵まれた職場です。「俺くる(能力的な意味で)場所間違えたんじゃないんだろうか」とか「もしかして取る人間違えたんじゃね?」とか思いまくりですが、この環境で何もできないんだったら俺はどこでもやっていけないような気がするので 10000 、必死にやっています。修士の頃とはテーマが結構変わったので、今やっている分野の基礎事項が分かってなかったりして研究的にはまだ何もできていない状態に近いです。もどかしいです。(人的にも計算機資源などの意味でも)環境が素晴しいだけに、言い訳はできません。成果を残していくしかない、それだけ。
始まる前までは、というより始まってからもしばらくは「早く終わって研究したい」とかしか思っていなかった研修ですが、終わってみると自分の中に大きく影響を与えていることが分かります。特に同期の仲間ができた、というのは大きいことです(うちのロケでは同期が自分以外1人しかいないから...)。バックグラウンドや今やってる仕事はもう全然違うけど、販売研修を通して同じ苦労喜びを分かちあった仲間ができたというのは自分にとっての財産となりました。今でもときどき相談とかに乗ってもらっているし、人間的にも尊敬できるやつばっかりなので、今後も仲良くしていきたい。
あと、販売研修という大変つらくもあったものを通して人間力というかコミュニケーション力というかその付近のところに自分の中で大きな変化があったように感じています。NAISTでずっと研究やってたらこれは感じれなかったことだと思う。自分の枠を広げていくうえでこれは大事なものになっていくと思うので、もっとうまく自分の中に取り込んでいきたい。
例年になく充実していました:)。基本的に引き込もりな性格だけど、8月にカメラを買ってからこの日記にも書いているように色んなところに行きました。一緒に行く人がいたから楽しかったってのもありますし、来年もまた色んなところ一緒に行きましょう。よろしく。会社のロケが京都で本当によかった。
あと、小説とかも近年には珍しく読むようになってきていて、これも継続して読んでいきたいな。
しばらく通勤読書がおざなりになっていたけど、復活させた。
出たばっかりに買ってみた。
あの二人がついに...!不器用な彼等がああなってくれてよかった。
let
の車輪の再発明。On Lispの勉強中なのです。パターンマッチとかできるようにして、クエリコンパイラとか作りたい(core.matchでできるとか言うな、そこ)。
まず、こんなのを
(destruc '(a (b c) d) 'seq 0)
こんな感じで
((a (clojure.core/nth seq 0))
((G__9671 (clojure.core/nth seq 1))
(b (clojure.core/nth G__9671 0))
(c (clojure.core/nth G__9671 1)))
(d (clojure.core/nth seq 2)))
変形させる関数を用意。
(defn atom? [x] (not (seq? x)))
(defn destruc [pattern seq-name n]
(if (empty? pattern)
nil
(let [r (cond (atom? pattern) pattern
(= (first pattern) '&) (second pattern)
:else nil)]
(if r
`((~r (drop ~n ~seq-name)))
(let [p (first pattern)
rec (destruc (rest pattern) seq-name (inc n))]
(if (atom? p)
(cons `(~p (nth ~seq-name ~n))
rec)
(let [v (gensym)]
(cons (cons `(~v (nth ~seq-name ~n))
(destruc p v 0))
rec))))))))
次に、上で生成されるようなネストしたリストをネストしたlet
に割り当てるような関数を用意。
(defn dbind-ex [binds body]
(if (empty? binds)
`(do ~@body)
`(let ~(->> binds
(map (fn [b] (if (seq? (first b)) (first b) b)))
(apply concat)
(vec))
~(dbind-ex (->> binds
(map (fn [b] (if (seq? (first b)) (rest b))))
(apply concat)
(vec))
body))))
こんな感じのを
(dbind-ex (destruc '(a (b c) d) 'seq 0) '((+ x y)))
こんな感じに変形できます。
(clojure.core/let [a (clojure.core/nth seq 0)
G__9030 (clojure.core/nth seq 1)
d (clojure.core/nth seq 2)]
(clojure.core/let [b (clojure.core/nth G__9030 0)
c (clojure.core/nth G__9030 1)]
(do (+ x y))))
あとは、これを包んでやるマクロを書くだけ。
(defmacro dbind [pat s & body]
(let [gseq (gensym)]
`(let [~gseq ~s]
~(dbind-ex (destruc pat gseq 0) body))))
let
とできること同じだけど、これはこれで面白い。
(dbind (a b c) '(1 2 3) (list a b c)) ; (1 2 3)
(dbind (a (b c) & d) '(1 (2 3) 4 5) (list a (list b c) d)) ; (1 (2 3) (4 5))
今度はパターンマッチをやってみよー。
というわけで行ってきました。久々の神戸。
京都駅から特急で一時間くらいで着くので意外と近い。研修でお世話になっていた付近のビル周辺にあんなすごいのができるとは思ってもみなかったのでびっくりしました。
神戸は研修のときにうまいお店を結構知ることができたので、うまいところにもまた行ってきました。
そろそろ京都の紅葉を取りに行かねば...!ってことで高台寺に紅葉を取りに行きました。今週から3週間くらいがどうやら紅葉のピークっぽいけど、人手もピークっぽいので市バスとかは死にそう。
はてなインターンのときのお世話になったさっこさんがやられているHACOBU KITCHEN@五条に遅めの昼御飯に行ってきました。名前覚えててもらえて嬉しかったw。相変わらずのおいしさだったので、また来たいなーと思います。
その後は京都国際マンガミュージアムに行ってスラムダンクを読み漁ったり、夜はやきうどんを食べて帰ってきました。
最近へ平日のペースで休日もいると死ぬなって思うことが多いので、休日は意図的に外に出ることを多くしています。学生のときがいかにオンオフの切り替えができていなかったかという。。。
sort -r
とかってやるとシャッフルしてくれるので便利なんだけど、Macのsortにはこの機能がないっぽい。そういうわけでsudo port install coreutils
。
% echo "hoge\nfuga\npiyo" > tmp.txt
% cat tmp.txt
hoge
fuga
piyo
% cat tmp.txt | gsort -R >! tmp.txt
% cat tmp.txt
hoge
piyo
fuga
オンラインアルゴリズムでシャッフルが必要なときに、とか。
以下の問題点などがあって、タイトルのようなことをやってくれるものが欲しくなった。
- Clojureのmemoizeは再帰関数にはメモ化してくれない
- 再帰関数に名前が付いていれば(普通は付いていると思うが...)、メタデータにくっつけてメモ化することも可能
- Amazon.co.jp: The Joy of Clojure: Michael Fogus, Chris Houser: 洋書
- 11.42や12.4などが(とてもとても)参考になった
- しかしながら、上の方法を使っても無名関数だと厳しい...
そもそもなんで無名の再帰関数をメモ化するような事態があるかというと、CYKアルゴリズム(文が与えられたときに、その文を作る確率最大の文脈自由文法はどれか、みたいなのを動的計画法を使って効率的にやる方法)みたいなものをtable使うんじゃなくって再帰っぽく書きたいから。フィボナッチみたいな例だとglobalに一つそういう関数があればよいが、CYKアルゴリズムみたいなものだと文毎にそういう再帰関数が必要(なので無名にしたい)。tableを使ってもいいんだけど、関数型で書いているとどうにも合わないので。。。
ここでは簡単のため、フィボナッチ数でやってみる。まともに全展開してしまうとそりゃまぁ時間がかかります。
(->> (range 35)
(map (fn fib [n] (if (< n 2) n (+ (fib (- n 2)) (fib (- n 1))))))
(dorun)
(time))
; "Elapsed time: 1882.521 msecs"
globalにはfibって名前を付けないけど、メモ化するときにはその名前が必要...。というのをあれこれ考えていたらwith-local-vars
というのでそれができそうだった。
(with-local-vars [fib (memoize
(fn [n] (if (< n 2)
n
(+ (fib (- n 2)) (fib (- n 1))))))]
(time (dorun (map fib (reverse (range 35))))))
; "Elapsed time: 1.132 msecs"
無名のvarを作ってくれるそうな(letはvarを作ってくれないことに注意)。CYKみたいなのは相互再帰の形になっているので、単純にこれが適用できるかは分からないけど、足掛かり、ということで。
現在のところ、こんな感じだったら解決できるんじゃないかと考えている。
(def ^:dynamic fib)
(binding [fib ...] ...)
Clojureでは無名関数に名前が付けれた。これはびびった。
((fn fib [n] (if (< n 2) n (+ (fib (- n 2)) (fib (- n 1))))) 10) ; 55
思っていたよりも、ずっともっとベタベタだった。
はー、読んでるこっちが辛くなってきた。
遊園地とか何年(10年?)振りだよって感じでちょっと懐しかった。
思ったより小さめの遊園地で、ジェットコースター系のやつ、3回くらい同じの乗ったしていた。調子に乗りすぎたようで、後半は割とクラクラになっていた。三半規管が弱くなっている。。。
3-4日かけて一冊を通勤で読むことが最近多かったんだけど、1日で読んでしまった。
やっぱり高校スポーツ、大好きだなー。3年間の思いを1つの試合にかけるっていうあのはかないような、あの独特の空気が好き。
自分で作ったライブラリのバージョンは上げたくないんだけど、少し変わった、みたいな場合のときに(ディフォルトだと1日に一回しかclojars.orgとかを見に行ってくれない)。
lein -U deps
各位忙しかったり何だかんだで止まっていたsicp勉強会ですが、ozaさんに声をかけてもらったので再開することにしました。
Clojureでやる際に図形言語が面倒だったのですが(というかswing)、そこは再開のときは飛ばすことにしました。自分は図形言語を一応やっていたので、そこの付近のエッセンスについて書いておくと、「入力と出力の型を一緒にしておく」ってことがこの付近のエッセンスだったと思います。clojureはhaskellみたいに型を書かなくていいけど、逆に書かないことによりその付近を意識できなくなってしまうので、少々厄介なところ。図形言語で言うと「ペインタをbeloやbesideしたものもまたペインタである」というところを強く意識すると得るものがかなりあります。
上の考え方が役に立った例だとshift-reduce parsingがあります。shift-reduce parsingはstackとqueue(まとめてconfigurationと呼ぶ)に対してleftとかright、shiftやreduceといった操作をしていくのですが、これらの入力も出力もconfigurationになります。このことを考えると、初期のconfigurationからleftとかshiftとかを合成することが可能になってきます。
つまり
(reduce (shift (left config)))
みたいに書いていたものが
((compose reduce shift left) config)
といった風に書けるということです(関数を合成して、まとめて適用している)。できることは同じですが、関数のリストを一気にcomposeして、といったことができるようになってくると色々見通しがよくなってきます。この辺の考え方はhaskellをやると分かりやすくなった気もするし、モナドは下の本でやっと分かるようになってきました。
とてもよかった。続きが気になるから早く読みたいけど、終わって欲しくもない。
ところで、この本kindleでも読めるようになってる。
今月やたらと研修で東京に呼び出されていたら、帰りの新幹線が限度額越えたということで予約ができない事態が発生。。。しかし、これでしばらく東京へは行かなくていいはず。
できることはそんなに変わらないけど、使いやすさが上がっていてよい。研究だと引数に何指定したときにどういう結果が出たとか、意識しなくても勝手にlogが残っていく、みたいな感じだと理想的かな、と思ったりているので、そんなのを実現するために。
係り受け解析とかアライメントとかある程度高次のNLPのタスクを扱っているとエラー分析が割と大変になってくる(CoNLLのフォーマットだけ見てエラー分析はつらい...)。どう改善すればよいかの糸口を得るためにもエラー分析は重要。それをビジュアルにできるツールがあるので紹介。
同時解析とかJoint Inferenceとかの研究で有名なSebastian Riedelさんが作ったツール。
- syntactic dependency graphs
- semantic dependency graphs (a la CoNLL 2008)
- Chunks (such as syntactic chunks, NER chunks, SRL chunks etc.)
- Bilingual alignments
- BioNLP events, proteins, locations
などなど、shared-taskをベースにしてやる人にはありがたいツールである。ちなみに、こんな感じの出力が出る。
黒はgoldのデータと予測したものが一致した箇所、青は(予測のほうは外れてて)goldが出したところ、赤は予測のほうが外して出しちゃったやつ、となる。ちなみにdependency parsingの出力をclojureから出すだけならこんな感じで割と簡単にやることができる。
はー、ベタベタでよかった。別冊も引き続き読みたい。
よいのだけれども、朝からにやけてしまうので通勤の読書に向いているか分からなくなってきたw。
気晴らしに遊びにでも行かんとやってられん、ってことでまどマギの友達と一緒に前後編を一日で見てきました。
今日から後編が見れるようになったってことで結構混んでいた。。。さやかに妙に感情移入してしまっていた。
研修の移動で新幹線をよく利用することになりそうなのでex-icを使うようになったのだが、直前でも予約できてなかなか便利。ただ、スマホだと若干使い勝手が悪いなぁ。。。
あと、icocaをsmart icocaに進化させた。
笠原いいね。展開的に続きが気になってきた。
3巻以降を買った&貸してもらった。
今年の春の開発合宿でFOBOSを使ってお手軽単語分割器を書いた(デモはここに置いてる)のだけど、そのときには2値分類器を作っていた。そういえば多クラス分類器は作ってなかったなーと思ったので、これをベースにして作った。
といっても1 vs restでやるだけの簡単なやつです。でも、clojureだけで動くと何かと便利なので。libsvm形式とかに一回用意しないといけないとかは面倒だけど、このライブラリだと
(def training-example
[["A" ["hoge" 1] ["fuga" 1]]
["B" ["piyo" 1] ["nyan" 1]]
["A" ["hoge" 1]]])
みたいな形でデータとラベルをつっこめるような感じにした。
毎回気の抜けないストーリー展開だったので、見終わって非常に疲れた。。。色んな正義が交錯。
with-open
っぽくやりたいですよね、ってことで。
(require [clojure.java.io :as io])
(defmacro with-temp-file
[[varname & [content]] & body]
`(let [~varname (java.io.File/createTempFile "stevedore", ".tmp")]
(when-let [content# ~content]
(io/copy content# ~varname))
(let [rv# (do ~@body)]
(.delete ~varname)
rv#)))
;; 使い方
(with-temp-file [file-obj (str (repeat 100000 "content"))]
(.length file-obj))
clojarsとかに入っていなかった場合などなど。ここではJavaのハイパフォーマンスなコレクションのライブラリであるTroveのjarをleinで追加したい場合を考える。以下のリポジトリを使う。
project.clj
にこんな感じで記述する。
(defproject seq-dep "0.1.0-SNAPSHOT"
:description "FIXME: write description"
:url "http://example.com/FIXME"
:license {:name "Eclipse Public License"
:url "http://www.eclipse.org/legal/epl-v10.html"}
:dependencies [[org.clojure/clojure "1.4.0"]
[fobos_clj "0.0.2"]
[gnu/trove "1.0"]]
:plugins [[lein-swank "1.4.4"]
[lein-localrepo "0.4.1"]]
:java-source-paths ["src/java/"]
:main seq-dep.core)
これでいい感じにjarを配置してくれる。
% lein localrepo install src/java/lib/trove.jar gnu/trove 1.0
- 今年度も下期に突入
- 10月はやたらと研修があって、何回も東京に行かないといけない
- 京阪奈はこういうときに少しあれだ
台風がきていて外に出れねーと思っていて気がついたらアカウントを作っていた。
例えばこの辺をclojureから触りたいなーって思ったとしよう。こいつはjarで固められていないので、自分でどうにかしないといけない。そのやり方とかがちょっと分からなくなったのでメモしておく。
まず、project.cljを用意する。java-source-paths
とかをきちんと書いてやる。
(defproject hoge "0.1.0-SNAPSHOT"
:description "FIXME: write description"
:url "http://example.com/FIXME"
:license {:name "Eclipse Public License"
:url "http://www.eclipse.org/legal/epl-v10.html"}
:dependencies [[org.clojure/clojure "1.4.0"]
[log4j/log4j "1.2.16"]
[commons-primitives/commons-primitives "1.0"]
[org.yaml/snakeyaml "1.5"]
[net.htmlparser.jericho/jericho-html "3.1"]]
:java-source-paths ["edu/"])
(cljファイルではなく)javaファイルをコンパイルする。若干警告が出てるけど、気にしない。
% lein javac
Compiling 95 source files to /Users/yasuhisa/Desktop/umass-nlp/src/main/java/hoge/target/classes
注:入力ファイルの操作のうち、未チェックまたは安全ではないものがあります。
注:詳細については、-Xlint:unchecked オプションを指定して再コンパイルしてください。
このディレクトリで
% pwd
/Users/yasuhisa/Desktop/umass-nlp/src/main/java/hoge/target/classes
こういう感じのクラスパスを付けてあげれば動く。これでとりあえずjarが提供されていないようなものについても触れるようになったのでちょっと安心である。
% java -classpath /Users/yasuhisa/.m2/repository/log4j/log4j/1.2.16/log4j-1.2.16.jar:/Users/yasuhisa/.m2/repository/commons-primitives/commons-primitives/1.0/commons-primitives-1.0.jar:. edu.umass.nlp.examples.HMMTest
つぎはぎになっていた付近をきちんとgitに追加していく簡単ではないお仕事。「あー、あのコミットに追加しそこねた!!」ってやつがあったときに初めてgit rebaseを使った。ここが分かりやすかった。
基本的には書き換えたいコミットの一つ前に戻ってgit commit --amend
、終わったらgit rebase --continue
していけばよい。ミスったらgit rebase --abort
で戻れます。
rebaseするときにとりあえずstashで退避しておいて、戻したらconflictってことがときどきある。そのときはファイルを選択してcheckout、みたいなことができる。
git stash list
で今あるスタッシュのリストを見て、具体的なファイルの変更点が知りたかったら
git show stash@{0}:test/PivotGenerativeModel/test/util.clj
で見ればよく、戻したかったらこんな感じで戻せる。
git checkout stash@{0} test/PivotGenerativeModel/test/util.clj
例えばfile.txt
っていうファイルがあったときに、行毎にシャッフルしてから同じfile.txt
にまたそれを書きたい。nkf --overwrite
みたいなことがしたい。リダイレクトだとそういうことできないのかと思って中間ファイルを作っていたけど、ちゃんとありました。
% echo hoge fuga piyo > test.txt
% cat test.txt
hoge fuga piyo
% echo xxxxx >! test.txt
% cat test.txt
xxxxx
普段ならそんなことしないんだが、会社的な都合でファイルの命名規則が決まっていたりする場合があって、そういうとき用に。以下で設定ができる。
git config --global core.quotepath false