- 平成22年3月4日(木) 23時49分51秒
-
区分
- MacPortsよりfink
-
報告者:
- chiba
こんにちは、chibaです。
MacOSX上などにRails開発環境を複数作らなくてはいけなくて色々試行錯誤しています。
環境は、
- デザイナーさん制作ツール: Coda
- Ruby on Rails
- Apache2
- MacOSXだったり
- Linuxだったり
- 貧乏
という感じで、OS環境を2〜3種跨ぎ、かつ、MacOSXとWindowsは主にデザイナーさんが利用するプラットフォームです。
- Linuxなら直にRoR環境を構築してしまえば良いし、デザイナーさん達がLinuxは使うことはない
- MacOSXも直にMacPortsなどを利用してRoR環境を構築すれば良いけれど、デザイナーさん達はMacOSXをメインに使うらしいので、勝手に各自RoR環境を構築してみて下さいとも言いがたい
- 何か問題が起きた場合に、各自で環境を構築してもらうと、何がどうなってエラーになっているのか探るのが面倒臭い
という状況でした。
適当に考えた末、VirturlBox上にRoRの環境を構築し、そのVMイメージを皆で共有すれば楽チンで良いに違いない!ということで試しに、MacOSXの上にVirturlBoxを導入してみました。
ホスト<=>VM間のファイル共有はNFS。
本当は、VirturlBoxの共有ファイル機能を利用したかったのですが、なんだか上手く動かせなかったのでNFSに。
ローカルのファイルをCodaで編集して、Apache/VirturlBoxがホストするページをローカルのブラウザで眺める、という感じで作業してもらうことになりました。
MacOSXは、NFSなどの上で作業すると、._unkoや、.DS〜というファイルを大量にばらまきますが、この構成の場合、作業ディレクトリはホスト側なのでそういうこともありません。
とりあえず、LinuxとMacOSXをホストにして実際に使ってみていますが、可もなく不可もないような、微妙な環境ができあがりました。
もっと他にナイスな組み合わせを教えてください…。■
>View Comments
このページの上へ戻る
- 平成22年2月26日(金) 00時19分21秒
-
区分
- Emacs
-
報告者:
- chiba
chibaです。依然としてネタ切れです。
WordPressのことを調べようと思って前フリしてましたが、これまた全然進んでません。
■
ということなので、最近知ったEmacsの知ってる人には、当たり前な機能を紹介したいと思います。
Emacs使いの方は、C-sはもちろん良く利用すると思いますが、C-sで検索モードに入ってからの、C-w、M-yが便利であることを最近知りました。
C-wで単語単位で検索ワードを漸増しつつ検索できたりしますし、M-yは最新のキルリングの内容で検索できます。
■
また、C-sの応用として、カーソル移動に積極的にC-s/C-rを利用するのも非常に便利であることを再認識しています。
viだとf〜などが便利なのでfを良く使うのですが、EmacsでもC-sで似たようなことはできるんだなあと。
10年位使っていますが、この10年間だいぶ損をしていたなあと思った次第です。
■
>View Comments
このページの上へ戻る
- 平成22年2月18日(木) 23時29分16秒
-
区分
- 生き甲斐
-
報告者:
- chiba
こんにちは、chibaです。
今回は、WordPressのフォームネタの続きの筈なのですが、準備が全く間に合ってないので全然関係ない話を。
当社は、社内のコミュニケーションにskypeが活用されているのですが、Emacs派の私とtaharaさんは、もちろんskype.elを愛用しています。
複数人で会話しているので会話が埋もれがちになるのですが、これまでみんなに見ておいて欲しい作業の報告等には、目立つように絵文字をちりばめて派手にしていました。
しかし、それもだんだんスルーされるようになって来たことに危機感を抱いた私は、報告メッセージをAA化し出力することにし、それのためのelispをやっつけで書いてみました。
(defun omatase (arg title name mesg)
(interactive "p\nstitle: \nsname: \nsmesg: ")
(let* ((title-chars (append title nil))
(last-1~3 (last title-chars 3))
(butlast3 (butlast title-chars 3))
(last3 (first last-1~3))
(last2 (second last-1~3))
(last1 (or (third last-1~3) 12288)))
(insert (format "
.
┌○┐%s
│%c|ハハ お待たせしました、%sさん
│%c|゚ω゚)
│%c| //
└○┘ (⌒)
し⌒
%s
ハハ 以上、よろしくお願いします
(゚ω゚)
_(_つ/ ̄ ̄ ̄/_
\/___/
"
(if (null butlast3)
""
(apply
#'concat
(mapcar (lambda (c)
(format "\n│%c|" c))
butlast3)))
last3
name
last2
last1
mesg))))
M-x omataseで
title: 死んでもいやです
name: 名無し
mesg: そんなことできません
と入力すると、
.
┌○┐
│死|
│ん|
│で|
│も|
│い|
│や|ハハ お待たせしました、名無しさん
│で|゚ω゚)
│す| //
└○┘ (⌒)
し⌒
そんなことできません
ハハ 以上、よろしくお願いします
(゚ω゚)
_(_つ/ ̄ ̄ ̄/_
\/___/
という風に出力されます。ただバッファにAAが出力されるだけですが、Emacsって良いですね。
メッセージは依然適当にスルーされています。
■
>View Comments
このページの上へ戻る
- 平成22年2月12日(金) 00時53分51秒
-
区分
- やすさ爆発
-
報告者:
- chiba
こんにちは、chibaです。
完全にネタが切れてしまいましたので、普段に遭遇する困ったことを書いて行きたいと思います。
月額500円位からの低価格レンタルサーバーと、WordPressの組み合わせは、個人〜中小企業の強い味方なのではないかと思うのですが、SSLのフォームの設置で一癖あるらしい、と風の噂で聞きました。
具体的には、低価格レンタルサーバーでも共有SSLが追加オプションなしで無料で使えることが多いのですが、共有SSLなので、SSLでないURLとはだいぶ違ったURLになります。
例えば、さくらインターネットならば、
http://www.example.com
に対応する共有SSLのURLは、
https://securexxxx.sakura.ne.jp/example.com
になったり、Joe'sウェブホスティングならば、
https://serverxx.instantssl.co.jp/~example
であったり色々です。
どうやら、この辺りの事情とWordPressのデフォルトの挙動の相性が良くないらしいのですが、この辺りをだらだら探っていきたいと思います。
フォーム作成用のWordPressのプラグインは、
Contact Form 7を利用することにし、
- 平成22年2月5日(金) 00時43分42秒
-
区分
- エコロジー
-
報告者:
- chiba
こんにちは、千葉です!
完全なるネタ切れです。
以前のエントリーにも書きましたが、私は返り値をできるだけ使いたくなってしまう派です。
値を返すところは積極的に拾ってゆきたい。
そういう質なので、
if pred
method(100)
else
method(200)
end
のようなものを見ると
method(if pred
100
else
200
end)
と書きたくなってしまいます。ifは分岐が2つですが、Rubyのcase等の複数への分岐も同じくそうです。
LISPだと
(method (if pred 100 200))
という感じですが、このifの纏め方は、LISPではすんなり流れるものの、Rubyだとif〜endが重たくみえるので、なんとなく書いてはいけないようにさえ感じます。
条件演算子なら
method(pred ? 100 : 200)
という風にすっきりなのですが、なんとなく読みづらいですね。
>View Comments
このページの上へ戻る
- 平成22年1月28日(木) 22時44分00秒
-
区分
- Common LISP愛
-
報告者:
- chiba
こんにちは!、chibaです。
早くも書くネタが無いのですが、どうしたら良いんでしょうか。
今年の私のテーマは「挑戦」。
先日、そんな私にぴったりな、盗んだバイクで走り出したくなる挑戦をみつけました。
PerlとC++にしかできないような気がするアノ機能(挑戦者募集中)
#!/usr/bin/perl
# PerlとC++は世界一。
srand(time);
my $a = 0;
my $b = 0;
for(my $i = 0; $i < 1000; $i++) {
(rand(2)<1 ? $a : $b) += 1;
}
print "$a, $b\n"
これをPerlや、C++以外の言語で書けるのか、と。
私は、LISP野郎なのでLISPで回答するとして考えましたが「実行時に変数の名前によって任意の変数にアクセスし、その変数に値を代入できるか」という風にお題を解釈しました。
PerlやC++の場合は、?:にそういう機能があるのでしょう。
Common Lispだとどうなるかというと、「実行時に変数の名前によって任意の変数にアクセス」というのは、シンボル名による変数へのアクセスで可能なので、上をCommon Lispに訳すと
(let ((a 0) (b 0))
(declare (special a b))
(dotimes (i 1000)
(incf (symbol-value
(if (< (random 2) 1) 'a 'b))))
(format t "~A, ~A~%" a b))
;⇒ NIL
----------
499, 501
こんな感じに書くことになるのかなあと思いました。
…というようなことをtaharaさんと昼食時に話していたのですが、taharaさん曰くifにsetfが付いてれば可能なんじゃないかとのこと。
なるほど、確かにそうです。
setfというのは代入する構文のマクロなのですが、ユーザーが色々カスタマイズできます。
実行時に変数名でアクセス→代入というのではなく、そういう構文をマクロで定義するわけですね。
ユーザーがifにsetfを書けば良いのですが、これが標準で付いている処理系をどっかでみたなーと思ったので調べてみるとCLISPがそうでした。
CLISPだと標準で
(let ((a 0) (b 0))
(dotimes (i 1000)
(incf (if (< (random 2) 1) a b)))
(format t "~A, ~A~%" a b))
;⇒ NIL
----------
513, 487
と書けます。自分はPerlは書けないのですが、+=をカスタマイズすることによって
for(my $i = 0; $i < 1000; $i++) {
if (rand(2) < 1) {
$a
} else {
$b
} += 1;
}
のようにも書けるようにユーザーが勝手に定義できる、という感じでしょうか。
こんなことをしているとすぐカオスになりそうですが、LISPに構文は無いようなものなので特に混乱もなかったりします。LISPは単純で良いですね■
>View Comments
このページの上へ戻る
- 平成22年1月21日(木) 23時27分47秒
-
区分
- Common LISP 愛
-
報告者:
- chiba
こんにちは、chibaです!
私はCommon Lispからプログラミングを始めたせいか返り値を使ったプログラミングスタイルが好きなのですが、Rubyは多値と配列と可変長引数が統合されたようになっていて、なかなか使い勝手が良く、Rubyの好きなところの一つです。いまのところ一つです。
x = 3
[0, *if x.even?
[1, 2, 3]
else
[:a, :b, :c]
end]
;⇒ [0, :a, :b, :c]
def iota(n)
if n.zero?
0
else
[n, *iota(n - 1)]
end
end
iota(10)
;⇒ [10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
Proc.new do |x, y| x * y;end [100,2]
;⇒ 200
LISP/Schemeでも、書けるといえば書けるのですが、
;; Common LISP
(let ((x 3))
`#(0 ,@(if (evenp x)
'(1 2 3)
'(:a :b :c))))
;⇒ #(0 :A :B :C)
(defun iota (n)
(if (zerop n)
(list 0)
`(,n ,@(iota (1- n)))))
;⇒ (10 9 8 7 6 5 4 3 2 1 0)
(multiple-value-call #'* (values-list '(100 2)))
;⇒ 200
;; もしくは
(apply #'* '(100 2))
;⇒ 200
Rubyの方が統一感があって良いですね。
>View Comments
このページの上へ戻る
- 平成22年1月14日(木) 22時26分25秒
-
区分
- 疎外感
-
報告者:
- chiba
こんにちは、chibaです。
昨晩は、弊社技師同僚間のTwitterで、Geohashの話題が盛り上っておりました。
話に混ざれずに疎外感を感じつつ就寝しようとしたのですが、ふと、会話中で示されていたGeohashの説明のページを眺めたところ、仕組みが分かるようで、分からないような、微妙にもどかしい感じだったので、だらだらと説明のとおりに上から順にコードを書いてみることにしました。
Geohash - Wikipedia, the free encyclopedia
そんな感じで、説明の順番のとおりに書いてできたコードが下記です。
なんとなく仕組みは分かったけど、そういえば、エンコード手順の説明は書いてないんだなあ…、と自分勝手なことを考えながら就寝しました。
(defpackage :geohash
(:use :cl)
(:import-from :shibuya.lisp
:$ :$*))
(in-package :geohash)
(defun tr (from to string)
(map 'string
(lambda (c)
(or (some (lambda (x y)
(and (char-equal x c) y))
from to)
(char-upcase c)))
string))
(defun 5bits (string)
(map 'list
($ format nil "~5,'0,B"
$ read-from-string
$ format nil "#32R~A"
$ tr "0123456789BCDEFGHJKMNPQRSTUVWXYZ"
"0123456789ABCDEFGHKJKLMNOPQRSTUV"
$ string $)
string))
(defun longitude-latitude (strings)
(let ((bit-c-list ($* concatenate 'list strings)))
(loop :for c :in bit-c-list
:for i :from (if (char= #\0 (car bit-c-list)) 0 1)
:if (evenp i) :collect c :into even
:else :collect c :into odd
:finally (return
(list :longitude
(coerce even 'string)
:latitude
(coerce odd 'string))))))
(defun bitlist (string)
(map 'list ($ parse-integer $ string $)
string))
(defun decode (bits min mid max)
(if (endp bits)
mid
($* decode
(cdr bits)
(if (zerop (car bits))
(list min (/ (+ mid min) 2) mid)
(list mid (/ (+ mid max) 2) max)))))
(defun decode-geohash (string)
(let* ((u ($ longitude-latitude $ 5bits string))
(lon (getf u :longitude))
(lat (getf u :latitude)))
(list
:longitude
($ float $ decode (bitlist lon) -90 0 90)
:latitude
($ float $ decode (bitlist lat) -180 0 180))))
(decode-geohash "u4pruydqqvj")
;⇒ (:LONGITUDE 57.64911 :LATITUDE 10.407439)
>View Comments
このページの上へ戻る
- 平成21年11月6日(金) 18時13分59秒
-
区分
- プログラムプレゼンテーション
-
報告者:
- chiba
今回のプログラム・プレゼンテーションのネタはStumpWMです。
StumpWMはタイル型ウィンドウマネージャーなのですが、Common LISPで色々と拡張することができるのが特長です。
今回は、このちょっとしたカスタマイズネタや使い方です。
Actindi社内では現在全面的にRedmineで仕事を管理していて、仕事の確認/依頼もチケット番号ですることが非常に多いです。
いつもチケットの番号でやりとりするのですが、伝えられた番号をぱっと開きたいことが多いので、これをStumpWMで便利にしてみようということで工夫してみました
(DEFPARAMETER *LAST-TICKET* NIL)
(DEFCOMMAND SHOW-TICKET (TICKET-NUMBER) ((:STRING "Ticket#: "))
(WHEN (RUN-SHELL-COMMAND
(FORMAT NIL
"/usr/bin/firefox "https://redmine.example.com/issues/show/~A\""
TICKET-NUMBER))
(SETQ *LAST-TICKET* TICKET-NUMBER)))
(DEFCOMMAND EDIT-IT () ()
(RUN-SHELL-COMMAND
(FORMAT NIL
"/usr/bin/firefox "https://redmine.example.com/issues/edit/~A\""
*LAST-TICKET*)))
非常にでっちあげ感の漂う適当なコードですが、show-ticket 1234という風に実行すると、Redmineの1234番のチケットがfirefoxで表示されます。
edit-itコマンドは保存していた直前のチケット番号を編集状態で開くという単純なものです。
ちょっとした工夫ですが、割と便利で愛用しています。
といった具合で、その他、StumpWMの機能の説明をして1時間をしのぎました。
みなさんもご興味あれば、StumpWMをお試しあれ。
>View Comments
このページの上へ戻る
- 平成21年10月8日(木) 17時18分22秒
-
区分
- プログラムプレゼンテーション
-
報告者:
- chiba
chibaです。
今回のプログラム・プレゼンテーションのネタは日常で使うちょっとしたスクリプトをCommon Lispでやってみようというものです。
ネタ切れなので自分の
ブログに書いたネタ
を再演しつつ、ブログでは紹介してなかったwgetも併せて動かしてみました
適当なwget
Software ToolsのごとくCommon Lisp上にユーティリティを作成して行けば、Common Lispだけでこういう細かい仕事はできるようになるやもしれません。
>View Comments
このページの上へ戻る