2011年8月10日水曜日

node-dev

最近 Node に手を出し始めた。
スクリプトなんだけど、deployはnodeの再起動が必要で面倒だなーと思っていたら便利なもの発見。
インストールはnpmを使って、
$ sudo sh -c 'http_proxy=http://tproxy:port/ npm install node-dev -g'
/usr/local/bin/node-dev -> /usr/local/lib/node_modules/node-dev/node-dev
node-dev@0.1.8 /usr/local/lib/node_modules/node-dev

nodeの変わりにnode-devから起動

$ node-dev app.js

試しにapp.jsを編集してみると、コンソールログにメッセージが出て再起動した模様。
[INFO] Restarting
便利便利3便利。

2011年8月1日月曜日

gpgでシグネチャ検証

良くダウンロードサイトなどに、本体と共にGPG Sigの様なファイルが置いてあるが、そのファイルの使い方
このファイルは、本体が改竄されたもので無いと証明してくれるファイルで、インターネット越しにファイルをダウンロードする場合は、極力改竄チェックをするべきである。
今日は libevent をダウンロードしようと思ったのでそれを例に以下を実行、確認。

$ curl http://monkey.org/~provos/libevent-2.0.12-stable.tar.gz -o libevent-2.0.12-stable.tar.gz
$ curl http://monkey.org/~provos/libevent-2.0.12-stable.tar.gz.asc -o libevent-2.0.12-stable.tar.gz.asc
$ gpg --verify libevent-2.0.12-stable.tar.gz.asc
gpg: Signature made Sun Jun 5 10:11:33 2011 JST using RSA key ID 8D29319A
gpg: Can't check signature: public key not found
# 公開鍵が無いので探す
$ gpg --recv-key 8D29319A
gpg: requesting key 8D29319A from hkp server subkeys.pgp.net
gpg: key 165733EA: public key "Nick Mathewson " imported
gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model
gpg: depth: 0 valid: 3 signed: 0 trust: 0-, 0q, 0n, 0m, 0f, 3u
gpg: Total number processed: 1
gpg: imported: 1 (RSA: 1)
# 公開鍵の確認
$ gpg --list-keys 8D29319A
pub 3072R/165733EA 2004-07-03
uid Nick Mathewson
uid Nick Mathewson
uid Nick Mathewson
uid [jpeg image of size 3369]
sub 3072R/8D29319A 2004-07-03
sub 3072R/F25B8E5E 2004-07-03
# ダウンロードしたファイルの検証
$ gpg --verify libevent-2.0.12-stable.tar.gz.asc libevent-2.0.12-stable.tar.gz
gpg: Signature made Sun Jun 5 10:11:33 2011 JST using RSA key ID 8D29319A
gpg: Good signature from "Nick Mathewson "
gpg: aka "Nick Mathewson "
gpg: aka "Nick Mathewson "
gpg: aka "[jpeg image of size 3369]"
gpg: WARNING: This key is not certified with a trusted signature!
gpg: There is no indication that the signature belongs to the owner.
Primary key fingerprint: B35B F85B F194 89D0 4E28 C33C 2119 4EBB 1657 33EA
Subkey fingerprint: EF00 F369 1387 FCC5 8CD6 8E13 9103 97D8 8D29 319A

2011年7月20日水曜日

認証付きproxy越にgit cloneをする

社内からgit cloneをするとき、認証付きのproxyが邪魔をして繋げない。
素でやると、
$ git clone https://github.com/xxx/yyy.git zzz
Cloning into zzz...
error: The requested URL returned error: 403 while accessing https://github.com/xxx/yyy.git/info/refs

fatal: HTTP request failed
エラー。
環境変数 http_proxy を設定してみると、
$ export http_proxy=http://proxy:port
$ git clone https://github.com/xxx/yyy.git zzz
Cloning into zzz...
error: The requested URL returned error: 403 while accessing https://github.com/xxx/yyy.git/info/refs

fatal: HTTP request failed
変化無し。
検索すると、トンネリングツールのCorkscrewを使って対応している記事が多数見つかる。
見様見真似で試してみる。
$ sudo apt-get install corkscrew
# ラッパースクリプト作成

$ cat << EOF > /path/to/bin/git-proxy
#!/usr/bin/env bash
# -*- mode:sh; coding:utf-8 -*-

PROXY_HOST=http://server
PROXY_POST=8080
CORKSCREW=/usr/bin/corkscrew

$CORKSCREW $PROXY_HOST $PROXY_POST $1 $2

EOF
# .bashrcに環境変数追加
export GIT_PROXY_COMMAND=/path/to/bin/git-proxy

$ git clone https://github.com/xxx/yyy.git zzz

Cloning into zzz...
error: server certificate verification failed. CAfile: /etc/ssl/certs/ca-certificates.crt CRLfile: none while accessing https://github.com/xxx/yyy.git/info/refs

fatal: HTTP request failed
進展有り。
CA verificationを無効にすればOKらしい。> 参照
$ git config --global --add http.sslVerify false
$ git clone https://github.com/xxx/yyy.git zzz
Cloning into zzz...
remote: Counting objects: 197, done.
remote: Compressing objects: 100% (100/100), done.
remote: Total 197 (delta 104), reused 177 (delta 89)
Receiving objects: 100% (197/197), 26.51 KiB, done.
Resolving deltas: 100% (104/104), done.
成功!
上のコマンドで ~/.gitconfig に以下が追加された。
[http]
sslVerify = false

2011年7月14日木曜日

キューが溜まる

最近、GAEアプリケーションのcron実行がされないことが多く、コンソール確認をするとtaskqueueが溜まっている
一日一度手動でpurgeをするアナログ運用
何が引き金になっているのか特定できず当分アナログ運用を続ける必要あり

キューイングの処理をすこし見直して様子をみる
今現在は単純に

taskqueue.add(url='', method='GET')

をしているのみで、timeoutの様なものを実装するかしないと駄目なのか?

追記
queue.yamlの手引きを確認した

task_retry_limit: 1

なる設定があったので、これを仕込んで様子を見ることにする

2011年6月27日月曜日

要調査

google app engineからtwitterへの投稿(bot)がburstで行われている
一気に送られても困るんだよなー
ちょっと調査しないとspamにされそうだ

emacs evernote-mode

emacsにevernote-modeなるものがあることを知った

試してみることに。

インストールは、doc/readme_ja.txt を参照。

~/.evernote.el を作り ~/.emacs から読み込ませる様にした。

早速、emacs を起動し M-x evernote-browser を実行すると パスワードを求められるので入力。
すると、自分のnoteの階層が取得される。

これは、結構便利かもしれない

2011年6月23日木曜日

javascript memo#1

○秒後に処理を実行する

2秒後にid=messageの下のh3タグを隠す場合

setTimeout(function(){ $('#message h3').hide("slow") }, 2000);

2011年6月22日水曜日

echo -e

echo -e "      ___       _\n \V ̄ ̄ ̄__| \二二/|_\n  /  / ̄__| [__]  | \\n │ / /`ヽ__∟∠__>J__>\n |/ /| ‐―――――――― |\n (  / |  ――――――――‐ |\n (_/  |     ●      ●  |\n |\ |       (_人_)    \_\n  | ) |    _ __|||||||||||_____)\n  ヽ_|  ///└┘   ̄ ̄ ̄  └┘| |\n    ///              //\n   |//\_ (⌒Y⌒)    _//\n    \   ヽ―─―⌒ ̄ ̄ /\n       `―──―――‐―´\n"

2011年6月8日水曜日

tramp

emacs でリモートファイルを編集する TRAMP (Transparent Remote Access, Multiple Protocols) を利用してみたら非常に便利
emacsインストールしたら今はデフォルトでlispが入っている様なので、.emacsに以下を記述するのみで準備完了

(setq tramp-default-method "ssh")

2011年6月6日月曜日

開発衰弱

IT企業を運営するにおいて大事なことはなんだろう?とふと考えてみた。
# 別に起業したいとかではない
IT企業 = サービスを提供するというところが大半かと思うので、やはりサービスを企画したり収益を生むものを考えるアイデア、発想の豊かさというところは捨てられない。
それを形にしていくには開発が入り、それを運営(運用)する技術者も当然ながら必要となる。

企業によってどこに力を入れるかでその会社の色が出てき、社風となっていく様に思える。
技術に特化した会社、他が追随出来ない様な特殊な事業、真新しく実験的なサービス。

そんな中、一時は技術で売りだそうとしてたのに気付いたら日本国内での事業展開がメインなのに社内英語化に熱心になっている企業が。
どういう下駄の履き替えか分からないが、基本的に人と話すことがあまり得意でなくコンピュータ言語と日々格闘しているエンジニアがいきなり英語下駄に履き替えれるわけも無く、悩み苦しみ辞めていく。
今まで支えていた開発部隊が急に傾き始め、トラブルが増え新規サービスを考えても肝心要の開発が衰弱縮退してしまい、開発に着手できない。
開発が弱体するとこないだまでは敵にもならなかった同業者が急に敵として踊り出てくる、そして長きに渡り独占状態だった市場をあっさり明け渡すはめに。

これからはハイエナとして大手企業が衰弱していくのを待つというビジネスモデルが生まれるかも知れない。
そうならないように、柱をしっかりとした土台で支えるべきで、社長自ら堅牢な柱に態々斧を入れ屋台骨を崩す様な事をするといつか自分の頭に崩れた屋根が落ちてくることになるかもしれない。

かなり脱線したけど、自分なりの結論としては初志貫徹な堅牢なシステムと豊かな発想力が必要不可欠。

2011年6月1日水曜日

[memo] firefox + scim

いつからかfirefoxでscimを利用しての日本語入力が出来なくなった
環境変数を一つ追加することで回避(work around)できるのでメモ

$ sudo cp -ip $(which firefox){,.org}
$ sudo vi $(which firefox)
$ diff $(which firefox){,.org}
5,6d4
< export GTK_IM_MODULE=scim-bridge
<

2011年5月24日火曜日

apache moduleを作る#1

何事もとりあえずやってみるだと長続きせずandroid開発は放り出し中
仕事で久々にapache moduleを開発することになりそうなのでネタ的にこっちをメモっておこうと思う。目的があると続けれる気がする

ターゲットはapache2.2
apache1.3からは仕様が大分変り、もし1.3を2.2に移植するなら新仕様で枠を作りロジックをはめ込んで行くほうが方が早い気がする

先ずは、家でも会社でもapache2.2をインストールしないことには始まらないのでdsoオプションを付けてインストールをする

インストールしたらapxsがbinの下に置かれるのでモジュールの雛形を生成する
モジュール名をmod_psychoにするなら

$ apxs -g -n psycho

で雛形が出来る
確認するとこんな感じ

$ find psycho
psycho
psycho/.deps
psycho/Makefile
psycho/mod_psycho.c
psycho/modules.mk
mod_psycho.c以外は取り敢えずは弄らなくてもokなので、mod_psycho.cに何かロジックを埋め込んでみる。
自動生成された状態はこんな感じ

/*
** mod_psycho.c -- Apache sample psycho module
** [Autogenerated via ``apxs -n psycho -g'']
**
** To play with this sample module first compile it into a
** DSO file and install it into Apache's modules directory
** by running:
**
** $ apxs -c -i mod_psycho.c
**
** Then activate it in Apache's httpd.conf file for instance
** for the URL /psycho in as follows:
**
** # httpd.conf
** LoadModule psycho_module modules/mod_psycho.so
**
** SetHandler psycho
**
**
** Then after restarting Apache via
**
** $ apachectl restart
**
** you immediately can request the URL /psycho and watch for the
** output of this module. This can be achieved for instance via:
**
** $ lynx -mime_header http://localhost/psycho
**
** The output should be similar to the following one:
**
** HTTP/1.1 200 OK
** Date: Tue, 31 Mar 1998 14:42:22 GMT
** Server: Apache/1.3.4 (Unix)
** Connection: close
** Content-Type: text/html
**
** The sample page from mod_psycho.c
*/

#include "httpd.h"
#include "http_config.h"
#include "http_protocol.h"
#include "ap_config.h"

/* The sample content handler */
static int psycho_handler(request_rec *r)
{
if (strcmp(r->handler, "psycho")) {
return DECLINED;
}
r->content_type = "text/html";

if (!r->header_only)
ap_rputs("The sample page from mod_psycho.c\n", r);
return OK;
}

static void psycho_register_hooks(apr_pool_t *p)
{
ap_hook_handler(psycho_handler, NULL, NULL, APR_HOOK_MIDDLE);
}

/* Dispatch list for API hooks */
module AP_MODULE_DECLARE_DATA psycho_module = {
STANDARD20_MODULE_STUFF,
NULL, /* create per-dir config structures */
NULL, /* merge per-dir config structures */
NULL, /* create per-server config structures */
NULL, /* merge per-server config structures */
NULL, /* table of config file commands */
psycho_register_hooks /* register hooks */
};

psycho_handler関数にロジックを埋め込む、、その前に、この関数内を眺めてみる
if (strcmp(r->handler, "psycho")) {
return DECLINED;
}
これは psycho ハンドラー以外のリクエストなら(httpd.confで記述するsethandler)このモジュールを抜けて次のモジュールに処理を投げる(チェイン?する)という意味。
if (!r->header_only)
ap_rputs("The sample page from mod_psycho.c\n", r);
これは、headメソッドでなかったら文字列(ap_rputs内)を返す(表示する)という意味。

次はrequest_rec構造体とメモリ管理をapacheに任すと楽な件を書く

2011年5月3日火曜日

android

アンドロイドアプリ開発を始めた
環境は、
netbeans + nbandroid + sdk

eclipseは何度チャレンジしても使えなかったがnetbeansは直感的に分かりやすく良く出来ている
お陰でjava開発に関してはemacsから脱却ができた

何を作るかなー、の前にフレームワークを覚えるためにサンプルアプリなんかを参考にさせてもらって少しずつ

2011年4月30日土曜日

grub "no loaded kernel"

ubuntu 11.04 にupgradeして再起動したら grub の画面で止まってしまい、
grub> boot
と打っても
error: no loaded kernel
となってしまう

grubを弄るのはいつ以来だろうか?
当然覚えてないので復旧方法を探る
以下のコマンドを投げたら無事 boot してくれた

grub> linux /vmlinuz root=/dev/sda1
grub> initrd /initrd.img
grub> boot
起動後に以下のコマンドを叩いてgrubを馴染ませる

sudo grub-install /dev/sda
sudo update-grub

2011年3月27日日曜日

Quotaとの戦い

無料で使えるデータストア、実質使えるのは200MB程度な感じである。
インデックスやら何やらで1GBの内結構もっていかれている雰囲気。
そんなもんだから直ぐにディスクが上限に達し、ディスク掃除をするとcpu使用率が直ぐに上限に。上手いこと設定してるな無料枠と思った。

データストアに貯めたものをファイルなりに加工して持っておくのが今考えうる最高の対策かもしれない。
bulkloaderで一括ダウンロードして、開発マシンで加工して update する。

アプリ事態もsummaryの機能をすこし改善したり、自分で使うには満足。

2011年2月27日日曜日

need more than 1 value to unpack

大分出来上がった 2channelbuster
batchで .dat ファイルをパースしているのだけど、何かのタイミングで
need more than 1 value to unpack
ってエラーが大量に出てしまう
なんとなく、splitが原因のような気もするけど、眠いのでまた今度調べてみよう

2011/03/03 原因判明

text = u'xxxxxxxxxxxxxxxxxxxxaaaaaaaaaaaaaaaaaa'
(a, b) = re.split('#', text)

上記の様なことをやっていて、splitの結果が b に入らないのが原因だった模様
変なところでうるさい言語だpython

2011年2月24日木曜日

負荷対策

gaeで大体イメージしていたようなものが出来上がった。
バッチ処理が重く、cpuを使いきってしまったので今日は別のurlに避難

http://2dot5channel.appspot.com/
スレッドを立てたオーナーの書き込みのみ抽出と、レスが付いている記事の抽出機能を実装。
なかなか使いやすい(見やすい)感じには成っているかと思う。

明日以降は以前のURLに戻れる予定
どのたか使って感想聞かせてくれると嬉しいです

2011年2月16日水曜日

画像遅延読み込み

無駄にだらだら長いページになってしまい、ただでさえ読み込みに時間がかかってしまう。
そんななか画像まで一気に読み込んでられないので、jquery plugin を利用する。


jquery.ligntbox とバッティングしそうだなー、大丈夫かなー?

cron登録

GAEの場合cronもweb accessの様に作る必要がある。
app.yamlcron.yamlを編集して update して登録する。

バッチもCGIも同様に扱うのは最初抵抗があったが、CGIをバッチにするってことも可能で、これはこれで便利である。
cron実行間隔を短くしすぎると cpu を持っていかれるので注意。cpu使用率を下げるようにmemcacheを使ったり。
何気にGAEで何かしら開発をするとリソース配分の重要性を改めて認識。ザルシステムでは味わえないリソースとの闘い。

2011年2月11日金曜日

2ch


2chのデータを加工して何かを作るサイトを作成
今後色々と弄っていく予定
これを作りながらGAEのイロハが何となく掴めた

連結

coercing to Unicode: need string or buffer, long found
GAEでこんなエラーが出てたのでちょっと調べてみたら、
python って 数値 + 文字列 で勝手に文字列に変換してくれないんだ。
適当そうな言語だけど型だけはうるさいな。

障壁

GAEってファイル出力不可能?
DBのデータを纏めてhtml化しようと思ったら。
これはmemcacheに置くべきななのか悩む

2011年2月9日水曜日

logo generator


無料ロゴジェネレータを幾つか見て作ってみた。
無料と謳っているのはロゴを作るところまでで、DLしようとすると決済画面に飛ぶ様なものばかりであった。
そんな中、一ついい感じのサイトを見つけた。
一個試しに作って無料でDLも完了。
もしかしたら二つ目からは有料になったりして。


htmlコンポーネント化

だらだら長いhtmlは保守性が悪いので、djangoのinclude機能でテンプレートを細分化する。
templates/
 ├page.tpl
 └parts/
  ├header.tpl
  ├footer.tpl
page.tplの中で
{% include 'parts/header.tpl' %}
{% include 'parts/footer.tpl' %}
を呼ぶだけ

2011年1月28日金曜日

download_app

appcfg.py の download_app でソースコードをcheck outしようとしたら,

you do not have permission to download this app version.

とエラーで落ちてしまう。
何か権限的なものであろうとコンソール上を調べていていたら、Permissionsの項目の中に

permanently prohibit code downloads

ってリンクを発見。
ちゃんと訳さずにリンク押下してその先も適当にぽちぽちやっていたら、

Note: code downloads are prohibited.

って出てしまい、downloadが不可能に!
戻す方法はどこにも書いてなく、絶望的な状況に。
一番最初のエラーの回避は以下のオプションを付ければ良かった様である。

$ appcfg.py --secure --no_cookies -e mailaddress download_app -A app_id dest_directory

英語のドキュメントにはちゃんと書いてあった

http://code.google.com/intl/en/appengine/docs/python/tools/uploadinganapp.html#Downloading_Source_Code

Warning! This action is irreversible. After you prohibit code download, there is no way to re-enable this feature.

戻せないのか。。
以後気をつけよう。

一度でもuploadしたことないuserではdownloadできないとも書いてあるな。上で書いた事は嘘だった。

2011年1月26日水曜日

GnuPGでデータデリバリー#1

ちょっとしたやりとりでも実は機密情報だった!なんてことがあると嫌なのでなるべく暗号化なるものを取り入れいこうかと。
先ずはメールの添付やら,DropBox(SocialStorage?)なんかに置いてあるものなどを暗号化してみることに。
ツールはGnuPGを採用。採用理由は昔からよく耳にするってだけの理由、それが良いのか悪いのかは今後判定。

先ずは、単純な共通鍵暗号方式でのファイルの暗号化。
何だか難しい日本語だけど、パスワード入力のみで暗号化/復号化を行うもの。
コマンドも単純で以下のもので暗号化完了。

  • 暗号化

    $ gpg -c {file path}
    Enter passphrase: {input pass phrase}
    Repeat passphrase: {input pass phrase}

    ファイル名 {file path}.gpg で暗号化されたファイルが生成される

  • 復号化

    $ pgp {file path}.gpg
    gpg: CAST5 encrypted data
    Enter passphrase: {input pass phrase}

2011年1月20日木曜日

Google App Engineでgmailアカウントを使用する

わざわざ新規にIDサービスを作るのも結構しんどいし、最近は皆gmailアカウントを所有してるし、GAE使っているし、ってことでgmailアカウントでsing-onする方法を調べてみた。
自分はpythonのSDKを使っているのだけど非常に簡単に設定ができた。
独自のlogin画面などを用意しないのであれば、設定ファイル(app.yaml)に一行足すのみ。
app.yamlのパス毎に設定できるので、必要に応じて設定を付け足すのみ。
付け足す1行はこれ。
- url: /.*
script: xxx.py
login: required

この行を入れるだけで、次回からのアクセス時 gmailアカウントにログインしてない場合はログイン画面に飛ばされる。
ログアウト用のurlの生成もちゃんと用意してあって users をimportしてメソッド呼ぶのみ。
from google.appengine.api import users
logout_url = users.create_login_url("")