前後の日付を挿入

メモ帳みたいにF5で日付を入れられるようにしている。ただ、それだけだとメモ帳と大差ないので、universal-argumentで前後の日付も入れられるようにしてみた。日記を付けるときに便利。

(defun insert-date (&optional rel-day)
  "時刻を挿入"
  (interactive "*p")
  (let ((date (+ (get-universal-time) (if rel-day (* rel-day 86400) 0))))
    (insert (format-date-string *date-string* date))))

FireGestures向け タイトルとURLをコピー

すぐ見つからないので記録。一応、FireGestures :: Get Scriptsにもあるが、内容が異なるようだ。

var d = window._content.document;
var template= " "+d.title +" "+d.location.href;

var str = Components.classes["@mozilla.org/supports-string;1"].createInstance(Components.interfaces.nsISupportsString);
str.data = template;

var trans = Components.classes["@mozilla.org/widget/transferable;1"].createInstance(Components.interfaces.nsITransferable);
trans.addDataFlavor("text/unicode");
trans.setTransferData("text/unicode", str, template.length * 2);

var clip = Components.classes["@mozilla.org/widget/clipboard;1"].createInstance(Components.interfaces.nsIClipboard);
clip.emptyClipboard(clip.kGlobalClipboard);
clip.setData(trans, null, clip.kGlobalClipboard);

shortcutをpathの通った場所に作成する

windowsで、ショートカットをpathの通った場所に配置すると、名前を入力するだけで起動できて便利だ。
しかし、普通にショートカットを作ろうとすると、名前を変えたりコピーしたり、割と手間が多い。絶対パスエイリアスの指定だけで作りたい。


ショートカットを作成するコマンドはないようなのだが、調べると、コマンドラインでショートカットを作成、変更、表示するバッチファイルが公開されている。
これを使って、

REM make-shortcut.bat
@echo off
set target=%~f1
set workdir=%~p1
REM パスの通った場所を指定
c:
cd C:\Users\user\Documents\Shortcuts
shortcut /t:%target% /w:%workdir% %2.lnk

とすれば、目的を達成できる。

今年プレイしたフリーゲーム

感想は書いていなかったけれど、今年は第四回ウディコン参加作品を中心に多数プレイさせてもらっていた。せっかくなのでランキング形式で列挙してみる。ジャンル表記に情報が手に入るサイトをリンクしている。

(探索RPG) らんだむダンジョン
(国家運営RPG) ざくざくアクターズ
(定期更新) Sicx Lives
(CCG) COSMOSカードゲーム
(パズルSLG) 魔法百撰
(RPG) 百万迷宮
(戦略SLG) プラスチックレコード
(アトリエ系ARPG) 悠遠物語 〜空の大陸とアイテム屋さん〜
(生存SLG) 黒髪ロングJKサバイバルシミュレーション
(戦術SLG) 宇宙海賊王
(強制横スクロールRPG) 片道勇者
(パズルRPG) TWINGATE
(RPG) Labyrinth Star
(育成SLG) マッドプリンセス 〜ディオデラの野望〜
(CCG) デュエル・オブ・レジェンド
(パズル) ハンテンパズル
(パズルACT) Express
(縦スクロールRPG) 戦友(ともだち)100人できるかな?
(パズルACT) 病原体
(STG) カナタの空
(ARPG) Soul Steal〜Razlit Saga2
(STG) Panic Shooter
(探索SLG) グレーヒストリー
(RPG) 屍空列車
(RPG) 廻り巡る。
(RPG) 夜明けの口笛吹き
(RPG) CAPTCHA
(RPG) ダンジョンズ・オブ・アドヴェンチャラーズ!
(パネルRPG) プログレッシブ光の勇者達
(推理ADV) ドキッ! 女だらけの雪山殺人事件
(テキストADV) 架空共生層プレノード・オブジェクタ zero
(ACT) 灰かぶりの夜
(戦術SLG) 絆・正義 ハートコネクト
(レース) 13番目の黒猫
(ACT) Pox Bullet Night
(戦術SLG) 忠臣四十七士
(RPG) 魔導神器
(クリックパズルRPG) パラメータ
(Cゲームブック) THE DUNGEON DIVER
(定期更新) アクア=エリアス II リインカーネーション
(定期更新) DARK KINGDOM3
(ACT) STREET FIGHTER X MEGA MAN
(ACT) Rokko Chan
(TD) Family defenseII
(RPG) かいけつ!猫足乙女ちゃん
(討伐SLG) 王様はたいへん!
(探索RPG) 暗闇の迷宮
(パズルRPG) クリッククエス
(TD) とある世界の賢者と王子の大防衛戦
(ACT) Fastest Flyer
(RPG) ぼくは勇者じゃないよ
(RPG) AYND -Another Chapter-
(CCG) 秘境伝説ソーシャリアン
(パズルACT) ハム☆Pang!
(RPG) Angels&Manjyus
(パズル) 花ときのこの物語
(百歩RPG) 雪道
(パズル) マイグラフトン
(会話SLG) たゆみ。

おまけ

ランキングはxyzzyでソートして作成した。

(defun pred (a b)
  (lambda (a b) (yes-no-or-cancel-p "(A) ~a~%(B) ~a~% A > B ?" a b)))

(setq *list* (stable-sort (copy-list *list*) 'pred))

*list*に比較したいタイトルを入れて、ソートを実行して答えていけばランキングが作成できる。

各種ソート

ソートの動作を良く知らなかったので勉強。bubble-sort以外はM.Hiroi's Home Page / xyzzy Lisp Programmingから。ほぼ写経。bubble-sortは破壊的に動作し、他は新しくリストを作るので非破壊的。そのかわりコンシングが多い。

(defun bubble-sort (lst &optional (test '<))
  (let (p)
    (while (null p)
      (dotimes (i (1- (length lst)) (setq p (not p)))
        (when (funcall test (elt lst (1+ i)) (elt lst i))
          (rotatef (elt lst (1+ i)) (elt lst i))
          (setq p t)))))
  lst)
(defun quick-sort (lst &optional (test '<))
  (labels ((iter (l)
             (unless (atom l)
               (let ((p (car l)) l1 l2)
                 (dolist (a (cdr l) (nconc (iter l1) (cons p (iter l2))))
                   (if (funcall test a p) (push a l1) (push a l2)))))))
    (iter lst)))
(defun insert-sort (lst &optional (test '<))
  (labels ((iter (l r)
             (if (atom l)
                 r
               (iter (cdr l) (insert (car l) r))))
           (insert (a r)
             (cond ((atom r) (list a))
                   ((funcall test a (car r)) (cons a r))
                   (t (cons (car r) (insert a (cdr r)))))))
    (iter lst nil)))
(defun merge-sort (lst &optional (test '<))
  (labels ((iter (l n)
             (cond ((= n 1) (list (car l)))
                   ((= n 2)
                    (let ((x (car l)) (y (cadr l)))
                      (if (funcall test x y) (list x y) (list y x))))
                   (t (let ((m (truncate n 2)))
                        (merge (iter l m) (iter (nthcdr m l) (- n m)))))))
           (merge (l1 l2)
             (cond ((atom l1) l2)
                   ((atom l2) l1)
                   ((funcall test (car l1) (car l2))
                    (cons (car l1) (merge (cdr l1) l2)))
                   (t
                    (cons (car l2) (merge l1 (cdr l2)))))))
    (iter lst (length lst))))

順列の列挙

順列を列挙する関数が野暮用で必要になったが、すぐに書けなかったので書き方を調べた。要素を木構造にして深さ優先探索(DFS)で書けば良いらしい。簡単だね!

(defun permutation (args &optional num head res)
  (labels ((iter (args num head res)
             (if (and (plusp num) args)
                 (let (l)
                   (dotimes (i (length args) (apply 'nconc (nreverse l)))
                     (push (iter (nconc (subseq args 0 i) (subseq args (1+ i))) (1- num)
                                 (append head (list (elt args i))) res) l)))
               (nconc res (list head)))))
    (iter args (or num (length args)) nil nil)))

; N<5に対して実行するとき 6!=720, 7!=5040 8!=40320, 9!=362880 に注意しよう。
*(permutation '(1 2 3))
((1 2 3) (1 3 2) (2 1 3) (2 3 1) (3 1 2) (3 2 1))

*(permutation '(1 2 3 4) 2)
((1 2) (1 3) (1 4) (2 1) (2 3) (2 4) (3 1) (3 2) (3 4) (4 1) (4 2) (4 3))

おまけ

組み合わせの列挙。ほぼ同じ形で、前に登場した要素を使わなければ良いだけ。

(defun combination (args &optional num head res)
  (labels ((iter (args num head res)
             (if (and (plusp num) args)
                 (let (l)
                   (dotimes (i (- (length args) num -1) (apply 'nconc (nreverse l)))
                     (push (iter (subseq args (1+ i)) (1- num)
                                 (append head (list (elt args i))) res) l)))
               (nconc res (list head)))))
    (iter args (or num (length args)) nil nil)))

*(combination '(1 2 3 4 5) 2)
((1 2) (1 3) (1 4) (1 5) (2 3) (2 4) (2 5) (3 4) (3 5) (4 5))

参考:


ActionScript http://www.memorycraft.jp/2008/04/post-2.html


C 順列を列挙する - 自明でない日記


C#で順列(Permutation)と組み合わせ(Combination)をすべて列挙してみよう - Bug Catharsis


C++ 順列の生成方法を教えてください。


順列列挙 - Qiita


Haskell http://www.sampou.org/cgi-bin/haskell.cgi?Programming%3a%b6%cc%bc%ea%c8%a2


エクセルで順列の列挙 - オフィス系ソフト 解決済み| 【OKWAVE】


順列の列挙の方法 -順列の列挙の方法といっても辞書式順序のやつではあ- 数学 | 教えて!goo


C# http://nekoaruki.com/csharp/combination-permutatio