OmniAICreator/Qiita-1.07M huggingface dataset:
プログラミング言語 Red 入門記 #1 インストールと実行


オープンソースのプログラミング言語 Red の勉強中
調べたこと、やってみたことなどをまとめていきます。

## Redとは？
オープンソースのプログラミング言語です。
Rebolという言語の後継だそうです。

[オフィシャルブログ]
http://www.red-lang.org/

[Githubリポジトリ]
https://github.com/red/red

## どんな言語？
公式ブログの「About」に特徴が記載されていますが、たくさんありすぎるので一部だけ抜粋して翻訳

* 同図象性を持つ
* 関数型と命令型のスタイル、かつリアクティブでシンボリック
（シンボリックが何を意味するのかはまだよく分かっていません）
* スクリプトのようにも使えるし、ネイティブコードにコンパイルも可能
* クロスプラットフォーム
* 強力なPEGパーサーによるDSL？（ちょっと訳がおかしいかもしれません）
* 楽しい

など。
最後の「楽しい」は、ちょっと触ってみた感じでは私はわりと面白いと感じてます。
メジャーなオブジェクト指向言語とは全く趣が違うので、新鮮です。

Windows、Mac、Linuxいずれもサポートしているようですが、各種記事を見ている感じではたぶん一番サポートされているのはWindows？なような気がします。
Mac版とLinux版については試していなくて詳しくはわからないのですが、Linuxの何かのディストリビューションに同梱されることになったらしい？[^1]

## インストール
インストールと言っても以下のダウンロードページから、exeをダウンロードするだけです。
http://www.red-lang.org/p/download.html

2016年8月21日現在、最新の安定版はVer0.6.1のようですが、私は上記のサイトの一番下の「Latest Build」の方を使っています。
最近大きな機能追加がたくさん入っているようなので、そちらで遊んでいます。

ダウンロードしたexeは安定版だと「red-XXX.exe（XXXはバージョン番号）」、Latest Buildだと「red-latest.exe」となっていますが、公式ページ上ではバージョン抜かして「red.exe」と呼称しているので、本記事でもそちらに習います。

ダウンロードしたred.exeをダブルクリックすると、コンパイルが始まります。
コンパイルが完了すると「Red Console」が起動します。
次回以降はred.exeを実行するとすぐにRed Consoleが起動しますが、どうやら「C:¥ProgramData¥Red」フォルダ内の「gui-console-XXXX-XX-XX-XXXXX.exe」が実行されているようです。


## コードの実行の仕方
### REPLから
Red ConsoleはいわゆるREPLで、コードを打ち込んでEnterすることですぐに結果を確認できます。Hello Worldするには「print "Hello World"」と打ってEnterすればOKです。
### スクリプトファイルから
Redのコードを書いた拡張子「.red」のファイルを「gui-console.exe」にドラッグアンドドロップすると、実行できます。
### コンパイルする
red.exeで拡張子「.red」のファイルをコンパイルするとexeが作成されるので、それを実行することもできます。
コンパイルは以下のような要領でコマンドプロンプトなどから、red.exeに「-c」をつけて、コンパイル対象のファイル名を渡せばOKです。

> C:\ProgramData\Red>red-latest.exe -c "C:\ProgramData\Red>\test.red"

なお、プラットフォームなどに合わせて細かい引数の調整が必要です。

## とりあえずサンプル
構文の説明とかを書き連ねてもあまり面白くないし、Hello Worldだけしても言語の雰囲気が分からないので、とりあえずサンプルプログラムを書いてみました。

``` check-folder-or-file.red
Red []

dir: request-dir
files: read dir

show-file-or-folder: func [ files [block!] ] [
	foreach file files [
		print [form file "is" either dir? file ["folder"] ["file"] ]
	]
]

show-file-or-folder files
```

勉強始めたばかりなのでこれがRed的にイケてるコードなのかちょっと自信ありませんが…

実行するとフォルダの選択ダイアログが表示されて、指定したフォルダの中身を列挙します。ついでに中身がフォルダなのかファイルなのかを一緒に出力してみました。
長くなったのでコードの説明はまた次回に…

前述の３つの方法のいずれでも動作させられますが、gui-console.exeにドラッグアンドドロップするのが一番楽だと思います。

[^1]: 以下のツイートでの情報。https://twitter.com/red_lang/status/761222374003838976?lang=ja
php5.4 以下で php5.5 の関数を使う（polyfill）

# php5.4 以下で php5.5 の関数を使う（polyfill）

## 前置き

`array_column` , `password_hash` とかそういうのを php5.4 以下でも使えるようにする話。
※ polyfill っていうと js なイメージがあるのはなんでなんだぜ？

php5.4 自体のサポートは切れていますが、RHEL/CentOS 7 がサポートしているので、まだ使う機会は多いんじゃないかと思ってます。

お手製 polyfill をどこかにまとめて UP しようとしたら既に Symfony が 公開していたので紹介します。

## symfony/polyfill

[github](https://github.com/symfony/polyfill)
[packagist](https://packagist.org/packages/symfony/polyfill)

php5.5 に限らず、様々な polyfill をまとめ上げたパッケージです。
有用だと思いますが、今私が欲しいのは 5.5 の関数群だけなので割愛。

## symfony/polyfill-php55

[github](https://github.com/symfony/polyfill-php55)
[packagist](https://packagist.org/packages/symfony/polyfill-php55)

上記の symfony/polyfill の中でも使われている、php5.5 用の単独パッケージです。
これを使います。

## インストール

普通の composer 利用でOK.

```json:composer.json
"require": {
  "symfony/polyfill-php55": "*"
}
```

ソースを見るとわかりますが、 `autoload/files` が指定されているため、特別なことはしなくてもグローバルに定義されます。

## 確認

```php:test.php
require_once "vendor/autoload.php";

// バージョン確認
echo 'PHP_VERSION:     ', PHP_VERSION, PHP_EOL;

// password_*
$hashed = password_hash('hoge', PASSWORD_DEFAULT);
echo 'password_hash:   ', $hashed, PHP_EOL;
echo 'password_verify: ';
var_dump(boolval(password_verify('hoge', $hashed)));

// array_coloumn
echo 'array_column:    ';
print_r(array_column([
    [
        'a' => 'hoge',
        'b' => 'key1',
    ],
    [
        'a' => 'fuga',
        'b' => 'key2',
    ],
    [
        'a' => 'piyo',
        'b' => 'key3',
    ],
], 'a', 'b'));
```

```:出力
PHP_VERSION:     5.4.44
password_hash:   $2y$10$KPVQTltfGoFpLwMtKsOvm.MFqxmwVqWJsmUR/KwJRMRCMnIlDCGp.
password_verify: bool(true)
array_column:    Array
(
    [key1] => hoge
    [key2] => fuga
    [key3] => piyo
)
```

ちゃんと動いてますね。

内部でphpバージョンを見たり function_exists してたりするので php 自体がバージョンアップされても少なくともエラーになったりはしないと思います。

あくまで関数を定義しているだけなので `::class` 構文とか Generator(yield) とかが使えるわけではないですが、十分有用でしょう。
Swift 3.0のRangeまとめ

Swift3.0でSwift2.2までのRangeと仕様が変わりました。
日本語ドキュメントが少なくSwift3へのマイグレーションに迷った部分があるので、まとめておきます。
Xcode 8.0 beta6で確認しています。

# サマリ
- Proposal: [A New Model for Collections and Indices](https://github.com/apple/swift-evolution/blob/master/proposals/0065-collections-move-indices.md)
- 閉区間が実装された
- 端の値はBoundで取得する
- 同じ型名(Range)でもSwift3.0ではfor-inとかで使えない

# Swift2.2からの変化

## 閉区間
Swift2.2ではRangeは開区間のみの表現となっていましたが、3.0で閉区間の実装が追加されています。

```swift
let x = 1...10
```
上のコードで初期化すると下記の様な違いが出ます。Swiftユーザには2.2までの仕様はよく知られたものだと思いますが、3.0で閉区間が実装され仕様変更されています。
また、閉区間の実装に合わせてstartIndex、endIndexの挙動が変わります。
これまでは閉区間でも開区間でも、```Range<T>```のTで取得できましたが、3.0からは```ClosedRangeIndex<T>```という型の構造体が返却されます。
T型で値を取得する場合は、これまでの取得方法に変わり、Boundプロパティで取得できます。

|-|2.2|3.0|
|:-:|:-:|:-:|
|型|```Range<Int>```|```CountableClosedRange<Int>```|
|値|1..<11|1...10|
|count|10|10|
|startIndex|1|```ClosedRangeIndex<T>```|
|endIndex|11|```ClosedRangeIndex<T>```|
|upperBound|-|1|
|lowerBound|-|10|

この```ClosedRangeIndex<T>```への操作方法は追々細かく見ていこうと思います。
公式ドキュメントは[ここ] (https://developer.apple.com/reference/swift/countableclosedrange)。

## 開区間

```swift
let x = 1..<10
```
開区間は型の変更のみで、初期化される値や取得できる値に変更はありません。

|-|2.2|3.0|
|:-:|:-:|:-:|
|型|```Range<Int>```|```CountableRange<Int>```|
|値|1..<10|1..<10|
|count|9|9|
|startIndex|1|1|
|endIndex|10|10|
|upperBound|-|1|
|lowerBound|-|10|

## CountableじゃないRange

Countableじゃないものも用意されているので一応紹介しておきます。

```swift
let x = ClosedRange(uncheckedBounds: (1, 10))
let y = Range(uncheckedBounds: (1, 10))
```

特に気をつけなければいけないのは、同じ型名でもSwift3.0ではRangeがSequenceプロトコルに準拠しないようになっているため、for-inやforEachで使えなくなっています。意識して使い分ける必要があります。
bash on Windowsでjupyterを動かすときにちょっとハマった

インストールは簡単だったが動かなかったJupyterの設定方法。
カーネルが落ちるという場合はlibzmq3の修正パッチで対応する下記ももしかするとこちらも参考になると思います。
http://qiita.com/ytakashina/items/0a99b78dbfe160c28ee0
元ネタ：https://github.com/Microsoft/BashOnWindows/issues/185

# 起動しないという課題
bash on Windowsは基本的にUbuntu環境なので、pipまでインストールできればJupyterをインストールするのは難しくありませんでした。
基本的な流れは下記にあるとおりです。
http://qiita.com/taka4sato/items/2c3397ff34c440044978

起動してみますとこんな「ポートが使われている」というエラーが出ます。

```
$ jupyter notebook
[W 23:02:29.351 NotebookApp] WARNING: The notebook server is listening on all IP addresses and not using encryption. This is not recommended.
[I 23:02:29.398 NotebookApp] The port 3000 is already in use, trying another port.
[I 23:02:29.398 NotebookApp] The port 3001 is already in use, trying another port.
[I 23:02:29.398 NotebookApp] The port 3002 is already in use, trying another port.
[I 23:02:29.398 NotebookApp] The port 3003 is already in use, trying another port.
・・・
```

# 問題の本質

問題は設定にあったようです。

```
c.NotebookApp.ip = '*'
```

こう書くと、pythonのtornado（webサーバ）が中で動くんですが、そいつがどうもIPv6をデフォルトとして起動するようです。
bash on Windows はまだIPv6への対応が甘いんでしょうか、それとも私のネットワーク環境がIPv4しか対応していないのでしょうか。
いずれにしろ、下記にもあるとおりIPv6じゃなくIPv4であることを明示すればよいらしいです。
https://github.com/ocsigen/ocsigenserver/issues/104


よって設定を下記に変更します。

```
#c.NotebookApp.ip = '*'
c.NotebookApp.ip = '127.0.0.1'
```


そうすると動きます。

```
$ jupyter notebook
[I 23:08:18.647 NotebookApp] Serving notebooks from local directory: /****/tensorflow
[I 23:08:18.649 NotebookApp] 0 active kernels
[I 23:08:18.649 NotebookApp] The Jupyter Notebook is running at: http://127.0.0.1:3000/
```

以上
開発ツールリンク

開発で使用するツールのDLリンクメモ

- IDE、エディタ
 -  [eclipse(Pleiades)](http://mergedoc.osdn.jp/)
 -  [STS(Spring Tool Suite)](https://spring.io/tools/sts)
 -  [Visual Studio Code](https://code.visualstudio.com/)
 -  [サクラエディタ](http://sakura-editor.sourceforge.net/download.html)
 -  [秀丸](http://hide.maruo.co.jp/software/hidemaru.html)

***

- バージョン管理ツール
 -  [Git](https://git-scm.com/)

***

- Webフロントエンド関連
 -  [Node.js](https://nodejs.org/ja/)
 -  [Vue.js](https://jp.vuejs.org/index.html) (Javascriptフレームワーク)
 -  [ZURB Foundation](https://foundation.zurb.com/) (CSSフレームワーク)

***

- DB
 -  [PostgreSQL](https://www.postgresql.org/)
 -  [pgAdmin](https://www.pgadmin.org/)

***

- 仮想環境
 -  [Docker for Mac](https://docs.docker.com/docker-for-mac/install/)
 -  [Docker for Windows](https://docs.docker.com/docker-for-windows/install/)

***

- Diffツール
 -  [DF](http://www.vector.co.jp/soft/dl/win95/util/se113286.html)
 -  [Win Merge](http://www.geocities.co.jp/SiliconValley-SanJose/8165/winmerge.html)

***

- 端末エミュレータ
 -  [Teraterm](https://ja.osdn.net/projects/ttssh2/)
 -  [WinSCP](https://ja.osdn.net/projects/winscp/)
 -  [Putty](http://www.putty.org/)
 -  [Rlogin](http://nanno.dip.jp/softlib/man/rlogin/)

***

- キャプチャ―ツール
 -  [Screen Presso](https://www.screenpresso.com/)

***

- ER図ツール
 -  [A5-SQL-Mk-2](http://a5m2.mmatsubara.com/)

***

- その他
 -  [IPMsg (IPアドレスを利用したメッセンジャーツール)](http://forest.watch.impress.co.jp/library/software/ipmsg/)
 -  [Mouse without Borders (複数のWindows端末でマウス、キーボードを共有するツール)](http://forest.watch.impress.co.jp/library/software/mouswithout/)
UbuntuのブートUSB作成 (usb-creator を使用)

# まえがき
Ubuntu上でUbuntuのブートUSB作成を作成する方法です．
「ubuntu usb ブート　作成」とかでググるとUnetbootinを使った方法が上位に出てきますが，今回はusb-creatorを使ったもう少し簡単（？）な方法を紹介します．
usb-creatorはプリインストールされていると思いますが，以下のコマンドでインストールできます．
> sudo apt-get install usb-creator-gtk

# 事前準備
予めUbuntuの公式ホームページからUbuntuのイメージファイル(iso)をダウンロードしておきましょう．
[Ubuntu公式ホームページ](https://www.ubuntulinux.jp/)
当然ですが，Ubuntuがすでに動いているパソコンとusbメモリが必要です．

# ブートUSBの作成
usbメモリをパソコンに差し込み，usb-creatorを起動します．
> usb-creator-gtk

下のような画面になったらダウンロードしたisoファイルとusbメモリを選択して，ブータブルUSBの作成をクリックします．

![usb_creator.png](https://qiita-image-store.s3.amazonaws.com/0/122682/7bd29df4-43ea-b6b3-d7ad-602ccbf64ac8.png)

私の場合，54%のところでしばらく止まったあと，パスワードの入力を求められました．
その後今度は99%のところでまた止まりましたが，しばらくすると無事完了しました．

これでブートUSBの完成です．

（[ubuntu documentation](https://help.ubuntu.com/community/Installation/FromUSBStick)を参考にしました)
EC2でインスタンスを立ててからsshするまでのメモ

### 前提
* EC2でインスタンスを立てて.pemをダウンロードした（foo.pemとする）
* Elastic IPを割り当てた（12.345.678.910とする）

ローカルPCでssh用の鍵を作成して、公開鍵をec2-userのホームにコピー

```bash
$ ssh-keygen -f ~/.ssh/id_rsa_hoge
$ scp -i foo.pem ~/.ssh/id_rsa_hoge.pub ec2-user@12.345.678.910:~/
id_rsa_hoge.pub
```
EC2にSSH接続して公開鍵がコピーされているか確認

```bash
$ ssh -i foo.pem ec2-user@12.345.678.910
Last login: Sun Aug 14 08:47:20 2016 from kd175130114177.ppp-bb.dion.ne.jp

       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-ami/2016.03-release-notes/
15 package(s) needed for security, out of 20 available
Run "sudo yum update" to apply all updates.
[ec2-user@ ~]$ ls
id_rsa_hoge.pub
```

### ユーザーを作成して公開鍵を登録

rootユーザーになり、ユーザーを作成、権限を与える

```shell-session
[ec2-user@ ~]$ sudo su -
[root@ ~]# adduser hoge
[root@ ~]# echo "hoge ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/hoge
[root@ ~]# chmod 440 /etc/sudoers.d/hoge
```

コピーした鍵を作成したユーザーの`.ssh/`以下に置く

```shell-session
[root@ ~]# su - hoge
[hoge@ ~]$ mkdir .ssh
[hoge@ ~]$ sudo mv /home/ec2-user/id_rsa_hoge.pub .ssh/authorized_keys
[hoge@ ~]$ sudo chown hoge .ssh/authorized_keys
[hoge@ ~]$ sudo chmod 600 .ssh/authorized_keys
[hoge@ ~]$ sudo chmod 700 .ssh/
```

### SSHでログイン

ローカルPCの`~/.ssh/config`に以下を追加

```
Host AAA
  User hoge
  HostName 12.345.678.910
  IdentityFile ~/.ssh/id_rsa_hoge
  IdentitiesOnly yes
```

これでSSHでログインできる

```bash
ssh AAA
Last login: Sun Aug 14 08:47:20 2016 from kd175130114177.ppp-bb.dion.ne.jp

       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-ami/2016.03-release-notes/
15 package(s) needed for security, out of 20 available
Run "sudo yum update" to apply all updates.
[hoge@ ~]$
```

ちなみに新しく鍵を作らなくてもec2-userのauthorized_keyをコピー、~.pemを秘密鍵として使っても可能ですが、自前で作った方がそれっぽいのでそうしています

### 新しいユーザーを追加するとき
管理する人が増えたとかで他の人にもサーバーに入ってもらう必要があるとき

ローカルPCで鍵を作ってもらう

```bash
$ ssh-keygen -f ~/.ssh/hoge_rsa # 鍵の名前は任意
$ cat ~/.ssh/hoge_rsa.pub
```
公開鍵の内容をサーバーにアクセスできる人に共有する

ユーザーを作って公開鍵の内容を登録する

```shell-session
[user@~]$ sudo su -
[root@~]# adduser hoge
[root@~]# echo "hoge ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/hoge
[root@~]# chmod 440 /etc/sudoers.d/hoge
[root@~]# mkdir /home/hoge/.ssh
[root@~]# echo "公開鍵の内容" > /home/hoge/.ssh/authorized_keys
```

ローカルで`~/.ssh/config`を編集
完了


### 参考
* [http://www.task-notes.com/entry/20150816/1439694000](http://www.task-notes.com/entry/20150816/1439694000)
Vagrant超入門 ~ 5分でcentOSを手に入れよう


## はじめに

* [Vagrant](https://www.vagrantup.com/)とは、rubyで書かれた仮想マシンを作る為のCIツール
* VirtualBox等の仮想マシンをCIツールで簡単に扱いやすくするものです
* `等` と言っているのは、他にもVMWareや、Amazon EC2等の仮想マシンも扱えるためです

※ なお、本記事ではvagrantを導入する際に良く遭遇(するであろう)２つのエラーの対処法についても記載しています。これ以外のエラーが出た場合などは教えていただけると幸いです。


## 準備

* 1. [VirtualBox](https://www.virtualbox.org/)のインストール
* 2. [vagrant](https://www.vagrantup.com/)のインストール

## 仮想マシンをvagrantで立ち上げる

公式サイトに、Boxの一覧が配布されてるので好きなBoxを選びます。
https://atlas.hashicorp.com/boxes/search

今回は[centOS7](https://atlas.hashicorp.com/centos/boxes/7)を使ってみようと思います。

ここに、使っている仮想マシン管理アプリ毎の導入方法が書いてあるのでそれを実行します。
(自分はVirtualBoxを使っているので、下記手順を使います)

![スクリーンショット_2016-08-21_12_30_00.png](https://qiita-image-store.s3.amazonaws.com/0/23276/ab783d35-3ca2-7f34-68d2-5deb3e15e144.png "スクリーンショット_2016-08-21_12_30_00.png")


## 仮想マシンの立ち上げ

#### 初期化すると、centos用のVagrantfileが作られる

```
$ vagrant init bento/centos-6.7
$ ls
Vagrantfile
```

#### 仮想マシンを起動します

(--providerは、どの仮想化ソフトを使うかを指定してます)

`$ vagrant up --provider virtualbox`

しばらく時間がかかりますが、完了します。

わずか数分でcentosを自分のmacOS上に作れるなんて最高です。

### 補足1

この際、`Timed out while waiting for the machine to boot..`のようなエラーが出る場合があります。
これはvagrant1.8.5のバグで、1.8.6で修正されるようですが、それまでは下記の方法で解消することが出来ます。

http://qiita.com/306_san/items/939eac30439210fb6e4e#_reference-7fcb1b1ade801ab782bb

### 補足2

基本的に、vagrantは仮想マシンを立ち上げると、ホストOSのVagrantfileがあるディレクトリと、ゲストOS側の`/vagrant`が共有されます。

しかし、下記のようなエラーが出て、ディレクトリの共有がうまくいかない場合があります。

```
Vagrant was unable to mount VirtualBox shared folders. This is usually
because the filesystem "vboxsf" is not available. This filesystem is
made available via the VirtualBox Guest Additions and kernel module.
Please verify that these guest additions are properly installed in the
guest. This is not a bug in Vagrant and is usually caused by a faulty
Vagrant box. For context, the command attemped was:

set -e
mount -t vboxsf -o uid=`id -u vagrant`,gid=`getent group vagrant | cut -d: -f3` vagrant /vagrant
mount -t vboxsf -o uid=`id -u vagrant`,gid=`id -g vagrant` vagrant /vagrant

The error output from the command was:

/sbin/mount.vboxsf: mounting failed with the error: No such device
```

この場合、一度ゲストOSにログイン(既に仮想マシンの立ち上げには成功しているのでログインは可能です)して、	カーネルのバージョンアップと、必要なパッケージのインストールで解決出来ました。

私は下記記事の、`対処法その3：vboxをリビルドする`の部分を実行することで解決しました。

http://qiita.com/wakaba260/items/b5c87b7815b710f303a0


```
$ sudo yum -y update kernel
$ sudo yum -y install kernel-devel kernel-headers dkms gcc gcc-c++
```

この後、一度ゲストOSを出て、`vagrant reload`か、`vagrant halt` > `vagrant up`で、うまくできているはずです。


## 仮想マシンに接続

仮想マシンに接続すうのも非常に簡単です。
`Vagrantfile`が置いてあるディレクトリで、`vagrant ssh`とするだけでOKです。

```
$ vagrant ssh
[vagrant@localhost ~]$ whoami
vagrant
```

簡単ですね。因みにデフォルトでは`vagrant`というユーザでログインし、パスワードは`vagrant`です。

### まとめ

* vagrantを使って、好きなOSを導入する事が出来た
* よくあるエラーに対応出来た
* 次回、よくあるlamp構成をvagrantを使って楽ちんに構成する方法の記事を上げます
Add Bash to Context menu on Windows 10

This bash feature only on Windows 10 Anniversary. If you haven't updated yet, go update your Windows 10 first.  
After that, activate the bash on 
``` Control Panel -> Program -> Turn Windows features on or off -> Windows Subsystem for Linux
```
If you already did that, Windows need to restart your computer to install the bash for you. 
Login to your desktop and create these 2 files. 

```registry:bash_contextMenu-Enable.reg
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Directory\Background\shell\bash]
@="Bash here"
"Icon"="%USERPROFILE%\\AppData\\Local\\lxss\\bash.ico,0"

[HKEY_CLASSES_ROOT\Directory\Background\shell\bash\command]
@="c:\\windows\\system32\\bash.exe"

[HKEY_CLASSES_ROOT\Directory\shell\bash]
@="Bash here"
"Icon"="%USERPROFILE%\\AppData\\Local\\lxss\\bash.ico,0"

[HKEY_CLASSES_ROOT\Directory\shell\bash\command]
@="cmd.exe /c pushd \"%V\" && c:\\windows\\system32\\bash.exe"
```

```registry:bash_contextMenu-Disable.reg
Windows Registry Editor Version 5.00

[-HKEY_CLASSES_ROOT\Directory\Background\shell\bash]
[-HKEY_CLASSES_ROOT\Directory\shell\bash]
```

And then, double click to **bash_contextMenu-Enable.reg** to add **bash to context menu**.
If you wanna remove that from the context menu just double click on **bash_contextMenu-Disable.reg**

Now go try to Right Click on your Desktop you will see **Bash here**
EmacsでのElixir開発環境事始め(Mac)

# 取りあえずさっくりとEmacsでの環境を必要最小限で整えてみる
とは言っても、ほぼpackage-installするのみだが。。。一応メモとして残しておく
**前提としてauto-completeとflycheckが導入済みのこと**

## お約束のmode [Elixir-mode](https://github.com/elixir-lang/emacs-elixir)
``` emacs-lisp
M-x package install (RET)
elixir-mode (RET)
```

## コード補完 [alchemist](https://github.com/tonini/alchemist.el)
``` emacs-lisp
M-x package install (RET)
alchemist (RET)
```

## コード補完をauto-completeで [ac-alchemist](https://github.com/syohex/emacs-ac-alchemist)
``` emacs-lisp
M-x package install (RET)
ac-alchemist (RET)
```

## 文法チェック [flycheck-elixir](https://github.com/lbolla/emacs-flycheck-elixir)
``` emacs-lisp
M-x package install (RET)
flycheck-elixir (RET)
```

## init.elに追加した記述
```emacs-lisp
(require 'elixir-mode)
(require 'alchemist)
(require 'flycheck-elixir)
(add-to-list 'elixir-mode-hook 'ac-alchemist-setup)
```

## Emacsの設定
init.elをセーブして

```emacs-lisp
eval-buffer (RET)
````

## 動作確認
こんなコードを書いてみて、途中で補完候補やらなんやら出てくれば多分稼働している。

```elixir
IO.puts "Hello, Elixr!"
```

### おまけ
[quickrun](https://github.com/syohex/emacs-quickrun)が入っていれば、上記コードはさっくりとM-x quickrunで実行出来た。

以上
Rails4 Parameters レイヤーを追加してみる

# 動機
Rails4では、StrongParameterが採用され、コントローラに、permit処理を書く、というのがよくやるパターンです。(scaffoldもそうなっている)べつにこのままでもよいのですが、__入力を受け取りmodelとviewへの命令に変換する__というMVCにおけるコントローラ責務を考えてみたとき、__リクエストパラメータを検証する__ことは、責務として切り出しておいてもおかしくはなさそうです。特に
- コントローラが肥大化してきた
- 何か権限に基づいて、許容するパラメータを変更したくなったりして、permit処理にロジックが入り込む

などでコードの見通しが悪くなったり

- 名前空間をきって同じリソースを扱うコントローラを複数つくったが、permit処理は同じものを使いたい、けどコードが重複してしまう

といった場合にはなんらかの形で切り出したいと思ってしまいます。

 __共通化したいならconcernsに書けば？？？？？__


というご指摘もあるんですが、今回は、

__パラメータ検証する__という責務を__コントローラから切り出す__

ということにチャレンジしてみたいと思います。私が行っているプロジェクトで採用してみて、粉の設計判断がどういう結果をもたらすか、検証してみたいと思います。

いろいろご指摘などいただけると幸いです！


# 設定
app配下にparametersをつくります。その際、アプリケーションが自動でファイルを読み込めるように以下の設定を追加します。

```rb:application.rb
module SampleProject
  class Application < Rails::Application
    # Settings in config/environments/* take precedence over those specified here.
    # Application configuration should go into files in config/initializers
    # -- all .rb files in that directory are automat"ically loaded.

    config.autoload_paths += %W(#{config.root}/app/parameters)

```

#実装　
イベント(Event)という
 - タイトル(title)
 - 開始時刻(start_datetime)
 - 終了時刻(end_datetime)
 - 本文(content)
いうデータをもつリソースを扱うコントローラを考えます。
イベントは、コミュニティ（community）ごとに登録/編集することができ、またユーザのダッシュボード画面でも編集することができます。

このような、要件を満たすものを作る場合、以下のようなルーティングで、それぞれコントローラを割り当てます


```rb:routes.rb
  resource :user_account do
    namespace :user_accounts do
      resources :events do
      end
    end
  end

  resources :communities do
    resources :events do
    end
  end


```

```rb:event_parameter.rb
class EventParameter
  def self.create(params)
    params.require(:event)
      .permit(:title, :content, :start_datetime, :end_datetime)
  end
end

```


```rb:app/controllers/user_accounts/event_controller.rb
class UserAccounts::EventsController < ApplicationController  
  def update
    respond_to do |format|
      if @event.update(EventParameter.create(params))
      ....
  end
  .....
end
```

```rb:app/controllers/events_controller.rb

class EventsController < ApplicationController

  def create
    @event = Event.new(EventParameter.create(params))
    ....
  end
end
```

すっきりしましたね！！！
IPアドレス管理OSS phpIPAMインストール手順

# phpIPAMインストール手順

自宅サーバのVMのIPアドレスの管理をRedmineのWikiで行っていたが、
VMの台数が増えてきて管理がわずらわしくなってきたので、そろそろ
phpIPAMを使おうと思う。今回はphpIPAMのインストール手順をメモする。

## インストール環境

OS:CentOS 6.8
Version:phpipam-1.2.1

## 公式サイト

* [phpipam – Open source IP address management](http://phpipam.net/)

## 参考にしたサイト

* [IPアドレス管理OSS「phpipam」インストール編](http://take-she12.hatenablog.com/entry/2016/01/23/100000)

## インストール手順

1. phpipamをダウンロード  
<pre>
cd /var/tmp/
curl -L -o phpipam-1.2.1.tar http://sourceforge.net/projects/phpipam/files/latest/download
</pre>
2. phpipamをDocumentRootへ配置  
<pre>
tar xvf phpipam-1.2.1.tar
mv /var/tmp/phpipam /var/www/html/
</pre>
3. 必要なモジュールをインストール  
<pre>
yum -y install php php-gd php-mbstring php-mysql php-pear mysql-server httpd
</pre>
4. 設定ファイルをバックアップ  
<pre>
cp -pi /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.org
cp -pi /etc/my.cnf /etc/my.cnf.org
cp -pi /etc/php.ini /etc/php.ini.org
cp -pi /var/www/html/phpipam/config.php /var/www/html/phpipam/config.php.org
</pre>
5. chkconfigの設定  
<pre>
chkconfig httpd on
chkconfig mysqld on
</pre>
6. my.cnfの character-set-server を UTF8にする  
<pre>
vi /etc/my.cnf
character-set-server = utf8
</pre>
7. php.ini の data.timezone を Asia/Tokyo にする  
<pre>
vi /etc/php.ini
date.timezone = Asia/Tokyo
</pre>
8. サービス起動  
<pre>
service mysqld start
service httpd start
</pre>
9. mysqlの初期設定  
ここでは例としてmysqldのパスワードを'Password'とした。
<pre>
mysql -uroot -e "set password for root@localhost=password('PassWord');"
</pre>
10. DocumentRootのパーミッションを設定  
<pre>
chown -R apache:apache /var/www/html/
</pre>
11. config.phpでパス修正  
<pre>
vi /var/www/html/phpipam/config.php![phpipam_3.png](https://qiita-image-store.s3.amazonaws.com/0/43280/e3102af9-7c23-b944-551b-4e3d3823b0a5.png)

+define('BASE', "/phpipam/");
-define('BASE', "/");
</pre>
12. DocumentRootの/var/www/html/のAllowOverrideをAllにする  
<pre>
vi /etc/httpd/conf/httpd.conf
AllowOverride All
</pre>
13. Webブラウザからphpipamのインストール画面にアクセスする  
<pre>
http://IPアドレス/phpipam/install/
</pre>
14. 管理画面の操作    
1.の Automatic Database Installationを選択  
![phpipam_1.png](https://qiita-image-store.s3.amazonaws.com/0/43280/d9accb2d-6704-69e6-7b5c-94bb847ed57d.png)
15. Mysqlのusername, passwordを入力    
MySQLにアクセスできる情報となる
<pre>
username: root
password: PassWord
host: localhost
database name: phpipam
</pre>
![phpipam_2.png](https://qiita-image-store.s3.amazonaws.com/0/43280/71da1149-5679-23f8-fad2-aaedf8bc8b46.png)
16. デフォルトのログインIP、パスワードを確認  
READMEに記載されているもの 
<pre>
Default uaer
============
Admin / ipamadmin
</pre>
17. phpipamにログインする  
以下のusername, passwordでログインする  
<pre>
username: Admin
password: ipamadmin
</pre>
![phpipam_3.png](https://qiita-image-store.s3.amazonaws.com/0/43280/6dabd34e-39f3-71ef-1f86-e6d234c9b998.png)
18. ログインを確認  
phpipamにログインできたことを確認  
![phpipam_4.png](https://qiita-image-store.s3.amazonaws.com/0/43280/27661d7e-4ab3-2578-e554-a8338e66e710.png)
社内発表

発表

__LT第一弾__

__■基本のキ__

ここ数年の業務で気になったこと
(新人の様なレベルの低い話で、面白くないことですが)

__その一__

業界経験が数年はある人なのに、クローズ処理が出来ていない。
例えば、DBやファイルをOPENした時に、例外が発生しても
必ずクローズするようなコーディングをしていない。

これは、非常にまずい。
(個人的には、自分の会社の人が、やっていたら
恥ずかしいと思ってしまう。)

このリソース解放のケースでは、次の2つの事例が、有名です。
それは、岡崎図書館事件とアメリカの航空会社のシステム障害です。

岡崎図書館での(三xxxxx株式会社による)
図書検索プログラムでは、DBセッションをクローズせずに
ASPセッションがタイムアウトするまでの間（620秒位
閉じられることなく(使いもしないのに)占有されていました。

その間に新しい閲覧者（ブラウザが）接続してくると
次々新しいDB接続が確保され、その最大数に達すると、
それ以上のアクセスを受付けなくなってしまう。

つまり、ASPがタイムアウトで勝手に閉じてくれることを
期待していたわけです。
あまりよろしくは無いが、webで公開せずに
館内端末のみをクライアントとしていたならば
この問題は起きなかったのです。
(無駄にセッションを保持するのは、リソースの無駄遣いなので
どちらにしても良くないが。。。)

こんなことが、自社で起こったら、もうxxxx社員とは
口外できないです。恥ずかしすぎます。

この件については、これだけではなく、問題山盛りですが省略します。

岡崎図書館HP大量アクセス事件について
http://p9.hatenablog.com/entry/20100822/1282405120
専門家(高木浩光氏)の分析
http://takagi-hiromitsu.jp/diary/20100821.html

***

もう一つのアメリカの航空会社では、数千人が足止めとなり
最終的に数十万ドル(数千万円)の損害が出た。
(バグの内容については、少し同情の余地があり
技術的に素人とまでは言えないミスではあります。)

以下、本のネタばれ注意!!

世界を股にかける数十億ドル規模の巨大航空会社をストップさせたバグ
http://www.gesource.jp/weblog/?p=682

どうですか?
分かりますか?

```java
package com.example.cf.flightsearch;
…
public class FlightSearch implements SessionBean {
  private MonitoredDataSource connectionPool;
  private List lookupByCity(…) throws SQLException RemoteException {
    Connection conn = null;
    Statement stmt = null;
    try {
      conn = connectionPool.getConnection();
      stmt = conn.createStatement();
      // 検索のロジックを実行して、
      // 結果のリストを返す
    } finally {
      if (stmt != null) {
        stmt.close();
      }
      if (conn != null) {
        conn.close();
      }
    }
  }
}
```


この本に事例が載っています。
https://www.amazon.co.jp/Release-%E6%9C%AC%E7%95%AA%E7%94%A8%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E8%A3%BD%E5%93%81%E3%81%AE%E8%A8%AD%E8%A8%88%E3%81%A8%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AB-Michael-T-Nygard/dp/4274067491

つづき
http://qiita.com/zeal1483/items/2524c69dfcab29f13636
大量のリスト表示を軽くする方法

## やりたいこと
モンストの図鑑のように大量にオブジェクトをリストで表示するものを作っていた。
モンストで言えば１０００体近くのアイコンが一覧リストになっている。
このようなリスト表示を普通に1000個オブジェクトを配置して，いたら実機で重たいと言われた。
まあ，確かにそうなるよねーということで解決策を考えてみた。

## サンプルを作って見た
https://github.com/taiti0522/ManyObjScrollView

#### Sampleシーン
再生すると大量オブジェクトを軽くして表示しているもの
#### Sample1シーン
大量オブジェクトを何もせずに表示しているもの
#### 軽くした方法 
画面外のオブジェクトはSetActive(false)にする

#### すこし分かりにくい実装をしている部分の解説
+ GridLayoutGroupで一度大量のオブジェクトをSetActive(true)で並べる
+ その後GridLayoutGroupをOFFにする(コルーチン部分)
+ Updateでリストの動きに合わせて必要なオブジェクトだけONにしている
    + 理由はGridLayoutGroupがONだとオブジェクトのON/OFFに合わせて常に並び変えてしまうから
    + Maskを外して，Sceneウィンドウで見ると何しているか視覚的に確認できる


## 結果
表示するだけだと 4ms近くまで負荷がかかる
![スクリーンショット_2016_08_19_12_42.png](https://qiita-image-store.s3.amazonaws.com/0/55446/5f99d3ef-937e-4625-50a0-de418ff40301.png)


軽くすると4msまで行くことはない
![スクリーンショット_2016_08_19_12_45.png](https://qiita-image-store.s3.amazonaws.com/0/55446/1b8a7cf6-ebf9-3aa0-50af-f614936e3f08.png)


他の人達はどう実装しているんだろうか。。。
SwiftでPickerViewを使う


##概要
+ PickerViewを始めて使って見る

##環境
+ Xcode：7.3
+ Swift 2.2

##使用するオブジェクト
+ Picker View
+ Label

##やること
+ Picker Viewで選んだものを Label に表示する

##手順
1. プロジェクト作成
2. UIパーツを配置
2−1. ObjectLibraryからLabelとPickerViewをレイアウト
2−2. LabelはnameLabelとする
2-3. PickerViewはnamePickerviewとする
3. ViewController.swift のコーディング

##コーディング
+ PickerViewDataSource と PickerViewDelegate を追加

```
class ViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate {
```

+ Picker View に表示するリスト作成

```
    var list = ["森永アイス　ラムネバー　ソーダ味","森永アイス　ラムネバー　白桃ソーダ味","赤城乳業ミント","森永Pinoバニラ","森永Pinoアーモンド","森永Pinoチョコ"]
```

+ Picker View のDataSourceとDelegateをselfにする

```
    override func viewDidLoad() {
        super.viewDidLoad()
        namePickerview.dataSource = self//これと
        namePickerview.delegate = self//これ
    }
```
+ Picker View の列を１にする

```
 //Picerviewの列の数は1とする
    func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
        return 1
    }
```
+ Picker View の行数は配列数にする

```
    func pickerView(namePickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return list.count
    }
```
+ 表示する文字列を指定する

```
    func pickerView(namePickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return list.count
    }
    //表示する文字列を指定する
    //PickerViewに表示する配列の要素数を設定する
    func pickerView(namePickerview: UIPickerView, titleForRow row: Int, forComponent component: Int)-> String! {
        return list[row]
    }
    
```
+ Labelに表示する

```
    //ラベル表示
    func pickerView(namePickerview: UIPickerView, didSelectRow row: Int, inComponent component: Int){
        nameLabel.text = list[row]
    }
```



##ソースコード
```
import UIKit

class ViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate {

    @IBOutlet weak var nameLabel: UILabel!
    @IBOutlet weak var namePickerview: UIPickerView!
    
    var list = ["森永アイス　ラムネバー　ソーダ味","森永アイス　ラムネバー　白桃ソーダ味",
                "赤城乳業ミント","森永Pinoバニラ","森永Pinoアーモンド","森永Pinoチョコ"]
    override func viewDidLoad() {
        super.viewDidLoad()
        namePickerview.dataSource = self
        namePickerview.delegate = self
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    //Picerviewの列の数は1とする
    func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
        return 1
    }

    func pickerView(namePickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return list.count
    }
    //表示する文字列を指定する
    //PickerViewに表示する配列の要素数を設定する
    func pickerView(namePickerview: UIPickerView, titleForRow row: Int, forComponent component: Int)-> String! {
        return list[row]
    }
    
    //ラベル表示
    func pickerView(namePickerview: UIPickerView, didSelectRow row: Int, inComponent component: Int){
        nameLabel.text = list[row]
    }

}
```
debian maintainerへパッケージアップロードのパーミッションを与える

https://wiki.debian.org/DebianMaintainer 参照。

## dcut でアップロードできる、らしい
```
$ dcut dm --uid 0xfedcba9876543210 --allow glibc linux --deny kfreebsd9
```

* GPG short ID でいいのかな？まぁkeyringから参照するだけだから大丈夫かな？
* dcut dm ってそんなオプションmanにも無いし、bash completionでも無いよね
    * と、思ったらdputパッケージじゃなくてdput-ngパッケージを入れれば出てくるらしい。えー。
    * しかもdcutのbash completionを間違ってdevscritpsに送って取り込まれちゃってるな。これは削除してもらってdcutパッケージに送り直し or NMUかな。。。

```
devscripts: /usr/share/bash-completion/completions/dcut
```

## Todo
* dcut へbash completion送り直し
* devscriptsにbug登録
ww〜wwwwコマンドを作ってみた


## 内容
wコマンドがあるならww〜wwwwコマンドがあってもいいじゃない。

## 仕様
bashにてコマンド実行時に以下の結果を表示する。

```bash:
$ w
→ (wコマンドの実行結果表示)
$ ww
(*´∀`) ｱﾊﾊ 
$ www
( ﾟ∀ﾟ) ｱﾊﾊ八八ﾉヽﾉヽﾉヽﾉ ＼ / ＼/ ＼ 
$ wwww
┐(´д｀)┌ ﾔﾘｽｷﾞ
```

## 環境

```bash:
$ bash -version
GNU bash, バージョン 4.3.42(1)-release (x86_64-apple-darwin15.0.0)
```

## コマンド作成
aliasを使用。

```bash:
$ alias ww='echo "(*´∀\`) ｱﾊﾊ"'
$ alias www='echo "( ﾟ∀ﾟ) ｱﾊﾊ八八ﾉヽﾉヽﾉヽﾉ ＼ / ＼/ ＼"'
$ alias wwww='echo "┐(´д｀)┌ ﾔﾘｽｷﾞ"'
```

## 実行結果

```bash:
$ w
20:17  up 1 day, 20:38, 2 users, load averages: 1.67 2.43 2.25
USER     TTY      FROM              LOGIN@  IDLE WHAT
TTT      console  -                土07   1day  -
TTT      s000     -                17:19       - w

$ ww
(*´∀`) ｱﾊﾊ
$ www
( ﾟ∀ﾟ) ｱﾊﾊ八八ﾉヽﾉヽﾉヽﾉ ＼ / ＼/ ＼
$ wwww
┐(´д｀)┌ ﾔﾘｽｷﾞ
```


なにやってんだろオレ…。
wikipediaからのページからリンク一覧を取得する方法


###

[PythonによるWebスクレイピング](https://www.amazon.co.jp/Python%E3%81%AB%E3%82%88%E3%82%8BWeb%E3%82%B9%E3%82%AF%E3%83%AC%E3%82%A4%E3%83%94%E3%83%B3%E3%82%B0-Ryan-Mitchell/dp/4873117615)を勉強中。その中に、Wikipediaのページから、その記事に含まれているリンクを取得する。本書に載っているサンプルは英語のページようだったので、日本語のWikipedia用に少し改良。


### 実行環境
OS：OX X EI Capitan(10.11.5)
Python:3.5.1


```python
#codeing:utf-8

import re
from bs4 import BeautifulSoup
from urllib.request import urlopen
from urllib.parse import unquote

url = "https://ja.wikipedia.org/wiki/%E3%83%86%E3%82%A4%E3%83%AB%E3%82%BA_%E3%82%AA%E3%83%96_%E3%82%A4%E3%83%8E%E3%82%BB%E3%83%B3%E3%82%B9"

html = urlopen(url)
bsObj = BeautifulSoup(html,'html.parser')

pattern = re.compile("^(/wiki/)((?!:).)*$")

for link in bsObj.find('div',{'id':'bodyContent'}).findAll('a',href = pattern):
    if 'href' in link.attrs:
        print (unquote(link.attrs['href']))     
```
DropBoxのファイルをダウンロードする。


## 概要
DorpBoxに上がったデータをダウンロードする必要があったため、
書いてみました。その忘備録。（アップロードの記事はたくさんあったけど、ダウンロード関係の記事がネット上になかった。。）

## 環境
Ruby 2.3
OSX 10.11.6 El Capitan

## はじめにやること。
1. DropBoxのアカウント取得
2. DropBoxにアプリの登録とアクセストークンの取得 [参考サイト](http://qiita.com/TakamiChie/items/6b21652afa7018ae6b27)
3. gem install dropbox-sdk

## 成果物

本家のサイトの丸写しです汗

```ruby:DropBox_file_dl.rb

#! usr/bin/env ruby
# coding: utf-8

require 'rubygems'
require 'dropbox_sdk'

APP_KEY = "ここに取得したキーを入力する。"
APP_SECRET = "ここに取得したシークレットキーを入れる。"

flow = DropboxOAuth2FlowNoRedirect::new(APP_KEY, APP_SECRET)
authorize_url = flow.start()

access_token = "ここにアクセストークンを入れる"
client = DropboxClient.new(access_token)

hash = client.metadata(path = "ここにダウンロードしたいファイルのあるパスを入れる。")

#ここは補足を参照してください。
hash.dig("contents").each_index {|i|
  file_path = hash.dig("contents", i, "path")
  contents = client.get_file(file_path)
  fname = File.basename(file_path)
  open(fname, "w") {|f| f.puts }
}

```

## 補足

dropbox_sdkのmetadateメソッドはハッシュで値を取得します。
構造としては以下の通りになっています。[本家のサイト参照](https://www.dropbox.com/developers-v1/core/docs)
"contents"キーの値として、配列が与えられて、さらにその中にハッシュでファイルのメタデータを格納してあります。
そこでHash#digメソッドで"contents"に該当する値を取得して、Array#each_indexメソッドで
配列のインデックスを取得して、Hash#digメソッドでcontentsキーの中の配列に該当するインデックスの要素の中のハッシュの中のpathキーの中のファイルパスを取得しています。
（日本語下手くそですみません。。）

```rb
{
    "size": "0 bytes",
    "hash": "37eb1ba1849d4b0fb0b28caf7ef3af52",
    "bytes": 0,
    "thumb_exists": false,
    "rev": "714f029684fe",
    "modified": "Wed, 27 Apr 2011 22:18:51 +0000",
    "path": "/Photos",
    "is_dir": true,
    "icon": "folder",
    "root": "dropbox",
    "contents": [
        {
            "size": "2.3 MB",
            "rev": "38af1b183490",
            "thumb_exists": true,
            "bytes": 2453963,
            "modified": "Mon, 07 Apr 2014 23:13:16 +0000",
            "client_mtime": "Thu, 29 Aug 2013 01:12:02 +0000",
            "path": "/Photos/flower.jpg",
            "photo_info": {
              "lat_long": [
                37.77256666666666,
                -122.45934166666667
              ],
              "time_taken": "Wed, 28 Aug 2013 18:12:02 +0000"
            },
            "is_dir": false,
            "icon": "page_white_picture",
            "root": "dropbox",
            "mime_type": "image/jpeg",
            "revision": 14511
        }
    ],
    "revision": 29007
}
```

## 終わりに

英語が読めるともっと本家様のサイトを理解できたのではと。本家様のサイトにはmetadataメソッドを使うと返って来る値はhashだよって記載があるのに、これJSON?JSONなの？と恥ずかしい誤解をしていました。。。（ほんと恥ずかしい。。）目指せ英語読解力アップです。
あとはサブルーチンとして、ローカルに落としたファイルを自動分類するとこまでかけたらまずは完成。
駄文失礼いたしましました。
SOCのシリアルポートを使う

MIPSなSOCが入ったルータにはほとんどシリアルポートがあります。これはu-bootの操作やkernelのログを確認するためにあります。

このシリアルポートに[GPS](http://qiita.com/yamori813/items/d9b0a451f1e115de893f#pps%E3%81%AE%E8%A9%B1%E5%8B%95%E3%81%84%E3%81%A6%E3%81%BE%E3%81%9B%E3%82%93)や[Wi-SUN](http://qiita.com/yamori813/items/f0dfedf31b2b51e658f9)などのデバイスを接続して起動するとu-bootが出力した内容に反応したデバイスからの出力でu-bootがハングしたりしてうまく動かなくなる事があります。

SOC自体は2ポートのシリアルを持っている事もありますが、二つ目のポートが出ているケースほとんどありません。

このため以下の様な回路を考えました。

![SERIAL-GATE.png](https://qiita-image-store.s3.amazonaws.com/0/104066/137799e5-941d-1166-6136-484549298f66.png)

GPIOはLEDなどから取り出し、起動後LOの場合は74HC126でHIの場合は74HC125を使うと良いです。74HCなICを使えば3.3Vでも大丈夫です。

シリアルはハイインピーである必要も無く、ANDの応用ロジックでも同じような事ができると思うのですが、考えるのが面倒だったのと手持ちがあったので、3ステートバッファで実現してみました。

これでgpioctlでコントロールするまでシリアルに接続されたデバイスは非アクティブな状態となります。

この他にgettyが起動しないように/etc/ttysのコメントアウトしてkill -HUP 1もお忘れなく。

しかし30年近く同じような事やってるな。。。

追記

consoleのメッセージを別の出力として確認したい場合で、2つuartがある場合は使っていない方をconsoleとしておくのが良いです。

起動後であればconscontrolコマンドでdelete ttyu0するとメッセージは出なくなります。

デバイスのTX,RXの接続ではなく電源をコントロールする方法もあります。きむ茶工房ガレージハウスさんの[トランジスタをマイコン出力のスイッチとして使う方法](http://zattouka.net/GarageHouse/micon/circuit/TR.htm)が参考になります。

GPIOでコンロトールできない場合は電源を遅延させる方法もあります。投入後30秒くらいすればブートからOSに制御が移っているので555などで(マイコンでも良いかも)遅延回路を作って上のスイッチ回路と組み合わせます。この仕組みはリブートはしない事が前提になります。

デバイス側もプログラムできるのであればデバイスがある特定文字列を受け取るまで、全て無視するような仕組みでも良いかもしれません。

ロウテクでスイッチを付けて起動後にONにするという方法もありますね。

RT3050などは二つ目のuartを[pinコントロール](http://qiita.com/yamori813/items/4fcb3a784f13e328917b)で有効にする事もできます。

二つ目のポートはNTPDのセンテンスの受信のようにRXだけでよいケースと、Wi-SUNのように、RX,TX両方必要なケースがあります。

いろいろ調べていたら、二つ目のuartが使えるケースが多くなったので、このように無理やり使うことは無くなりました。
ラベルがアニメーションする一行テキストフォーム

フォーム入力時にラベルをアニメーションさせ、常に表示させるようにした一行テキストフォームです。最近では特に珍しいデザインではありませんが、作成したのでメモ。

## フォームの表示結果
![form2101608_02.png](https://qiita-image-store.s3.amazonaws.com/0/113098/170aa3d4-b21e-1be1-799e-4a4b70d5a741.png)

## フォームの特徴詳細・注意事項
- 配置先要素内の中央に配置（配置先の状態により非確実）
- フォーム内に入力すべき内容を促す文言を薄く表示
- 入力中、「Name」などのラベルはフォーム外上方向へアニメーションしながら移動・小さく表示
- 入力中、「Name」などのラベルとフォームのアンダーラインは色が変わる
- 入力済のフォームからマウスカーソルを外すと、アンダーラインの色だけ元に戻る
- 入力済の状態でブラウザを再読み込みすると、入力した内容はクリアされる
- 「Name」などのラベルは、その文字の長さによってフォーム入力時に要素同士でピッタリ左揃えにはならないため、各<label>タグにclass名を指定して個別にCSSを指定すること。 

## フォームのソースコード / HTML+CSS+jQuery
各プロパティの値はデザインの好みで多少微調整が必要ですが、これで次回からコピペで作れるハズ！ 

```html:HTML
<form>
  <div>
    <input type="text" autocomplete="off">
    <label class="nameform">Name</label>
  </div>
  <div>
    <input type="text" autocomplete="off">
    <label class="idform">ID</label>
  </div>
  <div>
    <input type="text" autocomplete="off">
    <label class="passform">Password</label>
  </div>
</form>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>
<script src="js/index.js"></script>
```
```css:CSS
form {
    font-family: 'ヒラギノ角ゴシック', 'Hiragino Sans', 'ヒラギノ角ゴ ProN W3', 'Hiragino Kaku Gothic ProN', 'メイリオ', 'Meiryo', 'ＭＳ Ｐゴシック', 'MS PGothic', sans-serif;
    width: 300px;
    margin: 20px auto 0;
}
div {
    position: relative;
    margin-top: 18px;
}
input {
    width: 100%;
    font-size: 18px;
    color: #333333;
    font-family: inherit;
    outline:none;
    border: none;
    border-bottom: 1px solid #757575;
    padding: 8px 0 3px 0;
}
label {
    font-size: 18px;
    font-weight: 300;
    color: #bbbbbb;
    position: absolute;
    left: 0px;
    top: 10px;
    pointer-events: none;
    -webkit-transition:all 0.1s ease; 
    transition: all 0.1s ease;
}
input:focus {
    border-bottom: 1px solid #4a89dc;
}
input:focus ~ label,
input.inputted ~ label {
    color: #4a89dc;
    -webkit-transform: scale(0.66);
    -ms-transform : scale(0.66);
    transform: scale(0.66);
    top: -16px;
}
input:focus ~ label.nameform,
input.inputted ~ label.nameform {
    left: -8px;
}
input:focus ~ label.idform,
input.inputted ~ label.idform {
    left: -4px;
}
input:focus ~ label.passform,
input.inputted ~ label.passform {
    left: -14px;
}
```
```js:jQuery
// js/index.js
$(document).ready(function() {
    $('input').blur(function() {
        var $this = $(this);
        if ($this.val())
       	    $this.addClass('inputted');
	else
	    $this.removeClass('inputted');
    });
});
```
C Programming Language Resources

Here is the list of C programming language resources :
<a href="http://www.techcrashcourse.com/2015/05/c-programming-language-tutorial.html">C Language tutorial</a>
<a href="http://www.techcrashcourse.com/2014/10/c-program-examples.html">C Sample Programs for Beginners</a>
<a href="http://www.techcrashcourse.com/2015/11/c-programming-interview-questions-answers.html">C Interview Questions</a>
<a href="http://www.techcrashcourse.com/2015/08/c-graphics-programming-tutorial.html">C Graphics programming</a>
<a href="http://www.techcrashcourse.com/2016/02/c-programming-language-standard-library-header-file.html">C Standard Library</a>
【DIKWモデル】データ/情報/知識/知恵について、ポケモンGOを例にまとめてみた



##なぜこんな記事作ったの？

いろいろな所でちょくちょこ耳にするDIKWモデル。
なんとなく言葉は聞くけれど、内容がイマイチ具体的にわかっていないので、わかりやすくまとめてみました。

Wikipediaにも書いてありますが、英語なのでわかりにくいため、具体例を交えつつ、
わかりやすくまとめていきます。



##DIKWモデルとは


DIKWとは、情報を解釈するためのフレームワーク。

- Data（データ）
- Information（情報）
- Knowledge（知識）
- Wisdom（知恵）

![DIKW_Pyramid.svg.png](https://qiita-image-store.s3.amazonaws.com/0/117147/ea4062b5-9809-5364-74dd-302e01028a9e.png)


#その内容とは

概念的な説明って、いまいち頭には入っても、腹落ちしませんよね、
なので簡単に説明していきます。

Data（データ）

    整理されていない情報。
    いわゆる「生データ」のことです。

Information（情報）

    情報を何らかの基準で整理したものです。
    ○○は△△である。といったようなデータを集計した形式のことです。

Knowledge（知識）

    Information から導き出される法則性のようなものです。

Wisdom（知恵）

    Knowledge を活用して判断する内容になります。
    結局、ここに行き着かないと、人間の価値には成りえず、「使えない状態」といったことになります。

##で、結局なんなの？

わかりにくいと思うので、最近話題のポケモンで例えてみます。

- Data（データ）
    ポケモンごとのパラメータです。ピカチュウのパラメータって何だっけ？といったときに
    「ピカチュウのタイプはでんきタイプで、わざは10万ボルトがあるよ」といった内容です。
    まだ雑多な状態です。


- Information（情報）
    データで確認できた内容を、まとめて検索できる状態にしたことです。
    「ドラゴンポケモンには、カイリューと、ハクリューと、ミニリューがいる」といった検索ができる状態です。
    ポケモンWikiに登録したような状態で、ある程度個のデータは、全体としての状態に整理された形になります。


- Knowledge（知識）
    情報を、観点ごとにまとめると知識になります。
    「CPが高いポケモンは、カイリュー、カビゴン、ラプラス」といった、分析軸ごとの特徴がわかる状態に整理した状態です。


- Wisdom（知恵）
    目的ごとに知識が整理されているのが、知恵の状態です。
「ジムを守っているカビゴンを倒すには、カイリキーのからてチョップ、クロスチョップが効果的」といった内容です。Knowledgeをどう活用するか、といった段階になっています。
    コンサルタントもこの状態だと思います。

***

##おわりに

今回は、DIKWモデルの４つの段階について、まとめてみました。
私なりの解釈なので、おかしな点があれば指摘してください。
Mobaxterm Shift+Insert key paste

mobaxterm を使っていて、いつのまにか
Shift + Insert key でペーストができなくなっていた。

いろいろ、いじっていると直し方がわかりました。

Terminalの上で右クリック
↓
Change terminal settings...
↓
Terminal-->Keyboard-->The Home and End keys
Standardにチェック

これで、キーボードから貼り付けができるようになった。
元体育会信金マンがプログラミングに挑む１（１〜３ヶ月）

※2016年9月2日追記」

５月から英語学習よりプログラミング学習に移行しました。
英語も全く話せない状態からTOEIC750,TOEFL69まで持ってきたので
プログラミングも楽勝と思っていました。

が、思ったとおり壁に、回り道をしました。
英語よりもはるかに高いコンピュータの世界。

一歩一歩積み重ね、挫折しないようにできるようになったことを記録しようと思います。


<h3>&#10004; 16年5月〜8月</h3>
<hr>

コードのブロックを使って、スティーブかアレックスにMinecraftの世界を冒険させよう！<br />(https://code.org/mc)

codecademy(https://www.codecademy.com/)
・html&css 100%
・javascript 80%
・jQuery 80%

その他
・monacaにてアプリ作成「カウントアップ」
・monacaにてアプリ作成「病院待ち人数表示っぽい（ほぼカウントアップ）」

・WEBにフォームを作って送受信まで

・ブログのカスタマイズ
http://mash-tips.hatenablog.com/archive

※ランディングページの作成のお手伝いをさせていただいたので以下の作業を身につけました。
・bootstrapを使用し、レスポンシブ対応のサイト設計
・slickを使用し、スライドの挿入
・jQueryを使用し、画像に動きをつける
・修正でわちゃわちゃしたのでGithubでバージョン管理

※読んだ本
・リーダブルコード
・情熱プログラマー

以上です。
９月はPHPとjavascriptの基礎を学べたらと思います。
Google検索のjsonpでの取得は、今は無料では無理っぽい？【調査メモ】



# 公式に、Google検索結果をJSONPで取得する方法なかったっけ？

ふと、
「あれ？Google検索結果をJSONPで取得できる
　公式のサービス（無料）を以前見かけたような、、、」
と思い直したので調査した。そのメモ。
結論としては
「2016/08の現時点では、ログイン不要で且つ無料な物はたぶん【無い】」
っぽい。
なお、ログイン必要＆有料コースなら【ある】。



# 2010/11/01以前なら、「Google AJAX Search API」が使えたみたい。
しかし、現時点では削除されている様子。

◆Google Web Search API (Deprecated)
https://developers.google.com/web-search/docs/
> The Google Web Search API is officially deprecated as of November 1, 2010. 
> Per our deprecation policy it operated for more than three years past its deprecation date. Its last day of operation was September 29, 2014. 
> We encourage you to investigate the Custom Search API, which may provide an alternative solution.

◆Google Web Search APIは2010/11/1から非推奨となり 2016/04/29で廃止
http://so-zou.jp/web-app/tech/web-api/google/search/web/

上記のAPIの使い方に関する紹介ページは以下（いずれも2014年以前の情報）。
◆Google search APIを使ってサイト内検索をJSONPで実装[1]
http://littleweb.seesaa.net/article/250413837.html

◆Google AJAX Search APIのJSONPを利用したサイト内検索
https://hail2u.net/blog/coding/sitesearch-with-jsonp-of-google-ajax-search-api.html



# 今（2016/08）は「Google Custom Search API」を使う。ただし、要ログイン。
下記のページが分りやすいかった。
無料枠もあるみたいだが「お試し以外では使い物ならない」っぽい。

◆Google Custom Search API を使ってみる
http://qiita.com/megu_ma/items/8cad39f61e35588e5476
> Googleのアカウントは取得している大前提
> Custom Search API の 無料枠 の利用制限は　100リクエスト/日 です。
MiniMagick を使って 2 枚の画像が同一かどうか判定する

[MiniMagick](https://github.com/minimagick/minimagick)

画像編集などに使う [ImageMagick](https://github.com/ImageMagick/ImageMagick) を Ruby から簡単に使えるようにしてくれている Gem です。これを使って 2 枚の画像が同一かどうかを判定します。

# compare 

画像比較には ImageMagick の [compare コマンド](http://www.imagemagick.org/script/compare.php)を使います。

compare は[こんな感じ](http://qiita.com/pekepek/items/9b49a8bd672a463059c0)で、2 枚の画像の差分を出力してくれるコマンドで、以下のように使います。

```
compare image1.png image2.png difference.png
```

`image1.png` と `image2.png` の差分が `difference.png` として出力されます。

この際に `-metric AE` をつけてあげると、差分のピクセル数を出力してくれます。
つまり、値が小さいほど似ている画像ということになります。

試しに以下の 3 枚でコマンドを実行してみます。

|sample1.png|sample2.png|sample3.png|
|:-----:|:-----:|:-----:|
|![sample1.png](https://qiita-image-store.s3.amazonaws.com/0/41416/f6a8795c-6482-2d1b-c17d-07b66779e6bd.png)|![sample2.png](https://qiita-image-store.s3.amazonaws.com/0/41416/eceebf72-d855-3c20-1bd3-5d91f0617a2c.png)|![sample3.png](https://qiita-image-store.s3.amazonaws.com/0/41416/70bb93b6-5c90-7ef5-1615-516ae7ea4082.png)

```
> compare -metric AE sample1.png sample2.png diff.png
=> 4989
> compare -metric AE sample1.png sample3.png diff.png
=> 0
```

`sample1.png` と `sample2.png` は差分が 4989
`sample1.png` と `sample3.png` は差分が 0 になりました。

つまり、`sample1.png` と `sample3.png` は同一画像です。

# `MiniMagick::Tool::Compare`

上記の `compare` コマンドを使うために MiniMagick が用意してくれているインタフェースが `MiniMagick::Tool::Compare` です。

使い方は

```rb
compare = MiniMagick::Tool::Compare.new(whiny: false)
```

でまずインスタンスを作って

オプションを追加したい場合は

```rb
compare.オプション名(オプションの値)
```

引数を与えたい場合は

```rb
comapre << 引数
```

とします。


なので

```
compare -metric AE sample1.png sample2.png diff.png
```

と同じ事をしたければ

```rb
require 'mini_magick'

compare = MiniMagick::Tool::Compare.new(whiny: false)

compare.metric('AE')
compare << 'path/to/sample1.png'
compare << 'path/to/sample2.png'
compare << 'path/to/diff.jpeg'

compare.call

#=> 4989
```

とすれば OK です！

# 同一かどうか判定する

2 枚の画像の path を受け取って、同一か相違か判定する Ruby スクリプトを作成しました。

```rb:judge_same_image.rb
require 'mini_magick'

file1 = ARGV.shift
file2 = ARGV.shift

compare = MiniMagick::Tool::Compare.new(whiny: false)

compare.metric('AE')
compare << file1
compare << file2
compare << 'diff.jpeg'

compare.call do |_, dist, _|
  puts dist.to_i.zero? ? '同一!!' : '相違!!'
end
```

実行すると

```
> ruby judge_same_image.rb sample1.png sample2.png
=> 相違!!

> ruby judge_same_image.rb sample1.png sample3.png
=> 同一!!
```

できた！！
MiniMagick 使いやすくていいですねー
中国旅行に（SIMフリースマホ+香港SIM）設定してみた


家族が中国に行くことになり、SIMフリースマホを使ってテザリング環境を作った時のメモ。

##条件など
1) 中国国内でもtwitter, google, lineなどを使いたい。
2) 音声電話、SMSはほとんど使わない。
3) iPhone(Sim Freeではない)を使いたい。
4) 国内のキャリアはdocomo系のMVNO(AEONモバイル)
5) 滞在は10日程度。

調べてみると、MVNOがデータの国際ローミングは対応していないとのこと。iPhoneはSIMロックがかかっているので、モバイルルータか携帯でテザリングが必要。

海外出張ではレンタル携帯やレンタルモバイルルータが定番。モバイルルータを借りて行って、wifiで接続すれば、「メッセージ」「FaceTime」、「LINE」などのメッセンジャーとIP電話で良いかと考えていた。そこは中国、金盾でgoogleやtwitterはブロックされるとか。

ホテルWiFiなどを使うならVPN接続しかないが、国際ローミングはブロックされないとの情報が得られた。だが、国際ローミングはバカ高い（SMSは1通100円、電話も着信だって100円以上する、データ通信はさらに高い）ので、お得な方法を探してみることに。

## 国際データローミングを検討
香港のSIMがお安いとの情報あり。
・7日間 1GB データ 中国聯通
・30日間 1GB データ 中国聯通
・通話付きのものも
現地であちこち連絡することは少ないだろうから、データのみのプランとすることに。今回は10日なので30日用を選択。

## 用途ごとの構成
・電話/SMS
　構成：iPhone5s(docomo sim lock)+AEON SIM
  Docomoの国際ローミングを利用（高いが慣れているので）
・メッセンジャー、メール
　構成；simフリー携帯(Freetel priori3)+中国聯通 大中華(30日間 1GB)
・iPhoneアプリ(LINEなど)
　構成：sim フリー携帯でテザリング
  
##物品調達
 Freetel priori3,SIMはアマゾンで購入。SIMは１週間くらいかかるので余裕を持って注文しておくこと。

##設定
・SIMの差し込み
 Freetel priori3のSIMカードスロットは、ノーマルSIMとミニSIM各１枚の２枚挿しが可能。購入したSIMをどちらかの大きさにカットして挿入する。
 なお、iPhoneのマイクロSIMでお試しする場合は、位置に注意。
・APNの設定
　SIMと一緒に送られた外装に設定方法がかかれている。
　NAME 3gnet
　APN 3gnet
　を設定する。次のURLのSIM Activationが参考になる。
http://www.cugstore.com/jp/data-card/greater-china-30days-1gb.html
　なお、Freetel priori3にはたくさんAPNの設定が用意されているが、間違えたり処理が重くなるので使わないAPNの設定は片っ端から削除しておくと良い。
・その他の設定
　テザリングの設定など
・SIMカードや電話番号、PUKの控え
　パケが不足した時に、追加購入（TOPUP)するためには、
　SIMカードの番号（１９桁）や電話番号(11桁）が必要。
　暗証番号(PUK)はSIM カードのプラスチックカードのスクラッチを削ると表示される。これらの番号を控えておくこと。

##TOPUP
　予想に反してパケットを使い切ったため、容量追加(TOPUP)を行ったのだが、SIMカードのパッケージに記載されていたTOPUP用のURLが中国語のみでさっぱりわからない。
　前記ページ http://www.cugstore.com/jp/data-card/greater-china-30days-1gb.html のtopping upは英語なので助かる。TOPUPの料金はHK$150とのこと。ここで参照されているサイトwww.cugstore.com/tp は英語でルビが振ってある。
　ここに、前記11桁もしくは19桁の番号をセットし、クレジットカードを選ぶ。次のページで入金の額を聞かれる。このSIMは30日用であるので、HK$150-を入力する。若干ディスカウントされた値が示されるので、あとはクレジットカードなどの情報を入力することでTOPUP処理が完了する。
　
終わり
IntelliJ IDEA で Javadoc の author を変更する

# 概要

IntelliJ IDEAで自動生成されるJavadocのauthorをカスタマイズする方法。
要はファイルテンプレートなので、応用すれば色々変更できる。

# 手順

- [Preferences] > [Editor] > [File and Code Templates] から変更する
- Java はだいたい、下記をインクルードしている
  - [Includes] タブ > [File Header]
- テンプレートには Velocity が使用されている （そのため Velocity 記法で書く）

![Pasted image at 2016_10_27 10_35 AM.png](https://qiita-image-store.s3.amazonaws.com/0/104744/9d55a443-cf99-bde6-1e09-93ad0ac27d9d.png)

![Pasted image at 2016_10_27 10_36 AM.png](https://qiita-image-store.s3.amazonaws.com/0/104744/ed4d94d1-bf02-3354-67ee-385422792d9e.png)

## 変更例

### デフォルト：

```
/**
 * Created by ${USER} on ${DATE}.
 */
```

### ユーザー名の部分に別の変数を定義して設定する

```
#set( $GitHubId = "su-kun1899" )
/**
 * Created by ${GitHubId} on ${DATE}.
 */
```

### JavaDoc コメント同様の `@author` を仕込んでおく

```
/**
 * @author ${USER}
 */
```

# 参考

https://www.jetbrains.com/help/idea/2016.2/creating-and-editing-file-templates.html