OmniAICreator/Qiita-1.07M huggingface dataset:
【JavaScript】Excelで読み込んだデータを文字化けさせずにCSVで書き出す


Excelからデータを読み込んで処理を行い、
結果をCSVファイルに書き出してExcelで開くといった要件を満たす必要がありました。

しかし、CSVファイルをExcelで開く際は出力時に文字コードをShift-JISにしないと文字化けが起こります。
（ファイル読み込み時にUTF-8を指定できますが、都度操作する必要があります。）

参考：[Microsoft Excel で開ける CSV 関連のフォーマットまとめ](https://github.com/mpyw-yattemita/excel-csv-compatibility-check)


今回は、文字化けしないようにCSVファイルをShift-JISで出力し
Excelでスムーズに開けるようにする方法を共有します。

# 必要なモジュール
- [fs](https://nodejs.org/api/fs.html)
- [C2FO/fast-csv](https://github.com/C2FO/fast-csv)
- [SheetJS/js-xlsx](https://github.com/SheetJS/js-xlsx) 
- [narirou/jconv](https://github.com/narirou/jconv/blob/master/READMEja.md)

```javascript

const fs = require('fs')
const csv = require('fast-csv')
const jconv = require( 'jconv' )
const xlsx = require('xlsx')
const utils = xlsx.util
```


# Excelデータ読み込み

Excel内のデータを読み込みます。
読み込んだデータはCSV形式のままだと扱い難いのでお好みで配列にしてください。

```javascript

// csv -> Array[Object]
function parseCSVtoArray(csv) {
  let result = []
  csv
    .fromString(csv, {headers: true})
    .on('data', function(data) {
      result.push(data)
    })
    .on('end', function() {
      console.log('end')
    })
  return result
}

var workbook = xlsx.readFile(importPath) // Excelファイルを読み込む
var sheetName = workbook.SheetNames[0] // Excelファイルの最初のシートの名前を取得
var worksheet = workbook.Sheets[sheetName] // Excelファイルの最初のシートを読み込む

var csv = xlsx.utils.sheet_to_csv(worksheet) // ExcelデータをCSV形式で取得
let array = yield parseCSVtoArray(csv) // データを使いやすくするために配列に変換

for (let arr of array ) {
  console.log(arr['hoge'])
  
  // 処理 …
}

```


# CSV書き出し

[jconv](https://github.com/narirou/jconv/blob/master/READMEja.md) を使って処理結果をShift-JISに変換します。

ここでは処理結果を配列で拾っているので、
ヘッダーを付けてCSV（文字列）に変換したものを渡しています。

Bufferについては[こちら](http://nodejs.jp/nodejs.org_ja/api/buffer.html)を参考にしてください。

```
// resultArray：　処理結果が入った配列

// Array[object] -> csv
csv.writeToString(resultArray, {headers: true}, (err, data) => {

  var buffer = jconv.convert(data, 'UTF8', 'SJIS') // UTF-8からShift-JISへ文字コードを変換
  fs.writeFileSync('result.csv', buffer) // ファイルを書き出し
})

```

これで文字コードがShift-JISのCSVファイルが書き出されたので、
Excelで開いてもウィザード無しで文字化けもせずスムーズに開けます。

# おまけ：Excelデータで書き出し

このデータをExcelで書き出したい場合は、[node-xlsx](https://www.npmjs.com/package/node-xlsx)を使うと簡単に出力できます。

```javascript

const nodeXlsx = require('node-xlsx').default
…

function convertCSVtoArray(str) {
  var result = []
  var tmp = str.split('\n')

  for(var i = 0; i < tmp.length; ++i) {
    result[i] = tmp[i].split(/(?:",|,"|,(?=(?:(?:[^\"]*\"){2})*[^\"]*$))/) // ※セル内の複数値に対応 
  }
  return result
}

csv.writeToString(resultArray, {headers: true}, (err, data) => {

  var arr = convertCSVtoArray(data)
  var buffer = nodeXlsx.build([{name: sheetName, data: arr}])
  fs.writeFileSync('result.xlsx', buffer)
})

```

これで `.xlsx` ファイルで書き出されます。

ヘッダーを意識せずに付加する為に一度csvにしてからまた配列に戻す手間をしてますが、
必要がない場合や別途加工する場合は `writeToString` を挟む必要は無いと思います。


# 終わりに

完全にモジュール頼りですが、これらの素晴らしいモジュールを知って
Excelで消耗する人が一人でも減ってくれれば嬉しいです。


# 参考

- [ExpressでShift-JISのCSVを返す](http://qiita.com/Hiroki_M/items/98b885fcdbb1e6334e5a)
【OracleDatabase】【RAC】crs自動起動の無効化

#背景
仕様次第ではあるが、自動起動してしまうと、何かと順序関係なり
他事象との整合や確認を意識した計画起動を乱しやすく。。。
手で順番に起動と確認を行いたくなる。。。

#手順
◆確認(事前)
crsctl config crs

```console
    [root@node1 ~]# crsctl config crs
    CRS-4622: Oracle High Availability Services autostart is enabled.
    [root@node1 ~]#
```
◆無効化
crsctl disable crs

```console
    [root@node1 ~]# crsctl disable crs
    CRS-4621: Oracle High Availability Services autostart is disabled.
    [root@node1 ~]#
```
◆確認(事後)
crsctl config crs

```console
    [root@node1 ~]# crsctl config crs
    CRS-4621: Oracle High Availability Services autostart is disabled.
    [root@node1 ~]#
```
#その他
全ノードで実施する
cloud9上でドットインストールの Node.js入門の「#14 MongoDBに接続してみよう」でつまづいた件

http://dotinstall.com/lessons/basic_nodejs/26214
↑ドットインストールの Node.js入門の「#14 MongoDBに接続してみよう」
ここでつまった時のこと

MongoClient.connectしようとしたら、

>{ [MongoError: failed to connect to server [0.0.0.0:27017] on first connect]
>  name: 'MongoError',
>  message: 'failed to connect to server [0.0.0.0:27017] on first connect' }

ってなる。

いろいろ試してみた結果、
ターミナルで
> mongod

からの
>ERROR: Insufficient free space for journal files
>Please make at least 3379MB available in /data/db/journal or use --smallfiles

を発見

だから
>mongod --smallfiles

を実行

そしたらMongodがやっと動いたらしく

>node mongo.js

でめでたくエラー回避、ちゃんとconnectされました。

ぜんぜん中身わかっていないけれど、とりあえず動きました。
解決できたのは偶然です。
DBのメモリの問題？っぽいことがあるようでしたがさっぱりわかりませんでした。
Install cuda to macOS

#Environment 
macOS Sierra 10.12.2
2.9GHz, 8GB, NVIDIA Geforce

Install Driver + Toolkit

###Download link:
https://developer.nvidia.com/cuda-toolkit

###Setting the bashrc file
```~/.bashrc
## cuda
export PATH=/Developer/NVIDIA/CUDA-7.5/bin:$PATH
export DYLD_LIBRARY_PATH=/Developer/NVIDIA/CUDA-7.5/lib:$DYLD_LIBRARY_PATH
```

###Install pycuda from source
```
cd ~/Download
git clone http://git.tiker.net/trees/pycuda.git
cd pycuda
python configure.py
```

modify the siteconf.py under the pycuda folder
(if boost is not installed ```brew install boost```)

```
BOOST_INC_DIR = ['/usr/local/Cellar/boost/1.60.0_1/include']
BOOST_LIB_DIR = ['usr/local/Cellar/boost/1.60.0_1/lib']
BOOST_COMPILER = 'gcc49'
USE_SHIPPED_BOOST = True
BOOST_PYTHON_LIBNAME = ['boost_python-mt']
BOOST_THREAD_LIBNAME = ['boost_thread-mt']
CUDA_TRACE = False
CUDA_ROOT = '/usr/local/cuda'
CUDA_ENABLE_GL = False
CUDA_ENABLE_CURAND = True
CUDADRV_LIB_DIR = ['${CUDA_ROOT}/lib']
CUDADRV_LIBNAME = ['cuda']
CUDART_LIB_DIR = ['${CUDA_ROOT}/lib']
CUDART_LIBNAME = ['cudart']
CURAND_LIB_DIR = ['${CUDA_ROOT}/lib']
CURAND_LIBNAME = ['curand']
CXXFLAGS = ['-arch', 'x86_64', '-mmacosx-version-min=10.7', '-isysroot', '/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk']
LDFLAGS = ['-F/Library/Frameworks', '-arch', 'x86_64', '-mmacosx-version-min=10.7', '-isysroot', '/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk']
```
###
```
cd ~/Download/pycuda
sudo make
sudo make install
```

※Note
You must import any of pycuda files while you are in the different directory that you extracted the pycuda tar.gz file

### Check whether pycuda was installed or not yet
```
python
>>> import pycuda.autoinit
>>>
```
Trello > カレンダー機能を使ってみた > Windows, OS Xではカレンダー使用可能 / iPad mini4では???

```txt:動作環境
MacOS X El Capitan
Google chrome
iPad mini4
```

現在、コーディング等を含めた環境再構築をしている中、様々なタスクが日々発生している。
Googleカレンダーにて日程を整理していたが、他のツールを試したくなった。

タスク管理サービスは色々あるが、その中でTrelloを使ってみた。

### 使いたい機能

- カレンダー機能
- TODOリスト
- Windows, OS Xからカレンダー編集
- iPad mini4からカレンダー閲覧

### 使い始めてわからなかったこと

- リストの概念
- カードの概念
- Checklistの概念
- カレンダーの使用方法
- カレンダーへの入力方法

### こう理解・使用した

- リスト
   - 細かなタスクをまとめるもの
   - Chromeのボード表示ではリストは横に増えていくため、リストを増やしすぎると使いにくい
   - そのため、1つのリスト(環境構築)にそれぞれのタスクとしてカードを追加することにした
- カード
   - 個々のタスクを割り当てて使用
- Checklist
   - 個々のカード(タスク)の中で細分化する場合に使う
   - Checklistをチェックしていくことで進捗が見られる
- カレンダーの使用方法
   - Power-Upsを使って「カレンダー機能」を追加
   - 参考 https://ogatism.jp/techs/trello_calendar/
- カレンダーへの入力方法
   - カードの編集にて「期限」を指定
      - 色々触ってこの方法を見つけた
   - カレンダーにて「カードを追加」では「リスト」と「カードの位置」を選択する。「カードの位置」を覚えて使うというUIは旧来のUIに思う。
    
　
### iPadアプリではカレンダー表示できない

PC, OS X上ではChromeなどからカレンダー形式で編集・閲覧できる。

iPad用のアプリからはカレンダー閲覧ができない(と思われる)。
カレンダー閲覧はPower-Upsを使うのだが、Power-Upsを使うにはTrello Goldとして有償登録するような気がする。

Power-UpsにはSlack, Google Drive, Githubなどの連携もあるので、使い方によっては良いツールになる可能性もある。

### Safari on iPad mini4

iPadのアプリでなくSafari上でTrelloのページにアクセスするとカレンダー機能が使えることに気づいた。

とりあえずこちらで使ってみることになりそう。
Flexbox で Borderレイアウトを実現する

2017年4月になると Windows Vista のサポート終了に伴い、IE10以下への対応が不要になります。これにより、多くの新しい CSS 機能を実戦投入できる状況になりますが、最も影響の大きい新機能として Flexbox があります。

Flexbox を使うと従来の CSS では扱いの難しかった上下中央寄せや残りの高さにフィットしたボックスが簡単かつ柔軟に実現できるようになります。

今回、紹介するのは Flexbox で Border レイアウトを実現する方法です。Border レイアウトとは具体的には、東・西・南・北・中央にコンポーネントを配置するレイアウト機構のことです。Java AWT の BorderLayout、.NET Windows Form の Dock を思い出すとわかりやすいかもしれません[^holygrail]。

[^holygrail]: この文章を書いた後に知ったのですが、このようなレイアウトは[聖杯レイアウト問題](http://hashrock.github.io/solved-by-flexbox-ja/demos/holy-grail/)として知られる有名な問題だそうです。リンク先にも同様の解決策が記載されていますので、そちらも参考にしてください。

実際の画面例です[^1]。

[^1]: Windows 上の IE11, Chrome, Firefox, Edge にて動作確認済み。

![BorderLayout.png](https://qiita-image-store.s3.amazonaws.com/0/104531/bc0608d7-7ff8-772b-522c-d6f36941e23b.png)

では、具体的に HTML を見てみましょう。

```html
<!doctype html>
<style>
html, body {
    height: 100%;
    margin: 0;
}
.layout {
    display: flex;
    flex-direction: column;
    height: 100%;
}
.layout-body {
    flex: 1 1 auto;
    overflow: hidden;
    
    display: flex;
    flex-direction: row;
}
.layout-center {
    flex: 1 1 auto;
    overflow: auto;
}
.layout-left,
.layout-right {
    overflow: auto;
}

/* 以下の CSS は色を付けているだけなので無視して構いません。 */
.layout-header { background-color: red; }
.layout-left { background-color: purple; }
.layout-right { background-color: green; }
.layout-footer { background-color: cyan; }
</style>
<body>
<div class="layout">
    <div class="layout-header">header</div>
    <div class="layout-body">
        <div class="layout-left">left</div>
        <div class="layout-center">content</div>
        <div class="layout-right">right</div>
    </div>
    <div class="layout-footer">footer</div>
</div>
</body>
```

flexbox の仕様を知っていれば簡単に実現できそうですが、実際にやってみると中央部分のスクロールが意外にやっかいでした。ここでは、overflow を指定し、中のコンテンツサイズが溢れてもサイズが変わらないようにすることで解決しています。

なお、layout-center の中に layout を入れ子にしても動作します。
MaterialUIのダイアログのサイズをコンテンツに合わせて伸縮させる


とっても素敵なMaterialUIですがたまに痒いところに手が届かない。
例えばダイアログ。
コンテンツのサイズより大きめに表示されてしまいます。

こんな保存確認ダイアログを表示しようとした場合。

```dialog.tsx
<Dialog
	title="保存します"
	open={true}
	onRequestClose={()=>this.handleCloseConfirm()}
	actions={[
		<FlatButton
			label="キャンセル"
			onTouchTap={()=>this.handleCloseConfirm()}/>,
		<FlatButton
			label="保存"
			primary={true}
			keyboardFocused={true}
			onTouchTap={()=>this.handleSave()}/>,
		]}>

	<TextField floatingLabelText="タイトル"
			   onChange={(e)=>this.handleChangeTitle(e)}/>
</Dialog>
```

あぁ、長い。長いんだよ。

![Kobito.EP4pBa.png](https://qiita-image-store.s3.amazonaws.com/0/127115/f83e17f0-f077-983b-b745-3680ed1c8325.png "Kobito.EP4pBa.png")

下記のように`contentStyle`属性で直接幅・高さを指定する、という方法も解決方法のひとつとしてはありですが。

```dialog.tsx
<Dialog
	title="保存します"
	open={true}
	onRequestClose={()=>this.handleCloseConfirm()}
	contentStyle={{width: '350px'}}
	actions={[
		<FlatButton
			label="キャンセル"
			onTouchTap={()=>this.handleCloseConfirm()}/>,
		<FlatButton
			label="保存"
			primary={true}
			keyboardFocused={true}
			onTouchTap={()=>this.handleSave()}/>,
		]}>

	<TextField floatingLabelText="タイトル"
			   onChange={(e)=>this.handleChangeTitle(e)}/>
</Dialog>
```

![Kobito.yYgobB.png](https://qiita-image-store.s3.amazonaws.com/0/127115/95a095a3-ef21-8ea4-c2d4-b5a064f6ff6c.png "Kobito.yYgobB.png")



ダイアログが登場する度に指定するの？コンテンツが可変の場合どうするの？という問題達にぶち当たります。
Reduxで上手いことダイアログの表示処理自体を集約してコンテンツだけ切り替えたい、という場合は尚更ですよね。

考え抜いた末に編み出した小技がこちら。
`position:fixed`により座標指定で配置されているダイアログを無理やり`flexbox`で真ん中に配置されるよう上書きしてしまうという方法。
`!important`指定しなくてはならないのが大変残念ですが個人的にはとても重宝しています。
もちろん表示位置はwindowのリサイズイベントにも追従しますよ。



```app.sass
.dialog, .dialog-content
  // 勝手にflexbox化
  display: flex !important
  justify-content: center !important
  align-items: center !important
  // position:fixed時の配置情報をリセット
  padding-top: 0px !important
  transform: initial !important
```

```dialog.tsx
<Dialog
	title="保存します"
	open={true}
	onRequestClose={()=>this.handleCloseConfirm()}
	className="dialog"
	contentClassName="dialog-content"
	actions={[
		<FlatButton
			label="キャンセル"
			onTouchTap={()=>this.handleCloseConfirm()}/>,
		<FlatButton
			label="保存"
			primary={true}
			keyboardFocused={true}
			onTouchTap={()=>this.handleSave()}/>,
		]}>

	<TextField floatingLabelText="タイトル"
			   onChange={(e)=>this.handleChangeTitle(e)}/>
</Dialog>
```

![Kobito.YIEXY8.png](https://qiita-image-store.s3.amazonaws.com/0/127115/f8a0230c-01b9-3a60-7279-e9a8eac0f81b.png "Kobito.YIEXY8.png")
HoloLens アプリ開発Tips: "アクティベーション要求がエラー '指定されたファイルが見つかりません'" エラー対処策

HoloLens アプリ開発中に以下のエラーに遭遇しましたので、原因と対処策を記載します。

#エラー内容
##アクティベーション要求がエラー '指定されたファイルが見つかりません')
![Activation Error](https://qiita-image-store.s3.amazonaws.com/0/156393/a5b8a173-1859-90b2-5746-362f33108e21.png)
>Windows ストア アプリ '<アプリ名>' をアクティブにできません。アクティベーション要求がエラー '指定されたファイルが見つかりません' で失敗しました。

>この問題のトラブルシューティングについては、ヘルプを参照してください。

[詳細] ボタンをクリックすると MSDN の記事 [デバッガー アプリケーション アクティブ化エラーの診断](https://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=JA-JP&k=k(vs.debug.error.app_activation_failure)&rd=true) が表示されます。

#原因
展開済み同名 HoloLens アプリの競合。

#対処策
HoloLens デバイスに展開済みの自作の同名アプリをアンインストールすることで、現象回避します。また、内部名などが競合している可能性がありますので、関連する自作アプリをアンインストールすることも合わせて確認してください。

##HoloLens デバイスのアプリ削除手順
1. Bloom ジェスチャーでスタート メニューを表示
2. [+] アイコンをクリックしてアプリ一覧ページを表示
3. 該当のアプリを AirTap で長押しして、表示されるメニューから [Uninstall] を選択
![Uninstall App](https://qiita-image-store.s3.amazonaws.com/0/156393/27fee1ba-c312-e7e8-2af3-ca331398a947.png)

#補足
先に対処策を特定してから詳細調査を行いましたが、すでにエラー発生時の Windows イベント ログ流れてしまっていたので、また同じエラーログが発生した場合にエラーログの詳細を記載します。
PHPの参照渡し(リファレンス渡し)で未定義変数を指定するとデフォルト値が適用されない

PHP の関数の引数に未定義変数を参照渡しすると、関数の引数のデフォルト値が適用されない。

## PHP の未定義変数は NULL になる

PHPでの参照渡し - Qiita http://qiita.com/akisssa/items/342d742c6ce9cd30b050

> PHPでは原則的に未定義の変数の値を取得しようとしたときに Notice が発生して NULL 扱いになるが、参照渡しのデフォルト値の場合だけ例外的にNoticeを発生せずにNULLとして初期化される。この場合、関数側でデフォルト値に何を指定してもNULLと見なされることに注意する必要がある。

PHP: NULL - Manual http://php.net/manual/ja/language.types.null.php

> 変数は、以下の場合に NULL とみなされます。
> 
> ・定数 NULL が代入されている場合。
> 
> ・まだ値が何も代入されていない場合。
> 
> ・unset() されている場合。

PHP では未定義の変数は NULL になる。という基本原則を覚えていれば良さそう。

## 関数の引数が値渡しの場合

### サンプルコード

```php
<?php

function test($x=100)
{
  if (is_null($x)) {
    echo "\$x=[null]", PHP_EOL;
  } else {
    echo "\$x=[$x]", PHP_EOL;
  }
  $x = 10000;
}

echo '【引数なし】', PHP_EOL;
test();
echo PHP_EOL;

echo '【0が代入された変数$aを引数に指定】', PHP_EOL;
$a = 0;
test($a);
echo "\$a=[$a]", PHP_EOL, PHP_EOL;

echo '【未定義の変数$bを引数に指定】', PHP_EOL;
test($b);
echo "\$b=[$b]", PHP_EOL, PHP_EOL;
```

### 実行結果

```php
【引数なし】
$x=[100]

【0が代入された変数$aを引数に指定】
$x=[0]
$a=[0]

【未定義の変数$bを引数に指定】
PHP Notice:  Undefined variable: b in /Users/foo/sample.php on line 23

Notice: Undefined variable: b in /Users/foo/sample.php on line 23
$x=[null]
PHP Notice:  Undefined variable: b in /Users/foo/sample.php on line 24

Notice: Undefined variable: b in /Users/foo/sample.php on line 24
$b=[]
```

未定義変数を参照する際に、Notice が発生している。

## 関数の引数が参照渡しの場合

### サンプルコード

```php
<?php

function test(&$x=100)
{
  if (is_null($x)) {
    echo "\$x=[null]", PHP_EOL;
  } else {
    echo "\$x=[$x]", PHP_EOL;
  }
  $x = 10000;
}

echo '【引数なし】', PHP_EOL;
test();
echo PHP_EOL;

echo '【0が代入された変数$aを引数に指定】', PHP_EOL;
$a = 0;
test($a);
echo "\$a=[$a]", PHP_EOL, PHP_EOL;

echo '【未定義の変数$bを引数に指定】', PHP_EOL;
test($b);
echo "\$b=[$b]", PHP_EOL, PHP_EOL;
```

### 実行結果

```
【引数なし】
$x=[100]

【0が代入された変数$aを引数に指定】
$x=[0]
$a=[10000]

【未定義の変数$bを引数に指定】
$x=[null]
$b=[10000]
```

未定義変数を参照しても、Notice が発生していない。
コピペで完成UILabel Swift3用


使用したのは追記していきます。

#Swift3
##基本

```
let label: UILabel = UILabel()
label.backgroundColor = UIColor.orange
label.text = "テキスト"
label.font = UIFont(name: "HiraKakuProN-W6", size: 8.5)
label1.textColor = UIColor.white
self.addSubview(label1)
```

##その他

```
//文字寄せ
label.textAlignment = NSTextAlignment.right
label.textAlignment = NSTextAlignment.center

//角を丸くする
self.imageView.layer.masksToBounds = true //マスク設定
label.layer.cornerRadius = 1.0


//背景を画像に
label.backgroundColor = UIColor(patternImage: UIImage(named: "hogeImg")!)
```


objc

```
//背景を画像に
label.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"blah"]];
```


<br>
UILabelを使って何か調べる

```
//UILabelの行数を調べる
NSInteger lineCount = 0;
CGSize textSize = CGSizeMake(cell.replyBody.frame.size.width, MAXFLOAT);
long rHeight = lroundf([cell.replyBody sizeThatFits:textSize].height);
long charSize = lroundf(cell.replyBody.font.leading); //ここはフォントによって微妙に変更する必要がある場合あり
lineCount = rHeight/charSize;
```
bitriseでiOSアプリの配布ページをslackで通知

# はじめに
Bitriseでビルドしたipaやplist、インストールURLを表示するQRコードの画像も合わせて取得するworkflowを先日まとめました。
http://qiita.com/nofrmm/items/d0dc5bfa7eef13b3c1d0
インストールページの配布をslackで考えたら、もうすこし楽になりました。

# Slack
##incoming WebHookを作成

WebHookさせるURL作成します。

<img width="603" alt="スクリーンショット 2017-02-05 0.25.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/12362/2f9fd56f-222d-8752-080c-b9c1847a0e21.png">

# Bitrise

## WorkFlowから保持される変数

<img width="322" alt="スクリーンショット 2017-02-05 8.14.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/12362/011c4f2b-8718-51a0-0648-8d4bfc61a57b.png">

- $GIT_CLONE_COMMIT_COMMITER_NAME

bitriseへのDeploy
<img width="806" alt="スクリーンショット 2017-02-05 0.38.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/12362/07588554-5626-4435-f98f-b4013232f4b3.png">

- $BITRISE_PUBLIC_INSTALL_PAGE_URL

Install page をQRで表示させるURLを生成
<img width="323" alt="スクリーンショット 2017-02-05 7.55.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/12362/718aa679-84f7-4713-1c84-fea389f0e672.png">

- $BITRISE_PUBLIC_INSTALL_PAGE_QR_CODE_IMAGE_URL

## Scriptをつかう

<img width="318" alt="スクリーンショット 2017-02-05 7.51.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/12362/2476ea1c-3ee3-b723-c6af-a0f49cec3582.png">

こちらだと、ビルドの結果の定型で使うことを想定しているため
Scriptからcurlを使って
slackへattachmentを用いてリクエストをなげるようにします。

<img width="484" alt="スクリーンショット 2017-02-05 8.25.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/12362/8dc29a48-740b-6116-2806-0c1ad25f0da5.png">


```json
{
    "attachments": [
        {
            "fallback": "INSTALL_PAGE_URLの情報",
            "color": "#36a64f",
            "title": "INSTALL_PAGE_URL",
            "title_link": "${BITRISE_PUBLIC_INSTALL_PAGE_URL}",
            "text": "Optional text that appears within the attachment",
            "image_url": "${BITRISE_PUBLIC_INSTALL_PAGE_QR_CODE_IMAGE_URL}",
            "thumb_url": "${BITRISE_PUBLIC_INSTALL_PAGE_QR_CODE_IMAGE_URL}",
            "footer": "COMMIT_COMMITER:${GIT_CLONE_COMMIT_COMMITER_NAME}",
            "ts": ${BITRISE_BUILD_TRIGGER_TIMESTAMP}
        }
    ]
}

```

terminalからpayloadの記載に間違いがないか確認しながら・・・

`https://hooks.slack.com/services/T00000000/B00000000/...`は設定したWebhookのURLへ変更してください。


```bash

curl -X POST --data-urlencode "payload={\"attachments\": [{ \"fallback\": \"Required plain-text summary of the attachment.\",\"color\":\"#36a64f\", \"title\":\"INSTALL_PAGE_URL\" ,\"title_link\":\"${BITRISE_PUBLIC_INSTALL_PAGE_URL}\",\"image_url\":\"${BITRISE_PUBLIC_INSTALL_PAGE_QR_CODE_IMAGE_URL}\",\"text\": \"${BITRISE_PUBLIC_INSTALL_PAGE_URL}\",\"footer\":\"COMMIT_COMMITER:${GIT_CLONE_COMMIT_COMMITER_NAME}\",\"ts\":${BITRISE_BUILD_TRIGGER_TIMESTAMP}}]}" https://hooks.slack.com/services/T00000000/B00000000/....
```

# 通知

<img width="705" alt="スクリーンショット 2017-02-05 7.41.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/12362/d3bb7a86-2f9d-0a98-c8b7-19aea7fed654.png">

# 余談
## QRコード生成のサービス
公開範囲を限定していない場合は使わないほうがいいのかなと。
http://goqr.me/api/doc/create-qr-code/


# さいごに
Slackに表示させたいレイアウトを調整したjson調整が一番面倒でした。
goやrubyでもかけるようなので、bash以外での記述を考えます。
Ruby + RESAS-API で市区町村一覧を取得するサンプルコード

## サンプルコード

```ruby
require 'json'
require 'open-uri'

# RESAS-API - 市区町村一覧
# https://opendata.resas-portal.go.jp/docs/api/v1/cities.html

# /result/bigCityFlag
# 特別区・行政区フラグ（0:一般の市区町村、1:政令指定都市の区、2:政令指定都市の市、3:東京都23区）
def get_type(bigCityFlag)
  case bigCityFlag
  when '0' then ''
  when '1' then ' (政令指定都市の区)'
  when '2' then ' (政令指定都市)'
  when '3' then ' (東京都23区)'
  else ''
  end
end

prefCode = '23' # 愛知県の都道府県コード
prefCode = ARGV[0] if ARGV[0]

base_url = 'https://opendata.resas-portal.go.jp/api/v1/cities'
params = {'prefCode' => prefCode}
url = base_url + '?' + URI.encode_www_form(params)
headers = {'X-API-KEY' => 'YOUR RESAS API KEY'}

data = JSON.parse(open(url, headers).read)
data['result'].each{|v|
  puts "#{v['cityCode']}: #{v['cityName']}#{get_type(v['bigCityFlag'])}"
}
```

## 実行結果 (愛知県の都道府県コード「23」を指定した場合)

```
23100: 名古屋市 (政令指定都市)
23101: 名古屋市千種区 (政令指定都市の区)
23102: 名古屋市東区 (政令指定都市の区)
23103: 名古屋市北区 (政令指定都市の区)
23104: 名古屋市西区 (政令指定都市の区)
23105: 名古屋市中村区 (政令指定都市の区)
23106: 名古屋市中区 (政令指定都市の区)
23107: 名古屋市昭和区 (政令指定都市の区)
23108: 名古屋市瑞穂区 (政令指定都市の区)
23109: 名古屋市熱田区 (政令指定都市の区)
23110: 名古屋市中川区 (政令指定都市の区)
23111: 名古屋市港区 (政令指定都市の区)
23112: 名古屋市南区 (政令指定都市の区)
23113: 名古屋市守山区 (政令指定都市の区)
23114: 名古屋市緑区 (政令指定都市の区)
23115: 名古屋市名東区 (政令指定都市の区)
23116: 名古屋市天白区 (政令指定都市の区)
23201: 豊橋市
23202: 岡崎市
23203: 一宮市
23204: 瀬戸市
23205: 半田市
23206: 春日井市
(以下略)
```

## 実行結果 (東京都の都道府県コード「13」を指定した場合)

```
13101: 千代田区 (東京都23区)
13102: 中央区 (東京都23区)
13103: 港区 (東京都23区)
13104: 新宿区 (東京都23区)
13105: 文京区 (東京都23区)
13106: 台東区 (東京都23区)
13107: 墨田区 (東京都23区)
13108: 江東区 (東京都23区)
13109: 品川区 (東京都23区)
13110: 目黒区 (東京都23区)
13111: 大田区 (東京都23区)
13112: 世田谷区 (東京都23区)
13113: 渋谷区 (東京都23区)
13114: 中野区 (東京都23区)
13115: 杉並区 (東京都23区)
13116: 豊島区 (東京都23区)
13117: 北区 (東京都23区)
13118: 荒川区 (東京都23区)
13119: 板橋区 (東京都23区)
13120: 練馬区 (東京都23区)
13121: 足立区 (東京都23区)
13122: 葛飾区 (東京都23区)
13123: 江戸川区 (東京都23区)
13201: 八王子市
13202: 立川市
13203: 武蔵野市
13204: 三鷹市
13205: 青梅市
13206: 府中市
```

## 参考資料

- RESAS-API - 地域経済分析システム（RESAS）のAPI提供情報 https://opendata.resas-portal.go.jp/
- RESAS-API - 市区町村一覧 https://opendata.resas-portal.go.jp/docs/api/v1/cities.html
ノートPCへUSBによるESXiインストール

#動機
　ESXiのバージョンアップ・ブートデバイスの換装を実施する案件が発生。
　前準備として私的に検証を実施したいとプールしていたノートPCにESXiをインストールしようと考えた。
　検証完了後は、検証にて使用した環境を私的利用しようと思っている。

#準備物
###ESXi ISO①:VMware-VMvisor-Installer-5.0.0.update03-1311175.x86_64.iso
###ESXi ISO②：VMware-VMvisor-Installer-6.0.0.update02-3620759.x86_64.iso
###ノートPC：Lenovo ThinkPad x220
####CPU:i7 2.70GHz
####Memory:16GB
###インストーラUSB:不明　8GB
###USBブートデバイス①:不明 USB3.0　8GB
###USBブートデバイス②:不明 USB3.0　8GB

#妄想環境
###検証時
USBブートデバイス①にESXi5.0環境を構築
データストアとしてLocalのディスクを指定
ゲストは作成しない

###私的利用時
USBブートデバイス②にESXi6.0環境を構築
データストアとしてLocalのディスクを指定
ゲストとして下記を作成
　Windows7ゲスト：ESXi管理及び私的利用用に使用
　OpenSuseゲスト:shell及び検証用として使用
　CentOS7ゲスト：Pxiyサーバとして使用
運用時は、ESXi起動後自動的にLocalではWindows7ゲストのコンソールが表示される様にしたい
出来ないならば、ESXiコンソールよりWindows7ゲストへ接続し、他のゲストへはsshにて接続する仕様にする。

#検証項目
###デバイス換装
　・既存ブートUSBを切断しての経過観察
　　＞【考察】
　　　　　ESXiは起動時にOSイメージを全てメモリ上へ書き出し基本動作時はメモリ上のOSイメージを使用している。
　　　　　ボートデバイスへの書き込みも制限が在り頻繁に実施される事は無い。
　　　　　為らば、起動完了後ブートデバイスを切断しても問題はそこまで発生しない。
　　＞【期待値】
　　　　　ブートデバイスを切断しても書き込み処理が発生しない限り正常に動作する。

　・ブートデバイスのクローン作製し換装し動作観察
　　＞【考察】
　　　　　ddコマンドによりブートデバイスの完全クローンを作成すれば同一のデバイスと認識され問題なく動作する。
　　＞【期待値】
　　　　　ddコマンドによるクローンデバイスでも正常に動作する。

#以後随時更新していきます。
技術英語 > Tuples are immutable; when you assign elements to a tuple, they'[re baked in the cake] and can't be changed. / carved in stone

@ Introducing Python: Modern Computing in Simple Packages by Bill Lubanovic
(No. 1113 / 12833)

> Tuples are immutable; when you assign elements to a tuple, they'**<font color=red>re baked in the cake</font>** and can't be changed.

http://blog.goo.ne.jp/sawanoshijin/e/33538e0eed402c22456fa45c76fae0e6
> Baked in the cakeというイディオムは投資用語としては「織り込み済み」と意味で使われる。

投資用語のようだ。

<hr>
関連して思い出したのは

> carved in stone

http://ejje.weblio.jp/content/carved+in+stone
> もはや変えられない

石に彫ってしまったものはもはや変えられない。

彫刻家の「はしもとみお」さんが木彫りでリアルな動物を作成されているのをドキュメンタリーで見たことがある。「依頼した犬の耳が小さい」と言われて、普通だったら耳を大きくすることはできないのだが、周りを調整することで耳を大きくしていた。

プログラムの修正をする際に、細部だけにとらわれず全体を俯瞰して修正することも大切だと感じた。
[メモ]VSCodeプラグイン

# 概要

インストールするプラグインのメモ。

# プラグインリスト

## vscode-icons

綺麗なアイコンを表示してくれる。

## Docker Support

Dockerのサポートをしてくれる。

## GitLens

Git Blameが捗る。

## Project Manager

Project管理が捗る。

## Trailing Spaces

行末のスペースを強調表示してくれる。
ASP.NetのWebFormsのMasterPageってこんな風に書いておくと捗りそう

#ASP.NetのWebFormsのMasterPageってこんな風に書いておくと捗りそう
世間では既にASP.Net MVCの時代になってるみたいですが、今更ASP.NetのWebFormsをはじめました

##まずはこんな風に書いておくと捗りそう

```
<%@ Master Language="VB" AutoEventWireup="false" CodeBehind="MasterPage.master.vb" Inherits="Sample.MasterPage" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">

<script>
    history.forward();
</script>

<head runat="server">
    <title></title>
    <link href="Content/bootstrap.css" rel="stylesheet" />
    <asp:ContentPlaceHolder ID="head" runat="server" />
</head>
<body>
    <form id="form1" runat="server">
        <asp:ContentPlaceHolder ID="body" runat="server" ViewStateMode="Disabled" />
        <script src="Scripts/jquery-3.1.1.js"></script>
        <script src="Scripts/bootstrap.js"></script>
    </form>
</body>

</html>
```

###こう書くとなにができてる？

* ブラウザの「戻る」ボタンを無効にしている
* ViewStateを無効にしている  
* bootstrap対応になっている

bootstrap対応にするには

```
PM> Install-Package bootstrap
```

も忘れずに
windowsから公開鍵認証でssh接続するメモ

アクセス権周りとかで結構引っかかったのでメモ書きみたいな感じで。
クライアントはWindows 10, Xshell 5.
サーバはFedora 24.
一旦パスワードでssh接続して、クライアントから操作してる感覚で書き書き。

#最初にやること
##ユーザの作成
最初が肝心
`$ useradd hoge`
`$ passwd hoge`

###sudoを使えるようにしたいよね

`$ usermod -aG wheel hoge`
ってやるといいらしい。
`-aG`を引数にするとグループを追加になる。
多分`reboot`すると有効になるのかな？
ここはあまりわかってない。

##ホームディレクトリのownerと権限を確認する
コメントで教えてもらいました。nak1114さんありがとうございます

`$ cd /home/`
`$ ls -l |grep hoge`
なんか出てくるけど、僕の場合は下記のような感じ。
`drwx------. 4 fuga hoge     106  2月  5 02:16 hoge`
左から権限、リンクの数、owner, グループ、ファイルサイズ、タイムスタンプ、ディレクトリ名
権限が`rwx------`になってるけど、正しくは`rwx--x--x`だから変える。
`$ chmod 711 hoge`
で`rwx--x--x`に。

最初に出てくる`fuga`がownerだから、`hoge`じゃなかったらownerを変える。
`$ chown [owner] hoge`
でownerを`hoge`にする。
 
####備考
頭の`d`はディレクトリに対しての権限つけてますの意味。
`rwx--x--x`は左から所有者、グループ、その他のユーザの権限で、所有者がread, write, executeできて、
グループとその他のユーザはexecuteのみってことかな。






#ssh接続したいユーザでやること

##鍵を作る
`$mkdir ~/.ssh/`
`$cd ~/.ssh/`
`~/.ssh/`に鍵を置くことになるので先に移動してそこで作ると楽

`$ssh-keygen -t rsa -b 2048 -f hoge_rsa`
`-t`で鍵の種類、`-b`でbit数、`-f`でファイル名を指定する。
別に`-b 2048`はなくても2048bitになるけどまぁわかりやすいかなって。

##秘密鍵をクライアント側にコピーして保存する
`$cat hoge_rsa`
ベチョーってめっちゃ中身が表示されるからwin側でテキストエディタにコピー。
普通にwin側でもhoge_rsaって名前でなくさないところに保存したいね。

###コピーして保存したら元ファイルを削除
`$rm hoge_rsa`
サーバ側には必要ないしね

##公開鍵の新規登録 or 追記する
`$cat hoge_rsa.pub >> authorized_keys`
`cat`でやるとファイルの中身を追記になるんだけど、追記先のファイルがなかったら新しく作られる！便利！

###公開鍵もクライアント側にコピーして保存する
`$cat hoge_rsa.pub`
秘密鍵をコピーして保存した方法でオッケー。
万が一紛失ってあるからね、こわいもんね。

###新規登録 or 追記したら元ファイルを削除
`$rm hoge_rsa.pub`
もう元ファイルはサーバ側じゃいらない子だから消そう。キレイキレイ。

##アクセス権の設定
これ結構引っかかったというか、参考先に書いてあったり書いてなかったりでチンプンカンプンだった。
動いた設定でメモ。
`$cd ~`
`$chmod 700 .ssh`
`$cd .ssh`
`$chmod 600 authorized_keys`


##sshdの再起動
`$service sshd restart`
全部終わったら再起動。

#おわり
とりあえず自分がやったことは全部書いた。
またユーザを追加することがあったときにこれを見れば確実って感じに。
こんな感じで少しずつ触っていければいいなー。

#参考URL
[ssh公開鍵認証を実装する](http://qiita.com/HamaTech/items/21bb9761f326c4d4aa65)
[SSHの鍵認証設定](http://qiita.com/gotohiro55/items/36a22516de2b381b3c6e)
[鍵交換方式によるssh接続](http://kazmax.zpp.jp/linux/lin_sshrsa.html)
[Ubuntuでsudoできなくなった](http://qiita.com/to4king/items/cd5d42570071505941e9)
[ファイル・ディレクトリの所有者とグループを変更する - chown](http://kazmax.zpp.jp/linux_beginner/chown.html)
[【 chmod 】 ファイルやディレクトリのアクセス権を変更する](http://itpro.nikkeibp.co.jp/article/COLUMN/20060227/230728/)
[chmod - ファイルのアクセス権の変更](http://technique.sonots.com/?UNIX%2F%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%2F%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E7%AE%A1%E7%90%86%2Fchmod)
[ls - ディレクトリの内容を一覧表示](http://technique.sonots.com/?UNIX%2F%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%2F%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E7%AE%A1%E7%90%86%2Fls)
[Ruby]配列の定義方法まとめ

## []を使う
```irb
>> array = ["hello", "world"]
=> ["hello", "world"]
```
```irb
>> [*1..10]
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
```

## Array.newを使う
```irb
>> Array.new
=> []
```
```irb
>> Array.new(3)
=> [nil, nil, nil]
```
```irb
>> Array.new(3, 3)
=> [3, 3, 3]
```


## %wや%iを使う
### 使える場合
- 文字列の配列（空白文字を含まない）
- シンボルの配列（空白文字を含まない）

```irb
>> %w(Ruby Perl Python)
=> ["Ruby", "Perl", "Python"]
```
```irb
>> %i(Ruby Perl Python)
=> [:Ruby, :Perl, :Python]
```


## 結局どの定義がいいの？
Githubとクックパッドのスタイルガイドを読んだ感じだと、Array.newは引数がない場合は使わないほうが良い。
あとは、%記法（%wと%i）が使える場合は、使うようにする。
もっと詳しく見たい場合は参考文献のリンクからスタイルガイドを見て見てください。すごくためにまりました。

```ruby
# 悪い例
arr = Array.new
hash = Hash.new

# 良い例
arr = []
hash = {}
```
```ruby
# 悪い例
STATES = ['draft', 'open', 'closed']
STATES = [:draft, :open, :closed]

# 良い例
STATES = %w(draft open closed)
STATES = %i(draft open closed)
```

## 参考文献
- https://github.com/cookpad/styleguide/blob/master/ruby.ja.md#arrays
- https://github.com/fortissimo1997/ruby-style-guide/blob/japanese/README.ja.md
- たのしいRuby第5版
Dockerについての一問一答

# 概要

Dockerについての一問一答です。随時更新していきます。

# Dockerfileとは？

DockerfileはDocker Imageを自動でつくるためのTEXTファイルである。

# Imageとは？Containerとは？

An image is a filesystem and parameters to use at runtime. It doesn’t have state and never changes. A container is a running instance of an image.

# DockerHubとは

[DockerHub](https://hub.docker.com/)とは、DockerImageが格納されているサイトである。


# Dockerのbuildとrunの違いは？

buildはImageを作成する。runはImageからContainerを起動する。

# Containerを一括削除するワンライナーは？

`docker ps -a | awk '{print $1}' | xargs docker rm`

# 起動中のContainerに入る方法

`docker exec -it [containerのタグ] bash`

# Docker buildのキャッシュ有効無効はどのように判定される？

正しいことは保証しないが、「[Dockerfileを書く時の注意とかコツとかハックとか](http://kimh.github.io/blog/jp/docker/gothas-in-writing-dockerfile-jp/)」では以下のように判定すると書かれている。

- ある一行でキャッシュが使われなかったらそれ以降のすべての行でキャッシュは使われない
- 何もしないコマンドを追加してもキャッシュは無効になる
- コマンドと引数の間に意味のないスペースの入れてもキャッシュは無効となる
- Dockerfileの行に意味のないスペースを入れてもキャッシュは有効
- 冪等ではない命令でもキャッシュは効いてしまう
- ADD以降にある命令はキャッシュされない (ただし、0.7.3以前のバージョンを使っている場合のみ)
[メモ]VirtualBoxの設定

# 概要

VirtualBox上にGUIありのLinuxをインストールする際の設定についてのメモです。各見出しは仮想マシンの設定画面におけるタブを表しています。

# 一般

クリップボードの共有: 双方向
ドラッグ&ドロップ: 双方向
※ Guest AdditionsをゲストOSへインストールする必要があります。

# システム

## マザーボード

メモリ: 4096MB
チップセット: ICH9
拡張機能: 「I/O APICを有効化」「ハードウェアクロックをUTCにする」

## プロセッサー

プロセッサー数: 2CPU
使用率制限: 100%
拡張機能: 「PAE/NXを有効化」

## アクセラレーション

準仮想化インターフェース: Hyper-V
仮想化支援機能: 「VT-x/AMD-Vを有効化」「ネステッドページングを有効化」

# ディスプレイ

ビデオメモリー: 256MB
アクセラレーション: 「3Dアクセラレーションを有効化」
※ 3Dアクセラレーションを有効化して、且つGuest Additionをインストールすると画面の描画においてバグがでることがあります（Electronで作られたテキストエディタのAtomやVSCodeがまともに表示されませんでした）。
Raspberry Pi の Haskell GPIO ライブラリ

Raspberry Pi でボタンによる LED の点灯制御ができるライブラリの検証です。

今回は以下のライブラリを検証しました。

* [HPi](https://hackage.haskell.org/package/HPi)
* [wiringPi](https://hackage.haskell.org/package/wiringPi)

HPi は [bcm2835](http://www.airspayce.com/mikem/bcm2835/) のラッパー、wiringPi は [Wiring Pi](http://wiringpi.com/) のラッパーです。その他に Hackage には [system-gpio](https://hackage.haskell.org/package/system-gpio) という仮想ファイルを読み書きするライブラリもありますが、これは試すまでもないので除外しました。

結論から言うと、HPi も wiringPi も、どちらも GPIO の割り込みには対応しておらず、ボタンの状態をポーリングしなければなりません。wiringPi はオリジナルの C ライブラリには wiringPiISR という割り込みコールバック関数があるので期待していたのですが、Haskell のライブラリには実装されていませんでした。

なので今回のサンプルはどちらもポーリングです。ちなみに Node.js だとポーリングではなくコールバックで書けます。このエントリの最後におまけとしてサンプルを提示しておきます。

## 回路

今回は LED ひとつとボタンひとつの回路です。ボタンはタクトスイッチではなくマイクロスイッチを使用しているので論理が逆になっています。

![](https://qiita-image-store.s3.amazonaws.com/0/31613/3b8bdcbc-683d-6e56-45f7-0c6cad7b6117.png)

回路図は上記のとおりです。

ブレッドボードに配線した様子が以下です。

![](https://qiita-image-store.s3.amazonaws.com/0/31613/5ad56f94-d1ef-b1a9-6fb0-ec9645cd6e83.jpeg)

## HPi のサンプル

HPi は物理ピンでコーディングするスタイルです。

```hpi-sample.hs
import Control.Concurrent
import Control.Monad
import System.RaspberryPi.GPIO

led = Pin08
button = Pin07

main = withGPIO $ do
  setPinFunction led Output
  setPinFunction button Input
  forever $ do
    threadDelay 10000
    state <- readPin button
    writePin led $ not state
```

withGPIO 関数はおそらく setPinFunction の後始末をしてくれるのだと思いますが、今回のサンプルは SIGINT で強制終了するので有効に機能しないと思います。

## wiringPi のサンプル

wiringPi は GPIO でコーディングします。私はこちらの方が好みです。

wiringPi は暗黙的に wiringPiSetupGpio が呼び出されるようで、明示的に呼び出す必要がありません。C の Wiring Pi 同様、実行にはルート権限が必要です。なお、ルート権限が不要な wiringPiSetupSys 相当の関数は提供されていません。

```wiringpi-sample.hs
import Control.Concurrent
import Control.Monad
import System.Hardware.WiringPi

led = Gpio 14
button = Gpio 4

main = do
  pinMode led OUTPUT
  pinMode button INPUT
  forever $ do
    threadDelay 10000
    state <- digitalRead button
    digitalWrite led $ if state == HIGH then LOW else HIGH
```

内容はほとんど HPi と同じです。digitalRead と digitalWrite は独自型を読み書きするので、Bool で読み書きする HPi に比べて面倒です。

## まとめ

* ボタンぐらいならポーリングでも良いが、PWM 等には使えない
* 消費電力が増えるので、バッテリー駆動の機器には向かない
* ポーリングはダサい

## Node.js のサンプル（おまけ）

npm で gpio を検索すると 400 以上ヒットします。上から順に簡単そうなライブラリを探して見つけたのが [onoff](https://www.npmjs.com/package/onoff) です。おそらく内部的には仮想ファイルの読み書きで実現しているため、I2C や SPI は扱えませんが、扱う範囲が GPIO だけなら良い選択肢だと思います。

```onoff-sample.js
const Gpio = require('onoff').Gpio;
const led = new Gpio(14, 'out');
const button = new Gpio(4, 'in', 'both');

button.watch((err, value) => {
  if (err) {
    throw err;
  }
  led.writeSync(value ? 0 : 1);
});

process.on('SIGINT', () => {
  led.unexport();
  button.unexport();
  process.exit();
});
```

Node.js は process.on() で割り込みが検知できるので、SIGINT が来たら後始末して終了するようにしています。
ツリーの中の距離


- 約数列挙はO(√n)です。キャッシュするので、テストケースの数が増えれば増えるほど速くなります。
- 再帰関数の返し値は次の通り
  - 1番めの数値の深さの最低値
  - 2番めの数値の深さの最低値
  - パスの長さの最低値

```rb:tyama_henae11.rb
#!/usr/bin/env ruby
#http://nabetani.sakura.ne.jp/hena/orde11tredis/
#http://qiita.com/Nabetani/items/10b2ccc28301e44e09e6

F={}
def children(x)
	return [] if x<4
	r=[]
	i=2
	while i*i<=x
		if x%i==0
			r<<i+1
			r<<x/i+1 if i*i<x
		end
		i+=1
	end
	r # sort is not required
end
def dfs(x,a,b)
	ch=F[x]||=children(x)
	r={:l=>nil,:r=>nil,:t=>nil}
	q=ch.map{|e|dfs(e,a,b)}
	q.each{|e|
		r[:l]=[r[:l]||Float::INFINITY,e[:l]+1].min if e[:l]
		r[:r]=[r[:r]||Float::INFINITY,e[:r]+1].min if e[:r]
		r[:t]=[r[:t]||Float::INFINITY,e[:t]].min if e[:t]
	}
	r[:l]=0 if x==a
	r[:r]=0 if x==b
	r[:t]=[r[:t]||Float::INFINITY,r[:l]+r[:r]].min if r[:l]&&r[:r]
	r
end
while gets
	x,a,b=$_.scan(/\d+/).map(&:to_i)
	p dfs(x,a,b)[:t]||-1
	STDOUT.flush
end
```
Raspbianにmackerel-agentをインストールする

# はじめに
[ヘルプ](https://mackerel.io/ja/docs/)にある以下ドキュメントの手順を組み合わせてARM用にアレンジしました。

- [バイナリファイルで直接mackerel-agentをインストールする](https://mackerel.io/ja/docs/entry/howto/install-agent/binary)
- [debパッケージでmackerel-agentをインストールする](https://mackerel.io/ja/docs/entry/howto/install-agent/deb)

インストール時の対象OSバージョンは以下になります。

```
$ uname -a
Linux raspberrypi 4.4.46-v7+ #959 SMP Fri Feb 3 17:24:25 GMT 2017 armv7l GNU/Linux
$
```
#dpkgコマンドを使用する
パッケージファイルをダウンロードします:

```
curl -LO https://mackerel.io/file/agent/deb/mackerel-agent_latest.all.deb
```
その後、`dpkg`コマンドを用いてインストールします:

```
sudo dpkg -i mackerel-agent_latest.all.deb
```
#アーカイブをダウンロードして差し替える
mackerel-agent_linux_arm.tar.gzをダウンロードします:
GitHubの[mackerelio/mackerel-agent](https://github.com/mackerelio/mackerel-agent/releases)にてLatest releaseを確認して読み替えてください。（本記事記載時は v0.39.3 ）

```
curl -LO https://github.com/mackerelio/mackerel-agent/releases/download/v0.39.3/mackerel-agent_linux_arm.tar.gz
tar xvzf mackerel-agent_linux_arm.tar.gz
cd mackerel-agent_linux_arm
sudo cp mackerel-agent /usr/bin/
```
#設定ファイルを編集する
`/etc/mackerel-agent/mackerel-agent.conf` ファイルを編集して、APIキーを設定してください。

```
apikey = "<YOUR_API_KEY>"
```

APIキーは[オーガニゼーションのページ](https://mackerel.io/my)から確認できます。このAPIキーでオーガニゼーションを識別しますので、APIキーは外部に漏らさないようご注意ください。

詳細は[mackerel-agent仕様](https://mackerel.io/ja/docs/entry/spec/agent)をご覧ください。

設定ファイルを利用して、以下のことを実現できます:

- [サービス、ロールを設定する](https://mackerel.io/ja/docs/entry/spec/agent#setting-services-and-roles)
- [カスタムメトリックを投稿する](https://mackerel.io/ja/docs/entry/advanced/custom-metrics)

#エージェントを起動する
以下のコマンドを実行することでエージェントが起動します。

```
sudo /etc/init.d/mackerel-agent start
```

`/var/log/mackerel-agent.log`にエージェントのログが出力されます。

エージェントが正しく動きはじめると、Mackerelにホストとして登録されます。[ダッシュボード](https://mackerel.io/my/dashboard)などでご確認ください。

#エージェントのアンインストール
mackerel-agentをアンインストールするには、以下のコマンドを実行してください。

`dpkg`でインストールした場合:

```
sudo dpkg -r mackerel-agent
```

またその際、デフォルトでは `/var/lib/mackerel-agent/id` にホストIDの記録されたファイルが残っているため、これを削除してください。
Raspberry Pi3とArduino Unoのシリアル通信

## 概要
ラズパイとArduinoをシリアル通信してみたメモ

### ラズパイの設定
* /boot/config.txtを編集する

```/boot/config.txt
$ sudo vi /boot/config.txt
# 末尾にこの行を追記
dtoverlay=pi3-miniuart-bt
```

* /boot/cmdline.txtを編集する

```/boot/cmdline.txt
$ sudo vi /boot/cmdline.txt
前) dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles
後) dwc_otg.lpm_enable=0 console=tty1 console=serial0,115200 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
```

* 再起動

```
$ sudo reboot
```

### Arduinoと接続
* 下記のようにUSB接続する
![IMG_8987.JPG](https://qiita-image-store.s3.amazonaws.com/0/71637/9b65e58f-7250-ed60-84ed-b82a84b8b643.jpeg)

* コマンドを実行し接続されていることを確認

```
$ dmesg | grep ttyACM0
[ 2991.602972] cdc_acm 1-1.2:1.0: ttyACM0: USB ACM device
```

* Arduinoは下記を書き込む

```
void setup(){
  // シリアルポートを9600 bps[ビット/秒]で初期化
  Serial.begin(9600);
}
 
void loop(){
  Serial.write("hello world¥n");
  delay(3000);
}
```

* ラズパイ側のpython

```
import serial
import time

def main():
    con = serial.Serial('/dev/ttyACM0', 9600)
    time.sleep(2)
    print con.portstr
    while 1:
        # シリアル通信からデータを受け取って、MQTTでpublishするとかは下記でできそう
        str=con.read(30)
        #print str

if __name__ == '__main__':
    main()
```

## 実行結果
```
$ python serial-arduino.py
/dev/ttyACM0
helhello w
orld¥nhel
lo world¥
nhello wor
・・・・・
```

## 参考
* [RaspberryPi3でシリアル通信を行う](http://qiita.com/yamamotomanabu/items/33b6cf0d450051d33d41)
* [Raspberry PiとArduino間でUSB経由のシリアル通信](http://karaage.hatenadiary.jp/entry/2015/06/10/080000)
xbeeを用いたC言語のPC同士の相互接続

xbee(S2C)をそれぞれ繋いだPC2台でテキストメッセージを相互通信できるプログラムをC言語で作成したいです。
様々なライブラリ等を調べてみたのですが、大体が、pcとarduino、pcとマイコンを想定しているライブラリばかりで、PCの相互通信はそもそもxbeeでやる意味がないからか、まったく出てこないです。 
PC同士の相互通信を行うためのおすすめのライブラリがあれば教えていただけると幸いです。
Herokuで heroku run:detached rake db:migrateが失敗する

昨日くらいからHerokuでheroku run:detached rake db:migratを実行するとエラーを返す。werckerで自動実行すると失敗するので調査。

```rb

$ heroku run:detached rake db:migrate                                                                              
Running rake db:migrate on ⬢... !
 ▸    Parameter "url" must be a string, not object
````

どうやら、node関連のエラーっぽいが、node使ってない。。

```rb
 heroku config:set NODE_MODULES_CACHE=false
```

をセットして実行すると成功する。

heroku側で何か変更があった可能性が高そう
https://twitter.com/ierceg/status/827919392168108032
Raspberry Pi 3、 Ubuntu MATE 16.04LTS環境でPure Data vanillaバージョン0.47.1-3を簡単にインストールする

この記事の内容は通常のPC、通常のUbuntu、異なるバージョンのUbuntuでも同様であると思われます。ただし、リポジトリは各自で最適なものを選択してください。
ただし、最新バージョンのUbuntu(2017/2/5現在17.04)では必要ありません。
debianおよびraspbianでの方法は以下のリンクに記載があります。(他の方の記事です)
http://qiita.com/skyfish20ch/items/233efcf80bcec746a7da

結論から言うと

コントロールセンター⇒ソフトウェアとアップデート⇒他のソフトウェアタブを開く⇒追加
⇒ボックス内に
deb http://ports.ubuntu.com/ zesty universe
を入力
（Ubuntuの場合は
deb http://archive.ubuntu.com/ubuntu zesty universe
）
⇒ソースを追加⇒再読み込み
⇒ターミナル上で
`sudo apt-get install puredata=0.47.1-3`
を実行
⇒コントロールセンター⇒ソフトウェアとアップデート⇒他のソフトウェアタブを開く
⇒先ほど追加した文の左のチェックを外す⇒再読み込み

の流れで元のシステムを変えずに最新のPure Data vanillaをインストールできます。


以下詳細

Raspberry Pi 3 Model B
Ubuntu MATE16.04LTS
の環境で行いました。

Pd-extendedはかなり前から開発が止まっているようで、現在はPd vanillaをインストールしDekenというライブラリ管理ソフトを用いるのが最善だと思われるのですがDekenはバージョン0.47.0以降のPd vanillaにおいてのみデフォルトで組み込まれているらしいのでそれ以降のバージョンのPd vanillaをインストールしようと思いました。(それ以前のバージョンでも別途にインストールすることも可能らしいです)
 
しかし、Ubuntu16.04LTS(xenial)で標準で参照されるレポジトリには少し古いバージョン0.46-3が登録されているため
`sudo apt-get install puredata`
ではバージョン0.46.7-3がインストールされてしまいます。(それでいい場合はこの後の内容は必要ありません)

`apt-cache policy puredata`

でインストールできるバージョンを確認できます。

この状態からバージョン0.47.1-3をインストールするためには
・ソースコードをダウンロードし自分でビルド
・別のリポジトリを追加
の2通りの方法が存在します

前者の方法のやり方はこのリンク先を参照するといいかと思います。(外部サイトです)
http://www.footfoot.tokyo/article29/ubuntu-puredata-build

後者については以下で説明します。

まずPd vanillaの最新バージョンが含まれるリポジトリを検索します。
公式のパッケージ検索ページをリンクします。
http://packages.ubuntu.com/search?keywords=puredata&searchon=names&suite=all&section=all

検索結果よりUbuntu17.04(zesty)用のリポジトリのコンポーネントuniverseにパッケージがあるようなのでそれをaptのリポジトリに登録します。(公式のリポジトリ以外にもPdのコミュニティのリポジトリでもできると思います)

追加の方法は今回調べたもので主に以下の2通りです。
・コントロールセンター⇒ソフトウェアとアップデート⇒他のソフトウェアタブでリポジトリを追加
・/etc/apt/sources.listにリポジトリを追加

この例で追加するリポジトリは
deb http://ports.ubuntu.com/ zesty universe
です。

リポジトリを追加したため
`sudo apt-get update`
などで更新をします。

これでPd vanillaの0.47.1-3をapt-getでインストール可能になりました。

`sudo apt-get install puredata=0.47.1-3`
でインストールを行います。
（--install-suggestsをつけた方がいいかも？）

その後はそのままではUbuntu17.04(zesty)向けの他のパッケージをインストールしてしまう可能性があるためリポジトリの無効化を行います。

先ほどと同様以下の2通りです。
・コントロールセンター⇒ソフトウェアとアップデート⇒他のソフトウェアタブで裂きほど追加したリポジトリのチェックを外す
・/etc/apt/sources.list内の追加したリポジトリを#でコメントアウト

リポジトリに変更があるためもう一度
`sudo apt-get update`
などで更新をします。

以上で既存の環境を変えずにPd vanillaのバージョン0.47.1-3のインストールは終了です。


記載されている情報は2017/2/5現在自分が調べた情報を元に書かれています。参考にする場合はバージョンの違いなどに注意してください。
いい加減、そのソースのドキュメント管理はReadmeでした方がいい

表題の通り、かつ今更感パネエなのですが、その理由を書きます。

## この記事で伝えたいことを一行で
プログラムの仕様はReadmeに書いてソースと一緒に管理したら良いこといっぱいあるよってこと

## 予備知識
Readmeの書き方やREADME駆動開発については、他の方が書いていただいた、以下の記事がとても参考になると思います。
[わかりやすい README 駆動開発](http://qiita.com/b4b4r07/items/c80d53db9a0fd59086ec)

reStructedTextの記法については、以下のドキュメントが大変、参考になります。
[reStructuredText入門](http://docs.sphinx-users.jp/rest.html)

Markdownの記法については、以下の記事が大変、参考になります。
[Markdown記法 チートシート](http://qiita.com/Qiita/items/c686397e4a0f4f11683d)

## 質問
ところで、Readme書いてますか？
reStructedText形式やMarkdown形式などで書ける以下のようなやつです。

<img width="978" alt="Readme-sample.png" src="https://qiita-image-store.s3.amazonaws.com/0/153437/c7196948-2536-dab2-e53a-7adf199620e3.png">

## ドキュメント更新はずっと課題
ドキュメントというものの保守コストは非常に高いんですよね。
実体験上、開発優先のプロジェクトとかですと、ドキュメント更新は後回しにされがちで、ドキュメントが最新の状態に保守されてるケースって稀です。

昔の人は言いました。「ソース嫁」と。

## BTSはBTSとして使おうよ
最近の[BTS](https://ja.wikipedia.org/wiki/バグ管理システム)のトレンドはよく知らないので誤解があるかもしれませんが、個人的にRedmineはBTSとしては優れていると思うのですよね。ただ、ドキュメント管理として使うには少し残念な印象。

## プログラマは忙しいんじゃ
プログラマがやることって結構色々あるんですよね。
ソースを書いて、テストを書いて、ビルドして、テストして、コミットして、プッシュして、レビューして、マージして、リリースして。

やることが多いので、そこにRedmineの該当ドキュメントを探して（場合によってはファイルサーバから探して）更新とか入ってくると、やること多すぎで、だんだん病んでくるので、ソースの仕様はソースと一緒にReadmeを更新して、一緒にコミット、レビュー、マージした方が直感的だし、楽なんですよね。

## いい感じの開発フロー
ソース修正手順として、以下のような感じになります。
修正プロジェクトをclone
修正用にブランチ作成＆チェックアウト
Readme修正
テスト修正
ソース修正&Commit
Push
Pull requestと共に、[CI](https://ja.wikipedia.org/wiki/継続的インテグレーション)回す
Readmeの内容とソースの修正箇所が一致しているかとCIの結果からレビューする
マージ＆デプロイ

これだけの作業が見るとこ2箇所(リポジトリサービスとソース)で済むんですよ？
これって、とてもcoolじゃないですか？

## 他にもこんなメリット
また、メリットとして、ドキュメントの影響範囲を限定的にできるってのも魅力的と考えてます。
Redmineなどでプロジェクトやプログラムのドキュメントを網羅的に書くと、まぁ大体カオス化してきて、結局、階層構造でドキュメント書き始めるわけですが、そもそもReadmeなら、ディレクトリごとに書けるので、そのディレクトリ内の説明だけに限定して書けるわけですよ。
そうすると、自然と疎結合を意識してモジュールなんかも書き始めるわけですね。
これって素晴らしい。

実際に動くファイルや設定ファイルと同じ場所で管理できる上にバージョニングまでされちゃうし、ドキュメントレビューもリポジトリサービス上でできちゃう。

## まとめ
そのプログラムの説明はプログラム自体と一緒に管理したら見通しも良いし、保守も楽だからやったら良いんじゃないだろうかってお話でした。
rollup-plugin-pursでPureScriptのモジュールを結合する(インライン化、デッドコード排除)

現状のPureScriptでは、コンパイル後のモジュールを結合するのに

* browserifyやwebpackを使って通常のCommonjsモジュールとして結合する方法（でかい）
* psc-bundleを使って結合する方法（デッドコード削除が効くので、こっちのほうが断然結合後のファイルサイズが小さい。ただしかなり遅いし、PureScriptから出力されたCommonjsモジュールしか結合できないので、それ以外のCommonJSモジュールを結合するにはさらにwebpackなどをキメる必要がある）

の2種類があります。ここで、新たに[rollup](https://github.com/rollup/rollup)のプラグイン[rollup-plugin-purs](https://github.com/Pauan/rollup-plugin-purs)を使う方法が加わったようです。特徴としては、

* psc-bundleと同様のデッドコード排除が効きます
* さらにインライン化もある程度効くようで、結合後のファイルサイズのさらなる削減とともに、実行効率の向上も期待できます

となんだかとても良さげです。使い方はrollupをインストールして、

```
$ npm install -g rollup
```

rollup-plugin-pursをインストールして、

```
$ npm install --save-dev rollup-plugin-purs
```

なんかこんな感じに`rollup.config.js`を書いて、

```js:rollup.config.js
import purs from "rollup-plugin-purs";

export default {
  entry: "src/Main.purs",
  dest: "bundle.js",
  format: "iife",
  sourceMap: true,
  plugins: [
    purs()
  ]
};
```

rollupを実行するだけです。

```
$ rollup --config
```

たとえば、

```haskell:PureScript
sum x y = x + y

main = logShow (sum 20 22)
```

こんなかんじのコードをpsc-bundleで結合すると、

```js:JavaScript
  var sum = function (dictSemiring) {
      return function (x) {
          return function (y) {
              return Data_Semiring.add(dictSemiring)(x)(y);
          };
      };
  };
  var main = Control_Monad_Eff_Console.logShow(Data_Show.showInt)(sum(Data_Semiring.semiringInt)(20)(22));
```

こんな感じのコードがそのまま結合されるのですが、rollup-plugin-pursで結合した場合は、

```js:JavaScript
  var _main = _logShow_uncurried(_showInt, ((_semiringInt.add)(20)(22)));
```

だけが吐かれて、`sum`の呼び出しがインライン化されて消滅してるのが確認できました。また、`_logShow_uncurried`という関数が見えますが、これは関数`_logShow`のカリー化を解除したバージョンで、次のような関数がrollup-plugin-pursによって自動的に定義されます。

```js:JavaScript
  var _logShow_uncurried = function (_dictShow, _a) {
    return _log2((_dictShow.show)(_a));
  };
```

そして、引数がすべて与えられた場合はカリー化が解除されたバージョンが使われるようになるようです。PureScriptは関数がデフォルトでカリー化されるので関数呼び出しが多くなり効率上のオーバーヘッドが大きいのですが、これで少しはオーバーヘッドが低減できそうです。ただし、私が試した範囲ではエラーが出て結合できないモジュールもありました。なんかシングルクォーテーションがついた名前の関数がお気に召さないようです。まだ実用的な完成度とまでは言えませんが、メリットが多いので今後に期待したいところです。

まだ議論の最中のようですが、pscも将来的にはES6モジュールを吐くようになるかもしれません。また、ブラウザ環境などでもES6 modulesが使えるようになれば、psc-bundleのようなツールで結合する必要自体がなくなるかもしれません。つーかES6 Modulesはやくしろよ！今どきモジュールがない言語なんてアホくさくて使ってられんわ！



# 参考

* https://github.com/Pauan/rollup-plugin-purs/issues/6 一部のコードでエラーが起こるのは、acornの既知の問題っぽいです。すでに修正されているので、rollupがバージョンアップされれば直るかも
* https://github.com/purescript/purescript/issues/2574#issuecomment-277434874 
* https://github.com/Pauan/rollup-plugin-purs
JavaScript 選択ソート

##選択ソート(単純選択法)
「最小値を探して、先頭から順番に並べていく方法」
最小値を入れる位置を「選択」し、最小値と交換していくので「選択ソート」と言われる。

**手順**
前提 未整列のデータを配列に入れて用意する
1 最小値を見つけて、「最小値を入れる変数」に暫定的にいれる
2 「最小値の位置を入れる変数」も用意して暫定的にいれる
3 比較を繰り返して上記の変数を更新していく
4 繰り返しが終わったら先頭の値と最小値の値を交換する
5 残った部分にも同じように繰り返していく

```script.js
//ソート前の配列データ
var a = [1,3,10,2,8];

//「最小値を入れる位置」を先頭から順番に選択していくfor文
for(var i = 0; i<a.length-1;i++){
    //最小値を探すアルゴリズム
    //先頭の値を暫定の最小値として初期設定する
    var min = a[i];
    //先頭の位置を保存する
    var k = i;

    //隣の位置から最後まで、最小値との比較を繰り返す
    for(var j = i+ 1; j<a.length;j++){
        //比較して最小値を更新するif文
        if(min >a[j]){
            min = a[j];
            k = j;
        }
    }
    //交換するアルゴリズム
    //「先頭の値」と「最小値の値」を交換する
    var tmp = a[i];
    a[i] = a[k];
    a[k] =tmp;

    //ソートの値を表示
    console.log(a);
}

```
ATEN製品との相性問題をある程度回避する方法(コンソール編)

現場で遭遇したトラブルに対してATENのサポートに問い合わせして教えてもらった事をまとめます。
製品によって挙動が大きく異るため、機種に拠らない対策をまとめます。

#だいたいダメなキーボードやマウスメーカー
サンワやエレコム、バッファローとは大抵相性問題があるので、使わないのが本当の正解。

これらのメーカーで同じ型番でも、内部のICなどが変更してもこれらのメーカーは何も対策や告知をしていないのでトラブルの原因になることが多いです。どこのKVMメーカーも似たような感じですが。

で、ATENに相性問題について問い合わせた所、そもそも特定のキーボードやマウスについては動作保証はしておらず、購入前に評価機貸出サービスがあるのでそれを活用して下さいとのこと。これはPC業界あるある的な話で、確実に何の問題もなく使いたい、動作保証を求めるならHPならiLOや富士通なら自社のKVMを使えという感じでよくある系統のお話です。それらのベンダーは確実に使えるけど不便だったりします(使いたいのに限って対応していないのが多く、何で売ってるのか分からないものが多数・・・)
結果としてこういうのを使うほうがリスクは取るけど安く出来て、トータルではOKというところです。


#基本的な解決方法
DELL、HPのサーバーやデスクトップが納入された時に付属でついてくる有線のキーボードマウスを使う。
出来る限り特殊なキーがないプレーンなものでテンキー付きもの。
HPのキーボードだったら、PS/2ではKB-0316、USBではKU-0316、
マウスはMOFXU辺りが安全です。
DELLのキーボードならSK-8115(ロジクールのOEM?)もかなり鉄板です。
この辺りはちょっと古いシステムで運営しているユーザーさんのサーバールームとかならよく転がっている奴なので備品として隠しておくのがおすすめです。勝手に誰かに持っていかれないようにするまでが対策です。

また、余談ですが104USキーボードだとトラブルの回避が更にし易い。
緊急時の保険として無ければとにかく探せ、というぐらい鉄板のデバイスです。

>元々ATENがコンピューターのシェアなどから世界的に使われてるものでテストするため、そういう標準キーボードとして売られているものを使うことを勧められました。


#無線キーボードやマウスを使う場合の流れ

1. ロジクールやマイクロソフトの特殊なキーの付いていないものを使う。
2. USB発信機は別々に接続する
2. ホットキーでマウスエミュレーションをOFFにする 
3. ホットキーでターゲットのOSをSPCモードにする


1については、ハードウェア的な問題の解決です。ベンダー標準品のものでも相性問題は出る時は出ます。むしろ高機能系のキーボードとかだとHPやDELLのほうが酷いです。

2は、Amazonなどのレビューでありますがunifying系のデバイスを使う時のコツで、別々にすると使えることが多いです。よくセットで1つの発信機しか付いていないモデルが販売されていますが、あの系統はほぼ無理です。サポートの問い合わせをしたところ、そもそもKVM本体のキーボードの専用ポートにUSBではなく、キーボードやマウスのアイコンを描かれているのは、USB準拠ではなく、キーボードやマウスの信号のみをやりとりするために、準拠から外れてしまうことから起因するとのこと。なので、大人しくバラバラで買うほうが良いでしょう。

3については、マウスが縦方向や横方向にしか動かない場合の対策です。この方法を使うとマウスの切り替え機能は使えなくなることと、切替時に若干認識に時間が掛かるという問題がありますが、PCから直接デバイスを認識できるため、setpointなどが使えます。

4はキーボード側の問題で、反応しない場合などの対策です。通常、macモードやsunなどと繋げる、ということで紹介されていますが、F1キーを押すことでこのモードに入れるモデルがあります。(戻す時はF2かF10でPCまたはwinに戻る)仕組み的にはどんなキーボードでも104キーボードに変換するという挙動をしているようですが、詳細は不明です。


#それでもだめな場合

1. USBポート付きのKVMに交換し、キーボードでの切り替えは諦めてボタンで切り替えをする
2. ユーザー経由で開発依頼をする

基本、普通の現場だと切り替えが無理でも本体のボタンが押せるような状況なら1で大体解決します。
むしろ、個人的なシステム提案をする時はUSBポート付きのKVMPと呼ばれているものを使えばある程度のトラブルでも落とし所が用意できるので、これを出来る限り使うようにしています。
2については、システム他キーボードやその他ハードウェアまで要件に組み込まれていたユーザーさんが特殊キーボードを使わざるを得ないということで、専用のファームウェア開発をATENに依頼したケースもありました。
サーバーログイン時に便利なメッセージを表示する

みんなでいじりまわしてる Raspberry Pi が研究室にある。
今回はその Raspberry Pi にログインしたときに「こんな情報が表示しといたら便利かも」と思ったものを紹介する。


# まず成果物

<img width="596" alt="1__pi_raspberrypi_____zsh_.png" src="https://qiita-image-store.s3.amazonaws.com/0/40717/6dc2b561-f9c5-6cd8-00ae-86bde7afb27d.png">

# コード

```bash:print_login.sh
echo "
　　　＿＿　　　　　　∧ ∧＿__
　　／・・＼　　 　／(*ﾟーﾟ)　／＼
　 ｜　　　｜ 　／|￣∪∪￣|＼／
　　＼＿_／/　　 　|　 しぃ 　 |／
　　　人| /　 　 　 ￣￣￣￣
　　　　|｜ /|　　　 Ａ_Ａ　__
　　　　ヽ二ノ　⊂・ ・　⊃▼⌒丶
              　（ω＿_） ）　　●|～*
              　　　 U U. ～- 'U

                 _                 _
 _ __ ___   __ _(_)_ __ ___   __ _(_)
| '_ \` _ \ / _\` | | '_ \` _ \ / _\` | |
| | | | | | (_| | | | | | | | (_| | |
|_| |_| |_|\__,_|_|_| |_| |_|\__,_|_|
"

echo "Last Login User"
last |head -n5

echo ""
echo Currently $(w -h | wc -l) User Logged in
w -h

echo ""
echo "Machine Used"
df -h /dev/root

echo ""
echo "Command History"
tail .bash_history -n5
```

↑ `chmod +x print_login.sh` しておく

```bash:.bashrc
sh ./print_login.sh
```

# 解説

## AA(アスキーアート)
figlet コマンドで作成した。
https://github.com/cmatsuoka/figlet

## ログインユーザ履歴

``` last |head -n5 ```
-n5: 上位5つ


## 現在のログインユーザ

``` w -h ```
-h ヘッダーなし

## ストレージ使用容量

``` df -h /dev/root ```
-h: 対象

## 直近コマンド履歴

``` tail .bash_history -n5 ```
-n: 表示数

`history -5` コマンドは .bashrc 内で呼べなかった。(ログイン中だから？)




# その他

## /etc/motd
静的な文字列を表示したい！ってだけであれば、
`/etc/motd` に表示したい内容を書くだけで良い。

## .hushlogin
ユーザディレクトリに `.hushlogin` を置くとログイン情報を非表示にできる。


# おわりに
他にもおすすめのものがあれば教えていただきたいです。

# 参考
Thanks!
http://qiita.com/ryosukes/items/5ca24a808ba9c9c272f6
http://qiita.com/suin/items/bc3fe53b3630a40e045b