ラベル 未解決 の投稿を表示しています。 すべての投稿を表示
ラベル 未解決 の投稿を表示しています。 すべての投稿を表示

2020年12月22日火曜日

[C++] Clang ではオーバーロードされた private 関数に明示的な実体化時のアクセスができない?

※この記事は C++ Advent Calendar 2020 22日目の記事です。

はじめに

過去に本ブログでも紹介した template の明示的実体化時に private メンバーアクセス可能な仕様を利用した private メンバー変数・関数へのアクセスですが、最近それを使っていて clang だけとある条件でアクセスできないことに気づきました。

この挙動が仕様として正しいのか正しくないのかは筆者ではわからないので、実挙動ベースの話になってしまいますことをご了承ください。

過去の記事

ブログズミ: [C++] Private な関数のテスト
ブログズミ: [C++] 本当に private なところ

サンプルコード

こちらは iutest の private メンバーのテストのための機能を使ったサンプルです。
Wandbox 用に圧縮したソースコードを使ってますので、実装を確認したい場合はこちらを御覧ください。
https://github.com/srz-zumix/iutest/blob/master/include/iutest_prod.hpp#L62

#define IUTEST_USE_MAIN
#include "iutest.hpp"

class A
{
public:
    int GetX(void) { return m_x; }
private:
    int m_x;
};

IUTEST_MAKE_PEEP(int A::*, A, m_x);

IUTEST(Peep, Test1)
{
    A a;
    IUTEST_PEEP_GET(a, A, m_x) = 42;
    IUTEST_EXPECT_EQ(42, a.GetX());
    IUTEST_EXPECT_EQ(42, IUTEST_PEEP_GET(a, A, m_x));
}

IUTEST(Peep, Test2)
{
    A a;
    IUTEST_PEEP(A, m_x) x(&a);
    x = 54;
    IUTEST_EXPECT_EQ(54, a.GetX());
    x += x;
    IUTEST_EXPECT_EQ(108, a.GetX());
    IUTEST_EXPECT_EQ(108, x);
}

[Wandbox]三へ( へ՞ਊ ՞)へ ハッハッ
https://wandbox.org/permlink/2ZPvpUz1zDe1KHHs

ポイントは IUTEST_MAKE_PEEP と IUTEST_PEEP_GET です。
IUTEST_MAKE_PEEP で private メンバーアクセスするための情報をセットアップし、IUTEST_PEEP_GET で実インスタンスの private メンバーへの R/W を実現しています。

問題のコード
class Hoge
{
    int x;
public:
    Hoge() : x(42) {}
private:
    int GetX() { return x; }
    
private:
    int gX() { return x; }
    int gX() const { return x; }
    int gX(int) { return x; }
};


IUTEST_MAKE_PEEP(int (Hoge::*)(), Hoge, GetX);
IUTEST_MAKE_PEEP(int (Hoge::*)(), Hoge, gX);

int main()
{
    Hoge hoge;
    std::cout << IUTEST_PEEP_GET(hoge, Hoge, GetX)() << std::endl;
    std::cout << IUTEST_PEEP_GET(hoge, Hoge, gX)() << std::endl;
}

Clang の場合はエラー
https://wandbox.org/permlink/roGkNKKwsnaLX7og 
GCC の場合は OK
https://wandbox.org/permlink/AWd5A19WWDznccfq

エラーとなるのは gX 関数の PEEP で、オーバーロードされた関数があるとダメなようです。
Visual Studio はバージョンによって static メンバー関数がダメだったりするのは認識してましたが、 clang でもうまくいかないケースがあることがわかりました。

この挙動に関してなにか進展があったら、追記したいと思います。

では。


2020年11月26日木曜日

[C++] -Weverything で得たもの


こちらで紹介した C++ 警告のまとめプロジェクトの作成にあたって、自作テスティングフレームワークの iutest で clang のすべての警告を有効にするオプション「-Weverything」を使って得た知見をまとめます。

-Wdouble-promotion

double 型テストしてたつもりが float になってたのに気づきました。

-Wextra-semi

なぜか二重についてた ; セミコロンに気づきました。

-Wnonportable-system-include-path

Windows 系のヘッダーが全部小文字だったのを修正しました。

-Wshadow-all

マクロ内で使っていた変数名が b とか info とかかぶりやすい名前だったのを修正しました。

-Wdocumentation-unknown-command

こちらはワークアラウンドの紹介になりますが、 Clang は Doxygen のコメントに対しての警告がありますが、対応していない Doxygen コマンドが存在します。

Diagnostic flags in Clang — Clang 12 documentation

その場合、コンパイルオプションに -fcomment-block-commands=private,internal,retval のようにコマンドを教えてあげることができます。
ただし、引数のない private や internal コマンドは別の -Wdocumentation 警告がでるようになってしまいます。

../include/internal/iutest_time.hpp:47:13: error: empty paragraph passed to '@internal' command [-Werror,-Wdocumentation]
 * @internal
   ~~~~~~~~~^

こちらの回避方法はまだ見つけてないので、見つけたら追記します。

以上。


2020年11月10日火曜日

Travis CI の新プランについて

 The Travis CI Blog: The new pricing model for travis-ci.com

Travis CI の新しい料金プランが 2020/11/02 より始まり、あっという間にクレジットを使い切りました。


新しいプランでは 10,000 クレジットが毎月与えられ、それを消費するスタイルですが、圧倒的に足りない・・

こちら↑はブログからの抜粋ですが、マイニングとかに悪用されたのが理由のようです。
制限かかっても仕方がないな…とは思います。
が、今まで CI サービスの中でも制限ゆるい方だったのが、一気にキツめの部類になったので辛いですねぇ…
まぁ、今まで無料だからと気にせずマトリックス組んでましたが、このままではキツイので体制を見直すことにしました。(自作 C++ テスティングフレームワークの iutest で主に使ってて、複数パターンでテストしてました↑)
ただ、それでも 10,000 クレジットはあっという間になくなってしまうと予測されるので、サポートに OSS クレジットを申請してみました。

結果が来たら追記したいと思います。

Travis CI のかわりにオススメの CI サービスは?
さて、これを機に Travis CI から引っ越しする方も多いと思います。
GitHub Actions に移る方が多そうですが、別のサービスもオススメしておきます。

  • CircleCI
    まぁこれは知ってる人も使ってる人も多いと思うので、こっちに移る人も多いかも。
    OSS プランであれば 400,000 クレジット使えます。
    iutest の 2020/10 月の利用結果はこちら。まだ余裕あり
  • Drone.io
    Drone (Cloud)は OSS であれば完全フリーで使えます。
    並列数とか制限ありません(ただし、リソースは限られてる)
    iutest では gcc/clang の各バージョンでのテストをしています。
  • Azure Pipelines
    GitHub Actions よりは少ない 10 並列ですが、それでも強力な CI サービスです。
    GitHub Actions は(まだ)YAML のアンカー・エイリアスに対応していないので、独自のテンプレート構文が使える Azure Pipelines のほうが、マトリックスは組みやすいと思います。
    Travis CI でマトリックス組んでた人にはオススメです。
  • その他
    iutest では他にもたくさんの CI サービスを利用しているのでよければ参考にしてください。
最後に
DockerHub の pull rate limit の対応をしてたんですが、これまたインパクトのデカイ変更でした。。。このような CI サービスの悪用は他のサービスでも起こりそうな気がしてますが。。。今後の CI as a Service はどうなっていくんでしょうね。。。

2020年10月12日月曜日

OpenSTF を Windows の Docker 上で動かす

CEDEC での講演もあって OpenSTF を使い始めた人も多いようなのでメモ。



講演でもお話ありましたが、 OpenSTF は DeviceFarmer に変わったそうですね。 (DeviceFarm と似てて検索とかしづらそう) 

OpenSTF のセットアップについては以下の記事が参考になります。

筆者もネットの情報を参考に立ち上げました。

OpenSTF 便利
OpenSTF はリモート操作のためのツールの印象が強いですが、開発者がローカルで実機確認するときにも便利です。
なぜなら、わざわざ端末を操作して社内システムにログインするためのユーザーID/パスワードの入力が必要なかったり、スクリーンショットも簡単に PC 側で取れちゃうからです。

Docker の勉強がてらローカル環境に立ててみることをオススメします。

docker-compose.yml と起動手順
使っている docker-compose.yml がこちら。コメントに手順も書いてます。


メモ
Windows でボリュームマウント
Windows だとホストマシンでマウントできる場所が限られてたりして面倒くさかったので、ホストマシンに DB の永続化をするのではなく、docker volume create したボリュームに永続化するようにしてます。(今はなんか Docker Desktop がいい感じにマウントできるようにする?って聞いてくれるので面倒くささ減ったみたいだけど)
端末が認識しない場合
adb サーバーが起動してないかも。
adb start-server をしてみてください。

端末を返却した際にインストールしたアプリをアンイストールしないようにする
デフォルト設定だと、OpenSTF で端末操作して返却するとその間の変更がクリーンナップされます。これはこれで便利なのですが、個人環境で利用する場合は不便にもなります。
クリーンナップしなくない場合は stf の起動オプションに  --no-cleanup を追加しましょう。
使ってみて困っていること・知りたいこと
たまに操作できない状態になる
USBの抜き差しで復旧したりするが、リモートワークな昨今、物理的な挿抜は難しい。
adb kill-server / start-server で復旧したりもする。
リモートで電源の通電操作が可能な機材(リブーター)が存在するので、それを使って AC 給電な USB-HUB の電源切断で、USB 挿抜をエミュレートできないかと思っている。(未検証)

ポートフォワーディング機能の使い方
端末上で実行しているアプリと特定ポートでお話できるかな?と思っているのだが、うまくいってない。機能を勘違いしているのかもしれないし、使い方・設定の問題かもしれない。

最後に
利用者が増えて知見が増えていくと嬉しいですね。
Airtest も便利なんでそっちも情報増えると嬉しい。(Android 10 になって minitouch 使えなくてツラミ)
以上。

2020年9月25日金曜日

[C++] 警告のコンパイラー対応表を作り始めました

 srz-zumix/awesome-cpp-warning: c++ warning correspondence table (Clang/GCC and Visual Studio)

マルチプラットフォームやってると、Visual Studio (VC++) と clang で警告の制御方法が異なるので面倒くさいなーって思っていたので対応表を作りました。
(全部 clang にしたら楽なんですけどね・・・)



特に vc++ は C4096 とかの ID でコントロールするのでわかりにくいんですよね。
あとは当然、clang では警告になるけど、vc++ は警告ないとか。逆パターンとか、clang だとエラーとか、あるあるだと思います。
そんなマルチプラットフォーム開発のビルドエンジニア向けにまとめた(まとめている)ものが↑↑です。

とりあえず、VC++ の警告を一通りみてサンプルコードがあるものや、すぐに再現できたものに対してはこちらの表に記載してます。
https://github.com/srz-zumix/awesome-cpp-warning/blob/master/VCLIST.md



そして、おそらくみんなが欲しいのは clang/gcc の -Whogehoge 警告が vc++ だと ID いくつなのかって点だと思うので top にまとめてます。
(すべての警告を無視(よくないけど)したり、すべての警告を as error として直さなければならない環境ならあまり必要ないかも?)


今後も対応表を増やしていこうと思ってます。
もちろん PR 大歓迎です!!

今回は以上。では。

2020年4月23日木曜日

[Bitrise] GitHub Checks に表示されるようにする

公式ドキュメントがすごくわかりやすくまとまっているのでそちらを見ていただくだけで十分ではありますが、今回は Bitrise で GitHub Checks に結果を表示させる方法を紹介します。

セットアップ方法
Bitrise Checks App をインストールする
Bitrise Checks をインストールします。
「Install for free」ボタン押すと確認画面後、リポジトリの選択をして「Install」しましょう。
プロジェクト設定の GitHub Checks を有効にする
Bitrise のプロジェクトから「Settings」の「Enable GitHub Checks」にチェックを入れましょう。
これでセットアップは完了です。
結果
見やすくていいですね!
と、ここで気づいたのですが iutest では iOS/Android 両方のテストをするために 2 プロジェクト作ってるのですが、PR ステータスも Checks も 1 つしか表示されてませんね。。

もし解決方法見つかったらまた記事にしたいと思います。

今回は以上です。ではでは。

2019年9月17日火曜日

[Codefresh] Free Plan の内容がよくわからない・・

トップページの Pricing には Unlimited build / 1 small resource となっているが、
自分の今の Plan を見ると Free Plan ではあるが、120 build/month でマシンリソースはおそらく Medium resource になっている。

Doc:


My Plan:



120 build/month の制限は正直きついが、Samll resource になるのもきつい・・・

どっちがいいかってのはないのだが、正しい状態なのかよくわからないので正解が欲しい。
それに合わせて、パイプライン調整するので・・・

2019年5月13日月曜日

[C++] g++ 9.1.0 で variant が valueless_by_exception にならないケースに遭遇した

iutest の開発をしていたら、variant が valueless になったときのテストが失敗するようになった。


テストコードはこれ。
valueless_by_exception と出力されるのを期待しているが、実際には 0.2 という空になる前の値を出力している。

{
    PrintToLogChecker ck("valueless_by_exception");
    ::std::variant<int, ::std::string, float> v = 0.2f;
    try
    {
        struct S { operator int() { throw 42; } };
        v.emplace<0>(S());
    }
    catch(...)
    {
    }
    IUTEST_SUCCEED() << ::iutest::PrintToString(v);
}

この valueless にするコードは、
https://ja.cppreference.com/w/cpp/utility/variant/valueless_by_exception からとってきたもので、今までは valueless になっていたのを確認している。

関連するコードをいじってはいないので、環境周りの違いだと思い確認したところ、g++ 9.1.0 では valueless にならないことを確認しました。
また、valueless な状態を作る方法を探していたら、
https://cpprefjp.github.io/reference/variant/variant/valueless_by_exception.html に AlwaysThrow でのサンプルがあったので、そちらを使って確認したところ g++ 9.1.0 でも valueless になりました。

(typo がひでぇ)



よって、テストコードとりあえず以下のように修正しました。
{
    PrintToLogChecker ck("valueless_by_exception");
    ::std::variant<int, float, AlwaysThrow> v = 0.2f;
    try
    {
        struct S { operator int() { throw 42; } };
        v.emplace<0>(S());
    }
    catch(...)
    {
        IUTEST_INFORM_TRUE(v.valueless_by_exception());
    }
    if( !v.valueless_by_exception() )
    {
        try
        {
            v = AlwaysThrow();
        }
        catch(...)
        {
           IUTEST_INFORM_TRUE(v.valueless_by_exception());
        }
    }
    IUTEST_SUCCEED() << ::iutest::PrintToString(v);
}

これはバグ?
cpprefjpcppreference.com も、サンプルのコメントを読むと、確実に valueless な状態にはなるとは限らないように読み取れるのだが、(規格的に)これはそういうもんなのだろうか?それとも g++ 9.1.0 のバグなのだろうか?

一旦ここまでで記事公開させていただきます。
続報あれば、追記していきますmm



2019年4月2日火曜日

Integromat で Gmail のメールを開いたときに文字化けする問題の回避方法

みなさんは RPA に何を使われてますか?最近はたくさんのツールが存在しますね。
RPA ツールというと個人的には IFTTT を代表に上げるのですが、RPA ツールで検索するとちょっと自分のイメージと違うツールがたくさん出てくるのでなにか「IFTTT や Zapier のようなサービスをまとめた」いい言葉があればなーと思っているこの頃です。


前置きはこのくらいにして、本題に入ります。
最近 Integromat をよく使っていたのですが、ついにフリープランを卒業しベーシックプラン($9/月)をはじめました。Zapier が年契約で $18.33/月 なので、安くて助かってます。
Integromat はフリープランでも複雑なシナリオが書けるので大変オススメなサービスです。




ただ、少し困ったことが起きました。
メールを受信したことをトリガーにその内容を通知するシナリオを書こうとしたところ、日本語が正しく読めなかったのです。


具体的な症状としては、iso-2022-jp エンコーディングなメールが読めません。utf-8 は大丈夫でした。
とはいえ、メール配信側にお願いして utf-8 にしてもらうという解決方法は難しそうです。

Zapier はどうなのかというと、iso-2022-jp のメールも問題なく読めます。


じゃ、Zapier にお願いしよう
Zapier はフリープランでも 5 Zap までなら無料で使えるので、Zapier でメールのトリガーだけお願いして、あとは Integromat でやる作戦です。

Zapier 側の設定は Gmail トリガーと Webhook アクションです。
とりあえず、payload には Subject と Body を入れました。


Integromat 側は Gmail トリガーをやめて、Webhook トリガーに変更。それ以降は Integromat の世界で好き勝手にいじれます。


これでなんとか作りたいシナリオができそうです。

最後に
Integromat に Feature Request を出したので、ユーザーの方はぜひ vote をお願いしますmm
https://www.integromat.com/en/requests/feature-requests/p/gmail-encoding-iso-2022-jp

(メールの日本語が読めないことがあります・・・だと正直、日本で布教しにくい・・・)

2019年1月15日火曜日

[Buddy] not enough disk space でエラーが出たのでキャッシュ削除をした話


Build failed: not enough disk space. The size of files generated by your build exceeds 5120 MB. Please run the execution with 'Clear cache' to free space in the filesystem or contact support@buddy.works to increase the size limit.
Action failed: see logs above for details

キャッシュクリアしたら回復しそうなので、方法を調べました。

マニュアル実行のオプション
調べるまでもなく、マニュアル実行するときのオプションがあるのを(たぶん) Buddy を使ってる人なら知っているでしょう。


しかし、これをやっても面白みがありませんし、できるならば手動実行ではなく、自動で勝手にいい感じにキャッシュクリアできたら一番です。
というわけで、検索してみました。
(Not Recommended ですし…)

コミットメッセージコマンドからクリアする
Buddy v1.5.1 Released - Buddy

だいぶ前のリリースノートですが、コミットメッセージに「--clear-cache」と入れると、キャッシュをクリアしてくれるようです。

How Use Commit Commands - Buddy
ドキュメントには一切書かれてませんが、試してみました。




結果は・・・


キャッシュクリアされてました!

でも、ビルドは失敗してる・・・

デフォルトでキャッシュクリアするように YAML に書く
iutest のパイプラインは as Code しているので、YAML で設定できないか調べてみました。
Yaml Schema - Buddy


auto_clear_cache Boolean Defines whether or not to automatically clear cache before running the pipeline .
YAML Schema を見てみると、auto_clear_cache を設定できるようだったので試してみました。




結果は・・・


キャッシュクリアされてました!

でも、ビルドは失敗してる・・・

結局マニュアル実行
なぜだ…という気持ちを投げ捨てて、結局マニュアル実行しました。。。





結果は・・・


成功した!?
なぜだ・・・

まとめ
ビルドの結果はともかく、
Buddy でキャッシュをクリアしてビルドする場合は、以下の3つの方法が取れます。

* コミットメッセージコマンド「--clear-cache」
* YAML の「auto_clear_cache: true」
* マニュアル実行時の「Clear cache before running」

もやっとしますが、今回は以上です。
では。

2018年11月14日水曜日

CI/CD Test Night #1/#2 に参加してきた

CI/CD Test Night #1
CI/CD Test Night #2


1日目は、補欠だったのですが当日繰り上がったので参加。
2日目は、当選してたので予定通り参加してきました。
(ブログ参加枠ではないのでテキトーに書きます)


(両日参加でパーカーもらえたようですが、Tシャツを着ていく必要があったようで、思いっきりネタTシャツで行ってしまいもらえなかった・・・)

感想
Bitrise の方が来日してくれたこともあって、Bitrise の話題が多かったです。
Bitrise は自分にとっては使っている CI サービスの1つくらいの認識で、モバイルに強いという印象がある程度でした。
特に自分ではその強みの恩恵を受けてはいないので(iOS/Androidアプリを作っているわけじゃないので)、LT を聞いててみんな使ってるんだなーという感想。あとは Circle CI も強いんだなという感想。


Bitrise をより深く使ってみた
公演でワークフローのヒントをいろいろもらったので、やってみました。

設定の diff と restore
ワークフローとかパイプラインとか作ってるときって、結構トライアンドエラーが多いので Restore できるのはありがたい。
他のサービスよりも diff が見やすいなーと思いました。


並行実行
ワークフローを直列に実行するのではなく、2つに枝分かれさせて並行実行させる方法のブログ記事が紹介されたので、試してみました。



方法としては、別のワークフローをキックするステップが用意されているので、それを入れ込むだけです。
上記ブログで紹介されているのは、「Bitrise Start Build」を使った方法です。
(Bitrise Start Build Step でも Trigger Bitrise workflow でも、どっちでも実現できたましたが、Start Build のほうは待ちができます。)
(Start Build の方は Personal Access Token が、Trigger workflow の方は Build Trigger Token が必要になります。)

やってみた結果としては、そもそも Free プランだと 1並列 だけなので、ビルドが詰まって無理でした。。。


異なるスタックのビルドを1つのワークフローで実行したい
並行実行はできたらいいなくらいだったので、Free プランでできないのは致し方ないですが、
iutest では、iOS / Android ビルドのために、Mac と Ubuntu のスタックをそれぞれ利用しています。
そのため、これまではプロジェクト自体を分けて対応していました。
ただ、1 push に 2 ビルド消費してしまうので、1つのワークフローで iOS / Android ビルドができないかなと思ってました。

ただ単純にワークフローをつないだときに、スタックの切り替えもしてくれると良かったんですが、そううまくはいかないものです。。。



(Hybrid スタック使えばいいんでしょうが、その前に Android ビルド環境を整えねば・・・)
Workflow ごとのバッジがほしい
バッジ集めが趣味なので、ワークフローごとのバッジがほしいなーと思ってます。
(ワークフローで iOS/Android を別途書くことが多いと思うのですが、それぞれでバッジを出したい)
(今は並列実行の件もあってプロジェクト自体を2つ作ってますが・・・そうすると両方の結果を加味したバッジ表示ができないので、それもまた困っているところ)


すでにできるのかもしれないですが、やり方がわからず。
情報あればコメントいただけると嬉しいです。

(ここでワークフロー選択ができるといいんですが。。。)

最後に
Jenkins 以外で CI メインの勉強会って、たぶん初めての参加だったのですが、楽しかったです。
やっぱり CI 面白いですわ。

あとは、Bitrise のワークフローを見直すイイ機会になりました。
今まではただ使ってるって感じだったので、もっと使い倒していこうと思います!
(とりあえず、この記事で書いた未解決な件はもう少し考える)

では。またどこかで。

2018年6月12日火曜日

iutest を CMake のパッケージ検索に対応させた

issue の方で提案頂いたので対応しました。
https://github.com/srz-zumix/iutest/issues/40
といっても、私はほとんど何もしてません。
issue に貼っていただいたテキストをコピペした程度です。(yumetodo san ありがとうございますm(__)m)


この記事はもう少し続きますが、今回は(も?)まとまりのない駄文ですので、はい。
きれいにまとまったときにちゃんと読んで頂ければ大丈夫です…








そもそも私、find_package を知りませんでした。
まずはそこからお勉強しました。

参考にしたところ
find_packageの動作 - Qiita
CMakeを使ってみた (7) find_packageとpkg_check_modulesによるライブラリ探索 - wagavulin's blog

依存パッケージを探してくれるもので、見つけたパッケージのインクルードパスとかライブラリパスとかが取れるみたいですね。
で、その探索に使われるのが、FindXXXX.cmake だったり、cmake/xxxx-config.cmake だったり、cmake/XXXXConfig.cmake だったりするわけですね。
(Find の方は非推奨?っぽいですが)
CMake のことにまた少し詳しくなった気がしました。




しかしながら、これを提供する側はどうするのがいいのか?というのがイマイチわからず。
とりあえず、ルートに cmake フォルダを掘って配置しましたが、これでいいのだろうか?
そもそも CMake でサンプル/テストビルドを作るのは用意して深めのディレクトリに置いてましたが、これもルート直下に CMakeLists.txt を置くのが普通なのかな?

圧倒的 CMake 力不足・・・
もうちょっと情報集めて整理したいですね・・・



ここまでお付き合い頂き、ありがとうございます。
なんだか申し訳ない気持ちでいっぱいですが、ここまでお付き合い頂いたついでに・・・
なにか参考になるページや情報をお持ちでしたら、コメント頂けると嬉しいです。

では。m(__)m

2018年4月25日水曜日

Windows シャットダウンがブロックされるのを防ぐ - DockerToolbox + Windows 10 (VirtualBox)

Windows 10 + Docker Toobox (VirtualBox) 環境を構築。
スタートアップからホスト起動するようにして、個人的に使ってるサービスを立ててるのですが、シャットダウンするときに VirtualBox Interface が "Has active connections." となって終了を阻害してたので、それを解決したときのメモ。

VBoxHeadlessTray をインストールして常駐させておく
参考:
Windows 7 終了時にdockerを自動終了させる。 - イノベートな非日常
VBoxHeadlessTray - Topten Software

2つ目のリンクから VBoxHeadlessTray をダウンロードして、インストール。
VBoxHeadlessTray が常駐するようになります。
これだけで解決!
簡単でした。
(インストール直後はダメでしたが、再起動後からは終了が阻害されることがなくなった)

また、VBoxHeadlessTray により起動時に VM が PowerUp されるようになったので、スタートアップで Docker を起動する必要もなくなりました。
Windows Update とかもあって、この辺あやふやです。すみません。
Tray が自動で PowerUp してくれてる感じがありますが、それだけだとシャットダウンがブロックされました。(VM が headless で起動してない?)
Docker Toolbox の Quick Start をスタートアップに入れてるとエラーが出るのですが、Tray からの起動で正常に立ち上がるっぽい。(タイミングが衝突?)
スタートアップ直後じゃなくて、数秒待ってみると大丈夫そうだったので、しばらくこれで・・・

他にやったこと
常駐させておくよりも設定でなんとかできたらと思っていたので、こちらを先に試していました。
VirtualBoxでホストのシャットダウンにゲストのバーチャルマシンも連動させる パソコン鳥のブログ/ウェブリブログ

VBoxManage で設定をしてあげれば良さそうだったので、マニュアル見ながら試してみたものの結果としてはうまくいきませんでした。
"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" setextradata default GUI/DefaultCloseAction savestate
"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" setextradata global GUI/DefaultCloseAction savestate
"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" setextradata default VBoxInternal2/Watchdog/APIMonitor/IsolationResponse shutdown

サービス化する
これを書いてて思ったのだが、サービス化するってのはどうだろうか?
VirtualBox をサービス化する情報はすぐに見つかったので、今度試してみたいと思います。


あとがき
この記事を書いて少し寝かせていたのですが、その間にたまーに Docker Host の起動状態がおかしくなって、Virtual Box Manager からシャットダウンして起動し直すということがありました。また、たまにシャットダウンがブロックされる症状が出ていたので、根本的な解決とはなってない感じ。。。
(この記事が公開されているということは、ネタ不足になったということだ。)


2018年1月15日月曜日

[Travis CI] Resource temporarily unavailable で失敗する問題の回避策

The Travis CI Blog: Trusty as default Linux is coming

Travis CI で Precise を使っていたのですが、EoL とのことなので Trusty に変更しました。
そしたらビルドが盛大に失敗しまくってテンヤワンヤ。。
だいたい解消できたので、その時の対応をブログに残しておきます。
wine を使うジョブが未だ対応中なのです。。一旦コメントアウト中)

Resource temporarily unavailable
一部は apt-get してくるパッケージが変わっていたなど、設定の問題だったのですが、残りのほとんどがログが途中で途切れて exit 1 してました。
その中の、一部のジョブで「Resource temporarily unavailable」が出て失敗してたので、これをヒントに解決(回避)しました、というお話。

以前のワーカーイメージを使う(失敗)
最初にこれを試しました。(結果は失敗です)

これを試したのは、検索したときにこちらの issue がヒットして、そこに最初に書いてあったため。
Large writes to stdout sometimes fail with "Resource temporarily unavailable". · Issue #4704 · travis-ci/travis-ci


方法としては、.travis.yml ファイルに以下の一行を追加するだけです。
group: deprecated-2017Q2


が、結果変わらず。


The Travis CI Blog: The new Ubuntu Trusty 14.04 images are now live!
ここを見たら、sudo: false じゃダメだし、2017/9/1 まで保存って書いてあるので、もう使えない workaround でした・・・

sudo: required にする(意味なし)
そもそも、sudo less にして sudo: false にしてたものの、Precise だと Docker コンテナがなく、sudo: required と同じワーカーで実行されてました。
というわけで、sudo: required にして試してみました。


が、これも結果変わらず


脱線しますが、コンテナが使えるようになってあらためて確認すると、起動が 20 秒超から数百ミリ秒になってました。速くていいですねぇ。
頑張って sudo less にした甲斐がありました。

stdout/stderr のノンブロッキングモードを外す
最初にみてた issue (Large writes to stdout sometimes fail with "Resource temporarily unavailable". · Issue #4704 · travis-ci/travis-ci) のさらに下のほうに、別の workaround があってそこを見ると標準出力(エラー)のノンブロッキングモードを外す方法がありました。

Travis has a new nasty trick: it puts stdout in nonblock mode! · SpiNNakerManchester/SupportScripts@1a4a4b8
こちらを参考に、同じようにブロッキングモードになるようにしてみました。


結果は成功

ログを見ると stderr がノンブロッキングモードになっていたみたいです。


これでほとんどの失敗が解決しました。
この記事が誰かの助けになれば幸いです。では。

2018年1月12日金曜日

新しく無料で使える CI サービスを探しています

Travis CI で wine を使ったテストが失敗するようになって解決するのに時間がかかりそうな予感がしたので、新しい環境(CI サービス)を探すことにしました。
(順番が前後しますが、Travis CI での失敗については来週のブログで話す予定でした)
目的は Travis CI でやっていた mingw + wine のテストを引っ越すことです。

で、自分は結構 CI サービスを使い尽くしているため、"新しいもの" となると割りと探すの大変そうだな~と思ってました。




ないかなーと思ってググっていたらすごくいいまとめがあったので、速攻でブログにしました。


27 Best hosted continuous integration services as of 2018 - Slant

ちょっとこれを参考に探しみようと思います。

2017年5月1日月曜日

[Docker] ENV にコマンドの結果を使えない問題の回避策

Dockerfile の ENV で環境変数を設定する際に、コマンドの実行結果を利用したいと思ったのですが、
現在それはできないようです。

ENV NACL_SDK_ROOT $(find /nacl_sdk -maxdepth 1 -type d -name 'pepper_*')

回避策として、以下のようにしました。

.bashrc に export を書く
RUN echo 'export NACL_SDK_ROOT="$(find /nacl_sdk -maxdepth 1 -type d -name 'pepper_*')"' >> ~/.bashrc

こちらであれば、bash を起動すると環境変数が設定されます。

.profile に export を書く
RUN echo 'export NACL_SDK_ROOT="$(find /nacl_sdk -maxdepth 1 -type d -name 'pepper_*')"' >> ~/.profile

この場合は、ログイン時に環境変数が設定されるので、
docker run hoge bash するときに -l オプションもつけます。
docker run -it hoge bash -l

2017年4月10日月曜日

[Docker] 始めてみたけど躓きまくってるので備忘録として残しておくよ

注意:有益な情報はありません
完全な個人用メモです。
それでも引っかかる情報はあるかもしれませんが、今すぐバックすることをおすすめします。
自分でも調べてて感じましたが、変化が激しいので古い情報はすでに当てはまらないことがあります。
検索ツールで期間を絞ったり、バージョンを絞ったりして調べることをおすすめします。

前提条件

* Windows + Docker Toolbock
* Windows 10

VBoxManage.exe: error: Failed to create the host-only adapter

Vagrantでのhost-only adapterのエラーを回避する方法 on Windows10 - OSSを触りながらつぶやく日記

Failed to open/create the internal network 'HostInterfaceNetworking-VirtualBox Host-Only Ethernet Adapter

VirtualBoxでHost-Only Ethernet Adapterが原因でVMが起動しない時 | ぅゎょぅι゛ょっょぃ

ssh
docker-machine ssh default


ホストの作成からやり直す
"Docker Quickstart Terminal" ショートカットを使った場合、既にホストが存在すれば作成をスキップします。
なので、設定とか変えてもう一度ホストを作成しなおしたい場合は、
docker-machine rm default
としてからショートカットを起動します。


コンテナの一括削除
docker rm `docker ps -a -q`

不要になったイメージ・コンテナの削除
docker image prune
docker container prune
docker system prune


server misbehaving.
$ docker run hello-world
time="2017-02-24T10:07:02+09:00" level=info msg="Unable to use system certificate pool: crypto/x509: system root pool is not available on Windows"
Unable to find image 'hello-world:latest' locally
C:\Program Files\Docker Toolbox\docker.exe: Error response from daemon: Get https://registry-1.docker.io/v2/: dial tcp: lookup registry-1.docker.io on 10.0.2.3:53: server misbehaving.
See 'C:\Program Files\Docker Toolbox\docker.exe run --help'.

/etc/resolv.conf に nameserver 8.8.8.8 を追加する

$ docker run hello-world
time="2017-02-24T10:18:53+09:00" level=info msg="Unable to use system certificate pool: crypto/x509: system root pool is not available on Windows"
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
78445dd45222: Pull complete
Digest: sha256:c5515758d4c5e1e838e9cd307f6c6a0d620b5e07e6f927b07d05f6d12a1ac8d7
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://cloud.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/engine/userguide/


Error response from daemon: Get https://registry-1.docker.io/v2/: Method Not Allowed
いろいろやってるうちに、こんなエラーがでるようになった。
素の host を作り直したら、server misbehaving. も含めてなぜか解決した…
解決した理由がよくわからない…

No space left on device
boo2docker だと、tmpfs がメモリにマウントされるらしいので virtualbox のメインメモリを増やしてあげます。
docker-machine create に --virtualbox-memory オプションを指定すればいいみたいです。
ショートカットから start.sh を実行している場合は、一度 default を削除して、start.sh の create コマンドを実行しているところに、--virtualbox-memory を指定します。
もしくは、default を stop して VirtualBox マネージャーから設定を変更すれば OK です。

TMP じゃなくて普通にディスクサイズが足らない場合は、--virtualbox-disk-size オプションを指定するか、同様にマネージャーで容量増やしてください。
※ start.sh で docker-machine create -d virtualbox default してるだけなので、一度削除してから --virtualbox-disk-size つけるのが楽そうでした。


docker run -v > Error response from daemon: invalid bind mount spec
ホストディレクトのパスは絶対パスなので、c:\ とか書くと上記エラーになる。
Windows のパス形式 (c:\hoge) だとダメなので、/c/hoge のように書く必要があります。

PowerShell (Windows) で Docker コンテナにホストディレクトリをデータボリュームとしてマウントする際に pwd 相当のことをしたい - ひだまりソケットは壊れない

※ docker cp のときは Windows 形式

ホストとコンテナ間でのファイルコピー

docker cp from to

コンテナのパスは コンテナ名:パス のように書く。
e.g.
docker cp aa237:/path/to/dir hoge

コンテナ名は docker ps で確認できる。
ハッシュにしたくない場合は、run するときに --name オプションを付けると良い。

docker run 時に環境変数を設定する
dockerのコンテナ実行時にLANGなどの環境変数を設定する方法 - Qiita
docker run -e HOGE=hoge

ストレージの保存場所を変更する
MACHINE_STORAGE_PATH 環境変数にパスを設定すれば OK

Looks like something went wrong... Looking for vboxmanage.exe
VBOX_MSI_INSTALL_PATH 環境変数がなくなってないか確認する。(VirtualBox を更新すると消える?)



SVN: can't convert string from 'utf-8' to native encoding
Docker ではなく svn co したときのエラーですが、日本語ファイル名が含まれていると発生します。

以下を Dockerfile に追記して対応しました。
参考:「オデの日記@WEB系: svnでどんなに頑張っても"can't convert string from 'utf-8' to native encoding"エラーが治らない

RUN localedef -f UTF-8 -i ja_JP ja_JP.utf8
ENV LC_CTYPE ja_JP.utf8


最後に
一応これで docker を使い始めることができるようになりました。
が、Dockerfile 書きながらイメージを作っていくと、あれが足りなかった、あれが間違っていたと、何回もやり直しして想像以上に構築に時間がかかってしまっています。
なにかうまいやり方がある気がするのですが、知識不足が非常にネックになっている状況ですね。
どこか勉強会とかに行ったり、聞いたりするのがいいのかもな~
ということで、雑にまとめましたが、ここで書きなぐりを一旦終えます。
以上。




2017年1月23日月曜日

[Jenkins] オフライン理由にリンクを貼れなくなって困っている

いつ頃からかわからないのですが、Jenkins のスレーブをオフラインにするときの理由にリンクを貼っても、テキストとして表示されるようになってしまってました。
この前の第7回大阪Jenkins勉強会で川口さんに直接聞いてみたら、OWASP Markup Formatter Plugin 入れたら出るはずと教えてもらったのですが、オフライン理由のところはやっぱりダメでした。
実は、OWASP ってデフォルトで入っていたような気がしていて、私の環境でも既にインストール済みでした。


試しに、 OWASP を無効にしてみたところ、ジョブの説明やビルドの説明のところはリンクが無効になったので、プラグインはこれであっていると思うのですが…

どなたか解決方法あればコメントくださいm(__)m

2016年3月14日月曜日

[AppVeyor] リモートデスクトップでアクセスしてみた

AppVeyor ではワーカーマシンにリモートデスクトップでログインできます。
Accessing build worker via Remote Desktop (RDP) - Appveyor

iutest の cygwin ビルドのテストが落ちていたのですが、ログだけでは原因がよくわからなかったのでリモートデスクトップでアクセスしてみました。

設定
Accessing build worker via Remote Desktop (RDP) - Appveyor
こちらの説明では、init と on_finish のタイミングで RDP を有効にする方法が説明されています。

ビルド開始直後から有効にする場合は、下記の PS スクリプトを init で実行するように設定をします。
iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1'))


ビルド終了後に有効にする場合は、下記の PS スクリプトを on_finish で実行するように設定をします。
$blockRdp = $true; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1'))

いずれの場合も時間制限があり、60分までとなっています。

ログインする
設定ができたら、ビルドを実行します。すると、
以下のようにコンソールログがでるので、そのアドレスとユーザー名、パスワードでリモートデスクトップ接続します。

init:

on_finish:



はい。できました。
これだけです。とっても簡単ですね。

日本語キーボード
リモートデスクトップでログインするとキーボードが英字配列として認識されて、やり辛かったです。
対処方法を色々試してみましたが、結果としては上手くいかず。
誰か教えて下さい~><

まとめ
AppVeyor は至れり尽くせり。
(テキトーまとめごめんなさい)