OmniAICreator/Qiita-1.07M huggingface dataset:
RailsにおけるCacheの概念と使い方

## Cache
キャッシュとは、使用頻度の高いデータを高速な記憶装置に蓄えておくことにより、いちいち低速な装置から読み出す無駄を省いて高速化すること。また、その際に使われる高速な記憶装置や、複製されたデータそのもののこと。

## RailsにおけるCache
### Rails3
Rails3までは以下の３つの代表的な機能を提供していた。

#### ページキャッシュ
レンダリングされたページのHTMLファイルをまるごとキャッシュする機能。キャッシュ化されたファイルはpublicディレクトリ以下に配置され、静的なファイルとして返す。

#### アクションキャッシュ
ページキャッシュは極めて高速だが、使える所が限定される。例えばbefore_filterで認証処理するアクションには適用できない。actionキャッシュはページキャッシュと似たような機能だが、before_filterの後に呼び出されるので、認証処理などの処理ができて、ページキャッシュより柔軟な対応ができる。

#### フラグメントキャッシュ
webページの多くは動的で、複数の部品（フラグメント）に構成される。フラグメントキャッシュは、部品ごとにキャッシングを行いキャッシングストアにデータを保存する。２回目以後のリクエストは部品をキャッシュストアから取り出す。

### Rails4
Rails4ではページキャッシュとアクションキャシュを本体から取り除かれ、gem化されました。詳細は[actionpack-page_caching](https://github.com/rails/actionpack-page_caching)と[actionpack-action_caching](https://github.com/rails/actionpack-action_caching)を参考してください。

#### フラグメントキャッシュの使い方

```show.slim
- cache 'key' do
  キャッシュしたい HTML文
```
上記のように、'key' を指定すると、その中身をキャッシュしてくれる。'key' の部分は、省略もできるし、Stringやオブジェクトも指定できる。

#### skip_digest: と expires_in: オプション

```show.slim
- cache 'key', expires_in: 1.minutes, skip_digest: true do
  キャッシュしたい HTML文
```

- ```expires_in: 1.minutes```：　有効期限を１秒
- ```skip_digest: true```： デフォルトではキャッシュするHTML文を元にdigestを作成して、'key'の付与している。```skip_digest: true```を付ける事でdigestをスキップできる。

#### キーにStringを指定した場合
```show.slim
- cache 'key' do
  キャッシュしたい HTML文
```
この場合は、Stringのキーに対応した形でシンプルにHTMLがキャッシュされる。内部的に実際には使われるキーにはデフォルトだと中身のHTMLを元に作ったdigestが付与されるため、cacheしたいHTML自体が変更されれば、digestが変更され、自動でキャッシュが更新される。

#### キーを省略した場合
```show.slim
- cache do
  キャッシュしたい HTML文
```

上記のように、キーを省略した場合は、ページのurlからキーが自動で作られる。url依存のキーなので、同じページでこの形を複数記述すると、どちらかのキャッシュが上書きされて大変なことになる。

#### キーにオブジェクトを指定した場合
```show.slim
- cache @object do
  = @object.text
```
オブジェクトを指定した場合は、@object.cache_keyがキャッシュのキーとなる。ActiveRecordのオブジェクトの場合、IDや、updated_at を元にキーが作成されるので、オブジェクトのupdated_atが変更されると自動でキャッシュも更新される。

```show.slim
- cache @objects do
  - @object.each do |object|
    = object.text
```

上記のように配列にした場合は、各オブジェクトに対して cache_key が呼ばれてそれを連結したものがキャッシュのキーになる。よって配列の順番や中身が変更されればキャッシュは更新される。

#### Russian doll caching（ロシアンドールキャッシング）
以下のように、記事（article）に対して複数のコメント(comment)があるデータ構造の場合、ネストされたフラグメントキャッシュの内側のキャッシュ(comment)が更新されると、外側のキャッシュ(article)も更新してくれる機能。rails 4ならデフォルトで利用可能。

```show.slim
- cache @article do
  = @article.title
  = @article.text

  - cache @article.comments do
    - @article.comments do |comment|
      = comment.text
```

この場合はモデル側で以下のように、モデル側に```touch: true```設定をする必要がある。

```comment.rb
class Comment < ActiveRecord::Base
belongs_to :article, touch: true
```

### 参考記事
- http://railsdoc.com/references/cache
- http://o.inchiki.jp/obbr/201
- http://qiita.com/7kaji/items/12e583ae3270b4a7c533
- http://qiita.com/moriteru/items/493a4d43bd7a77f38424
VS Code 1.4.0の新機能

## はじめに

VS Code1.4.0がリリースされました。今回はバックログになっていたバグつぶしに注力したらしく、大きな機能追加はありませんでした。微修正がメインですが、気になった機能をダイジェストとしてまとめておこうと思います。

## エディタ

### スニペット
コードスニペットの表示場所を調整できるようになりました。`editor.snippetSuggestions`を`none` か `top`、`bottom`、`inline`（既定値）のいずれかに設定することで場所が変わります。スニペットを多用していなかった身からすると、`bottom`が使いやすそうです。

### tabキーによるスニペットの補完
tabキーでスニペットの補完ができます。従来のtabキーによる入力確定と競合する部分があるので、無効化したいなら`"editor.quickSuggestions": false`を設定します。

## ワークベンチ

### エディタアクション
ビューの切り替えとプレビューを開く機能のアイコンが付きました。タブのせいで消えていたので、復活です。

![icons.PNG](https://qiita-image-store.s3.amazonaws.com/0/67429/24fe9cb3-8275-445a-90bc-094bae6c25b4.png)

### ドラッグアンドドロップ
タブがドラックアンドドロップで移動できます。

### git commitメッセージ
git commitのメッセージテンプレートが追加されています。

### クイックオープン
ショートカットキーが使えるようになりました。Windowsなら`ctl + p`、Macなら`⌘+P`です。

### 統合ターミナル
コマンド軌道でよく使用しているので、地味ですがうれしい機能が多く追加されています。
複数あるので、以下箇条書きです。

 - IMEの統合
 - `Ctrl+Shift+C`でコピー、`Ctrl+Shift+V`で貼り付け
 - 右クリックからコンテキストメニューが使用可能
要素を横並びにするならflex boxしかない！

css3のflex boxが便利すぎて1日に1回は使うので、とりあえず普段よく使うものをまとめてみました

# 使い方の基本

- 横並びにしたいブロック要素の一つ上の階層に`display: flex`を指定するだけ

```index.html
<div class="wrapper">
    <div class="element">BLOCK1</div>
    <div class="element">BLOCK2</div>
    <div class="element">BLOCK3</div>
</div>
```

```index.css
.wrapper{
    display: -webkit-flex;
    display: -moz-flex;
    display: -ms-flex;
    display: -o-flex;
    display: flex;
}
```
そんな書くのかよと思われるかもしれないが、chromeなら

```index.css
.wrapper{
    display: flex;
}
```
で十分だし、何なら

```common.css
.flex{
    display: -webkit-flex;
    display: -moz-flex;
    display: -ms-flex;
    display: -o-flex;
    display: flex;
}
```
というクラスを定義しておけば

```index.html
<div class="flex">
    <div>BLOCK1</div>
    <div>BLOCK2</div>
    <div>BLOCK3</div>
</div>
```

これだけで簡単にブロック要素の横並びが可能。

# プロパティ
### flex-direction : 子要素の配置方向
```index.css
.wrapper{

    display: flex;

    flex-direction: row;            /*横並び・左から右（デフォルト）*/
    flex-direction: column;         /*縦並び・上から下*/
    flex-direction: row-reverse;    /*横並び・右から左*/
    flex-direction: column-reverse; /*縦並び・下から上*/
}
```

### flex-wrap : 子要素の折り返し設定
```index.css
.wrapper{

    display: flex;

    flex-wrap: no-wrap;      /*折り返しなし・単一行（デフォルト）*/
    flex-wrap: wrap;         /*折り返し有り・複数行*/
    flex-wrap: wrap-reverse; /*折り返し有り・複数行・折り返し地点が逆*/
}
```


### flex-flow : 子要素の配置・折り返し設定をまとめて記述
```index.css
.wrapper{

    display: flex;

    flex-flow: row no-wrap; /*flex-direction + flex-wrapの記述が可能*/
    flex-flow: column wrap;
}
```

### justify-content : 水平方向の揃え方
```index.css
.wrapper{

    display: flex;

    justify-content: flex-start;    /*左（上）揃え*/
    justify-content: flex-end;      /*右（下）揃え*/
    justify-content: center;        /*中央揃え*/
    justify-content: space-between; /*均等に間隔をあける*/
    justify-content: space-around;  /*均等に間隔をあける・両端にも間隔をあける*/
}
```
### align-items : 垂直方向の揃え方
```index.css
.wrapper{

    display: flex;

    align-items: flex-start; /*上（左）揃え*/
    align-items: flex-end;   /*下（右）揃え*/
    align-items: center;     /*中央揃え*/
    align-items: baseline;   /*ベースラインを揃える*/
    align-items: stretch;    /*全ての要素の高さを揃える*/
}
```

### align-content : 複数行になった時の行の揃え方
```index.css
.wrapper{

    display: flex;

    align-content: flex-start;    /*上（左）揃え*/
    align-content: flex-end;      /*下（右）揃え*/
    align-content: center;        /*中央揃え*/
    align-content: space-between; /*均等に間隔をあける*/
    align-content: space-around;  /*均等に間隔をあける・両端にも間隔をあける*/
}
```

flexボックスを使えば、面倒だった横並びがとても簡単にできるだけではなく、要素間の関係も並べ方も上下左右中央寄せもとても簡単にできます。ぜひ使ってみては！
CentOS 7 (5, 6) で安定版 (最新版) の Nginx をインストールする方法

# 前置き
CentOSでNginxをインストールする方法を調べてみると、大抵のサイトには「Nginxはyumのリポジトリに登録されていないので、はじめにリポジトリの登録をしないとインストールできません」と紹介されています。

本当にそうなのか？ と疑問に思ったので、登録をせずにいきなりインストールしようとしてみました。

`$ sudo yum -y install`

すると、あっさりインストールできました😮

もしかすると前はyumのリポジトリに登録されていなくて、現在は登録されたのかもしれません。

面倒な手間が省けてラッキー！ と思ったのもつかの間で、バージョンを確認してみたら…

```
$ nginx -v
nginx version: nginx/1.6.3
```

だいぶ古いバージョンでインストールされてしまいました😅
登録はされたけどしばらく更新がなかったのかもしれないですね…

なので、今回はCentOSで安定版のNginxをインストールする方法を紹介します。

# 手順
## 設定ファイルの追加
`/etc/yum.repos.d/nginx.repo` というファイルを作成し、そのファイルに以下の設定を追加します。

```/etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1
```

⚠️ 上記は、CentOS 7 の設定です。もし、CentOS 5 や 6 をお使いの方は `baseurl` の `7` という部分を、お使いのCentOSのバージョンに書き換えてください。

‼️ このファイルはroot権限を持っていないと編集できないので`vi`などのエディタを使う場合は`sudo`が必要になるかもしれません。

上記の設定を追加したら保存してエディタを閉じます。

## インストール
あとは普通にインストールすればOKです。ただし、インストールするのは今回設定したURLからなので、`enablerepo`というオプションをつけてインストールします。

`$ sudo yum -y --enablerepo=nginx install nginx`

インストール後、バージョンを確認します。

`$ nginx -v`

2016年8月6日現在では以下のように表示されればOKです。
`nginx version: nginx/1.10.1`

正確には、[Nginxの公式ページ](https://nginx.org/en/download.html)にある "Stable version" の箇所にあるバージョンと同じものが表示されたら成功です。おつかれさまでした！

# おまけ：安定版ではなく、最新版をインストールしたい
Nginxには"Stable version"(安定版)と"Mainline version"(最新版)の2種類があり、ぼくは安定版をインストールしましたが、最新版をインストールしたい場合もあるかと思います。

その場合は、先ほどの設定ファイル(`/etc/yum.repos.d/nginx.repo`)をちょっとだけ編集します。

```/etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/mainline/centos/7/$basearch/
gpgcheck=0
enabled=1
```

⚠️ CentOS 5 や 6 を使っている方は先ほど同様に該当箇所を書き換えてください

先ほどと異なる点は、`baseurl`に`mainline`が追加されたことです。これで上記と同じように `$ sudo yum -y --enablerepo=nginx install nginx` すれば最新版がインストールされます。

2016年8月6日現在では、1.11.3がインストールされればOKです。最新版のバージョン(Mainline version)は[Nginxの公式ページ](https://nginx.org/en/download.html)で確認してください。

# 参考サイト
[nginx: Linux packages](https://nginx.org/en/linux_packages.html)
[CentOS7でnginxをyumでインストール(phpのおまけ付き)](http://qiita.com/kesuzuki/items/4a1644fc0d637993e7d3)
Pythonでリストの要素の一つが他のリストの中に存在するかチェックする方法

タイトルの通り、あるリストの要素の一つが他のリストの中に存在するかチェックしたい場面があるかと思います。僕の場合[CheckiO](https://checkio.org/)の問題を解いている際に必要になりましたが、実務でも使う機会があると思います。

どうしたものかと探したところ、[こちらのStack Overflowの記事](http://stackoverflow.com/questions/10668282/one-liner-to-check-if-at-least-one-item-in-list-exists-in-another-list)に方法がまとまっていたので紹介します。

# やりたいこと
あるリストaと、別のリストbがあり、リストaの要素の一つがリストbの中に存在する場合True、存在しない場合Falseを返すという関数を作ることを目標とします。

## Trueが返るリストの例
```python
a = ['A', 'B']
b = ['B', 'C', 'D']
```
リストaの'B'がリストbに存在するためTrue

## Falseが返るリストの例
```python
a = ['A', 'B']
b = ['C', 'D', 'E']
```
リストaの'A'と'B'どちらもリストbに存在しないためFalse

# 方法
## 方法1: any()とジェネレータ式を使う
```python
def func1(a, b):
    return any(i in b for i in a)
```
any()とジェネレータ式を使う方法です。`for i in a`で要素iを一つずつ取り出し、`i in b`でその要素iがbの中に存在するかチェックしていきます。ジェネレータを利用するので存在した場合が分かった時点でTrueを返します。

## 方法2: setの共通部分を使う
```python 
def func2(a, b):
    len(set(a) & set(b)) != 0
```
aとbを集合に変換し、それらの共通部分があるかどうかでチェックする方法です。なかなか読みやすく仕上がりますね。

## 方法3: isdisjoint()を使う
```python
def func3(a, b):
    return not set(a).isdisjoint(b)
```
方法2とは逆で共通部分を持たない場合Trueを返すisdisjoint()を使います。個人的にはnotがちょっと嫌な感じがします。

# まとめ
以上、あるリストの要素の一つが他のリストの中に存在するかチェックする方法についてまとめてみました。

パフォーマンスの比較などは行っていませんが、可読性も考慮しつつ自分に合ったものを選択するといいのではないでしょうか。

# 参考
[python - one-liner to check if at least one item in list exists in another list? - Stack Overflow](http://stackoverflow.com/questions/10668282/one-liner-to-check-if-at-least-one-item-in-list-exists-in-another-list)
RaspberryPi 3 Model B セットアップ

# 仕様
- 1.2GHz 64-bit quad-core ARMv8 CPU
- 802.11n Wi-Fi port
- Bluetooth 4.1(BLE) port
- 1GByte RAM
- 4 USB2.0 slots
- HDMI port
- Ethernet port
- Micro SD card slot

# 事前準備
- HDMI Display
- USB Mouse/Keybord
- SD Card 16GB class 10

## Getting Started
説明書は外箱に記載の以下のアドレスのみ
www.designspark.com/raspberrypi

## SD Card formatter
クイックフォーマット、オプションで論理サイズ調整をON
https://www.sdcard.org/jp/downloads/formatter_4/index.html

## NOOBS
以下のサイトからNOOBS_v1_9_2.zipファイルをダウンロードして、展開したものをそのままSDカードに転送する
https://www.raspberrypi.org/downloads/

# 起動
おめでとう、ラズベリーが４個並びました



![20160805_212929-1.jpg](https://qiita-image-store.s3.amazonaws.com/0/121947/3ca15bee-2c35-6107-5ab2-1505641a6a8a.jpeg "20160805_212929-1.jpg")
macOS への Solidity の solc のソースからのビルド・インストール

以下に移行しました<br><a href="http://block-chain.jp/tech/install-solidity-solc-on-mac/" title="macOS への Solidity の solc のソースからのビルド・インストール">macOS への Solidity の solc のソースからのビルド・インストール</a>
夏休み到来! 最高のパストレーシングの夏にしよう!

夏休み到来ですね! 新しいジブンにチャレンジの季節!　夏休みの自由研究でパストレーシングやりたいですね! 

![render_path_traced.png](https://qiita-image-store.s3.amazonaws.com/0/36275/40cec5e1-37ab-6824-60e8-b8c61e3a56ea.png)


優秀な若人がヘッダーオンリーレイトレーシングライブラリ [NanoRT](https://github.com/lighttransport/nanort) と [tinyobjloader](http://qiita.com/syoyo/items/bfe45d1bcbd0ab4a125c) で**人類史上最速**(2 日)でパストレーシングサンプルを作ってくれました(私が十数年前にパストレーシングを実装した時は 1 年くらいかかりましたね... 知の加速を感じますね). 素晴らしいですね!

https://github.com/lighttransport/nanort/tree/master/examples/path_tracer


最高のパストレーシングの夏にしようね!

映画ジャングルブックもパストレーシングだよ! https://www.fxguide.com/featured/out-of-the-pages-and-into-the-jungle-book/

## パストレーシングする.

    $ git clone https://github.com/lighttransport/nanort
    $ cd nanort/examples/path_tracer
    # Edit Makefile, then
    $ make
    $ ./path_tracer

デフォルトでは SPP=10000 になっているので計算に数時間かかちゃうかも... SPP=100 あたりでまずは試そうね!

## りろんはしってる

検証と検算だいじ! 理論は知っていても再度復習しよう!

http://cs.brown.edu/courses/cs224/papers/mc_pathtracing.pdf

とか `monte carlo path tracing` とかでググってね. 夏休みの自由研究を有意義なものにしようね!
 
## TODO 

* Minecraft モデルを .obj に変換しパストレーシングすることで, 優秀な小学生さまのハートをがっちりキャッチしたい
* **一億総パストレーシング若人活躍社会を実現するスキームを確立し, 優秀な若人が日々切磋琢磨しパストレーシングを極めるようにしたい**
WinMergeプラグイン（COBOL行頭番号無視） 

仕事でCOBOLのソースコードを比較したい時があった。
先輩方はdiff等を使っていたが、個人的にWinMergeを使いたかったので作成。

COBOLは行頭に6桁の行番号を振ることが多く、WinMergeで普通に差分を取ると変更行以降すべてが差分になってしまう。この問題を解決するためにプラグインで行先頭6桁目までを除外するようにした。


```vbnet:IgnoreCobolLineNo.sct
<scriptlet>
 
<implements type="Automation" id="dispatcher">
    <property name="PluginEvent">
        <get/>
    </property>
    <property name="PluginDescription">
        <get/>
    </property>
    <property name="PluginFileFilters">
        <get/>
    </property>
    <property name="PluginIsAutomatic">
        <get/>
    </property>
    <method name="UnpackFile"/>
    <method name="PackFile"/>
</implements>
 
<script language="VBS">
 
Option Explicit
 
Function get_PluginEvent()
    get_PluginEvent = "FILE_PACK_UNPACK"
End Function
 
Function get_PluginDescription()
    get_PluginDescription = "COBOLソースコードの行番号を削除する(1-6桁目)"
End Function
 
Function get_PluginFileFilters()
    get_PluginFileFilters = "\.cbl$;\.ecb$"
End Function
 
Function get_PluginIsAutomatic()
    get_PluginIsAutomatic = True
End Function
 
Function UnpackFile(fileSrc, fileDst, pbChanged, pSubcode)
    Dim fso
    Dim foSrc
    Dim foDst
     
    Set fso = CreateObject("Scripting.FileSystemObject")
     
    '読み取り専用モード
    Set foSrc = fso.OpenTextFile(fileSrc, 1, True)
    '上書きモード
    Set foDst = fso.OpenTextFile(fileDst, 2, True)
     
    '1行づつ読み込む
    Dim srcLine
    Dim dstLine
    Do Until foSrc.AtEndOfStream
        srcLine = foSrc.ReadLine
        
        '行先頭の行番号(6桁)を削除する
        If Len(srcLine) - 6 <= 0 Then
            dstLine = ""
        Else
            dstLine = Right(srcLine, Len(srcLine) - 6)
        End If
        
        foDst.WriteLine(dstLine)
    Loop
     
    foSrc.Close
    foDst.Close
     
    Set foSrc = Nothing
    Set foDst = Nothing
    Set fso = Nothing
     
    pbChanged = True
    pSubcode = 0
    UnpackFile = True
End Function
 
Function PackFile(fileSrc, fileDst, pbChanged, pSubcode)
    PackFile = False
End Function
 
</script>
</scriptlet>
```
目指せホゲモンマスター


すごく久々に自分でクラス作った。
攻撃可能条件がめんどうですね(ぉ)

```rb:tyama_henae06.rb
#!/usr/bin/env ruby
#http://mtsmfm.github.io/2016/08/06/doukaku-e06.html
#http://qiita.com/mtsmfm/items/7a0bfd2ac5b7674ce8c7

def calc_damage(t1,t2)
	{
		'R'=>{'R'=>2,'G'=>4,'B'=>1},
		'G'=>{'R'=>1,'G'=>2,'B'=>4},
		'B'=>{'R'=>4,'G'=>1,'B'=>2},
	}[t1][t2]
end

class Pokemon
	attr_reader :type
	attr_accessor :level,:hp
	def initialize(s)
		@type=s[-1]
		@level=@hp=s[0...-1].to_i
	end
	def battle(o)
		if o.level>self.level
			o.battle(self)
		else
			o.hp-=calc_damage(self.type,o.type) if @hp>0
			if o.hp>0 || o.level==self.level
				self.hp-=calc_damage(o.type,self.type)
			end
		end
	end
	
end

while gets
	trainers=$_.chomp.split(',').map{|e|e.scan(/\d+[RGB]/)}
	win=[0]*trainers.size
	(trainers.size-1).times{|i|
		(i+1...trainers.size).each{|j|
			trainer1=trainers[i].map{|e|Pokemon.new(e)}
			trainer2=trainers[j].map{|e|Pokemon.new(e)}
			while !trainer1.empty?&&!trainer2.empty?
				trainer1.first.battle(trainer2.first)
				trainer1.shift if trainer1.first.hp<=0
				trainer2.shift if trainer2.first.hp<=0
			end
			win[i]+=1 if !trainer1.empty?
			win[j]+=1 if !trainer2.empty?
		}
	}
	puts (1..trainers.size).sort_by.with_index{|e,i|[-win[e-1],i]}*','
	STDOUT.flush
end
```
リモートのCSVファイルをRubyで開く方法

## 前提知識

Rubyにはめんどくさいことに csv を扱うクラスが `CSV`と`CSV::Table`があります。便利なのは`CSV::Table`の方なので私はいつもこちらを使います。

## URLを指定してCSVファイルを開く

リモートのファイルを直接開くときの方法を検索したら

```.rb
csv = CSV.new(open(url), headers: true)
```

って出てきたんですがこれは`CSV`クラスを生成しちゃうんですよね。

なので

```.rb
 csv = CSV.parse(open(url).read, headers: true)
```

を使いましょう。これでちゃんと`CSV::Table`クラスが生成されます。ちなみに`CSV.read`も`CSV::Table`クラスを返してくれます。

あとそれから`CSV#read`を使っても`CSV::Table`を返してくれるようです。
妙にややこしい命名になってる気がしますが後方互換性で色々と苦労があったんでしょうね、多分。

`CSV.new`と`CSV.parse`と`CSV.read`の違いでした。
【まさかの】ChainerでLSTMを使ってナンバーズの予測をする【当選】

## 前置き(読み飛ばしていいです)

* 古巣(某ISP)が定期的にハッカソンを開催していて、ありがたいことに毎回お声掛け頂いています。
    * 特にテーマは無い、もくもく会的なハッカソンです。
    * 毎回美味しいお弁当が出ますが、今回は量は満足でしたが、質がいまいちでした
* やりたいなーと思っててやる時間がなかったことを毎回やってます。
    * 今回はLSTMを使ってナンバーズの予測をやりました。

--------

## [ナンバーズ](http://www.mizuhobank.co.jp/takarakuji/suji/numbers/index.html)

* 数字選択式宝くじ
* 平日は毎日抽選が行われる
* 数字を3つ選ぶ**ナンバーズ３**と、4つ選ぶ**ナンバーズ４**がある
* 数字と並びの両方を当てる**ストレート**、並びは関係なく数字だけを当てる**ボックス**、ストレートとボックスに半々にかけるイメージの**セット**がある。
* 当選金額は **ストレート** >> **セットのストレート** > **ボックス** > **セットのボックス** みたいなイメージ

--------

## ナンバーズに関するオカルト「ひっぱり現象」

* 同じ数字が何回かにわたって連続して出現しやすい。これを**ひっぱり現象**という。
    * 計算してないけど、多分確率的にはよくあるくらいの確率なのでは……。
* ひっぱり現象がある = 前回の結果と今回の結果には**ゆるい相関関係がある**
* ナンバーズの結果を「時系列データ」と捉えてLSTMで学習させる

------

## ナンバーズのデータ

* [ナンバーズ３、４、ミニロト、ロト６、ロト７ 
ロト７の過去のデータ ダウンロード](http://r7-yosou.hippy.jp/data.html)
* Excelファイルが降ってくるのでcsvにしてスタンバイ。
* 今回はナンバーズ４の予測を行った

-------

## やったこと

* 一文字づつ学習させて、次になにが来るか予測
    * [DEEPstation](http://deepstation.jp)をについているLSTMを利用
* １回ごとの当選番号(4桁)を学習させて、次の当選番号(4桁)を学習させる
    * 雑にコード書いた。ハッカソンだしね。 https://github.com/hidesuke/numbers_lstm
    * `python numbers_lstm.py`で学習
    * `python prediction.py`で予測

--------

## 1文字づつバージョン

![スクリーンショット 2016-08-06 17.00.54.png](https://qiita-image-store.s3.amazonaws.com/0/13085/4c577ee8-3a00-d03e-228c-042d65ad66b3.png)

* 1000epochくらい学習させて perplexityが6くらい。全然下がらない。

-------

## とりあえず予測はさせてみる

![スクリーンショット 2016-08-06 17.00.40.png](https://qiita-image-store.s3.amazonaws.com/0/13085/380ce813-f9a7-0ddd-eba2-14f4a5ac11d8.png)

-------

## 1回毎の当選番号で学習バージョン

* 1000epochくらい学習させて perplexity 1くらい。上々である。
* こちらも予測させてみる。

![スクリーンショット 2016-08-06 17.05.24.png](https://qiita-image-store.s3.amazonaws.com/0/13085/be2c314c-2d22-6397-0d34-a70e5d5006a7.png)

------

## そして買ってみる

![numbers.png](https://qiita-image-store.s3.amazonaws.com/0/13085/3fd47c4c-a8ea-ca32-1259-775556d8f764.png)

-----

## 結果！

------

![スクリーンショット 2016-08-08 21.27.23.png](https://qiita-image-store.s3.amazonaws.com/0/13085/431ebe6f-3f0e-3d82-8c53-33fc41fa4d1f.png)

-----

![numbers4.png](https://qiita-image-store.s3.amazonaws.com/0/13085/93e8f755-b5db-d7cd-c7a8-040cfc896f4c.png)

-----

## セットボックス当選だぁぁぁぁあああああああああ！！！！！！！

-----

## 考察

* 今回ヒットしたのは「**一文字づつ学習**」させたほう
* 両方共「**9**」や「**4**」が出てくると予想してたみたい
* 引っ張り現象はあるんや！！

-----


## 糸冬
ホゲモン問題( オフラインリアルタイムどう書くE06 )の ruby による実装

問題 http://mtsmfm.github.io/2016/08/06/doukaku-e06.html
実装リンク集 http://qiita.com/mtsmfm/items/7a0bfd2ac5b7674ce8c7
です。

45分ぐらいで解けました。

ruby の実装はまだ汚いけどこんな感じ。(ちょっときれいにした）

```ruby
Monster = Struct.new( :hp, :col, :lv )

# b が a をなぐる場合のダメージ
def damage( a, b )
  return 1 if "RGBRGB".index(a+b)
  return 4 if "RGBRGB".index(b+a)
  return 2
end

# b が a をなぐる
def hit( a, b )
  return if b[0]<=0
  a[0] = [0, a[0] - damage(a.col, b.col) ].max
end

# a と b が同時に殴りあう
def simhit( a, b )
  a.hp = [0, a.hp - damage(a.col, b.col) ].max
  b.hp = [0, b.hp - damage(b.col, a.col) ].max
end

# モンスター a と モンスターb で一度ずつ殴りあう
def fight( a, b )
  case a.lv<=>b.lv
  when 1
    hit( b, a )
    hit( a, b )
  when -1
    hit( a, b )
    hit( b, a )
  when 0
    simhit( a, b )
  end
end

# デッキa と デッキb で戦う
def battle( a, b )
  ma, mb = [a, b].map{ |x| x.chars.each_slice(2).map{ |l,c| Monster.new( l.to_i, c, l.to_i ) }}
  loop do
    fight( ma.first, mb.first )
    ma.shift if ma.first.hp==0
    mb.shift if mb.first.hp==0
    return 0 if ma.empty? && mb.empty?
    return -1 if mb.empty?
    return 1 if ma.empty?
  end
end

def solve( src )
  players = src.split(",").zip( [*0..100] )
  wins=[0]*players.size
  players.combination(2) do |a,b|
    case battle( a[0], b[0] )
    when -1
      wins[a[1]]-=1
    when 1
      wins[b[1]]-=1
    end
  end
  wins.zip( [*1..players.size] ).sort.map(&:last).join(",")
end

$stdout.sync=true

$all_okay=true

def test( src, expected )
  actual = solve( src )
  p [ actual==expected ? "ok" : "**NG**", src[0,10], actual, expected ]
  $all_okay &&=actual==expected
end

test("9B,3R2G,1R2B3G", "1,3,2")
test("1G", "1")
test("1G,1R,1B", "1,2,3")
test("8B,3R2G,1R2B3G", "3,1,2")
test("6G,9R7B7B", "2,1")

puts(  $all_okay ? "okay" : "something wrong" )
```

いつもどおり、テストデータの大半は省略。

問題文にはない暗黙の仕様（？）「レベルは一桁」に依存しているところがかっこ悪い。
`zip([*0..100])` の辺りもかっこ悪い。

上記2点以外はまあまあうまく書けているのではないかと思ってるけどどうだろう。

会場では `damage` メソッドの中身にちょっと驚かれたんだけど、私としては普通に書いたつもり。普通でしょ？

ヒットポイントがマイナスにならないように頑張っているのは、なんとなく。ゲームを作っていた頃の記憶のせいかもしれない。

`wins[n]` が正にならないのは、そのあと sort するときに便利になるようにするため。`wins[n]` を正にして、`sort_by` を使った方がよかったね。
Ubuntu14.04 LTS にGTX1080 をセットアップしたメモ

## 1. Ubuntuのインストール
Ubuntu14.04 LTS をインストール。クリーンインストールを推奨。

## 2. ホームディレクトリ内のディレクトリ名の変更
Ubuntuを日本語でインストールした場合、

```
/home/username/ダウンロード
/home/username/ピクチャ
```
のようになっているはず。後々コマンド打つのが面倒になるので

```
/home/username/Download
/home/username/Picture
```
に以下のコマンドで変更

```bash
LANG=C xdg-user-dirs-gtk-update
```

## 3. NVIDIA GeForceを使うための設定
以下のコマンドで使用可能なNVIDIA Driver を調べる。

```bash
sudo add-apt-repository ppa:xorg-edgers/ppa
sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt-get update
sudo apt-cache search 'nvidia-[0-9]+$'
```

すると、以下のように表示されるはず。

```
nvidia-173 - NVIDIA legacy binary driver - version 173.14.39
nvidia-310 - Transitional package for nvidia-310
nvidia-319 - Transitional package for nvidia-319
nvidia-304 - NVIDIA legacy binary driver - version 304.131
nvidia-331 - Transitional package for nvidia-331
nvidia-340 - NVIDIA binary driver - version 340.96
nvidia-346 - Transitional package for nvidia-346
nvidia-352 - NVIDIA binary driver - version 352.63
nvidia-367 - NVIDIA binary driver - version 367.35
```

今回は、最新の version 367.35 をインストールした

```bash
sudo apt-get install nvidia-367
sudo apt-get install mesa-common-dev
sudo apt-get install freeglut3-dev
```

## 4. CUDA Toolkit のインストール
今回は、CUDA Toolkit 8.0 RC をインストールした。
https://developer.nvidia.com/cuda-toolkit から、CUDA Toolkit 8.0 RCを選択

* Linux
* x86_64
* Ubuntu
* 14.04
* runfile(local)

をチェックしてダウンロード
その後、以下のコマンドを実行

```bash
sudo bash cuda_8.0.27_linux-run
```

基本的にYES, ENTERで問題ないが、以下のようにnvidia-driverを3で入れたバージョンより低いバージョンのものをインストールするか聞かれる箇所があるので、そこだけはNOを選択。

```
Install NVIDIA Accelerated Graphics Driver for Linux-x86_64 361.62?
(y)es/(n)o/(q)uit: n
```

~/.bashrc に以下を追加

```bash
export PATH=/usr/local/cuda-8.0/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-8.0/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
export CUDA_HOME=/usr/local/cuda
```

リブートして、以下のコマンドで動作確認をしてください。

```bash
nvidia-smi
nvcc –V
```

動作確認ができた人は、お疲れ様でした。

## 5. cuDNNの導入(10/14追記)

cuDNNとはNVIDIAが公開しているDeepLearning用のライブラリでDeep Learning用のソフトウェアの速度が向上します。

cuDNNをダウンロードするには、以下のサイトに登録が必要です。
https://developer.nvidia.com/cudnn

登録するときに使用用途を尋ねられますが、数行の短い文で結構です。（ただし英語）
登録には2,3日かかります。

登録が完了したら、
https://developer.nvidia.com/rdp/form/cudnn-download-survey
からアンケートに答えて、

Download cuDNN v5.1 (August 10, 2016), for CUDA 8.0
┠ cuDNN v5.1 Library for Linux

をダウンロードして、以下のコマンドで解凍

`tar xvzf cudnn-8.0-linux-x64-v5.1.tgz`

そうすると、cudaというファイルができます。
構造は以下のようになっているはず。

cuda
┠ include/
┠ lib64/

<font color="red">cuda/include/</font>　の中身を <font color="red">/usr/local/cuda/include</font>　へ
<font color="red">cuda/lib64/</font> の中身を　<font color="red">/usr/local/cuda/lib64</font>　へコピーします

```bash
sudo cp cuda/include/cudnn.h /usr/local/cuda/include
sudo cp cuda/lib64/libcudnn* /usr/local/cuda/lib64
sudo chmod a+r /usr/local/cuda/lib64/libcudnn*
```

その後、~/.bashrc へ記述をして以下のようにパスを通します。

```bash:.bashrc
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/cuda/lib64"
export CUDA_HOME=/usr/local/cuda
```

設定をリロードして完了です。

`source ~/.bashrc`
XCTestのTimeoutの値はどのように決まるか？

# はじめに
勉強会で、XCTest入門の発表中に出た疑問です。

http://qiita.com/okuderap/items/e02b73880b8bc499debe

この中である、

waitForExpectationsWithTimeout

の値です。

答え　設計をもとに決める。

メソットのタイムアウト値のテストなので、そのメソットが利用される
プログラムに与えられた、非機能要件の範囲で決まってきます。


# たとえば・・・

非機能要件で、画面遷移を0.5秒以内とする。

としていて、

- 画面描画
- APIアクセス
- データ加工
- その他の処理

という処理があったとします。

その場合、

- 画面描画に　　・・・0.1秒
- APIアクセスに・・・0.2秒
- データ加工に　・・・0.1秒
- その他の処理に・・・0.1秒　(バッファー)

というような割り当てをして、

「APIアクセス」のメソットの　タイムアウト値は、0.2秒でテストを行います。


# ちなみに・・・

開発環境と本番環境では、APIのスペックが違うこともあります。
その場合には、本番環境と開発環境のパフォーマンス差の係数をだして、
タイムアウトの設定値とします。

例
　本番環境　0.2秒
　開発環境　0.4秒

　係数は、2になる。
　「APIアクセス」のメソットの　要件上のタイムアウト値は、0.2秒なので、
　設定値は、 0.2 x 2　で、0.4 となる。
C# オブジェクト生成時の初期化順序（コンストラクタ、変数初期化子）

1. 子クラス: static変数初期化子
2. 子クラス: staticコンストラクタ
3. 子クラス: 変数初期化子
4. 親クラス: static変数初期化子
5. 親クラス: staticコンストラクタ
6. 親クラス: 変数初期化子
7. 親クラス: コンストラクタ(コンストラクタ初期化子)
8. 親クラス: コンストラクタ
9. 子クラス: コンストラクタ(コンストラクタ初期化子)
10. 子クラス: コンストラクタ

```csharp:確認用コード
// 変数初期化子テスト用のクラス
public class FieldClass
{
	public FieldClass(string str)
	{
		Console.WriteLine(str);
	}
}

// 親クラス
class BaseClass
{
	static FieldClass baseStaticField = new FieldClass("4. 親クラス: static変数初期化子");
	FieldClass baseField = new FieldClass("6. 親クラス: 変数初期化子");

	static BaseClass()
	{
		Console.WriteLine("5. 親クラス: staticコンストラクタ");
	}

	public BaseClass() : this("dummy")
	{
		Console.WriteLine("8. 親クラス: コンストラクタ");
	}

	public BaseClass(string dummy)
	{
		Console.WriteLine("7. 親クラス: コンストラクタ(コンストラクタ初期化子)");
	}
}

// 子クラス
class DerivedClass : BaseClass
{
	static FieldClass derivedStaticField = new FieldClass("1. 子クラス: static変数初期化子");
	FieldClass derivedField = new FieldClass("3. 子クラス: 変数初期化子");

	static DerivedClass()
	{
		Console.WriteLine("2. 子クラス: staticコンストラクタ");
	}

	public DerivedClass() : this("dummy")
	{
		Console.WriteLine("10. 子クラス: コンストラクタ");
	}

	public DerivedClass(string dummy)
	{
		Console.WriteLine("9. 子クラス: コンストラクタ(コンストラクタ初期化子)");
	}
}

public class ConstructorTest
{
	static void Main()
	{
		var obj = new DerivedClass(); // 子クラスをインスタンス化
	}
}
```
[Mac] 日本語変換のウィンドウが閉じない問題

# 日本語変換のウィンドウが閉じない問題

バグなのかなんなのかわかりませんが,
変換する際にウィンドウが閉じなくなることが結構あるので,
その時の対処方法をご紹介します。

ちなみにこのようにウィンドウが消えなくなります。
<img width="380" alt="スクリーンショット 2016-07-21 19.51.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/74135/bf2af9bf-d75f-4054-cf57-b50292942d03.png">


## 解決策

1. アクティビティモニタを開く
 
<img width="367" alt="スクリーンショット 2016-07-21 19.53.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/74135/1eb61a31-f4fb-1638-9c02-bc6cf5cef0fe.png">


2.検索欄に "日本語" と入力

<img width="705" alt="スクリーンショット 2016-07-21 19.55.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/74135/25692a50-a345-0389-ded9-f7a94f332aba.png">

3.画像のようにプロセス名 [日本語入力プログラム] というのがでてきますので, 
ダブルクリックし左下の[終了]をクリック

以上でウィンドウは消去されます。
http://localhost:3000にアクセスすると「ERROR - The requested URL could not be retrieved」になる


Web開発中に発生したエラーについて対応した方法を書く。

# エラー内容
grunt-contrib-connectで簡易サーバー起動後、ブラウザからアクセスするとこんなエラー画面になりました。

```
ERROR
The requested URL could not be retrieved

While trying to retrieve the URL: http://localhost:3000/

The following error was encountered:

    Connection to 127.0.0.1 Failed 

The system returned:

    (111) Connection refused

The remote host or network may be down. Please try the request again.

Your cache administrator is root. 
```

要するに、`http://localhost:3000/`にアクセスしたところ`127.0.0.1`への接続が失敗し、システムがエラーコード(111)を返してきているよ、リモートホストかネットワークが落ちてるかもね。って話ですね。

# 原因究明

私の環境ですが、Windows7です。

リモートホストかネットワークが原因との事なので、まずはホストから。

今回はgruntで立ち上げているのでgruntのログを確認し、以下のメッセージが出てればOK。
確認するログはコンソールに出ているメッセージです。

```
Started connect web server on http://localhost:3000
```

次にネットワークの確認。
ネットワークでのトラブルシュートはまずはpingですね。

gruntとは別にコマンドプロンプトを立ち上げてpingを打ってみます。

```
$ ping localhost

************* [::1]に ping を送信しています 32 バイトのデータ:
::1 からの応答: 時間 <1ms
::1 からの応答: 時間 <1ms
::1 からの応答: 時間 <1ms
::1 からの応答: 時間 <1ms

::1 の ping 統計:
    パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、
ラウンド トリップの概算時間 (ミリ秒):
    最小 = 0ms、最大 = 0ms、平均 = 0ms
```

`*************`はホスト名です。隠してます。
pingの結果、応答はちゃんと返って来ているようですね。
さて、もう少し詳しく見てみます。ホスト名の横の[]に囲まれている箇所ですが、
名前解決後のIPアドレスが表示されています。

`localhost`は名前解決されると`::1`となるようです。あまり見慣れないアドレスですね。。。

「IPアドレスって数字4つをピリオドで繋いだものじゃないの？」なんて疑問を持つかもしれませんが、
普段良く見る`192.168.0.2`なんてアドレスはIPv4アドレスと呼ばれるものです。
それに対し今回の`::1`のようなものはIPv6アドレスと呼ばれるものです。

IPv6？？？って方はググッてください。

話を戻しますが、要はlocalhostは名前解決された結果IPv6アドレスとなり、
IPv6プロトコルとしてサーバーにアクセスしに行ったというわけです。

先頭のエラーメッセージを思い出すと、「127.0.0.1への接続が失敗し･･･」と言われていました。
つまり、「ブラウザとしてはIPv4アドレスとして名前解決して欲しかったけどシステムからIPv6が返ってきちゃった」というような感じです。
（ここのところ、細かい部分で気になる人いると思います。私も細かい部分が分かってないかもしれません。ご指摘歓迎です。）

# 対応策

localhostやLAN内の名前解決がうまくいっていないのであれば、まずはhostsファイルを確認してみるといいです。
hostファイルは`C:\Windows\System32\drivers\etc\hosts`にあります。

中を見ると以下のような記載が。

```
# localhost name resolution is handled within DNS itself.
	127.0.0.1       localhost
	::1             localhost
```

ありますね。IPv6アドレスとlocalhostを紐付けている行が。
`::1   localhost`の行頭に`#`を入力してこの行をコメントアウトします。

```
# localhost name resolution is handled within DNS itself.
	127.0.0.1       localhost
#	::1             localhost
```

そもそも記載がない場合は、`127.0.0.1   localhost`の行をコピー&ペーストしてください。

この記載もないのに！！って方は、IPv6プロトコルを無効にする方法があります。

コントロール パネル＞ネットワークとインターネット＞ネットワークと共有センター
と進むと、左側に「アダプター設定の変更」というメニューが出てくるはずなのでそこへ行きます。

すると接続一覧が出てくるので該当の接続のプロパティを開きます。
一覧の中の「インターネット　プロトコル　バージョン6(TCP/IPv6)」のチェックを外せば無効になります。

これでもう一度アクセスしてみると、無事にアクセス成功となるはずです。

hostsファイルに書き込むのは管理者権限がないと出来ないので気をつけてください。
また場合によって反映に再起動が必要かもしれません。
オフラインリアルタイムどう書くE06 の問題

@Nabetani さんが主催するオフラインでリアルタイムに「どう書く」をやるイベント( https://yhpg.doorkeeper.jp/events/48610 )で問題を出させてもらいました。
問題は「目指せホゲモンマスター」という名前で、詳細は
http://mtsmfm.github.io/2016/08/06/doukaku-e06.html
です。
実装ができた方はこちらのコメント欄からリンクを張っていただくと見つけやすくて助かります。
似たような問題をもっと解きたいという方は、Doorkeeper の コミュニティページ
http://yhpg.doorkeeper.jp/
に @Nabetani さんの過去問リンク集がありますので、そちらをご覧になると良いと思います。
jupyter notebook を、local,kaggle,Microsoft,IBM で共通化しよう。

### Jupyter notebook をあちこちのサービスで使うためのちょとした工夫

スクリプトが今どこにいるかを、判定するコードです。手元でつくったnotebook をあげるときに
便利だと思ってつくっています。

```
import os
os.getcwd()
#/kaggle/working (kaggle)
#'/home/nbuser' (azure)
# '/resources' (ibm)

p_list = {"/kaggle/working":"kaggle","/home/nbuser":"azure","/resources":"ibm"}

try:
   x_platform =  p_list[os.getcwd()]
except:
   x_platform ="local"

print(x_platform)
```
Androidの最新情報を追いかけるリンクメモ

本当にメモです。
基本的にはTwitterとかでGoogleのDeveloperなどをフォローして手に入れる情報が多いです。
あとRSSにAndroid系のブログを登録しておいて、たくさん登録しておいて時々流し見します。
ただ、本当にときどきAOSPのランキングやStackOverflowの面白い回答などがみたくなるのでメモしておきます。

# 公式

Android Studioの更新
http://tools.android.com/recent

Support Libraryの更新
https://developer.android.com/topic/libraries/support-library/revisions.html

Google Play Servicesの更新
https://developers.google.com/android/guides/releases

Androidバージョンシェア
https://developer.android.com/about/dashboards/index.html

# ブログなど

Android Developers
http://android-developers.blogspot.jp/

Android Weekly
http://androidweekly.net/#latest-issue

(たくさん)

# コミュニティ
Android Open Source Project - Issue Trackerの30日以内にオープンされたスター順issue
https://code.google.com/p/android/issues/list?can=2&q=opened-after:today-30%20&sort=-stars&colspec=ID%20Status%20Priority%20Owner%20Summary%20Stars%20Reporter%20Opened

AndroidでStackOverFlow 一ヶ月で作られた質問でスコアが10以上で回答あり
http://stackoverflow.com/search?q=%5Bandroid%5D+%09answers%3A1+score%3A10+created%3A1m

Reddit r/androiddev 一週間のトップ
https://www.reddit.com/r/androiddev/top/?sort=top&t=week

GitHub trending
https://github.com/trending/java
EFS介绍


### EFS介绍
　　
和 [Windows BitLocker](http://www.williamlong.info/archives/4296.html)一样，Encrypting File System（[EFS](http://www.williamlong.info/archives/4327.html)，加密文件系统）是Windows内置的一套基于公共密钥的加密机制，可以加密NTFS分区上的文件和文件夹，能够实时、透明地对磁盘上的数据进行加密。

### 加密操作

　　加密方法用户是透明的，文件加密之后，不必手动解密，使用者能自动打开加密文件，而其他用户则无法打开加密文件。

　　加密的方法很简单，在任何一个NTFS分区的目录或文件下，右击要加密的文件或文件夹；然后单击“属性”，在“常规”选项卡上，单击“高级”按钮；在弹出的窗口中，勾选“加密内容以便保护数据”复选框；点击“确定”即可，在关闭文件时文件即被加密。

![](https://img.readitlater.com/i/www.williamlong.info/upload/4327_1/RS/w704.jpg)  

在默认情况下，被EFS加密的文件或文件夹在资源管理器中会显示为绿色，这表示该文件或文件夹已经被EFS加密了。

　　如果不再希望对某个文件实施加密，清除该文件的属性中的复选框即可。
　　
### 备份密钥
　
　　ESF加密操作虽然简单，但是如果用户重装了系统，以后即使利用原来的用户名和密码，也无法打开EFS加密文件(夹)，因此用户应该及时备份密钥，这样以后即使重装系统，也能打开加密文件。

　　在进行加密操作后，Windows系统状态栏会自动提示用户进行备份加密密钥，点击后会出现“备份文件加密证书和密钥”的对话框，选择“现在备份”，会出现证书导出向导。

![](https://img.readitlater.com/i/www.williamlong.info/upload/4327_2/RS/w704.jpg)

　　点下一步导出文件格式选项里，选择默认的“个人信息交换”。

![](https://img.readitlater.com/i/www.williamlong.info/upload/4327_3/RS/w704.jpg)

　　再点下一步输入密码，这个密码是恢复证书要使用的密码，然后点下一步，选择保存地址，然后即可将证书文件成功导出。

![](https://img.readitlater.com/i/www.williamlong.info/upload/4327_4/RS/w704.jpg)

　　如果用户没有点状态栏的图片即时进行备份密钥，也没有关系，还可以通过手动备份的方式进行密钥备份，方法是：点击菜单“开始”-“运行”，键入certmgr.msc打开证书管理器，点击“个人”-“证书”，只要以前做过加密操作，右边窗口就会有用户名同名的证书，假如有多份证书，选择“预期目的”为“加密文件系统”的；右击“证书”，在菜单中选择“所有任务”-“导出”。

![](https://img.readitlater.com/i/www.williamlong.info/upload/4327_5/RS/w704.jpg)

　　之后会弹出一个“证书导出向导”窗口，在窗口中选取“导出私钥”，并按照向导的要求，输入密码保护导出的私钥，选择保存证书的目录，最后就完成了证书文件的导出工作。

![](https://img.readitlater.com/i/www.williamlong.info/upload/4327_6/RS/w704.jpg)

### 加密的优点

　　EFS加密基于公钥加密策略，使用了一种快速的对称加密算法用一个随机生成的文件加密密钥（file encryption key，FEK）对文件或文件夹进行加密，加密不同的文件或文件夹时使用的密钥也不相同。

　　EFS加密的用户验证过程是在登录Windows时进行的，只要登录到Windows，就可以打开任何一个被授权的加密文件。所以这就是为什么EFS加密后的文件夹或文件，用户几乎无法感觉到加密效果的原因。

　　从操作的便利性来说，由于EFS的密码和用户登录Windows密码集成在一起，因此无需输入密码即可解密文件，操作甚为方便。
　　
### 加密的缺点

　　不过，相比Bitlocker来说，EFS加密拥有几个重大的缺点。

　　首先，如果在重装系统前没有备份加密证书，重装系统后EFS加密的文件夹里面的文件将无法打开，即使用户使用原先的密码登录，也不能解密文件。

　　其次，对于多用户操作同一台电脑的情况，另一个用户虽然无法看到加密的文件内容，但是依旧可以看到加密的文件夹名称和文件名称，从而获得一些信息，此外，如果加密时候使用默认权限，其他用户还可以对EFS加密的文件和文件夹进行删除操作，因此，用户在使用EFS加密的时候，需要在“属性”-“安全”选项里设置一下文件或文件夹的访问权限，以防止他人查看或删除。

　　对于多用户使用同一台电脑还有一个有意思的情况，如果多用户都有管理员权限，那么修改另一个用户的密码，并用这个用户的身份登录系统后，并不能访问被EFS加密后的文件，因为用户密码被他人修改，但如果是用户自己对密码进行修改（需要输入旧密码的方式修改），那么用户依然可以打开被EFS加密的文件。

　　对于未设置访问权限的EFS加密文件是进行解密的前提条件是：知道用户帐户的登录密码，该被删帐户的配置文件必须存在，因为加密后的私钥和主密钥(还包括证书和公钥)，都保存在配置文件里，如果以上两个条件满足，那么先从旧的配置文件里面获得被删帐户的SID（在配置文件目录\Application Data\Microsoft\Crypto\RSA 下有一个以该帐户的SID为名的文件夹，然后新建一个用户，用newsid工具把SID改的和原来一样，然后用新用户登录，随便加密一个文件，再注销，把旧的配置文件覆盖新用户的配置文件，再用新用户登录进去就可以解密其它文件了。

### Bitlocker和EFS的对比

　　Bitlocker主要用于加密整个驱动器、外部硬盘、U盘等，EFS主要用于加密单个文件或文件夹。

　　Bitlocker不依赖用户账户，对于所有用户都是同样的状态（打开或关闭），EFS的加密依赖用户账户，如果电脑有多个用户，每个用户都可以独立加密自己的文件。

　　Bitlocker必须是管理员用户才能使用，EFS不需要管理员权限即可使用。
Espruinoに接続してプログラムを実行

電子工作知識ゼロのWeb系エンジニアがIoTに挑戦。
とりあえず、Espuruino（JavaScriptで動くマイコン）とESP WROOM-02（WiFiモジュール）を繋げて、外出先からセンサの情報を取得するようなことを目指しています。

## 準備するもの
- Espruino
    - 日本では[ELEFINE](http://www.elefine.jp/SHOP/EspruinoOriginal.html)というショップから通販できます
- USBケーブル(A-マイクロB)

## 手順
### Web IDEのインストール
なんと！Chromeの拡張機能として提供されています。
[ここ](https://chrome.google.com/webstore/detail/espruino-web-ide/bleoifhkdalbjfbobjackfdifdneehpo)からインストール。

### Espruinoと接続＆初期設定
USBケーブルでPCと接続し、IDEから接続（左上の黄色いボタンを押す）。
デバイス選択画面が現れるので、下に「Espruino board」と表示されているデバイスのうち、「/dev/tty.」で始まる方を選びます。（Macの場合）
![スクリーンショット 2016-08-06 13.47.43.png](https://qiita-image-store.s3.amazonaws.com/0/135266/df76fe5e-8987-6675-ed73-2e7c9bff0c88.png)

無事接続できたら、ファームウェアのアップデート。
右上の歯車アイコンを押して現れる画面の左側で、「FLASHER」をクリックして、「Flash firmware」ボタンをクリック。
いきなりオプションを選ばされる。
![スクリーンショット 2016-08-06 13.59.12.png](https://qiita-image-store.s3.amazonaws.com/0/135266/0f16e43b-526d-2c92-254f-8d58820c3460.png)
どうやらネットワーク接続の方法を聞かれているみたいだけど、今回使う予定のWiFiモジュール（ESP WROOM-02）がない。
![スクリーンショット 2016-08-06 13.59.23.png](https://qiita-image-store.s3.amazonaws.com/0/135266/5c262df8-b4bc-4fc8-6ad5-454935e495fe.png)
片方はイーサネット、片方はWiFiなので、WiFiの方を選んでおけばいいか・・・ってことで「TI CC3000」の方を選択。（WiFi接続未確認なので、成否は改めて記載します）

あとは、ダイアログに現れる英文の指示に従い、Espuruinoのボタンを押したりしていけばアップデート完了！

### プログラムを実行してみる
IDEの左側がターミナル、右側がコードエディタになってます。
とりあえず、IDEにサンプルとして入っているコードを実行してみます！
![スクリーンショット 2016-08-06 15.16.06.png](https://qiita-image-store.s3.amazonaws.com/0/135266/cb30c48f-d4d9-d98d-a507-311f8762ff4d.png)
真ん中らへんのアイコンをクリックして、Espruinoに送信。
![image1.JPG](https://qiita-image-store.s3.amazonaws.com/0/135266/c0533bf5-bd1c-1e63-322b-6e41c621ae95.jpeg)
LEDが・・・て、点滅したーっ！
これが有名なLチカってやつでしょうか。嬉
コードはこんな感じ。

```js
var  on = false;
setInterval(function() {
  on = !on;
  LED1.write(on);
}, 500);
```

LED1をLED2にしたり、500の数字を変えたりすると、LEDの色や点滅の速度が変ります。
これだけで結構楽しい。

普段ソフトウェアばかりいじっていると、自分のプログラムで「モノ」が反応するってだけでワクワクしちゃいますね。
次回は、ブレッドボード上でLEDやセンサと接続してみたいと思います。
数据安全教程


@(MD文档)[马克飞象, Windows, 技巧]

[TOC]

## 什么是EFS加密
>EFS加密是基于公钥策略的。

EFS加密系统对用户是透明的。这也就是说，如果你加密了一些数据，那么你对这些数据的访问将是完全允许的，并不会受到任何限制。而其他非授权用户试图访问加密过的数据时，就会收到“访问拒绝”的错误提示。EFS加密的用户验证过程是在登录Windows时进行的，只要登录到Windows，就可以打开任何一个被授权的加密文件。

## 如何加密文件

>为了保证数据安全，推荐在移动硬盘上加密私人文件。

* 确认所需要加密的文件是保存在 `NTFS` 分区上。
* 另外最好是把需要加密的文件放在几个文件夹里。磁盘根目录不适合放需要加密的文件。当然也能针对一个文件进行下面的加密操作。

- 在需要加密的文件夹上点右键，选择属性，然后勾选如图的勾，并点OK，然后点属性窗口的应用，然后选择应用到子文件夹和文件。视文件夹大小所需时间不同。最好是预先建立好空文件夹，然后把需要加密保护的文件放在这个文件夹内即可。
- ![](https://ooo.0o0.ooo/2016/07/06/577ccaf31a2cd.png)

- 加密完成后，系统应该会提示需要备份加密的证书。此时只要按照向导把证书备份到一个地方就可以了。期间需要输入保护证书的密码 
- **`密码很重要，在更换系统（电脑）或者重装系统后需要重新导入以解密之前加密的文件，导入证书时需要输入此密码，务必牢记`**  


## 备份加密的证书

- 如果系统没有提示备份证书。则需要手动备份，步骤如下
- 点击开始->运行,输入 certmgr.msc,然后回车，在左窗格展开“个人”/“证书”目录。如下图所示。

- ![](https://ooo.0o0.ooo/2016/07/06/577cccfe46c3d.png)

- 我们需要的是**预期目的**被标记为**加密文件系统**的证书，在备份的时候记得不要选错了。，然后右键 选择`所有任务->导出`选项，然后在
- 欢迎使用证书导出向导对话框中单击`下一步`按钮。

- 然后在选择是否导出私钥的时候,务必选择 **`是`** ，然后选择保存位置。最后点导出。

- 看到导出成功后，应该能在保存位置看到一个 扩展名是`pfx`的文件，如果没有开启显示已知的扩展名的话应该看不到`pfx`，但是会有如图的这个图标 ![](https://ooo.0o0.ooo/2016/07/06/577ccdf96219f.png)

- _可选安全操作步骤_

    - _删除已经导出的这个证书，然后双击导出的这个`pfx`文件重新导入，在如下操作框内，不要勾选允许导出私钥，以保证不被他人恶意导出私钥用来解密你的文件_
  - ![](https://ooo.0o0.ooo/2016/07/06/577ccee92d707.png)


## 配置灾难恢复证书

>为了防止之前导出的证书丢失，导致加密的文件不能访问，可以在系统里配置另外一个恢复证书，每次使用主证书加密文件的时候会把恢复证书信息也添加到加密后的文件中以保证灾难时能正常恢复加密的文件。
>另外 需要`Windows7 旗舰版` 才能使用恢复代理 功能。

* 依次点击开始`->`运行，输入`secpol.msc`，然后回车，以打开“本地安全策略”。
* 单击“公钥策略”，右键单击“加密文件系统”，然后单击“添加数据恢复代理程序”。此操作将打开添加故障恢复代理向导，直接点击下一步。

* ![](https://ooo.0o0.ooo/2016/07/06/577cd06c3eb5b.png)

* 然后在下一个窗口点击浏览选择和**这个PDF文件**一起的`recovery.cer`证书文件

* ![](https://ooo.0o0.ooo/2016/07/06/577cd10eaaabe.png)

* 随后在下一个警告窗口中直接点`确定`就能导入恢复证书，导入完成后如之前那张图所示有一个`Chinni`的证书就表示成功。

* 最后需要刷新下策略，依次点击开始`->`运行，cmd，然后在命令行窗口里直接输入`gpupdate`，然后回车，稍等片刻就可以了。

##配置新设备
>在新的机器上使用移动硬盘，需要先安装之前导出的证书文件，然后最好配置灾难回复证书，然后再在新设备上操作加密的文件/文件夹。

* 如果遇到系统重装，或者需要在新的电脑上使用已加密的文件则需要导入之前备份的`pfx`证书即可。导入的时候需要提供之前导出证书时候输入的密码。

## 参考文档
* [百度百科](http://baike.baidu.com/view/43143.htm)


## 其他注意事项

* 视频文件，例如电影什么的可以不加密就不要加密。主要加密的是自有数据。比如文档照片之类的。
* 另外比较推荐 坚果云（https://www.jianguoyun.com） 这个服务。大家可以去注册一个账号试用一下。可以把任意系统上的文件夹同步到网络。也有版本控制，能保留30天内的文件变更的历史版本。一般免费版够用。
MacでVMware Remote Consoleがつながらないときの対応

#目的
MacでVMware Remote Consoleがつながらず、エラー「Unable to connect to MKS: Could not locate vmware-authd executable」が出ることの解決

#原因
参考のリンクによれば、vCenterやPSCの名前解決ができていても
ESXiホストに対する名前解決ができてないことが原因

#解決手順
Macの場合は、以下のコマンドで対応可能。

```
sudo vi /private/etc/hosts
#以下を記入
10.xx.xx.xx esx01.host.com
```

#参考
Unable to connect to MKS: Could not locate vmware-authd executable – Wu's Blog : https://zhengwu.org/2016/07/08/unable-to-connect-to-mks-could-not-locate-vmware-authd-executable/comment-page-1/
tf.nn.dynamic_rnnでDynamic Recurrent Neural Network

TensorflowでDynamic Recurrent Neural Network(入力の系列長が可変のRNN)を計算する方法として[aymericdamien/TensorFlow-Examples](https://github.com/aymericdamien/TensorFlow-Examples)で紹介されている`tf.nn.rnn`を利用する方法がありますが、`tf.nn.dynamic_rnn`を用いるとより簡単に実装できました。
(TensorFlow v0.10.0rc0で動作を確認しています)

---

ポイントは入力をゼロ埋めした上で、`tf.nn.dynamic_rnn`の引数`sequence_length`にゼロ埋めする前の系列の長さを渡すことです。

まず、placeholderとして`input`の他に、各系列の長さを格納する`sequence_length`を用意します。

```python
input = tf.placeholder(tf.float32, [None, seq_max_len, nin])
sequence_length = tf.placeholder(tf.int32, [None])
```

それからいつものようにセルを準備して(このセルはGRUじゃなくても何でも良いです)

```python
cell = tf.nn.rnn_cell.GRUCell(n_hidden)
initial_state = cell.zero_state(batch_size, dtype=tf.float32)
```

出力を得ます(sequence_lengthを引数に与える)。

```python
output, _ = tf.nn.dynamic_rnn(
    cell, input, initial_state=initial_state,
    sequence_length=sequence_length)
```

最後に各系列の最後の出力を取り出す必要があります。`tf.gather`は1-Dのインデックスしかサポートしていない(逆に`tf.gather_nd`は勾配計算をサポートしていない… [#206](https://github.com/tensorflow/tensorflow/issues/206))ので、一度`tf.reshape`を使って`output`をflattenしてから`tf.gather`しています。

```python
index = tf.range(0, batch_size) * seq_max_len + (sequence_length - 1)
output = tf.gather(tf.reshape(output, [-1, n_hidden]), index)
```

---

擬似的なデータを使った完全なプログラムは[ここ](https://gist.github.com/p-baleine/9eedf5c5a6245ec0e87d662abeb67c0b)に置いてあります。

…しかし早くtheanoみたいにnumpyライクなインデックシングしたいですねぇ。
Perlで数値文字参照を含む文字列を通常の文字列に変換する。

CPAN の HTML::Entitie 内のを`decode_entities`メソッドを使用すればOK.

```
decode_entities($string);
```

---

下記のような文字列を

```
おはようございます&#128512;
```

下記のように変換できる。

```
おはようございます😀
```



参考
http://perldoc.jp/docs/modules/HTML-Entities-3.55/Entities.pod
cocos-2dx 3.x + OpenCV3.x で CameraTexture(2016/08版)

#背景
cocosもopenCVも頻繁にバージョンアップするので「今」できることが分かりにくかったので、まとめをメモしておきます。

#やりたいこと
マルチプラットフォーム(Android/iOS)対応で、カメラ画像とその他画像を表示する。

#方針
cocos-2dx には、Unity の WebCamTexture のようなクラスがないので、OpenCV(C++)でCameraPreviewの画像を拾ってきて、cocos(C++) でテクスチャ表示すれば簡単かと考えました。

#問題
1.Android 5.0 から新しいカメラAPIが出た。(Camera2)
2.OpenCV が 3.x になって Android の NativeCamera サポートをやめ、C++だけで完結しなくなった。(OpenCV 2.x 系も、Android 5.0以降は非対応？)

#今回の実装(Android5.0以降のみ対応)
1. Cocos2dxActivity 派生の AppActivity に OpenCV の CameraBridgeViewBase を実装（見えないところに）。
2. onCameraFrame の内容を、jni 経由で、cpp 側に渡す。
 - inputFrame.rgba().getNativeObjAddr() を使う。
3. あとは他の記事を参考にテクスチャを更新。
 - cocos thread で動作させるのをお忘れなく。

```cpp:
void onUpdate(cv::Mat& matRgba) {
  ...
  auto scheduler = Director::getInstance()->getScheduler();
  scheduler->performFunctionInCocosThread([&]() {
    // ここでテクスチャを更新。
  });
}
```

※iOS側は cv::VideoCapture を利用して C++ だけで実装できます。


以上です。
Python sys.intern()

`sys.intern()` は、内容が同じ「等価」な文字列に対して実行環境上で「同一」の文字列を返す。返された文字列どうしは`==`ではなく`is`で一致するようになる。

特に文字列が長い場合、 `sys.intern()` で大幅な高速化を期待できるはずだ。以下に例を示す。

```py3:intern_test.py
import sys
import timeit

def comp1(a, b):
    return a == b

def comp2(a, b):
    return a is b

for n in [10000, 50000]:
    a = ''.join([str(s) for s in range(0, n)])
    b = ''.join([str(s) for s in range(0, n)])
    ia = sys.intern(a)
    ib = sys.intern(b)
    print("--{}--".format(n))
    print("comp1(a, b)", comp1(a, b),
          timeit.timeit("comp1(a, b)", globals=globals()), sep='\t')
    print("comp2(a, b)", comp2(a, b),
          timeit.timeit("comp2(a, b)", globals=globals()), sep='\t')
    print("comp1(ia, ib)", comp1(ia, ib),
          timeit.timeit("comp1(ia, ib)", globals=globals()), sep='\t')
    print("comp2(ia, ib)", comp2(ia, ib),
          timeit.timeit("comp2(ia, ib)", globals=globals()), sep='\t')
```

Python 3.6.2 での実行例を示す。

```shell-session
$ python intern_test.py
--10000--
comp1(a, b)     True    1.5900884549773764
comp2(a, b)     False   0.12032010598341003
comp1(ia, ib)   True    0.13831643099547364
comp2(ia, ib)   True    0.13083625899162143
--50000--
comp1(a, b)     True    11.056225399981486
comp2(a, b)     False   0.11997383600100875
comp1(ia, ib)   True    0.13671555201290175
comp2(ia, ib)   True    0.12875197199173272
```

`comp1(a, b)`に対して`comp2(ia, ib)`は高速になっていることが分かる。また、`==` は予想通りサイズに対してO(n)で遅くなっている気配がするのに対して `is` は O(1)。

ところで`comp1(ia, ib)` (`ia == ib`)の結果も十分に高速になっているが、`comp2(ia, ib)` (`ia is ib`)と比較すると10ms弱程度遅い。if分岐か何かだろうか。

追記 (2017-09-01): Python 3.6.2 を用いて内容を修正。
追記 (2017-09-04): 文面を少し修正。
PCの小技～備忘録～

環境：Windows１０
##スクリーンショット
プログラムを実行した画面のみをスクリーンショットで撮りたい時
Alt＋PrtSc　でアクティブウィンドウのみを取れる（機種による）


##ショートカット
<dt>win+r
<dl>Windowsボタンをおした時のプログラムの検索と同じ

<dt>win+x</dt>
まぁコレ覚えとけば十分かな？

<dt>win+x, a(c)</dt>
楽にPowerShell（コマンドプロンプト）を開ける
</dl>
</dt>
##その他
ファイルをShift押しながら右クリックで「パスのコピー」という選択肢が出てくる
Shitf+Delでファイルの完全削除

随時更新予定
Redux の reducer で switch を使わない

## はじめに

下記のコードは、[公式ドキュメント](http://redux.js.org/docs/recipes/ReducingBoilerplate.html#reducers)のコピペです。テクニックについてとても勉強になったので感想を入れつつ、メモを残しています。


## Switchによる問題点と関数型プログラミングのアプローチ

Switchによる制御は、分岐が増えることによって制御を行うプログラムの実装が複雑になっていく可能性がある。
例えばReduxにおける、Reducerの実装がそれにあたる。

```js:今後ActionTypeがどんどん増えていくと、`todos`の実装は長くなり、Switch分の中身が複雑になっていく
export function todos(state = [], action) {
  switch (action.type) {
  case ActionTypes.ADD_TODO:
    let text = action.text.trim()
    return [ ...state, text ]
  default:
    return state
  }
}
```

関数型プログラミング脳では、このような問題に関して、扱う範囲を分解することでそれぞれをシンプル作れないか？という疑問をいつも持つことが推奨されている。
そこで今回のケースでは、**ある特定の条件に基づいて、それぞれの場合に応じた具体的な処理を決定し実行する**という問題を、

* 任意の条件にマッチしたら対応する関数を呼び出す（という抽象的な問題）
* 特定の条件と具体的な処理を実装し、上の関数に登録する（という具体的な問題）

という二つに分解する。

```js:`todoReducer`内の実装で特定の条件と具体的な処理のペアが増えても、`createReducer`の実装は変わらない
const ActionType = {
  ADD_TODO: 'ADD_TODO',
  TOGGLE_TODO: 'TOGGLE_TODO'
}

// 任意の条件にマッチしたら対応する関数を呼び出す
function createReducer (initialState, handlers) {
  return function reducer(state = initialState, action) {
    if (handlers.hasOwnProperty(action.type)) {
      return handlers[action.type](state, action);
    } else {
      return state;
    }
  }
}

// 特定の条件と具体的な処理を実装し、上の関数に登録する
const todoReducer = createReducer([], {
  [ActionType.ADD_TODO] (state, action) {
    const text = action.text.trim();
    return [...state, text];
  }
});
```

こうすることで`ActionType`の種類が増えて実装を修正するときにも、`createReducer`のテストケースを増やす必要はない。また`todoReducer`の実装もプロパティにActionCreatorを追加するだけでSwitch文などの制御自体をを増やす必要はない。さらに、`createReducer`はどのプロジェクトにも再利用することができる。

（実装を追加しても、複雑さを増やさないという意味で）**うん、エレガント**。
Python3とPyQt5を使ってのGUIプログラミング（２）～描画～

[前回](http://qiita.com/tak0-auk/items/f1172b139627c72e99f6)
##描画
QWidgetに描画するためにはpaintEventメソッドをオーバーライドします
drawRectで矩形を描画します

```py3
    def paintEvent(self, QPaintEvent):
        painter = QPainter(self)
        painter.setPen(Qt.black)
        painter.setBrush(Qt.red)
        painter.drawRect(10, 10, 10, 10)#　ｘ座標、y座標、高さ、幅
```

##更新

更新するためにはupdateメソッドを呼びます

```
self.update()
```
定期的に更新したい場合はQtのタイマーを使う

```
self.timer = QTimer(self)
self.timer.timeout.connect(self.update)
self.timer.start(1000)#ミリ秒単位
```

##例
```py3:test.py

# coding: UTF-8

import sys
from PyQt5.QtWidgets import QApplication, QDesktopWidget, QLabel, QWidget
from PyQt5.QtGui import QPainter, QFont
from PyQt5.QtCore import Qt, QTimer


class Test(QWidget):

    def __init__(self):
        app = QApplication(sys.argv)

        super().__init__()
        self.init_ui()
        self.show()

        self.timer = QTimer(self)
        self.timer.timeout.connect(self.update)
        self.timer.start(1000)#一秒間隔で更新

        app.exec_()

    def init_ui(self):
        self.setWindowTitle("PyQt5")
        self.resize(640, 400)
        self.frameGeometry()\
            .moveCenter(
                        QDesktopWidget()
                        .availableGeometry()
                        .center()
                        )
        self.x = 0
        self.y =200

    def paintEvent(self, QPaintEvent):
        painter = QPainter(self)
        painter.setPen(Qt.black)
        painter.setBrush(Qt.red)

        self.x += 1
        if self.x > 640:
            self.x = 0

        painter.drawRect(self.x, self.y, 10, 10)


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

すごくゆっくりですが赤い四角が右に動いていくはずです
timerでupdateを呼ぶ間隔を短くすればもっと早くなります

間違い等がありましたらコメントで教えて下さい
Raspberry Piの開封からセットアップまで

# Raspberry Pi
## Raspberry Piとは
Raspberry Pi（ラズベリーパイ）は、ARMプロセッサを搭載したシングルボードコンピュータ。ラズベリーパイ財団によって英国で開発されました。
教育目的で開発され、2012年2月29日に販売開始されました。
Model AとModel Bがあります。
内蔵ハードディスクや記憶装置を搭載していないので、その代わりにSDメモリーカードを起動および長期保存用のストレージに利用します。

OSはLinux、Raspbianを推奨しており、公式サイトからダウンロードできます。

* Raspberry Pi
* マウス
* キーボード
* ディスプレイ
* SDカード
* Micro USB
* HDMIケーブル

があれば簡単なセットアップや開発はできます。

## セットアップ
1. まずRaspberry Pi にマウスやキーボードなどのケーブルを接続してみましょう

HDMIケーブルを使って、ディスプレイと接続、MicroUSBケーブルで電源接続、USBケーブルでマウスとキーボードの接続。
電源スイッチがないので、MicroUSBケーブルを挿すとON、抜くとOFFです。

2. SDカードにOSを入れましょう

[OSのダウンロード](https://www.raspberrypi.org/downloads/noobs)
上記リンクから
NOOBSを選択して、zip形式でダウンロード、展開します。

[SDカードフォーマッター](https://www.sdcard.org/jp/downloads/formatter_4/index.html)
次はSDカードをフォーマットします。
上記リンクから自分のPCのOSにあったフォーマッターをダウンロードします。
フォーマッターを起動して、SDカードでフォーマットをしましょう。

フォーマット後、OSをダウンロードして解凍したファイルやフォルダ全てをSDカードにコピーします。
その後、SDカードをRaspberry Piに接続します。
電源及びディスプレイに接続されるとそのままインストールが開始されます。

OS選択ダイアログが表示されるので、Raspbianにチェックして「Install」ボタンを押します。
するとOSインストールが開始されます！
その後、起動してデスクトップが表示されます。

とりあえずはこれでセットアップ完了です。

あとは各自必要なものをインストールしていく必要があります。
VMware Remote Consoleにコピーアンドペーストする方法

#目的
IPアドレスがなく、RDP接続ができない仮想マシンに対して、コピーアンドペーストで設定を流したい

#セキュリティ上の懸念
ゲスト OS とリモート コンソール間のコピー アンド ペースト操作はデフォルトで無効です。
デフォルトでは、情報漏洩のリスクからコピーアンドペーストが無効にされています。
詳細については、『[ESX 構成ガイド](http://www.vmware.com/support/pubs/vs_pubs.html)』の「クリップボードにコピーされた機密データの漏えい制限」を参照してください

#設定手順 ※VMware Toolsが必須です
##仮想マシンごとに設定する場合
仮想マシンがパワーオフされていることを確認してください。
「仮想マシンを右クリック」->「設定の編集」->「仮想マシン オプション」->「詳細」->「構成の編集」->「行の追加」で以下の2行を追加します。
名前 = 値
isolation.tools.copy.disable = false
isolation.tools.paste.disable = false
<img width="658" alt="vmrc_copy_paste.png" src="https://qiita-image-store.s3.amazonaws.com/0/101361/bd6026e2-fdf1-64ca-0ec8-915a917cbbc5.png">


##ホスト上の全仮想マシンに対して設定する場合
sshでホストに対してrootログインをします。
以下のコマンドを打ちます。

```
cp /etc/vmware/config /etc/vmware/config.backup
echo 'vmx.fullpath = "/bin/vmx"' >> /etc/vmware/config
echo 'isolation.tools.copy.disable = "FALSE"' >> /etc/vmware/config
echo 'isolation.tools.paste.disable = "FALSE"' >> /etc/vmware/config
diff /etc/vmware/config /etc/vmware/config.backup
# virtual machine rebooting is needed.
#
#結果
--- /etc/vmware/config
+++ /etc/vmware/config.backup
@@ -4,6 +4,3 @@
 authd.proxy.vpxa-nfcssl = "vmware-vpxa:vpxa-nfcssl"
 authd.proxy.vpxa-nfc = "vmware-vpxa:vpxa-nfc"
 authd.fullpath = "/sbin/authd"
-vmx.fullpath = "/bin/vmx"
-isolation.tools.copy.disable="FALSE"
-isolation.tools.paste.disable="FALSE"
```

#設定の反映
設定後、仮想マシンを再起動すると、コピーアンドペーストができるようになります。
IPアドレスなどを設定する前の仮想マシンに、コマンドをコピーアンドペーストして、一瞬で設定できるようになるので、かなり初期設定の負担が減るかと思います。
ただし、ホストのアップグレード時には、この設定は引き継がれません。

#参考
vSphere 5.1 ドキュメント センター : https://pubs.vmware.com/vsphere-51/index.jsp?topic=%2Fcom.vmware.vsphere.security.doc%2FGUID-1F9BA268-D441-4194-B148-C0097E2F1480.html

クリップボードのコピー アンド ペーストが Vphere Client 4.1 以降で機能しない (2078914) | VMware KB : https://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=2078914