Category Archives: 未分類

2011-12-02

Emacs Lispの書き方が分からない

Emacs Lispってたまに書くけど、いまだにちゃんとした書き方がよく分からない。

例えばバッファ内を正規表現検索してマッチした文字列からなるリストを作りたいとき。

(save-excursion
  (let (result)
    (while (re-search-forward "[0-9]+" nil t)
      (setq result (append result (list (match-string 0)))))
    result))

毎回appendするのは効率が悪そう。

(save-excursion
  (let (result)
    (while (re-search-forward "[0-9]+" nil t)
      ;;↓(require 'cl)していいなら(push (match-string 0) result)
      (setq result (cons (match-string 0) result)))
    (nreverse result)))

一番書きやすそうなコードだけど、reverseするくらいなら最初から後ろへつなげていけば良いんじゃね?

(save-excursion
  (let (head tail)
    (while (re-search-forward "[0-9]+" nil t)
      (let ((number (match-string 0)))
        (if tail (setq tail (setcdr tail (list number)))
          (setq head (setq tail (list number))))))
    head))

一番最初headもtailもnilから始まるのがやっかい。ループの中で毎回nil判定するのは無駄。

(save-excursion
  (if (re-search-forward "[0-9]+" nil t)
      (let* ((head (list (match-string 0)))
             (tail head))
        (while (re-search-forward "[0-9]+" nil t)
          (setq tail (setcdr tail (list (match-string 0)))))
        head)))

時間的な効率は良さそうに見える(要検証)けど、re-search-forwardやmatch-stringを二回書かなきゃいけないのがイヤな感じ。

というわけで、結局どう書くのが一番良いのかいまだに分からない。実行速度なんかはちゃんと検証した方が良いんだろうなぁ。

clとかあまり使ったこと無いし、マクロとかもほとんど使ったこと無い。たまに書くだけだからまだまだ知らないことが沢山あるなぁ。そういえばclって積極的に使って良い物なの? 上の例でもpush使おうか迷ったんだけど……。

普段Lispを使っている方はこういうときどう書くんでしょう。

2011-11-29

間取りゲー

この発想はなかった。

この手の図面って見てるだけでワクワクしちゃうよね。

似たようなゲームはなかったのかなと調べてみたら、少し形態は違うけどMADRISMというXboxインディーズゲームがあったらしい。

キッチン多すぎ(笑) 2LDKとかいって消えていくところが可笑しい。

四畳半神話体系のEDを連想したり。

2011-11-28

ZEBRAのサラサ

だいぶ前に何種類か買ったボールペンの中で、気がつけばサラサばかり使っていることに気がついた。書き味がなめらかで気持ちがいい。今持っているのは0.4mmの2色+シャーペンと0.5mmのブルーブラック。0.5mmの黒を買おう。

2011-11-23

FirefoxのサイドバーでGoogle Readerを開いて縦型配置にする(iPhone用では無くPC用で)

この間Google Readerのデザインが変わったので以前のこれを作り直した。一応忘れないように記録しておく。

サイドバーで開くこと自体は標準的な機能で可能。ブックマークのプロパティで「このブックマークはサイドバーに読み込む」をチェックすれば良い。レイアウトの都合でブックマークツールバーを使いたくなければCustom Buttons拡張を使うと良い。CodeがopenWebPanel("GReader", "http://www.google.co.jp/reader/");なボタンを追加するだけ。

サイドバーで開いただけだと狭すぎて使い物にならない。なのでStylish拡張で次のユーザースタイルシートを設定する。

@namespace url(http://www.w3.org/1999/xhtml);

/* Vertical Google Reader for Firefox Sidebar */
@-moz-document url-prefix(http://www.google.co.jp/reader/) {
  /* Google Bar */
  div#gb { display: none !important;}
  /* Top Bar */
  div#top-bar { height: 30px !important;}
  #logo-container {
    display: none !important;
  }
  div#search {
    margin-left: 0 !important;
    padding: 0 !important;
  }
  input#search-input { width: 100px !important;}
  /* Navi */
  span#lhn-add-subscription {
    margin-left: 0 !important;
  }
  div#scrollable-sections { height:400px !important; }/*画面サイズに合わせて調整すること*/
  div.search-restrict { width: 32px !important;}
  div#nav {
    float: none !important;
    width: 100% !important;
  }
  div#lhn-add-subscription-section {
    height: 32px !important;
  }
  /* chrome */
  div#chrome {
    margin-left: 0 !important;
    width: 100% !important;
    min-width: 0 !important;
  }
  /* viewer header */
  div#viewer-header {
    margin: 0 !important;
    height: auto !important;
  }
  div#viewer-top-controls-container {
    position: static !important;
    margin: 0 !important;
    height: auto !important;
  }
  #viewer-top-controls > div, #viewer-top-controls > span {
    margin-right: 1px !important;
  }
  div#entries {
    padding-right: 0 !important;
  }
}

未読をタブで一気に開きたいので、Greasemonkey拡張でGoogle Reader - Open all unread buttonスクリプトを入れる。なぜかサイドバーではうまく動かない(何かクリックしただけですぐサイドバーではない方のウィンドウでGoogle Readerが開いてしまう)のでスクリプトに次の修正をする。外部jsファイルを読み込んでいる部分を削除し、読み込んでいるjsファイル(jquery, jquery-ui)を直接スクリプトの中に埋め込む。具体的にはmain関数の中のoau_loadJs(~oau_GM_wait();をコメントアウト。その直後に setTimeout(function(){oau_process();}, 100); を追加。ファイル最後にあるmain関数の外からファイル末尾までの三行をコメントアウト。その直後にmain();を追加。ファイル先頭のコメントの直後にjquery.min.jsとjquery-ui.min.jsの中身を挿入。そうすると、なんとかサイドバー内で使えるようになる。(Google Reader - Open all unread buttonのVersion: 0.3.1で確認)