Lisp

http postがなぜか出来ない

  • POST
Mixi Voiceに投稿するプログラミを作成中なのですが、以下の curl のコマンドだとうまく投稿できます: $ curl -H "Content-Type: application/x-www-form-urlencoded" -d status="Hello world" -d oauth_token=<oauthトークン> http://api.mixi-platform.com/2/voice/statuses/update {"created_at":"Sun May 15 13:45:14 +0000 2011","favorited":false,"text":"Hello world","user":{"url":"http://mixi.jp/show_friend.pl?uid=4ncdm68fwm56j","profile_image_url":"http://profile.img.mixi.jp/photo/user/4ncdm68fwm56j_94665934418.jpg","id":"4ncdm68fwm56j","screen_name":"simoom634"},"id":"4ncdm68fwm56j-20110515224514","favorite_count":,"reply_count":} これと同じように HTTP post するコマンドを gauche で書きました: (receive (status header body) (http-post "api.mixi-platform.com" "/2/voice/statuses/update" '(("status" :value "Hello world." :content-type "application/x-www-form-urlencoded") ("oauth_token"<oauthトークン>) ) (display status) (display body)) でも、これだとステータスコードに 400 が帰ってきます。なんでだろう? ちなみに、Mixi のドキュメントにはこんな感じで書かれています: つぶやきを新規に投稿するためのURIは以下となります。2種類ありますが、どちらも結果は同じです。 POST http://api.mixi-platform.com/2/voice/statuses/update POST http://api.mixi-platform.com/2/voice/statuses リクエストボディとして、つぶやきの本文をapplication/x-www-form-urlencoded形式で指定します。 status=%E3%81%A4%E3%81%B6%E3%82%84%E3%81%8D%E3%81%AE%E6%9C%AC%E6%96%87 パラメータ名 指定する値 status つぶやきの本文 statusパラメータに指定する文字列の文字コードはUTF-8とし、それをURIエンコードした結果を指定します。 何か見落としているのかな?

ログファイルへの出力

  • POST
さくらVPSを借りて思うことは、「自分の手元にサーバーがないから何が起きているのか把握できない」ということ。だからログって大事なんだと気づかされた。 初歩的なことで申し訳ないが、運用系ミドルウェアの構築などが普段のお仕事なので、自分で作成したスクリプトなりなんなりが、どのように動くのかを把握したいというニーズにはあんまり大した意識を払ったことがなかったのですよ。えぇ。もちろん、ミドルウェアのログはいつも確認しているわけですが、自分がログを出力するという意識はなく、ログは出力されているものだと思っていたわけです。えぇ。 というわけで、ログファイルを出力するための関数を作成してみました。スクリプトファイルが存在するディレクトリ配下のlogディレクトリに、ログファイルを出力します: #!/usr/bin/env gosh ;;; ========= ;;; Variables ;;; ========= ;;; ログファイルの名前をここで指定するよ (define *logfile* "test.log") ;;; ========= ;;; Libraries ;;; ========= (use srfi-19) (use file.util) ;;; ========= ;;; Functions ;;; ========= ;;; ログに書き込むための日時文字列を生成 ;;; フォーマットは「[YYYY-MM-DD HH:MM:SS]」 (define (date-string) (date->string (current-date) "[~1 ~3] ")) ;;; ログ出力用関数を生成するための関数 (define (logger-make filename) (lambda (msg) (call-with-output-file filename (lambda (port) (display (string-append (date-string) msg "\n") port)) :if-exists :append))) ;;; スクリプトが存在するディレクトリ配下に ;;; logディレクトリが存在するかを確認する ;;; 引数はスクリプトが存在するディレクトリ (define (is-log-directory-exists?

Gaucheでスクリプトのあるディレクトリを取得する

  • POST
実行しているスクリプトファイルがあるディレクトリを取得しようとしたのだが、探し方が悪いのかそのものずばりの組み込み関数を見つけられず。手作りしてみました。こんな感じになるのかな? ソース (use file.util) ;; (car *argv*)にスクリプトファイルが束縛されるけど、 ;; スクリプトファイルの存在するディレクトリでスクリプトを起動すると、 ;; 「スクリプトファイル名.scm」となる。 ;; スクリプトファイルの存在するディレクトリ以外の場所で ;; スクリプトを起動すると、(car *argv*)はフルパス表記になる ;; そこを区別する。 (define (is-executed-at-script-directory? script-file) (receive (path. rest) (decompose-path script-file) (if (equal? "." path) #t #f))) ;; スクリプトファイルの存在するディレクトリでスクリプトを起動された場合、 ;; カレントディレクトリがスクリプトが存在するディレクトリ ;; スクリプトファイルの存在するディレクトリ以外の場所で起動した場合、 ;; (car *argv*)のディレクトリ部分だけを取得する (define (main *argv*) (if (is-executed-at-script-directory? (car *argv*)) (display (current-directory)) (receive (path. rest) (decompose-path (car *argv*)) (display path)))) 実行例 こんな感じです: kazu634@kazu634% ll ~/junk [3503] total 96 -rwxr-xr-x 1 kazu634 staff 1.