OmniAICreator/Qiita-1.07M huggingface dataset:
エディタ拡張でクラスの折り畳み等を再現する

エディタ拡張をしていると、クラスや配列を折りたたむ時のアレを実装することがありますよね。

![Unity Personal (64bit) - Untitled - EditorExtensionSample - PC, Mac & Linux Standalone_ _DX11_ 2016-08-20 03.39.13.png](https://qiita-image-store.s3.amazonaws.com/0/31480/8d62520d-412f-cecb-ba97-fc217eddb825.png)
これです。

これは [Foldout](https://docs.unity3d.com/ScriptReference/EditorGUILayout.Foldout.html) というようですが、これの実装ですごい回り道をしてしまったのでメモ的に書いておきます。

以下のようなクラスがあるとします。

```csharp:FoldoutTest.cs

using UnityEngine;

public class FoldoutTest : MonoBehaviour {

    [System.Serializable]
    private class SampleClass
    {
        [SerializeField] string hoge;
        [SerializeField] int fuga;
    }

    [SerializeField] SampleClass sampleClass;
}
```

このコンポーネントを適当なオブジェクトに張り付けてインスペクターに表示させると以下のようになりますね。

![Unity Personal (64bit) - Untitled - EditorExtensionSample - PC, Mac & Linux Standalone_ _DX11_ 2016-08-20 03.45.53.png](https://qiita-image-store.s3.amazonaws.com/0/31480/f1b6bd45-e3c0-b9d3-60a8-7003c1b34a47.png)

この`Sample Class`という部分の表示ですが、`EditorGUILayout.PropertyField()`を使えば簡単にできます。

```csharp
using UnityEditor;

[CustomEditor(typeof(FoldoutTest))]
public class FoldoutTestEditor : Editor {

    SerializedProperty sampleClass;

    void OnEnable()
    {
        sampleClass = serializedObject.FindProperty("sampleClass");
    }

    public override void OnInspectorGUI()
    {
        EditorGUILayout.PropertyField(sampleClass);        
    }
}
```

![Unity Personal (64bit) - Untitled - EditorExtensionSample - PC, Mac & Linux Standalone_ _DX11_ 2016-08-20 03.49.40.png](https://qiita-image-store.s3.amazonaws.com/0/31480/29c2fa3f-6719-1055-5ea8-327bb66ba0a6.png)

簡単ですね。ちゃんとクリックすれば開いたり閉じたりといった動作をしてくれます。
あとはクラス内の要素も描画して、ついでに先頭に編集不可能なスクリプトのプロパティフィールドも表示します。

```csharp
using UnityEditor;

[CustomEditor(typeof(FoldoutTest))]
public class FoldoutTestEditor : Editor {

    SerializedProperty script;
    SerializedProperty sampleClass;
    SerializedProperty hoge, fuga;

    void OnEnable()
    {
        script = serializedObject.FindProperty("m_Script");
        sampleClass = serializedObject.FindProperty("sampleClass");
        hoge = sampleClass.FindPropertyRelative("hoge");
        fuga = sampleClass.FindPropertyRelative("fuga");
    }

    public override void OnInspectorGUI()
    {
        // スクリプト名を表示する. 編集はできないようにする.
        EditorGUI.BeginDisabledGroup(true);
        EditorGUILayout.PropertyField(script);
        EditorGUI.EndDisabledGroup();
        
        EditorGUILayout.PropertyField(sampleClass);
        
        if(sampleClass.isExpanded)
        {
            EditorGUI.indentLevel++;
            EditorGUILayout.PropertyField(hoge);
            EditorGUILayout.PropertyField(fuga);
            EditorGUI.indentLevel--;
        }
    }
}
```

![Unity Personal (64bit) - Untitled - EditorExtensionSample - PC, Mac & Linux Standalone_ _DX11_ 2016-08-20 03.45.53.png](https://qiita-image-store.s3.amazonaws.com/0/31480/f1b6bd45-e3c0-b9d3-60a8-7003c1b34a47.png)

できました！クラスの開閉状態は`SerializedProperty.isExpanded`で調べられます。

こうすれば、拡張するクラス側に`#UNITY_EDITOR`で囲った開閉管理用変数を用意してFoldoutの描画や範囲内のクリック判定を自前でしたり、クラスが配列だった場合に増減の瞬間開閉管理用変数を操作する苦労とかしなくてすみますね！
ぼくも2度としたくないので次からはこの方法を取るようにします。
スライドテスト > 変化を見る

Qiitaのスライドモードは画像の変化を見るのにいいと思っていた。

---
画像が用意できたので試してみる。

---
![DSC_0221.JPG](https://qiita-image-store.s3.amazonaws.com/0/32870/4747c136-319b-8917-a4b0-23d2739afeef.jpeg)

---
![DSC_0222.JPG](https://qiita-image-store.s3.amazonaws.com/0/32870/7fd2f2fc-09cf-194b-4288-bc0974ca3d39.jpeg)

---
![DSC_0221.JPG](https://qiita-image-store.s3.amazonaws.com/0/32870/4747c136-319b-8917-a4b0-23d2739afeef.jpeg)

---
![DSC_0222.JPG](https://qiita-image-store.s3.amazonaws.com/0/32870/7fd2f2fc-09cf-194b-4288-bc0974ca3d39.jpeg)

---
![DSC_0221.JPG](https://qiita-image-store.s3.amazonaws.com/0/32870/4747c136-319b-8917-a4b0-23d2739afeef.jpeg)

---
![DSC_0222.JPG](https://qiita-image-store.s3.amazonaws.com/0/32870/7fd2f2fc-09cf-194b-4288-bc0974ca3d39.jpeg)

---

どうだろうか。

Deep Learningなどで特徴抽出するなりして、その処理前の画像と結果画像を見せる、などの時にスライドモードはいいように思う。
bash on Windowsでコピー＆ペースト

# 目的

bash on Windows上で、カーソルでコピー＆ペーストしたい方

下記設定はコマンドプロンプトに対する処置と同じです。
操作感はLinux系、Tera Term等と同様となります。
参考（コマンドプロンプトの設定）：http://pc-kaden.net/log/eid284.html

# 設定

bash on Windowsを起動して、ウィンドウタイトルバーを右クリックするとシステムメニューが現れます。「プロパティ」をクリックして、

```
「簡易編集モード」をOn
```
にします。

# コピー

カーソルでドラッグすると範囲指定になります。
指定した状態で、右クリックでコピーとなります。

# ペースト

ウィンドウ内で右クリックすると、クリップボードからコピーします。

# ついでにviへのペースト

Chromeなど他のアプリからソースコードをbash上のviにコピー＆ペーストしてインデントずれが起こる場合は、下記で自動インデントを解除できハッピーになれる。

```
:set paste
```
お名前.com の CNAME 設定で独自サブドメインに heroku の転送設定を行う

heroku の project example.herokuapp.com にお名前.com で取得したドメインに転送する設定について古い情報も多く、現状(2016/08/20)対応した方法の備忘録

## 必要なもの
- お名前.com で取得したドメイン(今回は取得済みとします）
- heroku project 

## お名前.com での設定

- お名前.com にログイン
- 左カラムから「DNS機能の設定」
- 今回設定するドメインを選択し「次へ進む」
- 「DNSレコード設定を利用する」の「設定する」

### CNAME設定
example.herokuapp.com -> www.example.com へ転送する場合

|項目|設定値|
|:-----------------|:------------------|
|ホスト名|www.example.com|
| TYPE |CNAME|
| TTL |3600(デフォルト)|
| VALUE |example.herokuapp.com|
|優先|-|
|状態|有効|

「確認画面へ進む」をクリック
これでお名前.comの設定は完了


## heroku 側の設定
```
 # in your heroku project directory
 $ heroku domains:add www.example.com
```

これで少し待って www.example.com へアクセスすると、example.herokuapp.com へ転送設定が完了している
Ubuntu on Windows で Jupyter を動かす

先日の Anniversary Update で Insider Preview 以外にも bash が入るようになりましたが、Jupyter は起動こそするものの notebook を使おうとするとカーネルが落ちるという問題がありました。

何とかならないかなーと思っていろいろ調べてみたら、aseering という方が作ったパッチを当てたら何とかなりました。

notebook で使用される環境に対して、以下のコマンドを実行すればパッチが入ります。

```
$ conda install -c jzuhone zeromq=4.1.dev0
```

python のバージョンごとに環境を分けているなら、こんな感じですね。

```
$ source activate py35
(py35) $ conda install -c jzuhone zeromq=4.1.dev0
```

参考: https://github.com/Microsoft/BashOnWindows/issues/185


![shot.png](https://qiita-image-store.s3.amazonaws.com/0/117994/ce1f505b-ca1e-86b8-b1de-a94f3daaec51.png)


同じページに pip のパッチもあるようなので、 conda を使っていない方はそれを使えば何とかなるかもしれません。
AWS Lambda in Golang


「JAWS-UG沖縄 真夏の熱すぎるサーバレス祭り！ 2016年08月」で話した「Go言語でAWS Lambda書こうぜ」的資料です。

http://www.slideshare.net/KoichiroNishijima/aws-lambda-in-golang

残念ながら会場にはGo使いがほとんど居なかったのであまりGoについて突っ込んだ話は出来ませんでした。。。

Lambda関数とそこから呼ばれる実際のロジックを分離するとコーディングもデバッグもとても楽だぜ、というのが資料の主な主張です。

（Qiita初投稿はこんな感じで大丈夫かしら・・・？）

# 資料では書いていない部分

今回はハンズオンをしなかったのですが、ハンズオンをする場合この資料に続いて

* コアライブラリ側のGetItemsを呼んで、Contactの中身を取り出すAPIを作る
	* その場合、レスポンスを表現する構造体を追加する
* そのAPIに認証をかける

などなどを実施すると良いかなぁ、と思います。
Goコンパイラ1.7をソースから構築する

# この記事は
* Ubuntu16.04のホストOS上で先日リリースされたGoコンパイラ1.7を構築する手順です
* Go始めたばっかで間違っていたらごめんなさい

# 事前準備
* GoコンパイラをビルドするのにGoコンパイラが必要（セルフホスティング）
* なのでUbuntuが配布している1.6をaptでインストールしておく

```
$ sudo apt install golang
$ go version
go version go1.6.2 linux/amd64
$ go env GOROOT
/usr/lib/go-1.6
```

# 1.7の構築
* 場所は/usr/local/src/を使っているがどこでもよい。権限を適切に設定しておくこと

```
$ cd /usr/local/src
$ git clone https://go.googlesource.com/go
$ cd go
$ git checkout go1.7
$ cd src
```

* クロスコンパイルターゲットを指定してビルドする場合
 （下記はLinux、AMD64を指定した例）

```
$ GOROOT_BOOTSTRAP=/usr/lib/go-1.6/ GOOS=linux GOARCH=amd64 ./make.bash 
```

* 全クロスコンパイルターゲット用にするのであれば下記を実行する

```
$ GOROOT_BOOTSTRAP=/usr/lib/go-1.6/ ./buildall.bash 
```

# 1.7のパスを通す
```
$ export PATH=/usr/local/src/go/bin:$PATH
$ go version
go version go1.7 linux/amd64
$ go env GOROOT
/usr/local/src/go
```
Puppet 4.5 リリースノート ピックアップ

Puppet4.5.0(2016/5/17リリース)の、リリースノートで個人的に気になる変更をピックアップしてみました。動作確認とかはしてないので、間違っている部分があればご指摘ください。

この投稿(2016/8/20)時点で、すでに4.6が出ています。
過去バージョンでの変更のフォロー用です。

# Puppet 4.5.0
Released May 17, 2016.

## New features

###  New functions, dig, then, and lest

> Accessing data in nested structures could be difficult and required conditional logic to test for missing or optional parts of a structure. Three functions have been added to make such tasks easier; ‘dig’, ‘then’ and ‘lest’, which also combine nicely with the existing ‘with’ and ‘assert_type’ functions.

入れ子になったデータへのアクセスしやすくするための、dig,then,lest関数が追加されました。例えば、ハッシュの中にハッシュがあって、その中が配列になっているとかです。

#### dig

digの紹介はこちら、

https://docs.puppet.com/puppet/latest/reference/function.html#dig

例も載っています。

Example: Using dig

```puppet
$data = {a => { b => [{x => 10, y => 20}, {x => 100, y => 200}]}}
notice $data.dig(a, b, 1, x)
```

この例の場合、dig関数の結果は、100になるようです。
（$dataの、aキーの、bキーの、1番目の要素の、xキーの値）

#### then

thenの紹介はこちら、
（thenの説明ですが、なぜかタイトルがlestになっています。逆にlestの説明が見当たらない。。。）

https://docs.puppet.com/puppet/latest/reference/function.html#lest

例も載っています。

Example: Using dig and then

```puppet
$data = {a => { b => [{x => 10, y => 20}, {x => 100, y => 200}]}}
notice $data.dig(a, b, 1, x).then |$x| { $x * 2 }
```

結果は、200になるようです。
(digの結果100($dataの、aキーの、bキーの、1番目の要素の、xキーの値）* 2)

digの結果がundefの場合の例もあります。

Contrast this with:

```puppet
$data = {a => { b => [{x => 10, y => 20}, {ex => 100, why => 200}]}}
notice $data.dig(a, b, 1, x).then |$x| { $x * 2 }
```

結果は、undefになるようです。
(digの結果undef($dataの、aキーの、bキーの、1番目の要素の、xキーの値はない）ため、thenの処理は実行されない)

### New types: SemVer and SemVerRange

> SemVer and SemVerRange have been added to the Puppet Type System. This makes it possible to directly work with version related values in the Puppet language. Given version strings are validated and comparison operators (<, >, <=, =>, ==, !=, =~, !~), as well as the in-operator and case expression option matching works with these objects.

x.y.zのようなバージョンを比較するために便利そうな関数が追加されました。
SemVerRangeがバージョンの範囲定義、SevVerがあるバージョンが、SemVerRangeで定義したバージョンに含まれるか判定するもののようです。

https://docs.puppet.com/puppet/latest/reference/function.html#creating-a-semver

例も載っています。

Examples: SemVer and SemVerRange usage

```puppet
# As a type, SemVer can describe disjunct ranges which versions can be
# matched against - here the type is constructed with two
# SemVerRange objects.
#
$t = SemVer[
  SemVerRange('>=1.0.0 <2.0.0'),
  SemVerRange('>=3.0.0 <4.0.0')
]
notice(SemVer('1.2.3') =~ $t) # true
notice(SemVer('2.3.4') =~ $t) # false
notice(SemVer('3.4.5') =~ $t) # true
```

※システム内に複数バージョンが混在しているような場合や、汎用的なマニフェストを書く場合に便利そうです。


## Enhancements

### Path change of hiera.yaml

> The default location of hiera.yaml has changed to the \$confdir. Puppet now looks for hiera.yaml in \$codedir first, then \$confdir.

hiera.yamlのパスが変わったようです。\$codedirで指定されたディレクトリにあるhiera.yamlを先に確認するようになりました。


# Puppet 4.5.1
Released June 1, 2016.

バグ修正

# Puppet 4.5.2
Released June 14, 2016.

バグ修正

# Puppet 4.5.3
Released July 20, 2016.

バグ修正

# 参考

Puppet 4.5 Release Notes
https://docs.puppet.com/puppet/4.5/reference/release_notes.html
IDCFクラウドのDNSをAnsibleで管理する

個人で取ったドメインのネームサーバーをIDCFのDNSサービスで管理しようと考えた時に、ちょっと困ったことがありました。

**Ansibleが使えない?**

業務から個人ネタまでインンフラ系の構成管理にAnsibleを使っている身としては、やっぱりドメイン周りも構成管理に組み込みたいわけで。
DNSサービス系のサービスでAnsibleのモジュールがあるものだとRoute53は当たり前のようにあるのですが、せっかくなのでIDCFクラウドを使ってみたいという感覚がありました。

で、改めて振り返ると、

* AnsibleのモジュールはPython書ければ作れそうだし、ガイドラインが結構丁寧
* IDCFクラウドはAPIが公開されているので、ちゃんとHTTPリクエスト組めば問題なく取り扱える
* IDCFクラウドはベースがCloudStackではあるがDNSはどうも違うっぽい（？未確認）


ということなので、モジュールを自作するネタとしてはちょうど良いため、せっかくなので作ってみることにしました。

# こんな感じに動く

- https://github.com/attakei/ansible-modules-idcf 内のidcfフォルダ内にあるファイルを、libraryフォルダに置く
- ↓みたいな感じにPlaybook作って実行する

```yaml:playbook.yml
- vars:
    api_key: 'YOUR_IDCF_API_KEY'
    secret_key: 'YOUR_IDCF_SECRET_KEY'
  tasks:
    - name: ゾーンの登録
      idcd_dns_zone:
        idcf_api_key: '{{ api_key }}'
        idcf_secret_key: '{{ secret_key }}'
        zone: 'example.com'
    - name: レコードを登録する
      idcd_dns_record:
        idcf_api_key: '{{ api_key }}'
        idcf_secret_key: '{{ secret_key }}'
        zone: 'example.com'
        name: '{{ item.name }}'
        type: '{{ item.type }}'
        content: '{{ item.content }}'
      with_items:
        - name: 'www'
          type: 'A'
          content: '127.0.0.1'
        - name: 'blog'
          type: 'CNAME'
          content: 'github.io'
```

現時点ではゾーンの登録/削除/更新と登録ゾーンに対する簡単なレコード登録/更新/削除ができるようになります。（ドメイン認証あたりは未実装）

# モジュール作成振り返り

## モジュールスクリプト自体は作成はさほど難しくない

モジュール自体は割と何で書いても動くのでさほど苦労しません。
特にAnsibleのドキュメントにはモジュールを開発する際に気をつけた方ががいいことや、ベストプラクティス的な情報が載っており、Pythonで書く場合はAnsibleの共通ライブラリも使えるため綺麗なコードが書けます。というか`AnsibleModule`クラスが凄まじく便利

未来を夢想しながら書いていたら、ドキュメント部分が大半を占めていたのも特徴的でした。

## モジュールのコードはそれで完結させる必要がある

モジュール実行時は実行先にモジュールをそのまま転送して実行するという挙動上、Pythonで書くモジュールはそれ単体(+ansible.module_utils.*)とpython標準のみで動作するようにしないといけないようです。

例えば、今回は`idcd_dns_zone`,`idcf_dns_zone_facts`,`idcf_dns_record`というモジュールを作ったのですが、APIをコールする部分は基本的に同じなのにもかかわらずClientクラスを作って全モジュールにコピペするような運用になりました。
オフィシャル登録されれば共通モジュールの置き場がありそうなのですが、そこまでする気力がまだないので...

## どこに置いてもらうか？

基本的に自作モジュールは、Playbook実行時の`./library`におけば勝手に認識してくれています。ので、その通りにおいてもらえれば何の問題もないのですが、自作モジュールを大量に取り扱う時に死ねそう（そんなことはない気もするけれど）
MQ for z/OSのSMFレコードをcsvで出力してみる

# IBM MQ for z/OSのパフォーマンス/キャパシティ・プランニング
IBM MQ for z/OS(MQ)のパフォーマンス管理、キャパシティ・プランニングを行う上で必要となる情報は、SMFを使用して収集する事ができます。
収集したレポーティングツールとして、製品提供のツールを使用することもできますが、多くの場合はよりリーダブルなフォーマットで出力することがができる、MP1Bというサポートパックを使用されます。
MP1BでもCSV形式でレコードを出力することも可能ですが、出力可能なのは一部の情報だけだったりと、少し物足りないような気もします。
今回は[mq-smf-csv](https://github.com/ibm-messaging/mq-smf-csv)というツールを使用してcsv形式でSMFレコードを出力してみます。


# 導入
当記事ではwindows7を使用しています。他プラットフォームでは試していませんが同じ手順で問題無いでしょう。
git環境があれば任意のディレクトリにgit cloneするだけ。簡単ですね。

```
git clone https://github.com/ibm-messaging/mq-smf-csv.git
```

git環境がない場合は上記のページからzipをダウンロードして任意のディレクトリに展開すればよいでしょう。

# SMFデータの取得
ダンプしたMQのSMFレコードをftpで落としてきましょう。

```
>ftp zos.system.com
zos.system.com に接続しました。
220-FTP Server (user 'takad')
220
ユーザー (zos.system.com:(none)): takad
331-Password:
331
パスワード:
230-220-FTPD1 IBM FTP CS V2R1 at zos.system.com, 04:30:23 on 2016-08-20.
230-TAKAD is logged on.  Working directory is "TAKAD.".
ftp>
ftp> bin                                                  #バイナリで落とす
200 Representation type is Image
ftp> quote site rdw                                       #RDWを付加
200 SITE command was accepted
ftp> get 'takad.smfdump.mq' ./mqsmf.bin
200 Port request OK.
125 Sending data set TAKAD.SMFDUMP.MQ
250 Transfer completed successfully.
ftp: 1857656 バイトが受信されました 1.57秒 1181.72KB/秒。
```


俺は面倒が嫌いなんだ、という場合はサンプルのSMFがinstall_dir/testing/dataにSMFレコードがあるのでそれを使うといいでしょう。
# 実行してみる
実行ファイルはinstall_dir/bin/windowsにあります。他にはaix/linuxが確認できます。
まずは-hをつけてヘルプを見てみましょう。

```
MQ SMF CSV - Build Aug  4 2016 19:16:43
Usage: mqsmfcsv [-o <output dir>] [-a] [ -d <level> ]
         [-h yes|no] [ -i <input file> [-m <max records>]
         [-r ] [-t <ticker>]
  -a               Append to files if they exist. Default is overwrite.
  -d <Level>       Debug by dumping binary records (Level = 1 or 2).
  -h yes|no        Print column headers for new output files. Default is yes.
  -i <Input file>  Default is to read from stdin.
  -m <Max records> End after formatting M records. Default to process all.
  -o <Directory>   Where to put output files. Default to current directory.
  -r               Do not print '=' on numeric-looking strings.
  -s               SQL mode - generate DDL for tables.
  -t <Ticker>      Print progress message every T records.
```

細かいオプションはさておき、とりあえずinputとoutputを指定してあげれば良さそうです。

```
> mqsmfcsv.exe -i mqsmf.bin .\output
```

うまくいけば、"SMF-hoge.csv"のようなファイルが生成されているはずです。
あとはExcelなりで開いてソート→グラフ化とすれば、可視化できて良いでしょう。

# 最後に
このツールではSMFレコードをダイレクトに出力するため、多いものでは列が400近くにもなり、Excelで見るにはちょっと辛いです。
DDLを一緒に作ってくれるSQL modeというものもあるので、うまくDBに突っ込んで、ElasticSearchなどでもっと簡単にソート/抽出/グラフ化したいところです。
capistrano の2系で、git の特定のブランチ名でデプロイできない

# 状況
* Capistrano 2.10 〜 2.15.9 を使っている
* Capistrano 2系の、 multistage 拡張機能を使っている
* cap コマンドを実行するときの、ブランチ名などを指定するためのコマンド引数に `-T` `--tasks` `-e` `--explain` のいずれかが入っている

#️ 事象
デプロイが進まなくなる。エラーが起きる。

ログとしては

```
  * 2016-05-25 20:38:19 executing `foo_bar_stage'
  * 2016-05-25 20:38:19 executing `foo_bar_stage'
```
こんな感じで、 stage 名が二回出てくる。

#️ 原因
コード中に

```rb
      find_and_execute_task(env) if ARGV.any?{ |option| option =~ /-T|--tasks|-e|--explain/ }
```

とある。 https://github.com/capistrano/capistrano/blob/v2.15.9/lib/capistrano/ext/multistage.rb#L30

multistage は、あるメソッドに二回到達する(そして、一回目と二回目で引数を変わっていて、違う分岐に進む)ような構造になっているが、この if 文によってそれが間違った分岐に入る。ように見えます。

ちゃんとは調べてません。調べる意義も感じませんでした。

# 対応策
cap のバージョンをあげ ... られる状況の人は、たぶんこんな問題にはたどり着かないと思うので、引数の名前とかを、上記 NG ワードを含めないように変えるのがいいと思います。


# 雑感
この記事が、誰かにお役に立てば嬉しいです
ファイルの拡張子を一括で変更する

##もともと

```bash
ls
1.csv.gz	2.csv.gz	3.csv.gz	4.csv.gz	5.csv.gz
```


##ターミナル(mac)

```bash
for filename in *.csv.gz; do
> mv $filename ${filename%.csv.gz}.csv;
> done
```

ワンライナーでもok

```bash
for filename in *.rb; do mv $filename ${filename%.rb}.txt; done
```


```bash
for filename in *.!!変更前の拡張子!!; do
> mv $filename ${filename%.!!変更前の拡張子!!}.!!変更後の拡張子!!;
> done
```

##変更後

```bash
ls
1.csv	1.csv	1.csv	4.csv	5.csv
```
デフォルトのCloudFront設定

マネージメントコンソールからS3の静的webサイトホスティングのエンドポイント向けにCloudFrontを立ち上げたので、そのときの設定情報を取得してみた。

```cloudfront_default.json
{
	ETag: '{CLOUDFRONT_DESTRIBUTION_ID}',
	DistributionConfig: {
		CallerReference: '1471603622154',
		Aliases: {
			Quantity: 0,
			Items: [] 
		},
		DefaultRootObject: '',
		Origins: {
			Quantity: 1,
			Items: [ {
				Id: 'Custom-{YOUR_BUCKET_NAME}.s3-website-{S3_REGION}.amazonaws.com/',
				DomainName: '{YOUR_BUCKET_NAME}.s3-website-{S3_REGION}.amazonaws.com',
				OriginPath: '/',
				CustomHeaders: {
					Quantity: 0,
					Items: []
				},
				CustomOriginConfig: {
					HTTPPort: 80,
					HTTPSPort: 443,
					OriginProtocolPolicy: 'http-only',
					OriginSslProtocols: {
						Quantity: 3,
						Items: [ 'TLSv1', 'TLSv1.1', 'TLSv1.2' ]
					} 
				}
			}]
		},
		DefaultCacheBehavior: {
			TargetOriginId: 'Custom-{YOUR_BUCKET_NAME}.s3-website-{S3_REGION}.amazonaws.com/',
			ForwardedValues: {
				QueryString: false,
				Cookies: { Forward: 'none' },
				Headers: { Quantity: 0, Items: [] }
			},
			TrustedSigners: { 
				Enabled: false, 
				Quantity: 0, 
				Items: [] 
			},
			ViewerProtocolPolicy: 'allow-all',
			MinTTL: 0,
			AllowedMethods: { Quantity: 2,
				Items: [ 'HEAD', 'GET' ],
				CachedMethods: {
					Quantity: 2,
					Items: [ 'HEAD', 'GET' ]
				} 
			},
			SmoothStreaming: false,
			DefaultTTL: 86400,
			MaxTTL: 31536000,
			Compress: false 
		},
		CacheBehaviors: { Quantity: 0, Items: [] },
		CustomErrorResponses: { Quantity: 0, Items: [] },
		Comment: '',
		Logging: {
			Enabled: false,
			IncludeCookies: false,
			Bucket: '',
			Prefix: ''
		},
		PriceClass: 'PriceClass_All',
		Enabled: true,
		ViewerCertificate:{
			CloudFrontDefaultCertificate: true,
			MinimumProtocolVersion: 'SSLv3',
			CertificateSource: 'cloudfront'
		},
		Restrictions: {
			GeoRestriction: {
				RestrictionType: 'none',
				Quantity: 0,
				Items: []
			}
		},
		WebACLId: ''
	}
}
```

AWS SDKとかCloudFormationで素のCloudFrontを立ち上げたいときの参考になればです。
Rails / Ruby | 分かりづらい時刻系フォーマットの見分け方

# Time

実はこれだけが ~~pure ruby~~ 拡張なしの ruby のもの。
シンプルに「タイムゾーン付きの時刻」が「全て数字」で記録されている。

```rb
Time.now
# => 2016-08-20 13:04:58 +0900
```

# Date

ruby の拡張。 

名前の通り、日付だけが記録されている。日付しか扱わないので、タイムゾーン情報はない。

```rb
Date.today
# => Sat, 20 Aug 2016
```

# DateTime

ruby の拡張。 

情報としては `Time` とほぼ同じように思えるが、よりも人間に読みやすいフォーマットになっている。
曜日もダイレクトに記録され、月も数字ではなく文字となっている。

```rb
DateTime.now
# => Sat, 20 Aug 2016 13:05:05 +0900
```

# TimeWithZone

Ruby on Rails の独自実装。

`DateTime` とよく似ているが、タイムゾーン情報に国の違い (JSTとか)も付与されており、どの国のタイムゾーンか判別しやすくなっている。

```rb
Time.zone.now
# => Sat, 20 Aug 2016 13:05:08 JST +09:00
```

# 環境

- ruby 2.3.0
- Rails 4.2.6








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Rails | String#to_datetime が現地タイムゾーンを付けてくれない対策



## 1. to_datetime だけの場合

現地のタイムゾーン情報が付加されない。

```rb
ENV['TZ'] = 'Asia/Tokyo'

'2016-09-06'.to_datetime
# => Tue, 06 Sep 2016 00:00:00 +0000
```

## 2. to_time を挟んだ場合

現地のタイムゾーン情報が付加される。

```rb
ENV['TZ'] = 'Asia/Tokyo'

'2016-09-06'.to_time.to_datetime
# => Tue, 06 Sep 2016 00:00:00 +0900
```
## 3. in_time_zone の場合

現地のタイムゾーン情報が付加されるが、フォーマットが異なる。

```rb
Time.zone = 'Tokyo'

'2016-09-06'.in_time_zone
# => Tue, 06 Sep 2016 00:00:00 JST +09:00
```

## 4. in_time_zone を挟んだ場合

現地のタイムゾーン情報が付加される。(2の結果と同じ)

```rb
Time.zone = 'Tokyo'

'2016-09-06'.in_time_zone.to_datetime
# => Tue, 06 Sep 2016 00:00:00 +0900
```



# 環境

- ruby 2.3.0
- Rails 2.4.6








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
PhpStorm 2016.2でPHPUnitのアサーションの補完が効かない問題

8/26 追記：[PhpStorm 2016.2.1](https://blog.jetbrains.com/phpstorm/2016/08/phpstorm-2016-2-1-is-out/)がリリースされました。2016.2.1ではPHPUnitのアサーションの補完が効かない問題は修正されています。

<hr>

PhpSrotm 2016.2では、コード補完の挙動が変わりました。
この結果、`$this->assertSame()`のような形でPHPUnitのメソッドを呼び出す際、`$this->`までを入力した段階で`Ctrl + Space`を押しても`assertSame`が補完されなくなりました。

なお、この問題はPhpStorm 2016.2の初期バージョンにのみ存在し、2016.1や2016.2.1には存在しません。

## TL;DR

解決策は以下の３パターン

* [PhpStorm 2016.2.1](https://blog.jetbrains.com/phpstorm/2016/08/phpstorm-2016-2-1-is-out/)を使う
* 2016.1以前のバージョンを使う
* アサーションメソッドを関数または静的メソッドとして呼び出す
    * `assertSame()` または `self::assertSame()`

## 問題が発生した経緯

* PhpStorm 2016.1で補完の挙動が変更された
    * `$this`のコンテキストで、静的メソッドが補完されなくなった
* PHPUnitでは、アサーションメソッドを静的メソッドとして定義している
* PHPUnitを使う際は、`$this`からアサーションメソッドを呼び出すのが一般的
* 結果、PHPUnitのメソッド補完が効かなくなる！

※詳細はPhpStorm Blogの記事[Completion Changes in PhpStorm](https://blog.jetbrains.com/phpstorm/2016/07/completion-changes-in-phpstorm/)を参照

なお、完全に補完が効かなくなったわけではなく、`Ctrl + Space`を２度押しすれば補完はされます。が、アサーションメソッドを書く度にそんなことやってられない。

というわけで、PHpStormのイシュートラッカーに[バグ報告](https://youtrack.jetbrains.com/oauth?state=%2Fissue%2FWI-32530)がされました。JetBrainsはこの問題をバグとみなして修正し、8/10にリリースされたPhpStorm 2016.2.1 EAP 162.1628では修正済みとなっています。

2016.2.1 EAP 162.1628の時点では、`$this->`で静的メソッドが補完されるようになったのはPHPUnit関連だけですが、静的メソッド補完が効くクラスをユーザが設定できるようにするオプションの追加が[提案](https://youtrack.jetbrains.com/issue/WI-32713)されています。

## 余談

PHPUnitには、`Functions.php`というファイルが含まれています。
このファイルには、アサーションメソッドを関数として呼ぶことができるようにする、以下のような関数定義が含まれています。

```
function assertSame($expected, $actual, $message = '')
{
    return call_user_func_array(
        'PHPUnit_Framework_Assert::assertSame',
        func_get_args()
    );
}
```

したがって、以下の３つの呼び出し方は、いずれも問題ありません。

* `$this->assertSame()`
* `self::assertSame()`
* `assertSame()`

今まで、$thisを書くのが面倒だと思ってたので、関数記法が使えることをもっと早く知りたかった…。
関数記法を使うと、アサーションメソッドを拡張しづらくなりますが、そもそも拡張するようなものではないので、問題ないと思います。

※追記：Functions.phpの中身は関数なので、*オートロードされません*。関数記法を使いたい場合、テストケースの基底クラスを作って、そのクラスでFunctions.phpをrequireするのが簡単です。
pip install XXX で OSErrorが出てしまった時の対処。(メモ)

使用OSはOSXです。
入力コマンド
```
$ pip install パッケージ名
```
エラー内容
```
Exception:
Traceback (most recent call last):
  File "/Library/Python/2.7/site-packages/pip-7.1.2-py2.7.egg/pip/basecommand.py", line 211, in main
    status = self.run(options, args)
  File "/Library/Python/2.7/site-packages/pip-7.1.2-py2.7.egg/pip/commands/install.py", line 311, in run
    root=options.root_path,
  File "/Library/Python/2.7/site-packages/pip-7.1.2-py2.7.egg/pip/req/req_set.py", line 640, in install
    requirement.uninstall(auto_confirm=True)
  File "/Library/Python/2.7/site-packages/pip-7.1.2-py2.7.egg/pip/req/req_install.py", line 716, in uninstall
    paths_to_remove.remove(auto_confirm)
  File "/Library/Python/2.7/site-packages/pip-7.1.2-py2.7.egg/pip/req/req_uninstall.py", line 125, in remove
    renames(path, new_path)
  File "/Library/Python/2.7/site-packages/pip-7.1.2-py2.7.egg/pip/utils/__init__.py", line 315, in renames
    shutil.move(old, new)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py", line 302, in move
    copy2(src, real_dst)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py", line 131, in copy2
    copystat(src, dst)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py", line 103, in copystat
    os.chflags(dst, st.st_flags)
OSError: [Errno 1] Operation not permitted: '/var/folders/tx/22hzdby50gg4cbnzx_39c5dm0000gn/T/pip-ziJ8uF-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/numpy-1.8.0rc1-py2.7.egg-info'
```

解決方法

はじめにpipをアップグレードしておく。これは念のためでしなくてもいい。
```
pip install --upgrade pip
```
そのあと次のコマンドでインストールできるはず。パッケージ名は適宜書き換えてください。
```
sudo pip install パッケージ名 --upgrade --ignore-installed six
```
Hello Golang App

# やろうとしたこと
下記のサイトに沿って、
Webサーバ：nginx
アプリサーバ：Golang
という構成でMVPなWebアプリの基本を構築しようと思いました。

nginx + Go-FCGI で Web アプリを動かす
http://qiita.com/senda-akiha/items/0f37c8239caeeec2ba06

# 環境
http://qiita.com/SenoEisuke/items/1d487541c2479fb94ed4#pf%E7%92%B0%E5%A2%83
vagrant:1.8.4
vm:（サーバ）
[vagrant@localhost chat]$ more /etc/redhat-release
CentOS Linux release 7.2.1511 (Core)

# 悲しい結論
諦めました。
試行錯誤に興味があれば私のブログをご覧ください。
http://seno-esuke.hatenablog.com/entry/2016/08/14/184623

下記のサイトを見たら何とかできそうな気もしました。（やってはいませんが。
Nginx + Golang でWebアプリケーション開発を試してみた
http://umegusa.hatenablog.jp/entry/2015/02/22/025832

# Golang標準のWebサーバでHelloを見るトラブルシューティング
## 補足
動かしているのはやろうとしたことサイトの
standalone_hello.goをvmの環境で動かして、
ホストOSのブラウザから"Hello World!"を見れるところがゴールです。

## トラブルシューティング
ふとポートは開いているのだろうか？と思って調べてみる

下記のサイトをみたら（広告がすごく邪魔ですが。サイト主様すみませんm(_ _"m)）
20.Linuxのポート状況を確認する Linuxの小技：UNIX/Linuxコマンド Topics Linux初心者のためのサイト
http://linux-topics.com/02linuxkowaza/20linux.html

netstat -aで全部出てくるみたい。

うん。開いてないね。そりゃアクセスもできないかー＼(^o^)／
全然言及されてなかったのは常識だってことか。。

てかポートを普通に80に変えれば良かった説。。
※⇒やってみたら即プロセス終了。バッティングしてるから？

このサイトを見てポートを開いたら無事"Hello World!"が見れた。

CentOS7（RHEL7） Firewalldの基礎の基礎 | LINUXの勉強ブログ
https://www.jdbc.tokyo/2014/10/centos7-firewalld-startup/
Ubuntu16.04サーバーにvirtualBoxをインストールする

#Ubuntu16.04サーバーにvirtualBoxをインストールする
公式HPを参考にしてインストールする
https://www.virtualbox.org/wiki/Linux_Downloads

##VirtualBox リポジトリの追加
```lang:
sudo add-apt-repository "deb http://download.virtualbox.org/virtualbox/debian xenial contrib"
```

##keyの追加
```lang:
wget -q https://www.virtualbox.org/download/oracle_vbox_2016.asc -O- | sudo apt-key add -
```

##インストール
```lang:
sudo apt update
sudo apt install virtualbox-5.1
```

##おまけ
コンソールから操作したい場合、下記コマンドで可能。
これは便利！！！！

###起動
--type headlessをつけるとバックグラウンドで動かせる。便利！！

```lang
sudo vboxmanage startvm "ゲストOS名" --type headless
```

###電源ＯＦＦ、保存、ポーズなど
savestateは画面から行う保存と一緒です。
pause resume は一時停止、再開です。保存とは違うので注意してください。

```lang:
vboxmanage controlvm "ゲストOS名" [ poweroff  | savestate | reset | pause | resume ]
```

###その他

```lang:
vboxmanage list [ vms | runningvms| etc...]
```

設定を見たい場合

```lang:
vboxmanage showvminfo "ゲストOS名"
```

設定の変更
パラメータは下記サイト
http://www.virtualbox.org/manual/ch08.html#vboxmanage-modifyvm

```lang:
vboxmanage modifyvm "ゲストOS名" --設定項目 設定値
```
古の技術になりつつあるIE8・IE9対応でやること、使えないもの

Windows10の強制アップデートのおかげ(?)もあってか、最近のブラウザ対応ではIE9以下はほとんど切り捨てるようになっています。
いろんなAPIやインタラクティブなサイトを作る場合は特に顕著です(そもそも対応してないし)。

そんななか、IE9だけでなくIE8までも対応すべき状況になったときのために、
Google検索
先人たちの知恵を借りて、対応すべきことと使ってはいけない(というよりは対応していない)CSSプロパティ、JavaScriptのメソッドなどを雑多にあげてみました。
情報の粒度なんて知らない。


「IE8だけ動かねぇ...」というものは、たいてい非対応系で生じる不具合ですので、使わないで同じ挙動を実現させるための対策を練りましょう。



## やるべきこと


### html5shivを入れる

- 要対策: IE8/IE9

現在のWebサイトの制作では、HTML5によるマークアップが標準となっていますが、IE9以下のブラウザはHTML5で新たに追加されたタグ(`article`、`section`など)はHTMLタグとして認識されません(HTML5が策定される前のブラウザなのであたりまえですが)。

CSSなどのスタイルをつけていてもそれも無効化されちゃいます。

それを認識させるためのプラグインがhtml5shiv.jsです。

`head`で読み込めば終わりです。

```html
<head>
<!--[if lt IE 9]>
  <script src="path/to/html5shiv.js"></script>
  <!-- CDNでもあります↓ -->
  <script src="https://cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv.min.js"></script>
<![endif]-->
</head>
```


### Respond.jsなどでMedia Queryに対応させる

- 要対策: IE8

IE8ではMedia Queryに対応していません。
モバイルファーストでCSSを書いていた場合、「CSSが微妙にあたってるけどほとんどあたってない...」みたいな状況になりかねないので、IE8以下で読み込んでおけば大丈夫かと思います。

[Respond.js](https://github.com/scottjehl/Respond)

```html
<head>

...
<!--[if lt IE 9]>
  <script src="path/to/respond.js"></script>
<![endif]-->

</head>
```


### opacityでの透過処理にfilterを追加

- 要対策: IE8

```scss
.hover-link {
  &:hover {
    opacity:0.8;
    filter:alpha(opacity=80);
    -ms-filter: alpha(opacity=80);
  }
}
```


### ベンダープレフィックスの設定をIE8(or 9)まで下げる

「pleeease」や「autoprefixer-rails」などを使っている場合忘れがちです。

[browserlist](https://github.com/ai/browserslist)などを見て修正しておきましょう。

```yaml
browsers:
  "ie >= 8"
```


### jQueryのバージョンを1.x系にする

- 要対策: IE8

2.x系はIE10〜、3.0以降はIE9〜対応なので、IE8でもjQueryを使う場合は1.x系にバージョンを変えておきましょう。


### 互換表示モード

- 要対策: IE8/IE9

IEでは互換表示というものがあって、レンダリング方法を前のバージョンに変更できます。
予期せぬレイアウト崩れはこれが原因の場合もあるので、最新のモードで常に表示するように設定しておきましょう。

```html
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
```



## 使えないもの

次にやってはいけない・使ってはいけないCSSやJSのメソッドを紹介します。


### CSSで使えないプロパティ・値・セレクタ

- `display: flex`とflex関連のプロパティ
- `transition`
- `animation`
- `background-size` (IE8のみ)
- `rgba()`・`rgb()` (IE8のみ)
- `:checked`などのCSS3セレクタ([caniuse](http://caniuse.com/#feat=css-sel3)参照)
- `border-radius` (IE8のみ)
- `box-shadow` (IE8のみ)

考えただけでもこれだけあります。

#### **使えなさそうで使える要素**

逆に使えなさそうで使えるものはこんくらいあります。

- `box-sizing`
- `display: inline-block`
- `:before` / `after`
- 隣接セレクタ(`selector ~ selector`)


### javacscriptのメソッド

- `Object.assign`
- `Array.some`
- `.bind`
- `classList`

jsの基本文でも使用できないものが多くあります。
Polyfillを探して入れるなどで対策しましょう。


### before / afterのコロンは2つにしない

- 要対策: IE8

擬似要素の`before` / `after`はコロン２つ(`::`)で記述することができますが、IE8ではコロン2つで指定した擬似要素は認識されません。
特に困ることはないと思うので、IE8対応の際はコロンを1つにしておきましょう。


## 最後に

まだまだあるきはしますが、何か思いついたら追記していきます。
AngularJSまとめ ~モジュール~

モジュールについていまいちわかっていなかったので調べました。


#モジュール
AngularJSでは、**モジュール**という単位でコードを分割することができます。
以下、モジュールの特徴です。

- モジュールにはアプリケーションがどのように立ち上がるのか(モジュールの構成情報、アプリの初期化情報)を定義することができる
- モジュール固有のコントローラ、サービス、ディレクティブなどの、アプリを構成するコンポーネントを定義することができる
- モジュールの中で他モジュールを依存先として指定して、他モジュールを使用できる

大規模なアプリや複雑なアプリでは複数モジュールを使用してアプリを管理することがあります。
また、サードパーティのサービスはモジュールとして提供されているので、これらを依存先として定義して使用することができます。

モジュールは、アプリの機能毎(機能A、機能B、機能C...など)に分割することもできますし、コンポーネントの種類ごと(コントローラ、サービス、ディレクティブ...など)に分割することもできます。

#モジュールの作成
モジュールを作成するためのメソッドとして、angular.moduleメソッドが用意されています。

```lang:moduleメソッド
module(name [,requires [,config]])

name : モジュール名(String)
requires : 依存先のモジュール(配列)
config : 構成の定義(関数)　※今回説明は割愛します
```

requires 、configは省略可能です。
`myApp`という名前のモジュールを作成したい場合は以下のようにします。

```lang:sample.js
var app = angular.module('myApp' , []);
```

これで`myApp`モジュールが作成されます。
モジュールを新規作成する場合、依存するモジュールがなかったとしても`[]`(requires)が必要となります。
`[]`(requires)を省略した場合、すでに作成されたモジュールを取得しようとします。
モジュールが未作成の状態で`[]`(requires)を省略したmoduleメソッドを使用すると、エラーが発生します。


```lang:sample.js
var app1 = angular.module('myApp' , []);
var app2 = angular.module('myApp');
```

よって、上記のapp1とapp2の中身は同じものが取得できます。

モジュールにはコンポーネントを定義できます。
すでに作成されたモジュールの取得は、一つのモジュールの宣言と、そのモジュールに対するコンポーネントの定義を別ファイルに分けたい、といった場合に有効となります。


#依存モジュールの設定
moduleメソッドを使用して、依存するモジュールを設定することができます。
`myApp`モジュールで、`ngMessages`モジュールを使用したい場合は、以下のようになります。

```lang:sample.js
var app = angular.module('myApp' , [’ngMessages’]);
```

`ngMessages`モジュールはAngularJSの標準モジュールです。
AngularJS自体も複数のモジュールから構成されています(細かくモジュールを分割することで、不要なモジュールをインポートするする必要がなくなります)。
もちろん、自分で定義した別モジュールを依存先として設定することも可能です。

#モジュールへの設定
アプリの構成部品(コンポーネント)をモジュールに登録することができます。
moduleメソッドの戻り値はModuleオブジェクトです。
Moduleオブジェクトの持つメソッドを使用して、コンポーネントを登録します。

`myApp`モジュールに`myController`コントローラコンポーネントを登録する場合は、以下のようになります。

```lang:sample.js
angular.module('myApp' , [])
  .controller('myController', function(){
    // コントローラの定義
  });
```

以下、controllerメソッドの定義説明です。

```lang:controllerメソッド
controller(name, conrtoller)
name : コントローラ名(String)
conrtoller : コントローラのコンストラクタ(関数)
```

controllerメソッドも含み、Moduleオブジェクトのメソッドのほとんどは戻り値として自分自身(Moduleオブジェクト)を返します。そのため、以下のように複数のコンポーネントを一つの文で登録することも可能です。

```lang:sample.js
angular.module('myApp' , [])
  .controller('myController', function(){
    // コントローラの定義
  })
  .service('myService', function(){
    // サービスの定義
  });
```

以下、Moduleオブジェクトの主なメソッドです。

| メソッド | 定義する内容 |
|:-:|:-:|
| animation | アニメーションを定義 |
| controller | コントローラを定義 |
| directive | カスタムディレクティブを定義 |
| filter | フィルターを定義 |
| service, factory, provider, value, constant | サービスを定義。どのようなサービスを作成するのかによって、メソッドを使い分ける |
| config | モジュールの構成情報を定義 |
| run | アプリの初期化情報を定義 |
C言語でのショートコーディング

C言語には環境にも依存するがショートコーディングの手法が多々あるので忘れないようにメモで残しておく。

#宣言の省略
```c:sample1.c
a,b,c;
main(){}
```
stdio.hのinclude文はコンパイル時にWarningが出るが、省略することができる。
また、int型の宣言は、C言語はデフォルトでintと宣言するため省略することができる。
また、グローバル変数はローカル変数とは違い、0に初期化されるのでこれらも用いることができる。
上のsample1.cではa,b,cがint型で宣言され、中身の値は0で初期化されている。
main関数のintも省略して書ける。returnも書く必要はない。
#条件分岐の省略
##三項演算子

```c:sample2.c
int a, b, c;
c = (a < b)?a:b;
```
三項演算子は(条件式)?(真のとき):(偽のとき)で分岐をすることができる。

#if文自体を省略
```c:sample3.c
a;
main(){
    !a&&printf("Hello\012");
}
```
「&&」を用いることで、(条件)&&(条件が真の時実行される処理)
という書き方ができる。この場合では初期化されたaの値は0なので
!aは真になり、Helloが出力される。
偽のときに実行されるようにしたい場合は「||」を用いる。

#コマンドライン引数の省略
コマンドライン引数とはmain関数に渡される引数のことである。
main関数の第一引数にはintが、第二引数にはchar**が入る。実行環境によってこれは異なるが、
もしこの引数の中身の型宣言を省略したい場合、特殊な書き方が必要になる。

```c:
//main(int a,char**b){}
  main(a,b)char**b;{}
```
第一引数のint型の宣言を省略することはできない。しかし、どちらの型宣言も省略しようとするとエラーを吐く。これを解決する為に上のような書き方をする。
この書き方にすると正規の書き方に比べて2byte分省略することができる。


自分はまだまだC言語とかショートコーディングビギナーなので間違ってるとこあったら教えてくださいm(_ _)m
直線位置調整 > S-12ドライブした / ゲート電圧の測定

関連 http://qiita.com/7of9/items/1ed403244bf072faeb17
関連 http://qiita.com/7of9/items/8592234451ac76572f46

S-12(1.5V 1A)駆動に挑戦中。

NチャネルMOSFET 2SK4017を入手して試した。
http://akizukidenshi.com/catalog/g/gI-07597/

## 回路図

[kohacraftさんのblog](http://kohacraft.com/archives/1048634380.html)の記事を参考にした。

その回路図は
https://upverter.com/7of9/12f16f7f40fac9b0/160819_MOSFET_motorDrive/

- R1のところでS-12の電池用端子と接続する
- Inputには3.3Vの電池を接続した
  - 今後、ESP8266のGPIOを使う
- R2には1.1kを使っている
  - 220との違いは未調査

## 結果と備考

Inputに3.3Vを接続したところ、S-12が回転するようになった。

![qiita.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/d67a4991-5c17-02ac-f823-a4aa9cfb1d7c.jpeg)

以下、備考

- 2SK4017のゲートに1.1kでプルダウン抵抗をつけると動かなくなる
  - 未消化
  - プルダウン抵抗は[きむ茶工房ガレージハウスさんの記事](http://www.geocities.jp/zattouka/GarageHouse/micon/circuit/FET.htm)を参考にしている
- S-12の電池用端子への接続はGND, Hot反対にしてもモーターが回転した
  - モーターの電圧は反転しても動くのか未消化
  - しかしながら、本来の接続方向に合わせるのが無難だろう

19記事目でようやく動くようになった。
そのモーター音を堪能しているかというと、Dive to Blue / Drag & Hug / 奇跡を祈ることはもうしない、などの曲が気に入りしすぎて、モーター音を聞いていない。

ESP8266のGPIO14でも駆動することを確認した。

## ゲート電圧の測定
(追記 2016/08/28)

@ar90n@github さんにいただいたコメントをもとに、ゲート電圧をAnalog Discovery2(以下AD2)で測定してみた。

### ゲートに1.1kのプルダウンをつけていない時

ゲート電圧は3.1069Vになっている。
ノイズがたくさんあるようだ。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/1c8db11d-c7e0-ca16-5891-b7002673e2db.png)

### ゲートに1.1kのプルダウンをつけた時

ゲート電圧は1.5643Vになっている。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/24574f23-509d-d99c-7a5b-487ce2936341.png)

プルダウンをつけない場合と比べて、半分程度の値になっているようだ。

### 自分の理解

- ゲート入力の直列抵抗: 1.1k
- プルダウン抵抗: 1.1k

この場合、3V入力に対して分圧で(1.1 / (1.1+1.1))倍され1.5Vとなる。

ゲート電圧を上げたい場合、上記のゲート入力の直列抵抗を減らすか、プルダウン抵抗を上げることになる。

試しに

- ゲート入力の直列抵抗: 220
- プルダウン抵抗: 1.1k

とした場合、3V * (1.1 / (1.1 + 0.22))=2.5Vとなる。

2つの抵抗の組合せを考える必要がありそうだ。

よく考えると、この回路構成は自分が使っているAD取込で1/10倍にしている回路そのものだ。18k(直列)と2k(プルダウン)の組合せで1/10にしていた。

### 抵抗変更 220 + 1.1k

- ゲート入力の直列抵抗: 220
- プルダウン抵抗: 1.1k

にて測定しなおした。

ゲート電圧は2.605Vとなり、S-12はドライブした。

ノイズが多い。モーター駆動と関係あるのだろうか。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/f312cd4d-f9b3-4354-8533-161fe52f4f03.png)
[AWS][GCP]Pythonで簡単にクラウドサービスが利用できるようにしてみた

#最初に
- Python2系で動作確認をしましたが、3でも動作すると思う、多分。知らん。
- 使う際には自己責任でお願いします。
- 問題あれば、プルリクください。

#なぜ作ったのか
- boto3が気に入ったので、何か作って公開したかった。
- googleapiclientはいろいろごちゃごちゃとやらなければいけないため、ラッパークラスを作ればみんな幸せになるかなと思った。

#使い方
[githubのページ](https://github.com/Akira-Taniguchi/cloud_lib)にも書いてありますが、こちらにも
1. 適当なvirtualenv環境を作成
2. pip install cloud_lib
3. あとはこんな感じ

```
#EC2インスタンス起動
from cloud_lib.amazon_services import Ec2
ec2_service = Ec2(aws_access_key_id, aws_secret_access_key, region_name)
ec2_service.start_instance('instance_id')

#BigQueryテーブル削除
from cloud_lib.google_services import BigQuery
bq_service = BigQuery(project_id, client_id, client_secret, refresh_token)
bq_service.delete_table(data_set_id, table_id)
```

その他
- SQSにメッセージを入れたり、逆に出したり
- EC2止めたり
- S3やGoogle Storageにファイルアップロードしたり、逆にダウンロードしたり
- DynamoDBやBigQueryに対してテーブルコピーしたりストレージからインポートしたりデータ取得したり
などができます。詳しくは[readme](https://github.com/Akira-Taniguchi/cloud_lib)をご確認ください。

#作ってみた感想
- cloud_libなんてありきたりな名前がまだ開いていたのはびっくり
- まだまだ足りない機能はありますが、今後追加していく予定。そして予定は未定。
- boto3が無い分、google_services.pyのソースは長くなりがち

#補足
勝手にこういうの作っても問題ないと思っていますが、ダメな場合消しますので、連絡いただけたらと思います。
すみません。
Heroku 自分用メモ

### Heroku Toolbeltの開発PCへのインストール
[ココ](https://toolbelt.heroku.com/)から

### ログイン

```
$ heroku login
```

### herokuへのアプリケーション登録

```
$ heroku create [App Name]
```
- この時点でgitのremote "heroku" が登録される
- githubでもソースコード管理したかったらgit remote add origin [githubのURL]しておく

### アプリケーションの作成
  - よしなに。
  
### 環境変数の設定(管理画面上の「Config Variables」)

```
heroku config:set [環境変数のKEY=環境変数のVALUE]
```

### アプリケーションのログ確認

```
$ heroku logs --tail
```

### 別の開発環境で開発を続行するとき
移行先でHeroku Toolbeltをインストール後に 

```
$ heroku git:clone --app [App Nane]
```
あとremote originへのgithubリポジトリURL登録も。


### ヘルプコマンド

```
$ heroku help
```
Ruby | tap がよく分かってなかったので基本を調べてみた

tap はメソッドの評価として、**まるで書かれていないのと同じ結果**になる。（破壊的変更をしないかぎり）
だけど **その中で色々出来る** という奴だ。

# 確認

## 手順1. 文字列を大文字に変える。

```rb
'abc'.upcase
# => "ABC"
```


tap を使わないケース。
当たり前だが、返り値は大文字になる。

## 手順2. 非破壊的変更

```rb
'abc'.tap { |string| string.upcase }
# => "abc"
```

tapで「文字列自身」に変更を加えているのにも関わらず、メソッドの返り値は変わらず小文字のままだ。
つまり、この書き方だと何も起こらない。


## 手順3. 文字列の出力

```rb
'abc'.tap { |string| puts string.upcase }
# ABC
# => "abc" 
```

これを見ると**メソッドの返り値は変わっておらず小文字のまま**だけれど、**tap自体は動作しており大文字が出力されている** ことが分かる。

## 手順4. 破壊的変更

`upcase!` では破壊的を加えると、レシーバ自身が変わるため、戻り値も変わるようだ。

```rb
"abc".tap { |string| string.upcase! }
=> "ABC"
```

# 結論

- tapは「メソッドの中で何かしたいけど、メソッド自体の評価は変えたくない」時に使う。
- 破壊的変更を加えることも出来る

# 環境

- ruby 2.0.0








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
2016-08-20 考察 > 小型ICのケース収納 / 電子部品の在庫管理 > information display

## 前置き

![qiita.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/a08ead67-bf78-4664-758e-a16978f2f863.jpeg)

- 上のケース
  - http://meihokagaku.co.jp/?p=1955
- 下のケース
  - http://meihokagaku.co.jp/?p=1995

ともに明邦化学工業のケース。

ケースを探している時に天王寺の釣具店で見つけた。別途、奈良のロイヤルホームセンターでも扱っていることを知った。
自分が時々行く場所近辺で扱っているケースを使うことで、収納フォーマットが統一される。
近所の100円ショップで売っているものでもいいが、お店自体が閉店するという経験を数回しているので、入手の継続性のため、ケースそのものの製造元情報がはっきりしているものを使うことにしている。

## 問題点と改善点

上記のように小さいICをケースに入れるのが最近のお気に入り方法だが、問題はそれぞれのICの情報が分からない。

- 中を開けて型番を確認しないといけない
  - モジュールによっては記載の型番と製品名が乖離しているものもある
- ちょっとした付随情報も見れない。

シリアル番号を各所に張っていく方法もあるが、「シリアル番号13は何か？」という記憶に頼る整理法は破たんする。

改善点として

- 二次元バーコードシールをはる
- 二次元バーコードをスマホで読取る
  - 付随情報含めてスマホに表示される
  - 部品探索時は各表示が0.5秒程度で終わること (高速モード)
  - データシート閲覧時は3秒などの表示でもいい (詳細モード)
 
欠点

- バーコードをスキャンした結果表示される情報はデータベース化する必要あり
  - RDB + SQL? or dictionaryでごまかす
  - データ入力作業が別途必要 : その場合、PCで入力したい

色々検討することが出てくる。

実作業16時間程度で作れるシステムになれば実装を開始するが、上記の場合はそれくらいでは済みそうにない。2次元バーコードを扱ったこともないし、2次元バーコードシールプリンタもない。

6桁のハッシュ値なら、P-touchで印刷できるか。
2次元コードもP-touchで印刷できるようだ。
http://www.brother.co.jp/product/labelprinter/editor50/

> 2次元コード
PDF417(スタンダード、トランケート、マイクロ)、QR コード(モデル1、モデル2、マイクロ)、データマトリックス(ECC200 Square、ECC200 Rectangular)、マキシコード

[バーコード講座](http://www.keyence.co.jp/barcode/special/codereader/lecture/)
RPi > Link > GPIOオスメス変換 > 40ピンソケット2つ使用

```txt:動作環境
Raspberry Pi2 (以下RPi)
```

[過去記事](http://qiita.com/7of9/items/33296849786e38ff3467#%E3%82%B7%E3%83%BC%E3%83%AB%E3%83%89%E3%82%BF%E3%82%A4%E3%83%97)においてRPiのGPIOのオスメス変換をしていたが、その内容をQiitaで検索しようとして見つかりにくかった。
そのため、別記事とする。

オスメス変換の元情報は以下のブログを参考にしました。
http://cranberrytree.blogspot.jp/2014/12/raspberry-pi-b40.html
HubotでHotpepperグルメサーチAPIを使ってお店を紹介してくれるやつを作った

勉強のため、HubotでAPIを叩けるようにした。
twitterとかやりたかったけど、トークンがややこしかったのでHotpepperグルメサーチAPIを使ってお店をランダムでおすすめしてくれるものを作りました。

## APIキーの取得
まずはAPIキーを取得します。
[ホットペッパーAPIリファレンスページ](http://webservice.recruit.co.jp/hotpepper/)に行って、左メニューの「新規登録」からメールアドレスを入力 → 「送信」で、メールが届くのでメールの内容に従って登録を完了させる。

登録が完了したらWebサイトのAPIキー発行ボタンを押すとAPIキーが書かれたメールで送られてくるので、それを控えておく。

ちなみに登録を取り消したい時はメールアドレスを入力して送信するだけで、簡単にできる。

## スクリプトを書いていく
APIキーを取得したらそれを使ってスクリプトを書いていきます。なお、Hubotのセットアップは他のサイトを参考にしてください。

### いきなり完成形
まずは完成形をお見せします。

```
# Description:
#   説明を書く
#

module.exports = (robot) ->
  robot.hear /ご飯行こう/i, (msg) ->
    request = msg.http("http://webservice.recruit.co.jp/hotpepper/gourmet/v1/?key={自分のAPIキー}&large_area=Z011&format=json")
    .get()
    request (err, res, body) ->
        json = JSON.parse body
        num = Math.floor( Math.random() * 11 );
        shopName = json["results"]["shop"][num]["name"]
        shopUrl = json["results"]["shop"][num]["urls"]["pc"]
        msg.send "#{shopName} \n #{shopUrl}"
```

### 説明
```
module.exports = (robot) ->
  robot.hear /ご飯行こう/i, (msg) ->
```
「ご飯行こう」というフレーズに反応して処理を実行します。

```
request = msg.http("http://webservice.recruit.co.jp/hotpepper/gourmet/v1/?key={自分のAPIキー}&large_area=Z011&format=json")
    .get()
```
`http://webservice.recruit.co.jp/hotpepper/gourmet/v1/?key={自分のAPIキー}&large_area=Z011&format=json`ここでAPIを叩いてます。ここでは練習で`&large_area=Z011`として東京のお店を返すようにしています。
`&format=json`とすることで結果がJSONで返ってきます。

```
request (err, res, body) ->
        json = JSON.parse body
        num = Math.floor( Math.random() * 11 );
```

`json = JSON.parse body` 帰ってきたJSONをjsonという変数にいれます。
`num = Math.floor( Math.random() * 100 );` お店をランダムで取得したいので、変数numに乱数を入れておきます。

```
        shopName = json["results"]["shop"][num]["name"]
        shopUrl = json["results"]["shop"][num]["urls"]["pc"]
        
```
お店の名前とURLを変数shopName、
 shopUrlにいれます。["shop"][num]とすることで返ってきたお店の中からランダムで一店舗抽出します。
jsonの構造は[このページ](http://webapi.aulta.net/hotpepper/api/gourmet/v1)で確認するとわかりやすいと思います。

```
msg.send "#{shopName} \n #{shopUrl}"
```
あとはそれをコメントで返すようにしてやればOK。

こんな感じで返ってきます。
```
mybot> ご飯行こう
mybot> はなの舞 新宿東南口店 http://www.hotpepper.jp/strJ000712881/
```
うん。いいね。

## ちょっと改良
このままだと東京のお店しか返さないので、指定した場所のお店を返すようにします。

```
robot.hear /ご飯行こう/i, (msg) ->
                 ↓
robot.hear /ご飯行こう (.+)/i, (msg) ->
    query = encodeURIComponent msg.match[1]
```
「ご飯行こう ◯◯」の「◯◯」の部分を正規表現で抜き出します。
`query = encodeURIComponent msg.match[1]`としてマッチした文字列をエンコードします。

```
msg.http("http://webservice.recruit.co.jp/hotpepper/gourmet/v1/?key={自分のAPIキー}&large_area=Z011&format=json")
                 ↓
msg.http("http://webservice.recruit.co.jp/hotpepper/gourmet/v1/?key={自分のAPIキー}&address=#{query}&format=json")
```
`&address=#{query}`でさきほど抜き出した文字列をセットします。

```
mybot> ご飯行こう 那覇
mybot> 鉄板×BAR×炭焼 Stand スタンド 
http://www.hotpepper.jp/strJ000804975/?vos=nhppalsa000016
```

いい感じ。

あとは、Slackと連携してやれば面白いと思います。
もうちょっと応用して食べたい料理（ラーメンとか）も指定できるようにしたいです。
技術英語 > Differentiating Types and Variables via [All Caps]

@ Code Complete (No. 9121 / 36077)

変数の型名の大文字小文字、prefixなどの例において以下の一例がある

> Example 11-14. Option 2: Differentiating Types and Variables via <font color=red>All Caps</font>

```
WIDGET widget;
LONGERWIDGET longerWidget
```

Type名をすべて大文字で表すのを「All Caps」という記載になっている。

<hr>
別の場所では

@ Code Complete (No. 9177 / 36077)

> the customary approach is to <font color=red>use all uppercase letters</font> for a type name
rictyにnerd-fontsのパッチを当てる(試行錯誤)

自分の覚え書き用なので、それほど人に見やすくとかは意識してない。

# 環境

Windows 10
Cygwin

ただし、パッチを当てる作業はLinuxでやった。

# 目的

Windows環境で、Cygwinを使ったときに、多くのglyphsを表示できるようにしたい。
(ちょっと面倒なので曖昧に書いてる)

ある程度ちゃんと追記しました([2016.11.10](http://qiita.com/nechinechi/items/27f541849db04123ea15#20161110-%E8%BF%BD%E8%A8%98)から書いてます)

# きっかけ

[Ricty + Powerline + NERD Fonts - ツヅリサイクル](http://notes.nyarla.net/entry/RictyPowerlineNERDFont) をみたこと

# 依存パッケージ

 * fontforge

だけ。たしか...

# fontforge installation

[Installing FontForge from Git Source Code](https://github.com/fontforge/fontforge/blob/master/INSTALL-git.md)

# nerd-fontsのパッチを当てる

[ryanoasis/nerd-fonts](https://github.com/ryanoasis/nerd-fonts) を `git clone`する

### 実行コマンド

```
fontforge -script ./font-patcher <path/to/font-file> -w --fontawesome --fontlinux --octicons --pomicons --powerline --powerlineextra
```

`-w`はWindowsに対応させるためのオプション。
たしかwindowsでは、31文字以上のフォント名はインストールできない。だと思う...

今のところ、[mzyy94/RictyDiminished-for-Powerline](https://github.com/mzyy94/RictyDiminished-for-Powerline)からとってきた、以下の2つで試した。


 * RictyDiminishedDiscord-Regular.ttf
 * RictyDiminishedDiscord-Regular-Powerline.ttf

個人的に`0`とか`D`とかの表記が`Discord`の方が好きなので、これしか試してない。ただ、`|`(パイプ)の表記は嫌い。なので、最終的には自分で生成したricty-discordを使うつもり。
今後、dimished以外でも試す。

### 結果

 * `-w`オプションは必要だった。
   これがなければ、cygwinでフォントがないって言われて、選択できない。
   (その原因が何かは分からない)
 * `powerline`ってついてる方は、`-w`付けてもダメだった。

# 2016.11.10 追記

この記事見てくれてる人がいるみたいなので、数か月前の記憶を思い出しながら、納得のいくフォント生成の手順を書こうと思った。正直ちょっと前の記憶なので、間違ってるところあるかも...

納得がいったフォントの生成までの流れがこんな感じです。

1. Ricty 生成
2. Ricty-Discord 生成
3. Ricty-Discord をWindowsで使えるようにする
4. nerd-fontsのパッチをあてる

若干、3と4の順序の記憶が曖昧...
もし最後までやって、変なとこあったら、3と4の順序入れ替えて試してみてください...そのときには報告ももらえたら嬉しい...

## Ricty 生成

Rictyの生成に関しては以下のサイトにあるので、こちらを見た方がいい。
Rictyの生成は、Ricty生成スクリプトである`ricty_generator.sh`を使う。(以下サイトでダウンロード可)

[プログラミング用フォント Ricty](http://www.rs.tus.ac.jp/yyusa/ricty.html)

## Ricty Discord 生成

こちらも[先ほど挙げたサイト](http://www.rs.tus.ac.jp/yyusa/ricty.html)を見てください。
Ricty Discordの生成には、Ricty Discord コンバートスクリプト`ricty_discord_converter.pe`を使う。
これも先ほどのサイトから取得できます。

因みに私は Ricty Discord の`|`の表記が破断線 (Inconsolata のグリフ)になるのが嫌いだったので、`ricty_discord_converter.pe`に`-bar`オプションだけつけて生成しました。

## フォントの不具合を修正

恐らく、上記までの手順では、フォントの幅が広すぎるといった不具合があるはず。(もしなければ、恐らくこの手順は踏まなくても大丈夫)
具体的にどんな感じの不具合化は、下にある参考にしたブログから確認ください。

この不具合の修正には`os2version_reviser.sh`というスクリプトを使用。
これも[先ほど挙げたサイト](http://www.rs.tus.ac.jp/yyusa/ricty.html)の一番下にある「既知の問題」ってところの1行目のところに、取得することができるリンクが張られてるので、そこからダウンロードする。

使い方はこんな感じに。

```
sh os2version_reviser.sh <Ricty_file>
```

以下ブログを参考にしました。
[Windows でプログラミング用フォント Ricty を何とか生成する](http://d.hatena.ne.jp/yascentur/20110715/1310685255)

## nerd-fontsのパッチをあてる

最後に上の方にも書いたようにnerd-fontsのパッチを当てて完成。

```
fontforge -script ./font-patcher <path/to/font-file> -w --fontawesome --fontlinux --octicons --pomicons --powerline --powerlineextra
```

ここで、`--fontawesome` や `--fontlinux`などのオプションは、[ryanoasis/nerd-fonts](https://github.com/ryanoasis/nerd-fonts)をみて、自分に必要なグリフの入ってるグリフセットだけを選べば十分だと思います。

僕は[Powerline Extra Symbols](https://github.com/ryanoasis/nerd-fonts#powerline-extra-symbols)が表示されるようになれば良かったので、オプションは`--powerlineextra`だけでも十分でしたね。
全部入れてますけど...
備忘録

#### ライトの設定は変えていないのに部屋が勝手に暗くなる／明るくなる
+ Eye Adaptation（自動露光）を無効化する。
    + Project Settings->Engine->Rendering->Auto Expose:False

#### 中ボタンでの動きがUnityっぽくない
+ Middle Mouse Panの設定を変更する。
    + Edit->Editor Preferences->Level Editor->Viewports->Invert Middle Mouse Pan:True
Flexboxをインライン要素に使って3点リーダー表示させる

## アイコン(固定幅)とテキスト(可変幅)のインライン要素にflexboxでスタイリングする
```HTML:HTML
<div class="flexContainer">
    <!-- アイコン部分 Fontawesome とか -->
    <i class="flexContainer__icon fa fa-check" aria-hidden="true"></i>
    <!-- テキスト部分 -->
    <span class="flexContainer__text">ああああああああああああああああ</span>
</div>
```

というHTMLに対して

```CSS:CSS
.flexContainer {
    display: flex;
    flex-direction: row;
    /* 垂直方向の揃え方はお好みで */
    align-items: baseline;
}

.flexContainer__icon {
    /* 伸びも縮みもしない(0 0) ベース幅はコンテンツのサイズ(auto) */
    flex: 0 0 auto;
}

.flexContainer__text {
    /* 伸びも縮みもする(1 1) ベース幅はなし(0) */
    flex: 1 1 0;
}
```
とスタイルを当てると、アイコン部分は固定幅に、テキスト部分は可変幅にすることができます。

アイコン部分は、代わりにロゴや写真などを置いてもいいですね。

テキスト部分は、ウィンドウ幅に応じて伸び縮みして、収まりきらなければ折り返し表示されます。

アイコンとテキストのマークアップ順序を変えれば、左右逆転させることができます。

## テキストを3点リーダー表示に変えてみる

```CSS:CSS
.textEllipsis {
    text-overflow: ellipsis;
    overflow: hidden;
    white-space: nowrap
}
```

3点リーダー用のスタイルを作って、

```HTML:HTML
    <!-- テキスト部分 -->
    <span class="flexContainer__text textEllipsis">ああああああああああああああああ</span>
```
テキスト部分に追加すれば、
先ほどと同様、テキスト部分はウィンドウ幅に応じて伸び縮みしますが、収まりきらない場合には3点リーダー表示されるようになります。


以上です。
RubyのLoggerを用いて、Progress barを表示する

RubyでProgress barの実装が少なかったので + loggerで表示できたら素敵かなと思い、書きました。

```ruby:Progress.rb
# log設定
logger = Logger.new(STDOUT)
logger.formatter = proc{|severity, datetime, progname, message|
   message.nil? ? "\n" : "\rPROGRESS [#{datetime}] -- : [#{"%-20s" % ('=' * (message.to_f/5))}]#{"%3.1f" % message}%"
}
# log実行
1000.times do |num|
    logger.info(100.0/num)
    sleep 0.5
end
logger.info() # 改行で後処理
```
jupyter や Spyder IDE などでPyQt 系をやっていると、kernel restarting が頻繁に起きる問題の解決法


PyQtやPyQtGraphなどでGUIのプログラムで試行錯誤をする際にも、
jupyterなどは便利でよく使っているのですが、
1つ最高に面倒な点があります。

PyQt系のGUIのプログラムを何度か動かしていると、

 **必ずkernel が死ぬのです。**

そのことでやっと対処法を見つけました。


# 終了時のsys.exit() の有無は関係なかった。

これ→ sys.exit(app.exec_())

sys.exitが変に終了してるのが原因かと思ってましたが、こいつは無実でした。
終了時のsys.exit() の有無は（少なくともjupyterでは）関係なかった。（Spyderは未確認）


# appを直前に別のもので上書きするだけ！（PyQt4のみ。PySideでは使えません）

app = 0 #この行を追加
app = QtGui.QApplication(sys.argv)


これだけで、何度も同じコードをjupyterで動かしても、
鬱陶しいkernel restart がなくなった！やったー！

参考
https://www.reddit.com/r/learnpython/comments/45h05k/solved_kernel_crashing_when_closing_gui_spyder/

* * *
2016/09/01追記

コメントのmojaieさんのやり方でもいけました。
どう考えてもこちらの方法のが真っ当ですね。

```python
app = QtGui.QApplication.instance()
if app is None:
    app = QtGui.QApplication(()) 
```

また、PyQt4は無言で実行してkernelが死ぬのに対し、
PySideだとQApplicationの多重のインスタンス作成を事前に阻止してランタイムエラーを返してくれることに衝撃を受けました。
PyQt4とPySideの育ちの違いですね。。。

また、PySideではランタイムエラーが起きるため、app=0は使えません。
app=0 は、PyQt4用のおまじないということで・・・