ラベル 技術 の投稿を表示しています。 すべての投稿を表示
ラベル 技術 の投稿を表示しています。 すべての投稿を表示

2022-03-21

Operations Anti-Patternsの翻訳版が出るのでおすすめする #システム運用アンチパターン

2020年にTwitterで紹介されているのを見つけて読んだ Operations Anti-Patterns の邦訳が4月に出るそうです。
とても良い内容だったので事前におすすめしておきたい。

上層部がDevOpsに理解のない組織で働き、組織構造を変える権限を持っていない開発者であっても、チームにDevOpsを導入するための現実的な方法を紹介します。

重厚な承認プロセス、可視化されていない運用、プロセスの最後でのみ行われるソフトウェアテスト、ノイズだらけのアラート、インシデントから学習しない習慣、時間外のデプロイ、情報のため込みなどを取り上げ、ソフトウェアシステムの開発運用が滞るチームや組織に共通してみられる陥りがちな状況や犯しがちな間違いをアンチパターンとして紹介します。そして管理職やマネージャでなく、エンジニアが実行し、繰り返すことで改善できる具体的な行動を解説します。

組織で必要とされる変化を、エンジニアが行動することで実現する本書は、ソフトウェアシステムをよりよく開発運用したいエンジニア必携の一冊です。
O’Reilly Village/オラの村 - 4月新刊情報『システム運用アンチパターン』

紹介文からつらみが溢れていて良いですねー。「現実的」「具体的」というのは本当にそうで、この本の良いところです。

2021-12-08

golang: 一時的/恒久的なエラーの隙間をハンドリングする

これはGoアドベントカレンダー3の8日目の記事です。

外部のAPIと連携して仕事をするサービスを長年運用・開発しています。 エラーが発生しある仕事が完了できないことがあり、その場合はエラーレポートを見て手動対応します。 なるべく運用負荷を減らすため、エラーの自動対応を進めていく過程で見つけた方針・実装テクがあるので紹介します。

ポイント

  • 一時的なエラー、恒久的なエラーのあいだにはグラデーションがある
  • エラー自身にエラー対応をさせると複雑さが減る


エラーのグラデーション

エラーハンドリングの記事を探すと、func Temporary(err) bool で一時的なエラーか判別してリトライをかますのをよく見ます。 一時的なエラーとは例えばネットワークのTimeoutなど。時間をおけば自動的に回復ししそうなもの。 それ以外はぜんぶ恒久的(Permanent)なエラーとしてレポートを上げてしまう。

実際に運用していると上がってきたエラーにはなにか対応が必要なので手を取られてしまいます。 可能ならば自動対応してエラーレポートしないようにしたい。

運用をつづけていて一時的なエラーと恒久的なエラーのあいだに次のようなエラーの種類があることに気づきました。

  • そのままではリトライしても成功しないけれど、何かの操作をすれば成功する状態に持っていける回復可能なエラー
  • どうやってもリトライ成功にはできないけど、失敗した状況をマシにしたり詳細なレポートを作れるフォロー可能なエラー

単に一時的なエラーかそうでないかだけでなく、これらを区別してハンドリングすることで成功率を上げて手動対応を減らすことを目指します。

区分 自動対応 レポート 説明
一時的 不要
回復可能 不要 なにか操作することで回復可能
フォロー可能 不可 必要 回復不能だがより良い状態に出来る
恒久的 不可 必要



2021-12-04

Clojureで行列計算を実装したときに考えたトリック

これはClojureのアドベントカレンダー2021、4日目の記事です。


趣味でディープニューラルネットワークのフレームワークをClojureでゼロから実装しています。

「ゼロから」とは行列計算から。

deltam/neuro: Deep Neural Network written in Clojure from scratch

そのときに行列計算についてあるトリックを思いついて実装したら早くなったのでそれを紹介してみます。関数的プログラミングっぽい発想で、ほかにも応用が効くかもしれない。Clojureのデータ構造の勘所もすこし分かるかも。

注意:完全なる趣味の行いなので単に行列計算したいだけならそれ用のライブラリを使うほうが100倍かしこい。
実用的な知識というよりちょっとしたトリックを面白がってくれればありがたい。

ニューラルネットの学習では行列の転置をよく使うんですが、プロファイルを取ってみたらそこが遅かったので何とかしたいといろいろやって思いついたトリックです。
思ったより応用が効きました。

2019-06-29

グレッグ・イーガン経由で知った順列生成アルゴリズム

SF作家のグレッグ・イーガンさんは最小超置換文字列の分散探索プロジェクトを主催しています。それ自体も興味深いんですが、解説ページで紹介されていた副産物の順列を列挙するアルゴリズムが面白かったので紹介&実装してみます。

Local Ruleのセクションで解説されている内容の紹介です。)

(追記:順列生成アルゴリズムをライブラリ化しました deltam/perm: Permutation generator based on group theory written in Go.

順列生成アルゴリズム

まず順列の順番を入れ替える写像sigma、deltaを次のように定義します。

sigma: (2,3,4,...,n-1,n,1)
delta: (3,4,5,...,n-1,n,2,1)

始点の順列を(n-2, n-3, ..., 3, 2, n, 1)として、それに対して次のルールAを繰り返し適用します。

ルールA
以下の条件をすべて満たすなら現在の順列にdeltaを適用し、そうでないならsigmaを適用する。

  1. 左端の数字がnではない。
  2. 順列中のnの右隣の数字をrとする(nが右端なら左から2番めをrとする)。左端の数字をfとし、r が 1+(f-2) mod (n-1) と等しい。
  3. 現在の順列が(1, n, n-1, ..., 3, 2)ではない。

(2番めの条件が分かりにくいので具体例を挙げると、順列(3, 1, 2, 4) ならf=3かつr=1で、1+(3-2) mod (4-1) = 1+1 = 2なので r = 1 ≠ 2となります)

始点からルールAを繰り返し適用した系列はすべての順列が一回だけ登場するものになっています。

実験

2018-10-10

カスタマイズしやすい重み付きレーベンシュタイン距離ライブラリをGoで書きました

deltam/go-lsd-parametrized: Weighted Leveshtein Distance and its extended interfaces written in Go.

重み付きレーベンシュタイン距離(編集距離)のライブラリを書きました。文字ごとに追加・削除・置換のコストが指定できます。文字列の長さによる正規化や複数の文字列から近いものを選ぶ関数も含まれてます。

エラーメッセージをラフに分類したいという動機から作り始めました。類型的で機械学習が必須なわけでない分類タスクにお役立てください。
詳しい使い方はGitHubのREADMEを見てください。

go get -u github.com/deltam/go-lsd-parametrized

カスタマイズ


2010-11-05

ePubcastローカル版の遊び方を説明します!

先日、ありえる勉強会でLT発表したときに触れたePubcastのローカルサーバ版がだいたい出来たので使い方を書いておきます。

このソフトウェアの目的は「ePubをPodcastで配信する実験を行う」なので、機能はおもちゃ程度です。とりあえずePubとPodcastでなにができるか手元で遊んでみたい人向けに説明します。以下ではMacBook+Google Chromeで説明してますが、Windows、他のブラウザでも基本的に同じです。

まずJarファイルをダウンロードします。0.0.11のやつです。

Downloads for deltam's ePubcast - GitHub

これを適当なフォルダに置き、同じフォルダに"static"という名前のフォルダを作ります。このstaticフォルダにePubを置くだけでPodcast配信が出来るようになります。

上述の準備が終わったらサーバを起動します。コンソールを立ち上げてJarを置いたフォルダに移動し、以下のように打ち込みます。2行目以降のようにログが表示されたら起動してます。

$ java -jar epubcast-0.0.11-alpha-standalone.jar 
2010-11-05 08:14:25.944::INFO:  Logging to STDERR via org.mortbay.log.StdErrLog
2010-11-05 08:14:25.960::INFO:  jetty-6.1.x
2010-11-05 08:14:26.050::INFO:  Started SocketConnector@0.0.0.0:8080


ブラウザでhttp://localhost:8080をアドレスバーに打ち込みます。



ブラウザ上ではstaticフォルダの中身をリストにして表示させてます。
[add iTunes]というリンクを押すと、以下のようなメッセージが出てくるので[アプリケーションの起動]を押してください。



これでiTunesのPodcastに自動追加されます。


ここですべてのePubをダウンロードさせて、iTunes「ブック」のページを見てみると、ダウンロードしたePubが追加されていることが分かると思います。



これでiPodTouch/iPhoneを同期させて、iBooksを開くと下のようにePubが追加されます。

これで読めます!


以下、ちょっと補足。

Q. 配信するePubがない
A. feed2epub-cljを使ってはどうでしょう。長文記事のブログを読むときなどにePubに変換できます。(ファイル名が日本語だとePubcastでダウンロードできなかったりするので適宜変えてください)

Q. ローカルだけじゃなくてインターネットで公開したい!
A. このePubcastをGoogle AppEngineに移植する作業を始めてます。しばしお待ちを!


【参考リンク】
[ポ] 電子書籍に繋がった - ...My cup of tea...
こちらの記事で始めてEPUBをPodcast配信できることを知りました。感謝。
アップル - iTunes - Podcast - Podcastを作成する
アップルの技術資料。EPUBは配信可能なファイル形式に含まれてないですが、きっちりiBooksにも追加できちゃいました。
deltam's ePubcast at master - GitHub
ソースコードも公開してます(Clojureですが)。1ファイルべた書きなのでそれなりに分かりやすいかと。

2010-10-31

「Lisp脳」勉強会でEPUB関連ツールのLT発表してきました #arielarea

”ありえるえりあ勉強会〜「Lisp脳」勉強会〜”でライトニングトーク(LT)してきました。5分ほどの発表時間内で、今までやってきたEPUB関連ツールとこれから作ろうとしているEPUB生成/配信システムの説明をしました。
まずはプレゼン資料です。
前々から「そろそろ自分のEPUBに関する考えをちゃんと説明しておかないといけないな」と考えていたので、ちょうどいい機会だと思って好き勝手に話させてもらいました。アリエルさんありがとうございました! 正直言いまして、初めてのLTでUstreamで中継されている、さらに資料はその日の15時ぐらいから作り始めた、という悪いフラグ立ちまくりな中で発表したのですが、どうだったんでしょ? 発表内容はこれ以上無いぐらいシンプルに作ったので、話す内容に迷いはなかったですけども。 話した内容を思い出せる範囲で箇条書きにしておきます。
  • 野望『みんなが書いた長い文章を エディタからショートカット一発で みんなの手のひらの中に届ける』
  • 「みんなプログラムを書けるってことはエディタがあって一定量のテキストを打つことが出来て、論理的思考力がある。なぜ小説を書かないのか?」
  • 「作文を書くのが嫌いな人が多かったはずなのに”ブログ”という形式ができた途端、自発的に文章を書く人が増えた」
  • 「同じように、小説もしくは長文エッセイを流通させる形式ができたら、みんな小説を書き始めるんではないか?」
  • 「そんな野望を抱きつつ、ClojureでEPUB関連ツールを作ってます」
われながら極論だなーと思いますけど、その後の懇親会でもいろいろ反応してくれる人がいたので「関心を持ってもらい議論を巻き起こす」という効果は少しあったのかと考えてます。これからEPUB関連ツールを作っていく上で間違いなくプラスになったと思います。 まずは報告まで。ではコーディングを継続していきます。 【参考リンク】 ・L5 資料作りに使ったLT用のプレゼンツールです。ClojureのS式(テキスト)でプレゼンを書くことができて、サクっと作り始められて直前まで手直しできました。ほかにもPDF出力機能など、いろいろ出来がいい。開発者の深町さんが活発に開発しているみたいなので、進化に期待してます! ・EPUB関連ツールの記事: サルノオボエガキ: ePub このブログのEPUBタグにまとめてあります ・書いた小説:ラノベ小説(?)書きました : サルノオボエガキ この小説のテキストファイル、text2epub-cljのテストデータとして同梱してます。samplesフォルダにしれっと入れちゃったりして。 ・ Lisp脳と世代 — ありえるえりあ アリエルさん、最後の最後で空気読まない発表でさーせんしたっ! ・発表したL5のソース 深町さんにならってそのまま貼りつけときます。コピペ便利。
(ns L5.sample
  (:use L5 L5.layout)
  (:import [java.awt Color]))

(defcontext
  {:width 640 :height 480
   :font-family "Gill Sans"
   :font-size 30
   :color (Color/white)
   :background-color Color/black})

(defslides
  [(with-size 35
     (t "ClojureとEPUBと俺"))

   (with-size 15
     (lines "さいたま・無職"
            "deltam"
            "2010/10/29"
            "Powered by L5"))]

  [(title "自己紹介")
   (item "@deltam {:blog サルノオボエガキ}"
         "プログラム書くのが好き(Clojureに注力)"
         "小説書くのが好き"
         "Lisper未満、ワナビー未満")
   (with-size 20
     (item "素数腕立て伏せ愛好家"))
   (img "icon.png")]
  
  [(t "Lisp脳?")]
  
  [(t "ClojureではじめてLispを使い始めました"
      "-> Lisp脳にセルフ洗脳中?")]
  
  [(title "野望")
   (with-size 35
     (lines "『みんなが書いた長い文章を"
            "エディタからショートカット一発で"
            "みんなの手のひらの中に届ける』"))]
  
  [(t "どうやって?"
      "→これから説明します")]
  
  [(title "!注意書き!")
   (item "EPUBのことしか話しません!")
   (lines "\"電子書籍\"ってバズり過ぎてて"
          "話せません!")]
  
  [(title "EPUBってなに?")
   (item "XML(メタデータ)+XHTML+αをZip圧縮。"
         "\"枯れた技術の水平思考\"")
   (img "folder_tree.png")]
  
  [(title "つくったもの")
   (item "text2epub-clj (2010-07-02..)"
         " PlainTextをEPUBに変換するだけ"
         "feed2epub-clj (2010-08-03..)"
         " RSS2/ATOMからEPUB作る"
         "ePubcast (2010-08-28..)"
         " 作ったEPUBを流すPodcastサーバ")]
  
  [(title "こんなふうに変換できます")
   (img "epub_convert.png")]
  
  [(title "反響")
   (with-size 25
     (item "ちょっとだけ使ってくれる人がいた")
     (item "text2epub-clj"
           " MOONGIFTで紹介"
           " @kotorikoに褒められる"
           "feed2epub-clj"
           " 自分のブログをEPUBにして読むなど"
           " 数人、遊んでくれた人いた模様"
           "ePubcast"
           " とくになし(まだできないナイッス)"))]
  
  [(title "つくってみて分かった問題")
   (item "ePubを作ってもみんなの手元に届ける"
         "ルートがない!"
         "→Podcast RSSのエンクロージャに\".epub\""
         "を設定するとiBooksに自動追加される")]
  
  [
   (img "epub_system.jpg")]
  
  [(title "弱点")
   (with-size 25
     (item "無職..."
           " 時間はいっぱいあるよ!"
           "ClojureやってるのにLisp技術の勉強が追いつかない"
           "  マクロむずかしい"
           "サーバサイドの技術よく知らない"
           " GAE/J勉強中"))]
  
  [(with-size 50
     (t "べ、べつにpull requestして"
        "くれてもいいんだからねっ!"
        "http://github.com/deltam"))]

  [(title "告知")
   (item "ほぼ毎月、Tokyo.cljやってます"
         "Clojureは友だち、こわくないよ!")]
  
  [(t "おわり")]
)

2010-10-05

text2epub-clj更新、行頭"!!"でePub目次設定。

Downloads for deltam's text2epub-clj - GitHub
ここの0.0.3-alphaの更新内容のご報告です。


これまでのお話し→ サルノオボエガキ: ePub

text2epub-cljを更新しました。version 0.0.3-alphaです(もはやバージョン番号の意味が分からない)。

今回は簡易記法を導入してみました。前回までだとePubのページ分割をするのは「章ごとに複数ファイルに保存」しないとtext2epub-cljではページ分割出来ませんでした。でも書いてる最中は章ごとにファイルを分けるなんて面倒なことしたくない。だから簡単な記法をちょちょいと付けて、そのまんまtext2epub-cljに通したらページ分割できたらいいなーと思って作りました。

まずは例を見てもらうのがいいでしょう。GitHubリポジトリのsamplesフォルダにあるhello.txtから全文引用。

!title! hello
!author! hello

!! chapter 1
this is a pen.
hello world.

!! chap 2
hello! hello!
today is sunday

!! end
eof, eof!

これをtext2epub-cljに通してePubをiTunesにドラッグアンドドロップ、iPod touchに同期するとiBooksではこうなります。



こうなりました。

「!title!とか!author!ってなんやねん?」。あとで書く予定のePubメタデータ簡易記法のプロトです。あんまりカッコよくないので良い案があったらコメントください。とりあえず作っときます(あとで)。

これでしれっとSamplesフォルダにテストデータとして追加しておいた自作小説の『スウスウと砂漠の運び屋』もちゃんとePub化できたヨ。




あとCommonLisper深町さんforkしていろいろ直してくれたりMarkdown記法で書けるようにした分があるんですが、こっちをマージする前にとりあえず出しちまおうと思ってアップしときました。ちゃんと吸収しますよ!>深町さん


以上、進捗報告でした。また開発に戻る!

【リンク】
L5のver1.1.0をリリースしました - 八発白中
プレゼンツール。Clojureで書かれているので参考に読んでます。
生まれて3日目のUn-Common Lisp - 八発白中
Lisperはあるレベルを超えると自分言語を作り出すというのは都市伝説ではなかったのだなー

2010-08-04

秀吉とMapReduce

高校のとき数学の先生がよく授業の合間に雑談をしてくれた。そのなかで聞いた豊臣秀吉の話しが面白かったのでいろいろ絡めて紹介。

あなたはいきなり鬱蒼とした森に連れてこられて、「あの山に生えている樹の本数を可能なかぎり正確に数えてこい」って命令されたらどうしますか? もちろん秀吉の話しなので部下はそれなりにたくさん居るとします。

山の表面積を計測して、ランダムに区画を選んでその中の樹を数えて、ひと山の概算をしますか?
それとも部下を何グループかに分けて麓から地道に樹の本数を数えながら登らせますか?
秀吉はどっちの方法もとらず、さらに精度が良い方法で樹の本数を部下たちに数えさせました。

それはこんな話し。

豊臣秀吉はあるとき、一つの山に何本の樹が生えているか調べるという任務を仰せつかった(理由は建築資材の見積もりだったかな?)。ひと山は広い。いちいち数えていたのでは何日経っても終わらないし、重複して数えるミスも出てくるだろう。

秀吉はどうしたか。

まずたくさんの紐を用意した。そしてその紐を部下たちに配りこう言った。
あの山にある樹に紐を縛り付けてこい、ただし一本の樹に紐は一本だけしか縛ってはいけない
たくさんの部下たちを動員してもう縛り付ける樹が見つからないほどその作業を続けた後、今度はこう言った。
樹に縛り付けた紐を解いて持ってきなさい
そして秀吉は集めた紐の数を数えてひと山の樹の本数を調べた。

これは数学における1対1対応の応用である。秀吉はとても数学的な思考力を持った武将であった」と数学の先生は最後に付け加えた。



これってMapReduceの考え方とも似てないだろうか?

MapReduceっていうのは、Googleが膨大なサーバ群で分散処理を実行するときに使われているプログラミングフレームワーク。

MapReduceでは処理するデータをKey-Valueの組みとして扱い、それをプログラマが書いたMap関数とReduce関数で処理していきます。
ラフに説明するとMap関数では「Keyの値ごとにValueをどう処理するか」を書いて、Reduce関数では「処理結果を各Keyに対してどのように集計するのか」書く感じ。


MapReduce論文(PDF)
のP.3, Figure 1の処理手順を書き出して、それに上記の秀吉の数え方を対応させてみよう。処理の詳細は同論文の”3.1 ExecutionOverview”から抜粋。
  • Input files
    • MapReduce(以下MP):処理するデータを一定サイズに切り分ける
    • 秀吉: 兵たちに紐を配る
  • Map phase
    • MR : 複数のWorkerがUser Programに従って切り分けたデータを処理する
    • 秀吉: 兵たちが山に登って木に紐を縛り付ける
  • Intermediate files
    • MR: Map phaseで処理した結果を保持する
    • 秀吉: 縛り付けられた紐(でいいのかな?)
  • Reduce phase
    • MR: Keyごとに保持された結果を集計する
    • 秀吉: 兵に命じて縛り付けた紐を回収すると同時に本数を集計。
  • Output files
    • MR: 集計結果
    • 秀吉: 紐の数すなわちひと山にある樹の本数

秀吉の方法が優れているのは動員する部下を増やせば増やすほど早く数えられるというところだろう。つまり作業の並列化によるスケールアウトができる。サーバを増やせば性能が比例して上がるWebのバックグラウンドシステムみたい。
1、2、3と数えて行く方法は並列化しづらいし、間違い防止やらで末端作業者の負担が大きい。
秀吉の方法では、末端の作業者には単純なルールを守らせるだけでミスを減らすことが出来る(一本の樹に一本の紐)。だから人員の調達も低コストで行える。
さすが後に天下を取る男、素晴らしく頭が切れて無駄がないですね。

ということで、
「豊臣秀吉は戦国時代からMapReduceを駆使する関数型武将だったんだよ!」「な、なんだってー!!」
というエントリでした。



・・・・・・正直言いまして、上記のリストがMapReduceの説明に本当に合っているのか自信がありません。あと秀吉の逸話もソースが不明です。そこらへん、コメントで教えてくれる方がいたら有難いです。m(__)m

2010-07-02

テキストファイルをePub化するツールをClojureで作りました。

追記(2010-08-10):現状、複数のファイルを束ねてファイ名を目次にしたepubを作るとこまで作成。こちらでそのことを紹介してくれてマジ感謝。
MOONGIFT » Blog Archive » テキストファイルをePub化「Text2ePub-clj」 オープンソース・ソフトウェア/フリーウェアを毎日紹介



deltam's text2epub-clj at master - GitHub


ePubというのはiPad、iPhone、iPodTouch(iOS4かつiBooks)などで読むことが出来る電子書籍のフォーマットです。
ePubを作るツールはいろいろあるんですが、単純にテキストファイルをePubにするツールが見当たらなかったので作ってみました(Clojureの練習も兼ねて)。
iBooksで読めるePubを作るところまで来たので、alpha版として紹介します。完成度:”とりあえず動く”、なので近日中にいろいろ書き換える予定。

以下、そのツールtext2epub-cljでテキストファイルからePubを作りiBooksで読むまでを説明します。


  • まずDownloadページに行ってtext2epub-clj-standalone-0.0.1-alpha.jarをダウンロードしてきてください。Javaの実行環境があればこのJarひとつで動きます。
  • ePub化したいテキストファイルを用意してください。これはUTF-8でエンコード必須です。
  • コマンドラインで以下のように打ってください。
    java -jar text2epub-clj-standalone-0.0.1-alpha.jar テキストファイル名 ePub名.epub ePubのタイトル
  • これでePub名.epubというファイルが出来るはずです。そのほかcontent.opfとかファイルが出来てると思いますが、それらは削除してOKです。
  • そのePubをiTunesにドラッグ&ドロップしてください。上手く行ってれば”ブック”の項目にコマンドラインで打ち込んだタイトルが表示されるはずです。
  • iPhone、iPodTouchを同期してePubを送ります。iBooksを開いてタイトルが表示されていればOK。それをタップしてちゃんと開ければ、あとは大丈夫。
  • 読書する。
iBooks画面はこんなふうになります(このときに書いたやつをサンプルに使用)。





現状では章ごとの目次とか表紙の画像は設定してません。著者欄もnobody。本当にシンプルな素のePubです。


今後のToDoとしてはRSS・AtomフィードからePubを作る、GAE/JでWebサービス化するとかを考えてます。


【参考リンク】
ssig33 - Tumblr 2 ePub の PodCast 機能を強化した
この人スゴイです。開発スピードが俺の10倍ぐらいある。ただ運用が大変みたいなので俺もYet Anotherなサイトを作って負荷分散に協力したい(来週中ぐらいにできたらいいな)。
あとドネーションも受け付けているみたいです(支援)。
ssig33 - Tumblr 2 ePub の Premium Service 作った、お金ください

2010-02-28

Compojure - Clojure版Webアプリフレームワークをインストール

もっとClojureで遊びたいのでCompojureというフレームワークをインストールしてみました。Clojure用のWebアプリフレームワークです。まだMacPortsとかにも入ってないみたいなので、簡単にビルドと設定の方法を書いて記憶を整理しときます。とりあえずHello Worldを実行するまで。
以下、環境はMacBookでGitはインストール済(MacPortsにある)とします。


1) GitHubリポジトリから最新版を取ってくる。
git clone git://github.com/weavejester/compojure.git

適当な場所にcloneしときます。


2) 関連ライブラリを取得
cd compojure/
ant deps

必要なライブラリは上のコマンドで自動的に取得してくれます。実行するとcompojure/deps以下にJarファイルが用意されます。


3) ビルド
ant

これでcompojure.jarが作られます。


4) Jarファイルをまとめて配置
mkdir ~/.compojure
cp compojure.jar ~/.compojure
cp deps/*.jar ~/.compojure

私の場合はホームディレクトリに.compojureを作ってそこに配置することにしました。


5) 起動用シェルスクリプトを作る
cd ~/.compojure
vi compojure.sh

でファイルを作成して、以下のスクリプトを書く。
#!/bin/sh

for f in ~/.compojure/*; do
CLASSPATH=$CLASSPATH:$f
done

java -cp $CLASSPATH clojure.main $1

CLASSPATHに必要なJarファイルを追加してClojure起動という内容。
chmod +x compojure.sh
sudo ln -s ~/.compojure/compojure.sh /opt/local/bin/compojure

このスクリプトのシンボリックリンクをパスが通ったところに作ります。


6) Hello Worldスクリプトを作る。
CompojureのページにあるSample Codeをそのまま書きました。


7) テスト
compojure hello_compojure.clj

ブラウザでhttp://localhost:8080を見てちゃんと表示されればOK。




【参考リンク】
Compojure/Getting Started - Wikibooks, collection of open-content textbooks
起動スクリプトはココの情報を参考にしました。



プログラミングClojure

2010-01-31

Clojureコードバトンを受け取った

manjilabさんよりTwitterでお誘いされたので光速で受けました。『プログラミングClojure』を読ん出る最中なのでちょうど良かったです。
自分が書いたのはGitHubのここのページに置いときました。

gist: 291106 - GitHub


さて「Clojureコードバトンっていったい何?」ってことなんですが、もともとはid:higeponさんがSchemeではじめたものらしいです。

Scheme コードバトンまとめページ - ひげぽん OSとか作っちゃうかMona-

コードバトンは、誰かが書いたコードをリレーして各人が好きに書き換えて面白いものに変えちゃおう!って感じの主旨のものみたいです。途中でathosさんがClojureで書き換えて、いろいろバトンが渡り現在に至ると。

噂の「英単語を覚えるスクリプト」をClojureで - athosの日記



今回のお題は「英単語を覚えるスクリプト」。前のmanjilabさんはMac OS Xで英単語をしゃべらせるというVery Coolな機能を書いてるわけで、あえて自分なりに一工夫加えるとなるとけっこう考えてしまう。と思いきや、すぐにアイデア浮かびました(やっぱり12時間睡眠すると頭がすっきりするなぁ)。

このスクリプトは英単語の辞書ファイルを読み込んで表示してくれるんですが、肝心の辞書ファイルを作るのが面倒くさい。じゃぁSmart.fmで学習中のアイテムを引っ張ってきて、このスクリプト用の辞書ファイルにする機能つければ便利じゃね?ということで作ってみました。

まず調査! Smart.fmのデベロッパ向けページを見てみると、ユーザ名を指定してその人の学習中アイテムを取得するAPIがありました。

items studied

いろんな形式でデータが取れるみたいですが、今回はXMLを選択。Clojureでは"Sequences"という概念でいろんなデータの連なりを統一して扱えます。XMLには"xml-seq"というやつが使えそう。いろいろ検索して使い方を調べてなんとかAPIのXMLを読み取れるようにしてみました。

自分が手を加えたのはコマンドラインで”−s”オプションと、smartfm-dictのところですね。一通り書いた後になんとかキレイにしようと思ったんですけど、どうかしら。

勢いで受け取っちゃったコードバトンですが、思いのほか面白かったです。だれか次に受け取ってくれる人は、この記事のコメントかTwitterのほうで話しかけてください! ちょっとでも興味があったら勢いでYou受け取っちゃいなYO!



---
(02/15追記)
私のバトンは@omasanoriさんが受け取ってくれました(感謝!)。さらにコメントを英訳するという試みもされてます(スゴイ。
さらにその先は@tnoborioさんに渡り、ついにSwingでGUI化されました(ぉぉ。今のところ受け取り先募集中みたいです。
tnoborio | Blogger Blog: Clojureコードバトン参加中



プログラミングClojure

2010-01-06

さくらインターネットにインストールしたMercurialをバージョンアップ

しばらくぶりにさくらインターネットにインストールしていたMercurialを使おうとしたら、hg stでエラーメッセージ。調べてみたらさくらインターネットではPythonを2.5.2から2.6.2にバージョンアップしたらしい(お知らせ記事)。

Mercurialもver0.9.5をインストールした時からアップしてなかったので、これを機に1.4に入れ替えることにした。
こちらの記事を参考にやったら結構簡単にできました。感謝。

さくらとPythonとMercurial。 - handlerの日記


これでOKだー、と0.9.5のときに作ったレポジトリのCGIにアクセスしてみたらInternal Server Error。どうやらMercurialのhgweb.cgiもバージョンアップされてたらしいので入れ替えることにする。

Mercurialに同梱されているhgweb.cgiというスクリプトをwww用ディレクトリにindex.cgiと改名してコピーする。実行権限を与えておくのを忘れずに。

cd mercurial-1.4
cp ./hgweb.cgi ~/www/hgtest/index.cgi
cd ~/www/hgtest/index.cgi
chmod +x index.cgi


index.cgiをレポジトリに合わせて書き換えていきます。まずPython pathの設定の行のコメントを外して環境に合わせてパスを設定する。

hgweb.cgi(6-7行)
import sys
sys.path.insert(0, "/home/ユーザ名/local/lib/python/site-packages/")


次にUTF-8の設定を有効にする。日本語を表示させたいならこれが必要。

hgweb.cgi(21-22行)
import os
os.environ["HGENCODING"] = "UTF-8"


最後にホームディレクトリに作ったMercurialレポジトリの位置を指定する。私は~/hgrepos以下にレポジトリをまとめているのでこんな感じになった。

hgweb.cgi(27行)
application = hgweb("/home/ユーザ名/hgrepos/レポジトリ名/", "レポジトリの説明")



蛇足。上記の設定をしたのに500 Internal Server Errorになっちゃう場合は以下のところのコメントを外すと詳細なエラーメッセージをブラウザに表示してくれる。私もちょっとハマりかけたのでこれが役に立った。

hgweb.cgi(13-14行)
import cgitb
cgitb.enable()



以上でバージョンアップは完了。hgweb.cgiも進化しているようでページデザインとかが小奇麗になっている気がする。

iPhone Note App File Sync: shortlog


【関連記事】
サルノオボエガキ: Mercurialをサーバにインストールした
2008年1月の記事。2年ぶりのバージョンアップでした。

2009-07-08

用心深くFirefoxを3.5にアップデート

Firefox3.5がリリースされて一週間ほど様子を見て、ブロゴスフィアからそんなに不評が出てないようなのでアップデートしてみました。ソフトウェアのアップデートには何故か不安感が伴います。今までちゃんと動いていたものを下手にアップデートして動かなくなったらどうしよう、しかもブラウザって一番使うソフトだし、ということで今まで様子見してたチキン野郎はオレでーす。

ブラウザ本体はともかく、アドオンで使えなくなるのは無いか調べてみたところ、SBMカウンタとTab Mix Plusがまだ3.5に対応してないことが判明。SBMカウンタは現在ページについたはてブやdel.icio.usのコメントを表示してくれる便利アドオン、うわー長文だー読みたくねーってときにコメントを読んで何となく読んだ気にさせてくれるものです(違?。無いと長文ページが読めなくて困る。Tab Mix PlusはFirefoxのタブ機能をこれでもか!と強化したアドオンで、これも無いと健やかにネットサーフィン(古&懐)できません。

これ二つ使えないと3.5は無理と思ってたんですが、両方とも対応させる方法が分かったのでアップデートしちゃいました。


ということでビビりつつFirefox3.5を使ってます。もうスピードとか機能とかだいたい良いから落ちないでくれればそれで良いよ。

2009-05-25

Objective-Cのオブジェクト指向機能の練習

MacBookを買ってiPhoneアプリを作ることにした私ですが、どうやらiPhoneアプリ(というかマックアプリ)はObjective-Cという言語を使って作る必要があるようで、まずはその言語を覚えることにしました。

Objective-CはANSI Cに独自のオブジェクト指向機能を追加した言語。なので基本的にC言語なのでHello worldとかエラトステネスの篩とかお約束は省略します。オブジェクト指向機能をどんな感じで使えば良いかだけ練習してみました。本当のObjC初心者なので超初歩的内容ですので注意!

まずObamaクラスを書いてみました。

【クラスを定義してみる】
/**
* Objective-Cのオブジェクト指向機能のテスト
* 2009-05-23
*
*/

#include <stdio.h>
#include <Foundation/NSObject.h>

@interface Obama : NSObject
{
BOOL isElection;
}
-(id)init;
-(void)election: (BOOL)b;
-(void)whoAreYou;
-(void)speach;
@end

@implementation Obama
-(id)init { isElection = FALSE; }
-(void)election: (BOOL)b { isElection = b; }
-(void)whoAreYou
{
if (isElection == TRUE)
printf("I'm President Obama!\n");
else
printf("I'm Obama!\n");
}
-(void)speach { printf("Yes, we can!\n"); }
@end

int main()
{
id objObama = [[Obama alloc] init];
printf("class Obama\n");
[objObama speach];
[objObama whoAreYou];
[objObama election: TRUE];
[objObama whoAreYou];

return 0;
}


まずクラスを定義するにはFoundationというフレームワークのNSObjectというのを継承しなければいけないようです。FoundationはWinプログラムでいうMFCみたいなものかな? 
で、@interface ... @endまでがクラス定義。最初の{}にクラス変数を書いて、あとはメンバ関数の宣言。メンバ関数の実装は@implementation ... @endで記述する。「なんでメンバ関数の先頭にハイフン付けるんだろう?」とか「引数を:のあとに書くのは違和感あるなあ」とかいろいろ思うところはありますが、とりあえずこれでクラスは作れた。

ちなみにここまでの作業はTerminal.appを立ち上げてemacsで書きました。Windowsと違ってCygwinを入れなくても素でUNIXなのは楽ですねー。上のプログラム、本当は@interface部をヘッダーファイル(.h)、@implementationをプログラムファイル(.m)に書いてmain.mにインクルードするのが王道でジャスティスみたいなのですが、ここではめんどいので1ファイルに全部書いてます(ファイル名はclass_test.mとしときます)

クラス定義まではC++をやったことある人なら、何となく分かるでしょう。でもその後のmain関数の中のインスタンス作成、メッセージ送信はちょっと見慣れない書式です。要するに関数呼び出しのことをメッセージ送信と呼んでいるみたいです。オブジェクト指向のモデルがSmalltalk的で、むしろC++よりこっちのほうが王道かもしれないっすね。
まずはallocでインスタンス作成、初期化したいときはinit関数を作るとだけ覚えておけば大丈夫そう。

あとはコンパイル。GCCを使います。
gcc class_test.m -framework Foundation

これでカレントディレクトリにa.outという実行ファイルができます。ちなみに実行するとこうなります。

class Obama
Yes, we can!
I'm Obama!
I'm President Obama!




【Obamaクラスを継承して多態性を試す】

さっきのObamaクラスを継承してNocchiクラスを作ってみます(ネタが古いとか突っ込みはガン無視の方向で)。

/**
* Objective-Cのオブジェクト指向機能のテスト
* 2009-05-23
*
*/


#include <stdio.h>
#include <Foundation/NSObject.h>

@interface Obama : NSObject
{
BOOL isElection;
}
-(id)init;
-(void)election: (BOOL)b;
-(void)whoAreYou;
-(void)speach;
@end

@implementation Obama
-(id)init { isElection = FALSE; }
-(void)election: (BOOL)b { isElection = b; }
-(void)whoAreYou
{
if (isElection == TRUE)
printf("I'm President Obama!\n");
else
printf("I'm Obama!\n");
}
-(void)speach { printf("Yes, we can!\n"); }
@end

@interface Nocchi : Obama {}
-(void)speach;
-(void)sayJoke;
@end

@implementation Nocchi
-(void)speach { printf("イエス、ウィ キャン!\n"); }
-(void)sayJoke { printf("のっちで〜す!\n"); }
@end

int main()
{
id objObama = [[Obama alloc] init];
printf("class Obama\n");
[objObama speach];
[objObama whoAreYou];
[objObama election: TRUE];
[objObama whoAreYou];

id objNocchi = [[Nocchi alloc] init];
printf("class Nocchi\n");
[objNocchi speach];
[objNocchi sayJoke];

return 0;
}


これの実行結果は以下。

class Obama
Yes, we can!
I'm Obama!
I'm President Obama!
class Nocchi
イエス、ウィ キャン!
のっちで〜す!


うむ、speach関数のところがちゃんと上書きされておる。これでとりあえずクラスの定義、インスタンスの生成、クラスの継承まで一通りできました。超初歩的な内容ですが、自分の備忘録として記事にしてみました。


あとはまだまだ疑問点があります。また調べて記事にしてみよう。
  • allocでインスタンス生成をしたあとにメモリ解放はしなくていいのか?(malloc/free的なノリで)
  • メッセージは変数化できないのか? C言語の関数ポインタみたいに使えるとメタなプログラミングができて面白そう。

しかし新しい言語を勉強するのは久しぶりですが、やっぱり楽しいですね〜。ざっと解説本を眺めてみましたけど、C++よりは簡単そうでほっとしてます。さあ、いろいろ試すぞ!

2009-05-15

折り畳める三角すいを作った



100円ショップで竹ひごを買ってきてこんな立体を作ってみました。三角錐だけど畳み込んでコンパクトな束にまとめられます。輪ゴムで組み立てるのはちょっとしたパズルみたいですけどそんなに難しくないですよ。
下のページを参考に作ってみました。


こういう構造体は「阿竹シザーズ構造体」とかいうらしいです。”阿竹”というのはこういう構造体を研究してる建築家さんです(公式HP)。もっと大きくて複雑なドームなんかも作っているみたいで、このページを見てるとちょっとわくわくしますw。

もっと簡単に作るための「あたけぼね」というキットも売っているみたいです。作例を見てみると結構いろんな形が作れるみたいですね




最近、こういう立体おもちゃに凝ってまして、いろいろ試してます。改めて思うけど、幾何学ってのは数学だけど実学でもあるってこと。幾何学的に正しいことは実物を作っても正しい。もうちょっと遊んでみます!

2008-12-19

『アジャイルプラクティス』読書ノート

一通り読みきったので,読書メモを残します。基本的に抜書き&コメントで書いてみまーす。
P.27 選んだ道が正しくても、座り込んでたら轢かれちまうぜ
俳優ウィル・ロジャース

常に状況に気を配り,変化に敏感になれってことかな。それを言うための警句がこれってのが格好いいね。

2008-12-10

『Instapaper』はiPod touchユーザに最適な「あとで読む」ツール

AppStoreが始まってからいろいろアプリを試していますが,「これは必須だな」ってアプリが決まってきました。

私が持っているのは初代iPod touch 16Gなんですが,iPhoneと違って常にネットワークに繋がっているわけではありません(WiFiアクセスポイントもそんなにある訳でもないし)。なので気になったWebページをiPod touch本体に保存してオフラインで読めるツールが無いかなーと思って探していたらInstapaperに行き着きました。

InstapaperはWeb上のサービスとアプリがセットになっているツールで,まずユーザ登録をしてBookmarkletをブラウザに登録します。あとで読みたいページがあったら「Read Later」ってBookmarkletを押すと保存してくれます。しかもテキストだけを読みやすいように自動的に整形してくれるみたいです。

そのあとアプリの「Update」ボタンを押すと,保存したページのデータをダウンロードして以下のようにリスト表示してくれます。



アプリ上で削除しても自分用のWebページに行くと「読み終わった」ページとして保存しておいてくれるのであとで参照するのにも便利。
Webページはアプリ上では以下のように読めます。



何気ないけどすごく便利だと思ったのが,スクロール位置を覚えておいてくれること。途中まで読んで閉じた後,続きを読むときにスムーズに読み始められます。こういうツールには長文のWebページを登録することが多いので,地味だけど重要な機能だと思いました。


ということでiPod touch使いでネット接続に不自由している私には,とっても便利なツールで手放せません。ちなみに有料版とフリー版があるんですが,フリー版で私にとっては十分でした。有料版では画像なんかも保存できるみたいですが,私の使い方はテキストを読むことが主体なので。


【AppStoreリンク(iTunesが起動します)】
Instapaper Free
Instapaper Pro (1200円)

【参考リンク】
ウェブ閲覧の ToDo リスト、Instapaper | Lifehacking.jp
Instapaper―ベーシックなブックマーク機能を提供
 Tumblrの開発者が作ってたのか!



【おまけ】
  • 今回はじめて知ったこと
    • iTunesを起動させるURLはAppStoreのアプリ名を右クリックでコピーできる
    • iPod touchの電源ボタンを押したままHomeボタンを押すと画面キャプチャができる

2008-12-02

「逆に改行されるエディタ」を試作してみた

ポメラdeコラムさんの記事にコメントしたときに以下のようなやりとりがありました。

Commented by deltam at 2008-11-24 20:17 x
私はこういう「文章を書くこと通して自分自身と会話する」っていう奇妙な体験をアクィナス・キャプチャーと名づけて実践してます。
なんだか書いた途端に自分の思考が客体化されて,それに自分が突っ込みを入れるみたいのが連鎖されると,とっても不思議な感覚に陥りますよね。

アクィナス・キャプチャーについて最初に書いた記事です↓
http://deltam.blogspot.com/2008/01/blog-post_18.html

Commented by pomerade at 2008-11-25 02:38
アクィナス・キャプチャーおもしろいですね。
ボクはかねがね逆に改行されるワープロが欲しくて
あるセンテンスは上から下なんだけど、次のセンテンスに
進むとその上にできていくというような・・。

ポメラdeコラム : ポメラは自分の脳を検索する装置。


逆に改行されるワープロかぁ,Diptychを作ってたときのソースを流用すれば簡単に出来そうだなってことで作ってみました。

Reverse Pad
ReversePad repos.: shortlog(Mercurialリポジトリ)

その後,再コメントでお知らせしたところ,あちらの意図と合ってたようで何より。
これひとりブレストにぴったり!」とおっしゃっていましたが,どんな感じなんだろうなぁ。おぉ,初めて自分でも使い方の分からないものを作ってしまった! これがコラボってやつなのか!?



実際やってることはテキストエリア内で改行キーが押されたイベントを捕まえて,先頭に改行コードを足して,カーソルを先頭に移動してるだけです。ちなみにクロスブラウザでカーソル位置移動させる方法を今回初めて知りました(↓記事を参照しました。多謝)

テキストボックス内でカーソル位置を移動する方法 - Enjoy*Study

ついでにDiptychにも同じ直しを入れたのでFirefoxでも動くようになりました(ってか直すの遅すぎ)。

Diptych(修正版)

Diptych開発ですが・・・,一人プロジェクトに陥りがちな「なんだか飽きてきた病」に掛かっておりピンチです。でもやっぱりちゃんと完成させたいのでスローに続けていきたいと思います。これぞスローライフならぬスロー開発!(アジャイル開発の反対語)


【参考リンク】
サルノオボエガキ: アクィナス・キャプチャーは最高のライフハックかもしれない
サルノオボエガキ: アクィナス・キャプチャー用ツール,Diptychを作ってます

2008-11-24

ポメラは買わないけど方向性には期待してる

一昨日,ポメラに触ってみたいと思ってヨドバシカメラに入ったら「売り切れで店頭展示もない,入荷予定も分からない」と言われてしまいました。大人気みたいです。以下,ポメラについて考えたことを書きますが,実物にそんな事情で触ってないまま書くことをお断りしておきます。


最初にポメラ「書くためだけのコンパクトガジェット」という紹介を見て,正直キタコレ!と興奮しました。俺もタッチタイピングができて文字入力に特化したものがあれば,どこでもアクィナス・キャプチャーが出来ていいなーと思ってたからです。
しかし・・・。

編集できる最大サイズは1ファイル全角8000字 / 約16KBまで。それ以上のファイルをmicroSDに入れても開けない。
デジタルメモ「ポメラ」 ファーストインプレッション - Engadget Japanese

あー,駄目じゃんアクィナス・キャプチャーには少なすぎるよ! ってことに気づいて急速に興味が遠のきました。実際,手持ちのStowaway Universal Bluetooth KeyboardとEM・ONEでも同じようなことが出来るしねー。
電車内でもこのとおり,そこそこ快適に入力できる。


以下は上のポジションで書いてみた文章です。

 2008/11/21 (Fri)09:05:58

俺も電車の中で打倒ポメラを目指してコラムを書き書きしてみたお。
上にキーボードがある変則ポジションだけど特に違和感はない。
これでも結構いけるなぁ
jotというWM用のエディタ使ってるんだけどなかなか良い。
上の日付時刻もメニューから入力できる(ショートカットはあるのかな?)

よし写真も撮って置いたのでブログネタにもできるぞ
でも書くセッティングのスピードはポメラにはかなわないかな。
キーボードとEM・ONEをセッティングするのに30秒ちょいは掛かる
まぁとりあえずそんな感じで、この組み合わせでもポメラには対抗できるかな。

俺はEM・ONEは物書き用に考えているのでこれはOK
あとActiveSyncがあるのでPCとファイル同期もOK
さらに俺はMercurialをつかって変更管理もやってる。
ちゃんとした文章書くには版管理は必要だと思うのね。
つーことでポメラにはもうちょっとがんばっていただきたい
ポメラ自体はいいんだけど「書くためのシンプルさ」を詰め切れていないような気がするぜ。
ちなみにまだポメラに触ったことない時点でこの文章書いてます。
マテリアルとしてのポメラの肌触りとかキータッチとかは関係なく評価書いてますので。

書くため専用ガジェット、ポメラの登場は素晴らしい! だがポメラ開発チームにはあえてこれを失敗だと認識してほしい。さらに考え抜かれたポメラVer2のために。

ポメラ開発チームのインタビューも読んでみました。

Engadget:最初の企画からほぼこの仕様だったんでしょうか。

立石:
最 初からほぼこの仕様ですね。いま世の中にはたとえば携帯だったり、PCだったりという機能がたくさん付いて便利というものはたくさんあるんですけども、あ あもうそんなんじゃないんだよ、ただ書きたいんだよ!という欲求をまずペラ一枚に書き出したんですね。4インチのモノクロ液晶で充分、当初は単三でしたけ ど乾電池2本、これで充分です、充電もいりませんと。だけどちゃんとしたキーボードが欲しい。少なくともモバイルギアやレッツノートクラスのキーピッチの あるキーボードが欲しい。それだけでいい、頼むからそれだけで作ってくれというところをペラ一枚で作って、そこからじゃあこれはこのパーツだね、と選定し てできたので、最初からこの仕様ですね。まあブレないといいますか、当初から、他の物を付けてはデジタルメモではなくなると考えていました。

デジタルメモ「ポメラ」開発者インタビュー - Engadget Japanese



俺なんかが言うのもおこがましいですが,『Simple』という概念はすごく難しいものだと思います。「最小限の機能」だとか「無駄を削ぎ落とす」とか言うのは簡単だけど,本当はとことんまで突き詰めて考え抜かないとSimpleなものは出来ないと思います。
又引用で申し訳ないですが,「アジャイル・プラクティス」という本に以下のようなことが書いてあるそうです(自分はこの記事に影響されて読書中)。

シンプルであることは、安直だとか未熟だとか、不足しているといったことを意味しない。むしろ全く反対だ。シンプルさは、やたらと複雑で後先を考えない解放よりも、はるかに実現が難しい。

いいこと書いてありますね。
そうなんです。
シンプルっていうのは無駄がないということで、無駄を極限までなくすっていうのは結構難しいことだったりするんですよね。

System.Exit - 読書: アジャイルプラクティス



そう『Simple』は難しい。でも最近出てきた商品で良いお手本となる商品があります。「iPhone」です。これがシンプルでなくて何がシンプルか!?

最初にiPhoneを発表したときにジョブスは「電話を再発明した」と言いました。俺はぜひともポメラ開発チームに「ワープロを再発明した」と言えるような商品を考え抜いて作ってもらいたいと思います。


てーことで今回のポメラはパス,次回に期待ということで。


【参考リンク】
ポメラdeコラム
 ポメラですべてブログを書かれている方です。最近の記事で「ポメラ壊れた」とか書いてるんですが大丈夫なんでしょうか。
 こういう感覚に俺はアクィナス・キャプチャーと名づけたんだな→ポメラdeコラム : ポメラは自分の脳を検索する装置。

サルノオボエガキ: EM・ONEと折りたたみキーボード
サルノオボエガキ: アクィナス・キャプチャーは最高のライフハックかもしれない