OmniAICreator/Qiita-1.07M huggingface dataset:
Rustで数値計算してみた

RustはSIMDをサポートしているため数値計算も視野に入れていると見ました。現在SIMDを試せる環境がないのですが，システム制御用の信号処理器(とりあえず微分と積分を実現するIIRフィルタ)を作ってみました。

```rust:main.rs

use std::io::prelude::*;
use std::fs::File;
use std::io::BufWriter;
use std::f32;

mod integrator1;
mod differentiator1;

use integrator1::Integrator1;
use differentiator1::Differentiator1;

fn main() { 
	
	let ts=1e-4;
	let mut t:f32=0.0;
	
	let sim_range=20000;
		
	let fp1 = format!("dif.dat");
	let fp2 = format!("int.dat");

	let mut buffer1 = File::create(fp1).unwrap();
	let mut buffer2 = File::create(fp2).unwrap();

	//Buffering
	let mut buffer1 = BufWriter::new(buffer1);
	let mut buffer2 = BufWriter::new(buffer2);

	let mut int=Integrator1::new(ts);
	let mut dif=Differentiator1::new(ts,100.0);

	let freq:f32=5.0*f32::consts::PI;
	let mut uix:f32;	//input for integrator
	let mut udx:f32;	//input for differentiator
	let mut ix:f32;		//output of integrator
	let mut dx:f32;		//output of differentiator
	
	for _ in 0..sim_range {
		uix=(freq*t).sin();
		udx=1.0-(freq*t).cos();
	
		ix=int.get(uix);
		dx=dif.get(udx);
	
		write!(buffer1, "{:.04e} {:.04e} {:.04e}\n",t,udx,dx).unwrap();
		write!(buffer2, "{:.04e} {:.04e} {:.04e}\n",t,uix,ix).unwrap();
		
		t+=ts;
	}
}
```
IIRフィルタ実装にはstructを利用してみました。これで複数のIIRを呼べるようになりました。

```rust:differentiaotr1.rs
use std::fmt;

pub struct Differentiator1{
	yz1:f32,
	uz1:f32,
	a:f32,
	b:f32,
}

impl fmt::Display for Differentiator1 {
	fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
		write!(f, "{:.06e}", self.yz1)
	}
}

impl Differentiator1{
	pub fn new(ts:f32,g:f32)->Differentiator1{
		Differentiator1{
			yz1:0.0,
			uz1:0.0,
			a:2.0*g/(2.0+g*ts),
			b:(2.0-g*ts)/(2.0+g*ts),
		}
	}
	
	pub fn _zero(&self)->Differentiator1{
		Differentiator1{
			yz1:0.0,
			uz1:0.0,
			a:self.a,
			b:self.b,
		}
	}

	pub fn get(&mut self,u:f32)->f32{
		self.yz1=(u-self.uz1)*self.a+self.yz1*self.b;
		self.uz1=u;
		self.yz1
	}
}
```

```rust:integrator1.rs
use std::fmt;

pub struct Integrator1{
	yz1:f32,
	uz1:f32,
	a:f32,
}

impl fmt::Display for Integrator1 {
	fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
		write!(f, "{:.06e}", self.yz1)
	}
}

impl Integrator1{
	pub fn new(ts:f32)->Integrator1{
		Integrator1{
			yz1:0.0,
			uz1:0.0,
			a:ts/2.0,
		}
	}
	
	pub fn _zero(&self)->Integrator1{
		Integrator1{
			yz1:0.0,
			uz1:0.0,
			a:self.a
		}
	}

	pub fn get(&mut self,u:f32)->f32{
		self.yz1=(u+self.uz1)*self.a+self.yz1;
		self.uz1=u;
		self.yz1
	}
}
```
入出力結果を見ると，微積分ができていました。
![xx_res.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43995/8636a93e-a1ea-e9a7-edba-6d739b612348.png)
c++より簡単に実装できる気がしました。
Scrumの勉強に、ありがたいリンク集

アジャイル開発フレームワークの一つである「Scrum」を勉強した際に、ありがたかったサイトのリンク集です。

#Scrumの原典「ScrumGuide」

####リンク先
><font color="Black">Download the official Scrum Guide</font>
>https://www.scrumguides.org/download.html

####コメント
フレームワーク「Scrum」の開発者Ken･SchwaberとJeff･Sutherlandによって書かれたガイドブック。Scrumの原典ともいえますから、Scrumを学ぶ上では必読です。

比較的Scrumで定義される事項が少ないこともあり、18ページ（2017年11月 日本語版)とコンパクトにまとまっています。読み終えるのに時間はかかりません。

フレームワークのテクニカルな部分だけでもなく、考え方や価値観も強く打ち出しています。

抽象的な言葉遣いが難点ともいえるので、次の記事も役に立ちました。
><font color="Black">スクラムガイドをきちんと読もう
>https://qiita.com/bringer1092/items/a459cc9e9e2bc2b25deb


#Scrumの俯瞰図
####リンク先

><font color="Black">スクラムの概要を1分で理解できるイラスト【2018版】</font>
>https://www.ryuzee.com/contents/blog/7124

####コメント
Scrumの俯瞰図として、現時点で最高のものだと思います。とくに初心者には。
私は、Scrumにプロジェクト管理担当やマネジャーがいない、ということを、この俯瞰図で悟りました。

改変せずに引用元を併記するれば自由に使っていい、という点もすばらしい。

#Scurmの方向性を一言でいうと
####リンク先
><font color="Black">5分で分かる、「スクラム」の基本まとめ</font>
>https://www.atmarkit.co.jp/ait/articles/1208/07/news128.html

####コメント
「ScrumGuide」で咀嚼が難しい内容に図解を入れて、よりわかりやすくまとめてくれています。
とくにScrumを「伝統的なリーダーが行ってきたことを、できる限りチーム自身が行うこと」とまとめてくれているのは、ウォーターフォール開発を経験してきた人にはありがたいものではないでしょうか。

このサイトを読んでからもう一度「ScrumGuide」に立ち戻ると、より理解が深まると思います。


#IPA版 "ScrumGuide"
####リンク先
><font color="Black">「アジャイル領域へのスキル変革の指針 アジャイル開発の進め方」</font>
>https://www.ipa.go.jp/files/000065606.pdf

####コメント
IPA(独立行政法人 情報処理推進機構)が作成したScrum解説書。IPA版の"ScrumGuide"といえる内容です。特にScrumのおける開発チームの構成や必要なスキルをこれまでIPAが培ってきたIT人材の知見をベースに解説しており、非常に充実しています。

IPAが策定している「ITスキル標準(ITSS)」にアジャイル領域を追加する際に作成されたドキュメントになります。

>https://www.ipa.go.jp/about/press/20180409.html
>https://www.ipa.go.jp/jinzai/itss/itssplus.html#section1-4

開発チームの人材やスキルに関心がある人は一読するとよいと思います。

#立場によって変わる「プロダクトバックログ」の意味
####リンク先
><font color="Black">魅力的なプロダクトバックログで開発を楽しく！
>https://kray.jp/blog/attractive-product-backlog/

####コメント
よりよい(リンク先の表現では「魅力的な」)プロダクトバックログを、プロダクトオーナーと開発チームの双方の視点から説明していることが新鮮でした。
当たり前ですが、立場によってその意味が変わるという観点は、Scrum開発を実際に行う上で忘れないでおこうと思います。

#スプリント期間中の臨場感
####リンク先
><font color="Black">わたしたちがスクラムのスプリント期間を 1 週間にし、タスクを 1 時間以下の単位に分割するのはなぜか
>http://appresso.hatenablog.com/entry/2016/12/03/104407

####コメント
スプリントの解説としても充実していますが、Scrum開発の創意工夫の臨場感がすばらしい。
スクラムマスターの思考を追体験できます。

#ベロシティとは
####リンク先
><font color="Black">ベロシティに対する誤解
>https://www.ryuzee.com/contents/blog/4802

####コメント
最初、語感からまったく想像できなかったベロシティを誤解なく説明してくれています。
ベロシティと工数は重なる部分もありますが、重ならないところにこそScrumらしさがあります。

#タスクボード
####リンク先
><font color="Black">スクラム開発-タスクボード公開
>https://qiita.com/R_TK_8170/items/86e2ff3e890763413af4

####コメント
進化したタスクボードの紹介。タスクボード自体は「ScrumGuide」で定義されていないものですが、創意工夫の一例として新鮮でした。


#プログラミング手法
####リンク先
><font color="Black">ペアプロ懐疑派だった僕が、実務でペアプロ導入して180度考えが変わった話
>https://qiita.com/YudaiTsukamoto/items/06b426f4dbee268d5035

><font color="Black">エンジニアのスキルを伸ばす“テスト駆動開発”を学んでみよう
>https://thinkit.co.jp/story/2014/07/30/5097

####コメント
「ペアプログラミング」「テスト駆動開発」は、アジャイル開発手法の一つ「XP(エクストリームプログラミング)」の中で語られるプログラミング手法ですが、Scrumとの親和性が高いのでScrumの中で活用されていることも多いらしいです。
(以下参照)

><font color="Black">海外の開発者はどのような開発手法を使っている？(アジャイル、スクラム、ペアプログラミング、かんばん開発手法等)
>http://everything-you-do-is-practice.blogspot.com/2017/11/blog-post_27.html


#まとめ
「ScrumGuide」でScrumを「理解が容易」で「習得は困難」と定義しています。
習得のためには、教科書的な理解を超えた経験や情報は欠かせないもので上記リンク先はありがたいものでした。感謝。
テキストボックスで表示が遅いとき、WordWrapプロパティをFalseにすると速い

#はじめに
Windows フォームのテキストボックス（.NET Framework の Windows Forms コントロール System.Windows.Forms.[TextBox](https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.forms.textbox)）で複数行の長い文章（文字列）を表示させるとき、[WordWrap](https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.forms.textboxbase.wordwrap) プロパティを false に設定すると、時間を大幅に短縮できることがあります。

#比較結果
データには、日本郵便株式会社提供の「[郵便番号データ.csv 全国一括版](https://www.post.japanpost.jp/zipcode/dl/oogaki-zip.html) 」(KEN_ALL.CSV) を利用させていただきました。
<dl>
<dt>・WordWrap = false</dt><dd>平均 0.168087467 秒<br>{0.1545456, 0.172627, 0.17709}</dd>
<dt>・WordWrap = true (既定）</dt><dd>平均 14.61888617 秒<br>{14.4527749, 14.609843, 14.7940406}</dd>
</dl>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100206/4f893402-ae4e-a658-3c3d-2f4243fc9c9b.png)

#検証したコード
Windows Forms アプリケーション（.NET Framework 4.7.2）で作成しています。

```C#:Form1.cs
using System;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        // textBox1 が、測定対象のテキストボックス
        public Form1()
        {
            InitializeComponent();
            textBox1.MaxLength = 0;
            textBox1.Multiline = true;
            textBox1.ScrollBars = ScrollBars.Both;
            textBox1.WordWrap = false; // or comment out
        }

        // 読み込みボタン (button1) 押下
        private void Button1_Click(object sender, EventArgs e)
        {
            var text = System.IO.File.ReadAllText(@"..<path>..\KEN_ALL.CSV", System.Text.Encoding.GetEncoding(932));
            var data = text + text + text;

            var stopWatch = new System.Diagnostics.Stopwatch();
            stopWatch.Start();
            textBox1.Text = data;
            Application.DoEvents();
            stopWatch.Stop();

            System.Windows.Forms.MessageBox.Show(stopWatch.Elapsed.ToString());
        }
    }
}

```

#おわりに
WordWrapプロパティをfalseにすることで、１行が横幅を超えると横スクロールが必要になってしまいますが、処理時間はかなり短縮されるので、ログ表示をしたりテキストエディタのようなアプリケーションでは検討に値すると思います。
Laravel datetime-localに値を反映する方法

mysqlから取得したdatetime型の値をそのまま`<input type='datetime-local'>`のvalueに代入しても反映されません。理由は形式が違うからです。

```
// var_dumpした結果

// mysqlから取得した値 datetime型
'2021-06-05 00:00:00'

// datetime-localに反映される値
'2021-06-05T00:00'
```

LaravelだとCarbonを使えば簡単に変換できます。

```
use Illuminate\Support\Carbon;
Carbon::parse('2021-06-05 00:00:00')->format('Y-m-d\TH:i');
```

これを知る前は自作関数を作ってTを挿入してました。
【typeof演算子】データ型を文字列として取得する際の書き方と注意点


以前、[NaNを使った条件分岐について](https://qiita.com/kouki-iwahara/items/8e1e16fb836fbb7a6859)という記事を書き、大変ありがたいことにコメント欄にてご指摘を頂けました。
勉強になりましたので、今回はコメントでいただきましたtypeof演算子について記述します。

#typeof演算子とは
与えられた変数、リテラルのデータ型を***文字列として取得できます。***
書式は次の通りです。

```typeof 値```
値: 数字、文字列、真偽型の値などが入ります。

サンプルコード

```javascript
let num = 1;
console.log(typeof num);  //結果: number

let str = 'おはよう';
console.log(typeof str);  //結果: string

let flag = false;
console.log(typeof flag);  //結果: boolean

let u =undefined;
console.log(typeof u);  //結果: undefined

```
条件分岐にも当てはめられます。

```javascript
let num = 1;
if(typeof num === 'number';) { //numが数値型の場合true
//実行したい処理
}
```
##注意点
ただ、typeof演算子で識別できるのは、文字列、数値、真偽値の様な基本データ型に限定されます。
配列や日付、正規表現,null等は、一様に「object」として見なされます。

また、文字列、数値、真偽値をラッパーオブジェクトとして宣言した時も同様に「object」として見なされます。
(少し話は逸れますが、真偽型はBooleanコンストラクターで生成することもできますが、挙動に誤解を招く恐れがある為、原則として使用しません)

サンプルコード

```javascript
let ary = ['javascript', 'Vue.js', 'typescript'];
console.log(typeof ary);  //結果: object

let obj = {a: 100, b: 200}
console.log(typeof obj);  //結果: object

let ex = /d(b+)d/g;
console.log(typeof ex);  //結果: object

let flag2 = new Boolean(false);
console.log(typeof flag2);  //結果: object

```
以上です。

補足や訂正などありましたら、ぜひご教授いただければ嬉しいです。
最後まで見ていただきありがとうございます。
Go言語で発生する「sql: Scan error on column index」の捌き方

# エラー発生
```
sql: Scan error on column index 7, name "cfn_stack_name": unsupported Scan, storing driver.Value type <nil> into type *string
```

Go言語でプログラミングで
DBにアクセスする処理を記述していると
上記のエラーに遭遇する事がある。

多くの原因はSQLのSELECT結果でカラムからNULLが取得され、
Go言語のstring型がNULLに対応していない事が原因です。

# 対応方法
調査したところ下記のような対応方法がありました。
https://qiita.com/kotamat/items/e6dd5806e52939d28043
https://qiita.com/kkam0907/items/f23efade4b7fbadebb5a

# 別解
Go言語内の実装で対応しても良いのですが、
手っ取り早くSQLでNULLを取得する可能性があるカラムを
IFNULL関数で空文字に変換する方法もあります。

```:example
SELECT ID,IFNULL(UserName,'') FROM User_Table
```
上記の例ではUserNameのカラムがNULLを返す可能性がある為、
IFNULL関数を使用してNULLを空文字に変換しています。
空文字であればGo言語のstring型は対応しています。

MySQLの場合はIFNULLだが
PostgreSqlの場合はCOALESCE
Oracleの場合はNVL
など微妙に使い方が違う点に注意

[参照]
https://yamasakimasaki.com/blog/121.html
VsCodeのスニペットのススメ

# VsCodeのスニペットのススメ
最近、普段使いのエディタをVsCodeに切り替えたのですが、
スニペットを使ってみたら非常に便利でした。
これは手放せなくなりそうです。

## そもそもスニペットとは？
コードのよく使うパターン(定型的なクラス宣言だったりとか、ループ系コードだったりとか)を
貯めておいて簡単に入力できるようにしたものです。
単純な繰り返し作業がごく少ないコマンドやキー入力で済むため、
開発効率が高まります。

## スニペットをどうやって手に入れるのか

### Extentionとして導入する
VsCodeのMarketPlaceで検索すると大量に出てきます。
メジャーなフレームワークや言語のものならまずありますので、
これらを導入するだけでもかなり便利です。

### 自分で作る
ただ、世間一般に出回っているSnippetはやはり最大公約数的なものなので、
かゆいところに手が届かないこともあります。

そんな時は、スニペットを自作してしまうという手があります。
これが、中々手軽でかつ多機能です。

#### 自作の方法
``File > Preferences > User Snippets``から自作が可能です。
個人的には、``Ctrl+Shift+P``でコマンドパレットを開いてSnippetと打って出すのもアリです。

スニペットは、ファイルの拡張子ごとにjsonファイルに格納されます。
(手動てscopeを調整するGlobalのものもありますが)
jsonファイルを書き換えて保存すると、起動中のVSCodeに即反映されます。
(複数起動している場合でも再起動は不要です。便利。)

大体の書式は以下のような通り
(より詳しく知りたい場合は[公式ドキュメント](https://code.visualstudio.com/docs/editor/userdefinedsnippets)を参照してください)

```json

{
	"fetchPost":{//スニペットの名前
		"prefix":"fpost",//スニペットのprefix これだけ打ってctrl + Tabで呼び出せる
		"body":[//実際に出力される部分。文字列の配列で宣言
			"const resp = await fetch(${1:url},{",//$マークをつけた部分はプレースホルダ
			"\tmethod: 'POST',",//タブは\tに変換する必要アリ
            "\tcredentials: 'same-origin',",
            "\theaders: {",
            "\t\t\"Content-Type\": \"application/json; charset=utf-8\",",
            "\t},",
			"\tbody:JSON.stringify(${2:param})",
			"});",
			"if(!resp.ok){",
				"\t${3://handleError}",
				"\treturn;",
			"}",
			"const json = await resp.json();"
			],
	"description": "For fetch in post"//表示される説明文
	}
}

```

まず、Snippetの名前を付け、そこにJsonで設定を紐づけます。
とりあえず、prefix,body,description辺りをまず覚えましょう。
これだけでもかなり便利です。

#####　Tabストップとプレースホルダ
ボイラープレート的なコードであっても、その中に状況に応じた値を入力しなければいけないことがほとんどです。
そのための支援機能がTabストップとプレースホルダです。 タブストップは``$[順番を示す数値]``形式の文字列を
bodyの中に仕込んでいると、スニペットを挿入後その部分にカーソルが当たり、その状態でTabを押下すると
順番にカーソルが動いていきます。マウス操作やカーソル移動を伴わずに必要な値を連続的に入力できるのでかなり便利です。
プレースホルダは、タブストップ部分にデフォルト値を付ける機能です。``${[順番]:[デフォルト値]}``という形で利用します。

##### 組み込み変数
スニペットの中ではいくつか組み込み変数が利用できます。
例えば、以下のスニペットは選択した文字列を2出力します。

```json

	"duplicate":{
		"prefix":"dup",
		"body":[
			"${TM_SELECTED_TEXT}${TM_SELECTED_TEXT}"
		]
	}
```

現在選択中の文字列や、クリップボードの中身といったコーディング用っぽい変数のほかに、
ブロックコメントの先頭・末尾(おそらくコード中のコメント用)や
日付や時間といった議事録などに便利な項目まで色々そろっています。

###### 正規表現置換や大文字・小文字変換も出来る
さらに、変数の内容に対してjs標準の正規表現置換やupcase,downcase,capitalizeも出来ます。
ちょっとした文字列整形機能だったらスニペットで十分できてしまいそうです。

## まとめ
* スニペットはかなり手軽に作れます。
* 変数や置換まで使えるようになるとかなり夢が広がります。
サイズの大きなファイルを再帰的に検索する

ユーザーがファイルをアップした中に、サイズの大きなファイルを検索したいという場合があるとします。
例えば
`upload_file`
というディレクトリの下にユーザーID毎のディレクトリ
`upload_file/1`
`upload_file/2`
`upload_file/3`
があり、その下にユーザーがアップしたファイルがあるような場合です。

他の記事ではduコマンドを使った検索がよく見られますが、duコマンドを使うとディレクトリまで検索対象となりのますので、検索結果として最適ではありません。


ファイルのみ検索対象としたい場合は、以下のように`find`コマンドを使えば指定したディレクトリ以下、再帰的にファイルだけを対象として検索結果が表示されます。

```
$ find ./upload_file -size +5M -ls | head -10
```

上記は、upload_fileディレクトリ配下をファイルサイズが5M以上のファイルを10行以内で表示してくれます。

+5Mの部分を任意の数値に書き換えれば、どのようなサイズのファイルがアップされているかという調査が可能です。
#c言語でchar型からint型への変換(何桁でも可)

##経緯
c言語が学校で必要になったので学んでたら、charからintに変換するのにググってもいまいち出なかったのでメモ書き。

##方法
```c
atoi(文字列);
```
###例
```c
char str[]="1234";
printf("str*10=%d",atoi(str)*10); 
```
実行結果：

```c
str*10=12340
```

##ちょっとした感想
 検索した時に「-'0'」っていうのが真っ先に出て来たけど、atoiについてはあまり出てこなかった。c言語初心者だから詳しいことは分からないけど、atoiを使わない方が良い理由とかあるのかな。。

##追記
atoiは使わない方が良いことが分かりました。(コメントして下さった皆様有り難うございます)atoiではオーバーフロー、アンダーフローの検知が出来ないようです。その代わり、検知できる関数としてstrtolがあるようなので書いておこうと思います。

##方法(long型への変換なのでint型にしたい人は個々でキャストして下さい)
```c
strtol(文字列,変換終了した位置,基数);
```

###例
```c
char str[]="1234";
printf("str*10=%d",strtol(str,NULL,10)*10);
```
実行結果：

```c
str*10=12340
```
PythonでMad Libsを作ってみた。

##そもそもMad Libs とは　
簡単に説明すると、Mad Libsとはアメリカ発祥の言葉遊びである。

どのようにして遊ぶかというと、例えば、
「今日の天気は晴れだ。
とても嬉しい気持ちだ。
そうだ、今日は野球でもしよう。」
という物語があったとする。出題者はこの物語の内容を言わず、回答者に「名詞を一つ言って」と言う。その問いに対して回答者が、「じゃあキャスター付きの椅子にするわ。」と答えたとする。
どう変わるかというと、名詞の「天気」の部分が「キャスター付きの椅子」に変わり、
「今日のキャスター付きの椅子は晴れだ。」というわけのわからない文章になるのだ。
これを何度か繰り返し、文章をヘンテコにして楽しむのが Mad Libs というゲームである。

このサイトに面白い解説が記載されているので、併せて読んでみてください。

https://tsukaueigo.com/mad-libs/

##Mad Libsに少し設定を加えて作ってみる

```Qiita.rb
color = input("Enter a color: ")
noun1 = input("Enter a noun1: ")
noun2 = input("Enter a noun2: ")

print(color + "い色のバラが咲いている。")
print("その" + noun1 + "は、とても美しい。")
print("でも、" + noun2 + "が刺さったらおしまい。")

if noun2 == "とげ":
    print("Ouch! You are hurting!")
else:
    print("Continue this game!")
```

本来、Mad Libsに勝ち負けはないが、今回はバラ中心の物語にしたので、noun2に「とげ」というワードを代入してしまうと「とげが刺さって痛い」という設定を入れて、暗に負けということを示してみた。もちろん、noun2に「とげ」を入れなければそのままゲームを続行することができる。

##Mad Libs、楽しいですよ
今回は比較的短めのMad Libsを作りましたが、興味を持たれた方はぜひもっと長めのMad Libsを作ってみてください。その時は、きっと大人数でやるともっと楽しめますよ。
もちろん、プログラム上でなくとも紙面上でもできるので、ご心配なく。しかし、プログラム上だと様々な設定を付け加えられるので、もっと面白い（もしくは恐ろしい）Mad Libsが出来上がるかもしれませんが、、、
Golang - A Flux Architecture in Go

# goflux
> Callback is usually used between different objects' data transmission and it will cause callback hell. So, decoupling is must necessary and goflux can solve the problem.

## What is FLUX? See Here https://facebook.github.io/flux/

# Step 1. Install goflux.

````
go get github.com/shaching/goflux
``````

# Step 2. Construct go channels.
* The ***listener*** is must be ***chan \*Action*** type in your type struct.
* Notice: Remember implement ***Step 4.***
    
```golang
type earth struct {
    address   string
    listener  chan *goflux.Action
}

e := &earth{
    address:   "Earth",
    listener:  make(chan *goflux.Action),
}
```

```golang
type mars struct {
    address   string
    listener  chan *goflux.Action
}

m := &mars{
    address:   "Mars",
    listener:  make(chan *goflux.Action),
}
```

# Step 3. Create a action including below four parameters.
* name: action name.
* from: where action comes from.
* to: where action goes to.
* payload: data.

```golang
goflux.Send("ActionCall", "Earth", "Mars", "Hi", "Mom")
or
goflux.Send("ActionReCall", "Mars", "Earth", "Hello", "Dad")
```

# Step 4. Implement your flux store with goroutine listener func.
* Notice: Register listener inner goroutine func.
* Notice: You can filter action here.

```golang
go e.store() <-- Start goroutine.

func (e *earth) store() {
    goflux.Register(e.address, e.listener) <-- Register Flux.

    for {
        action, ok := <-e.listener
        
        if !ok {
            return
        }
        
        // action.Name().(string)        --> ActionReCall
        // action.From().(string)        --> Mars
        // action.To().(string)          --> Earth
        // action.Payload()[0].(string)  --> Hello
        // action.Payload()[1].(string)  --> Dad

        // you can handle received action here
    }
}
```

```golang
go m.store() <-- Start goroutine.

func (m *mars) store() {
    goflux.Register(m.address, m.listener) <-- Register Flux.
    
    for {
        action, ok := <-m.listener
        
        if !ok {
            return
        }
        
        // action.Name().(string)        --> ActionCall
        // action.From().(string)        --> Earth
        // action.To().(string)          --> Mars
        // action.Payload()[0].(string)  --> Hi
        // action.Payload()[1].(string)  --> Mom
        
        // you can handle received action here
    }
}
```

# Step 5. Also, unregister when you wan't use.
* Notice: DON'T manual close channel by yourself, goflux will automatic close it. 

```golang
goflux.UnRegister(e.address, e.listener)
or
goflux.UnRegister(m.address, m.listener)
```


https://github.com/shaching/goflux
WordPress (with GCP)から右下の邪魔なBitnamiのロゴを消す

# はじめに

- [1時間で出来る！最強のWordPress環境構築(永久無料)](https://qiita.com/ryuta69/items/dbb0db5cf7099b7a7cc4)

この記事を読んで自分もGCPでWordPressを構築してみました。
で、一通り作ったところ右下の

![bitnami.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272753/448a732b-101c-9e73-c051-39c8f77ab002.jpeg)

が邪魔だったのでこれを消す方法です。

## GCPコンソールからSSH接続

GCPはブラウザのコンソール上から、「Compute Engine＞VMインスタンス」のところにある「SSH」をクリックするだけで簡単に接続できます。
AWSなどと違ってこのあたりは簡単です。

![WS000000.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272753/17130c77-39b7-5f95-58e8-21ed1b5bd91b.jpeg)


## ロゴ消す設定を投入

ターミナルから以下を打ちます

```:SSH
$ sudo /opt/bitnami/apps/wordpress/bnconfig --disable_banner 1
```

## Nginxを再起動する

ターミナルから以下を打って、Nginxが再起動します。

```:SSH
$ sudo /opt/bitnami/ctlscript.sh restart nginx

Unmonitored nginx
/opt/bitnami/nginx/scripts/ctl.sh : Nginx stopped
/opt/bitnami/nginx/scripts/ctl.sh : Nginx started
Monitored nginx
```

ブラウザでWordPressのページをみて、右下のロゴが消えてることを確認してください。

## 参考にしたサイト

- [Bitnamiのロゴが邪魔！](https://qiita.com/MosamosaPoodle/items/24ae64627820e557790b)
- [【WordPress, AWS】ブログ右下に出るBitnamiのロゴを綺麗に消し去る方法](https://frontendlifeinde.com/2018/03/09/%E3%80%90wordpress-aws%E3%80%91%E3%83%96%E3%83%AD%E3%82%B0%E5%8F%B3%E4%B8%8B%E3%81%AB%E5%87%BA%E3%82%8Bbitnami%E3%81%AE%E3%83%AD%E3%82%B4%E3%82%92%E7%B6%BA%E9%BA%97%E3%81%AB%E6%B6%88%E3%81%97/)

これらの記事はAWSでApache再起動する手順になってました。
なのでこの記事を書きました。
TJBot zero 最近のアップデート　　2019/05/28

## このスライドはTJBot Fan 2019/05/28応用編で使用されました

---

## $ whoami
境川　章一郎
（さかいがわ　しょういちろう）

twitter: [l_s_s_l](http://twitter.com/l_s_s_l)
Qiita: @ssakaigawa 

時々インフラ屋。時々開発。

---
## おしごと
Pumpkin Heads株式会社

## コミュニティ活動
- TJBot Fan
- Blumix User Group (ibmcloudユーザー会)
- 2018-2019 IBM Cloud Champion
  
(MS MVPとか、AWS Blackbeltのような制度のIBM版、外部アドボケイトです）

---
## 著書

Docker+Kubernetesの本
コンテナ・オーケストレーション（黄色いコンテナ本）の７章でIBM Cloud Kubernetes Serviceの章を担当しました。
<img src="https://qiita-image-store.s3.amazonaws.com/0/126158/e290e35e-2e36-63dc-0ea4-edf384c3e92c.png" width="100">

---
## 寄稿1

月間I/O３月号 Node-RED UG記事
『「AWS IoT Button」を用いて「お知らせ機能」を作る』
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126158/36abdbba-da03-be20-6406-5e221a6d583e.png)

---
## 寄稿2
＠IT Special
IBMテクノロジーの“認定インフルエンサー”、「IBM Champions」からのメッセージ：
もっとスケーラブルなWordPress実装をKubernetesクラスター上にデプロイする

http://bit.ly/2YXEqiJ

---
## TJBotと私
* 2017/12、TJBotと出会う
* 2018/03、SIer IoT LTで発表
* 2018/12、IBM Cloud Community Summit 2018からハンズオン運営
    * 毎月ハンズオンさせていただいています。
    * tjbotfanユーザーグループ運営
    * tjbotfan github contributor
    * tjbotfan.tokyoドメインを勢いで取る
    
---
## TJBotアップデート
- 2019#1
    - IPアドレス通知機能
        - [ハンズオン会場で輪唱大会](https://twitter.com/l_s_s_l/status/1083955137020743681?s=20)
    - OpenJtalk対応
    - MAXノード対応(ImageCaption generator)
- 2019#3- 
    - Raspberry piへのSSH時に<br>イメージバージョン表示
    - 匠の抵抗キット登場
- 2019#4-
    - ボタンスイッチで<br>IPアドレス確認・シャットダウン機能

---
## TJBotアップデート
- 2019#1
    - IPアドレス通知機能
        - [ハンズオン会場で輪唱大会](https://twitter.com/l_s_s_l/status/1083955137020743681?s=20)
    - OpenJtalk対応
    - MAXノード対応(ImageCaption generator)
- 2019#3- 
    - Raspberry piへのSSH時に<br>イメージバージョン表示
    - 匠の抵抗キット登場
- 2019#4-
    - ボタンスイッチで<br>IPアドレス確認・シャットダウン機能

---
## 展望

- 音声認識のハンズオン部分のイメージ化
- Watson Assistant連携のハンズオンをしたい

---
#ありがとうございました
Pythonで複数行のHTMLを書く際のformat関数の使い方

[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしている山田です。

Pythonについて学習のアウトプットとして投稿します。

プログラミング初心者であるため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正するのでどんどん指摘してください。

#format関数とは

format関数は、Pyhonで変数の文字列への埋め込みに使われます。
変数を任意の文字列とともに出力したいときなどに使用します。
構文は以下の通りです。

```
'任意の文字列{}任意の文字列'.format{変数}
```

例えば、勉強時間を計算する際は以下のようになります。

```
english  = 20 
science = 30
total = english + science

 print('勉強時間の合計：{}分'.format(total)) 
```

出力されるものとしては以下のようになります。

```
勉強時間の合計：50分
```


#pythonで複数行のHTMLを書く際のformat関数

webでエントリーフォームなどを作る際には、print関数の中に複数行のHTMLを書く方がやりやすい場合があります。
このような場合のformat関数についてご紹介します。
ここでは、自分のプロフィールについて送信前に確認する際を想定しています。

```confirm.py

age=20
height=170
weight=60

print("Content-type: text/html; charset=utf-8")

print(
    """
    <html lang="ja">
    <head>
           <meta http-equiv=\"Content-Type\" content=\ "text/html
           charset=UTF-8\" / >
       </head>
    <body>
    
    年齢:{0}、身長:{1}、体重:{2}でよろしいですか？
    <a href="input.py">修正</a>
    <a href="complete.py">送信</a>
    </body>
    </html>
    """
    .format(age,height,weight)
)

```

#注意点
.format以下は、Pythonの関数の一部であるため、あくまでも「"""」で囲まれた範囲の外側に書かなければならないことに注意しましょう。
Denite バージョンアップ対応

Deniteのバージョンをあげたら動かなくなったので対応を書き留めます。
適宜追加していきます

### エラーで全く動かなくなる

`NameError: Source "-cursor-wrap=true" is not found.`
こんなエラーですね。

`-cursor-wrap=true`が[使えなくなっていた](https://github.com/Shougo/denite.nvim/commit/af5284c75917f721af95f93e5191f5420f5999e7
)ので、削除しました。

```diff
nnoremap <silent> [denite]f :<C-u>DeniteBufferDir
-      \  -cursor-wrap=true -direction=topleft file file:new<CR>
+      \ -direction=topleft file file:new<CR>
```

### 旧Deniteに動きを近づける

`DeniteBufferDir file`の時の動きを変更
Filterをかけている時のマップを追加

```vim:.vimrc
augroup denite_filter
  autocmd!
  autocmd FileType denite-filter call s:denite_filter_settings()
  function! s:denite_filter_settings() abort
    " <C-n>でファイラーのカーソルが動くようにする
    imap <silent><buffer> <C-n> <Plug>(denite_filter_quit)<DOWN>
    imap <silent><buffer> <C-p> <Plug>(denite_filter_quit)<UP>
    " <CR>でカーソルのあるファイルorディレクトリを開く
    imap <silent><buffer> <CR> <Plug>(denite_filter_quit)<CR>
  endfunction
augroup END

```
俺もgolangでゴルーチン触ってみたい！！

そもそもゴルーチンってなんやねんって話から
##goroutine##
並列処理してくれるやつ

使おうと思えば簡単に使えるけど
使いこなすってなると難しそうなやつ。

##やっていこう##
~~~Go
package main

import (
	"time"
	"fmt"
)

func goroutine1(){
	for i:=0;i<5;i++ {
		time.Sleep(time.Millisecond);
		fmt.Print("goroutine");
	}
}

func goroutine2(){
	for i:=0;i<5;i++ {
		time.Sleep(time.Millisecond);
		fmt.Print("now");
	}
}

func main(){
	go goroutine1();
	goroutine2();
}
~~~
###main関数から###
並列処理させたいやつの関数の前に ``go``を書けばやってくれる
なんとまぁ簡単なことでしょう
ちなみに表示はこんな感じになる

```go:goroutine.go
now
goroutine
now
goroutine
goroutine
now
now
goroutine
goroutine
now
```
こんな感じになる

ここで_goroutine1_の **time.Sleep(time.Millisecond)**のtimeの前に100をかける
その後実行してみると面白いことが起きる

```go:goroutine.go
now
now
now
now
now
```
###goroutineが消えた・・・###
**なぜ消えたのか**
並列処理のためにgoroutine1用のスレッドを生成する。
その後はスレッド内でgoroutine1を実行するので
main関数はgoroutine1のことを無視してgoroutine2へ
goroutine2は1msのスリープなので先に終了してしまう。
mainはgoroutine1がいたことなんて覚えてないのでこの結果になる。

##次回予告##
仲間はずれのgoroutine1を助けるにはどうしたらいいのか・・・
[第二弾](https://qiita.com/besood/items/fe48f295c2e1816f5a14)
【Capybara】System Specでsessionのテストをする方法


##環境
RSpec 3.8
capybara (2.16.1) 
selenium-webdriver (3.8.0)

##設定
```spec/support/inject_session.rb 
module InjectSession
  def inject_session(hash)
    Warden.on_next_request do |proxy|
      hash.each do |key, value|
        proxy.raw_session[key] = value
      end
    end
  end
end
```


```spec/rails_helper.rb 

config.include InjectSession, type: :system 
```

これで設定は完了。
あとは、先ほど定義した`inject_session`を使って任意の値を入れるイメージです。

```spec/system/users_spec.rb
subject { visit user_path }
session = { users: { name: "taro", age: 20 } }

context "sessionがある場合" do
  let(:session) { { users: { name: "taro", age: 20 } } }
  before do
    inject_session session
    subject
  end
  .....
end

context "sessionがない場合" do
  let(:session) {}
  before do
    inject_session session
    subject
  end
  ......
end
```

参考: https://stackoverflow.com/questions/8546839/how-do-i-set-up-a-session-value-in-capybara
「実数列の和」の極限 = 「実数列の極限」の和 

#命題
実数列$\\{a_n \\}, \\{b_n \\}$の極限がそれぞれ$\lim_{n \to \infty} a_n=\alpha,\lim_{n \to \infty} b_n=\beta$ならば、

```math
\begin{align}
\lim_{n \to \infty} (a_n + b_n) = \alpha + \beta
\end{align}
```
である。


#証明
$\\{a_n \\}, \\{b_n \\}$の極限がそれぞれ$\alpha, \beta$であることから、${}^\forall \epsilon/2 > 0$に対して以下の命題が成り立つ。

```math
{}^\exists N_1 \in \mathbb{N}, {}^\forall n > N_1, |a_n - \alpha | < \epsilon/2 \\
{}^\exists N_2 \in \mathbb{N}, {}^\forall n > N_2, |b_n - \beta | < \epsilon/2
```
ここで、$N = \max \\{ N_1, N_2\\}$とすると、上記の命題と三角不等式により、${}^\forall n > N$に対して以下の命題が成り立つ。

```math
 |(a_n - \alpha) + (b_n - \beta)| \leq |a_n - \alpha| + | b_n - \beta| < \epsilon/2 + \epsilon/2 = \epsilon
```
すなわち、

```math
{}^\forall n > N, |(a_n + b_n) - (\alpha + \beta)| < \epsilon
```
が成り立つ。以上のことをまとめると以下の命題が成り立つということが示された。

```math
{}^\forall \epsilon > 0,{}^\exists N \in \mathbb{N}, {}^\forall n > N, |(a_n + b_n) - (\alpha + \beta)| < \epsilon 
```
つまり、$\lim_{n \to \infty} a_n=\alpha, \lim_{n \to \infty} b_n=\beta$ならば、

```math
\begin{align}
\lim_{n \to \infty} (a_n + b_n) = \alpha + \beta
\end{align}
```
である。
stickyfilljs を使おうとしたら TypeScript に怒られて dom.iterable の存在を初めて知る



スクロールに追従してくれる便利プロパティ `position: sticky` 。これを IE11 でも使えるように [wilddeer/stickyfill](https://github.com/wilddeer/stickyfill) をインストールしました。

README の通りにやってみる。

```javascript:sample.ts
import * as Stickyfill from 'stickyfilljs'
const elements: NodeListOf<HTMLElement> = document.querySelectorAll('.sticky');
Stickyfill.add(elements);
```

するとこんなエラーが出てきます。

```
Argument of type 'NodeListOf<HTMLElement>' is not assignable to parameter of type 'SingleOrMany<HTMLElement>'.
  Property '[Symbol.iterator]' is missing in type 'NodeListOf<HTMLElement>' but required in type 'Iterable<HTMLElement>'.ts(2345)
```

え？NodeList は Iterable じゃない…？ for 文とか普通に回せると思うんだけど…。

色々調べて識者にも聞いてやっとわかったのは、stickyfill の仕様ではなく TypeScript のコンパイルオプションが足らなかったのが原因だった模様。

tsconfig.json の `lib` の項目に `dom.iterable` を追加しないと正しくコンパイルしてくれないっぽい。マジはまったわ。

```json:tsconfig.json
{
  "compilerOptions": {
    "lib": ["es6", "dom", "dom.iterable"]
    },
  }
}
```

同じような現象に遭遇した方の参考になれば…。

### 参考文献

- https://www.typescriptlang.org/docs/handbook/compiler-options.html
- https://github.com/wilddeer/stickyfill
【Laravel】親を削除したら孫まで削除する

この記事は移行しました！[最新の内容はこちら](https://naoqoo2.github.io/blog/Laravel-%E8%A6%AA%E3%82%92%E5%89%8A%E9%99%A4%E3%81%97%E3%81%9F%E3%82%89%E5%AD%AB%E3%81%BE%E3%81%A7%E5%89%8A%E9%99%A4%E3%81%99%E3%82%8B/)をご覧ください😀

## 課題

Eloquentで
親（Parent） - 子（Child） - 孫（Grandchild）のリレーションがあるとき、
親を削除したら子と孫も削除したい。

## 準備

### 親と子にモデルイベントを定義しておく

親を削除したら子が削除されるように親モデルにdeletingを定義。

```php:Parent.php
protected static function boot() 
{
    parent::boot();
    static::deleting(function($model) {
        foreach ($model->$children()->get() as $child) {
            $child->delete();
        }
    });
}
```


子を削除したら孫が削除されるように子モデルにdeletingを定義。

```php:Child.php
protected static function boot() 
{
    parent::boot();
    static::deleting(function($model) {
        foreach ($model->$grandchildren()->get() as $child) {
            $child->delete();
        }
    });
}
```

## 実行

### 親を削除

```php
$parents = Parents::where('xxx', true)->get();
foreach ($parents as $parent) {
    $parent->delete();
}
```

※クエリによる一括削除ではモデルイベントを発行しないため、getして一つずつ削除する必要がある


## 改善したいこと

```
foreach ($model->$children()->get() as $child) {

↓

foreach (['children', 'children2', 'children3'] as $relation) {
    foreach ($model->$relation()->get() as $child) {
```

にすれば子が複数の場合も対応できるのだけど、いっそ`['children', 'children2', 'children3']`を動的に取りたい。

hasOneとhasManyの定義を取得する方法あるのかな？（※belongsToは子側なので削除しちゃダメ）
【javascript】ボタンを押してコンテンツを切り替えるシンプルなやり方


タブ切り替えに近いですが、ボタンを押してコンテンツ表示を変えたいことは多いなと思ったので、メモとして残しておきます。
素のjsなので、jqueryやbootstrapが嫌という方はどうぞテンプレとして使ってあげてください。

##デモ

<p class="codepen" data-height="265" data-theme-id="0" data-default-tab="js,result" data-user="ngron" data-slug-hash="RmOJzB" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="RmOJzB">
  <span>See the Pen <a href="https://codepen.io/ngron/pen/RmOJzB/">
  RmOJzB</a> by reon.negi (<a href="https://codepen.io/ngron">@ngron</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

##コードの中身

```css
#pending-content, #done-content {
  display: none;
}

#pending-button.active, #done-button.active{
  color: blue;
  background-color: orange;
}

#pending-content.active, #done-content.active {
  display: block;
}
```

```js

let $pending_button = document.getElementById("pending-button");
let $done_button = document.getElementById("done-button");
let $pending_content = document.getElementById("pending-content");
let $done_content = document.getElementById("done-content");

reset_styles = function() {
  $pending_button.classList.remove("active");
  $done_button.classList.remove("active");
  $pending_content.classList.remove("active");
  $done_content.classList.remove("active");
};

$pending_button.addEventListener("click", function() {
  reset_styles();
  if (this.classList.toggle("active")) {
    $pending_content.classList.toggle("active");
  }
})
$done_button.addEventListener("click", function() {
  reset_styles();
  if (this.classList.toggle("active")) {
    $done_content.classList.toggle("active");
  }
});

  // デフォルトで未完了のみ表示
$pending_content.classList.toggle("active");
$pending_button.classList.toggle("active")
```

##toggleを使いたくない場合。

```index.html
<button id="done-button">完了</button>
<button id="pending-button">未完了</button>

<div id="done-content">
  <li>完了 1</li>
  <li>完了 2</li>
  <li>完了 3</li>
</div>
<div id="pending-content">
  <li>未完了 1</li>
  <li>未完了 2</li>
  <li>未完了 3</li>
</div>
```

```main.js
let $pending_button = document.getElementById("pending-button");
let $done_button = document.getElementById("done-button");
let $pending_content = document.getElementById("pending-content");
let $done_content = document.getElementById("done-content");

reset_styles = function() {
  $pending_button.style.color = "";
  $done_button.style.color = "";
  $pending_content.style.display = "none";
  $done_content.style.display = "none";
};

change_style = function(button, item) {
  button.style.color = "blue";
  item.style.display = "block";
};

$pending_button.addEventListener("click", function() {
  reset_styles();
  change_style(this, $pending_content);
});

$done_button.addEventListener("click", function() {
  reset_styles();
  change_style(this, $done_content);
});

// デフォルトで未完了のみ表示
change_style($pending_button, $pending_content);
```
Pythonで処理時間計測

[この記事](https://www.st-hakky-blog.com/entry/2018/01/26/214255)を参考にさせていただきました。

ループを回す系の処理で、速度が遅い場合の時間計測をどうするんだったけかなとすぐ忘れてしまうので。

``` python
import time
start = time.time()
print("1: {}".format(time.time() - start))
# smt
print("2: {}".format(time.time() - start))
```
[2019年6月] App Storeレビューガイドラインのアップデート

2019年6月3日に [App Storeレビューガイドラインのアップデート](https://developer.apple.com/news/?id=06032019j) が発表されました。

詳細は [App Store Review Guidelines](https://developer.apple.com/app-store/review/guidelines/) で確認 [^1] するとして、ひとまず概要をざっと把握したい方のために、上記の発表内容を日本語訳 [^2] してみました。


# App Storeレビューガイドラインのアップデート （2019年6月3日）

App Storeは、すべてのユーザーにとっての最良のストア体験のために尽力します。
安全なユーザー体験を提供し続け、また開発者を成功に導く良質な機会のため、我々はApp Storeのレビューガイドラインをアップデートする必要があります。

以下に挙げる最新アップデートの要約をよく読み、[App Store Review Guidelines](https://developer.apple.com/app-store/review/guidelines/) でその詳細を確認してください。


**Guidelines 1.3 and 5.1.4.** 子供のデータをプライベートな状態に保つため、キッズカテゴリーのアプリ、また子供の利用を意図したアプリは、サードパーティーの広告やアナリティクスソフトウェアを含んだり、サードパーティーにデータを送信してはいけません。

**Guideline 4.7.** アプリ内で提供されるHTML5ゲームは、現実の通貨を扱うゲーム、くじ、及び慈善的寄付を提供したり、電子商取引をサポートしてはいけません。
この機能はバイナリーに埋め込まれたコードにのみ適しており、Appleがレビュー可能です。現在このガイドラインは新しいアプリに適用されます。既存のアプリは2019年9月3日までにこのガイドラインに従わなければなりません。

**Guideline 5.4.** VPNは機密情報へのアクセスを提供するため、VPNアプリはサードパーティーに対して理由の如何を問わず、いかなるデータも販売・使用・公開することはできず、そのことをプライバシーポリシーに明記しなければなりません。
承認されたプロバイダーによる、ペアレンタル・コントロールやコンテンツブロッカー、セキュリティーなどのアプリは [NEVPNManager API](https://developer.apple.com/documentation/networkextension/nevpnmanager) を使用するかもしれません。

**Guideline 5.5. (New)** MDM [^3] は機密情報へのアクセスを提供するため、MDMアプリはモバイルデバイス管理機能を要求する必要があります。
また、企業組織、教育機関、政府機関などの民間組織、そしてMDMをペアレンタルコントロールのために利用している企業によってのみ提供される場合があります。

**Guideline 5.1.3(i).** アプリがユーザーの利益（保険料の削減など）のために提供され、データがサードパーティーと共有されない場合にかぎり、そのアプリは健康やフィットネスに関するデータを使用することができます。
開発者は、デバイスから特定の健康データが収集されることをユーザーに明示しなければなりません。

**Guideline 5.1.1(vii) (New).** ユーザーから直接でない、またユーザーの明示的な同意なしに情報（たとえ公開データベースであろうと）を収集するアプリはApp Storeでは許可されません。

**Guideline 5.1.1(i).** データが収集時または収集直後に匿名と見なされている場合においても、アプリはデータ収集の同意を得なければなりません。

**Guideline 1.1.3.** アプリで弾薬類の購入を手助けしてはいけません。

**Guideline 4.2.7.** リモートデスクトップクライアントには現在、ユーザーの所有するゲーム機が含まれています。それらのクライアント上に表示されるソフトウェアは、ホストデバイス上で完全に実行される必要があります。

アプリの機能に関するデモ用のビデオが、特定の地域に利用を制限されたり、その他の方法で制限されることは許可されません。

この夏、 [Sign In with Apple](https://developer.apple.com/sign-in-with-apple/) のベータ版が利用できるようになります。
今年後半に正式版がリリースされると、Sign In with Apple は、サードパーティーによるサインイン機能をサポートしたアプリのユーザーに対する必須のオプションとして提供されます。


[^1]: 本記事執筆時点で、日本語版の[App Store Reviewガイドライン](https://developer.apple.com/jp/app-store/review/guidelines/)が `最終更新日：2018年12月19日` となっています
[^2]: 一部不自然な表現や意訳も入っていますので、正確で完全な内容については [App Store Review Guidelines](https://developer.apple.com/app-store/review/guidelines/) を参照してください
[^3]: Mobile Device Management（モバイルデバイス管理）
再帰関数を末尾再帰にする方法


再帰関数を書くときにはスタックコールが積まれないように
末尾再帰になっているかどうか注意する必要があります。

Rubyで末尾再帰になってない、
配列の要素数を数えるmy_lengthを実装すると

```ruby
def my_length(array)
  if array[0].present?
    1 + my_length(array[1..-1])
  else
    0
  end
end
```
```
my_length([2,3,4,5])
=> 4
```

になります。



この場合再帰関数を呼び出す前に1を加算してるため、
スタックコールが積まれてしまいます。

末尾再帰にするためには、アキュムレーターを使い

```ruby
def my_length(array, accum)
  if array[0].present?
    my_length(array[1..-1], (accum + 1))
  else
    return accum
  end
end
```

```
my_length([2,3,4,5], 0)
=> 4
```

にすることで末尾再帰関数になります。
ネットワークインターフェースってなに？

#ネットワークインターフェース
> #####IPアドレスはNICに設定される
IPアドレスは「ホスト」に対してではなく、NIC（ネットワークインターフェースカード）ごとに割り当てられる。
通常は1NIC-1IPアドレスになるが、1つのNICに複数のIPアドレスを割り当てることが可能だったり、複数のNICを備える機器（ルータなど）が存在する。


引用元 https://qiita.com/mogulla3/items/efb4c9328d82d24d98e6

ネットワーク通信に必要なインターフェース。
AWS上でENI(Elastic Network Insterface)に値するもの。
物理的なハードウェアでは、NIC(ネットワークインターフェースカード)というカード型の拡張装置を用いる。
ホストに対してネットワークインターフェースをアタッチすることで、IPアドレスを割り当てることが可能になる。
[adonis.js] Modelにgetterを追加するときにasyncを使う方法


出力するjsonにテーブルにない項目を追加したいとき、Modelにgetterを追加することになります。([参考](https://adonisjs.com/docs/4.1/database-getters-setters))

しかし、getter内でasyncを使いたい時(例えば別のテーブルから値を参照したい時)、上記の方法では出来ないのでhookを使うことになります。

hookを使った方法のサンプルがなかったので記事として残しておきます。

# 前提

- adonis.js 4.1

# サンプルコード

Modelはすでに作ってあるとします。

次にHookを作成します。

```bash
adonis make:hook PostHook
```

Hookは `/app/Models/Hooks` に作られます。

次に Hook を編集します。

```js:/app/Models/Hooks/PostHook.js
'use strict'

const Code = use('App/Models/Code') // コードマスタ

const PostHook = exports = module.exports = {}

PostHook.computedFields = async (modelInstance) => {
  if (Array.isArray(modelInstance)) {
    modelInstance = await Promise.all(computedFields.map(bindCodeNames))
  } else {
    modelInstance = await computedFields(modelInstance)
  }
}

async function computedFields(model) {
  // ここで追加したいFieldを代入していく
  model.status_name = await Code.get('status', model.status)

  return model
}
```

最後にModel側に追記します。

```js:/app/Models/Post
'use strict'
const Model = use('Model')

class Post extends Model {
  static boot() {
    super.boot()

    // 以下3つを追加
    this.addHook('afterFind', 'PostHook.computedFields')
    this.addHook('afterFetch', 'PostHook.computedFields')
    this.addHook('afterPaginate', 'PostHook.computedFields')
  }
}
```

# 動作サンプル

```js:start/routes.js
const Post = use('App/Models/Post')

Route.get('post/:id', ({params, response}) => {
  const post = Post.findOrFail(params.id)
  return response.send(post) // { ..., status: 1, status_name: '公開' }
})
```

---

# 追記 2019.06.11

この方法でgetterを追加した場合、更新時（ `save()` 時)、追加したgetterの名前のカラムが無いとSQLでエラーを吐かれます。そのため、更新時に要素を削除するという処理を入れる必要が出てきます。

以下、処理の例です。

```js:/app/Models/Hooks/PostHook.js
// 追加
PostHook.removeComputedFields = (modelInstance) => {
  modelInstance = removeComputedFields(modelInstance)
}

function removeComputedFields(model) {
  delete model.$attributes.status_name

  return model
}
```

```js:/app/Models/Post.js
class Post extends Model {
  static boot() {
    super.boot()

    this.addHook('afterFind', 'PostHook.computedFields')
    this.addHook('afterFetch', 'PostHook.computedFields')
    this.addHook('afterPaginate', 'PostHook.computedFields')

    // 追加
    this.addHook('beforeUpdate', 'PostHook.removeComputedFields')
  }
}
```

`delete`で無理やりプロパティを消してるので、なんか他にいい方法無いのかなと思うのですが調べても出てこない感じでした……。

---

[adonis.js](https://adonisjs.com/)はJavascript(Node.js)製のWebフレームワーク。laravelに似ており全てをjavascriptで書くことができます。
日本でも広まれー！
【Django】pytzのtimezone 名一覧のプルダウンメニューを作る

#環境
Django 1.11
python 3.6.6

#こういうやつ

Djangoでタイムゾーン名を入力させるフォームを作りたかったので,
pytzのtimezone一覧のプルダウンメニューを作成した.
![スクリーンショット 2019-06-05 16.53.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421268/75491a39-64e3-454d-ee92-4399e83bb642.png)


#手順

timezone一覧のリストをつくって, viewからtemplateに投げてあげればOK.






```services.py
import pytz

def timezoneList():
    timezone_list = pytz.common_timezones
    return timezone_list
```

```views.py

from XXX.services import *

class TestPage(LoginRequiredMixin,TemplateView): #()内はよしなに
    def get(self,request):
    ...
        timezones = timezoneList()

        context = {
        ...,
        'timezones':timezones,
        }

        render (request,'test.html',context)
```

<　select　>タグ内に以下のように書いた.

```test.html

{% for timezone in timezones %}
<option value ='{{ timezone }}' > {{ timezone }} </option>
{% endfor %}
```

更新してあげると出来てた.　やったね!

#補足

ChoiceFieldを使う方法（こっちの方が多分楽）
https://stackoverflow.com/questions/10578440/how-to-add-drop-down-list-for-timezone-using-python-tz-at-user-registration-page
Magic Leap MagicScript Landscape Application. threejs (WebGL) Simple Box

Prepare
Magic Leap One (Lumin OS v0.96.0)
https://www.magicleap.com/magic-leap-one

mlsdk v.0.21.0
https://creator.magicleap.com/downloads/lumin-sdk/overview

magic-script-cli v2.1.1
https://www.npmjs.com/package/magic-script-cli

magic-script-polyfills v2.2.0
https://www.npmjs.com/package/magic-script-polyfills

MagicScript WebGL PrismController v2.1.0
https://www.npmjs.com/package/magic-script-webgl-prism-controller

threejs v0.105.2
https://www.npmjs.com/package/three

**Create Project**

```sh
magic-script init
? What is the name of your application? threejs simple box
? What is the app ID of your application? org.magicscript.threejs
? In which folder do you want to save this project? my-threejs-box
? Do you want a Landscape App? Yes
? What are your device targets?
>(*) Magic Leap
 ( ) iOS
 ( ) Android
cd my-threejs-box
```
**Install**

```sh
npm i magic-script-webgl-prism-controller
npm i three
```

**Code**

Change app.js

```jsx
import { LandscapeApp } from 'lumin';
import { WebGlController } from 'magic-script-webgl-prism-controller';
import {
  Mesh, 
  MeshNormalMaterial, 
  PerspectiveCamera, 
  Scene, 
  WebGLRenderer,
  BoxGeometry
} from 'three';

export class App extends LandscapeApp {
  
  onAppStart () {
    let prism = this.requestNewPrism([1.0, 1.0, 0.05]);
    let controller = window.controller = new WebGlController();
    prism.setPrismController(controller); 
  }

  updateLoop(delta) {
    return true;
  }
}

window.onload = () =>{
  const scene = new Scene();
  const camera = new PerspectiveCamera(
    75, 
    window.innerWidth / window.innerHeight, 
    0.1,
    1000
  );
  camera.position.z = 4;

  const renderer = new WebGLRenderer({antialias: true});
  renderer.setClearColor('#000000');
  renderer.setSize(window.innerWidth, window.innerHeight);

  document.body.appendChild(renderer.domElement);

  const geometry = new BoxGeometry(2.5, 2.5, 2.5);
  const material = new MeshNormalMaterial();
  const cube = new Mesh(geometry, material);

  scene.add(cube);
  return window.requestAnimationFrame(render);

  function render(time)
  {
      window.requestAnimationFrame(render);
      cube.rotation.x = time / 1000;
      cube.rotation.y = time / 1200;
      renderer.render(scene, camera);
  }
};

```

**Build**

```sh
magic-script build -i
```

**Run**

```sh
magic-script run --port=10000
```

**Reference**

magic-script-samples/future-gl-bookofshaders (Github)
https://github.com/magic-script/magic-script-samples/tree/future-gl-bookofshaders/

magicscript
https://www.magicscript.org/

Thanks!
protectedメソッドを無名クラスでOverrideしてスタブ化

単体テストの際、テストしたいメソッドがprotectedメソッドを呼んでいるのだけど、そのprotectedメソッドが解読困難（古代遺産）でテストケースの実装が厳しい、ということがありました。

そこで、そのprotectedメソッドを無名クラスでOverrideしてスタブ化することを思いつきました。

JUnitは4を使用しました。

```
<dependency>
　　<groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
</dependency>
```

`Target.java`

```
public class Target {

  // テストしたいメソッド
  public int wantTesting(int x) {
    return getNum(x);
  }

  // テストしたいメソッドで呼ばれているprotectedメソッド
  protected int getNum(int x) {
    return x + 100;
  }

}
```

`TargetTest.java`

```
import org.junit.Assert;
import org.junit.Test;

public class TargetTest {

  @Test
  public void testWantTesting() {

    Target target = new Target();
    Assert.assertEquals(101, target.wantTesting(1));

    Target target2 = new Target() {

      @Override
      protected int getNum(int x) {
        return 9999;
      }

    };

    Assert.assertEquals(9999, target2.wantTesting(1));
  }

}
```
Ubuntu1804にMinikubeをインストールする

# 概要
自由に遊べるKubernetesが欲しかった。
Minikubeくん🐳にする。
クラウドでVMをたててその上にMinikubeくん🐳を動かす。
OSはUbuntuさんを選択。


# 方法
基本は本家Kubernetes.ioの言われるがままやればOK。

注意点は2コアのUbuntuさんにすること。
Minikubeくん🐳のインストール時にいろいろ言われる。

流れは、
1. kubectlをインストール（Kubernetesを動かすコマンドライン）
2. Dockerをインストール（その上にMinikubeくん🐳を動かす）*
3. Minikubeくん🐳インストール

*Minikubeくん🐳はデフォルトでVirtualBoxをUbuntuさんのうえに構築して立ち上がろうとする。
VirtualBoxも大変そうなのでDockerでご勘弁いただく。
minikube startのときもオプションで--vm-driver=noneを入れて起動する



```
sudo snap install kubectl --classic
kubectl version



### dockerのインストール
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl gnupg-agent software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io
sudo docker run hello-world




### Minikubeのインストール
curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
chmod +x minikube
sudo cp minikube /usr/local/bin
sudo minikube start --vm-driver=none



### kubectlとminikubeをsudoなしで動かせるようにする
sudo chown -R $USER:$GROUP ~/.kube
sudo chown -R $USER:$GROUP ~/.minikube
```

以上。
振り返ってみればカンタン。

ステータスを見てRunningになってるのを確認する。

```
root@container-01:~# minikube status

host: Running
kubelet: Running
apiserver: Running
kubectl: Correctly Configured: pointing to minikube-vm at <your IP>
```

いけてそう。

```
root@container-01:~# kubectl get nodes
NAME       STATUS   ROLES    AGE   VERSION
minikube   Ready    master   22h   v1.14.2
```


Ubuntuさん、Minikubeくん🐳、あざっした。


# 参考
https://kubernetes.io/docs/tasks/tools/install-minikube/
stdoutとstderrをそれぞれ別々にteeする方法

備忘録。

## 経緯

- bashスクリプトのログを後で確認しやすいよう `stdout` と `stderr` に分けて出力したい
- 実装の時の動作確認では直接実行するので、両方ともコンソールで確認したい

という時に使える小ネタ。

## 方法

`>(...)` の記法(process substitutionと言うらしい)を用いてそれぞれの出力を別プロセス上でteeしてファイルと出力元に書き戻す。

```bash
$ some-script.sh 1> >(tee out.log >&1) 2> >(tee err.log >&2)
```




----

## 参考

- [stackoverflow - How do I write stderr to a file while using “tee” with a pipe?
](https://stackoverflow.com/questions/692000/how-do-i-write-stderr-to-a-file-while-using-tee-with-a-pipe)
データを16進ダンプする

# 前提
- C# 6
- staticクラス内で定義しない(拡張メソッドにしない)場合は、第1引数の`this`を取ってください。

# できること
- byte配列を渡すと、16進ダンプした文字列を返します。

# コード

```cs:
/// <summary>データを16進ダンプする</summary>
public static string Dump (this byte [] data, int width = 16, string separator = " ") {
	var str = new List<string> { };
	for (var i = 0; i < data.Length; i++) {
		str.Add ($"{((i <= 0) ? "" : ((width > 0 && i % width == 0) ? "\n" : separator))}{data [i].ToString ("X2")}");
	}
	return str.Join ("");
}
```

# 使い方
```cs:
byte [] data;
// ～
Debug.Log (data.Dump ());
```
- `width`に`0`を渡すと、折り返しません。
フリック方向の判定 (unity)

# 前提
- unity 2017.4、2018.4

# できること
- 二点の変位から上下左右を判定して返します。  

# コード
```cs:
/// <summary>二点の位置から閾値を超えた4方位を算出する</summary>
public static Vector2Int GetDir (Vector2 currentPosition, Vector2 lastPosition, float threshold, Vector2 dpi = default (Vector2)) {
	var delta = (currentPosition - lastPosition) / ((dpi == default (Vector2)) ? new Vector2 (Screen.dpi, Screen.dpi) : dpi);
	var adx = Mathf.Abs (delta.x);
	var ady = Mathf.Abs (delta.y);
	var dir = Vector2Int.zero;
	if (adx > threshold || ady > threshold) {
		dir = (adx > ady) ?
			((delta.x < 0) ? Vector2Int.left : Vector2Int.right) :
			((delta.y < 0) ? Vector2Int.down : Vector2Int.up);
	}
	return dir;
}
```

# 使い方
- 新しい位置、以前の位置、閾値、解像度(省略すると画面解像度)を渡します。
- 閾値を超えたら、`Vector2Int.left`、`Vector2Int.right`、`Vector2Int.down`、`Vector2Int.up`のいずれかを返します。
- 閾値を超えなければ、`Vector2Int.zero`を返します。

# 例
```cs:
var position = (Vector2) Input.mousePosition;
var dir = GetDir (position, lastPosition, FlickThreshold);
if (dir != Vector2Int.zero) {
	// フリックを検出
```
uGUIのオブジェクトが最前かどうかを判定する

# 前提
- unity 2017.4、2018.4
- staticクラス内で定義しない(拡張メソッドにしない)場合は、引数の`this`を取ってください。

# できること
- オブジェクトがヒエラルキーで末弟かどうかを判定します。

# コード
```cs:
/// <summary>オブジェクトが最前かどうかを判定</summary>
public static bool IsLastSibling (this GameObject child) {
	return (child.transform.GetSiblingIndex () == child.transform.parent.childCount - 1);
}
```

# 使い方
```cs:
if (!this.IsLastSibling ()) return; // 自身が最前でなければ何もしない
```
AI開発基盤KAMONOHASHIのアーキテクチャ

OSSのAI開発基盤[KAMONOHASHI](https://github.com/KAMONOHASHI/kamonohashi)の中身の解説記事です。
インフラ視点です。

# KAMONOHASHI概要
* Web UIでディープラーニングを実行できる
  * 指定枚数のGPUを確保して、それをコンテナにマウントしてディープラーニングを実行
  * 使用するデータ・モデル(gitのソースコード)をコンテナ内に配置
  * データはKAMONOHASHIにアップロードして管理する
    * 登録したストレージに保管。メタデータ(メモ・タグ)はDBに記録
  * 学習のインプット情報はDBに保存し履歴として閲覧可能
  * 学習の結果として生成されたファイルをストレージに保管
  * gitなどは外部のレジストリを登録してAPI連携 

* CLIもあり、Web UIと同じように利用できる

# システム構成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304012/bdcda9ac-08db-8785-731a-17e5245842f0.png)

* Web Applicationの部分はSPA構成になっている
    * WEBのUI部分はvue.js
    * APIサーバーはdotnet core C#

* DBはpostgres 10

* APIサーバーがk8s APIをたたいてk8s上でディープラーニング実行
  * GPUの割り当てなどはk8s側の機能を利用

* vue.js,APIサーバー,DB自体もk8s上にコンテナとしてデプロイ

* Web Applicationの部分はCORS回避のため、k8sのingress nginxを利用

* CLIもvue.jsと同じAPIサーバーのAPIをたたく

* ストレージには [Minio NAS Gateway](https://github.com/minio/minio/blob/master/docs/gateway/nas.md)とNFSストレージを使用
  * NFSストレージにS3互換APIを持たせることができる
    * ディープラーニングの結果はNFSで逐次書き込み 
      * 別コンテナでマウントしてグラフ表示などを行う。複数の学習を見比べることができる 
    * Web UIでの操作はS3互換APIで行う
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304012/c5848422-3ada-b698-134a-e5be5c6fe61d.png)


## Webシステムとしては低スケーラビリティ
* 対象ユーザーが機械学習エンジニアのため、ユーザー数はかなり少ない。変動も大きくない
* web,DBすべて1ノード上に1台のコンテナで立てている
  * DBはノードの指定ディレクトリに書き出して永続化。指定ノード以外で立てない前提
* 必要性がない・必要になる見込みがないのでスケーラビリティを意識していない
* GPUサーバーの方はk8sに入れるだけで増やせる

## 冗長構成は組んでいない
* 要件として挙がったことがないため。
  * 学習利用がメインのため基本的にHA不要
* pgdumpで定期的にバックアップを吐き出すようにしている。それで十分としている 
* 必要であれば下記での対応が可能
  * k8sの冗長化は構築に使用するkubespray側で対応可能
  * DBはStatefulSet利用にする
  * GPUサーバーは障害があれば、k8sが割り当て時に回避するので気にしない
重複削除、配列内、配列内オブジェクト両方。

-配列内の要素とキーを使った配列内オブジェクトに対する重複削除。
demo https://codepen.io/gnjo/pen/vwMROz

```js
let fn={};
fn.setary=(ary,key)=>{
 return (!key)?Array.from(new Set(ary)):ary.filter((a,b,c)=>(c.findIndex((d)=>(a[key]===d[key]))=== b))
}
;
let a=[1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9]
let aa=fn.setary(a) 
console.log(aa)//[1,2,3,4,5,6,7,8,9]
;
let b=[{key:1,value:1},{key:2,value:1},{key:3,value:1},{key:1,value:1},{key:2,value:1}]
let bb=fn.setary(b,'key')
console.log(bb)//[{key:1,value:1},{key:2,value:1},{key:3,value:1}]
;
```