OmniAICreator/Qiita-1.07M huggingface dataset:
wordpress 抜粋表示した時 more（続きを読む）が表示されないので自己解決した話

#症状
最新記事をカテゴリ毎にトップページに並べているサイトで記事単体があまりにも１画面表示を覆ってしまうので、read more（続きを読む）タグ（Wordpress標準）を使って解決仕様と試みた所全く表示されないので、焦った結果自己解決したという内容です。

#解決方法
普通にループ内でmoreを出力してあげればよかった

```ruby:xxx.php
//ループ前にかならずこいつを宣言する
global $more;
$more = false;

$list = get_posts(array(
'category_name' => 'categoryname'
'posts_per_page' => 1 //最新記事のみがほしいので１、最新記事から２つほしければ２
))
foreach ($list as $post){
setup_postdata($post);
echo the_content("続きを読む"); //他の表記が良ければココに記載
}
wp_reset_postdata();

//ＴＰＯに応じて
$more = true;
```

#今まで（未解決のとき）
表記と改行が少ないのと、ループ文の記載が無いので好きだったが、moreが表示されないので・・・

```ruby:xxx.php
$list = get_posts('category_name=categoryname&posts_per_page=1');
$content = apply_filters('the_content',$list[0]->post_content);
echo $content;
```

#wordpress codexにも普通に記載があった。。。
しっかり読まないとダメですね。
[リンク](https://wpdocs.osdn.jp/%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%BF%E3%82%B0/the_content)

>##説明
現在の投稿の本文を出力します。 このテンプレートタグはループの中で使わなければなりません。

>本文中に <!--more--> クイックタグがある場合、先頭からそのクイックタグまでの内容のみを抜粋として表示します。 ただし単一投稿ページ（パーマリンクで投稿を特定したページ）では、抜粋のみでなく本文をすべて表示します。 the_content() テンプレートタグは <!--more--> の表示方法を決めるパラメータを受け取り、投稿の全文を「続けて読む」ためのリンクを表示する、という設計になっています。

>##<!--more--> について：
<!--more--> クイックタグの "more" の前に空白を入れてはいけません。つまり <!-- more --> は正常に動作しません！
<!--more--> クイックタグは single.php などの単一投稿を表示するテンプレートでは動作せず無視されます。
詳しくは 「続きを読む」のカスタマイズ をお読みください。

以上です。
[CentOS][Linux] CentOS 7におけるネットワークbonding(802.3ad LACP)の設定

# はじめに

2つのNICを束ねて、802.3ad LACPを設定します。

## わかっていないこと

複数のNICを束ねて、帯域を稼いだり冗長性を確保したりすることをbondingとかteamingと呼ぶらしいのですが、RedHat/CentOSではbondingとteamingは別口で設定するようになっているみたいです。

bondingをteamingに変換するツールもあったりして、どちらを使えばよいのかわかりません。

ここではbondingを設定します。

# 設定手順

## bondingコネクションを作成

```shell-session
# nmcli connection add save yes type bond autoconnect yes mode 4
```

`nmcli conneection add type bond`に渡すオプションは、`modinfo bond`とすると表示されます。

modeのオプションはこんなのがあるようです。

> mode:Mode of operation; 0 for balance-rr, 1 for active-backup, 2 for balance-xor, 3 for broadcast, 4 for 802.3ad, 5 for balance-tlb, 6 for balance-alb (charp)

こんなんできました。

```shell-session
# nmcli c
NAME    UUID                                  TYPE            DEVICE
bond    cd47091f-ff5a-4a47-882f-970e0afe0fc7  bond            nm-bond
```

名前を指定しなかったので、 *bond* という名前になりました。


## 物理NICをbondingコネクションに追加

*ens6f0* と *ens6f1* というNICがあります。
これらを追加します。

```shell-session
# nmcli connection add save yes type bond-slave ifname ens6f0 master bond
# nmcli connection add save yes type bond-slave ifname ens6f1 master bond
```

こんなんできました。

```shell-session
# nmcli c
NAME               UUID                                  TYPE            DEVICE
bond               cd47091f-ff5a-4a47-882f-970e0afe0fc7  bond            nm-bond
bond-slave-ens6f0  bce1ff10-b17f-42bd-9bb6-40b822761505  802-3-ethernet  ens6f0
bond-slave-ens6f1  883793cd-a03d-46c5-9026-42931dc25ee8  802-3-ethernet  ens6f1
```

## IPアドレスの設定

ここでは *192.168.4.33/24* に設定しました。

```shell-session
# nmcli c modify bond ipv4.method manual ipv4.address 192.168.4.33/24
```

## コネクションを起動

スレーブのほうからコネクションを起動していきます。

```shell-session
# nmcli c up bond-slave-ens6f0
# nmcli c up bond-slave-ens6f1
# nmcli c up bond
```
Vimでエンコードを指定する


## 事象
* CentOSのVimで日本語などのマルチバイト文字列を含むファイルを開くと文字化けする

## 対応方法

Vimを開いて現在の文字コードを確認する。

```
:set fenc

fileencoding=latin1
```

utf-8だと思っていたが、どうやらlatin1らしい。（実際はeuc-jp?）

Vimの設定ファイルを作成し、文字コードを指定する。


```
vi /home/{ユーザー名}/.vimrc

set encoding=utf-8
set fileencodings=iso-2022-jp,euc-jp,sjis,utf-8

```

`source`でファイルを読み込むか再度ログインし直すことで設定が有効となり、文字化けが解消される。
iOSでAndroidのapplicationIdSuffixと同じことを実現する

Androidで開発/本番環境の切り替えを行う場合は、Build Variantをそれぞれ用意して制御します。  
また、Build Variant毎にapplicationIdSuffixを設定することで、環境毎に別のアプリとして端末にインストールできます。

iOSでも同様の機能を実現したので紹介します。

## はじめに、もっと簡単な方法の紹介

* 本記事を書いた後に見つけたのですが、これから紹介するようなScriptを書かなくても実現できる方法がありました。

[http://llcc.hatenablog.com/entry/2015/07/29/010020](http://llcc.hatenablog.com/entry/2015/07/29/010020)

* 本記事の方法はgitのブランチ名をsuffixにつけるなどより複雑な要件の時には使えると思い、紹介させて頂きます。

## 前提

### 実行環境

* macOS Sierra 10.12.4
* Xcode 8.3.2
* Swift 3.1
* Deployment Target 9.0

### Scheme

* Development
* Staging
* Production

### Configuration

Scheme毎にDebugとReleaseを用意しています。

* Debug-Development
* Debug-Staging
* Debug-Production
* Release-Development
* Release-Staging
* Release-Production

## 実現方法

* `Build Phases`に`Run Script`に以下のScriptを追加します。
* なお、ScriptにはAppIDの変更だけではなく、アプリ名の変更も含まれています。

```
plutil="/usr/bin/plutil"
plistBuddy="/usr/libexec/PlistBuddy"

infoPlistFileSource="${SRCROOT}/${INFOPLIST_FILE}"
infoPlistFileDestination="${TEMP_DIR}/Preprocessed-Info.plist"

appName=$($plistBuddy -c "Print CFBundleDisplayName" $infoPlistFileSource)
appNamePrefix=""

appId=$($plistBuddy -c "Print CFBundleIdentifier" $infoPlistFileSource)
appIdSuffix=""

if [[ ${CONFIGURATION} == *"Development"* ]]; then
appNamePrefix="DEV"
appIdSuffix=".dev"
fi

if [[ ${CONFIGURATION} == *"Staging"* ]]; then
appNamePrefix="STG"
appIdSuffix=".stg"
fi

newAppName=$appNamePrefix$appName
$plutil -replace 'CFBundleDisplayName' -string $newAppName $infoPlistFileDestination

newAppId=$appId$appIdSuffix
$plutil -replace 'CFBundleIdentifier' -string $newAppId $infoPlistFileDestination
```

## 補足

### fastlaneでエラー

* この設定を行い、デバッグは出来ていたのですが、fastlaneの`gym(export_method: "ad-hoc")`で`No matching provisioning profiles found for 〜`というエラーが出てしまいました。
* この点に関して、しっかりと検証できていないのですが、おそらく、変更後のAppIDと、そのAppIDのProvisioning Profileが登録済みでなかったからだと思います。
	* [https://developer.apple.com](https://developer.apple.com)
* 一度、XcodeでArchive、Exportでipaを作ると、XcodeがAppIDとsonoAppIDのProvisioning Profileを登録します。
* その後はfastlaneで先程のエラーは発生しなくなりました。

### APNS Provisioning Profile

* Push通知を使っている方はsuffix付きのAPNS Provisioning Profileを使用する必要があります。 

## 最後に

AppIDやProvisioning Profileなど、一部理解が曖昧なところがありますが、ご紹介させて頂きました 
参考になれば嬉しく思います。
shellscriptをserviceコマンドで操作する

Systemdが使用できない環境で、shellscriptの永続化を行いたいときに行った手順です。(Amazon Linuxとかとか)

`myscript`という名前のスクリプトをサービス登録する前提で進めます。

>$ cd /etc/init.d
>$ sudo touch myscript
>$ sudo vi ./myscript

myscriptを以下の内容で保存します。

```shell:myscript
#!/bin/bash
#
# chkconfig: 2345 69 1
# description: myscript

case "$1" in
  start)
        echo "Start"
        /usr/local/sbin/myscript
        return 0
        ;;
  stop)
        echo "Stop"
        killall myscript
        return 0
        ;;
  *)
        echo $"Usage: myscript {start|stop|restart}"
        ;;
esac
```
`# chkconfig: 2345 69 69`
の部分は起動時のランレベルと、起動時の優先度、停止時の優先度をしている箇所になります。
`# description: myscript`
の部分はサービス登録名を指定します。

作成したshellscriptの実行権限を変更します。
>$ sudo chmod 755

サービス登録と起動設定を行います。
>$ sudo chkconfig --add myscript
>$ sudo chkconfig myscript on

サービスの起動

>$ chkconfig myscript start
Chart.js で折れ線グラフを作る

![chart_dec09_bb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/fc8c236b-3fe9-c526-96ba-517b21aaa9d7.png)


```html:index.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>Chart.js 折れ線グラフ</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/3.9.1/chart.min.js"></script>
<script src="line_graph.js"></script>
</head>
<body>
<h1>Chart.js 折れ線グラフ</h1>
<canvas id="chart" height="200" width="400"></canvas>
<hr />
Dec/09/2021<p />
</body>
</html>
```

```js:line_graph.js
// ----------------------------------------------------------------------
//	line_graph.js
//
//					Aug/07/2023
// ----------------------------------------------------------------------
window.onload = ()=>
{
	const config = {
		type: 'line',
		data: barChartData
		}

	const context = document.getElementById("chart")
	const chart = new Chart(context,config)
}

// ----------------------------------------------------------------------
const barChartData = {
	labels : ["2010","2011","2012","2013","2014","2015","2016"],
	datasets : [
		{
		label: "AA",
		lineTension: 0,
		data : [31,25,45,5,20,19,33]
		},
		{
		label: "BB",
		lineTension: 0,
		data : [25,10,54,77,32,9,78]
		}
	]
}

// ----------------------------------------------------------------------
```

次のバージョンで確認しました。

```text
Chart.js v3.9.1
```
AWS Summit Tokyo 2017

無事閉幕しました！
下記リンクに会場レポートがあります。参考にどうぞ！

http://dev.classmethod.jp/series/aws-summit-tokyo-2017/


[![Alt text](https://qiita-image-store.s3.amazonaws.com/0/155802/265d6df4-9443-7f42-433d-90f54ffb6f0d.png)](http://www.awssummit.tokyo/?id=classmethod)
put_role_policyするとMalformedPolicyDocumentExceptionが発生した


pythonでRoleのpolicyを設定使用としたところ以下のエラーが発生して小一時間ハマりました。

```
botocore.errorfactory.MalformedPolicyDocumentException: An error occurred (MalformedPolicyDocument) when calling the PutRolePolicy operation: The policy failed legacy parsing
```

使用したプログラムは次のようなものです。

```
# coding:utf-8
# !/usr/bin/python

import boto3
iamClient = boto3.client('iam')
policy = '''
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "mobileanalytics:PutEvents",
                "cognito-sync:*"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}
'''
iamClient.put_role_policy(
    RoleName='MyRole',
    PolicyName='Policy_Of_MyRole',
    PolicyDocument=policy
)
```

# 原因
どうやらヒアドキュメントの1行目が改行になってしまっていることが原因のようでした。
以下のようにpolicyの設定行を変更したところ正常に設定できるようになりました。

```
policy = '''{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "mobileanalytics:PutEvents",
                "cognito-sync:*"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}
'''
```
角度の計算

角度の単位は2種類があります。

1.  degrees (度)
2.  radians(弧度 ラジアン)

パソコンが計算におき、得意なのはradians

360度の円=6.2832 radians
円=2π
π=3.1416 radians
1 radians=57.2958度

円で言うと
0°=2π=6.2832 radians
90°=1/2π
180°=1π=3.1416 radians
(1π(3.1416)*radian(57.2958)=180)
270°=3/2π
360°=2π

AS3でのradiansとdegressの変換
radians=degrees*Math.PI/180
(3.1416=180°*3.1416/180）
degrees=radians*180/Math.PI
(180°=3.1416*180/3.1416）

<参考>各種図形のrasians

![image.png](https://qiita-image-store.s3.amazonaws.com/0/182890/0ec87e89-e593-e100-3106-da3777bdcc49.png)
WordNetをJavaから使うならJAWJAWが便利

## はじめに
この1週間で[Apitore](https://apitore.com/)ではWordNet系のWebAPIを7本リリースしました。これらはすべてカーネギーメロン大学の嶋さんが作ったJavaライブラリを利用しています。

## 内容
- [WordNetをJavaから使う](http://blog.apitore.com/2017/05/23/wordnet-java/)

## WordNetのWebAPI作りました
- [概念辞書 ～WordNetが簡単に使える～](https://apitore.com/store/apis/details?id=40)
- [概念辞書 ～WordNet 完全版～](https://apitore.com/store/apis/details?id=46)
- [同義語辞書 (WordNet)](https://apitore.com/store/apis/details?id=41)
- [上位概念辞書 (WordNet)](https://apitore.com/store/apis/details?id=42)
- [下位概念辞書 (WordNet)](https://apitore.com/store/apis/details?id=43)
- [和英／英和辞書 (WordNet)](https://apitore.com/store/apis/details?id=45)
- [単語の意味類似度の評価 (8種類)](https://apitore.com/store/apis/details?id=47)
webpack でマルチターゲットの設定

マルチエントリ，マルチターゲットの設定は異なる設定を配列に入れて export してやれば良いようなので，
Electron の　main と renderer のバンドル設定を　entry, output, target を変えて配列に入れて
返せば良いと思われる．

```js:webpack.config.js
var path = require('path');
const webpack = require('webpack');
var webpackMerge = require('webpack-merge');

var baseConfig = {
  output: {
    filename: '[name].bundle.js',
    path: path.resolve(__dirname, 'dist')
  },
  plugins: [
    new webpack.EnvironmentPlugin({
      NODE_ENV: 'development',
      DEBUG: false
    })
  ]
};

var mainConfig = webpackMerge(baseConfig, {
  target: 'electron-main',
  entry: './app/main.js',
});

var rendererConfig = webpackMerge(baseConfig, {
  target: 'electron-renderer',
  entry: './app/renderer.js',
});

module.exports = [mainConfig, rendererConfig];
```

## 追記

スプレッド演算子と TypeScript で記述する場合

```typescript:webpack.config.ts
import * as webpack from 'webpack'

const baseConfig: webpack.Configuration = {

}

const mainConfig: webpack.Configuration = {
    ...baseConfig,
    entry: {
        main: "./src/main.ts"
    }
}

const rendererConfig: webpack.Configuration = {
    ...baseConfig,
    entry: {
        main: "./src/renderer.ts"
    }
}

export default [mainConfig, rendererConfig]

```
OpenCV 2系からOpenCV 3系に乗り換えた時に引っかかる"CV_CAP_PROP_XXX（propId）"の対応表

#概要
OpenCV2で

```py
cap = cv2.VideoCapture('movie.avi')
frames = int(cap.get(cv2.cv.CV_CAP_PROP_FRAME_COUNT))
```
といった感じで処理していた部分をOpenCV3に切り替えたらエラーを吐かれるので、

```py
cap = cv2.VideoCapture('movie.avi')
frames = int(cap.get(7))
```
に切り替えたら解決する。

要は現在のOpenCV3（3.2）ではVideocaptureクラスまわりの関数の説明で、プロップID（propId）とされている部分（CV_CAP_PROP_XXX）が各々対応した0~18の数字に切り替えられたという話。


#対応表
|propId name|propId No.|Description|
|:--|:-:|:--|
|CV_CAP_PROP_POS_MSEC           |0| Current position of the video file in milliseconds.|
|CV_CAP_PROP_POS_FRAMES         |1| 0-based index of the frame to be decoded/captured next.|
|CV_CAP_PROP_POS_AVI_RATIO      |2| Relative position of the video file: 0 - start of the film, 1 - end of the film.|
|CV_CAP_PROP_FRAME_WIDTH        |3| Width of the frames in the video stream.|
|CV_CAP_PROP_FRAME_HEIGHT       |4| Height of the frames in the video stream.|
|CV_CAP_PROP_FPS                |5| Frame rate.|
|CV_CAP_PROP_FOURCC             |6| 4-character code of codec.|
|CV_CAP_PROP_FRAME_COUNT        |7| Number of frames in the video file.|
|CV_CAP_PROP_FORMAT             |8| Format of the Mat objects returned by retrieve().|
|CV_CAP_PROP_MODE               |9| Backend-specific value indicating the current capture mode.|
|CV_CAP_PROP_BRIGHTNESS         |10| Brightness of the image (only for cameras).|
|CV_CAP_PROP_CONTRAST           |11| Contrast of the image (only for cameras).|
|CV_CAP_PROP_SATURATION         |12| Saturation of the image (only for cameras).|
|CV_CAP_PROP_HUE                |13| Hue of the image (only for cameras).|
|CV_CAP_PROP_GAIN               |14| Gain of the image (only for cameras).|
|CV_CAP_PROP_EXPOSURE           |15| Exposure (only for cameras).|
|CV_CAP_PROP_CONVERT_RGB        |16| Boolean flags indicating whether images should be converted to RGB.
|CV_CAP_PROP_WHITE_BALANCE      |17| Currently unsupported.|
|CV_CAP_PROP_RECTIFICATION      |18| Rectification flag for stereo cameras (note: only supported by DC1394 v 2.x backend currently).|

[参考](http://docs.opencv.org/3.1.0/d8/dfe/classcv_1_1VideoCapture.html)

追記、OpenCVがマイナーチェンジしているので、若干古い情報となっています。今は使えますが気をつけてください。
Firebaseインスタンスをライブラリ内で呼び出すときの注意点

備忘録としてメモります。

build.gradleで
`apply plugin: 'com.android.application'`
のようなアプリケーションプロジェクトでFirebaseStorageなどをインスタンス化する場合は

```application.kt
val storage = FirebaseStorage.getInstance()
```
で良いわけですが、

`apply plugin: 'com.android.library'`
のようないわゆるライブラリプロジェクトでFirebaseインスタンスを生成する場合には

```library.kt
val storage = FirebaseStorage.getInstance(FirebaseApp.intializeApp(context))
// このcontextはアプリケーションプロジェクトで参照されるコンテキスト
```
のようにアプリケーションプロジェクトのコンテキストを使って初期化してやらなければいけません。
これはstorageに限らず、AnalyticsやCrashReportでも同様です。

google-services.jsonにはライブラリプロジェクトの情報がないので当然といえば当然ですけどね
Visual Studio 2017でPython開発　を参考にした

(参考1)Visual Studio 2017でPython開発
http://qiita.com/akabei/items/a3b8b62f1cf34b683121
(参考2)Visual Studio 2015でpythonを実行するときコマンドプロンプトを非表示にする方法
http://qiita.com/RIT80/items/328efdbc54802c8c54af

※Python,PyCharmCE2017.1,Sympyを既にインストールしていました。
#出力ウインドウ(出力元S:デバッグ)があるので,コマンドプロンプトは要らない

(設定)
参考2より,
プロセスが異常終了した場合に入力を待機する(W)
プロセスが正常終了した場合に入力を待機する(T)

(結果)最初、コマンドプロンプトが表示されるが、自動的に閉じた。
(参考)「Visual Studio Code」と「Visual Studio」でvbsを実行してみた
http://qiita.com/mrrclb48z/items/a48324322e5c8e26b2bd
「pythonの辞書型」と「excelの関数」を比較してみた

(参考) 以下おすすめです。たいへんわかりやすいです。

http://qiita.com/KatsunoriNakamura/items/b465b0cf05b1b7fd4975

http://www.k-techlabo.org/www_python/python_main.pdf#page=20

# lookup関数

```
dic = {'apple':' りんご','orange':' みかん','lemon':' レモン'}
dicOut=dic['apple']
print('-----------------------------------------------------')
print(type('apple'),'apple')
print(type(dic)   ,dic)
print(type(dicOut),dicOut)
#<class 'str'> apple
#<class 'dict'> {'apple': ' りんご', 'orange': ' みかん', 'lemon': ' レモン'}
#<class 'str'>  りんご
```
# sum関数
```
dic = {'apple':50,'orange':60,'lemon': 70}
list = dic.values()
gokei= sum(list)
print('-----------------------------------------------------')
print(type(list),list)
print(type(gokei),gokei)
#<class 'dict_values'> dict_values([50, 60, 70])
#<class 'int'> 180
```
(参考)

http://qiita.com/k-nakamura/items/e43338e0007d79316c02

# sumif関数
調査中
# セルに名前を定義する(Nameプロパティ)
リスト1とリスト2から辞書型を作成

```python
def list2dic(lst1,lst2):
    n=len(lst1)
    i=0
    dict={}
    while i<n:
       dict[lst1[i]]=lst2[i]
       i += 1
    else:
       return dict
lst1= ['apple' ,'orange', 'lemon']
lst2= ['りんご', 'みかん', 'レモン']
lst12=list2dic(lst1,lst2)
print(type(lst12),lst12)
#<class 'dict'> {'apple': 'りんご', 'orange': 'みかん', 'lemon': 'レモン'}

```

# 特定のセルまたはセル範囲を選択する
(参考)組み込みの dict 型に対する変更どうしても値のリストが必要な場合には、返された dict オブジェクトをキャストする

https://www.ibm.com/developerworks/jp/linux/library/l-python3-1/


```python
myDict = {'apple':50,'orange':60,'lemon': 70}
myList = myDict.values()
myCast = list(myList)
myGokei= sum(myList)
print('-----------------------------------------------------')
print(type(myList),myList)
print(type(myCast),myCast)
print(type(myGokei),myGokei)
# <class 'dict_values'> dict_values([50, 60, 70])
# <class 'list'> [50, 60, 70]
# <class 'int'> 180
```
ローカルファイルでも vimium を利用する方法


# 2019/04/29 追記

`chrome://settings/extensions` ではなく `chrome://extensions/` で Chrome 拡張の設定画面に遷移。Vimium を選択して「ファイルの URL へのアクセスを許可する」にチェックすれば OK

# 設定手順
- `chrome://settings/extensions` を開く
- Vimium にローカルファイルアクセス権を付与する
- ローカルファイルを Chrome で開いてみて Vimium が有効になっているか確認
- firefox で VimFx を利用している場合はデフォルトで利用できた。

# 参考
- https://github.com/philc/vimium/issues/502
Switch platformでNo WebGL module loaded.と表示される場合

![スクリーンショット 2017-05-22 20.04.42.png](https://qiita-image-store.s3.amazonaws.com/0/72559/820c8ae1-3531-e918-153c-846dcf964894.png "スクリーンショット 2017-05-22 20.04.42.png")

#問題
`File -> Build Setting` の `Switch Platform` でWebGLを選択しようとすると

```
No WebGL module loaded.
```
と表示される。

#解決
WebGLをBuildするためのモジュールがインストールされていない状態なので

```
No WebGL module loaded.
```
と書いてる下にある `Open Download Page` をクリックするとWebブラウザが開いてDLが開始されます。

ファイル名は `UnitySetup-WebGL-Support-for-Editor-5.5.1f1.pkg` のような感じです。
ファイル名にバージョン名が含まれる感じです。


あとはUnityを閉じて、インストーラーを起動してインストールを開始します。
注意することは、Unity自体を最初にインストールする際は `unity` というフォルダ名でインストールされると思うのですが、
複数のUnityバージョンをインストールしている方でUnityのフォルダ名を `unity-バージョン名` 等に変更している場合、一度 `フォルダ名` を `unity` に変更する必要があります。

`unity` ディレクトリの中にある実行ファイルのバージョンが、インストーラーのバージョンと異なっていてもエラーになります。

##方法1
エラーにならない手順として

 1. platformを追加したいunity実行ファイルを配置してるディレクトリ名を `unity` にする。
 
 2. Unityを起動し、`File -> Build Setting` `Switch Platform` でWebGLを選択し `Open Download Page`からインストーラーをDL
 
 3. Unityを閉じる
 
 4. DLしたインストーラーを起動し、インストール作業を進める
 
 完了
 
##方法2
Unityのバージョンが古い場合、インストーラーのページで404エラーになる場合があるそうです。

別途インストーラーを探すかUnityを再インストールすることで解決するかと思います。
 
以下のようにインストールする際にモジュールファイルを一緒にインストールするかを選ぶことが出来ます。

 ![スクリーンショット 2017-05-22 19.44.19.png](https://qiita-image-store.s3.amazonaws.com/0/72559/52b85c1b-1fd6-0fa5-3315-f9204cdcb0fd.png "スクリーンショット 2017-05-22 19.44.19.png")

今回はWebGLでしたが、他のplatformでも同じかなって思います。
Electronを使ってローカルファイルにアクセスするアプリを作ってみる


### 開発環境

+ node.js
+ Electron1.6.7


Electronの魅力の一つにWebアプリケーションの作りで、ローカルファイルにアクセスできる点があるという。
ならば、と作ったのがこのシンプルなアルバム。

![20170522.gif](https://qiita-image-store.s3.amazonaws.com/0/40693/8f336f23-9483-3dd4-0d8a-85f0f0dbec9f.gif "20170522.gif")

うーむ、当初はわざわざJavaScriptでローカルアプリ作る必要あんの？って思ったけど、思ってるより作りやすいな・・・インターフェースとサーバ側を同じ言語が使えると言うのが想像以上にやりやすいです。

ソースはgithubに上げておきました。
[album-app](https://github.com/rnsm504/node/tree/master/album-app)

#### Dialogの使い方

propertiesに配列でセットすれば、色んな使い方が出来るので[公式](https://electron.atom.io/docs/api/dialog/)を確認して試すといいかも


```index.html
<javascript>
    const {ipcRenderer} = require('electron');
    const {dialog} = require('electron').remote;

    function openDialog(){
      var options = {
        title : "open folder",
        properties : ['openDirectory']
      };
      dialog.showOpenDialog(options, function(filenames) {
        ipcRenderer.send('mul-async-dialog', filenames);
        ipcRenderer.on('mul-async-dialog-replay', (event, arg) => {
          msg(arg);
        });
      });
    }

</javascript>
```

```main.js
var ipc = require('electron').ipcMain;

ipc.on('mul-async-dialog', function(event, arg) {
    // console.log(arg[0]);
    if (!arg) {return;} // cancel selected
    path = arg[0];
    index = 0;
    fileRead(); //filePathに画像のパスをセットする
    event.sender.send('mul-async-dialog-replay', filePath);
  }
);

```

アルバムなので本当は写真の一覧でも表示すればいいのだろうけど、面倒だったのでタップすれば次の写真を読み込むようにしました。一方的に進めないけど・・・。DOMContentLoadedはhtml側の読み込みが終わってから処理しろよって意味です。これがないと本体より前に書いたjavascriptでこけたので。

```index.html
<javascript>
     function getReadASync() {
      ipcRenderer.send('mul-async');
      ipcRenderer.on('mul-async-replay', (event, arg) => {
        msg(arg);
      });
    }

    function msg(msg) {
      info.src = msg;
    }

    document.addEventListener("DOMContentLoaded", function(){
      document.getElementById("imgArea").addEventListener("click", function(){
        getReadASync(); 
      });
    }, false);
</javascript>
<body>
    <div id ="imgArea">
      <img id="info" width="800" height="550"></img>
    </div>
```

ここらへんの技術は正直難しそうで敬遠してたところもあるけど、いざ使ってみるとなかなか面白いのでもう少し追っかけてみようと思います。
localにあるGlassFishとPayaraのバージョンを確認する方法

# version サブコマンドで確認できます。
(参考)[Enterprise Server のバージョンを表示する (Sun GlassFish Enterprise Server v3 管理ガイド) ](https://docs.oracle.com/cd/E19226-01/821-1299/ghhox/index.html)

```text
asadmin> version
```

## 例えばWindows
「/c/apps」に配置している場合。

```bash
# こんな感じとか
$ /c/apps/payara5/bin/asadmin version
Version string could not be obtained from Server [localhost:4848].
(Turn debugging on e.g. by setting AS_DEBUG=true in your environment, to see the details.)
Using locally retrieved version string from version class.
Version = Payara Server  5.194 #badassfish (build 327)
Command version executed successfully.

# こんな感じ
$ /c/app/glassfish-4.1/glassfish4/glassfish/bin/asadmin version
Version string could not be obtained from Server [localhost:4848].
(Turn debugging on e.g. by setting AS_DEBUG=true in your environment, to see the details.)
Using locally retrieved version string from version class.
Version = GlassFish Server Open Source Edition  4.1  (build 13)
Command version executed successfully.
```

### 例えばmacOS Sierra
GlassFishはHomebrewで配置しました。

```bash
$ /usr/local/Cellar/glassfish/4.1.2/libexec/glassfish/bin/asadmin version
Version string could not be obtained from Server [localhost:4848].
(Turn debugging on e.g. by setting AS_DEBUG=true in your environment, to see the details.)
Using locally retrieved version string from version class.
Version = GlassFish Server Open Source Edition  4.1.2  (build 1)
Command version executed successfully.
```
イチからDiscord Bot 。for Ruby

※基本的なCUI操作などは説明がないです。  

DiscordのBotで検索しても、みんなPythonの話しかしてない。
あまりに情報が少なくて辛かったので、今から作ろうとしている人に、残していきます。  

OS:windows10 (CentOS,Raspbian)
環境:Ruby2.3.3

# Discordrbの紹介
**discordでbotを作るためのgem**  ...だけだと味気ないので少々詳しく。
discordには、[外部からテキストチャット、ボイスチャットなどにアクセスできるAPI](https://discordapp.com/developers/docs/intro)があります。
discordrbはそれらのAPIをrubyらしくいじれるようにしたラッパーです。GitHubのwikiやClassListが充実しているので、初心者でも（英語を）頑張れば使えると思います。

## Discordrbのインストール 
Discordrbはgemに登録されているので、かんたんに導入できます。  
 `$ gem install discordrb`   
もちろん、 Bundlerでも使えます。Gemfileに
 `gem 'discordrb'` と追記して `$ bundle install` 

## hello,worldのコードを書く
お好みのエディタで以下のコードを書いてみてください。  

```ruby:hello.rb
require 'discordrb'

bot = Discordrb::Commands::CommandBot.new (
token: TOKEN,
client_id: CLIENT_ID,
prefix:'/',
)

bot.command :hello do |event|
 event.send_message("hallo,world.#{event.user.name}")
end

bot.run
```  

hello.rbと名前を付けて保存。
TOKENとCLIENT_IDについては後々説明します。
これで `/hello` と打つと、 `hello,[UserName].` と返ってくるbotができました。
(hello,worldじゃないやん)  

## DiscordにBotを登録する
discordには登録しているものとして話を進めます。
登録してない方は -> https://discordapp.com/register  
  
1. 次ののURLでNewAppをクリック https://discordapp.com/developers/applications/me
2. APP NAMEを決めて、「Create App」をクリック
3. 「Create a Bot User」をクリック
4. Client ID(18桁くらいの数字)とToken（click to revealをクリックして出てきた英数字）をメモ
5. 以下のURLに、Client IDを置き換えてアクセス  
discordapp.com/oauth2/authorize?client_id=**Client ID**&scope=bot&permissions=0  
6. 接続させたいサーバーを選択

登録完了。
## botを起動
まず、さっき書いたコードを開いて、メモしたClient IDとTokenを、それぞれCLIENT_IDとTOKENに書き換えます。
その後、コマンドプロンプト(ターミナル)で `$ ruby hello.rb ` でbotが起動されます。  

## Discord上で/hello
ちゃんと返って来たら、正常に稼働しています。
お疲れ様でした。  
  
  
どうだったでしょうか？ちゃんと動きましたか？
もしダメなときはコメント頂けたら、お手伝い出来るかもしれません。(気まぐれで)  

## 参考サイト
+ [Asamac blog - Discord Bot の 簡単な作り方](https://asamacs.wordpress.com/2016/06/22/discord-bot-の-簡単な作り方/)  
+ [GitHub - meew0/discordrb: Discord API for Ruby](https://github.com/meew0/discordrb/)  
+ [Documentation for meew0/discordrb (master)](http://www.rubydoc.info/github/meew0/discordrb/Discordrb/)
+ [Discord - Developer Documentation](https://discordapp.com/developers/docs/intro/)
Error in linking security policy for appName -- Inconsistent Module State. となってしまった時の対応方法

- 環境
    - OS : Windows7
    - Eclipse : Kepler Service Release 2
        - Build id: 20140224-0627
    - GlassFish : 4.1.1

# 事象 : EclipseでGlassFishを起動したらエラーになって起動できなかった。

```text:ダイアログに表示されたエラー
cannot Deploy appName
deploy is failing=Error occurred during deployment: Exception while loading the app : Error in linking security policy for appName -- Inconsistent Module State. Please see server.log for more details.
```

server.logを見ろと言われたので {GlassFishのフォルダ}\glassfish\domains\{使っているドメイン}\logs\server.log を見ました。

```text:server.log
[2017-05-22T16:10:14.135+0900] [glassfish 4.1] [SEVERE] [NCLS-CORE-00026] [javax.enterprise.system.core] [tid: _ThreadID=45 _ThreadName=admin-listener(5)] [timeMillis: 1495437014135] [levelValue: 1000] [[
  Exception during lifecycle processing
org.glassfish.deployment.common.DeploymentException: Error in linking security policy for appName -- Inconsistent Module State
    at com.sun.enterprise.security.ee.SecurityUtil.linkPolicyFile(SecurityUtil.java:336)
    at com.sun.enterprise.security.ee.SecurityDeployer.linkPolicies(SecurityDeployer.java:318)
    at com.sun.enterprise.security.ee.SecurityDeployer.access$100(SecurityDeployer.java:87)
    at com.sun.enterprise.security.ee.SecurityDeployer$AppDeployEventListener.event(SecurityDeployer.java:145)
    at org.glassfish.kernel.event.EventsImpl.send(EventsImpl.java:131)
    at org.glassfish.internal.data.ApplicationInfo.load(ApplicationInfo.java:328)
    at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:496)
    at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:219)
    at org.glassfish.deployment.admin.DeployCommand.execute(DeployCommand.java:491)
...省略...
```

# 原因 : generatedディレクトリ配下にごみ的なのがあるから
> Remove the application folder which is placed under policy folder:
> ```rm -Rf /opt/sun-glassfish/glassfish/domains/domain1/generated/policy/appname```
> [Glassfish: Error in linking security policy for - Stack Overflow](https://stackoverflow.com/questions/25976011/glassfish-error-in-linking-security-policy-for)

私は最初に見たサイトがこちらだったので generated フォルダ配下を全て削除しましたが、うまくいきました。

> Stoped the Glassfish server
> Deleted all the content from ```glassfishhome/glassfish/domains/yourdomainname/generated```
> Started Glassfish
> [deployment - Glassfish DeploymentException: Error in linking security policy for - Stack Overflow](https://stackoverflow.com/questions/7322476/glassfish-deploymentexception-error-in-linking-security-policy-for)

## 対応 : 停止していないGlassFishを殺して、generatedディレクトリ配下を削除する
[RHEL6で似たようなことがあった時の対応記録](https://qiita.com/ponsuke0531/items/a496458fc3b0962816d4)

1. Eclipse[サーバー]タブでGlassFishを停止する
1. EclipseのサーバView上で停止していても動いていることがあるのでタスクマネージャーなどで怪しいjava.exe(停止していないGlassFish)がいたら殺す。
1. generatedディレクトリ配下をすべて削除する
    - `{GlassFishのフォルダ}/glassfish/domains/{使っているドメイン}/generated/`
1. Eclipseの[サーバー]タブでGlassFishを選択して右クリック > [クリーン]
    - generatedディレクトリ配下が再作成される
1. [プロジェクト] > [クリーン]
1. デプロイして起動する
整数値のベクトルをone hot表現に変換

クラス分類問題などで、整数値のベクトルをone hot表現に変換する場合、
pythonではnumpyを使って以下のように変換できる。

```python:python
import numpy as np

target_vector = [0,2,1,3,4]               # クラス分類を整数値のベクトルで表現したもの
n_labels = len(np.unique(target_vector))  # 分類クラスの数 = 5
np.eye(n_labels)[target_vector]           # one hot表現に変換
```

```python:実行して得られるone-hot表現
array([[ 1.,  0.,  0.,  0.,  0.],   # 0
       [ 0.,  0.,  1.,  0.,  0.],   # 2
       [ 0.,  1.,  0.,  0.,  0.],   # 1
       [ 0.,  0.,  0.,  1.,  0.],   # 3
       [ 0.,  0.,  0.,  0.,  1.]])  # 4
```


##参考
https://www.reddit.com/r/MachineLearning/comments/31fk7i/converting_target_indices_to_onehotvector/
【まつもとゆきひろ氏特別講演】若手エンジニアの生存戦略を聞いて

https://supporterzcolab.com/event/30/

# 若手エンジニアが生き残るためには
死ななければ良い！！

死なないための戦略をたてるための戦略が必要

### シリコンバレーのスタートアップ会社で成功する人で共通する能力
パターン認識能力が優れている

過去の歴史は真似をしてもあんまり意味がない．

じぶんの成功するパターンを抽出することが意味がある！！


## Matsの歴史
### 12際でボードマイコン遭遇
### 15際でポケコン遭
* BASICが入っている
* ユーザ定義関数ない
* 変数名一文字しかない(グローバル変数26文字しかない)
### Pascal入門に出会い，ノートに記述してプログラミングする(本体は持っていない)
### Lisp, Logo, Smalltalkが出てくる (言語よりそれを使ったゲームとかが有名になってくる)
### 大学に進学! 
* 思っていたのと違い，言語に興味のある人がほとんどいなかった
* 環境は揃っている！ここは天国か！
### 就職活動
* 東京で働きたくない！
### 浜松に就職
* 同期200人，CS専門6人 → 鶏口牛後
* 社内システムに携わる → 自分でどうあるべきか考えれる
### 我慢は誰のためにもならない	
* 毎日スーツできていたが，私服で行き始めたが誰にも何も言われない．
* 問題のある我慢は意味がない，理不尽が敵だ！！

## プログラマ三大美徳
### 怠惰
* 全体の労力を減らすために手間をおしまない気質．

### 短気
* コンピュータがタイマンな時に感じる怒り，今後おこりうる問題を想定したプログラムをかく．

### 傲慢
* 誰にでも誇れるシステムや仕組みをつくりを目指すべき。


## 無意識の価値構造
### 勤勉: 一生懸命働く
* 苦労
* 苦痛
* 我慢

労働する事は我慢ではない．
報酬は苦痛の対価ではない
報酬は価値の対価


会社に捨てられても，次に行けば良い，理不尽は拒否しなければならない
苦痛への忍耐がたかまる



## ポジティブシンキングに！
少ない労力で楽をしよう！

### 空気をよまない!!
* 目的を明確化する
* 目的と手段が混同しない


### 理不尽をどうやって拒否するか
* 価値観にアプローチする
人に変わってもらう事は期待できない
自分の信じる価値観に移動する
* リスペクトできる関係を構築する

### 7つの習慣
WinとLoseの組み合わせ
４種類じゃない，２種類だ
* Win - win
* No - Deal

逃げてもいいんだ(場合によっては)

それが死なないパターン



# あなたの場合の生存戦略
* 我慢に価値をおかない
* 自分を知る
	- 自分が努力できること．自分がやりたくない事


# マッツの価値
* 継続できること(25年続くソフトウェアを作成)
* こっちに行けば幸せになりそう
* 社会的圧力に鈍感さ

## 人生においてのインベントリが必要
自分のスキルを棚卸しをして，組み合わせてたたかう

## 思い込みに自覚的になる
インバリデーションのないキャッシュは大変
意識的にキャッシュをクリアする

## プログラマの仕事は問題解決
https://supporterzcolab.com/event/30/

## インプットは差別化要因にならない
アプトプットが大事

### 高いハードル
心理的障壁が高い！


## コンピュータに対して仕事をしていても，使うのは人間．
人間の心理をかんがえろ
人間心理に興味を持とう

## 勤勉に価値を持つ人はどうやって黙らせるか
* 成果で黙らせる
* 上司の上司に話をする
* やめる

## おすすめの本
* https://www.amazon.co.jp/dp/B01GDS0994
* https://www.amazon.co.jp/dp/4873118026

## 思い込みの打破
失敗した時に失敗したパターンを知る
気配がするようになる

## トレンドを知る
なんで今これが出てきたのだろう．
流行っているのだろう
と，どんな問題を解決したいからでてきたかは知る．
OSX MySQL-python 1.2.5のエラー対処　IndexError: string index out of range

一旦諦めてましたが、職場の大大大先輩のおかげでこの数日C/C++のコンパイルスキル上がったので再度トライ！

```
# まずは、自分でmysql−connector-c をダウンロードし、インストール
https://dev.mysql.com/downloads/connector/c/
# ここの詳細は割愛する, でもこんな感じ。 tar zxvf xxxx.tar.gz; cd mysql*; mkdir build; cd build; cmake ..; make; sudo make install

# mysql_config は/usr/local/mysql/bin/にインストールされるので適当にリンク貼る
ln -s /usr/local/mysql/bin/mysql_config /usr/local/bin/

% pip install mysql-python
Collecting mysql-python
  Using cached MySQL-python-1.2.5.zip
    Complete output from command python setup.py egg_info:
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "/private/var/folders/9j/12cqyk6x2s5dc22x2mnlpmmw0000gn/T/pip-build-Cf6eHO/mysql-python/setup.py", line 17, in <module>
        metadata, options = get_config()
      File "setup_posix.py", line 53, in get_config
        libraries = [ dequote(i[2:]) for i in libs if i.startswith(compiler_flag("l")) ]
      File "setup_posix.py", line 8, in dequote
        if s[0] in "\"'" and s[0] == s[-1]:
    IndexError: string index out of range

# 自分でzipダウンロードしトライするhttps://pypi.python.org/pypi/MySQL-python/1.2.5
% unzip MySQL-python-1.2.5.zip; cd MySQL-python*;
% python setup.py build
Traceback (most recent call last):
  File "setup.py", line 17, in <module>
    metadata, options = get_config()
  File "./MySQL-python-1.2.5/setup_posix.py", line 53, in get_config
    libraries = [ dequote(i[2:]) for i in libs if i.startswith(compiler_flag("l")) ]
  File "./MySQL-python-1.2.5/setup_posix.py", line 8, in dequote
    if s[0] in "\"'" and s[0] == s[-1]:
IndexError: string index out of range

# ここはPythonのバグ、文字列をチェックしていないので、以下の方法でFix
if s[0] in "\"'" and s[0] == s[-1]:
を
if s and s[0] in "\"'" and s[0] == s[-1]:
に変更。

# もう一回トライ
% python setup.py build
/usr/bin/clang -bundle -undefined dynamic_lookup -arch i386 -arch x86_64 -g build/temp.macosx-10.6-intel-2.7/_mysql.o -L/usr/local/mysql/lib -l -o build/lib.macosx-10.6-intel-2.7/_mysql.so
clang: error: no such file or directory: 'build/lib.macosx-10.6-intel-2.7/_mysql.so'
error: command '/usr/bin/clang' failed with exit status 1
# こんな楽だと思ったが、現実はそんなにあまくない！
# 内容確認したが.oは作られている、でも.soの作成に失敗

# じゃ、自分でコンパイルするか
clang -bundle -undefined dynamic_lookup -arch x86_64 -g build/temp.macosx-10.6-intel-2.7/_mysql.o -L/usr/local/mysql/lib -lmysqlclient -o build/lib.macosx-10.6-intel-2.7/_mysql.so 
# -lmysqlclientがポイント, pythonはわざとリンクしない、動的に発見させる
# エラーなし、はいOK

# インストールすれば完成
% python setup.py install 
...
Processing dependencies for MySQL-python==1.2.5
Finished processing dependencies for MySQL-python==1.2.5

% python
Python 2.7.13 (v2.7.13:a06454b1afa1, Dec 17 2016, 12:39:47) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import _mysql
>>> import MySQLdb
>>> ^D
```

:)
Visual Studio 2017でAWS SDK for Python(Boto3)開発

Visual Studio 2017でPythonを使ってAWS S3へアクセスする手順です。

#環境
Windows 7 Professional SP1 64bit
Visual Studio 2017 Community 15.2 (26430.6)
Python 3.6.0
boto3 1.4.4

環境構築やPythonプロジェクトの作成はこちらを参考にしてください。
http://qiita.com/akabei/items/a3b8b62f1cf34b683121

#プロジェクト作成
新しいプロジェクトで「Python アプリケーション」を作成します。

![aaa.png](https://qiita-image-store.s3.amazonaws.com/0/112075/ddf201b3-cd54-13ef-7bdd-785b6afac8f5.png)

#boto3パッケージインストール

プロジェクトのPython環境から「Python 3.6 (64bit) (グローバル デフォルト)」を右クリックして「Python パッケージのインストール...」を選択します。

![bbb.png](https://qiita-image-store.s3.amazonaws.com/0/112075/3a03963a-2526-0be6-250f-1a0f81ff1f82.png)

テキストボックスに「boto3」と入力して、「boto3(1.4.4)のインストール」を選択します。

![ccc.png](https://qiita-image-store.s3.amazonaws.com/0/112075/02a46bc4-ae7b-0a79-0612-5bb9b733a3eb.png)

管理者権限が必要とダイアログが表示されたら「今すぐ昇格」を選択します。

![ddd.png](https://qiita-image-store.s3.amazonaws.com/0/112075/737a04b5-2559-1ed3-7f8e-fdaab9f81af3.png)

パッケージのインストールが終わると「Python 3.6 (64bit) (グローバル デフォルト)」に「boto3 (1.4.4)」が表示されます。

![eee.png](https://qiita-image-store.s3.amazonaws.com/0/112075/528a8b2b-28cd-b106-ce27-25ec9f6a75c9.png)

#S3バケット一覧表示
S3のバケット一覧を表示するプログラムをs3bucket.pyに記述します。

```Python:s3bucket.py
import boto3

session = boto3.Session(aws_access_key_id='XXXXXXXXXXXXXXXXXX',
                        aws_secret_access_key='YYYYYYYYYYYYYYYYYYYYYYYYYYYY',
                        region_name='ap-northeast-1')

s3 = session.resource('s3')
for bucket in s3.buckets.all():
    print(bucket.name)
```

事前にaws configureコマンドで認証情報を設定してあれば次のようにboto3.Session()は不要です。

```Python:s3bucket.py
import boto3

s3 = boto3.resource('s3')
for bucket in s3.buckets.all():
    print(bucket.name)
```

実行してバケット一覧が取得できれば完成です。
AWS EC2で従量制VPNサーバの構築

# はじめに

仕事柄海外のブログを閲覧しますが、中国在住だと悪名高い金盾によりネットワークが遮断されることがしばしば起こります。その場合はVPNを使いますが、閲覧したい時にだけ利用するのに月額サービスを利用するのはあまりにもったいない。そこで、自前で従量制VPNサーバを構築してみました。ただそれだけだとすぐに話が終わるので、専用のCLIツールについても紹介します。

# VPNサーバについて

タイトルで既にネタばれですが、要はAWS EC2を利用するだけです。インスタンスの起動時間で実質的に料金が決まるので、ここへVPNサーバを構築すれば「従量制VPNサーバ」の出来上がりです。ちなみに、VPNサーバ構築手順についてはネットに出回っているため、ここでの説明は省略します。

ただし、インスタンス起動時には必ずVPNが接続できる状態にしておいてください。そのため、構築時には以下のコマンドでサービス自動起動するかどうか確認しておいてください。

```bash
$ systemctl status [service]
```

# CLIツールについて

上記インスタンスをワンライナーで起動または停止するツールを作成しました。

[aws-ec2-manager - the tools is managing AWS EC2 instance by python3.](https://github.com/mmorita44/aws-ec2-manager)

このツールでいつでもどこでもVPNを利用できます。コマンドの実行にはインスタンスIDが必要なので、予め控えておいてください。ツールのインストール方法及び利用方法については[Readme](https://github.com/mmorita44/aws-ec2-manager/blob/master/README.md)をご覧ください。

コマンド実行時にはVPNサーバのパブリックIPアドレスを表示するようにしています。それをVPNクライアントソフトウェアに設定してVPN接続してください。

# 最後に

現在はVPNサーバのIPアドレスを取得するだけですが、更に発展させれば、コマンド一つでVPNクライアントへIPアドレスを設定しVPN接続することもできます。ただし、実行環境や利用するVPNクライアントソフトウェアへ依存するため、それは追々先の話でしょうか。
AWS環境構築でやったこと


自分用のメモですが、よければ参考にしてください。

# AWS
　言わずもがな、Amazon Web Services　のことです

## 準備

* アカウント作成
	
	https://aws.amazon.com/jp/register-flow/

## EC2コンテナ作成

参考：http://qiita.com/tmknom/items/303db2d1d928db720888

ほとんどこの通り！ありがとうございます！


* 初期設定
	* 二段階認証
		* 二段階認証のトークンには"Google authenticator"を利用
		* https://itunes.apple.com/jp/app/google-authenticator/id388497605?mt=8

	* ユーザ設定/セキュリティ設定
	* 請求情報のアラームを作成
		* 値段
		```
			t2.micro :　 $0.012 /1 時間
		```
			https://aws.amazon.com/jp/ec2/pricing/on-demand/



* EC2コンテナ作成
	* コンソールにサインイン
	* Services -> EC2
	* Launch Instance
	* Amazon Linux -> select
	* select t2.micro
	* Launch!

* セキュリティグループの設定
	* Inboundに、SSH, HTTP, HTTPSを設定

## SSHアクセス
* 固定IPの設定
	* Network & Security -> Elastic IPs
	* Allocate New address
	* Actions -> Associate address
	* Instanceと紐付ければOK

* SSHアクセス
	* pem取得
		* Network & Security -> Key Pairs
		* Create Key Pair
		* 証明書ダウンロード
	* SSHアクセス

	```
	ssh -i xxx.pem ec2-user@ec2-XX-YY-WW-ZZ.us-west-2.compute.amazonaws.com
	```

アクセスできたらもうあなたはAWSマスター

## 構築後

* セキュリティアップデート

```
	yum -y update

```

	* 自動更新設定
	http://qiita.com/yangci/items/2ccac2b598900eb5928d

* ツールのインストール

```
	yum -y install oh-my-zsh
	yum -y install emacs
	
	#etc...

```

* ドメイン取得 
	* http://www.onamae.com/ 
	* 外向けIPと紐付け。
appear.in の 基本的な使い方

最近リモートワークを取り入れている企業で使われているのをよく見かけるようになりました。
私もオススメで、プライベートでも使ってます。

他の方に勧めることが多くなってきたので基本的な使い方を纏めてみた。

## ビデオチャットを始める
[appear.in](https://appear.in) にて、
Create a room link to start talking のテキストボックスにルームの名前を入力し、Startボタンをクリックする。

![appear_howto_1.png](https://qiita-image-store.s3.amazonaws.com/0/6311/6f267cff-9918-ab29-c663-cba3830b3893.png "appear_howto_1.png")

一度ビデオチャットを開始すると、リンクを直接開くと直ぐにビデオチャットを開始できます。

## メンバーを招待する
- リンクをコピーし、招待先に知らせることができます。

## 画面を共有する
![appear_howto_2.png](https://qiita-image-store.s3.amazonaws.com/0/6311/f4e083eb-6899-90cb-c55e-47c0d25c3936.png "appear_howto_2.png")


- 画面下部のツールバーから、 Share screen をクリックする。
- 共有先を選択し、共有をクリックする。
- 画面が共有できます。
- 共有を終えるときは、画面下部のツールバーの、 Stop sharing をクリックする。

## 名前を変更する
![appear_howto_3.png](https://qiita-image-store.s3.amazonaws.com/0/6311/3a36b3ca-f905-301e-7d41-353426130d01.png "appear_howto_3.png")

- Sign Upしない場合、常にゲストアカウントになるので、（ビデオオフだと特に）誰が誰だかわからなくなる。そんなときは Edit name をクリックすれば名前を変更できる。

![appear_howto_4.png](https://qiita-image-store.s3.amazonaws.com/0/6311/f9f78721-d6dc-60fb-a0ae-967a892ad1ad.png "appear_howto_4.png")


## Stickerを流す
- 画面下部のツールバーから、 Stickers をクリックする。
- 画面にStickerが流れます。

## 音声/ビデオのON/OFFをコントロールする
- OFFにする場合、画面下部のツールバーから、Mute/Video off をクリックする。
- OFFの状態は画面に表示されます。

- ONにする場合、画面下部のツールバーから、Unmute/Video on をクリックする。


## 一時的なメッセージをやりとりする
![appear_howto_12.png](https://qiita-image-store.s3.amazonaws.com/0/6311/134a8855-39d0-e45c-5769-de8b5d3caffa.png "appear_howto_12.png")


- 画面右下の吹き出しアイコンをクリックする。

![appear_howto_9.png](https://qiita-image-store.s3.amazonaws.com/0/6311/9f89b870-8de5-5a87-6007-d4334fd3f18e.png "appear_howto_9.png")

- メッセージウィンドウが表示されます。
- 終了する場合、メッセージウィンドウ右上の✕をクリックする。
- メッセージはビデオチャットを終えると消えます。

## ビデオチャットを終了する
- 画面下部のツールバーから、✕アイコンをクリックする。
- 「How was the audio quality?」と音声品質を問う画面が表示される。
- 良かったか悪かったかクリックし、ブラウザを閉じる。
（クリックせずにブラウザを閉じればビデオチャットは終了します。）

## カメラとマイクを設定する
- 画面上部の Cam/Mic ボタンをクリックする。
- 設定画面でカメラとマイクの設定ができます。接続が重いときは、ネットワークの帯域節約のため、Video Qualityを Low にする等が可能です。

## Sign Upするとできること
![appear_howto_5.png](https://qiita-image-store.s3.amazonaws.com/0/6311/6ba0feb9-5e4a-59ba-bbf5-06173dca2b88.png "appear_howto_5.png")

例えば、画面の右上にある Claim this room から、Sign Upできるのですが、Sign Upすると。。。

- ルームをPrivateに設定できます。
- ルームからチャットに参加しているユーザ（ゲストでも）BANできます。
- オーナーの場合、チャット中に他のユーザの音声やビデオをオフにできます。

他にも、Settingsから

![appear_howto_8.png](https://qiita-image-store.s3.amazonaws.com/0/6311/f3ecf300-7f80-9d08-a238-3bb39d548217.png "appear_howto_8.png")


他にも色々設定できるようになります。セキュリティとか気にするならKnockingがオススメ。
顔を確認してから入室を認めることが出来ます。

appear.in を使うならSign Upして使うとより活用の幅が増えると思います。

## アプリもある
[itunesへのリンク](https://itunes.apple.com/no/app/appear.in-free-group-video/id878583078?mt=8)

リモートワークやるときに立ち上げっぱなしで置いておくと話したい時にすぐリアクションできる。使い勝手もいいのでとっても重宝しています。

## おまけ

ちょっと前にアップデートあってLoading中に出てくるこのキャラがじわじわくる。

![appear_howto_0.png](https://qiita-image-store.s3.amazonaws.com/0/6311/d1df4dcf-2efe-3033-f8f1-3e5a0ba22478.png "appear_howto_0.png")
【メモ】CSSのposition:fixedを親要素を起点に無理やり配置させたった

■簡単な手順
・```position:fixed```を適用する要素の親要素をrelativeなどで目的の位置に配置する
・```position:fixed```を適用する要素にはleft値を指定しないようにする
→これで出来た

(参考)
https://www.aveit.biz/column/detail1373815517.html
プログラミングしたことない人にRailsを触ってもらえる環境をDockerで作ってみた

Railsを触ったことがないデザイナーさんと薬剤師さんが「Railsさわってみたい！」
ということでDockerでRailsの環境を用意してみました。

環境構築でつまずいてなかなかプログラミングがはじめられないという経験があったため、
最低限の手順でかんたんにRailsの開発環境を作りたいという欲求があったことと、
単純にDockerをさわってみたいという動機で今回はDockerを選択してみました。

# 実際にデザイナーさんと一緒に環境構築をしてみたら30分弱でできた

以下のリポジトリのREADMEにそって、プログラミング未経験のデザイナーさんと一緒に何もセットアップされていないPCにRails環境を構築してみたところ、インストールなどの物理的な時間も含めて30分弱で ` http://localhost:3000/ ` でRailsのいつもの画面が表示されるところまでいきました。

https://github.com/tackeyy/rails_on_docker#rails_on_docker

# 反省

- 「 開発環境の構築でつまずかないように最低限かつかんたんに環境を作りたい」と思っていたにも関わらず、Homebrewのインストールにともなって依存関係のあるXcodeなどのインストールの手順があってちょっと煩雑になってしまった気がする
  - 最低限必要なものはDockerとGitなのでインストール方法を変えれば手順はもう少しシンプルになりそう
- [ここら辺](https://github.com/tackeyy/rails_on_docker#instlation)の手順は内容がわからないままただコマンドをコピペする作業になる
  - コマンドの意味を理解してもらうよりも簡単に環境を作ることが目的なのでスクリプト化してシンプルにすれば良さそう

# その他

この次はDocker内のMySqlにSequelProで接続したい！となると思うので、その際は「[dockerで起動したmysqlコンテナにsequel proで接続する](http://tackeyy.com/blog/docker-with-sequel-pro)」を参照してください

# 最後に

「こうした方が良いよ」とか「README不親切では・・？」などがありましたら、コメントやISSUE、プルリクを出してもらえると助かります！
Ruby で Range オブジェクトを生成するには、スペースシップ演算子「<=>」と succ メソッドが必要

## Range オブジェクトの条件

Range オブジェクトを生成するクラスには、スペースシップ演算子「<=>」と succ メソッドが必要。

class Range (Ruby 2.4.0)
https://docs.ruby-lang.org/ja/latest/class/Range.html

> 範囲演算子のオペランドは互いに <=> で比較できる必要があります。 さらに Range#each を実行するためには succ メソッ ドを実行できるものでなければいけません。

スペースシップ演算子「<=>」は順序を比較するための演算子。

module Comparable (Ruby 2.4.0) https://docs.ruby-lang.org/ja/latest/class/Comparable.html

> self <=> other は
> 
> ・self が other より大きいなら正の整数
> ・self と other が等しいなら 0
> ・self が other より小さいなら負の整数
> ・self と other が比較できない場合は nil
> 
> をそれぞれ返すことが期待されています。

succ メソッドは、「次のオブジェクト」を返すメソッド。
「次のオブジェクト」はクラスによってそれぞれ定義されている。

instance method Integer#next (Ruby 2.4.0)
https://docs.ruby-lang.org/ja/latest/method/Integer/i/next.html

> self の次の整数を返します。

instance method String#next (Ruby 2.4.0) https://docs.ruby-lang.org/ja/latest/method/String/i/next.html

> self の「次の」文字列を返します。
> 
> 「次の」文字列は、対象の文字列の右端から アルファベットなら アルファベット順(aの次はb, zの次はa, 大文字も同様)に、 数字なら 10 進数(9 の次は 0)とみなして計算されます。

instance method Date#next (Ruby 2.4.0)
https://docs.ruby-lang.org/ja/latest/method/Date/i/next.html

> 翌日の日付オブジェクトを返します。

## Range オブジェクトを生成できるクラスを実装する

スペースシップ演算子「<=>」と succ メソッドを実装したシンプルなクラスのコードを書いてみた。

```ruby
class RangeImpl

  attr_reader :value

  def initialize(value)
    puts "initialize: #{value}"
    @value = value 
  end

  def <=>(other)
    puts "<=>: #{value}"
    @value <=> other.value
  end

  def succ()
    puts "succ: #{value}"
    RangeImpl.new(@value + 1)
  end

end

puts '[create range]'
r = RangeImpl.new(1)..RangeImpl.new(5)

puts '[to array]'
a = r.to_a
```

実行結果。
スペースシップ演算子「<=>」と succ メソッドがどのタイミングでコールされているかわかる。

```
$ ruby range.rb 
[create range]
initialize: 1
initialize: 5
<=>: 1
[to array]
<=>: 1
succ: 1
initialize: 2
<=>: 2
succ: 2
initialize: 3
<=>: 3
succ: 3
initialize: 4
<=>: 4
succ: 4
initialize: 5
<=>: 5
```

範囲演算子「..」の際に、最初と最後のオブジェクトが生成される。
その後、実際に使うタイミング (今回は to_a メソッドで配列化するとき) で succ メソッドを利用して、範囲内のオブジェクトが順番に生成されている。

ちなみに、スペースシップ演算子「<=>」が実装されていない場合は「bad value for range (ArgumentError)」という例外が発生し、 succ メソッドが実装されていない場合は「in `each': can't iterate from RangeImpl (TypeError)」という例外が発生した(Ruby 2.4.1の場合)。

## 参考資料

- class Range (Ruby 2.4.0) https://docs.ruby-lang.org/ja/latest/class/Range.html
- Using ruby Range with custom classes - Arkency Blog http://blog.arkency.com/2014/08/using-ruby-range-with-custom-classes/
開発用にVagrantの設定、Laravelのインストール


## はじめに
　前回ではVagrant上で、LAMP環境の構築を行った。ここでは、laravelのインストールと実開発するためのセットアップの手順を扱う。ここまでできたら、laravelの環境構築は完了。
   
　
また、ややこしいのでゲストマシン、ホストマシンを以下のように定義する。

* ホストマシン：windows, mac
* ゲストマシン:Vagrant上のUbuntsu

　仮想環境の仕様上、ゲストマシンにそのままLaravelをインストールしても、<b>ホストマシンからゲストのLaravelにアクセスできない。</b>仮想とはいえローカル環境なので、Sublime TextやVS Codeなどで開発したい。これに対しては、Vagrantのゲストマシンとホストマシンがデータを共有できる仕組みで解決する。

## 1. Vagrantfileを編集する
　以下を追記する。Vagrantに対して、ホストディレクトリのパーミッションを777にして同期する設定

```
config.vm.synced_folder ".", "/vagrant",  mount_options: ['dmode=777','fmode=755']
```

既に`vagrant up`をしている場合は、`vagrant reload`を行い設定ファイルを反映させる。


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

#### 仮想環境にログイン
```
vagrant ssh
```

#### gitをインストール
```
sudo apt-get install git
```

#### Composerをインストール
　Composerは、PHPの依存管理ツール。jsでいうnpm日書い位置づけ。モダンなPHPフレームワークは、ほとんどComposerで管理するのがデファクトスタンダードとなっている。

```
curl -sS https://getcomposer.org/installer | php
```

#### Composerコマンドをマシンのどこからでもつかえるようにバイナリを移動する
```
sudo mv composer.phar /usr/local/bin/composer
```

#### Laravelをインストールするディレクトリへ移動
　cdコマンドでlaravelをインストールするディレクトリまで移動する。ここはかならず、`/vagrant`にする。

```
cd /vagrant
```

#### クローンする
　idとパスワードを聞かれたらbitbucketのアカウント情報を入力する。

```
git clone https://bitbucket.org/XXXX/XXXXXXXXXXX
```

#### Laravelをセットアップする

```bash
1. cd laravel
2. composer update
3. sudo mv .env.example .env
4. php artisan key:generate
5. chmod -R 777 storage
6. chmod -R 777 bootstrap/cache
```
3~6の処理は[公式のonfiguration](https://laravel.com/docs/5.4/installation)から引用。

#### シンボリックリンクをはり、ゲストマシンがLaravelのindex.phpを参照するように変更する

```bash
sudo ln -s /vagrant/pug/public/index.php /var/www/html
```

#### /vagrant/laravelプロジェクト/public/.htaccessを書き換え

```apache

Options +FollowSymLinks
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
```


ここまでやると、http://192.168.33.10/ でLaravelのWelcame ページが表示されるはず。
Deep.Netを試してみたけど学習が上手くいかず

# 前書き
[前回の記事](http://qiita.com/kuroyakov/items/61af25a7700daa3e0ef3)にも書いたけど、結局Windows+Visual Studioで[Deep.Net](http://www.deepml.net)環境を構築したら、すんなりいけた :sweat_smile: 
さて、一安心と思ってMNISTの例を試して実行してみたけど、こっちはこっちで色々問題が

# 環境
* Windows 7 (64bit)
* Visual Studio 2015

# DeepNet導入手順

1. F#プロジェクトを作成する(とりあえずコンソールアプリ)
2. ターゲットフレームワークを「4.6.1」にする
3. nugetにてDeep.Netをインストールする
4. nugetにてFSharp.Core (F# 4.1)をインストールする（入ってなければ）

# MNISTのアレを実行
データセットは[ここ](http://yann.lecun.com/exdb/mnist/)からとってきて任意のフォルダに格納しておく。

[本家のサンプル](http://www.deepml.net/model.html)を見ながらコーディング。しかしそのままではコンパイルエラーが発生するので、次のように修正する。

```fsharp:ArrayNDNSからTensorに変更
open Tensor     //open ArrayNDNS
open SymTensor
open SymTensor.Compiler.Cuda
open Datasets
```

```fsharp:Img,LblをInput,Targetに変更
let mnist = Mnist.load (__SOURCE_DIRECTORY__ + "../../../Data/MNIST") 0.0
            |> TrnValTst.ToCuda

printfn "MNIST training set: images have shape %A and labels have shape %A" 
    mnist.Trn.All.Input.Shape mnist.Trn.All.Target.Shape
printfn "MNIST test set:     images have shape %A and labels have shape %A" 
    mnist.Tst.All.Input.Shape mnist.Tst.All.Target.Shape
```

```fsharp:CPUなのでDevHostを使う
let mi = mb.Instantiate DevHost
```

```fsharp:refじゃなくなっているので「!」を外す
let hiddenAct = hiddenWeights .* input.T + hiddenBias
...
let outputAct = outputWeights .* hiddenVal
```

```fsharp:もし古い文法しか対応していない場合は次のように直す
let optCfg = { Optimizers.GradientDescent.DefaultCfg with Step=1e-1f }
```

これ以外にも修正箇所があるけど、方針としては上記のいずれかなので、記載は割愛。

# 実行時のエラー
なんか、次のコードでエラーが発生する

```fsharp
let hiddenAct = hiddenWeights .* input.T + hiddenBias
```

hiddenBiasは隠れ層のノード数分の配列データなのだが、これがブロードキャストで**列方向(横方向)に隠れ層のノード数分拡張される**為、「+」演算が成立しないという例外が発生する。
あまりにも手詰まり感満載だったので、いよいよ本家Githubにissueを投げてみた。([Cannot apply element-wise operator Add](https://github.com/DeepMLNet/DeepNet/issues/39))

その回答を元に書き直すと

```fsharp
let hiddenAct = hiddenWeights .* input.T + (Expr.reshape [nHidden;SizeSpec.broadcastable] hiddenBias)
```

いや、さすがにこれは無理ゲーだよwww　（初見殺しにも程がある）

# 学習を重ねても減らないLoss

紆余曲折してようやく繰り返し学習ができるようになった……。

しかし！

```:実行結果
Test loss after     0 iterations: 2.3019
Test loss after    50 iterations: 2.3019
...
Test loss after   950 iterations: 2.3019
Test loss after  1000 iterations: 2.3019
```

Lossが減ってねーー！！

# 終わりに
ここまできたら、少なくともWindows上ではできるようにしたいので、拙い英語力を駆使しながら、作者とのコミュニケーションを続けてみようと思う。
いつか本章のタイトルが「上手くいかず⇨いきました」になることを期待。

あとドキュメントも最新の実装に合わせた方が良い旨を提案してみようっと。
MDLのinputのエラーのjQueryプラグイン

# MDLのinputのエラー
MDLのinputのエラー
![1.PNG](https://qiita-image-store.s3.amazonaws.com/0/154299/e9386a89-f9c9-d4d9-a2eb-72f136ac2b44.png)
Numberと書いてあるので123を入力する。
![2.PNG](https://qiita-image-store.s3.amazonaws.com/0/154299/03aa1e5d-62ca-a508-bd3f-28e9b0bc61ca.png)
正常
じゃあabcと入力すると？
![3.PNG](https://qiita-image-store.s3.amazonaws.com/0/154299/81ac4fc9-7bb7-512f-b833-9b7438860f1a.png)
エラーになる。
MDLのinputのpatternを設定することでこのように**数字だけ**、あるいは**文字列だけ**
というふうに一定の条件を満たすと（満たせないと）**エラーが発生**するように出来ます。

# MDLのinputのエラーのjQueryプラグイン
先程はpatternで設定していましたが、「jQueryでエラーを発生できるようにしたいな～」と思ってプラグインを作ってみました。


```jquery.MDLInputError.js
$.fn.MDLInputError = function(msg){
  $(this).addClass('is-invalid').addClass('is-dirty');
  $('[class=mdl-textfield__error]',this).text(msg);
  return this;
}
```
こんな感じです。
ただ、MDLのinputの`<div class="mdl-textfield mdl-js-textfield mdl-textfield--floating-label">`を対象にするので、ちょっと不便。
またjQueryについて詳しくなったら試行錯誤してみます。
~~アドバイス求む（殴（勉強しろ~~