OmniAICreator/Qiita-1.07M huggingface dataset:
CentOSからWindows共有フォルダを検索

CentOS7 上で pysmbc を利用して共有フォルダを検索した際のメモ

#準備

##依存するパッケージをインストール

```bash:
$ yum install -y libsmbclient libsmbclient-devel libffi-devel openldap-devel openssl-devel bzip2-devel zlib-devel python-devel
```

##Python3の環境を作る
pipをインストール。

```bash:
curl -kL https://raw.github.com/pypa/pip/master/contrib/get-pip.py | python
```
virtualenvをインストール。

```bash:
$ pip install virtualenv
```
pyzhonzをインストール。

```bash:
$ curl -kL https://raw.github.com/saghul/pythonz/master/pythonz-install | bash
```
Python3をインストール。

```bash:
$ pythonz install 3.5.1
```
virtualenvを作成。

```bash:
$ virtualenv -p $(pythonz locate 3.5.1) venv
```

#pysmbcをインストール
先程作成したvirtualenv環境にpysmbcをインストールする。

```bash:
$ source ./venv/bin/activate
$ pip install pysmbc
```

# 試してみる

getdents()で取得したリストには'.'と'..'が含まれているので除外する点だけ注意。

```py3:test.py
import smbc

settings = dict(
    servername = 'SERVERNAME',
    domain = 'DOMAIN',
    username = 'USERNAME',
    password = 'PASSWORD',
)

# 認証コールバックを準備
cb = lambda context, share, workgroup, username, password: (workgroup,
                                                            settings['domain']+'\\'+settings['username'],
                                                            settings['password'])

c = smbc.Context(auth_fn=cb)


def search(root_dir):
    print(root_dir)
    entries = c.opendir(root_dir).getdents()
    print(len(entries))
    for entry in entries:
        if entry.name in ('.', '..'): # '.'と'..'を除外
            pass
        elif entry.smbc_type in (smbc.DIR, smbc.FILE_SHARE):
            # 下位フォルダを探索
            try:
                uri = root_dir + '/' + entry.name
                search(uri)
            except:
                pass
        elif entry.smbc_type == smbc.FILE:
            print(e.name)

if __name__ == '__main__':
    search('smb://' + settings['servername'])
```
PostgreSQLで各DBが使用している容量を確認

PostgreSQLで各DBが使用しているディスク容量を調べる方法のメモ。

# SQLで確認する方法
DBにログインして以下のSQLを実行すると、DB一覧と使用容量が確認できる。

```
SELECT datname, pg_size_pretty(pg_database_size(datname)) FROM pg_database;
```
結果：
![11.jpg](https://qiita-image-store.s3.amazonaws.com/0/106019/ad3e24ad-7ad7-af57-f504-4d4bc67ae488.jpeg)

# 実データで確認する方法
DBサーバの実データからも確認ができる。
まず、PostgreSQLでは各DBに「oid」という識別子がある。
実データのディレクトリ名称はoidのため、先にどのDBがどのoidかを調べる必要がある。
DBにログインして以下のSQLを実行すると、DB一覧とoidが確認できる。

```
select datid,datname from pg_stat_database;
```
結果：
![12.jpg](https://qiita-image-store.s3.amazonaws.com/0/106019/9dcf099d-705b-26d4-cc07-affeed841ef3.jpeg)

datid が oid、datname が DB名である。

次にDBサーバでoidのディレクトリを探す必要がある。
多くの場合、PostgreSQLは以下のどちらかにインストールされる。

 /usr/local/pgsql/ 
 /var/lib/pgsql/ 

これらの配下に data というディレクトリがあり、そこにoidのディレクトリがあるため、
あとは各ディレクトリの使用容量をduコマンドで見れば良い。

```
# cd /usr/local/pgsql/data
# du -sh ./*
```
尚、クエリで確認した結果と実データで確認した結果を比較したところ、使用容量はほぼ一緒だった。
VMware Fusion 8上のOS XでAdobe Photoshopを使う

VMware Fusion 8でMountain Lionの仮想マシンを構築。
その仮想マシンにAdobe Illustrator 5.1、Photoshop 5.1をインストール。
インストール自体は順調に終了。

Illustratorは特に問題なく動作しました。

ところが、Photoshopは何か操作した後の画面が再描画されません。
解決方法は以下に。
[VMware Fusion 7.0 Professional リリース ノート](https://www.vmware.com/jp/support/support-resources/pubs/fusion_pubs/fusion-70-release-notes.html)

ターミナル.appで以下を打つ。
`sudo nvram boot-args='vmw_gfx_caps=0'`

無事、Photoshopが使い物になりました。
JSの紛らわしい記法たち

## !value
```javascript:
var value;

value = {};
console.log(!value);
// false

value = undefined;
console.log(!value);
// true

value = null;
console.log(!value);
// true

value = 0;
console.log(!value);
// true
```

## a || b
```javascript:
function out(a, b) {
  console.log(a || b);
}

out('aaa', 'bbb');
// aaa

out(undefined, 'bbb');
// bbb

out(null, 'bbb');
// bbb

out(null, null);
// null

out(0, 'bbb');
// bbb
```


## a && b
```javascript:
function out(a, b) {
  console.log(a && b);
}

out('aaa', 'bbb');
// bbb

out(undefined, 'bbb');
// undefined

out(null, 'bbb');
// null

out(null, null);
// null

out(0, 'bbb');
// 0
```
rails runner script.rb --help で rails runner に help を喰われない方法、もしくは rails runner を省略して script.rb を実行する方法

**やりたいこと**: `rails runner script.rb` で rails のコンテキストでスクリプトを実行することができるが、`rails runner script.rb --help` とすると、script.rb の help ではなく、rails runner の help が出てしまう。なんとかしたい。

bin/rails と https://github.com/rails/rails/blob/f8234313feab83c65912b2d96a6dd8e0149b8642/railties/lib/rails/commands/runner.rb を参考に以下のようになった。

lib/rails_runner.rb を用意

```rb
APP_PATH = File.expand_path('../../config/application', __FILE__) unless defined?(APP_PATH)
require_relative '../config/boot'

options = { environment: (ENV['RAILS_ENV'] || ENV['RACK_ENV'] || "development").dup }
ENV["RAILS_ENV"] = options[:environment]

require APP_PATH
Rails.application.require_environment!
Rails.application.load_runner
```

script/foo.rb から lib/rails_runner.rb を require (もしくは load)

```rb
#!/usr/bin/env ruby
require_relative '../lib/rails_runner'
require 'optparse'

opt = OptionParser.new

opt.on('-a VAL') {|v| p v }
opt.on('-b') {|v| p v }

opt.parse!(ARGV)
```

これで `script/foo.rb --help` のように実行できるようになった。

```
$ chmod a+x script/foo.rb
$ script/foo.rb -h
Usage: foo [options]
    -a VAL
    -b
```
c++ builder XE4, 10.2 Tokyo > フォルダ文字列に不正な文字が入っているかチェックする実装

```txt:動作環境
C++ Builder XE4
Rad Studio 10.2 Tokyo Update 2 (追記: 2017/12/27)
```

フォルダ名に不正な文字列が入っているかのチェックをしたい。

関連 http://qiita.com/7of9/items/9aa82ce970c2898da5d0

[Qiitaへのコメント](http://qiita.com/7of9/items/e03083db57cb5cb77ef8#comment-604cca0873324e16f56f)にてセパレータ文字列を１つのstring型で定義している例を参考にした。

```Unit1.cpp

static bool DirName_hasInvalidChar(String target, String invalids)
{
	String invld;
	for(int idx = 0; idx <= invalids.Length(); idx++) {
		invld = invalids.SubString(idx + 1, 1);
		if (target.Pos(invld) > 0) {
			return true;
		}
	}
    return false;

}

static void Test_DirName_hasInvalidChar()
{
	String invalids = ".\\/:*?\"<>|";

	bool ok1 = DirName_hasInvalidChar(L"XXX", invalids);
	bool ok2 = DirName_hasInvalidChar(L"314159265358979", invalids);
	bool ng1 = DirName_hasInvalidChar(L"...", invalids);
	bool ng2 = DirName_hasInvalidChar(L"A.B.C", invalids);
	bool ng3 = DirName_hasInvalidChar(L"A\\B", invalids);
	bool ng4 = DirName_hasInvalidChar(L"A/B", invalids);
	bool ng5 = DirName_hasInvalidChar(L"A:B", invalids);
	bool ng6 = DirName_hasInvalidChar(L"A*B", invalids);
	bool ng7 = DirName_hasInvalidChar(L"A?B", invalids);
	bool ng8 = DirName_hasInvalidChar(L"A\"B", invalids);
	bool ng9 = DirName_hasInvalidChar(L"A<B", invalids);
	bool ng10 = DirName_hasInvalidChar(L"A>B", invalids);
	bool ng11 = DirName_hasInvalidChar(L"A|B", invalids);

}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
	Test_DirName_hasInvalidChar();

}
```

関数名は今後リファクタを検討するが、とりあえず実装した。
Amazon EC2のGPUインスタンスにChainer v1.6を１行で入れる


**Chainer 1.7も1行で入ることを確認しました**

v1.5では3行も必要だったのが、1行になりました。
例のごとく、nVidia公式の "Amazon Linux AMI with NVIDIA GRID GPU Driver" を使います。起動して、ログインしたら、以下のコマンドを実行して下さい。

```
$ sudo CUDA_PATH=/opt/nvidia/cuda pip install chainer
```

numpyのビルドなども走るので、結構時間はかかります。気長に待ちましょう。
CUDAが正しくサポートできているかは、```import cupy```できるかで確認できます。

# 解説

nVidia公式のAMIでは、CUDAは /opt/nvidia/cuda にあります。これを環境変数 CUDA_PATH でインストール時に渡してあげると、インストールできます。本当はnvccコマンドの場所から逆算するのですが、 **sudoでインストールしようとするとPATH環境変数をクリア** してしまうのでこうしています。


# HDF5に対応する

HDF5のシリアライザはオプショナルになりました。あとから```h5py```をインストールすれば使えるようになります。

```
$ sudo yum-config-manager --enable epel
$ sudo yum install -y hdf5-devel
$ sudo pip install h5py
```

```h5py```のインストールが面倒だったため、今まで3行必要だったんですね。
Swiftでバケツソートのコマンドを作ってみた

Swiftでバケツソートをするコマンドを作ってみました。フィルタとして書きましたので、パイプで他のコマンドと繋げることができます。

# このように書いた

```swift:bucketsort.swift
// バケツソートに使う配列を用意する
// 今回は0から100の範囲の整数
var bucket = [Int](count: 101, repeatedValue: 0)

// 標準入力から読み出し、バケツソートする
while let line = readLine() {
	bucket[Int(line)!]++
}

// sortingが終わったら標準出力に書き出す
for i in 0...100 {
	if bucket[i] > 0 {
		for var j = 0; j < bucket[i]; j++ {
			print(i)	
		}
	}
}
```

ランダムに並んだ整数を標準入力から読み込み、バケツソートでソーティングし、標準出力に書き出しています。配列bucketの要素数を101としているので、読み込むデータの範囲が101個である場合専用のコマンドになっています。今回は0から100までの整数です。

コンパイルするには`swiftc`コマンドを使います。

```
$ swiftc bucketsort.swift 
```

すると`bucketsort*`というコマンドができています。実行権限は自動的に付与されています。

# 簡単に説明してみる

まず読み込むデータです。0から100までの範囲の整数が100個ランダムに並んでいます。そのままだと100個のデータが1列で長く表示されてしまうので、ここでは途中を省略しています。

```
$ cat data
23
77
55
3
35
（省略）
17
7
97
87
19
```

ターミナルで次のように打ち込みます。コマンドを置いているディレクトリにパスを通していないので、`./`も忘れずに書きます。

```
$ cat data | ./bucketsort
1
2
2
3
3
（省略）
97
97
98
98
99
```

ソーティングできてます。ここでも縦に長くなるのが嫌なので一部省略しています。

# 他のコマンドとパイプで繋げてみる

## headで最初の8行だけ表示させてみる
先頭8行だけ表示されています。

```
$ cat data | ./bucketsort | head -n 8
1
2
2
3
3
7
7
8
```

## wcで行数などを数えてみる
行数が100になっています。これはデータ数100と一致しています。

```
$ cat data | ./bucketsort | wc
     100     100     291
```

## awkで29から32の範囲のみ表示させてみる
29から32までの範囲の値が出力されています。

```
$ cat data | ./bucketsort | awk '{if($1>=29 && $1<=32)print}'
29
29
30
32
32
32
32
```

以上から、今回作ってみたコマンドを他のコマンドとパイプで繋げて利用できる事が分かりました。

# まとめ
ランダムに並んだ整数をバケツソートするコマンドを作ることができました。今回はデータの値が0から100の範囲であると分かっている場合のコマンドを作ってみました。フィルタとして作ってあるので、headなど他のコマンドと組み合わせることができます。

今後はバケツソートを応用して役に立つコマンドも作ってみたいと考えています。

# 参考書
矢沢久雄セレクション アルゴリズム&デザインパターン, 日経BPパソコンムック, p16-19
バケツソートの解説がされています。

# おまけ
以下に使用したデータと、ソーティングされたデータを全部示します。

```
$ cat data | cowsay
 ________________________________________ 
/ 23 77 55 3 35 34 9 44 62 21 90 95 41 2 \
| 61 2 55 87 96 66 63 12 88 17 81 10 87  |
| 19 32 29 62 56 7 17 59 41 50 68 85 13  |
| 89 75 8 30 77 68 33 32 55 28 98 18 40  |
| 86 35 21 97 22 41 29 51 3 85 58 20 44  |
| 99 70 12 84 83 1 59 90 32 36 58 64 68  |
| 14 93 67 32 33 53 67 54 50 89 95 79 40 |
\ 97 63 98 17 7 97 87 19                 /
 ---------------------------------------- 
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||
```
```
$ cat data | ./bucketsort | cowsay 
 ________________________________________ 
/ 1 2 2 3 3 7 7 8 9 10 12 12 13 14 17 17 \
| 17 18 19 19 20 21 21 22 23 28 29 29 30 |
| 32 32 32 32 33 33 34 35 35 36 40 40 41 |
| 41 41 44 44 50 50 51 53 54 55 55 55 56 |
| 58 58 59 59 61 62 62 63 63 64 66 67 67 |
| 68 68 68 70 75 77 77 79 81 83 84 85 85 |
| 86 87 87 87 88 89 89 90 90 93 95 95 96 |
\ 97 97 97 98 98 99                      /
 ---------------------------------------- 
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||
```
munin plugin設置スクリプト

* archlinux, centos5,6,7, ubuntu14.04,16.04, debian7で動作確認

## 参考

* [muninの3分間チューニング - Qiita](http://qiita.com/hirata-qwt/items/5fb08bdf08b7a504de5b)

## スクリプト

```bash:munin_plugin_link.sh
#!/bin/sh
set -eu
cd /etc/munin/plugins

#-----------------------
ORGDIR="/usr/share/munin/plugins"
# archlinux
if [ -e /usr/lib/munin/plugins ];then
    ORGDIR="/usr/lib/munin/plugins"
fi

# plugin削除。ただしsnmp監視している場合は消さない
mu_clear() {
  SNMPCOUNT=$(ls /etc/munin/plugins/snmp* 2>/dev/null | wc -l)
  if [ $SNMPCOUNT -eq 0 ];then 
      rm -f /etc/munin/plugins/*
  fi
}

# pluginのリンク貼り
mu_enable() {
 if [ -e $ORGDIR/$1 -a ! -e $1 ];then
   ln -s $ORGDIR/$1 $1
 fi
}

# pluginのリンク貼り(ネットワークデバイス)
mu_enable_interface() {
 for device in $(/sbin/ip a s | grep \/2[4-9] | awk '{print $NF}')
 do
   ln -s $ORGDIR/if_ if_${device}
 done
}

# リンク貼り 稼働しているサービスを見て判定
mu_enable_if() {
 PS_COUNT=$(ps -ef | grep $2 | grep -v grep | wc -l)
 if [ $PS_COUNT -ge 1 ];then
   ln -s $ORGDIR/$1 .
 fi
}

# munin-nodeリロード
mu_reload() {
  if [ ! -e /etc/init.d/munin-node ];then
    systemctl restart munin-node
  else
    /etc/init.d/munin-node restart
  fi
  ls --color
}
#-----------------------

mu_clear

mu_enable_interface

mu_enable cpu
mu_enable diskstats
mu_enable load
mu_enable users
mu_enable memory
mu_enable uptime

mu_enable_if postfix_mailqueue smtpd
mu_enable_if samba smbd

mu_reload
```

## 結果

![スクリーンショット_2016-01-20_08-07-01.png](https://qiita-image-store.s3.amazonaws.com/0/25728/f81d5084-c57d-e961-d952-511c0a2e498f.png)

```bash:munin処理時間のグラフを出す場合
ln -s /usr/share/munin/plugins/munin_stats .
```

負荷が7割程度に減ったのと、不要な監視対象が減って良くなった。

![スクリーンショット_2016-01-20_09-22-47.png](https://qiita-image-store.s3.amazonaws.com/0/25728/05c1d1f7-9189-4fa4-40d5-2ae5ff560457.png)
文字化けしたCSVファイルの解消方法

今回は、フリーのテキストエディタ「TeraPad」を使用して、
文字化けしたCSVファイルを解消する方法をご紹介させていただきます。

既に、TeraPadをインストール済みの方はインストール方法を飛ばしてください。

◇TeraPadのインストール方法


1.「窓の杜」( http://www.forest.impress.co.jp/ )へ移動する。

2.ソフト検索で、「Tera Pad」などと、検索する。

3.検索結果からダウンロードページに移動する。

4.「窓の杜からダウンロード」をクリックして、ダウンロードを行う。

5.ダウンロードしたファイルをインストールする。
　（特に、設定は変更しなくても大丈夫です。）
　※ショートカットをデスクトップに置くとあとあと便利に使用できます。
◇TeraPadを使用した方法

前提条件：フリーのテキストエディタの「TeraPad」をインストールされている

1.文字化けを解消したいCSVファイルをTeraPadにドラッグ&ドロップする。

2.TeraPadが起動するので、メニューのファイルから「文字/改行コード」をクリックする。

3.文字コードを「SHIFT-JIS」に変更し、OKをクリックする。

4.CSVファイルを開くと、文字化けが解消している。

◇余談（個人的な使用方法です。）


WEBサイトのアクセス解析ツールのGoogleAnalyticsを使用していると、
データをCSVファイルでエクスポートすることがあります。

しかし、
「そのCSVファイルは文字化けしていて困った！！」
ということが多々あります。

そのときに、TeraPadを使用するととても素早く文字化けが解消できるんです。

もし、このブログを見て文字化けを解消したよ！という方がいれば嬉しいですね。
技術英語 > What we hear as a blur of sound, the Pacific Wren hears [as a precise sequence of sounds]. / 交差点ゲーム


@ LOE > October 19, 2012
http://loe.org/shows/shows.html?programID=12-P13-00042
> What we hear as a blur of sound, the Pacific Wren hears <font color=red>as a precise sequence of sounds</font>. 

「正確な順序での音として」という意味が合うだろうか。

<hr>
このフレーズは一度忘却の彼方へ行ったが、ふとした時に記憶に戻ってきた。

（自称）交差点ゲームが有効だったと思われる。

### 余談 > (自称)交差点ゲームの方法

毎日10分程度、LOEを聞きながら歩いていく中、気になるフレーズを見つけたらそこからゲームの開始。

1. 最初の交差点まで、そのフレーズを繰返し反芻する
2. 次の交差点以降、交差点間ではあえてそのフレーズを忘れる
3. 交差点に来るたびに、フレーズを思い出そうとする (短期記憶から中期記憶への移行を促す)
4. 3の繰り返し
5. 数時間後、フレーズを思い出そうとする (中期記憶の強化)

3,4の時点で覚えていれば、5の時点で忘れていても、ちょっとしてから思い出せたりする。

1日1新しいフレーズを覚える。調子がいい時は2フレーズ覚えるときもあるが、欲ばって2フレーズ覚えようとして、2フレーズとも忘れることもある。
sshのきほんのき

<a href="http://cs61a.org/lab/lab00/" target="_blank".>ラボの内容</a>に`ssh`のことについて軽く触れていたのでちょっとだけ調べてみた。

#目次

- `ssh`とは
- `ssh`コマンド

##`ssh`とは
ザックリ言って`ssh`を始めとしたリモートログインを使って遠隔でサーバーコンピューターにアクセスすることが可能になる。例えば遠隔でウェブサイトを編集したいときなどに便利。簡単な概要だけを知りたい場合は[ネットワークを利用した遠隔作業](http://www.cse.kyoto-su.ac.jp/~oomoto/lecture/program/misc/remote_login.html)が役に立つ。

ちなみに[wikipedia](https://ja.wikipedia.org/wiki/Secure_Shell)による定義は

>
_Secure Shell（セキュアシェル、SSH）は、暗号や認証の技術を利用して、安全にリモートコンピュータと通信するためのプロトコル。パスワードなどの認証部分を含むすべてのネットワーク上の通信が暗号化される。_

もともとは[Telnet](https://ja.wikipedia.org/wiki/Telnet)、[rsh](https://ja.wikipedia.org/wiki/%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E3%82%B7%E3%82%A7%E3%83%AB)や[rlogin](https://ja.wikipedia.org/wiki/Rlogin)の代用的存在と言える。主にセキュリティ上の理由から現在は`ssh`が主流になっているらしい。ネットワーク上に平文でパスワードを送信してしまうので覗き見されやすいことやサーバー誘導の際に起こりうるセキュリティ問題だ。 

##`ssh`コマンド

コマンドを一般的に表現すると`ssh username@domain_name(or host)`となる。ラボの説明を引用すると

>
_If you're interested, here's an explanation of what the command does:_
>
_1. ssh is a secure shell (i.e. terminal) that connects to other computers over a network.
2. cs61a-? is the username on the remote computer.
3. cory.eecs.berkeley.edu is the domain name of the remote computer. For our purposes it can be any of the servers that belong to Berkeley's CS department._

もっと詳しく勉強するなら[インフラエンジニアじゃなくても押さえておきたいSSHの基礎知識](http://qiita.com/tag1216/items/5d06bad7468f731f590e)というサイトを参考に。
暗号技術についてのまとめ

これはあくまで書籍を元に暗号技術についての知識をまとめたものです。

しっかりと学ぶ方は書籍(http://www.hyuki.com/cr/)
などを参考にしてください。 

既存知識を持っている方の整理のために使用していただければと思います。


#3つの暗号(cryptography)技術　　
##共通鍵暗号（対称暗号:symmetric cryptography）
###特徴
・暗号化(encrypt)と復号化(decrypt)に同じ鍵を用いる
・メッセージの機密性(confidentiality)を守るために用いられる
・平文(plaintext)を暗号文(ciphertext)にする

###例
DES(Data Encryption Standard)
　ファイステル・ネットワーク(Feistl cipher)を使用したもの。ブルート・フォース・アタック(brute-force attack)で破られる。3DESなども用いられる

AES(Advanced Encryption Standard)
　2000年：Rijndael(ラインダール）という共通鍵暗号アルゴリズムがNIST(National Institute of Standards and Technology)に集まった公募から選ばれた


###問題点
・鍵配送問題（key distribution problem）
　復号化するための鍵を受信者へ配送しなければいけないこと


##公開鍵暗号(public-key cryptography)
###特徴
・暗号化と復号化に異なる鍵を用いる
　送信者の公開鍵を受信者に送り、その鍵を使って暗号化された文を送信者がプライベート鍵で復号化する
・鍵配送問題を解決できる
（その他の解決法：鍵の事前共有、鍵配布センター、Diffie-Hellman鍵交換（盗聴者に読まれても構わない情報を交換し、鍵を作り出す方法））

###例
RSA
　非常に大きな数の素因数分解を利用した暗号

###問題点
・共通鍵暗号と比較すると速度が非常に遅い
・man-in-the-middle攻撃によってなりすまし(spoofing)をされる危険性がある
 →デジタル署名を用いた公開鍵の認証が必要


##ハイブリッド暗号
###特徴
・共通鍵暗号+公開鍵暗号したもの（公開鍵暗号の速度の遅さとman-in-the-middle攻撃への対応）
　メッセージは共通鍵暗号、セッション鍵は公開鍵暗号で暗号化する。
・セッション鍵は擬似乱数生成器で生成されるもの

→セッション鍵は共通鍵暗号にとっては鍵となるが、公開鍵暗号にとっては平文である。


##その他
・使い捨てパッド(one-time pad):絶対に解読されない暗号アルゴリズム
・ソーシャルエンジニアリング：人間というセキュリティホールを突く攻撃
・メッセージの存在を隠すのがステガノグラフィ(steganography)：（はがないの部員募集とか←)
・秘密の暗号アルゴリズムを使うよりも公開されていて強いアルゴリズムを使うべき
・シーザー暗号(Caesar cipher): 文字をシフトさせる暗号化。ブルート・フォース・アタックで破られる
・単一換字暗号(simple substitution cipher): 一文字ずつ別の文字に対応。鍵空間(key-space)が広く、ブルート・フォース・アタックには耐えられるが、頻度分析によって破られる








#認証(Authentication)技術
##一方向ハッシュ関数(one-way hash function)

###特徴
・長いメッセージを短いハッシュ値に変換する
・メッセージの正真性(完全性:integrity）の確認
・一方向性を持っている（ハッシュ値からメッセージを逆算できない）
・ハッシュ値の衝突耐性(collision resistance)は2種類
　弱衝突耐性：そのハッシュ値を持つ別のメッセージを見つけることが非常に困難
　強衝突耐性：ハッシュ値が一致する二つのメッセージを見つけることが非常に困難
・メッセージ認証コード・デジタル署名・擬似乱数生成器を構成する要素技術

###例
SHA-1: 脆弱性がすでに見つかっている
SHA-2: SHA-256, SHA-512, etc.
SHA-3: KECCAK

###問題点
・改竄を検出できるが、なりすましを検出できない



##メッセージ認証コード(MAC: message authentication code)
###特徴
・共通鍵暗号+一方向ハッシュ関数
・通信相手からのメッセージが改竄されていないか確かめる
・メッセージの正真性を検証し、認証を行う


###例
HMAC
　一方向ハッシュ関数を用いてメッセージ認証コードを構成する

###問題点
・鍵配送問題
・通信相手との認証しかできない（第三者の認証、通信相手に否認防止はできない）
・再生攻撃



##デジタル署名(degital signature)
###特徴
・公開鍵暗号技術を逆に使って認証
　プライベート鍵で署名を作成し、公開鍵で署名の検証をする。
・第三者に対してのメッセージ認証を行い、通信相手の否認防止を行うことができる
・鍵・初期化ベクトル・ノンスを作るために用いる
・なりすまし、改竄、否認(repudiation)の防止


###問題点
・man-in-the-middle攻撃
・署名検証の公開鍵が本物の送信者の鍵であるのかどうか→証明書の必要性



##証明書
###特徴
・公開鍵の正しさを証明するもの。認証局(certification authority ; CA)が発行する
・公開鍵に対して認証局がデジタル署名を施したもの


###例
PKI(Public Key Infrastructure): 公開鍵基盤
　利用者、認証局、リポジトリ間で証明書を発行する




##乱数
###特徴
・鍵、初期化ベクトル、ノンスを作るために用いる
・3つの性質
　無作為性：偏りがない				
　予測不可能性：過去から予測できない
　再現不可能性：同じ数列を再現できない
（上から順に弱い擬似乱数、強い擬似乱数、真の乱数の条件）

　
###例
擬似乱数生成器(pseudo random number generator; PRNG)
　予測不可能性を持つビット列を生成する技術。暗号や一方向ハッシュ関数などで構成。
　※具体的な擬似乱数生成器は割愛します。


##その他応用例
PGP(Pretty Good Privacy)
　暗号ソフトウェアの一種。
　使われている技術は
　・共通鍵暗号
　・公開鍵暗号
　・デジタル署名
　・一方向ハッシュ関数
　・証明書
　・圧縮
　・テキストデータ

SSL/TLS(Secure Socket Layer/Transport Layer Security)
　暗号通信の方法。(https://)
　
##まとめ
知識のまとめに書いたメモです。ど忘れしたときなどの参考になれば幸いです。
自作クラスのインスタンスの Array からは、contains() や indexOf() を呼ぶ際に不便

## 問題点の整理
Swift で String の Array 内に特定の文字列があるか否か、または Array 内での オブジェクトの index を求める場合は、こんな感じで書けます。

```.swift
var names = ["Tokyo", "New York", "London"]
let found = names.contains("Tokyo") // true
let index = names.indexOf("London") // 2
```

ところが、自作のクラスの Array で同じような事をしようとすると‥

```.swift
class Item {
	var name: String
	init(_ name: String) { self.name = name }
}

let apple = Item("Apple")
let banana = Item("Banana")
let orange = Item("Orange")
var items = [apple, banana, orange]

let found = items.contains(apple) // error
let index = items.indexOf(banana) // error
```

以下のようなエラーになってしまいます。

```.text
Cannot convert value of type 'Item' to expected argument type '@noescape (Item) throws -> Bool'
```

原因は、`Item` が `Equatable` プロトコルに準拠していないからです。そこで、以下のようにクロージャー内に評価式を書く方法もありますが...

```.swift
let found = items.contains({ return $0.name == apple.name }) // true
let index = items.indexOf({ return $0.name == banana.name }) // 1
```

## （その１）Equatable プロトコルに準拠させる 
そこはやっぱり、`Item` を `Equatable` プロトコルに準拠させてあげます。その為に、`Equatable` の記述と、`func ==` 関数を用意します。この関数は、右辺と左辺を評価して、等価か否かを評価して Bool を戻すものです。この場合は、名前が一致すれば等価としてみました。


```.swift
class Item: Equatable {					// Equatable
	var name: String
	init(_ name: String) { self.name = name }
}

func == (l: Item, r: Item) -> Bool {	// 評価関数
	return l.name == r.name
}

let apple = Item("Apple")
let banana = Item("Banana")
let orange = Item("Orange")
var items = [apple, banana, orange]

let found = items.contains(apple) // true
let index = items.indexOf(banana) // 1
let index = items.indexOf(Item("Orange")) // 2
```

## （その２）NSObject を基底クラスとする

自作クラスを NSObject のサブクラスにする方法も考えられます。

```.swift
class Item: NSObject {
	var name: String
	init(_ name: String) { self.name = name }
}

let apple = Item("Apple")
let banana = Item("Banana")
let orange = Item("Orange")
var items = [apple, banana, orange]

let found = items.contains(apple) // true
let index = items.indexOf(banana) // 1
```

注目は、`NSObject`。あまり手をかけずに、`contains(element)`、`indexOf(element)` が使えるようになりますが、このままでは、オブジェクトの名前ではなくオブジェクトが同一かどうかで判断されてしまうので、以下のような書き方をすると、異なる結果になってしまいます。

```.swift
let found = items.contains(Item("Apple")) // false <-- !?
```

これは、いい悪いではなく、こういうものだと理解する必要があります。この挙動を変えたい場合は、`==` 評価関数を書いてあげます。プロパティが多いと大変そうですね。

```.swift
func == (l: Item, r: Item) -> Bool {
	return l.name == r.name
}
```

ちなみに、オブジェクトが同一かどうかで評価する場合は以下のように書きます。

```.swift
func == (l: Item, r: Item) -> Bool {
	return l === r
}
```

さらに、`struct` や `enum`の場合は、`NSObject` のサブクラス化による方法は無理っぽい事は言うまでもありませんね。

【環境】
Xcode 7.2, Swift 2.1.1
WinとMacを行き来するためのCtrlキー運用戦略


職場・自宅デスクトップ・自宅ノートでマシンを使い分ける関係上、OSがWindowsとMacを行き来するようになりました。

なるべくスムーズに使い分けるべく、特に問題となる`Ctrl`キーに関する運用戦略を考えてみました。

## 方針
 * WindowsとMacを行き来しても、キーボード入力効率をなるべく変化させないようにしたい。
 * 環境設定箇所は最小限にしたい。マシンを乗り換えた時に環境設定に時間がかかるのはヤだし、ノウハウのポータビリティが下がってしまう。
 * WindowsとMacで流儀が異なる機能については、使いやすいどちらかの流儀に従うようにする。我が道には行かない。
 * 必要とあらば、自分のキーボード入力ポリシーを見直す。

### キーボード入力効率で特に問題となる機能
  * エディタ用ショートカット
  * 日本語変換（日本語で文章書いていて部分的に半角英数/全角カタカナを入力する場合）

## 戦略まとめ

検討の結果、以下のよう環境設定/運用することで、WindowsとMacで入力効率を変わらないようにできました。

### Windowsへの設定
* (一般的なキーボードの場合) `Caps Lock`を`Ctrl`にキー配列を変更
* `変換`キー → IME ON
* `無変換`キー → IME OFF

### Macへの設定
* 日本語変換をWindows風に設定

↑★環境設定箇所はここまで★↑

### 少し見直した入力ポリシー
* 半角英数/全角カタカナへの変換は、`Ctrl`+`T`/`Ctrl`+`I`で行うようにする。
* 変換確定/改行入力は、なるべく`Ctrl`+`M`で行うようにする。

## 検討の経緯

### 少し見直した入力ポリシー

Windowsしか使っていなかった頃、私は日本語入力中の半角英数/全角カタカナ変換は、`F10`/`F7`キーを使っていました。

ですが、Macの`F10`/`F7`キーは他のユーティリティ機能があって使えず、そこをWindows風に設定変更してしまうと今度は元々のユーティリティ機能の起動が手間になります。

実はWindowsでの半角英数/全角カタカナへの変換は、`Ctrl`+`T`/`Ctrl`+`I`で行うことができ、MacはWindowsと同様に変換できるようにするオプションがあります。これらを活用することで変換操作を統一できました。

また、`Ctrl`+`T`/`Ctrl`+`I`で変換を行うと、指のホームポジションからの移動距離が`F10`/`F7`を使うよりもかなり短くなるため、操作の統一とともにそもそもの入力効率がアップしました。これは思わぬ副作用！

指をホームポジションにより引きこもらせるために、日本語入力の確定/Vimでの改行入力は`Ctrl`+`M`で行うことにしました。これもWin/Macで同じです。（ついでに言えば、Vimでは`ESC`キーの代わりに`Ctrl`+`[`を使用）

### Windowsへの設定

#### (一般的なキーボードの場合) `Caps Lock`を`Ctrl`にキー配列を変更

デフォルトである左下の`Ctrl`キー配置は、`Z`、`X`、`C`、`V`辺りと組み合わせるのには合理的なんですが、それ以外のキーとのコンビネーションはキツいんですよね。

特にそれを実感したのは、MacでVimを使うようになった後に、WindowsでもVimを使い始めた時。`Ctrl`+`W`/`Ctrl`+`D`/`Ctrl`+`U`等、Vimでよく使うコンビネーションを`Ctrl`が左下にあるWin機で押しまくっていると、すぐに左手小指がつりそうになります。

また、見直した入力ポリシーでは日本語変換でも`Ctrl`キーとのコンビネーションを多用することになっていますので、ますます左手小指がツラい。

というわけで、Macとそろえるという意味でも左手小指保護という意味でも、`Caps Lock`を`Ctrl`にキー配列を変更しちゃいました。

ユーティリティを使うという手もありますが、レジストリを書き換えるのが手っ取り早いです。

[ASCII.jp：CtrlとCapsを入れ替え！ Windowsのキー配列をカスタマイズ｜深厚のWindows使いこなしテクニック](http://ascii.jp/elem/000/000/927/927191/)

#### `変換`キー → IME ON /  `無変換`キー → IME OFF

Mac側に合わせました。

[Windowsの変換・無変換キーでIMEの有効無効をMac風に操作する | karakaram-blog](http://www.karakaram.com/mac-ime)

### Macへの設定

#### 日本語変換をWindows風に設定

前述の`Ctrl`+`T`/`Ctrl`+`I`での日本語変換のために、Macの変換ショートカットキーをWindows風にしました。

MacをWindows風に設定するのは簡単（チェックボックス1個）なんですが、逆は難しいです。個人的にWindows風に慣れていたので、そういう意味でもWindows風に合わせました。

[MacのことえりをWindows風のキー操作で利用できるように設定を変更する方法 / Inforati](http://inforati.jp/apple/mac-tips-techniques/windows-hints/how-to-enable-windows-key-mode-of-mac-kotoeri.html)

## 諦めた点

* Macだけにある`⌘`キー

`⌘`キーを押す場合、「あ、今Mac使ってるんだ」と意識しながら押していて、Windows機との操作の統一は諦めています。

Macでの`⌘`キーで起動する機能は、Windowsでは`Ctrl`キー/Windowsキーに分かれて割当ってる感じですが、ここを設定変更で統一するのは修羅の道（設定変更が複雑な上に、自分用の環境以外では何もできなくなる恐れがある）な感じがします。

`⌘`キーは`Ctrl`キーと違って高速タイピングの流れで押すことが少ないので、これでいいかと思っています。

## 補足

自宅のWindowsデスクトップ機では、Apple製キーボードを使っています。`Ctrl`キーが最初から`A`キーの左にある（当たり前）のは嬉しいですね。

個人的にはストロークの深いキーボードよりも、ノートPCのようなペタペタした打感が好みなので、このキーボードは結構気に入っています。
KiCadやEagleでチップ抵抗やチップコンデンサを使うときに気をつけること

# 1.はじめに
ちょっと長いタイトルですが、KiCadとかEagleでチップ抵抗を実装するときにつまずいた、すご～く初歩的なミスを共有します。

# 2.チップ抵抗とチップコンデンサの大きさ表記は２種類ある
## 2.1.チップ抵抗とチップコンデンサのサイズ表記に気をつけろ
　チップ抵抗やチップコンデンサには、２通りのサイズ表記があります。metricとinchです。
　大体、秋月電子通商で各パーツを揃える私。秋月電子通商でのチップ抵抗やチップコンデンサはmetricで表記されています。しかし、KiCadやEagleで表記されているのはinchなのです！！
　これに気が付かなかった私達（友人が回路設計をしていたので）は、３０分metric表記のサイズを探すため、KiCadのライブラリをあさりましたが、無かったです…（当たり前です、KiCadのライブラリはすべてinchなのですから…）
　
## 2.2. じゃあ、どうやってinchに変換するの？
　大体、抵抗値や静電容量によって大きさが決まってくるので、パターン（プリント基板のパターン、レイアウト）の方を変更する方がいいと思います。ので、必要な部品を秋月で探してきてmetric表記からinch表記にすることがいいと思います。
　以下、対応表です。参考にしてください。

|metric|inch|
|:--:|:--:|
|0402|01005|
|0603|0201|
|1005|0402|
|1608|0603|
|2012|0805|
|3216|1206|
|3225|1210|
|5025|2010|
|6332/6432|2512|

## 3.3.まとめ
　海外発のソフトを使う際、今回の例にかぎらずinchで表記されていることがあるかと思うので、注意が必要である。
　
# 4. 参考サイト
http://peripheralpinmap.hatenablog.jp/entry/20091213/1260683406

# 5.改訂記録
2016年1月20日　新規
2016年1月22日　metric-inch変換表、最終行左（0,9）に「2432」を追記

# 6. 謝辞
　この記事を読んでいただいたある方から、ご指摘いただき6332 metricと6432 metric両方が存在し、6432のチップ抵抗やチップコンデンサ（表面実装用部品、SMD）も多くヒットする事がわかりました。このご指摘をいただき、対応表に追加いたしました。ありがとうございました。

# 7.問い合わせ先
　「ここ違うよ！」などミスを見つけたり、質問等あれば以下のアドレスにメールしていただけると、助かります。よろしくお願いします。
　akira.kashihara@hotmail.com
Emacsで.logファイル監視(tail -f)


## これはなに？

タイトルの通りです。Emacsで`.log`ファイルを監視することができるようになる設定です。
`.log`ファイル開いたとき、自動的に`tail -f`相当の以下のような動きをするようになります。

- ファイル更新に追随して自動的にバッファを更新
- バッファ更新時とファイルを開いた時、自動的にバッファの末尾へカーソルを移動

## 設定

`~/.emacs.e/init.el`の末尾に追記するか、`init-loader`を利用している場合は`21-auto-revert-tail-log.el`といったelispファイルを作成して下記を記載します。

```elisp
;; .logファイルでは自動で auto-revert-tail-mode にする
(add-to-list 'auto-mode-alist '("\\.log\\'" . auto-revert-tail-mode))

;; ファイル更新やバッファオープン時、自動でカーソルを末尾に移動する
(defun do-end-of-buffer()
  (when auto-revert-tail-mode
    (end-of-buffer)))
(add-hook 'after-revert-hook 'do-end-of-buffer)
(add-hook 'find-file-hook 'do-end-of-buffer)
```


## 環境情報

```os
% inxi -SM
System:    Host: hakone.vps.sakura.ne.jp Kernel: 2.6.32-573.8.1.el6.x86_64 x86_64 (64 bit)
           Console: tty 1 Distro: CentOS release 6.7 (Final)
Machine:   System: Red Hat product: KVM v: RHEL 6.4.0 PC
           Mobo: N/A model: N/A Bios: Sea v: 0.5.1 date: 01/01/2007
```

```emacs
% emacs --version
GNU Emacs 24.3.1
```
カードゲームを作る　その２（サーバ側：Railsプロジェクト立ち上げ）

##この記事は
とある[カードゲーム](http://arcana.vector.co.jp)が非常に面白く、
そのゲームの見た目クローンを作ろうと一人のプログラマーが奮闘していくブログのような記事です。

その１の続き

今回の参考サイト：
・[RAILSCASTS](http://railscasts.com/episodes/348-the-rails-api-gem?language=ja&view=asciicast)
・[RailsでAPI開発する前に知っておくべき４つのこと](http://qiita.com/otyoppu/items/e5b0b6437fee045d6252)
上記サイトを元にプロジェクトの立ち上げをしました。
まずはrails-apiをインストールから始まって諸々準備していく。
## インストール

```
$ gem install rails-api
$ gem install prmd
```

## プロジェクトの作成
Urakataプロジェクト(仮)を作成
```
$ rails-api new Urakata
```

## データベース設定

```rb:config/database.yml
default: &default
  adapter: sqlite3
  pool: 5
  timeout: 5000

development:
  <<: *default
  database: db/development.sqlite3

test:
  <<: *default
  database: db/test.sqlite3
```
VimでOCamlを書くためにmerlinとocp-indentを設定する

この文書は、VimでOCamlを快適に書くためにmerlinとocp-indentを導入する方法について書かれています。
merlinはコード補完とエラーチェックに、ocp-indentはコードフォーマットに使用します。

筆者の環境はOS X(10.11.2)です。

## OCamlとOPAMのインストール

merlinとocp-indentをインストールする前に、OCamlとそのパッケージマネージャであるOPAMをインストールする必要があります。
どちらもHomebrewでインストールできるため、特に手間はかかりません。

```shell-session
$ brew install ocaml --with-x11
$ brew install opam
```

OCamlの方に`--with-x11`をつけたのは、Graphicsを導入するためです。必要ない方はつける必要はありません。
自分の場合、 OCamlはバージョン4.02.3が、OPAMはバージョン1.2.2がインストールされました。

## merlinとocp-indentのインストール

OPAMを使って、 [merlin](http://the-lambda-church.github.io/merlin/) と [ocp-indent](http://www.typerex.org/ocp-indent.html) をインストールします。

```shell-session
$ opam install merlin
$ opam install ocp-indent
```

自分の場合、merlinはバージョン2.2が、ocp-indentはバージョン1.5.2がインストールされました。
実はこの2つをインストールした直後に、それぞれEmacsとVimの設定について書かれたメッセージが表示されているので、後はそれに従うだけで設定が完了します。

## Vimの設定

### merlinの設定

vimrcに以下のように記述します。

```
let g:opamshare = substitute(system('opam config var share'),'\n$','','''')
execute 'set rtp+=' . g:opamshare . '/merlin/vim'
```

これにより、コード補完ができるようになりました。また`:MerlinErrorCheck`で、エラーチェックができるようになりました。

#### 保存時に自動的にエラーチェックを行う

シンタックスチェックのためのプラグインである[syntashtic](https://github.com/scrooloose/syntastic)を導入して、保存した時に自動的にエラーチェックが走るようにします。
syntasticのインストールはNeoBundleであれば、vimrcに以下のように書きます。

```vim
NeoBundle 'scrooloose/syntastic'
```

加えて以下の設定をvimrcに記述します。

```vim
let g:syntastic_ocaml_checkers = ['merlin']
```

これにより保存時に自動的にエラーチェックが行われるようになります。
これは最低限の設定で、syntasticは他にも様々な設定ができますが、それについては省略します。

### ocp-indentの設定

vimrcに以下のように記述します。

```vim
execute 'set rtp^=' . g:opamshare . '/ocp-indent/vim'
```

g:opamshareについてはmerlinのインストール時に設定したものをそのまま使っています。ocp-indentだけ設定したい方は、merlinの方の該当行をコピーしてください。

#### 保存時に全体をフォーマットする

ocp-indentはCLIとしても提供されているため、以下のようにして保存時にバッファ全体に対してocp-indentを仕掛けることができます。

```vim
function! s:ocaml_format()
    let now_line = line('.')
    exec ':%! ocp-indent'
    exec ':' . now_line
endfunction

augroup ocaml_format
    autocmd!
    autocmd BufWrite,FileWritePre,FileAppendPre *.mli\= call s:ocaml_format()
augroup END
```

## 参考文献

https://github.com/the-lambda-church/merlin/wiki/vim-from-scratch
https://www.typerex.org/ocp-indent.html (このページのvim設定は誤り)
カードゲームを作る　その１（基本環境）

##この記事は
とある[カードゲーム](http://arcana.vector.co.jp)が非常に面白く、
そのゲームの見た目クローンを作ろうと一人のプログラマーが奮闘していくブログのような記事です。

いくつか言い訳
※不定期連載です。
※筆者のメモも兼ねているため過去の記事も遠慮なく随時編集いたします。
※多分途中で挫折します。
※プログラミングの開発経験はあってもゲームの開発経験はこれが初めてです。
等色々ありますが、生暖かい目で応援してくださると光栄です。

##目指すゲームの内容
カードの戦闘は割と単純でHPとATKだけで正面の相手と数字の引き算を累積してやっていくゲームです。
それだけだと面白くないので、waitの概念とか、スキルの概念が入ってきて絶妙なバランスで
ゲームが面白くなっております。
早い話、
上記リンクからアプリをインストールして遊んでもらえるとわかり易いと思います。


将来的にはがっつり課金制のゲームを睨んで作っていこうと思っていますので、
クライアントーサーバ型のゲームを目指していきます。
また、ここで紹介する内容もこのゲームのコアな部分の戦闘を中心に書いていきます。

##環境
###サーバ環境

OS : Linux 
Webサーバ : nginx （がいいなー)
DB：あり。（開発段階ではsqlite3、リリース時の環境はその内決める）
開発言語 : Ruby on rails 

###クライアント環境
OS : iOS 後　Android
開発環境 : Cocos2d
アップロードしたファイルの名前から拡張子が取得できない

# 問題
「ブラウザからアップロードしたファイル名から拡張子を取得する」という処理がある。その部分で、拡張子が取れないという問題が発生。

* 拡張子がとれるファイルと取れないファイルがある
* テストサーバでは拡張子が取れないが、ローカルサーバでは問題ない

### テストサーバ環境
* Windows 2008
* Tomcat7

### ローカルサーバ環境
* Windows7
* Tomcat7(Eclipse4.4上で起動）

### Webシステム
* HTMLの文字コード: UTF-8

# 調査
1. アップロードしたファイル名をログに出力
 * テストサーバでは文字化けしている
 * ローカルサーバでは文字化けしていない
2. 拡張子が取れないファイルをテストサーバにアップロード(ex: 画像.png)
 * 文字化けしてピリオドがなくなっている
3. TomcatのJVM確認
 * 文字コード設定はない 


# 対応
TomcatのJVMに`-Dfile.encoding=UTF-8`を指定。

# 課題
* EclipseからTomcatを起動している場合JVMに設定しなくてもよかったのはなぜ?
* JVMの文字コードはHTMLの文字コードと対応さればOK?
* 文字化けしてピリオドが消えたのはなぜ?
bundle installでエラー （installing pg）

環境 mac OSX El Capitan
Ruby 2.0.0
Rails 4.0.5
## bundle installしたらエラーができました。

下記エラーメッセージ

```
An error occurred while installing pg (0.15.1), and Bundler cannot continue.
Make sure that `gem install pg -v '0.15.1'` succeeds before bundling.
```
PostgreSQLのことだったのか。。。

下記コマンドで解決。

```
brew install postgresql
```

Cool!!

参照元 http://frog377.hatenablog.com/entry/2015/02/28/151720
Reactに慣れるためにReact.js Koansってのをやってみました（React初心者向け）


[React.js Koans](https://github.com/arkency/reactjs_koans)というReactの練習プログラムがあるのでやってみました。

`exercises`ディレクトリの中にある問題を解いていって、`npm run test`とやると正解かどうかのチェックをしてくれるシンプルなものです。`npm run start`でローカルサーバーを起動してそこで見た目の確認ができるのも良いです。開発環境は後で述べるセットアップをすればとりあえずのものが揃うので、Reactの学習に専念できます。

## こんな感じで問題を解いていきます

*簡易的な見た目はこのように確認します*

![スクリーンショット 2016-01-19 23.59.44.png](https://qiita-image-store.s3.amazonaws.com/0/24041/65913a07-124a-3313-6704-2aace9b98260.png "スクリーンショット 2016-01-19 23.59.44.png")


*問題はこんな感じです*

![スクリーンショット 2016-01-20 00.25.30.png](https://qiita-image-store.s3.amazonaws.com/0/24041/29135d05-0863-afb4-47fa-04b3fcbeab9f.png "スクリーンショット 2016-01-20 00.25.30.png")

*テストで正解しているかどうかを確認します*

![スクリーンショット_2016-01-19_02_23_03.png](https://qiita-image-store.s3.amazonaws.com/0/24041/7a7982aa-c0d7-4c39-526c-e7b2a1cf7f18.png "スクリーンショット_2016-01-19_02_23_03.png")

## 学習を始めるには？

学習を始めるのは簡単で、下記の手順でセットアップします。

```bash
$ git clone https://github.com/arkency/reactjs_koans.git
$ cd reactjs_koans
$ npm run setup
```

個人的には、**05-Challenge-GroceryList-part-4.jsx**が気に入りました。全体的にとても初歩的な内容だと思いますが、Reactに慣れていきたいという人には手と頭を動かすための良い材料になるのではないでしょうか？

## 参考

- [arkency/reactjs_koans: Learn basics of React.js making the tests pass](https://github.com/arkency/reactjs_koans)
AWKまじ入門してみた


# 概要
- テキスト処理やる
- C言語の文法に似てる


自分Macなんで

```
$ which awk
/usr/bin/awk
```

を使います。

# 書式
ワンライナーで書くと

```
$ awk '{ 実行する式 }' 処理したいファイル
```

## 例
text.datを処理したいtextとすると

```
majihuwa1 keshigomu1 150 2016/01/11 01:18:43
majihuwa2 keshigomu2 150 2016/01/01 11:18:43
majihuwa3 keshigomu3 250 2016/01/09 04:18:43
majihuwa4 keshigomu4 500 2016/02/02 02:18:43
```
例:text.datの３行目を出力

```
$ awk '{ print $3 }' text.dat
150
150
250
500
```
npmチートシート


自分用。世の中に既にいっぱいあるのは知っていながら投稿する。
npmのサブコマンドは省略形や別名が使えるものが多い
`install`,`list`,`uninstall`は**基本的にローカルが対象**で、`-g`をつけるとグローバルが対象になる。

```bash
# 対話形式で情報入力してpackage.jsonを生成する
$ npm init

# packageを検索する
$ npm search <keyword>  # (search|se|s)

# packageをインストールする
$ npm install <package...> # (install|i)
$ npm install --save <package...> # package.jsonにも書き込む
$ npm install --save-dev <package...> # package.jsonにも書き込む（開発用パッケージ）
$ npm install  # package.jsonからインストール
$ sudo npm install -g <package...>  # グローバル

# packageをアップデートする
$ npm update <package>  # (update|up)

# packageをアンインストールする
$ npm uninstall <package...>  # (uninstall|unlink|un|remove|rm|r)
$ sudo npm uninstall -g <package...>  # グローバル

# インストール済みpackageを確認する
$ npm list [package...]  # (list|ls|la|ll)
$ sudo npm list -g [package...]  # グローバル

# package情報を見る
$ npm info <package...>  # (info|view|show)
```

あまり使わなそうな？やつ

```bash
# packageのURL/ファイル/バージョンを指定してインストールする
$ npm install <git:// url>
$ npm install <tarball url>
$ npm install <github username|github project>
$ npm install <folder>
$ npm install <tarball file>
$ npm install <package>@<version>
```

基本的にローカルにインストールする、というスタンスがPython系（`pip`,`conda`）より良いと思う。
そもそもPythonは2系3系あるからそれどころじゃないけど。
C++11でバリア同期

# 動機

C++11でカジュアルにスレッドが作れるようになったのに、そのバリア同期手段はboost::barrierかpthread_barrierぐらいしか使えなくてもっと依存のないポータブルな実装が欲しい事があったので書き捨てたものを公開。
`condition_variable`と`notify_all`を使った物が一般的だけれど、短時間で同期できることがわかっている場合にはスピンによる待機が一番パフォーマンスが出るのでスピンにした。

# 実装

The Art of Multiprocessor Programmingのセンス反転バリアをそのまま実装した。
スレッドローカルストレージをクラスごとにポータブルに作る方法が分からなかったし、そもそもスレッドは開始時にTIDを渡しているのでそれを`wait()`の引数に渡すようにした。
やりたい事はbooleanの反転だったけれど`std::vector<bool>`は触ってはいけない（特にマルチスレッド環境にはあまり良くないテンプレート特殊化がされている）ので`std::vector<int>`を利用した。
随所で `<<6` とビットシフトしているのは、個々のスレッドの状態を保持する場所同士がキャッシュラインの都合上64byteずつ離れていて欲しかったから。

```cpp:
#include <atomic>
#include <vector>

class spin_barrier {
  spin_barrier() = delete;
  spin_barrier(const spin_barrier &) = delete;
  spin_barrier& operator=(const spin_barrier &) = delete;
public:
  spin_barrier(size_t threads) :
      threads_(static_cast<int>(threads)),
      waits_(static_cast<int>(threads)),
      sense_(false),
      my_sense_(threads << 6) {
    for (size_t i = 0; i < threads; ++i) {
      my_sense_[i << 6] = true;
    }
  }

  void wait(int i) {
    int sense = my_sense_[i << 6];
    if (waits_.fetch_sub(1) == 1) {
      waits_.store(threads_);
      sense_.store(sense != 0, std::memory_order_release);
    } else {
      while (sense != sense_);
    }
    my_sense_[i << 6] = !sense;
  }
private:
  const int threads_;
  std::atomic<int> waits_;
  std::atomic<bool> sense_;
  std::vector<int> my_sense_;
};
```

# 使い方

10スレッドが100回バリア同期するだけのコード。
コンパイル時には `-std=c++11` と `-pthread` オプションを忘れずに。

```cpp:
#include <iostream>
#include <thread>
#include <vector>

// ここに上のbarrierクラスを書く

int main() {
  const int n_workers = 10;
  spin_barrier barrier(n_workers);  // shared
  std::vector<std::thread> workers;
  
  workers.reserve(n_workers);
  for (int tid = 0; tid < n_workers; ++tid) {
    workers.emplace_back([&, tid] {
      for (int i = 0; i < 100; ++i) {
        barrier.wait(tid);
        std::cerr << "[" << tid << "]: "
            << i << "th barrier ok." << std::endl;
      }
    });
  }
  for (auto& worker : workers) {
    worker.join();
  }
}
```

簡単ですね。
SoftLayerでVLANを追加する方法

#チケットで質問
実際に追加したわけではありませんが、ポータルメニューから追加できないようなので、チケットを使って聞いてみました。

```
Hello,

Could you tell me how to order VLANs?

Both public and private VLAN are available?

How much does it cost?
```

すると以下のような反応がすぐ返ってきました。

#結果
```
Hi,

Additional VLAN costs $25/mo per VLAN.
To order, please approve the price in this ticket and fill in the attached VLAN request form, 
then send back to us so we can have it assigned to our networking team for further review on your request. 
```

以下のフォームをチケットから提出すれば、1VLANあたり月額$25で追加できます。
もちろんパブリックネットワークもプライベートネットワークも。
そう、SoftLayerならね。

#参考資料
VLANオーダーフォーム
![VLAN_Request_Form.fill-in.png](https://qiita-image-store.s3.amazonaws.com/0/101361/5fa62566-04e1-f2ec-7504-6f8337828afb.png)
![VLAN_Request_Form.fill-in2.png](https://qiita-image-store.s3.amazonaws.com/0/101361/2027f39b-7fba-abfc-cf14-7cff9c5d8b5b.png)
underscoreコードリーディング（bindAll）


underscoreに詳しくないので、勉強半分でソースコードを読む。



##利用するバージョン
[underscore.js(v1.8.3)](https://github.com/jashkenas/underscore/tree/1.8.3)


##bindAllとは


###[underscorejs.orgのbindAll](http://underscorejs.org/#bindAll)

こんな説明。
>####_.bindAll(object, *methodNames) 
>Binds a number of methods on the object, specified by methodNames, to be run in the context of that object whenever they are invoked.
>Very handy for binding functions that are going to be used as event handlers, which would otherwise be invoked with a fairly useless this.
>methodNames are required.


```javascript
var buttonView = {
  label  : 'underscore',
  onClick: function(){ alert('clicked: ' + this.label); },
  onHover: function(){ console.log('hovering: ' + this.label); }
};
_.bindAll(buttonView, 'onClick', 'onHover');
// When the button is clicked, this.label will have the correct value.
jQuery('#underscore_button').bind('click', buttonView.onClick);
```
------------- 
methodNamesに指定されたいくつかのメソッドを、objectが呼び出された時にそのコンテキストで実行されるように、objectに対して紐付けます。
イベントハンドラとして利用する際に、関数を紐付けるのにとても扱いやすいです。
イベントハンドラとして利用しようとするには、バインドするのにとても使いやすいですが、それ以外の場合は無用に呼び出されるだけなので全然使い勝手が良くないです。
methodNamesは必須です。

###[underscore.bindAll](https://github.com/jashkenas/underscore/blob/1.8.3/underscore.js#L738)
コード的にはこのあたり。

```javascript
 // Bind a number of an object's methods to that object. Remaining arguments
  // are the method names to be bound. Useful for ensuring that all callbacks
  // defined on an object belong to it.
  _.bindAll = function(obj) {
    var i, length = arguments.length, key;
    if (length <= 1) throw new Error('bindAll must be passed function names');
    for (i = 1; i < length; i++) {
      key = arguments[i];
      obj[key] = _.bind(obj[key], obj);
    }
    return obj;
  };

```

第一引数のobj以外のargumentsの長さを求めてlengthに入れておく。
lengthが1以下だった場合エラーを返す（methodNameがないことになるので）
1以上の場合、_.bindを用いてobjにバインドしていく。その後、バインドされたobjを返却する。
OS X El Capitan にアップデートした際に MacPorts を動くようにする


## sudo port selfupdate でエラーが発生する

```
$ sudo port selfupdate
Password:
Error: Current platform "darwin 15" does not match expected platform "darwin 14"
Error: If you upgraded your OS, please follow the migration instructions: https://trac.macports.org/wiki/Migration
OS platform mismatch
    while executing
"mportinit ui_options global_options global_variations"
Error: /opt/local/bin/port: Failed to initialize MacPorts, OS platform mismatch
```

## 対処法

下記を参考にして、MacPortsを再度インストール

[Migration – MacPorts](https://trac.macports.org/wiki/Migration "Migration – MacPorts")

### Xcode の最新版インストール

#### Xcode and the Xcode Command Line Tools のインストール

```
$ xcode-select --install
xcode-select: note: install requested for command line developer tools
```

####  Xcode license に同意する

```
$ sudo xcodebuild -license
```

Enter -> space space space ... -> agree

#### 最新版のインストールができているかの確認

$ xcode-select --install
xcode-select: error: command line tools are already installed, use "Software Update" to install updates

### MacPorts の最新版インストール

### MacPorts のインストール

下記の OS X 10.11 El Capitan を選択。

[The MacPorts Project -- Download & Installation](https://www.macports.org/install.php "The MacPorts Project -- Download & Installation")

### 最新版のインストールができているか確認

```
$ sudo port selfupdate
Password:
--->  Updating MacPorts base sources using rsync
MacPorts base version 2.3.4 installed,
MacPorts base version 2.3.4 downloaded.
--->  Updating the ports tree
--->  MacPorts base is already the latest version

The ports tree has been updated. To upgrade your installed ports, you should run
port upgrade outdated
```

### 更新可能なパッケージをアップグレードする

`$ sudo port upgrade outdated` のように実行するとパッケージがアップグレードされても古いバージョンが残ってしまうが、`$ sudo port -u upgrade outdated` のように -u のオプションを付けて実行すると古いバージョンが残らない。
好みでどちらかのコマンドを実行。

> 古い deactive されたバージョンを削除したい場合は `$ sudo port uninstall inactive` を実行。

```
$ sudo port upgrade outdated
…
Error: dyld-headers is obsolete; please uninstall it.
Error: org.macports.configure for port dyld-headers returned: obsolete port
Please see the log file for port dyld-headers for details:
    /opt/local/var/macports/logs/_opt_local_var_macports_sources_rsync.macports.org_release_tarballs_ports_devel_dyld-headers/dyld-headers/main.log
Error: Unable to upgrade port: 1
To report a bug, follow the instructions in the guide:
    http://guide.macports.org/#project.tickets
```

( 自分の場合は ) 上記のエラーが出たので指示通り dyld-headers をアンインストールする。

```
$ sudo port uninstall dyld-headers
Password:
--->  Deactivating dyld-headers @239.3_0
--->  Cleaning dyld-headers
--->  Uninstalling dyld-headers @239.3_0
--->  Cleaning dyld-headers
```

再度パッケージをアップグレードする。

```
$ sudo port upgrade outdated
…
--->  Updating database of binaries
--->  Scanning binaries for linking errors
--->  No broken files found.
```

### ports が全てアップデートされているか確認

```
$ port outdated
No installed ports are outdated.
```
browserify 環境で ws が動かない

# 問題

`browserify` を使用している環境で `ws` が動かない。

# 解決策

`ws` を使わない。

0.8.x の場合は [websockets/ws の README に書いてあるとおり](https://github.com/websockets/ws#browserify-users) `browserify` を使用している環境では API が異なる。

1.0.1 の場合はこの対応は削除されている。

ぼくは諦めて browser 標準の WebSocket を使うことにした。[WebSocket API](https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API/Writing_WebSocket_client_applications#Availability_of_WebSockets) を参照すると良い。
iptablesで特定のIPアドレスからのアクセスをはじく

WordPressのブルートフォース攻撃を海外から受けまくりで鬱陶しいのでついかっとなって設定したくなってしまった時のための備忘録として。自分用メモ。

※iptablesの設定は、間違えるととても影響が大きいので、要注意！
※環境によってもイロイロ違いがあったりするので、要注意！

```
iptables -A INPUT -s nnn.nnn.nnn.nnn -j DROP
service iptables save
```
nnn.nnn.nnn.nnn … アクセスをはじきたいIPアドレス

＜参考＞
しっかり勉強したい方には、この辺の記事がよさげですよ。
http://qiita.com/Tocyuki/items/6d90a1ec4dd8e991a1ce
GizmosにMeshを表示する

# 前提
Unity3DでPredabにPrefabをネストしたいんだけどリンク切れちゃうので、Prefabをロードする空のObjectを用意する、みたいなことをやったとき、Gizmosを表示しておかないとどういうオブジェクトがどこに表示されるのかよく分からないよ！

# 解決方法
PrefabのローダーでGizmosをカスタマイズします。
Meshがあるものに関してはそのMeshを表示し、それ以外は一旦適当なGizmosで代用しておきます。

# 実装
```csharp
using UnityEngine;

public class PrefabLoader : MonoBehaviour {

	public GameObject prefab;
	public Color color;
	static readonly float alpha = 0.6f;
	static readonly Color defaultColor = new Color(1f, 0f, 0f, alpha);
	static readonly Vector3 labelOffset = new Vector3(0f, 1f, 0f);

	void Start () {
		var obj = Instantiate(prefab, Vector3.zero, Quaternion.identity) as GameObject;
		obj.transform.SetParent(transform, false);
	}
	
	void OnDrawGizmos () {
		Gizmos.color = defaultColor;
		// colorのAlphaが0じゃないとき上書き
		if (!color.a.Equals(0f)) {
			Gizmos.color = color;
		}

		if (prefab != null) {
			#if UNITY_EDITOR
				UnityEditor.Handles.Label(transform.position + labelOffset, prefab.name);
			#endif
			// 3Dオブジェクトの場合はMeshを表示する
			if (prefab.GetComponent<MeshFilter>() != null) {
				Gizmos.DrawMesh(
					prefab.GetComponent<MeshFilter>().sharedMesh,
					transform.position,
					prefab.transform.rotation,
					prefab.transform.localScale);
			} else {
				Gizmos.DrawSphere(transform.position, alpha);
			}
		}
	}
}
```
このスクリプトをGameObjectに追加して、表示したいprefabをInspectorで指定すれば完了。
色を変えたい場合はcolorもInspectorで指定できます。

# いざ確認
![スクリーンショット 2016-01-19 午後10.45.10.png](https://qiita-image-store.s3.amazonaws.com/0/18707/65171ead-af01-28c8-fab9-cc2d3f1ea5cd.png)
こんな具合になります。
AppleScriptのレコードをNSDictionaryに変換すると予約語の属性が消えてしまう


* AppleScriptのレコードには予約語のラベルとユーザ定義のラベルを混在させることができる
	* 予約語のラベル
		* 例：id, name, number
		* クラスやプロパティなど、システムで使われる予約語
	* ユーザ定義のラベル
		* 予約語以外のラベル
		* スクリプトエディタ上では変数と同じフォーマット（色、フォント）
* AppleScriptのレコードに対応するAppleScriptObjCのクラスは`NSDictionary`
	* レコードから`NSDictionary`への変換は`dictionaryWithDictionary:`などを使って簡単にできる
	* `NSDictionary`からレコードへの変換も`as record`とキャストして得られる
	* これでCocoaの機能を存分に使える！と思いきや…
* __レコードを`NSDictionary`に変換すると予約語の属性がすべて消えてしまう__ことが判明
	* ユーザ定義のラベルだけが`NSDictionary`に認識される
	* 変換時にエラーが発生しないので注意


```AppleScript
use framework "Foundation"

set aRecord to {id:7, name:"John", age:24}
--予約語のラベル：id, name
--ユーザ定義のラベル：age

set aDictionary to current application's NSDictionary's dictionaryWithDictionary:aRecord

aDictionary as record
--> {age:24}

aDictionary's allKeys() as list
-->{"age"}

aDictionary's valueForKey:"id"
--> missing value
```
Linino Oneのファームアップデート

Linino Oneのファームウェアをアップデートする場合、[スイッチサイエンスのやり方](http://trac.switch-science.com/wiki/linino_one_restapi)で記述されているファームは古いためか、WifiStatusがうまく機能しないバグがあります。

下記の流れに沿って、最新のファームに更新したほうがよさそうです。

# アップデートの手順
1. Linino ONEにSSHでログイン
2. cd /tmp でtmpディレクトリに移動
3. wget http://download.linino.org/linino_distro/lininoIO/latest/lininoIO-generic-linino-one-squashfs-sysupgrade.bin
4. sysupgrade -n -v lininoIO-generic-linino-one-squashfs-sysupgrade.bin
5. 更新が終了すると、勝手にリブートされます。

![_ssh_—_ssh_root_10_0_1_10_—_bash_—_80×15_と_「Linino_Oneのファームアップデート」を編集_-_Qiita.png](https://qiita-image-store.s3.amazonaws.com/0/10770/badf4da2-ce1b-e093-f5b6-ab0f1c98c2fc.png)

# リブート後
Wifiの設定がリセットされているため、[こちら](http://qiita.com/okhiroyuki/items/9c024c6db93a639ee788#wifiなどの設定)を参考に、接続設定をしてください。

# MCUのファームアップデート
再起動後、MCU（Ardino側）のファームも一応更新しておきます。

1. Linino ONEにSSHで再ログイン
2. run-avrdude /etc/linino/bathos-one.hex

ちなみに、sshで接続しようとすると、前回記録したホストキーと違うって怒られるので、.ssh/known_hostsの中にある対象のIPアドレス部分を削除してください。

# Lininoioサービスの停止
さらに、このままでは、Linux側とArdino側がBridgeで通信できなくなっているので、下記のコマンドでlininoioサービスをストップさせます。

1. lininoio stop
2. Do you want to proceed? [y/n] → y
3. Do you want to disable the LininoIO OS features ?[y/n]  → y
4. Reboot now? →　y

# 参考
[Linino.org](http://wiki.linino.org/doku.php?id=wiki:upgradetolininoio)
Zybo > What are board files > XML files define different interfaces on the board. Interfaces such as Slide Switches, Push Buttons, LEDs, USB-UART, DDR Memory, Ethernet etc. 

```txt:動作環境
Vivado 2015.4 on Windows 8.1 pro (64bit)
```

VivadoでZyboを扱うときに出てくるBoard Filesについて

https://reference.digilentinc.com/vivado:boardfiles2015

Board Files(XMLファイル)について以下の記載がある。

> XML files define different interfaces on the board. Interfaces such as Slide Switches, Push Buttons, LEDs, USB-UART, DDR Memory, Ethernet etc. 

自分のインストール環境では以下のフォルダにboard filesがある。
C:\Xilinx\Vivado\2015.4\data\boards\board_files

まだ上記のファイルをインストールしておらず以下のようなファイル構成になっている。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/4e1ab221-5baf-67aa-357a-ce2993c1f081.png)
WerckerのRVM boxで削除されたバージョンのRubyを使いたい時

WerckerのRVM boxで古いRubyを使いたい時のメモ。

[wercker/box-rvm](https://github.com/wercker/box-rvm)の[README（2016/01/19時点）](https://github.com/wercker/box-rvm/blob/95c6cbd1ddb459de1e6dd03860cf14e1639b5f85/README.md)には、対応するRubyのバージョンが書いてあって、

```
- `ruby-2.0.0-p645` (deprecated)
- `ruby-2.0.0-p647`
- `ruby-2.0.0-p648`
- `ruby-2.1.6` (deprecated)
- `ruby-2.1.7`
- `ruby-2.1.8`
- `ruby-2.2.2` (deprecated)
- `ruby-2.2.3`
- `ruby-2.2.4`
- `ruby-2.3.0` (default)
```

とのこと。

ここに書いていないバージョン、例えば2.2.1を使おうとして、wercker.ymlに

```wercker.yml
box: wercker/rvm
build:
    steps:
        - rvm-use:
            version: ruby-2.2.1
```

とか書くと、```ruby-2.2.1 is not installed.```とエラーが出る。

wercker/box-rvmの[Changelog](https://github.com/wercker/box-rvm#changelog)を見ると、5.0.0でRemoved ruby-2.2.1
と書いているので、ruby-2.2.1が消される前のバージョンである4.0.0を使う必要がある。

rvm-boxのバージョンを指定するには、wercker.ymlの使用するboxを指定する行で指定してやれば良い。

```wercker.yml
box: wercker/rvm@4.0.0
build:
    steps:
        - rvm-use:
            version: ruby-2.2.1
```

READMEにも"If you want to keep using a old version you can lock the version on a box, but we strongly recommend upgrading to a newer version."と書いてある通り、新しいバージョンのboxを使うのが一番だけど、そうも行かない時のためにメモ。
Zybo > Link > Vivado Board Files for Digilent 7-Series FPGA Boards

http://marsee101.blog19.fc2.com/blog-entry-2748.html
を読んでいて、Board Definition Filesというのが出てきた。

https://forum.digilentinc.com/topic/281-zybo-board-definition-for-vivado/
から
https://reference.digilentinc.com/vivado:boardfiles
を見つけた。