OmniAICreator/Qiita-1.07M huggingface dataset:
今年の言語はRust その１６


# 今年の言語はRust その１６

Rustを学びます


Rustの日本語ドキュメント 2nd Edition
https://doc.rust-jp.rs/book/second-edition/

オリジナル(英語)
https://doc.rust-lang.org/book/



#### 実行環境

```sh
$ cargo -V
cargo 1.33.0 (f099fe94b 2019-02-12)
$ rustup -V
rustup 1.17.0 (069c88ed6 2019-03-05)
$ rustc --version
rustc 1.33.0 (2aa4c46cf 2019-02-28)

$  cat /proc/version
Linux version 4.14.97-74.72.amzn1.x86_64 (mockbuild@gobi-build-64002) (gcc version 7.2.1 20170915 (Red Hat 7.2.1-2) (GCC)) #1 SMP Tue Feb 5 20:59:30 UTC 2019

$ uname -a
Linux ip-10-100-0-8 4.14.97-74.72.amzn1.x86_64 #1 SMP Tue Feb 5 20:59:30 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

$ cat /etc/\*release
NAME="Amazon Linux AMI"
VERSION="2018.03"
ID="amzn"
ID_LIKE="rhel fedora"
VERSION_ID="2018.03"
PRETTY_NAME="Amazon Linux AMI 2018.03"
ANSI_COLOR="0;33"
CPE_NAME="cpe:/o:amazon:linux:2018.03:ga"
HOME_URL="http://aws.amazon.com/amazon-linux-ami/"
Amazon Linux AMI release 2018.03

```


## コレクション型


### 8.2 文字列型

```rust

fn main() {


    // 文字列リテラルを追加
    let mut s = String::from("foo");
    s.push_str("bar");
    // s.push_str(String::from("bar")); Error

    let mut s = String::from("lo");
    s.push('l'); // <- char型を追加する
    // s.push(String::from('l')); Error
}

```
むつかしい



```rust

fn main() {

    let s1 = String::from("Hello, ");
    let s2 = String::from("world!");
    let s3 = s1 + &s2; // s1はムーブされ、もう使用できないことに注意
    
    // println!("{}", s1); エラー: 所有権がない
    println!("{}", s2);
    println!("{}", s3);
}

```

+演算子はaddメソッドであるらしい.

いろいろあって、s1は所有権を奪われる

```rust

fn add(self, s: &str) -> String {

```


```rust

fn main() {

    let s1 = String::from("tic");
    let s2 = String::from("tac");
    let s3 = String::from("toe");
    
    let s = s1 + "-" + &s2 + "-" + &s3;
    
    println!("{}", s);
    // println!("{}", s1); Erro: 所有権がない
    println!("{}", s2);
    println!("{}", s3);
}

```

formatマクロを使えば、引数の所有権を奪わない.

```rust


fn main() {

    let s1 = String::from("tic");
    let s2 = String::from("tac");
    let s3 = String::from("toe");
    
    let s = format!("{}-{}-{}", s1, s2, s3);
    
    println!("{}", s);
    println!("{}", s1);
    println!("{}", s2);
    println!("{}", s3);
}


```

### 添え字アクセスはできない


```rust
fn main() {

    let s1 = String::from("tic");
    
    let h = s1[0];
    
    println!("{}", s1);
}

===
error[E0277]: the type `std::string::String` cannot be indexed by `{integer}`
 --> src/main.rs:6:13
  |
6 |     let h = s1[0];
  |             ^^^^^ `std::string::String` cannot be indexed by `{integer}`
  |
  = help: the trait `std::ops::Index<{integer}>` is not implemented for `std::string::String`
```

???

### 内部表現

```rust

fn main() {

    // type String
    let s1: String = String::from("hello");

    // type Slice
    let hello: &str = "hello";
    
    // type Slice
    let s: &str = &hello[0..4];
    
    println!("{}", s);
    
    // type char
    for c in s.chars(){
        println!("{}", c);
    }
    
    for b in s.bytes(){
        println!("{}", b);
    }
    
    
    
}
```

んー

完全に理解していない


後回し!




次回！


イエス！
【Kaggle日記】 何故自分はいつまでもKaggleで雑魚なのか。

# 自分のバックグラウンド

文系大学3年生が  
2019年度内までにKaggle Masterになる  
過程において、  
その日学んだことをアウトプットしていきます。  
間違いやご指摘などが御座いましたらご教示願います！  

# Santanderコンペを終えて

先日Kaggleにて、[Santander Customer Transaction Prediction](https://www.kaggle.com/c/santander-customer-transaction-prediction)が終了しました。  

結果として、    
2545/9038  
で終わりました。  

そもそも、一番スコアの高いKernelを最後まで超えることはできませんでしたから、当然の結果です。  

9,000人以上も参加者がいるにも関わらず、この成績は幾ら何でも
雑魚すぎます。  

それでは本題に入ります。  

# 何故自分はいつまでもKaggleで雑魚なのか。

大学生で人生において一番時間がある時期にも関わらず  
全く好成績を収められていないのは  
完全に**努力不足**  
でしかないのですが、  
これをもっと深掘りして自分なりに分析してみたいと思います。  

1. わからないことをわからないままにしている  
2. サーバーと思考の時間投入量不足  
3. 先人の功績を見て学んでいない  

以上の3つが主な原因だと感じました。  

順番に説明していきます。  

## 1. わからないことをわからないままにしている

これは特に自分に対して言えることなのですが、  

わからないことをわからないままにしている  

ということが非常に大きな問題でした。  

本来のKernelの目的は、KernelのEDAやモデルを見ることで機械学習とコンペに対しての理解を深めることであるはずのに、  

自分の場合は、Kernelをコピペしてとりあえず動かして、ある程度高いスコアを取ることで満足することで終わっていました。  

要は、ただの自己満足で、本質的に何の成長も遂げていませんでした。  

これが1つ目の問題です。  

## 2. 思考とサーバーの時間投入量不足  

上位陣の方々が平均して3桁くらいの量のサブミットをしているのに対して、自分は15しかしていませんでした。  

また、そもそも自分の思考を用いてコードを用いてサブミットしたのは10つくらいでいずれも一番スコアの高いKernelを超えられていません。  

またサーバーを動かしていた時間やKernelを動かしていた時間も同様のことが言えて、おそらく平均して1日のうちのたった2時間ほどであり、  

思考とサーバーの時間投入量不足であることは明白でした。  

そもそもこういった時間投入量で初心者が負けていたら技術と経験と思考力で勝る玄人に勝てる訳がありません。  

これが2つ目の問題です。  

# 3. 先人の功績を見て学んでいない  

ここでいう功績とは、  

実際の入賞者のgithubであったり、コードであったり、discussionであったり、記事であったりです。  

(*自分が参考になると感じたトークなどは明日全てまとめて記事にして書きます。)  

今回のコンペでは、インターネットで多くのこうした貴重な資料があるにも関わらず、それらに全く目を向けずに、盲目的に進んでいる部分が少なからずありました。  

現在自分は全く実績もなくただの雑魚なのですが、
今回のコンペを通じて感じたことは  

やはり上位に入賞するには、
すでに上位に入賞した方々の
ノウハウをそのまま真似ること  

が初心者の僕にとっては一番手っ取り早いかもしれませんということです。  

過去のコンペを含めて一度網羅的に先人たちのノウハウを取得することは、今の自分に一番必要であることであると感じています。  

先人の功績を見て学ばずに、完全に我流で（中途半端な熱量で）進めてしまったこと、  
これが3つ目の問題です。  

## 最後に

1. わからないことをわからないままにしている  
2. サーバーと思考の時間投入量不足  
3. 先人の功績を見て学んでいない  

以上の3点が  
自分がKaggleでいつまで経っても雑魚である  
主な原因であると感じました。

これらの反省を踏まえて、  

1. 毎日【Kaggle日記】としてoutputしていく
2. 明日、自分が参考になると感じた先人たちの資料をまとめる
3. 自分が雑魚であるということを徹底的に理解する

の3つで実際の行動に落とし込みます。

最後に、
間違いやご指摘などが御座いましたらご教示願います！
クラスメソッド、インスタンスメソッドの使い方

#はじめに
コントローラーに書いたアクションの処理をモデルにメソッド化する際、メソッドについての理解が浅かったため呼び出し方、書き方に悩まされた。そのため、今回は実例を元に使い方について、記事にまとめてみた。
※これまで個人的にはモデルやクラス、インスタンスなど似たようなイメージを持っていたが、RailsのモデルはRubyのクラス。インスタンスはテーブルのレコードと考えれば理解しやすくなった。
#実例（クラスメソッド）
##修正前の状態
```ruby:図１：topics_controller.rb
  def search_result
    @topics = Topic.where('title LIKE ?', "%#{params[:title]}%")
  end
```
図１はTopicモデルのテーブルから、あいまい検索した結果をインスタンス変数である、`@topics`に格納している。これをメソッド化し、モデルに定義する。
##修正後のコード
```ruby:図2：topics_controller.rb
  def search_result
    @topics = Topic.search(params[:title])
  end
```
```ruby:図3：topic.rb
  def self.search(title)
    where('title LIKE ?', "%#{title}%")
  end
```
検索するためのメソッドなので、メソッド名はモデルに`search`としてメソッド化、その際の注意点として大きく２点ある。

###1,使用するメソッドがクラスメソッドであるということ。
`search`メソッドはクラスに使用するため、クラスメソッドでないといけない。そのため図３のようにメソッド名の前に`self`を付ける。この`self`はクラス自身を表している。ちなみに`self`が抜けているとインスタンスメソッドとなり、クラスから生成されたインスタンスにしか使用できない。
###2,受け取った`params`を引数としてメソッドに渡さないといけないこと。
ビューからフォームで受け取った`params`をメソッドの引数として渡してあげないと、中身の処理が機能しないため、受け取った値は引数で渡してあげること。

#実例（インスタンスメソッド）
##修正前の状態
```ruby:図4：topics_controller.rb
def destroy

 # 省略

  if @current_user.admin_status == true
    redirect_to(admin_path)
  else
    redirect_to("/")
  end
end
```
図4はトピックの削除機能で`@current_user`ログインしているユーザーが管理者であるかないかで条件分岐をしている。この`admin_status == true`をメソッド化し、モデルに定義する。
##修正後のコード
```ruby:図5：topics_controller.rb
def destroy

 # 省略

  if @current_user.admin?
    redirect_to(admin_path)
  else
    redirect_to("/")
  end
end
```
```ruby:図6：user.rb
  def admin?
    admin_status == true
  end
```
管理者であるかを確認するためのメソッドなので、メソッド名はモデルに`admin?`としてメソッド化。また、その際の注意点として大きく２点ある。

###1,使用するメソッドがインスタンスメソッドであるということ。
`admin?`メソッドはインスタンスに使用するため、インスタンスメソッドでないといけない。そのため図６のようにそのままメソッドを書くことでインスタンスメソッドになる。

###2,trueやfalseを返す時のメソッドは末尾に`?`を付けること。
Rubyでは慣用的に、真偽値を返すタイプのメソッドを示すために使われる。そのため、末尾に`?`を付けることで直感的にもわかりやすくなる。

#学び
今回、痛感したのは何気なく使っているメソッド周りのことを全然理解できていなかったということ。何をしてもエラーの連続で訳がわからない状態になったりもしたが、サポートしていただいておかげで、定義しているメソッドがクラスメソッドなのか、インスタンスメソッドなのか？またそのメソッドをどう呼ぶのか？をより意識するようになれた。これからも努力を惜しまず理解を深めていきたい。
なぜ #python は match オブジェクトへの辞書アクセスなんかを開放したりしたのだい？ ( `TypeError: '_sre.SRE_Match' object is not subscriptable` )


# 3.4.8

```py
Python 3.4.8 (default, Apr  9 2018, 11:43:18)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-18)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import re
>>> re.search(r'b', 'abc').group(0)
'b'
>>> re.search(r'b', 'abc')[0]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: '_sre.SRE_Match' object is not subscriptable
```

# 3.7.2

```py
Python 3.7.2 (default, Jan 13 2019, 12:50:01)
[Clang 10.0.0 (clang-1000.11.45.5)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import re
>>> re.search(r'b', 'abc').group(0)
'b'
>>> re.search(r'b', 'abc')[0]
'b'
```


# ref

[re — Regular expression operations — Python 3.7.3 documentation](https://docs.python.org/3/library/re.html)

group に簡単にアクセスできるよ！ ってことらしい。ありがとう python

![image](https://user-images.githubusercontent.com/13635059/56090302-94def800-5edb-11e9-8602-8419364f73e1.png)

# ちなみに ruby の例

```rb
[5] pry(main)> 'abc'.match(/b/)[0]
=> "b"
```

うんたしかに 辞書のほうが分かりやすくはあるかもね

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/1273








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Jmeterとは

#jmeterとは？
jmeterとは、負荷をかけて検証するツールです。
指定した量のリクエストを投げて、
そのレスポンス値によりパフォーマンスを検証します。

#テスト計画を作成しよう！
###スレッドグループの作成
スレッドグループではどのくらい負荷をかけるのかを設定します。

- スレッド数
: アクセスするユーザー数
- Ramp-Up期間(秒)
: 設定したスレッド数を何秒以内に起動・実行するか
- ループ回数
: シナリオをループする回数

#HTTPリクエスト設定
サーバ名またはIP、ポート番号、プロトコル、パスなど
リクエストする環境の設定をします。

#リクエストの設定
###httpプロキシサーバ
簡単なのはhttpプロキシサーバで作成する方法です。
IFに合わせて1からリクエストを書いていくと、量がおおいととても大変です。
httpプロキシサーバを使用すると動かした内容を記録してくれるため
簡単にリクエストを作成することができます。

参考：https://qiita.com/kter/items/24e74c7b6900a3ab2226

###変数の設定
今回私が作成したテスト計画では、
API1→API2→API3の流れでAPIを実行するシナリオだったのですが、
API内で同一のIDやコードを使用する、
さらに違う組み合わせでもテストするため変数を使いたいと思いました。
Jmeterではユーザー定義変数を使用することで解決できました。

参考：https://ledsun.hatenablog.com/entry/2013/04/30/161459

###後処理　正規表現抽出
API1→API2→API3の流れでAPIを実行するシナリオだったのですが、
API1のレスポンス値をAPI2のリクエスト値として使用しました。
その場合はAPI1の後処理に正規表現抽出を設定して、
API2で使用することができました。

参考：http://naoberry.com/jmeter/regex/


#テスト結果
テスト計画が作成出来たら、いよいよ実行し負荷をかけます。
その際に、実行結果がどうなっているか確認したいと思います。

###結果をツリーで表示
結果ツリーで表示を設定すると、投げたリクエストとレスポンスの値を
確認することができます。

参考：http://sy5.sakura.ne.jp/jmeter/ref/listener/viewresultstree.html

###アサーション
Jmeterのデフォルトでは、サーバーエラーなどは検知できますが、
そのレスポンス内容が正常かを判断してくれません。
レスポンスが正常以外の場合に異常を検知したい場合、
アサーションでレスポンスコードが正常の時以外異常となるよう
設定が必要です。

参考：https://www.techscore.com/tech/Java/ApacheJakarta/JMeter/5/

#おわり
Jmeterってなんだ？？から始まったので、作成に時間が
かかってしまいましたがとても便利なツールだと実感しました。
負荷テスト以外でも、ただ整合性のあるデータを大量に作成する場合にも
使用できるし、今回使用して基本的な使い方を知ることができてよかったです。
メモ たのしいRubyChapter1 

#関数
rubyのメソッドでは()を省略できる。

##print
nilはprint文自体の戻り値

```ruby

print("Hello.\n")
Hello
=>nil
```

シングルクォートで文字列を囲った場合、「\n」などの特殊文字の解釈を行わず、そのまま表示する。
ただし「\」と「'」を表示したい場合は、その前に「\」をつける。

```ruby

print 'Hello \n'
```

文字列を続けて表示したい場合は「,」で区切る

```ruby

print "Hello,", "Ruby", ".", "\n"
```

##putsメソッド
printメソッドとは異なり、文字列の最後で必ず改行する

```ruby

puts "Hello, Ruby"
puts "Thank you"
```
###文字列にデータを埋める方法
文字列の中に#{変数名}を入れる

```ruby

x=10
y=20
z=30
area=10*20+z

print "areaデータ=#{area}\n"
```

##pメソッド
デバッグ用で使われる。特殊文字がそのまま出力されたり数値かどうか識別できたりする。

```ruby

p "100" #=> "100"
p 100 #=> 100
```
##コメント
- 一行単位 #
- 範囲指定 =begin =end

```ruby

#コメント
=begin
ここはコメント
ここはコメント
ここはコメント
=end
```
##if

```ruby
a=20
if a>=10
  print "greater\n"
end

b=30
if b>=10
  print "greater\n"
else
  print "smaller\n"
end
```

##while

```ruby

i=1
while i <=10
  print i, "\n"
  i=i+1
end
```

##times
**イテレータメソッド**
doは省略できない

```ruby
i=0
100.times do
  puts i
  i+=1
end
```
実務レベルのコードレビューがもらえる！e-Navigator完走！

Rails初学者の方はプログラミングスクールやRailチュートリアルを終え、ポートフォリオを作成しようと思っている方も多いと思います。
そこでポートフォリオの開発を始める前に是非おすすめしたいのが今回紹介するe-Navigatorです。

#e-Navigatorとは
[e-Navigator](https://e-navigator.feedforce.jp/)

株式会社フィードフォースが行っている就職支援プログラムです。
面談日程調整アプリを開発する中で、コードレビューを受けることができます。このプログラムは採用活動も兼ねているのでなんと**無料**です。また完走するとある技術書がもらえます。
プログラミングスクールやチュートリアルを進めていると動くアプリは作れるものの、「この書き方はあっているんだろうか」と不安になることがあると思います。実際、実務経験なしでは変数の命名などのコードの作法を学ぶことは難しいと思います。e-Navigatorでは実務レベルのコードレビューを受けることができ、最後までやり抜けば確実にRailsエンジニアとして成長していると思います。

#プログラム内容
大きく分けると以下の4つの機能を実装します。

1.ユーザーに関する機能
　- ユーザー登録、ログイン
　- 登録したユーザーのプロフィール編集機能

2.面接日程をCRUD機能

3.面接官が面談日程を承認or拒否するための機能

4.面談日程を知らせるためのメール送信機能

サンプルアプリも用意されているので細かい挙動は確認できます。

まず1のユーザーに関する機能を実装した状態でプルリクエストを作成します。
私の場合はgitの使い方に関するご指摘等をいただきました。

![howtousegit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300925/43194988-5170-8447-f8db-5ec39d7dcbf6.png)
コメント例

一つのプルリクエストがLGTMとなれば、マージして次の機能追加に移行します。

![review1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300925/440f66bf-41cb-14b9-0462-074f2ff2f65f.png)

良い部分もコメントしてくれるので嬉しいですね。

![self.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300925/e61c1fbf-a717-0a4d-e073-cd00cc6f3044.png)
私の場合はselfについて理解が曖昧な部分がありました。

![update_all.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300925/d32c2bf8-c94d-484b-561a-56a65dd6ef17.png)
コードの内容だけでなく、理解を深めるためのコメントをしてもらえることもありました。

最後のプルリクエストにLGTMをもらうとそのアプリを実際に使って、フィードバック面談の日程を調整します。
フィードバック面談ではコードレビューを元にさらに詳しいアドバイスをしてもらえます。
今後の学習についても相談しました。

#感想
* 個人の開発では行うことのできないプルリクエスト～コードレビュー～マージの流れを体験することができるのは中々体験することのできない貴重な体験だと思います。

* Deviseやenum,メイラーなどの実装を学ぶことができました。自分で調べて実装できる能力はエンジニアとしては必須だと思うので、それに慣れるという意味でもよかったです。

* 人に見てもらうということを意識してコードを書いたので、今の自分ではこれ以上のものは書けないという状態でプルリクエストを作成することを心がけていました。アプリの見た目や挙動もサンプルアプリと全く同じになるように実装すると妥協ができなくなるのでおすすめです笑見た目を全く同じになるようにCSSを調整するのに意外に苦労しました。

#最後に
自分の場合はプログラミングスクールのあと、現場Railsを1周後に取り組んでちょうど良いレベル感でした。
e-Navigatorはポートフォリオとして面接で使うこともでき、コードレビューの体験ができる上に技術書までもらえてしまう、という一石三鳥なプログラムだと思います。
また、自走力の証明、という意味でも面接でも良いアピールの材料になるのではないかと思っています。
一次レビューは一旦終わってしまうとのことですが、再開した際にはぜひエントリーをおすすめします。
puts, print, pの違いと、値出力時の便利メソッドまとめ

#初めに

paizaでやっていて値の出力方法がよく分からなくなってきたので、自分なりにメモしておきます。

#puts, print, pの違い
##putsメソッド
引数のオブジェクトを標準出力。

・**末尾に改行が入る形で出力される**
・to_sメソッドで文字列に変換



##printメソッド

引数のオブジェクトを標準出力。

・改行されない
・to_sメソッドで文字列に変換



##pメソッド
引数のオブジェクトを**詳しく**標準出力。

・改行される
・出力する値と共に型情報を一緒に出力
　（**文字列**→””で囲んで出力、**数値**→そのまま出力）



##結論

特徴だけまとめると、
・printは、**改行を行わないputs**
・pは、**文字列なら "" 囲むputs**
です。


##出力例


```ruby
apple = "りんご"
orange = "みかん"
 
print apple
puts orange
p orange


#=> appleorange
#=> "orange"
```

```ruby
apple = "りんご"
orange = "みかん"
 
print apple, orange
puts apple, orange
p apple, orange


#=> appleorangeapple
#=> orange
#=> "apple"
#=> "orange"
```

```ruby
p 1
p "1"
puts 1
puts "1"


#=> 1
#=> "1"
#=> 1
#=> 1
```


#出力時の便利メソッド

##times

・同じパターンを繰り返したい

```ruby
4.times do |i|
puts "りんごが#{i+1}個あります"
end


#=> りんごが1個あります
#=> りんごが2個あります
#=> りんごが3個あります
#=> りんごが4個あります
```

##join

・配列同士をくっつけたい
・出力結果の間に空欄を空けたい

```ruby
array = ["りんご", "みかん", "バナナ"]

puts array.join(" + ")
puts array.join(" - ")
puts array.join(" ")


#=> りんご + みかん + バナナ
#=> りんご - みかん - バナナ
#=> りんご みかん バナナ
```
未経験からエンジニアに転職された方の話を聞いてきました。

####未経験からエンジニアに転職された方の話を聞いてきました。
以下まとめ

接客営業などを９社ほど経験したのち３５歳で転職を決意
最初はC#などを扱うSESに入り１年在籍し、１年後にrubyもできる受託開発に転職できた。

####未経験からエンジニアになる過程で気づいたこと

①求人媒体によって採用単価が異なっているため、選考が通らないことがある。
月額報酬制のwantedlyとかで求人をみるのもいいんじゃないかとのこと。

②完全未経験でも入れるところはある。
とにかく入って実務経験を積むべき

③ポートフォリオも大切だが面接が何より重要。
話す内容を面接官によって変える

（例：人事は長く続く人か見ている。現場の人であれば役に立ちそうかをみている。経営層であればチャレンジングで行動力のある人を好む。）
④いいところに入れなくても落ち込まない、実務経験が一年でもあることはかなり評価される。

やばいのだけはとにかく避けてとにかく入るべしというのはとても参考になると思います。面接に苦手意識があるので面接の話された内容がとても再現性が高くて勉強になりました。ありがとうございました！
openCVで顔認識

openCVで顔認識をして、顔を赤い枠で囲む！
よく見かけるものですが、初心者向けの解説は少ない！

Githubから丸ごとクローンする
->自分でコードをすこーーし書く
->画像表示

と、とても簡単です！
では、早速！
まず以下のリンクに飛んでください
https://github.com/opencv/opencv
このページの緑色のボタンclone or downloadをおし、
pycharmでも！コマンドでも！クローンします。

続いて、自分で新しくコードを作ります。

```python

import cv2
from matplotlib import pyplot as plt
import matplotlib.pyplot as plt


cascade = cv2.CascadeClassifier("/Users/kimurayui/PycharmProjects/opencv/data/haarcascades/haarcascade_frontalface_default.xml")
#CascadeClassifier関数というものを使って認識器を生成
#パスはとりあえず絶対パス
img = cv2.imread("photo.PNG")
#自分の使いたい顔写真をphoto.PNGという名前で保存して、このコードと同じディレクトリに保存する
#もちろん画像は.jpgでもOK
#もし仮に違うディレクトリに保存されている場合は" "の中に絶対パスを貼り付ければ良い
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#imgと名前をつけた画像を白黒で読み込む
faces = cascade.detectMultiScale(gray,scaleFactor=1.5)
#scaleFactorは認識精度を表す
for (x,y,w,h) in faces:
    cv2.rectangle(img,(x,y),(x+w,y+h),(0,0,255))
#顔を赤線で囲む
#x座標、y座標、w幅、h高さ
#x+wは四角形の横の長さ、y+hは四角形のたての長さ
#opencvは、GBR
cv2.imshow("test",img)
#"test"という名前で新しいウィンドウで画像を出力
cv2.waitKey(0)
# キーが押させるまで画像を表示したままにする
# 第一引数：キーイベントを待つ時間　0: 無限, 0以上: 指定ミリ秒待つ
cv2.destroyAllwindows()
#画像はデスクトップに表示されている
#この開いた画像を閉じるにはcommand + w

# ***openCVでなくmatplotlibで画像を表示させる場合***
# img = cv2.imread('photo.PNG',0)
#画像読み込み
# plt.imshow(img, cmap = 'gray', interpolation = 'bicubic')
# plt.xticks([]), plt.yticks([])
# to hide tick values on X and Y axis
#plt.show()
#画像表示
```
以上のコードを実装すれば画像表示できる。

matplotlibでも表示できます。

まだまだ初心者ですが、このみちで頑張っていこうと思います。
[AWS][RDS][MySQL] 文字コードをutf8mb4にする

AWSにログイン > Amazon RDS に移動 > パラメータグループを選択。

「パラメータグループを作成」を押し、

```
パラメータグループファミリー：データベースと同じもので
グループ名：自由
説明：自由
```

で作成。

その後、一覧ページに移動し、作成されたパラメータグループをクリック。

パラメータ一覧が表示されるので、以下のように変更

```
character_set_client:utf8mb4
character_set_connection:utf8mb4
character_set_database:utf8mb4
character_set_results:utf8mb4
character_set_server:utf8mb4
innodb_large_prefix:1
innodb_file_format:Barracuda
innodb_file_per_table:1
skip-character-set-client-handshake:1
init_connect:SET NAMES utf8mb4
```

次に、サイドバーからデータベースに移動 > 対象のデータベースをクリック。

変更ボタンを押し、パラメータグループを今作成したものに変更。

データベースを再起動すると反映される。

# 参考
[Amazon RDS(MySQL)でutf8mb4を使いたい場合の設定](https://qiita.com/msykd/items/f6ef3f7c137c7778fa70)
[AWS Aurora MySQL5.7互換の文字コードをutf8mb4に変更](https://qiita.com/shohein/items/ed192526f68ceb1ec60b)
[Rails5.1でutf8mb4（絵文字）に対応させる](https://qiita.com/okamu_/items/5eb81688849fbe351350)
iOS12.2でWeb Share APIがきてたので、検証してみた

先日普通にiPhoneでQiitaを見てたら...

<img width="375" alt="2019_1.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137148/fd155fa7-ea07-388a-0350-2a56ebaa34fd.jpeg">

なんじゃこりゃ！

<img width="375" alt="2019_2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137148/b3b6bab1-13ea-bc9d-72a3-2a2cc576c89b.png">

まじか！

と言う感じでiOS12.2からWebShareAPIに対応したみたいです。(Qiitaの対応早すぎかよ...)

なので、Vue+TypeScript+bulma+parcelでサクッとデモページを作って検証してみました。

## 検証

- GitHub: https://github.com/katsuyaU/sample-web-share-api
- デモページ: https://katsuyau.github.io/sample-web-share-api/

iOS12.2ではtextとurlのみ反応し、titleは反応しないみたいです。

また、httpsじゃないと`navigator.share`がundefinedになるようです。

AndroidのChromeもWebShareAPIに対応済みですが未検証です。

## 使用想定
テキストとURLしか共有できないのでできることは限られますが、共有用のURLや複数のURLを共有したいときに使えると思います。

また、フレンドコードをボタンをタップしてすぐに共有なんて使い方もできると思います。

## TypeScriptでの型定義

```ts
interface Navigator {
  share?(option: { url: string } | { text: string } | { title: string }): Promise<void>
}

// コンパイルエラー
navigator.share({text: "fogefoge"})

if (navigator.share) {
  navigator.share!({text: "fogefoge"})
}
```

未対応のブラウザも多いので、`share?`で定義してます。

strictモードで普通に使おうとするとコンパイルエラーになります。

また、paramはurl、title、textをいずれか1つ以上なので、union型で定義しました。

## 最後に
Androidは対応済みであること、iOSは最新OSのシェア率が高いのもあって、これからはよくあるSNS共有リンクに変わってWebコンテンツ上に共有ボタンが置かれるかもしれません。

まだまだ発展途上って感じですが、画像などを共有できるようになったら、TwitterAPIを介さずに画像ツイートなどができそうですね！

## 参考
- [Navigator.share - Web APIs | MDN](https://developer.mozilla.org/ja/docs/Web/API/Navigator/share)
- [Web Share API が Safari で使えるようになったので早速使ってみる - Qiita](https://qiita.com//im36-123/items/73d7510deb357425dcdb)
rustでvectorから値を取り出そうとすると、cannot move out of indexed content

# Vectorから値を取り出そうとしてみる

```main.rs
fn main() {
    #[derive(Debug)] 
    struct Num {
        num: u8
    }

    let zero = Num{num: 0};
    let one = Num{num: 1};
    let two = Num{num: 2};

    let vector = vec![zero, one, two];
    let zero = vector[0];
    println!("{:?}", zero);
}
```

これはコンパイルに通りません。
`error[E0507]: cannot move out of indexed content`

## indexing
vectorの0番目の要素を取り出そうとして、`vector[0]`と書きました。
そもそもこの書き方は`Vector`が提供しているものではないのです。
`[]`を使った方法は`Vector`が`Index`トレイトを実装しているために使えるものです。
[std::ops::Index - Rust](https://doc.rust-lang.org/std/ops/trait.Index.html)
`Vector`の値を取り出すメソッドには`get`が定義されています。

## getとindexingの違い
`get`を使って次のように書き換えるとコンパイルに通ります。

```main.rs
fn main() {
    #[derive(Debug)] 
    struct Num {
        num: u8
    }

    let zero = Num{num: 0};
    let one = Num{num: 1};
    let two = Num{num: 2};

    let vector = vec![zero, one, two];
    let zero = vector.get(0);
    println!("{:?}", zero);
}
```

`Some(Num { num: 0 })`

この違いはなんでしょうか。

### indexの挙動
indexの挙動は次のようになります。

- 要素が`Copy`を実装していればcopyした値を返す
- `Copy`が実装されていない場合は、値を返す

`Num`は`Copy`を実装していないため、indexで要素を取得しようとすると値がそのまま返されます。
すると、`vector`の１つめの要素の`Num`の所有権が、`vector`から`zero`に移ることになります。
しかし、`Vector`の要素の一部分だけ所有権がmoveすることは許されていいないため、コンパイルに通らないようです。

### getの挙動
`get`は指定された場所にある要素の参照を返します。
そのため、`zero`は要素の参照になるため、とくに問題はないのです。

### copyを実装している場合
indexを利用しても、要素が`Copy`を実装していれば、copyされた値が返されるので所有権の問題は生じません。
以下はコンパイルに通ります。

```
fn main() {
    println!("{:?}", zero);

    let vector = vec![0, 1, 2];
    let zero = vector[0];
    println!("{}", zero);
}
```

# 参考
[rust - What does "cannot move out of indexed content" mean? - Stack Overflow](https://stackoverflow.com/questions/27904864/what-does-cannot-move-out-of-indexed-content-mean)
[std::vec::Vec - Rust](https://doc.rust-lang.org/std/vec/struct.Vec.html#impl-Index%3CI%3E)
[std::ops::Index - Rust](https://doc.rust-lang.org/std/ops/trait.Index.html#associatedtype.Output)
Laravelのdelete()メソッドで論理削除しようと思ったらうまくいかなかった話

#はじめに

ユーザの論理削除に伴って、メッセージも論理削除しようと思い、下記のコードを実行したところ、メッセージだけ論理削除されずに普通に削除されてしまったので、原因と解決法を書いておきます。

``` php
public function deleteUserLogically($id)
    {
        DB::transaction(function () use ($id) {

            $user = User::find($id);

            $messages = DB::table('messages')
                    ->Where('from_id', '=', $user->id)
                    ->get();

            foreach ($messages as $message)
            {
                $message->delete();
            }

            $user->delete();
        });
    }
```

#原因
**Eloquent ORMではなく、DBファサードでdelete()メソッドを実行していた。**

#解決法
原因がわかったので、delete()メソッドをEloquent ORMで実行していきます。

``` php
public function deleteUserLogically($user)
    {
        DB::transaction(function () use ($id) {

            $user = User::find($id);

            $messages = Message::Where('from_id', '=', $user->id)
                    ->get();
            foreach ($messages as $message)
            {
                $message->delete();
            }

            $user->delete();
        });
    }
```

これでうまくいきました！

#まとめ
今回の出来事で、今までなんとなく使っていた、DBファサードとEloquent ORMについて詳しくなる事ができました！また、Laravelのファサードについての理解も深められたので良かったです。
TensorBoardでcompute timeを見る方法


```
tf.RunMetadata
```
を使うことで各ノードの計算時間やメモリ使用状況をTensroBoardで知ることができる。

#公式ドキュメントで公開されているコード
https://www.tensorflow.org/guide/graph_viz

```mnist_train.py
def feed_dict(train):
    """Make a TensorFlow feed_dict: maps data onto Tensor placeholders."""
    if train or FLAGS.fake_data:
      xs, ys = mnist.train.next_batch(100, fake_data=FLAGS.fake_data)
      k = FLAGS.dropout
    else:
      xs, ys = mnist.test.images, mnist.test.labels
      k = 1.0
    return {x: xs, y_: ys, keep_prob: k}

  for i in range(FLAGS.max_steps):
    if i % 10 == 0:  # 10回に1回だけtest-setでのaccuracyを保存する
      summary, acc = sess.run([merged, accuracy], feed_dict=feed_dict(False))
      test_writer.add_summary(summary, i)
      print('Accuracy at step %s: %s' % (i, acc))
    else:  # Record train set summaries, and train
      if i % 100 == 99:  # 100回に1回だけ実行時の状況を保存する(この記事の本題)
        run_options = tf.RunOptions(trace_level=tf.RunOptions.FULL_TRACE)
        run_metadata = tf.RunMetadata()
        summary, _ = sess.run([merged, train_step],
                              feed_dict=feed_dict(True),
                              options=run_options,
                              run_metadata=run_metadata)
        train_writer.add_run_metadata(run_metadata, 'step%d' % i)
        train_writer.add_summary(summary, i)
        print('Adding run metadata for', i)
      else:  #summaryを保存する
        summary, _ = sess.run([merged, train_step], feed_dict=feed_dict(True))
        train_writer.add_summary(summary, i)
```

```
run_options = tf.RunOptions(trace_level=tf.RunOptions.FULL_TRACE)
run_metadata = tf.RunMetadata()
```

を定義してsess.sun()に渡す。
オプションには<b>FULL_TRACE</b>の他に、<b>SOFTWARE_TRACE</b>、<b>HARDWARE_TRACE</b> などがあるが、ドキュメントでも詳細な説明はない。
とりあえず<b>FULL_TRACE</b>を使えばよいと思われる。

```
train_writer.add_run_metadata(run_metadata, 'step%d' % i)
```

でmetadataを保存する。

#TensorBordで見るには
TensorBordのSession runsから見たいstepを選択すればよい。
![tensorflow.jpg](https://qiita-image-store.s3.amazonaws.com/0/296023/1668d018-549f-8d42-a439-a956149c9f5a.jpeg)
Boost Graph Library:: 任意のノード間にエッジが存在するかを調べる

# 1. 目的
boost graph library を用いたグラフにおいて任意の２つのノード間にエッジがあるかどうか確認する。

# 2. 方法
グラフgにおいてノードuからvへのエッジが存在するか確認する時、
`edge(u, v, g)`
を用いる。これは`std::pair<edge_descriptor, bool>`を返り値に持つ関数で、１つ目の要素に該当エッジの`edge_descriptor`、第2要素に`bool`を持つ。

※エッジが存在しない場合(第2要素がfalseの場合,第1要素はnullとなる。

## 2.1 保証
[公式ドキュメント](https://www.boost.org/doc/libs/1_70_0/libs/graph/doc/AdjacencyMatrix.html)より定数時間で返ってくることが保証されている。

# 3.例

以下の重み付き有向グラフについて、各ノードに対してエッジを持つかどうかを判定し、存在した場合は重みを出力する。
![qiita.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262578/2acf20f4-9fba-d513-b924-6f81c0ac0969.png)

（すべての重みは出次数により正規化されているものとする。）

### 3.1 コード
参考リンクの記事に基づき生成したノード、エッジにプロパティを持つグラフ。
詳細については割愛。

```c++
    vertex_iterator i,j,m,n;
    for (boost::tie(i, j) = vertices(g); i!=j; i++) {
        for (boost::tie(m, n) = vertices(g); m!=n; m++) {
            cout << "The edge[" << g[*i].id << " -> " << g[*m].id << "] " << flush; 
            if(boost::edge(*i,*m,g).second){
                cout << "exsits. The weight is " << g[boost::edge(*i,*m,g).first].weight << "." << endl;
            }else{
                cout << "is nothing." << endl;
            }
        }
    }
```
`vertex_iterator` を用い、すべてのノードについてfor文を回している。

### 3.2 出力
```
The edge[0 -> 0] is nothing.
The edge[0 -> 1] exsits.[Weight = 0.5]
The edge[0 -> 2] exsits.[Weight = 0.5]
The edge[0 -> 3] is nothing.
The edge[1 -> 0] is nothing.
The edge[1 -> 1] is nothing.
The edge[1 -> 2] exsits.[Weight = 0.5]
The edge[1 -> 3] exsits.[Weight = 0.5]
The edge[2 -> 0] exsits.[Weight = 0.5]
The edge[2 -> 1] is nothing.
The edge[2 -> 2] is nothing.
The edge[2 -> 3] exsits.[Weight = 0.5]
The edge[3 -> 0] exsits.[Weight = 1]
The edge[3 -> 1] is nothing.
The edge[3 -> 2] is nothing.
The edge[3 -> 3] is nothing.
```

# 参考
- [c++,boost] boost::graphのお勉強 https://qiita.com/kktk-KO/items/6c53e1c550cae441c969 #Qiita
- Boost Graph LibraryとGraphvizでグラフの可視化 - メモ帳 http://tomov3.hatenablog.com/entry/2016/06/22/103530
- 公式リファレンス https://www.boost.org/doc/libs/1_57_0/libs/graph/doc/graph_concepts.html https://www.boost.org/doc/libs/1_70_0/libs/graph/doc/AdjacencyMatrix.html
[Flutter] flightShuttleBuilder使ってみた。


皆様こんにちは！　
今回はHero　Widgetのなかで、flightShuttleBuilderを使ってみました。
Heroを簡単に使うとしたら、Tagだけでも問題ないです。

```dart

typedef HeroFlightShuttleBuilder = Widget Function(
  BuildContext flightContext,
  Animation<double> animation,
  HeroFlightDirection flightDirection,
  BuildContext fromHeroContext,
  BuildContext toHeroContext,
);

```

#Code 

```dart:main.dart

return Hero(
      tag: 'hero-${element.symbol}',
      flightShuttleBuilder: (_, anim, __, ___, ____) => ScaleTransition(
            scale: anim.drive(Tween(begin: 1, end: 1.75)),
            child: tile,
      ),
      child: Transform.scale(
        scale: isLarge ? 1.75 : 1,
        child: tile,
    ),
);

```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137182/7484c2f8-93c6-dfcd-0ac6-6330d30282bb.png)
AtCoder Beginner Contest 124 の参戦記録

AtCoder Beginner Contest 124に参戦したので、提出時にどのようなことを考えていたのかと実際の提出コードをまとめておきたいと思います。利用した言語はPython3。Python3や競技プログラミングに取り組まれている方の一助になれば幸いです。

基本的には参戦記録のようなものをまとめることはあまりないのですが、今回は総合成績115位と自分にしてはかなりよい結果だったので、浮かれてこんな記事を書いています(´・ω・｀) 

# A - Buttons

- 問題: https://atcoder.jp/contests/abc124/tasks/abc124_a
- 提出: https://atcoder.jp/contests/abc124/submissions/4950205

取りうる行動は以下の3通りなので、それぞれの行動で獲得できるコインの数の最大数を求めます。

- 大きさAのボタンを2回押す
- 大きさBのボタンを2回押す
- 大きさAのボタンと大きさBのボタンを1回づつ押す

# B - Great Ocean View

- 問題: https://atcoder.jp/contests/abc124/tasks/abc124_b
- 提出: https://atcoder.jp/contests/abc124/submissions/4949719

すべての旅館について、海を見ることができるかどうかを判定し、見ることができる旅館の数を数えるだけです。$O(n^2)$ですが、旅館の数Nの最大値が20とかなり小さいので、この解法でもACします。Nが大きいと工夫する必要があるかもしれません。

# C - Coloring Colorfully

- 問題: https://atcoder.jp/contests/abc124/tasks/abc124_c
- 提出: https://atcoder.jp/contests/abc124/submissions/4948961

市松模様のパターンは以下の2通りです。

- □■□■□■□■□■...
- ■□■□■□■□■□...

よって「与えられたタイルの並び」から2つの市松模様に変えるためのコストを求め、よりコストが低いほうが答えになります。

# D - Handstand

- 問題: https://atcoder.jp/contests/abc124/tasks/abc124_d
- 提出: https://atcoder.jp/contests/abc124/submissions/4947894

左端のインデックスを`i`、右端のインデックスを`j`とすると、`S[i:j]`に属する人を$K$回の操作で全員逆立ちにできた場合、右端を広げます。つまり`j += 1`とします。一方、$K$回の操作をしても全員を逆立ちにできなかった場合、左端を狭めます。つまり`i -= 1`とするわけですね。

ところで「`S[i:j]`に属する人を$K$回の操作で全員逆立ちにできるか」の判定はどのようにすべきでしょうか? たとえば次のように人が並べられていたとします: `01001000`。これは3回の操作で全員を逆立ちにすることができます。

1. 先頭の人を逆立ちにする。
2. 真ん中の2人を一度に逆立ちにする。
3. 最後尾の3人を逆立ちにする。

つまり`S[i:j]`のうち0が連続する区間の数が$K$以下の場合、「$K$回までの操作で全員逆立ちにできる」といえそうです。すると問題は「`S[i:j]`のうち0が連続する区間の数」をいかに効率よく求めるかになります。わたしは尺取り法を利用しましたが、累積和でもなんとかなりそう。並んでいる人の数$N$の最大値が$10^5$というかなり微妙なラインではあるので、工夫次第では区間をなめるコードでもなんとかなるかも。
オンプレミスの基幹システムをAWSに移行することになった話 3

# 構築開始
構成図から月のランニングコストを概算で算出し、稟議を通しました。
ランニングコストの計算はオフィシャルのコスト計算ツールを使いました。

[SIMPLE MONTHLY CALCULATOR](https://calculator.s3.amazonaws.com/index.html?lng=ja_JP#)

●Amazon EC2
![SMC_1.JPG](https://qiita-image-store.s3.amazonaws.com/0/171074/dd2d97e4-a073-f49b-533b-d95d70f7e112.jpeg)

・言語をJapaneseに変更
・リージョンをアジアパシフィック（東京）に変更
・無料利用枠のチェックを外す
・EC2インスタンス（説明、インスタンス数、月の使用率、スペックタイプ）を指定
・EC2にくっつけるEBSボリュームを指定。
↑EBSボリュームのストレージ容量は単純にサーバーに乗せるファイル容量以外にも、容量に比例してIOPSが増えるので、あまり小さくしすぎると複数接続時に耐えられなくなるようです。私はAWSの方に100GB取っておけばそれなりに安心といわれたのでそうしました。

●Amazon RDS
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171074/99a9b668-8ee2-d09a-bf53-225c04374841.png)

●Amazon VPC
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171074/b741af0f-425d-0adb-5c49-cb13184c8e95.png)

・データ転送量は動画サイトとかでなければ、そこまでシビアにならなくても良いっぽい。自分は既存システムのApacheログから1日の転送量目安を算出して31倍したものを入力しました。

●AWS サポート
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171074/927ba8e9-f729-8046-7b8a-a443a5227d16.png)



# オフィスとAWS間のVPNを設定する
## VPCを作る
AWSのアカウント作ったりIAMの設定したりという初期設定は他サイトで説明してくれているので省略します。

オフィスのルーターはYAMAHAのRTX1210なので、下記サイトの通りに設定し、
VPN接続設定ファイルをダウンロードしました。

[●Amazon VPCとの接続 Amazon VPCの仮想ネットワーク(IPsec)を設定する](https://network.yamaha.com/setting/router_firewall/cloud/amazon_vpc/setup_vpc)

ルーターへの設定ファイル流し込みの部分ですが、うちはNTTからルーターをレンタルしているので、
NTTの方に設定ファイルを渡してやってもらいました。
適当にLAMPのEC2立ててみて、ブラウザからローカルIPアドレスでアクセス出来ることを確認して完了です。

## 完了と思いきや、VPN経由の通信が不安定・・・

VPN環境できたし環境作りこんでいくぞ！なんて意気込んでいた矢先、なんだかSSHでの通信がたまに固まる現象が発生。
どうやら、小さい通信であれば問題無いのに例えばTOPのようなコマンドだとターミナルが固まってしまいます。
Apacheでも「It'works!」みたいなシンプルページなら見れるのに、普通に作りこんだページは閲覧できず、、。

だいぶハマって丸一日ほど調べつくした結果、MTUの設定がルーターと合っていないということがわかりました。
MTUとは"1回の転送（1フレーム）で送信できるデータの最大値を示す伝送単位のこと"です。
今回のケースで言うと、サーバーから飛んでくるMTUがデカすぎて、ルーターの方で一度分解して、通して、再構成、みたいなことが行われたために、通信エラーとなっていました。

下記のコマンドで、AWS上に立てたLAMPサーバーのローカルipアドレスを指定して、1500から順に下げていき
どこから正常に通信可能かを調査しました。
結果1252というのが通信が上手くいくMTU値でした。

> ping -f -l (調べたいMTU値　例えば1300とか) -n 1 (接続ipアドレス 192.168.xx.xx)

LAMPサーバーの方で下記のようにMTU値を設定してやると、スムーズに通信することが出来るようになりました。

> sudo ip link set dev eth0 mtu 1252
今年の言語はRust その１５


# 今年の言語はRust その１５

Rustを学びます


Rustの日本語ドキュメント 2nd Edition
https://doc.rust-jp.rs/book/second-edition/

オリジナル(英語)
https://doc.rust-lang.org/book/



## コレクション型


### 8.1 ベクタ型


単一の型のデータをメモリ上に隣り合わせに配置する

(注意) 

```rust

fn main() {

    // ベクタ型
    let mut v: Vec<i32> = Vec::new();
    
    v.push(5);
    v.push(5);
    v.push(5);
    
    // マクロ
    let mut v = vec![1, 2, 3];
    
    v.push(5);
    v.push(6);
    v.push(7);
    v.push(8);
    
}

```

```rust

fn main() {

    // ベクタ型
    let v = vec![1, 2, 3, 4, 5];
    
    let third: &i32 = &v[2];
    
    let third: Option<&i32> = v.get(2);

    
}

```

```rust

fn main() {

    // ベクタ型
    let v = vec![1, 2, 3, 4, 5];
    
    let does_not_exist = &v[1000]; //<- パニック!!
    
    let does_not_exist = v.get(1000); // <<- Option.None

    
}

```

> このコードを走らせると、最初の[]メソッドはプログラムをパニックさせます。存在しない要素を参照しているからです。 

> このメソッドは、ベクタの終端を超えて要素にアクセスしようした時にプログラムをクラッシュさせたい場合に最適です。


また所有権に関する、ちょっとややこしいエラー

```rust
fn main() {

    let mut v = vec![1, 2, 3, 4, 5];
    
    let first = &v[0];
    
    v.push(6);
}

```

????

**ドキュメントにはエラーになるとあるが、実際buildしてもエラーにならない。**


#### 実行環境

```sh
$ cargo -V
cargo 1.33.0 (f099fe94b 2019-02-12)
$ rustup -V
rustup 1.17.0 (069c88ed6 2019-03-05)
$ rustc --version
rustc 1.33.0 (2aa4c46cf 2019-02-28)

$  cat /proc/version
Linux version 4.14.97-74.72.amzn1.x86_64 (mockbuild@gobi-build-64002) (gcc version 7.2.1 20170915 (Red Hat 7.2.1-2) (GCC)) #1 SMP Tue Feb 5 20:59:30 UTC 2019

$ uname -a
Linux ip-10-100-0-8 4.14.97-74.72.amzn1.x86_64 #1 SMP Tue Feb 5 20:59:30 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

$ cat /etc/\*release
NAME="Amazon Linux AMI"
VERSION="2018.03"
ID="amzn"
ID_LIKE="rhel fedora"
VERSION_ID="2018.03"
PRETTY_NAME="Amazon Linux AMI 2018.03"
ANSI_COLOR="0;33"
CPE_NAME="cpe:/o:amazon:linux:2018.03:ga"
HOME_URL="http://aws.amazon.com/amazon-linux-ami/"
Amazon Linux AMI release 2018.03

```

よくわからないなぁ

### ベクタの値を走査する

for文での使い方.
参照を渡してる.

mutableの場合は「参照外し」 

\*を使用してiの値にたどり着かないといけない


```rust
// imutableの場合
fn main() {

    let v = vec![1, 2, 3, 4, 5];
    
    for i in &v {
        println!("{}", i);
    }
}


// mutableの場合
fn main() {

    let mut v = vec![1, 2, 3, 4, 5];
    
    for i in &mut v {
        *i += 50;
        println!("{}", i);
    }
    
    for i in &v{
        println!("{}", i);
    }
}


```


ベクタ型に複数のデータ型を保持する裏技


```rust

fn main() {

    enum SpreadsheetCell{
        Int(i32),
        Float(f64),
        Text(String),
    }
    
    let row = vec![
        SpreadsheetCell::Int(3),
        SpreadsheetCell::Text(String::from("blue")),
        SpreadsheetCell::Float(10.12),
    ];
}

```



次回！


イエス！
Pengwinで作るWindows上のLinux開発環境

# はじめに
Windows上でLinuxが扱えるWSL（Windows Subsystem for Linux）ですが、そのディストリビューションの一つにPengwin[^1]（旧：Wlinux）があります。こちら、有償ですがコマンド一つでNode.jsのインストールからGUI設定まで、あらゆる設定ができるので、超おすすめです。

[^1]: 名前は、LinuxのペンギンとWindowsからきているのでしょうか。今までは「Wlinux」と検索するとGoogle先生に「次の検索結果を表示しています: linux」の刑に処されていたので、良い名称変更だと思います。

この記事では、Pengwinの設定方法とVisual Studio Codeの環境構築方法について説明していきます。
**注）あくまで現時点の情報です。アップデートが激しいようなので今後変わる可能性があります。**

# インストール方法
Microsoftストアからインストール（購入）します。
https://www.microsoft.com/ja-jp/p/wlinux/9nv1gv1pxz6p

また、VisualStudioCodeなどのGUIを使用するため、X410も必要です。
https://www.microsoft.com/ja-jp/p/x410/9nlp712zmn9q

定価はPengwinが¥2,350、X410が¥5,850ですが、セールでしょっちゅう1000円くらいになっているので、その間に購入するのが良いです。

# 設定
X410を立ち上げておいてください。
はじめにユーザ名とパスワードを設定し

```
$ pengwin-setup
```
を打つ。以上。

このコマンドを打つだけで、以下の画面にて欲しいものを選択していくだけで環境構築が可能です。
<img width="620" alt="pengwin.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227999/b04aed29-c128-15f9-00bf-7cf3a3fee196.png">
具体的には以下の通りです。

* EDITORS
    * Neovim
    * Emacs
    * Visual Studio Code
* MAINTENANCE
    * バックアップとリストア設定
* PROGRAMMING
    * C++
    * .NET
    * Go
    * Java
    * Node.js（パッケージマネージャのnも）
    * Python
    * Ruby
* SETTINGS
    * Windowsのエクスプローラに「Open with Pengwin」を追加
    * GUIを使えるようにする設定
    * 言語設定
    * シェルの追加（zsh、csh、fish）
* SERVICES
    * Cassandra
    * rc.local
    * SSHサーバ
* TOOLS
    * AWS CLI、Azure CLI、IBM Cloud CLI、OpenStack comamnd-line clients、Terraform
    * Docker for Windowsを使用するための設定
    * Powershell

一点、日本語入力を行うために以下の設定だけ必要のようです。
以下のコマンドを打つと

```
$ fcitx-config-gtk3
```
ウィンドウが開くので、下の「＋」をクリックし「Mozc」を選択したのち「↑」（本当は＞を90度上向きにしたやつ）をクリックします。

GUIの見た目やフォントは以下のコマンドで自由に変えられます。

```
$ lxappearance
```

# VSCodeの起動
ここまでが終わったら、

```
$ code
```

でVisual Studio Codeが起動します。

# おわりに
個人的には、UbuntuなどでGUIインストール、日本語化などをいちいち手動で行うことを考えると、2000円出す価値があると思います！

ぜひ使ってみてください。

PengwinのGitHubは[こちら](https://github.com/WhitewaterFoundry/Pengwin)
なんか変なエラーが出た時には、同じissueがあることも多いです。
複数選択可能なセレクトボックスの選択値を、JavaScript(jQuery)で取得して送信、PHPで受信する

実装したかったのは以下。

- 複数選択可能なセレクトボックス(PHP(HTML))
- 未選択であればアラートを出力する(JavaScript(jQuery))
- API(PHP)に選択値を送信する(JavaScript(jQuery))
- 受信した選択値をあれこれする(PHP)

# 複数選択可能なセレクトボックスの実装
multiple要素を使う

```html:input.php
<select multiple="" id="qiita_tag">
  <option value="1">Python</option>
  <option value="2">vs</option>
  <option value="3">Rails</option>
</select>
```

# 未選択の判定
selectedの件数で判断する

```javascript:check.js
let select_count = $('#qiita_tag :selected').length;
if (select_count <= 0) {
    alert('タグを選択してください');
    return;
}
```

## 参照

- [How to get number of selected options using jquery? - Stack Overflow](https://stackoverflow.com/questions/3707812/how-to-get-number-of-selected-options-using-jquery) 
※ググった検索ワード：不明(履歴辿ったけどわからなかった)

# 選択値をAPIに送信
選択値のみを配列に詰め、JSON文字列に変換

```javascript:post.js
let sel_opt = document.getElementById(qiita_tag);

let array_select_tag_val = [];
for (let i = 0; i < sel_opt.length; i++) {
    if (sel_opt[i].selected) {
        array_select_tag_val.push(sel_opt[i].value);
    }
}
let qiita_tag = JSON.stringify(array_select_tag_val);

let data = {};
data.qiita_tag = qiita_tag;
// 他にもパラメータを送信しているが、本記事では省略

$.ajax({
    method: 'POST',
    url: 'sample.php',
    data: data,
    cache: false
}).done(function(json, textStatus, jqXHR) {
    // 省略
}).fail(function(jqXHR, textStatus, errorThrown) {
    // 省略
});
```

## 参照

- [morituriのブログ : Javascriptで複数選択SELECT要素の値を取得・設定するサンプル](http://blog.livedoor.jp/morituri/archives/54013170.html) ※ググった検索ワード「js select multiple values」

- [JavaScript→PHPに多次元配列を渡す - 六帖のかたすみ](http://rokujo.hatenadiary.com/entry/20141120/1416490690) ※ググった検索ワード「javascript php 配列 ajax」

# 選択値を受信
JSON文字列をデコードして連想配列形式で取得

```php:sample.php
<?php
$post_qiita_tag = filter_input(INPUT_POST, 'qiita_tag');
$array_qiita_tag = json_decode($post_qiita_tag, true);
```
## 参照

- [JavaScript→PHPに多次元配列を渡す - 六帖のかたすみ](http://rokujo.hatenadiary.com/entry/20141120/1416490690) ※ググった検索ワード「javascript php 配列 ajax」
Go言語のお勉強_2019-04-14

#worspace

ワークスペースの構成
Go のワークスペースは下記のように、bin、pkg、src という３つのディレクトリで構成することが決められています。 このルールに従ってファイルを配置することで、Makefile のようなビルド設定ファイルを用意しなくても、ビルドコマンド (go build) は構造化されたディレクトリ構成のプロジェクトを認識できるようになっています。

gowork/
  +-- bin/  # 作成したバイナリファイル（go install したときの保存先）
  +-- pkg/  # 依存パッケージのオブジェクトファイル（.a ファイルなど）
  +-- src/  # ソースコード（実行対象のファイルやインポートするファイルを配置）
Go による開発では、ひとつのシステム内（PC 内）に、ひとつのワークスペースだけを用意して、その中ですべての作業を完結させる方法が主流となっています。 自分で作成しているパッケージも、go get コマンドでインターネット上から取得したパッケージも、PC で唯一のワークスペース内の src/ ディレクトリの中に格納します。 Go のプログラム内から外部パッケージをインポートするときは、まず pkg/ ディレクトリ内のバイナリ版が検索され、次に src/ ディレクトリが参照されるようになっています。

他の言語と比べると、特殊な管理方法（ほとんどルールベースで動作する）なので最初は戸惑うかもしれませんが、一度分かってしまえばそれほど複雑な仕組みではありません（こういった１ワークスペースでの開発が、Google 社内の開発ルールに適していたのかもしれませんね）。
https://maku77.github.io/hugo/go/workspace.html
AWSCloud9上にHerokuを導入する手順

# AWSCloud9上にHerokuを導入する手順

主にRailsチュートリアルを参照
https://railstutorial.jp/chapters/beginning?version=5.1#sec-heroku_setup

**下記のコマンドをセット**

`source <(curl -sL https://cdn.learnenough.com/heroku_install)`
draw.io で Font Awesome のアイコンを使いたい

## 1. ライブラリファイルをダウンロード

* `git clone https://github.com/jgraph/drawio-libs.git`

## 2. ライブラリファイルを読み込む

* メニューの `ファイル` から `ライブラリを開く...` をクリック。
* `drawio-libs/libs/font-awesome.xml` を開く。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201797/90e5c081-aed4-a0a8-21be-484addeaeb3b.png)

## 雑感

Font Awesome 公式からというより、Font Awesome のアイコンを持ってきて、draw.io のライブラリ化した感じなのかな？
Free のものが全部あるかどうかは分からん。無いような気がする。現在 (2019-04-14 17:28) で、Font Awesome で `Free` フィルターをかけると 1,513 もある。

Material design icons もいいね。

以上。自分用メモ。下記サイトのまんま。
参考サイト: [jgraph/drawio-libs: Libraries for draw.io](https://github.com/jgraph/drawio-libs/blob/master/README.md)
Jupyter で unzip の進捗状況を表示

_[個人ブログにも転載しています](https://metareal.blog/post/2019/04/14/how-to-show-progress-bar-while-unzipping-tons-of-files/)_

公開データセットとか、やたらとファイル数が多い zip ファイルをノートブックで `unzip` すると、出力が多すぎて UI のパフォーマンスが急激に劣化する。

```bash
!unzip /home/data/large_dataset.zip -d /home/data/

Archive:  /home/data/large_dataset.zip
  inflating: /home/data/large_dataset/1/1900_753325_0060.png  
  inflating: /home/data/large_dataset/1/1900_754949_0023.png  
  inflating: /home/data/large_dataset/1/1900_758495_0075.png  
  inflating: /home/data/large_dataset/1/1900_761460_0029.png  
  inflating: /home/data/large_dataset/1/1900_766994_0030.png  
  inflating: /home/data/large_dataset/1/1900_776319_0015.png  
  ...
  (More 80K lines) 
```

かといって、 `/dev/null` にリダイレクトしたり、`-q` オプションを指定して出力そのものをなくしてしまうと、本当に解凍処理が進んでいるのか分からなくて不安になる。

```bash
!unzip /home/data/large_dataset.zip -d /home/data/ > /dev/null

!unzip -q /home/data/large_dataset.zip -d /home/data/
```

## それ、`pv` コマンドで出来るよ

ググってみると pv コマンドで出来る、とのことだったが、全体のファイル数を指定してちゃんとプログレス・バーが機能するようにしている例が見当たらなかったので、この記事を書いた。

```
n_files = !unzip -l /home/data/large_dataset.zip | grep .png | wc -l
!unzip -o /home/data/large_dataset.zip -d /home/data/ | pv -l -s {n_files[0]} > /dev/null
```

1. まず、`unzip -l` で全体のファイル数を取得する。`unzip -l` が報告する内容にはディレクトリも含まれているので、`grep` でフィルタが必要だ。残念ながら
2. 次に再度 `unzip` コマンドを実行して、今度は実際に解凍処理を実行する。処理したファイル名が出力されるので、これを `pv` コマンドにつなぎ、`-s (size)` オプションでファイル数を指定する

これで、こんな感じのプログレス・バーが表示されるようになる。

```
80.1k 0:00:09 [8.54k/s] [====================================>] 100%
```
CSS グリッドレイアウトについて個人的まとめ（用語まとめ）

自分用にまとめたものです。
主に、MDNなどを読むときの用語まとめになりました。

# Gridレイアウトとは
## Flexとの違い
flexは1次元。基本、1列 or 1行。
それに対して、gridは二次元。縦横に行と列を作ってレイアウトできる。
はるか昔の遺産、tableレイアウトを想像してもらえれば。

# Gridの構成
##Gridコンテナ
後述するグリッドアイテムの直接の親要素。
`display: grid`を設定することで、コンテナとして扱われる。

## GridトラックとGridライン
グリッドトラックは2つのグリッドラインの間の領域の事。
トラックは、`grid-template-columns` `grid-template-rows`とそのショートハンドで定義されます。
ラインは、トラックが定義される事で作成されます。

##Gridアイテム
グリッドコンテナの直接の子要素。
グリッドコンテナに設定するstyleによって、アイテムのレイアウトが決定される。



# 参考
CSS グリッドレイアウト
https://developer.mozilla.org/ja/docs/Web/CSS/CSS_Grid_Layout
jsのreportValidity()を呼ぶとiosのsafariが落ちるバグの解消法

## 結論
validationが画面に表示されているときにもう一度reportValidity()を呼ぶと落ちる。
よって、setTimeoutとかでくくってやればいい。

## 問題のコード

```validate.js
$("#form").find("input, select, textarea").on('blur', function(){didBlurInput()});

function didBlurInput(){
  $("#form").reportValidty();
}
```

blurした時に直でこれを呼ぶとまだ画面上にvalidationを表示する文字が表示されている。
**画面上にvalidationを表示する文字が表示されている状態でもう一度reportValidty()を呼ぶとiOSのsafariだとバグって落ちる**。

## 解決したコード

```validate.js
$("#form").find("input, select, textarea").on('blur', function(){didBlurInput()});

function didBlurInput(){
  setTimeout(function(){
    $("#form").reportValidty();
  }, 100);
}
```

よって次のようにしてやればblurが終わってvalidationの表示が消えてからreportValidty()が呼ばれるのでsafariが落ちなくなった。

## reportValidity()のリファレンス
https://developer.mozilla.org/en-US/docs/Web/API/HTMLFormElement/reportValidity
draw.io で svg アイコンを追加して線や塗りを編集したい (できた)

## 1. SVG の準備

* [Icons - Material Design](https://material.io/tools/icons/?style=baseline) から SVG でダウンロードしてきたものを使用。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201797/dbe01295-9447-fca8-abb4-0176e591c74a.png)

## 2. SVG を編集

* たぶん `baseline-face-24px.svg` のようなファイル名になっているので、テキストエディターで開く。(下記は見やすいように少し整形している。)

```
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
<path d="M9 11.75c-.69 0-1.25.56-1.25 1.25s.56 1.25 1.25 1.25 1.25-.56 1.25-1.25-.56-1.25-1.25-1.25zm6 0c-.69 0-1.25.56-1.25 1.25s.56 1.25 1.25 1.25 1.25-.56 1.25-1.25-.56-1.25-1.25-1.25zM12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8 0-.29.02-.58.05-.86 2.36-1.05 4.23-2.98 5.21-5.37C11.07 8.33 14.05 10 17.42 10c.78 0 1.53-.09 2.25-.26.21.71.33 1.47.33 2.26 0 4.41-3.59 8-8 8z"/>
<path fill="none" d="M0 0h24v24H0z"/>
</svg>
```

* `<path fill="none" d="M0 0h24v24H0z"/>` は、アイコンを囲う枠になっていて、不要なので削除。
* `<style>path {fill: black; stroke: none;}</style>` を追加。
    * 今回は、 `path` を指定しているが、SVG の仕様に則っていれば当然、要素 (path) への class の追加と、その class のスタイルの指定も可。
* 下記コードが編集後。

```
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
<style>
path {
  fill: black;
  stroke: none;
}
</style>
<path d="M9 11.75c-.69 0-1.25.56-1.25 1.25s.56 1.25 1.25 1.25 1.25-.56 1.25-1.25-.56-1.25-1.25-1.25zm6 0c-.69 0-1.25.56-1.25 1.25s.56 1.25 1.25 1.25 1.25-.56 1.25-1.25-.56-1.25-1.25-1.25zM12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8 0-.29.02-.58.05-.86 2.36-1.05 4.23-2.98 5.21-5.37C11.07 8.33 14.05 10 17.42 10c.78 0 1.53-.09 2.25-.26.21.71.33 1.47.33 2.26 0 4.41-3.59 8-8 8z"/>
</svg>
```

## 3. draw.io へ SVG を追加

* おもむろに、SVG ファイルをドラッグアンドドロップ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201797/09014f3c-f922-e3f7-ec56-ac2997699b14.png)

## 4. draw.io で SVG を編集

* ドラッグアンドドロップした SVG が選択されている状態で、 `フォーマット...` をクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201797/b16c7d49-4594-f468-b481-6231a2574aef.png)

* テキストエリア内の末尾に、 `editableCssRules=.*;` を追加する。(下記は追加後のキャプチャ。)
* `適用` ボタンをクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201797/0a0ea13c-8b13-2834-7b60-943066077e06.png)

## 5. draw.io で SVG の設定

* 下記の設定が増えている !
    - [x] 塗りつぶし path
    - [x] 線 path

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201797/e657d0c8-9bf0-98a9-bab1-b2af9600f4ae.png)

以上。ほとんどは、下記サイトに書かれていることの自分用メモ。
参考サイト: [How to change colors in SVG images? : draw.io Helpdesk](https://desk.draw.io/support/solutions/articles/16000079239)
macにairflowをanacoda3でinstall するときにlimits.hがないーと怒られる場合

limits.hがないとおこられたら
```
sudo open /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg
```

https://github.com/openai/mujoco-py/issues/331



stdarg.hがないとおこられたら
```
export CC=/usr/bin/clang
```

http://www.sakito.com/2011/11/mac-os-x-107lion-error-stdargh-no-such.html
【WordPress】管理画面で固定ページが表示されなかった件

先日、作成したはずの固定ページが管理画面に表示されなくなってゾッとしたので記録しておきます。
<img width="784" alt="スクリーンショット 2019-04-14 16.36.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253923/23761fac-0446-7a44-3bcf-2742e8844021.png">
公開済みページがあるのに表示されない...

##問題の状況
- WordPress管理画面の固定ページ一覧に作成したページが出ない。
- 作成した固定ページ自体は404にならずに表示される。
- カスタムフィールドプラグイン（ACF）も中身が表示されていませんでした。


どうやら管理画面だけで問題が起こっているようです。

##対処方法
プラグインを停止してみたり、調べたfunctionを足してみたり色々試しましたが、
`functions.php`のカスタム投稿タイプを設置する**`register_post_type`のスラッグ名が他のものと被っている**ことが原因のようでした。

```functions.php
add_action( 'init', 'create_post_type' );
function create_post_type() {
  register_post_type( 'ここに入るスラッグ（投稿タイプ名）を変更',
    array(
      'labels' => array(
        'name' => __( 'Products' ),
        'singular_name' => __( 'Product' )
      ),
      'public' => true,
      'has_archive' => true,
    )
  );
}
```

プラグインのバージョンによるバグとかもあるようなので、原因はこれだけではないかもしれませんが
同じような問題が起こったら確認してみてください。
今年の言語はRust その１４


# 今年の言語はRust その１４

Rustを学びます


Rustの日本語ドキュメント 2nd Edition
https://doc.rust-jp.rs/book/second-edition/

オリジナル(英語)
https://doc.rust-lang.org/book/



## 7. モジュール 

### 7.3 use


```rust
pub mod a {
    pub mod series {
        pub mod of {
            pub fn nested_modules() {}
        }
    }
}

fn main() {
    a::series::of::nested_modules();
}
```

useを使うことで指定のモジュールをバイナリクレートのルクートスコープにもってこれる

```rust

pub mod a {
    pub mod series {
        pub mod of {
            pub fn nested_modules() {}
        }
    }
}

use a::series::of;

fn main() {
    of::nested_modules();
}

```


関数名を指定することもできる

```rust
pub mod a {
    pub mod series {
        pub mod of {
            pub fn nested_modules() {}
        }
    }
}

use a::series::of::nested_modules;

fn main() {
    nested_modules();
}
```

enumも名前空間がある


```rust
enum TrafficLight{
    Red,
    Yellow,
    Green,
}

use TrafficLight::{Red, Yellow};

fn main() {
    
    let red = Red;
    let yel = Yellow;
    let grn = TrafficLight::Green;
    
}

```

もちろん\*で一括指定もできます

```rust
enum TrafficLight {
    Red,
    Yellow,
    Green,
}

use TrafficLight::*;

fn main() {
    let red = Red;
    let yellow = Yellow;
    let green = Green;
}
```


testしてみる。
testsはsuper::testsモジュールが定義されている。
clientやnetworkモジュールはtestsの親モジュール経由でアクセスできる.
それはsuper::でアクセスできる

```rust
// lib.rs

pub mod client;
pub mod network;

#[cfg(test)]
mod tests{
    
    use super::client;

    #[test]
    fn it_works(){
        client::connect();
    }
}
```


次回！


イエス！