ひつじTips

技術系いろいろつまみ食います。

Docker Hub無課金勢(Personal Plan)でAutomated Buildが使えなくてもgithubからDockerイメージを自動でBuild & Pushしたい!

Docker Hubを見ていると,「Source Repository」にGithubリポジトリのリンクがあるものが多いです.

ということで,githubにあるDockerfileを自動ビルドしてDocker Hubに登録してくれる機能とかあるんだろうなと思って「github dockerhub 連携」とかでググると,みんなDocker Hubの「Automated Build」なるものを使っていることがわかります.

各記事見てると,まず「Docker Hubのアカウント設定からLinked Accountsを選んでGithubを連携させましょう」とか書いてるのですが,僕のDocker HubにはLinked Accountsなんてありません......🤔

よくよく公式ドキュメントを読むと,Automated BuildはDocker Hub課金勢(Pro, Teams, Business)のみの機能と書かれているではないですか...!😩😩

f:id:mu-777:20220108164506p:plain
Set up Automated Builds | Docker Documentation より


Docker Hubに課金してもよいのですが,一番安いProプランでも月5ドルという...

高くはないですが,エンジョイ趣味勢で月額課金はツラいです.ここは無課金で乗り切りたいところ.


前置きが長くなりましたが,こういうことで,Docker Hub無課金勢(Personal Plan)でもgithubからDockerイメージを自動でBuild & Pushする方法についてまとめます.

方針としては,Github Actionsを使ってCI/CD的に実施します.が,筆者はGithub Actionsを使うのは今回が初めて(お仕事はGitLab...)なので,問題あるかもですが責任は取りません.あくまでご参考にどうぞ(免責)

ほぼここに書かれてる内容になるので,分かる人はこちらを見てください.

docs.github.com

もしくは,今回使用するyamlファイルをご覧ください.

github.com

  • 前提
  • Docker Hubのアカウント情報をGithubに設定する
  • Github Actionsのワークフローの設定
  • GithubへPush(から,自動でDockerイメージのBuild & Push)
  • その他
    • Dockerイメージにlatestタグをつけたい!
      • 手順
    • GithubのReadmeをDocker Hub側にも表示させたい!
      • 手順
    • 複数CPUアーキテクチャ対応のイメージを自動ビルドしたい!
  • まとめ
続きを読む

ロボットの人工ポテンシャル法をざっくり解説する

下書きのまま約1年経ってしまいましたが......

「ロボットやろうぜ!- toio & Unity 作品動画コンテスト -」というのに,人工ポテンシャル法を使ってロボットを制御するシミュレーターアプリを作って出してました.

コンテストに出したアプリについての話はこちら: mu-777.hatenablog.com

人工ポテンシャル法は大学の学生実験か何かでやった記憶を掘り起こして実装したのですが,案外解説みたいな記事がネット上に見当たらなかったので,せっかくですし簡単にまとめてみたいなと思います.

ホントは学生実験のテキストが出てくればよかったのですが......今は手元にありません(たぶん実家のどこかに眠ってるはず)

ということで,上述の通り記憶を掘り起こして書くので間違いも含まれる可能性があります.というか,ちゃんと文献を参照して書いてはいません(面倒なので......).なので必ずしも正確性を保証するものではありません.ロボット制御ガチ勢からするとツッコミ祭りだと思います...... ご了承ください(免責)

こちらのtoioシミュレータを動かしつつ読むとわかりやすいかなぁと思います:

mu-777.github.io

  • 人工ポテンシャル法は何をするものか
  • 対象をゴールへ誘導するために
  • 仮想的な山/谷はどう表現するのか(数式編)
  • 仮想的な山/谷はどう表現するのか(実装編)
  • 実際にロボットを動かす
  • まとめ
  • 問題点
    • ローカルミニマムに簡単に落ちる
    • ポテンシャルの決め方
    • 速度制御になっている
  • さいごに
続きを読む

grpc(C++)をDockerで使う最小構成

f:id:mu-777:20211128044923p:plain
grpc x c++ x docker

grpcの環境をdocker内に作り,そのdockerの中でgrpcを使うC++プログラムをビルドし実行できるようにする方法についてまとめます.

「grpc c++ docker」で普通にググるとトップに出てくる以下の記事でもいいのですが,微妙に違う感じになったので書き残します.

zenn.dev

上記記事(2021年11月末時点)に対し本記事は:

  • Dockerfileの記述がちょっと少ない
  • サンプルのコードの記述がシンプル
    • 上記記事ではgrpcの双方向方式(Bidirectional streaming RPC)を使ってる(すごい!)が,こちらはそこまでやってない
  • クライアントもc++で書く
  • protoファイルのコンパイルをcmakeでやる

と,全体的に単純化してる感じですね.

本記事で挙げるコード類はこのレポジトリにありますのでご参考までに

github.com

  • 前置き
  • 環境の準備
  • protoの用意
  • サーバの実装
  • クライアントの実装
  • ビルドまわり
  • ビルド & 実行
続きを読む

Windows(WSL2)でDockerの開発環境+CLionでC++の開発を行う

f:id:mu-777:20210717165004p:plain

Windows(WSL2)でDockerコンテナを立ててその中に開発環境を構築し,JetBrainsのCLionというIDEC++プロジェクトの開発を行う方法をまとめます.
Windowsだけど,Linuxな開発環境で開発できるようになります.

まだ全然使い込めていないので不要なとこや足りないところありそうですが,まぁ自分用の忘備録ということで.

CLionのドキュメントはかなり豊富なので,結果的にはこのあたりをまとめた内容になります.

ここで使用しているサンプルプロジェクトは以下です.

github.com

  • 大まかなしくみ
  • 手順
    • 1. 開発対象のプロジェクトの作成
    • 2. 開発用Dockerイメージの用意
    • 3. 開発用Dockerコンテナの立ち上げ
    • 4. CLionの設定
    • 5. ビルド・実行
  • 確認
続きを読む

CLionのリモートモードでの開発で,ビルドは通るのにEditor上ではライブラリがnot foundになり,コード補完が効かない問題

CLionのフルリモートモード時に, ビルドは普通に通るにも関わらず,Editor上では以下のようにライブラリのパスが通っていないような状況になり, コード補完や定義の確認などが全くできなくなる問題が起きました.

f:id:mu-777:20210717155405p:plain

環境は,CLionが動いているホストはWindows,リモートはWSL上のDockerコンテナやサーバ(ubuntu)でこの問題を確認しました.

自分の環境では,以下で紹介する「解決方法2」の方で解決できました!

が,ちゃんとウラが取れたというわけでもないので,参考にするぐらいの感じでお願いしまっす🙏🙏

解決方法1

ちょっと古い情報ですが,CLionは言語周りの設定で問題があるそうです.

これらによると,CLion実行の際に$ LANG=en_US.UTF-8 /path/to/clion.sh$ LC_ALL=C /path/to/clion.shと,環境変数で言語周りの設定をしてやるとよいみたいです.

ただ,CLionをWindowsで実行している場合はどうやるのかはよくわかりませんでした......

とりあえず,CLionのexeがある場所(デフォだとC:\Users\<username>\AppData\Local\JetBrains\Toolbox\apps\CLion\ch-0\<version>\bin)にclion.batというのがあるので,その先頭にSET LANG=5参考)や,chcp 65001参考)などを入れて実行してみましたが,自分の環境では何も変化ありませんでした......

今回は自分の環境では解決方法にならなかったですが,念のため記載しておきます.

解決方法2

今回の自分の環境では,こちらにあるヘッダの検索パスの再Syncで解決できました!

www.jetbrains.com

具体的には,Ctrl + Shift + Aでアクション検索を出して,resyncで検索,出てきたResync with Remote Hosts を実行することで,ヘッダの検索パスの再Syncができます.

f:id:mu-777:20210717161156p:plain

再Syncを実行してしばらく待つと,iostreamに出ていた赤波線がなくなり,コード補完なども効くようになりました.

鴨川等間隔の法則(っぽいやつ)のアルゴリズム

鴨川等間隔の法則というのをご存知でしょうか?

f:id:mu-777:20210324161836p:plain

京都鴨川の河川敷に座るカップルは等間隔になる,というものです.詳しい中身は以下などがわかりやすいかな,と思います.

services.osakagas.co.jp

この記事からの引用ですが,

先生のお話では、「電車のシートでも同じことが起こります。まず端に人が座り、次に真ん中、その次は端と真ん中の間にできた空間の中央に座って、両サイドと同じ間隔があくようにする傾向があります。それが人間の習性なんです」とのこと。

は,日常的に感じられるかなと思います.

で,この鴨川等間隔の法則に従う場合,i番目の人が0から1の間の座るべき位置を返すアルゴリズム(というか関数)を実装してみたのがこの記事の内容になります.

kamogawa_algorithm
鴨川等間隔の法則(っぽいやつ)のアルゴリズム
(「いらすとや」さんの「マガモのイラスト」を使わせていただきました.感謝.)

実装

pythonで実装してます.

def kamogawa_algo(idx):
    binlen = lambda i: len(bin(i)) - 2
    if(binlen(idx)==1):
        return idx
    divnum = pow(2, binlen(idx-1))
    startnum = pow(2, binlen(idx-1)-1)
    return ((idx - startnum)*2-1)*(1.0/divnum)


上のカモさんのgifを作ってるコードはこちら:

kamogawa_algo.py · GitHub

# この,あいだあいだを取っていくような数列(?)って正式名称ありそうだけど何て言うのかな... 結局ググり力が足りず,見つけられなかった...

用途例

もともとは,トータルのN数がわからないが次々に色を振り分けたい,というケースで,i-1番目に振った色とできるだけ異なる色をi番目に振りたい,と思ったときに「鴨川等間隔の法則」的に振り分ければいいんじゃね,と思ったのがきっかけでした.

kamogawa_color
鴨川等間隔の法則を利用して色を振り分ける様子


この用途なら,適当に色を並べた配列 [青, 赤, 緑, 黄, ...] を用意しておいて,それを順繰りに割り当てる,みたいな方法で全然いいんですけど...... なんか芸がないなと思ってコレに至りました.

まぁでもIndex数が大きくなると,i-1番目の色とi番目の色が似てくるんですけどね......

実装のアイデア

そんなに詳しく書くほどのことではありませんが... 

下図のように書き出すと,2進数で表したIndexと出力の関係性が見えてくるかと思います.

idea
イデアの着想の図

ホントの鴨川等間隔の法則

たぶん,ホントの鴨川等間隔の法則は,新しいカップルが来たらそのタイミングでは等間隔が崩れるものの,段々とみんなが位置を調整して最終的に等間隔になる
というような時間方向に平衡を取っていくエントロピー的なものだと思ってます.

なんで,こちらの「鴨川カップルシミュレーション」の挙動の方が,ホントの鴨川等間隔の法則かと思います.

www.pitecan.com

(作者はまさかのインタラクション界隈では有名な増井先生でした...!)

なんで,この記事のようにきっちりと間を取っていくようなものは厳密には鴨川等間隔の法則ではなさそうなんですが...... まぁ細かい話はどうでもいいか🤪🤪

WSL2のDockerでjupyterのサーバを動かしpycharmで実行する


f:id:mu-777:20210320032933p:plain


普通にやるだけだけど忘備録.

なんかWSLローカルのjupyter周りの環境が壊れたみたいで,使えなくなっちった...
環境問題ツラいので,もうjupyterはdockerで動かしまっす.

やりかた

WSL2(ubuntu),Docker,pycharm(2020.3)はインストール済み,という前提です.

WSL2+dockerの環境作成は以下などを参考に

qiita.com

(WSL2のubuntuとかからdocker使えるの便利すぎるな)

1. docker立ち上げ

スタートアップになってなかったらお気をつけて..

普通にwindowsの「docker desktop」を実行して,タスクバーにくじらさんが出ればよいです.

2. docker imageのダウンロード

WSLで

$ docker pull jupyter/scipy-notebook

を実行して,みんな使ってるっぽい jupyter/scipy-notebook imageを取得します.

3. jupyter-serverの実行

WSLで

$ docker run -p 8888:8888 jupyter/scipy-notebook jupyter-server

を実行して,jupyterのサーバを上げます.

つらつらとstdoutが流れますが,

    To access the server, open this file in a browser:
        file:///home/jovyan/.local/share/jupyter/runtime/jpserver-8-open.html
    Or copy and paste one of these URLs:
        http://xxxxxxxxxxxxxx:8888/?token=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
     or http://127.0.0.1:8888/?token=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 

という感じのログが流れたらOK

4. pycharmの設定

pycharmを開き,ipynbファイルのある場所をOpen,ipynbファイルを開きます.

上に,「Managed Jupyter server...」などと書かれてる場所があるのでそこをクリック,すると「Configure Jupyter Server...」と出るのでそこをクリック

f:id:mu-777:20210320030403p:plain
jupyter serverの設定を開く


Settingsが出てくるので,「Configured Server」を選択し,横のテキストボックスにはdocker runしたあとに出力されたURL(ここでは http://127.0.0.1:8888/?token=xxx(中略)xxx)をコピーしてきて入力します

f:id:mu-777:20210320030922p:plain
サーバを設定する


5. セルの実行

左上の実行アイコンか,Ctrl+Enterでセルを実行できます!

f:id:mu-777:20210320031119p:plain
セル実行時の様子