- 平成22年9月3日(金) 16時59分32秒
-
区分
- Emacs
-
報告者:
- chiba
こんにちは、chibaです!
完全にネタ切れなのですが、毎週1つのエントリーペースは守って行きたいので連投です。
質より量でまいります。
以前、空白一つにこだわりたいというエントリーを書きましたが、割と日々便利に使っています。
最近はちょっと違ったところで、空白を一つにしたい状況に遭遇しています。
- [ ] こんにちは あいうえお かきくけこ
- [ ] こんばんは あいうえお かきくけこ
- [ ] おはよう あいうえお かきくけこ
という感じなのですが、何かから行をコピペしてくると発生することが多いです。
これをちまちま直しているのが非常に手間ということで、適当に、elispを書いてみました。
(defun just-one-space-each ()
(interactive)
(save-excursion
(let* ((begin (progn (beginning-of-line) (point)))
(end (progn (end-of-line) (point)))
(begin (min begin end))
(end (max begin end)))
(goto-char begin)
(while (and (re-search-forward " +" nil t) (<= (point) end))
(replace-match " ")))))
各行で実行すると
- [ ] こんにちは あいうえお かきくけこ
- [ ] こんばんは あいうえお かきくけこ
- [ ] おはよう あいうえお かきくけこ
という風に空白1つに統一できます。快適!
ちなみに、Twitterのつぶやきで最近 delete-indentation (M-^)というのを教えてもらいました。
行の連結に使えるのですが、just-one-spaceの使いどころと似ています。
■
>View Comments
このページの上へ戻る
- 平成22年9月3日(金) 16時09分06秒
-
区分
- Emacs
-
報告者:
- chiba
こんにちは、chibaです!
完全にネタ切れなので、中途半端に失敗談を書きます。
skype.elは非常に便利なのですが、自分のEmacsの操作が鈍い所為かチャットの切り換えにいつも、もたもたしておりました。
このままではいけないと思った私は、便利elispを書いて対応することに。
社内のSkypeの利用形態としては、グループチャットが主で使われる部屋も2つ位と少ないので、このチャットをキー一発で開ければOKであろうと思われました。
ということで、skype.elをちらちら見つつ、
(require 'cl)
(defun *skype-find-ai-chat (name)
(let ((chat (find-if (lambda (x)
(search name
(aref x 2)))
(skype--chat-get-recent-objects))))
(when chat
(switch-to-buffer
(skype--open-chat-buffer chat)))))
(defun skype-open-konnichiwa-chat ()
(interactive)
(*skype-find-ai-chat "こんにちは"))
(defun skype-open-kombanwa-chat ()
(interactive)
(*skype-find-ai-chat "こんばんは"))
(defun skype-open-oyasuminasai-chat ()
(interactive)
(*skype-find-ai-chat "おやすみなさい"))
(define-key global-map [(super ?1)] 'skype-open-konnichiwa-chat)
(define-key global-map [(super ?2)] 'skype-open-kombanwa-chat)
(define-key global-map [(super ?3)] 'skype-open-oyasuminasai-chat)
のような物を書いてみました。
これで、Super-1〜2で目的の部屋を一発で開くことができます。
これは割と便利だなーと思いつつ、改めて、skype.elを眺めたところ、
(global-set-key (kbd "M-9") 'skype--anything-command)
とするとanything.elと連携できて良いよ!との解説が。
試してみたところ、断然こっちの方が便利でした。
やはりREADME的なものはちゃんと読もう、と思った次第です。
■
>View Comments
このページの上へ戻る
- 平成22年8月27日(金) 14時18分06秒
-
区分
- WordPress
-
報告者:
- chiba
こんにちは、chibaです!
完全にネタ切れなので、中途半端にWordPressのことを書きます。
続きものだった筈の低価格レンタルサーバーの共有SSLとWordPress (1)を書いてから半年程放置してしまいましたが、WordPressも3系が出たということでこのテーマについて少しまとめてゆくことにしてみました。
前回は1つのWordPress+低価格レンタルサーバーでSSLサイトと通常のサイトをどう切り盛りするかというのがテーマでしたが、色々試してみた結果、1つのWordPressでがんばらずにフォーム専用のWordPressを別個にインストールして使うことにするのが一番手間がかからないようです。
ちょっとした問題としては、SSL専用でWordPressを利用する場合、WordPress2系ではどういう訳かSSLの状態では管理画面にまともにログインできませんでした。
大抵のところでは、URLがhttpでもhttpsでも使えるので管理画面のログインはhttpでサイトの利用はhttpsという謎な運用をすることにより回避できていましたが、WordPress3系では解決しているようです。これは嬉しいところですね。
非常に中途半端ですが、次回に続きます…
■
>View Comments
このページの上へ戻る
- 平成22年8月23日(月) 12時36分04秒
-
区分
- LISP
-
報告者:
- chiba
こんにちは、chibaです!
隙があればlispを詰め込んで行く日々ですが、古めのウェブページの累計カウンター的な物を月に一回更新するという作業が発生しました。
sedで一発かなと思いましたが、sedで一発と思ったらCLで書くことにしているので、CLで書いてみます。
具体的な内容ですが、index.htmlの中に、カウンター的なものがあり、数字はそれぞれ1枚のGIF画像になっているのを、毎月集計された数字に更新というところです。
サーバーとは、SSHで通信できます。
折角なので、リモートのファイルをローカルのファイルと同じ感覚で編集できるようなマクロを作成してみました。
といってもリモートからscpしてきて編集するだけのものです。
これと、以前に定義したオレオレsedを組み合わせて任務は完了です。
(exec:define-executable scp)
(defmacro with-output-to-remote-file ((stream path) &body body)
(let ((temp-file-name (string (gensym "/tmp/with-output-to-remote-file-"))))
`(unwind-protect (progn
(with-open-file (,stream ,temp-file-name :direction :output)
,@body)
(scp ,temp-file-name ,path)
nil)
(when (cl-fad:file-exists-p ,temp-file-name)
(delete-file ,temp-file-name)))))
(defmacro with-input-from-remote-file ((stream path) &body body)
(let ((temp-file-name (string (gensym "/tmp/with-input-from-remote-file-"))))
`(unwind-protect (progn
(scp ,path ,temp-file-name)
(with-open-file (,stream ,temp-file-name)
,@body)
nil)
(when (cl-fad:file-exists-p ,temp-file-name)
(delete-file ,temp-file-name)))))
(defun カウンター (num)
(fare-utils:join-strings
(list
"<!-- カウンター -->"
"<div id=\"count\">"
"<table id=\"counter\">"
"<tr>"
"<td>"
(format nil
"~{<img src=\"./images/count_~a.gif\" alt=\"\" />~%~}"
(map 'list #'values (write-to-string num)))
"</td>"
"<td> <img src=\"./images/count_ken.gif\" alt=\"\" width=\"18\" height=\"17\" /></td>"
"</tr>"
"</table>"
"</div>"
"<!-- /カウンター -->")
:separator #\Newline))
;; 実行例
(with-output-to-remote-file (out "example:public_html/index.html")
(with-input-from-remote-file (in "example:public_html/index.html")
(sed "<!-- カウンター -->"
"<!-- /カウンター -->"
(カウンター 12345)
:IN IN
:OUT OUT)))
■
>View Comments
このページの上へ戻る
- 平成22年8月6日(金) 15時13分23秒
-
区分
- StumpWM
-
報告者:
- chiba
こんにちは、chibaです!
隙があればlispを詰め込んで行く毎日を連投です。
このシリーズの6回目で本日が祝日であるかどうかを判定したい、というネタを投稿しましたが、そもそも何がしたかったかというと、業務時間かどうかによってFirefoxや、Skypeのプロファイルを切り替えられるようにしてみたら便利かな、というのが動機でした。
ということで、この前のHOLIDAY-Pを拡張して、IN-WORKING-HOURS-Pというのを作成し、就業時間中は、仕事用のプロファイルでアプリを起動することにしてみました。
そういえば今迄説明なしで来てしまいましたが、もちろんウィンドウマネージャーはStumpWMです!
(DEFUN IN-WORKING-HOURS-P ()
(AND (NOT (HOLIDAY-P))
(< 6
(NTH-VALUE 2 (DECODE-UNIVERSAL-TIME (GET-UNIVERSAL-TIME)))
17)))
;; firefox
(DEFCOMMAND FIREFOX () ()
"Run or switch to firefox."
(IF (IN-WORKING-HOURS-P)
(run-or-raise "/usr/bin/firefox -P \"work\" " '(:class "Firefox"))
(run-or-raise "/usr/bin/firefox -P \"home\"" '(:class "Firefox"))))
これで、会社で同僚にFirefoxを使って説明をしているときに、アッー!なURLの履歴などが出てきてしまいアッー!っとなることを防げますね。
■
>View Comments
このページの上へ戻る
- 平成22年8月6日(金) 12時15分52秒
-
区分
- LISP
-
報告者:
- chiba
こんにちは、chibaです!
隙があればlispを詰め込んで行く毎日ですが、今日の課題は、
"8/24(火)、
8/25(水)、
8/26(木)、
8/27(金)
8/31(火)、
9/1(水) 、
9/2(木) 、
9/3(金)
9/7(火) 、
9/8(水) 、
9/9(木) 、
9/10(金)
9/14(火)、
9/15(水)、
9/16(木)、
9/17(日)"
のような、曜日付き日付の文字列が与えられた場合に、日付に対応している曜日が正しいかの判定です。
日付はそれほどでもないですが、曜日は結構間違ってたりすることも多いですよね。
(SET' FOO
"8/24(火)、
8/25(水)、
8/26(木)、
8/27(金)
8/31(火)、
9/1(水) 、
9/2(木) 、
9/3(金)
9/7(火) 、
9/8(水) 、
9/9(木) 、
9/10(金)
9/14(火)、
9/15(水)、
9/16(木)、
9/17(日)")
(PPCRE:DO-REGISTER-GROUPS ((#'PARSE-INTEGER MON) (#'PARSE-INTEGER DATE) DOW)
("(\\d+)/(\\d+)\\((.+)\\).*" FOO)
(LET* ((CDOW (NTH-VALUE 6 (DECODE-UNIVERSAL-TIME (ENCODE-UNIVERSAL-TIME 0 0 0 DATE MON 2010))))
(X (FORMAT NIL "~D/~D (~A)" MON DATE (ELT "月火水木金土日" CDOW)))
(Y (FORMAT NIL "~D/~D (~A)" MON DATE DOW)))
(FORMAT T "~A => ~A~%" X Y)
(UNLESS (STRING= X Y)
(ERROR "曜日が間違っています! (正)~A => (誤)~A~%" X Y))))
動作:
8/24 (火) => 8/24 (火)
8/25 (水) => 8/25 (水)
8/26 (木) => 8/26 (木)
8/27 (金) => 8/27 (金)
8/31 (火) => 8/31 (火)
9/1 (水) => 9/1 (水)
9/2 (木) => 9/2 (木)
9/3 (金) => 9/3 (金)
9/7 (火) => 9/7 (火)
9/8 (水) => 9/8 (水)
9/9 (木) => 9/9 (木)
9/10 (金) => 9/10 (金)
9/14 (火) => 9/14 (火)
9/15 (水) => 9/15 (水)
9/16 (木) => 9/16 (木)
9/17 (金) => 9/17 (日)
;>>> 曜日が間違っています! (正)9/17 (金) => (誤)9/17 (日)
こんな感じのものを書いてしのいでみました。
大体の内容ですが、単純に正規表現で切り出してシステムから割り出したものと一致するかを見ているだけです。
Common Lispで適当に書き捨てましたが、どちらかというとelispで書いた方が役立つ機会は多いかもしれません。
■
>View Comments
このページの上へ戻る
- 平成22年7月30日(金) 16時54分38秒
-
区分
- Emacs
-
報告者:
- chiba
こんにちは、chibaです!
Emacsで色々な場所にちらばっている複数のバッファを編集しつつ、編集したファイルだけ名前を控えておきたいとき、皆さんはどのように対処されてますでしょうか。
多分、本当にたまにしか必要に迫られることはないと思うのですが、
自分の考えた解決法は、
M-:して
Eval: (push (buffer-file-name) foo)
してfooにファイル名を蓄積して、*scratch*などで、fooを評価して一覧を得るというものです。
foo ;; C-u C-x C-eなど
("/home/mc/tmp/g13237.del" "/home/mc/work/log/log-2010-07-30.org" ...)
とりあえず、これでしのげましたが、なんとなくEmacs標準の方法がありそうですねー。
■
>View Comments
このページの上へ戻る
- 平成22年7月26日(月) 14時55分42秒
-
区分
- ERB
-
報告者:
- chiba
こんにちは!、千葉です!
RailsのViewでは、ERBが使われていますが、#や、=begin、=endの範囲コメントは入れ子になった場合に使い勝手が悪いことが多いですよね。
皆さんざっくりコメントアウトするときには、どういう方法を使っているのでしょうか。
自分は、とりあえず、
<%- if false -%>
コメントアウトしたいこと
<%- end -%>
と書いたり、
def comment(&body)
end
というのを定義して、
<%- comment { -%>
コメントアウトしたいこと
<%- } -%>
などとしてみたりでしのいでいますが、もっと楽な方法はある気がしてなりません。
■
>View Comments
このページの上へ戻る
- 平成22年7月21日(水) 13時02分11秒
-
区分
- LISP
-
報告者:
- chiba
非常にどうでも良い理由で今日が祝日であるかどうかを判定したくなりました。
休日の判定は思ったより色々面倒そうですが、動機がどうでも良いことだけに簡単に済ませたいところ。
ということで、休日情報のAPIが公開されていないか調べたところ、いくつかみつかったのですが、Google Calendarからjsonで手軽に情報を取得できるようなので、これを使ってみることにしました。
(DEFUN GET-CALENDAR-JSON (UT)
(LET ((REQUEST-URL
(KMRCL:MAKE-URL
"full"
:BASE-DIR "http://www.google.com/calendar/feeds/japanese@holiday.calendar.google.com/public/"
:VARS `(("start-min" . ,(XYZZY:FORMAT-DATE-STRING "%Y-%m-%d" UT))
("start-max" . ,(XYZZY:FORMAT-DATE-STRING
"%Y-%m-%d"
(+ UT (* 24 60 60))))
("max-results" . "1")
("alt" . "json-in-script")
("callback" . "handleJson")))))
(STRING-TRIM "handleJson();"
(SB-EXT:OCTETS-TO-STRING
(DRAKMA:HTTP-REQUEST REQUEST-URL :FORCE-BINARY 'T)))))
(DEFUN -> (LIST &REST KEYS)
(IF (ENDP KEYS)
LIST
(KMRCL:AWHEN (FIND (CAR KEYS) LIST :KEY #'ZL:CAR-SAFE)
(APPLY #'-> KMRCL:IT (CDR KEYS)))))
(DEFUN HOLIDAY-P (&OPTIONAL (UT (GET-UNIVERSAL-TIME)))
(LET ((DAY (NTH-VALUE 6 (DECODE-UNIVERSAL-TIME UT))))
(OR (<= 5 DAY)
(< 0
(CDR
(-> (JSON:DECODE-JSON-FROM-STRING (GET-CALENDAR-JSON UT))
:FEED
:OPEN-SEARCH$TOTAL-RESULTS
:$T))))))
(HOLIDAY-P)
;⇒ 今日が休日ならT
(HOLIDAY-P (ENCODE-UNIVERSAL-TIME 0 0 0 21 7 2010))
;⇒ NIL
(HOLIDAY-P (ENCODE-UNIVERSAL-TIME 0 0 0 19 7 2010))
;⇒ T
どうやらGoogle Calendarだと今年分しか情報が取得できない様子なのですが、当日が休日なのかどうかを判定できさえすれば良いのでこれでOKとします。
■
>View Comments
このページの上へ戻る
- 平成22年7月14日(水) 16時48分40秒
-
区分
- ActiveRecord
-
報告者:
- chiba
WordPressのデータを一括でいろいろと変更する際には、SQLでいろいろすると思うのですが、もしかしてActiveRecordを使えたら割と便利だったりするのかな、ということでActiveRecordからWordPressのDBに接続してみたりしていました。
しかし、これは既に試してみている人が絶対いそうだなと思ったので軽くググってみたところ、やはり、そのものズバリがありました。
github: jystewart / wp_ar
こんな感じで使えます。
irb(main):254:0> WpUser.count
12
150行弱のコードですが、機械的に変換する作業には割と使えるかもしれないなと思いました。
自分も、CLSQLなどで同じようなものを組んでみたいです。
■
>View Comments
このページの上へ戻る