OmniAICreator/Qiita-1.07M huggingface dataset:
Python jnjaテンプレート内でのデータの文字列変換の仕方

## 最初に

　DjangoまたはFlaskフレームワーク内でjinjaテンプレートを使ってフロントエンドのHTMLを生成する際の覚書です。しばらくするとすぐに忘れてしまうのでここに書かせていただきます

## やりたい事

* 以下の２つを同時に行いたいです
    * Panda🐼s dataframeのデータを文字列に変換します
    * 文字列の最後が「計」の字であるかどうかを判断します
        * 「計」のある行は空白セルも含めて全て背景色を変えます

## 結論

### Panda🐼s dataframeのデータを文字列に変換するには

1. `{% for 行 in df請求一覧[ 開始行NO : 終了行NO ].itertuples() %}` で順にデータを取り出し`行`に入れます
2. `行`の２列目のデータを `行[ 1 ] | string` で文字列に変換します
    * これ以外の方法では私は文字列に変換出来ませんでした😢
        * エラーを吐いちゃうんですよね〜😣

## 前提条件
* データは **df請求一覧**：Panda🐼s dataframe 形式
* `計`の字は各行の２列目
    * この**df請求一覧** がjinjaテンプレートを組み込んだHTML **list.html** に渡されます

## データ形式

|システム名|開発所属名|開発工数|請求金額|
|--------|--------|-------|------|
|ほげシステム|風開発部|100.0|10000000|
|ほげシステム|水開発部|200.0|20000000|
|ほげシステム|土開発部|300.0|30000000|
||計|600.0|60000000|
|風システム|風開発部|100.0|10000000|
|風システム|水開発部|200.0|20000000|
|風システム|土開発部|300.0|30000000|
||計|600.0|60000000|

## ソースコード

```jinja:list.html
  {% if df請求一覧.empty == None %}
    <div>請求一覧は表示できません</div>
  {% else %}
    <table class="small tablelock2">
      <thead>
        <tr>
          <th>NO</th>
          {% for 列名 in df請求一覧 %}
            <th>{{ 列名 }}</th>
          {% endfor %}
        </tr>
      </thead>
      <tbody>
        {% for 行 in df請求一覧[ 開始行NO : 終了行NO ].itertuples() %}
          <tr>
            {% for データ in 行 %}
              {% if ( データ == None ) %}
                {% if ( 行[ 1 ]|string ).endswith( '計' ) %}
                  <td class="littlesum"></td>
                {% else %}
                  <td class="data"></td>
                {% endif %}
              {% else %}
                {% if ( 行[ 1 ]|string ).endswith( '計' ) %}
                  <td class="littlesum">{{ データ }}</td>
                {% else %}
                  <td class="data">{{ データ }}</td>
                {% endif %}
              {% endif %}
            {% endfor %}
          </tr>
        {% endfor %}
      </tbody>
    </table>
  {% endif %}
```
小規模改修のついでに既存のコードの問題点を修正する

# そもそもの経緯
担当となったシステムのコーディングがヤバかった。
しかし、大規模な改修案件は降りてこない。
ならば、小規模案件のついでに少しづつ直してしまおうという流れ。

# 現状のコーディング
例えば、検索のビジネスクラスは以下の構成になってます。
1.バリデーション
2.検索ロジックの実行
3.画面表示項目の編集

これだけ見ると、（多分）普通の構成だが、実際のコーディングは以下のような感じ。

```
// バリデーション
// nullチェック
if(joken1 == null ||
   joken2 == null ||
   joken3 == null ||
   ...               ) {
  error.add("エラー");
  return false;
}
// 空文字チェック
if(joken1 != null &&
   joken2 != null &&
   joken3 != null &&
   ...              ) {
  if(joken1 == "" ||
     joken2 == "" ||
     ...            ) {
  error.add("エラー");
  return false;
  }
}

// オブジェクトの生成
ObInfo obInfo = new ObInfo();
ObResult obResult = new ObResult();
int kensakuResult = 0;

// 検索条件の判定
if (joken == CONST.JOKEN1 ||
    joken == CONST.JOKEN2 ||
    joken == CONST.JOKEN3 ||
    ...                      ){
// 検索実行
  kensakuResult = obInfo.getKensakuResult(joken1, joken2, ... , obResult);
  if(kensakuResult == 0) {
    error.add("エラー");
    return false;
  }
}

// 画面表示項目の編集
ObKensakuInfoBean obKensakuInfoBean = new ObKensakuInfoBean();
editKensakuInfo(obKensakuInfoBean, kensakuResult);

// ワーニング
if (kensakuResult == 2){
  error.add("ワーニング");
} else if (kensakuResult == 3){
  error.add("ワーニング");
} else if (kensakuResult == 4){
  ...
}

return true;
```

以上が検索実行時に最初に呼び出されるビジネスロジックの概要です。
実際にはより多くのバリデーションがあり、項目編集があり、編集コメントがあります。
この編集コメントが厄介で、ただでさえ見づらいコードをより見づらくしています。

```
/* 20XX ○○案件 START */
// ObInfo obInfo = new ObInfo();
/* 20XX ○○案件 END */
/* 20XX ××案件 START */
// ObInfo obInfo 
/* 20XX ××案件 END */
   obInfo
/* 20XX △△案件 START */
//            = obGetInfo.getInfo(obInfo, obAuthInfo, obCode);
/* 20XX △△案件 END */
/* 20XX □□案件 START */
              = obGetInfo.getInfo(obINfo);
/* 20XX □□案件 END */
```

みたいなかんじです。
ここ一か所なら判別できますが、これがコード全体にあるので、全体のコードの把握が難しくなっています。
現在ではSVNでソース管理を行っているため、コメントは必要ないのですが、慣習としてコメントが残されている状態です。

# 問題点
このコードでも動いてはいます。おそらく、最初は単純な条件で十分な要件だったんだと思います。しかし、徐々に複雑な条件が必要とされてしまった。
そして、このコードは（なぜか）条件が追加されることを考慮されていません。
インプットや、if条件、バリデーションが全てビジネスロジック内部で記載されています。
そのため、改修が入るたびにビジネスロジック内部の条件・バリデーションを修正する必要がありました。
当然、改修箇所の全画面分です。
しかも、ビジネスロジックによって別クラスに条件を記載していたり、ビジネスロジックに直接かかれていたり、メソッドで記載していたりと仕様がバラバラでした。
つまり、改修箇所ごとに修正が入るクラスがバラバラということです。

# 対応
本来なら、バリデーションクラスを作成してそこでバリデーションを実装するのがベストかと思います。
しかし、小規模案件での作成かつ、修正ステップ数によって工数が決まるため、根本からの修正は難しいです。
なので、今回は主に検索条件の修正を行いました。

# 対応方法
検索条件ですが、あらかじめ決まった定数を条件として設定しているため、それらを配列にして配列内に条件と一致するかを新たに条件として追加しました。

```
if(CONST.JOKENS.contain(joken)){
 kensakuResult = ...
}
```

といった感じです。
本来は一律でまとめたかったのですが、そうすると膨大な退行テストが必要になってしまいます。（今までの条件で正常に動作することのテストが必要になる）
単純な量の問題なら、結合テストは難しくとも、単体テストだけならJUnitなどで出来るでしょう。（既存の条件に対応するJUnitのテストケースがあれば、ですが）

残念ながら、JUnitもなければローカル環境すらないので、退行テストを実施するのはあきらめました。
なので、今回は新規で追加した条件のみリスト化して対応しています。

```
if(joken == CONST.JOKEN ||
   ...
   CONST.JOKENS.contain(joken)){
  ...
}
```

という具合です。

# 根本原因
そもそもの原因は、立ち上げ時に詳細設計を怠ったことが始まりかと思います。
基本設計しか明確にドキュメント化されておらず、画面表示が仕様通りになるように各自が実装してしまった。
それによってクラスの動作が指定されず、クラスごとの仕様がバラバラになったのかと。
改修時のために、実装を元に詳細設計を作成するのも有りだと思いますが、そんな工数は降りないです。
それで、こういった細かい修正で対処するしかなかったわけです。

# 総括
設計・コーディング規約はちゃんとしよう。
運用・保守フェーズに、クラス追加するような改修の工数は降りないから。
チャート式Ruby-Appendix-I(Shell)

\![Mac OS X-10.15.7](<https://img.shields.io/badge/MacOSX-10.15.7-brightgreen>) \![ruby-2.7.1p83](<https://img.shields.io/badge/ruby-2.7.1p83-brightgreen>) 


# イントロ


## 目的

CUI(character user interface) を駆使できると作業がめちゃくちゃ早くなります．例えば，こないだ探し物をしていて便利だったのは，Macで

    find . -name '*.key' | xargs open

とすると，子directoryに存在する全てのkeynoteファイルを開けてくれます．こんなのを知っていると，文字だけでなく，画像を含んだ探し物でも効率化することができます．

CUI vs GUIと対立的に考えるのではなく，CUI x GUIとして両方のいいところをとって，自分の生産性を劇的にあげましょう．

効率向上のkeyとなるのはCoC(Convention over configuration, 設定よりも既約)と，key-bindです．GUIでもkey-bind(ctrl-c, ctrl-v, alt-TAB, alt-wなんてね)が使えれば，それだけで生産性が上がります．


# Shell[I] command基本

Shell(殻)ってのは，operating systemの中心(Kernel: 核)の外側にあって，keyboardの入力を受け取って，Kernelへ渡して，スクリーンへいい感じで出力するという機能を受け持つという動作からついた名前です．Shellにはいくつもの派生があります．UbuntuとかはBash(Bourneさんが書いたshellに生まれ変わって，born again したshell)をdefaultで使っていますが，Fish, Zshってのが今の流行です．

Shellに命令(command)を投げてやり取りするため，command line interface(CLI)やcharacter user interface(CUI)と呼ばれます．

commandは

-   `command [objects]`

あるいは

-   `command [options] [ojbects]`

というのが基本形です．[]は省略可能を意味します．optionsは `-` 記号の後ろに文字character(short option)で打つか，`--` の後ろにフル記述(long option)で打つかの２種類があります．

-   `man man`

を確かめてください． `man` のmanualが表示されます．NAME(コマンド名), SYNOPISI(形式), OPTION(オプション), DESCRIPTION(機能説明)なんかが表示されます．終わるのは `q` (uit)です．


# Shell[II] directory関連

まずはdirectory(フォルダー呼ぶかも)関連の命令です．ファイルを整理するための電話帳(directory)という意図です．directory pathには相対パスと絶対パスがあります．Excelの絶対参照と相対参照と同じ意味です．

| ![img](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151211/393a9f69-856c-33e3-a23b-366372ec5983.png)|
|:----------------------------------------------------------------------------------------------------------------|
| Fig. ディレクトリー構造と絶対パス，相対パス.                                                                    |

-   `explorer.exe .` 　# `open` (mac), `xdg-open` (linux)
-   `mkdir [DIR]` # make dir
-   `pwd` # 絶対パスの表示 print working dir
-   `cd [DIR]` # change dir
-   `cd ..` # 一つ上のdirへch
-   `ls -lat` # list long, all, and time

なんかです．


# Shell[III] process関連

process関連の操作として用意されているコマンドは

-   `ps`, `top` # process status,
-   `fg`, `bg` # fore, back ground
-   `kill -9 PID` # kill process id

なんかです．

Emacs でc-zでstopしてShellに戻ってきても，`ps` あるいは `top` するとEmacsが動いていることが確認できます．これは，Emacsがbgにいて， `fg` すると操作がShellからEmacsに渡されることを意味します．Emacsを使っていて，気づかぬ間にたくさんのEmacsが立ち上がってしまっていることがあります．そうすると，折角の編集結果が失われることがあります．気がついたら `kill` でそのprocessを消すようにしてください．たくさんある時は，強制的にいったんUbuntuを落として入り直す方がいいです．


# ワイルドカード\*と補完とパイプ

'なんでも文字'を意味する `*` (アステリスク)は便利です．

-   `ls *.org`

さらに補完ってのがあるんで，

-   `ls R　:kbd:'TAB'`

とかで，R以下の文字をいい感じで補完(auto completion)してくれます．

さらにpipeという機能を使うと，commandの出力を次の入力にすることができます．それが冒頭に示した，

    find . -name '*.key' | xargs open

です． `find` はファイルを探す汎用命令で，-nameだと名前で，

    find . -size 0

だとサイズが0のファイルを現在のdirectory(`.`)から探してくれます．他に変更時間とか指定できます．縦棒 `|` が出力を次の入力として渡すパイプに相当します．`xargs` は出力を受け取って命令の目的格[object]につないでくれます．


# copy to clip board

clip boardにテキストをcopyしたい時は，

    pwd | pbcopy

pbはpasteboardの略．



------
 - **source** ~/git_hub/ruby_docs/chart_style_ruby/c01_shell.org
ベーシック認証がかかったページにアクセスする

- タイトル通り
- 様々な端末やブラウザでテストしていた際に、たまにベーシック認証のポップアップが出ず401にされる場合があったので対処方法を記録しておきます。

### 対処法
- 以下のようにURLにユーザ名とパスワードを含めることでアクセスすることができました

```
https://{ユーザ名}:{パスワード}@xxxxx.com/xxxx/
```
ALBのIAM設定しようとしたけどビジュアルエディタで見つからない場合

権限付与しようとして探したけど、ALBの設定がみつからなくて焦ったときは、
「ELB」であることを思い出すといいよという話

## Elasticで検索してもない

![IAM Management Console 2020-10-21 14-23-47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3865/807c6e41-ca75-ec73-4364-5bc71878d8ba.png)

## Application で検索してもない

![IAM Management Console 2020-10-21 14-24-18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3865/2ce666d2-30c2-dcb6-4aec-317882bdb2d9.png)

## 正解は ELB

![IAM Management Console 2020-10-21 14-24-59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3865/893f7b24-7020-825e-8a6e-5116fa8dc5ca.png)
C++20 で goroutine/Channel みたいなことをやるライブラリ作った



C++20でコルーチンが実装された
これにより、goroutineやChannelがC++でも自然に実装できるようになったので実装した

https://github.com/Fuyutsubaki/coffin-goroutine


### 現在できること
- ChannnelによるTask間の通信
- selectによる「どれか一つ実行」


### sample

停止するまでフィボナッチ数列をChannnelに吐き出し続けるgoroutineについて考えて見る
https://wandbox.org/permlink/RrCZXMunzgCgc43e

元ネタ： https://go-tour-jp.appspot.com/concurrency/5

```C++
cfn::Task<> fibonacci(std::shared_ptr<cfn::Sender<MyStrategy,int>> ret_ch, std::shared_ptr<cfn::Recver<MyStrategy,int>> quit_ch){
    int x=0;
    int y=1;
    for(;;){
        //ret_chの送信かquie_chの受信が可能になるまで待機
        auto [ret, quit] = co_await select(ret_ch->send(x), quit_ch->recv());
        if(ret){
            int next = x+y;
            x=y;
            y=next;
        }else if(quit){
            break;
        }
    }
}
cfn::Task<> example(){
    auto [ret_send,ret_recv] = cfn::makeChannel<MyStrategy,int>(MyStrategy{},0);
    auto [quit_send,quit_recv] = cfn::makeChannel<MyStrategy,int>(MyStrategy{},0);
    spown_task(fibonacci(std::move(ret_send), std::move(quit_recv))); // SchedulerにPostされ非同期に実行される
    for(int i=0;i<10;++i){
        auto x = co_await ret_recv->recv();
        std::cout<<*x<<std::endl;
    }
    quit_send.reset(); // close。このChannelから値を取り出そうとすると std::optional<int>型のstd::nulloptが取り出される
}

```

## 使い方
`coffin/goroutine` を使うには以下が必要である。詳細は ライブラリのreadme参照

- Scheduler
  - ようするにthread_poolとかboost::asio::io_context(io_service)である。マルチスレッドで動かなくてもいいなら `std::vector<std::function<void()>>` を実行していくだけのクラスでよい
  - `coffin/goroutine` がこれらを組み込んでいないのは、すでにSchedulerがいるアプリケーションに途中からでも組み込めるようにするためである
- ChannelStrategy
    - 上のSchedulerとChannelをうまくつないでやるためのclassを定義する必要がある

### Task と Channel
- `cfn::task<T>`
  - 非同期処理を行うためのコルーチンである
  - co_awaitとchannelを駆使してやっていく
  - たぶん大体同じようなclassがC++23で標準に入る
- `cfn::makeChannel(Strategy,queue_size)`
  - Channelを生成する。正確にはChannelへの参照を持つ `std::shared_ptr<Sender<Strategy, value_type>>` と `std::shared_ptr<Recver<Strategy, value_type>>` が返る
  - `std::shared_ptr<Sender<Strategy, value_type>>` の参照カウントが0になり`~sender`が呼ばれると、Channelはcloseになる

```C++
cfn::Task<> example(){
    auto [ret_send,ret_recv] = cfn::makeChannel<MyStrategy,int>(MyStrategy{},0);
    auto [quit_send,quit_recv] = cfn::makeChannel<MyStrategy,int>(MyStrategy{},0);
    spown_task(fibonacci(std::move(ret_send), std::move(quit_recv)));
    for(int i=0;i<10;++i){
        auto x = co_await ret_recv->recv();
        std::cout<<*x<<std::endl;
    }
    quit_send.reset(); // close
}
```



### Select
`Channnel.send()|recv()` を受け取り，最初に実行可能になったもの1つを実行する。
戻り値として `bool|std::optional` のtupleを返し、何が実行されたか、実行した結果何の値を`recv`したかを判断できるようにする

```C++
cfn::Task<> fibonacci(std::shared_ptr<cfn::Sender<MyStrategy,int>> ret_ch, std::shared_ptr<cfn::Recver<MyStrategy,int>> quit_ch){
    int x=0;
    int y=1;
    for(;;){
        auto [ret, quit] = co_await select(ret_ch->send(x), quit_ch->recv());
        if(ret){
            int next = x+y;
            x=y;
            y=next;
        }else if(quit){
            break;
        }
    }
}
```

## ほか
- 細かいとこ等はreadmeを見てほしい
- バグや問題、提案等があったらgithubのissueに報告やPRしてもらえるとありがたい
Supervisor設定

```
sudo yum install python-setuptools
sudo easy_install pip
sudo pip install supervisor

sudo echo_supervisord_conf > /etc/supervisord.conf
sudo mkdir /etc/supervisord.d

[include]
files = /etc/supervisord.d/*.conf



systemctlへのサービス登録
touch /etc/systemd/system/supervisord.service

下記に編集
[Unit]
Description=Supervisor process control system for UNIX
Documentation=http://supervisord.org
After=network.target

[Service]
ExecStart=/usr/bin/supervisord -n -c /etc/supervisord.conf
ExecStop=/usr/bin/supervisorctl $OPTIONS shutdown
ExecReload=/usr/bin/supervisorctl $OPTIONS reload
KillMode=process
Restart=on-failure
RestartSec=50s

[Install]
WantedBy=multi-user.target


Queue設定
[program:laravel]
process_name=%(program_name)s_%(process_num)02d
command=php /home/vagrant/project/work-app/artisan queue:work --sleep=3 --tries=3
autostart=true
autorestart=true
user=vagrant
numprocs=1
redirect_stderr=true
stdout_logfile=/home/vagrant/project/work-app/storage/logs/worker.log

```
自分の親ブランチが知りたい

自分用の備忘録です:point_up:
間違っている点等ありましたらご指摘ください！！

GUIツールを使っていないので、ふとカレントブランチの親ってなんだっけとなりました。
そこで素晴らしい記事を見つけたので、使ってみました。

## ☆使いかた
```bash
$ git show-branch | grep '*' | grep -v "$(git rev-parse --abbrev-ref HEAD)" | head -1 | awk -F'[]~^[]' '{print $2}'
```
これだけです！！

現在のブランチを確認して、実際に使ってみました。
もしブランチ名の命名を間違えてプッシュしてしまっても、親ブランチを確認することができます。
素敵ですね。

```bash:親ブランチ確認
$ git branch 
  d/ww1
  feature/#0001
* feature/#0002
  staging
  develop
  master
$ git show-branch | grep '*' | grep -v "$(git rev-parse --abbrev-ref HEAD)" | head -1 | awk -F'[]~^[]' '{print $2}'
feature/#0001
```

## ☆おまけ
VSCodeでプラグインを入れる前に、よく使っていました。
現在のGitのブランチ状態を確認できます。

```bash:現在のツリー確認
$ git log --graph
* commit 12345656e123456s (HEAD -> feature/#0002, origin/feature/#0002)
| Author: hogeta_hogeo <hoge.hoge@hoge.com>
| Date:   Wed Oct 21 09:35:56 2020 +0900
| 
|     xxxxコミットタイトルxxxx
|   
*   commit ss1aas23456df56e1234wesaw56s
|\  Merge: 親コミット1 親コミット2
| | Author: hogeta_hogeo <hoge.hoge@hoge.com>
| | Date:   Wed Oct 21 09:30:50 2020 +0900
| | 
| |     Merge branch 'd/ww1' into feature/#0002
:...skipping...
```

親ブランチを切り間違えていた時にADDを取り消したいなぁなんてこともあるかと思います！
下記で対応しました。

```bash:間違いステージングを取り消し
$ git reset HEAD
Unstaged changes after reset:
M       docker/php/Dockerfile

# 特定のファイルを取り消し
$ git reset HEAD ファイル名
```

## ☆参考文献
https://qiita.com/upinetree/items/0b74b08b64442f0a89b9
RSpecでコピペのテスト

権限によってペーストができなくなる機能のテストをしようと思ったら全然うまいこと行かずにかなりハマったのでメモ。

```ruby
# コピー
page.execute_script('
  var copy_target = document.getElementById("copy_target");
  copy_target.select();
  document.execCommand("copy");
')

# ペースト
find_by_id('paste_target').send_keys [:control, 'V']
```
ドットインストールEmment CSS編

Emmetチートシート
https://docs.emmet.io/cheat-sheet/

ドットインストールEmmet
https://dotinstall.com/lessons/basic_emmet_v3/50301

08 margin,paddingを展開してみよう
09 CSSのプロパティを展開してみよう


#08margin,paddingを展開してみよう

##m
```
margin: ;

```


##p
```
padding: ;

```


##m10
```
 margin: 10px;
```


##m10p

```
margin: 10%;
```

##m10r

```
margin: 10rem;
```

##m10p20p

```
margin: 10% 20%;
```

##m10-20-30

```
 margin: 10px 20px 30px;
```

##mb10

```
margin-bottom: 10px;
```

09CSSのプロパティを展開してみよう

##適当な文字列でもOK
予測変換のように出てくれる

```
    font-size:20px ;
    cursor: ;
    font-weight: ;
    position: absolute;
    position: relative;
```
【Go】WSL2にGoをインストールする手順


# WSL2にGoをインストールする

いままでWindowsにインストールしたGoを使用してたけどどうせならWSL2で開発したいのでWSL2にGoをインストールしてみる

# 実行環境

OSは**Windows 10 Pro 64bit** (バージョン2004 OSビルド19041.572)
**WSL2**でOSは**Ubuntu-20.04**

## 1.インストーラーをダウンロードする

まずは[Download and install - The Go Programming Language](https://golang.org/doc/install) を開き「Linux」を選択し、Linux用のインストーラーをダウンロードしてくる。

![FireShot Capture 139 - Download and install - The Go Programming Language - golang.org.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85815/204099d2-0ee1-e69b-f544-3c7c398314cc.png)

この時にダウンロードしてきたインストーラー（例では `go1.15.3.linux-amd64.tar.gz`）を自分のわかりやすいところへ移動しておく

## 2.WSLを立ち上げる

次にコマンドプロンプトかWindowsのターミナルを開き、`wsl`コマンドを実行してWSLを立ち上げる

```cmd
Microsoft Windows [Version 10.0.19041.572]
(c) 2020 Microsoft Corporation. All rights reserved.

C:\Users\sola>wsl
root@sola-pc:/mnt/c/Users/sola#
```

## 3.公式サイトに記載されてるコマンドを実行する

無いとは思いますが**予めGoがインストールされている場合はアンインストールしておいてください**とのこと

まず以下のコマンドで`/usr/local` 以下に展開
※先ほどダウンロードしてきたインストーラー（例では `go1.15.3.linux-amd64.tar.gz`）を置いた場所へ移動してから実行すること

```
tar -C /usr/local -xzf go1.15.3.linux-amd64.tar.gz
```

## 4.ルートへ移動後エクスプローラーを立ち上げる

終了後、ルートへ移動し、そこでエクスプローラーを立ち上げる

```
root@sola-pc:/mnt/c/Users/sola# cd ~
root@sola-pc:~# explorer.exe .
root@sola-pc:~#
```

`explorer.exe .` を実行すると以下のようなエクスプローラーが立ち上がる

![スクリーンショット 2020-10-21 132322.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85815/cb19cdb7-2998-808f-9bf8-cd1f96f13531.jpeg)

（※環境によってファイルなどに差異はあるとおもいますので、あくまでこんな感じのディレクトリが開かれるというイメージで見てください）

## 5.環境変数の設定

`.bashrc`をテキストエディタで開き、以下の行を追加し保存する。

```.bashrc
export GOROOT=/usr/local/go
export GOPATH=$HOME/go
export PATH=$GOPATH/bin:$GOROOT/bin:$PATH
```

その後、コマンドプロンプトorターミナルを再起動させて再度WSLを立ち上げる

## 6.Goがインストールされているか確認

`wsl` コマンドで立ち上げたのち、`go version`でインストールされているか確認しておく

```
Microsoft Windows [Version 10.0.19041.572]
(c) 2020 Microsoft Corporation. All rights reserved.

C:\Users\sola>wsl
root@sola-pc:/mnt/c/Users/sola# go version
go version go1.15.3 linux/amd64
root@sola-pc:/mnt/c/Users/sola#
```

# 参考URL
- [Download and install - The Go Programming Language](https://golang.org/doc/install)
- [How to install and setup Golang development under WSL 2 | by Ben Braunstein | Medium](https://medium.com/@benzbraunstein/how-to-install-and-setup-golang-development-under-wsl-2-4b8ca7720374)
【Linux】CentOS7で「 |（パイプ）」が打てないとき

#Linuxの勉強を始めたはいいが…
「エンジニアたるものLinuxくらい使えろ！」というQiitaの記事(見失った)に触発され、Linuxの勉強をはじめました！[Linux標準教科書](https://linuc.org/textbooks/linux/)さんにお世話になっています。
VirtualBoxでの仮想マシンを構築に成功し、順調な滑り出しかと思いきや、「4.4　パイプ」で詰みました。

**「パイプ( | )」が打てない！**

「linux　パイプ　打てない」と検索して出てきたコマンドやファイルの設定を行ってもことごとく失敗。キーボード配列設定の問題ってことはわかってたんですけどね…

#解決方法
力業で解決しました。

具体的には、デスクトップ画面左上「アプリケーション→システムツール→設定→地域と言語」で言語を「**English(United States)**」に設定しました。

そして、入力ソース(キーボード)から日本語のものをすべて排除(選択して-を押下)し、「**English(US)**」(+を押下して選択)のみにしました。入力ソース左下のキーボードアイコン押下でキーボードの配列を見ることができますが、「**English(US)**」のキーボードで見ると、Enterキーのすぐ左隣にパイプがいます。

以上の設定後に再起動し、ターミナルで**Shift + ]**を入力するとパイプが現れました！

あくまで応急処置ではありますが、これで勉強が続けられますね！

以上、CentOS7でパイプが入力できないときの対処法でした^^

※注意：キーボードの配列が変わって他の記号の位置も少し変わってしまうので気を付けてください
時系列分析4　SARIMAモデルの構築

[Aidemy](https://aidemy.net/)　2020/10/29
#はじめに
　こんにちは、んがょぺです！バリバリの文系ですが、AIの可能性に興味を持ったのがきっかけで、AI特化型スクール「Aidemy」に通い、勉強しています。ここで得られた知識を皆さんと共有したいと思い、Qiitaでまとめています。以前のまとめ記事も多くの方に読んでいただけてとても嬉しいです。ありがとうございます！
　今回は、次系列分析の4つ目の投稿になります。どうぞよろしくお願いします。

＊本記事は「Aidemy」での学習内容を「自分の言葉で」まとめたものになります。表現の間違いや勘違いを含む可能性があります。ご了承ください。

今回学ぶこと
・SARIMAモデルの構築

#SARIMAモデルについて
・__SARIMAモデル__とは、データを階差系列に変換するARIMA(p,d,q)を、更に__季節周期を持つ時系列にも対応できる__ようにしたモデルのことである。
・SARIMAモデルでは、__SARIMA(sp,sd,sq,s)__というパラメータを持つ。

##sp,sd,sq
・__sp,sd,sq__はそれぞれ__「季節性自己相関」「季節性導出」「季節性移動平均」__といい、ARIMAのp,d,qと基本的には変わらない。
・sp,sd,sqのデータは過去の季節期間を経たデータに影響されるということが加わった。
・SARIMAのもう一つのパラメータである__「s」__は__季節周期__を表す。12ヶ月周期なら、s=12とすれば良い。
・sqに関しては、影響される「過去の季節期間」が何周期前のものかを表す。

##パラメータの決定
・以上のようなパラメータについて、適切な値を調べる必要がある。
・このときに使われるのが、__情報量基準__というものである。今回はその中でも__「BIC」__というものを使う。ただし、今回は詳しくは扱わない。
・BICの値が低ければ低いほどパラメータの値は適切であると言える。

##自己相関係数/偏自己相関係数の可視化
・__偏自己相関__とは、自己相関を行う二つの値の__間のデータの影響を取り除いたもの__である。
・例えば、y1とy7の偏自己相関は、その間のy2〜y6の影響を除去したものになる。
・この偏自己相関を可視化することによって、__パラメータ「s」の最適な値を設定する__。
・可視化したとき、__周期の部分で偏自己相関の値が高くなる__ので、ここをsの値にすれば良い。

・偏自己相関の可視化（グラフ化）は以下のように行う。
__sm.graphics.tsa.plot_pacf(データ)__

・コード（ワインの売り上げデータの相関の可視化）![スクリーンショット 2020-10-29 14.27.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/81b92856-d4b8-1d98-03e7-28261cb8cabc.png)

・結果![スクリーンショット 2020-10-29 14.28.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/3e5a9a67-eb31-5839-b557-ebc383e407e3.png)


#SARIMAモデルの構築
・構築の手順
　①__データ読み込み__:pd.read_csv()
　②__データ整理__:pd.date_range()
　③__データ可視化__:sm.graphics.tsa.plot_pacf()
　④__データ周期（s）把握__:④から。
　⑤__s以外のパラメータ設定__:BICで把握
--ここから新しい部分--
　⑥__モデル構築__:__sm.tsa.statespace.SARIMAX().fit()__
　⑦__データ予測/可視化__:__predict()__ / plt.show()

・⑥モデル構築のSARIMAX()の引数については以下のようになる。
__SARIMAX(データ,order=(p,d,q),seasonal_order=(sp,sd,sq,s))__

・⑦データ予測のpredict()は以下のようになる。予測開始時だけは時系列データにある時間である必要がある。
__モデル.predict("予測開始時","予測終了時")__

・一連のコード実行（⑤は行っていない）![スクリーンショット 2020-10-29 14.31.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/cfbcbcc9-9b7b-6a92-d24d-327dfa3f1d97.png)

・結果![スクリーンショット 2020-10-29 14.32.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/63b27173-80e3-81fd-6f4f-d68be98d37b5.png)


#まとめ
・__SARIMAモデル__とは、データを階差系列に変換するARIMA(p,d,q)を、更に季節周期を持つ時系列にも対応できるようにしたモデルのことである。
・SARIMAモデルにはパラメータ__(sp,sd,sq,s)__がある。
・sp,sd,sqは__BIC__という__情報量基準__を用いて適切な値を調べる。
・sは__偏自己相関__を図式化して調べる。
・これらのパラメータを__sm.tsa.statespace.SARIMAX().fit()__に渡してモデルを構築し、__predict()__で予測を行う。

今回は以上です。最後まで読んでいただき、ありがとうございました。
機械学習における前処理1　データ分析のプロセス

[Aidemy](https://aidemy.net/)　2020/10/29
#はじめに
　こんにちは、んがょぺです！バリバリの文系ですが、AIの可能性に興味を持ったのがきっかけで、AI特化型スクール「Aidemy」に通い、勉強しています。ここで得られた知識を皆さんと共有したいと思い、Qiitaでまとめています。以前のまとめ記事も多くの方に読んでいただけてとても嬉しいです。ありがとうございます！
　今回は、機械学習の前処理の1つ目の投稿になります。どうぞよろしくお願いします。

＊本記事は「Aidemy」での学習内容を「自分の言葉で」まとめたものになります。表現の間違いや勘違いを含む可能性があります。ご了承ください。

今回学ぶこと
・データ分析の流れ

#データ分析の流れ
・データ分析の流れ（プロセス）として、__CRISP-DM__や__KDD__といったものが提唱されている。
##CRISP-DM
・__CRISP-DM__は、以下のようなプロセスになっている。
　①__ビジネス理解__:課題は何か、データ分析を使ってどうするかを明確にする。
　②__データ理解__:データの取得、データが分析に使える形かを理解する。
　③__データ準備__:データを④モデリングで使える形に整形する。
　④__モデリング__:データにモデルを適用し、分析する。
　⑤__評価__:分析結果が十分であるかを評価する。
　⑥__適用__:実際に課題や業務に分析結果を適用する。

・ただし、これらのプロセスは必ずしも一方通行のものではなく、必要に応じて戻ることもある。
・今回学ぶデータの前処理は、このプロセスの②③にあたる。

・図![スクリーンショット 2020-10-29 14.36.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/d949cd2a-4ff7-833e-d8b1-df799dcf7741.png)

##KDD
・__KDD__は以下のようなプロセスになっている。
　①__データ取得__:課題や目標を定めてデータを取得する。
　②__データ選択__:取得したデータのうち、分析（データマイニング）に使うデータを選択する。
　③__データクレンジング__:欠損値や外れ値の削除などのデータクレンジングを行う。
　④__データ変換__:クレンジング済みデータの形式をデータマイニングに使える形式に変換する。
　⑤__データマイニング__:変換したデータに対して回帰や分類などを行って分析、学習を行う。
　⑥__解釈・評価__:データマイニングで得られた結果からパターンを解釈し、評価する。

・図![スクリーンショット 2020-10-29 14.36.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/78ad3832-30bf-33c2-4788-44865de4cc74.png)


今回は以上です。最後まで読んでいただき、ありがとうございました。
NavigationControllerのBackをコードから

一つ前のViewControllerにもどる

```swift

self.navigationController?.popViewController(animated: true)
```

🐣
****
お仕事のご相談こちらまで
rockyshikoku@gmail.com

Core MLを使ったアプリを作っています。
機械学習関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
Rails Tutorial 0章：事前基礎知識学習1

#1.事前基礎知識編

私がRailsを学び始めて最初に躓いたのが、ライブラリ・フレームワークといった謎の言葉達でした。
正直言ってプログラミング言語もいっぱいあるらしいし、何から始めればいいのかさっぱり・・・。
一つ一つ Googleで検索して言葉の意味を検索したりもしましたが、しっくりきません。

>Ruby on RailsとはWebアプリケーションフレームワークです。そもそもWebアプリケーションフレームワークとは、動的なウェブサイト、Webアプリケーション、Webサービスの開発をサポートするために設計されたアプリケーションフレームワークのことを言います。フレームワークは日本語では「枠組み」というふうに言われますが、まさにその通りで、このRailsもプログラミング言語のRubyで使えるフレームワークなのです。Railsの基本理念は「Don’t Repeat Yourself(DRY)」、「Convention over Configuration(CoC)」でそれぞれ「同じことは繰り返さない」、「設定より規約」という意味になります。
引用：https://techacademy.jp/magazine/7011

理解力の乏しい私にはこの文章では理解できませんでした;つД｀)
#####私の言葉で言い換えるとフレームワーク＝テンプレート(雛型)です

みなさん、Microsoft WORDやEXCELなどを使って履歴書を一から作った事ありますか？
私は約15年前の学生時代にEXCELを使って自分で履歴書を一から作らさせられました。
今時代に履歴書を白紙状態から作るなんてことはないと思います。
履歴書の雛型(テンプレート)をダウンロードして必要な情報を埋めて履歴書を作りますよね？
それと同じでWEBアプリケーションも雛型を元に必要事項を埋める事で最低限の機能を持ったWEBアプリが作れる時代になっているみたいです。
#####RailsはRubyというプログラミング言語でWEBアプリケーションを作る時によく利用されるテンプレート

余談ですが、Pythonというプログラミング言語ではRailsの利用はできません。
PythonではWEBアプリケーションを作る為にdjangoというフレームワークがよく利用されている様です。
フレームワークは共通概念も多いので一つフレームワークを使ったアプリ開発を行うと、こんな風にやるのね～とイメージが掴めて別のフレームワークで開発を使用する際にも活きるようです。また現在のWEBアプリケーションは様々な言語が組み合わされて作られているそうで、Railsは主にログインやユーザー管理部分などウェブアプリケーションに必要な基本的な部分を作る為に使われている様です。
例えば、最近話題のAI(機械学習)の機能を持ったウェブアプリケーションを作りたい場合は、
機械学習が得意なpythonというプログラミング言語で機械学習部分を作成し、ウェブアプリケーションの基本的な部分はRuby on Railsで作って組み合わせる事が可能とのこと。

#####ライブラリって何？
>フレームワーク」は、よく「ライブラリ」という言葉と混同されがちですが、ライブラリというのは特定の機能を提供し、プログラムの中でそれらを呼び出すことで動作するものです。
引用：https://techacademy.jp/magazine/7011

#####これも私の言葉で言い換えるとライブラリ＝パーツ(部品)です
また履歴書を例にしますが、氏名を書く欄、写真を張る場所、学歴・職歴を書く欄、趣味・特技を書く欄などの様々なパーツが組み合わさって履歴書というテンプレートが出来ています。

履歴書と同じようにWEBアプリケーションもいろんな部品が組み合わさってテンプレートが出来ています。
その個々の部品の事をライブラリと呼ぶ様です。
例えば、ログイン機能を簡単に実装する為にdeviseというライブラリ(部品)があります。
一から作ると(。´・ω・)ん?わけわからないどうやって動いてるの？
ってなるログイン機能もdeviseという部品を使うと比較的簡単に実装出来ます。

#####プログラミング言語の得意分野・不得意分野
RubyはRailsがあるのでWEBアプリケーション開発が得意分野。
javaは大規模な分散処理が得意だったり、pythonは機械学習が得意らしいです。

何故、プログラミング言語に得意分野・不得意分野があるかというと、アプリケーションはライブラリ(部品)を組み合わせて作るからです。pythonは機械学習用の多くの部品が既に存在し、天才達が新たな部品を開発したり、今ある部品を改善してくれてくれたりしています。一方でRubyは機械学習用ライブラリが少なく、同様の機能を実装する為には部品を一つ一つ自作していく必要があります。
このような差がプログラミング言語の得意・不得意を持つ要因となっている様です。

[セイト先生のWeb・IT塾 主要プログラミング言語16選！特徴と初心者向けおすすめ度まとめ](https://www.youtube.com/watch?v=HUZlOEbSP6c)
プログラミング言語の得意分野などが開設されていて分かりやすい動画でした。
頭のいい方々は説明も上手なんですね。
[セイト先生のWeb・IT塾 【Web/IT業界あるある】締め切り、プログラミング中、エンジニア面接](https://www.youtube.com/watch?v=Ik1_AzopJG4&ab_channel=%E3%82%BB%E3%82%A4%E3%83%88%E5%85%88%E7%94%9F%E3%81%AEWeb%E3%83%BBIT%E5%A1%BE)
学習の息抜きにこの動画も見てみました。
特に後半のエンジニア面接部分は非常に興味深かったです。
少しRuby on Railsを頑張ろうってモチベーションUPがアップしました。

##### まとめ
* フレームワーク＝　WEBアプリケーション用に用意されたテンプレート
* ライブラリ　　＝　WEBアプリケーション用に利用できるパーツ
* Rails　　　　　＝　Rubyで使えるWEBアプリケーション用フレームワーク
EC2インスタンスのNameタグをhostnameに(ローカルから)

# 目的
EC2インスタンス自体にawscliをインストールせず、インスタンスのhostnameをNameタグの値にする

# 経緯
仕事上複数のインスタンスを扱うことがあるのですが、その際に今どのインスタンスにログインしているかがわからなくなります。
ネットにはインスタンスにログインしてNameタグを取得するためにawscliをインストールして...といった記事はありましたが、一つ一つにそのような作業をするのはめんどくさいですし無駄にパッケージを追加したくありません。
そこでローカルでNameタグを取得して、それをリモートのhostnameに適用する、というようなシェルスクリプトを書きました。

# 前提
awscli がローカルにインストール、設定されていること

# スクリプト
```sh:set-hostname.sh
tag_name=`aws ec2 describe-instances \
            --query 'Reservations[].Instances[].{Name:Tags[?Key==\`Name\`].Value}' \
            --filter "Name=ip-address,Values=$1" \
            --profile プロファイル \
            | jq -r '.[0].Name[0]'`
echo $tag_name
ssh -i <秘密鍵へのパス> ec2-user@$1 "sh " <<-EOS
sudo hostnamectl set-hostname $tag_name
EOS
```

```sh:実行
set-hostname.sh <設定したいインスタンスのPublic IP>
```

# 説明
ほぼ見たままなので詳細は省きますが、ローカルの変数をリモートで使用するというところで少し詰まりました。参考欄のteratailで同じような質問をされている方がいたので興味があれば。

プロファイルや秘密鍵へのパス、ユーザー名などは引数にする。スクリプトの最後にsshコマンドを書いてそのままログインできるようにする。などして各々利便性を向上していただければと思います。
（自分は複数のAWS環境にアクセスする必要があるのでプロファイルを引数に取れるようにしています）

# 参考
* AWS EC2のNameタグをインスタンスのホスト名として設定する方法  
https://qiita.com/tabimoba/items/4fc4a38d93499c72a99f
* AWS公式ドキュメント  
https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instances.html
* ローカルのシェル変数をリモートで適用  
https://teratail.com/questions/53734
Flutterアプリのipaをアップロードすると ITMS-90208 エラー

Flutterを1.17.1から1.22.1に上げたところ、ストアにipaをアップすると以下のエラーができるようになってしまいました。

```
ERROR ITMS-90208: "Invalid Bundle. The bundle Runner.app/Frameworks/App.framework does not support the minimum OS Version specified in the Info.plist."
```

# 修正方法
以下の方法で解決できました。

- `/ios/Flutter/AppframeworkInfo.plist` の `MinimumOSVersion` を 9.0 にする
- プロジェクトの `iOS Deployment Target` を 9.0にする
- ターゲットの `iOS Deployment Target` を 9.0にする
- flutter cleanしてから再ビルド

参考
https://github.com/flutter/flutter/issues/58200#issuecomment-675085313
link_toで改行したボタンを作りたい[備忘録]



# link_toで改行したボタンを作りたい[備忘録]
改行を含んだボタンを作りたいなと思った時に、困ったので備忘録として記載します。


## 間違った例
<%= %>の中に改行させるべく\</br>を入力するとそのまま出力されてしまいます。

```
<%= link_to "<h2>ログイン</h2></br>ログインすると、コメント・いいねが可能です！",new_user_registration_path, {class: "btn btn-success"} %>
```

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390510/6eaa18b3-df6b-a4d2-54e5-9b67ed643d04.png)

### 結論
```
<%= link_to new_user_registration_path, class: "btn btn-success" do %>
  <h2>ログイン</h2>
  <br>
  ログインすると、コメント・いいねが可能です！
<% end %>
```

![キャプチャ2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390510/d6b2807a-f6bc-9158-d010-12dcdc3278ef.png)


## 補足
最初に投稿した際は、rawメソッドを使用していましたが、
@jnchitoさんより「rawメソッドはうかつに使うとXSSを作り込んでしまう原因になるので、極力使わないようにした方が良いです。
Railsにはrawを使わずにHTMLを構築する様々な方法が用意されているはずなので、まずはrawに頼らない方法を探しましょう。
」とコメントを頂き、修正させていただきます。



rawメソッドを使用してエスケープした望ましくない例

```
<%= link_to raw("<h2>ログイン</h2></br>ログインすると、コメント・いいねが可能です！"),new_user_registration_path, {class: "btn btn-success"} %>
```






## エスケープ文字って何？

特殊文字 \<p>や\<br>などの特殊文字の効果を無効化させることです。

参照
https://noterr0001.hateblo.jp/entry/20151208/1449579773
Heroku上でのエラー解決方法

#環境
この記事ではmacOS Catalina10.15.6にインストールしたRuby 2.6.5を使っています。

#手順
Heroku上でエラーが発生した際には、エラーログを確認してエラー解決を行う必要があります。
以下の5つの手順で解決可能です。

##１．エラー発生
Herokuへアクセスすると、下記の画像の内容が表示されました。

![スクリーンショット 2020-10-21 9.23.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693227/59af71b7-b08b-705a-e4a8-ee8b6dadb8b6.png)
サイトでは、エラーの具体的な内容がわからないのでターミナルでエラーログを確認します。

##２．エラーログを出力

```terminal:terminal
heroku logs --tail --app <<アプリケーション名>>
```
を入力するとエラーログが表示されます。

実際にエラーが起こったログを探します。


##３．エラー発見
![スクリーンショット 2020-10-21 9.50.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693227/85a7fa26-95ba-36c0-8a69-c07293556ce4.png)
エラーの内容から原因の仮説を立て、解決策を考えます。

##４．仮説
エラー内容はHeroku上にコメントテーブルが存在しないよとのことなので、Heroku上のデータベースにマイグレーションの内容が反映されていないと予測。
Heroku上でマイグレーションを実行を行えば、解決する可能性有り。

実際に検証します。
##５．検証

```terminal:terminal
heroku run rails db:migrate
```
実行後、再度アクセス。
無事解決！

#まとめ
Heroku上でエラーが起こった際の手順
大きく分けると3step
・エラーログを出力
・最新のエラーを発見
・仮説検証
以上です。


最後まで読んでいただきありがとうございます！
同じような課題にぶつかっている方のお役に立てれば、嬉しいです！
環境構築Ref完全版 -Bainfuck-

# Brainfuckとは？
難解言語。ふむふむ。8文字だけで構成。

|    |    |
| ---- | ---- |
|  >  |  Move the pointer to the right  |
|  <  |  Move the pointer to the left  |
|  +  |  Increment the memory cell at the pointer  |
|  -  |  Decrement the memory cell at the pointer  |
|  .  |  Output the character signified by the cell at the pointer  |
|  ,  |  Input a character and store it in the cell at the pointer  |
|  [  |  Jump past the matching ] if the cell at the pointer is 0  |
|  ]  |  Jump back to the matching [ if the cell at the pointer is nonzero  |



```
//Hello, World!をコードで書くと。
++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.
```

#Brainfuck 環境構築


### 1．Linux -Brainfuck-

```

//Linuxの場合
//ubuntuの例

sudo apt-get install bf

$ bf test.bf
Hello World
```

### 3．その他 -Brainfuck-

```
//Python
pip install brainfuck. 
pip install brainfuck-interpreter

//Rust
//インストール
cargo install brain-brainfuck

//実行
cargo run --bin brainfuck -- filename
```
Xcode、AppCodeで自動生成されるコメントを変更する

# 概要
Xcodeでファイルを新規に作成すると、以下のようなコメントがヘッダーに追加される。
本名が含まれる場合があるので、これを変更したい。

```
//
//  ContentView.swift
//  Shared
//
//  Created by [名前] on 2020/10/21.
//
```

# Xcode
以下にテンプレートのファイルのパスが複数示されている。
https://help.apple.com/xcode/mac/9.0/index.html?localePath=en.lproj#/dev91a7a31fc

この中の
User Xcode data: ~/Library/Developer/Xcode/UserData/IDETemplateMacros.plist
にファイルを設置すればよい。

1.ファイルを開く。

```bash
vim ~/Library/Developer/Xcode/UserData/IDETemplateMacros.plist
```

2.デフォルトのテンプレートは以下なので、これをコピペする。

```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>FILEHEADER</key>
	<string>
//  ___FILENAME___
//  ___TARGETNAME___
//  
//  Created by ___USERNAME___ on ___DATE___
//  ___COPYRIGHT___
//</string>
</dict>
</plist>
```


3.テンプレートを編集する。
名前を消したいなら「\__USERNAME__」を消せばよい。
他の項目を表示する場合、以下の変数を参考にする。
https://help.apple.com/xcode/mac/9.0/index.html?localePath=en.lproj#/dev7fe737ce0

これで完了。
Xcode上でファイルを新規作成すると、テンプレートに指定した通りのコメントが挿入される。

# AppCode
上記のXcodeと同様の手順では変更されない。
AppCodeの場合、以下の設定を編集する。
![スクリーンショット 2020-10-21 12.46.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/802246/cb05fab1-66f8-8e8b-4358-77e11d27e37b.png)

・ファイルテンプレートについての説明
https://pleiades.io/help/objc/using-file-and-code-templates.html

・変数の一覧
https://pleiades.io/help/objc/file-template-variables.html

Copyright~~の文は組織名($ORGANIZATION_NAME)が定義されていないと表示されない。
設定するには「⌘;」で設定を開き、GeneralタブからOrganizationを編集する。
吉報報告アプリをつくってみた！っていう話

コロナ渦の中、皆様いかがお過ごしですか？
少しでも元気になるシステム開発できないかな〜と思いまして、
吉報を全社で喜ぶためのアプリを開発しました。

プログラムの詳細は、書かないですが、どんな構成で作ったかを紹介します！
開発リミットが2日しかなかったので、作り込んではいないです。😣
（そのうちの1日はどんな音楽がテンション上がるかで費やしました。）

## 吉報を報告するアプリってどんなの？
チャットワークに、メッセージを送るとMacをつないでいるモニターにテンションが上がる音楽とともに吉報が報告されます。

![fanfare.mov.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116236/e1a27776-299e-143f-8fd9-0f13bca42592.gif)
※本来であれば、テンションが上がる音楽が流れます。

## アーキテクチャ
この構成はなんとサーバー代もかからず、**「完全無料」**です！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116236/a85cafbd-c7bb-e011-59c2-79a37ae0ab60.png)

①チャットワークの特定のスレッドに報告をする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116236/9ee3116b-a3b1-e3bb-f733-50837de4c6ae.png)

※あつまるBotに対してToをつけた場合だけ全社への報告になるようにしています🎉

②チャットワークAPIを受け取り、データを加工

③FirebaseのRealtime Databaseを更新

④Electronで作成したMacアプリ側で、データを受け取る

⑤Cloud StorageからBGMをダウンロードして音楽を流し、メッセージを画面に流す
※報告内容によって、ダウンロードする音楽を切り分けています。

## どこにつまづいたか
ブラウザに依存させず、Mac本体に制御を加えたかったので、Macアプリ作ろうと思い立ちました。
いろいろ方法はあるものの、久々に"Electron"を触ってみました。

#### 《つまづきポイント①》
Electron側のウィンドウの制御

イメージは下の図のようになっています。
透明な全画面ブラウザを上にマスクさせて、CSSでメッセージが流れる表現をしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116236/a0aceb66-f5e5-a54f-5813-a6fb0e479855.png)

Electronの画面の表現には慣れていなかったので、いろいろ苦戦しました。😅

- `mainWindow.setIgnoreMouseEvents(true);` ウィンドウをクリックできない状態にする
- `mainWindow.setAlwaysOnTop(true, 'floating');` ウィンドウを最前面表示

##### ウィンドウ制御周りのコード
```js
  // メインウィンドウを作成します
  let size = screen.getPrimaryDisplay().size; // ディスプレイのサイズを取得する
  mainWindow = new BrowserWindow({
    webPreferences: {
      nodeIntegration: true,
    },
    left: 0,
    top: 0,
    frame: false,       // フレームを非表示にする
    resizable: false,   // ウィンドウリサイズ禁止
    transparent: true,
    width: size.width,
    height: size.height,
    skipTaskbar: true,
    alwaysOnTop: true // 一番手前に表示する
  });

  // 全てのウィンドウに表示（フルスクリーン対応）
  app.dock.hide();
  mainWindow.setAlwaysOnTop(true, 'floating');
  mainWindow.setVisibleOnAllWorkspaces(true);
  mainWindow.setFullScreenable(false);
  app.dock.show();

  // マウスイベント無効化
  mainWindow.setIgnoreMouseEvents(true);
```

`app.dock.hide();`して、`app.dock.show();`する一連の流れについては、謎挙動。。。
しかし、この流れでなければ、最前面＆フルスクリーンは実装できませんでした。

#### 《つまづきポイント②》
つまづきポイントを書こうと思ったのですが、つまづきポイント①で書いたところ以外は、
特につまづきませんでした。。。とにかくFirebaseが便利すぎて、助けられました。


## 作ってみてどうだったか
このアプリを会社に導入してから、1日に8回くらい吉報が流れます。😆
多い時は、15回以上流れることもありました🎉

#### 《社内と気持ちの変化》
- 喜びを部署超えて、全社に共有できる（他の部署のことを知ったり、話すきっかけにもなる）
- テンションがあがり、早く吉報を報告したい気分になる

何より、使ってもらえることが作った側からすると一番嬉しいです☺️

## 今後の展望
吉報を報告した人、内容によって、BGMを分けたり、画面のギミックを変えたりできるともっともっとテンションが上がって、吉報を報告したい気持ちが高まりそう。
あとは、社内だけでなく、他の会社でもこのアプリを使ってもらえると嬉しいなと思います。
ぜひ、興味ある方、声かけてください〜😊
tcpdump で tos(DSCP) が入っているパケットだけをキャプチャする

# tcpdumpでdscpを見たい

L3DSRを使ってる会社にいるもので。 L2DSR → L3DSR の変更作業をしたときに使った。L3DSR パケットがLBから来てるか動作確認に便利。

```ruby
 tcpdump -v -i eth0 "tcp[tcpflags] & (tcp-syn) != 0" and ip[1]!=0
```


## 解説

```ruby
-v # これつけないとtosが見えない

-i eth0 # LBからはprivate IP宛に来るので、そのinterfaceを指定

"tcp[tcpflags] & (tcp-syn) != 0" # いったんSYNパケットだけに絞り込んでいる

ip[1]!=0  # これがtosがあるもの限定にしているところ。下の画像を参照
```

## ip[1] の意味

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24737/cf13f08c-2fc8-4828-aed7-a8abd6a4a7b9.png)
> http://darenmatthews.com/blog/?p=1199


## 特定のDSCP(TOS)だけにフィルタする

```ruby
tcpdump -v -i eth0 and "(ip and (ip[1] & 0xfc) >> 2 == 0x05)"
```

こんな感じで 0x05 の DSCPがあるものだけ見たかったんだけど、これでひっかかるパケットは全部 `tos 0x14` になってて、ふむぅとなった。でも0x05のところを違うのにすると引っかからないので取れてると思うんだけど。bit計算苦手すぎて何もわからない

→ 小林というスーパーエンジニアに教えてもらいました！ quitaにしてよかった！

> ToS field 8bitのうち先頭6bitを使うのがDSCPなので、
> 
> DSCP: 00101 = Decimal 5 = Hex 0x05
> ToS: 0010100 = Decimal 20 = Hex 0x14

それだ！！！！ DSCPとToSは違うんだった！ だからビットシフト `>>` してるtcpdumpが出てくるのか。
ありがとうございました！！！

# 以下はメモ

NIC > tcpdump > iptables なので、L3DSRで使う DSCP は tcpdumpで見れる。LBからくるパケットにDSCPが立っている。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24737/53383095-8df8-6b99-e143-0f2daa354d5a.png)
> https://hirose31.hatenablog.jp/entry/20090401/1238585753


## packet flow
1. client が LB に SYN を投げる
2. LB が DSCP=0xN にして server private IP へ。この時点でsrcがclientになっている
3. serverの中
    4. `NIC:eth0` が受け取る
        5. tcpdump にわたす
        6. iptables にわたす
            7. DSCPを見て、DADDRを書き換え
                8. このときDSCPは書き換えてないみたい、たぶん
            9. DADDRが eth1 宛なので、違う NIC にforwardする（ここの動きがよくわかってない） *1
        10. iptablesを出る
    11. `NIC:eth1`(これがDADDRのVIPを持ってる) が受け取る
        12. iptablesに入る
            13. 特に設定ないのでスルー
        14. iptableを出る
        15. processにわたす
        




*1 このNIC間転送の動きはよくわかってないけどたぶんこういうことなんじゃないだろうか。想像。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24737/0398319a-ffaa-9500-4215-2b62c373bb42.png)
> http://xkr47.outerspace.dyndns.org/netfilter/packet_flow/
Ubuntu20.04でワークスペース切替時のポップアップを無効化する


### 下記からExtenstionをONにする
https://extensions.gnome.org/extension/959/disable-workspace-switcher-popup/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293481/c98e9724-608b-c150-60c3-8f5c415e31d8.png)

### Tweaksの拡張機能の中から、`Disable workspace switcher popup` を有効化する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293481/3d018424-2cc8-05a5-fa98-ff0c93d03ebe.png)
【StereoDepth】PDS : SoftArgMinに代わるDisparity推定 

<h1>Practical Deep Stereo (PDS): Toward applications-friendly deep stereo matching</h1>
従来のDeepLearning baseにしたStereo MatchingではSoftArgMinが使われていた。

しかし、従来のSoftArgMinを使ってDisprityを求める場合に弊害が2つある

・お互いに離れた値のDisparityでMatching Costが高い場合、中途半端な位置にDisparityを推定してしまう。
・再トレーニングせずにモデルをより大きな視差範囲に適用したい場合は、推定精度が悪化する可能性がある。

これらを解消する為に
inference => Sub-pixel MAP
training  => Sub-pixel cross-entropy
の２つを提案する。

<h1>SoftArgMin VS Sub-pixel MAP(maximum a posteriori)</h1>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/21a0be30-3123-6d0a-783c-783ede43ac5f.png)

SoftArgMinは0~MaxDisparityまでのすべての値を考慮しているので中途半端な推定をすることがある。
それに対してSub-pixel MAPは最大値の近辺のみを見てDisparityを推定するので他のMatching Costが高い所に影響されずにDisparityを推定できる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/626db73d-c5f0-bdc0-22ed-bba71642e068.png)
d^がすべてのDisparityの中でProbabilityが最大時のDisparity。
d~がd^から+-δの範囲でSoftArgMinを行う。

δは4に設定されている 



*PはSoftMaxにより正規化されている。




<h1>L1 Loss VS Sub-pixel cross-entropy</h1>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/a5166297-1163-ee41-5188-51b875e26b9d.png)
普通にCross Entropy Lossを計算する。従来の方法では一つのDisparityの出力に対してLossを計算していたのに対して、全部のDisparityにおけるProbabilityの値をGround Truthからの距離を元にLossを計算している。
*PはSoftMaxにより正規化されている。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/6db8f09b-a05e-bacc-a6c3-dcae940d7ecc.png)
Qgt(d)は[Laplacian分布](https://en.wikipedia.org/wiki/Laplace_distribution)を表している。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/e02746f9-192b-326d-1b87-315981b0749f.png)

図のようにLaplace DistribuionがQgt(d)の式によって表されている。

<h1>結果</h1>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/e9ccd55f-e3c8-66fb-6e64-fb0ce7935c73.png)
Sub-Pix CrossEntropy LossはL1 Lossより早く収束しているらしい。

<h1>結論</h1>
Sub-pixel MAPを使う事で精度良く、様々な画像サイズの入力に対応出来るようになった。
Sub-pixel cross-entropyは全体のDisparityに対してLossを計算するのは面白いと思ったが、DisparityのGround Truthが必要という事はUn-Supervised Learningが出来なくなるので、汎用性は低いと感じた。

それとSub-pixel MAPをTrainingに使えたら面白いなと感じたので、実際に試してみたいと思う。


<h1>参考文献</h1>
Practical Deep Stereo (PDS): Toward applications-friendly deep stereo matching
https://arxiv.org/pdf/1806.01677.pdf
Reactとは何か？Reactの基本的な概念や使用するメリットについて解説

Reactとは何か？について、Reactを知らない方がざっくりと理解できるようにまとめてみました。

プログラミング初心者&初投稿なので至らない点もあると思いますが、
もし「ここが違うよ」という箇所があればご指摘いただけると助かります。


# Reactとは？
**Reactとは、Facebook社が開発したJavaScriptのライブラリです。**

Reactとよく比較されるVue.jsはフレームワークなので、
Reactも同じくフレームワークだと表現されることもありますが、厳密には異なります。

ライブラリとフレームワークの違いについてはこちらの記事がわかりやすいと思ったので、
気になった方は参照してみてください。
https://www.e-loop.jp/knowledges/32/


# Reactを使用する目的
具体的にReactは何をするためのものなのか？というと、
**Webのユーザーインターフェース（UI）を作るためもの**といえます。

つまり、ユーザーとサービスの接点となる、
ユーザーが見たり操作したりする部分（メニューやボタンなど）を作るために使用されます。


# Reactを使用するメリット
Reactを使用するメリットを3つ取り上げてみます。

**1. 動きが速い**
変更があった差分のみを再描画できるため、Webアプリケーションの動きを速くすることができます。

**2. 保守性が高い**
コードを編集するとき、どこを編集したら他のどの部分に影響するのかがわかりやすいため、
状態管理がしやすくなります。

**3. 再利用性が高い**
Webアプリケーションを構成する各要素を独立した部品として扱えるので、
それぞれの部品を複数の箇所で使い回すことができます。



# Reactの基本的な概念
### Virtual DOM（仮想DOM）
Virtual DOMとは、**Reactで使用する仮想のDOM**のことをいいます。

そもそもDOMとは何かというと、Document Object Modelの略で、
JavaScriptなどのプログラミング言語から、HTMLにアクセスする窓口のことをいいます。
Webサイトの中身を変更したいときは、このDOMを通してHTMLにアクセスして操作を行います。

通常のDOM操作では、中身が変更される度にブラウザをレンダリングするので、
変更する必要のないDOMまで再描画されてしまい、パフォーマンスが低いことが課題でした。

一方Virtual DOMは、**ブラウザのレンダリングとは別管理のため、
変更に必要なDOM（差分）だけを効率よく再描画でき、パフォーマンスの向上が期待できます。**

### コンポーネント

コンポーネントとは、Reactにおいて**UIを作る部品のようなものであり、
見た目と機能がセットになったもの**をいいます。

例えばあるWebサイトでメニューがあったとしたら、
そのメニューのまとまりを一つのコンポーネントといえますし、
その中にある一つ一つのメニューのボタンもコンポーネントといえます。

そして、**Reactはそれぞれのコンポーネントで自分自身の状態を管理し、状態が変わる度に再描画します。**

例えばチャットを例に考えると、チャットは新しいメッセージが送信されるたびに、
メッセージが下の方に追加されていきますよね。

これをReactで考えると、まずチャット全体の一つのコンポーネントがあり、
そのコンポーネントはチャットの中身の状態を持っています。

新しいメッセージが送信されると、チャットの中身は
今までのメッセージに新しいメッセージが加わった状態に変更されるので、
その変更された部分（差分）だけが書き換えられ、新しいメッセージが画面に反映されるというようなイメージです。

### JSX

JSXとは、Facebook社が開発した、**HTMLのような文法で書けるJavaScriptの拡張言語**です。
Reactを使う際は必ずJSXで書かなければいけないというわけではないのですが、
公式ドキュメントではJSXを使うことが推奨されており、業界標準にもなっています。

例えばJSXでは、以下のように記述することができます。

```react
const element = (
  <h1 className="greeting">
    Hello, world!
  </h1>
);
```
classの書き方などHTMLとは少し異なる部分もありますが、
**基本的にHTMLの書き方に近く可読性が高いため、広く使われている**ということですね。


# Reactの使用例
- Facebook
- Instagram
- Netflix
- Trello
- Slack
- Skype
- Airbnb

などなど、誰もが知っている大規模なアプリケーションでかなり多く使われています。
日本ではVue.jsの方が人気ですが、海外ではReactの方が人気だと言われています。


# 最後に
Reactは海外での圧倒的な人気に比べると日本ではそこまで浸透していませんが、
これからどんどん広まっていけばいいなと思います。

Reactに関するQiitaの記事もあまり多くないので、これから少しずつ書いていけたらと思います。

拙い文章でしたが、最後まで読んでいただきありがとうございました！


# 参考文献
React公式ドキュメント
https://ja.reactjs.org/

日本一わかりやすいReact入門#1...Reactの基礎知識
https://www.youtube.com/watch?v=Otrc2zAlJyM&list=PLX8Rsrpnn3IWKz6H5ZEPWBY8AKWwb9qq7

現代のフロントエンド開発でReactが使われる理由
https://www.youtube.com/watch?v=1kqu8TwZaZU

Reactとは
https://programmagick.com/sections/react/intro
LOCUSTをとりあえず動かすところまでの流れまとめ

##LOCUSTとは

負荷試験ツール
Pythonで簡単に定義できる

##環境
Python3.7
locust 1.3.1

##インストール
$ pip install locust

※locustioだとエラーで怒られるので注意

##locustfile.pyを作成

```Python
from locust import HttpUser, TaskSet, task, between, constant

class UserBehavior(TaskSet):
    
    @task(1)
    def search(self):
        self.client.get("/hoge", verify=False)

class WebsiteUser(HttpUser):

    tasks = {UserBehavior:1}
    wait_time = constant(0)
```

##コマンド実行
$ locust

##Webコンソール(GUI)起動
ブラウザで http://localhost:8089/ にアクセス

設定は上から順に

Number of total users to simulate(最大同時接続ユーザ数)
Spawn rate(1秒ごとに増やすユーザ数)
Host(負荷試験する対象URL)

Start swarmingで実行

##参考

https://locust.io/
https://qiita.com/naoki114/items/7ae5a045bb08c4950b04
CapistranoでEC2への自動デプロイ時、SSHキー認証エラーが出たときの対処法

## 共有すること
Railsで開発を行っていて、Capistranoを使用しAWSへの自動デプロイを実装しました。
あるとき突然、SSHキー認証エラーが起きてデプロイできなくなってしまったので、
その解決策を簡単に共有します。

## エラー内容
```
$ bundle exec cap production deploy
```
でデプロイ実行時、以下のようなエラーが出ました。

```
SSHKit::Runner::ExecuteError: Exception while executing as ec2-user@ElasticIP: Authentication failed for user ec2-user@ElasticIP
```

## 解決策
ターミナルを再起動するとsshキーが消えてしまうようなので以下のようにすることで、登録し直しが必要でした。

ターミナルのローカルで

    $ eval \`ssh-agent `
    $ ssh-add -K ~/.ssh/<キーの名前>.pem

このようにすることで、sshキーを保存しておくことができまして、無事にデプロイできました！

##会社の紹介
私は現在、[株式会社ダイアログ](https://www.dialog-inc.com/)という物流×ITの会社に勤務しております。
2020年10月現在、エンジニアの募集はしていませんが、他にも様々な職種を募集しているので、[Wantedly](https://www.wantedly.com/companies/company_3244501)のページをご覧ください。
Xplenty : Google Analyticsコネクターの設定

今回はGoogle Analyticsの設定について解説します。

#1. 新しいコネクションを作成する
コネクターの作成画面からGoogle Analyticsを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65461/bd91d4cc-a4cd-572c-e0f5-e850bdd40fb0.png)

Aucenticate buttonをクリックし、Google Analyticsにログイン可能なアカウントのログイン情報を入力し、コネクションを作成する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65461/2d912e87-a4cf-319a-7e5c-ee5a599c1a27.png)

#2. パッケージ作成

パッケージの作成画面でAdd ComponentからGoogle Analyticsを選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65461/5e05ae7f-0add-41ed-13b2-16176d78a4e0.png)
##日付範囲の設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65461/317f8beb-4f98-46c8-e4a1-9b5a64b817d9.png)

TodayやYesterdayの基準はGoogle側のView profileに設定されているタイムゾーンをベースに取得します。
例：View profileのタイムゾーンが日本時間でコネクタの期間で「Today」を設定した場合、日本時間の今日の日付がセットされる

**ヒント**： 変数をセットすることでより動的な日付範囲の指定が可能です。以下は変数を使用する際の注意点です。
1. 日付の変数値は、Google Analytics側の日付フォーマットに従い、yyyy-MM-ddの形式の値となるようセットする。
2. 変数をセットした場合、ソースコンポーネントでデータプレビューを行えないので注意。（ジョブ実行時のみ、変数が適用されるため）
変数の指定方法に関する詳細は[こちら]を参考ください。(https://qiita.com/Azabu10ban/items/5604aa3c11bf8e2ed9d7)

##Filterの設定
Filterの設定はGoogle Analytics APIの設定に従い、設定する
例:国=日本のみ
`ga:country==Japan`

例:複数キャンペーンを指定
`ga:campaign==jp_fb,ga:campaign==9590111111`

##Sort（並べ替え）
例：キャンペーン,国の順で並べ替える場合
`ga:campaign,ga:country`

##サンプリングレベル
データ取得時のサンプリングレベルを指定します。

|GAサンプリングレベル | Xplenty側の設定 |説明 |
|:-----------|:------------|:------------|
| DEFAULT   |Default  |速度と精度のバランスがとれたサンプルサイズでレスポンスが返されます。 |
| FASTER    |Small    |サンプルサイズを小さくすることにより、高速なレスポンスが返されます。   |
| HIGHER_PRECISION   |Large |サンプルサイズを大きくすることにより、より正確なレスポンスが返されますが、レスポンス速度が低下する可能性があります。|

##列を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65461/447edc15-127f-67da-4ee5-d3c89e09379f.png)


#Google Analyticsの値とコネクタで取得した結果が違う場合の調査方法
[Query Explorer](https://ga-dev-tools.appspot.com/query-explorer/)を使用して確認する。
ヒント：Query Explorerと比較する際は、コネクタと同じDimensionとMetric、Filter、サンプリングレベルを指定して結果を比較すること。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65461/f1e754f6-e1d2-9b38-08b2-b00113c21470.png)
[Android]Android Studio 4.1でのショートカットキー割り当て

# 概要
なんか従来使えてたショートカットの割り当てのデフォルト設定が違うみたいで、
確認したら``IntelliJ IDEA Classic``になってる・・・

MacOSにしてあげればOK!

# やり方
メニューのAndroidStudio > Preferences > Keymapで、ドロップダウンリストからMacOSを選ぶ > OK押下

でおしまい。
petalinux (2019.2) でcannot set terminal process group (-1): Inappropriate ioctl for deviceの対処法

環境はVitis2019.2, Vivado2019.2, Petalinux2019.2, Ubuntu18.04.5 LTS
ターゲットボードはZC706, SDカードブートです


```shell-session:ttyUSB0
Freeing unused kernel memory: 1024K
mmc0: new high speed SDHC card at address 1234
Run /init as init process
mmcblk0: mmc0:1234 SA08G 7.25 GiB
Failed to execute /init (error -13)
Run /sbin/init as init process
Run /etc/init as init process
Run /bin/init as init process
Run /bin/sh as init process
 mmcblk0: p1 p2
sh: cannot set terminal process group (-1): Inappropriate ioctl for device
sh: no job control in this shell
sh-4.4# ls
bin   dev  home  lib    mnt   root  sbin  tmp  var
boot  etc  init  media  proc  run   sys   usr
sh-4.4#
```

ぐぐってみると同じ症状の人がいました。
https://www.twblogs.net/a/5db28773bd9eee310ee61b31
https://blog.csdn.net/wmdscjhdpy/article/details/102724794


(原理はよくわかりませんが) Vivadoのbitstream生成からpetalinuxのプロジェクト生成も含めてやり直せばいいみたいです。

私の環境ではこれでうまく行きました。そもそも同じ症状の人があまり見つからなかったのでもしかしたら他にも原因があるかもしれません。もし見つかったら追記します。