Termux with Xperia Z4 Tablet + BKB50 + Syncthing

最近使わなくなってきた Xperia Z4 タブレットに、下記の環境を整備して延命する。

  • emacs25
  • markdown と org-mode ファイルを、出先で編集する
  • gitやファイル共有で、他のPCとのファイルの同期をとる

Termuxのインストール

何で今まで知らなかったのか、こんな凄いものを見付けた。

Termuxは、Androidで動く端末(ターミナル)とLinux環境を、非root環境で動かすというもの。

Linux環境にはパッケージマネジメント apt も含まれていて、主だったパッケージは既に用意されているところが素晴しい。

2015年末から開発が始まっていて、この原稿の時点では v0.59 。

2017年ごろから、紹介記事が増えていたようだ。

Termuxの使い方

ターミナル内は、bashそのもの。

標準では表示できる画面は一つだけだが、複数セッションも起動できる。

アプリとしてのTermux自体は、以下の様な操作が出来る。 フォントサイズをピンチ操作で変更できるのは、とても有り難い。

  • タッチ操作でスクロール
  • 長押しでコンテキストメニューが出て、コピーペーストなどが可能
    • Selecting and pasting text.
    • Sharing text from the terminal to other apps (e.g. email or SMS)
    • Resetting the terminal if it gets stuck.
    • Switching the terminal to full-screen.
    • Hangup (exiting the current terminal session).
    • Styling the terminal by selecting a font and a color scheme.
    • Showing this help page.
  • ピンチで拡大・縮小が可能 (Terminalなのに!)
  • 左側からスワイプするとメニューが出て、KEYBOARDとNEW SESSIONの操作が可能
    • 長押しでSESIONのタイトル編集が可能
  • キーボードショートカット
    • Ctrl+Alt + C → Create new session
    • Ctrl+Alt + R → Rename current session
    • Ctrl+Alt + Down arrow (or N) → Next session
    • Ctrl+Alt + Up arrow (or P) → Previous session
    • Ctrl+Alt + Right arrow → Open drawer
    • Ctrl+Alt + Left arrow → Close drawer
    • Ctrl+Alt + F → Toggle full screen
    • Ctrl+Alt + M → Show menu
    • Ctrl+Alt + U → Select URL
    • Ctrl+Alt + V → Paste
    • Ctrl+Alt + +/- → Adjust text size
    • Ctrl+Alt + 1-9 → Go to numbered session

詳細は

キーボードのCapsとCtrlの入れ替え&特殊記号の入力

Google Playからインストールすれば、特にAndoroid本体の設定を加える必要もなく、アイコンから起動してあっさり普通に使用できる。 ただし、AndroidのソフトキーボードはIMEを前提に作られていて直接入力に向かないし、Ctrlキーなどの装飾キーも使い難い。

実用的には、外付けの物理キーボードが必須だ。

今回は、Xperia Z4 Tablet 用のBluetoothキーボード BKB50を使用する。

更に、レイアウトを設定する下記のアプリを使ってCapsとCtrlを入れ替える。これで快適に操作できる。

アプリのページには、下記の様な但し書きがあり、保証外の様子。

Bluetooth接続のキーボードでは未検証です。 恐らく他の(ATOK以外の))IMEでは正常に動作しません。 確認した限りGoogle日本語入力・Simeji・iWnnでは正常に動作しませんでした。

今回は、Androidの日本語入力は使用せず(SKKを使う)、CapsとCtrlの入れ替えだけが目的なので、問題ない。

残念ながら、BKB50では"|"が入力できないのだけれど、 Termuxの機能で補うことが出来る。

左からのスワイプのメニューから、KEYBOARDを選択すると、画面下に記号一覧が出るので、ここから入力することにする。

emacs + git + python のインストール

2018.01.05時点でのバージョンは。

  • python 3.6.4 (標準が python3)
  • emacs 25.3.1
  • git 2.15.1

これだけあれば、使い道はかなりありそうだ。

caskでemacs環境を再構築

emacsの環境をgitとcaskで管理しているので、Termuxでも使用する。

cask install がパッケージをダウンロードする時に失敗することが多いものの、 installを何度か繰り返すと、全てのパッケージのインストールを完了出来た。

Androidのストレージをリンク (不採用)

で、 $HOME/storage に、下記のストレージへのリンクが作られる。

  • ~/storage/shared
  • ~/storage/downloads
  • ~/storage/dcim
  • ~/storage/pictures
  • ~/storage/music
  • ~/storage/movies
  • ~/storage/external

Dropboxでファイル同期 (不採用)

AndroidでDropboxのオフライン機能を使っていれば、下記のフォルダからアクセスできる。

  • ~storage/shared/Android/data/com.dropbox.android/files/hogehoge/foo/bar

ただし、Forumの記事 Got Dropbox to work with Termux!!! によると、全自動で同期とは行かず、いくつかのお作法がある。

  • Termuxでファイルを開く前後で、Dropboxを手動で同期(update/sync)する必要がある
  • ファイルを新規作成する場合は、Dropboxで作成し、予めオフラインファイルとしておく必要がある

You will need to go into Dropbox and manually update/sync the files before and after you open them in Termux. I also discovered if you want to create a new file you will need to use Dropbox to create it and set it as an offline file before you open it to edit in Termux if you want Dropbox to sync it.

普段使いには、やや面倒。

とは言え、gitで管理する程でもない個別のファイルはDropboxの様な方法が便利。

代りに、Syncthingを使って自宅のMac上のファイルと同期がとれる様にする。

Syncthingでファイル同期: Macの設定

Macには、homebrewからインストールする。

アプリケーションから syncthing-bar を実行すると、 Syncthingが常駐する。 タスクバーの syncthing-bar から [http://127.0.0.1:8084/](OpenUI) を選択して設定画面を出して、必要な情報を確認しておく。

  • デバイスID: 設定画面のメニューから IDを表示 を選ぶ
  • 共有フォルダー: 設定画面の フォルダーを追加 で設定する

Syncthingでファイル同期: Termuxの設定

Termuxで使うので、Google Playのアプリ版ではなく、 apt からCUIでインストールする。

常に使う予定はないので、サービスの設定はしない。 必要な時に、裏のTermuxターミナルで syncthing を実行する。

標準では 127.0.0.1:57562 で、Macと時と同じ設定画面が表示されるので、Mac同様に共有したい設定を加える。

  • デバイスID: 起動メッセージの中に "MY ID"(デバイスID)という行
  • (共有フォルダー: 設定画面の フォルダーを追加 で設定する) ☆必要なら

Syncthingでファイル同期: 接続テスト

最初の接続がやや煩雑。 MacとTermuxの設定画面に、それぞれからの接続確認メッセージが出るので、適宜許可を出せば同期が始まる。 その際、(多分無関係な)"近くにあるデバイス"も同時に表示されるので、自分のデバイスIDとフォルダIDに間違いないか確認する。

一度同期が始まれば、Dropboxに近い感覚でファイルが同期される。

少し意地悪なテストをしてみた結果は、以下の通り。

  • 編集がコンフリクトした場合は、ファイルが複数に分かれる (Dropboxと同じ動作)
  • ファイル編集時には、他のデバイス上のファイルがロックされるが、タイムラグがやや大きい
  • そのタイムラグの間に複数の編集を加えると、どちらかの編集が消えることがある

この様な動作なので、複数人で同時にアクセスする様な使い方には向いていないが、一人で作業する分には問題にならない程度だろう。

gitを使ったプロジェクト同期のテスト

自分のリポジトリからcloneして、commit出来ることを確認した。 これなら、ちょとしたコーディングには十分使える。

ドキュメント作成するには、ややSKKの反応が遅いのが気になる。 入力は出来ているのだが、表示の遅延が大きくて、ややとまどう。

emacsの補間系のパッケージを減らすと改善するかも知れない。 おいおい試してみる。

まとめ

  • Termuxを使えば、Androidタブレットで簡易版ではない本物emacsが割と実用的に動作する
  • しかも、emacsに限らず通常使いそうなパッケージを簡単に追加することができる
  • 実際に、gitとSyncthingを使ったプロジェクト・ファイル同期の環境を作り、動作を確認した
  • 物理キーボードにない特殊記号は、termuxのソフトキーボードで解決できる

Macbook Proを持ち運ぶ機会が少し減るかも知れないくらいの完成度だ。

org2blogで、wordpressで書いてあった記事を更新する方法

検索すると、org2blogではwordpressで書いてあった記事を更新できない、 と書いてあるブログがちらほらある。

元の記事をHTMLで書いていたら難しいけれど、 テキストで書いてあれば、それ程難しくはない

Worpressから、既存の記事をダウンロードする

ここで、Wordpressのエクスポート機能を使うと HTML状態でダウンロードしてしまうので、org2blogとしては面倒なことになる。

HTMLタグを取り除けば良いのだけど、数が多いと手間もバカにならない。

なので。 CSV Exporter の様な、テキストでエクスポートしてくれるプラグインを使うとOK。

公開日時やカテゴリも一緒にダウンロードできるので便利。

org2blogで書き直し

bufferで投稿するならOPTIONで、subtreeで投稿するならプロパティで、 以下の様な属性を指定してあげる。

投稿IDを、元記事と同じにすれば、上書きする事が出来る。

:POSTID: 投稿ID
:POST_DATE: 公開日
:CATEGORY: カテゴリ
:TAGS: タグ

emacs 25.1 で org2blogを使って WordPress に投稿するには

以前から気になっていた org2blog を emacs-25.1.1 で動かそう。 という話。

(この記事はemacs-25+org2blogで投稿しました)

org2blog / README.org を参考に、packageから org2blog をインストールして、以下の様に設定。

(require 'org2blog-autoloads)
(setq org2blog/wp-blog-alist
   '(("wordpress"
      :url "http://***.somof.net/****"
      :username "****"
      :password "****"
      :wp-latex nil
      :wp-code t
      )))

早速試してみるとワーニングが出たので、追加で htmlize の新しいバージョンを手動でインストールした。

これでログイン(org2blog/wp-login)まで出来るようになったけれど、投稿(org2blog/wp-post-buffer)が出来ない。

エラーメッセージは、こんな感じ。



error in process sentinel: url-http-create-request: Multibyte text in HTTP request: POST /xmlrpc.php HTTP/1.1




error in process sentinel: Multibyte text in HTTP request: POST /xmlrpc.php HTTP/1.1

雰囲気、文字コードか改行コードの問題の様。 org2blogが呼び出している gzipコマンドを Apple製からGNU製に変えてみたけど、症状は変わらず。

仕方ないので org2blogのソースを追ってみたところ、エラーの発信源は emacsに添付されている url-http.el だった。 なんと、 emacs 自身のコード側に問題があったのだった。

url-http-create-request関数の中に、こんなコードが紛れていた。

;; Bug#23750
(unless (= (string-bytes request)
           (length request))
  (error "Multibyte text in HTTP request: %s" request))
(url-http-debug "Request is: \n%s" request)

今使っているemacsは、リリース版の emacs 25.1.1 なのだけど、たまたま出来たてのバグを踏んでしまったらしい。

request(XML-RPCのXMLそのもの)の文字数とバイト数が一致しない場合にエラーを返す、多分デバッグ用のコードなのだけど、 ユーザーには意味がないので、とりあえず削除することにする。

こんな風に、initファイルに追加。

(advice-add 'url-http-create-request :override
            'url-http-create-request-debug)
(defun url-http-create-request-debug (&optional ref-url)
  "Create an HTTP request for <code>url-http-target-url', referred to by REF-URL."
  (let* ((extra-headers)
         (request nil)
         (no-cache (cdr-safe (assoc "Pragma" url-http-extra-headers)))
         (using-proxy url-http-proxy)
         (proxy-auth (if (or (cdr-safe (assoc "Proxy-Authorization"
                                              url-http-extra-headers))
                             (not using-proxy))
                         nil
                       (let ((url-basic-auth-storage
                              'url-http-proxy-basic-auth-storage))
                         (url-get-authentication url-http-proxy nil 'any nil))))
         (real-fname (url-filename url-http-target-url))
         (host (url-http--encode-string (url-host url-http-target-url)))
         (auth (if (cdr-safe (assoc "Authorization" url-http-extra-headers))
                   nil
                 (url-get-authentication (or
                                          (and (boundp 'proxy-info)
                                               proxy-info)
                                          url-http-target-url) nil 'any nil))))
    (if (equal "" real-fname)
        (setq real-fname "/"))
    (setq no-cache (and no-cache (string-match "no-cache" no-cache)))
    (if auth
        (setq auth (concat "Authorization: " auth "\r\n")))
    (if proxy-auth
        (setq proxy-auth (concat "Proxy-Authorization: " proxy-auth "\r\n")))

    ;; Protection against stupid values in the referrer
    (if (and ref-url (stringp ref-url) (or (string= ref-url "file:nil")
                                           (string= ref-url "")))
        (setq ref-url nil))

    ;; We do not want to expose the referrer if the user is paranoid.
    (if (or (memq url-privacy-level '(low high paranoid))
            (and (listp url-privacy-level)
                 (memq 'lastloc url-privacy-level)))
        (setq ref-url nil))

    ;; url-http-extra-headers contains an assoc-list of
    ;; header/value pairs that we need to put into the request.
    (setq extra-headers (mapconcat
                         (lambda (x)
                           (concat (car x) ": " (cdr x)))
                         url-http-extra-headers "\r\n"))
    (if (not (equal extra-headers ""))
        (setq extra-headers (concat extra-headers "\r\n")))

    ;; This was done with a call to </code>format'.  Concatenating parts has
    ;; the advantage of keeping the parts of each header together and
    ;; allows us to elide null lines directly, at the cost of making
    ;; the layout less clear.
    (setq request
          (concat
             ;; The request
             (or url-http-method "GET") " "
             (url-http--encode-string
              (if using-proxy (url-recreate-url url-http-target-url) real-fname))
             " HTTP/" url-http-version "\r\n"
             ;; Version of MIME we speak
             "MIME-Version: 1.0\r\n"
             ;; (maybe) Try to keep the connection open
             "Connection: " (if (or using-proxy
                                    (not url-http-attempt-keepalives))
                                "close" "keep-alive") "\r\n"
                                ;; HTTP extensions we support
             (if url-extensions-header
                 (format
                  "Extension: %s\r\n" url-extensions-header))
             ;; Who we want to talk to
             (if (/= (url-port url-http-target-url)
                     (url-scheme-get-property
                      (url-type url-http-target-url) 'default-port))
                 (format
                  "Host: %s:%d\r\n" host (url-port url-http-target-url))
               (format "Host: %s\r\n" host))
             ;; Who its from
             (if url-personal-mail-address
                 (concat
                  "From: " url-personal-mail-address "\r\n"))
             ;; Encodings we understand
             (if (or url-mime-encoding-string
                     ;; MS-Windows loads zlib dynamically, so recheck
                     ;; in case they made it available since
                     ;; initialization in url-vars.el.
                     (and (eq 'system-type 'windows-nt)
                          (fboundp 'zlib-available-p)
                          (zlib-available-p)
                          (setq url-mime-encoding-string "gzip")))
                 (concat
                  "Accept-encoding: " url-mime-encoding-string "\r\n"))
             (if url-mime-charset-string
                 (concat
                  "Accept-charset: "
                  (url-http--encode-string url-mime-charset-string)
                  "\r\n"))
             ;; Languages we understand
             (if url-mime-language-string
                 (concat
                  "Accept-language: " url-mime-language-string "\r\n"))
             ;; Types we understand
             "Accept: " (or url-mime-accept-string "*/*") "\r\n"
             ;; User agent
             (url-http-user-agent-string)
             ;; Proxy Authorization
             proxy-auth
             ;; Authorization
             auth
             ;; Cookies
             (when (url-use-cookies url-http-target-url)
               (url-http--encode-string
                (url-cookie-generate-header-lines
                 host real-fname
                 (equal "https" (url-type url-http-target-url)))))
             ;; If-modified-since
             (if (and (not no-cache)
                      (member url-http-method '("GET" nil)))
                 (let ((tm (url-is-cached url-http-target-url)))
                   (if tm
                       (concat "If-modified-since: "
                               (url-get-normalized-date tm) "\r\n"))))
             ;; Whence we came
             (if ref-url (concat
                          "Referer: " ref-url "\r\n"))
             extra-headers
             ;; Length of data
             (if url-http-data
                 (concat
                  "Content-length: " (number-to-string
                                      (length url-http-data))
                  "\r\n"))
             ;; End request
             "\r\n"
             ;; Any data
             url-http-data))
    ;; Bug#23750
    ;;(unless (= (string-bytes request)
    ;;           (length request))
    ;;  (message "   text byte %d vs %d length" (string-bytes request) (length request)))
      ;;(message "===============================")
      ;;(error "Multibyte text in HTTP request: %s" request))
    (url-http-debug "Request is: \n%s" request)
    request))

これで、無事 org2blogから投稿できるようになった。

そのうち解決されるだろうけれど、それまではこれで凌ごう。

magit と git-gutter が便利!

git-magitを使ったソースコードの履歴管理は凄く便利。 git-gutter-fringe を追加すると、commitした後の更新が常に見えるようになる。 これはズゴク便利。

MELPAから自動でインストール出来て、Macでは言うこと無しに快適。 Cygwinでは、この間までは良くプチフリーズしていたけれど、 設定見直しでファイルアクセスが早くなったので実用範囲になった。

設定したのは、この程度。

;; Control Git from Emacs.
(require 'magit)

;; magit
(global-set-key         (kbd ""C-z m s"")       'magit-status)

;; git-gutter-fringe
(global-git-gutter-mode)
(global-unset-key       (kbd ""C-z g""))
(global-set-key         (kbd ""C-z g t"")       'git-gutter:toggle) ; Toggle git-gutter
(global-set-key         (kbd ""C-z g p"")       'git-gutter:previous-hunk)
(global-set-key         (kbd ""C-z g n"")       'git-gutter:next-hunk)
(global-set-key         (kbd ""C-z g r"")       'git-gutter:revert-hunk)
(global-set-key         (kbd ""C-z g u"")       'git-gutter:popup-hunk) ; popup diff
(global-set-key         (kbd ""C-z g s"")       'git-gutter:set-start-revision) ; Set start revision where got diff
(global-set-key         (kbd ""C-z g g"")       'git-gutter) ; Show changes from last commit or Update change information.
(global-set-key         (kbd ""C-z g c"")       'git-gutter:clear) ; Clear changes

git最高だなぁ。

Mac El Capitan で Jenkins がデーモンとして起動しなくなっていた件の修正

El Capitan にアップデートしてからJenkins が起動しなくなっていた問題の修正。

まず、ログすら残ってないので。

$ sudo chown jenkins /var/log/jenkins/

で、 launchctnl start して結果のログを見ると、こんな感じ。

前半はオプション指定が無いと言っているだけで、 jenkins.war へのパスが通っていないのがエラーの原因らしい。



The domain/default pair of (/Library/Preferences/org.jenkins-ci, war) does not exist

The domain/default pair of (/Library/Preferences/org.jenkins-ci, JENKINS_HOME) does not exist

The domain/default pair of (/Library/Preferences/org.jenkins-ci, prefix) does not exist

The domain/default pair of (/Library/Preferences/org.jenkins-ci, httpPort) does not exist

The domain/default pair of (/Library/Preferences/org.jenkins-ci, httpListenAddress) does not exist

The domain/default pair of (/Library/Preferences/org.jenkins-ci, httpsPort) does not exist

The domain/default pair of (/Library/Preferences/org.jenkins-ci, httpsListenAddress) does not exist

The domain/default pair of (/Library/Preferences/org.jenkins-ci, ajp13Port) does not exist

The domain/default pair of (/Library/Preferences/org.jenkins-ci, ajp13ListenAddress) does not exist

JENKINS_HOME=/Users/Shared/Jenkins/Home

Jenkins command line for execution:

/usr/bin/java -Dfile.encoding=UTF-8 -XX:PermSize=256m -XX:MaxPermSize=512m -Xms256m -Xmx512m -Djava.io.tmpdir=/Users/Shared/Jenkins/tmp -jar /Applications/Jenkins/jenkins.war

Error: Unable to access jarfile /Applications/Jenkins/jenkins.war

plist で指定している jenkins は

/usr/local/opt/jenkins/libexec/jenkins.war

なのに、デーモンは

/Applications/Jenkins/jenkins.war

を探しにいって、見付からないので起動に失敗しているらしい。

agentを見てみると、jenkinsが二種類登録されていて、 古い設定が使われていたままの様だった。

~ $ launchctl list|grep jenkins
– -9 homebrew.mxcl.jenkins
– 78 org.jenkins-ci
~ $ launchctl remove homebrew.mxcl.jenkins
~ $ launchctl remove org.jenkins-ci
~ $ launchctl list|grep jenkins
~ $ launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.jenkins.plist
~ $ launchctl load ~/Library/LaunchAgents/homebrew.mxcl.jenkins.plist
~ $ launchctl start homebrew.mxcl.jenkins

またログファイルの所有者がrootになってしまうので 以下の様に、改めて登録と実行。

~ $ sudo chown jenkins /var/log/jenkins/
~ $ launchctl load ~/Library/LaunchAgents/homebrew.mxcl.jenkinsp.list
~ $ launchctl start homebrew.mxcl.jenkins

この状態で、コマンドで起動すればJenkinsを使えるのだけれど、 デーモンとして起動しない状況は変わらず。

どうやら、 plistの値が使われず、 mac の defaultコマンドの値が使われているらしい。

~ $ defaults read ~/Library/LaunchAgents/homebrew.mxcl.jenkins.plist

で、defaultを上書きしてあげる。

これで、デーモンとして jenkins が復活してくれた。

ループイフダンの維持率の維持について

調子の良いときの利益率の高さに、ついつい調子に乗ってしまう
アイネット証券のループイフダン。

一部決済は出来るものの、新規発注を止めるには全決済しかないので、
裁量取引やトラリピの様な計画的なリスク管理が難しい。
アイネット証券が公開している「ループ・イフダン目安資金表」を元に、
USDJPY_B15_15の場合の、為替の変動幅と維持率の変化をまとめたのが下の表。

維持率10の列は円高に耐えらえる値幅が10円とした場合の維持率の変化の様子。
維持率20が20円、維持率30が30円の場合。
それぞれに必要な資金は 70万円、206万円、410万円。

維持率の変化をグラフにすると、こんな感じ。

dyerware.com


dyerware.com


dyerware.com


維持率2000%くらいで安心してはいけない、という事が良く分かる。

トレンドが反転したと判断したら、
即座に停止&全決済するのがベスト。

遅れて損切りしても、
追証までの限界値幅を下げる効果はあまりない。
ドル円の年間の値幅を30円とするなら、
維持率は10000%(証拠金の100倍)くらいないと安心できない。

ただまぁ。
100倍の予算も持ってたら、FXなんてやらない気もするよね。

という話でした。

emacs helm find-fileの設定を整理

emacsとhelmののアップデートで、
find-fileの動きが大分変わってしまったので修正する。

|—————-+———————————————|
| 関数 | いろいろ |
|—————-+———————————————|
| find-file | 標準の補完リストがバッファになり |
| | 操作がacejumpみたくなった (acejumpの機能?) |
| helm-find-file | TAB補完の設定が効かなくなった |
| | その代り → を使え、と言うことらしい |
|—————-+———————————————|

両方をしばらく使ってみたけれど、
どちらも、find-fileとしては、おせっかい過ぎる感じがする。

滅多に使わないコマンドを探す様な場合はhelmは最高だけども、
find-fileする時は目的のファイル名が頭の中にある訳なので、
候補が大量に出てきても有難味が薄いのだ。

emacs標準機能に慣れるのも良いかと、しばらく素で使ってみたけれど、
helm-miniと補完操作が違うのは、やっぱり気持悪い
そうは言っても helm I/Fが便利だし、補完操作は揃えておきたい。

|—————-+———————————————|
| 関数 | 操作方法 |
|—————-+———————————————|
| find-file | 水平リスト, ace-jump的選択 |
| | TAB: 補完 (複数候補があると確定しない) |
| | C-BS: 直前の単語削除 |
| helm-find-file | helm I/F、垂直リスト、Action込み |
| | →: 補完 (複数候補があっても何か確定できる) |
| | C-l: 直前の単語削除 |
| | TAB: Actionの選択 |
| | C-j,C-z: 昔のTABの様な動作 (多分) |
|—————-+———————————————|

補完キーがカーソルになっているのは、 lynxスタイルというものらしい。

#+BEGIN_SRC lisp
(defcustom helm-ff-lynx-style-map t
“Use arrow keys to navigate with helm-find-files'.
You will have to restart Emacs or reeval
helm-find-files-map’
and `helm-read-file-map’ for this take effect.”
:group ‘helm-files
:type ‘boolean)
#+END_SRC

ただ、これを nil にしても、TABキーは元に戻らない。

昔のTAB相当の機能 helm-execute-persistent-action は
C-jとC-zに割り当てられている。

そもそもActionなんて使わないぜ!という男の中の男は。

#+BEGIN_SRC lisp
(define-key helm-map (kbd “TAB”) ‘helm-execute-persistent-action)
#+END_SRC

とすれば簡単で良い。

僕は女々しいので、今後はC-jとC-zを使うことにする。

find-filesとhelm-miniの動作がちょっと違うのが
もやっとするけど、慣れられそうな範囲だと思う。

emacs helm の補完情報(ソース)を切り替えるキー操作

helmは、殆どの場合、タブキーで補完してくれるので、
操作方法を覚える必要はあまりない。

だけど、覚えなくて良いせいで
たまに補完の情報源を切り替えたい時に、
毎回検索することになる。

#+BEGIN_SRC lisp
;; helm-20160321.959:
./helm-files.el:409: (define-key map (kbd “<M-left>”) ‘helm-previous-source)
./helm-files.el:410: (define-key map (kbd “<M-right>”) ‘helm-next-source))
#+END_SRC

カーソルキーの左右で切り替えられるみたいだ。

これで、ソースを recentf から buffers-list に
さくっと切り替えられる。

きっと
また忘れるだろうな。

macで既定のブラウザ(デフォルト Web ブラウザ)を設定する方法

バッテリーの持ちが良くなるというので、
Macbookでは Chrome Canary を使っていた。

その時に、既定のブラウザ(デフォルト Web ブラウザ)も
Chrome Canary に設定していた。

設定方法は
OS Xのシステム環境設定>一般>デフォルトWebブラウザ
で、リストからブラウザを選ぶだけ。

今現在は通常の Chrome で不都合ないし、
当時ほど体感速度も変わらなくなったので
通常版の Chrome に戻したのだけど。。。。

デフォルトWebブラウザのリストにブラウザが何も出てこない。
焦ったものの。

ふと思い出して。
通常版の Chrome の設定画面の規定のブラウザから
規定のブラウザを Google Chrome に設定 を選んで元通り。

ただ。。。。
OS Xのシステム環境設定>一般>デフォルトWebブラウザ
のリストには既にアンインストールしたブラウザまで復活してしまった。

消し方も分からないし不都合ないので、このままですが。

gitのローカルリポジトリをローカルで共有したい

gitでワークスペースを複数作って違う作業をしたい場合に、
リモートのサーバを用意して、リポジトリを共有していた。

バックアップも兼ねているので、それはそれで良いのだけど
もっとご気楽にローカルのリポジトリを共有する方法があった。

[[http://d.hatena.ne.jp/bi_na/20120206/1328502980][gitのローカル用の共有リポジトリ(?)を作る方法Add Star]]

workspace/orginal/ に既にgitのローカルリポジトリがあるところから。

#+BEGIN_SRC sh
$ cd repo
$ git clone –bare workspace/orginal/ # ← 元のリポジトリから新しい共有用リポジトリを作る

$ cd workspace/new/
$ git clone repo/orginal.git # ← 新しいワークスペースを作る

$ cd workspace/orginal
$ git remote add origin repo/orginal.git # ← 元のリポジトリに origin を設定
#+END_SRC

ポイントは2つ。

まず、
元のリポジトリから新しい共有用リポジトリをcloneする際に –bare オプションをつけること。
これで、リポジトリとして必要なファイルだけがcloneされる。

もう一つが、
元のリポジトリに、今作った共有用リポジトリをoriginとして設定すること。
これで、元のリポジトリのフォルダも、引き続きワークスペースとして使用できる。