OmniAICreator/Qiita-1.07M huggingface dataset:
データとロジックを分割せよ

僕が普段プログラムを書くにあたって気をつけるようにしている基本的なことを文章化してみます。

本当に単純なことなので、プログラミング初心者からでも学べる内容になっています。

FizzBuzzが書けるぐらいからを想定しています。

# データとロジックを分割せよ

私はこれまでプログラマーとして働いてきた経験は4~5年程度です。
これまでの仕事の経験や、いくつかの書籍を読んだ経験から、プログラミングをする際に気をつけるべき一つのルールに気が付きました。

プログラミングは「データ」と「ロジック」の2つがあることを意識すると、
考えがグッと整理されてイケてるプログラムになりやすいのです。

# FizzBuzz

実際にコードを書いてみましょう。

お題を出します。

**「FizzBuzzを書いてください。」**

ルールを知らない方はこちらへ。 https://ja.wikipedia.org/wiki/Fizz_Buzz

...(しばらく待ちます。実際に書いてみてください。)...

<br />
<br />
<br />

答え合わせをしてみましょう。
例はRubyにしていますが、「データとロジックを分割する」考えは言語を超えた共通の基礎だと思っています。
Rubyを普段使わない方のためにコメントを付けて捕捉しています。

```rb
(1..30).each do |i| # 1〜30の数字でループする
  if i % 15 == 0    # 15で割ったあまりが0なら
    puts "FizzBuzz" # "FizzBuzz"を標準出力に表示させる
  elsif i % 5 == 0  # 5で割ったあまりが0なら
    puts "Buzz"
  elsif i % 3 == 0  # 3で割ったあまりが0なら
    puts "Fizz"
  else              # どれでもないなら
    puts i          # 数字そのものを表示させる
  end
end
```

だいたいこんな感じのコードを書いた方が多いのではないでしょうか。

はっきり言って、**このコードは全然ダメです。**

このプログラムでは、数字の範囲を勝手に1〜30と決めてしまっています。
これが、あとから「100〜130で表示させてみて」と言われたらどうでしょう。
一度、プログラムの一部を修正して再度実行することになります。

```diff
@@ -1,4 +1,4 @@
-(1..30).each do |i|
+(100..130).each do |i|
   if i % 15 == 0
     puts "FizzBuzz"
   elsif i % 5 == 0
```

では「200〜230のときは？」「300〜330のときは？」と言われるたびにコードを書き換えるのでしょうか？
「数字はこのファイルから読み込んで」と言われたら？

# Make every program a filter

書籍「UNIXという考え方」に

**「9. Make every program a filter. すべてのプログラムをフィルタとして設計する」**

という章が登場します。(短い本ですが、非常に良い本なので一読をオススメします。)

https://www.amazon.co.jp/dp/4274064069

この考え方によると、

> すべてのプログラムは、何らかの形式のデータを入力として受け入れ、何らかの形式のデータを出力として生成する。プログラムはデータを作らない。人間がつくる。

とあります。

FizzBuzzプログラムで考えてみると、1〜30や100〜130の部分は人間が決めているのでデータだと言えます。「Fizz」や「Buzz」を表示するのは機械的なロジックです。

データに当たる部分はプログラムから追い出してしまいましょう。これが今回言いたかった**「データとロジックを分割する」**にあたります。

```rb:fizzbuzz.rb
while line = gets     # 標準入力から1行読み込む
  i = line.chomp.to_i # 標準入力からのデータは文字列なので数字に変換する
  if i % 15 == 0
    puts "FizzBuzz"
  elsif i % 5 == 0
    puts "Buzz"
  elsif i % 3 == 0
    puts "Fizz"
  else
    puts i
  end
end
```

これでデータをプログラムから追い出すことができました。
これにより、データの生成はプログラムと関係なくなり、数字を変える毎にプログラムを修正することもなくなります。データの与え方も自由です。

```sh
seq 30 | ruby fizzbuzz.rb # 1〜30のfizzbuzz
```

```sh
cat data.txt | ruby fizzbuzz.rb # 保存しておいたファイルから読み込む
```

```sh
echo 12345 | ruby fizzbuzz.rb # 12345は何になる？
```

# まとめ

いかがでしたか？たったこれだけで、いつものプログラムがイケてる感じになり、やってい気は増大します。
今回はFizzBuzzの例でしたが、普段書くプログラムにもあてはめて考えてみてください。

「今回やりたいことのデータはなんだろう？」
「このプログラムはデータが変わったときに対応できる？」

そんな時に思い出してみてください。

**「データとロジックを分割せよ」**

読んで下さり、ありがとうございました。
python3でcsvファイルを読み込み、１行ずつファイルに分ける

python3でcsvファイルを読み込み、１行ずつファイルに分ける
各行のidをファイル名に付ける

入力するcsvファイル

```
id, text
1,テキスト1
2,テキスト2
3,テキスト3
```

```
# -*- conding: utf-8 -*-

import csv

if __name__ == '__main__':

    file_out_path = 'hoge/'   

    with open('home.csv', 'rt', encoding="utf-8") as file_in:
        csv_in = csv.reader(file_in, delimiter=",")
        header = next(csv_in) #headerを削除
        for row in csv_in:
        　　　　with open(file_out_path + row[0] + '.txt', 'w') as file_out:
　　　　　　　　　　　　file_out.write(row[1])
```
Atomでサーバー側開発するのに入れてみたパッケージ

# 公式サイト
https://atom.io/
![atom.png](https://qiita-image-store.s3.amazonaws.com/0/87716/d9ff1934-c1ff-bfbe-90bb-b2a70b2ef449.png)

# Atomを選んだ理由
* vimよりパッケージの追加が楽(というか探すの楽しい)
* EclipseやNetBeansより軽量
* SublimeTextより色々できそう
* おしゃれな雰囲気

# 導入したパッケージ 
### リモートファイル編集
* Rmote-FTP 
 FTP/SFTPでサーバーに接続し、ツリービューから選んでファイルを編集できる。
 鍵認証可。リモートなのでファイルの検索ができないのと、毎度ツリーを辿ってファイルを開く必要が有るため、調査には不向き。ガッツリ作り込む時はいい。

* remote-atom
[rmate](https://github.com/textmate/rmate)をインストールすると、コマンドライン上で `$ rmate hogehoge.php` とやるとAtomが起動してリモート編集できる。コードを追うときなど、サクッと見たいときに便利。 Remote-FTPと併用。
### 予測やシンタックスチェック
* autoclose-html
* linter-htmlhint
* linter-jshint
* linter-php 
このあたりは、予測やシンタックスチェックに使う。必要に応じて言語パッケージを追加していくといい。ブラウザでシンタックスエラーを見ることは基本なくなる。
### バージョン管理
* git-plus
* その他[こちら](http://loumo.jp/wp/archive/20151013000059/)のサイトを参考にさせて頂き試し中
### その他
* file-icons 
 ツリービューにファイル別にかわいいアイコンが付く。
* split-diff
 ファイル間の差分を見るのに便利。

まだAtomを使い始めたばかりなので、パッケージの使い勝手などは探り探りですが、
慣れれば開発効率も上がるのではと思います。パッケージは随時追加予定。
swift で setter のみを private に

## 開放度が高すぎるプロパティ

例えば、何かをカウントする型があったとします。`increment()` メソッドでカウントアップして、`count` プロパティでその値を確認できるとします。

```.swift
public struct Counter {

	public var count: Int = 0 // it's public!!

	mutating func increment() {
		count += 1
	}
}
```

しかし、これでは、`count` の値を外部の者に変更されてしまう恐れがありますし、`count` プロパティ自体を `private` にすると、そもそも カウントした値を外から参照できなくなってしまいます。　

```.swift
var counter = Counter()
counter.increment()
counter.count = 5 // oh, no!!
```

## setter を private にして、getter を public に

そこで、setter を `private` にして、getter を `public` にしようとすると、こんな具合にコーディングしている人もいるかと思います。

```.swift
public struct Counter {

	private var _count: Int = 0 // it's private
	
	public var count: Int {
		return _count
	}
	
	mutating func increment() {
		_count += 1
	}
}
```

これで外部がカウンタの値を直接変更しようとすると……

```.swift
var counter = Counter()
counter.count
counter.count = 5 // // Cannot assign to property: 'counter' is a get-only property
```

こんな具合に怒られてしまうので、これで、本来の意図通りにコーディングができました。めでたしめでたし。

## 真打登場！

と言いたいところですが、ここまで引っ張っておいて、もっと簡単な書き型があったりします。

```.swift
public struct Counter {

	private (set) public var count: Int = 0 // <-- !!!

	public mutating func increment() {
		count += 1
	}

}
```

何と、setter のみを `private` にできたりする事ができたりします。

```.swift
var counter = Counter()
counter.increment()
counter.count // no compile error and should be 1
counter.count = 7 // Cannot assign to property: 'counter' is a get-only property
```

もちろん、public と private だけのアクセスコントロールだけの話ではありません。setter のみを `fileprivate` にという事も可能ですが、残念なら、setter を `public` にして、getter を `private` にする事はできないようです。そして今度こそ…

> Then many swift programmers enjoyed coding happily ever after....

## 参考資料

[The Swift Programming Language Swift 3.0.1 - Access Control](https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/AccessControl.html)
[【卵は世界である】setとgetには異なるアクセス修飾子を指定できる](
http://egg-is-world.com/2016/02/09/swift-property-access/)
[Swift Magic: Public Getter, Private Setter](https://www.natashatherobot.com/swift-magic-public-getter-private-setter/)

## 環境に関する表記

```
Xcode Version 8.1 (8B62)
Apple Swift version 3.0.1 (swiftlang-800.0.58.6 clang-800.0.42.1)
```
簡単にJavaアプリケーションの情報を見る方法

Javaで作ったプログラムはJVM(Java Virtual Machine)で動作します。
Javaはメモリ管理などの細かい部分をプログラマではなく、JVMが請け負っています。
そのため、プログラマはいろいろな制約をあまり気にすることなくプログラミングが可能、という利点があるのですが、大規模なプログラムでは動作状態が気になるもの。
それを監視するための仕様としてJMX(Java Management Extensions)というものがあります。
JVMに組み込まれているJMXに、APIを通じてアクセスすることでJVMの情報を閲覧することができます。
親切な事に、JDKには監視情報をグラフィカルに表示するためのツールであるjconsoleが同梱されています。
今回は、jconsoleを使ってJavaアプリケーションの情報の監視をするまでを書いていきます。

# jconsoleでの監視

## 監視対象のプログラムを作成
まずは、監視対象となるプログラムを作成します。
jconsoleでは、動作中のプログラムに対して監視を行うため、すぐに終了しないプログラムが必要です。
今回は単純に1秒ごとに文字列を出力するプログラムを作ります。

```java:Main.java
package jp.frost;

public class Main {
	public static void main(String args[]) {
		while(true) {
			System.out.println("Hello! JMX");
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}
```

プログラムを作成したら実行しておきます。

## jconsoleの起動
まずは、jconsoleを起動します。
jconsoleは`JDKのインストール場所\bin`フォルダの中にexeファイルがあるので、起動します。
もし、JDKにパスが通っている場合、コマンドプロンプトから`jconosole`コマンドで起動することもできます。

起動すると接続の画面が開きます。
![image](https://qiita-image-store.s3.amazonaws.com/0/115996/754e4d7d-3124-d1ac-6e9b-273a62a35adf.png)

## 監視の開始
ローカルプロセスの中には、現在起動中のプログラムの一覧が表示されるので、先ほど起動しておいたプログラムを選択して、接続ボタンを押します。

保護されていない接続の確認がされますが、ローカルに接続する分には問題ないのでそのまま接続。
![image](https://qiita-image-store.s3.amazonaws.com/0/115996/ed7416fa-69de-efab-5e56-9f97f30c5cc0.png)

接続後は概要タブが開き、時系列ごとの各情報を確認することができます。
![image](https://qiita-image-store.s3.amazonaws.com/0/115996/a4f79b0c-9c57-1395-24a9-53f5d6225ff2.png)

## 監視内容

### メモリー(ヒープ・メモリー使用率)
![image](https://qiita-image-store.s3.amazonaws.com/0/115996/d92e0f36-4ea8-2f0e-205c-39794018dbbb.png)

メモリータブではJVMのメモリ使用状況を確認することができます。
主に監視する必要があるのは、ヒープ・メモリー(オブジェクトを配置するメモリ領域。クラス情報などは含まない)の使用率です。
Survivor、Eden、Oldの3種類の各領域ごとの使用率を確認することもできます。

また、右上の「GCの実行」ボタンを押すことでGC(ガーベッジコレクション)を強制的に実行させることが可能。
上の画像でいきなりメモリ使用率が下がっているのはGCを実行したためです。

### スレッド
![image](https://qiita-image-store.s3.amazonaws.com/0/115996/2b7a7bbe-4b02-7e24-a120-0efb4741cfd2.png)

スレッドがいくつ動いているか、各スレッド事の状況、デッドロックの検出などが可能。
今回のプログラムの場合、特にほかのスレッドを作成していないのでシングルスレッドですが、システムスレッドがほかにも動いているので、10個以上のスレッドが表示されています。

### クラス
![image](https://qiita-image-store.s3.amazonaws.com/0/115996/b58f8f63-b5bc-f406-dee6-c3849ea4bcbf.png)

クラスでは、現在そのプログラムがロードしているクラスの数を表示します。

### VMサマリー
![image](https://qiita-image-store.s3.amazonaws.com/0/115996/ced4824b-015d-cb4d-07ff-dd610851b828.png)

VMサマリーでは、JVMの概要を見ることができます。

### MBeans
![image](https://qiita-image-store.s3.amazonaws.com/0/115996/ed4767a2-b110-67c1-7414-2535bf55a92c.png)

MBeansタブでは、MBeansという機能を使い、プログラム内のオブジェクトの中身を参照、変更することが可能です。
MBeansServerにオブジェクトを登録することで、この画面から自作のオブジェクトを変更することが可能となります。
今回は特にMBeansに関しては設定していないので、システムオブジェクトのみが表示されています。

以上のように、jconsoleを使うことで簡単にプログラムの状態を監視することができます。
整数とバイト配列を相互変換する


ストリームから整数を読み込んだり、整数をストリームに書き込んだりするためには、一度バイト型の配列に変換しないと辛い。そして整数型のビット数に応じて適宜ビットシフトするのもまた辛い。

ということで、便利メソッドを再発明してみました。

```
import Foundation

extension UInt32 { // UInt16、UInt64、Intなどにも適用できると思います...
	
	init?(bytes: [UInt8]) {
		guard let value: UInt32 = convertBytesToValue(bytes: bytes) else {
			return nil
		}
		self = value
	}
	
	func bytes() -> [UInt8] {
		return convertValueToBytes(value: self)
	}
	
}

fileprivate func convertBytesToValue<T>(bytes: [UInt8]) -> T? {
	if bytes.count < MemoryLayout<T>.size {
		return nil
	}
	let value = UnsafePointer(bytes).withMemoryRebound(to: T.self, capacity: 1) {
		$0.pointee
	}
	return value
}

fileprivate func convertValueToBytes<T>(value: T) -> [UInt8] {
	var mutableValue = value
	let bytes = Array<UInt8>(withUnsafeBytes(of: &mutableValue) {
		$0
	})
	return bytes
}

```

このコードをメモリに読み書きするストリームに適用したものを [GitHub](https://github.com/ura14h/MemoryStreamSample) で公開しました。あまり使い込んでいないので何かしら不具合があるかもしれませんが...

なお Xcode 8.1 (Swift 3.0.1) でしか試していません。
VMware WorkstationへのUbuntu 16.04 Serverインストール後のVMware Toolsのインストール

コマンドラインで/dev/cdromの情報をマウントしてVMware Toolsをインストールする方法が以下リンクの「Ubuntu Server with only a command line interface」セクションに書かれています。

https://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=1022525
Pythonメモ


# オブジェクト指向におけるC++との対比
## クラスの継承

* public: アンダースコアなしのメンバ関数
* proteted: アンダースコア1つのメンバ関数
* private: アンダースコア2つのメンバ関数

```python:subclass.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

class Base(object):
    def __init__(self):
        self.name = "Base"

    def echo(self):
        self.hello()
        print("name = {}".format(self.name))
        self._underscore1_func()
        self.__underscore2_func()

    def hello(self):
        print("My class is Base.")

    def _underscore1_func(self):
        print("Base::_underscore1_func()")

    def __underscore2_func(self):
        print("Base::__underscore2_func()")

class Deriv(Base):
    def __init__(self):
        super().__init__()
        self.name = "Deriv"

    def hello(self):
        print("My class is Deriv.")

    def _underscore1_func(self):
        print("Deriv::_underscore1_func()")

    def __underscore2_func2(self):
        print("Deriv::__underscore2_func()")


if __name__ == '__main__':
    print(">>>> Base object")
    a = Base()
    a.echo()
    print()

    print(">>>> Deriv object")
    b = Deriv()
    b.echo()
```

```output
>>>> Base object
My class is Base.
name = Base
Base::_underscore1_func()
Base::__underscore2_func()

>>>> Deriv object
My class is Deriv.
name = Deriv
Deriv::_underscore1_func()
Base::__underscore2_func()
```
macOS Sierra になったら、キーリピートが遅くなった？

Atom の vim-mode-plus で気づいたけど、カーソル移動に違和感があった。

なにかと思ったらキーを押しっぱなしにした際のキーリピートが遅くなり、かつリピート間隔も長くなっている。vim-mode-plus をアップデートしたせい？とググっていたら違うものを見つけて解決。

http://apple.stackexchange.com/questions/10467/how-to-increase-keyboard-key-repeat-rate-on-os-x

Sierra の標準設定がこうなったのかは分からないけど、macOS 側の設定変更で無事に元通り。
Ubuntu 14.04 LTS > ログイン無限ループの巻

```txt:動作環境
VMware workstation v12.5.1
Ubuntu 14.04 LTS
```

VMwareをv12.5.1にアップデートした。

Ubuntuでログインをするとログイン画面に無限ループするようになった。


[阿鼻叫喚ジェネレーター](http://azunyan.sitemix.jp/shout/shout.php)
サ゛ブ゛用゛の゛T゛e゛n゛s゛o゛r゛F゛l゛o゛w゛環゛境゛セ゛ッ゛ト゛ア゛ッ゛プ゛や゛り゛直゛し゛で゛す゛か゛。゛


http://askubuntu.com/questions/223501/ubuntu-gets-stuck-in-a-login-loop
上記のアドバイス通りでは復旧できなかった。

あきらめた。

CUDAのインストールやcuDNNのインストール、日本語キーボードの設定などで何かを壊したのかもしれない。
Ruby on RailsでYoutubeAPIやVimeoAPIなどを使った動画視聴サービスをつくる方法

Ruby on RailsでyoutubeAPIやVimeoAPIを使った動画視聴サービスを作りたいと考えています。

何かオススメの教材やサイトなどをご存知であれば、教えていただないでしょうか？
C#における派生と、基底クラスへのキャスト時のnewとoverrideの挙動の違い


仕事でMicrosoft関係のものを扱うようになったので、これを機にちょいと古いMacBook ProからSurface Pro 4に買い替えたので、それにVisual Studio Communityを入れてC#で遊んでいる。

昨日、[Microsoft Virtual Academy](https://mva.microsoft.com/)でC#を勉強していて、どうにも動きが良くわからんと思った「派生クラスにおいて基底クラスのメソッドをnewまたはoverrideし、それらを基底クラスにキャストして呼び出したときにどういう動きをするか」についてちょっと整理してみた。

# 派生と継承

> 基底クラスを「派生」(Derive)したクラスを作成すると、基底クラスのプロパティ、メソッドが子クラスに「継承」(Inherit)される

ということらしい。

# ソースコード

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

namespace ConsoleApplication2
{
    class BaseClass
    {
       public static void Main()
       {
            var baseClass = new BaseClass();
            var overRide = new OverrideClass();
            var newclass = new NewClass();

            baseClass.Name();
            baseClass.Bow();

            ((BaseClass) overRide).Name();
            ((BaseClass) overRide).Bow();

            ((BaseClass) newclass).Name();
            ((BaseClass) newclass).Bow();

            Console.ReadLine();    
       }

       internal virtual void Name()
       {
            Console.WriteLine("BaseClass: Name");
       }

        internal virtual void Bow()
        {
            Console.WriteLine("BaseClass: Bow");
        }
    }

    class OverrideClass: BaseClass
    {
        internal override void Name()
        {
            Console.WriteLine("OverrideClass: Name");
        }
    }

    class NewClass: BaseClass
    {
        internal new void Name()
        {
            Console.WriteLine("NewClass: Name");
        }
    }
}
```

## 出力結果

```
BaseClass: Name
BaseClass: Bow
OverrideClass: Name
BaseClass: Bow
BaseClass: Name
BaseClass: Bow
```

# 考察

Overrideクラスと、NewクラスをそれぞれBaseClassから派生させた。つまり、OverrideクラスとNewクラスには、それぞれName()とBow()とが継承されている。そこで、OverrideクラスではName()をOverrideし、NewクラスではName()をNewで書き換えている。

したがって、BaseClass, OverrideClass, NewClassのBow()メソッドは、すべてBaseClassのBow()が呼ばれている。面白いのは、OverrideしたほうのName()は自身を呼んでいるが、NewしたほうのName()は基本クラスを呼び出している点だ。

C#の言語仕様によると、NewとOverrideは以下のように説明されている。

## New修飾子
> new キーワードを宣言の修飾子として使用すると、基底クラスから継承されたメンバーを明示的に隠ぺいできます。  継承されたメンバーを隠ぺいすると、派生バージョンのメンバーで基底クラスのバージョンが置き換えられます。

## Override修飾子
> override メソッドは、基本クラスから継承されたメンバーの新しい実装を提供します。  

Newは隠ぺいしているだけ（→基底クラスにキャストしたときには、基底クラスのものをそのまま呼び出す）、Overrideは上書きしている（→基底クラスにキャストしたときには、自身のものを呼び出す）ということらしい。

合っているのか……。実際の動きから考察した結果だけど、基本的なところが抜けてるからちゃんと説明できない。

# 参考

- [new 修飾子 (C# リファレンス)](https://msdn.microsoft.com/ja-jp/library/435f1dw2.aspx)
- [override (C# リファレンス)](https://msdn.microsoft.com/ja-jp/library/ebca9ah3.aspx)
PHPのcookie、sessionについて

#　自己紹介
皆さん初めまして。某学校で、ITの知識を勉強中の初心者プログラマーのわたのんです。将来はサーバサイドのエンジニアになるため、今精進しています。
以後お見知りおきを。得意言語はPHPです。今回はPHPでのcookieやsessionの使い方についてやっていきたいと思います。
#cookieとsessionの違いについて
・cookie
　　　管理したい値をクライアント側に保存
。session
　　　管理したい値をサーバ側で管理する
#cookie
　１．cookieの読み込み
　　　　　　書式）
　　　　　　　　$_COOKIE["クッキーの名前"]
　２．cookieの送信
　　　　　　書式）
　　　　　　　　setcookie("クッキーの名前",値,有効時間)

```php:cookie.php
if (isset($_COOKIE["visit"])){
    $count=$_COOKIE["visit"]+1;
}else{
   $count=1;
}
setcookie("visit",$count,time()+5);
echo "訪問回数は".$count."回です。";
```

上記のプログラムは訪問回数（更新）をカウントするものです。
※このプログラムを5秒放置すると$countの値が1に戻ります。因みにisset()関数は()に書かれている変数があるかないかの判断をしている。
#session
　１．sessionのスタート
　　　　　書式）
　　　　　　　session_start()
              ※これがないとsessionは使えない。この関数が実行されると新たにセッションを開始するか、セッションIDを取得して現在のセッションを復帰させる。
　２．session変数の書き込み
　　　　　書式）
　　　　　　 $_SESSION["session変数名"]=値

　３．sessionの削除
　　　　①sessionの値を初期化する
　　　　　書式）
　　　　　　 $_SESSION=array()
       ②sessionの破棄
　　　　　書式）
　　　　　　session_destroy()
                                   ※①、②の順にしなければsessionは消えないらしい。理由はわからん(笑)
#最後に
いかがでしたか？PHPでsession,cookieの扱う方法は:smiley:
これからも至らない点は多々あるかとは思いますがこれからもPHPについて投稿したいと思います。
間違っている点や改善点などありましたら連絡ください:bowtie:
機械学習勉強メモ2: KNN

- knnを試します

k近傍法（ケイきんぼうほう、英: k-nearest neighbor algorithm, k-NN）は、特徴空間における最も近い訓練例に基づいた分類の手法であり、パターン認識でよく使われる。最近傍探索問題の一つ。k近傍法は、インスタンスに基づく学習の一種であり、怠惰学習 (lazy learning) の一種である。その関数は局所的な近似に過ぎず、全ての計算は分類時まで後回しにされる。また、回帰分析にも使われる。
出典:https://ja.wikipedia.org/wiki/K%E8%BF%91%E5%82%8D%E6%B3%95

花タイプ判断用ソースコード:

```
from sklearn import neighbors
from sklearn import datasets

knn = neighbors.KNeighborsClassifier()

# 内部花サンプルデータを読み込みする
iris = datasets.load_iris()

# データ構造を見る
print(iris)

# データknnに学習する 
#iris.data 学習データ
#iris.target　各学習データの結果データ
knn.fit(iris.data, iris.target)

# 予測する
item = [[0.1, 0.2, 0.3, 0.4]]
predictedLabel = knn.predict(item)

i = 0
for key in iris.feature_names:
	print(key + ":" + str(item[0][i]))
	i = i + 1

print("予測の花タイプは:" + iris.target_names[predictedLabel][0])
```


- 利用したツール: python3 sklearn(機械学習計算用)
- 計算用データ説明:
 花タイプ用判断です。
 iris構造説明:

```
{'feature_names': ['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)'], 'data': array([[ 5.1,  3.5,  1.4,  0.2],
       [ 4.9,  3. ,  1.4,  0.2],
       [ 4.7,  3.2,  1.3,  0.2],
       [ 4.6,  3.1,  1.5,  0.2],
       [ 5. ,  3.6,  1.4,  0.2],
       [ 5.4,  3.9,  1.7,  0.4],
       [ 4.6,  3.4,  1.4,  0.3],
       [ 5. ,  3.4,  1.5,  0.2],....
'target_names': array(['setosa', 'versicolor', 'virginica'],....
'target': array([0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 0,....
```

feature_names:属性名
data:属性データ
target_names:種類名
target:各data属性に対して種類

実行結果:
![image](https://qiita-image-store.s3.amazonaws.com/0/138880/8a619c7e-1728-15df-e0af-0c63e89d1568.png)
Google Font で PhantomJS / Poltergeist の綺麗なスクリーンショットを撮影する

日本語フォントがインストールされていない環境で PhantomJS / Poltergeist のスクリーンショットを撮影すると、日本語部分が空白になったり、文字化けしたり、いろいろと辛いです。

せっかくなので Google の Noto フォントを利用して綺麗なスクリーンショットを撮影する方法を説明します。

## 環境

確認には次の環境を利用しています。

- 環境: CentOS7 （CentOS6でも同様の手順でいけると思います）
  - Minimal ISO をインストールした環境
- PhantomJS 2.1.1 （1.9.8 でも同様の手順でいけると思います）

## インストール方法

1. <https://www.google.com/get/noto/> から Noto Sans CJK JP をダウンロード
  [Google Not Fonts](https://www.google.com/get/noto/) へアクセスしダウンロードします。
  次のコマンドを実行することでもダウンロードすることができます。

  ```sh
  $ wget -S -O "NotoSansCJKjp-hinted.zip" "https://noto-website-2.storage.googleapis.com/pkgs/NotoSansCJKjp-hinted.zip"
  ```

2. ダウンロードしたファイルを /usr/share/fonts/noto/ へ展開

  ```sh
  $ sudo mkdir /usr/share/fonts/noto
  $ mkdir $$ && cd $$
  $ unzip NotoSansCJKjp-hinted.zip
  $ sudo cp -p *.otf /usr/share/fonts/noto/
  $ sudo chmod 644 /usr/share/fonts/noto/*.otf
  $ sudo chown root:root /usr/share/fonts/noto/*.otf
  ```
  
3. フォントキャッシュ更新

  ```sh
  $ sudo fc-cache -fv
  ```

## 確認

次のようなファイルを作成

```javascript:test.js
var page = require('webpage').create();

page.open('https://www.google.co.jp/intl/ja/about/', function() {
  window.setTimeout(function() {
    page.render('test.png');
    phantom.exit();
  }, 200);
});
```

> このテストスクリプトは [CentOSからPhantomJSを実行すると画面キャプチャの日本語が表示されなくなる問題](http://qiita.com/n-takahashi/items/3dd810ebdf236fce6f13)を、改変なく利用しています。

次のコマンドを実行してスクリーンショットを撮影。

```sh
$ phantomjs test.js
```

| Before<br>日本語フォントがない場合 | After<br>日本語フォントがある場合 |
|:------:|:----:|
| ![before.png](https://qiita-image-store.s3.amazonaws.com/0/11244/98dfeded-2ef0-a143-55b5-577756492aef.png) | ![after.png](https://qiita-image-store.s3.amazonaws.com/0/11244/707e462c-6917-1b1b-e56b-776e84957546.png) |

## 補足

rspec で次のようにすると任意のスクリーンショットを取れるでしょう。

```ruby
page.save_screenshot('screenshot.png', full: true)
```


## 参考

- [CentOSにGoogle Noto フォントをインストール](https://nmbr8.com/blog/2014/11/28/how_to_install_noto_sans_cjk_on_centos/)
- [CentOSからPhantomJSを実行すると画面キャプチャの日本語が表示されなくなる問題](http://qiita.com/n-takahashi/items/3dd810ebdf236fce6f13)
共通語彙基盤あれこれ

地方自治体コードの RDF を[作っている](https://github.com/hkwi/denshijiti)。これに共通語彙基盤を適用してみて、つまづいたところのまとめ。

## ic:コード種別のカーディナリティ

次のように、コードリストを改定するケースを考える。

```
list_old = ["a","b"]
list_new = ["a","b","c"]
```

`list_old` を RDF で書くとすると、こうなるだろうか。

```
_:list_old a ic:コードリスト型 ;
    ic:バージョン "list_old"^^xsd:string .

_:a a ic:コード型 ;
    ic:識別値 "a"^^xsd:string ;
    ic:コード種別 _:list_old .

_:b a ic:コード型 ;
    ic:識別値 "b"^^xsd:string ;
    ic:コード種別 _:list_old .
```

ここで `list_new` を追加で記述しようとすると、こうしたくなる。

```
_:list_old a ic:コードリスト型 ;
    ic:バージョン "list_old"^^xsd:string .

_:list_new a ic:コードリスト型 ;
    ic:バージョン "list_new"^^xsd:string .

_:a a ic:コード型 ;
    ic:識別値 "a"^^xsd:string ;
    ic:コード種別 _:list_old ;
    ic:コード種別 _:list_new .

_:b a ic:コード型 ;
    ic:識別値 "b"^^xsd:string ;
    ic:コード種別 _:list_old ;
    ic:コード種別 _:list_new .

_:c a ic:コード型 ;
    ic:識別値 "c"^^xsd:string ;
    ic:コード種別 _:list_new .
```

ところが、これはスキーマ違反になる。[コア語彙 v2.3.1] (http://goikiban.ipa.go.jp/node1161)。

```
ic:コード型 a owl:Class ;
	rdfs:subClassOf [
		a owl:Restriction ;
		owl:onProperty ic:コード種別 ;
		owl:onClass ic:コードリスト型 ;
		owl:maxQualifiedCardinality 1 ;
		rdfs:comment "コードの種別を記述するためのプロパティ用語"@ja
	] .
```

問題は「コード種別」と「バージョン」が結合しているところ。

素直に実装するなら、ic:コードリスト型がic:コード型のコレクションを持てばいいのではないだろうか？

```
_:list_old a ic:コードリスト型 ;
    ic:バージョン "list_old"^^xsd:string ;
    dcterms:hasPart _:a , _:b .

_:list_new a ic:コードリスト型 ;
    ic:バージョン "list_new"^^xsd:string ;
    dcterms:hasPart _:a , _:b , _:c .

_:a a ic:コード型 ;
    ic:識別値 "a"^^xsd:string .

_:b a ic:コード型 ;
    ic:識別値 "b"^^xsd:string .

_:c a ic:コード型 ;
    ic:識別値 "c"^^xsd:string .
```

## 市区町村コード桁数

全国地方公共団体コード/標準地域コードは仕様上 6 桁固定幅のコード体系になっている。6 桁目は checksum で、技術的には 5 桁あれば復元することはできる。このため 5 桁あるいは 6 桁として使われることがある。また 5 桁はさらに 都道府県 2 桁と内部の市区町村 3 桁にわかれて採番されている。

慣例的に「6」あるいは「5-(1)」あるいは「(2)-3-(1)」と使われる。個人的には 6 桁で使うべきだと考えているけど、実際に紙に書いたりするときには、確かに省略したい。

ところが [住所 IEP v1.0](http://goikiban.ipa.go.jp/node1015) によると、`ic:都道府県コード` は「全国地方公共団体コード（左２桁）を記載」で、`ic:市区町村コード` は「全国地方公共団体コード（右4桁）を記載」とされている。

これは困った感じで、次のようなリソースを作ることになる。

```
jiti:LG-C19211-20060801 a ic:コード型 ;
    ic:表記 "笛吹市"^^xsd:string ;
    ic:識別値 "2112"^^xsd:string .

jiti:LG-C08211-20060101 a ic:コード型 ;
    ic:表記 "常総市"^^xsd:string ;
    ic:識別値 "2112"^^xsd:string .
```

4 桁を取り出すのは普通じゃないように思える。また、日本全国規模でデータを整理したときに、右 4 桁では識別値になりえない。`ic:識別値` でリンクさせようとしてもうまくいかない。

標準地域コードはあくまで 6 桁で識別されるコードなので、分割せずにそのまま使うべきではないだろうか。

ちなみに都道府県についても `010006` といった 6 桁のコードが与えられているので、2 桁を無理に取り出す必要もなかったりする。「2-4」に分割した際に次のようになるのも奇妙だ。

```
[]
  ic:都道府県コード [
    a ic:コード型 ;
    ic:識別値 "01" ;
    ic:表記 "北海道"
  ] ;
  ic:市区町村コード [
    a ic:コード型 ;
    ic:識別値 "0006" ;
    ic:表記 "北海道"
  ] ;
```

`ic:上位コード` を使って、コード側で解決してもいい。「2 桁でリンクさせたい」という気持ちもわかるけど、それならいっそ、都道府県の整数のコードをそのまま定義したらいいんじゃなかろうか。

## 住所 IEP の表記

「ic:住所型」の表の説明が簡素なので、うっかり次のような RDF を書いてしまいそうになのは無理もない…。

```
[] a ic:住所型 ;
    ic:都道府県コード "08" ;
    ic:市区町村コード "2112" .
```

正しくはこうなるはずなので、「n文字を記載」ではなく「n文字のic:識別値を持ったic:コード型を記載」ぐらい丁寧に書いたほうがいいと思った。

```
[] a ic:住所型 ;
    ic:都道府県コード [
      a ic:コード型 ; 
      ic:識別値 "08"^^xsd:string .
    ] ;
    ic:市区町村コード [
      a ic:コード型 ; 
      ic:識別値 "2112"^^xsd:string .
    ] .
```
c++ builder XE4, 10.2 Tokyo > マウスカーソルを砂時計に変えて処理後に戻す

```txt:動作確認
C++ Builder XE4
RAD Studio 10.2 Tokyo Update 2 (追記: 2017/12/28)
```

## v0.1 

砂時計に変えて戻す処理。

```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	Screen->Cursor = crHourGlass;

	// 何かの処理
	Sleep(100);
	Application->ProcessMessages();
	Sleep(3000);

	Screen->Cursor = crArrow;
}
//---------------------------------------------------------------------------
```

上記の処理の場合、多段(ネスト)処理で失敗する。例として、処理1が処理中にも関わらず砂時計が解除される。

```
砂時計に変える
  砂時計に変える
  // 処理2
  砂時計から戻す
// 処理1
砂時計から戻す
```

## v0.2 ネスト対応

```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	TCursor cur_org = Screen->Cursor;

	Screen->Cursor = crHourGlass;

	// 何かの処理
	Sleep(100);
	Application->ProcessMessages();
	Sleep(3000);

	Screen->Cursor = cur_org;
}
//---------------------------------------------------------------------------
```

砂時計の表示変更時に「その時点の砂時計表示」をcur_orgとして保持する。
処理終了後にcur_orgを戻す。
2016年10月30日 考察 > 良いUIとは

良いUIとは何か?

思いついたのは
> その時々で選択肢が少ないもの

選択肢を少なくするには?

- ソフトウェアで選択肢を管理する方法
  - AI技術
  - ソフトごとの表示切替
      - touch barのようなもの?
  - 欠点: ユーザ固有の対応にすると他ユーザ使用時に使いにくい(過学習)
  - 例: gitコマンドの応答表示
      - 入力間違いなどに対して、適宜関連コマンドやコメントが表示される
- ユーザの記憶に頼る方法
  - 欠点: 初心者には使いにくい
  - 欠点: ユーザの使用頻度が低いと使いにくい(忘れる)
- 選択したいものが明示された実装
  - 具体的にどうするかは難しい
      - 例: 年月日順で明示 (161009_TensorFlow)
      - 例: インデックスで明示 (3_MNIST_FOR_BEGINNERS)
      - 例: 分かりやすいアイコン表示
          - 保存には「フロッピーディスクのアイコン」
              - 最先端技術: floppy disk
- 一本道のTutorial
  - 欠点: Tutorialを作成・変更するコストが高い
  - 例: 某メーカーのプリンタインク交換方法の表示 
      - 実際に交換がやりやすい
      
探したいものの検索にも似ている。
ソースコードの作り方にも似ている。単一責任原則。構造化プログラミング。

### 理想的なUI

- A 「おい」
- B　「はい」と言って醤油を渡す
- B 「おまえさん」
- A　「おお」と言っておんぶする
golangパフォーマンス2: slice vs array

テスト環境: go version go1.7.3 windows/amd64

ファイル構造:
rootファイル/02arraySlice.go
rootファイル/02arraySlice_test.go (効率テスト用)

02arraySlice.go

```
package go1_6

const capacity = 1024

//配列操作arrayはsliceにより早い
func array() [capacity]int {//配列処理テスト関数
	var d [capacity]int

	for i := 0; i < len(d); i++ {
		d[i] = 1
	}

	return d
}

func slice() []int {//slice処理テスト関数
	d := make([]int, capacity)

	for i := 0; i < len(d); i++ {
		d[i] = 1
	}

	return d
}

//パラメータとして渡す場合はsliceほうが早い (arrayはメモリ中にコピーされる)
func inArray(array [capacity]int) {//配列として関数パラメータ効率テスト

}

func inArray2(array *[capacity]int) {//配列ポインタとして関数パラメータ効率テスト

}

func inSlice(slice []int) {//sliceとして関数パラメータ効率テスト

}

//reArrayにより早い
func reSlice() []byte {//return slice場合効率テスト
	return []byte{1, 2, 3, 4}
}

func reArray() [4]byte {//return array場合効率テスト
	return [4]byte{1, 2, 3, 4}
}
```

02arraySlice_test.go

```
package go1_6

import (
	"testing"
)

func BenchmarkArray(b *testing.B) {
	for i := 0; i < b.N; i++ {
		_ = array()
	}
}

func BenchmarkSlice(b *testing.B) {
	for i := 0; i < b.N; i++ {
		_ = slice()
	}

}

func BenchmarkInArray(b *testing.B) {
	arr := array()
	for i := 0; i < b.N; i++ {
		inArray(arr)
	}
}

func BenchmarkInArray2(b *testing.B) {
	b.StopTimer()
	arr := array()
	b.StartTimer()

	parr := &arr
	for i := 0; i < b.N; i++ {
		inArray2(parr)
	}
}

func BenchmarkInSlice(b *testing.B) {
	b.StopTimer()
	sli := slice()
	b.StartTimer()

	for i := 0; i < b.N; i++ {
		inSlice(sli)
	}

}

func BenchmarkReArray(b *testing.B) {
	for i := 0; i < b.N; i++ {
		_ = reArray()
	}
}

func BenchmarkReSlice(b *testing.B) {
	for i := 0; i < b.N; i++ {
		_ = reSlice()
	}
}
```

テスト結果:
![image](https://qiita-image-store.s3.amazonaws.com/0/138880/f7aea32e-5ff0-63cb-ac1e-91197b7c2996.png)

ポイント: 
通常処理場合は配列がSliceにより早いですが、
配列は関数パラメータと関数戻し値として利用された場合は
メモリ中にコピーされるため逆に効率が落ちます。
[C#] Formで入力を受け付けて処理

自分が情弱なだけだと思いますが、Formで文字列入力を受け付ける処理を探すのに小一時間かかったのでメモ。

* やりたいこと
  * フォームが選択されている状態でキー入力をラベルに反映させたい

がっつり公式で対応方法が書いてありました。
[方法 : キーボード入力をフォーム レベルで処理する](https://msdn.microsoft.com/ja-jp/library/ms171538(v=vs.110).aspx)
> このフォームの KeyPreview プロパティを true に設定して、キーボード メッセージがフォーム上のコントロールに到達する前にフォームによって受け取られるようにします。

どこに入力しても画面に入力が反映されてほしい電卓みたいな画面を作成する場合などに役に立ちそうです。
2016-10-30 Python3 > forに対するelse:

http://docs.python.jp/3/tutorial/controlflow.html#break-and-continue-statements-and-else-clauses-on-loops

```py
>>> for n in range(2, 10):
...     for x in range(2, n):
...         if n % x == 0:
...             print(n, 'equals', x, '*', n//x)
...             break
...     else:
...         # loop fell through without finding a factor
...         print(n, 'is a prime number')
...
2 is a prime number
3 is a prime number
4 equals 2 * 2
5 is a prime number
6 equals 2 * 3
7 is a prime number
8 equals 2 * 4
9 equals 3 * 3
```

> ループの else 句は、 if 文の else よりも try 文の else に似ています。 try 文の else 句は例外が発生しなかった時に実行され、ループの else 句は break されなかった場合に実行されます。 try 文と例外についての詳細は 例外を処理する を参照してください。

こういうelseの使い方は未学習だった。
Python3 > イテラブルからリスト生成 > list(range(5))

http://docs.python.jp/3/tutorial/controlflow.html#the-range-function

> このようなオブジェクトは イテラブル (iterable) と呼ばれます。これらは関数やコンストラクタのターゲットとして、あるだけの項目を逐次与えるのに適しています。 for 文がそのような イテレータ であることはすでに見てきました。関数 list() もまた一つの例です。これはイテラブルからリストを生成します:

```py
>>> list(range(5))
[0, 1, 2, 3, 4]
```
ラズパイ3　gitインストール

「[ラズパイ3　インストール](http://qiita.com/natacom/items/2eb29dc1020e6f5e6217)」の次。
/etc/下にgit入れておく。
自分のメモなので対して中身ないです。

# Gitインストール
`sudo apt-get install git`
→更新なしだった。

# Git初期化
`cd /etc`
`sudo git init`

# Gitに自分が誰か教える
`sudo git config --global user.email "natacom@example.com"`
`sudo git config --global user.name "natacom"`

# 最初のコミットは意味のない空のものを入れておく
@NorsteinBekklerさんの[Gitの最初のコミットは空コミットにしよう](http://qiita.com/NorsteinBekkler/items/b2418cd5e14a52189d19)に倣ってそうする。

# 現状をコミットする。
`sudo git add .`
`sudo git commit -m "commit all"`
Python3 > slice copy / スライス記法 > for文などで使う

http://docs.python.jp/3/tutorial/controlflow.html#for-statements

> ループ内部でイテレートしているシーケンスを修正する必要があれば (例えば選択されたアイテムを複製するために)、最初にコピーを作ることをお勧めします。シーケンスに対するイテレーションは暗黙にコピーを作りません。スライス記法はこれを特に便利にします:

```py
>>> for w in words[:]:  # Loop over a slice copy of the entire list.
...     if len(w) > 6:
...         words.insert(0, w)
...
>>> words
['defenestrate', 'cat', 'window', 'defenestrate']
```

上記の例では、イテレータで回す間にそのリスト自体が変更されると話がややこしくなる。そういう場合にスライス記法を使うのがいい、という理解をした(間違っているかもしれない)。
raspberry pi 1 model bで、アセンブラ　その３

#概要
raspberry pi 1 model bで、アセンブラでfizzbuzzやってみた。
#開発環境
raspberry pi 1 model b
raspbian 2016_09_23 jessie lite
#実行
nano fizzbuzz.s
gcc fizzbuzz.s -nostdlib
./a.out
#サンプルコード

```
.text
.globl _start
_start:
        ldr r8, =msg
        mov r11, #0
loop:
        add r11, r11, #1
        mov r9, r11
loop3:
        cmp r9, #15
        subcs r9, r9, #15
        bcs loop3
        cmp r9, #0
        bne tobu4
        mov r7, #4
        mov r0, #1
        ldr r1, =fizzbuzz
        mov r2, #9
        svc #0
        b   tobu3
tobu4:
        mov r9, r11
loop4:
        cmp r9, #3
        subcs r9, r9, #3
        bcs loop4
        cmp r9, #0
        bne tobu5
        mov r7, #4
        mov r0, #1
        ldr r1, =fizz
        mov r2, #5
        svc #0
        b   tobu3
tobu5:
        mov r9, r11
loop5:
        cmp r9, #5
        subcs r9, r9, #5
        bcs loop5
        cmp r9, #0
        bne tobu2
        mov r7, #4
        mov r0, #1
        ldr r1, =buzz
        mov r2, #5
        svc #0
        b   tobu3
tobu2:
        mov r9, r11
        mov r12, #0
loop2:
        cmp r9, #10
        subcs r9, r9, #10
        addcs r12, r12, #1
        bcs loop2
        cmp r12, #0
        beq tobu
        add r12, #'0'
        strb r12, [r8]
        bl echo
tobu:
        add r9, #'0'
        strb r9, [r8]
        bl echo
        mov r9, #' '
        strb r9, [r8]
        bl echo
tobu3:
        cmp r11, #99
        bcc loop
        b exit
echo:
        mov r7, #4
        mov r0, #1
        ldr r1, =msg
        mov r2, #1
        svc #0
        mov pc, lr
exit:
        mov r7, #1
        mov r0, #0
        svc #0
.data
msg:
        .byte '0'
fizzbuzz:
        .ascii "fizzbuzz "
fizz:
        .ascii "fizz "
buzz:
        .ascii "buzz "
```
#考察
サブルーチンは、スタックを使わない。
blで、呼び出して、mov pc,lrで戻る。
Linux 脆弱性の検証　Dirty COW (CVE-2016-5195)

Linuxの勉強中にCOWを調べていたら、こんな脆弱性の情報を見つけたので、AWSのゲストOSで試してみました。

結論から言うと、脆弱性が再現されました。（一般ユーザーがrootユーザーのファイルを書き換えてしまうことを確認）

【情報元】
①脆弱性の内容
https://dirtycow.ninja/
"A race condition was found in the way the Linux kernel's memory subsystem handled the copy-on-write (COW) breakage of private read-only memory mappings. An unprivileged local user could use this flaw to gain write access to otherwise read-only memory mappings and thus increase their privileges on the system." (RH)

②実験用のソースコード　　　　
https://github.com/dirtycow/dirtycow.github.io/blob/master/dirtyc0w.c
③参考にしたサイト
https://www.agilegroup.co.jp/technote/dirty-cow.html
④Race Conditionとは
https://ja.wikipedia.org/wiki/%E7%AB%B6%E5%90%88%E7%8A%B6%E6%85%8B

#1. rootユーザーで一般ユーザーはRead Onlyのファイルを作成。

```
$ sudo -s
# more confidencial.txt 
This is important file
# chmod 0404 confidencial.txt 
# exit
```

#2. 実験用の実行ファイルを実行。

```
$ more confidencial.txt 
This is important file
$ ./dirtyc0w confidencial.txt m00000000000000000
mmap 7f4f3e8e7000

madvise 0

procselfmem 1800000000

$ 
```

#3.以下のように、一般ユーザーにファイル内容を書き換えられてしまっている。

```
$ more confidencial.txt 
m00000000000000000file
$ 
```
以上です。
やはりセキュリティ強化のためのメンテナンスは大切ですね。

Thank you! :grin:
Docker初期設定

Dockerの初期設定でお世話になったリンク

VagrantのCentOSを日本語化してみるAdd Star
http://d.hatena.ne.jp/yk5656/20140527/1402758009
Dockerの公式MySQLイメージの使い方を徹底的に解説するよ
http://dqn.sakusakutto.jp/2015/10/docker_mysqld_tutorial.html
Jupyter Notebook > ;でprintを抑制

```txt:動作環境
Ubuntu 14.04 LTS desktop amd64
GeForce GTX 750 Ti
ASRock Z170M Pro4S [Intel Z170chipset]
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v7.5
Python 2.7.6
IPython 5.1.0 -- An enhanced Interactive Python.
```

Jupyter NotebookのTutorialを見始めた。

https://www.youtube.com/watch?v=lmoNmY-cmSI&index=1&list=PLRJx8WOUx5Xd3_dgw5xRmABUd8MWdsA_C

4:16のあたり

```py
z = x + y
z;
```

`;`をCode Cellの最後に入力することで、printに相当する機能を抑制することができるようだ。
技術英語 > you also have the same [blind spots] in testing the class that you had in writing it,

@ Code Complete (No. 16304 / 36077)

> you also have the same <font color=red>blind spots</font> in testing the class that you had in writing it,

http://ejje.weblio.jp/content/blind+spot
> (目の網膜の)盲点、自分の知らない分野、「盲点」、(テレビ・ラジオの)難視聴地域、(車の運転者の)死角
AWS EC2 Amazon Linux 2016.09 + nginx + PHP7.0でサーバー構築

# 概要
EC2でAmazonLinuxのインスタンスを新規作成した状態から、`/var/www/html`以下に置いた`index.php`を表示させるまでの流れです。
今回、OSは`Amazon Linux 2016.09`を使っていますが、それ以前のバージョンだと`PHP7`がリポジトリにないため手順が異なるようです。

# 構成
* Amazon Linux - 2016.09.0（[リリースノート](https://aws.amazon.com/jp/amazon-linux-ami/2016.09-release-notes/)）
* nginx - 1.10.1
* PHP - 7.0

## yumをアップデート
SSHログイン後、セキュリティ警告が出ていて、`yum update`を促されたのでupdateしておきます。

```
$ sudo yum update
```

## PHP7をインストール
今までは、外部リポジトリから取得する必要があったようですが、
Amazon Linux 2016.09 からリポジトリに追加されたようで、簡単です。

```
$ sudo yum install php70
```

## PHPの必要ライブラリを追加
MySQL、マルチバイト文字対応、XML、mcrypt、php-fpm（後述）を追加します。
必要に応じて追加してください。最低限、`php-fpm`さえあれば`index.php`は表示できると思います。

```
$ sudo yum install php70-mysqlnd php70-mbstring php70-mcrypt php70-pdo php70-xml php70-fpm
```

## nginxのインストール
```
$ sudo yum install nginx
```

## nginxの設定を変更
ルートを`/var/www/html`に指定し、phpを処理できるように設定します。

```/etc/nginx/nginx.conf
        root         /var/www/html;
        location ~ \.php$ {
                fastcgi_pass 127.0.0.1:9000;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include fastcgi_params;
        }
```

## php-fpmの設定を変更

```/etc/php-fpm.d/www.conf
・・・

user = nginx
group = nginx

・・・
```
突然出てきたphp-fpmってなんだ？と思い、調べてみました。

参考
[Qiita - nginx と PHP-FPM の仕組みをちゃんと理解しながら PHP の実行環境を構築する](http://qiita.com/kotarella1110/items/634f6fafeb33ae0f51dc)

ApacheではApache自身に組み込まれたPHPモジュールがPHPを実行するのに対して、nginxはphp-fpmにPHPを実行してもらっている。Apacheでは毎回プロセスを生成するため遅いが、nginx + php-fpmでは初回に生成したプロセスを再利用するため高速に実行できる。という解釈をしました。


## php-fpmとnginxをスタート
```
$ sudo service start
$ sudo service php-fpm start
```
（サービスがなければ、/etc/inf.d/内のサービス名を確認）

## 動作確認
ルートに`index.php`ファイルを作成して、お決まりの`phpinfo()`を表示させます。

```
$ sudo vi /var/www/html/index.php
```

```/var/www/html/index.php
<?php
phpinfo();
?>
```

インスタンスのドメインにアクセスしたところ、
正しくphpinfoが表示されました！
Pythonで体験する深層学習 1章(輪講用資料)

[Do2dle（ドゥードゥル）第九回勉強会（Pythonで体験する 深層学習 第一回）](http://do2dle.connpass.com/event/41643/)で使用した
Pythonで体験する深層学習 1章輪講用の資料です。
補足を行っていますが、その箇所はわかるようにしています。


この章は序章であり、特記することはありません。
2章は大量に補足していますのでこちらを見ていただければありがたいです。
Pythonで体験する深層学習 2章(輪講用資料)
http://qiita.com/taki_tflare/items/b3032980568d6ea69d84
- - - 
## 1. はじめに

深層学習とは、ニューロンの層が多段に組み上げられたニューラルネットワークのことである。
深層学習により音声認識、物体認識、物体検出、自然言語処理、創薬ゲノミクスなどの多くの領域で進展が見られた。

### 1.1 深層学習の現状
(発表者によるコメント 始まり)

まずILSVRCとは何かを抑えておきましょう。
以下別資料参照。後の章に行くとILSVRCのテストがわかっていることが必要になります。
[ILSVRCとは何か？](http://qiita.com/taki_tflare/items/40bd1313d85513b4b861)

(発表者によるコメント　終わり)

ILSVRC2014では、出場36チーム中35チームが深層学習を採用した。
ILSVRC2015では、Fast R-CNNもしくは、Faster R-CNNを用いたチームが多い。
Fast R-CNN等の詳細は5.7参照


深層学習では、ソースの可読性が重視され、また並列処理を安価に行えるGPUのため、PythonとGPUを前提とした開発環境は必須である。

### 1.3 実践による理解
(発表者によるコメント 始まり)

Caffe、Chainer、Tensorflow、Theanoについて、
著者は2016年2月13日のデータを示しているが、
2016年10月9日時点のデータでは圧倒的な差がついている。
必要なモデルが有るパッケージを使用すればよいが
何か1つを選ぶのであれば、Tensorflowが良いと思える。

2016年10月9日 10:00時点


* Caffe Watch 1,600 Star 12,958 Fork 7,923
* Chainer Watch 189, Star 1,693 Fork 426
* Tensorflow Watch 3,179 Star 33,651 Fork 14,734
* Theano Watch 445 Star 4,687 Fork 1,661

(発表者によるコメント　終わり)

### 1.4 本書で使用した環境
Ubuntu(14.04, 15.10)
Mac OS X 10.11

Python 2.7

ユニコードの対応を考えれば、将来3系に移行したほうが良いであろう。
しかし互換性への対応で時間を浪費するより2.7系で動作を確認するのが理解への早道である。

(発表者によるコメント 始まり)

Python 2系 3系の分離は厄介な問題である。
著者は上記のように書いているが、Python3系を基本的に使えば良いと考える。
もしよく使うものであれば、自力で2系から3系にコンバートするのも一手である。
2to3を使用することで、全てではないが、コード変換が可能である。


(発表者によるコメント　終わり)


### 1.7 理論及び技術の展開
理論については後の章で説明

GPUについて、40日以上要していた学習が3日以内で収束するのであれば試す気にもなる。

(発表者によるコメント 始まり)

機械学習においては、大量の処理時間がかかるものが多いため、そのための処理時間を確保することが必要となる。
例えば強化学習によるゲーム実行をする場合、2〜3日後に得点が跳ね上がるケースが有り、収束がいつ行われるのかがよくわからない。
（このケースではGoogle Cloud PlatformでCPUのみ使用）
こういったケースではGPUで確認できると、単純に確認の時間が短くなれば、試せるケースが増えるためとてもありがたいものである。


おまけGoogle Cloud Platformでは、
東京リージョンでベータテスターを募集しているので
申し込んでみるのも良いかもしれません。
https://cloud.google.com/about/locations/

(発表者によるコメント　終わり)

### 1.9 本書の構成
3章は古典伝承の履歴、既知の場合には読む必要がない。

4章はこの10年の核となる考えを記述した。畳み込みネットワーク、LSTM、確率的勾配降下法である。

5章は画像認識、言語情報処理

6章は画像の脚注自動生成、強化学習との組み合わせ、顔情報処理である。


### 章末問題 1.
1.3に記載済み

### 章末問題 2.
171,204円

北米等一部地域でのみNVIDIA公式通販限定で8月2日から発売
日本国内でも2016年10月6日から販売開始

NVIDIA TITAN X
CUDAコア:3584 , メモリ 12GB GDDR5X

https://www.amazon.co.jp/dp/B01M0C8QXE/

### 章末問題 3.
モデルは2016年もfast-RCNNです。詳細は5.7参照

### 章末問題 4.
ペン・ツリー・バンク（PTB）データセット
以下を参照ください。
https://www.tensorflow.org/versions/master/tutorials/recurrent/index.html#recurrent-neural-networks



- - - 
参考
ILSVRCとは何か？
http://qiita.com/taki_tflare/items/40bd1313d85513b4b861

Pythonで体験する深層学習 2章(輪講用資料)
http://qiita.com/taki_tflare/items/b3032980568d6ea69d84
CoreAnimationのパーティクルをSwift3で試してみた

UIKitベースのアプリにパーティクルを載せたいと思ってCoreAnimationのパーティクルを試してみました。

<img width="319" alt="スクリーンショット 2016-10-30 4.09.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/45467/e311813f-c6e2-ee78-cc3e-b07742f39453.png">
（パラメータを変えれば爆発とか雨とかいろんな演出ができる)

参考にしたサイトはどれもObjective-Cだったので、xcode8上でswift3に直しました。

SpriteKitのviewをViewControllerに載せるという方法もあるようで試してみたんですが、パーティクルファイルを作って、SKSceneファイルを作って、それをViewControllerに繋げて...など手数が多く面倒でした。（ゲーム演出をたくさん使うなら手間をかける意味はあると思うけど）
【参考リンク】[SpriteKitとUIKitを組み合わせて、ちょっとリッチなウォークスルー画面 を作りたい](http://dev.classmethod.jp/smartphone/iphone/spritekitwithuikit/)


SpriteKitを載せるのはちょっと面倒なことが判明したので、CoreAnimationのパーティクルを試してみたわけです（CoreAnimation初めて触りました）。
【参考にしたのはこちら】[UIKit上でパーティクルエフェクトを表示する](http://qiita.com/shu223/items/547470625f7feafa1b6c)

超簡単でした（Obj-CもSwiftも慣れてないので変換するのに手間取りましたが）。

```
import UIKit

class ViewController: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
 
        // viewControllerの背景を黒くして（背景白だと見づらいので）、
        view.backgroundColor = UIColor.black
        
        
        // CAEmitterLayer（パーティクルを載せるレイヤー）を作って、
        let layer = CAEmitterLayer()
        let size = view.bounds.size
        layer.emitterPosition = CGPoint(x: size.width/2, y: size.height/2)
        layer.renderMode = kCAEmitterLayerAdditive

        // ViewControllerに載せて、
        view.layer.addSublayer(layer)
        
        
        // CAEmitterCell（パーティクル本体）を作って、
        let cell = CAEmitterCell()
        cell.contents = #imageLiteral(resourceName: "particle1").cgImage
        cell.emissionLongitude = CGFloat(M_PI)*2
        cell.emissionRange = CGFloat(M_PI)*2
        cell.birthRate = 800
        cell.lifetimeRange = 1.2
        cell.velocity = 240
        cell.color = UIColor(red: 0.89, green: 0.56, blue: 0.36, alpha: 0.5).cgColor

        // CAEmitterLayerに載せる
        layer.emitterCells = [cell]
        
    }
}
```

しかし問題が一つ。パーティクルってパラメータ調整をして、欲しい演出のイメージにたどり着くまでが大変。これをパラメータ直してビルドしてって繰り返していたら耐えられない。SpriteKitならxcode上でビルドしないで調整できるけど、CoreAnimationではできなそうだ...。

と思ってモヤモヤしてたんですが、調べてみたらこんなMacアプリがあるみたいですね。
[Particle Playground](https://itunes.apple.com/us/app/particle-playground/id600661093)
<img width="960" alt="スクリーンショット 2016-10-30 4.56.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/45467/838bb948-762a-a304-b790-f58b0d581d17.png">

約1000円。まだ買って試してないけどこれがあれば楽に作れそうです。
PythonでLeapMotionのデータを取得する。

LeapMotionを使ってみたかったので、プログラムをPythonで書いてみました。
今回は、認識されている手の本数と、指の数を取得してみたいと思います。
##開発環境
開発していく環境はこちらになっています。

- Windows8.1(64bit)
- Python 2.7.11

##環境構築
まずLeapMotionを利用するためにはSDKが必要なので、[developerサイト](https://developer.leapmotion.com/)からSDKをダウンロードしてきます。
ダウンロードしてきたフォルダを解凍すると、LeapSDKというフォルダがあるので、その中のlibフォルダを開くと、Leap.pyのファイルとx64フォルダの中にある、Leap.dllとLeap.libを使用します。

##ディレクトリ構成
今回のディレクトリ構成はこちらになります。
>
├─lib
│  └─x64
└─src

先ほどのLeap.pyをsrcの中に、Leap.dllとLeap.libをx64に配置します。

これでLeapMotionをpythonで扱うための準備は終わりです。
##実行
srcフォルダの中にtest.pyを作成します。ファイルの内容は以下の通りです。

```python:test.py

import sys
sys.path.insert(0,"../lib/x64")
import Leap
class SampleListener(Leap.Listener):
    def on_connect(self,controller):
        print "Connected"
    def on_frame(self,controler):
        frame = controler.frame()
        print "Frame id: %d, hands: %d,fingers: %d" %(frame.id,len(frame.hands),len(frame.fingers))
def main():
    listener = SampleListener()
    controller = Leap.Controller()
    controller.add_listener(listener)
    print "Press Enter to quit...."
    try:
        sys.stdin.readline()
    except KeyboardInterrupt:
        pass
    finally:
        controller.remove_listener(listener)
if __name__=="__main__":
    main()
```
それでは、test.pyを実行してみましょう。ファイルは何かキーが押されるまで、実行されるようになってます。

```
python test.py
```
実行すると、Frame idと認識されている手の数、指の数がそれぞれ表示されます。

```実行結果:実行結果
Frame id: 185744, hands: 2,fingers: 10
Frame id: 185745, hands: 2,fingers: 10
Frame id: 185746, hands: 2,fingers: 10
Frame id: 185747, hands: 2,fingers: 10
Frame id: 185748, hands: 2,fingers: 10
Frame id: 185749, hands: 1,fingers: 5
Frame id: 185750, hands: 1,fingers: 5
Frame id: 185751, hands: 0,fingers: 0
Frame id: 185752, hands: 0,fingers: 0
Frame id: 185753, hands: 0,fingers: 0
Frame id: 185754, hands: 0,fingers: 0
Frame id: 185755, hands: 0,fingers: 0
```

これで基本的なLeapMotionからのデータを取得することが出来ました。

以下は参考にしたサイトです。
>
1.https://developer.leapmotion.com/documentation/python/devguide/Project_Setup.html
2.https://developer.leapmotion.com/documentation/python/devguide/Sample_Tutorial.html
[java] MapBuilder

MapBuilderと呼ばれるものはいろいろあるわけですが、なにかこうしっくりこないのです。

右側に無駄な型パラメータを書かなければならなかったりするじゃないですか？

```java
Map<A,B> map = new MapBuilder<A,B>()...
```
の右側のA,Bが無駄な気がして嫌なのです。

そこで少し考えてみました。

```java
public class MapBuilderTest {
    Map<String,Integer> map = MapBuilder.createHashMap()
            .$_("A" , 1)
            .$_("B" , 2)
            .$_("C" , 3)
            .buildUnmodifiable();

    Map<Month,Integer> enumMap = MapBuilder.createEnumMap()
            .$_(Month.JANUARY  , 1)
            .$_(Month.FEBRUARY , 2)
            .$_(Month.MARCH    , 3)
            .build();

    Map<String,String> map2 = createHashMap(
            $("A","a"),
            $("B","b"),
            $("C","c")
    );
```

上二つはいわゆるfluent interfaceをもちいたもの(type A)、下はEntry配列を用いたもの(type B)です。
使い勝手としてどちらがいいのでしょうかね。

## 実装

こんな感じです。

###type A
```java
public class MapBuilder<K,V> {
    private Map<K,V> map;

    public static HashMapSeed createHashMap(){
        return new HashMapSeed();
    }
    public static EnumMapSeed createEnumMap(){
        return new EnumMapSeed();
    }
    private MapBuilder(Map<K,V> map){
        this.map = map;
    }
    public MapBuilder<K,V> $_(K k,V v){
        map.put(k,v);
        return this;
    }
    public Map<K,V> buildUnmodifiable(){
        return Collections.unmodifiableMap(map);
    }
    public Map<K,V> build(){
        return map;
    }
    public static class HashMapSeed{
        public <K,V> MapBuilder<K,V> $_(K k,V v){
            MapBuilder<K,V> builder = new MapBuilder<K,V>(new HashMap<K,V>());
            return builder.$_(k,v);
        }
    }
    public static class EnumMapSeed{
        public <K extends Enum<K>,V> MapBuilder<K,V> $_(K k,V v){
            MapBuilder<K,V> builder = new MapBuilder<>(new EnumMap<>(k.getClass()));
            return builder.$_(k,v);
        }
    }
}
```
###type B

```java
public class MapBuilder<K,V> {
    public static class Entry<K,V>{
        public K k;
        public V v;
        public Entry(K k,V v){
            this.k = k;
            this.v = v;
        }
    }
    public static <K,V> Entry<K,V> $(K k, V v){
        return new Entry<>(k,v);
    }
    public static <K,V> Map<K,V> createHashMap(Entry<? extends K,? extends V>...entries){
        Map<K,V> map = new HashMap<>();
        for(Entry<? extends K,? extends V> e : entries){
            map.put(e.k, e.v);
        }
        return map;
    }
}
```

type BはStatic Importしないと使いづらいですが、それができる現場ばかりではないだろうというのが問題ですが、きちんと左側の`Map<K,V>`が右側にも生きている事は利点ですかね。
type Aは右側のパラメータと左側のパラメータが切り離されてしまっています。fluent interfaceを使う以上は左右の型の接続関係は最後のbuild()まで分からないわけですから、これは仕方ありませんよね。

* type Aの型は、最初の`$_(K k,V v)`メソッドに与えられるk,vの型で確定されてしまう。
* type Bの型は、左側の受け手の型がきちんと生かされる。

MapBuilder一つでも悩んでしまう今日この頃です。なにか良いMapBuilderはないものでしょうか？
ラズパイにタクトスイッチを設置して毎日の「おはヨーソロー！！」ツイートを快適にする


## はじめに

みなさん！「 __おはヨーソロー！！__ 」って使っていますか？
僕が毎朝起きるためのモチベーションにしている第一声です。
多分、ラブライブ！サンシャイン!!のアニメが始まる前から毎朝ツイートしていると思います。(土日祝日は都合によりない場合あり)
渡辺曜ちゃんは天使です。可愛いですね。

## 環境

Python 2.7.11
Raspberry Pi2 B
多少の電子回路の知識

## ラズパイ側の配線

タクトスイッチも向きがちゃんとあるので確認しましょうね

![Cv8cip-UIAApU3J.jpg](https://qiita-image-store.s3.amazonaws.com/0/97280/d74792d6-5db4-3fd6-1ed6-41fde3e084a7.jpeg "Cv8cip-UIAApU3J.jpg")

ごちゃ付いていますが、
タクトスイッチの足に番号を振ってから説明
左下: 1番
右下: 2番

1. 1番に3.3Vを接続
2. 2番に1kΩの抵抗を取り付ける
3. 抵抗の右端からGNDに伸ばす
4. 抵抗の左足(2番の延長線上)からGPIO 9に接続(物理配置だとラズパイ側ピン21番です)

## ソースコード

https://bitbucket.org/nnsnodnb/raspi_morning_steady_tweeter/src

BitBucketに一応プッシュしています。

```python:app.py
# coding: utf-8

import RPi.GPIO as GPIO
import tweepy
import time, signal, sys, random
from datetime import datetime

def handler(signum, frame):
    print('Signal handler called with signal: ' + str(signum))
    GPIO.cleanup()
    sys.exit(0)

signal.signal(signal.SIGINT, handler)

def tweet():
    CONSUMER_KEY = ''
    CONSUMER_SECRET = ''
    ACCESS_TOKEN = ''
    ACCESS_SECRET = ''

    auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
    auth.set_access_token(ACCESS_TOKEN, ACCESS_SECRET)

    api = tweepy.API(auth)

    tweet_text = ''
    if random.randint(1, 7) == 7:
        tweet_text = u'おはヨハネ！！'
    else:
        tweet_text = u'おはヨーソロー！！'

    api.update_status(tweet_text + '\n{0:%Y/%m/%d %H:%M:%S}'.format(datetime.now()) + u'にひやかしは起床しました')

GPIO.setmode(GPIO.BCM)
GPIO.setup(9, GPIO.IN)
before = 0

while True:
    now = GPIO.input(9)
    if before == 0 and now == 1:
        tweet()
    time.sleep(0.1)
    before = now
```

CONSUMER_KEYなどは事前に取得しておきましょう！
また、今回は熱狂的なフォロワーさんのご要望にお答えして1/6の確率で「 __おはヨハネ__」が出現いたします。

## 実行結果

![スクリーンショット 2016-10-30 午前2.31.04.png](https://qiita-image-store.s3.amazonaws.com/0/97280/15cc0c18-2f53-12e1-5413-bbb0dff151d4.png "スクリーンショット 2016-10-30 午前2.31.04.png")

![スクリーンショット 2016-10-30 午前2.31.16.png](https://qiita-image-store.s3.amazonaws.com/0/97280/d047098b-0aa9-509e-28a2-ab05fb0d533d.png "スクリーンショット 2016-10-30 午前2.31.16.png")

まず、連続でボタンを押すということはないと思うのですが、ツイート重複のフールプルーフを考慮して秒単位までツイートするようにしました。

## 最後に

赤外線送信LEDは今回のジャンパコード整理のときにどのGPIOに接続していたかわからなくなり、
犠牲になりました。その内気が向いたら治します。