OmniAICreator/Qiita-1.07M huggingface dataset:
USBサーモグラフィモジュールOTK-THG02をProcessingで使う

# 概要
![IMG_1022.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76572/98034f67-4709-2ea7-abd3-63edb665bca6.jpeg)

USBサーモグラフィモジュールがシリアル通信できるとのことなのでProcessingで動かしてみます．
参考
* https://oaktree-lab.com/resources/index.html
* https://qiita.com/xshell/items/da3f9f3401898f4b37c8
* https://processing.org/reference/libraries/serial/index.html

# 環境
MacBookPro Mojave(公式のアプリはwinのみですが，シリアル通信で値をもらうのでMacでもできますね) 
サーモグラフィモジュール v1.1.2(ボードに記載)
Processing v3.5.3
serialライブラリ 

# セットアップ
参考にさせていただいたQiitaの記事とセットアップは同じです
詳細はそちらを参考にしていただければと．．．
* 裏側をハンダしてシリアルモードに
* ピンソケットもつける
* USBシリアル変換モジュールを利用してArduinoのシリアルモニターで通信確認

![IMG_1024.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76572/7ecb6ba7-ee52-4d17-ba7b-8e7d239cd016.jpeg)
![IMG_1025.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76572/587acc44-9719-b26a-1d7f-a6bb1a62ae75.jpeg)


# Processingでやってみる
そのままUSBシリアル変換モジュールをつけたまま以下のコードで実行

``` java:sketch.pde

import processing.serial.*;

Serial myPort;
boolean serialOK = false;

int [][] temp = new int[16][4];
int tempY = 0;

void setup() { 
  size(320, 80);

  printArray(Serial.list());
  String portName = Serial.list()[2];
  myPort = new Serial(this, portName, 38400);
  myPort.bufferUntil('\n');//"\r"

  frameRate(2);
  noStroke();
}

void draw() {
  if (serialOK == false) {
    myPort.write("\r\n");
  } else {
    myPort.write("READ\r\n");
  }

  for (int yy=0; yy<4; yy++) {
    for (int xx=0; xx<16; xx++) {
      float t = map(temp[xx][yy], 200, 400, 0, 255);
      fill(t);

      rect(xx*20, yy*20, 20, 20);
    }
  }
}

void serialEvent(Serial thisPort) {
  String str = trim(thisPort.readString());

  //println(str);
  //if (str == "OK") { //条件に入らない
  if(str.equals("OK")) {
    serialOK = true;
    //tempY = 0;
  } else {
    //println(str);
    for (int i=0; i<16; i++) {
      temp[i][tempY] = int(str.substring(i*5, (i*5)+5));
    }
    tempY++;
    if (tempY >= 4) {
      tempY = 0;
      //println("---------------");
    }
  }

  //println("---------------");
}

```

> String portName = Serial.list()[2];

この部分をprintArray(Serial.list());によって表示されている「usbserial」から始まっている名前の番号にします
例えば自分は
<img width="305" alt="スクリーンショット 2019-07-03 17.46.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76572/ec7e95c3-dfbf-3c1a-b467-baa2660cca0e.png">
こんな出力がされていたので「2」にしました

## 実行画面
<img width="320" alt="スクリーンショット 2019-07-03 17.04.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76572/2785225d-5897-5e1b-edcd-106b006a51b6.png">

実際のカメラ映像と重ねないとよくわからないですね
実際は天井の蛍光灯の熱が白く縦に伸びています
熱があると白くなっているようにしています．．．

次からArduino Yunにつけて部屋に常駐させといてAmbientあたりにデータ送って監視＆可視化でもしようかなぁ
インストールされているJDKのバージョンと有効になっているJDKのバージョンを確認する

# 1. インストールされているJDKのバージョンを確認する

## 以下のコマンドを実行します。

```
/usr/libexec/java_home -V
```

## 実行結果

```
$ /usr/libexec/java_home -V
Matching Java Virtual Machines (3):
    12.0.1, x86_64:	"AdoptOpenJDK 12"	/Library/Java/JavaVirtualMachines/adoptopenjdk-12.jdk/Contents/Home
    11.0.3, x86_64:	"AdoptOpenJDK 11"	/Library/Java/JavaVirtualMachines/adoptopenjdk-11.jdk/Contents/Home
    1.8.0_212, x86_64:	"AdoptOpenJDK 8"	/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home

```

# 2. 有効になっているJDKのバージョンを確認する

## 以下のコマンドを実行します。

```
java -version
```

## 実行結果
```
$ java -version
openjdk version "12.0.1" 2019-04-16
OpenJDK Runtime Environment AdoptOpenJDK (build 12.0.1+12)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 12.0.1+12, mixed mode, sharing)
```
[IntelliJ]sbtプロジェクトのデバッグのやり方

# IntelliJでデバッグモードのやり方
ちょっとした設定が必要になってきます。簡単なので、1分で終わらせましょう。

## 準備
右上のセレクトボックスの、EditConfiglationを選択
<img width="236" alt="スクリーンショット 2019-07-03 17.30.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178351/008b2c2e-f4bb-de4d-bc72-c7b433f068cf.png">

＋ボタンから、Remoteを選択
<img width="506" alt="スクリーンショット 2019-07-03 17.31.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178351/bacff176-162c-0f3a-3e9a-3a0b8df971d8.png">

適当に設定する
<img width="789" alt="スクリーンショット 2019-07-03 17.31.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178351/0e18d2bd-ca00-2567-3e9f-18ef8ac10cac.png">

* Name : HogeとかでOK
* Port : 9999がわかりやすくておすすめ
* 他はデフォでOK

これでデバッグを見る準備はできたので、sbtの起動コマンドにこちらのデバッガを読み込ませる

起動時のコマンドに `-jvm-debug 9999` を追加

```
sbt run -jvm-debug 9999
```

起動時に以下のログが出れば、9999のデバッグ用のポートが開いている

```
Listening for transport dt_socket at address: 9999
```

右上のdebugを意味する虫マークを押す

<img width="361" alt="スクリーンショット 2019-07-03 17.34.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178351/b0d5d32b-49f7-f526-79a1-a4d14ffc5fba.png">

下に以下のメッセージが出たら、IntelliJのデバッガーが動作できています

<img width="765" alt="スクリーンショット 2019-07-03 17.36.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178351/518c6752-74f7-ab66-5f40-99df3e6c3aa2.png">

ここまでで準備はOK！

# 実際にどうやってDebugするのか
BreakPointを設定しましょう。左の行数の右らへんの隙間をクリックすると出ます

<img width="147" alt="スクリーンショット 2019-07-03 17.38.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178351/940e672e-fef9-6927-6f6e-5cb4f3c156b2.png">

* 赤いマークがついたらOK

あとは実際にリクエストを送るなりして、処理を実行しましょう！

BreakPoint貼ったところで処理が止まり、デバッグモードが表示されればOKです。
下のタブのDebugに,BreakPoint時点でどの変数に何が入っているのか、どこに分岐したのかとかがいい感じに表示されます。

確認できたら、左側の矢印マークで処理を実行したり、止めたり操作できます。

<img width="51" alt="スクリーンショット 2019-07-03 17.42.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178351/d1e77978-1ce2-c228-322e-a96a62006118.png">
Redmine管理者がアカウント誤爆を防ぐためにやったこと

![](http://redmine.jp/styles/images/redmine-logo@2x.png)

# Redmineおじさんの苦悩

Redmine には「システム管理者」という権限があって、とても強い権限です。
このアカウントは何でもできてしまいます。

## 起こったこと

メンバーから、「チケットを〇〇から〇〇に変更できません」という質問が沢山きます。確認すると、「あれ、Redmineおじさんはできるぞ？」

## やったこと

### テスト用のメンバーアカウントを作る

まぁ、ほぼ運用しないのでユーザーIDとパスワード忘れるよね ←

### 管理者アカウントと自分のアカウントを分ける

これに落ち着きました。root権限で作業しないのは常識ですし

## 次に起こったこと

<img width="237" alt="スクリーンショット 2019-07-03 17.27.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54261/12c388b3-4422-ade2-1eff-6f7a29cc9b4d.png">

管理者アカウントのままチケット更新してしまいました。

だれが更新したかすらわからなくなるので最悪です

## 次にやったこと

### アカウントでテーマを分ける

この記事で一番書きたかったのはこれです。

Redmineはデフォルトでは管理者がテーマを設定し、全ユーザーが共通したUIになります。

プラグインを導入することで、ユーザーがインストール済みのテーマを撰んで設定できるようになります

視覚的に今どのユーザーでログインしているか明確になるので、これ以降、誤爆はなくなりました

#### ユーザーが個別にテーマを選択できるプラグインの導入

このプラグインを入れます

https://www.r-labs.org/projects/themechanger

#### テーマのインストール

配布されているテーマを下記のRedmineディレクトリに配置するだけです

```
redmine/public/themes
```

これで「個人設定」で好きなテーマをユーザーが設定することができます

#### 操作用アカウントと管理用アカウントで明らかにデザインが違うテーマを選択する

直感的にわかるって大事

# 最後に

アカウント誤爆したことがある管理者のかたはご検討ください。ハッピーRedmineライフを。
GROMACS の xtc を自分の C++ プログラムで読む

GROMACS の xtc ファイルを自分の C++ プログラムで読む方法を紹介します。
既存のプログラムではサポートされていない独自の解析方法を試したい・・・という時に役に立つでしょう。

以下の前提で書いています。

- Linux 環境
- GROMACS はインストール済み
- GROMACS のコンパイルにはインテルコンパイラを使用している

GROMACS のインストールについては以下のリンクが参考になるでしょう。
[Gromacs 2019.3をmacOS / Linux上にインストール](https://qiita.com/Ag_smith/items/2432375399e7d7868138)
[Gromacsのインストールとパフォーマンスの検証 on Docker and CentOS 7](https://qiita.com/hnishi/items/aef88a29c9f609efa4cb)

# サンプルソースコード

```C++:sample.cpp
#include <iostream>
#include "gromacs/fileio/xtcio.h"
using namespace std;
int main (int argc, char** argv)
{
        t_fileio* fi = open_xtc(argv[1], "r");

        int n;

        gmx_int64_t step;

        real time;
        real prec;

        matrix box;

        rvec *x;

        gmx_bool bOK;

        // 原子数もここでゲット
        read_first_xtc(fi, &n, &step, &time, box, &x, &prec, &bOK);

        cout << "REMARK natom = " <<  n << '\n';

        read_next_xtc(fi, n, &step, &time, box, x, &prec, &bOK);

        cout << "Time: " << time << '\n';
        cout << "Step: " << step << '\n';
        cout << "Prec: " << prec << '\n';
        cout << "boxx: " << box[0][0] << '\n';
        cout << "boxy: " << box[1][1] << '\n';
        cout << "boxz: " << box[2][2] << '\n';
        cout << x[0][0] << '\n';
        cout << x[0][1] << '\n';
        cout << x[0][2] << '\n';
        cout << x[1][0] << '\n';
        cout << x[1][1] << '\n';
        cout << x[1][2] << '\n';

        close_xtc(fi);
}
```
# Makefile
```makefile:makefile_sample
TARGET=sample.x

CXX=icpc

CXXFLAGS= -O3 -std=c++11 -I/home/hoge/include -L/home/hoge/lib -I/home/hoge/gromacs-2018.3/src -L/home/hoge/gromacs-2018.3/build/lib

LIBS= -lgromacs

SRCS = sample.cpp

OBJS = $(SRCS:.cpp=.o)

HEADS=

$(TARGET): $(OBJS) $(HEADS)
             $(CXX) $(CXXFLAGS) -o $(TARGET) $(OBJS) $(LIBS)

clean:
        rm -f $(OBJS) $(TARGET)
```

GROMACS の共有ライブラリの場所は、インストール時の設定で変わるので適当に設定する。

# コンパイル
```
$ make -f makefile_sample
```
# 実行
```
$ ./sample.x foo.xtc
```
実行時に
*error while loading shared libraries: libgromacs.so.3: cannot open shared object file: No such file or directory*
というエラーが出る場合、環境変数 LD_LIBRARY_PATH に、共有ライブラリがあるディレクトリへのパス（今回の場合は /home/hoge/gromacs-2018.3/build/lib）を追加する。
Plotlyで半透明で連続的なエラーバーをつける

# やりたいこと

[こういう感じのグラフ](https://plot.ly/python/continuous-error-bars/)を書きたい．
![スクリーンショット 2019-07-03 17.24.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186209/978f2e1e-47d6-02a2-e52f-9befe87756de.png)


# 環境
``` shell
Python 3.6.5
plotly 3.3.0   
```
# 前提
平均値の時間変化をプロットする．
各時点におけるデータのばらつきとして標準偏差もみたい．

# コード

## エラーバー
```python
trace = go.Scatter(
    x = time,
    y = mean,
    error_y = dict(
        type="data",
        # エラーバーとして，各時系列における標準偏差を使用する
        array=std_dev,
        visible=True
    ),
    name = "trace",
)
data = [trace]
py.iplot(data, filename="basic-line")

```
![スクリーンショット 2019-07-03 17.15.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186209/618cca17-0ee9-d59a-f2d8-0237c4878fae.png)

ごちゃごちゃしてる

## 連続的に表示
これを実現するにはFillオプションで塗りつぶしの設定をする必要がある．
https://plot.ly/python/filled-area-plots/ に詳細あり．

```python
trace_upper = go.Scatter(
    name = "upper",
    x = time, 
    y = mean + std_dev,
    line=dict(width=0),
    fillcolor = 'rgba(31, 119, 180, 0.3)',
    fill = "tonexty"
)

trace_mean = go.Scatter(
    name = "trace",
    x = time, 
    y = mean,

    line=dict(color='rgb(31, 119, 180)'),
    fillcolor = 'rgba(31, 119, 180, 0.3)',
    fill = "tonexty"
)


trace_lower = go.Scatter(
    name = "lower",
    x = time, 
    y = mean - std_dev,
    
    line=dict(width=0)
)
# データに収納する順番が重要(下から？)
data = [trace_lower, trace_mean, trace_upper]
py.iplot(data, filename="basic-line")
```

![スクリーンショット 2019-07-03 17.40.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186209/4c929fb9-d8d6-09e1-b3c4-9714f36bc290.png)
未だにShift-JISに苦しまされた話

# 未だにShift-JISに苦しまされた話
かつて担当していたシステムはWindowsサーバー上で動くシステムで文字コードMS932だったため、
全角チルダ問題だのJIS第三・第四標準漢字だのに散々悩まされました。

が、今実装しているシステムは新たにUTF-8を利用して作り直しているので、もう心配はありません。
文字コード問題は過去のものになったのだ、と昨日までは思っていました。

## ExcelはCSVをShift-JISで開く
今作っているシステムは機能要件としてCSV出力が必要でした。
当然、出力する文字コードはUTF-8です。
人名も想定される出力データに含まれるのでShift-JISはあり得ません。

が、システムを利用してもらったところ、
「Excelで開いたら文字化けする」との苦情が入ってきました。

自分のPCにExcelを入れていないの手元で確認はできないのですが、
ExcelはCSVファイルを問答無用でShift-JISと見做して開くようです。
[10年以上前から問題として挙がっている](http://mism.blog13.fc2.com/blog-entry-202.html)らしいのに未だに変えていないとは…。
自動判定するかせめてLibreOfficeみたいに開く前に確認ダイアログくらい出して欲しいものです。

### 対応策
とりあえず先頭にBOMを付ければさすがにUTF-8として認識するようです。
とはいえ、今回はたまたま大丈夫だったものの、CSVを他のシステムに連携した場合などのことを考えると、BOM付は事故が起こりそうで正直怖いです。
ASCII互換もなくなりますし(まぁASCII互換性を利用したことはありませんが）

## 他のメジャーどころのUTF-8対応していないもの
Lhaplusがzip解凍のファイル名をShift-JIS固定にしているので、ここもたまに事故ります。
ついでに、こちらは本当にSJIS固定なので、zip圧縮時の指定を変えるか別のアーカイバを使ってもらうしかありません。

## まとめ
* ExcelでUTF-8のCSVを開きたい場合は要BOM
* Web側だけUTF-8化しても文字コード問題とお別れできるとは限らない
DMS（AWS Database Migration Service）メモ

# 参考
[AWS Database Migration Serviceを使ったデータ移行手順まとめ(OracleからMySQL編)](https://dev.classmethod.jp/cloud/aws/data-migration-from-oracle-to-mysql-with-dms/)
[AWS DMSでオンプレミス OracleSE1からRDS for OracleSE1移行時のハマったところなど](https://qiita.com/yoshihito/items/e7eb7c695c56d2bffb86)
[AWS Database Migration Serviceを試してみた](https://dev.classmethod.jp/cloud/aws/lets-try-aws-database-migration-service-dms/)
[【新機能】AWS DMSでMulti-AZと継続的レプリケーションをサポートしました](https://dev.classmethod.jp/cloud/aws/aws-dms-multi-az-ongoing-cdc/)
[【準備編】Database Migration Serviceにチャレンジ！](http://blog.serverworks.co.jp/tech/2017/04/12/dms-beginner-1/)
[【移行編】Database Migration Serviceにチャレンジ！](http://blog.serverworks.co.jp/tech/2017/10/13/dms-beginner-2/)
[【事前チェック編】OracleをDMSで移行してみる](http://blog.serverworks.co.jp/tech/2017/07/27/post-57556/)
[【前準備・実行編】OracleをDMSで移行してみる](http://blog.serverworks.co.jp/tech/2017/08/17/post-58811/)
[AWS Database Migration Service（DMS）入門 その1（準備編）](http://blog.serverworks.co.jp/tech/2018/04/11/dms-tutorial-01-create-stack/)
[AWS Database Migration Service（DMS）入門 その2（スキーマ変換編）](http://blog.serverworks.co.jp/tech/2018/04/11/dms-tutorial-02-sct/)
[AWS Database Migration Service（DMS）入門 その3（データ移行編）](http://blog.serverworks.co.jp/tech/2018/04/11/dms-tutorial-03-data-migration/)

# メモ
DMSによる移行の制限

>DMSでは、例えば以下のようなものは移行できません。DMS以外の方法で移行する必要があります。

>- ビュー、ストアドプロシージャ・トリガ・シノニムなどのオブジェクト
>- 表領域・ユーザ・ロールなどのスキーマ定義情報

>また、差分移行では以下のような更新をキャプチャして移行することはできません。
>参考: [AWS Database Migration Service のソースとしての Oracle データベースの使用](https://docs.aws.amazon.com/ja_jp/dms/latest/userguide/CHAP_Source.Oracle.html)

> - パーティション・サブパーティションにたいする ADD、DROP、EXCHANGE、TRUNCATE 等のデータ変更は移行できない
> - ALTER TABLE ADD DEFAULT <> を用いると、ターゲットDBにデフォルト値が移行されず、新しい列は NULL になってしまう
> - CREATE TABLE AS SELECT … ではデータが複製されず新しいテーブルのみ作成される
> - Oracle DBMS_REDEFINITIONパッケージにより生じた変更(テーブルメタデータやOBJECT_IDの変更など)は移行されない
> - LOBの更新（デフォルトでは移行できないが、Oracleのバージョンによっては移行できるようにする方法もある)
【無料】ブロックチェーンを学べるおススメ学習サイト2つ


##はじめに

私がブロックチェーンを学ぶのに利用した学習サイトを紹介します。
無料コースの内容でも概要知識は十分身につくので、
10年後、社会インフラになり得るブロックチェーンについて、
まずは基礎知識だけでも抑えておきたい方々におススメです。

#1.PoL(ポル)_学んでトークンをもらえるサイト
2019年6月13日にサービスを開始したばかりの
ブロックチェーン基礎知識学習サイトです。
###<b>今のところ一番おススメです</b>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445854/be9bd705-140d-7416-5a30-86f766c0f53a.png)
###[HPはこちら](https://pol.techtec.world/)
学習量に応じて、PoL(Ploof of Learning)と呼ばれる
トークン(≒ポイント)が貰えて、その量が学習量の証明となります。

学歴や卒業証明など、個人の学習履歴をブロックチェーンで担保するという
思想の元生まれたサービスらしく、将来的にはPoLの量に応じて
案件のスカウトやライター依頼などを出すサービスに展開する向きのようです。

事業者向けの英会話実践コース以外の基礎知識コースはすべて無料、
かつ、他のサイトにはない仮想通貨周りの税制に関する内容も
網羅しており、ざっくりした基礎知識を身に着けるには一番いいサイトです。

#2.Aidemy
有名なサイトですが、ブロックチェーンについても講座が用意されています。
内容はやや難しめのエンジニア向け。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445854/cd2a7be0-b283-fd9b-a8ad-4fc4fc300601.png)
###[HPはこちら](https://aidemy.net/)

ブロックチェーンの構造やPoWなどのアルゴリズムについて、
実際のコードを書きながら学べるので、プログラミングの勉強も兼ねて
技術的な深掘りがしたい方におススメです。
(ただしぱっと見じゃ理解できないと思います）

無料コースは第1回講座のみですが、
新規登録の方は有料コース1回分のクーポンが貰えます。


#おまけ
ブロックチェーンをプロゲートみたいに学べるサイト
https://enterchain.online
直感的にブロックチェーンを体験できるサイト
https://blockchaindemo.io/
ざっくり仮想通貨のトレンドを追いたい人
https://cryptogo.jp/
ビットコイン以外の仮想通貨、アルゴリズムに興味ある人
https://manepi.jp/consensusalgorithm/
がっつりブロックチェーンを構築してみたい人
https://postd.cc/learn-blockchains-by-building-one/

#最後に
解説サイトは王道のビットコインをベースに紹介していますが、
Ethereumのスマートコントラクトやコンソーシアムチェーンなど、
インフラやtoBのサービス開発に適した仕組みはまだまだ存在しています。

黎明期のブロックチェーンについて、「仮想通貨、バカのやるやつだよね」で
終わらせずに、ちゃんと知識として理解し、世の中のトレンドを追えるだけの
情報をみんなで共有していけたらいいなと思います。以上です。
もっと詳しく!!httpd.conf!!

# httpdの細かい設定をちょっとだけ知った。
オンプレで動いているhttpdをawsで再現する必要があったので、configをdiffとって色々調べながら書いたので、そこで知ったものの覚書です。

## ServerTokens
下記の設定をすることで、httpdに直接アクセスした際の公開情報を制限してくれます。本番はProdで1番情報量の少なくなるようにするわけですね。今回はこいつを設定しました。デフォルトだと、OSが設定されていました。

###Prod［uctOnly］
「Server:Apache」とApacheであるということのみを表示

###Min［imal］
「Server:Apache/1.3.37」のようにApacheのバージョンまでを表示

###OS
「Server:Apache/1.3.37(Unix)」のようにApacheのバージョン情報に加えOS情報まで表示

###Full（デフォルト）
「Server:Apache/1.3.37(Unix) PHP/4.3.9」のようにApacheのバージョン、OS情報に加え、モジュール情報を表示

## Ifmodule
httpdのチューニング用のディレクティブになります。

```
<IfModule mpm_prefork_module>
    StartServers 400　←起動時に生成される子サーバプロセスの数。デフォルトは5。
    MinSpareServers 400　←アイドル状態にいる子サーバプロセスの最小（希望）個数。デフォルトは5。
    MaxSpareServers 400　←アイドル状態にいる子サーバプロセスの最大（希望）個数。デフォルトは10。
    ServerLimit 400　←MaxClientsに指定可能な値の上限。（MaxClientより大きな数にする）
    MaxClients 400　←応答できる同時リクエスト数。デフォルトは256。
    MaxRequestsPerChild 80　←個々の子サーバプロセスが扱うことのできるリクエストの総数。デフォルトは10000。0にすると無制限
</IfModule>
```

## Include
> 「Include」は他に用意された設定ファイルを取り込む場合に使います。

だそうで、私の場合、独自にvirtual hostを切ってある設定を読み込ませるためにこのディレクティブが使われていました。サイトの本体を見つけるためにもこのディレクティブを発見して、virtual hostのパスを確認するのは有効です。
JuliaGPU / CuArrays で関数を GPU に対応させる

# 背景

GPU カーネル内では GPU に対応した関数しか利用できない。
`Base.sin` や `Base.exp` は GPU 互換ではない。
`CUDAnative.sin` などが GPU 用の関数である。

カーネル内で素直に `sin` と書いて済ませるにはどうしたらよいか？

How to write generic CPU/CUDA code?
https://github.com/JuliaGPU/CuArrays.jl/issues/283

参照元のページでは、主に配列のベクトル演算が想定されている。
そこでは、「関数を GPU に対応させる」という処理が行われている。
この処理を GPU カーネルを書くときにも適用できるのでは、という着想。


# 関数を GPU 用に置き換える

まずは詳しい挙動を見ていこう。

```julia
CuArrays._cufuncs # GPU 用に変換が必要な関数の一覧
# [:cos, :cospi, :sin, ...]

CuArrays.cufunc(sin) == CUDAnative.sin
# true

CuArrays.cufunc(sin) == Base.sin
# false
```

https://github.com/JuliaGPU/CuArrays.jl/blob/master/src/broadcast.jl


# 定義した関数内すべてで置き換える

`CuArrays.@cufunc` マクロで実現できる。

```julia
using GPUArrays, CuArrays

# CPU (dummy)
function kernel() end

# GPU ('cu'-prefix is automatically added to the function name)
CuArrays.@cufunc function kernel(state, y, x)
    i = @linearidx y state
    @inbounds y[i] = sin(x[i])
    return
end

x = CuArrays.rand(10)
y = similar(x)

gpu_call(cukernel, y, (y, x), ((1,), (32,)))

Array(y) ≈ sin.(Array(x))    # true

```

- あらかじめ同名の関数の宣言が必要（引数がなくても動作している）
- 関数名の前に `cu` が付加される
Githubまたはローカルのnpm のパッケージをinstallする方法

# はじめに

`npm`パッケージを作ろうとした時、公開前に手元のプロジェクトへインストールして動作を試す方法が分からなかったので調べてみました。

# Githubからインストール

```sh
$ npm install account_name/repository_name
```

## ブランチを指定する

```sh
$ npm install account_name/repository_name#master
```


## フルパスでインストール

Github のページにある `Clone or download` でコピーしたURLを
`npm install git+` の後に貼り付けるだけ

### HTTPS

```sh
$ npm install git+https://account_name/repository_name.git
```

### SSH

```sh
$ npm install git+ssh://git@github.com:account_name/repository_name.git
```

# ローカルからインストール

ローカルにあるファイルパスを指定

```sh
$ npm install ../local_package_name
```

直接参照する訳ではなく、そのままコピーされてnode_modulesに入る。

# 最後に

`npm install` は `npm i` と省略できます。
Railsのgemを作るみたいに、ローカルから参照しながら作りたい。
（ローカルのbuildしたファイルを直接指定するとエラーが起きた。）

# 参考文献

- [Github上にある最新のnpm packageをインストールする方法 - Qiita](https://qiita.com/DQNEO/items/d166e25449124a3f2b4d)
- [Githubにあげた個人のnpmパッケージをインストールする方法](https://qiita.com/wintyo/items/9ce2110f08b9776fe87f)
- [Babelを使っているプロジェクトをgitリポジトリからnpm installする方法 - Qiita](https://qiita.com/ottijp/items/7904e41cb0c80da2b87a)
- [npm install で github のリポジトリからインストールする - Hatena Blog](http://secret-garden.hatenablog.com/entry/2017/10/11/140540)
フロントエンドのプロ直伝！ CSS余白設定の三原則（＋線の引き方）

# 前置き
CSSでの余白の取り方について、後輩に「margin-topとmargin-bottomどっち派ですか？」と聞かれたので、
回答内容を記事として残します。

昔、会社のOJTで学んだことの共有となります。

# 原則
## 1. 基本的にmargin-topを使う
理由としては、そちらの方が後々調節しやすいからです。
また、後述の優先度で設定していけば、margin-bottomの出番はほぼなくなります。

## 2. どうしても無理な場合にbottomを使う
margin-bottomは他の方法ではどうしても設定が無理なケースのみ使いましょう。

## 3. 隣接セレクタをうまく使うとトルツメしやすい
特定の要素同士が並んだ時だけマージンを取る＝余白の打ち消し設定が不要になります。

# 設定の優先度
要素がいくらネストしても下記の優先度は変わりません。
この優先度で余白を設定していけば、margin-bottomの出番はほぼ無くなります。

1. 親要素のpaddingで周囲（上下左右）の余白を取る。
2. 1の設定では不可能な、子要素間の余白をmargin-topで取る。

# 隣接セレクタの使い方
主に`<li>`や`<section>`の繰り返しで列挙する場合に使います。
トルツメを考慮する場合に出番が多くなります。

## Bad
特定のクラスに一律でmargin-topを設定した上で打ち消している

```css
.item {
  margin-top: 10px
}

.item:first-child {
  margin-top: 0;
}

```


## Good
同一の要素間の余白を取りたい場合は隣接セレクタを使うのが適切。

```css
.item + .item {
  margin-top: 10px;
}
```

※同一の要素でない場合でも使えます。

```css
.section + .special-section {
  margin-top: 30px;
}
```

# 模式図
Chromeのdevツール上では下記のような余白のとり方となります。
（devツール上の配色と同じ色にしています）

- `#bdc87f` : padding
- `#f8c696` : margin

![スクリーンショット 2019-07-04 午前10.39.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46299/aea507c4-162e-736e-7000-2e5c4817e1c8.png)

# 備考
- 横に並べる場合の左右の余白についても同様に、原則として margin-left（左余白）を使います。
  - 要素間の余白は隣接セレクタ ＋ margin-left で設定します。
- 以上の考え方はborder設定にも応用できます。
  - 親要素のborderで周囲の枠線を引く
  - 要素間の横線 / 縦線は border-top / border-left で設定する
BTstackのexampleを使って、ESP32でWiiリモコンのBluetoothデバイスアドレスを取得する。

# はじめに
ESP32には、Bluetooth機能が内蔵されていますが、今回、そのBluetooth Classicを使って、[Wiiリモコン](https://www.nintendo.co.jp/wii/features/wii_remote.html)のBluetoothデバイスアドレスをESP32で取得してみます。Bluetoothスタックとして、[BTstack](https://github.com/bluekitchen/btstack)を使用し、exampleに含まれている gap_inquiry をそのまま実行するだけです。
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252891/009bbd4d-b04f-dcf1-1e35-e38c5c77df03.png)

# 開発環境の準備
ESP32の開発環境をWindows10(64bit)のUbuntu上に準備します。
[⇒ ESP32 で Hello world! - Ubuntu (Windows Subsystem for Linux)](https://qiita.com/jp-96/items/63bc5d28bf78287b55d1)

# Bluetoothスタック（BTstack）の準備

```bash
cd ~/
git clone https://github.com/bluekitchen/btstack.git
```

```bash
cd ~/btstack/port/esp32
./integrate_btstack.py
```

# Wiiリモコンの認識

## ビルド

### シリアルポートの設定

menuconfig というプロジェクト設定ツールを起動し、シリアルポートの設定を行います。

```bash
cd ~/btstack/port/esp32/example/gap_inquiry
make menuconfig
```

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252891/98edd94d-d9c7-ab88-1ee9-8a5ab8b90702.png)

[Serial flasher config] → [Default serial port] で、ESP32と接続しているシリアルポートを設定します（例えば、/dev/ttyS14）。通信速度やオプション指定も図のように合わせてください。
設定後、< Save >で保存し、< Exit >で終了します。

### ビルドと書き込み

次のコマンドで、ビルドと書き込みを行います。

```bash
make flash
```

### モニター

次のコマンドで、ESP32とモニター接続します。すると、Starting inquiry scan.. とスキャンが開始されます。

```bash
make monitor
```

## Wiiリモコンの検出

WiiリモコンのAボタンとBボタンとを同時に押し、下部の４つの青色LEDを点滅状態にします。すると、ESP32(gap_inquiry)がBluetoothデバイスを検出し、そのアドレス(Device fount:)と名称(Name:)とを出力します。

```
Starting inquiry scan..
Device found: 00:1?:??:??:??:?2 with COD: 0x002504, pageScan 1, clock offset 0x3b63, rssi -63 dBm
Get remote name of 00:1?:??:??:??:?2...
Name: 'Nintendo RVL-CNT-01'
Starting inquiry scan..
```

# おわりに
Wiiリモコンは、Bluetoothデバイスですので、そのアドレスと名称とをESP32で取得することができました。
IFTTTとOffice365emailを連携し授業変更自動通知LINE BOTを作った。

#はじめに
室長がクラスLINEで誤った授業変更通知をして僕が忘れ物をした（確認しなかった僕が悪い）ので授業変更を自動で通知してくれるLINE BOTを作りました。

#仕組み
様々なWebサービス同士を連携させることができるIFTTT（イフトって読むらしい。初見分からんかった。）というものを使用しました。

```
Outlookで特定のメールアドレス（ここでは授業変更を通知してくる学校のメアド）からメールを受信する。
↓
IFTTTに転送（事前にIFTTT側でOffice365emailとの連携が必要）
↓
IFTTTからWebhook送信でLINE BOTサーバにメール本文をPOST
↓
POSTされたメール本文をグループLINEにPush
```

- 言語：Python
- Webフレームワーク：Flask
- サーバ：Heroku

#ソースコード
クソな部分がいっぱいあるけど許してください....。
まじで....あとで修正するから....今だけだから....許して...。
https://github.com/FlexiblePrintedCircuits/class_bot

#参考にした記事や人など

###IFTTT
↓IFTTTでのそもそものWebhookの使い方
https://ifttt-japan.club/apply-webhooks
↓メールを受信したらSlackに通知をさせるっていう記事
https://qiita.com/wasnot/items/ba71c7e861fb44cf8d84

###LINE BOT側
↓グループにプッシュ通知をさせる
https://qiita.com/kenichi_odo/items/18badf7c069334d9c3a2

###人
Siketyanって子がいるんですけどその子に色々教えてもらいました。
ありがとうSiketyan！！


#結果
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453437/e31b6a9a-059c-89f6-84c5-e66d2fe5a08a.png)
できたっちゃできた。
ただhtmlのタグが入っているので将来的にこいつらを取り除きたい。

#詰まったとこ
###IFTTTのトリガーにGmailがサポートされていない
最初Gmailでメール受信したら、って形にしたかったけど、去年の３月デサポート終了したらしいので仕方なくOfficeを使用することに。

###IFTTTからサーバにメールの内容が送信されずIFTTT側でエラーが出る
Office側でIFTTTに権限を許可していないのが原因でした。
１度IFTTTでOffice365emailのコネクションを切って、もう１度コネクトしたら解決しました。

###コードは問題ないのにLINE BOTエラーがでる
IFTTTから送信されたメールの内容がほとんどがクソ長いhtmlのコードで、実際に欲しいメールの内容はそれのごく一部にすぎませんでした。
それがなぜエラーに繋がるかというと、LINEMessageingAPIでは2000文字しか取り扱えないからです。なのでクソ長いPOSTされたメールデータから、実際に欲しい文字列をスライスして取得してそいつをメッセージ送信させることにしたらエラーが解決しました。

#自慢させろ
これ５時間で作った
VScodeでRemote Containersを使いssh接続で計算機につなぐ

####VScode でRemote Containersを使いssh接続で計算機につなぐ
#####VScodeでsshが使えるようになった

ログイン計算機はパスワード認証の場合
VScodeでサーバーへの接続に必要なものは

- [VScode ](https://code.visualstudio.com/)
- Remote Containers (VScode )

VScode をインストールしたら、
横にある四角いアイコンExtensionsからRemote-containersをインストール
横のPCアイコンをおし、CONNECTIONを新たに作る
歯車マークconfigureを押すと.ssh/config,settingがでてくる
settingには.ssh/configのパスを入れてやる  



.ssh/configがパスワード認証では書かなくてはいけないことが普通より多く、

```cpp  
Host 
HostName  
User 
ForwardX11 yes

    ControlMaster auto
    ControlPath  ~/.ssh/sockets/%r@%h-%p
    ControlPersist  600
```
と下三行を入れてやらねばならない
（--Macのみ,windowsは下三行を書かない）

Terminalで計算機に入った状態で




VScodeで接続



[英語の説明](https://code.visualstudio.com/docs/remote/troubleshooting#_enabling-alternate-ssh-authentication-methods)ー本家
main controller-> sub controller への画面遷移

#Button→Controllerに画面遷移させる(コード量が少し減る)

実行環境
Swift5
Xcode Version 10.2.1 

前提条件
構造体がある(今回はPerson)
MainControllerに何か特定のButtonが配置されている(今回は４つbuttonがある)
SubControllerが４つある

動作としては特定のbuttonを押した時に特定の別のcontrollerに画面遷移させる

(ex: ●を押したら、1controllerへ画面遷移)
●　→ 1controller
▲　→ 2controller
■　→ 3controller
★　→ 4controller


```Swift:mainController.Swift
    import UIKit

    //@IBOutlet等の記述は省略しています

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
       switch segue.identifier {
       case Segue.one.rawValue:
            if let destination = segue.destination as? oneVC {
                destination.person = person
            }
       case Segue.two.rawValue:
            if let destination = segue.destination as? toTwoVC {
                destination.person = person
            }
       case Segue.three.rawValue:
            if let destination = segue.destination as? toThreeVC {
                destination.person = person
            }
       case Segue.four.rawValue:
            if let destination = segue.destination as? toFourVC {
                destination.person = person
            }
       default:
            break
        }
    }

    //segueのenum化
    enum Segue : String {
       case one = "toOne"
        case two = "toTwo"
        case three = "toThree"
        case four = "toFour"
    }
```
mainController.Swift内のprepare関数内を下記の記述に書き換える

```Swift:mainController.Swift
    if var destination = segue.destination as? PersonProtocol {
            destination.person = person
        }
    //任意のprotocol作成（ここではPersonProtocol）
    protocol PersonProtocol {
       var person: Person! { get set }
    }
```
mainController以外のファイルにそれぞれ下記を記述

```Swift:subController.Swift

    import UIKit

    class OneVC: UIViewController, PersonProtocol { //classにPersonProtocolを追加
       var person: Person!

       override func viewDidLoad() {
        super.viewDidLoad()
        print(person.name)//terminal確認表示（Person構造体がnameを持っている）

    }
```
開発中の気分転換に最適なミニゲーム集（ダウンロード不要）を公開しています

シンプルなブラウザゲームを無料公開しています（スマホ対応）。

**「１プレイ数分」×「数十ステージ」**という構成なので、お仕事中の気分転換に最適です。

- 集中力が切れた時
- 昼食後の眠たい時間帯
- 移動中の暇つぶし
- 納期が迫っている時の現実逃避

などなどに、私自身 重宝しています（笑）
興味のある方は、ぜひプレイしてみてください。


#テトリス風ゲーム（全85ステージ）
![game.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453200/8607cd72-c175-2cb8-8cb8-4a18acbe5f5d.gif)
https://hotnews8.net/game/falling-block/
テトリスっぽいパズルゲームです。
（※ テトリスの著作権を侵害しないように考慮してあります。）

難易度別に85ステージあり、登場する落下ブロックは全81種類。
プログラマーという、「論理的思考能力」が優れている職種の方にオススメです ^^)

#レトロなシューティングゲーム（全77ステージ）
![sns360.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453200/cdb50277-e9c3-55c0-1818-2e44e5a22cc6.png)
![spacewar01.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453200/43220d04-05a2-b7a6-71c6-19f7aa79e557.gif)


https://hotnews8.net/game/shooting/spacewar/
お手軽にシューティングゲームで遊びたい方にオススメです。

ステージが進むにつれ、

- 条件を満たすと自動消滅する壁
- 一定時間ごとにエイリアンが誕生
- エイリアンが20匹以上、同時に襲ってくる

などのゲーム画面が現れます ^^)

#超〜簡単シューティングゲーム（全46ステージ）
![sns-min.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453200/c3963d03-8c98-7a72-8b70-e1d769d83e2b.png)
https://hotnews8.net/game/shooting/easy/
上でご紹介したシューティングゲームの難易度を、大幅に落としたゲームです。
（ゲームシステム自体は、上とほぼ同じ）

シューティングゲームの入門用にオススメです ^^)

#ジグソーパズルゲーム（様々な絵柄・難易度で 6,000個以上）
![sns400.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453200/a5cea785-fc24-a4df-6fd6-7bb43aa54f71.png)
https://hotnews8.net/game/jigsaw-puzzle/
４ピース 〜 1,000ピースまで、様々な難易度のジグソーパズルがあります。
気分転換には 20ピースぐらいがオススメです ^^)

***

今のところ、ここまでです。
子供〜大人まで お手軽に楽しめるミニゲームを、これからも制作していきます ^^)

**もし少しでも面白いと思ったら、シェアしてください**
m(_ _)m
OculusQuest + Virtual Desktop + SteamVR + Unity をゼロから環境構築(windows10)

#はじめに
　最近OculusQuestが手に入ったのでいつもどおりMacOS環境上のUnityで開発を進めていたところ。。
Questのデバッグに多大な時間を費やすことが発覚。毎回apkファイルを書き出して実機にインストールして、、(だけど確認したいログはVR空間上では確認できず、、)みたいな手順を踏まなくてはならず、めんどくさくなったのでいろいろな記事を参考にしてWindows環境からUnityEditorを通してデバッグを可能にする環境を構築しました。

今回は環境構築の中で大きく詰まったポイントをいくつかご紹介します。


#環境
- Windows 10 Pro 64ビット(グラフィックボード：AMD RADEON R9 M395X)
- OculusQuest
- Unity 2018.3.0f2
- SteamVR 1.5.16
- Virtual Desktop(*サイドローディングバージョン : 後術します)
- SideQuest-0.4.2(2019/07/03現在)


#手順
　私の場合、MacOSからWindowsに乗り換えて位置から環境構築したので、必要なさそうなところは読み飛ばしてください。
###Unityのインストール
　Windows上でUnityのAndroid端末へのビルド環境を構築します。

>Unity2018インストールからAndroidビルドするまでの手順
>https://qiita.com/taroyan/items/2ff7f6aadd640221bde5

　こちらを参考にしてUnityのAndroid環境を作りました。


###Virtual Desktop・SteamVR・SideQuestのインストール
　こちらは以下のYoutubeの動画を参考に環境を構築しました。

>オキュラスクエストで SteamVR をプレイする方法！SideQuest で VirtualDesktop を導入【OculusQuest】
>https://youtu.be/O4N59uEWYHM

####気を付ける点
#####Virtual DesktopのサイドローディングバージョンをSideQuestからインストールする

　Virtual DesktopはOculus側からQuestでSteamVRのプレイができる機能の削除要請をうけ、Oculus StoreからダウンロードしたVirtual DesktopではSteamVRの機能を使うことができなくなっています。しかし、SideQuestからサイドローディングしたVirtual DesktopであればSteamVRの機能を使うことが可能になっています。(2019/07/03現在)

#####サイドローディングのVirtual DesktopをQuestに上書きする際にDesktopアプリのVirtualDesktopStreamerも再インストールを行う
　こちらは私の環境だけで起きた問題かもしれませんが、Virtual Desktopを上書きしてもSteamVRをインストールしなおしても
![steamVRerror.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242685/efef8f2e-35b8-ddff-45f8-f5ef9030a56d.png)
SteamVR側から言われQuestを認識してもらえませんでした。
参考動画にあるトラブルシューティングをいくつか試しても改善が見られず、、（苦労しました笑）

迷った挙句、見つかった私の解決方法は


 - **Desktopにあるホスト用のVirtualDesktopStreamerStreamerを再インストール**をします。
 - 再インストールしたVirtualDesktopStreamer、サイドローディングしたVirtual Desktopを使用し、Quest側から右上の**VR**ボタンをクリックすします。

すると、下の画像のようにQuestを認識してくれるようになりました。

![steamvrsuccess.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242685/ea735af2-7c54-062e-0e1b-f8f599267c51.png)

###Virtual Desktopを経由してUnityEditorでOculusQuestプロジェクトをデバッグする
　あとはUnityにOculus用のプロジェクトを立ち上げてVirtual Desktopを経由して実行ボタンを押すと無事にOculusQuestのHMDやTouchコントローラーを認識してUnityEditorからデバッグを行うことができます。プロジェクトの立ち上げには以下の記事を参考にさせていただきました。

>Oculus Quest版 Virtual DesktopでUnityの実行画面をVR表示で見る
>https://qiita.com/Soranoana/items/9b2a59dd0ba179d01e91

実行ボタンを押してGameView,SceneViewがQuestの動きに合わせて問題なく動作するのではないかと思います。


これでUnityEditor上からQuestのデバッグをすることが可能になりました。実機にいれてログを確認したいときはadbコマンドからログを確認することができますし、開発がぐんぐん進みそうですね。


#終わりに
最後までお読みいただきありがとうございました。間違っているところ等々ございましたら、ご教授いただけると幸いです。


開発どんどんすすめるぞーー
Fetchとかasync awaitとかaxiosとかを整理する。

# JavaScriptを扱う上で避けては通れない非同期通信について
今回はJavaScriptの非同期通信について書いてみます。　　

JavaScriptを使った開発の中で、非同期通信の理解は必須です。　　　　
非同期通信について調べると必ずこのような単語が出てきます。　　
[XHR,fetch,Promise,async await,axios]

中には各用語の関係性がわからず混乱してしまう人もいるのではないでしょうか
（私がそうです。）

今回は自分なりに非同期通信に関わるオブジェクトやAPIをなるべく噛み砕いて説明して見ようと思います。　　
(コードの書き方ではなく、そのもっと手前の部分に注視してみます。)

拙い図ではありますが、全体を把握するための画像を添付します。
![スクリーンショット 2019-07-03 15.37.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273658/9f83c39f-0b27-3a91-4d32-89c39ebbd82e.png)



## 非同期通信は二つの処理から成り立っている。
非同期通信は[非同期処理]と[HTTP通信処理]の組み合わせです。　　
本来はそれぞれ別の用途に用いることができますが、[HTTP通信処理]を実行するにおいて、[非同期処理]\(**実行順序を制御する。**とも言い換えることができます。\)は実質必須のため、同列に語られることがほとんどです。
同列に語られるが故にそれぞれの役割を分離して見ることが難しい場合があります。　　


### 非同期通信で使う三つの機能
<small>※XHRとFetchAPIは似たような機能ではありますが、仕組みや使い方そのものは違います。
それぞれの違いの説明は省きますが、JavaScriptにはHTTP通信する機能が二つあると思ってください。</small>

HTTP通信のみを担うAPI
1. [XMLHttpRequest(XHR)](https://developer.mozilla.org/ja/docs/Web/API/XMLHttpRequest)

HTTP通信と非同期処理を担うAPI
1. [Fetch](https://jsprimer.net/use-case/ajaxapp/http/#fetch-api)

非同期処理機能
1.[Promise](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Promise)

この三つの機能の組み合わせでJavaScriptの「非同期通信」は成り立っています。
Promiseは基本必須なので、[XHR]か[Fetch]のどちらを使うかが重要になります。

- XHR + Promise
- Fetch (FetchAPI + Promise)


なぜFetchが単体で利用できるかと言うと、FetchはFetchAPIとPromiseが合わさった機能だからです。
これがFetchがPromiseベースと言われる由縁です。


### async awaitとは何か
より詳しい記事がたくさんあるため詳細は省きますが、Promiseをより使いやすくしたものだと思ってください。
(俗に言う糖衣構文です。)
重要なのは、ベースはPromiseで出来ているので、下記のような使い方が可能と言うことです。
XHR + async await(Promise)　　
Fetch + async await（Promise）
### axiosとは何か

axiosは　XHR+Promiseの処理をより簡単に扱えるようにしたライブラリです。
XHR+Promiseを使ったHTTP通信ライブラリは他にもあり、そのうちの一つと考えてください。  

### まとめ
使いやすいかどうかは別ですが、下記のような組み合わせで使うことが出来ます。

XHR + Promise
XHR + async await(Promise)
Fetch(fetchAPI + Promise) + async await(Promise)
axios(XHR + Promiseの組み合わせをより扱いやすくするライブラリ)

もし私のように混乱してしまった人の理解が少しでも深まると嬉しいです。

参考にさせて頂いた資料です。
https://sbfl.net/blog/2016/07/13/simplifying-async-code-with-promise-and-async-await/
https://sbfl.net/blog/2017/01/29/fetch-api/
Git コマンドや用語について調べてみました！

インターン先でプログラミングを勉強している大学三回生です。
今回は自分で後から見直せるようにGitのコマンドをメモっておこうと思います。
興味のある方はぜひ見てください！！

##Gitコマンド一覧
`$ git init`
gitを利用するために必要な「リポジトリ」を作成するコマンド。
リポジトリを作成したいディレクトリでこのコマンドを入力されると「.git」ディレクトリが作成される。

`$ git clone`
既存のリポジトリからファイルをコピーして作業用のリポジトリを作成するコマンド。

`$ git gc`
リポジトリ内の最適化をすることができるコマンドです。
マージやコミットを大量にしたときなどにストレージ容量を減らすことができる。

`$ git pull`
他のリポジトリの変更点をローカルリポジトリにマージするコマンド。
リモートリポジトリと同期する。

`$ git push`
リモートリポジトリに自分のリポジトリの内容をプッシュするコマンド。

`$ git add`
リポジトリに新たにファイルを加えたり、変更を加えたファイルを指定するコマンド。

`$ git commit`
「$ git add」で指定したファイルを保存・コミットするコマンド。

`$ git reset`
直前のコミットを削除することができるコマンド。
小さなミスなどを見つけたときなどに使用する。

`$ git tag`
直前のコミットに対してわかりやすいようにタグ・名前を付けることができる。

`$ git status`
追加・変更されたファイルの状況をみることができる。

`$ git diff`
指定したファイルの変更点を見ることができる。

`$ git mv`
ファイル名を変更できる。

`$ git log`
コミットの履歴を見ることができる。

`$ git revert`
既存のコミットを取り消すことができる。
「取り消したいコミットを打ち消すような新しいコミットを作成」という処理。
コミットを取り消した履歴が残る

`$ git stash`
一時的にコミットされていない変更を保存できる。

`$ git branch`
新たなブランチを作成。

`$ git checkout`
作業したいブランチを切り替えることができる。

`$ git merge`
現在作業しているブランチに他のブランチの変更点を取り込むことができる。

`$ git rebase`
指定したコミットを作り直してログを掃除するためのコマンド。
あるブランチに対して行った変更点を、派生元のより新しいリビジョンのものに適用。

##リポジトリとは
リポジトリではファイルやディレクトリの状態を管理しています。
変更履歴などを管理したいディレクトリをリポジトリの管理下に置くことで、そのディレクトリのファイルやディレクトリの変更履歴を記録することができます。
そしてこのリポジトリは2つの種類に分けることができます。

***・ローカルリポジトリ***
ユーザーの一人一人が作業するために自分のマシン内に作成するリポジトリです。

***・リモートリポジトリ***
専用のサーバーに配置してチームなどの複数のユーザーで共有するためのリポジトリです。

この二つのリポジトリに分けて作業することで、普段の自分の作業をローカルリポジトリで、そしてその内容を公開またはほかの人の作業内容を取得したくなったら、リモートリポジトリに公開、取得することができます。

##ディレクトリて何？
Gitを勉強し始めてから「ディレクトリ」という言葉を聞くことが多くなり、調べてみました。
ディレクトリとはフォルダと同義で使っても大丈夫なようです。
基本的には複数のファイルを管理する場所と考えればよいでしょう。

##ブランチって何？
ブランチはプロジェクト本体に影響を与えずに分岐して作業するときに使用します。
安定したバージョンのブランチのことを***Masterブランチ***と呼び、新しい機能や修正したい部分があるときにここから分岐して並行作業を行うことができます。

***ブランチを利用するメリット***
・プロジェクト本体に影響を与えずに作業することができる。
・目的別に並行作業することができる。
・不具合が生じたときの対応が容易。
ということがメリットとして挙げられます。

##ワークツリーとは
ワークツリーとはGit管理下にある実際に作業しているディレクトリのことです。
そして、リポジトリとワークツリーの間には***インデックス***というリポジトリにコミットする準備をする場所があります。
Gitではワークツリーからリポジトリに直接コミットするのではなくこのインデックスに設定された状態をリポジトリに記録するという形になります。

##ステージング・エリア（ステージング領域）
ステージング・エリアは次にコミットした時に登録されるコンテンツのリストです。
インデックスと同義で使われています。
先ほども言った通りこのステージング・エリアを通してコミットすることになります。

##rebaseとmergeの違い
rebaseとmergeはどちらも異なるブランチの変更を統合するために使われます。
rebaseでは、コミットグラフを綺麗に整理することができます。
しかし、履歴やコミットがそもそも違うものになってしまうので、過去のログを見ることができなくなってしまいます。
mergeではリベースと比べてコミットログが汚く見えますが、過去のコミットを見ることもできますし、コンフリクトが起きても一回で解消することができ、便利です。
参考文献にわかりやすいサイトを載せて置きます。

##まとめ
今回はGitに関して僕が疑問に思ったことやGitのコマンドについてまとめてみました。
Gitは共同開発する上で必須なのでこれからもしっかり勉強していこうと考えています。

##参考文献
[gitコマンド](https://www.sejuku.net/blog/5816)
[ワークツリ](https://backlog.com/ja/git-tutorial/intro/04/)
[ディレクトリ](https://uxmilk.jp/27546)
[ブランチ](https://www.sejuku.net/blog/71071)
[ステージング・エリア](https://tech.mercari.com/entry/2017/04/06/171430)
[リポジトリ](https://backlog.com/ja/git-tutorial/intro/02/)
[わかりやすいrebaseとmergeの違い](https://www.slideshare.net/kotas/git-15276118)
よくあるクロスドメインの対応

エラーが出た。

```
Access to XMLHttpRequest at 'http://hogehoge.com' from origin 'http://fugafuga.com' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
```

`http://fugafuga.com`のconfにheaderを追加

```apache
<Directory>
    Header set Access-Control-Allow-Origin "http://hogehoge.com"
    Header set Access-Control-Allow-Credentials true
    ...
</Directory>
```

これだけで対応できた。
[UiPath]ビンゴゲーム用抽選シナリオをつくりたかった

### remark
[自身のblog](https://rpa.adgj.pw/items/uipath-%E3%83%93%E3%83%B3%E3%82%B4%E3%82%B2%E3%83%BC%E3%83%A0%E7%94%A8%E6%8A%BD%E9%81%B8%E3%82%B7%E3%83%8A%E3%83%AA%E3%82%AA%E3%82%92%E3%81%A4%E3%81%8F%E3%82%8A%E3%81%9F%E3%81%8B%E3%81%A3%E3%81%9F)にも同じ内容をポストしています。

---

## ビンゴゲーム用抽選シナリオをつくりたかった

私の会社ではRPAビジネスに参画している社員が相当数いるのだが、そのメンバー向けにコミュニケーションイベントをやることになった。
ただイベントをやるだけではつまらないので、アクティビティとしてビンゴをやることになったのだが、そこもただビンゴをやるだけではつまらないということで、UiPathでビンゴを作れば面白いよね、となって、作ることになった。

## シナリオの条件

- インプットは、「社員No.」「氏名」が含まれたExcelファイル
- インプットからランダムにレコードを抽選する
- 社員検索（イントラ）から、抽選された社員のページを表示する
- 誰が選ばれたのかを確認できるようにする
- ビンゴとなったメンバーが一定数出た段階で止められるようにする

## 作ってみた

~~（シナリオは後日公開したいかも……）~~<br />
公開しました。<br />[https://github.com/riscurred/uipath_akbingo](https://github.com/riscurred/uipath_akbingo)<br />
公開のために、実際の中身からだいぶ変えた。肝のところは変えてないので許して。あと中のデータがなんでコレなのかというと、とりあえず使いやすそうだった（そして実際に使いやすかった）のと、ちょうど◎◎BINGOって番組やってたよなーというアレ。

## 工夫

### ランダムにレコードを抽選する

UiPathには、DataTableの中から_ランダムに_レコードを選択するようなアクティビティがないので、

- DataTableのレコード数を上限として、ランダムに番号を払い出す
- DataTableから、払い出されたランダムな番号の位置にある行レコード(DataRow)を抽出する
- 抽出した行は繰り返し抽選されないよう、DataTableから削除する

というロジックで組むことにした。

#### ランダムに番号を払い出す

`new Random().Next(maxValue)`を用いると、`0`～`maxValue`の間でランダムな数字を払い出すことが出来る。
もし下限値を0以外にしたい場合は、`new Random().Next(minValue, maxValue)`とすると、`minValue`～`maxValue`の間でランダムな数字を払い出してくれる。

#### 行レコードを抽出する

これはDataTable操作の基本だけど、`dt.Rows(rowNumber)`で、`rowNumber`の位置にある行レコードを抽出できる。この結果は`DataRow`型となる。
抽出した行データを`dr`としたとき、`dr.Item(columnName)`や`dr(columnName)`とすると、その行レコードに含まれる対象列のデータを抽出できる。
このあたりは[@UmegayaRollcakeさんの記事](https://qiita.com/UmegayaRollcake/items/a8e0b787d7c38077b8f2)が結構詳しいと思うので、参照されたい。

#### 抽出した行をDataTableから削除する

ここは、`Remove Data Row`アクティビティを使える。
先ほど抽出した`DataRow`型の変数（`dr`とする）と、対象となるDataTableを引数として指定すると、DataTableから`dr`のレコードを削除してくれる。
最初は`Filter Data Table`アクティビティを使って作ってたんだけど、フィルターの設定が上手く動いてくれなかったので、このアプローチにした。

### 字幕アクティビティを使う

標準では含まれていないけど、[画面にパネルや字幕を表示するアクティビティパッケージ](https://go.uipath.com/component/subtitle-activity)が公開されている。これを導入することで、例えばデモ動画などの解説用メッセージを表示するなどに使える。
アクティビティパッケージの導入については割愛。時間があれば追記します。

### 誰が選ばれたのかを確認できるようにする

これは、社内で利用しているチャットツールであるChatworkに投稿することにした。
手順は[こちら](https://mag.sweeep.ai/rpa/chatworkapi-message-send/)にあるので、気になる方は参照されたい。いつか自分でも手順書いてみたい。
ちなみに公開したシナリオからは削除した。邪魔だったんで……。

## 結果

~~実はまだ本番を迎えていないので、本番で無事に動くことを祈る……~~<br />
無事に動いた！よかった、よかった……！！
Python3+OpenCVを使って連番画像から動画を作る

# はじめに
連番画像から動画を作りたかったが、色々ハマったので自分用にメモ

# 環境
- Python 3.6.3
- OpenCV 4.1.0
- numpy 1.16.2

# 現象
- 画像の大きさがあっていないとmp4を書き出すことはできるものの、異常にファイルサイズが小さく再生できなかった。
- 画像の大きさを前もって調べてコードの中に書いておき、画像が全て同じ大きさでない場合はリサイズして揃えておかなければならない。

# 画像の大きさが違っててリサイズしたい場合
画像のリサイズを行うときは

```python
img = cv2.resize(img, (640,480))
```
とする。

```python
img.resize(640,480)
```
のようにしているサイトを参考にしたため、動画が作成できなかった。
あまり大きいサイズの画像をリサイズするとout of memoryになったので
前もって大きさを変えた方がいいかもしれない。

# コード
```python
import sys
import cv2

# encoder(for mp4)
fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v')
# output file name, encoder, fps, size(fit to image size)
video = cv2.VideoWriter('video.mp4',fourcc, 20.0, (1240, 1360))

if not video.isOpened():
    print("can't be opened")
    sys.exit()
    
for i in range(0, 90+1):
    # hoge0000.png, hoge0001.png,..., hoge0090.png
    img = cv2.imread('./hoge%04d.png' % i)

    # can't read image, escape
    if img is None:
        print("can't read")
        break

    # add
    video.write(img)
    print(i)

video.release()
print('written')
```
Railsでエラーをraiseをした時、statusコードがエラーごとに微妙に違う

# TL;DR
## `ActionController` シリーズ
```app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  def test
    raise ActionController::UnknownFormat            # 406
    raise ActionController::UnknownHttpMethod        # 405
    raise ActionController::SessionOverflowError     # 500
    raise ActionController::MissingFile              # 500
    raise ActionController::NotImplemented           # 501
    raise ActionController::MethodNotAllowed         # 405
    raise ActionController::UrlGenerationError       # 500
    raise ActionController::RoutingError             # 500
    raise ActionController::RenderError              # 500
    raise ActionController::BadRequest               # 400
    raise ActionController::ActionControllerError    # 500
  end
end
```

## その他面白そうなエラー

```ruby
class ApplicationController < ActionController::Base
  def test
    raise ActiveRecord::RecordNotDestroyed           # 500
    raise ActiveRecord::RecordNotSaved               # 422
    raise ActiveRecord::RecordNotUnique              # 500
    raise ActiveRecord::RecordNotFound               # 404
  end
end
```

# エラー一覧の出し方
[こちらの記事](https://qiita.com/snaka/items/78008ecd7e65e34c75d7)が書いたように、下記の一行使えば出せます。

```rb
ObjectSpace.each_object(Class).select{|k| k.ancestors.include?(ActionController::ActionControllerError) }
=> [ActionController::UnknownFormat,
 ActionController::UnknownHttpMethod,
 ActionController::SessionOverflowError,
 ActionController::MissingFile,
 ActionController::NotImplemented,
....
```

# 感想
Railsの組込みエラーでステータスコードを自動で切り分けていることは、さほど不思議ではないが、どこもその文献が見つけられなかったのは自分の不勉強としか言えませんでした。

ちなみに、Controllerの`render`で`status`を数字だけでなく、(人間が読めそうな)シンボルも渡せます。
その一覧は[こちらの記事(日本語)](https://blog.toshimaru.net/rails-http-status-symbols/)や[こちらの記事(英語)](http://billpatrianakos.me/blog/2013/10/13/list-of-rails-status-code-symbols/)で出しています。

# 参考
https://qiita.com/snaka/items/78008ecd7e65e34c75d7
https://stackoverflow.com/questions/6521544/getting-a-list-of-existing-rails-error-classes-for-re-use-inheritance
https://blog.toshimaru.net/rails-http-status-symbols/
http://billpatrianakos.me/blog/2013/10/13/list-of-rails-status-code-symbols/
https://www.transnet.ne.jp/2018/06/15/1101colnd/
numpyの小さな数の平方根について

```python
epsilon = np.array([0.00000001, 0.00000001])
np.sqrt(epsilon)
```

上の式を実行すると、

```python
array([ 342.47335663, 3186.45759426])
```

こうなってしまう。。

どうしても解決できなかった。
Windows10 proのVagrant+VirtualBoxでvagrant upできなくなったときのメモ

##状況
Windows10pro+Vagrant2.2.4+VirtualBox6.0.8で動かしていたVMを久々にvagrant upで起動

```
==> xxx: Booting VM...
There was an error while executing `VBoxManage`, a CLI used by Vagrant
for controlling VirtualBox. The command and stderr is shown below.

Command: ["startvm", "fe623649-8ae4-42fc-8725-d9a2049a4371", "--type", "headless"]

Stderr: VBoxManage.exe: error: Call to WHvSetupPartition failed: ERROR_SUCCESS (Last=0xc000000d/87) (VERR_NEM_VM_CREATE_FAILED)
VBoxManage.exe: error: Details: code E_FAIL (0x80004005), component ConsoleWrap, interface IConsole
```

え、なんかやったっけ？？？？

##やったこと
 1. Vagrantの再インストール
Vagrantの最新バージョンが2.2.5になってるから再インストールしてみた結果ダメ

 2. VirtualBoxの再インストール
なんか設定弄ったかな・・・再インストールしてもダメ

 3. VMがおかしくなったか・・・？
VMをdestroyして再構築してもダメ

 4. Boxがおかしくなったか・・・？
Boxを削除して再構築してもダメ

 5. ネットワークの設定か・・・？
VirtualBox Host-Only Networkの設定見直したが問題なし

 6. ググる
[Windows Sandboxをインストールしてから、仮想化ソフトの仮想マシンが起動しなくなりました。【Ver1903】](https://answers.microsoft.com/ja-jp/windows/forum/all/windows/5d8c563a-cec4-4fa5-8c95-79e5ba48bf79)
そういやwindowsを1903にしたりsandbox有効化したの忘れてた。
sandboxを無効化して再起動後、実行してみたがダメ

 7.  Hyper-V関連の機能を無効化
 管理者権限のpowershellで下記を実行してvagrant upを実行→ダメ
```
Disable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-All
```

 8.  ここから再起動が必要？
[Windows10上のVirtualBoxがエラー吐いた時の備忘録](https://qiita.com/reef1217/items/e760b6e4078dedc0b434)
>コマンドの内容としては、Hyper-V関連すべての停止
>そして、また再起動。

４～５回目くらいの再起動を行う。


.........


できた！！

##終わり
Hyper-V関連は業務上では使わないのでこれで良しとする。
Docker for Windowsを入れようか迷ったときに思ったけどやっぱりMacで開発＆インフラ構築が良いね。。。

あとあと調べたらHyper-V使わずにDocker for Windows使う方法ってあるのね。
まーでもVagrant+VirtualBoxで構築したゲストOS上でDocker使うようにしたし、
Macだったらそもそもこの煩わしさはないのでやっぱりMacやなぁ・・・！
view.commonwl.org で表示されるグラフのソースコードを見たい

# 概要

検索した結果 [CWL のビューワー](https://view.commonwl.org/) の描画のページにたどり着くがあるが、これのもとになったソースコードをみたいとき

# 結論

ページの上の方にある、githubのアイコン(Octocat)をクリックすれば良い

# 参考情報

<img width="814" alt="Screenshot 2019-07-03 15.28.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82011/74355600-23f1-0dd5-5140-e22f7f428e1d.png">
reactの環境構築

パッケージのバージョン管理ツールをインストール

```aidl
$ npm install -g yarn
```

#### intellij IDEAの拡張系
- JSLint
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270608/17404a70-7d04-b485-a871-5a2421cc37c7.png)

- JSHint
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270608/cd048d07-5b63-35a5-0c7d-67b738dca3c9.png)
※オプションについては参考を参照
※使用可能にするにチェックを入れる事とチームでバージョン合わせて置くとコード品質があがります。

- ESLint **（これをインストールしました）**
これが主流らしいです。オプション設定もJSLintやJSHintと違って最初に選ぶ必要がなさげ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270608/f96128f2-f5dd-317a-3598-28a155edc650.png)

[ESLintのルールを全部手動で設定するのは大変だからやめておけ](https://qiita.com/khsk/items/0f200fc3a4a3542efa90)を見て拡張どうのこうのを探すのやめましたｗ
ありがたや〜

- Prettier(コード整形ツール)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270608/8afbbf53-0072-2d74-69c7-1ecc0076c865.png)
これもインストールしてIDEを再起動

追加されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270608/ed99088b-11e9-fd03-0a12-a7466ca5a80a.png)
選択して「使用可能」にチェックを入れてOKを押す。

下記エラーが出たので確認してみるとプログラムが下記に置かれていなかった。
$ProjectFileDir$/node_modules/.bin/prettier

```
11:45	Failed to run File Watcher 'Prettier'.
			The watcher has been disabled.
			エラー: Invalid executable
```

なのでyarnでインストール

```
$ yarn add prettier --dev --exact
```

無事JSコードが自動整形されるようになりました。

## 参考
- [JSLintを使おう！（基本解説とオプション一覧）](https://analogic.jp/jslint/)
- [JSHint Options 日本語訳](https://qiita.com/xorphitus/items/f26ec8fbe17c317d3994)
- [JavaScript の静的解析ツールの比較 (JSLint, JSHint, ESLint)](https://maku77.github.io/js/tool/static-analysis-tools.html)
python2をpython3に変換する方法

# はじめに

しがない地方大学院生をしています、Sotaです。
プログラミング初心者であるため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正するのでどんどん指摘してください。  

今回は，研究で先輩の残したpython2のプログラムをいじることがあったので，そのときpython3に変換した方法を書きます．

# 2to3
pythonをインストールするとデフォルトで2to3というツールが入っています．
これをターミナル上で使うことでpython2系のコードをpython3系に変換できます．
windowsはpathを通す必要があるみたいなので注意してください．

使い方は，変換したいpythonファイルのあるディレクトリに行き

```
2to3 hoge.py
```

とするだけです．
このときの出力は

```python
 import re
 from math import sin, cos, acos, radians
 import math
-import urllib2
-from urllib2 import URLError, HTTPError
+import urllib.request, urllib.error, urllib.parse
+from urllib.error import URLError, HTTPError
 import requests
 import ssl
-import urllib
+import urllib.request, urllib.parse, urllib.error
 import socket
-import httplib
+import http.client
 import codecs
 #from joblib import Parallel, delayed

@@ -49,7 +49,7 @@
    # if count >= 1600000:
    #     break
    # if count >= 1500000 and count <= 1600000:
-        print count
+        print(count)
         count += 1
        dist_b = 1000000000
        dist = 0

```
このように差分を返してくれます．
コード自体は変更されていません．

コードを変換したいときは

```
2to3 -w hoge.py
```
とすると変換してくれます．
このときディレクトリに hoge.pyとhoge.py.bakの2つのファイルが生成されます．
hoge.pyが変換後のpython3系のファイルで, hoge.py.bakが変換前のpython2系のバックアップファイルです．

バックアップが必要ないときは`2to3 -n -w`とすると変換後のファイルのみ出力されます．
ドシロウトがGoogleマップのルート詳細テキスト情報を取得するブックマークレット書いてみた

## ０．初めに

私はエンジニアではないただのドシロウトです。

地味なブックマークレットを作ってみたので記事にしておきます。個人的には便利なんですが…

## １．作ったもの

以下のアニメGIFみたいな物を作りました。(パソコン版です）

【アニメGIF】
![画像](https://i.imgur.com/3LIUAO7.gif)

申請書や報告書を書くために利用交通機関のルートをワードに貼り付けたいみたいな時に使えるかなと思っています。

## ２．ブックマークレット

作成したブックマークレットはたったこれだけです。

```javascript:bookmarklet
javascript:var%20a%3Ddocument.querySelectorAll('%23pane%20%3E%20div%20%3E%20div.widget-pane-content.scrollable-y%20%3E%20div%20%3E%20div%20%3E%20div.section-trip-header.noprint%20%3E%20span')%5B0%5D.innerText%2B'%5Cn%5Cn'%2Bdocument.querySelectorAll('div.transit-mode-body')%5B0%5D.innerText%3Bvar%20d%3Dwindow.open().document%3Bd.writeln('%3Ctextarea%20rows%3D20%20cols%3D60%3E'%2Ba%2B'%3C%2Ftextarea%3E')%3Bvoid(0);
```

## ３．いらないと思いますが一応説明

エンコード前のコードはたった３行です。

```javascript:bookmarklet
var a=document.querySelectorAll('#pane > div > div.widget-pane-content.scrollable-y > div > div > div.section-trip-header.noprint > span')[0].innerText+'\n'+document.querySelectorAll('div.transit-mode-body')[0].innerText;
var d=window.open().document;
d.writeln('<textarea rows=20 cols=60>'+a+'</textarea>');
```

* １行目：出発地、目的地、ルートのテキストを取得
* ２行目：別ウィンドウを生成
* ３行目：textareaに取得した情報をセット

## ４．おわりに

一応、マストドンでもこのブックマークレットの話をトゥートしたのですが反応薄かったので簡単すぎるかこんなニーズはないんだと思います。

個人的には結構便利なんですが、ブックマークレットなしでもっと良い方法があるのかも…(;^_^A

以　上
【Git】チケット番号からブランチをチェックアウトする



## ブランチ名が長くてチェックアウトがめんどくさい
お仕事でGitを利用している場合、多くの現場ではRedmineやJIRAなどのプロジェクト管理システムも同時に採用されていると思います。

すると、ブランチ名に

* ブランチの種類（feature, bug など）
* 実装や不具合の概要
* チケット番号

を含めることになります。

結果、このような名前になっているのではないでしょうか？

例） `feature/summary-for-implementation/ticket-number`

ブランチ名が長いと、チェックアウトするときはこんな感じになってしまいます。

```bash
$ git checkout feature/summary-for-implementation/ticket-number
```

いくら補完をかけても入力が面倒です。

そうするとどっかからコピペするのが常態化しますが、それはそれで面倒ですよね。

## チケット番号からチェックアウトする
どうせチケット番号は一意なので、その情報からチェックアウトできると便利です。

以下の`<ticket-number>`の箇所をチケット番号に書き換えてください。

```bash
$ git branch | grep <ticket-number> | xargs git checkout
```

### 解説
* `git branch`でブランチ一覧を表示
* `grep <ticket-number>`でチケット番号からブランチ名を抽出
* `xargs git checkout` で抽出したブランチ名を引数にしてチェックアウト

## シェルスクリプトにする
`ticket-number`の部分を引数にしてシェルスクリプトにしてしまうと便利です。

```bash
#!/bin/sh
git branch | grep $1 | xargs git checkout
```

このシェルスクリプトに実行権限を付与し、エイリアスを設定（例えば`checkout`）すれば、以下のようにチケット番号からのチェックアウトが簡単に行えます。

```bash
$ checkout 42
# 42番のチケットに対応したブランチがチェックアウトされる
```


誰でも思いつくようなハックですが、どなたかのお役に立てば。