ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

Lispで書くテキスト処理コミュのLisperを増やそう!

  • mixiチェック
  • このエントリーをはてなブックマークに追加
自分の周囲にLisp Programer(以降Lisperと呼称)を増やすにはどうしたら良い
かを考えるトピです。

このコミュは、すでにLisperな人、出来ればLisperになりたい人、漠然とLispと
いう言語に興味を持っている人、などの集まりだと思っています。ひょっとした
ら愚かなLisperを嘲笑する人?も多少含んでいるかもしれません。

出来ればLisperになりたい人がどのくらい居るか分かりません。ひょっとしたら
今はまだ一人も居ないのかもしれません。でも、もし一人でも居るのであれば、
その方への協力は惜しみません。すでにLisperな人を踏み台にして、Lisperの仲
間入りを果たしてください。

むかしから「言語を2つ以上知っているプログラマは強い」と言われています。
仕事でLispのプログラムを書いている人はあまり居ないと思うので、2つ目の言
語にしてみてはいかがでしょう。

自分はもの分かりが悪いから・・・などと諦める必要はありません。何も1日や2
日でLisperになろうと言っているわけではないのですから。何年かかっても良い
のではないでしょうか。

コメント(12)

Keiさん、さっそくありがとうございます。

私にはSchemeとLispの違いが言えるほどのスキルはないし、Common Lispもよく
知らないので、このご質問にはとりあえずYesと答えるしかありません。

たぶん他にもいろいろあると思いますが、「すでにLisperな人」が対応可能であ
れば良いのではないでしょうか。何か問題が発生したら、その都度考えましょう。
とりあえず今1個プログラムを書こうとしています。

どんなプログラムかというと、サイボウズデヂエ上にある案件管理簿ライブラリ
でSEがアサインされたら、そのSEにメールで通知するというものです。平たく言
うと、デヂエをワークフロー的に使うための補助プログラムです。出来上がった
ら実際の業務で使用します。

デヂエには元々メール通知機能があるのですが、あるフィールドに記入された名
前の人にメールを通知しようとすると、メール通知のルールをフィールド毎、名
前毎にたくさん設定してやらないといけません。たぶんメール通知のルールを
CSVでインポートする機能があれば、こんなプログラムは作る必要ないと思いま
すが、そういう機能はありません。

仕様は簡単で、SEの名前が入るフィールドに変更があれば、変更後の名前を元に
別のライブラリからメールアドレスを取得してメールを送信する・・・というも
のです。変更によってアサインを解除された人に解除通知のメールを送信すると
いうのをオプションとして考えても良いかもしれません。

もう頭の中ではプログラムがほぼ出来上がっているので、あとはそれをコード化
するだけなのですが、何となく必要な情報をかき集めてmapcar*で処理してみよ
うかな?と考えています。

「出来ればLiserになりたい人」はこのようなプログラムを作ろうとした場合に、
どうすれば良いかを考えてみてください。もちろん、他にネタがあればそれをや
っていただいて構いません。ちなみにデヂエは試用期間中は無料で使えるので、
その気があればインストールして使用することが出来ます。
えーっと、3のプログラムはみなさんとどう作るかいっしょに考えようと思って
いましたが、もう出来ちゃいました。

まあでも、このネタでプログラムを書いてみたい人が居たら発言してください。
ちょっと違うものが出来上がるのかもしれません。
「デヂエのメール通知補助プログラム」というのは、これからLisperになりたい
人にとっては???なネタだったかもしれません。そもそもデヂエって何?って
いう疑問が湧いてしまったら先に進めません。私はサイボウズ社の回し者ではな
いし、ここでデヂエのことを詳しく書くわけにいかないと思うので、以後「SI案
件管理簿CSVファイル」という日々更新されるデータがあって、それを元に新た
にアサインされたSEさんにメールを通知する・・・というふうに読み替えたいと
思います。

Lisperが解決すべきは、こんな感じのニッチな問題だというふうに考えた方が良
いと思います。じゃないと「なんでLispなの?」という疑問符まで付いてきてし
まいます。個人的には「なんでEmacsなの?」って言われることも多々あります。
ただ、なんでXXなの?と言う人でXX以外の解決策をサクッと示してくれる人って
なかなか居ないものです。

あと、このコミュにはLispのプログラムを書く以前に、何をプログラムにすれば
良いかが分からない人も居ると思うので、まずは設計する必要がありますね。実
はそういうツッコミを期待していたのですが・・・。

このプログラムの最も大くくりの述語となるのは「メール送信」だと思います。
なので、メールを送信するのに何が必要かを考えることが設計作業のメインにな
ると思われます。いきなり身近な問題になってきたのではないでしょうか。

メール送信に必要なのは、宛先、表題、本文ですね。

宛先はアサインされたSEさんのメールアドレスです。SEさんの名前はSI案件管理
簿CSVファイルにあります。でもメールアドレスはないので、名前からメールア
ドレスを取得する方法が必要になります。これに、デヂエのユーザ情報をエクス
ポートしたCSVファイル「メールアドレスCSVファイル」を使用します。

表題はたとえば「アサイン通知だよ〜ん」のような固定的な文字列で良いと思い
ます。

本文は、SI案件管理簿CSVファイルのどのレコードに関するアサインなのかが分
かれば良いと思います。つまり案件毎に付与されたユニークキーですね。デヂエ
を意識するのであれば、そのレコードの参照URLを載せても良いと思います。あ
とは、普通にメールを受け取った人が不快にならないような文面にしましょう。

だいたい以下のような処理になると思います。

・SI案件管理簿CSVファイルを読み込む。
・メールアドレスCSVファイルを読み込む。
・SI案件管理簿CSVレコードのSE欄に名前が入っていたら、その名前に対応する
 メールアドレスを取得する。
・メール本文を編集する。
・メールを送信する。

以下の条件が必要です。

・メール通知は案件毎、SE毎に1回だけにする必要があります。
・SEは案件毎に複数人アサインされることがあるのでSE欄は複数あります。
・Windowsサーバ上のタスクスケジューラから起動されるバッチ処理です。


あとはどうプログラムを書くかに落ちたと思いますが、どうでしょうね・・・。
えー・・・、Lisperを増やそうトピですが、早くも暗雲が立ち込めていますかね。
まあ、ちょっと最初の例題が悪かった気もしていますので、この話はもう少し自
分で書いて終わりにしておこうと思います。

前回はいわゆる機能設計レベルまで書いてあったと思います。なので、今回はそ
れを詳細化します。ただ、私はプログラムを書くときに設計書に縛られるのが嫌
いなので、設計して作ったのではなく、データの流れを思い浮かべて、個々のデ
ータ加工をどうするか頭の中で整理するだけです。


「SI案件管理簿CSVファイルを読み込む」
 これは正確に書くと「CSVファイルを読み込んでリストにする」になります。
デヂエの処理をLispで書くまではCSVなんて改行で区切って行リストを作り、そ
の後個々の行をカンマで区切れば簡単に(("フィールド1" "フィールド2"...)...)
という構造のリストになる・・・なんて思っていました。でもフィールド内に改
行を許すCSVの場合は、少なくとも個々のフィールドがダブルクォートで括られ
ているし、安易に行=レコードなんて考えていると痛い目に遭います。実は安易
に考え過ぎて業務データを壊してしまったこともあるのです。
 ちょっと前に別のトピで「汎用的なCSV読み込み処理」のことを質問した頃に
悩んでいたことです。最近は多少頭の中が整理出来てきて「レコードの先頭はダ
ブルクォートにカンマ以外の文字が続く」で判断可能なので、それを元にレコー
ド文字列のリストを作ったら、文字列の先頭と末尾(つまりダブルクォート)を
落として、「\",\"」をセパレータとしてsplit-stringすることが出来ます。下
手にダブルクォートをサーチしてフィールドを抽出しようとするとフィールド内
に閉じている保証のないダブルクォートが書かれていた場合に混乱しそうだから
です。


「メールアドレスCSVファイルを読み込む」
 これは予めデヂエのユーザ登録データをCSV出力しておいて、それを使います。
ホントはその都度バッチで出力すべきなのですが、コマンドラインでユーザ登録
データを出力する機能がないのです。たしかユーザ登録データはUID、名前、ユ
ーザ名、ログインID、メールアドレス...と続くので、CSVをリスト化したら、
mapcarとnthcdrを使って、名前で始まる連想リストを作ることが出来ます。nth
とconsを使って必要なフィールドだけ拾うことも可能です。


「SI案件管理簿CSVレコードのSE欄に名前が入っていたら、その名前に対応する
メールアドレスを取得する」
 これは先ほどリスト化したメールアドレスの連想リストをassocで検索するだ
けの処理です。
 ただし「メール通知は案件毎、SE毎に1回だけ」という条件があるので、SE欄
に名前が入っていることだけを調べて即メール送信というわけにはいきません。
つまり前回処理したときのSI案件管理簿CSVのSE欄と見比べて処理する必要があ
るのです。普段こういう条件が入ってくると途端に面倒臭くなって、作るのがイ
ヤになるかもしれませんが、Lispだと全然苦にならないから不思議です。
 まず前回以前に処理したときのSE欄リストというCSVファイルを考えます。こ
れは(案件番号、SE1、SE2、SE3...)というリストをCSV化したものです。これ
を前回以前にメール通知済みかどうかを調べるときに使います。今回分も同じ形
のリストにして比較した後、そのリストをさらにリストにしておいて最後にCSV
化してファイルに書き込めば良いのです。リストのままバッファにprintして、
それをファイルに書き込んでも構いません。その場合は次回CSV読み込みでなく、
そのファイルを開いてreadするだけで済みます。


「メール本文を編集する 」
 メール通知する対象が決まったら、メール本文を編集します。これは必要な情
報をSI案件管理簿CSVから取り出して、formatで埋め込むだけです。


「メールを送信する」
 メールの送信にはMeadowのパッケージに入っているWanderlustを使いました。
標準のメールモードでも送信は可能かもしれませんが、私は上手くいきませんで
した。wlならwl-draftに宛先や題名を指定するalistと、メール本文を指定する
だけでドラフトバッファを作ってくれるので、あとはwl-interactive-sendとい
う変数をnilにしてwl-draft-send-and-exitを呼ぶだけです。当然ですが、SMTP
サーバのIPなどは事前に該当変数へ設定しておく必要があります。また、メール
送信は非同期処理なのでsit-forを1秒指定(秒数は適宜)で数回呼んでやる必要
もあります。


処理的にはこんな感じです。これをLispで書けば良いのです。


・・・ということで、このネタについては一旦終わりたいと思います。
なんとなく・・・Lispで作るプログラムは賢くないといけないとか?
そういうイメージがあるのでしょうか??

そもそも、賢いとはどういうことなのかを語らずして、そういうイメージを
先行させる人が多い?ような気がしていますが、いかがでしょうか。
はじめまして。
Lispには昔から憧れているのですが、処理系(Gauche)をインストールした後、どうしたらいいのか分からずにずっと初心者でいます。

参考になる書籍やWebページなど、ご指導いただければ幸いです。よろしくお願いします。
HALさん、はじめまして。

GaucheというのはSchemeの一種だというのは知っていますが・・・
SchemeというとCygwinでお手軽に使えるGuileなら起動したことはあります。
どうしたら良いのかというのは? どうすればGaucheでプログラムを書けるように
なるのか?ということですかね・・・。

私はelispから入ったので、最もよく読んだのはこれです。以前は書籍になったものを
肌身離さず?持っていましたが、会社を変わるとき、誰かに差し上げました。
http://flex.ee.uec.ac.jp/texi/eljman/eljman_toc.html

まあ私が語らずとも、ここにはSchemerの方が多いと思います。読んだことは
ありませんが、Paul Grahamの書籍が良いのではないでしょうか。ググれば、
いろんな情報が出てくると思います。
>ノブさん
さっそくのフォローありがとうございます。教えていただいたWEBサイトを読んでみます。私の環境は
Ubuntu GNU/Linux 10.04LTSです。現在、GNU Emacs23でGaucheを動かすべく調査中です。

もし差し支えなければ参考までにみなさんのLisp開発環境を教えてください。
よろしくお願いします。
現在の環境はちょっと前に書いたかもしれませんが・・・OSがWindows 7
Professionalで、LinuxはUbuntu 10.04LTSをVMwareで動かしています。この仮想
マシンにはCPUスレッドを4個割り当てているので、下手にデュアルブートでイン
ストールするよりも軽快に?動きます。

Windows上では主にMeadow 3(Emacs 22.3)とxyzzy、たまにCygwin上のEmacsや
XEmacsをさわったりします。Linux上ではパッケージインストールしたEmacs 23
と、bzrで取得した最新ソースから自分でビルドしたEmacs 24が動いています。

Cygwinを入れているのでWindowsでもLinuxとほとんど同様のことが出来ます。
elispのプログラムを書くときはEmacsのセルフドキュメンテーションやinfoだけ
で十分です。デバッガは当然edebugです。これは本当に優れものだと思います。
漠然と他のLisp環境にもこういうソースレベルデバッガがあれば、かなりお気楽
にプログラムを作れると思うんですが、詳しいことは知りません。

Emacs 23でGaucheを動かすには、C-u M-x run-schemeして、プログラムをgoshに
書き換えてリターンすれば起動すると思いますが・・・出来ませんか?これは他
のSchemeでも同様だと思います。そしてfoo.scmなどの適当なファイル名でプロ
グラムを書いて、実行すれば良いのではないでしょうか。

でも、Schemeに関して全く知識がないので、どなたかフォローをお願いします。
このトピを進める上でちょっと質問なんですが・・・。

このコミュにはやはりScheme好きな方が多いようです。そこで、Schemeでどん
なプログラムを書いているのか、どなたかご紹介いただけないでしょうか。

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

Lispで書くテキスト処理 更新情報

Lispで書くテキスト処理のメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング