2007/08/31

はてな
vim.orgを物色してたら
Vimpress : Manage wordpress blog posts from Vim
というvimからWordPressに記事投稿出来るスクリプトを発見。まぁ、だいたい中身も想像出来ましたが物は試しと随分前にアカウントを取ってて全然使ってないWordPress.comのサイトにポストしてみました。 で、予定通りマルチバイトで文字化けしたので、改造してみました。
基本的な修正は文字コード周りですが、カテゴリの取得方法をMTからmetaWeblogに変えて、BXR: Blosxom XML-RPC Interfaceにも対応してみました。
ただここへのポストはまだ試してないです。苦笑
オリジナルがGPL2ライセンスでしたので、今回はpatchで配布します。
ダウンロード:vimpress-0.91-mb.diff
どうぞ、楽しいWordPress(+vim)ライフをお楽しみ下さい。

追記
使い方はblog.vimの中で宣言しているblog_usernameとblog_passwordを設定し、blog_urlにXMLRPCのエンドポイントを設定します。
あとは
:BlogList
でリスト取得(ENTERで開く)
:BlogNew
で新規ブログ、その状態から
:BlogSend
で投稿です。(リストからENTERで開いた場合は更新です)

2007/08/30

はてな
ブログ引退表明サービスRetiredAPIをpythonから使うサンプルです。
URLを指定すると引退しているかどうかがTrue/Falseで戻ります。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import httplib

def isRetired(url):
    conn = httplib.HTTPConnection("retired.at")
    conn.request('GET', '/api/badge/%s' % url)
    response = conn.getresponse()
    return response.getheader("Location") == "http://retired.at/image/retired.gif"
ちなみに、hkn?さんの日記で試すと、Trueが戻ります。
>> print isRetired("http://d.hatena.ne.jp/hkn/20070829/1188318885")
True
Posted at 10:29 in web | WriteBacks (0)
Tagged as: API, python
Bookmarks: add to hatena add to hatena | add to del.icio.us add to del.icio.us | add to livedoor.clip add to livedoor.clip | add to buzzurl add to buzzurl | add to fc2bookmark add to fc2bookmark | add to Yahoo Bookmark add to Yahoo Bookmark | add to Pookmark add to Pookmark | add to NiftyClip add to NiftyClip | この記事へのリンク

はてな
pythonからSumibiWebAPIを扱うサンプルです。
SOAPpy使うと楽だこと...
#!/usr/bin/python
# -*- coding: utf-8 -*-

from SOAPpy import WSDL

wsdlobject = WSDL.Proxy("http://www.sumibi.org/sumibi/Sumibi_stable.wsdl")
result = wsdlobject.doSumibiConvert(query="sumibi")

for r in result.resultElements:
    print "%s:%s" % (r.type, r.word)

結果は
j:炭火
h:すみび
k:スミビ
l:sumibi
となります。
queryが「hanasu」だと
j:話す
j:離す
j:食なす
j:放す
j:跳なす
j:撥なす
j:刎なす
j:貼なす
j:張なす
j:はなす
h:はなす
k:ハナス
l:hanasu
となります。
SKKのように送り仮名開始位置が取得出来ればIMEに使えて便利かな...と思いました。
Posted at 10:08 in web | WriteBacks (0)
Tagged as: API, python
Bookmarks: add to hatena add to hatena | add to del.icio.us add to del.icio.us | add to livedoor.clip add to livedoor.clip | add to buzzurl add to buzzurl | add to fc2bookmark add to fc2bookmark | add to Yahoo Bookmark add to Yahoo Bookmark | add to Pookmark add to Pookmark | add to NiftyClip add to NiftyClip | この記事へのリンク

2007/08/29

はてな

最近、ネットを見ていると「人の話を上手に聞くコツ」とか「相手を納得させる上手な説明方法」なんて記事を良く見る。

確かに参考になるし、なるほどねと思う事がある。まだ実践した事はないが、使って見る価値のありそうな物もある。

もちろんこうした記事には「他者と差別化を図るには?」をテーマに自己啓発する術が書かれていて、それ自身良い読み物だと思うし、アクセス数があがるのも分かる。


でもこの類の話って本来、会社の上司から教わったりするものだったんじゃないかと。


客先で上手く説明出来なかった時に先輩から「こういうとお客さんに納得してもらえるよ」てな具合に、教えてもらったり質問したりするものだったんじゃなかろうか。

最近では上司の絶対度は薄れ、部下からすると上司のアドバイスは耳の横を通り過ぎる蚊ほどでしかなく。フリーランスや転職が当たり前になってきた昨今では、半永続的にな信頼を抱く上司よりもネット…な風潮になって来ているのかも知れない。

もしこの流れが真実だとしたら本当に淋しい事だし、はなから失敗を恐れ教科書通りの行動しかしない部下を持つ上司の苦労が想像出来てしまう。

もちろん度合いにもよるが、許される内ならば自分のやり方で失敗して見ても良いと思う。最近はそこまで寛大な会社も無いかも知れないけと、良かれと考えての事なら教科書と違ったやり方を貫いても良いと思し上司に聞いてもいいと思う。


もしくは、そんな事が許された頃に新人だった私は、運が良かったのかもしれない。

Posted at 16:35 in その他 | WriteBacks (1)
Tagged as: job
Bookmarks: add to hatena add to hatena | add to del.icio.us add to del.icio.us | add to livedoor.clip add to livedoor.clip | add to buzzurl add to buzzurl | add to fc2bookmark add to fc2bookmark | add to Yahoo Bookmark add to Yahoo Bookmark | add to Pookmark add to Pookmark | add to NiftyClip add to NiftyClip | この記事へのリンク

2007/08/23

はてな
オフィシャル側で対応頂いたので、このグリモンの必要性は無くなりました。はてなスター日記
twitter上に、はてなスターを置く為のグリモン「つい☆すた」のサイト、「Twitter: What are you doing?」上でtwitterユーザのアイコンが表示されるようにするグリモン書いた。

続きを読む...


はてな

C言語を使える奴は凄いのか?


C Language

数年前ならYesだ。でも今は「間違なくYesだ」とは言えない。昨今業務で求められているスキルはC言語使いだけではない。

求められているのはJava使いであり、VB.NET/C#使いであり、LL(javascript、php、python、perl, ruby)使いなのだ。

最近ではエンドユーザも賢くなってきて、単にパフォーマンス性や万が一に備えた柔軟性よりも、保守性やメンテナンス性、二次利用という利点、はたまたバグ侵入率を下げるにはどうしたら良いかを勉強してきている。

まれにC言語使いは、C言語を使えない人達から崇められる事があるが、はたして本当に凄いのだろうか?

ポインタや演算子オーバロードを知っている人が、MFCやATL/WTLを知っている人が、socketをCで組める人が、kernelソースを読める人が、本当に今後も凄いと言われ続けるのだろうか。

例えばGUIを作るとしよう。pythonとGTKを使えばウインドウを出すのに10行あれば十分でしょう。

ソケットで通信してXMLを送受信するならばperlで10数行でしょう。

SHA1で長々とコードを書くまでもなく、.NET Frameworkならば、予めクラスライブラリが用意されているでしょう。

昨今ではアプリケーションのプラグインもスクリプト化しつつある。

mallocとfreeを追っかけ徹夜する開発者と、コーディングと数回のデバッグで仕事を終え、定時で帰ってしまう開発者のどちらがカッコいいのでしょう。

「言ってるその言語自体はC言語で出来ているんだ」
そうでしょうね。でもあなたが作った訳じゃないですね。
「C言語じゃないと出来ない処理だ」
そうですね。ただ、それが必要な処理ならば、いずれ誰かがクラスライブラリを作ってくれるでしょうね。
「他の言語は今後仕様が変わってしまう可能性がある」
そうかも知れませんね。きっとその頃には、そのC言語で作られたシステムも作り変えですね。

確かにハードやkernelまわり、組み込み系ならばC言語でしょう。でも今後デスクトップアプリは他の言語に置き換わって行ってしまうかもしれない。

C言語はハードの制御と新しい言語の開発だけに使われ、デスクトップアプリケーション開発で御飯を食べるのが難しくなってしまいC言語使いの仕事と言えば組み込みだけになってしまう近未来が本当にやって来てしまうかも知れない。

C言語使いの凄いところってなんだ?

あるとすればクラッシュの仕方一つで、なんとなく原因が想像出来てしまう事。

時間が掛かる処理で、なんとなく無駄なループのソースが見えてしまう事。

そんな知識がいったい何時まで「凄い」と言われ続けるんだろうか…

「C言語だけでは御飯が食べられない」そんな将来がやってくるのだろうか。


そして近い未来、こんなネタで釣りな記事が@ITやITmediaに掲載されてしまう日が来るんだろうか。

Posted at 11:08 in その他 | WriteBacks (6)
Tagged as: c, job
Bookmarks: add to hatena add to hatena | add to del.icio.us add to del.icio.us | add to livedoor.clip add to livedoor.clip | add to buzzurl add to buzzurl | add to fc2bookmark add to fc2bookmark | add to Yahoo Bookmark add to Yahoo Bookmark | add to Pookmark add to Pookmark | add to NiftyClip add to NiftyClip | この記事へのリンク

2007/08/21

はてな
vimを使っていらっしゃる半数以上は開発者の方かと思います。
今日は、そんな開発者の方に便利なtipsをご紹介。

Makefile編集中のファイル名補完

一般的なファイルシステムでは、ファイル名に「=」という文字を使うことが出来ます。ただ、実際に使っているかどうかといえば、めったに使われる事はありません。なのに
TOP_DIR=/usr/inc
まで打って<c-x><c-f>とタイプしてもファイル名が補完されないのは、悲しかったりします。 こんなときには以下の設定をvimrcに入れておくと便利です。
autocmd FileType Makefile setlocal isfname-== isfname+=32
通常、フォルダ名やファイル名に「=」やスペースを使う事はまずありませんし、*unix系の開発を経験された事がある方ならば、スペースが混じってしまう事は一大事になる事もご存知かと思います。
この設定だと、Makefileにだけ適応されますし補完もサクサク出来ますね。
ちなみにWindowsで「C:/Program Files/hogehoge」を補完されたいならば
TOP_DIR="C:/Progra
と「"」を先頭にしておく事で補完出来ます。
もしかすると、*unixな方は「I」や「L」もisfnameから消してしまう事で
CFLAGS=-I/usr/inc
とか
LDFLAGS=-L/usr/li
でも補完出来て幸せかもしれません。

長いブロックや複数ブロックがある言語の開発

jsp(JavaServerPages)やASP(ActiveServerPage)、php等で開発される場合には、開始タグで各言語の処理を開始します。例えばphpであれば
<?php
$f = fopen("test.dat", "r");
と「<?php」が開始タグとなります。
vimでは各言語に合わせてシンタックスハイライト表示する機能を持っていますが、この開始/終了タグを辿って色付けをしています。この開始/終了タグの検索は、最悪ファイル全体を検索してしまい重たくなってしまう可能性がある為、vimでは閾値範囲内しか検索しないようになっています。
ただ、全ての言語でこの閾値が相応しいものとは限らず、まれに長いブロックが存在するとシンタックスハイライトが効かなくなってしまう事もあります。ここではこの閾値の変更方法を説明します。
閾値は、「syntax sync 」コマンドの「minlines」という値で設定でき、以下のようにautocmdで設定します。
autocmd FileType jsp,asp,php,xml,perl syntax sync minlines=500 maxlines=1000
私は上記の設定を使っています。

pythonのインデントをタブではなくスペースにする

これはvimユーザでpythonの開発をされる方であれば、これは必須ですね。
以下の設定はタブ幅4で、expandtabにしています。
autocmd FileType python setlocal ts=4 sw=4 sta et sts ai
ただ、まれにスペース2つの人とかもいますから、人のソースを修正する際には向かないかもしれませんね。

Emacsユーザに送るキーバインド

これはおまけ。
nmap <m-x> :
nmap <silent> <c-x>1 :only<cr>
nmap <silent> <c-x>2 :sp<cr>
nmap <c-x><c-w><c-w>
cmap <m-x> <nop>
もっとこだわりたい方は、vimacsの方をお勧めします。

追記1:リンクが間違ってました
追記2:KoRoN氏の指摘で「BufEnter」から「FileType」に修正(コピペ元がマズってました)
追記3:さらにKoRoN氏の指摘で「FileType」のpatternが間違ってるとの指摘で修正(もしかしたらBufEnter使ってたのは拡張子使いたいからだったのかな?覚えてないや)

mattn the Onsen Ikitai!

はてな
以下個人的な勝手な見解。そんなに熱く語ってる訳ではありませんので...
昨今色々なSNSが出回り、個々のSNSでそれぞれの色を出してアピールしています。
その中でもmixiがアクティブユーザ数はダントツで誇っており、これから数年も変わらないであろうと思われます。
mixiを代表とするSNSを色づけるSNS特有の機能として「足跡」があります。足跡とはそのSNSユーザ(もしくはゲスト)が対象のユーザページにアクセスした際、アクセスされた側に残されるログを指します。
otsuneさんも言うとおり、自前のブログを運営されている方であればHTTPアクセスログは一度は目を通した事があるでしょうし、知らない人が閲覧しているのは当たり前だと認識していると思います。
よく「足跡機能の付いてるSNSは嫌いだ」という人が稀にいますが、私が思うに
「足跡機能が必要ない」ではなく「足跡機能が嫌いだ」という人は、"自分が踏まれる事"よりも"自分が踏んでしまう事"で、踏まれた側から"勝手な先入観を持たれる"のが嫌いなのであって、単に見なければいいはずの足跡を"嫌い"という理由を明示しない。
という事。

私は、何個かSNSを掛け持ちしています。足跡機能があるSNSにも参加しています。時には足跡も見ますし、このサイトのアクセスログも見ています。
時にはtrackerfeedを使って、リファラにアクセスしたりもしますし、ハンドルネームで検索したりする事もあります。

ネットでコミュニケーションしたいなら普通の行動だと思っていますし、私のようにソフトウェアを開発している人間にとっては、作ったアプリケーションやプラグイン、パッチがまわりでどんな風に使われているのか知りたいと思うことは当然の事だと信じています。
まさか自分の為だけに作ったソフトウェアを自分だけで動かしてウヒヒヒヒ...なんてつもりはないですし、もちろんこの考え方も個々の勝手でいいとも思っています。

閲覧者は、客観的に人を判断している訳ですから、どう判断されたって致し方ないし、そもそも足跡をつけてしまっただけで勝手な先入観を持たれるコミュニケーションなんて成立しないんじゃ...と。

別に
貴方に関する記事書いたのにリアクション無いし、足跡見たら踏んでるのにスルーですか?
なんて可愛い事を言うなと言ってる訳でもないですし、平然とクールに足跡は閲覧すべきだ!と「SNSのルール」を語ってる訳でもないです。

ただただ足跡の有無でSNSの良し悪しを公言したり、足跡なんか気にするのは××だと公言するのはどうかと...

その「足跡拒否反応のおしつけ」こそが逆に
熱いはずの熱湯風呂に"熱い"と絶叫しながら入れない人間はおかしい
と言ってるように私には見えてしまうのです。

まぁ、その個々の考え方の不一致がSNSを面白くしているんでしょうけどね。

以上、独り言でした。
Posted at 12:49 in web::sns | WriteBacks (2)
Tagged as: sns
Bookmarks: add to hatena add to hatena | add to del.icio.us add to del.icio.us | add to livedoor.clip add to livedoor.clip | add to buzzurl add to buzzurl | add to fc2bookmark add to fc2bookmark | add to Yahoo Bookmark add to Yahoo Bookmark | add to Pookmark add to Pookmark | add to NiftyClip add to NiftyClip | この記事へのリンク

2007/08/20

2007/08/17

はてな
vimscriptの発祥から考えると、vimで扱えるオブジェクトはあくまで数値、文字列レベルの物でしかないと思われがちですが、Dictionaryとfunction()を使えば、それとなく継承ぽい事が出来ます。
まぁ、javascriptに近い言語仕様というのもありますからね。
以下のコードでは、簡単なクラスとオブジェクトを定義しています。
function! Class_Prototype() dict
  return self
endfunction

function! Class_Override(...) dict
  if a:0 == 0|throw "Invalid Parameter"|endif
  let class = copy(self)
  let class.__NAME__ = a:1
  if type(a:2) == type(class.New)
    let class.New = a:2
  else
    let class.New = self.New
  endif
  let class.Super = self
  return class
endfunction

function! Class_New(...) dict
  let instance = copy(self)
  call remove(instance, "New")
  call remove(instance, "Override")
  let instance.Super = self
  return instance
endfunction

function! Class_ToString() dict
    return self.__NAME__
endfunction

let Object = {
 \ "__NAME__" : "Object",
 \ "Prototype"function("Class_Prototype"),
 \ "Override"function("Class_Override"),
 \ "Super"{},
 \ "New"function("Class_New"),
 \ "ToString"function("Class_ToString")}
この状態で
if exists("object")|unlet object|endif
let object = Object.New()
echo object.ToString() . ":..."
とすると
Object:...
と表示されます。

ここで
function! Human_Sing() dict
  return self.perfix . "は" . self.name . "。" . self.title
endfunction
function! Human_New(...) dict
  let instance = copy(self)
  let instance.perfix = a:1
  let instance.name = a:2
  let instance.title = a:3
  let instance.Sing = function("Human_Sing")
  return instance
endfunction
let Human = Object.Override("Human", function("Human_New"))
とすると、Objectクラスを継承するHumanクラスを定義する事が出来ます。
さらにこの状態で
if exists("human")|unlet human|endif
let human = Human.New("私", "人間", "一般人")
echo human.ToString() . ":" . human.Sing()
とすると
Human:私は人間。一般人
と表示されます。
つまり、Newメソッドをオーバーライドし、Singメソッドを追加した事になります。ToStringメソッドはObjectクラスのメソッドとなります。
vimscriptはJavascriptのように、メンバを動的に生成出来ますので
function! Gian_Boxing(who) dict
  return a:who . "のくせに生意気だぞ!!!"
endfunction
let Gian = Human.Override("Gian", {})
let Gian.Boxing = function("Gian_Boxing")
if exists("gian")|unlet gian|endif
let gian = Gian.New("俺", "ジャイアン", "ガキ大将")
echo gian.ToString() . ":" . gian.Sing()
echo gian.Boxing("のび太")
とすると
Gian:俺はジャイアン。ガキ大将
のび太のくせに生意気だぞ!!!
とジャイアンが生成出来ます。
意外とやれるもんですね。

ただ、せっかくローカルスコープ、スクリプトスコープ、グローバルスコープ等、名前空間は既にしっかり存在してるんだから、もう少し他のオブジェクト指向言語(JavaやJavaString、C#やVB.NET)のように既定メソッドとかデフォルトコンストラクタみたいな概念が欲しいなぁ...
あと関数名は先頭大文字強制ってのは痛い。
ま、その辺はまた今度...

mattn the vimscripter

2007/08/16

はてな
microformats 前回はmicroformatsを簡単に説明する事で、microformatsとは何か?、microformatsで何が出来るのか?を説明しました。
今回は、microformatsを利用して実際にWebページにメタデータを埋め込む手順を示して行きます。
microformatsのメタデータ構造はXHTMLで記述され、microformatsを利用するアプリケーションはDOMを使用する事で簡単にメタデータを扱う事が出来る様になります。

前回の記事を書く時点で、この記事を記述する前に、以下のmicroformatsをこのサイトに埋め込みました。
  • hCard
  • rel-tag
  • XFN
今回はその作った過程を説明していきます。

hCard

hCardの作成にはhCard Creatorや、hCard生成ツールでベースを作成し、自分のサイトのスタイルに合わせ修正するのが手っ取り早いです。
class属性には「class="fn"」といった単独の記述も出来れば、「class="url fn"」のように記述して
<a class="url fn" href="http://example.com/">ExAmPlE</a>
と組み合わせで記述する事も出来ます。

rel-tag

rel-tagは、そのサイトドキュメントが関連するタグを指し、ブログであれば各ブログツールによって生成されるものと思われます。利用するアプリケーション側は、このタグ情報を自身のサイトで抽出させたり、del.icio.usで検索させたりする事が出来ます。
このサイトでは、blosxomというブログツールのプラグインを使用してでタグを生成しており、本サイトの右側に表示されているタグ表示に使っています。
ただ、前回ご紹介したmicroformats Operatorでは、URLの最終部分をタグとして扱う仕様(technorati仕様)になっている為、例えば
<a href="http://example.com/weblog.cgi?tag=microformats" rel="tag">microformats</a>
等といったURLでOperatorを使うと、タグには「webblog.cgi」が表示されてしまいます。
これを回避するには
<a href="http://example.com/weblog.cgi?tag=microformats&-technorati-hack=/microformats"