OmniAICreator/Qiita-1.07M huggingface dataset:
PyCharmによるパッケージの追加方法

初心者の方でも分かりやすく記載されていると思います。

#動作環境
windows7
pycharm-community-2016.1.4
python-2.7.4

#方法
PyCharmを立ち上げると、初期画面が出てきます。

![Top画面.PNG](https://qiita-image-store.s3.amazonaws.com/0/139203/05f896e2-e1d6-82d3-0b6c-c990fc453dab.png)

左上のFileをクリックします。

![File.png](https://qiita-image-store.s3.amazonaws.com/0/139203/a8dc6fe1-c015-2571-b90c-02133eebcb1e.png)

Default Settings...をクリックします。

![Default_Setting.PNG](https://qiita-image-store.s3.amazonaws.com/0/139203/87c6b3bf-6818-50f9-99ff-c7376f50e801.png)

すると、上記のようなページが出てきます。
そこで、Project Interpreter の設定(▽)をクリックし、自分のインストールしたpythonを選びましょう。(この段階でクッリク出来ない、pythonをインストールしたのに表示されていないなどの現象が起こる人は、pathの設定が出来ていないと思います。もう一度path設定の方を確認してみてください。)

![Pythonバージョン.PNG](https://qiita-image-store.s3.amazonaws.com/0/139203/c1d3e4fd-e1e6-023b-3bad-f3957fdab90a.png)

Package, Version, Latestの表が出てきていると思います。
これらが今までにインストールしたパッケージになります。
これから新しいパッケージを追加していきます。
右端にある緑色の＋ボタンをクリックしてください。

![Install.PNG](https://qiita-image-store.s3.amazonaws.com/0/139203/f46910b1-1bed-61c7-6894-c2b43ddc60c4.png)

すると、上記のようなページが出てきます。
ここまでくれば、パッケージのインストールは楽勝です。
一番上にある検索マーク欄に追加したいパッケージ名を書き込みます。
(例：chainerのインストール)

![Chainer.PNG](https://qiita-image-store.s3.amazonaws.com/0/139203/074381d0-d436-d05b-9230-4e2397f3b928.png)

出てきた候補の中から、chainerを選択して下方にあるInstall Packageボタンをクリックすれば完了です。

windows環境でpythonを扱うのはパッケージインストールがめんどくさい印象でしたが、PyCharmを使うことで用意にパッケージをインストールすることが出来ます。

#ひとこと
Unix環境だととても便利なpythonですが、windows環境でも大体はサポートされてきましたね。(^_^)
Windowsユーザが、Dockerを使おうとすると混乱するね。

----------------------------------------------------------------
(2016/10/21 追記） 本記事の内容が古くなりましたので、下記のページをお勧めします。

「WindowsのDocker（コンテナ）対応、正しく理解できていますか？」
http://www.atmarkit.co.jp/ait/articles/1610/24/news014.html

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


DockerのWindows対応が複数存在し、混乱しがちなので、整理してみた。

# １. Docker Engine（元祖）

Linux Container on Linux OS

Linux OSは、VMでも物理でもどちらでもOK。もちろんWindows系は非対応。

https://docs.docker.com/engine/understanding-docker/

LinuxOSをコンテナで利用できるが、WindowsOSは一切動かない。

# ２. Windows Machine上のLinux VMでDocker

Linux Container on Linux VM on Windows Machine

前述１.の応用系。Oracle VM Virtual Boxなどを利用して、Linux VMを用意してDockerを動作させる。

Docker Toolboxはこのパターン（Toolboxをインストールすると、Virtual Boxも同時にインストールされる）

https://docs.docker.com/toolbox/overview/

通常、VM on VMは不可なので、Windows Machine限定(Windows VMには非対応）になる。
　⇒ AWS EC2上のWindows Server（VM）では実現できない。

LinuxOSをコンテナ利用できるが、WindowsOSをコンテナとして起動する事は出来ない。

# ３. Docker for Windows

Linux Container on (Hyper-V) on Windows Machine

前述２.の応用で、中間にHyper-Vを利用。

Setup後は、Hyper-Vを意識する必要はなく、Windows上から直接Dockerを操作できる。

https://docs.docker.com/docker-for-windows/

2016/9 現在、Windows 10 のみ対応。今後、対応OSを増やしていく予定とのこと。

こちらも、LinuxOSをコンテナ利用できるが、WindowsOSをコンテナとして起動する事は出来ない。

# ４. Windows Container on Windows Server
Windows Container on Windows Machine
Windows Container on (Hyper-V) on Windows Machine

Microsoftが Server OSに、Container機能を組み込み。名前の通り、Windowsコンテナしか動かない。
Windows Container Typesが２種（Windows Server Containers, Hyper-V Containers)ある。

https://msdn.microsoft.com/en-us/virtualization/windowscontainers/about/about_overview

2016/9 現在、Windows Server 2016(Technical Preview 5)のみ対応。ちなみにAuzre上に、マシンイメージが公開されてる。

Docker HUBとの相互運用などLinux系に歩み寄っていて、将来的にはLinuxコンテナも動作するようになる（かも？）。


# ５． まとめ
現状では、WindowsとLinuxの相互運用は厳しい。

Linux/Windowsのどちらのコンテナを使いたいか？で、選択肢が絞り込まれる。

Linuxコンテナを使いたい場合は、２）または３）の構成。

手元にWindows 10のマシンがあるなら、３）Docker for windowsが簡単だろう。

それ以外のOS（Win7など）の場合は、２）のケースで、Linux VMを用意する必要がある（Docker Toolbox使うか、自分でLinux VMを用意）。

なお、VMware Player上のゲストOSでWindows10を用意し、そこで Docker for windowsを動かそうとした猛者がいましたが、動作しなかったとの事例を聞いた（Hyper-VとVMware Playerの共存に難あり？）

Windowsコンテナを使いたい場合は、現状では４）の選択のみ。Windows Server 2016が必要になる。
Pandasをつかって、データフレームの指定行だけをエクセルファイルに書きこむ

#動作環境
python-2.7.4
windows7
#方法

```python:test.py
#coding:utf-8
#pandasをpdとしてインポート
import pandas as pd
#読み込むエクセルファイルのパス
input_path = "input.xlsx"
#書き込むエクセルファイルのパス
output_path = "output.xlsx"

#pandasでエクセルファイルをデータフレーム型で読み取る
data = pd.read_excel(data_path, sheetname = 'Sheet1')
#指定行だけを選定(文字列一致の場合)
specified_line_data = data.where(data.Result.str.contains("文字列")).dropna(axis=0)
#指定行だけを選定(数値一致の場合はこちら)
#specified_line_data = data.where(data.Result == 数字).dropna(axis=0)
#pandasのモジュールであるExcelWriterを使用してエクセルに書き込む形式にする
writer = pd.ExcelWriter(output_path)
#エクセルファイルに書き込み
specified_line_data.to_excel(writer, sheet_name = 'output_data')
#書き込んだ情報を保存する
writer.save()
```

今回は、読み込みデータから指定行だけを別のエクセルファイルに書き込む方法をやってきました。
(具体的には、Result列の文字列が(”文字列”)に一致するものだけを抽出する)

(pandasでファイルを読み込むときは先頭行がヘッダーとして認識されてしまうことに注意しましょう。今回は、読み込みファイルの先頭行にはヘッダー情報(Test,Label,Result,Score,Class,Morpheme)を記載していたため、プログラム上でのヘッダー処理は行っていません。)
C > sizeof(int)とsizeof(int *) on 64bit machine > int*は8バイト / intは決まっていない

@Sally-E さんの[記事](http://qiita.com/Sally-E/items/263fba018762c893483d)で分からなかったint func()内の以下の処理が2となる理由。

```
num = sizeof(array)/sizeof(array[0]); 
```

これが2になるためには @shiracamus さんの[コメント](http://qiita.com/Sally-E/items/263fba018762c893483d#comment-f92264396a61f49d5176
)にあるように以下となる

- int *は8バイト
- int は4バイト

stackoverflowの記事を見つけた
http://stackoverflow.com/questions/20721294/size-of-int-and-sizeof-int-pointer-on-a-64-bit-machine

> answered Dec 21 '13 at 16:56
Rahul Tripathi
>
> Size of a pointer should be 8 byte on any 64-bit C/C++ compiler, but the same is not true for the size of int.

64bit OSではint *は8バイト固定だが、intは8固定とは限らない(OSの扱いやすいサイズになる)。

勉強になりました。
ITサービスマネージャー　2013年度　午後2 問1

#始めに
ＩＴサービスマネージャーの午後２の論文についてあれこれ書いてみようと思います
対象のシステムは[生命保険会社のシステム](http://qiita.com/triple4649/items/56d2b450f2b8b68bdfe5)をベースにしています

#問題文の解析
![ITサービスマネージャー2013-01.png](https://qiita-image-store.s3.amazonaws.com/0/136860/c857e48f-7c93-ce41-aa87-5c846b077318.png)
LaTeXによる執筆環境をrakeからnpmに移行したの巻

`npm`の `package.json` を使うと…

* `chokidar-cli` を使ってファイル変更を監視してコマンドを実行できる。
* `parallelshell` を使えば複数の並列ビルドも楽にできそう。
* なんといってもごちゃごちゃした設定が `package.json` だけで完結しそうで楽っぽい。
* `package.json` に書誌情報も書き込んでおける。

これをLaTeXによる執筆環境に持ってくると…

```package.json
{
  "name": "sample-paper",
  "version": "0.0.1",
  "description": "This is a sample paper.",
  "author": "Masayuki Higashino",
  "scripts": {
    "build:tex": "platex -kanji=utf8 main",
    "build:bib": "pbibtex -kanji=utf8 main",
    "build:dvi": "dvipdfmx main",
    "build": "npm run clean && npm run build:tex && npm run build:bib && npm run build:tex && npm run build:tex && npm run build:dvi",
    "build-dev": "npm run build:tex && npm run build:dvi",
    "watch:tex": "chokidar '*.tex' -c 'npm run build-dev'",
    "watch:bib": "chokidar '*.bib' -c 'npm run build-dev'",
    "watch": "parallelshell 'npm run watch:tex' 'npm run watch:bib'",
    "clean": "rm .DS_Store *.aux *.bbl *.blg *.dvi *.log; exit 0"
  },
  "devDependencies": {
    "chokidar-cli": "^1.2.0",
    "parallelshell": "^2.0.0"
  }
}
```

な感じ。

使い方は `package.json` をLaTeXのファイルとかのディレクトリに配置する。例えば下記のような感じ。

* `package.json`
* `main.tex`
* `main.bib`

必要なパッケージをインストールする。

```bash
$ npm install
```

ファイルを監視して変更があればコマンドを叩く。

```bash
$ npm run watch
```

提出用のPDFを生成する。

```bash
$ npm run build
```

わりと良い感じでは？
Quantum Chemistry - Particle in a Box

関連 http://qiita.com/7of9/items/d3a1799928734375f34f

CG分野で使われるSpherical Harmonics。自分の数値シミュレーション計算に用いたいと思い調べると、量子化学の講義にたどり着く。

短く分かりやすそうな159本のビデオを少しずつ消化中。

Quantum Chemistry - Particle in a Box
https://www.youtube.com/watch?v=uK60QAKooyM&index=16&list=PLm8ZSArAXicL3jKr_0nHHs5TwfhdkMFhh

- Boxの中の粒子についてみる
- エイチハットに対してヴィ(x)の定義が必要
  - ヴィ(x): potential energy
  - potential energyが高いと粒子は存在できない
- ピンクの式
  - xが0からエルの間ではヴィ(x)は0
  - xが範囲の外側ではヴィ(x)は無限大
  - とする
- 紫の式
  - https://www.youtube.com/watch?v=cUUFIk0ISuY&index=14&list=PLm8ZSArAXicL3jKr_0nHHs5TwfhdkMFhh
  - で出てきた式
  - エイチハットの定義を入れて黄色の式となる
- 黄色の式
  - xが0からエルの範囲ではヴィ(x)は0なので2項目が消える
  - 式を整理して水色の式が得られる
- 水色の式
  - 2階のP.D.Eで-2mE/ヘイチバー二乗を-beta^2と考えると
  - http://qiita.com/7of9/items/2f160d03d049d7d39090
  - にあるように、プサイ(x)はcosとsinの式となる
  - kは2mE/ヘイチバー二乗の√をとった値となる
- 紫の式
  - x<=0の時、potential energyヴィ(x)が無限大で粒子が存在できない
  - そのため粒子の存在と関係するプサイ(x)は0となる
  - x>=エルの時も同様にプサイ(x)は0となる
  - これらは「境界条件」という
- 緑の式
  - 左下のオレンジの式に対してx=0を代入したもの
  - cos(0)=1, sin(0)=0なので、式の値はAとなり、プサイ(x=0)=0からA=0が得られる
- 紫の式
  - 左下のオレンジの式に対してx=エルを代入したもの
  - A=0なのでBsin(kエル)であり、プサイ(x=l)=0から式の値=0
  - Bsin(kエル) = 0をsinの逆関数をとって kエル = sin^-1(0)
  - sin^-1(0)のあたいは n piでnは任意の整数
  - kエル = n piより、黄色の式 k = n pi / エルが得られる
  - nは整数 (太字Z @ 工学における特殊関数 p10)
- 水色の式
  - A = 0, k = n pi / エルと左下のオレンジの式より得られる
- オレンジの式
  - 左下オレンジの式 k = ...とk = n pi / エルが等号でつながる
  - 変形して紫の式が得られ
  - Enの定義が得られる
- nはquantum numberという
- 右側中段の水色の式のBという定数については、normalizationを用いることで求める(次回以降)
Quantum Chemistry - Interpreting the Wavefunction

関連 http://qiita.com/7of9/items/d3a1799928734375f34f

CG分野で使われるSpherical Harmonics。自分の数値シミュレーション計算に用いたいと思い調べると、量子化学の講義にたどり着く。

短く分かりやすそうな159本のビデオを少しずつ消化中。

Quantum Chemistry - Interpreting the Wavefunction
https://www.youtube.com/watch?v=9TfQUie_OTM&list=PLm8ZSArAXicL3jKr_0nHHs5TwfhdkMFhh&index=15

- wavefunctionの解釈
- 紫の図
  - プサイ(x): wavefunction
- ピンクの図、ピンクの式
  - プサイ(x)の二乗
  - 複素共役 プサイ*(x)とプサイ(x)の積
  - 確率密度関数となる
  - そのxに粒子が存在する確率を表す
- 黄色の式
  - 一般的にプサイ(x)は複素数である (太字Cは複素数 @ 工学における特殊関数 p10)
- 水色の式
  - Re: Real part. 複素数の実部
  - Im: Imaginary part. 複素数の虚部
  - プサイ(x) = Re(x) + iIm(x)に対して
  - 複素共役であるプサイ*(x) = Re(x) - iIm(x)
- オレンジの式
  - 水色の式を使って導出
  - (a + ib)(a - ib) = (a^2 - (-b^2)) = (a^2 + b^2)
- 緑色
  - wave functionの解釈には色々あるが、その中で重要なものとして
  - Born Interpretationがある
  - プサイ*(x) プサイ(x) は xとx+dxの範囲に粒子が存在する確率
  - 微小なdxに対して
- ピンクの式
  - プサイ*(x) プサイ(x)は粒子の存在確率なので、-無限大から+無限大で積分すると
  - 1になる
  - Normalization (規格化)という
  - Normalizationを使うことで式の中の定数を求めることができる (次回以降で紹介)
Quantum Chemistry - Eigenvalues and Eigenfunctions

関連 http://qiita.com/7of9/items/d3a1799928734375f34f

CG分野で使われるSpherical Harmonics。自分の数値シミュレーション計算に用いたいと思い調べると、量子化学の講義にたどり着く。

短く分かりやすそうな159本のビデオを少しずつ消化中。

Quantum Chemistry - Eigenvalues and Eigenfunctions
https://www.youtube.com/watch?v=cUUFIk0ISuY&list=PLm8ZSArAXicL3jKr_0nHHs5TwfhdkMFhh&index=14

- Eignevalues (固有値)
- Eignfunctions (固有関数)
- 緑の式
  - Eigenvalue function
  - ある関数にオペレータを作用させると、その関数に定数がかかった式になる時
  - Eigenvalue functionという
- ピンクの式, 黄色, 水色
  - Eigenfunctionとは黄色の関数 (fx(x))
  - Eigenvalueとは水色の定数 (omega)
- オレンジ
  - Eigenvalue problemでは、オーハット(オペレータ)が与えられた時
  - f(x)とomegaのセットを見つける
- 黄色の式
  - Schrodinger Equation(黄色の式)はEigenvalue problemである
  - http://qiita.com/7of9/items/e1d711685ac92f729fc9
  - そのためEigenvalue problemが重要
- 水色の式
  - Schrodinger Equationに対してエイチハットを定義する
  - エイチハット: ハミルトンオペレータ
  - エイチハットの定義により、緑の式(左下)となる
- 緑の式 (右上)
  -  ハミルトンオペレータの定義
  -  total energyと関連
- 紫の式、ピンクの式
  - kinetic energyとpotential energyと関連するオペレータ
  - 両者を足したのはtotal energy (E = T + V)
- その他、成分として出てくるオペレータ
  - momentum in x-directionがどうして(-ih l d/dx)なのかは未消化
角丸(cornerRadius)のUIImageViewにボーダー(border)をつけるExtension

# やりたいこと
角丸にしたUIImageViewに、ボーダーをつけたい場合、以下のような関数をつくります。

```
extension UIImageView {
  func cropAsCircleWithBorder(borderColor : UIColor, strokeWidth: CGFloat) {
    var radius = min(self.bounds.width, self.bounds.height)
    var drawingRect : CGRect = self.bounds
    drawingRect.size.width = radius
    drawingRect.origin.x = (self.bounds.size.width - radius) / 2
    drawingRect.size.height = radius
    drawingRect.origin.y = (self.bounds.size.height - radius) / 2

    radius /= 2

    var path = UIBezierPath(roundedRect: CGRectInset(drawingRect, strokeWidth/2, strokeWidth/2), cornerRadius: radius)
    let border = CAShapeLayer()
    border.fillColor = UIColor.clearColor().CGColor
    border.path = path.CGPath
    border.strokeColor = borderColor.CGColor
    border.lineWidth = strokeWidth
    self.layer.addSublayer(border)

    path = UIBezierPath(roundedRect: drawingRect, cornerRadius: radius)
    let mask = CAShapeLayer()
    mask.path = path.CGPath
    self.layer.mask = mask
  }
}
```

# つかいかた

```
imageView.cropAsCircleWithBorder(UIColor.whiteColor(), strokeWidth: 1)
```
Quantum Chemistry - Operators

関連 http://qiita.com/7of9/items/d3a1799928734375f34f

CG分野で使われるSpherical Harmonics。自分の数値シミュレーション計算に用いたいと思い調べると、量子化学の講義にたどり着く。

短く分かりやすそうな159本のビデオを少しずつ消化中。

Quantum Chemistry - Operators
https://www.youtube.com/watch?v=ktrJ-sqaaBs&index=13&list=PLm8ZSArAXicL3jKr_0nHHs5TwfhdkMFhh

- オペレーター (演算子)
- objectに作用して新しいobjectを生成する
- ピンクの式
  - オーハット
  - またはオーキャレット (caret)
  - caret : ^
- 紫の式
  - オペレータの例
  - d/dx
  - ∫
  - square root
  - 2
  - n乗
- 黄色の式
  - Linear Operators
  - 係数cnがかかった関数の合計に対するオペレータの作用は
  - それぞの項にオペレータの作用がかかったものの合計に同じ
  - (補足) supoerposition? (重ね合わせの原理)と関連あるかも
- 水色の式
  - 黄色の式の拡張としてsummationを使用
  - 係数ciがかかった関数のsummationに対するオペレータの作用は
  - それぞれの項にオペレータが作用したもののsummationと同じ
  - ここでCiは複素数 (Cの太字 @ 工学における特殊関数 p10)
- 緑の式
  - オペレータd/dxの例
  - こちらは項ごとにオペレータを作用できる
- 紫の式
  - square rootは項ごとにオペレータとして作用できない
- ピンク
  - classical propertiesはLinear, Quantum Mechanical Operatorsと関係する
- 黄色
  - 色々なオペレータの例
  - 中でも重要なのがH (ハミルトンオペレータ)
  - ハミルトンオペレータはTotal Energyと関係する
技術英語 > Working with pointers successfully requires a [two-pronged] strategy. / 2つのコピーは、将来きっと枝分かれすることになる

@ Code Complete (No. 10933 / 36077)

> Working with pointers successfully requires a <font color=red>two-pronged strategy</font>.

http://ejje.weblio.jp/content/two-pronged
> 2つの先を持つ

どういう2つかというと

- First, avoiding installing pointer errors in the first place
  - 最初からポインタエラーを入れない
- Second, detect pointer errors as soon after they are coded as possible.
  - コードにポインタエラーを入れた直後に検知する

<hr>
関連して思い出したのは

@ テスト駆動開発による組み込みプログラミング by James W. Grenningら
p66

> もちろん、あなたはテスト済みのコードをコピーするのはまったく安全だと思っているだろう。だが注意しよう。2つのコピーは、将来きっと<font color=red>枝分かれすることになる</font>。
CodeDeployで指定したGitHubリポジトリのコードをデプロイする(CLI編)


デプロイ自動化にむけてCLIからデプロイしてみる

```
$ aws deploy create-deployment \
  --application-name <name> \
  --deployment-group-name <group-name> \
  --github-location repository=<account>/<repos>,commitId=<SHA1>
```

リファレンス: [create-deployment — AWS CLI 1.10.60 Command Reference](http://docs.aws.amazon.com/cli/latest/reference/deploy/create-deployment.html)


commitId に指定する SHA1 は以下のワンライナーで取得できる

```
$ git show -s --format=%H
```

参考: [Git で現在チェックアウトしているコミットのID | そんなこと覚えてない](http://blog.eiel.info/blog/2014/09/04/git-revision/)

--description でブランチ名を入れておくと良いかもしれない
現在のブランチ名は以下で取得

```
$ git rev-parse --abbrev-ref HEAD
```

参考: [git current-branchで現在のブランチ名を返す - There's an echo in my head](http://ikm.hatenablog.jp/entry/2012/11/28/114146)
Storyboard上のUIViewをコードから使う

ググると、Storyboardで定義したViewControllerをコードから使う方法（↓こういうの）

```swift
let vc = storyboard.instantiateViewControllerWithIdentifier("someViewController") as! UIViewController
```

は出てくるが、UIViewを使う方法は出てこないので頭悩ませてた。けど、普通に**IBOutletとして接続できる**ことを忘れてた。

メンターに「疲れてますねー」って言われた。

![hoge.gif](https://qiita-image-store.s3.amazonaws.com/0/15144/58d718ee-5cc8-d571-fe62-1b6fa3f46253.gif)
三角形ができるかどうか判定する

#問題
棒の長さが3つ以上，複数値配列に与えられる.
その中から3本選び三角形を作成する.
作成した三角形のうち，最も長い周長を出力する.
三角形が作れる条件は
**最も長い棒の長さ＜他の2本の棒の長さ**
##考え方1 
全ての選び方を試して最も長いものを出力する.

``` ruby:
len=[2,3,4,5,10]
n=len.length
ans = "三角形は作れません"
#全ての数字の選び方を試す
for i in 0..n do 
  for j in i+1..n do
    for k in j+1..n do
      element =[len[i],len[j],len[k]].map(&:to_i)
      #3角形が作れる条件　最も長い棒の長さ＜他の2本の棒の長さ
      circumference = element.inject(:+)
      max = element.max
      rest = circumference-max
      if max < rest
        ans = circumference
      end
    end
  end
end

puts ans

```
 余談
上記のプログラムは配列の合計値を返すメソッドにinjectメソッドを用いているが，
ここをreduceにすると処理速度が若干速くなる．
[reduceとinjectの違い](http://magazine.rubyist.net/?0038-MapAndCollect#l9)
計測方法は[paiza.io](https://paiza.io/)内で[benchmark](http://docs.ruby-lang.org/ja/2.2.0/class/Benchmark.html#M_REALTIME)を用いて計測した．


```ruby:
require 'benchmark'

result = Benchmark.realtime do
  # 処理
end
puts " #{result}s"
```

##考え方2
周長が最も長い三角形は，なるべく長い棒たちを使った三角形である．
なので，配列を降順にソートし長い棒から順に3本使っていく．
一番長い棒`a[1]`,次に長い棒`a[2]`,その次に長い棒`a[3]`とする．
`a[2]`と`a[3]`の合計が一番長い棒`a[1]`よりも短い場合，
残りの棒を使ってもこれより短いので,次の場合を試す.
`a[2]`を一番長い棒として同様に進めていく．

```ruby:
len=[2,3,4,5,10]
circumference = "三角形は作れません"
#降順にソート
element = len.sort {|a, b| b.to_i <=> a.to_i } 
#3本ずつ使う
for i in 0..element.length-2 do
  if element[i].to_i<element[i+1].to_i+element[i+2].to_i
    circumference = element[i]+element[i+1]+element[i+2]
    break  #長いものから順にやってるためcircumferenceが更新された段階で抜ける
  end
end

puts circumference

```

##考え方３
三角形の成立条件の見方を変える.
三角形が成立するとき,
一番長い棒a[1],次に長い棒a[2],その次に長い棒a[3]，三角形の周長をCとする．
他の2辺の合計と最長の辺との差をdとすると
`(a[2]+a[3])-a[1] = d`
なので他の2辺の合計は
`a[2]+a[3]=a[1]+d`　式１
と表せる．
周長は
`C=a[1]＋a[2]+a[3]`
と表せるので,式１を代入すると
`C=a[1]＋a[1]+d`
`C=2a[1]+d`
と表せる.
これより三角形が成立する時
周長は三角形のうちの最大長の2倍よりも大きいことがわかる．
これをコードに起こす
pod installが終わらないときの対処方法


## 症状
以下のような状態で，CocoaPodsでpod installがいつまで経っても終わらない．

>$ pod install
> Setting up CocoaPods master repo


## 対処方法

以下のコマンドを実行

> pod repo remove master
> pod setup
> pod install


## 参考
["&#39;pod install&#39; takes forever" Stack Overflow](http://stackoverflow.com/questions/23755974/cocoapods-pod-install-takes-forever)
iOS10でプッシュ通知のアラートを表示してデバイストークンをStringで確保するまで


## はじめに

Xcode8でプッシュ通知の実装をしようとして怒られて頑張って、
なんとかデバイストークンを取得できたのでメモ&共有

`deviceToken.description` でいつもどおり `<hogehoge hogehoge ・・・>` みたいな感じで取得できるかと思いきや、上記で取得しようとすると `32 Bytes` で返ってきてしまうという...

## サンプルコード

今回はとりあえず、AppDelegateでやってみる

```swift:AppDelegate.swift
import UIKit
import UserNotifications  // もしかしたらいらないかも？？

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

   var window: UIWindow?
   
   func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
     
      // 通知使用許可アラート
      UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) {
         (granted, error) in
         
         // OKの場合
         if granted {
            application.registerForRemoteNotifications()
         }
      }
      return true
   }
   
   func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
      var token = String(format: "%@", deviceToken as CVarArg) as String
      let characterSet: CharacterSet = CharacterSet.init(charactersIn: "<>")
      token = token.trimmingCharacters(in: characterSet)
      token = token.replacingOccurrences(of: " ", with: "")
      print("deviceToken: \(token)")
   }
}
```

## 最後に

なんかiOS10 SDKからすごい変わっているようですが気のせいですかね。
すでに公開されている情報なのでヤバいことはないとは思いますが、
もし「 __おまえさぁ...__ 」的なことがあればご指摘お願い致します。

## 参考

https://forums.developer.apple.com/message/174097
[メモ] git の過去のコミットを取得して、それを元に新しいコミットを作る手順

# 概要
git を利用していて commit を積み重ねていった時に、昔のcommitのファイルが取得したくなる事がある。
revert したかったり、昔のリビジョンを元に、コードを修正したくなった時とか。

そんなとき、いつも手順を忘れるのでメモしておく。

# 手順
## 前提
- こういうファイルがあるとする。

```
$ cat test.txt 
v3
```

- コミット履歴はこんな感じ
 - ファイルの中身は コミットごとに v1,v2,v3 という感じで変更していった。

```
$ git log
commit aa995e5c736b45d724ebbc60fbef4f464dacc43f
Author: user <user@example.com>
Date:   Wed Aug 31 12:04:40 2016 +0900

    v3 commit

commit a7113d26f7f6d8ac129a14df0fb00b9d45d5aa17
Author: user <user@example.com>
Date:   Wed Aug 31 12:04:26 2016 +0900

    v2 commit

commit 1e733cf18d5880fde3a968e74e7e6216027dc370
Author: user <user@example.com>
Date:   Wed Aug 31 12:04:15 2016 +0900

    v1 commit
```

## 取得したい commit に移動
 - `v1 commit` の内容を取得したいのでハッシュ値 `1e733cf18d5880fde3a968e74e7e6216027dc370` へ移動

```
git checkout 1e733cf18d5880fde3a968e74e7e6216027dc370
Note: checking out '1e733cf18d5880fde3a968e74e7e6216027dc370'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b new_branch_name

HEAD is now at 1e733cf... v1 commit
```

- v1 commit の内容が取得できた

```
$ cat text.txt 
v1
```

## 最新のハッシュ値 へ戻る
 - 今回は `aa995e5c736b45d724ebbc60fbef4f464dacc43f` 

```
$  git reset aa995e5c736b45d724ebbc60fbef4f464dacc43f
Unstaged changes after reset:
M	text.txt
```

- ファイルの内容はそのまま

```
$ cat text.txt 
v1
```

- git diff で差分が見える

```
$ git diff
diff --git a/text.txt b/text.txt
index 29ef827..626799f 100644
--- a/text.txt
+++ b/text.txt
@@ -1 +1 @@
-v3
+v1
```

- git branch で master を checkout
 - no branch になっているため

```
$ git branch
* (no branch)
  master
$ git checkout master
M	text.txt
Switched to branch 'master'
```

## 完了
- 好きなように編集してコミットができる状態になったので、ソースを直して commit する。
fastlaneのdeliverでカテゴリが指定出来ない

#問題
fastlaneのdeliverでAppStoreカテゴリを指定してもiTunesConnectに反映されないことがある。
→`primary_category "Shopping"` で指定しても反映されない

#解決方法
カテゴリ名が間違っているだけでした・・・

[カテゴリ名リスト](https://github.com/fastlane/fastlane/blob/9c0494ef5e7d71afc51c73fe0b141b02e8991d9c/deliver/Reference.md#available-categories)より選択すれば良いそうです。
サブカテゴリに関しては記載がないですが恐らく[AppStore](https://itunes.apple.com/us/genre/ios/id36?mt=8)の表記と揃えればいけそうです。
一部のカテゴリは、先頭に`Apps.`が必要らしいです。。。

```
Book
Business
Apps.Catalogs
Education
Entertainment
Finance
Apps.Food_Drink
Games
Healthcare_Fitness
Lifestyle
Medical
Music
Navigation
News
Apps.Newsstand
Photography
Productivity
Reference
Apps.Shopping
SocialNetworking
Sports
Travel
Utilities
Weather
```

#記載例
```c:Deliverfile
# カテゴリ
primary_category "Apps.Shopping"
# primary_first_sub_category
# primary_second_sub_category

secondary_category "Games"
secondary_first_sub_category "Racing"
# secondary_second_sub_category
```
ラズパイ2をマックに直接LAN接続したらwifiアダプタいらずであっさり5分くらいでネットに繋がった

# 結論

サンダーボルト経由でケーブルをラズパイに直差ししたら、マックのインターネット共有の設定だけで ```ssh pi@raspberrypi.local ``` でsshできた

以下、うんちくのはじまりはじまり〜

# はじめに


我が家のネット環境は無線しかありません。
(あるっちゃあるけど、ルーターが玄関の天井付近にしかなく、ケーブル引くのしんどい)
ラズパイのGPIOで遊び始めたのですが、
マックにラズパイ直接接続してマックでコーディングしたいなーと思って調べると、
ネットワーク環境作るのいろいろ面倒そうだし、GPIOで遊ぶので物理的にもしんどいな〜とおもってました。

が、やってみたらあっというまに出来ちゃったお話です。
(この記事書いてる時間のほうが遥かに長かったw)

世の中ラズパイ3が発売され、wifiは標準でついているっていうのに、こんな古いノウハウ投稿しちゃってすみません。

# 前提

我が家の環境(今回作った環境)はこんな感じ
![home_network.png](https://qiita-image-store.s3.amazonaws.com/0/64758/748b3779-261e-ca7f-3afa-d9d601dc54d8.png)

これで手元でGPIOイジイジしながらマックでコーディング〜からのデプロイ && 実行タ〜ン！までがさくっと出来るようになるのです。

ラズパイはGPIOで遊ぶのが目的 && 小学生の息子たちに[scratch](https://www.raspberrypi.org/learning/robot-antenna/worksheet/)で遊んでもらってたので [RASPBIAN](https://www.raspberrypi.org/downloads/raspbian/) 使ってました。

# やったこと

## ラズパイにavahi-daemonいれようとした

DHCPなので繋ぎ直すたびにIP変わるかもしれないので名前でアクセスできたらいいよね。
そのためにはzeroconfという仕組みがあり、
linuxではavahiというソフトで実装されており、
macではBonjourで実装されているらしい

[こちら](http://independence-sys.net/main/?p=2116)で勉強させていただきました。
http://independence-sys.net/main/?p=2116

ネットワーク構築のためにネットワーク必要なのかい。。。
と思ってましたが、おもむろにラズパイのコンソールで ``` dpkg -l | grep avahi ``` 叩いてみたら、RASPBIANには最初から avahi-daemon が入ってました。
めでたしめでたし

## マックのインターネット共有

マックには標準でネットワークを共有する仕組みが入っていて、GUIであっさり出来ちゃいました

りんご > システム環境設定 > 共有

<img width="666" alt="スクリーンショット 2016-09-01 22.47.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/64758/f3c872ed-db81-16ef-d327-94fd5708efa4.png">
共有する経路: wifi
相手コンピューター: Thunderbold Ethernet
インターネット共有にチェックする

## ラズパイ再起動して確認

ふつうに ```sudo reboot``` して ```ping {某検索サイトのホスト}``` たたいたらping帰ってきた。

## マックからSSH

avahi 入ってた、ネットワークできた。って事でおもむろに ``` ssh pi@raspberrypi.local ``` 叩いてみたら、あっさりログイン出来ました。

めでたしめでたし

![IMG_1633.jpg](https://qiita-image-store.s3.amazonaws.com/0/64758/52c996b4-b0ee-7609-638e-862e040cef57.jpeg)
マックからLチカチカやってみたの絵


## ネットワーク周りの補足

ifconfigでネットワーク確認すると、 192.168.2.0/24 でネットワークができているようでした。
我が家のルーターのネットワークは192.168.0.0/24なので、いい感じにブリッジでネットワーク構築してくれているらしいです。

ちなみにマックは 192.168.2.1 ラズパイは 192.168.2.2 でした。


# まとめ

ネットで調べてめんどくさそ〜と思っても、とりあえずやってみると意外にあっさり出来ました。
手を動かすのってやっぱり大事ですね。
Advanced Custom Fields で エクスポートしたコードからインポート用のJSONを作る

# 背景

開発機ではACFを編集できるようにしていたが、ステージング環境では操作できないようにエクスポートコードを設置していた。

にも関わらず、開発機のDBを削除してしまった…とか。

# 解決方法

下記のようなPHPを用意する

```export_acf_json.php
<?php

require_once '../../../wp-config.php';

$array = [];

foreach (acf_get_local_field_groups() as $group)
{
    $group['fields'] = acf_get_local_fields($group['key']);
    $array[] = $group;
}

echo json_encode($array, JSON_PRETTY_PRINT);
```

`require_once '../../../wp-config.php'` は設置場所によって書き換えること。この場合、独自のプラグインを作っていたので、その中に設置していた

このPHPファイルにブラウザでアクセスすればJSONが出力される。ファイルに保存し、ACFの管理画面からJSONをインポートすればOK。

# 参考サイト

https://support.advancedcustomfields.com/forums/topic/anyway-to-store-the-json-from-php/

このスレッドの末尾にコードがあったが、そのままだとJSONの体を成していないので、ちょっと加工した
css modulesしてるコンポーネントのテストをしようとして死んだ

タイトルのとおりです。

結論だけ挙げると以下のコマンドで実行できるようになった。重要なのは`--require jsdom-global/register --require ignore-styles`の部分です。

```bash
$ mocha --require jsdom-global/register --require ignore-styles --compilers jsx:babel-register --recursive test
```

具体的には[insert-css](https://www.npmjs.com/package/insert-css)を使用しているパッケージを利用したコンポーネントを作て、そのテストをmochaで動かそうとしたらdocumentが無いと言われて死ぬ。
自分のコンポーネントが特にcss modulesみたいな事をしていなくても依存モジュールが行っているとdocumentにstyleを挿しに行こうとするのでだめ。
確認できてないけど[style-loader](https://www.npmjs.com/package/style-loader)とかでも同じ問題が起きるかもしれない。

最初はdocumentが無いならkarmaで動かせればいいやんという事で頑張ってたけどwebpackとの連携がうまくできず、あらためて冷静になってmochaで試行錯誤してたらいけた。
9/1　今日の学習内容～日付と時刻「Timeクラス」～

###今日の学習内容
***
今日はRubyで**日時を出力する方法**を学習しました。
Rubyで現在の日時を表すTimeオブジェクトを作るには、クラスメソッドである``now``を使います(-ω-)/
似たようなことを``new``メソッドでも出来るようです。
>「new」メソッドはTimeクラスのオブジェクトを作成して初期値として現在時刻が設定されているというのに対して「now」メソッドの場合は現在時刻を表すTimeクラスのオブジェクトを作成します。
[RubyLife  Timeクラス](http://www.rubylife.jp/ini/time_class/index1.html)より引用

変数``time``に``Time.now``を代入して``puts``すると、 
![paiza_io_7.png](https://qiita-image-store.s3.amazonaws.com/0/137880/2f9e36f5-4656-d32a-c88e-3caa1d4e5051.png)

↑このように現在の日時を取得できます。
``+0000``の部分はタイムゾーンを表しており、``+0000``は**[UTC(協定世界時)](https://ja.wikipedia.org/wiki/%E5%8D%94%E5%AE%9A%E4%B8%96%E7%95%8C%E6%99%82)**であることを示しています。（ちなみに、日本標準時（JST）は9時間早く、``+0900``です）


また、``strftime``メソッドを使うことで、日時の表示を**見やすく**変えられます(-ω-)/

![paiza_io_8.png](https://qiita-image-store.s3.amazonaws.com/0/137880/66f7ef35-ea83-20e4-9ad4-6e1c4f82eb3e.png)


今回使ってみた``%Y``、``%m``、``%d``、``%H``、``%M``、以外にもたくさんあるみたいなので、よく使うものは覚えておくといいかもしれませんね(´-ω-`)

>[strftime を憶えられない](http://qiita.com/annyamonnya/items/97c5cb0cfa414b3592d7#%E8%89%AF%E3%81%8F%E4%BD%BF%E3%81%86)

日本（東京）の標準時にするには、次のようにすれば出来るようです↓

![paiza_io_9.png](https://qiita-image-store.s3.amazonaws.com/0/137880/c796ba4f-cae6-bd8d-3142-51f7232263b2.png)

　
>[任意のタイムゾーンで出力する方法](http://qiita.com/semind/items/9614ded891d6154e9a06)より


　
###あとがき
***
今日はRubyでの日付と時刻の表示について学習していきました。
Railsアプリケーションでも頻繁に日付や時刻を扱う（[改訂３版基礎Ruby on Rails](https://www.amazon.co.jp/dp/4844338153)より）そうなので、しっかりと覚えておきたいと思います( ..)φメモメモ
ここまで目を通していただきありがとうございました(*- -)(*_ _)ペコリ

###参考にさせていただいたサイトなど
***
 - [改訂３版基礎Ruby on Rails](https://www.amazon.co.jp/dp/4844338153)
 - [Timeクラス(RubyLife)](http://www.rubylife.jp/ini/time_class/index1.html)
 
 - [UTC(wikipedia)](https://ja.wikipedia.org/wiki/%E5%8D%94%E5%AE%9A%E4%B8%96%E7%95%8C%E6%99%82)
 - [strftime を憶えられない]  (http://qiita.com/annyamonnya/items/97c5cb0cfa414b3592d7#%E8%89%AF%E3%81%8F%E4%BD%BF%E3%81%86)
 - [任意のタイムゾーンで出力する方法](http://qiita.com/semind/items/9614ded891d6154e9a06)
 - [paiza.IO](https://paiza.io)
間違ってubuntu14.04を16.04にupgradeしてしまった場合の対応

ubuntu14.04を間違ってupgradeしてしまった。これにより、これまで使えていたアプリケーションが使えなくなっている。

ubuntu14.04をインストールし直すという手もあるが、せっかくなので16.04でどれだけ機能するか確かめ、対処できる範囲なら再インストール無しに対応する。

まず症状を確認する。

##使えるアプリの確認
まずvirtualenvする。

```
source PATH_to_venv/activate
```

pythonを立ち上げて、諸々をimportできるか確認する。

```
python
>>>import numpy
ImportError: PyCapsule_Import could not import module "datetime"
```
え
いきなりエラーが出た。datetimeとうものに問題があるらしい。ここを見ると
http://stackoverflow.com/questions/26031160/importerror-no-module-named-datetime
virtual envをインストールし直すと症状が改善されるらしいので、試してみる。

```
sudo pip uninstall virtualenv
```

そして再びインストール。

```
sudo pip install virtualenv
```

15.0.1をアンインストールして、15.0.3をインストールしたようだ。ここでimport numpyできるた試してみたが、やはりdatetimeが無い、と出る。そこでnumpyを入れなおしてみたが、やっぱりダメ。

コンピュータ内をdatetimeで検索したところ、python3系列フォルダにはdatetime.pyがあるが、virtualenvで使っているpython2系列には無い。これが問題か？

いろいろ調べたが、datetimeだけ修正するのは難しそう。よってpipやapt-getなどでインストールしたパッケージを全て削除することを決断。

まず、ここを参考に
http://qiita.com/hunzy/items/6965dce22cedb046af7c
pipでインストールしたモジュールを洗い出し、全て削除する。

次に、apt-getで入手したパッケージのうち、chainerで必要なものを削除し、再インストールした。

しかし、やはりchainerを動かそうとすると、datetimeが無いと出る。
【Oracle 12Cのお勉強】テーブルの列を全部非表示列にすることはできるのか？


## 内容
Oracle 12cで、通常は見えない列「非表示列」という機能が追加された。
テーブルの列を全部非表示列にすることが可能か確認する。

## 非表示列とは？

テーブルの定義には存在するが、通常の操作では見ることができない列。
create table時、列にinvisibleを指定することで非表示列にすることができる。

▼ 動作確認用テーブルTEST01を作成する。

```sql:
create table test01 (
  id number(3),
  name varchar2(10),
  himitsu varchar2(10) invisible
);
```

▼ descコマンドで定義を確認。invisibleの列は表示されない。

```sql:
SQL> desc test01
 名前                                    NULL?    型
 ----------------------------------------- -------- ----------------------------
 ID                                                 NUMBER(3)
 NAME                                               VARCHAR2(10)
```

▼ データをinsertしてみる。invisibleの列に値を格納する場合、列名を指定しないとエラーになる。

```sql:
SQL> insert into test01 values (1,'abc');
1行が作成されました。

SQL> insert into test01 values (2,'def','ZZZ');
insert into test01 values (2,'def','ZZZ')
            *
行1でエラーが発生しました。:
ORA-00913: 値の個数が多すぎます。

SQL> insert into test01 (id,name,himitsu) values (2,'def','ZZZ');
1行が作成されました。
```

▼selectで内容を表示してみる。invisible列は直接指定しないと見えない。

```sql:
SQL> select * from test01;
 ID NAME
--- ----
  1 abc
  2 def

SQL> select id,name,himitsu from test01;
 ID NAME HIMITSU
--- ---- -------
  1 abc
  2 def  ZZZ
```

▼ "set colinvisible on"で非表示列を表示することができる。

```sql:
SQL> set colinvisible on
SQL> desc test01
 名前                                    NULL?    型
 ----------------------------------------- -------- ----------------------------
 ID                                                 NUMBER(3)
 NAME                                               VARCHAR2(10)
 HIMITSU (INVISIBLE)                                VARCHAR2(10)
```

▼ user_tab_colsでinvisibleか確認できる。

```sql:
SQL> select column_name,hidden_column from user_tab_cols where table_name = 'TEST01';
COLUMN_NAME HIDDEN_COLUMN
----------- -------------
HIMITSU     YES
NAME        NO
ID          NO
```

## テーブルの列全てをinvisibleにしてみる。

全ての列がinvisibleのテーブルtest02を作成する。

▼ create tableを実行。

```sql:
SQL> create table test02 (
  2    id number(3) invisible,
  3    name varchar2(10) invisible,
  4    himitsu varchar2(10) invisible
  5  );
```

▼ 実行結果。

```sql:
create table test02 (
             *
行1でエラーが発生しました。:
ORA-54039: 表には、非表示ではない列が少なくとも1つ必要です
```

**→ 残念、できませんでした。**
【R】滅多に使わない前処理メモ

滅多に使わないが故にすぐ忘れてしまうこと必至の処理だったので、メモっておく。

cvが1のときにデータを区切るためのidを振りたい。

```r
# library -----------------------------------------------------------------

require(random)
require(dplyr)


# makinkg data ------------------------------------------------------------

set.seed(71)
N <- 5
session_id <- as.vector(random::randomStrings(n = N,len = 8, digits = T, unique = T))
times <- floor(runif(N, min = 3, max = 10))

dat <- data.frame(
  session_id = rep(session_id, times),
  times = unlist(sapply(times, FUN = function(x) 1:x))
)
dat["cv"] <- rbinom(n = nrow(dat), size = 1, prob = 0.2)


# preprocess --------------------------------------------------------------

dat_pp <- dat %>% 
  dplyr::group_by(session_id) %>%
  dplyr::mutate(cv_cumsum = cumsum(cv)) %>% 
  dplyr::mutate(cv_id = dplyr::lag(cv_cumsum, n = 1, default = 0)) %>% 
  dplyr::select(session_id, cv_id, times, cv)
  
# check
tibble::glimpse(dat_pp)
```

　　
結果は以下の通り

```r

 session_id cv_id times cv
1    H5bnOPEl     0     1  1
2    H5bnOPEl     1     2  0
3    H5bnOPEl     1     3  1
4    H5bnOPEl     2     4  0
5    H5bnOPEl     2     5  0
6    pXbymzES     0     1  0
7    pXbymzES     0     2  0
8    pXbymzES     0     3  0
9    pXbymzES     0     4  0
10   pXbymzES     0     5  1
11   pXbymzES     1     6  0
12   G60tnnDx     0     1  0
13   G60tnnDx     0     2  1
14   G60tnnDx     1     3  1
15   G60tnnDx     2     4  1
16   G60tnnDx     3     5  0
17   FokLEvUI     0     1  0
18   FokLEvUI     0     2  0
19   FokLEvUI     0     3  0
20   FokLEvUI     0     4  0
21   O0jUTbyT     0     1  0
22   O0jUTbyT     0     2  0
23   O0jUTbyT     0     3  0
24   O0jUTbyT     0     4  0
25   O0jUTbyT     0     5  1
```
AjaxでバイナリのJPEG画像データを受け取って表示する


クライアント側でAjaxでバイナリ画像を受け取り表示する。

# 画像のバイナリデータを返すAPI

テスト用にRailsで適当な画像ファイルを開いてそのまま返すAPIを作る。

```capture_controller.rb
def load
  send_data binary, type: 'image/jpeg', disposition: 'inline'
end

def binary
  path = "#{Rails.root}/tmp/test.jpg"
  img = File.open(path, 'r')
  img.read
end
```

# Ajaxで画像のバイナリデータを取得する

## XMLHttpRequestを使う

[バイナリファイルをAjaxで取得する際に注意する点](http://qiita.com/tom_konda/items/484955b8332e0305ebc4)
↑ここに書いていあることと同じところではまった。

jQueryの`$.ajax()`で普通に取得しようとするとすると、バイナリがテキストとして扱われてしまうためうまくいかない。

**XMLHttpRequestでresponseTypeに`blob`か`arraybuffer`を指定してリクエストすることで画像のバイナリデータを受け取ることができる。**

```js
var loadBinaryImage = function(path, cb, type) {
  var xhr = new XMLHttpRequest();
  xhr.onreadystatechange = function(){
    if (this.readyState == 4 && this.status == 200) {
      cb(this.response);
    }
  }
  xhr.open('GET', path);
  xhr.responseType = type || 'blob';
  xhr.send();
}
```

（ちなみに[`$.ajax()`でバイナリを受け取る方法](http://www.henryalgus.com/reading-binary-files-using-jquery-ajax/)もあるみたい）

## Blobで受け取る場合

`responseType='blob'`にして受け取り画像表示する方法。

1. URL.createObjectURL

`URL.createObjectURL`を使って画像表示する。

```js
// URL.createObjectURL
var showImageByCreateObjectURL = function(blob) {
  var img = document.getElementById("imgTest");
  var url = window.URL || window.webkitURL;
  img.src = url.createObjectURL(blob);
}
```

2. FileReader

`FileReader`でblobをDataURLとして読み、Imgタグのsrcに入れる。

```js
// FileReader
var showImageByFileReader = function(blob) {
  var reader = new FileReader();
  reader.onloadend = function() {
    var img = document.getElementById("imgTest");
    img.src = reader.result;
  }
  // DataURLとして読み込む
  reader.readAsDataURL(blob);
}
```

## ArrayBufferで受け取る場合

`responseType='arraybuffer'`にして受け取り画像表示する方法。

1. window.btoa

```js
// window.btoa
var showImageByBtoa = function(ab) {
  var bytes = new Uint8Array(ab);
  var binaryData = "";
  for (var i = 0, len = bytes.byteLength; i < len; i++) {
    binaryData += String.fromCharCode(bytes[i]);
  }
  var img = document.getElementById("imgTest");
  img.src = "data:image/jpeg;base64," + window.btoa(binaryData);
}
```

2. blobに変換する

blobに変換することができるので、あとはURL.createObjectURLやFileReaderを使って表示可能。

```js
var blob = new Blob([ ab ], { type: "image/jpeg" });
```

他にも、[CanvasのtoDataURLを使う方法](http://stackoverflow.com/questions/26212792/convert-an-image-to-canvas-that-is-already-loaded/26554277#26554277)や[自前でBase64化する方法](http://stackoverflow.com/questions/26212792/convert-an-image-to-canvas-that-is-already-loaded/26554277#26554277)などもある。

# 参考

http://qiita.com/tom_konda/items/484955b8332e0305ebc4

http://tech-sketch.jp/2013/01/javascript-1.html

http://www.qript.co.jp/blog/technique/215/

http://qiita.com/weal/items/1a2af81138cd8f49937d

http://stackoverflow.com/questions/32085474/how-to-put-png-binary-data-into-an-img-tag-and-display-it-as-an-image

http://stackoverflow.com/questions/10982712/convert-binary-data-to-base64-with-javascript

http://stackoverflow.com/questions/6150289/how-to-convert-image-into-base64-string-using-javascript
超マイナー！PostgreSQL開発におけるOutOfOrder解決方法

## はじめに

この記事は、勉強がてら覗いているPostgreSQLのgitリポジトリの
src/backend/storage/lmgr/README.barrier
を翻訳したものです。

低レイヤのマルチプロセスは闇が深い。

## OutOfOrder実行(OOO: Out of Order execution)とは？
 
最近のCPUでは並列実行による高速化の恩恵を受けるため、結果一致が保証される範囲でプログラムの命令実行の順序性を無視して並列実行を行う場合がある。
これを、Out Of Order execution(OOO)と呼ぶ。 
 
### OOOが行われることによって生まれる潜在バグ

しかし、OOOによって順序性が崩れることで、プログラムから共有メモリにアクセスする際にバグが生まれる場合がある。
例：
 
```c
 47     q->items[q->num_items] = new_item;
 48     ++q->num_items;
 ```
上記のようなコードが実行されている、まさにその瞬間に
以下のコードが実行された場合。
 
```c
 52     num_items = q->num_items;
 53     for (i = 0; i < num_items; ++i)
 54         /* do something with q->items[i] */
 ```

47行目と48行目は順番に実施される保証はないので、
52行目ではインクリメントされたアイテム数が読まれるが、54行目以降でメモリ上にそのデータが格納されていない場合がある。
 
この場合、設計者の意図に反したふるまいを起こし、NullPointer Exceptionが発生する場合がある。 
 
## 解決方法
 
### 解決方法１： LightWeightLockを獲得する。
最もシンプルな方法で、確実。
→データのやり取りが頻繁の場合、ネックになる恐れ
 
※PostgreSQLのLightWeightLockについては別途
 
### 解決方法２： Memory Barierr を使う
PostgreSQLでは、pg_memory_barrier()マクロによってこれを防ぐことができる。
これは、
1) コンパイラのOOO最適化による、コードの順序変更を防ぎ
2) CPUが順不同にメモリアクセスすることをを防ぐようにバイトコード（インラインアセンブリ）を生成する。
 
以下、コード例：
 
```c
 86     q->items[q->num_items] = new_item;
 87     pg_memory_barrier();
 88     ++q->num_items;
 89
 90 And by having the reader do this:
 91
 92     num_items = q->num_items;
 93     pg_memory_barrier();
 94     for (i = 0; i < num_items; ++i)
 95         /* do something with q->items[i] */
```

しかし、x86システムなどにおいて、メモリアクセスの順序性確保の強制によって、CPUは読み込み同士、書き込み同士の最適化もしなくなります。
これを避けるため、メモリバリアをreadとwriteに分割することもできます。
 
以下例：

```c 
118     q->items[q->num_items] = new_item;
119     pg_write_barrier();
120     ++q->num_items;
121
122 And the reader can do this:
123
124     num_items = q->num_items;
125     pg_read_barrier();
126     for (i = 0; i < num_items; ++i)
127         /* do something with q->items[i] */
```
 
メモリバリアでもだめな例
 
１）
 
 x->foo++;
 
というような書き込み処理が複数のプロセスから行われる。
→ 読み出し 加算処理 元のアドレスへの書き込み という3つの命令の間にほかの読み出し 加算処理 元のアドレスへの書き込み が発生する可能性あり 
Atomic fetch and add 命令を使うという方法もあるが、すべての環境で使えるわけではないのでPostgreSQLにおいてはこれをサポートしない
 
2) 8バイトデータの読み書き
 
3)  複数のメモリバリアを使用する場合
→単純にLOCKをとった方が効率的である場合もあるこということ
 

上記のような場合は、LightWeightLockの方法を使う。
RAC環境でSID・SERVICE_NAMEを確認


## 内容
RAC環境で、SID・SERVICE_NAMEを確認する方法をメモする。

## 確認

LinuxのRAC環境で、データベースのSERVICE名は「TEST01」とする。
３ノードRACで、それぞれ「test011」「test012」「test013」のSIDが設定されている。


▼ 今回はtest011で確認を行う。

```sql:
$ env | grep ORACLE_SID
ORACLE_SID=test011
```

▼ SQL＊Plusでログイン

```sql:
$ sqlplus / as sysdba
```

▼ V$DATABASEでSERVICE_NAMEを確認。

```sql:
SQL> select name from v$database;

NAME
-------
TEST01
```

▼ V$INSTANCEでSIDを確認

```sql:
SQL> select instance_name from v$instance;

INSTANCE_NAME
-------------
test011
```

▼ DEFでもSIDを確認できる。

```sql:
SQL> def _CONNECT_IDENTIFIER
DEFINE _CONNECT_IDENTIFIER = "test011" (CHAR)
```


▼ V$THREADで、RACに属するSIDを全て表示

```sql:
SQL> SELECT INSTANCE FROM V$THREAD

INSTANCE
----------
test011
test012
test013

```

以上。
MinimumなSpringBoot

# ファイル・ディレクトリ

```
プロジェクトディレクトリ/
├build.gradle
└src/
　└main/
　　└java/
　　　└com/
　　　　└MinimumSpringBoot.java
```

```groovy:build.gradle
buildscript {
    ext {
        springBootVersion = '1.4.0.RELEASE'
    }
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    }
}

apply plugin: 'java'
apply plugin: 'spring-boot'

jar {
    baseName = 'MinimumSpringBoot'
    version = '1.0-SNAPSHOT'
}

sourceCompatibility = 1.8
targetCompatibility = 1.8

repositories {
    mavenCentral()
}

dependencies {
    compile 'org.springframework.boot:spring-boot-starter-web'
}

bootRun {
    addResources = true
}
```

```java:MinimumSpringBoot.java
package com;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class MinimumSpringBoot {
    public static void main(String[] args) {
        SpringApplication.run(MinimumSpringBoot.class, args);
    }
}
```

# 特記
- `gradle bootRun`でインプレース実行します。
- `gradle bootRepackage`でjar化します。
- パッケージ(今回はcom）は必須、src/main/java以下に投入しないと、メインクラスを見つけてくれませんでした。
（マニフェスト定義が必要になる？）
- ブラウザで`http://localhost:8080`にアクセスすると404になります。

# なぜやった
初めてSpringBoot（というかSpring自体）を始めるにあたって、参考書を読んだりサンプルを見たりしたけど、どこからどこまで書けばアプリケーションとして動作するのか全然わからなったので、ついやっちゃいました。
正直やってよかったです。
@RestController, @Service, @Repository... 少しずつ足していったら、全容が見えてくるかもしれませんね。
Apacheでリバースプロキシ

# 環境
```
$ uname -a
Linux www5198uf 4.4.0-36-generic #55-Ubuntu SMP Thu Aug 11 18:01:55 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
```

```
$ sudo apache2 -v
Server version: Apache/2.4.18 (Ubuntu)
Server built:   2016-07-14T12:32:26
```

# 設定

```bash
$ sudo aptitude install apache2
```

`/etc/apache2/sites-available` に `*.conf` という名前で設定を書く。

```bash
$ cat /etc/apache2/sites-available/hoge.conf
```

```apache 
<VirtualHost *:80>
  ProxyPreserveHost On
  ServerName hoge.net
  ProxyPass / http://127.0.0.1:10080/
  ProxyPassReverse / http://127.0.0.1:10080/
  ErrorLog ${APACHE_LOG_DIR}/hoge_error.log
</VirtualHost>
```

```bash
$ sudo a2enmod proxy
$ sudo a2enmod proxy_http
$ sudo a2ensite hoge.conf
$ sudo service apache2 restart
```


これで、`http://hoge.net` というホストへのアクセスは `http://127.0.0.1:10080` へのアクセスとして処理される。
Debianで壁紙を一定時間ごとに変更する

壁紙を一定時間ごとに変更するには、画像ファイルのパスを.xmlファイルに記載してそれを壁紙に設定するらしいが、.xmlを作成するのは少し難しいので、CreBSというツールを使うらしい。しかしDebianでは、add-apt-repositoryコマンドが利用できない。またリポジトリを追加するのはちょっと気持ち悪い場合もある。
そこで、ter.gzファイルをダウンロードしてインストールする方法を試行錯誤の上見つけたので備忘録がわりに書いておこうと思います。

* * *
ＯＳ　：　Debian8.5
デスクトップ　：　mate
* * *

まず、CreBSのサイトに行き、
`http://www.obfuscatepenguin.net/crebs/`
下の方の「Other Distributions」セクションのDownload source archiveをクリックしファイルをダウンロードする。
![Screenshot160901.png](https://qiita-image-store.s3.amazonaws.com/0/89689/772f5066-4816-17fb-0771-b01ed9e5c4d3.png)

ダウンロードしたファイルを展開し、
`[展開したディレクトリ]/crebs-0.9.8.5/crebs/bin`
の、crebsを実行する。
`./crebs`
しかし、ここでライブラリがないとエラーが出るので、ライブラリをインストールする。

私の場合は、python-glade2　と　python-gconf　だったので、rootで、

```shell-session:command
apt-get install python-glade2
apt-get install python-gconf
```
とした。
あらためて

`./crebs`

とするとエラーが大量に表示されるがなんとか起動する。

本当はツールによって壁紙が設定されるらしいがそれは行われない。作成されたファイルは、
`［ツールを起動したユーザのホーム］/.crebs`
配下に.xmlファイルが格納されているのでそれを壁紙に設定する。
英語プレゼンに向けたTips

#きっかけ
英語プレゼンしました。会社紹介と提案・ディスカッションです。久々の英語だし、英語会社紹介は初体験でいくつか調べたのでそのメモです。
**なんちゃって英語なので、間違っていることもありそう**な気がします。通じるくらいのレベル。そんな大きな提案ではなかったので、ネイティブチェックを入れないどころか、かなり短時間でしかやれていないです。今後、また機会があれば更新していきます。
#表現
####あいさつ
「会社紹介の機会もらえまして嬉しいです」。会社紹介の冒頭で使いました。
> It is my great pleasure to introduce to you our company.

####XXビジネスやっています。
「"ソリューション名"で10年以上ビジネスをやっています」。いろいろ迷ったのですが、最終的にこの表現にしました。アメリカのお客様だったので、SIer主導でプロジェクト推進って感じにすると、文化の違いから「？」となってもおかしくなかったので"help"程度の表現にしています。ただ、多分もっと良い表現あります。
>We have helped our customers over 10 years with "ソリューション名".

#単語
####親会社
>Parent Company

####非系列企業
>unaffiliated customers

####SIer
SIerは当然和製英語です。
>system integrator

####海外システムのロールイン
海外システムを基本的にそのまま日本にも適用することをロールインと言います。意外と英語でもそのままっぽいです。
>system roll-in

####外資系企業
今の時代、意味があるかわかりませんが、「外資系企業」を一応使いました。営業から指示されたスクリプトにあったので。
> foreign capital companies

#番外編
今回一番、覚えにくかったのが、「メルセデスベンツ」。
英語発音でカタカナで表現できないのはわかっていますが、あえてすると「マーシーディーズベンツ」です。そのためだけの[動画](https://www.youtube.com/watch?v=6MlqshQ-3Jo)を見ました(そんな動画あるのか！)。
時計回りの角度で16方位を取得する


16で割ればいいので1方位あたり 22.5°。

0°が北、東が90°、北東は45°で、北北東は22.5°という計算。
各16方位の範囲を隣りの方位との半分と考えて、例えば東北東は 22.5° の ±11.25° なので 11.25°〜33.75°

「北」の範囲の -11.25° は後で述べるとして、およそ角度を22.5で割った数を四捨五入すると0〜16になります。

0〜16 の整数が順番に得られたので、これを添字にして配列を参照してやれば16方位が得られます。
0〜16 なので、最後の17番目には一周まわって戻ってきた「北」を解決してやればよいので

```16directions.js
var dname = ["北","北北東","北東", "東北東", "東", "東南東", "南東", "南南東", "南", "南南西", "南西", "西南西", "西", "西北西", "北西", "北北西", "北"];
var dindex = Math.round( degree / 22.5 )

alert("方角は" + dname[dindex])
```


四捨五入が無かったり高価だったりする処理系では切り捨てを使うと思います。例えば float を int にキャストするとか

```
int dindex = (int)( (degree + 11.25) / 22.5 )
```

11.25° ぴったりを北北東に含める場合は 11.25 を足しておいた上で 22.5 で割ります。

11.25° はまだ北にしておきたいなら degree + 11.2499999... と 9 の桁数は取得してくる dgree の精度と、各処理系の桁のまるめを確認してください。
世界は歪んでいる。それでも君は歩む。 vs 道なりの亀


https://codeiq.jp/q/2751
http://qiita.com/Nabetani/items/1de39df381dfeee305ab

CodeIQの問題を見た時、すぐに思い出すものがあった。道なりの亀である。
へんなマップを上下左右に進むルールはそっくりである。
マップの持ち方を、上下ではなく、外側から内側へ持つようにすれば、辞書の差で差異を吸収できるのではないかと思った。

- 以下のソースは、-DHENA12でコンパイルすることで「道なりの亀」、つけなければ(-DCODEIQ2751となり)「世界は歪んでいる。それでも君は歩む。」の答案としてコンパイルされる。
- [道なりの亀の旧答案](http://qiita.com/cielavenir/items/56c2a969133f0617f898)と比較して、v2の順序が逆に、またv1の湾曲部分がv2に移動していることに注目。
- 「世界は歪んでいる。それでも君は歩む。」については、三角形の1頂点と1辺を1<del>列</del>行に保持している(半開区間的に…●-○)。
- そういえば、実際には-DHENA12PREじゃないとおかしいのだが、ソース書いたの半年近く前だし、まあいっか。

```tyama_codeiq2751-hena12pre.cpp
//http://qiita.com/Nabetani/items/1de39df381dfeee305ab
//http://nabetani.sakura.ne.jp/hena/ord12aloroturtle/
#include <iostream>
#include <string>
#include <vector>
#include <map>
using namespace std;
const int D[4][2]={{1,0},{0,1},{-1,0},{0,-1}}; //RDLU

#define CODEIQ2751

#if defined(HENA12)
const vector<vector<string>>v={
	{"ABCDEFGH","LMNOPQRS","WXYZabcd"},
	{"KVg52zwtqnkh","JUf630xuroli","ITe741yvspmj"},
};
const char start='A',error='?';
#elif defined(CODEIQ2751)
const vector<vector<string>>v={
	{"0369cfi","147adgj","258behk"},
	{"loruxAD","mpsvyBE","nqtwzCF"},
	{"GJMPSVY","HKNQTWZ","ILORUX@"},
};
const char start='0',error='!';
#else
#error define HENA12 or CODEIQ2751.
#endif

int main(){
	int x,y,i,d,n;
	map<char,map<int,pair<char,int> > >m;
	for(auto &v1:v){
		for(y=0;y<v[0].size();y++){
			for(x=0;x<v1[y].size();x++){
				char c=v1[y][x];
				if(x<v1[y].size()-1)m[c][0]=make_pair(v1[y][x+1],0);
				if(y<v[0].size()-1)m[c][1]=make_pair(v1[y+1][x],1);
				if(x>0)m[c][2]=make_pair(v1[y][x-1],2);
				if(y>0)m[c][3]=make_pair(v1[y-1][x],3);
			}
		}
	}
	for(int i=0;i<v.size();i++){
		for(int j=0;j<v[0].size();j++){
			char c=v[i][j][v[i][j].size()-1],d=v[(i+1)%v.size()][v[0].size()-1][j];
			m[c][0]=make_pair(d,3);
			m[d][1]=make_pair(c,2);
		}
	}
	string line;
	for(;getline(cin,line);){
		char cur=start,nxt;
		d=0;
		cout<<cur;
		for(i=0;i<line.size();i++){
			if(line[i]=='L')d=(d+3)%4;
			else if(line[i]=='R')d=(d+1)%4;
			else{
				n=0;
				if('1'<=line[i]&&line[i]<='9')n=line[i]-'0';
				if('a'<=line[i]&&line[i]<='f')n=line[i]-'a'+10;
				if(!n)break;
				for(;n;n--){
					if(m[cur].find(d)==m[cur].end()){cout<<error;break;}
					nxt=m[cur][d].first;
					d=m[cur][d].second;
					cur=nxt;
					cout<<cur;
				}
				if(n)break;
			}
		}
		cout<<endl<<flush;
	}
}
```
npm publishするまえにdry-run的な感じでuploadされるファイル調べたい。

結論： `npm pack`と`tar`コマンドを組み合わせる。

残念ながら今のところ`npm publish --dry-run`オプションとかは無い。
（出典：https://github.com/npm/npm/issues/6351#issuecomment-119051586）

```
$ tar -tf $(npm pack)
package/package.json
package/README.md
package/index.js
```

npm packすると、publishの代わりとしてtarで固められるので、その出力を`tar -tf`に通すと一覧が出てくるという寸法。頭いい。

yarnでも`yarn pack`はあるが、出力がうまくいかないのでそのまま使えなそう

---

npm publishのhelpを見ると、一応下記のような記述までは存在してる。

`$ npm help publish`
> For a "dry run" that does everything except actually publishing to  the
   registry,  see  npm  help  npm-pack,  which figures out the files to be
   included and packs them into a tarball to be uploaded to the  registry.
LubuntuでCtrlキーとWinキーを入れ替える

MacでVirtualBoxを使って構築したLubuntuでキー操作が不便だったので、左のCtrlキーと左のWinキー(MacだとCommandキー)を入れ替える。  

# 0. 環境

- Lubuntu 16.04
    - Ubuntu 16.04の環境に後からlubuntu-desktop, lxdeを追加したので、素のLubuntuとは違うかも

# 1. キーの入れ替え

```bash
$ setxkbmap -option "ctrl:swap_lwin_lctl"
```

# 2. 永続化

`~/.config/lxsession/Lubuntu/autostart` に書くと起動時に実行されるらしいが……
上手く動いてない模様。

```bash
cat ~/.config/lxsession/Lubuntu/autostart
@setxkbmap -option "ctrl:swap_lwin_lctl"
```

設定→LXSessionのデフォルトのアプリケーション からも設定してみましたが上手く行かず……
試行錯誤中。
android布局单位dip dp sp px

android布局常用单位有dip、dp、sp、px。

#dip/dp
    表示密度无关像素（density-independent pixel），是基于屏幕物理密度的抽象单元。dp是相对一个160dpi密度的屏幕来讲的，所以在160dpi密度的屏幕里1个dp表示一个像素。屏幕密度高单位dp对应像素值高，屏幕密度低单位dp对应像素值低。也就是说不同密度的屏幕，单位dp对应的像素值也不一样。但记住一点就行，无论哪种密度，1个dp在屏幕上总是表示1/160英寸，从而保证不同屏幕上dp总能表示相同的尺寸。
    使用场景：除字体以外任何场景
#sp
    表示缩放无关像素（scale-independent pixel），也是一种密度无关像素，只是会受到用户所设定的字体偏好影响，跟随字体大小缩放。
    使用场景：只在字体大小
#px
    表示像素（pixel），屏幕实际像素。
    使用场景：尽量不用，但在准确需要多少像素的场景可以使用，比如：列表分割线高度

下面2张图片可以帮助大家更好的了解上述布局单位

![image](https://qiita-image-store.s3.amazonaws.com/0/136263/b575c714-d0e8-b6a4-bfe3-0d75bf0fc6af.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/136263/32b57610-d250-8a55-a9ce-897dae4c24e7.png)
xUnit.net の使い方（並列実行編）

* 複数のスレッドを利用して、テストクラスがどのように実行されるかを設定する。


# テストの並列実行

* 同じテストクラス内のテストメソッドは、互いに同時には実行されない。
* 逆に、異なるテストクラス同士は、互いにどういう風に実行されるか分からない。
    * 同時に実行されるかもしれないし、違うかもしれない。


# 同時に実行しないテストの設定

* `Collection` 属性をつけることによって、テストクラス間の同時実行を管理する。
* 同時に実行されたくないクラスには、`Collection` 属性をつけ同じ文字列を引数に与える。

```csharp
[Collection("Our Test Collection #1")]
public class TestClass1
{
    [Fact]
    public void Test1()
    {
        Thread.Sleep(3000);
    }
}

[Collection("Our Test Collection #1")]
public class TestClass2
{
    [Fact]
    public void Test2()
    {
        Thread.Sleep(5000);
    }
}
```

* `TestClass1` と `TestClass2` は同時には実行されない。



# 並列実行の初期設定

* テストプロジェクトの `AssemblyInfo.cs` に設定をする。

```csharp
// 
[assembly: CollectionBehavior(CollectionBehavior.CollectionPerAssembly)]


// テストの同時実行で利用するスレッド数の最大値
[assembly: CollectionBehavior(MaxParallelThreads = n)]


// このアセンブリ内のテストを並列で処理する
// デフォルト : false
[assembly: CollectionBehavior(DisableTestParallelization = true)]
```



# 参考資料

* [Running Tests in Parallel](http://xunit.github.io/docs/running-tests-in-parallel.html)