OmniAICreator/Qiita-1.07M huggingface dataset:
はじめてターミナルを使ってみるメモ（Cygwin・Windows7）

はじめてターミナルを使ってみよう！ということで、
Cygwin を試してみて難しかったのでメモしたものです。
Windows7 64bit での話です。


# いろいろインストールしよう

## Cygwin を入れる（cmd.exe をレベルアップする）

Cygwinとは「Windowsオペレーティングシステム上で動作するUNIXライクな環境の一つである。」だそうで、ようするに Windows でもターミナルを使いやすくしたりコマンド増やしやすくしたりするためのもの。下記よりインストールする。
https://cygwin.com/install.html
デフォルトで適当にインストールすると一緒に Cygwin64 Terminal（64ビットバージョンの場合）というターミナルがついてくる。これは mitty という名前のターミナルとのこと。何かかわいい。

## apt-cyg を入れる

setup.exe を GUI で使わなくてもアップデートできるようにするため、下記を見ながら apt-cyg をインストール。
http://dqn.sakusakutto.jp/2013/12/64bit_cygwin_apt-cyg.html

## fish を入れる

あと Shell を bash から fish にすると、補完機能がついたり色分けしてくれたりと初心者に優しいらしいとどこかで読んだのでインストール。
早速 `apt-cyg install fish` で。
http://fishshell.com/

## Chocolatelyを入れる

https://chocolatey.org/
ここに書いてあるとおりにcmd.exeにコピペしてインストール。インストール時には「管理者として実行」しないほうがいいらしく、使うときは「管理者として実行」（とQiitaでどなたかが書いてらした気がしますが未確認）。`choco search xxx` で入れたいものさがして `choco install xxxx` でインストール。

# 学んだこといろいろ

* タイトルバーで右クリック → Options → Text → Locale を ja_JP、Character set を UTF-8 にしてOKとしておく
* /cygdrive/c が C:という意味。
* / は C:/cygwin64/ という意味。
* ~ は C:/cygwin64/home/username/ という意味。
* ~ はホームディレクトリ。これを変えたいときは、Cygwin.bat を編集する。これができない場合は、コンパネ→システムとセキュリティ→システム→システムの詳細設定→環境変数→システム環境変数(S)→新規→変数名：HOME、変数値：好きな場所、でも変えることが可能。`echo $HOME` として確認。
* ログインシェルを fish に変更したければ Cygwin.bat の bash を fish に編集したら使える、はずなんだけど使えない。未解決。/etc/shells に /usr/bin/fish も追加したけれどダメでした。 → 調べてみると、どうやらショートカットのプロパティを `C:\cygwin64\bin\mintty.exe -i /Cygwin-Terminal.ico /bin/fish --login` てすればいいみたい。でもなんかやたらと動きが重いのでやめておく。
* 矢印上キーで前に打ったコマンドを表示
* 矢印右キーで次に来るものを補完するものを表示
* /home/username/ 以下にある .bashrc に `alias open='cygstart'` とすると、open xxx で xxx ディレクトリを Explorer で見られたり、ファイルを開けたり、します。ヽ(=´▽`=)ﾉ。

# コマンドいろいろ

| コマンド | 意味 |
|:-----------|:------------|
| cd C:  | Cドライブ直下へ行く。cd は Change Directry の略。 |
| ps | 今つかってるシェル一覧が出る？ |
| Ctrl + D | ターミナルを閉じる、シェルから抜け出す |
| Ctrl + C | 動かしてるプログラムを終了する、今打ってるコマンドをキャンセルする |
| Ctrl + A  | 今打ってるコマンドの先頭へ |
| Ctrl + E  | 今打ってるコマンドの末尾へ |
| pwd | 今いる場所を表示。Positioning Working Directry の略。 |
| ls | 今いる場所にあるディレクトリを表示。List Segments の略。 |
| ls /xxx/sss | ルートディレクトリから/xxx/sss にあるディレクトリを表示 |
| -l | オプション。所有者やパーミッションも見られる |
| -a | オプション。不可視ファイルも見られる |
| help | いろいろなコマンドが見られる |
| touch | ファイルを作れる。touch sample.txt とか。 |
| mkdir | フォルダを作れる。スペース開けると複数作れる。mkdir js css img とか。touchも同様。 |
| mv | mv (ファイル名) (移動する場所)　で、ファイルを移動する。移動する場所にファイル名を足すとファイル名が変更されて移動される。ディレクトリも移動可。 |
| cp | cp (ファイル名) (コピーする場所) で、ファイルをコピーする。コピーする場所にファイル名を足すとファイル名が変更されてコピーされる。 |
| cp | cp -R (ディレクトリ名) (コピー先のディレクトリ名)　で、ディレクトリのコピーもできる。ディレクトリ内のファイルも全部コピーされる。 |
| rm | 消される。初心者は [trash](https://www.npmjs.com/package/trash) というプログラムを入れるか、使わないほうがいい気がする。 |
| * | ファイル名などの指定にはワイルドカードも使える。 |
| cat | ファイルを結合する。cat aa.txt bb.txt > cc.txt とすると、cc.txt 内に aa.txt と bb.txt の内容が結合されている。もともと cc.txt がある場合は中身が消えてしまう。Catenate の略。 |
| cat | cc.txt の中身を消さないで追加するときは cat aa.txt >> cc.txt とすると追加される。 |
| apt-cyg install xxx | xxxのパッケージを追加する |
| apt-cyg list | 追加されているパッケージを表示する |
| apt-cyg list xxx | xxxというパッケージが追加されているか、追加可能なパッケージがあるかを表示する |
| apt-cyg update | setup.ini をアップデート |
スレッドセーフでコールバック中にAdd/Removeしても大丈夫なListener Listのテンプレートクラス

* コールバック前にnumListenersを取得するのでAdd直後に通知が来ない
* コールバック中にindexがずれないように、RemoveはNULLで置き換えるだけにしてコールバック後に一括消去
* vector::iteratorはpush_backしたときに無効化されることがあるのでindexを使ってループする

```cpp:ListenerList.h
#ifndef LISTENERLIST_H_
#define LISTENERLIST_H_

#include <vector>
#include <boost/function.hpp>
#include <boost/thread/mutex.hpp>

template< class Listener >
class ListenerList
{
public:
	inline ListenerList() : mNumActiveNotifications(0), mNeedCleanup(false) {}

	inline void Add(Listener* listener)
	{
		boost::mutex::scoped_lock listenerLock(mListenerMutex);
		typename std::vector<Listener*>::iterator it = std::find(mListeners.begin(), mListeners.end(), listener);
		if (it != mListeners.end()) return;
		mListeners.push_back(listener);
	}

	inline void Remove(Listener* listener)
	{
		boost::mutex::scoped_lock listenerLock(mListenerMutex);
		typename std::vector<Listener*>::iterator it = std::find(mListeners.begin(), mListeners.end(), listener);
		if (it == mListeners.end()) return;
		if (mNumActiveNotifications > 0)
		{
			*it = NULL;
			mNeedCleanup = true;
		}
		else
		{
			mListeners.erase(it);
		}
	}

	inline void Notify(const boost::function<void (Listener*)> callback)
	{
		boost::mutex::scoped_lock listenerLock(mListenerMutex);
		++mNumActiveNotifications;
		const size_t numListeners = mListeners.size();
		for (size_t i = 0; i < numListeners; ++i)
		{
			Listener* listener = mListeners[i];
			if (listener != NULL)
			{
				listenerLock.unlock();
				callback(listener);
				listenerLock.lock();
			}
		}
		--mNumActiveNotifications;
		if (mNumActiveNotifications == 0 && mNeedCleanup)
		{
			mListeners.erase(std::remove(mListeners.begin(), mListeners.end(), (Listener*)NULL),
							 mListeners.end());
			mNeedCleanup = false;
		}
	}

/*
	inline size_t Size()
	{
		boost::mutex::scoped_lock listenerLock(mListenerMutex);
		return mListeners.size();
	}

	inline Listener* operator[](size_t index)
	{
		boost::mutex::scoped_lock listenerLock(mListenerMutex);
		if (index >= mListeners.size()) return NULL;
		return mListeners[index];
	}
*/
private:
	std::vector<Listener*> mListeners;
	int mNumActiveNotifications;
	bool mNeedCleanup;
	boost::mutex mListenerMutex;
};

#endif /* LISTENERLIST_H_ */
```

https://gist.github.com/gokamura/fd2ab5ee104cc6df8b4d
BootstrapでIE8対応[Rails]

# 全体的にスタイルが崩れる

RailsプロジェクトでBootstrapをベースにしてシステムを作ってて、いざIE8で確認したときに悲しいことになっていたので対応したことをメモします。IE8 の場合、html5のタグが無視、media query が無効にされるのが原因だそうです。
ちなみにjQueryも2系を使ってはいけません。jQueryは2系からIE8に対応していないそうです。

BootstrapはIE8に対応してますので以下のようにするとスタイルは直ります。Bootstrap4からはIE8もサポートしないという噂。

```html
<!--[if lt IE 9]>
    <script src="/js/html5shiv.js"></script>
    <script src="/js/respond.js"></script>
<![endif]-->
```

slimで書くと

```slim:application.slim
/[if lt IE 9]
  = javascript_include_tag "bootstrap/html5shiv.min.js"
  = javascript_include_tag "bootstrap/respond.min.js"
```

以下参照
http://getbootstrap.com/getting-started/#template

# placeholderが表示されない

palceholderもhtml5からのものなのでIE8では使用できません。
でも、javascriptで同様なことは実現可能です。今回は手軽にjQueryプラグインの「[jquery.ah-placeholder](https://github.com/ahomu/jquery.ah-placeholder/blob/master/jquery.ah-placeholder.js?locale=ja)」を使用して実現します。


```slim:application.slim
= javascript_include_tag "jquery.ah-placeholder.js"
javascript:
  $(function()
    {
      $('[placeholder]').ahPlaceholder({
        placeholderColor : 'silver',
        placeholderAttr  : 'placeholder',
        likeApple        : false
      });
    });

```

# 参考
Getting started · Bootstrap
http://getbootstrap.com/getting-started/#template

BootstrapのIE8対応 - Qiita
http://qiita.com/kimromi/items/d2f234c90c07f5417a8f

Bootstrap3をIE8で使う時に注意すること - Blog.おにぎりたまごうぃんなー
http://blog.obentoba.co/entry/2013/10/22/bootstrap3-for-ie8

placeholderをIEでも使えるようにするjQueryプラグイン「ah-placeholder.js」 | 株式会社アクトゼロ｜ソーシャルメディアマーケティング・訪日インバウンド施策
http://www.actzero.jp/developer/report-2794.html
ruby 中的 self



copy from:  http://rubylearning.com/satishtalim/ruby_self.html

每当你的程序跑起来的时候,有且只有一个` self`, 它表示当前或者默认的能够访问的对象. 通过下面的描述可以让你看到究竟当前的 `self` 表示那个`对象`.

## 顶层上下文

当你在进入任何其他上下文之前,你就处在顶层的上下文. 如一个类的定义, 所以所谓的顶层,也就是在类或者模块之外的东西, 看看下面的代码:

```ruby

x = 1
```
这个就是你创建了一个顶层的变量.

或者

```ruby
def m
end

```
这个就是你创建了一个顶层的方法,或者就是一个` Object` 的实例方法. (虽然` self` 不是` Object`), 顶层的方法总是私有的, Ruby 给你定义了一个初始化的` self` 作为顶层的对象, 如果你直接在顶层输出` self`的话:

```ruby
puts self
```
你会看到一个` main`, 一个特殊的定义作为顶层`self` 指向的对象,也就是说` main` 类的对象就是` Object`.

## 定义在类或者模块中的` self`

定义在类或者模块中的 self, 它代表的就是当前类和模块.

```ruby
class S
	puts "just a class"
	puts self
	module M
		puts 'just a module'
		puts self
	end
	puts 'back in outer level of S'
	puts self
end
```
执行上面的代码,输出的是:

```ruby
just a class
S
just a module
S::M
back in outer level of S
S
```

## 定义在实例方法中的`self`

当方法被调用的时候, 这个时候` self` 它代表的就是调用它的那个对象了.

```ruby
class S
	def m
		puts 'class s method m'
		puts self
	end
end
s = S.new
s.m

```


输出

```ruby
Class S method m:  
#<S:0x2835908> 
```
这个时候的` self` 就是代表当前的实例

## 定义在单例方法或者类方法中的`self`

单例方法,他是附属于一个特别的对象上的,他只能够被一个对象访问, 当单例方法被调用的时候, `self` 它就是拥有这个方法,看下面:

```ruby

obj = Object.new
def obj.show
	print 'i am an object'
	puts 'here's self inside a singleton method of mine'
	puts self
end
obj.show
print 'an inspecting obj from outside'
puts 'to be sure it's the same object'
puts obj
```
上面的代码输出:

```ruby
I am an object: here's self inside a singleton method of mine: 
#<Object:0x2835688> 
And inspecting obj from outside, to be sure it's the same object:  
#<Object:0x2835688>  
```
这个时候得到的两个对象是同一个.

类方法也是和方才的单例类似,它不过指向的对象是当前的类对象,看下面代码:

```ruby
class S
	def S.x
		puts 'class method of class s'
		puts self
	end
end
S.x
```

输出的就是:

```ruby
Class method of class S  
S  
```

在单例方法中的`self`就是那些拥有私有方法的对象.

 -eof-
Ubuntu 14.04 trustyにVNC環境を構築


## Overview

Ubuntuサーバでデスクトップ環境で作業しVNC接続出来るようにしたい

## Requirements

- Ubuntu 14.04 trusty
- tightvncserver
- gnome

## Installation

- デスクトップ環境のインストール

```bash
sudo apt-get install xorg gnome-core gnome-system-tools gnome-app-install
```

- VNCサーバのインストール

```bash
sudo apt-get install tightvncserver
```

- VNCのpasswordの設定

```bash
vncpasswd
```

- xstartupファイルの修正

`vim ~/.vnc/xstartup`

```
#!/bin/sh

# Uncomment the following two lines for normal desktop:
unset SESSION_MANAGER
# exec /etc/X11/xinit/xinitrc

/usr/bin/ibus-daemon -d

[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources

xsetroot -solid grey
exec gnome-session &
gnome-panel &
gnome-settings-daemon &
metacity &
nautilus -n &
gnome-terminal &
```

- TCP 5901番で起動

```bash
vncserver :1
```

- gnomeのショートカットキーの修正

```
export DISPLAY=:1
gsettings set org.gnome.desktop.wm.keybindings show-desktop "['<Shift><Alt>F1']";
gsettings set org.gnome.desktop.wm.keybindings maximize "['<Primary><Super>Up','<Alt>KP_5']";
gsettings set org.gnome.desktop.wm.keybindings panel-main-menu "['<Alt>F1']";
gsettings set org.gnome.desktop.wm.keybindings minimize "['<Primary><Super>Down','<Alt>F5']";
```

- VNCクライアントで接続

MacならFinder標準のVNCクライアント(Finderメニューから「移動」→「サーバへ接続」-> アドレス欄に「vnc://xxx.xxx.xxx.xxx:5901(5900 + ディスプレイ番号)/」→「接続」)
または[Chicken VNC](http://sourceforge.net/projects/cotvnc/)等で接続出来る

- 終了

```bash
vnserver -kill :1
```
provisioning profileからName/UUIDを抽出する

# やり方

## UUIDの抽出

```bash
$ xmllint <(security cms -D -i your.mobileprovision) --xpath '/plist/dict/key[text()="UUID"]/following-sibling::string[position()=1]/text()'
```

## Nameの抽出

```bash
$ xmllint <(security cms -D -i your.mobileprovision) --xpath '/plist/dict/key[text()="Name"]/following-sibling::string[position()=1]/text()'
```

# 解説

- provisioning profileはそのままだと、plutilコマンドなどでparseできない。
- securityコマンドで一度textに変換する。
- 変換結果は [Process Substitution](http://qiita.com/kawaz/items/98768ba5eea8d6fe6a19) を用いて標準出力からファイルディスクリプタとしてかませる
- xmllintのxpathオプションで対象のKeyの名前のノードの兄弟ノードのテキストを抽出する。
Linuxでプロセスを一括killする方法

こんな感じでSSHで対話式のコマンドを実行して止まった等で、使ってないプロセスが一杯ある場合のプロセスkillの方法。

```
kamatama41 23617  0.0  0.0  56716  3176 ?        Ss    2013   0:00 /usr/bin/ssh -l kamatama41 -t example.com /bin/sh -c "tailf /etc/hosts"
kamatama41 23800  0.0  0.0  56716  3176 ?        Ss    2013   0:00 /usr/bin/ssh -l kamatama41 -t example.com /bin/sh -c "tailf /etc/hosts"
kamatama41 23866  0.0  0.0  56716  3172 ?        Ss    2014   0:00 /usr/bin/ssh -l kamatama41 -t example.com /bin/sh -c "tailf /etc/hosts"
kamatama41 24063  0.0  0.0  56716  3168 ?        Ss    2014   0:00 /usr/bin/ssh -l kamatama41 -t example.com /bin/sh -c "tailf /etc/hosts"
kamatama41 24164  0.0  0.0  56716  3180 ?        Ss    2013   0:00 /usr/bin/ssh -l kamatama41 -t example.com /bin/sh -c "tailf /etc/hosts"
kamatama41 24216  0.0  0.0  56716  3180 ?        Ss    2013   0:00 /usr/bin/ssh -l kamatama41 -t example.com /bin/sh -c "tailf /etc/hosts"
kamatama41 25315  0.0  0.0  56716  3176 ?        Ss    2013   0:00 /usr/bin/ssh -l kamatama41 -t example.com /bin/sh -c "tailf /etc/hosts"
kamatama41 28121  0.0  0.0  56716  3180 ?        Ss    2014   0:00 /usr/bin/ssh -l kamatama41 -t example.com /bin/sh -c "tailf /etc/hosts"
kamatama41 29155  0.0  0.0  56716  3176 ?        Ss    2013   0:00 /usr/bin/ssh -l kamatama41 -t example.com /bin/sh -c "tailf /etc/hosts"
kamatama41 29176  0.0  0.0  56716  3180 ?        Ss    2014   0:00 /usr/bin/ssh -l kamatama41 -t example.com /bin/sh -c "tailf /etc/hosts"
kamatama41 29282  0.0  0.0  56716  3176 ?        Ss    2013   0:00 /usr/bin/ssh -l kamatama41 -t example.com /bin/sh -c "tailf /etc/hosts"
kamatama41 29890  0.0  0.0  56716  3176 ?        Ss    2014   0:00 /usr/bin/ssh -l kamatama41 -t example.com /bin/sh -c "tailf /etc/hosts"
kamatama41 31548  0.0  0.0  57500  3180 ?        Ss    2013   0:00 /usr/bin/ssh -l kamatama41 -t example.com /bin/sh -c "tailf /etc/hosts"
kamatama41 31550  0.0  0.0  56716  3176 ?        Ss    2013   0:00 /usr/bin/ssh -l kamatama41 -t example.com /bin/sh -c "tailf /etc/hosts"
kamatama41 31551  0.0  0.0  56716  3172 ?        Ss    2013   0:00 /usr/bin/ssh -l kamatama41 -t example.com /bin/sh -c "tailf /etc/hosts"
```

## pkillコマンド
を使えば、実行コマンド内容に一致するプロセスを一括killすることが出来ます。

```bash
$ pkill -f 'tailf /etc/hosts'
```
helpの内容はこんな感じ

```bash
$ pkill --help
pkill: invalid option -- -
Usage: pkill [-SIGNAL] [-fvx] [-n|-o] [-P PPIDLIST] [-g PGRPLIST] [-s SIDLIST]
	[-u EUIDLIST] [-U UIDLIST] [-G GIDLIST] [-t TERMLIST] [PATTERN]
```
[scala]なぜListではなくSeqを使うべきなのか


Listは使わずにSeqにしなさいとよく言われるけど、何故そうなのかはいまいちよくわかってなかったので、調べました。基本的な内容です。

## そもそもSeqとは

Seq([scala.collection.Seq](http://www.scala-lang.org/api/current/index.html#scala.collection.Seq))は、Iterableのうち順序を持つものを指します。
全てのcollectionはIterableであるので、順序がある(要素にindexでアクセスできる)コレクションは全てSeqです。(SeqでないコレクションにはMapやSetがあります)

Seqはscala.collection下にあるので、VectorだろうとMutableListだろうとSeqです。メソッドや関数の引数の型には、特別な理由がない限り、取りうる型の範囲を狭めてしまうListなどよりSeqを指定したほうが良さそうです。

```scala
scala> Seq
res0: scala.collection.Seq.type = scala.collection.Seq$@5680a178

scala> List
res1: scala.collection.immutable.List.type = scala.collection.immutable.List$@2d6a9952
```


## IndexedSeqとLinearSeq

Seqは2種類のサブトレイトに分かれます。

- IndexedSeq : 要素へのランダムアクセスとlengthが速い
- LinearSeq  : head/tailが速い

と、それぞれ異なるパフォーマンス特性を保証しています。

(immutableの方では)IndexedSeqのデフォルト実装はVectorであり、LinearSeqのデフォルト実装はListです。また、単純にSeqを作ったときもListが作成されます。
scala的にはindexアクセスはあまりしないでしょうから、SeqのデフォルトがLinearSeqなのは合理的と言えます。ちなみに、mutable.Seqはmutable.IndexedSeqと同じArrayBufferを作成します。

```scala
scala> Seq(1)
res2: Seq[Int] = List(1)

scala> IndexedSeq(1,2)
res3: IndexedSeq[Int] = Vector(1, 2)
```

基本的には「Listが使いたい」ことはあまりなくて、「先頭からのアクセスが速い配列が使いたい」ことのほうが多いとおもうので、scalaで配列的なものが使いたいときは、その使い方に応じてLinearSeq(Seq)かIndexedSeqを使うようにすれば良さそうです。


## まとめ

- 引数の型にはListよりSeqを使ったほうがいい
- コンストラクタもListよりSeqを使ったほうがいい
Vagrant上でfastimageを使って画像のサイズが取得できない件について


原因はVagrantの設定の仕方に問題があったので、下記の通り削除と追記を行ってvagrant reloadしたら直った。

```rb:Vagrantfile
  # コメントアウト
  # config.vm.synced_folder "./", "/vagrant", nfs: true

  config.ssh.forward_agent = true

  config.vm.network :private_network, ip:"192.168.33.25"
  config.vm.provider :virtualbox do |vb|
  vb.customize ["modifyvm", :id, "--memory", 1536 ]
    vb.customize ["setextradata", :id, "VBoxInternal/Devices/VMMDev/0/Config/GetHostTimeDisabled", 0]
  end

  # 追加
  # NATについてホストの設定を参照するように変更
  config.vm.provider :virtualbox do |vb|
    vb.customize ["modifyvm", :id, "--natdnsproxy1", "off"]
    vb.customize ["modifyvm", :id, "--natdnshostresolver1", "off"]
  end
```


Vagrantファイルを書き換える前はFastImageの内部で例外を吐いて死んでいた。

```get_image.rb
FastImage.size("http://stephensykes.com/images/ss.com_x.gif", :raise_on_failure => true)
```

FastImageの内部でここで落ちていた。

```lib/fastimage.rb
def fetch_using_http_from_parsed_uri
  setup_http
  # @http.request_get で例外を吐いて死ぬ
  @http.request_get(@parsed_uri.request_uri, 'Accept-Encoding' => 'identity') do |res|
    hogefuge...
  end
end
```

当初はモジュールが足りないのかと思って、色々yumでインストールしてみたが解決せず・・・
vagrantはネットワークの設定が原因で稀によく異常な動作をする場合があるので、
その辺の設定を追記して再起動したら直った。

## 参考にさせていただいた記事
[Vagrant + VirtualBoxでアプリがやたら重い時に試した方が良いこと](http://qiita.com/yashikawa/items/247df1439b2fa485f4e4 "Vagrant + VirtualBoxでアプリがやたら重い時に試した方が良いこと")
ProcessingでAndroidのBluetooth通信テスト

Android>Sketch Permissionsから以下をチェック
![スクリーンショット 2015-02-26 14.19.39.png](https://qiita-image-store.s3.amazonaws.com/0/38279/70a9f957-a1fe-3077-b02e-4ac00e46aa66.png)

スクリプトはこんな感じで書いて書き出し。

```java:
import android.bluetooth.BluetoothAdapter;
BluetoothAdapter bluetooth = BluetoothAdapter.getDefaultAdapter();

void setup(){
 //orientation(LANDSCAPE);
}

void draw(){
 if(bluetooth.isEnabled()){
 background(255,0,0);
 } else {
 background(0,0,0);
 }
}
```
通信が出来たらAndroidの画面が赤くなるのでそれで成功です。
PHPで MIME type から拡張子を取得する関数

使うかもしれないメモ。
Apacheなら `/etc/mime.types` 、Nginxなら `/etc/nginx/mime.types` のファイルがある（と思う）ので、そこから一覧を取得してる。
[open_basedir](http://php.net/manual/ja/ini.core.php#ini.open-basedir)なんかで制限されてたりすると無理だと思う。

```php
function mimeToExt($mime) {
	$mime = strtolower($mime);
	$ext = null;
	$handle = fopen('/etc/mime.types', 'r');
	while(($line = fgets($handle)) !== false) {
		$line = trim($line, " \t\r\n;");
		if (empty($line) || '#' === $line{0}) {
			continue;
		}

		$line = str_replace("\t", ' ', strtolower($line));
		$split = explode(' ', $line);
		$type = array_shift($split);
		if(!empty($split) && $type === $mime) {
			$ext = array_values(array_filter($split));
			break;
		}
	}
	fclose($handle);

	return $ext;
}
```

ただ、いっぱい出てきちゃうのどうしよう・・・（jfifてなんだ）

```php:実行例
var_dump(mimeToExt('image/jpeg'));

/*
array(4) {
  [0]=>
  string(4) "jpeg"
  [1]=>
  string(3) "jpg"
  [2]=>
  string(3) "jpe"
  [3]=>
  string(4) "jfif"
}
*/
```

あと `/etc/nginx/mime.types` から取得すると `jpeg` と `jpg` だけだった。
そこらへんの差異もちょっと微妙かも。
Railsの開発環境のみで使えるパス


Rails4.1 以降かと思いますが以下のパスが
`development`環境下で組み込まれています.

- http://localhost:3000/rails/mailers
- http://localhost:3000/rails/info/properties
- http://localhost:3000/rails/info/routes


対象となるコードは[Rails::Application::Finisher](https://github.com/rails/rails/blob/d6dec7fcb6b8fddf8c170182d4fe64ecfc7b2261/railties/lib/rails/application/finisher.rb#L22-L33)にあって読んでみると何かの参考になるかも.

## /rails/info/properties

![rails_info_properties.png](https://qiita-image-store.s3.amazonaws.com/0/21086/06ac5622-ad0d-43f6-5028-4cd9a78ea32f.png "rails_info_properties.png")


Railsアプリケーションの各種情報が表示されます.

- Rails version
- Ruby version
- RubyGems version
- Rack version
- JavaScript Runtime
- Middleware
- Application root
- Environment
- Database adapter
- Database schema version



## /rails/info/routes

`rake routes`と同じ内容がでるようです.

![rails_info_routes.png](https://qiita-image-store.s3.amazonaws.com/0/21086/18ffecb5-d384-6edf-c508-d0804d5aed45.png "rails_info_routes.png")


## /rails/mailers

Rials4.1 からある`ActionMailer::Preview`のプレビューです.
Laravel5 で同一画面で複数の paginate を使うと同時に動いてしまうのでぐぐって書いてた通り paginator->setPageName() したけどぜんぜん動かない

```
Paginator::currentPageResolver(function()
{
     return Input::get('hogepage');
});
$item1 = Items::where(○○○)->paginate(5)

Paginator::currentPageResolver(function()
{
     return Input::get('pokopage');
});
$item2 = Items::where(×××)->paginate(5)
```

これで一応動くけど、２つの paginator の currentPage を同時に保持する機能は Laravel の paginator にはまだ実装されていないもようなので　だれかがなんとかしてくれるはず


https://laracasts.com/discuss/channels/general-discussion/laravel-5-set-current-page-programatically?page=1


一応ぐぐったら出てくるけど、「currentPageResolver」でぐぐるまでが大変なんじゃ
AutoCompleteExtender 動的コントロールに値を設定する

選択されたリストから値を取得する際に、リストに表示された文字列ではなく別の値を取得することが出来る。そしてこれらを別々のフォームに設定した場面も多い。

```js:AutoCompleteExtender.IAmSelected.KeyValuePair.Sample.js
function IAmSelected( source, eventArgs ) {
    // 入力欄に選択テキストを設定する。
    document.getElementById("theTextBox").value = eventArgs.get_text();
    // 選択テキストに紐づく"値"を別のフォームに設定する。
    document.getElementById("theHidden").value = eventArgs.get_value();
}
```
http://blogs.msdn.com/b/phaniraj/archive/2007/06/19/how-to-use-a-key-value-pair-in-your-autocompleteextender.aspx

上記のようにフォームの名前や ID が分かっている場合は良いが、動的にたくさん作ったフォームの場合は名前が不定のこともある。

```js:AutoCompleteExtender.IAmSelected.KeyValuePair.Array.Sample1.js
function IAmSelected( source, eventArgs ) {
    document.getElementById("theTextBox[1]").value = eventArgs.get_text();
    document.getElementById("theHidden[1]").value = eventArgs.get_value();
}
```

この場合は次のようにする。

```js:AutoCompleteExtender.IAmSelected.KeyValuePair.Array.Sample2.js
function IAmSelected(source, eventArgs) {
    var tbxID = source.get_id();
    var hdnID = tbxID.replace("theTextBox", "theHidden");
    document.getElementById(tbxID).value = eventArgs.get_text();
    document.getElementById(hdnID).value = eventArgs.get_value();
}
```

この例では入力欄のIDが「theTextBox○○」で、別のフォームのIDが「theHidden○○」としている。こういった命名の対応が必要である。

参考：
http://forums.asp.net/t/1334120.aspx

##その他

日本語のスニペットが無さそうなので作りました。
参考にしたほかのサイトのスニペットでも、識別子「IAmSelected」がよく使われていました。ググラビティのため、本サンプルコードの関数名もそれに倣ってみました。
レガシーコード改善ガイド 第三章


## 検出と分離
#### 変更する前の理想の状態
特に何も手を入れなくてもテストが書けるようなクラスが理想。
依存関係が多いと、対象のクラスをテストするのにいろんなクラスのインスタンスを生成しなければならなくなる。

上記の理由からテストを実行するには依存関係を排除するのがよい。
しかし理由はそれだけではなく、テスト対象のクラスが依存関係を持っているクラスに対しての影響がどうあるのかを把握しておく必要がある。

#### 検出と分離
テストを整備する際に依存関係を排除する理由は２つ。

1. 検出　ー　コードの計算した値にアクセスできないときに、それを検出するために依存関係を排除する
2. 分離　ー　コードをテストハーネスに入れて実行すらできないとき、分離するために依存関係を排除する

例：NetworkBridgeクラス

* EndPointクラスはそれぞれローカルのsocketを開き、EndPointと通信をする
* 以前あった、単体テストのようで単体テストではない例として、ネットワークの通信をしているというのがあった。これは単体テストを作成することができない
* テスト対象のクラスでないものに関しては、できるだけ考えなくて済むようにするのがよい

```
public class NetworkBridge
{
    public NetworkBridge(EndPoint[] endpoints) {
        ...
    }
 
    public void formRouting(String sourceID, String destID) {
        ...
    }
}
```

#### 検出と分離の方法
分離の方法は巻末に記載。すでに出てきたものとしては「インターフェースの抽出」「パラメータのプリミティブ化」。
しかし、検出のための主な手段は一つしかない　→　「協調クラスの擬装」

## 協調クラスの擬装
変更対象のクラスが協調しているクラスは変更対象のクラスのテストには無関係なので、依存関係を排除したい。
変更対象のクラスが協調しているクラスを別のクラスに置き換えてインスタンス化したい。
そのオブジェクトを擬装オブジェクトという。

#### 擬装オブジェクト
擬装オブジェクトとはクラスのテストを行うときにその協調クラスになりすますオブジェクトのこと。

例：Saleクラスのscanメソッドをテストしたい

* Saleクラスはscanメソッドを持ち、scanメソッドは引数に文字列をとって、文字列（バーコード）の品物の名前と価格をレジの画面に出力する
* scanメソッドのテストの方法は、通常Saleクラスをインスタンス化して、scanメソッドにバーコードの文字列を渡す
* レジに表示されている品物の名前と価格を確認する
* しかし、レジの画面への出力方法がSaleに埋め込まれているとテストできない依存関係が発生していることになる

#### 依存関係の排除

* レジに出力する処理用のクラスを作成し、処理をその新しいクラスに委譲する
* インターフェースの抽出を行い、テスト用のディスプレイクラスを作成する

ディスプレイに出力される文字を取得するメソッド自体は必要ないが、テストとして正しい文字列が出力されているかを確認するために、テスト用のメソッド（getLastLine()）をテスト用クラスに追加している。
これによって、擬装オブジェクトの２つの側面（テストからのみ参照されるインターフェースと実際に利用するクラスから参照されるインターフェース）が生まれる。

## モックオブジェクト
テストをするために擬装オブジェクトをたくさん生成しないといけない場合はモックオブジェクトを検討してくださいとのこと。

モックオブジェクトとは内部的に表明（assertion）を実行する擬装オブジェクトのこと。

```
public class SaleTest extends TestCase
{
    public void testDisplayAnItem() {
        MockDisplay display = new MockDisplay();
        display.setExpectation("showLine", "Milk $3.99");
        Sale sale = new Sale(display);
        sale.scan("1");
        display.verify();
    }
}
```

こうなるべきというものをexpectationでセット、verify()で確認させるという流れ。
【CakePHP】レコードの存在確認


今までレコードの存在確認にfind('count')を使っていたけど、コードがすっきりするので、プライマリーキーを条件にするならModel->exists()を使い、それ以外を条件にするならModel->hasAny()を使うようにする。


## Model->exists()
パラメータ：**プライマリーキー**
戻り値：存在したらtrue、存在しなかったらfalse

```php
if($this->exists($id)){
//レコードが存在した場合の処理

}else{
//レコードが存在しない場合の処理

}
```

exists関数の中を見ると、なんとfind('count')している。単にラップしてるだけですね。

```php
public function exists($id = null) {
  
  (パラメータチェックのため記載省略)

  return (bool)$this->find('count', array(
    'conditions' => array(
      $this->alias . '.' . $this->primaryKey => $id
    ),
    'recursive' => -1,
    'callbacks' => false
  ));
}
```


##  Model->hasAny()
アソシエーションのhasManyと紛らわしいの注意。

パラメータ：**連想配列でcountの条件。findのconditon形式。**
戻り値：存在したらtrue、存在しなかったらfalse

```php
$conditions = array('status'=>'1');

if($this->hasAny($conditions)){
//レコードが存在した場合の処理

}else{
//レコードが存在しない場合の処理

}
```

hasAny関数の中を見るとこちらもfind('count')している。
こちらも単にラップしてるだけですね。

```php
public function hasAny($conditions = null) {
  return (bool)$this->find('count', array('conditions' => $conditions, 'recursive' => -1));
}
```

##蛇足
ソースを見て初めて知ったけど、PHPではintをbooleanにキャストすると、0はfalseで、0以外は全てtrueにキャストされるらしい。
参考：[booleanへのキャスティング](http://php.net/manual/ja/language.types.boolean.php#language.types.boolean.casting)
UnityのiOS 64bitビルド

##iOS64bit対応
2015年2月審査提出分より、アプリの64bit化が義務付けられ、
各デベロッパーでは対応が進んでいるかと思います。

その中でも厄介なのが、ミドルウエアを使用した開発を行っているアプリ、
すなわちUnityでの64bit対応が待たれていたわけです。

幸いなことに、4.6.xでの対応をUnityサイドからコミットがあり、
ver.4.6.2とver.4.6.3にてIL2CPPの設定が追加され、
64bit版でビルドが可能になりました。

こちらの記事に関しましては、
Unity4.6.3のバージョンにて執筆させていただいております。


##設定方法
設定は至って簡単！
反面ビルドがものすごく重い＆時間がかかる！(笑)

1.Build Settingsを開いて、PlayerSettingを押下
2.iOSがセットされていることを確認
3.PlayerSettingタブ一番下のOther Settingにて下記内容を設定

###BuildSettings
BuildSettingにPlayerSettingsの表示ボタンがあるので、
押下した後、Unityのタブにて詳細を設定

![Build_Settings-5.png](https://qiita-image-store.s3.amazonaws.com/0/50702/03af2781-5f45-f93f-a416-7f020550c8f4.png "Build_Settings-5.png")

###PlayerSetting
BuildSettingsのボタンを押してもポップで出てこないので、
Unityに慣れてない方は「あれ？」ってなるポイント(笑)
エディッタ上のタブに表示されるのでご注意ください。
![スクリーンショット_2015-02-26_15_35_35-3.png](https://qiita-image-store.s3.amazonaws.com/0/50702/1f02ccca-8236-eefd-aab1-fe27bd9c6144.png "スクリーンショット_2015-02-26_15_35_35-3.png")

####Other Setting
ここで細かい設定をしていきます。
Other Settingのタブを広げたら、ちょっと下に移動しましょう。
Configurationがでてきます。

**設定**
Configuration>Scripting Backend>IL2CPPへ変更
Configuration>Architecture>Universal へ変更
~~Optimization>TargetiOSVersion>5.1 以降へ変更~~
~~Optimization>TargetiOSVersion>6.0 以降へ変更~~
Optimization>TargetiOSVersion>7.0 以降へ変更
→iPhone5sが初の64bitCPU(A7)のため、以下の端末を切る捨てる懸念あり。
→審査提出時にワーニングが出る。

![スクリーンショット_2015-02-26_15_35_35-34.png](https://qiita-image-store.s3.amazonaws.com/0/50702/58d44b11-0eda-6a76-cf77-5899dfcfe55d.png "スクリーンショット_2015-02-26_15_35_35-34.png")

パッと見、IL2CPPの設定は理解できると思いますが、
Architecture、TargetiOSVersionは何の意味があるかの想定がつかないと思います。
以下で簡単に説明を記載しておきます。
###Architecture
ここではXcodeでビルドする際の設定を行います。
今回64bit対応ということですが、まだ32bitもサポートするのであれば、
両方含んだ形でビルドする必要があります。
なので、Universalにする必要があるのです。
64bitのみでよければARM64で、
まだ32bitのみでよければ、ARMv7で大丈夫です。

###TargetiOSVersion
以下の表を見ていただけると一目瞭然かと思われます。
基準としては、iPhone4Sの発売時のOSが5.0でしたので、
iPhone4sをサポートするのであればといった判断です。

| |iPhone 5s	|iPhone 5	|iPhone 4S|iPhone 4|
|:---------|:---------|:---------|:---------|:---------|
|指紋認証|○|✕|✕|✕|
|ディスプレイ|4インチ|4インチ|3.5インチ|3.5インチ|
|チップ	|A7(64bit)|A6(32bit)|A5(32bit)|A4(32bit)|

以上となりますが、
まだUnity5の発売であったり、今後のAppleの動向でここの内容は変動します。
随時情報は更新させていただきます。
メトリクス計測 SourceMonitor 紹介

# メトリクス計測とは？
* ソフトウェアのメトリクスとは？
    * ソフトウェアを計測する方法およびその尺度のことを意味します。
* メトリクス計測ツールは、ソフトウェアの構成要素であるソースコードを計測し、数値化を行います。メトリクスを計測し、複雑過ぎるロジックや洗練されないパッケージ構成を見直すことで、バグが少なく保守性が高いソースコードを維持できるようになります。
* そういったソースコードの構造的な問題を確認するためにメトリクスが有効となります。メトリクス計測ツールによって計測できるメトリクスには、例えば以下のようなものがあります。

1. クラス、メソッドなどの数
2. クラス、メソッドの内部構造
3. パッケージ間やクラス間の依存関係
　

これらのメトリクスを用いると、特に以下の品質にかかわる問題を検出し、信頼性と保守性を高めることができます。

* 複雑なソースコードにはバグが潜在する可能性が高くなる
* 複雑なソースコードは読みづらく、テストもしにくくなる
* 複雑なクラス構造は理解するのが困難で、拡張性にも乏しくなる

# 計測できる言語
* C++
* C
* C#
* VB.NET
* Java
* Delphi
* Visual Basic (VB6) 
* HTML
など

# 収集できるメトリクス
## File
* 読み込んだファイル数

## Lines
* 空白行やコメント行も含むコードの行数

## Max Complexity
* Projectで最も複雑なメソッドの複雑度

## Max Depth
* Projectで最もネストが深いメソッドのネストの深さ(9+は9以上)

## Avg Depth
* Project全体のネストの深さの平均

## Avg Complexity
* サイクロマチック複雑度
    * 10 以下であればよい構造 
    * 30 を越える場合，構造に疑問 
    * 50 を越える場合，テストが不可能 
    * 75 を越える場合，いかなる変更も誤修正を生む原因を作る


# おまけ
* 解析結果をXMLやCSVでエクスポートできる。

# SourceMonitorのダウンロード先
* [こちら](http://www.campwoodsw.com/sourcemonitor.html)



SourceMonitorを使用し、良いコーディング！見やすいコーディングをしていきましょう。
Project Euler 4 高速化を試みた


先日書いたProject Euler problem 4の回答コードをいろいろいじってみた。
http://qiita.com/cof/items/1fa1c2600144520b33f8

問題

```
左右どちらから読んでも同じ値になる数を回文数という. 2桁の数の積で表される回文数のうち, 最大のものは 9009 = 91 × 99 である.
では, 3桁の数の積で表される回文数の最大値を求めよ.
```

コード再掲
当初書いたwhile文(関数にしたなど、微妙にリバイス済み)
時間計測のため100回実行等をしているため、printをコメントアウトしている。

```
def while1():
    (i,j)=(999,999)
    max=1

    while i>0:
        while j>0:
            k = i*j
            if k <= max: break
            if str(k)==str(k)[::-1]: max=k
            j -= 1
        (i,j)=(i-1,999)
    #print max
```

ここで、i>=jと仮定してもよいことに気が付いたので、それに合わせて書き直してみた。

```
def while2():
    (i,j)=(999,999)
    max=1

    while i>0:
        while j>0:
            k = i*j
            if k <= max: break
            if str(k)==str(k)[::-1]: max=k
            j -= 1
        (i,j)=(i-1,i-1) #ここだけが異なる。
    #print max
```

for文にしてみた。

```
def for1():
    start=999
    max=1
    for i in range(start,0,-1):
        for j in range(i,0,-1):
            k = i*j
            if k <= max: break
            if str(k)==str(k)[::-1]: max=k
    #print max
```

ここで、実行時間を計測してみると、while2が一番早く、while1がその次、for1がwhile1の40%増位など、爆遅であった。
ループの中でrange関数の呼出を行っていることが爆遅となった原因ではないかと推察し、次のコードを書いてみたところ、while1よりも若干早くなったくらいとなった。(while2よりは遅い)

```
def for2():
    start=999
    max=1
    L = range(start,0,-1)
    for i in L:
        for j in L[start-i:]:
            k = i*j
            if k <= max: break
            if str(k)==str(k)[::-1]: max=k
    #print max
```

これをリスト内包表記に改めてみた。

```
def for3():
    L=range(999,0,-1)
    ans = max([i*j for i in L for j in L[999-i:] if str(i*j) == str(i*j)[::-1]])
    #print ans
```

非常にシンプルだけど、死ぬほど遅い。リスト内包表記はリストを作成するのにはappend()関数の呼出コストを削減できるから早いけど、それ以外で上記のような使い方をするとすごく遅くなりそうである。

また、上記とは別なアプローチとして、以下のようなアプローチを考えてみた。
![pe04_001.png](https://qiita-image-store.s3.amazonaws.com/0/70480/8e490782-c47c-afc2-b93e-d3d03c159d7c.png)

上記をコードに落とし込んでみた。（上記は基本的アイディアなので、詳細ではいつくか異なる点はある。)

```
def from999999():
    seed = 999
    max = 999
    min = 99
    ans = 0
    while 1:
        target = seed * 1000 + int(str(seed)[::-1])
        i = max
        while i > min:
            (q, r) =  (target // i, target % i)
            if q > max:
                break
            elif r == 0:
                ans = target
                break
            else:
                i -= 1
        if ans:
            break
        else:
            seed -= 1
    #print ans
```

結果、答えが90万台と大きいこともあり、最後のコードが最速となった。(100回実行)
![pe04_002.png](https://qiita-image-store.s3.amazonaws.com/0/70480/9c47720d-a62d-3d83-be0a-1c2f21361317.png)

今日の気づき：
for in range()を多重ループで使うとrange関数の呼出コストが増えてしまうっぽい。
もしかするとforよりもwhileの方が早い？
リスト内包表記は（書き方が悪いのかもしれないけど）、和を求める等には不向きっぽい。

俺は単なる日曜プログラマであって、専門家ではないのでどこまで正しいかは謎。
MacでJVMリソース監視ツール jconsoleを使う


MacOSでjconsoleってどうやって使うのかなと思って調べたら```jconsole```ってコマンドそのまま叩けばいいのね。
そういやwindowsも%JAVA_HOME%\binにexeが入っているから、DOS窓からも起動出来ると思う。
思いつきもしなかった。

```コンソール
$ jconsole
```


## プロセス番号を指定して起動する
### javaのプロセス一覧を表示

```コンソール
$ jps
```
でjavaのプロセス一覧が出る

### プロセス番号を指定して起動
で調べたプロセス番号を引数に起動も出来る

```コンソール
$ jconsole 12345678
```
リアルタイムに「tail -f」をgrepする方法

普通に

```sh
tail -f XXXXX | grep "XXXX"
```

とするとgrepがバッファリングしてしまうため、リアルタイムにgrepされない。

```sh
tail -f XXXXX | grep --line-buffered "XXXX"
```

としてgrepのバッファリングを解除する必要がある。
Eclipse＋JBossで、JBossランタイムにearファイルを直接デプロイする方法

EclipseのJBossランタイム環境で、Eclipse内のプロジェクトではなく、earファイルを直接デプロイして実行したい事がある。
その場合は以下のようにすると実行できる。

1. JBossランタイムをダブルクリック⇒概要⇒公開⇒自動公開しないを選択
2. JBossランタイムを右クリック⇒追加および除去⇒普段動かしているearを除去しておく
3. earファイルをJBossのdeploymentsフォルダに入れて起動する
ServiceWorker上で動く軽量WAFみたいなミドルレイヤー作ってみた


これ [mizchi/sabizan](https://github.com/mizchi/sabizan "mizchi/sabizan")
ServiceWorkerっていう名前がサビ残っぽいよなってみんな思ってたと思う。

ServiceWorkerの勉強兼仕事で使うためのモックサーバーとして作った

## 用途

1. ServiceWorker層でビジネスロジックを持つAPIサーバー
2. またはテスト用のAPIモックサーバー

できるだけexpress風にしようとしたけどRequestのネイティブオブジェクトに値を挿入するの気持ち悪くて互換は諦めた。適当なラッパー書けば同じコードから生成できる気がしている。

## どう動くか

dist/sabizan.js は service worker上で動くことが必須で、他のクライアントJSと同じくbrowserifyを使うか、importScriptで読み込むことを意図している。

```coffee
Sabizan = require 'sabizan' # with browserify or importScript('dist/sabizan.js')
proxy = new Sabizan location.origin+'/api'

# it will respond to https://localhost:3000/api/user/fuga?foo=bar
proxy.get '/user/:id', ({id}, {foo}, req) ->
  {id, foo}

# Return with promise
proxy.post '/post', ({}, body) ->
  new Promise (done) ->
    setTimeout ->
      done {type: 'this is post:'+params.prop}
    , 300

self.onfetch = (event) ->
  if proxy.isHandleScope event.request.url
    event.respondWith(proxy.createResponse(event.request))
```

sinatraとかexpressっぽいと思う。ルーティングをparseする処理は express の中で使われてる [path-to-regexp](https://www.npmjs.com/package/path-to-regexp "path-to-regexp") を使った。

クエリストリングのパースにrequire('url')したせいでbrowserify がnode本体のそこそこ大きいurlモジュールを呼んでしまっていて、そのせいでサイズがやや大きい。

## 何が嬉しいか

- UIスレッドから独立しているのでビジネスロジックで重い処理をしても固まらない(WebWorkerと一緒)
- ビジネスロジックが完全にDOMから触れられなくなるので、設計に対する矯正ギプス的な役割ができる

FluxだとViewとStoreが元々疎結合で、たとえば[mizchi/arda](https://github.com/mizchi/arda "mizchi/arda")はただのevent-emitterなのでStore層をServiceWorkerの中へ持っていけるのではないかと考えている。というか実際それを意識して設計していた面はある。


とはいえ、まだまだ仕様策定中の機能なので、自分の目的が達せられない可能性はある。コード量は少ないんで適当に読んでください。


## 注意点

これを作るにあたって、次のようなコードを書いてブラウザからワーカーに対して1秒ごとにポーリングしてみたんだけど、どうやらServiceWorker は30秒ぐらいでインスタンスが破棄される模様。KeepAlive的なオプションはいまのとこなさそう。


sw.js

```coffee
console.log 'worker started'

counter = {cnt: 0}
self.onfetch = (event) ->
  console.log 'onfetch', event.request.url
  if event.request.url.indexOf(location.origin+'/api') > -1
    counter.cnt = counter.cnt + 1
    event.respondWith new Response JSON.stringify(counter),
      status: 200
      headers:
        'Content-Type': 'application/json'
```

polling

```coffee
require 'whatwg-fetch'
window.addEventListener 'load', =>
  navigator.serviceWorker.register 'service-worker.js', scope: '.'
  .then (r) ->
    console.log('service-worker registered')
    setInterval ->
      fetch('api/foo', {headers: {'content-type':'application/json'}})
      .then (res) -> res.json()
      .then (json) -> console.log(json)
      .catch ->
        'serviceWorker not ready'
    , 1000

  .catch (whut) ->
    console.error('fail to register', whut)
```

何もしなければcnt が 30 秒ごとにリセットされる。registerが走ればさらに30秒、っぽい挙動にみえる。

分厚いStore層をここに構築すると、30秒ごとに捨てられるのが厳しいので、KeepAlive的な指定がほしいと思った。
Google Authenticator 機種変更トラブルの解決法

先日iphone を機種変更した。

softbank から au に変更したので、メールアドレスも変わった。

電話番号はMNP だから変更されていない。

<br>
だいたい、機種変更する人はこんな感じだと思う。
そんな人が、Google Apps 管理者アカウントのログイン時
に２段階認証としてGoogle Authenticator を使っていて、肝を冷やした話をする。
<br>
察しの良い人はお分かりだと思うが、管理者アカウントに接続できなくなったのである。

バックアップデバイスにメールアドレスを設定していたため、機種変更に伴って消失してしまった。端末も下取りしてしまったのでアプリ初期化への対応もできない。

さてどうしようかと途方に暮れていたとき、ログイン画面の下あたりに「**お困りの場合**」とあるので、こちらをクリック。

ログインに関して別の問題が発生している　をクリックし、管理者アカウントのメールアドレスを入力して詳細へ進む。

あとは画面の内容に従って進めていき、日本法人の人とメールでやりとりをしてアカウントへアクセスできるようになった。

復旧まで２日。さすがに肝を冷やしたけど、なんとかなって良かった。

そういう話
バックログはなぜ２つに分かれているのか(プロダクトバックログとイテレーションバックログ)

アジャイルサムライを見ているとプロダクトバックログとイテレーションバックログに分かれている
なぜ二つも作るのか？

# イテレーションバックログ
例えばこんなの

```
ユーザーが入力した検索ワードをもとに商品名から検索する機能を実装する
ユーザーはサイドバーのカテゴリを選択すると、カテゴリに属する商品だけをフィルタして表示する
```

「主語」「述語」「目的語」などが明確に書いてある
基本的に作り手目線で書く

次イテレーション開始が近づいたときに、次イテレーションの内容を書いておけば良い
せいぜい3イテレーション先までしか書かない
それ以上はコストをかけて書いてもバックログの内容が賞味期限切れで無駄になるので意味がない

イテレーションバックログに書くのは手段であり、特定のタイミングと特定のコンテクストにおいて「今やるべきこと」を並べた上で、優先順位をつけたものである。
であるので、時間が流れたりコンテクストが変わったりすれば再度作り直す必要がある。

イテレーションバックログにかかれていることは賞味期限が短く、書かれていることはすぐに使い物にならなくなる。あくまでも「今」使うためのものなのだ。

そのためイテレーションバックログの内容は「着手準備完了」「進行中」「完了」「待ち」などのステータスと「見積られた作業規模」は管理されるべきではあるが、長期にのこす意味はない。
一ヶ月前に作られたイテレーションバックログのタスクは賞味期限切れになっている可能性が高いからだ。
であるので、カンバンなどで管理すべきであり、JIRAなどのシステムで管理すべきではない

# プロダクトバックログ
例えばこんなの

```
ユーザーが興味のある商品を探す。そのために、検索機能に検索キーワードを入力する
ユーザーはサイドバーのカテゴリを選択すると、カテゴリに属する商品だけをフィルタして表示する
```

ユーザーストーリーにはユーザーの利益(ないし行動の目的)と、それに続く「そのために(.. in order to)」句、そのための手段がかかれる
目的は比較的不変であり、コンテクストが変化しても変わることはない。一方で手段は賞味期限が短く。変化しやすい。コンテクストの変化に弱く、変更されやすい。また、手段は単なる選択肢の一つであるため、バックロググルーミングの段階で手段の部分はたびたび書き換えられる。

ユーザーの利益、目的は欲求ベースである。
そのため「次にどの欲求を満たすべきか」という軸で定量的、定性的に判断される。
また、リリース後に「この欲求はどの程度使われているか？(=ユーザーの欲求は満たされたか、そもそも欲求そのものが存在したか)」という仮説検証がしやすく、リリース済みの欲求の観測結果は、プロダクトバックログの優先順位付けに影響を与える。
正規表現で、ある文字列を含むが、ある文字列は含まない行を抽出する方法

例えば、「AAA」という文字列を含むが、「BBB」という文字列は含まない行を抽出するには以下のようにする。

```
^(?!.*BBB).*(?=AAA).*$

AAA ⇒ ヒットする
BBB ⇒ ヒットしない
AAABBB ⇒ ヒットしない
AAACCC ⇒ ヒットする
```
vmstatやiostatで日付・時刻も表示する方法

Linuxでリソースの状態を確認するためにvmstatやiostatを利用するが、日付・時刻が表示されない。
何秒かおきに実行して結果をファイルに出力しておいて後から確認したりすることがあると思うが、日付・時刻がないと不便。

コマンドの後ろにパイプで以下を付与することで日付・時刻が出力されるようになる。

```lang:
awk '{print strftime("%y/%m/%d %H:%M:%S"), $0}'
```

日付・時刻の書式も自由に設定できる。

以下はvmstatを1秒おきに実行し、日付・時刻も出力している例。

```lang:例
[root@localhost ~]# vmstat 1 | awk '{print strftime("%y/%m/%d %H:%M:%S"), $0}'
15/02/26 11:12:39 procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
15/02/26 11:12:39  r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
15/02/26 11:12:39  1  0      0 250040  18568  95644    0    0  1121   100  210  364  3  5 71 20  0
15/02/26 11:12:40  0  0      0 250040  18568  95644    0    0     0     0   30   58  0  0 100  0  0
15/02/26 11:12:41  0  0      0 250040  18568  95644    0    0     0    44   27   65  0  0 99  1  0
15/02/26 11:12:42  0  0      0 250040  18568  95644    0    0     0     0   25   57  0  0 100  0  0
15/02/26 11:12:43  0  0      0 250040  18568  95644    0    0     0     0   20   52  0  0 100  0  0
15/02/26 11:12:44  0  0      0 250040  18568  95644    0    0     0     0   33   70  0  0 100  0  0

```

特にvmstat、iostatにかぎらず、どんなコマンドにも応用できる。
なんかAWS RDSのSnapshotからのrestoreしようとしたときにくるくるから先に進まない時にAPIから叩いてなんとかする

ワイ「過去のデータ掘り出さなきゃアカンからsnapshotからrestoreするやで(ﾏｳｽﾎﾟﾁｰ」
AWS「……(ローディングから先進まない)」
ワイ「ﾌｧｯ!?」
※ブラウザのキャッシュ削除、他ブラウザからの操作でもダメだったので、恐らくはAWS側のなんらかのトラブルかと思われる。

「RDSスナップショットから"Restore from DB Snapshot"を行っても、読み込み中のアイコンが回転した状態から先に進みません。4〜5時間にわたり10数回試しています。」
「API経由であれば復元できました。」
https://forums.aws.amazon.com/thread.jspa?messageID=414135&#414135
**……どうやらAPI経由で叩くとなんとかなるっぽい！**


**「でもなんかなんとなくAPIから叩くのってすげえめんどくさそう……」**
と思ってたら意外と簡単だったので共有。

※ もちろん事前にもらっているはずのアクセスキーIDとシークレットアクセスキーが必須
※ 最初にAWSのAPIを叩くためのライブラリが必要なので

```shell-session
gem install aws-sdk
```
ってやって、AWSSDKをインストール。

```rb
require 'aws-sdk'
AWS.config(:rds_endpoint => 'rds.ap-northeast-1.amazonaws.com') # 東京リージョンの場合
rds = AWS::RDS::Client.new({"access_key_id"=>"省略", "secret_access_key"=>"省略"})
responce = rds.restore_db_instance_from_db_snapshot(
  :db_snapshot_identifier => "リストアしたいsnapshotの名前",
  :db_instance_identifier => "リストアした後のDBインスタンス名",
  :db_instance_class => "クラス",
  :multi_az => false,
  :auto_minor_version_upgrade => false,
  :license_model => "general-public-license"
)
```

色々オプションを付けたい場合はこれ参照
http://docs.aws.amazon.com/sdkforruby/api/Aws/RDS/Client.html#restore_db_instance_from_db_snapshot-instance_method


Q. Ruby以外は？
A. そんなものはなかった
JBossでVisualVMのCPUプロファイルを実行するとNoClassDefFoundErrorが発生する

JBossを起動し、VisualVMのCPUプロファイラを実行しようとすると以下のエラーが発生。

```lang:
NoClassDefFoundError: org/netbeans/lib/profiler/server/ProfilerRuntimeCPUFullInstr
```

色々調べたところ、JBossのVM引数に以下のシステムプロパティを設定することで回避できるみたい。

```lang:
-Djboss.modules.system.pkgs=org.netbeans.lib.profiler.server -Dorg.osgi.framework.bootdelegation=org.netbeans.lib.profiler.server,org.netbeans.lib.profiler.server.*
```

[参考URL](http://stackoverflow.com/questions/11732721/error-when-profiling-local-jboss-7-using-visualvm)
【2015/02/26】Tig/Git学び


##### ▼ Gitの設定

###### ○ gitコマンドのエイリアスの設定
```
$ git config --global alias.ch checkout
$ git config --global alias.co commit
$ git config --global alias.st status
$ git config --global alias.br branch
$ git config --global alias.hist 'log --pretty=format:\"%h %ad | %s%d [%an]\" --graph --date=short'
```

##### ▼ 参考サイト
- [tigでgitをもっと便利に！ addやcommitも](http://qiita.com/suino/items/b0dae7e00bd7165f79ea)
- [Gitを使い始めたらやっておきたい便利な設定いろいろ](http://blog.asial.co.jp/845)
ストアド プロシージャの依存関係を確認する

> [ストアド プロシージャの依存関係の表示](https://msdn.microsoft.com/ja-jp/library/ms345404.aspx)

### SQL Server Management Studio のオブジェクト エクスプローラーで表示する

1. データベース エンジンのインスタンスに接続し、そのインスタンスを展開する
1. [データベース] を展開し、プロシージャが属するデータベースを展開し、[プログラミング] を展開する
1. [ストアド プロシージャ] を展開し、プロシージャを右クリックして、[依存関係の表示] をクリックする

### Transacti-SQLで確認する

以下が利用できる権限があること

* [sys.dm_sql_referencing_entities ](https://msdn.microsoft.com/ja-jp/library/bb630351.aspx)
* [sys.dm_sql_referenced_entities](https://msdn.microsoft.com/ja-jp/library/bb677185.aspx)
* [sys.sql_expression_dependencies](https://msdn.microsoft.com/ja-jp/library/bb677315.aspx)

#### プロシージャに依存しているオブジェクトを表示する

```sql
USE database_name;
SELECT referencing_schema_name, referencing_entity_name, referencing_id, referencing_class_desc, is_caller_dependent
FROM sys.dm_sql_referencing_entities ('procedure_name', 'OBJECT'); 
```

#### プロシージャが依存しているオブジェクトを表示する

```sql
USE database_name;
SELECT referenced_schema_name, referenced_entity_name,
referenced_minor_name,referenced_minor_id, referenced_class_desc,
is_caller_dependent, is_ambiguous
FROM sys.dm_sql_referencing_entities ('procedure_name', 'OBJECT');
```

#### プロシージャが依存しているまたはプロシージャに依存しているオブジェクトを表示する

```sql
USE database_name;
SELECT OBJECT_NAME(referencing_id) AS referencing_entity_name, 
    o.type_desc AS referencing_desciption, 
    COALESCE(COL_NAME(referencing_id, referencing_minor_id), '(n/a)') AS referencing_minor_id, 
    referencing_class_desc, referenced_class_desc,
    referenced_server_name, referenced_database_name, referenced_schema_name,
    referenced_entity_name, 
    COALESCE(COL_NAME(referenced_id, referenced_minor_id), '(n/a)') AS referenced_column_name,
    is_caller_dependent, is_ambiguous
FROM sys.sql_expression_dependencies AS sed
INNER JOIN sys.objects AS o ON sed.referencing_id = o.object_id
WHERE referencing_id = OBJECT_ID(N'procedure_name')
```
爆速でvue.js使ってViewModelを試すよ ヽ(ﾟｰﾟ*ヽ)(ﾉ*ﾟｰﾟ)ﾉわぁい

# 結論

 - **ブラウザのみで試した。jsfiddle, jsbin いいね。**
 - **CORS対応のAPIは便利です。**
 - **qiita.comのAPIとvue.js使ってjavascriptタグが付いた最新記事一覧を表示するサンプルつくった**

# はじめに

この記事では以下の絵文字を大事な個所で使用中

 - :exclamation: 注意点
 - :boom: 予期せぬ例外やエラーメッセージ
 - :sunny: 解決方法・お役立ち情報

:computer: 簡単なサンプルをqiita.comのAPI、vue.jsを試す目的で作ってみた。

簡単なjsを試すなら [jsfiddle](http://jsfiddle.net/) , [jsbin](http://jsbin.com/) とかがオススメ。

# ソースコードとか

 - :sunny: vue.js は cdnjs のCDNから読み込むよ ※cdnjsはマイナーなjsライブラリをホストしてる
 - :sunny: #qiita_items のdiv要素を用意してvue.jsのオブジェクトからバインドできるようにする

```html
<!DOCTYPE html>
<html>
<head>
  
  <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/0.11.5/vue.js"></script>
<script src="http://code.jquery.com/jquery-git2.js"></script>
  <meta charset="utf-8">
  <title>JS Bin</title>
</head>
<body>
  <div id="content">
    <div id="qiita_items">
      <button v-on="click: reload">RELOAD</button>
      <div v-repeat="items">
        <h4>{{title}}</h4>
      </div>
    </div>
    
  </div>
</body>
</html>
```

 - :sunny: js中のコメントにいろいろ記載しました

```js
var qiita_items = new Vue({
  el: "#qiita_items",　// ここでdivにバインド
  data: {items:[]},
  methods: {
    reload: function(event){
      $.ajax({
        cache: true, // キャッシュ効かせたいけど、うまいくいかない
        url: "https://qiita.com/api/v2/tags/javascript/items",
        dataType: "json",
        headers: { // ヘッダーで直接指定しても効果は無い
          'Cache-Control': 'max-age=3600' 
        },    
        success: function(data) {
          // ViewModel のデータを書き換えてDOMに反映させる
          qiita_items.items = data;
        }
      }); 
    }
  }
});

$(function(){
  qiita_items.reload();
  
});
```
Scalaで正規表現とパターンマッチを使って文字列を抽出して操作する

## やりたいこと：YouTubeのビデオの長さを秒で取得したい

[YouTubeのAPI](https://developers.google.com/youtube/v3/docs/videos?hl=ja)ではビデオの長さが"PT2H7M56S"のような形式で返されます。
最初の"PT"は固定で、残りが"時H分M秒S"のような表現になります。"PT3M12S"のように時間が無い場合もあります。
このままでは扱いにくので秒に変換します。Scalaでは正規表現とパターンマッチの組み合わせで文字列の抽出がいい感じにできます。使ってコードは以下のようになります。

```scala
val s = "PT2H7M56S"
val youtubeDurationPattern = "PT(([0-9])+H)?(([0-9])+M)?(([0-9])+S)?".r
val duration = s match {
  case youtubeDurationPattern(_, h, _, m, _, s) => { 
    Some((Option(h).map(_.toInt * 60 * 60) ++ Option(m).map(_.toInt * 60) ++ Option(s).map(_.toInt)).sum)
  }
}
// duration: Some[Int] = Some(7626)
```

## 説明

caseの中を細かく分けて型を明示して書くと以下のようになります。

```scala
// 正規表現に一致しなければNoneが返る
case youtubeDurationPattern(_, h, _, m, _, s) => { 
  // 抽出した文字列がnullならNone、null以外ならmapの中身が実行されてSome[Int]に変換
  val hd:Option[Int] = Option(h).map(_.toInt * 60 * 60)
  val md:Option[Int] = Option(m).map(_.toInt * 60)
  val sd:Option[Int] = Option(s).map(_.toInt)

  // ++演算子で結合してリストを作成。Noneな結果はリストには含まれない。
  val all:Seq[Int] = hd ++ md ++ sd
  
  // 結果をsumで合計する
  val totalSec:Int = all.sum
  Some(totalSec)
}
```

合計用の変数を用意して個別に足し込んでいくのではなく、時、分、秒をOption&リスト化しておき、中身を気にせずガッと合計しているところが関数型プログラミングっぽい気がします。
一応コメントを細かく書いていますが、コードと同じことをコメント化しているだけですね。このように直感的なコードが書けるのがScalaの良いところですね。
もっと良い方法ある気もするので、みなさまのツッコミお待ちしています。

## caseの結果がOptionだったらもっと嬉しかった？
caseの結果、抽出した文字列はnullになる可能性があります。nullじゃなくてOption[String]が返るような仕様だったら更に安全ですが、意図があってこのような仕様になっている気もしました。
プロトタイプを速攻作る！

# 素材作る

- [Sketch](http://bohemiancoding.com/sketch/)
- Photoshop
など

# ワイヤーフレーム

- [UXPin](https://www.uxpin.com/)

# UI / UX試してみる

## アプリにお勧め

- [pixate](http://www.pixate.com/)
- [Flinto](https://www.flinto.com)
- [prott](https://prottapp.com/ja/)
- [briefs](http://giveabrief.com/)
- [pop](https://popapp.in/)
- [Justinmind](http://www.justinmind.com/)

###### ユーザの行動分析など

- [Repro](https://repro.io)
- [Mixpanel](https://mixpanel.com/)

## webページにお勧め

- [invision](http://www.invisionapp.com/)

# その他

他にも見つかったら随時更新していきます。
アイコンを丸くしたらどれほど印象が変わるか試す

[LINEがプロフィールアイコンを丸くして大荒れ？](http://www.tabroid.jp/news/2015/02/iphoneline-500-design-renewal.html)らしいのではてブアイコンを丸くしたらどうなるか、Stylishで`.profile-image {border-radius: 50%;}`てCSSを追加して比べてみた。

![スクリーンショット 2015-02-26 10.36.02.png](https://qiita-image-store.s3.amazonaws.com/0/18726/9345e5b8-1a74-6208-4285-ce62ac987d5f.png)![スクリーンショット 2015-02-26 10.35.16.png](https://qiita-image-store.s3.amazonaws.com/0/18726/67dd368c-5acf-b5c3-e1af-10ec2c45de5e.png)

うーん、どっちでもいいや…。
iOS Safari で絶対位置指定された要素のスクロールが出来ない件

表題の件にハマりました。

* iOS7: 未確認
* iOS8: 再現
* iOS9: 未確認（巷の記事によるとiOS9でも発生する模様）
* iOS10: 再現
* iOS11.3: 動いたり動かなかったりする（対策施した版もアウトだったかどうかははっきり記録してなかったです…）
    * [iOS11.X のどこかでは `height: 100%` の代わりに `height: 100vh` を使わないと動かない時代もあった模様](https://qiita.com/chocolamint/items/67d25933880404c93db0#comment-d2235891388012ad7cd8)？
* iOS12.2: **どちらの版も動いたり動かなかったりする（つまり本記事の対策では効果なし）**

例えばページ上にレイヤーを重ねて、一覧から項目を選択させるような場合に、絶対位置指定した要素の中でスクロールさせたいことってありますよね？

* [デモ（過去Safariで動かなかった版）](https://chocolamint.github.io/Qiita/150226_ios_safari_scroll/safari_scroll_ng.html)
* [デモ（後述の対策を施した版）](https://chocolamint.github.io/Qiita/150226_ios_safari_scroll/safari_scroll_ok.html)

このとき、次の条件を満たしてしまうと iOS Safari でスクロールできなくなってしまいます。

* `position` プロパティに `absolute` か `fixed` を指定している（絶対位置指定）
* `height` プロパティと `overflow` プロパティを使って要素内スクロールさせようとしている
* `-webkit-overflow-scrolling` プロパティに `touch` を指定している

ちなみに最後の `-webkit-overflow-scrolling` ですが、これを指定しない場合スクロールは一応できるものの、滑りが悪くて壊滅的に操作性が悪いです。

```css:コード例（抜粋）
.list
{
    position: fixed;
    top: 0;
    right: 0;
    bottom: 0;
    left: 0;
    height: 100%;
    overflow: auto;
    -webkit-overflow-scrolling: touch;
}
```

```html:コード例（抜粋）
<div class="list">
    <div class="item">item1</div>
    <div class="item">item2</div>
    <div class="item">item3</div>
    (中略)
    <div class="item">item22</div>
</div>
```

この現象を回避するためには `position` プロパティを指定する要素と `overflow` プロパティを指定する要素を変えて上げればOKです。


```css:コード例（抜粋）
.list
{
    position: fixed;
    top: 0;
    right: 0;
    bottom: 0;
    left: 0;
    height: 100%;
}

.list-content
{
    height: 100%;
    overflow: auto;
    -webkit-overflow-scrolling: touch;
}

```

```html:コード例（抜粋）
<div class="list">
    <div class="list-content">
        <div class="item">item1</div>
        <div class="item">item2</div>
        <div class="item">item3</div>
        (中略)
        <div class="item">item22</div>
    </div>
</div>
```
gitbucketでBase URLを間違えて保存した時の解決方法


# 概要
Base URLを間違えてしまいサーバーが上手く遷移しなくなった。

# 環境
gitbucket 2.8
Chrome 40

# 解決方法
リンク先がおかしくなるだけなので、本来のページを直接入力することで解決できます。
CSSが正しく取得できていないので、デザインが崩れています。

Chromeで行いました。

1. rootでログインします。
   ※Base URLが間違っている為、ボタンを押す前に`F12`で`From`の`action`を正しいURLに書き換えます。

2. 設定画面に遷移する。URLを直接入力が楽です。 ( http://localhost:8080/admin/system ) 

3. Base URLを正しく入力します。
   ※Base URLが間違っている為、ボタンを押す前に`F12`で`From`の`action`を正しいURLに書き換えます。

POST先を変えていくだけで解決することができました。

# 結果
Base URLを元に戻すことができました。
Android用Facebook SDKスタートガイドではまったところメモ

[Android用Facebook SDKスタートガイド](https://developers.facebook.com/docs/android/getting-started/facebook-sdk-for-android/jp)(アーカイブは[こちら](http://web.archive.org/web/20140217080235/https://developers.facebook.com/docs/android/getting-started/facebook-sdk-for-android/jp))を実行するにあたって個人的にはまったところをメモしておきます。
原因とか良くわかっておらず、ネットを検索してなんとなくうまくいったレベルで対応しています。

# 環境

* OSX 10.10.2
* Eclipse 4.3.2／4.4.1
 * Android Plugin 23.0.4.1468518
* FacebookSDK 3.17.0
* Android SDK 21		

# Facebook SDKプロジェクトのインポート

Facebook SDKプロジェクトのリンクをした後以下のような複数のエラーが出る。

```
インポートされた android.support.v7.app は見つかりません
```

## 対応したこと

1. libs/android-support-v4.jarを右クリックして[ビルド・パス] → [ビルド・パスに追加]
2. 新しいAndroidプロジェクトを作成するときに一緒にできたappcompat_v7プロジェクトのlibs/android-support-v7-appcompat.jarをlibsにコピーする
3. コピーしたjarを右クリックして[ビルド・パス] → [ビルド・パスに追加]

#  グラフィックレイアウトが表示されない

res/layout/activity_main.xmlを表示すると以下のような表示がでてグラフィカルレイアウトが表示されない

```
Exception raised during rendering: Could not initialize class android.widget.TextView
Exception details are logged in Window > Show View > Error Log
```

## 対応したこと

Eclipse 4.3.2からEclipse 4.4.1に変えて再度プロジェクト作成からやりなおしたらいけた。