OmniAICreator/Qiita-1.07M huggingface dataset:
Django REST Frameworkにおけるカスタムバリデーションの書き方

# 概要
アプリを作るときに調べたので忘れたときに呼び出せるように書いておきます。

Djangoではformでcleanメソッドを入れたりしてバリデーションしていましたが、そもそもDjango REST Frameworkだとそもそもカスタムバリデーションを書くんだろうと思い、調べました。

# 書き方

`seliarizers.py`にそれぞれのバリデーションを書きます。

## 関数ベース

以下のように書きます。

```Python
# 成人かをバリデーション
def validate_age(age):
    if age < 21:
      raise serializers.ValidationError('未成年には早すぎます！')
```



## クラスベース
クラスベースでは`__call__`メソッドを使って書きます。

なお、クラスベースでは再利用性が高いので基本はこっちを使っておくとコードの見通しが良くなります。

```Python
class AgeValidator(object):
    def __init__(self,num):
        self.num = num
    def __call__(self,age):
        if age < self.num:
            message = 'This page is for Adult!'
            raise serializers.ValidationError(message)
```
EC2からS3への自動バックアップを１０分で実装

#この記事で解説すること
この記事ではAWS　EC2（AWSCLI）からS３に、特定のディレクトリを毎時間バックアップを取る方法を解説します。前提として、EC2内からS3へアクセスをすることができる状態（エンドポイントが開設されている状態）を想定しております。EC2ーS3間のエンドポイントを作成することができていない方は先にこちらのブログを見てください。

#EC2からS3に自動バックアップをする機能を実装する手順
0.パス等が通っていることを確認する。
1.バックアップ用のシェルスクリプトを書く。
2.Cronを書いて、自動的シェルスクリプトを実行する環境を整える。Cronをアクティベートする
3.テストする

それでは一つ一つ、紹介していきます。
##0.パス等が通っていることを確認する。
まず、awsCLIが無事稼働しているか、s3を利用することができるか、チェックするために、以下の二つのコードを実行してみてください。

```
touch test.txt
aws s3 cp test.txt s3://[バケット名]
```

```
aws s3 ls s3://[バケット名]
[結果]　test.txt
```
この二つのコードが無事実行することができたら、EC2のバックアップをS3にあげる準備はできています！

##1.バックアップ用のシェルスクリプトを書く。
シェルスクリプトを作成します。以下をコピーし、実行してください。

```
vim ~/backup.sh
```

```backup.sh
echo "start"
aws s3 rm s3://[バケット名]/`date '+%Y%m%d'`/ --recursive
aws s3 sync /home/ec2-user/`date '+%Y%m%d'` s3://[バケット名]/`date '+%Y%m%d'`
echo "finish"
```
この例では、ローカルないのその日の日付(例)20200520のディレクトリの中身を、S3のその日の日付のディレクトリないにバックアップをとっています。一度rmでリモートのディレクトリ内を削除し、コピーし直すことで、S3のデータ量を節約しています。
--recursiveは、ディレクトリレベルでのコピーや削除をする時に必要になるオプションです。バケット内のディレクトリを閲覧、削除に苦戦している人はこれを試してみてください。

また、以下のコードも実行し、シェルスクリプトにs３周りのファイルを取り扱うためのパーミッションを与えてください。

```
chmod 755 backup.sh
```
以上でシェルスクリプトの作成は完了です。

##2.Cronを書いて、自動的シェルスクリプトを実行する環境を整える。
```
vim cron.conf
```
以下を参考にcron.confを編集してください

```cron.conf
*/5 * * * * ~/backup.sh # 5分おきに実行
0,30 * * * * ~/backup.sh # 0分と30分に実行
3-5 * * * * ~/backup.sh # 3分、4分、5分に実行
```
最後に、cronを登録します。

```
crontab cron.conf
```
以上でcronファイルの編集及びアクティベートは完了です。

#お疲れ様でした。
神泡をArduinoで作る

# 命名
2020年10月26日更新
![equation.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629180/0aee22bf-56df-2935-ed0c-525abcf291e5.png)


# 注意
この記事は飲酒についての言及があります。
未成年の方がこの記事内容を実践される場合はビールではなくコーラをご用意ください。
よいこのビールでも可です。

# はじめに
今年もサントリー プレミアムモルツから神泡サーバーの[プレゼントキャンペーン](http://the-premium.jp/apc/sscp/P/top.html?_ga=2.152390457.1262323145.1588349935-729155225.1588349935#200324_cpinfo)が始まった。
大人向けのヤマザキ春のパンまつりである。

神泡サーバーのようなビールにきめ細やかな泡を作るグッズというのはAmazonなどでも散見される。
このような商品はビールに超音波を当て、その振動でビールを泡立たせることを動作原理としている。

ふむ、超音波か。

# 準備物
<dl>
<dt>Arduino</dt>
<dd>どのタイプでも大丈夫（のはず）。費用を抑えたいならパチモンでも問題ない</dd>
<dt>Arduino IDE</dt>
<dd>スケッチ作成に必要。ない場合は<a href="https://www.arduino.cc/en/main/software">こちら</a>からダウンロード</dd>
<dt>スピーカー</dt>
<dd>スピーカー素子。なければ秋月の<a heref="http://akizukidenshi.com/catalog/g/gP-04118/">これ</a>とか（試してないけど）。<strong>スマホやパソコンに繋いで使うタイプ（3.5mmミニプラグ付きとかブルートゥースの）はダメ</strong></dd>
<dt>ビール</dt>
<dd>筆者は金麦派。コロナの影響でコロナビールの売上落ちてるらしいので買ってあげてくだい。未成年はコーラかよいこのビール</dd>
</dl>

# スケッチ
```神泡.ino
// スピーカーをつなぐピン
const int speaker_pin = 13;
// 超音波の周波数
const int kamiawa_frequency = 30000;
// 神泡時間（エンペラーバブルタイム）
const int kamiawa_time = 10;

void setup() {
  // 13番ピンから30kHzの音を10s
  tone(speaker_pin, kamiawa_frequency, kamiawa_time * 1000);
}

void loop() {
}
```

# Arduinoのセットアップ
`speaker_pin`とGNDピンにスピーカーをつなぐ。
電源は適当にとってくる。

# エンペラーバブルタイム
Arduinoの電源を入れた瞬間に神泡ビームがスピーカーから照射される。
神泡ビームを余すことなくビールに送り込む（コップや缶、瓶にスピーカーをくっつけておくと良いかも）。

泡の具合を見て、各自完璧な神泡パラメーターを探る。

# おわりに
よい晩酌を！
乾杯！
Windows TerminalでSSHアクセスする。

settings.jsonのprofiles⇒list内に下記を追加

```json
{
    "name": "名前",
    "commandline": "cmd.exe /c \"ssh ユーザー名@接続先ホスト[:ポート]\" && exit",
    "hidden": false
}
```

アイコンを設定したい場合は"icon"という項目を追加して、32px正方形のアイコン画像へのパスを記入すれば良い (バックスラッシュは2回書く)

例

```json
{
    "name": "192.168.11.3 - CentOS",
    "commandline": "cmd.exe /c \"ssh admin@192.168.11.3\" && exit",
    "icon": "C:\\Users\\hoge\\Downloads\\centos_icon_32px.png",
    "hidden": false
}
```
はじめてのredis

redisのjob queueを使いたかったんだけど、何もわからず立ち尽くしてしまったのでGW的に復習しようかと。

ゆくゆくはここを読む予定。
https://redislabs.com/ebook/part-2-core-concepts/chapter-6-application-components-in-redis/6-4-task-queues/6-4-1-first-in-first-out-queues/

# install redis on mac
いったんlocalでやってみよ

```
brew install redis

redis-server /usr/local/etc/redis.conf redis-server /usr/local/etc/redis.conf
```

2行で起動できる便利さ。待ち時間ゼロ。

# Use local redis
違うterminalで実行
```
redis-cli
```
これだけ。redis-cliは brew install redis で一緒に入ります。




# データ種類
あんま真面目に使ったことなかったのでどこまでdict型が入るのか確認ん。この記事によると5種類。
https://qiita.com/keinko/items/60c844bcf329bd3f4af8

1. String型: key-value | "name" = "john"
1. List型 : [1,1,2,2,3]
1. Set型 : Sets | [1,2,3]
1. Sorted set型 : いったんスルー
1. Hash型 : Dictionary | dog = {"name": "Hachi", "age": 10}


## STRING

```
127.0.0.1:6379>  set a 1
OK
127.0.0.1:6379> get a
"1"
```


# LIST
重複OK。POPで取り出せる。queueはこれでもいいっちゃいい。
RPUSHできっと右側に追加する。

```
127.0.0.1:6379> LPUSH mylist a
(integer) 1
127.0.0.1:6379> LPUSH mylist a    <------重複
(integer) 2
127.0.0.1:6379> LPUSH mylist b
(integer) 3
127.0.0.1:6379> LPUSH mylist c
(integer) 4
127.0.0.1:6379> LPOP mylist
"c"
127.0.0.1:6379> LPOP mylist
"b"
127.0.0.1:6379> LPOP mylist
"a"
127.0.0.1:6379> LPOP mylist　　　　    <------重複
"a"
127.0.0.1:6379> LPOP mylist
(nil)
```

# SET
SETsというからには、重複が入らない

```
127.0.0.1:6379> SADD myset "a"
(integer) 1
127.0.0.1:6379> SADD myset "b"
(integer) 1
127.0.0.1:6379> SADD myset "c"
(integer) 1
127.0.0.1:6379> SADD myset "c"　    <------重複
(integer) 0
127.0.0.1:6379> SPOP myset
"a"
127.0.0.1:6379> SPOP myset
"c"
127.0.0.1:6379> SPOP myset
"b"
127.0.0.1:6379> SPOP myset　    <------重複なし
(nil)
127.0.0.1:6379>
```

# HASH = HMSET
https://redis.io/commands/hmset

やっぱmongoか？感が少し漂う。

```
$ redis-cli
127.0.0.1:6379> HMSET john age 25 gender "male"
OK
127.0.0.1:6379> HMSET Kate age 33 gender "female"
OK

127.0.0.1:6379> HMGET john age
1) "25"
127.0.0.1:6379> HMGET john gender
1) "male"
127.0.0.1:6379> HMGET kate age         <----- Case sensitive
1) (nil)
127.0.0.1:6379> HMGET Kate age
1) "33"
127.0.0.1:6379> HMGET Kate gender
1) "female"
```

HSETもあるらしい
https://redis.io/commands/hset

んーどうなんだろか。
LinuxのShellで作業中で手持ち無沙汰の時についつい叩いてしまうコマンド

久しぶりにAWSのEC2にLinuxサーバを立てて設定を入れ込んでいたのですが、作業しているときに手持ち無沙汰になるとついついコンソールに叩いてしまうコマンドあるよなぁということでまとめてみました。
一つの作業が終わって次の作業に移って一息いれるときとや、あー次に何やるんだっけ？って考えてるときとか、叩きがち。傍から見てるとキーボード叩いて画面にレスポンスが返ってくるから、あーあいつなんか仕事してるなって見られる感があります。

これらのコマンドはシステム情報や現在のステータスを確認するコマンドなので、基本的にはファイルを作ったり、プロセスを止めたり、負荷が上がったりなどシステムに影響を与えることは少ない安全なコマンドだと思います。

「有用性」はコマンドとして使えるかどうか、「お手軽度」はコマンドの打ちやすさ、「ボリューム」はコマンドを打った時に戻ってくるレスポンスのボリュームが基準になっています。
それぞれのスコアは、私の独断と偏見になっております。有用性についてはインフラエンジニアとプログラマでも評価は変わってくるのかなと思います。

##pwd
有用性：★★★★☆
お手軽度：★★★★☆
ボリューム：★☆☆☆☆

現在のディレクトリを確認するコマンドです。現在のディレクトリを1行で返してくるのでボリュームはありません。
いま自分はどこのディレクトリにいるのかを確認するときに有用です。これから何か作業をするって時に重宝します。

##ps ax
有用性：★★★☆☆
お手軽度：★★☆☆☆
ボリューム：★★★★☆

現在稼働中のすべてのプロセスを表示するコマンドです。
メンテナンスしたりするときとかインフラエンジニアはgrepと一緒によく使います。
オプション付けないといけないので、お手軽度は低いです。
SunOSだと`ps -ef`でしたっけ？

##ll
有用性：★★★☆☆
お手軽度：★★★★★
ボリューム：★★☆☆☆

ディレクトリの内容を表示するコマンドです。最もよく使うじゃないかと思います。
たいていのLinuxではデフォルトで使えますが、これの実態は`ls -la`または`ls -lA`のAliasなので、profileやrcに書いてない場合は使えません。
これもgrepなどと一緒に使うのがおすすめです。

##uname -a
有用性：★★☆☆☆
お手軽度：★★☆☆☆
ボリューム：★☆☆☆☆

システム情報を表示するコマンドです。カーネルバージョンなどが1行だけ表示される地味なコマンドですが、ソースからコンパイルするときに使うconfigureファイルなどで活躍している重要なコマンドです。
スペルも長いから打ちにくいのでスコアは低いけど、シンプルな戻り値で個人的には好きなコマンドです。

##w
有用性：★★★☆☆
お手軽度：★★★★★
ボリューム：★★☆☆☆

ロードアベレージと開いているttyの状態を表示してくれます。
メンテナンスするときとかで、誰かほかにログインしている人がいないかを確認できたりするので便利です。最短コマンドなので、とりあえず`w`って打っちゃいます。

##top
有用性：★★★★☆
お手軽度：★★☆☆☆
ボリューム：★★★★☆

システム負荷の状態をリアルタイムで表示してくれるコマンドです。他のコマンドとはちょっと異色なものになります。
コマンドを抜けるときはQuitの`q`を押して終了します。
topコマンド中に数字の`1`を押すと、CPUごとの負荷を表示してくれます。
ログが取れないのが難点なので、ログに残しておきたいときは`vmstat`などで代用することが多いかと思います。

##dmesg
有用性：★★☆☆☆
お手軽度：★★☆☆☆
ボリューム：★★★★★

カーネルメッセージを表示するコマンドです。
起動プロセスに異常があったり、デバイスの認識がおかしかったりするときの解析で重宝しますが、実際にこれを活用する出番は少ないかと思います。読むのも難しいと思います。
コマンドの返りのボリュームが多いので、仕事してる感は十分得られるかもしれません。

##env/set
有用性：★☆☆☆☆
お手軽度：★★★☆☆
ボリューム：★★★☆☆

`env`も`set`どちらも環境変数を取得するコマンドです。二つとも出力が異なるのですが、`env`の方がよく使うと思います。プログラミングしてるとパスが通ってるかどうか確認したりすることも多いと思うので、そういうときに使えるんじゃないかと思います。

##netstat -an / netstat -rn
有用性：★★★★☆
お手軽度：★★☆☆☆
ボリューム：★★★★☆

ネットワークの状態を確認するコマンドです。`-an`オプションはListenしているポートを確認したり、開いているセッションを書くにしたりできます。`-rn`オプションはルーティングテーブルが表示されます。nオプションを付けると名前解決しないので、表示が早くなりますし、IPアドレスで見たいときに適しています。コマンドが長いのがちょっと難点です。

##df
有用性：★★★★☆
お手軽度：★★★★★
ボリューム：★★☆☆☆

ディスクの使用量を表示するコマンドです。デフォルトはkB表記ですが、MB表記、GB表記などいろいろオプションがあるので詳しくはマニュアルを見てください。

##h
有用性：★★☆☆☆
お手軽度：★★★★★
ボリューム：★★★★☆

`history`コマンドのAliasです。
ディストリビューションによってはAliasが設定されていない可能性があります。

##その他
ディレクトリのファイル数をカウントする`du`コマンドとかおすすめですが、リカーシブルオプション付けると階層深いといつまでたってもコマンドが終わらないのが難点ですし、そうなるとディスクIOの負荷も上がるので気を付ける必要があります。
他には`ifconfig -a`もおすすめですが、このコマンドは`sbin`に配置されているため、rootユーザでないとパスが通っていないので全然お手軽じゃないというデメリットがあります。
`rpm -qa`とか`iptables -L`もよく使いますが、同様にrootユーザでないと使えなかったり、ディストリビューションやバージョン依存なので圏外にしました。
PHP foreachを使う

#foreachを使う
###foreachとは
配列の値を複数表示させる時に使います。

```php 
$members = [
  'name' => '鈴木',
  'height' => 172,
  'hobby' => '野球'
];
foreach($members as $member){
  echo $member;
}
```
説明すると、`$members`という連想配列があったとして、`foreach`の`($members as $member)`とありますが、これは`$members`を`$member`という変数で展開するという事です。従って、変数`$member`は`$value`等配列に関係性のあるものの名前にすると分かりやすいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629307/0bb6b9c9-dcd3-1126-2db2-15041f745a59.png)
ブラウザで見るとこのように表示されます。`$members`のバリューが表示されているのが分かります。
では、バリューだけでなくキーの値も取得したい場合はどうかけば良いでしょうか。

```php 
$members = [
  'name' => '鈴木',
  'height' => 172,
  'hobby' => '野球'
];
//キーとバリューそれぞれ表示
foreach($members as $member => $value){
  echo $member . 'は' . $value;
}
```
このように書きます。`$member`に`=> $value`と追加されているのがわかると思います。
ではこれをブラウザで見るとどうでしょうか。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629307/054df57a-8227-d577-bc92-9bf954bc842f.png)
このようにキーとバリュー両方の値が取得出来ているのが分かります。


```php 
$members_1 = [
  '鈴木' => [
    'height' => 172,
    'hobby' => '野球'
  ],
  '田中' => [
    'height' => 168,
    'hobby' => '野球'
  ]
];
}
```
ではこのような場合はどうでしょう。

```php 
foreach($members_1 as $member){
  echo $member;
}
```
先ほど同様このようにかけば表示出来そうです。ではブラウザを見てみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629307/29c3d8f7-4061-f4f7-d41e-f3d525875094.png)
しかし期待したようには表示出来ませんでした。これは、`$members_1`という配列の中に`'鈴木'`と`'田中'`という配列があり、この配列も展開してあげなければいけないためです。そのため、`foreach`の中に`foreach`を書いて展開してあげる必要があります。

```php 
//多段階の配列を展開
foreach($members_1 as $member_1){
  foreach($member_1 as $member){
    echo $member;
  }
}
```
このように、多段階の配列を展開する場合はこのように`foreach`のなかに`foreach`で展開してあげるといいと思います。ブラウザはこのようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629307/edf067c0-965c-f6b8-05e3-b8af9cec91f5.png)
このように`'鈴木'`と`'田中'`の配列の値が取得出来ました。
キーとバリューを取得したい場合でも先ほどと同様に`=> $value`などをつけてあげると両方取得する事ができます。
今回はforeachについて自分なりに書いてみました。最後まで見ていただいてありがとうございます！！
ご意見、ご指摘等ありましたらどんどんお願いします！
「このプロジェクトのコードは、64ビットシステムで使用するために更新する必要があります。Declareステートメントの確認および更新を行い、次にDeclareステートメントに PtrSafe 属性を設定してください。」の対処

# 既存のマクロ付きExcelを違う環境で動作させようとすると

このようなエラーが出ることがある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617980/3536fd83-e5e2-f37d-36e3-b468e0009620.png)

## 64bit版で動作させるにはPtrSafe 属性が必要

これは64bit版のExcelでこのマクロを動かすには、DeclareステートメントにPtrSafeをくっつけてくださいということ
そのまんまですね

## 置換などを使ってDeclareの後ろにPtrsafeを付ける

こんな感じ

```vb:
Private Declare PtrSafe Sub sample
```

### 追記　(2020/05/06)
Declareの後ろにPtrsafeを付けるだけでなく、使用している関数を基にLong型の引数や返り値の一部をLongPtrに変更する必要があるようです。
どの引数をLongPtrに変更すべきかは
https://www.microsoft.com/en-us/download/details.aspx?id=9970
でダウンロードしたファイルを実行すると
C:\Office 2010 Developer Resources\Documents\Office2010Win32API_PtrSafe フォルダーに 「Win32API_PtrSafe.TXT 」ができるので、それを参考にすると良いそうです。

### 参考サイト
・WindowsAPI をOffice64bit版または32bit版のVBAで使うには | hatena chips
"https://hatena19.com/use-win-api-with-office-64bit-or-32bit-vba/"
Azure Kubernetes ServiceのWindowsコンテナがGAされたので動かしてみる

Azure Kubernetes ServiceのWindowsコンテナーがGAされたので試してみました。
[公式ページ](https://docs.microsoft.com/ja-jp/azure/aks/windows-container-cli) 通りでいけますが、注意点など書き残しておきます。

# 前提として
WindowsノードだけのAKSクラスターは作ることができません。必ずLinuxベースのクラスターが必要で、そこにWindowsコンテナー用のノードプールを追加する形になります。
また、現時点では既存のAKSクラスターにWindowsノードプールを追加することはできないようです。
AKSクラスター初期作成時に、Windows認証プロファイルを指定して作らなければいけません。
それでは早速やってみましょう。

# 事前準備
GAされましたが、執筆時点ではAzure CLIはプレビュー機能を登録する必要があります。これはそのうち不要になると思います。

* aks-preview CLI拡張機能をインストールする

```
az extension add --name aks-preview
az extension update --name aks-preview
```

* Windowsのプレビュー機能を登録する

```
az feature register --name WindowsPreview --namespace Microsoft.ContainerService
az provider register --namespace Microsoft.ContainerService
```

# AKSクラスター作成
以前 [Azure Kubernetes Service(既存仮想ネットワーク)をAzure CLIで構築する](https://qiita.com/shingo_kawahara/items/bcbb49c8bfe292a50ab9) という記事を書いているので、これに倣って作成していきます。

注意しなければならないのが、AKSクラスター作成時にWindows認証プロファイルを指定しなければならないことです。
AKSクラスター作成コマンドは以下のように指定します。

```
az aks create `
    -n [AKS Cluster Name] `
    -g [Resource Group Name] `
    -s Standard_B2s `
    --node-count 2 `
    --service-principal $APP `
    --client-secret $SECRET `
    --generate-ssh-keys `
    --kubernetes-version 1.15.10 `
    --dns-name-prefix [DNS Prefix] `
    --vnet-subnet-id $SUBNETID `
    --network-plugin azure `
    --service-cidr 172.16.100.0/24 `
    --dns-service-ip 172.16.100.10 `
    --docker-bridge-address 172.16.101.1/24 `
    --workspace-resource-id $WORKSPACE `
    --enable-addons monitoring \
    --windows-admin-username azureuser \
    --windows-admin-password [Password] \
    --vm-set-type VirtualMachineScaleSets \
    --load-balancer-sku Standard
```

* Windows認証プロファイルが設定されていることを確認します。

```
az aks create -n [AKS Cluster Name] -g [Resource Group Name]
```

* 以下のようにWindows認証プロファイルが設定されていればOKです。

```
  "windowsProfile": {
    "adminPassword": null,
    "adminUsername": "azureuser"
  }
```

# Windowsノードプール追加

この時点でLinuxベースのノードプールが追加されています。このクラスターにWindowsノードプールを追加します。

* Windowsノードプールを追加します

```
az aks nodepool add -g [Resource Group Name] \
    --cluster-name [AKS Cluster Name] \
    --os-type Windows \
    --name [任意のNodePool Name] \
    --node-count 2 \
    --kubernetes-version 1.15.10
```

* Windows Serve 2019のノードが追加されていることを確認します

```
kubectl get node -o wide
```

[公式ページ](https://docs.microsoft.com/ja-jp/azure/aks/windows-container-cli) にサンプルアプリケーションがあるので、kubectl applyでデプロイして動作することを確認します。
点から円への接点を求める(sympyの行列)

(参考)点から円への接点を求める
https://qiita.com/tydesign/items/5ce4bd2cc58902606895
(参考)アフィン変換/平行移動だって変換行列で
https://qiita.com/yuba/items/7fb6a49adfda8fa466d8

以下について、もっと短くなる方法を教えて下さい。

# 点から円への接点を求める(sympyの行列)同次座標でやってみる。
sxは、直角三角形の相似形を使っています。
小座標大座標変換です。
中心(3,2) から点 (15,5) に向かって、左側右側です。

```
from sympy import *
var('x0 y0 x1 y1 r s tx ty c s d sx sy')
x0=3
y0=2
r=5
x1=15
y1=5

d=sqrt((x0-x1)**2+(y0-y1)**2)
sx=r*r/d
sy=sqrt(r*r-sx*sx)
v=solve([c*0-s*0+tx-x0,s*0+c*0+ty-y0,c*d-s*0+tx-x1,s*d+c*0+ty-y1],[c,s,tx,ty])
c=v[c]
s=v[s]
tx=v[tx]
ty=v[ty]

A=Matrix([
     [c,-s,tx],
     [s, c,ty],
     [0, 0, 1]
])
# 左側
B=Matrix([
      [sx],
      [sy],
      [ 1]
])
print(      (A*B)[0] ,      (A*B)[1] )
print(float((A*B)[0]),float((A*B)[1]))
# 右側
B=Matrix([
       [sx],
       [-sy],
       [ 1]
])
print(      (A*B)[0] ,      (A*B)[1] )
print(float((A*B)[0]),float((A*B)[1]))
# -40*sqrt(2)/51 + 253/51 127/51 + 160*sqrt(2)/51
# 3.851597205981886 6.926944509405788
# 40*sqrt(2)/51 + 253/51 -160*sqrt(2)/51 + 127/51
# 6.069971421469094 -1.9465523525430433
```


# あとから、数値をまとめて代入する方法
```
from sympy import *
var('x0 y0 x1 y1 r s tx ty c s d sx sy')

d=sqrt((x0-x1)**2+(y0-y1)**2)
sx=r*r/d
sy=sqrt(r*r-sx*sx)
v=solve([c*0-s*0+tx-x0,s*0+c*0+ty-y0,c*d-s*0+tx-x1,s*d+c*0+ty-y1],[c,s,tx,ty])
c=v[c]
s=v[s]
tx=v[tx]
ty=v[ty]

A=Matrix([
      [c,-s,tx],
      [s, c,ty],
      [0, 0, 1]
])
# 左側
B=Matrix([
       [sx],
       [sy],
       [ 1]
])
AB=A*B
print(AB[0])
print(AB[1])
print(AB[0].subs([(x0,3),(y0,2),(r,5),(x1,15),(y1,5)]))
print(AB[1].subs([(x0,3),(y0,2),(r,5),(x1,15),(y1,5)]))
print(float(AB[0].subs([(x0,3),(y0,2),(r,5),(x1,15),(y1,5)])))
print(float(AB[1].subs([(x0,3),(y0,2),(r,5),(x1,15),(y1,5)])))

# 右側
B=Matrix([
     [sx],
     [-sy],
     [ 1]
])
AB=A*B
print(AB[0])
print(AB[1])
print(AB[0].subs([(x0,3),(y0,2),(r,5),(x1,15),(y1,5)]))
print(AB[1].subs([(x0,3),(y0,2),(r,5),(x1,15),(y1,5)]))
print(float(AB[0].subs([(x0,3),(y0,2),(r,5),(x1,15),(y1,5)])))
print(float(AB[1].subs([(x0,3),(y0,2),(r,5),(x1,15),(y1,5)])))

# 3.851597205981886
# 6.926944509405788
# 6.069971421469094
# -1.9465523525430433
```


#せっかくなので?sympy.geometryを使った方ががいいかも
製作中
(参考)sympyで円と円の交点
https://qiita.com/mrrclb48z/items/fca16b65c9186954fedc
#エクセルの逆行列inverse関数を使えば、vbaを使わず、表計算でできる。はず。
誰か、やってませんか?
今更だけどTDD導入（失敗編）

# はじめに

自動テストの導入事例に基づく反省と結果をつらつらと書きます。
コストに対するメリットや、そもそも必要なのかは別の話。

|環境|内容|
|:--|:--:|
|OS|Linux|
|開発環境|Eclipse|
|リポジトリ|GitLab|
|FW|SpringBoot|
|FW|Junit|

# 新規システム構築時に導入

### 結果

|自動テスト内容|結果|
|:--|:--:|
|実装|〇|
|指標|△|
|継続|×|


半年くらいでメンテされなくなり、続かなかった・・・。工数は通常より膨らむし、
導入結果の計測できず、だんだんとお荷物扱いに。

テストの指標や共通処理の実装に時間をかけた結果、初期導入は上手くいった。
**初期導入さえ上手くいけば、後は勝手に回り出すと思ったのが間違い。**
改修する内に修正もれがあったり、後回しにされたり、微妙な感じになってしまった。

![コメント 2020-05-02 004613.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630252/3f56cbf7-7abe-dcd5-8a9b-1867f728aca7.png)

### 反省・気づいたこと

どうしてもテスト内容に目が行きがちになってしまうが、
**TDDの導入過程で一番大切なことは、中身ではなく仕組みなんだなぁ・・・**と気づく。

また、今回って**一番経験している人が多い失敗パターンだと思う。**
カバレッジなどの指標や共通処理は、あるに越したことはないが馴染んだ後でも十分間に合いそう。
仕組みを考えた結果は、「成功編」で記事書きます。

>今更だけどTDD導入（成功編）
https://qiita.com/ilohas20983/items/365beea2756e00a7bfab
GKEクラスタを kubectl で扱えるよう登録する方法

## 概要

kubectlを使ってGKEクラスタのマスターと通信出来るようにする。
具体的には `kubectl config current-context` で該当のGKEクラスタがセットされるようにする。

逆に言うと、クラスタを作成してもこの作業を行わなければ kubectl で操作できない。


## 前提

- kubectl がインストールされている
- gcloud がインストールされている

GKEでの方法です。EKSやAKSなどはまた別の手順があるので、そちらを参考にしてください。

## 手順

ざっくりいうと

0. クラスターが存在する GCP プロジェクトに切り替えして、
1. kubeconfigエントリを取得して、
2. kubectl で扱えるかを確認する

だけ。

### クラスターが存在する GCP プロジェクトに切り替え（gcloud）

```sh
gcloud config set project [ project_id ]
```


### kubeconfigエントリの取得（GKEクラスタ未作成の場合）


gcloud コマンドを使ってクラスタを作成すると `kubeconfig` にkubeconfigエントリが格納される。

kubeconfigエントリは後述のコマンドから考えるにクラスターの認証情報と思われる。




```sh

$ gcloud container clusters create my-cluster # my-clusterはクラスタ名

Creating my-cluster...done
Fetching cluster endpoint and auth data.
kubeconfig entry generated for my-cluster
```


### kubeconfigエントリの取得（GKEクラスタ作成済の場合）


すでに作成済のクラスタからkubeconfigエントリを習得する場合は以下のコマンド。

```sh

$ gcloud container clusters get-credentials my-cluster # my-clusterはクラスタ名

Fetching cluster endpoint and auth data.
kubeconfig entry generated for my-cluster.
```

このコマンドでkubeconfigエントリが生成される。


```
$ kubectl config get-contexts
CURRENT   NAME                                                                    CLUSTER                                                                 AUTHINFO                                                                NAMESPACE

*         project_asia-northeast1-a_my-cluster                          project_asia-northeast1-a_my-cluster                          project_asia-northeast1-a_my-cluster

```

### kubectl で扱えるかを確認する

`kubectl config current-context`で該当のGKEクラスタがセットされていることが確認できる。

```sh

$ kubectl config current-context
project_asia-northeast1-a_my-cluster
```


クラスタの切り替えはぶっちゃけ面倒なので [kubectx](https://github.com/ahmetb/kubectx) を使うと楽。

```
$ brew install kubectx
```


kubectx だけを打つと、登録されているクラスタの一覧が表示される。

```sh
$ kubectx
project_asia-northeast1-a_my-cluster
project_asia-northeast1-b_your-cluster
project_asia-northeast1-c_our-cluster
```

いずれかを選択すると、スイッチ出来る。

```sh
$ kubectx project_asia-northeast1-c_our-cluster
Switched to context "project_asia-northeast1-c_our-cluster"

$ kubectx project_asia-northeast1-a_my-cluster
Switched to context "project_asia-northeast1-a_my-cluster"
```



## 参考

https://cloud.google.com/kubernetes-engine/docs/how-to/cluster-access-for-kubectl?hl=ja#generate_kubeconfig_entry

https://qiita.com/sonots/items/f82912367693d717ff06
CloudNATをTerraformでつくる

## Cloud NAT is 何

[Cloud NAT](https://cloud.google.com/nat/docs/overview?hl=ja)はGCPのサービスのひとつであるクラウドNAT(Network Address Translation)である。

プライベートなネットワークを作成した時に、ネットワーク内からインターネットに接続するために作成する。
これによって外部IPを持たないGCEインスタンスやGKEクラスタがインターネットと安全に接続し、パケットを損失せずに受け取ることが出来る。

他社の類似サービスとして[AWS NAT ゲートウェイ](https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/vpc-nat-gateway.html)が挙げられるが、ちょっと概念と使い方が異なるので注意。


## いざ、Terraform化


Terraformで記述する場合、3つのリソースを組み合わせてCloud NATを作成する。


- NATルーター（[google_compute_router](https://www.terraform.io/docs/providers/google/r/compute_router.html)）
- NATアドレス（[google_compute_address](https://www.terraform.io/docs/providers/google/r/compute_address.html)）
- NAT（[google_compute_router_nat](https://www.terraform.io/docs/providers/google/r/compute_router_nat.html)）


またそもそもCloud NATを設置する前に、Cloud NATを設置するネットワークも必要。

それぞれTerraformで作成する。

まずはネットワークから。


```tf
resource "google_compute_network" "test_network" {
  name                            = test-network
  project                         = var.project_id
  auto_create_subnetworks         = false 
  delete_default_routes_on_create = false
}
```

auto_create_subnetworks=true にすると各リージョンに `10.128.0.0/9` の範囲から自動的にサブネットワークが生成される。 

またdelete_default_routes_on_create=trueにすると、ネットワーク生成後にデフォルトのルート（0.0.0.0/0）が削除される。

ここで注意点があるが、ネットワーク周りの命名（上記でいうとtest-network）はRFCに則る必要があるのでリソース名にアンスコ（ _ ）を入れることが出来ない。ここぞというばかりにエラーで怒られる。Terraform上のリソース名（上記でいうと test_network ）はアンスコが入っていても問題ない。



次にNATルーターを作成する。

```tf

resource "google_compute_router" "nat_router" {
  name    = "nat-router"
  project = var.project_id
  region  = var.region
  network = google_compute_network.network.self_link
}
```

networkに先程作ったネットワークのself_linkを貼る。


次にNATアドレス。


```tf
resource "google_compute_address" "nat_address" {
  name    = "nat-address"
  project = var.project_id
  region  = var.region
}
```


最後にNATを作成する。


```tf
resource "google_compute_router_nat" "nat" {
  name                               = "nat"
  project                            = var.project_id
  region                             = var.region
  router                             = google_compute_router.nat_router.name
  nat_ip_allocate_option             = "AUTO_ONLY"
  source_subnetwork_ip_ranges_to_nat = "ALL_SUBNETWORKS_ALL_IP_RANGES"
}
```

nat_ip_allocate_optionは `AUTO_ONLY` か `MANUAL_ONLY` を渡す。
AUTO_ONLYの場合、NATに割り振る外部IPアドレスをGCPが自動で調整してくれる。MANUAL_ONLYの場合はそれをユーザがやることになる。

source_subnetwork_ip_ranges_to_natはサブネットワークごとにNATをどのような設定にする。
`ALL_SUBNETWORKS_ALL_IP_RANGES` は各サブネットワーク内の全てのIP範囲をNATに許可する。
`ALL_SUBNETWORKS_ALL_PRIMARY_IP_RANGES` は各サブネットワークの全てのプライマリIP範囲をNATに許可する。
 
nat_ip_allocate_option=MANUAL_ONLYにするともう少し設定を書く必要があるが、詳しくは[こちら](https://www.terraform.io/docs/providers/google/r/compute_router_nat.html)。
Docker で alpine の apk add に http_proxy 環境変数で Squid キャッシュを通す

alpine の `apk add` は http://dl-cdn.alpinelinux.org/alpine/v3.11/main/x86_64/APKINDEX.tar.gz などの `http://` サーバを参照します。`.tar.gz` ファイルや `.apk` ファイルを Squid でキャッシュすると、多数の `docker-compose build` を行うときにビルドを高速化できます。

`apk add` は内部で `wget` を使っているので、ビルド時に環境変数 `http_proxy` を渡すことで、プロキシを適用できます。

```sh
docker-compose build --build-arg http_proxy=http://192.168.xx.xx:3128
```

ただし、`docker-compose.yml` ファイルは `version: "2.2"` 以上を指定する必要があるようです。

```yaml
version: "2.2"
```

> ERROR: --build-arg is only supported when services are specified for API version < 1.25. Please use a Compose file version > 2.2 or specify which services to build.

または、`docker-compose.yml` ファイル内の各サービスごとに build するときは、`version: "2"` でも通ります。
点から円への接点を求める(wolframalphaで)

wolframalphaは、ブラウザieだと調子が悪いので、firefoxをおすすめします。
(参考)点から円への接点を求める
https://qiita.com/tydesign/items/5ce4bd2cc58902606895
(参考)sympyで円と円の交点
https://qiita.com/mrrclb48z/items/fca16b65c9186954fedc


#【例】中心(3,2) 半径 5 の円に対して、点 (15,5) から引いた２つの接線の接点を求める。

方法1:全部変数
Solve[{(x-x0)^2+(y-y0)^2=r^2,(x-x1)^2+(y-y1)^2=(x0-x1)^2+(y0-y1)^2-r^2},{x,y}]
https://ja.wolframalpha.com/input/?i=Solve%5B%7B%28x-x0%29%5E2%2B%28y-y0%29%5E2%3Dr%5E2%2C%28x-x1%29%5E2%2B%28y-y1%29%5E2%3D%28x0-x1%29%5E2%2B%28y0-y1%29%5E2-r%5E2%7D%2C%7Bx%2Cy%7D%5D
結果:
解けたみたい(表示省略)

方法2:連立方程式６つ
Solve[{(x-x0)^2+(y-y0)^2-r^2==0,(x-x1)^2+(y-y1)^2-(x0-x1)^2-(y0-y1)^2+r^2==0,x0==3,y0==2,r==5,x1==15,y1==5},{x,y}]
https://ja.wolframalpha.com/input/?i=Solve%5B%7B%28x-x0%29%5E2%2B%28y-y0%29%5E2-r%5E2%3D%3D0%2C%28x-x1%29%5E2%2B%28y-y1%29%5E2-%28x0-x1%29%5E2-%28y0-y1%29%5E2%2Br%5E2%3D%3D0%2Cx0%3D%3D3%2Cy0%3D%3D2%2Cr%3D%3D5%2Cx1%3D%3D15%2Cy1%3D%3D5%7D%2C%7Bx%2Cy%7D%5D
結果:
x≈3.8516 ∧ y≈6.92694
x≈6.06997 ∧ y≈-1.94655

方法3:連立方程式2つ
(x-3)^2+(y-2)^2=5^2,(x-15)^2+(y-5)^2=(3-15)^2+(2-5)^2-5^2
https://ja.wolframalpha.com/input/?i=%28x-3%29%5E2%2B%28y-2%29%5E2%3D5%5E2%2C%28x-15%29%5E2%2B%28y-5%29%5E2%3D%283-15%29%5E2%2B%282-5%29%5E2-5%5E2
結果:
x≈3.8516, y≈6.92694
x≈6.06997, y≈-1.94655

方法4:方法1に,座標の値を代入する方法
？誰か教えて下さい。

失敗1:実行結果:次をお試しください：
Solve[{(x-x0)^2+(y-y0)^2==r^2,(x-x1)^2+(y-y1)^2==(x0-x1)^2+(y0-y1)^2-r^2,x0==3,y0==2,r==5,x1==15,y1==5},{x,y}]
https://ja.wolframalpha.com/input/?i=Solve%5B%7B%28x-x0%29%5E2%2B%28y-y0%29%5E2%3D%3Dr%5E2%2C%28x-x1%29%5E2%2B%28y-y1%29%5E2%3D%3D%28x0-x1%29%5E2%2B%28y0-y1%29%5E2-r%5E2%2Cx0%3D%3D3%2Cy0%3D%3D2%2Cr%3D%3D5%2Cx1%3D%3D15%2Cy1%3D%3D5%7D%2C%7Bx%2Cy%7D%5D
失敗2:実行結果:次をお試しください：
Solve[{(x-x0)^2+(y-y0)^2=r^2,(x-x1)^2+(y-y1)^2=(x0-x1)^2+(y0-y1)^2-r^2=0,x0=3,y0=2,r=5,x1=15,y1=5},{x,y}]
https://ja.wolframalpha.com/input/?i=Solve%5B%7B%28x-x0%29%5E2%2B%28y-y0%29%5E2%3Dr%5E2%2C%28x-x1%29%5E2%2B%28y-y1%29%5E2%3D%28x0-x1%29%5E2%2B%28y0-y1%29%5E2-r%5E2%3D0%2Cx0%3D3%2Cy0%3D2%2Cr%3D5%2Cx1%3D15%2Cy1%3D5%7D%2C%7Bx%2Cy%7D%5D
covid19の感染状況を可視化(2020-05-01)

#### covid19の感染状況を可視化(2020-05-01)

Metabaseで、covid19の感染状況を可視化してみました。

データは、signateの現在のデータを使用しました。
https://signate.jp/competitions/260#abstract

データは作成・整備中で、必ずしも正確性を保証するものでは、ありません。

***
【環境】
Linux: debian10
データベース: sqlite3(分析用のデータの格納)
・Metabaseの本体で使用するデータベースは、付属のものを使用
・作成したグラフの出力は、画面キャプチャーにしています。

**ダッシュボード: 格納したデータの幾つかのグラフです。**

![感染状況の概要.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624077/9cec06ab-4691-1ae4-0ea2-85027c5065f1.png)

**グラフ1.症状の傾向**
分かっている範囲では、どういった症状が多く報告されているのかのグラフです。

![症状の傾向.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624077/1e8d31a0-db68-63c4-0918-abdd2c142fe1.png)

**グラフ2.患者同士の関係性の分布**
感染したと思われるルートが分かると思います。

![関係性の分布.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624077/491013b2-2b3c-d239-5194-99026e6a93d1.png)

***

画面キャプチャーですので、画面左側の数字が見えにくいと思いますので、グラフの数字を記述したいと思います。

### 1.症状の傾向

無回答・不明以外、症状なしは、その他に含まれます。

**症状の傾向**

- 発熱: 14.64%
- 発熱・肺炎: 4.60%
- 咳: 3.26%
- 発熱・咳: 3.21%
- その他: 74.29%

①22.45%(発熱、発熱・肺炎、発熱・咳)
②4.6%(発熱・肺炎)
発熱、若しくは発熱を含む事例が一番多いと言えると思います。
発熱・肺炎に含まれていますが、次いで、肺炎を含む症状が多いと言えると思います。

### 2.関係性の分類

同居人や別居となっていない場合の家族は、含めていません。

**患者同士の関係性**

同僚: 12.55%
施設利用者: 4.82%
親族: 4.74%
医療従事者と患者: 3.57%
入所者: 3.24%
社会福祉施設の職員・入所者: 3.24%
職員・利用者: 2.58%
その他: 65.25%

①13.85%(施設利用者、入所者、社会福祉施設の職員・入所者、職員利用者)
②12.5% 同僚 

家族や同居人以外だと、介護・福祉施設と仕事での感染が多いと言えると思います。
その他、同じ会社・客と店員等も含めると職場と介護施設と同程度と言えると思います。

***

このMetabaseですが、データ分析をするあたって、またsignateに投稿するにもグラフ化するツールを探していました。

分析自体もそうですが、グラフ化も結構、大変な様に思います。
幾つかグラフ化するツールを試してみる過程で「Metabase」を知りました。

グラフ化が簡単で、色々と試してみながら、分析が出来ます。
私が作成したものは、全てGUIだけで作らてたものですが、機能としては、SQL文を記述する事も出来ます。

グラフ化のツールですが、pandasのデータフレームをプロット出来ないものがあったり、色々とパラメーターの記述が必要だったり、「Metabase」の場合は、RDBMSかSQLiteが必要で、どちらかというと動作も軽いとは言えないと思うので、結局また、pandasのplot関数でプロットしています。

しかし、データが出来てしまえば「Metabase」のデータベースに格納・グラフ化したり、出来上がった表やグラフから「sqlやcsv」での出力も出来ます。
pandasやsqlも使いながら、これらのツールを併用すれば、新たな発見がある様に思います。

<font color=blue>**SIGNA1E COVID19チャレンジ**</font> 
日本国内のCOVID-19罹患者数と患者間の関係データに関する、マシンリーダブルかつデータ分析可能な最大規模のデータセットの構築を目指します。
https://signate.jp/competitions/260#abstract
データは作成・整備中で、正確性を保証するものでは、ありません。

以上、Metabaseで、covid19の感染状況を可視化(2020-05-01)でした。
【2020年版】v-modelをカスタムコンポーネントで実装しよう

# カスタムコンポーネントでv-model使いたいのに難しくない？

公式のドキュメントをみてもパッと見つからないし、いろんなゴリ押し代替案があってコードが煩雑になる…
と思いきやカスタムコンポーネントでもきちんとv-modelを利用する綺麗な手法がありました。

ほぼ備忘録的な記事ですが、お役に立てれば幸いです。

#手順
### すっ飛ばして見たい方は``childComponent.vue``のコードを参照してください。

``model``プロパティという物が公式の機能にありました…いつ実装されたんだろうか。
ともかくこれをコンポーネント内で使います。

parentComponent.vue内でchildComponent.vueを使う構成です。

```vue:parentComponent.vue
<template>
<div class="parentComponent">
    <childComponent v-model="modelvalue" />
</div>
</template>

<script>
import childComponent from 'path/to/childComponent'
export default {
    components: {
        childComponent,
    },
    data() {
        return {
            modelvalue: 'このプロパティをコンポーネント間で授受します。',
        }
    },
}
</script>
```

```vue:childComponent.vue
<template>
<div class="childComponent">
    <input @input="emitValue" :value="modelvalue" />
</div>
</template>

<script>
export default {
    //以下のmodelプロパティが今回の主役です。
    model: {
        prop: 'modelvalue',
        event: 'emit-text'
    },

    //propsプロパティにmodelプロパティ内で指定したプロパティを作成
    props: {
        modelvalue: {
            type: String //お好みのデータ型で
        }
    },

    methods: {
        emitText(e) {
            //modelプロパティで指定したイベントをthis.$emitメソッドで飛ばします。
            this.$emit('emit-text', e.target.value)
        },
    }
}
</script>
```

ちなみに``textarea``要素でも同様に動作します。``textarea``要素には本来、value属性はありませんが上記の``input``要素と同じようにvalueへ``modelvalue``をバインドすることでv-modelを利用できます。

# 注意点
1. 上のコードを利用する場合、``childComponent.vue``の``input``タグ内にある``emitValue``を``emitValue()``と記述しないようにしてください。イベントがメソッドに渡されず動きません。
2. ``childComponent.vue``の``model``プロパティの``prop``、``event``の値は**文字列**で指定してください。
PHPStormのオフィシャルの日本語化プラグインで文字化けした話

すこーし前に、JetBrainsから公式の日本語化プラグインが出ました。
この日本語化プラグインを私のphpstromにも適用しようとしたところ、問題が発生したので内容を共有します。

# 現象について

以下のように日本語化プラグインを入れて再起動すると一部文字がおかしくなる

<img width="733" alt="貼り付けた画像_2020_05_01_15_59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7056/58442ada-1f17-c310-4916-401ac04bb37a.png">

# 解決した方法

とりあえず先に解決した方法。

`~/Library/Application Support/JetBrains/PhpStorm2020.1/phpstrom.jdk`を削除することでこの問題は解決します。

# とりあえず日本の代理店のサムライズムに問い合わせた。

問い合わせたところ、Invalidate and Restartでキャッシュを消して再起動してみる方法と一度他のDLプラグインを無効化することを提案されました。

なお、この対応ではこれは解決しませんでした。

# 設定、キャッシュ類を消す

上記で解決しない場合に設定、キャッシュ類をバックアップして消して再インストールしてみてほしいと書いてありました。

設定類の場所に関しては以下のリンクで説明されています。
[JetBrains IDEが設定、キャッシュ、プラグイン、ログを保存している場所 – 株式会社サムライズム](https://support.samuraism.com/hc/ja/articles/360024442254-JetBrains-IDE%E3%81%8C%E8%A8%AD%E5%AE%9A-%E3%82%AD%E3%83%A3%E3%83%83%E3%82%B7%E3%83%A5-%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3-%E3%83%AD%E3%82%B0%E3%82%92%E4%BF%9D%E5%AD%98%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E5%A0%B4%E6%89%80)

まず、とりあえず2020.1よりも前の設定ファイルを消すことにしました。
なお私の環境はmacです。

```
設定: ~/Library/Preferences/[製品名][バージョン]
キャッシュ: ~/Library/Caches/[製品名][バージョン]
プラグイン: ~/Library/Application Support/[製品名][バージョン]
ログ: ~/Library/Logs/[製品名][バージョン]
```

後になってわかりますが、影響があるのは設定の部分でした。このときはすっきりさせるためにも全部消しました。
(なお、こいつらが残ってると2020.1の設定類を消しただけだと前のバージョンの設定を引っ張ってきてしまうのでクリーンになってくれません)

次に2020.1のファイルを全部他のディレクトリへ移動させました。

こうすることで設定がクリーンになるため、影響がなくなります。
この初期状態に対して日本語化プラグイン(初期状態ではMaketに何故か存在しないので直接DLした)を入れたところ問題なく日本語になりました。

# 原因を探った

原因が謎だったので、先程バックアップしたディレクトリを一つづつ配置し直してみて、設定の部分で何かがおきてることを把握。

あとはもう地道な作業ですね。中身のディレクトリを一つ一つ適用していきました。。。
そこまで多いわけでもなかったのでそんなに苦ではなかった。

それで`phpstorm.jdk`というファイルが悪さをしていることがわかります。

`phpstorm.jdk`は2020.1では初期では存在しないファイルなので、いつこのファイルが入ってしまったのかわからないです。ググった感じだとjdkをセットしたらできるみたいな記載があったのですがそういうのやったっけなぁ・・・って感じです。

phpstorm.jdkの中身は単純にパスを記載しているだけで、`~/jdk`となっており中身のjdkのバージョンは`1.8.0_202`。
とりあえずjdkのバージョンが問題だとわかりました。

現状のPATHが通ってるJavaのバージョンを確認したら

```
$ java --version
java 10.0.2 2018-07-17
Java(TM) SE Runtime Environment 18.3 (build 10.0.2+13)
Java HotSpot(TM) 64-Bit Server VM 18.3 (build 10.0.2+13, mixed mode)
```

となっていてなるほどな、、、といった感じです。(これも古くないか・・・？)

まあ色々ためしてみて、原因がわかったし、最小限の削除だけで設定を復帰させることができたので良かったです。
ローディング画面実装

#行ったこと

- ローデング画面の実装

#コード

HTML

```
<!-- ローディング用 -->
<div id="loading">
<!-- ローディング中に表示する画像-->
  <img src="example.gif" alt="loading">
</div>

<!-- コンテンツ-->
<div id="contents" class="hidden">
  <h1>example</h1>
</div>
```
CSS

```
#loading {
width: 100%;
height: 100%;
background-color: #fff;
position: relative;
}

#loading img {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}

.hidden {
display: none;
}
```

JavaScript

```
// ローディング画面のdivを取得
const loading = document.getElementById('loading');
const contents = document.getElementById('contents');

window.addEventListener('load', function () {
loading.style.display = 'none';
contents.classList.remove('hidden');
});
```

#プラグイン(pace.js)を使用する場合

- pace.js
https://github.hubspot.com/pace/docs/welcome/
https://cdnjs.com/libraries/pace

- CDNでpace.jsと使いたいテーマのcssをheadに記述のみ

```
<script src="https://cdnjs.cloudflare.com/ajax/libs/pace/1.0.2/pace.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/pace/1.0.2/themes/black/pace-theme-center-circle.min.css" />
```
EC2とRDSを使用し、RailsアプリをAWSにあげる際に詰まった点　-その2-　

#●はじめに
下記の記事を参考にEC2とRDSへを使用しRailsアプリをAWSにデプロイする際に詰まった点と、その解消方法をまとめました。
[世界一丁寧なAWS解説。EC2を利用して、RailsアプリをAWSにあげるまで](https://qiita.com/naoki_mochizuki/items/f795fe3e661a3349a7ce)

#3.データベースの作成・接続ができない(RDSとRailsの接続)
RDSを使用したため、参考サイトの記述されているMySQLの設定方法とは異なる方法で実装する必要があります。
RDSとRailsの接続時に気にする大きなポイントは2つです。

###1.RDSのセキュリティグループで、EC2インスタンスのブライベートIPからの接続を許可してあるか

セキュリティーグループは、AWS consoleからRDSを開き、DB選択すると確認できますね。
![スクリーンショット 2020-05-01 23.16.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553621/eb289207-2b89-fdf9-40a8-6e35b4ab8b6d.png)

###2.database.ymlのproductionに、RDSのDB名(DB識別子)、ユーザ名、パスワード、host名(エンドポイント)が正しく記述されているか

```ruby:database.yml
production:
  <<: *default
  database: ~~~~~~~~~~~~~~~~
  username: ~~~~~~~~~~~~~~~~
  password: <%= ENV['DB_PASSWORD'] %>
  host: <%= ENV['DB_HOST'] %>
```
DB識別子・エンドポイントは先ほど表示した、RDSの画面から確認できますね！
ユーザー名・パスワードはRDS作成時に入力したものです。

直打ちはやめてしっかりと環境変数で管理しましょう。
**環境変数は、ローカルで設定したものは反映されません。本番環境で設定しましょう。**

#4.Nginxの起動・停止コマンド
参考にしたサイトには以下のようになっています。

```
$ sudo service nginx start
```

しかしCentOS7以上を使用している場合は、こちらのコマンドで実行する必要があります。

```
$ sudo systemctl start nginx
```

※CentOSの確認方法に関しては、記事を見つけました。
[Linux (CentOS) の OS バージョンを確認する方法](https://qiita.com/hachiya/items/78f44bcee6d496f724b4)

そして一番重要な点は、**起動と停止コマンドを必ず同じにしてください**

つまり、serviceで起動したら

```
$ sudo service nginx stop
```

systemctlで起動したら

```
$ sudo systemctl stop nginx
```

を入力し停止します。再起動時も同様です。

ここで異なる方法で停止してしまうと、ゴミファイルが生まれてしまい、エラーが生じることがあるようです。
自分はそれで起動も停止も再起動もできない状態になりました・・・
その際はとりあえずkillコマンドで片っ端から削除し、解決しました。

#●まとめ
以上が[世界一丁寧なAWS解説。EC2を利用して、RailsアプリをAWSにあげるまで](https://qiita.com/naoki_mochizuki/items/f795fe3e661a3349a7ce)を参考に実装し、詰まった点です。

とてもわかりやすい記事なので、この記事を中心に実装し、この記事や他記事で補填すればなんとか実装できるかと思います。ポートフォリオ作成中の皆さん、がんばってください！
RetropieでPPPSPをやろうと思ったらパッドの入力がおかしくてハマった

明日からゴールデンウィーク！
ということで久々にRaspberryPiを引っ張り出してRetroPie環境を構築。
PSPを大画面でできる環境をつくろう！と思ったところハマったので記録として残しておきます。

# 今回使ったもの
- Raspberry Pi 3B+
- SDカード
- 電源、HDMIケーブル
- ゲームPad(自分が使用したのは[コレ](https://www2.elecom.co.jp/peripheral/gamepad/jc-u3412s/)　※生産終了)
- キーボード
- マウス
- 無線LAN環境

# RetroPie環境を構築
以下のQiitaの記事が詳しいので、こちらを参考に環境構築しました。

>Raspberry Pi で RetroPie を構築する方法
https://qiita.com/zono_0/items/c8787d7c2cd158d2bcbf

※コントローラ設定をしたところ、なぜかアナログスティックの上下が逆に認識されました。
　(多分コントローラのせい)

# PPPSPをインストール
以下の手順でできます。

- RetroPie-Setupを起動
- ManagePackage→OK
- opt→OK
- pppsp→OK
- Install from pre-built binary

# PPPSPを起動。。。が何やらおかしい。
Samba経由でゲームのイメージをRaspberryPi上に配置して起動。

左アナログスティックを押し込む(LEFT THUMBに設定したボタン)と、
PPPSPのコンフィグ画面に入ります。

コントローラのアナログスティックが上下逆に認識されてしまうせいか、
コンフィグ画面の上下も逆です。
やりづらいけど、マッピングを上下逆にすればゲームはできるのでセーフ。
※コンフィグ画面はマウスでも操作できるので、それも活用しました。

決定ボタンがY(PSでいうと□)ボタンで操作されてしまうため、
非常にやりづらい。
Controls→Control mappingで〇×△□のマッピングを設定しなおす。
(それでも×が決定だからやりづらいのだけども)

# 割と致命的な問題が発生
で、ここで問題点に気づく。
パッドの十字キーがまったく認識されない！

コントローラ設定もうまくできているし、
ファミコンのエミュを試しにやってみたところ、ちゃんと認識される。

やろうと思ってたのはギレンの野望なので、十字キーがおせないと操作がつらい。。。

# トラブルシューティングにトライ
コントローラのせいだと思うのだけども、
せっかくなので手持ちのコントローラで解決できるかトライ。

ネットサーフィンしたところ、以下のブログ記事を発見。
なるほど、パッドに対応した設定を作るとうまく認識してくれるらしい。
(Teraterm経由で画面転送する方法に疎かったので、わざわざRaspberryPiにキーボードを接続して実施。)

>Ubuntu上のPPSSPPでPS3用コントローラ（有線）を使えるようにしてみた
https://setsuna-no-matataki.hateblo.jp/entry/2019/05/24/004401

補足としては、
Retropieの場合、/opt/retropie/emulators/ppsspp/assets/にgamecontrollerdb.txtが来るようです。

```none:コマンドライン
pi@retropie:~ $ cd /opt/retropie/emulators/ppsspp/assets/
pi@retropie:/opt/retropie/emulators/ppsspp/assets $
pi@retropie:/opt/retropie/emulators/ppsspp/assets $ ls -l | grep gamecontrollerdb.txt
-rw-r--r-- 1 root root   53807 May  1 15:21 gamecontrollerdb.txt
```

で、ブログの手順を実施してみたところ。。。！
できた～！十字キーが認識された！

でもやっぱり〇×△□のマッピングがおかしいので設定しなおす。
あれ、左スティックを押し込んでもコンフィグ画面に入らない。。。

キーボードでEscキーを打ち込んだらコンフィグ画面に入れました。
でもやっぱりアナログスティックは上下逆のまま。。。汗

# 長かった。。。
無事にPPPSPを手持ちのパッドでできるようになりました。

めでたしめでたし！
Excel設計書からの脱却案

# はじめに
地方でSIerをしています。以前からQiitaで情報を集めていましたが、
何かしらアウトプットをしようと思い記事を書くことにしました。
Qiitaの投稿に不慣れなため、何か気になる点があればご指摘いただけると嬉しいです。

# 現在の運用
言語はC#、IDEはVisual Studio 2017。
設計書はExcel方眼紙で作成しており、サーバー上に共有し管理しています。
ソースファイル(とソリューションファイル)はgitで管理しています。
設計は別のメンバーが行うこともあれば、コーディング担当者が行うこともあります。
設計に関わるメンバーにはいずれも開発環境があります。

# 現在の問題点(解決したい課題)
- 編集したいタイミングで誰かが開いていたら待ち時間が発生する。  
  (あるいは、閉じてもらうようお願いする作業が発生する。)
- 変更が入るたびに罫線などのレイアウトを変更しなければならない。
- 場合によっては印刷後のことも考慮して調整したりしなければならない。
- 変更履歴は別シートで管理しているが、その記載も漏れなく行う必要がある。
- 変更点のメンテ以外のこういう**本質的ではない作業**は無駄であるし、面倒くさい。

# 脱却案
**ソリューションファイル内にMarkdownファイルを含めて、まとめてバージョン管理する。**

これで、上記の問題点は解消できると思います。
具体的には、「Documents」などのフォルダを作って、そこにコーディング規約[^1]や設計書をすべて保存するようにします。

[^1]: コーディング規約は個々人が好き勝手に変更できないように、PDFなどで配布するのもアリかと思います。いずれにせよ、「ローカルで参照できる」のが理想だと思います。

こうすることにより、

- 任意のタイミングで設計書のメンテを行える。
- 罫線などレイアウトを考慮する必要がなくなる。
- バージョン管理に含めることにより、コミットメッセージで変更点を的確に記載できる。また、履歴も一目瞭然である。

といったメリットを得ることができるかと思います。
また、ソリューションファイル内に含めることにより、サーバーの設計書を開いて修正→ローカルでソース修正ではなく、ローカルで設計書もソースも変更でき、集中力も途切れにくいかな…といった思惑もあります。

# 懸念点
- 設計書が納品物に含まれている場合、特に指定されていない場合でも暗黙的にExcelを要求されることが多いかも…。
- 生のMarkdownでは納品できない場合、HTMLやPDFに変換する作業が発生する。どうしてもExcelでなければならないならExcelに変換する。
- (私も含めて)Markdownで設計書レベルのことをしっかり記載できるか。メンバーのスキルの問題。
- Markdownでも画像や表を扱えはするものの、ドキュメントとしての単純な表現力ではExcelの方が優れている。

ぱっと上記の点が思い浮かびますが、他にもあるかもしれません。
が、少なくとも上記の点に関しては、デメリットよりもメリットの方が大きいかなと思っています。

# まとめ
とりあえず、趣味で書いているプログラムはこの運用で行っていますが、それで開発が捗りそうであれば打診してみようと思います。
むしろ上に説得してその気にさせるのが一番大変なのですが…。

今回の脱却案以外に、もし他に良い案や「うちではこうやってるよ」などがありましたら、教えていただけると嬉しいです！

## その他
ブログとCrieitでも記事を公開しているので、よければご覧ください。

ブログ：BOYISH KINGDOM

https://boyi.sh

Crieit：apashoni

https://crieit.net/users/apashoni
【Day66】積み上げ日記

##予定
■Udemy（セクション２１、２２）
ー広告を実装する
ークロージャーを深く理解する

##完了
■Udemy（セクション２１、２２）
ー広告を実装する
ークロージャーを深く理解する（途中）

##学習時間
４h

##学習ポイント
■クロージャー
Firebaseの記述方法

■ログインした後、ナビゲーションバーを消す方法

■カスタムセルの作成方法

■メッセージを受け取る機能

※別記事で報告予定


##参考記事
■ TableVeiwCellの高さを可変する
https://qiita.com/yum_fishing/items/6f7d6fe63b53a4a29c6d
逆引き Spacemacs

最近VimからSpacemacsに移行しました．
そこで，調べるのに苦労した設定や使い方を逆引きでまとめました．
今後も適宜更新していきます．

Spacemacsでvimキーバインド(evil)を使っている人を対象としています．`SPC`を使うキーバインドについては，Emacsキーバインドの人は`M-m`で読みかえてください．

キーバインドは`C-c`のように表記します，`SPC`はスペースキーを示します．

# 目次

[設定ファイルの編集と更新](#設定ファイルの編集と更新)
[同梱されていないカラーテーマを使いたい](#同梱されていないカラーテーマを使いたい)
[Vimキーバインドが使えなくなった](#vimキーバインドが使えなくなった)
[複数のプロジェクトを切りかえたい](複数のプロジェクトを切りかえたい)
[メニューバー，ツールバーを表示したい](メニューバー，ツールバーを表示したい)

## 設定ファイルの編集と更新

`SPC f e d`で設定ファイルが開きます(.spacemacs)．
編集が終わったら，`SPC f e R`で再起動することなく設定を更新できます．

## 同梱されていないカラーテーマを使いたい

themes-megapack layerを追加してインストールすることで，大抵のカラーテーマが使えるようになります．

## Vimキーバインドが使えなくなった

`C-z`でvim <-> emacsキーバインドが切りかわります．
うっかり押すことが多く，気付くまで一々再起動してました．

## 複数のプロジェクトを切りかえたい

同時に複数のタスク(プロジェクト)を平行して進める場合，一つのVimやEmacs上に全てのファイルを開くと，移動が面倒になります．

筆者がSpacemacsを使う前は，tmux上でウィンドウを切りかえて，複数のVimを起動させ，複数のプロジェクトを管理していました．
 
Spacemacsには，layoutという概念があり，一つのemacsインスタンス中で，プロジェクトごとに，ウィンドウの配置や，バッファを切りかえることができます．
`SPC l`で，Layouts Transient StateというLayout管理モードに入ります．
ここで，`l` を押してレイアウト名を入力することで，新しいレイアウトを作ることができます．
また，`SPC l a`で，その時カーソルの置かれたバッファがレイアウトに追加されます．
レイアウトの切りかえは，レイアウトごとに割りふられる番号を`SPC l 2`のように指定します．
その他のキーバインドも，`SPC l ?`で説明が表示されます．

## メニューバー，ツールバーを表示したい

何の設定もしていない素のEmacsでは，起動時にメニューバーやツールバーが表示されます．
SpacemacsではSpaceを起点にしたコマンドで操作が完結するためか，非表示になっていますが，あえて表示させることもできます．
`SPC T m`でメニューバーが，`SPC T t`でツールバーの表示を切りかえることができます．
`SPC T`コマンドはUIに関する切りかえコマンドの集合になっており，他に画面の透明度を切りかえるコマンドなどがあります．
【swift5】xocde11 消費税計算

<img width="772" alt="Tax画像.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/627010/6f7b5758-a960-8ddf-ac2c-819e9b69ada2.png">

<img width="1440" alt="tax2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/627010/c7ab4cb2-ae57-f78b-820e-f3113b998619.png">

<a href="https://www.youtube.com/watch?v=T6IXWms05yI">参考動画</a>

【学んだ点】
・小数点以下を非表示にするためには整数型のInt型を使う
ゼロから始めるLeetCode Day8 「1302. Deepest Leaves Sum」

#概要
海外ではエンジニアの面接においてコーディングテストというものが行われるらしく、多くの場合、特定の関数やクラスをお題に沿って実装するという物がメインである。

その対策としてLeetCodeなるサイトで対策を行うようだ。

早い話が本場でも行われているようなコーディングテストに耐えうるようなアルゴリズム力を鍛えるサイト。

せっかくだし人並みのアルゴリズム力くらいは持っておいた方がいいだろうということで不定期に問題を解いてその時に考えたやり方をメモ的に書いていこうかと思います。

[Leetcode](https://leetcode.com/)

基本的にeasyのacceptanceが高い順から解いていこうかと思います。

前回
[ゼロから始めるLeetCode Day7 「104. Maximum Depth of Binary Tree」](https://qiita.com/KueharX/items/539024dbb9a91305a86a)

# 問題
[1302. Deepest Leaves Sum](https://leetcode.com/problems/deepest-leaves-sum/)

初のMediumです。
今回の問題もgoodの数が多く、いい問題だと思ったので解いてみました。

問題は至って簡単で、二分木が与えられるので最も深い葉の合計値を返してくれってことですね。~~最近木関連の問題が多い気がする・・・~~
なお、例は以下の通り
`Input: root = [1,2,3,4,5,null,6,7,null,null,null,null,8] Output: 15`

この場合は最も深い葉が7と8なので足して15、ということですね。

![1483_ex1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412789/69ec4ff6-89d6-4bb0-4efb-d2f64296bbe2.png)


問題をパッとみた感じでは深さ優先探索で一通り全ての葉の深さを調べて深さと値を返す、というのが簡単な考え方かなぁと思いました。
ただ、それでは少し冗長なコードになってしまう気がしましたし、深さを調べるときに同時にハッシュテーブルを使えば深さと値を両方保持できて効率的に書けるのでは？と思い実装してみました。


```Python
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def deepestLeavesSum(self, root: TreeNode) -> int:
        ans = {}
        count = 0
        self.dfs(root,ans,count)
        
        return ans[max(ans)]
        
    def dfs(self,node,ans,count):
        if node:
            if node.left:
                self.dfs(node.left,ans,count+1)
            if node.right:
                self.dfs(node.right,ans,count+1)
        if count not in ans:
            ans[count] = node.val
        else:
            ans[count] += node.val
# Runtime: 104 ms, faster than 46.02% of Python3 online submissions for Deepest Leaves Sum.
# Memory Usage: 17.4 MB, less than 100.00% of Python3 online submissions for Deepest Leaves Sum.
```
dfs関数の中でcountのインデックスと等しければ加算、それ以外の場合は値をそのまま代入する、という形式を取りました。
ansの中での最大値を返せば最終的に最も深い葉の値が返ってくる、というものです。
しかし、この答えではあまり速くないですね・・・

discussを観測した範囲では以下の回答がPythonで最速ではないかと思います。

```Python
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def deepestLeavesSum(self, root):
        q = [root]
        while q:
            pre, q = q, [child for p in q for child in [p.left, p.right] if child]
        return sum(node.val for node in pre)
# Runtime: 84 ms, faster than 98.04% of Python3 online submissions for Deepest Leaves Sum.
# Memory Usage: 17.3 MB, less than 100.00% of Python3 online submissions for Deepest Leaves Sum.
```

にしてもめちゃくちゃ速いですね・・・
今のところはこんなコード書けそうにないですが、こういったコードを読めるのは非常に面白いですね。

こうしたらこんなに速くなったよ！という例がありましたらコメント欄でコードとメモリ消費量とランタイムを書いて工夫した点を教えていただけると幸いです。
PHP Laravel 基礎

#前提
Laravelでアプリを作っていた時に学んだことを殴り書きしていきます。


#本題

ミドルウェアとは
アプリケーションへ送信されたHTTPリクエストをフィルタリングする、便利なメカニズムを提供してくれるもの。
ブラウザ経由で来たリクエストをコントローラーに処理が行く前に何らかの処理を追加できる機能。
ログイン認証のミドルウェア。

storeメソッド
Laravelでは慣習的にstoreメソッドはデータをデータベースへ挿入する際、よく使われるメソッド名です。

insertメソッド
insertメソッドはデータベースに新しいレコード（行）を追加するメソッド。

アップロードした画像はハッシュ名（ランダムな名前）で保存したいため、どのレビューとどの画像が紐付くのかをデータベースに保存しておく必要がある。
ハッシュ名で画像を保存する理由としては、セキュリティのため。
わかりやすい名前で保存してしまうと直接URLにアクセスされてしまう等のセキュリティリスクが上がるため、ランダムな名前で保存する。


論理削除
論理削除とは実際にはデータを削除せずに、削除されたと見なすフラッグと呼ばれるカラムを設定することでユーザーには削除しているかのように振る舞わせることを指す。

デバッグ関数 dd()

compactの引数に変数名を指定することでビューで変数が使えるようになる。

foreach(展開したい配列 as 1つずつ取り出した時の変数)
展開したい配列は複数形で書いて、展開したあとの変数は単数形で書くとわかりやすい

get()の代わりにpaginate(数を指定)を使う事で、自動的にページネーションを生成。

RDSの説明
RDSはAWSのデータベースサービス。

RDSを使うことで、開発環境とは異なる構成で本番環境を構築できる。

開発環境ではLaravelとMySQLが同じサーバー内にある。
同じサーバーにある方が管理はしやすいですが、本番環境を想定すると負荷がかかった時に不安がある。
また、データベースを別インスタンスに分けた方が仮に攻撃者に侵入された際のダメージが少なくなる。
さらにアプリケーション（PHP）とデータベースは運用するサービスによって負荷の度合いが異なる。
そのため、あらかじめ分けておいた方が負荷のかかった際にスケーリング（スペックアップなど）がしやすいため、アプリケーションとデータベースを分けるメリットがある。
yukicoder contest 246 参戦記

# yukicoder contest 246 参戦記

## [A 1040 垂直大学](https://yukicoder.me/problems/no/1040)

まあ、90度か270度だけが垂直なので書くだけですね.

```python
N = int(input())

t = N % 360
if t == 90 or t == 270:
    print('Yes')
else:
    print('No')
```

## [B 1041 直線大学](https://yukicoder.me/problems/no/1041)

N≤100 なので、全ての2点の組み合わせを試せばいいだけなので特に悩むことはありませんね. 当然二点を通る直線の方程式なんて忘れてしまっているのでググりました. 通ったかどうかの判定に適当に `< 0.0001` を使ったけど、本来どうするべきだったのかな.

```python
N = int(input())
XY = [list(map(int, input().split())) for _ in range(N)]

result = 0
for i in range(N):
    for j in range(i + 1, N):
        x1, y1 = XY[i]
        x2, y2 = XY[j]
        if x1 == x2:
            result = max(result, len([None for x, y in XY if x == x1]))
            continue
        t = 0
        for k in range(N):
            x, y = XY[k]
            if abs((y2 - y1) / (x2 - x1) * (x - x1) + y1 - y) < 0.0001:
                t += 1
        result = max(result, t)
print(result)
```

## [C 1042 愚直大学](https://yukicoder.me/problems/no/1042)

見るからに、にぶたんですねーとしか言いようがない問題. 安全を取って `> 0.000001` を `> 0.0000001` にすると精度が足りなくて無限ループになるのか TLE になるのがエグい. is_ok のなかでさらっと 10 ** 35 がでてきてるけど平気なのが Python の楽なところですね.

```python
from math import log2


def is_ok(N):
    return N * N <= Q * log2(N) * N + P


P, Q = map(int, input().split())

ok = 1
ng = 10 ** 18
while ng - ok > 0.000001:
    m = (ok + ng) / 2
    if is_ok(m):
        ok = m
    else:
        ng = m

print(ok)
```

## [D 1043 直列大学](https://yukicoder.me/problems/no/1043)

乾電池と豆電球について、DP によって合計電圧及び合計抵抗の全ての組み合わせの数を求める. 各電圧毎に A, B から抵抗の範囲が求まるので、その電圧の組み合わせの数 * その範囲の抵抗の組み合わせの数を積算したのが回答となる. その範囲の抵抗の組み合わせの数は累積和をしておけば *O*(1) で求まる. 以下、PyPy なら TLE にならずに AC するコード.

```python
N, M = map(int, input().split())
V = list(map(int, input().split()))
R = list(map(int, input().split()))
A, B = map(int, input().split())

vt = {}
vt[0] = 1
for v in V:
    nvt = vt.copy()
    for k in vt:
        nvt.setdefault(k + v, 0)
        nvt[k + v] += vt[k]
    vt = nvt
del vt[0]

rt = {}
rt[0] = 1
for r in R:
    nrt = rt.copy()
    for k in rt:
        nrt.setdefault(k + r, 0)
        nrt[k + r] += rt[k]
    rt = nrt
del rt[0]

ra = [0] * (100000 + 1)
for k in rt:
    ra[k] = rt[k]

for i in range(1, 100000 + 1):
    ra[i] += ra[i - 1]

result = 0
for k in vt:
    rlow = (k + B - 1) // B - 1
    rhigh = k // A
    if rlow == -1:
        result += ra[rhigh] * vt[k]
    else:
        result += (ra[rhigh] - ra[rlow]) * vt[k]
    result %= 1000000007
print(result)
```
Rails 「Strong Parameters」につて

# はじめに
日々のアウトプットとしての記録です。
初学者なので記載に間違いなどがありましたら、指摘いただけると幸いです！

#記事の目的
ストロングパラメータって？？？
なんだかよくわからん。。。
いろいろと調べて、自分なりの理解を記事にまとめます。

#ストロングパラメータの必要性
>Strong parametersを用いることで、Action Controllerのパラメータが許可されるまでActive Modelの「マスアサインメント」に利用されることを禁止できます。つまり、多くの属性を一度に更新したい場合は、どの属性のマスアップデートを許可するかを開発者が明示的に指定しなければなりません。大雑把にすべての属性の更新を一括で許可してしまうと、外部に公開する必要のない属性まで誤って公開してしまう可能性が生じるため、そのような事態を防ぐための機能です。
引用　[railsガイド](https://railsguides.jp/action_controller_overview.html)

まあ、個人的に簡単にすると。。
####「意図しない更新や登録などをチェックする機能」
ってことですかね？？

#まとめ
まだまだ、理解が出来てないと感じた反面、これから多くのこと学べありとても楽しみです！
技術的にはとても低い記事ですが、小さなことでもアウトプットが大切だと思うのでこれからも継続したいと思います！