2014年4月29日火曜日

seesaaからbloggerへ引っ越した

一昨日、とりあえず以前から使っていたseesaaブログで再開します。と言った矢先ですが、2日間ブログの投稿をしてみて管理画面の重さに辟易。今日アクセスしてみたら、ほかの方のseesaaブログもかなり重くアクセスできない状態が続いてイライラしていたのでBloggerにお引っ越ししました。

seesaaからBloggerに(少ない)記事をエクスポート・インポートしましたが、意外と簡単でした。

こちらを参考にさせていただきました。
seesaaはベースがMovableTypeですので、seesaaからMovableTypeのMT形式に変換。その後、seesaa独自のタイムタグを標準のタイムタグに書き換え、MTをBlogger用のXMLに変換するサイトでXMLを出力し、Bloggerからインポートするだけです。

Blogger少し使ってみた感覚ですが、編集画面がGoogleDocsと同じようなUIで使いやすいですね。とてもサクサクしています。あとはテンプレートも後々いじってみようと思います。

2014年4月27日日曜日

iTunesのライブラリデータ iTunes Music Library.xmlを読む

今作ろうとしているアプリに、iTunesのメタデータのインポート機能をもたせようと思っているので、試してみました。

iTunesの曲情報はすべてitlファイルというバイナリファイルに書かれていますが、同時にAppleの他の製品などから読み出しやすいように、xmlファイルも吐き出されるようになっています。このファイルはユーザごとに場所が決まっているようです。

http://support.apple.com/kb/HT1660?viewlocale=ja_JP

自分が使っているMac OSX 10.8.5と、iTunes 11.1.2というバージョンにおいては、iTunes Library.xmlではなくiTunes Music Library.xmlというファイル名になっていました。環境によって微妙に違いがあるのかな。

このファイルを見てみると、
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Major Version</key><integer>1</integer>
<key>Minor Version</key><integer>1</integer>

となっており、Appleの独自フォーマットPropertyListで定義されているようです。これはMac OSXでは一般的な.plistという拡張子のファイルで使われているフォーマットとなっています。

Wikipediaによると、辞書を
<dict>
<key>key</key>
<string>value</string>
</dict>

のような形式で保存するのが特徴のようです。

このファイルをPythonで扱うには、XMLをParseしないといけないかな、と思っていたんですが、ありました。plistlibというモジュール。しかもPython 2.6以上ではすべてのプラットフォームで標準で入っているようです。
import plistlib
import pprint

def read_itunes_xml():
pl = plistlib.readPlist('/Users/<username>/Music/iTunes/iTunes Music Library.xml')
pp = pprint.PrettyPrinter(indent=2)
print pp.pprint(pl)

このようにするだけで、簡単にiTunesライブラリのメタデータを表示することが出来ました。

pl['Tracks']の中には、すべての楽曲のAlbum, Artist, Bit RateなどのMP3タグを元にしたメタデータが入っています。

2014年4月26日土曜日

SeesaaでSyntaxハイライト

privateモードではてなブログをつけていた時期があって、はてなのシンタックスハイライターに慣れていたのですが、Seesaaには標準でこれがないらしいです。

なんとかできないものかと思ったのですが、google-code-prettifyが使えるそうです。
http://google-code-prettify.googlecode.com/

SeesaaではブログテンプレートのHTMLとCSSが編集できるので、これを導入してみようと思います。
JSとCSSの2ファイルがあればいいので、ダウンロードしてブログ内にホストしてもいいのですが、面倒なのでひとまずGoogleが書いているように以下のJSを読みこめば、すぐに使えるようになります。

デザイン > PC > デザイン設定 → HTML

から新しいHTMLテンプレートを作成します。

<script src="https://google-code-prettify.googlecode.com/svn/loader/run_prettify.js"></script>

このままでもsyntax highlight自体は動きますが、フォントやサイズなど気に入らない部分をCSSの設定から変更します。

デザイン > PC > デザイン設定 → デザイン設定

から今選択しているテンプレート名をクリックすればCSSが編集できます。
当ブログでは以下のような設定を入れました。

pre{
line-height: 1.2;
font-family: Consolas, Monaco, Lucida Console, monospace;
overflow: auto;
border-radius: 3px;
}



Dropbox APIをPythonで使ってみた

pythonからユーザのDropbox内を閲覧したり、変更したりする方法を紹介します。
検索してみたところ、そもそも日本語の文献が少ないのと、最新のOAuth2.0に対応している資料が少なかったので記しておきます。

作りたいアプリがデスクトップアプリでファイルの操作を行うため今回はそのためのTipsとなりますが、サーバ上のWebアプリであっても基本的には同様の使い方ができるかと思います。

本当はBox.comを利用したかったのですが、DropboxはPythonからのAPIのアクセスができるような公式のフレームワークを準備してくれていることと、BoxのAPIは後に紹介するOAuthによるユーザ認可のプロセスが自動リダイレクトを想定しているため有効期限が30秒しか無いなど、デスクトップアプリからだと著しく使いにくくなるため、ひとまずDropboxを利用することに。

1. 作成するアプリケーションの登録


https://www.dropbox.com/developers/apps
からアプリケーションの登録をします。




DatastoresというのはDropboxをDBのように使ってしまうためのAPIみたいです。通常のDropboxアプリからWindowsやMacのファイルを共有させる用途で使うのであればCore APIが必要になりますので、Files and Datastoresを選択します。

登録が終わったらアプリ名の画面に行き、登録したアプリを選択します。

するとApp keyとApp secretが表示されるので、これらを後のAPIでの利用のために控えておきましょう。

2. Dropbox API Python SDKのダウンロード


pipを使っている方は、
pip install dropbox

で入ります。ダウンロードが必要な方はこちらからダウンロード
https://www.dropbox.com/developers/core/sdks/python

Dropboxのサイトからダウンロードした場合は、いくつかのExampleも同梱されています。

余談ですが、2013年のPyCon APACに参加した際、DropboxのエンジニアによるKeynoteがあったのですが、Dropboxでは至るところにPythonを使っているらしいです。デスクトップアプリすらもPython製だとか。

3. access_tokenの取得


ユーザが初めて作成サードパーティのDropboxアプリを利用する際には、TwitterやFacebookと同じようにユーザによる認証・認可が必要になります。

2014/4/16現在ではDropbox SDKのバージョンは2.0となっており、OAuth2.0を使うのが標準となっているようです。自分がOAuthを最後に触ったのがもう数年前でOAuth1.0の頃だったのですが、OAuth2.0ではSSLによる通信を必須にすることで、access_secretを設定しなくてもよくなっているそうです。

以下にコードを示します。
まず認可するためのURLを生成して、ユーザがこのURLにブラウザからアクセスし、今回作成したアプリの利用を許可してもらったあとに表示されるコードを入力してもらう、という流れになっています。Webアプリの場合は、このコードをDropboxのサイトからのリダイレクトで渡すことができるので、ユーザによるコピー&ペーストの手間を省くことができます。これをデスクトップアプリでやろうとすると、恐らく内部にブラウザを立てる必要がありそうです。

import dropbox

APP_KEY = '上で取得したAPP_KEY'
APP_SECRET = '上で取得したAPP_SECRET'

def get_access_token_from_dropbox():
    flow = dropbox.client.DropboxOAuth2FlowNoRedirect(APP_KEY, APP_SECRET)
    url = flow.start()
    print 'access to the url below and allow this application, then copy PIN on your browser.'
    print url
    print 'put PIN code here.'
    pin = raw_input()

user_meta = {}
(user_meta['access_token'], user_meta['username']) = flow.finish(pin)
return user_meta

ここで取得したaccess_tokenは、今回のApp keyのアプリからのアクセスの場合使いまわすことができますので、何らかの方法で永続化しておけばよいでしょう。

4. SDKを使ってファイルをアップロードしてみる


先ほど取得したアクセストークンを使って、DropboxClientのインスタンスを作ります。
PNGファイルを一つアップロードしてみましょう。

client = dropbox.client.DropboxClient(token)
with open('hoge.png', 'rb') as f:
    file_meta = client.put_file('/testtest.png', f.read(), overwrite=True)
    print file_meta

非常に簡単に書けることがわかります。

参考にしたサイト
http://dkpyn.com/blog/1182

ブログ再開します

Webエンジニアになって早2年。節目のタイミングで考えることもいろいろあるので、ブログを再開してみようと思います。
自宅サーバもあるのでホントはWordpressなどに移行したいところであるが、環境整備していたら満足してしまいそうなので、今回はカタチから入るのはよして手っ取り早く以前のブログを引き継ぐことにします。
みなさんよろしくお願いします。

今作りたいもののアイデアがあるので、その状況をアップデートしていくつもり。
細かいTipsなどはGistにでも書いてリンク貼ってきます。