OmniAICreator/Qiita-1.07M huggingface dataset:
API Gateway Patternとは何なのか？

http://microservices.io/patterns/apigateway.html を読んだ。思考の整理がてらにまとめようと思う。

## マイクロサービスアーキテクチャーとは
API Gateway Patternは基本的に対象とするサービスがマイクロサービスアーキテクチャーで構成されている場合に適用できる。
サーバーサイドエンジニアとして会員制のECサイトを構築する場合を考えてみよう。このサービスはWebブラウザ、スマートフォンアプリからアクセスすることが想定されており、また第三者向けにAPIの提供も予定されている。また、開発されたAPIは他のAPIから呼び出される事も想定されている。この際、問題として、どのようにアーキテクチャーを構成するのがベスト・プラクティスであるのかという問題が浮かび上がってくる。そのベスト・プラクティスの一つがサーバーレスアーキテクチャーである。
個々の機能を構成する関数は疎結合であり、互いに影響を及ぼすという場合、サービスのバックエンドはこれらの関数の集合と考えることが出来る。マイクロサービスアーキテクチャーとは、「それぞれの個々の関数が独立して開発され、デプロイされるべきである」という、一つの設計パターンなのである。なお、それぞれの関数は、個々の関数の独立性を高めるために、それぞれ異なったデータベースを保持する。サービス間のデータの一貫性はSaga Patternと呼ばれるデザインパターンによって成し遂げられる。らしい。

## で、API Gateway Patternって結局何なのか?
先程提示したECサイトの場合、あらゆるインターフェースからのアクセスを想定している。この場合、Webブラウザからアクセスする場合はサーバーサイドでHTMLを返却するように、スマートフォンアプリからアクセスする場合はREST APIから返却するデータを基にスマートフォンアプリ側で情報を整形して表示するという形になる。マイクロサービスアーキテクチャーを採用する大規模なECサイトの場合、情報を取得するために多くの関数を呼び出す必要がある。この場合、どのようにすればクライアントサイドからマイクロサービスアーキテクチャーで構成された個々の関数を呼び出すのがベスト・プラクティスなのかという問題が発生する。この問題の一つの解決策がAPI Gateway Patternだと言える。AWSを用いたアーキテクチャーが以下のようになる。


![Draw.png](https://qiita-image-store.s3.amazonaws.com/0/163803/1dd4c8df-a5f0-080e-54ba-27d9ff924b26.png)



API　Gateway　Patternは、すべてのインターフェースを含むクライアントサイドとデプロイされた関数の間にAPI Gatewayと呼ばれるエントリーポイントを設置するというAPIの設計方法である。クライアントサイドからAPI Gatewayに設置されたAPIをコールし、API　Gatewayにマイクロサービスアーキテクチャーで構成された複数の関数にアクセスさせる。API Gatewayはクライアントサイドから見てサーバーサイドAPIの透明性を高めるために設置された中継機器だと捉える事が出来る。
インターフェース毎にそれぞれ異なったAPI Gatewayを用意するというアーキテクチャーもAPI Gateway Patternの変則パターンとして存在する。
なお、API Gatewayを採用する場合、関数への中継を果たすために、以下の性質を持つ。

- Client-side Discovery PatternやServer-side Discovery Patternといったものを用いる。
- API Gatewayはユーザーの認証情報をアクセストークンという形で保持する事が多い。
- API Gatewayは個々の関数を起動するために、Circuit Breakerと呼ばれるものを使用する。
- API GatewayはAPI Composition Patternに則って実装される。

今回説明しなかったパターンに関しては後ほどの記事でまとめたい。
SharePointサイトのアクセス権限にグループを使用する

## はじめに
SharePointサイトのページではグループのアクセス権限が設定できないです。たぶん。
人ごとの追加はできるけれど、グループは追加できない模様。

## 手順
SharePointサイトの最初のページの右上の歯車マークをクリックして、「サイトのアクセス許可」をクリック
<img width="243" alt="" src="https://qiita-image-store.s3.amazonaws.com/0/245365/6758c9c7-ced3-ca58-4cc0-ee30e3e815c2.png">

以下のようになるので、下部の「高度なアクセス許可の設定」リンクをクリック。
![](https://qiita-image-store.s3.amazonaws.com/0/245365/50f70615-b56d-4e54-890d-a3724b6674e2.png)

以下のような画面が表示されます。
<img width="943" alt="スクリーンショット 2018-03-26 23.42.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/245365/e5dd1c67-5670-fb9d-9c4e-a7ac91a8d6d0.png">
サイトのデフォルトの権限にはメンバー、閲覧者、所有者がありますが、今回はメンバーにグループを追加してみます。

「Team site メンバー」リンクをクリックすると以下のようになります。
![](https://qiita-image-store.s3.amazonaws.com/0/245365/90e79032-6534-85d6-652d-58b0e861fcd8.png)
ここで「新規」をクリックして「ユーザの追加」をクリックします。
<img width="355" alt="" src="https://qiita-image-store.s3.amazonaws.com/0/245365/cd2f45da-6747-2c3a-ed2d-45b390133c75.png">

以下のようなダイアログが表示されるので、グループのアドレスかグループ名を入力してみます。
<img width="617" alt="" src="https://qiita-image-store.s3.amazonaws.com/0/245365/a9fd1d62-c403-7121-6207-4145366e391f.png">

ここではグループ「ほげ」を入力してみました。入力後少し待てば候補の一覧が表示されるはずです。入力したら「共有」をクリックします。
<img width="448" alt="" src="https://qiita-image-store.s3.amazonaws.com/0/245365/b95c7d3f-93bc-97aa-c3ed-9ca02d446139.png">

そうすると一覧のページに戻ります。先ほど追加した「ほげ」グループが追加されています。
「ほげ」グループのメンバーには招待メールが送信されています。
(2020/8/13追記)
「オプションの表示」をクリックするとメール通知するか否かを選択することができ、招待メールを送らないこともできます。
![](https://qiita-image-store.s3.amazonaws.com/0/245365/167483a8-6d84-a2d7-059d-e22eaa0ba583.png)
簡易テンプレートエンジン extcat coneta #1 

#**簡易テンプレートエンジン**

　簡易テンプレートエンジンを作りました。
　テンプレートエンジンというのはおおげさですが、「テンプレートと呼ばれる雛形と、あるデータモデルで表現される入力データを合成し、成果ドキュメントを出力する」という要件を満たしています。　※　[wikipediaテンプレートエンジン](https://ja.wikipedia.org/wiki/%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%B3)
　最初に種明かしをすると、実装は、catのヒアドキュメントにテンプレートを埋め込んでいるだけです。
　なお、ヒアドキュメントは「コマンド置換」も行われますので、使用するときは注意が必要です。









#**使用方法**
#####**【実行】**

~~~
【テンプレートを引数で指定する】
　extcat [file [file]...]

【テンプレートを標準入力に流し込む】
  cat file | extcat
~~~

#####**【テンプレートファイルの例】**
~~~
日付:`date +"%Y %m/%d"`
場所:$(cd /tmp;pwd)
HOSTNAME:${HOSTNAME}
SHELL:${SHELL}
TERM:${TERM}
LANG:${LANG}
~~~
#####**【実行結果】**
~~~
日付:2018 04/15
場所:/tmp
HOSTNAME:localhost.localdomain
SHELL:/bin/bash
TERM:xterm
LANG:ja_JP.UTF-8
~~~

#**実装**

~~~sh:extcat(sh&nbsp;script&nbsp;version)
#!/bin/sh
 cat <<^D | sh
 cat <<^D2
`cat $@`
^D2
^D
~~~

　この実装は大概のshで動きます。 
　ヒアドキュメントのデリミタ^Dは「こんととろーるでぃー、EOT(0x04)」ですが、文字「^」と文字「D」からなる文字列「^D」でも動きます。
　いずれにしても、デリミタの行と同じ内容はヒアドキュメントの途中に書けません。ヒアドキュメントの終了と見なされるからです。

~~~bash:extcat(bash&nbsp;script&nbsp;version)
#!/bin/bash
bash <<< "cat <<< "\""$(cat $@)"\"""
~~~

　この実装は、ヒアドキュメントの代わりにヒアストリングを使用しています。動作確認はbashで行いました。

~~~bash:extcat(bash&nbsp;function&nbsp;version)
function extcat () { cat $@ | bash <<< "cat <<< "\""$(cat)"\""" ; };export -f extcat
~~~

　この実装は、bashのfunction版です。bashのプロンプトで実行すれば、スクリプトを配置しなくても使えます。


#**どうでもいい話**

　extcatは当初Bourne shellで作りました。
　以下はオリジナルバージョンです。

~~~sh:extcat(Bourne&nbsp;sh&nbsp;version)
#!/bin/sh
 cat <<^D | sh
 cat <<^D
`cat $@`
~~~


　Bourne shellのヒアドキュメントは、デリミタまたは「ファイルの終了」で終わるため、デリミタを省略することができました。※solaris10のshで確認

　`cat <<^D | sh` は `sh <<^D` と書いても機能は同じです。むしろ立ち上がるプロセスが１個少なくなるので、こちらの方がよい実装です。
　ただ、cat3行が並ぶ姿が美しく、こちらの方を使っていました。

　以上どうでもよい話でした。

#**環境**


ホスト　Windows10 COREi7 
VM　　　VirtualBox バージョン 5.2.8 r121009 (Qt5.6.2)
　　　　　CentOS Linux release 7.4.1708 (Core)
　　　　　3.10.0-693.21.1.el7.x86_64 #1 SMP Wed Mar 7 19:03:37 UTC 2018
GNU bash, バージョン 4.2.46(2)-release (x86_64-redhat-linux-gnu)
【Unity】カラーパレットをコードから使いたい

#Unity のカラーパレット
Unity で Text や Image の色を選択するときに、カラーパレットを作成・利用することができます。
（公式ドキュメントではカラープリセットライブラリと呼ばれています）
（ちなみに拡張子は .colors です）

[プリセットライブラリ - Unity マニュアル](https://docs.unity3d.com/jp/current/Manual/PresetLibraries.html)

このカラーパレットは、
User Preferences フォルダまたは Assets/Editor フォルダに配置され、
エディタ上で作業する分には問題なく使えますが、
実行時にコードからこのパレットを直接参照する、ということができません。
試しに Editor フォルダ上のものを Resources フォルダに移動させて Resources.Load() で…とやってみようとしましたが、
怒られました。


そこで、カラーパレットの情報を ScriptableObject にコピーして保持すればよいのでは？ と考えました。

#カラーパレット保存用クラス
```ColorPallet.cs
using UnityEngine;
using System;
using System.Collections.Generic;

public class ColorPallet : ScriptableObject {
	[Serializable]
	public class Pallet
	{
		public string name;
		public Color color;
	}

	public List<Pallet> list = new List<Pallet>();

	//---------------------------------------------------
	// パレットから色を取得
	//---------------------------------------------------
	public Color Get(string name)
	{
		var data = list.Find(x => x.name == name);
		if (data != null)
		{
			return data.color;
		}
		return Color.white;
	}
}
```
色とそれに対応する文字列を格納すると想定し、
その文字列で色を取得できるようにしてみました。

#ScriptableObject 作成用クラス
↓このファイルは Editor フォルダに置いてください。

```ColorPalletCreator.cs
using UnityEditor;
using UnityEngine;

public static class ColorPalletCreator {
	const string DST_PATH = "Assets/ScriptableObjects/ColorPallet.asset";
	const string ORG_PATH = "Assets/Editor/ColorPallet.colors";

	//---------------------------------------------------
	// ScriptableObject 作成
	//---------------------------------------------------
	[MenuItem("Tool/Create ColorPallet")]
	static void Create()
	{
		ColorPallet asset = AssetDatabase.LoadAssetAtPath<ColorPallet>(DST_PATH);
		if (asset == null)
		{
			asset = ScriptableObject.CreateInstance<ColorPallet>();
			AssetDatabase.CreateAsset(asset, DST_PATH);
		}

		var presetObj = AssetDatabase.LoadAssetAtPath<UnityEngine.Object>(ORG_PATH);
		var so = new SerializedObject(presetObj);
		var property = so.FindProperty("m_Presets");
		for (int ii = 0; ii < property.arraySize; ++ii)
		{
			// カラーパレットからデータを取得
			var element = property.GetArrayElementAtIndex(ii);
			var data = new ColorPallet.Pallet()
			{
				name = "Color_" + ii,
				color = element.FindPropertyRelative("m_Color").colorValue
			};

			// ScriptableObject にデータを格納
			asset.list.Add(data);
		}
	}
}
```

これで Unity のメニューバーから Tool > Create ColorPallet を選択すると、
Editor フォルダ内のカラーパレット ColorPallet.colors を元にして ScriptableObjects フォルダに ScriptableObject の ColorPallet.asset を作成します。

あとはこの ScriptableObject にコードからアクセスすればパレットの色を使える、という感じです。
IBM Cloud Internet Services (CIS)を使ってみた（TLSオプション）

#はじめに

下記の続きです。
https://qiita.com/y_tama/items/9151b4c981abbb65c53d

CISのTLSオプションを使って、下記の通信の暗号化について制御し、ウェブサイトのセキュリティを向上させられます。

・エンドユーザーとCIS間の通信
・CISとオリジンサーバー間の通信

CISのTLSオプションには下記の4種類があります。下に行くほどセキュアになります。

| TLSオプション   |  エンドユーザーとCIS間 |  CISとオリジンサーバー間   |備考  |
|:-----------------|------------------:|:------------------:|:------------------:|
| Off   |  No |        No        |  HTTP通信  |
| Client-to-Edge           |  Yes |   No  |CISとオリジンの間は暗号化されない  |
| End-to-End flexible  |  Yes |  Yes(自己署名証明書)  | DNSのオリジンのレコードが適切であればセキュア |
| End-to-End CA signed   |  Yes |   Yes(CA署名証明書)  | 最もセキュア |

参考：
https://console.bluemix.net/docs/infrastructure/cis/ssl-options.html#tls-options
https://support.cloudflare.com/hc/en-us/articles/200170416-What-do-the-SSL-options-mean-

本番業務で使う際は、最もセキュアな一番下の「End-to-End CA signed」が妥当と思いますが、下から2番目の「End-to-End flexible」は追加費用がかからずEnd-to-Endで暗号化できるため、開発・検証であれば悪くない選択肢に見えます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/59627/0c0b01a7-c603-2f1a-5f6c-143976a3c3a1.png)

このオプションの良いところは、エンドユーザーとCIS間の通信には、CISが提供する署名済みの証明書が使用されるため、ユーザー側のブラウザには自己署名証明書の警告メッセージが出ない点です。このオプションの場合、オリジンサーバーには自己署名照明を使うのでCISには警告メッセージが届いているはずですが、CISがこれを無視するので、ユーザーは裏で自己署名証明書が使われていることを意識しません。

今回は、この「End-to-End flexible」オプションを試してみます。

#End-to-End flexibleオプションの設定
CISのSecurityのページで、「End-to-End flexible」を選択します。CIS側で、自身のドメインに対する証明書が用意されます。この証明書が、エンドユーザーのブラウザとCIS間の通信で使われます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/59627/963bf244-645b-d689-f5b2-3e933280b7a2.png)

#オリジン側に証明書を設定

オリジンサーバー側は、自己署名証明書を作成します。
探せば多くの情報が見つかるので詳細は省きますが、Linux上でopensslコマンドでサーバーの秘密鍵と自己署名証明書を作成しました。

今回は、オリジンサーバー側はIBM Cloud Load Balancer（と、その配下のウェブサーバー）なので、Cloud Load Balancerに、作成した自己署名証明書を配置し、そこで復号する構成とします。（Cloud Load Balancerとウェブサーバー間は、PrivateネットワークをHTTPで通信。）

管理ポータルのSecurity>SSL>Certificatesで、作成した自己署名証明書をインポートします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/59627/df071fb2-8f20-b182-4fcc-8ddddbe1fd51.png)

自己署名証明書と、サーバー秘密鍵の情報をペーストし、Submitします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/59627/5012693d-ff21-87d1-1422-53cb23715c31.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/59627/bc82a1a9-b7aa-ebb1-72ab-7509771fe6c4.png)

Cloud Load Balancerで、HTTPSをプロトコルとして追加し、今、追加した自己署名証明書を選択します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/59627/1963ddf7-9633-30ec-178a-6d2712ac973c.png)

#アクセスして確認

ブラウザから、Cloud Load BalancerのFQDNにアクセスすると、想定通り、自己署名証明書についての警告メッセージが出ます。例外に追加すると、ウェブサーバーのコンテンツにアクセスできます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/59627/0a1feda5-6c07-6de7-af99-674366707ef2.png)

次に、CIS経由にするために、自身のドメインを指定してアクセスすると、特に警告メッセージが出ることなくコンテンツにアクセスできます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/59627/e0da0462-aac8-b55d-8e17-c0aaf208ae24.png)

エンドユーザーのブラウザとCIS間は、COMODOの証明書が使われていました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/59627/5ad84a96-e11b-76ae-2194-d88c32631e0b.png)

ということで、End-to-EndのTLS化が可能な「End-to-End flexible」オプションを試しました。
本番業務で使う際は、CA署名の証明書を使う「End-to-End CA signed」が妥当と思いますが、開発・検証であれば「End-to-End flexible」は追加費用もかかりませんので、選択肢に含めてもよいかもしれません。
Macにzshをインストール(oh-my-zshを入れるまで)

# 概要

bashを今まで使っていたが、zshを試しに使ってみようとなったので、入れてみた。


# 環境

#### HomeBrew: 1.6.0
#### OS: macOS High Sierra 10.13.4

# 手順

## 1. zshをインストール

```zsh
$ brew install zsh
```

### zshがインストールされたことを確認する

```bash
$ which zsh
/usr/local/bin/zsh
```



## 2. zshのパスを追加

shellで何を使うかを管理している「/etc/shells」にzshのパスを追加。
すでにある場合は不要。

```bash:パスを追加する際のコマンド
$ sudo sh -c "echo '/usr/local/bin/zsh' >> /etc/shells"
```

'/usr/local/bin/zsh' => これは1. においてwhichで出力されたパス。


## 3. デフォルトのシェルを変更

```bash:シェル変更のコマンド
$ chsh -s '/usr/local/bin/zsh'
```

## 4. oh-my-zshをインストール

### oh-my-zshとは

zshを色々便利にしてくれるcommunity-driven framework。
便利なので入れている人も多い。
同じようなzshのものだとPreztoなどもあるが、
こちらの方が日本語の資料が多いかも。

### .zshrcとは

「.zshrc」はシェルのコマンドを自作したりするときに使用するファイル。
これがないと色々メッセージが出てくるので作成しておくと良い。
ちなみにターミナルでデフォルトで使われているbashには「.bashrc」というのがある。
おいてある場所は基本的にユーザのホームディレクトリ。

```bash:oh-my-zshをインストールするコマンド
sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"
```

#### 注意

oh-my-zshを入れると基本的にシェルの立ち上げが遅くなったりするので、vimで開発する人には不向きかも。別のエディタを使う人は問題なく利用できると思われ。

## シェルを再起動

シェルを再起動することで設定が反映される。再起動してレッツzshライフ！

# インストールコマンドまとめ

```bash:インストールコマンドまとめ
brew install zsh
sudo sh -c "echo '/usr/local/bin/zsh' >> /etc/shells"
chsh -s '/usr/local/bin/zsh'
sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"
```

# 参考

[Zsh Documentation](http://zsh.sourceforge.net/Doc/)
[oh-my-zsh(GitHub)](https://github.com/robbyrussell/oh-my-zsh)
[Unity] Vector3.Lerpの使い方

今回はUnityの `Vector3.Lerp()` について説明をしたいと思います。
私自身初めてこの関数を使うに至ったので、備忘録的な感じのまとめです。

[この記事の対象者]
・Unity初心者 / 中級者
[この記事の目的]
・Vector3.Lerp( )ってどんな関数？なにができるの？

それでは始めていきましょう！


# **Vector3.Lerp( )ってなに？**

直線上にある２つのベクトル間を補間する関数です。

```cs
Vector3 pos = Vector3.Lerp(a, b, t);
```

のように使います。t で a と b の間を補間します。

【パラメータ】
　a : 始点となるベクトル位置（型：Vector3）
　b : 終点となるベクトル位置（型：Vector3）
　t : 両端の距離を1とした時の割合（型：float, 0~1の範囲のみ）
この時変数`pos`にはベクトル`a`とベクトル`b`の間の距離に対する、ベクトル`a`からみて割合`t`の位置が代入されます。

![図1.jpg](https://qiita-image-store.s3.amazonaws.com/0/250456/1b5ff427-583f-951d-0dc2-74a6a9055e00.jpeg)

この関数を知っていると計算処理の応用がききそうですね！
みなさんもぜひこの関数を使ってみてください！


### [参考文献]
[Unity スクリプトリファレンス Vector3.Lerp](https://docs.unity3d.com/ja/2017.3/ScriptReference/Vector3.Lerp.html)
pyenvでinstallが見つからなかった

pyenvでpythonをinstallしようとするがinstallのみが発見できない...めっちゃ悩んだ...

```
$ pyenv 
pyenv 1.2.3-45-g63c4b7f
Usage: pyenv <command> [<args>]

Some useful pyenv commands are:
   commands    List all available pyenv commands
   local       Set or show the local application-specific Python version
   global      Set or show the global Python version
   shell       Set or show the shell-specific Python version
   rehash      Rehash pyenv shims (run this after installing executables)
   version     Show the current Python version and its origin
   versions    List all Python versions available to pyenv
   which       Display the full path to an executable
   whence      List all Python versions that contain the given executable
$ pyenv install --list
pyenv: no such command `install'
```

## 解決法
cloneし直す。考え直してみると、あ、はいと言う感じ。

```
$ rm -rf ~/.pyenv
$ git clone https://github.com/pyenv/pyenv.git ~/.pyenv         
```
Spring boot applicationのpropertiesファイルに環境変数の設定方法

keyword: PropertyPlaceholder
色んなことできるらしいが、今回はDeploy後、サーバーで設定した環境変数を使いたいです。
書き方は簡単です。下記のように書き換えれば終わります。

```
spring.datasource.url=jdbc:mysql://localhost:3306/test
↓
spring.datasource.url=jdbc:mysql://${RDS_DB_HOST}:${RDS_DB_PORT}/${RDS_DB_NAME}
```

Eclipseから実行時は、`VM arguments`か`Programe arguments`どっちでも大丈夫みたいです。

```java:VM_arguments
-DRDS_DB_HOST=localhost
-DRDS_DB_PORT=3306
-DRDS_DB_NAME=test
``` 

```java:Programe_arguments
--RDS_DB_HOST=localhost
--RDS_DB_PORT=3306
--RDS_DB_NAME=test
```
【JavaScript】連想配列の最後の要素を削除する方法。

連想配列の最後の要素を削除する方法の備忘録です。

普通の配列の場合はpopメソッドを使って削除すればいいだけだと思いますが、連想配列の場合はそうはいきません。
for..in文を使ってループして最後の要素のキーを抜き出してもいいのですが、コードが無駄に長くなると思ったので、今回はObject.keys()を利用することにしました。

### **追記**
Object.keys()メソッドやfor...in文はキーの値が整数値として解釈できる場合、そのキーを優先的に配列に格納するようです。なので、キーが'1'や'2'という値の場合は最後に追加された要素などでも他の要素より先に格納されてしまうケースが出てきてしまうみたいです。
従って、下記の方法はキーが整数値として解釈されない文字列だけで構成されている場合のみ有効ということになります。キーに整数値が含まれてしまう可能性がある場合は、別途配列でキー値を管理したりする必要があるかと思います。

## **lengthで要素数を取得して削除する方法**
Object.keys()は引数で渡されるオブジェクトのキー名を配列で返してくれます。
なので、返された配列の要素数をlengthで取得し、最後の要素の値を使うことで連想配列の末尾のキーを指定して削除することができます。


```javascript
let as_array = {'key1':'hoge1','key2':'hoge2','key3':'hoge3'}
let keys_array = Object.keys(as_array);
let len =  keys_array.length;
delete as_array[keys_array[len - 1]];
```
## **popメソッドを利用して削除する方法**
こちらは、popメソッドの戻り値を利用した方法です(最初の２行は上記と同じです)。
popメソッドは配列の最後の要素を削除し、その削除した値を戻り値として返します。
それを利用して、popメソッドから返された値をキーにして連想配列の末尾を削除することができます。

```javascript
let as_array = {'key1':'hoge1','key2':'hoge2','key3':'hoge3'}
let keys_array = Object.keys(as_array);
let last_ele = keys_array.pop();
delete as_array[last_ele];
```
## **ちなみに**
上記の二つの処理をループさせてベンチマークテストをしてみたところ、1回〜100回ではあまり速度に差はなかったですが、10000回ループさせた場合はpopメソッドを使った方法の方が速かったです(平均0.05秒くらい)。
Python入門（別言語から）

# 【前置き】
今週のアウトプット、Python環境を作ろう。
現在生きてるシステムは2.x系と3.x系らしいが、2.xはサポート終了宣言もあり、今から手を付けるには3.x系を習得するのに重きを置くほうがよろしいかと思います。
で、なんで開発環境を作ろうとしているかというと、AWSのcloud9でぽちぽちしていたのだが、初期設定が2.x系、参考書が3.x系で何かと互換性が切れて捗らない！！一応3.x系に切り替えては見たものの、やはり専属のIDEを使った方が間違いなく捗るので作りましょう。

って事でまずはpythonをインストール・・・、
と見せかけてAnacondaのインストールをしましょう。
https://www.anaconda.com/download/

インストール方法は先人達がいろいろ残して頂けてるのでQiitaで調べてみましょう。
このAnacondaってそもそも何者なんだって話からで。
若干表現しにくい所もあるんですが、JAVAでいうjavaEEみたいなもので、通常のpythonによく使われる機能がデフォで投入されているパッケージらしい。必要になったときプロジェクトとかで認識あわせつつ使うようにして下さい。

IDEはPyCharmを使用します。
https://www.jetbrains.com/pycharm/
javaってる人ならintelliJという名前を一度は聞いた事があると思うが、jetbrain製のIDEでコード補完機能とか素晴らしいらしい。community版（無料）とpro版（有料）がある。一度intellijのcommunity版を使ってみたが流石に機能制限がきつくてeclipseの方がいいね、ってなった以来、久々のjetbrain製品。

日本語化については先人のお知恵を拝借して行いましょう。
https://qiita.com/suecharo/items/4d8774b43b0213527f9f

# 【pythonメモ】
最近いろんな言語に触れる機会があり、マスターとは言わないが大体の傾向は見えてきた。
言語の中で動的型付けと静的型付けという分類があり、両方ともなんとなく使えれば同じ系統の言語ならそこまで苦労せずとも取得出来ると思われる。各言語主要の処理は大体同じで、後は微妙な書き方の違い、方言のようなものだと思う。変数用意してループして条件によって足し算して合計を出力って処理が思いつくプログラマーなら後は書き方の問題だけだという話。世の中いろんな言語が乱立しており、転職とかしてる（フリーランスしてる人とか）とジャストミートな経験値を求められたりするけどもそんなパーフェクトマッチャーはいないと思う。だからこそ両者とも意識をあわせる必要ある所かなぁと。

【主要な処理】
・変数の型桁
・条件分岐
・ループ
・リスト・マップ・配列
・関数
・クラス
・継承
・カプセル化
・例外処理

私が大体こういうのあるよねってのをざらっと書き出したもの。
どの言語も書き方は違うとはいえ大体こういう感じのはある。
そこに各言語の書き方を当てはめればいい。今回使用した教材はこちら。
みんなのPython 第4版
https://www.amazon.co.jp/%E3%81%BF%E3%82%93%E3%81%AA%E3%81%AEPython-%E7%AC%AC4%E7%89%88-%E6%9F%B4%E7%94%B0-%E6%B7%B3/dp/479738946X

まだ読みきってないが西住みほとか作者の趣味丸出しで、悪くない、悪くないが万人受けするかって言われるとどうかと思う。私は一向に構わん（ｷﾘｯ
レビューとかを見るとpythonだけならAnacondaじゃなくてもいいとか言われてて若干涙目、、、そういう所は言語の初心者にはわからない所ですね。

上記法則にしたがってまとめていこうかと思いましたが、読み切ってないので少しためます。
大きい特徴と言えば。インデントがネストを表すって所でしょうか。
他の言語だと｛｝で括れば中身は結構自由に記載出来る感じですが。pythonだとインデントすら意味をもつので適当にやると間違いなくバグります。逆にいうとインデントは誰がどうかいても同じになるので読みやすくはなると思います。
今回はここまで

# 【後書き】
最近Azureを聞いて調べたんですが機能的にAWSの上位互換ぽい？です。
とある企業様でインフラエンジニアいらないんですよという話があり（そもそもAWSやasureを使いこなすにはインフラ要るんじゃないかなぁと思ったり）ターゲットにいれてなかったのでまた覚えるもの増えるなぁって。最終的にフルスタックになるには覚えるしかにぃ。
あとWEB系エンジニアは自主勉そんなにしないという記事をどこぞかで見て、なんでだろうって思ったら業務でみっちりするので帰ってからまたやるってほどもないらしい。ただ土日でやったりする人ももちろんいるって感じなまとめだった。環境って人を育てるんだなぁって感想でした。
Web上で楽譜を扱うライブラリたち

Web上で楽譜を表示できるライブラリたちはたくさんあります。 仕事上、そういうものたちとかかわる機会がありましたので、ここで一度まとめたいと思い記事を書きました。 (全てを使ってみたというわけではないです、悪しからず。) 2018-04 時点 の情報です。

## alphaTab

https://github.com/CoderLine/alphaTab

表示の上では最高にいいと思います。 パートが複数ある場合でも表示可能です。 進捗に合わせてバーを動かすことができます。

ただし、一般的な楽譜形式 Music XML をサポートしていないのが難点です。 [GitHub](https://github.com/CoderLine/alphaTab) では開発中みたいです。


対応している形式は次の3パターンです。

> Guitar Pro 3-5 (gp3,gp4,gp5) – Those files are widely available in the internet. They are created using earlier versions of Guitar Pro (version 3 to 5).
> Guitar Pro 6 (gpx)  – This is the newest file format created by Arobas, the creators of Guitar Pro.
> AlphaTex – AlphaTex is a text based format for writing music notation. It was created for alphaTab to allow people easy writing and storing of music notation.

Guitar Pro は有料ソフトウェアです。

これに関連したプロジェクトとして、 alphaSynth などがあります。

## VexFlow

https://github.com/0xfe/vexflow

ギターのタブ符も扱えます。 

バーを動かすのではなく、音符を動かすサンプルがありました。

MusicXML などの形式で読み込むというより、 音を記述すると表示してくれるというライブラリです。

## OpenSheetMusicDisplay

https://github.com/opensheetmusicdisplay/opensheetmusicdisplay

こちらは VexFlow を用いて Music XML を表示するライブラリです。 なので、楽譜作成ソフトで作成した楽譜ファイルをそのまま表示することができます。

複数パートでも表示可能です。

## Verovio

http://www.verovio.org/index.xhtml

こいつはすさまじいです。 オンラインで楽譜編集までできます。

MusicXML そのものは扱えませんが、 コンバートして使うことができるみたいです。

スポンサーたくさんですね。 お金かかっています。

C++ で作られています。 ライセンスは LGPL。

## abcjs

https://github.com/paulrosen/abcjs

その昔私が楽譜の書ける掲示板を作ったときに使っていたものです。 ABC記法で書かれた楽譜を表示できます。

一般的に 音楽家の間でABC記法は使われていないみたいです。

## abcweb

https://wim.vree.org/js/

MusicXML 及び ABC記法 の楽譜を表示できるライブラリ。

## scorejs

https://github.com/danigb/scorejs

javascript で楽譜を表示できるものです。


## Neon.js

http://ddmal.music.mcgill.ca/neon

ネウマ符などの楽譜編集・表示に使えるライブラリ。
これまで紹介したライブラリとは表示対象が異なります。楽譜ではあるのですが。

## GUIDO

http://www.noteserver.org/salieri/nview/embed_web.html

使うにはちょっと心配なところがありますが、 Javascript で楽譜の書けるライブラリです。

## ngx-score (停止中)

https://bohoffi.github.io/ngx-score/home

現在停止しているプロジェクトです。
楽譜表示ができます。

## さいごに

目的に応じてなにを使うかですが、一般の5線譜を使うなら alphaTab, Verovio がいいと思います。
CommandNotFoundError: Your shell has not been properly configured to use 'conda activate'.

# 原因

conda コマンドを fish shell で実行すると起こるエラーのようです.

[Conda activate is not a valid command #6242](https://github.com/conda/conda/issues/6242)

# 対処法
こちらのファイル [conda.fish](https://github.com/conda/conda/blob/ba75a87a71eb433f63e7297c8de1949fabafe4ce/shell/etc/fish/conf.d/conda.fish) を参考に,

`$ source (conda info --root)/etc/fish/conf.d/conda.fish`

を実行し, `~/.config/config.fish` の最後尾に 
`conda activate` コマンドを実行できようにスクリプトを追加します.

以上です.
Pythonの開発環境をAtomエディタで実装する話

PythonをAtomで書くための環境構築について書いていきます。Pythonに関わる部分だけどを書いていきます（minimapとかそういうのは書かないよって話です）。ちなみに、Pythonの場合にははシンタックスハイライト（命令ごとに色分けしてくれるあれ）はデフォルトで入っているので気にしなくてよいですね。
 * 初稿 2018/04/15
 * 一部誤植の訂正 2019/02/02

# Atomをいじる前にすること
順番はそんなに大切ではないですが、後述するパッケージを実際に使えるようにするために後で動かすアプリケーションの話をします。パッケージだけ入れても「○○がないよ」って怒られて使えなかったりします。

## 取り合えずPython環境
PythonをAtomで書こうと思っている人がここをやってないわけがないかとは思いますが…。
特にこだわりがなければ、Anaconda入れておけばいいと思います。[ダウンロードページ](https://www.anaconda.com/download/)からどうぞ。バージョンは特に事情がない限りは3を入れるべきでしょう。あと、個人的にはパスが通ってないと不便なので、パスを通すところまでやっています（公式では非推奨になっている）。ちなみに、`chocolatey`を入れているWindowsならば、
> ``` 
choco install anaconda3 --params="/AddToPath:1"
```

とすれば、パスを通すところまでやってくれます。質問がきたら`y`と入力すればインストールしてくれます（`-y`オプションを使っても良い）。

## `flake8`の導入
Anacondaを入れれば対外のライブラリやjupyter notebookのようなツールは使えるようになりますが、コード規約を守っているか確認するための`flake8`は落としてきてくれないので入れます。pythonが見えるディレクトリで（Anaconda入れた人なら）
> ```
conda install flake8
```

で入ります。

# 入れたいパッケージ
本題です。以下でパッケージ名をクリックすれば、Atomの当該パッケージのページに飛ぶようにしておきました。また、個人的な重要度も（）内に記載しておきます。役に立てばと思います。
## [Hydrogen](https://atom.io/packages/hydrogen)（必須級）
### 説明
たぶん類似の記事で全員共通で推しているパッケージ。これも月並みですがAtomがjupyter notebookっぽくなるやつ。実行したいコードの上で、`ctrl+Enter`とかやると、その結果をエディタ内に表示してくれます。私はpythonでグラフとかを出力することが多いので、そういう命令のすぐ下にグラフが出てきてくれるのはありがたいですね。これが使いたいからAtomでPython書くと言っても過言ではないと僕は思っています。
### 入れ方
> ```
apm install hydrogen
```

## [linter-flake8](https://atom.io/packages/linter-flake8)（最近大事だと思っている）
### 説明
「ここ、間違ってるよ」みたいなのをコード上に明示してくれるシリーズの`flake8`版。例のごとく、[Atom Linter](https://github.com/AtomLinter)が提供している。`flake8`に対応させておけば、Pythonのコード規約を守っているかも確認できるので、Linterの中でもこいつがいいかなと思ってます。

### 入れ方
> ```
apm install linter-flake8
```

## [autocomplete-python](https://atom.io/packages/autocomplete-python)（補完したい人向け）
### 説明
補完してくれるパッケージです。僕があんまり補完機能を使う人間ではないのでこれくらいしか書けませんが、なんか他のパッケージとかと連動して変数を定義した場所に飛んでくれるっぽい。なんか強そうです。
### 入れ方
> ``` 
apm install autocomplete-python
```

**以上**
こうやって見るとあんまり環境作ってないなって感じだけど、これはpythonに限定されている部分しか書いてないからなはず…。
ServiceNowのClient ScriptでFormに入力された単価と数量から金額を計算して設定する

# 概要

金額 = 単価 * 数量のように他の入力値から算出して設定したい場合がある。
画面のサブミット時に実施する方法としては、Server Side ScriptのBusiness Ruleで実装できるが、Business Ruleで実装した場合は一旦サブミットしないと算出された値の確認ができない。

（参考）[ServiceNowでBusinessRuleをテストする](https://qiita.com/sukkyxp/items/1136c15c9fd26d7c0089)

ここでは、画面上で単価または数量が入力されたらクライアントスクリプトで金額を算出し、設定する方法を確認する。

テーブルは下記で作成したものを使用している。

[ServiceNowでTableを作成する](https://qiita.com/sukkyxp/items/46a06665131b37ce3f2b)

## 環境

ServiceNow:KINGSTONE

# 手順

## Client Scriptを作成する。

Studioの「Create Application File」でClient DevelopカテゴリのClient Scriptを選択してCreateをクリックする。

次のように入力して「Submit」をクリックで一旦保存する。

![clientscript.png](https://qiita-image-store.s3.amazonaws.com/0/197947/6516a086-a0d3-e835-775e-dd136ef76c7e.png)

今回は、Quantityフィールドの値が変更された場合の処理を作成する。
unitPriceが変更された場合の処理も同様に作成する必要があるがここでは省略する。

## スクリプトを入力する。

次の通りスクリプトを入力する。

```javascript

function onChange(control, oldValue, newValue, isLoading, isTemplate) {
   if (isLoading || newValue === '') {
      return;
   }
	
	var unitPrice = g_form.getDecimalValue('unitprice');
	if (unitPrice === '') {
		return;
	}
	
	jslog('unitPrice =' + unitPrice);
	var price = unitPrice * newValue;
	g_form.setValue('price', price + '');   
}
```

g_formを使って画面上の入力値の取得が可能だ。
文字列として取得する場合は、「g_form.getValue('フィールド名')」
数値として取得する場合は「g_form.getDecimal('フィールド名')」のように使用する。

また、値の設定は「g_form.setValue('フィールド名','値')」を使用するが、
値が文字列のため、「price + ''」で数値を文字列化して設定している。

以上で、フォームからQuantityの値を入力するか、変更するとpriceが自動的に設定される。

#　最後に

Client ScriptはHTML内にjavascriptとして保存されているため、client scriptを変更後は、Formを再読みしないと変更が反映されないので注意が必要だ。

また、isLoadingで処理を抜けているのはフォームのロード時には自動計算の実施をしないようにするためだ。

また、Business RuleとClient Scriptの使い分けについてだが、Client Scriptは画面から入力して場合のみしか動作しないのに対して、Business Ruleの場合は、画面を解さない定期的に起動するスクリプト処理（バッチ処理）からレコードを挿入した場合も常に実行されるメリットがある。
Client Scriptが画面上で算出されるのでユーザーがSubmit前に値の確認が出来るメリットがある。それぞれの利点を考えてどちらをつかうか、または両方使うかを検討すると良いだろう。
Watson Knowledge Studio(WKS)のアノテーション作業手順　その２

#3. そのモデルにより残りのメールに対してプレアノテーションを実施し、その後に真面目にアノテーションする
[前回](https://qiita.com/yoshiono/items/b0619c91e9315c90ef97)からの続きです。
残りのメールをUploadします。そして、Annotation setを作成します。名前はSet2とします。残りの文書のUpload、Annotation setの作成までの処理は前章と同じです。これ以降、プレアノテーションのための作業となります。
Model Management - VersionsでRun this modelをクリックします。
![016.png](https://qiita-image-store.s3.amazonaws.com/0/104507/7262c940-e6e8-c759-3086-34bc7c5e26cd.png)

Set2を選択してRunをクリックすると、プレアノテーションが実施されます。
![017.png](https://qiita-image-store.s3.amazonaws.com/0/104507/9e01f6c9-013f-5f0d-4931-c007c1bf3547.png)

名前をSet2タスクとしてタスクを作成します。そして、アノテーションセットとして、Set2を選択します。この作業は前章と同じです。Documentを開くとプレアノテーションされていることが確認されます。アノテーション内容について確認し、必要に応じて削除や追加を行います。この画像では2017年10月31日(火)のうち、2017年10までしか選択されていませんので、残りの月31日(火)を含めるように変更する必要があります。前述のように、プレアノテーションの精度は最初に作成した機械学習モデルの精度に依存します。精度が低ければ、見当違いの単語がアノテーションされたり、必要な単語がアノテーションされなかったりする頻度が高くなります。それでも、無いよりはマシだとは思います。修正が完了したら、Submit all documentsをクリックしTrain and Evaluateの作業を開始します。これらの作業は前章と同じですので画像と説明は省略します。
![018.png](https://qiita-image-store.s3.amazonaws.com/0/104507/db1fa0b4-0de5-f416-791d-3ceb783a21ef.png)

Train and evaluateではEdit settingを選択し、Set1とSet2を選択します。これにより準備したデータ全てを利用した機械学習モデルが作成されます。
![019.png](https://qiita-image-store.s3.amazonaws.com/0/104507/18d4530a-dc75-5cf5-e609-baa0574da6b6.png)

これ以降の作業は前章と同じですので省略します。
![020.png](https://qiita-image-store.s3.amazonaws.com/0/104507/afa5a621-3b49-f61d-e7a5-86ba547b6cd0.png)

なお、ここでCurrent version insightsのDetailed Statisticsをクリックすることで、Confusion Matrixにアクセスできます。満足できるF1 scoreを達成するためには、それぞれの指標を改善する必要があり、その手順は[こちら](https://console.bluemix.net/docs/services/watson-knowledge-studio/evaluate-ml.html#evaluate-ml)に記載されています。基本的には、アノテーションする単語数を増やす(ために、メールを追加して、アノテーションする)、Entity typeを見直す、等々となります。
また、F1 scoreを改善するためには、実際に、WKSで作成された機械学習モデルによって、どのようにアノテーションされるのだろうか？を知りたくなるかもしれません。その場合は、Train and evaluateのEdit settingの画面で、Training set 100%、Test set 100%、Blind set 100%の順でTrain and evaluateを繰り返すと、Human annotatorによるアノテーション(教師付きデータ)と機械学習モデルによるアノテーションを比較することが可能になります。

[次](https://qiita.com/yoshiono/items/043087b9902a9135ab5d)に続きます。
Watson Knowledge Studio(WKS)のアノテーション作業手順　その３

#5. NLUにデプロイするし、curlでNLUにクエリーを発行するし、そして、回答を得る
[前回](https://qiita.com/yoshiono/items/ed6b3bf64ef783c5cf43)からの続きです。
Take snapshotをクリックすることで、全てのDocumentを含む機械学習モデル(ここでは、Version 1.1)が作成されます。
![021.png](https://qiita-image-store.s3.amazonaws.com/0/104507/987dba4e-6242-fa18-7699-78d442bd8da9.png)

Deployをクリックすることでdeploy先を選択する画面が開きます。ここでは、NLUを選択しNextをクリックします。
![022.png](https://qiita-image-store.s3.amazonaws.com/0/104507/7b4df083-a903-beb9-4b0e-2b9554932bd6.png)

事前に作成しておいたNLUのサービスを指定しDeployを完了させます。
![023.png](https://qiita-image-store.s3.amazonaws.com/0/104507/4f7338ae-a331-066c-ab59-35fe7bd9d450.png)

これまでの作業により、NLUに対してクエリーを実行することが可能になりました。

以下の形式のjsonファイルを用意します。

```json:parameters.json
{
    "text": "宛先の皆様、

お世話になります。
パートナー 山田です。

以下 １件 お知らせです。

BCD社マネジメントソリューション様とのミーティング日時が確定しました。
取り急ぎ このメールにてお知らせします。


BCD社マネジメントソリューション様とのミーティング
- 日時 :	7月12日(水) 11:00-12:00
- 場所 :	BCD社大川事業場

参加される方はこのメールのReplyにてお知らせ下さい。
  (*) 来週(7月10日)のTeam Meetingのご案内でも同様にお知らせします。

よろしくお願い致します。

以上",
    "features": {
      "entities": {
        "model": "NLU MODEL_ID"
      },
      "relations": {
        "model": "NLU MODEL_ID"
      }
    }
}
```

以下のcurlによりPOSTします。

```sh:curl
curl -X POST -H "Content-Type: application/json" -u "USERID":"PASSWORD" -d @parameters.json "https://gateway.watsonplatform.net/natural-language-understanding/api/v1/analyze?version=2017-02-27"
```

例えば、以下のような結果が得られます。

```json:curlの結果
～省略～
{
            "type": "DATE",
            "text": "7月12日(水)",
            "disambiguation": {
                "subtype": [
                    "DATE"
                ]
            },
            "count": 1
        },
～省略～
```


[最初](https://qiita.com/yoshiono/items/8fa45384a4b9d8e742b2)に戻ります。
ScalaのAPIドキュメントが難しいのでバラして理解しようという試み

## はじめに
ScalaのAPIドキュメントが、初見で記号の羅列にしか見えなかったので、代表的なクラスやメソッドを調べてみました。ここではメソッド定義のそれぞれが何なのかだけで、メソッド自体の機能や詳しいことは書いてません。

## ドキュメント
https://www.scala-lang.org/api/2.12.5/index.html

Option, Intなどのコアタイプは[scala](https://www.scala-lang.org/api/2.12.5/scala/index.html)リンクに、List, Vectorなどは [scala.collection.immutable](https://www.scala-lang.org/api/2.12.5/scala/collection/immutable/index.html)のリンクにあります。

## 例
### List#foldLeft
https://www.scala-lang.org/api/2.12.5/scala/collection/immutable/List.html

```scala
def foldLeft[B](z: B)(op: (B, A) ⇒ B): B
```

* `[B]` : 型パラメータ
  * B型(StringやIntあるいはその他なにか、だがメソッド内では共通であること)
* `(z: B)`  : 第一引数
  * zというB型の**値**を受け取る
* `(op: (B, A) ⇒ B)` : 第二引数
  * opという 「タプルの`(B型の値, A型の値)`を受け取って`B型`の値を返す」”関数”
* `メソッド(引数)(引数)`という引数の渡し方は`カリー化`という手法
* `:B` : 戻り値の型

使用例: Listの要素を全部足す

```scala
scala> List(1,2,3,4).foldLeft(0) { (z,x) => z + x }
res148: Int = 10

scala> List(1,2,3,4).foldLeft(0) { _ + _ }
res149: Int = 10
```
### List#map
https://www.scala-lang.org/api/2.12.5/scala/collection/immutable/List.html#fold[A1%3E:A](z:A1)(op:(A1,A1)=%3EA1):A1

```scala
final def map[B](f: (A) ⇒ B): List[B]
```
* `[B]` : 型パラメータ
  * B型(StringやIntあるいはその他なにか、だがメソッド内では共通であること)
* `(f: (A) => B)`  : 第一引数

* `: List[B]` : 戻り値の型(List[B]型) 

使用例: Listの各要素に10を足す

```scala
scala> List(1, 2, 3).map(_ + 10)
res170: List[Int] = List(11, 12, 13)
```

### Option
http://www.scala-lang.org/api/2.12.4/scala/Option.html

```scala
sealed abstract class Option[+A] extends Product with Serializable
```
* `sealed` : 同一ファイル内のクラス/トレイトしか継承出来ない
* `abstract`: 具体的な実装をしない
* `Option[+A]`: 変位指定(共変)での型パラメータ
  * Aか、そのサブタイプのみ指定可能
  * この型パラメータは主に戻り値に使う。引数型に使用出来ない([制約突破条件](https://qiita.com/mtoyoshi/items/bd0ad545935225419327#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB)あり)
  * 共変については[こちら](https://dwango.github.io/scala_text/type-parameter.html)や、[こちら](https://qiita.com/f81@github/items/7a664df8f4b87d86e5d8)も理解を助けてくれます(感謝)
  * むずいとても

### Option#getOrElse
https://www.scala-lang.org/api/2.12.5/scala/Option.html#getOrElse[B%3E:A](default:=%3EB):B

```scala
final def getOrElse[B >: A](default: ⇒ B): B
```
* `final def` : オーバーライド不可
* `[B >: A]` : 型パラメータ(下限境界あり)
  * BはAのスーパータイプでなければならない。B = Aはok。
  * A、は `Option(引数で渡される値の型)`
  * 詳しくは[こちら](http://takafumi-s.hatenablog.com/entry/2015/08/20/135525)
* `(default: ⇒ B)` : 第一引数。
  * `=> B` は 名前渡し(call-by-name)という書き方
  * 関数でも普通の値でも渡せる。また、実際に使われるまで評価されない
  * 詳しくは[こちら](http://www.ne.jp/asahi/hishidama/home/tech/scala/def.html)
* `: B` : 戻り値の型

使用例:

```scala
// 値が取れればそれを
scala> Option("foo").getOrElse("bar")
res175: String = foo

// なければbarを
scala> None.getOrElse("bar")
res176: String = bar
```



# いやー
むずいっす。

:beginner: なので間違ってたら :bow:
全くのプログラミングド素人がどこまでいけるのか

![children-593313_1920.jpg](https://qiita-image-store.s3.amazonaws.com/0/186427/c6d7d71d-b941-b5de-8bde-d8c165927d02.jpeg)

Qiitaに集う、エンジニアの皆様はじめまして。
プログラミングのド素人です。

今日から一年間プログラミングを頑張っていきます。

「エンジニアってかっこいいな、プログラマーってかっこいいな」
そんな浅い志望動機でプログラミングを始める事にしました。

何らかの形で日記に記さないと続かないだろうし、生意気を言えば僕のこの(情けない)日記を読んで
「あれ、俺(私)にも出来るんじゃね・・・？」とプログラミングを始めてくれれば嬉しいです。

よろしくお願いします。

次回は、何のプログラミング言語を学ぶかを選定します。（比較的取っ掛かりやすいという理由で、Pythonを選ぶ予定です...。エンジニアの皆さん、アドバイス下さい。。。）
画像屋は夢想する　画像認識に関わる書籍の紹介「サイボーグ昆虫、フェロモンを追う」

先に「昆虫―驚異の微小脳」を[紹介した](https://qiita.com/nonbiri15/items/8b105007022352e3707d)。
　
この本を通して昆虫の脳のすごさを知った。その後「サイボーグ昆虫、フェロモンを追う」という書籍が出版されていることを知った。そこで、この本の紹介をしたい。


![](https://www.iwanami.co.jp//images/book/265977.jpg)

「サイボーグ昆虫、フェロモンを追う」(https://www.iwanami.co.jp/book/b265977.html)

### 私が思ったこと
- 生存・繁栄という目的に対して成功している仕組みが比較的小規模に実現しているのが昆虫であること。
- 現在の測定技術で測定可能な対象は、哺乳類の脳ではなく、昆虫の脳であるという趣旨の指摘である。
    - そのことは、実験や理論を構築する上でも有意義な進展が可能なのは、哺乳類の脳の研究ではなく、昆虫の脳の研究であると考えるのは、私にも同意できる。
- 生物の進化について、一方が他方より優れているかどうかのような視点は、適切ではないことが確認される。
    - 人は昆虫が見ることのできる紫外線を見ることはできない。
    - また人には見えていない偏光を昆虫は見ている。偏光が見えることで、昆虫は太陽に位置を太陽が隠れていても太陽に位置を知ることができている。
    - 人が視覚で認知する時間の応答速度と昆虫が認知する時間応答とは違っている。 時間応答が短いことは単純なロジックでも効果的に働くことが多い。
、
- 「昆虫はどう動作するか予め決められきっていて融通が効かない」という先入観は、昆虫操縦型ロボット
http://www.brain.rcast.u-tokyo.ac.jp/research/bio_machine_theme1.html
　で否定される。
昆虫の脳が予期せず事態に対して適応して、カイコガ操縦するロボットを直進させることに成功している。

>ロボットのモーターのゲインを非対称に（１：４）に制御した．この条件では，カイコガが直進しても左に旋回することになる．紙でカバーした条件（図2右）では，カイコガは回転するばかりだが，前方を見ることのできるカイコガ（図２左）は，ロボットの異常な動きを検知し，匂い源に向けて定位できるようにロボットの動きを補正する．
このようにカイコガにとって不自然な状況を作り出しても，カイコガは視覚情報をもとに補正を行い，フェロモン源へたどり着くことが示された．

http://www.brain.rcast.u-tokyo.ac.jp/research/bio_machine_theme1.html

実験対象が昆虫であることによる利点は多い。
- 蛍光タンパク質などを利用する実験が推進しやすい。
- ライフサイクルが短いことで、繰り返し実験を行うのがしやすい。
- 飼育に必要な面積が少ない。

[神崎教授グループ： 高橋講師グループ：](http://www.brain.imi.i.u-tokyo.ac.jp/)


----

![](http://www.kyoritsu-pub.co.jp/app/img/item/9784320009134.jpg)
 [昆虫の行動の仕組み―小さな脳による制御とロボットへの応用― ](http://www.kyoritsu-pub.co.jp/bookdetail/9784320009134)

[山脇兆史の研究テーマ](http://www.biology.kyushu-u.ac.jp/~animphys/yama_top.html)
onsen-UIは、CSSのグラデーションが使えない

何年も前から有名なグラデーションを作るウェブ上のジェネレーターで作られるグラデーションのコードは、onsen-UIでは、使えません。


-webkit-gradient という部分から、エラーになります。

#解決方法

ネット検索して、下記のサイトを見つけました。
https://webgradients.com/

このサイトは、たくさんのグラデーションの見本が掲載されています。
気に入ったグラデーションの丸い柄見本の下にCSSのボタンが、あります。
ここをクリックすると、CSSコードを取得できます。
このコードは、onsen-UIで使うことができました。
使用例として実際に私がアプリで書いたコードをご紹介します。

ご紹介したサイトは、この記事で知りました。
http://photoshopvip.net/98951



```css
/* 角が丸いボタンを作ることができるコード */
    border-radius: 16px;
    box-shadow: 0 0 14px #000000;
/* このlinear-gradientが、ご紹介したサイトで生成されるコードです。　*/
    background-image: linear-gradient(to right, #fa709a 0%, #fee140 100%);
    padding: 10px;
    font-size: 12pt;
    color: #888888;
    text-align: center;
    margin: 10px;
```

onsen-UIのボタンをカスタマイズする方法も、知ることが出来ました。
https://press.monaca.io/fran/457

今回知った方法を使うと、グラデーションのボタンもできると思います。
JAXRSのパスの指定について

一番シンプルなJAX-RSのパス指定について

例えば、下の画像のようなURIを持つアプリケーションを作ったとき
![image.png](https://qiita-image-store.s3.amazonaws.com/0/136860/90fae9dc-52de-cd85-6a3e-bb7c6cbb29ae.png)

sample→クラス名に付加した@Pathの値
add→メソッドに付加した@Pathの値
クエリx,y →@QueryParamでメソッドの引数にバインドされる

つまり、コンテキストルートからのパスを
実行したいクラス→実行したいメソッド
と対応するように指定すればよい
2018年4月頃に行うDockerをCentOS7にインストール


# はじめに
最速でDockerをCentOS7に入れたい時のコマンド。

## 環境前提
- CentOS7


## Dockerインストール
```shell:shell>
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum makecache fast
yum -y install docker-ce
```

## Dockerサービス起動
```shell:shell>
systemctl start docker
```

## Dockerサービス自動起動
```shell:shell>
systemctl enable docker
```


## DockerComposeも入れる
```shell:shell>
curl -L https://github.com/docker/compose/releases/download/1.12.0/docker-compose-`uname -s`-`uname -m` > docker-compose
mv docker-compose /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
```
ParagonのVFXデータを解析してみる　ー その１ ー

# **ParagonのVFXデータを解析してみる　ー その１ ー**
2018年3月にUnrealEngineのマーケットプレイスでEpic GamesからParagonのゲームデータが大量に無償公開されました。
[Epic Games、1,200万ドル相当の Paragon アセットを無料で公開](https://www.unrealengine.com/ja/blog/epic-games-releases-12-million-worth-of-paragon-assets-for-free)
各キャラごとに公開されており、ダウンロードしてプロジェクトに追加することが可能です。

![Image 147.png](https://qiita-image-store.s3.amazonaws.com/0/246816/928ecafb-0bac-d86b-31af-38031ad929a1.png)
・マーケットプレイス→カテゴリー→Epic Showcaseからアクセスできます

各キャラクターのアセットにVFXデータが含まれているのですが、こちらのデータが個人的に大変参考になるもの
ばかりだったので自分が有用だなと思ったものをメモがてら紹介していこうと思います。

ちなみに全キャラのデータをプロジェクトにインポートすると**約30GB**、VFXだけで**10GB**あります。
（太っ腹すぎるよ、Epicさん・・・。）

# **単一のフラクタルテクスチャからフレアのマテリアルを作成**
まずはこちらのお姉さんのアセットから見ていきたいと思います。
![Image 149.png](https://qiita-image-store.s3.amazonaws.com/0/246816/5f846424-aaac-bde6-9c7c-6616e352158d.png)

**M_Flare_Procedural_Noise_Tex_Glow2**
というマテリアルを開いてみたください。
![Image 150.png](https://qiita-image-store.s3.amazonaws.com/0/246816/891508ca-7f1b-e67b-48c5-4c35276f0953.png)

こんな感じのマテリアルなのですが、このマテリアルで使われているテクスチャは以下になります。
微妙に色収差が入ってていいかんじです。

![Image 151.png](https://qiita-image-store.s3.amazonaws.com/0/246816/a291c740-8942-1bda-6207-1f7122ba8f87.png)

このテクスチャからどのようにフレア素材を作っているのか簡単に流れを見てみたいと思います。
全体ではこんなかんじ。

![Image 153.png](https://qiita-image-store.s3.amazonaws.com/0/246816/90b226d7-0ffe-a85a-913a-ac0aecba1219.png)

まず全体の左上部分に注目してみます。
①で**Vector To Radial Value**を使ってＵＶ座標を放射状に変形しています。次に②に関しては、
ここはちょっと自分でもよくわかっていないのですが**Dynamic Parameter**と**Particle Random Value**が両方使われています。
**Particle Random Value**の説明については[@moko](https://twitter.com/moko_03_25)さんのブログ記事にて解説されております。

[ゲームエフェクトデザイナーのブログ (新)　Particle Randomノードについて](http://effect.hatenablog.com/entry/2016/08/16/010104)

こちらを読むと**Particle Random Value**に関してはGPU Particleのみ、**Dynamic Parameter**については通常のParticleでのみ
使用できるとのことなので、パーティクルの種類によって使い分けているということではないのかなと・・・。
（正直よく分からないので詳しい人のツッコミ待ち。）
　
で、調整を加えたものをテクスチャのＵＶ入力につなげています。

![Image 152.png](https://qiita-image-store.s3.amazonaws.com/0/246816/08831545-3a18-df7a-63a3-92f6bd8e7df1.png)

この時点ではまだフチ部分のマスキングはされていません。

![Image 154.png](https://qiita-image-store.s3.amazonaws.com/0/246816/54a38944-e1f8-45d8-2115-80acc35f21a6.png)

そして①の部分で**Sphere Mask**で円形のマスクを作って、先ほどの放射状のフラクタルと掛け合わせて②の結果を得ています。
さらに**Sphere Mask**を再利用して**Power**で大きさを変えて③のように中心のフレア部分を作成しています。
**Power**に**Dynamic Parameter**の**Core Power**が繋がっているため、多分コア部分の発光具合も独立して調整可能になっているかと思います。
②と③を合わせて④の最終形になっています。

![Image 155.png](https://qiita-image-store.s3.amazonaws.com/0/246816/b9dc2355-b609-b25c-8cfa-fcbb43c4369f.png)

割とシンプルなフレアのマテリアルですが結構自分的には役立ちそうなノウハウが詰まってて
非常に参考になりました。
(サービス終了)Pythonを使ってRospeexで音声合成してみた

#追記
**本サービスは、提供元より終了されているためご利用いただけません。**
#この記事を書いたきっかけ
アニメ声のような音声合成がPython3で使えるということなので、Rospeexを使おうとしたのですがいくつか情報が少ないと感じたので記事にしてみます。
#Rospeexとは
・NICTが開発している音声合成エンジン
・クラウドのためhttpで送ると音声が返ってくる
・アニメのような声が特徴
[公式サイト]http://rospeex.org/top-ja/
#実行環境
・Windows10
・Python 3.6.5
#はじめの一歩
まず、Googleで検索しRospeexの情報を探し、見つけたのがこちら
http://blog.maqua.tech/entry/2013/12/14/024807
このページにあるPythonのプログラムをちょっと変えて実行してみると・・・
***urllib2でエラーが返ってきます***
#バージョンが違うことに気が付く
urllib2というものが何をするのか、調べると・・・
***Python 2時代のものでした***
ということは・・・
***Python 3用にもあるはず***
調べてみると・・・ありました！
https://teratail.com/questions/47744
ですが変えることが多く大変なのでさらに情報を求め、調べてみると
http://blog.livedoor.jp/katsuooo_l/archives/47217002.html
プログラムを作っている先人がいらっしゃいました。
早速、プログラムを少し変えて実行してみると・・・
***Pythonから宛先のURLを確認してと言われました (´;ω;｀)***
本当かどうか怪しかったため他のツールでURLへアクセスしてみるも・・・
***IPアドレスが存在しませんと返ってくる***
本当だ・・・
#実はURLが変わっていた
もしかするとURLが変わっただけかもしれないと思い再び調べてみると・・・
http://komeisugiura.jp/software/software_jp.html
なんと見つかりました
ということでURLだけを書き換えることに・・・
#実行しよう
今度こそ動くはずと期待を込め実行・・・
***無事に動きました***
漢字等読めない文字も多いですが、イントネーションが思ったよりしっかりしていてビックリしました。
#今回使用したプログラム
お待たせしました。以下がプログラムとなります。

```python:rospeex.py
import sys
import string
import base64
import urllib.request
import urllib.response
import urllib.error
import urllib.parse
import json
import wave
import pyaudio

#音声合成する言葉を入力
n = input(">>>")

#URL
tts_url ="http://rospeex.nict.go.jp/nauth_json/jsServices/VoiceTraSS"

#音声合成
tts_command = { 'method':'speak',
'params':['1.1',
 {'language':'ja','text':n,'voiceType':"*",'audioType':"audio/x-wav"}]}

obj_command = json.dumps(tts_command)     # string to json object
obj_command = obj_command.encode('utf-8')        
req = urllib.request.Request(tts_url, obj_command)
response = urllib.request.urlopen(req)
received = response.read().decode('utf-8')  # conv bytes to str by decode()
# extract wav file 
obj_received = json.loads(received)
tmp = obj_received['result']['audio'] # extract result->audio
speech = base64.decodestring(tmp.encode('utf-8'))

#.waveで出力
f = open ("out.wav",'wb')
f.write(speech)
f.close

#音声合成の音声データを再生
input_filename = 'out.wav'
buffer_size = 4096
wav_file = wave.open ( input_filename , 'rb' )
p = pyaudio.PyAudio ()
stream = p.open (
                 format = p.get_format_from_width ( wav_file . getsampwidth ()) ,
                 channels = wav_file.getnchannels () ,
                 rate = wav_file.getframerate () ,
                 output = True
                 )
remain = wav_file.getnframes ()
while remain > 0:
buf = wav_file.readframes ( min ( buffer_size , remain ))
stream.write ( buf )
remain -= buffer_size

stream.close ()
p.terminate ()
wav_file.close ()

```

コンソール上に>>>を出力し、ユーザーからの値を受け取ったら音声合成エンジンへ送り返ってきた音声を再生する流れです。
このプラグラムをWhile文を使い無限ループさせてもいいかもしれません。

最後まで読んでいただきありがとうございます。
with構文とfor文を使ったスマートなファイル操作


Python3.6を使っています。


```python:file_copy.py
with open("src.txt", "r") as sf, open("dst.txt", "w") as df:
    # 一行ずつ読み込む
    for line in sf:
        df.write(line)
```

with構文のところは下記のように書き換え可能。

```python
with open("src.txt", "r") as sf:
    with open("dst.txt", "w") as df:
    # 以下、省略
```

with構文を使うことにより、try...finallyで最後にclose()する必要がなくなる。
MAP自動生成　その１

![スクリーンショット_2018-04-15_21-39-05.png](https://qiita-image-store.s3.amazonaws.com/0/244620/09b77bf9-0887-f868-b841-a0d0826ccc17.png)

ロブさんのエンドレスランナーのチュートリアル見ながら、MAP自動生成を自分なりに作ってみた。
枝のMAP(道中分岐可能)なら、それで大丈夫だと思うんだけど四角のMAPだと、その方法だと面倒そうな気がして自分なりの解釈で自動生成の方法を考えてみた。

ForloopとAddFloorTileがロブさんのチュートリアルを参考に繋げたもの。
ForLoopとSetFloorTileを繋げたのが自分なりの解釈で作ってみたものです。
SetFloorTileの中でやってることはAddFloorTileと同じです。
違うのは**タイルを設置する基準点**をどうするか、です。

まず、左のコメントから
これはMAPの範囲を指定し、必要なタイルの数を計算しています。

次にその回数分だけForloopでタイルの設置を繰り返します。
この際、座標計算を行い設置位置をSetFloorTileに入力します。

右のコメントが座標計算の中身です。
座標計算の中では繰り返しの値(ForloopのIndex)を入力として受け取り、その値を横幅で割ります。
このときの**割った結果をX**、**割った余りをY**とします。

例）Indexが12、MAPの大きさを縦横10マスとします
X = 12/10 = 1
Y = 12/10 = 2
座標　X = 1,Y = 2

これをMAPの大きさ(縦*横)の回数繰り返してMAPを作ります。



##このやり方が正しいというものはない
作って、**自分の思い通りに動いたら正解**です。

Forloopを二重にして縦(一つ目のLoop)と横(二つ目のLoop)の回数繰り返したりでもできると思います。



|дﾟ).oO(書いててなんだけど、二重のForLoopの方が簡単にできる気がしてきたなんて言えない。だけど、こういうしょうもないことを経験してすごいことが出来るようになるんだと思う。
MQL4をVSCode(とMT4)でコンパイルする！

やっとこさコンパイル出来るようになったので、メモ代わりに置いときます。
うまく行かなかったら、ごめんなさい。
MacOS(wine)とWindows両対応です。

以下のtasks.jsonを.vscodeのディレクトリに放り込んでください。
ビルド方法はMacOSならば「Shift+Command+B」でビルド出来ました。

2021/08/14 ログ表示機能を追加しました。
ターミナルにコンパイル結果ログを表示するようになりました。（Windowsのみ)
CTRLキーを押しながらエラー箇所をクリックすると該当箇所にジャンプしてくれる
みたいです。
※ちなみにエラーがない場合は、ログが表示されない仕様となっております。（なぜか。。）

```tasks.json
{
  "version": "2.0.0",
  "tasks": [
    {
      "label": "MQL4-Compile",
      "presentation": 
      {
        "echo"  : true,
        "reveal": "always",
        "focus" : true,
        "panel" : "shared",
        "showReuseMessage": false,
      },
      "group": "build",
      "promptOnClose" : true,
      "type"          : "process",
      "osx" :
      { 
        "command" : "wine",
        "args"    : 
        [ 
          "/Users/hogehoge/.wine/drive_c/Program Files/OANDA - MetaTrader/metaeditor.exe",
          "/compile:${fileBasename}",
          "/log:${fileBasenameNoExtension}.log",
        ]
      },
      "windows" : 
      { 
         "command" : "C:\\Program Files (x86)\\OANDA - MetaTrader\\metaeditor.exe",
       "args" : 
        [ 
          ":/compile:${fileBasename}",
          "/log:${fileBasenameNoExtension}.log",
        ]
      },
    },
    {
      "label": "MQL4-Output",
      "type": "process",
      "presentation": 
      {
        "echo"  : true,
        "reveal": "always",
        "focus" : true,
        "panel" : "shared",
        "showReuseMessage": false,
      },
      "dependsOn" : "MQL4-Compile",
      "group":
      {
        "kind": "build",
        "isDefault": true,
      },
      "command": "more",
      "args": [ "${fileBasenameNoExtension}.log"],
    }
  ]
}
```
Linuxのタッチパッドでピンチ・3本指・4本指ジェスチャーを使う

どうも。WindowやMacでは、3本指、4本指を使った、さまざまなジェスチャーが使用できます。
Linuxでは、2本指スクロールが限界に思えてますが、もちろんLinuxでも、マルチタッチ・マルチジェスチャーを利用できます。

# libinputとは

XorgやWaylandと、キーボード・ポインティングデバイスの仲介をするライブラリ・ドライバです。
従来は`Synaptics`と呼ばれるものが使用されていましたが、メンテナンスに移行し、現在はこちらを使うことが推奨されています。

現在では、特に何も設定しなければデフォルトで使用されるはずです。
ArchLinuxでは`xf86-input-libinput`と`libinput`というパッケージ名でインストールできます。他のディストリビューションでもほとんどパッケージ名は変わりません。

# libinput-gestures

`libinput-gestures`は、libinputがサポートするさまざまなタッチパッドイベントが発生するたびに、任意のコマンドを実行できるパッケージ（デーモン）です。

## インストール

Archlinux: `yaourt -S libinput-gestures`

Ubuntuなどだと自力でソースからインストールする必要があるらしいです。
https://github.com/bulletmark/libinput-gestures

## 設定

`libinput-gestures-setup start`をどこかで実行させましょう。デスクトップ環境を使っているならば「自動起動」のメニューでコマンド追加をすると良いと思われます。

また、対応してるデスクトップ環境では`libinput-gestures-setup autostart`と入力すれば自動起動に勝手に追加されます。


また、ユーザーをinputグループに追加する必要があります。

```
sudo gpasswd -a $USER input
```

## 設定ファイル

```
$ cp /etc/libinput-gestures.conf ~/.config/libinput-gestures.conf
$ vi ~/.config/libinput-gestures.conf
```


それぞれの行に1つ設定を書くことができます。
構文は以下です

```
gesture <action> <motion> [finger_count] <command>
```

`<action>`には、`swipe`と`pinch`を書くことができます。

`<action>`を`swipe`にした場合、`<motion>`には、`up` `down` `left` `right`や、2つを組み合わせた`left_up` `right_down` ... を指定できます。
`<action>`を`pinch`にした場合、`<motion>`には、`in` `out` `clockwise` `anticlockwise`を指定できます。
それぞれ意味はそのままです。

swipeの場合、finger_countには、数字（3 or 4）を書くことができます。3本指か、4本指かの指定です。省略した場合3になります。

commandには任意のコマンドを指定できます。

例：

```
gesture swipe left xdotool key control+Tab
# 3本指で左にスワイプしたとき、xdotoolを使って、control+Tab（ブラウザで「次のタブ」）を押したことにします

gesture swipe up skippy-xd-toggle
# 3本指で上にスワイプしたとき、skippy-xd（MacのミッションコントロールのLinux版）を起動する

gesture pinch out xdotool keydown Alt click 4 keyup Alt
# ピンチアウトしたら、画面ズームを実行する
```

# さいごに

案外、Linuxでも高度なジェスチャーを利用することができました。
快適なLinuxライフを楽しんでください。

参考： https://github.com/bulletmark/libinput-gestures/blob/master/README.md
editorconfig-vim 覚書

#vim インストール

```bash
apt-get install vim
```

#dein インストール

```bash
curl https://raw.githubusercontent.com/Shougo/dein.vim/master/bin/installer.sh > installer.sh
chmod +x installer.sh
./installer.sh ~/.cache/dein
```

#EditorConfig インストール

.vimrc の雛形を作成する。

```bash
./installer.sh > ~/.vimrc
```

Vim Script として無効な行を削除し、下記を追記する。

```vim:~/.vimrc
call dein#add('editorconfig/editorconfig-vim')
```

vim を起動して EditorConfig をインストールする。

```bash
vim
```
形態素解析とマルコフ連鎖で文章を自動生成してみた

##概要
オフラインでも動作する、会話システムを作りたくて、ググった結果です。
ほぼコピペでできちゃったので、ただの備忘録です。

##前提条件

- Raspberry Pi 2 Model B

```Bash:
$ uname -a
Linux raspberrypi 4.14.32-v7+ #1106 SMP Wed Apr 4 18:19:23 BST 2018 armv7l GNU/Linux
```

##参考サイト

- [マルコフ連鎖で文章自動生成実験はヤバイ](http://umesyurock0603.hatenablog.com/entry/2016/12/11/090333)
- [マルコフ連鎖を使ってブログの記事を自動生成してみた](http://karaage.hatenadiary.jp/entry/2016/01/27/073000)

##形態素解析（MeCab）

形態素解析については、[ウィキペディア](https://ja.wikipedia.org/wiki/形態素解析)参照。
[MeCab](http://taku910.github.io/mecab)は 京都大学情報学研究科−日本電信電話株式会社コミュニケーション科学基礎研究所 共同研究ユニットプロジェクトを通じて開発されたオープンソース 形態素解析エンジンです。 
以下、MeCabのインストール。

```Bash:
$ sudo apt-get update
$ sudo apt-get upgrade

$ sudo apt-get install libmecab-dev
$ sudo apt-get install mecab
$ sudo apt-get install mecab-ipadic-utf8

$ pip install mecab-python3
```
動作確認はmecabコマンド実行後、適当な文章を入力します。
CTRL+Cで終了です。

```Bash:
$ mecab
こんにちは。今日はいい天気ですね。
こんにちは      感動詞,*,*,*,*,*,こんにちは,コンニチハ,コンニチワ
。      記号,句点,*,*,*,*,。,。,。
今日    名詞,副詞可能,*,*,*,*,今日,キョウ,キョー
は      助詞,係助詞,*,*,*,*,は,ハ,ワ
いい    形容詞,自立,*,*,形容詞・イイ,基本形,いい,イイ,イイ
天気    名詞,一般,*,*,*,*,天気,テンキ,テンキ
です    助動詞,*,*,*,特殊・デス,基本形,です,デス,デス
ね      助詞,終助詞,*,*,*,*,ね,ネ,ネ
。      記号,句点,*,*,*,*,。,。,。
EOS
```

##マルコフ連鎖
マルコフ連鎖については、[ウィキペディア](https://ja.wikipedia.org/wiki/マルコフ連鎖)参照。
[マルコフ連鎖を使った文章自動生成プログラム](https://github.com/karaage0703/TextGenerator)の手順そのまま実行します（なのでここでは流れだけ）。

```Bash:
$ git clone https://github.com/karaage0703/TextGenerator.git
$ cd TextGenerator
$ python PrepareChain.py sample.txt #事前準備
$ python GenerateText.py 10 # 文章の生成
```
文章が生成されれば成功です。
こんなに簡単にこんなにすごいことができるなんて感動です。

##応用
チャットの会話履歴とかをsample.txtに書き込んでいけば賢くなるかな？
『Amazon Web Services 基礎からのネットワーク＆サーバー構築 改訂版』学習メモ (IPアドレスについて)

参考：[Amazon Web Services 基礎からのネットワーク＆サーバー構築 改訂版](http://amzn.asia/4NyI6qs) 

## `IPアドレス`とは
- ネットワーク上でお互いに重複しないユニークの番号で、いわゆる「`住所`」のようなもの
- IPアドレスは`32bit (8bit * 4 = 32bit)`で構成され、`8bit`ずつ10進数に変換したものを「.」(ピリオド)で区切って表記する(0~225まで)

### パブリックIPアドレス
- IPアドレスの重複を防ぐため、「ICANN(Internet Corporation for Assigned Names and Numbers)」という団体が一括管理している。
- パブリックIPアドレスはプロバイダやサーバー事業者から貸し出される。

### プライベートIPアドレス
- 誰にも申請することなく自由に使うことができる。
- 社内LANの構築や、ネットワークの実験などを行う際に用いられる。

| IPアドレス範囲 |
|:----------- |
| 10.0.0.0 ~ 10.225.225.225 |
| 172.16.0.0 ~ 172.31.255.255 |
| 192.168.0.0 ~ 192.168.255.255 |

### IPアドレスの範囲と表記方法
- ネットワーク構築の際、サーバやクライアント・ネットワーク機器を接続するのに十分な数を確保したIPアドレスの範囲を決定する
- ホストに割り当てるIPアドレスの範囲は「`2のn乗個`」で区切る
- 一般的によく使われる区切りが「`256(2の8乗)個`」と「`65526(2の16乗)個`」
- IPアドレス前半の部分を「`ネットワーク部`」、後半を「`ホスト部`」と呼ぶ
- 「`ネットワーク部`」は同じネットワークに属するのであれば同じ値になる
- 「`ホスト部`」は割り当てたいサーバーやクライアント、ネットワーク機器に対する連番(飛び飛びでも良い)となる

※`ホスト(host)`とは・・・コンピュータやルーターなどのネットワーク機器など、`IPアドレスを持つ通信機器の総称`。

### CIDR表記
IPアドレスを2進数で表記したとき、「ネットワーク部のビット長」を「`/ビット長`」で表記する。ビット長のことを「`プレフィックス(prefix)`」と呼ぶ。
#### (例) `192.168.1.0` ~ `192.168.1.255`の場合
`192.168.1(区切り3つ分)`までは固定なので、プレフィックスは8bit*3 = `24bit`となるため、`192.168.1.0/24`と表記する。
CIDR表記されたIPアドレス範囲のことを、「`CIDRブロック`」と呼ぶ。

### サブネットマスク表記
プレフィックスのbit数だけ2進数の「1」を並べ、残りは「0」を記述した表記。
(例) 192.168.1.0 ~ 192.168.1.255の場合
サブネットマスクは「255.255.255.0」なので、「192.168.1.0/255.255.255.0」と表記する。