OmniAICreator/Qiita-1.07M huggingface dataset:
Visual Studio Codeでdotnet 3.x系のプロジェクトを開くとエラーCS0246やCS0518が出る問題の対処

# はじめに
プロジェクトのTargetFrameworkにnetcoreapp3.0やnetcoreapp3.1を指定した場合に、Visual Studio Codeでプロジェクトを読み込むとCS0246やCS0518が発生する問題への対処方法です。

<img width="877" alt="CS0246_CS0518.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15854/78da2a27-e041-d84c-e847-755205710d7d.png">

# omnisharp-vscodeの対応方法スレッド
下記のスレッドを見ると必要なことは書いてあります。

- [Did not find 'Microsoft\.NETCore\.App' in lock file\. · Issue \#3314 · OmniSharp/omnisharp\-vscode](https://github.com/OmniSharp/omnisharp-vscode/issues/3314)
- [Omnisharp not working on Mac · Issue \#3407 · OmniSharp/omnisharp\-vscode](https://github.com/OmniSharp/omnisharp-vscode/issues/3407)

備忘録として対応方法をこのあとの項目に記載します。

# 問題点
OUTPUT(出力)でOmniSharpLogに「Did not find 'Microsoft.NETCore.App' in lock file.」というエラーが出ている。
<img width="697" alt="スクリーンショット 2020-05-22 17.41.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15854/4c8e220e-5716-46b9-4d16-d988b4735b3c.png">


monoのmsbuildが16.3以上出ないと発生する。
Homebrewでmonoをインストールした場合にmonoは6.8.0.123(2020/5/22現在)がインストールされるが、msbuildは16.1系のためにdotnet3.x系で問題が発生する。

```
$ msbuild -version
Microsoft (R) Build Engine version 16.1.85+gad9c9926a7 for Mono
Copyright (C) Microsoft Corporation. All rights reserved.

16.1.85.40109
```


# 対応方法

Homebewでインストールしたmonoをアンインストールする。

```
$ brew uninstall mono
```


「[Download \- Stable \| Mono](https://www.mono-project.com/download/stable/)」から6.8.0 Stableをダウンロードしてセットアップする。
msbuildが16.3以上確認する。

```
$ msbuild -version
Mono 向け Microsoft (R) Build Engine バージョン 16.5.0-ci
Copyright (C) Microsoft Corporation.All rights reserved.

16.5.0.16201
```

Code→Preferences（基本設定）→Settings（設定）を選択する。
Search Settings(設定の検索)に「useGlobalMono」を入力して絞り込む。
Omnisharo:Use Global Monoを「never」に変更する
<img width="786" alt="vscodesetting.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15854/7d50a5d2-8102-28c0-6e4e-7688a94ba59c.png">

「Restart OmniSharp」する。
PROBLEMS（問題）からCS0246やCS0518などのエラーが消えているか確認する。


# エラー詳細
Visual Studio Codeで問題タブで、項目を選んで右クリック→コピーで取得した情報。

<img width="877" alt="CS0246_CS0518.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15854/78da2a27-e041-d84c-e847-755205710d7d.png">

```
{
	"resource": "/Users/xxxxx/develpoment/test/obj/Debug/netcoreapp3.1/test.AssemblyInfo.cs",
	"owner": "csharp",
	"code": "CS0246",
	"severity": 8,
	"message": "The type or namespace name 'System' could not be found (are you missing a using directive or an assembly reference?) [test]",
	"source": "csharp",
	"startLineNumber": 14,
	"startColumn": 12,
	"endLineNumber": 14,
	"endColumn": 18
}

{
	"resource": "/Users/xxxxx/develpoment/test/obj/Debug/netcoreapp3.1/test.AssemblyInfo.cs",
	"owner": "csharp",
	"code": "CS0518",
	"severity": 8,
	"message": "Predefined type 'System.String' is not defined or imported [test]",
	"source": "csharp",
	"startLineNumber": 14,
	"startColumn": 55,
	"endLineNumber": 14,
	"endColumn": 61
}
```
JS初心者道場_ オブジェクトについて①

JavaScriptの`オブジェクト`を案件で使用することはあるのですが「つまりどういう物だ」ということを答えろと言われると困ってしまうし、使ってはいるけれどどのような場面で利用するのが適切なのかが曖昧なので、しっかり利用できるように細部まで調べてみます。

## オブジェクトを理解するとできるようになる(らしい)こと
- グローバルオブジェクトの意味が理解できるようになる
- メソッドを利用しているということがわかる

## まず、オブジェクトとは

オブジェクトとは
 「関連のあるデータと機能の集合です」
オブジェクトを使うことによって、データをまとめて扱えるようになります。

宣言方法は以下の通り、中括弧{}を使用します。

```javascript
// 宣言方法
{}

// 型の確認
typeof {} // "object"

// Objectは変数に格納できる
const obj = {} // 例1
const person = {} // 例２

```

## プロパティとメソッド
 「関連のあるデータと機能の集合です」の機能とは大抵は変数と関数のことです。
オブジェクトのなかでは、変数のことを`プロパティ`、関数のことを`メソッド`と呼んでいます。

### ■プロパティ 
オブジェクトが持つ変数(名前付きのデータ)のことを「プロパティ」と呼びます。
プロパティを設定するには、複数の宣言方法があります。

個人的には①を初期値として宣言するときに使ったりしていましたが、
③のやり方でデータをひとまとめにして引数にするみたいな使い方もできそうです。
②は、変数の数が初期で予想できない時に使えるのかな、と予想しかできません。

```javascript:宣言方法①
const obj = {
  name: "taro",
  gender: "male",
  age: 20
}
```
```javascript:宣言方法②
const obj = {}

obj.name = "taro";
obj.gender = "male";
obj.age = 20;
```
```javascript:宣言方法③
const name = "taro";
const gender = "male";
const age = 20;

const obj = { name, gender, age }
```

### メソッド
オブジェクトのプロパティには関数をセットすることもできます。
オブジェクトが持つ関数のことをメソッドと呼びます。

```javascript:メソッドの宣言
const obj = {
  hello: function() {
    console.log('hello world')
  }
}

// 関数の実行
obj.hello(); // hello world
```

## オブジェクトのプロパティを取り出す
オブジェクトのプロパティを取り出すには　`.` (ドット) を使います。

```javascript:アクセス方法
const obj = {
  name: "taro",
  gender: "male",
  age: 20
}

console.log(obj.name); // taro
console.log(obj.gender); // male
console.log(obj.age); // 20
```
【AWS EC2】ルートテーブルが作成されてないためport 22: Operation timed outが起きた

#はじめに
AMIからEC2を作成する勉強をしていた。
設定をして、ssh -i ~/Desktop/hoge.pem ec2-user@該当のIPアドレス
で接続しようとするも、

```
ssh: connect to host 該当のIPアドレス  port 22: Operation timed out
```
のエラーが出ている。

#解決法（今回の場合）
VPCのダッシュボードを開いてパブリックサブネットの作成内容について確認したところ、問題なさそうだった。
続いてルートテーブルの関係付けを見てみると、下記のイメージのようにlocalにしか向いてなかった。
<img width="831" alt="スクリーンショット 2020-05-15 11.00.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/8449b278-4d75-5aca-4186-c10e1894dae8.png">

そこで青いボタンのルートテーブルの関連付けの編集をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/dd78d5c6-b412-1785-0362-17f3166d0c2a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/c33d2d45-28fe-e6b9-ad2a-8a85c1ea4a0c.png)




ルートテーブルIDを0.0.0.0/0のものを選択しをクリックし、保存。


これで10.0.0.0/16の時はlocalで、それ以外の通信の時はインターネットゲートウェイにも接続されるようになった。
これでssh接続をすると、きちんと接続できるようになった。
入力不可にしたセレクト項目をRailsに送信するTips

# 環境
Vagrant + Ubuntu 16.04.5 LTS
Rails 5.2.4.2
jQuery
slim

# やった事
入力フィールドを入力不可にするには、jQueryでこのように記述する事になります。しかし、disabledにすれば、ビューからコントローラに送信されない事が判明。つまり、Railsのコントローラ側で該当のカラムが更新されない事になります。なんと！

```tasks_index.js
$("#task_todofuken").prop('disabled', false);
```

そこで、次のやり方で、readonlyにすれば、サーバーへ送信されるようになります。


```tasks_index.js
$("#task_todofuken").attr('readonly', true);
```

text_fieldであればこのやり方でいいのだが、今回はselectフィールドを利用しており、そもそも、selectフィールドにはreadonlyの属性を持っていない。
*（ぼやき：よくよく考えれば、selectフィールドでreadonlyにする意味はないかも知れないので、このような仕様にしている理由も分からなくはないが、開発者には何かと様々な事情が出てくる事もあろう）*

参考　※disabledとreadonlyの違いについて詳しい
https://www.sejuku.net/blog/36294


ちなみに、disabledも、readonlyも利用せずに、このようにselectフィールドを初期化すると、プルダウン表示が復活しなくなるため、このやり方も使えない事になります。

```tasks_index.js
$('#task_todofuken').html("<option value=''></option>");
```

そこで、ビューの中で、todofukenのselectフィールドとは別に、hidden_fieldという隠し項目を重複して作ってしまう。隠し項目は必ずサーバーに送信されるため、selectフィールドがdisabledになっていても更新される事になります。disabledがfalseの状態になっている場合、重複して送信される事になるが特に問題はないようです。

```_form.html.slim
// 都道府県
.form-group.row
    .col-sm-2
        = f.label :todofuken, class: 'control-label'
    .col-sm-10
        = f.select :todofuken, 
                ['北海道','青森県','岩手県', ・・・以下略],
                {include_blank: true}, 
                class: 'selectpicker form-control',
                id: 'task_todofuken'

// 都道府県（隠し項目）
.form-group
    .col-sm-10
        = f.hidden_field :todofuken, 
                class: 'form-control bg-warning', 
                id: 'task_todofuken_hidden'
```

そして、selectフィールドが選択されたタイミングで、隠しフィールドにも値を反映させるようにします。

```tasks_index.js
$(function(){
	$('#task_todofuken').change(function() {
		var input = $.trim($(this).val());  
        $("#task_todofuken_hidden").val(input);
    })
})
```

これでOK
SoftEther VPN クライアント接続raspiでGUI操作

とりあえずメモ
Windows版のクライアント管理GUIからすべての設定をできる

```
wget https://github.com/SoftEtherVPN/SoftEtherVPN_Stable/releases/download/v4.34-9745-beta/softether-vpnclient-v4.34-9745-beta-2020.04.05-linux-arm_eabi-32bit.tar.gz
tar xvfz softether-vpnclient-v4.34-9745-beta-2020.04.05-linux-arm_eabi-32bit.tar.gz
cd vpnclient
make
```

```
cd ..
mv vpnclient   /usr/local/
```
までして

リモート管理を許可する
ラズパイ上でSoftether VPN Clientを入れたフォルダーにroot権限で移動し
cd /usr/local/vpnclient
vpncmdを実行
./vpncmd
もし、Softether VPNを起動していないなら、
以下であらかじめ起動させる
/usr/local/vpnclient/vpnclient start
クライアントを管理したいので、2番を選ぶ
ローカルサーバーなので、そのまま何も入力しないでエンターキーを押す。
無事にVPN Client管理画面に入れる。
プロンプトがVPN Client>に変わっていることで確認可能
Windows環境からアクセスできるようにリモートを許可する
		RemoteEnable
	成功したという文字が出れば、完了
後は、すべてWindows上から操作できるので、Exitして終了する
		exit
Softether Client管理ツールをリモート用として起動する
-----
通常、Windows７のSoftether Client管理ツールは、
ローカルしか管理しないようになっているが、
起動オプションを追加することで、リモート管理できるようになる。
クライアント管理ツールをオプションを付けて実行。最後に/remoteを付ける。
```"C:\Program Files\SoftEther VPN Client\vpncmgr_x64.exe" /remote```
リモート管理するIPアドレスを入力する画面が出てくるので、ラズパイのIPを入力する
あとは、通常のWindowsのSoftetherクライアント管理画面と全く同一である。簡単に操作できる。
NICカードの追加や自動起動設定が可能。
コマンドラインでは、面倒な操作が非常に楽にできる
 ※追記
systemdサービス登録
--
/etc/systemd/system/vpnclient.serviceを以下のように記述。

```

[Unit]
Description=SoftEther VPN Client
After=network.target network-online.target

[Service]
ExecStart=/usr/local/vpnclient/vpnclient start
ExecStop=/usr/local/vpnclient/vpnclient stop
Type=forking
RestartSec=3s

[Install]
WantedBy=multi-user.target

```

systemctlコマンドでサービスの開始と有効化

```
sudo systemctl start vpnclient
sudo systemctl enable vpnclient
```
cargo installでfailed to select a version for the requirementが発生した場合の対処法

# 記事の内容
cargo install で以下のエラーが発生しました
根本の解決になるかは分かりませんが、回避できた方法をメモしておきます

~~~
  failed to select a version for the requirement `schnorrkel = "^0.1"`
  candidate versions found which didn't match: 0.9.1, 0.9.0, 0.8.5, ...
~~~

# エラーの内容
Cargo.toml内で指定しているライブラリのバージョンと実際に使えるバージョンが違うというようなエラーみたいです

# 対処法
Cargo.toml内に[dependencies]（依存関係）の定義をしている箇所があります。

~~~
[dependencies]
substrate-primitives = { version = "*", path = "../core/primitives" }
node-runtime = { version = "*", path = "../node/runtime" }
node-primitives = { version = "*", path = "../node/primitives" }
sr-primitives = { version = "*", path = "../core/sr-primitives" }
rand = "0.6"
clap = { version = "~2.32", features = ["yaml"] }
tiny-bip39 = "0.6.0"
rustc-hex = "2.0"
substrate-bip39 = { git = "https://github.com/paritytech/substrate-bip39" }
schnorrkel = "0.1"
hex = "0.3"
hex-literal = "0.1"
parity-codec = "3.2"
~~~

この場合、エラーメッセージに出力されているmatchしたバージョンに変更します。

~~~
schnorrkel = "0.9.1"
~~~

このバージョンを変更すると一応エラーを回避できました。
ただし、依存関係のバージョンが変わるのでその後の処理が正常に動作するかは分かりません。
よく使うviコマンド

## dd
行切り取り
## h
左
## j
下
## k
上
## l
右
## gj
下(表示上)
## gk
上(表示上)
## i
現在のカーソル位置から挿入
## R
現在のカーソル位置から置換
## A
現在行の末尾に追加
## O
現在行の前に行挿入
## o
現在行の次に行挿入
## u
一つ戻る
## ctrl+r
uで戻した動作を戻す
git あれこれ

## 事前知識

- qiitaなどでgitについて一度調べる。gitとは何か？みたいな
- git と githubの違いを理解　連携記事（https://qiita.com/oo-shin/items/06963c7a1b3219347348)

## よく使うやつ

```
- git add
- git commit
- git commit --amend # コミットを修正
- git log
- git show ハッシュ値
- git blame ファイルパス # そのファイルを編集した人を確認できる
- git reset --soft HEAD~ # コミットしてしまったモノをインデックスに戻す
- git branch -a # リモートブランチの一覧確認
- git rebase
  - conflictになった場合
    - >>> でソース検索して、コンフリクト個所を修正
    - git add . # 修正をインデックスに入れる
    - git rebase --continue # この繰り返し
- gitの設定ファイル
　- ~/.gitconfig  # ここを編集すると passwordを求められrない
```

### 手を動かしながら学習できるやつ

http://gitimmersion.com/



### commit周り

- commit までしてしまった変更内容を確認する

```
 git log -p -1
```

- commitをしてしまったのを戻す

```
git reset --soft HEAD~1
```


### リモートブランチ削除

```
# リモートブランチ確認
git brach -a

# 対象のブランチ削除
git push origin :hoge 
※closeになっている

# 手順
1.prの内容をコピーしてオク
2.ローカルのブランチ名変更
3.リモートブランチを削除する
4.再度 push

```

### 検索色々

https://help.github.com/ja/articles/searching-commits


## git squash

- commitをまとめるモノ

https://backlog.com/ja/git-tutorial/stepup/34/

### git 設定


git config
https://qiita.com/shionit/items/fb4a1a30538f8d335b35

### git 設定ファイル場所

~/.gitconfig


### ブランチ名変更

https://qiita.com/suin/items/96c110b218d919168d64

```
git branch -m <古いブランチ名> <新しいブランチ名>
```

### リモートブランチ削除

```
git push --delete origin branch_name
```


### 特定のコミットまで戻る

```
$ git reset --hard ハッシュ値
```

### git blame


```
git blame  パス　→ ハッシュ値取得

git show ハッシュ値　→ PR検索可能
```


ファイルの行毎に履歴を確認する


### git log --grep=検索文字列

https://qiita.com/scalewallet/items/5bce39e92a6a8722aa54

### initail commot

git commit --allow-empty -m "first commit"

### amend

git commit --amend
:wq
修正漏れでコミットできていない時


### add取り消し

git reset HEAD spec/models/product_spec.rb


### git commit  indexに戻す

git reset --soft HEAD~



## conflictを解除する

git add .
git rebase --continue

## cherry-pick修正内容だけ持ってくる

git cherry-pick 24838567ab060b430194fa6123a59ffa2f3589f2

- フロー

```

branchA　←コピーしたいブランチのハッシュ値を調べる　git logで

branchA-2を作成する

gc branchA-2

git cherry-pick ハッシュ値 of 24838567ab060b430194fa6123a59ffa2f3589f2

git branch  -D branchA

git branch -m branchA-2 branchA
```


### 解決法

$ rm -f .git/index.lock

## git 特定のコミットまでもどしたい

```
git reset --hard 90c3ef40fe27c02331c5ad76937dbcad0b1003f9
```
一般摂動法と特別摂動法

- 摂動源
    - 地球重力ポテンシャル
    - 太陽、月の引力
    - 大気抵抗
    - 太陽輻射圧
- 一般摂動法
    - 衛星の運動を解析的に解く
    - 粗い
    - 摂動を時間関数に展開
- 特別摂動法
    - 各時間ステップで運動方程式に摂動力を代入、数値的に時間積分
    - 高精度

# 特別摂動法
数値積分により求める。

```math
\frac{d^2 \boldsymbol{r}}{dt^2} = - \frac{GM}{r^3}\boldsymbol{r}+\boldsymbol{a}_1+\boldsymbol{a}_2\cdots
```
[AE]グラフエディターの動きを他のプロパティーにリンクしたい時

#時々あるよね！？
例えばスケールにキーフレームを設定して、グラフエディターで速度いじった後に、他のレイヤーも全く同じ表現したいけど、値が違うから難しい時。。
そんな時はみんな、目視でグラフに近い感じで合わせていると思うけど、そんな事はもうしないで大丈夫！
私が作ったエクスプレッション使ってみて！
これで解決！！

#グラフエディタの動きを同じにするエクスプレッション
まず説明すると
targeに基となるキーフレームを打ったプロパティに設定する。
setValに初期の値
プロパティのバリューに最終的な値を入力

これだけでOKです。
肝心なエクスプレッションはこちら

```jsx
target = thisComp.layer("Animation").effect("AKey")("スライダー");
setVal = 500;

function t (t,a,b){
	target = t;
	tempa = a;
	tempb = b;
	a = Math.abs(tempa-tempb);
	result = Math.abs(target-tempa);
	return result/a*1
}

t = t(target,target.key(1),target.key(3));
linear(t,setVal,value)	
```

スケールなどの二次元の場合はlength()使えばOK!

```jsx
function t (t,a,b){
    target = length(t);
    tempa = length(a);
    tempb = length(b);
    a = Math.abs(tempa-tempb);
    result = Math.abs(target-tempa);
    return result/a*1
}
```

#このエクスプレッションの面白いとこ
要はキーフレームの動きを0～１に変換しているだけです。
それをlinear（）メソッド使って表現しているだけ
【Swift】pinch in or out ができない時はisExclusiveTouchがtrueになっているかも！

pinch in or out ができない時はisExclusiveTouchがtrueになっているかも！

UIScrollViewのZoom周りをちゃんと設定したが、うまく拡大、縮小できないときは`isExclusiveTouch = true`になっていないか確認しましょう。

```swift

UIView.appearance().isExclusiveTouch = true
UIButton.appearance().isExclusiveTouch = true
self.isExclusiveTouch = true
```

上記のような設定がUIScrollView上のViewやCellに設定されていると、複数のViewで同時にTouchイベントを処理しなくなります。
なので、pinch in, outのような複数の指で行う動作がうまく行かないときがあります。
mruby-yabmでの時間処理

[パワーコントロールモジュール](https://qiita.com/yamori813/items/56eb3f797798af74b0c5)を作って、毎時0分に処理をするような仕組みにしてみたいと思いました。

蟹さんのmrubyには時間系のクラスが入ってないので、とりあえずbuild_config.rbにmruby-timeを加えてみました。

mrubyのlibのビルドはできるのですが、rtlbm-mrubyのビルドでreadなどのstdioの関数が無いというエラーになります。

おそらくmruby-time/src/time.cのコードでnewlibのstdioが必要な関数を呼んでいるのだと思われます。

ライブラリの関数をこつこつ外して調べていきます。time.oをnmでダンプしてmrb以外の関数シンボルを一つづつ潰していきます。

一つではなくて、複数だったので結構てこづりました。

localtime_r,mktime,strftimeが原因でした。

time.cにはMRB_DISABLE_STDIOの判断も入っているのですが、環境によっては機能しないようです。

rubyやmrubyのTime classはstrftimeによるものなので、strftimeが使えないのは致命的です。mruby-timeは諦めることにしました。

rtlbm-mrubyにはbearsslの証明書の時間確認のためにtime関数はすでに用意してあり、ntpである程度正確な時間にできるようになっています。

[mruby-yabmにnowを追加](https://github.com/yamori813/mruby-yabm/commit/3777759aadb70cece2c8f42caa7e5540185082f2)してtime()の値を返すようにすることにしました。

これで

```ruby
yabm.now % 3600 == 0
```

で毎時0分に処理が実行できるようになりました。

![スクリーンショット 2020-05-15 11.01.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/faf73c94-7d68-9c85-2193-8b92e0adfb4b.png)

![PowerOP.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/8d254d06-2ae2-c527-dae9-a62bdb61ac00.png)

[ここを参考](https://stackoverflow.com/questions/21593692/convert-unix-timestamp-to-date-without-system-libs)にしてmrubyでdateを計算してみました。

```ruby
yabm = YABM.new

seconds = yabm.now + 9 * 60 * 60
minutes  = seconds / 60
seconds -= minutes * 60
hours    = minutes / 60
minutes -= hours * 60
days     = hours / 24
hours   -= days * 24

year      = 1970
dayOfWeek = 4

while 1 do
  leapYear   = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0))
  daysInYear = leapYear ? 366 : 365
  if days >= daysInYear then
    dayOfWeek += leapYear ? 2 : 1
    days      -= daysInYear
    if dayOfWeek >= 7 then
      dayOfWeek -= 7
    end
    year += 1
  else
    ydays = days
    dayOfWeek  += days
    dayOfWeek  %= 7
    daysInMonth = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
    for month in 0..11 do
      dim = daysInMonth[month]
      if month == 1 && leapYear
        dim += 1
      end
      if days >= dim then
        days -= dim
      else
        break
      end
    end
    break
  end
end

yabm.print year.to_s + "\n"
yabm.print month.to_s + "\n"
yabm.print (days + 1).to_s + "\n"
yabm.print ydays.to_s + "\n"
yabm.print hours.to_s + "\n"
yabm.print minutes.to_s + "\n"
yabm.print seconds.to_s + "\n"
```
耳年齢判定ボットを改良（LINEで音声ファイルを再生）

##概要

普段は耳鼻科の開業医をしています。
以前obnizeのスピーカーからモスキート音を出し加齢性難聴をチェックするLINE Botを作成しました。
[耳年齢を判定するLINE Bot×Iotの作成](https://qiita.com/doikatsuyuki/items/1101ff4ba54cb4b471c0)

今回、モスキート音をファイルに入れ、LINEで音声ファイルを再生できるようにしました。

##作成方法
**1.モスキート音を用意する**

こちらを利用しました
[Sine Tone Generator](https://www.audiocheck.net/audiofrequencysignalgenerator_sinetone.php)

『File Generator』の
『Hz』をモスキート音の周波数に設定、『duration』は3秒とし『DOWNROAD.WAV FILE』をクリックするとダウンロードできます。
各周波数分用意します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453374/529fd904-fb41-da2b-9b5d-a43ef074fa38.png)

ダウンロードしたファイルを再生するとサイン音が聞こえます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453374/e96a5ae9-2940-d782-e11e-d7187a5b642e.png)

**2.publicフォルダを作ってwavファイルを設置**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453374/e4627ac9-14b9-c806-c608-0ab5a28da6ae.png)

**3.コードの追加**

```javascript

const config = {
    channelSecret: process.env.CHANNEL_SECRET,
    channelAccessToken: process.env.CHANNEL_ACCESS_TOKEN
};

const app = express();
app.use(express.static('public'));  //追加
```

**3.wavファイルのURLを動的に取得する**
app.post('/webhook'......内の処理を書き換える

```js
Promise
      .all(req.body.events.map(event=>handleEvent(event,req)))
      .then((result) => res.json(result));
```
function handleEvent(event) {　に引数を追加

```js
function handleEvent(event, req) {
  console.log(req);
  if (event.type !== 'message' || event.message.type !== 'text') {
    return Promise.resolve(null);
  }
```

メッセージ内にURLを入れる

```js
let url;
  if (hz == 0) {
    url ="";
  } else if (hz == 8000) {
    url ="デプロイしたボットのURL/public/8000.wav";
  } else if (hz == 10000) {
    url ="デプロイしたボットのURL/10000.wav";
  } else if (hz == 12000) {
    url ="デプロイしたボットのURL/12000.wav";
  } else if (hz == 14000) {
    url ="デプロイしたボットのURL/14000.wav";
  } else if (hz == 15000) {
    url ="デプロイしたボットのURL/15000.wav";
  } else if (hz == 16000) {
    url ="デプロイしたボットのURL/16000.wav";
  }
```

**LINEで複数のメッセージを返信する**

```js
 replyMessage(event.replyToken, [    
 { type: "text", text: "第一のメッセージ" },    
 { type: "text", text: '第二のメッセージ' }   
]) 
```

##完成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453374/4aaaf938-3e9f-92d1-1720-50b08017d4e7.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453374/a73307c3-f745-01af-1dce-9f5c83240d1f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453374/2ddaa8f5-d047-a42c-5894-698291b77f71.png)
XcodeのiOSシミュレーターとUnityビルドによるテスト

■Unity側
　Player Settings->Other Settings->
                    TargetSDK->Simulator SDK に変更

　シミュレーターはMetalに対応してないというエラーが出るので、
　Player Settings->Other Settings->Auto Graphics APIの
　チェックを外す

　Player Settings->Other Settings->Graphics APIに
　　　OpenGLES3、OpenGLES2を追加

　この状態でXcodeビルドを作る

■Xcode側
　Xcode->Preferences->Components->iOSのバージョン一覧が表示されるので、使用したいものをインストール

　Xcode->Open Developer Tool->Simulator　でシミュレーター表示

　Hardware->Device->OS選択->機種選択　で指定デバイス向けのテストができる。

　後はXcodeでRunするとアプリがシミュレーター内に入るので、
　それを選択する。
　

<img width="461" alt="スクリーンショット 2020-05-15 10.31.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17904/dc006ed6-600d-f07e-df85-38abde126d92.png">


・・・が、めっちゃ重い。ファンが全開で回ってる
結構良いMacBookとかじゃないと細かい動作検証は厳しいのではないかと思いました。
解像度対応できているかや、画面遷移、ボタンチェック、ぐらいならできなくはなさそう。　


■環境
Unity 2019.2.18f1
Xcode 11.3.1
Macbook Pro Mid 2014
MacOS Catalina 10.15.2
DingTalk と DingTalk Liteのアカウントの違い

以前紹介したように、Ding TalkとDing Talk Liteには[ログイン方法の違い](https://qiita.com/eterao/items/ff416577189b7853fb2b)がありました。

|アプリ|ログイン方法|
|:-----|:-------|
|DingTalk|携帯番号(SMS)＋認証コード、QRコード(Win/Mac)|
|DingTalk Lite|携帯番号(SMS)＋認証コード、メールアドレス＋パスワード、QRコード(Win/Mac)|

既存のアカウントでも、Ding TalkにもDing Talk Liteにもログインが出来るので、UIが違うだけなんだろうと思っていました。ですが、 **SMSでアカウントを作るか、メールアドレスで作るかによって、実はアカウントの種類が異なるようです** 。

その最も分かりやすい確認方法は、マイプロフィールでメールアドレスと言う項目があるかどうかです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70132/0b7a584c-8dfa-4afb-fcaf-4d2771c5ba35.png)

そして、これが何に影響するかというと、チーム（組織）を作ったときにどのアカウントが参加出来るかが変化します。まとめるとこのようになります。

|↓主催者/参加者→|SMSログイン|メールログイン|
|:-----|:-------|:-------|
|SMSログイン|参加OK|参加NG or 電話番号追加|
|メールログイン|参加OK|参加OK|

国際環境では今後メールログインが増えると思います。

SMSログインの人が作ったチームには、メールログインアカウントでは参加することが出来ないか、電話番号を追加入力する必要があるようです。

# まとめ

今後、**日本でチームを作る際は（無ければ作って）メールログインのアカウントで、チームを作るのが良さそうです** 。そうするとメールログインアカウントもSMSアカウントも参加出来ます。注意しますしょう。

良いDing Talk Lifeを。

（公開時点での状況です。すべての状況をチェックしているわけではないので不正確な可能性があります。また、時間がたつにつれ仕様が偏向される可能性もあります。あらかじめご了承ください）
swiftのシーケンスとコレクションを扱うためのプロトコル　超初心者のメモ

シーケンスとコレクションを扱うためのプロトコル

シーケンスとはその要素に一方向から順次アクセス可能なデータ構造です。
例えば、配列は先頭のインデックスから要素に順次アクセスできるため、シーケンスの一種であると言えます。
標準ライブラリにはシーケンスを汎用的に扱うためにSequenceプロトコルが用意されています。

コレクションは、一方向からの順次アクセスと、特定のインデックスの値への直接アクセスが可能なデータ構造です。
機能の差からわかるように、コレクションはシーケンスを内包する概念です。

Sequenceプロトコルは、次のインターフェースを提供します。
forEach
filter
map
flatMap
compactMap
reduce

使い方の例

filter 
指定した条件を満たす要素のみを含む、新しいシーケンスを返すメソッドです。

```swift
let array  = [1, 2, 3, 4, 5]
let enumerated2 = array.filter({e in e % 2 == 0})
print(enumerated2) // 2, 4
```

compactMap
compactMapは全ての要素を特定の処理で変換するという点ではmapメソッドと同じですが、変換できない値を無視するという点が異なります。

```swift
let strings = ["foo", "123", "bar", "456"]
let integers = strings.compactMap({value in Int(value)})
print(integers)
```
結果は、変換に成功した123と456のみを含むInt型の配列です。変換に失敗した"foo"や"bar"は無視された事がわかります。

Collectionプロトコルは、Sequenceプロトコルを継承しています。
そのため、Collectionプロトコルにい準拠する型に対しては、Sequenceプロトコルが提供するfilterや、mapを使用可能です。

```swift
let array = [1, 2, 3, 4, 5]
array[3] // 4
array.isEmpty // false
array.count // 5
array.first // 1
array.last // 5
```
PHP - Lighttpdでのファイルのアップロードサイズ変更

# はじめに
PHPはPHPでもphp-cgiを使用した時のメモ

Apache向けが多いので**Lighttpd**向けに
組み込みLinuxで軽量・簡単にWEBアプリケーションを作る人の選択肢が多いと思われます。
スタンドアロンな製品に簡易操作メニューを作りたい場合とか

## 調べた時の一生忘れていけない覚書
※　次の製品を作るころには忘れてる、ので書いておく

`・lighttpdでは.htaccessは使えない`
`・lighttpd.confではphp.iniで設定する内容を記述できない`


# 環境・条件
事前にLighttpdでPHP（php-cgi）が動いていること
(phpコマンドが入っていなくてもよい)

<dl>
 <dt>WEBサーバー</dt>
  <dd>lighttpdを使用</dd><br/>
 <dt>PHP version</dt>
  <dd>ver 5.6</dd>
</dl>


# php.iniを修正
php.iniは5.6デフォルトから必要なパラメータだけを修正しました。

デフォルトのphp.ini（5.4～5.6、7.0～7.3まであります）
ここのページの下あたりにあります。
https://webhost.ai/download-default-php-ini-files/
たくさんあるので、ローカルに保存しておけば、いつの日か役に立つかも

デフォルト128Mから256Mに変更
ファイルサイズが大きいと時間がかかるのでタイムアウト時間を変更

以下のパラメータで変更可能

``` php:php.ini
memory_limit = 256M
post_max_size = 256M
upload_max_filesize = 256M
default_socket_timeout = 180
```

ただし変更する場合は以下の条件を満たすこと
イコールでもＯＫ

**memory_limit >= post_max_size >= upload_max_filesize**


## 修正した個所の解説
``` php:php.ini
; L411 (default 128M
; メモリ使用量の上限 単位をつけること
memory_limit = 256M

L679 (default 128M
; POSTデータの最大サイズ 単位をつけること
post_max_size = 256M

L811(default 128M
; 1ファイルあたりの最大アップロードサイズ 単位をつけること
upload_max_filesize = 256M

L839 (default 60
; タイムアウト時間の変更 単位は秒、何もつけない
; 大きいデータは時間掛かるのでデフォルト60だと短い場合が発生してしまうことがある
default_socket_timeout = 180
```
コロナウィルスの前にまずSARS分析してみた

#はじめに
最近コロナウィルスが流行っていて家にいるのも退屈で、早く外に出たいので、今後のコロ
ナウィルスの動向を知ろうと思い同じ種類のSARSウィルスから分析してみました。
##今後の展望
1.コロナウィルスの流行に伴い、同じ分類であるSARSウィルスの分析を行う
2.その後コロナウィルスに関しての分析も行う
3.両者を比較してみる
##まず最初に
分析すると言ってもものデータがない言うことで、まずはデータ探しを開始したのですが、
　　　　　　　　　　　**良い感じのCSVデータが存在しない**
と言うことで、まずはCSVファイルから作成することに、[WHO]("who.int")からSARSのデータを探し
だし、作成しました。
###実際作成したCSV###
<img width="640" alt="スクリーンショット 2020-05-15 8.35.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563640/37dec6cc-6741-ed89-dd18-4aa78e9b2286.png">
これは10日目までのデータです。自分で作成したので欠損値も少なくて良さそうです。
##実際に分析してみる
それでは実際の分析に移りたいと思います。
### 1.ライブラリ

```python:SARS.ipynd
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
```
###2.CSVの出力

```python:SARS.ipynd
df1 = pd.read_csv('analytics_SARS].csv')
df1.head()
```
###3.感染者数の増加を見てみる

```python:SARS.ipynd
x_num = df1['day']
y_num = df1['total']
plt.plot(x_num,y_num)#グラフを表示
```
<img width="396" alt="スクリーンショット 2020-05-15 8.58.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563640/5dd9df19-2e2f-701f-ba63-380eaac3478b.png">
60日ほどまでは、上昇傾向にあったがそこからは感染者の数が著しく減ったことがわかる。
###4.1日あたりの感染者数の増減を見てみる

```python:SARS,ipyind
x_num = df1['day']
y_num = df1['total-change']
plt.plot(x_num,y_num)#グラフを表示
```
<img width="396" alt="スクリーンショット 2020-05-15 9.06.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563640/98f320e6-ff39-b7c0-fdb1-110297f70652.png">
最初の方の変動は徐々に新たな国から感染の報告が来るからだと予測できる。
###5.死者の増加を見てみる

```python:SARS.ipynd
x_num = df1['day']
y_num = df1['death']
plt.plot(x_num,y_num)#グラフを表示
```
<img width="396" alt="スクリーンショット 2020-05-15 9.10.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563640/3670fcb7-bb3f-90ae-e33a-613c701e0ff6.png">
約100日で800人もの死者が出ている。つまり単純計算1日で8人もの人が死んでいる。

###6.1日あたりの死者の増減を見てみる

```python:SARS.ipynd
x_num = df1['day']
y_num = df1['death-change']
plt.plot(x_num,y_num)#グラフを表示
```
<img width="396" alt="スクリーンショット 2020-05-15 9.20.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563640/68204a68-3227-d45e-15c0-f1ffcccb397a.png">
1日あたりの死亡者数は増えたり減ったりしている。これは死亡の知らせが届く周期によるものだと思われる。
######死亡率

```python:SARS.ipynd
 df1['death'].sum() / df1['total'].sum() 
```
致死率は0.08121591227553301、つまり約8%だと言うことがわかる。



###７.回復者数を見てみる
```python:SARS.ipynd
x_num = df1['day']
y_num = df1['recovery']
plt.plot(x_num,y_num)#グラフを表示
```
<img width="396" alt="スクリーンショット 2020-05-15 10.02.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563640/1fd38d40-4125-4390-4447-39bbd7cbcaea.png">
20日あたりから徐々に回復者が現れたことがわかる。そこからの回復者数の増加は著しい。

###8.1日あたりの感染者数の増減を見てみる
```python:SARS.ipynd
x_num = df1['day']
y_num = df1['recovery_change']
plt.plot(x_num,y_num)#グラフを表示
```
<img width="396" alt="スクリーンショット 2020-05-15 10.03.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563640/e2392571-e81e-00d7-a2ee-f2a12598ce8a.png">
20日あたりに急激な上昇が見られる。これは各国の回復者数報告の関係だと思われる。
ただ、回復者数は平均して安定していると思われる。
#まとめ
今回は単純で簡単な分析を中心に行った。
簡単なコードと簡単な計算を使い分析を行ったが、**グラフ化するだけでわかりやすくなった**と思います。また、今後はより高度な分析や、コロナの分析も行おうと思います。
超簡単２ステップ！WSL2+GitKraken+VsCodeで開発する設定

# 目的
wsl2でコードを管理する際，Vscodeのgit拡張機能を利用していたが，GitKrakenのGUIで管理したくなった．
（ブランチがうねうねなるの楽しい）
サーバーで計算回す用のシェルスクリプトなどもテストしたいので，実行環境はUbuntuが望ましい．
あまりにも簡単なので需要あるか怪しいが初投稿なので練習も兼ねて...

# 方針
方法は2通りある．
1. XcXsrvを使ってWSL2のGUIがWindows側から見れるようにし[（参考記事）](https://qiita.com/momomo_rimoto/items/51d533ae9529872696ce)，WSL2のUbuntuにGitKrakenを入れる．
2. VsCodeのデフォルトターミナルをwslとし，Windows領域でプロジェクトを管理する．

2の方が圧倒的に簡単に設定でき，GitKraken起動時にコマンドを打つ必要もないのでこちらで進める．

# やり方
1. VsCodeのターミナルを開く
2. 赤枠をクリック->既定シェルの選択 -> wsl
![tempsnip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535181/99b8ab24-8cb2-2706-40ca-23fcfb1b2882.png)
3. これでターミナルを開くとmnt/c/で開かれる．シェルスクリプトも普通に動くし，Windows領域なのでWindowsに入っているGitKrakenで簡単に管理できる．
NLB に VPCFlowLogs を設定する

# 背景
AWS上にTCPリスナーのNLBを構築した時に、
全て正しく設定されているように見えるのに、なぜかログが出力されない事象に遭遇しました。

ALBと同じようにアクセスログを出力してくれるものだと思っていたのですが、
TCPリスナーの場合はアクスエスログを出力しない仕様でした。

VPCフローログは設定できそう、という情報をもらい

- 存在は認識していたが、触ったことがなかった
- なんらかの方法でトラフィックを確認できるものがあれば、、と思っていた

ので、ドキュメントを読みつつ設定を試してみることにしました。


# 目的
AWSのドキュメントを読んだり、実際に設定してみてせっかくなのでわかったことをまとめておきます。

# [VPCフローログ](https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/flow-logs.html)とは

VPC内のネットワークインターフェースを行き来するトラフィックのをキャプチャするもので
主に以下のような情報が含まれます。
※詳しくは[こちら](https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/flow-logs.html#flow-logs-fields)

| フィールド | 概要 | 
|:-----------|------------:|
| version | ログフォーマットのバージョン | 
| account-id | AWSアカウントID |
| interface-id | ネットワークインターフェイスのID(eni-とつく) | 
| srcaddr | 受信トラフィックの送信元アドレス |
| dstaddr | 送信トラフィックの送信先アドレス | 
| srcport| 送信元のポート | 
| dstport| 送信先のポート | 
| protocol| トラフィックのプロトコル | 
| packets| 転送されたパケット数 | 
| bytes| 転送されたバイト数 | 
| start| 最初のパケットが受信された時間 | 
| end| 最後のパケットが受信された時間 | 
| action| セキュリティグループorネットワークACLで許可されているか | 
| log-status| ロギングのステータス | 


## ログフォーマット
以下の２パターンです。

- デフォルト形式
- カスタム形式

カスタム形式の場合は各フィールドの出力順や、各フィールドを出力させるかさせないかをカスタマイズすることが可能です。

## ログフォーマットのバージョン
2020/5時点では最新バージョンは3、デフォルトバージョンは2になっています。

VPCフローログをデフォルト形式で作成した場合、ログのフィールドに含まれるバージョン2のフィールドですが、カスタム形式だとバージョン３のフィールドも利用可能です。

## ログ送信先
選択肢はCloudwatch LogsまたはS3 Bucketの2つで、それぞれの特徴は以下です。

- Cloudwatch Logs
  - デフォルト形式のみ対応
  - Cloudwacth アラームとの連携が可能

- S3 Bucket
  - カスタム形式の利用が可能
  - Athenaでログの検索が可能

# 設定方法
今回はNLBのネットワークインターフェイスに対して設定し、送信先はS3(事前に作成済み)、カスタム形式で試してみます。

コンソールでEC2 > ネットワークインターフェイス > NLBにアタッチされているネットワークインターフェースを選択すると画面下にフローログのタブが表示されるので、「フローログの作成」をクリックします。

<img width="1399" alt="create-vpc-flow-log.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413013/71a413af-060b-c04e-888b-6b2a2a1d197f.png">

必要事項を入力します。
![setting-vpc-flow-log.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413013/b4e62109-897f-c640-b5a4-a34f7618bdbf.png)

Filter欄では、Accept、Reject、Allの選択が可能です。
S3バケットの欄はキーを含めることも可能で、1つのS3 Bucketに複数のVPCフローログを含める、ということができそうです。

設定はこれで完了です。

# 発行されるログ
```
version account-id instance-id interface-id srcaddr dstaddr srcport dstport protocol packets bytes start end action log-status
3 unknown - eni-xxxxxxxxxxx 10.1.1.15 10.1.2.32 1433 57640 6 3 164 1589466553 1589466612 ACCEPT OK
```

# 所感
- 設定は簡単
- このログで最も確認できるのは、本当にシンプルにセキュリティグループで許可されたトラフィックか否か
- ヘルスチェックのログがそこそこある
    - バイト数は記録されるので、ヘルスチェックのものかサービスのものかはバイト数が唯一の比較材料？
- やはりセキュリティの観点で利用するものの印象。サービスのトラブルシューティングに使うものではなさそう

# 注意点
- 送信先に関わらず、料金はCloudwatchのログが課金されます。
- ログには最初と最後のパケットを受信した時間が記録されますが、UNIX秒なので読み替えが必要です。
- フローログを作成してから実際に送信先に出力されるまで、多少時間がかかります。
Bitnami Redmine(Linux版)復旧手順

Bitnami Redmine(Linux版 ver.4.1.1-1)でブラウザがHTTP500エラーで開けなくなった。
備忘録として、バックアップ～リストア手順を残しておく。

##### ①バックアップ取得
- チケットの添付ファイル
　Bitnami\redmine-4.1.1.0\apps\redmine\htdocs\files
　filesディレクトリを丸ごとコピーしてバックアップ先に格納しておく

- データベース(チケットやプロジェクトなど設定全て)
　データベースのバックアップ～復旧は、PhpMyAdminをブラウザで開き行う方法と、コマンドから行う方法がある。

**[PhpMyAdminで行う場合]**
Bitnami redmine stack画面 > Open phpMyAdmin を選択
ID：root/Pass：password　でログインできる

画面左でダンプしたいデータベース『bitnami_redmine』を選択する
選択項目は「すべてをチェックする」「チェックしたものを：エクスポート」にて、
sql形式で任意の場所にエクスポートする

**[ターミナルからコマンドで実行したい場合]**
Bitnami\redmine-4.1.1.0\apps\redmine\htdocs\config\database.yml
上記ymlファイルの内容をメモしておく

　production:
　　adapter:
　　database:　←データベース名
　　host:
　　username:　←ユーザ名
　　password:　←パスワード

mysqldump -u (ユーザ名) -p (パスワード) (データベース名) > データ出力先

##### ②アンインストール
Redmineの格納フォルダを削除
コマンド　rm -rf /格納先のパス

##### ③再インストール
Bitnami redmineパッケージを再インストール

##### ④リストア
**[PhpMyAdminで行う場合]**
1. Open phpMyAdmin からブラウザを開く
2. 画面左でデータベース『bitnami_redmine』を選択し、中のデータを全て削除する
3. ②でバックアップしたsplファイルをインポートする

**[コマンドで行う場合]**
mysql -u (ユーザ名) -p (パスワード) (データベース名) > ダンプしたデータを指定
上記のユーザ名などはdatabase.ymlを再度確認すること

**[チケットの添付ファイルの復旧]**
添付ファイルをfilesディレクトリに丸ごと格納
CCC: coding crash course (1) 

内部向け資料。

プログラミングの基礎講座

# Ubuntu

OS: Operating System

- 例１　Windows, macOS, Linux
- 例２ iOS, Android

Linux: 無料のOS

- 例　Ubuntu ー　今後はこのOSを用います。


Ubuntu

キーボードでOSとやり取りするには、ターミナル（端末）を用います。
今後、「$ xxxx」と書いてある場合は、ターミナル（端末）で「xxxx」と打ち込んでEnterを押すことを意味します。
今後、「\# コメント云々」と書いてある場合は、理解の補助として「コメント云々」と表記していることを意味します。


\# 例えばtaro さんの端末ではこのように表示されます。

$ whoami
taro


$ pwd
/home/taro 

$ ls -l
drwxr-xr-x  2 taro  staff   64 May 14 20:12 Desktop
drwxr-xr-x  2 taro  staff   64 May 14 20:12 Downloads

$ mkdir project
\# project というディレクトリ（フォルダ）を作成。


$ ls -l
drwxr-xr-x  2 taro  staff   64 May 14 20:12 Desktop
drwxr-xr-x  2 taro  staff   64 May 14 20:12 Downloads
drwxr-xr-x  2 taro  staff   64 May 14 20:12 project

$ cd project
\# project というディレクトリ（フォルダ）に移動。

$ ls -l 
-rw-r--r--@ 1 taro  staff  564 May 14 20:40 test1.py


# python 

$ python test1.py

のような形でターミナルからプログラムを実行する。

```python

# test1.py

import numpy
# numpyモジュールをインポートする（読み込む）

print('Hello, world')

y = 570*3

print(y)


name = 'Taro'

print(name)

x = numpy.pi + y


#print('%s says x is %lf' % (name, x))

print('--')
list_name = ['taro', 'hanako', 'madoka']

list_test_score = [95, 100, 120]



#len(A) で、Aの長さ(length)を表示する。
print( len(list_names)  )

print( list_name[0], list_test_score[0] )
print( list_name[1], list_test_score[1] )
print( list_name[2], list_test_score[2] )


# for loop で自動的に表示する。
for i in range(len(list_names)):
    print ('%s test score is %d' % (list_name[i], list_test_score[i]))
    print('--')


```
vue.js laravel-mix npm run watch 時々 TypeError: Cannot read property 'call' of undefined at __webpack_require__ 

このエラーがきつい。
極稀にビルドしするとなるんだよ。

で、ググっても同じエラーでて来ない。
参考として、

https://github.com/webpack/webpack/issues/95

なんだけど。

結論として、
「ブラウザのキャッシュ残ってまっせー！」
ってこと。

なので、毎回ファイル名を変更して吐き出すように設定する。

```

const mix = require('laravel-mix');
/*
|--------------------------------------------------------------------------
| Mix Asset Management
|--------------------------------------------------------------------------
|
| Mix provides a clean, fluent API for defining some Webpack build steps
| for your Laravel application. By default, we are compiling the Sass
| file for the application as well as bundling up all the JS files.
|i

キャッシュ対策に version(); をつけているので、本番は削除する。

*/

/* めっちゃ大事 */
mix.webpackConfig({

    output: {
        chunkFilename: 'js/chunks/[name]-[hash].js',
    }
});



/* この version ってのも大事 */
mix.js('resources/js/app.js','public/js') .version()
.sass('resources/sass/app.scss','public/css')
.sass('resources/sass/lightbox.scss','public/css');


```

以上。
Flutter環境構築 〜Flutterのサンプルアプリを起動するまで〜

## Flutterとは
Googleが提供しているモバイルおよびWebアプリケーションのバックエンドサービスのこと。

## Flutterインストールまで

###Flutterのサイトにアクセス
[Flutter](https://flutter.dev/)

### Flutterインストール画面へ
サイト右上のGet startedをクリック
![flutter-start2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473780/3b8af56d-3553-3a6d-f626-ba06f017aff8.png)

### 各OSごとのインストール画面へ
自分のPCのOSをクリック
![flutter-start3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473780/b5847b99-7e2d-8ee4-3020-1070fd2977cc.png)

### ファイルダウンロード
Flutter(SDK)ファイルをダウンロード
![flutter-start4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473780/e465a022-0f63-87a8-620b-85dd1f208fd2.png)

### ファイルを解凍
ダウンロードしたZipファイルを解凍
![flutter-start5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473780/e5ad69de-1f0c-7b3b-2e54-364689cb2f92.png)


### ファイルを配置
FlutterファイルをPCドライブ内の好きな場所に移動。今回はUser直下にdevelopmentフォルダを作成し、その配下にFlutter(SDK)ファイルを配置。
![flutter-start6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473780/55831e8c-9ec2-97e7-f207-fce9194ba070.png)

### 設定ファイルを開く
ターミナルを開きコマンドで、設定ファイルを開く

```terminal:ターミナル
open ~/.bash_profile
```

### パスを通す
FlutterコマンドをFlutterファイルにパスを通す

```text:~/.bash_profile
export PATH="$PATH:/Users/ユーザ名/development/flutter/bin"
```
![flutter-start8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473780/cade9d93-eb80-54b3-5878-6adab268b5b5.png)


### 設定を反映
ターミナルで設定ファイルの反映コマンドを実行

```terminal:ターミナル
source ~/.bash_profile
```

## Flutterプロジェクト起動まで

### プロジェクト作成
ターミナルでFlutterプロジェクト作成のコマンドを実行

```terminal:ターミナル
flutter create appname
```

### シミュレータ起動
[Android Studio](https://developer.android.com/studio/)
[Xcode](https://apps.apple.com/jp/app/xcode/id497799835?mt=12)

![flutter-start11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473780/9c75dc5a-28d9-5ded-91b8-284880e50136.png)


### プロジェクトにカレントディレクトリ移動
cdコマンドで作成したプロジェクトにカレントディレクトリを移動します

```terminal:ターミナル
cd appname
```

### Flutter起動
Flutter起動コマンドを実行

```terminal:ターミナル
flutter run
```

![flutter-start12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473780/840055d0-12e2-9194-82e1-baa71ef76829.png)

## この内容について
この内容は、私が運営しているサイトに、より見やすく掲載しているので、よければそちらもご活用ください。
[【Flutter】環境構築 | コレワカ](https://korenarawakaru.com/tech/flutter/flutter-start)
【Rails】has_manyの数を制限するvalidate

例えば、Userが持てるPostの数を制限したいときは、Post側にvalidateを設定します。

```ruby:user.rb
class User < ActiveRecord::Base
  has_many :posts, dependent: :destroy
end
```

```ruby:post.rb
class Post < ActiveRecord::Base
  MAX_POSTS_COUNT = 5

  belongs_to :user
  
  validate :posts_count_must_be_within_limit

  private

    def posts_count_must_be_within_limit
      errors.add(:base, "posts count limit: #{MAX_POSTS_COUNT}") if user.posts.count >= MAX_POSTS_COUNT
    end
end
```

これで、6個目のPostを作成しようとするとエラーになります。

ちなみに、Userにvalidateを定義した場合はUserをsaveしたときにvalidateが走ります。
つまり、**Postのsave時にvalidateが効かず**、6個目のPostを作れてしまうのでNGです。

```ruby:user.rb
class User < ActiveRecord::Base
  has_many :posts, dependent: :destroy
  
  validates :posts, length: { maximum: 5 } # ←これでは`user.posts.create`のときに動かず、6個目のPostを作成できてしまう
end
```

## 環境
- Ruby: 2.6.3
- Rails: 6.0.2.2
VPNについてメモ（CentOS8 に SoftEther VPN 入れたけどね）

コロナウイルス騒動でテレワークしている今日この頃ですが、暇しているのも時間がもったいないので自宅にもVPNいれてようと調べてみた結果です。まあ今更っていうのがあるのですが単に自分メモです（まとめておかないとすぐに忘れるｗ）。


# お手軽にVPNできるのね
専用の機器買わずとも市販の無線LAN/Wi-Fiルーターで簡単に実現できるのね。用途次第だとは思うけどL2TP/IPsec対応の機器でも個人で買える価格帯ですね。

- [【2020年版】各メーカーのWi-FiルーターでVPNを使う方法/対応有無](https://24wireless.info/how-to-use-vpn-on-wifi-router)

VPNソフトも結構種類があるのね、こちらは無料のから有料まであるけど割といいお値段（毎月だし）。まあその分、相談にのってくれたり色々とあるんでしょうね。

- [VPNの比較・ランキング・おすすめ製品一覧](https://www.itreview.jp/categories/vpn?company_size=4)

# SoftEther VPN Server
google先生曰く”10分で簡単にできるよー”っていう記事を列挙します。導入については本家のサイトが非常に詳しく説明しているので一読するといいですね。

- [Softether VPN 動作環境](https://ja.softether.org/4-docs/1-manual/3/3.1)

導入方法や接続手順の方法は、記事のほうが参考になる。
たしかに我が家のサーバ(CentOS8)にも入れてみたが、10分前後で導入できたね。

- [VPNサーバー構築(SoftEther VPN Server)](https://centossrv.com/softethervpnserver.shtml)
- [SoftEtherによる踏み台用VPNサーバーの構築手順 on IDCFクラウド CentOS 7](https://inaba-serverdesign.jp/blog/20170817/softether_vpn_idcf_cloud_centos7.html)
- [宅内CentOS8にSoftEtherをインストールしてインターネット外部からLAN参加出来るVPN環境を無料で作る](https://one-it-thing.com/5982/)

# SoftEther VPN Server を運用するに前に
下記？は最低でも見直しておいた方がよい。

リスナーポートの制限、サーバ管理マネージャに接続できる端末範囲
　⇒　[softetherのちょっとしたセキュリティ向上設定](https://qiita.com/rimksky/items/ea62876bc154b9bfca76)
　⇒　[自分専用のVPNサーバを構築しよう(セキュリティ向上編)](https://wp.nippombashi.net/2019/lets-set-up-own-vpn-server4/)

ログローテイト
　⇒　[VPN サーバー(SoftEther) のログ出力先を変更する](http://sstea.blog.jp/raspi/vpn_server3.html)

OSパケット転送の有効化
　⇒　[パケット転送をオンにする](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/6/html/load_balancer_administration/s1-lvs-forwarding-vsa)

# OSS版 SoftEther ではリージョンロックされている
製品版の「PacketiX」を使用すれば、RADIUS 認証や固有証明書認証などの認証方法が使えるが、OSS版ではリージョンロックされている。ソースの一部を修正することでロック解除できる(自己責任)。※手順はいたって簡単

- [SoftEther のリージョンロックを外して RADIUS や証明書認証を有効にする](https://blog.cles.jp/item/9524)

# その他リンク先
- [SoftEther VPNによるVPN環境構築(18) v6プラス対策としてのOpenVPN接続(Android編)](https://solomon-review.net/construct-softether-vpn-18/)
- [リモートワーク実現のためSoftEther VPNを利用したVPNサーバを作ってみた](https://www.seeds-std.co.jp/blog/creators/2020-04-06-195435/)

# 使ってみて＆運用してみて
ただでさえポート穴開けしているのでセキュリティはガチガチにしておくのは当たり前だけど、大陸の方＆お隣の国からは連日アタックあるのでそこのIPは通さないようにしておくのがベストですね。それさえ対処していればVPN便利ですね。会社で運用する場合は、簡単に穴あけれない（個人情報流出とかあるから）かもだけど、コロナで在宅ワークも一般的になりつつあるのかなーって感じですね。
macOSにPostgreSQLを導入

# Brewで導入

```bash
$ brew install postgresql
To migrate existing data from a previous major version of PostgreSQL run:
  brew postgresql-upgrade-database

To have launchd start postgresql now and restart at login:
  brew services start postgresql
Or, if you don't want/need a background service you can just run:
  pg_ctl -D /usr/local/var/postgres start
==> Summary
🍺  /usr/local/Cellar/postgresql/12.2_1: 3,218 files, 37.8MB
```

# データベース初期化

```bash
$ initdb /usr/local/var/postgres -E utf8
The files belonging to this database system will be owned by user "ogasawara_dev".
This user must also own the server process.

The database cluster will be initialized with locales
  COLLATE:  C
  CTYPE:    UTF-8
  MESSAGES: C
  MONETARY: C
  NUMERIC:  C
  TIME:     C
initdb: could not find suitable text search configuration for locale "UTF-8"
The default text search configuration will be set to "simple".

Data page checksums are disabled.

creating directory /usr/local/var/postgres ... ok
creating subdirectories ... ok
selecting dynamic shared memory implementation ... posix
selecting default max_connections ... 100
selecting default shared_buffers ... 128MB
selecting default time zone ... Asia/Tokyo
creating configuration files ... ok
running bootstrap script ... ok
performing post-bootstrap initialization ... ok
syncing data to disk ... ok

initdb: warning: enabling "trust" authentication for local connections
You can change this by editing pg_hba.conf or using the option -A, or
--auth-local and --auth-host, the next time you run initdb.

Success. You can now start the database server using:

    pg_ctl -D /usr/local/var/postgres -l logfile start
```

# バージョン確認

```bash
$ postgres --version
postgres (PostgreSQL) 12.2
```

# Brew Service

## サービス一覧で確認

```bash
$ brew services list
Name              Status  User Plist
mongodb-community stopped      
mysql             stopped      
postgresql        stopped      
unbound           stopped
```

## サービスの起動

```bash
$ brew services start postgresql
==> Successfully started `postgresql` (label: homebrew.mxcl.postgresql)
```

## サービスの停止

```bash
$ brew services stop postgresql
Stopping `postgresql`... (might take a while)
==> Successfully stopped `postgresql` (label: homebrew.mxcl.postgresql)
```


# PostgreSQLの設定を編集

`/usr/local/var/postgres/postgresql.conf`を編集。

```sh:postgresql.conf
listen_addresses = 'localhost'
port = 5432
```

# ユーザーの作成

```bash
$ brew services start postgresql
==> Successfully started `postgresql` (label: homebrew.mxcl.postgresql)
$ createuser -P username
Enter password for new role: 
Enter it again:
```

# 参考

[MacにPostgreSQLをインストール - Qiita](https://qiita.com/_daisuke/items/13996621cf51f835494b#homebrew%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)
#Ruby 配列/ハッシュでぼっち演算子を利用して nil エラーを防ぐ ( NoMethodError: undefined method `[]' for nil:NilClass )

`[]` メソッド対して引数を与えれば良い


# Array

```rb
[:a, :b, :c][0]
# => :a

nil[0]
# NoMethodError: undefined method `[]' for nil:NilClass

nil&.[](0)
# nil
```


# Hash

```rb
{a: :x}[:a]
# => :x

nil[:a]
# NoMethodError: undefined method `[]' for nil:NilClass

nil&.[](:a)
# nil
```


# Original by Github issue

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











<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
誰でもわかるJavascript - bind編

Javascriptのbindの記事を読んでも、さっぱりわからないという人(自分)のために解説してみる。

#bindの基本

以下のオブジェクトが定義されているとする。

```javascript:
const person = {
  age: 20,
  displayAge: function() { console.log(this.age); }
};
```
`person`オブジェクトを通して`displayAge`関数を実行すると「20」が表示される。

```javascript:
person.displayAge(); // 20
```

`displayAge`関数を変数に代入して、実行すると何故か「undefined」が表示されてしまう。

```javascript:
const newDisplayAge = person.displayAge;
newDisplayAge(); // undefined
```

`newDisplayAge`の中身を見てみると当然`displayAge`関数が代入されている。
しかし、`this`が何であるかわからない状態になっている。[^1]

```javascript:this?
console.log(newDisplayAge); // function() { console.log(this.age); } 
```

そこで`bind`関数を使うと`this`が何であるかを教えてあげることで正常に動作する。

```javascript:
const bindDisplayAge = person.displayAge.bind(person);
bindDisplayAge(); // 20
```

#bindの応用
`bind`の第1引数には`this`、それ以降の引数には関数に渡す引数が定義できる。
以下のコードでは`greet`関数に`this`が使用されていない。
そのため、第1引数には`null`渡し、第2引数で`greet`関数の`name`引数に`'taro'`を渡している。[^2]

```javascript:
const person = {
  greet: function(name) { console.log('hello ' + name); }
};

const greetPerson = person.greet.bind(null, 'taro');
greetPerson(); // hello taro
```


#どういう時に使うのか
関数を実行したくないが、呼び出すだけで実行できる状態にしておきたいときに使う。
具体的な例としてボタンが押された時のイベントハンドラーに`this`や引数が使用されている場合、`bind`が必要になる。

```javascript:
const person = {
  age: 20,
  displayAge: function() { console.log(this.age); }
};
const button = document.querySelector('button');

// 以下は想定の動作とは異なる。
button.addEventListener('click', person.displayAge()); // ページ読み込み後に'20'が表示
button.addEventListener('click', person.displayAge);   // ボタンクリック時に'undefined'が表示

// 正常に動作する。
button.addEventListener('click', person.displayAge.bind(person)); // ボタンクリック時に'20'が表示
```

[^1]: 正確に書くとブラウザで実行した場合、thisはWindowオブジェクト
[^2]: 第1引数にpersonを渡してもエラーにはならない
WordPress スターター テーマ Sage : Blade Templates のマニュアルを読み解く

# wp blade compile で何が起きるんだろう？

https://roots.io/docs/sage/9.x/blade-templates/#wp-cli-utility の

> * wp blade compile
> * wp blade clear
> * wp blade wipe

ここ compile したら何が起きるのか詳しく書いてないので実際にやってんみることにする

## blade-generate をインストール

Sageを入れたら`WP-CLI`が勝手にインストールされてるんでしょ（予想）
とりあえずマニュアルに書いてある以下のコマンドを打ってみる

> $ wp package install git@github.com:alwaysblank/blade-generate.git

ワロタw

```
bash: wp: command not found
```

もう`WP-CLI`を入れてってマニュアルに書いててよね（憤怒）めんどくさいなぁ

### WP-CLIをインストール

https://wp-cli.org/#installing
英語だけど、仮想環境に入れたいけど・・・しょうがない入れるか。

なんか

`wp --info`したら`WP_CLI phar path:`が怪しんだけど…気にしないで次

## blade-generate をインストール（２回目）

> $ wp package install git@github.com:alwaysblank/blade-generate.git

したら

```
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 4096 bytes) in phar:///usr/local/bin/wp/vendor/composer/composer/src/Composer/Json/JsonFile.php on line 275
Reverted composer.json.
WP-CLI ran out of memory. Please see https://bit.ly/wpclimem for further help.
```
言われた

https://bit.ly/wpclimem

ここを読めと書いてあるので

> $ php -d memory_limit=512M "$(which wp)" package install < package-name >

```
php -d memory_limit=512M "$(which wp)" package install git@github.com:alwaysblank/blade-generate.git
```

…できなかったので　-1 にしてリトライ

```
php -d memory_limit=−１ "$(which wp)" package install git@github.com:alwaysblank/blade-generate.git
```

インストールできた

```
Success: Package installed.
```

## wp blade compile してみる。

```
wp blade compile
Finding files...
Compiling templates  100% [========================================================================================================================================] 0:00 / 0:00
Success: Templates rendered!
+-------------------------------+--------+
| File                          | Status |
+-------------------------------+--------+
| views/index                   | 👍     |
| views/404                     | 👍     |
| views/template-custom         | 👍     |
| views/page                    | 👍     |
| views/layouts/app             | 👍     |
| views/search                  | 👍     |
| views/single                  | 👍     |
| views/partials/page-header    | 👍     |
| views/partials/header         | 👍     |
| views/partials/comments       | 👍     |
| views/partials/content-page   | 👍     |
| views/partials/content        | 👍     |
| views/partials/head           | 👍     |
| views/partials/content-single | 👍     |
| views/partials/content-search | 👍     |
| views/partials/footer         | 👍     |
| views/partials/entry-meta     | 👍     |
| views/partials/sidebar        | 👍     |
+-------------------------------+--------+
```

 どういうこと？特に何かできた訳ではなかった。

うーんわざと文法間違えてから`wp blade compile`してみたけど、ステータス👍のままなんだよね。

## wp blade clear してみる。

```
Success: Templates cleared!
```

何かがクリアーされた模様・・・わからん。

## wp blade wipe してみる。

```
Success: All files in `/app/public/wp-content/uploads/cache` removed!
```

何かが削除された模様・・・わからん。

## 結果

よくわからなかった。誰かいつどういう時に使うのか知っている人がいれば教えてください。
PMP試験に出てくる(5.6) Control ScopeのITTOを覚えよう

# (5.6) Control Scope
プロジェクトスコープ管理の6つのプロセスにある`スコープコントロール`プロセスのこと

- [プロジェクトスコープ管理の6つのプロセス](https://qiita.com/Yumenoshima/items/1f313379b20aacb30c7a)

## (5.6) Control ScopeはPMBOKガイドのどこに出てくるか
PMBOKガイド`167ページ`の`5.6`に出てくるよ！

# ITTOとは
プロセスに対するインプット、ツールと技法、アウトプット(成果物)!

## (5.6) Control ScopeのITTOのI(インプット)
- Project management plan
- Project documents
- Work performance data
- Organizational process assets

## (5.6) Control ScopeのTT(ツールと技法)
- Data analysis

## (5.6) Control ScopeのO(アウトプット)
- Work performance information
- Change requests
- Project management plan updates
- Project documents updates

# まとめ
`(5.6) Control Scope`プロセスの`ITTO`を覚えて、インプットとアウトプットの成果物テンプレートも押さえよう！ 

----
以上
PMP試験に出てくる(5.5) Validate ScopeのITTOを覚えよう

# (5.5) Validate Scope
プロジェクトスコープ管理の6つのプロセスにある`スコープ妥当性確認`プロセスのこと

- [プロジェクトスコープ管理の6つのプロセス](https://qiita.com/Yumenoshima/items/1f313379b20aacb30c7a)

## (5.5) Validate ScopeはPMBOKガイドのどこに出てくるか
PMBOKガイド`163ページ`の`5.5`に出てくるよ！

# ITTOとは
プロセスに対するインプット、ツールと技法、アウトプット(成果物)!

## (5.5) Validate ScopeのITTOのI(インプット)
- Project management plan
- Project documents
- Verified deliverables
- Work performance data

## (5.5) Validate ScopeのTT(ツールと技法)
- Inspection
- Decision making

## (5.5) Validate ScopeのO(アウトプット)
- Accepted deliverables
- Work performance information
- Change requests
- Project documents updates

# まとめ
`(5.5) Validate Scope`プロセスの`ITTO`を覚えて、インプットとアウトプットの成果物テンプレートも押さえよう！ 

----
以上