2011.11.20 五反田

| トラックバック(0)

天気がよいのかわるいのか、よくわからなかったのですが、屋上に出てみたらかなり面白い空模様だったので夢中で撮りました。

が、なかなかいい感じには撮れないなぁー、と、あっち行ったりこっち行ったり。

このあと、屋内にいたのでわからなかったのですが、ざーっと一雨来たみたいです。

20111120 五反田

2011.11.12 旧芝離宮

| トラックバック(0)
最近、すっかりプログラミングネタを書かなくなっている。。。
仕事の中身が変わってきてるんですよね。。

全くプログラミングしてないわけじゃなく、コンセプトを確認するためにプロトタイプ作ったりはしてるんですが、これまでと比べて圧倒的に時間をさけてないなぁ。。と。

その代わりといってはなんですが、ここ一ヶ月ぐらいカメラを持って、週末は出かけているので、その写真をネタとして。。。

20111112_旧芝離宮

PythonでSelenium HTMLUnit

| トラックバック(0)
PythonでSeleniumのFirefox(WebDriver)を利用するのはすぐわかったのだけれど、HTMLUnitを利用する方法がすぐ見つからなかったのでメモ。
PythonでHTMLUnitを使うには、webdriver.Remoteを利用すれば良い。

1. PythonにSeleniumをインストール

2. Selenium RCをダウンロード

3. Selenium RCを起動

4. Pythonからwebdriver.Remoteを呼ぶ
# coding: utf-8

from selenium import webdriver

def main():
    driver = webdriver.Remote(
        command_executor= 'http://127.0.0.1:4444/wd/hub',
        desired_capabilities={
                'browserName': 'htmlunit'
                ,'version': '2'
                ,'javascriptEnabled': False})

    driver.get("http://www.flotsam-fareast.com")
    print "title:",driver.find_element_by_tag_name("title").text
    driver.close()

if __name__ == '__main__':
    main()

『集合知プログラミング』の付録に載っているPython Image Libraryを、Windows7 64bitにインストールしようとしてはまったので備忘録として。

PIL(Python Imaging)の公式サイトからWindows用インストーラ(Python Imaging Library 1.1.7 for Python 2.7 )を取得して、インストーラを実行すると、「Python version 2.7 required, which was not found in the registry.」のようなエラーが出てインストールできない。

仕方がないので、「Python Imaging Library 1.1.7 Source Kit」を取得して、インストールしようとすると、

building '_imaging' extension
error: Unable to find vcvarsall.bat

なんてエラーが出る。 うむむ、と思っていたら、非公式だけど64bit用インストーラを提供しているサイトがあると言うことで調べてみると。。。

Python Extension Packages for Windows - Christoph Gohlke

無事インストールできました!

Beautiful Soupを普段使っているのですが、lxmlの方がパフォーマンスがよいとのことなので挑戦してみました。

lxmlの使い方はThe lxml.etree Tutorialを読んだのですが、そこにetree.parse()の引数にURLを指定可能とあります。が、どうも日本語が化けちゃうんですよね。

で、調べてみたら、unicode化してから、etree.fromstring()でパースすればいいんですね。

# coding:utf-8

from lxml import etree
import urllib2

def main():
    url = r"http://www.amazon.co.jp/s/?__mk_ja_JP=%83J%83%5E%83J%83i&url=search-alias%3Daps&field-keywords=%90%B3%93%9D%93I%8E%FC%95%D3%8EQ%89%C1&x=0&y=0"
    user_agent_str = u"Mozilla/5.0 (Windows; U; Windows NT 6.1; ja; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13"
    opener = urllib2.build_opener()
    opener.addheaders = [(u'User-agent', user_agent_str)
                                        ,(u'Referer', u'http://www.amazon.co.jp')]
    page = opener.open(url)
    charset = page.headers.getparam('charset')
    html_data = unicode(page.read(), charset)
    et = etree.fromstring(html_data, parser=etree.HTMLParser())
    for elem in et.xpath("//div[@class='title']"):
        print etree.tostring(elem, method="text", encoding="utf-8").strip()

if __name__ == '__main__':
	main()

Nexus S:到着

| トラックバック(0)

Googleのnexusシリーズの第2弾。
Nexus Oneが出たときからほしーなぁと思っていて、SoftbankのHTC Desireを買ってしまったのですが、今度こそはとNexus Sを手に入れました。

TechCrunchでは「多少安っぽい」といわれていたので、どうしようかなと悩んだけれど、まぁ手にすると気にならないかな。

Best Buyで販売当日に購入したけれど、その後すぐアクセスできないなどもあり、いったいどうなることやらと思ったのだけれど、無事届いてよかった。

ちなみに利用した転送業者はSpireNetさん。速かったです。(が、州税がかかりますね。。)

Nexus S unboxing 1

Nexus S unboxing 2

Nexus S unboxing 3

Nexus S

毎回ググっていて、deliciousにブックマークしようとしたら、すでにブックマークしていたなんてことの多い自分用のメモとして。

インプットファイルとアウトプットファイルのエンコードが違う時の対処方法として。

  • INPUT: shift_jis
  • OUTPUT: shift_jis
# coding:utf-8
import codecs

def main(file_in, file_out):
    fi = codecs.open(file_in[0],"r",file_in[1])
    fo = codecs.open(file_out[0],"w",file_out[1])

    for row in fi:
        fo.write(row)
    fo.close()

if __name__ == '__main__':
    file_in = ["utf8.txt",'utf_8']
    file_out = ["sjis.txt",'shift_jis']
    main(file_in, file_out)

PythonでExcelファイルのデータを扱う方法として、以前Python + pyExceleratorを紹介しました。
(記事はこちら→「Pythonでエクセル操作:pyExceleratorでExcel読み込み」)

pyExceleratorでは、Excelファイルをインプットとして取り込む用途では使えていたのですが、これがINPUT/OUTPUTが同じファイルになると面倒なんです。「上書き保存」がそのままだとできない。。

そこでいろいろ調べてみたら、JavaのPOIなら「上書き保存」がいけるとのこと。
JavaのAPIを使うならPythonのJava実装である、Jythonを使えばいいよね!ということで、試してみました。

「Apache POI - the Java API for Microsoft Documents」
http://poi.apache.org/

「The Jython Project」
http://www.jython.org/

# coding:utf-8

from java.io import *
from org.apache.poi.ss.usermodel import *

def write_data(wsheet_name, wdata):
    excel_file = "data.xlsx"
    try:
        fi = FileInputStream(excel_file)
    except FileNotFoundException:
        print '[ERROR] file not found (1)'
        return

    WB = WorkbookFactory.create(fi)
    sheet = WB.getSheet(wsheet_name)
    if sheet == None:
        sheet = WB.createSheet(wsheet_name)
    row = sheet.getRow(0)
    if row == None:
        row = sheet.createRow(0)
    cell = row.getCell(0)
    if cell == None:
        cell = row.createCell(0)
    cell.setCellValue(wdata)
    
    try:
        fo = FileOutputStream(excel_file)
    except FileNotFoundException:
        print '[ERROR] file not found (2)'
        return 
    WB.write(fo)

if __name__ == '__main__':
    for i in range(3):
        sheet_name = "work_%d" % i
        wk_data = "data_%d" % i
        write_data(sheet_name, wk_data)
write_data()が3回まわって、そのたびにファイルを開いて保存してます。
これで最後の結果が前の結果を消していなければOKという、確認用のプログラムです。
Androidの良いところというと、マルチタスクとか言われますが、まぁそれもそうなのですが、私としてはインテントでのアプリ間遷移かなと思っています。

このインテントに慣れてしまっていたため、嫁のiPhoneで撮った写真をこちらに取得しようとしたときちょっと面倒だなと思いました。あぁこれってAndroidだからできたんだなぁと。

インテントでのアプリ間遷移の例を画像で説明しますと:


1. Google Readerのある特定の記事をWebページでも見たいとします

Intent-001:GoogleReader

2. リンクを押してWebブラウザを開きます

Intent-002:SwitchBrowser

3:ブラウザでページを開いて、あぁ、これTwitterで共有したいと思います

Intent-003:WebBrowser

4:ブラウザの「menu」から「その他」「ページを共有」を選び

Intent-004:Share

5:共有したいアプリを選びます

Intent-005:SelectApp

6: すると選択したTwitterアプリ(Twidroid)にページのURLが渡されています

Intent-006:Twidroid


Androidアプリを開発したとき、Intentってなんだそれ?だったのでドキュメント読んでもイメージ付かなかったのですが、使うようになって実感できました。

docomoのHT03Aを買ってまだ一年経っていませんが、Softbankより4月27日に販売されたHTC Desire(x06HT)、新規で契約しました。
HT03Aよりもスペックがよいので、とても使いやすいです。

----

これでHT03AとX06HTの、Android携帯2個持ちです。
携帯2個持ちはめんどくさいので、できれば1台にしたいと考えていました。
なのでNexus Oneを購入してdocomoのSIMを挿すことを考えていたのですが、どうも通信料金が13,650円にいくっぽいので、それだったらHT03Aのパケット通信を抑えて、X06HTと新規に入会した方が安いと判断しました。
ちなみに現在HT03AにはAPNdroidをインストールして、電話だけがかかるようにしています。

APNdroid
http://andronavi.com/2010/03/13469

----

GWは開発意欲もわいてきたので、早速適当なアプリを作って、インストールしてみました。
HT03Aのドライバが、Android SDKに入っているものだとどうも認識されなかったのですが、下記サイトを参考にして認識させました。

「HTC DesireのUSBドライバー - Androidとか」
http://d.hatena.ne.jp/jagarikoj/20100501/1272730690


HTC Desire

2010/5/16追記

なをぞさんからいただいたコメントに触発されて、SIMなしDesireでWiFi接続試してみました。問題なくいけました。
参考にしたサイトはTaoSoftwareさんです。

SIMなしDesireでWiFi
FirefoxのアドオンPearl Crescent Page Saverを使って、コマンドラインからFirefoxの画面キャプチャを撮る方法。
なんかコマンドラインでの利用方法については日本語の紹介ページがないんだよなぁ。。。
ということでまとめてみました。

Pearl Crescent Page Saver
http://pearlcrescent.com/products/pagesaver/

0. FirefoxにPearl Crescent Page Saverをインストールしておく。
Pearl Crescent Page Saverには無料のBasic版と有料のPro版があります。
無料のBasic版ならFirefoxの「ツール」=>「アドオン」でアドオンウィンドウを開いて、「アドオンを入手」タブからPearlで検索すればインストール可。
有料のPro版は、Pearl Crescent Page Saverのサイトで支払い処置をすると(Paypal)、ダウンロード用のURLが来るので、それを保存してインストールします。

1. コマンドラインを立ち上げて、firefoxのインストールディレクトリへ行く。

まぁ、Pathにfirefoxのインストールディレクトリを登録すれば良いんでしょうけど、面倒なので。。。

2. コマンド打つ。
firefox -saveimage http://www.yahoo.co.jp
キャプチャされたファイルは、Firefoxで指定しているダウンロード先に保存されています。
「ツール」=>「オプション」でオプションウィンドウを開いて、「一般」タブにあるダウンロードの設定を確認してください。

まぁ、簡単ですね。
バッチとかで使うとなると、もう少し設定したくなるかと思いますので、そこら辺はコマンドにオプションつけて実行です。
Bacis版ではできないがPro版でできることなどありますので、本格的に利用するならPro版がいいかと思います。

  • キャプチャ先URLにURLパラメータなどがある場合(?や&)は、引用符で囲んでおく。
  • metaタグ内にrefresh指定があった場合、Pearl Crescent Page Saverは10秒待つ。Pro版なら「-saveoptions refreshmaxwait」で指定可能。
  • Pro版なら「-saveas」を付けて保存先を指定可能。
  • -saveas」でファイル名を指定するときには、パターンを使える。
    • %t:ページのタイトル
    • %u:ページのURL
    • などなど。
  • -saveas clipboard」でクリップボードに保存可能。
  • -saveas」にアップロードサーバを指定可能。
  • ブラウザウィンドウを指定するは、「-width」「-height」。単位はpx。
  • キャプチャするタイミングを指定するのは、「-savedelay」。単位はミリ秒。
  • flashをキャプチャするには、「-captureflash」。
  • flashのキャプチャを遅らせるには、「-saveoptions flashdelay」。Pro版。
  • -saveoptions」はPro版。
  • -saveoptions visible」:ブラウザで見えている範囲をキャプチャする。
  • -saveoptions maxwait=ms」:待機時間(ミリ秒)を指定する。
  • -saveoptions refreshmaxwait=ms」:refreshでの待機時間(ミリ秒)を指定する。
  • -saveoptions delay」:「-savedelay」と同じ。
  • -saveoptions flashdelay=ms」:上述。読み込み後にさらに待機するのと同じことかな。。
  • -saveoptions top=pixelval」「-saveoptions bottom=pixelval」:キャプチャ範囲で刈り取るの上/下を指定。
  • -saveoptions left=pixelval」「-saveoptions right=pixelval」:キャプチャ範囲で刈り取る左/右を指定。
  • -saveoptions element=elementID」:DOMのIDを指定できるらしい。
  • -saveoptions scale=scaleval」:保存するファイルのサイズを縮小。
  • -saveoptions format=imagetype」:png、png@transparency=none、jpg、jpeg@quality=Qなどを指定可能。
詳細は公式サイトを確認ください。
http://pearlcrescent.com/products/pagesaver/doc/


# コマンドラインで実行したFirefoxをバックグラウンド実行とかできないのかな。。。
昨日、CSS Nite LP, Disk 8 「Google Analyticsを使ったWebアクセスログ解析とサイトへの反映」に参加しました。

http://lp8.cssnite.jp/
http://cssnite.jp/archives/post_1739.html

以下簡単に感想を。

Google Analytics ベーシック:レポート活用の基本
グーグルの小杉さんがGoogle Analyticsの機能を高速にw、説明。
去年リリースされた新機能の説明では、アユダンテの大内さんも登場。このお二人、インプレスのセミナーでも一緒だったなぁと思い出しました。
http://analytics-ja.blogspot.com/2008/07/ga-public-seminar-with-impress.html

仮説検証型、かつ4つの対顧客戦略でデータを見る:Google Analyticsを使った分析のあるべき流れ
クロス・フュージョンの衣袋さんが、データの見方から説明。
一番気になったのは、「経路分析は困難。だからシナリオ分析にする」というところ。
衣袋さんの言う「経路分析」は、個々の画面遷移を指していて、トップページに流入して、インフォメーションページを見て、商品を見て、、、といった個々の訪問ごとに閲覧した経路の分析。シナリオ分析は、ある一連のフロー(商品購入とか会員登録とか)の中で踏む必要があるページを仮定して、そこをピンポイントで観測して、フローの効果を計測する分析(というまとめでいいかな)。
シナリオ分析は、どれだけ意味のあるシナリオを仮説として立てられるかが重要かなと思います。また、シナリオを外れた動きに訪問者の何かが隠れていると考えれば、シナリオ分析からこぼれるものもどこかで拾わないといけないかなと。

ユーザー行動をセグメント化して、サイト改善:ユーザーの行動と気持ちに寄り添うセグメンテーション分析
アユダンテの大内さんによる、ログの先にいる訪問者を意識した分析の説明。
訪問者を3つのグループ(ブランド指名買い、潜在顧客、調べ物)に分けてモデル化しているのはなるほどですね。

Web制作会社のための、顧客が逃げないGoogle Analyticsレポーティング:成果アップのための解析「報告」の実践
HARMONYの石井さんによる、レポーティングの実践的な紹介がありつつの説明。
最後にレポートのサンプルをさらっと紹介していたのだけれど、写真に撮ればよかった。余所がどういうレポートを出しているかはとても興味ありますw
レポーティングなどの手法は、知識伝達しやすいので、どこまで共有するか/できるかは難しいなぁと。

経営者視点のサイトリニューアル提案:Google Analyticsを使った経営成果の算出法
ゴンウェブコンサルティングの権さんが、Web制作者がアクセス解析を提案に使うための一連の作業を説明。
アクセス解析を、SEO的な視点からどう活かすかという内容をWeb制作の見積もりという視点から説明した内容だったかなと思いました。

----

今回参加するにあたって、アクセス解析書籍の著者の方々のパーソナリティを見たいなぁというのと、どこまで説明するのだろうという業界のデファクトを知りたいという2点を考えていました。
その2点とも達成できて満足しています。
長時間、みなさんお疲れ様でした。
JavaのPOIをJythonから使ってみる方法もいけます。下記にまとめました(2010/7/25)。
Pythonでエクセル操作 その2:Jython + POI

PythonでExcelファイルを読み込むことになったので、pyExceleratorを使ってみました。

■pyExceleratorダウンロード先

■公式ドキュメント
作成中。。といっているが、ソースや例を見るようにとのこと。。。

■雑感
下記参考ページでも書いてありますが、pyExceleratorでは書き込みと読み込みでの作業勝手が違います。
特にExcelファイルの読み込み結果がスパース配列(*)であるため、Excel VBAのようにRangeオブジェクトを利用するようなデータ操作は使えないです。。。(「スパース配列」初めて聞いた。。。)
例えば、アクティブシートのA列から"excel"の文字列を含むセルの位置情報を取得したい場合、vbaだと次のように書けるけれど、これができない。
Debug.Pring Columns("a").Find(What:="excel").Offset(0, 0)
pyExceleratorのparse_xls()関数の戻り値は、セルの位置情報(行と列)をキーとしたディクショナリ型です。
ディクショナリ型なので、値からキーを引くのが面倒。。。なので、関数を作ってみました。
# coding:utf-8
from pyExcelerator import *

def find_key_by_val(search_word, sheet_data):
    def map_find(_x, _y):
        if _y == search_word:
            return _x
    def except_None(_z):
        return _z <> None
    rlist = map(map_find, sheet_data.keys(), sheet_data.values())
    return filter(except_None, rlist)

if __name__ == '__main__':
    print 'start'
    for sheet_name, values in parse_xls(r'C:\Temp\test.xls'):
        key = find_key_by_val(u'検索したい文字列', values)
        
        if len(key) < 1:
            continue
        for row_index, col_index in sorted(values.keys()):
            if col_index == key[0][1]:
                print values[(row_index, col_index)]
    print 'end'
pyExceleratorでのExcelファイルの読み込み操作は、スパース配列の操作に慣れることとイコールなのかも。

■参考ページ

SQLiteの開発ツール

| トラックバック(0)
最近すっかり更新していない。。。

csvファイルに出力されたデータをPythonを使ってSQLiteに入れて、いろいろSQL投げてデータを見るって作業しているんですが、どうもSQLiteは良い開発ツールがないね。。

試してみたツールを軽く紹介。

SQLiteStudio

http://sqlitestudio.one.pl/index.rvt
日本語もちゃんと利用可。
SQLのエディタがタブ形式になっていて複数起動できるのはいいね。
あと入力補助もあり。
そんなわけでよく利用しています。
難点はSQLの結果を全範囲選択して貼り付けることができないことかな。SQL投げた結果をExcelにぺこぺこ貼っていく作業なもんでいちいちExportは面倒。しかもExportした結果に列名が出ない。。


SQLite GUI Tools - SQLite Admin Software by SQL Maestro Group
http://www.sqlmaestro.com/products/sqlite/
SQLMaestroは、UIが良さそうな感じだったんだけど、データの日本語が化けてしまって、NG。文字コード変更できそうなところがないよね。。。
有料。


SQLite Expert - SQLite Database Administration Tool
http://www.sqliteexpert.com/
SQLのエディタがたぶん1つしか出せない。
結果データにFilterで絞り込みができる。
有料だけど、無料版もあり。
結果データの貼り付けが良い感じでないので、希望にあわないか。。


SQLite Analyzer
http://www.kraslabs.com/sqlite_analyzer.php
SQLのエディタを複数出せる。
結果データの貼り付けが良い感じ。
UIがちょっと古くさいのと、有料なのがね。。


有料までを視野に入れるといろいろあるけど、それでも思ったものがなかなかであえず。。
今日はここまでということで。

仕事の関係でFirefoxのアドオンを作ろうかなと思い、『Firefox 3 Hacks――Mozillaテクノロジ徹底活用テクニック』を買ってみたりしていたところ、偶然Firefox Developers Conference 2009のサイトにたどり着き、早速応募した。
そのFirefox Developers Conference 2009が今日大手町で開催だった。

最後まで聞きたかったのだけれど、予定があって午後の2部まで聞いて帰った。
聞いたのは:

基調講演 (1) 「Jetpack と Mozilla Labs 最新情報」
Mozilla Labs ユーザエクスペリエンス担当
Aza Raskin (エイザ・ラスキン)
これ告知していたものと内容が変ったみたいだけど、今回の内容でOKだった。もう少しゆっくりしゃべった方が通訳の人は助かったかも。笑

基調講演 (2) 「Mozilla: Web の未来を定義する」
Mozilla Corporation エバンジェリズムディレクター
Chris Blizzard (クリス・ブリザード)
こちらはAzaに比べて、年齢相応のどっしりとした(?)英語で、翻訳者もやりやすかったのでは? 聞いている側から言うと、とてもわかりやすかった。

B1 「3 分 Jetpacking」
あかつかだいすけ & Gomita
とてもおもしろかった。Jetpack使ってみる気になりました。

A2 「ね、簡単でしょ? すぐできる拡張機能レシピ」
株式会社マピオン 技術開発部
部長 山岸 靖典
サービス開発グループ システムエンジニア 中村 浩士
いろいろtwitterでは書かれていたけれど(笑)、内容は悪くなかったよ。たぶん会社説明はもう少し少なくても良かったかも。

今回のカンファレンスで一番の収穫は、jetpackだね。
これ対応APIが広がれば、かなり良い感じにプログラミングできるよ。


最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

最近のコメント

Powered by Movable Type 4.27-ja