OmniAICreator/Qiita-1.07M huggingface dataset:
.Net 6: C# で JSON の Create

.Net のバージョン

```text
$ dotnet --version
6.0.302
```

1: プロジェクトの作成

```bash
dotnet new console -o Create01
```

2: フォルダー構造

```text
$ tree -L 1
.
├── Create01.csproj
├── Program.cs
├── file_io.cs
└── obj
```

3: Program.cs を次のようにします。

```cs:Program.cs
// ---------------------------------------------------------------------------
//	Program.cs
//
//						Aug/08/2022
// ---------------------------------------------------------------------------
using System;
using   System.IO;
using   System.Collections.Generic;

using System.Text.Json;
using System.Text.Json.Serialization;

// ---------------------------------------------------------------------------
namespace Create01
{
    class Program
    {
// ---------------------------------------------------------------------------
static Dictionary <string,Object> dict_append_proc
	(Dictionary <string,Object> dict_aa,
	String id_in,String name_in,int population_in,String date_mod)
{
	Dictionary <string,string> unit_aa
			= new Dictionary <string,string> ();

	unit_aa.Add ("name",name_in);
	unit_aa.Add ("population",population_in.ToString ());
	unit_aa.Add ("date_mod",date_mod);

	dict_aa.Add (id_in,unit_aa);

	return  dict_aa;
}

// ---------------------------------------------------------------------------
	static void Main(string[] args)
	{
	Console.Error.WriteLine("*** 開始 ***");
	string file_json = args[0];
	Console.WriteLine (file_json);
	Dictionary <string,Object> dict_aa
					= new Dictionary <string,Object> ();
	dict_aa = dict_append_proc (dict_aa,"t0921","宇都宮",74325,"2009-6-7");
	dict_aa = dict_append_proc (dict_aa,"t0922","小山",17982,"2009-5-19");
	dict_aa = dict_append_proc (dict_aa,"t0923","佐野",46819,"2009-3-28");
	dict_aa = dict_append_proc (dict_aa,"t0924","足利",65237,"2009-12-18");
	dict_aa = dict_append_proc (dict_aa,"t0925","日光",14926,"2009-11-25");
	dict_aa = dict_append_proc (dict_aa,"t0926","下野",28145,"2009-1-26");
	dict_aa = dict_append_proc (dict_aa,"t0927","さくら",59784,"2009-5-14");

	string str_json = JsonSerializer.Serialize(dict_aa);
	file_io.file_write_proc (file_json,str_json);

	Console.Error.WriteLine("*** 終了 ***");
	}
    }
}
```

4: file_io.cs はこちら
[.Net Core で JSON の Update](https://qiita.com/ekzemplaro/items/69a27f453900f849da6d)

5: コンパイル

```bash
dotnet build
```

6: 実行

```bash
mkdir /var/tmp/json
bin/Debug/net6.0/Create01 /var/tmp/json/tochigi.json
```

7: 作成された JSON ファイルの確認

```bash
jq . /var/tmp/json/tochigi.json
```
Modelのメソッドをコントローラーで呼び出せなかった

###状況
青本を読んでControllerを軽くしようとModel(Favorite)に関数(totalGood)を実装。
しかし、Controller側で呼び出すことができなかった。

間違っているコード
↓

```php:Controller
Favorite->totalGood($id)
```


正しいコード
↓

```php:Controller
Favorite::first()->totalGood($id)
```


###解決
間違っている方のコードでは、Modelがインスタンス化されていなかったのが問題点。
Modelの後に
::first()
::all()
::get()
を挿入してインスタンス化した後に、Model内のメソッドを呼び出すのが正解。
[Angular] 子コンポーネントから親コンポーネントのメソッドを実行して戻り値を受け取る

子コンポーネントから親コンポーネントのメソッドを実行する場合は`emit()`を使用します。
ですが、`emit()`では戻り値が受け取れないので、受け取りたい場合は別の書き方をする必要があります。

## やり方
`@Input()`を使用し親からメソッドを受け取れば実現可能です。

### 親から子へメソッドを渡す

```html:parent-compomemt.html
<parent-compomemt>
  <child-compomemt [parentFunc]="parentFunc">
</parent-compomemt>
```

```js:parent-component.ts 
parentFunc(num: number): number {
  return num + 1;
}
```
### 子で受け取ったメソッドを実行する
```js:child-component.ts
@Input() parentFunc: (num: number) => number;

callParentFunc() {
 const ret = this.parentFunc(1);
}
```
Cognos レポートで複数キーワードでの前方一致検索の実装

#Cognos レポートで複数キーワードでの前方一致検索の実装
こういうイメージの実装です。製品名のなかで「イン」から始まるもの、「エバー」から始まるものの両方(OR条件)で前方一致検索したい場合の実装です。
<img width="332" alt="001.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/d4903b99-6362-85a9-f1dc-ea7c183b051f.png">

製品のフィルターに「starts with」を使うのですが、starts withをそのまま使用すると単数選択になってしまうので、工夫が必要です。

複数選択にしたい場合、以下のフィルターとします。
「join」は色々なところで使えますね。

```html
[製品] starts with # join(' or [製品] starts with ', split(';',promptmany('pPL')))#
```

#レポート定義とクエリー定義
一応載せておきますね。
・レポート定義
<img width="783" alt="002.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/1e3d8a1b-8e31-c9f2-5674-bb1a39c51813.png">

・クエリー定義
<img width="781" alt="003.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/d1d90f55-eab3-aa40-c07a-0e80d4210b01.png">

ご活用ください！
[GAS] Sheet.insertImage実行時に「サービスエラー」の解決策

サービスエラーという超抽象的なエラー内容はやめてほしいですね、、、
GASで、特定の画像ファイルをセルにinsertできる `insertImage` 関数というものがあります。

[Sheet.insertImageのドキュメント](https://developers.google.com/apps-script/reference/spreadsheet/sheet#insertImage(String,Integer,Integer))

```js
sheet.insertImage(imageBlob, IMAGE_COLUMN_NUM, targetRow, 0, 0)
```

こんな感じで使うのですが、実行時に「サービスエラー」というエラーメッセージが出てきます。

### 原因と解決策
1. 画像のサイズが大きすぎる（僕は2000×2000の画像だったためサービスエラー）
    2. 画像の面積には制限があった。
    3. https://gist.github.com/tanaikech/9414d22de2ff30216269ca7be4bce462
2. 画像が重すぎないか
3. そもそもSheetクラスからinsertImage関数にアクセスしているか
4. insertImage関数内の記述が間違っていないか


色々実験したところ、上記4つが主な原因でした。
サイズの制限してるならそのメッセージくれたっていいじゃないか、、、ねぇ〜
angularx-flatpickrでlocaleを日本語に変更する

Angularで使えるDatePicker(=angularx-flatpickr)のLocaleのデフォルトが英語圏なので、日本語に変更します。

## 前提
[angularx-flatpickr](https://www.npmjs.com/package/angularx-flatpickr)が導入されていること

## AnyComponent.ts
```typescript

import { Component, OnInit } from '@angular/core';
import flatpickr from 'flatpickr';
import { Japanese } from 'flatpickr/dist/l10n/ja.js';

@Component({
  selector: 'app-home',
  templateUrl: './home.component.html',
})
export class AnyComponent implements OnInit {
  constructor() {
    flatpickr.localize(Japanese);
  }
}

```

## Before
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256853/ae758bb8-d630-c5cf-9bed-4903ecfc8209.png)

## After
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256853/f6119faa-96a1-085d-2de9-8458bcc7888c.png)
Form要素をcss3でデザインする

# Form要素をcss3でデザインする
Form要素をcss3でデザインすると、入力や選択の操作性・選択肢の可読性がぐっと上がります。
先日Formのコーディングをしたので、何度も何度も調べて書いてきたコードをまとめてみました。

## ラジオボタンとチェックボックス
ラジオボタンとチェックボックスは、丸・四角・チェックのすべてをbefore/after要素で作成します。

![radio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553702/f66859c9-1db6-d1d0-d08a-f7a6e4694c6e.png)
![checkbox.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553702/73e14f51-1cd9-66bf-8086-ef0a324ec98f.png)

```contact.html
<!--ラジオボタン-->
<input type="radio" name="01" id="01_01" checked="checked"><label for="01_01">ラジオボタン１</label>
<input type="radio" name="01" id="01_02"><label for="01_02">ラジオボタン２</label>

<!--チェックボックス-->
<input type="checkbox" name="02" id="02_01" checked="checked"><label for="02_01">チェックボックス１</label>
<input type="checkbox" name="02" id="02_02"><label for="02_02">チェックボックス２</label>
<input type="checkbox" name="02" id="02_03"><label for="02_03">チェックボックス３</label>
```

```style.css
input[type=radio] ,
input[type=checkbox] {
	display: none;
}
input + label {
	display: inline-block;
	vertical-align: top;
	padding: 15px 40px;
	margin: 0;
	cursor: pointer;
	position: relative;
}
input + label:before {
    content: '';
    position: absolute;
    display: block;
	border: 1px solid #999;
	background-color: #fff;
}
input[type=radio] + label:before {
    top: 8px;
	left: 0;
	width: 34px;
	height: 34px;
	border-radius: 17px;
}
input[type=checkbox] + label:before {
    content: '';
    position: absolute;
    display: block;
    top: 12px;
	left: 0;
	width: 30px;
	height: 30px;
	border-radius: 4px;
	border: 1px solid #999;
	background-color: #fff;
}
input[type=checkbox]:checked + label:after {
    content: '';
    position: absolute;
    display: block;
    top: 14px;
	left: 8px;
	width: 14px;
	height: 22px;
    border-right: 6px solid #e462d3;
    border-bottom: 6px solid #e462d3;
    -webkit-transform: rotate(45deg);
    -ms-transform: rotate(45deg);
    transform: rotate(45deg);
}
input[type=radio]:checked + label:after {
    content: '';
    position: absolute;
    display: block;
    top: 14px;
	left: 6px;
	width: 22px;
	height: 22px;
	border-radius: 11px;
	background-color: #e462d3;
}
```



## プルダウン、テキスト入力、テキストエリア

![selecttexttextarea.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553702/dbcadf8c-38a1-4a28-fbf5-27c031f5780b.png)

```contact.html
<select name="" id="">
	<option value="">プルダウン</option>
	<option value="aaaaa">プルダウン１</option>
	<option value="bbbbb">プルダウン２</option>
	<option value="ccccc">プルダウン３</option>
</select>

<input type="text" class="input_address" name="" id="" value=""  placeholder="テキスト入力">

<textarea  placeholder="テキストエリアです。"></textarea>
```

```style.css
select,
input[type=text] ,
textarea {
	border-radius: 4px;
	border: 1px solid #999;
	background-color: #fff;
	padding: 10px;
}
input[type=text] {
	width: 100%;
}
input[type=text].input_err {
	border: 1px solid #c44;
	background-color: #fdd;
}
```
次世代モブプロ？対戦型オペレーションゲームでスキルを磨け！！


**俺より強いスキルに会いに行く(挨拶)**

#### はじめに

*ハイスコアガールⅡ*面白かったですねー。

　ジブンも格ゲーブームのリアルタイム世代だったんだけど、見ててふと思ったのは「見て真似て盗む」というスキル磨きの手法。
　モブプロやったことないから憧れるけど、磨く方法は手取り足取りだけじゃないよね。(あ。もち否定じゃあないです)
　戦って負ける。から負けた理由なり、もっと上手くなる方法を考えたり、相手の操作から学ぶ。
　**それも一つのモチベーションが高い学習方法ではないか？仮説**

　そんな思いをコードにしました

#### で、こうなった

実況さん「新人くんvsベテランさんスタート！httpサーバーを8080で起動し、TESTの文字列を返すミッションです！！」

実況さん「新人くん、OSやバージョンの確認を手堅く始めたぞーパッケージの確認へと進んでいるー」
![2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189193/8d41e5e3-c515-d739-d0ce-c65dacd58b13.gif)

実況「あーっと！！！ベテランさんの必殺netcatが決まったー！瞬殺！！新人くん、ベテランさんのユニゲージ戦法になすすべなく敗退ー！！」

新人くん「ぐぬぬ。そんな技が。。」

ベテラン「てめーはUNIXを怒らせた」

～終～

#### 競技プログラミングでいいんじゃね？

　まあ、そうなんですけどお互いの操作が見えているってのが新しいし、ダッシュボード的な画面を実況さんがさらに解説するのがポイントです。見てる人も楽しんで学べるかと。

#### というか見辛いからWebでやれ

　承知。最初にGolangのCUIモジュールの練習したかった。ので、アイディア出ししたらこうなった。

#### やりかた

　golang使った割にやたらめんどうですいません。。~~というか適当過ぎる~~

　１．コンテナなり環境を汚染/壊してもいいサーバーを**2個**用意します。コンフィグに書いたクリア条件を定期的に確認できるように**SSHでrootを許可してにパスワード認証をつけてください。**鍵認証？・・・手抜きですみません。

　２．コンソールをWebから弄れるのをWebsocket対応したのを[git](https://github.com/yasutakatou/console-demo/tree/forWebsocket)からもってきてコンパイルなぞします。また対戦画面表示用サーバーも[git](https://github.com/yasutakatou/vsterm)からもってきてコンパイルしてください。

　３．ミッションクリア条件をコンフィグに書きます。**達成のパーセンテージ,確認コマンド,何が含まれてたらクリア**のようにCSVで書きます。

```
0,HTTPDをポート8080で起動させ,文字列TESTを応答させる
10,ps -ef | grep -v grep | grep nginx,nginx
50,netstat -anp | grep :8080 | grep -v grep,nginx
100,curl -q -m 2 127.0.0.1:8080,TEST
```

　1行目は最初に表示するミッションの文字列ですね。~~ひどく適当な実装ですね~~

　４．対戦画面表示用サーバーを起動してください。最低限のオプション指定として用意したコンテナへのログイン情報が必要です。以下のように**表示ユーザー名、IP、アカウント、パスワード**で指定します。ユーザー名無いとどっちの窓を誰が動かしてるかわかんないからね。

```
./server -one=taro,192.168.0.25,root,password -two=jiro,192.168.0.26,root,password
```

　確認のSSHアクセスもできれば画像のようにミッション表示画面で停止します
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189193/eecec1d7-7421-82a5-8149-e1cffbaaed67.png)

　５．コンテナでコンソール操作を受けるため、コンソールをWebから弄れるやつをコピーしてサービスを起動してください。HTMLコンポーネントや、ミッション表示画面へのWebsocketを張るURLを指定するので以下のようなオプションを指定します。~~対戦画面表示用サーバーが居ないとWebsocket張れなくて落ちます。~~

```
/root/console-demo/console-demo -port=10000 -html=/root/console-demo/www -org=http://192.168.0.100:8080/ -ws=ws://192.168.0.100:8080/one -command=/bin/sh
```

　対戦ですのでもう一台のコンテナでもコマンドを流します

```
/root/console-demo/console-demo -port=20000 -html=/root/console-demo/www -org=http://192.168.0.100:8080/ -ws=ws://192.168.0.100:8080/two -command=/bin/sh
```

　６．起動したらWebコンソールへアクセスします。対戦する2人で１画面ずつ開いてください。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189193/acec5a0b-a624-d383-51a1-e072011f5fe4.png)

　アクセスできたらミッション表示画面がコンソール画面に変わります
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189193/5d4e5327-1d87-a44f-b373-b94c3d805a60.png)

　７．対戦開始です！！
![1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189193/bacfe0ec-1f52-4d04-1204-e28e47380384.gif)

　裏でgoroutineでコンフィグのSSHが順繰りにチェックしにコマンドを投げ込みます。あ、今更ですけどポイントは上に書いた妄想の対戦実況みたいに先に100パーセント達成で勝ちです。油断すると背後から撃たれるわけですこわいですねー(なので実況要素も要るわけです)

#### で、愚痴

　という忘年/新年会でSWITCHのゲーム大会より盛り上がりそうな**(憶測)**ネタでしたが、
一人で組んで＆酒のテンションで記事を書いたのですがやたら空しいですね。。
　この仕組みでJMeter vs k8s使いでサービス落ちたら負け勝負なんて胸アツで超見たいんですけど！誰か一緒にSaaS化しようぜ！！笑
Reactで作成したWebアプリケーションを公開してみる

# 概要
[以前の記事](https://qiita.com/enuswi/items/a2f415c00450a72d0c61)で作成したWebアプリケーションをAWS S3とRoute53を使ってWeb上に公開してみたいと思います。

具体的にはAWSの静的ウェブサイトホスティング機構を利用します。以下は公式のドキュメントです。
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/WebsiteHosting.html


## リポジトリ
```
https://github.com/enuswi/react-app
```
### 本投稿時点のcommit
```
https://github.com/enuswi/react-app/commit/a74409890292c4e96140361d682a4ec869510a89
```
＊cloud9(EC2)環境上であれば上記リポジトリのREADME「開発セットアップ(Cloud9)」の通りで動作確認できると思います(2020.01.06)


# 前提
* AWSアカウントを所持
* 自由に使える独自ドメインを所持
* VPCの設定やホストゾーンの作成は済み

# 大まかな流れ
1. ビルドして出力されたdist以下のファイルをS3バケットにアップロード
2. S3バケットの公開
3. Route53にレコードを新規作成
4. 動作確認

# 1. S3バケットのセットアップ

まずはS3のコンソールからバケットを作成します。
とりあえずバケット名とリージョンを指定し「作成」をクリックします。

バケット名は後ほどRoute53で作成するレコードセットにつける名前と一致させる必要があります。そうしないとレコードセットのエイリアス先の候補に出て来ません。

ちなみに今回は「s3.react-app.xxxxx.yyy」と名付けました。
＊「xxxxx.yyy」の部分は独自ドメイン

### Static website hostingの設定
上記で作成したバケットの「プロパティ」タブを開き「Static website hosting」の設定をします。

* 「このバケットを使用してウェブサイトをホストする」にチェック
* 「インデックスドキュメント」の項目に「index.html」と入力
* 「保存」
* エンドポイントの内容は後ほどRoute53のレコードセット作成の際に利用します。

＊ index.htmlは適宜書き換えてください。

### バケットへのアップロード
以前、作成したプロジェクトをビルドし、出力されたファイルをこのバケットにアップロードします。
Static website hostingのインデックスドキュメントに設定した「index.html」が存在しないとアクセス時に404エラーとなるので最低限アップロードする必要があります。

# 2. S3バケットの公開

アクセス権の設定を行います。
バケットの「アクセス権限」タブを開き以下2つの設定をしていきます。

* ブロックパブリックアクセス
* バケットポリシー

### ブロックパブリックアクセス
静的ウェブサイトをホストする場合は
「パブリックアクセスをすべてブロック」の項目のチェックを外します。
保存時に確認画面が表示されるのでその通りにします。

### バケットポリシー

公式チュートリアルの通りですが、
以下のバケットポリシーの「example-bucket」の部分を上記で指定したバケット名に変更したものを「バケットポリシーエディター」に貼り付け保存します。
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/HostingWebsiteOnS3Setup.html#step3-add-bucket-policy-make-content-public

```
{
   "Version":"2012-10-17",
   "Statement":[{
 	"Sid":"PublicReadForGetBucketObjects",
         "Effect":"Allow",
 	  "Principal": "*",
       "Action":["s3:GetObject"],
       "Resource":["arn:aws:s3:::example-bucket/*"
       ]
     }
   ]
 }
```

# 3. Route53にレコードを新規作成

続いてRoute53の設定です。
Route53コンソールから使用するホストゾーンへ移動し「レコードセットの作成」をクリックします。
すると右側に作成フォームが表示されるので内容を埋めていき最後に「作成」をクリックします。

### 名前
...S3バケット作成時につけた名前を入力します。
＊ 私の場合は、「s3.react-app」を入力します

### タイプ
...今回はタイプ「A-IPv4アドレス」を選択します。
＊ 他のタイプ含め、Route53については今度時間をとって学びたいです。

### エイリアス
...「はい」を選択し、さらにエイリアス先を選択します。レコードセット名とバケット名が異なると候補に出てこないようです。今回はその2つを併せているので正しい選択肢が表示されていると思います。

# 4. 動作確認

Route53で設定したアドレスにアクセスするとS3バケットに設置したindex.htmlが表示されているはずです。

<img width="595" alt="screenshot 2020-01-08 9.50.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46053/a630e5c7-c417-ec75-935d-2c8d0951f55f.png">


その他、プロパティから「サーバーアクセスのログ記録」を設定すればアクセスログを記録できたりCloudFrontと組み合わせて高速にしたりできるようです。


# さいごに
今までLaravel等のフレームワーク(以下、FW)を利用していて、FWがよしなにやってくれていることがたくさんあることは理解していました。
2020年は、基本的にはFWが頑張ってくれている部分を勉強する年にしたいと思っての備忘録をアップしていければと思っております。
間違い等ございましたらご指摘くださいますと幸いです。

次回は、githubとcode3兄弟を組み合わせてビルド・デプロイの仕組みを作ってみたいと思います。
LeetCode: 206. Reverse Linked List

# 問題の要約
連結リストの順序を逆にする問題

# 問題
[問題へのリンク](https://leetcode.com/problems/reverse-linked-list/description/)

# 回答１　stackの使用
データの順番を逆にする=FILO(First In Last Out)=stackとの発想から、stackでの回答を試みました。

stackへリストを一通り格納し、stackのtop()から順番にリストへ戻していく操作をしました。

```cpp
class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        stack<ListNode> ListStack;
        ListNode* cur=head; 
        while(cur!=NULL) {
            ListStack.push(*cur);
            cur = cur->next;
        }
        cur=head;
        while(!ListStack.empty()){
            ListNode* tmp=cur->next;
           *cur=ListStack.top();
            cur->next=tmp;
            cur=cur->next;
            ListStack.pop();
        }
        
        return head;
    }
};
```

Runtime: 8 ms (beats 78.33%)
Memory Usage: 9.4 MB (beats 22.9%)

解いた後でDisscussを眺めた所、stackを使ってる人は少数派だった模様。ただしRuntimeは上位21%なので、そこそこ早いのかなと思います。

後で別方法の回答も作りたいです。
SQLAlchemyを使ってFlaskアプリのDB設定をする

この記事ではSqlalchemyを使ってFlaskアプリのDB設定を行っていきます。
引き続きApplication Factory法に沿ってアプリを整理していくので、わからない方は前回の記事をご参照ください。

それでは、まず、pipを使ってsqlalchemyをインストールします。
今回はFlask-sqlalchemyではなくて生のsqlalchemyを使います。
設定に少し手間がかかりますが、開発スペースが広がります。

次に、applicationディレクトリ内にmodelディレクトリを作ります。
その中にbase.pyとmodel.pyを作り、以下のコードを書いていきます。

```application/model/base.py
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()
```

```application/model/model.py
from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session, sessionmaker

from application.model.base import Base
from config import configObject

engine = create_engine(configObject.DATABASE_URI, convert_unicode=True, echo=True)
db_session = scoped_session(sessionmaker(autocomit=False, autoflask=False, bind=engine))

Base.query = db_session.query_property()

def db_init():
   Base.metadata.create_all(bind=engine)
```

テーブルを作りたいときは、modelディレクトリ内に別ファイルを作りクラスを書いて、model.pyにインポートします。db_init関数をアプリ立ち上げ時に実行してあげれば、DB設定の完了です。

```application/__init__.py
from flask import Flask, render_template
from flask_cors import CORS

from config import configObject
from application.model.model import init_db

def create_app():
    # instantiate the app
    app = Flask(__name__, template_folder="templates", static_folder="static")
    app.config.from_object(configObject)

    # enable CORS
    CORS(app, resources={r'/*': {'origins': '*'}})

    @app.route('/')
    def hello_world():
        return "Hello world!"
    
    # instantiate db connection
    init_db()

    return app
```

DB設定は以上になります。
この方法でDBファイルを整理することで、開発規模が大きくなっても完結でまとまりがあるコードになります。参考になれば幸いです！
サクラエディタで任意の行数ペーストするマクロ

# 内容
サクラエディタで同じ行を500~1000行コピーし修正するといったことが多くなってきた。
時間はそんなにかからないが一行一行コピペを繰り返していくのはめんどくさい。
指も疲れる。
何とかマクロで任意の行数コピペできないかと思った。
# 方法
サクラエディタにはマクロ機能があり
jsを使用することができるので
jsにてコピペを実行する。
# ■以下コード
```js
//ポップアップにて任意の行数を入力する(5桁まで入力可能)
var PasteCount = InputBox("ペーストする行を選択してください","",5);

//クリップボードに入っている文字を取得
var ClipboardText = GetClipboard();
ClipboardText = ClipboardText + "\r\n";
SetClipboard(0,ClipboardText);


for (var i = 1; i <= PasteCount; i++) {
  Paste(1);
}
```
# 作成後
ショートカットキーに登録するとより使いやすくなる。
GCP アップデート (1/3-1/9 2020)

### Dialogflow: [Jan 6, 2020](https://cloud.google.com/dialogflow/docs/release-notes#January_06_2020)
- Kik, Skype, Spark, Twilio IP Messaging, Twilio (Text Messaging), Twitter, Viberのビルトインのインテグレーションが4/6に終わるよ。
  - OSS版にそれまでに移行する必要あり。(4/6に動いているものも停止します。)

### AI Platform: [Jan 7, 2020](https://cloud.google.com/ml-engine/docs/release-notes#january_7_2020)
- ランタイム1.5でGPUを利用すると、TensorFlowが依存しているCuDNNライブラリのコンパチの問題。現状のワークアラウンドは1.15以外を利用するかGPUを利用しないか。

### GKE: [Jan 7, 2020](https://cloud.google.com/kubernetes-engine/docs/release-notes#january_7_2020)
- デフォルトバージョンあ1.14.8-gke.12になったよ。(もともと1.13.11-gke.14)
- 自動アップグレード有効の場合は1.12.xは1.13-12-gke.13にアップグレードされるよ。
- ノードに紐付いているディスクをCMEKで暗号化できる機能がベータになったよ。

### DNS: [Jan 7, 2020](https://cloud.google.com/dns/docs/release-notes#January_07_2020)
- 他のVPCにリクエストを投げられるようにするDNSピアリングがGAになったよ。

### GCS: [Jan 8, 2020](https://cloud.google.com/storage/docs/release-notes#January_08_2020)
- 長期間保存するデータ向けの新しいArchiveストレージクラスが出たよ！特徴は以下。
  - データアクセスは早い(msオーダ)
  - SLAなし
  - 最低365日保存
  - データアクセスは高い (1年に1回以下しかアクセスしないデータ向け)
  - 東京は\$0.0025/GB/月ぽい。(us-central1とかは$0.0012)

### GKE: [Jan 8, 2020](https://cloud.google.com/kubernetes-engine/docs/release-notes#january_8_2020)
- **HPA利用している場合は1.16.0-gke.20にアップデートしないこと!**
  - 1.16.3+で修正予定なのでそれまで待ってください。

### ディスクレーマ
- アップデートの内容はあくまでも個人の理解していることを書いています。正しい内容はリリースノート等を確認下さい。
- リリース内容できるだけ拾うようにしているのですが、抜けていそうなリリースノートが追加するのでぜひ教えて下さい！(一覧[ここ](https://qiita.com/kenzkenz/items/ac18a359b803dbb6b490)で更新してます。)
GAS 画像URLを元に画像をダウンロードしてカテゴリ名フォルダに保存させる

```js
/**
 * 画像URLを元に画像をダウンロードしてカテゴリ名フォルダに保存させる
 * @param {string} url
 * @return {string} file.getUrl() // 保存したファイルのURLパス
 */
function downloadImageAndSave(url) {
  var response = UrlFetchApp.fetch(url)
  var fileBlob = response.getBlob().setName('test_image')
  var folderId = 'XXXXXXXXXXXXXXX'
  var folder = DriveApp.getFolderById(folderId)
  var file = folder.createFile(fileBlob)
  return file.getUrl()
}
```
🏰【Laravel6】MariaDBから取得したJSON型の任意の値をBladeで表示する

## 環境
PHP 7.3.10
Laravel 6.5.0
MariaDB

## やりたいこと

MariaDBのに下記のようなデータがあり、
その内のcontentカラム（JSON型）のデータからvalueの内容である
「テストの内容です🐾」や「２の内容！！」をBladeテンプレートに直接表示したい

|id|content|del_flg|
|:------------------:|:------------------:|:------------------:|
|1|{"data_kind": "1", "value": "テストの内容です🐾"}|0|
|2|{"data_kind": "2", "value": "２の内容！！"}|0|
|3|{"data_kind": "1", "value": "削除済データ😭😭😭"}|1|

本来であればVue.jsやReactとかで取得データを処理して表示するのが賢い方法だと思うが
それ以前の環境とかで無理やり表示したいことがあった

## やったこと

COntrollerでは普通にJSONの文字列としてデータ取得しでViewに渡す
Viewでは受け取ったデータをjson_decode()して表示する

```app/Http/Controllers/testController.php
    /**
     * 画面表示
     */
    public function index() {
        // 対象データ取得
        $hogeTalks = DB::table('hoge_talks')
        ->select('*')
        ->where('del_flg', 0)
        ->get();

        // Viewにデータ渡し
        return view('test.index', [
            'talks' => $hogeTalks,
        ]);
    }
```


```resources/views/test/index.blade.php
{{ json_decode($talks->content)->value }}
```

## 結果

content内のvalueの値のみがテンプレートに表示されます
同様にアロー演算子の先をdata_kindに変更等、任意のkeyに変更して使用できます
しばらく使わなかった言語はすぐ忘れる

昨年の2019年の6月頃触っていたgolangで素晴らしいモックの作成方法を学んだのに、
半年たってモックを作成しようとしたらテストの書き方含め「どうやるんだっけ...?」と忘れてしまいました。

[エビングハウスの忘却曲線](https://trinity.jp/118843/)によると学んだことは1ヶ月後も経てばほぼ忘れてると同義らしいので、
忘れた事を悲観するのではなく、アウトプットを含めた復習をすることで記憶を強化したいと思います。

[github.com](https://github.com/masa-mu/golang-public/tree/master/test-benchMark/exMock)のソースはこちら

## サンプルプログラム

例えばこんなプログラムがあったとします。

layer1.go

```
package exPackage

type exStruct1 struct {
	Layer2 Layer2Interface
}

type Layer1Interface interface {
	Receiver() bool
}

func NewLayer1(Layer2 Layer2Interface) Layer1Interface {
	return &exStruct1{Layer2}
}

func (e *exStruct1) Receiver() bool {
	if e.Layer2.Get() != 1 {
		return false
	}

	if e.Layer2.Put(2) == false {
		return false
	}

	if e.Layer2.Delete(3) == false {
		return false
	}

	return true
}
```

テストを書く時にNewLayer1メソッドに対して渡すLayer2はGet,Put,Deleteのメソッドを持つ事とします。

layer2.go

```
package exPackage

type Layer2Interface interface {
	Get() int
	Put(param int) bool
	Delete(key int) bool
}
```

レイヤー2のモックを作成してテストをしたいのでモックを作成します。

## Mockの作成

Get,Put,Deleteのメソッドの返却はすべてFake **XXXX** というメソッドに丸投げします。

```aspectj
package exMock

import "golang-public/test-benchMark/exMock/exPackage"

type Layer2 struct {
	exPackage.Layer2Interface

	FakeGet    func() int
	FakePut    func(param int) bool
	FakeDelete func(key int) bool
}

func (l Layer2) Get() int {
	return l.FakeGet()
}

func (l Layer2) Put(param int) bool {
	return l.FakePut(param)
}

func (l Layer2) Delete(key int) bool {
	return l.FakeDelete(key)
}
```

## テストの作成

こうすることで、素晴らしい事にモックの内容をテスト単位で書き換える事が可能になる。

```aspectj
func TestReceiver(t *testing.T) {
	tests := []struct {
		name string
		f    func(*testing.T)
	}{
		{
			"Getでfalseが返却される",
			func(t *testing.T) {
				layer2Mock := exMock.Layer2{
					FakeGet: func() int {
						return 2
					},
				}

				layer1 := exPackage.NewLayer1(layer2Mock)

				assert.Equal(t, layer1.Receiver(), false)
			},
		},
		{
			"Putでfalseが返却される",
			func(t *testing.T) {
				layer2Mock := exMock.Layer2{
					FakeGet: func() int {
						return 1
					},
					FakePut: func(param int) bool {
						return false
					},
				}

				layer1 := exPackage.NewLayer1(layer2Mock)

				assert.Equal(t, layer1.Receiver(), false)
			},
		},
		{
			"Deleteでfalseが返却される",
			func(t *testing.T) {
				layer2Mock := exMock.Layer2{
					FakeGet: func() int {
						return 1
					},
					FakePut: func(param int) bool {
						return true
					},
					FakeDelete: func(key int) bool {
						return false
					},
				}

				layer1 := exPackage.NewLayer1(layer2Mock)

				assert.Equal(t, layer1.Receiver(), false)
			},
		},
		{
			"すべてが成功してtrueが返却される",
			func(t *testing.T) {
				layer2Mock := exMock.Layer2{
					FakeGet: func() int {
						return 1
					},
					FakePut: func(param int) bool {
						return true
					},
					FakeDelete: func(key int) bool {
						return true
					},
				}

				layer1 := exPackage.NewLayer1(layer2Mock)

				assert.Equal(t, layer1.Receiver(), true)
			},
		},
	}

	for _, tt := range tests {
		t.Run(tt.name, tt.f)
	}
}
```

## 参考
[Golangにおけるinterfaceをつかったテストで Mock を書く技法](http://haya14busa.com/golang-how-to-write-mock-of-interface-for-testing/)
プロジェクト管理の課題と解決（3）『プロジェクト管理』に必要な4つの機能

前回の[「プロジェクト管理の課題と解決（2）プロジェクト管理ツール開発の追い風」](https://qiita.com/Kapi-Ten/items/6bf978637b394b9939dc)でお伝えした通り、[プロジェクト管理ツール『Time Krei』（タイムクレイ）](https://timekrei.tenda.co.jp/)は、自社の当時の状況と目的に合わせて企画されたものではありますが、**『プロジェクト管理ツール』と呼ぶにふさわしい機能はしっかりと備わっています**。

設計段階でプロジェクトマネージャーやプロジェクト管理ツールを使うメンバーにヒアリングを行い、洗い出し、実装しています。大別すると4つの機能がプロジェクト管理には絶対に必要！と言えます。

##（1）WBS（Work Breakdown Structure）

一つ目はWBS（ダブルビーエス・Work Breakdown Structure）と呼ばれる、**プロジェクト全体のタスクを細分化した構成図**です。「誰が」「何を」「責任を持って実行する」か。それをいつからいつまでに行うかを明示するものです。

それらの「いつから・いつまで」を日単位のチャート図を連動するように設置することで、今、誰が何をしているのか。その作業が遅れたらどのタスクに影響があるのかなどが可視化できます。

WBSをMicrosoft® Excel®などの表計算ソフトで作成・管理しているプロジェクトもよく見かけますが、日程をずらしたら一つ一つ設定しなおさなくてはならなかったり、アラートが上がらなかったりと、せっかく可視化しても更新されなかったり、役に立っていない状態も多くあるでしょう。

プロジェクト管理で最低限やらなくてはいけない、状況の確認とその速やかな修正がWBSにより実現します。

##（2）ワークフロー

二つ目に必要なプロジェクト管理の機能は、**見積もりや原価の申請や承認をスムースに行うワークフロー**です。

承認に必要な情報やその承認を通すのに通過すべき承認者とその順序をルールに沿って登録しておくことで、確実に必要な承認フローを回すことができます。また、オンラインで行うことで途中経過も明確ですし、データの保存も自動でできるため過去の原価の確認や、承認フローに必要な期間などもナレッジとして残すことができます。

##（3）原価管理

三つ目に必要なプロジェクト管理の機能は原価管理です。**工数や外注費から計算する原価の管理を明確にかつ見やすくする**と、プロジェクトを実行する現場と、お金の管理をする経理との情報共有や意思疎通がしやすくなり、企業活動が円滑に進みます。

原価管理は、実際の原価のあるべき姿（標準原価）を設定して、実際にかかった原価（実際原価）と比較することです。比較すると差異が出てくる場合が多くあるので、どうしてそういった差異があるのか、その差異がある箇所を知り、課題を見つけ、対策を打つことができます。

売上から原価を引いたものが利益ですから、原価が上がる原因というのは企業経営にとっても重要な要素になるというのは明確です。

##（4）決算時に活用するデータの作成

最後は、**決算時に活用できるデータの作成をする機能**です。決算時に必要となる工事進行基準に使えるデータで、フォーマットとして正しい体裁を持っています。

##（今回のまとめ）“プロジェクト”だけじゃない。さらに上からの視点

プロジェクト管理、ひいては企業の会計の管理まで、[『Time Krei』](https://timekrei.tenda.co.jp/)をきちんと使いこなすことで現状が可視化でき、課題を見つけながらきちんと管理することができます。

WBSが優れているプロジェクト管理ツールは世の中にはいくつかあると思いますが、原価管理やワークフローといったプロジェクト管理よりさらに上の観点で必要と考えられた機能が実装されています。

現在ではEVM（Earned Value Management）、稼働率分析や個人別作業割当状況分析などの分析機能も充実しているので、ただの進捗管理ではない、プロジェクトを成功に導くプロジェクト管理方法が[『Time Krei』](https://timekrei.tenda.co.jp/)と言えます。

第4回目は「プロジェクト管理ツールの効果と今後」について考えてみたいと思います。

もし、[テンダ](https://www.tenda.co.jp/)の[プロジェクト管理ツール『Time Krei』（タイムクレイ）](https://timekrei.tenda.co.jp/)にご興味をお持ちの場合は、是非一度[サービスサイト](https://timekrei.tenda.co.jp/)をご覧ください。
Raspberry Pi で電子ペーパーを点けてみる (e-Paper ) その2

# Rapsberry pi で waveshare の 7.5inch e-Paper を点ける
試しただけで眠っていた e-Paper について、調べてみると使い方が違っていたみたいなので再度試してみる。
ケーブルの接続は旧記事を参照下さい → [Raspberry Pi で電子ペーパーを点けてみる (e-Paper )](/jp_yen/items/98d92aad45bac80d7d1a)
2020-01-08 時点の Raspberry Pi 4B で行いました。

# 必要なライブラリをインストール
[readme_rpi_EN](https://github.com/waveshare/e-Paper/blob/master/RaspberryPi%26JetsonNano/python/readme_rpi_EN.txt) に書いてある必要なパッケージをインストール

```tcsh:
% sudo apt update
% sudo apt install python3-pip
% sudo apt install python3-pil
% sudo apt install python3-numpy
% sudo pip3 install RPi.GPIO
```
※pip3 RPI.GPIO は 2020-01-08 現在、python3-rpi.gpio というパッケージが用意されています。

# デモコード (含むライブラリ) をダウンロード & 伸張、展開
```tcsh:
% wget https://github.com/waveshare/e-Paper/archive/master.zip
% unzip master.zip
% rm -rf e-Paper-master/Arduino e-Paper-master/STM32
```
Arduino や STM32 のフォルダは要らないのでとりあえず削除。

# python3 のライブラリをインストール
```tcsh:
% cd e-Paper-master/RaspberryPi\&JetsonNano/python/
% sudo python3 setup.py install
```

# デモを実行
```tcsh:
% cd examples/
% python3 epd_7in5bc_test.py
```
モノクロでよければ epd_7in5_test.py のデモコードも動きました。

# 画面クリアのコマンド
epd7in5b と epd7in5bc が共通化されたみたいです。
そして、import の方法が変わったり、Clear() に引数が不要になりました。
epd7in5b.EPD_WIDTH, epd7in5b.EPD_HEIGHT => epd.width, epd.height

```python3:
#!/usr/bin/python3
from waveshare_epd import epd7in5bc

epd = epd7in5bc.EPD()
epd.init()
epd.Clear()
epd.sleep()
print("e-Paper clear & sleep done.")
```

epd.sleep() した後に epd.init() や、epd.Clear() を実行すると  Bad file descriptor になります。
epd.sleep() のあとに、del epd して、epd = epd7in5bc.EPD() をやっても同様。
プログラミング中で sleep() が使えないようです。sleep() しなくて良くなったのかなぁ？

demo の中では最後しか実行していませんが。
コマンドの小ネタ備忘録

小ネタ系コマンドの自分用備忘録
随時更新

##### diffで中間ファイルを作らず直接コマンド出力結果を比較
```bash

diff <(ls dir1) <(ls dir2)
```
> `<(...)` はコマンドの結果を(名前付き)パイプに放り込む方法で、名前付きパイプはファイルと同等の扱いをされます。

##### マージ済リモートブランチをローカルからも削除
```bash
# リモートから最新情報をフェッチ
git fetch origin --prune
# マージ済ブランチ削除
git branch --merged | grep -vE '^\*|master$|develop$' | xargs -I % git branch -d %
```

##### dockerのプロセスを一律kill
```bash
docker ps -a | awk -F '  +' 'NR > 1 {print $7}' | xargs docker rm -f 

# ついでに溜まったimageなどを削除
docker system prune -af --volumes
```

##### Gitでソースだけ落としてくる
```bash

 curl -L https://github.com/pinard/Pymacs/tarball/v0.24-beta2 | tar zx
```

##### GitのOrganization内の全リポジトリClone
いつ使うのかって
横展開系作業が発生したときですよ…

```bash

curl -H "Authorization: token <ACCESS_TOKEN>" https://github.com/api/v3/orgs/<Organization-name>/repos?per_page=500 | jq '.[].ssh_url' | sed -e 's/"//g' | xargs -I{} git clone {}
```

#### lsof

```bash
# ポート指定
# portが80, 443で開いているプロセスを表示できる
lsof  -i:80,443
  
# 明示的にLISTENされているプロセスを調べたい場合
lsof -i:6379 |grep LISTEN
  
# TCPとして指定する
lsof -iTCP:6379 |grep LISTEN
  
# プロセス名を指定
lsof -c ruby
  
# PIDを指定
lsof  -p 376
  
# ユーザー名を指定
lsof -c ruby
```

#### awkで重複削除
```bash
awk '!a[$0]++'
```

#### 複数プロセスを同時kill
```bash
kill `ps -ef | egrep -r <プロセス名> | grep -v grep | awk '{print $4}'`
```

#### すべての画像をjpg -> pngに変換
mogrifyはconvertの一括変換版

```bash
mogrify -format jpg *.png
```

#### thanks
- [diffでコマンドの出力の結果を直接比較する。](https://qiita.com/wingedtw/items/2f05c5d0c37d71f209f4)
- [organizationのリポジトリをまとめて取得する](https://qiita.com/hachi_eiji/items/e1e4e82dd5fa13ce5757)
- [How do I download a tarball from GitHub using cURL?](https://stackoverflow.com/questions/5746325/how-do-i-download-a-tarball-from-github-using-curl)
- [](https://liginc.co.jp/394506)
pythonで素数一覧を作成してみた

pythonを使って素数の一覧を表示するプログラムを作成しました。
##pythonで素数一覧を表示するプログラム

```python:main.py
def primeNumberCreate():
    primeList = [2]  # 2以下の素数リストを作成
    maxNumber = 1000 # 1000以下の数字をチェック
    for x in range(3, maxNumber):
        for y in primeList:
            if x % y == 0:
                break
        else:
            primeList.append(x)  # 割り切れるものがなければリストに追加
    return primeList

def indentAdjustment(primeNumbers): # インデント調節のため
    count = 0
    for num in primeNumbers:
        print(f"{num:4}", end=" ")
        count += 1
        if count > 9:
            print(' ')
            count = 0

if __name__ == '__main__':
    primeNumbers = primeNumberCreate()
    indentAdjustment(primeNumbers)
```

for文のelseの処理は、for文の中の全ての処理が終わった後に実行されます。
if文で引っかからなかったものがlistに代入されるようにしています。
indentAdjustment()はインデント調節するために作りました。


実行結果は下記の通りです。

```terminal:terminal
   2    3    5    7   11   13   17   19   23   29  
  31   37   41   43   47   53   59   61   67   71  
  73   79   83   89   97  101  103  107  109  113  
 127  131  137  139  149  151  157  163  167  173  
 179  181  191  193  197  199  211  223  227  229  
 233  239  241  251  257  263  269  271  277  281  
 283  293  307  311  313  317  331  337  347  349  
 353  359  367  373  379  383  389  397  401  409  
 419  421  431  433  439  443  449  457  461  463  
 467  479  487  491  499  503  509  521  523  541  
 547  557  563  569  571  577  587  593  599  601  
 607  613  617  619  631  641  643  647  653  659  
 661  673  677  683  691  701  709  719  727  733  
 739  743  751  757  761  769  773  787  797  809  
 811  821  823  827  829  839  853  857  859  863  
 877  881  883  887  907  911  919  929  937  941  
 947  953  967  971  977  983  991  997 
```
Javaはなんでファイルの事をクラスって言うの？

Javaを勉強し始めたばかりの者です。
Eclipseを使っています。

Javaはファイル(.java)の事を「クラス」って言うんだなと勘違いしてました。

ターミナルとVScodeを使っていた時の事です。

```ターミナル
$ javac ○○.java

```

実行したところ
新しく「○○.class」と言う
ファイルが出来てました。

javacは「Javaのコンパイル」と言う意味です。

```ターミナル
$ java ○○

```

次に上記のように実行したところ、ターミナルに思い通り出力がされました。

#まとめ

コンパイルをする事で、できるのが.classファイルだと言うことが分かった。

Eclipseを使うとまとめて処理してくれるので、裏の動きがどうなっているのか知る事が出来た。
Amazon Web Services (AWS)サービスの正式名称・略称・読み方まとめ #19 (ブロックチェーン)

Amazon Web Services (AWS)のサービスで正式名称や略称はともかく、読み方がわからずに困ることがよくあるのでまとめてみました。

Amazon Web Services (AWS) - Cloud Computing Services
https://aws.amazon.com/

全サービスを並べたチートシートもあるよ！

Amazon Web Services (AWS)サービスの正式名称・略称・読み方チートシート - Qiita
https://qiita.com/kai_kou/items/cb29d261c8acc49fd22a


まとめルールについては下記を参考ください。

Amazon Web Services (AWS)サービスの正式名称・略称・読み方まとめ #1 (コンピューティング) - Qiita
https://qiita.com/kai_kou/items/a6795dbab7e707b0d1a6


間違いや、こんな呼び方あるよーなどありましたらコメントお願いします！


## Blockchain - ブロックチェーン

### Amazon Managed Blockchain

- 正式名称: Amazon Managed Blockchain
- https://docs.aws.amazon.com/managed-blockchain/?id=docs_gateway
- 読み方: マネージド ブロックチェーン
- 略称: なし
- 俗称: AMB
  - 参考: https://prtimes.jp/main/html/rd/p/000000029.000031033.html


## 他のまとめ

[Amazon Web Services \(AWS\)サービスの正式名称・略称・読み方まとめ \#1 \(コンピューティング\) \- Qiita](https://qiita.com/kai_kou/items/a6795dbab7e707b0d1a6)

[Amazon Web Services \(AWS\)サービスの正式名称・略称・読み方まとめ \#2 \(ストレージ\) \- Qiita](https://qiita.com/kai_kou/items/a8ba7a17dd88e9763fbf)

[Amazon Web Services \(AWS\)サービスの正式名称・略称・読み方まとめ \#3 \(データベース\) \- Qiita](https://qiita.com/kai_kou/items/26dcbd7846205efbe48f)

[Amazon Web Services \(AWS\)サービスの正式名称・略称・読み方まとめ \#4 \(開発者用ツール\) \- Qiita](https://qiita.com/kai_kou/items/e459647883dd00cda939)

[Amazon Web Services \(AWS\)サービスの正式名称・略称・読み方まとめ \#5 \(セキュリティ、アイデンティティ、コンプライアンス\) \- Qiita](https://qiita.com/kai_kou/items/5c5d4d9c543fc19a88c4)

[Amazon Web Services \(AWS\)サービスの正式名称・略称・読み方まとめ \#6 \(暗号化と PKI\) \- Qiita](https://qiita.com/kai_kou/items/e81c55a33f4e3ee7b4c7)

[Amazon Web Services \(AWS\)サービスの正式名称・略称・読み方まとめ \#7 \(機械学習\) \- Qiita](https://qiita.com/kai_kou/items/80c9759b6849ad7898f4)

[Amazon Web Services \(AWS\)サービスの正式名称・略称・読み方まとめ \#8 \(マネジメントとガバナンス\) \- Qiita](https://qiita.com/kai_kou/items/145fa47d56bb9aa57134)

[Amazon Web Services \(AWS\)サービスの正式名称・略称・読み方まとめ \#9 \(移行と転送\) \- Qiita](https://qiita.com/kai_kou/items/965cf87628fb12e23164)

[Amazon Web Services \(AWS\)サービスの正式名称・略称・読み方まとめ \#10 \(モバイル\) \- Qiita](https://qiita.com/kai_kou/items/36cc134277e3e3e6cac4)

[Amazon Web Services \(AWS\)サービスの正式名称・略称・読み方まとめ \#11 \(ネットワーキングとコンテンツ配信\) \- Qiita](https://qiita.com/kai_kou/items/1e1855248bd2ebe90f26)

[Amazon Web Services \(AWS\)サービスの正式名称・略称・読み方まとめ \#12 \(メディアサービス\) \- Qiita](https://qiita.com/kai_kou/items/7653a09c8418ff46c2e2)

[Amazon Web Services \(AWS\)サービスの正式名称・略称・読み方まとめ \#13 \(エンドユーザーコンピューティング\) \- Qiita](https://qiita.com/kai_kou/items/ae0aaad7f5019841df40)

[Amazon Web Services \(AWS\)サービスの正式名称・略称・読み方まとめ \#14 \(分析\) \- Qiita](https://qiita.com/kai_kou/items/3f31ce445cbf597d1e7f)

[Amazon Web Services \(AWS\)サービスの正式名称・略称・読み方まとめ \#15 \(アプリケーション統合\) \- Qiita](https://qiita.com/kai_kou/items/97af297a11fa16a1df3c)

[Amazon Web Services \(AWS\)サービスの正式名称・略称・読み方まとめ \#16 \(ビジネスアプリケーション\) \- Qiita](https://qiita.com/kai_kou/items/da941eec64dba4f50d12)

[Amazon Web Services \(AWS\)サービスの正式名称・略称・読み方まとめ \#17 \(サテライト\) \- Qiita](https://qiita.com/kai_kou/items/58434ec361f85cfc2c02)

[Amazon Web Services \(AWS\)サービスの正式名称・略称・読み方まとめ \#18 \(ロボット工学\) \- Qiita](https://qiita.com/kai_kou/items/af28c78d10ad4eb42cce)
デジタル・アジール・モデル Ver1.0

  昨今の急激な情報化によって，決定論的な社会構造がつくりあげられつつある．このような社会構造の在り方を，ここでは制御社会と呼ぶ．
　制御社会においては開発された技術が，いつの間にか社会構造を操作する大きな力をもつ主体により制限または制御される．我々はそれを否定する．我々の既存の社会で標準化されている制度や産業の多くは望ましくないという前提のもとに新しい技術化された共同体，アジールを考察し，これを技術的に実装する．
　社会は確かに歴史的な大きな抗争を経て徐々に均衡点に収束しているようにみえる．その潮流の中で，先人の研究も含めて我々はよりよい社会の在り方を考察してきた．そこで我々は社会は人が作り上げる限り収束しないと考えるに至った．ここにハクティビズムにおける真の原理がある．
    さて，ネットワーク上のアジールに相当するものは，日本において例えば旧くは2チャンネル，現在では複数アカウントを利用したTwitterがあるが，これらはすべて制御社会の中に存在する．現在，世界中で展開されている制御社会に対応するために匿名性の必要性が高まっている．しかしながら，匿名性の概念は違法行為に結びつく可能性を含むので，反社会性を伴う場合もあり懸念もされている．我々はその匿名性を用いてこそネットワークの中にアジールを構築する．我々は，自分のアイデンティティを隠すことを望んでいる．ここでは，外部から事実上不可視になるような共同体の匿名性を強い匿名性と呼ぶ．それによって権力機構から自立した共同体を甦らせ，この息の詰まる社会から脱出する場所，アジールを仮想的に実装する．ダークウェブは市場的価値に意味を見出しているという点で，我々のアジールとは本質的に異なる．
 　我々は制御社会を逃れて，人が自由に生きられるような新たなシステムを創出する必要がある．それをここでは，デジタル・アジール・モデル Ver1.0  と呼ぶ．デジタル・アジール・モデルでは，ブロックチェーン技術を用いる．キリスト教はその中にすでにキリスト教倫理として合意形成手法を内包しており，これを，PoW（賢者），PoS（富豪）と比較してProof of Sacrifice（PoS：聖者）と呼び，デジタル・アジール・モデルの基盤とした．デジタル・アジール・モデル では，ブロックチェーンの強い匿名性とメカニズム（デザイン），トランスヒューマニズムから社会の中に不可侵な領域，アジールを再構成することを提案する．
 　現在の社会は社会からのフィードバックを我々が調節しようと試みてもフィードバックするプロセスが我々の予測を越えて制御することができないという技術的特異性の反映である社会的特異性に達している．トランスヒューマニズムにおける新興技術の既存社会への破壊的な性質は，より多くの情報を処理するには利用可能な選択肢や手段が多くあった方が好ましいという思想であり，それはキリスト教倫理と相容れないものではない．自由を拡大するには技術を拡大する必要もある．我々が，現在の状況について危惧するのは，技術が抑制されるつつあることであり，既存の社会構造を変えるような技術には鋭いバイアスがかかることである．社会における規範倫理の重要性は言うまでもないが対応が追いついていない．ゲーム理論ではルールが与えられた上で結果を分析するが，メカニズムではある望ましい結果を得ることができるようなルールを設計する．メカニズムは，人が集団としての意思決定をする場である社会におけるルールやプロトコルである．ここにキリスト教倫理を適用し，その維持や運営をGNUの思想と機械によって達成することを提唱する．
　本稿では，デジタル・アジール・モデル Ver1.0を提案した．それは，高デジタル化されたアーミッシュと呼ぶべきものである．
　最後に我々は，今の社会構造に不満を抱いている人たちは，人が新たな自由の獲得手法を手に入れたことを確信する．
健康的なエンジニアリング

はじめに
---
毎日パソコン触っていて健康になるはずもないので、対策をとっていかなければなりません。
食事、運動、メンタルの3つの観点から自分が気をつけている事を備忘録的に書いていきます。
※備忘録の為、主観が入りまくっている事に注意してください。



食事
---
**腹が減ったら干し芋を食べる**


芋の食物繊維は豊富なので芋を食べれば、満腹になり過食を防げます。
満腹になれば余計な物を食べないので体が軽くなります。
体が軽くなったら？そうです。運動ですね。
それでも腹減ったら、サバ缶食べましょう。
それから好きな物食べれば良い。



運動
---

**ひたすら歩く**

一日8000歩を目標に無心で歩きましょう。こんな事で健康になるのかと不安になるかも知れません。
歩く事に関しての科学的な論文は豊富にあります。

大丈夫です。一人で歩いているわけではありません。
あなたは科学的根拠と共に歩いています。



メンタル
---
**休んで心療内科に行きましょう。**

メンタルを最後に配置した理由は、十分な食事、運動、睡眠が達成できていた状態でメンタルの改善が必要なのであれば、環境に問題があるからです。あなた自身に問題はありません。
環境を変えるには客観的な視点が必要になります。
職場や家族のアドバイスも良いですが、今後の関係性を考慮してお互い本音で言えない事も多いはずです。


自分を信じる事ができない毎日が続くなら、環境を変える必要があります。
Auth0でログインユーザーのロール(Roles)を元にハンドリングするRulesを書いてみた


Auth0でログインしたユーザーによって処理を変えたいときに、Rulesというログイン時に任意スクリプトを実行してハンドリングさせる機能があります。

> 参考: [「Auth0」のRulesが便利機能だった！！ / 『「Auth0」で作る！認証付きシングルページアプリケーション』でAuth0をさわってみた](https://blog.pirox.dev/2019/05/04/231114)

今回は、 **ユーザーのロールを元にハンドリングをする処理を書いてみます**。

このRulesはNode.jsで記述するFaaS的なものになっているので、公式サンプルには無いものも比較的カスタマイズしやすそうです。

## 例: whitelist - 特定のメールアドレスの人を通す

公式サンプルです。こんな雰囲気。

> ![](https://i.gyazo.com/6a83be437f181033cef72eef882f1ffd.png)

```js
function (user, context, callback) {

  // Access should only be granted to verified users.
  if (!user.email || !user.email_verified) {
    return callback(new UnauthorizedError('Access denied.'));
  }

  const whitelist = [ 'user1@example.com', 'user2@example.com' ]; //authorized users
  const userHasAccess = whitelist.some(
    function (email) {
      return email === user.email;
    });

  if (!userHasAccess) {
    return callback(new UnauthorizedError('Access denied.'));
  }

  callback(null, user, context);
}
```


## ユーザーのロールを元に判定

ここで、ユーザーのロールを見て、特定のロールの人は通して、それ以外は除外するといった処理を追加してみます。

HTTPモジュールの[Request](https://www.npmjs.com/package/request)が利用できるのでRequestの使い方を調べつつ書いてみました。

> 参考: [Node.jsのrequestモジュールを使ってHTTPSでPOSTリクエストを行う](https://qiita.com/penta515/items/074b5c7694b9bcec1043)

Enpty Rulesを選んで以下をコピペで使えると思います。

> ![](https://i.gyazo.com/5e0e94a2e677928f49e2de4c3bac0b0a.png)


また、settingsの箇所でtokenなどの値を設定することができます。
RulesのNode.js側からは`configuration.キー名`って形で取得できます。

キャプチャだと`token`というキー名にしたので`configuration.token`でNode.js側で呼び出せます。

> ![](https://i.gyazo.com/a45b24216f41c5eb3bb1fd1758881605.png)

```js
function (user, context, callback) {
  console.log(context, user, user.identities[0].access_token);
  // Access should only be granted to verified users.
  if (!user.email || !user.email_verified) {
    return callback(new UnauthorizedError('Access denied.'));
  }
  
  const token = configuration.token; //Auth0のAPIのアクセストークン (Settingsで指定したもの)
  const options = {
    url: `https://xxxxxx.auth0.com/api/v2/users/${user.user_id}/roles`,
    method: 'GET',
    headers: {
  		'Authorization': `Bearer ${token}`
		},
    json: true,
  };
  request(options, (err, response, body) => {
    //許可するロール名    
    const whiteList = ['role1','role2'];
    const userRoles = body.map(item => item.name);
    const userHasAccess = userRoles.some(value => whiteList.includes(value));
    
    if (!userHasAccess) {
      return callback(new UnauthorizedError('Access denied.'));
    }
    
    callback(null, user, context);
  });
}
```

ホワイトリストの配列のチェックをさせてますが、`.some()`便利ですね。

## 所感

Node.jsなので割と色々と任意の処理をさせることができそうですね。

Rules内でnpm上の外部モジュールは使えるのかとか色々気になります。

個人的にはaxiosが使えると便利なんだけどなぁと思いつつまた次回にしたいと思います。

まだまだAuth0の使えてない機能がいっぱいあるので試していきたいです。
PythonでQRコード作成。定期券発行の際に毎回同じこと書いて、並びたくない。。

年明けに通勤のための定期券発行（再発行）にいってきました。

すんごい行列。。。

なんだこれは。ディズニーランド的な。

毎回同じこと書いてるし。並ぶし。めんどくさい。

ということでこれって、QRコードを一回発行して、各自がスマホでかざせばかなり効率化できるのでは？？

![スクリーンショット 2020-01-08 6.26.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240982/a0e28ecd-e96f-7f8a-cd44-e69f84c84a0b.png)

まずはQRコード作成用のモジュールをpipでインストール。

```
$ pip install qrcode

```

あとは、初回に属性情報を求めて、QRコード化。

```
qrmake.py


import qrcode

name=input('氏名は?')
address=input('住所は？')
age=input('年齢は？')
tel=input('電話番号は？')
start=input('出発は？')
goal=input('到着は？')
via=input('経由地点は？')

img=qrcode.make('氏名：'+str(name) + '  address：' + '  年齢：' +str(age) +'  電話番号' + str(tel) + ' 出発地点:' +str(start) + ' 到着:'+str(goal) +' 経由:' +str(via))
img.save('属性情報')

```

こんな感じ。

```

(kyoto) MacBook-Air% python3 qrmake.py
氏名は?たなかたろう
住所は？京都市A 町B通りマンションC１０１号
年齢は？40歳
電話番号は？090-000-0000
出発は？京都駅
到着は？五条駅
経由地点は？　

```

そうするとQRコードが発行されます。

そのコードを紙で渡すか、メールで飛ばすようにしておけばいいのでは。

頼むよ京都市。


![スクリーンショット 2020-01-08 6.56.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240982/50ba2472-4ce7-8e8e-dec0-64b54ed73c0b.png)

＜追記　2020.1.12>

データベースの作成とQRコードが自動発行される仕組みを応用編で書きました。

参照：[近所のクリーニング屋さんの電話が鳴りっぱなしだったので、PythonでQRコードが自動発行される顧客データベースを作ってみる]
(https://qiita.com/youichiokuda/items/c2fcfbae92c7f8c3d0ce)
Laravelでs3から落としてきたデータをストリーミングでクライアントへ返す方法


## 初めに
これは備忘録なので、日本語で理解しずらい部分もあるかもしれません。
その点ご了承ください。

## 開発環境
Laravel 6.0
homestead
vagrant

## はじまり
ajaxでs3にあるデータをzipファイルにして落とそうと思ってたんだけど、どうしても一度内部でzipファイルを保存してから

```
Storage::disk('public')->download($zipFileName);
```
こんな感じでクライアントへresponseするしかやり方が分からなかった。
ただ、毎回こんな風にzipファイルを内部に保存してたら、いろいろ面倒だなーということでストリーミングでダウンロードできるようにする方法を模索し始めたのが今回のお話

## 結局何使ったの？
最終的には[stechstudio/laravel-zipstream
](https://github.com/stechstudio/laravel-zipstream)のパッケージを使った。内部では[maennchen / ZipStream-PHP](https://github.com/maennchen/ZipStream-PHP)これをつかってるらしい。

これを使うのはいいものの、どの記事でもs3から複数のデータをzip化する方法が書いてなくて、そこでつまずいた。

最終的には

```
$zip = Zip::create('sample.zip');

            if (File::where('project_id', $id)->exists()) {
                $downloadFileArray = File::select(['XXXX', 'XXXX'])->where('id', $id)->get();
                $a = 1;
                foreach ($downloadFileArray as $fileInfo) {
                    $contents = Storage::disk('s3')->get($fileInfo->file_path);
                    $fileName = $fileInfo->file_name;
                    $extension = \File::extension($fileName);
                    $zip->addRaw($contents, $a.".".$extension);
                    $a++;
                }

            }
            return $zip;
```

こんな感じになった。
サンプルでよくあるのは

```
Zip::create("package.zip")
    ->addRaw("...file contents...", "hello.txt");
```

こんなやつだけど、分離して書けばいいだけでしたね。

あともう一個躓いてるのは、ファイル名の日本語化が出来ないこと
これに気づかなくて、すっごい躓いた。

どうにかして日本語化できないかなー。
だれか知ってる人教えてー
CloudBuildの為のUnity Teamsの設定方法(2020/1/8時点)

# CloudBuildの為のUnity Teamsの設定方法(2020/1/8時点)

## CloudBuildをする為には課金が必要になったそう。
昔は無料でも使えた様なのですが、今は毎月のサブスクリプションを支払う必要がある様です。
現時点(2020/1/8)でUnityのCloudBuildを使うのに必要なサービスは以下。

- Unity Teams Advancedを登録(毎月9$)
- Unity Proを登録(毎月$150)

Unityヘビーユーザーや仕事でUnityを使っている人はUnity Proでも良いと思いますが、
今回はお安く済ませたいのでUnity Teams Advancedを使ってCloudBuildを使える様にしましょう。

## Unity Teams Advanced(UTA)を登録しよう。

### なんと嬉しい事にUTAは初月無料！

[Unity Teamsのプラン選択](https://unity3d.com/get-teams?_ga=2.202520337.1071561859.1578417468-650656982.1578417468)ページで**[Get free trial]**を押して登録を済ませましょう。
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315136/2ad168c1-1da1-5632-63e7-726939e06fa2.png)


## パッケージ内容

1. 3人分のライセンス
2. 25GBのクラウドストレージ
3. １つの同時ビルド

(1)はデフォルトで3人のライセンス。組織にいる他のメンバー２人にライセンスを付与する事が可能です。
追加でライセンスを取得したい場合は月々1人辺り$7の追加料金が必要。

(3)はCloudBuildの同時ビルド数だと思います。(多分。複数プラットフォームを設定している時、一つずつビルドしていたので。

**[Continue to purchase]**を押して次へ進みましょう。
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315136/4a0d0c67-3369-0c31-eeb2-50e7fbb6e62a.png)


組織を選択する画面ですね。
UTAは組織毎の必要なライセンス数登録する必要があります。
貴方がアップグレードしたい組織を選択しましょう。
今回は前回の記事で作成した**[TestOrganization01]**の組織をアップグレードします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315136/b8aa1801-b6e1-cb12-6a47-c4b750c460cf.png)


組織の各種情報と支払情報を設定して右上の**[Pay now]**をクリック。
支払いはアップグレードした日から30日後から毎月自動更新で課金されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315136/35bfc971-3969-a6d3-047d-24fa581bc4c5.png)


登録完了すると以下の様になります。
これは組織のページです。
SubscriptionsにUnity Teams Advancedの表示がされていますね。

![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315136/8bc5dd49-8040-279b-6342-b7f402360482.png)


これでCloudBuildを設定する為の準備が完了しました。
実際のCloudBuildの設定は別記事にしようと思います。
[備忘録]win10 ver1903以降でssh接続しようとすると"Bad owner or permissions on ..."と表示されあったまってた話。

#はじめに
元々難なくssh接続できていたのにあるときから"Bad owner or permissions on ..."と表示されVScodeやコマンドプロンプトからsshできず困っていた。原因を探ってみるとどうやら**sshの秘密鍵(ここではid_rsa_s*l)とsshのconfigファイルのアクセス権限がガバガバ**であることが原因らしいとわかった。ふーむ

#さっそくパーミッションを変更...あれ？
私はwslを使っているので「そっちからパーミッションを変更しよう！」と安直に

```bash
chmod 644 ~\.ssh\id_rsa_s*l
```

と実行した。改めてパーミッションを確認してみると何も変わってない。それもそのはず、このファイルはUbuntu下ではなくWindows下にあるのである...南無

#Windowsでパーミッションを...ではなく管理者の変更を行った。
これがまた面倒であった。プロパティ->セキュリティ->詳細設定から**所有者欄のアカウント以外を全部削除**しなければならなかった。わかってしまえば単純なことであったが...ぐぬう。とにもかくにもアクセス権限を締め直し、キツキツにしたところでようやくsshできるようになった。

#おわりに
windowsくんは権限まわりを明快にしてくださーい。
windowsユーザーの方でいきなりsshが使えなくなった方は参考にしてみてください。

#参考
[Win10のSSHでBad owner or permissions](https://qiita.com/ryota23/items/8d2745c3b275e8ec7ea8)
[プロキシ環境でVS Code Remote Development](https://yunkt.hatenablog.com/entry/2019/06/16/121637)
Laravel マイグレーションのロールバックテスト

Laravelのマイグレーションはup, downを対にして書く必要があります。
ロールバックをする機会が少ないせいかdownの処理が壊れたままに開発を進めてしまうことが稀によくありました。

しかし、毎回downの処理が正しいのか手動でテストするのは面倒です。
そこでロールバックのテストを自動化したいと思いテストコードを考えました。

## MigrateRollbackTest.php

`tests/MigrateRollbackTest.php` 

```php:tests/MigrateRollbackTest.php
<?php declare(strict_types=1);

namespace Tests;

class MigrateRollbackTest extends TestCase
{
    public function testRollback()
    {
        $this->artisan('migrate:fresh', ['--seed' => true]);
        $this->artisan('migrate:refresh');

        $this->assertTrue(true);
    }
}
```

`$this->artisan()` メソッドでLaravelのコマンドを実行できます。
シーディングのテストまで行いたい場合は、第二引数でオプションを渡せばokです。

ロールバックするには、最新のテーブル定義になっている必要があるので `migrate:fresh` で最新のテーブル構成にしたのち、 `migrate:refresh` ロールバック＆マイグレーション再実行を行います。

## phpunit.xml

`phpunit.xml` にテストスイートを追加します。

```xml:phpunit.xml
    <testsuites>
        <testsuite name="Database">
            <file>./tests/MigrateRollbackTest.php</file>
        </testsuite>

        <testsuite name="Unit">
            <directory suffix="Test.php">./tests/Unit</directory>
        </testsuite>

        <testsuite name="Feature">
            <directory suffix="Test.php">./tests/Feature</directory>
        </testsuite>
    </testsuites>
```

`<testsuites>` タグ内に `Database` テストスイートを追記します。

## テストの実行

```shell-session
$ ./vendor/bin/phpunit
```

### ロールバックのテストのみ実行したい

```shell-session
$ ./vendor/bin/phpunit --testsuite Database
```

オプションでテストしたいテストスイートを指定すればokです。

## 参考記事

- https://phpunit.readthedocs.io/ja/latest/configuration.html#appendixes-configuration-testsuites

## 関連記事

- [Laravel × Docker でテスト用のデータベースコンテナを使う](https://qiita.com/ucan-lab/items/0f7100f08a062e892c52)