論文のpdfをコピペしたときのいらない改行を削除する
追記 (2020/12/07)
Webで動く便利なサイト見つけました
はじめに
論文を翻訳にかけるとき、単純にCtrl+Cすると余計な改行がはいって非常に煩わしいですよね
そこで、クリップボードを監視して、改行を取り除く簡単なPythonスクリプトを作成しました
導入方法
Githubにて公開しました github.com
こちらをcloneしてpyperclipをインストールすればすぐに使えます
webページとかを介さなくて良いので安心ですね(?)
注意点
- ソース内
pause
パラメータをいじることができますが、あまり短くしすぎると無限ループに陥ります - ほんとはDeepL翻訳のショートカットであるCtrl+C 2回と組み合わせて使えたら最高だなと思ったのですが、難しかったです‥(PRお待ちしております)
- とりあえずで作って見た次第なので、改善案等お待ちしておりますー
EMERGENT TOOL USE FROM MULTI-AGENT AUTOCURRICULA(OpenAIかくれんぼ)
DQNからA3C, PPOまで
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に対応してくれている人がいました。ありがとう!
皆さんもハートマーク押しときましょう
急ぎの人はここから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
手順
test.h
のprivateにTestImpl(クラス名+Impl)の前方宣言と、そのクラスへのポインター(pimpl)を設置test.cpp
を作成し、TestImplクラスを宣言test.h
のprivate, publicの中身(変数、関数、コンストラクタ…)を新しいクラスに移動- Testクラスのpublic変数を参照に変更
test.cpp
の、TestクラスコンストラクタでTestImplをnewして、参照で定義したpublic変数をpimplの保持する実体へ繋ぐ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する時なんかは以下のリポジトリを使うと便利かもしれません。
就活のためにポートフォリオを作る
はじめに
ポートフォリオ作成に時間をかけすぎたら本末転倒なので、サクッとテンプレートを探す(ライセンスをよく確認しましょう)
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