Author Archives: misohena

2018-12-21

Windows上のEmacsでhelm-locateを使う(Windows Searchで)

helm-locateはWindowsではes.exe(Everything)を使うようになっています。

しかしWindowsでは標準でWindows Searchという検索エンジンが入っています。これが使えればわざわざ機能が被る別アプリ(サービス)を入れる必要は無くなります。Windows Searchは重いというのでOFFにしている人もいると思いますが一応標準で入っているものですし一時的にインデックスを停止することも出来るのでそれほど嫌がるものでもないと思います。

先日、helmからWindows Searchでファイル検索できるhelm-windows-searchを作成したのですが、helm-locateはhelm-find-filesから呼び出せるようになっている(C-x C-fで開いた後もう一回C-x C-fで開く)のでhelm-locate自体もEverythingではなくWindows Searchで動くようになっていれば便利そうだなと思いました。

方針としては、Emacs Lispとadoquery.exeで可能な限りlocateコマンドをエミュレートすることにします。

helm-locateでlocateコマンド(またはes.exe)を起動しているのはhelm-locate-init関数です。 この関数はコマンドラインの作成とプロセスの起動をまとめて行っています。 コマンドラインの作成部分だけ差し替えることは出来ないので、関数を丸丸置き換えることにします。

というわけで、先日のHelm Windows Searchhelm-locate-windows-search.elを追加しました。これをロードパスの通ったところに置き、adoquery.exeを同じディレクトリかまたはパスが通ったところに置き、次の設定をするとhelm-locate-initが置き換わります。

(autoload 'helm-locate-windows-search-setup "helm-locate-windows-search")
(with-eval-after-load "helm-locate" (helm-locate-windows-search-setup))

<helm prefix> l やC-x C-f C-x C-f でhelm-locateが開き、そこでWindows Searchを使った検索が出来ます。ただしlocateをエミュレートしているため、Windows Searchの複雑なクエリは書けません。 -bオプションでファイル名だけのマッチが出来るくらいでしょうか。

別にlocateコマンドにこだわる必要も無さそうなのでhelm-locate全体をhelm-windows-searchで置き換えてしまっても良いかもしれません。その場合は次のようにしてhelm-locate-1関数をhelm-windows-search-1関数へ置き換えてしまえばOKです。

(with-eval-after-load "helm-locate"
  (fset 'helm-locate-1
        (lambda (&optional localdb init from-ff default)
          (require 'helm-windows-search)
          (helm-windows-search-1 init default)))

locateコマンドではローカルDBが使えますがWindows Search(やEverything)ではできません。その代わりWindows Searchでは検索するディレクトリを限定する機能(SCOPEやDIRECTORY)があるのでうまく使いたいところですがどうにもうまくハマらなかったので実現出来ていません。

2018-12-20

Emacs Helm から Windows Search を使う

HelmからWindows Search(Windowsデスクトップサーチ)を利用するelisp helm-windows-search.elを作りました。

(日本語が通らない場合はfakecygptyなどstart-processをフックしている設定が無いか確認してください)

最近ようやくAnything.elからHelmへ移行したのですが、設定を見直しているときにWindows Searchするコードを見つけてそういえばそんなものを作ったなぁと思い出したのでした。

要するに使っていなかったのですが、色々調べていくうちにもう少し使いやすく出来そうだなと思ったので手を加えてみました。

exe部分は汎用的なADOアクセスラッパーになっていて、elispの方からSQLクエリを作成するので後から色々融通が利きます。

とりあえず次のようなクエリを書けるようにしてみました。

  • apple banana orange
  • "you're looking for"
  • author:misohena
  • title:hello\ world
  • size:>1000000000
  • date:2017-10-20..2018-3
  • kind:folder hogeprojectdir
  • kind:music hogehoge
  • ext:mp3
  • filename:happy.txt
  • contents:brabrabra
2018-12-18 ,

コマンドラインから Windows Search で全文検索

以前 anything.elでファイル検索(Windowsの場合) という記事でADO経由で検索するプログラム(20100701_winsearch.cpp)を作ったのですが、もう少し汎用的なものを作ってみました。

misohena/adoquery: Windows ADO Query Command

これ(adoquery.exe)を使うとSQLベースクエリを直接書けます。

例えば

  • ファイル名にhelloを含む
  • テキストカラム(タイトルや内容)にhelloを含む

ファイルを検索するには次のようにします。

adoquery /conn "Provider=Search.CollatorDSO;Extended Properties='Application=Windows';" /query "SELECT TOP 10 System.ItemFolderPathDisplay, System.FileName FROM SystemIndex WHERE (System.FileName Like '%hello%') or Contains('hello')" /format "%1%\\%2%" /header ""

SQLの詳しい書き方は次のページに書いてあります。

Querying the Index with Windows Search SQL Syntax - Windows applications | Microsoft Docs

Using SQL and AQS Approaches to Query the Index にも書いてありますが、クエリを投げられれば言語は何でも良いです。今回はC++&ADOでやりましたが、VBScriptの例なんかも載ってます。

2018-12-11 ,

Node.jsで書いたプログラムをタスクトレイに入れる

Node.jsで書いたものをWindows上で起動させっぱなしにする方法は色々あるみたいなんですがどれも今ひとつよく分からなかったのでやりたいことは単にコンソールウィンドウが鬱陶しいからタスクトレイに押し込んで欲しいというだけだったのでそういうことをするプログラムを作りました。

misohena/trayrun: Execute windows application under task tray

Visual Studioでビルドしてtrayrun.exeを作成。

trayrun.exeへのショートカットを作成して、ショートカットのプロパティから色々変更。

リンク先
c:/hogehoge/trayrun.exe /c "node.cmd start" /title "my node app"
作業フォルダー
Node.jsで書いたもののディレクトリ

みたいにすればOKです。

ショートカットをスタートアップに入れておけば起動時に開始されます。

後はタスクトレイのメニューからコンソールウィンドウを表示したり隠したり出来ます。

で、絶対同じようなものは既にあるんだろうなぁと検索したら同じ名前のものが見つかりました。まぁ、そうですよねw

2018-11-14 ,

Google Calendarで過ぎた日の色を変える(2018)

Google Calendarで過ぎた日の色を変える が動かなくなって久しいので調べて書き直しました。

DOMを見たところ、カレンダーの各セルにdata-datekeyという属性があったのでこれを使えば簡単そうだなと。 このdatekeyの数字の意味については Googleカレンダーのdata-datekeyの謎 で。

次のようなユーザースクリプトを作ってGreasemonkeyなりTampermonkeyで使えばOKでした。

(function(){
    'use strict';

    var timer = null;
    function schedule(){
        if(timer){
            clearTimeout(timer);
        }
        timer = setTimeout(update, 200);
    }

    function update(){
        const PAST_COLOR = "#eeeeee";
        const TODAY_COLOR = "#ffffaa";

        const now = new Date();
        const todayKey = (now.getFullYear()-1970)*512+(now.getMonth()+1)*32+now.getDate();
  
        const cells = Array.prototype.slice.call(document.querySelectorAll("[data-datekey]"));
        cells.forEach((e)=>{
            if(e.dataset.datekey < todayKey){
                e.style.backgroundColor = PAST_COLOR;
            }
            else if(e.dataset.datekey == todayKey){
                e.style.backgroundColor = TODAY_COLOR;
            }
        });
    }

    var observer = new MutationObserver(schedule);
    observer.observe(document.body, {childList:true, subtree:true});

    update();
})();

DOMが書き換わってから100msだと切り替えたときにたまに元に戻ってしまうことがあったので200msにしました。

2018-11-14

Googleカレンダーのdata-datekeyの謎

Google Calendarで過ぎた日の色を変えるが大分前から動かなくなっているので新しいカレンダーのデザインを調べたのですが、日付のセルに data-datekey という属性が指定されているのに気がつきました。

今日11月14日だと data-datekey="24942" となっています。

最初はどこかの起点から経過日数かと思ったのですが、逆算してみると1950年8月1日??

よく見てみると、月の間や年の間で日数が飛んでいます。ははぁ、これは y*Y+m*M+d みたいな形式だなぁ。

24609 2018-01-01
24927 2018-10-31
24929 2018-11-01
24958 2018-11-30
24961 2018-12-01
24991 2018-12-31
25121 2019-01-01

うーん……2018年1月1日から2019年1月1日が 25121-24609=512 (=2^9)、11月1日から12月1日が 24961-24929=32 (=2^5)。

  • 1年で512
  • 1月で32
  • 1日で1

つまり

(y-1970)*512 + m*32 + d

※(m、dは1から始まる月、日)

ビット演算でやるなら

((y-1970)<<9) | (m<<5) | d

ですね。

2018-11-04

2018秋の新番組

今期はこれはといったものはありませんがそれなりなものはいくつか。

△→○ 09/30(日) 22:30 TOKYO MX DOUBLE DECKER! ダグ&キリル
10/01(月) 22:00 TOKYO MX Thunderbolt Fantasy 東離劍遊紀2
× 10/01(月) 22:30 TOKYO MX あかねさす少女
10/01(月) 24:00 TOKYO MX 転生したらスライムだった件
10/01(月) 25:00 TOKYO MX 宇宙戦艦ティラミスII
× 10/01(月) 26:20 テレビ東京 軒轅剣 蒼き曜
△→× 10/02(火) 17:55 テレビ東京系 爆釣(ばくつり)バーハンター
10/02(火) 25:00 BS11 異世界居酒屋~古都アイテーリアの居酒屋のぶ~
○→△ 10/02(火) 25:00 TOKYO MX 人外さんの嫁
○→× 10/02(火) 25:29 日本テレビ 風が強く吹いている
× 10/03(水) 17:55 テレビ東京系 トロールズ-シング・ダンス・ハグ!-
10/03(水) 22:24 TOKYO MX ほら、耳がみえてるよ!
△→× 10/03(水) 24:00 TOKYO MX ソラとウミのアイダ
10/03(水) 25:05 TOKYO MX RErideD(リライデッド) -刻越えのデリダ--
△→× 10/04(木) 24:00 TOKYO MX ゾンビランドサガ
10/04(木) 25:05 TOKYO MX でびどる! コチンPa!
10/04(木) 25:28 TBS 学園BASARA
× 10/04(木) 25:58 TBS BAKUMATSU ~恋愛幕末カレシ 外伝~
10/05(金) 17:55 テレビ東京系 イナズマイレブン オリオンの刻印
○→× 10/05(金) 22:00 TOKYO MX 火ノ丸相撲
10/05(金) 22:30 BSスカパー グラゼニ シーズン2
△→× 10/05(金) 22:30 TOKYO MX やがて君になる
△→× 10/05(金) 24:00 TOKYO MX 抱かれたい男1位に脅されています。
10/05(金) 24:30 TOKYO MX とある魔術の禁書目録Ⅲ
10/05(金) 25:05 TOKYO MX ジョジョの奇妙な冒険 第5部 -黄金の風-
× 10/05(金) 25:23 テレビ東京 宇宙戦艦ヤマト2202 愛の戦士たち
△→× 10/05(金) 25:25 TBS 寄宿学校のジュリエット
△→× 10/05(金) 25:35 TOKYO MX おこしやす、ちとせちゃん
10/05(金) 25:40 TOKYO MX うちのメイドがウザすぎる!
10/05(金) 25:55 TBS 色づく世界の明日から
10/06(土) GYAO! お酒は夫婦になってから 第14話(未放送話)
△→× 10/06(土) 07:55 TOKYO MX ほしの島のにゃんこ
10/06(土) 09:20 NHK Eテレ ピングー in ザ・シティ
△→× 10/06(土) 17:30 日本テレビ系 逆転裁判 Season2 その「真実」異議あり!
△→× 10/06(土) 17:35 NHK Eテレ ラディアン
10/06(土) 22:00 TOKYO MX となりの吸血鬼さん
10/06(土) 23:30 TOKYO MX 青春ブタ野郎はバニーガール先輩の夢を見ない
10/06(土) 24:00 TOKYO MX ソードアート・オンライン -アリシゼーション- (第3期)
△→× 10/06(土) 25:00 GYAO! その時、カノジョは
10/06(土) 25:00 TOKYO MX SSSS.GRIDMAN
10/06(土) 25:30 TOKYO MX ゴブリンスレイヤー
10/07(日) 06:54 テレビ東京 愛玩怪獣
10/07(日) 07:00 テレビ東京系 FAIRY TAIL(フェアリーテイル) ファイナルシリーズ
△→× 10/07(日) 22:00 TOKYO MX ユリシーズ ジャンヌ・ダルクと錬金の騎士
10/07(日) 23:30 TOKYO MX RELEASE THE SPYCE
× 10/07(日) 24:00 TOKYO MX アニマエール!
10/07(日) 25:00 TOKYO MX 終電後、カプセルホテルで、上司に微熱伝わる夜。
10/07(日) 25:35 TOKYO MX ガイコツ書店員 本田さん
10/07(日) 25:50 TOKYO MX ひもてはうす
10/08(月) 23:00 TOKYO MX ゴールデンカムイ 第二期
10/08(月) 24:30 TOKYO MX 蒼天の拳 REGENESIS 第2期
○→△ 10/08(月) 25:10 TOKYO MX 狐狸之声
10/08(月) 25:25 TOKYO MX おとなの防具屋さん
10/08(月) 26:40 Amazon Prime 走り続けてよかったって。
10/09(火) 21:54 TOKYO MX アイドルマスター SideM 理由あってMini!
10/09(火) 23:00 TOKYO MX 東京喰種 トーキョーグール:re (第2期)
△→× 10/09(火) 25:40 TOKYO MX CONCEPTION 俺の子供を産んでくれ!
△→× 10/10(水) 25:35 TOKYO MX 俺が好きなのは妹だけど妹じゃない
10/11(木) 22:30 TOKYO MX からくりサーカス
× 10/11(木) 23:30 TOKYO MX メルクストーリア -無気力少年と瓶の中の少女-
10/12(金) 26:10 TOKYO MX 閃乱カグラ SHINOVI MASTER -東京妖魔篇-(第2期)
10/13(土) 24:30 TOKYO MX ベルゼブブ嬢のお気に召すまま。
10/17(水) 24:55 フジテレビ Ingress
10/21(日) 24:10 NHK総合 ツルネ-風舞高校弓道部-
10/25(木) 22:00 TOKYO MX 叛逆性ミリオンーアーサー
10/26(金) Netflix 悪魔城ドラキュラ(キャッスルヴァニア) 第2シーズン

2~3話時点でのお気に入り:

2018-10-12

水浸けスパゲティ

なんで今までやらなかったんだろう。後悔。

あらかじめ水につけておくというアイデアは以前から聞いたことはありましたが、スパゲティを作る上での問題をこれほど見事に解決出来る方法だとは思っていませんでした。

  • 食べたいときにすぐ食べられる(3分で調理可能)
  • フライパン一つでOK(洗い物少ない)
  • 自然に一手間かけた食べ方ができる(美味しい!)

事前に水につけておきさえすれば食べたいときにすぐに食べられます。 スパゲティってお湯を沸かしてゆであがるまで結構な時間がかかりますからね。 最近は早ゆでタイプもありますが少し高いですし、どのみちお湯が沸くまでの時間はどうしてもかかりますし。 それがこの方法なら食べたいと思ってからフライパン一つですぐに完成します。 長時間浸けっぱなしにしていてもそれほど問題ないみたいです。

洗い物が少ないのも嬉しいですね。水に浸けるための容器はそれほど汚れませんし、あとはフライパンだけ。フライパン一つで火を通してソースも温めて、何ならそのまま食べれば良いので皿も不要。

それでいて美味しい。どんなに手軽でも美味しくなければ続きませんからね。フライパンで調理したパスタは美味しいです。市販ソースの裏によく書いてある「一手間かけた食べ方」はたいてい茹でた後にフライパンを使う方法です。鍋で長時間茹でた上にフライパンまで使うのは面倒ですが、この方法なら最初から使うのはフライパンだけなのでついで感覚で色々出来ます。

このくらいの手軽さなら山(アウトドア)でもできそう。ガスもそれほど使わないはずですし。持ち運び(水入りのジップロック?)はちょっと注意が必要ですが。

2018-10-12 , ,

Org2blogでアイキャッチ画像を設定する

Org2blogでアイキャッチ画像(投稿サムネイル, featured image, post thumbnail)を指定するオプションを追加しました。次のように書けます。

#+TITLE: Org2blogでアイキャッチ画像を設定する
#+POST_THUMBNAIL: ./some-featured-image.jpg

ファイル名が変わっていたらアップロードして再設定します。オプションを空文字列にすればアイキャッチ画像は投稿から取り外されます。ただし、APIからメディアを削除する方法が分からなかったので変わる前の画像はメディアライブラリに残り続けますのでご注意を。

ソースコード全体としては https://github.com/misohena/org2blog の image-fix ブランチで提供しています。

2018-10-11 , ,

Org2blogでサムネイル画像のサイズをリンク毎に個別に設定する

このBlogは Org2blog + WordPress で書かれているわけなんですが、画像を張るときにちょっと気になることがあります。

それは画像のサイズを個別に指定する標準的な方法が無いこと。 org2blog/wp-image-thumbnailsorg2blog/wp-image-thumbnail-size という設定があってそれを使えば全体でサイズを指定出来るのですが、一つの文書の中でこの画像はどうでもいいので小さくしたい、この画像は重要なので大きくしたい、といった個別に指定する方法が用意されていません。

最終的にHTMLでエクスポートされるので、画像(img要素)に対してstyleやwidth属性を設定すれば無理矢理大きさを変えられます。

#+ATTR_HTML: :width 240px
[[file:./a.png]]

しかしこの場合、あくまで表示時に縮小することになるため不必要に大きな画像をダウンロードすることになります。WordPress側ではアップロード時にいくつかの解像度差分を自動的に生成してくれているのに勿体ない話です。

というわけで、作ったのが次のパッチ。

imgのwidth=を見て適切なサイズの画像を選ぶようにしてみました。

ただ、実はこれだけでは不十分で、同じ画像をサイズを変えて何度も使いたい場合にうまくいきません。org2blogは内部で一つのファイル名に対して一つのサムネイルサイズを前提にしているため、最初に指定した画像リンクのサイズが以降使われてしまいます。

それを解決してみたのが次のパッチ(一つ目のパッチを前提にしています)。

これによって同じ文書の中であっても次のような指定が可能になります。

# mediumサイズが使われる
#+ATTR_HTML: :width 200px
[[file:./a.png]]

# largeサイズが使われる
#+ATTR_HTML: :width 640px
[[file:./a.png]]

# org2blog/wp-image-thumbnail-sizeで指定したサイズが使われる
[[file:./a.png]]

ソースコード全体としては https://github.com/misohena/org2blog の image-fix ブランチで提供しています。

https://github.com/misohena/org2blog/commits/image-fix