OmniAICreator/Qiita-1.07M huggingface dataset:
Tomcatのバージョンを確認する

Tomcatのバージョンを確認するには、インストールフォルダに移動してversion.batを実行する。
この時、JAVA実行環境の場所が設定されていないと以下のメッセージが表示される。

```DOS
>cd "【Tomcatのインストールフォルダ】"
>version.bat
Neither the JAVA_HOME nor the JRE_HOME environment variable is defined
At least one of these environment variable is needed to run this program
```

JAVAへのパスが通っていなかったのでPATHに追加。

```DOS
>java -version
'java' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。

>set path=%path%;"【Javaのインストールフォルダ】\bin"
>echo %path%
...;"【Javaのインストールフォルダ】\bin"

>java -version
openjdk version "1.8.0_192"
OpenJDK Runtime Environment (AdoptOpenJDK)(build 1.8.0_192-b12)
OpenJDK 64-Bit Server VM (AdoptOpenJDK)(build 25.192-b12, mixed mode)
```

JAVA実行環境のインストール先をJRE_HOMEに設定。

```DOS
>echo %JRE_HOME%
%JRE_HOME%
>set JRE_HOME=【Javaのインストールフォルダ】
```

再度version.batを叩くとバージョン情報が表示された。

```DOS
>version.bat
Using CATALINA_BASE:   ...
Using CATALINA_HOME:   ...
Using CATALINA_TMPDIR: ...
Using JRE_HOME:        ...
Using CLASSPATH:       "【Tomcatのインストールフォルダ】\bootstrap.jar;【Tomcatのインストールフォルダ】\tomcat-juli.jar"
Server version: Apache Tomcat/8.5.49
Server built:   Nov 17 2019 18:45:30 UTC
Server number:  8.5.49.0
OS Name:        Windows Server 2016
OS Version:     10.0
Architecture:   amd64
JVM Version:    1.8.0_192-b12
JVM Vendor:     Oracle Corporation
```
slack コード上でのグループメンションの書き方

グループメンションつけたい時どう書くんだっけって思うことがあるのでメモレベルで残しておく
attachmentsのtextをメンションにしたい場合

        "attachments":[
          {
            "fallback":"テキトー",
            "pretext":"テキトー",
            "color":"#2eb886",
            "text": "<!subteam^[id]|[handle]>",
            "fields": ...
          }
        ]

[id]と[handle]は以下のapiから取得
https://api.slack.com/methods/usergroups.list/test

idとhandleが返ってくるので、それを埋め込めばいける
Flutterで写真を取得したい君に

# 何をやるの?
タイトルのままです。
最近、趣味でFlutterを使ってアプリ開発をしているのですが、アプリを作っている中で**「そういえばFlutterでどうやって写真とかカメラとか操作するんや?」**と思ったので忘れないように書いてみました。

### 環境
android studio 3.5.1
macOS Catalina 10.15.1

# 準備
今回は`image_picker`というパッケージを使います。
まず、`pubspec.yaml`にパッケージを追記します。

```yaml:pubspec.yaml
dependencies:
  flutter:
    sdk: flutter

  # The following adds the Cupertino Icons font to your application.
  # Use with the CupertinoIcons class for iOS style icons.
  cupertino_icons: ^0.1.2
  image_picker: ^0.6.3 # 追加部分
```

そしたら、ターミナルで

```terminal
$ flutter packages get
```

を実行する。

## iOSの`info.plist`を設定する
パッケージをインポートしたが、iOSだとこのままでは動かない。
iOSの`info.plist`でいくつか設定しておくことがあるのでそれをする。
プロジェクト内の`ios/Runner/Info.plist`を開く。
下のキーと値を`Info.plist`の中に追加する

```:Info.plist
	<key>NSCameraUsageDescription</key>  
	<string>画像のアップロードのため</string>
	<key>NSPhotoLibraryAddUsageDescription</key>
	<string>画像のアップロードのため</string>
	<key>NSMicrophoneUsageDescription</key>
	<string>画像のアップロードのため</string>
```


# コード
## レイアウト

今回、画面は適当にデフォルトのサンプルアプリを少しいじったものを使う
サンプルアプリの`_MyHomePageState`を以下のように修正

```dart:main.dart
class _MyHomePageState extends State<MyHomePage> {
  File _image; // 画像を入れる変数

  /// 画像が取れたら、setState()で更新する
  Future _insertImage() async {
    // TODO 更新する処理を書く
    setState(() {

    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              '写真を選択してね',
            ),
            SizedBox(
              child: (_image != null)
                  ? Image.file(_image)
                  : Container()),
            RaisedButton(
              child: Text("写真を選択"),
              onPressed: () => _insertImage() /// ここにImagePickerの処理を書く,
            )
          ],
        ),
      ),
    );
  }
}

```

とりあえず形だけ作っておく。
一応軽く説明しておくと、、、

`_image`は画像を取得できたときに、入れるための変数として定義している。
あと、`void insertImage()`は同じく`_image`に取得できた画像を代入するための場所


```dart

SizedBox(
  child: (_image != null)
    ? Image.file(_image)
    : Container()),
```

ここでは、画像を取得できているかどうかを判別して、できていなかったら(`_image`がnull)だったら、空の`Container()`を表示させるようにしている。

## 画像を取得

まずは画像を`ImagePicker`で取得する処理を書いていく

```dart:main.dart

  /// 画像が取れたら、setState()で更新する
  Future _insertImage() async {
    var image = await ImagePicker.pickImage(source: ImageSource.gallery);  // ==追加==

    setState(() {
      // TODO 更新する処理を書く
      _image = image; // ==追加==
    });
  }

```

順に説明すると、まず`var image = .....`の部分でユーザーのライブラリー開き、画像が選択されるまで`await`で待つようにする。
その後、そこで選択された画像が`image`に`File`型で代入される。

`setState()`では選択された画像を先ほど定義したプライベート変数の`_image`して更新する。

次は、画像を選択させる`RaisedButton`に追記していく。


これで完成!!
JavaScriptのオブジェクトに関する文法


```js
const customer = {name: "taro", age: 22};
const {name, age} = customer;

console.log(name);
console.log(age);

// output 
// taro
// 22
```



```js
const name = "taro";
const age = 22;

console.log({name,age});
// output
// { name: 'taro', age: 22 }
```
shinyapps.ioでパッケージが認識されない問題の解決策(個人的メモ)

## 問題

`shinyapps.io`にアプリをアップロードすると、パッケージが見つかりませんエラーが生じている場合、

```{r}
rsconnect::appDependencies()
```

を単純に実施すると、

```r
Warning messages:
1: In fileDependencies.R(file) :
  Failed to parse C:/Users/*****/AppData/Local/Temp/RtmpYJF3Ju/file106067494ea/app.R ; dependencies in this file will not be discovered.
2: In fileDependencies.R(file) :
  Failed to parse C:/Users/*****/AppData/Local/Temp/RtmpYJF3Ju/file106067494ea/main_logic.R ; dependencies in this file will not be discovered.
```

という風にエラーが生じていることが確認できる。

これは、多分、日本語が入力されている場合に、うまくlibraryを拾えないことが原因と考えられる。


## 解決法

```{library.R}
library(shiny)
library(tidyverse)
library(rhandsontable) ....
```

という感じで、日本語が一切含まれない.Rファイルを適当に作って、それも一緒にデプロイすることで、この問題解決しました。
プログラムの条件式をシンプルにする2つだけの手法

条件式というのは何かと複雑になってくるものです。
１つ１つはシンプルなはず。なのになぜ？
そこを複数の視点から解明して実用的に使っていたら3個に集約されました。

#プログラムの条件式をシンプルにする2つだけの手法

##条件式は除外ケースから先に処理（書いて）いく
例えば、stringを正の整数にする関数でint型で返すとします。
仕様としては数字のみで、小数点「.」があれば切り捨てる。「-」その他の文字があれば仕様外ということで常に -1 を返す、とします。また0は許容（OK）とします。
また、nullは-1で、""（空文字）は0とします。

tryparse関数がありますが、あえてparse関数を利用するものとして、tryも利用しないこととします。


順序としては
1. nullならreturn -1
2. 0と1~9と「.」以外の文字があればreutrn -1
3. 「.」があれば、stringの最初の「.」以降の右側を除去する。
4. 先頭に0があれば除去する
5. ""ならreturn 0

上記1~5を行っておくことで、ここに処理が遷移してきた段階では数字のみで来ます。

例外エラーが生じない状態で、parse関数を使えますし、万が一にも例外エラーが出るケースがあれば、それに対応できます。

多くのケースではtry～catchでよいのですが、例外の内容によって細かく処理が分かれるようなケースでは
このように除外するケースを先に書いておく、というのがとても有用でした。

##関数内の諸条件ではローカル関数もしくは匿名関数として処理する
VisualStudio2013の頃から、個人的には匿名関数が好きになってしまったのでご紹介します。
感覚としては関数の中に、その関数専用の特化チョイ関数を書く簡便さで使っています。

今では（C#7からは）ローカル関数としてシンプルに記述できます。（コメントで教えて頂きました）

~~~c#
匿名関数では
    Func<bool, string>is_correct_value = ( in_text) =>
    {
    };
だったのが、ローカル関数では
    bool is_correct_value(string in_text)
    {
    }
と、普通にかけます。
~~~


~~~c#
private int get_positive_integer(string in_int_text)
{
    Func<bool, string>is_correct_value = ( in_text) =>
    {
        if(in_text == null)
            return false;
        if(Regex.IsMatch("[^0-9.]", in_text)
            return false;
        return true;
    };
    if(is_corrct_value(in_int_text)==false)
        return -1;

    string tmp_text = in_int_text;
    if(tmp_text.Contains(".")==true)
        tmp_int_text = tmp_int_text.Substring(0, tmp_int_text.IndexOf('.'));
    if(tmp_int_text == "")
        return 0;

    int ret_value = int.Parse(tmp_int);
    return ret_value;
}
~~~

のような感じです。

##ローカル関数なら IEnumerable内でも yield return を使える
yieldのおかげで複雑な処理を複数段に分けて、簡潔な処理記述にできるのですが、
匿名関数のときは IEnumerable <int> の中で匿名関数が使えずに「仕方ないな」と思っていました。
ですが、ローカル関数ではいけるのでもっと早くにあればよかった、という感じです。
（匿名関数が使えなくても専属のprivate関数を書いた程度の違いではありますが、数ヶ月後の可読性というか
思い出しやすさが違います（汗）

ちなにみyieldは個人的には処理手順の段階化（レイヤーを分けられる）・単純化に有用だなと心底思っています。この機能のおかげでオフコン世代のインタープリタ記述のものをプリンタの独自命令にまで変遷させていく、というプログラムを書くことができました。（次の人に説明しやすい構成（のはず・・・）で書けました）
PowerShell ファイルを作成するコマンド New-Item

# 目的

- PowerShellでファイルを作成する時のコマンドを覚えるためにまとめる

# 書き方の例

- 下記に新規ファイルを作成するコマンドを記載する。

    ```powershell
    > New-Item ディレクトリパス ファイル名
    ```
Dockerのマウント3種類についてわかったことをまとめる

# はじめに
Dockerのマウント3種類(`Volumes`、`bind  mounts`、`tmpfs  mounts`)について、
[公式リファレンス](https://docs.docker.com/storage/)を読んで、以下の項目をまとめたものになります。

* マウントされたデータの保存先について
* `Volumes`、`bind  mounts`、`tmpfs  mounts`の概要
* `Volumes`、`bind  mounts`、`tmpfs  mounts`の使用例

# マウントの種類によるデータの保存先
マウントの種類によらず、コンテナ内からは同じようにデータが見えます。
コンテナのファイルシステム内のディレクトリまたは個別のファイルとして公開されます。
3種類のマウントの違いについて考える上で、ポイントとなるのはデータがDockerホストのどこにあるかを考えることです。

* `Volumes`は、Docker（Linuxでは`/ var / lib / docker / volumes /`）によって管理されるホストファイルシステムの一部に保存されます。Dockerを使用したプロセス以外の場合では、Dockerによって管理されるファイルシステムを変更しないでください。**`Volumes`は、Dockerでデータを保持するための最良の方法**です。

* `bind mounts`は、ホストシステムのどこにでも保存できます。DockerホストまたはDockerコンテナ上の非Dockerプロセスは、いつでも変更できます。

* `tmpfs mounts`はホストシステムのメモリにのみ保存され、**ホストシステムのファイルシステムには書き込まれません。**

# それぞれマウントタイプについて

## `Volumes`について

* `Volumes`が作成されると、Dockerホストのディレクトリに保存されます。

* `Volumes`がコンテナにマウントされると、このディレクトリはコンテナにマウントされます。

* `bind Mount`と違って、`Volumes`はDockerによって管理され、ホストマシンのコア機能から分離されます。

* 特定の`Volumes`は複数のコンテナに同時にマウントできます。

* 実行中のコンテナがボリュームを使用していない場合でも、ボリュームは引き続き使用でき、自動的に削除されません。
  * `docker system prune`で削除することができます。


## `Bind mounts`について
 `Bind mounts`は`Volumes`と比較して機能が限られています。

* `Bind mounts`を使用すると、ホストマシン上のファイルやディレクトリはコンテナにマウントされます。
* マウント対象のファイルやディレクトリはホストマシン上の絶対パス(`full path`)によって参照されます。


## `tmpfs mounts`について
`tmpfs mount`はDockerホストあるいはコンテナ内のディスクのどちらにも保持されません。
コンテナが作成され削除されるまでの間に、非永続的な状態または機密情報を保存することができます。

# マウントの使用例
## `Volumes`の使用例

* 複数の実行中のコンテナ間でデータを共有したい場合。
   * 複数のコンテナが読み取り専用か読み書きのいずれかで、同時にマウントできる
* Dockerホストが特定のディレクトリまたはファイル構造を持つことが保証されていない場合。
   * ホストのファイルやディレクトリ等の構成を実行中のコンテナから分離することが`Volumes`にはできます。
* ローカルではなく、リモートホストやクラウドプロバイダーに保存する場合

* あるDockerホストから別のDockerホストにデータを移行、復元、バックアップしたい場合。

## `Bind mounts`の使用例
一般にできるだけ`Volumes`を使用すべきと公式リファレンスでは述べられています。

以下のユースケースに`bind mounts`が適していると記述されています。

* ホストマシンからコンテナへの構成(ファイルやディレクトリ構成)を共有したい場合。
   * ホストマシンから各コンテナに`/etc/resolv.conf`をマウントすることにより、DockerがデフォルトでコンテナにDNS解決を提供することができます。

* ソースコードや作成したアーティファクトをDockerホストとコンテナ間で共有したい場合。
   * 例えば、Mavenの`target/`ディレクトリをマウントした場合に、DockerホストでMavenプロジェクトをビルドするたびにコンテナは再構築されたアーティファクトにアクセスします。

* Dockerホストのファイルやディレクトリ構成が、コンテナが必要とするバインドマウントに一致することが保証されている場合。

## `tmpfs`マウントの使用例


* `tmpfs`マウントはデータをホストマシンかコンテナ内でも保持したくない場合。
   * これはセキュリティ上の理由か、大量の非永続化データを書き込む必要がある場合にコンテナのパフォーマンスを保護するためです。
【ふくだ学習録】アプリ制作part11【38日目】

# ふくだ学習録とは？
ふくだが学習したことの備忘録。
目に見える形で残すことによってやる気を出す個人的な作戦です。
他人に見せるように書いているわけではないので、すごく読みにくいです。

### 読了した本
[データベースエンジニア養成読本 [DBを自由自在に活用するための知識とノウハウ満載!]](https://www.amazon.co.jp/dp/4774158062/ref=cm_sw_r_tw_dp_U_x_FPphEbQFPPQRM )
[ゼロから作るDeepLearning](https://www.amazon.co.jp/dp/4873117585/ref=cm_sw_r_tw_dp_U_x_y3UiEbF3P6EG7)
[PHPフレームワーク CakePHP 3入門](https://www.amazon.co.jp/dp/4798048577/ref=cm_sw_r_tw_dp_U_x_.YIjEbS1K4JY2)
[SQLアンチパターン](https://www.amazon.co.jp/dp/4873115892/ref=cm_sw_r_tw_dp_U_x_XlokEbJQK2N7P )
[Docker入門](https://www.amazon.co.jp/dp/480071091X/ref=cm_sw_r_tw_dp_U_x_xVlmEbN8ZTHZK)


### 今読んでいる本

なし

# アプリ制作

### 進捗
私用が多かったので、あまり作成進んでいない。
一旦、下記赤枠部分のスクレイピング部分は完成した。（dockerコンテナでの環境構築と、scrapy,seleniumでの情報取得）
ここからは、scrapyからmysqlへの取得情報のカキコミを実装する。

<img width="1240" alt="スクリーンショット 2020-02-26 9.03.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356866/218526fb-48e6-f1c4-3af8-a734e39d19d4.png">

scrapyでスクレイピングする対象サイトの追加が、現在CUIコマンドで行なっているけど、できればGUI（というかブラウザ上の管理画面的なところ）で行えるようにしたいなぁ。。

ってなってきたら、
**①scrapyは、Django内で動かす**
**②Djangoでscrapyタスク作成画面を作成する**
**（具体的には「新規spiderを作成」と「クローリングの実行タイミングの制御」を管理できるようにする）**
**③scrapyで集めた情報をMySQLへカキコミする。**
上記の流れが良さそう(だと思ってる)

### 悩んでいる部分
悩んでいる（というか経験少なくて何がベストプラクティスかわからない）ところは下記の部分。

**1個目**
scrapyとDjangoは別コンテナで作成しなくてはならないって認識で合っているのか？
というかそもそも「Django側からscrapyを操作する」って対応が正しいのか？

**2個目**
scrapyで取得した情報をRDBへ書き込む方法は
①scrapy内部にcsvとして一旦保存。その後、csvファイルを一旦Django側に渡し、その情報あを元に一気にMySQLへ入力する」
②scrapyでクローリングを実行する度に、RDBへカキコミしていく。
上記2点のどっちの方が良さそうか？
（個人的な見解としては①のが効率良さそうやしベターな気がしてる。同じ情報を取得してるかどうかは、スクレイピング実行後に判明するから、都度RDBへ情報保存したところで効率変わらなさそうなので）

上記ちょっと社内の先輩に相談してみる。

### seleniumのエラー
spider実行すると、下記のエラーが出てspider止まってしまう事象が発生していた。

```console
selenium.common.exceptions.WebDriverException: Message: unknown error: session deleted because of page crash
```
しかも、同じコマンド打ってもエラーが発生するとき,しないときがあるという困った状況。
調べてみると、どうやらメモリ不足が原因（っぽい）。

[Capybara の e2e テストで Chrome が Selenium::WebDriver::Error でたまにクラッシュする](https://qiita.com/oieioi/items/0e9468c1d2ad2da1a94c)

とりあえずdockerへ割り当てるリソース増やした。これで解決されることを祈る。

# 今日の一言
エンジニアやのに最後の方祈って終わってしまってる。ダメダメエンジニアや。。。
精進していこ。。
Unityのコマンドラインオプション


Unityでビルドしたアプリケーションはターミナルやコマンドプロンプトで起動時に引数を渡して起動できる。
https://docs.unity3d.com/ja/2019.2/Manual/CommandLineArguments.html

以下公式で提供されているよく使うコマンドラインオプション


## アプリケーションの二重起動を防ぐ

```Windows
	$ test.exe -single-instance
```

## フレームなしのポップアップウィンドウで起動
```Windows
	$ test.exe -popupwindow
```

```Mac	
	$ test.app/Contents/MacOS/test -popupwindow
```

## フルスクリーン

### フルスクリーンで起動

```Windows
	$ test.exe -screen-fullscreen 1
```

```Mac	
	$ test.app/Contents/MacOS/test -screen-fullscreen 1
```
	
※以後、デフォルトでフルスクリーンで起動する	 

### ウィンドウモードで起動
```Windows
	$ test.exe -screen-fullscreen 0
```

```Mac	
	$ test.app/Contents/MacOS/test -screen-fullscreen 0
```

※以後、デフォルトでウィンドウモードで起動する

## ディスプレイを指定して起動 (~ Unity2019.2)

### ディスプレイ1で起動

```Windows
	$ test.exe -adapter 0
```

```Mac	
	$ test.app/Contents/MacOS/test -adapter 0
```

### ディスプレイ2で起動

```Windows
	$ test.exe -adapter 1
```	

```Mac	
	$ test.app/Contents/MacOS/test -adapter 1
```		

こちらのコマンドはUnity 2019.2まで
2019.3からは `-monitor` に変更されたらしい		

## ディスプレイを指定して起動 (Unity2019.3 ~)

### ディスプレイ1で起動

```Windows
	$ test.exe -monitor 1
```

```Mac	
	$ test.app/Contents/MacOS/test -monitor 1
```

## ウィンドウサイズの指定

### 1920x1080で起動

```Windows
	$ test.exe -screen-width 1920 -screen-height 1080 
```

```Mac	
	$ test.app/Contents/MacOS/test -screen-width 1920 -screen-height 1080 
```

### 800x600で起動

```Windows
	$ test.exe -screen-width 800 -screen-height 600 
```

```Mac	
	$ test.app/Contents/MacOS/test -screen-width 800 -screen-height 600
```

※以後、デフォルトで指定した解像度で起動する
コマンドラインでGCPのプロジェクトを作成

# 環境
- MacOS X 10.14.5 (Mojave)
- Homebrew 2.2.5
- Google Cloud SDK 281.0.0


# GCPアカウント登録
[【画像で説明】Google Cloud Platform (GCP)の無料トライアルでアカウント登録](https://qiita.com/komiya_____/items/14bd06d0866f182ae912)


# Google Cloud SDKのインストール
[Google Cloud SDKのインストール ~ 初期化](https://qiita.com/komiya_____/items/5af0dcc8639fad9fee29)

# まずはSDK認証
ログインしていない場合は

```bash
$ gcloud auth login
```
他のアカウントにログインしている場合は、対象アカウントに切り替えてからログイン

```bash
$ gcloud config set account アカウントID
$ gcloud auth login
```
以下のコマンドでログインしているアカウントを確認できます

```bash
$ gcloud config list account
```

# プロジェクト作成
```bash
$ gcloud projects create プロジェクトID --name プロジェクト名
```

# プロジェクトの切り替え
作成したプロジェクトをアクティブにします。

```bash
$ gcloud config set project プロジェクトID
```

# 設定を確認

```bash
$ gcloud config list

# [core]
# account = example@gmail.com
# project = プロジェクトID
```

# 請求先アカウントの設定


ここから設定
<img width="995" alt="スクリーンショット 2020-02-04 17.08.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287998/d7f69423-b671-6816-e185-8b7ede2f7b5e.png">

以下のポップアップが出なければ、請求先アカウント設定済みなのでスキップしてOKです。
<img width="876" alt="スクリーンショット 2020-02-09 21.45.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287998/14f33fa4-7da2-2b02-206e-5feb5ece3944.png">

<img width="878" alt="スクリーンショット 2020-02-09 21.45.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287998/72de2c43-4306-0b51-819b-66f407979281.png">


請求先アカウントが未設定だったり、無料トライアルが終わってたりすると後々こんなエラーが出ることがあります。

```
AccessDeniedException: 403 The project to be billed is associated with an absent billing account.
```

# リージョン / ゾーンの設定
上記のようにリージョンとゾーンが設定されていなければ以下のように設定。
設定値は任意です。

### リージョン設定

```bash
$ gcloud config set compute/region us-central1
```


### ゾーン設定

```bash
$ gcloud config set compute/zone us-central1-a
```

# 設定を確認

```bash
$ gcloud config list

# [compute]
# region = us-central1
# zone = us-central1-a
# [core]
# account = anata-no-address@gmail.com
# disable_usage_reporting = False
# project = project-id
```
linuxの基本(ユーザー/グループ)

Linuxでのユーザー、グループの確認方法のまとめ  

- ユーザー  
 - 一覧  
/etc/passwd  
ユーザー名の抽出  
cut -d: -f1 /etc/passwd
 - 情報変更  
usermod
 - パスワード変更  
passwd
 - 追加  
useradd
 - 削除  
userdel
- グループ
 - 一覧  
/etc/group  
グループ名の抽出  
cut -d: -f1 /etc/group
 - 情報変更  
groupmod
 - 追加  
groupadd
 - 削除  
groupdel

- パスワード変更(root)  

```
sudo su
passwd root 
```
Amazon Cognitoの設定をAWSコンソールから操作する際に気になっていること

## 前置き
以前から気にはなっていましたが、AWSコンソールからCognitoを操作する際、ロールを設定する画面でプルダウンにアカウントが持つ全てのロールが表示されていませんでした。問い合わせて回答をいただいたのでメモがてら共有しておこうと思います。

## TL;DR
- ユーザープールとIDプールの2箇所で発生
- コンソール上で選べるロールの数は最大100件(現時点での仕様)
- プルダウンの表示順はアルファベット昇順
- 回避策はCLIの利用や、画面でのロールの新規作成など

## 詳細
以下の2箇所のプルダウンにはアカウントが持つロールが100個までしか表示されていません。

**Cognito User Pool : Group作成時のロール設定**
<img width="644" alt="スクリーンショット 2020-02-26 0.33.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/382072/9e9d1736-3ff1-116c-a54f-c496be4e76bf.png">

**Cognito Federated Identity : 認証された・されていないユーザーへのロール設定**
<img width="748" alt="スクリーンショット 2020-02-26 0.32.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/382072/b8bfbf3d-f5ae-3a34-1087-6e744d227443.png">

## 回避策
1. AWS CLI
2. 新しくロールを作成する
3. アルファベットの昇順で表示されるように名前をつける(一応......)

### 1. AWS CLI
※リファレンスの例にはunauthのコマンドは見つからなかったけど、多分こんな感じでしょう。

```
aws cognito-identity set-identity-pool-roles \
--identity-pool-id "${YourIdentityPoolId}" \
--roles authenticated="${YourAuthenticatedRoleArn}" \
--roles unauthenticated="${YourUnauthenticatedRoleArn}" 
```

### 2. 新しくロールを作成する
画像をもう一度見てみると、どちらもプルダウンのすぐ右に **Create Role** と、新しいRoleを作成しそのままアタッチすることが可能です。
<img width="644" alt="スクリーンショット 2020-02-26 0.33.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/382072/5eacfdc1-86f5-221e-e025-d482aa9eac41.png">

### 3. アルファベットの昇順で表示されるように...
まぁ、、表示はされますよ...

挙げといてなんですが、１以外はおすすめしません。

## 最後に
不便っちゃ不便ですよね。
個人用のアカウントならまだしも、企業のアカウントとなるとロールの数は100をゆうに超えるでしょう。AWSの基本思想に則ると開発者用のアカウントではインフラ担当者がCLIの利用は制限していることが多く、CLIを使って設定するためにはSREやインフラ担当にお願いをする必要がありますからね。

機能改善としてフィードバックを挙げたのと、AWSの担当者的にも既知の状況であること(実際に使いづらい)は判明したので、これがきっかけとなって改善されるといいなぁ。


## 参照
[AWS CLI Reference - CognitoIdentity](https://docs.aws.amazon.com/cli/latest/reference/cognito-identity/index.html)
Unity の新しいInputSystemもAsObservableしたーい！

## 拡張メソッド作った

```csharp
    using UniRx;

    public static class UnityInputSystemExtensions

    {
        public static IObservable<InputAction.CallbackContext> AsObservable(this InputAction action)
        {
            return Observable.FromEvent<InputAction.CallbackContext>(
                h => action.performed += h,
                h => action.performed -= h);
        }
    }
```

## 使い方

```csharp
var MainInput = new MainInput(); // ここは各環境によって違うと思う
MainInput.UI.Click.AsObservable().Subscribe(context => Debug.Log("clicked")).AddTo(this);
```
備忘録 OctoberCMS

テーマは「Flat UI」

#データベーステーブル作成

create_<テーブル名（複数形）>_table.php　作成 
以下例

```php:plugin>..>..>updates>create_users_table.php
<?php namespace <プロジェクト名>\<プラグイン名>\Updates;

use Schema;
use October\Rain\Database\Schema\Blueprint;
use October\Rain\Database\Updates\Migration;

class CreateReportsTable extends Migration
{
    public function up()
    {
        Schema::create('<プロジェクト名>_<プラグイン名>_users', function (Blueprint $table) {
            $table->engine = 'InnoDB';
            $table->increments('id');
            $table->string('name');
            $table->string('email');
            $table->timestamps();
        });
    }

    public function down()
    {
        Schema::dropIfExists('<プロジェクト名>_<プラグイン名>_reports');
    }
}
```
バージョン情報の追記

```yaml:plugin>..>..>updates>version.yaml
1.0.1: First version of <プラグイン名>
1.0.2:
  - 'create table users'
  - create_users_table.php
```
#プラグイン作成（コマンドプロンプト）

```
$ cd ～\xampp\htdocs\プロジェクト名
$ php artisan create:plugin <プロジェクト名>.<プラグイン名>
$ php artisan create:model <プロジェクト名>.<プラグイン名> <モデル名>
$ php artisan create:controller <プロジェクト名>.<プラグイン名> <コントローラー名>
```

モデルは単数形、コントローラーは複数形にする

```php:plugin>..>..>Plugin.php

    public function registerNavigation()
    {
        return [
            '<プラグイン名>' => [
                'label'       => '<バックエンドメニュー名>',
                'url'         => Backend::url('<プロジェクト名>/<プラグイン名>/<コントローラー名>'),
                'icon'        => '<好きなアイコン>',
                'permissions' => ['<プロジェクト名>.<プラグイン名>.*'],
                'sideMenu' => [
                    '<names>' => [
                        'label'       => '名前',
                            'icon'        => '<好きなアイコン>',
                            'url'         => Backend::url('<プロジェクト名>/<プラグイン名>/names'),
                            'permissions' => ['<プロジェクト名>.<プラグイン名>.*'],
                    ],
                ],
            ],
        ];
    }

```
アイコンは、OctoberCMSが提供するものの中から選べる
#データベースのマイグレーション
```
$ php artisan october:up
```
#データベーステーブルの破棄/再作成
```
$ php artisan plugin:refresh <プロジェクト名>.<プラグイン名>
```

#コンポーネントの作成

##コマンド実行
```
$ php artisan create:component <プロジェクト名>.<プラグイン名> <コンポーネント名>
```

##コンポーネントを使えるよう値の指定
```php:Plugin.php
registerComponents()
{
    return [
        '<プロジェクト名>\<プラグイン名>\Components\<>' => '<コンポーネント名>'
   ];
}
```

##バックエンドの追加
CMSで使いたいページを開く
サイドメニューの「コンポーネント」選択
追加したいコンポーネントをドラッグアンドドロップ(またはクリック)

#ロゴ変更時

```less:themes>responsiv-flat>assets>less>layouts>all.less

header#layout-header {
  .navbar-brand {

    // 適宜値の追加

    padding-left: 70px;
    background-image: url('assets/フォルダ/フォルダ/image.png');
    background-size: 100%;
    background-repeat: no-repeat;
    background-position: 0 50%;

 }
}
```

ロゴに関するスタイル調整はここで行う。

#配色変更時

```less:themes>responsiv-flat>assets>flat-ui>less>variables.less

>themes > responsiv-flat > assets > flat-ui > less > variables.less
// Color swatches
@turquoise:                 #1abc9c;
@green-sea:                 #16a085;
...
```
VC++で標準ライブラリ（std::vectorなど）をリンクしようとするとLINKエラー

# TL;DR;

プロジェクトプロパティのランタイムライブラリの設定を確認

Debugビルドでは、MTdかMDd（DLL）にする。

![コメント 2020-02-26 083017.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280975/af634679-ec58-87b3-0d19-62fa0e9c6034.png)

普通にプロジェクトを作っていれば、デフォで正しく設定されていると思うのですが。適当に拾ってきたPJで狂っていたのでハマりました…（MSが公開してるサンプルだったんだけどなぁ）

# エラー内容

```bash
エラー	LNK2019	未解決の外部シンボル 
__imp__invalid_parameter が関数
"void * __cdecl std::_Allocate_manually_vector_aligned<struct std::_Default_allocate_traits>(unsigned __int64)"
(??$_Allocate_manually_vector_aligned@U_Default_allocate_traits@std@@@std@@YAPEAX_K@Z)
で参照されました。
```

エラーでは`_Allocate_manually_vector_aligned`が槍玉にあげられていますが、これに限った原因ではないと思うので、別のシンボルでエラーが出る可能性もあると思います。

# 余談

余談ですが、少し気になったので`_Allocate_manually_vector_aligned`について。
`xmemory.h`に実装されています。

```cpp
// FUNCTION _Allocate_manually_vector_aligned
template <class _Traits>
_DECLSPEC_ALLOCATOR void* _Allocate_manually_vector_aligned(const size_t _Bytes) {
    // allocate _Bytes manually aligned to at least _Big_allocation_alignment
    const size_t _Block_size = _Non_user_size + _Bytes;
    if (_Block_size <= _Bytes) {
        _Throw_bad_array_new_length(); // add overflow
    }

    const uintptr_t _Ptr_container = reinterpret_cast<uintptr_t>(_Traits::_Allocate(_Block_size));
    _STL_VERIFY(_Ptr_container != 0, "invalid argument"); // validate even in release since we're doing p[-1]
    void* const _Ptr = reinterpret_cast<void*>((_Ptr_container + _Non_user_size) & ~(_Big_allocation_alignment - 1));
    static_cast<uintptr_t*>(_Ptr)[-1] = _Ptr_container;

#ifdef _DEBUG
    static_cast<uintptr_t*>(_Ptr)[-2] = _Big_allocation_sentinel;
#endif // _DEBUG
    return _Ptr;
}
```

このxmemoryの関数もvectorも、ヘッダに直に実装されているので「ヘッダがIncludeできた時点でリンクできないなんてことはない」と思ったのですが…🤔🤔🤔
続・WebGLについて

この記事は先日投稿した[こちらの記事](https://qiita.com/alicial/items/71a800305e11fc9ed46d)の続きとなります。

## はじめに
今回はコードの理解を深めるために、前回表示した三角形ポリゴンに色をつけたいと思います。
最終形としては三角形の各頂点に別の色を設定します。

# 色の設定
まずは各頂点に赤、青、緑を設定します。
前回のソースで言うと**2**にあたる部分になります。

```script.js
// 空のカラーバッファを生成
var verticesColorBuffer = gl.createBuffer();
// 生成したバッファをバインドする
gl.bindBuffer(gl.ARRAY_BUFFER, verticesColorBuffer);
// 各色を定義
var colors = [
	1.0, 0.0, 0.0, 1.0,    // 赤
	0.0, 1.0, 0.0, 1.0,    // 緑
	0.0, 0.0, 1.0, 1.0     // 青
];
// バインドされたバッファに色をセットする
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(colors), gl.STATIC_DRAW);
```

### 頂点シェーダの変更
カラーバッファから値を取得できるように頂点シェーダ側も変更をします。

```index.html
attribute vec3 position;
attribute vec4 color;
varying lowp vec4 vColor;
void main ()
{
	gl_Position = vec4(position, 1.0);
	vColor = color;
}
```

### フラグメントシェーダの変更
頂点シェーダと同じように、フラグメントシェーダ側も変更をします。

```index.html
precision mediump float;
varying lowp vec4 vColor;
void main ()
{
	gl_FragColor = vColor;
}
```

# 描画時に色を反映させる
色情報を用いて描画を行います。
前回のソースで言うと**4**にあたります。

```script.js
// 色のバッファをバインド
gl.bindBuffer(gl.ARRAY_BUFFER, verticesColorBuffer);
// シェーダのアドレスを保持
var vertexColorAddress = gl.getAttribLocation(program, "color");
// 頂点属性の有効化
gl.enableVertexAttribArray(vertexColorAddress);
// 頂点属性に頂点データを設定
gl.vertexAttribPointer(vertexColorAddress, 4, gl.FLOAT, false, 0, 0);
```

# 描画
上記変更を加えた上で実行すると以下のようなものが描画が行われるはずです。
![snap.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275170/3922a50c-50fc-8d1e-ef0e-266957bf4cf7.png)


※目立たせるために背景色を黒にしました。

```script.js
// 背景描画
gl.clearColor(0.0, 0.0, 0.0, 1.0);
```

# おわりに
殆ど前回記事で使用したコードの応用で変更を行うことができました。(とはいえ全体の理解が浅いのでぱぱっとはできていませんが…)
次は回転とか3D化とかできたらいいなと思ってます。

## つづき
→[続々・WebGLについて](https://qiita.com/alicial/items/be950db2f506212b1d1d)
GitLab Runnerで任意のSSH接続を行いたい

GitLab Runner(jobの中)からデプロイ先にSSHに入ってごにょごにょしたいときに使います。

dockerイメージを使っていますが、今回のジョブではdockerである必要はないです。

### 秘密鍵を生成する

```
ssh-keygen -t rsa -b 4096 -f id_rsa_deploy
```

生成された id_rsa_deploy(秘密鍵) と id_rsa_deploy.pub(公開鍵) は後で使います。

### 秘密鍵をGitLabの環境情報として設定

グループかプロジェクトのSettings→CI/CD→Variableから設定。TypeはFileにしておき、Valueに秘密鍵の内容をまるっと張り付ける。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52527/e8ab1b33-c4f2-6529-ff46-0964d42357f7.png)


### GitLab Runnerからの接続先の authorized_keys に書き足す

公開鍵の内容をGitLab Runnerから接続する先（踏み台サーバなど）のauthorized_keysに書き足して、接続できるようにします。keyの大文字小文字は区別するので注意。

```
ssh-rsa AAAAB3Nza...OA9w== mydeploykey
```

鍵が漏れたら何されるかわからないので不安、という場合は、`command="..."`をつけておくと、その秘密鍵ではcommand以外の操作ができなくなるので気休めになります。以下のようにすると、echoしかできません、多分。

```
command="echo SSH Test OK $SSH_ORIGINAL_COMMAND" ssh-rsa AAAAB3Nza...OA9w== mydeploykey
```

`$SSH_ORIGINAL_COMMAND`環境変数を使うとsshコマンドの引数を受け取れますが、空白を含む1つの値を引数に与える際は注意する必要があります。そもそもここまでやるなら引数を使って処理するのは避けたほうがよいでしょう。

### .gitlab-ci.yml を書く

今回は踏み台経由でほかのサーバも操作したかったのでSSH-Agentを張っていますが、必須ではないです。

SSH Agentを使わない場合は `ssh -i "$ID_RSA_DEPLOY" -p22 USER@HOST echo hello world` とでもすればよいでしょう。

ポート(`-p22`)と`USER`と`HOST`は適宜置き換えてください。

``` .gitlab-ci.yml
image: docker:19.03.1

services:
  - docker:19.03.1-dind

variables:
  DOCKER_HOST: tcp://docker:2376
  DOCKER_TLS_CERTDIR: "/certs"

deploy_production:
  stage: deploy
  script:
    - apk update && apk add openssh
    - chmod 0400 "$ID_RSA_DEPLOY"
    - eval "$(ssh-agent)"
    - ssh-add "$ID_RSA_DEPLOY"
    - mkdir ~/.ssh/ && chmod 0700 ~/.ssh
    - ssh-keyscan -p22 -H HOST > ~/.ssh/known_hosts
    - ssh -A -p22 USER@HOST echo hello world
```

一応、known_hostsに追記していますが、この流れ作業ではもはや無視しても同じな気はします。

あとはymlファイルをpushすればciが動き始めるはず。


### 苦労ポイント

- docker imageはalpine系でsshもgitもないのでapkで導入する必要がある
- 環境設定で作られたファイルの権限が 0666 なので、そのままSSHでは使えなかった（なのでchmod 0400にしている）
- knwon_hostsに登録が必要だし、`~/.ssh/` がないので作る必要があった


`.gitlab-ci.yml`を1行足しては再実行を繰り返したことですかね・・・これだけでも10回ぐらい流した気がする。みんなこうやって書いてるんだろうか・・・
Django2.2でPyMySQLが使えずmysqlclientを使った話

# 過程
ゲームの大会を開けるようなWebアプリを作りたいな〜
→時代はPythonでしょ❗

ってことでDjangoを用いて環境構築をはじめました


# 環境
- Python:3.7
- Django:2.2

# 何が起きたか
https://qiita.com/aeas44/items/90c867aa2d02f9047ef0
を参考にPyMySQLをインストール。DB設定を行い


    python manage.py migrate

を叩いた。

すると

    raise ImproperlyConfigured('mysqlclient 1.3.13 or newer is required; you have %s.' % Database.__version__)
    django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.9.3.

なぜかMigrateできない。

#原因

### ①Django2.2ではPyMySQLが非対応
Django2.1のバージョンであれば問題なく動作するとのこと

### ②そもそも公式の推奨ドライバーはmysqlclient

しかし公式ドキュメントを覗いてみると

>mysqlclient is a native driver. It’s the recommended choice.
>https://docs.djangoproject.com/en/2.2/ref/databases/

mysqlclient使えよって書いてる

ということでせっかくなのでコチラで試してみることに

    pip install mysqlclient

でインストール。環境の設定は変えなくて大丈夫そう

    python manage.py migrate

無事migrateできました❗
フォロワーに表示されない謎の6人目が出たって話

1. [はじめに](https://qiita.com/drafts/38dfaf203e1af53344b3/edit#1%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB)
2. [謎が解明！](https://qiita.com/drafts/38dfaf203e1af53344b3/edit#2%E8%AC%8E%E3%81%8C%E8%A7%A3%E6%98%8E)
3. [なんで表示されなかったのか？](https://qiita.com/drafts/38dfaf203e1af53344b3/edit#3%E3%81%AA%E3%82%93%E3%81%A7%E8%A1%A8%E7%A4%BA%E3%81%95%E3%82%8C%E3%81%AA%E3%81%8B%E3%81%A3%E3%81%9F%E3%81%AE%E3%81%8B)
4. [フォローを外せないか？](https://qiita.com/drafts/38dfaf203e1af53344b3/edit#4%E3%83%95%E3%82%A9%E3%83%AD%E3%83%BC%E3%82%92%E5%A4%96%E3%81%9B%E3%81%AA%E3%81%84%E3%81%AE%E3%81%8B)
5. [おわり](https://qiita.com/drafts/38dfaf203e1af53344b3/edit#5%E3%81%8A%E3%82%8F%E3%82%8A)

## 1.はじめに
　私のTwitterはフォロー、フォロワーが共に5人のアカウントなんですけど、あるとき6人目のフォロワーがいたんです。知り合いなのかなと思ってフォロワーを確認したら5人までしか表示されていないときた。
　そんなわけで、一体この”6人目”は誰なのかってのが今回の話。

## 2.謎が解明！
　この”6人目”を調べるために、[whotwi](https://ja.whotwi.com/)というサイトを使用してフォロワーを確認したところ、見つけることが出来ました。

## 3.なんで表示されなかったのか？
　しかし、なぜ表示されなかったのかという謎が残るわけですが、Twitterではどうやらスパムアカウントまたはその疑いのあるアカウントなどを表示させないとのこと。
　また、「クオリティ－フィルター」をONにしていると、表示されるとのこと。
　とりあえず、クオリティーフィルターをOFFにしようと思ったのですが、チェックボックスは既に外れていました。これにチェックを付けて再度フォロワーを確認しても表示されない。こまった。

## 4.フォローを外せないのか？
　クオリティーフィルターの設定が反映されるまでに時間を置く必要があるのかもしれませんが待つのがめんどくさいので、相手のTwitter IDから相手を表示し、ブロ解を行いました。
　その結果、フォローが1人減りました←？
　わけがわからないですが、フォロワーの数字は6のままです。
　それから、しばらく置いておくと問題なくフォロー、フォロワーが5人の状態に戻ってオールオッケー

## 5.おわり
　初めてQiitaに書くことがこんなことでいいのかとも思うのですが、誰かの参考になればいいなと思ってこれを書こうと思いました。
[C++] 基本的なコンパイル方法 [C++初心者]

C++ 言語で書かれたソースコードをコンパイルする基本的な方法を書きます．
コンパイラはインストール済みでパスが正しく通っているものとします．

# 前提
- コンパイルしたいファイル: `test.cpp`
- 使用するコンパイラ: `g++`
- 出力したい実行ファイル名: `out`

## test.cpp

```cpp:test.cpp
#include <cstdio>
int main() {
  printf("hello\n");
}
```

## コンパイル方法

```bash
$ g++ -o out test.cpp
```
`-o out` は省略可能で，デフォルトでは `a.out` というファイルが出力されます．

## コンパイル結果

コンパイルに成功すると，`out` という名前の実行ファイルが生成されます．

```bash
$ ls
out		test.cpp
```

## 実行結果

```bash
$ ./out 
hello
```

# その他よく遭遇するケース
## 複数のファイルをコンパイルしたい

- `main` 関数が書かれたソース: `test2.cpp`
- 自作関数が書かれたソース: `mylib.cpp`
- `mylib.cpp` に対応するヘッダファイル: `mylib.h`

```cpp:mylib.cpp
#include "mylib.h"
#include <cstdio>
void printHello() {
  printf("hello\n");
  return;
}
```

```cpp:mylib.h
#ifndef __MYlIB_H_
#define __MYlIB_H_

void printHello();

#endif
```

```cpp:test2.cpp
#include "mylib.h"
int main() {
  printHello();
}
```

### コンパイル方法（分割）
`-c` オプションをつけることでコンパイルのみ (i.e., 実行ファイルを生成しない) を実行し，オブジェクトファイル `test2.o` および `mylib.o` 生成します．

```bash
$ g++ -c -o test2.o test2.cpp 
$ g++ -c -o mylib.o mylib.cpp
$ ls
mylib.cpp	mylib.h		mylib.o		test2.cpp	test2.o
```

あとはオブジェクトファイルをまとめて `g++` をかけます．

```bash
$ g++ test2.o mylib.o -o out
$ ls
mylib.cpp	mylib.h		mylib.o		out		test2.cpp
$ ./out 
hello
```

### コンパイル方法（一括）
上記のような「分解コンパイル」をせずに，次にように一括でコンパイルすることも可能です．

```bash
$ g++ test2.cpp mylib.cpp -o out2
$ ./out2
hello
```
一括コンパイルと比べると分割コンパイルの手順はやや面倒に見えますが，いくつかの利点があるそうです (参考[2])．

## いちいちコンパイルのコマンド覚えて打ち込むの面倒くさい

Makefile を使います．
`make` コマンドのインストール方法などは割愛します．

```makefile:Makefile
all: test

clean:
	rm -f *.o out2

test: test2.cpp mylib.cpp mylib.h
	g++ -c -o test2.o test2.cpp
	g++ -c -o mylib.o mylib.cpp
	g++ -o out2 test2.o mylib.o
```

これを置けば，`make`を打つだけでコンパイルできます．
Makefile の書き方などはここでは説明しません．

```
$ ls
Makefile	mylib.cpp	mylib.h		test2.cpp
$ make
g++ -c -o test2.o test2.cpp
g++ -c -o mylib.o mylib.cpp
g++ -o out2 test2.o mylib.o
$ ls
Makefile	mylib.cpp	mylib.h		mylib.o		out2		test2.cpp	test2.o
$ ./out2 
hello
```

# その他
## 個人的によく使うオプション

- `-Wall`: 警告(Warning)をすべて(all)表示します．
- `-std=c++11`: C++11 の機能を使いたいときに付けます．
- `-I <dir>`: include search path を追加するときに付けます．
- `-L <dir>`: library search path を追加するときに付けます．
- `-l <file>`: library file をリンクするときに付けます．

# 参考

[1] http://www.ysr.net.it-chiba.ac.jp/data/cc.html
[2] http://sa.eei.eng.osaka-u.ac.jp/eeisa003/tani_prog/HOWTOprogC/split.htm
[3] https://qiita.com/lrf141/items/9ba070a2a1c3e5faf71c
EAGLEのディレクトリを示す環境変数

#Abstract
Eagleのディレクトリをいじるとき，`$EAGLEDIR`と`$HOME`ってどこぉってなって調べた

#Conclusion
`$EAGLEDIR`はEagleのインスコ場所
`$HOME`はHelpに書いてあった．デフォルトは`My Document`．OSの環境変数として`EAGLE_HOME`(Win, Mac, Linux)または`HOME`(Mac, Linux)を設定すれば変えられるらしい

![Eagledir.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265603/b7c365e9-6d18-81a5-0a5b-c03dd214f089.png)
Gitの内部の動きを知ろう　～その４～

### [目次](https://qiita.com/as-chapa/items/246b03c671bd798d50a8)

# 今回の確認内容
ブランチを作ってチェックアウトします。

## git branch
以下のコマンドを実行し、最新のコミットからブランチを作ります。

```
$ git branch
* master
$ git branch bra20200226
$ git branch
  bra20200226
* master
```

チェックアウトはしていないので、まだMasterを参照しています。このときに.git配下がどのように変わったかを見てみます。

```
$ tree -a
├── .git
│   ├── logs
│   │   ├── HEAD
│   │   └── refs
│   │       └── heads
│   │           ├── bra20200226
│   └── refs
│       ├── heads
│       │   ├── bra20200226
```

logsとrefs配下にブランチが作られました。作られたファイルの中身を見てみると、以下のように最新のコミットから作られたことがわかります。

```
$ cat .git/logs/refs/heads/bra20200226
0000000000000000000000000000000000000000 2deb1b0751cbfeffdc75683b2f61e476ef970640 Chapa <hoge@hoge.com> 1582664128 +0900                                    branch: Created from master
$ cat .git/refs/heads/bra20200226
2deb1b0751cbfeffdc75683b2f61e476ef970640
$ git cat-file -p 2deb1b0751cbfeffdc75683b2f61e476ef970640
tree e6c5d9e73c33771f1878aa6edc1a5df1939e6351
parent 17e88b45fdb1b3e8831df0c209204f290d6ca614
author Chapa <hoge@hoge.com> 1581171878 +0900
committer Chapa <hoge@hoge.com> 1581171878 +0900

2nd commit. add and modify
```

## git checkout
では、チェックアウトして、.git配下がどのように変わったかを見てみます。

```
$ git checkout bra20200226
Switched to branch 'bra20200226'
$ git branch
* bra20200226
  master
```
```
├── .git
│   ├── HEAD
│   ├── index
│   ├── logs
│   │   ├── HEAD
```

それぞれの中身を見ると以下のようになっています。

```
$ cat .git/HEAD
ref: refs/heads/bra20200226
$ cat .git/refs/heads/bra20200226
2deb1b0751cbfeffdc75683b2f61e476ef970640
$ cat .git/logs/HEAD
0000000000000000000000000000000000000000 17e88b45fdb1b3e8831df0c209204f290d6ca614 Chapa <hoge@hoge.com> 1580696403 +0900                                    commit (initial): first commit
17e88b45fdb1b3e8831df0c209204f290d6ca614 2deb1b0751cbfeffdc75683b2f61e476ef970640 Chapa <hoge@hoge.com> 1581171878 +0900                                    commit: 2nd commit. add and modify
2deb1b0751cbfeffdc75683b2f61e476ef970640 2deb1b0751cbfeffdc75683b2f61e476ef970640 Chapa <hoge@hoge.com> 1582664726 +0900                                    checkout: moving from master to bra20200226
```

HEADの参照ブランチが変わりました。参照ディレクトリを見るとどのコミットを参照しているかがわかります。

# 今回のおさらい
ブランチを作るとオブジェクトとして何かが作られるわけではなく、参照ディレクトリ配下にファイルが作られていきました。チェックアウトすることでHEADの参照先が変わることも確認できました。

次回はブランチでコミットを進めたときにどのように変化していくかを追っていきたいと思います。
Proxy環境でElectronインストールしようとしたら隠れた罠があったんです

# 何が起こったか？
会社で[Electron](https://www.electronjs.org/)使おうと思って、`yarn install`したのにバイナリが降ってこなかった。
[Quick Start](https://github.com/electron/electron-quick-start)も、Electronのインストールだけできなくて、なんぞこれってなった。
ちなみに家だと、どちらもすんなり動いた。

# Proxyじゃん...
家ならセーフ会社でアウトって、完全にProxyのせいじゃん

```bash
$ npm -g config set proxy http://proxy:port
$ npm -g config set https-proxy http://proxy:port
```

`Proxy`設定は、これまでに行っていたが念の為もう一度設定してみる。

ダメです。
Electronだけインストールできない。
ただ`node_modules`見に行くと、

```bash
.
├── LICENSE
├── README.md
├── cli.js
├── dist　★これがない
├── electron.d.ts
├── index.js
├── install.js
├── node_modules
├── package.json
└── path.txt
```

こんな感じ
`dist`ディレクトリだけない

# [公式ドキュメント](https://www.electronjs.org/docs/tutorial/installation#proxies)
ちゃんと読んだことなかったけど、`Proxy`について書いてくれていた。

>If you need to use an HTTP proxy, you need to set the ELECTRON_GET_USE_PROXY variable to any value, plus additional environment variables depending on your host system's Node version:
>
>Node 10 and above
>Before Node 10

この`ELECTRON_GET_USE_PROXY`が、やっかい というか使っている例をそんなに見つけられなかった。

しかも`you need to set the ELECTRON_GET_USE_PROXY variable to any value`
これ以外に使い方みたいなのが書いてない

# 使用例ありました
https://github.com/castlabs/electron-releases/issues/45#issuecomment-549385236

>export ELECTRON_GET_USE_PROXY=true // to activate proxy for electron/get module
>export GLOBAL_AGENT_HTTPS_PROXY=my_proxy to configure global agent proxy

なるほど
実際使うのはWindows環境だったので

```powershell:windows
SET ELECTRON_GET_USE_PROXY=true 
SET GLOBAL_AGENT_HTTPS_PROXY=http://proxy:port
```

```shell:Linux
export ELECTRON_GET_USE_PROXY=true
export GLOBAL_AGENT_HTTPS_PROXY=http://proxy:port
```

としてからインストールするとすんなり入った。

# 感想
ググると`npm config set proxy`で解決するケースが大半なんで過信してたけど、`ELECTRON_GET_USE_PROXY`は罠過ぎた。

# 参考サイト
* [Installation | Electron Documentation](https://www.electronjs.org/docs/tutorial/installation)
* [Electron 7.0.0 - wrong mirrorOptions url in install.js
](https://github.com/castlabs/electron-releases/issues/45)
初心者によるプログラミング学習ログ 249日目

#100日チャレンジの249日目
twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。
100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。
249日目は、

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>249日目<br>・webサイト模写<br><br>帰りおそかったので、あまり捗りませんでした<a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a><a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E7%B9%8B%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアと繋がりたい</a><a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</a></p>&mdash; ぱぺまぺ@webエンジニアを目指したい社畜 (@yudapinokio) <a href="https://twitter.com/yudapinokio/status/1232398453671522304?ref_src=twsrc%5Etfw">February 25, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
Cognito＋Amplifyで二要素認証する（ログイン画面で ID/PW/"二要素用のコード値" を入力して認証する）

## 概要

* Cognito＋Amplifyで二要素認証する。
* ログイン画面に `ID/PW/コード値（二要素目扱い）` の3項目を入力することを前提とする  
  ※なので、二段階認証では無い・・・
* codeにはGoogle Authenticator等で生成されるコード値が入る前提とする

## 実装

### Amplify側

下記でサインインする。
※二要素目のパラメータとして `validationData` を送信する。

```javascript
Auth.signIn({"username": user_id, "password": user_password, "validationData": { "code": "WinAuth_code" }})
// ※Cognitoの認証前トリガーでcodeがとれる
```

#### `Amplify.signIn()` のIF参照
※`Amplify.signIn()` の第1パラメータを `SignInOpts` 形式で指定している

* https://aws-amplify.github.io/amplify-js/api/classes/authclass.html#signin
* https://aws-amplify.github.io/amplify-js/api/globals.html#usernamepasswordopts

### Cognito側

認証前トリガーを使って、`validationData` の `code` を取得し、コードの検証をする形になる。

#### 認証前トリガーのLambda

```python
import boto3

def lambda_handler(event, context):

    # Usernameに紐づくグループを取得するサンプルコード
    client = boto3.client('cognito-idp')
    response = client.admin_list_groups_for_user(UserPoolId=event['userPoolId'], Username=event['userName'] ) 

    print("---- ---- ---- ---- ---- ---- ---- ")
    print(event)
    print(response)
    print("---- ---- ---- ---- ---- ---- ---- ")

    # コード検証を実行 ※ソースは省略
    # エラーの条件によってメッセージを変える
    # ※
    # エラー時にメッセージを変更することしかできない（HTTPのステータスを変えるとかは出来ない）ので、
    # コードが誤っている場合は専用のメッセージをAmplify側に返すことになる
    raise Exception("Cannot authenticate users from this user pool app client")  

    return event
```

#### 認証前トリガーLambdaのログ（Lambdaハンドラ引数の `event` の中身）

下記に注目

* `event['username']`に入力したユーザネームが来ている
* `event['request']['validationData']` が来ている


```python
{'callerContext': {'awsSdkVersion': 'aws-sdk-unknown-unknown',
                   'clientId': 'xxxxxxxxxxxxxxxxxxxxxxxxxx'},
 'region': 'ap-northeast-1',
 'request': {'userAttributes': {'cognito:token_nbf': '1582593027733',
                                'cognito:user_status': 'CONFIRMED',
                                'sub': '67eb1ed1-240b-4861-9844-f82ebc08d2f8'},
             'userNotFound': False,
             'validationData': {'aaaa': '12345'}},
 'response': {},
 'triggerSource': 'PreAuthentication_Authentication',
 'userName': 'hogehoge',
 'userPoolId': 'ap-northeast-1_xxxxxxxxx',
 'version': '1'}
```
選択した場所をコメントアウトする方法#Unityゲーム制作01

どうも、わたたかです。
普段はTwitterで活動しているただのゲーマーです。

で、ゲーム制作をボチボチしているのでこれから
自分のゲーム制作のアウトプットをしていこうと思います。
まとめはnoteに書こうと思ってるので少し雑になっても完結なアウトプットになればと思ってます。

ますます言っててすみません。気をつけ**ます**。

本題に入ります

## 選択した場所をコメントアウトする方法
※Visual studio2017を使用しています。

### コメントアウトしたい部分を選択

```c#
int a;
```

マウスでもキーボードでも何でもいいです。

### crtl+k → crtl+C と押す

```c#
//int a;
```

こうなります。

これを解除するには
crtl+k → crtl+u と押してください。

```c#
int a;
```

//が外れます。

そこそこ便利なので使ってみましょう。

以上です。
【Laravel】Homestead上のサイトにスマホからアクセスする

# 環境
- Vagrant 2.2.7
- Laravel Homestead 9.2.0

# 事前準備
開発用マシン（Laravel Homesteadを実行しているマシン）とスマホを同じWi-Fi（LAN）に接続してから設定作業に進んでください。

# 設定
## プロビジョニングスクリプト修正
スマホからアクセスできるように、仮想マシンにパブリックな(他のホストから見える)IPを振ってあげます。
`config.vm.network :public_network, ip: '192.168.0.100'`を追記します。
IPアドレスは空いてるものなら何でもいいですが、LAN内のサブネットを指定しないと繋がらないため、注意してください。（私の環境では、192.168.1.100だと接続できませんでした。）

```ruby:~/Homestead/scripts/homestead.rb（更新前）

# 略

# Configure A Private Network IP
if settings['ip'] != 'autonetwork'
  config.vm.network :private_network, ip: settings['ip'] ||= '192.168.10.10'
else
  config.vm.network :private_network, ip: '0.0.0.0', auto_network: true
end

# Configure Additional Networks

# 略
```

↓

```ruby:~/Homestead/scripts/homestead.rb（更新後）

# 略

# Configure A Private Network IP
if settings['ip'] != 'autonetwork'
  config.vm.network :private_network, ip: settings['ip'] ||= '192.168.10.10'
else
  config.vm.network :private_network, ip: '0.0.0.0', auto_network: true
end

config.vm.network :public_network, ip: '192.168.0.100' # ←追記

# Configure Additional Networks

# 略
```

## 仮想マシンの再プロビジョニング
以下のコマンドを叩いて、仮想マシンを作り直します。
インタフェースにWi-Fiを指定して、プロビジョニングの完了を待ちます。

```shell

$ vagrant reload --provision
==> homestead: Attempting graceful shutdown of VM...
==> homestead: Checking if box 'laravel/homestead' version '9.2.0' is up to date...
==> homestead: Clearing any previously set forwarded ports...
==> homestead: Clearing any previously set network interfaces...
==> homestead: Available bridged network interfaces:
1) en0: Wi-Fi (AirPort)
2) p2p0
3) awdl0
4) en1: Thunderbolt 1
5) en2: Thunderbolt 2
6) bridge0
==> homestead: When choosing an interface, it is usually the one that is
==> homestead: being used to connect to the internet.
==> homestead:
    homestead: Which interface should the network bridge to? 1
```

## アクセスしてみる
スマホで http://192.168.0.100/ にアクセスするとサイトが見えるようになっているはずです。
やったね！

# 参考
macos - vagrant homestead - public network not working on osx - Stack Overflow
https://stackoverflow.com/questions/26353186/vagrant-homestead-public-network-not-working-on-osx
Cloudfrontが400エラーを返す問題とその解決策

# 問題

S3においたファイルを参照しているCloudfrontが、ある時からアクセスすると400エラーしか返さなくなってしまった。

# 原因

cookieが長すぎた。
アプリケーションの実装側のバグで、ある特定の条件下で外部のユーザー管理サービスに繰り返しリダイレクトし、そのたびにcookieがつけられていたため、非常に長くなっていた。

# 解決策

cookieを消す。
ただあくまで本質的な問題は、cookieの長さが問題になるほど繰り返しリダイレクトしていたことなので、その部分を治す必要あり。


`cloudfront s3 returns 400 error` とかググってもなかなか出てこず、なんとなくcookieを見た時にやっと気づいたので、だれかの参考になれば幸いです。
【vue】dispatchに第三引数を渡したい


## 結論

vueのdispatchで第三引数を渡したい時は、第二引数に `オブジェクト`を用いる。

## 例

ショッピングカートに、商品情報とユーザー情報の２つをdispatchの引数として入れる。

### 失敗例

以下のように第一引数に `path`, 第二引数に `item`, 第三引数に `userId`を入れたところうまくいかなかった。

```
this.$store.dispatch('shop/addCart', this.item, this.userId)
```

### 成功例

第二引数をオブジェクトにすることで、複数の値を格納することができた。

```
this.$store.dispatch('shop/addCart', {
  item: this.item, 
  userId: this.userId
})
```
Railsの静的コード解析をGitHub Actionsでやる

# これはなにか
GitHub に push すると GitHub Actions がブンブン回って、静的コード解析をしてくれるやつ。ついでにキャッシュされるので、毎回 bundle install がまわることがないやつ。はやい、やすい、うまい ... かどうかはわからないが、要はオレによし、オマエによし。

# ワークフロー
```yaml
name: Static Check 

on: [push]

jobs:
  RuboCop:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/setup-ruby@v1
      with:
        ruby-version: '2.7'
    - uses: actions/checkout@v2
    - uses: actions/cache@preview
      with:
        path: ./web/vendor/bundle
        key: ${{ runner.os }}-gem-${{ hashFiles('**/Gemfile.lock') }}
        restore-keys: |
          ${{ runner.os }}-gem-
    - name: Run RuboCop
      run: |
        cd ./web/
        bundle install --jobs 4 --retry 3 --path vendor/bundle
        bundle exec rubocop -a
  BrakeMan:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/setup-ruby@v1
      with:
        ruby-version: '2.7'
    - uses: actions/checkout@v2
    - uses: actions/cache@preview
      with:
        path: ./web/vendor/bundle
        key: ${{ runner.os }}-gem-${{ hashFiles('**/Gemfile.lock') }}
        restore-keys: |
          ${{ runner.os }}-gem-
    - name: Run BrakeMan
      run: |
        cd ./web/
        bundle install --jobs 4 --retry 3 --path vendor/bundle
        bundle exec rubocop -a
  RubyCritic:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/setup-ruby@v1
      with:
        ruby-version: '2.7'
    - uses: actions/checkout@v2
    - uses: actions/cache@preview
      with:
        path: ./web/vendor/bundle
        key: ${{ runner.os }}-gem-${{ hashFiles('**/Gemfile.lock') }}
        restore-keys: |
          ${{ runner.os }}-gem-
    - name: Run BrakeMan
      run: |
        cd ./web/
        bundle install --jobs 4 --retry 3 --path vendor/bundle
        bundle exec rubycritic
```

# おわりに
ほんとは Docker 化しているのだから、Docker 上で動かせば良いのだろうけど Docker イメージの置き場所とか考えると、めんどくさくなったのでこうした。次は GitHub Actions で Docker image をロードして CI するやつでもつくろうかな。
JavaScriptでネストしたオブジェクトの存在チェック

ネストしたオブジェクトにアクセスするときに、存在チェックが出来る関数を作りました。

# deepメソッド

```javascript
const deep = (obj, path) => {
  path = path.split(/\.|\[|\]/).filter(v => v)
  for (const k in path) {
    if (!obj) return false
    else if (obj[path[k]]) obj = obj[path[k]]
    else return false
  }
  return true
}
```

## 使い方

testオブジェクトに、test2プロパティが存在している
その中にtest3プロパティが存在していて、かつ中の値も存在しているか確認

```javascript
const test = {
  test2: {
    test3: true
  }
}

console.log(deep(test, 'test2.test3'))
```

## 出力結果

```console
true
```

存在している場合は`true`、存在していない場合は`false`が返ってくる
macOS版のFileZillaからアドウェアが取り除かれたかもしれない

以前「FileZillaは普通の手順通りインストールするとアドウェアが入るので注意」という内容の記事を書きました。

FileZilla だけをインストールする - Qiita
https://qiita.com/studio15/items/6cbdffa63c371feab08c

それからしばらく経ち本日、以下のような現象が発生しました。

macOSの「"FileZilla.app"を開くとコンピューターが破損します。ゴミ箱に入れる必要があります。」を解消する - Qiita
https://qiita.com/studio15/items/babe54a22094632d1647

## 事実１

１つ目の記事でも触れたとおり、FileZillaは収益確保のためにアドウェアを導入しています。
もちろんユーザーとしてはあまり嬉しくなく、公式フォーラムでも2019年の11月頃からも[セキュリティソフトに引っかかりまくるという旨のトピック](https://forum.filezilla-project.org/viewtopic.php?f=1&t=51687)が盛り上がりを見せていました。

## 事実２

２つ目の記事では「古いバージョンは警告されるが、新しいバージョンは警告されない」という内容でした。
記事には書きませんでしたが、正確には警告のある古いバージョンは3.46.3、警告のない新しいバージョンは3.47.0です。
私が利用しているのはProバージョンなのでもともとアドウェアが含まれていないはずなのですが、実行アプリケーション名とバージョン名は同一なのでそのへんでチェックしているのでしょうか。

## 推測

もしかしてAppleから怒られが発生してアドウェアを外さざるをえなくなったのでは？

## 事実３

ダウンロードページのInternet Archiveを見ると１月時点では[ダウンロードの緑のボタンはFileZilla_3.46.3_macosx-x86_sponsored-setup.dmgというアドウェア入りのものになっている](http://web.archive.org/web/20200121105448/https://filezilla-project.org/download.php?platform=osx)が、２月現在は[FileZilla_3.47.0_macosx-x86.app.tar.bz2というアドウェアを含まないものになっている](https://filezilla-project.org/download.php?platform=osx)。
ちょうど3.46から3.47に切り替わるタイミングですね。

## 結論

以上を踏まえたところ、Appleに怒られたかどうかは不明ですが、macOS版に限ってはアドウェアの入ったFileZillaは配布されなくなったようです。（Windows版は今もアドウェア入りをメインで配布中）
今のところ公式からこのような変更についての告知がなく、今までのサポートの傾向を見ると今後も告知はなさそうなので、推測を含めた形でこの記事を公開します。
(メモ) mobx-state-treeでやりがちな循環依存

（注意：糞記事です）

mobs-state-treeは便利なのですが、よく循環依存を作りがちです。

## こういうのでコンパイルが死んでいませんか？

```ts
import { types, getParentOfType } from "mobx-state-tree";

const Parent = types.model("Parent", {
    child: types.late(() => Child)
}).actions(self => {
    return {}
})

const Child = types.model("Child", {}).views(self => {
    return {
        get parent() {
            // 下記の評価結果は any になり、そしてエラーに!
            return getParentOfType(self, Parent)
        }
    }
})
```

## でも下記はOKだったりします

```ts
const Parent = types.model("Parent", {}).views(self => {
    return {
        get child() {
            return Child.create({})
        }
    }
})

const Child = types.model("Child", {}).views(self => {
    return {
        get parent() {
            return getParentOfType(self, Parent)
        }
    }
})
```


## これもOK

```ts
import { types, getParentOfType } from "mobx-state-tree";

const Parent = types.model("Parent", {
    child: types.late(() => Child)
})

const Child = types.model("Child", {})
.actions(self => {
    const parent =  () => getParentOfType(self, Parent)
    return {
        doSomething() {
            parent().child
        }
    }
})
```