Hatena::ブログ(Diary)

三等兵

2012-06-22

決定版!EvernoteにMarkdown記法で構造化されたデザイン文書を作るやつ!

今までの流れで一応形になって落ち着きましたー。

madeverというAppleScriptで書いたスクリプトを使って、Evernoteクライアント上でMarkdown記法が使えるようになります。文章を書くときはmarkdown、ちゃんとした形として保存するならリッチテキスト。そういった使い方で利用できるようイメージしました。(もちろんリッチテキストでも編集可能)

インストールや詳しい使い方については下記のURLでどうぞ。


Evernoteの使い道

ネットだとEvernoteはよくあるライフハック的な使い方やEvernoteにライフログを残すといった情報ばかりです。というか、私はそういったイメージが強くて使っていなかったのですが、

  • 読書メモ
  • 技術的な知識のまとめ
  • アイデアメモ
  • 領収書
  • pdf書籍の保管

などで利用すると便利でした。

ウェブページ保存とかライフログとかはやらないです。めんどくさいです。

個人的にEvernoteの一番の魅力はドキュメントや画像管理が楽なとこですね。テキストファイルとか邪魔で、そういうの保存する、管理するってめんどくさいし、さらに画像も含まれてくると嫌になるんですが、Evernoteだとそういうことを気にせず扱えます。あとクラウドって部分も大きい。

だけれど構造的な文書を作るのには向いていない

Evernoteのクライアントは構造的な文章が書きにくい。書きにくいというか向いていない。Evernoteって普通だとメモ程度にしか使えないので、それ向けに使ってる人も不満に感じないと思います。

ちゃんとした文書を作るとなると自分に馴染んだアプリを使いますね。自分もそうしていたんですがめんどくさくなりました。読書メモで電子書籍のスクショとか取ると画像の扱いとか面倒で。あと文書がかければ私はメモ帳でもなんでも良いです。

で、個人的な文書ならEvernoteだけで終わらせてしまってもいいんじゃないかと。でも文書の見た目はちゃんとさせたい。構造化された文書はパッと見てポイントがつかみやすいのでこれだけはちゃんとしたい。

そういった動機からmadeverみたいなのを作りました。

Evernoteでそんな文書を書きたいなんて人は稀でしょうが同じような人の役に立てたらうれしいです。

2012-06-13

AppleScriptをEmacsで編集するときの注意点とapples-mode導入手引き

EmacsでAppleScriptを書くときの設定。


とりあえずメジャーモードを導入

Major mode for AppleScript - Clipboard

ひと通り機能が揃っている。

  • キーワードの色付け
  • インデント
  • AppleScript の実行と結果の表示
  • エラー箇所のハイライト
  • 機能の殆どはメニューからアクセス可能
http://d.hatena.ne.jp/tequilasunset/20110116/p1

さらに、デコンパイルもできるのでコンパイル済みのファイルも編集可能。すばらしい。希少種のEmacs使いAppleScripter歓喜。


利用するのであれば.emacs(dot.emacs.d/init.el)に次のコードを記述。

(autoload 'apples-mode "apples-mode" "Happy AppleScripting!" t)
(autoload 'apples-open-scratch "apples-mode" "Open scratch buffer for AppleScript." t)
(add-to-list 'auto-mode-alist '("\\.\\(applescri\\|sc\\)pt\\'" . apples-mode))

これでapplescriptのファイルを開けば色付けされており実行も可能となる。しかし、「applescriptテキストエディタで編集したファイル」は普通には開けない。


applescriptテキストエディタで作成されたapplescriptファイルを開く場合

applescriptテキストエディタで編集されたapplescriptファイルをEmacsで開くとutf-8などで開くと文字化けするかもしれない。

どうもapplescriptはshift-jisみたい。なんでじゃ。AppleScriptエディタから文字コードいじれない。Emacsをshift-jis以外で利用しているのであれば文字化けすることになるからshift-jisで開き直す。

applescriptファイルのバッファ上でC-x RET r sjisとタイプ。指定した文字コードで再読み込みすることができる。sjisのとこはshift-jisとかjapanese-shift-jis-unixなどそれっぽいことを書く。

これで再読み込みされて日本語の文字化けが治ったはず。おそらくバックスラッシュの部分は正しく変換できずに\200みたいになってるはずだからこれは手作業で直すしかない。

そうしてこのファイルをたとえばutf-8に変換して保存するには、C-x RET f utf-8として保存することで変換できる。このとき\200などの文字があればたぶん変換できないので手動で直すかなんかする。


scptファイルを開く時と保存の時に自動で(デ)コンパイルする

個人的にはapplescriptをテキスト形式で保存するといったことはほとんどなくコンパイルしてscptで保存している。

しかし、コンパイルされたscptファイルのデータはバイトコードなのでEmacsでそのままで開くとわやくそ。これはapples-modeのM-x apples-decompileを使うかC-c t dでデコンパイルすることができる。

とはいえいちいち叩くのが面倒なので、ファイルを開くときに自動で行うように設定して、ついでに保存するときにコンパイルするような設定にしておこう。また、これはscptファイルのみに対して行うようにする。

開くときの設定。

;; scptファイルを開くと自動でデコンパイル
(add-hook 'find-file-hook
          '(lambda ()
            (when (and (string-match "\\.scpt$" (buffer-file-name))
                       (> (length  (buffer-string)) 0))
              (apples-decompile (buffer-file-name)))))

scpt拡張子のついたファイルを開くとミニバッファにどのように開くかメッセージが表示されるので、普通に開くときはoキーをタイプする。

個人的にはこのoをタイプするのも面倒だから、

;; デコンパイル終了後の確認を無効
(setq apples-decompile-query '?o)

とした。次は保存の設定。

;; scptファイルを保存すると自動でコンパイルした内容を保存
(add-hook 'before-save-hook
          '(lambda ()
            (when (and (string-match "\\.scpt$" (buffer-file-name))
                       (> (length  (buffer-string)) 0))
              (apples-compile (buffer-file-name)))))

C-x C-sなどで保存するときに、scptファイルの場合コンパイルして保存するようにしている。コンパイルせずに保存するこれはまた面倒なことになる。

というわけで、もろもろ含めて.emacsの設定は以下の通りにした。

(autoload 'apples-mode "apples-mode" "Happy AppleScripting!" t)
(autoload 'apples-open-scratch "apples-mode" "Open scratch buffer for AppleScript." t)
(add-to-list 'auto-mode-alist '("\\.\\(applescri\\|sc\\)pt\\'" . apples-mode))

;; デコンパイル終了後の確認を無効
(setq apples-decompile-query '?o)

;; scptファイルを開くと自動でデコンパイル
(add-hook 'find-file-hook
          (lambda ()
            (when (and (string-match "\\.scpt$" (buffer-file-name))
                       (> (length  (buffer-string)) 0))
              (apples-decompile (buffer-file-name)))))

;; scptファイルを保存すると自動でコンパイルした内容を保存
(add-hook 'before-save-hook
          (lambda ()
            (when (and (string-match "\\.scpt$" (buffer-file-name))
                       (> (length  (buffer-string)) 0))
              (apples-compile (buffer-file-name)))))

最低限覚えておくと良いコマンド

  • apples-open-scratch
    • scratchバッファのapplescript版
    • C-c t r
  • apples-decompile
    • デコンパイル
    • C-c t d
  • apples-compile
    • コンパイル
    • C-c t k
  • apples-run-region/buffer
  • スクリプト実行
    • C-c t r
  • AppleScriptエディタにスクリプト写して起動
    • C-c t s

ほとんどメニューから利用できる。キーバインドはいじった方が良いかもしれない。めんどくさい。


おまけでapples-modeのauto-complete用の辞書

ついでに作ったんでauto-completeを利用しているのであれば辞書もどうぞ。

これでひと通り機能は揃ったはず。

細かい部分で動作がおかしいところがあるから修正しつつ使ってみようと思ったけど細かい確認になるとAppleScriptエディタの方が便利だしあまり困ってないしずっとAppleScriptと付き合っていける自信がないしたぶんするつもりもないので放置する。ひどい。

とはいえ、面白い言語です。気軽に書く程度なら簡単んだし文法が英語だから英語できる人ならすんなり入れると思う。でもハッシュみたいなのないから扱いにくい。言語としてはシェルスクリプトっぽいのを目指したのかな。

EvernoteだけでMarkdown<=>リッチテキストの相互変換できるスクリプト書いた

前回Pandocを入れたのはEvernoteだけでmarkdownとhtml(リッチテキスト)を相互変換できないものかという考えからだった。

そういうわけでやってみたできた。こうやってEvernoteでmarkdownの文書を書いて、

f:id:sandai:20120612234852p:image


スクリプト実行すると、

f:id:sandai:20120612234853p:image


markdownにするかhtml(リッチテキスト)にするかダイアログが出るのでリッチテキスト(html)にして変換。

f:id:sandai:20120612234855p:image


リッチテキストからmarkdownにするにはさっきのダイアログをmarkdownにする。

すると、

f:id:sandai:20120612234856p:image

こうして元に戻せる。

markdownで文書を編集、きれいにしたければリッチテキストに変換、また問題があればmarkdownに変換して文書を編集、といった使い方ができる。

若干最初と違いがあるのはPandocの仕様。複雑な構造部分も基本的には問題ない。

f:id:sandai:20120612234857p:image


まあ以前の使い回しなので変換するコードに特に手を入れなきゃいけない部分がなかったのもあってか問題はなかった。が、なんかいろいろめんどくさいことがあったけどそれはいいや。

とりあえずEvernoteのクライアントだけでMarkdownを使えるようになった!これでEvernoteでいろいろ書きやすくなると思う!

さらに、

を使えばショートカットでいけるようになると思うけど、試してない。また今度。


相互変換のために準備するもの

2つ必要。Pandocと相互変換するmadever.applescriptというスクリプト。


AppleScriptはAlfredでも呼び出せる。設定画面のFeaturesのAppleScriptsにチェック入れると表示されるけど、/Users/ユーザ名/Library/Scriptsだとうまく表示されなかった。ホームディレクトリに適当にフォルダ作って置けばみつかると思う。あとscptにすること。エディタで開いて別名で保存して、フォーマットをスクリプトにすればできる。

HomebrewからPandocをインストール

Pandocはいろんなテキストフォーマットのコンバータ。これを利用して変換作業を行なってますのでお手持ちのMacにインストール。Homebrewからインストールするには、まずhaskell-platformというのをインストール。

% brew install haskell-platform

結構時間かかるので待機。

完了したらcabalというHaskellのパッケージ管理システムを使ってPandocをインストール。RubyのgemのHaskell版みたいなもの。

% cabal update
% cabal install pandoc

インストールできたら.zshrcから$HOME/.cabal/binにパス通す。bashの人も適当にどうぞ。

PATH=$HOME/.cabal/bin:$PATH

記述して保存したらターミナルを再起動して、

pandoc -v

とすると、

% pandoc 1.9.4
Compiled with citeproc-hs 0.3.4, texmath 0.6.0.6, highlighting-kate 0.5.1.
Syntax highlighting is supported for the following languages:
    Actionscript, Ada, Alert, Alert_indent, Apache, Asn1, Asp, Awk, Bash,
    Bibtex, Boo, C, Changelog, Clojure, Cmake, Coffeescript, Coldfusion,
    Commonlisp, Cpp, Cs, Css, D, Diff, Djangotemplate, Doxygen, Dtd, Eiffel,
    Email, Erlang, Fortran, Fsharp, Gnuassembler, Go, Haskell, Haxe, Html, Ini,
    Java, Javadoc, Javascript, Json, Jsp, Latex, Lex, LiterateHaskell, Lua,
    Makefile, Mandoc, Matlab, Maxima, Metafont, Mips, Modula2, Modula3,
    Monobasic, Nasm, Noweb, Objectivec, Objectivecpp, Ocaml, Octave, Pascal,
    Perl, Php, Pike, Postscript, Prolog, Python, R, Relaxngcompact, Rhtml, Ruby,
    Scala, Scheme, Sci, Sed, Sgml, Sql, SqlMysql, SqlPostgresql, Tcl, Texinfo,
    Verilog, Vhdl, Xml, Xorg, Xslt, Xul, Yacc, Yaml
Copyright (C) 2006-2012 John MacFarlane
Web:  http://johnmacfarlane.net/pandoc
This is free software; see the source for copying conditions.  There is no
warranty, not even for merchantability or fitness for a particular purpose.

みたいに出てきたらうまくいってる。

なんのこっちゃお前なにいってんのかよくわからんぞボケという人は普通にダウンロード。

インストーラが助けてくれますんで誰でも導入できます。

もし.cabalやインストーラ以外のパスにPandocの実行ファイルがある場合madeverスクリプトの上部にそこまでのパスを書いてほしい。たぶんすぐわかると思う。

Markdown記法について

いくつか特殊というか、他のMarkdown記法と互換性のない記法が存在する。全てを把握できているかどうかはっきりテストしていないが、現在分かるものは次の通り。

  • 改行は半角スペース2つだけじゃなくて、バックスラッシュ(\)を使う
  • html→markdownにしたときにリストの間に不自然な行が入る
    • 特に問題はないのでそのままだがこちらで対応しようかどうか検討中
  • 引用のネスト時に1行余計に書く必要がある
    • これは言葉では表しにくい
  • プログラミングコードのシンタックスハイライトがある
    • 便利ではあるがhtml→markdown時に対応できない。どうしようか検討中
  • tableのalignがmarkdown→html→markdownに変換したとき無効になる
    • pandoc側のバグといっていいのか。ちょっとこれは調節するのが難しそう

とりあえず改行と引用だけ書き方を気をつければ良い。あと画像はEvernoteの関係でmarkdownやらhtmlやら変換していると無くなっちゃうので、画像なしで。

それ以外はだいたい安心できると思う。

まあちょこちょこ直していく。

引用の書き方

問題ない書き方はこれ。

> 引用のテスト 段落と同じような扱いを受けている。改行するときは末尾に□□

> と半角スペースを2つ入れることで改行になる

>

> Markdownで`1行`あけることで行が開く

>

> > ネストした引用のテスト

> >

> > > さらにネスト引用。ネストには一行あける必要がある

> > > これはPandocだけの仕様。普通にやるなら–strictを使う必要がある

>

> 引用された文章です 

>

> 引用された文章です

>

> ### hタグのテスト

>

> - リストのテスト1

> - リストのテスト2

問題が出る書き方

> 引用のテスト

> 段落と同じような扱いを受けている。改行するときは末尾に□□

> と半角スペースを2つ入れることで改行になる

>

> Markdownで`1行`あけることで行が開く

> > ネストした引用のテスト

> > > さらにネスト引用

> ネストした引用ではPandoc-1.9.4で正しく動作しない

>

> 引用された文章です 

>

> 引用された文章です

>

> ### hタグのテスト

>

> * リストのテスト1

> * リストのテスト2

ネストするとき気をつけて。あんまりやらないと思うけど。

2012-06-02

全部無料で。EvernoteにMarkdownで書いたCSS対応の文書を投稿するやり方

MacのEvernoteのクライアントは使いにくい。とくにMarkdownが使えないのは辛い。リッチテキストだって全然リッチにできない。もっときれいなデザインの文書を投稿したい。

そんなことを思っていて、じゃあMouというMarkdownエディタで書いた文書をEvernoteに保存できるようにしたらいいんじゃないか、という誰もが考えそうだけどあえて誰もやらなかった(めんどくさいから)であろうようなことをできるようにした。

結果的にどうなったかというと、下の画像のようなCSSでデザインされた文書をEvernoteに投稿できるようになった。

f:id:sandai:20120602015847p:image


デザインはMouで用意されているgithub.cssをそのまま割り当てている。

これはAppleScriptっていうマイナーな言語で書いたスクリプトを使う。ちょっと試験的なんだけど今回はそのスクリプトを公開。


必要なもの

Mouの文書をEvernoteに投稿するにはMouとその内容を投稿するスクリプトの2つ必要。

  • Mou
    • 無料のMarkdownエディタ。ヘタな有料のアプリより良かった
  • mouever.applescript
    • Mouで書いた文書をEvernoteに投稿するスクリプト。名前は適当
Mou
mouever.applescript

ちなみに私はAlfredというランチャーを使ってスクリプトを実行している。設定画面のFeaturesのAppleScriptsにチェック入れるとAppleScriptも表示されるようになる。(拡張子が.scptじゃないと見えないっぽいので注意)

実行方法についてはお好みで。


使い方

Mouで適当に文書書く書く。

f:id:sandai:20120602015848p:image


文書ができたらさっきダウンロードしたスクリプトを実行。

下の画像は/Users/ユーザ名/Library/Scripts/以下にmouever.scptを置いて、http://d.hatena.ne.jp/shinya_ohtani/20091109/1257777144の設定でメニューバーから実行しようとしている例。

f:id:sandai:20120602015849p:image


実行したときに「システム環境設定」の「ユニバーサルアクセス」で「補助装置にアクセスできるようにする」にチェックが入っていない場合、それの設定を促す案内が出てくるのでチェックを入れる。これをしないとうまいこと動作しないので注意。

そうしてしばらくするとダイアログが表示される。

このダイアログの「設定」ボタンで、

  • ノートの名前
  • 投稿先のノートブック
  • タグ

を設定することができる。

f:id:sandai:20120602015850p:image


適当に設定してみた。たぶんなんとなく使えると思うのでこのあたりの詳細は省く。

f:id:sandai:20120602015851p:image


投稿が完了すると完了のダイアログが表示されるので、これで終わり。

f:id:sandai:20120602015852p:image


投稿した文書のEvernoteでの画面。デザインそのまままんもすうれぴー。

f:id:sandai:20120602015853p:image


その他細かい部分も他人が使えるレベルにはしたので実用できると思う。


デザインカスタマイズ

投稿する文書のデザインを変更したい場合。スクリプトを直接いじる必要がある。スクリプトのソースコードの上らへんに下の画像のような部分があるのでここいじればいい。

f:id:sandai:20120602015854p:image


ただ、少し癖があるというか、いくつかの構造は特別に割り当てたりしているのでそのへんの仕組みを把握しないとうまくできない。というか私自身もめんどくさくてやっつけ。

ほんとはCSSファイル読み込むだけでできるようになりゃいいなとは思うけど時間かかりそうだからやめた。ある程度限定したフォーマットなら簡単に対応できるのだろうけど。

まあ、いろいろデザイン変えたくなったらそのうちちゃんと何かやるかも。


その他のMarkdown系のアプリでも使えるようにできる

このEvernoteにきれいな文書を投稿するスクリプトはどのエディタやアプリでも簡単に対応できると思う。というかできた。

というのも、Mouより先にMarkdown ProというMacの有料アプリを買ってて、書いたスクリプトはもともとMarkdown Pro用のスクリプトだった。で、後からMouに気づいて、スクリプト書き換えたらちょろかったので簡単だなーと。たぶん他のエディタでも似たような修正を加えればいける。

そういえば私は無料で済まなかったんだけどもまあいいや。自分好みのエディタで扱える方法についてもそのうちいつか書く。


Markdown記法早見表

おまけ。これだけ覚えれば問題ないという記法を自分用にまとめてたのでそれものせておく。

Markdown記法は同じ結果を出力するのに記法が違うときがあって、その場合簡単な書き方を採用している。

見出し
markdown表示html
# 見出し1

見出し1

<h1>見出し1</h1>
## 見出し2

見出し2

<h2>見出し2</h2>
### 見出し3

見出し3

<h3>見出し3</h3>
#### 見出し4

見出し4

<h4>見出し4</h4>
##### 見出し5
見出し5
<h5>見出し5</h5>
###### 見出し6
見出し6
<h6>見出し6</h6>
段落
markdown表示html
普通の文章です

普通の文章です

<p>普通の文章です</p>

普通の文章です
普通の文章その2です

普通の文章です 普通の文章その2です

<p>普通の文章です
普通の文章その2です</p>

この文は文末に半角スペースを2つ入れています
普通の文章その2です

この文は文末に半角スペースを2つ入れています
普通の文章その2です

<p>この文は文末に半角スペースを2つ入れています<br />
普通の文章その2です</p>

文末に半角スペースを2つ入れることで改行を表現することができる。全然知らなくてずっと悩んでた。

文字装飾
markdown表示html
*イタリック体*ですイタリック体です<em>イタリック体</em>です
*太字*です太字です<strong>太字</strong>です
***イタリック体と太字***ですイタリック体と太字です<strong><em>イタリック体と太字</em><strong>です
~~打ち消し線~~です打ち消し線です<del>打ち消し線</del>です
リンクとアドレス
markdown表示html

[googleへのリンク](http://google.co.jp/)です

googleへのリンクです

<a href="http://google.co.jp/ ">googleへのリンク</a>です

メールアドレスは<example@example.com>メールアドレスはexample@example.com

メールアドレスは<a href="example@example.com">example@example.com</a>

インラインコード
markdown表示html
文章中に`<li>`といったコードを表示する目的で使用します文章中に<li>といったコードを表示する目的で使用します文章中に<code>&lt;li&gt;</code>といったコードを表示する目的で使用します
`` `バッククォート` ``の表示方法です`バッククォート`の表示方法です<code>`バッククォート`</code>の表示方法です
リスト
markdown表示html
* リスト1
    * リスト1-1
        * リスト1-1-1
    * リスト1-2
* リスト2
  • リスト1
    • リスト1-1
      • リスト1-1-1
    • リスト1-2
  • リスト2
<ul>
<li>リスト1
<ul>
<li>リスト1-1
<ul>
<li>リスト1-1-1</li>
</ul>
</li>
<li>リスト1-2</li>
</ul>
</li>
<li>リスト2</li>
</ul>
1. リスト1
    1. リスト1-1
        1. リスト1-1-1
    2. リスト1-2
2. リスト2
  1. リスト1
    1. リスト1-1
      1. リスト1-1-1
    2. リスト1-2
  2. リスト2
<ol>
<li>リスト1
<ol>
<li>リスト1-1
<ol>
<li>リスト1-1-1</li>
</ol>
</li>
<li>リスト1-2</li>
</ol>
</li>
<li>リスト2</li>
</ol>
* リスト1
    * リスト1-1
        1. リスト1-1-1
        2. リスト1-1-2
        3. リスト1-1-3
    * リスト1-2
* リスト2
  • リスト1
    • リスト1-1
      1. リスト1-1-1
      2. リスト1-1-2
      3. リスト1-1-3
    • リスト1-2
  • リスト2
<ul>
<li>リスト1
<ul>
<li>リスト1-1
<ol>
<li> リスト1-1-1</li>
<li> リスト1-1-2</li>
<li> リスト1-1-3</li>
</ol>
</li>
<li>リスト1-2</li>
</ul>
</li>
<li>リスト2</li>
</ul>

箇条書きリストについては、*の他に、

  • +
  • -

などでも利用できる。

引用
markdown表示html
> 引用された文章です
> 引用された文章です

引用された文章です 引用された文章です

<blockquote>
<p>引用された文章です
引用された文章です</p>
</blockquote>
> 引用されたこの文は文末に半角スペースが2つ入れています
> 引用された文章です

引用されたこの文は文末に半角スペースが2つ入れています
引用された文章です

<blockquote>
<p>引用されたこの文は文末に半角スペースが2つ入れています<br />
引用された文章です</p>
</blockquote>

> 引用された文章です

> 引用された文章です

引用された文章です


引用された文章です

<blockquote>
<p>引用された文章です</p>
<p>引用された文章です</p>
</blockquote>

文末に半角スペース2つ入れることで改行を表現できる。最初は気が付かないこともあると思うので注意。

整形済みテキスト
markdown表示html
    行頭にタブか4つの半角スペースが入ってます
    行を続けるときもタブか4つの半角スペースをいれます
行頭にタブか4つの半角スペースが入ってます
行を続けるときもタブか4つの半角スペースをいれます
<pre>
<code>行頭にタブか4つの半角スペースが入ってます
行を続けるときもタブか4つの半角スペースをいれます
</code>
</pre>

表示されているものはこのブログで利用しているpre要素のCSS。デフォルトでこうはならない。

画像
markdown表示html

![alt属性のテキスト](https://www.google.co.jp/images/srpr/logo3w.png)

alt属性のテキスト
※表示が大きいので手を加えて小さく表示しています

<img src="https://www.google.co.jp/images/srpr/logo3w.png" alt="alt属性のテキスト" />

境界線
markdown表示html
---
<hr>

短かくて分かりにくいが<hr>タグ。最低ハイフンを3つ並べればhrになる。3つ以上でもhrになる。

markdown表示html
タイトル1 | タイトル2
------------- | -------------
筋肉愛    | 贅肉愛
蛋白愛    | 油愛
タイトル1タイトル2
筋肉愛贅肉愛
蛋白愛油愛
<table>
<thead>
<tr>
<th>タイトル1</th>
<th>タイトル2</th>
</tr>
</thead>
<tbody>
<tr>
<td>筋肉愛</td>
<td>贅肉愛</td>
</tr>
<tr>
<td>蛋白愛</td>
<td>油愛</td>
</tr>
</tbody>
</table>

markdownはこの他にもいくつか表を作成できる記法が存在するがどれも面倒なんで使わない方がいい。そもそも表自体が作るのめんどくさい。

2011-11-05

WEB+DB PRESS 総集編 [Vol.1~60]のPDFサイズがでか過ぎたからAutomatorとAppleScript使って圧縮した

でかすぎる。どうすればいいのかもふもふ調べていたら、

という記事を発見。これは素晴らしい。


MacだとAutomatorなるものを使えばPDFの画像を圧縮することが可能なようです。

で、そのサービスなのですが、上記のURLの文章中にあるんでありがたくダウンロードさせていただきまして。Automatorにサービスを登録します。登録方法については以下のURLをご覧ください。とはいえまあ普通に保存するだけです。

で、サービスを登録するとPDF選択時のコンテキストメニューから利用できるようになります。さっそくコンテキストメニューからサービスを実行してみたところ、

    • webdb_sp_vol01-24.pdf
    • 58.2MB→12.7MB
    • 78%減

よくやった。

で、他のファイルでもいくつかやってみたところだいたい約30〜60%減が最低ラインですね。画像が少ないとこんなもんでしょう。画像部分についてはiPhoneで確認したところ細かい文字も読むことができました。

ちなみにプレビュー.appで保存時にQuartz フィルタのReduce File Typeを使っても圧縮できるようですが、それだとやっぱり細かい文字はつぶれて読めませんでした。圧縮したときのサイズは上と同じファイルで9.7MBでした。


そういうわけでいざ全部圧縮しようと思ったらエラー。何がいけないのか分からんので、先ほどのワークフローを一部引用しつつ自分でアレンジしてみた。

  • 変更箇所
    • 1度に圧縮せずに1つ1つ圧縮するようにした
      • メモリが圧迫されるのでどうにかなるかと思ったらどうにもならずメモリパンパン意味なし。プロセスぷっつんしかないんかな。この辺の知識まったくない
      • 1つ1つの処理はループ使ってる。実はこれはAutomatorだとかなりやり辛い。Automatorのループは終了時の条件は制限があってこちらのタイミングで終わらすことができない。◯◯分後に停止ってのと、◯◯回で停止としてしか決定できない。あらかじめループ回数が決まってないと使えないという...。よって今回はプロセスぷっつんしたというゴリ押し
      • どうやらAutomator RunnerとAutomator Launcherがサービスを実行しているらしい。他にもなんかみかけたけどとりあえずまあいいや
    • オリジナルとサイズ比較して軽い方を残している
      • 圧縮したからといって軽くなるとは限らないので

そんなわけでワークフローは結局書いた意味がほぼなかったので公開しませんが、AppleScriptからシェルスクリプト実行のくだりだけ。

tell application "Finder"
    set len to length of (selection as list)
    if len = 0 then
        delay 3
        display dialog "圧縮作業が終了しました"
        do shell script "pids=(`ps -ef | grep -e'[A]utomator Runner' -e'[A]utomator Launcher'| awk  '{print $2}'`);for pid in ${pids[*]};do kill -9 ${pid};done"
    end if
end tell

こうやって実行できるAppleScriptすばらしい。


そんなわけで最終的にどうなったかというと、

2.85GB→1.97GB

となりました。約30%減。伸び悩んでます。まだ大きいです。テキストだけ抽出するというのはちょっと違いますからね...。このあたりで我慢するしかないかな。


AppleSctipt面白い

AppleScriptはシェルスクリプトも実行できるから便利。さらにtell application "System Events"でGUIのアプリも操作できるようで。正規表現が無いのが辛いけどperlやrubyやpythonで扱えるっぽい。詳しくは読んでないけど検索でひっかかってた気がする。

また、AutomatorもAppleScriptやシェルスクリプトを実行することができる。ループと変数が使いやすくなったら誰でも良いプログラミングできそう。

2011-11-03

MacBook AirのSSDを4GB(搭載RAMのサイズだけ)空きを増やす方法

64GBモデルの私にとって4GBは雀のげんこつぐらい大きい。あれ、げんこつでも結局小さいか。えーと、カモネギのネギぐらいの大きさですね。微妙ですね。で、sleepimageというやつを削除すれば搭載RAMのサイズだけ空きが増えるみたい。


sleepimageとは

private/var/vmにあります。不可視ファイルだっけかな。いつも全部可視化させてるので何が見えないファイルなのかよくわからないのですが。とりあえず詳細は以下を参照。

簡単に言うとスリープ中でバッテリーが切れたとき用のRAMのバックアップファイルみたい。あとAirの場合デフォルトのスリープ設定のままで、長時間スリープ状態から復帰させるときとかもこれ使うらしいです。

だから、これがなくなって困る人は常時スリープで時々バッテリー切れおこしてるairたんを持っている人とか、あと重要なデータをRAMにふらふらさせるのが好きな人とかでしょうか。

大事っちゃあ大事なのかもだけどどうでもいいっちゃあどうでもいいんじゃねえかという印象です。とりあえずちょっと消してみましょう。


sleepimageを削除

ターミナルから、

sudo rm /private/var/vm/sleepimage

で削除できます。が、削除しただけだと再起動したときやスリープしたときとかにまた生成されました。なので、

sudo pmset -a hibernatemode 0

とします。これで生成されません。スリープモードを変えたんですね。見事に4GB空きました。やったねたえちゃん。


ちなみに、元に戻す時は、

sudo pmset -a hibernatemode 3

とすれば戻ります。Airでは3がデフォのようです。


hibernatemodeとは

今日日のMacBookは、二種類のスリープを使い分けています。「サスペンション(suspension)」と「ハイバネーション(hibernation)」。前者はRAMに通電し、後者はRAMの内容をディスクに落とした上でRAMへの通電もやめます。そこまでは他のWintelノートと同じなのですが、Wintelノートではどちらにするか明示的に指定しなければならないのに対し、MacBookでは、スリープが一定時間以上続くと、スリープしている間にサスペンションからハイバネーションに切り替わります。

http://blog.livedoor.jp/dankogai/archives/51694301.html

ハイバネーションてwindowsでいうとこの休止状態みたい。サスペンションてのはサスペンド?だったらwindowsでいうとこのスタンバイ状態ですね。

それで、スリープが続くと途中でハイバネーションになるようです。デフォルトの設定では70分でハイバネーションになるんだそうで。私も数値を確認してみたところ同じでした。

確認はターミナルで、

pmset -g

でできます。詳細は、

こちらをみてください。


たとえばAirたんを電源入れたままいっつも閉じたりしている人はsleepimageあった方が良いですね。これはあれ。ハイバネーションが3ってのはデフォルトの設定で70分過ぎたらWindowsでいう休止状態に入るやつですよね。だから省電になるのです。そしてそのバイバネーションが0だとずーとスタンバイ状態なので省電じゃないわけです。

これはたぶん全国省電推奨hibernatemodeに限るの会の人たちにしてみれば、以下省略!


sleepimageそのものについては別に無くてもよさそうなので、スリープがスタンバイ状態でもいいということなら捨てればいいのではないでしょうか。

ちなみに私はhibernatemodeは3に戻しました。省電します。というかシャットダウンすりゃいいだけの話なのですが。Airはシャットダウンしても立ちあがりが早いから気にはならないんですけどね。

とりあえずまた4GB欲しくなったら0にします。


無駄に終わったのでちょっと調べた

3とか0とかなんなの!ってことで調べたら、

この値が0ならばハイバネーションせず通常のスリープのみ

この値が1ならば常にハイバネーションモードに入る

この値が3(デフォルト)ならば、通常のスリープとハイバネーションの複合モードに入る

http://d.hatena.ne.jp/riocampos/20080303/1204554071

とのこと。なるほど。

但し、ハイバネーションモードの変更は推奨しないと、man pmsetに書いてある。

どんな変更もサポートしないと。

変更するなら、以下3つのうちのどれかを推奨しているらしい。

くれぐれも、0・3・25以外を使わないようにしてくださいと。

http://d.hatena.ne.jp/zariganitosh/20110712/sleep_twice_free_memory

1は非推奨になったみたい。で、25がでてきた。25は簡単にいうとメモリを開放してからハイバネーションでスリープするタイプらしい。おお、結構いいじゃないっすか。いい仕事してるじゃないっすか25。現在はどうも0,3,25のどれかから選ぶってのが妥当みたい。

man pmsetでそれぞれ詳細が分かる。

SAFE SLEEP ARGUMENTS

hibernatemode takes a bitfield argument defining SafeSleep behavior. Passing 0 disables SafeSleep altogether, forcing the computer into a regular sleep.


0000 0001 (bit 0) enables hibernation; causes OS X to write memory state to hibernation image at sleep time. On wake (without bit 1 set) OS X will resume from the

hibernation image. Bit 0 set (without bit 1 set) causes OS X to write memory state and immediately hibernate at sleep time.


0000 0010 (bit 1), in conjunction with bit 0, causes OS X to maintain system state in memory and leave system power on until battery level drops below a near empty

threshold (This enables quicker wakeup from memory while battery power is available). Upon nearly emptying the battery, OS X shuts off all system power and hiber-

nates; on wake the system will resume from hibernation image, not from memory.


0000 1000 (bit 3) encourages the dynamic pager to page out inactive pages prior to hibernation, for a smaller memory footprint.


0001 0000 (bit 4) encourages the dynamic pager to page out more aggressively prior to hibernation, for a smaller memory footprint.


We do not recommend modifying hibernation settings. Any changes you make are not supported. If you choose to do so anyway, we recommend using one of these three set-

tings. For your sake and mine, please don't use anything other 0, 3, or 25.


hibernatemode = 0 (binary 0000) by default on supported desktops. The system will not back memory up to persistent storage. The system must wake from the contents of

memory; the system will lose context on power loss. This is, historically, plain old sleep.


hibernatemode = 3 (binary 0011) by default on supported portables. The system will store a copy of memory to persistent storage (the disk), and will power memory dur-

ing sleep. The system will wake from memory, unless a power loss forces it to restore from disk image.


hibernatemode = 25 (binary 0001 1001) is only settable via pmset. The system will store a copy of memory to persistent storage (the disk), and will remove power to

memory. The system will restore from disk image. If you want "hibernation" - slower sleeps, slower wakes, and better battery life, you should use this setting.


Please note that hibernatefile may only point to a file located on the root volume.

ああ、0はデスクトップ向けってことでしょうか。MacのデスクトップってiMacとか?macminiもかな?これらだとデフォルトで0なのかも。で、3はポータブルって書いてあるからAirだけじゃなくてProもデフォルトは3かな。25はpmsetから設定するよみたいな感じ。

あとの詳しいことは、

でどうぞ。気になるなら読んでみてください。


そういうわけで、

  • 0 : Sleep mode
    • 常にサスペンド状態でスリープ
  • 3 : Safe Sleep mode
    • サスペンンド状態から一定時間立ったらハイバネーションでスリープ
  • 25 : Deep Sleep mode
  • メモリを開放してハイバネーションでスリープ

といったようなことになるかと思われます。


いつもスリープにさせている場合でも0にして省電気にならなければ問題ないかも。ああ、電源が確保できないときはあれですが。というか外出時はスリープじゃなくて落としますからね。

sleepimage消したところですぐにどうこうなるわけでもないし、こいつはhibernatemodeを3や25にしたらすぐ出てくるヒモ野郎なんで消してもすぐ現れます。モブキャラですね。モブなのでお好きにどうぞ。


スリープを使い分けるAppleScript

それぞれのスリープモードを使い分ける方法もありました。

SSDの消耗云々を気にしない人はこれを利用すると使い分けられて便利かも。sleepimageが生成されたり消えたりだったことが裏で起きてますが。

でまあ、URL先のやつをもうちょっと使いやすくするためにAppleScriptを書いてみました。

on run
	set modelist to {"Sleep mode (hibernatemode 0)", "Safe sleep mode (hibernatemode 3)", "Deep sleep mode (hibernatemode 25)                                 "}
	set exp to "
Sleep mode : 常にサスペンド
Safe Sleep mode : サスペンドから一定時間でハイバネーション
Deep Sleep mode : メモリを開放してからハイバネーション
"
	choose from list modelist default items "Sleep mode (hibernatemode 0)" with prompt my check_mode() & "

【変更したいスリープモードを選んでください】" & exp with title "スリープモードの変更"
	
	if result is not false then
		set modetype to last item of words of (get item 1 of result)
		if (modetype = "0") then set modenum to modetype & " ; if [ -f /var/vm/sleepimage ]; then sudo rm /var/vm/sleepimage; fi;"
		if (modetype = "3") then set modenum to modetype
		if (modetype = "25") then set modenum to modetype
		
		try
			do shell script "sudo pmset -a hibernatemode " & modenum with administrator privileges
			display dialog "変更を完了しました
" & my check_mode() buttons {"OK"} default button "OK" with title "確認"
		on error
			display dialog "スリープモードの変更をキャンセルしました
" & check_mode() buttons {"OK"} default button "OK" with title "確認"
		end try
	end if
end run

on check_mode()
	set type to (get item 2 of words of (do shell script "pmset -g|grep hibernatemode"))
	set mode to ""
	if (type = "0") then set mode to "Sleep mode (hibernatemode " & type & ")"
	if (type = "3") then set mode to "Safe Sleep mode (hibernatemode " & type & ")"
	if (type = "25") then set mode to "Deep Sleep mode (hibernatemode " & type & ")"
	return "現在の設定は \"" & mode & "\" です"
end check_mode

スクリプトメニューとかから使えばスリープのモード変更できます。適当にどうぞ。