Category Archives: 未分類

2019-07-10

はじめてのフォトグラメトリ

TLにフォトグラメトリのやりかたが流れていたので試してみました。 使ったのは3DF Zephyrというソフトです。

吉野家でもらったマグカップ。酷い出来ですw

近くにあったハンバーガーのキーホルダー。左目の下がおかしくなってしまいましたが前のよりはマシになったかも。素材の質感はよく出てますね。

自転車。なかなか厳しいです。公園に行って動画で撮影してそのフレームを元に作成したのですが。

鰻を食べに行く機会があったので撮影。

なかなかうまくモデル化するのは難しいですね。できるだけ前のフレームと沢山重ねて撮影した方が良いとか、同じ場所で向きを変えるよりも平行移動したほうが良さそうとか、後は変換時のオプションでかなり変わったり。コツは色々あるみたいです。

2019-05-01

Emacs + Gnusでメールを読み書きする設定(Gmail、IMAP、POP複数アカウント)

普段Wanderlustを使っているのですが久しぶりにGnusに再挑戦、メールの読み書きが出来るようにしてみました。

環境

GNU Emacs 26.1.92 (build 1, x86_64-w64-mingw32)
 of 2019-03-08
Gnus v5.13

Gnus関連ファイルをひとつのディレクトリにまとめる

デフォルトだと ~/ の下にいろんなファイルを勝手に作るのでそれを ~/gnus/ に変更しました。 既に使っているWanderlustと併用したいので ~/Mail/ は特に困ります。

Gnus用設定ファイルの位置も ~/gnus/.gnus.el に移したいのですが、そこへのパスだけは .emacs や init.el の方に書かないとダメですね。その他の設定は .gnus.el に書くことにします。

  1. .emacs や init.el に (setq gnus-home-directory "~/gnus") を書く
  2. 次のコードを ~/gnus/.gnus.el に書く
;; Move home directory to ~/gnus
;; Write (setq gnus-home-directory "~/gnus") on init.el
(setq message-directory "~/gnus/Mail"
      mail-source-directory "~/gnus/Mail"
      nnfolder-directory "~/gnus/Mail/archive"
      pop3-uidl-file "~/gnus/.pop3-uidl"
      nntp-authinfo-file "~/gnus/.authinfo"
      auth-sources '("~/gnus/.authinfo" "~/gnus/.authinfo.gpg" "~/gnus/.netrc"))

受信設定

設定したメールアカウントは次の4つです。

  • Gmail
  • IMAPで扱う独自のアカウント
  • POPで扱う独自のアカウント(二つ)
;;; ~/gnus/.gnus.el

(require 'nnir)

;; Make Gnus NOT ignore [Gmail] mailboxes
;; Gmailのメールボックス名を無視しないようにする。
;; デフォルトの正規表現だと[Gmail]という名前にマッチしてしまうので。
(setq gnus-ignored-newsgroups "^to\\.\\|^[0-9. ]+\\( \\|$\\)\\|^[\"]\"[#'()]")

;; Use gnus-secondary-select-methods only
;; gnus-select-method は使わず gnus-secondary-select-methods のみを使う。
;; リストだけ使う方が追加・廃止が楽なので。
(setq gnus-select-method '(nnnil))

;; Gmail (IMAP)
(add-to-list
 'gnus-secondary-select-methods
 '(nnimap "gmail"
          (nnimap-address "imap.gmail.com")
          (nnimap-server-port 993)
          (nnimap-stream ssl)
          ;; Search
          (nnir-search-engine imap)))

;; My Email 1 (IMAP)
(add-to-list
 'gnus-secondary-select-methods
 '(nnimap "myaccount1"
          (nnimap-address "myimapserver1.example.jp")
          (nnimap-server-port 993)
          (nnimap-stream ssl)
          ;; Search
          (nnir-search-engine imap)))

;; WanderlustのMH形式フォルダを読み込む。が、起動時に毎回時間がかかるのでコメントアウト。
;; ;; My Old Email Archive (Wanderlust's MH Folders)
;; (add-to-list
;;  'gnus-secondary-select-methods
;;  '(nnmh ""
;;         (nnmh-directory "~/Mail")
;;         (nnmh-get-new-mail nil)))

;; 手元にダウンロードしてくるタイプのPOP、IMAPアカウント。
;; My Email 2,3 (POP)
(add-to-list
 'gnus-secondary-select-methods
 '(nnml ""))

(setq mail-sources
      '((pop :server "mypopserver2.example.jp"
             :port 995
             :user "mypopuser2"
;;             :password "???" ;;=> .authinfo に machine mypopserver2.example.jp login mypopuser2 port 995 password ??? と書いた方が良い。ミニバッファにパスワードを入力しても、POPの場合はなぜか自動で保存してくれないので手動で書き込んだ方が良い。
             :authentication apop
             :stream ssl
             :leave t ;; or N days
             )
        (pop :server "mypopserver3.example.jp"
             :port 995
             :user "mypopuser3"
;;             :password "???"
             :authentication apop
             :stream ssl
             :leave t
             )))

;; ソースによってグループを分ける。
(setq nnmail-split-methods
      '(("myaccount2" "^X-Gnus-Mail-Source: pop:mypopuser2@mypopserver2\\.example\\.jp$")
        ("myaccount3" "^X-Gnus-Mail-Source: pop:mypopuser3@mypopserver3\\.example\\.jp$")
        ("unknown-source" "")))

Gnusでは情報源は gnus-select-methodgnus-secondary-select-methods に設定します。 なぜか同じような機能のものが二つあるのですが、おそらく最初は gnus-select-method だけがあって、後から複数の情報源を設定出来る gnus-secondary-select-methods を追加したのではないでしょうか? 今回はリストで複数設定出来る gnus-secondary-select-methods のみを使います。 gnus-select-method には nnnil を設定して無効化しました。ネットニュースを読むならニュースサーバをここに設定しても良いと思います。

nnimap で指定したIMAPサーバ上のメッセージは、手元にファイルをダウンロードすることなく読むことが出来ます。

nnmlmail-sources で指定したPOPサーバ上のメッセージは、 ~/gnus/Mail/ (デフォルトだと~/Mail/)にダウンロードしてから読むことになります。

mail-sources に複数のアカウントを指定した場合、全アカウントのメールが全て一箇所にまとめられてしまうようでした。なので nnmail-split-methods で振り分けの設定をしています。幸い X-Gnus-Mail-Source というヘッダーがついていたのでそれで振り分けられました。何かもう少しうまい仕組みがあれば良いのですが……。グループパラメータの mail-source が使えるかなとも思ったのですがそちらは試していません。

POPでメールをサーバに残すには :leave t を指定します。これが無いと受信したメールはサーバから削除してしまうので注意してください。整数で日数を指定することも出来るようです。

POPのパスワードは .authinfo(や.authinfo.gpg)にあらかじめ書いておくことをおすすめします。どこにも書かなければアクセス時にミニバッファで聞かれますが、自動的に .authinfo に保存してくれませんでした。 nnimap の場合は保存してくれたのですが。

IMAP(nnimap)のパスワードも .authinfo に保存します。あらかじめ書かなくてもミニバッファで聞かれたときに入力すれば自動的に保存されました(むしろ下手に書いて形式に間違いがあってハマりました)。

Gmailで二段階認証している場合等はアプリパスワードを発行する必要があると思います。

送信設定

複数のアカウントがあるので送信設定も適切に切り替える必要があります。

何を切り替えるべきか:

  • (Fromの)名前
  • (Fromの)メールアドレス
  • 文末の署名
  • 送信したメールをどこに保存するか(Bcc, Gcc)
  • SMTPサーバとの接続情報

切り替える条件案:

  • Fromヘッダー
  • メール作成時のグループ

探してみるとFromによってSMTPを切り替える設定(Multiple SMTPAccounts - Emacs Wiki)を見つけたのですが、色々試してみて最終的に gnus-posting-styles でメール作成時のグループにより適切なヘッダーを設定する方法で落ち着きました。

;;; ~/gnus/.gnus.el

;; デフォルト送信設定
(setq smtpmail-stream-type 'starttls) ;;基本的に全てstarttlsで送る。
(setq smtpmail-smtp-server "mysmtpserver2.example.jp"
      smtpmail-smtp-service 587
      smtpmail-smtp-user "mysmtpuser2") ;;デフォルトのSMTPサーバ
(setq user-full-name "My FullName"
      user-mail-address "myaccount2@example.jp") ;;デフォルトの名前とメールアドレス

;; メール作成時に作用する設定
(setq gnus-posting-styles
      '(
        ;; IMAP
        ("^nnimap\\+gmail:"
         (name "My FullNameG")
         (address "myaccountg@gmail.com")
         (signature "My FullNameG\nmyaccountg@gmail.com")
         (gcc "nnimap+gmail:Sent")
         ("X-Message-SMTP-Method" "smtp smtp.gmail.com 587 myaccountg@gmail.com"))

        ("^nnimap\\+myaccount1:"
         (name "My FullName1")
         (address "myaccount1@example.jp")
         (gcc "nnimap+myaccount1:INBOX")
         ("X-Message-SMTP-Method" "smtp mysmtpserver1.example.jp 587 mysmtpuser1"))

        ;; POP
        ("^nnml:myaccount2\\(\\..*\\)?$"
         (name "My FullName2")
         (address "myaccount2@example.jp")
         ("Bcc" "myaccount2@example.jp")
         ("X-Message-SMTP-Method" "smtp mysmtpserver2.example.jp 587 mysmtpuser2"))

        ("^nnml:myaccount3\\(\\..*\\)?$"
         (name "My FullName3")
         (address "myaccount3@example.jp")
         ("Bcc" "myaccount3@example.jp")
         (signature "** My FullName3 **")
         ("X-Message-SMTP-Method" "smtp mysmtpserver3.example.jp 587 mysmtpuser3"))
        ))

gnus-posting-styles変数を使用すると様々な条件でメールヘッダーや署名等を切り替えることが出来ます。この変数はメール作成を開始する時点で作用するので、本文を書くときに効果を目で確認出来ます。

上の設定ではメール作成時のグループ名を元に、名前、メールアドレス、署名、送信済みメールの送り先、使用するSMTPサーバを切り替えています。

送信したメールの保存先は、私の場合次のようにしました。

  • POPアカウントならBccで自分自身にコピーを送る
  • IMAPアカウントならGccを送信済みフォルダーに設定する

POPでBccしているのは他のPCからでも見られるようにするためですが、それが不要ならばGccをnnml:myaccount2とかにしてローカルに保存するだけでも良さそうです。

X-Message-SMTP-Method というヘッダーを使用すると送信時に使用するSMTPサーバ(ポート、ユーザ名)を指定出来ます。このヘッダーは送信時に削除されて相手には届きませんでした(試した限り)。 この方法だとSSL/TLS暗号化の方式を個別に指定出来ないような気がしますが、私の場合は全てSTARTTLSで問題ありませんでした。デフォルトの設定では、使えるならSTARTTLS、使えなければ暗号なしになるみたいです。

見た目の設定

;;; ~/gnus/.gnus.el

;; Tree view for groups.
;; デフォルトをトピックモードとする。
;; https://www.gnu.org/software/emacs/manual/html_node/gnus/Group-Topics.html
(add-hook 'gnus-group-mode-hook 'gnus-topic-mode)

;; Referencesヘッダーを元にスレッドを構築する。同じSubjectというだけでスレッドになると困るので。
;; gather threads by References headers (default is by subject)
(setq gnus-summary-thread-gathering-function 'gnus-gather-threads-by-references)

;; Summary Line Format
;; 短い年月日日時(190503T1234)、短いFrom、記事行数不要
(setq gnus-summary-line-format "%U%R%z %&user-date; %I%(%[%-15,15f%]%) %s\n"
      gnus-user-date-format-alist '((t . "%y%m%dT%H%M")))

GnusかWanderlustか

ここまでやってみましたが、結局私は当面Wanderlustを使うと思います。

手元の環境(Windows+自分でビルドしたEmacs)だと数回に一回は送受信時にエラーが発生します。これはGnusでもWanderlustでも起きるのですが未だに原因がつかめていません(SSLでも平文でも起こるのでgnutlsがらみでも無さそう?)。 今回Gnusを試してみたのはこれが解決するかもしれないと思ったのが一番の理由なのですが残念ながら変わりませんでした。

メールソフトとしての使い勝手はWanderlustの方が普通だと思います。カスタマイズを進めていけばGnusでもそれほど悪くないのかもしれませんけれど、デフォルトの状態があまりにも。

Wanderlustはバグが多くそれが一向に解決される気配が無いのも今回Gnusを試した理由の一つなのですが、まぁ、Wanderlustでも一応最低限は使えていますので。

添付ファイルまわりとか日本語まわりとかはまだ試していないので分かりません。Wanderlustだとおかしな挙動をすることが良くあるので、それがGnusで問題なければ良いのですが。

2019-04-15

2019年春の新番組

今期は不作かなぁと思っていたら最後の方で良さそうなのがいくつか。

  開始日 開始時刻 チャネル タイトル
03/31(日) 25:30 BSフジ シーサイド荘のアクアっ娘
04/01(月) –:-- Netflix ULTRAMAN
04/01(月) 17:55 テレビ東京系 爆丸バトルプラネット
04/01(月) 18:00 NHK Eテレ わしも(WASIMO) 第7シリーズ
04/01(月) 18:10 NHK Eテレ 忍たま乱太郎 第27シリーズ
04/01(月) 22:00 TOKYO MX ポプテピピック 新作SP版
04/02(火) 17:55 テレビ東京系 ダイヤのA actII
04/02(火) 18:45 NHK Eテレ 少年アシベ GO!GO!ゴマちゃん 第4シリーズ
04/02(火) 21:54 TOKYO MX アイドルマスター シンデレラガールズ劇場 CLIMAX SEASON
04/02(火) 24:00 TOKYO MX フリージ
04/02(火) 25:35 テレビ東京 ワンパンマン 第2期
04/03(水) 07:30 テレビ東京系 猫のニャッホ
04/03(水) 18:00 NHK Eテレ おじゃる丸 第22シリーズ
04/03(水) 18:45 NHK Eテレ ねこねこ日本史 第4シリーズ
× 04/03(水) 21:54 TOKYO MX ARP AFTER SCHOOL PARADISE
04/03(水) 22:00 TOKYO MX この世の果てで恋を唄う少女YU-NO
04/04(木) 18:25 テレビ東京系 アイカツフレンズ! ~かがやきのジュエル~(第4期)
04/04(木) 19:30 BS4K ムーミン谷のなかまたち
04/04(木) 22:00 TOKYO MX 叛逆性ミリオンアーサー 第2シーズン
04/04(木) 25:58 TBS BAKUMATSUクライシス
04/05(金) 16:00 コロコロチャンネル ベイブレードバースト ガチ(GT)
04/05(金) 18:20 NHK Eテレ あはれ!名作くん 第4期
04/05(金) 18:25 テレビ東京系 妖怪ウォッチ!
04/05(金) 22:30 AT-X ほら、耳がみえてるよ! 第2期
04/05(金) 25:23 テレビ東京 フルーツバスケット
04/05(金) 25:55 TBS 川柳少女
× 04/05(金) 26:10 TBS みだらな青ちゃんは勉強ができない
× 04/05(金) 26:25 TBS ひとりぼっちの○○生活
04/06(土) 10:00 テレビ東京系 けだまのゴンじろー
× 04/06(土) 10:30 テレビ東京系 パウ・パトロール -PAW PATROL-
× 04/06(土) 17:30 日本テレビ系 MIX
× 04/06(土) 23:30 TOKYO MX 鬼滅の刃
× 04/06(土) 24:30 TOKYO MX ぼくたちは勉強ができない
× 04/06(土) 25:00 TOKYO MX この音とまれ! 第1期
04/07(日) 07:00 テレビ東京系 スーパーブック シーズン2
04/07(日) 07:30 テレビ東京系 ちいさなプリンセス ソフィア
04/07(日) 08:30 テレビ東京系 デュエル・マスターズ!!
× 04/07(日) 22:00 TOKYO MX 群青のマグメル
× 04/07(日) 23:30 TOKYO MX 消滅都市
04/07(日) 24:00 TOKYO MX Fairy gone フェアリーゴーン
04/07(日) 24:30 TOKYO MX 真夜中のオカルト公務員
04/07(日) 25:00 TOKYO MX 洗い屋さん!~俺とアイツが女湯で!?~
04/07(日) 25:05 TOKYO MX なんでここに先生が!?
× 04/07(日) 25:35 テレビ東京 八月のシンデレラナイン
04/08(月) 07:05 テレビ東京系 ジモトがジャパン
04/08(月) 21:54 TOKYO MX 八十亀ちゃんかんさつにっき
04/08(月) 22:30 TOKYO MX なむあみだ仏っ!蓮台 UTENA
04/08(月) 24:00 TOKYO MX 超可動ガール1/6
04/08(月) 24:15 TOKYO MX 女子かう生
04/08(月) 24:20 TOKYO MX ノブナガ先生の幼な妻
04/08(月) 24:30 TOKYO MX RobiHachi
× 04/08(月) 25:35 テレビ東京 KING OF PRISM -Shiny Seven Stars-
04/09(火) 07:05 テレビ東京系 まほうのルミティア
× 04/09(火) 24:30 TOKYO MX 異世界かるてっと
04/09(火) 24:45 TOKYO MX ストライクウィッチーズ 501部隊発進しますっ!
04/10(水) 23:30 TOKYO MX 世話やきキツネの仙狐さん
04/10(水) 24:55 フジテレビ キャロル&チューズデイ
04/11(木) 07:05 テレビ東京系 Bラッパーズ ストリート
04/11(木) 23:30 TOKYO MX 賢者の孫
04/11(木) 24:55 フジテレビ さらざんまい
04/12(金) 22:30 TOKYO MX 文豪ストレイドッグス 第3シーズン
04/13(土) 26:10 ABCテレビ 凹凸世界
2019-01-28

2019冬の新番組

一通り見ました。

印象 開始 チャネル タイトル
01/03(木) 23:00~ TOKYO MX BanG Dream! 2nd Season
01/04(金) 22:00~ TOKYO MX ブギーポップは笑わない
× 01/05(土) 25:30~ TOKYO MX W’z
01/06(日) 22:00~ TOKYO MX 不機嫌なモノノケ庵 續
01/06(日) 25:00~ TOKYO MX パパだって、したい
× 01/07(月) 21:54~ TOKYO MX みにとじ
01/07(月) 22:00~ TOKYO MX どろろ
× 01/07(月) 22:30~ TOKYO MX エガオノダイカ
01/07(月) 23:00~ TOKYO MX モブサイコ100 II
× 01/07(月) 24:30~ TOKYO MX ぱすてるメモリーズ
01/07(月) 25:05~ TOKYO MX 上野さんは不器用
× 01/08(火) 23:00~ TOKYO MX CIRCLET PRINCESS
○+ 01/08(火) 24:30~ TOKYO MX 私に天使が舞い降りた!
01/08(火) 25:00~ TOKYO MX 臨死!! 江古田ちゃん
× 01/08(火) 25:35~ TOKYO MX 雨色ココアside G
01/08(火) 25:59~ 日本テレビ 3D彼女 リアルガール 第2シーズン
01/08(火) ~ YouTube ぷそ煮コミ
01/09(水) 07:30~ テレビ東京系 まんなかのりっくん@きんてれ
× 01/09(水) 22:30~ TOKYO MX ケムリクサ TVシリーズ
× 01/09(水) 23:30~ TOKYO MX 明治東亰恋伽
01/09(水) 24:00~ TOKYO MX バーチャルさんはみている
01/09(水) 24:55~ フジテレビ revisions
× 01/09(水) 25:05~ TOKYO MX 盾の勇者の成り上がり
01/10(水) 27:05 テレビ東京 フライング ベイビーズ
× 01/10(木) 22:00~ TOKYO MX Dimensionハイスクール
01/10(木) 24:00~ TOKYO MX 同居人はひざ、時々、頭のうえ。
01/10(木) 24:30~ TOKYO MX ガーリー・エアフォース
01/10(木) 24:55~ フジテレビ 約束のネバーランド
01/10(木) 25:28~ TBS 五等分の花嫁
01/10(木) 25:58~ TBS グリムノーツ
01/10(木) 27:05~ テレビ東京 フライングベイビーズ
× 01/11(金) 24:00~ TOKYO MX B-PROJECT~絶頂*エモーション~
01/11(金) 25:40~ TOKYO MX デート・ア・ライブIII
01/11(金) 25:55~ TBS ドメスティックな彼女
× 01/11(金) 26:25~ TBS 魔法少女特殊戦あすか
01/12(土) 22:00~ TOKYO MX バミューダトライアングル ~カラフル・パストラーレ~
01/12(土) 23:30~ TOKYO MX かぐや様は告らせたい~天才たちの恋愛頭脳戦~
01/12(土) 25:00~ TOKYO MX えんどろ~!
01/13(日) 22:30~ TOKYO MX 荒野のコトブキ飛行隊
01/13(日) 23:30~ TOKYO MX 賭ケグルイ××
01/14(月) 26:05~ テレビ東京 けものフレンズ2
  01/20(日) 24:30~ TOKYO MX 神撃のバハムート マナリアフレンズ
01/25(金) 21:00~ 日本テレビ系 ルパン三世 グッバイ・パートナー
  01/27(日) 24:10~ NHK総合 ピアノの森 第2シリーズ

第一話時点では「私に天使が舞い降りた!」がなかなか良い出来かなと思ったのですが二話では今ひとつ。最初だけでは分からないというのが常であります。とはいえ最近は我慢して見る気力も無く早々に切るものが多くなってしまうのですが……。

2018-12-21

Emacs Helmの色を修正する

anythingからhelmへ移行しましたがどうにも違和感が残っています。うーん、配色が悪い。全体的に色がガチャガチャしすぎなんですよね。背景色を指定しすぎている気がします。

プロンプトのカーソル色が黒くなってしまう問題があったのですが、それはこちらのIMEの設定のせいでした。IMEをONにしたら色を変えてOFFにしたら戻すようにしていたのですが、戻すときに黒にしていました。なぜか普段は白に戻ってくれるのですが、背景が黒なので自動的に白にしてくれているのでしょうか……。

それはともかく、気に入らないところをM-x describe-faceやM-x customize-faceで修正。

  • ディレクトリの色(helm-ff-directory)がなんで白背景に赤文字?? フレームの背景色が白であることが前提なのでしょうか? とにかくこれでは見づらいのでdired-directoryと同じ色にしました。一貫性があってすぐにディレクトリと分かります。
  • .や..の色(helm-ff-dotted-directory)が灰色背景に黒文字。み、見づらすぎ……。dotted directoryって.emacs.dとかには適用されていませんね。 . と .. だけみたいです。diredだと . と .. 以外のドットファイルはグレーにしているのですが、helmにはそういうfaceは無いようです。.と..だけを別の色にする必要性を感じなかったのでhelm-ff-directoryと同じ色にしてしまいました。
  • マークの色(helm-visible-mark)がド派手な緑……。これもdiredのマーク色で……と思ったけれどしっくりきません。regionと同じ単純な青色で。文字をboldにすればカーソルと被ってもマークされていると分かります。
  • カーソルの色(helm-selection)も濃い緑……。白じゃダメなの? うーん、さすがに明るすぎますか。文字も見づらい。regionより少し明るい青で。
  • バッファリストにも白背景に赤文字のディレクトリ色(helm-buffer-directory)がありました。ディレクトリのfaceいくつあるの? ff bookmark bufferとありますね。

これだけで少しは落ち着いた色になった気がします。

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にしました。