ほんじゃらねっと

ダイエット中プログラマのブログ

お絵かきおもちゃ「Etch-A-Sketch」があまりにも懐かしかったので操作感を再現するためにWeb版を作った

f:id:piro_suke:20170603233743p:plain

小さい頃に気に入って遊んでたあのお絵かきおもちゃ、

なんだったかな、

と思って検索したら「Etch-A-Sketch」という製品だった。

Ohio Art Classic Etch A Sketch Magic Screen

Ohio Art Classic Etch A Sketch Magic Screen

懐かしい。

左右のダイアルをまわすと、上下左右にポインタが動いて線が描かれる。

くるくるダイアルを回してポインタを一生懸命動かして絵を描いていくわけだ。

両方のダイアルを同時に回すことで斜めの線を描いたりもできるのだけど、

それが結構難しくて、ふにゃふにゃした線になる。

絵を消したい時は、裏向けてシャカシャカ振ると消える。

最終的には直線を組み合わせた角ばった絵になっちゃうのだけど、

それがまた独特で楽しかった。

続きを読む

いちいちExcelを開くのがつらいのでCSVファイルのカラムを揃えて見やすく出力してくれるスクリプトをつくる

f:id:piro_suke:20170531231836j:plain

仕事でCSVファイルのやりとりをすることが多い。

CSVファイルというのは、Excelで開くと見やすいのだけど、

普通にテキストエディタやCUI環境で開くと結構見づらい。

そして、Linuxで作業してる時なんかにいちいちファイルを

ダウンロードしてExcelを開くのはとてもつらい。

そこで、

CUI環境でもExcelで開いた時のように縦の並びが整形された形で

閲覧できるスクリプトを書いてみた。

続きを読む

デザイナーとプログラマのわがままに応えて、テンプレートエンジンから生成されたHTMLファイルを元の部品ファイルに分割するツールを作る

f:id:piro_suke:20170529005556j:plain

Webアプリを開発する際、

最近の多くのテンプレートエンジンはHTMLをレイアウトや部品に分割して作成し、

それをextendしたりincludeしたりして1つのHTMLとして出力できるようになっている。

部品化することで、ヘッダーとかメニューとかフッターとか、

複数のページで共通して表示する要素を変更する際に、

1箇所だけ変更すれば済むようになるわけだ。

しかし部品化することで発生するデメリットもあって、

Webアプリとして実行してみないと完成版のHTMLが確認できない、

外部のデザイナーさんとデザインをやりとりしづらい、

といった問題が発生する。

続きを読む

PostgreSQLでのUPSERT(INSERT or UPDATE)処理を検証する

f:id:piro_suke:20161202005524j:plain

PostgreSQLでUPSERT(データがあればUPDATEしてなければINSERT)する

方法について調べたところ、いくつか書き方があるようだ。

UPSERT処理で気になるのは同時実行された際に

重複登録されたり重複エラーが発生しないかどうかなので、

その観点で下記の4パターンの方法を検証してみる。

  1. UPDATEしてNOT FOUNDならINSERT
  2. CTEでUPDATEしてNOT EXISTSならINSERT
  3. INSERT ON CONFLICT DO UPDATE
  4. INSERTしてUNIQUE_VIOLATION EXCEPTIONならUPDATE
続きを読む

既存のMarkdownファイルをreStructuredTextに(ざっくりと)変換する

f:id:piro_suke:20160827004244j:plain

新しいプロジェクトを開始するにあたり、

ExcelやめてSphinx + reStructuredTextでドキュメント作るようにしません?

という提案をしてみたら、意外とすんなり通った。

概要 — Sphinx 1.5.6 ドキュメント

reStructuredText入門 — Sphinx 1.5.6 ドキュメント

これでドキュメントのバージョン管理とか、

複数人での共同作成とかがしやすくなりそうで嬉しい。

この提案の前に、

チーム内でのちょっとした技術情報とか議事メモの共有に

Markdown形式のファイルを使うようにしていて、

テキスト形式の文書管理に抵抗がなかったのが良かったのかもしれない。

で、どうせならこれまでMarkdownで作成したファイル(結構作ってた)も

reStructuredTextに変換して、SphinxでHTML化して閲覧できるようにしたい!

ということで今回のテーマにつながった。

続きを読む

昨日食べたものも思い出せなくなってきたおっさん(自分)のために食事履歴記録アプリをつくった

f:id:piro_suke:20160320014313j:plain

おじさんになると、

よっぽど興味を持ったこと以外はすぐに忘れてしまうようだ。

忘れるというよりも、覚えてるけどうまく思い出せない、というべきか。

今週ランチで食べたものを思い出してみようとしても、

昨日のメニューすらなかなか出てこないことがある。

頭で覚えられないならしかたない、頭の外でデータ化しよう、

ということで今回は食べたものを登録できるツールを作ってみる。

続きを読む

プログラムテスト用の組み合わせパターンデータをササッと作るためのテンプレ【Python/Clojure】

f:id:piro_suke:20160729002821j:plain

他の誰かが作成した検索プログラムやストアドファンクションを

修正させられる時に、

検索対象のテストデータとか

プログラムに渡す検索パラメータのテスト用データを

必要なパターン分作成してテストするのだけど、

抜け漏れのないテストデータを簡単に生成できないものかと調べていたら、

PythonにもClojureにも組み合わせリストを作成してくれるライブラリがあった。

続きを読む

Windows/Linuxでディスクがいっぱいになった時に、フォルダ毎に使用している容量を確認する方法

f:id:piro_suke:20160725002531j:plain

PCやサーバの容量がなくなる、というのは案外よくあるもので、

年に1回くらいそんな事態に遭遇しては、

どのフォルダ・ファイルが容量を圧迫してるんだ!

容量を調べるためのコマンドなんだっけ?

とコマンドを探したりツールを探したりする。

なので、自分の忘備録も兼ねて、ここにまとめておく。

続きを読む

忙しいけど映画は観たい人のために、テレビ映画放映情報チェックして通知してくれるスクリプト

f:id:piro_suke:20160722000409j:plain

映画鑑賞は割と好きなのだけど、

なかなか映画館にはいけないし、

DVDを借りてもレンタル中に観る時間が取れるとは限らないし、

ということでもっぱらテレビで面白そうな映画をやってたら録画して

時間のある時に観ている。

しかしそうそうテレビ欄をチェックしているわけでもないので、

気づいたら観たかった映画が昨日放映されてて悔しがる、なんてことがよくある。

放映予定の映画をまとめて確認する方法はないのか、と探してみたら

良いページが見つかった。

続きを読む

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

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でデータを編集して簡単にデータベースに 反映できる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 APIでタイムラインを分析して、フォロワーが最も活動している時間を見つける

Twitterに記事ツイートを投稿するなら、

閲覧者が多い時間帯に投稿した方が効率が良い。

ツイートが多い時間 = 閲覧者が多い時間だろう、

ということでTwitterのAPIを使って自分のフォロワーが

どの曜日、どの時間帯でツイートしているのかを調査してみた。

TwitterのAPIでどんな情報が取得できるか調べてみたところ、

自分がフォローしている相手のうち、自分をフォローしてくれている

ユーザー(いわゆるフレンド)を取得することができるらしい。

このデータを時間や曜日で集計するのが良さそうだ。

ということで、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時あたりが閲覧者の多い時間帯ということかな。

おわり

データの収集とグラフ作成にはClojureとincanterを使った。

bar-chartとline-chartくらいしか使ってないけど、なかなか楽しく分析できた。

ビジュアライゼーション楽しい。

ClojureでHTMLじゃないプレーンテキストに対応したテンプレートエンジンを探す

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)

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

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