OmniAICreator/Qiita-1.07M huggingface dataset:
初Qiita、クリスマスの14日くらい前に思うこと


もう10日目ですか、早い！ :scream: 
あっという間に順番が回ってきてしまいました。
hi_kuraraです。

##**本日はIDCフロンティアで働くセールスチーム7年目な私がお届けします**

- **IDCFクラウドで伝えたいこと**
- **中で働く若手メンバーの動向**

それではいきまーす！
（たぶん50秒くらいで読了可能）

##**速いよ、IDCFクラウド**
世界の巨人たち相手に日々凌ぎを削っているわけですが、
「最大」「最強」というより「**最速**」でNo.1目指してやってます。

**みなさんもう触りましたか？**
うちのオールフフラッシュクラウド、超速いですよ！
（マシン作成時間が速い :clap: IOPSが従来のサービス比で2倍 :clap: ）


マシンにおいては「**速い！**」に越したことないですよね :grin: 

**チューニングなども大切**ですが、**ビジネスは待ってくれません**ので、
パワーとスピードが必要な時もありますよね。
そんな時はぜひ触って欲しい、そんなサービスです。
[詳細はこちら](http://www.idcf.jp/cloud/spec/region_zone.html#west)

そしてNo.1といえば、
先日ネットワークの太さで**No.1**になりました。
[IDCフロンティア、インターネット回線総量で国内データセンター事業者No.1に](http://www.idcf.jp/pressrelease/2015/20151203001.html)

次は**1,000Gbps**目指してぶっちぎっていきますー！

##**若手の勢い ハンパない**
IDCフロンティアは若いメンバーもどんどん増えてきており、
「**◯◯やりたい！**」「**◯◯しようよ！**」という**熱い**メンバーが多いです

- 非プログラマー向けにHTML5で**Webアプリつくろう講座**をやったり
- **オンライン授業**でIDCFクラウドの**先生**やったり
- **これ欲しい！**ってものを**新サービスとして企画**したり
- **自動化スクリプト**をバンバン書きまくって**みんなを楽に**したり
- ロゴやLPを作る**デザイナーにも新星**が現れたり
- 未経験からビックデータビジネスに**突っ込んで**いったり
- 、、他にもココには書けないことがいっぱい

7年目な私は良い意味で突き上げられ、
**頑張らねば〜！**と日々精進する次第でございます :sunglasses: 


##余談ですが、
全社横断でバンド、カメラ、フットサル、野球と課外活動もやってます。

バンドは次の対バン相手を、
カメラは粋な撮影スポットを
フットサルと野球部は対戦チームを募集してますので、
気になる方はコメントどうぞー！

それではまた来年〜
ObjC to Swift : [NSString enumerateLinesUsingBlock:]

Objective-C

```Objective-C
[nsString enumerateLinesUsingBlock: ^( NSString * line,
                                       BOOL * stop )
{
	//  do something with "NSString * line" line by line
}];
```

Swift

```Swift
string.enumerateLines
{ line, stop in

	//  do something with "line: String" line by line
}
```
io.getsで得た文字列をそのまま文字列比較してもマッチしない理由

## `io.gets`では最後に改行文字が入る

Rubyでの標準入力メソッドである`io.gets`を使って文字列を取得すると、**最後に改行コードが付与されます**。

普段から`puts`を使っていると、改行文字が出力されないので気づかずハマってしまいます。
`print`を使うと、しっかり`\n`が付与されてることが確認できます。

```ruby:print_test.rb
input = gets
print "print with puts: "
puts input
print "print with p: "
p input
```

```text:出力結果
> ruby
print with puts: ruby
print with p: "ruby\n"
```

## 比較する前に`String#chomp`で改行コードを取り除こう

このため直接文字列比較をするとマッチしません。
`String#chomp`を使って最後の改行文字を取り除いてから比較しましょう。

```ruby:gets_and_chomp.rb
input = gets
puts input == "ruby"
puts input.chomp == "ruby"
```

```text:出力結果
> ruby
false
true
```
WordPress の EOSL についての簡単なまとめ

WordPress の EOSL(end of service life) についての公式見解のまとめ。

#前提(バージョン付与ルールについて)
WordPress では、メジャーリリースは、

4.0 --> 4.1 --> 4.2 ... 4.4

という感じでバージョンが付与されており、脆弱性対応等をマイナーリリースとして、各メジャーリリースの中で、

4.0 --> 4.0.1 --> 4.0.2...
4.1 --> 4.1.1 --> 4.1.2...
4.2 --> 4.2.1 --> 4.2.2...

という具合にバージョン番号を付与している事を理解しておく。

# 結論
- Wordpress は「公式」には最新版以外は安全ではないし、サポートもされない。
- EOSL もしくは EOL という言い方をするなら最新版が出た時点でそれ以前のバージョンは EOL。
- ただし、将来の保証は無いものの、実際にはセキュリティーアップデートは (メジャーリリースの)3.7 以降であれば今後もバックポートされそう。

OSS なので、免責として言っている側面が多いのではと想像され、実際には 3.7 以降であれば今(2015-12-10)のところセキュリティーアップデートをあてていれば使い続けても問題なさそう。

急ぎはしないけれども何かのついでに最新版にしといた方が安全、くらいの認識で良いのではないかと思われる。

# 公式サイトを漁って出てくる公式の見解
https://wordpress.org/download/release-archive/

「None of these are safe to use, except the latest in the 4.4 series, which is actively maintained」

以下適当な和訳
4.4 (最新版)以外は安全ではない。

https://wordpress.org/support/topic/no-clearly-defined-eol

「We have been backporting the occasional security patches for
WordPress 3.7 and up, however these are unofficial and are not
guaranteed to be continued in the future.

The only official release of WordPress is always the latest version.
All previous releases are unsupported and no patches are guaranteed
for them. When a new version is released, all older versions can be
considered EOL.

Always update to the latest version of WordPress.」

以下適当な和訳
セキュリティーパッチは (メジャーリリースの)3.7 以降向けに現状バックポートしているけれども、非公式なものであり、将来に於いてこれを保証するものではない。

公式な Wordpress のリリースは最新版のみであり、それ以前のバージョンはサポートしないし、パッチの提供も保証はしない。新バージョンがリリースされた時点でそれ以前のバージョンはEOL(end of life)とみなして良い。

# その他の情報
上記の公式返答通り、保証しないとは言うものの、古いメジャーリリースのセキュリティーアップデートも行われており、

http://wpdocs.osdn.jp/WordPress_Versions

実際に、上記の記事どおり、3.7 系まではセキュリティーアップデートがリリースされている事が確認出来る。なんというツンデレ。

2013年8月1日にリリースされた 3.6 系はもうセキュリティーアップデートがリリースされていないようだが、これはセキュリティリリースに対してのメジャーな仕様変更が 3.7 系から入ったため、それ以降のバージョンについては最新版でのセキュリティリリースがバックポートされているのだろうと想像。（すみません、想像です。）

以上。
ProcessingライブラリBeadsを使ってサウンドエフェクトをしてみた


## 目的
Processingで音源を加工して再生したかったのですが、普段使っているminimではできなかったのでBeadsというライブラリを使ってみました。
Processingの公式ページで紹介されてたので多分便利だと思います。

## 導入
[Beads公式](http://www.beadsproject.net/)でProcessingのライブラリをDL。
その後Processingのライブラリフォルダに追加してProcessingを再起動。


## コード

```java:processing.pde
import beads.*;
import org.jaudiolibs.beads.*;

AudioContext ac;
SamplePlayer sp;
Gain sampleGain;
Glide rateValue;
void setup(){
  size(500, 500);
  ac = new AudioContext();
  try{
    sp = new SamplePlayer(ac, new Sample(sketchPath("") +"sound1.wav"));
    rateValue = new Glide(ac, 0.8);
    sp.setRate(rateValue);
    rateValue = new Glide(ac, 1.5);
    sp.setPitch(rateValue);
    rateValue = new Glide(ac, 1.5);
    sp.setValue(0.5);
    sp.setLoopType(SamplePlayer.LoopType.LOOP_FORWARDS);

    sp.setLoopType(SamplePlayer.LoopType.LOOP_FORWARDS);
    sp.start();
    sampleGain = new Gain(ac, 1);
    sampleGain.addInput(sp);
    ac.out.addInput(sampleGain);
    ac.start();
  }catch(Exception e){
    println("Error");
  }
}
void draw(){
}
```

## 解説
今回は`sound1.wav`という音を加工している。
`sound1.wav`はprocessing.pdeと同じ階層のディレクトリに配置している。

注意点としてはSamplePlayerの読み込み時にtry catchを書かなければならないこと。これを知らなくてかなり困ってた。

基本的な使い方はAudioContextを作成し、その中にSamplePlayerから作成したSampleGainを追加していく。
SamplePlayerの中で`Rate`, `Pitch`, `Value`, `Loop`の値を編集することができる。


## 参考
[公式API](http://www.beadsproject.net/ref/)
[processing beads library](http://forum.arduino.cc/index.php?topic=135366.0)
Processingライブラリminimを使ってカノンができるアプリを作ってみた


## 目的
カエルの合唱みたいなことが一人でもできるアプリの作成

## ライブラリの追加
[minim公式](http://code.compartmental.net/tools/minim/)に行ってProcessingのライブラリをDLする。
そしてDLしたものをProcessingのライブラリフォルダに追加(デフォルトだと書籍フォルダの中にある)してProcessingを再起動

## コード

```java:Processing.pde
import pitaru.sonia_v2_9.*;

import ddf.minim.spi.*;
import ddf.minim.signals.*;
import ddf.minim.*;
import ddf.minim.analysis.*;
import ddf.minim.ugens.*;
import ddf.minim.effects.*;

Integer Interval = 5;
Minim minim;
AudioInput in;
AudioRecorder recorder;
AudioPlayer player;
ArrayList<AudioPlayer> playList = new ArrayList<AudioPlayer>();

void setup(){
  size(512,512);
  minim = new Minim(this);
  
  in = minim.getLineIn(Minim.STEREO, 512);
  Sonia.start(this);
  recorder = minim.createRecorder(in, "hoge.wav", true);
  frameRate(1);
}

void draw(){
  if(frameCount%Interval == 0){
    if(recorder.isRecording()){
      recorder.endRecord();
      recorder.save();
      player = minim.loadFile("sound" + (frameCount/Interval-1) + ".wav");
      playList.add(player);
      playList.get(playList.size()-1).loop();
    }
    
    recorder = minim.createRecorder(in, "sound" + frameCount/Interval + ".wav", true);
    recorder.beginRecord();
  }
}
```

## 解説

AudioRecorderを使用して5秒間隔で音楽を録音して、録音した音楽をLoopで再生するだけ。

## 参考
[公式API](http://code.compartmental.net/minim/)
[サウンドの基本（minimライブラリの使用） | Yasushi Noguchi Class](http://code.compartmental.net/minim/)
ESP8266 > 回路のビデオ

http://qiita.com/ie4/items/ae850cdb2c617f3fd6af
を参考にESP8266を使おうとしているが、ファーストライトがうまくいかない。

プルアップなどが間違っているのだろうか?

上記の記載にないRSTのプルアップもしてみたが、効果なし。
IDEで書き込み時に通信エラーとなる。

以下に回路例のビデオがあった。
https://www.youtube.com/watch?v=KRn0C9W7R10&index=42&list=WL

次の休みの日にリトライする。
Open vSwitchとHostapdの連携

OVSをBridgeにしてHostapdを使うという話です．
apt-getで入るHostapdはpatchが当たってないのでOVSに接続ができません．
そこでpatchが当たっているHostapdを入れてやります．

# 目標
![image](https://qiita-image-store.s3.amazonaws.com/0/103865/e323595f-0ba5-5a24-e3af-d727787d1d10.png)

# 環境
以下の環境で試しました．

* PC: NUC5i5RYK
* OS: Ubuntu Server 14.04.3 LTS

# Open vSwitchのインストール
```sh
$ git clone https://github.com/openvswitch/ovs.git
$ cd ovs
$ apt-get install build-essential fakeroot 
$ dpkg-checkbuilddeps
$ sudo apt-get install (dpkg-checkbuilddepsで表示されたパッケージ)
$ fakeroot debian/rules binary 
$ cd ..
$ dpkg -i openvswitch-common_amd64.deb openvswitch-switch_amd64.deb
$ sudo ovs-vsctl show
aaaaa-aaaaa-aaaaa-aaaaaaaa
    ovs_version: "2.5.90"
```

# Hostapdのインストール
```sh
$ git clone https://github.com/hschaa/hostapd.git
$ cp defconfig .config
$ vi .config //環境に合わせて弄る
$ make
```

# Hostapdの設定
とりあえずArch Linux Wikiの通りにしました．

```:/etc/hostapd/hostapd.conf
ssid=YourWiFiName
wpa_passphrase=Somepassphrase
interface=wlan0_ap
bridge=br0
auth_algs=3
channel=7
driver=nl80211
hw_mode=g
logger_stdout=-1
logger_stdout_level=2
max_num_sta=5
rsn_pairwise=CCMP
wpa=2
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP CCMP
```

# 起動
```sh
# ovs-vsctl add-br br0
# ovs-vsctl add-port br0 eth0
# ovs-vsctl set bridge br0 protocols=OpenFlow13
# ovs-vstl set-contoller br0 (ControllerのIPアドレス)
# ifconfig eth0 0
# ifconfig br0 (BridgeのIPアドレス)
# route add default gw (ゲートウェイのIPアドレス) br0
# ./hostapd hostapd.conf
```

# 疎通確認
今回はControllerとしてRyuを使いたいと思います．
サンプルのスイッチングハブを実行します．

```sh
$ ryu-manager simple_switch_13.py
```

DHCPの設定をやってないのでHostにIPアドレスを振ったあとPingを実行してみましょう．
Pingできてたら成功です．
ありがとうございました．
[Android] 大きな画像の容量を削減する


`OS X` 向けですが [ImageOptim](https://imageoptim.com/) を使ってみて良かったので共有します。

![スクリーンショット_2015-12-10_11_55_22.png](https://qiita-image-store.s3.amazonaws.com/0/35733/c1201ab7-5b03-2b2b-d3d6-4a1714225736.png "スクリーンショット_2015-12-10_11_55_22.png")

実際に削減した画像（私の場合は `png` 画像）を Android アプリに組み込んでリリースもしてますが、とりあえず問題は起きてません^^;
Amazon Linux 上でとりあえずPHPの開発環境っぽいのをざっと構築するシェルスクリプトを書いた (PHP7版)


http://qiita.com/YU81/items/a6fd1ec1bcb3c83c158c  
の、PHP7対応版ということで。  
Amazon Linux 2015.09 で動作確認。  

以下。  
https://gist.github.com/YU81/5c36da6e1539f813f905  

pecl-redis のインストールに失敗するけど、たぶんエクステンションがPHP7対応版がリポジトリに無いからだと思う。  
そのうちなんとかなる、はず。
はじめてのgulp

# フロント側はgulpを使うと幸せになれるっぽい
↑どこで聞いたかは忘れました。
けどgulp色々書いておくと便利なことをよしなにやってくれるっぽい。
っていうことでひとまず触ってみた。
簡単な処理を作ってみる。

とりあえずプロジェクトファイルをつくってinitする

```
$ mkdir hoge && cd hoge
$ npm init
```

色々インスコ

```
$ npm install -g gulp 
$ npm install --save-dev gulp
$ npm install --save-dev gulp-imagemin //これは画像圧縮してくれるプラグイン。
```

続いてgulpfileを作る。
ここにgulpでやってほしい処理をシコシコ書いていく。


``` gulpfile.js
var gulp = require("gulp");
var imagemin = require("gulp-imagemin");//さっきのプラグイン追加

//gulpのタスク
gulp.task('imageMinTask', function(){ //「imageMinTask」のとこは自由な名前でおｋ
  gulp.src("images/*.png")//処理したいファイル
      .pipe(imagemin())//ここでminify
      .pipe(gulp.dest("min_images"));//出力するフォルダ
});
```

以上でタスクは書けたので、

タスク実行

```
$ gulp imageMinTask
```
<img width="475" alt="スクリーンショット 2015-12-11 20.53.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/15778/ccd65442-0bd0-e78a-b101-ee200fe9525b.png">

でimagesフォルダに置いておいた画像が圧縮されておりました。パチパチ。


ただ毎度毎度

```
$ gulp imageMinTask
```

するのはめんどいので
watchタスクで書き直す

``` gulpfile.js
//gulpファイル読み込み
var gulp = require("gulp");
var imagemin = require("gulp-imagemin");


gulp.task("imageMinTask",function(){
  gulp.src("images/*.png")
      .pipe(imagemin())
      .pipe(gulp.dest("min_images"));
});


gulp.task("watch",function(){
  gulp.watch(['images/**'],['imageMinTask']);
});

```

で、タスク実行
```
$ gulp watch
```
<img width="462" alt="スクリーンショット 2015-12-11 20.56.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/15778/7982271f-c059-ef1b-2856-67f5ef2acfa0.png">

こんな感じです。
ownCloud をスピードアップするTips

##ownCloud をスピードアップする Tips です。
この記事は、ownCloud Advent Calendar  2015 12月12日の内容です。
http://qiita.com/advent-calendar/2015/owncloud

ownCloud をスピードするにはまず、基本的なところから。

# ミドルウェアの構成
## 1. nginx + php-fpm を使いましょう
　Apache + mod_php は動作としては枯れていますが、nginx + php-fpm がお勧めです。
## 2. 新しいPHPのバージョンを使いましょう。PHP5.6 がお勧めです。
　opcache,apcuのPHPキャッシュもいれましょう。
## 3. MySQL/MariaDBもしくは、PostgreSQLの新しいバージョンを使いましょう。 
　SQLiteを使ってはいけません。
## 4. sessionストアとして memcached を使いましょう。
　通常のファイルベースのセッションストアよりもパフォーマンスがよくなります。

# ミドルウェアの設定
## 1. nginx でキャッシュ設定を大きくしましょう。
　fastcgi 系の設定をメモリーに合わせて大きくします。
  ついでに、fastcgi_temp_path をメモリー上に確保しておくとよいでしょう。
## 2. php のキャッシュ(opcache.ini,apcu.ini) を設定しましょう。
　具体的には、opcache.memory_consumption を大きくしましょう。
　Sessionストアを memcached を利用するように変更しましょう。
## 3. MySQL/MariaDB,PostgreSQL のキャッシュを適切に設定しましょう。
  MySQL/MariaDB は、分離モードを「REPEATABLE-READ」から「READ-COMMITTED」に変更するとパフォーマンスアップします。
  innodb関連の設定もメモリーに合わせて増やしておきましょう。

上記が正しく設定されていないと、軽自動車のエンジンで F1に戦いに行くようなものです。
まずは、ここまで設定しましょう。

# ownCloud側の設定
## 1. memcache.* を設定
 'memcache.local' にAPCu の設定をしましょう。
 'memcache.distributed' に memcached を設定し、
 'memcached_servers' に実際のmemcached サーバーを指定します。
## 2. cron の設定
 Job実行を cron実行にするのがスピードがあがります。
## 3. JavaScript の設定
 'asset-pipeline.enabled' を有効にしましょう。
## 4. (番外編) 外部ストレージ接続時
　外部ストレージ接続時には「プレビュー」をOff、ファイルシステムチェックを「しない」にしておくとスピードアップします。
Xcode7でTeam Provisioning Profileを更新する

Member Centerで新規検証端末のUDIDを登録後、Xcode7でTeam Provisioning Profileの更新でつまづいたのでメモ。

Team Provisioning ProfileはXcodeが管理、生成しており、自動的に証明書とデバイスとApp IDの紐付けを行ってくれるとても便利な機能。

これを更新する必要があるときは、
Xcode6まではXcode -> Preferences -> Account -> View Details -> Refreshをクリックすればよかった。

だけど、Xcode7ではRefreshのボタンがDownload Allに変わってしまい、
いくら押しても何も変更がでない。

その場合は以下の手順を踏めばよさそう。

1. Xcode -> Preferences -> Account -> View Detailsから該当のTeam Provisioning Profileを右クリックしMove to Trash
1. Team Provisioning Profileを利用するXcodeプロジェクトのGeneralタブを開く
1. 'No Provisioning File'というエラーが出ているため、Fix Issueをクリック

これで一応Team Provisioning Profileが更新・ダウンロードされるみたいです。
なんか微妙..

参考
--------
* http://stackoverflow.com/questions/32729193/refresh-devices-in-team-provisioning-profile-managed-by-xcode-7
Node.js 実践講座 〜基礎編〜 その4

# はじめに
この記事では、標準ライブラリの使用方法の解説の一部をご紹介します。今回はcryptoによるSHA-256ハッシュ値計算のサンプルプログラムを作成します。

# ワークスペースの作成

下記コマンドでプログラムを格納するディレクトリを新たに作成します。

```
mkdir workspace/js/basic/02-standard-library/03-crypto
touch workspace/js/basic/02-standard-library/03-crypto/index.js

cd workspace/js/basic/02-standard-library/03-crypto
```

または、

```
mkdir -p workspace/js/basic/02-standard-library/03-crypto
touch workspace/js/basic/02-standard-library/03-crypto/index.js

cd workspace/js/basic/02-standard-library/03-crypto
```

# SHA-256ハッシュ値の計算

ソースコードの内容を下記に示します。

```index.js
'use strict';

var crypto = require('crypto')

if (require.main === module) {
  main({ argv: process.argv })
}

function main(options) {
  var argv = options.argv
  var plain = argv[2]

  var hash = crypto.createHash('sha256')
  hash.update(plain)

  var digest = hash.digest('base64')

  console.log('plain: ' + plain)
  console.log('digest: ' + digest)
}

```

下記コマンドを下記に示します。

```
node index.js plain
```

実行結果の例を下記に示します。

```
plain: plain
digest: oRbJ7UbWIHc0pDMX0w/Yj1KshjTDfZBLv05B2GX5BHU=
```

`crypto.createHash`関数は第1引数として与えられるアルゴリズムの`Hash`クラスのオブジェクトを生成して返します。
`Hash`クラスの`update`メソッドでハッシュ値を計算する対象のデータを入力します。
`Hash`クラスの`digest`メソッドでハッシュ値の計算結果を取得します、第1引数として戻り値のフォーマットを指定します。

# おわりに
次回は、eventsによるEventEmitterの使用のサンプルプログラムを作成します。
ShareXを利用したownCloudへのスクリーンショットのアップロードについて

# Evernote のSkitchみたいなことを ownCloud でもしてみたいのでチャレンジしてみました。
この記事は、ownCloud Advent Calendar  2015 12月11日の内容です。
http://qiita.com/advent-calendar/2015/owncloud


## ShareXをダウンロード

ShareXは、スクリーンショットを取得したり、トリミング、画面動画撮影をして様々なアップロードサイトにアップロードできる超便利なツールです。

ShareX - Take screenshots or screencasts, annotate, upload and share URL in clipboard
https://getsharex.com/

## ShareXをインストール

https://getsharex.com/
の「Download」からダウンロードしてインストールしてください。
さほど難しいオプションはないと思います。全てデフォルトでOKです。

## ShareX にownCloud を設定

### ownCloud の設定を追加
![destination.png](https://qiita-image-store.s3.amazonaws.com/0/15176/2a27c0ed-5050-d7fe-c07c-2ee9275a20e7.png)

Destinationsから、「Destination Settings」を選択します。

![destination_details.png](https://qiita-image-store.s3.amazonaws.com/0/15176/706d0d6d-b0fd-a8ed-c508-33ea8733eb13.png)

「ownCloud」を選択して、URLとユーザー名、パスワード、保存先ディレクトリを指定します。
※保存先ディレクトリは、事前にownCloud上で作っておいてください。

### デフォルトのアップロード先を変更

![default_destination.png](https://qiita-image-store.s3.amazonaws.com/0/15176/82953112-640b-2b53-6fa2-c21910cfce41.png)
デフォルトでは、アップロード先が「imgur」になっているのでownCloudに変更します。
(間違えるとスクリーンショットがimgurにアップロードされてしまうのでご注意ください！！！)

## キャプチャーしてみる。

![action.png](https://qiita-image-store.s3.amazonaws.com/0/15176/0249b37f-8f9f-f526-c85a-6a866c2bdc89.png)

お好きにキャプチャーしてください。

## ※注意事項
Create shareable URL にチェックを入れた場合、ownCloud側でURL共有時のパスワード設定が必須になってるとエラーになります。
くれぐれもデフォルトアップロード先の変更をお忘れなく。。
データロスト時の挙動(LOST action)と対応

設定した冗長度以上の数のサーバが落ちて、冗長度が0になってしまった場合のROMAの挙動と、その際の対処法です。

# 環境
server: 3台
冗長度: 2
vnode数: 512

# 冗長度が0になった時の挙動
## 冗長度0(data lost)したvnodesの数
上記の環境でサーバが2台落ちて、1台しかインスタンスが生き残っていない場合、計算上170のvnodesが冗長度0になりデータのwriteもreadもできなくなります
`512 - {(512(vnodes)/3(server)) * 2(冗長度)}`

- 生き残ったインスタンスが担当しているvnodesは342
  - primary vnodesが 512(vnodes)/3(server) ≒ 171
  - 同じくsecondary vnodesが512(vnodes)/3(server) ≒ 171
  - primaryとsecondaryを同じインスタンスが担当することはないので合わせて342
- primaryかsecondaryどちらか生き残っていればdataの読み書きは出来るので、完全にアクセス出来ないvnodesは512-342=170vnodesになる
- このvnodesのことをlost_vnodesと言います

```rb
> stat lost_vnodes
  routing.lost_vnodes 0 # 正常時は0
```

## 挙動
lost_vnodesが発生した場合のROMAの挙動はconfigファイルの設定によって3パターンに分かれます。
### no_action
- 何もしません
- lostしたvnodesにはwriteもreadも出来ないままです

### auto_assign(デフォルト設定)
- 新たに生き残っているinstanceにlostしたvnodesを再アサインします
- lostする前のdataはread出来ませんが、writeと、lost後にwriteしたdataはreadできます

### shutdown
- lostが発生した時点でROMAクラスターを停止します

## 設定の確認方法
### config.rb
```rb:config.rb
.
.
# :no_action | :auto_assign | :shutdown
DEFAULT_LOST_ACTION = :auto_assign
.
.
```
https://github.com/roma/roma/blob/master/lib/roma/config.rb#L12-L13

### stat

```rb
> stat lost_action
  routing.lost_action auto_assign
```

# lostが発生した時の対処法
## no_action, auto_assignの場合
- 新しいインスタンスを追加(join)します
- no_actionの場合はlostしたvnodesを優先的に、auto_assignの場合は全体のvnodesから満遍なくjoinされたインスタンスに再アサインされます
- (落ちたサーバのinstanceをそのままjoinして戻しても構いませんが、落ちた原因を調べてからにした方がbetterでしょう)

### joinの方法
http://qiita.com/hiroaki-iwase/items/087c1b4d0dd3e6882001

## shutdown
- ROMAが停止した状態になるので、再度全インスタンスを立ち上げなおします
勉強会レポート <あなたのコンテンツは大丈夫？クリエイターとエンジニアのための法律勉強会 #10>

タイトルにもありますが
[あなたのコンテンツは大丈夫？クリエイターとエンジニアのための法律勉強会 #10](https://coedo-dev.doorkeeper.jp/events/35261)
に参加しました。
なので、自分も振り返れるようにレポートをまとめます。

# テーマ

知財（著作権）とはなんぞや？

# はじめに

裁判が発生した際にそのアプリ等のシステムを
一番に理解させる必要があるのは弁護士。
その次に裁判官に理解させる必要が必要がある

# 参考例

##前提

G社とD社の某釣りゲー
G社がD社に対し「ぱくり」を行ったと訴え

G社は
**ゲーム停止と賠償金９億を要求**

##結果

一審
G社の勝訴（D社に対し２億支払いとゲーム停止命令）

二審
D社の逆転勝訴

##注目点

・一審と二審で判決がひっくり返ってしまった
・二審（高裁）で判決がひっくりかえるのありえなくはないがそれなりに稀有な事態
・裁判期間は一審で３年、二審で６ヶ月

##まとめ

・裁判期間からもわかるが、一審と二審では期間が大きく違う
・一審ではじっくりと二審は比較的に急ぎで行われる
・つまりは一審超大事


# 「ぱくり」とは

法律上では「著作権の侵害」「翻案権の侵害」にあたる

## 具体的な扱い

表現は保護されアイディアは保護されない
創作性がない部分は保護されない

例)
ロミオとジュリエット
・対立している男女が恋に落ちる
ー＞よくある話でパクリとは言わない（アイディア）

ベランダで男女が話す、仮死の毒をのみ結果男性が自殺し女性が後を追う
ー＞表現と判断され侵害となる可能性がある


## 実際の裁判（釣りゲー）での例


### 一審

魚の影や釣り糸の表示等似ている部分がある

中央に円が表示されている部分が似ている
ー＞アイディアにとどまらない
また円を描いたのはこのゲームが初めてだったことが重要視


### 二審

似ている事は認めている
ただし、魚の影や釣り糸等は「アイディア」
問題は円は釣りゲーでは初めてだがーツ等の円を釣りゲームに応用しただけ
ー＞「アイディア」である
釣りゲーにおける円は創作性がないと判断

## まとめ
・一審と二審がなぜ違ったのか
ー＞個々の裁判官の主観による判断によるため
・アイディアと創作性がない部分が保護されないのはよくある例であり頻繁に言われる
・アイディアにとどまらないと判断された場合「ぱくり」と判断される


# その他

・良識ある弁護士とは？
ー＞結論を即答しない（裁判官の主観によるため、判断が難しいため）

・著作権の保護
ー＞ものが出来た時に自動的に発動するものであり、登録等は必要ない

・民事の裁判
ー＞要は金をよこせと同義

・本来差し止めはハードルが高い
ー＞ただし知財に関しては別で差し止めが比較的簡単にできてしまう事がある

・見た目が似ていて操作性が違う場合はどうなるのか？
ー＞操作性は著作権で保護されない事が多い。
守りたい場合は特許の申請等の別の方法を考える可能性がある


# 結論

・「ぱくり」の判断は裁判官の主観的判断による部分があるため、非常に不安定
・裁判が起きた際は一審超大事
・アイディアと創作性がない部分は保護されない
・操作性を守りたい場合は特許等の方法を
・見た目が似ている方が「ぱくり」と判断されやすい
・「ぱくり」ダメ、絶対
CentOS5系で日本語メール送信の件名が文字化ける場合

## 参考

* [Rubyで日本語のメールを送る。 - こせきの技術日記](http://koseki.hatenablog.com/entry/20090328/rubymail)の例だと件名が文字化ける。

* [RubyのNKFのバグでSubjectのエンコードができなくて困った](http://blog.cles.jp/item/3275)を参考に対応。

## メール送信

```rb:ソースコードをUTF-8で書いている場合
require "nkf"
require "net/smtp"

def sendmail(from, to, subject, body, host = "localhost", port = 25)
  subject = NKF.nkf("-JM", NKF.nkf("-jW", subject) )
  body = <<EOT
From: #{from}
To: #{to.to_a.join(",\n ")}
Subject: #{subject}
Date: #{Time::now.strftime("%a, %d %b %Y %X %z")}
Mime-Version: 1.0
Content-Type: text/plain; charset=ISO-2022-JP
Content-Transfer-Encoding: 7bit

#{NKF.nkf("-Wjm0", body)}
EOT

  Net::SMTP.start(host, port) do |smtp|
    smtp.send_mail body, from, to
  end
end
```

```rb:送信
sendmail("from@myserver.com", "to@myserver.com", "けんめい", "本文")
```

### ソースコードがEUC-JPで書いている場合

```diff:
 require "nkf"
 require "net/smtp"
 
 def sendmail(from, to, subject, body, host = "localhost", port = 25)
-  subject = NKF.nkf("-JM", NKF.nkf("-jW", subject) )
+  subject = NKF.nkf("-JM", NKF.nkf("-je", subject) )
   body = <<EOT
 From: #{from}
 To: #{to.to_a.join(",\n ")}
 Subject: #{subject}
 Date: #{Time::now.strftime("%a, %d %b %Y %X %z")}
 Mime-Version: 1.0
 Content-Type: text/plain; charset=ISO-2022-JP
 Content-Transfer-Encoding: 7bit
 
-#{NKF.nkf("-Wjm0", body)}
+#{NKF.nkf("-ejm0", body)}
 EOT
 
   Net::SMTP.start(host, port) do |smtp|
     smtp.send_mail body, from, to
   end
 end
```
Mavenで作成したプロジェクトをEclipseプロジェクトに変換する


Mavenでさくっとプロジェクトのひな形を作れるのはよいのですが、実際はIDEなどに取り込めなければ開発が捗らないわけです。ここでは、Eclipseプロジェクトに変換し、Eclipseに取り込んでみます。

最新のEclipse 4.x あたりはMavenが標準でプラグインされているので、いきなりEclipse側からインポートすることもできるのですが、ここではコマンドで変換してみます。

# mvn eclise:eclipse

以下の通り、"mvn eclipse:eclipse" とします。特にpom.xmlにeclipseプラグインの設定をしなくても実行できます。きっと良きに計らってくれるのでしょう。

詳細は、
* https://maven.apache.org/plugins/maven-eclipse-plugin/
* https://maven.apache.org/plugins/maven-eclipse-plugin/eclipse-mojo.html
辺りを参照です。

```
 D:\temp\sample\test-server>mvn eclipse:eclipse
mvn eclipse:eclipse
[INFO] Scanning for projects...
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building test-server Maven Webapp 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] >>> maven-eclipse-plugin:2.10:eclipse (default-cli) > generate-resources @ test-server >>>
[INFO] 
[INFO] <<< maven-eclipse-plugin:2.10:eclipse (default-cli) < generate-resources @ test-server <<<
[INFO] 
[INFO] --- maven-eclipse-plugin:2.10:eclipse (default-cli) @ test-server ---
[INFO] Using Eclipse Workspace: null
[INFO] Adding default classpath container: org.eclipse.jdt.launching.JRE_CONTAINER
[INFO] Not writing settings - defaults suffice
[INFO] Wrote Eclipse project for "test-server" to D:\temp\sample\test-server.
[INFO] 
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3.096 s
[INFO] Finished at: 2015-12-06T10:55:02+09:00
[INFO] Final Memory: 13M/245M
[INFO] ---------------------------------------------------  
```

.project ファイルと、.classpath ファイルが生成されているのが確認できるでしょう。

# Eclipseでインポート
最新のEclipse IDE for Java EE Developers でしたら、Mavenプラグインが同梱されているでしょう。日本語化されているEclipseは常用していないのでわからないです。

## Import 
File->Import -> Existing Maven Project を選びます。mvn eclipse:eclipse しなくてもよいんじゃないかと、ここまできて思いましたが特に問題なかったのでそのままです。

![2015-12-10 11_13_10-Import.png](https://qiita-image-store.s3.amazonaws.com/0/50166/abd9b82c-91c2-de9b-ee4b-8f559bdbab5c.png)

適宜、ディレクトリを指定してWorkspace配下にImportします。
![2015-12-10 11_13_20-Import Maven Projects.png](https://qiita-image-store.s3.amazonaws.com/0/50166/2feba74b-7453-1505-0f26-c35ce4c937ed.png)

プロジェクト配下は以下のような感じです。
![image](https://qiita-image-store.s3.amazonaws.com/0/50166/94860172-1ded-f8ec-8ebe-0d0a74843686.png)

実行は、Maven経由で起動することができます。
![image](https://qiita-image-store.s3.amazonaws.com/0/50166/e395ad6e-9996-01ec-637a-2ad0ba59c83e.png)

以上、続くかも。
subsubsectionを目次に含めない

http://tex.stackexchange.com/questions/63422/help-removing-subsection-and-subsubsection-numbers-from-table-of-contents-toc

```
\pagenumbering{roman}  % i, ii, iii, iv, v, viみたいなページ番号
\setcounter{page}{1}   % 番号をiからはじめる
\setcounter{tocdepth}{2}  % subsubsectionを目次に含めない
\tableofcontents
```
Xcode7.2へアップグレードしたらプラグイン動かなくなりました。

タイトルどおりでして、XVimやらAlcatrazやらが動かなくなり、完全にデフォルト状態に戻ってしまいました。
で、同僚に相談したところ、以下のようなスクリプトを実行すれば解決するよ、て事で試してみました。

```bash:xcode-plugin-update.sh
#!/usr/bin/env sh
UUID=$(defaults read /Applications/Xcode.app/Contents/Info DVTPlugInCompatibilityUUID)
echo Xcode DVTPlugInCompatibilityUUID is $UUID
for MyPlugin in ~/Library/Application\ Support/Developer/Shared/Xcode/Plug-ins/*
do
    UUIDs=$(defaults read "$MyPlugin"/Contents/Info DVTPlugInCompatibilityUUIDs)
    echo $MyPlugin
    if echo "${UUIDs[@]}" | grep -w "$UUID" &>/dev/null; then
        echo "The plug-in's UUIDs has contained the Xcode's UUID."
    else
        defaults write "$MyPlugin"/Contents/Info DVTPlugInCompatibilityUUIDs -array-add $UUID
        echo "Refresh the plug-in completed."
    fi
done
echo "Done!"
```

こちらを実行した後でXcodeを再起動すれば、新しいXCodeでもきちんとプラグインが機能しました。
助かった〜（　＾ν＾）
OpenPyXlで生成したファイルがExcelで開けないパターンとその対処

とあるログを[OpenPyXl](https://openpyxl.readthedocs.org/en/latest/index.html)でxlsxファイルに出力し、MacのExcel2011で開いたところ、以下の様なダイアログがでてしまいました。

<img width="470" alt="スクリーンショット 2015-12-10 10.42.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/89908/2089bfe1-7cb1-ae26-90bb-51ba4fe354a4.png">

問題となっている箇所の分析を行い、以下の2つが原因で開けなくなっていることがわかりました。

1. セルの中に携帯絵文字が入っている
2. 数値セルが '=' (半角イコール)で始まっている

## 携帯絵文字対策

携帯絵文字(非常に雑に言うとU+E000-U+F8FF)はOpenPyXl自体は問題なく通り、xlsxファイルが生成されます。ただし、Excelはこれらの表示できない文字はファイルにそのまま記載されることは想定していないようで、上記エラーになり、文字変換(?)が行われます。tsvファイルの読み込みやセルにコピペした場合はこの段階でExcelにより変換されるようで、変換後の文字がセルに格納されます。

今回の作業では、表示できない物は削ってよかったので、以下で削りました。

~~~
invalid_code = re.compile(ur'[\u0000-\u001F\u007f\uE000-\uF8FF]')
invalid_code.sub('', s)
~~~

実際、携帯絵文字に対応しているのは`\uE000-\uF8FF`になります。`\u0000-\u001F\u007f`は制御文字なりますが、こちらはOpenPyXlが通してくれないので、入れてあります。(こんな文字入ってるログってどーなのという問題は置いておいて) あと`s`はunicode文字列です。

## イコール対策

これも絵文字と同様に、どうやらExcelは数値かつ '=' はじまりをエラーとみなすようです。(数式なら数式のセルで入っているべきってことなんだと思う) かつ、OpenPyXlはデフォルトで、数値としてセルに書き込むよう([Be wary of setting Cell values text starting with "=".](https://bitbucket.org/openpyxl/openpyxl/issues/442))で、そのためやはりExcelはエラーを吐いていると思われます。

対策としては、

1. 文字列セルに変換する
2. セルの頭に ' (シングルクォート)を入れる

があり、今回は前者を選択しました。

~~~
ws.cell('A1').data_type = 's'
~~~

以上により、エラーなく生成したファイルが開けるようになりました。他のパターンがあればまた書きたいと思います。
Jenkinsの全てのジョブの設定を一括変更する方法 (find + xargs + sed)

# 概要
Jenkinsの運用をしていると全てのジョブの設定を一律に変更したい事があったりします。
ジョブ数が少なければブラウザからぽちぽちと設定を変更して行けば良いのですが、
僕のプロジェクトではジョブが数百有るのでブラウザ経由で変更していたらそれだけで一日が終わってしまいます。
ということで、いつも使っているジョブの一括変更方法を共有します。

# 方法
今回はjenkinsのhipchatプラグインの通知設定(notifySuccess)を一括変更する方法を紹介します。

Jenkinsのジョブの設定はJenkinsのホームディレクトリ配下のjobディレクトリに格納されています。
（何も設定をいじっていなければ/usr/local/jenkins/jobsにジョブがあるはずです）

このディレクトリに移動して以下のコマンドを実行します。

```
find ./*/config.xml  | xargs grep "notifySuccess"
```

全てのジョブのconfig.xmlからnotifySuccessの記述を取得してまず既存の設定を確認しました。
以下の様にtrueとfalseの設定が混在していたので、全てfalseにする事にします。

```
./backup_jenkins/config.xml:      <notifySuccess>true</notifySuccess>
./backup_storage/config.xml:      <notifySuccess>false</notifySuccess>
```

先ほどgrepしたものを今度はsedに置き換えて、、実行します。
（注意）思い通りの変更にならないと困るので、コマンド実行前に一度jobs配下のcopyを取っておくと良いかもしれません。

```
find ./*/config.xml  | xargs sed -i -e "s%<notifySuccess>true</notifySuccess>%<notifySuccess>false</notifySuccess>%g"
```

※設定反映の為にJenkins起動中の場合は設定を再読み込み（Jenkinsの管理→設定の再読み込み）をする必要が有ります。
[ ruby ] group_byを使う

###0. やりたいこと
`group_by`で返されるhashのキーをカスタマイズしたい。

###1. よくあるサンプル
```rb:これだと返却されるhashのキーを自分で決めることができない
(1..5).group_by {|x| x%2}
=> {1=>[1,3,5], 0=>[2, 4]}
```

###2. 解決案
`group_by`は配列の要素をグルーピングする。
↓
グルーピング=「評価した結果に応じて仕分ける」。
↓
評価結果が返却されるhashのキーとなる。
↓
要するに評価された配列の要素が評価結果のキーごとに分類される。
↓
キーを自分で決めたければ評価するメソッドを自分で作るしかない。

```rb
def evaluate_num(val)
  return "RED"  if val <= 2
  return "BLUE" if val > 2
end
(1..5).group_by {|x|
          evaluate_num(x)
       }
=> {"RED"=>[1,2], "BLUE"=>[3, 4, 5]}
```
ssh接続のデフォルトユーザを設定して作業効率を上げる方法

# 概要
ssh時にLDAP等の認証が必要になる場合毎回以下のようにユーザ名を入力していましたが、
デフォルトでユーザ名を設定しておいた方が楽だろうという事に気付き最近設定しました。

```
ssh yourname@192.168.x.x
ssh 192.168.x.x -l yourname
```

# 方法
~/.ssh/configの設定でUserの設定をするだけです。
以下は全てのhostに対してyournameで認証する場合の例になります。

```
Host *
User yourname
```

これをしておく事でssh時にユーザ名を入れずに済みます。

※.sshと.ssh/configのファイルの権限を適切にしないと反映されないので注意してください。
Salesforce Trailhead 事始め

# Salesforce Trailhead とは
Salesforce を楽しく学ぶ方法、それが [Salesforce Trailhead](https://developer.salesforce.com/trailhead) です。

たくさんのモジュール（単元）の中から自分の興味に合わせて選択して学んでいく形です。
何からやればいいのか分からないかたは、モジュールを集めたトレイルがあります。
トレイルに沿って進めていけば、簡単です。

# Trailhead のよいところ
Trailhead のよいところは、実際に手を動かして試すところです。
モジュールの中には「Challenge」という単元の確認テストのような問題が用意されています。問題は実際に手を動かして試す形式のものがいくつもあります。

![challenge.png](https://qiita-image-store.s3.amazonaws.com/0/59985/1925aab5-ab07-3ac2-b064-1bb325ffa3d0.png)

自分が持っているDeveloper Edition を起動して問題に従ってカスタマイズします。
正解すると、以下のように表示されてテンションがあがります。

![success.png](https://qiita-image-store.s3.amazonaws.com/0/59985/b8570852-78ea-8bb2-a8fc-b7522c5fb141.png)

# Challenge と英語
「Challenge」は英語なので、英語力が試されます。
私は手を動かす方が正答率がいいです。
設問にあった選択肢を選ぶというChallengeもあるのですが、その場合の正答率は英語の理解力に左右されます。
そんな時に役立つのは[Salesforce - 英単語](http://qiita.com/tyoshikawa1106/items/bcee1922263e3be742e3)と本家のAPIドキュメントです。
日本語と英語を頭の中で置換しながら読むと正答率が上がります。

ちなみに、私の出来が悪かった Challenge は、オブジェクトのリレーションです。
[Object Relationships Overview](https://help.salesforce.com/apex/HTViewHelpDoc?id=overview_of_custom_object_relationships.htm&language=en) によると、リレーションは以下のように定義されています。

- Master-detail
- Many-to-many
- Lookup
- External lookup
- Indirect lookup
- Hierarchical

**lookup** という単語が頭になくて、reference という単語が脳内を占拠していたため、Challenge の設問をことごとく間違えました。

# Challenge tips 
設問の通りにやってもうまくいかない時は以下をお試しください。

<blockquote class="twitter-tweet" lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/mihoko_az">@mihoko_az</a> もしかすると確認済みかもしれませんが、ユーザの言語を英語にすると通るかもしれません。</p>&mdash; Taiki Yoshikawa (@tyoshikawa1106) <a href="https://twitter.com/tyoshikawa1106/status/671250030146158593">2015, 11月 30</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

まさしくtweet の通りでした。challenge は英語ですので、英語で解くほうがよろしいようです。
私は英語力が低いので、ぎりぎりまで英語にはしません。
設問が分からない時に環境を英語にすることでヒントを得ることができます。

# Trailhead のよいところ。もうひとつ
バッジです。
バッジを集めるのが楽しい。
時間がなくて集まりが悪いですが、コツコツやっていきます。
バッジを眺めてニヤニヤしていると、シルバニアファミリーを集めていた小さい頃の自分を思い出します。

今の私のバッジたち
![badge.png](https://qiita-image-store.s3.amazonaws.com/0/59985/6f659da5-6ba2-a405-788f-7d2cc64145bc.png)

# さいごに
Trailhead を通して知識の update ができます。
気付かぬうちに変わっている箇所がたくさんあります。
業務で使っているわけではないので余計に、錆ついていたなと反省しました。
そんな知識の棚卸にも便利な Trailhead でみなさん遊びましょう！
Windowsでvagrantのnpm installが失敗する問題

# Windowsで使うVagrant

Windwosはなんだかんだで開発し辛くなってきたなぁ、と

そこでvagrant使ってVM立てて、共有ディレクトリにソース配置、エディタはホスト機で！
なんてよくやると思うんですけど、このときにnodejs系のパッケージ入れようとするとエラー出て死ぬこと多数

原因はファイルパスが長すぎて無理！ってことらしい
共有ディレクトリなんでWindowsに引きずられちゃってるという・・・

一応対応プルリクが出ててMergeもされてるようなんですが、まだ未リリースのようです(現在1.7.4が最新)
しゃあないのでプルリクの内容で直接ファイル編集しちゃうという対応を・・・

# 対応方法(PRの内容をペタリ)

## VirtualBox 4.x

`C:\HashiCorp\Vagrant\embedded\gems\gems\vagrant-1.7.4\plugins\providers\virtualbox\driver\version_4_3.rb`

```
         def share_folders(folders)
           folders.each do |folder|
             hostpath = folder[:hostpath]
+            if Vagrant::Util::Platform.windows?
+              hostpath = Vagrant::Util::Platform.windows_unc_path(hostpath)
+            end
             args = ["--name",
               folder[:name],
               "--hostpath",
```

## VirtualBox 5.x

```
         def share_folders(folders)
           folders.each do |folder|
             hostpath = folder[:hostpath]
-
-=begin
-            # Removed for GH-5933 until further research.
             if Vagrant::Util::Platform.windows?
               hostpath = Vagrant::Util::Platform.windows_unc_path(hostpath)
             end
-=end
-
             args = ["--name",
               folder[:name],
               "--hostpath",
```

あとは`vagrant reload`すれば通るはず
JINS MEME の視線移動ってどういうもの？

##はじめに
JINS MEME のSDKを利用して開発していただいている方からの問い合わせで多いのが視線移動まわりです。今回はJINS MEMEの視線移動に関して簡単にまとめてみました。

##動作原理
視線移動は眼電位モジュールと呼んでいる3点式電極によって検出します。3点式電極に入ってきた入力から上下のシグナルと左右のシグナルを生成します。バンドパス後のシグナルは以下のようになります。
![signal.gif](https://qiita-image-store.s3.amazonaws.com/0/103775/52c3d412-d074-e36f-3240-5249c6a965a9.gif)

まばたき（専門用語では瞬目（しゅんもく）と呼びます）はまぶたを閉じるシグナルと開けるシグナルがくっついて見えます。まばたきと同じぐらいのスピードで上を向いて下を向くとまばたきと同じようなシグナルに見えますが、相当意識的に行わないとそのようなシグナルは出にくいので、上下の連続した組み合わせはまばたきとして検出されるようになっています。
（裏を返すと上下方向はまばたきと視線移動の判別を排他で行うので横方向より検出が難しい方向にいきます）

##特性
###相対位置？絶対位置？
視線移動は絶対位置ではなく、相対的な「動き」を検出します※。相対位置なので最初に正面を見ていようと左を見ていようと、その位置から右を向くと「右」の視線移動が検出されます。ただし移動量に応じてシグナルの強さは変わるので、キャリブレーションで得たしきい値を元に視線移動の大きさとして出しています。
※ドリフト成分を補正できるアルゴリズムが組めれば絶対値として出すことができるようになります

以下編注：最新ファームウェアで逆視線移動は廃止されました
~~逆視線移動って何ですか？
上記の特性から中央からどちらかを向くのと端から端を向くのでは後者が大きいシグナルに見えます。それを検知した場合「逆視線移動」というフラグになります。ただし、現在の定義では短いフレームで右→左の視線移動が起こった場合を想定した検出になっているため、通常用途で逆視線移動のフラグが立つことはほとんどありません。~~
###上下／左右の違い
視線移動は「とりやすい方向」があります。多くの人は左右の視線移動は自然に行えますが、上下に関してはぎこちないことが多いです。縦書きの本を読まなくなって、スマホ／PC（横書きの文章）と接する時間が長くなっていることも影響しているかもしれません。
特に上視線移動はそれ視線移動に伴いまぶたが開く（±的には逆の動き）ので個人差が大きく出ます。
###まばたき＋視線移動
視線移動の前後で無意識にまばたきが入ることがあります（男性より女性に多いです）。これも個人差が大きいです。
##終わりに
JINS MEME ではファームウェアを定期的に更新する計画を立てています。現状の視線移動の検出精度はまだ改善の余地があると考えておりまして、2016年は特に視線移動の精度を高く・使いやすくする改善を加えていく予定です。
何らかのコードを書く人はいますぐ「スマート引用符」の機能をoffにしよう

# 結論

- MacOSXで何らかのコードを書く人は「スマート引用符」の機能をoffにしておこう
- 手順は以下の通り
    1. システム環境設定
    2. キーボード
    3. ユーザ辞書
    4. スマート引用符とスマートダッシュを使用
    5. チェックを外す
    6. 各種アプリを再起動
- 参考リンク
    - [スマート引用符が全然スマートじゃない。スマートとは何だったのか - 虎塚](http://d.hatena.ne.jp/torazuka/20140724/smart)
    - [Macで引用符を入力すると勝手に変換されるのをやめたい - PILOG](http://xoyip.hatenablog.com/entry/2014/01/06/205101)

# 現象

Slack botに繰り返しタスクを設定するため[r7kamura/ruboty-cron](https://github.com/r7kamura/ruboty-cron)を導入した。一生懸命話しかけるが一向に返事がない。

頭を抱えたまま別タスクを行い、合間にふとiPadのSlackから話しかけてみたら、ちゃんと登録された。たまたま失敗した直後のPostだったので、間違い探し的に引用符の形が違うのを発見できた、という次第。

## 設定前

```
% bandle exec ruboty --dotenv     
Type `exit` or `quit` to end the session.
> ruboty ping
pong
> ruboty add job “* * * * *” ruboty ping
> ruboty list jobs
Job not found
```

## 設定後

```
% bandle exec ruboty --dotenv     
Type `exit` or `quit` to end the session.
> ruboty add job "* * * * *" ruboty ping
Job 6690 created
> ruboty list jobs
 6690: (active) "* * * * *" ruboty ping
> pong
```

再現のために使ったterminal.appではさすがに同様の現象は発生しなかったが、slack.appでは容易に発生する上に気がつきづらいので注意されたい。
Billing Alertを設定して、クラウド死を防ごう！


従量課金のクラウドサービスを使う場合、クラウド死しないかドキドキしますよね！
クラウド死を予防するために、GCPには [Billing Alert] (https://support.google.com/cloud/answer/6293540?hl=en&ref_topic=6288636) の機能があります。

Billing Alertを設定しておくと、予め設定した閾値の50%, 90%, 100%を超えた時点で、メールを送ってきてくれます。
課金はリソースを追加する度にリアルタイムで発生するので、短い期間で大量の課金が発生した場合は、防ぎきれないかもしれませんが、リソースを消し忘れて1ヶ月放置していて、月末の請求で気付くというのは、Billing Alertを設定すれば、だいぶ無くなると思います。

# 設定の仕方 

Billing AlertはBilling Account毎に設定するので、https://console.cloud.google.com/billing にアクセスして、設定したいBilling Accountを選択します。

後は、左側のメニューから、アラートを選んで、閾値を設定すればOKです。

<img width="959" alt="billing-alert.png" src="https://qiita-image-store.s3.amazonaws.com/0/15640/e27cc47e-1d37-bb4f-502b-5b9aeaa3c0a8.png">

# アラート

閾値の50%, 90%, 100%を超えた時は、Billing AccountのPermissionを持っているユーザにメールが飛んできます。
メールが飛んで来るだけで、Bilingを止めたりはしません。
メールを受け取った後、どうするかはユーザに任されています。

From : CloudPlatform-noreply@google.com
Title : Google Cloud Platform/APIs Billing Alert - 100% of Threshold Exceeded
Body :

<img width="600" alt="alert-mail.png" src="https://qiita-image-store.s3.amazonaws.com/0/15640/d5933a11-227a-3cc2-be4a-a9b98f21ebc5.png">

# 最後に

Billing Accountには複数のGCP Projectをぶらさげることができます。
Billing AlertはBilling Accountごとの課金額で計算されるので、複数のGCP Projectの合算額でのアラートとなります。
そのため、特別監視しておきたいGCP Projectがある場合は、専用のBilling Accountを作成して、Billing Alertを設定しておくのも良いかもしれませんね。

# 余談

Billing AccountにぶらさげることができるGCP Projectの数はデフォルトでは10個までです。
増やしたい場合は https://support.google.com/code/contact/billing_quota_increase?hl=en からRequestを送ります。
Google Cloud Storageで適当にファイルを公開する方法

Web Siteにのせるアイコンの画像なんかを適当に[Google Cloud Storage](https://cloud.google.com/storage/) (以下GCS)で公開する方法について

料金は無料ではないので、無料が良い場合は別の方法をおすすめします。

# Step 0 Google Cloud Platform Projectの作成

[無料トライアル](https://cloud.google.com/free-trial/?hl=ja) 辺りから適当にGCP Projectを作りましょう。

# Step 1 Bucketを作る

* GCP ProjectのメニューからStorageを選択
* バケットの作成を選択

## Bucket名

* ファイル公開時のURLに含まれるので、公開されて良い名前かつDNSの命名規則に従う必要がある。
* GCS全体でUniqueである必要がある。

## Bucket Class

* Standard を選択する

## Locale

* Asia を選択する

# Step 2 Bucketの中にファイルをUploadする

ブラウザ上でUploadする or gsutilを利用してUploadする

gsutil example

```
gsutil cp arcanine.png gs://hoge/sinmetal.png
```

# Step 3 ObjectのACLを変更する

一般公開をぽちっと押すと公開状態になる

gsutil example

```
gsutil acl ch -u AllUsers:R gs://hoge/sinmetal.png
```

# Step 4 Cache Control Headerの調整

デフォルトでEdge Cacheにキャッシュされるようになっているので、そのExpireを調整する

# Option

ファイルUpload, キャッシュヘッダーの設定, ACLの設定まで、一発でやるコマンドは以下

```
gsutil -h "Cache-Control: public,max-age=60" cp -a public-read arcanine.png gs://hoge/sinmetal.png
```
git logコマンドでコミット履歴のリスト化

Qiita初投稿です。
（至らない点があると思いますがご了承ください）

gitはいろいろなコマンドがありますが、コミット履歴を見たい場合は、git logコマンドを使います。

今のコミット状態を見ることができるので、開発状況を確認したり、リリースの準備にあたりチェックしたりと、開発チームをマネジメントする側としては便利なコマンドです。


# コミット履歴を一覧で見る

普通に
`git log`
と打つと、コミット毎に詳細内容が表示されます。

ただ、詳細内容はいいから、ざっとリストで見たい場合もあると思います。

例えば、

* コミットログを一覧で見たい
* コミットした日付を出したい
* マージリクエストは出したくない
* コミット者を出したい
* コミットのハッシュを出したい

というような場合、以下のコマンドを流すと

`git log --date=short --no-merges --pretty=format:"%cd  %s %h (@%cn) "`


↓こんな感じで出力されます

```
2015-12-02  Fix 2f6c43f (@tanto1)
2015-12-02  Fix xxxxx validation about check quantity 2c8a1c6 (@tanto1)
2015-11-30  Fix xxxxx spec b855e37 (@tanto2)
2015-11-30  Add xxxxx by xxxx b2b7e7e (@tanto2)
2015-11-26  ●●処理で、○○日時が今月だった場合は△△にしない e0a39d3 (@tanto3)
2015-11-26  Fix xxxxx calculation d976968 (@tanto1)
2015-11-26  fixed b9e46c2 (@tanto3)
2015-11-25  Fix create xxxxx 6837d88 (@tanto1)
2015-11-25  Change private method to public method 02c63c4 (@tanto1)
2015-11-25  ●●の場合、xxxxは作成しない 2fc54ca (@tanto3)
・・・
```

もちろん、gitlabやgithubなどのWEB画面からコミット履歴は一覧で見れるのですが、気軽にさくっと見れるのが、コマンドベースのいいところです。
また、オプションのつけ方によって、自分の見やすいようにアレンジすることもできます。

```
--date=short     ： 日付をYYYY-MM-DDで表示
--no-merges      ： マージリクエストを除く
--pretty=format  ： 表示フォーマットを指定できる（%cd：日付、%s：件名、%h：ハッシュ（短縮版）、%cn：コミットユーザ）
-n               ： 表示件数を指定。10件なら -n 10 と指定。
```

他にもいろいろあります。
`--graph` でコミットの関係性を表示できたり、色を付けたりもできるのですが、まだそこまで使いこなせてません。。


# ブランチやタグ間でのコミットの差異を一覧で見るには

「masterブランチと●●ブランチのコミットの差異は？」
「前回リリース時のタグと今回リリース予定のタグ間で、コミットの差異はどうなってる？」

っていうときがあります。


新旧のブランチがあって、新がどれだけ進んでいるかを見たい場合、後ろにブランチ名を旧..新で並べます。（ブランチはタグでもOK）
`git log --pretty=format:"%cd %h %cn %s” {旧ブランチ}..{新ブランチ}`

 
単純に２つのブランチ間の差異を見る場合は点３つです。
`git log --pretty=format:"%cd %h %cn %s” {ブランチ１}...{ブランチ２}`


あと、以下のようにブランチを指定すれば、ローカルとリモートとの差異コミットを見ることができます。

* ローカルが進んでいるコミット
`git log --pretty=format:"%cd %h %cn %s" origin/master..master`

* リモートが進んでいるコミット
`git log --pretty=format:"%cd %h %cn %s" master..origin/master`


git logには他にも便利なオプションがたくさんありますので、引き続き模索していきたいと思ってます。
rsyslogのimjournalモジュールで$imjournalRatelimitBurstに設定出来る値のメモ

# rsyslogのimjournalモジュールで$imjournalRatelimitBurstに設定出来る値のメモ
rsyslogでのjournal経由のログの出力制限によってログが出力されなくなることを防止するために
デフォルト値よりかなり大きめに出力制限をかけることにしました。
詳細な経緯は[こちら](http://qiita.com/kitaji0306/items/34efc0efd91e849c0fe9)を参照


## 設定出来る値の範囲について
特にドキュメント等は見当たらなかったのですが、検証した結果まぁ数字的に成程って感じでしたが**65535**が最大値でした。
だた、それを超えた値を設定しても特にエラーなどは発生せず**65536で割った余り**の値となります。
※上記のせいで、何度も設定変更をすることになった。。。


## 感想
rsyslogの該当モジュールのソースなども公開されているので、cが読めればそっちから解読でもよかったんですが
法則が分かればいいと思って検証して、50000、60000で正常に制限値として動作し、70000で制限値がおかしなことになった（かなり減った）ところで
2^16 ＝ 65536 がなんとなく想像できたので思ったより早く気付けてよかった。
ただ、制限を超えたら最大値として判定してほしかったな。。。
ほんとは怖いパスワード



こんにちは！
社会人になってから肩こりと体重の急増になやんでいるえりにゃんですヾ(*´∀`*)ﾉ♪
セキュリティ業界でSEをやっております。

今日は「dots girls Advent Calendar 2015」の10日目を担当します。
ネタは、エンジニアならば誰もが避けては通れない「パスワード管理」について語ります。

#脆弱なパスワード使ってませんか？
![image-10.jpg](https://qiita-image-store.s3.amazonaws.com/0/102081/274b7e21-1c07-900e-0399-135d7f05fbe4.jpeg)

画像出典元：IPA 独立行政法人　情報処理推進機構
https://www.ipa.go.jp/security/keihatsu/munekyun-pw/

突然ですが、あなたはどんなパスワードを使ってますか？

。。。。えっ！？

英数字のみ？？

大文字記号なし？

複数サイトで使い回し？？

![image-03.jpg](https://qiita-image-store.s3.amazonaws.com/0/102081/78ea5caa-b796-2fbc-7d13-a98b2cab1f65.jpeg)


#パスワードの安全性を確認してみましょう！
そんなわけで、脆弱なパスワードをつかう危険性について考えてまいりましょう～。

環境はローカルのサーバにたててます。
攻撃にはkaliLinux(攻撃用ツールがセットされたLinuxディストリビューション)をつかいます〜！

##John the Ripperの紹介
今回はkaliLinuxにセットされているパスワードクラッキングツールをつかいます。

※caution!!
本ソフトは、脆弱なパスワードの有無を確認し、運用改善をはかるためのツールです。
外部に対して悪用した場合、不正アクセス禁止法にて罰せられますので、決してやらないでください。

##John the Ripperを使ってみる

今回は３つのアカウントを用意してみました。
　１．笑うほど脆弱なパスワード
　２．ありがちパスワード（キーワード＋誕生日）
　３．強固なパスワード

それでは、レッツハック！

##１．笑うほど脆弱なパスワード編
手始めに、パスワード「password」という大変頭の悪そうなパスワードで試します。
John the Ripperには、解析方法によって３つのモードがあります。
今回はあらかじめ登録された「辞書リスト」をもとにこじ開けるモードを使います。
![SnapCrab_NoName_2015-12-10_0-23-52_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/102081/c4963306-3cba-d743-f73e-8c0ad078166b.png)
待つこと・・・・**1秒でした＼(^o^)／**

![SnapCrab_NoName_2015-12-10_0-25-50_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/102081/c7a36fb1-7034-25e9-9a8b-f78a3d47e86c.png)

次！

##２．ありがちパスワード編（キーワード＋誕生日）
これは意外といるんじゃないかなぁ？　ドキドキ。
では、やってみましょ～～　**えいや！**

![SnapCrab_NoName_2015-12-10_0-29-8_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/102081/3b161c04-a980-affc-a57a-dddc52af26fe.png)

なんと、、、待つこと、**わずか13秒？！！？！！！**
予想以上の速さでした！こえ～～～

ちなみにパスワードは　**apple1210**　でした。
キーワード＋誕生日って、ちょっとやりがちですよねｗ

最後！

##３．強固なパスワード編
辞書モードだとおそらくできないので、ブルートフォースモードにしました。
※ スイマセンあまり詳細なロジックについて分かってないのですが、
　 とにかく１文字ずつ変えて、あらゆる文字記号の組み合わせを試していく。。。らしい。。。

これは解けそうにないので、今日は解析させながら寝ますｗ
ではおやすみなさい～～　(つ∀-)

～結果～

朝7時現在、まだ解析が続いておりまする。
夜1時くらいから開始したので、6時間は超えてますね。

ちなみにパスワードはテスト２を少し文字って、
「@Pple12!O」でした(ﾉﾟ∀ﾟ)ﾉｗ


#まとめ
いかがでしたでしょうか？
「ドキッ」とした方、この機会にぜひ、見直してみてくださいね！

パスワード作りのポイントは、
**大文字英数字記号を含む、8文字以上で、使いまわさない！**
ですよ♪
![image-14.jpg](https://qiita-image-store.s3.amazonaws.com/0/102081/55029004-0a2e-0009-a39c-6da2ab21cf65.jpeg)

##おまけ
本日もdots女子部が開催されておりますヾ(*´∀`*)ﾉ
　- dots.女子部勉強会 vol.4 デザインハンズオン～まずは名刺デザインから（初心者向け）～
　- http://eventdots.jp/event/575332

辻原咲紀さん（デザイナー）をお呼びして、名刺デザインハンズオンをするという
なんとも女子らしい企画ですｗ
名刺作って配りまくるぞう～～

ではでは、楽しんできまっす(*´∀`*)ﾉｼ♪
チームでBack Channelingをつかってみた

この記事は [TIS Engineer Advent Calender 2015](http://qiita.com/advent-calendar/2015/tis) 10日目の記事です。

# 1. はじめに
最近、チームにチャットベースのコミュニケーションツールを導入してみたので、その話をします。
具体的には、[Back Channeling](https://github.com/kawasima/back-channeling) をオンプレミスな環境（自社運用のチーム用VPN環境）に導入しました。
導入してから２週間くらいなので、効果や活用の度合いはまだ見守り中といったところなのですが、導入方法や使い方を紹介したいと思います。

# 2. チームのコミュニケーション・情報共有
自分のチームでは、普段の連絡にはメールを、情報共有にはWikiを（Red Mineを使っています）という自分の周りではよく見かける環境です。

これで何が困るということは無いのかもしれませんが、LINE等のメッセンジャーやチャットでコミュニケーションするのが当たり前になっている現在、メールを書くのは面倒だし、ちょっとしたTipsやノウハウならWikiに書くまでもないなーと思って、自分の胸にしまいっぱなしになることが多々あります。

近年では、業務でチャットサービスやコミュニケーションツールを導入する例は増えてきていると思います。
ただし、会社の諸事情でパブリックなサービスは使いにくいとか、運用ルールを敷いてキッチリ管理するとか、ビジネスプランが、、、となると、それらを乗り越えて導入するのというのはなかなか大変です。

なので、今回は社内のイントラネット内で使えるものを選びました。
Slackクローン風の[Let's Chat](http://sdelements.github.io/lets-chat/) 、[DevHub](http://dev-hub.herokuapp.com/) など、候補はいろいろありましたが、さっと導入できて、機能がシンプルな [Back Channeling](https://github.com/kawasima/back-channeling)  にしました。

# 3. Back Channeling の導入
[こちらの記事](http://qiita.com/kawasima/items/38801d924af963498081)にある通り、実際に動かすまでとても簡単です。

今チームで使っている社内VPSからは、インターネットにアクセス出来ない設計になっているので、
git clone や curl を使ってダウンロードすることが出来ません。

今回は、自分のローカルPC(Windows)にVagrantでCentOS環境を作り、そこで動く状態まで整備して、生成されたファイル郡をまるごとVPSへ転送することにしました。
その後は、VPS上でファイアウォールでポートを開くのと、サービス化するための起動スクリプトを書いています。（このあたりは環境によります）

あと、チームのユーザ向けにログイン方法や簡単な使い方をWikiに書いておきました。
※IEなど一部のブラウザでは正常に動作しないことがあったので、一番問題のなかった Chromeをチーム内で推奨してます。

# 4. 使い方
使い方やルールは特に決めずに使っていますが、実際にこんな使い方をしているよ、というのを紹介します。

### __Tips を投稿する__
仕事に活かせそうなTipsをポストします。
もともと、せっかくエンジニアが集まって仕事をしているので、使っている言語やフレームワーク、開発環境などのTipsを気軽に伝えることができるとよいと思っていたのですが、メールやWikiだと面倒でした。
Back Channeling はスレッド形式なのでトピックごとにある程度まとめられるのでよいです。

チームのメンバーはビギナーからベテランまでスキルレベルはわりと広いので、基本的なコーディング作法やIDEの使い方でもわりと需要があります。 世の中には会社で作るノウハウ集やコーディング規約より優れたまとめ記事がたくさんあるので、チームとしてまとめ切れない事をカバーしていけるといいです。

### __ライブレビュー__
チームのコードレビューは、コミット内容を確認して、修正したいことや確認したいことをひとつずつExcelのセルに埋めていくスタイルです。
レビューしている最中でもいろいろ他の仕事が割り込んできて、終わるまで時間がかかることも多いのですが、気づいたその場で伝えたい場合や、みんなに同じ修正をお願いしたいことがあったので、レビューをライブでやってみることにしました。

Back Channeling で ”レビュー中” スレッドを作って、リアルタイムに結果をポストしていきます。 
Markdownで書けて、コードもシンタックスハイライトしてくれるのでExcelのセルに書くより読む気になります。その場でディスカッションできるのが良いですし、第３者も観戦しやすいのでレビューの波及効果が期待できます。
また、今までのコードレビューではなかった Good Job 的なことも書けるのが良いです。

### __トラブル__
日々コードをコミットしていると、ある日突然動かなくなったりすることがあります。そういうエマージェンシーな事態が発生したときには、当事者で全力調査＆解決します。 後で他の人にも伝える必要がありますが、そういう時に個別に伝えるのは大変です。
場合にもよりますが、Wikiに対応策を書いたりメールしたためたりする程でもないことも多いので Back Channeling があると共有しやすいです。

# 5. おわりに
実はいままで、仕事ではあまり使ってこなかったチャットでしたが、使ってみるとやっぱり便利です。
Back Channeling は [ChatOps 的なこともできそう](http://qiita.com/tenten0213/items/23443b6d5ecbb0293060)なので、使い方を広げて行けるといいと思っています。

みなさんのチームにも、それぞれのやり方があると思います、ぜひ教えてください。
Squeak Smalltalkでクラスを短めの式で生成する

Smalltalk ではクラスを生成するときも、将来のスーパークラスに対するメッセージ送信で行ないます。

```
Object subclass: #Foo
   instanceVariableNames: 'instVar1 instVar2'
   classVariableNames: 'ClassVar1 ClassVar2'
   poolDictionaries: 'PoolVarDict'
   category: 'Category-Name'
```

</br>
メッセージングを徹底しているし、伝統的な式でもあるのでこれはこれで嫌いではないのですが、いかんせん長い。クラスブラウザでならともかく、ちょっとしたコードをワークスペースでスクリプトっぽく書き捨てにしたいときや動きを説明したいときに面倒です。

そんなとき、Ruby などのクラス定義（class Foo; end）や、同じ Smalltalk でも Pharo や GNU Smalltalk にある

```
Object subclass: #Foo
```

とシンプルに済ませられるのはいいなぁ…と思うわけです。もちろん、Class に

<blockquote>Class >> <b>subclass:</b><font color="#000000"> </font><font color="#00007F">name</font><font color="#000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7F0000">^</font><font color="#000000"> </font><font color="#7F0000">self</font><font color="#000000"> </font><font color="#00007F">subclass:</font><font color="#000000"> </font><font color="#00007F">name</font><font color="#000000"> </font><font color="#00007F">instanceVariableNames:</font><font color="#000000"> </font><font color="#7F007F">''</font><font color="#000000"> </font><font color="#00007F">classVariableNames:</font><font color="#000000"> </font><font color="#7F007F">''</font><font color="#000000"> </font><font color="#00007F">poolDictionaries:</font><font color="#000000"> </font><font color="#7F007F">''</font><font color="#000000"> </font><font color="#00007F">category:</font><font color="#000000"> </font><font color="#7F007F">'Unclassified'</font><font color="#000000"> </font></blockquote>

などと当該メソッドを追加しておけばそれでおしまいなのですが、なんか負けた気がするので（←意味不明）、そこは余計なメソッドがゴマンとある Squeak 、組み込みのメソッドの組み合わせで、少なくとも冒頭のよりは短くクラスを生成するのに使えるメソッドはないものかと探してみました。

</br>
結果、Class>>#newSubclass というよさげなのを見つけました。これはレシーバークラス名に“1”をつけた新しいサブクラスを生成するメソッドです。

```
Object newSubclass  "=> Object1"
```

</br>
生成するクラスの名前くらいは自由につけたいのでどうにかならないものかとさらに探すと Class>>#rename: というのがあったのでなんとかこれとの組み合わせで目的は達成できそうです。

```
Object newSubclass rename: #Foo  "=> Foo "
```

 #subclass: のシンプルさには負けますが、読み下してもなんとか意味は通じますし、現状の組み込みのメソッドだけでいけるのは面倒がなくていい感じですね。

</br>
引き続きインスタンス変数を定義（追加）したければ、こんなふうに書けます。

```
Object newSubclass rename: #Foo; addInstVarName: 'bar baz'
```

</br>
悪ノリして、アクセッサーも自動生成（Ruby でいうところの Module#attr_accessor 的な作業）してみましょう。

```
| Foo |
Foo := Object newSubclass rename: #Foo; addInstVarName: 'bar baz'; yourself.
Browser new setClass: Foo selector: nil; createInstVarAccessors.
Foo new bar: #something; bar  "=> #something"
```

</br>
なんだかよくわかんなくなっちゃいましたね。てへぺろ。

教訓： Smalltalk では素直にクラスブラウザを使うべきです。
技術英語 > It's just all happening so fast! / That's fast becoming the thing of the past. / stand the test of time

@ Star Trek Voyager > ELOGIUM

事態が急展開する中Neelixが

> It's just all happening so fast!

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

> That's fast becoming <font color=red>the thing of the past</font>.

ソースは失念。

a thing of the past
だったかもしれない。

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

http://eow.alc.co.jp/search?q=stand+the+test+of+time&ref=sa
> stand the test of time
> 時の試練に耐える、時間をかけて証明されている、長続きする
UICollectionView で初期表示を好きな位置から始める

UICollectionView の初期表示位置を好きなポジションからスタートする。 UICollectionView でやったけど、恐らく UITableView などでも同様の方法でいけると思う。

```swift
override func viewWillAppear(animated: Bool) {
    _collectionView.scrollToItemAtIndexPath(NSIndexPath(forItem: 80, inSection: 0), atScrollPosition: .Top, animated: false)
}
```

``- scrollToItemAtIndexPath:atScrollPosition:animated:`` を使うのだけど使う場所がポイントでこの例では ``viewWillAppear`` で使用している。


最初は ``viewDidLoad`` で実行していたけど、全然動作せずしばらくはまっていた。
stackoverflow で何度か検索して[Start UICollectionView at certain index](http://stackoverflow.com/questions/14678244/start-uicollectionview-at-certain-index) の回答のコメントで解決。

>Unfortunately, depending on how you create your views your UICollectionView may not be setup by viewDidLoad, setting the indexPath is a safer bet in viewWillAppear 

どこで実行すれば良いのかという質問に対して上記の返答だったのけど、CollectionView の作り方によるということで、viewDidLoadで設定されてなければ viewWillAppear でやるのが確実という回答だった。

自分の場合は viewDidLoad の中でプログラマティカルに collectionView を作っていたので、存在はしているはずなんだけど何故ダメだったのかよく分からない。カスタムキーボードで配置していたのでそれが原因かもしれない。