2013/04/25

CSS の margin パラメータ数の違い

たまに CSS を書くと毎回忘れているのでメモです。

margin、padding、border などに適用するときの、上下左右の指定方法です。

  • パラメータ4つ margin: U R D L
  • パラメータ3つ margin: U RL D
  • パラメータ2つ margin: UD RL
  • パラメータ1つ margin: ALL

未だに、3つ指定したときのが覚えられない…

2013/04/23

Pyhton で JPEG画像を添付してメールを送信

前回の、

Pyhton で GMail の smtp で UTF-8 なメールを送信

のつづきです。

今回は JPEG画像を添付してメールを送ります。

テキストだけのメールであれば MIMEText()で用意したメッセージだけでいいのですが、添付ファイルをつけるとそれ以外に2種類のメッセージが必要になります。

  • 本文テキスト用 MIMEText()
  • 添付ファイル用 MIMEImage()
  • コンテナ用 MIMEMultipart()

ここで、添付ファイル用のメッセージはファイルごとに必要です。 ですので、添付画像が1つであっても合計で3つのメッセージが必要ということになります。

コンテナ用のメッセージの中に、他の2種類を格納して送信します。FromTo を設定するのは、コンテナ用のメッセージに対して行います。

2013/04/19

Elisp のトグル動作や内部カウンタはクロージャを使う

よく忘れるので、メモしておきます。

トグル動作をさせたい場合や、内部のカウンタを使いたいときは、スタティック変数が欲しいところです。 Emacs Lisp ではクロージャを使えば可能です。

(defun cage1 ()
  (lexical-let ((v 0))
    (defun func1 ()
      (setq v (1+ v)))))   ; C-x C-e

これを評価すると、cage1 という関数が定義されます。しかし cage1 関数自体はコールされてないため、cage1 の中にある func1 関数はまだ未定義です。 なので、func1をコールしたいと思っても、

(func1)    ; C-x C-e

Debugger entered--Lisp error: (void-function func1)
  (func1)
  eval((func1) nil)
  eval-last-sexp-1(nil)
  eval-last-sexp(nil)
  call-interactively(eval-last-sexp)
  eval-region-or-last-sexp()
  call-interactively(eval-region-or-last-sexp nil nil)

となり、エラーが発生します。

一旦 cage1 をコールしてやれば、 func1 が定義されるので、それ以後は問題なく func1 をコールできるようになります。

(cage1)    ; C-x C-e

(func1)    ; C-x C-e
=> 1
(func1)    ; C-x C-e
=> 2
(func1)    ; C-x C-e
=> 3

ここでもし 変数 v がグローバル変数なら、外から値を変更できてしまいます。しかし、この v はレキシカル変数(この場合 cage1 内部にある、一種のローカル変数)なので、外から変更できません。

外から変更しようとして、下のようにしても

(setq v 100)  ; C-x C-e

(func1)       ; C-x C-e
=> 4
(func1)       ; C-x C-e
=> 5

というぐあいに、func1 が 101, 102, ... を返したりはせず、カウンタの動作として正しい値をカウントし続けます。

つまり、100 を setq した vfunc1 がカウンタに使っている v は別物ということです。

カウンタではなく、トグル動作にしたい場合は

(defun cage1 ()
  (lexical-let ((v nil))
    (defun func1 ()
      (setq v (not v)))))

とします。

2013/04/17

Google の Custom Search Engine で画像を検索するサンプル

Python から Google の Custom Search Engine を使って画像を検索するときに、いくつかハマりどころがありましたのでメモを残します。

あらかじめ、ライブラリはインストールしておきます。Python 用のライブラリのインストール等については、このあたりを参照するといいと思います。

あと、GoogleのID などはあらかじめ取得しておき、Google API コンソールを使える状態にしておきます。

つぎに、APIキーが必要です。ここの 左ペインの API Access をクリックし、下の方にある API key: と書かれている 39文字の文字列がそれです。これをどこかにコピペしておき、あとで API を使うときに developerKey パラメータとして指定します。

つぎに、専用の検索エンジンの設定を作ります。http://www.google.com/cse/all に行って検索エンジンを追加し、検索するサイトを *.jp とかにしておきます。

作成ボタン > コードを取得ボタン と押していくと、JavaScriptのコードが表示されます。このコードの var cx = 'XXXX' というのが 検索エンジンID です。 このIDをどこかにコピペしておき、あとで APIをコールするときに cx パラメータとして指定します。

つぎに、左ペインの 検索エンジンの編集 の下にあるプルダウンメニューで先ほど作成した検索エンジンを選択します。画像を検索したい場合は、ここで下図のように、画像検索をオンしておく必要があります。

画像検索をオン

あとは、下にあるコードをファイルに保存し、先ほどコピペした2つの文字列をコードに埋め込みます。

参考リンク

2013/04/15

BloggerにGistを貼り付けると、前後に空行が入ってしまう

いつのころからか、ブログに Gist を貼り付けると、前後に5行ほど空行が入ってしまうようになりました。

といいますか、行番号の対応がずれてしまうのか、とにかく見栄えがよくありません。

before

対策としては、ココ によると、CSS を追加してやれば良さそうです。

以下は Blogger での手順です。


1.Blogger にログイン

2.テンプレート > カスタマイズ > 上級者向け > CSS を追加 とたどり、下記を入力

/* for Gist */
.line-numbers, .line-pre > .line {
    font-size: 12px;
    line-height: 1.4;
}

3.「ブログに適用」ボタンを押す。


以上です。これで、下のようになりました。

after

フォントも小さくなって、いい感じです。

なお、CSS のクラス名はときどき変わるようなので、もしまた崩れたら見直す必要がありそうです。

参考にさせてもらったサイト

Pyhton で GMail の smtp で UTF-8 なメールを送信

Python でメールを送信すること自体は簡単です。

しかし、GMail のSMTPサーバーを使ったり、日本語のメールを送信しようとすると、ちょっとコツがいります。

いつも忘れてしまうので、サンプルとして残しておきます。

考えなければならないことは、

  • 要ログイン (user, pass)
  • 要SSL (port 587)
  • 要STARTTLS
  • MIMEText は 要エンコード(UTF-8等)

あたりでしょうか。

2013/04/12

MYO:腕の筋肉の動きを検知するコントローラ

myo

MYO:THE NEXT GENERATION OF GESTURE CONTROL がとても気になります。

APIが公開されるというのもいいです。

スティーブ・ウォズニアックのコメントにもシビレました。

発売は来年の予定らしいですが、未来が買えると思えば、$149は破格に思えます。

2013/04/11

Google の検索結果に表示される 著者の写真を非表示に

検索結果に表示される、ページの著者の写真を消したいという話しです。

たぶん1年ほど前からではないかと思うのですが、検索結果にそのページの著者のサムネイル画像が表示されるようになりました。

before

検索するたびに、知らない人の顔がずらっと表示されるのは、ちょっと疲れます。

著者の方々には申し訳ないのですが、ブラウザのカスタムCSSを使って、この写真を非表示にしたいと思います。

まずは Google Chrome の場合です。

Chrome のカスタムCSSの場所は下記にあります。

Mac OS X
~/Library/Application Support/Google/Chrome/Default/User StyleSheets/Custom.css

Windows 7, Vista
C:\Users\<ユーザー名>\AppData\Local\Google\Chrome\User Data\Default\User StyleSheets\Custom.css

Windows XP
C:\Documents and Settings\<ユーザー名>\Local Settings\Application Data\Google\Chrome\User Data\Default\User StyleSheets\Custom.css

ただし、これらは隠しフォルダの中にあるので、ターミナルやコマンドプロンプトを使わないと見つけられないかもしれません。コマンドラインが苦手な場合は、Stylist などの機能拡張を使うと楽です。

あとは、この Custom.css ファイルを開き、下記の1行を追加して保存するだけです。

[id^=apthumb] { display: none; }

これで、次回の検索から著者の写真が非表示になるはずです。

after

次に Safari (Mac) の場合です。

Safari も同じようにできますが、ファイルの指定方法が若干異なります。

Safari の場合は、上記の1行を書いたファイルを適当な名前で保存しておき、Safari > メニュー > 環境設定 > 詳細タブ > 「スタイルシート」プルダウンメニュー > 「その他...」と辿り、そのファイルを選択します。

Safari の場合は、上記操作の直後にサムネイル画像が非表示になります。

また、CSS3に対応していない古いブラウザでもできそうですが、その場合は、(すこし力技ですが)下記のようにすればいいと思います。

#apthumb1,#apthumb2,#apthumb3,#apthumb4,#apthumb5,#apthumb6,#apthumb7,#apthumb8,#apthumb9,#apthumb10 {
    display: none;
}

Mac の Safari で Backspace (DEL) キーで前のページに戻るようにする

最近の Safari は なぜか Backspace (DEL) キーで前のページに戻ることができないです。

下記をターミナルで実行したあと、Safari を再起動すると希望の動作になると思います。

$defaults write com.apple.Safari com.apple.Safari.ContentPageGroupIdentifier.WebKit2BackspaceKeyNavigationEnabled -bool YES

関係しそうなバージョン

  • Safari 6.0.3
  • OS X 10.8.3 (Mountain Lion)

参考にさせてもらったサイト

2013/04/10

Spotlight を grep find の代わりに

ack を入れてはみたものの、Mac では Spotlight があるのでもっと速いのできそうな気がしました。

Spotlightのコマンドライン版である mdfind で grep find の代わりになるシェルスクリプトを書いてみました。

gという名前で保存し、chmod +x して

カレントディレクトリで文字列'hoge'を検索
$g hoge

ディレクトリ'doko'で文字列'hoge'を検索
$g hoge doko

ルートディレクトリで文字列'hoge'を検索
$g hoge /

というぐあいに使います。

インデックスができていないと使えないのですが、Sportlightのインデクシングは素早いので個人的には十分実用になっています。

ack を MacPorts で入れてみる

better than grepなackを試してみた を読んで ack の存在を知りました。

brew でインストールすると楽そうなのですが、あえて MacPorts でやってみました。

ですが、正直めんどいですし特にいいこともないので、素直に brew か curl で入れたほうがいいと思います。

それでもやっぱり MacPorts の方がいいという粋な方は以下をどうぞ。

まずは、これです。

$sudo port install p5-app-ack

これまた、ちょっと変な名前ですが、CPANモジュール的命名ということで気にしない(^^; で、入ってるだろうということで、試してみても

$ack
-bash: ack: command not found

という感じで怒られます。

しかたないので、どこに入ったか調べます。

$port contents *app-ack
Port p5-app-ack contains:
  /opt/local/share/doc/p5-app-ack/README
Port p5.8-app-ack is not installed.
Port p5.10-app-ack is not installed.
Port p5.12-app-ack contains:
  /opt/local/bin/ack-5.12
  /opt/local/lib/perl5/vendor_perl/5.12.4/App/Ack.pm
  /opt/local/lib/perl5/vendor_perl/5.12.4/App/Ack/Plugin.pm
  /opt/local/lib/perl5/vendor_perl/5.12.4/App/Ack/Plugin/Basic.pm
  /opt/local/lib/perl5/vendor_perl/5.12.4/App/Ack/Repository.pm
  /opt/local/lib/perl5/vendor_perl/5.12.4/App/Ack/Resource.pm
  /opt/local/lib/perl5/vendor_perl/5.12.4/darwin-thread-multi-2level/auto/ack/.packlist
  /opt/local/libexec/perl5.12/ack
  /opt/local/share/perl5.12/man/man1/ack.1pm
Port p5.14-app-ack is not installed.
Port p5.16-app-ack is not installed.

ということで、/opt/local/bin/ack-5.12 が実行ファイルっぽいので、これをパスの通ったところにSymリンクしておきます。

$sudo ln -s /opt/local/bin/ack-5.12 /usr/local/bin/ack

これでやっと使えるようになりました。

$ack --version
ack 1.96
Running under Perl 5.12.4 at /opt/local/bin/perl5.12

Copyright 2005-2011 Andy Lester.

This program is free software.  You may modify or distribute it
under the terms of the Artistic License v2.0.

テストです。

$ack --nogroup defvaralias
auto-complete/auto-complete.el:139:(defvaralias 'ac-user-dictionary-files 'ac-dictionary-files)
auto-complete/auto-complete.el:167:(defvaralias 'ac-candidate-menu-height 'ac-menu-height)
auto-complete/auto-complete.el:178:(defvaralias 'ac-quick-help-prefer-x 'ac-quick-help-prefer-pos-tip

OKそうです。ふー。

というわけで、今のところ MacPorts で ack を入れるのはちょっとめんどくさいという話しでした。

C-u つきの query-replace は正規表現で

  • M-% で、ふつうの置換(query-replace)
  • C-u M-% で、正規表現で置換(query-replace-regexp)

というふうにしたいです。

(defun my-query-replace (arg)
  (interactive "P")
  (let ((current-prefix-arg nil))
    (call-interactively
     (if arg 'query-replace-regexp 'query-replace))))

xyzzy でもこんなのを書いたような…。

Python でもスクラッチバッファで対話したい

果てしなく車輪の再発明っぽいのですが、Emacs の Python の対話環境をでっちあげてみました。

リージョンを選択して M-x eval-region-python すると、評価結果をカーソル行の下に挿入します。雰囲気としては Lisp Interaction モード で C-j したときのような感じです。

(defun eval-region-python (beg end)
  (interactive "r")
  (insert (with-output-to-string
            (shell-command-on-region beg end "python" standard-output))
      "\n"))

ちなみに、結果をスクラッチバッファに出さずに、slime っぽく別のウィンドウに表示する場合は下記のように。

(defun eval-region-python (beg end)
  (interactive "r")
  (let ((buf "*Py Output*")
        (curwin (selected-window)))
    (shell-command-on-region beg end "python" buf)
    (pop-to-buffer buf)
    (select-window curwin)))

こういうのをスクラッチバッファのメジャーモードを検知してすべての言語に対応してやれば、最強のスクラッチバッファになるかも…。

参考にさせてもらったページ

コード片を Markdown 向けに

コードスニペットを Markdown にしてブログに貼り付けることが多いので、こんなのを使っています。

(defun markdown-code-region (beg end)
  (interactive "r")
  (save-excursion
    (save-restriction
      (untabify beg end)
      (narrow-to-region beg end)
      (goto-char (point-min))
      (while (search-forward-regexp "\\(^.*\\)" nil t)
        (replace-match (concat "    " (match-string 1)))))))

リージョンを選択して M-x markdown-code-region すると、それぞれの行頭にスペースを4つづつ入れます。

2013/04/09

Mac のターミナルでスクロールバッファをクリアする

よく忘れるので、メモしておきます。

  • Cmd + k
  • メニュー > Edit > Clear All

で、スクロールバッファをクリアできます。

Mac 標準のターミナル.app でも iTerm でも同じようです。

ちなみに Ctrl + l はプロンプト行をターミナルの先頭に移動するだけで、スクロールバッファはクリアしません。

2013/04/04

モードラインにファイルのフルパスを表示

Emacs のモードラインの左部分にはバッファ名が表示されています。

この部分を左クリックしたら一定時間だけファイルのパス名が表示されるようにしてみました。 ついでにクリックと同時にパス文字列をキルリングにコピーします。

下記は powerlineでの表示例です。

普段はバッファ名が表示されているけど… モードラインにバッファ名を表示

左クリックするとフルパス表示に切り替わる モードラインにパスを表示

(defvar mode-line-buffer-fullpath
  (list 'buffer-file-name
        (propertized-buffer-identification "%12f")
        (propertized-buffer-identification "%12b")))

(add-hook 'dired-mode-hook
          (lambda ()
            ;; TODO: handle (DIRECTORY FILE ...) list value for dired-directory
            (setq mode-line-buffer-identification
                  ;; emulate "%17b" (see dired-mode):
                  '(:eval
                    (propertized-buffer-identification
                     (if (< (length default-directory) 17)
                         (concat default-directory
                                 (make-string (- 17 (length default-directory))
                                              ?\s))
                       default-directory))))))

(setq  mode-line-buffer-default mode-line-buffer-identification)

(defun show-mode-line-fullpath (event)
  (interactive "e")
  (when (buffer-file-name)
    (select-window (posn-window (event-start event))) ; activate window
    (let ((wait-sec 5))
      (setq mode-line-buffer-identification mode-line-buffer-fullpath)
      (force-mode-line-update)
      (my-copy-buffer-file-name)                      ; copy path string to killring
      (sit-for wait-sec)
      (setq mode-line-buffer-identification mode-line-buffer-default)
      (force-mode-line-update)
      (message ""))))

(define-key mode-line-buffer-identification-keymap [mode-line mouse-1] 'show-mode-line-fullpath) ; left click
(set-face-attribute 'mode-line-highlight nil :box nil) ; remove box when hover mouse

(defun my-copy-buffer-file-name ()
  "copy buffer-file-name to kill-ring."
  (interactive)
  (let ((fn (unwind-protect
                (buffer-file-name)
              nil)))
    (if fn
        (let ((f (abbreviate-file-name (expand-file-name fn))))
          (kill-new f)
          (message "copied: \"%s\"" f))
      (message "no file name"))))

この例では5秒間表示されます。表示時間は wait-sec で変更します。

なお、一定時間表示ではなく、クリックするたびに表示をトグルしたい場合は、show-mode-line-fullpath の代わりに下記の toggle-mode-line-fullpathdefine-key するといいです。

(defun toggle-mode-line-fullpath ()
  (interactive)
  (setq mode-line-buffer-identification
        (if (string= (format "%s" mode-line-buffer-identification)
                     (format "%s" mode-line-buffer-fullpath))
            mode-line-buffer-default
          mode-line-buffer-fullpath))
  ;; (force-mode-line-update)
)

参考リンク

2013/04/01

Finder に 「上へ」ボタンを

Up button screenshot

Mac OS X の Finder には「上の階層へ」ボタンがありません。Windows の Explorer も 7 あたりからこのボタンがなくなってしまいましたが、無いとちょっと不便なこともあります。

AppleScript で工夫されている方もおられるようですが、せっかくなので Mac のアプリとして作成してみました。

下記にパッケージを置いています。

pkg ファイルなのでインストーラが起動します。インストールできたら、Finder でアプリケーションフォルダを開いて 「Up」という上矢印のアイコンを Finder の上部にドラッグアンドドロップすれば使えるようになります。

しくみは Finder に Cmd + を sendkeys しているだけですので、このキーをリマップしていたり無効化していると動作しないです。

ソースは github に置いてあります。

アイコンが気に入らない場合は、up.iconset フォルダの中にある png を差し替えてビルドしなおせばOKです。

わずか34行のスロッピーコードなので、煮るなり焼くなりご自由に。

OS X 10.8.2 (Mountain Lion) と XtraFinder の組み合わせで動作を確認済みです。

以下余談です。

AppStore に置いてもらうためにいろいろな実装方法を試してみたのですが、結局どれも SandBoxing と Entitlement で武装したレビュア陣には勝てませんでした。

Developer Support の外人さんには1ヶ月ほどメールで相談させてもらったのですが、やはり他のアプリを外から操作するのは Sandbox的にはご法度らしく、いくつか提案してもらった API では実現出来ませんでした。

このままHDDの肥やしにしておくのもちょっともったいないと思ったので、最も動作が軽くて単純な実装を、野良で置くことにしました。

はぁー、AppStore 過酷っす。

パトラッシュ、ぼくはもう疲れたよ。