クラウドエンジニアのノート

情報技術系全般,自分用メモを公開してます。

論文のpdfをコピペしたときのいらない改行を削除する

追記 (2020/12/07)

Webで動く便利なサイト見つけました

https://dream-exp.net/shaper/

はじめに

論文を翻訳にかけるとき、単純にCtrl+Cすると余計な改行がはいって非常に煩わしいですよね
そこで、クリップボードを監視して、改行を取り除く簡単なPythonスクリプトを作成しました

導入方法

Githubにて公開しました github.com

こちらをcloneしてpyperclipをインストールすればすぐに使えます
webページとかを介さなくて良いので安心ですね(?)

注意点

  • ソース内 pause パラメータをいじることができますが、あまり短くしすぎると無限ループに陥ります
  • ほんとはDeepL翻訳のショートカットであるCtrl+C 2回と組み合わせて使えたら最高だなと思ったのですが、難しかったです‥(PRお待ちしております)
  • とりあえずで作って見た次第なので、改善案等お待ちしておりますー

MuZero

スライド

説明

囲碁・将棋などのドメインはモデルベースな強化学習手法が成功を収めてきたが、そのモデルを自動で獲得し、AlphaZeroなどの従来手法を上回ったと主張しています。 つまり、モデルベースな手法ながら、人間はモデルの定義をする必要がないのです。環境と戦略を同時に学習します。
さらに囲碁・将棋のようなドメインだけでのみ強かったモデルベースな手法ですが、環境のモデルを自動的に獲得できるので、Atariでも従来手法を凌駕する成績を収めました。

EMERGENT TOOL USE FROM MULTI-AGENT AUTOCURRICULA(OpenAIかくれんぼ)

スライド

説明

調和系DLゼミ、札幌AI勉強会で発表させて頂いたスライドです。

内容は、チーム戦のかくれんぼを通じて,相互の戦略を獲得できたとする研究です。
各チームごとにシンプルな報酬のみにもかかわらず,人間に関連するスキルを中心とする行動を獲得できたと主張しています。
強化学習手法にはPPO + LSTMが用いられているみたいですね。また、方策を蒸留させようとする工夫が数多く見られました。

やはり強化学習はそのまま適用しただけじゃ上手く行かないことの方が多く、まだまだドメインによって様々な工夫が必要なんでしょうか‥。

DQNからA3C, PPOまで

スライド

説明

DQNからA3C, PPOまでの変遷を順に説明したスライドです。札幌AI勉強会で発表させて頂いた資料になります。 強化学習は基本的にDQNからの派生がほとんどなので、いきなり新しい手法の論文を見てもわけがわかりませんでした。
また、近年では全く新しいアプローチの強化学習が成功を収めています。(MuZero)

そちらの解説記事もあるので、よかったら見てってください。

A3C

スライド

説明

エピソードのサンプリング・学習が非同期 + Actor-Criticな手法の提案。更にGPUではなくCPUのみでDQNより学習時間を削ることに成功。また、DQNが苦手な行動空間が連続な場合の可能性も示した。 しかし、現在ではA2C(同期)の方が性能が良いとされている。

追記

現在(2020/04)ではAtariドメインでMuZeroやAtari57がSOTAなので、そちらのほうが良い手法と言えるだろう。近々そのあたりの論文を読んでみたい。

Android Studio 3.6でAndroid Drawable Importerを使う方法

お急の方

一番下にダウンロードリンクがあります

はじめに

皆さんはandroid開発のとき、アプリ内で使用する画像のimportをどうしてますか? 理解のあるデザイナーならすべてのサイズでdrawableをくれるでしょうが、私の場合そうはいきませんでした。
今回はそんなdrawableへのimportを一発でできるdrawable importerの導入方法について説明します。

Pluginについて詳しくは以下の記事へどうぞ qiita.com

導入方法

本来なら Preferences->Plugins でAndroid Drawable Importerを検索して導入で終わりですが、検索結果はNot Foundです

なので以下リンクの公式からDownloadして Preferences->Plugins 歯車マーク Install plugin from Diskでzipファイル指定でインストールできますが、3.6ではimportしても何もおきません。

https://plugins.jetbrains.com/plugin/7658-android-drawable-importer

解決方法

issueを漁っていると、Folkして3.6に対応してくれている人がいました。ありがとう!
皆さんもハートマーク押しときましょう

github.com

急ぎの人はここからzipダウンロードできます

サンプション・アーキテクチャをC++で実装

サンプション・アーキテクチャとは

ロボットの制御などに用いられ、それぞれのモジュールの階層構造を管理するアーキテクチャです。
ある目標に向かって行動するために最も重要なモジュールが下層にあり、上位層になればなるほどより抽象的なモジュールが構成される形が一般的ですね。

自動運転で例えると、道順通り運転する最上位層もモジュールがあって、下層モジュールには、渋滞してたら回避するモジュールや、車が突っ込んで来たら回避するモジュール…というような構成です。

実際に私の研究のラジコンカーにも実装されております。

日本語wikipediaより英語のほうが詳しい説明があります。

ja.wikipedia.org en.wikipedia.org

また、今回の実装は以下のサイトにあるjavaのソースをc++に翻訳しました。 www.ibm.com

実装クラス

大きくわけて3つあります。 1. Behavior(基底クラス) 2. BehaviorBasedAgent(実行クラス) 3. main

注意点 - これから説明するソースにはCarというクラスがありますが、車の情報を管理するクラスだと思ってください(アクチュエータとかのアクセスもここから) - すべてヘッダオンリークラスです - 元々ソースにあったコメントは英語、処理の代わりとして日本語のコメント入れてます

ファイル構成

.
├── main.cpp
├── Car.h
├── BehaviorBasedAgent.h
├── subsumption
│   ├── Behavior.h
│   ├── Drive.h
│   └── Stop.h
  • Drive.h コース通り運転するモジュール
  • Stop.h 停止処理があるモジュール

として説明していきます。

Behavior 基底クラス

Behavior.h

#pragma once
#include "../Car.h"

// Must add "override" modifier !
class Behavior {
   protected:
    Car& car;

   public:
    // This constructor is supposed to be called from child class
    Behavior(Car& car_) : car(car_){};

    // virtual function
    virtual bool isActive() {
        throw std::runtime_error("Called base class @ Behavior.h isActive()");
        return false;
    }
    virtual void act() { throw std::runtime_error("Called base class @ Behavior.h act()"); }
};

実装はかんたんでisActive()にmoduleがactiveになる条件を記述して、act()に行動を記述します。

Behavior実装例(Stopクラス)

Stop.h

#pragma once
#include "../Car.h"
#include "Behavior.h"

class Stop : public Behavior {
   public:
    Stop(Car& car_) : Behavior(car_){}

    bool isActive() override {
        // ストップする条件を満たしたら(信号、コースアウト…)
        return true;
    }
    void act() override {
         // Carクラスを使って停止処理
    }
};

BehaviorBasedAgent クラス

BehaviorBasedAgent.h

#pragma once
#include "subsumption/Behavior.h"
#include "subsumption/Stop.h"

// - RelationMat
//   BehaviorRelationMat[i][j] : 行動優先度がi<jならば[i][j]=false
using BehaviorRelationMat = std::vector<std::vector<bool>>;
using Behaviors = std::vector<std::unique_ptr<Behavior>>;

class BehaviorBasedAgent {
   private:
    Behaviors& behaviors;
    BehaviorRelationMat suppresses;
    int current_behavior_index;

   public:
    BehaviorBasedAgent(Behaviors& behaviors_, BehaviorRelationMat suppresses_)
        : behaviors(behaviors_), suppresses(suppresses_), current_behavior_index(0) {}

    void step() {
        std::vector<bool> is_active(behaviors.size());

        for (size_t i = 0; i < behaviors.size(); i++) {
            is_active[i] = behaviors[i]->isActive();
        }
        bool ran_behavior = false;
        size_t counter = 0;
        while (!ran_behavior) {
            bool run_current_behavior = is_active[current_behavior_index];
            if (run_current_behavior) {
                for (size_t i = 0; i < suppresses[0].size(); i++) {
                    if (is_active[i] && suppresses[i][current_behavior_index]) {
                        run_current_behavior = false;

                        break;
                    }
                }
            }

            if (run_current_behavior) {
                if (current_behavior_index < static_cast<int>(behaviors.size())) {
                    // do action
                    behaviors[current_behavior_index]->act();
                }

                ran_behavior = true;
            }
            if (behaviors.size() > 0) {
                current_behavior_index = (current_behavior_index + 1) % behaviors.size();
                counter++;
                if(counter == behaviors.size()) break;
            }
        }
    }
};

main.cpp(インスタンスを持つ)

#include "BehaviorBasedAgent.h"

int main(int argc, const char** argv) {
    //他の処理
    ...

    // This instance deals with modules that act as actuators
    Behaviors actuator_module;
    actuator_module.push_back(std::unique_ptr<Behavior>(new Stop(car)));
    actuator_module.push_back(std::unique_ptr<Behavior>(new Drive(car)));
    BehaviorBasedAgent actuator_agent(actuator_module, {{false, true}, {false, false}});

    // control loop
    while(1){
        subsumption.step();
    }

    ...
    //他の処理
    ...
    return EXIT_SUCCESS;
}
  • BehaviorBasedAgentに他のファイルをincludeしてるので、mainではこのファイルだけで大丈夫です
  • あとは制御処理のループでstep()を呼んで上げれば勝手に動作します -actuator_agentを初期化するときに、関係の行列を一緒に定義します

ibmのサイトに詳しい説明があるのですが、それぞれモジュールの関係性を、行動優先度がi<jならば[i][j]=falseと定義します。
なのでこの行列の対角成分は自身との比較なのでfalseですね。
もしすべてのモジュールの関係性が、下層モジュール < 上層モジュルならば、下falseの三角行列になります。

c++でpimplイディオムの書き方

はじめに

私は基本的にヘッダオンリーでC++のソースを書くタイプなのですが、研究で使うRCカーの制御プログラムが肥大化してきて、フルビルドに10分近くかかるようになってしまいました。そのまま実装とヘッダに分けても良いのですが、どうせならと思ってPimplイディオムを導入しました。

以下の記事を参考にさせて頂きました。 qiita.com

メリット・デメリット

Pimpl とは “Pointer to Implementation"から来ているみたいですね。

メリット

  • private なものを隠すことができる
  • コンパイル時間が短くなる

デメリット

  • ソースが肥大化する
  • 無駄にメモリ確保が必要

アンチパターンなんて記事も見るので、良い悪いは人それぞれだとは思いますが、個人的にprivateなものがヘッダからは見えず、ソースが読みやすくなることと、privateな部分での変更をいちいちヘッダにも反映させなくて良いのが気に入ってます。

使い方

ヘッダオンリー例

手順どおりにやれば至ってシンプルです。
まず、以下のようなソースを例に説明します。

test.h

#ifndef TEST_H_
#define TEST_H_

#include <iostream>

class Test {
   private:
    int pri_value;

    void twice() { pri_value *= 2; }
    void print() { std::cout << "pri_value: " << pri_value << std::endl; }

   public:
    int pub_value;

    Test() : pri_value(2), pub_value(4) { std::cout << "constructor" << std::endl; }
    ~Test() { std::cout << "destructor" << std::endl; }

    void process() {
        twice();
        print();
    }
    int process2(const int v_) { return pub_value * v_; }
};

#endif  // TEST_H_

main.cpp

#include "test.h"

int main(void){
    Test test;
    test.process();
    std::cout << "result of process2: " << test.process2(2) << std::endl;
    
    test.pub_value = 100;
    std::cout << "result of process2: " << test.process2(4) << std::endl;
}

実行例

$ ./a.out
constructor
pri_value: 4
result of process2: 8
result of process2: 400
destructor

手順

  1. test.hのprivateにTestImpl(クラス名+Impl)の前方宣言と、そのクラスへのポインター(pimpl)を設置
  2. test.cppを作成し、TestImplクラスを宣言
  3. test.hのprivate, publicの中身(変数、関数、コンストラクタ…)を新しいクラスに移動
  4. Testクラスのpublic変数を参照に変更
  5. test.cpp の、TestクラスコンストラクタでTestImplをnewして、参照で定義したpublic変数をpimplの保持する実体へ繋ぐ
  6. test.cppにTestクラスのpublic関数の実装をpimplの関数の実体へと繋ぐ

書き換え後

test.h

#ifndef TEST_H_
#define TEST_H_

#include <iostream>
#include <memory>
#include <vector>

class Test {
   private:
    class TestImpl;
    std::unique_ptr<TestImpl> pimpl;

   public:
    int& pub_value;

    Test();
    ~Test();

    void process();
    int process2(const int);
};

#endif  // TEST_H_

test.cpp

#include "test.h"

class Test::TestImpl {
   private:
    int pri_value;

    void twice() { pri_value *= 2; }
    void print() { std::cout << "pri_value: " << pri_value << std::endl; }

   public:
    int pub_value;
    TestImpl() : pri_value(2), pub_value(4) { std::cout << "constructor" << std::endl; }
    ~TestImpl() { std::cout << "destructor" << std::endl; }
    void process() {
        twice();
        print();
    }
    int process2(const int v_) { return pub_value * v_; }
};

Test::Test() : pimpl(new TestImpl()), pub_value(pimpl->pub_value) {}
Test::~Test() {}

void Test::process() { pimpl->process(); }

int Test::process2(const int v_) { return pimpl->process2(v_); }

main.cppは同じ

実行例

$ ./a.out
constructor
pri_value: 4
result of process2: 8
result of process2: 400
destructor

コメント

  • unique_ptrにすることでポインタ管理の心配いらず
  • 関数を一度無駄に経由することになるので、コピーコストラクタ走るのが嫌な時は転送すれば良い(コピーよりはまし)

まとめ

確かにソースは肥大化しますが、こっちのほうが1つのファイルで何やってるかわかるので、読みやすいような気がします。

1からFirebase Hosting + Basic認証のdeployをGithub Actionsで自動化する

はじめに

参考にさせた頂いた記事 qiita.com qiita.com

手動deployまで

まず最初の記事を参考にFirebaseで新規プロジェクトを作成します。
基本的に手順に従っていれば問題ないです。
ちなみに注意点として、 公開したいフォルダをfunctions以下にしないとうまくできませんでした。(正しいやり方があるとはおもうのですが…)

[本題] Github Actionsでdeploy

.github/workflows/nodejs.yml を追加する部分ですが、私はこの記事通りコピペしてもPermissionで怒られて動作しませんでした。(2020/04/01現在)

私はnode.jsのbuildは不要ですので、 npm install 解決方法 を参考にしながら、以下のように.ymlファイルを作成しました。

name: Node CI

on: 
  push:
    branches: 
      - master

jobs:
  deploy_to_firebase_hosting:

    runs-on: ubuntu-latest

    strategy:
      matrix:
        node-version: [12.x]

    steps:
      - name: Checkout the repository
        uses: actions/checkout@master

      - name: Deploy to Firebase
        run: |
          mkdir ~/.npm-global
          npm config set prefix '~/.npm-global'
          export PATH="$HOME/.npm-global/bin:$PATH"
          npm install -g npm
          npm install -g firebase-tools
          cd functions
          npm install --save express
          npm install --save basic-auth-connect
          cd ..
          firebase deploy --token $FIREBASE_TOKEN
        env:
          FIREBASE_TOKEN: ${{ secrets.FIREBASE_TOKEN }}

あとは、記事通りFIREBASE_TOKENだけGithub環境変数に追加したら準備完了です。 (今回は公開するだけなので、PASSWORDは不要)
masterにpushすると自動deployが走り、勝手に公開されるようになっています。

CIの注意点

この.ymlを書いていてハマったのが、各stepのrunの環境変数などは引き継がれないらしく、exportしても、.bashrcに追記しても別のrunで反映されなかったため、runを一つにまとめました。
もしbuildをするなら、その点注意が必要です。(各runの最初でpathを設定など)

最後に

もしFirebase functionなどを使わないで、シンプルにdeployする時なんかは以下のリポジトリを使うと便利かもしれません。

github.com

就活のためにポートフォリオを作る

はじめに

ポートフォリオ作成に時間をかけすぎたら本末転倒なので、サクッとテンプレートを探す(ライセンスをよく確認しましょう) startbootstrap.com などが王道でしょうか
ふつうに bootstrap portfolio templateとかで検索すると様々ヒットします

ライセンスについて

私が使用したテンプレートはMITライセンスでした

以下の記事によれば、公開したソースコード内にMITライセンスの記述を行えば良いとのこと 公開ライセンスの話 - Qiita

改変

テンプレートそのままだと面白くないので、+α追加していきます

はてなブログカードのembed

はてなブログで使用されている埋め込み型のカードを使いたいときには以下ソースコードの url hereの部分に埋め込みたいURLを入れるだけで実現できます。

<iframe 
   style="width:100%;height:190px;max-width:680px;"   title="%title%" src="url here" frameborder="0" scrolling="no">
    <a href="%url%">%title%</a>
</iframe>

スキルセットのレーティング

www.cssscript.com 私はこれにプラスでとFont-Awesome iconとタイトルをつけました。

<div class="contentContainer">
    <h3 class=mr-3><i class="card-title fas fa-code mr-3"></i>スキル</h3>

イメージギャラリー

人柄をみるような会社では、趣味などを聞いて来る場合があると聞いたので、最後のページに自分の趣味である写真のギャラリーをのせました。
参考にしたギャラリーのベースは以下です startbootstrap.com

そしてこの画像をクリックしたときに拡大するように、lightboxを導入しました。
導入方法から使い方まで本家ページにあります。 lokeshdhakar.com

ギャラリーのaタグの部分に必要項目追加します。

<a href="img/bike1.jpg" data-lightbox="pic" class="d-block mb-4 h-100">
     <img class="img-fluid img-thumbnail" src="img/bike1.jpg" alt="">
</a>

これで、クリック時の動作がリッチになりました。

お役立ちリンク

次回

次はこれをFirebase Hostingを使ってデプロイしたいと思います。
また、せっかくなのでGitHub Actionsを使って、デプロイの自動化もやってみようと思ってます。

追記

記事公開しました! tmyoda.hatenablog.com