White Box技術部

WEB開発のあれこれ(と何か)

【自作ツール紹介】 Twitterのユーザ名からイベント参加情報を抽出するツール「Circle Checker」

なぜ余裕を持って行わないのか・・・

原稿に追われていようといまいと、不精な性格が災いして、 イベント直前にならないとサークルチェックをしない私のような人に「余裕を持って行え」とか言っても無駄なので、 プログラマらしくプログラムで解決を図ってみました。

Circle Checker

イベントにサークル参加する方は、Twitterアカウントの名前に直前の参加イベントの情報を追加している事が多いので、 その情報を元にしたサークルチェックのツールを作りました。

使い方

まず、Javaをお使いのPCにインストールしてください。
READMEにはJava SEと記載していますが、Java REでも構いません。

今のインストーラなら環境変数への設定も自動で行われたような気がするので、 インストール後、WindowsならコマンドプロンプトMacならターミナルを起動し、 java -versionを入力し、実行した結果が正常に返ってくること(バージョンが1.8以上になっていること)が確認できたら大丈夫です。
(以降、コマンドプロントとターミナルのことをコンソールと表記します)

ツール準備

releasesからcircle-checker-X.X.X.zipのようなファイルを取得し、適当な場所に展開してください。
(コンソールを利用する関係上、日本語ディレクトリ配下ではない方が都合がいいです)

展開したディレクトリの中にある以下の設定ファイルを、条件に合うように修正してください。

  • config/config.txtcc.target.list = ""の"“の中にチェックするリスト名を入力
  • config/filter.txtにユーザ名に含まれる可能性のあるイベント名を列挙(デフォルトはコミティア用)

filter.txtは上から順番にパターンマッチを行うので、長い文字列は最初に持ってくるのをお奨めします。

また、上記ファイルの文字コードUTF-8である必要があります。
Windowsのメモ帳などでは文字化けする可能性があるので、sakura editorなど文字コード指定ができるエディタをご利用ください。

ここまでの準備ができたら、コンソールからcircle-checker-X.X.X.jarがある場所まで移動し、以下のコマンドを実行してください。 (X.X.Xはそのときのjarファイルのバージョン番号であると仮定します)

java -jar circle-checker-X.X.X.jar

リストのサイズによっては少し待ちますが、後は出力結果を元にサークルチェックするだけです!

ちなみに2013年のMacBook Proで1000くらいのユーザが登録されているリストを対象にして実行したところ、結果出力までに体感で4、5秒くらいかかりました。

似たようなツールあるけど何で作ったの?

ここまで説明しておいて何ですが、似たようなツールならWebで使えるものが検索するといくつがヒットします。

じゃあなぜ作ったのかというと、単純に自分の利用用途に合わなかったからです。
そして、その利用用途を叶えるため、このツールは以下の特徴を持っています。

Circle Checkerの特徴

  • リスト対象にチェックができる
  • チェックするリストを指定できる
  • フィルタの条件を自分で変えられる(マイナーなイベントでも対応できる)
  • 自分が動かしたいときに動かせる(アプリのWebサーバが止まっているという心配がない)

Webアプリではないので、スマホで処理したい!出先でチェックしたい!というような要望は叶えられませんが、 リストを使ってサークル管理していたり、自分でフィルタ条件をいじりたい人には使えるものになっているのではないかと思います。

また、他アプリによっては、サークルスペースも抜き出してくれるものがありますが、 サークル配置図にマッピングするための情報は「Twitter Name」に出ているので、今のところ追加する予定はありません。

ここのメンテでサークルチェックができなくなったら本末転倒なので。

雑記

前から作りたいなーと思っていたツールだったのですが、不精がすんなり作るわけもなく結局作らないでいたものの一つでした。

それをコミティアを当日に控えた深夜3時、

reinsのコード参考にしたら1時間でいけるんじゃ?!
そしたらTwitterとカタログ見るより早いな!!

と深夜テンションで始め、結局4時間くらいかけて終わらせ、

カタログ見た方が早かったのでは・・・

と思ったりもしてしまいましたが、それはさておき。

こんな理由で作ったものなので、要件を満たしたものがあっても既存のアプリは元々使わなかったんでしょうね。

後は、コードが公開されていないのをどこまで信じれるかというプログラマ故の面倒くさいところと、 単純にコーディングしたかったという理由もありますが。

実際に使ってみたところ、結果に出てくるTwitterアカウントへのリンクが便利でした。
iPhoneのメモに結果を貼っておいたら、URLをタップするとTwitterアカウントの表示ができたので、 電車の中でサークルチェックができました。

それで思いましたけど、お品書きが固定ツイートになっていると、すごく助かりましたね・・・

お陰でコミティアでは良い感じにお札が溶けたことを併記しておきます。

GradleプロジェクトのSpockのテストをCircleCIで実行してJaCoCoでカバレッジを取りつつCoverallsで表示する

ちょっと思い立ってJavaでコードを書いていて、 さらに思い立ってカバレッジのバッジをREADMEに付けようとしたら、 思いの外ハマったので「GradleプロジェクトのSpockのテストをCircleCIで実行してJaCoCoでカバレッジを取りつつCoverallsで表示する」ための手順を残しておきます。

やりたいこと

  • GradleプロジェクトのREADMEにCircleCICoverallsのバッジを表示したい
  • JavaコードのテストをSpockで書きたい
  • JavaコードのカバレッジJaCoCoで集計したい
  • GitHub/CIrcleCI/Coverallsの結果をSlackに通知する(ブログでは言及しない)

つまりこういう感じのことをしたいわけです。

f:id:seri_wb:20170320005901p:plain

ではやっていきます。


build.gradleにJaCoCoとCoverallsの設定を追加

Spockでテストを書くJavaのGradleプロジェクトは以下のコマンドで作成していました。

$ gradle init --type java-library --test-framework spock

このプロジェクトでCoverallsを使うため、以下のGradleプラグインを導入します。

build.gradleにpluginsとjacocoTestReportを追加すると使えるようになります。

plugins {
    id 'jacoco'
    id 'com.github.kt3k.coveralls' version '2.8.1'
}

apply plugin: 'java-library'
apply plugin: 'groovy'

省略

jacocoTestReport {
    reports {
        xml.enabled true // coveralls plugin depends on xml format report
        html.enabled true
        html.destination "${buildDir}/jacocoHtml"
    }
}

Coverallsで観るだけならhtml関連の設定は不要なのですが、ローカルでテストしたときにもカバレッジ結果を見たかったので入れてます。
The JaCoCo Plugin - Gradle User Guide Version 3.5

※実際に適用した場合はこのようになります。

CircleCIでテストする

CircleCIでテストを動作させるためには、まずCircleCIにアカウントを作成して、メニューのPROJECTSからテストしたいプロジェクトをBuild projectにします。

その前後でテスト対象のプロジェクトにcircle.ymlファイルを作成して、GitHubにプッシュします。
例えば、Javaのプロジェクトをテストするcircle.ymlの内容は、以下のようになります。

machine:
  timezone: Asia/Tokyo
  java:
    version: oraclejdk8

test: 
  override:
    - ./gradlew test jacocoTestReport coveralls

ここが失敗ポイントだった

作業していたときに上手くいかなかった原因を話してしまうと、ここで実行しているgradlewのコマンドを coveralls-gradle-pluginのREADMEに書いてある通り./gradlew jacocoTestReport coverallsとしていたためでした。

というのも、testを書いていないとtestタスクがSKIPされ、結果カバレッジも取得されないという状態になっていたようです。

つまり以下のような一文をbuild.gradleに足して、jacocoTestReportタスクがtestタスクに依存することを示しておけば、 testを書き忘れてもちゃんとカバレッジが取れるようになります。

jacocoTestReport.dependsOn test

CircleCIとCoverallsを連携させる

CircleCIでカバレッジが取れるようになったら、次はCoverallsの設定をします。

CircleCIと同様に、Coverallsもアカウントを作成し、メニューのADD REPOから対象のプロジェクトをONにします。
その後、SETTINGSの画面に表示されるREPO TOKENの値をメモします。

次はCircleCIの方に移り、プロジェクトの設定メニューからBUILD SETTINGSのEnvironment Variablesを選択し、以下の変数を追加します。

  • COVERALLS_REPO_TOKEN : CoverallsのREPO TOKENの値

この設定まで終わった状態で、CircleCIでビルドを行うと、Coverallsの方にカバレッジの結果が表示されるようになります。

READMEにバッジを表示

最後にREADME.mdにCircleCIとCoverallsのバッジを表示させます。

CircleCI、Coveralls共に、バッジをREADMEに表示するためのテキストを生成してくれています。
それぞれコピーして、対象プロジェクトのREADME.mdに貼り付ければバッジの表示は完了です。

CircleCI

f:id:seri_wb:20170320035858p:plain

CircleCIでのビルド状態を示すバッチは、以下の2通りで表示することができます。

CircleCIhttps://circleci.com/gh/seriwb/utsusemi.svg?style=svg

CircleCIhttps://circleci.com/gh/seriwb/utsusemi.svg?style=shiled

Coveralls

f:id:seri_wb:20170320040009p:plain

感想:結構大変だった

READMEに表示されているバッジの仕組みについて、気にはなっていましたが、今までスルーしていたので、その知識が補えて良かったです。 今回は結構苦戦してしまいましたが、わかっていれば10分もあれば終わりそうでした。(今回は4時間ぐらいかけたんですけど。。)

ともあれ、これでいつでもどこからでもテストとカバレッジの状態が見えるようになったので、 後は頑張ってコードを書いていこうと思います。

新年の挨拶と、reviewetのバージョンアップ連絡

新年あけましておめでとうございます

2日に、幼少の頃以来の初詣に行ってきました。

f:id:seri_wb:20170106014440j:plain

それもずっと行きたかった神田明神へ参拝することができたので、今年は幸先がいい感じがします。 IT情報安全祈願のお守りも購入できたので、後は頑張ってシステム作りに励みたいです。

甘酒が美味しかったです。

その過程で学んだことなどは、今年もブログに記載していこうと思いますので、 今年もご愛読よろしくお願いします。

Reviewetのバージョン1.2.0をリリースしました

アプリのレビュー取得ツール『Reviewet』の最新版をリリースしました。

今回の改修で、iOS/Android共に、複数のアプリをレビューの取得対象にすることができるようになりました。

複数アプリの指定方法

config/default.ymlのappIdの各変数(iOS/android)に、ハイフンを使ったリスト形式で必要な分だけIDを追加してください。
iOS/Android共に2つずつ指定する場合は、以下のようになります。

appId:
  iOS:
    - 490217893
    - 544007664
  android:
    - com.google.android.googlequicksearchbox
    - com.apple.android.music

もちろん1つだけの場合は、今まで通りiOS: 490217893のような書き方で動作します。

これで、作成している全アプリやライバルアプリなどをまとめて通知することができると思いますので、 ぜひ利用してみてください。

オプションの変更

iOSのみで使えた、日付指定でレビューの取得範囲を限定するcheckDateは削除しました。

そして、新たに初回起動時の通知件数を制限できるオプションのoutputsを追加しました。
利用する場合は、まずfirstTimeIgnoreの値をfalseにし、 この設定値に通知したい回数の数値を指定してください。
例えば、各アプリ3件通知したい場合は、以下のようになります。

firstTimeIgnore: false
outputs: 3

これは初回のみの動作確認用オプションなので、最新のレビューだけ通知されればいい場合は、気にする必要はありません。

バージョンアップ時の注意

今回、内部DBの構造を変えているため、以前のバージョンからアップグレードした場合は、 必ずreviewetのルートディレクトリ直下にあるreviewet.sqliteを削除してから起動してください。

今後の話

いったん、細かい動作を気にしなければ作成当初の要求を満たせるようになったので、 reviewetの開発は一段落させる予定です。あとは多言語対応するくらいなので。

というわけで、次はディスプレイの一部をクローンして表示するツールを作る予定です。 これもあると便利なものになるかと思うので、リリースの際はぜひ利用してみてください。

Twitter画像取得ツール「reins」の0.3版をリリースしました

seri.hatenablog.com

前回の紹介からほぼ2年ぶりですが、Twitterからいい感じに画像を取得するツールのreinsの最新版をリリースしました!

reins 0.3

今回、以下の機能追加・バグ修正を行っています。

  • リツイートの取得に関する動作変更の選択機能の追加
  • reinsで取得した画像の元ツイートを表示する機能の追加(コマンド入力機能)
  • Twitterの画像ファイルはlargeを指定して取得するように変更
  • 複数画像があるツイートから先頭の画像しか取れていなかったのを修正

リツイートがつぶやいたユーザのディレクトリ配下に!

リツイートもリストのユーザと同列に保存していたら、正直管理しきれないほどディレクトリが増えてしまったので、 リツイートリツイートしたユーザのディレクトリ配下にrtディレクトリを作成して、その配下に保存するようにしました。

同一ユーザの同一画像を複数保存する可能性が上がりましたが、視認性はよくなったかと思います。

またオプション設定により、そもそもリツイートを取得しないこともできるようにしました。

コマンド入力機能を追加!

reinsを起動しているコンソール(コマンドプロンプト)からのコマンド入力を受け付けるようにしました。

今回は、reinsで取得した画像の元ツイートを表示する「url」コマンドが実装されています。

url -o reinsで取得した画像ファイル名

このようにコマンド入力すると画像ファイルがつぶやかれたツイートを(これはオプションがついているのでブラウザで)表示します(URLを取得するだけなら-oはなくてもOK)。

ログが流れていても認識するので、気にせず入力してください。

注意

画像の元ツイート表示は、今回のバージョンのreinsを使って取得した画像からしか利用できません。 また、dbディレクトリのデータを削除しても同様に利用できなくなります。

所感

画像がつぶやかれた元のツイートの表示機能が楽しいです。

画像元のツイート表示機能は作りたかった機能なので実現できて嬉しいです。

実装のあれこれ

まず2年近くも触ってないと、自分で書いたコードですらなにがなんだかわかりませんね。。
処理と設計方針を思い出すので数日かかりました。

なので今回はドキュメントも並行して作成しています。ドキュメント大事。

それと今回、ツイート表示機能を実装するにあたり、一度テーブル設計を見直したのですが、 結局元のテーブルに追加する感じで機能追加してあります。 リストをベースにした設計になっているので、個別ユーザの情報にアクセスするのがなかなかに大変です。

今後のあれこれ

リツイート毎に同じユーザの情報があったりするので、ここらへんをいい感じに一覧化できるといいかなと思っていたりします。 リスト毎に保存するという現在の作り上だと、どうも難しそうではあるんですが、GUI化でなんとかできないかなと模索中です。

GUI化は別プログラムからreinsを呼び出す感じで実現しようかと思っています。 ここらへんも、どうGUIで表示するとか諸々まとまっていないので、まだなんとも言えないのですが、ユーザ名での検索ができるだけでも結構いいかなと思ったりしています。今回作ったコマンド入力機能を拡張しながらやっていく予定です。

あとは1週間くらい放置しているとTwitterからデータ取得する方のThreadが落ちちゃってるのを直したいのですけれど、 現状のSleep処理から見直さないとダメかもしれないので、結構根が深いです。 バージョン1のリリースまでにはなんとかしたいですが、そろそろTwitterの存続も怪しいのでどうですかね、間に合うかな?