OmniAICreator/Qiita-1.07M huggingface dataset:
オープンソースになったWindows File Managerを動かしてみた

# はじめに

Windowsのファイルマネージャといえば「Windows Explorer」ですが，その前身となる「Windows File Manager」がオープンソース化しました．MicrosoftのGitHubにリポジトリとして公開されているので，ビルドして動かしてみました．

[https://github.com/Microsoft/winfile](https://github.com/Microsoft/winfile)

<img width="595" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/45310/890e3e29-f71e-9e20-1c09-a1d7198118ac.png">

# Windows File Manager (WinFile)

残念ながら自分は世代的にも使ったことがないのですが，1990年の「Windows 3.0」と共にリリースされたGUIのファイル管理アプリです．CUIからの切り替わりの役割を担ったアプリですね．そんなコードが今のWindows 10でも動かせるようにOSSで公開されているとなるとロマンを感じます:tada:

今公開されているリポジトリには`original_plus`と`v10.0`というタグが付けられています．
original_plusのほうは「Windows NT 4.0」のものから持ってきており，今のWindowsで動かすための最低限の変更が入っています．
v10.0はそこからさらにいくつかの改善が入ってリリースされています．

また，現時点でそこからさらにいくつものコミットがmasterに追加されています．IssuesやPull Requestsもたくさん上がっています！すごいっ！！

# ビルドして動かす

コードのビルドはVisual Studioを使って簡単に行えます．今回試した環境はこちら．

* Windows 10 Pro
* Visual Studio Community 2017 15.6.6

Visual StudioはInstallerのワークロードで「C++によるデスクトップ開発」を追加で入れておく必要があるかもしれません．（自分ははじめから入れてあったのでちょっとあいまいです．ビルドできなければこちらを確認してみてください．）

<img width="355" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/45310/c94f3f04-4e9e-ff8f-4544-4fd775af036a.png">

まずはリポジトリからGit Cloneしてきます．

```console
> git clone https://github.com/Microsoft/winfile.git
```

Cloneしたあと`winfile\src\Winfile.sln`をVisual Studioで開きます．ソリューションエクスプローラからトップのソリューションを右クリックして，「ソリューションの再ターゲット」を選択，実行します．

<img width="354" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/45310/2ec00179-ffcb-0b95-e29c-a2bdd304488b.png">

あとは普通に`Ctrl+Shift+B`等でビルドすればOKです．上記で説明した2つのタグの他に現状のmaster`193ba0c500`でビルドして実行することができました．

# おわりに

Microsoftの歴史的なアプリにこのように触れることができて素晴らしい:open_hands:
PyModbusでModbusRTU対応のAZD-KDを制御してみる

# 今回の目的
[前回](https://qiita.com/ToyoshiMorioka/items/8f92121f6bf6b9b6d9a0)、pyserialでAZD-KDに接続されたステッピングモータををModbusプロトコルで動かしました。
今回は適当に作ったserial通信周りをPyModbusに置き換えつつ、ModbusプロトコルとPyModbusの使い方について学んでいきます。
森岡が書いたテストコードは[こちら](https://github.com/ToyoshiMorioka/PyModbusTestForAZDKD)。

# Modbusとは
[Modbus](https://ja.wikipedia.org/wiki/Modbus)はWikipediaによると、Modicon社が策定したPLCと通信するためのプロトコルです。
FA業界におけるデファクトスタンダードになっています。
通信は大きく3パターンあり、エラーチェックの方式がそれぞれ異なっています。

| | 通信方式| エラーチェック|
|:-:|:-:|:-:|
| Modbus RTU| Serial| CRC|
| Modubs ASCII| Serial| LRC|
| Modbus TCP| Socket |なし(TCP標準)|

# PyModbusとは

[PyModbus](https://github.com/riptideio/pymodbus)は名前の通り、Pythonで書かれたModbus用のライブラリです。
ソケット通信のModbus TCP、シリアル通信のModbus RTUとModbus ASCIIなどの主要な通信方式に対応しているだけでなく、ユーティリティが充実しています。
PCのスペックが低い時代に組まれた成熟した通信は大体バイナリで値の管理をしっかりしないといけないの場合が多いのですが、Modbusも例に洩れず、そういった送信コマンドのサイズ管理をして行く必要があります。
こういった場合、Pythonなどの型のサイズを利用者に意識させない高級スクリプト言語だと返ってやりづらかったりするのですが、PyModbusではPayload Builderというクラスを使って、そのあたりを使いやすくしてくれています。
また、上記のエラーチェックも特に何も記述しなくても通信方式にあわせて宜しくやってくれます。


# AZD-KDをPyModbusで制御する
で、戻って今回テストで使うAZD-KDをPyModbusで動かしてみます。
いくつかメソッドがありますが、AZD-KDは基本的にはWriteコマンドを利用すれば大体できそうです。ただ、タイミングチャートを見るとちゃんと値を受け取ってインターバルを取ってから次のコマンドを送ったほうが良さそうなので、Readも面倒くさがらずに実装します。

## 接続
PyModbusでのModbus RTU接続は以下のようになります。
stopbits、parity、baudrate、bytesizeはAZD-KDの初期設定値に合わせています。
portはPCによって異なるので適当にあわせてください。
timeoutはAZD-KDのタイミングチャートを見てざっくり設定しました。

```python:
from pymodbus.client.sync import ModbusSerialClient as ModbusClient
client = ModbusClient(method = "rtu", port="COM7",stopbits = 1, bytesize = 8, parity = 'E', baudrate= 115200, timeout= 0.02)
connection = client.connect()
```

## コマンド
コマンドは以下の感じ。これは『動き方を記録したメモリの0番目(メモリアドレスは6144)』に『位置決めの方式』と『step数（回転角度）』を書き込むコマンドです。
AZD-KDは基本コマンドは全て32bitです。
skip_encodeはbuilder使う場合はtrueにしておいたほうがよさげでした。
unitはデイジーチェーンしたModbusデバイスの何番にこの書き込みを行うか。
前回AZD-KDを半固定抵抗を回して1番にしていたので0x01を指定しています。

``` python:
from pymodbus.constants import Endian
from pymodbus.payload import BinaryPayloadBuilder

# メッセージの作成
builder = BinaryPayloadBuilder(byteorder=Endian.Big)
builder.add_32bit_int(2) # 相対位置決め運転
builder.add_32bit_int(1000) # 1000step回転させる

result = client.write_registers(address=6144, values=builder.build(), unit=0x01, skip_encode=True)

```

## AZD-KDの通常運転
AZD-KDの運転（モーター制御）には2パターンあります。
通常運転はそのまま、通常の運転です。
通常運転は以下の3つの通信が必要になります。

+ 利用する運転Noのメモリ領域に運転情報を書き込み
+ 運転開始コマンドを書き込み
+ 運転開始終了コマンドを書き込み

一応上記のgithubには書いてみましたが通信を3回もしなければならないので遅いです。
AZD-KDの仕様上、60FPSではやりとりできないので3回もやってると目に見えて遅そう。

## AZD-KDのダイレクト運転
もうひとつがダイレクト運転。
通常運転よりも操作できるパラメータは少ないですが書き込むと即座に動き出します。
インタラクティブに動かすならこちらだけで良いかと思います。
こちらもgithubのサンプルに一通りパラメータ類を書き込んでます。

# 動いたので
次にやっと本題。Modbusを使い、TouchDesignerでAZD-KDを動かします。
WindowsでOpenSCを使ってカードのIDmを確認する方法

#はじめに
FelicaなどのICカードの固有ID（IDm）を読みだしてカードリーダーとかICカードの動作確認をするのにOpenSCを使うと便利だったのでメモ

#環境
- OS=Windows10
- カードリーダー=今回はPaSoRi RC-S380 をサンプルにしていますが、これ以外も使えます。
	- カードリーダーのドライバはインストールしておくこと
- ICカード= SUICA（Felica）

#OpenSCとは
- https://github.com/OpenSC/OpenSC/wiki
- PC/SCとユーザーPGの間のミドルウェア
- オープンソースです
- Linux,Mac,OS X,Windows上で稼動する、汎用的なカード用ライブラリ
- PKCS#11ライブラリ、ツールなどで構成されてる
- なんと、マイナンバーカード（JPKI）にも対応している



#OpenSCダウンロード
https://github.com/OpenSC/OpenSC/wiki
からダウンロードしましょう。
今回は、OpenSC-0.17.0-win64_vs12-Release.msi　をインストールしました。
https://github.com/OpenSC/OpenSC/releases/tag/0.17.0

- msc実行 → choose setup type で complete にするだけであとはそのままインストールでOK
- OpenSCのモジュールは、C:¥Windows¥System32　にインストールされます
	- pensc-pkcs11.dll
	- opensc-minidriver.dll
	- など
- ツール群がC:¥Program Files¥OpenSC Project　にインストールされます
	- opensc-tool.exe
	- opensc-explorer.exe
	- その他たくさん

#ICカードリーダーの情報取得
opensc-tool.exeを使います。

## opensc-tool.exe -a
- ATRを取得する。
- ATR(Answer To Reset)とは、カードが電気的に活性化した際にカードから送られる初期応答情報。これは最高32バイトであり、転送速度やカードを識別情報が含まれている。各情報はキャラクタ単位で識別され、たとえば1バイト目は開始キャラクタ
(TS)と呼ばれている。
- 要するにこのコマンドでカードリーダーを通してICカードが認識されているかどうかを確認することができる。

```
C:\Program Files\OpenSC Project\OpenSC\tools>opensc-tool -a

Using reader with a card: Sony FeliCa Port/PaSoRi 3.0 0 ← ※1
xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx ← ※2
```
- ※1　接続しているカードリーダーの情報
- ※2　ATR値、カードを認識していない場合は `Failed to connect to card: Card not present` となる


##opensc-tool.exe -s
- ICカードにAPDUを送信し、応答を得る。
- カードのIDmを取得するためのGetDataコマンドでIDmを取得することができる。

```
C:\Program Files\OpenSC Project\OpenSC\tools>opensc-tool -s FF:CA:00:00:00 ← ※1

Using reader with a card: Sony FeliCa Port/PaSoRi 3.0 0　←　※2
Sending: FF CA 00 00 00
Received (SW1=0x90, SW2=0x00):　←　※3
01 02 03 04 05 06 07 08 ..=$i...　←　※4
```
- ※1　**FF:CA:00:00:00**　GetDataコマンド＝IDm（UID）問い合わせ
- ※2　接続しているカードリーダーの情報
- ※3　応答　**SW1=0x90,SSW2=0x00** で**正常終了**という意味
- ※4　カードのIDm（UID）　この例ではFelicaを使ってIDm（8Byte）**01 02 03 04 05 06 07 08**　が取得された。

##その他
- opensc-toolでAPDUコマンドを送れば、カード内情報を読み込んだり書き込んだりできるので、プログラムを作らなくても比較的簡単にICカードのHackができます。
- カードリーダーはPaSoRiに限らず利用できます。
- カードはFelicaに限らずType-AやType-Bにも対応しています。

##参考

[OpenSC](https://github.com/OpenSC/OpenSC/wiki)
[EternalWindows スマートカード](http://eternalwindows.jp/security/scard/scard00.html)
[RC-S380](https://www.sony.co.jp/Products/felica/consumer/products/RC-S380.html)
AtomでLaTeXを導入している時のstyファイルの置き場所

Atomのlatex PackageはTex Liveに依存しているため、以下のディレクトリを探索すれば良い。

```
/Applications/TeXLive/Library/texlive/2016/texmf-dist/tex/latex
```

配置し終わったら

```
sudo mktexlsr
```
するのを忘れないように。
Coursera Deep Learning 【course1  week1】 私的なメモ(誰かの役にたてば幸いです)

#この記事について
この記事は筆者がCourseraの"Deep Learning"というオンライン授業を受ける中で、思考を整理したり、知らなかったことを書き留めるための私的なメモである。
なおこの記事では（多分Deep Learningのオンライン授業もその前提だと思いますが）Courseraの別のオンライン授業、Ng Andrew先生の"Machine Learning"を既習のものとしています。

**私的なメモではありますが、筆者と同じくMachine Learningの授業を一通り終えたけど、まだDeep Learningには馴染みがないという方には少しばかりか学習の助けになれば幸いです。**
#コース1-Week1 ディープラーニングへの誘い
##ニューラルネットワーク応用例とその種類
* オンライン広告、不動産価格：標準的なニューラルネットワーク（全結合？）
* 画像認識：CNN
* 音声認識：RNN（再帰型ニューラルネットワーク）音声は１次元の時系列データ（シーケンスデータ）なので
* 翻訳：RNN 。言語では漢字やアルファベットのような文字が1つずつ表されるので必然的にシーケンスデータ
* 自動運転：画像にはCNN。レーダーなどには特殊なニューラルネット。

##構造化データと非構造化データ
<dl>
 <dt>構造化データ</dt>
  <dd>データベースのデータ</dd>
 <dt>非構造化データ</dt>
  <dd>画像、音声、テキストなど</dd>
</dl>
教師あり学習ではいずれのデータも扱うことができる。特にニューラルネットワークは非構造化データを高精度で扱うことができる。

##なぜニューラルネットワーク が成長しているのか
<img width="786" alt="スクリーンショット 2018-04-15 12.13.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/209951/05e991e7-78e2-5888-9f43-9c06d7baa234.png">

ニューラルネットワークは大きくすれば（隠れ層の数・１層当たりのノード数を増やす）するほど精度が上がる。ニューラルネットワークの精度を左右する指標は’ネットワークの大きさ’と’データの量’なのだ。
データ量が少ない時であれば、層の大きさによる差はあまりないため、適切にパラメータを工夫したSVMなどの方が精度が良い場合がある。

* インターネットやIOTなどによるデータ量の増加
* GPUなどのハードウェアの性能上昇
* アルゴリズムの改良（代表例：Sigmoid関数=>Relu関数で計算速度が上昇した）

---
Coursera Deep Learning👉     https://www.coursera.org/specializations/deep-learning
CUDAをUpgrade (8.0 -> 9.0)

TensorFlow 1.7以上を使うにはCUDAの9.0以上を利用する必要があったのでCUDAのバージョンを8.0から9.0にアップグレードしました


【My環境】
ノートPC: ALIENWARE 15 R13
OS: Ubuntu 16.04 LTS(Windowsマシンでデュアルブート)
CUDA: 8.0


バージョンの確認

```
$ nvcc -V
```

バージョン8.0を使ってますね

```
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2016 NVIDIA Corporation
Built on Tue_Jan_10_13:22:03_CST_2017
Cuda compilation tools, release 8.0, V8.0.61
```

#  CUDA
NVIDIAの公式サイトからCUDA9.0のインストールしていきます
https://developer.nvidia.com/cuda-toolkit-archive

CUDA Toolkit 9.0を選択
![Screenshot from 2018-04-22 16-24-28.png](https://qiita-image-store.s3.amazonaws.com/0/245670/fa79ecd2-5cdb-0af6-3c69-431a672d5894.png)


以下の項目を指定して選択
- Operating System: Linux
- Architecture: x86_64
- Distribution: Ubuntu
- Version: 16.04
- Install Type: deb(network)

Downloadボタンをを押してファイルをダウンロード


![Screenshot from 2018-04-22 16-25-53.png](https://qiita-image-store.s3.amazonaws.com/0/245670/b3108b5b-b698-8947-c0fb-723db13f14f9.png)


debパッケージのインストール

```
$ sudo dpkg -i cuda-repo-ubuntu1604_9.0.176-1_amd64.deb
$ sudo apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/7fa2af80.pub
$ sudo apt-get update
$ sudo apt-get install cuda-9-0
```

Pathの確認

```
$ echo $PATH
```

cuda-8.0がありますね

```
/usr/local/cuda-8.0/bin
```

# cuDNN
cuDNNのダウンロードサイト(https://developer.nvidia.com/rdp/cudnn-download) から以下の3つをダウンロード
(下記3つは現在の最新バージョンに読み替えてください)

1. cuDNN v7.0.5 Runtime Library for Ubuntu16.04 (Deb)
2. cuDNN v7.0.5 Developer Library for Ubuntu16.04 (Deb)
3. cuDNN v7.0.5 Code Samples and User Guide for Ubuntu16.04 (Deb)



ダウンロードしたファイルを以下のコマンドを実行してcuDNNのインストールを開始します

```
$ sudo dpkg -i libcudnn7_7.0.5.15-1+cuda9.0_amd64.deb
$ sudo dpkg -i libcudnn7-dev_7.0.5.15-1+cuda9.0_amd64.deb
$ sudo dpkg -i libcudnn7-doc_7.0.5.15-1+cuda9.0_amd64.deb
```

bashrcを編集

```
$ vim ~/.bashrc
```

Before

```
# NVIDIA CUDA Toolkit
export PATH=/usr/local/cuda-8.0/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-8.0/lib64:$LD_LIBRARY_PATH
```

After
編集して保存

```
# NVIDIA CUDA Toolkit
export PATH=/usr/local/cuda-9.0/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-9.0/lib64:$LD_LIBRARY_PATH
```

再読み込み

```
$ source ~/.bashrc
```

PATHの確認

```
$ echo $PATH
```

cuda-9.0発見

```
/usr/local/cuda-9.0/bin
```

バージョンを確認

```
$ nvcc -V
```

Hello, CUDA 9.0!

```
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2017 NVIDIA Corporation
Built on Fri_Sep__1_21:08:03_CDT_2017
Cuda compilation tools, release 9.0, V9.0.176
```
ろんりについてまとめる (集合編)

# はじめに
- この記事は[「ろんりと集合」](http://amzn.asia/g6H0thc)という中内伸光さんの本を参考にしています．
- この本で学習したことのうち，定理みたいなものをまとめました．
- この本の引用を多少用いています．
- この本の本質的なことはこの記事からは確認できません．

## まとめ集
[ろんりについてまとめる](https://qiita.com/TomKid/items/4c06781b9cecc5a30f65)

## 集合

集合とは，「ものの集まり」のこと．

## 特別な集合の記号
- N (Natural Number) : 自然数の全体からなる集合
- Z (Zahl)           : 整数の全体からなる集合
- Q (Quotient)       : 有理数の全体からなる集合
- R (Real Number)    : 実数の全体からなる集合
- C (Complex Number) : 複素数の全体からなる集合

## 集合の要素

集合を構成する個々の”もの”を，その集合の要素（あるいは元, element）という．

$ x \in A $

xはAに含まれる．（xはAに属する）

## 集合の表記法
- 外延的記法
 - 要素を並べる
 - $ \\{ x_{1}, x_{2}, \cdots \\} $
- 内包的記法
 - 要素になる条件を書く
 - $ \\{ x|xは条件〜を満たす \\} $

## 等しい

集合Aと集合Bが等しいとは，

- (Aの要素がすべてBの要素) $\cap$ (Bの要素がすべてAの要素) 
- $ A = B $

### 例
$ \\{1,2,3\\}=\\{1,2,3,2\\}=\\{3,2,1\\}=\\{2,3,1,2\\} $ 

## 有限集合と無限集合

$ A = \\{1,2,3,4\\} $
$ B = \\{x|x<N\\}$

- 有限集合
 - 集合の要素が有限個
 - $ \\#A = 4 $
 - $ |A|  = 4 $

- 無限集合
 - 集合の要素が無限個
 - $ \\#B = \infty $

- 空集合
 - 要素が1つもない集合
 - $ \\{\\} = \phi $

### 部分集合，共通部分，和集合

$ A = \\{4,5\\} $
$ B = \\{2,3,4,5\\} $
$ C = \\{1,2,3\\} $

- 部分集合
 - AはBに含まれる
 - Aの全ての要素がBの要素担っている
 - $ A \subset B $

- 共通部分
 - 共通の要素の集合
 - AにもBにも含まれている要素の集合
 - $ A \cap B = \\{x|x \in A かつ x \in B\\} = \\{4,5\\} $
 - $ B \cap C = \\{2,3\\} $
 - 集合同士で共通部分が無いとき，互いに素(muutually disjoint)

- 和集合
 - 複数の集合の要素をすべて集めた集合
 - $ A \cup B = \\{x|x \in A あるいは x \in B\\} $

## 集合と論理の対応関係

|集合|対応|論理|
|:--:|:--:|:--:|
||||
||||
iCloudのサインアウト・サインインすべてできないのを直す


iCloudの調子が悪い時、サインインし直せば良いことが言われていますが、サインアウトしようとすると、処理中のぐるぐるが出て全くサインアウトできないことがあります。`~/Library/Caches/CloudKit/CloudKitMetadata*`を削除してみましたが改善せず。Apple Supportでもお手上げでした。。

ところが、私のiCloudのアカウントでLibrary以下をgrepしたら、`~/Library/Accounts/`が出てきました。これを消してログインし直したら改善しました。

https://qiita.com/chano2/items/027d9b101a2591235125
でも触れられていますが…検索では引っかからなかったようで。難しいものです。

## 追伸

多分原因は昔Disk Fullだと思うので、特に同期系が動いている場合はディスクの空きが0byteにならないように気を使ったほうがいいと思います…

## 検索用

- The connection to ACDAccountStore was invalidated.
iCloudの2ファクタ認証の警告を消す


OSXでiCloudを使っていると、2ファクタ認証せよと出ますが、yalu等でCydia Impactorを使っている場合は2ファクタ認証は入れたくないもの。

この警告は以下の方法で抑制できます。

- OSXのシステム環境設定、iCloudパネルの、2ファクタ認証で「続ける」
- 「後で設定」を選択し、「続ける」

「今すぐ設定」からキャンセルしても抑制はできないので注意。

acknowledgement: https://discussions.apple.com/thread/7908565
擬似要素 before、after


##before
<img width="314" alt="スクリーンショット 2018-04-22 16.39.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/20635/45159974-d297-0da9-6f58-8db597156378.png">

```slim:
.box-01
```
```scss
.box-01 {
  width: 300px;
  height: 300px;
  background-color: #cccccc;
  &::before {
    width: 60px;
    height: 60px;
    display: inline-block;
    content: "";
    background-color: red;
    border-radius: 50%;
  }
}
```
##after
<img width="313" alt="スクリーンショット 2018-04-22 16.39.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/20635/091d5bb6-8629-784f-13c1-0d10cb8034b4.png">

```slim:
.box-02
```
```scss

.box-02 {
  width: 300px;
  height: 300px;
  background-color: #cccccc;
  &::before {
    width: 60px;
    height: 60px;
    display: inline-block;
    content: "";
    background-color: red;
    border-radius: 50%;
  }
}
```
Typescriptでprivateメソッドをテストする

Typescriptでprivateメソッドをテストしたかったが単純にメソッドにアクセスしようとすると怒られたので、
どうやったらテストできるか調べてみた。

# How

以下の例で見ていく。

```typescript:hoge.ts
export default class Hoge {
  private add(a: number, b: number) number {
    return a + b
  }
}
```

```typescript:hoge.spec.ts
import Hoge from './hoge'

it("returns the addition of two numbers", () => {
  const hoge = new Hoge()
  expect(hoge.add(1, 2)).toBe(3)
})
```
テストを実行すると、

```
src/hoge.spec.ts (5,15): Property 'add' is private and only accessible within class 'Hoge'.
```
と怒られる。

解決方法は２つあって、

1. anyにキャストして`.hoge`でアクセスする
   
   ```typescript
   (hoge as any).add(1, 2)
   ```
2. プライベートなメソッドに`["hoge"]`でアクセスする
   
   ```typescript
   hoge["add"](1,2)
   ```
Zynq ARMでソフトウェア割込みを送信する方法（レジスタ使用）

 Zynq-7000 を使用する際、ソフトウェア割込みをかけたい。でもその為のライブラリがなぜか使えない。ならばレジスタを直接たたけばいいじゃない

という事でレジスタを調査した時のメモ

#ソフトウェア生成割込み用レジスタ説明（原文）

![SGI_1.png](https://qiita-image-store.s3.amazonaws.com/0/247553/31d4dcfe-78ce-35e5-848a-750a17eb4ac7.png)

![SGI_2.png](https://qiita-image-store.s3.amazonaws.com/0/247553/7b995a22-1912-1605-a049-3e21e10eabb2.png)

![SGI_3.png](https://qiita-image-store.s3.amazonaws.com/0/247553/976d5465-3960-c0d4-7d9d-c2a47286f04f.png)


#内容メモ
見た感じ、シェル上でdevmemを打つだけでソフトウェア割込みができそう

（※devmem <物理アドレス（原文で言うAbsolute Address）> <サイズ>  [書き込みたい値]）

レジスタに書き込む値は以下を参考に。

* Reserved[31:26]
意味はない。後々使われる可能性あるかもなって所

* TargetListFilter[25:24]
割込み信号を出す対象を決める領域。
0b00　：　CPUTargetListで指定した対象に割込み信号を出す
0b01　：　すべてのCPUに割込み信号を出す
0b10　：　割込み信号を出してくれといったCPUにのみ出す
0b11　：　予約値。意味はない

* CPUTargetList[23:16]
TargetListFilterで0b00を入力した際に利用。
例えば、CPUTargetList[0]はCPU0を意味する。CPUTargetList[0]=1とすると、CPU0に割込みをかけることになる。

* SATT[15]
セキュリティ関連項目。
![SGI_4.png](https://qiita-image-store.s3.amazonaws.com/0/247553/1004d50d-3d7c-bd89-d359-98c1a4b92030.png)


* SBZ[14:4]
SBZが何者か分からず。ほかの資料を読むとReserve扱いされているので、使用しなくても大丈夫か

* SGIINTID(INTID)[3:0]
ソフトウェア割込みID番号。0～15で選択。
例：　0b0011なら割込みIDは3となる

#devmemで割込みを出してみよう
devmem 物理アドレス サイズ 値
例：
>devmem 0xF8F01F00 32 0x10000
CPU0に割込みID No.0の割込みを送信（セキュリティなし）
（これはまだ実機で試してない。試したら追記します）
※うまくいきました。割り込み信号が上記で送信できたこと確認済みです

レジスタは32bitで0b000000 | 00 | 00000001 | 00 | 00000000 | 0000


毎度のことながら、ただのメモ書きでした


#参考文献
[Zynq-7000 All Programmable SoC テクニカル リファレンス マニュアル](https://japan.xilinx.com/support/documentation/user_guides/j_ug585-Zynq-7000-TRM.pdf)

[ARM Generic Interrupt Controller Architecture Specification](https://www.systems.ethz.ch/sites/default/files/file/aos2012/ReferenceMaterial/InterruptHandling/GIC_architecture_spec_v1_0.pdf)
シェルスクリプト内でsqlplusを実行する


#ヒアドキュメントでsqlplusを実行する

```
#!/bin/bash

sqlplus  -s  / as sysdba <<EOF
  select instance_name,status from v\$instance;
  exit
EOF

exit
```
シェル内にSQL文が直接書かれているため、らくちん。見通しもいい。

v\$instnceの「$instance」部分が変数として展開されないように[\$]でエスケープしている。
以下のように\`EOF\` とすることでヒアドキュメント内での展開をしないようにすることもできる。

```
#!/bin/bash

sqlplus  -s  / as sysdba <<'EOF'
  select instance_name,status from v$instance;
  exit
EOF

exit
```


#SQLファイルをシェルの中で作ってsqlplusを実行する



```
#!/bin/bash

tempsqlfile=/tmp/tempsqlpfile.sql
touch ${tempsqlfile}

echo "select instance_name,status from v\$instance;"  > ${tempsqlfile}
echo "exit"                                          >> ${tempsqlfile}

sqlplus  -s  / as sysdba @${tempsqlfile}

exit
```
実行したSQLファイルを残しておきたかったり、シェル内の条件によって生成するSQLが変わってくる場合に使用。

行数が多くて、SQLファイルへのリダイレクト（「>>ファイル名」）を毎行書きたくないときはコマンドをグループ化する。

```
{
echo "select instance_name,status from v\$instance;"
echo "exit"
} > ${tempsqlfile}
```

もちろんヒアドキュメントでファイルを作ることも可能。

```
cat <<'EOF' > ${tempsqlfile}
  select instance_name,status from v$instance;
  exit
EOF
```

#パイプで渡してsqlplusを実行する


```
#!/bin/bash

(
echo "select instance_name,status from v\$instance;"
echo "exit"
)|sqlplus  -s  / as sysdba

exit
```
sqlplusのコネクションを1回だけ生成し、定期的にSQLを発行するような場合に使う。
以下は1回の接続でフラグファイルが存在する間、定期的に同じSQLを発行し続ける例。

```
#!/bin/bash

sql_alive_flg=/tmp/sql_alive.flg
touch $sql_alive_flg


(
while [ -a ${sql_alive_flg} ]
do
 echo "select instance_name,status from v\$instance;"
 sleep 5
done

echo "exit"

)|sqlplus  -s  / as sysdba

exit
```



##参考

書籍：門外不出のOracle現場ワザ
http://www.oracle.com/technetwork/jp/articles/chapter5-1-101584-ja.html

SQL*Plus使い方 - SQLスクリプトをシェルスクリプト内に書く（シェルスクリプトTips-3）
https://blogs.oracle.com/oracle4engineer/sqlplus-sqltips-3

bashのヒアドキュメントを活用する
https://qiita.com/take4s5i/items/e207cee4fb04385a9952
Tensorflowのグラフ最適化とその可視化

Tensorflowのような、計算グラフを構築してから実行するDefine and Runなフレームワークの利点の一つは、計算グラフを実行する前に最適化を行えることです。

計算グラフの最適化では

- 最終的に不要なノードを計算グラフから削除する
- 重複する式の計算をまとめる (common subexpression elimination)
- 定数で計算できるノードを畳み込む (constant folding)

等が行われます。本記事では、実行時のグラフを可視化することで最適化の具体例を示します。

# 最適化されたグラフの可視化 (実行時グラフ可視化)
計算グラフの最適化はsess.runの段階で行われます。このsess.runにオプションを渡すことで、最適化されたグラフを受け取ることができます。次のようにoutput_partition_graphs=Trueにすることで、run_metadataを介して実行時のグラフが渡されます。

```python
run_options = tf.RunOptions(output_partition_graphs=True)
run_metadata = tf.RunMetadata()

sess.run([ops], run_metadata=run_metadata, options=run_options)

graph = run_metadata.partition_graphs[0]
writer = tf.summary.FileWriter(logdir="./graph/", graph=graph)
writer.flush()
```

# common subexpression elimination
次のような計算を考えます。

```python
v1 = a * 2 + c * 4
v2 = b * 2 + c * 4
```

v1とv2の計算には、どちらもc*4が出現するため、c*4は一度だけ計算すれば使いまわせる筈です。

Tensorboardでこの計算グラフを可視化すると次のようになります。

![図4.png](https://qiita-image-store.s3.amazonaws.com/0/5453/32f70237-3e15-00d5-47f2-94bbd8ace4e0.png)

mulが4つあり、c*4の計算結果が使いまわされていないように見えます。しかし、上記の方法で実行時の計算グラフを可視化すると次のようになります。

![図5.png](https://qiita-image-store.s3.amazonaws.com/0/5453/1dae5d5d-e8eb-d30f-259e-040c2fc0cd81.png)

mulが3つに減っていることがわかります。

# constant folding
定数だけに依存するOperatorがあれば実行前に計算しておくことが可能です。
次のような計算グラフを考えます。

```python
a = tf.constant(np.ones([4,32,32,3]), dtype=tf.float32, name="a")
W1 = tf.constant(np.ones([3, 3, 3, 8]), dtype=tf.float32, name="W1")
W2 = tf.constant(np.ones([3, 3, 8, 4]), dtype=tf.float32, name="W2")
W3 = tf.Variable(np.ones([3, 3, 4, 2]), dtype=tf.float32, name="W3")

v1 = tf.nn.conv2d(a, W1, strides=[1, 2, 2, 1], padding="SAME", name="conv1")
v2 = tf.nn.conv2d(v1, W2, strides=[1, 2, 2, 1], padding="SAME", name="conv2")
v3 = tf.nn.conv2d(v2, W3, strides=[1, 2, 2, 1], padding="SAME", name="conv3")
```

これを可視化すると、
![図6.png](https://qiita-image-store.s3.amazonaws.com/0/5453/b38d64fa-fca5-3cf3-d7dd-26289c07e790.png)

となり、convolutionが3回行わていることがわかります。

v2の計算までは、定数だけで構成されるため、事前に計算が可能です。そのため、実行時の計算グラフを可視化すると

![図7.png](https://qiita-image-store.s3.amazonaws.com/0/5453/68f3955c-a854-23ab-fd3f-e9bdcfc09a1c.png)

となり、convolutionが実行時には1回に減少していることがわかります。

# まとめ
実行時の計算グラフを表示することで、グラフの最適化の様子を観測することができました。
実行時の計算グラフの表示は、各OperatorがどのDeviceにマッピングされたかの表示も行ってくれるため非常に便利な機能です。
【Rails5】モデルでbefore_actionでfalse返って来てるのに以降の処理やられちゃう問題

# throw(:abort)でOK
例えばモデルでerrors配列にエラーの文言を格納し、それをチェックするメソッドをbefore_◯◯◯で設定するとする。

## Rails4
その際にRails4では

```
errors.blank?
```
的な感じでerrorsの中身があればfalseを返し、これで以降の処理は行わなかった。
しかし、Rails5では異なるようで。。。（泣）

## Rails5
Rails5ではコールバックで処理を戻したいときに

```
throw(:abort) unledd errors.blank?
```
というふうに throw(:abort)を使う必要があるようです!!
釘宮病患者の、釘宮病患者による、釘宮病患者のためのプログラミング言語「くぎゅ言語」できました。

#詳しい人向けの3秒解説
ただのBrainf*ckです。


#サンプルプログラム 

```:くぎゅ言語
くぎゅううううううううう！くぎゅ〜うううううううう〜ううううううううううう〜うううううーーーぅ！！くぎゅ〜っ
〜ううっうううううううっっうううっ〜ぅっぅぅぅぅぅぅぅぅぅぅぅぅっーううううううううっぅぅぅぅぅぅぅぅっうううっぅぅぅぅぅぅっぅぅぅぅぅぅぅぅっ〜うっ
```

上記の奇怪な文字列は、釘宮病患者の極めて日常的なツイートに見えますが、
こればちゃんと実行可能なプログラムのソースコードです。

```:実行結果
Hello, World!
```

#言語の特徴

釘宮病患者の放つ奇声になるべく近くなるようデザインされた
プログラミング言語です。

元となったBrainf*ckは、特に
+と-の出現頻度が高いことから、
それを「う」と「ぅ」に置き換えれば
極めて自然な釘宮病患者の奇声に似せられると思い、
作ってみました。

|動作|Brainf*ck|くぎゅ言語|
|:---|:---|:---|
インクリメント|+|う
デクリメント|-|ぅ
ポインタを右に|>|〜
ポインタを左に|<|ー
標準出力|.|っ
標準入力|,|ッ
条件付ループ開始|[|！くぎゅ|
条件付ループ終了|]|！！くぎゅ|

※このパターンに一致しない文字列はコメントとしてコンパイラに無視されます。
意味はないけど、プログラム先頭に「くぎゅ」の３文字をいれておくと、ソースコードが美しくなります。

#実際の作り方
Brainf*ckをマッピングしてジョークプログラミング言語を作るためのツールはたくさんあると思いますが、
今回は @284km さんの gem_brainをお借りしました。感謝。
<https://github.com/284km/gen_brain> 
<https://284km.github.io/slides/20171109_omotesandorb28/slides/#/>

Ruby実行環境で動作します。
Macでやってます。

###gen_brainのインストール
```
$ gem install gen_brain
```

###configファイルの作成

```:kugyuLang.config
title: kugyulang
p_inc:        "〜"
p_dec:        "ー"
v_inc:        "う"
v_dec:        "ぅ"
output:       "っ"
input:        "ッ"
jump_forward: "！くぎゅ"
jump_back:    "！！くぎゅ"
```

###configファイルからくぎゅ言語実行ファイル（とサンプルプログラム）をgenerate
```
$ gen_brain kugyuLang.config
```

```:出力
⭐️ Input config file nam #=> kugyuLang.config
🎉 Created kugyulang.rb and kugyulang_hello_world
🌈 Let's execute the following code!!
#=> ruby kugyulang.rb kugyulang_hello_world
```

###中身確認
```
$ cat kugyulang_hello_world 
```
```:出力
ううううううううう！くぎゅ〜うううううううう〜ううううううううううう〜うううううーーーぅ！！くぎゅ〜っ〜ううっうううううううっっうううっ〜ぅっぅぅぅぅぅぅぅぅぅぅぅぅっーううううううううっぅぅぅぅぅぅぅぅっうううっぅぅぅぅぅぅっぅぅぅぅぅぅぅぅっ〜うっ
```

###ソースの先頭に**くぎゅ**を挿入する
コメントとして扱われるで別に動作にはなんの意味も無いんだけど、美しくなるので書きましょう。

###修正確認
```
$ cat kugyulang_hello_world 
```
```:出力
くぎゅううううううううう！くぎゅ〜うううううううう〜ううううううううううう〜うううううーーーぅ！！くぎゅ〜っ〜ううっうううううううっっうううっ〜ぅっぅぅぅぅぅぅぅぅぅぅぅぅっーううううううううっぅぅぅぅぅぅぅぅっうううっぅぅぅぅぅぅっぅぅぅぅぅぅぅぅっ〜うっ
```


###実行
```
$ ruby kugyulang.rb kugyulang_hello_world
```

```:出力
Hello, world!
```

できた！


みなさんもぜひ「くぎゅ言語」でプログラミングしてくださいね！
電子回路 > トランジスタのスイッチ動作 v0.2 > コレクタ負荷, hFEmin=70, Load:Motor(5V, 120mA)

[電子回路 > トランジスタのスイッチ動作 v0.1 > コレクタ負荷, hFE=200, Load(5V, 120mA)](https://qiita.com/7of9/items/63e8d9e0a80e24d59dee)
の続き。

### 今回の作業

- ブレッドボードで実装
- 可変抵抗をつけて、モーターのまわる抵抗値を見つける
- 電流計で電流値を確認

### 材料

- トランジスタ: 2SC2655
    - [Datasheet](http://www.op316.com/tubes/buhin/image/2sc2655.pdf)
- 可変抵抗: 203 (20K)
- ダイオード: 1N4148
    - [秋月電子](http://akizukidenshi.com/catalog/g/gI-00941/)

### 回路図

http://tinyurl.com/y858jfwc

### 電流値の計測

I_C: 86mA
I_B: 0.6mA

hFE = 143?

可変抵抗の抵抗値は6.4kだった。

### 失敗

モーターが動作しないと思っていたら、ダイオードの向きを反対につけていた。
strongparameterで起こっていること

#裏での動きが知りたい
strongparameterはrails勉強していると、初心者が必ず学ぶ道ですが、最初の方はとりあえず同じDBとカラムを書いておけばいいや〜程度にしか思っていませんでした。しかし、最近勉強していると裏で起こっていることをしっかり説明できるようにしたいと考えるようになり、この記事を書くことに至りました。

#strongparameterとは？

データを格納するカラムを制限し、不正データを防ぐ仕組み。同じみ書き方はこんな感じ。

```ruby
#example_controller

 def comic_params
      params.require(:book).permit(:title, :author, :picture)
 end

```
なんとなく、このように書くんだ、と教えられてきたから形式的に書いてきたけど。。。。。
このように書いて実際はデータがどうpostされるのか一連動作が知りたかった。。。。。

#実はこんな形

```
params[:book][:title]
params[:book][:author]
params[:book][:picture]
```
bookがキー、titleやauthorがバリューです。さらにその中で。。。。。

```
params[:book] = {
 title: "実際の値"
 author: "実際の値"
 picture: "実際の値"
}

```
今度はtitleがキーになり、バリューが実際の値として入ります。

```
#ターミナル
"book"=>{"title"=>"TT", "author"=>"tsutsumi", "picture"=>"example.jpg"}, "commit"=>"Create Book"}
```
ターミナルを見ても形は上のようにハッシュ形式で入っています。


ハッシュ形式については[こちら](https://qiita.com/tomoharutsutsumi/items/2dd5dd4b6edb17244cd6)


細かいけど重要かなと思いました。
using 文と IDisposable とデストラクタと

# はじめに

プログラムを組んでいると、ファイルやネットワーク接続などのリソースを安全に開放したい場面がよくあります。
C++ では、デストラクタでリソースを開放することにして、オブジェクトをブロック内のローカル変数にする方法が使えました。

```cpp
class DocFile
{
  public:
    ~DocFile() { Close(); } // デストラクタで片付ける
    void Open() { ... }
    void Close() { ... }
}
void MyFunc()
{
  {
    DocFile df;
    df.Open();
    ... // df について、いろいろ
  } // この位置で必ず DocFile df のデストラクタが呼ばれて、df.Close()が実行される。
}
```

C# では、オブジェクトの片付けのタイミングはガベージコレクタに任されており、C++ と同じ方法は使えません。その代わり、using 文が用意されています。

```csharp
using (オブジェクト) 文
```

using の後ろの「文」を抜けるときに、括弧内のオブジェクトの片付けが行われます。

以下のコードは典型的な using 文の使い方です。
using 文の括弧の　new で　`StreamReader` オブジェクトがリソースを摑みます。あとは、using 文から抜けたときに先程のオブジェクトがリソースを開放します。using 文からの抜け方は、正常終了でも return でも例外でもなんでもよく、リソースの解放をいちいち既述しなくても、確実な解放が保証されます。

```csharp
  using (StreamReader sr = new StreamReader(path)) {
    while (!sr.EndOfStream) {
      string line = sr.ReadLine();
      if (...) return;
      if (...) throw new Exception();
      // いろいろ
    }
  } // ファイル入力が解放される
```

上記のように書いた場合、オブジェクト `sr` は using 文を抜けた後は参照できなくなります。
このオブジェクトを他でも使いたいと思い、少し試してみました。


# using 文

## 基本的なしくみ

using 文は、括弧内に `IDisposable` インターフェースを実装したオブジェクトを要求します。`IDisposable` は、メソッド `void Dispose()` のみを持つインターフェースです。using 文から抜けるとき、オブジェクトの `Dispose()` メソッドを必ず呼び出します。

通常、`Dispose()` には片付け処理を記述してあるので、using を抜けた時に確実に片付けがおこなわれます。

## オブジェクトはどこへいったか

括弧の中で変数を宣言した場合、using 文の外側ではその変数を参照できません。

```csharp
using (DocFile df = new DocFile()) {
  ...
}
... // この位置ではもう df を参照できない
```

しかし、オブジェクトは（ガベージコレクタが片付けていなければ）まだ生きています。クラスのファイナライザ（`~DocFile()` メソッド）を書いて、デバッガで止めてみるとよくわかります。
ということは、using 文の前で参照できるようにしておけば、using 文の後ろでも参照できるのでしょうか。

```csharp
DocFile df = new DocFile();
using (df) {
  ...
} // df.Dispose() が呼ばれる
Console.Out.WriteLine(df.Path); // この位置でも df を参照できる!
```

予想通り、using 文の後ろでも参照できました。
`Dispose()` メソッドも、using 文を抜けるときにきちんと呼ばれています。

## オブジェクトで管理しなくてもよい

using 文の外側で作成したオブジェクトでも using 文に使えることがわかりました。
ということは、オブジェクトそのものではなく、リソースの取得と解放のみを using 文の対象にできます。

以下の例では、実際にファイルを開いている `Open()` から `Close()` までを using で管理しています。

```csharp
class DocFile : IDisposable
{
  public DocFile(string path) { ... }
  public DocFile Open()
  {
    ... // ファイルを開く処理
    return this; // 自分自身を返すのがミソ
  }
  public void Close() { ... }
  public void Dispose() { Close(); }
}

DocFile df = new DocFile(path);
if (df.IsUpdated()) {
  using (df.Open()) { // Open() したオブジェクト df が using 文の対象
    ... // 何か処理
  } // df.Dispose() が呼ばれる
}
Console.Out.WriteLine(df);
```


# おわりに

今まで、using 文の括弧内でオブジェクトを new するものだ、と思い込んでいました。そのため、このオブジェクトを参照する処理が using のブロック内に詰め込まれ、ネストが深くて長いコードになっていました。

しかし、今回、using にはオブジェクトを渡せばよいことがわかりました。これからは、本当にリソースを使っている部分のみ using 文を使うことで、もう少し読みやすいコードにできそうです。
IndexedDBをVuexで使ってみる

# Vue-idbを使用する
これ。
https://github.com/ddgll/vue-idb
https://github.com/ddgll/vue-idb/wiki/4-Installation-with-vuex
wikiを読んだかんじ、vuexをインストールしていたほうがよさげ

## vuexをインストールする
これをgit cloneしてくる
https://github.com/vuejs/vuex
vuexディレクトリに入り、そしてnpmインストール

```bash
npm install vuex --save
npm run dev
```

でlocalhost:8080にアクセスすると画面が表示される
ここまででvuexの準備は終わり

## vue-idbをインストール
vuexディレクトリの中で

```bash
npm install vue-idb --save
```

これでインストールは終了

# 使ってみる
vuexのexampleの中にあるファイルにVueIdbの追記を行う

idb.jsファイル作成

```javascript:vuex/example/counter/idb.js
import Vue from 'vue'
import VueIdb from 'vue-idb'

Vue.use(VueIdb)

export default new VueIdb({
  database: 'test',
  schemas: [
    { tests: 'id, label, created_at, updated_at' }
  ],
  options: {
    tests: { type: 'list', primary: 'id', label: 'title', updated_at: 'updated_at' }
  },
  apis: {
    bigs: {
      all: () => axios.get('/dev/data/data.json')
    }
  }
})
```

mainとなるjsに追記

```javascript:vuex/example/counter/app.js
import VueIdb from './idb'
```

http://localhost:8080/counter/
にアクセスしてコンソールを見てみると

![image.png](https://qiita-image-store.s3.amazonaws.com/0/216967/fc2b5886-1296-cef8-e899-f8c909357fba.png)


Create DB schemaの表示があるので、一旦接続はできているようです。
Oracle DB(12.1)でJavaを呼び出してみる

##前提
Java呼び出しには、JVMコンポーネントがインストールされている必要がある。
下記SQLで確認。インストールされていなければ追加必要

```SQL
SQL> select comp_name from dba_registry order by 1;

COMP_NAME
--------------------------------------------------------------------------------
JServer JAVA Virtual Machine　　　　　#JVM
Oracle Database Catalog Views　　　　 #必須
Oracle Database Java Packages　　　　 #JVM
Oracle Database Packages and Types　　#必須
Oracle Workspace Manager　　　　　　　 #必須
Oracle XDK                            #JVM
Oracle XML Database　　　　　　　　　   #12cより必須
```

##マニュアルの手順に従い稼働確認 javaのVersionを表示する
###ソース作成
```shell-session
$ cat Version.java
public class Version
{
        public static String getver()
        {
                return System.getProperty("java.version");
        }
}
```

###コンパイル
```shell-session
$ /u01/app/oracle/product/12.1.0/dbhome_1/jdk/bin/javac Version.java
```
###登録
```shell-session
$ loadjava -user SYS Version.java
Password:
*********
```

###javaの呼び出し
```shell-session
$ sqlplus / as sysdba
SQL> create function getver return varchar2
  2  as language java
  3  name 'Version.getver() return java.lang.String';
  4  /

ファンクションが作成されました。

SQL> var str varchar2(50);
SQL> call getver() into :str;

コールが完了しました。

SQL> print str;

STR
--------------------------------------------------------------------------------
1.6.0_71
```

###DBHOMEのjavaとバージョンが少し異なる
```shell-session
$ u01/app/oracle/product/12.1.0/dbhome_1/jdk/bin/java -version
java version "1.6.0_75"
Java(TM) SE Runtime Environment (build 1.6.0_75-b13)
Java HotSpot(TM) 64-Bit Server VM (build 20.75-b01, mixed mode)
```

##参考
[Javaストアド・プロシージャの手順](https://docs.oracle.com/cd/E49329_01/java.121/b72466/chfive.htm#BABGEJDI)
Laravel on Dokkuを構築する

# 環境

VPSサービスはCloudGarageを使用。
OSはUbuntu 16.04。
本当はCentOSの方が慣れてるがDokkuはDebian系推奨のようなので。
作業はrootユーザで行う。
手元のLaravel開発環境は構築済とする。

# Dokkuインストール

http://dokku.viewdocs.io/dokku/

公式の通りにコマンドを叩く。

```bash
wget https://raw.githubusercontent.com/dokku/dokku/v0.12.4/bootstrap.sh;
DOKKU_TAG=v0.12.4 bash bootstrap.sh
Preparing to install v0.12.4 from https://github.com/dokku/dokku.git...
This installation script requires that you have a hostname set for the instance. Please set a hostname for 127.0.0.1 in your /etc/hosts
```

早速エラー。
解決するにはVPSにドメインを割り当てた上で、/etc/hostnameを変更し、さらに/etc/hostsに追記する必要がある。
ドメイン割り当ては「example.com」と「*.example.com」をAレコードで登録する。
example.comは各自のドメインに置き換えて読んで欲しい。

https://ygkb.jp/3974
http://www.broculos.net/2015/12/installing-and-running-dokku-on.html

```diff:/etc/hostname
- default_name
+ example.com
```

```diff:/etc/hosts
127.0.0.1 localhost
+ 127.0.1.1 example.com
```

設定を反映させるためにrebootする。

```bash
reboot
```

reboot後、気を取り直してbootstrap.shを叩く。

```bash
DOKKU_TAG=v0.12.4 bash bootstrap.sh
```

今度は動いたはず。

インストール終わったら、自分のvpsにブラウザでアクセス。
するとDokkuの設定画面を確認。
公開鍵の設定をして`Use virtualhost naming for apps`にチェックを入れる(と書いたが、ここはお好みで)。
Finish Setupをクリック。

# アプリ作成

http://dokku.viewdocs.io/dokku/deployment/application-deployment/

dokkuコマンドはherokuと違ってVPS側で叩く。

```bash
dokku apps:create <アプリ名>
```

PosgreSQL設置。

```bash
dokku plugin:install https://github.com/dokku/dokku-postgres.git
dokku postgres:create <DB名>
```

PostgreSQLとアプリをつなげる。

```bash
dokku postgres:link <DB名> <アプリ名>
```

# Procfile, .buiidpacks作成
http://dokku.viewdocs.io/dokku/deployment/methods/buildpacks/#using-multiple-buildpacks

プロジェクトルートに.buildpacksを作成。

```:.buildpacks
https://github.com/heroku/heroku-buildpack-nodejs.git
https://github.com/heroku/heroku-buildpack-php.git
```

同じくルートにProcfile作成。

```:Procfile
web: vendor/bin/heroku-php-apache2 public
```

# 環境変数設定
## シークレットキー

まずはシークレットキー。

```bash
php artisan key:generate --show
<シークレットキー>
```

シークレットキーをコピーしておく。

```bash
dokku config:set <アプリ名> APP_KEY=<シークレットキー>
```

## DB接続設定

```bash
dokku config:get <アプリ名> DATABASE_URL
postgres://<ユーザ名>:<パスワード>@<ホスト>:5432/<DB名>
```

```bash
dokku config:set <アプリ名> DB_CONNECTION=pgsql DB_HOST=<ホスト> DB_DATABASE=<DB名> DB_USERNAME=<ユーザ名> DB_PASSWORD=<パスワード>
```

# デプロイ
```bash
git remote add dokku dokku@example.com:<アプリ名>
git add -A
git commit -m "initial"
git push -u dokku master
```

DBマイグレートもしておく。

```bash
dokku run <アプリ名> php artisan migrate
```

# 参考
http://dokku.viewdocs.io/dokku/
https://ygkb.jp/3974
http://www.broculos.net/2015/12/installing-and-running-dokku-on.html
またまた Hibernate Validator でコケたメモ - @NotBlank編 -

# @&#x200b;NotBlank is 何
null, 空文字に加えて「スペースのみ」も弾くバリデーション。

# なんでコケたの？
**あいつ半角スペースしか見てねえ**。

# どういうこと？
どうやら @&#x200b;NotBlank のバリデータ、実装に String#trim() を使っている様子。
String#trim() は両端から見てスペースを詰めていき String#substring(int, int) で中身だけ切り離して返すものだが、この時ベタ打ち char の半角スペースを基準に、それ以下のコードのものを全て詰めるという実装である。
つまり**全角スペースは通す**。死ぬ。

# どうすればいいの？
**Apache Commons 使おう**。みんな大好き StringUtils だ (前もこんなんじゃなかったか？) 。

StringUtils.isBlank(CharSequence) (lang3 の方だぞ！) の Javadoc には whitespace の定義として Character.isWhitespace(char) を使用していると明記されている。
Character.isWhitespace(char) は改行やタブ等に加え、スペースとされるものの定義に Unicode の SEPARATOR 三種 (SPACE_SEPARATOR, LINE_SEPARATOR, PARAGRAPH_SEPARATOR - ただし、ノンブレークスペースは除外されている) を使っている。大抵のものは弾いてくれるはずだ。

同様の理由で、 trim したくなったときも StringUtils.strip を使ったほうが安全なことがある[^1]。

# でも Commons って Annotation あったっけ？
ない。さっくり書こう。
前もやったので、もしも必要なら@&#x200b;Email の時の記事を参照してほしい。[^2]

# 最後に一言
Hibernate Validatior は意外と地雷が多いぞ！ 気をつけろ。

[^1]: 正直 xxxUtils ってあまり勧めたくない。 しかし Java には拡張メソッドないししょうがない。オーバーライドすることもできないのはほんとにつらい……
[^2]: https://qiita.com/wingsys/items/1cb9e1175a9c542b2860
強引に広めたいQiitaのGUNDAMまわり

息抜きからの〜

とりあえず
@Ueno1969さんの投稿くらいしか見つからないので拾ってみる

"翔べ!ガンダム"をrubyで書いてみた
https://qiita.com/Ueno1969/items/e37a83a6518ad99fea14
Jetson TX1でPython ImGui bindingを使ってみる


# 環境
- JetPack 3.2
- Python3.5
- pyimgui 0.1.0
- PyOpenGL 3.1.0
- glfw 1.6.0

# インストール
```
$ source "Your path to virtualenv"/bin/activate
$ pip install imgui
$ pip install glfw
$ pip install pyopengl
```

# 動作確認
```
$ git clone https://github.com/swistakm/pyimgui.git
$ python pyimgui/doc/examples/glfw3.py
```

![pyimgui.png](https://qiita-image-store.s3.amazonaws.com/0/109483/c27c88bc-dcb7-0407-1652-334a7fc620b5.png)
「エキサイト 画像検索」から画像をスクレイピング in Python

## 概要
「エキサイト 画像検索」から画像のスクレイピングを行います.

## 1. はじめに
情報解析を目的として「エキサイト 画像検索」から画像のスクレイピングを行います.

## 2. エキサイト・サービス利用規約 （抜粋）
> 第４章　ユーザーの責務
>> 18条（禁止事項）
>>> １．当社は、ユーザーに以下の各号の何れかに該当する事由が生じた場合、ユーザーに対して事前に通知することなく本サービスの利用を停止もしくは登録情報を削除し、又は提供している本サービスを差止め、以後本サービスの利用をお断りすることがあります。なお、停止期間又は一時停止期間も、利用期間に含まれるものとします。
>>>> （２２）他の登録ユーザーのページを閲覧可能とするためのツール等、当社が認めていない非正規のツールもしくは機能を開発し、又はこれを使用する行為。
>>>> （２７）当社が定める一定のデータ容量以上のデータを、本サービスを通じて送信する行為。
>>>> （３６）その他、当社が不適切と判断する行為。

出典：[Excite エキサイト](https://info.excite.co.jp/top/agreement.html)（2018/04/22）

## 3. 著作権法（抜粋）
> 第二章　著作者の権利
>> 第三節　権利の内容
>>> 第五款　著作権の制限
>>> （私的使用のための複製）
>>>> 第四十七条の七　著作物は、電子計算機による情報解析（多数の著作物その他の大量の情報から、当該情報を構成する言語、音、影像その他の要素に係る情報を抽出し、比較、分類その他の統計的な解析を行うことをいう。以下この条において同じ。）を行うことを目的とする場合には、必要と認められる限度において、記録媒体への記録又は翻案（これにより創作した二次的著作物の記録を含む。）を行うことができる。ただし、情報解析を行う者の用に供するために作成されたデータベースの著作物については、この限りでない。
>>>> （電子計算機における著作物の利用に伴う複製）

出典：[電子政府の総合窓口e-Gov イーガブ](http://elaws.e-gov.go.jp/search/elawsSearch/elaws_search/lsg0500/detail?lawId=345AC0000000048&openerCode=1)（2018/04/22）

## 4. 実行環境
- mac os 10.13.3  
- anaconda3-5.1.0

## 5. ディレクリ構成
```
./
├── data
│   └── keywords.txt
├── download_image.py
└── image
```

## 6. プログラム
download_image.py

## 7. 実行手順
1. git clone

```
$ git clone https://github.com/Doarakko/scraping
$ cd excite-image-scraping
```
2. keywords.txt に検索するキーワードを入力

```txt:keywords.txt
りんご,apple
オレンジ,orange
```

3. ダウンロードする画像の枚数を入力

```python:download_image.py
N = 60
```

4. スクレイピング

```
$ python download_image.py
```
```
./image/
├── apple
│   ├── apple0001.jpg
│   ├── apple0002.jpg
│   ├── apple0003.jpg
│   ├── apple0004.jpg
│   ├── apple0005.jpg
│   ├── apple0006.jpg
│   ├── apple0007.jpg
│   ├── apple0008.jpg
│   ├── apple0009.jpg
│   ├── apple0010.jpg
│   ├── apple0012.jpg
│   ├── apple0013.jpg
│   ├── apple0014.jpg
│   ├── apple0015.jpg
│   ├── apple0016.jpg
│   ├── apple0017.jpg
│   ├── apple0018.jpg
│   ├── apple0019.jpg
│   └── apple0020.jpg
└── orange
    ├── orange0001.jpg
    ├── orange0002.jpg
    ├── orange0003.jpg
    ├── orange0004.jpg
    ├── orange0005.jpg
    ├── orange0006.jpg
    ├── orange0007.jpg
    ├── orange0008.jpg
    ├── orange0009.jpg
    ├── orange0010.jpg
    ├── orange0011.jpg
    ├── orange0012.jpg
    ├── orange0013.jpg
    ├── orange0014.jpg
    ├── orange0015.jpg
    ├── orange0016.jpg
    ├── orange0017.jpg
    ├── orange0018.jpg
    └── orange0020.jpg
```

## 8. おわりに
yeah!
四流女子大学生がRaspberry Piに手を出してみた[買い物編その２][カメラ設定編]

前回の投稿
[四流女子大学生がRaspberry Piに手を出してみた[設定編]](https://qiita.com/starrysky51/items/8b34be0e0bba25c91f44)

# あれを買っていなかった

監視カメラを作ろうとラスパイを始めたのに、まだカメラモジュールを買っていませんでした。。。
あと、ラズパイ本体を入れるケースが欲しくなり、再びアキバに買いに行くことにしました！

# いざ、秋葉原へ出陣！

ということで、アキバに来ました
行ったお店は[買い物編](https://qiita.com/starrysky51/items/c951e2f3fa1041bd0042#%E3%81%A7%E3%81%AF%E6%97%A9%E9%80%9F%E8%B2%B7%E3%81%84%E7%89%A9%E3%81%B8go)と同じです！

まずは、カメラです。やはり、お店によってお値段にかなり差があります。。。ラズパイのカメラモジュールには全部で３種類ありました。

- 500万画素
- 800万画素
- 赤外線カメラ

です。赤外線カメラは暗いところで撮る用なので、今回は買いませんでした。500万画素と800万画素では値段が1000円ほど違います。試しに安いほうを買ってみたのですが、特に問題がなく使えたので、特にこだわりがなければ500万画素のやすいほうでいいと思います！

次にケースです。ケースは種類がたくさんありました。私の場合、ラズパイにカメラモジュールを取り付けるので、いい感じにカメラが入るケースを探していました。ほとんどがカメラモジュールが外に出るタイプだったのですが、１つだけケースの中に入るタイプのものが売っていました！



これは千石電商さんで販売していたものです！中身も見やすくて、また、コンパクトでいい感じです！

今回のお買い物は以上です！

# カメラ取り付け&カメラ有効化

## カメラ取り付け
まずは、カメラモジュールをラズパイ本体に取り付けます！取り付け方はめちゃくちゃ簡単です！！

参考リンク：[Raspberry Pi B+のカメラモジュールをセットアップしてみる](https://ttbbsky.net/raspberry-pi-b%E3%81%AE%E3%82%AB%E3%83%A1%E3%83%A9%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%82%92%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B/)(このサイトめちゃくちゃわかりやすいです、、、)

取り付けるとこんな感じ！
![IMG_1333.JPG](https://qiita-image-store.s3.amazonaws.com/0/249044/e4c47564-56eb-75ca-3841-1fedf86d803c.jpeg)

## いざ、設定！

カメラモジュールを取り付けたのでそれを有効化すべく、設定をしていきます！
まず、ラズパイを起動します。そして、「Menu<設定<Raspberry Piの設定」を開き「インターフェース」を選択し、カメラを有効にしたら「OK」を押します。


![2018-04-21-200302_1184x624_scrot.png](https://qiita-image-store.s3.amazonaws.com/0/249044/6164fc26-66e4-40f8-f80e-8a3a6abd2f81.png)

これで設定は完了です！

# 撮影してみる

設定が完了したので、実際に撮影してみます！
まずは、普通に撮影してみましょう！まずはターミナルを開き、以下のコマンドを打ちます。

```
$ raspistill -o ファイル名.jpg
```

コマンドを打つと、画面上に5秒ほどプレビューが表示されてそのあと撮影されます。とれた写真はこちら！
![pen.jpg](https://qiita-image-store.s3.amazonaws.com/0/249044/60aa8e7a-e05c-c715-3374-d4bc0a32cb11.jpeg)

きれいに撮れてますね♬次は好きなタイミングで撮影してみます。次のコマンドを打ちます。

```
$ raspistill -o ファイル名.jpg -k
```

このコマンドを打つと画面上にプレビューが表示されます！この状態でEnterキーを叩くと撮影されるはずなのですが、なぜか2回叩かないと撮影されませんでした汗）））

撮れた写真はこちら！
![pen2.jpg](https://qiita-image-store.s3.amazonaws.com/0/249044/91483043-e3d6-12b2-fc6b-e06dc68fd0f8.jpeg)

コマンドからの撮影は非常に簡単でした！！オプションについては以下を参照してください！

|オプション|使い方|説明|
|:--|:--|:--:|
|o|`-o filename.jpg`|保存するファイル名を指定します。|
|k|`-k`|任意のタイミングで撮影します。|

# (おまけ)スクショについて

最後にスクリーンショットについて説明します。スクリーンショットを撮るときは`scrot`を使います！インストールは

```
$ sudo apt-get install scrot
```

これで終わりです。コマンドについては以下のようになっています！

```
# 叩いた瞬間に撮る
$ scrot
# 指定した秒数分遅らせて撮る
$ scrot -d 秒数
# ウィンドウを指定して撮る
$ scrot -s
```

わたしはこれを使っています。とても簡単でおすすめです！


# 感想
カメラ設定はラズパイの初期設定よりも簡単だった気がします。こんな超初心者の私でもここまでできました！ターミナルを使ったりとより一層やってる感がましてきててなんだか楽しくなってきました。(笑)これからもがんばっていきたいです！
p.s.
ペンギンっていいですよね。。。
Laravelのカラム作成で使えるデータ型

Laravelでカラムを作る際に使えるデータ型がわからなかったので、よく使いそうなものを自分用にメモ

- increments('id') ... 「符号なしINT」を使用した自動増分ID（主キー）
- binary('カラム名') ...  バイナリデータカラム
- boolean('カラム名') ... 真偽値カラム
- char('カラム名', 長さ) ... 長さを指定する文字列カラム
- date('カラム名') ... 日付カラム
- time('カラム名') ... 時間カラム
- dateTime(カラム名) ... 日時カラム
- double('カラム名', 桁数, 小数点以下桁数) ... ○桁で小数点以下×桁の小数カラム
- enum('カラム名', ['定数', '定数']) ... ENUMカラム
- integer('カラム名') ... 数値データカラム
- json('カラム名') ... JSONフィールドカラム
- timestamp('カラム名') ... TIMESTAMPカラム
- timestamps() ... created_atとupdate_atカラム
- nullableTimestamps() ... NULL値を許す以外、timestamps()と同じ
- string('カラム名') ... VARCHARカラム
- string('カラム名', 長さ) ... 長さ指定のVARCHARカラム
- text('カラム名') ... TEXTカラム
Python命名規則一覧

| 対象              |ルール                                  | 例                   |
|:----------------:|:--------------------------------------:|:--------------------:|
| パッケージ      | 全小文字 なるべく短くアンダースコア非推奨    | tqdm, requests ...  |
| モジュール      | 全小文字 なるべく短くアンダースコア可    | sys, os,...         |
| クラス          | 最初大文字 + 大文字区切り| MyFavoriteClass     |
| 例外            | 最初大文字 + 大文字区切り| MyFuckingError  |
| 型変数         | 最初大文字 + 大文字区切り | MyFavoriteType      |
| メソッド       | 全小文字 + アンダースコア区切り| my_favorite_method  |
| 関数           | 全小文字 + アンダースコア区切り| my_favorite_funcion |
| 変数           | 全小文字 + アンダースコア区切り| my_favorite_instance|
| 定数           | **全大文字** + アンダースコア区切り| MY_FAVORITE_CONST   |
* ファイル名 = モジュール名+.py ( or .pyw)
* C/C++ のモジュールは**アンダースコア**で開始
* 自クラス内でのみ使用する内部変数と内部メソッドは**アンダースコア**で開始

[PEP8](http://pep8-ja.readthedocs.io/ja/latest/)で定められています。
CSS 上下中央揃え

# 縦方向の中央揃え

## line-height 一行
line-heightは行間のサイズ。
line-height - font-size/2(上下の行間高さ)
※複数行に対応できない
[line-height 行間について](https://saruwakakun.com/html-css/reference/line-height)
<img width="401" alt="スクリーンショット 2018-04-22 14.19.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/20635/849ad11a-03ad-c401-54b9-0253ddf7e932.png">



```slim

.wrapper01
  .box
    p ほげほげほげ
```
```scss
.wrapper01 {
  width: 400px;
  height: 400px;
  background: #ccc;
  .box {
    width: 200px;
    height: 200px;
    border: 1px solid black;
    p {
      font-size: 10px;
      line-height: 200px;
    }
  }
}

```
## vertical-aline
適用できるのは、インライン要素とテーブルセルです。ブロックレベル要素には適用できない
<img width="402" alt="スクリーンショット 2018-04-22 14.19.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/20635/1777d6ae-ecb5-b1b6-9f96-bf3c435a00d0.png">

```slim
.wrapper02
  .box
    p
     | ほげほげほげ
     br
     | ほげほげほげ
```

```scss
.wrapper02 {
  width: 400px;
  height: 400px;
  background-color: #ccc;
  .box {
    width: 200px;
    height: 200px;
    border: 1px solid black;
    display: table;
    p {
      font-size: 10px;
      display: table-cell;
      vertical-align: middle;
    }
  }
}

```


## flex
<img width="402" alt="スクリーンショット 2018-04-22 14.19.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/20635/57b8cb13-1b14-e7b5-5bbd-85d28509977e.png">

```slim
.wrapper03
  .box
    p
     | ほげほげほげ
     br
     | ほげほげほげ
```
```scss

.wrapper03 {
  width: 400px;
  height: 400px;
  background-color: #ccc;
  .box {
    width: 200px;
    height: 200px;
    border: 1px solid black;
    display: flex;
    align-items: center;
    p {
      font-size: 10px;
    }
  }
}
```

#コメント
上下中央揃えは、flexで。flexは素晴らしい。
Undo/Redo実装の考え方と実例

# 概要
## Undo/Redoのあるなしで作業効率が全然違う
GUIツールを使って作業する人からUndo/Redo実装を欲しがられる確率は100%です。
人間なので誰でも操作ミスはしますし、「あっ間違えちゃったUndo！」ができないとメチャクチャ不便なんです。Undoすら間違えるのでRedoも当然欲しい。もはやこれが無いとGUIツールは使ってもらえないレベル、存在価値がゼロに等しいです。

## 言語によらない考え方
C++、C#、JavaScript、その他どんな言語であっても実装するときの考え方は変わりません。今回はWeb動作させやすいJavaScriptで記載します。

# 実装前のサンプル
以下3つの操作とグループ化の概念のある状態をサンプルとします。

[サンプル](https://jsfiddle.net/oo3rd2mh/56/)

- ボタンから要素の「追加」ができる
- ボタンから要素の「削除」ができる（矩形選択で一括削除）
- 要素をドラッグ操作で「移動」することができる（矩形選択で一括移動）

この3つ全てにUndo/Redoを追加してみます。

# 実装
## Undo/Redoを構成する要素
- 1操作を「コマンド」という概念で扱い、線形コンテナ（配列など）に積んで記録していく。次にコマンドを積む予定のコンテナ内の位置を「インデックス」として保持する。
- 新規コマンドを記録する際は、インデックスから後ろのコンテナ内容をクリアしてから新規コマンドをコンテナに積み、インデックスを1つ進める。
- Undoでインデックスを1つ戻す、Redoで1つ進める。
- インデックスが動くたびに指していたコマンド内容を実行する。進める時（Do/Redo）と戻す時（Undo）の2実装が必要。

これらを満たすことでUndo/Redoの実装となります。
今回は「追加」「削除」「移動」の3種類の実装と、グループ化を実装します。

## 実装するコマンド一覧
- 追加コマンド
    - Do: 所定のパラメータをバックアップし、そのパラメータで要素を追加する
    - Undo: 要素を削除する
- 削除コマンド
    - Do: 現在のパラメータをバックアップし、要素を削除する
    - Undo: バックアップしたパラメータで要素を追加する
- 移動コマンド
    - Do: 要素の持つ現在のパラメータをバックアップ保存した後、所定のパラメータで書き換える
    - Undo: 要素の持つパラメータをバックアップ保存されたパラメータで書き換える
- コマンドグループ
    - コマンドをコンテナで持つ
    - コマンドグループ自体も1コマンドとして扱える

# 結果
## Undo/Redoができるようになりました
[実装結果](https://jsfiddle.net/d11t8sme/95/)

上部に「Undo」「Redo」ボタンが増えました。
押すことでUndo/Redoが実行されます。

## 説明
コマンドを記録する、という内容を RecordCommand メソッドとしてまとめました。
引数は「コマンド名」「パラメータ」「Do実装」「Undo実装」です。
Do/Undo実装では渡されたパラメータに応じた操作しか行いません。

- 追加/削除コマンド
    - 追加/削除されるときに位置情報もパラメータに渡すことで、Undo/Redo実行時に位置が復元できるようになっています。
- 移動コマンド
    - 移動開始処理（start）に移動前の位置情報を保存し、移動終了処理（stop）に移動前と移動後の位置情報両方をパラメータに渡しました。
    - 移動中処理（drag）は呼ばれる回数が非常に多いので、この中で RecordCommand をするのはオススメできません。
- コマンドグループ
    - RecordCommand を StartGroupRecording/FinishGroupRecording メソッドで囲むことで、囲まれた RecordCommand はグループ化されます。
    - このサンプルでは、選択中のものを一括操作できる削除コマンドと移動コマンドを囲みました。

# 応用する
今回は実例はありませんが、Undo/Redo実装から次の機能も実装できるようになります。
## ヒストリー機能
コンテナに積まれているコマンド名を一覧表示すると、そのままヒストリー機能になります。
アーティストの方は特に欲しがります。
## 編集内容に変更があるかどうか（変更があったら閉じるときに確認ダイアログなど）
コンテナに何か積まれていたら変更あり、そうでなければ変更なしです。

# 今回実装しなかったが必要そうなもの
## グループのグループ
StartGroupRecording でグループ情報をスタックにpush、FinishGroupRecording でスタックからpopするような実装をすると、StartGroupRecording/FinishGroupRecordingを入れ子で呼べるようになります。
## コマンド記録の無効化
ファイル保存された編集内容を読み込む際など、一括で大量のコマンド操作を行う間はコマンド記録を無効化するべきです。
[備忘録]自作コードトレース履歴　クラス～メソッド

TextView

	画面にテキストを表示するためのクラス(ウィジェット)
	※ウィジェットとは機能のような意味合い

-------------------------------

SimpleDateFormat

	日付のフォーマットを指定可能なクラス
	今回の使用形式は"kk:mm:ss"→時:分:秒

-------------------------------

Timer

	バックグラウンドでタスクをスケジュールするクラス

-------------------------------

TimerTask

	Timerによる繰り返しを実行するようにスケジュールするタスクの機能をもつクラス

-------------------------------

DBManager

	データベースの接続、使用を出来るようにするクラス

-------------------------------

ArrayList

	Listを実装したクラス
	大きさが決まっておらず、必要な分だけデータを格納することが出来る

-------------------------------

setContentView

	アクティビティ上にViewを表示するメソッド
	今回の使い方は、画面の初期表示の状態をこのメソッドを使用して指定している。
Windowsで作成した日本語を含むファイルをLinuxで解凍する場合の対応

##シナリオ

Windows上（cp932）でファイル名「ラインハルトの旗艦.txt」を「text.zip」という名前で圧縮し、Linux（utf8）上にて展開する。


##unzipで解凍

オプションなしでunzipを実行するとファイル名が文字化けする。

```
$ unzip text.zip
Archive:  text.zip
 extracting: text/ГЙГCГУГnГЛГgВtК°Кq.txt
```


-I、-Oオプションでunzipを実行するとファイル名がutf8に変換される

```
$ unzip -I utf8 -O cp932 text.zip
Archive:  text.zip
 extracting: text/ラインハルトの旗艦.txt
```

オプションの意味は以下。unzip --help（UnZip 6.00 of 20 April 2009）より。

```
  -O CHARSET  specify a character encoding for DOS, Windows and OS/2 archives
  -I CHARSET  specify a character encoding for UNIX and other archives
```

##ファイルの文字コード変換

上記の方法では、ファイルの中身はUTF8に変換されない。

```
$ cat text/ラインハルトの旗艦.txt
u
 q
  g
```

iconvにてファイルの内部をutf8に変換する。

```
$ iconv -f cp932 -t UTF-8 ラインハルトの旗艦.txt
ブリュンヒルト
```

上記では標準出力となるが、-oオプションでファイルへ上書き保存もできる。

```
$ iconv -f cp932 -t UTF-8 ラインハルトの旗艦.txt -o ラインハルトの旗艦.txt
$ cat ラインハルトの旗艦.txt
ブリュンヒルト
```

##改行コードの変換

さらに改行コードがCRLFの場合はLFに変更する必要がある。

```
$ file ラインハルトの旗艦.txt
ラインハルトの旗艦.txt: UTF-8 Unicode text, with CRLF line terminators
```

いろいろ方法があるが以下ではsedで変換する方法。

```
$ sed -i -e 's/\r//g' ラインハルトの旗艦.txt
$ file ラインハルトの旗艦.txt
ラインハルトの旗艦.txt: UTF-8 Unicode text
```