読者です 読者をやめる 読者になる 読者になる

遅れてきた人によるメモ

遅れてきた人は危険がいっぱい

MacBook Airで脱MagSafe電源アダプター!

人柱が成功したようなので報告をば。ただし、ご利用は自己責任で…

MacBook Air最大の不満

MacBook Airを使っていて不便の筆頭は、MagSafe電源アダプターの寿命だというのは異論の余地がない事実だと思います。理由となるのは、AppleStoreでの値段が高い(9,500円+税!!)のもあるのですが、安くてもパチもんが平然売られているので博打みたいになっている無法状態が嫌いです。

我が家のMacBook Airは5年目を迎え、MagSafe電源アダプターは2代目ですがこんな感じ。ちなみに1代目は火花が飛び使用を中止しました。

f:id:jiroukaja:20160123203011j:plain

気をつけながら使っていてもこんな感じになります…

というわけで、こうなりました。

我が家のベストプラクティス

f:id:jiroukaja:20160123210446j:plain

電源アダプターとバッテリー用のMagSafeケーブルが使えました。

心配していた径も同じでした。

これで、MagSafeケーブルが死んでも取り換えできます。

余談

MagSafe電源アダプターの何がいけないのでしょう?

  • 寿命の短さ
  • どこかが断線した場合の全取り換え
  • 3rdパーティー製品が出しにくい独自規格
  • 存在そのもの

Appleの思想としては、間違ってないとは思いますが、2年で死ぬ電源アダプターは勘弁して欲しい…

今回のお値段

5,999(電源) + 2,980(ケーブル) = 8,979

参考: パチもんMagSafe電源アダプター 2,050~

お値段以外のこと

えぇ、全然値段が違います。でも、なんかキレたんです。

MacBook系を使い始めて10年目、

毎度電源アダプターに悩まされています。

よろしい ならば戦争だ」になるわけです。

というわけで、個人的にスッキリしたので満足しています。

今回購入したもの(アフェリエイトなしリンク)

電源部

www.amazon.co.jp

MagSafe

www.amazon.co.jp

MagSafe2(参考)

www.amazon.co.jp

補足

ググるとAppleStoreに言えば無料交換とか安くしてもらえるという情報がありました。

support.apple.com

昔はもうちょっと安かったような…

www.apple.com

Common Lispの(defun (setf fun) (val a) ...)について

承前

Common Lispでイマイチよく分からなかったことを書こうと思う。on Lispでもちょこっと出てくる、(defun (setf fun) (val a) ...)について。まず調べようとしても、検索しにくい、とても検索にしにくい。説明すると、(setf (fun a) val)を定義するためのdefunです。valとaがひっくり返っているところに注意(正確にはaは一番最後になる)。これが活躍するケースを元に説明したいと思う。

構造体は、defstructを行った時点で、accessorなどがdefunで作成される。

CL-USER> (defstruct hoge foo-list bar-list)
HOGE

 この例でいうと、readとしてのhoge-foo-list, hoge-bar-listとwriteとしての(setf hoge-foo-list), (setf hoge-bar-list)、さらに新しいinstanceを作成するmake-hoge、コピーのためのcopy-hoge、構造体hogeの判定hoge-pである。お目当の(setf hoge-foo-list)が出てきた。詳細は、(macroexpand-1 '(defstruct hoge foo bar))で確認してね。

hogeの中のfoo-listとbar-listに数字をpushすることを考える。そして、pushされた数字は、昇順にlistへ格納されるようにすることとする。1つずつ定義するのは簡単で、

(defmethod push-foo ( (v number) (h hoge))
  (setf (hoge-foo-list h) (sort (push v (hoge-foo-list h)) #'<)))

みたいになる。ただ、明らかにbarも同じ形式なので関数は共通化したい。すると、こうなる。

CL-USER> (defmethod %push-child ( (fun symbol) (v number) (h hoge))
           (let ( (lst (funcall fun h)))
             (funcall `(setf ,fun) (sort (push v lst) #'<) h)))
#<STANDARD-METHOD %PUSH-CHILD (SYMBOL NUMBER HOGE)>

1つ前のCommon Lispでfoldrを書いてみる - 遅れてきた人によるメモの復習になるけど、変数に関数を入れる場合は、funcallが必要。ただ、setfの場合は、単純に(setf (funcall fun h) lst)はダメで、本来の定義である(setf fun)という形に戻す必要がある。ちなみに、(fdefinition `(setf ,fun))としても大丈夫。上の対応関係で色を塗ると、下のように見やすい定義となる。

CL-USER> (defmethod push-foo ( (v number) (h hoge))
           (%push-child 'hoge-foo-list v h))
#<STANDARD-METHOD PUSH-FOO (NUMBER HOGE)>


CL-USER> (defmethod push-bar ( (v number) (h hoge))
           (%push-child 'hoge-bar-list v h))
#<STANDARD-METHOD PUSH-BAR (NUMBER HOGE)>

 実際にpushした例

CL-USER> (setf hoge-instance (make-hoge))

#S(HOGE :FOO-LIST NIL :BAR-LIST NIL)

; push foo
CL-USER> (push-foo 1 hoge-instance)
(1)
CL-USER> (push-foo 2 hoge-instance)
(1 2)
CL-USER> (push-foo 3 hoge-instance)
(1 2 3)

 

; push bar
CL-USER> (push-bar 4 hoge-instance)
(4)
CL-USER> (push-bar 2 hoge-instance)
(2 4)
CL-USER> hoge-instance
#S(HOGE :FOO-LIST (1 2 3) :BAR-LIST (2 4))

fooの方はsortしてなかったら、(3 2 1)となるパターンで、barの方は(2 4)となるパターン。

■結論

関数が変数funのときにsetfを適用する必要があったら、(setf fun)という形式に一度戻して考えましょう。

■余談

sortもstable-sortも破壊的な関数なので、上書きしない場合は、(copy-seq lst)とかやってコピーしないと以前の値がズタズタにされてしまうので注意。

Common Lispでfoldrを書いてみる

Haskellのfoldrに的を絞ってCommon Lispで説明する。適用条件は狭まるものの、アルゴリズム再帰関数で抽象化するためのテンプレートっぽさを実感してもらえればと思う(正格評価と遅延評価の違いは無視する)。

まず、foldrをCommon Lispで速度とか考えず素直に書いたらこうなる。

(defun fold-right (fun lst init)
  (if (null lst)
      init
      (funcall fun (first lst) (fold-right fun (rest lst) init)))) 

テキトーに色付けしてみた。funがそのまま適用できないのは、Schemeみたいに関数と変数の名前空間が同じではないから。これのどこが嬉しいかというと、色々な再帰関数のテンプレートになれるところ。たとえば、Common Lispではあまりありがたみがないけど、list内の数字の和を求める関数sumを再帰関数で書いたらこうなる。

(defun sum (lst)
  (if (null lst)
      0
      (+ (first lst) (sum (cdr lst)))))

上のfold-rightに対応する色で色付けしてみた。つまり、(sum lst) = (fold-right #'+ lst 0)となる。funとinitは、固定だからsumでは見えないわけだ。

次に、みんな大好き階乗(n!)の関数factを再帰関数

(defun fact (lst)
  (if (null lst)
      1
      (* (first lst) (fact (cdr lst)))))

見比べると、(fact lst) = (fold-right #'* lst 1)となる。

どんどんいこう、要素数を求める関数length

(defun length (lst)
  (if (null lst)
      0
      (+ 1 (length (cdr lst)))))

見比べると、(length lst) = (fold-right (lambda (x y) (1+ y)) lst 0)になる。ラムダ式でx使ってないって警告出されたりするから、(fold-right (lambda (x y) (declare (ignore x)) (1+ y)) lst 0)としたほうがよさそう。

最後は、標準関数append

appendは、(append '(a b c) '(d e f)) => (a b c d e f) となる関数

(defun append (lst1 lst2)
  (if (null lst)
      lst2
      (cons (first lst) (append (cdr lst) lst2))))

と書ける。対応は、(append lst1 lst2) = (fold-right #'cons lst1 lst2)になる。

 

今回、foldrがどのような意味であるかを説明した。全ての再帰関数がこの形になるわけではないが、「Haskellで話題に出てくるfoldrって、Common Lispではどういうことなの?」には答えられたかと思う。ちなみに、Common Lispの場合、実際にはreduce使った方が良いみたいだ。

(defun fold-right-reduce (fun lst init)
  (reduce fun lst :from-end t :initial-value init))

Fold (higher-order function) - Wikipedia, the free encyclopediaより

 

Yosemiteで半角記号を直接入力したい、一部じゃない全部だ!

承前

Yosemiteが正式リリースされて、まだ2ヶ月しかたってないんですね。最初のβ版から使ってたので、飽きてMavericksに一度戻すくらい使っていました。

話題

YosemiteとMavericksの違いはもう既に聞き飽きたと思うので、JapaneseIMという知らない人の話をします。結論は、調査報告にあるので読み飛ばしちゃってください。

従来

Mavericksでは日本語入力は「ことえり」さんがいました。言葉を選(え)るということえりさんがいなくなり、Yosemiteでは「JapaneseIM」という外人がやってきたようです。

やりたいこと

  • すべての記号が半角で表示されること。一部じゃない全部が半角記号となる。

特記

  • /タイプで / と表示されること
  • \タイプで \ と表示されること
  • Option+\で ¥ と表示されること

Webでの改善例

ここで、車輪の再発明を防ぐために過去の改善例を見てみたいと思います。

OSX - OS X Yosemite の日本語入力環境 - Qiita

こういうところが見つかりました。でも、なぜか、/(スラッシュ)と\(バックスラッシュ)は、言及がないみたいです。原因はおそらく、Yosemiteのこの設定。

f:id:jiroukaja:20141225231020p:plain

さっきkenicさんから教えてもらったのですが、kenicパッチにYosemite対応版があった! (12/5公開)

こっちも、/と\に苦心したらしい。

実は、以前にNo調査で/と\と¥以外はできていたのですが、上記3つはうまくいかなかくて放置していました。フラストレーション、欲求不満です。本日、思い出したらよけいに腹が立ってきたのでムカムカしてやった。なお、クリスマスは関係ないもよう。

調査報告

 下記対象ファイルをデスクトップにコピー&バックアップ作成、変更後コードに置き換える。そのあと、上書きを行いターミナル操作を行う。

対象ファイル

  • System ▸ Library ▸ Input Methods ▸ JapaneseIM ▸ Contents ▸ Resources ▸ KeySetting_Default.plist

ターミナル操作

  • sudo killall -HUP JapaneseIM

変更後コード

参考: Diffが見やすいのはこっちRevisions · KeySetting_Default.plist

イタコ解説すると、Root ▸ keys ▸ before_typingが、1文字目、1文字も変換対象がない場合に適用され、2文字目からは、Root ▸ keys ▸ typingが適用される。

余談: 本当はkenicパッチの〓も実装しようと思ったのだけど、どのキーだったか忘れたので諦めました。option+shift+/あたりだったような記憶…

誰得アドバイス

sudo killall -HUP JapaneseIMをやったあとは、確認のために使っているアプリ(MacVimとかMacVimとかMacVimとか)を一度終了しないと日本語が入力できなくなるます気をつけましょう。

なんか、/と\のシステム環境設定の設定は、グローバル変数で穴開けて設計を台無しにしてる悪いパティーンパターンだと思う…

結語

というわけで、久々にブログを書きました。クリスマスは日の入りとともに終わり2014年も残すところあとわずか、それではみなさまよいお年を!

これでようやく夜もぐっすり眠れる…

eclipse + Android SDK Manager + network + proxy

会社でproxy設定しているのになぜ接続できないんだ?と悩み続けてようやく分かった。

eclipseは、networkを手動設定するとき、SocketのproxyがないならSocketだけクリアしないとならぬらしい。Socketを優先して使おうとするけど、Socketで接続できなかったら諦めちゃうっていうのが原因。似たような現象が、Android SDK Managerで発生していたので、もしやと思いMacのNetworkにあるSocket proxyのチェックを外したら、見事、接続できるようになりました。いらない設定してたってことか…

proxyちゃんと設定してるのに、なんでうまくいかないんだ?と思っている人の助けになったらいいな。

Xcodeのパスってどう変更するの?

Yosemiteとりあえず入れて、Xcode6-Beta入れると、Homebrewに怒られるので、

$ sudo xcode-select -switch /Applications/Xcode6-Beta.app/Contents/Developer

$ xcode-select-print-path

/Applications/Xcode6-Beta.app/Contents/Developer

こうやりましょう。

2014/08/02追記 リセットする場合はこうしましょう。

$ sudo xcode-select -r

リモートPCのEclipseで今使ってるPCのUSBポートに繋がってるAndroidを認識させて方法

Eclipse重たいし、コードは出先の非力なパソコンで処理したくないなーと思ったら既に先駆者が。

ローカルPCにUSB接続したAndroid実機を、リモート開発環境で認識させる方法 | Androidプログラミング

ちょっとはまったので補足を書くと、

リモートデスクトップでログインしたPC(Eclipse入れているPC)でターミナルの画面が2つ。

ターミナルの1つに

ssh -L 5037:127.0.0.1:5037 user@ipaddress

ポートフォワーディングしてあげる。

ここでのuserとipは現在使っている非力なパソコンのユーザー名(要リモートログイン許可設定)

これで、yesとかパスワードとか入力すれば、うまくいけばsshで接続されます。

で、確認のため、もう1つのターミナルで、

adb devices 

とかやってもうまくいかない。

理由は簡単で、adbサーバーを一度キルしないといけないのをすっかり忘れてた。

adb kill-server

adb start-server 

adb devices

 とやったらうまくいきました。

6/1追記: 原因が違っていた。ローカルじゃない場合は、-gが必要なだけだった!
試行錯誤しまくってたので、対処法のきり分けが不十分でした… 正しくは、

ssh -g -L 5037:127.0.0.1:5037 user@ipaddress

 

6/6追記: Macだったら問題なかったのだけど、Windowsだったら、

adb kill-server

adb start-server

adb devices

 が必要だった。

追記終了

ついでにapkが大きいとタイムアウトしやすいので、

Setting > Android > DDMS >  ADB Connection Timeout (ms)を1分(60000)くらいにしてみましたとさ。

おしまい