2017年7月31日月曜日

続・ソースコード中の単語からの略語/スペルミス検出に挑戦

ブログズミ: ソースコード中の単語からの略語/スペルミス検出に挑戦」で紹介した略語チェッカーを大幅に更新したので、続報です。
ついでなので、Glosbe でリクエスト制限にかかってしまった場合の対処方法も紹介しておきます。

変更点
usage: abbreviation.py [-h] [-v] [-g FILE] [-w FILE] [-e EXCLUDE]
                       [-a ABBREVIATION] [--glosbe] [--dejizo] [--cache]
                       [--load-cache NAME] [--cache-dir DIR]
                       [--disable-keywords] [-x {c++,c#,objc,diff}]
                       [--list-all] [--progress] [--safe-mode]
                       [--encoding ENCODING] [--extension EXTENSION]
                       [--ignore-noexists] [--relpath] [--word WORD] [-]
                       [FILE/DIR [FILE/DIR ...]]

positional arguments:
  FILE/DIR              source code file/dir

optional arguments:
  -h, --help            show this help message and exit
  -v, --version         show program's version number and exit
  -g FILE, --gene FILE  exlude word
  -w FILE, --whitelist FILE
                        whitelist file
  -e EXCLUDE, --exclude EXCLUDE
                        exlude word
  -a ABBREVIATION, --abbreviation ABBREVIATION
                        abbreviation word
  --glosbe              use online translation service (glosbe)
  --dejizo              use online service (dejizo)
  --cache               online translation cache enable
  --load-cache NAME     load translation cache
  --cache-dir DIR       translation cache directory
  --disable-keywords    disable general and language keywords
  -x {c++,c#,objc,diff}, --language {c++,c#,objc,diff}
                        select language
  --list-all            list up all location
  --progress            print percent progress
  --safe-mode           api request limit safe mode(glosbe)
  --encoding ENCODING   set file encoding
  --extension EXTENSION
                        file extension matcher
  --ignore-noexists     ignore option file not exists
  --relpath             print relative path
  --word WORD           dircet check words
  -                     source code from stdin

diff ファイルに対応
便利になった機能の1つがこれだと思います。
diff ファイルから差分があったところだけをチェックするので、コードレビューのときに重宝します。
対応しているフォーマットは Unified format になります。

略語判定ロジックの大幅更新
「~の略語」だけでなく、「~の過去形」「~の複数形」なども検出して、辞書判定するように改善しました。主に、boost のヘッダーファイルをチェッカーに入力して、その結果を見ながら、期待に沿わないものに対応していった感じです。

ただ、ソースコード中で出てきた場合の一般的な意味と、辞書に載っている意味で剥離している場合もあります。
例えば、「apis」とあったら、「APIs」のことだとプログラマーは思うと思うのですが、辞書的には「蜂」です。
こういったものを機械的に振り分けるのは(今の自分の力量では)難しかったので、100% プログラマーが期待する結果になるわけではありませんので、ご注意!
ディープラーニングさせたらいいのかな?

ともあれ、boost を解析して自分なりに納得のいくところまで対応できたかなーと思ってます。

Glosbe でリクエスト制限にかかってしまった場合の対処方法
('Http error:', u'429 Client Error:  for url: https://glosbe.com/gapi/translate?dest=ja&phrase=opendir&from=en&pretty=true&format=json')
('request count: ', 802)
Please access the glosbe, click the search button and check reCAPTCHA.
Glosbe でリクエスト制限にかかると上記ログが出力されます。
これが出た場合、以下の方法で回復が可能です。

まずは、https://ja.glosbe.com/ にアクセスして、普通に辞書検索します。


以下のような画面になるので、チェックをクリアすると制限が解除されます。
(何回も制限かけられましたが、今のところこの方法ですぐに解除できています。)


最後に
このツールを実際に使ってみて、当初の目的の略語検出よりも typo 検出の方が役に立ちました。
実際にヒドイ typo が見つかりました…
https://github.com/srz-zumix/iutest/commit/c063225f5abfeb157f671e3fc55b779f32e12193

ただ、typo チェックであれば、「Pull Requestに潜むタイポを自動的に検出し、修正を代行するBot - Qiita」の方がよさそうだなーと思ったのと、PyEnchant ってのがあるほを初めて知ったので機会があれば使ってみようと思いました。

最後ですが、今回のアップデートで自己満足できるところまで作れたので、これで開発を一旦終了しようと思います。
(要望いただければ対応します)
ではでは。

2017年7月24日月曜日

[CI] Bitrise で紹介プログラムが始まってた

Extra minutes on hobby plan! | Bitrise


以前の紹介したBitriseブログズミ: [CI] Bitrise 始めました)で、"Referral program(紹介プログラム)"が始まりました。
このプログラムは紹介するごとに、ビルド時間の上限が +5 分され、最大 +20 分できるものです。
条件や方法については、後述します。

無料プランではビルド時間 10分 の制限がある
Bitrise Pricing

Bitrise の Hobby plan (無料プラン)では、1ビルド10分の制限があります。

10分制限は、他の CI サービスと比べると結構短いです。
参考(少し古いですが…):「ブログズミ: 無料で使える CI サービス比較」

iutest でも、この制限回避のために iOS と Android のテストジョブを別個に用意してます。
(やりようによっては制限時間内に収められるかもしれませんし、分ける利点もあったりしますが…)

Referral program で無料プランでのビルド時間が最大 30 分になる
今回のプログラムを利用することで、ビルド時間が最大 30 分まで増やせるようになりました
1人紹介するごとに +5 分で、4人紹介で最大の 30 分になります。
さらに、紹介人数が5人になると Bitrise Tシャツがもらえるっぽいですw



条件と方法
まず、方法ですが、
Account Settings に Referrals のタブがあるのでそこを開きます。
(今なら上のバーにもリンクがありますね)
開くと、紹介用URL が右上に書いてありますので、この URL からアクセスしてもらうのが第一条件です。

筆者の場合 https://www.bitrise.io?referrer=a9c0b9baf7536067 です。(よろしくお願いしますm(__)m)

そして、アカウント登録をしてもらうこと、
さらに、ジョブ(App)を追加して、ビルドがグリーンであること、
これらの条件をすべて満たすと、紹介したことになり、+5 分されます。

筆者はまだ 0 人なので、公式ブログをキャプチャした画像になりますが、
こんな感じで状態が表示されるようです。



最後に
Bitriseは、iOS/Android のアプリ開発では定番の CI になっているようですし、それらの開発をしている方は是非使ってみてください。
また、最近どこの CI でも見るようになってきた ワークフロー も、Bitrise では使えますので、試してみたい方も是非!
そして、私に Bitrise T-shirt をください!




今回は以上です。では!


2017年7月18日火曜日

[Jenkins] Pipeline Script からプラグイン機能を呼び出す

ブログズミ: [Jenkins] Groovy で IRC Plugin を使い倒す
以前、Groovy post build プラグインから IRC Plugin の機能を呼び出して、任意のメッセージを飛ばすことをやりましたが、これを Jenkinsfile に記述します。

やり方は単純
Jenkinsfile にそのまま書くだけです。

以前、Groovy Label Assignment plugin 向けに書いた groovy がこちら。
def jenkins = hudson.model.Hudson.instance
def irc_channel="#kiwiirc-iutest"
def p = jenkins.getPlugin("ircbot")
if( p == null ) {
  println("require IRC Plugin")
  return
}
def c = p.imPlugin.provider.currentConnection()
if( c == null ) {
  println("IRC connection not found. please set to IRC configuration")
  return
}
c.send(irc_channel, "label assignment")
return

これを、すこし汎用的にして Jenkins ファイルに追加します。

def send_irc(channel, message)
{
    def jenkins = hudson.model.Hudson.instance
    def p = jenkins.getPlugin("ircbot")
    if( p == null ) {
      println("require IRC Plugin")
      return
    }
    def c = p.imPlugin.provider.currentConnection()
    if( c == null ) {
      println("IRC connection not found. please set to IRC configuration")
      return
    }
    c.send(channel, message)
    return
}

で、あとはお好きなタイミングで呼び出すだけです。
stage('irc-send') {
        send_irc('#TEST', 'ビルドに成功したよ!')
    }


簡単ですね^^

2017年7月10日月曜日

[C++] override すべき関数の名前 typo に気づける idiom

Google Test でテストのセットアップを定義する場合は、SetUp 関数をオーバーライドするのですが、これを Setup と間違えてしまう人が多いようです。
ただ、Google Test ではこの間違いにコンパイル時に気付けるようになってます。
その部分のコードがこちら

private:
  struct Setup_should_be_spelled_SetUp {};
  virtual Setup_should_be_spelled_SetUp* Setup() { return NULL; }

override つけたらいいやんって話ですが、まぁ…つけない人もいるわけで…
そんな人でもすぐに間違いに気付けるのがこのイディオムです。

サンプルコード:
class A
{
public:
    virtual void SetUp() {}
private:
  struct Setup_should_be_spelled_SetUp {};
  virtual Setup_should_be_spelled_SetUp* Setup() { return 0; }
};

class Override : public A
{
public:
    void Setup() override {}
    void setup() override {}
};

class NoOverride : public A
{
public:
    void Setup() {}
    void setup() {}
};


int main()
{
    return 0;
}
[Wandbox]三へ( へ՞ਊ ՞)へ ハッハッ https://wandbox.org/permlink/jEs6OQf0t8tCkgzf



override 付けた方は当然 Setup も setup もコンパイルエラーになります。
一方、override 付けなかった方も Setup がコンパイルエラーになっています


いやー賢いですね。勉強になりました。

2017年7月3日月曜日

bat ファイルの実行時間を PowerShell で計測する

ググればいっぱい情報出てきますが、個人用備忘録として残しておく。
Windows PowerShell の機能
powershell -C "(Measure-Command { .\HogeHoge.bat | Out-Default }).TotalSeconds"

メモ:
* 秒だけ欲しいので .TotalSeconds
* ミリ秒で欲しいときは .TotalMilliseconds
* .\ をつけないと不明なコマンドになる
* 標準出力が欲しい場合は " | Out-Default" をつける
* 標準エラーはコマンドだけで出る