OmniAICreator/Qiita-1.07M huggingface dataset:
Effective moden c++ 4章 unique_ptrを必死に解説してみる


C++11とか14とか難しいですよね。。
Effective modern c++を読んで自分なりに理解したことをメモして変なプログラムで実装してみたいと思います。。
盛大なツッコミを期待しています。
c++11にはstd::unique_ptr, std::shared_ptr, std::weak_ptrとおまけでstd::auto_ptrがあります。
歴史的に見たらauto_ptrはたしか03くらいからありますが、多分もうほとんど使われません。
#Smartpointer
unique_ptrを所有できるのは宣言された本人のみでその参照がなくなると破壊されます。uniqueたんがmoveされると、所有権が移りもともとのsource pointerはnullに戻ります。uniqueにコピーは許されていません。なぜならコピーされるとsourceとそのうつしたあとのさきのpointerは同じものを参照していることになりuniqueのowenershipは一つという規約に反するからです。shared_ptrはsorce pointerを複数のownerがシェアできます。シェアエコノミーyeah!
よって、unique_ptrはmoveのみです！
#Factory function
ここでイーブイクラスをベースにchild classにシャワーズ(Vaporean)があるようなクラスを考えます。
なんか、unique_ptrの典型的な使用例はHierarchyなobjectを作る関数だからみたいです。この関数(meetEevee)はheapにobjectを作りpointerをかえします。条件分けをし、必要なtypeのobjectを返すような関数です。

defaultでは何もログを残さず消えていくuniqueをlambda expressionを用いてログを残して消えるようにしましょうc++14ではautoとtype宣言するだけでいいです。
Eeveeのクラスのdestructorはvirtual でなければなりません。custom deleterはtype Eevee*をとります。inheritedなVaporeonが破壊される時もベースとなるEeveeのdestructorを通じて破壊されるからです。


```cpp:customDeleter.cpp
#include <iostream>
#include <iomanip>
using namespace std;

class Eevee{
protected:
  int level;
  int attack;
  int defence;
  bool evol;
  std::shared_ptr<string> stoneType;
public:
  explicit Eevee() : level(25), attack(55), defence(50), evol(false){
    stoneType.reset(new string("none")); 
  };
  explicit Eevee(int l, int a, int d) : level(l), attack(a), defence(d), evol(false){
    stoneType.reset(new string("none")); 
  };
  virtual ~Eevee(){
    std::cout << "Your eevee died at level: " << level << std::endl;
  }
  virtual void setStone(string stone) {
    if(!evol) {
      stoneType.reset(new string(stone));
      bool evol = true;
    }
  }
  void showStatus() {
    std::cout << setw(3)<< level<< setw(3)<< attack << setw(3)<< defence << setw(3) << endl;
  }
};
class Vaporeon: public Eevee{
public:
  explicit Vaporeon() {
    std::cout << "constructor called" << std::endl;
    stoneType.reset(new string("water"));
    evol = true;
  };
  explicit Vaporeon(int l, int a, int d){
    level = l, attack = a, defence = d;
    std::cout << "arg constructor called" << std::endl;
    stoneType.reset(new string("water"));
    evol = true;
    std::cout << setw(3)<< level<< setw(3)<< attack << setw(3)<< defence << setw(3) << endl;
  };
  virtual ~Vaporeon() override {
    std::cout << "Your vaporeon died at level: " << level << std::endl;
  }

};
  
template<typename Ts>
auto meetEevee(Ts&& l, Ts&& a, Ts&& d, int type)
{
  auto delEevee = [](Eevee* pEevee)
    {
      std::cout << "delEevee called" << std::endl;
      pEevee->showStatus();
      delete pEevee;
    };
  std::unique_ptr<Eevee, decltype(delEevee)> pEevee(nullptr, delEevee);
  if(type == 1) {
    pEevee.reset(new Vaporeon(std::forward<Ts>(l), std::forward<Ts>(a), std::forward<Ts>(d)));
  }else {
    std::cerr << "unknown type" << std::endl;
  }
  return pEevee;
}

int main(void)
{
  //Vaporeon(31, 89, 29);
  meetEevee(55, 80, 49, 1);
  //meetEevee()
  return 0;
}
```
Google Container Engine で新しいノードにダウンタイムゼロで移行する

先日リリースしたアプリケーションが CPU 使ってなくてスカスカだったので、ノードのマシンタイプを n1-standard から f1-micro に変えました。今後もときどき行うことになりそうなので手順を残します。このアプリケーションはストレージを全く使っていないため、ストレージを利用している場合にはこの手順ではうまくいかないかもしれません。注意してください。

## マシンタイプの違うノードにダウンタイムゼロで移行する

```
$ gcloud container node-pools create f1-micro-pool --machine-type f1-micro --num-nodes=2 --zone=asia-east1-c
```

まず移行先のノードを作成するためにノードプールを作成します。ここでマシンタイプやゾーン、初期のノード数などを指定します。ディスクサイズもここで指定できます。
ノードプールの作成は、インスタンステンプレートの作成、インスタンスグループの作成、そしてインスタンスの作成が順番に行われるので少し時間がかかります。

```
$ kubectl get nodes -w
```

新しいノードプールのノードが作成されるのを待ちます。ノードが作成されたら Pod の移行を始めます。

```
$ kubectl cordon gke-cluster-1-default-pool-0218fc84-ae26
$ kubectl cordon gke-cluster-1-default-pool-0218fc84-l9ev
```

まず削除予定のノードで新しく Pod が作成されないように Unschedulable にします。それには、cordon サブコマンドを使います。cordon は、Kubernetes v1.2 で追加されました。

```
$ kubectl drain gke-cluster-1-default-pool-0218fc84-ae26
$ kubectl drain gke-cluster-1-default-pool-0218fc84-l9ev
```

ノードのステータスが、 `SchedulingDisabled` になったことを確認したら、今度はノードから Pod を削除して移行先のノードに移動させます。それには、drain サブコマンドを使います。drain は Kubernetes v1.2 で追加されました。

drain は、ノードを Unscheduable にしてからそのノード上の Pod を全て削除するサブコマンドです。今回事前に cordon を使いノードを Unschedulable にしているは、最初のノードに drain を実行した際にもう一つの削除予定のノードに Pod が作成されることがあるため、事前に削除予定のノード全てを Unschedulable にしました。

ここまでで、削除予定のノードは Unschedulable になり、そのノード上の全ての Pod は削除されています。今回この手順を実行したアプリケーションは、Ingress を使いサービスを公開していましたが、ダウンタイムは発生しませんでした。

```
$ gcloud container node-pools delete default-pool
```

最後に不要になったノードプールを削除します。ノードプールの削除は、作成と同様にインスタンステンプレートやインスタンスグループ、インスタンスの削除を伴うため少し時間がかかります。

## 感想

GKE のノードプールは非常によく出来ていると感じました。複数のノードプールを作成してタイプの違う Pod をそれぞれに割り当てることもできますし、動的にノードを作成、削除を行うこともできるようです。

また公式のブログエントリによると複数ゾーンにまたがるノードプールの作成もできるようなので簡単に BCP を達成することもできそうです。GKE スゴい。

- [Google Cloud Platform Japan 公式ブログ: Google Container Engine（GKE）に追加されたノード プールの使い方](http://googlecloudplatform-japan.blogspot.jp/2016/06/google-container-enginegke.html)
PythonでAppStore用のスクリーンショットを各画面向けに自動リサイズする


## 前提
 - pythonはVer.2.7.10を利用
 - 画像処理ライブラリのpillowを使う

## 使い方
 - iPhone6/6s(4.7)インチの画像を用意。
 - ファイル名は'01.png','02.png','03.png','04.png','05.png'とし、スクリプトと同じディレクトリにおく
 - 01~05.pngの画像が画面解像度ごとにリサイズされ、同じディレクトリに出力される

## pillowのインストール
```
sudo easy_install pillow
```

## Pythonスクリプト
```py:resize.py
#  -*- encoding: utf-8 -*-
from PIL import Image

# リサイズ前のファイル(4.7インチサイズの画像を想定)
fileNames = ['01.png','02.png','03.png','04.png','05.png']

# 各画面解像度の情報
resolutions = [[5.5,1242,2208], [4.7,750,1334], [4.0,640,1136], [3.5,640,960]]

for i in range(5):
    for j in range(4):
    	if j == 0:
            # 5.5インチ用はresizeを使って拡大する
			image = Image.open(fileNames[i], 'r')
			resize_image = image.resize((resolutions[j][1], resolutions[j][2]))
			resize_image.save('screenshot_' + str(resolutions[j][0]) + '_0' + str(i+1) +'.jpg', 'JPEG', quality=100, optimize=True)
    	else:
            # 4.7インチ以下はthumbnailを使うと劣化が少ない
			image = Image.open(fileNames[i], 'r')
			canvas = Image.new('RGB', (resolutions[j][1], resolutions[j][2]), (255, 255, 255))
			image.thumbnail((resolutions[j][1], resolutions[j][2]), Image.ANTIALIAS)
			x = (resolutions[j][1] - image.size[0])/2
			canvas.paste(image, ( x, 0))
			canvas.save('screenshot_' + str(resolutions[j][0]) + '_0' + str(i+1) +'.jpg', 'JPEG', quality=100, optimize=True)
```

## 実行
```
python resize.py
```
Neocomplete用のpython辞書ファイルを作ってみた

[Neocomplete.vim](https://github.com/Shougo/neocomplete.vim)でpythonコード作成時にもomni補完が適用させるようにしたいなあと。
手っ取り早い方法としては[jedi.vim](https://github.com/davidhalter/jedi-vim)を用いるという手があり普段は自分も愛用してますが、
諸事情により辞書ファイルを作成し、それを参照して補完させるようにしました。

#辞書作成方法
[docs.python.jp](http://docs.python.jp/)の索引ページをスクレイピングし、
掲載されている項目（関数、クラス、用語）を辞書ファイル項目としました。
言語はRuby、スクレイピングにはNokogiriを使用し、若干力技な部分も入ってます。
##辞書作成コード

```ruby:make_python_dicts.rb
require 'nokogiri'
require 'open-uri'
require 'net/http'

#　マルチバイト文字のチェックメソッド追加
class String
  def has_multibytes?
    self.bytes do |byte|
      return true if (byte & 0b10000000) != 0
    end
    false
  end
end

#　引数チェック（バージョンと出力ファイル名取得）
if ARGV.size == 1
  versions = "2.7"
  DICT_NAME = ARGV[0].to_s
elsif ARGV.size == 2
  DICT_NAME = ARGV[0].to_s
  versions = ARGV[1].to_s
else
  puts "Argument error"
  exit
end

#　索引ページのURL生成
BASE_URL = "http://docs.python.jp/" + versions + '/'.freeze
INDEX_URL = BASE_URL + 'genindex.html'.freeze

#　指定したバージョンの索引ページが存在するか確認
res = Net::HTTP.get_response(URI.parse(INDEX_URL))
if res.code != '200'
  puts "status error : " + res.code.to_s
  exit
end

#　索引ページのソース取得
index = Nokogiri::HTML(open(INDEX_URL))
link_tags = index.xpath('//div[@class="genindex-jumpbox"]')

#　A~Zまでの索引ページより索引項目抽出（日本語項目＆補助項目は除外）
items = []
link_tags.search('//p[position()=1]//a').each do |tag|
  urls = URI.escape(BASE_URL + tag[:href])
  doc = Nokogiri::HTML(open(urls))
  doc.search('.//table[@class="indextable"]//a[position()=1]').each do |item|
      item = item.text.split[0]
      unless item.match(/^[-.:(]|,$/) || item.has_multibytes?
        items << item
      end
  end
end

#　取得した全項目から重複分を省きソート後、辞書ファイルとして書き出し
File.open(DICT_NAME, 'w') do |f|
  items.uniq!.sort!
  items.each { |item| f.puts(item) }
end
```

##実行方法
第一引数で出力する辞書ファイル名、第二引数で作成したいpythonのversionを指定する。
なお第二引数は省略した場合はversion2.7の辞書ファイルが作成される。
（2016/6月現在は索引ページが存在する2.7と3.5のversionが指定できる）

```
# 出力ファイル名のみ指定
$ ruby make_python_dict.rb python.dict

# 出力ファイルとversion指定（ver 3.5）
$ ruby make_python_dict.rb python.dict　3.5
```

#上記辞書ファイルを用いたNeocomplete.vimによる補完設定例
.vimrcに以下のように設定し、作成した辞書ファイルを読み込んでやればOKです。

```
"補完候補表示パターン設定
let g:neocomplete#force_omni_input_patterns.python = '[^. \t]\.\w*'

" 辞書参照設定
let g:neocomplete#sources#dictionary#dictionaries = {
 \   'python': $HOME . '/dicts/python.dict',
 \ }
```

#補足＆参照サイト
力技＆おおまかにチェックしただけなので、辞書ファイルに不備等あるかもしれません。
また[ver2.7](https://github.com/ligerbolt/dicts/blob/master/python_ver2.7.dict)と[ver3.5](https://github.com/ligerbolt/dicts/blob/master/python_ver3.5.dict)の各辞書ファイルをgithubに置いておきます。もし使いたい場合にはどうぞ。

+ [neocomplete用にRubyの辞書を作った(るりま編)](http://pocke.hatenablog.com/entry/2014/08/10/104054)
+ [neocomplete.vimに移行したついでにruby.dictを作ってみた](http://henry.animeo.jp/blog/2013/08/24/ruby-dict/)
Xamarin.FormsでAndroidなどの物理Backキーを無効にする

ContentPageのコードビハインドでOnBackButtonPressedをオーバーライドしてtureを返すようにすると物理BACKキーを無効にできます。


```csharp
public partial class SamplePage : ContentPage
{
    public SamplePage() {
        InitializeComponent();
    }

    protected override bool OnBackButtonPressed() {
        return true;
    }
}
```

###### Navigationまわりを試行錯誤したときに気づいた方法なんですが、ぐぐると英語でたくさん出てきますね。まぁせっかくメモったのでひっそり公開しておきます。
Framer.jsでチャットバブルやinput要素に文字を入れたい時

例えば
チャットUIを作っていて、
textInputという入力カーソル用のレイヤーの中にinput要素を突っ込みたい時はこのように書きます


```
//input要素を作る（この時点ではまだレイヤーには反映されない。）
inputElement = document.createElement("input")

...

inputElement.placeholder = "Type a comment"
inputElement.value = ""
inputElement.focus()
inputElement.onkeyup = (e) ->
	# Draw the message
	if e.keyCode is 13
　　　　　　　　　　　　　　　　　　　　　　　　　　//この中にEnterキーを押した時の挙動を書く

...
//textInputLayerというレイヤーにinput要素を貼り付ける
textInputLayer._element.appendChild(inputElement)


```

今回モデルにしたプロジェクトはこちら（公式サイトのギャラリーページにあります）
![](http://framerjs.com/assets/static/images/gallery/chat-bubbles.png)
[chat bubbles](http://framerjs.com/gallery/preview/#chat-bubbles.framer)
Grasshopperで生物の形モデリング_入門とボロノイ柱

#Grasshopperとは

3DモデリングソフトRhinocerosのプラグイン。ビジュアルプログラミングライクにモデリングできる。PythonやC#でのスクリプト記述も可能。

例えばこんなものが作れる。

![](http://arch-and-design.weebly.com/uploads/2/2/8/7/22871778/328079_orig.jpg)

記述はこういうかんじ
![](http://arch-and-design.weebly.com/uploads/2/2/8/7/22871778/7036007_orig.png)

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

#環境をつくる

1.Rhonocerosを[DL](http://www.rhino3d.co.jp/support/download.html)
  
※MacでGrasshopperを使えるのはWIP版のみ（[ここ](https://fabble.cc/alizm/macxgrasshopperxxxx)を参照）

2.Grasshopperを[DL](http://www.grasshopper3d.com/page/download-1)&インストール

3.Rhonocerosを立ち上げて、コマンドで「Grasshopper」と入力するとウィンドウが立ち上がる

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

#タッチパッダーへ

キャンパスツールリングというのが通常マウスホイール長押しで表示される。タッチパッドで使っている人は、タッチパッドの設定でどこかに（3本指タップとか）、「中央」を割り当てておくと良い。

![スクリーンショット 2016-06-21 18.46.37.png](https://qiita-image-store.s3.amazonaws.com/0/39559/e11d99ba-da93-4fe2-c364-d78893142d6a.png)


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

#これだけは覚えておけ的操作

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

##パネルを置く

上のパネルが並んでるところから置きたいパネルをクリックし、下のウィンドウにクリック。パネルは今見えているの以外にもタブ切り替えや黒いところをクリックしてやるとたくさん出る。またはウィンドウでダブルクリックして、コマンド名を入力。
![スクリーンショット 2016-06-21 18.49.36.png](https://qiita-image-store.s3.amazonaws.com/0/39559/5891cd78-0159-909e-9719-d614e0277040.png)

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

##ジオメトリのセット

Rhonocerosのオブジェクト（点とか線とか球とか）と関連付けをしてやる。
右クリック>Set ◯◯ >Rhinoのウィンドウでセットするものを選択
![スクリーンショット 2016-06-21 18.55.55.png](https://qiita-image-store.s3.amazonaws.com/0/39559/5929b34a-638f-8f6f-d170-75d777c08cad.png)

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

##つなぐ
ぽちっとでたところからポチッと出たところにドラッグしてやる。矢印の向き（左から右）にデータが流れ処理されていく。
![スクリーンショット 2016-06-21 19.02.33.png](https://qiita-image-store.s3.amazonaws.com/0/39559/5bb5bf34-15bb-206d-51f4-19717b05bd32.png)

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

##数値のセット

1.integerやnumberなどの数値を入れるパネルを置く。右クリックして「Set Integer(number)」で数値入力

2.number sliderのパネルを置く。スライダーでちょうど良い数値にする。リアルタイムで可変出来て良い。

![スクリーンショット 2016-06-21 19.17.45.png](https://qiita-image-store.s3.amazonaws.com/0/39559/41a5e9c0-5a86-4227-4aa0-21d95f73b7c1.png)

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

##焼く
完成したらGrasshopperからRhinocerosに実体として移す。右クリック>Bake。

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

#みんな大好きボロノイ図とは

- ボロノイ図は、ある距離空間上の任意の位置に配置された複数個の点（母点）に対して、同一距離空間上の他の点がどの母点に近いかによって領域分けされた図のことである。(wikipediaより)。
- 地図上での最短施設の探索や最適配置などにも使われる。
- こういうの。見たことあると思う。

![](https://upload.wikimedia.org/wikipedia/commons/thumb/2/20/Coloured_Voronoi_2D.svg/240px-Coloured_Voronoi_2D.svg.png)

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

#ボロノイと生物

ボロノイ状の模様・構造は生物においてもよく見られる

- キリンとか
![](https://pixabay.com/static/uploads/photo/2014/05/02/11/23/giraffe-335922_960_720.jpg)

- トンボの羽とか
　![](http://art59.photozou.jp/pub/783/234783/photo/89818175_624.v1466145811.jpg)

- 亀の甲羅
　![](http://opencage.info/pics/files/800_7535.jpg)

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

#ボロノイ柱

ランダムに打った点を元にボロノイ図を描き、任意の点からの距離によって高さをつけたモデル

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/39559/fffc8f36-285f-b519-14e5-4a48c54ea4f6.png)

- 下側がメインで Point(複数の点)>Voronoi（ボロノイ生成）>Extrude（押し出し）>Cap（蓋・ソリッド化）
- 上側でAttractPointとの距離を計算、z方向（高さ）に変換して、押し出しに利用している

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

#参考

建築デザイン実践ハンドブック
Docker v1.12-rcでDRBDボリュームを試してみたよ(未完)

## この記事について

この記事はDockerのDRBDボリュームプラグインを試そうとして失敗した記録です。
途中でエラーになったため投げ出してます。

どなたかの役に立つかもしれませんので一応記事を残しておきます。

---

## きっかけ

DockerCon16にあわせ、Docker v1.12-rcの[ドキュメント](https://docs.docker.com)のデザインが一新されました。

  
そこでドキュメントを眺めていると、、、

---

![dock_drbd.png](https://qiita-image-store.s3.amazonaws.com/0/20668/66cb8683-f471-374e-1c03-39cce7f7d522.png)


---

## :interrobang:

---

## DRBD:interrobang:

---


![drbd_docker.png](https://qiita-image-store.s3.amazonaws.com/0/20668/6cc08151-a270-4611-8849-89251caff9e5.png)

引用:http://www.drbd.org/en/supported-projects/docker

---

![drbd_docker2.png](https://qiita-image-store.s3.amazonaws.com/0/20668/8fed53df-6be7-7408-46cd-8e7e5fb7049a.png)

---

## これは試さなきゃ:bangbang:

---

## ということで

Docker + DRBDプラグインを試します。

## 構成

  - Docker v1.12.0-rc2
  - DockerMachine さくらのクラウドドライバ
  - さくらのクラウド上にマシン2台作成
  - :sparkles::sparkles::sparkles::sparkles:DRBDプラグイン:sparkles::sparkles::sparkles:

---

# 準備

---

## 作業用マシンの準備

以下を準備していきます。

  - docker v1.12.0-rc2
  - docker-machine
  - docker-machine さくらのクラウドドライバ
  - さくらのクラウドAPIキー

---

## Docker for Mac/Windows

[こちら](https://docs.docker.com)からダウンロードし、インストールを行ってください。

docker(cli)、docker-machine、docker-composeなども同時にインストールされます。

---

## さくらのクラウド関連

- DockerMachine さくらのクラウド用ドライバ
- さくらのクラウド APIキー


[こちら](http://qiita.com/yamamoto-febc/items/4aff7472fc1ea025db0a)の記事を参考に準備してください。

---

# マシン作成

---

## docker-machineでマシン作成

`docker-machine`コマンドでさくらのクラウド上に2台マシンを作ります。

---

```bash:マシン2台作成
# 1台目
$ docker-machine create -d sakuracloud \
    --sakuracloud-access-token=[ACCESS TOKEN] \
    --sakuracloud-access-token-secret=[ACCESS TOKEN SECRET] \
    --engine-install-url="https://experimental.docker.com" \
    sakura01

# 2台目
$ docker-machine create -d sakuracloud \
    --sakuracloud-access-token=[ACCESS TOKEN] \
    --sakuracloud-access-token-secret=[ACCESS TOKEN SECRET] \
    --engine-install-url="https://experimental.docker.com" \
    sakura02
```

---

## DRBDプラグインのインストール

PPAとして提供されているとのことですので、
以下コマンドでインストールします。

```bash
# さくらのクラウド上のマシンへSSH接続
$ docker-machine ssh sakura01

# PPA追加
$ sudo apt-get install software-properties-common
$ sudo add-apt-repository ppa:linbit/linbit-drbd9-stack
$ sudo apt-get install drbdmanage-docker-volume
```

---

## ここで以下のエラー発生

![drbd_err.png](https://qiita-image-store.s3.amazonaws.com/0/20668/c9b5727e-f4b0-d196-30a8-3a44b577e69b.png)

docker.io(古いパッケージ)に依存している、、、

---

## 今回の結果

インストールを試みましたが、依存関係エラーとのこと。
(ソースからのビルドも試しましたが、、ダメでした)

今回は~~萎えた~~時間切れのためここまで。
また時間があれば再チャレンジします、、、

---

## 続く、、、かも
GoogleスプレッドシートからINSERT文を生成するGoogle Apps Script

GoogleスプレッドシートからINSERT文を生成するGoogle Apps Scriptのメモ。

以下のように表を選択した状態で

<img width="343" alt="スクリーンショット 2016-06-21 21.20.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/32602/2b39f4bb-cb8f-c6d4-df93-03a7118c605e.png">

実行すると、こんな感じにINSERT文を別シートに生成するGoogle Apps Scriptです。

<img width="501" alt="スクリーンショット 2016-06-21 21.21.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/32602/8da83b9f-7936-9d6c-c524-59ecdffa71a6.png">

コードは以下の通り。

```js
function create_insert() {
  var headerRowIndex = 1;
  var firstValuesRowIndex = headerRowIndex + 1;
  var range = SpreadsheetApp.getActiveRange();
  var cells = range.getValues();
  var numRows = range.getNumRows();
  var numColumns = range.getNumColumns();

  var tableName = cells[0][0];

  var columnNames = [];
  for (var i = 0; i < numColumns; i++) {
    columnNames.push(cells[headerRowIndex][i]);
  }
  var prefix = "INSERT INTO " + tableName + " (" + columnNames.join(",") + ") VALUES (";

  var newSheet = range.getSheet().getParent().insertSheet();
  var targetCell = newSheet.getActiveCell();
  for (var i = firstValuesRowIndex; i < numRows; i++) {
    var values = [];
    for (var j = 0; j < numColumns; j++) {
      values.push(cells[i][j]);
    }
    targetCell.setValue(prefix + values.join(",") + "); ");
    targetCell = targetCell.offset(1, 0);
  }
}
```
Rhino学習したチュートリアルまとめ

spaceキーでコマンド入力ショートカットが可能

morph Geometry (サーフェスに立体図形を貼り付ける。ブロックベース（？）)
https://www.youtube.com/watch?v=mUqiXaF9w3A

map to surface

曲面サーフェスを立体にextrudeする一つの方法
https://www.youtube.com/watch?v=fS0Rhysakb8

フィレットが上手くいかないときに参考になる。。。かも？
http://rhino.itami.com/?p=1226
TypeScrtiptでGraphQL書いてみない？


## 誰?

@Quramy  
<img src="https://avatars.githubusercontent.com/u/1262998?v=3" width="100" /> 

---

## 最近GraphQL触ってます

<img class="nav-logo" src="http://graphql.org/img/logo.svg" width="200" height="200">


---

## GraphQL is 何？

* Clientが欲しい値だけを問い合わせるための仕組み
* 階層的にデータを要求できる
* 厳密な型定義(schema)がある

https://www.graphqlhub.com/playground を触ると良いかも。

---

ReactよりAngularの方が~~得意なので~~慣れているので、無理やりAngular2 でRelay動かしたりする遊びが趣味です。

[https://quramy.github.io/angular2-graphql-note/](https://quramy.github.io/angular2-graphql-note/#/)

---

## GraphQLのServer側、実装したことありますか？

---

```js:こんな感じ.js
var schema = new graphql.GraphQLSchema({
  query: new graphql.GraphQLObjectType({
    name: 'Query',
    fields: {
      user: {
        type: userType,
        args: {
          id: { type: graphql.GraphQLString }
        },
        resolve: function (_, args) {
          return data[args.id];
        }
      }
    }
  })
});
```

---

## いちいちtypeとか出てくる

```js:typeとかめんどい.js
  id: { type: graphql.GraphQLString }, // ← これ
```

---

## めんどい

---

## 我々には型つき言語がある

flowもいいけどTypeScriptもね！

---

## ClassにDecorator振ってSchemaに出来ねぇかなぁ

---

```ts:こんな感じ.ts
import { Schema, Query, ObjectType, Field, schemaFactory } from "graphql-decorator";

@ObjectType() class QueryType {
    @Field() greeting(): string {
        return "Hello, world!";
    }
}
@Schema() class SchemaType {
    @Query() query: QueryType;
}

const schema = schemaFactory(SchemaType);
```

---

### How?

TypeScriptの場合、`emitDecoratorMetadata` で型情報をReflectに渡すことができる.

これを使って、classの型情報を元にGraphQLのObjectTypeへ変換するようにしている

---

<span class="fa fa-github" ></span> <a href="https://github.com/Quramy/graphql-decorator"> https://github.com/Quramy/graphql-decorator
</a>

---

## 所感

* 結局Decoratorだらけで楽なんだか大変なんだか分からん
* JAX-WSとかJAX-Bっぽい。
* 気が乗ればflow対応するかも。flow typeからmetadataにemitするいい感じのbabel-plugin募集中
PythonでMIDIを扱うパッケージ　midiとpretty_midi

#PythonでMIDIを扱う
音楽情報処理をするときにMIDIを扱うことがあります。

MIDIとはいわゆる楽譜の情報が載ったファイルです。つまり、どのタイミングでどの音をだすのか、というようなことが書かれています。

Pythonを使うにあたって、MIDIを処理するパッケージがあるので説明します。

midiとpretty_midiです

これらのパッケージはMagentaという人工知能で作曲を行ったりするプロジェクトでも使われています。

#インストール
ここではPython2を使います。

pipでインストールできるようです(2016/11/22訂正)

```
pip install python-midi
pip install pretty_midi
```

インポートができれば完了です。

```py
import midi
import pretty_midi
```

Python3では[github](https://github.com/craffel/pretty-midi)からcloneしてインストールすれば、pretty_midiを使えます。(pipでやるとimport時にエラーが出ます)

```
git clone https://github.com/craffel/pretty-midi
cd pretty-midi
python setup.py install
```

midiのほうは[ここ](https://github.com/vishnubob/python-midi/tree/feature/python3)にPython3バージョンがあります。

#midi
MIDIファイルは基本的にトラックとイベントというものなどから構成されます。

トラックは楽器ごとの演奏データが入っています。

そして演奏データはイベントから構成されます。イベントとはどのタイミングでテンポを変更するかや、どのタイミングで音を鳴らし始める（終える）かといった情報のことです。

それらを直接記述するのがmidiです。

それでは、ソの四分音符の演奏情報が入ったmidiファイルを作ります。

```py
import midi

file = "test.mid"

pattern = midi.Pattern(resolution=960) #このパターンがmidiファイルに対応しています。

track = midi.Track() #トラックを作ります
pattern.append(track) #パターンに作ったトラックを追加します。

ev = midi.SetTempoEvent(tick=0, bpm=120) #テンポを設定するイベントを作ります
track.append(ev) #イベントをトラックに追加します。

e = midi.NoteOnEvent(tick=0, velocity=100, pitch=midi.G_4) #ソの音を鳴らし始めるイベントを作ります。
track.append(e)

e = midi.NoteOffEvent(tick=960, velocity=100, pitch=midi.G_4) #ソの音を鳴らし終えるイベントを作ります。
track.append(e)

eot = midi.EndOfTrackEvent(tick=1) #トラックを終えるイベントを作ります
track.append(eot)
            
midi.write_midifile(file, pattern) #パターンをファイルに書き込みます。
```

今度はmidiファイルを読み込みます

```py
pattern = midi.read_midifile("test.mid")
print(pattern)
```
以下の情報が表示されます。これらは先ほど書いた情報と同じものです。

```
midi.Pattern(format=1, resolution=960, tracks=\
[midi.Track(\
  [midi.SetTempoEvent(tick=0, data=[7, 161, 32]),
   midi.NoteOnEvent(tick=0, channel=0, data=[55, 100]),
   midi.NoteOffEvent(tick=960, channel=0, data=[55, 100]),
   midi.EndOfTrackEvent(tick=1, data=[])])])
```

#pretty_midi
pretty_midiはさらにわかりやすくなっています。

pretty_midiでも同じことができてこちらの方が短いコードでできます。

同じようにmidiファイルを作ります。

```py
import pretty_midi

pm = pretty_midi.PrettyMIDI(resolution=960, initial_tempo=120) #pretty_midiオブジェクトを作ります
instrument = pretty_midi.Instrument(0) #instrumentはトラックみたいなものです。

note_number = pretty_midi.note_name_to_number('G4')
note = pretty_midi.Note(velocity=100, pitch=note_number, start=0, end=1) #noteはNoteOnEventとNoteOffEventに相当します。

instrument.notes.append(note)
pm.instruments.append(instrument)
pm.write('test.mid') #midiファイルを書き込みます。
```

>(注)エラーが起こった時は
>
>```py
>note = pretty_midi.Note(velocity=100, pitch=note_number, >start=1e-20, end=1) #noteはNoteOnEventとNoteOffEventに相当します。
>```
>と書き換えてください。これはPrettyMIDIのメソッドtime_to_tickが入力0の時のみになぜか、numpy.int64型で返してしまうことに起因します。（他の場合はint型で返します）

midiファイルを読み込みます

```py
import pretty_midi

midi_data = pretty_midi.PrettyMIDI('test.mid') #midiファイルを読み込みます
print(midi_data.get_piano_roll()) #ピアノロールを出力します
print(midi_data.synthesize()) #サイン波を使って、波形を出力します。
```

このほかにも便利な関数があるみたいです。

#まとめ
基本的にPythonでmidiファイルを扱うときはpretty_midiを使った方が良さそうです。
【WordPress】管理画面のラベルを変更

#【WordPress】管理画面のラベルを変更

***投稿メニューの新規追加画面のタイトルのラベル（デフォルトは新規投稿を追加）を変更してみる。***

・initのフックに引っ掛けて、ラベル変更のロジックを入れる。
ラベルのオブジェクトを取得して、変更したい文字列を代入します。
[管理画面のラベルに関してはこちら](http://wpdocs.m.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/register_post_type#.E3.83.91.E3.83.A9.E3.83.A1.E3.83.BC.E3.82.BF)

```lang:function.php
<?php

〜〜省略〜〜

//======================================================================
// 管理メニューのラベルを変更
//======================================================================
function change_post_title_label() {
	global $wp_post_types;
	$labels = &$wp_post_types['post']->labels;
	$labels->add_new_item = 'new post!';
}
add_action( 'init', 'change_post_title_label' );
```

・変更前
![before0621.png](https://qiita-image-store.s3.amazonaws.com/0/97158/a5219f80-77aa-eb27-db5a-a63caaad92a2.png)

・変更後
![after0621.png](https://qiita-image-store.s3.amazonaws.com/0/97158/08b256c6-c1a9-03cc-39d1-b5c55a084363.png)
新規投稿を追加 → new post!に変わりました。
javascript format date

```js
new Date().getFullYear() + '-' + (new Date().getMonth() + 1) + '-' + new Date().getDate()
"2016-6-21"
```

```js
new Date().toTimeString().split(" ")[0]
"19:56:30"
```

https://github.com/phstc/jquery-dateFormat/blob/6ea91292e091329737c4c1d3792f36f202e8cc56/dist/jquery-dateFormat.js#L122-L127
hystでコマンドラインでヒストグラムを書く

一年で300回ぐらいコマンドラインでヒストグラムを書きたくなるので[hyst](https://github.com/winebarrel/hyst)というコマンドをGoで書きました。

処理内容は以下の記事を参考にしています。

* [コマンドライン上でヒストグラム値（頻度数）を求める - Qiita](http://qiita.com/kkdd/items/88581a2d04843c3c7ce7)

# Installation

OSXの場合はHomebrewでインストールできます。

```bash
brew install https://raw.githubusercontent.com/winebarrel/hyst/master/homebrew/hyst.rb
```

その他のOSはアーカイブを展開すれば実行できます。

* https://github.com/winebarrel/hyst/releases

# 使い方

## 数値以外

数値以外の場合は、それぞれの値をカウントして多い順に並べます。

```
$ ruby -e 'puts 1000.times.map { %w(foo bar zoo)[rand(3)] }' > rand.txt

$ head rand.txt
zoo
zoo
bar
foo
zoo
bar
zoo
zoo
bar
zoo

$ cat rand.txt | hyst
zoo  351  ##################################################
foo  341  ################################################
bar  308  ###########################################
```

## 数値

`-w`オプションで階級の幅を指定すると、各値を数値として処理します。
以下は階級の幅を50として正規分布のヒストグラムを描画した例です。

```
$ gem install distribution

$ ruby -rdistribution -e 'normal = Distribution::Normal.rng(1); puts 1_000.times.map {normal.call * 100}' > gauss.txt

$ head gauss.txt
213.57863028255827
-103.40921634097238
-11.296606231306994
162.5407288364103
110.5574029438751
24.64428067386242
30.02832601441755
100.63481149177946
-23.661175314447913
185.2196657484519

$ cat gauss.txt | hyst -w 50
-250    1
-200    2
-150    4
-100   12  ##
 -50   51  ##########
   0  247  ##################################################
  50  198  ########################################
 100  198  ########################################
 150  137  ###########################
 200   96  ###################
 250   36  #######
 300   15  ###
 350    2
 400    1
```

## 似たようなツール

[aggでアクセスログを単位時間ごとに集計する - Qiita](http://qiita.com/winebarrel/items/ef9ccf0fa57d117908cd)
ディープラーニングでFXシステムトレード

FXシストレプログラムのディープラーニング版を作ろうとして、
　
[偶然で最強のアルゴが誕生した（機械学習でFXシステムトレード） - Ryoの開発日記](http://d.hatena.ne.jp/kanbayashi/20160305/p1)

に、

[[TensorFlowで株価予想] 0 - Google のサンプルコードを動かしてみる - Qiita](http://qiita.com/akiraak/items/b27a5616a94cd64a8653)

のTensorFlowコードを移植しようとしたけど、結構面倒で挫折したので、前に書いた
　
[簡単なディープラーニングのサンプルコード (2入力1出力/2クラス分類) with Keras (Chainerは挫折) - Ryoの開発日記](http://d.hatena.ne.jp/kanbayashi/20150629/p1)
　
のKerasによるDNNのコードをGoogleのやつに合わせて移植してみた。
　
3000 epoch回した感じだと、最終的に近い収益が得られたが、安定して上がっている感じにはならなかった（＝頑強性が低い。最後の数か月でどかっと上がっている）。
　
ので、30000 epoch回した結果を見てみる。
学習時間は10時間程度かかる見込み.... (Macbook Air 2011 mid)
　
コードはこちら↓
https://github.com/ryogrid/fx_systrade/blob/e93103c804e992bc21b7afc8a0f707ec4ce37029/keras_trade.py
デモ口座やリアル口座でトレードする場合は以下のコードを参考にすればOK↓
https://github.com/ryogrid/fx_systrade/blob/master/xgboost_trade_oanda.py

[続き]
ディープラーニングでFXのシステムトレーディングをするコードを書いた (2) -RNN/LSTM編-
http://qiita.com/ryo_grid/items/a3163ac50806f8494a53
グリッドトレード戦略でFXシステムトレード
http://qiita.com/ryo_grid/items/c8d2d268e3f0d64af1e6
機械学習を用いたオレオレFXシステムトレーディングプログラムのロジック解説
http://qiita.com/ryo_grid/items/56a086fee1b780157df7
FXシステムトレードのプログラムをいくつか作ってみて分かった課題とその解決法について
http://qiita.com/ryo_grid/items/f13ab8a2bb708713396b

[前にやったやつ]
xgboostによる決定木アンサンブル学習でシステムトレードするコードを書いた
http://qiita.com/ryo_grid/private/757fa93fc479439b2676

[似たようなことしてる投稿]
http://qiita.com/jiji_platform/items/268377c542706e6f44b1
http://qiita.com/KUKDfhia/items/531131a61ee83db6ae69
http://qiita.com/akiraak/items/b27a5616a94cd64a8653
http://qiita.com/haminiku/items/a032d94e4f0d862df2b2
http://qiita.com/ognek/items/1b776d504d20bd6f6d7d
java.util.logging の使い方

# はじめに

Stack Overflow の [Good examples using java.util.logging](http://stackoverflow.com/questions/5950557/good-examples-using-java-util-logging) の和訳です．

# Logging の使い方

クラス毎に `Logger` を定義するとよい．

```java
class MyClass {
    private static final Logger logger = Logger.getLogger(MyClass.class.getName());
    ...
```


## デバッグ
デバッグに関するログはレベルを `Level.FINE` にすべきである．

```java
logger.log(Level.FINE, "processing {0} entries in loop", list.size());
```

ループ内での値の確認等，必要性の小さいログは `Level.FINER` / `Level.FINEST` にすべきである．

```java
for (int i = 0; i < list.size(); ++i) {
    logger.log(Level.FINER, "list[{0}]: {1}", new Object[]{i, list.get(i)});
}
```

## 例外

例外発生時にスタックトレースをログに表示するようにしましょう．
深刻な例外に関しては `Level.SEVERE` に設定．

```java
try {
    ...
} catch (Exception e) {
    logger.log(Level.SEVERE, e.toString(), e);
}
```

## ログを介した情報提供

ログを介してユーザに情報を与えたいときは `Level.INFO` で

```java
logger.log(Level.INFO, "hoge");
```

みたいにする．

# ひとこと

なんでログが 2 行なんだよ Java ・・・．
reduxを郵便屋さんに例えてみた

reduxにはそれなりの学習コストを支払うわけだが、自分の頭の中の整理をするときに、郵便屋さんに例えると理解が進んだのでまとめておく。
例えとして微妙な部分がある気がするので、redux理解のためのちょっとしたヒントくらいに思ってください。

# これまでのjQueryを使ったDOM操作

jQueryをベースとしたDOM操作での開発は、簡単に実装できるが故に秩序を保つのが大変だった。
例えるならばバーゲンセールのようなもので、乱雑にワゴンに置かれたものを各々が自由に情報を取得して、自分でその状態を持っていた。（`addClass()`にはお世話になったなぁ。）

# reduxで秩序を

reduxには登場人物がいる

* Action
    * 届けたいものリスト

* ActionCreator
    * 届けるもの置き場

* Dispatch
    * 封筒とかダンボール

* Reducer
    * 仕分けして発送する人

* Middleware
    * 何でも屋さん

* Store
    * 中央お荷物受取所

* Component
    * 人

１個１個説明していく。

## Action（届けたいものリスト）

まずワゴンに乱雑に置かれたものを、綺麗に分けよう。
郵便屋さんにお願いするにも、何を送ればいいのかを明確にする必要がある。
その意思を宣言するためにも、届けたいものリストをつくる。
ここで決めたものには、それぞれに名前をつけておくこと。

## ActionCreator（届けるもの置き場）

届けたいものをひとまとめにしておこう。
送るものは１つかもしれないし、２つかもしれない。
どのActionを使うかが決まってからでないと、何を送るかわからない場合もある。
こいつには忘れずに、Actionでつけておいた名前を付箋で貼っておこう。

## Dispatch（封筒とかダンボール）

郵便屋さんに頼むときには、ActionCreatorでまとめたものを、封筒やダンボールに入れる必要がある。
ちゃんと入れておかないと郵便屋さんは働いてくれない。

## Reducer（仕分けして発送する人）

受け取ったものを頼りに、発送してくれるのがこいつ。
こいつは完全に流れ作業しかしないロボットみたいなやつだ。

ただちょっと変わり者で、受け取ったものをそのまま配送はしない。
必ず錬金術をつかって、新しいものを作り出してそれを送ってくれる。
「こいつを赤くしてくれ」というメモと、ボールが送られてきたら
新しく赤いボールを生み出してそれを送る。そういう奴だ。

## Middleware（何でも屋さん）

突如現れたイレギュラーのように見えるが、郵便を頼むときって結構細かい注文をすることがある。
日時指定したかったり、再配達時にどーのこーのとか。
そういう色んなことを請け負ってくれるのがこの人である。

## Store（中央お荷物受取所）

Reducerから送られてきたものは、必ずここに全て集められる。
この施設にあるものは誰でも自由に見に来ていい。
そう、見に来るのは自由。

## Component（人）

これは、今までバーゲンセールに参加してた僕らだ。
だけどこれからはワゴンじゃなくて、Storeに綺麗に置かれたものを使える。
なにがどういう状態かってのは、Storeを見ればいつでもわかるんだ。あぁなんて便利なんだ。

# redux三原則はつまりこういうこと

## Single source of truth

Storeは世界に１箇所しかない。
何か情報が欲しかったら、ここへ問い合わせること。
なぜならこの施設が絶対的正義だから。こいつがカラスは白だといったら白なのだ。

## State is read-only

Storeに荷物を入れられるのは郵便屋さんだけ。
入れたかったらまた同じ手順を踏んでくれ。

## Mutations are written as pure functions

Reducerは変なことはしない。
受け取った情報をもとに、新しい何かを生成して発送する。ただそれだけ。
それ以上でも以下でもない。

# reduxにしておくと何が良いのか

## 拡張性

何か増やしたい場合、やることは毎回決まっている。

1. 届けるものを決める（Action/ActionCreator）
2. 仕分け発送ロボットに命令を追加する（Reducer）
3. そうするといつもと同じところで情報が参照できる。（Store）
4. あとはどう表示するかを考えるだけだ（Component）

## バグフィックス/テスト

ちゃんと中央お荷物受取所に目的のものは届いているか？
届いてない→　郵便屋さんが悪い（Action〜Reducer）
届いてた→　使う側が悪い（Component）

なるほど。

ユニットテストは？
→郵便屋さんが意図通りの入出力をするか（Action〜Reducer）
→中央お荷物受取所の状態のとおりに表示がされているか（Component）

なるほど。

# reduxは必要なのか？

なんか書き起こしたら余計わけがわからくなった気がしなくもないが、要するに役割分担しようってことだ。

何がどこで行われているかは明確になるけれど、
郵便屋さんシステムを理解する必要があるし、郵便屋さんシステムを毎回使うのが面倒臭い。

届けたいものが少ないなら（つまり複雑じゃないもの）、バーゲンセール状態の方がすぐに作れて楽チンなのは間違いない。

まぁ大体複雑になっていくんだけども。
既存リポジトリをGitHubに登録する

# 概要
極めて簡単なことだが、HerokuのToolbeltで登録したアプリをGitHubに追加しようとしたところ、若干はまったのでメモ程度に投稿。

# 1.GitHubに空のリポジトリを作成
通常通り、GitHubのNew Repositoryから作成するが、その際、READMEやライセンスなどを設定してファイルが作成されないようにする。
すると、<>codeの画面が以下のようになるので、後はこれの通りやればいい。
![image](https://qiita-image-store.s3.amazonaws.com/0/129986/0fa0d3b6-b427-466c-598e-354349763ad8.png)

# 2.コマンドラインからPushして完了
git remote add origin git@github.com:USER_NAME/REPOSITORY_NAME.git
git push -u origin master
composer の設定で始めにやること


composer のインストール

1. [Composer Download](https://getcomposer.org/download/) からダウンロードインストール


# 日本のサーバなら packagist.jp

1. composer config -g repositories.packagist composer https://packagist.jp

# いろんなパッケージがあるならキャッシュを使うように。

1. composer global require hirak/prestissimo


# 参考

1. [getComposer](https://getcomposer.org/download/)
1. [Packagist.jp](https://packagist.jp)
2. [composerを速くするプラグイン・prestissimoを作った](http://blog.tojiru.net/article/432944706.html)
yii2 tutorials

# Installation|インストール
yii2 has two app templates, Basic and Advanced, the differences is as shown below，
yiiは二つのテンプレートがあります。basicとAdvanced、
![image](https://qiita-image-store.s3.amazonaws.com/0/119653/db6f34df-9b06-003f-9027-e809dd65296b.png)
I want a back-end so I chose Advacned.
バクエンドがほしいですからAdvacnedを選んだ。
To install Yii via composer（Archive file download [[Advanced]]
(https://github.com/yiisoft/yii2/releases/download/2.0.8/yii-advanced-app-2.0.8.tgz)）
Yiiをインストールために、次のコマンドを実行します。

```
php composer.phar global require "fxp/composer-asset-plugin:~1.1.1"
php composer.phar create-project yiisoft/yii2-app-advanced advanced 2.0.8
cd advanced
php init
```
Finally configure the local enviroment, set host.com to front-end/web.
最後はローカル環境を設定し、ホスト名のパスを front-end/webにセットします。
【XCUITest】スクリーンショットの保存場所

####スクリーンショットの保存場所
Xcode7から導入されたXCUITestを実行すると、常時スクリーンショットが以下のディレクトリに保存されます。

```
/Users/(ユーザー名)/Library/Developer/Xcode/DerivedData/(プロジェクト名)-英数字の羅列/Logs/Test/Attachments
```

* 上記ディレクトリ内の"Screenshot_"で始まるPNGファイルを参照
 * 例：Screenshot_4632F672-B6A2-46FB-BE0B-31260C5D82FD.png

####私見
* UIテストのボリュームが多くなればなるほどファイル名からの判別が難しくなるので、XcodeのReport Navigatorから参照した方が賢明だと思います。
* また、任意のタイミングでスクリーンショットを撮りたければ、fastlaneを導入した方がよさそうです。
普通の子?をエンジニアの手前まで育てる学習サイクル

# 自己紹介

與那城雄(よなしろゆう) a.k.a. @cloneko

今月いっぱいまで専門学校でLinuxとかネットワークとかクラウド(AWS/Kintone/などなど)について教えてます。

Github/Twitter/Qiitaすべて **cloneko** です。

---

# 今日のお話

1. 「技術」を身に付ける学習サイクル
2. 資格試験の合格率を異様に上げる×××

---

## ここでいう「普通の子」について

普通高校を卒業してそのまま専門学校に入っているような子を表わしてます。
いままで学校教育において「専門技術の取得」ということに触れてきていないような子のことを指してます。

---

## 「技術」を身に付ける学習サイクル

---
![サイクル](https://qiita-image-store.s3.amazonaws.com/0/102658/7d489adb-7936-26aa-6232-28a5cdc2f313.png)


---

### サーバー構築の講義にあてはめてみる

|段階| 体験 | 感じる | 考える | 成長する |
|:----:|---|---|---|---|
|1|yumでインストール|簡単じゃね?|コマンドちょいちょい叩けばサーバ立てるの思ったより簡単だね|サーバー立てれた!|
|2|./configure && make && make install|めんどくさい!/パッケージ提供されてない場合それしかないか…|昔はこんな方法でインストールしてたんだ…/ソースコードが手に入ればこの方法使えるんだね!|yum/aptって便利&パッケージなくてもセットアップできる!|
|3|Ansibleで自動化してみよう|毎回yum/aptを大量にやらなくていいんだ!|まとめてサーバー構築する時とかに便利じゃね?|Ansibleを使って自動で構成組めるようになった!|
|4|Ansibleを別の環境(AWS)に持っていこう|(ほぼ)そのままできるじゃん!|Ansibleの汎用性ぱねぇ|自動化/冪等性ってすばらしい!(洗脳)|

※ 実際のカリキュラムは下記URLからどうぞ
https://github.com/cloneko/serverbuilding

---

### どんな技術を身に付ける時でもだいたい同じ

プログラムを覚えるときとかもだいたい

1. 写経(体験)
2. 動かしてみて何か感じる
3. 次どうしたらいいか考えて応用する
4. そのセクションを部分を覚える!
5. 次の機能を覚えるための写経(1に戻る)

みたいな流れな感じ

---

### 汎用性の高い考え方

技術を覚える時の汎用的な流れなのでだいたいどんな技術に対しても使える

* ハンズオンとか設計する時にも使えるよ!

---

### 講師の立場として

* うまくサイクルを回せるカリキュラムが作れていると学生が勝手に成長してくれる
* 当然ですがフォロー/サポートは必要
    * よくガードレール役になる。って表現してます
* だけれども「過剰なフォロー/サポート」はしない。
    * 講師の意図している以上には成長しなくなる
    * 講師のコントロールから**手放す**ことで起きる成長も大切 

---

### 「技術」を身に付ける学習サイクルまとめ

|段階| 体験 | 感じる | 考える | 成長する |
|:----:|---|---|---|---|
|1|||||
|2|||||
|3|||||

何かスキルを身に付けたい時・身に付けさせたい時、こんな感じで考えてみるとわかりやすいですよ!

---

## 資格試験の合格率を異様に上げる×××

---

### 急に始まる自慢

僕が担当した講義の、「ある条件を満たした」学生の資格試験の(最終的な)合格率が100%!という状況があります。

ふと気付いた時にこれは資格試験の合格率を上げるのに貢献しているんじゃないか!!!っていう「ある条件」。

それは…

---

### なんと!!!

**ハッカーズチャンプルー2015のカンファレンスに参加した学生** の僕の講義における資格試験の合格率が100%!!!!!!


----


#### っていうことは…

今年のカンファレンスに参加した学生は、僕の担当科目の資格試験に関して**(最終的には)合格間違いなし!!!おめでとう!!!**

(今日のカンファレンスに参加した学生は資格試験落ちたら覚えとけよ!)

---

## まとめ

### 「技術」を身に付ける学習サイクル

体験 → 感じる → 考える → 成長する → 体験 このループを意識することで技術を身に付けやすくなる

### ハッカーズチャンプルーへの参加で

技術的モチベーションUP&Cloneko先生の圧力で合格間違いなし! **ね!**

---

## ここまで行けばもうエンジニアの手前まで行ったと言ってもいいんじゃない?

っていうけど、結局この先に「良いエンジニアになれるか」どうかは自分の努力次第です!
そこまで準備はしたのであとはすばらしいエンジニアになって行ってください!

(そして僕の仕事ください)

---

# Special Thanks

* 日本ファシリテーション協会 沖縄サロン 第82回例会「～体験学習のサイクルと目的・目標：入門編～」より、学習サイクルの部分を借りてきました
* 専門学校ITカレッジ沖縄 にてさまざまな経験をさせていただきました
* ハッカーズチャンプルー実行委員会のみなさま、発表の機会をいただきましてありがとうございました。
* 僕の礎になった教え子のみんなありがとう!

---
![サイクル](https://qiita-image-store.s3.amazonaws.com/0/102658/7d489adb-7936-26aa-6232-28a5cdc2f313.png)
めざせpythonライブラリマスター （64）pretty_cron

#【ライブラリ説明】
　crontabを読みやすい形式に変換する

#【プログラム】
```py
# -*- coding: utf-8 -*-

import pretty_cron

print pretty_cron.prettify_cron("0 * * * *")
# At 0 minutes past every hour of every day
print pretty_cron.prettify_cron("0 0 1 1 *")
# At 00:00 on the 1st of January
print pretty_cron.prettify_cron("12 15 * 1 *")
# At 15:12 every day in January
print pretty_cron.prettify_cron("lalala")
# lalala
```

#【参考サイト】
　[pypi](https://pypi.python.org/pypi/pretty-cron/1.0.2)
　[github](https://github.com/adamchainz/pretty-cron)
pacファイルからUser-Agentを参照することが出来なかったメモ

IEとそれ以外のクライアントアプリで異なるProxyを使用するような設定をやりたくて，pacファイルでUser-Agentを判別することで可能かを調べたときのメモ。
結論としては，pacファイルで，User-Agentを参照する事は出来なかった。

試しに作成したpacファイル。このpacファイルでnavigator.userAgentが参照できるか確認した。

```prooxy.pac
function FindProxyForURL(url, host) {
    alert("AAAA");
    alert(typeof navigator);
    alert(typeof navigator.userAgent);
    alert(navigator.userAgent);
    return "DIRECT";
}
```

上記でUser-Agentの文字列が取れたら，その文字列を元に返却するProxyを変更する予定だった。
IEの自動構成スクリプトに上記ファイルを設定して，IEを再起動してみたところ，

1. "AAAA"のalertのボックス表示
1. "undefined"のalertのボックス表示

までで終わった。User-Agent文字列は取得出来なかった。

google先生に聞いてみたところ
http://findproxyforurl.com/pac-functions/
に以下の記載があるのを見つけた。

>Each browser implements PAC in a sandbox, allowing access to only those JavaScript
> functions required to operate and nothing more. As an example, 
> <B>it isn’t possible to access the browser user agent string in a PAC file</b>, a string available to a normal web page.

という事で，pacファイルからUser-Agentを参照する事は出来なかった。
各種ツールによる情報共有のためのブックマークレット

各種ツールへリンク投稿する際のブックマークレットをまとめてみた。

## コード例

基本的には以下のようなコードをブックマークレット化した。

```javascript:Markdownの場合
javascript:
  var url   = location.href;
  var title = document.title;
  var link  = '[' + title.replace(/\[/g,'&#91;').replace(/\]/g, '&#93;') + '](' + url + ')';
  var x     = prompt('', link);
```

区切り文字等がタイトルに入ってるとうまくリンク化されないので、それらについては文字実体参照に変換してるのがちょっとしたオリジナリティといったところ。

## ブックマークレット実例

### Markdown

ここ(Qiita)や、GitHub、その他諸々。

`javascript:var%20url=location.href;var%20title=document.title;var%20link='['+title.replace(/\[/g,'&#91;').replace(/\]/g,'&#93;')+']('+url+')';var%20x=prompt('',link);`

### WikiCreole

Tracなど。

`javascript:var%20url=location.href;var%20title=document.title;var%20link='[['+url+'|"'+title.replace(/\"/g,'&#34;')+'"]]';var%20x=prompt('',link);`

### Textile

Redmineなど。

`javascript:var%20url=location.href;var%20title=document.title;var%20link='"'+title.replace(/\"/g,'&#34;')+'":'+url;var%20x=prompt('',link);`

### PukiWiki

`javascript:var%20url=location.href;var%20title=document.title;var%20link='[['+title.replace(/\[/g,'&#91;').replace(/\]/g,'&#93;')+':'+url+']]';var%20x=prompt('',link);`

### はてな記法

`javascript:var%20url=location.href;var%20title=document.title;var%20link='['+url+':title='+title.replace(/\[/g,'&#91;').replace(/\]/g,'&#93;')+']';var%20x=prompt('',link);`


## おまけ（Googleリダイレクタ付き）

イントラ内のツールや、アクセス制限のある場所にあって、Refererを漏らしたくない場合などに、手っ取り早くGoogleのリダイレクタ付きでリンクしておけばラクだよね、と。

### Markdown

`javascript:var%20url=location.href;var%20title=document.title;var%20link='['+title.replace(/\[/g,'&#91;').replace(/\]/g,'&#93;')+'](https://google.com/url?q='+url+')';var%20x=prompt('',link);`

### WikiCreole

`javascript:var%20url=location.href;var%20title=document.title;var%20link='[[https://google.com/url?q='+url+'|"'+title.replace(/\"/g,'&#34;')+'"]]';var%20x=prompt('',link);`

### Textile

`javascript:var%20url=location.href;var%20title=document.title;var%20link='"'+title.replace(/\"/g,'&#34;')+'":https://google.com/url?q='+url;var%20x=prompt('',link);`

### PukiWiki

`javascript:var%20url=location.href;var%20title=document.title;var%20link='[['+title.replace(/\[/g,'&#91;').replace(/\]/g,'&#93;')+':https://google.com/url?q='+url+']]';var%20x=prompt('',link);`

### はてな記法

`javascript:var%20url=location.href;var%20title=document.title;var%20link='[https://google.com/url?q='+url+':title='+title.replace(/\[/g,'&#91;').replace(/\]/g,'&#93;')+']';var%20x=prompt('',link);`
文字コードについて【メモ】

文字コードについてメモ。

# ASCIIコード
英数字と記号を0-255の範囲で表す。1バイトで表現される。

# 日本語の文字コード
## JISコード
日本規格協会(JIS)が定めたコード。

## シフトJISコード
JISコードを計算し、ASCIIコードで未使用になっている番号に割り当てられるようにに変換したもの。
MicroSoft社が考案し、Windows、Macで使われている。

## EUC-JP
シフトJIS同様だが、ASCIIコードで未使用になっている番号に押割り当てられるようにに変換したもの。(シフトJISとは違う計算方法)
LinuxなどのOSで使われている。

# UTF-8
最近は**UTF-8**が使われるようになった。
UTF-8は世界共通の文字コードである**Unicode**をプログラムで扱いやすいように変換したもの。
Unicodeは2バイト固定だが、UTF-8は英数字はASCIIコード同様1バイト、それ以外の文字は2-4バイトの範囲で可変に表現。

文字の形と文字コードの統一がされているので、多言語に対応可能。
多言語の混在もできるし、世界共通なので欧米圏のソフトをそのまま使用できる。
AWS DeviceFarmでUIAutomatorテストする際にハマったこと

### はじめに
AWS DeviceFarm上でAndroidアプリのUIAutomatorによるUIテストを実施した際に、いくつかハマった事があったので残しておきます。 DeviceFarmやUIAutomatorの使い方についてはここでは触れません。

#### 1. UIAutomator2.0からInstrumentationテスト扱いになっている
DeviceFarmのコンソール画面から`Create New Run`ボタンを押下すると、テストの設定画面に移ります。Step1ではプロジェクトのapkファイルをアップロードします。Step2ではテストのタイプをラジオボタンから選択するのですが、ここが１つ目のハマりポイントです。
選択項目の一番下に`uiautomator`という項目があるので普通に考えるとこれを選択してしまうのですが、どうやら**UIAutomator2.0からInstrumentationテスト扱い**になっているようです。
UIAutomator2.0以上を利用している人はInstrumentationを選択して、下記コマンドで生成したapp-debug-androidTest-unaligned.apkをアップロードしてテストを開始しましょう。

```
./gradlew assembleDebugAndroidTest
```

#### 2. テスト用クラスとメソッドの命名規則がある
ここが一番ハマりました。apkファイルをアップロードするとテストが開始されるのですが、結果は以下のようにSetupSuiteとTeardownSuiteテストしか行われていませんでした。
<img width="1135" alt="s.png" src="https://qiita-image-store.s3.amazonaws.com/0/73643/70e19859-96d6-6329-22e2-44dff9d5d2f5.png">

調べに調べたところ、DeviceFarmのDiscussionForumsにさらっと書いてありました。
どうやらテスト用クラスとメソッド名にルールがあるようです。
https://forums.aws.amazon.com/thread.jspa?messageID=696754

上記リンクの内容から抜粋すると、テスト用クラス名は、

```
"[Tt]est[Ss]?.*"

もしくは 

".*[Tt]est[Ss]"

もしくは 

"[Tt]est.*"
```

のパターンで始め（終わら）なければならない模様。
また、メソッド名は`testXXX`としなければならないようです。

こんなかんじですね。

```
public class HogeTests extends InstrumentationTestCase {
    public void testHogeUI() {
        // ...
    }
}
```

上記の規則に従ってない場合はAWS DeviceFarm側がテストクラス/メソッドとして認識できないとのこと。
この記事が誰かの役にたてば幸いです。
単数/複数がイレギュラーなテーブル名だと t.references で migration失敗する

## 前提

環境: Rails (4.2), MySQL

xxx_cachesテーブルが存在する。

次のマイグレーションを書き、 `rake db:migrate` を実行するとエラーになった。

```rb
    create_table :xxx_caches_yyys do |t|
      t.references :xxx_cache, index: true, foreign_key: true

      t.timestamps null: false
    end
```

エラー内容:

```
Mysql2::Error: Key column 'xxx_cach_id' doesn't exist in table: ALTER TABLE `xxx_caches_yyys` ADD CONSTRAINT `fk_rails_26140a20c9`
FOREIGN KEY (`xxx_cach_id`)
  REFERENCES `xxx_caches` (`id`)
```

## 原因
`caches` を単数にしたときに `cach` になってしまうらしい。

そもそも記述は `xxx_cache` なのに、そこから多分内部的に `xxx_caches` (テーブル名) になったあとに、 `xxx_cach` になっているのだろうか。 (不可解な点はあるが一旦おいておく)

## 修正方法
references オプションを指定したら通った。

```rb
      t.references :xxx_cache, references: :xxx_cache, index: true, foreign_key: true`
```

禅問答のようだ。これで `rake db:migrate` が問題なく通るようになった。

## 備考
config/initializers/inflections.rb に以下を記述するのも試した

```rb
ActiveSupport::Inflector.inflections do |inflect|
  inflect.irregular 'cache', 'caches'
end
```

が、うまくいかなかった。migrateのときには呼ばれないということかな。
djangoで一時ファイルをzipで作成して返却

    import tempfile

    with tempfile.TemporaryFile() as tmp:
            with zipfile.ZipFile(tmp, 'w', zipfile.ZIP_DEFLATED) as archive:
                    data = []
                    count = 1
                    for item in (self._iter_csv_rows(
                        queryset=self._get_changelist_instance(request).get_queryset(request),                       charset=charset)):
            data.append(item)
            if len(data) >= 10000:
                            tmp2 = tempfile.TemporaryFile()
                            #csv作成
                            writer = csv.writer(tmp2)
                            writer.writerows(data)
                            tmp2.seek(0)
                            archive.writestr('{}-{}.csv'.format(self.model._meta.model_name,count), tmp2.read())
                            count += 1
                            data = []
                            tmp2.close()

            tmp.seek(0)
            res = HttpResponse(tmp.read(), content_type='application/x-zip-compressed')
            res['Content-Disposition'] = 'attachment; filename={base}_{dt}.zip'.format(
                    base=self.model._meta.model_name,
                    dt=datetime.now().strftime('%Y%m%d-%H%M%S'))
            res['Pragma'] = 'public'
            res['Cache-Control'] = 'public'

            return res
AutoLayoutを使ったUICollectionViewCellの動的なCellのサイズ調整（サンプルプロジェクトあり〼）

# やること
複数デバイスサイズでも、一行のセルの数が変わっても1枚のXibでコレクションのセルをある程度いい感じに動的にする

| 1個 | 2個 | 3個 |
|:-:|:------------:|:------------:|
|![スクリーンショット 2016-06-21 16.28.52.png](https://qiita-image-store.s3.amazonaws.com/0/30928/ddbce798-1fe5-c4f6-8bb8-fefa0887b475.png)|![スクリーンショット 2016-06-21 16.29.11.png](https://qiita-image-store.s3.amazonaws.com/0/30928/1a7f10e5-9a04-8262-5b03-f18624f8d214.png)|![スクリーンショット 2016-06-21 16.29.25.png](https://qiita-image-store.s3.amazonaws.com/0/30928/c148b8cf-71da-0ce4-287d-7d6a752af787.png)|


# バージョン
iOS9以上
XCode7.2
で試してます。

# 手順
### CollectionViewCellのXibと対応したClassを作成
### CellいっぱいいっぱいのUIViewを設置して1.で作ったクラスのプロパティcontainerViewとして紐付ける
### 設置したUIViewをにオートレイアウト。ボトムだけ750に

![スクリーンショット 2016-06-21 15.20.05.png](https://qiita-image-store.s3.amazonaws.com/0/30928/a65fd116-49e5-87f3-778d-97a09f0c6318.png)
### 必要なものをレイアウトしていく。フレキシブルにしたい画像は上、左右だけ決めてアスペクト比のみ入力
![スクリーンショット 2016-06-21 15.17.43.png](https://qiita-image-store.s3.amazonaws.com/0/30928/0c103228-4673-b699-b817-f33257a4fffd.png)
![スクリーンショット 2016-06-21 17.14.30.png](https://qiita-image-store.s3.amazonaws.com/0/30928/0827c543-b6a9-7a91-219c-dab33a09062b.png)
### 上から順に一番したのアウトレットまでレイアウトを繋いでいき、最後のアウトレットのBottomとcontainerViewのBottomをつなぐ
###  CollectionViewControllerのデリゲートで以下のようにcontainerViewのフレームを返す
	
```swift
    func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {
        let width = "セル1枚の横幅計算"
        let cell = "セル取得"
        
        var newFrame = cell.frame
        newFrame.size.width = width
        cell.frame = newFrame
        cell.layoutIfNeeded()
        return cell.containerView.frame.size
    }
``` 
## Tips
- ```sizeForItemAtIndexPath```のたびにCellをインスタンス化してしまうと非常に遅くなるのでサイズをキャッシュさせる


# サンプルプロジェクトはこちら
[yo1106/AutolayoutSample](https://github.com/yo1106/AutolayoutSample)

# UITableViewはこちら
[AutolayoutでCellの横幅いっぱいに画像を複数枚並べる](http://qiita.com/yo1106/items/96874b25c1597e247bf1)
[Java]クラスの継承とコンストラクタ

# コンストラクタとは

あるクラスがnewされた直後に自動的に実行されるメソッド。

```java:
public class Hello {
	public Hello() {
		// Helloクラスがnewされるとここの内容が実行されるよ
	}
}
```

オーバーロードして複数定義もできる。

```java:
public class Hello {
	public Hello() {
		// new Hello();で実行される部分
	}

	public Hello(int x) {
		// new Hello(x);で実行される部分
	}
	...
}
```

## 暗黙のコンストラクタ

本来、全てのクラスは1つ以上のコンストラクタ定義を持っている必要がある。
クラスに**1つもコンストラクタが定義されていない場合**に限り、**引数なし、処理なし**のコンストラクタが自動で定義される。

```java:
public class Hello {
	...
}
```

これは

```java:
public class Hello {
	public Hello() {
	}
	...
}
```

これと同じ。

## 明示的定義と暗黙的定義

**1つでもコンストラクタ定義を記述すると、空コンストラクタは自動で定義されない**。

```java:
public class Hello {
	public Hello(int x) {
		...
	}
}
```

上の状態で`new Hello();`はできない。

## コンストラクタから（同じクラスの）別のコンストラクタを呼び出す

コンストラクタから別のコンストラクタを呼び出す場合は`this()`を使う。
呼び出しはコンストラクタの**先頭**で行わなければならない。

```java:
public class Hello {
	public Hello(String s) {
		...
	}
	public Hello() {
		this("default"); // 必ず先頭で呼び出す
		...
	}
}
```

# 継承とコンストラクタ

以下、簡便のため子クラスのコンストラクタを「子コンストラクタ」、親クラスのコンストラクタを「親コンストラクタ」と記述する。

## 子クラスにおける明示的なコンストラクタ

本来、子コンストラクタは先頭で親コンストラクタを呼び出さなければならない。

```java
public class Child extends Parent {
	public Child(){
		super(); // 必ず先頭で呼び出す
		...
	}
}
```

このとき親コンストラクタの引数などは関係ない。
親コンストラクタが複数ある場合はどれを呼んでもいい。

```java
public class Child extends Parent {
	public Child(){
		super(0);
		...
	}
}
```

```java
public class Child extends Parent {
	public Child(){
		super("default");
		...
	}
}
```

こんなのもあり得る。ただし**先頭以外で親コンストラクタを呼び出すことは出来ない**。

例えば以下のように2つのコンストラクタを呼び出すことはできない。

```java:Error
public class Child extends Parent {
	public Child(){
		super();
		...
		super("default"); // 呼び出しが先頭でないため不可
	}
}
```

## 子クラスにおける暗黙的なコンストラクタ

子コンストラクタで**親コンストラクタが呼ばれていない**場合、**引数なし**の親コンストラクタが自動で呼び出される。

```java
public class Child extends Parent {
	public Child(){
		...
	}
}
```

これは

```java
public class Child extends Parent {
	public Child(){
		super();
		...
	}
}
```

これと同じ。

子クラスのコンストラクタ自体を定義していない場合、空の子コンストラクタが自動定義され、さらに親コンストラクタが自動で呼び出される。

```java
public class Child extends Parent {

}
```

これを

```java
public class Child extends Parent {
	public Child(){
	}
}
```

こうして

```java
public class Child extends Parent {
	public Child(){
		super();
	}
}
```

こうじゃ。

## 子クラスにおける暗黙的なコンストラクタの注意点

子コンストラクタに引数があってもなくても、親コンストラクタ呼び出しを省略した場合は**引数なしの`super()`**が自動で呼び出される。

以下の例を考える。

```java
public class Parent {
	protected String name;
	public Parent(String s) {
		this.name = s;
	}
}
```

```java:Error
public class Child extends Parent {
	public Child(String s) {
		this.name += "ちゃん";
	}
}
```

このとき、子コンストラクタの先頭では`super(String)`ではなく`super()`を呼び出そうとするので、エラーとなる。
子クラスの先頭で`super(String)`の呼び出しを明示するか、親クラスに引数なしの場合のコンストラクタを追加する必要がある。