2010年11月17日水曜日

クライミングシューズの臭い対策

半年ほど前にTeam 5.10を購入したのだけど、少しすると臭いが気になるようになってきた。Team 5.10はライニング(内張り)があるタイプのシューズで、どうもこのライニングが臭くなるらしい。ということで、靴用の消臭剤を購入することにした。ただ単に臭いを消すだけだと意味がないと思い、除菌もできるグランズレメディ(Gran's Remedy)を選択。周りの評判もよかったので。

グランズレメディはパウダータイプの除菌消臭剤なので、付属のスプーンで靴の中全体に散布する必要がある。スリッパタイプだと若干面倒だけど、その効果はとても高く、持続もするので毎日やる必要はない。説明書きによると最初の1週間、毎日使用すればその後半年は効果が持続するとのことだけど、さすがに素足で履くクライミングシューズの場合はそうはいかなかった。自分の経験では、2週間に1回程度使用する方が費用対効果が高いように思う。

グランズレメディのおかげで臭いの発生は抑えることができたのだけど、シューズが乾きにくい梅雨と大量に汗をかく夏が終わるころには、乾かした後(臭い対策の基本はしっかり乾かすこと)でもライニングがヌメヌメしてきて履くのが気持ち悪くなってきた。ということで、シャンクによくないとは思いながらも、どうせ柔らかい靴だからと洗うことにした。

インソールとアウターソールの間に挟まれているシャンク(ミッドソール)は、シューズの剛性に大きな影響を与えるパーツで、一般的にパルプまたは樹脂といった材質でできている。パルプは濡れると柔らかくなり、シューズの剛性が落ちるため洗うのはよくないと言われている。Team 5.10のシャンクが何でできているかは知らないけど、実際にやってみたところ特に影響はなかった柔らかくなってしまったようだ。洗う前にすでによれていたので気付かなかった。ライニングはきれいになり、ヌメヌメ感は完全になくなった。とは言え、アッパーにもダメージを与えるので、洗うのは最終手段と考えておいた方がいい気がする。

ということで、他の商品と比べてみた訳ではないのだけど、除菌消臭剤はとりあえずグランズレメディにしておけばいいと思った。ちなみに、サイズが2種類あるけどミニボトルの方はかなり割高だと思う。

参考

2010年8月30日月曜日

クライミングのための懸垂(チンニング)

クライミングのためのトレーニングとしては比較的行いやすい懸垂について、改めて調べたり考えたりしてみた。

懸垂やロックオフはクライミングにおいて基本的な動作なので、ウェイトトレーニングとして懸垂を行うのは間違っていない。ただし、初級者は登るのが一番のトレーニングになるので、時間が確保できるなら登ることを優先するべき。また、中級者以上では指の強さがより重要になってくるということもあり、鍛える部位の優先順位をよく考える必要がある。

最大筋力と筋持久力とでは、まず最大筋力の強化を優先させるべきとされている。最大筋力が向上すれば、それまで限界だったムーブが少し力を抜いて登れるようになれるわけだから、持久力も向上したことになる(LT値が高まり乳酸の発生を遅らせることができる)。一方、筋持久力がいくらあっても、最大筋力が足りず不可能なムーブがひとつでもあればその課題/ルートは登れない。ということで、ここでは最大筋力を高めるためのトレーニングを前提とする。

いわゆる普通の懸垂

クライミングの特性を考えた場合、とりあえず負荷は自重で、無理な場合は椅子やゴムチューブに片足を置いたりして軽減すればいい。筋肥大を目的としたウェイトトレーニングの原則から1セットの回数は8~12回、セット数は3~5セットで、各セット間のインターバルは1~2分程度に設定する。

(追記)筋肉は同じ刺激が長期間続くとそれに適応してしまうので、停滞期(プラトー)に入り回数が伸びなくなってきたら、セット数やインターバルの長さを変えたり、バリエーションや片手ロックオフに移行するなど変化をつける必要がある。

フィンガーボードなどで指も同時に鍛えようとするのはやめたほうがいい。ひとつのトレーニングで同時に指にも適切な負荷を与えるのは不可能なため。指は指に焦点を当てた別のトレーニングをするべき(デッドハングによる指のトレーニング)。

バリエーション

手の幅を広くしたり狭くしたりすることで、普通の懸垂とは異なる筋肉を使うことができる。また、引っ掛けたロープなどを利用し、左右で段差をつけることで片手への負荷を増やすことができる。実際のクライミングでは、自分の肩幅だったり、両手の高さが揃っているホールドはまれなので、ウェイトトレーニングにおける特異性の原則にも適っていると思う。

最大筋力の向上は筋肥大によってだけではなく、筋繊維の動員率を上げることによっても達成される。その場合は回数を5回未満に設定し、その回数で限界になる程度のウェイトを装着して行う。インターバルはクレアチンリン酸が再合成されるのを待つ必要があるため3〜5分程度。筋動員率向上のためのトレーニングは、神経系の適応によってより多くの筋繊維を動員しようというもので、今ある筋肉量で筋力アップさせようということだから、いずれはどこかで頭打ちになる。それ以上は筋肉を肥大させるしかない。

片手ロックオフ

両手での懸垂が強くなってきたら、体を引きつけた状態で固定する片手ロックオフのトレーニングも行ったほうがいい。これも筋動員率の向上を狙ったトレーニングだけど、片手ロックオフからのエキセントリック・コントラクション(ネガティブとも呼ばれる)には筋肥大の効果がある。詳しくは片手ロックオフ参照。

片手懸垂

片手懸垂の練習としては、上で挙げた片手ロックオフやネガティブ、反対の手で手首・肘・肩や鉄棒の支柱などをつかんで補助する方法がよく紹介されている。補助ありの場合、セットの後半は補助側の手も全力になってしまい、片手懸垂のための筋肉を鍛えているのか補助するための筋肉を鍛えているのかわからなくなってしまうことがある。これを避けるにはアーチャープルアップが適している。手幅は広めで真上ではなく左右どちらかに向かって懸垂を行う。一番上では補助側の手をバーから離し、手首周辺をバーの上に乗せて腕を伸ばす。再びバーをつかみ体を下ろしたら、次は先ほどとは逆の方向に向かい同じことを行う。

参考

2010年8月25日水曜日

iPod touchをなるべく安く買う方法

iPod touchをなんとか安く入手できないかと調べた時のまとめ。総合的に見て整備済製品が安いし無難な気がする。

個人輸入

円高の影響もあって海外通販ならかなり安くなるはず、なのだけどApple StoreやAmazonなどの信用できそうなサイトは海外への発送を行っていない。ということで、他の選択肢としては

  • 海外にいる知人に現地で購入し送ってもらう
  • 転送サービスを利用する
  • 海外発送に対応しているオンラインショップを利用する

などが考えられるけど、いずれの場合も送料と税金はかかる(ひょっとしたら関税はないかもしれないけど、消費税は必要)。

転送サービスは、まずその会社(または個人)の住所を発送先に指定して購入し、さらにそこから日本へ送ってもらうという仕組み。したがって、オンラインショップと同じ国にある転送サービスを探す必要があるのだけど、オンラインショップからは国内発送となるため、Apple StoreでもAmazonでも問題なく利用できる。手数料もそんなに高くないようだ。

個人輸入の場合は、本体価格とは別でかかる費用もあるため、トータルでどれだけ安くなるのか、またその差額がリスクに見合うかをよく勘案する必要があると思う。海外で購入した製品の保証については下記を参照。

海外に行くついでに買う(買ってきてもらう)

もし、自分または友人などに海外に行く予定があれば、免税店で買う(買ってきてもらう)こともできる。これは為替レートさえ気をつければ確実性も高く、注文してから受け取るまでヤキモキすることもないと思う。

ただし、これは個人輸入の場合も当てはまるのだけど、海外で購入した製品の保証がどうなるのかがはっきりしないので、サポートに電話で確認してから実行に移したほうがいいかもしれない。Apple 製品 1 年限定保証を見てみると、

海外でのサービスが利用可能な場合、Apple は Apple 製品および部品を、現地の基準に合致する同等の Apple 製品および部品によって修理または交換することがあります。

とあるので、大丈夫だとは思うのだけど。

ちなみに、各国での値段は

から国名を選んで調べることができる。

整備済製品

日本のApple Storeで買える整備済製品も在庫があればかなり安い。整備済製品は店頭商品、返品商品、初期不良品などをAppleがきちんと修理調整して1年保証をつけたもの。

Appleによると新品水準並みの品質とのことだけど、完全な新品というわけではなくて、Dockアダプタとクイックスタートガイドが同梱されなかったり(される場合もある)、パッケージが紙箱だったり(新品と同じプラスチックケースの場合もあるらしい)するので気になる人は止めておいたほうがいいかもしれない。自分も2台目は整備済製品を購入したのだけど、いまのところ特に問題は起きていない。購入金額が5000円以上なので送料は無料。

Amazon.co.jp

日本のAmazonでは基本的に5% OFFのようだけど、割引率の変動が激しいためこまめにチェックしたほうがいい。過去には11% OFFだったこともあり、安くなっているときなら有力な選択肢になると思う。送料は無料。

(追記)Apple Storeの整備済製品もそうなのだけど、新モデル発表後は旧モデルがさらに安くなる。Amazon.co.jpでは以前、17% OFFになっていたことがあった。

学生・教職員割引と政府系機関・公務員割引

Apple Storeの学生・教職員割引はiPodには適用されない。政府系機関・公務員割引は6%OFFになるなくなったらしい。

家電量販店

たいていの家電量販店ではApple製品はあまり安くなっておらず、ポイントもたいしてつかない。しかし、交渉次第では現金値引+ポイント率アップでわりと安く買うことができるらしい。いろいろ検索してみたところヤマダ電機がよさそうだ。また、Apple製品といえども開店/閉店セールでは安く売られることもあるようなので、タイミングが合えばそれもいいかもしれない。新モデル発表後の旧モデル在庫処分セールを狙うのもありだと思う。

自分が1台目を購入したときは、整備済製品の在庫がなく、また、家電量販店ではどうせ安くならないだろうという思い込みもあり、他店は調べずポイントカードを持っているヨドバシで買うことにした。ポイントが5%ついて、シリコンケースが同時購入で10%OFFに、充電しても30分ともたなくなったiPod nanoを下取りに出して¥-2000(固定)、さらになぜか¥1500のiTunesカードがついてきた。家電量販店では密かにお得なキャンペーンをやっていることもあるので、他の店と比較するときは注意が必要。下取りは状態がよく、それほど古くないモデルならソフマップ(買取上限額を検索できる)のほうが高く買い取ってくれると思う。

家電量販店での購入は場合によってはだいぶ安くなるようだけど、交通費と労力と時間に見合わなかったなんてことにならないように気をつけたい。

Yahoo!オークション

個人的には新品でも中古でもヤフオクはあまり安くないと感じている。

中古品

中古販売をしているオンラインショップも覗いてみたけど、価格自体も決して安くはないし、ほとんどのものは保証書が付いていないので、自分は高くても新品を買いたいと思ってしまう。ショップによる保証は付いていも期間が短い。また、前の所有者の使い方にもよるのだけどバッテリーの劣化も心配。

価格.com

(追記)なせか価格.comを書き忘れていた。だけど特に安くはない。

2010年8月22日日曜日

整備済製品のiPod touchを購入した

第4世代のiPod touchがまもなく発売されると言われているけど、自分が開発しているiPhoneアプリのテストでどうしても第3世代が必要になり、数週間前に整備済製品を購入した。

整備済製品とは、

店頭商品、返品商品、初期不良品などを修理調整し、新品水準並みの品質を確認したアップル認定製品です。新製品同様、1年間の特別保証書をお付けしております。

といったもので、値段もだいぶ安くなっている。たとえば、自分が購入した32GBは¥29,800が¥24,800になっていた(送料無料)。Apple製品はあまり安くならないので、完全な新品ではないというのが気にならなければかなりいいと思う。また、新品同様1年保証が付くのも大きい。ただし、常に在庫があるわけではないので、タイミングが合わなければ買うことはできない。

Dockアダプタ、クイックスタートガイドが同梱されていないとのことだったけど、自分の場合は箱の中に入っていた。ということで、新品との違いはパッケージだけのようで、プラスチックのケースではなく紙箱でできた簡易的なものだった。本体はもちろん問題なく使えている。タイミングが合えば第4世代も整備済製品を買うかもしれない。

2010年7月21日水曜日

HP 2133のUbuntuを10.04 LTSにアップグレードした

Ubuntu 10.04 LTSがリリースされてから数ヶ月、もう細かいバグなども修正されているだろうということで、HP 2133にインストールしてある8.04 LTSからアップグレードしてみた。

まず最初にLiveCDで大きな問題がないか確認することにした。HP 2133にはCD/DVDドライブがないのだけど、SDカードスロットがあるのでSDカードからブートした。CDイメージはUbuntu Desktop 日本語 Remix CDをダウンロードして、UNetbootinを使って書き込んだ。

LiveCDで起動してみて、GUIや無線LANが正常に動作することが確認できたのでアップグレード開始。Ubuntu 10.04 LTSへアップグレードを行うには - Ubuntu Japanese Wikiに書いてある通りに進めてつつがなく完了。再起動後、[システム]-[システム管理]-[日本語環境セットアップ・ヘルパ]から日本語環境を整えた。

パッケージの整理

パッケージのバージョンが大幅に上がっているため、checkinstallでインストールしたものを入れ替えたり、古いバージョンを削除したりするのに意外に時間がかかった。

  • Ubuntu標準のIMEがIBusに変わっていたのでscim関連はすべて削除。emacsのキーバインディングと衝突しないように、Ctrl+Spaceは切り替えのショートカットから外した。
  • 新しくemacs23がインストールされていたので、emacs22をアンインストールした。emacs23ではUnicodeの曖昧な文字幅問題は解決しているため、.emacsからutf-translate-cjk-set-unicode-rangeを削除(UTF-8環境と曖昧な文字幅)。また、w3m-load.elがなくなっているので、emacs-w3mが起動できなくなっている。
  • Rubyはruby1.9.1-fullとrubygems1.9.1を新しくインストール。rubygems1.8は
    % gem install rubygems-update
    % update_rubygems
    
    してあったのだけど、パッケージのバージョンに戻すため/usr/local/lib/ruby/1.8/以下を削除した。
  • openChromeがデフォルトになった。パッケージもインストールされているので、アップグレード前にソースからインストールしたほうmake uninstallして、パッケージを再インストールしておいた。
    % sudo apt-get install --reinstall xserver-xorg-video-openchrome
    ちなみに、いつからかxorg.confがなくてもXが動くようになっている。
  • [システム]-[システム管理]-[パッケージの整理]で不要なファイルやパッケージの削除
  • Ubuntuのアップグレードや、上記のパッケージの整理で自動的に削除されたパッケージの設定ファイルが残ってしまっているのでまとめて削除する。
    % aptitude search "~c" -F "%p" | sudo xargs aptitude purge -y
  • PulseAudioはまた削除しようとしたのだけど、ubuntu-desktopも道連れにされてしまうのでやめた。自動起動を止めようといろいろと試してはみたのだけど、ちょっと設定ファイルをいじったくらいでは止められないようだ。

CPUのクロック周波数の管理

クロック周波数の変更はカーネルのサブシステムであるCPUFreqによって行われる。8.04ではブートオプションを追加しないと動作しなかったのだけど、10.04では何もしなくても動くようになっている。

8.04のときはカーネルの更新があるたびにGRUBのmenu.lstを変更する必要があったのだけど、すっかり忘れていて、常に最大周波数で使用していたことになる。HP 2133は熱が原因での故障が多発しているようなので、CPUFreqが無効になっていたのは危険だったかも。といっても、今までファンが全開で回ることもあまりなかったし、sensorsコマンドで表示される温度もそこまで高くないので、ダメージはなかったはず。と信じたい。

デフォルトのままでも負荷に応じてクロックの上げ下げが自動的に行われるけど、CPU周波数の計測モニタアプレットをパネルに追加しておくと簡単に制御できて便利。cpufrequtilsパッケージもインストールしたのだけど、cpufreq-infoの結果がおかしいときがあったので削除してしまった。

不必要なサービスの停止

自分にとって必要ないサービスをできる限り停止する。update-rc.dでやると起動順位を元に戻せなくなってしまうのでsysv-rc-confを使う。

% sudo apt-get install sysv-rc-conf
% hash sysv-rc-conf
% sudo sysv-rc-conf

のようにして、以下のサービスを停止した。

  • bluetooth
  • cups
  • dns-clean
  • pppd-dns
  • rsync
  • saned
  • speech-dispatcher

また、Ubuntuは従来のinitデーモンから新しいイベントベースのUpstartへ切り替えを行っていて、sysv-rc-confではON/OFFの制御ができないものがいくつかある。そういったサービスは、/etc/init/以下にある各設定ファイルをエディタで開き、start on ...の行をコメントアウトして自動起動を停止した。

  • avahi-daemon
  • atd
  • nbmd
  • smbd

さらに、[システム]-[設定]-[自動起動するアプリ]から確実に必要なさそうなもののチェックをはずしておく。

  • Bluetooth マネージャー
  • Evolution Alarm Notifier
  • GNOME Login Sound
  • Ubuntu One
  • パーソナルファイル共有
  • ユーザ・フォルダの更新
  • リモート・デスクトップ
  • 印刷キューのアプレット
  • 視覚支援

悪名高いTrackerはデフォルトでは何もしていないようだ。だけど、それはそれで無駄なので止めることにした。/etc/xdg/autostart/にあるtrackerd.desktoptracker-applet.desktopをエディタで開いてX-GNOME-Autostart-enabledfalseに変更。

動画再生

動画の再生が絶望的に重くなっていたけど、Totemは

% gstreamer-properties

でビデオドライバをXvにしたら解決。MPlayerもビデオドライバを指定することで以前と同じように再生できるようになった。

Flashはコマ落ちしやすくかなり厳しいのだけど、以前もこんな感じだったような気がしなくもない。Flash PlayerがXv対応になれば解決すると思うのだけど、Adobeにその気はなさそう(コメント欄でいろいろつっこまれていて、やろうと思えばできるらしいが)。また、Gnashも試したのだけどエラーが多すぎて実用には耐えなかった。

2010年7月16日金曜日

Google Chrome Linux版で日本語入力がやたらと遅い

テキストエリアでの日本語入力が遅い場合は、スペルチェックが有効になっているのが原因かもしれない。[オプション]-[高度な設定]-[言語]からスペルチェックを無効にすることで自分の場合は解決した。速いPCならまったく問題ないんだろうけど、HP 2133ではこれをやらないとどうにもならない。

2010年7月12日月曜日

クライミングのコソ練グッズ

CLIMBING joy No.4コソ練グッズカタログという特集があって、これがなかなか面白かったのでリンクだけまとめてみた。

プライベートウォール

トレーニングボード

フィンガーボードは各メーカーからいろいろ出ているので割愛。

トレーニンググッズ

早まって「どこでもマッチョ」を注文する前に、同じような仕組みでフィンガーボードが設置できることを知っておくべき。

ドア枠の強度に不安があるなら、チンニングスタンド+ロックリングスという選択肢もある。安いものだと揺れやすく、高いものは大きくて重い。

(追記)「どこでもマッチョ」と中身は同じだと思うのだけど、「アイアンジム」という商品を見つけた。こちらの方が断然安い。

2010年6月10日木曜日

RubyのMechanizeで文字化けするページがある件について

Mechanizeがときどき日本語のページで文字化けするので、原因と解決方法を調べてみた。確認したバージョンは次の通り。

  • Ruby 1.9.1-p378と1.8.6-p111(Ubuntuのパッケージ)
  • Mechanize 1.0.0
  • Nokogiri 1.4.2
  • libxml2 2.6.31(Ubuntuのパッケージ)

エンコーディングの扱い

Mechanizeの内部エンコーディングはUTF-8に固定されていて、ドキュメントのエンコーディングが何であれUTF-8に変換される。これはMechanizeがHTMLパーサに使っているNokogiriの仕様であり、Nokogiriが依存しているlibxml2の仕様でもある。そういう事情でMechanizeから取り出した文字列はすべてUTF-8になっている。Ruby 1.9だとString#encodingEncoding::UTF_8にセットされる。

上述したように、MechanizeはHTMLのパースをNokogiriで行っていて、具体的にはNokogiri::HTML.parseが呼ばれるようになっている。Nokogiri::HTML.parseは第3引数にHTMLのエンコーディングを受け取り、そのエンコーディングからUTF-8に変換してパースを行う。デフォルト値はnilなのだけど、その場合はmetaタグのcharsetから自動認識する。これらコード変換も含めたパースを実際に行っているのはlibxml2で、NokogiriはhtmlReadMemory()関数またはhtmlReadIO()関数を呼んでいるだけだったりする。

MechanizeはPage#initializeの中で、Nokogiri::HTML.parseの第3引数に渡すエンコーディングを以下の順序で決定している。

  1. metaタグでcharsetが指定されている場合はnil(Nokogiriに任せる)
  2. HTTPヘッダでcharsetが指定されていたらその値
  3. 上記以外の場合はNKF.guessで返ってきたエンコーディング

文字化けの原因

libxml2で起きたパースエラーはNokogiri::HTML::Document#errorsNokogiri::XML::SyntaxErrorオブジェクトの配列として格納される。また、Mechanize::Page#parserがそのページのパース結果であるNokogiri::HTML::Documentオブジェクトを返すので、

p mechanize.page.parser.errors

とすればパースエラーが表示される。そうすると、文字化けが起きるときは必ずInput is not proper UTF-8, indicate encoding !というエラーが含まれていることがわかった。libxml2のドキュメントによると、このエラーが起きるのはエンコーディングの指定がなく、且つドキュメントのエンコーディングがUTF-8でもUTF-16でもない場合とのこと。

metaタグのcharsetは正しく指定されていると思うのだけど、もう一度うまくいくページと、うまくいかないページを見比べてみた。よく見ると、エラーになるページはtitleタグよりあとでcharsetが指定されている。つまり、titleタグはエンコーディング指定なしのまま、デフォルトのUTF-8/UTF-16ハンドラで処理が進み、UTF-8の妥当性チェックでエラーが起きたということのようだ。

正攻法では解決しない

結局はMechanizeからNokogiriに正しいエンコーディングを渡すことができればうまくいくはずだけど、Mechanizeが用意しているのは、パース終了後に改めてMechanize::Page#encoding=でエンコーディングを指定して、もう一度パースをやり直すという方法だけ。しかも、これは上で述べたケースでは全然うまくいかない。

次のようにEUC-JPのHTMLドキュメントをリクエストして、libxml2でUTF-8の妥当性エラーが起きたとする。

mechanize.get("http://example.com/EUC-JP.html")

エラーが起きてもNokogiri::DocumentのエンコーディングはEUC-JPにセットされる。

mechanize.page.parser.encoding # => "EUC-JP"

その後、Page#encoding=で改めてエンコーディングを指定するのだけど、

mechanize.page.encoding = "EUC-JP" # 何も起きない

引数で与えられたエンコーディングとPage#parserのエンコーディングが等しい場合は何もしないようになっているので、パースのやり直しは起きない。ということで、このケースだとMechanize::Page#encoding=はまったく役に立たない。

力押しで解決

Mechanizeには、pre_connect_hookspost_connect_hooksというメソッドがあって、それぞれリクエスト前とリクエスト後に任意の処理を差し込めるようになっている。これを利用して、Nokogiriがパースする前にHTTPヘッダとmetaタグのcharset、XML宣言のencoding、HTML自体のエンコーディングをUTF-8に変えてしまうことにする。

リクエスト後なのでMechanize#post_connect_hooksを使うのだけど、中身はただのProcオブジェクトの配列なので、Procオブジェクトを作って追加するだけでいい。

def fix_charset_hook(more_nkf_options = "")
  lambda do |params|
    if params[:response]["Content-Type"]
      params[:response]["Content-Type"].sub!(/charset\s*=\s*[^;\s]+/i, "charset=UTF-8")
    end

    response_body = NKF.nkf("-w -m0 #{more_nkf_options}", params[:response_body])
    if m = response_body.match(/<\?xml[^>]+encoding\s*=\s*["']?([^>"'\s]+)[^>]*\?>/i)
      response_body[Range.new(m.begin(1), m.end(1) - 1)] = "UTF-8"
    end
    if m = response_body.match(/<meta[^>]+charset\s*=\s*["']?([^>"'\s;\/]+)[^>]*>/i)
      response_body[Range.new(m.begin(1), m.end(1) - 1)] = "UTF-8"
    end
    params[:response_body] = response_body
  end
end

mechanize.post_connect_hooks << fix_charset_hook

これでほとんどの場合はうまくいくけど、入力コードはNKFが推測するので間違うこともある。そういうときは引数でNKFに与える入力コードを指定すればいい。たとえばCP932だと次のようにする。

mechanize.post_connect_hooks[0] = fix_charset_hook("--ic=CP932")

metaタグなどから入力コードを決定することも考えたのだけど、実際とは異なるエンコーディングが間違って指定されているページもあるので、これで十分じゃないかと思う。

2010年5月28日金曜日

GENIA Taggerで英語の形態素解析

大量の英文を形態素解析することになった。日本語ならMeCabを使ったことがあるのだけど、英語の形態素解析器についてはまったく知らないので調べてみた。ちなみに、形態素解析器は英語でPOS(Part of Speech) Taggerというらしい。Part of Speechは品詞のこと。

英語の形態素解析器がたくさんあるのはすぐわかったのだけど、自分が必要としているのは以下の2点。

  1. 各単語の原型(基本形)が取得できるもの
  2. 大量の英文を処理する必要があるため高速なもの。CまたはC++で書かれているものが望ましい。

最初は簡単に見つかると思っていたのだけど、意外にも原型(基本形)を返さないものが多く、さらに速度も考慮に入れると残ったのはGENIA Taggerだけだった。

GENIA Taggerは生物医学の文章に最適化されていて、ProteinやDNA, RNAなどがNamed Entityタグ(NEtag)として認識されるようになっている。自分が形態素解析したいのは一般的な英文で、誤認識することもあるけど、今回の用途ではそれほど問題にならないので気にしないことにする。

いざmakeしてみると、実行ファイルだけが生成されライブラリは提供されていない。さらにその実行ファイルも起動に時間がかかる。ということで、Rubyでサーバーを書くことにした。

require "webrick"

genia = IO.popen("./geniatagger", "r+", :err => "/dev/null")
class << genia
  def readlines_until_empty_line
    result = []
    while line = gets
      break if line == "\n"
      result << line
    end
    result
  end
end

server = WEBrick::GenericServer.new(:Port => 7070)
Signal.trap(:INT) do
  server.shutdown
  genia.close
end
mutex = Mutex.new
server.start do |socket|
  while line = socket.gets
    result = mutex.synchronize do
      genia.print line
      genia.readlines_until_empty_line
    end.join.gsub("\n", " ")
    socket.print result, "\n"
  end
end

WEBrick::GenericServerを利用すると簡単にサーバーを書くことができる。GENIA Taggerは解析結果を複数行で返すのだけど、これをサーバーがそのままクライアントに返すようにすると、TCPでのやりとりの回数が増えて遅くなってしまう。回避策として、改行をスペースに置換して一度に返すようにした(解析結果にスペースが出現することはないのでエスケープも必要ない)。

テスト用のクライアント。

require "socket"

TCPSocket.open("localhost", 7070) do |socket|
  socket.puts ARGV[0]
  puts socket.gets.gsub(" ", "\n").chomp
end

POStagの対応表はPenn Treebank P.O.S. Tagsが見やすい。また、chunktagについてはIOB2フォーマットによるトークンへのタグ付与がわかりやすいと思う。

2010年5月18日火曜日

Ubuntuでゴミ箱を空にできないときは

原因はまったくわからないのだけど、ゴミ箱を空にできなくなることが時々ある。ゴミ箱の中のファイルは~/.local/share/Trash/files/に置かれているので、

% rm -rf ~/.local/share/Trash/files/*
% rm ~/.local/share/Trash/info/*

などとすれば、強制的に空にすることができる。~/.local/share/Trash/info/には、削除前のパスや削除日時などの情報が記録されているので一緒に消してしまえばいい。

2010年4月23日金曜日

iPhoneアプリの売上を受け取る口座について

iPhoneアプリの売上はシティバンクで受け取るのが常識らしいのだけど、手数料のことなどまったく調べていなかったため、何も知らずに三井住友銀行の口座を登録していた。売上はAppleから海外送金され、日本の銀行で受け取ると被仕向送金手数料やら円為替取扱手数料(日本円を指定してある場合)などで数千円引かれてしまうという話だった。さらに、場合によっては送金を中継した銀行からも手数料を取られるという。

手数料のことは送金される直前に知ったのだけど、Bank Infoの変更は間に合わず三井住友銀行に振り込まれてしまった。しかし、振り込まれた金額をAppleから送られてきたInvoiceと照らし合わせてみても、特に手数料は引かれていなかった。

月末になると、三井住友銀行から外国送金到着のご案内という書類が送られてきた。確認してみると手数料負担がご依頼人になっていた。ひょっとしたらAppleの方針が変わったのかもしれない。もしそうならわざわざシティバンクの口座を作る必要もなかったけど、今後一切手数料がかからないという保証もないので翌月からはシティバンクで受け取っている。

ちなみに、外国送金到着のご案内によると、依頼銀行はCITIBANK EUROPE PLC 1で、取組銀行がCITIBANK JAPAN LTD.になっていた。

2010年4月19日月曜日

次回起動時に強制的にファイルシステムのチェックを行う

% sudo touch /forcefsck

などとして、/forcefsckというファイルを作成しておけば、次にシステムを起動したときに自動的にファイルシステムのチェック(fsck)が行われる。ちなみに、これはルートパーティションに対しても実行され、ログは/var/log/fsck/に保存される。

shutdown -Fで同じ効果があるという情報もあるけど、Ubuntu 8.04では-Fオプションが存在しない。

2010年3月31日水曜日

クライミングと体幹

(追記)再度全面的に書き直し

伝統的なウェイトトレーニングをしていれば体幹トレーニングは必要ない、という話をよく聞くようになってきたので、体幹トレーニングの効果と競技パフォーマンスへの影響について調べてみた。なお、この記事で引用している論文のフルテキストはすべてGoogle Scholarで見つけた。

まずは、エクササイズ中の体幹の筋活動を調べたシステマティックレビューを読んでみた。ウェブ検索では元になったと思われる卒業論文も見つかり、結論を含めいろいろ異なるので注意が必要。

Martuscello, J. M., Nuzzo, J. L., Ashley, C. D., Campbell, B.I., Orriola, J. J., Mayer, J. M. (2013). "Systematic review of core muscle activity during physical fitness exercises." J Strength Cond Res 27:1684-1698.

  • エクササイズを五つのカテゴリに分類し、それぞれのエクササイズにおける腰多裂筋、腹横筋、腰方形筋の筋電図活動から、最も体幹を刺激するエクササイズを調べた
  • 個々の研究のmethodological qualityはlowからmoderateで、バイアスがかかっている危険性が高い
  • とは言え、現在得られているエビデンスは、腰多裂筋の筋電図活動が最大になるのはフリーウェイト(デッドリフト、ランジ、スクワット)ということを示している
  • 腹横筋については、他のエクササイズと比べて明らかに効果的なエクササイズはないと考えられる
  • 腰方形筋は条件に合致する論文が見つからなかった
  • 体幹に特化したトレーニングよりもスクワットやデッドリフトなどの多関節フリーウェイトエクササイズをやったほうがいい
  • 得られた知見は、床での体幹トレーニングにball/deviceを足しても、腰多裂筋と腹横筋の筋電図活動は増えないことも示している

しかし、デッドリフトもスクワットもクライミングには重要ではないと信じられている下半身の筋肉も鍛えることになってしまう。筋肥大に伴う体重増加の影響を考えると、クライマーには単純に当てはめることはできないような気もする。クライミングと下半身の筋肉の関係について調べた論文は見つけられなかった。

続いて、トレーニング経験者を対象に体幹筋力、physical fitness and athletic performance、体幹トレーニングの効果の関係について調べたメタアナリシスの論文を読んでみた。

Prieske, O., Muehlbauer, T., Granacher, U. (2016). "The Role of Trunk Muscle Strength for Physical Fitness and Athletic Performance in Trained Individuals: A Systematic Review and Meta-Analysis." Sports Med 46:401-419.

  • 「体幹トレーニング」を、体幹筋を鍛えることを主目的とした特定のエクササイズを含むトレーニングプログラムと定義している
  • methodological qualityの平均値は、介入研究では低く、相関を調べた研究では適切な尺度がないため算出されていない
  • 得られた知見は、physical fitness and athletic performanceにおける体幹筋力の役割は小さいことを示している
  • 体幹トレーニングは体幹筋力を鍛えるのには有効だが、physical fitness and athletic performanceへの寄与はわずかだと思われる
  • 競技レベルとは関連がなかった

ということで、体幹トレーニングは必要ないかもしれない。しかし、体幹筋力の向上が転移しないようなphysical fitness and athletic performanceの指標を使っている可能性にも言及しているので、競技パフォーマンスは向上していてもそれを認知できていないだけかもしれない。実際に、競技に合わせた体幹トレーニングを実施した六つの研究で、競技パフォーマンスの指標のうち少なくとも一つが有意に向上したという報告もある[1]。

クライミングにおいては、体幹との関連を調べた論文が見つからなかったためなんとも言えない。

また、core stabilityは傷害防止との関わりも示されているそうで[1]、怪我をしないことはパフォーマンスに結びつく。

参考文献

  1. Reed, C. A., Ford, K. R.,Myer, G. D., Hewett, T. E. (2012). "The effects of isolated and integrated 'core stability' training on athletic performance measures: a systematic review." Sports Med 42:697-706.

2010年2月23日火曜日

Migemo + minibuf-isearchで起きるエラーの回避方法

EmacsでMigemominibuf-isearchを一緒に使っていると、

Invalid regexp: "Regular expression too big"

のようなエラーが出ることがあるのだけど、もう一度ゆっくり入力し直せば正常に動作するので、これまでだましだまし使ってきた。しかし、今日はこのエラーに対して急に我慢ならなくなり、解決方法を探したところ

(setq migemo-isearch-min-length 2)

または

(setq minibuf-isearch-use-migemo nil)

とすればいいらしいことがわかった。前者はMigemoのisearchを開始する文字数を2に指定してエラーを回避する(1文字目からだと正規表現が大きすぎる)。後者はそもそもminibuf-isearchでMigemoを使用しないようにする。

Ubuntuのパッケージだとmigemo-isearch-min-lengthに対応していないので、後者を採用してminibuf-isearchのときはMigemoをオフにするようにした。minibuf-isearchはsession.elと組み合わせてファイルを開くときに使うことがほとんどで、自分は日本語のファイル名を使うことがないので特に問題はない。

migemo-isearch-min-lengthを使う場合は最新版をCVSからインストールする必要がある。

参考

2010年1月28日木曜日

Rubyでブロックを受け取るArray#uniq, Array#uniq!

ブロックの評価結果にしたがって重複する要素を削除するArray#uniq_byが必要になった。提案はされたけど、Array#uniqがブロックを受け付けていないので、uniq_byを実装するよりもuniqがブロックを取るようにするべき、ということで却下されたようだ。

1.9.1でもブロックを受け取るuniqは実装されていなかったので自分でやってみた。sortsort_byの関係にならって、ブロックが二つの要素を取るようにしたのだけど、この場合は重複判定にHashを利用することはできない。オリジナルの実装と同じように、重複した要素は後ろにあるほうが削除されるようにした。

class Array
  def uniq_with_block!
    return uniq_without_block! unless block_given?

    size = self.size
    self.each_with_index do |a, i|
      (self.size - 1).downto(i + 1) do |j|
        self.delete_at(j) if yield a, self[j]
      end
    end
    self.size < size ? self : nil
  end
  alias_method :uniq_without_block!, :uniq!
  alias_method :uniq!, :uniq_with_block!

  def uniq_with_block(&block)
    if block_given?
      dup = self.dup
      dup.uniq_with_block!(&block)
      dup
    else
      uniq_without_block
    end
  end
  alias_method :uniq_without_block, :uniq
  alias_method :uniq, :uniq_with_block
end

テスト。

require "test/unit"

class UniqWithBlockTest < Test::Unit::TestCase
  def setup
    @block = lambda {|a,b| a.casecmp(b) == 0 }
  end

  def test_uniq_with_block
    assert_equal([], [].uniq(&@block))
    assert_equal(%w(a), %w(a).uniq(&@block))
    assert_equal(%w(a b), %w(a b).uniq(&@block))

    assert_equal(%w(a), %w(a A).uniq(&@block))
    assert_equal(%w(a B), %w(a B A b).uniq(&@block))

    a = %w(a B A a b c)
    b = a.dup
    assert_equal(%w(a B c), a.uniq(&@block))
    assert_equal(b, a)

    assert_equal(%w(a B A b c), %w(a B A a b c).uniq)
  end

  def test_uniq_bang_with_block
    ary = []
    assert_nil(ary.uniq!(&@block))
    assert_equal([], ary)

    ary = %w(a)
    assert_nil(ary.uniq!(&@block))
    assert_equal(%w(a), ary)

    ary = %w(a b)
    assert_nil(ary.uniq!(&@block))
    assert_equal(%w(a b), ary)

    ary = %w(a A)
    assert_same(ary, ary.uniq!(&@block))
    assert_equal(%w(a), ary)

    ary = %w(a B A b)
    assert_same(ary, ary.uniq!(&@block))
    assert_equal(%w(a B), ary)

    ary = %w(a B A a b c)
    assert_same(ary, ary.uniq!(&@block))
    assert_equal(%w(a B c), ary)

    assert_equal(%w(a B A b c), %w(a B A a b c).uniq!)
  end
end