OmniAICreator/Qiita-1.07M huggingface dataset:
【C言語ポインタ】&(アンパサンド)や*(アスタリスク)の使い分け

# はじめに
C言語を始めて半年が経ちました。
変数やポインタの前につける <b>&</b> や <b>*</b> 、たくさん出てくると今でも混乱しがちです…
というわけで、自分のための備忘録も兼ねて、軽くまとめてみたいと思います！

# 使い方
### 通常の変数
まずは、通常の変数の場合！
もし以下のようなコードの場合は、、

```c:varSample.c
#include <stdio.h>

int main(void) {
    
    int var;
    var = 10;

    printf("printf  var  ... %d\n", var);
    printf("printf  &var ... %p\n", &var);
    
    return 0;
}
```

    | 通常の変数     |
----|--------------|
var |格納されている値を表示 |
&var|変数自身のアドレスを表示   |

となります。
実行して確認してみると、、

```
printf  var  ... 10
printf  &var ... 0x7ffeefbff588
```
このような結果になりました！
通常の変数には、値とアドレスの2つの要素があることが分かります。
<img src="https://qiita-image-store.s3.amazonaws.com/0/362782/0893823b-6860-c06d-58b0-dd8efe212ba0.jpeg" width=200>


### ポインタの場合
続いて、ポインタの場合！
もし以下のようなコードの場合は、、

```c:ptrSample.c
#include <stdio.h>

int main(void) {
    
    int var = 10;
    int *ptr;      // int型のポインタを宣言
    
    ptr = &var;    // ポインタptrに変数varのアドレスを格納
    
    printf("printf  var  ... %d\n", var);
    printf("printf  &var ... %p\n", &var);
    printf("\n");
    printf("printf  ptr  ... %p\n", ptr);
    printf("printf  *ptr ... %d\n", *ptr);
    printf("printf  &ptr ... %p\n", &ptr);

    return 0;
}
```

    | ポインタ       |
----|--------------|
ptr |格納されている値（変数のアドレス）を表示 |
<font color="Crimson">*ptr</font>|<font color="Crimson">アドレスの先の値（実体）を表示</font>|
&ptr|ポインタ自身のアドレスを表示  |

となります。
<font color="Crimson">赤字</font>で書かれている部分が、ポインタ特有の機能です。

こちらも実際に実行してみると、、

```
printf  var  ... 10
printf  &var ... 0x7ffeefbff588

printf  ptr  ... 0x7ffeefbff588
printf  *ptr ... 10
printf  &ptr ... 0x7ffeefbff580
```
このような結果になりました。
ポインタptrの値として、変数varのアドレスが入っていることが確認できます。

図で整理してみると、以下のようになります。
<img src="https://qiita-image-store.s3.amazonaws.com/0/362782/85ae0ca4-e3e1-6e6c-98cd-618c261e9f4c.jpeg" width=50%><img src="https://qiita-image-store.s3.amazonaws.com/0/362782/c0d5d737-572c-edb4-e8e5-19c5bd353e54.jpeg" width=50%>

ポインタが通常モードの時は、対象変数のアドレスを”指し示して”います。
<font color="Crimson">ポインタ特有の機能として、<b>*</b>を頭につけると「アドレスの先にある値」を"指し示す"ことができます。</font>
*がつくと、矢印（ポインタ）がにゅーんと伸びるイメージです。
（ *は間接演算子という名前が付いているので、間接モードと呼んでいます。）


#終わりに
実は、今回の投稿が初投稿でした。
理解の一助となると幸いですm(_ _)m
GCPにRStudio Serverを立ててRSeleniumでスクレイピング

#はじめに
前にRseleniumでWEBページのスクレイピングを行いました。([こちら](https://qiita.com/saltcooky/items/e713f786a4f456117848))
手元のマシンで行うと、スクレイピング間隔をあけていることや、対象ページが多いことから、結構時間がかかってしまいます。
また、自分のマシンからやってBANされても嫌だなと思ってGCPからスクレイピングしてみました。
GCP初心者でしたが、GCPを用意し、RStudio ServerとRSelenium Serverを立ててスクレイピングを試みました。
メモ程度の内容です。

#GCPの設定
GCEでVMインスタンスを立てました。

マシンタイプ：n1-standerd-1
ブートディスク：Ubuntu 16.04LTS
ファイヤウォール：HTTP/HTTPSトラフィックを許可するをチェック

#Dockerを使ってRStudio Serverを立てる
##GCPの設定
外部からアクセスできる様にファイヤウォールルールを設定しました。
設定のページがわかりにくかったです。

GCPトップページ → メニュー →　ネットワーキングのVPCネットワーク　→ ファイヤウォールルール　


次の様な設定を作成しました。
　名前: allow-rstudio　
　トラフィックの方向: 上り
　ソースIPの範囲: 0.0.0.0/0 
　指定したプロトコルとポート: tcp:8787
　ターゲットタグ: allow-rstudio

そして、インスタンスの設定でターゲットタグに「allow-rstudio」を追加します。

##RStudio Serverを立てる
RStudioのdockerイメージにtokyor/rstudioを利用しました。

```terminal
docker pull tokyor/rstudio
```

```terminal
docker run -d -p 8787:8787 tokyor/rstudio
```

これでhttp://<インスタンスのグローバルIP>:8787にアクセスします。
Rstudio serverのログイン画面が出れば成功です。
次のusernameとpasswordでログインできます。

 username: rstudio
 password: rstudio

#Dockerを使ってRSelenium Serverを立てる
##GCPの設定
外部からアクセスできる様にファイヤウォールルールを設定しました。

 名前: allow-selenium
 トラフィックの方向: 上り
 ソースIPの範囲: 0.0.0.0/0 
 指定したプロトコルとポート: tcp:4444
 ターゲットタグ: allow-selenium

インスタンスの設定でターゲットタグに「allow-selenium」を追加します。

##seleniumサーバーを立てる
dockerイメージを持ってきます。

```terminal
docker pull selenium/standalone-chrome
```

dockerコンテナを立ててseleniumサーバーを立てます。

```terminal
docker run -d -p 4444:4444 selenium/standalone-chrome
```

これでhttp://<インスタンスのグローバルIP>:4444にアクセスします。
seleniumのページが表示されれば成功です。

#いざ、スクレイピング
あとは、RStudio Serverにアクセスして、[前回](https://qiita.com/saltcooky/items/e713f786a4f456117848)記事の内容に従ってスクレイピングをおこないました。
いい感じに１年間分のスナップ情報を取得できました。

以上です。


#参考
- https://hub.docker.com/r/tokyor/rstudio
- http://yoshidk6.hatenablog.com/entry/2017/05/27/013000
- http://katsumushi.hatenadiary.com/entry/2017/11/12/235542
Android Studioでライブラリをモジュールとして追加する

公式サイト
https://developer.android.com/studio/projects/android-library

上は少々長いので最低限やることを抜粋。

1.File→New→New Module→Android Library→Next
　　　　　　→Library Name、Module Name、Package Nameを指定→Finish

<b>_Package Nameの指定は重要。適当な名前をつけるとライブラリのパッケージの名前を変えないといけなくなる。_</b>

2.ライブラリの中身をPackage配下にコピペする

3.appフォルダのbuild.gradleに依存関係を追加
dependencies {
　　implementation project(":_「Library Name」_")
　　.....
　　.....
}

その他の参考サイト
https://techbooster.org/android/18043/
astah plugin tips#0_はじめに

# はじめに
[astah](http://astah.change-vision.com/ja/index.html)でモデリングをしていると、何度も同じような作業を繰り返していると感じることがよくあります。面倒な作業は簡易なプラグインやスクリプトを作って自動化してしまいましょう。

本連載では、astahの[プラグイン API](http://astah.change-vision.com/ja/plugins.html#create-plugins)を使ってちょっとした機能追加を行う際のTipsを紹介していきます。
お手軽に開発するために、plugin開発と相性の良い[Kotlin](https://kotlinlang.org/)を使っていきます。

#もくじ
- [#1 Kotlinでastah pluginを作る環境を整える](https://qiita.com/Shintaro_Hosoai/items/d9ae049bd9f2c352eb55)
- [#2 選択した要素に繋がっているものを選択する](https://qiita.com/Shintaro_Hosoai/items/73f3a0e40fb4028b16c2)
- [#3 複数の要素にステレオタイプを一括適用する]
- [#4 Maven archetypeでプラグイン開発を効率化する]
- [#5 いろいろな情報からモデルを作成する]
- [#6 コードからモデルを作成する]
- [#7 図を自動生成する]
- [#8 モデルから生成する]
- [#9 モデルからコードを生成する]

# 開発環境
本シリーズは以下の環境を想定しています。

- Windows 10
- astah pro 8.1
- ASDK ^1.5
- Kotlin ^1.3
- IntelliJ IDEA

# 前提知識
以下のチュートリアルで、ASDK環境が整っていること
http://astah.change-vision.com/ja/tutorial/plugin.html

Kotlinでのプラグイン環境が整っていること
http://astah.change-vision.com/ja/tutorial/plugin/kotlin.html

# github
https://github.com/s-hosoai/astah-plugin-jigs

# プラグイン以外のTips
[astah* tips](https://qiita.com/Shintaro_Hosoai/items/4c8dfc10c44c145626b9)

# 次回
[#1 Kotlinでastah pluginを作る環境を整える](https://qiita.com/Shintaro_Hosoai/items/d9ae049bd9f2c352eb55)
Homebrewでsqlite3をインストールしたが，シンボリックリンクの作成ができない時の対処法

# はじめに
Sinatraでデータベースを扱おうと思い，とりあえず一番初めに見た記事でsqlite3を使用していたので，それを使用することにしました．
Homebrewでインストールしましたが，早速悩む羽目になったので，備忘録として残します．

### 環境
```sh
$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.14.3
BuildVersion:	18D109
```

```sh
$ brew -v
Homebrew 2.0.5
```

# sqlite3のインストールの前に
Macにはデフォルトでsqlite3が入っているみたいです．
そのバージョンや場所を確認しておきます．

```sh
$ sqlite3 --version
3.24.0 2018-06-04 14:10:15 ...

$ which sqlite3
/usr/bin/sqlite3
```

特に気にならない方はこちらを使用しても良いのですが，デフォルトで入っているsqlite3のアップデート方法がわからなかったので，今回はHomebrewでインストールして使うことにしました．

# sqlite3のインストール
早速Homebrewでsqlite3をインストールします．
Homebrew自体のインストール方法については，割愛します．

```sh
$ brew install sqlite3
...
sqlite is keg-only, which means it was not symlinked into /usr/local,
because macOS provides an older sqlite3.
...
```

色々出てきました．．．
とりあえず気にせずsqlite3の確認をしても上記のデフォルトのバージョンおよび場所が表示されます．

# シンボリックリンクの作成
どうやらsqlite3はkeg-onlyで，シンボリックリンクを作成しないらしい．．．（ここで初めて，Homebrewではシンボリックリンクを作成して，そこを参照していることを知りました．）
ということで，色々調べると，以下のコマンドでシンボリックリンクを作成できるらしいです．

```sh
$ brew link sqlite3 --force
Warning: Refusing to link macOS-provided software: sqlite
If you need to have sqlite first in your PATH run:
  echo 'export PATH="/usr/local/opt/sqlite/bin:$PATH"' >> ~/.zshrc

For compilers to find sqlite you may need to set:
  export LDFLAGS="-L/usr/local/opt/sqlite/lib"
  export CPPFLAGS="-I/usr/local/opt/sqlite/include"

For pkg-config to find sqlite you may need to set:
  export PKG_CONFIG_PATH="/usr/local/opt/sqlite/lib/pkgconfig"
```

とりあえず，作成はできていません泣
試しに`/usr/local/bin`を見ても無いことがわかるかと思います．

# 自分で作る
ということで，`/usr/local/bin`に自分でsqlite3へのシンボリックリンクを作成しました．

```sh
$ cd /usr/local/bin
$ ln -sf ../Cellar/sqlite/3.27.2/bin/sqlite3 ./
```

`3.27.2`の部分はインストールしたsqlite3のバージョンに合わせてください．
これでsqlite3のバージョンおよび場所がHomebrewでインストールしたところを指していると思います．

```sh
$ sqlite3 --version
3.27.2 2019-02-25 16:06:06 ...

$ which sqlite3
/usr/local/bin/sqlite3
```

# 最後に
今回は，Homebrewでsqlite3をインストールしたが，パスを通せないという場合の対処法を書きました．
対処法ということで，リンクが作成できなかった原因はまだ解決していません．似たような症状の方を見かけていないので，気になるところではあります．
本来なら`brew link sqlite3 --force`で通せると思います.

# 参考サイト
[SQLite - [brew]OSXのbrewでインストールしたソフトウェアを常に使えるようにしたい｜teratail](https://teratail.com/questions/54760)
[[Mac][Ruby]Rails環境構築には、データベースとしてSQLiteをオススメする！ | Gabekore Garage](https://gabekore.org/mac-ruby-rails-sqlite)
R/重回帰分析

## 1.特定の行だけを対象とする(フィルタ)
~~~
> subset(data, data$Kamoku=="Tumi")
   Year Kamoku   Koza Torimei   Yonyu Time_msec
2  2005   Tumi 136979 1737362 5262217   6145000
5  2006   Tumi 134842 2590203 5215695  15294000
8  2008   Tumi 138648 3582574 5457204  34983000
11 2013   Tumi 108089 3937556 4266912  25920000
~~~

## 2.特定のカラムだけを対象とする
~~~
> subset(data[3:6])
> subset(data[c(3,4,6)])
~~~

## 3.組合せ
~~~
> subset(data[c(3,4,6)], data$Kamoku!="Tumi")
~~~

## 4.新しいオブジェクトに代入する
~~~
tumi = subset(data, data$Kamoku=="Tumi")[c(3:6)]
(tumi.lm<-lm(Time_msec~., tumi))

tumiN = subset(data, data$Kamoku!="Tumi")[c(3,4,6)]
(tumiN.lm<-lm(Time_msec~., tumiN))

futu = subset(data, data$Kamoku=="Futu")[c(3,4,6)]
(data.futu.lm<-lm(Time_msec~., futu))

teik = subset(data, data$Kamoku=="Teik")[c(3,4,6)]
(data.teik.lm<-lm(Time_msec~., teik))
~~~

## 5.重回帰分析
[引用元](http://cse.naro.affrc.go.jp/takezawa/r-tips/r/71.html)

~~~
(tumi.lm<-lm(Time_msec~., tumi))

lm(formula,data,,,)　　linear modeling
formula
  y=目的変数（被説明変数）  /  x=説明変数
  y ~ x          : y = a + b*x + ε
  y ~ x1 + x2    : y = a + b1*x1 + b2*x2 + ε
  y ~ x - 1      : 切片(定数)項を除外する（ + 0 でも可）
###
  y ~ . , data = データ名     : y = a + b1*x1 + ・・・ + ε
          右辺は「 y 以外」という意味で . （ピリオド）を指定
          [ data= ]は省略可

  y ~ 1 + x + I(x^2) : 多項式回帰
                     : y = b0 + b1x1 + b2x2 + ε（ ε は誤差項）．
                     : I(x^2) は poly(x,2) でも可．
~~~
R/統計処理/フィル読込

## データの読込み
[引用元](http://cse.naro.affrc.go.jp/takezawa/r-tips/r/40.html)


| 関数 | header | sep | quote | dec | 用途 |
| :-- | :-:    | :-:  | :-:  | :-:  | :-- |
|read.csv("ファイル名")|T|,|\|.|区切りがコンマの場合|
|read.csv2("ファイル名")|T|;|\|,|区切りがコロン＆小数点がコンマの場合|
|read.delim("ファイル名")|T|\t|\|.|区切りがタブの場合|
|read.delim2("ファイル名")|T|\t|\|,|区切りがタブ＆小数点がコンマの場合|
|read.fwf("ファイル名")|F|\|\|.|一行の各欄の桁数 widths を指定して読み込む|

## データ確認
~~~
> data=read.csv("/..../r.dat")
  # [,]セパレート
> head(data)
  age2 総コレ 中性脂肪
1 25.8    151       85
2 26.5     NA       NA
3 27.8     NA       NA
4 28.6     NA       NA
5 29.3     NA       NA
6 30.7    206      172

~~~
## 基本統計
~~~
> hist(data$中性脂肪)              # ヒスとグラム
> plot(data$age2, data$総コレ)     # ２次元散布図
> cor(data)                       # 相関行列
         age2 総コレ 中性脂肪
age2      1     NA       NA
総コレ     NA      1      NA
中性脂肪   NA     NA       1

> pairs(data)                     # ２次元散布図（２変数組合せ）
~~~
STSのインストールからプロジェクト作成まで

###  公式ホームページからダウンロード
[https://spring.io/tools/sts/all](https://spring.io/tools/sts/all)
Based on Eclipse 4.10.0を選択。
zipを選択。
任意の場所に保存し，解凍。

### STSを起動
{インストール場所}/sts-3.9.7.RELEASE/STS.exeをダブルクリック

ここでjavaが環境pathに設定していない場合、以下のエラーがでるため
パスを通す必要がある。
エラーメッセージ : 「STSを動作させるためにはJREまたはJDKが必須です。
以下のパスにファイルがありませんでした。
{インストール場所}/sts-bundle/sts-3.9.7.RELEASE/jre/bin/javaw.exe

### プロジェクト作成
「File」->「New」-> 「Maven Project」->「New Maven Project」
Select  project and location はデフォルトで「Next」
Select an Archtypeは「maven-archetype-web」をダブルクリック
GroupId, ArtifactIdは任意入力し「Finish」

### pomの修正
作成されたプロジェクトはエラーが発生しているため、以下の修正が必要。

依存関係の追加
・Spring io Platform (io.spring.platform)
・servlet api (javax.servlet)
・taglib (org.apache.taglibs)

ビルドの設定
・コンパイラ (maven-compiler-plugin)

### pomの反映

Mavenプロジェクトを右クリック->「Maven」->「Update Project」

### web.xmlの編集


### APサーバの起動

serverタブの「Pivotal tc Server Developer Edition v4.0」を右クリック
「Add and Remove」でプロジェクトを追加。
「Start」でAPサーバを起動。

サーバのアイコンを展開しプロジェクトを右クリックし
「Open Home Page」でトップページが表示される。
R/統計分析/使ってみる

## 入力データサンプル
~~~
$ head KenshinData.dat
# date     FY     age     place     age2     height     weight     Sibo_ratio     ALL_DL     LDL     HDL     Sibo     g_GTP     Cmt
1991/12/12     1991     25     一般検診     25.75     171     69          151               85     22
1992/09/04     1992     26     一般検診     26.50     170     68
1993/12/08     1993     27     一般検診     27.75     170     71
~~~

## Rでデータ読込
~~~
data=read.table("...../****.dat",header=T,sep="\t",comment.char="")
~~~

## Rでグラフ化
~~~
> str(data)
'data.frame':     26 obs. of  14 variables:
 $ X..date   : Factor w/ 26 levels "1991/12/12","1992/09/04",..: 1 2 3 4 5 6 7 8 9 10 ...
 $ FY        : int  1991 1992 1993 1994 1995 1996 1997 1999 2000 2001 ...
 $ age       : int  25 26 27 28 29 30 32 33 34 35 ...
 $ place     : Factor w/ 7 levels "NTT伊豆","NTT五反田",..: 3 3 3 3 3 3 3 3 3 6 ...
 $ age2      : num  25.8 26.5 27.8 28.6 29.3 ...
 $ height    : num  171 170 170 171 170 ...
 $ weight    : num  69 68 71 68 69 73 71.5 78.6 72.2 71.7 ...
 $ Sibo_ratio: num  NA NA NA NA NA NA NA NA NA 25 ...
 $ ALL_DL    : int  151 NA NA NA NA 206 144 205 175 197 ...
 $ LDL       : int  NA NA NA NA NA NA NA NA NA NA ...
 $ HDL       : int  NA NA NA NA NA NA NA 52 56 55 ...
 $ Sibo      : int  85 NA NA NA NA 172 141 141 82 121 ...
 $ g_GTP     : int  22 NA NA NA NA 36 23 62 42 39 ...
 $ Cmt       : Factor w/ 2 levels "","納会翌日": 1 1 1 1 1 1 1 1 1 1 ...

plot(data[c(5,7,8,9,10,11,12)])
plot(data[c(5,7,8,11,12)])
pairs(data[c(5,7,8,11,12)])

pdf(filename.pdf,family="Japan1GothicBBB") #このフォントは数字等も結構デフォルトな感じになる

dev.off()
~~~
MacでのWiresharkのインストールの仕方

#MacでのWiresharkのインストール方法メモ

1.以下、ダウンロードページへ遷移

https://www.wireshark.org/download.html

2.Macのダウンロードリンクを押下
![スクリーンショット 2019-03-25 22.04.10.png](https://qiita-image-store.s3.amazonaws.com/0/148996/40737e42-ea89-57b0-4fa2-cbc7d0a78b61.png)

Windows、Mac、ソースコードへのリンクがあります。リンクを押下するとインストーラが自動でダウンロードされます。

3.ダウンロードしたインストーラをダブルクリック

4.pkgファイルをダブルクリックする

インストーラ画面が表示されるので、ウィザードに従いながらインストール実行する

完了
[Qiita] 自分の今年更新した記事をStock順に表示

# 備忘
単なる備忘です

[これ](https://qiita.com/search?utf8=%E2%9C%93&sort=stock&q=user%3Afujisystem+updated%3A%3E2019-01)

- 検索キーワード

`user:<username>`
指定ユーザ名で絞り込み

`stocks:<1`
ストック0のやつで絞り込み

`updated:>yyyy-mm`
yyyy-mm以降に更新した記事で絞り込み
gnuplot / x-y-z の３次元散布図(splot)

## サンプルコード
local FNAME="$1"
splot "$FNAME" using 7:12:9 with points

```bash
#!/bin/sh

do_gnuplot() {
     local     FNAME="$1"

gnuplot << _EOT_
  set terminal x11
  set title      "x:Weight y:Siboi z:ADL"
  set xlabel     "Weight"
  set ylabel     "Sibo"
  set zlabel     "ADL"

#  1    2  3   4       5    6    7    8        9 10  11  12     13   14
# date,FY,age,検診場所,age2,身長,体重,体脂肪率,総コレ,LDL,HDL,中性脂肪,γGTP,

  set xrange[60:90]
  set yrange[*:*]
  set zrange[*:*]
  set grid
  splot "$FNAME" using 7:12:9 with points
_EOT_
}

  do_gnuplot $1
  echo "Hit any key"
  read DMY
```
gnuplot / x-y1-y2の２軸散布図(plot)

## サンプルコード
引数のファイルを入力とし、グラフ化する

```bash
#!/bin/sh

do_gnuplot() {
     local     FNAME="$1"

gnuplot << _EOT_
  set terminal aqua
  set title      "Age v.s Height & Weight"
  set xlabel     "age"
  set ylabel     "height"
  set y2label    "wheight"

#  set autoscale

#  1    2  3   4       5    6    7    8   9    10  11  12       13  14
# date,FY,age,検診場所,age2,身長,体重,体脂肪率,総コレ,LDL,HDL,中性脂肪,γGTP,
  set xrange[20:50]    ; set xtics  1
  set yrange[151:176]  ; set ytics  2
  set y2range[60:110]  ; set y2tics 10
  set grid
  plot "$FNAME" using 5:6 with linespoints axes x1y1 , \
       "$FNAME" using 5:7 with points      axes x1y2
_EOT_
}

  do_gnuplot $1
```
findで特定ディレクトリ配下を検索しない

## findで特定ディレクトリ配下を検索しない
~~~
find . \( -path "./Applications" -o -path "./Library" -o -path "./Music" -o -path "./.*" \) -prune -o -print
~~~

## パーミッションなしのディレクトリがあった場合
カレントディクトリの「 ./PermDeny 」は、アクセス権なし
findでアクセスするので、Permission denied が出力される

~~~
$ find . \( -path "./Applications" -o -path "./Library" -o -path "./Music" -o -path "./.*" \) -prune -o -print  > /dev/null
find: ‘./PermDeny’: Permission denied
~~~

## ディレクトリを除外したけど、エラーはでる。

~~~~
$ find . \( -path "PermDeny" -o -path "./Applications" -o -path "./Library" -o -path "./$ find . \( -path "PermDeny" -o -path "./Applications" -o -path "./Library" -o -path "./Music" -o -path "./.*" \) -prune -o -print  > /dev/null
find: ‘./PermDeny’: Permission denied
~~~
bash/ヒアドキュメント

## シェル内でヒアドキュメント
```bash
cat << _EOT_ > /tmp/sample.sql
SELECT
  table_schema,
  table_name,
  current_timestamp as wtime
from
  information_schema.tables
where
  table_schema = 'information_schema' ;
_EOT_
```

## パイプで実行する例
~~~
cat /tmp/sample.sql | mysql -u root -p
~~~

## リダイレクトで実行する例
~~~
mysql -u root -p　< /tmp/sample.sql
~~~


## コマンド入力をヒアドキュメント化
```bash
mysql -u root -p << _EOT_
SELECT
  table_schema,
  table_name,
  current_timestamp as wtime
from
  information_schema.tables
where
  table_schema = 'information_schema' ;
_EOT_
```
matplotlibでキーボード入力を受け付ける際のメモ

# ひっかかったところ
``matplotlib.pyplot.connect('key_press_event',function)``でキーボードが押された時の処理を実行できる。その際**qキー**で判定させたところ、プログラムが終了するようなコードを書いていないにもかかわらずプログラムが終了した。

↓以下プログラム例

```Python3
import matplotlib.pyplot as plt

def onKey(event):
    if event.key = 'q':
        print("q is pressed")
        plt.plot()               # この処理が終わり次第プログラムも終了する 
...

plt.connect('key_press_event',onKey)

```

# 解決策
matplotlibではqが押された場合プログラムを終了させるように定義されている(？)
とりあえず他のキーで代用したところ、プログラムが勝手に終了しなくなった。
(詳しい方は教えてもらえると助かります・・・)
エンジニアの作業効率を爆上げするAlexaスキルを作ったらトラップだらけだったので備忘録

どうも、個人開発のなんちゃってプログラマーのまさゆきです。

Alexaスキルで個人的に作業効率が爆上がりするポモドーロテクニックを気軽に実践出来るスキルをリリースしました。
ただ、リリースまでにかなり罠が多かったので共有させて頂きます。
あ。ポエムです。

![スクリーンショット 2019-03-25 16.27.48.png](https://qiita-image-store.s3.amazonaws.com/0/47244/af6ea24b-05d7-4822-033d-3602de69a8c6.png)

https://www.amazon.co.jp/dp/B07PVXT83Y/ref=sr_1_2?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=%E9%9B%86%E4%B8%AD&qid=1553513748&s=digital-skills&sr=1-2-catcorr


#最大の罠 ユーザーが利用を開始出来ない

一番これを皆さんにお伝えしたかったので、一番最初に書きます。
リリースして、数人のamazonEcho持っている知り合いに、試用を頼みました。今の所全員から

「使えないよー。」
「バグってるよー。」
「ループして始まんないよー。」
という、ありがたいレビューを頂きました。


###症状

1. ユーザー  「集中モードをひらいて」
2. スキル　  「｛スキルの説明｝。　集中モードがリマインダーを使用することを許可しますか？」
3. ユーザー  「はい」
4. スキル　  「リマインダーを有効にする方法を送信しました。アレクサアプリのアクティビティから確認して下さい。」
5. ユーザー  再度・スキル起動リマインダーが有効になっていないため、(1)に戻りループするユーザーとスキル）


###問題点

***ユーザーは③で「はい」と答えたことで、許可を出したと思っているが、スキル側はAlexaアプリで有効にされるのを待ち続ける。***

現状Alexaのリマインダー機能は、スマホアプリ（もしくはPC）からリマインダーを有効にしないと使えません。私達開発者は、ドキュメントを読んだり実機を触り倒してるので、すぐに、設定出来るのですが、恐らく殆どのAlexaユーザーはAlexaのリマインダーをアプリで有効にする必要が有ることなんて知りません。

④の文章をもっとひねって「スマホアプリから、とかPCのブラウザから、有効にして下さい。」とかにした方がイイのかもしれませんが、現状Alexaを管理してるのがスマホなのかPCなのか、エンドポイント側では拾えない。（はず）


### でも、ちょっと待って

バグってると教えてくれる心優しいユーザーの皆様に、Alexaアプリ側で許可いただく様お願いしたら、問題なく使えたのですが、、、

***WHY　ALEXA　SKILL !!!!***
***買い物は声で完結出来るのに！！！***
***リマインダーごときを設定するのに、スマホ開かないといけないんだよ！！！***
***おかしいでしょ！！！！***


ユーザーの意に反して、勝手にAlexaスキルが発話すると、それこそamazonEcho自体家に置きたくないってユーザーが出かねないので、慎重を期すのはわかるのですが、それにしても、もうちょっと方法が有るような気が。amazon様是非仕様の改善を前向きにご検討下さい。

個人的にAlexaアプリは、階層が深すぎてどうも使いにくい（どこに何が有るか分かりづらい）気がするので、そちらも踏まえて是非。

##現状出来る応急措置

根本的な問題は、amazon様が仕様を変更するか、ユーザー様がAlexaスキルの扱い方に慣れるか、でないと解決しないですが、対処療法としては、ユーザーとの対話を続けながら、スマホorPCで許可を与える方法をガイドするのが良いかと思います。


#トラップその２　ドキュメント通リマインダーAPIを叩くとリマインダーがセット出来ない

これは完全に私が悪いのですが、ドキュメントとさっとググってAPIのエンドポイントを確認すると、下記画像のようになっていたので、直打ちしてました。（そもそも直打ちするなってとこですが）
そうすると何度試してもエラー、しかもエラー内容が　401　MISSING_BEARER_TOKEN

![スクリーンショット 2019-03-25 21.11.05.png](https://qiita-image-store.s3.amazonaws.com/0/47244/2bd77a3b-37e8-f56a-c486-4feb2f6823bd.png)
https://developer.amazon.com/ja/docs/smapi/alexa-reminders-api-reference.html#alexa-reminders-api-endpoint-and-authorization


リマインダーAPIに限らず、Alexaスキルで仕様するAPIはユーザーの地域によってエンドポイントも異なるようです。日本の場合だと

```
https://api.fe.amazonalexa.com/
```

です。
というか、Alexaから送信されるJSONの中の

```
context.System.apiEndpoint
```
からユーザーごとのエンドポイントが取れるのでこちらを使うのが良いかと



#トラップその3　リマインダーAPIは結構時間がかかる

Lambdaの初期設定だと、10秒でタイムアウトになります。スキル側でも8秒以上応答に時間がかかると審査が通りません。
正確な時間は図ってないのですが、一度に4つ以上のリマインダーをセットすると10秒以上はかかりました。解決方法としては、

- Lambda側のタイムアウト時間を伸ばす
- lambda側の処理でプログレッシブ応答を入れる

かと思われます。プログレッシブ応答は、時間がかかる処理の待ち時間に先に読上げてくれる応答のようです。リマインダーAPIと扱い方はほぼ同じなので、エンドポイントさえ直打ちしなければ問題ないかと思われます。
公式↓
https://developer.amazon.com/ja/docs/custom-skills/send-the-user-a-progressive-response.html


# まとめ

リマインダーAPIを使う時は

- ユーザー様もすんなりリマインダーを有効に出来ない前提で開発した方がいい

恐らく、普通のユーザー様であれば使ってみて2,3回思い通りにならなかったら、ググるなどせずもうそのスキルを二度と使わなくなるかと。
人間もプロダクトも第一印象って結構大事ですね。

あ。
***最後にタイトルが盛大に釣りであったことをここに深くお詫び申し上げます。申し訳ありませんでした。***
bash/ディレクトリ配下のファイルに対して処理する

## デリレクトリ下をごそっと、別デリレクトリへ
~~~
#!/bin/sh
#
# 指定デリレクトリ配下のファイルを、コード変換して別のフォルダへ
#

do_conv () {
local FROMD
local FROMF
local TOD
local TOF

     FROMD=$1
     FROMF=$2
     TOD=$3
     TOF=$4

     iconv -f cp932 -t utf-8 $FROMD/$FROMF | gsed -e 's/\r$//g' > $TOD/$TOF
}

TOD=$1
shift

while [ "$1" != "" ]
do
  FROMD=`dirname $1`
  FROMF=`basename $1`
  TOF=$FROMF
  echo  $TOD "!" $TOF
  do_conv $FROMD $FROMF $TOD $TOF
  shift
done
~~~

## デリレクトリ配下の全てのファイルになんかする(bash)
~~~
for infile in $1/*
do
  fname=${infile##*/}       # filename(dir+base)
  from=$1/$fname
  to=$2/$fname

  if [ -f "$from" ]; then   # "$from"で空白に対応
    do_tr "$from" "$to"
  fi
done
~~~

## デリレクトリ配下の全てのファイルになんかする(one liner)
 ~~~
 $ for f in bin/*.sh ; do echo $f ; done
bin/ExecFromFile.sh
bin/do_menucommon.sh
bin/do_open.sh
bin/do_sleep.sh
....
~~~

## dirname, basename
~~~
for name in ./* ; do echo ${name##*/} ; done
${name##*/}  basename
${name%/*}   dirname
${name%.*}   拡張子なし
${name##*.}  拡張子
~~~
今が第＊曜日かどうかを判定する

第２土曜日とか、第３金曜日とか、第＊曜日を知りたいときあると思います。


https://play.golang.org/p/-JQnHhyX8Hj

```
package main

import (
	"fmt"
	"time"
)

func main() {
	now := time.Now()
	count := getCountWeekday(now)
	fmt.Printf("第%d%s\n",count,now.Weekday())

	// 第２火曜日かどうか
	fmt.Println(count == 2 && now.Weekday() == time.Tuesday)
}

func getCountWeekday(now time.Time) int {
	count := 0
	for t := now; t.Month() == now.Month(); t = t.Add(-7 * 24 * time.Hour) {
		count++
	}
	return count
}
```

実行結果

```
第2Tuesday
true
```
wordpressプラグイン開発の基礎

先日wordpressで制作したお客さんのwebサイトに、施設の予約状況などが各部屋ごとに1日単位でわかるシステムを導入したいと打診されました。

当初は既存カレンダー系のプラグインをカスタムして対応しようとしましたが、要件を満たしているカレンダープラグインがなかったので、プラグインを作ってみました。

今回はワードプレスのプラグインを作成する為の基礎や、方法をメモ書きしました。


#プラグインの基礎

まずはコメント内に必要な情報を記述します。
これさえ記述してあればプラグインとして認識されます。

```php:Calendar-day.php
<?php
/*
  Plugin Name: Calendar-day
  Plugin URI:
  Description: 予約状況をカレンダーに表示する自作プラグイン
  Version: 1.0.0
  Author: MAKOTO ADACHI
  Author URI: 
  License:
 */

?>
```

##管理画面上に表示される各種情報を設定


・add_menu_page関数内にタイトルや各種設定を記述していきます。

https://developer.wordpress.org/resource/dashicons/
で管理画面に表示されるアイコンを選択できます。

function show_page()内に記述した内容が、プラグインページに表示されます。


```php:Calendar-day.php
add_action('init', 'CustomCalendarDay::init');

class CustomCalendarDay
{
 
    function add_pages()
    {
        add_menu_page(
            'カレンダー',  /* タイトル*/
            'カレンダー登録', /* メニュータイトル */
            'manage_options', /* 権限選択 */
            'calendar-index-day', /* プラグインURL */
		
			//ここに記述した関数が描画される
            [$this, 'show_page'],   
            /*表示アイコンの選択*/    
            'dashicons-clipboard', 
            3 /* 表示位置のオフセット */
        );
    }
    function show_page()
    {
        //ここに記述した内容がに表示される

    }

} 

?>
```

![a.png](https://qiita-image-store.s3.amazonaws.com/0/105888/b3e25aed-5981-f7b7-41ce-f5de3bb6aa5f.png)
指定したアイコンで管理画面に表示されました！



#外部ファイル読み込み

外部ファイルの読み込みに以下の方法を用います。

####CSSファイルの読み込み方法

```php:Calendar-day.php
function myplugin_load() {
  wp_register_style('myplugin_css', plugins_url('css/myplugin_css.css', __FILE__));
  wp_enqueue_style('myplugin_css');
}
```


####JSファイルの読み込み

```php:Calendar-day.php

function my_scripts_method() {
    wp_enqueue_script('myplugin_js', plugins_url('js/myplugin_js.js', __FILE__ ), array(), '1.0', true);
}
add_action( 'wp_enqueue_scripts', 'my_scripts_method' );

```


#まとめ

ひとまずはここら辺の記述だけで簡単なプラグインなら作れてしまいます。
今回は小規模なプラグインだったのですんなり開発できました。
今後は大規模なプラグインも開発していきたいです。
ベートーベンの耳を手に入れる Beethovenを用いたピッチ検出処理

# 発端
好きな曲のハーモニカを吹きたいのだが採譜がめんどくさいという万人に共通の悩み、、、ありますよね。

例えば [Juke](https://www.youtube.com/watch?v=soXfp6Xx2VE)はハーモニカ界のスタンダードですけど、これの冒頭(チャララララーラッ♪)はもちろん**+3-3-4-5-6**です。

このフレーズなら皆さん暗譜していることでしょう。。。しかしこんな調子で1フレーズ毎に耳コピしてたら日が暮れるっちゅーことで自動採譜ツールを作り、、、作ろうとしました。

# ベートーベン
ちゅーことで、iphoneのマイクに聞かせてフレーズを自動で作らせればええやん、swiftも勉強できるし一石二鳥！！ということでswiftのライブラリを漁ったところ、ありました。[Beethoven](https://github.com/vadymmarkov/Beethoven)です。最初ビートバンと読んだのは内緒です。何かと思いました。。。

> Beethoven is an audio processing Swift library that provides an easy-to-use interface to solve an age-old problem of pitch detection of musical signals. You can read more about this subject on Wikipedia.

ということで今回やりたいことに一致しているようにみえます。やったぜ。

# ハマる
readmeを読み始めたあたりでなんかシグナルトラッキングとかEstimationとか、よく分からん単語が乱立しており、これは大変な沼にハマってしまったなぁという感想。

しかし作者の方が大変気が利くようでして、Exampleを用意してくれていました。ありがとう、マジありがとう。CocoaPodsとかなんか良く分からんswift環境周りのアレに翻弄されながらもなんとかビルドしコードを読む。ふむ。

# キモ
ViewController.swiftの中、メンバ変数pitchEngineの生成箇所と、その使用箇所がキモのようです。

```swift:生成箇所
lazy var pitchEngine: PitchEngine = { [weak self] in
    let config = Config(estimationStrategy: .yin)
    let pitchEngine = PitchEngine(config: config, delegate: self)
    pitchEngine.levelThreshold = -30.0
    return pitchEngine
  }()
```

コード見りゃ分かるんですが、Configにバッファサイズと評価方式(多分解析精度に絡むやつ)を渡します。もうここを突っ込んでいくと窓関数とかフーリエ変換とか、大学の時にもっとちゃんと勉強しておくべきだったことがいっぱい出てきます。あれ、大事だったんだなぁって。。。留年、してる場合じゃなかったなぁって。

```swift:使用箇所
  func pitchEngine(_ pitchEngine: PitchEngine, didReceivePitch pitch: Pitch) {
    noteLabel.text = pitch.note.string

    let offsetPercentage = pitch.closestOffset.percentage
    let absOffsetPercentage = abs(offsetPercentage)

    print("pitch : \(pitch.note.string) - percentage : \(offsetPercentage)")

    guard absOffsetPercentage > 1.0 else {
      return
    }

    let prefix = offsetPercentage > 0 ? "+" : "-"
    let color = offsetColor(offsetPercentage)

    offsetLabel.text = "\(prefix)" + String(format:"%.2f", absOffsetPercentage) + "%"
    offsetLabel.textColor = color
    offsetLabel.isHidden = false
  }
```

白状しますとDelegateパターンをよく理解していないのでこの関数がどういう経緯で動くのかがぼんやりしているのですが、ここでpitchEngineで評価した結果をいじいじして使っています。引数pitchには評価結果が入ってきます。

後はこの結果を元にいい感じに画面表示を行えば難しくない。
という訳でいい感じの採譜ツールができました。

https://github.com/kondog/MagicLick

、、、の、はず。だったのですが。。。

# 倍音問題
どーーーーも良くわからないのですが、高音を鳴らすと一オクターブ下の音を誤検出してしまいがちなんですよね〜〜〜〜うーーーーん。。。
ウェッブで調べたところによると、自己相関関数とかいう的な何かを使えば良いかもしれないと思われるのですが全く分からずです、はい。

という訳でなんか別のやり方を勉強しなきゃな〜と感じています。難しぃ。
Windowsで日本語配列として認識された英語キーボードで'_'を入力する

# はじめに
Windows環境において英語キーボードを使う場合に、
他のPCをリモート操作する場合など、日本語配列として認識された状態で操作せざるを得ない場合があります。
記号の位置を記憶していれば入力はできますが、`_` だけはキーが足りないため、入力することができません。
対策をします。

# AutoHotKeyを使う
AutoHotKeyを使います。導入方法などは[参考記事](#参考記事)をご参照ください。
以下のスクリプトを食わせます。

```roconv.ahk
+0::VkE2
```

Shift+0で '_' の入力が可能になります。
`+0`の部分を変更すれば、お好みで他のキーにマッピングも可能です。

# 参考記事
Windows10へAutoHotkeyの導入（キーマップの変更）
https://qiita.com/chr/items/47f50e36703d3bb20371
webpackとscss使ってsvgの色とか簡単に変える。

これ使います。
**svg-transform-loader**
npm https://www.npmjs.com/package/svg-transform-loader
github https://github.com/JetBrains/svg-mixer

htmlはとありあずこんなふうに。

```html
<span class="icon"></span>
```

インストール

```terminal:terminal
npm i -D svg-transform-loader
```
webpack.configでローダー登録

```js:webpack.config.js

module.exports = {
  module: {
    rules: [
      {
        test: /\.svg(\?.*)?$/, // match img.svg and img.svg?param=value
        use: [
          'url-loader', // or file-loader or svg-url-loader
          'svg-transform-loader' //★登録
        ]
      }
    ]
  }
}
```



あとはscssでスタイル記述
下記は色を白くする

```scss:style.scss
background-image: url("../img/cart.svg?fill=#fff");
```

mixinであ～ら便利

```scss
//何も考えずコピペ
@mixin fill-background-image($url, $color) {
  $base-color: str-slice(inspect($color), 2);
  background-image: unquote('url("' + $url + "?fill=%23" + $base-color +'")');
}
 
// 好きな色指定 
$hex-color: #fff;
 
.icon {
  //使う
  @include fill-background-image('../img/cart.svg', $hex-color);
}
```
C++ / argument dependent lookup

# argument dependent lookup
C++N4800
http://www.open-std.org/JTC1/sc22/wg21/docs/papers/2019/n4800.pdf

6.4.2 Argument-dependent name lookup

p.38

```
// C++N4800 Committee Draft, Standard for Programming Language C++
// http://www.open-std.org/JTC1/sc22/wg21/docs/papers/2019/n4800.pdf
const char * msg= "C++N4800 6.4.2 Argument-dependent name lookupi [basic.lookup.argdep] p.38.cpp";
// Edited by Dr. Ogawa Kiyoshi. Compile procedure and results record.

#include <iostream>
#include <cstdlib>
#include <cstring>

using namespace std;

namespace N {
        struct S { };
//      void f(S);
        void f(S){};
}

void g() {
  N::S s;
  f(s);// OK: calls N::f
//(f)(s);// error: N::f not considered; parentheses prevent argument-dependent lookup
}

int main() {
  g();
  std::cout << msg <<std::endl;
}

//$ ./a.out
//C++N4800 6.4.2 Argument-dependent name lookupi [basic.lookup.argdep] p.38.cpp
```
p.39
>Let X be the lookup set produced by unqualified lookup (6.4.1) and let Y be the lookup set produced by argument dependent lookup (defined as follows). 

```
// C++N4800 Committee Draft, Standard for Programming Language C++
// http://www.open-std.org/JTC1/sc22/wg21/docs/papers/2019/n4800.pdf
const char * msg= "C++N4800 6.4.2 Argument-dependent name lookupi [basic.lookup.argdep] p.39.cpp";
// Edited by Dr. Ogawa Kiyoshi. Compile procedure and results record.

#include <iostream>
#include <cstdlib>
#include <cstring>

using namespace std;

namespace NS {
  class T { };
  void f(T){};
  void g(T, int);
}
NS::T parm;
void g(NS::T, float){};
int main() {
  f(parm);// OK: calls NS::f
  extern void g(NS::T, float);
  g(parm, 1); // OK: calls g(NS::T, float)
  std::cout << msg <<std::endl;
}
//$ ./a.out
//C++N4800 6.4.2 Argument-dependent name lookupi [basic.lookup.argdep] p.39.cpp
```

# 課題
意味のある処理
意味のある出力
### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
####  Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
FSx Windows File Server で DFS を構成

## 概要
タイトルの通り。FSx が東京リージョンで利用出来るようになったので、検証してみた。

## やったこと

- Directory Service の構築
- FSx の構築
- DFS のセットアップ

## 詳細説明
### Directory Service

1. Directory Service のセットアップ
FSx を利用するには、Directory Service が必須となるので、まずは Directory Service の構築から。
注意すべき点は、現時点では、Managed Microsoft AD しか FSx に利用出来ないこと。
エディションは、SE でも EE でもどっちでもOK。

2. EC2 のセットアップ (ドメイン参加)
ドメインに参加する EC2 を適当に起動。
上記手順で作成したドメインに参加するには、EC2 の DNS を Managed MSAD の IP に設定する必要あり(下図参照)。
![screen_capture_03-25.png](https://qiita-image-store.s3.amazonaws.com/0/269938/9edb4c8a-a2b6-0e88-fb37-c00e9bf52099.png)

### FSx

1. FSx のセットアップ
AZ-A と AZ-C にそれぞれ FSx を立てます。参加するドメインは、↑の手順で構築した DS を指定すること。

2. EC2 のセットアップ (機能追加)
構築完了まで時間がかかるので、その間、ドメインに参加した EC2 に DFS レプリケーションと DFS 名前空間機能を追加する。
![screen_capture_03-25(0).png](https://qiita-image-store.s3.amazonaws.com/0/269938/e38fbc89-26eb-b1b1-1c6b-f39bc17b0744.png)


### DFS

1. DFS のセットアップ (名前空間)
GUI から作成できる。名前空間の作成は躓くことはないと思うので、割愛。
注意すべき点は、ドメインベースの名前空間を指定 ＋ Windows Server 2008 モードを有効にすることを忘れずに(デフォルトで有効にはなっている)。

2. DFS のセットアップ (レプリケーション)
GUI では出来ず、PowerShell で操作が必要。
基本的には [ここ](https://docs.aws.amazon.com/fsx/latest/WindowsGuide/multi-az-deployments.html) に書いてあることをやれば問題ないんだけど、FSx 側の ディレクトリが「D:\Share」となっているので注意(ドキュメントをちゃんと読めば分かるけど、自分はここに嵌った・・・)。

```powershell
$Group = "fsx"
$Folder = "C:\DFSRoot\share"

New-DfsReplicationGroup –GroupName $Group
Grant-DfsrDelegation –GroupName $Group –AccountName “FSxAdmins” –Force
New-DfsReplicatedFolder –GroupName $Group –FolderName $Folder

$FileSystemId1 = "FSx AZ-A file-system-id"
$FileSystemId2 = "FSx AZ-C file-system-id"
                
$C1 = (Resolve-DnsName $FileSystemId1 –Type CNAME).NameHost
$C2 = (Resolve-DnsName $FileSystemId2 –Type CNAME).NameHost

Add-DfsrMember –GroupName $Group –ComputerName $C1
Add-DfsrMember –GroupName $Group –ComputerName $C2

$ContentPath1 = "D:\Share"
$ContentPath2 = "D:\Share"
                
Set-DfsrMembership –GroupName $Group –FolderName $Folder –ContentPath $ContentPath1 –ComputerName $C1 –PrimaryMember $True
Set-DfsrMembership –GroupName $Group –FolderName $Folder –ContentPath $ContentPath2 –ComputerName $C2 –PrimaryMember $False

Add-DfsrConnection –GroupName $Group –SourceComputerName $C1 –DestinationComputerName $C2
```

3. 名前空間での公開
ここまで来たら、GUI での操作に戻る。
作成されたレプリケーショングループを、作成済みの名前空間で公開してあげればおｋ

以上。分かりにくいところは、後々、画像でも追加する予定。

## 仲間募集中
[弊社](https://www.nittsu-infosys.com/)ではエンジニアを募集中です。インフラからアプリ、ユーザサポートまで幅広く業務を行ってます。
https://www.nittsu-infosys.com/recruit/
AfterEffectsから透過動画を書き出してUnityで再生する

## 前提
[UnityはWebM(VP8)形式であれば透過動画をサポートしています](https://docs.unity3d.com/ja/current/Manual/VideoTransparency.html)
しかしAfterEffectsから直接WebM(VP8)を書き出すことはできないため、ffmpegを使ってWebM形式の動画を作成する手順です


## まずは透過TIFで書き出す
After Effectsから直接WebMで書き出すことはできないため、まずはTIFFで書き出します
![capture 114.png](https://qiita-image-store.s3.amazonaws.com/0/213392/cbf8815b-889d-23be-7b4a-cdb81c9e1b1b.png)


## 透過TIFをffmpegでWebMに変換する
```bash:最もシンプルなコマンド
ffmpeg -i "filename_%05d.tif"  -auto-alt-ref 0 -c:v libvpx output.webm
```

```bash:画質を指定する
ffmpeg -i "filename_%05d.tif"  -auto-alt-ref 0  -c:v libvpx -crf 10 -b:v 4M output.webm
```

```bash:画質とFPSを指定する
ffmpeg -framerate 24 -i "filename_%05d.tif"  -auto-alt-ref 0  -c:v libvpx -crf 10 -b:v 4M 
 -r 24 output.webm
```

```bash:画質とFPSを指定して音声と結合する
ffmpeg -framerate 24 -i "filename_%05d.tif" -i "audio.aif" -c:a libvorbis -auto-alt-ref 0 -c:v libvpx -crf 10 -b:v 4M -r 24 output.web
```

| オプション     |     意味     |
|:---------------|------------|
| -crf     | 画質目安(0に近づくほど高画質)<br>10から始めるのがオススメ |
| -b:v     | 最大ビットレート |
| -framerate    | 入力画像のfps |
| -r           |出力動画のfps |
| -c:a libvorbis| orbis 形式で音声をエンコードする |

## Unityにインポートする
インポートしたVideo ClipのKeep Alphaにチェックをつけます
![capture 115.png](https://qiita-image-store.s3.amazonaws.com/0/213392/d9f673e1-4b42-2024-5fcc-2e166c37c3dd.png)

## Androidで動画が透過されない場合
Video Clipのインポート時にTranscodeを有効化すると透過されるようになります
![capture 127.png](https://qiita-image-store.s3.amazonaws.com/0/213392/0678c58e-4903-d7a5-feef-3806be89e1ce.png)
プログラミング学習記録37〜バックアップを取ることの大事さに気づけた〜

##今日やったこと
- Progate Railsで作ったアプリをCloud9で再現する（続き）

今日は道場コース３までは終わらせたかったのですが、３の画像アップロード・編集機能をつけるところまでしか行けませんでした。

２から３に入るときにターミナルの操作をミスってよくわからない状態になってしまったので、環境構築からやり直したのが原因です。

こういう時の為にも、バックアップをとっておくことがいかに大事かを身をもって実感しました。

道場コース３の手順に従って、画像アップロード・編集機能をつけることができたのですが、デフォルトの画像を設定するところがうまくいきませんでした。

Progateとコードはまったく同じなのに表示されないのは不思議です。

アップロードした画像は問題なく表示されるのですが、何もアップロードしなかった時のデフォルトが表示されないのはなぜでしょうか？

とりあえず、これから先に進むにあたってすぐに支障があるわけではないので、このまま先に進みます。

明日こそは最後まで終わらして、完成させたいと思います（時々バックアップをしながら）

おわり
[Resharper.Tips]Guidを生成する

# ｶﾀｶﾀ(nguid)ﾀｰﾝ!　以上！
![guid.gif](https://qiita-image-store.s3.amazonaws.com/0/350409/233488aa-c553-973b-680c-8bd94e58f2c2.gif)

Resharperの"開発者に必要なもの分かってる感"異常。
Jenkinsのビルドで docker-compose up が失敗する

# Jenkinsのビルドで `docker-compose up` が失敗する

Jenkinsが実行するシェルスクリプトに

```bash
docker-compose up
```

を書いてビルド実行したところ、

```
Couldn't connect to Docker daemon at http+docker://localhost - is it running?

If it's at a non-standard location, specify the URL with the DOCKER_HOST environment variable.
```

というエラーが表示されました。


# 調査

調査したところ、こちらの記事を見つけました。
https://stackoverflow.com/questions/38105308/jenkins-cant-connect-to-docker-daemon


`jenkins` ユーザーが `docker` グループに追加されていなかったため、アクセス権限がなく、エラーになったということのようです。

試しに、以下のコマンドで `docker` グループのメンバーを確認したところ、 `jenkins` というメンバーはいませんでした。

```bash
cat /etc/group | grep docker
```


# `jenkins` ユーザーを `docker` グループに追加する

以下の手順でメンバーを追加します。

```bash
# jenkinsユーザーをdockerグループに追加する
sudo gpasswd -a jenkins docker

# dockerグループのメンバーを確認する
cat /etc/group | grep docker
```

ここで、再度、 `docker-compose up` を実行したところ、症状は改善しませんでした。
そこで、以下のように各種サービスを再起動したところ、症状が改善しました。

```bash
# dockerサービスを再起動する
sudo service docker restart

# jenkinsサービスを再起動する
sudo service jenkins restart
```

# さいごに
サービスの再起動は大事ですね。
IPアドレスとは？

##IPアドレスとは
インターネットに接続された機器を識別するために割り当てられたナンバー。
インターネット上の住所に当たるもの。
どのネットワークのどのコンピュータかを示している。

IPアドレスは数字の羅列で作成されている。
IPv4と書いてあるのをよく見るがこれはバージョンを示している。現在普及しているのはIPv4。
ちなみにIPv6もある。

##IPアドレス構成(IPv4)
本来は32ビットの2進数だが分かりづらいので8ビットごとに10進数にしドットで区切って表示している。

```
☆イメージ
2進数32ビット
10101100000100001111111000000001

8ビットごとにドット区切り
10101100.00010000.11111110.00000001

8ビットごとに10進数で表示（これが普段見るやつ！）
172.16.254.1
```

また、IPアドレスはネットワーク部とホスト部に分かれている
ネットワーク部　⇒　どのネットワークかを示す
ホスト部　⇒　どのコンピュータかを示す

IPアドレスのどこからどこまでがネットワーク部とホスト部なのかを示すために
サブネットマスクが振られる。

サブネットマスクは10進法で表記される。（IPアドレスの構成と同じ）
これを2進数32ビットに戻したときに
`1の箇所がネットワーク部`
`0の箇所がホスト部`
となる。

```
☆イメージ
IPアドレス ⇒      172.16.254.1
サブネットマスク ⇒ 255.255.255.0

IPアドレス（2進数）⇒      10101100.00010000.11111110.00000001
サブネットマスク（2進数）⇒  11111111.11111111.11111111.00000000

ネットワーク部分 ⇒ 10101100.00010000.11111110
ホスト部分 ⇒ 00000001
```

###IPアドレスの種類
####グローバルIPアドレス
`インターネットに接続するためのIPアドレスであり、世界で一意のアドレス。`

####プライベートIPアドレス
`ローカルでしか使用できないIPアドレス。`

###補足
IPアドレスはICANNと呼ばれる最上位の国際的な機関がまとめている。

そこからインターネット・サービス・プロバイダー(ISP)に、グローバルIPアドレスがまとまって割り振られている。（ISPの例としてはNTT、KDDI、ビッグローブ等々）

インターネット接続のためにブロードバンドルーターを使用すると、ISPからは自動的に、一つのグローバルIPアドレスが提供され利用者はインターネットを使用出来る。
【JavaScript】配列【自己学習】

##配列でできること
配列を用いることで、**１つの変数や定数に対して複数の値を代入することができる**。

##配列の書き方
####配列の代入
値はまとめて[]（大括弧）で囲み、それぞれカンマで区切る。

```array-1.js
const sports = ["soccer", "baseball", "tennis"];
const numbers = [1, 2, 3, 4 ,5];
console.log(sports);
console.log(numbers);

//コンソール
//["soccer", "baseball", "tennis"]
//[1, 2, 3, 4 ,5]
```

配列に入っている値は**要素**と呼ばれる。
####インデックス番号
配列内の要素にはそれぞれに**インデックス番号**が割り振られている。インデックス番号は一番左の要素から0,1,2,3...の順となっている。

```array-2.js
const sports = ["soccer", "baseball", "tennis"];
console.log(sports[1]);

//コンソール
//baseball
```

`配列名[インデックス番号]`と指定することで、特定の要素のみを出力することができる。
####要素の更新


```array-3.js
const sports = ["soccer", "baseball", "tennis"];
console.log(sports[2]);

sports[2] = "basketball";
console.log(sports[2]);

//コンソール
//tennis
//basketball
```
要素に値を代入することで、要素を更新することができる。
####length
`配列名.length`とすると、配列内の要素の数を出力することができる。

```array-4.js
const sports = ["soccer", "baseball", "tennis", "basketball", "rugby"];
console.log(sports.length);

for (i = 0; i < sports.length; i++) {
  console.log(sports[i]);
}

//コンソール
//5

//soccer
//baseball
//tennis
//basketball
//rugby

```

上記のコードでは、for命令の条件式を`i < sports.length`としたことで、配列の要素すべてが個別に出力されている。
Ubuntu 7zip圧縮(パスワード付き)

## 概要
zipだと文字化けするので7zipが便利。

## 7zipインストール
```bash
$ sudo apt install p7zip-full
```

## 7zでパスワード付き圧縮
コマンドオプション"a"で圧縮。

```bash
$ 7z a -p<passwoed> <出力名>.7z <圧縮したいディレクトリ>
```
Swift の Optional 型の扱い方メモ

Swift のオプショナル型について、自分なりにまとめました。

サンプルコードでは、下記のようなクラス定義のインスタンス `user` を使った例を記しています。 Swift4 で試しているはずです。

```swift
class User {
    var name: String?
}
```


# `?` をつけて扱う

```swift
user.name?.count
```

これだと count も Int? になるので、その後も延々と Optional として扱う必要がある

# `!` をつけて扱う
```swift
user.name!
```
`!` は開示指定と呼ぶ。

万が一 name にデータが入っていないい時は実行時エラーが出る覚悟の時。

# `??` でデフォルトの値を指定してあつかう

```swift
user.name ?? "Unknown name"
```

`??` は nil 合体演算子と呼ぶ。

# `if` / `while` / `guard` 文で Optional じゃない変数に入れて扱う

```swift
guard let name = user.name else {
    // return とか break とか throw とか
}

name.count 
```

if と while では、そのスコープ内で変数を利用できる。オプショナル束縛と呼ぶ。

guard 文では、後続の文でも変数を利用できる。kotlin の let も嫌いじゃないけど、顧客の求めていたもの感はこの guard 文のほうが大きい。 guard 便利
JSONの基本と便利なサイト

## JSONとは
JSON = JavaScript Object Notation

JSONとはJavaScriptのオブジェクトを定義するための形式です。
複数のデータを保存したい場合に、JSONによって複数のデータをまとめることができます。
つまり、**様々なデータを扱いたいときに使用します。**

## 気をつけること
JavaScriptのオブジェクトと先述しましたが、JavaScriptと少し違った記述方法をとります。

**JavaScriptの場合**

```data.js
data = {
  member: [
    {
      name: "Tanaka",
      age: 20
    },
    {
      name: "Yamada",
      age: 31
    },
    {
      name: "Saito",
      age: 26
    }
  ]
}
```
**JSONの場合**

```data.json
{
  "member": [
    {
      "name": "Tanaka",
      "age": 20
    },
    {
      "name": "Yamada",
      "age": 31
    },
    {
      "name": "Saito",
      "age": 26
    }
  ]
}
```

### 1. 『"』を使う
JavaScriptでは、シングルクオーテーション('')を使うこともできるが、
JSONでは必ず、**ダブルクオーテーション("")を使う**

### 2. コメントは使えない
コメントを記述することはできない

### 3. keyもダブルクオーテーションで囲む
JavaScriptでは、keyをダブルクオーテーションで囲まないが、
JSONでは必ず、**keyをダブルクオーテーションで囲む**

```sample.js
//JavaScript
{
  name: "Tanaka",
  age: 20
}

//JSON
{
  "name": "Tanaka",
  "age": 20
}
```

### 4. トレイリングコンマは使えない
JavsScriptでは使っても機能するが、JSONで使うと機能しなくなってしまうので使用しない

```sample.js
//JavaScript
{
  name: "Tanaka",
  age: 20, //←この最後にあるコンマ
}

//JSON
{
  "name": "Tanaka",
  "age": 20
}
```

## 便利なサイト
[JSON Formatter ](https://jsonformatter.curiousconcept.com/)
JSONのフォーマットを正してくれる

[myjson](http://myjson.com/)
JSONを返すだけのAPIを作ってくれる
アロー関数についての色々

## 基本形
```sample.js
const hoge = () => {
  console.log('hoge');
};

hoge()
//=> hoge
```

## 引数を使う
```sample.js
const hoge = (value) => {
  console.log(value);
};

hoge('return value')
//=> return value
```

## ()の省略
引数が1つの場合は、``()``を省略することができる

```sample.js
const hoge = value => {
  console.log(value);
};

hoge('return value')
//=> return value
```
引数が2つ以上の場合は``()``を省略することができない

```sample.js
const hoge = value1, value2 => {
  console.log(value1);
  console.log(value2);
};

hoge('return value1', 'return value2')
//=> SyntaxError



const hoge = (value1, value2) => {
  console.log(value1);
  console.log(value2);
};

hoge('return value1', 'return value2')
//=> return value1
//=> return value2
```

## returnを使う
```sample.js
const hoge = () => {
  return 'hoge';
};

console.log(hoge());
//=> hoge
```

## {}の省略
returnを使用しない場合は``{}``を省略することができる

```sample.js
const hoge = () => 'hoge';

console.log(hoge());
//=> hoge
```

1行だけで書ける実行であれば下記のように書ける

```sample.js
const hoge = () => console.log('hoge');

hoge()
//=> hoge
```
PIXI.Graphics を使って alpha 値を考慮した mask を行う

PixiJS で以下のようにすると `PIXI.Graphics` を使ってマスクすることができますが、このままではアルファ値が考慮されず使い勝手が悪かったので、やり方を調べてみました。

```javascript:アルファ値が考慮されない例
const sprite = new PIXI.Sprite(texture);

// マスク作成
const mask = new PIXI.Graphics();
sprite.mask = mask;

// マスク描画
// メモ: ここでアルファ値や色を指定しても適用されない
mask.beginFill(); 
mask.drawRect(50, 50, 100, 100);
mask.endFill();
```

# 1. 答え

答えから言うと、`PIXI.Graphics` ではアルファ値を考慮しない仕様になっているので、代わりに `PIXI.Sprite` を使います。ただし、ここでは画像を読み込んでマスクをしたいわけではなく、`PIXI.Graphics` に描画したものをマスクとして使用したいので、`PIXI.Graphics` から `PIXI.Sprite` に変換して使います。

(ただし、現在の PixiJS では `PIXI.CanvasRenderer` の場合に `PIXI.Sprite` をサポートしていないようです。)

`mask.generateTexture()` を使うのは動的にマスクをいじるときにスマートな方法ではないので、ここでは `PIXI.RenderTexture` を使います。

```javascript:アルファ値が考慮される例
// メモ: 以下の変数があると仮定
//     texture: PIXI.Texture
//     app: PIXI.Application

const sprite = new PIXI.Sprite(texture);

// マスク作成
// メモ: texture の読み込みが終わっていないと [sprite.width, sprite.height] === [1, 1] になる
// メモ: 代わりにサイズを直接指定しても良い
const renderTexture = PIXI.RenderTexture.create(sprite.width, sprite.height); 
const renderTextureSprite = new PIXI.Sprite(renderTexture);
sprite.mask = renderTextureSprite;

const mask = new PIXI.Graphics();

// マスク描画
// メモ: アルファ値として RGB の R を使用
mask.beginFill(0xff0000);
mask.drawRect(50, 50, 100, 100);
mask.endFill();

app.renderer.render(mask, renderTexture, false);
```

マスクの内容を変更したいときは、`mask` に書き込んでから `app.renderer.render(mask, renderTexture, false);` とすれば更新できます。
RGB 値の R をアルファ値の代わりに使えるので、`0x000000 ` のように色を指定して描画をすればその領域を透明にできます。

参考「[Mask + renderTexture - PixiJS Examples](https://pixijs.io/examples/#/demos/mask-render-texture.js)」
参考「[Graphics and masks don't work correctly · Issue #2770 · pixijs/pixi.js · GitHub](https://github.com/pixijs/pixi.js/issues/2770)」
参考「[PixiJS API Documentation](http://pixijs.download/release/docs/index.html)」(公式ドキュメントのトップページ)

# 2. その他

しっかりと理解できていないのですが、マスクそのものを `app.stage.addChild()` する必要があるそうです。
(マスクをかけたいものに対してではなく、`app.stage` に直接？)

公式の Examples を見ると、なぜか `PIXI.Graphics` でアルファ値を指定していたり、逆に `PIXI.RenderTexture` でアルファ値を指定していませんが、アルファ値を指定してマスクしたいときは `PIXI.RenderTexture` を使います。
mutation testingについて考えた

## mutation testingとは？

以下を参照
https://ja.wikipedia.org/wiki/%E3%83%9F%E3%83%A5%E3%83%BC%E3%83%86%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E8%A7%A3%E6%9E%90

コードのいろいろなところを改変して、テストがちゃんと壊れるか？を確認するテストです。

## 使ってみた

rubyのmutantを使いました
https://github.com/mbj/mutant

## 感想

### 俺たちは手動でよくやっている

プログラムのいろいろな箇所を適当にいじってみることってよくあると思います。

目的は、バグのあるプログラムをとりあえずあてずっぽうで直してみるときや、テストがちゃんとfailすることを確認するときや、冗長な箇所を削ってみるときなど、いろいろあると思います。

mutation testingはこれを自動化できるということだと思いました。

### 頭を使わないでプログラミングできる

mutation testingの補助を借りると、かなり頭を使わないでプログラミングできます。

漏れなく思考することって結構負担のかかる思考だと思います。
例えば、正解を一つ見つける思考よりも、それ以外に正解が無いことを証明する思考のほうが頭を使います。

mutation testingを使うと乱数のちからで漏れなく思考する部分を助けてくれるので、頭の負担がかなり減ります。

昔の俺 -> 注意して実装を書く
今の俺 -> 注意してテストコードを書いて、頭を使わずに実装を書く
少し未来の俺 -> 頭を使わずにmutation testingの質問(これは冗長？バグ？テストの不備？)に答えながらテストコードを作り、頭を使わずに実装を書く
かなり未来の俺 -> 頭を使わずにテストと実装ができあがるのを待つ

### 今後のポイント

#### false positive

調べたら、mutation testingの課題は、false positiveが出ることらしいですが、これは帰無仮説(コードにバグが無い)をおいて検定すれば良いと思います。

killされた割合だけではなく、指標を増やしても良いかもしれません。

#### 実行時間

railsの小さいモデルクラスとかに適用しても実行時間が10分以上かかったので、デイリーユースはできなそうでした。

バグは見つかりませんでしたが、テストの不備(将来のバグにつながる)はたくさん見つかったので(普通のコードカバレッジが100%だったにもかかわらず)、再現率の低いバグがあることはわかっているが、血眼でマジで見つからないときや、本気で品質を上げたいときは良いと思いました。

### 実現手段

あまりサーベイしていないですが、素人考えで以下のようなアイデアを思いつきました。

#### LLVM

mutation testingをC++に適用すると、ビルドに時間がかかりすぎてmutationをたくさん計算できません。
すでにあると思いますが、LLVMやJavaの中間コードを改変するようにすれば、ビルド時間を短縮できそうです。

#### 影響範囲チェックやコードカバレッジと組み合わせる

あるコードの修正がどこに影響を与えるか？ってよく研究されていると思います。コードカバレッジも多分よく研究されています。

mutationの影響のあるテストだけを実行するようにすれば、テスト実行時間を短縮できそうです。

#### AI

ニューラルネットにプログラミング言語を学習させて、効率よくバグを発生させる方法を学ばせたり、効率よくバグを検知する方法を学ばせたりしたら面白そうです。

ニューラルネットのGANのようにコードとテストを戦わせるような仕組みにしたら面白そうです。
サッパリ系ビスケットプログラミング#8マリオ風ゲーム/当たり判定（端から落下）

※今回は短めの記事です。読了3分くらいです。

SEの方の間でも評価が上昇傾向のビジュアルプログラミング言語、Viscuit（以下ビスケット）でマリオ風のゲームを作成していきます。#7で小マリオがスタート位置からフラッグのところまで移動できるようになりました。…が、またもや問題発生w

※ビスケットのコーディングは全て描画で行います。こちらの記事はビスケットでのコーディングを簡潔に紹介するため、敢えてサッパリした描画のプログラムにしております。こちらをベースに、お好みの描画でオリジナリティーの高いプログラムに仕上げてくださいm(_ _)m

#端から落下する当たり判定
これを当たり判定と言って良いか？ですが、「ブロックの位置関係と動き」の判定という意味で使ってます。前回までの制作で、小マリオは一通り動くようになったので安心していましたが、問題発生です。

###ブロックの端から自然落下できない！

ビスケットで少し複雑なものを作り始めるとよく、こういうことが起きます。
原因は明白なのです！

###ブロックの端から落ちる命令を作っていないからw

こうなると、「何か効率よく作る方法はないのかなあ？」となり、考えること数十分…数時間…数日間…ってなると、いやになってきます^ - ^。
そうなる前に発想の転換です。

「急がば回れ」

一見回り道に思えますが、単純なメガネを一つ一つ積み重ねた方が早い場合が多いのがビスケットのプログラミングです。
（もちろん、たまーに効率を改善する画期的な方法を見つけることもあります。効率を考えることは良いことですが、大抵作ってしまった方が早いデス）

では作っていきます。割れるブロック、ハテナブロック、割れないブロック、土管IN、土管OUTの5種類分×2セット分（左右）＝割れたメガネ10個でできます。
![7E5B4CF7-1C97-4E57-A169-95B235C768A6.png](https://qiita-image-store.s3.amazonaws.com/0/373284/1b75dbb2-e5e9-11e5-3935-65572a621f4c.png)
![8B766BC2-790C-4AD4-8426-FC86F3EA8C7D.png](https://qiita-image-store.s3.amazonaws.com/0/373284/3d8483c0-44a0-237f-8923-d5011237cd33.png)
![63BA3C90-1B0F-477F-893C-9A068C18B900.png](https://qiita-image-store.s3.amazonaws.com/0/373284/1e8f1f9c-652a-c5c7-7ca6-26ca0d36ed58.png)

はい、約10分程で、「端からの自由落下」プログラムの完成です。

10個の割れたメガネ群の意味を、一般的なプログラム風にまとめて訳すと
「もし小マリオが割れるブロック（ハテナブロック/割れないブロック/土管IN/土管OUT）の端に位置し、なおかつ左（右）に重力センサー（⬇︎）が存在する位置に位置する時、十字キーの左（右）の入力があれば、左（右）にある重力センサーと場所が入れ替わる（つまり左（右）に移動する）」
という意味になります。

足元に重力センサーがある位置まで移動するわけですから、この後は自由落下するわけです。

どんなプログラミングでもトライアル＆エラーの積み重ねですね。今回は短時間で解決でした！
Go + andlabs/uiでGUIアプリをクロスコンパイルする方法

## 概要

ポイントまとめ

- GoでGUIを作る
- GUIライブラリはandlabs/uiを使う
- linuxでlinux/windows/macに対してクロスコンパイルする

リポジトリ: https://github.com/contribu/equalizer-apo-translator

## やりたかったこと

Windows + GUI + 商用利用 + dynamicリンクなし + ビルド環境/方法をソースコードで管理

を実現したかった。

## 技術選択

C#は.Netに依存してしまう。今なら大概の環境で動くかもしれないが、少し前は.Netが入っていない場合とかで動かなかったので不採用。

Delphiは、商用利用可能なバージョンを持っていなかったので不採用。
ビルド環境/方法をソースコード管理する方法も知らない。

Lazarusはできたかもしれないが、試していない。

Goはdynamicリンクなしにできることを聞いていた。
GUIライブラリを調べたら、andlabs/uiはGTKに依存しているらしいが、windows向けビルドなら実行時に依存なしにできるらしいことがわかった。
andlabs/uiにはクロスコンパイル用のdockerが用意されていることもわかった。
Goにした。

## Go + andlabs/uiでGUIアプリをクロスコンパイルする方法

### 基本

andlabs/uiの使い方は、公式ページを参照。
https://github.com/andlabs/ui
examplesディレクトリの中を見ると使い方が分かる。

### クロスコンパイル

#### クロスコンパイル用のdocker image

以下にandlabs/uiのクロスコンパイル用のdockerがあることが書いてある。
https://github.com/andlabs/ui/wiki/Building-and-Cross-Compilation
https://github.com/magJ/go-ui-crossbuild/

#### circleciでクロスコンパイルする方法

これを参照。
https://github.com/contribu/equalizer-apo-translator/blob/master/.circleci/config.yml

#### 注意点

- クロスコンパイル用のdockerイメージが最後にビルドされたのは、2年前(多分2017年くらい)
- なので、ライブラリとかが古い
- docker imageの再ビルドが面倒だったので、そのまま使ったが、一部のライブラリはアップデートする必要があった(.circleci/config.yml参照)
- クロスコンパイルのコマンドの引数指定方法はよくわからなかったので、スクリプトのソースコードを見て、うまく動くように与えた
- .circleci/config.ymlに記載されているgo-bindataやlreleaseは、このアプリ特有の処理なので、無視してください
- macのビルドは動きませんでした。推測ですが、クロスコンパイル用のdockerイメージが古いからかもしれません。
- linuxのビルドが動くかどうかは試していません。
Material UI の theme を使って styled-components 内で media query を指定する



styled-components の中で breakpoints 指定する際の簡単な方法です。
Material UI の theme を使用する前提です。

```js
const ModalCard = styled.div`
  background: white;
  width: 600px;
  position: absolute;
  left: calc((100% - 600px) / 2);
  ${theme.breakpoints.down('xs')} {
    width: 100%;
    left: 0;
  }
```

### 解説

theme.breakpoints の返り値が css に直接使える API になっています。
https://material-ui.com/layout/breakpoints/#api

```js
theme.breakpoints.down('xs')
// @media (max-width: 599.95px)
```

なので以下のような css が出力されます。


```css
@media (max-width: 599.95px)
.jJmNcV {
}
```