OmniAICreator/Qiita-1.07M huggingface dataset:
aws-serverless-expressのサンプル動かないんだけど

# 動かないやつ
https://github.com/awslabs/aws-serverless-express/tree/master/examples/basic-starter
`npm run setup`

# 出てたエラー
```
An error occurred (ValidationError) when calling the CreateChangeSet operation: Stack:arn:aws:cloudformation:ap-northeast-1:363880502757:stack/AwsServerlessExpressStack/aaaaaaaaaaaaaaaaaaa is in ROLLBACK_COMPLETE state and can not be updated.
npm ERR! code ELIFECYCLE
npm ERR! errno 255
npm ERR! aws-serverless-express-example@2.1.1 deploy: `aws cloudformation deploy --template-file packaged-sam.yaml --stack-name $npm_package_config_cloudFormationStackName --capabilities CAPABILITY_IAM --region $npm_package_config_region`
npm ERR! Exit status 255
npm ERR!
npm ERR! Failed at the aws-serverless-express-example@2.1.1 deploy script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     /Users/aaaaa/.npm/_logs/2020-05-17T15_40_32_799Z-debug.log
npm ERR! code ELIFECYCLE
npm ERR! errno 255
npm ERR! aws-serverless-express-example@2.1.1 package-deploy: `npm run package && npm run deploy`
npm ERR! Exit status 255
npm ERR!
npm ERR! Failed at the aws-serverless-express-example@2.1.1 package-deploy script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     /Users/aaaaaaaa/.npm/_logs/2020-05-17T15_40_32_816Z-debug.log
npm ERR! code ELIFECYCLE
npm ERR! errno 255
npm ERR! aws-serverless-express-example@2.1.1 setup: `npm install && (aws s3api get-bucket-location --bucket $npm_package_config_s3BucketName --region $npm_package_config_region || npm run create-bucket) && npm run package-deploy`
npm ERR! Exit status 255
npm ERR!
npm ERR! Failed at the aws-serverless-express-example@2.1.1 setup script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     /Users/aaaaaaaa/.npm/_logs/2020-05-17T15_40_32_832Z-debug.log
```

# 色々すっ飛ばして結論
- runtime のnodeバージョンが古い(サンプルの8系がサポート終わってる(直せや

# どうするか
- サンプルプロジェクト内の `cloudformation.ymal` の 60行目付近の `Runtime`を書き換える
  - `Runtime: nodejs8.10` -> `Runtime: nodejs12.x`
  - `x`がミソ。バージョン指定すると動かない

# は？動かないんだけど
- RollBack出来ないとかなんとかなので一回Stackを消してから `npm run setup`してみよう。

おわり
[備忘録]Python Anacondaを利用するまで

##インストール
下記からダウンロード
基本的にすべて「Next」連打
https://www.python.jp/install/anaconda/index.html
https://www.anaconda.com/products/individual
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559813/02b42895-9c54-cfbf-3e66-4b8a1bd3bc36.png)


## 開発環境
AnacondaについてくるJupyter Notebookを利用
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559813/131a137e-237e-e6c3-dca1-bc3fecbe50c1.png)

Jupyter Notebookを起動するとブラウザが立ち上がるので、New -> Python 3を選ぶ
http://localhost:8888/tree
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559813/77e7eb8d-7068-72e8-5d14-107c1d273ab5.png)

各セルに処理を書いてRunボタンで実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559813/caf36165-31e5-bf59-b1e0-7637e94e532d.png)

各セルの行番号表示は「esc」キー + l（エル）

## ライブラリ確認・追加
標準ライブラリ
https://docs.python.org/ja/3/library/index.html
外部ライブラリ
https://pypi.org/search/?q=python-docs&o=

Anaconda Promptから"conda list"
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559813/5e8185f2-ff72-6891-5caa-d538460548f4.png)

インストールは
conda install "library名"
Ruby と Python で解く AtCoder ABC168 A case式

# はじめに
*[AtCoder Problems](https://kenkoooo.com/atcoder/#/)* の Recommendation を利用して、過去の問題を解いています。
AtCoder さん、AtCoder Problems さん、ありがとうございます。
# 今回のお題
*[AtCoder Beginner Contest A - ∴ (Therefore)](https://atcoder.jp/contests/abc168/tasks/abc168_a)*
<font color="gray">Difficulty: 2</font>

今回のテーマ、case式
# Ruby
本戦では、`if`式で解いていますが、*[editorial](https://img.atcoder.jp/abc168/editorial.pdf)* に

```
余談ですが，Ruby では case 文がこれにあたり，もっと高機能です．
```
と書かれていますので、`case`で書いてみたいと思います。~~これまでに`case`を書いたことはないです~~
まずは、`if`

```ruby.rb
n = gets.to_i
n %= 10
if n == 3
  puts "bon"
elsif n == 0 || n == 1 || n == 6 || n == 8
  puts "pon"
else
  puts "hon"
end
```
```last.rb
n %= 10
```
10で割った余りで1の位を取得していますが、`gets.chomp`として文字列とし`n[-1]`とすることもできます。

```case.rb
n = gets.chomp
case n[-1]
when "3" then
  puts "bon"
when "0", "1", "6", "8" then
  puts "pon"
else
  puts "hon"
end
```
*[editorial](https://img.atcoder.jp/abc168/editorial.pdf)* の解説にある **高機能** とは`,`を用いて複数条件を指定することができるという意味です。
# Python
```python.py
n = int(input()) % 10
if n == 3:
    print("bon")
elif n in {0, 1, 6, 8}:
    print("pon")
else:
    print("hon")
```
pythonは`case`が無いようなので、似た感じにしてみました。
python の`in`は SQL の`in`に似ていますね。

# まとめ
+ ABC 168 A を解いた
+ Ruby に詳しくなった
+ Python に詳しくなった

参照したサイト
*[Python に switch や case 文がないのはなぜですか？](https://docs.python.org/ja/3/faq/design.html#why-isn-t-there-a-switch-or-case-statement-in-python)*
*[pythonにswitchはないけれど](https://qiita.com/Go-zen-chu/items/9bc7011616759dd2fc93)*
自社ドメインのメールアカウントをXserverで管理していて、G Suite（GMail）に飛ばしたい時

# 概要

* 手順通りにやってるのにGMailでメール受信されない
* 設定が有効になるまでの時間差もあるせいか、DNSの設定が正しいのか不安だ
* Xserver側でメールアカウント作成してなければいけないのかその辺が曖昧
* 小難しいドキュメント読み込むよりは動きを確認したりして推測して把握するタイプだ

# テストデータ用意

## Yahoo

### 作成済みアカウント一覧

* soushin.taro@yahoo.co.jp

## Xserver

### 作成済みアカウント一覧

* yamada.taro@gild.co.jp
* yamada.hanako@gild.co.jp


## G Suite

### 作成済みアカウント一覧

* yamada.taro@gild.co.jp
* yamada.hanako@gild.co.jp
* yamada.kotaro@gild.co.jp

# 検証

* （送信者）soushin.taro@yahoo.co.jp 
    * （受信者）yamada.taro@gild.co.jp
        * GMailで確認 => 受信されていた
    * （受信者）yamada.hanako@gild.co.jp
        * GMailで確認 => 受信されていた
    * （受信者）yamada.kotaro@gild.co.jp
        * GMailで確認 => 受信されていた

# わかったこと

* Xserver側で存在しないアドレスでも、Gアカウント作ればいける（個人的にはここがモヤモヤだった）
* GSuite導入前の既存メールへの過去の受信メールを、GMailと統合できないっぽい
* 一番低いプランで月額600円程度なので会社設立とかしたら妥協せずに真っ先に導入すべき
* スタートアップ時にGSuite導入するなら、契約サーバー側で作るメールアカウントはルートアカウントだけで良さそう
* メール受信されないときは最大７２時間待ってみよう（自分は2時間程度で反映された）

# 補足

* [XserverでG Suite(旧Google Apps)をお使いいただく場合](https://www.xserver.ne.jp/manual/man_domain_dns_setting_google_apps.php)
登録したプロフィールの入力データ編集時にパスワード認証なしでUPDATEする方法

#はじめ
HTMLやHAMLでCURRENT　PASSWORDに入力を省くはまずだが、それ以外にやるべきことが次にあります。

#1.

```registration_controller.rb
class RegistrationsController < Devise::RegistrationsController
  protected
    def update_resource(resource, params)
      resource.update_without_password(params)
    end
end
```

2.controllers: {registration: 'registrations'}

```routes.rb
Rails.application.routes.draw do
  root 'pages#home'
  
  devise_for :users,
             path: '',
             path_names: {sign_in: 'login', sign_out: 'logout', edit:'profile', sign_up: 'registration'},
             controllers: {registration: 'registrations'}

  resources :users, only: [:show]
end
```
GitHubのレポジトリーのmasterにpushができないようにする

# GitHubのレポジトリーのmasterにpushができないようにする

## 目的
maseterにpushするとCI/CDが走ってしまい勝手にデプロイされてしまう。気をつけていても間違ってmasterにpushしてしまうので、システム的にmasterにはpushできないようにする。(自分がadministratorでもできないようにする)

調べた結果、以下の方法1だけすれば良い気がします。

## 方法1；Branch protection rule
GitHubレポのsettings -> Branches で 

- Branch name pattern に master を設定して、
- Require pull request reviews before merging にチェックを入れて、
- Include administrators にチェックを入れる。(これにチェックを入れないと個人レポジトリーのオーナーではpushができてしまう。Organizationのレポジトリーでは未調査)

これだけでmasterへのpushはエラーとなります。

## 方法2：.git/hooks/pre-push
方法1はGitHubサーバー上で行う方法でした。こちらはクライアント側で行う方法です。

.git/hooks/pre-pushにpush前に実行されるスクリプトを置いて、pushしたときにmasterに対してのpushであれば中止する、ということが可能です。

ただGitHub上で実行されるわけではなくクライアントマシン上で実行されるものなので、どうやってスクリプトを配り、実行を強制させるのかは別で考えないといけません。

スクリプト自体は下の参考のリンクを参照ください。(僕は動作未確認です)

## 参考
Stack Overflowの質問
https://stackoverflow.com/questions/46146491/prevent-pushing-to-master-on-github

pre-pushのスクリプト
https://gist.github.com/vlucas/8009a5edadf8d0ff7430
draw.io (diagrams.net) の細かいテクニック

みんな大好き draw.io (diagrams.net) の細かいテクニックです。

ちなみに、2020年2月あたりから、[セキュリティ上の理由でサイトのドメインを diagrams.net に名称変更し始めている](https://www.diagrams.net/blog/move-diagrams-net)ので、アクセス先はこちらに変更したりしましょう。

## 非圧縮XML形式のデフォルト化

ダイアグラムをファイル保存すると、デフォルトでは圧縮されたXMLになっていますが、これだと差分の確認・バージョン管理がしづらいです。

メニューの「拡張 (Extras)」->「圧縮 (Compressed)」のチェックを外すと非圧縮形式になるので、新しいファイルを作るたびにこれを実行しても良いのですが、忘れないように非圧縮XML形式をデフォルトにすると良いでしょう。

メニューの 拡張 (Extras) -> Configuration で開く設定ダイアログに以下を記載すると、アプリの再読み込み以降は非圧縮形式がデフォルトになります。

```json
{
  "compressXml": false
}
```

## コンテナ化、子のリサイズ防止

ある図形の中に他の図形を配置しても、それぞれの図形は独立していて、親図形を移動させたりしても子図形は移動しません。

これを一体化して扱うために図形を「グループ化」する、というのは、Microsoft Office などでもお馴染みの手段ですが、この場合は完全に一つの図形になってしまうため、親をサイズ変更したりすると子も同じようにサイズ変更されたりします。

これが便利な場合もありますが、やっぱりそこは独立して扱いたいよね、という場合、親を「コンテナ」にして一緒に扱う手段があります。以下のように設定します。

1. 親図形のフォーマットパネルの「スタイル」タブを開く。
2. Property を開き、Container にチェックを入れる。
3. Resize Children のチェックを外す。
4. お好みで、Collapsible のチェックを外す。（チェックしていると図形を折りたためるようになりますが、図形の左上に折りたたみ用のボタンが出てしまいます）

コンテナ化された図形の中に、子にしたい図形をドラッグ＆ドロップすると、親子関係ができます。この状態で親だけ移動すれば、グループ化した場合と同じように子も一緒に移動できます。

一方で、Resize Children（子をリサイズする）の無効化により、親をリサイズしても子はリサイズされなくなります。

![Container example](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43355/fa215f53-e909-0e09-836e-4751679a02f4.gif)


## プレースホルダ

親図形やダイアグラム自体に設定したメタデータを参照する機能です。

1. 上の手順で、親図形をコンテナ化します。
2. 親図形の「データを編集 (Edit Data)」メニューから、適当なIDでデータを追加します。
3. 子図形の「データを編集」メニューで、「所有者 (Placeholders)」にチェックを入れます。
4. 子図形のラベルで、`%データID%` という形式（親に定義したデータのIDを `%` で挟む）の文字列が、親で定義したデータの内容に置換されるようになります。

![Placeholder example](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43355/130c2857-3ac6-7443-d9b8-ac8e08fc3b25.gif)


## Lineジャンプ

線と線が交差するときに、Visio などのように線を「またがせて」見やすくすることができます。

<img width="265" alt="Line Jump example" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43355/81787193-a91f-1324-065d-677e450bff66.png">

これは、前面にある方の線のスタイルで「Lineジャンプ (Line jumps)」を「なし (None)」以外に設定すれば有効にできます。上は「円弧 (Arc)」の例です。


## 数式

メニューの「拡張 (Extras)」-> 「数式組版 (Mathematical Typesetting)」を有効にすると、AsciiMath形式もしくはLaTeX形式で入力した数式を表示できます。

- AsciiMath: 数式をバッククオートで囲む
- LaTeX: 数式を `$$` で囲む、もしくは `\(` と `\)` で囲む

![Mathematical Typesetting example](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43355/822df3a8-133c-930b-f378-2a92cb43fb7d.gif)


詳しくは公式のFAQを参照ください。

https://desk.draw.io/support/solutions/articles/16000032875-how-to-use-mathematical-typesetting-
Dockerコンテナ内外でファイルコピーする方法

# Dockerコンテナ外から docker cp を使う場合

```
（例）コンテナ名がzen_allenの場合
$ docker ps
CONTAINER ID        IMAGE                         COMMAND             CREATED             STATUS              PORTS                  NAMES
843b51320bda        ct2034/vnc-ros-kinetic-full   "/startup.sh"       12 hours ago        Up 12 hours         0.0.0.0:6080->80/tcp   zen_allen
```

```
Dockerコンテナ外のファイルをDockerコンテナ内へコピー
$ docker cp test.txt zen_allen:/.
```

```
Dockerコンテナ内のファイルをDockerコンテナ外へコピー
$ docker cp zen_allen:/test.txt .
```

# Dockerコンテナ内から scp を使う場合

dockerコンテナ内だとdocker cpが使えないので代わりにscpを使用する

まずはdockerコンテナに入る

```
（例）コンテナ名を確認
$ docker ps
CONTAINER ID        IMAGE                         COMMAND             CREATED             STATUS              PORTS                  NAMES
843b51320bda        ct2034/vnc-ros-kinetic-full   "/startup.sh"       12 hours ago        Up 12 hours         0.0.0.0:6080->80/tcp   zen_allen
```

```
（例）確認したコンテナ名がzen_allenの場合
$ docker exec -it zen_allen /bin/bash
```

dockerコンテナでscpを使用する

```
（例）IPアドレス192.168.2.100, ユーザ名:pi, パスワード:pi へtest.txtをコピーする場合
# scp test.txt pi@192.168.2.100:~/.
pi@192.168.2.100's password: 
test.txt    100%    0     0.0KB/s   00:00 
```

```
（例）IPアドレス192.168.2.100, ユーザ名:pi, パスワード:pi からtest.txtをコピーする場合
# scp pi@192.168.2.100:~/test.txt .
pi@192.168.2.100's password: 
test.txt    100%    0     0.0KB/s   00:00    
```

# 参考
[cp — Docker-docs-ja 17.06.Beta ドキュメント](http://docs.docker.jp/engine/reference/commandline/cp.html)
[scp — Docker-docs-ja 17.06.Beta ドキュメント](http://docs.docker.jp/machine/reference/scp.html)
Windows10 開発環境メモ（自分用）

# Windows10 開発環境メモ（自分用）

自分用の開発環境のメモとリンク集です。
随時更新していく予定です。

## WSL2のインストール

https://www.asobou.co.jp/blog/web/wsl2
を参考にWindows10 version 2004にアップデート。
WSL2をインストールし、Windows StoreからUbuntu 20.04 LTSをダウンロード。

WindowsからUbuntuのファイルシステムへ用意にアクセスできるよう、
「\\\wsl$\Ubuntu-20.04」へのショートカットを作成しておいた。
https://qiita.com/Uchitaso/items/6e0a7859e87bb8bdb527

## IMEの設定

vimで日本語-アルファベットの切り替えが楽にできるよう、
以下を参考にMicrosoft IMEの設定でEscキーに「IMEオフ」を割り当て。
https://qiita.com/keita69sawada/items/6706b8537ad957abbee4

## フォント

HackGenのフォントをインストール。
https://github.com/yuru7/HackGen

Ricty Diminishedも試したが、WSL上では表示が若干細いように感じた。
https://rictyfonts.github.io/diminished

## Terminalの設定

Windows Terminalをインストール。
https://github.com/microsoft/terminal

ctrl+, でsettings.jsonを開き、
https://qiita.com/hideki0145/items/04582a26baf3d81632c1
を参考にdefaultProfileに「Ubuntu 20.04」のguidを設定。
その他、以下のようにカラースキーム等を設定。

```json:settings.json
    {
        ...
        "commandline": "wsl.exe ~ -d Ubuntu-20.04",
        "colorScheme": "Tango Dark",
        "fontFace": "HackGen Console",
        "fontSize": 14
        ...
    },
```

## Editorの設定

Visual Studio Codeをインストール。
https://azure.microsoft.com/ja-jp/products/visual-studio-code/

ctrl+, でsettings.jsonを開き、
Font Familyの先頭に「HackGen Console」を追加。

https://qiita.com/nj_ryoo0/items/a42c47436b77310f5430
を参考にRemote-WSLをインストールし、vscodeからWSL上のファイルを扱えるようにした。
Coursera Machine Learning メモ

Coursera の Machine Learningのコースを受ける際に役に立つサイトなどのメモ


### 数学の苦手なバイオの学生がCourseraの機械学習コースを修了して気づいたこと
https://qiita.com/katsu1110/items/423fc9ac567710a1bd9b

学習の予習・復習に

### まくまくOctaveノート
https://maku77.github.io/octave/

プログラミング課題用。Octaveのまとめ


### (27) Octaveでコマンドラインデバッグ
https://www.dogrow.net/octave/blog27/

プログラミング課題用。デバッグ大事

## Optimization Objective

ロジスティック回帰

コスト関数

```math
-y log \frac{1}{1 + e^{-z}} - (1-y)log(1 - \frac{1}{1 + e^{-z}})
```


$ y = 1 $ のとき

```math
-log \frac{1}{1 + e^{-z}}
```

![スクリーンショット 2020-06-07 16.11.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53267/e6f49803-adb7-8a75-82df-491c036676d1.png)


https://ja.wolframalpha.com/input/?i=-log%281%2F%281%2B+e%5E-x%29%29%E3%81%AE%E3%82%B0%E3%83%A9%E3%83%95%E3%82%92%E4%BD%9C%E6%88%90


$ y = 0 $ のとき

```math
-log(1 - \frac{1}{1 + e^{-z}})
```

![スクリーンショット 2020-06-07 16.12.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53267/f01a37c1-71b8-a303-c7b2-09a081fa5f50.png)


https://ja.wolframalpha.com/input/?i=-log%281+-+1%2F%281%2B+e%5E-x%29%29%E3%81%AE%E3%82%B0%E3%83%A9%E3%83%95%E3%82%92%E4%BD%9C%E6%88%90
【Golang】Switch文

#【Golang】Switch文
Golangの基礎学習〜Webアプリケーション作成までの学習を終えたので、復習を兼ねてまとめていく。 基礎〜応用まで。

```
package main
//swich
//if swichの違いは？
//簡単な分岐処理ならswitchの方がすっきりする。
//型アサーションができる。

/*
まず、Goでは選択されたcaseだけを実行し、それに続く全てのcase節は実行されない。
他の言語では各case節の最後にbreakステートメントを記述しますが、Goでは自動的にbreakが入る。
*/

import (
	"fmt"
	"time"
)


func main(){
	//今の時間取得
	t := time.Now()
	//今の時間の時間だけ取得
	fmt.Println(t.Hour())

	//switch 分岐
	switch {
	case t.Hour() < 12:
		fmt.Println("午前")
	case t.Hour() > 12:
		fmt.Println("午後")
	}



	n := 1

    switch n {
	case 1:
	    n += 1
		fmt.Println("3以下")
	case 2:
		n += 1
		fmt.Println("3以上")
	default:
		fmt.Println("default")
	}
	fmt.Println(n)
}
```
【Day72】積み上げ日記

【今日やること】
■写真共有SNSを作成する

【確認すること】
■カメラのアクションビューを実機で確かめる。

■Contentモデルをなぜ作成するのか。
－initの役割は？
－Contentsクラスの役割は？
－postDataStringって？
>>投稿日時
React(gatsby.js)でhighlight.jsを使う

### 実装

highlight.jsを追加する。今回はES6以上で書きます。
さらに初歩的なところを知りたい方は[こちらのブログを読んでください](https://www.takeru-note.site/blog/highlight-js/)。

```
// npmモジュール追加
yarn add highlight.js
```

今回はコードハイライトを使用する機会が記事のページでしか使わないため、Util的なものは実装せずに直接該当のReact Componentに突っ込む。
`useEffect`がわからない方は[こちら](https://ja.reactjs.org/docs/hooks-reference.html#useeffect)を確認してください。

```Article/index.jsx
import hljs from 'highlight.js/lib/core';
import javascript from 'highlight.js/lib/languages/javascript';
import 'highlight.js/styles/atom-one-dark.css';

hljs.registerLanguage('javascript', javascript);

const ArticleComponent = () => {
    useEffect(() => {
        hljs.initHighlighting();
    });
    return <Article />;
}
```

ここでは`hljs.initHighlighting()`を使うようにしてください。
`hljs.initHighlightingOnLoad()`の実態はDOMContentLoaded時に`initHighlighting()`を呼び出すように`addEventListener`するだけのものです。
しかし、おそらくReactの仕組み上、要素がアクセス可能になるタイミング、いわゆるマウント済みになるタイミング（componentDidMount）とDOMContentLoadedのタイミングが同じではないため、リスナーがあってもハイライト処理がReactのマウント時より前に走ってしまうようです。
なので、呼び出す際は上記のようにReactのマウント時に`initHighlighting`を実行するようにします。
するとこんな感じでハイライトしてくれます。何となくよくあるハイライトだと思ったので`atom-one-dark.css`を選んでます。こちらの例のスタイルがそれになります。
![highlight-js-demo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243100/2738adde-cac2-6784-7c20-40bab24d5f45.png)
また、今回の実装だと初回時のみにハイライトをしてくれますが、初回以降上記のコードだとハイライトしてくれなくなります。これはhighlight.jsのインスタンスが初期化以降は処理を走らせないようにフラグを用いてテキストのパース処理をスキップしているためです。
今回は初回以降もパースしてもらわないといけない要件なのでフラグを折りに行きます。

```Article/index.jsx
import hljs from 'highlight.js/lib/core';
import javascript from 'highlight.js/lib/languages/javascript';
import 'highlight.js/styles/atom-one-dark.css';

hljs.registerLanguage('javascript', javascript);

const ArticleComponent = () => {
    useEffect(() => {
        hljs.initHighlighting();
        // React環境だと初回以降ハイライト処理が入らないため外部からフラグをfalseに
        hljs.initHighlighting.called = false;
    });
    return <Article />;
}
```

こんな感じに実装すると初回以降もハイライトしてくれるようになります。
アウトローな実装になりましたが、今回はこんなところで問題なく動いているので開発を終了しました。

>[公式ドキュメント](https://highlightjs.org/usage/)
【Day71】積み上げ日記

【今日のやること】
■AutoLayoutの実装方法

■タイマーアプリのマルチデバイス対応実装

■アップルストア公開準備
−スクリーンショット
−エラー確認
https://www.it-swarm.dev/ja/ios/%E3%82%A8%E3%83%A9%E3%83%BCitms90717%EF%BC%9A%E3%80%8C%E7%84%A1%E5%8A%B9%E3%81%AAapp-store%E3%82%A2%E3%82%A4%E3%82%B3%E3%83%B3%E3%80%8D/833784541/

■チャットアプリの作成
−ユーデミーの続きをやる
g++: internal compiler error: Abort trap: 6 signal terminated program cc1plus

# この記事について
c++で書いたコードをgccでコンパイルした際に生じたエラーの解決方法のメモです。

#エラー文
```shell-session:
$ g++ -std=c++14 test.cpp
```
上記のようにg++コマンドを使いtest.cppファイルをコンパイルをしようと試みたら以下のエラーが出てきました。

```
dyld: Library not loaded: /usr/local/opt/isl/lib/libisl.21.dylib
  Referenced from: /usr/local/Cellar/gcc/9.2.0_2/libexec/gcc/x86_64-apple-darwin19/9.2.0/cc1plus
  Reason: image not found
g++: internal compiler error: Abort trap: 6 signal terminated program cc1plus
Please submit a full bug report,
with preprocessed source if appropriate.
See <https://github.com/Homebrew/homebrew-core/issues> for instructions.
```


#解決法
```shell-session:
$ brew reinstall gcc
```
で直りました。数ヶ月g++コマンドを使っていなかったので何が原因なのかわかりませんでした。調べてみると、このエラーはbrewの更新やgccのバージョン、シンボリックリンクが原因になっているようです。
railsでアプリを作る際にdbを指定する方法

#railsでアプリを作る際にdbを指定する方法
簡単なことなのですが、よくDB指定を忘れてアプリを作ってしまう私への戒めの備忘録です、、、。

##データベースの指定
rails newをする際に、データベースを指定してアプリを作ります。
何も指定しないとデータベースのデフォルトはsqliteになるので、Mysqlなどを使いたい時に行います。

例

```
$ rails new アプリ名 --database=mysql
```

簡略化した書き方でこういうのもあります。
例

```
$ rails new アプリ名　-d mysql
```

こっちの方が簡単でいいですね、-dはデータベースの意味です。

簡単に備忘録として書かせていただきました。
【MySQL】当日、数日前の日付をタイムゾーン変換する

#Abstract
以下の条件でテストデータを作成する。

Database Version: **MySQL5.7**
System Timezone: UTC(変更せず)
Local Timezone: JST
Volume：**数百**レコード
Requests：テストを1日で終わないため、いつでもINSERTする時、つねに当日(JST)、または当日から数日、数ヶ月前の指定時刻(`yyyy-MM-dd 00:00:00`)の`TIMESTAMP`型の日付でカラム(UTC)を更新する。
#Introduction
要望をよくみると、
1. (UTC)実行時の当日日付(e.g.`yyyy-MM-02 12:59:59 UTC`)を取得
2. (JST)指定時刻の当日日付`yyyy-MM-02 00:00:00 JST`へ変換
3. (UTC)日付を変換し、`yyyy-MM-01 15:00:00 UTC`でINSERTする

という流れで明らかにした。

#Methods
##No.1
JSTはUTCより**9時間**進んでいることはさきに知っておけば、この方法が分かりやすくなると思われる。

**当日**

```sql
INSERT INTO `table_name` (colume_name) VALUES (TIMESTAMPADD(HOUR,-9,CONCAT(DATE(TIMESTAMPADD(HOUR,9,NOW())),' 00:00:00')));
```

**数日前、数か月前**
開始日付から減算される間隔値を指定する式は、`DAY`や`MONTH`などを使用する。1日前を例として挙げる。下の方法も同様。

```sql
INSERT INTO `table_name` (colume_name) VALUES (TIMESTAMPADD(HOUR,-9,CONCAT(DATE(DATE_SUB(TIMESTAMPADD(HOUR,9,NOW()),INTERVAL 1 DAY)),' 00:00:00')));
```

##No.2
時差は調べたくない場合は、`'+00:00'`を`'UTC'`に、`'+09:00'`を`'Asia/Tokyo'`に書き換えられる。ただし、[適切に設定する](https://dev.mysql.com/doc/refman/5.7/en/time-zone-support.html)必要がある。

**当日**

```sql
INSERT INTO `table_name` (colume_name) VALUES (CONVERT_TZ(CONCAT(DATE(CONVERT_TZ(NOW(),'+00:00','+09:00')),' 00:00:00'),'+09:00','+00:00'));
```

**数日前、数か月前**

```sql
INSERT INTO `table_name` (colume_name) VALUES (CONVERT_TZ(CONCAT(DATE(DATE_SUB(CONVERT_TZ(NOW(),'+00:00','+09:00'),INTERVAL 1 DAY)),' 00:00:00'),'+09:00','+00:00'));
```

##No.3
要望から知って、指定時刻は`00:00:00`である。それに、`CURRENT_DATE()`と`NOW()`をさらに詳しく理解されている場合、No.1をこのような形に変更できる。

**当日**

```sql
INSERT INTO `table_name` (colume_name) VALUES (TIMESTAMPADD(HOUR,-9,DATE(TIMESTAMPADD(HOUR,9,CURRENT_DATE()))));
```

**数日前、数か月前**

```sql
INSERT INTO `table_name` (colume_name) VALUES (TIMESTAMPADD(HOUR,-9,DATE(DATE_SUB(TIMESTAMPADD(HOUR,9,CURRENT_DATE()),INTERVAL 1 DAY))));
```
#Conclusions
独特な案件要望ではないかと思われているかもしれないが、上記いずれの方法でテストデータを作成すると、いつになっても、データを一々直さなく、指定した日付のものをINSERTできると考えられた。

#Appendices
[1. MySQL 5.7 Reference Manual  /  Functions and Operators  /  Date and Time Functions](https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html)
[2. 世界のタイムゾーンと主要都市の時差を計算](https://www.jisakeisan.com)
【Laravel・Eloquent】modelの関数名になぜscopeをつけるのか

#scopeの定義方法

```php
class Hoge extends Model {
  public function scopeFuge($query, $code) {
    //処理
  } 
}
```

関数名にscopeを追加し、引数```$query```と```$code(引数名は自由)```を定義します。

#引数
###$queryとは
この引数は、whereで取得されるのと同じBuilderインスタンスが渡されます。

###$code(引数名は自由)
コントローラから渡された引数がこの値に代入されます。

#例

Person.php(Model)

```php

class Person extends Model {

    public function scopeNameEqual($query, $str) 
        {
            return $query->where('name', $str);
        }
}
```

PersonController.php(Controller)

```php

use App\Person;

class PersonController extends Controller {
    
    public function search(Request $request) {
        $item = Person::nameEqual($request->input)->first();
        //〜その他処理は割愛〜
        return view('person.find, $param);
    }
}
```

scopeを呼び出す時は、関数名のscopeを省略します。

#なぜscopeを使うのか

scopeを使うことにより、上記の2つの引数が利用できるようになります。
クラウド版のEclipse Theiaをデスクトップアプリとして使う

Eclipse Theiaを「[GCP上にVS Code OnlineのようなCloud IDEを作ってみる](https://qiita.com/koduki/items/1530ca0a71d7f18b2064)」でGCPにインストールして利用してるのだけど、やはりブラウザのタブだとウインドウの切り替えとかが少し面倒。
UI的にもアドレスバーとかが邪魔だしね。

というわけで[Epichrome](https://github.com/dmarmor/epichrome)でWebアプリ版のTheiaをデスクトップアプリとして扱えるようにしてみます。

EpichromeはFluidなどと同じくWebアプリをそのままラップしてデスクトップアプリとして利用できるツール。要は単なるWebViewだけのデスクトップアプリ。
Electronでももちろんできるのだけど少し手間がかかるので、アドレスバーを消したいとかのレベルだったらこっちのがずっと楽。

導入は以下のbrewコマンドでOK.

```bash
brew cask install epichrome
```

これでOK.あとはepichromeを起動したらアプリケーションの配置先や参照するURLが確認されるのでウィザードに沿って作業すればデスクトップアプリが完成です。
Electronで頑張るよりずっと楽で良いね！

それではHappy Hacking!

## 参考

- [Fluid で物足りないなら epichrome を使えばいいじゃない](https://qiita.com/kitsuyui/items/86451573ed6d39b90a87#_reference-2a807a8f6d8a2502ac11)
- [Mac: Chromeブラウザの大量のタブをEpichrome.appですっきりさせよう](https://techracho.bpsinc.jp/hachi8833/2019_03_28/72189)
RasPiでサーボモーターを動かしてみる(360度ぐるぐる版)

### まえおき

[サーボモーターSG-90を使うときにも書きましたが](https://qiita.com/hinemoss/items/770e2280d33278b594be)ずいぶん昔に購入してほったらかしだったPI HATを使ってみたら、どうも思った動きにならなかったので、試行した顛末です。
![IMG_3894.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217329/298d7353-8483-41aa-23ed-91b3c749d9ca.jpeg)

### パーツ
1. RasPi3 / RasPi2
2. サーボモーター [FS90R](http://akizukidenshi.com/catalog/g/gM-13206/)
3. モーター用の電源
4. モーターコントローラ [Adafruit 16チャンネル PWM/サーボ HAT for Raspberry Pi](https://www.adafruit.com/product/2327)

### 環境
1. python 3.7.3
2. adafruit-circuitpython-servokit 1.2.1

### 調べたこと、やったこと
ひとまず、最初にすることは、[製品のページからサンプルコードを確認しました。](https://learn.adafruit.com/adafruit-16-channel-pwm-servo-hat-for-raspberry-pi/using-the-python-library#continuous-rotation-servos-7-34)

説明を超訳すると、1で正回転、-1で逆回転、0.5で半分のパワーで回転できると。
回転を止めるのは0でいいらしい。

ひとまず、全力での回転がどれぐらいかわからないけど、まずは1で回してみる。

```python
kit.continuous_servo[1].throttle = 1
```

逆回転は、

```
kit.continuous_servo[1].throttle = -1
```

ん？とりあえず、止めよう。

```
kit.continuous_servo[1].throttle = 0
```

止まらん、、、止まって～～
ひとまず、モーター用の電源を抜こう。


で、以下のコードでいけそうな感じ。

```python
# Adafruit 16-Channel PWM/Servo HAT & Bonnet for Raspberry Pi & FS90R sample
#
# see:
# https://learn.adafruit.com/adafruit-16-channel-pwm-servo-hat-for-raspberry-pi
#
# test system:
# python 3.7.3
# adafruit-circuitpython-servokit 1.2.1

import time
from adafruit_servokit import ServoKit

# Set channels to the number of servo channels on your kit.
# 8 for FeatherWing, 16 for Shield/HAT/Bonnet.
kit = ServoKit(channels=16)

ch = 1

def fs90r_convert(throttle):
    """
    Parameters
    ----------
    throttle : float
      require -1.0 .. 1.0, but no check

    Returns : float
      -0.4(right rotation) <= 0.1(stop) <= 0.6(left rotation)
    """
    return 0.1 + throttle / 2

# left rotation (0.1 .. 1.0(max))
for i in range(1,11):
    v = fs90r_convert(i/10)
    print( "i=%f v=%f" % (i/10, v) )
    kit.continuous_servo[ch].throttle = v
    time.sleep(1)

# right rotation (-0.1 .. -1.0(max))
for i in range(-1,-11,-1):
    v = fs90r_convert(i/10)
    print( "i=%f v=%f" % (i/10, v) )
    kit.continuous_servo[ch].throttle = v
    time.sleep(1)

# stop rotation
kit.continuous_servo[ch].throttle = fs90r_convert(0)
time.sleep(1)

# left rotation, max throttle
kit.continuous_servo[ch].throttle = fs90r_convert(1)
time.sleep(1)

# right rotation, half throttle
kit.continuous_servo[ch].throttle = fs90r_convert(-0.5)
time.sleep(1)

# stop rotation
kit.continuous_servo[ch].throttle = fs90r_convert(0)
```

ポイントは

```python
def fs90r_convert(throttle):
    return 0.1 + throttle / 2
```

で、FS90R用の換算を挟みました。どうも、0では停止せず、0.1で停止するようです。
引数は、サンプルプログラムで解説されている1から-1の範囲を与えて、正回転、逆回転、0で停止できます。

### 参考
1. https://learn.adafruit.com/adafruit-16-channel-pwm-servo-hat-for-raspberry-pi
2. https://learn.adafruit.com/adafruit-16-channel-pwm-servo-hat-for-raspberry-pi/using-the-python-library
3. http://akizukidenshi.com/catalog/g/gM-13206/
Float計算回路のVerilog-HDL実装について -その2.5(共通化)

#Float計算回路のVerilog実装
~ FPGA に載せたい ~
オレオレ実装なので間違っていても知りません

加算回路編
[Float計算回路のVerilog-HDL実装について -その１](https://qiita.com/Soleiyu/items/5bbb991de443e61e318e)

デバッグツール作成編
[Float計算回路の(ry-その１.１(float値の16進数表記)](https://qiita.com/Soleiyu/items/1fbdc78c68ad69a6d34d)

補足とLeadingZeros編
[Float計算回路のVerilog-HDL実装について -その1.5 (LeadingZeros)](https://qiita.com/Soleiyu/items/2fbd44883cfb1cdd253d)

減算回路編
[Float計算回路のVerilog-HDL実装について -その2(減算編)](https://qiita.com/Soleiyu/items/b56d3db666bd93f9ef75)

回路共通化とタイミング調整編
[Float計算回路のVerilog-HDL実装について -その2.1(加算回路の共通化とタイミング調整)](https://qiita.com/Soleiyu/items/85e9543463f068fe5047)

## 目的
floatの勉強
float32のハードウェア実装

正負の加減算を均一にこなす加減算回路を作成する

今回は０を考慮しない

## 仕様
![addsub_timing.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253609/7d6f617e-71f8-e050-5478-44c8205dfc30.png)
以下詳細

## 値計算方針
### 第２引数とオペレータの排他的論理和を獲り、第２引数の符号とする
すべての計算を加算表記とする

### 大きい値の符号を結果出力符号とする
まぁそうなるよね

### 加算と減算の判定は大きい値と小さい値の符号の排他的論理和とする
まぁそうなるよね

### 1. 値の比較
数値比較を行い, 大きい方を vb(value big), 小さい方を vs(value small)へ格納する.
加算回路と異なり、符号の話が関係するので完全に大小を分離したい.

```
//TIM1
reg [31:0] vb;
reg [31:0] vs;

always @(posedge clk) begin
  	if (v2[30:23] < v1[30:23]) begin
		vb <= v1;
		vs <= {v2[31] ^ op, v2[30:0]};
	end else if (v1[30:23] < v2[30:23]) begin
		vb <= {v2[31] ^ op, v2[30:0]};
		vs <= v1;
	end else if (v2[22:0] < v1[22:0]) begin
		vb <= v1;
		vs <= {v2[31] ^ op, v2[30:0]};
	end else begin
		vb <= {v2[31] ^ op, v2[30:0]};
		vs <= v1;
	end
end
```
第２引数の符号とオペレータの排他的論理和をとる（ -(-v) の排除)

### 2, 3. 省略
符号が消されないように適宜保護する

### 4. 計算
```
//TIM4
reg [7:0] vexp3;
reg [24:0] r;

always @(posedge clk) begin
	op3 <= opb2;
	vexp3 <= vexp2;

	if (opb2 ^ ops2) begin
		r <= vb3 - vs3;
	end else begin
		r <= vb3 + vs3;
	end                                                                        
end
```
２値の符号が異なる場合は減算する（符号は大きい方を維持するから絶対値の計算だね）

### 5, 6. 省略
順当に作る（特にコメントなし）

## シミュレーション結果
4302_A666 = 130.65
42E8_4CCD = 116.15

C2E8_4CCD = -116.17
C302_A666 = -130.65

|値１| 値2| 演算子|| 結果|
|:-:|:-:|:-:|:-:|:-:|:-:|
|123.4|7.25| +||130.65|
|123.4|-7.25| +||116.15|
|-123.4|7.25| +||-116.15|
|-123.4|-7.25| +||-130.65|
|||||||
|7.25|123.4| +||130.65|
|7.25|-123.4| +||-116.15|
|-7.25|123.4| +||116.15|
|-7.25|-123.4| +||-130.65|
|||||||
|123.4|7.25| -||116.15|
|123.4|-7.25| -||130.65|
|-123.4|7.25| -||-130.65|
|-123.4|-7.25| -||-116.15|
|||||||
|7.25|123.4| -||-116.15|
|7.25|-123.4| -||130.65|
|-7.25|123.4| -||-130.65|
|-7.25|-123.4| -||116.15|

あってるっぽい
PythonでABC168のA~Cを解く

### はじめに
大事故です。

### A問題
[問題](https://atcoder.jp/contests/abc168/tasks/abc168_a)

**考えたこと**
やるだけ

```python
n = input()


if n[-1] == '3':
    print('bon')
elif n[-1] == '0' or n[-1] == '1' or n[-1] == '6' or n[-1] == '8':
    print('pon')
else:
    print('hon')
```

### B問題
[問題](https://atcoder.jp/contests/abc168/tasks/abc168_b)

**考えたこと**
やるだけ

```python
k = int(input())
s = input()
n = len(s)

if n <= k:
    print(s)
else:
    print(s[:k]+"...")
```

### C問題
[問題](https://atcoder.jp/contests/abc168/tasks/abc168_c)

**考えたこと**
時針と分針の角度を計算して余弦定理。←cosの対称性を勘違いして6WA()。cosの値は$\frac{\pi}{2}$に対して対称じゃないですよ?なにを考えてるんですか? ~~受験生なのに受験数学できない~~

```python
import math
a, b, h, m = map(int,input().split())

a_s = (30 * h) % 360 + 0.5 * m
b_s = (6*m)

s = max(a_s,b_s) - min(a_s,b_s)
ans = math.sqrt(a**2+b**2-2*a*b*math.cos(math.radians(s)))
print(ans)
```

### D問題
1から近い順に見ていって、それぞれの親ノード(1に近い方)の番号をつければ解けそう。BFSとか?

### まとめ
私は雑魚です。
GitHub Desktopにはもう頼らない

## はじめに
GitHub Desktopに頼りすぎて、ターミナルからのGitの操作方法を失念しつつある人のための記事です。
Git自体をほぼ使ったことが無い人は私の過去記事を読んでいただき、それでも不明点があれば他記事も参考にしてみてください。

・私が過去に書いた記事
<a href="https://qiita.com/ysda/items/7da00da7fe3d13b7ca6f">Githubでのプログラム修正の流れ　その1</a>
<a href="https://qiita.com/ysda/items/61318db52b45da31eaf2">Githubでのプログラム修正の流れ　その2</a>
<a href="https://qiita.com/ysda/items/b08098aa55db7e2d0fae">Githubでのプログラム修正の流れ　その3</a>

## リモートリポジトリを作る
まずはGitHubにログインしましょう。
そうすると画面左側にNEWボタンがあるのでクリックします。
![スクリーンショット 2020-05-17 21.43.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429077/2ffce926-68ce-f1b4-8237-9f84bd84e9be.png)

リポジトリ名を入力し、Create repositoryボタンをクリックします。
これでリモートリポジトリは完成です。
この時リポジトリを非公開にしたい場合は、画面中央部の設定からPublicではなくPlivateにしておきましょう。
![スクリーンショット 2020-05-17 21.35.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429077/3e5c12ca-1634-4712-6810-40ecc8dfe52a.png)

リモートリポジトリの作成が終わったら以下のような画面に遷移しますので、赤枠で囲ったボタンを押下しURLをコピーします。
![スクリーンショット 2020-05-17 21.48.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429077/4e003856-5db8-156e-484d-38e5c2f29502.png)

## ローカルでの作業
ここからはローカルでの作業です。今回の記事用に新しくリポジトリを作ります。
まずはディレクトリを作成。

```
% mkdir test_app
```

作成したディレクトリに移動。

```
% cd test_app
```

以下のコマンドを実行することでtest_appをGitで管理できるようにします。

```
% git init
Initialized empty Git repository in /Users/username/projects/test_app/.git/
```

続いてtouchコマンドでテスト用のファイルを作ります。

```
% touch test.html
```

それでは、statusコマンドで変更や追加があったファイルを確認してみましょう。
先ほど作成したtest.htmlが表示されているので問題なさそうです。

```
% git status
On branch master

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)
	test.html
```

addコマンドでtest.htmlをインデックス※に追加します。
※インデックスとはリモートリポジトリに反映するファイルを置いておく場所のことです。これにより、コミットしたいファイルごとにインデックスに追加してリモートリポジトリに反映できるようになります。
インデックスの概念が無かった場合を考えると、A機能とB機能を追加した際にワーキングツリーから2つの機能の修正がリモートリポジトリに反映されることなります。レビュアーの負担や現場のルールなどで1コミットにつき1機能にすることにした場合、インデックスという場所にコミットするファイルを指定して置いておいたら便利なのです。

```
 % git add test.html
```

ではコミットしましょう。-mオプションをつけることでコメントを記述できます。

```
% git commit -m "test commit"
```

## ローカルリポジトリとリモートリポジトリを紐づける
前述したリモートリポジトリの作成の際に、リポジトリのURLが発行されていたと思います。まずはそれをクリップボードにコピーしましょう。
![スクリーンショット 2020-05-17 21.48.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429077/4e003856-5db8-156e-484d-38e5c2f29502.png)
以下のコマンドをローカルリポジトリ内で実行すれば、ローカルリポジトリと紐づけるリモートリポジトリを設定できます。

```
% git remote add origin コピーしたURL
```

## ローカルリポジトリの修正内容をリモートリポジトリに反映
では以下のコマンドでリモートリポジトリにプッシュしましょう。

```
% git push origin master 
```

コマンドの実行後、今回作成したtest.htmlがアップされていることをGitHub上で確認できました！
![スクリーンショット 2020-05-17 22.46.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429077/2027c15f-1e24-695e-a92a-e9c897728075.png)

以上で今回の記事は終了です。
JANOG45 ミーティング in 札幌 に参加してきましたよ

2020年1月22日～24日、[JANOG45 ミーティング](https://www.janog.gr.jp/meeting/janog45/)が札幌で開催されました。

11月くらいに社内で募集されていたので、一にも二にもなく手を上げて参加が決定し、飛行機や宿の手配など一通り終わって安心していたところ、「1月の札幌とかクッソ寒くね？」ということに気づきました。浮かれすぎてた。でも結局3日間、思っていた以上に暖かかく人間樹氷は免れたのですが、途中から「寒くない北海道なんて物足りない」と思ってしまいました。いやホントすいません。

# JANOGとは
さて、JANOG。私は JANOG を知らなかったのでさっそく Google で検索してみると「その名の通り、日本のネットワーク運用者の集いである」とあります。なるほどわからん。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155700/a8812626-2b46-f1fb-d165-91b8b9beb027.png)

JANOGとは「**JA**pan **N**etwork **O**perators' **G**roup」の略で、日本のネットワーク運用者が集まって技術的な話や研究発表などを行うという会合です。「ミーティング」と銘打ってるように、発表者と参加者で議論をするというのが特徴だそうです。確かに普通のカンファレンスより、質問の数が多かったですね。

# プログラム
[発表されたプログラムは約50](https://www.janog.gr.jp/meeting/janog45/program)。やはりネットワーク系のプログラムが中心でした。以下のグラフは独自の分類なので正確性はありません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155700/3df310dd-2485-3b00-74fe-b277611f22e1.png)

セキュリティ畑の自分にしてみると、ネットワーク系の技術発表については難しいと思うところもありましたが、地域ISPなど、普段一緒に仕事をしないような方々が何を考えているのかなどを知れるいい機会でした。

セキュリティにも関係する DNSSEC や、法律の観点でドメインをテイクダウンするなど、ネットワーク / セキュリティで技術がオーバーラップするところの話はもものすごくプログラムはものすごく面白かったです。やっぱり技術的な素養があったほうが楽しい。

# うまいしか言えない（語彙消失）
2日目の夜は懇親会に参加しました。懇親会の参加者は700人くらいいたのですが私の知ってる人は誰もいません。サミシイナーとつぶやいて会場の端っこで鮭とばをチューと吸ってても良かったのですが、持ち前の馴れ馴れしさと話を適当に合わせる能力で沢山のグループの会話に加わり、40人くらいの方々と名刺交換をしました。それと同時に並べられた北海道料理を全種類制覇し、飲むべき酒はしっかり飲むという非常に忙しい時間を過ごしました。

全部うまいの図。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155700/6f50a7c5-e647-3f8c-8a81-2a9ee9b9f665.png)

全部やばいの図。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155700/fadaf62f-4740-a6e3-0d5f-735ace5528e5.png)

非常に濃いプログラムばかりでとても疲れましたが、充実した3日間でもありました。業務に直結するアイデアがひらめいたり、同じ課題を持っている仲間が見つかるなど、得られたものは沢山ありました。
次回は7月に沖縄で開催されるそうですが、また参加して刺激を受けたいと思います。ありがとうございました。

# おまけ
すすきの方面の案内。特に意味はない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155700/7cdab34f-c051-cd33-b6b0-9d57ea1ef3a9.png)
Python でつくる簡易 Slack API クライアント

[Slack API の公式 Python クライアント](https://github.com/slackapi/python-slackclient) はよくできていると思うのだけど、諸事情あってこれを使わずに Python から Slack API を利用する必要があり、自前で超簡易的に Slack クライアントを書いてみた。

``` python
import urllib.request
import json

class SlackAPI:
    
    def __init__(self, token: str, api_base: str = 'https://slack.com/api/'):
        self.token = token
        self.api_base = api_base
    
    def __call__(self, name: str, charset: str = 'utf-8', **kwargs) -> dict:
        req = urllib.request.Request(
            url = self.api_base + name,
            data = json.dumps(kwargs).encode(charset),
            headers = {
                'Authorization': f'Bearer {self.token}',
                'Content-Type': f'application/json; charset={charset}',
            })
        with urllib.request.urlopen(req) as res:
            return json.load(res)
    
    def __getitem__(self, key: str):
        return lambda **kwargs: self(key, **kwargs)
```

こんなノリで使える。

``` python
token = 'xoxb-000000000000-0000000000000-xxxxxxxxxxxxxxxxxxxxxxxx'
slack_api = SlackAPI(token)
```

``` python
# ユーザ一覧を取得する
slack_api['users.list']()
```

``` python
# メッセージを投稿する
slack_api['chat.postMessage'](channel='XXXXXXXXX', text='Yo!', as_user=True)
```

もちろん RTM API などは使えないが、Web API であればほとんどこれで実行できるのではないか。(そこまでいろいろ試したわけではないので「この API は実行できない」などあればコメントして欲しい)

## 追記 (2020.05.18)
[コメント](#comment-a97ebf6ddf92cfa5447a)にて、JSON のリクエストボディに対応していない API もあるとご指摘いただいたので、これに対応してみた。

``` python
import urllib.request
import json

class SlackAPI:

    def __init__(self, token: str, api_base: str = 'https://slack.com/api/'):
        self.token = token
        self.api_base = api_base

    def __getitem__(self, key: str):
        return lambda **kwargs: self.post(key, **kwargs)

    def get(self, name: str, **kwargs) -> dict:
        req = urllib.request.Request(
            url = self.api_base + name + '?' + urllib.parse.urlencode(kwargs),
            headers = {
                'Authorization': f'Bearer {self.token}',
            })
        with urllib.request.urlopen(req) as res:
            return json.load(res)

    def post(self, name: str, charset: str = 'utf-8', **kwargs) -> dict:
        req = urllib.request.Request(
            url = self.api_base + name,
            data = json.dumps(kwargs).encode(charset),
            headers = {
                'Authorization': f'Bearer {self.token}',
                'Content-Type': f'application/json; charset={charset}',
            })
        with urllib.request.urlopen(req) as res:
            return json.load(res)
```

明示的に `get` メソッドを使った場合は `application/x-www-form-urlencoded` でデータを送信する。

``` python
slack_api.get('conversations.list', limit=20)
```
Blender 2.8.2 で TensorFlow 2.0(CPU) をインストールし、HelloWorld (Windows10)

# やり方

Blender のデフォルトで Python が入っているので、それに対し `pip instlall` するだけでいい。
自分の環境では、一種のエラーと一種の警告が出たので、参考としてメモを残す。

最初に、TensorFlow を Blender の Python にインストールする。
Powershell を使う。

```powershell

# Blender の Python がある場所へ移動
cd 'C:\Program Files\Blender Foundation\Blender 2.82\2.82\python\bin\'

# 念のため、pip をアップグレード
.\python.exe -m pip install --user --upgrade pip

# TensorFlow 2.0 の 2.2.0 をインストール (5分くらい？)
.\python.exe -m pip install tensorflow==2.2.0

# python インタプリンタを起動し、TensorFlow が使えるか確認する
.\python.exe
```

TensorFlow が入っていることを確認。

```powershell
.\python.exe -m pip list | Select-String tensor

tensorboard            2.2.1
tensorboard-plugin-wit 1.6.0.post3
tensorflow             2.2.0
tensorflow-estimator   2.2.0
```

Pythonインタプリンタで TensorFlow のインポート、おそらくエラーが出る。

```python
import tensorflow as tf
```

# エラーが出るとき

以下のエラーが出ると思われる。

```
ImportError: Could not find the DLL(s) 'msvcp140_1.dll'. TensorFlow requires that these DLLs be installed in a directory that is named in your %PATH% environment variable. You may install these DLLs by downloading "Microsoft C++ Redistributable for Visual Studio 2015, 2017 and 2019" for your platform from this URL: https://support.microsoft.com/help/2977003/the-latest-supported-visual-c-downloads
```

これは、https://support.microsoft.com/ja-jp/help/2977003/the-latest-supported-visual-c-downloads ここの x64 ダウンロードで解決(場合によりx86)。

参考: https://tialight.com/?p=881

# 警告が出る

以下のような、GPU が無いという内容

```
2020-05-17 21:49:28.438207: W tensorflow/stream_executor/platform/default/dso_loader.cc:55] Could not load dynamic library 'cudart64_101.dll'; dlerror: cudart64_101.dll not found
2020-05-17 21:49:28.443044: I tensorflow/stream_executor/cuda/cudart_stub.cc:29] Ignore above cudart dlerror if you do not have a GPU set up on your machine.
```

今回は CPU なので無視。

# Blender の Python コンソールで Hello World

```python
import tensorflow as tf
tf.print("Hello World!")
```

`Window` > `Toggle System Console` からコンソールを確認し、`Hello World!` が表示されていたら完了。

今回は TensorFlow が Blender で動くか確かめたかったので CPU。
高速実行がしたくなったら GPU の導入についても検討していきたい。

# 参考資料

- https://www.kkaneko.jp/dblab/cg/bpypip.html
- https://tialight.com/?p=881
Google Cloud Platform(GCP)で無償のインスタンスを作る

## はじめに

グローバルIPアドレス持った常時起動し続けてる仮想マシンを作りたい。
GCP は Always Free の制限内であれば、無償でインスタンスを作れる。
GCPで起動しっぱなしにできるインスタンスの作り方をまとめておく。

## GCP の無償枠は？

執筆時点、次の２つがある。

* Always Free プロダクト
* $300 分の無料クレジット

前者は常に無償で、後者は登録から12カ月はクレジットがあるもの。

公式は[こちら](https://cloud.google.com/free?hl=ja)で、
Always Free の詳細条件は、[このあたり](https://cloud.google.com/free/docs/gcp-free-tier?hl=ja#always-free)や[このあたり](https://cloud.google.com/free/docs/gcp-free-tier?hl=ja#always-free)にある。詳細条件をざっと見る限り、おおよそ特別なことをしない限りは対象になるように見える。

## どの程度の量が無料か？

今回の目的だと Compute Engine を見ればよい。

* インスタンスは f1-micro で 1 つ。
* リージョンは次のいずれかであればよい。
    * オレゴン: us-west1
    * アイオワ: us-central1
    * サウスカロライナ: us-east1
* HDD は 30GB まで。
* ただし、北米から北米外へのトラフィックは上限1GBとなる。

複数リージョンで時間で合算とあるので、1か月間常時動かすという前提がある場合、いずれかのリージョンで1台までに見える。

## 何を選ぶか？

リージョンはus-east1が無難だと思う。速度や遅延やリージョンの信頼性など気になるところがあるが、日本からのアクセスを考えると東かなと。実測まではしていない。

https://www.submarinecablemap.com/

## インスタンスの作り方は？

* Compute Engine
    * VMインスタンス
        * 名前: inst-gcp-useast1-1
        * マシンタイプ: f1-micro (1vcpu, 614MB)
        * 標準の永続ディスク: 30GB
        * ブートディスク: Debian GNU/Linux 10 (buster)

30GBのスナップショットをとると、スナップショットの無償分5GBを活用できないが気にしない。

## 課金アラートの設定は？

* お支払い
    * 予算とアラート
        * 名前: GCPの予算
        * 範囲: すべてのプロジェクト
        * プロダクト: すべてのサービス
        * 金額
            * Budget type: 指定額
            * Target amount: \1
        * アクション
            * 予算の割合: 100%, 金額: \1, トリガー対象: 実値

以上
【VSCode】Laradockでデバッグできるようにしようぜ!!【Mac】

VSCodeの拡張機能を使ってデバッグ環境を作る方法を解説します。

##拡張機能のダウンロード
予め`PHP Debug`という拡張機能をインストールしておきます。


##.envの書き換え

laradockディレクトリ下の`.env`を下記の2つの変数をfalseからtrueに書き換えます。

```
WORKSPACE_INSTALL_XDEBUG=true
PHP_FPM_INSTALL_XDEBUG=true
```

##Xdebugの書き換え
- laradock/php-fpm/xdebug.ini
- laradock/workspace/xdebug.int
の変数を下記のように書き換えます。

```xdebug.ini
xdebug.remote_host=docker.for.mac.localhost
xdebug.remote_connect_back=0
xdebug.remote_port=9001
xdebug.idekey=Listen for XDebug

xdebug.remote_autostart=1
xdebug.remote_enable=1
xdebug.cli_color=1
xdebug.profiler_enable=0
xdebug.profiler_output_dir="~/xdebug/phpstorm/tmp/profiling"

xdebug.remote_handler=dbgp
xdebug.remote_mode=req

xdebug.var_display_max_children=-1
xdebug.var_display_max_data=-1
xdebug.var_display_max_depth=-1

```

##containerの再構築

```terminal
docker-compose up -d --build nginx mysql
```

`--build`オプションで起動します。イメージがある状態でも再度ビルドしてcontainerを立ち上げてくれます。


##Visual Studio Codeの設定

プログラム実行の設定（デバッグの設定）を行うのが`.vscode/launch.json`ファイルです。

作業ディレクトリのlaunch.jsonファイルを作成して、下記を記述します。user_app_nameのところには自分のappディレクトリの名前をいれてください。

```.vscode/launch.json
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Listen for XDebug",
            "type": "php",
            "request": "launch",
            "port": 9001,
            "pathMappings": {
                "/var/www": "${workspaceFolder}/user_app_name"
            },
            "log": true
        }
}
```

#デバッグの実行
ソースの行番号の左側を押して、ブレークポイントを設定。
サイドバーのデバッグのボタンを押して、[Listen for XDebug]を選択し、RUNの△を押せば準備完了。ブレークポイントのところで止まるようになります。

<img width="340" alt="Screen_Shot_2020-05-17_at_22_11_34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169789/aaf95ef9-5772-7149-a94f-b4959e2c9eff.png">




##参考
- [PHP on Laradock w/ Visual Studio Code(VS Code)でデバッグ環境 (特にon Mac) - Qiita](https://qiita.com/yamazaki/items/26e49035d1256212e30e)
- [VSCodeでMacOSにC言語デバッグ環境を構築 | だえうホームページ](https://daeudaeu.com/programming/c-language/vscose_debug_c/)
- [Vagrant + Virtualbox + Docker + Laradoc + Laravel + VSCode + XDebug の 環境を設定したメモ。 - Qiita](https://qiita.com/hibohiboo/items/463fc4d13d20b1a8cf37#_reference-032478d7967f0d1a6017)
- [docker+laravel+VSCode+Xdebugという開発環境を作る - Qiita](https://qiita.com/kefian1go/items/bbc8f9d51fe890194ad7)
- [脱print文！Visual Studio Code + LaradockでPHPのコードを快適デバッグ - bitA Tech Blog](https://tech.bita.jp/article/6)
IBM Cloud で ライト・アカウント か確認する方法（解約方法）

通知なしの無料枠削除で突然の課金が発生しているらしい。

[IBM Cloud (旧Bluemix) のアカウントを持っている人は今すぐクレジットカードの請求を確認すべき ※追記の追記あり - Cloud Penguins](https://jaco.udcp.info/entry/2020/05/16/194826)

クレジットカード不要のライト・アカウントでは関係ない話だが、
心配なのでアカウントがライト・アカウントどうかを確認する方法。

# ログインして次の画面が表示されたら ライト・アカウント

※`IBMid` = メールアドレスでOK

[https://cloud.ibm.com/account/settings](https://cloud.ibm.com/account/settings)

![alt](https://qiita-image.cloudremix.net/IBM-Cloud.jpg)

# IBM Cloud の解約

**有料アカウントの場合は、予定された課金情報がないか必ず確認。**

> アカウントを削除するには、どのようにすればよいですか?
>
> [IBM Cloud サポート](https://cloud.ibm.com/unifiedsupport/supportcenter) に連絡して、サポート Case をオープンし、アカウントの削除を依頼してください。 古いアカウントに関連付けられているデータで、新規アカウントに移行したいものがあれば、その情報を E メールに記載してください。
> 
> [アカウントに関する FAQ](https://cloud.ibm.com/docs/account?topic=account-accountfaqs#deleteaccount)
RasPiでサーボモーターを動かしてみる(180度版)

### まえおき
ずいぶん昔にサーボモーターを制御できるPI HATを購入して、ハンダ付けまでしていたのですが、それっきりすっかり忘れていました。電子部品の在庫確認をしていたら、見つけてしまったので動作確認してみました。
![IMG_3896.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217329/20a3a9d3-aea2-a359-0f9f-7cb502e15666.jpeg)

### パーツ
1. パーツというか、RasPi3
2. サーボモーター [SG-90](http://akizukidenshi.com/catalog/g/gM-08761/)
3. モーター用の電源
4. モーターコントローラ [Adafruit 16チャンネル PWM/サーボ HAT for Raspberry Pi](https://www.adafruit.com/product/2327)

確認したら、まだ現行の製品でした。

### 環境
1. python 3.7.3
2. adafruit-circuitpython-servokit 1.2.1

### 調べたこと、やったこと
サーボモーターは、180度回転するタイプ(左右90度ともいえる)と、360度ぐるぐる回転するタイプがあるようです。180度回転するタイプも360度回転するタイプも、製品の情報をたどると、[サンプルコード](https://learn.adafruit.com/adafruit-16-channel-pwm-servo-hat-for-raspberry-pi/using-the-python-library)に到達できたのですが、ここのコードをコピペしても、思ったように動きませんでした。まず、はんだ付け失敗かとも思ったんですが、サーボモーターを接続する場所(16か所あります)を変更しても、動きは同じ。うーむ、、、、

これは、ハンダ付けでダマができているのが問題ではないと思い(責任転嫁か！)、ちょっとパラメータを変えてみて試行してみました。

で、以下のコードでだいたいいけそうでした。

```python
# Adafruit 16-Channel PWM/Servo HAT & Bonnet for Raspberry Pi & SG90 sample
#
# see:
# https://learn.adafruit.com/adafruit-16-channel-pwm-servo-hat-for-raspberry-pi
#
# test system:
# python 3.7.3
# adafruit-circuitpython-servokit 1.2.1

import time
from adafruit_servokit import ServoKit

# Set channels to the number of servo channels on your kit.
# 8 for FeatherWing, 16 for Shield/HAT/Bonnet.
kit = ServoKit(channels=16)

ch = 1

kit.servo[ch].set_pulse_width_range(500, 2400)

# 0..180 step 30 angle
for v in range(0,181,30):
    print( "value=", v )
    kit.servo[ch].angle = v
    time.sleep(1)

# 0, 180 step 90 angle x 3set
for i in range(1,3):
    for v in range(0,181,90):
        kit.servo[ch].angle = v
        time.sleep(1)

# stop(90 angle)
kit.servo[ch].angle = 90
```
ポイントは

```python
kit.servo[ch].set_pulse_width_range(500, 2400)
```
で、サーボモーターSG-90の[データシート](http://akizukidenshi.com/download/ds/towerpro/SG90_a.pdf)を確認して、下が0.5ms pulse、上が2.4ms pulseらしいので設定しました。このパラメータでも、ちょっと180度に足りていない気もしますが、ひとまずよしとしときます。

### 参考
1. https://learn.adafruit.com/adafruit-16-channel-pwm-servo-hat-for-raspberry-pi
2. https://learn.adafruit.com/adafruit-16-channel-pwm-servo-hat-for-raspberry-pi/using-the-python-library
3. http://akizukidenshi.com/catalog/g/gM-08761/
[光-Hikari-のPython]03章-01 turtle グラフィックス（turtleの作成）

#[Python]03章-01 turtleの作成
本章では、今まで学んだ変数やメソッドなどの知識を用いて、習得した範囲でのグラフィックを作成していきたいと思います。

今後、Pythonで学ぶオブジェクト指向の話やメソッドに関する話が深く問われてきます。それらを学ぶ上で、グラフィックを用いることにより、理解が深まると考えています。

グラフィックでよく用いられるのがTurtle（タートル：亀）グラフィックスです。TurtleはPythonの基本的な文法がわかっていれば、記述が可能です。


##小学校・中学校でもプログラミングが必須
2020年よりプログラミングが小学校・中学校で必須となりました。そこでよく用いられるのがスクラッチというプログラミングツールです。このプログラミングツールの目指すところはアルゴリズム<font color="orange">（※）</font>の能力を養成することにあります。

<font color="orange">（※）</font>アルゴリズムとは、プログラム等で行われる処理手順のことです。詳細は割愛しますが、プログラムを書いていくうえで重要な内容となってきます。

もし興味があれば操作ができますのでぜひ試してみてください。（無料）
[スクラッチサイト](https://scratch.mit.edu/)

そのスクラッチでもそうですが、スクラッチは前述した通り、小中学校で使うツールです。グラフィックも特に難しくなく操作ができますが、ここではPythonで動かすことを考えていきましょう。

##turtleを作る
いくつか習っていないプログラムコードがありますが、コメントを添えつつ、また詳細は後述しますので、とりあえず**今はおまじないと思っていて**ください。

今回のプログラムはプログラムコードをエディタで作成して実行していきたいと思います。フォルダ<font color="#0cc">chap03</font>を作成し、その中にファイル名<font color="#0cc">03-01-01.py</font>を作成します。

まずは、一番上に以下のコードを入力します。

```03-01-01.py
import turtle
```

これはturtleプログラムを行う上で、プログラムの部品（**モジュール**という）を外部から読み込んでいる（インポートしている）ことを意味します。詳細は後の章で後述します。
とりあえず今は、**turtleプログラムを動かすために外部からプログラムを取り込んでいる**という認識で構いません。


```03-01-01.py
#turtleプログラムを動かすために外部からプログラム部品を読み込んでいる
import turtle
```

次もまたおまじないのようなものになりますが、**肝心のturtle（亀）を作らないといけません**。
そこで、以下のようにturtleを作ります。なお、亀に何か名前を付けてみるのもいいかもしれません。（今回自分はtaroという名前にしましたが、ここは自由で構いません）

```03-01-01.py
#turtleプログラムを動かすために外部からプログラムを読み込んでいる
import turtle

#taroという名前でturtle（亀）を作る。
taro = turtle.Turtle()
```
そして実行してみてください。すると一瞬、白い画面が出たかと思います。
これだと実行結果がすぐ閉じられてしまうので、以下の個所にturtle.done()と記載してください。

これにより、turtle.done()の時点でいったんプログラムを止めることができます。これは**最後に書きます。**

```03-01-01.py
#turtleプログラムを動かすために外部からプログラムを読み込んでいる
import turtle

#taroという名前でturtle（亀）を作る。
taro = turtle.Turtle()

#いったんここでプログラムを止める。
turtle.done()
```
実行すると、以下の結果になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/602679/3cae69a6-0dd7-3e70-bda4-d54b6e2ccae9.png)

これだと矢印の形であり、亀の形をしていません。また亀は本来緑色のイメージなので、形と色を変えていきたいと思います。

##亀に対する処理命令
では亀の形と色を変えていきたいと思います。
以下のコードを入力してください。

```03-01-01.py
#turtleプログラムを動かすために外部からプログラムを読み込んでいる
import turtle

#taroという名前でturtle（亀）を作る。
taro = turtle.Turtle()

#形を亀に、色を緑にする
taro.shape('turtle')
taro.color('green')

#いったんここでプログラムを止める。
turtle.done()
```

実行すると、以下のように亀の形と色の変更ができたと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/602679/c5c6e053-237e-3238-b35c-f16703a524b7.png)

閉じるには、右上の「×」ボタンを押下してください。

さて、追加したこの2行、どこかで見たことないでしょうか？
2章で文字列のメソッドを扱った時のことを思い出してください。

```
str.count('r')
str.lower()
```
といったメソッドがあったと思います。実はこれらはstrに対する処理命令と2章で述べましたが、今回もtaroというturtle（亀）に対して、何かしらの処理命令を行っているのです。

今回は「shape（形）を'turtle'（亀の形）に、color（色）を'green'（緑）にしなさい」という処理命令を行っているのです。

実際に動かすのは次回にしたいと思います。しかし結局動かすのはメソッドとなりますので、turtleを動かすための基本的なメソッドを次回習得していきたいと思います。

##最後に
今回はいくつか見慣れないプログラムコードがありますが、これらについては重要であるため必ず後の章で説明します。
今回学んだ、taro.shape()とtaro.color()のメソッドについて、ほかにもいろいろな形や色があります。
以下のサイトに詳細がありますので、形を変えてみたり、色を変えてみたりしてみてください。
[shape()メソッド](https://docs.python.org/ja/3/library/turtle.html#turtle.shape)

[color()メソッド](https://docs.python.org/ja/3/library/turtle.html#turtle.color)

###[【目次リンク】へ戻る](https://qiita.com/ko0821/items/379e8bd9e6ea01089419)