OmniAICreator/Qiita-1.07M huggingface dataset:
ESXi 6.5に公開鍵/秘密鍵を使用してSSHで自動ログインする

ありふれたネタで新規性もないですが、ESXi 6.5でもできるますよということで手順まとめ。

#前提
* ESXi 6.5 GA(build-4564106)
* ESXiにはrootユーザでログインする
* ESXiのSSHは有効化済み

#鍵の生成

1. TeraTermのウィンドウを開く

1. 新しい接続はしないでキャンセル

1. [設定] - [SSH鍵生成] をクリック

1. 開いたTTSSH:鍵生成ウィンドウの[生成]をクリック
(鍵の種類とビット数ははデフォルトのRSAと2048ビットでOK)

1. [鍵のパスフレーズ]と[パスフレーズの確認]を入力

1. [公開鍵の保存]をクリックして、任意のディレクトリに公開鍵を保存

1. [秘密鍵の保存]をクリックして、任意のディレクトリに秘密鍵を保存


#公開鍵/秘密鍵でログイン

2. TeraTermで鍵を配置するESXiにSSHでログイン

2. TeraTermメニューの[ファイル]-[SSH SCP]をクリック

2. 開いたTTSSH:SecureFileCopyウィンドウの画面上部に以下の通り入力
From：生成した公開鍵の古パス
To　：/etc/ssh/keys-root/authorized_keys

2. ESXiからSSHを一度ログアウト

2. 再度TeraTermを開き、[RSA/DSA/ECDSA/ED25519鍵を使う]を選択して、
[秘密鍵]を指定しログインできることを確認。
(ユーザー名はroot、パスフレーズは秘密鍵生成時のもの)

#TeraTermマクロで自動ログイン

以下のようなマクロファイルを作成する。

```
;============================================ 
; Filename    : ssh_connect-esxi.ttl 
; Description : SSH Auto login 
; Author      : MyName
; Created     : 2016/12/28
; modified    : 
;============================================ 
;; ユーザ名／パスワード設定 
HOSTADDR = 'ESXiのIPアドレス' 
USERNAME = 'root'
PASSFILE = 'C:\work\ssh_key\password.dat' 
KEY_FILE = 'C:\work\ssh_key\id_rsa' 
;============================================ 
;; ①パスワード取得 
getpassword PASSFILE USERNAME PASSWORD
 
;; ②コマンド組立て 
COMMAND = HOSTADDR 
strconcat COMMAND ':22 /ssh /2 /auth=publickey /user=' 
strconcat COMMAND USERNAME 
strconcat COMMAND ' /passwd=' 
strconcat COMMAND PASSWORD 
strconcat COMMAND ' /keyfile=' 
strconcat COMMAND KEY_FILE
 
;; ③サーバへ接続 
connect COMMAND
 
;; ④マクロ終了 
end

```

作成した.ttlファイルはttpmacro.exeに関連付けて実行。

初回のみパスフレーズの入力を求められるが、以降はマクロを実行するだけでESXiにログインできるようになる。

#参考
Allowing SSH access to ESXi/ESX hosts with public/private key authentication
https://kb.vmware.com/kb/1002866

公開鍵認証によるSSH接続 - Tera Termの使い方
http://webkaru.net/linux/tera-term-ssh-login-public-key/

TeraTermマクロ－SSH公開鍵認証で自動ログイン
http://www.j-oosk.com/teraterm/authorized_keys/307/
Cognos Analytics 11.0.5 のチャート（グラフ）の機能

以前、こちらのCognos Analytics 11.0.5の新機能の記事（http://qiita.com/shinyama/items/a0f764020ce0a42eb555 ）の、Reporting enhancements の中で、**「これまでのチャートの機能は廃止され、RAVE2に一本化されたようです。」**と書いていましたが、実際にCognos Analytics 11.0.5の環境で動作を確認したところ、**「チャートの機能が廃止された」**ではなく、正しくは**「チャートの機能のアイコンが廃止された」**という事のようですので、フィードバックします。

元になったのは、以下の記事の以下の文言の箇所です。
https://www.ibm.com/communities/analytics/cognos-analytics-blog/reporting-enhancements-in-cognos-analytics-11-0-5/
<抜粋>
**Brand New Visualization Window**
We are introducing a new visualization gallery window that combines all charts and visualizations in this release. The Chart toolbox object is deprecated.

##実際の環境での動作
レポート作成の機能で、ツールボックスからデータコンテナーの下を見ても、確かに「チャート」のアイコンは存在しません。Cognos Analytics 11.0.4までは、ここに「チャート」アイコンが表示されてました。
![001.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/1cbcf767-8d10-c6ae-ac40-8c72fa4f8c1b.png)

「視覚化」のアイコンを置いてみると、明らかにRAVE2のグラフ一覧が表示されます。
![002.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/4e7216c8-14ec-d6e1-62df-4dd6360ce749.png)

しかしながら、赤枠のフィルターアイコンを選択すると、「グラフ」という選択肢があります。
![003.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/ff18b2eb-2057-62ae-c52a-ce02c0187755.png)

「グラフ」を選択すると、見慣れた「チャート」の一覧が表示されました。
![004.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/d613da4c-2eaf-2394-781e-2b2b28564a8a.png)

参考までに「既存の視覚化」を選択すると、RAVE1が表示されるので、VisJsonベースでのRAVEもまだ使えるようです。
![005.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/43fa5b27-be24-a509-0557-0c9ee96c4cc6.png)

さらに参考までに、レポート作成の機能のオプションから「古いグラフ作成ツールを使用」をチェックしてOK。
その後、ブラウザを立ち上げなおしますと、
![006.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/765a502f-4a46-611c-22b2-22a6ae998c3b.png)

先ほどの画面で、Cognos 8のチャートエンジンでのグラフも表示されました。
![007.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/3f1851ce-adef-0da8-ff98-e7b16ca2fce0.png)

Cognos 10.2.2で作成したチャートをCognos Analytics 11.0.5にインポートして、実行してみました。
ドリルスルーや、条件パレットなど、一通り普通に動くようです。
![008.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/8f4a7eac-6f03-3ce7-0ae8-e1cfe4c87596.png)

レポート編集画面でも、プロパティに問題なくこれまで使えた機能が表示されました。
![009.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/87a63759-d75f-5a0c-df83-3eda30877294.png)
Unity Vectorを一通り理解する

Unityが用意してくれているVectorをきちんと理解すれば開発も楽になるかなと思います。
リファレンスに載っているVectorを全部使って勉強します。
https://docs.unity3d.com/ja/current/ScriptReference/Vector3.html

##Vector3概要
Vector3はクラスではなくStruct。UnityEngineネームスペースに存在している

#コンストラクタ
全部で３つ
Vector3(float x, float y, float z)
=>普通にxyz変数に入れられる。

Vector3(float x, float y)
=>z変数には0fが入れられる。

#定数
##イプシロン

```
public const float kEpsilon = 1E-05f;
```

float比較のときに使用する。

#プロパティ
##normalizedプロパティ
ベクトルを正規化して返す。(ただしベクトル自体は変わらない)
get内で`Vector3.Normalize関数`の演算結果を返している。

##magnitudeプロパティ
ベクトルの長さ(ノルム)を返す。
get内で`Mathf.Sqrt(this.x * this.x + this.y * this.y + this.z * this.z);`をやっているだけ。
処理負荷が高いのでなるべく使わない法が良い。

##sqrMagnitudeプロパティ
magnitudeプロパティの平方根を求めないバージョン
少しでも処理負荷を下げようとして実装された。
単純に大きさの比較だけをやりたい時に使う。

##zeroプロパティ
(0,0,0)のベクトルを返す。
get内で`new Vector3(0f, 0f, 0f);`をやって新しいstructを使って返している。

##one,foward,back,right,left,up,downプロパティ
zeroプロパティとほとんど同じ。xyz成分が違うだけ。

#関数
##Lerp(Vector3 a, Vector3 b, float t)
内部で
`t = Mathf.Clamp01(t);`をして01補正した後、２つのベクトルをleap処理して返す。
２つのベクトルの直線上を補完する。
![12月-28-2016 18-49-32.gif](https://qiita-image-store.s3.amazonaws.com/0/67575/8f263746-b50f-e24b-6e02-8fb0e235c7f3.gif)


##LerpUnclamped(Vector3 a, Vector3 b, float t)
Leap関数のtに対する01補正がないバージョン。


##Slerp(Vector3 a, Vector3 b, float t)
球状に２つのベクトルが補完される点においてLeap関数と違う。
![12月-28-2016 18-52-44.gif](https://qiita-image-store.s3.amazonaws.com/0/67575/21673106-8f6f-1ecf-08b1-1593a12af756.gif)

##SlerpUnclamped(Vector3 a, Vector3 b, float t)
Slerp関数のtの01補正がない関数

##MoveTowards(Vector3 current, Vector3 target, float maxDistanceDelta)
currentからtargetに向かってcurrentを移動させる関数
currentとtargetの距離がmaxDistanceDelta以下ならtargetをそのまま返す。
maxDistanceDeltaを超えていたらcurrentからtarget方向に向かってmaxDisntaceDelta分進めたベクトルを返す。




#Tips

###Indexでxyzパラメータにアクセスできる

```
        Vector3 hoge = new Vector3(0, 1, 2);
        float x = hoge[0];
        float y = hoge[1];
        float z = hoge[2];
```

indexに0,1,2以外を入れるとエラーが起きるので注意。
JPAの基礎2

# Entityクラス

### Entityクラスとは？
Entityクラスとはデータベースのテーブルに対応するクラスです。リレーショナル・データモデルにおける「エンティティ(実体)」を表現するクラスと考えることができます。

重要）JPAにおいて管理対象とするテーブルは、必ず対応するEntityクラスを作成しなければなりません。

### Entityクラスの作成
##### クラスの宣言
Entityクラスは「@javax.persistence.Entity」アノテーションを付けたPOJO（JavaBeans）クラスとして作成する必要があります。また通常はjava.io.Serializableインターフェイスをimplementsします。

```java:クラス名とテーブル名が同じ場合のEntityクラスの宣言
@Entity
public class ClassName implements Serializable {
    // ...
}
```

クラス名がテーブル名と完全に同じ名前であれば、対応するテーブルと自動的にマッピングされますが、テーブル名とクラス名が異なる場合には「@javax.persistence.Table」アノテーションを使用してname属性にテーブル名を明示的に指定する必要があります。

```java:クラス名とテーブル名が異なる場合のEntityクラスの宣言
@Entity
@Table(name="table_name")
public class ClassName implements Serializable {
    // ...
} 
```

##### フィールドの宣言
Entityクラスでは、テーブルの主キー列に対応するフィールドを宣言する必要があり、その主キー･フィールドに対して「@javax.persistence.Id」を指定しなければなりません。

主キー･フィールドの宣言において可能なデータ型は以下に示す型となります。

* プリミティブ･タイプおよびそのラッパー･クラス
* java.lang.String
* java.util.Dateおよびjava.sql.Date
* java.math.BigDecimal, java.math.BigInteger
* 単一の@javax.persistence.Id
* 複数の@javax.persistence.Idおよび単一の@javax.persistence.IdClass
* 単一の@javax.persistence.EmbeddedId

主キー列以外の列に関してはマッピングは任意となります。クラス名とテーブル名の規則と同様、フィールド名と列名が完全に同じ場合には自動的にマッピングされることになります（デフォルト･マッピング･ルール）。

例として本の著者を表すEntityクラス「Author」（Authorテーブルに対応）であれば以下のようになります。

```java:Author.java
@Entity
public class Author implements Serializable {
    
    @Id
    private Integer id;

    private String name;
}
```

フィールド名と列名が異なる場合には自動的にマッピングされないため、マッピングするためにはフィールドに「@javax.persistence.Column」アノテーションを付け、name属性にテーブル名を指定する必要があります。例えばテーブルの列名が「author_name」で、Entityクラスのフィールド名を「name」にするためには以下のように記述する必要があります。

```java:Author.java
@Entity
public class Author implements Serializable {
    
    @Id
    private Integer id;

    @Column(name="author_name")
    private String name;
}
```

[Columnアノテーション](https://docs.oracle.com/javaee/7/api/javax/persistence/Column.html)

##### 日付/時間型のマッピング

##### 列挙型のマッピング
列挙型フィールドのマッピングには「@javax.persistence.Enumerated」アノテーションを使用します。

##### 主キーの自動生成
Fusion360 で内歯車やラック＆ピニオン機構を扱う

# 背景
クラウドベースCADツール Fusion360 上で内歯車やラック＆ピニオン機構を扱いたい。
Fusion360 で歯車を作るには SpurGearスクリプトを使うと簡単だが、これは平歯車は作れるが内歯車やラック＆ピニオン機構は作れない。
そこで、Web上で内歯車やラック＆ピニオン機構のDXFファイルを作成できるサイト[Involute Spur Gear](http://hessmer.org/gears/InvoluteSpurGearBuilder.html)を使うことにした。
幾つか注意点があったので備忘録として記す。

# 大まかな流れ
1. Involute Spur Gearでギアを作成。DXFファイルをダウンロードする
1. InkscapeでDXFファイルを開き、ファイル名を変えてDXFファイルで保存する。
1. Fusion360で、Inkscapeで保存した方のDXFファイルを読み込む。

# Involute Spur Gear Builder
http://hessmer.org/gears/InvoluteSpurGearBuilder.html
歯車の設計ができるWebサイト。ブラウザ上でピッチ・歯数などのパラメータを入力するとDXF形式の歯車を作成しダウンロードできるようになる。

ポイントは以下。

- ２つ一組の歯車を作れる。それぞれのパラメータと、両者に共通のパラメータとが有る。
- 片方の歯車の歯数（ToothCount) を正の値にすれば平歯車、負の値にすれば内歯車、0にすればラックが作れる。
- 後述するInkscapeでデータをインポートしたとき、次のように図が崩れるケースがある。
    1. Show:パラメータで"Wheel 1 Only"または"Wheel 2 Only" を選択すると、内歯車の内側の歯の部分が無くなる。"Wheel 1 and Wheel 2" を選んだ方が無難。  
    1.  Wheel2側を内歯車にすると、二つの歯車が結合した状態で出力されてしまう。内歯車はWheel1側にすること。
    1.  Wheel2の軸穴が無くなる。なのでWheel2に軸穴が必要なときは同じパラメータの歯車２つのDXFを別途作ることで対処する。


# InkscapeでのDXFファイル編集
Involute Super Gear BuilderからダウンロードしたDXFファイルをそのままFusion360にインポートしようとするとエラーが出る。
DXFファイルのフォーマットにはバージョンが多数あり、Fusion360が許容するフォーマットになっていないためと思われる。
そこでベクトル画像編集ソフトInkscapeでDXFファイルを作り直す。

手順は以下

1. ダウンロードしたDXFファイルをInkscapeで開く
1. 期待どおりの図になっている事を確認。前述のようなデータ崩れが起きてないかチェック。
1. [ファイル]→[名前をつけて保存]で別名で保存する。このとき[ファイルの種類]で"デスクトップ カッティングプロッタ(R13)(*.dxf)"を選択する



# Fusion360へのインポート
Inkscapeで保存したほうを使えば上手くインポートできる。


# 補足
今回はFusion360へのインポートを扱ったが、Illustratorでも同様にDXFファイルがインポート出来ない現象が発生し、Inkscapeを経由するとうまくできた。
いろいろと応用が効くかもしれない。

# 謝辞
Involute Spur Gear Builder の作者であるRainer Hessmer氏に多謝。なかなか同種のツールが見つからず、内歯車設計用のスクリプトを自作しないといけないと思ってたので。
JPAの基礎1

# JPAの概要
### JPAとは？
JPAは「[Java Persistence (JSR 338)](https://jcp.org/en/jsr/detail?id=338)」の略称であり、**Java EE標準のO/R MappingおよびDAOの技術仕様**です（元々の名称は「Java Persistence API」であり、その略称「JPA」が現在でも一般的に使用されているため、このドキュメントでも「JPA」という名称を使用します）。

現行のJava EE 7に含まれるバージョンは「2.1」

JPAはJava EEの「Enterprise Application Technologies」に含まれる技術仕様ですが、Servlet/JSPやEJBなどと異なり、コンテナ･ベースのアーキテクチャを採用していないため**Java SEでも利用可能**です。

### JPAの代表的な実装
JPAの代表的な実装には以下に示すものがあります。

* [EclipseLink](http://www.eclipse.org/eclipselink/)
* [Hibernate ORM](http://hibernate.org/orm/)
* [Apache Open JPA](http://openjpa.apache.org/)

「EclipseLink」は元々Oracleが開発し、eclipse.orgに寄贈したJPAのRIです。また「Hibernate ORM」はJPA仕様のオリジナルとなったORM Frameworkであり、実質この2つの実装の何れかを使用するのが一般的です。

「EclipseLink 2.5」以降および「Hibernate ORM 4.3」以降のバージョンはJPA 2.1に対応していますが、「Apache Open JPA」の現行バージョン「2.x」はJPA 2.0にしか対応していません（JPA 2.1対応バージョンは現在開発中です）。

# JPAの構成要素
最初にJPAのテクノロジーを構成する主な要素を簡単に見ておきましょう。

##### ● Entity
「**永続化オブジェクト**」を表します。具体的にはデータベースのテーブルと1対1で対応する「
Javaのクラス（Entity Class）」およびその「インスタンス（Entity Object）」です。
#### ● Entity Manager
Entityオブジェクトのライフサイクル管理とDAO機能を提供します。
#### ● Persistence Context
「永続化コンテキスト」を表します。
#### ● Persistence Unit
Persistence Contextを生成します。
#### ● Transaction
「トランザクション」を表します。
#### ● JPQL(Java Persistence Query Language)
JPA専用の問い合わせ言語です。SQLによく似た言語であり、Entityの型を識別することにより、型安全な問い合わせを記述することができる仕組みが提供されています。

# JPAの設定ファイル
JAPでは以下に示すような「**persistence.xml**」と呼ばれるXML形式のファイルを用いて、データベースとの接続情報などの基本設定を記述します。

```XML:persistence.xml
<?xml version="1.0" encoding="UTF-8"?>

<persistence version="2.1"
	xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">

	<persistence-unit name="JPAExample">
	
		<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
		
		<class>entity.Author</class>
		
		<properties>
			<property name="javax.persistence.jdbc.url"	value="jdbc:mysql://localhost:3306/test?useSSL=false&amp;serverTimezone=Asia/Tokyo" />
			<property name="javax.persistence.jdbc.driver" value="com.mysql.cj.jdbc.Driver" />
			<property name="javax.persistence.jdbc.user" value="root" />
			<property name="javax.persistence.jdbc.password" value="mysql" />
		</properties>
		
	</persistence-unit>

</persistence>
```

#### persistence
persistence.xmlドキュメントのルート要素であり、JPAのバージョンや名前空間の参照などを記述します。

#### persistence-unit
persistenceの直接の子要素であり、単一の永続化対象を表します。具体的には1つのデータベースへの接続情報と関連するプロパティの設定です。このpersistence-unitでは「name」属性の記述が必須であり、この名前を用いて「persistence-unit」を一意に識別します。

#### provider
persistence-unitの子要素であり、使用するJPAプロバイダーを記述します。JPAプロバイダーとは「JPAの実装」のことであり、上記例ではEclipseLinkを使用する場合の記述となっています。

#### class
persistence-unitの子要素であり、このユニットでの管理対象とするEntityクラスを記述します。

#### properties
データベースの接続に関連する情報を記述します。具体的にはJDBC URIやユーザー名、パスワードなどです。また、実装固有の設定情報を記述することもできます。
シェルスクリプト——こんなとき、かうする

POSIX シェルの小ネタ集。随時更新。

POSIX の範囲外の機能に依存するところには 【non-POSIX】 と書いておいた。

# ファイル操作
## 空のファイルを作る

`touch` でもいいがリダイレクトした方が速い。

```bash
>> filename # 既存ファイルは上書きしない (ファイルの更新日時も変へない)
>| filename # 既存ファイルは空にする
>  filename # -C が有効なら既存ファイルがあるとエラーになる
```

# フィルタ

## ソートして重複行を消す

`sort | uniq` でもいいが `sort -u` だと一コマンドで済む。

## ソートせずに重複行を消す

`awk '!x[$0]++'` [^uniq_nosort]

[^uniq_nosort]: [UNIX Command Line: Remove duplicates without sorting file - BASH](http://www.unixcl.com/2008/03/remove-duplicates-without-sorting-file.html)

## 行番号を付加する

`awk '{print ++i,$0}'`
【non-POSIX】 `cat -n`

## 一行目だけを消す

`tail -n +2`
`sed 1d`

## 最後の行だけを消す

`head -n -1`
`sed \$d`

## n 行目だけを出す

`sed -n 5p` (5 行目だけを出す)
`sed -n 4,6p` (4 行目から 6 行目だけを出す)

## 行の順序を逆にする

`sed -n '1h;1!{x;H;};${g;p;}'` [^tac]
`awk '{line[NR]=$0} END {for (i=NR; i>=1; i--) print line[i]}'` [^tac]
【non-POSIX】 `tac`

[^tac]: [shell script - Reverse sequence of a file with POSIX tools? - Unix & Linux Stack Exchange](http://unix.stackexchange.com/q/280685)

## 一行づつ読み込んで、それぞれを引数として特定のコマンドを実行する

空白でも区切られるとか `"` や `\` がエスケープになるとかを気にしないのであれば

```bash
xargs -n 1 [command]
```

厳密に各行をそのまま読み取ってコマンドに渡したいときは

```bash
while IFS= read -r line; do
  [command] "$line"
done
```

# 文字列操作

## 不特定の文字列を出力する

`echo` を使ふと実装によっては先頭のハイフンがオプションと見做されたりバックスラッシュがエスケープと見做されたりして思ひ通りに出力されないことがある。`printf` を使った方が良い。

```bash
printf '%s\n' "${any_char}"
```

## 文字列が glob パターンに一致するか調べる

`case` を使ったマッチングはあまり見慣れないかもしれないがどんなシェルでも使へる。

```bash
case abc in (a*c)
    echo matched!
esac
```

【non-POSIX】`[[ ... ]]` 文は一部のシェルでしか使へない。`[[ ... ]]` の代はりに `[ ... ]` を使ってはいけない。

```bash
if [[ abc = a*c ]]; then
    echo matched!
fi
```

## 文字列が正規表現に一致するか調べる

`grep` の終了ステータスで一致したかどうかがわかる。

```bash
if echo abc | grep -q 'a.*c'; then
    echo matched!
fi
```

【non-POSIX】`[[ ... ]]` 文は一部のシェルでしか使へない。`[[ ... ]]` の代はりに `[ ... ]` を使ってはいけない。

```bash
if [[ abc =~ a.*c ]]; then
    echo matched!
fi
```

# パス操作

## 不特定のパスに相対パスを連結する

`"${base%/}/${rel}"` 詳細は[別記事](http://qiita.com/magicant/items/03c1fd1f1296f3e58171)を見よ。

## 相対パスを絶対パスにする

【non-POSIX】でも良ければ `readlink` といふコマンドが使へる。

POSIX 範囲内で頑張るには、`cd` で対象のディレクトリーに移動した後 `pwd` で絶対パスを出力する。パスがディレクトリーでない場合はその前に `dirname` と `basename` でパスを分割しておく。

```bash
abs_dir=$(cd "./$rel_dir" && pwd -P)
```

# シェル実行環境操作

## 一時的に別のディレクトリーで作業する

`cd -` で一つ前のディレクトリーに戻れる。ただしスタックを pop するかの様に複数回戻ることはできない。

```bash
cd foo
# foo ディレクトリーで作業...
cd -
# 元のディレクトリーで作業...
```

サブシェルなら入れ子にできる。ただしサブシェル内で代入した変数などを外側で使ふことはできない。

```bash
(
cd foo
# foo ディレクトリーで作業...
(
cd bar
# foo/bar ディレクトリーで作業...
)
# foo ディレクトリーで作業...
)
# 最初のディレクトリーで作業...
```
Performance_schema のステートメント情報を保持する仕組み

以下のマニュアルのように、MySQL5.6でPerformance_schemaが大幅に強化されたことに伴い、
スロークエリの分析などにもパフォーマンススキーマステートメントイベントテーブルの利用が
推奨されるようになりました。
その仕組みに関して調べたので、メモとして残しておきたいと思います。

https://dev.mysql.com/doc/refman/5.6/ja/performance-schema-statement-tables.html

その際に利用する3テーブルの違いは以下の通りです。

*・ events_statements_current*
スレッド毎の最新のSTATEMENTSの情報を保持している

*・ events_statements_history*
スレッド毎の最新のSTATEMENTSの情報をX個まで保持している
（Xの値はperformance_schema_events_statements_history_size変数で制御）

*・ events_statements_history_long*
全体の最新のSTATEMENTSの情報をX個まで保持（スレッド毎ではない）している
（Xの値はperformance_schema_events_statements_history_long_size変数で制御）

これらの3テーブルには、以下のような仕組みで情報が蓄積されているようです。

1. クエリが実行されると、その情報は即座にcurrentテーブルに記録される
2. 次のクエリが実行されると、その前の情報はcurrentテーブルからhistoryテーブルに移動する
3. X個の上限に達した場合は、historyテーブルから古いクエリ情報がDROPされる
4. また、history_longテーブルの上限値に達した場合も、クエリ情報はDROPされる

つまり、historyテーブル と history_longテーブル はそれぞれ、「情報蓄積」の役割を果たし、
これらがあるために過去のクエリ情報を参照することが出来ます。

ただし、デフォルトではevents_statements_currentテーブルのみが有効になっています。
そのため、historyテーブル および history_longテーブル に関しては、システムの特性や
どのような情報を保持したいか、によって随時変更することが推奨されます。

例えば、常に複数スレッドが並行して動くようなシステムの場合は、historyテーブル の保持数を
上げると良く、バッチがメインのシステムの場合は、history_longテーブル を重要視すると良いはずです。

また、上限値（X）を定める各種変数に関しては、デフォルトでは「-1」（= <font color="Red">auto-sized</font>）となっており、起動時に自動的に値を設定します。
一方、MySQL5.7では「-1」（= <font color="Red">auto-scaled</font>）であり、動的に上限値が変動するようです。

なお、これらのパラメータ変数は動的変更が出来ないため、変更する場合はmy.cnfに明記してMySQL再起動が必要です。
【SpriteKit】シーンサイズとデバイス画面サイズの合わせ方

#この記事について
SpriteKitでゲームを開発する際に、数年前はXcodeのGUIを使わずにガリガリとコーディングするのが当たり前でしたが、最近はGUIによるアシストが充実してきて、Unityっぽく開発ができるようになりました。
この記事では、`SpriteKit`でゲーム開発をする際の最初の一歩である「ビューにシーンを表示する」部分に焦点を当てました。

##ビューとシーン
`UIKit`でアプリを開発する場合、ルートビューにどんどんビューを乗せていくカタチになります。
この時のルートビューとは`UIView`クラスであり、サブビューは主に`UIView`のサブクラスだったりします。

対して`SpriteKit`でのゲーム開発では、ルートビューは`SKView`になります。
また、ゲーム自体はシーンと呼ばれる`SpriteKit`の`SKScene`クラス内で描画されます。
つまり、`SKView`（ビュー）に`SKScene`（シーン）を表示させることになります。

このとき、ルートビュー`SKView`はデバイス画面サイズになっているわけですが、シーン`SKScene`は開発者が適切な寸法にリサイズしてあげる必要があります。

#動作環境
Swift3.0.1
Xcode8.2
iOS10.2

#プロジェクト準備
iOSの`Single View Template`で新規プロジェクトを作成
`ViewController.swift`ファイルの名を`GameViewController.swift`に変更（ナビゲータエリア）
クラス名を`ViewController`から`GameViewController`に変更（エディタエリア）
ビューコントローラのルートビューを`SKView`に変更（インスペクタエリア）

##GameSceneクラスを定義
メニューバーから「File > New > File... > iOS > Cocoa Touch Class」を選択して、`GameScene.swift`として保存

```ruby:GameScene.swift
import SpriteKit

class GameScene: SKScene {
    // something to do
}
```

##新規シーンファイルを作成
メニューバーから「File > New > File... > iOS > Resource > SpriteKit Scene」を選択して、`GameScene.sks`として保存

##アンカーポイントとサイズ
図. 新規作成したシーンのファイル
<img width="772" alt="スクリーンショット 2016-12-28 17.28.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/70476/48c35195-922e-1565-ab6c-c2a331469012.png">
サイズ（w:750, h:1334）, アンカーポイント（X:0.5, Y:0.5）になっています。
サイズはiPhone7の4.7インチの状態、アンカーポイントはシーンの中央にある十字印です。
ちなみに、4.7インチのビューコントローラではビューのサイズは（X:375, Y:667）です。
シーンはピクセル単位、ビューコントローラはポイント単位になっていることがわかります。


#シーンを表示する
この状態でシーンをビューに表示すると、どんな風に見えるでしょうか。
シーンに表示する適当な画像を用意します。

図.適当な画像（background.png）
![background.png](https://qiita-image-store.s3.amazonaws.com/0/70476/6fa96fa4-9e0f-5fc4-8d9a-ec5c7b4e31ac.png)
画像をプロジェクトにインポートして、シーンにドラッグ&ドロップで配置します。
シーンに画像を配置すると、スプライトノードになります。
スプライトノードは、シーンいっぱいに広げて枠とピッタリになるようにしておきます。

図.シーンに配置されたスプライトノード
<img width="944" alt="スクリーンショット 2016-12-28 17.56.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/70476/a6e61ab6-7800-1690-4558-a65d257791f0.png">

このシーンは、iPhone7（4.7インチ）の画面サイズになっています。
以下のように記述して、シミューレータに表示して見ましょう。

```ruby:GameViewController.swift
import UIKit
import SpriteKit

class GameViewController: UIViewController {

    let gameScene = GameScene(fileNamed: "GameScene")
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        if let skView = view as? SKView {
            skView.presentScene(gameScene)
        }
    }
    
}
```

###ビルド
シミュレータはiPhone7を選択します。
![スクリーンショット 2016-12-28 18.08.11.png](https://qiita-image-store.s3.amazonaws.com/0/70476/8ddbc9f4-ce85-526d-eeb4-7bbdb9d6f225.png)

中央に寄ってしまって、全体が表示しきれていません。
次のようにコードを修正しましょう。

```ruby:GameViewController.swift
class GameViewController: UIViewController {

    let gameScene = GameScene(fileNamed: "GameScene")
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        if let skView = view as? SKView {
            gameScene?.scaleMode = .aspectFill
            skView.presentScene(gameScene)
        }
    }
    
}
```

![スクリーンショット 2016-12-28 18.11.57.png](https://qiita-image-store.s3.amazonaws.com/0/70476/f5244707-10f0-744b-5518-4a962d0d5df1.png)


これで、シーンをビューにピッタリ合わせて表示できるようになりました。
Power BI チュートリアル 導入編

弊社にて、普段可視化ツールとして使っているPowerBIですが、まだ普及しているというにはほど遠く、分析チーム周りの人がちょくちょく使うという程度です。社内全般に広めれば、各部署での細かい課題まで、現場で課題ブレークダウン、分析、アクションプランまで行えるため、業務効率の向上が見込まれます。

そこで、年末のく〇忙しい時に、社内で有志を募ってPowerBIチュートリアルを行いました。ハンズオンまで用意したのですが、やはりWeb系の会社はMacが多い、多い。知っていて言っているけど、こういう場にくると際立って気になる。まあ、そんな事はお構いなく、PowerBI普及を進めます！（どういうつもりだ？）

以下がチュートリアルで使った、スライドです。データも用意してあります。

[http://www.slideshare.net/omasutani/power-bi-70490792:embed]([http://www.slideshare.net/omasutani/power-bi-70490792:embed])

社内で興味を持った方は、分析T、マーケティングT、営業T、開発T、と比較的普段データと向き合っている方が当然多く、勉強熱心な方が多いと関心しました。Excelを使いこなせていれば、難なく使えるPower BIですので、いろいろな部署の人が使い始めて、その魅力が増してくるはずです。

今回は、まっさらな状態から始める人向けに作りましたので、データ可視化までの簡単なワークフローを追うだけになっていますが、あえて、数値データでない扱いにくいデータを対象にしています。
（時節柄、紅白歌合戦のデータを見てみたくて、そうなったとかもしれない）

通常の数値データでの分析とは違う以下の要素が入っているので、初心者が初めてしばらくして躓く点を押させているかと思います。

- 文字列データ（勝敗、人名など）の数値へのマッピング
- Webスクレイピング（資料では割愛されていますが）
- On the flyなグループ化（最近のアップデートで導入されたレポートでのグループ化メニュー）
- nominalと数値の相関分析（散布図よりも棒グラフの方がわかりやすい）

以下にチュートリアルで作ったレポートを公開しておきます。

[Power BI レポート](https://app.powerbi.com/view?r=eyJrIjoiMzIyM2VkYzktNjdhZi00OTY2LTkwNzQtY2I2MjRlODA3ODI3IiwidCI6IjY5OTI4MWIzLWY0MjgtNGFkYi1hM2E5LTZlZGVmZTM5NDQ4NSIsImMiOjEwfQ%3D%3D)

今後はチュートリアルというよりも、個別に対応することが多いかもしれませんが、社内のデータリテラシ向上は分析の質の向上につながるので、今後もこういった活動を続けてみたいと思います。

<iframe src="//www.slideshare.net/slideshow/embed_code/key/o73rfkUokw48nD" width="595" height="485" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> <div style="margin-bottom:5px"> <strong> <a href="//www.slideshare.net/omasutani/power-bi-70490792" title="Power BI チュートリアル　導入・初級編" target="_blank">Power BI チュートリアル　導入・初級編</a> </strong> from <strong><a target="_blank" href="https://www.slideshare.net/omasutani">Osamu Masutani</a></strong> </div>
gulpfileをTypeScriptで書く

手っ取り早くgulpfileをTypeScriptで書く方法です

1. `gulpfile.ts`としてTypeScriptでタスクを書く
2. `gulpfile.js`に以下を書く

```javascript
eval(require('typescript').transpile(require('fs').readFileSync('./gulpfile.ts').toString()));
```
外積の向きの覚え方

外積の向きの覚え方は２つある。

##外積の向きその1
外積計算で使った1つ目のベクトルを視点にして、2つ目のベクトルを時計方向に90度移動させる。移動させた後のベクトルが外積の向きになっている

##外積の向き その2
手をフレミングの形にして、
親指を外積計算で使った１つ目のベクトルに、人差し指を2つ目のベクトルに合わせる。中指の方向が外積の向きになっている。
*左手座標系のときは左手を、右手座標系のときは右手を使う
マネーフォワードでAPI連携できる連携先一覧

## API連携できる金融サービスが増えてきた

今年は住信SBIネット銀行を皮切りに、銀行とのAPI連携が進んだ年でした。

- [マネーフォワード、住信SBIネット銀行提供のAPIとの公式連携を開始 ～より利便性が高く、より強固なセキュリティレベルを実現～ | 株式会社マネーフォワード](http://corp.moneyforward.com/service/pfm/20160325-mf-api-sbi/)
- [マネーフォワード、静岡銀行のお客様に向けた『マネーフォワード for 静岡銀行』を提供開始～NTTデータのインターネットバンキングAPIを国内初導入の自動家計簿・資産管理サービスをリリース～ | 株式会社マネーフォワード](http://corp.moneyforward.com/service/20160412-mf-shizugin/)
- [マネーフォワード、群馬銀行のお客様に向けた『マネーフォワード for 群馬銀行』を提供開始〜NTTデータのインターネットバンキングAPIを導入したPFMサービスとして国内2例目～ | 株式会社マネーフォワード](http://corp.moneyforward.com/service/20160627-mf-gunmabank/)
- [マネーフォワード、NTTデータが提供する法人向けインターネットバンキングAPIを導入～2016年度を目途に、総合振込等の申請業務まで対応範囲を拡大予定～ | 株式会社マネーフォワード](http://corp.moneyforward.com/service/20160726-mf-nttdata-openbank-api/)
- [マネーフォワード、国内で初めて法人向けインターネットバンキングのAPI連携を開始 みずほ銀行の『みずほビジネスWEB』と『MFクラウドシリーズ』が連携 | 株式会社マネーフォワード](http://corp.moneyforward.com/service/20161017_mfpress_mizuhoapi/)

そこで、現時点(2016/12/28)でAPI連携できているサービスをまとめてみました。

## マネーフォワードでAPI連携できるサービス

### 銀行

- [住信SBIネット銀行](https://www.netbk.co.jp/wpl/NBGate)
- [群馬銀行](http://www.gunmabank.co.jp/)
- [静岡銀行](http://www.shizuokabank.co.jp/)
- [みずほ銀行(法人)](https://www.mizuhobank.co.jp/corporate/index.html)

### クレジットカード

- [セゾンカード](http://www.saisoncard.co.jp/)
- [クラブ・オン／ミレニアムカード セゾン](http://www.7cs-card.jp/)

### その他

- [LOHACO](https://lohaco.jp/)
- [bitFlyer](https://bitflyer.jp/)

## まだまだこれから

2602あるという連携可能サービス数からするとまだまだほんの一部ですが、これからAPI連携できるサービスは増えていくと思われますので、どうぞご期待ください。

マネーフォワードでは金融サービスの未来を作っていく仲間を募集中です!
[マネーフォワード採用サイト](https://recruit.moneyforward.com/)
JavaFX　ComboBoxのshowメソッド使用時にハマった事象と強引な解決方法

# 初めに
　JavaFXにて、編集可能なComboBoxを用いて、以下のようなサジェストリスト表示を実装しようとした際の話。

![01.png](https://qiita-image-store.s3.amazonaws.com/0/124561/2c66ddfc-fdea-998f-cab4-cda00c0c081d.png)


# 事象について

## 発生した環境
 - OS：Windows7 Service Pack1 (32bit、64bit問わず)
 - Javaのバージョン：バージョン8　更新101

## 発生事象の詳細
　画面下部に、リストを表示するために必要な領域が足りない場合、コンボボックスの上部に表示される事を期待したが、コンボボックス本体の上に被さって表示された。（JavaFXのComboBoxは、そのような場合に、標準的にコンボボックスの上部に表示してくれるため、同様の動作となることを期待した。）

 - 期待する表示
  ![02.png](https://qiita-image-store.s3.amazonaws.com/0/124561/9b91e90c-ea30-c3ce-51d6-9010dcf79d49.png)

 - 実際の表示
  ![03.png](https://qiita-image-store.s3.amazonaws.com/0/124561/617b49a2-d4bc-84f7-8d4b-746525aaf6a6.png)

## 実装
　コンボボックスのテキスト変更毎に、以下のようにサジェスト表示のリストを更新し、showメソッドでコンボボックスのリストを再表示させる実装とした所、前述の事象が発生した。

```Java
// サジェスト表示のリストを作成
List<String> list = ListData.stream().filter((t) -> {
    return (t.contains(s))? true : false;
}).collect(Collectors.toList());

// 一旦、コンボボックスのリストを閉じる
ComboBox.hide();

// コンボボックスのリストを全削除し、今回作成したサジェスト表示リストを設定
ComboBox.getItems().clear();
ComboBox.getItems().addAll(list);

// コンボボックスのリストを再表示する
ComboBox.arm();
ComboBox.show();
```

# 解決方法
　コンボボックスのリストを再表示する箇所で、表示⇒閉じる⇒もう一度表示という手順を取ると、なぜかうまく表示された。

```Java:修正前
// コンボボックスのリストを再表示する
ComboBox.arm();
ComboBox.show();
```

```Java:修正後
// コンボボックスのリストを再表示する
ComboBox.arm();
ComboBox.show();
ComboBox.hide();
ComboBox.arm();
ComboBox.show();
```

　コンボボックスのshowメソッドを用いてリストを表示させる場合の作法として、修正前コードに何か誤りがあるためなのか、単純にJavaFXフレームワークのバグなのか、現時点では不明。
　ご存知の方がいらっしゃいましたら、コメントいただけると幸いです。
cygwin環境下でgit difftoolに「WinMerge」を使用する

`git difftool`の際に外部diffツールを使用する方法はググればたくさん見つかりますが、どうにもうまくいかなかったのでその解決方法をまとめます。  
ちなみにうまくいかなかった原因はwindows向けのGitbashではなくcygwin環境下にあるbashを使用しているので、パスがうまく解決できなかったからだと思います。

# .gitconfigの設定

ググって色々見つかる情報と何が違うかというと、`cygpath`コマンドを経由していること。

```Bash:.gitconfig
[diff]
	tool = WinMergeU
	guitool = WinMergeU
[difftool "WinMerge"]
	cmd = 'D:/WinMerge/WinMergeU.exe' -f '*.*' -e -u -dl 'WorkTree' -dr 'Repository' -wr \"`cygpath -w $REMOTE`\" \"`cygpath -w $LOCAL`\" 
[alias]
        windiff = difftool -y -d -t WinMerge
```

## オプションなどについて解説
* `[diff]`と`[difftool]`  
おそらく`[difftool]`は`[diff]`セクション内に記載した`tool`の具体的な設定として機能する。今回の例だと`WinMerge`というaliasを設定しているのだと思われる。
* WinMerge起動時のオプション  
`f`：フィルタ。全ファイルを対象  
`e`：escで閉じるを有効  
`r`：再帰  
`u`：「最近使用した・・・」の履歴にパス情報を追加しない  
`dl`：左側タイトルバー。作業ツリーとわかる様な名称を自由に設定する  
`dr`：右側タイトルバー。リポジトリに登録されているソースとわかるような名称を自由に設定する  
`wr`：右側を読み取り専用。左側を作業ツリーとするので右側を編集することはありえない  
※`Alt+←`等の操作で修正対象を間違えることのないようにこの設定を入れています。  
`$LOCAL,$REMOTE`：リポジトリに登録されているソースとインデックス領域にあるソースを示す定数？？  
※`git difftool --help | grep '\$'`を見たがいまいちピンとこない。。。
* aliasについて  
`y`：起動しますか？にyesで答える  
`d`：ディレクトリ単位で  
`t`：外部ツール使用
PowerShellからSlackのにIncoming Webhooksを使って投稿

PowerShell の場合、内部は UTF-16 なので、UTF-8 に変換してリクエストを投げる必要がある。
ネットで調べても正しい情報が見つからなかったが、いくつか試行錯誤の結果わかった。

ConvertTo-Json した後、[System.Text.Encoding]::UTF8.GetBytes で変換すればよい。

```
$output = 何かの処理の結果の配列など
$webhook = "https://hooks.slack.com/services/XXXXXXXXX/XXXXXXXXX/XXXXXXXXXXXXXXXXXXXXXXXX"

$message = $output -join "`n"
$payload = @{ 
    channel = "#random";
    text = $message;
}
$json = ConvertTo-Json $payload
$body = [System.Text.Encoding]::UTF8.GetBytes($json)
Invoke-RestMethod -Uri $webhook -Method Post -Body $body
```
覚えやすいパスワードを生成するコマンド sf-pwgen（macos 用）

こんにちは。
[sf-pwgen](https://github.com/anders/pwgen) というコマンド（macos 用）を用いてパスワード候補を生成してみました。pwgen [^1] に比べて幾分覚えやすい候補が得られるそうです。
[^1]: 「[Macで安全なパスワードを作成するコマンド](http://qiita.com/saito400/items/a70e6548f27f85c73496)」

これを使って英字大文字小文字数字記号を含む条件のものを出力させてみました（文字数=8、候補数=12）。

```console
$ brew install sf-pwgen
$ sf-pwgen -a memorable -l 8 -c 100 | grep [a-z] | grep [A-Z] | grep [0-9] | grep "[\-\/:;()\\\&@\"\.,\?\!']" | head -n 12
 :
 :
Mac0.OSX
 :
 :
```
【Rspec】メソッド内で呼び出しているメソッドの返却値をモックを使って指定したい

云年ぶりにRubyやらRailsやらSpecやら触ってわりと苦戦したのでメモ
## やりたいこと
Rspecでのテスト時に下記ソースのhugaメソッドの返り値を指定したい

```ruby:test.rb
def hoge
  opt = true
  huga(opt)
end

def huga(option)
  return false if option.nil?
  option
end
```

## 結論
ここに書いてあった
[stub, mocksでインスタンスメソッドの返り値を指定しようとしたときにハマった話](http://qiita.com/shinji1105/items/ea234d337b46d23444ae)

そして完成したコードがこちら

```ruby:test_spec.rb
describe Test do
  describe 'hogehoge' do
    context 'hogehoge' do
      it 'HOGEメソッドで呼ばれるhugaの返り値がFlase' do
        # hugaの返り値をFalseに設定する
        allow_any_instance_of(Test).to receive(:huga) { false }
        expect(return_project).to eq false
      end
    end
  end
end
```



2017/01/04追記
@jnchitoさんよりいろいろと指摘いただきました。
記事内で編集しようかとも思いましたが、コメントに全て書いていますので、参考にされる方はそちらを見たほうがいいかと思います。
Colorboxで開いたYouTube動画を再生終了後に自動で閉じる方法


##やりたいこと

* ページを表示したときにyoutubeをモーダルで開く
* モーダルはcolorboxを使用
* youtubeの再生が終わったら自動で閉じる
* ２度目以降に再生したら自動で閉じないようにする

##実装
jQueryとColorboxを読み込みます。

モーダルの表示にはColorboxを使用します。
下記よりダウンロードしたファイル群を読み込みます。
https://github.com/jackmoore/colorbox

Colorboxの使い方は割愛します。

```index.html、modal.html
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script src="js/jquery.colorbox.js"></script>

<link rel="stylesheet" type="text/css" href="css/colorbox.css" />
```

親側のhtmlには下記を記述します。

```index.html
<script>
$(function(){
	$(".iframe").colorbox({iframe:true, open:true,innerWidth:"980", innerHeight:"620", scrolling:false});
});
</script>

<a href="modal.html" class="iframe">Movie Open</a>

```

モーダル側のhtmlには下記を記述します。

```modal.html
<script>

	// IFrame Player API の読み込み
	var tag = document.createElement('script');
	tag.src = "https://www.youtube.com/iframe_api";
	var firstScriptTag = document.getElementsByTagName('script')[0];
	firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);

	// YouTubeの埋め込み
	function onYouTubeIframeAPIReady() {
	    ytPlayer = new YT.Player(
	        'player', // 埋め込む場所の指定
	        {
	            width: 976, // プレーヤーの幅
	            height: 549, // プレーヤーの高さ
	            videoId: 'bHQqvYy5KYo', // YouTubeのID
	            playerVars: {
	                rel: 0, // 再生終了後に関連動画を表示するかどうか設定
	                autoplay: 1 // 自動再生するかどうか設定
	            },
	            // イベントの設定
	            events: {
	                'onStateChange': onPlayerStateChange // プレーヤーの状態が変更されたときに実行
	            }
	        }
	    );
	}

	// プレーヤーの状態が変更されたとき
	function onPlayerStateChange(event) {
		// 現在のプレーヤーの状態を取得
		var ytStatus = event.data;
		// 再生終了したとき
		if (ytStatus == YT.PlayerState.ENDED) {
			parent.$.colorbox.close();
		}
	}
</script>

<div id="player"></div>

```


##２度目以降は自動で閉じないようにする
cookieを使って処理します。
プラグイン「jquery.cookie.js」の読み込みを追加。

プラグインは下記よりダウンロードします。
https://github.com/carhartl/jquery-cookie

jQueryの読み込みよりも後に追加する。

```index.html、modal.html
<script src="js/jquery.cookie.js"></script>
```

onPlayerStateChangeの内容を書き換え。

```modal.html
	var loadMovieKey = $.cookie("loadMovieKey");

	// プレーヤーの状態が変更されたとき
	function onPlayerStateChange(event) {
		// 現在のプレーヤーの状態を取得
		var ytStatus = event.data;
		// 再生終了したとき
		if (ytStatus == YT.PlayerState.ENDED) {
			if(loadMovieKey != "played"){
				$.cookie("loadMovieKey", "played", { path: "/" });
				parent.$.colorbox.close();
			}
		}
	}
```





##参考
http://www.tam-tam.co.jp/tipsnote/javascript/post6217.html
Rust で文字列の n 文字目の文字を取得

Rust では文字列の `n` 文字目を取る場合は一旦 `.chars` で文字にバラす必要がある（`.chars` はイテレータを返すだけなのでほぼオーバーヘッドは無い）

```rust
let s = "abcdef";
let c = s.chars().nth(2);
assert_eq!(c, Some('c'));
```

バイト単位でなく文字単位でのアクセスなので，`n` 文字目にアクセスするには前から順に1文字ずつ手繰る必要があり O(n) かかるっぽい．バイト単位で良いなら `[u8]` とかにばらしてからアクセスすれば O(1) になる．

~~`.nth` は添字と引数の値が１ずれるので注意．~~ すみませんズレてませんでした…勘違いした．
Markdown記法の理解が不十分で絵文字機能も理解していなかった

# 背景
次の記事を投稿しました。
- [```[:mag:]```ってなに？](http://qiita.com/rrryutaro/items/295421b11babcd41104f#comment-5046ad478b27fd21e0b9)

記事を読んでいただければわかりますが、当初、Googleへの検索リンクへのリンクを表現するものと勘違いしていたのです。
そこにコメントを頂き、この記事を書くに至りました。

# 勘違いを起こした原因
さて、何をわかっていないのか。次のように自己判断しております。

- そもそものMarkdown記法への理解が不十分
- Markdown記法での、リンクに置き換わる記述式「```[リンクテキスト](URL)```」の理解が不十分
- Qiitaでの拡張？記述の知識

# 勘違いに至った経緯
次のような記事があったとします。（あくまで例です）
> はじめに
> 各セクションにおける説明の途中に、次のアイコン「:mag:」がある場合、クリックしていただくと、そのセクションに関するGoogleの検索結果を表示します。
> :
> 絵文字とは [:mag:](https://www.google.co.jp/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=%E7%B5%B5%E6%96%87%E5%AD%97%E3%81%A8%E3%81%AF)

これは面白いと思い、Markdown記法を参考にすると、次のようになっています。

```
はじめに
各セクションにおける説明の途中に、次のアイコン「:mag:」がある場合、クリックしていだくと、そのセクションに関するGoogleの検索結果を表示します。
:
絵文字とは [:mag:](https://www.google.co.jp/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=%E7%B5%B5%E6%96%87%E5%AD%97%E3%81%A8%E3%81%AF)
```

この際、```[:mag:]```がGoogleの検索結果へと飛ばす機能で、そのURLを```(URL)```とするものだと、盛大に勘違いします。

# 注意すべきだったポイント
```[]()``` となっているのですから、これはMarkdown記法でのリンクの記述ですよね。
その点を十分に理解していれば、```:mag:``` の部分は、別のルールによって置きかわることが判断できるはずです。

また、[Markdown記法 チートシート](http://qiita.com/Qiita/items/c686397e4a0f4f11683d)を十分に読み込んでいれば、```:```で囲われているのは絵文字を埋め込むものだとわかります。

しかし、```[:mag:]``` や ```:mag:``` で検索してみたり、Markdown記法でのページ内検索で ```:mag:``` を検索していました。
急がば回れ。読むべきルールはちゃんと読み込むべきでした。

そもそも、検索しても見つからないということは、```[:mag:]``` が単体で明確に定義された記述ではないことに気付くでしょうから、そこから考えを変えられたのでしょうが、思い込みから離れられませんでした。

# 最後に
こうした情報共有サイトにて投稿すれば、それに対してレスポンスが得られるため、いくら間抜けな投稿であってもそこから先につながると考えています。
発端となった記事も面白い機能と思っていたので喜び勇んで紹介していたとともに、コメントを頂けることを期待していました。
結果この記事を書くに至り、自分の理解不足を埋めることもできました。

記事を書いたことがない方は、ぜひ、日記であれ書くことをお勧めいたします。

# 参考サイト
- [Markdown記法 チートシート - 絵文字](http://qiita.com/Qiita/items/c686397e4a0f4f11683d#%E7%B5%B5%E6%96%87%E5%AD%97)
- [QiitaとQiita:Teamで絵文字が使えるようになりました！](http://blog.qiita.com/post/56323336361/qiita-emoji)
- [Qiita/Github/Slack/Discord 絵文字一覧](http://qiita.com/koukun/items/ae673f2bae8f1525b6af)

以上
Arduinoに温度センサを(LM35)つなぐ


[さくらのIoT Platform βを試してみる](http://qiita.com/lumbermill/items/5c951f38b152697f8ed5) の続きなので、Arduinoシールドが乗っていますが、直接つなぐ場合も同様です。シリアルにも出力していますが、さくらのIoTにも温度データを送信しています。

![IMG_2480.jpg](https://qiita-image-store.s3.amazonaws.com/0/50780/a85e73f8-9953-1eeb-f68c-a8537692a46f.jpeg "IMG_2480.jpg")

```
#include <SakuraIO.h>

SakuraIO_I2C sakuraio;

float a_in = 0;
float temp_c = 0;

void setup(){
  while((sakuraio.getConnectionStatus() & 0x80) != 0x80){
    delay(1000);
    Serial.print(".");
  }
  Serial.println("");
}

void loop() {
  a_in = analogRead(0);
  temp_c = ((5 * a_in) / 1024) * 100;
  sakuraio.enqueueTx(0,temp_c);
  sakuraio.send();
  Serial.print(temp_c);
  Serial.print("  ");
  Serial.println(sakuraio.getConnectionStatus());
  delay(1000);
}
```

温度を取得する部分のコードは下記のサイトを参照させて頂きました。

http://denshi.blog.jp/arduino/temperature-lm35dz

## 次回は…

サーバに溜まったデータをグラフに！
【翻訳】scikit-learn 0.18 User Guide 3.4. モデルの永続化

http://scikit-learn.org/0.18/modules/model_persistence.html を google翻訳した
[scikit-learn 0.18 ユーザーガイド 3. モデルの選択と評価](http://qiita.com/nazoking@github/items/267f2371757516f8c168#3-%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%E9%81%B8%E6%8A%9E%E3%81%A8%E8%A9%95%E4%BE%A1) より

----
# 3.4. モデルの永続化

scikit-learn モデルを訓練した後、再学習することなく将来の使用のためにモデルを持続させる方法が望ましい。次のセクションでは、pickleでモデルを永続化する方法の例を示します。また、pickleシリアル化の作業時に、セキュリティと保守性に関するいくつかの問題を確認します。

## 3.4.1. 永続性の例

Pythonの組み込み永続化モジュール、つまり [pickle](https://docs.python.org/2/library/pickle.html) を使って、scikitモデルを保存することは可能です：

```python
>>> from sklearn import svm
>>> from sklearn import datasets
>>> clf = svm.SVC()
>>> iris = datasets.load_iris()
>>> X, y = iris.data, iris.target
>>> clf.fit(X, y)  
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
    decision_function_shape=None, degree=3, gamma='auto', kernel='rbf',
    max_iter=-1, probability=False, random_state=None, shrinking=True,
    tol=0.001, verbose=False)

>>> import pickle
>>> s = pickle.dumps(clf)
>>> clf2 = pickle.loads(s)
>>> clf2.predict(X[0:1])
array([0])
>>> y[0]
0
```

scikitの特定のケースでは、joblib の pickle置き換え（ `joblib.dump` ＆ `joblib.load` ）を使用する方が面白いかもしれません。これは、 scikit-learn 評価機オブジェクト(多くの場合、大規模なnumpy配列を内部的に持つ)に対してより効率的です。ただし、`dumps` メソッドはないため、ディスクにのみ保存できます。

```python
>>> from sklearn.externals import joblib
>>> joblib.dump(clf, 'filename.pkl') 
```

後でpickleされたモデルを（おそらく別のPythonプロセスで）ロードすることができます：

```python
>>> clf = joblib.load('filename.pkl') 
```

**注意:** joblib.dump関数とjoblib.load関数は、ファイル名の代わりにファイルのようなオブジェクトも受け入れます。 Joblibでのデータ永続化の詳細は、 [こちら](https://pythonhosted.org/joblib/persistence.html) を参照してください。

## 3.4.2. セキュリティと保守性の制限

pickle（および joblib 拡張）は、保守性とセキュリティに関していくつかの問題があります。このため、
  - ロード時に悪意のあるコードが実行される可能性があるため、信頼できないデータを解読しないでください。
  - scikit-learnのとあるバージョンを使用して保存されたモデルは、他のバージョンの scikit-learn で読み込まれる可能性がありますが、これは完全にサポートされておらず、お勧めできません。また、そのようなデータに対して実行される操作は、異なる予期しない結果をもたらす可能性があることに留意する必要があります。

将来のバージョンのscikit-learnで同様のモデルを再構築するには、pickledモデルに沿って追加のメタデータを保存する必要があります。

  - トレーニングデータの不変のスナップショットへの参照
  - モデルを生成するために使用されるpythonソースコード
  - scikit-learnとその依存関係のバージョン
  - トレーニングデータで得られたクロスバリデーションスコア

これにより、クロスバリデーションスコアが以前と同じ範囲にあることを確認することが可能になります。
これらの問題についてもっと知りたい場合や他の可能なシリアライズ方法を調べたい場合は、 [Alex Gaynorのこの話](http://pyvideo.org/video/2566/pickles-are-for-delis-not-software) を参照してください。

----
[scikit-learn 0.18 ユーザーガイド 3. モデルの選択と評価](http://qiita.com/nazoking@github/items/267f2371757516f8c168#3-%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%E9%81%B8%E6%8A%9E%E3%81%A8%E8%A9%95%E4%BE%A1) より

©2010 - 2016、scikit-learn developers（BSDライセンス）。
趣味は職場に認知して貰おう

下請けCOBOLERとして生きていた頃のノウハウ Advent Calendar 2016の21日目ぐらいの記事です。

下請けって休めないですよね

僕のように保守をやってるととりわけそうなんですが、とにかく休みって取りにくいんですよ。

しかし、自分は当時自分が人間であることを確認するために声優イベントに通っていたのですが、最近では海外イベントなんてものも増えてきてるんですよね。

飛行機の日程を考えるとどうしても休みが必要になります。

なので、普段から俺は声優オタクなんだとアピールして、休みを頂いてました。
整理券の配布のために午前休をとったり、お昼休みを余計に貰ってアニメイトまで整理券を取りに行ったこともあります。

とにかくあいつは声優イベントがないと死んでしまうやつらしいから仕方ないと思わせるのが大事です。

だいたい忙しい職場でもメンバ-の誰かがインフルになったり不幸が起きてもなんだかんだで回ってるじゃないですか、休んだってどうにか回るんですよ。

会社員にとって皆勤賞や盆暮れにしか有給取らないなんて自社の有給消化率を下げて会社の企業イメージを傷つける大変恥ずかしい行為です。


有給はどんどん使いましょう
コボラーがDjangoエンジニアになるまでに読んだ書籍の紹介

下請けCOBOLERとして生きていた頃のノウハウ Advent Calendar 2016の19日目ぐらいの記事です。

COBOL現場を抜けて２年半ほど立ちますが、その後1年はC#のwinformをやり、pythonやvbの仕事をちょいちょいやって今ではDjangoを初めて半年ほどになりますが、アプリケーション層ならまぁ問題なく書けるなって程度には書けるようになったし、pythonは学習コストがめっちゃ低いのでDjangoのバックエンドエンジニアなら誰でも慣れるんじゃないでしょうか


とはいえ、基礎知識無しにいきなりwebの仕事してもわけわかめなのでいくつか書籍を紹介しておきます。

[「プロになるためのWeb技術入門」 ――なぜ、あなたはWebシステムを開発できないのか](
https://www.amazon.co.jp/%E3%80%8C%E3%83%97%E3%83%AD%E3%81%AB%E3%81%AA%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AEWeb%E6%8A%80%E8%A1%93%E5%85%A5%E9%96%80%E3%80%8D-%E2%80%95%E2%80%95%E3%81%AA%E3%81%9C%E3%80%81%E3%81%82%E3%81%AA%E3%81%9F%E3%81%AFWeb%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%82%92%E9%96%8B%E7%99%BA%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E3%81%AE%E3%81%8B-%E5%B0%8F%E6%A3%AE-%E8%A3%95%E4%BB%8B/dp/4774142352)

webってなんじゃいって人のための基本書です。
これ一冊でwebはばっちりじゃないでしょうか

電車内や寝る前などにちょっとずつ読んでいくと良いと思います。

[Amazon Web Services 基礎からのネットワーク&サーバー構築](https://www.amazon.co.jp/Amazon-Web-Services-%E5%9F%BA%E7%A4%8E%E3%81%8B%E3%82%89%E3%81%AE%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF-%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E6%A7%8B%E7%AF%89/dp/4822262960)

最近サーバーはawsで建てる例が多いんじゃないかと思います。
そんなawsコンソールの触り方やかんたんな環境構築の方法はこの一冊でとりあえず大丈夫です！


まぁ後は本ばっかり読んでないで手をどんどん動かしましょう、コピペでも何でもなにか1つクラウドサーバー上に動的なwebサイトを自力で立てましょう！それだけで自信が付きます！
smartyで最初につまづいたところ

smartyをはじめて使ったときに、あれ？:confused:ってなったところです。

#### :purple_heart: Smartyのテンプレート内の処理で計算、加工をするとき
→スペースをあけると処理されない

例えば足し算引き算掛け算割り算の際に…
:o:`{assign var=”count” value=$count+1}`
:x:`{assign var=”count” value=$count + 1}`
スペースをあけると＋がundefineですよとなる。

フォーマット加工するときも同様。
`{* 今日の日付を整形 date_format を使用 *}`
:o:`{$smarty.now|date_format:"%Y/%m/%d"}`
:x:`{$smarty.now | date_format:"%Y/%m/%d"}`

#### :blue_heart: forの代わりのsectionの使い方
#####例 : $item_list
```
php > var_dump($item_list);
array(2) {
  [0]=>
  array(2) {
    ["name"]=>
    string(5) "apple"
    ["color"]=>
    string(3) "red"
  }
  [1]=>
  array(2) {
    ["name"]=>
    string(6) "orange"
    ["coler"]=>
    string(6) "orange"
  }
```
#####foreachの場合

```
{foreach from=$item_list item=$item}
	{$item.name|escape}
{/foreach}
```

#####sectionの場合
```
■indexを指定してアクセスする場合
■index…$smarty.section.i.indexでアクセスできる
{section name=i start=0 loop=$item_list}
    {assign var="count_index" value=$smarty.section.i.index}
    {$item_list.$count_index.name}
{/section
```
本番ジョブが落ちたときの深夜作業の心得

下請けCOBOLERとして生きていた頃のノウハウ Advent Calendar 2016の24日目ぐらいの記事です。

夜間バッチ、よく落ちるんですよね。

落ちたときの流れになります。


##既知の障害か？未知の障害か？
まずはこれです、ログをしっかり見てABENDコードを確認しましょう。
いつものなら緊張感から解放されます。
(ちなみに筆者の所ではホストのディスク容量が足りなくなるというJCLエラーがよく起きていたので、そう言うときは容量を変更するジョブの申請やある程度時間をおいての再ラン指示などで乗り切ってました)

もし未知の障害ならおおごとです。

##未知の障害だ！
まずはデータの取得、テスト環境での再現をしましょう。
その中で原因特定を頑張りましょう。
状況によってはそのレコードをドロップしての再ランもやむを得ません(そうだとしたらその日はストレスから解放されます。)

##必要なのはアドレナリンと声だし
本番ジョブのリカバリーは時間との勝負です。
必ず作業は複眼チェック・大きな声で情報伝達・分からないときは分からないと騒ぐ、とにかく一人で悩む時間はありません、騒いで上の人に問題を認識して貰いましょう。

後はひたすらアドレナリン出してください。
集中力なくして夜は乗り越えられません。

##必要以上に堅くならないこと
緊急事態というのは普段のチームの結束力が試される場面です。
メールに障害検知データのダンプを送るのに
いちいちいつもお世話になっております。から始まる定型文を付ける必要はありません。
これです。って①行と添付ファイルで充分です。
また、話をするときも多少フランクで良いと思ってます。
乗り越えた障害の数だけチームの結束力は増します。

##タクシー代をもらおう！
プロパーさん都合で深夜残業なんですからタクシー代はじゃんじゃん請求しましょう。
これが一番大切なことです。
iOSアプリのATS対応はお済みですか？

はじめまして！IDCFソリューションアーキテクト部の河合です。
Qiitaでブログを書くのは初めてですが、10月に[IDCF Tech-Blog](http://blog.idcf.jp/archive)に初登場しました！
これからも度々ブログに登場しますので、よろしくお願いします:blush:

さて、タイトルで掲げている「ATS対策」、みなさんはお済みでしょうか？
今年6月、Appleから2016年末までにiOSアプリのATS対応必須化が発表されました。
そこで今回はIDCFのATS対策に関する取り組みをご紹介したいと思います:raised_hands_tone1:

**★お伝えしたいこと**
1. そもそもATSって？
2. IDCFサービスの対応状況
3. ATS対策オープンセミナーの開催
4. ATS対策支援キャンペーン
5. Apple Developerからの対応期間延期の発表

###1. そもそもATSって？
ATS(app transport security)はiOSアプリとサーバー間をHTTPS接続のみでセキュアに通信する仕組みです。
今後この仕組みの有効化が必須となり、Appleが推奨する要件に満たない通信は接続できなくなってしまいます。
つまり、常時SSL化への対応が必要になるのです:bulb:
今回の対応要件は主に次の点となります。

・証明書の鍵長は2048ビット以上
・SSL/TLSはTLS1.2
・以下の暗号化アルゴリズム(cipher suite)を使用
　　TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
　　TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
　　TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
　　TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
　　TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
　　TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
　　TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
　　TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
　　TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
　　TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
　　TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA

　※詳細な条件については[こちら](https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html#//apple_ref/doc/uid/TP40009251-SW35)に明記されています


では、実際にはどのように対策していけばよいのでしょうか？
次の項目ではATS対応しているIDCFのサービスをご紹介します！

###2. IDCFサービスの対応状況
IDCFのサービスでATSに対応してるものが次に挙げる3つです。
・ILB
・コンテンツキャッシュ
・ネットワークサービス(LB)

**ILB**
ILBでSSLオフロードすることでサーバー側のSSLの暗号化/復号にかかる負荷をなくし、ATSの対策ができちゃいます！
サーバー側での設定変更なく導入でき、リクエスト数の規模的には中小規模のアプリにオススメです。
今回ATSの要件として提示されている暗号化アルゴリズム(cipher suite)すべてに対応済みなのもポイントです:shamrock:

**コンテンツキャッシュ**
初回のアプリダウンロードなど、トラフィックの多い通信が発生するデータを
コンテンツキャッシュから配信させることでトラフィックのひっ迫を軽減できますよね:ok_hand_tone1:
このコンテンツキャッシュもATSに対応しています！
一部のcipher suiteに未対応なので、ご利用時にはご確認くださいね。
[ATSについてコンテンツキャッシュサービスで対応している暗号化スイートは？ - IDCF FAQ](https://www.faq.idcf.jp/app/answers/detail/a_id/692/c/4/kw/%E3%82%B9%E3%82%A4%E3%83%BC%E3%83%88)

**ネットワークサービス(LB)**
IDCFが提供するネットワークサービスのロードバランサーもATSに対応しています。
こちらもILB同様、サーバー側の設定を変更せずにATS対応ができます！
11種類すべてのcipher suiteに対応していますので環境に合わせてお使いいただけます:raised_hands_tone1:

###3. ATS対策オープンセミナーの開催
ATS対応に向け、12/19にIDCF主催のセミナー「[なぜ常時SSLなのか？いまからでも間に合うATS対策！](https://idcf-seminar.connpass.com/event/46761/)」を開催しました！
まだ未対応、対応中といった方々を対象に、なぜATS対応が必要なのか？具体的にどう対策するのかといった方法まで含めたセッションを行いました。
当日IDCFの社員がセッションにて話した内容を公開していますので、ぜひご覧になってみてください:sparkles:

[いまからでも間に合うATS対策](http://www.slideshare.net/IDCFrontier/ats-70361940)

[ATSでも使える！Let'sEncryptで無料ではじめるSSL](http://www.slideshare.net/IDCFrontier/atslets-encryptssl)

###4. ATS対策支援キャンペーン
上記のオープンセミナーだけでなく、IDCFとしてみなさんのATS対応化を応援するためのキャンペーンも実施しています:muscle_tone1:
[まだ間に合う！ATS対策支援キャンペーン](https://www.idcf.jp/cloud/cp/ats.html)

このキャンペーンでは、期間中(2016/12/19～2017/1/31)にコンテンツキャッシュ、ILB、ネットワークサービスのいずれかを
お申込みいただいた方を対象にIDCFクラウドで使えるクーポン5,000円分（税抜）がプレゼントされます！
詳しくはキャンペーンサイトをチェックしてみてくださいね:dash:

###5. Apple Developerからの対応期間延期の発表
ここまでお伝えしてきたiOSアプリのATS対応必須化のお話ですが…。
実は12/21付けでApple DeveloperからATS対応必須化の期限を延長するとの発表がありました。
https://developer.apple.com/news/?id=12212016b

具体的な期限については改めて発表があるとのことです。
公式のアナウンスをしっかりキャッチして、対策がまだお済みでない方は今のうちに終わらせちゃいましょう！

ここまでお付き合いいただき、ありがとうございました:star:

それではみなさん、楽しいお正月をお過ごしください～！
忙しいプロパーさんにも分かるための障害報告資料.xlsの書き方

下請けCOBOLERとして生きていた頃のノウハウ Advent Calendar 2016の16日目ぐらいの記事です。


皆さん、エクセル.xlsを書きますよね？

僕は保守チームにいたのでよく、障害報告書を書いていたのでその際のノウハウだけ書きます。
(面倒なので.xlsは作りません)


##なるべくA４縦一枚に収まるように書こう！
プロパーさんが読んだりスクリーンに投影した資料を説明する際にあっちこっちに移動すると分かりにくくなります。
なるべく、A4縦一枚で書くのがコツです。余計なものはどんどんそぎ落としましょう

##章立てのパターンを決めよう
自分なりのテンプレートを作ってしまえば章立てや話の流れを考えなくて済みます。

ちなみに自分の章立てはこんな感じです(2年以上昔の話なので若干怪しいですが)

■きっかけ
　事件のきっかけをかく(12月20日　ABC１２３４のジョブでABENDが発生　とか　12月20日　お客の凸凹様より不正なデータがあると問い合わせ)

■直接原因
　問い合わせが来た直接の原因を書く、ようするにバッチが落ちた理由、変なデータをセットしている直接の原因を書く
(数字型を想定していたところに文字列が来た、ジョブの先行関係がきちんとかかっていなかったので前日のデータで処理を行った・・など)

■根本原因を書く
　ここは直接原因と根本原因が同一であれば書かなくても良いです。が、だいたい巨大システムに触れていると、直接原因と根本原因はだいたい別物です。ここではできればソースも交えて説明すると分かりやすいと思います。
(例：オンラインの処理で数字しか受け付けない想定の所にaなどの文字が入るようになっていた。
3つ前のバッチ処理での条件分岐とデータセットがおかしかった等)

■修正案を書く
　上の根本原因で修正するべき箇所が分かると思うので、それの修正案を書きます。
　ちょっとした直しならこう直しますって宣言しても良いと思います。
　また、それに伴う単体テスト/結合テストの工数(目安の日数)なんかも出せればかっこいいですね

■今のデータの復旧案を書く
　でかいところだと原因が判明して一瞬で直せるような修正でも早くて一週間かかります。
お客さんに説明→人員の調整→要件定義的なもの→結合試験書→詳細設計書・単体テストケース→製造→単体テスト→結合テスト→お客さんテスト・確認→リリース準備(疎通確認・初動確認方法など)→リリース
この流れは絶対でしたので紙ペラ一枚でもとにかく積み上げるものは作らなければいけません。
なので、今おかしくなっているデータを何とかしなければいけません。
その為にデータをアップデートするSQLとかホストのデータの修正用ジョブの作成、外部連携してしまったデータをリリース後に全部作り直して送り直すなどの作業も必要になります。
筆者は異常なデータを外部連携してしまったことが分かったケースでは問題の修正後に数ヶ月分のデータを再生成して送り直すという作業をしたこともあります。

■当面の逃げ方を考える
たとえば夜間バッチを落とすような障害の場合、落とさないようにしなければなりません。
そのために、オンライン終了後にSQL文を流して変なでーたがないか確認するとかジョブのインプットのデータを修正してバッチが正常に流れるようにする、などの当面の逃げ方も決めなければなりません。

とりあえず上記のテンプレにはめればもてもて間違いなしです！
Ruby on Railsで漢字/ひらがな/カタカナをローマ字に変換したい

# はじめに
漢字からローマ字に変換したい！と思って、rubyで使えるライブラリがないか調べました。
意外にもあんまりなかったので、メモしておこうと思います。

# romaji

**カタカナ → ローマ字** ○
**ローマ字 → カタカナ** ○
※漢字からは変換できない。が、便利だと思ったのでメモ。

Github: https://github.com/makimoto/romaji


```
gem 'romaji'
```

```
bundle install
```

## 使い方

```ruby
require "romaji"

Romaji.kana2romaji "スシ" #=> "sushi"
Romaji.romaji2kana "sushi" #=> "スシ"
Romaji.romaji2kana "sushi", :kana_type => :hiragana #=> "すし"
```

```
require "romaji/core_ext/string"

"sushi".kana #=> "スシ"
"スシ".romaji #=> "sushi"
a = "sushi"
a.kana!
p a #=> "スシ"
a.romaji!
p a #=> "sushi"
```

簡単ですね！

# KAKASI 

**漢字かなまじり文をひらがな文やローマ字文に変換する**

**漢字 → ローマ字**  ○
**ひらがな → ローマ字**  ○
※混ざっていてもOK！

KAKASIはフリーソフトウェアです。
http://kakasi.namazu.org/index.html.ja

上記URLから最新版のソースをダウンロードします。
(現時点では、kakasi-2.3.6)


ダウンロードしてきたら以下のコマンドを実行

```
cd kakasi-2.3.6
./configure
make
make install
```

**gem kakasiをinstall**

```
gem "kakasi"
```

```
bundle install
```

## rubyとkakasiの連携！

github: https://github.com/eitoball/kakasi-ruby.git

```ruby
gem 'kakasi'
```

```
bundle install
```

terminalから

```
git clone https://github.com/eitoball/kakasi-ruby.git
cd kakasi-ruby
ruby extconf.rb
make
```

>*引用*
Ruby2.0以降を使う場合はここでエラーがでるので、ソースを変更する。
(らしいです！)

```
mv kakasi.c kakasi.c.org # 元ソースバックアップのため
cat kakasi.c.org | sed "s/RSTRING\(([^)]*)\)->len/RSTRING_LEN\\1/" | sed "s/RSTRING\(([^)]*)\)->ptr/RSTRING_PTR\\1/" > kakasi.c
make
```

これでOK!

## 使い方

```ruby
require 'kakasi'

Kakasi.kakasi('-Ja -Ha', "兵庫県") 
 #=> "hyougoken"

Kakasi.kakasi('-JK -HK', 'Unfortunately, 今日は雨です。')
 #=> "Unfortunately, コンニチハアメデス。"

Kakasi.kakasi('-Ja -Ha', 'Unfortunately, 今日は雨です。')
 #=> "Unfortunately, konnichihaamedesu。"

```

変換したい文字の指定は以下を参照して行います。

```
J : 漢字
a : ローマ字
H : ひらがな
K : カタカナ
```

漢字からローマ字に変換できるgemは調べたところ、KAKASIしかなかった。。
KAKASI、便利！


# コメント
どうしてもローマ字にしたいっていう場面はあんまりないと思うのですが、
使いたい場面があったのでまとめました。。
**が、しかし！**
実装完了後、仕様を再度確認してみると、、、
そこには「ローマ字」ではなく「英語」がががががががが。
泣く泣くkakasiとバイバイし、I18nを使いました。


色々苦労したけど、年末案山子と過ごせてよかったです。
ありがとうございました。

# 参照
- http://qiita.com/GATAKAWAKACHICO/items/cda91715b78a808d36ef
- http://kzy52.com/entry/2014/07/17/225448
Wordファイル（および、Google document）から、 markdown への変換

最初、word や google document で書き出したけど、途中で、Markdownに変えたい事ってありますよね。（gitでバージョン管理したいとか）
pandoc でできます。以下のようにすると、画像も変換してくれます。

```
pandoc  --extract-media=. -f docx -t markdown_github document.docx -o document.md
```

pandoc のインストール方法はこちら。
http://qiita.com/sky_y/items/3c5c46ebd319490907e8

Google document から変換したい場合、Microsoft Word ファイルでダウンロードしてから、変換すればOKです。
【Swift】text の変更後に UITextView を一番下までスクロールするコード

text を変更する前に isScrollEnabled を false にするのがコツです。

コードによるテキスト変更では、デリゲードや通知は使えないようです。
ソフトキーボードによる変更では使えます。

```Swift:Swift
class ViewController: UIViewController {
    @IBOutlet weak var textView: UITextView!

    ---- 省略 ----

    // textView に変更を加えるメソッド 適宜必要な処理に読み替えてください
    func addText(_ text: String) {
        textView.isScrollEnabled = false
        textView.text = textView.text + text
        scrollToButtom()
    }

    func scrollToBottom() {
        textView.selectedRange = NSRange(location: textView.text.characters.count, length: 0)
        textView.isScrollEnabled = true

        let scrollY = textView.contentSize.height - textView.bounds.height
        let scrollPoint = CGPoint(x: 0, y: scrollY > 0 ? scrollY : 0)
        textView.setContentOffset(scrollPoint, animated: true)
    }
}