OmniAICreator/Qiita-1.07M huggingface dataset:
ESLintサンプル


自分の作ってる[Node.jsの練習用Webアプリケーション](https://github.com/hachi-eiji/79school-2)をES6に対応させようとしているのでついでにESLintを入れてみた。

[Rule](http://eslint.org/docs/rules/)を見ると1つ1つ見るのは疲れるので、airbnbをベースにしていくつか自分のスタイルに合わないところをrulesに加えた。

```.eslint
{
  // see https://github.com/airbnb/javascript/tree/master/packages/eslint-config-airbnb
  "extends": "airbnb/base",
  "env": {
    "browser": true,
    "node": true,
    "mocha": true,
    "es6": true,
  },
  "rules": {
    "strict": 0,                      // use strictは許可 http://eslint.org/docs/rules/strict
    "func-names": 0,                  // 無名関数は許可 http://eslint.org/docs/rules/func-names
    "space-before-function-paren":0,  // functionの前にスペースは許可 http://eslint.org/docs/rules/space-before-function-paren
    "id-length": [2, {"min":2, "properties": "never", "exceptions": ["_", "e", "i", "j", "k", "x", "y", "z"]}], // http://eslint.org/docs/rules/id-length
    "indent":[2, 2, {"SwitchCase": 1}], // http://eslint.org/docs/rules/indent
    "callback-return":2 ,             // http://eslint.org/docs/rules/callback-return
    "handle-callback-err":2,          // http://eslint.org/docs/rules/handle-callback-err
    "no-param-reassign":0,            // http://eslint.org/docs/rules/no-param-reassign
    "no-cond-assign": [2, "except-parens"], // http://eslint.org/docs/rules/no-cond-assign
    "arrow-parens": [2, "always"],          // http://eslint.org/docs/rules/arrow-parens
  }
}
```
多段 SSH 先に対し scp, git, rsync (, emacs) を使う

# 前提

`local`, `remote1.com`, `remote2.com` があるとする。`remote2.com` は `remote1.com` からのみログインできる。経路の SSH は全て公開鍵認証を行う。


# SSH config で済む場合

SSH config `~/.ssh/config` に書けるならそれが一番楽。経路の認証に使う鍵が接続元である `local` に全て存在している場合はこれでよい。

```:~/.ssh/config
Host remote2
  HostName remote2.com
  User remote2user
  IdentityFile /path/remote2key
  ProxyCommand ssh -l remote1user -i /path/remote1key remote1.com -W %h:%p
```

これで

```
local:~$ ssh remote2

local:~$ scp src remote2:/path/dest

local:~$ rsync src remote2:/path/dest
```
で済み、emacs (tramp) もこれを読むので `C-x C-f ssh:remote2` で接続できる。


# config に書けない場合、ヘルパースクリプトを用意

表題のコマンド群は、バックエンドの SSH コマンドでどれを使うかを指定できる。

つまり、config で対応できないケース、例えば 3段目に使う鍵を接続元に持ってこれないとか、途中で `sudo ssh` をしたいとか、そういう場合であるが、ssh をラップしたスクリプトを ssh コマンドの代わりに使うことができる。

## 想定環境
`remote2.com` に接続するには `remote1.com` 上で `sudo -u user2 ssh` しなければならない。`remote1.com` 上の鍵は `local` に持ってきてはいけない。

## 用意するスクリプト

```bash:ssh_helper
ssh -t -l remote1user -i /path/remote1key remote1.com "sudo -u user2 ssh $@"
```
`chmod +x /path/ssh_helper` で実行可能にしておく。

通常の ssh ログインができるか確認。

```
local:~$ /path/ssh_helper remote2.com
```

で `user2` として `remote2.com` に入れればOK。

## scp の場合
`-S` オプションで接続に使うプログラムを指定できる。

```
local:~$ scp -S /path/ssh_helper srcfile remote2.com:/destpath/file
```

## git の場合
`GIT_SSH` 環境変数で接続に使うプログラムを指定できる。

```
local:~$ GIT_SSH=/path/ssh_helper git clone user2@remote2.com:/repos/repo.git
```

## rsync の場合
`-e` オプションで接続に使うプログラムを指定できる。

```
local:~$ rsync -e '/path/ssh_helper' ./srcdir remote2.com:/dest/dir
```

# emacs の場合
ヘルパースクリプトは使えない。先ほどと同等のことを `|` でつなげて実現できる。sudo が絡むとちょっとややこしい。

```
C-x C-f /ssh:remote1.com|sudo:user2@remote1.com|ssh:remote2.com:/path/to/file
```

`remote1.com` に ssh し、`remote1.com` 上の `user2` として、`remote2.com` に ssh してファイルを開く、という流れ。

# ssh config の補足

`ProxyCommand` 内に書くホストも config 内で定義してしまうことでより簡潔に書くことができる。3段、4段と増えてくる場合はワンライナーではキツイのでそれぞれのホストを `Host` で定義するのがよい。
ssh がデフォルトで読む `~/.ssh/config` に書いているなら特に難しいことはないが、そうでない別の場所の config を `-F` で読み込んでいる場合は、最初の ssh で読んだ config がずっと使われるわけではないことに注意。`ProxyCommand` 内の ssh はあくまで別のコマンド実行である。

```bash:/path/myconf
Host remote2
  HostName remote2.com
  User remote2user
  IdentityFile /path/remote2key
  ProxyCommand ssh -F /path/myconf remote1 -W %h:%p
  # ProxyCommand 内の ssh でも config ファイルを明示すればよい

Host remote1
  HostName remote1.com
  User remote1user
  IdentityFile /path/remote1key  
```
SSH用のユーザー追加手順と注意点のまとめ


さくらVPSに接続するためのユーザーを新しく追加しようとしたら、いろいろ躓いたので、ここに一通りの手順をまとめておきます。

## ユーザーの追加

サーバー側の作業です。接続するユーザーを追加します。ここでは仮に「tattn」という名前で進めます。追加したいユーザーの名前に読み替えて下さい。

```bash:zsh
useradd tattn
passwd tattn
```

sudoを使いたい場合は`/etc/sudoers`を編集します。

```bash:zsh
sudo visudo
```

他のユーザーの設定を参考に以下を追加します。

```vi:vi
tattn    ALL=(ALL)       ALL
```

## 鍵の作成

クライアント側の作業です。接続するための秘密鍵/公開鍵を作成します。
なお、接続するユーザーのホームディレクトリは「$HOME」と表記します。

```zsh
cd $HOME
mkdir -p .ssh
ssh-keygen -t rsa
```

## 公開鍵の登録

公開鍵`id_rsa.pub`をサーバーの`/home/tattn/.ssh/`に`authorized_keys`という名前で置きます。
scpで送る場合は下を実行します。
なお、サーバーのIPアドレスは「$SERVER」と表記します

```bash:zsh
scp $HOME/.ssh/id_rsa.pub tattn@$SERVER:/home/tattn/.ssh/authorized_keys
```

サーバー側の作業です。権限を変更します。正しい権限でない場合

```bash:zsh
Permission denied (publickey,gssapi-keyex,gssapi-with-mic)
```
というエラーが出ます。

```bash:zsh
cd /home/tattn
chmod 700 .ssh
chmod 600 .ssh/authorized_keys
```

また、サーバーの作業をSSHで行っている場合は、所有権が異なるユーザーになっていることがあるので、変更します。見落としがちなところです。

所有権を確認します。

```bash:zsh
ls -la /home/tattn
drwx------  2 tattn   tattn   4096 Sep 27 00:00 .ssh

ls -la /home/tattn/.ssh
drwx------  2 tattn   tattn   423 Sep 27 00:00 authorized_keys
```

上記のように tattn tattn が並んでいれば問題ありません。異なるユーザーになっていた場合は、下を実行します。

```bash:zsh
chown tattn:tattn .ssh
chown tattn:tattn .ssh/authorized_keys
```

## SSHの設定

サーバー側の作業です。SSHの設定ファイルの確認or変更を行います。

```bash:zsh
sudo vi /etc/ssh/sshd_config
```

以下のように設定されているかを確認します。コメントアウトされていれば外します。

```bash:vi
RSAAuthentication   yes
PubkeyAuthentication   yes
AuthorizedKeysFile   .ssh/authorized_keys
```

また、`AllowUsers`が設定されていれば、「tattn」を追加します。

```bash:vi
AllowUsers yamada sato tattn
```

設定ファイルを変更した場合は、念の為にデーモンを再起動します。

```bash:zsh
sudo /etc/init.d/sshd restart
```


## 接続

以上で設定は完了したので、最後に接続できるかを確認します。

```bash:zsh
ssh -i $HOME/.ssh/id_rsa tattn@$SERVER
```
sayコマンドでPepperに任意の英語を喋らせる

PepperはSSHしてからsayコマンドで任意の英語を喋らせられる。

```
$ say hello
# "hello"って言う
```

疑問符も使える。

```
$ say hello?
# 語尾が上がる
```

ただし日本語はダメみたい。

```
$ say おはよう
# なにも言わない。
```



## 注意

sayコマンドを使うと**Pepperの言語設定が自動的に英語に切り替わる。**

電源ボタンをおした時のIPアドレス通知とかも全て英語になってしまうので注意

## 毎回出るメッセージ

```
pepper [0] / $ say aaa
[I] 7551 qimessaging.session: Session listener created on tcp://0.0.0.0:0
[W] 7559 qi.path.sdklayout: No Application was created, trying to deduce paths
[I] 7551 qimessaging.transportserver: TransportServer will listen on: tcp://127.0.0.1:41155
[I] 7551 qimessaging.transportserver: TransportServer will listen on: tcp://198.18.0.1:41155
[I] 7551 qimessaging.transportserver: TransportServer will listen on: tcp://192.168.6.90:41155
```

まだよく意味を理解していないので、今後きっちり理解していく。
unity > n個目のtabを改行に変換する

```txt:実装
Unity 5.1.3-f1 on MacOS X 10.8.5
```

indata.txtのファイルに対して、指定の番目(下記例では5)のタブ文字を改行文字に変換する。

![Main_unity_-_150927-tabToNewline_-_PC__Mac___Linux_Standalone__Personal_.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/db323d3c-af82-8ed8-e852-b76baadb1102.jpeg)

[v0.1 @ github](https://github.com/yasokada/unity-150927-tabToNewline/releases/tag/v0.1)


##使用手順
1. indata.txtにタブ区切り文字を含む内容を用意する
2. ソフトを起動してnthの部分に何番目のタブを改行にするか指定する
3. Buttonを押すと改行に変換された内容がoutdata.txtに保存される

###v0.1の留意点
複数行にはv0.1では未対応です。

## v0.2 (複数行対応)

[v0.2 @ github](https://github.com/yasokada/unity-150927-tabToNewline/releases/tag/v0.2)
QlikViewのロードスクリプトでレイアウトが変わるクロステーブルを読み込む

# やりたいこと
![可変長テスト.png](https://qiita-image-store.s3.amazonaws.com/0/94255/044c2f7a-a432-2ba0-dc24-566284bcfaa2.png)
この手のクロステーブル（ピボットテーブル）の形が変化すると、QlikViewでは通常はロードスクリプトを書き直す必要が出てしまいます。
これを、都度ロードスクリプトを書き直すことなく、柔軟にクロステーブルとして読み込む方法を説明します。
このサンプルは、それぞれ
D:\QlikView\可変長テスト2015Q1.csv
D:\QlikView\可変長テスト2015Q2.csv
という名称で配置されているものとします。(SJISのcsvとして)

# 結論
今後、可変長テストyyyyqq.csvのようなファイルが蓄積していくと仮定して、次のようなロードスクリプトを書くと、解決します。

```sql:loadscript.ls
FOR Each File in filelist ('D:\QlikView\可変長テスト*.csv')

	一時テーブル:
	CrossTable(項目名, いらないデータ, 2)
	LOAD *
	FROM
	[$(File)]
	(txt, codepage is 932, embedded labels, delimiter is ',', msq)
	where RowNo() < 1;
		
	データの入るテーブル:
	CrossTable(仮の項目名, 金額, 2)
	LOAD *
	FROM
	[$(File)]
	(txt, codepage is 932, no labels, delimiter is ',', msq, header is 1 lines);

	Left Join
	LOAD 項目名 as 商品名,
	     '@' & (RowNo()+2) as 仮の項目名
	Resident 一時テーブル;
	
	DROP Table 一時テーブル;
	
NEXT File

RENAME Field @1 to 年月;
DROP Field @2;
```

実行してみると、次のような形式でデータをが取り込まれてしまいます。やったね。
![result.png](https://qiita-image-store.s3.amazonaws.com/0/94255/a12f6960-9ed9-a1c4-00e7-63a9ceb4be65.png)

# 種明かし
ループで処理するようになっていますが、このループ処理はさておき、ループの中身について説明します。

まず、CSVファイルの一行目を項目名として「一時テーブル」に読み込みます。
![exp1.png](https://qiita-image-store.s3.amazonaws.com/0/94255/480a5498-ba88-c60e-4620-f3d96dc947fe.png)
ここで、*を使用しているのがポイントです。項目を指定してしまうと、固定的な読み込みしかできません。また、このとき「embedded labels」で行ラベルを指定していることにも注意します。

続いて、普通のクロステーブルで読み込みます。今度は、Where句の条件が無いのですが、「no labels」としています。
ここでno labelsにしているのは、CSVがNULLのヘッダを持つ場合への対策です。
このサンプルデータの場合は、NULLのヘッダが無い為もうちょっと簡単に取り込めるのですが、NULLのヘッダが存在している場合には、embedded labelsだとエラーになってしまうため、敢えてno labelsとしているのです。
CSVの場合、各項目は@1,@2,...という形式で読み込まれます。

最後に、はじめに読み込んでおいた項目名を、Resident Loadして結合します。
このとき、@3,@4,...などと結合させるために、'@' & (RowNo()+2)などという小細工をしています。
あとは、不要なテーブル・フィールドを削除したり、フィールドの名前を変えたりしておしまいです。

ループ処理は、複数のファイルを読み込むための措置です。
QlikViewには、ファイル名に * を指定して複数ファイルを同じレイアウトで読み込むという方法もありますが、今回の例では、これを使うとNGです。理由は、LOAD * の * で生成される項目が、最初に取り込もうとしたファイルに依存するから、です。試してみるとわかりますが、この例の場合では新商品4をうまく取り込めません。ちゃんちゃん。

# 発展形…複数の行ヘッダがある場合への対応も可能

これと類似の方法により、複数のヘッダ行を持つクロステーブル（例えば、QlikViewのピボットテーブルを出力して得られる、行ヘッダが複数存在するクロステーブル！）をうまく取り込むことも可能です。
「一時テーブル」一つだけを@3,@4,...と結合していますが、例えば行ヘッダが二つある場合には、同じような取り込み処理を一行目だけではなく二行目に対しても行い、同じように結合することで、構造を再現できるということです。

# まとめ
またひとつQlikViewの弱点が無くなりました。めでたしめでたし。
「自分で出力したCSVをうまく読み込めないのは小学生までだよねー」と思っていたあなたへの朗報でした。
Spring Boot Actuatorを使ってRedisのメトリクスを収集する


[前回](http://qiita.com/yoshidan/items/a6515d37784c6779efc5)は、spring-boot-actuatorを利用することでヘルスチェックを方法を書いた。
spring-boot-actuatorを利用することでSpring Bootのメトリクスを収集することもできる。

## メトリクスの取得方法

spring-boot-actuatorを依存関係に追加して以下のURLを叩くだけ。

curl localhost:8080/metrics

```
{"mem":755200,
 "mem.free":231637,
 "processors":4,
 "instance.uptime":3389,
 "uptime":15520,
 "systemload.average":3.64990234375,
 "heap.committed":755200,
 "heap.init":262144,
 "heap.used":523562,
 "heap":3728384,
 "threads.peak":27,
 "threads.daemon":25,
 "threads":27,"classes":10410,
 "classes.loaded":10410,
 "classes.unloaded":0,
 "gc.ps_scavenge.count":12,
 "gc.ps_scavenge.time":295,
 "gc.ps_marksweep.count":2,
 "gc.ps_marksweep.time":202,
 "httpsessions.max":-1,
 "httpsessions.active":0,
 "datasource.primary.active":0,
 "datasource.primary.usage":0.0}
```

指定したメトリクスだけを収集したい場合にはurlに収集対象のメトリクスを含める。
curl localhost:8080/metrics/datasource.*
これでデータソースのアクティブコネクション数と利用率のみが取得できる。

```
{"datasource.primary.active":0,
 "datasource.primary.usage":0.0}
```

余談だが、metricsに限らずspring-boot-actuatorに関する様々な設定はmanagementプロパティで設定できる。
以下はコンテキストパスをmonitorにした例。

```
management:
    context-path: /monitor
```

この場合
・/monitor/healthでヘルスチェック実施
・/monitor/metricsでメトリクス収集
となる。


## メトリクス収集対象の追加

RedisやElasticsearchとの接続に関するメトリクスなど、デフォルトでは対応していないメトリクスを追加することもできる。
やり方は簡単でorg.springframework.boot.actuate.endpoint.PublicMetricsを実装したクラスをSpringのBeanとしてするだけである。

```
@Component
public class SamplePublicMetrics implements PublicMetrics {
    @Override
    public Collection<Metric<?>> metrics() {
		// Metricクラスを含んだ
		return Arrays.asList(new Metric<>("sample.name",1);
    }
}
```

curl localhost:8080/metrics/sample.*

```
{"sample.name":1}
```

## Redisに対するメトリクスの収集

上記の方法でSpring Bootが接続している全てのRedisに対して以下の情報を取得する。

* 利用中のコネクション数
* アイドル状態のコネクション数
* 利用率(利用中のコネクション数 / 最大コネクション数)

仕事で必要になったので先にライブラリ化してみた。

https://github.com/nysd/spring-boot-redis-metrics
WiringPi-Python を使って SPI 通信

「[Raspberry PiにA/DコンバータMCP3002をつなぐ](http://qiita.com/f_nishio/items/4b9723c4e622a51aaeb5)」でRaspberry Pi2にMCP3002 ADCを接続し、SPI経由でアナログセンサー値を読みだせるようにした。pythonからSPI通信を行うために py-spidev を使ったが、[WiringPi v2](http://wiringpi.com/) の [python wrapper](https://github.com/WiringPi/WiringPi-Python) を使ってもSPIの制御が可能なので、ここではWiringPi2 pythonを使ってSPI経由でアナログセンサーを読みだしてみる。

# 実験用回路

- Raspberry Pi2の SPI0.0 に MCP3002 をつなぎ、MCP3002 の channel 0 に圧力センサー FSR400 を接続する。
- GPIO 25 に LED をつなぐ。

![FSR_prototype2_ブレッドボード.png](https://qiita-image-store.s3.amazonaws.com/0/88598/21a23cdd-2afc-741f-d527-385d79cb2c10.png)

![FSR_prototype2_回路図.png](https://qiita-image-store.s3.amazonaws.com/0/88598/5c7a2314-5fd1-6abf-ff94-1edf93e468fd.png)

# WiringPi を使った SPI / GPIO 制御

MCP3002 から圧力センサーの値を読み出し、THRESHOLD 値を超える値が観測されたら LED を点滅させるプログラムを python で実装する。

## SPI Library を使って読みだす
MCP3002のデータシートにしたがって、0x68,0x00の2バイトを送信すると、CH0に接続したセンサー値2バイト（有効なのは下位10ビット）が返ってくる。0x68の代わりに0x78とすれば CH1 に接続したセンサー値が得られる。

```py3:read_adc_wp2.py
#!/usr/bin/env python3

import wiringpi2 as wp
import time

# SPI channel (0 or 1)
SPI_CH = 0

# SPI speed (hz)
SPI_SPEED = 1000000

# GPIO number
LED_PIN = 25

# threshold
THRESHOLD = 200

# setup
wp.wiringPiSPISetup (SPI_CH, SPI_SPEED)
wp.wiringPiSetupGpio()
wp.pinMode(LED_PIN, wp.GPIO.OUTPUT)

while True:
    buffer = 0x6800
    buffer = buffer.to_bytes(2,byteorder='big')
    wp.wiringPiSPIDataRW(SPI_CH, buffer)
    value = (buffer[0]*256+buffer[1]) & 0x3ff
    print (value)

    if value > THRESHOLD:
      wp.digitalWrite(LED_PIN, wp.GPIO.HIGH)
      time.sleep(0.2)
      wp.digitalWrite(LED_PIN, wp.GPIO.LOW)
      time.sleep(0.2)

    time.sleep(1)
```

## MCP3002 Extension を使う

WiringPi2 には MCP3002 の extension があるので、これを使えば、SPI通信を意識することなくアナログセンサーの値を読み出すことができる（PIN_BASE が CH0, PIN_BASE + 1 が CH1）。

```py3:read_mcp3002.py
#!/usr/bin/env python3
###
### read MCP3002 ADC analog value via RasPi SPI
###

import wiringpi2 as wp
import time

# SPI channle (0 or 1)
SPI_CH = 0

# pin base (above 64)
PIN_BASE=70

# GPIO number
LED_PIN = 25

# threshold
THRESHOLD = 200

# setup
wp.mcp3002Setup (PIN_BASE, SPI_CH)
wp.wiringPiSetupGpio()
wp.pinMode(LED_PIN, wp.GPIO.OUTPUT)

# if a sensor value is over THRESHOLD,
# flash led.
while True:
    value = wp.analogRead(PIN_BASE)
    print (value)

    if value > THRESHOLD:
      wp.digitalWrite(LED_PIN, wp.GPIO.HIGH)
      time.sleep(0.2)
      wp.digitalWrite(LED_PIN, wp.GPIO.LOW)
      time.sleep(0.2)

    time.sleep(1)
```

# 実行
[![実行の様子](http://img.youtube.com/vi/G_yEOAdAEmA/0.jpg)](http://www.youtube.com/watch?v=G_yEOAdAEmA)

# References
- [WiringPi](http://wiringpi.com/)
- [WiringPi-Python](https://github.com/WiringPi/WiringPi-Python)
- [read_adc_wp2.py gist](https://gist.github.com/fnishio/56401c57dd90d3597536#file-read_adc_wp2-py)
- [read_adc_mcp3002.py gist](https://gist.github.com/fnishio/56401c57dd90d3597536#file-read_mcp3002-py)
SSHの設定


この記事は[Web開発をするまで](http://qiita.com/FSMS/items/6db6178a564ef32926f6)の一部です

セキュリティの観点からrootユーザでのログインを禁止して、作業ユーザでのログインを可能にします。
ログインの方法はパスワードでの認証ではなく、鍵認証にします。

## 鍵の作成

公開鍵と秘密鍵を配置するディレクトリを作成する。
ローカル側で作成して公開鍵をサーバ側に配置するか
サーバ側で作成して、秘密鍵をローカルに持ってくる。

今回は後者の方法を記載

作業ユーザになって作業します。
出力先のディレクトリを作成し、自分だけが見れる権限設定をします。

```bash
su - hoge
mkdir ~/.ssh
chmod 700 ~/.ssh
ssh-keygen
```

これで鍵の配置先とパスフレーズを聞かれます。
配置先は何も入れずEnterキーでデフォルトになります。
パスフレーズは２回入力する必要があります。

正常に完了すると、~/.sshに鍵が作成されます。

```bash
cd ~/.ssh
ls -l
```

id_rsaという名前の秘密鍵と
id_rsa.pubという名前の公開鍵があるはずです。

秘密鍵はきちんと管理して、誰からもアクセスできない場所に保管しましょう。
イメージとしては秘密鍵が鍵で、公開鍵は鍵穴です。

次に公開鍵をセットします。

```bash
cd ~/.ssh
mv id_rsa.pub authorized_keys
```

次は、秘密鍵をローカルに運びます

macやlinuxを使ってる人はターミナルで以下を実施して下さい
ユーザー名やサーバのアドレスは適当な値に変更して下さい

```bash
scp hoge@192.168.1.50:.ssh/id_rsa ~/.ssh/server_secret_key
```

Windowsの場合は、WinSCP等をインストールして運ぶのが楽です。
Windowsでputtyの場合は秘密鍵をputty形式に変換する必要があります。
putty-genというツールがあるので、変換して下さい。

それぞれ、サーバにputtyやterminalでログインできるか確認して下さい。

terminalの場合は以下

```bash
ssh -i .ssh/server_secret_key hoge@192.168.1.50
```

puttyの場合は、変換後のppkファイルを利用して下さい


## rootユーザでのログインとpassword認証でのログインを許可しない

セキュリティの観点から機能を停止します。

```bash
sudo vi /etc/ssh/sshd_config
```

50行目付近のPermitRootLoginの設定の下に新規に追加する

```diff
#PermitRootLogin yes
+PermitRootLogin no
#StrictModes yes
```

最初の+は追加するという意味なので、設定ファイル自体には
PermitRootLogin no
だけを追記すればよいです。

次はパスワードによる認証を不許可にします。
80行目付近に追記します。

```diff
# To disable tunneled clear text passwords, change to no here!
#PasswordAuthentication yes
#PermitEmptyPasswords no
+PasswordAuthentication no
```

次に設定ファイルの内容が文法的に間違っていないかチェックします。
設定が間違った状態で再起動を実施するとログインできなくなる可能性があります。

```bash
sudo sshd -t
```

何もエラーメッセージが出力されなければ問題ありません。
サービスを再起動して設定を反映させます

```bash
sudo systemctl restart sshd.service
```

これで、rootユーザで直接ssh出来ない事と、パスワードでのログインが出来ない事を確認しましょう。
【Tobii EyeX】アイトラッキングって？

巷でひっそりと話題になりつつある「アイトラッキング：目線の追跡」。VRのビューワーでは[FOVE](http://www.getfove.com/jp/)が先駆けて搭載しています。そんなアイトラッキングをお手軽に試せるデバイス「[Tobii EyeX](http://www.tobii.com/ja-JP/eyex/)」を手に入れたのでコツコツ記事にしていこうかと思います。

# アイトラッキングで何ができるのか？
よく言われるのは、目線でUIを操作するということろでしょうか。目線の先にあるボタンを見つめ続けるとクリックしたことにするなどなど。ですが、アイトラッキングにはそれ以上に重要なことがあります。それは、ユーザーの感情をコンテンツに反映できるということです。人は嘘をつくときに微妙に目が動くといいます。そういった微妙な心の動きをコンテンツに反映することで、ユーザーの精神状況に合わせたストーリー展開が可能になってきます。人狼ゲームのようなコンテンツにはぴったりかもしれません。

# アイトラッキングデバイス Tobii EyeX
アイトラッキング業界No.1と言われるTobiiが開発。本社はスウェーデンで日本にもオフィスがありグローバル展開しているとのこと。
モニターに設置してユーザーごとに目線をキャリブレーションして使います。使用時は赤いライトが点灯しているの少々気になりますが、レスポンスも早く精度も高いです。
SDKもUnityやC/C++で用意されています(今後サポート環境が増えていく？？)。
値段も139ドルと悪くない値段です。

# Tobii EyeXで何ができるのか？
すみません。絶賛おさわり中なので全てはまだ把握できていません！Unity用のSDKをインポートして簡単にサンプル作ったりなどは10分くらいでサクッとできちゃいます。あと、環境構築時にインストールされるアプリが常駐しているので、実際に視線でネットサーフィンもできました(サポートしているソフトのみ対応？Chromeでは動作しました)。SDKでアイトラッキングのどんなイベントが取得できるのかちょっと調べてみます。

次回は環境構築から記事を書いていこうかと思います。
JDTを利用してビルドを行うAntビルドファイル


## 概要

とあるプロジェクトで、EclipseのJDTによるビルドと同じバイナリを生成するAntビルドファイルが必要になったので、javacタスクで指定したオプションをメモしておくもの。

## プロジェクトのオプション指定とJDT Core Batch Compilerのオプションの関係

EclipseのプロジェクトのプロパティーでJavaコンパイラーに関するオプションを指定できるが、JDT Core Batch Compilerのオプションとの関係は以下のとおり。

|Eclipseオプション|JDT Core Batch Compilerオプション|備考|
|---|---|---|
|生成されたクラス・ファイルに変数属性を追加<br>Add variable attributes to generated class files|-g:vars|
|生成されたクラス・ファイルに行番号属性を追加<br>Add line number attributes to generated class files|-g:lines|
|生成されたクラス・ファイルにソース・ファイル名を追加<br>Add source file name to generated class file|-g:source|
|未使用の(読み取られない)ローカル変数を保存<br>Preserve unused (never read) local variables|-preserveAllLocals|
|finallyブロックをインライン化<br>Inline finally blocks|-inlineJSR|Java1.5以上は暗黙的に適用|
|メソッド・パラメーターの情報を保管<br>Store information about method parameters|-parameters|Java8以上で使用可|

Antビルドファイルのjavacタスクにおいて、-gコマンドラインスイッチはdebuglevel属性に、後はcompilerarg要素に設定する。
以下はEclipseのデフォルト設定(表の上から4つを全て適用)のjavacタスクの例。

```xml:build.xml
<javac compiler="org.eclipse.jdt.core.JDTCompilerAdapter"
  classpathref="build.lib"
  srcdir="${src.dir}" destdir="${dest.dir}"
  source="1.7" target="1.7"
  includeAntRuntime="false"
  debug="true" debuglevel="lines,vars,source">
  <compilerarg line="-preserveAllLocals" />
</javac>
```


## (参考)JDT Core Batch Compilerで指定できるオプション

JDT Core Batch Compilerで指定できるオプションは、Help - Eclipse Platform
Java development user guide > Tasks > Compiling Java code > [Using the batch compiler](http://help.eclipse.org/mars/index.jsp?topic=%2Forg.eclipse.jdt.doc.user%2Ftasks%2Ftask-using_batch_compiler.htm)に詳細が書かれている。
Windows上でreact-nativeを使ってみる


※記事執筆時点でアプリの実行まで達成
　記事中のライブラリ側コード修正はPR出てるようなので修正は不要になるはず。

# 前提
react-nativeが現時点（2015/09/26）で公式にアプリを開発する環境としてサポートしているのはMacだけ。開発できるアプリの種類はiOSとAndroid。

今回はGithubのIssueでWindowsへの対応が進んでいるとのやり取りを見つけて、「masterをチェックアウトしてインストールしたら動いた」との話が見えたので実際に試した結果を書いていく。

# 実際にやってみる

## 事前に必要な物、自分の環境でのバージョン
* Windows 7 64bit
* git（git version 2.5.0.windows.1）
* node.js（v4.1.1）
* Android Studio
  以下をAndroid SDK Managerでインストールしておく
  * Android support repository
  * Android support library
* Microsoft Visual Studio C++ 2012 for Windows Desktop

## インストール

```shell-session
git clone https://github.com/facebook/react-native.git
cd react-native/react-native-cli
npm -g install
```

npm経由だとうまくインストールできなかった。現状npmに上がってるソースだとWindows対応のための修正はまだ反映されていない？　自分の環境だとwarningが出たがインストール自体は通る模様。

## アプリを生成して実行

```shell-session
react-native init InitTestInWindows
cd InitTestInWindows
react-native run-android
```

## PC側でサーバを起動する

コード修正の参考: https://gist.github.com/mqli/e1e6576e9838d885a43a

どうも上のコマンドで本来はPC側にサーバが起動されてアプリはそれを参照して動く事でJSの反映が迅速に行える…という設計らしいがWindowsでは正しく動かない模様。

まず、後記するコマンドでのエラーを回避するため、アプリのディレクトリ内でnode_modules/react-native/local-cli/run-packager.js を以下のコードで置き換え。

```js
'use strict';

var path = require('path');
var child_process = require('child_process');

module.exports = function(newWindow) {
  if (newWindow) {
    child_process.spawnSync('open', [
      path.resolve(__dirname, '..', 'packager', 'launchPackager.command')
    ]);
  } else {
    child_process.spawn('node', [
        path.resolve(__dirname, '..', 'packager', 'packager.js'),
        '--projectRoots',
        process.cwd(),
      ], {stdio: 'inherit'});
  }
};
```

node_modules/react-native/packager/react-packager/src/DependencyResolver/index.js の defineModuleCode メソッドを以下の内容に修正

```js
function defineModuleCode({moduleName, code, deps}) {
  deps = deps.replace(/\\\\/g,'\\');
  return [
    `__d(`,
    `'${moduleName}',`,
    `${deps},`,
    'function(global, require, module, exports) {',
    `  ${code}`,
    '\n});',
  ].join('');
}
```

以下のコマンドでアプリ側がJSを取れるようにする。

```shell-session 
adb reverse tcp:8081 tcp:8081
react-native start 
```

```shell-session
# コード修正無しだとこのエラーだった
    module.js:338
        throw err;
        ^
```

正常に動作するとこんな感じ

https://twitter.com/goldbook/status/649221924736729089/photo/1

# ハマりポイント

```shell-session
> failed to find Build Tools revision 23.0.1
```

Android Studioをインストールしただけで一度も起動していないとこのエラーが出る。初回起動時にこのBuild Toolが自動でダウンロードされるので一度起動していると問題なく通る模様。

## MSBUILD : error MSB3428: Visual C++ コンポーネント "VCBuild.exe" を読み込めませんでした。

参考: http://blue-goheimochi.hatenablog.com/entry/2015/02/27/%E3%80%90%E8%A7%A3%E6%B1%BA%E6%B8%88%E3%80%91Windows7%E3%81%A7npm_install%E5%AE%9F%E8%A1%8C%E6%99%82%E3%81%AB%E3%82%A8%E3%83%A9%E3%83%BC
参考2: https://github.com/nodejs/node-gyp#installation

64bit環境だと発生する模様。Visual Studioをインストールするのが一番簡単な解決策らしい。32bit環境だと発生しない。
fastlane で Instruments Usage Error:  Ambiguous device name/identifier 'iPhone 6 Plus (9.0)':

fastlaneに挑戦したら
`Instruments Usage Error:  Ambiguous device name/identifier 'iPhone 6 Plus (9.0)':`
というエラーがでてiPhone6、6plusのsnapshotが取れない。
その解決方法。多分これで解決できる人とそうでない人がいると思う。

# 原因
そもそも、このエラーの原因はinstrumentsがシュミレータを１つに絞れないから。
直接、ターミナルで以下のようにinstrumentsコマンドを打つとまさにこのエラーメッセージがでる。

```bash
$ instruments -w 'iPhone 6 (9.0)'
2015-09-27 16:38:06.341 instruments[16483:1693339] WebKit Threading Violation - initial use of WebKit from a secondary thread.
Instruments Usage Error : Ambiguous device name/identifier 'iPhone 6 (9.0)':
iPhone 6 (9.0) [7C010A91-2FD6-4B39-BEE0-6A7E79190324]
iPhone 6 (9.0) + Apple Watch - 38mm (2.0) [B0EDA4F8-A762-4E50-8C21-8AC1B14B30F0]
```

自分の環境でどの種類のエミュレータがあるか確認するには以下のコマンドをターミナルで実行する。

```bash
$ instruments -w ''
2015-09-27 17:11:17.367 instruments[23454:2226858] WebKit Threading Violation - initial use of WebKit from a secondary thread.
Instruments Usage Error : Unknown device specified: ""
Known Devices:
MacBook-Pro [...]
iPad 2 (9.0) [CF21BD2F-F0D7-42D0-BFA5-73969F98EFCA]
iPad Air (9.0) [F417D847-068B-4C96-845C-00311EA1A3AA]
iPad Air 2 (9.0) [E037658D-4F92-41F5-8F67-7A9D69D557D4]
iPad Retina (9.0) [74F2E6D0-7584-45FF-8A28-117001B107B6]
iPhone 4s (9.0) [9D7DF270-8437-4A6C-A756-358FE028F40F]
iPhone 5 (9.0) [6C76F8EA-14D4-4A1A-8DB5-7486C9F7F373]
iPhone 5s (9.0) [E8614173-5D4F-4C58-84A1-B98E8BA45484]
iPhone 6 (9.0) [7C010A91-2FD6-4B39-BEE0-6A7E79190324]
iPhone 6 (9.0) + Apple Watch - 38mm (2.0) [B0EDA4F8-A762-4E50-8C21-8AC1B14B30F0]
iPhone 6 Plus (9.0) [ACE68990-8C44-4A4C-9437-5605364F998A]
iPhone 6 Plus (9.0) + Apple Watch - 42mm (2.0) [E7BE6448-E8F3-4792-8386-0C1BAD729364]
iPhone 6s (9.0) [3137E670-C3E8-4BE6-84C7-8FA31F04EAD5]
iPhone 6s Plus (9.0) [873C6BFC-81A3-42B0-B4E4-27FA2C46440F]
```

これを見るとiPhone 6 (9.0)とiPhone 6 Plus (9.0)で Apple Watchが追加されている設定があるのでこれがあるとダメな様子。

この問題はfastlaneのissueにも上がっているようですがまだ未解決らしい。
https://github.com/KrauseFx/snapshot/issues/198

# 解決方法

iPhone6s, 6s Plusを指定する。

先ほどの確認コマンドの出力をよく見ると、自分の環境の場合はApple Watchが追加されている設定は6, 6　plusだけなので、6s, 6s plusを指定すれば１つの環境に絞れるのでinstrumentsがエラーを返さなかった。
JSON-RPC.NET を使う

JSON-RPC.NET(https://github.com/Astn/JSON-RPC.NET) を使います。


# インストール
VS2013を起動しNu-Get パッケージマネージャー コンソールを起動し、以下のコマンドを入力します

```
PM> Install-Package AustinHarris.JsonRpc
```

# サンプル
今回はコンソールからJsonコードを渡してその結果を標準出力するタイプのものを作成。
それ以外のコードは https://github.com/Astn/JSON-RPC.NET/wiki にあるので、そちら参照。

```csharp
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using AustinHarris.JsonRpc;

namespace ConsoleApplication13
{
    public class ExampleCalculatorService : JsonRpcService
    {
        // JSON RPC で公開したいメソッドの先頭に[JsonRpcMethod]をつける
        [JsonRpcMethod]
        private int incr(int i) { return i + 1; }
    }

    class Program
    {
        static object[] services;

        static void Main(string[] args)
        {
            // JsonRpcMethod が追加されているクラスのインスタンスを作成することで
            // 公開されるようになる。
            services = new object[] { new ExampleCalculatorService() };

            var rpcResultHandler = new AsyncCallback(_ => Console.WriteLine(((JsonRpcStateAsync)_).Result));

            // コンソールからJsonコードを待ち受ける。空行で終了。
            for (string line = Console.ReadLine(); !string.IsNullOrEmpty(line); line = Console.ReadLine())
            {
                var async = new JsonRpcStateAsync(rpcResultHandler, null);
                async.JsonRpc = line;
                JsonRpcProcessor.Process(async);
            }
        }
    }
}
```

# 使い方
上記コードをビルドして起動した後、以下のコードを入力```
{'method':'incr', 'params':[5], 'id':1}
```

結果は以下のように出力される```
{"jsonrpc":"2.0","result":6,"id":1}
```

エラーならこう```
{"jsonrpc":"2.0","error":{"code":-32601,"message":"Method not found","data":"The method does not exist / is not available."},"id":1}
```

# まとめ
上記コードではrpcResultHandler で受信したデータを標準出力に表示していますが、Jsonパーサー等を使用して変換して内部処理に使えるようにすると応用範囲が広くなるかもしれませんね。
Fast Algorithms for Mining Association Rulesを読んだ

# Fast Algorithms for Mining Association Rulesを読んだ
## どんなもの？
レコメンドで有名なアプリオリアルゴリズムを提案した論文
頻度の下限を設定することで効率よく頻出アイテム集合を計算できる
この結果をもとに支持度や確信度を効率的に計算できる

## 先行研究と比べると？
必要な頻度を満たしているアイテム集合を見つける手法を改善している

## 技術や手法のキモはどこ？
小さな部分集合からだんだん大きくしながら頻度を満たしているかチェックして
満たしていないと言える集合は枝刈りしていく。

## 実装した
https://github.com/takushi-m/Apriori
sudo


この記事は[Web開発をするまで](http://qiita.com/FSMS/items/6db6178a564ef32926f6)の一部です


別のユーザの権限でコマンドを実行する為のコマンドで
主に管理者権限(root)でコマンドを実行する為に使う

```bash
sudo ls
```

これで管理者権限でlsコマンドを実行した事になる。

ただし、誰でも実行できるわけではないので、設定ファイルに記述する必要がある
設定ファイルは/etc/sudoersというファイルですが、重要なファイルのために
特別に編集するコマンドが用意されています。
rootユーザになってから編集します。

```bash
su -
visudo
```

ファイルの最後から13行目付近に
\#%wheel  ALL=(ALL)       ALL
という記載があるので、最初の#を削除します。

```diff
-#%wheel  ALL=(ALL)       ALL
+%wheel  ALL=(ALL)       ALL
```

具体的にはviというテキストエディタでファイルが開かれている状態になっているので、
「j」または「↓」キーで移動して、該当の箇所にカーソルを合わせて「x」で削除。
その後、「:wq」で保存して下さい。

これで、wheelグループに所属するユーザは全てのユーザになり変わってコマンドを実行できるようになりました。

記述の内容としては
誰が どのサーバで　誰の権限で　何を実行可能か。
という事になります。

%を頭につけた場合はグループを指します。
サーバについては、同じ設定ファイルを使い回す時に、切り分けできるようにです。
実行可能なコマンドの指定は絶対パスで記述する必要があります。
コマンドを複数指定する場合はカンマで区切ります。

%hige fuga=(hoge) /usr/bin/ls -l
上記の例の場合は、fugaというサーバでhigeグループに属しているユーザはhogeユーザになり変わって
ls -lというコマンドを実行する事ができます。


先程、wheelグループに追加しているユーザに権限を追加したので、
次に、実際に普段利用しているユーザを、wheelグループに追加します。

```bash
usermod -G wheel hoge
```

これでhogeユーザがwheelグループへ追加されました。

```bash
id hoge
```

これで追加されている事を確認します。

こうして、各ユーザにsudoで実行できるコマンドを指定する事で
各ユーザが出来る事を制限する事が出来ます。
一部のコマンドを実行する事を可能にする為に、rootのパスワードを公開するような事は不要になります。

sudoを実施する際に自分のパスワードを聞かれますので、
作業ユーザにパスワードを設定しておきます。

```bash
passwd hoge
```

このコマンド実行後、パスワードを２回入力すると、それが作業ユーザのパスワードになります。
インストール時等に設定していなかった場合は設定しておきます。
練習がてら自宅のMacにssh接続してみる

#準備
ssh接続を許可するためには、接続したいMacの設定を変更する必要があります。  
｢システムと環境設定｣⇒｢共有｣を開き、リモートログインにチェックを入れます。![scsh1.png](https://qiita-image-store.s3.amazonaws.com/0/83976/68553d7d-5cf6-6b69-f07f-7d51f3f6f333.png "scsh1.png")
チェックを入れると、このようにログイン方法が表示されます。
#SSHログイン
Mac/Linuxからログインする場合は、｢ターミナル｣を開いて以下のコマンドを入力。

```
$ssh ユーザー名@IPアドレス
The authenticity of host '192.168.***.*** (192.168.***.***)' can't be established.
RSA key fingerprint is XX:XX:XX:XX:XX:XX:XX:XX:XX:XX.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.***.***' (RSA) to the list of known hosts.
Password: 
```
｢RSA key fingerprint｣は、なりすまし防止のための、SSHの指紋のようなものらしいです。あまりよくわからないですが｢Yes｣で大丈夫なようです。

```
Last login: Sun Sep 27 15:30:00 2015
$
```
ログインに成功すると上のように表示されます。
重複しない乱数配列(Java版／O(n)アルゴリズム）

* [重複しない乱数配列(Java版／ArrayList不使用版)](http://qiita.com/AinoMegumi/items/98e5d1a453d1a0587778)
* [重複しない乱数配列(Java版／ArrayList使用版)](http://qiita.com/AinoMegumi/items/d3db3cff4c57d2544201)
* [重複しない乱数配列(Java版/コレクション活用?版)](http://qiita.com/tsuyoshi_cho/items/2c10819b9f667e41dfe2)

ここまで O(n) のアルゴリズムのものが出ていないようですので、投稿します。
解説記事は気が向いたらそのうち書きます。⇒[書きました。](http://qiita.com/nmby/items/bb6d84ecd4020db181ef)

```java:
public static int[] makeRandomArray1(Random rand, int size, int randMin, int randMax) {
    
    // パラメータチェック
    // （略）
    
    // 本処理
    int[] randArray = new int[size];
    Map<Integer, Integer> conversion = new HashMap<>();
    
    for (int i = 0, upper = randMax - randMin + 1; i < size; i++, upper--) {
        int key = rand.nextInt(upper);
        int val = conversion.getOrDefault(key, key);
        
        randArray[i] = val + randMin;
        
        conversion.put(key, conversion.getOrDefault(upper - 1, upper - 1));
        conversion.remove(upper - 1); // この行はメモリ節約のためのもの。無くても動く。
    }
    
    return randArray;
}
```

ポイントは「本処理」の部分が計算量 O(size) のアルゴリズムであることです。
size が大きくなっても衝突による性能劣化は生じません。
また、randMin～randMax の範囲が大きくなっても性能劣化は生じません。（randMin～randMax の広さによる影響を受けません。）

最近のパソコンは性能が良いので力づくでやっちゃえば良いじゃん、という意見もあるかもしれません。性能のことを考えずコーディングの手間だけを考えるのであれば、今や次のコードが一番簡単ですね。[^1]

```java:
public static int[] makeRandomArray2(Random rand, int size, int randMin, int randMax) {
    // makeRandomArray1 と同じパラメータチェックを実施（記載略）

    return rand.ints(randMin, randMax + 1).distinct().limit(size).toArray();
}
```

---
[^1]: みなさん、たとえば後輩がこのコードを持ってきたらレビューで弾きますか？ 測定はしていませんが、きっと1万件くらいまでなら実用時間で通るんだろうなぁ、と。ソースコードの見た目がとてもスマートなだけに悩ましいところだなあと感じました。私なら、アルゴリズム上の問題を理解しているか本人に確認し、理解したうえで敢えて採用しているのであれば通しちゃうかなぁ...
underscore.jsを使って配列を複数の条件でフィルタリング

一覧を複数のタグでフィルタリングしたかったので、
underscore.jsを使ってやってみました。


```lang:javascript

var list = [　//　色々な女の子のリスト
	{
		name: "A子",
		tag: ["大きい","豊満","セクシー"]
	},
	{
		name: "B実",
		tag: ["小さい","ノリがいい","かわいい","頭いい"]
	},
	{
		name: "C里香",
		tag: ["スレンダー","美人","金持ち"]
	},
	{
		name: "D由紀",
		tag: ["セクシー","ノリがいい","頭いい"]
	}
];

var check = ["ノリがいい","頭いい"]; //　頭が良くて、ノリがいい子でフィルタリングしたい

var arr = [];　//　フィルタリングした女子のオブジェクトが格納される配列

_.each(list,function(girl,i){	 // each は配列のすべてをループする
	var jadge;
	if(check.length > 0){
		jadge = _.every(check, function(checkChild){ // every は配列のすべてが条件を許可したらtrue
				return _.find(girl.tag, function(tag){ // findは 配列が一つでも条件を満たせば、true、そこで処理をやめる
					return tag === checkChild;
				});
			});
	}else{
		jadge = false;
	}
	if(jadge){
		arr.push(girl); // jadgeがtrueのものだけを配列に格納していく
	}
});

console.log(arr); // [Object, Object] (B実とD由紀のオブジェクトが入っている)



```

これをvue.jsと絡めれば、結構簡単にできました。underscoreは本当に便利なので、小技をちょこちょこ載せていこうかなと。
もっと効率がいい方法があれば教えてください！
POH6+ 「え、妻が松江？」回文作成 最短121バイト

[六村リオ](http://qiita.com/rana_kualu/items/cbd237a865125b4cd9bf) / [霧島京子](http://qiita.com/rana_kualu/items/e6467151c88d69670fbb) / [緑川つばめ](http://qiita.com/rana_kualu/items/535144055c73f5694153) / [島根ルミ](http://qiita.com/rana_kualu/items/cc79813f9555e01330a2) / [島根ルミ149](http://qiita.com/items/0e9b48b4361ee567c7e6/) / [島根ルミ121](http://qiita.com/items/9de54445c2ed7c444d99/) / [共通解](http://qiita.com/items/04721cdd925166156aab/)


[前回](http://qiita.com/rana_kualu/items/0e9b48b4361ee567c7e6)149バイトまで縮めることに成功しましたが、どうもまだ縮められるような気がしてならない。

```php
// 前回の149バイト
<?php for($f=split(B^H,`dd`);$r=strrev($v=$f[++$i]);)${$v.$c=$v!=$r?$v<$r?:!$v=$r:$x.=$v}?$p[]=$v:${$v.!$c}++;sort($p);echo$y=join($p),$x,strrev($y);
```

この圧倒的にややこしい三重三項演算子をこれ以上どうすればいいのか。
って待てよ、よく考えてみたら中央以外は重複ないんだから、
`$v<$r`かつ`in_array($r,$f)`だけ抜き出す、という単純な考え方で行けるのでは…？

```php
// 142バイト いけた
<?php for($f=split(B^H,`dd`);$r=strrev($v=$f[++$i]);){$v>$r&&in_array($r,$f)&&$p[]=$r;$v==$r?$x.=$v:1;}sort($p);echo$y=join($p),$x,strrev($y);

// 141バイト for内部を1文に
<?php for($f=split(B^H,`dd`);$r=strrev($v=$f[++$i]);){$v>=$r?$v!=$r?:$x.=$v:in_array($r,$f)&&$p[]=$v;}sort($p);echo$y=join($p),$x,strrev($y);

// 138バイト 三項演算子を整理
<?php for($f=split(B^H,`dd`);$r=strrev($v=$f[++$i]);)$v!=$r?$v>$r?:in_array($r,$f)&&$p[]=$v:$x.=$v;sort($p);echo$y=join($p),$x,strrev($y);

// 132バイト 先にソートしておけばjoinいらなくね？
<?php for($f=split(B^H,`dd`),$i+=sort($f);$r=strrev($v=$f[++$i]);)$v!=$r?$v>$r?:in_array($r,$f)&&$p.=$v:$x.=$v;echo$p,$x,strrev($p);

// 124バイト bashのsort使った方が短い
<?php for($f=split(B^H,`dd|sort`);$r=strrev($v=$f[++$i]);)$v!=$r?$v>$r?:in_array($r,$f)&&$p.=$v:$x.=$v;echo$p,$x,strrev($p);

// 121バイト sortもデフォルトが標準入力/標準出力なのでddいらない
<?php for($f=split(B^H,`sort`);$r=strrev($v=$f[++$i]);)$v!=$r?$v>$r?:in_array($r,$f)&&$p.=$v:$x.=$v;echo$p,$x,strrev($p);
```

結果。
https://paiza.jp/poh/joshibato/matsue-ruby/result/30aebdae

展開。

```php
<?php
	for(
		$f=split(B^H,`sort`);
		$r=strrev($v=$f[++$i]);
	)
		$v!=$r
			 ? $v>$r
			 	 ?: in_array($r,$f) && $p.=$v
			 : $x.=$v ;
	
	echo$p,$x,strrev($p);
```

149バイトよりずっと短く、かつかなり簡単という結果になりました。
in_arrayとかもう少しすぱっとしたやり方にできそうな気がしないでもないんだが…？
Apache/mod_ssl　https設定メモ

# 概要
* Apacheとmod_sslをつかって、httpsを使えるようにする

# 環境
* OS：CentSO /Redhat 6.x
* httpd/mod_ssl：2.2.x

# 手順
## Apacheとmod_sslをインストール
<pre>
# yum install -y httpd mod_ssl
# chkconfig httpd on
</pre>

### ブラウザアクセスし、Apacheの画面が表示されることを確認
http://hogehoge.com
![キャプチャ3.JPG](https://qiita-image-store.s3.amazonaws.com/0/60933/5cd35122-f586-7014-7eca-5c0a33dfd4ea.jpeg)

### 秘密鍵 (Private Key)、サーバ証明書(CRT)を配置する
- 秘密鍵 (Private Key):server.key
- サーバ証明書(CRT):server.crt

<pre>
# ls /etc/httpd/conf/ssl.key/
server.key
# ls /etc/httpd/conf/ssl.crt/
server.crt
</pre>

### ssl.confを編集する
* 秘密鍵、サーバ証明書のファイル名、配置場所を修正する

````bash:/etc/httpd/conf.d/ssl.conf
# SSLCertificateFileを実際の配置場所にあわせる
SSLCertificateFile /etc/httpd/conf/ssl.crt/server.crt

# SSLCertificateKeyFileを実際の配置場所にあわせる
SSLCertificateKeyFile /etc/httpd/conf/ssl.key/server.key
```

### rewrite.confを編集する
* httpリクエストが来た際、httpsリクエストへリダイレクトさせる

````bash:/etc/httpd/conf.d/rewrite.conf
<ifModule mod_rewrite.c>
      RewriteEngine On
      RewriteCond %{HTTPS} off
      RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
</ifModule>
```

### Apache再起動
<pre>
# service httpd restart
Stopping httpd:                                            [  OK  ]
Starting httpd:                                            [  OK  ]
</pre>

### ブラウザアクセスし、https通信でApacheの画面が表示されることを確認
![無題4.jpg](https://qiita-image-store.s3.amazonaws.com/0/60933/449b9d17-14b0-f452-92de-06285e3b8731.jpeg)
Scalaっぽく書けるTypeScriptのライブラリ

Scalaっぽく書けるライブラリ作ってみました。

[Scalike](https://github.com/ryoppy/scalike-typescript)です。

- Optional (Optionは予約語なのでOptionalに)
- Either
- Try
- Future

## インストール

```
$ npm install scalike
```

型ファイル

```
$ tsd install scalike
```

## Optional

Optionalは、値があるかどうかを表すクラスです。SomeかNoneになります。

```ts:foo.ts
///<reference path='./typings/scalike/scalike.d.ts'/>
import {Optional, Some, None} from 'scalike';

Optional(1) // Some(1)
Optional(null) // None
Optional(undefined) // None
```

こんな感じで実行。(出力したいならconsole.logで)

```
$ tsc foo.ts --module commonjs && node foo.js
```

Scalaのメソッドが一通り使えます。

```ts:Optional
Optional(1).getOrElse(0) // 1
Optional(null).getOrElse(0) // 0

Optional(1).map(x => x + 1).getOrElse(0) // 2
Optional(null).orElse(Optional(1)).getOrElse(0) // 1
Optional(1).exists(x => x === 1) // true
```

for式がないので、便利っぽいメソッドを追加しています。

apply1/apply2

```ts:Optional/apply1
Optional(1).apply1(Optional(2), (a, b) => a + b) // Some(3);
Optional(1).apply1(None, (a, b) => a + b) // None;
```

途中でNoneになったらそれ以降はNoneなので処理されません。

もっと繋げたいときはchain。(scalazのApplicativeBuilder参考させていただきました)

```ts:Optional/chain
Optional(1)
  .chain(Optional(2))
  .chain(Optional(3))
  .run((a, b, c) => a + b + c) // Some(6)
```

詳しくは[テストを見て](https://github.com/ryoppy/scalike-typescript/blob/master/test/OptionalSpec.ts)ください。

## Either

EitherはAとB2つの型を取って、どっちか表すクラスです。
LeftがAでRightがBです。Rightが正解と右を掛けていて右に正しい?値を入れるのが通例です。

バリデーションの結果でよく使われたりします。

```ts:Either
///<reference path='./node_modules/scalike/dist/scalike.d.ts'/>
import {Either, Right, Left} from 'scalike';

function validate(x: number): Either<string, number> {
  return x !== 1 ? Left<string, number>('this is not 1') : Right<string, number>(x)
}
validate(1).right().getOrElse(0) // 1
validate(2).left().getOrElse("err") // "this is not 1"
```

詳しくは[テストを見て](https://github.com/ryoppy/scalike-typescript/blob/master/test/EitherSpec.ts)ください。


## Try

Tryは例外を包んでくれるクラスです。
成功すればSuccessになり、例外が起きるとFailureとなります。

```ts:Try
import {Try, Success, Failure} from 'scalike';

Try(() => 1) // Success(1)
Try(() => eval("1 +")) // Failure(SyntaxError)

Try(() => 1).getOrElse(0) // 1
Try(() => 1).map(x => x + 1).getOrElse(0) // 2
Try(() => eval("1 +")).getOrElse(0) // 0
```

詳しくは[テストを見て](https://github.com/ryoppy/scalike-typescript/blob/master/test/TrySpec.ts)ください。

## Future

処理が終わったか分からない状態を表せるもの。

ES6のPromiseをラップして作っています。

Promiseか、関数を渡すことができます。

```ts:Future
import {Future} from 'scalike';

function getGithub(): Promise<Response> {
  return fetch('https://github.com/');
}

Future(getGithub())
  .map(response => response.status)
  .foreach(status => console.log(status));
```

ES6のPromiseより多機能ですし、何よりscalaから来た人は同じ感じで使えて嬉しいですね。

## まとめ

TypeScriptってパターンマッチないとか高階型使えないとか色々制約あって辛みがありますね..。
でもJSで型安全なのは嬉しい限りです。∩( 'ヮ' 三 'ヮ' )∩
PDP-11(エミュ）で動作するコマンドプロンプトみたいなもの

PDP-11（エミュ）上で動作するコマンドプロンプトのひな形みたいなプログラムを書いてみた。
打った文字をそのまま表示するだけものだが、Input/Outputの基本となるものだ。

## ソースコード
```cmdline.c
#define KL11_TTY_REG_ADDRESS 0177560;
#define TXRDY (1<<7)
#define NRETRY 5000

static volatile struct kl11_tty {
  int in_csr;
  int in_dbr;
  int out_csr;
  int out_dbr;
} *pkl11 = (struct kl11_tty*)KL11_TTY_REG_ADDRESS;

void bzero(char *, int);
void putchar(const int);
void puts(const char*);
int getchar(void);
int getline(char *);

int cstart()
{
  char buf[256];

  bzero(buf, sizeof(buf));
  do {
      puts("> ");
      if(getline(buf)>0) {
          puts("\r\n");
          puts(buf);
          bzero(buf, sizeof(buf));
      }
      puts("\r\n");
  } while(1);
}
void putchar(const int c)
{
    while(!(pkl11->out_csr & TXRDY))
        ;
    pkl11->out_dbr = c;
}
void puts(const char *s)
{
  while(*s)
    putchar(*s++);
}
int getchar()
{
  while(!(pkl11->in_csr & TXRDY))
      ;
  return pkl11->in_dbr;
}
int getline(char *buf)
{
    char c;
    int nc = 0;

    while((c=getchar()) != '\r') {
        putchar(c);
        *buf++ = c;
        nc++;
    }
    return nc;
}
void bzero(char *buf, int len)
{
    while(len--)
        *buf++ = 0;
}
```
```start.S
	.global start
	.global _cstart

	STACK = 0x1000

	.text
start:
	mov     $STACK, sp
	jsr     pc, _cstart
	halt

	.end
```
```ld.script
ENTRY(start)
SECTIONS
{
	. = 01000;
	.text : {
		*(.text)
		*(.rodata)
		. = ALIGN(0100);
	}
	.data : {
		*(.data)
		. = ALIGN(0100);
	}
	.bss : {
		*(.bss)
		. = ALIGN(0100);
	}
	end = .;
}
```
```mf:Makefile
CC = pdp11-aout-gcc
AS = pdp11-aout-as

CFLAGS = -ffreestanding

all: $(TARGET).lda

run: rc-pdp11
	pdp11 $<

rc-pdp11: $(TARGET).lda
	@echo "l " $< > rc-pdp11

$(TARGET).lda: $(TARGET).out
	bin2load -a -f $< -o $@

$(TARGET).out: $(OBJS) ld.script
	pdp11-aout-ld -T ld.script $(OBJS) -o $@

.c.o:
	$(CC) $(CFLAGS) -c $< -o $@

.c.s:
	$(CC) -S $< -o $@

.S.o:
	$(AS) $< -o $@

clean:
	rm -f *.lda
	rm -f *.out
	rm -f *.o
	rm -f rc-pdp11
```

## ビルド方法
ファイルを入れたディレクトリにて、

    $ make

と打つ。

## 実行方法

    $make run
    pdp11 rc-pdp11

    PDP-11 simulator V3.9-0
    sim> g
    > feqfeqko
    feqfeqko
    > ffqq
    ffqq
    >

make runと打つとrc-pdp11という設定ファイルを読み込んでpdp11を実行する。
起動した後に、’g’と打つことで、PDP-11エミュ上にロードされた本プログラムが実行される。

このプログラムでは'>'を表示して入力待ちとし、
適当に文字を打ってエンターを押すと、打った文字列を次の行に表示する。

## 必要なツール環境
(1) PDP-11のgccクロス環境構築は以下記事を参照
http://qiita.com/hifistar/items/187fd7ad780c6aa26141

(2) bin2loadは以下から
[The Ancient Bits adventure: Writing PDP11 assembly code from Linux (and running it on bare -simulated- metal!)](http://ancientbits.blogspot.jp/2012/07/programming-barebones-pdp11.html)　

(3) simh
http://simh.trailing-edge.com/



以上。
【GAS】スクリプトからメール送信してみる


最近、キャリアメールからGメールにメインのアドレスを変更した。
アドレス変更のメールするのが面倒だったのでスクリプト化して、なるだけ自動化。
スクリプトについてあまりセンスがないです、すいません。。。。


## 1. GASでテキストメール送信

````スクリプト
//テキストでメール送信
function myFunction() {
  var sendToAddress ="宛先メールアドレス";//複数指定する場合はカンマ(,)で区切る
  var mailTitle = 'テスト送信';//メールのタイトルを設定
  var mailMessage = 'テスト送信です';//メールの本文を設定
  MailApp.sendEmail(sendToAddress,mailTitle,mailMessage);
}
````


## 2. GASでhtml形式メール送信

````スクリプト
function myFunction() {
　var sendToAddress =
      '宛先メールアドレス'//複数指定する場合はカンマ(,)で区切る
  var htmlbody = 
      '◯◯××です。<br>' +
	  'ご無沙汰しております。<br><br>' +
	  'アドレス変更しました。<br>' +
	  '変更をよろしくお願いします。<br><br>' +
	  '◆新メールアドレス<br>' +
	  'xxxxxxx@xxxx.com<br><br>' +
	  'よろしくお願いします。<br>';
 
  MailApp.sendEmail(
    sendToAddress,
    '【アドレス変更】',
    'アドレス変更しました。登録お願いします。',
    {htmlBody:htmlbody});
}
````
※htmlメールが表示できない端末では、

````
アドレス変更しました。登録お願いします。
````
が表示される。
ufwで簡単firewall(ブルートフォース対策)


某VPSでDebian8を動かしているがiptablesの設定が面倒くさい(勉強不足)ので
Ubuntuに標準で入っている```ufw（Uncomplicated FireWall)```をDebianに入れた。<br>
ちなみに、以前は```iptables-persistent```を使い普通に記述していた。


以前の設定はこんな感じ

```
# Allows HTTP and HTTPS connections from anywhere (the normal ports for websites)
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT

# Allows SSH connections
# The --dport number is the same as in /etc/ssh/sshd_config
-A INPUT -p tcp -m state --state NEW --dport 10022 -j ACCEPT
```

この程度ならば直接記述した方が早い。
でも、DoS回避のために試行回数制限(hashlimit)を使おうとすると面倒。<br>

```
# 1分間に3回アクセスor全体で6回アクセスしてきたipアドレスからの接続を60000ms(1m)拒否
$ iptables -A INPUT -p tcp -m state --syn --state NEW --dport 1022 
-m hashlimit --hashlimit-name limit_sshd --hashlimit 3/m --hashlimit-burst 6 
--hashlimit-mode srcip --hashlimit-htable-expire 60000 -j ACCEPT
```
「この程度理解できなければサーバ管理なんてできない」と思われる方もいますが、できれば面倒は避けたい。<br>
<br>
なのでufwを使う。

```
#30秒間に6回アクセスしてきた IP の接続を一定時間拒否する。
$sudo ufw limit 10022
$sudo ufw status
To                         Action      From
--                         ------      ----
10022                      LIMIT       Anywhere
10022                      LIMIT       Anywhere (v6)
```

はい、簡単にできました。(IPv6も自動的にやってくれてる。)<br>
これで「IPV6はとりあえず全部拒否しとけ」とかやらずに済みます。<br>
<br>
※何か間違いがあったら指摘お願いします。(特にiptablesのルール)

<hr>
<br>
<br>

ufw limit の回数制限が"30秒間に6回アクセス"の根拠(一定時間は不明)

[http://manpages.ubuntu.com/manpages/raring/man8/ufw.8.html:title]


> ufw will deny connections if an IP address has attempted to initiate 6 or more connections in the last 30seconds.

<br>
参考:iptablesの設定例<br>
[http://www.atmarkit.co.jp/ait/articles/1007/14/news102_2.html:title]

[http://qiita.com/homihomu/items/778770a1c1b3b2371fe0:title]
capistrano で localhost が対象のときに SSH しないようにする

# 背景

Capistrano は基本的に SSH で対象へ接続し作業するツールであると思う。

が、`current -> releases/xxxx` の仕組みとかタスクフローとか DSL とか、組み込みの機能をローカルでの作業に役立てたい[^1]こともたまーにある。

単純に SSH 対象を `localhost` として、例えば

```rb
server 'localhost', roles: %w{app}, user: 'me', key: 'mykey'
```

みたいに書けばリモート同様に使えるのでそれでも良いのだが、微妙に SSH 設定が煩わしい。キーペア配置の必要があるし。

[^1]: `run_locally` すればいいじゃん、ってことではなく `deploy` のような既存タスクを使いたいこともある、ということ

# 対策

`server 'localhost'` の時に SSH しないパッチを当てる gem を作った

https://github.com/komazarari/capistrano-locally


`gem 'capistrano-locally'` を入れて、
 `Capfile` で `require 'capistrano/locally'` すれば、

こんな感じ ↓ で SSH 設定をしなくてすむ

```rb
server 'localhost', roles: %w{app}
```


## それ必要？

正直なところ有用なケースは相当限られるので誰得ライブラリではあるが、
「繰り返し何かの作業をしたい」
「`keep_releases` の指定で古いのを勝手に掃除したい」
「Jenkins にするほどじゃない / Jenkins にできないわけがある」
「ssh 鍵は置けない」
ようなこまごまとした事情がある場合の、気軽に使える作業フレームワークとして。
tvOSのデバッグでTVJSのconsole.logを見る方法

# TVJS

tvOSではサーバ-クライアント構成になっているためにクライアント側をTVMLという独自言語とTVJSと呼ばれる独自JSで作成する。

TVJSはJavascriptベースのためもちろんlog出力にはconsole.logを使う。

しかし **Xcodeにはデバッグlogはでない。エラーlogのみ出る。**

普通のlogを見るには・・・

Safariのwebインスペクタだ
![スクリーンショット_2015-09-27_13_03_28.png](https://qiita-image-store.s3.amazonaws.com/0/31237/0deec937-ca4d-7b96-7246-08cd0cb533d3.png)

webViewのデバッグをしている人なら慣れているいつものアレです。
これは盲点だった・・・

ビルドの段階でソース読み込んでいるようで、クライアントを更新したらビルド毎しなおさなければいけない。めんどくさい・・・
Raspberry PiにA/DコンバータMCP3002をつなぐ

# RaspberryPiにA/D変換
なんと Raspberry PiにはA/D変換がない！（知らなかった、arduinoやbeagleboneにはあるのに…）ということで外付けのADCをSPIにぶら下げるまでの顛末。
作業は http://tightdev.net/SpiDev_Doc.pdf を参考に行う。

# SPI on Raspberry Pi
## MCP3002 - 10bit 2ch ADC
2CHのアナログ入力のある10bit SPI接続A/Dコンバータ。安い！(180円)。
2CHでは足りない人には8CHのMCP3008もあるけど、ブレッドボードの場所をとらないMCP3002で十分。

## SPI driver
RaspberryPi上のSPI driverを有効にする。公式の[SPIドキュメント](https://www.raspberrypi.org/documentation/hardware/raspberrypi/spi/README.md)にしたがってraspi-configを使うか、config.txtを書き換えてSPIを有効にする。

```console
$ sudo vi /boot/config.txt
```
```text:config.txt
# Uncomment some or all of these to enable the optional hardware interfaces
#dtparam=i2c_arm=on
#dtparam=i2s=on
dtparam=spi=on
```
```console
$ sudo reboot
...
$ lsmod
Module                  Size  Used by
...
spi_bcm2708             5121  0 
```

## py-spidev
spi deviceを操作するpython module。https://github.com/doceme/py-spidev からソースコードを取得してインストールしておく。

```console
$ git clone git://github.com/doceme/py-spidev
$ cd py-spidev
$ sudo python setup.py install
```

# SPI経由でADCの値を読む

## ADCテスト用回路
圧力センサーFSR400の抵抗値変化を読みだすテスト用回路。SPI0.0にMCP3002をつなぎ、MCP3002のchannel 0にセンサーを接続する。
![adc_test.png](https://qiita-image-store.s3.amazonaws.com/0/88598/cd32b7f7-cec5-10c2-9c91-25abec55a5c1.png)

## Python Code
spidevを使ってMCP3002のアナログ値を1秒毎に読み出すpythonコード。

```py:read_adc.py
#!/usr/bin/env python
# Read the analog sensor value via MCP3002.

import spidev
import time
import subprocess

# open SPI device 0.0
spi = spidev.SpiDev()
spi.open(0, 0)

try:
    while True:
        resp = spi.xfer2([0x68, 0x00])
        value = (resp[0] * 256 + resp[1]) & 0x3ff
        print value
        time.sleep(1)
except KeyboardInterrupt:
    spi.close()
```

実行中に圧力センサーを指で押すと値が増加する。

```console
$ python read_adc.py 
0
4
971
2
932
974
1
6
```

# References
- [SpiDev Documentation](http://tightdev.net/SpiDev_Doc.pdf)
- [MCP3002 data sheet](http://ww1.microchip.com/downloads/en/DeviceDoc/21294E.pdf)
AMQP.start



`Starts` EventMachine event loop unless it is already running and `connects`
to `AMQP broker` using `{AMQP.connect}`. 

It is generally `a good idea` to start EventMachine event loop in a separate thread and use {AMQP.connect} (for Web applications that do not use Thin or Goliath, it is the only option).

See {AMQP.connect} for information about arguments this method takes and
information about relevant topics such as authentication failure handling.

###example 
- Using AMQP.start to connect to AMQP broker, EventMachine loop isn't yet running

```
 AMQP.start do |connection|
   # default is to connect to localhost:5672, to root ("/") vhost as guest/guest
   # this block never exits unless either `AMQP.stop` or `EM.stop` is called.
   AMQP::Channel(connection) do |channel|
     channel.queue("", :auto_delete => true).bind(channel.fanout("amq.fanout")).subscribe do |headers, payload|
       # handle deliveries here
     end
   end
 end
```
### source code
```
  def self.start(connection_options_or_string = {}, other_options = {}, &block)
    EM.run do
      if !@connection || @connection.closed? || @connection.closing?
        @connection   = connect(connection_options_or_string, other_options, &block)
      end
      @channel      = Channel.new(@connection)
      @connection
    end
  end
```