OmniAICreator/Qiita-1.07M huggingface dataset:
Raspberry Pi で mecab-ipadic-NEologd をNode.jsから使う 

再挑戦してみたら上手くいきましたのでメモ的にエントリします。

## 環境
- Raspberry Pi2 ModelB
- node.js v6.8.1
- mecab 0.996
- mecab-ipadic-neologd　2.0

## mecabのインストール
素直に`apt-get`を使います。

```bash
$ sudo apt-get install mecab
$ sudo apt-get install libmecab-dev
$ sudo apt-get install mecab-ipadic
```

```bash
$ mecab
サミュエルLジャクソン
サミュエル	名詞,固有名詞,人名,名,*,*,サミュエル,サミュエル,サミュエル
L	名詞,固有名詞,組織,*,*,*,*
ジャクソン	名詞,固有名詞,人名,姓,*,*,ジャクソン,ジャクソン,ジャクソン
EOS
```

## mecab-ipadic-neologdのインストール

Raspberry Piに直接インストールしてもエラーになってしまうので、諦めていました。（容量が原因と思い`Expand Filesystem`をオンにしてもダメでした）

Macにはインストール出来ていたので、「あれ？これコピーすればいいんじゃ？」と思い試したら上手くいきました。

[neologd/mecab-ipadic-neologd - GitHub](https://github.com/neologd/mecab-ipadic-neologd)

こちらよりMacにインストールすると以下のディレクトリに辞書が生成されます。

```
/usr/local/lib/mecab/dic/mecab-ipadic-neologd
```
これをzipファイルにして

![Monosnap 2016-10-30 20-08-51.png](https://qiita-image-store.s3.amazonaws.com/0/47128/aff028c2-de4d-d26f-464c-5e2af7c74ee1.png)

sftp（私はFilezillaを使用）を利用してホームディレクトリにアップロード。

アップロード後解凍します。

```bash
$ unzip dic.zip
```
mecab辞書の定位置に移動します。

```bash
$ sudo mv -v /home/pi/dic /usr/lib/mecab
`/home/pi/dic' -> `/usr/lib/mecab/dic'
```
辞書を指定して実行します。（Macとは階層が異なるのでちょっと注意が必要です）

```bash
$ mecab -d /usr/lib/mecab/dic/mecab-ipadic-neologd
サミュエルLジャクソン
サミュエルLジャクソン	名詞,固有名詞,一般,*,*,*,サミュエル・L・ジャクソン,サミュエルエルジャクソン,サミュエルエルジャクソン
EOS
```
「サミュエル・L・ジャクソン」が固有名詞として認識されています。上手くいきました。

## mecab-asyncでつかう

以下のライブラリを利用させていただきます。

[hecomi/node-mecab-async - GitHub](https://github.com/hecomi/node-mecab-async)

こちらもそのままインストールするとエラーが出てしまうので以下のようにインストールします。

グローバル領域にインストールします。

```bash
$ sudo npm install mecab-async -g
```

任意のフォルダのモジュールに移動します。

```bash
$ sudo mv -v /usr/local/lib/node_modules/mecab-async /home/pi/mecab-async/node_modules
`/usr/local/lib/node_modules/mecab-async' -> `/home/pi/mecab-async/node_modules/mecab-async'
```

これでモジュールが使えるようになりました。試しにこんなファイルを用意しました。

```js:app.js
var MeCab = new require('mecab-async')
var mecab = new MeCab();
    MeCab.command = "mecab -d /usr/lib/mecab/dic/mecab-ipadic-neologd"
    var text = process.argv[2]
    //注：パースコマンドを利用する時 "MeCab.~"と大文字にしないと動かないみたいです
    MeCab.parseFormat(text, function(err, morphs) {
        if (err) throw err;
        morphs.map(function(morph) {
        if (morph.lexical === '感動詞') {
          console.log(morph.lexical + ' : ' + morph.original);
        }
        if (morph.compound === '固有名詞') {
          console.log(morph.compound + ' : ' +morph.original);
        }
    });
    });
```

「感動詞」と「固有名詞」を抽出します。実行してみます。

```bash
$ node app.js こんにちは、サミュエルLジャクソンです。
感動詞 : こんにちは
固有名詞 : サミュエル・L・ジャクソン
```

やっとこさ上手くいきました。では。
Wordpressで勝手にタグを入れさせない方法

Wordpressで、勝手にbrタグなどを挿入されてしまい、意図通りの見た目で出力できなかった。
テーマディレクトリのトップレベルにあるfunctions.phpに以下の2行を足すとうまくいった。

    remove_filter('the_content', 'wpautop');
    remove_filter('the_excerpt', 'wpautop');
コマンドラインでcURLでAPIを呼んでJSONが帰ってくるときにデコードして出力

# はじめに
ちょっとAPIのテストしたいなーって時に戻り値がJSONで、「どんな風に辿れば良いのかな」とか「欲しいデータあるかな」と思ったので試しました。Macです。

# データ
今回の対象はライブドアの天気予報のAPIです。便利ですね。

```bash
$ curl 'http://weather.livedoor.com/forecast/webservice/json/v1?city=070030'

{"pinpointLocations":[{"link":"http://weather.livedoor.com ...
```

![Screen Shot 2016-10-30 at 20.45.38.png](https://qiita-image-store.s3.amazonaws.com/0/47327/d9c496af-f84e-adf2-2488-6ed2aaaba1d5.png)


> Livedoor お天気Webサービス仕様
> http://weather.livedoor.com/weather_hacks/webservice


# PHP
普段はPHPを使っているのでPHPでのデコードです。brewでCLI版のPHPを入れてしまっていますが、確かデフォルトでも動きます。

```php
 curl 'http://weather.livedoor.com/forecast/webservice/json/v1?city=070030' | php -r 'var_dump(json_decode(trim(fgets(STDIN))));'
```

![Screen Shot 2016-10-30 at 20.36.54.png](https://qiita-image-store.s3.amazonaws.com/0/47327/d48054c3-a75b-b0f5-7aed-1757b38d9964.png)


呼び出しがこんがらがりそうです。
`var_dump()`, `json_decode()`, `trim()`, `fgets()`, `STDIN`ですね。

# jq

./jqというJSON processorを使いました。
> https://stedolan.github.io/jq/

```bash
curl 'http://weather.livedoor.com/forecast/webservice/json/v1?city=070030' | jq
```

![Screen Shot 2016-10-30 at 20.42.19.png](https://qiita-image-store.s3.amazonaws.com/0/47327/03a9fcb5-8fde-e455-6df7-a75087956954.png)

使い勝手も簡単ですし、ターミナルによりますがデフォルトで色づけされます。便利ですね。

ですが初回はインストールする必要があります。

```bash
brew install jq
```

# まとめ
jqはお手軽で便利だなぁ、と。他の言語でもきっと出来るとおもいます。
ボックスの文字サイズと行間を反映した上下余白をremで返すmixin

![box-spacing.jpg](https://qiita-image-store.s3.amazonaws.com/0/21117/dd39a242-4f96-df02-a574-b220734667ff.jpeg)

見出しやボタンなどで、こういうコーディング指示はよく来ます。

ボーダーが上下2px、文字が一行だったときのボックス高さは44px。
中のテキストは、文字サイズが16px、行間は150%（1.5）です。

すべての要素を反映して上と下の余白を割り出す必要がありますが、手計算が面倒だし、remを使いたいので、以下のようなmixinを使っています。

```scss:box-spacing.scss
// px高さと文字サイズから必要な余白を計算し、remで返す

@mixin box-spacing( $height: 30, $font-size: 16, $line-height: 1.35, $border-top: 0, $border-bottom: 0, $rem: 16 ) {
  padding-top: ( ( ( $height - ( $border-top + $border-bottom ) - ( $font-size * $line-height ) ) / 2 ) / $rem ) * 1rem;
  padding-bottom: ( ( ( $height - ( $border-top + $border-bottom ) - ( $font-size * $line-height ) ) / 2 ) / $rem ) * 1rem;
}
```

SaSS内ではこのように使います。文字サイズの基準値が16pxではない場合は最後の引数を足します。

```scss:box-spacing_call.scss
.example {
  @include box-spacing( 44, 16, 1.5, 3, 3 );
}
```

これの欠点は「上下に均等な余白がある要素にしか使えない」ことなのですが、その場合は上にも余白があることにしてざっとコンパイルし、結果のCSSをコピペしたりして使っています。
はじパタの数学関連まとめ 　第1章

評判のよい"はじパタ"ですが、数学が割と容赦なく出てきている印象だったので、自分自身の理解補助のためにも、はじパタに出てくる数学関連事項のまとめメモを作成することにしました。
もし間違った解釈をしていることがありましたらご指摘いただけると幸いです。

#はじパタの数学 第1章

**次元の呪い**
ここは敢えて書くこともない事ないかもしれませんが…
特徴ベクトルの次元数が上がるにつれて学習に必要なデータ数が膨大になってしまうという事の説明です。
ここでは256次元の16階調の例（区画の数が$16^{256}$になる例）が書かれていますが分かりにくい場合は3次元の場合で考えてみるとスッキリするかも…
例えば3次元で16段階の分類がされていた場合は$16*16*16$で$16^3$ですね。
この例で、すべてのパターンを考えると$16^3$個ある各点が対応するわけですが、学習データの1つはこの1点に過ぎません。当然次元が増えて、すべてのパターンが膨大になった場合必要となる学習データの数もそれにつられて膨大になるという話です。

**単位超立方体**
いきなり抽象的な概念が出てきましたが、高次元の特徴ベクトルを扱う以上必要なのでしょう。
まず簡単に、d次元超立方体の特徴を以下にまとめます。(比較のため普通の立方体も載せます。)

|             | 3次元単位立方体（立方体） | d次元単位超立方体 |
|:------------:|:---------------:|:---------------:|
|中心から面までの距離|     $1/2$     |      $1/2$        |
|中心から頂点までの距離|    $\sqrt{3}/2$    |      $\sqrt{d}/2$       |
|面の数|     6     |     $2d$         |
|頂点の数 |     8      |   $2^d$      |
|表面積 |   6    |    $2d$      |
 
[中心から面までの距離]
まずここからスタートです。一辺の長さは1ですから、面までの距離は次元によらず$1/2$となります。

[中心から頂点までの距離]
立方体の場合は、
中心から頂点までの距離 = $\sqrt{(1/2)^2+(1/2)^2+(1/2)^2}$
で求めることができます。これをそのまま拡張してd次元の場合は、
中心から頂点までの距離 = $\sqrt{(1/2)^2+(1/2)^2+(1/2)^2…}$ = $\sqrt{d*(1/2)^2}$ = $\sqrt{d}/2$

[面の数]
3次元を考えてみると、立方体の面は各軸に2つずつあり、$3*2=6$となります。d次元も同様に考えて、各軸に直交する面（d−１次元超平面）が2つずつあるので$d*2=2d$となります。

[頂点の数]
1次元あたりから拡張していくと分かりやすいかもです。
1次元の線分から2次元の正方形になる時、頂点は2→4となります。線分を直交する方向に線分の長さだけ引きずっていくとその軌跡は正方形になり、当然作り方から頂点の数は2倍になるわけです。2次元から3次元も同様にして正方形を直交する軸の方へ一辺の長さ分ずらしていけば、その軌跡が立方体になり、頂点数は倍の8になります。
このように倍々になっていく性質からd次元の頂点数は$2^d$となります。

[表面積]
一つの面の面積が$1^{d-1}=1$で面の数が$2d$なので$2d$となります。d=3を当てはめてみると確かに単位立方体の表面積の求め方になりますよね。
CMSで見出しへの自動装飾とclassによる手動装飾を共存させる

CMSベースのサイトコーディングをしたことがない人に説明するのが難しいのですが…

システムで更新するサイトを作成する際には、自由入力を可能としている箇所にh1〜h6を使用したとき、それぞれに適切な装飾が反映されている必要があります。

単純に考えるとこうですが、もちろんこれでは本文以外のコンポーネントの装飾をリセットするのが大変です。

```css
h1 {
  /* h1の装飾 */
}
h2 {
  /* h2の装飾 */
}
```

なので、自由文の範囲を任意のクラスを付与したdivで囲み、それを条件に装飾するのが一般的です。

```css
.richtext h1 {
  /* h1の装飾 */
}
.richtext h2 {
  /* h2の装飾 */
}
```

## 装飾用クラスとの重複

ところが、実際の運用現場ではこう単純に行くわけがなく「マークアップはh3なんだけど、見た目はh1っぽくしたい」「マークアップはpなんだけど、見た目はh4っぽくしたい」というケースが**必ず**出てきます。

これを想定しておかないと納品後の手戻りが確実なので、私は制作時点から「.title-01」といったクラス指定にも対応して予防線を張っています。

しかし、以下の対応はNGです。

```css
.title-01,
.richtext h1 {
  /* h1の装飾 */
}
.title-02,
.richtext h2 {
  /* h2の装飾 */
}
```

「.title-01」は先述の「div.richtext」内でも使用される可能性があるので、このように書くと「.richtext h1」の方が優先されてしまいます。

## 結論

いろいろ考えた結果、私は以下のようにしています。

```css:headdings_without_richtext.css
.title-01,
.richtext h1:not([class*="title"]) {
  /* h1の装飾 */
}
.title-02,
.richtext h2:not([class*="title"]) {
  /* h2の装飾 */
}
```

タイトル装飾用のクラス名に必ず一意の接頭辞をつけるようにしたうえで、:not擬似セレクタで「クラスにその接頭辞が指定されている見出し」を除外します。

こうすれば、自由文内であっても、クラスを付与すればその装飾が反映され、クラスを付与していなければデフォルトの装飾が反映されることになります。

![headdings.jpg](https://qiita-image-store.s3.amazonaws.com/0/21117/401f0703-9941-e07d-bb7b-be499d14eb50.jpeg)
Jupyter Notebook > Input and output > In[22] / Out[22] / _ + 3

```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(IPython) NotebookのTutorial
https://www.youtube.com/watch?v=LNncYkzetJg&index=3&list=PLRJx8WOUx5Xd3_dgw5xRmABUd8MWdsA_C

8:10頃

以下の使用例が示されている。

- In[22]
- Out[22]
- _ + 3
Jupyter Notebook > %timeit range(100) > 処理時間の計測 > %%timeit > 複数文の処理時間の計測

```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(IPython) NotebookのTutorial
https://www.youtube.com/watch?v=LNncYkzetJg&index=3&list=PLRJx8WOUx5Xd3_dgw5xRmABUd8MWdsA_C

6:02頃

### %timeit range(100)

```
%timeit range(100)
```

上記でShift+Enter(Run Cells)すると処理時間が表示される。

`The slowest run took 4.85 times longer than the fastest. This could mean that an intermediate result is being cached.
1000000 loops, best of 3: 393 ns per loop
`

### %%timeit のあとに複数の実行文

```py
%%timeit

for x in range(100):
    y=x+1
```

`The slowest run took 18.90 times longer than the fastest. This could mean that an intermediate result is being cached.
1000000 loops, best of 3: 1.98 µs per loop
`

### %%timeitの練習

http://qiita.com/m_hsp/items/962b2188fbd498f646a9#comment-63ce26f588209c7b62df

```py
%%timeit

sum=0
i=0
while i<=100000:
    sum+=i
    i+=1
```
100 loops, best of 3: 3.01 ms per loop

```py
%%timeit
sum=0
for i in xrange(100001):
    sum+=i
```
1000 loops, best of 3: 1.64 ms per loop

```py
%%timeit
sum(xrange(100001))
```
1000 loops, best of 3: 526 µs per loop
Scalaのメソッド1（instanceof、キャスト）

scala始めました。instancof系をまとめました。

## isInstanceOfメソッド
Javaでいうinstanceof。指定した型が同じであればtrue。それ以外はfalse。

```scala:isInstanceOfSample.scala
object isInstanceOfSample {
  def main(args:Array[String]){
    val one : Int = 1
    
    println("Java: one instanceof Int")
    println(one.isInstanceOf[Int])
    println("")
    println("Java: one instanceof Byte")
    println(one.isInstanceOf[Byte])
  }
}
```

実行結果は

```
Java: one instanceof Int
true

Java: one instanceof Byte
false
```

oneはInt型なので、Byte型で比較するともちろんfalseが出る。

## asInstanceOfメソッド
Javaでの*キャスト*を意味する。

```scala:asInstanceOfSample.scala
object asInstanceOfSample {
  def main(args:Array[String]){
    val one : Int = 789
    
    println("Java: (Byte)one")
    println(one.asInstanceOf[Byte])
  }
}
```

実行結果

```
Java: (Byte)one
21
```

ついでにキャストがうまくいかないと（例えばoneをStringにキャストしてみる）、

```
Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
	at test.asInstanceOfSample$.main(asInstanceOfTest.scala:6)
	at test.asInstanceOfSample.main(asInstanceOfTest.scala)
```

ClassCastExceptionを投げてくる。

## まとめ
Javaだとinstanceofと書いたり括弧でくくったりして気軽にキャストできたが、scalaだとJavaより長くなっている。その理由が、このメソッドを使わず、match式を使ってくれということらしい(^^ゞ
vim の新規ファイル作成時FileName.un~ 上書き時のFileName~ の停止

## はじめに
windows環境下でVimでテキスト編集をすると
新規作成時: FileName.un~
上書き時に: FileName~
のFileName というファイル以外にもカレントディレクトリーに上記ファイルが作成されてします。

具体的に以下の感じになる![フォルダー.jpg](https://qiita-image-store.s3.amazonaws.com/0/140159/fccb26c9-48b6-7d57-87d2-0092d028f5b5.jpeg)

今回は上記二つのファイルが作成されないようにする
設定変更についてのメモ

### 環境
- windows7
- Vim 64ビット版

## FileName.un~
### 方法１
/vim/vimrc のファイル内に

```vim:/vim/vimrc
set noundofile
```
を記入すると、以後、新規ファイル作成時に `FileName.un~` が作成れなくなる。
### 方法2
`FileName.un~` を作成したくない時は以下をコマンドモードで実行

```vim
:set noundofile
```
上記のコマンドを実行したときだけ
`FileName.un~` が作成されなくなる。

## FileName~
### 方法１
/vim/vimrc のファイル内に

```vim:/vim/vimrc
set nobackup
```
を記入すると、以後、新規ファイル作成時に　`FileName~` が作成れなくなる。

* `set nobackup`は元々 vimrcファイルの中に記述してあって
先頭の `"`を消すことでコメントアウトが外れる。

### 方法2
`FileName~` を作成したくない時だけ以下をコマンドモードで実行

```vim
:set nobackup
```
上記のコマンドを実行したときだけ `FileName~` が作成されなくなる。

## 参考
[【Vim】ファイルを保存すると「.～.un~」というファイルが自動で作成される](http://munibus.hatenablog.com/entry/2015/07/16/230700)
Jupyter Notebook > help(open) > ビルトイン関数openのヘルプが表示される > help() > インタラクティブヘルプを表示

```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(IPython) NotebookのTutorial
https://www.youtube.com/watch?v=LNncYkzetJg&index=3&list=PLRJx8WOUx5Xd3_dgw5xRmABUd8MWdsA_C

### help(open)

2:14頃

```
help(open)
```

上記を入力してShift+Enter(Run Cells)すると、ビルトイン関数openのヘルプが表示される

```txt:結果
Help on built-in function open in module __builtin__:

open(...)
    open(name[, mode[, buffering]]) -> file object
    
    Open a file using the file() type, returns a file object.  This is the
    preferred way to open a file.  See file.__doc__ for further information.
```

### help()

```
help()
```

上記を入力してShift+Enter(Run Cells)すると、インタラクティブ型のヘルプが表示される。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/f41e96b1-cb54-279a-6d30-083be6d2ef34.png)


```
help>
```
の右側のボックスに`io`など入力すると、ioに関するヘルプが表示される。
Jupyter Notebook > %quickref > Quick Reference Cardの表示

```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(IPython) NotebookのTutorial
https://www.youtube.com/watch?v=LNncYkzetJg&index=3&list=PLRJx8WOUx5Xd3_dgw5xRmABUd8MWdsA_C

1:34頃

```
%quickref
```

Quick Reference Cardというものが表示される。
Jupyter Notebook > io? とShift+Enter > ioの説明を表示 > io??でさらに詳しい説明

```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(IPython) NotebookのTutorial
https://www.youtube.com/watch?v=LNncYkzetJg&index=3&list=PLRJx8WOUx5Xd3_dgw5xRmABUd8MWdsA_C

0:55頃に以下の説明がある。

- import sys
- import io
- io?を入力
- Shift+Enterでioに関するヘルプが表示される
   - Run cellsでもいい


![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/4f59e9d2-f42d-10a6-b75a-27bede8fd09a.png)
Ubuntu 14.04 > link > 有線LANのセットアップ

```txt:動作環境
Ubuntu 14.04 LTS desktop amd64
GeForce GTX 750 Ti
ASRock Z170M Pro4S [Intel Z170chipset]
```

TensorFlowをメインで処理しようとしているPCにおいて、無線LANの接続が不安定だ。
有線LANを使うことにした。

ifconfigを実行してもeth0が見えない状態。

```
$ lspci | grep Ethernet
00:1f.6 Ethernet controller: Intel Corporation Ethernet Connection (2) I219-V (rev 31)
```

以下を参考にしてセットアップできました。
http://rainbowdevil.jp/?p=1164

情報感謝です。
CrowiでGoogleAppsでのログインを有効化する

# はじめに
この[記事](http://qiita.com/oshuya/items/bd12cd40d4ba49c3f00b)でCrowiをセットアップしたら[公式ブログ](http://engineering.crocos.jp/post/101407633385/crocos-wiki-%E3%82%92-crowi-%E3%81%A8%E3%81%97%E3%81%A6%E5%85%AC%E9%96%8B%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F)でGoogleAppsからログイン可能なことがわかったので設定した。
弊大学はGoogle for Educationを利用しているので嬉しい機能。Crowi素晴らしい。

## Google APIsでの設定
1. まず[Google API Manager](https://console.developers.google.com/)にアクセスして左カラムから「認証情報」にいく
<img width="351" alt="1.png" src="https://qiita-image-store.s3.amazonaws.com/0/114861/0dc4341e-246a-d008-be38-ab98af7206d3.png">
  
1. プロジェクトを作成
<img width="503" alt="2.png" src="https://qiita-image-store.s3.amazonaws.com/0/114861/36c92610-e54c-8011-4bf1-497c7d457250.png">
  
1. 適当なプロジェクト名を設定する
<img width="582" alt="3.png" src="https://qiita-image-store.s3.amazonaws.com/0/114861/fd831959-7df4-6829-f725-48781a47ed80.png">

1. 認証情報を作成する
<img width="457" alt="4.png" src="https://qiita-image-store.s3.amazonaws.com/0/114861/660af0cb-3d5f-bf7c-17ed-5fb7d274f0e9.png">

1. 「OAuthクライアントID」を選択
<img width="806" alt="5.png" src="https://qiita-image-store.s3.amazonaws.com/0/114861/df18f033-b970-5742-8802-1d1e073fb7e5.png">

1. 同意画面を設定する
「アプリケーションの種類」はウェブアプリケーションを選択する
<img width="991" alt="6.png" src="https://qiita-image-store.s3.amazonaws.com/0/114861/e86a89b6-9bf8-8126-d2fa-9834b96a3097.png">

1. **同意画面の設定**
**このステップを踏まないとちゃんと遷移しないので注意！**
<img width="590" alt="7.png" src="https://qiita-image-store.s3.amazonaws.com/0/114861/7c98b767-61c8-e686-9df5-7d94899691a2.png">

1. リダイレクトのURLの設定
下記のように設定すればよい。
\# *反映されるまで少し(5分)くらいかかるのであせらないこと*

```
# 承認済みJavascriptの生成元
http://localhost:3000
# 承認済みのリダイレクトURI
http://localhost:3000/google/callback
```

<img width="648" alt="8.png" src="https://qiita-image-store.s3.amazonaws.com/0/114861/c1476708-1284-8a1f-556c-9e4f8f883529.png">

## Crowi側での設定
  
1. 「管理」
<img width="340" alt="kanri.png" src="https://qiita-image-store.s3.amazonaws.com/0/114861/be16dbd9-8c0f-34cb-bf9f-28043bab32f3.png">  

1. 「アプリ設定」
<img width="346" alt="9.png" src="https://qiita-image-store.s3.amazonaws.com/0/114861/6c5ec985-afc9-379b-0f47-cc02e8dec4d3.png">

1. 一番下のGoogle設定から先ほど設定したClientIDとClientSecretを入力
<img width="718" alt="10.png" src="https://qiita-image-store.s3.amazonaws.com/0/114861/53ad2d33-b916-486e-b12f-b65ecb80f56c.png">

## 完成
GoogleAppsを利用してログインできるゾ！

<img width="562" alt="11.png" src="https://qiita-image-store.s3.amazonaws.com/0/114861/78102271-2261-f95f-33f8-a0046c01d7fc.png">
Node.js と npm インストールとアップデート

Node.js をバージョン管理するには nodebrew や nvm などがありますが、
今回は n を使って環境を作りたいと思います。

# Node.js と npm インストール
### Mac の場合

```
$ brew install node
```

CentOS の場合

```
$ yum install gcc gcc-c++
$ yum install nodejs npm –enablerepo=epel
```

# n のインストール
```
$ npm install -g n
```

# n を使って node.js のアップデート
```
$ n --stable
$ n --latest
$ n latest
```

# npm のアップデート
```
$ npm update -g npm
$ npm update -g
$ npm outdated -g
```

こんな感じでJSが動く

```
$ node -v
v7.0.0

$ node
> console.log(“hello world”)
hello world
```

これでバリバリ開発していきましょう。
自分の技術ブログからの転載ですがQiita初投稿しました。
http://jaxx2104.info/node-js-install-update

今後はこちらに書いていくのでよろしくお願いします。
NSUserDefaultsを使ってユーザーの初回利用に応じて分岐してみる

あるページを初めて開いたユーザーにチュートリアルを出すための条件判定に `NSUserDefaults` を利用しました。何箇所かで `NSUserDefaults` の定型文を書くことになったので、 `NSUserDefaultsManager.swift` という構造体を作って同じ処理をまとめました。

環境Xcode7.3, Swift2.2



#NSUserDefaultsの処理をまとめた構造体を作る

```UserDefaultsManager.swift
import Foundation

struct UserDefaultsManager {
    
    private static let userDefaults = NSUserDefaults.standardUserDefaults()
    
    static var alreadyDisplayTutorial: Bool {
        set {
            userDefaults.setBool(newValue, forKey: "alreadyDisplayTutorial")
            userDefaults.synchronize()
        }
        
        get {
            return userDefaults.boolForKey("alreadyDisplayTutorial")
        }
    }

    // 他のキーも必要ならここに書く.
    
}
```

#この構造体の利用方法


```使うViewController.swift

func hogehoge() {
    switch UserDefaultsManager.alreadyDisplayTutorial {
    case true:
        // 一度チュートリアルを出しているので何もしなくてもよい.
    default:
        // NSUserDefaultsの書き換え.
        UserDefaultsManager.alreadyDisplayTutorial = true
    
        // チュートリアルを出す関数呼び出しをする.
        /////
    }
}
```

`UserDefaultsManager.alreadyDisplayTutorial = true` で `NSUserDefaults` の値を更新できます。値の取り出しは `UserDefaultsManager.alreadyDisplayTutorial` でできます。
Visual Studio Code を使用したCordovaアプリの実機デバッグでハマった点

# 事象
VSCを使用しスマホアプリのお勉強をしている最中にデバッグが動かず困りました。

# 原因
原因としては良かれと導入した[Crosswalkプラグイン](https://www.npmjs.com/package/cordova-plugin-crosswalk-webview)でした。
プラグインを削除しデバッグを開始したところ問題なく動作しました。

# 症状（詳細）
自動生成された「launch.json」は特にいじらず「Run Android on device」を実行した際、
以下のエラーメッセージが出力されデバッグに失敗します。

```bat:コンソール
Cannot connect to the target: read ECONNRESET
error: listener not found
error: listener not found
```

# 結論
実力不足により根本的な原因の解明、回避方法の発見には至っていません。
Chromeの開発者ツールやVS2015ではCrosswalkプラグインを使用しても問題なくデバッグできます。
ひとまずChromeの開発者ツールでデバッグを行います。

# 備考
根本原因を少し調査したところ、デバッグを行う際にadbのポートフォワードを行っているようですが、
Crosswalkを使用しているとフォワード先のポートが変わってしまうのかもしれません。。。
以下のようなコマンドが実行されているっぽいです。

```bat:コンソール
adb -s G5AXB728X801Z56 forward tcp:9222 localabstract:webview_devtools_remote_1972
```
C言語でECHONET Lite家電を操作

#はじめに
C言語でECHONET Liteによる家電操作のサンプルコードを載せます
※ECHONET Lite（ISO/IEC 14543-4-3）

やりたいことは
○　家電製品のON,OFF制御

C言語以外で実行したいときは以下を参照する（今回と同じことが書いてあります）
[Ruby版](http://qiita.com/miyazawa_shi/items/4c645315262d5cf5b015)
[Python版](http://qiita.com/miyazawa_shi/items/9384f0d2cd1ee255b1c1)



#環境
os : windows 7
コンパイラ : GNU Compiler Collection（gcc）
対象家電　：　空気清浄機（ECHONET Lite対応）
　　　  => 　[sharp KI-EX1100](http://www.sharp.co.jp/kuusei/products/kiex100.html)

#サンプル

##動作状態をONにする
```c:send.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

void main(void)
{
  int udp_socket;
  struct sockaddr_in addr;

  char msg[]={
    0x10,0x81,
    0x00,0x00,
    0x05,0xFF,0x01,
    0x01,0x35,0x01,
    0x61,0x01,
    0x80,0x01,
    0x30
  };

  udp_socket = socket(AF_INET, SOCK_DGRAM, 0);
  addr.sin_family = AF_INET;
  addr.sin_port = htons(3610);
  addr.sin_addr.s_addr = inet_addr("192.168.2.166");

  sendto(udp_socket,msg,sizeof(msg), 0,(struct sockaddr *)&addr, sizeof(addr));
  close(udp_socket);
}

```

①　上記サンプルでは対象の家電を「空気清浄機」にしている。
エアコンなどに変更したい場合は
11-19行の中を変更する。

(例えば) エアコンの動作状態をONにしたい場合は```
0x05,0xFF,0x01,
```　　　↓```
0x01,0x30,0x01,```　に変更する

詳しい方法は以下を参照する
[ECHONET Liteの電文　作成方法](http://qiita.com/miyazawa_shi/items/725bc5eb6590be72970d)



②　IPアドレスの指定
24行目の```
inet_addr("192.168.2.166")
```は、空気清浄機のIPアドレスが記載されている。
実行する時は各自の環境に合せて変更する必要がある。


上記の①,②を気をつければ実行が可能である。
Windowsの各種テキストエディタで使用するフォントメモ


基本的には `InconsolataGo` と `Mgen+ 1p` を使う。

# メモ帳

メモ帳は GDI で描画を行う。 GDI では字幅の指定で恣意的な調整が行われる。また、 GDI はヒンティングを強くかける傾向があるので、 `Consolas` を使用する。レジストリエディタで `FontLink\SystemLink` を編集し、 `Consolas` から `Meiryo` にフォールバックするように設定する。

- [FontLink SystemLink の設定値の数字について](http://monado.dtiblog.com/blog-entry-127.html)
- [フォントサイズに依存して等幅フォントの半角:全角＝1:2 が破れる問題のまとめ - キーボードをたたくとき](http://d.hatena.ne.jp/yascentur/20110621/1308650962)
- [全角固定ピッチフォントの仕様変更](https://support.microsoft.com/ja-jp/kb/417434)

# Eclipse

Eclipse は、フォントリンクについて、 `Microsoft Sans Serif` を参照する。

- [Eclipse: Consolas + メイリオ の ClearType 表示](http://monado.dtiblog.com/blog-entry-128.html)

# Electron

Atom や Visual Studio Code 等の Electron 系のエディタは多くの場合描画系に Direct2D/DirectWrite を使用するため、フォントサイズの設定によって字幅が崩れることは無い。

# Visual Studio

Visual Studio は古い物は GDI を、新しい物は Direct2D/DirectWrite を使用する。古い物では `Consolas` を使えばよいが、新しいものでは Direct2D/DirectWrite であるにも関わらず奇妙な字幅の崩れが発生する。新しい Visual Studio は WPF を使用しているため、 Composite Font の機能を用いてフォントの指定を行う。

- [move from/to ccr: VS2013 で Consolas + MS ゴシック (Meiryo でも可) を実現するもう一つの方法](http://moveccr.blogspot.jp/2015/04/vs2013-consolas-ms-meiryo.html)
ブックスタンド2つで作るノートPCスタンド

PCを使用する際、目線の高さは水平より10度程度下向きが理想です。
机にノートPCを普通に置いた状態は、首や肩に負担を掛けます。
眼精疲労防止対策として、身近なものを使いノートPCスタンドを組み立ててみましょう。

ブックスタンド 1つめをこのように置きます。
![IMG_6134.jpg](https://qiita-image-store.s3.amazonaws.com/0/131463/b382a51b-5af2-027a-58fa-f28ff77d7747.jpeg)

ブックスタンド 2つめはこの向きです。
![IMG_6135.jpg](https://qiita-image-store.s3.amazonaws.com/0/131463/5416159a-15d3-13a8-5b11-503286d51d91.jpeg)

重ねます。
![IMG_6136.jpg](https://qiita-image-store.s3.amazonaws.com/0/131463/dfe75382-cf87-1eb9-c608-82fbdbdef9e3.jpeg)

ノートPCを載せます。
![IMG_6140.jpg](https://qiita-image-store.s3.amazonaws.com/0/131463/6c8a2637-4324-d5d7-6c9c-dc338b92995e.jpeg)

ノートPC： ThinkPad X1 Carbon 2016 Gen4
キーボード： Apple Wireless Keyboard ( Bluetooth )

以上
【CSSで画像をグレースケール化させる方法】

```:.CSS
img{
-webkit-filter: grayscale(100%);
filter: url("data:image/svg+xml;utf8,<svg xmlns=\'http://www.w3.org/2000/svg\'><filter id=\'grayscale\'><feColorMatrix type=\'matrix\' values=\'0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0\'/></filter></svg>#grayscale");
filter: gray;
}
img:hover {
-webkit-filter: grayscale(0%);
filter: none;
}
```
* * *

JavaScriptで対応する場合　→　参考：[GRAYSCALE.JS](http://james.padolsey.com/demos/grayscale/)
【CSSで上下左右中央寄せにする方法】

【パターン①】
親要素にはposition: absolute;かposition: relative; を設定してください。
body に対してセンター寄せしたい場合はそのままでOKです。
上下左右中央寄せしたい要素に以下のCSSを設定します。


```css:css

position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
margin: auto;
width: 任意の値
height: 任意の値
```

補足：ラッパーの幅と高さがセンター寄せする要素より小さい場合

```css:css
position: absolute;
top: -100%;
left: -100%;
right: -100%;
bottom: -100%;
margin: auto;
width: 任意の値
height: 任意の値
```

【パターン②】

```css:css

html, body, main {
    height: 100%;           
}
main {
    display: flex;         
    justify-content: center;
    align-items: center;    
}
```

【パターン③】

```css:CSS
.hoge {
    height: calc(100px - 2%);
}
```
その他の方法 → [CSSで中央寄せの方法いろいろメモ](http://qiita.com/KAMEch/items/b52c5e23212b8fef81a7)
kintone 生年月日の項目カスタマイズ

#kintone 日付 bootstrap datepicker によるカスタマイズ

日付項目で生年月日を作成した場合、kintone 標準の datepicker だと生まれた年まで辿るのは無理です。
たぶん、直接キーボードで数字入力されている方が多いと思います。

簡単に生年月日を入力できるように bootstrap datepicker を使って、カスタマイズしてみました。
datepicker は、スタンドアローン版を使います。
10年単位に移動できるので楽です。

![bdate01.png](https://qiita-image-store.s3.amazonaws.com/0/100572/f479ff76-82b8-6154-243e-f0fd506e72bb.png)

#生年月日入力後の年齢表示

生年月日があると年齢も欲しくなります。
ラベル欄に年齢を表示しました。

![bdate02.png](https://qiita-image-store.s3.amazonaws.com/0/100572/7e88b8ed-ae3d-fe31-3f1d-9e6c77152e27.png)


#一覧画面の生年月日

一覧画面の生年月日編集もカスタマイズしています。

![bdate04.png](https://qiita-image-store.s3.amazonaws.com/0/100572/dbeb11da-155e-7771-9eee-43f70412d403.png)



一覧画面では、生年月日の隣に年齢表示します。

![bdate03.png](https://qiita-image-store.s3.amazonaws.com/0/100572/3e58aee2-91d5-7375-d37f-9cce5cd838a8.png)
Windows10で、Bluetooth キーボードを使用する

使用した機種
ThinkPad X1 Carbon
Apple Wireless Keyboard

IMEでキーバインドをあらかじめ変更しておきます。
以下の2種類を「半角/全角」にします。
[Shift]+[Space]
[Ctrl]+[Space]

Windows10での設定変更
[コントロールパネル]-[デバイスとプリンター]
[デバイスの追加]タブにて、
Apple Wireless Keyboard を認識させます。

以上
Google Apps Scriptを使ってLINE Messaging APIでオウム返しをする

Line BotをGoogle App Scriptで無料で手軽に試してみる。
http://qiita.com/osamu1203/items/0de2909821a1b3cbb350

こちらの記事を参考にLine Botを運用していたのですが、BOT API Trial Account廃止の通達がありました。
そこで、LINE Messaging APIの動作確認も兼ねて、オウム返しをするBotを作成しました。

#LINE準備
https://business.line.me/ja/services/bot
Messaging APIを始める
で適当に入力してアカウントを作る。

さらにオウム返しをするため
LINE@ MANAGER にてアカウント選択 > アカウント設定 > Bot設定
Webhook送信：利用する
自動応答メッセージ：利用しない

#アプリケーション準備
Googleドライブ > 新規作成 > Google Apps Script

```js:bot.gs
// LINE Developers > Basic Information > Channel Access Token から取得
var channel_access_token = "<Channel Access Token>"; 

function doPost(e) {
  var events = JSON.parse(e.postData.contents).events;
  events.forEach(function(event) {
    if(event.type == "message"){lineReply(event);}
    else if(event.type == "follow"){ /* 友だち追加・ブロック解除 */ }
    else if(event.type == "unfollow"){ /* ブロック */ }
 });
}

function lineReply(e) {
  var postData = {
    "replyToken" : e.replyToken,
    "messages" : [
      {
        "type" : "text",
        "text" : ((e.message.type=="text")? e.message.text : "Text以外")
      }
    ]
  };
  
  var options = {
    "method" : "post",
    "headers" : {
      "Content-Type" : "application/json",
      "Authorization" : "Bearer " + channel_access_token
    },
    "payload" : JSON.stringify(postData)
  };
  
  UrlFetchApp.fetch("https://api.line.me/v2/bot/message/reply", options);
}
```

ファイル > 保存
公開 > ウェブ アプリケーションの導入
プロジェクト バージョン：新規作成
アプリケーションにアクセスできるユーザー：全員（匿名ユーザーを含む）
導入ボタンを押すと「現在のウェブ アプリケーションのURL」が分かる。
このURLを
LINE developers > Basic information > Webhook URL
に設定する。

#botを友だち追加
LINE developers > Basic information > QR Code
のQRコードをスマホで読み取り、友だちに追加。
botに話しかけるとオウム返しをします。
QRコードに書かれたURLを他に教えれば、誰でもbotを友だちに登録できると思います。

#その他・悩んだところ
- 上記コード上では友だち追加時に何もしない処理になってますが、このタイミングでuserIdをスプレッドシートにでも記録しておけばプッシュ通知も簡単にできる（と思います）。

- 今のところServer IP Whitelistは指定しなくても動きます。

- webhookのリクエストヘッダにX-Line-Signatureがあるそうなのですが、Google Apps ScriptのdoPostでは取得できないんでしょうか？

- botに関わるLINEの設定がLINE@ MANAGER、LINE developersの2箇所に分かれているのがややこしい。
AndroidのSharedPreferences等が書き込まれるpackageごとのディレクトリをまるごと取得するコマンドを作りました

## そもそも
AndroidのSharedPreferences等が書き込まれるpackageごとのディレクトリをまるごと入手するコマンドはあるのだろうか。私が知っているのは一つづつcatで書き出すコマンドのみだ。

## せっかくなのでGoでかいてみた
もしかしたら、もうそのようなコマンドが実装されていて、便利に取得できるのかもしれない。
その場合はこのコマンドを作成する意味がなくなってしまう。
それは避けたいので、無駄にならないよう新規取得言語で書いてみることにした。
今回はGo言語を用いる。

## つくったもの
[gad](https://github.com/narumi18wa/GoGetApkData/releases)というコマンドを制作した。
ダウンロードして実行権限を付加してから実行して欲しい。
実行すると、実行したディレクトリ以下にパッケージ名のディレクトリを生成し、そこにpackageごとにディレクトリをまるごと取得する。

### コマンド実行例

```bash
$ gad
```

これは後からパッケージ名を聞かれる実行。前回起動時などに作成されたディレクトリに上書きする。
削除はされないので必ずしもAndroid内部と同じファイル構成にはならない。

```bash
$ gad {パッケージ名}
```

これはパッケージ名を指定して実行する。前回起動時などに作成されたディレクトリに上書きする。
削除はされないので必ずしもAndroid内部と同じファイル構成にはならない。

```bash
$ gad {パッケージ名} clean
```

これはパッケージ名を指定して実行する。前回起動時などに作成されたディレクトリを削除してから取得する。
誤って入力したディレクトリ名が消える場合があるので注意。
ThinkPad で、トラックパッドの無効化

使用機種は、ThinkPad X1 Carbon 2016 Gen4 です。

親指の付け根が触っていて、
マウスポインタが意図しない動きをするため、
トラックパッドを無効化することにしました。

コントロールパネル >
マウス >
ThinkPad タブ >

変更前
☑ タッチパッドを使用する

変更後
□ タッチパッドを使用する

以上
Google Chromeの設定で指定できない一部のフォントを使用する

M+ や Noto 等のウェイトが多数あるフォントは Google Chrome では設定から上手く指定する事が出来ない事が多い。これは恐らくはフォント名の中にウェイトに関する名前が含まれているためと思われる。そこで、設定ファイルを直接編集する。

`%USERPROFILE%\AppData\Local\Google\Chrome\User Data\Default\Preferences` を編集する。 Chrome のユーザーが複数存在する場合は各々 `Default` を `Profile 1` `Profile 2` ... に変更する。

1. 上手く指定できないフォントを Google Chrome のフォント設定で指定する
2. Google Chrome を終了する
3. Visual Studio Code 等のテキストエディタで前述のファイルを開く
4. フォント名で検索し、 Regular 等のウェイトに関する記述部分を削除する

以上で指定出来る筈。ただしフォント名、ファミリ名、サブファミリ名によってはこれでも上手く指定出来ないフォントも存在するかもしれない。
Githubにpushするときに403エラーが出た時の対処法



最初にpushしようとしたときに以下のようなエラーが出てうまくpushできない。

```
error: The requested URL returned error: 403 Forbidden while accessing https://github.com/username/hogehoge.git/info/refs

fatal: HTTP request failed
```

.git/config
を書き換える

```
url = ssh://git@github.com/username/hoge.git
```

鍵の設定がうまくいってる場合はこれでOK

うまくいかない場合はユーザー名を入れる

```
url = https://ここに入れる@github.com/username/hoge.git
```
毎回パスワードを入れて対応


```
error: src refspec master does not match any.
```


が出たら
もう一度pullしてコミットしなおせばOK
androidブラウザでエラーが出ないLet's encrypt

さくらのレンタルサーバー「スタンダードプラン」を利用している者です。かなり素人レベルです。

独自ドメインでSSLを利用しようと考え、年1,000円くらいから証明書を購入できることがわかったのですが、無料の「Let's encrypt」でも暗号強度は変わらないという当たり前のことに気付き、Let's encryptを導入しました。

[Let's encrypt](https://letsencrypt.org/)

最初は、証明書やら何やらよくわからなかったので、ネットオウルさんのSSLBOXを使ってみました。

[SSLBOX]
(http://www.sslbox.jp/)

とてもわかりやすいインターフェイスで、会員登録は必要ですが無料。無事、自分のサイトがSSL化して、緑の鍵マークがかかりました。なんだかステキだ！

と思っていたら、知人がアクセスしようとしたら「このサイトのセキュリティ証明書には問題があります」「この接続ではプライバシーが保護されません」という警告が表示されました。macOS、Windows、iOSでは特に問題がなかったのですが、androidのブラウザは全滅状態でした。

サイトへのアクセスはできるのですが、SSLがかかっていない状態での接続になってしまうのです。それ以前に「攻撃者が、aaa.bbb.ccc上のあなたの情報（パスワード、メッセージ、クレジット カード情報など）を不正に取得しようとしている可能性があります」などと出て、安心してアクセスできる人なんていないでしょう。

そこで、改めてSSLBOXではなく、Macのほうで証明書の発行をやってみました。こちらの個人サイトを参考にさせていただきました。

[さくらレンタルサーバーのサイトを、Let's EncryptでHTTPS化する方法（Mac El Capitan版）]
(http://www.umurausu.info/blog/archives/lets_encrypthttpsmac_el_capitan.html)

ところが、さくらのサーバーに証明書を設置しても、結局前と様子は変わらず。androidではあの警告が出ます。困っていたところ、個人サイトにこんな記述が。

> nginxの.confの設定を変えた。
> cert.pemを指定していたところをfullchain.pemへ変更。

[[Let’s Encrypt] AndroidのGoogle Chromeでエラーになる場合の対処法]
(https://b.0218.jp/20160919114012.html)

まさかと思って、証明書のインストールでcert.pemでやっていたものをfullchain.pemに交換してみたところ、androidブラウザでの問題があっけなく消えました。

「.pem」の種類は次の通りだそうです。なるほど。

> 証明書
> /etc/letsencrypt/live/＜ドメイン名＞/cert.pem
> 
> 証明書＋中間CA証明書
> /etc/letsencrypt/live/＜ドメイン名＞/fullchain.pem
> 
> 秘密鍵
> /etc/letsencrypt/live/＜ドメイン名＞/privkey.pem
> 
> 中間CA証明書
> /etc/letsencrypt/live/＜ドメイン名＞/chain.pem

[Let's Encrypt サーバー証明書の取得と自動更新設定メモ]
(https://blog.apar.jp/linux/3619/)

実際、このような使い方がいいのかよくわからないのですが、今のところ問題は起きていません。
Windows10 の自動更新無効化

<h3>Windows10 の自動更新無効化</h3>  

Pro版のみ有効。
Home版には、自動更新を無効化する機能はない模様。

ローカルグループポリシーを起動
[Win]+[R] でgpedit.msc

コンピューターの構成 >
管理用テンプレート >
Windowsコンポーネント> 
Windows Update>
自動更新を構成する

変更前
◎未構成
〇有効
〇無効  

変更後
〇未構成
〇有効
◎無効
[OK]

コマンドプロンプトから
> gpupdate /force

以上
オフラインリアルタイムどう書くE09 の問題


オフラインでリアルタイムに「どう書く」をやるイベント( https://yhpg.doorkeeper.jp/events/52773 )を行っています。

問題は「五角形の世界であなたは過去の自分に出会う」という名前で、詳細は
http://nabetani.sakura.ne.jp/hena/orde09_penwa/
です。

出題者の気分としては、問題を読み始めてから解けるまで1時間あればなんとかなると思ってますが、ひとそれぞれで。

実装ができた方はこちらのコメント欄からリンクを張っていただくと見つけやすくて助かります。

似たような問題をもっと解きたいという方は、
https://nabetani.hatenadiary.com/entry/yhpg_list
に過去問リンク集がありますので、そちらをご覧になると良いと思います。
Labelのtext_size属性

自分がKivyを始めた頃このtext_sizeに躓いたので、記事にしました。

# そもそもtext_sizeとは？

Labelにはfont_size属性というのもあります。英語の意味的にこれとほとんど一緒じゃない？と思ってしまう属性名です。font_sizeは文字の大きさですが、text_sizeは...内部で作られるtextureのサイズを固定する為に使うものです。

### 内部で作られるtextureとは？

これはLabelに表示する文字列が描画されたものです

### 固定するとどうなるか

サイズの固定は"幅と高さ"それぞれ個別に設定できます。仮に幅を固定したとして文字列がその幅に収まらない時は自動で折り返されます。高さを固定した上で文字列が収まらない時は、その収まらない部分は無くなります。

### 固定しないとどうなるか

しないとLabelは文字列の描画に必要なだけ大きなtextureを作ります。この時自身の大きさを超えていても関係ありません。好きなだけ大きなtextureを作り、そして自身の領域を超えて他のWidgetの領域にまで描画します。余談ですがこのWidgetの描画が自身の領域に制限されていないのはKivyの特徴の一つですね。

### 将来 属性名が変わるかもしれない

[Kivy 2.0 api breaks](https://github.com/kivy/kivy/wiki/Kivy-2.0-api-breaks)のページには以下の記述があります。

> text_size might be more clearly named text_bounding_box or similar. Users often confuse it with font_size.

海外の人にとってもtext_sizeは分かりにくい名前のようです。

### 何に使うのか？

一つ思いつくのは長文を表示する時です。
幅だけを固定して文章を折り返させ、縦にはみ出た分はユーザーにスクロールさせて読ませます。

# 実際にやってみる

```python3
from kivy.lang import Builder
from kivy.base import runTouchApp

root = Builder.load_string(r'''
ScrollView:
    do_scroll_x: False
    do_scroll_y: True
    bar_width: 4
    Label:
        text: r'Sample Text ' * 100
        font_size: 30
        size_hint_x: 1.0
        size_hint_y: None
        text_size: self.width, None  # 内部のtextureの幅を自身の幅に合わせる。高さは固定しない(None)。
        height: self.texture_size[1]  # 自身の高さを内部のtextureの高さに合わせる
''')
runTouchApp(root)
```

### 結果
![Screenshot at 2016-10-30 16:07:48.png](https://qiita-image-store.s3.amazonaws.com/0/144673/2d7949e7-8bd0-0372-9538-506053fbc1e0.png)
[動画](https://www.youtube.com/watch?v=dyV3mxDfeg8)
Bluemix の Object Storage サービスに Java からアクセスしてみた

#Object Storage とは
[Bluemixのドキュメント](https://console.ng.bluemix.net/docs/services/ObjectStorage/objectstorage_overview.html)を意訳すると「ストレージ・サービスの１種で、ストレージに保持されたオブジェクトを特定するためにメタデータを利用でき、検索しやすく大量のデータであっても早い。」

SoftLayer 上の [Swift](https://wiki.openstack.org/wiki/Swift) と言うオブジェクトストレージ機能に Bluemix を介してアクセスできる。

オブジェクトの例：

```sample.json

{
	"objects": [{
		"hash": "aca9042b00021ad60807d4e8e418b207",
		"last_modified": "2016-10-28T09:31:37.401250",
		"bytes": 8512,
		"name": "cflogs.txt",
		"content_type": "text/plain"
	}],
	"objectCount": 1,
	"bytesUsed": 8512
}
```

#構成
![OS_howitworks.png](https://qiita-image-store.s3.amazonaws.com/0/103053/d88994fd-8843-8c31-4aab-29a85fd97fb9.png)

#環境
Bluemix(Liberty for Java)
[openstack4J 3.0.2](http://www.openstack4j.com/) (Mavenリポジトリーは[こちら](https://mvnrepository.com/artifact/org.pacesys.openstack4j.connectors/openstack4j-httpclient))


#コーディング
OpenStack4Jのドキュメントである以下２つを参照。
- [Authenticate](http://www.openstack4j.com/learn/getting-started)
- [Object Storage (Swift)](http://www.openstack4j.com/learn/objectstorage)


以下でつまづくも、残りは難なく。

- クラスローダー
- Jacksonのバージョン

#つまづいたところ詳細

- クラスローダー

Liberty の利用する Jackson ライブラリーのバージョンと
OpenStack4J の利用する Jackson ライブラリーのバージョンが合わず、
authenticate しようとすると NullPointerException

[トラブルシューティング](https://console.ng.bluemix.net/docs/services/ObjectStorage/ts_index.html)にも書いてあったため、
**クラスローダーポリシーを parentLastに変更**

```server.xml
    <webApplication id="object-storage-sample" location="object-storage-sample.war" name="object-storage-sample">
    	<classloader delegation="parentLast"/>
    </webApplication>
```

ヌルポは解消。
今度は以下のエラー：
java.lang.NoSuchMethodError: com.fasterxml.jackson.databind.ObjectReader.forType


- Jacksonのバージョン

openstack4j の利用している jackson のバージョンが 2.7.3 だが、[不整合があるらしい](http://stackoverflow.com/questions/27746750/exception-in-thread-main-java-lang-nosuchmethoderror-com-fasterxml-jackson-co) 

**2.6.3 のライブラリーを追加してみる**

```pom.xml
		<dependency>
			<groupId>org.pacesys</groupId>
			<artifactId>openstack4j</artifactId>
			<version>3.0.2</version>
		</dependency>
		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-databind</artifactId>
			<version>2.6.3</version>
		</dependency>
		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-annotations</artifactId>
			<version>2.6.3</version>
		</dependency>
		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-core</artifactId>
			<version>2.6.3</version>
		</dependency>
```

これで一旦動くようになった。詳細はもっと調べたいが、一旦ここで切り上げ。

#備考
Region や domain, project といった OpenStack の概念(詳しくは[用語集](http://docs.openstack.org/ja/security-guide/common/glossary.html)参照)は、当サービスを作成したタイミングで自動的に作成され、プログラムから追加・変更することはできなかった。role も同じ。Bluemixを介したときの制約か。
Dockerを使ってwebサーバーたててみたときのメモ

テキトーです

#やること
Webサーバーを立ててみる

#ホスト側環境
Dockerはインストール済みということで。
foderaでやってます

```
cat /etc/redhat-release
```
->Fedora release 24 (Twenty Four)

#Webサーバーたててみる
centosにapacheをインストール
Dockerファイル作成、中身はこんな感じ
(@Ikumi 様ありがとうございました！)

```
FROM centos:7
RUN yum -y update && \
    yum -y install httpd
EXPOSE 80
CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]
```
※centos6の場合は「FROM centos:7」を「FROM centos:6」に変更
イメージ作成

```
docker build -t イメージ名 ./
```
コンテナ起動

```
docker run -d -p 80:80 --name コンテナ名 イメージ名
```

コンテナのアドレス確認

```
docker inspect --format="{{ .NetworkSettings.IPAddress }}" コンテナID
```

ブラウザで上記アドレスにリクエスト
終わり！

次回は、アプリケーションサーバーとDBサーバーに挑戦!
kintone 日付 datepicker 文字サイズ調整

#kintone 日付項目の編集時に、表示される文字が小さい

新デザインで特に文字の小ささが目立っています。
老眼の私には、かなり厳しいので、とりあえずCSS で調整してみます。

![Dtaepicker文字サイズ1.png](https://qiita-image-store.s3.amazonaws.com/0/100572/ebf1c235-5647-0a6f-a37f-0487c52a72d1.png)


#日付文字サイズ調整の CSS

- 新デザイン用 の CSS です。
- アプリの「PC用のCSSファイル」に設定します。
- kintone 全体に適用する場合は、「kintone全体のカスタマイズ」の「PC用のCSSファイル」に設定します。

※旧デザインで表示すると表示が崩れます。

```
/* rex0220 日付文字サイズ調整 */
.goog-date-picker {
	padding: 26px 26px 20px;
}
.goog-date-picker, .goog-date-picker tbody {
    font-size: 15px;
}
.goog-date-picker-date, .goog-date-picker-wday {
    padding: 4px 0;
}
```
ラジオボタンを選択したらフォームを表示したり消したり

#HTMLでのラジオボタン

input要素に type="radio" を指定すると、ラジオボタンを作成することができる。

type = "radio" : ラジオボタンを作成
name = "" : 部品の名前を指定
value = "" : 送信される文字列を指定

checked	: 選択された状態を指定、値は不要
disabled : 部品を無効化する（主に、JavaScript等と組み合わせて使用する）


#JSでの画像などの表示・非表示の切り替え

・displayを使う場合

```
<div id="message">こんにちは</div>

<form>
<input type="button" value="表示" onclick="hyoji()">
<input type="button" value="非表示" onclick="hihyoji()">
</form>

<script>
function hyoji() {
    document.getElementById("message").style.display="block";
}

function hihyoji() {
    document.getElementById("message").style.display="none";
}
</script>
```
この場合、`<div id="main">こんにちは</div>`の空間が無くなって、
下の部分が繰り上がる。


・visibilityを使う場合

```
<div id="message">こんにちは</div>

<form>
<input type="button" value="表示" onclick="hyoji()">
<input type="button" value="非表示" onclick="hihyoji()">
</form>

<script>
function hyoji() {
    document.getElementById("message").style.visibility="visible";
}

function hihyoji() {
    document.getElementById("message").style.visibility="hidden";
}
</script>
```

displayと違うのは、非表示にした時。 
この場合、`<div id="main">こんにちは</div>`の空間がそのまま残り、
下の行が繰り上がることはない。


#ラジオボタン + 表示・非表示

・displayを使う場合

```
<p>選択してください<br>
<input type="radio" name="searchtype" value="1" onclick="hyoji()">表示
<input type="radio" name="searchtype" value="2" onclick="hihyoji()">非表示</p>

<div id="main">こんにちは</div>

<script>
function hyoji() {
    document.getElementById("main").style.display="block";
}

function hihyoji() {
    document.getElementById("main").style.display="none";
}
</script>
```

・visibilityを使う場合

```
<p>選択してください<br>
<input type="radio" name="searchtype" value="1" onclick="hyoji()">表示
<input type="radio" name="searchtype" value="2" onclick="hihyoji()">非表示</p>

<div id="main">こんにちは</div>

<script>
function hyoji() {
    document.getElementById("main").style.visibility="visible";
}

function hihyoji() {
    document.getElementById("main").style.visibility="hidden";
}
</script>
```
Unityでカメラ入力が表示されないとき

#何故だ…
カメラの映像が真っ黒で何も表示されない。

#解決方法
- 存在するカメラ、**0から全部**試しましょう。

##要するに
カメラのIDは0～あって、0番目は真っ黒な画しか出さない他のカメラだった。

LeapMotionのせいで0番目が真っ黒で小一時間悩んでしまった。
1番目にしたら無事表示された。なんだそんなことか。

##PCでのテストとGearVRでのテストの差
スマホに出力するときはカメラ番号を変更しなければいけない。
"Leap"で除外するようにするか。

した。

##カメラ入力表示スクリプト

```csharp:WebCameraController.cs
using UnityEngine;
using System.Collections;
using UnityEngine.UI;

public class WebCameraController1    : MonoBehaviour {

    public int CamDeviceId = 0;
    public int Width = 1920;
    public int Height = 1080;
    public int FPS = 30;
    public float Alpha = 0.3f;


    void Start()
    {
        RawImage rawimage = this.GetComponents<RawImage>()[0];
        
        // get webCams
        WebCamDevice[] devices = WebCamTexture.devices;
        // display all cameras
        for (var i = 0; i < devices.Length; i++)
        {
            Debug.Log("["+ i +"]"+ devices[i].name); 
        }

        // LeapMotion skip
        if (devices[CamDeviceId].name == "Leap Dev Kit") CamDeviceId++;

        // set WebCamTexture
        if (devices.Length > 0 && CamDeviceId < devices.Length)
        {
            
            WebCamTexture webcamTexture = new WebCamTexture(devices[CamDeviceId].name, Width, Height, FPS);
            rawimage.texture = webcamTexture;
            rawimage.material.mainTexture = webcamTexture;
            rawimage.color = new Color(rawimage.color.r,
                rawimage.color.g,
                rawimage.color.b,
                Alpha);
            webcamTexture.Play();


        } else
        {
            Debug.Log("カメラが見つかりません。 "+ CamDeviceId+ "/ 0-" +(devices.Length-1));
            return;
        }
        
    }

    // Update is called once per frame
    void Update () {
	
	}
}

```

- `GameObject > UI > RawImage`にこのスクリプトをアタッチ。
- `CamDeviceId`にカメラ番号をセット。ただし、LeapMotionのが見つかると飛ばされます。
- Alphaは透明度0～1。0で完全透明。

これでPC・スマホを同じコードでカメラ表示できるようになった。
スマホ等で実行すると解像度に近いモノが選ばれるらしい？


##参考資料
[Unity画面にウェブカメラの画像を半透明で重ねて表示 | Psychic VRラボの殴り書き](http://psychic-vr-lab.com/blog/unity/unity%E7%94%BB%E9%9D%A2%E3%81%AB%E3%82%A6%E3%82%A7%E3%83%96%E3%82%AB%E3%83%A1%E3%83%A9%E3%81%AE%E7%94%BB%E5%83%8F%E3%82%92%E5%8D%8A%E9%80%8F%E6%98%8E%E3%81%A7%E9%87%8D%E3%81%AD%E3%81%A6%E8%A1%A8/)
大変参考にさせて頂きました。ありがとうございます。
Boolean型の変数名・メソッド名に主語を含めたい時はどうしたらいいか

# 前提
Javaを中心に考えています。
他の言語でも大体成り立つ話になるとは思いますが、Rubyとかは怪しいです。

# 基本のおさらい
Boolean型の変数名・メソッド名には、以下のような名前がいいと一般的に言われています。
・isEmpty
・canRead
・hasChanged
・exists

これらの名前はif文の中で特に効果を発揮します。
例えば、

```java
if (list.isEmpty()) {
    doSomething();
}
```

と書けば、以下のような英文に非常に近く、とても読みやすいわけです。
"If the list is empty, do something."

変数名の場合でも同様です。

```java
if (isEmpty) {
    doSomething();
}
```

この場合、主語が略されていると考えれば自然に読めます。
"If (it) is empty, do something."

# 問題定義
では、この主語を略したくない場合はどう命名したら良いでしょうか。
今回は例として、「ユーザーが存在するかどうか」を表すローカル変数について考えます。
先程と同じ理屈で言えば、
"If the user exists, do something."

```java
if (userExists) {
    doSomething();
}
```

となりそうですが、実際のところどうなのかを調べていきます。

また、あるオブジェクトに関するメソッドについても、主語が別に必要な場合があります。
例えば、「JTableオブジェクトについて、セルが選択されているか。」「行が選択されているか。」「列が選択されているか。」を表すメソッド名はそれぞれどうあるべきでしょうか。
これらの主語はJTableオブジェクトではなく、セル／行／列です。
"If a cell is selected (at the table), do something."

```java
if (table.cellIsSelected()) {
    doSomething();
}
```

となりそうですが、これも実際どうなのかを調べていきます。

# 調べた結果
「ユーザーが存在するかどうか」については、以下の２通りの命名が見つかりました。

・existsUser
・userExists

前者は予想していたのと語順が逆になっています。
これは例えば[codic](https://codic.jp/)で採用されている方式でした。
「ユーザーは存在するか」と打ち込むと、「exists_user」と出てきます。

後者は予想通りですね。
例としては、Stack Overflowの[Boolean method naming readability](http://stackoverflow.com/questions/1566745/boolean-method-naming-readability)というトピックで最も推されていました。

ちなみにGitHubのコード検索では「existsUser」より「userExists」の方が圧倒的に多くヒットします。
他にも色々見た結果、なんとなくですが主流は「userExists」の方と言えそうです。

それと「セル／行／列が選択されているか。」については、実際にJava（Swing）のJTableに存在するメソッドなのでそちらを確認しました。
それぞれ以下のように命名されています。

・isCellSelected(), isRowSelected(), isColumnSelected()

これも予想と語順が逆ですね。

# existsUser派についての解釈
おそらく「Boolean型の変数名・メソッド名は動詞（or 助動詞）で始める」というルールを重要視しています。
このルールを守るために、英文っぽく読むことは諦めて語順をひっくり返す必要があったのでしょう。
その結果が「existsUser」であり、「isCellSelected()」というわけです。

ルールを統一することによる可読性の向上か、英文らしく読めることによる可読性の向上か、どちらを取るかの問題と言えるのではないでしょうか。

# userExists派についての解釈
上で挙げたStack Overflowのトピックでは、やはり「英文として自然に読める」ことが命名の理由になっていました。
英語ネイティブの人たちはそっちの方を重要視している印象です。

ここで疑問なのは、同じくネイティブの人たちが作ったであろうJavaのAPIにおいて、なぜ「cellIsSelected()」ではなく「isCellSelected()」が採用されているのかです。

これは仮説ですが、cellは主語ではなく複合動詞の一部として認識されているのかもしれません。

```java
if (table.isCellSelected()) {
    doSomething();
}
```

"If the table is cell-selected, do something."
という感覚です。

他にも以下の場合なら

```java
if (imageReader.isRandomAccessEasy()) {
    doSomething();
}
```

"If the image reader is random-access-easy, do something."
となります。
日本語で言えば、「もしもイメージリーダーが"ランダムアクセス容易"であるなら、…」と言ったところでしょうか。

不自然なのは重々承知ですが、あくまでプログラミング言語を英語"風"に綴りながら、オブジェクトを主語とする形は崩したくない、という感覚でこういう命名をしているのではないかと私は考えました。

# まとめ
どう解釈するかはともかく、

・userExists
・isCellSelected()

の方式がそれぞれよく使われているようなので、そのような命名がオススメです。
GearVRアプリの実行エラー→デバイスID間違い

#エラー内容
GearVRアプリをビルドしてAndroid端末に転送して実行したら、
こんなエラーが出ました。

```
Thread priority security exception.
Make sure the APK is signed.
```

#ぐぐる
UnityによるGearVRアプリの起動確認 - ロードバイク時々ものづくり
http://cycling.hateblo.jp/entry/2016/01/19/011953

```
デバイスIDが間違っている
```

な、なんだってー！！なんか違うのいれたぽい。

UE4＋Gear VR開発メモ - フレームシンセシス
https://framesynthesis.jp/tech/unrealengine/gearvr/
デバイスIDの正しい調べ方、設定方法をおさらい。

#解決方法
##デバイスIDを調べる
1. `Win+R`でファイル名を指定して実行。
2. `cmd`と打ってコマンドライン起動。
3. SDKのフォルダに移動：`Android\sdk\platform-tools>` 状態にする。
4. `adb devices` を実行。

```
C:\kaihatu\Android\sdk\platform-tools>adb devices
List of devices attached
3q3nm2tns1        device
```

みたいな表示が出る（桁数は適当）。このデバイスID(例：3q3nm2tns1)を、Oculusの署名生成機に渡す。

##署名ファイルの用意
Oculus Signature File (osig) Generator - Oculus
https://dashboard.oculus.com/tools/osig-generator/

5. device ID入力欄に上記デバイスID(例：3q3nm2tns1)をコピペしてDownload Fileをクリック。
6. `oculussig_[device ID]`といったファイルがダウンロードされる。
7. このファイルをUnityプロジェクトの`Assets\Plugins\Android\assets`フォルダに入れる。入れるフォルダが無いなら作る。
8. ビルド。細かな設定は[VR開発メモ](https://framesynthesis.jp/tech/unrealengine/gearvr/)を参照。
9. 指示画面が出たらGearVRに装着。

##成功
Unityロゴが出てきたら動作成功。やったね！
UnityでAndroidアプリビルドエラー→JDKのバージョンとパス設定

#エラー内容
UnityでAndroidアプリをビルドしようとしたら、こんなエラーが出た。

```
Failed to compile resources with the following parameters:
-bootclasspath "D:/SDK/Android/sdk\platforms\android-24\android.jar" -d "D:\Doc\Unity\Practice\UnitychanAR\Temp\StagingArea\bin\classes" -source 1.6 -target 1.6 -encoding UTF-8 "com\oculus\Integration\R.java" "jp\nikuq\unitychanARE\R.java"
�x��: D:\SDK\Android\sdk\platforms\android-24\android.jar(java/lang/Object.class): ���W���[�E�o�[�W����52�́A���̃R���p�C���ŃT�|�[�g�����Ă����ŐV�̃��W���[�E�o�[�W����51�����V�����ł��B
  �R���p�C���̃A�b�v�O���[�h�����E�߂��܂��B
�x��: D:\SDK\Android\sdk\platforms\android-24\android.jar(java/lang/AutoCloseable.class): ���W���[�E�o�[�W����52�́A���̃R���p�C���ŃT�|�[�g�����Ă����ŐV�̃��W���[�E�o�[�W����51�����V�����ł��B
  �R���p�C���̃A�b�v�O���[�h�����E�߂��܂��B
�x��2��

UnityEditor.HostView:OnGUI()
```

文字化けしてるけどSDKに問題があるような雰囲気。

#調査
ぐぐった。
ANDROID開発: Unityエラー Failed to compile resources with the following parameters:
http://anndoroido.blogspot.jp/2016/07/unity-failed-to-compile-resources-with.html

```原因
android N SDKに開発環境が対応していない。
解決方法
SDKマネージャーからandroid N SDKをする。
```

エラーの文字化けしてる日本語の意味は分かったけど、その先の意味がわからん。

【Unity】AdMob入れようとしたらエラー、メジャー・バージョン52は、このコンパイラでサポートされている最新のメジャー・バージョン51より新しいです。 - naichi's lab
http://blog.naichilab.com/entry/jdk-52
何が起きてどう解決したか分かりやすい。

#解決方法
- [Java SE Development Kit 8 - Downloads](http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html)からJava 1.8（
Windows x64	194.64 MB  	jdk-8u111-windows-x64.exe）
入れる。
- Unity -> Preference -> External Tools -> Android JDKのパスを上記のインストール先に変更する。
ディスクドライブの情報の列挙

## 目的
Windowsが認識しているドライブを全て列挙する

## ソースコード
以下に今回のソースコードを示す

```c:main.c
#include <Windows.h>
#include <stdio.h>

void print_drive_info(const char* drive, const char* disk_type) {
	char volume_name[256], volume_system[256];
	DWORD serial, length, flags;
	if (0 == GetVolumeInformationA(drive, volume_name, sizeof(volume_name), &serial, &length, &flags, volume_system, sizeof(volume_system))) return;
	printf("ドライブ : %s\n"
		"ボリューム名 : %s\n"
		"シリアル番号 : %08X\n"
		"ディスクの種類 : %s\n"
		"ファイルシステム : %s\n"
		"システムフラグ : %08X\n"
		"ファイル名の最大文字数 : %lu\n\n",
		drive, volume_name, serial, disk_type, volume_system, flags, length);
}

int main(void) {
	DWORD drive = GetLogicalDrives();
	for (int i = 0, flag = 1; i < 26; i++, flag <<= 1) {
		if (!(drive & flag)) continue;
		char letter[20];
		sprintf_s(letter, sizeof(letter), "%c:\\", 'A' + i);
		switch (GetDriveTypeA(letter)) {
			case DRIVE_REMOVABLE:
				print_drive_info(letter, "リムーバブルディスク");
				break;
			case DRIVE_FIXED:
				print_drive_info(letter, "ハードディスクドライブ");
				break;
			case DRIVE_REMOTE:
				print_drive_info(letter, "ネットワークドライブ");
				break;
			case DRIVE_CDROM:
				print_drive_info(letter, "ディスクドライブ");
				break;
			default:
				print_drive_info(letter, "その他のドライブ");
				break;
		}
	}
	return 0;
}
```

## 結果
プログラムのコンパイル結果を以下に示す。
![drive_list.png](https://qiita-image-store.s3.amazonaws.com/0/94629/5eef5b48-cd91-3ae0-818f-fe1c15b4da27.png)

しかし私のPCのドライブは、エクスプローラーで確認すると、以下の通りであり、全てのドライブが列挙されているわけではないことが分かる。
![explorer.png](https://qiita-image-store.s3.amazonaws.com/0/94629/29664493-92ab-062d-9535-2d4f9a693324.png)

## 結論
実験レポート風に書いてますが、そこには特に意味はないです。
問題はなぜIドライブ以降が列挙されなかったかということです。
ちなみにIドライブ以降のドライブは全てNTFS形式でフォーマットされています。
また、どのドライブもアクセス権限はあります。

## 参考サイト
[プログラミングのメモ帳　ドライブのボリューム情報を取得](http://blog.goo.ne.jp/masaki_goo_2006/e/8915ddad6778f0768255456b5dd60e16)

>どうもmain関数の3行目を消すと全列挙されるっぽいです。
>なんでだろう…
>>[@yumetodo](http://qiita.com/yumetodo)さんに誤植指摘されて修正した結果、全ドライブリストを列挙できました。