TextQL を Windows で使う
CSV ファイルや TSV ファイルに直接 SQL をかけて結果を受け取れる TextQL というコマンドが Twitter の TL に流れてきたので Windows にインストールしました。PowerShell で使えるようにした作業メモです。
流れてきた紹介記事
TextQL - CVSファイルに対してSQLを実行できるコマンドラインツール | ソフトアンテナブログ
Go Lang の設定
TextQL は Go Lang で書かれているっぽいのでまず Windows で Go Lang を使えるようにします。
The Go Programming Languageのダウンロードページから Windows 用のインストーラ goX.X.X.windows-amd64.msi あたりをダウンロードしてインストールすればOKです。
なお自分は goX.X.X.windows-amd64.zip をダウンロード&展開して環境変数の GOBIN
と GOROOT
、PATH
を設定しました。
GOROOT
が zip ファイルを展開したディレクトリ、GOBIN
は GOROOT
の中の bin をセット。PATH
に GOBIN
のパスを追加して終わり。
> go version
go version go1.10 windows/amd64
とか出れば OK。
gcc の設定
gcc も使うっぽいので Sourceforge から mingw-w64-install.exe をダウンロード。インストーラを起動して途中の Architecture
を間違えなければインストール完了です。
PowerShell を再起動して gcc -v
が実行されれば OK。実行されていなければ C:\Program Files\mingw-w64\x86_64-X.X.X-posix-seh-rt_v5-rev0\mingw64
あたりの中にある bin
までパスを通せば使えるようになるはず。
TextQL のインストール
ここまで来れば簡単。
> go get -u github.com/dinedal/textql/...
とすれば GOBIN
にビルドされた実行ファイルができてきます。
Excel に突っ込んでからフィルタかけたり Access に突っ込んでから SQL かけたりしなくていいので超快適。
PowerShell で JSON ファイルを連想配列にする
PowerShell で JSON ファイルを読み込んでごにょごにょするのに ConvertFrom-Json
を使っていますが、ConvertFrom-Json
で作成されるオブジェクトが PSCustomObject だったため(自分が)扱いやすい HashTable にとして変数に格納してみました。
JavaScriptSerializer
を使って Deserialize するといいみたいです。
$jsontext = Get-Content jsonfile.json -Encoding UTF8 $serializer = New-Object System.Web.Script.Serialization.JavaScriptSerializer $hashtable = $serializer.Deserialize($jsontext, [System.Collections.Hashtable])
とすると JSON のファイル内容が HashTable として変数 $hashtable に入りました。
若干面倒じゃのぅ…
追記
ConvertFrom-Json-To-Hashtable コマンド作ってみた。
コマンドの終了を通知(?)してくれるコマンド
1000個ある Excel のファイルを PDF に変換するとか結構時間かかるんだけど、それが終わったら別のコマンド実行したいとかたまにあるので、コマンドレットの後ろに付けて一連の実行終了を教えてくれるような PowerShell スクリプトです。
Push-Notification
を実行すると Invoke-RestMethod で Slack の Webhook を殴ってるだけです。
Slack 側の設定でスマホなりデスクトップ通知なりをやっておけばコマンドの終了を知ることができるはず。
PS> . .\Push-Notification.ps1 PS> Get-ChildItem -Recurse | Out-File ..\list.txt -Encoding utf8 | Push-Notification
あー、終了時刻を入れさせたけど Slack のタイムスタンプ見れば一目瞭然かー。
OpenStreetMap のノートデータを GeoJSON モドキに変換する
OpenStreetMap のノート機能によって残されたノートを取り出して解析しやすくできたらいいなと思ってデータを変換してみました。
まずノートのデータは Planet OSM の notes
から最新のデータをダウンロードして解凍。
データは次のような XML になっていました
<?xml version="1.0" encoding="UTF-8"?> <osm-notes> <note id="4" lat="36.7232991" lon="68.8641500" created_at="2013-04-24T08:07:02Z" closed_at="2013-04-24T08:08:51Z"> <comment action="opened" timestamp="2013-04-24T08:07:02Z" uid="1626" user="FredB">test</comment> <comment action="closed" timestamp="2013-04-24T08:08:51Z" uid="1626" user="FredB"></comment> </note> <note id="6" lat="35.5170066" lon="139.6322554" created_at="2013-04-24T08:12:38Z">
こんなんが約 205MB 分くらい書かれています。
最初は PowerShell でまじめに
PS> [xml](Get-Content planet-notes-latest.osn)
とかやろうとしたのですが、速攻でメモリが無くなったのであきらめました。
とりあえず今回ほしかったのは note
要素が持つ属性だけだったので、<note
がある行だけを抜き出して文字列として処理する PowerShell スクリプトを書きました。
取り出した要素を GeoJSON っぽいフォーマットで表示させます。この方法だと一気に全部読まずに逐次処理するのでそんなにメモリを食いませんでした。
一応、ソースを乗っけておきますが、ほかの人が見ると頭を抱えそうなひどいコードです。
PS> ConvertFrom-Osn-to-GeoJSONmodoki.ps1 %ファイル名% | Out-File notes.geojson -Encoding utf8
みたいな感じで使います。
出力された GeoJSON モドキは最後の3行が
}, ] }
となっているので、テキストエディタで
} ] }
となるようにカンマを消さないとエラーが出ます、油断大敵です。
出来上がった GeoJSON も世界中のデータが乗っているので、日本だけ切り出すために QGIS でクリップの処理か、日本のあたりだけ選択して選択されたオブジェクトだけを保存すると日本のデータだけが取り出せます。
XML を一気に読まないで逐次処理する方法探した方がいいだろうな…。
PowerShell から Twitter に投稿するだけのモジュールを作ってみた
今度は PowerShell との格闘中にツイートしたくなったので、 PowerShell のプロンプトからツイートする PowerShell モジュールを作ってみました。
インストール方法は Github に書いておきました。
スクリプトの実行を許可していないと使えないはずです。Set-ExecutionPolicy
の結果が RemoteSigned
などになっていない場合には管理者権限で PowerShell を実行して Set-ExecutionPolicy
を RemoteSigned
なりにしておいてください。
例によって CoreTweet を使って投稿するようになっています。
インストールスクリプトを実行して赤い文字が出てなければインストール成功なのでまずは Get-PspostOAuth
コマンドを使ってアクセストークンとかをセットする必要があります。
AccessToken と AccessTokenSecret は $($env:USERPROFILE)\Documents\WindowsPowerShell\Modules\PsPost
に setting.json という名前で保存されます。
Send-Text -Message "hoge"
でツイートすることができます。
PowerShell のプロンプトを再起動してコマンドが使えない場合は Import-Module -Name PsPost
して読み込んであげてください。
作成は Windows 7 Enterprise 64ビットで PowerShell は 4.0 を使用している環境です。
PowerShell で iTextSharp を使って PDF にテキストを追加する
番号管理している土地の図面に所有者の名前入れて名前でフォルダ分けしやがれという無茶振りを受け、PDF 化済の図面に所有者名を入れることになったので書いたスクリプトです。
名前でフォルダ分けするのは何回か PowerShell で行ったことはありますが、PDF に文字列を追加するのは初めてでした。
今回は PowerShell を使って iText で配布されている iTextSharp を読み込んで文字列を追加させています。
各種ファイルパスが B ドライブにあるのはただの RAM DISK なので気にしないでください。ついでに用紙サイズが B4 なのですが、伝統なので気にしたら負けです。
引っかかったところ
まず用紙サイズ。
iTextSharp.text.Rectangle
で作っている用紙サイズの数値はミリメートルではなく 28.35 px/cm を基準として必要な数字が取り出せました。PDF を Tiff で保存するときの一番低い解像度と同じ単位ですね。
最初はミリメートルを指定してエラい小さい図面になってしまいました。
次いで用紙の向き。
元の PDF は B4 横の図面なのですが、iTextSharp.text.pdf.PdfReader
で読み込むと B4 縦で配置されてしまいました。
そこで AddTemplate
を使って回転させたのですが、こいつの指定にも難儀しました。
回転行列と dx, dy っぽい値を入れたら回転してくれました。合ってるのかなこれ…。
$$ \begin{bmatrix} Cos \theta & - Sin \theta \\ Sin \theta & Cos \theta \end{bmatrix} $$
オレ達の戦いはこれからだ
これで1枚分は名前を入れられるので、番号と名前のデータベースを PowerShell で読み込んで振り分けるスクリプトを書かないとですね。
何枚もやって変な風に出てきたら泣くしかない。
PowerShell で緯度経度と平面直角座標を相互変換する API を利用する
前回のエントリに似た内容を PowerShell で作成しました。
国土地理院の測量計算サイトで公開されている API を PowerShell で使います。
PowerShell から API の一部である「緯度、経度から平面直角座標への換算」と「平面直角座標から緯度、経度への換算」を利用するスクリプトです。
API を利用するためには測量計算 API 利用規約に同意する必要がありますのでご注意ください。
こちらは受け取った情報を URL にしてサーバに送信し、受信した JSON を返す形です。
XML より扱いが簡単そうだったので JSON にしました。
Excel で書いていた分早く書けました。
というか大分短く書いても使えそうな感じだったので短いです。