OmniAICreator/Qiita-1.07M huggingface dataset:
CoreOS でも tcpdump したい (CoreOS toolbox)

CoreOS 上でも tcpdump でネットワークデバッグする話です。

## tcpdump くらいあるやろ

```bash
core@core-01 ~ $ tcpdump
-bash: tcpdump: command not found
```

無いんですよねー

## CoreOS toolbox

https://github.com/coreos/toolbox

CoreOS は OS 本体に何も入ってない（からアプリケーションは Docker コンテナとして動かす）ことで有名ですが、上記のように tcpdump すら入ってないので特に低レイヤーの調査で困ることがあります。それを補助するために、CoreOS が公式に toolbox というのを提供しています。

実際に使ってみましょう。

```bash
core@core-01 ~ $ /usr/bin/toolbox
latest: Pulling from fedora

48ecf305d2cf: Pull complete
ded7cd95e059: Pull complete
fedora:latest: The image you are pulling has been verified. Important: image verification is a tech preview feature and should not be relied on to provide security.

Digest: sha256:49ae2d6d0b51f713a18db1c0da9fb1b5c94e92eb43cd712ba09028161ea22880
Status: Downloaded newer image for fedora:latest
core-fedora-latest
Spawning container core-fedora-latest on /var/lib/toolbox/core-fedora-latest.
Press ^] three times within 1s to kill container.
[root@core-01 ~]#
```

そう、toolbox の正体は Fedora のコンテナなのです！
（`~/.toolboxrc` を書けばベース OS は変えられるようです [[参考](https://github.com/coreos/toolbox#use-a-custom-image)]）

```
[root@core-01 ~]# tcpdump
-bash: tcpdump: command not found
```

しかし tcpdump はここにも入ってません。入れましょう。Fedora なので yum で入ります。

```
[root@core-01 ~]# yum install -y tcpdump
Yum command has been deprecated, redirecting to '/usr/bin/dnf install tcpdump'.
See 'man dnf' and 'man yum2dnf' for more information.
To transfer transaction metadata from yum to DNF, run:
'dnf install python-dnf-plugins-extras-migrate && dnf-2 migrate'

(snip)

Installed:
  libpcap.x86_64 14:1.7.3-1.fc22      tcpdump.x86_64 14:4.7.4-2.fc22

Complete!
```

確認

```
[root@core-01 ~]# tcpdump -s0 -A port 80
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
07:05:16.294511 IP core-01.36947 > 160.16.73.241.http: Flags [S], seq 3568280055, win 29200, options [mss 1460,sackOK,TS val 197800 ecr 0,nop,wscale 7], length 0
E..<._@.@..L
.....I..S.P..........r..>.........
............
07:05:16.774151 IP 160.16.73.241.http > core-01.36947: Flags [S.], seq 64320001, ack 3568280056, win 65535, options [mss 1460], length 0
E..,....@.....I.
```

CoreOS でも tcpdump できました。終わったら `exit` でコンテナから抜けます。
また tcpdump したくなったら `/usr/bin/toolbox` すればコンテナが立ち上がり作業できます。

## おわりに

CoreOS toolbox を使って CoreOS 上で tcpdump する方法を紹介しました。

## REF
- [coreos/toolbox](https://github.com/coreos/toolbox#use-a-custom-image)
- [Install Debugging Tools](https://coreos.com/os/docs/latest/install-debugging-tools.html)
- [docker - CoreOS でシステムメトリクスを収集し、グラフ化する - Qiita](http://qiita.com/mopemope/items/34c07ae37592ae6407cf#3-1)
  - toolbox の正体についてはこちらの記事が詳しいです。
Xcode7にアップグレードした時に出たエラー


### はじめに

---

　Xcode7にアップグレードした時に、大体のコードは勝手にコンバートしてくれたけど、エラーが出た箇所が１つあったので、書いておきます。

### 内容

---

　まずは、元コード。

```swift
myTabBarController?.setViewControllers(myTabs as [AnyObject], animated: false)
```

　このときに出たエラーが、

　Cannot convert value of type '[AnyObject]' to expected argument type '[UIViewController]?'
　だったので、

```swift
myTabBarController?.setViewControllers(myTabs as! [UIViewController], animated: false)
```

　これで直りました。AnyObjectが使えなくなったのかな??

### 警告で気になるけどよくわからないところ

---

```swift
private var window: UIWindow?
```

　警告で、Non-@objc property 'window' cannot satisfy optional requirement of @objc protocol 'UIApplicationDelegate'って出るんだけど、Obj-C使ってないからどういうことかよくわからない。。。

### 終わりに

---

　Stack Overflowには、けっこう対処法書いてあるけど、日本語訳されてるのがまだ少ないから少し大変だった。。

### 参考

---

- [ios - Cannot invoke" 'setViewController' with an argument list of type \[AnyObject\] - Xcode 7 Swift - Stack Overflow](http://stackoverflow.com/questions/31885484/cannot-invoke-setviewcontroller-with-an-argument-list-of-type-anyobject-x)
golangでerrorを型アサーション

# golangでerrorを型アサーション

[error interface](https://golang.org/ref/spec#Errors) を実装してれば型アサーションできるけど、
なんかググっても情報が出てこないので、あんまこういう使い方しないのかな。

```main.go
package main

import (
	"errors"
	"fmt"
)

type BarError struct {
	s string
}

func (e BarError) Error() string {
	return e.s
}

type FooError struct {
	s string
}

func (e FooError) Error() string {
	return e.s
}

func main() {

	some_errors := []error{
		errors.New("this is errors.New"),
		fmt.Errorf("this is %s", "fmt.Errorf"),
		BarError{s: "bar"},
		FooError{s: "foo"},
	}
	for _, err := range some_errors {
		switch t := err.(type) {
		case BarError:
			fmt.Printf("this is BarError: %+v\n", t)
		case FooError:
			fmt.Printf("this is FooError: %+v\n", t)
		default:
			fmt.Printf("%+v\n", t)
		}
	}
}
```
Capistrano3でrails s

ちょっと試したいだけなんよ！scaffoldでさっくり作ってさっくり確認したいだけなんよ！
nginx入れたりとかはしたくないんよ！
せっかくrail serverっていうものがあるんだからすぐできるっしょ！

って思っただけだったのに。。。小さいことに色々ハマった最終形態。まぁ本番運用とかないから。。。

* Rails4
* Capistrano3
* sqlite3

# 流れ
ソースデプロイ ⇒ 既に起動済のrails sプロセスをkill ⇒ 新たにrails s
rails sするとtmp/pids/server.pidにpid記録したファイルが置かれるので、これを利用する。

# deploy.rbの抜粋

```rb
set :rbenv_prefix, "#{fetch(:rbenv_path)}/bin/rbenv exec"

set :pid_file, "tmp/pids/server.pid"
set :port, '3000'

set :linked_dirs, fetch(:linked_dirs, []).push('log', 'tmp/pids', 'tmp/cache', 'tmp/sockets', 'vendor/bundle', 'public/system')
set :linked_files, fetch(:linked_files, []).push('config/database.yml', 'config/secrets.yml')

namespace :deploy do
  desc 'Restart application'
  task :restart do
    on roles(:web) do
      execute "cd #{release_path} && kill -SIGTERM `cat #{fetch(:pid_file)}`" if File.exists?("#{release_path}/#{fetch(:pid_file)}")
      execute "cd #{release_path} && (nohup #{fetch(:rbenv_prefix)} bundle exec rails s -e #{fetch(:rails_env)} --port=#{fetch(:port)} -b 0.0.0.0 &) >& /dev/null"
    end
  end
  after :publishing, :restart
end

```

# 何にハマったか
* rails sコマンド叩くところ
    * within release_path do...とかやってみたけどふつうのコマンドのときは効かないぽ？
    * cd #{release_path}しなくちゃいかんのかーいっ
* nohupのところ
    * ちゃんとnohupしてほしいのにコマンド実行したあと華麗にkillして帰ってくる
    * 最後が`&`だけじゃダメで、` >& /dev/null`じゃないといけなかった。
コンソール上で叩くのとは違うのねー
構造的部分型

今日は構造的部分型について考えます。

↓のような数量を返すQuantityメソッドを有する2つのクラスがあったとします。

```scala
class A() {
    def Quantity(): Int = 3
}

class B() {
    def Quantity(): Int = 5
}
```

Quantityメソッドを使ってそれぞれのクラスの実体から数量を取得することが可能です。

```scala
scala> val qa = new A().Quantity()
qa: Int = 3

scala> val qb = new B().Quantity()
qb: Int = 5
```

複数のAクラスの実体を纏めて処理するのも簡単です。List[A]型の実体に複数のAクラスの実体を格納すれば良いだけです。複数のAクラスの実体のそれぞれの数量の総和を計算するのも簡単です。

```scala
scala> val suma = (as: List[A]) => as.map((a) => a.Quantity()).sum
suma: List[A] => Int = <function1>

scala> val sa = suma(List[A](new A(), new A(), new A()))
sa: Int = 9
```

Bクラスについても全く同様です。

```scala
scala> val sumb = (bs: List[B]) => bs.map((b) => b.Quantity()).sum
sumb: List[B] => Int = <function1>

scala> val sb = sumb(List[B](new B(), new B(), new B()))
sb: Int = 15
```

さて、AクラスもBクラスも数量を返すQuantityメソッドを有します。時には、Aクラスの実体とBクラスの実体の両方が格納されるリストが欲しくなるかもしれません。そして、そのリストに対してsuma関数やsumb関数と同様の処理を行う訳です。

しかし、A型とB型は別の独立した型です。List[A]型のリストにBクラスの実体を格納することはできませんし、逆もまた然りです。どうしましょうか。

ここで構造的部分型の登場です。

```scala
scala> val sum = (xs: List[{ def Quantity(): Int }]) => xs.map((x) => x.Quantity()).sum
warning: there was one feature warning; re-run with -feature for details
sum: List[AnyRef{def Quantity(): Int}] => Int = <function1>

scala> val s = sum(List[{ def Quantity(): Int }](new A(), new A(), new B(), new B(), new B()))
s: Int = 21
```

全く新しい型を作ってしまえということです。その型は（Int型の実体を返す）Quantityメソッドを有する型です。この型とA型やB型は互換性があります。そのため、この型を型引数として取る型のリストにAクラスやBクラスの実体を格納することができます。

この型を表すのに毎回`{ def Quantity(): Int }`と記述しなければならないのは億劫かもしれません。それならば、何人にも型の別名を使うことが許されています。

```scala
scala> type Quantitied = { def Quantity(): Int }
defined type alias Quantitied

scala> val sum = (xs: List[Quantitied]) => xs.map((x) => x.Quantity()).sum
warning: there was one feature warning; re-run with -feature for details
sum: List[Quantitied] => Int = <function1>

scala> val s = sum(List[Quantitied](new A(), new A(), new B(), new B(), new B()))
s: Int = 21
```

これで構造的部分型の使用を妨げるものは何1つないでしょう。

おっと、もう1つ言及しておくべきことがありました。

↓のような数量を返すVolumeメソッドを有するCクラスがあった場合はどうでしょうか？

```scala
class C() {
    def Volume(): Int = 7
}
```

残念ながら、Quantitied型とC型には互換性がありません。CクラスはQuantityメソッドを有しません。しかし、Volumeメソッドは有します。現実的には、名称が違うだけでVolumeメソッドがQuantityメソッドと同一の意味合いを持っていることもあるでしょう。何とかしてC型をQuantitied型に変換できないでしょうか？

そうです、変換すれば良いのです。暗黙の型変換です。

```scala
scala> type Volumed = { def Volume(): Int }
defined type alias Volumed

scala> implicit def VolumedToQuantitied(in: Volumed): Quantitied = new { def Quantity(): Int = in.Volume() }
warning: there were two feature warnings; re-run with -feature for details
VolumedToQuantitied: (in: Volumed)Quantitied

scala> val s = sum(List[Quantitied](new A(), new A(), new B(), new B(), new B(), new C()))
s: Int = 28
```

わぁい構造的部分型ゆみな構造的部分型大好き。
Google Siteのバックアップ(ローカル保存) 2015年版


アプリの back-end 側を担当するにあたり、APIの仕様を手っ取り早くGoogle Siteに作っていたら、iOS側開発の人が中国にいて見れず、ローカルに落とす必要が出てきた件について。

2011年ぐらいに停止したツール（[google-sites-liberation-1.0.4.jar](https://code.google.com/p/google-sites-liberation/downloads/detail?name=google-sites-liberation-1.0.4.jar&can=2&q=))では、エラーが発生する。

Googleの認証が変わったらしく、結局このバージョンでは「invalid user credentials」で使えない。（これを解消しようと半日検索に費やした）

結局、新しいバージョンを個人？で作成している人のツールで、バックアップが取得できることがわかりました。私のように無駄な時間を過ごす人が少しでも減るように…。投稿。


ツール：google-sites-liberation-1.0.6-jar-with-dependencies.jar
Github：[google-sites-liberation](https://github.com/sih4sing5hong5/google-sites-liberation)

Githubの表に貼られているのは1.0.4の画面ショットなので注意。
1.0.6のUIは下記になります。Get a token from browserがあることが重要！！
![スクリーンショット 2015-09-28 14.43.43.png](https://qiita-image-store.s3.amazonaws.com/0/81855/6bc1f542-ab3a-3f00-4a4b-fbfedf6ac743.png)
ISUCON5参戦して撃沈しました

「node.jsの参考実装はありません」
でnoderの私は結構終わったのですが、まぁやれるところまでやってみようと。

- rubyのコードからクエリを眺めてインデックス貼り
- 念のためレンジパーティショニング
- nginxに静的ファイル配信を任せる
- my.cnfの設定変更(しかし反映されていないことが終盤判明…)
- GET"/"がえらい長くておかしいと思ったらアプリがひどい実装だったので変更
→is_friendのオンメモリ化
→is_privateのオンメモリ化
→だけどここで出たFAILを解決できずに終了。/initializeは余裕だったのに。

rubyはngx_mrubyの設定くらいなら書くのですがそこまで突っ込んだ書き方はしてなかったので、殆ど勉強しながらの改造でした。辛かった…
でも楽しくやらせていただきました！また来年！

教訓
「メジャー2言語位はdeepに触れたほうが良い」
重複しない乱数配列(寝起きの発想)

yumetodo氏が、以前書いた[乱数配列生成器](http://qiita.com/AinoMegumi/items/0d183910d51df904f828)の[速度測定結果](http://qiita.com/yumetodo/items/48d77f5d554df84f66f7)を書いてくれたんですが、あまりにも遅いと思い、他にも作れないかなと考えてみました。ただ、寝起きの状態で思いついた方法なので色々お察しだろうなと思ってましたが、案の定お察しの通りでしたｗ
実際これ書いてみたのは目が完全に覚めてからなんですが、寝起きの発想でもやっぱり気にはなったのでとりあえず書いてビルドした次第であります。
すごくメモリに優しくないプログラムです。
正直自分でも呆れてしまってます。

```cpp:source.cpp
#include <iostream>
#include <vector>
#include <algorithm>

auto make_rand_array(const size_t arr_size, int rand_min, int rand_max) {
	if (rand_max < rand_min) std::swap(rand_min, rand_max);
	std::vector<int> arr(rand_max - rand_min + 1);
	int i = rand_min;
	for (auto itr = arr.begin(); itr != arr.end(); ++itr, i++) {
		*itr = i;
	}
	std::random_shuffle(arr.begin(), arr.end());
	if(arr.size() > arr_size) arr.erase(arr.begin() + arr_size, arr.end());
	return arr;
}
```

使用例は以前のと同じです。

以上、ただのお遊びでした。
WordPress 4.3 以降で自動生成されるパスワード、長くない？ （この件をfunctions.phpでなんとかする）

#あらまし
デフォルトで24文字って、長くね？（再発行の場合は16文字）

もちろんパスワードはセキュリティ上、長くて複雑な方がいい。
だが、ITに詳しくないユーザが集まる会員制サイトにて運用するとなると、
「パスワードが長くて覚えられないの」という（かなしい）苦情が来そう。
かといって、コピペを教えるのはアレすぎる。

なので妥協点として短くしてみた。12文字が許容範囲かなぁと思いつつ。
パスワードチェッカーも黄色くならないし。

#functions.phpに追加するコード
```php
 // 各所のパスワードの最大長を変更
function edit_password_length() {
$length = 12; //文字列の長さ
?>
<script type="text/javascript">
  jQuery(function() {
    jQuery('#pass1').attr('data-pw','<?php echo wp_generate_password( $length ); ?>');
  });
</script><?php
}
//管理画面->ユーザ->新規追加
add_action( 'user_new_form', 'edit_password_length' ); 
//管理画面->ユーザ->あなたのプロフィール
add_action( 'show_user_profile', 'edit_password_length' ); 
//パスワード再発行
add_action( 'resetpass_form', 'edit_password_length' ); 
```

##正味な話
jQueryDOM操作に頼る力技。
attrでパスワード文字列を変数に取得して刈り取れば、途中でwp関数に頼らずとも行けるが、パスワードを変数に格納するのはなんか嫌。
パスワード生成周りで便利なフックでもあればなあ……と思ったら結局なかった。
WerckerからHerokuへデプロイする時「Key added to your Heroku account」メールが飛んでくるの回避する

ここの「Adding a deploy pipeline」あたりを参考にし、鍵を作ってHerokuに設定

http://devcenter.wercker.com/quickstarts/deployment/heroku.html

ちなみにkey-nameだけで大丈夫なようです。
gulp実行エラー　Warning: gulp version mismatch の対応

$ gulp update
[10:31:22] Warning: gulp version mismatch:
[10:31:22] Global gulp is 3.9.0
[10:31:22] Local gulp is 3.8.11

$ gulp -v
[10:39:05] CLI version 3.9.0
[10:39:05] Local version 3.8.11

$ npm install gulp@3.9.0 --save
fluentdでsyslog+file_bufferを使うとエラーが出てbuffer_file処理が止まる件の対応方法


長らくはまっていた件の解決法がわかったので、同じような構成の人はあまりいないと思うけど一応シェア。

##概要
nxlogとfluentdを連携(両者をsyslog(任意のTCPポートリッスン)で連携)させて使っていて、かつ初期emitをbuffer_fileにしているようなケースで発生

例えば、下記のような構成

```
webサーバ(nxlog)
↓ TCP
fluentd(syslog)
↓パースしてfileにキューイング
fluentd(buffer_file) 
↓キューイングしたファイルを1秒間隔で書込
Elasticsearch
```

##内容
要約すると、fluentd停止時に残ったbuffer_fileに対してsyslog受信したデータを書きこもうとする時に、起動時にbuffer_fileをフラッシュするので該当ファイルがなくそのプロセスがコケる。。。しばらくはまっていた。

【処理の流れ】
①fluentdの停止時にsyslogポートのリッスンを停止するまではnxogはデータを投げ続ける
②fluentd停止時に、bufferファイルが残った状態になる
③fluentd開始と同時に、bufferのflush(この構成だとElasticsearchへの書込)イベント発生
④同時にsyslog受信も始まりbufferへの書込も開始

この時、③のflush済のbuffer_fileに運悪く書込が走ると、下記のようなエラーが出てそれ以後処理が全てfailする

```
2015-09-25 15:53:11 +0900 [warn]: parse failed No such file or directory @ sys_fail2 - (/var/log/td-agent/buffer/aaa_es..b5208c33e778dc0c0.buffer, /var/log/td-agent/buffer/aaa_es..q5208c33e778dc0c0.buffer)
```

<対応>
buffer pluginの中で下記設定を入れるとプロセス停止時に、キューをflushするのでこの事象は回避出来る。
複数回試して、検証済

```
flush_at_shutdown true
```

上記オプションが、buffer_memoryはデフォルトtrueで、fileはfalseになっているらしいがなぜだろう。。
でも、解決してよかった。

お役に立つ人がいれば。
rubyのブロック構文の使い道・モジュールとかクラスの設定変更用メソッドを用意する

ブロック構文を利用することで、 Rails や RSpec などでおなじみの、次のようなクラスの設定用メソッドなどを作成することができます。

```rb
Hoge.configure do |config|
  config.something = "configured!"
end
```

この記事では、こういうメソッドをどうやって実装すればよいかを２分で説明したいと思います。（割と単純なので２分くらいしかもちません）

基本
----

基本は単純です。

```rb
module Hoge
  class << self
    attr_accessor :something
    
     def configure
       yield self
     end
  end
end

Hoge.configure do |config|
  config.something = "configured!"
end

puts Hoge.something
```

まず、クラス変数と `something` とクラスメソッド `configure` を用意します。
`class << self` はそういうイディオムだと思ってください。
（詳細は長くなるので [Rubyist Magazine - Ruby 初級者のための class << self の話 (または特異クラスとメタクラス)](http://magazine.rubyist.net/?0046-SingletonClassForBeginners) などを閲覧いただけるとありがたいです）

で、自分自身を引数にとって `yield` を呼んでやればおしまいです。
これで、 `Hoge.configure` のブロックパラメータである `config` には `Hoge` 自身が渡されます。


ね、簡単でしょ？

なお、本記事においてここから先はすべて蛇足となります。

設定クラス or 設定モジュールを用意しておく
---

個人的には基本的なやつで十分だと思いますが、設定だけ別のモジュールやクラスに置きたくなることがあるかと思いますが、これも割と単純です。

```rb
module Hoge
  class << self
    def configure
      yield config
    end

    def config
      @config ||= Config.new
    end
  end

  class Config
    attr_accessor :something
  end
end

Hoge.configure do |config|
  config.something = "configured!"
end

puts Hoge.config.something
```

と、このように、 `yield` の引数に設定クラス (or モジュール) のインスタンスを渡してやるだけです。

ブロック以外の形でも設定できるようにしたい！
---

本当にする必要があるのでしょうか？

とりあえず `Kernel.#block_given?` を使えば実現できます。この `Kernel.#block_given?` は現在のメソッド呼び出しにブロックが渡されていれば真を返します。

```rb
module Hoge
  class << self
    attr_accessor :something

    def configure k = nil, v = nil
      if block_given?
        yield self
      elsif !k.nil?
        self.send(k.to_s + "=", v)
      end
    end
  end
end

Hoge.configure do |config|
  config.something = "configure form block"
end

puts Hoge.something

Hoge.configure :something, "configure from method"

puts Hoge.something
```

こんな感じでいかがでしょうか？

あたりまえではありますが、柔軟にすればするほど、できることも実装も複雑になります。

設定をブロック構文によるこの形をサポートしつつ、設定ファイルもサポートしたうえで、コマンドライン引数からもできるようにしたい
---

これをしたのが RSpec です。
ですが、 `RSpec.configure` に限って言えば実装はとても単純です。

```core.rb
def self.configure
  yield configuration if block_given?
end
```
[抜粋したソース](https://github.com/rspec/rspec-core/blob/master/lib/rspec/core.rb#L88) のように、ブロックが渡されていれば `yield` を、そうでなければ単純に無視する形となっています。
Glacier化をしたS3を解凍、ダウンロードするメモ

Glacier化したオブジェクトのダウンロードで失敗しないように個人メモ
※個人のメモなのでみる方は注意、実施の際は自己責任で

# Glacier化したS3をダウンロードする
## 目的
S3のLifeCycleによりGlacier化したオブジェクトをダウンロードする

## 注意事項
Glacierの料金は取り出すファイルのサイズにより決まる
巨大なファイルを大量においている場合は拡張子やファイル名による__絞込を行うこと__
※結構な金額になる可能性が有ります(というかなった)
コマンド流すときはScreen等を張ってから実行する(オブジェクトの数によってはかなり時間かかる為)

## S3の仕様
LifeCycleからGlacierに送ったオブジェクトはGlacierからは見れない
S3ではディレクトリのダウンロードが出来ない
※そもそもディレクトリとかでは無い為
Glacierからの復元は時間がかかる

## Glacierから解凍する

```
例：MyBucketのTargetPathからtxtを含むファイルのみ解凍する(5日間)
# for key in `aws s3api list-objects --bucket MyBucket  --prefix TargetPath --profile ProfileName --output json | jq -r '.Contents[].Key'`| grep txt; do echo $key; aws s3api restore-object --bucket MyBucket --key $key --restore-request '{"Days": 5}' --profile ProfileName;done
```

## ダウンロードを行う

```
例：MyBucketからtxt形式のみをダウンロード
# aws s3 cp s3://MyBucket . --exclude "*" --include "*.txt" --recursive --profile ProfileName
```

### memo
頻繁にダウンロードをするならGlacier化しない方が良い、または必要のあるものだけ分ける
iOS Simulatorが起動しなくて本当にこまった話

iMacを製作用にリプレイスしてもらったはいいけどiOS SimulatorがXCodeをいれた直後から起動せずに困りました。

シュミレータの設定をリセットするとか、
シュミレータファイルを削除するとか、
関連ファイルを削除してrestartするとか、
いろいろ試しましたがどれもだめでした。

よくみるのはreinstallでうまくいった、という話なのですが、
今回の場合はOS管理下のファイルに問題があったようで
効果がありませんでした。


最初は誰か同じ目にあっているだろうとググったのですが、
どれも自分のケースには該当しない、もしくは回答がされなくて、
きっと次のアップデートで直るはずと思っていたら、
7になっても状況変わらずで覚悟をきめて調査しました。

なんとか解決したので共有します。

## 環境

MacOS 10.10.5
Xcode Version 7.0 (7A220)
Simulator Version 9.0 (SimulatorApp-620 CoreSimulator-179)

## 現象

シュミレータを起動すると以下のようなメッセージが表示されて起動しない。

Unable to boot the Simulator.

## 原因

```
/private/tmp
```
の権限に問題がありました。

社内システムの人が最初にセキュリティ関連のアプリケーションをいれていたのでその過程でおかしくなったようです。


## 原因解析にいたった経緯

メッセージはとても汎用的なもので原因は無数にあるので、
ログから調査。

以下のようなコマンドでみれます。
今回学習したのですがエラーメッセージはけこう手抜きで、
調べるにはまずこれを確認すべきです。

```
tail -f ~/Library/Logs/CoreSimulator/CoreSimulator.log
```

最初にみつけたのは下記のようなもの。

```
 <Error>: Error Domain=com.apple.CoreSimulator.SimError Code=159 "Unable to lookup in current state: Shutdown" UserInfo=0x7fcf83668e40 {NSLocalizedDescription=Unable to lookup in current state: Shutdown}
```

Code=159が何なのか調べたのですがみつけられず。
このエラーコード表みたいなのがあればとてもありがたいのですが、
みつけれませんでした。

さらにさかのぼると下記のようなエラー

```
 <Error>: Could not register service com.apple.PowerManagement.control: launch_sim_register_endpoint: 0xfffffecc

 <Error>: Could not register service com.apple.SystemConfiguration.configd_host: launch_sim_register_endpoint: 0xfffffecc

<Error>: Could not register service com.apple.audio.coreaudiod: launch_sim_register_endpoint: 0xfffffecc

 <Error>: Could not register service com.apple.SystemConfiguration.PPPController: launch_sim_register_endpoint: 0xfffffecc
```

こちらを手掛かりに調べるとどうやらtmp領域が問題らしいことがわかったので権限修正を行いました。

```
sudo chmod -R 777 /tmp
```

ひとまず上記のよう対応で。

しかしうまくいかず。

ここで諦めてしばらく放置していたのですが、
やはり我慢ならず他に関連しそうなディレクトリを調べたところ

```
sudo chmod -R 777 /private/tmp
```

としたら起動するようになりました。

どうやらシュミレータは起動前にprivate以下のtmpディレクトリを参照するようです。

もし上記のディレクトリが存在しない場合は作成してください。
存在しなくても同じエラーがおきます。

私の場合は、ディスクユーティリティのアクセス権限の修復ををやっても効果がありませんでした。

（いろいろ触っていたせいもあるかもしれませんが。）

ちなみに同様の原因でvirtualBoxも起動しませんでした。
DOCTYPEしないとjQueryがwindowとdocumentを混同する件

他にも同様のエントリーがあるかもしれないけど、ちょっと詰まった

表題そのままですが、DOCTYPE宣言して無いHTML上でjQueryを使うとき、documentとwindowを同じものとして扱ってしまうようです。

###具体例

```
$(window).height()
```

```
$(document).height()
```

この二つの結果が同じになってしまうわけです。

なので、画面の高さによってなにか変えたい場合や、わざと画面幅よりも大きくサイトを作って、jsで表示する箇所を変化させるようなものを作りたいときに、うまくいかない。

###解決策

DOCTYPEを宣言する。


今回はテストで適当なHTML作って動作チェックして試して発覚したのですが、
（リテラシの低い）一般人がコピペで使うようなコードやサービスでは気をつけたいなぁとおもった次第でした。
UEFIのブート項目からUbuntuを削除する

Windows8.1の管理者権限コマンドプロンプトを使ってUEFIでブートしていたUbuntuの削除のやり方をまとめます。

#BCDEditコマンドで削除
BCDEditコマンドを使ってUEFIにあるUbuntuのブート項目を削除します。

ブート項目にUbuntuがあることを確認します。
`$ bcdedit /enum firmware`


ブート項目情報をファイルに書き出します。
`$ bcdedit /enum firmware >  bcdedit.txt`


書き出したファイルからUbuntuのidをコピーしてブート項目を削除します。
`$ bcdedit /delete {id}`

削除されていることを確認します。
`$ bcdedit /enum firmware`

しかし、再起動後、UEFIのブート項目を確認するとUbuntuのブート項目が復活してしまいました。
調べてみると、どうやらEFIフォルダ内のUbuntuフォルダを削除する必要があるとのこと。
ということで、Windows8.1の管理者権限コマンドプロンプトで次の手順を行います。

#EFIシステムパーティションから削除
EFIシステムパーティションのディスクを選択する。（人によってディスク番号やボリューム番号等、環境が異なる場合があります。）
`$ diskpart`
`$ list disk`
`$ sel disk 0`

EFIシステムパーティションのディスクにドライブ文字を割り当て、終了します。
`$ assign letter=D:`
`$ exit`

EFIシステムパーティションのディスクのEFIフォルダに移動します。
`$ cd /d D:`
`$ cd EFI`

ubuntuフォルダがあることを確認します。
`$ dir`

ubuntuフォルダを削除します。
`$ rmdir /S ubuntu`


これで、UEFIのブート項目からUbuntuの項目がなくなりました。
Payaraをsystemdに起動登録する

JavaアプリケーションサーバであるPayaraを、CentOS7上で自動起動するために、systemdに登録しました。

正規の登録方法が分からなかったため、payara.serviceファイルを作成し手動で登録しています。

.serviceファイルの書き方も分からなかったので、調べつつトライアンドエラーです。


```ini:/usr/lib/systemd/system/payara.service
[Unit]
Description=payara server
After=syslog.target network.target remote-fs.target

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=PAYARA_HOME/bin/asadmin start-domain domain1
ExecReload=PAYARA_HOME/bin/asadmin restart-domain domain1
ExecStop=PAYARA_HOME/bin/asadmin stop-domain domain1
TimeoutStartSec=300
TimeoutStopSec=30
User=payara
Group=payara

[Install]
WantedBy=multi-user.target
```

PAYARA_HOME domain1 はそれぞれ適宜読み替え

Type=simple に設定すると、二重起動のようになってしまうため、Type=oneshot としています。

```text:起動後status
[root@localhost home]# systemctl status payara
payara.service - payara server
   Loaded: loaded (/usr/lib/systemd/system/payara.service; enabled)
   Active: active (exited) since Mon 2015-09-28 11:19:48 JST; 20min ago
  Process: 830 ExecStart=PAYARA_HOME/bin/asadmin start-domain domain1 (code=exited, status=0/SUCCESS)
 Main PID: 830 (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/payara.service
           └─1985 JAVA_HOME/bin/java -cp PAYARA_HOME/glassfish/modules/glassfish.jar -XX:+UnlockDiagnosticVMOptions -XX:NewRatio=2 -...

Sep 28 11:19:15 localhost.localdomain systemd[1]: Starting payara server...
Sep 28 11:19:47 localhost.localdomain asadmin[830]: Waiting for domain1 to start .............................
Sep 28 11:19:47 localhost.localdomain asadmin[830]: Successfully started the domain : domain1
Sep 28 11:19:47 localhost.localdomain asadmin[830]: domain  Location: PAYARA_HOME/glassfish/domains/domain1
Sep 28 11:19:47 localhost.localdomain asadmin[830]: Log File: PAYARA_HOME/glassfish/domains/domain1/logs/server.log
Sep 28 11:19:47 localhost.localdomain asadmin[830]: Admin Port: 4848
Sep 28 11:19:47 localhost.localdomain asadmin[830]: Command start-domain executed successfully.
Sep 28 11:19:48 localhost.localdomain systemd[1]: Started payara server.
```

---

参考

- [【Glassfish】CentOS7.0へGlasssfish4.1インストール](http://tigertaizo.hatenablog.com/entry/2015/02/12/124707)
- [Gitit を systemd のサービスとして起動する](http://blog.tanitanin.net/?p=762)
- [ Systemd入門(4) - serviceタイプUnitの設定ファイル](http://enakai00.hatenablog.com/entry/20130917/1379374797)
- [「Systemd」を理解する ーシステム管理編ー](http://equj65.net/tech/systemd-manage/)
- [Linux女子部　systemd徹底入門](http://www.slideshare.net/enakai/linux-27872553)
LaravelでAjax通信時に生成済みのViewを返す

Ajax通信時にjava scriptでDOMを構築するのは、~~めんどくさい~~手間がかかる上に、ソースがややわかりづらくなってしまい気味なので、laravelで生成済みのViewを返してjQueryで差し込むだけにしてしまおうというお話。

といっても、そう難しい話ではなく、Ajaxのレスポンスを生成する際に、RenderしたViewをjson_encodeして返してあげるだけ。

```
return json_encode(
　　'view' => view::make('hoge', [
　　　　'hoge' => $hoge
　　　　'fuga' => $fuga
　　)->render()
);
```
ポイントは、encode時に->render()してあげること。

配列で複数のViewを返すこともできるので、複数個所のhtmlを同時に書き換えることも可能。

```
return json_encode(
　　'view1' => view::make('hoge1', [
　　　　'hoge1' => $hoge1
　　　　'fuga1' => $fuga1
　　)->render(),
　　'view2' => view::make('hoge2', [
　　　　'hoge2' => $hoge2
　　　　'fuga2' => $fuga2
　　)->render()
);
```
Viewを入れたjsonを返す時は通常のjsonよりも通信量が多くなるため、Viewの内容によって使い分ける。
headerを残したままsortするには



タイトルのママですが、headerを残して、その他の行をsortしたい場合はよくあると思います。NGS解析では、bedファイルやsamファイルでしょうか。headerファイルを別のファイルに分けておいて、ソートしたファイルに、後から足すなどすればすむ話ですが是非ワンライナーでやりたいとおもいました。


**データ**

```test.bed
Chr	Start	End	ID	Score	Strand
chrM	13676	13771	SRR891268.4	42	+
chr17	25777774	25777825	SRR891268.7	40	-
chrM	6370	6436	SRR891268.28	42	+
chr6	120122843	120122904	SRR891268.38	42	+
chr4	109520697	109520774	SRR891268.51	42	+
chr17	4046420	4046472	SRR891268.52	42	-
chrM	12742	12824	SRR891268.56	25	+
chrM	10183	10234	SRR891268.58	42	+
chr18	57454680	57454760	SRR891268.62	42	+
chrM	9780	9838	SRR891268.72	25	+
```

**テクニック**

> (): 括弧内のコマンド実行を別プロセスで行う。今回はこれを利用して、&&で結んだ２つの実行結果をパイプで食わせる

> -n: head, tailのオプションで出力情報を上からもしくは下からの行数で指定できる。 -1を加えるとheadの場合は最後の行を省く。tailの場合は、最後の行だけが表示される（headの場合と反対になるので注意）。

この２つを使うとsortが実現できる。

```
(head -n +1 test.bed && tail -n +2 test.bed | sort -k1,1 -k2,2n) > test.sort.bed
```

出力はいわずもがななので省略（というか捨ててしまった。。）
xcodeにてApp Transport Security（ATS）除外のドメインを複数設定する

「aaa.co.jp」と、「bbb.com」というドメインをATS除外にするとします。（余裕あったら後で動画gif上げます。）

概要はこちらが分かりやすかったです。
http://dev.classmethod.jp/smartphone/iphone/ios-9-intro-ats/

*手順*
1.プロジェクトのplistを選択して、どこでもよいので、Key項目の「+」ボタンを押して、「NSAppTransportSecurity」と打ち込みKeyを追加します。
2.上記で追加した「NSAppTransportSecurity」のTypeを「Dictionary」をする。
3.NSAppTransportSecurity配下に更にkeyを追加します。「+」ボタンで「NSExceptionDomains」Keyを追加。
4.「NSExceptionDomains」のTypeを「Dictionary」をする。
5.「NSExceptionDomains」配下に更にkeyを追加します。「+」ボタンで「aaa.co.jp」Keyを追加。
6.「aaa.co.jp」のTypeを「Dictionary」をする。
7.「aaa.co.jp」配下に更にkeyを追加します。「+」ボタンで「NSExceptionAllowsInsecureHTTPLoads」Keyを追加。
8.「NSExceptionAllowsInsecureHTTPLoads」のTypeを「Boolean」にして、Valueを「YES」。
9.5~8の作業を「bbb.com」で再び作成。

*結果*
できたPlist（Proberty List）版が下記。
![スクリーンショット 0027-09-28 10.33.35.gif](https://qiita-image-store.s3.amazonaws.com/0/41011/ede1a891-2401-78af-3771-f2820014782a.gif)


ソースコード部分は下記です。

```xml:xxx.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>CFBundleName</key>
	<string>${PRODUCT_NAME}</string>
	<key>CFBundleIcons~ipad</key>
	<dict/>
（…他の設定…）
	<key>NSAppTransportSecurity</key>
	<dict>
		<key>NSExceptionDomains</key>
		<dict>
			<key>aaa.co.jp</key>
			<dict>
				<key>NSExceptionAllowsInsecureHTTPLoads</key>
				<true/>
			</dict>
			<key>bbb.com</key>
			<dict>
				<key>NSExceptionAllowsInsecureHTTPLoads</key>
				<true/>
			</dict>
		</dict>
	</dict>
（…他の設定…）
</dict>
</plist>

```
Rubyのコードを高速にするためのメモ


注意: 指標にはなりますが**場合によってはパフォーマンスが異なったり挙動が変わったりコードの可読性にも影響する**のでちゃんとパフォーマンスを見ながら、テストしながら書きましょう。

# 参考
https://github.com/JuanitoFatas/fast-ruby
https://speakerdeck.com/sferik/writing-fast-ruby

# メモ

- Arrayの数を数えるなら```Array#size```もしくは```Array#length```（```Enumerable#count```を使うより速い）
- Arrayの検索には```Array#find```もしくは```Array#detect```（```Array#select.first```より速い）
- Arrayのランダム取得には```Array#sample```（```Array#shuffle.first```より速い）
- Arrayの最初の要素の取得は```Array#[0]```（```Array#first```より速い）
- Arrayの最後の要素の取得は```Array#[-1]```（```Array#last```より速い）
- Arrayの繰り返しは```Array#each```（```for```より速い）
- Arrayを処理したものをflatするなら```Array#flat_map```（```Array#map.flatten```より速い）
- Arrayを逆からeachするなら```Array#reverse_each```（```Array#reverse.each```より速い）
- Enumerableの並び替えは```Enumerable#sort_by```（単純な```Enumerable#sort```より速い）
- mapには```Symbol.to_proc```(```map(&:to_s)```)（```map { |s| s.to_s }```より速い）
- Procをcallするなら```yield```（引数に```&block```をとってcallするより速い）
- Hashのfetchには```Hash#[]```（```Hash#fetch```より速い）
- Hashの複製には```Hash#[]```（```Hash#dup```より速い）
- Hashのkeyを繰り返し処理するなら```Hash#each_key```（```Hash.keys.each```より速い）
- Hashに追加するなら```Hash#[]=```（```Hash.merge!```は遅いし```Hash.merge```はもっと遅い）
- 文字列の結合には```'foo' 'bar'```（```'foo'+'bar'```より速い）
- 文字列の開始と終端を調べるには```String#start_with?```や```String#end_with?```（正規表現の方が遅い）
- 文字列の正規表現には```String#=~```（```String#match```より速い）
- 文字列の置き換えにはtr（```String#gsub```より速い）
- 文字列の置き換えにはさらに```String#[sub_string]=```での置き換えが高速
- attr_accessorがsetter、getterを自分で定義するより速い
- 範囲に入っているかを調べるなら```Range#cover?```（```Range.include?```は遅い）
- 定義されてないメソッド呼び出し確認には```respond_to?```（```begin...rescue```で処理させると遅い）
- メソッドは直接```call```する（```method_missing```を使うとすごく遅いし、```send```も少し遅い）

他にも高速化の手法を発見したら随時追記していきたいと思います。こういう方法もあるよ等大歓迎です。
ESLintのAPIの素晴らしさ


[ESLint](http://eslint.org/)は最近勢いがある、JavaScriptのLinterです。

# 要するに
[JSHint](http://jshint.com/)のAPIへの悲しみ、それらが一通り解決されている[ESLint](http://eslint.org/)への感謝です。

# JSHint APIの謎

JSHintをNode.jsプログラム中から使うための[API](http://jshint.com/docs/api/)の話です。

## サンプルコード
```js
var source = [
  'function goo() {}',
  'foo = 3;'
];
var options = {
  undef: true
};
var predef = {
  foo: false
};

JSHINT(source, options, predef);

console.log(JSHINT.data());
```

## 戻り値がない

JSHINT関数の結果は戻り値で取得できません。
なぜか結果を状態で持ちます。
つまり並列実行可能かどうかは実装を見て確認しないといけません。

## 複数回実行した結果を積算しない
結果を戻り値で返さないなら複数回JSHINT関数を実行した場合に、結果を積み上げていくのでしょうか？
必要なシチュエーションは思いつきませんが、APIとしては妥当そうです。

実際はそんなことはありません。
[サンプルコード](http://t.co/TRhOsi3aKM)

## エラー結果から対応するルールがわからない

codeという人間に優しくない参考情報は出ますが、ルールそのものの名前は出ません。

エラーが大量に出るルールを無効にして、緩めのルールからLintを使い始めたい気持ちがあります。
その需要に直接的な参考情報を返すことができません。

```js
[
    {
      id: '(error)',
      raw: 'Read only.',
      code: 'W020',
      evidence: 'foo = 3;',
      line: 2,
      character: 1,
      scope: '(main)',
      a: undefined,
      b: undefined,
      c: undefined,
      d: undefined,
      reason: 'Read only.'
    }
  ]
```

外部ドキュメントがあれば、まだいいのですが・・・なさそうです。
ソースコード上にcodeに対応する[メッセージ一覧](https://github.com/jshint/jshint/blob/master/src/messages.js)はあります。

## 定義済み変数の指定がオブジェクト
```js
var predef = {
  foo: false
};
```

値にfalse以外を指定することがあるのでしょうか？
複数指定する場合に配列にしたくあります。

```js
predef = ['_', 'alert', 'toastr', 'self', 'jsPlumb', 'Promise']
  .reduce((a, b) => {
    a[b] = true
    return a
  }, {})
```

# ESLintの素晴らしさ

以上の背景を踏まえた上でESLintの[APIドキュメント](http://eslint.org/docs/developer-guide/nodejs-api)を読みます。

## 結果が戻り値で帰ってきます

```js
var linter = require("eslint").linter;

var messages = linter.verify("var foo;", {
    rules: {
        semi: 2
    }
}, "foo.js");
```

:+1:

## 結果にruleIdが含まれています
```js
{
    fatal: false,
    severity: 2,
    ruleId: "semi",
    severity: 2,
    line: 1,
    column: 23,
    message: "Expected a semicolon.",
    fix: {
        range: [1, 15],
        text: ";"
    }
}
```

:+1:

## 定義済み変数は配列で指定します

    An array of global variables to declare (default: empty array). 

:+1:    
    
# 感想
早くJSHintからESLintに移行したくあります。
ただ、安易な気持ちでESLintをコマンドライン実行したら

```
✖ 1352 problems (1352 errors, 0 warnings)
```

と出てきて心が折れそうです！
Google Play Service 7.8のまとめ


#Play Serviceとは

書こうと思ったけど省略。見に来てる方ならもう知ってますよね…。
https://developers.google.com/android/guides/overview

#新機能紹介

##Mobile Vision API

画像や動画に関するAPIが追加されました。中でも、

###Face API

画像や、現在カメラで取られているリアルタイムな動画の中でも、顔を検知するAPIです。顔を検知するだけではなく、顔の特徴も検知出来ます。
また、顔画像はカメラにまっすぐ向いている必要はなく、いろいろなアングルでも検知できるようです。
顔を検知すると、例えば、目、頬、口、鼻や耳たぶの位置などの、顔の特徴点を取得し、追い続けます。また、例えば、目が空いているか閉じているか、どのぐらい笑っているかなども検知できます。

###Barcode API

1次元や2次元のバーコードを読み取るAPIがついに公式で出ました。

##GCMの拡充

GCM([Google Cloud Messaging](https://developers.google.com/cloud-messaging/))の機能もパワーアップしたようです。

###ローカライズ対応

デバイスのlocaleを検知して、それに対応したメッセージを出すことができるようになりました。
詳しいパラメータは[こちら](https://developers.google.com/cloud-messaging/http-server-ref)で参照できます。

##Nearby

Nearby Mesasgeは位置情報に基づいて近接するデバイスやビーコンと通信をするためのAPIです。例えば何かのコンテンツを周囲にブロードキャストしたい場合、投票を行いたい場合など、ローカルでコラボレーションを行うとき、リッチなアプリを作成することが可能のようです。
このAPIは、Bluetooth, WiFi, 不可聴の音を使用してデータのやり取り、デバイスの発見をおこないようです。
また、これはAndroidだけではなく、iOSでも使用可能で、iOS, Android間でも通信が可能のようです。しかもpodも使える！
詳しくは[ここ](https://developers.google.com/nearby/)から参照できます。

#参考文献

[DevByte: Google Play services 7.8 (100 Days of Google Dev)](https://www.youtube.com/watch?v=nZjY_DPO1qs)
Magnus Hyttstenさんのプレゼンはいつも面白いです。
[空気砲でTシャツを飛ばしたりされてます。](https://youtu.be/o1od_3vR9fI?t=3m17s)
コンテナクラスの初期化



C++11から、コンテナクラスの初期化ができる

map好きな自分用メモ（mapにmapを入れた場合の書き方）


```cpp:a.cpp


#include <stdio.h>

#include <string>
#include <map>

int main( int , char ** ) {
	
	std::map< std::string, std::map< std::string, std::string > > data = 
	{ 
		{ "key1", 
			{ 
				{ "key1_1", "a" }, 
				{ "key1_2", "b" }, 
			} 
		}, 
		{ "key2", 
			{ 
				{ "key2_1", "c" }, 
				{ "key2_2", "d" }, 
			} 
		}, 
	};
	
	for( auto &i: data ) {
		
		printf( "%s\n", i.first.c_str() );
		
		for( auto &o: i.second ) {
			
			printf( "\t%s=%s\n", o.first.c_str(), o.second.c_str() );
			
		}
		
	}
	
	return( 0 );
	
}


```

<pre>
[todanano@localhost tmp]$ ./a.out
key1
        key1_1=a
        key1_2=b
key2
        key2_1=c
        key2_2=d
[todanano@localhost tmp]$
</pre>
githubのapiをたたく、あるいはjqの使い方メモ

# 準備

- [GithubのAccessToken](https://github.com/settings/tokens)を用意する
- coreutils を入れる
    - Macの場合は`brew install coreutils`
- moreutils を入れる
    - Macの場合は`brew install moreutils`
    - `vipe`つかいたいだけ

# ぶったたく
```sh
GITHUB_USER=mystelynx
GITHUB_API_TOKEN=xxx
GITHUB_REPO=git/git

curl -s -u "$GITHUB_USER:$GITHUB_API_TOKEN" \
https://api.github.com/repos/$GITHUB_REPO/pulls\?state\=all | jq -r \
".[] | 
 {title:.title, url:.html_url, updated_at:((.closed_at // .updated_at)|fromdate), created_at:(.created_at|fromdate), user: .user.login} | 
 select(.updated_at >= `gdate --date '2015-09-01' +%s`) | 
 [.title, .url, .user, ((.updated_at - .created_at)/60/60)] |
 @tsv" \
| vipe | pbcopy
```

対象リポジトリのプルリクを取得し、jqでごにょごにょやった結果が`vipe`で確認でき、最終的にクリップボードにコピーされます。

あとは、対象の期間を変更するとか、`select(...`でフィルタを追加したり(**自分の**プルリクのみにする、とか)、取得したい項目を増減させて欲しい項目をとってくるようにすればよい。

## jqメモ

- `fromdate`で日時の文字列をUNIX時間に変換できる
- `select`で絞り込み
- `@tsv`で配列をタブ区切りにして出力
    - 配列しかダメ
- `//`演算子で、javascriptで言うところの`var x = y || z`みたいなことができる
      
```
echo '{"a": 1, "b": 2}'| jq "@tsv"
jq: error (at <stdin>:1): object ({"a":1,"b":2}) cannot be tsv-formatted, only array
```
gopherjs + electron テスト

# gopherjs + electron テスト

## 概要

go言語ソースからJSコードを生成する[gopherjs](https://github.com/gopherjs/gopherjs)で[electron](https://github.com/atom/electron)を利用するテストサンプル。

## ソース
[github.com/sntulix/gopherjs-electron](https://github.com/sntulix/gopherjs-electron)

## 準備

```
npm -g install electron-prebuilt
npm init -y
go get -u github.com/gopherjs/gopherjs
```

## ビルド、実行

```
gopherjs build index.go
electron .
```

![画面サンプル](https://i.gyazo.com/bf447dc4b7be0339c828d9aecce08af1.png)
Mac で wma を mp3 に変換

# iTuneで.wmaのファイルが読み込めなかった

調べると、Switchというアプリをダウンロードして変換すれば良いということがわかった。

しかし、無料分だと、一度に5件しか変換できないという欠点があった。

ということで、自分でプログラムを作ったので、そのメモ。


## 手順
0. brewのインストール、pythonのインストール
   brewが必要です。
   pythonも必要です。
1. ffmpegのインストール

```
brew install ffmpeg
```

2. 変換プログラムの作成

```py
#!/usr/bin/env python
# -*- coding:utf-8 -*-

import os
import fnmatch
from subprocess import call

matches = []
for root, dirnames, filenames in os.walk('./'):
    for filename in fnmatch.filter(filenames,'*.wma'):
        matches.append(os.path.join(os.path.abspath(root), filename))

for match in matches:
    message = "convert {0} to {1}".format(match, match.replace('.wma', '.mp3'))
    before = match.decode('utf-8')
    after = before.replace('.wma', '.mp3')
    print message
    if os.path.exists(after):
        print 'This file is already converted.'
    else:
        call(u'ffmpeg -i "{0}" "{1}"'.format(before, after), shell=True)
```

3. 実行

いつでも実行できるようにする

```
chmod +x wma2mp3.py
mv wma2mp3.py /usr/bin/
```

変換したいファイルがあるディレクトリで以下のコマンドを実行

```
wma2mp3.py
```
技術英語 > ..., if you would like some. > a little + 物質名詞 の言い換え

引用: 冠詞マスター教本 by 石井隆之さん

> littleの注意すべき語法
`<a little + 物質名詞>`の意味を言い換える場合は one ではなく、 some を用いる
o : There is a little wine in the kitchen, if you would like some.
x : There is a little wine in the kitchen, if you would like one.


物質名詞のように境界がはっきりしないものに対しては、oneでなくsomeを使うということなのだろう。
噂のGraphvizを使ってみる


#概要
(筆者の中で)最近話題のGraphvizを使ってディレクトリ構造をグラフ化してみようと思います。このGraphvizですが、言語ではなく、 **DOT言語**というグラフ記述言語のスクリプト群のようです。Graphvizを使うと簡単に複雑なグラフが作れちゃいます。
##Install
何はともあれ、まずはインストールしてみましょう。ここではHomebrewを使ってインストールしますが、各OS用のインストーラーを使ってもインストール出来ます。
``$ brew install graphviz``
インストーラーはコチラから:[http://www.graphviz.org/Download.php](http://www.graphviz.org/Download.php "Graphviz")
##使い方
graphvizではdotファイルを使います。まずはvimなどのエディタで以下のように記述。

```Sample.dot
// 1行コメント
/*
複数行のコメントの場合は/* */で囲む
*/
graph g{
	"Hello World"
	}
```
``$ open Sample.dot``とすると,こんな感じでプレビューが表示されます。![qiita.out.jpg](https://qiita-image-store.s3.amazonaws.com/0/83976/19689171-5fa8-1f5f-8fad-49d712b218ee.jpeg "Sample.jpg")
  
**(注意)dotファイルはWORDに関連付けされている場合があります。この場合の対処法は調べましたが筆者には見つけられませんでした(・_・;)
何か良い方法をご存じの方はコメントから教えていただけると幸いです。**
##dotファイルを書き出す
dotファイルを書き出すにはdotコマンドを使います。
``$ dot -T <拡張子> Sample.dot -o Sample.out.<拡張子>``
<拡張子>の部分には、変換したい拡張子を入れてください。変換できる拡張子は

* pdf
* png
* jpg
* svg

です。
##線を引く
複数のノードを作成して、線や矢印で繋いでみます。
###線で繋ぐ場合
言葉(単語)と言葉を、--で繋ぐと線を引く命令になります。

```dotファイル
//線でつなげる
graph g{
	"地球" -- "日本" -- "北海道";
}
```
![qiita.out.jpg](https://qiita-image-store.s3.amazonaws.com/0/83976/c7eac722-631d-ddeb-66cf-7d1a289cea18.jpeg "qiita.out.jpg")
###矢印で繋ぐ場合

```dotファイル
//向きをつけるときはdigraph
digraph g{
	"地球" -> "日本" -> "北海道";
}
```
または

```dotファイル
digraph g{
	"地球" -> "日本"
	"日本" -> "北海道"
}
```
![qiita3.out.jpg](https://qiita-image-store.s3.amazonaws.com/0/83976/65f0c224-83c5-c01b-2a7a-af6d3db26f7d.jpeg "qiita3.out.jpg")

##ノードの形とラベル
ノードの形の変更とラベル付けの仕方は以下のように記述すれば出来ます。

```dotファイル
digraph g{
	//ノードの形変更
	
	//ノードを四角に変更
	"地球"[shape=box];
	//六角形に変更
	"日本"[shape=hexagon];
	//二重丸に変更
	"北海道"[shape=doublecircle];
	//ラベル付
	"地球" -> "日本"[label=国名];
	"日本" -> "北海道"[label=地方名];
}
```
##まとめ
基本的な使い方を書きましたが、Graphvizはまだまだ色々なグラフが書けます。気になった方はGoogle先生に聞いてみてください。(笑)
最後に今回紹介した基本+αでサクッと作ったMacの階層構造のグラフ画像です。![sample.out.jpg](https://qiita-image-store.s3.amazonaws.com/0/83976/061e697d-6da7-2fe4-6ccb-1461750eb0bb.jpeg "sample.out.jpg")
vim-mode-plus をつくった

[vim-mode-plus](https://atom.io/packages/vim-mode-plus)

新機能も色々あるし、色々チュートリアルとか書きたいけど、２ヶ月ぶっ通しでやっていて、やっとキリついた。
つかれた。ドキュメント書くパワーが今はない。

# どういう流れでか？

* 2ヶ月前に、リファクタリングを色々実験しようと思い、オフィシャルの vim-mode を fork.
* 色々やっているうちに、随分リファクタリングが進む。コードの殆ど(90%位)をアグレッシブに書き換え
* 新機能がつけやすくなったので色々つけた。
* またコードが雑多になったのでリファクタリング

というのような事を繰り返して、こうなった。
２ヶ月間、誰からのフィードバックもなく、ぶっ通しでやっていた。
フィードバックが欲しくなったのと、ある程度は仕上がってきたのでリリースした。。

# なぜオフィシャルの vim-mode に contoribute しない？

コードが変わりすぎてPRを一つ一つ出すのも大変なのと、説明しきれない。
また、ターンアラウンドタイムもすごくかかる。
今、オフィシャルの vim-mode はアクティブではないので、今回の様な大きな試みは難しい。
まずはリリースして、ユーザーからフィードバックを得てみたい。

もちろん、大部分の機能、コンセプト、テスト等、既存の vim-mode の成果の上に乗っかってやっています。
それ無しでは、全く何にも出来ませんでした。本当です。
重複しない乱数配列(Java版／O(n)アルゴリズム）：解説

[こちらの記事](http://qiita.com/nmby/items/6a5f6dccebda85acfeb7)で、重複値なしの乱数配列を計算量 O(n) で生成する java コードを紹介しました。
本稿では、そのアルゴリズムについて解説します。

# はじめに
プログラムの処理速度を考えるとき、ともすると利用するコマンドの選択ばかりに目を向けてしまいがちです。

* 配列と ArrayList ではどちらが何割速くなるのか？
* for ループと iterator では速さは変わるのか？？
* 外部メソッド化ではなくインラインコーディングを選択すべきか？ etc、etc...

それも一つの考慮点ではありますが（しかし大した差異は出ません）、より重要なのは適切なアルゴリズムを選択することです。

例えば 1,000,000 件の key+value データの中から目的のものを検索することを考えます。

* プログラミングを始めたばかりの初心者は、ループ処理で全データをサーチするかもしれません。このとき、計算量は O(n) になります。
* データ保持形式を工夫し二分木探索を採用することにより、計算量を O(logn) に減らすことができます。
* さらに、ハッシュテーブルを利用することにより、O(1) つまり定数時間オーダーでの検索が可能となります。

選択するアルゴリズムによって、データ量が増えるにつれ10倍、100倍、ときに1,000倍かそれ以上というオーダーで差異が発生します。[^1]
問題の解決方法を定式化するスペシャリストたるプログラマとしては、適切なアルゴリズムを選択するための目を培っておきたいものです。（私も弱いんですけどね。トホホ...）

# 解説
さて、本題です。次の問題について考えます。
　　問題：『11～20 の 10 個の数字から 5 個をランダムに並べた配列を得る』

#### **手順0：変数の準備**
予め、結果を格納する配列と、作業用の配列を用意します。作業用の配列には候補の値を順に格納しておきます。

    result : [  ][  ][  ][  ][  ]
    work   : [11][12][13][14][15][16][17][18][19][20]

#### **手順1：1個目の値の選択**
1回目の乱数選択として、0～9 の範囲の乱数を生成します。
つまり、得たい値の範囲 11～20 で乱数を生成するのではなく、work 配列のインデックスの範囲で乱数を生成します。

2 が得られたとしましょう。
work[2] == 13 が選択されたものとして、結果の 1 つ目に保存します。
そして、work[2] == 13 は一度選択されお役御免ですので、work 末尾の work[9] == 20 と入れ替えてうしろへ追いやってしまいます。

    result : [13][  ][  ][  ][  ]
    work   : [11][12][20][14][15][16][17][18][19][13]

#### **手順2：2個目の値の選択**
さて、次に2回目の乱数選択です。
今度は 0～9 ではなく、一つ少ない 0～8 の範囲で乱数を生成します。
というのは、末尾の work[9] == 13 はすでに選択済みであり用無しですから。

5 が得られたとしましょう。
work[5] == 16 が選択されたものとして、結果の 2 つ目に保存します。
そして、work[5] == 16 は一度選択されお役御免ですので、今回の範囲の work 末尾である work[8] == 19 と入れ替えてうしろへ追いやってしまいます。

    result : [13][16][  ][  ][  ]
    work   : [11][12][20][14][15][19][17][18][16][13]

以上の手順を繰り返すことで、求める配列を得ることができます。
繰り返す回数は、求める配列の長さである 5 回で十分です。

# もう一工夫
さて、上記は穏やかな例でしたが、次のような場合はどうでしょうか。
　　問題：『1～1,000,000 の百万個の数字から 3 個をランダムに並べた配列を得る』

    result : [ ][ ][ ]
    work   : [1][2][3][4][5] .. [999_998][999_999][1_000_000]

これではあまりに無駄が大きすぎます。
work のメモリ領域が無駄であるばかりでなく、work の初期化のために、計算量が result のサイズではなく work のサイズに依存してしまいます。

これを回避するために、[『重複しない乱数配列(Java版／O(n)アルゴリズム）』](http://qiita.com/nmby/items/6a5f6dccebda85acfeb7)で紹介したコードでは work 配列の代わりに HashMap を利用し、必要になったデータだけを保持するようにしています。

# orz
ここまで書いたところで、このアルゴリズムに『Fisher-Yates法』という立派な名前がついていることを知りました。基本的なアルゴリズム、デザインパターンなどはちゃんと知っておかないとダメっすね... orz
[分かり易く解説されているWebサイトへのリンク](http://ppp-lab.sakura.ne.jp/ProgrammingPlacePlus/algorithm/other/002.html) を貼っておきます。

# 最後に
しっかりとしたアルゴリズムに基づくコードは美しく、読みやすいものです。
アルゴリズムはプログラミング言語の種別を超えた汎用的なものです。
プログラマの基本道具・共通言語として、ポケットにたくさん詰め込んでおきたいものです。

# 注釈
[^1]: まぁ今のご時世、百万件くらいまでであれば、ベタな O(n) アルゴリズムでも実用上は困らないかもしれません。1000件くらいまでであればベタループが最も速いかもしれません。しかしそれを選ぶとしても、他の様々な可能性（アルゴリズム）を理解したうえで選択したいものです。
[Swift] わからない言葉をとことん調べて基礎を積み上げる 「関数、イニシャライザ」

#関数の引数に既定値を指定
決まった値が指定されている引数がある時に既に数値を入れてしまうこと。

〜特徴〜
同時にinoutの指定はできない。
関数の引数に既定値を指定する場合仮引数名(内部引数名)が自動的に外部引数名になる。
自動的に内部引数名=外部引数名となっているため「#」を指定することはできない。
既定値の数値を変更する時以外は呼び出す時に省略可能。


##構造体
構造体は値型のデータ。代入や関数の呼び出しの際、つまり、データの実態がコピーされて、新しいインスタンスが渡される。構造体のデータの実態は常にプログラム内のどこか一箇所から参照されているだけ。複数箇所から同じ実態を参照する必要のあるデータ構造やプログラムの構成要素を作る目的にはクラスを使う。
/////////クラスについては後ほど

1.既定イニシャライザ
構造体の定義自体にプロパティの全ての初期値が与えられているもの。

例
```txt:code
struct Time {
    var Hour = 7  //プロパティとはこの変数のこと
    var Minutes = 30
    var Second = 57
}  //初期値(プロパティ)が全て引数とされることなく与えられている。
```

2.イニシャライザ
構造体のインスタンス生成の際、初期化のために使用する手続きのこと。イニシャライザは構造体ごとに定義可能。
イニシャライザは値を返さない関数のような形で構造体の内部に定義するが、funcや関数名は書かず、initを記述してイニシャライザであることを明示。
StoryboardやXibファイルからインスタンスを生成するprotocol


```Swift
protocol InstantiateFromNibable {
    typealias Instance
    static func instantiateFromNib() -> Instance
}
```

SlideShareの [swift-style-guide](https://github.com/SlideShareInc/swift-style-guide/blob/master/cocoa_swift_style_guide.md#view-controllers)から着想を得た。すごくシンプルなんだけど使い勝手は良いと思ってます。

Xibファイルなのか、Storyboardのinitialなのか、StoryboardにあるViewControllerなのか、幾つかのパターンでビューをインスタンス化したいケースがあると思いますが、この方法だとそのインターフェイスを統一できます。

久しぶりに使うビューでもとりあえず、`<クラス名>.insta..`など打つとすぐに使えるかどうかがわかります。

具体的に下記のように追加します。

## Xibファイルの場合

LoadingFooterViewにはこのように書く。

```Swift
final class LoadingFooterView: UIView, InstantiateFromNibable {
    static func instantiateFromNib() -> LoadingFooterView {
        return UINib(nibName: "LoadingFooterView", bundle: nil).instantiateWithOwner(nil, options: nil).first as! LoadingFooterView
    }
```

利用する際はこのように書く。

```Swift
let footerView = LoadingFooterView.instantiateFromNib()
```

## Storyboard上のビューの場合

SearchViewControllerにはこのように書く。

```Swift
final class SearchViewController: UIViewController, InstantiateFromNibable {
    static func instantiateFromNib() -> SearchViewController {
        return UIStoryboard(name: "Search", bundle: nil).instantiateViewControllerWithIdentifier("SearchViewController") as! SearchViewController
    }
```

利用する際はこのように書く。

```Swift
let vc = SearchViewController.instantiateFromNib()
```

## 注意すること

注意するというほどでもないのかもしれないのですが、Storyboardやxibからインスタンス化した場合、ビューのサイズはそれぞれのファイルの中で決めたサイズのままです。特に部品的なビューの場合インスタンス化したあとに、適切にAutoLayoutを設定する必要があります。 **[SnapKit](https://github.com/SnapKit)** などを使うと簡単にLayoutをコードで書けるのでオススメです。
LaravelのMigrateでカラムにNULLを許容したり許容しなかったり変更

カラムの変更には事前にdoctrine/dbalが必要なのでインストール

```bash
$ composer require doctrine/dbal
```

テーブル名bookのmigrationを作成

```bash
$ php artisan make:migration --table book change_book_table
Created Migration: 2015_09_28_001116_change_book_table
```

作成されたファイルを編集し、up()にカラムの変更処理と、down()にその変更を取り消す処理を追加します。

```php:2015_09_28_001116_change_book_table.php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class ChangeBookTable extends Migration
{
    public function up()
    {
        Schema::table('book', function (Blueprint $table) {
            // noteカラムにNULLを許容
            $table->text('note')->nullable()->change();
        });
    }

    public function down()
    {
        Schema::table('book', function (Blueprint $table) {
            // 既にテーブルの対象カラムにNULLを登録しているならば必要
            // DB::statement('UPDATE `book` SET `note` = "" WHERE `note` IS NULL');

            // noteカラムにNULLを許容しない
            // 5.5以降？
            $table->text('note')->nullable(false)->change();

            // 5.5以前？
            DB::statement('ALTER TABLE `book` MODIFY `note` TEXT NOT NULL;');
        });
    }
}
```
nullable()でカラムにNULL値を許容し、change()で変更を実行します。
それをNULLを許容しない形にするにはnullableの引数にfalseを記載してあげればいいです。
Laravel 5.5のドキュメントからnullableに値を設定できるような記載が追加されました。
これにより、以前のようなクエリを書かなくて済むようです。

5.5以前で使えない場合、Laravelのスキーマビルダーには存在しないようなのでSQLを直に書いてNULL値を許容しないように変更を加えることになります。
ISUCON5予選でスコア34000を出す方法


## 今回のISUCONについて

Gunosyの@y_matsuwitterです。
今回のISUCONは去年と同様チーム.datとして、

- @y_matsuwitter  => プロセスキャッシュ中心の最終兵器作成
- @TakatoshiMaeda => 予選に向けたツールの用意と司令塔、分析
- @kanny => インフラ周り中心にボトルネック改善

と言う構成で、自分一人Go実装に突っ走るような布陣で望みました。

課題はMixiライクなSNSの実装で、割と色々なJOINが走らざるを得ない、短時間で高速化するには厄介な課題でした。

今回の結果としては日曜一位通過でき、一安心というところです。
また、予選中、両日含め最高スコアの34382を出せました。

## 事前準備

事前に色々と調査とすぐ使える形のサンプルコード書き溜めて置きました。

- Goでのunix domain socketの扱い
- signalの受け取り方
- syncおよびatomicパッケージの使い方
- 効率のいいrouter探し
- Redisライブラリ周り

## 当日
まず基本ですが、

- `runtime.GOMAXPROCS(runtime.NumCPU())`
- 各httpハンドラのレスポンスヘッダを正しく設定する

といった、Go関連の高速化処理を実装しています。

その後、開始後すぐにプロセスキャッシュ中心に持っていく方向で開発を開始しました。

その際立てた方針としては、

- goのオブジェクトのそのままプロセスキャッシュ
- プロセスキャッシュの内容のうち本文データなどサイズの大きいものを除いてgobに変換、ファイルに吐き出して食わせる

ちなみにgobというのはGoのオブジェクトをそのままserializeするためのフォーマットで、詳しくは下記を参照してください。

gob https://golang.org/pkg/encoding/gob/

今回の実装では上記方針にもとづいて、まずは各データをIDでコスト最小で引けるようにもつよう改造を入れていきました。概念的には下記のようなものです。

```
// データを保持するmap
var entries map[int]Entry

// エントリの取得、ただしこれは簡素
func getEntryObj(entryID int) Entry {
	return entries[entryID]
}

// 取得時
entry := getEntryObj(entryID)
```

上記は簡素すぎますが、`sync.RWMutex`等使いながら安全に実装していきます。

その後、各ページの表示形式に合わせて、全てのデータを非正規化、条件に合わせて順序を調整したidのsliceやmap、場合によっては専用の構造体を用意してsliceにもつなど、アプリケーションの挙動を分析してのインデックス的な構造を保持するようにしました。
結果として、各ページのデータ取得はslice等から必要数IDを取得、その後各IDでオブジェクトをgetするような実装に変更、DBアクセスを無くしています。
ちなみにEntryやCommentの文書データのみ、メモリの都合で効率のいいRedisに配置しています。（Goでも効率よく載せることはできますが時間の都合でやっていない）

また、初期データは上記の形式に合わせてオブジェクトを生成、gobに吐き出し、`/initialize`でプロセスキャッシュを洗い替えするような仕組みになっておりまして、大体12秒位で終わるような感じでした。
プロセス停止時はsignalを受け取った段階で各データをgobに吐き出し、初期データと別な場所にdumpしています。
このdumpデータは次回起動時に使うようになっており、データが復旧が完了します。

上記を淡々と実装した結果、スコアは17時頃に34000を超えました。

その他GOGCを弄ったりなどしましたが、こちらはメモリがそもそもカツカツなので実際には使っていません。
最終ベンチでは並列度と同期処理周りに不安が残り、大事を取ってruntime.GOMAXPROCSを1に設定し提出しました。そのためスコアがだいぶmoderateな感じになりましたが、ひとまずそれでも二日目1位通過ですので一安心。

## 苦労したこと
実は初期データのgobを吐いたファイル生成に一番時間を取られています。
非正規化の程度が激しいため、mysqlからのdumpしたtsvデータをgobに変換するのに一回あたり数分~もっと酷いものだと20分ほどかかったため、それが正しい結果を吐くまでに2時間ほど使ってしまいました。
Goで下記のようなsliceの先頭にひたすらオブジェクトを追加する処理を書く際は、不必要に長いsliceにならないよう注意しましょう。負荷が非常に高い処理になります。

```
hoge := []int{}
for _, comment := range comments {
	hoge = append([]int{comment.ID}, hoge...)
}
```

## もっとやれたこと

後やれるとしたら、

- templateを文字列結合に持っていく
- 長文系のデータを圧縮してRedisからGoに持てるようにする
- gorilla/mux => httprouterなどパフォーマンス高いものに変更

など考えていましたが、template以外はそれほど意味ないかなとも思います。

## 最後に

運営の皆さん予選お疲れ様でした！個人的にはベンチマーカーのパフォーマンスの方に驚きました。
本戦でも宜しくお願い致します。
[Netbeans] deploy error

EJBを含んだ warをdeployするときに、以下のようなエラーが発生することがある
[Glassfish Exception during deployment project with Stateful EJB](http://stackoverflow.com/questions/21817809/glassfish-exception-during-deployment-project-with-stateful-ejb)という記事にあるとおり、ホスト名が解決できないことが原因っぽい？

【環境】
- CentOS7 
- JDK1.8.0_60
- glassfish 4.1

【詳細】

エラーログを見るとこんな感じ。
```

   Exception while loading the app : EJB Container initialization error
java.lang.ArrayIndexOutOfBoundsException: 4
        at com.sun.enterprise.util.Utility.longToBytes(Utility.java:234)
```


サーバ再起動するとこんなエラーが出る

```

[XXXX@XXXX glassfish4]# sudo bin/asadmin start-domain
 Bad Network Configuration.  DNS can not resolve the hostname: 
java.net.UnknownHostException: XXXX.XXXX: XXXX.XXXXX: unknown error
Waiting for domain1 to start ........................................................................
Successfully started the domain : domain1
```

解消方法としては、hostnameで出てくる名称を、DNSから引けるようにするか
/etc/hostsに追記するです。

```bash
XXX.XXX.XXX.XXX   XXXXhost
```