OmniAICreator/Qiita-1.07M huggingface dataset:
【Python】データ型とキャスト

Pythonでファイルからデータを読み込んで比較演算子を使う場合、データ型とキャスト（変換）は重要というか意識しておいた方が良いです。
例えば、年齢と名前のカラムからなるCSVファイルがあったとします。

``` sample.csv
25,Taro
40,Hanako
30,Jiro
```

ここで、年齢が30歳以下の名前を取り出したくて、

``` test1.py
import csv

with open('test.csv', 'r') as f:
    reader = csv.reader(f)
    for row in reader:
        if row[0] <= 30:
            print(row[1])
```

と書いたとします。これを実行すると、

```
$ python test1.py 
Traceback (most recent call last):
  File "test.py", line 6, in <module>
    if row[0] <= 30:
TypeError: '<=' not supported between instances of 'str' and 'int'
```

というエラーメッセージが表示されます。
内部では`row[0]`のデータ型がstr（文字列）と認識されている一方で、`30`のデータ型はint（数値）として認識されています。
そのため、データ型が異なるstrとintは比較ができませんよというエラーメッセージです。
そこで、

``` test2.py
import csv

with open('test.csv', 'r') as f:
    reader = csv.reader(f)
    for row in reader:
        if int(row[0]) <= 30: # row[0]をint型にキャストする
            print(row[1])
```

のように`row[0]`を明示的にintにキャストすると問題なく動きます。

```
$ python test2.py
Taro
Jiro
```

同じスクリプト言語でもPerlは内部で自動的にキャストしてくれるのですが、Pythonはそのような気の利いた事はやってくれません。
良い悪いは別として、Pythonで比較演算子を使う場合はデータ型とキャストを意識しておいた方が良いです。
【UMLでプリキュア】変身のセリフのオブジェクト図（資料編2）

2018/9/18 追記
@JINCHANGUITAR さんの記事「設計を学ぶときに興味を持った投稿記事」に紹介して頂いたので、
考えるときの理由を追記しました。

#概要
資料編１からのクラスの検討の経緯を記録したもの

#オブジェクト図からの整理
##セリフにある種類をクラスとして認識した場合
「変身シーンのセリフ」には、「開始の合図」に始まって「個人の名乗り」や「チームの名乗り」などがある。
プリキュアとの多重度が異なる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/197297/cdd2998c-3109-bf99-af8d-937077280d8e.png)

セリフのそれぞれの部分は、どれも「セリフ」である。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/197297/7b234e2d-cb32-3d02-eccc-38149cdbaa40.png)

##セリフにある種類をロール名（＝関連端名）として認識した場合
この継承関係の図だけを見ると、全部「セリフ」クラスでも良いように思える（※1）。
その場合は、「セリフ」クラスから「プリキュア」クラスへの関連端は、1..*で統一し、
「開始の合図」などのクラスは、「関連端名」にする。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/197297/6f0b8ec5-8f23-5acf-1b64-91bab591bbc2.png)

(※1)そう思える理由：
理由は、継承された側のクラスに、属性や操作が追加されていないからである。
追加されていないということは、追加された特別な特徴がないということである。
このような場合、継承自体に意味がなく、単に関連端名（＝ロール名）を、派生と勘違いしているケースが考えられる。
【UMLでプリキュア】変身のセリフのオブジェクト図（資料編１）

#概要
これは、【UMLでプリキュア】の変身のセリフのクラス図の元になるオブジェクト図です。
オブジェクト図といっても、まだクラスの指定がない状態のものです。

オブジェクトのみでまずは理解を進めている段階です。

初代プリキュアから、最新のHUGっとプリキュアまで。
まずは、セリフがどんなものであるかを、ノートで付けました。

セリフは「プリキュア５方式」に落ち着いてから、
「ドキドキプリキュア」から徐々に方式が変更されています。

各モデルのコメントを参照してください。

#オブジェクト図
##『ふたりはプリキュア』
![image.png](https://qiita-image-store.s3.amazonaws.com/0/197297/a7baf7aa-2d63-3bd2-d791-970dafa428dc.png)
##『ふたりはプリキュア』シャイニールミナス
![image.png](https://qiita-image-store.s3.amazonaws.com/0/197297/db9a2ced-a4d1-09b2-826c-487452ba17fb.png)
##『ふたりはプリキュア Splash Star』
![image.png](https://qiita-image-store.s3.amazonaws.com/0/197297/f4cd0f18-a6cf-af95-498b-b740ffd3025a.png)
##『Yes！プリキュア5（GoGo！）』
![image.png](https://qiita-image-store.s3.amazonaws.com/0/197297/fb17afdd-707b-ae46-f4f7-467908724a56.png)
##『Yes！プリキュア5（GoGo！）』ミルキィローズ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/197297/faf3e74c-9337-789a-9827-f2caf08e47ae.png)
##『フレッシュプリキュア！』
![image.png](https://qiita-image-store.s3.amazonaws.com/0/197297/4fab62a5-71e6-1f8d-acd3-84f9adf76a9c.png)
##『ハートキャッチプリキュア！』
![image.png](https://qiita-image-store.s3.amazonaws.com/0/197297/333d2439-1a63-8eca-0678-45ae0b2329c0.png)
##『スイートプリキュア♪』
![image.png](https://qiita-image-store.s3.amazonaws.com/0/197297/4e1079d3-b49d-6f86-e123-3f86719a3e46.png)
##『スマイルプリキュア！』
![image.png](https://qiita-image-store.s3.amazonaws.com/0/197297/310e6b3d-5891-43eb-3d63-4d3acca620b9.png)
##『ドキドキ！プリキュア』
![image.png](https://qiita-image-store.s3.amazonaws.com/0/197297/43955e1f-0191-f722-fcb5-ae36e0590fce.png)
##『ハピネスチャージプリキュア！』
![image.png](https://qiita-image-store.s3.amazonaws.com/0/197297/8f7ebae5-812d-635b-17fc-1ef2aa47dbbf.png)
##『Go！プリンセスプリキュア』
![image.png](https://qiita-image-store.s3.amazonaws.com/0/197297/0a73d82a-4dca-ee77-95f4-b7cafda02cb1.png)
##『魔法使いプリキュア！』
![image.png](https://qiita-image-store.s3.amazonaws.com/0/197297/833b4885-8b16-3c28-5d39-2484f824cf1d.png)
##『キラキラ☆プリキュアアラモード』
![image.png](https://qiita-image-store.s3.amazonaws.com/0/197297/4eff32e7-7129-749a-cac4-feb7c796cb1a.png)
##『HUGっと！プリキュア』
![image.png](https://qiita-image-store.s3.amazonaws.com/0/197297/8a9d295a-5c6d-6477-96a9-5ddc10a26c52.png)

#参考
以下のホームページに、大変お世話になりました
`#ホビヲログ`　歴代プリキュア、変身シーンのセリフまとめ！初代から最新作ヒープリまでの決め台詞
https://www.hobiwo.com/entry/precurechange
Sequence to Sequence Learning with Neural Networksを読んだ

-[PDF](http://papers.nips.cc/paper/5346-sequence-to-sequence-learning-with-neural-networks.pdf)

# １．どんなもの
DNNは固定された次元ベクトルの入力を受け取る→既知ではないベクトルを扱えない
1つのLSTMを使用して入力シーケンスを一度に1タイムステップずつ読み取って大きな固定次元ベクトル表現を取得、別のLSTMを使用してそのベクトルから出力シーケンスを抽出する
![スクリーンショット 2018-07-03 12.12.26.png](https://qiita-image-store.s3.amazonaws.com/0/249838/f5b29ab1-92a4-9add-d75a-7af8d783344e.png)
# 2.先行研究と比べてどこがすごいか
原文の言葉を逆転させることで、長い文章の学習を容易にした

# 3.技術や手法のキモはどこにあるか
入力系列を固定長のベクトルにEncodeするLSTMと，そのベクトルを出力可変長系列に変換する別のLSTMから構成

# 4.どうやって有効だと検証したか
データセット:WMT-14 English to French dataset
評価:BLEU
モデル：４層のLSTMで各層1000cell及び1000のembedding

![スクリーンショット 2018-07-03 12.31.32.png](https://qiita-image-store.s3.amazonaws.com/0/249838/8ef4e465-6394-31f5-88cb-260d950aee70.png)

SMTと組み合わせた結果
![スクリーンショット 2018-07-03 12.38.52.png](https://qiita-image-store.s3.amazonaws.com/0/249838/382e83b2-7b47-ce3c-862f-458be8835662.png)

多分似た意味は近くに存在してるって言いたい

![スクリーンショット 2018-07-03 12.40.14.png](https://qiita-image-store.s3.amazonaws.com/0/249838/a0fd9b3e-f145-b011-3b56-fd776136f222.png)
【Unity】UnityEngine.Randomの分布を軽く調べてみた

# はじめに
UnityEngine.Randomが出力するランダム値がどのような**分布**に従うのか気になったので、調べてみました。

今回調べたものは以下の二つです。
・Random.value
・Random.Range(0f, 1f)

上記二つをそれぞれ100万回実行し、得られた数値で**ヒストグラム**を作ってみました。

# 環境
Unity2018.1.0f2
Windows 10

# Random.valueを100万回実行

Random.valueを100万回実行して得られた数値をヒストグラムにしてみました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/44288/0b649c85-f440-01ca-053d-437f41e5dce2.png)

ヒストグラムから、Random.valueは**一様分布に従っている**ことが読み取れます


ヒストグラムはExcelで作成しています。

# Random.Range(0f, 1f)を100万回実行

Random.Range(0f, 1f)を100万回実行して得られた数値をヒストグラムにしてみました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/44288/e9d87f58-393d-97ad-a103-7dbfe1fbdff1.png)

**一様分布に従っている**ことが読み取れます



# 関連
【Unity道場スペシャル 2017札幌】乱数完全マスター
https://www.slideshare.net/UnityTechnologiesJapan/unity-2017-81056841

# ソースコード
計測に使用したソースコードです。

### 乱数の計測
```TestRandom.cs
using System.Collections;
using System.Collections.Generic;
using System.Text;
using UnityEngine;
using UnityEditor;

public class TestRandom : MonoBehaviour
{
	const int k_LoopMax = 1000000;

	void Start()
	{
		Debug.Log("計測を開始します");

		var sb = new StringBuilder();
        sb.AppendFormat("計測日時 : {0}\n", System.DateTime.Now);
        sb.AppendFormat("Unityバージョン : {0}\n", Application.unityVersion);
        sb.AppendFormat("ループ回数 : {0}\n", k_LoopMax);
        sb.AppendFormat("i,UnityEngine.Random.value\n");

		for (int i = 0; i < k_LoopMax; i++)
		{
			sb.AppendFormat("{0},{1}\n", i, UnityEngine.Random.value);
			// sb.AppendFormat("{0},{1}\n", i, UnityEngine.Random.Range(0f, 1f));
		}

		Debug.Log("計測が完了しました");

		// CSV書き出し
		string csvText = sb.ToString();
		FileManager.Save("UnityRandom", csvText);

		Debug.Log("CSV書き出しが完了しました");

		EditorApplication.isPlaying = false;
	}
}
```

### CSVの書き出し
```FileManager.cs
using UnityEngine;
using System.IO;
using System;

/// <summary>
/// csvファイルの書き出しを行う
/// </summary>
public class FileManager
{
    // ファイル書き出し
    public static void Save(string name, string text)
    {
#if UNITY_EDITOR
        var now = System.DateTime.Now;
        var datetime = string.Format("{0}_{1:D2}_{2:D2}_{3:D2}_{4:D2}_{5:D2}", now.Year, now.Month, now.Day, now.Hour, now.Minute, now.Second);
        var path = Application.dataPath + "/" + string.Format("{0}_{1}.csv", name, datetime);

        System.IO.StreamWriter sw = new System.IO.StreamWriter(path, false, System.Text.Encoding.GetEncoding("shift_jis"));

        sw.Write(text);
        sw.Flush();
        sw.Close();

        UnityEditor.AssetDatabase.Refresh();
#endif
    }
}
```
RstudioCloudの使い方

#1.はじめに
##R始めました
まだまだ初心者から抜け出せません。
なのにRに手を出してしまいました。

職場のデスクトップPC、ノートPC、ipad・・・などなど
いろんなところで勉強できたらなぁ。

[Colaboratory](https://colab.research.google.com/notebooks/welcome.ipynb?authuser=1)みたいにネット上で出来るRstudioあったらなぁ（´-`）.｡oO。。。。。。

####・Colaboratoryとは
>ColaboratoryはJupyter notebookを基盤としたオープンソースプロジェクトです。Chromeのデスクトップ版で動作します。
・参考：[Google Colaboratoryを使えばブラウザ上でPythonの実行環境が簡単に手に入る](https://tadaken3.hatenablog.jp/entry/first-step-colabratory)

↑少しさわってみましたが、こちらも便利そうです！

※ちなみにRは（今の所は）使えません。
・参考URL：[Colaboratory よくある質問](https://research.google.com/colaboratory/faq.html)

ということで、いろいろ調べてみました。
なんか見つけました。

[RstudioCloud](https://rstudio.cloud/projects)です。

####・RstudioCloudとは
>rstudio.cloud とは クラウド環境中の RStudio Server が(今のところ) 無料で使えるサービスです。
・参考URL：[rstudio.cloud の紹介](https://qiita.com/kozo2/items/3222744c52ea3ef35c26)

あまりRstudio.cloudに関する記事を見当たりませんでしたが、新しいサービスなんでしょうか？

#2.使ってみよう
###2−1.始めかた
「Get　Started」をクリック。
![スクリーンショット 2018-06-29 16.11.14.png](https://qiita-image-store.s3.amazonaws.com/0/241094/c534ba50-7185-8c34-214b-4da3fc780b3b.png)

Googleアカウントからもログインできます。
![signin.png](https://qiita-image-store.s3.amazonaws.com/0/241094/bdcd84f9-b53c-d73f-ddb6-ed48ab849e21.png)

###2−2.Cloud上のRstudioを使ってみよう
「YourWorkspace」の「NewProject」をクリックするとRstudioが利用できます。

![newproject.png](https://qiita-image-store.s3.amazonaws.com/0/241094/82e55a24-45f3-6d4b-9eb7-1432ce22ab49.png)

ローカルにダウンロードする普通のRstudioのように使えるようです。
※ちなみに、projectの名前は「Untitled Project」をクリックして編集できます。

![rstudio.png](https://qiita-image-store.s3.amazonaws.com/0/241094/91468937-0fb3-fb8d-7d16-df9a26bb60fb.png)


###2−3.もろもろの機能など
####・なんのOSなんだろう？linux？？
Rstudio.cloudのterminalで以下のコマンドを入力してみました。
ubuntuのようだ。

```terminal:command
$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.4 LTS"

```

####・ローカルのデータはどうするの？
テキストデータを用いて計算等したい。というときはどのようにしたら良いのか。。。
→「upload」をクリック→「ファイルを選択」でアップロードしたいファイルを選択して「OK」をクリックで完了。
※ipadでもgoogleドライブやiCloud等へのアクセスができたので、アップロードできました。

![upload.png](https://qiita-image-store.s3.amazonaws.com/0/241094/4987e394-567a-5cce-746f-30c8366c848d.png)

####・日本語OK？
記事を見つけたので、この通りにすれば・・・・とやっていましたが、
sudoからのpassがわかんね〜〜〜断念！！
他に方法はないのだろうか。
・参考URL：[Ubuntu 16.04 + Fcitx + RStudio 1.0で日本語を入力する方法](https://blog.goo.ne.jp/ikunya/e/8508d21055503d0560efc245aa787831)

####・パッケージをいろいろインストールしたけど
Rの修行。。。ということで色々インストールして練習していました。
修行用に”プロジェクト”を作成して色々パッケージを入れたのだが、
先ほど作ったばかりの”NEWプロジェクト”にはインストールされてませんでした。

便利な使い方があるかも。

※他、発見がありましたら更新追加していきます。

##3.おわりに
初心者なりの感想ですが・・・

クラウド上のRstudio.cloudも通常のと比べても同じように使いやすい（日本語はダメやけど）と感じました。

共有して使用する機会がある人、使用する場所やPCが一定ではない人にはもってこいだと思います。

また、ipad(mini4とpro9.7)で動作確認しましたが、特に動きが遅いようには感じませんでした。

以上！

---
まだまだ修行は始まったばかりです。
DSaaSのプロキシ経由設定でハマったら

#やりたかったこと
ClientのEC2をプロキシサーバ経由でDSaaSを有効化したい。

#構成
![AWS構成図.png](https://qiita-image-store.s3.amazonaws.com/0/187070/d82b0270-58e4-304f-e1a0-dece3451fabd.png)


#つまづき編
基本的な設定についてはすでに先人の頼りになる[情報](http://level69.net/archives/24807)があったので、こちらの内容を参考に設定。

設定後に早速DSaaSのWebコンソールで状況を確認。
が、警告が発生・・・。
セキュリティアップデート(コンポーネントのアップデート)の警告が何度リトライしても消えない・・・。

アウトバウンドの制限はかけていないので、インバウンドの制限が原因
（把握していないポートを使用しているのかも！）なのかもと思い、Proxy ServerのClientから
ポート3128のみ許容していたセキュリティグループをガバガバ設定（全トラフィック許可）にしてみた。
が、警告が消えない・・・。
（基本的に443で通信してるから変わらないんですよね）

（その他、色々調べて試してみるもことごとく失敗、そして・・・）

Clientの通信を全てProxy Serverへ向けないといけないのかなど悶々と調べるうちに気になる[情報](https://help.deepsecurity.trendmicro.com/ja-jp/command-line-utilities.html)が。
-y ・・・ オプション？
まさにこれ設定しないといけねぇんじゃね？
（解決編につづく）

#解決編
**dsa_control -y relay_proxy://＜str＞:＜num＞**の実行が必要そうと分かり、
他の[有力情報](https://www.trendmicro.com/ja_jp/business/campaigns/aws/resources/deep-security-10-03.html)も見つかって、確信を得てコマンドを実行！
セキュリティアップデート(コンポーネントのアップデート)の警告が無事解消され
オールグリーン（管理対象）となりました！

#まとめ
##dsa_conrolコマンドは以下の順で実行するよ
```
dsa_control -r 
dsa_control -x dsm_proxy://<str>:<num>
dsa_control -y relay_proxy://<str>:<num>
dsa_control -a <str>, --activate=<str>
```

##awsの設定では以下の点を気にしたよ
Proxy Serverのセキュリティグループ（Clientからの3218を許容、443はいらない）

##ハマってる最中に参照した情報だよ
[DSaaSの使用通信ポート](http://esupport.trendmicro.com/solution/ja-jp/1104586.aspx)
[DSがアクセスするサーバ](http://esupport.trendmicro.com/solution/ja-jp/1097010.aspx?print=true)
[squidのホワイトリストの書き方](https://futuremix.org/2005/07/squid-access-allow)


最後まで読んで頂きありがとうございました。　(・ω・)ノシ
Visual Stuido 2017逆引きメモ

必要に迫られたVisual Stuido 2017の逆引きメモになります。

# Clickonceで参照に必用なファイルが消える問題
Visual Stuido 2017以外で作成したプロジェクトからClickonceを発行すると必用なファイルが消える。
プロジェクトの設定を再確認するも改善せず、Visual Stuido 2015で発行すると必用なファイルが全て発行される。
 
# Reportを変換しても"Unknown Report Version 9.0"で保存できない問題
VS2017でRDLCファイルを開くと下記のメッセージが表示されて変換を促されるが
変換後に保存しても"Unknown Report Version 9.0"とのエラーメッセージが表示されて
保存できない。
先人の知恵を調べてみると、どうやら変換できる下位バージョンが決まってるらしい。
今回の問題ではVS2010でRDLCファイルを開いて変換するとVS2017の環境でも保存時のエラーがでなくなる。

**Visual Stuido 2017のメッセージ**
![hm000000.png](https://qiita-image-store.s3.amazonaws.com/0/107413/4f3f06fa-871e-db76-1744-0ef55fcfeb49.png)
![hm000001.png](https://qiita-image-store.s3.amazonaws.com/0/107413/dbb884ef-d521-de46-3ce9-1fe8200b8902.png)

**Visual Stuido 2010のメッセージ**
![hm000002.png](https://qiita-image-store.s3.amazonaws.com/0/107413/9ac354dc-26c9-617e-bf16-47d02ad385f8.png)

**参考URL**
[What Does the Error Message, “Unknown Report Version 9.0,” in Visual Studio 2015 Mean?](https://www.enhansoft.com/what-does-the-error-message-unknown-report-version-9-0-in-visual-studio-2015-mean/)

# Visual Studoの修復

ASP.NET Coreのプロジェクトを作成すると`’Shared Web Components’パッケージは正しく読み込まれませんでした。`
と表示さるようになったのでVisual Studoの修復方法をメモ。

1. Visual Studio Installerを起動
2. `詳細`→`修復`
3. `修復`が終わったらPCを再起動

---

# ASP.NET Coreのセットアップ

1. Visual Studio Installerを起動
2. `変更`ボタンをクリック
3. `ワークロード`→`その他のツールセット`→`.NET Core クロスプラットフォームの開発`にチェックを入れる
4. `変更`ボタンをクリック
5. Visual Studioを起動
6. `ファイル`→`新規作成`→`プロジェクト`をクリック
7. `Visual C#`の`.NET Core`に`ASP.NET Core Web アプリケーション`が有ることを確認

---

# Xamarinの新規作成プロジェクトで"using Android.Support.V7.App"の参照エラーになる。

**現象**
下記周辺の参照で色々なエラーが出る。

```
using Android.Support.Design.Widget;
using Android.Support.V7.App;
```

**原因**

調べるとプロジェクト作成時にNuGetのXamarinパッケージをインストールする必要が有るらしいです。
そのため、必要なパッケージが正常にインストールされていないとエラーになる。

**対応**
ネットワークの環境、NuGetの設定などを確認する。

---

# "No InprocServer32 registered for package [Crystal Reports Tools Package]"への対応

**現象**
1. Crystal Reports SP21 for Visual Studio 2017をインストールする
1. "No InprocServer32 registered for package [Crystal Reports Tools Package]"が出てrptファイルを編集できない。

**環境**
* Crystal Reports SP21 for Visual Studio 2017
* Visual Studio 2017 15.5.0

**対応**
1. インストール済みのパッケージをアンイストール。
1. インストール途中で表示される「64bitランタイムインストール」でチェックボックス外してを完了。

**参考**
[How to integrate SAP Crystal Reports in Visual Studio 2017 - Stack Overflow](https://stackoverflow.com/questions/42902740/how-to-integrate-sap-crystal-reports-in-visual-studio-2017/43728563)

---

# Visual Stuido 2017でセットアッププロジェクトをビルドすると「ビルド: 0 正常終了、0 失敗、0 更新不要、0 スキップ」になってしまう問題

**現象**
1. セットアッププロジェクトをビルドする。
1. `ビルド: 0 正常終了、0 失敗、0 更新不要、0 スキップ`だけが出力される。

**原因**
どうやら「ライトウェイトソリューションロード」を有効化していると発生してしまう問題のようです。

**対応**
1. `ソリューションエクスプローラー`で`対象ソリューション`を右クリック
2. `ライトウェイトソリューションロードを無効にする`をクリック
3. ソリューションを再起動
ファイル内文字列一括変換

あるディレクトリにある複数ファイルが対象。
ファイル内の文字列を一括で変換したいとき用の.py です。
※対象ファイルを直接編集するので、バックアップをとってから使ってください！！！


#使用例）

```text:対象ファイル.txt 
I'll be back !
I'll be back !
I'll be back !
```
　　　　↓

```text:対象ファイル.txt
I'm back !
I'm back !
I'm back !
```
 
 

#コード）
以下、例を処理した時のもの。

```python:mojiReplace.py
 # -*- coding: utf-8 -*-
import glob

#対象ディレクトリの指定
path = "/home/../dir/"

beforeWord = 'll be'
afterWord = 'm'

#テキストファイルのPATHを取得
files = glob.glob(path + "*.txt")

for file in files :
    print("target : " + file)
    #対象ファイルの読み込み
    with open(file, "r") as f :
        sent = [ row.replace(beforeWord, afterWord) for row in f ]
    #書き込み    
    with open(file, "w") as f :
        f.writelines(sent)
          
```


以上！

2018/7/5 : コードのいらない部分を修正しました。
【簡単3ステップ】RailsでCSV出力する方法

##はじめに
そもそもCSVって何？という状態でしたが、CSV出力の実装をすることになったので、備忘録として残しておきます。

【バージョン】
rails 4.2
ruby 2.3.6

##やることをざっくり説明してみる
Railsのフレームワークとして、Model, View, colotrollerとありますが、実際にいじるのは**viewとcontroller**です。

view => csvファイルを作成　・　出力ボタンの設置
controller => csvとして出力するオブジェクトを投げる ・　ファイル名を設定


やることとしてはこんな感じです。
それでは順を追って説明していきます。

##CSVファイルの作成(View)

CSVとして出力するためのファイルを作成します。
拡張子は、`xxxxxxxxx.csv.ruby`というようにしておきましょう。


```app/view/uses/index.csv.ruby
require 'csv'

CSV.generate do |csv|
  column_names = %w(name age Email)
  csv << column_names
  @users.each do |user|
    column_values = [
      user.name,
      user.age,
      user.email
    ]
    csv << column_values
  end
end
```

※補足  `%w()`は、空白で区切って配列を返すので長くなった時はわざわざ(,)をうち忘れる心配もなく便利です。

csv << column_names　で表の列に入る名前を定義します。
csv << column_values　で表の行に入る値を定義します。

##CSV出力ボタンを設置する(View)


```app/view/users/index.html.erb
  <%= link_to "CSV", users_path(format: :csv), class: "btn btn-primary" %>
```
これでどのアクションに対してcsvを出力するかを指定します。
ここでは、users_path => usersコントローラのindexアクションになるので(普通なら)、indexアクションを実行することになります。
また、request_urlとして現在のurlを指定することもできます。

##フォーマットごとに出力内容を指定(Controller)

```app/controllers/users_controller.rb
class UsersController < ApplicationController
  def index
    @users = User.all
    respond_to do |format|
      format.html do
          #html用の処理を書く
      end 
      format.csv do
          #csv用の処理を書く
      endw
    end
  end
end
```

formatごとに違う処理をしたいというわけでなければ、`format` の部分は無視してOKです。

もしファイル名を変更したいとなった場合は, `format.csv do` の後に続いて、以下の様に記述します。

```ruby
send_data render_to_string, filename: "(ファイル名).csv", type: :csv
```

##おわりに

こちらの記事が超シンプルでわかりやすかったので非常に参考になりましたm(_ _)m
https://qiita.com/necojackarc/items/39e0f0c438363f7084db

こんなに簡単にできるとは思ってなかったので、記事で説明してくれた皆さんに感謝です。
mysqlでテーブルに値を代入する．

- データベースを選択する．

```sql
use twitteruser1;
```
>
Database changed

(-これからデータベースを作る人はこのコマンド
create database twitteruser1;)

- データベース内のテーブル一覧を表示する．

```sql
show tables;
```

>
```
+------------------------+
| Tables_in_twitteruser1 |
+------------------------+
| goods                  |
+------------------------+
1 row in set (0.00 sec)
```

(- これからテーブルを作る人はこのコマンド
create table goods;)

- ’goods’というテーブルのカラム名を表示する．

```sql
show columns from goods;
```

>
```
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | YES  |     | NULL    |       |
| name  | varchar(20) | YES  |     | NULL    |       |
| price | int(11)     | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
```

- ’goods’というテーブル内に要素を代入する．

```sql
insert into goods(id,name,price) values(1,'kenta',300);
```

>
```
Query OK, 1 row affected (0.08 sec)
```


- ’goods’というテーブル内の要素をすべて確認する．

```sql
select * from goods;
```

>
```
+------+-------+-------+
| id   | name  | price |
+------+-------+-------+
|    0 | taro  |   100 |
|    1 | kenta |   300 |
|    3 | jin   |   600 |
+------+-------+-------+
3 rows in set (0.00 sec)
```
Pythonからmysqlを操作したい．


文字通り，Pythonからmysqlを操作したい．
どのドライバにするか迷ったが，今回はpython3からもアクセスできる&環境構築が簡単そうなmysql-connector-python-rfを用いることにする．

−環境
MacOS High Sierra 10.13.5
Python 3.6.1



pipでインストールできた．

```
pip install mysql-connector-python-rf
```

以下の記事通りにインストールを試みた．
https://qiita.com/hoto17296/items/0cfe7cdd3c47b69cc892
しかし，mysqlのアクセスのところで，
”authentication plugin 'caching_sha2_password' is not supported”のエラーが発生．
Mysqlのデフォルトのpluginがcaching_sha2_passwordとなっており，これは，mysql-connector-python-rfのドライバには対応していないことが判明した．なので，作成するユーザーのpluginの設定を変更して，ユーザーを作成することにする．

root でログインする．

```
mysql -u root -p 
```

user1というユーザーを作成する．

```
create user ‘user1’@‘localhost' identified with mysql_native_password by 'user1_Password';
```

>
Query OK, 0 rows affected (0.09 sec)


”with mysql_native_password”をつけることで，pluginを変更してエラーを対処することができた．


user1に全権限を付与する．

```
grant all on *.* to 'user1'@'localhost';
```

rootからログアウトする．

```
exit
```

user1でログインする．

```
mysql -u user1 -p
```


現在の権限を確認する．

```
show grants;
```

>
———————————————————————————————+
| GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, SHUTDOWN, PROCESS, FILE, REFERENCES, INDEX, ALTER, SHOW DATABASES, SUPER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, CREATE TABLESPACE, CREATE ROLE, DROP ROLE ON *.* TO `user1`@`localhost` |
| GRANT BACKUP_ADMIN,BINLOG_ADMIN,CONNECTION_ADMIN,ENCRYPTION_KEY_ADMIN,GROUP_REPLICATION_ADMIN,PERSIST_RO_VARIABLES_ADMIN,REPLICATION_SLAVE_ADMIN,RESOURCE_GROUP_ADMIN,RESOURCE_GROUP_USER,ROLE_ADMIN,SET_USER_ID,SYSTEM_VARIABLES_ADMIN,XA_RECOVER_ADMIN ON *.* TO `user1`@`localhost`  

設定が反映され，全権限が付与されている．

こうすることで


```py

import mysql.connector

conn = mysql.connector.connect(
    auth_plugin='mysql_native_password',
    host = 'localhost',
    port = 3306,
    user = 'user1',
    password = 'user1_Password',
    database = 'twitteruser1',
)
cur = conn.cursor()

print(conn.is_connected())

```
のスクリプトが実行可能となった．

何も考えずに，ユーザに全権限を付与することはあまり好ましくないかもしれないが，今はローカル環境なので，とりあえず許すことにする．

また，databaseの作り方などの，基本的な操作方法について，次の記事で更新したのでそちらもよろしければ．
https://qiita.com/kotaaaa/items/84beefa8e8684cae3f99


アドバイス，コメント等あれば，ぜひよろしくお願いします．

参考
https://www.s-style.co.jp/blog/2018/05/1807/
https://qiita.com/hoto17296/items/0cfe7cdd3c47b69cc892
【Docker Compose】container_name ではなくて COMPOSE_PROJECT_NAME 変数を使うと良さそう

## 背景

`docker-compose.yml` 内で `container_name` を指定することで、コンテナ名を明示することができる。

```yml:docker-compose.yml
version: "3"

services:
    web:
        container_name: myapp_web
        image: php:7.1-apache
```

上記 `docker-compose.yml` が置いてある場所で `docker-compose up` すると `myapp_web` という名前でコンテナが立ち上がる。

しかし、これでは名前の重複によって、同じコンテナを複数立ち上げることができない。

## そこで `COMPOSE_PROJECT_NAME` 変数の出番

一方で `container_name` を指定しない場合、コンテナ名は自動的に「`COMPOSE_PROJECT_NAME` 変数 + `_` + サービス名 + `_` + 連番」となる。

つまり

```yml:docker-compose.yml
version: "3"

services:
    web:
        image: php:7.1-apache
```

```:.env
COMPOSE_PROJECT_NAME=myapp
```

のようにして `docker-compose up` を実行すると、自動的に `myapp_web_1` という名前がつけられたコンテナが立ち上がってくれる。

コンテナ名を決める要素を `.env` に切り出せる、名前が機械的に決定される、という意味でもこの方法が好ましそう。

## 余談

この `COMPOSE_PROJECT_NAME` 変数はコンテナ内からは参照できない。

`docker` コマンドを叩くときの変数ではなく、`docker-compose` コマンド自体を叩くときの変数だからである。

なので `docker-compose.yml` 内で `env_file` や `environmet` を使って設定する変数とは別のものである（慣れないと混乱しがち）。

## 参考

* https://docs.docker.com/compose/env-file/
* https://docs.docker.com/compose/reference/envvars/
forkしたpublicリポジトリをprivateにする

# forkしたpublicリポジトリをprivateにする

- 公開されているリポジトリをフォークして、個人のprivateリポジトリにしたかった。
- githubのfork機能を使うと、公開リポジトリになりprivateに変更できない。
- わからんので調べた。

```shell

# bareモードでクローンする
git clone --bare https://github.com/hoge/hoge
# クローンした階層にいく
cd hoge.git
# ここでgithub上のprivateリポジトリを作成しておく
# 作成したリポジトリにmirrorでpushする
git push --mirror git@github.com:yourname/yourrepo
# bareモードでクローンした不要な階層を削除しておく
cd ../
rm -rf hoge.git
```

以上、あざした！！
Dialogflow と Firebase Cloud Functions で Actions On Google の Node.js Client Library v2対応

以前、[Dialogflow と Firebase Cloud Functions で Actions On Google 作り](https://qiita.com/doki_k/items/11f8a23d71dce59409da) を書いてから半年ほど。。時代の流れは早いもので、そのレポートの通りやっても動かない！！

ということで、簡単なポイントまとめです。

前のレポートの通りにやって動かないのは、Firebase Cloud Functions のテンプレートを利用すると DialogflowApp の Node.js Client Library が v2 になるからです。

<img width="868" alt="Screen Shot 2018-07-02 at 15.39.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/92506/e8a43433-3580-c43e-6f35-f633d557afd5.png">

無理矢理 v1 を使用することもできますが、上図（Actions on Google のリファレンスより引用）のように v1 は、既に"deprecated"になっています。なので、それに従い、v2 を使うやり方にシフトします。
v1 と v2 でどのように変わったのかを、ソースコードベースでレポートしたいと思います。

# 比較

途中略してますが、大体同じになるようにソースコードを書いています。以下の2つを見比べてみてください。

v1

```javascript:index_v1.js
'use strict';

process.env.DEBUG = 'actions-on-google:*';

const { DialogflowApp } = require('actions-on-google');
const functions = require('firebase-functions');

exports.funcDecisionAction = functions.https.onRequest((request, response) => {
    const app = new DialogflowApp({ request, response });

    function funcHandler(app) {
        let speechStr = "";
        let func_id = app.getArgument(funcid);
        console.log(app.getRawInput());

        ....

        if (speechStr === "") {
            speechStr = "値ないよ！最初からやり直して！！";
            app.tell(speechStr);
        } else {
            app.ask(speechStr);
        }
    }

    const actionMap = new Map();
    actionMap.set('action.funcdecision', funcHandler);

    app.handleRequest(actionMap);
});
```

v2

```javascript:index_v2.js
'use strict';

const { dialogflow } = require('actions-on-google');
const functions = require('firebase-functions');

const app = dialogflow({ debug: true });

app.intent('funcdecisionIntent', (conv, { funcid }) => {
    let speechStr = "";
    let func_id = funcid;
    console.log(conv.input.raw);

    ....

    if (speechStr === "") {
        speechStr = "値ないよ！最初からやり直して！！";
        conv.close(speechStr);
    } else {
        conv.ask(speechStr);
    }
});

exports.funcDecisionAction = functions.https.onRequest(app);
```

Dialogflow 側に"funcdecisionIntent"という名前の Intent、"funcid"という名前の Entity があるものとします。（v1の方では、更に Intent に"action.funcdecision"という Action名がつけられているとします。）

ポイントとしては下記が挙げられます。

- "app"の代わりに"conv"
- ".tell"が".close"に
- 処理に Intent 名を直接指定するように（action名をつけなくてよくなった、最後にまとめて action名と処理の紐付けを行わなくてよくなった）
- Entity名を引数に指定して処理で使う

v2の方がより直感的で無駄がなくなったように感じますね。

# まとめ

すごい大雑把ですが、以上です。
不足点多くて、もっと詳細に知りたい！って人は公式のリファレンスなど見に行ってください！私的には、[Samples](https://developers.google.com/actions/samples/) を見るのがおすすめです！
apache のリバースプロキシ for kibana

ネットワーク環境の制限などでkibana を80 番ポートで受けるための設定

* kibana 用のconf ファイルを作成

```/etc/httpd/conf.d/kibana.conf
ProxyRequests Off
ProxyPreserveHost On

<Location "/kibana">
  ProxyPass "http://localhost:5601"
  ProxyPassReverse "http://localhost:5601"
  RewriteRule "^/kibana/(.*)$" "/$1" [L,PT]
</Location>
```

* kibana.yml ではbasePath を設定する

```/etc/kibana/kibana.yml
server.port: 5601
server.host: "0.0.0.0"
server.basePath: "/kibana"
```
【Rails】繰り返し文でハッシュの結合(追加)をする方法


##やりたいこと
繰り返し文を使っているとき、配列の`[]<< hoge` みたいに値を入れていくように、 `{} << hoge` 的な感じでハッシュの塊を結合してみたいと思った。

しかし、そんな文法はないのでもちろんエラーが発生するので色々試して見た。

##mergeメソッドでハッシュを結合する

mergeを使ってハッシュを結合してみる。

```rb
hash = {}

hoge = {color: "red"}

=> {color: "red"} 

hash
=> {}
```
しかし、これではhashがセーブされないのでhashを返す時には空になっているだけである。

##**でハッシュを展開

**を使うというパターンもある。

```rb
hash = {}

{color: "red", **hash}

=> {color: "red"}

hash
=> {}
```

しかし、これもhashの値が更新されるわけでもない。

##merge!メソッドでハッシュを更新##

ここで使ったのがmerge!メソッド。
これでhashの値を保持することができる。（updateのエイリアス)

```rb
hash = {}

hoge = {color: "red"}


hash.merge!(hoge)

=> {color: "red"}

hash
=> {color: "red"}
```


しかし、注意して欲しいのが、updateメソッドと同様、すでに存在するキーを追加していくと、ただ単にハッシュが更新されてしまうだけであること。

```rb
hash = {}

hoge = {color: "red"}

fuga = {color: "blue"}


hash.merge!(hoge)

=> {color: "red"}

hash.merge!(fuga)

=> {color: "blue"}

hash
=> {color: "blue"}　#colorの値を更新しただけ
```

同じキーが複数存在するのはありえないので当たり前といえば当たり前ですが。。

なので、それぞれ違うキーを追加していくときに使うことができます。

##繰り返し文でハッシュを結合してみる

例えば、ユーザーの名前、点数をセットにしてhashに追加していく処理があったとすると、以下のようになります。

```ruby

hash = {}
Users.each do |user|
  hash.merge!(user.name => user.score)
end

puts hash
```

```
{"taro" => 70, "hanako" => 80, "jiro" => 100", "reon" => 20 }
```

これでそれぞれのユーザーどの点数だったのかをまとめたハッシュを返すことができます。
（現在改訂中）設定ファイルの設計 (格助詞「で」を参考) 　その１　設計思想

# 汎用的な設定ファイルの設計

# 目的
カスタム設定、カスタムコードをなるべく減らすための設定ファイルの設計。
具体的には、
プログラムの実行のときに、意味的に「藤沢図書館で、借りている本と予約本を」とパラメータを書くだけで、必要な情報がとってこれるようにする。この藤沢図書館の部分を、神奈川県立図書館に変更するだけで、プログラムが同じ動きをしてくれるようにする。図書館のよる違いはできるだけ設定情報で吸収して、プログラム部分は簡単にするのが目標。実行環境は、jupyter です。


# 実装のコンセプト　

- プログラム
XXX（名詞（noun)) で、YYY（動詞（verb））する。

- 設定ファイルの最初の階層
名詞（noun)、動詞（verb）、共通(common) 全体(global）
（例）鎌倉図書館で、借りた本を調べる。
ds.do("鎌倉図書館","借りた本")


# 設定ファイルの構造(json から　Yamlにしました。)
## トップレベル 

```json
{"nouns":{},"verbs":{},"commons":{},"global":{}}
```
## nouns 以下 名詞 ( noun )

```json
"nouns": {"鎌倉図書館":{項目(items)},
    "藤沢図書館":{項目(items)}
```
* "鎌倉図書館" が名詞(noun) で、{}には、項目(items)が設定されています。

### 実際の例

```json
        "鎌倉図書館": {
            "auth": {
                "form": {
                    "name": "usercheck"
                },
                "id": {
                    "name": "usercardno"
                },
                "logout": {
                    "js": "OPWUSERLOGOUT(1)"
                },
                "password": {
                    "name": "userpasswd"
                },
                "submit": {
                    "name": "Login"
                },
                "url": "https://lib.city.kamakura.kanagawa.jp/opw/OPW/OPWUSERCONF.CSP"
            },
            "id": "idxxx",
            "lend": {
                "url": "https://lib.city.kamakura.kanagawa.jp/opw/OPW/OPWUSERINFO.CSP#ContentLend"
            },
            "password": "passxxx",
            "reserve": {
                "url": "https://lib.city.kamakura.kanagawa.jp/opw/OPW/OPWUSERINFO.CSP#ContentRsv"
            }
        }
```
## verbs 以下 動詞 ( verb )

- 実行するプログラム（関数）の順番と、項目を記述します。
- 名詞( noun ) にない項目があると補完します。

```json
    "verbs": {
        "test": {"common":"test"},
        "借りた本": {
            "do": [
                "login",
                "get_url,lend,url",
                "sleep,5",
                "get_url,reserve,url",
                "sleep,5",
                "logout"
            ]
        }
    }
```
## do の構造

- do は、リストで、実行する関数名を指定する。
- 関数は、リストの順番に実行される
- do の要素は、カンマ区切りの文字列で、関数名,引数,...の構造になっている。
- (例) 関数 get_url の引数として、[lend,url]が渡される。
- sleep,5 も同様に、5 が渡され、5秒間、実行が停止される。
- do は、名詞(noun) に記述することもできる。そのときは、名詞(noun)にかかれた do が優先する


## common の適用
- 項目(items)の中に、common があったら適用する。上記の事例では、動詞(verb) test にある。 "common":"test" 
- 名詞(noun),動詞(verb)のあとで、適用される。

## global  の適用
- 何も設定しなくて良いです。
- 名詞(noun),動詞(verb),commons の後で適用。

# 設定ファイルの設計 (格助詞「で」を参考)  プログラム編に続く
Objection.js で、 モデルにデフォルト値を設定していて更新時に困った

Objection.js とは、Node.jsの ORM で、使いやすい。

# Node.js の ORM 事情

Knex というクエリビルダーがあり、それに基づいているものが多い。 Sequelize.js だけは独自実装。

 **Sequelize.js**

https://github.com/sequelize/sequelize

最もスター数が多いが、難しい。ドキュメントが読みにくい。

 **Bookshelf.js**

こちらも老舗で、使いやすそうだと思ったのだが、Bookshelf.js は死んだ...

- https://bramanti.me/bookshelf-is-dead/
- https://github.com/bookshelf/bookshelf/issues/1511

...らしい。
が、生き返ろうとしているらしい。

https://github.com/bookshelf/bookshelf/issues/1600

 **Objection.js**

後発で、最も良さそうだった。Sequelize よりも直感的だと思う。 TypeScript にも対応している。
他のORMが、 Python の SQLAlchemy や Django のモデルとすると、Rails や Laravel のモデルに近い。テーブル名を指定すると、自動的にメソッドやプロパティが生える？ような挙動。（コード読んでないので、どんな実装かは存じ上げません・・・）

https://vincit.github.io/objection.js

ちなみにQiitaで見たら、このライブラリに自体に言及している記事が1件もなかった。
TypeScript に対応しているのが良くて、他のライブラリだと、独自の型定義を指定するので、それを調べるのがちょっと面倒。また、上述した、自動的に生えるプロパティに対して、型を指定できるので、型の有無の良いところを取っているように思える。

 **Mongoose**

本命ですね。

MongoDB に絞られますが、 Node.js 使うならこれが一番使いやすいと思った。
そもそも Node.js が求められる場合というのは、 C10K 問題の解決のため、というのもあるだろうし、 RDB に固執するのはもはや煩悩の域なのかもしれない。

# 問題

その Objection.js で一つハマったので、メモ。

モデル

```ts
class User extends Model {
  id?: number
  name?: string = ''
  email?: string
}
```

コントローラー

```js
app.put('/users/:id', async(req, res) => {
  await User.query()
    .patch({ email: 'hoge@hoge.com' })
    .where('id', 1)

  res.send('ok')
})
```

などとすると、下記のSQLが出る

```sql:knex-logger
SQL update `users` set `name` = ?, `email` = ? where `id` = ? {, 'hoge@hoge.com, 1} 8.906ms
```

`  name?: string = ''` で、デフォルト値を設定していると、 Update 時にもそれが代入されてしまう。んー。 Create 時ならいいんだけどなあ。
プレビュー スライドモード 23章 クリティカルな状態の管理:信頼性のための分散処理_1/2

### 23章 クリティカルな状態の管理:信頼性のための分散処理_1/2
---
### 背景
- - -
* プロセスのクラッシュや自然災害など何かしらの影響でシステムを一時止める必要がある。
* それらの影響により、ネットワークの分断は避けることができない。
* 分散合意を理解する事は、アプリケーションの一貫性、可用性の影響を理解するべきです。

---
### 分散型システムの基本的な概念
- - -
* プロセスのグループのリーダーはどれ？
* グループ内の一連のプロセスは何ですか？
* メッセージが分散キューに正常にコミットされましたか？
* プロセスがリースを保持しているかどうか
* 特定のキーのデータストア内の値は何ですか？


---
### 23.1 合意を利用する目的: 分散システムの協調障害
- - -

実際の障害を回避するためのアルゴリズムを見ていきましょう

---
### 23.1.1 Case1:スプリッドブレイン問題
- - -

手法
* レプリケーションされた２つのファイルサーバを一つのセットとする
* 2つのファイルサーバは同じ物理サーバであってはいけない
* それぞれのファイルサーバのペアは1つがリーダでもう1つがフォロワ
* どちらかと更新が取れなくなった場合もう片方を殺すコマンドを発行する

---
問題
* ネットワークの遅延やパケットの破棄がされた時
* 両方が双方に対してシャットダウンコマンドを打ち合う事になる


---
### 23.1.2 Case2:人間の介入が必要なフェイルオーバ
- - -

手法
* 高度に断片化されたデータベースシステムには各シャードプライマリが存在
* 別のデータセンタのセカンダリに同期しレプリケートする
* 外部システムが健康状態をチェックし、プライマリにセカンダリを昇格させる
* 逆にセカンダリの健全性を判断できない場合人間にエスカレートする

---
問題

* データの損失はないが、可用性に悪影響
* エンジニアの操作不可が増加

---
### 23.1.2 Case3: グループメンバシップアルゴリズムの障害
- - -

手法
* システムには索引、検索を実行するコンポーネントがある
* 開始時にノードは互いのノードを見つけクラスタに追加
* クラスタはリーダを選出し、調整を実行

---
問題
* クラスタを分割するネットワークパーティションの作りになっていた場合
* 各々がマスタを選出し、書き込み、削除を受け入れ、殺しあう



---
###  23.2 分散合意の動作
- - -
* 非同期分散合意の問題 

メッセージパッシングにおける遅延に上限がない

殺しあう


---
分散アルゴリズムの考え
- - -
* crash-fail: クラッシュしたノードがシステムに戻ることがない考え
* crash-recover: 逆に戻るという考え (クラッシュではなく、遅延、再起動が確率が高いため)
* ビザンチン将軍問題: 悪意のある不正メッセージやバグを少数のサーバが送り混乱させる問題

* 非同期分散合意問題を有限時間内で解決することが不可能
* FLP不可能生: ネットワークが信頼できないのであれば処理が進むことを保証できるアルゴリズムはない


---
分散合意問題に対する最初の解決策は
* LamportのPaxosプロトコルが有名これについて説明していこう



---
### 23.2.1 Paxosの概要:サンプルのプロトコル
- - -
1. それぞれのシステムが各提案をする
1. 厳密に順序づけされる(シーケンス番号)
1. プロポーザ(提案を行うプロセス)はシーケンス番号をアクセプタに送信する
1. 各アクセプたは自分がそれ以上に大きいシーケンス番号を持つ提案を見ていない場合承認する
1. プロポーザは必要であればより大きいシーケンス番号でリトライできる
1. 過半数のアクセプ宝合意を得たら、プロポーザは値をつけてコミットメッセージを送信し、コミットできる

---
* ここでポイントなのは、ノード一つ一つは完全は全体のビューを持っていない
* 断片しかない

---
### 23.3 分散合意のためのシステムアーキテクチャパターン
- - -
* 今までは分散合意という低レイヤの話をした
* これからは、それを踏まえた高レイヤの話をする

---
### 23.3.1 信頼性を持つ複製ステートマシン
- - -
* 複製ステートマシン: 同一の処理の集合を同一順序で複数のプロセスで実行するシステム
* 合意アルゴリズム上の論理レイヤとして実装されたシステム
* 処理順序は、合意アルゴリズムによってグローバルに順序づけにしたがって実行する

---
### 23.3.2 信頼性を持つ複製データストアおよび設定ストア
- - -
* 複製データストアは複製ステートマシンの応用例の一つ
* 合意アルゴリズムによって順序づけされた状態で動作するデータストア

問題
* 不整合があってはいけないにも関わらず
* タイムスタンプが意味をなさない→処理速度を落とす事で対処


---
### 23.3.3 リーダ選出を利用する高可能性をもつ処理
- - -
* 分散システムにおけるリーダ選出問題 = 分散合意の問題
* リーダがいるシステムだと、高可用性を持つサービスでもシンプルなものとして扱える
* リーダだけに命令すれば良いから

---
### 23.3.4 分散協調およびロックサービス
- - -
* 分散演算処理におけるバリアとは、何かの女権が満たされるまで、
* あるプロセスグループが処理を進めないようにブロックする仕組み
* 分散演算処理に使われる
* バリアは複製ステータマシンとして実装することもできる
* プロセスが死んでも良いように、無制限のロックをしないことが重要


---
### 23.3.5 信頼性を持つ分散キュー及びメッセージング
- - -
*キュー*
* 共通のデータ構造、多くのワーカープロセス間でタスク分散する方法として利用
* タスクが正常処理されることを保証する必要があるが、比較的容易にワーカの障害や消失を許容できる

---
問題
* キューが失われるとシステム全体が動作しなくなること

---
アトミックブロードキャスト
- - -
* 全ての参加者が確実に同じ順序でメッセージを受診する分散システム
* 極めて強力
* これを負荷分散装置として利用する。

---
queueing-as-work-distribution(分散キューイング)
- - -
* キューをロードバランシングの道具として使う
 
p311
図23-5を見てください

---
* キューイング、メッセージングシステムは優れたスループットが必要
* しかし、非常に少ない待ち時間はいらない
JavaScript 引数の数や型を動的に変更する方法まとめ


Vuexのコード読んでたらオプション引数を前に持ってくる実装があったので単発で
短い記事起こししようと思いましたが、せっかくなので他の方法も合わせてまとめました。
ダーっと書いたので、カバーできてないパターンがあったらコメント下さい。

## オプション引数が後ろに来るやつ

### 実装方法1
ES6で書くならこれ一択です。一番基本的なやつですね。
引数宣言にイコールとデフォルト値を追加するだけです。

```js
// 実装
function multiply (a, b = 1) {
  return a * b
}

// 使用
multiply(5, 2) // 10
multiply(5) // 5

```

多分みんな知ってると思いますが、一つでもオプション引数を作ったらそれ以降の引数は
すべてオプション引数にしなければなりません。

```js
// 関数の定義自体はできるが
function multiply (a, b = 1, c) { return a * b * c}
// 使い方が存在しない
multipty(5,,2) // 無理
```

### 実装方法2
ES6が使えないならこれ。falsyな値ガード。
よく見る実装ですがハマるときは本当にハマるので使う場合には
[引数を渡さなかった際にデフォルト値を使う場合の注意点](https://qiita.com/VoQn/items/3a4a8c0ad11e45c64907)の内容を理解しておく必要あり。

```js
// 実装
function multiply (a, b) {
  b = b || 1
  return a * b
}

// 使用
multiply(5, 2) // 10
multiply(5) // 5

```


## オプション引数が前に来るやつ

### 例: VuexのmapXXX

```js
// 名前空間の有り無しで本題の引数である配列が第一引数に来るか第二引数に来るかが変化する
mapState('bar', ['value'])  // 名前空間あり
mapState(['value']) // 名前空間なし
```
### 実装方法
アタマの引数の型を確認し、それにより後ろの引数をスライドすればOK。
([Vuexのコード](https://github.com/vuejs/vuex/blob/e821f1bf5b818992d7f34c03029ce2ded1f52a75/dist/vuex.common.js#L903)を参考にしました。)


```js
// 実装
function method1 (arg1, arg2) {
  if (typeof arg1 !=='string') {
    arg1 = arg2
    arg2 = null
  }
  // 処理を書く
}

// 使用
method1('someNamespace', ['hoge', 'fuga', 'piyo', 'nyaa']) // オプション引数あり
method1(['hoge', 'fuga', 'piyo', 'nyaa']) // オプション引数なし
```

★注意★
これをやるならドキュメントをしっかり書きましょう。
個人的にはこの系統のメソッドは使う側がどツボにハマる可能性があるので、あまり好きではないです。

## 引数の数が不定なやつ

### 例: いくつでも足し算出来るメソッド

```js
sum() // 0
sum(2, 3) // 5
sum(2, 3, 4) // 9
```

### 実装方法1

ES6であればこちら。引数名の頭に`...`をつけると、配列として受け取れます。

```js
// 実装
function sum (...numArr) {
  return numArr.reduce((s, n) => s + n, 0)
}

// 使用
sum() // 0
sum(2, 3) // 5
sum(2, 3, 4) // 9
```

また、最初の何個かは固定で残りが不定という形をとることもできます。
`function f(a, b, ...theArgs) { // なんらかの実装 } `



### 実装方法2

ES6でなければこちら。
引数部分には何も書かず、すべてのメソッドに自動的に用意される
ローカル変数のargumentsオブジェクトを参照しましょう。
★注意★ こいつ、Arrayと見せかけてArrayではない！！
知ってれば色々出来るので、[興味のある人はこちら](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments)も見てみて下さい。

このargumentsに、使用側が渡した順に引数が入ってます。

```js
// 実装
function sum() {
  var s = 0
  for (var i=0; i < arguments.length; i++) {
    s += arguments[i]
  }
  return s
}

// 使用
sum() // 0
sum(2, 3) // 5
sum(2, 3, 4) // 9
```

## 引数が文字列でもクラスインスタンスでも良いやつ


ruby使いの人が好きなパターンなのか、ruby on railsでよく見るやつです。

### 例: 半端ない宣言をするメソッド

```js
var cat1 = new Cat('大迫')
hampaNaiCat(cat1) // 大迫半端ないって
hampaNaiCat('タマ') // タマ半端ないって
```

### 実装方法

`instanceof`で渡された引数がクラスインスタンスかどうかを判別します。

```js
// 実装
hampaNaiCat(arg) {
  const name = (arg instanceof Cat) ? arg.name : arg
  return name + '半端ないって'
}

// 使用
class Cat {
  constructor(name) {
    this.name = name;
  }
  set name(name) {
    this._name = name;
  }
  get name() {
    return this._name;
  }
}
var cat1 = new Cat('大迫')

hampaNaiCat(cat1) // 大迫半端ないって
hampaNaiCat('タマ') // タマ半端ないって
```
YAMLでネストした配列を作る

## YAML (ブロックスタイル)

なんだか奇妙なシンタックスに見えるが、空のハイフン行 `-` の後に、さらに配列記法を続ければ良い。

```yaml
- 1   # 配列の1個目
- 2   # 配列の2個目
-     # 配列の3個目には別の配列をネスト
  - 3    # ネストした配列内の1個目
  - 4    # ネストした配列内の2個目
  -      # ネストした配列の３個目には、さらに新しい配列をネスト (以下略)
    - 5
    - 6
```


## JSONでの解釈

```json
[
  1, 
  2, 
  [
    3, 
    4, 
    [
      5, 
      6
    ]
  ]
]
```

## YAML (フロースタイル)

結果は最初の例と同等。

```yaml
[1,2, [3,4, [5,6]]]
```

## YAML (ブロックスタイルとフロースタイルの併用)

結果は最初の例と同等。

```yaml
- 1
- 2
- [3,4, [5,6]]
```


# 参考

- [Online YAML Parser](http://yaml-online-parser.appspot.com/)
- [yamlのblockスタイルとflowスタイルの違いを楽しんだ - podhmo's diary](https://pod.hatenablog.com/entry/2017/04/20/235402)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
楽しさを演出するUIのポイントメモ

## 1.変化があるコンテンツ
- ユーザ数
- アイテム数
- 価格

上記のような変動要素。毎日訪問して変化がある要素。

### 最近のトレンド
ホーム画面には毎日更新されるような情報を優先的に表示し、固定されたナビゲーションやメニューはハンバーガーメニューで表示させる。

## 2.アニメーション
煩わしいオペレーションなど、楽しさと相反する操作に対して気持ちの良い動きがあれば、体験が変わる可能性がある。
### タップ時のフィードバックアニメーション
- お気に入り登録のハートアイコンの色を変えるだけではなく、小さく跳ねるような動作
- 引っ張っている感覚、押している感覚のように、アクション本来の感覚にマッチしたアニメーション

## 3. トランジション
画面遷移時のトランジションを工夫することで楽しさを演出することが可能。
- Smart Newsでのタブ切り替えでは紙をめくるようなトランジション
VSCodeを手軽にリロードする為のショートカット

`eslint`や`flow`のパッケージをインストールしても、VSCode上ですぐに表示されない事があるけどウィンドウ閉じてまた開くの面倒だなと言う時の為のコマンドメモ。

## ショートカット
`⌘`+`P` (Windows では`Ctrl` + `P`)を押下して、`>Reload Window`と入力して`Return` (`Enter`)を押すだけ。
AWS cloudwatch のイベントを使ってSystems ManagerのRun Commandをトリガーする時ハマるポイント

# DEFINE
SSM: AWS Systems Manager
ssm-agent: SSMの一部サービスを実行してくるagent
Run command: SSMのサービスの一つ

# 背景
AWSのSystems Managerの[Run Command機能](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/run-command.html)を使えば、sshせずにインスタンス群にコマンドを送信できます。
## Run Commandの準備（ざっくり）
1. ターゲットインスタンスにssm-agentをインストール
2. コンソールのManaged Instancesのところにagentがインストールされたインスタンスがオンライン（緑）になったのを確認
3. インスタンスにssm-agentが必要とするIAMロールをつけます
4. awsユーザーにssmを実行する権限があることを確認
5. コンソール・コマンドラインなどからコマンドを実行する

# Cloudwatchにルールを設定してRun Commandをトリガーする
嬉しいところ：scheduled eventを設定すればcronjobと同じことができます
例：毎晩自作サービスのログをS3にバックアップする（古い〜サービスなのでログファイル名以外中身バラバラの場合、fluentdを設定するのが大変なのでとりあえずs3にあげます）

# ハマるところ
SSMのコンソールからコマンドを入力する時

```sh
ps aux
ls 
cd /var/log
```
のようにコピペーすれば実行できますが、cloudwatchの設定画面だとうまく行きません。SSMのコンソール画面に入ってエラーメッセージを確認してみると、
渡したcommandパラメーターが間違ったのがわかりました
### 正しい方(SSMコンソールから設定)

```json
{"commands":["pa aux","ls","cd /var/log",""],"executionTimeout":["3600"],"workingDirectory":[""]}
```
### 間違い方(Cloudwatchにコピペー)

```json
{"commands":["pa aux ls cd /var/log "],"executionTimeout":["3600"],"workingDirectory":[""]}
```

commandsの方に全部まとめられて改行なしのメガワンラインコマンドにされました、、

### 解決方法
まずSSMコンソールから実行して、成功したパラメーターからcommands部分をCloudwatchに設定します
React-NativeとReact-Navigationを併用すると、isMounted(...) is deprecatedの警告が表示される + 一時的解決法

React-Navigationを使ってみようとしたら、標題の現象が発生したので、一時的な解決法

## 原因

警告自体はES6の`Class`では使われていない`isMounted`を使用している時に表示するもの。

しかし、`React-navigation`で使われているクラスには`isMounted`が使用されていない。
どうやら原因は`React-native`側にあるみたいで、警告が発生するべきではない自体でも発生してしまっている。

次リリースの`.56`では解決されている模様。

## 一時的解決法

以下の記載を`index.js`または`App.js`に加えれば、この警告が表示されても、アプリの画面上では表示されないように出来る。
警告自体は`Console`上に表示されたまま。

```js
import { YellowBox } from 'react-native';
YellowBox.ignoreWarnings(['Warning: isMounted(...) is deprecated']);
```

## 参考
[React-Native Issue #18868](https://github.com/facebook/react-native/issues/18868)
Oculus Go&Oculus Questの提供元不明のアプリの削除方法

Oculus Goにapkからインストールされたアプリや自作のアプリの削除方法です。
#本題
adbを使ってアンインストールします。
##１.まず削除したいアプリのパッケージ名を調べる or 思い出す
Unityだと
```「ファイル」→「ビルド設定」→「プレイヤー設定」→「その他設定」→「識別」→「パッケージ名」```
にあります。
もしくはadd shellから

```
pm list package
```
もしくは

```
adb shell pm list package
```
を利用して該当するパッケージを探してください。
##2.アンインストール
  コマンドプロントやターミナルに以下のように入力します。

```
adb uninstall パッケージ名
```
あとはEnterキーを押せばアンインストールされます。
Amazon SageMakerのノートブックインスタンス画面でのエラー

# 1. まとめ

Amazon SageMakerのノートブックインスタンス画面にて「Throttling Exception」と表示されることがある．短い間隔で複数のインスタンスの開始や停止を実施すると表示されることがある．

# 2. 目次

- 1. まとめ
- 2. 目次
- 3. 事象
- 4. 解決方法
- 5. 原因
- 6. 参考リンク

# 3. 事象

短い間隔で複数のインスタンスの開始ボタンをクリックしたり，停止ボタンをクリックすると下記エラーメッセージが表示される．

```
ThrottlingException
Rate exceeded
```

<img width="1336" alt="image_001.png" src="https://qiita-image-store.s3.amazonaws.com/0/262328/76269f5e-0183-3f6e-bcc9-e411f886df6c.png">

# 4. 解決方法

短時間に開始ボタンをクリックしたり，停止ボタンをクリックしない

# 5. 原因

短時間の間に開始できるインスタンス数，停止できるインスタンス数を制限しているものだと思われる．

# 6. 参考リンク

なし
XCodeのVersionを更新したらReact-Nativeでreact-native run-iosをしても失敗してしまう

React-nativeでの開発中に少し躓いた為備忘録。

##概要

今朝、React-NativeのプロジェクトにてiOSのテストをしようと思い、`react-native run-ios`のコマンドを打った所、以下のエラーが出てきてエミュレータが起動しなかった。

```bash
Could not parse the simulator list output
```

まだプロジェクトに変更を加えていなかった為、原因がわからず少し躓いていたのだが、どうやら先日、XCodeのVersion 9.4.1に更新した後、一度もXCodeを開いていなかった事が原因ぽい。

## 解決法

XCodeを起動したら、必要なソフトのインストールを促されたので、インストールして、再度`react-native run-ios`のコマンドを打ったら、正常にエミュレータが起動した。
Anacondaを利用してブラウザテスト環境を構築する

初投稿です。日本代表を応援しながら、現在社内で進めている自動化プロジェクトについてまとめていきたいと思います。


# 環境について
- PC : win10 64bit（OSは2018/07/03 現在最新）
- Python Package : [anaconda3.5.2](https://www.anaconda.com/)
- editor : [VS code](https://code.visualstudio.com/)

---

## Anacondaのインストール
1. 言われるがままにインストールします。PATHを通すか否か、のチェックボックスがありますが、
*not recommend* ですので、あとで設定します。


2. インストールが成功したら、Anaconda Prompt をメニューバーから起動し、 
```print("Hello, world.")```  を入力し、pythonが問題なく作動していることを確認します。

3. Anaconda Navigatorを起動し、Environment からSeleniumをインストールします。
デフォルトはインストールされていませんので、 Not installed を選択肢、Seleniumを検索しましょう。

 <img width="1119" alt="スクリーンショット 2018-07-03 3.52.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/266495/9922ce2b-5b38-6592-d937-a9ddaa8b88f0.png">


## VS codeのインストール
こちらも言われるがまま。welcomeページにpythonの拡張機能インストールしましょ、画面がありますので、ポチっとしておきます。
さきほどスキップしたPATHですが、pythonファイルを開くか、新規ファイルを開き、右下のプレーンテキストと書かれている言語モードをpythonに切り替えると、サイドバー（下にあるのにサイドバー）に*Select Python Environment*
<img width="330" alt="スクリーンショット 2018-07-03 3.55.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/266495/9f629abf-ca0d-5622-3d98-8376ea0023b1.png">
と表示されますので、ここをクリックし、ナビバーに環境が表示されますので、Anaconda3.5.2 を選択しましょう。

## Chromedriver のインストール
テストの中ではGoogle Chromeをブラウザとして使いますので、[ChromeDriver](http://chromedriver.chromium.org/downloads)をインストールしておきます。

## Let's test
```
from selenium import webdriver

#chromedriverの場所を指定
driver = webdriver.Chrome("C:****")
driver.get("https://www.yahoo.co.jp/")
```
これでヤフーが起動すればオッケイです。
Happy Code Life!
PEP 553 -- Built-in breakpoint()を試してみた

Python3.7の新機能、breakpoint関数を試してみた。

[PEP 553 -- Built-in breakpoint() | Python.org](https://www.python.org/dev/peps/pep-0553/)

breakpoint関数を呼び出した時点でデバッガになる。

``` Python3
for i in range(5):
    print(i)
    breakpoint()
```

上記の実行例。
変数の値を見たり、continueで次に進める。

```
C:\Users\xxx\PycharmProjects\python3_7\venv\Scripts\python.exe C:/Users/xxx/PycharmProjects/python3_7/break_test.py
0
> c:\users\xxx\pycharmprojects\python3_7\break_test.py(2)<module>()
-> for i in range(5):
(Pdb) continue
1
> c:\users\xxx\pycharmprojects\python3_7\break_test.py(2)<module>()
-> for i in range(5):
(Pdb) i
1
(Pdb) continue
2
> c:\users\xxx\pycharmprojects\python3_7\break_test.py(2)<module>()
-> for i in range(5):
(Pdb) i
2
(Pdb) 
```


環境変数のPYTHONBREAKPOINTに0を設定することで、デバッガを無効にできる。
また、PYTHONBREAKPOINTに実行する関数を設定することもできる。

``` Python3
def break_func():
    print('break!')


if __name__ == '__main__':
    for i in range(5):
        print(i)
        breakpoint()
```

PYTHONBREAKPOINTにbreak_test.break_funcを設定すると、breakpoint呼び出しでbreak_func関数が実行される。
以下、実行結果。

```
C:\Users\xxx\PycharmProjects\python3_7\venv\Scripts\python.exe C:/Users/xxx/PycharmProjects/python3_7/break_test.py
0
break!
1
break!
2
break!
3
break!
4
break!

Process finished with exit code 0
```

環境変数を使わずに、以下で関数を指定することも可能。

``` Python3
import sys
sys.breakpointhook = break_func
```

なお、デバッガでどういったコマンドが使えるかは、以下を実行すると確認できる。

``` Python3
import pdb
pdb.help()
```

またはデバッガでhelpコマンドを打つことでも確認できる。
node_modules以下を大量に git add してしまった場合の覚書

くっそ基本的なことだけど...

## .gitignore ファイル作成
中身に

```
node_module/
```

てだけ書いてsave
コミットしたくないファイルは .gitignoreに書いていく

## アンステージ処理

```
git rm -r --cached node_modules  
```
でステージにあげてしまったnode_modules以下をアンステージ出来る

## 最後に.gitignoreファイルをコミットして終了

```
git add .
git commit 
```
nkfコマンドでファイルの文字コードを変換する方法

# はじめに
作成したCSVファイルが文字化けしてしまったときのためのメモ
（CSVファイルでなくても変換されます。）

## nkfコマンドのインストール
sudo apt install nkf

## CSVファイルの文字コードの変換
--overwrite (指定したファイルに上書きされる)
### shift-jisへ変換
nkf -s --overwrite ファイル名.csv
### EUCへ変換
nkf -e --overwrite ファイル名.csv
### utf-8へ変換
nkf -w --overwrite ファイル名.csv

## 文字コードの確認
nkf -guess ファイル.csv
git clone 後のlaravelの設定

# gitからlaravelをcloneした後の設定方法のメモ

## composerをインストールする。
composer install

## 権限の変更
chmod -R 770 storage/
chmod -R 770 bootstrap/cache/

## envファイルの作成
cp .env.example .env

## APP_KEYの設定
php artisan key:generate


これで、welecomページが表示される。
【Atom・Chrome】行数を指定してファイルを開く

たまに使う操作だが探してみると（探し方が悪いのか）出てこなかったので投稿
Windows版
# Atomでファイルを開く際に行番号指定
Atomではプロジェクト内のファイル名を指定して開くショートカット`ctrl + p`が存在する。
この時、`[ファイル名]:[行番号]`と指定すると、その行数にカーソルがあった状態でファイルを開いてくれるのだ。
`hoge.js:500` → hoge.jsの500行目
# ChromeDevelperToolでも使える
同じ操作がGoogleChromeの開発者ツール DevToolsでも使用できる。
`ctrl+p`で入力欄を開いてから`[ファイル名]:[行番号]`で、ソースのファイルを行番号指定で開ける。
気づかないだけでいろいろなエディターのデファクトスタンダードな表記方法なのかもしれない。
# 入力があいまいでも使える
`:[行番号]`はファイル名が完全でなくともきちんと効く。
ファイル名指定は一番ファイル名が近いものをサジェストとして表示してくれていて、サジェストの一番上のものが選択されるため、入力中に表示したいファイルが一番上に来た時点で:を入力して問題ない。
同様の名前が少なければ`ge:500` → hoge.jsの500行目 のような事もできる。
# 行ジャンプはctrl+gで
既に開いているファイルの行番号で移動したい場合は、どちらも`ctrl+g`のショートカットの方が早いので、そちらを使用するよう注意する。