OmniAICreator/Qiita-1.07M huggingface dataset:
子プロセスとシェル変数

# 子プロセスとシェル変数

シェルスクリプトのシェル変数の値に関するメモ。
パイプや括弧を使うと変数の範囲が変わるという話。

## はじめに

本稿で使用するCSVファイルは以下で作成。

```shell-session
$ seq 1 5 > hoge.csv
```

## <とwhile readで読み込む場合

* サンプルコード

```shell:sample1.sh
#!/bin/bash

i=0

while read line
do
  i=$((i + 1))
done < hoge.csv

echo $i
```

* 実行結果

```shell-session
$ ./sample1.sh
5
```

## catとwhile readで読み込む場合

* サンプルコード

```shell:sample2.sh
#!/bin/bash

i=0

cat hoge.csv | while read line
do
  i=$((i + 1))
done

echo $i
```

* 実行結果

```shell-session
$ ./sample2.sh
0
```

パイプを使うと子プロセスになるので、外側のiは0で初期化したまま結果が0となる。
子プロセスは親の値を引き継ぎ、その後はその中でだけ使用される。

## catとwhile read、()で読み込む

* サンプルコード

```shell:sample3.sh
#!/bin/bash

i=0

cat hoge.csv | ( while read line
do
  i=$((i + 1))
done

echo $i
)
```

* 実行結果

```shell-session
$ ./sample3.sh
5
```

()または{}で囲えばその中は同じプロセスとなる。
()と{}の違いは子プロセスにするかどうか。

https://qiita.com/yohm/items/3527d517768402efbcb6

()は子プロセス、{}は現プロセスでまとめる。

```shell:sample4.sh
#!/bin/bash

hoge(){ echo '$$:' $$ ' $BASHPID:' $BASHPID; }
fuga()( echo '$$:' $$ ' $BASHPID:' $BASHPID )

echo '$$:' $$ ' $BASHPID:' $BASHPID
hoge
fuga
```

* 実行結果

```shell-session
$ ./sample4.sh
$$: 17721  $BASHPID: 17721
$$: 17721  $BASHPID: 17721
$$: 17721  $BASHPID: 17722
```
【Python】演算子だけで切り捨て切り上げ

## 切り捨て
```python
# 3を2で切り捨て
[in]  3 // 2
[out] 1
```

## 切り上げ
```python
# 3を2で切り上げ
[in]  -(-3//2)
[out] 2
```
もしくは

```python
[in] (3 + 2 - 1) // 2 #(a + b - 1) // b
[out] 2
```
RailsチュートリアルでテストはGREENなのに本番でエラーが発生した件


Railsチュートリアル10章を終えてHerokuへデプロイし、自分のテストユーザー登録するぞ～とボタンをぽちーしたら、あぼーんして愕然としたので覚書です。
まだまだRailsへの理解度が低くQiitaに投稿するのも恥ずかしい内容ですが、ご意見・ご感想頂けると幸いです。

#■発生したエラー
Ruby on Rails チュートリアル　Rails5.1(第4版)　10章を終え、Herokuへデプロイ。

新規ユーザーを登録するため、以下の情報を入力。
・Name：test
・Email:test@test.com
・Password:testtest
・Password confirmation:testtest
Create my accountボタンを押下すると以下のページが表示された。
<img width="424" alt="errorMessage.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239929/5fe9e1ef-44a4-85ed-85b6-173819716886.png">

実行時のコンソールログは以下のとおり。
<img width="504" alt="ConsoleLog.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239929/cf98d08e-e39f-57d1-dfcb-635bb2766310.png">



#■確認したこと
・AWSに戻ってrails testコマンドを実行
→GREEN

・既存のテストユーザーのSettingsで情報が登録できるか
→登録できた

・routes.rbに以下の文を追加

```ruby:routes.rb
post   '/signup',  to: 'users#create'
```

→テスト：GREEN
　画面上でも登録できました。

#■原因
[リスト7.26](https://railstutorial.jp/chapters/sign_up?version=5.1#code-post_signup_form)で追加したコードを、[リスト8.2](https://railstutorial.jp/chapters/basic_login?version=5.1#code-sessions_resource)で上書きしてしまった。
（何も考えずコピペしてすみませんでした・・・）

#■対処法
ユーザー登録でエラーが発生したので、まずnew.html.erbを確認。
[リスト10.6](https://railstutorial.jp/chapters/updating_and_deleting_users?version=5.1#code-new_user_with_partial)の演習でリファクタリングしたので、ここでの作業に問題があったとあたりをつける。
[リスト7.26](https://railstutorial.jp/chapters/sign_up?version=5.1#code-post_signup_form)の演習が影響しているところから該当の演習に戻ると、routes.rbに変更を加えており、原因となっていたルートが消えていることを確認。
消えていた一文を追加することで解消。

この解消の仕方だと、Railsチュートリアルという台本ありきの解決方法となっていて、実際の現場でこんな解決の方法があるはずがない。

#■この後のアクション
以下２点を調査して記事にしたいです。
・実際のエラーだったとしてどのように解消すればよかったのか。
・なぜテストをGREENで通ってしまったのか。

とりあえず本番Herokuも問題なく動いたのでここまで。
そういえば、TLS 終端している NLB で PrivateLink できるんでしたっけ？

# 概要

(2019-01-28の公式)__「新機能 – Network Load Balancer の TLS 終端」__
https://aws.amazon.com/jp/blogs/news/new-tls-termination-for-network-load-balancers/

もう一年近く前の 2019-01-28 に NLB が TLS を終端できるようになったわけですが、今更ながらこれは PrivateLink もいけるんでしたっけ、、、だめだ、記憶にない。はて。



出来きたかどうか記憶もないし、もにょもにょするので、ちょっとだけ試しておきました。

# 構成
特に何のひねりもないです。
ただ、TLS 終端した NLB を PrivateLink するだけです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323706/ab9311b7-a707-63f1-3137-f42b66010703.png)




# 手順

NLB の TLS 終端については、以下の記事を
https://aws.amazon.com/jp/blogs/news/new-tls-termination-for-network-load-balancers

PrivateLink については、以下のドキュメントを
https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/endpoint-service.html

# 結果
問題なく可能のようですね。

クライアントからのアクセスの結果

```shell
[ec2-user@ip-10-2-11-230 ~]$ curl -vk https://10.2.11.151
* Rebuilt URL to: https://10.2.11.151/
*   Trying 10.2.11.151...
* TCP_NODELAY set
* Connected to 10.2.11.151 (10.2.11.151) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* Cipher selection: ALL:!EXPORT:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@STRENGTH
* successfully set certificate verify locations:
*   CAfile: /etc/pki/tls/certs/ca-bundle.crt
  CApath: none
* TLSv1.2 (OUT), TLS header, Certificate Status (22):
* TLSv1.2 (OUT), TLS handshake, Client hello (1):
* TLSv1.2 (IN), TLS handshake, Server hello (2):
* TLSv1.2 (IN), TLS handshake, Certificate (11):
* TLSv1.2 (IN), TLS handshake, Server key exchange (12):
* TLSv1.2 (IN), TLS handshake, Server finished (14):
* TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
* TLSv1.2 (OUT), TLS change cipher, Change cipher spec (1):
* TLSv1.2 (OUT), TLS handshake, Finished (20):
* TLSv1.2 (IN), TLS change cipher, Change cipher spec (1):
* TLSv1.2 (IN), TLS handshake, Finished (20):
* SSL connection using TLSv1.2 / ECDHE-RSA-AES128-GCM-SHA256
* ALPN, server did not agree to a protocol
* Server certificate:
*  subject: CN=*.xxxxxxxxx
*  start date: Dec 27 00:00:00 2019 GMT
*  expire date: Jan 27 12:00:00 2021 GMT
*  issuer: C=US; O=Amazon; OU=Server CA 1B; CN=Amazon
*  SSL certificate verify ok.
> GET / HTTP/1.1
> Host: 10.2.11.151
> User-Agent: curl/7.61.1
> Accept: */*
>
< HTTP/1.1 200 OK
< Date: Fri, 27 Dec 2019 15:44:14 GMT
< Server: Apache/2.4.41 ()
< Upgrade: h2,h2c
< Connection: Upgrade
< Last-Modified: Fri, 27 Dec 2019 14:06:29 GMT
< ETag: "6-59ab000129b24"
< Accept-Ranges: bytes
< Content-Length: 6
< Content-Type: text/html; charset=UTF-8
<

hoge

```

Webサーバーのログ
PrivateLink経由なので、Source IP が NLB になってます。

```
10.1.11.4 - - [27/Dec/2019:15:44:14 +0000] "GET / HTTP/1.1" 200 6 "-" "curl/7.61.1"
```

以上です
初学者によるプログラミングMemo　#9 Model基礎知識

# はじめに
今回はDBの基礎知識についてもう少しお話しします
内容はいつも通りしょぼいです笑
なお、本記述はMacにおいて、Railsでの開発を前提としています
また、まだまだひよっこですので、不備等ございましたらご指摘いただけると幸いです

# 目次
- ActiveRecordについて
- アソシエーションについて

## ActiveRecordについて
ActiveRecordとは、一言で言うと「RubyとSQLの翻訳機」だそうです
基本的にDBにはDB言語としてSQLが使われています
SQL出ないとDBの操作ができないわけです
RailsにはModelにActiveRecordが適用されているおかげでRubyを用いてDBからデータを探したり、持ってきたりすることができます
どのDBを仕様してもRubyで統一できるのも特徴です
ActiveRecordでは色々なメソッドがあります
主にControllerに記述するメソッドとして

```.rb
#Createに関するメソッド

@tweet = Tweet.new(title: "タイトル", content: "内容")
#モデルのインスタンスを作成

@tweet = Tweet.build(title: "タイトル", content: "内容")
#newと同じ、可読性を上げるため関連モデルのインス端子にする時によく使われる

@tweet.save
#newやbuildで作った@tweetをDBに保存する

Blog.create(title: "タイトル", content: "内容")
#newとsaveを組み合わせて生成と同時にDBへ保存する
```



```.rb
#参照に関するメソッド

@tweet = Tweet.all
#tweetsテーブルから全レコードを配列をして取得

@tweet = Tweet.first
#tweetsテーブルのidが一番小さいレコードを取得

@tweet = Tweet.last
#tweetsテーブルのidが一番大きいレコードを取得

@tweet = Tweet.find()
#引数に入っている数字と同じidのレコードを取得

@tweet = Tweet.find_by(title: "タイトル")
#引数に入っている条件とあっているもので一番若いidのレコードを取得

@tweet = Tweet.where(title: "タイトル")
#引数に入っている条件とあっている全てのレコードを取得

@tweet = Tweet.order(id: :desc)
#引数に入っているカラムを:asc(昇順)または:desc(降順)に並び替えてレコードを取得

@tweet = Tweet.select(:title)
#引数に入っている名前のカラムのみを取得

@tweet = Tweet.limit()
#引数に入っている数字の数だけidの若い順にレコードを取得
```
これだけあります
私自身もよくわかっていないまま使っていました

## アソシエーションについて
アソシエーションとはDBのテーブルとテーブルを紐づけること
それによって、関連するデータの読み書きを容易にするための機能
Modelに以下のように記載することで関連づけられる

```tweet.rb
class Tweet < ApplicationRecord
  has_many :comments
  belongs_to :user
end
```

"has_many"と"belongs_to"はモデルクラスに記載するメソッドです
今、"Users","Tweets","Comments"テーブルがあるとします
一人のユーザーはたくさんのツイートができて、各ツイートにはたくさんのコメントができるとします
また、逆から考えると、一つのコメントは必ずどこか一つのツイートに属し、一つのツイートも必ずどこかのユーザー一人に属しています
そしてユーザーはコメントをたくさんすることができ、一つのコメントはどこかのユーザー一人に属しています

このような場合、以下のような関係が成り立ちます

"Users" : "Tweets" = 1:多
"Tweets" : "Comments" = 1:多
"Users" : "Comments" = 1:多

この関係の場合、各モデルには以下のように記載します

```user.rb
class User < ApplicationRecord
  has_many : tweets
  has_many : comments
end
```

```tweet.rb
class Tweet < ApplicationRecord
  has_many : comments
  belongs_to : user
end
```

```comment.rb
class Tweet < ApplicationRecord
  belongs_to : tweet
  belongs_to : user
end
```
"has_many"のあとは必ず複数形、"belongs_to"のあとは必ず単数形で記述します


## まとめ

- ActiveRecordはRubyとSQLの翻訳機
- いろんなメソッドが使える
- アソシエーションはDBのテーブルとテーブルを紐づけること
- "has_many"のあとは必ず複数形、"belongs_to"のあとは必ず単数形で記述


##### 参考記事
https://railsguides.jp/active_record_basics.html
ブラックジャックしてみると遊びに行って負ける人が多いのに納得

# TL;DR
ブラックジャックのゲームをシミュレーションするWebAPPをつくりました: 
https://imam-blackjack-simulator.web.app/

で、思ったことをまとめます。

# 前提
### ブラックジャックのルール
- プレイヤーとディーラーがそれぞれ複数枚カードを引いて、21を超えない範囲でカードの値の合計が21に近いほうが勝ちです
- 21を超えると負けです
- 絵札は全部10点扱い、エースは1 or 11の都合の良いほうに数えます
- 詳しいルールはgoogle大先生に聞いてください

### APPの開発と概要
- アプリケーションの開発自体について: [こちらの記事](https://qiita.com/AtsukiImamura/items/390bae23d6b44bfb8024) を参照
- github: https://github.com/AtsukiImamura/blackjack-simulator

![demo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284794/be92db4a-1064-35df-cfb2-ff81deda5606.png)


# 思ったこと
### 割と分散は大きい
デフォルトではコイン2枚を基本ユニットにしていますが、これがコイン1枚1000円とかだとちょくちょく10万円儲かったり失ったりします。
大体の時間帯は勝ったり負けたりですが、突然負けだして泥沼にはまったり突然勝ちだしてバラ色の世界になったりと、結構現実世界をよくシミュレートできてるなぁと我ながら思います。

この結果を見る限り、単位ベット額の100倍は持って行かないと。。。というのはあながち間違っていない気がします（もちろん、どういうマネーシステムを使うかによりますが）

=> 2,3万持って行って「負けたー」とか言ってるのは「そりゃそうやろ」としか言いようがないです

### 一寸先は闇
トランプがランダムなので当たり前ですが、グラフの動きはコイン投げと一緒です。
つまり、 `おっしゃ、調子ええわ～！` みたいなのはマボロシです。

（とは言え、実際には当たっているときや何をしても負ける時間帯があるのは事実で。。。 ホットポットって本当にあるんでしょうか）

![bj-grash.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284794/c7058cfe-f355-1a9c-fa38-4ca8d696e66a.png)


### 期待値-1%というのは正しい
数学がそう言っているのでそりゃそうですが、シミュレーションすると結構勝ち負けを行ったり来たりします。なんとなく水面下にいる時間が長い気もしますが、-1%程度だと分かりませんね。。。


### このシミュレーションを見てからカジノへ行くと、落ち着いたプレーができる
- 勝っているとき:  `いつまでも好調なわけがないから、この辺でやめとけ` と自制心が効きます
- 負けているとき: `統計とシミュレーションの結果を信じて、-1%までは持っていけるはずや` と思えます

カジノ側からすれば、冷静にプレーするヤツ、勝ち逃げするヤツが `２大うっとおしぃ客` なので（自分のことですね、すいません）です。
「ここで勝てば、勝てば、勝てば...... うぉぉぉぉ！」 --> 地下労働 みたいにならないためには冷徹にBS通りにプレーするのが鉄則と思います。


実際、自分自身は20~30単位くらい負けていても信じてやり続けた結果取り戻せています（BS万歳）


# まとめ
- 日本にカジノできるのが楽しみです（小学生並みのまとめ）
ブラックジャックシミュレータを作ってみた

# TL;DR
ブラックジャックのシミュレータを作りました
https://imam-blackjack-simulator.web.app/

![demo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284794/a9b5d10b-b316-b80e-e37c-5eb1e23b69b9.png)

[github](https://github.com/AtsukiImamura/blackjack-simulator) でソース公開してます


温かい目で見ていただければ。。。


# 前提
### ブラックジャックのルール
- プレイヤーとディーラーがそれぞれ複数枚カードを引いて、21を超えない範囲でカードの値の合計が21に近いほうが勝ちです
- 21を超えると負けです
- 絵札は全部10点扱い、エースは1 or 11の都合の良いほうに数えます
- 詳しいルールはgoogle大先生に聞いてください（自分は [ここ](https://xn--jp-kh4aa8bwdc2mye8b.com/basic/bj173.html) のサイトを見てます）

# 動機
- ブラックジャックおもろい
- が、負けるのはいや（まー当たり前）
- ブラックジャックは期待値-1%なので、基本的には `負ける=資金ショート`

==> ということはいかに資金をショートさせないかがクリティカル

しかし、資金の増減がどれくらいのもんなのかよく分からんのでシミュレーションしたいなーと思いました


# 本題
## やりたいこと（やること）
1. 現実に忠実なシミュレータを作りたい
    - ルールの違いをユーザーが設定できるように
    - テーブルの違い（カード配給方式など）も反映したい
2. カウンティングの効果も見える化したい
3. マネーシステムも組み込みたい


## モデル化
基本的には現実の世界を模してモデルを作ります。 DDDの考え方を応用します。

大枠だけモデル図をば。

![bj-model.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284794/14ef0216-b72c-f861-2412-b8a398edf1f6.png)



#### コンポーネント

 - カード: トランプカード。本来スートは関係ないが、一応持つ。
 - カードセット: 現実にはない概念。プレイヤーのベット一つに対して作られるカードのまとまりのこと（スプリットすると増える）。
 - カードディスペンサ: シュー方式・カタツムリ方式などを再現するために共通のインターフェースを持たせる
　

#### 人
人は必ずカードを保持して勝ち負けを判断する主体なので、基本的には同じ。

 - 人: 抽象クラス。カードセットを保持して勝ち負けをどうのこうのする主体
 - プレイヤー: アクションを判断したりカードセットを複数持ったりできる
 - ディーラー: 基本的にカードを持っているだけ

#### テーブル
コントローラの扱い。プレイヤーにアクションを尋ねてそれに応じてカードを引き、与えて。。。という動作をします。
本来はディーラーの仕事ですが、ディーラーとプレーヤーを並列に扱いたいのでディーラーもテーブルの指図に従うようにします。
現実もディーラーはハウスの決めたことしかしないので特に違和感はないですね。

#### サマリー
ゲームの結果を保持しておかないといけないので、つくります。

 - ゲーム: 進行中のゲームを管理して、サマリー全体の面倒を見ます
 - ターン: 1回のゲームを管理します
 - アクション: プレイヤーの1回のアクションを記録します

#### ルール
管理すべきルールのグループごとにクラスを作成して管理します

 - スプリットルール
 - ダブルルール
 - 配当ルール

#### ポリシー
プレイヤーのスタイルを表現

 - マネーシステム
 - カウンティング


## ゲーム開始まで

#### テーブルの作成
- 初期化する

#### ルール・ポリシーを作成
- テーブルコンテキストとして与えます

#### プレイヤーの追加
- テーブルコンテキストからプレイヤー独自のポリシー部分を追加して初期化 -> テーブルに追加

## 1ゲームの流れ
#### カード配給
- プレイヤーとディーラーに2枚ずつカードを配給する
- ディーラーは最初に1枚しかとらない方式もありますが、そこは割愛

#### プレイヤーごとのターン
以下をずっと繰り返します

 - 1. プレイヤーにアクションを尋ねる（プレイヤーは自身のカードとディーラーのカードをもとにBSで判断する）
 - 2. アクションがカードを必要とするものであればカードを引いてプレイヤーに与える
 - 3. アクションが `None` であればそのプレイヤーのターンを終了する

#### 決算
 - ディーラーの合計点を計算してプレイヤーに渡し、勝ち負けとそれに伴うチップの増減を計算させる。（現実はディーラーが行いますが、情報をプレイヤーに持たせているので仕方がない）
 - サマリーを記録する


## アプリケーションについて
- vue.js + typescriptで実装してます
- 計算はすべてクライアントで（特に保存すべきデータもないので）
- デザインはフレームワークは入れてないですが、マテリアルデザインを意識してます
- グラフ描画はchart.js（これだけでキレイに見える説）
- トランプ画像は [こちらのサイト](https://chicodeza.com/freeitems/torannpu-illust.html) から頂きました

## TODOとか言い訳とか
- これだけ大そうに書いておきながら、個別のルールとか実装できてないです（増殖させるだけの作業ゲーにやる気が湧かない件）
- ソース汚い: そのうちリファクタします（するする詐欺かもしれない）
- できることをもう少し増やせればいいですね

## 感想
- モデル全体としては小規模ですが、それなりに良いモデルが作れたのではないかと思います（まぁ、これくらいだと誰がやってもあまり変わらないまでありますが......）
- シミュレータ動かすの楽しいけどいくらやっても勝率には関係なし（汗）


動かしてみて思ったことを [こちらの記事](https://qiita.com/AtsukiImamura/items/eb0e4756960477d7093b) にまとめてます
Docker on WSL2 備忘録

# WSL2でDockerを勉強している時に、躓いたとこ

## はじめに
Dockerを勉強しようと思い、Windows 10 Homeで環境を作る方法を探していると、WSL2を利用する方法が見つかったので試してみた。

## Build Versionが18917以上にならない件
Windows Insider Programに入って、Windows Updateをしても、直ぐにはWSL2をインストールできなかった。  
徐々にアップデートコンテンツが配布されていくらしく、自分の場合、Build Versionが18917以降になるのに数回のUpdateが必要で、数日かかった。

## WSLコマンドについて
Windows Power Shellまたはコマンドプロンプトでwslコマンドを使うと、コマンドを実行したディレクトリの場所を引き継いで、登録しているUbuntu VM内に入ることができる。

```shell
> wsl
$ # wslコマンドを実行したディレクトリ情報を引き継いでVM内に入れる
```




## Docker-composeコマンド使えない件
これはWSLとは関係なく、Dockerの勉強で躓いた点だが、dockerを起動していなかったため、docker-composeコマンドが使えなかった。(当たり前だが気づかなかった…)
以下のコマンドでdockerを起動するとできた。

```shell
> sudo service docker start
```
IEでCookie無効設定が localhostだと効かなかった話

普段大学付近の企業でアルバイトをしていまして、アルバイト中にハマった点について、Qiitaにはまだ共有されていないなと思ったので記事にします。

## 背景
業務で IE (Internet Explorer) にサービスを対応する必要があり、機能のテストをIEで行っていました。
また、先日Cookieが無効にされている際にその旨をユーザーに表示し、Cookieを有効にしてもらう機能を実装することになりました。
ちゃんと実装できているのか確認するため、各種ブラウザでCookieの設定を無効にし、動作確認を行おうとしていていました。

## 起こった問題
ChromeやEdgeではCookieの設定が無効にできるのに IEでは無効にできない・・・😢

IEでのCookie無効手順を踏んで検証しようとしていたはずなのにおかしい。。。
（Chromeで動いてIEで動かないなんて毎回のことだったのでそちらの確認も行いました。）

## 解決方法
調べていた際にこんな掲示板を発見しました。[クッキーに受け入れ判別について](https://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=34130&forum=12)
この掲示板にはこんな内容が書かれていました。
> 確か、IEでは、localhostアドレスに対するアクセスに対しては
設定を変えてもクッキーの受け入れを禁止できなかった覚えがあります。
代わりにループバックアドレス（127.0.0.1）を指定すると、
なぜかクッキーの受け入れをブロックできるようになります。
意味不明…

これだ！と思い、もともと `http://localhost:8080/hoge` と指定していたのを
`http://127.0.0.1:8080/hoge` としてみると Cookie を無効にする設定が効き、
動作検証が完了しました☺️

## まとめ
まず、古い記事・掲示板だからといって無視したりしない方がいいなと感じました。
また、IEに対応するというのは今後どんどん無くなっていくことだとは思いますが、同じような現象に陥ったときにこの記事によって解決されることを祈っています。
【備忘録】Azure ADのゲストユーザーに対してアクセス元制限を構成する

Azure ADのゲストユーザー招待って便利。SharePointやTeamsでゲストユーザーを招待するケースはやっぱり便利。先方がOffice365を使ってる場合だとアクセス制限かけてたりアカウント管理をしっかりしているはずなので、ある程度信頼して招待できる。

ただ、やっぱり先方がOffice365使ってなくてMicrosoftアカウントで招待しているケースでは、そもそもアクセス制限かかってない。Office365使ってるといってもアクセス制限かけてないんじゃないか・・というケースがあったりする。先方に強化してよ、とも言えないし、自社で守るしかない。

じゃぁ、どうややって制御するの、ということで条件付きアクセス。ゲストユーザーにも適用できるのでIPアドレスでアクセス元を制御するというシナリオでまとめてみる。

流れはこんなかんじ

・ライセンス
・ネームドロケーションの登録
・条件付きアクセスの構成

#ライセンス

構成するにも、ライセンスは必要。とはいってもゲストユーザーのために新たに調達する必要はなく、Azure AD P1ライセンスが社内ユーザー向けにあればいい。[Azure AD BtoBで、ゲストユーザーがサインイン履歴が残らない場合の対応](https://qiita.com/hisssa0102/items/d7adbc384ba38d260aaf)でもかいたけど、テナント内で保有しているAzure AD P1あるいはP2の数の、5倍までのゲストにも適用できる。ライセンスを200持ってたら、ゲストユーザー1000まで可。

Intune使ってるならEMS E3を持っているだろうし、M365E3持ってる組織なら包含してる。

#ネームドロケーションの登録
あとで使う条件付きアクセスでは、IPアドレスはあらかじめ「ネームドロケーション」に登録しておく必要がある。
Azure Active　Directory→条件付きアクセス→ネームドロケーションから登録する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237698/2317fc0b-3dd5-cf38-3189-89003754e8fd.png)

「信頼できる場所としてマークする」はオフにする(自社じゃないからね）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237698/26d55e42-8ee7-dc26-8645-2852b0b195dd.png)

#条件付きアクセスの構成
「先ほど登録したIP以外は、ブロックする」ことでアクセス元を制限する。

条件付きアクセスで新規にポリシーを作成し、対象のゲストユーザーを割り当てる。

ポリシーの「条件」→「場所」にて、対象外として先ほど作成した場所を設定する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237698/f9ae3a40-d418-8139-e1c9-f2c0b8fdaeed.png)

「許可」にてブロックを設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237698/ab28c773-baee-9c7d-5986-527ba2968a51.png)

アプリに、対象のアプリを設定して、終了。

#補足
設定したアプリのみ、この条件付きアクセスが適用される。

注意しないといけないのは、アプリAは使わせたいけど、アプリBはダメ、というようなケースではアプリA用のルールは作成しつつ、アプリA以外用のルールで「全部ブロック」しておく必要がある。ネームドロケーションではIPは必須入力なので、自社IPいれとくとか、イントラ内のIPを設定するなどして回避。

SaaSのSSOをAzureADに寄せている場合、ゲストユーザーはOffice365だけ出ない場合も出てくる。

また、社内アカウントだけど外部の方に使わせるシナリオだと、社内IP以外からのアクセスになってしまう。AzureADPライセンスの割り当ては必要だけど、同じ方法が使えるので、ステージドロールアウトと組み合わせればより安全な認証制御を行るんじゃないだろうか。
rails 機能造り

久々にrailsについて投稿しようと思います。

前提としてアプリを作るにあたり、基本的な機能を作るにはどうしたら良いか
目次を作ろうと思います。

今後暇を見て格機能について書いて以降と思います。

# ユーザー管理
まず基本となる、ユーザー周りの設定

1.deviseのインストール
2.Userモデルを作成する
3.deviseのビューファイルの追加
4.サインアップ機能の追加
5.ユーザー情報編集機能の追加
6.ログアウト機能の追加
7.フラッシュメッセージの表示機能の実装

# グループ機能
次にグループ機能の実装

1.コントローラ、モデルを作成する
2.ルーティングを設定する
3.該当するアクションをコントローラに定義する
4.素材をダウンロードする
5.アクセス先のビューを作成する
6.グループ作成機能を実装する
7.ルーティングを変更し、作成したグループをgroups#indexのサイドバーに表示する
8.グループ編集機能を実装する

# メッセージ送信機能

1.モデルを作成する
2.ルーティングを設定する
3.該当するアクションをコントローラに定義する
4.メッセージ送信機能を実装する
5.グループにメッセージを表示する
6.サイドバーに最新のメッセージを表示する
7.ヘッダーを修正する
8.グループ編集ページへのリンクを設置する
9.グループ編集後のリダイレクト先を変更する
開発未経験でも2週間でRuby技術者認定試験Silverに合格できました

はじめまして。
2019年最後の平日である今日、Ruby技術者認定試験Silverに合格しました。
 #今日 = Time.new(2019,12,27,10,45,00,"+09:00")

完全未経験から2週間で取得した方法について、同じく未経験の方々にご参考としていただけるかもしれないと思ったので、記録として投稿させていただきます。

#自分のスペック
・学歴：非理系学部卒（理数科目弱め）
・職歴：新卒3年目
・プログラミング学習経験：会社のJava研修を一瞬受講
・開発経験：皆無

(⁎˃ᴗ˂⁎)

#経緯
勉強を始めたのはちょうど2週間前の今日です。
全く開発経験がなく、コードを書くどころか読むことすらできないのですが、いろいろあって一念発起し勉強を始めました。

Rubyを選んだのは広く使われている、ソースが豊富、初心者に優しいみたいな噂があったからです。
何事も形から入りたい私は、とりあえず資格を取ることを目標にしました。
できれば年内に受けたいと思い、最終予約可能日の今日、すなわち2週間後に界隈でポピュラー(?)なRuby Silver試験を予約しました。

ちなみに申し込みは諸々めんどいです。。。
Wordファイルをメールで送るってどうなん、Rubyアソシエーションさん...　|ω･`)

#勉強方法
###ステップ1.  Progate （1〜2日目）
Progateに課金し、Rubyコースを1周しました。
「はえ〜なんかJavaと比べてシンプルやな〜」程度で終わり。

###ステップ2. AtCoder Problems(3〜14日目)
Progateでなんとなく雰囲気は分かりますが、頭であまり考えないため内容が定着しません。
そこで、インプットした知識をアウトプットするサービスを探しました。
ネットで「[AtCoder Problems](https://kenkoooo.com/atcoder/#/table/)」なるものを見つけ、以後毎日それをやりました。

サイクルとしては、考える → 調べながら書いてみる → 動作確認し回答 → 他の方の回答を参照する → 知らないメソッドがあれば調べるといった感じです。
B問題を30問ほど解きましたが、それくらいやるとそこそこメソッドの使い方が分かってくると思います。

###ステップ3. 問題集（6日目〜14日目）
AtCoderと並行して後述の問題集を解きました。
最初はまったく分かりません。。。
いいんでしょうか...?
イイんです！(❐_❐✧)

繰り返し解いて、本番までに以下を始めとする頻出の分野は確実に取れるようにしておきます
・変数の命名ルール
・エイリアスメソッド
・範囲オブジェクト
・正規表現
・ハッシュ

問題と解説は読むだけでなく、実際に動かしてみることをお勧めします。
環境を構築せずとも[ブラウザで動かせるサービス](https://paiza.io/projects/2DYPbMJexZk9iTZMjfXXjw?language=ruby)もあるので、是非やってみてください。

#問題集と参考書
[[改訂2版]Ruby技術者認定試験合格教本(Silver/Gold対応) Ruby公式資格教科書](https://amzn.to/2SsAm9U)

公式の参考書です。
巻末には公式だけあって本番に近い問題が載っています。
教科書部分はあまり読んでいませんが、Silver演習問題はほぼ全て正解できるまでやりました。
卍4000円卍

[Ruby技術者認定試験 公式ガイド (ITpro BOOKs)](https://amzn.to/2EY6hqW)

旧版の教科書です。
こちらも本番にかなり近いです。
バージョンv1.8に対応しているので動作確認は必須であるものの、中古は安いですし買って損しません。
巻末問題を2周解きました。

[プロを目指す人のためのRuby入門 言語仕様からテスト駆動開発・デバッグ技法まで](https://amzn.to/2EYC0YY)

「チェリー本」として有名な本です。
ド素人が読破するのはかなり骨が折れるので、まずは辞書的な使い方をお勧めします。
AtCoderや問題集で、自分の知らないメソッドなどを見かけたら、こちらで都度調べてみると良いでしょう。
それらの用法に加え、ベストプラクティスなんかも書いてあり参考になります。

[模擬問題集](https://gist.github.com/sean2121/945035ef2341f0c39bf40762cd8531e0)

Rubyアソシエーションが提供していた模擬問題がGitHub上に公開されています。
こちらは最後の模擬問題として解くことをお勧めします。
私は前日に解き、76点でした（合格は75点）
当落線上すぎる（笑）

#受験本番
腹痛で遅刻しかけたりロッカーが壊れたりトラブルがあったのですが、いよいよ試験本番です。

難易度は問題集とほぼ同じで、公式教科書の問題も何問かそのまま出題されました。
時間は余るので見直しは確実にしましょう。

思いの外ファイルの問題も出題され、その辺手薄だったので焦りつつ、50問をなんとか回答。
自信あり：35問
自信なし：13問
適当に選んだ：2問

試験終了し、結果は...

**82点で合格でした！！**

75点のラインを考えると余裕はないですが、まあRuby歴2週間なので上出来でしょう^^
#感想
勉強時間としては平均3時間を毎日続けていたので、だいたい40時間ほどでしょうか。

未経験でも短期で合格できましたし、難しい資格ではないです。
しかし、意外と細かい問題が出題され、ボーダーも75点と高いので、基礎をしっかり理解しておく必要はあります。

初心者がRubyを学ぶきっかけとしてはちょうどいいものだと思うので、興味がある方は受けてみても損はないと思います。

次はRailsの勉強を始めようかしら。
[質問]Colaboratory上でのfastText活用時に起こるエラーについて

http://tech.wonderpla.net/entry/2017/10/10/110000
 
 上記の記事を参考にし、fastTextによるテキストのカテゴリ分類を試みているのですが、モデル作成の部分でこのようなエラーが出てしまいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547779/2f4f36e6-b025-2757-0558-b0571a734119.png)

　コードは参考先をほぼ丸写しで、MeCabのインストール部分を変えたくらいです。「model.txt」作成の部分までは順調に進めます。
　お恥ずかしながら、自分なりにいじってみても全くうまくいかず、どこをどう直せばよいのかわかりません。どなたか詳しい方、教えていただけないでしょうか？
ETロボコン プライマリークラスで青色マーカー検出をやってみた

[ETロボコン](https://www.etrobo.jp/)では、ライントレース走行を行います。
ラインは通常黒色ですが、途中に目印としてマーカーと呼ばれるラインの色を変えたエリアが存在します。

マーカーは2018年までは灰色が使用されてきましたが、2019年は青色に変更されました。

倒立サンプルプログラムは[`ev3_color_sensor_get_reflect()`](https://www.toppers.jp/ev3pf/EV3RT_C_API_Reference/group__ev3sensor.html#ga6f0760f8a0781fd5397f3365c6d6ac87)を使用していますが、
この反射光モードでは、カラーセンサーをラインの中央に静止させた状態でようやく黒色と青色の違いが分かる程度の差しかありません。

マーカー検出のために色を見てみたいので、ここは素直に[`ev3_color_sensor_get_rgb_raw()`](https://www.toppers.jp/ev3pf/EV3RT_C_API_Reference/group__ev3sensor.html#gad86c95ba26932e80b8a58dc95aaee39d)を使うことにします。

サンプルコースを使用してコースの計測値を確認してみます。
<img alt="raw.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123504/452f0807-0268-228a-4bc2-3259e2427f2f.png">

RGB各々で値の範囲が異なりますので、黒色～白色が-50～50の値になるように正規化を行って、各色のレンジを揃えて変化を確認してみます。
<img alt="normal.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123504/1195e941-8828-569a-e90f-c941cb8a18cc.png">

コースから取得したRGB三色の変化から次の方法で制御を行うことにしました。

- R赤でライントレース
- B青でマーカー検出
- G緑は使わない

R赤はライントレースで使用する黒色と青色で近い値が出るため、マーカーでコースアウトしない安定したライントレースが期待できます。
B青は青色マーカーをライントレースしている時に値の変化をしっかり認識できそうです。

# 動かしてみた
会場都合で動画が残ってないですが、ガレージインを青色マーカー検出で行った制御ログになります。
R赤でライントレースを行っているため、赤いラインが左軸の0付近にあります。
B青がマーカー部分で大きく変化していることが確認できます。
G緑は使用していません。
黄色いラインが右軸の相対距離で、マーカーの長さ150mm区間を検出できていることが確認できます。
![190713_142753_Rガレージ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123504/b11edf79-730e-a7ff-aeaf-1e918136cce2.png)

#最後に
RGB Raw値を使うということになると、アドバンストクラスのチームがやっているようなカラーブロックを判別する処理を実装しないといけないのか？と思われる方もいらっしゃると思いますが、プライマリークラスでやりたいことはライントレースと青色マーカー検出だけ（2019年競技規約）ですので、そんなに手間を掛けなくてもできるよということで参考にしてみてください。

このやり方が正解だというわけではありませんがCSモデルを見た中では、ID:260 平成デロリアンさんが同様のことを行っているようですので、ETロボコン2019参加者の方はモデルをチェックしてみてください。
Netlify Functions を使って Qiita のトレンド API を非公式で作ってみた

**2022.02.12追記: 諸事情あり Netlify Functions から Vercel Serverless Functions に移行しました。**
今後は h ttps://qiita-api.netlify.app ではなく **https://qiita-api.vercel.app** にアクセスしてください（念のため前のリンクからリダイレクトを飛ばすようにはしていますが...）。


**Zenn 版は[こちら](https://zenn.dev/hellorusk/articles/db83908e15b6f1)**

---

Qiita の API にはトレンド記事一覧を取得する API が無いので、作ったみたという話です。
早速試してみたい方は

~~h ttps://qiita-api.netlify.app/.netlify/functions/trend~~ 
https://qiita-api.vercel.app/api/trend

または

~~h ttps://qiita-api.netlify.app/trend.json~~
https://qiita-api.vercel.app/trend.json

を確認してみてください。
（万一上手く取得できていない場合はコメント欄かリポジトリの [Issue](https://github.com/7ma7X/qiita-trend-api/issues) にてお知らせください。）

## 背景

[QiitaAPIにトレンドが見当たらないので泣いてたら](https://qiita.com/mokoaki/items/1b5cc9ccc502082faf3d) という記事に経緯がありますが、かつてはトレンド記事一覧は https://qiita.com/trend.json を GET することで得られたものの、2019年12月現在は公式には API が提供されていません。
ただ、トップ画面の div タグに埋め込まれる形で JSON （の文字列）があり、これをスクレイピングすることで記事一覧を得ることができます。
　
わざわざスクレイピングするのは面倒だという気持ちになったので、直接 JSON を返せるような URL を自前で立てることにしました。

## Netlify Functions

Netlify 上で AWS Lambda を使えるというものです。
無料だと **Requests が 125,000/月, Runtime が 100 hours/月** （2019年12月現在）まで使えるので、趣味プロダクトなら全然余裕の範囲ですね。

## どう使っているか

以下のような関数を書いています。Qiita の URL を `axios` で GET して、`cheerio` でパースしているだけなので、非常に単純ですね。

```ts:src/lambda/trend.ts
import axios from 'axios'
import cheerio from 'cheerio'

const fetchTrend = (html: string) => {
  const $ = cheerio.load(html)
  const raw = $('script[data-component-name=HomeIndexPage]').html() ?? ''
  if (raw === undefined) return {}
  const rawData = JSON.parse(raw).trend.trend.edges

  return rawData.map(obj => {
    // 不要なプロパティを削除
    delete obj.followingLikers
    delete obj.isLikedByViewer

    delete obj.node.isLikedByViewer
    delete obj.node.isStockableByViewer
    delete obj.node.isStockedByViewer
    delete obj.node.followingLikers
    delete obj.node.recentlyFollowingLikers

    return obj
  })
}

export const handler = async () => {
  const url = 'https://qiita.com/'

  return await axios
    .get(url)
    .then(({ data }) => {
      return {
        statusCode: 200,
        headers: {
          'Access-Control-Allow-Origin': '*',
          'Content-Type': 'application/json; charset=utf-8'
        },
        body: JSON.stringify(fetchTrend(data)),
      }
    })
    .catch(err => {
      return {
        statusCode: 500,
        body: err,
      }
    })
}
```

Lambda 本体の実装の他は、基本的には `netlify.toml` と `.babelrc` をいじるだけです。詳しくは

<a href="https://github.com/HelloRusk/qiita-trend-api"><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233069/893330c9-9a05-25ff-4c35-91f4fa9235d2.png" width="460px"></a> 
をご確認ください。




## 参考になるリンク

- [netlify / functions](https://github.com/netlify/functions)
    - Netlify 公式のサンプル
- [【入門】Netlify Functionsコトハジメ - Qiita](https://qiita.com/Sr_Bangs/items/7867853f5e71bd4ada56)
    - 入門記事
- [Netlify Functions + TypeScriptのボイラープレートを作った](https://mottox2.com/posts/251)
    - ボイラープレート
- [havveFn / atcoder-charts](https://github.com/havveFn/atcoder-charts)
    - 私はこれで初めて Netlify Functions の存在を知りました。
Rails form_forとform_tag

自分用のメモ、書き途中

# 「form」系のヘルパーメソット
Railsでフォームタグを簡単に作成できるもの
種類：「form_for」「form_tag」「form_with」


# 「form_for」と「form_tag」の違い
「form_for」→モデルに基づくform（投稿フォームなどに使用される）
「form_tag」→モデルに基づかないform（検索フォームなどに使用される）

#「form_for」書き方

```
<%= form_for モデル do |f| %>
　　フォームの中身
　<%= form.submit %>
<% end %>
```
引数のインスタンスに何も情報がない時はcreateアクションに、情報がある時はupdateアクションに自動に振り分けてくれる。

#「form_tag」書き方



# よく使用するフォーム

|フォーム|   　　説明 　　　　 |
|:-----------|------------:|
|text_field|一行用フォーム　　|
|text_area|長文用フォーム　　|
|email_field|メールアドレスフォーム|
|number_field|数字入力フォーム　|
|select|セレクトボックス　|
|check_box|チェックボックス　|
|file_field|ファイル添付用フォーム|
|password_field|パスワード入力フォーム|

# 「form_with」について
rails5から「form_with」が使えるようになった
保存する内容がなくても「form_for」と同じようなコードを書くことができる
年末まで毎日webサイトを作り続ける大学生 〜70日目 オブジェクト指向と文字入力〜

##はじめに
こんにちは！@70days_jsです。
文字入力したら画面に表示して右にたどり着くと停止する物を作りました。↓（gif)
![test3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/516248/22722c1e-2f81-93fc-6f92-e62f25974d6d.gif)
今日は70日目。(2019/12/27)
よろしくお願いします。

##サイトURL
https://sin2cos21.github.io/day70.html

##やったこと
文字入力したら画面に表示して右にたどり着くと停止する物を作りました。

html↓

```html
  <body>
    <canvas id="canvas"></canvas>
  </body>
```

css↓

```css
body {
  margin: 0;
  background-color: black;
}
```

JavaScript↓

```javascript
let canvas = document.getElementById("canvas"),
  ctx = canvas.getContext("2d"),
  twidth = (canvas.width = window.innerWidth),
  theight = (canvas.height = window.innerHeight),
  chars = [],
  x,
  y;

function Character(ctx, e) {
  this.size = Math.random() * 100 + 10;
  this.ctx = ctx;
  this.x = twidth / 2;
  this.y = theight / 2;
  this.v = Math.ceil(Math.random() * 10);
  this.v2 = Math.ceil(Math.random() * 10);
  this.char = String.fromCharCode(e.keyCode);
  this.direction = Math.ceil(Math.random() * 2);
  this.mode = true;
}

Character.prototype.render = function() {
  this.draw();
  this.syukaku(x, y);
  this.potision();
};

Character.prototype.potision = function() {
  if (this.direction === 1 && this.mode === true) {
    this.x += this.v;
    this.y += this.v2;
  } else if (this.mode === true) {
    this.x -= this.v;
    this.y -= this.v2;
  }
  if (this.x < 0 + this.size) this.v *= -1;
  if (this.x > twidth - this.size) this.v *= -1;
  if (this.y < 0 + this.size) this.v2 *= -1;
  if (this.y > theight - this.size) this.v2 *= -1;
};
Character.prototype.syukaku = function(x, y) {
  if (this.x > twidth - this.size) {
    this.mode = false;
  }
};
Character.prototype.draw = function() {
  let ctx = this.ctx;
  ctx.beginPath();
  ctx.fillStyle = "rgba(20,136,131,1)";
  ctx.font = this.size + "px Arial";
  ctx.fill();
  ctx.fillText(this.char, this.x, this.y);
  ctx.closePath();
};

document.addEventListener("keydown", logKey, false);

function logKey(e) {
  if (e.keyCode < 65 || e.keyCode > 91) {
    return false;
  } else {
    let char = new Character(ctx, e);
    chars.push(char);
  }
}

document.body.addEventListener("mousemove", returnMousePosition);
function returnMousePosition(e) {
  x = e.pageX;
  y = e.pageY;
}

function render() {
  fontSize = Math.random() * 100;
  ctx.clearRect(0, 0, twidth, theight);
  ctx.beginPath();
  ctx.arc(x, y, 20, 0, Math.PI * 2);
  ctx.fillStyle = "rgba(20, 136, 131, 1)";
  ctx.fill();
  ctx.closePath();
  for (var i = 0; chars.length > i; i++) {
    let char = chars[i];
    char.render();
  }

  requestAnimationFrame(render);
}

render();
```

mousemoveのイベントはマウスの位置を表示しただけです。緑の円形のがマウスの位置です。

オブジェクトに this.modeというプロパティを持たせて、その値がtrueなら動き続ける、falseなら停止するようにしています。

停止は以下の行で行なっています。↓

>  if (this.x > twidth - this.size) {
    this.mode = false;
  }


##感想
オセロまだ全然できてない。急がねば。

最後まで読んでいただきありがとうございます。明日も投稿しますのでよろしくお願いします。
JavaScriptでHello Worldってポップアップを出してみた


#前回のあらすじ
かんたんなWEBページ作成を通してHtml、CSSの学習をしたぞ！
#今日やったこと
・初心者向け記事を見ながら、HTMLファイルに直接、scriptタグを使ってalertメソッドを書き込んだぞ
（参考URLhttps://www.sejuku.net/blog/107067)
#感想
とりあえず文字化けせずHello Worldが出せてよかった。
・エディタの文字コード設定で「UTF-8」を指定する
・Htmlひな型のHead部分に<meta charset="UTF-8">と忘れずに書き込む
上記の２つに気をつけることで、文字化けを防げるなって思った。
#次回の目標
PHPでアンケートシステムを作る作業を進めるぞ！
ubuntuでusb接続のGPSを読み取り

一般ユーザーでもusb出力を読み取れるようグループに追加

````
sudo adduser $USER dialout
````

GPS + rt rx なusb端末をパソコンに接続する。

gpsdのインストール

````
sudo apt-get install gpsd gpsd-clients python-gps
````

usbから読み取るよう設定ファイルの変更

````
sudo emacs /etc/default/gpsd
````

下記のように修正。DEVICESの部分は人によってことなるので注意

````
START_DAEMON="true"
USBAUTO="true"
DEVICES="/dev/ttyUSB0"
GPSD_OPTIONS="-n"
````

gpsdサービスの開始とログの読み取り

````
sudo service gpsd stop
sudo service gpsd start
gpsmon
````

参考リンク
GPSDのインストール | Ys Homepage https://www.yslabannex.net/?p=1163
GPS電波をRaspberry Piで読み取り、時間と位置把握する https://www.rs-online.com/designspark/add-gps-time-and-location-to-a-raspberry-pi-project-jp
Ubuntu 18.04でシリアル通信をする - メモ置き場 https://okchan08.hateblo.jp/entry/2019/01/27/234303
GCEでFlaskを動かす！

# はじめに
GCEで**とりあえずFlaskを使ってWebページを公開**する手順です。とりあえずなので、動けばいいといった感じです。


# インスタンスの立ち上げ

とりあえず公開するので、最低スペックで行きます。下記の構成でインスタンスを作ります。

- 名前
    - gce-flask
- リージョン
    - asia-notheast1(東京)
- ゾーン
    - asia-notheast1-b
- マシン構成
    - N1, f1-micro
- ブートディスク
    - 10GB, Ubuntu 18.07 LTS
- ファイアウォール
    -  HTTP トラフィックを許可する
    -  HTTPS トラフィックを許可する

![スクリーンショット (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483911/d2b8f839-2908-25e6-46b0-9d7c655efe8d.png)

# IPアドレスの固定
とりあえず動けばいいからIPアドレス固定しなくていいという方はスキップしても構いません。

## 静的アドレスの予約
VPCネットワーク→外部IPアドレス→静的アドレスを予約から静的アドレスを入手します。

- 名前
    - gce-flask
- 説明
    - FlaskでWebサーバー公開
- リージョン
    - asia-notheast1(東京)
- 接続先
    - gce-flask

![スクリーンショット (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483911/df326730-10bd-b35f-3cb7-dfad2b699141.png)

# 作成したインスタンスに接続
共通の鍵ファイルor個別に設定した鍵ファイルを使って接続します。

```
ssh -i 鍵ファイル -l ユーザー名 固定IPアドレス
```
![スクリーンショット (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483911/14ef043e-3d82-c916-01c2-c01ed13d881e.png)

#パッケージのアップデート
```
sudo apt-get update
```

```
sudo apt-get -y upgrade
```

# Python3-pipのインストール
```
sudo apt-get -y install python3-pip
```

# Flaskのインストール
```
pip3 install flask
```

# Flaskファイルの作成
任意のディレクトリでFlaskでサーバーを公開するプログラムを作成します。

```python:index.py
import flask

app = flask.Flask(__name__)
 
@app.route('/')
def index():
	return '''
		<!DOCTYPE html>
		<html lan="ja">
			<head>
				<title>Flask on GCE</title>
				<style>
					h1 {
						text-align: center;
					}
				</style>
			</head>
			<body>
				<h1>GCEでFlaskを動かす！</h1>
			</body>
		</html>
	'''
 
if __name__ == '__main__':
	app.run(debug=True, host='0.0.0.0', port=80)
```

# 実行

###
```
sudo python3 index.py
```
ブラウザで`固定IPアドレス`を入力し、**GCEでFlaskを動かす！**が表示されると成功です。
![スクリーンショット (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483911/e0f4a956-cc52-fc5f-033e-ad95dbec04d5.png)
【AWS】AWSのアーキテクチャ

# 5つの柱

- セキュリティー
- 信頼性
- パフォーマンス効率
- コスト最適化
- 運用上の優秀性

## セキュリティーの柱

- Identity and Access Management （IAM）
- 発見的統制
　潜在的なセキュリヒーインシデントを識別できる
- インフラストラクチャの保護
　アーキテクチャ内のシステムとサービスが意図しない不正アクセスから保護される
- データ保護
　多くのアプローチや方法を検討する必要がある（暗号化やバックアップなど）
- インシデント対応
　インシデント対応プロセスを検討しておく

### セキュリティーの柱：設計原則
- 全てのレイヤーにセキュリティーを実装する
- 追跡可能性を実現する
- 最小権限の原則を適用する
- システムの保護に重点を置く
- 自動化する

## 信頼性の柱
- 問題／障害から復旧する
- 以下の分野でベストプラクティスを適用する  
　・基盤  
　・変更管理  
　・障害管理
- 障害を予測し、対応し、防止する

### 信頼性の柱：設計原則
- 復旧手順をテストする
- 復旧を自動化する
- 水平にスケールする
- キャパシティーを勘に頼らない
- オートメーションの変更を管理する

## パフォーマンス効率の柱
- カスタマイズ可能なソリューションを選択する
- システムをレビューしてイノベーションを継続する
- AWSのサービスをモニタリングする
- トレードオフを考慮する

### パフォーマンス効率の柱：設計原則
- 最新のテクノロジーを標準化する
- 数分で世界中にデプロイする
- サーバーレスアーキテクチャを使用する
- 実験の頻度を増やす
- 最適なテクノロジーアプローチを使用する

## コスト最適化の柱
- コスト効率の優れたリソースを使用する
- 需要と供給を一致させる
- 費用を把握する
- 継続的に最適化する

### コスト最適化の柱：設計原則
- 消費モデルを導入する
- 全体的な効率を測定する
- データセンターの運用の支出を削減する
- 支出を分析して帰属させる
- マネージドサービスを使用する
　
# 耐障害性と高可用性

## 耐障害性
- システムの動作を維持する能力
- アプリケーションのコンポーネントに組み込まれた冗長性

## 高可用性
高可用性があれば・・・
- システムは全般的に機能し、アクセスできる
- ダウンタイムを最小限に抑えられる
- ユーザーの介入の必要性を最小限に抑えられる
- 先行投資を最小限に抑えられる

## 高可用性：オンプレミスとAWSの比較
▪️ 従来型（オンプレミス）
- 高価
- ミッションクリティカルなアプリケーションのみ

▪️AWS
- 複数のサーバー
- アベイラビリティーゾーン
- リージョン
- 耐障害性の高いサーバー

## 高可用サービスを実現するツール
- Elastic Load Balancing
- Elastic IP アドレス
- Amazon Route 53
- Auto Scaling
- Amazon CloudWatch

### Elastic Load Balancing
- 着信トラフィック（負荷）を分散する
- Amazon CloudWatchにメトリクスを送信する
- トリガー／通知  
 高いレイテンシ  
 過剰な使用率

### Elastic IPアドレス
- 静的IPアドレス
- 障害を隠蔽（万一発生しても）
- あるインスタンスに障害が発生してもアプリケーションへのアクセスを維持する

### Amazon Route53
- 権威DNSサービス  
 ドメイン名をIPアドレスに変換する
- 以下をサポート  
 シンプルなルーティング  
 レイテンシベースのルーティング  
 ヘルスチェック  
 DNSフェイルオーバー  
 位置情報ルーティング

### Auto Scaling
- インスタンスの作成・終了を行う
- キャパシティーの調整や変更をサポートする
- 新しいリソースをオンデマンドで作成する

### Amazon CloudWatch
- 分散型統計収集システム
- インフラストラクチャのメトリクスを追跡する
- カスタムメトリクスを作成して使用する
- Auto Scalingと組み合わせて使用される

## 耐障害性を実現するツール
- Amazon Simple Queue Service
- Amazon Simple Storage Service
- Amazon Relational Database Service
MySQL データベース接続からクエリ実行まで

##### MySQL サーバーへの接続

MySQL サーバーとのデータベース接続は、その接続したアプリケーション（クライアント）が接続を終了する、もしくはサーバーがシャットダウンするまで保持される。
MySQL サーバーと接続すると、それぞれに識別子が割り当てられる。

以下の例では、識別子"8"が割り当てられていることが分かる。
この識別子は、データベースに何らかの問題が発生した際に、トラブルシューティングで使用される場合がある。

```bash
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.18 MySQL Community Server - GPL
```

##### クエリの送信・実行
クエリがサーバーに送信されると、サーバーはそのクエリを実行する前にいくつか確認していることがある。
１．そのユーザーがリクエストしているクエリを実行する権限があるかどうか
２．そのユーザーがアクセスしようとしているデータに対する権限があるかどうか
３．クエリの文法が正しいかどうか

これらのチェックを通った後、そのクエリはクエリオプティマイザという機能に渡される。
クエリオプティマイザは、テーブルを結合する順番やインデックスなどを調べて、クエリの実行プランを選択する。

##### クエリの実行後
クエリの実行後、呼び出し元のアプリケーションに対して、結果セットと呼ばれるものが返却される。
結果セットとは、クエリを実行した結果から得られたデータで構成される新しいテーブルのようなもの。
もしクエリを実行した結果、何もデータが得られなかった場合、Empty set が返却される。
初学者によるプログラミングMemo　#8 DB基礎知識

# はじめに
今回はDBの基礎知識について少しお話しします
内容はいつにも増してしょぼいです笑
なお、本記述はMacにおいて、Railsでの開発を前提としています
また、まだまだひよっこですので、不備等ございましたらご指摘いただけると幸いです

# 目次
- DB(データベース)とは
- ORMとは
- database.ymlとは
- DB設計での注意点
- まとめ

## DB(データベース)とは
DBとは、データを複数集めてあとで使いやすい形に整理した情報のかたまりのことを表し、データの保管場所のことをさします
DBにはいくつか種類があります

- 階層型データベース
- ネットワーク型データベース
- リレーショナル型データベース

### 階層型データベース
階層型データベースとは、名前の通りデータが階層のように構成されており、ツリー構造を取っています
一般的なPCのファイルやフォルダを思い浮かべてもらうと、イメージしやすいと思います
特徴としては速度が非常に早い事が挙げられます
反面、場合によっては重複登録や、情報の編集に対して柔軟性が低いというデメリットもあります

### ネットワーク型データベース
階層型データベースの欠点を補う形で開発されました
重複登録をする必要がなくなり、柔軟性もアップしましたが、後述するリレーショナル型データベースがさらに利便性が高いため、シェアを落としていきました

### リレーショナル型データベース
行と列からなる「表」でできたデータベース
列にはそれぞれ重複しない項目（カラム）を設定し、行をデータとして追加していきます
見やすさと、複数の表を結合することで、柔軟性を高めています

## ORMとは
ORMとは、オブジェクト関係マッピング（Object-relational mapping）のことで、データベースとオブジェクト指向プログラミング言語の間の、非互換なデータを変換するプログラミング技法
具体的には、直接SQL文を書く代わりに、非常に短いコードでデータベースの読み書きを行える機能で、Railsでは**ActiveRecord**というモジュールで実装されている

## database.ymlとは
Railsでの開発時、"rails db:create"のコマンドを実行した時に作成されるDBの名前を指定するファイル
また、RailsアプリケーションがSQLサーバーにアクセスするときのソケットファイルの位置を指定する

### DB管理システムに関して
DBの管理システムには複数あります

- Oracle Database(有償)
- SQL Server（有償）
- MySQL(無償)
- PostgresSQL（無償）
- SQLite（無償）

他にもありますが、主だったものはこのくらいでしょうか
興味のある方は調べてみてもいいかもしれません

## DB設計での注意点
DB設計をする際に気をつけたいのが、テーブル（表）をいくつ作り、そのテーブルにどんなカラムを持たせるかということです
Twitter(投稿のみの簡易版)を例に挙げてみましょう
この場合、すぐに思いつくテーブルとしては"Users","Tweets"の二つです
"Users"テーブルにはもちろんユーザー情報が入ります
"Tweets"テーブルのカラムには内容を示す文章（comment）と、画像（Image）が思いつくと思います
初めの設計段階で、画像の投稿が1枚だけと限定し、変更しなければこの設計でいいかもしれませんが、やっぱり2枚、いや4枚と後から仕様変更をする際、この設計では困ります
後からまたカラムを追加するという作業をしなくてはなりません
そこで、"Image"テーブルというものを別で作り、そちらで管理するようにするとどうでしょう
"Image"テーブルの方に、元となるTweetのidを紐付けできるカラムを初めから用意するだけで、DBを修正しなくても、一つのtweetに対して何枚でも画像を設定することが可能になります（詳細や実装は長くなるので書きません）
このように、手戻り作業をなくしたり、柔軟な対応をするためにも、DB設計は非常に重要な項目となります

## まとめ

- DBはデータの保管場所
- DBには種類があり、現在はリレーショナル型が主流
- DB管理システムは有償・無償がある
- DB設計は非常に重要な項目
初めてバッチファイルを作った話

仕事で大量のデータ取り込みのテストを行うに当たって100個のファイルが必要になり、地道に手動でテストデータ入りのファイルをコピペすると1日かかりますし、腱鞘炎になってしまう！
何とか一瞬で100個のファイルをコピー出来る手段は無いのか･･･と調べると、バッチファイルを作って自動でコピー出来ることが判明！
「バッチファイル･･･難しそうだけどやってみるか！」と思い、さっそく作成しました。

#作成したバッチファイルの概要
１.編集で指定した数の分だけファイルをコピーする
２.コピーされた際、0埋めされた番号が採番されること

#作成したバッチファイルの中身
ネットで調べながら以下のバッチファイルが完成致しました。

```batch:Copyfile.bat
setlocal enabledelayedexpansion

for /l %%n in (2,1,10) do (
set num=00%%n
echo !num:~-3!
copy C:\Users\Public\TEST\test_001_20191226.txt C:\Users\Public\TEST\test_!num:~-3!_20191226.txt
)
endlocal
pause
```
##中身の解説
`setlocal enabledelayedexpansion`：
ローカル変数を使う場合に宣言する時に使うコマンド
これを使うことで、バッチ実行中に変数の値を変化させることが出来ます。

`for /l %%n in (2,1,10) do`：
「for」は繰り返し処理をさせるコマンド。
「/l」は後ろの（開始の番号,増分,終了の番号）を有効にさせるコマンドです。
「%%n」は格納する変数です。
この場合は「2から1ずつ採番し、10になったら終了」という意味になります。

`set num=00%%n
echo !num:~-3!`：
ここでは上記の変数の左2桁を0で埋めたものを「num」という変数にセットしました。
これだけだと10以降に差し掛かった時「0010」となってしまう為、「num」の右2桁を読み込む処理を追加しました。
「!」で囲まれているのは「**遅延環境変数**」にさせる為です。
バッチファイルの特徴として、「設定した条件に差し掛かった時、以後全ての変数を展開させる」というものがあります。
これだと初めに格納した値でしか処理されないです。
その為、後のタイミングで展開させたい時に使うのが「**遅延環境変数**」です。
上記の`setlocal enabledelayedexpansion`を最初に宣言し、展開するタイミングをずらしたい変数を「!」で囲みます。

`copy C:\Users\Public\TEST\test_001_20191226.txt C:\Users\Public\TEST\test_!num:~-3!_20191226.txt
)`：
「copy」はファイルをコピーさせるコマンドです。
`copy コピー元のファイル名 コピーされるファイル名`という構文で使います。

`endlocal`：
最初に宣言した「setlocal」の範囲を締めるコマンド。

`pause`：
処理が全て完了した後自動でコマンドプロンプトが消えず、手動で終了させるコマンド。
「終了する時は何かキーを押して下さい」と表示させるのはこれ。

#実際に動かしてみた
作成したバッチファイルを以下のフォルダにセットします。
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506986/2490f017-4365-107a-90ba-6e201d29b3d6.png)


↓バッチが動きました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506986/c531af8f-4058-65b9-9847-67b6d1d0ba65.png)

↓フォルダを確認すると、「010」まで採番されたファイルが作成されていることを確認
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506986/b1803107-f668-1d58-5d1d-b816ccfa748b.png)





#まとめ
以上より、ファイルを大量にコピーさせるバッチファイルを作成致しました。
0埋めの連番処理で少々詰まってしまいましたが、思った以上に簡単に作ることが出来ました。
今回作ったものをきっかけに、業務効率化を図るのに自分でバッチファイルを作る選択肢が増え、普段の業務をよりスムーズに出来るようにさせていきたいと思います。

#2020年7月10日 追記
久しぶりにバッチファイルを動かそうとしたら、ファイル名に「()」が含まれていることが原因で動かすことが出来ませんでした。
ファイル名から「()」を取り除いたら正常に動くことは出来ましたが、「()」や「「|」が含まれているファイルに対しては現在調査中ですが、これらの記号をファイル名に含ませることはタブーに近いことみたいですね。

#参考文献

[バッチファイルでファイル名に連番を付けてコピーする～実行解説]
(http://dalmore.blog7.fc2.com/blog-entry-77.html)

[SE日記 windowsコマンドで連番付きのファイルを一気に大量に作る／コピーする方法]
(https://oreno-it2.info/archives/248)

[Lyo.blog バッチファイルで前ゼロ付き連番ファイル生成]
(http://hoge.sub.jp/blog/archives/2009/08/20090827_0.html)

[知識ゼロからのwindowsバッチファイル入門]
(https://jj-blues.com/cms/quick_search/top-command/)

[バッチファイル界の魔境『遅延環境変数』に挑む（おまけもあるよ）]
(https://qiita.com/plcherrim/items/c7c477cacf8c97792e17)

[ファイル名に使わない方が良い文字]
(https://all.undo.jp/asr/1st/document/01_03.html)
Ruby 2.7 の bundle install で Could not find 'bundler'  エラーが出たときの対応

Ruby 2.7.0 の `bundle install` で `Could not find 'bundler'` エラーが出たら `BUNDLER_VERSION=2.1.2 bundle install` を実行すれば直る。

このとき Gemfile.lock の `BUNDLED WITH` セクションが2.1.2に書き換わるので、必要に応じて `git commit` などをする。

## 解説

Bundler は Gemfile.lock の `BUNDLED WITH` セクションに Gemfile.lock を生成したバージョンを記録している。

```ruby:Gemfile.lock
（略）
BUNDLED WITH
   1.17.3
```

`bundle` コマンドには [Bundler Trampolining](https://bundler.io/v1.14/bundle.html#BUNDLER-TRAMPOLINING) という機構があり、複数バージョンの bundler gem がインストールされていれば `BUNDLED WITH` セクションで指定されたバージョンの実行ファイルに処理を移譲する。指定されたバージョンがインストールされていないとき、メジャーバージョンが同じ（＝マイナーバージョン以下だけ異なる）バージョンがあればそれに移譲する。それもなければ上記のエラーが出る。

```bash:bundler-trampolining
# bundler gem 1.17.3, 2.1.2 がインストールされているとき……

# Gemfile.lock がないディレクトリでは最新の2.1.2を使う
$ bundle --version
Bundler version 2.1.2

# Gemfile.lock があって BUNDLED WITH 2.1.2 ならそのまま 2.1.2 を使う
$ tail -n2 Gemfile.lock
BUNDLED WITH
   2.1.2
$ bundle --version
Bundler version 2.1.2

# Gemfile.lock があって BUNDLED WITH 1.17.3 なら 1.17.3 に移譲する
$ tail -n2 Gemfile.lock
BUNDLED WITH
   1.17.3
$ bundle --version
Bundler version 1.17.3

# Gemfile.lock があって BUNDLED WITH 1.17.0 なら同じ 1.x 系の 1.17.3 に移譲する
$ tail -n2 Gemfile.lock
BUNDLED WITH
   1.17.0
$ bundle --version
Bundler version 1.17.3

# bundler gem 2.1.2 だけがインストールされているとき……

# Gemfile.lock があって BUNDLED WITH 1.17.3 なら 2.x 系には移譲せずエラーを出す
$ tail -n2 Gemfile.lock
BUNDLED WITH
   1.17.3
$ bundle install
Traceback (most recent call last):
        2: from /Users/uasi/.rbenv/versions/2.7/bin/bundle:23:in `<main>'
        1: from /Users/uasi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/rubygems.rb:294:in `activate_bin_path'
/Users/uasi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/rubygems.rb:275:in `find_spec_for_exe': Could not find 'bundler' (1.17.3) required by your /path/to/Gemfile.lock. (Gem::GemNotFoundException)
```

`BUNDLER_VERSION` 環境変数をセットすると trampolining を無効化して特定のバージョンの bundler gem の使用を強制できる。 Ruby 2.7 に同梱された Bundler 2.1.2 で `bundle install` して `Gemfile.lock` を更新すればエラーは解決する。
PowerPointにおける図形の実寸印刷

# はじめに

図形を実寸で印刷する機会が有り、サクッとパワポでやってみようと思い、下のような記事を見つけました。
[図形の実寸印刷（with PowerPoint）](https://qiita.com/mu-777/items/2c133c30b978596eb016)

もう少しいい方法はないかなとやってみたら、上手く行ったので共有します。
環境はPowerPoint 2013 + brother製プリンタです。

# 手順
A4の紙に印刷する場合です。その他の場合は適宜読み替えてください。

## スライドサイズの設定
まず、表示しているスライドのサイズをA4に設定しましょう。
上部のリボンから、「デザイン→スライドのサイズ→ユーザー設定のスライドサイズ」を選択します。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215071/5d158f2c-6fec-e766-ac06-5de4f567d921.png)


左上の「スライドのサイズ指定」の下矢印を選択すると、選択可能なサイズの一覧が出てきますので、「A4」を選択します。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215071/cca0ea8c-0f1d-ab55-ac2a-539c1a4e9060.png)


## 図形の描画（サイズ指定）
そうしたら、好きな図形を書いちゃってください。
最初は試しに簡単な図形を印刷してみて、ちゃんと印刷できるかチェックすると良いと思います。

図形を書くときはリボンの「挿入→図形」から好きな図形を配置すると思いますが、サイズを指定するときは、図形の上で右クリック、「図形の書式設定→図形のオプション」内にある、「サイズ」の項目から高さや幅などを指定します。
ここで指定したサイズ通りに印刷されます。
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215071/0613b333-801a-8b70-a262-30edf8d0a8e2.png)


## 印刷
任意の図形を描画したら、最後に印刷しましょう。通常、印刷するときはリボンから「ファイル→印刷」を選択しますね。
ここで忘れてはいけない設定があります。

最後の印刷ボタンを押す前に、「設定」の項目にある、デフォルトでは「**フルページサイズのスライド**」となっているところを選択します。
上から、印刷レイアウト、配布資料と項目がありますが、その下に「用紙に合わせて拡大/縮小」と書いてあります。
**このチェックを外しましょう。**
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215071/61d4f0ae-0e02-7c5e-52b1-dc7e8b1fab23.png)

こうすることで、勝手にパワポ側でサイズを調整せずに、先程設定した図形のサイズのまま印刷してくれます。
kotlinのシンプルなmain関数内でHello Worldを出力する

## Homebrewを用いてKotlinをMacにインストールする。

```bash
$ brew install kotlin
$ kotlin -version
=> Kotlin version 1.3.61-release-180 (JRE 11.0.1+13-LTS)
```

## KotlinでシンプルなHello Worldを記述する

```kotlin:helloWorld.kt
fun main(args: Array<String>) { 
  println("Hello, World!")
}
```

## Kotlin Compilerで上記ktファイルをコンパイルする

```bash
$ kotlinc helloWorld.kt -include-runtime -d helloWorld.jar
$ hello_world ll
-rw-r--r--  1 user staff   1.3M Dec 27 22:34 helloWorld.jar
-rw-r--r--  1 user staff    62B Dec 27 22:33 helloWorld.kt
```

## `java`コマンドでjarファイルを実行する

```bash
$ java -jar helloWorld.jar
=> Hello, World!
```

Hello, World!
Interface Builder で設定した named color を変更できない問題

iOSアプリの画面表示が更新されないという、スレッドかUIの描画タイミングに問題がありそうなふるまいなのに実は named color が原因という手強い問題がありました


# 現象

発生していたのは `UITableViewCell` と `UITableViewHeaderFooterView` の subview の `backgroundColor` が更新されないという現象でした。

## 補足

- Cell を一度画面外に出してから再度画面内にスクロールしてきたり、時間差を置いて `reloadData()` を呼び出すなどすれば正常に `backgroundColor` が更新されます。
- `backgroundColor` を設定している行でブレークすると正常に代入されていることを確認できるものの、実行を再開して Debug View Hierarchy などで再度確認すると Interface Builder で設定した色に戻っています
- iOS12で再現し、iOS13では発生しません
- Interface Builder で設定する色が named color でなければ発生しません


# 原因

こちらの方が調べていますが、UIKitが `layoutSubviews()` 時に named color を別オブジェクトに変換して再度 `backgroundColor` に設定するという挙動をするため、初回の `layoutSubviews()` 以前に `backgroundColor` に設定した値が無視されているということです
https://stackoverflow.com/a/59145038/3890662

# 対策

`layoutSubviews()` 以降のタイミングで `backgroundColor` を設定すればOKです


## `UITableViewCell` の場合

`backgroundColor` の設定を `tableView(_: willDisplay: forRowAt:)` で行うことで回避できます


## `UITableViewHeaderFooterView` の場合

`backgroundColor` の設定を `layoutSubviews()` で行うことで回避できます

### 補足

- `layoutSubviews()` は IBOutlet の設定 **前** にも呼び出されるので注意が必要です
- `tableView(_: willDisplayHeaderView: forSection:)` を利用しても **解決しません**
  - これは単純に delegate メソッドが呼び出されるタイミングの問題だと思います
【Flutter】Androidビルド時、使用していないプロキシサーバーを経由しようとする場合の対処法

# 【Flutter】Androidビルド時、使用していないプロキシサーバーを経由しようとする場合の対処法

## TL;DR
Android Studioなどでプロキシ設定をしたことがある場合、解除してもVSCodoでビルドをするとGradleからエラーが吐かれ、ビルドできない時があります. これはGradle側でプロキシ設定が解除されてない事によるものです。
```/Users/userName/.gradle/gradle.properties```内にプロキシサーバーのアドレスが記述されているので、コメントアウトして対処します.

## 環境
- macOS Catalina 10.15 Beta（19A546d）
 
```
[✓] Flutter (Channel beta, v1.12.13+hotfix.6, on Mac OS X 10.15 19A546d, locale
    ja)
[✓] Android toolchain - develop for Android devices (Android SDK version 28.0.3)
[✓] Xcode - develop for iOS and macOS (Xcode 11.3)
[✓] Android Studio (version 3.5)
[✓] VS Code (version 1.41.1)
```

## 手順
### 1. ```gradle.properties``` を開く

```/Users/userName/.gradle ``` 内部に```gradle.properties ``` が存在しているので開く。


### 2. プロキシについての記述をコメントアウトする
```
## For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html
#
# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
# Default value: -Xmx1024m -XX:MaxPermSize=256m
# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
#
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true
#Tue Apr 23 16:48:25 JST 2019

#
#下記三つをコメントアウト(パスワードなどを設定している場合は、もう少し項目が多くなるようです)
#
#systemProp.http.proxyHost="プロキシサーバアドレス"
#systemProp.http.nonProxyHosts="プロキシ例外リスト"
#systemProp.http.proxyPort="ポート番号"
```

## 最後に
学校で利用する際は必ずプロキシサーバーを通す必要があり、プロキシサーバを経由して使っていました. そして帰省した時、プロキシを解除している(システム環境設定、 AndroidStduio)にもかかわらず、ビルド時のファイルダウンロードをする中になぜかプロキシを経由しようとして失敗していました.　当時は本当に原因がわからなかったのですがGradleがエラーを吐いていることに注目していろいろ調べていたら解決しました. 
この先もよくわからないエラーにハマり、解決した場合は記事を書いていきたいと思います. 

## 参考文献
[Gradleでのプロキシ設定 - Qiita](https://qiita.com/hishida/items/9479fb64a016032c0938)
php 5.6 Imagickインストールする設定


pecl install imagick
にて下記エラーは開発ツールがインストールされていないため
yum groupinstall 'Development tools'
を実行で廻避
Notice: Use of undefined constant name - assumed 'name' in PEAR/Builder.php on line 405
PHP Notice:  Use of undefined constant name - assumed 'name' in /usr/share/pear/PEAR/Builder.php on line 405
building in /var/tmp/pear-build-rootevMVC0/imagick-3.4.4
running: /var/tmp/imagick/configure --with-php-config=/usr/bin/php-config --with-imagick
checking for grep that handles long lines and -e... /bin/grep
checking for egrep... /bin/grep -E
checking for a sed that does not truncate output... /bin/sed
checking for cc... no
checking for gcc... no
configure: error: in `/var/tmp/pear-build-rootevMVC0/imagick-3.4.4':
configure: error: no acceptable C compiler found in $PATH
See `config.log' for more details.
ERROR: `/var/tmp/imagick/configure --with-php-config=/usr/bin/php-config --with-imagick' failed
Jupyter Notebook/Labでgo言語を使うためのGophernotesでPATHを設定する。

Jupyter Notebook/LabでGo言語を利用するためのGophernotesを導入した際に、PATHの設定で手間取ったので解決方法のメモになります。

もしかするともっと良い方法があるかもしれませんが。

# 事象

Gophernotesを導入し、サンプル程度は動作するようになったのですがサードパーティ製ライブラリをimportしようとするとエラーが発生します。

例えば次のようなimportを行うと

```go
import (
    "bufio"
    "context"
    "fmt"
    "io"

    "cloud.google.com/go/storage"
)
```

"cloud.google.com/go/storage"の読み込み部分で次のエラーが発生します。
（もちろん、go getは実施済みです）

```
error loading package "cloud.google.com/go/storage" metadata: 'go list' driver requires 'go', but executable file not found in $PATH
```

PATH廻りが怪しいと考え、JupyterlabのターミナルからPATHやJUPYTER_PATHを見直したのですが、うまくいきませんでした。

# 解決策

Gophernotesのカーネル設定ファイルで環境変数としてPATHを上書きして解決しました。

詳しい説明は次を参照してください。
[Making kernels for Jupyter](https://jupyter-client.readthedocs.io/en/latest/kernels.html)

次のようにenvの項目を追加します。

```json
# vi /home/jovyan/.local/share/jupyter/kernels/gophernotes/kernel.json
{
    "argv": [
        "/home/jovyan/go/bin/gophernotes",
        "{connection_file}"
    ],
    "env": {
        "PATH": "/opt/conda/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/jovyan/go/bin:/usr/lib/go-1.13/bin"
    },
    "display_name": "Go",
    "language": "go",
    "name": "go"
}
```

環境によって、元々のPATHに違いがあるかもしれません。
次のようにして確認した方が安全です。

```go
import (
    "fmt"
    "os"
)
fmt.Println(os.Getenv("PATH"))

> "/opt/conda/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
```

これに、/home/jovyan/go/bin(GOPATH/bin)と/usr/lib/go-1.13/bin(GOROOT/bin)を加えています。goのバージョンは適宜変更してください。

上記の設定でインポートエラーが消え、無事に処理が走るようになりました。