OmniAICreator/Qiita-1.07M huggingface dataset:
バージョンが異なるIEでの動作検証（modern.IE）

# はじめに
WEBシステムの開発において、いろいろなブラウザのテストを行う必要がありました。
そこで、Internet Explorer（以下IE）のVMを立ち上げ、テストする方法をまとめます。
modern.IEというものを使います。これはMicrosoft社が提供しているVMです。（確か90日間使えることになっています）

# 前提
modern.IEにはさまざまなバージョンがありますが、今回は以下の内容で展開します。
・VM形式：VMware
・VMのOS：Windows 7
・VMのIE：Internet Explorer 8
・VMのデプロイ先：VMware ESXi(6.0 update 2)


# 手順
## modern.IEのダウンロード
https://developer.microsoft.com/en-us/microsoft-edge/tools/vms/
「Virtual machine」で欲しいIEのバージョンを、
「Select platform」で欲しいVMを、
それぞれ選択し「Download.zip」でダウンロードします。
**今回は「IE8 on Win7」と「VMware(Windows,Mac)」を選択します**

## 解凍及び展開
**今回はVMware ESXi(6.0 update 2)上に展開します**
ダウンロードしたzipを解凍します。（ローカルでOK）

「VMware vSphere Client」からESXiに接続し、メニューバーの「ファイル」→「OVFテンプレートのデプロイ」を選択し、解凍した中にある.ovfファイルを選択します。

あとは名前を決める程度です。（変えなくてもOK）
途中、HDDの形式を選択できますが私は「Thin Provisioning」を選択しています。

## デプロイ完了後
ネットワークアダプタがいないケースがあるので追加します。
「VMware vSphere Client」にて追加したVMを右クリック→「設定の編集」にて「ハードウェア」タブ内の「追加」を選択します。
**ネットワークアダプタがある場合は追加不要です**
追加するデバイスにて「イーサネットアダプタ」を選択し追加しVMを起動します。
そしてIPアドレス等設定すれば完了です。

ですが、このままでは英語版となります。
以下、日本語化とその他最低限のソフトウェアのインストール方法についてです。

また、CPU：1コア、メモリ：1GBなので動作がもっさりします。
可能であればもう少しリソースの割り当てを行ってください。

## VMware Toolsのインストール
何かと便利なので入れておきます。
VMのコンソールを開いてメニューバーの「仮想マシン」→「ゲスト」→「VMware Toolsのインストール／アップグレード」を選択します。
デフォルトのまま「自動Toolsアップデート」で進めると勝手にインストールされます。再起動されるのでそのまま放置します。

## Microsoft Security Essentialsのインストール
WEBブラウザとしてのテストがメインであるため外部につなぐこともあると思います。
なので対策ソフトを入れておきます。
http://download.microsoft.com/download/6/B/A/6BA6CAB0-DDB8-4DDD-88E3-F707D96E84D7/JAJP/x86/MSEInstall.exe

> 参照元：https://support.microsoft.com/ja-jp/help/14210/security-essentials-download

「日本語」の「Windows Vista または Windows 7 32 ビット」です。
**IE8ではアクセスできないようなのでVMからは見ることができません
よって直接.exeファイルにアクセスするか、ファイル共有等で渡す必要があります**

ダウンロード後、.exeを実行でインストール完了です。

## windowsの日本語化
英語のままでも構わない場合は不要です。
詳細手順は下記のサイトをご参照ください。

> 参照元：http://www7b.biglobe.ne.jp/~whitetiger/win/win7_001.html
> 参照元：http://myenotes.blog.fc2.com/blog-entry-82.html

上記手順でWindows Updateが日本語にならない事象があります。
その場合は以下の更新プログラムを適用します。
https://www.microsoft.com/ja-JP/download/details.aspx?id=48975

> 参照元：http://www.projectgroup.info/tips/Windows/windows7_0013.html

適用後、Windows Updateが日本語になっていることを確認してください。
Editor拡張　シンボルの追加と取得　メモ


■指定したプラットフォームのシンボル文字列取得
　string symbol = PlayerSettings.GetScriptingDefineSymbolsForGroup(EditorUserBuildSettings.selectedBuildTargetGroup)

■指定したプラットフォームにシンボル文字列をセット
　PlayerSettings.SetScriptingDefineSymbolsForGroup(EditorUserBuildSettings.selectedBuildTargetGroup,シンボル文字列);


■Editor拡張でシンボルリストにある文字列をシンボル文字列に追加
```
using UnityEditor;

public static class AddSymbolSetting {

    [MenuItem("Assets/AddSymbol")]
    public static void AddSymbol()
    {
        // 指定したターゲットのシンボルを取得 ; で繋いだ文字列で取得できる。
        string currentSymbol = PlayerSettings.GetScriptingDefineSymbolsForGroup(EditorUserBuildSettings.selectedBuildTargetGroup);

        foreach (string symbol in シンボル文字列のリスト)
        {
            if(currentSymbol.IndexOf(symbol) < 0)
            {
                currentSymbol = currentSymbol + ";" + symbol;
                // 
                PlayerSettings.SetScriptingDefineSymbolsForGroup(EditorUserBuildSettings.selectedBuildTargetGroup,
                    currentSymbol);
            }

        }
        AssetDatabase.Refresh();
    }
}

```
ansible-playbookのremote_userの設定について

### TL;DR
1. **コピペはよくない**
2. **ansibleがremote_userの設定を見に行く順番は**
  1. playbook(site.yml)
  2. -u オプション
  3. 環境変数 ANSIBLE_CONFIG 
  4. ansible.cfg
  5. ~/.ansible.cfg
  6. /etc/ansible/ansible.cfg

### 背景

playbookを作ってinventoryファイルに対象を書いてリモートサーバに対して実行しようとplaybookを流してみると

```bash
fatal: [10.XXX.XXX.XXX]: UNREACHABLE! => {
    "changed": false, 
    "msg": "Failed to connect to the host via ssh: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).\r\n", 
    "unreachable": true
}
```
な感じで怒られる。

```bash
ansible all -m ping -i hosts
```
```bash
10.XXX.XXX.XXX | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
```
はこんな感じでちゃんと成功する


```bash
ansible-playbook -i hosts -vvv -u hoge
```
みたいに書いても
カレントディレクトリにansible.cfg置いて`remote_user=hoge`を書いても
`/etc/ansible/ansible.cfg`に`remote_user=hoge`を書いても反映されない
なんでだろうなって思ったら、どこかからコピペしてきたsite.ymlに`remote_user=root`って書いてて
そりゃrootで実行されるわって思いました。
新しいMBP買ったしoh-my-zshからzplugに乗り換えた話


[zplug](https://github.com/zplug/zplug)については[作者の記事](http://qiita.com/b4b4r07/items/cd326cd31e01955b788b)も参照すると良い。

新しいMBPを購入したので、今まで[oh-my-zsh](https://github.com/robbyrussell/oh-my-zsh)に全て任せていた設定の勉強を兼ねてzplugに乗り換えてみた。

## 事前準備

zshのインストールは済んでいるものとする。

プラグインの中で``fzy``を使用するので、brewでインストールする。

```
brew tap jhawthorn/fzy
brew install fzy
```

## 設定ファイル

色々調べつつ書いた結果、``.zshrc``は次のようになった。まだまだ多くの便利なプラグインがありそうだが、全部いっぺんに勉強するのも大変なので一旦この程度で。

```vim
if [[ ! -d ~/.zplug ]];then
  git clone https://github.com/zplug/zplug ~/.zplug
fi

source ~/.zplug/init.zsh

# enhancd config
export ENHANCD_COMMAND=ed
export ENHANCD_FILTER=ENHANCD_FILTER=fzy:fzf:peco

# Vanilla shell
zplug "yous/vanilli.sh"

# Additional completion definitions for Zsh
zplug "zsh-users/zsh-completions"

# Load the theme.
zplug "yous/lime"

# Syntax highlighting bundle. zsh-syntax-highlighting must be loaded after
# excuting compinit command and sourcing other plugins.
zplug "zsh-users/zsh-syntax-highlighting", nice:9

# ZSH port of Fish shell's history search feature
zplug "zsh-users/zsh-history-substring-search", nice:10

# Tracks your most used directories, based on 'frecency'.
zplug "rupa/z", use:"*.sh"

# A next-generation cd command with an interactive filter
zplug "b4b4r07/enhancd", use:init.sh

# This plugin adds many useful aliases and functions.
zplug "plugins/git",   from:oh-my-zsh

# Install plugins if there are plugins that have not been installed
if ! zplug check --verbose; then
    printf "Install? [y/N]: "
    if read -q; then
        echo; zplug install
    fi
fi

# Then, source plugins and add commands to $PATH
zplug load --verbose

# Lime theme settings
export LIME_DIR_DISPLAY_COMPONENTS=2

# Better history searching with arrow keys
if zplug check "zsh-users/zsh-history-substring-search"; then
    bindkey "$terminfo[kcuu1]" history-substring-search-up
    bindkey "$terminfo[kcud1]" history-substring-search-down
fi

# Add color to ls command
export CLICOLOR=1

# NeoVim config
export XDG_CONFIG_HOME=$HOME/.xdgconfig

# Load rbenv
if [ -e "$HOME/.rbenv" ]; then
  eval "$(rbenv init - zsh)"
fi

# Set GOPATH for Go
if command -v go &> /dev/null; then
  [ -d "$HOME/go" ] || mkdir "$HOME/go"
  export GOPATH="$HOME/go"
  export GOROOT=/usr/local/opt/go/libexec
  export PATH="$PATH:$GOPATH/bin:$GOROOT/bin"
fi

# Set PATH for GAE
export PATH=$HOME/go/appengine:$PATH

```

## 使っているプラグインの説明

### [yous/vanilli.sh](https://github.com/yous/vanilli.sh)

シェルの設定を色々いい感じにやってくれる。

### [zsh-users/zsh-completions](https://github.com/zsh-users/zsh-completions)

補完の強化。

### [yous/lime](https://github.com/yous/lime)

目に優しいシンプルなテーマ。

### [zsh-users/zsh-syntax-highlighting](https://github.com/zsh-users/zsh-syntax-highlighting)

コマンドのシンタックスハイライト。

### [zsh-users/zsh-history-substring-search](https://github.com/zsh-users/zsh-history-substring-search)

コマンド入力中に上キーや下キーを押した際の履歴の検索を使いやすくする。

### [rupa/z](https://github.com/rupa/z)

頻繁に移動している順に検索してディレクトリに移動する「z」コマンド。

### [b4b4r07/enhancd](https://github.com/b4b4r07/enhancd)

次世代のcdコマンド。

### [plugins/git](https://github.com/robbyrussell/oh-my-zsh/tree/master/plugins/git)

gitに関するエイリアス（gaなど）を追加する。

---

また追加等あれば編集する。
RubyとLabVIEWのfor文　比較

#Ruby

```rb:for.rb
for count in 0..2 do
  puts count
  sleep 1
end
```

```
>ruby for.rb
0
1
2
```


#LabVIEW
##ブロックダイアグラムの配置
for文は　「N」で実行回数を指定する。以下の場合では三回実行する。
実行回数は「i」から取得できる。
※　実行される一番最初は　　i = 0  からスタートする

![ブロックダイアグラム.jpg](https://qiita-image-store.s3.amazonaws.com/0/140159/832b8f47-c4a6-d74b-3a1a-68df4555bdf6.jpeg)

##パーツ
![ブロック.jpg](https://qiita-image-store.s3.amazonaws.com/0/140159/552f3ced-f7a3-4057-0d31-510d17b286eb.jpeg)

#参考URL
[チュートリアル: ForループとWhileループ](http://www.ni.com/white-paper/7588/ja/)
AIが入ったBotの作り方を学ぼう - Part2 LINEでビジネスアカウントを作成する


> この記事はやや古くなっています。下記の新しいチュートリアルがベターです。
http://qiita.com/nkjm/items/38808bbc97d6927837cd

# 概要

この記事はLINEで動作する栄養士Botを開発するチュートリアルのPart2です。

前回までの記事はこちら。

- Part1 http://qiita.com/nkjm/items/0e9d24b2f3429bd33c8d

今回はLINEでBotを作成するのに必要なビジネスアカウントを開設します。

# 所要時間

10分

# LINEでビジネスアカウントを作成する

https://business.line.me/ja/ にアクセスし、ログインボタンをクリックして自身のLINEアカウントでログインします。
![login.png](https://qiita-image-store.s3.amazonaws.com/0/26079/fc0ea623-536c-2ce9-99ca-4203a9ed2df2.png "login.png")

アカウントリストを選択し、Messaging APIをクリックします。
![スクリーンショット_2016-11-28_13_19_22.png](https://qiita-image-store.s3.amazonaws.com/0/26079/94d5a10c-74ce-aa31-701d-402bdc9ed6fa.png "スクリーンショット_2016-11-28_13_19_22.png")

Developer Trialを始めるをクリックします。
![start_developer_trial.png](https://qiita-image-store.s3.amazonaws.com/0/26079/eb4df1c6-1b34-afca-0862-ea8a94482cd2.png "start_developer_trial.png")

アカウント名と業種を選択して確認するボタンをクリックします。確認ページが表示されるので間違いがなければ申し込むボタンをクリックします。

これでビジネスアカウントの作成が完了です。次はLINE@ MANAGERを使ってこのビジネスアカウントを設定していきます。


## LINE@ MANAGERでの設定

左のサイドメニューからアカウント設定 > Bot設定を選択し、「APIを利用する」ボタンをクリックします。
![スクリーンショット_2016-11-28_13_33_07.png](https://qiita-image-store.s3.amazonaws.com/0/26079/5c09dc85-6b73-5257-23d4-fb99fc01586d.png "スクリーンショット_2016-11-28_13_33_07.png")

画面がリロードされ、下図のようにBot設定のフォームが表示されます。
![スクリーンショット 2016-11-28 13.35.19.png](https://qiita-image-store.s3.amazonaws.com/0/26079/63e4e0a6-33f8-1310-abba-f6d93567d34d.png "スクリーンショット 2016-11-28 13.35.19.png")


それぞれ下記のように設定します。

- Webhook送信： **利用する**
- Botのグループトーク参加： **利用しない**
- 自動応答メッセージ： **利用しない**
- 友達追加時あいさつ： **利用しない**

次にLINE DevelopersでBot本体のプログラムで利用する情報を設定・確認します。

## LINE Developersでの設定

LINE DevelopersはLINE @MANAGERからだと下図のリンクで遷移できます。
![スクリーンショット_2016-11-28_13_35_19.png](https://qiita-image-store.s3.amazonaws.com/0/26079/e306903b-f2f1-b917-d87d-d0af38dfec57.png "スクリーンショット_2016-11-28_13_35_19.png")


まず下記の値をメモしておきます。これらはあらかじめ設定されている値をそのまま利用します。

- Channel ID => Botを識別するID
- Channel Secret => シグネチャーの検証に使われる鍵
- QR Code => Botを友達に追加するときに使用するQRコード

Channel Access Tokenについてはデフォルトでは値が入っていないので、「ISSUE」ボタンをクリックして値を生成し、その値をメモしておきます。

- Channel Access Token => APIコールに付加する認証トークン

Webhook URLについては、Bot本体のプログラム開発に着手後に設定します。

- Webhook URL => LINEがBotに発生したイベントを通知するためのURL。ユーザーのIDや送信したメッセージ内容が含まれたオブジェクトが送信されます。

# 次のステップ

http://qiita.com/nkjm/items/27d0131003a4b7ef02b9

次回はBot本体のプログラムに着手します。メッセージの受信、および返信を実装していきます。
position:fixedの親要素にtransform:translate3dをかけると壊れる



タイトルの通り。
fixedをかけた要素が、position:absoluteのような挙動をしていたので調べると、

ここに同じ人が。
http://stackoverflow.com/questions/25824749/why-webkit-transform-translate3d0-0-0-messes-up-with-fixed-childs


親要素にtransform:translate3d(..)がかかってるのが原因なんですが、transformのレンダリングモデルに関係があるみたいです。

transformをかけると、このレンダリングモデルの配置システムになり、
transform:noneでもとの配置システムに戻る、とオフィシャルにも書いてありますね。
https://www.w3.org/TR/css-transforms-1/#transform-rendering



なるほどなるほど。
フォームに日付を追加

Synergy!360でフォームに日付プルダウンを設定する時に作成。

```js
//selectに変更
$('#aaa').replaceWith(function() {
  var tag_class = $(this).attr("name");
  var tag_id = $(this).attr("id");

  if ( tag_class == null) {
    var tag_class_plus =[];
  } else {
    var tag_class_plus = 'name="'+tag_class+'"';
  }
  if ( tag_id == null ) {
    var tag_id_plus =[];
  } else {
    var tag_id_plus = 'id="'+tag_id+'"';
  }
  $(this).replaceWith('<select '+tag_id_plus+'  '+tag_class_plus+'>'+$(this).html()+'</select>');
});
//日付を設定
var select = document.getElementById('aaa');
function generateDateString(offset) {
    var weekdays = new Array('日', '月', '火', '水', '木', '金', '土');
    var date = new Date();

    date.setDate(date.getDate() + offset);

    var year = date.getFullYear();
    var month = date.getMonth() + 1;
    var day = date.getDate();
    var wdindex = date.getDay();
    var wday = weekdays[wdindex];

    var datestr = year + '年' + month + '月' + day + '日 (' + wday + ')';

    return datestr;
}
// aaaのところは任意のIDを設定
```
画像の挿入方法

```ruby:filename.rb
<figure>
  <img src="ファイルがあるフォルダ/ファイル名" alt="代替えテキスト" width="幅" height="高さ"
  <figcaption>キャプション</figcaption>
</figure>
```

alt属性は必須。記述しない場合は「alt=""」のように値を空にしておく。

widthとheightの属性は省略も可。
なお、省略した場合は画像の実寸で表示される。

また、本文から参照される図版はfigureタグで囲むこと。
figcaptionタグはfigure要素内でのみ利用できる。
グレイコード画像の作成(OpenCV/C++)

参照: [グレイコード(Wikipedia)](https://ja.wikipedia.org/wiki/%E3%82%B0%E3%83%AC%E3%82%A4%E3%82%B3%E3%83%BC%E3%83%89)

空間コード化法なんかでグレイコード画像を使いたいことが多々ある．ので，OpenCV/C++での実装例．
offsetを与えて中央に寄せているので，必要がなければoffsetを消す．

```cpp:
#include <vector>
#include <cmath>
#include <opencv2/opencv.hpp>

int main()
{
	const cv::Size im_size(1280, 800);

	std::vector<cv::Mat> im_vec;
	std::vector<int> graycode(im_size.width);

	const int bit_num = static_cast<int>(std::ceil(std::log2(im_size.width))) - 1;
	const int offset = static_cast<int>(std::pow(2, bit_num) - im_size.width) / 2;

	// generate gray code
	for (int px = 0; px < im_size.width; ++px)
	{
		// shift to center
		const int bit = px + offset;

		// gray code
		graycode[px] = bit ^ (bit >> 1);
	}

	// make images
	for (int i = 0; i < bit_num; ++i)
	{
		cv::Mat im = cv::Mat::zeros(im_size, CV_8U);

		for (int py = 0; py < im_size.height; ++py)
		{
			uchar* const im_ptr = im.ptr<uchar>(py);

			for (int px = 0; px < im_size.width; ++px)
			{
				// extract i-th bit
				const uchar val = ((graycode[px] >> (bit_num - i - 1)) & 0x01);
				im_ptr[px] = val * 255;
			}
		}
		im_vec.push_back(im.clone());
	}

	// show
	for (const auto& im : im_vec)
	{
		cv::imshow("im", im);
		cv::waitKey(-1);
	}
}
```
WordPressのループ回数を取得してクラス名に付加する方法

# fanction.phpに入力

```php:fanction.php
//ループ回数を取得
function loopNumber(){
global $wp_query;
return $wp_query->current_post+1;
}
```

# やり方

```php
<?php echo loopNumber(); ?>
```

# 参考
http://dainashiyesterday.com/post-2546/
ELB に繋がった稼働中システムをスケールダウンする時のオペレーションフロー

## 概要
複数台のEC2がELBに接続されてるシステムにおいて、ローリングでEC２をスケールダウンする際のオペレーションフローをまとめてみました。
あくまでインフラ・ミドルウェアのフローなので、実際にはここにアプリケーションに必要な手順が入ることになります。

## フロー
スケールダウン対象のインスタンスを *ins* とします。

1. 要件確認
1. 影響範囲確認
    - 現状の負荷が、一台切り離しても耐えうるものなのかを確認
1. フロー確認
1. チーム内周知
1. 作業報告
1. 監視をメンテナンスに
    - 対象ホストがメンテナンス状態になっていることを確認
1. *ins* が現状実際にロードバランシング対象になっていることを確認
    - AWS コンパネから ELB の設定とヘルスチェックの状態を確認
    - *ins* にログインし、アクセスログを見て、アクセスが来ていることを確認
1. *ins* を LB から切り離し
    - AWS コンパネで切り離されていることを確認
    - *ins* にログインし、アクセスログから、アクセスが来ていないことを確認
1. LB につながっている他のインスタンスの負荷を確認
    - Zabbix 等でモニタリング
1. *ins* のプロセスを停止
    - *ins* にログインし、プロセスを停止
    - *ps* コマンドなどでプロセスが停止していることを確認
1. *ins* を停止
    - *ins* にログインし、他ユーザがログインしていないことを確認(`w` コマンド)
    - コマンドでインスタンスを停止(`sudo shutdown -h now`)
1. *ins* のインスタンスタイプを変更
1. *ins* を起動
    - コンパネから起動
    - *ins* にログインし、インスタンスタイプが変わっていることを確認(`sudo cat /proc/meminfo;`)
    - 必要なプロセスが起動していることを確認
    - localhost でアクセスできるか確認(`curl localhost:80`)
    - ネットワークの port listen を確認（`sudo netstat -tunplo`）
    - Unix Domin Scoket の確認(`sudo netstat -xnplo`)
1. LB に *ins* を追加
    - コンパネから LB の状態を確認し、*ins* が追加されていることを確認
    - コンパネ上でヘルスチェックが正常なのを確認
    - *ins* にログインし、アクセスログからアクセスが来ていることを確認
1. LB につながっている他のインスタンスの負荷を確認
    - Zabbix 等でモニタリング
1. 7 に戻って他のインスタンスにも適用
1. 監視をメンテナンスモードから戻す
1. 作業完了報告
政府cioポータル


なんか面白いものみつけたw
https://cio.go.jp

高度情報通信ネットワーク社会推進戦略本部（ＩＴ総合戦略本部）サイト
IT総合戦略本部や関連会議での決定や会議の状況を報告しています。
http://www.kantei.go.jp/jp/singi/it2/

IT Dashboard
政府のIT戦略の評価やIT投資の状況を公開しています。
http://www.itdashboard.go.jp

DATA.GO.JP
政府内のオープンデータを集約して提供しています。
http://www.data.go.jp/?lang=japanese

e-Gov
政府内の法律や調達の情報を一元に公開するとともに、電子政府に関する情報を提供しています。
http://www.e-gov.go.jp
RubyとLabVIEWのif文　比較

#Ruby
```rb:if.rb
variable1 = 1
variable2 = 2

if variable1 == variable2
  puts 1
else
  puts 0
end
```

```bash
>ruby if.rb
0
```

#LabVIEW
##ブロックダイアグラムの配置
![ダイアグラム.jpg](https://qiita-image-store.s3.amazonaws.com/0/140159/e7bb5a15-605e-d246-bc1a-eefb973464b5.jpeg)

##パーツ

![ブロック１.jpg](https://qiita-image-store.s3.amazonaws.com/0/140159/d58ea48f-2dc5-270c-dbf8-e53c281b7539.jpeg)

##ケースストラクチャ内
![ケースストラクチャ.jpg](https://qiita-image-store.s3.amazonaws.com/0/140159/67f05d45-a631-6c11-96cb-84b395c30391.jpeg)


##比較
![比較の設定.jpg](https://qiita-image-store.s3.amazonaws.com/0/140159/9711cd8c-d8cd-2c06-31b3-81644c452b5d.jpeg)


#参考
[LabVIEWにおける「If」文](http://digital.ni.com/public.nsf/allkb/AE1001924C93EA4986257EC3000179C6)
Golangのファイル入出力関係パッケージまとめ

はじめに
====================

Golangのファイル入出力について、各インターフェース、構造体を俯瞰するために一度整理しました。俯瞰できればちゃんと整理されてるみたいですね。

クラス図（のようなもの）
----------------------------------------

※クラス図はあんまり分かっていないので、誤りあったらごめんなさい。（つっこみください）

![ダウンロード (4).png](https://qiita-image-store.s3.amazonaws.com/0/111801/092e0f90-ebb1-9d99-28cf-64db037d1cf0.png)


[ioパッケージ](https://golang.org/pkg/io/)
----------------------------------------
**Reader/Writerのinterfaceを定義。** また、File以外の対象に対してのReader/Writer(struct)が定義されている。

- **type Reader interface**
	- Read(p []byte) (n int, err error)

- **type Writer interface**
	- Write(p []byte) (n int, err error)


[osパッケージ](https://golang.org/pkg/os/)
----------------------------------------
File構造体を定義。 **File構造体はio.Readerおよびio.Writerを実装している。**

- **type File struct**
	- func (f *File) Read(b []byte) (n int, err error)
	- func (f *File) Write(b []byte) (n int, err error)

[bufioパッケージ](https://golang.org/pkg/bufio/)
----------------------------------------
バッファを用いたReader/Writerを定義。Newメソッドにより、 **他のio.Reader/io.Writerを元に生成する。**

- **type Reader struct**
	- func NewReader(rd io.Reader) *Reader
	- func (b *Reader) Read(p []byte) (n int, err error)
	- func (b *Reader) ReadByte() (byte, error)
	- func (b *Reader) ReadBytes(delim byte) ([]byte, error)
	- func (b *Reader) ReadLine() (line []byte, isPrefix bool, err error)
	- func (b *Reader) ReadRune() (r rune, size int, err error)
	- func (b *Reader) ReadSlice(delim byte) (line []byte, err error)
	- func (b *Reader) ReadString(delim byte) (string, error)

- **type Writer struct**
	- func NewWriter(w io.Writer) *Writer
	- func (b *Writer) Write(p []byte) (nn int, err error)
	- func (b *Writer) WriteByte(c byte) error
	- func (b *Writer) WriteRune(r rune) (size int, err error)
	- func (b *Writer) WriteString(s string) (int, error)
	- func (b *Writer) Flush() error

- **type Scanner struct**
	- func NewScanner(r io.Reader) *Scanner
	- func (s *Scanner) Scan() bool
	- func (s *Scanner) Text() string

[ioutilパッケージ](https://golang.org/pkg/io/ioutil/)
----------------------------------------
**ファイルごと読み込み/書き込みなど一括処理を簡単に実施するためのutils。** Reader/Writerの存在も隠蔽されていたりする。

- func ReadAll(r io.Reader) ([]byte error)
- func ReadFile(filename string) ([]byte, error)
- func WriteFile(filename string, data []byte, perm os.FileMode) error
3大SNSのサムネイルのファイルサイズを調べた


３大SNS（Facebook, Instagram, Twitter）で画像投稿したときに生成されるサムネイルのファイルサイズを調べてみました。

### 実験画像

富士フィルムのサイト上の[サンプル画像](http://fujifilm.jp/personal/digitalcamera/x/fujifilm_x_t1/sample_images/)(2.8M)を使いました。

![ff_x_t1_001.JPG](http://fujifilm.jp/personal/digitalcamera/x/fujifilm_x_t1/sample_images/img/index/ff_x_t1_001.JPG) 

### この画像を各SNSで写真投稿した際のサムネイルの画像サイズとファイルサイズ
 
|     | Facebook   | Instagram   | Twitter      |
|:---:|:-----------:|:------------:|:------------:|
|small| 966 x 639 (28KB)  | 640 x 640 (20KB) |     1200 x 800 (46KB)|
|large| 2048 x 1365 (70KB)|  1080 x 1080 (31KB) | 2048 x 1365 (112KB)|

3サービスで共通のパラメータ

- Chroma subsampling = YCrCb 4:2:0
- X resolution = 1, Y resolution = 1
- Encoding = Progressive DCT

### ImageMagickでのサムネイル生成

続いて、ImageMagickを使って同じ写真からサムネイル生成したとき、上記のファイルサイズを達成するために必要な圧縮qualityを調べてみました。


|     | quality |  
|:----|-------------:|
|Facebook 966 x 639 (28KB)| 82 |
|Facebook 2048 x 1365 (70KB) | 73 |
|Instagram 640 x 640 (20KB)| 82 |
|Instagram 1080 x 1080 (31KB)| 69 |
|Twitter 1200 x 800 (70KB)| 85 |
|Twitter 2048 x 1365 (112KB) | 85 |

Qualityを80〜85とすると画質とファイルサイズのバランスが取れる感じなんでしょうか。ImageMagickは-stripオプションをつけないと余計なEXIFヘッダがついてファイルサイズが大きくなってしまうので要注意です。
Chrome53のバグによるSSL/TLS通信時に以下のエラーの対応

**[覚書]**

Google Chrome53は、バグでSSL/TLS通信時に以下のエラーが発生する。

>**[Google Chrome53のバグによるCertificate Transparency (CT)エラーについて | GeoTrust](https://knowledge.geotrust.com/jp/support/knowledge-base/index?page=content&id=ALERT2166&*=LIST&viewlocale=ja_JP)**

>Google Chrome 53のバグにより一部のウェブサイトでSSL/TLS通信時に以下のエラーが発生することを確認しています。
>
>ERR_CERTIFICATE_TRANSPARENCY_REQUIRED
>
>＜解決方法＞
>
>Chrome 54へアップデートしてください
>Googleのパッチが適用されたのち、Chrome 53をリスタートしてください
>※本問題は、SSLサーバ証明書に関する問題ではありませんので、SSLサーバ証明書の再発行を行っていただく必要はございません。
>
>＜参考情報＞
>
>Additional information regarding the bug is available here:
https://bugs.chromium.org/p/chromium/issues/detail?id=664177


**アプリのWebViewでも同じ事象が発生します。**

その場合は、[AndroidシステムのWebView](https://play.google.com/store/apps/details?id=com.google.android.webview)をアップデートすると治ります。
typescript & webpack 使用時に IE9 対策として空の console.* を用意する

開発中のページを IE9 で参照したら真っ白な画面になりました。
原因を探るために開発者ツールを表示させると、今度はページが正常に表示されました。

？？　となりましたが、IE9 には console が無いという、良く知られたことに起因していました。開発者ツールを表示させた時のみ console.* が有効になるので、正常に表示されるのです。

対策として、window.console が定義されていない時にはダミーを用意するという、良く知られた対応をすることにしました。typescript & webpack 使用時には以下のようにします。

console のダミーを定義する preload.ts

```preload.ts
// IE9 doesn't implement console
class DummyConsole {
    assert(){}
    clear(){}
    count(){}
    debug(){}
    dir(){}
    dirxml(){}
    error(){}
    group(){}
    groupCollapsed(){}
    groupEnd(){}
    info(){}
    log(){}
    msIsIndependentlyComposed(){}
    profile(){}
    profileEnd(){}
    select(){}
    time(){}
    timeEnd(){}
    trace(){}
    warn(){}
}
const w:any = window; // cheat type check.
w.console || (w.console = new DummyConsole());
```

webpack の設定ファイルの entry point に上記のファイルを追加します。

```webpack.config.js
module.exports = {
    entry: ["preload.ts", "index.ts"],
```
Groovy の GString と 遅延評価

## Groovy の `GString`

Groovy では、文字列の中に「${ ～ }」のように記述することで式を埋め込むことができます。このとき、Groovy はその文字列リテラルを `GString` オブジェクトとして扱います。ただし、`String` が必要な箇所で `GString` を渡すと勝手に `String` に変換してくれるので、あまり意識することはないでしょう。また、「\${ ～ }」の代わりに「\${-> ～ }」とすると、式を遅延評価させることができます。

さて、以下のコードを見てください。

```groovy
// array プロパティをもつオブジェクトを作成
def test = new Expando(array: [0]) 

// String として生成
String string = "string: ${test.array}"
// GString として生成
def direct = "direct: ${test.array}"
// GString として遅延評価によって生成
def lazy = "lazy: ${-> test.array}"

test.array << 1   // (1)
test.array = [2]  // (2)

println(string)
println(direct)
println(lazy) 
```

これを実行すると、以下のようになります。

```
string: [0]
direct: [0, 1]
lazy: [2]
```

全部結果が違います。これについて説明したいと思います。

まず大前提として、`GString` に埋め込まれた遅延評価でない式の中で出てくる変数は、全てその参照として保持されます。したがって、 `"direct: ${user.array}"` が実行された時点で、`user` オブジェクトの `array` プロパティの参照が、`GString` クラスの内部に保持されます。この参照を仮に <i>A</i> としましょう。

その後、コードの (1) の部分で、それと同じ参照 <i>A</i> をもつ変数に要素が加えられます。さらにコード (2) の部分で `array` プロパティに `[2]` というオブジェクトが代入されていますが、この `[2]` はこの場で作られた新たなオブジェクトなので、`[2]` の参照と <i>A</i> は異なります。したがって、`direct` に代入された `GString` が内部に保持している参照 `A` には何の影響もありません。したがって、最終的に `println(direct)` の実行結果は、要素が 1 つ追加されて「direct: [0, 1]」となるわけです。

`GString` は `String` に変換された時点で、内部に保持している参照に対して `toString` メソッドを呼び、文字列として確定させます。したがって、上のコードの `string` に `"string: ${user.array}"` が代入された時点で、`user` オブジェクトの `array` プロパティに対して `toString` が呼び出されます。この結果は当然「[0]」なので、`string` には `"string: [0]"` という `String` オブジェクトが代入されることになります。この時点で `String` オブジェクトとして固定されたため、他の変数に変更が加えられたり代入し直されたりしても何の影響も受けず、最終的に `println(string)` の実行結果は「string: [0]」となります。

最後に、遅延評価にした `GString` の場合ですが、これは変数の参照を保持するのではなくクロージャとして保持します。そして、`toString` が呼び出されるたびに、保持しているクロージャを評価し、その結果に置き換えます。したがって、`println(lazy)` を実行すると、その時点で `"lazy: ${-> user.array}"` 内の `user.array` が実行され、その結果に置き換えられた文字列が表示されます。この時点で `user.array` は (2) の箇所で `[2]` に置き換えられているので、これが評価されて「lazy: [2]」と表示されるわけです。

## ちなみに Ruby では

Ruby にも文字列への式の埋め込みができるのですが、こちらはその場で評価されて文字列に展開されます。したがって、後から変数が変更されたり再代入されても影響を受けません。

```ruby
test = Struct.new(:array).new([0])

string = "string: #{test.array}"

test.array << 1
p(string)
test.array = 2
p(string)
```

これの実行結果は以下のようになります。

```
"string: [0]"
"string: [0]"
```
has_secure_token でトークンをもっと長いやつにする

`has_secure_token` は `SecureRandom.base58(24)` で 24 バイトのトークンを生成するだけで、長さを指定するオプションはありません。

Pull Request はいくつか出ているようですが、今の所取り込まれるる様子はなし。
(Rails 5 から `has_secure_token` は Rails に取り込まれ、元の gem はバックポート用という立ち位置になったので、まずは Rails に PR せよ、という流れ)

* [User should be able to provide token size by przbadu · Pull Request #17 · robertomiranda/has_secure_token](https://github.com/robertomiranda/has_secure_token/pull/17)
* [configurable token length by przbadu · Pull Request #24531 · rails/rails](https://github.com/rails/rails/pull/24531)

というわけでとりあえずやってしまいたい、というときは対象のクラスに以下のように `generate_unique_secure_token` というクラスメソッドをオーバーライドすれば良い。

```rb
class Foo < ActiveRecord::Base
  class << self
    def generate_unique_secure_token
      SecureRandom.base58(32)
    end
  end
end
```

今回はバイト数を 32 に増やすだけだが、生成方法自体差し替えることもできる。
Amazon WorkSpacesのActive Directory設定方法

Amazon WorkSpacesのActive Directory設定することがあったのでメモ。
Windows serverのグループポリシー管理エディター上にデフォルトで設定がないので、Active Directoryのフォルダを追加してあげる必要がある。

AWSの管理者ガイドに記載されている内容そのままなので、そちらも参照いただければ。
[グループポリシーを使用した WorkSpaces とユーザーの管理](http://docs.aws.amazon.com/ja_jp/workspaces/latest/adminguide/group_policy.html)


##今回の想定イメージ
Activedirectory Control Instance(Windows Server)で設定したActive Directory設定をAmazon WorkSpacesで反映させるイメージ
![2.png](https://qiita-image-store.s3.amazonaws.com/0/150939/cd085503-16c0-43ac-97b0-186ab2cf1917.png)


##手順

###Amazon WorkSpacesでの作業

####pcoip.admファイルの取得
C:\Program Files (x86)\Teradici\PCoIP Agent\configurationからpcoip.admファイルを取得――したいんだけど、Amazon WorkSpacesはCドライブがマイコンピュータ上から見えない。

![image](https://qiita-image-store.s3.amazonaws.com/0/150939/d24e57fb-5c0a-b6a7-fe40-e9332679fb06.png)

なので、コマンドプロンプト上からC:\Program Files (x86)\Teradici\PCoIP Agent\configurationにアクセスして、copyしてくる。

またはAmazon WorkSpacesのフォルダを適当に表示させて格納場所たたけば表示される。
![image](https://qiita-image-store.s3.amazonaws.com/0/150939/69fba18e-3925-b113-073d-216df8bfbc05.png)
**ガバガバである。**


###ActiveDirectory設定側作業
Windows Serverインスタンス起動する。
WorkSpacesから取得したpcoip.admファイルをよしなにコピーする。


####グループポリシー管理エディターにClassic Administrative Tamplatesを追加
Group Policy Management Editor（グループポリシー管理エディター）へのアクセス
ServerManager > Tools > Group Policy Management
![image](https://qiita-image-store.s3.amazonaws.com/0/150939/27757292-5181-a7f2-9464-093727397a8a.png)

Group Policy Objectを右クリック>Edit
![3.png](https://qiita-image-store.s3.amazonaws.com/0/150939/3ff0c441-8bf2-2390-ea56-2e8671bf8ad1.png)
※既存のPolicy変更すると、後でデフォルトなんだっけ？とか面倒くさいので新しくGroup Policy Objectを作っておく

[Group Policy Object名] > Computer Configration > Administrative Templates:~ を表示
![4.png](https://qiita-image-store.s3.amazonaws.com/0/150939/bef0819b-870a-cdca-f670-87c42a461d02.png)

Action > Add/Remove Templates…をクリック
![image](https://qiita-image-store.s3.amazonaws.com/0/150939/b0b44681-dd9a-7471-a65f-1780dbcb2976.png)

Amazon WorkSpacesで取得したpcoip.admをaddボタンから追加して、Closeボタンを押下
![image](https://qiita-image-store.s3.amazonaws.com/0/150939/ef849709-e590-4e2f-f0af-e9b0d8b82294.png)

Classic Administrative Tamplates(ADM)フォルダが追加されていることを確認
![5.png](https://qiita-image-store.s3.amazonaws.com/0/150939/8e275536-953c-d69b-8ceb-1216aa561a93.png)


####コピペ禁止設定を行う
[Group Policy Object名] > Computer Configration > Administrative Templates:~ > Classic Administrative Tempates(ADM) > PCoIP Session Variables > Overrideable Administrator Defaults

![6.png](https://qiita-image-store.s3.amazonaws.com/0/150939/3128b99c-214a-595a-71af-ab8c6a2e4334.png)

以下の4通りの制御が可能
・clientとWorkSpace側共にコピペ禁止
・client→WorkSpaceのみコピペOK
・WorkSpace→clientのみコピペOK
・clientとWorkSpace側共にコピペOK


###ActiveDirectory設定の反映
1.ActiveDirectory設定したWindows Serverの再起動
→再起動しないと設定内容が反映されないため

2.Amazon WorkSpacesログイン

3.コマンドプロンプトで以下を設定
`gpupdate`

こんな感じでsuccessfullyが出ればOK
![7.png](https://qiita-image-store.s3.amazonaws.com/0/150939/2d3bc82c-26e9-0b35-3d74-d0f4ab5620c7.png)

もし、上手くいかないということであれば以下で強制的に再割り当てしてみる。
`gpupdate/force`

4.Amazon WorkSpacesログアウトして再ログイン
jenkinsの unity3d-plugin の設定が「Unity3d default configuration」しかなく、インストールディレクトリを指定できない

[ドキュメント](https://wiki.jenkins-ci.org/display/JENKINS/Unity3dBuilder+Plugin
)には、

```Manage Jenkins -> Configure System``` の

「Unity3d」の項目でインストール先ディレクトリを設定して、とあるがそんな項目はない


正しい位置は

```Manage Jenkins" –> Global Tool configuration```

Jenkins2から移動したっぽい？


# 参考
https://issues.jenkins-ci.org/browse/JENKINS-35241
Dockerで実行ユーザーとグループを指定する

Docker内部で`bundle exec rails g ... `などとすると、常にroot権限でファイルが作成されるため、困っていた。

この問題が起きるのはLinuxだけかもしれない。

# 解決策その1 Dockerfileに記述

DockerfileでDockerを実行するユーザーとグループを指定できる。
ドキュメントには`USER postgres`という記述しか無いが、グループも指定できる。

```bash:Dockerfile
USER 1000:1000
```

ただこの方法だと決め打ちになってしまうので、次の方法の方が良い。

# 解決策その2 コマンドの引数で指定

`docker run -u 1000:1000 debian bash`

この方法であれば、環境変数で指定できる。

# 解決策その3 docker-compose.ymlで指定

これを探していた。
原理は一緒なので、下記でOK

```yaml:docker-compose.yml
web:
  image: debian
  user: "${UID}:${GID}"
```

`UID=${UID} GID=${GID} docker-compose up`

または、UIDのところで怒られるけど

```
export UID=${UID}
export GID=${GID}
docker-compose up
```

でも良い。

シェル変数を環境変数として外に出すってことなのかな？

# 動作環境

Arch Linux

Client:
 Version:      1.12.3
 API version:  1.24
 Go version:   go1.7.3
 Git commit:   6b644ec
 Built:        Thu Oct 27 19:42:59 2016
 OS/Arch:      linux/amd64

Server:
 Version:      1.12.3
 API version:  1.24
 Go version:   go1.7.3
 Git commit:   6b644ec
 Built:        Thu Oct 27 19:42:59 2016
 OS/Arch:      linux/amd64

関係ないですが、Arch Linux良いですね。
Dockerさえあれば、母艦のOSが何でも良い世界が最高です。

# 参考

- https://docs.docker.com/compose/reference/envvars/
- http://stackoverflow.com/questions/35093256/how-do-i-pass-an-argument-along-with-docker-compose-up/35107585#35107585
AWSLambdaが環境変数対応して、serverlessもそれに対応したので使ってみた

# 結論

- serverless-plugin-write-env-vars/dotenvは不要になります
- (serverlessの場合)パスワードなどの暗号化は継続的に必要です


# 設定方法

serverlessを最新バージョン(1.2以降)にアップデートします。
また、serverless-plugin-write-env-vars + dotenvで環境変数を設定していた場合は以下のような変更を行いデプロイすればOKです

```yaml:serverless.yml
custom:
  writeEnvVars: # 削除
    ONE: ${env:ONE} # 削除

plugins:
- serverless-plugin-write-env-vars # 削除
 
provider:
  name: aws
  runtime: nodejs4.3
  environment: # 追加
    ONE: ${env:ONE} # 追加
```

```js:handler.js
require("dotenv").config(); // 削除
```

詳しくは[こちら](https://serverless.com/blog/serverless-v1.2.0/)を参照してください

# 環境変数はKMSを利用して暗号化されます

権限によって見れたり見れなかったりします

## AWSコンソール上での表示

### 権限がある場合
![lambda_env1.png](https://qiita-image-store.s3.amazonaws.com/0/45645/9cd89e9c-d6cd-91e4-57ab-7905a8a7aaa6.png "lambda_env1.png")

### 権限がない場合
利用するKMSのキーをデフォルトから独自にものに変えて、指定のキーでの復号化権限のないIAM User/Roleの場合

![lambda_env2.png](https://qiita-image-store.s3.amazonaws.com/0/45645/fa5a7048-de60-847a-5b3c-364873d60e42.png "lambda_env2.png")

## 問題点

### 利用するKMSのキーをserverless.ymlで指定できない

AWSコンソール(もしくはawscli)ではKMSのキーを指定できますが、serverless(というよりCloudFormation)では設定できなそうです

[AWS Cloud Formation AWS::Lambda::Function](http://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-function.html)


なお、AWSコンソール上で変更してしまえば以降はserverlessでデプロイしてもその設定が引き継がれます

### serverlessで作成するCloudFormationのテンプレートには平文で書かれる

AWS Lambda上では暗号化されて権限がないと見れなくても、CloudFormationの権限があればテンプレートが見れるので、設定済みの環境変数も見えてしまいます

CloudFormationに対して外部から変数を設定するか、kmsで暗号化した環境変数をCloudFormationに設定してLambda側では復号化された状態で動いたらうれしいですね
serverlessで暗号化が必要なパスワードなどのデータを環境変数として平文で設定するのは微妙でした

## おまけ

### 自動で作成されるKMSのキーのポリシー

他のサービスの自動作成されるキーと同様でそのサービスへのアクセス権があれば見えます。

```bash
$ aws kms get-key-policy --key-id xxxxxxxxxx --policy-name default | jq -r ".Policy" | jq "."
{
  "Version": "2012-10-17",
  "Id": "auto-awslambda",
  "Statement": [
    {
      "Sid": "Allow access through AWS Lambda for all principals in the account that are authorized to use AWS Lambda",
      "Effect": "Allow",
      "Principal": {
        "AWS": "*"
      },
      "Action": [
        "kms:Encrypt",
        "kms:Decrypt",
        "kms:ReEncrypt*",
        "kms:GenerateDataKey*",
        "kms:CreateGrant",
        "kms:DescribeKey"
      ],
      "Resource": "*",
      "Condition": {
        "StringEquals": {
          "kms:CallerAccount": "xxxxxxxxxx",
          "kms:ViaService": "lambda.ap-northeast-1.amazonaws.com"
        }
      }
    },
    {
      "Sid": "Allow direct access to key metadata to the account",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::xxxxxxxxxx:root"
      },
      "Action": [
        "kms:Describe*",
        "kms:Get*",
        "kms:List*",
        "kms:RevokeGrant"
      ],
      "Resource": "*"
    }
  ]
}
```

# 関連
[New for AWS Lambda – Environment Variables and Serverless Application Model (SAM)](https://aws.amazon.com/jp/blogs/aws/new-for-aws-lambda-environment-variables-and-serverless-application-model/)
[Flexible Environment Variable Support for AWS Lambda - Serverless Framework V1.2](https://serverless.com/blog/serverless-v1.2.0/)
macbookのバッテリー残量をコマンドラインでシンプルに表示

自分がほしいので作った単純なツールですが共有しておきます。

https://github.com/okisanjp/homebrew-bl

```
$ brew tap okisanjp/bl
$ brew install bl
```

こんな感じで表示します

```
$ bl
External Power : No
Current level  : 67.2%
Time to empty  : 0d  4h 44m
deterioration  : 98.5%
```

ioregで65535が返却されたときのハンドリングに苦慮してますが、まあとりあえずサクッとバッテリー残量知りたいだけなのでコレで良しとしておきます。

気が向いたらメンテするかもしれないです。
RubyとLabVIEWのカウントダウンプログラム比較

#Ruby

```ruby:count_down.rb
while 1
  10.downto(0){|num|
    puts num
    sleep 1
  }
end
```

```bash:
> ruby count_down.rb
10
9
8
7
6
5
4
3
2
1
0
10
9
8
```

#LabVIEW
##ブロックダイアグラムの配置
1.　数値表示器（ローカル変数）に初期値として10を代入する
2.　数値表示機（ローカル変数）から値を読み込み数字表示機（ローカル変数）に代入する。この手順を1秒ごとに行う
3.　右側で10秒経過したら数字表示機に値を代入する


![配置.jpg](https://qiita-image-store.s3.amazonaws.com/0/140159/8bd4cc9c-0aad-e013-2fb2-dc23c2d2aea7.jpeg)

##パーツ
![作業手順１.jpg](https://qiita-image-store.s3.amazonaws.com/0/140159/cd29b36e-bb10-e970-0926-88f595737c36.jpeg)

##パーツ2
![作成手順2.jpg](https://qiita-image-store.s3.amazonaws.com/0/140159/feb5b98b-f664-07b8-0273-3ded9d5dbe65.jpeg)
OTRSのsystemd UNITファイルを作ってみた

CentOS7にOTRS5を作ってみましたが、OTRS5向けのsystemdのservice unitファイルがなかったので、こちらを参考に作ってみました。

#参考
**Systemd(RHEL7)でOTRS4を稼動させるためのTIPS**
[http://d.hatena.ne.jp/hsts/20150119/1421653175](http://d.hatena.ne.jp/hsts/20150119/1421653175)

#注意
OTRS5は、バイナリ版が公開されているので、それをインストールし、他の必要なパッケージもインストール＆設定をしてください。

**OTRSバイナリパッケージ**
[https://www.otrs.com/download-open-source-help-desk-software-otrs-free/](https://www.otrs.com/download-open-source-help-desk-software-otrs-free/)

**OTRSドキュメント**
[http://otrs.github.io/doc/manual/admin/stable/en/html/index.html](http://otrs.github.io/doc/manual/admin/stable/en/html/index.html)

#手順
1.ファイルのダウンロード 

OTRS5用に改変したsystemd.unitファイルは、こちらからダウンロードできます。

**otrs.serviceファイルの配置先**
[https://github.com/htakeda/centos7-otrs5-systemd](https://github.com/htakeda/centos7-otrs5-systemd)

内容は、投稿日現在こんな感じです。

```
[Unit]
Description=OTRS: Open-source Ticket Request System, Copyright (C) 2001-2016 OTRS AG
Documentation=https://otrs.github.io/doc/manual/admin/stable/en/html/
Requires=crond.service httpd.service mariadb.service dovecot.service postfix.service
After=crond.service httpd.service mariadb.service dovecot.service postfix.service

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/opt/otrs/bin/otrs.Daemon.pl start
ExecStart=/opt/otrs/bin/Cron.sh start
ExecStop=/opt/otrs/bin/Cron.sh stop
ExecStop=/opt/otrs/bin/otrs.Daemon.pl stop
User=otrs
Group=apache

[Install]
WantedBy=multi-user.target
```

2.ダウンロードしたファイルを以下のパスに配置します。

 `/usr/lib/systemd/system/`

  ※ chownで権限など変更してください。

3.メールサーバやWebサーバの変更(必要な方)
メールとWebサーバは以下をRequiresとAfterに設定しました。
変更が必要な方は、変更してください。

 メール：dovecot postfix
 Webサーバ：httpd

変更した場合、以下のコマンドで更新する必要があります。
 `systemcrl daemon-reload`
 
4.otrsを起動してみます。

 `systemctl start otrs.service`
 
5.状態を確認します。
このような感じでデーモンが起動していたらOKです。

```
# systemctl status otrs
● otrs.service - OTRS: Open-source Ticket Request System, Copyright (C) 2001-2012 OTRS AG
   Loaded: loaded (/usr/lib/systemd/system/otrs.service; disabled; vendor preset: disabled)
   Active: active (exited) since 火 2016-11-29 22:53:50 JST; 1min 53s ago
     Docs: https://otrs.github.io/doc/manual/admin/stable/en/html/
  Process: 3183 ExecStart=/opt/otrs/bin/Cron.sh start (code=exited, status=0/SUCCESS)
  Process: 3172 ExecStart=/opt/otrs/bin/otrs.Daemon.pl start (code=exited, status=0/SUCCESS)
 Main PID: 3183 (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/otrs.service
           ├─3178 /usr/bin/perl -X /opt/otrs/bin/otrs.Daemon.pl start
           ├─3179 /usr/bin/perl -X /opt/otrs/bin/otrs.Daemon.pl start
           ├─3180 /usr/bin/perl -X /opt/otrs/bin/otrs.Daemon.pl start
           ├─3181 /usr/bin/perl -X /opt/otrs/bin/otrs.Daemon.pl start
           └─3182 /usr/bin/perl -X /opt/otrs/bin/otrs.Daemon.pl start
```

6. WebでOTRSにログインしてみましょう。
OTRSのデーモンが起動していない場合、画面上にメッセージが出てくるはずです。
Node.jsでFTP通信しディレクトリごとダウンロードする

# 概要
Node.jsでFTP通信し、ディレクトリごとダウンロードする方法について記す。

基本的には
http://qiita.com/PianoScoreJP/items/2ae8a293b3445d8d1cdf
に記されてる通り。

※ https://www.npmjs.com/package/ftp-client でmultiple downloadについてあるが、何故かファイルがディレクトリごとに一つずつスキップされる。不安定

# 方法
※結論として頑張る方法が１番よい

```js
var fs = require('fs');
var client = require('ftp');

var c = new client();
c.connect({
    host:"ftp.hoge.com",
    port:21,//portが21の場合は省略可能
    user:"youraccount",
    password:"yourpassword"
})

c.on('ready', function() {

  console.log('start donwload');

  // ローカルにディレクトリあるか確認・なければ作る
  var dir = 'Sample';
  if (!fs.existsSync(dir)){
    fs.mkdirSync(dir);
  }

  // リモートの対象ディレクトリ内のファイルを根こそぎダウンロード
  c.cwd('Sample',function(err, currentDir) {
    if (err) throw err;
    c.list(function(err,list){
      list.forEach(function(element, index) {
        c.get(element.name, function(err, stream) {
          if (err) throw err;
          console.log(index + ":" + element.name);
          stream.once('close', function() {
            console.log('finish 1 file');
          });
          stream.pipe(fs.createWriteStream('Sample/' + element.name));
        });
      });
    });
  });
  c.end();
});

// 何か処理をしたい場合はコールバックを使う
c.on('end',function(){
  console.log('finish donwload');
});

```
オンプレ環境でHW保守の時に使えるコマンド・情報をまとめる

# １．はじめに

いまだに現役、オンプレサーバの保守の時に実施する情報を個人的にまとめてみた。
めったに使わないので備忘録です。

* すでに投稿していて参考にしたQiita情報

http://qiita.com/kakerukaeru/items/a5b06758dae30f9390ad

# ２．HW情報の収集

### シリアル番号の参照

ベンダーに保守を依頼する時にシリアル情報を確認する。

```
# dmidecode -s system-serial-number
AAA123456
```

* MANページ

https://linux.die.net/man/8/dmidecode


# ３．富士通ServerView関連

### ServerView RAID Managerをブラウザで表示する

https://<表示させるサーバのIPアドレス>:3173/

※デフォルトで、サーバのアカウント情報でログインできるので「root」などでログインする。

ユーザガイド
http://jp.fujitsu.com/platform/server/primergy/manual/peripdf/b7fy-2761-01.pdf


情報をどんどん追記していきます。
Firebase記事メモ

自分用メモ


[Firebaseリンク](https://firebase.google.com/docs/unity/setup?utm_campaign=Firebase_culture_education_general_en_11-14-16&utm_source=gdevjp&utm_medium=blog)

># 機能

# Firebase Analytics
ゲーム内で発生したイベントを記録

データ分析用

# Firebase Real-time Database　*
アプリのデータをすべての端末で同期する．
>例：ゲーム内チャット、端末間での保存データの同期、ターン制のボードゲーム、カードゲーム、戦略ゲーム

小さいデータに適している？

# Dynamic Links
アプリ内共有

Dynamic Links を使うと、あるレベルのリプレイを共有したり、プレーヤーが作ったすばらしい新キャラクターや要塞、ユーザーが作成したコンテンツにリンクを張ることができます。

# Authentication *
認証

Firebase Auth を使うと、ユーザーが簡単に Facebook、Google、GitHub などのサードパーティの認証プロバイダにログインできるようになります。または、ユーザー名とパスワードを用いたカスタムの認証システムを作ることもできます。

# Cloud Messaging
単一のエンドポイントから iOS と Android の両方の端末に通知を送ることができます

# Remote Config *
クラウド経由でゲームの設定値をアップデートします。



# 参照
https://googledevjp.blogspot.jp/2016/11/announcing-firebase-for-unity.html
AWS Lambda(Scala) + APIGatewayでIP制限をかけてHTMLを返す

# AWS Lambda(Scala) + APIGatewayでHTMLを返す

VPC内のLambdaでAPIGatewayから来たユーザのIPを見てコンテンツを出しわける。

## Scalaのソースコード
Assemblyで実行可能なjarファイルを作成し、Lambdaにアップロードする。
ソースコード内では第一引数にAPIGatewayで設定したパラメータが入ってくるので、IPアドレスを取得し、一致チェックを行う。

```scala
package jp.qri.test

import com.amazonaws.services.lambda.runtime.Context

object Test {
  def hello(input: java.util.Map[String, Object], context: Context): String = {
    //IPアドレス取得
    val ip = input.get("source-ip")
    if (ip == null || ip != "yourIP") {
      //指定したIPでない場合はIPか「null」を表示
      if (ip != null) ip.toString() else "null"
    } else {
      //指定したIPであればHTMLを表示する。
      "<html><head><title>Hello</title></head><body>Hello</body></html>"
    }
  }
}
```

## Lambdaの設定
Handlerは「jp.qri.test.Test::hello」
VPC内で利用しているが、詳細な設定については下部参考URLを参照のこと。
Lambdaのテストリクエストは下記の通り。
結果としては「testIP」が表示される。
<pre>
{
  "source-ip" : "testIP",
  "input" : "test"
}
</pre>

## APIGatewayの設定
### APIGatewayの統合リクエスト
リモートIPを取得するため、本文マッピングテンプレートを修正。
<pre>
{"source-ip" : "$context.identity.sourceIp"}
</pre>
### 統合レスポンス
レスポンスが「"」で囲まれていたため、本文マッピングテンプレートで「"」内を取得。
コンテンツタイプ「application/javascript」に下記の内容を定義している。
<pre>
$input.path('$')
</pre>
### メソッドレスポンス
200のレスポンスモデルにコンテンツタイプ「text/html」モデル「Empty」を追加した。
## デプロイ
APIGateway画面からAPIをデプロイするとステージ画面にURLが表示されるので、リンクをクリックする。
IPアドレスが指定したものであればHTMLが表示され、異なるのであれば自身のIPアドレスが表示される。

## 参考
[[AWS]LambdaVPCでScalaからAWS SNSを使ってiOSにJSON形式で通知してみた。](http://qiita.com/qr_taka/items/b7851cc7e6a22326c690#%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E4%BD%9C%E6%88%90)
[Amazon LambdaでScala](http://qiita.com/yoshiyoshifujii/items/126b1f7928f285ed4c37)
[AWS LambdaでHTMLを出力してみた](http://qiita.com/yoshidasts/items/d58c555aed2693e99ae6)
Eclipse Neonを日本語化

##環境
・mac OSⅩ　El Capitan
・java version 1.8.0_111
・Neon.1a Release (4.6.1)

##内容
ダウンロードしたEclipse NeonにPleiadesをあてて日本語化する

##手順
・[Mergedoc Project](http://mergedoc.osdn.jp/)さんに行き、「Pleiades プラグイン本体をダウンロード」から、安定版へのリンクへ飛ぶ。
・pleiades_1.6.0.zip をクリックしてダウンロードを完了させる。
・pleiades_1.6.0.zip を解凍する。この中で必要なのは featuresフォルダ と plugins の中身。

##Eclipseにダウンロードしてきた featuresフォルダ と plugins の中身を Eclipse に移す

・Ecilpse.appで2本指でクリックしてコンテキストメニューを表示させる
・上から2番目ぐらいにあるパッケージの内容を表示するを選択する
・Contentsフォルダの中にあるEclipseフォルダにpleiades_1.6.0.zipの中のfeaturesフォルダをそのままドラッグアンドドロップする(Eclipseフォルダにデフォルトでfeaturesフォルダはない)
・pluginsフォルダの中に、pleiades_1.6.0.zipの中のpluginsの中の org.eclipse.equinox.launcher_1.3.200.v20160318-1642 をコピーする(pluginsの中にデフォルトであるjp.sourceforge.mergedoc.pleiadesはいじらない)
・pluginsの中が jp.sourceforge.mergedoc.pleiades と org.eclipse.equinox.launcher_1.3.200.v20160318-1642  であればOK

##eclipse.ini を編集する
・Contentsの中のEclipseの中のeclipse.iniを開きます
・最後の行に以下を記述

```
-javaagent:../Eclipse/plugins/jp.sourceforge.mergedoc.pleiades/pleiades.jar
```

これでeclipseを起動したら日本語に変わっているはずです
Marsの日本語化はあったが、NEONの日本語化の情報が少ないため書きました
機械学習論文読みメモ_18

[A Deep Learning Approach to Unsupervised Ensemble Learning](https://arxiv.org/pdf/1602.02285.pdf), ArXiv
deep learningのモデルがどのようにしてクラウドソーシングや教師なしアンサンブル学習へ適用出来るかを提示する。
条件付き独立な全ての分類器は、隠れ変数が１つのRBMと等価である事を示す。
これより、アンサンブル予測のための事後分布確率は代わりに学習したRBMで表す事が可能になる。
次に条件付き確率を満たさないケースでは、RBMベースのdeep learningモデルを考える事が出来る。
この時のモデル構成に関するヒューリスティクスを提案する。

[Beyond Parity Constraints: Fourier Analysis of Hash Functions for Inference](http://jmlr.org/proceedings/papers/v48/achim16.pdf), ICML2016
ランダム写像は最近では、高次元データ分布の特性を推測するための手法としても使われる。
ランダム写像では、高次元データの特性を保ったまま、低次元で解析のしやすい空間に写像する事が主な目的であった。
しかしそれはrandom parity check codeに基づくhash関数のみを利用したものであった。
これは良く高次元データの特性を保存するが、安定せず、また解析も簡単ではない。
本論ではフーリエスペクトルに基づいた一般的なフレームワークを提案する。
このフレームワークの利用で新たに２つのハッシュ関数を提案し、それを用いた確率推論を行えるようにした。

[Scalable Reinforcement Learning via Trajectory Optimization and Approximate Gaussian Process Regression](http://www.cc.gatech.edu/~bboots3/files/scalableRL.pdf)
強化学習において、モデルフリーアプローチは基本的に人による教示が必要で、物理システムとの試行錯誤が何度も必要である。
モデルベースアプローチでは、データから環境のダイナミクスを直接学習する事で効率化を図る。
しかし高次元空間に対しては、計算効率が良くはなく、またモデルの近似精度が問題であった。
本論では、local trajectory optimizationとrandmom feature approximationに基づいた手法を提案する。
local trajectory optimization は非線形最適制御などで用いられ、最適なトラジェクトリに関して局所最適な制御ポリシーを適用する手法である。
この手法を用いる事で高次元空間に対して効率的な計算を可能にする。
従来手法では動的システムの陽な定義が必要であった。
本論ではデータを用いたGaussian Processに基づいてこれを実現する。
特に計算効率良くするために、カーネル関数近似に基づいたrandom feature mappingを組み合わせた高効率なGPを用いる。
naming > wakedup > 「今、起床した」対象物

複数の対象物の監視をしている。
監視対象が「起床」したかどうかの確認をする。

「今、起床した」というチェック関数のnamingを検討。


https://github.com/search?q=%22wakedup%22&ref=searchresults&type=Code&utf8=%E2%9C%93
> CHIP_WAKEDUP

...
> bool wakedUp[27];

...
> vector<int> wakedUp;

...
> if (isAllAwake()) return years;

https://github.com/vamshimuga/Vessel-Segmentation/blob/bb5436732a16cd5c212e5140c32166101ed89913/MiaLab/MiaLevelSetModules/LevelsetKernels/LevelSetRoutines.h

```
#define LSMASK_SLEEP		 0x40
#define LSMASK_WAKEDUP		 0x50
#define LSMASK_OUT1NEIGHBOR	 0x60
#define LSMASK_IN1NEIGHBOR	 0x70
```

GetWakedUpList()あたりでとりあえず実装することにした。
WindowsのCaffeで学習するとき、GPUメモリと戦う方法

# はじめに
GPUを使ってDeep Learningで学習をさせようとすると、実に簡単にエラーが発生します。
（しかも異常終了するし．．．）
![image1.png](https://qiita-image-store.s3.amazonaws.com/0/130771/ad2ccf54-01ce-fbc3-1292-a57e4994063e.png)

# エラーメッセージ
おそらくほとんどのケースが、GPUメモリが足らないというケースかと思います。
![image2.png](https://qiita-image-store.s3.amazonaws.com/0/130771/930a7155-68d6-95c6-f075-33c12cd9b447.png)

であるならば、使用するGPUメモリを減らしましょう。

# 対応策1
画像サイズを小さくします。
例えば、256x256でエラーになっているのであれば、128x128にするとかします。
変更箇所は、学習用モデルと評価用モデルのprototxtファイルになります。

[例]学習用モデル
```
layer {
  name: "data"
  type: "Data"
  top: "data"
  top: "label"
  include {
    phase: TRAIN
  }
  transform_param {
    mirror: true
    crop_size: 128   ### 256→128
    mean_file: "imagenet_mean.binaryproto"
  }
  data_param {
    source: "train_lmdb"
    batch_size: 256
    backend: LMDB
  }
}
layer {
  name: "data"
  type: "Data"
  top: "data"
  top: "label"
  include {
    phase: TEST
  }
  transform_param {
    mirror: false
    crop_size: 128   ### 256→128
    mean_file: "imagenet_mean.binaryproto"
  }
  data_param {
    source: "test_lmdb"
    batch_size: 50
    backend: LMDB
  }
}
```

[例]評価用モデル
```
layer {
  name: "data"
  type: "Input"
  top: "data"
  input_param { shape: { dim: 10 dim: 3 dim: 128 dim: 128 } }   ### 256→128
}
```

修正してもエラーになるのであれば、さらに小さくしましょう。
ただし小さくなればなるほど認識しづらくなるので、気を付けてください。

# 対応策2
バッチサイズを小さくさくします。
逆伝播する際、バッチサイズ分だけため込んで処理を行うため、小さければ小さいほどため込む量が減ります。
変更箇所は、学習用モデルのprototxtファイルになります。

[例]学習用モデル
```
layer {
  name: "data"
  type: "Data"
  top: "data"
  top: "label"
  include {
    phase: TRAIN
  }
  transform_param {
    mirror: true
    crop_size: 227
    mean_file: "imagenet_mean.binaryproto"
  }
  data_param {
    source: "train_lmdb"
    batch_size: 128   ### 256→128
    backend: LMDB
  }
}
layer {
  name: "data"
  type: "Data"
  top: "data"
  top: "label"
  include {
    phase: TEST
  }
  transform_param {
    mirror: false
    crop_size: 227
    mean_file: "imagenet_mean.binaryproto"
  }
  data_param {
    source: "test_lmdb"
    batch_size: 25   ### 50→25
    backend: LMDB
  }
}
```

なお、バッチサイズを小さくしたら学習回数（ソルバファイルの「max_iter」）を多くするようにしてください。
→「iter_size」というパラメータがあり、こちらを増やす（デフォルトは1）方がよいとの情報をいただきました。（xevixevi様、ありがとうございました！）

修正してもエラーになるのであれば、さらに小さくしましょう。
ただし小さくなればなるほど処理時間が長くなります。また逆伝播によるパラメータ修正の振れ幅が大きくなり、高い精度を出すためにはより多くの学習回数が必要になります。（うまく収束しない場合もある）

# おまけ
最初からGPUメモリ内で処理できてしまい、エラーが発生しないことがあります。
そんな時には、GPUメモリの余り具合を確認し、画像サイズ、または、バッチサイズを大きくすることをお勧めします。

なお、GPUメモリの使用状況は、「[Open Hardware Monitor](http://openhardwaremonitor.org/)」等のフリーソフトで簡単に確認することができます。
![image3.png](https://qiita-image-store.s3.amazonaws.com/0/130771/4d54eb86-528e-150d-b411-5eb4edf6cf91.png)

# 余談
せっかく調整して、GPUメモリ内で動作するようになっても、うっかりGPU描画を行うアプリを実行したりすると、簡単に落ちます。
（1日以上学習させていたのに、うっかりA-Frameのサンプル見てたら落ちました ;_;）
（あぁ．．．3日まわしていたのに、google mapで落ちた．．．）
学習中は、余計なことをしないようにしましょう。

# まとめ
出来れば上記のように値を調整するのではなく、より多くGPUメモリが載ったグラフィックスボード（GPUボード）を使用することをお勧めします。
また、多少GPUの世代が古くても、多くのメモリが載ったものがよいと思います。
PHPでELB越しにアクセス元のIPアドレスを取得する


普通は`$_SERVER["REMOTE_ADDR"]`で取得できますが、ELBが噛んでいるとELBのIPアドレスを取ってしまうので、以下のようにしたら取得できた！


```php
$_SERVER["HTTP_X_FORWARDED_FOR"]
```

# 参考
[ELBを使ってアクセス元のIPを取る方法 ELBに限らないよ](http://tech.basicinc.jp/AWS/2013/04/28/aws_elb_customlog/)
Perl_配列を利用してSQL実行するとき、SQLインジェクションを防ぐ方法

**要件**
・外部から取得したリストの値を利用してDB更新したい。
・取得するリストで、要素数が毎回変わる。
・SQLインジェクションのリスクを避けたい。　:spy_tone5:

**コード例**

```per

#ステータス更新の関数を呼ぶ

&updateStatus($dbh, @list);


sub updateStatus{

   #関数を呼ぶとき渡すパラメター。　$dbh：DB接続の設定、@list：取得のリスト配列
   my($dbh, @list)=@_;

   #配列の要素数を取得
    my $cnt=@list;


   #要素数と同じ数の"?マーク"文字列を作って、SQLを実行する

    my @mark;

    for(my $i=1; $i<=$cnt; $i++){
        push(@mark, "?");
    }

    my $markString=join(',',@mark);


    my $sql1=qq[
              UPDATE table1
              SET status = '1'
              WHERE id in ($markString)
        ];

    my $sth = $dbh->prepare($sql1)|| die "$DBI::errstr";


   #各要素数のbind_paramを作る

    for(my $j=0; $j<$cnt; $j++){
        my $k=$j+1;
        $sth->bind_param($k, $list[$j]);
    }

    $sth->execute || die "$DBI::errstr";

   //AutoCommit がオフ（0）の時
    $dbh->commit;

}
```
Mac OS Sierraになってキーバインドが魔改造になってきた

#経緯
以前の投稿(http://qiita.com/object-kazuAtGitHub/items/e0128d64a09682d77520)で
ほぼほぼ以前のキーバインドになってきたが、問題が発生した。

# 問題点
ターミナル内のEmacsのAlt-xが”≈”にバインディングされて終了できない。

#環境
MacOS Sierra
VirtualBox + Vagrant + Cantos 6 + iTerm2 + Emacs

#改善方法
いろいろ試してみたが、iTerm2側で改善したほうがいい。
設定があっちこっちで半年後わからなくなる確率１００％。
早くKarabina！！！！

![161129-0001.png](https://qiita-image-store.s3.amazonaws.com/0/6903/d1a3a953-17e5-72d6-3bcb-fbf5f9328015.png)

#追記
新しいキーボードは、爪が長いとほんとに打ちにくい。