2015年8月30日日曜日

PyCharm, RubyMineでのデバック時の変数の表示をprint文(p文)で

デバッカーはGUIのほうがずっと便利。PyCharmでgdbのprintに相当するような、変数の中身を表示させる機能を探していたらあった。

こちら

もちろん、ブレイクポイントを作れば、停止時に変数の中身は全て見えるが、複雑なクラスの場合、みたい部分がどこにあるかわからなかったりするので、print文の方が便利。
同じJetBrain製のIDEのRubyMineも似たような感じでできるでしょう。(多分)

2015年8月15日土曜日

one hot encoding (python scikit-learn)

会員情報の職業や性別のようなカテゴリ値を用いて、機械学習をする際には、何らかの形で数値にする必要がある。 通常は、「会社員」や「学生」のようなカテゴリ情報は、取り得る値の種類と等しいサイズの配列のその値のみを1にした物を使う。 倒えば、会社員=[1,0]、学生=[0,1]のような形式になる。この表現形式をone-hot encodingまたは1 of K encodingと呼ぶ。
pythonのscikit-learnで以下のように、この変換ができる。

次のような、accounts.csvがあると仮定する。
name,occupation
sato,adventurer
ito,engineer
inoue,student
tanaka,engineer
oda,adventurer
基本的にはDictVectorizerに入れるだけだが、その前に[(occupation=adventurer),(occupation=engineer)]のようなディクショナリの配列にする必要がある。

# -*- coding: utf-8 -*-
import pandas as pd
from sklearn.feature_extraction import DictVectorizer

accounts=pd.read_csv('./accounts.csv', encoding='utf-8')

occupation_vectorizer = DictVectorizer(sparse=False)

i = [ dict(occupation=occupation) for occupation in accounts[u"occupation"] ]

X = occupation_vectorizer.fit_transform(i)
names = occupation_vectorizer.get_feature_names()

# original table
print accounts
# label names
print names
# transformed one-hot encoding
print X
結果
     name  occupation
0    sato  adventurer
1     ito    engineer
2   inoue     student
3  tanaka    engineer
4     oda  adventurer
[u'occupation=adventurer', u'occupation=engineer', u'occupation=student']
[[ 1.  0.  0.]
 [ 0.  1.  0.]
 [ 0.  0.  1.]
 [ 0.  1.  0.]
 [ 1.  0.  0.]]

2015年8月7日金曜日

Rails runnerの簡単な使い方

RailsのrunnerはRailsの環境の上で任意の処理を書くことができる。 Active Record経由でバッチ処理をするのには最適な機能。
実行の方法は2つある。
  1. Railsで作成したアプリのメソッドを直に指定してやる
  2. ファイルを読み込ませる
紹介されている例は(1)が圧倒的に多く、 lib/配下にTasks::XXXのようなモジュールを作りautoload_pathsを指定してRailsアプリにこのモジュールを読み込ませてやる様な事がされている。 (2)の場合、Webアプリでautoload_pathsやrequireをして処理を記載するファイルを読み込む必要がない。
個人的には、Webアプリと独立したバッチ処理を長々とWebアプリにメソッドとして追加するのは違和感があるので(2)の方が良い気がする。 それに、autoload_pathsを変更しなくていいので簡単。
例:
予めRailsルートはいかにrunner/を作っておく。
mkdir runner
あとは適当なファイルを作って呼び出すだけ。
runner/runner.rb
# Railsでつくったアプリが読み込まれてから実行されるので、何もrequireしなくてもActive Record経由でモデルにアクセスできる
# この場合はTagという名前のモデルが存在する環境
p Tag.count
成功。
$ rails runner runner/runner.rb
21931

2015年8月4日火曜日

AmazonAPIとruby gem asin

Amazonの商品情報の問い合わせにはrubyのgemのasinが便利。
https://github.com/phoet/asin

上記ではcurbを使ってアクセスしているが何故かうまくいかなかった。
かわりにhttpiを使うと動いた。
直接、ハッシュを返してくれるので楽。
require 'asin'
require 'httpi'

# Setting for amazon API
include ASIN::Client

ASIN::Configuration.configure do |config|
config.secret        = 'SECRET'
config.key           = 'SECRET'
config.associate_tag = 'SECRET'
config.host = 'ecs.amazonaws.jp'
end
HTTPI.adapter = :net_http
client = ASIN::Client.instance

# Define amazon api response group
RESPONSE_GROUP = [:Medium,:Reviews]

# Search!!
api_responses = client.search({:Title => "我輩は猫である", :SearchIndex => :Books, :ResponseGroup => RESPONSE_GROUP})
p api_responses
アマゾンAPIの仕様

2015年8月1日土曜日

IEではhttp://user:pass@example.com/みたいなリンクが開けない

http basic authenticationでパスワードが設定されたURLではhttp://user:pass@example.com/みたいな形のURLでユーザーにパスワードを入力させることなく アクセスできるが、IEではHTMLのリンクとして、この手のURLを開くことができない。。。。。
クロームとかはできる

https://support.microsoft.com/ja-jp/kb/834489

おすすめなgitのエイリアスの設定

git のエイリアスはこんなのがいいんじゃない?
git config --global user.name "sato"
git config --global user.email sato@example.com
git config --global alias.st 'status'
git config --global alias.llog 'log --graph --decorate --color --stat'
git config --global alias.slog 'log --oneline --color'
git config --global alias.ch 'checkout'
git config --global alias.d 'diff --color'
git config --global alias.diff 'diff --color'