読者です 読者をやめる 読者になる 読者になる

ほんじゃら堂

自動化のためのツールやサービスに興味があります

ClojureでMapの内容をコンバートしたい時はforで回してできたリストをintoでMapに再変換する

clojure IT系・技術系

Mapの内容をコンバートする方法を調べてたら、StackOverflowで良い方法を見つけた。

stackoverflow.com

Mapのキーをキーワード化する時の方法についての相談で、下記のようなintoとforを使った方法が紹介されてた。

(into {} 
  (for [[k v] my-map] 
    [(keyword k) v]))

Mapをforで回して一旦KeyとValueのリストのリストにして返して、infoでそれをMapに変換してる。

なんてエレガントな方法があるんでしょう。

for内の処理を変えたら色々応用できそう。

into知らなかったな。知っててもこの使い方を思いついたかどうかはアレだけど。

into - clojure.core | ClojureDocs - Community-Powered Clojure Documentation and Examples

ClojureでExcelからPostgreSQLにデータを取り込むアプリを作る

clojure excel IT系・技術系

Clojureの練習を兼ねて、Excelでデータを編集して簡単にデータベースに 反映できるLeiningenアプリケーションを作ってみました。

pirosuke/clj-xlsx2db

データベース操作にはKormaを使ってるのですが、 使いやすくて気に入ってます。

使い方

コマンドを指定してデータベース-Excel間のデータインポート、エクスポートができます。

例えばWebアプリを開発しながらExcelで編集して取り込み、動作確認してまた編集、 みたいな操作を繰り返すことを想定して、データベース接続情報や対象テーブル、 入出力先のExcelファイルパスはiniファイルに保存しておき、パラメータとして 渡す形にしています。

Excelに1行目がカラム名になっているシートをテーブルごとに出力する:

lein run export-table-info <iniファイルパス>

Excelにテーブルのデータを出力する:

lein run export-table <iniファイルパス>

Excelからテーブルデータを取り込む:

lein run import-table <iniファイルパス>

Leiningenアプリケーションなので、スタンドアロンjarファイルを生成すれば Leiningenが入っていない環境でも実行できます。

スタンドアロンJarファイル生成

lein uberjar

jarファイルでテーブルデータ出力

java -jar <jarファイル名> export-table <iniファイルパス>

iniファイルの記述方法については下記のサンプルiniファイルをご参照ください: https://github.com/pirosuke/clj-xlsx2db/blob/master/resources/sample.ini

各項目についてはREADME.mdに記載しています。

注意点等

今のところPostgreSQLにのみ対応しています。 そのうちMySQLにも対応するかも。

import-tableコマンドは既存データを削除してから取り込むので、 大事なデータが消えないようにご注意ください。

テーブルのデータ型によってはうまくインポートできないかも...。

ブログ投稿をTwitterタイムラインの活発な時間にぶつけてアクセスアップを狙う

clojure IT系・技術系

最近記事を予約投稿するということを覚えたので、 せっかくだからたくさんのユーザーに見てもらえる時間に投稿したい、 ということで調べてみました。

このブログは記事を投稿した時に自分のTwitterタイムラインにリンクを ツイートするようになっているので、投稿した時にタイムラインを見ている ユーザーの数が一番投稿時間に影響しそうです。

TwitterのAPIでどんな情報が取得できるか調べてみたところ、 自分がフォローしている相手のうち、自分をフォローしてくれている ユーザー(いわゆるフレンド?)を取得することはできるようです。

これらのユーザーがツイートしている時間や曜日を集計して、 より多くの投稿が行われている時間に記事を投稿すれば ユーザーの目に触れる可能性を高めることができそうです。

残念ながらTwitterAPIでは取得できる過去のツイートの範囲が限られているようなので、 Streaming APIでツイートを収集する処理を一週間流してみました。 もうちょっと手軽に期間データを集める方法があると良いのですが。

11/18〜11/24の一週間で集まったツイートデータを時間別曜日別で集計してみました。

時間帯別ツイート数

f:id:piro_suke:20160207004453p:plain

このグラフを見た限りでは、 ・12時台のツイート数が最も多く、昼間の時間帯の中では突出している ・次いで12時〜23時台が平均してツイート数が多い ・朝の8時台も出勤前か登校前かその前後の時間帯と比較すると多い ・午後より午前の方がツイートが多少多い ・0時以降はツイートが少ない という感じでしょうか。 もっとデータを集めたらまた違った傾向が見えてくるかもしれませんね。

曜日別ツイート数

f:id:piro_suke:20160207004445p:plain

曜日別では、 ・平日の火曜〜金曜が土日月よりもツイートが多く、週末に近づくほど増えている くらいしか読み取れませんでした。

曜日別時間帯別ツイート数

f:id:piro_suke:20160207004437p:plain

なんだかそれっぽいグラフになった。 ・時間帯別で18時台のツイートが多くなっていたのは、水曜・木曜のツイート数が突出していたからみたい。何かイベントがあったのかな? ・12時台のツイートが多いのは昼休みのある平日だけかと思ってたら、土曜日も平日と同じくらいある ・土日のツイート数は12時前後以外は似ている ・月曜は全体的にテンションが低いのかツイート数少なめ。19時過ぎてから元気出てきた ・木金と月は夜更かし傾向 これまたもうちょっとデータを増やさないと平均が分からないですね。

ひとまず、今回のグラフを見た限りでは 予約投稿するのは8時、12時、20時あたりが良さそうです。

データの収集とグラフ作成にはClojureincanterを使ってみたのですが、 なかなか楽しく作れました。incanterはbar-chartとline-chartくらいしか 使ってませんが。ビジュアライゼーション楽しいですね。

もっと分析できるように統計学勉強しなくては。

ClojureでHTML以外に対応したテンプレートエンジンを探す

clojure IT系・技術系

Clojure始めました。 ちょっとしたスクリプトを作成しながら勉強中です。

最初にClojureで書かれたソースを見たときは 「このカッコ地獄には絶対慣れない」 と思いましたが、 書いているうちにカッコのおかげで処理や変数の範囲が明確に なっていることに気づくと違和感を感じなくなりました。

Vimのテキストオブジェクトと相性が良いのも嬉しいです。

Clojureのメジャーなテンプレートエンジン

表題のテンプレートエンジンについて、 Clojureのテンプレートエンジンとして検索してよく出てくるのは

の2つです。 まだ使ったことはありませんが、HTMLテンプレートを作る時は このどちらかを使うのが良さそうです。

HTML以外に対応したテンプレートエンジン

今回はHTMLではなく、JavaでいうVelocityのような、 メールやテキストファイルのようなHTML以外のテキストに対応した テンプレートエンジンを探していて、 見た感じがっつりHTML対応な上記2エンジンは使えなさそうでした。

でいろいろ探していて、「clostache」というリポジトリにたどり着きました。 fnd/clostache

初めて知ったのですが、「mustache」という、元々Ruby用に開発されてその後様々な言語に対応した テンプレートエンジンがあり、そのClojure版のようです。

テンプレートファイルをあらかじめ作成しておき、

(clostache/render-resource template-path val-map)

みたいな感じで手軽に使えて良さそうです。

また良いライブラリを見つけたら紹介していきます。

Pythonでオブジェクトから階層ごとに属性があるかチェックせずに値を取得するための関数

amazon api IT系・技術系 python

AmazonAPIを触っていて、レスポンスとして返ってきた(XMLから生成された)オブジェクトから値を取得する際にいちいちhasattrでチェックするのが面倒だったので、そのパスがなければデフォルト値を返す関数を作った。

見つけられなかったけど、標準ライブラリにありそう...。

hasattrで属性があるかチェックして、 あったら次の階層に進み、なかったらデフォルト値を返す。

オブジェクトの属性が

obj.__dict__[属性名]

で取得できることが分かったのは収穫だった。(Python2.7)

下記のような形でAmazonAPIからのレスポンスを処理してみたらうまく動いた。

amazon_test.py

import bottlenose
from lxml import objectify

amazon = bottlenose.Amazon(AWS_ACCESS_KEY_ID, AWS_SECRET_KEY, Region='JP')

res = amazon.ItemSearch(
        Keywords=u'ダイエット'
        , SearchIndex='Books'
        , ItemPage='1'
        , ResponseGroup='Medium'
        , AssociateTag=AWS_ASSOCIATE_TAG
)

oot = objectify.fromstring(res)
for item in root.Items.Item:
    title = get_obj_attr(item, 'ItemAttributes.Title')
    author = get_obj_attr(item, 'ItemAttributes.Author')
    rank = get_obj_attr(item, 'SalesRank', 0)
    print '%s: %s, rank:%s, author:%s' % (item.ASIN, title, rank, author)

ちゃちゃっとAPIを試したい時なんかに使ってみよう。

Pythonプロフェッショナルプログラミング 第2版

Pythonプロフェッショナルプログラミング 第2版

大阪駅前第3ビル地下2階の「みなとや」濃厚鶏こってりらーめんとしめ飯が好きすぎて他のメニューが頼めない

ラーメン 食べ物

言い切った。タイトルで言いたいこと全部言ったよ。

お店の紹介はこちらの食べログで。

あっさりらーめんとか、角煮丼とか色々メニューはあるのに、 らーめんとご飯一緒に食べたら絶対お腹いっぱいになって 午後苦しいってわかってるのに、それでも毎回同じものを頼んでしまう。

f:id:piro_suke:20160207005418j:plain

特にしめ飯にこってりらーめんのスープをかけてからが好きです。 もう麺無しでもいい。

f:id:piro_suke:20160207005423j:plain

週1回でも体重が増えていきそうな組み合わせだけど、 また来週行ってしまいそう。

PythonでExcelの表からINSERT用SQLを生成して初期データ作成を楽にする

excel IT系・技術系 python 仕事効率化 自動化

職場はメイン言語がJavaなので、プロジェクトでPythonを使う機会は ないのですが、キャプチャを撮ったりExcelを操作したりする作業を 「こっそり自動化」するスクリプトPythonで書いたりしています。

最近はSE作業で何かとExcelを使うことが多いので、 Excel作業の自動化をいろいろと模索しています。

PythonExcel操作できるライブラリはいくつかあって、 xlwingsExcelPythonなんかが話題になっていたので 調べてみたのですが、後々他のメンバーに作成した ファイルを共有したりすることを考えると、 Excelと切り離して処理が書ける方が良さそうです。 (xlwingsはVBAPythonを呼び出す必要があり、ExcelPythonはアドオンを入れる必要がある)

結局、オーソドックスなxlrdxlwtを使っています。

今日は以前から面倒だと思っていた、 初期データ作成用INSERT文を作成するスクリプト、 というか関数を作りました。 Windows環境で使うことを想定しています。

下記のような、1行目がテーブルのカラム名で、 2行目以降がデータになっているシートを読み込んで、 行ごとにINSERT文を作成して別ファイルに出力します。

ID NAME ADDRESS
1 山田 大阪府
2 岡田 東京都

出力先ファイルやテーブル名は引数で指定します。 複数のシートを一括処理可能です。

使用例:

output_insert_sqls('テストデータ.xlsx', 'C:/Users/test/Desktop/insert_data.sql', 
    [   
        '会員一覧' 
        ,'商品一覧' 
    ],  
    [   
        'users'
        ,'products'
    ]   
)

他にも、CREATE TABLE文やDELETE文を生成する関数を追加すれば、 色々と作業を楽にしていけそうです。

セルを処理している部分は文字列とfloatしか考慮しておらず、 荒めのコードになっているので、またブラッシュアップしていきます。

unicode_literalsは今回初めて使い、どういう原理か 全く分かっていませんが、とりあえずこれをインポートすることで Windowsのパスが正しく認識できるようになりました。

迷惑をかけないExcel

迷惑をかけないExcel