2012年12月31日月曜日

極小カチでの保持力は指先の構造によるところが大きい

カチのサイズと指の力の大きさとの関連について研究した論文を読んでみた。フルテキストが見つからなかったのでAbstractのみ。

Bourne, R., Halaki, M., Vanwanseele, B., Clarke, J. (2011). "Measuring lifting forces in rock climbing: effect of hold size and fingertip structure." J Appl Biomech 27:40-46.

  • 15人のクライミング上級者を対象に、2.8mm, 4.3mm, 5.8mm, 7.3mm, 12.5mmのカチに片手でぶら下がったときの力の大きさ(床反力計で測定)と、指先の軟組織の寸法との関連を調査した
  • 2.8mm, 4.3mmでの力の大きさと、12.5mmでの力の大きさには、体重の影響を除いたとしても相関は認められなかったが(r < 0.1)、2.8mmでの力の大きさと指の先端から骨の先端までの長さには有意な正の相関があった(r = 0.65, p < 0.05)。他のサイズでは相関は見られなかった(r < 0.37)。
  • 筋力(大きなカチでの力の大きさ)から極小カチでの力の大きさを予見することはできないことが確かめられた
  • これは指先がより大きく変形し、ホールドと皮膚の接触面積が増えることで、発生する力も大きくなるということを示唆する

つまり、カチホールドに強いからといって極小カチにも強いとは限らない、ということになる。逆もまた然り。

(追記)ResearchGateでFiguresをクリックしていたら何故か全文読めた。12.5mm, 7.3mm, 5.8グループと4.3mm, 2.8mmグループは、グループ内では相関があったけどグループ間では相関がなかったそうだ。測定した接触面積との相関係数が書かれていないのだけど、接触面積が増えることで力が大きくなるという結論なので、接触面積との相関係数は示してほしかった。

2012年11月30日金曜日

iOSの起動画面とかスクリーンショットをImageMagickでトリミングする

起動画面 - iOS 6まで

起動画面にアプリのスクリーンショットを使う場合、iPadは仕様によりステータスバーの部分を取り除かなければならない。トリミングは-chopを使って次のようにすればできる。

$ convert -chop 0x20 Default-Landscape.png out/Default-Landscape.png
$ convert -chop 0x20 Default-Portrait.png out/Default-Portrait.png

Retina Displayの場合。

$ convert -chop 0x40 Default-Landscape@2x.png out/Default-Landscape@2x.png
$ convert -chop 0x40 Default-Portrait@2x.png out/Default-Portrait@2x.png

iPhone/iPod touch用の画像はステータスバーを含んでいてもよく、起動時にデバイスのステータスバーで上書きされるので表示されることもない。でも何となく気持ち悪いので、自分は黒で塗りつぶすことにしている。スマートなやり方がわからなかったのだけど、-chop-spliceを組み合わせて次のようにすればできる。

$ convert -chop 0x20 -background black -splice 0x20 Default.png out/Default.png
$ convert -chop 0x40 -background black -splice 0x40 Default@2x.png out/Default@2x.png
$ convert -chop 0x40 -background black -splice 0x40 Default-568h@2x.png out/Default-568h@2x.png

起動画面 - iOS 7

(追記)iOS 7以降ではステータスバーの領域を含んだ画像が必要だけど、本物のステータスバーは半透明なので適当な色で塗りつぶしておく必要がある。

$ convert -chop 0x40 -background "rgb(248,248,248)" -splice 0x40 Default-iOS7@2x.png out/Default-iOS7@2x.png
$ convert -chop 0x40 -background "rgb(248,248,248)" -splice 0x40 Default-iOS7-568h@2x.png out/Default-iOS7-568h@2x.png
$ convert -chop 0x20 -background "rgb(248,248,248)" -splice 0x20 Default-iOS7-Portrait.png out/Default-iOS7-Portrait.png
$ convert -chop 0x40 -background "rgb(248,248,248)" -splice 0x40 Default-iOS7-Portrait@2x.png out/Default-iOS7-Portrait@2x.png

(追記)iPadでUISplitViewControllerを使っている場合、Landscapeのときはボーダーを残す必要があるので-drawを使い座標を指定して塗りつぶした。

$ convert -fill "rgb(248,248,248)" -draw "rectangle 0,0,319,63; rectangle 321,0,1023,63" Default-iOS7-Landscape.png out/Default-iOS7-Landscape.png
$ convert -fill "rgb(248,248,248)" -draw "rectangle 0,0,639,127; rectangle 642,0,2047,127" Default-iOS7-Landscape@2x.png out/Default-iOS7-Landscape@2x.png

起動画面 - iOS 8以降

(追記)iPhone 6とiPhone 6 Plus。

$ convert -chop 0x40 -background "rgb(248,248,248)" -splice 0x40 -strip Default-667h\@2x.png out/Default-667h\@2x.png
$ convert -chop 0x60 -background "rgb(248,248,248)" -splice 0x60 -strip Default-736h\@3x.png out/Default-736h\@3x.png

(追記)iOS 8ではUISplitViewControllerのボーダーが1ピクセルになっている。

$ convert -fill "rgb(248,248,248)" -draw "rectangle 0,0,639,127; rectangle 641,0,2047,127" Default-iOS7-Landscape@2x.png out/Default-iOS7-Landscape\@2x.png

AppStoreのスクリーンショット

AppStoreで表示されるスクリーンショットは、ステータスバーを含んでも含まなくてもどちらでもいい。自分はシミュレータでスクリーンショットを撮っているのだけど、ユーザからするとシミュレータのステータスバーは不自然なので取り除くことにしている。ユニバーサルアプリで英語にも対応すると数が多くなってしまうためRubyで処理している。

(追記)iPhone 6とiPhone 6 Plusではステータスバーを含む必要がある。

require "open3"

options = {}
["768x1024", "1024x768"].each do |size|
  options[size] = ["-chop", "0x20"]
end
["1536x2048", "2048x1536", "640x960", "960x640", "640x1136", "1136x640"].each do |size|
  options[size] = ["-chop", "0x40"]
end
["750x1334", "1334x750"].each do |size|
  options[size] = []
end
["1242x2208", "2208x1242"].each do |size|
  options[size] = []
end

Dir.mkdir("out")
Dir["*.png"].each do |input|
  output = File.join("out", File.basename(input, File.extname(input)) + ".jpg")
  size = Open3.capture2("identify", "-format", "%wx%h", input)[0]
  system("convert", *options.fetch(size), "-strip", "-quality", "70", input, output)
end

カレントディレクトリにあるPNGファイルに対して、サイズを自動的に判断してトリミングし、outという名前のサブディレクトリに保存する。ディレクトリがすでに存在していたら何もしない。画質はある程度落としてもサイズを減らしたいので、-quality 70を指定してJPEGに変換している。

2012年10月14日日曜日

HomebrewでCocoa Emacs 24.2をインストールした

(追記)インラインパッチが取り込まれたので、現時点で24.3をインストールするには、ただ単にbrew install --cocoa --japanese emacsとすればいいようだ(リンク先では--srgb--with-gnutlsも指定している)。起動時のredo+.elのエラーは最新版に更新することで解決した。

HomebrewでインストールしたCocoa Emacsを24.2にアップデートした。23.3のときと同じくFormulaを書き換えて、インラインパッチ(IMEパッチ)を当てた。ポップアップで落ちるバグは直っていないため、今回もCocoa Emacs が落ちるのパッチを使わせて頂いた。

ちなみに、インラインパッチはCocoa Emacsで日本語を使うなら、何も考えずにとりあえず当てておくべきメジャーなパッチ。また、フルスクリーンパッチ(M-x ns-toggle-fullscreenでフルスクリーンになる)はすでに含まれているので自分で当てる必要はない。

Formulaは次のように変更した。/usr/local/はHomebrewのローカルリポジトリになっているので、/usr/local/git diffをした結果をそのまま載せている。

(2013/2/11 追記)パッチがリジェクトされてしまうのを修正した。

diff --git a/Library/Formula/emacs.rb b/Library/Formula/emacs.rb
index 3e0cd5b..13f4e12 100644
--- a/Library/Formula/emacs.rb
+++ b/Library/Formula/emacs.rb
@@ -28,7 +28,8 @@ class Emacs < Formula
   def patches
     # Fullscreen patch works against 24.2; already included in HEAD
     if build.include? "cocoa" and not build.head?
-      "https://raw.github.com/gist/1746342/702dfe9e2dd79fddd536aa90d561efdeec2ba716"
+      { :p1 => "https://raw.github.com/gist/1746342/702dfe9e2dd79fddd536aa90d561efdeec2ba716",
+        :p0 => ["http://sourceforge.jp/projects/macemacsjp/svn/view/inline_patch/trunk/emacs-inline.patch?view=co&root=macemacsjp", DATA] }
     end
   end
 
@@ -141,3 +142,15 @@ class Emacs < Formula
     return s
   end
 end
+__END__
+--- src/nsterm.m.orig
++++ src/nsterm.m
+@@ -4263,6 +4263,8 @@
+ 
+ - (void)changeInputMethod: (NSNotification *)notification
+ {
++  if (!emacs_event)
++    return;
+ 
+   struct frame *emacsframe = SELECTED_FRAME ();
+ 

上記のパッチを適用するにはファイルに保存して、

$ cd /usr/local/
$ patch -p1 < emacs24.2.patch

のようにする(git applyでもいい)。

また、比較的新しいautoconfが必要なので先にインストールしておく。

$ brew install autoconf
$ brew link autoconf

Emacsは次のようにしてインストールした。すでに古いバージョンがインストールされている場合は、brew installではなくbrew upgradeEmacs.appは、/usr/local/bin/emacsなどのシンボリックリンクが切れてしまうけど、自分はターミナルで使用することはないのでmvした。

$ PATH=/usr/local/bin:$PATH brew install emacs --cocoa
$ mv /usr/local/Cellar/emacs/24.2/Emacs.app /Applications

Mac固有の設定。一般的に必要とされるのはこんなところだと思う。

(setq default-input-method "MacOSX") ;; ことえりを使う
(setq ns-command-modifier (quote meta)) ;; CommandキーをMetaに
(setq ns-alternate-modifier (quote super)) ;; OptionキーをSuperに
(setq ns-pop-up-frames nil) ;; 新しいウィンドウでファイルを開かない
(define-key global-map [165] nil)
(define-key global-map [67109029] nil)
(define-key global-map [134217893] nil)
(define-key global-map [201326757] nil)
(define-key function-key-map [165] [?\\])
(define-key function-key-map [67109029] [?\C-\\])
(define-key function-key-map [134217893] [?\M-\\])
(define-key function-key-map [201326757] [?\C-\M-\\])

23.3のとき指定していた(mac-add-key-passed-to-system 'shift)(define-key global-map [ns-drag-file] 'ns-find-file)は、24.2では必要ないようだ。

(mac-translate-from-yen-to-backslash)delete-horizontal-spaceなどのキーバインディングでM-¥ is undefinedとなってしまうためやめた。代わりにdefine-keyがたくさん並ぶことになった。詳細はRe: バックスラッシュの入力はどうすれば (Macemacsjp-users 1126) - MacEmacs JP - OSDNを参照。円記号を直接入力するのはあまりよろしくないということで、他にやり方もわからないため、(kbd "M-¥")などと書いてからM-x eval-print-last-sexpとしてひとつずつ値を調べた。

フォント設定はこちらのページが参考になる。

2012年9月20日木曜日

イレクターパイプのためのダンベルカラー

イレクターパイプをダンベルシャフトとして使い固定ダンベルを作ったものの、負荷の調整はやはり必要ということで、IVANKOのスプリングカラーをAmazonで購入した。

(追記)その後、追加でプレートが必要になり、プレート単品よりも安いのでファイティングロードのダンベルセットを購入した。シャフトは必ずしも必要ではなかったのだけど、便利さを激しく実感している。

スプリングカラー

注文から数日で届き、早速はめてみるとどういうわけかスカスカ。つままない状態でもシャフトに通ってしまう。内径を測ってみると明らかに28mmをオーバーしている。しかも両方とも。Fits perfectly on all 28mm barsと書いてあるのだが。

これは誰がどう考えても不良品なので、交換してもらうことにした。返品手続きから数日で交換品が届き、早速はめてみるとどういうわけかスカスカ。つままない状態でもシャフトに通ってしまう。内径を測ってみると明らかに28mmをオーバーしている。ただし、今度は片方だけ。もうひとつはちゃんと使える。

これは誰がどう考えても不良品だけど、もう面倒くさくなってしまったので、返金してもらうことにした。

ノーマルカラー

ノーマルカラーを使うのが確実だとは思うのだけど、スプリングカラーと比べるとだいぶ高くなってしまう。そもそもの趣旨は、クライミングのトレーニング用に買った単品のプレートを使って、ついでにリストカールをやるため、なるべく安くダンベルを用意したいということだった。イレクターパイプもそういった理由で選んだので、ここでノーマルカラーを買ったら本末転倒だ。

ハンドクランプ

ハンドクランプは巨大な洗濯バサミみたいな工具で、接着剤が乾くまで固定したりビス打ちの仮止めなどに使用する。先端で挟むのが本来の用途だけど、奥の丸くなっている部分でシャフトを挟み込めばスプリングカラーのように使えるのではないか、ということで、口開き30mmのものを購入し試してみた。リストカールは特に問題なくできたため自分には十分だけど、そもそもイレクターパイプの表面が滑りやすいので、できるトレーニングは限られてしまう。

2012年6月30日土曜日

イレクターパイプはダンベルシャフトとして使うことができる

指トレーニングのためにダンベル/バーベルプレートを購入したので、そのプレートでダンベルリストカールという手首のトレーニングをやってみることにした。しかし、プレート単体で購入したのでシャフトがない。シャフトがないとダンベルは組み立てられない。ダンベルがないとダンベルリストカールはできない。

ダンベルシャフトは単体だと割高感がある。一般的に径は28mmなので、ホームセンターなどで28mmのパイプが入手できれば代用が可能なはずだけど、そんな都合よくジャストサイズのパイプがあるはずない。と思ってたらあった。

2chの自作トレーニング器具を見せ合うスレによると、イレクターパイプの径がちょうど28mmなので、ダンベルシャフトとして使えるとのことだった。イレクターは、パイプとジョイントを組み合わせていろいろなものが作れる、DIYのための組立材料。強度もかなりあるらしい。また、プレートの固定もイレクターのジョイントでできる(交換が面倒すぎて半固定ダンベルになってしまうけど)

ということで、必要なものは次の通り。

  • Φ28イレクターパイプ
  • J-110A 2個
  • J-131 1または2セット
  • M3x20の皿ねじ、ナット、ワッシャー(必要に応じて)

パイプはメタリックではない普通のものにした。サイズは300mmを選んだのだけど、装着できるプレートの枚数が少なく大抵の人には短すぎると思う。自分はTFCC障害を経験してから手首の調子がおかしく、負荷も弱めなので300mmでも足りている。

J-110Aはパイプのキャップで、両側につけるため2個必要。パイプに押し込むだけだけど、サイズがきついのでサンアロー接着液は必要なかった。

J-131を2セット(2個セットなので合計4個)使って、プレートを両側からそれぞれ固定する。付属のねじで締め付けるわけだけど、本体のプラスチックが柔らかく、ねじ山も切っていないため、締めたり緩めたりを繰り返していると削れてそのうち締まらなくなってしまう。これはナットを使うことで解決した。付属のねじだと長さが足りないので、M3x20の皿ねじ、ナット、ワッシャーのセットを別途購入した。

この方法だとプレート交換のたびにドライバーが必要なので、固定ダンベルとして使うのでなければ、取り外す必要のない内側はJ-131で、外側には専用のカラーを使うのがいいと思う。その場合、J-131は1セットでよくナットも必要ない。自分は今のところ固定ダンベルとして使っている。

と、ここまで書いてきたけど、やはり負荷の調整はこまめに行いたいし、プレートの枚数も限られているので、今からAmazonでスプリングカラーを買うことにした。

(追記)スプリングカラーは2回連続で不良品が届き、結局返金してもらった。代わりにホームセンターで売っているハンドクランプを試したところ、うまく固定することができた。

(追記)その後、追加でプレートが必要になり、プレート単品よりも安いのでファイティングロードのダンベルセットを購入した。シャフトは必ずしも必要ではなかったのだけど、便利さを激しく実感している。

2012年5月19日土曜日

カチ持ちで大事なのは人差し指の虫様筋

吉田クライミング日記の昔の記事を読みあさっていると、カチ持ち(アーケ)で最も重要なのは人差し指の虫様筋であるということが書かれていた。

ということは、指のウェイトトレーニングは1本ずつ、人差し指の虫様筋をメインに行うのがいいのではないだろうか。特定の筋肉を独立して鍛えるのはウェイトトレーニングの原則にも適っているように思える。

虫様筋、浅指屈筋の鍛え方は、以前吉田クライミング日記でポリタンクに水を入れて行う方法が紹介されていた。それを参考にカチ持ちのための筋トレを始めたことがあったのだけど、ウェイト(水)の交換があまりに面倒で長続きしなかった。

ポリタンクがないのでバケツを使っていたのだけど、水の代わりにダンベル/バーベルプレートを入れればウェイト交換が簡単になる、とは当時も思った。しかし、何故かダンベルというものはセットでしか販売されていないと思い込んでいて、その場合、一番軽いプレートでも重量は1.25kgある。指一本に対して1.25kg単位でしか負荷の調整ができないのは厳しい、ということで断念した経緯がある。

今回、改めて調べてみるとプレートは単品でも販売されていて、0.5kgプレートも存在することがわかり購入することにした。

  • 一番軽いプレートは0.5kg
  • バケツよりも直径が小さい
  • 所詮鉄の塊なので価格重視
  • シャフト径は28mm

という条件で探したところ、選択肢はほとんどなくALEXというメーカーのペイントプレートを、

0.5kg * 4 + 2.5kg * n

の組み合わせで買うことに。5kgプレートは直径が24.7cmで大きすぎるので不可。2.5kgプレートは17.5cmなので問題ない。シャフト径は普通のダンベルとして使うことも考慮に入れ、一応、最も一般的な28mm規格であることを確認しておいた。

というわけで、指のトレーニングを再開したのだけど今のところ順調。負荷の調整が素早く簡単にできるのでストレスを感じることもない。当初はカチ持ちのトレーニングのつもりだったけど、せっかくなので深指屈筋でも行っている。

(追記)リストカールを行うため、ホームセンターでダンベルシャフトの代用品を買った。

2012年4月28日土曜日

Macの調子が悪いときに試すこと

ディスクユーティリティでアクセス権の修復

そもそもアクセス権(パーミッション)が意図せず変更されてしまう状況というのがよくわからないのだけど、これはMacの世界では常識だそうで、実際にやってみるとアクセス権のエラーが報告されることは多々ある。これによってどんな問題が解決するのかもよくわからないけど、とにかく真っ先に試すべきことらしい。

仕組みは単純で、アップル製のインストーラによって作られたファイルはすべてインストール時のアクセス権が記録されていて、その通りに戻しているだけ。ということで、サードパーティのインストーラや手動でコピーされたファイルのアクセス権は修復できない。

ディスクの検証と修復

ディスクユーティリティによるディスクの検証は、OS Xを起動している状態でも可能だけど、修復は選択できないようになっている。修復を行う最も簡単な方法はセーフモードで起動(セーフブート)すること。セーフブートを行うにはMacの電源を入れた直後からshiftキーを押し続ける。起動の過程で自動的にディスクの修復が行われる。

NVRAM/PRAMのリセット

Macでは、ロジックボード(マザーボード)上にNVRAMもしくはPRAMという不揮発性メモリがあって、システムやデバイスの設定が保存されている。保存されるのは、

  • スピーカーの音量
  • 画面の解像度
  • 起動ディスクの選択

などだそうで、これらの機能に関連する問題が発生したらNVRAM/PRAMのリセットを試す。起動と同時にcommand + option + P + Rキーをすべて同時に押し、2度目の起動音が聞こえるまで押したままにする。

Apple Hardware Test

Apple Hardware Testはハードウェアに問題がないか調べるソフトウェアで、Macに内蔵されていたり、インターネットから自動的にダウンロードされたり、インストールディスクから起動する必要があったりする。Apple Hardware Testを使うには、Macの電源を入れた直後からDキーを押し続ける。

SMC/PMUのリセット

SMC(システム管理コントローラ)はロジックボード上にあるコントローラチップ。電源やバッテリ、ファン、ライト/ランプ関連の制御を行っていて、それらに問題が発生したときにリセットが必要になることがある。別の問題を引き起こす場合もあるそうなので、アップルは他のすべてのトラブルシューティングを行い、それでも解決しない場合のみ試すように奨めている。詳細はリンク先を参照。

古い機種ではPMU(パワーマネジメントユニット)という名前だったらしい。

2012年4月9日月曜日

NSUserDefaultsとmutable deep copy

NSUserDefaultsにmutableなオブジェクトを保存しても、取り出すとimmutableなオブジェクトが返る、とクラスリファレンスには書いてある。

Values returned from NSUserDefaults are immutable, even if you set a mutable object as the value. For example, if you set a mutable string as the value for "MyStringDefault", the string you later retrieve using stringForKey: will be immutable.

実際にはmutableなオブジェクトが返されることもあるようだけど、その挙動が保証されているわけではない。ということで、mutableなオブジェクトが必要な場合は-mutableCopyなどを使って作り直す必要がある。

NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults];
NSMutableArray* addresses = [[[userDefaults arrayForKey:@"Addresses"] mutableCopy] autorelease];

NSMutableArrayがさらにNSMutableDictionaryを含んでいるような場合、-mutableCopyはshallow copyなので使えない。-mutableCopyのdeep copy版があればいいのだけど、そんな便利なものはFoundationにはなくて、Core FoundationのCFPropertyListCreateDeepCopyという関数を使う。

NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults];
NSMutableArray* contacts = (NSMutableArray*)CFPropertyListCreateDeepCopy(NULL,
                                                                         (CFArrayRef)[userDefaults arrayForKey:@"Contacts"],
                                                                         kCFPropertyListMutableContainersAndLeaves);
[contacts autorelease];

返り値と第2引数(コピーするオブジェクト)の型はCFPropertyListRefで、これはプロパティリストオブジェクトの抽象型ということになっている。つまり、CFData, CFString, CFArray, CFDictionary, CFDate, CFBoolean, CFNumberのスーパークラスのようなもの。さらに、これらの型は対応するFoundationのクラスとtoll-free bridgedなので、結局、キャストするだけで対応するFoundationのクラスを渡したり受け取ったりできる。

第3引数ではどこまでmutableにするかを指定する。kCFPropertyListMutableContainersAndLeavesを指定すると、コンテナ(CFArrayCFDictionary)が含む末端のオブジェクトもすべてmutableになる。一方、kCFPropertyListMutableContainersの場合は末端のオブジェクトはimmutableになる。

CFPropertyListCreateDeepCopyは、NSUserDefaultsと関係なく汎用的に使うことももちろんできる。しかし、プロパティオブジェクトしかサポートしていないため、例えばNSSetなどが含まれているとエラーになってしまう。