OmniAICreator/Qiita-1.07M huggingface dataset:
PHPで外部ライブラリをcomposerで管理してみる


## composerってなに？

composerはPHPのライブラリの依存関係を管理するツールです。
composerを使っていれば、ライブラリをインストールする前に、そのライブラリの依存するライブラリも自動的にインストールしてくれる便利なツールです。

※ php5.3.2以上で利用可能

## インストール

じゃあ早速使ってみます。
まずはcomposerのインストールから。

```
curl -s http://getcomposer.org/installer | php
```

これだけでOKです。

こうすると、同じディレクトリに `composer.phar` というファイルが生成されてると思います。

## ライブラリをインストールしてみる

### 1. 同じディレクトリに"composer.json"という名前のファイルを下記内容で作成。
試しにpimple入れてみます。

```
{
    "require": {
        "pimple/pimple": "v2.0.0"
    }
}
```

### 2. インストールする

```
$ php composer.phar install

'または'

$ ./composer.phar install

'または、composer.jsonを書かずに下記'

$ ./composer.phar require 'pimple:pimple: v2.0.0'

```

これで同じディレクトリにvendorディレクトリが生成され、
ライブラリがインストールされているのがわかると思います。

```
$ tree -L 2
├── composer.json
├── composer.lock
├── composer.phar
└── vendor
    ├── autoload.php
    ├── composer
    └── pimple
```


## 使い方

使い方はとっても簡単で、vendor配下のautoload.phpを読み込むだけでOKです。

```php
<?php

require_once __DIR__.'/vendor/autoload.php';

$container = new Pimple();
```

これだけでOK.

## ライブラリの探し方

packagistというサイトがあり、ここから欲しいライブラリを探すことができます。
上のcomposer.jsonで、 `pimple/pimple` のように書きましたが、これは、 `ベンダー名/プロダクト名` となってます。

そのため、同じプロダクトでも別のベンダーが作っているものがたくさん存在することがあります。
そのような場合は、使われてる数(DL数)や、スターの数を見て多くの人が使っているもの等を使うと無難だと思います。


https://packagist.org/
OSXでAtom ShellのTray APIを使う時のメモ

![tray.jpg](https://qiita-image-store.s3.amazonaws.com/0/3458/f3db03b0-98ee-0baa-a38a-96fb8b7d8631.jpeg)

# でかいアイコン表示するとメニューバーがそれで埋まってしまうｗ
 
Windowsはアイコンサイズ調整してくれるのにねぇ

# Retina向けのサイズ

正方形だと18x18当たりが狙い目の模様

```
convert -geometry 18x18 iconOriginalSize.png icon.png 
```

```js:main.js
var app = require('app'); // Module to control application life.
var BrowserWindow = require('browser-window'); // Module to create native browser window.
var Menu = require('menu');
var Tray = require('tray');
var appIcon = null;
var contextMenu = null;
// Keep a global reference of the window object, if you don't, the window will
// be closed automatically when the javascript object is GCed.
var mainWindow = null;
// Quit when all windows are closed.
app.on('window-all-closed', function() {
  if (process.platform != 'darwin')
    app.quit();
});
// This method will be called when atom-shell has done everything
// initialization and ready for creating browser windows.
app.on('ready', function() {
  appIcon = new Tray(__dirname + '/icon.png');
  contextMenu = Menu.buildFromTemplate([{
    label: 'Item1',
    type: 'radio'
  }, {
    label: 'Item2',
    type: 'radio'
  }, {
    label: 'Item3',
    type: 'radio',
    checked: true
  }, {
    label: 'Item4',
    type: 'radio'
  }, ]);
  appIcon.setToolTip('This is my application.');
  appIcon.setContextMenu(contextMenu);

  // Create the browser window.
  mainWindow = new BrowserWindow({
    width: 800,
    height: 600
  });
  // and load the index.html of the app.
  mainWindow.loadUrl('about://blank');
  mainWindow.openDevTools();

  // Emitted when the window is closed.
  mainWindow.on('closed', function() {
    // Dereference the window object, usually you would store windows
    // in an array if your app supports multi windows, this is the time
    // when you should delete the corresponding element.
    mainWindow = null;
  });
});


```

# 関連記事

- [JavaScriptオンリーでタスクトレイに我が子を表示する](https://abrakatabura.hatenablog.com/entry/2014/06/25/062842)
- [Atom Shellでデスクトップキャプチャー（動画）アプリ](https://abrakatabura.hatenablog.com/entry/2014/05/29/075150)
lablglutが動かない場合

# 背景

OCamlはOcamlと誤って書くだけでもツイッターでは怒られるので、怖いのですが、自分用のメモとして書いておきます。

opamで入れたlablglのlablglutコマンドが以下のように動かなかった。

しかも、Ubuntu 12.04、OSXともにNGだった。


```shell-session
$ lablglut 
Cannot find file lablgl.cma.
```

# 解決方法

```
which lablglut
```
して出て来たファイルをテキストエディタで開く

```
atom ~/.opam/system/bin/lablglut
```

ocamlコマンドの引数と変更する。

```
exec ocaml -I ~/.opam/system/lib/lablgl lablgl.cma lablglut.cma $*
```

のように-Iの指定を

```
ocamlfind query lablgl
```

で得られたパスに書き換えれば、動いた。

# 別件かもだが

opamを去年入れていたが、今回久しぶりに動かしたら、新しくなって、
.bashrcやOSXのターミナル向けの.bash_profileのopamの設定も
変わったいた

## 以前

```
. ~/.opam/opam-init/init.sh > /dev/null 2> /dev/null || true
```

## 現在

```
eval `opam config env`
```

この辺り、気付かず、ocamlfindがopamで入れたlablglを認識してくれないこともあった。

# 関連記事

- [Mavericksにしたからかutopが動かなくなっていた #OCaml #opam #solved](http://abrakatabura.hatenablog.com/entry/2013/12/23/220415)
- [OCaml(OpenGL)で「プログラムでシダを描画する」を通して学んだことのまとめ](http://abrakatabura.hatenablog.com/entry/2014/07/03/064416)
- [OSXで最速でOCamlでPostgresqlに接続するには](http://abrakatabura.hatenablog.com/entry/2013/06/27/064038)
- [WindowsにOCaml入れようとしてocamlfindが動かない件](http://abrakatabura.hatenablog.com/entry/2017/05/02/072551)
- [Windowsで公式のOCamlをいれて、utop動かすところまで出来た](http://abrakatabura.hatenablog.com/entry/2017/05/04/074542)
ナンバーマジック

　う〜ん・・・解けたは解けたけど・・・bitを用いて全探索した気がしないなぁ。肩すかしを食らった気分です（笑）やった事は、ただビットへ変換を行って、それを配列の要素（ビットで考慮）と比較して一致していたら添字＋１を出力ってだけなので構造はかなり単純です。
問題元：SRM484 Div2 Level1
問題文：
　タローがハナコに手品を見せようとしています。
タロー：ハナコさんこんにちは。手品を見せて挙げようか？１６以下の正の整数を頭の中で思い浮かべ　　　　てみてくれる？
ハナコ：OK。思い浮かべたわ。
タロー：（ハナコにカード１を見せながら）このカードの中にハナコさんの数字、入っている？
ハナコ：あるわ。
タロー：（ハナコにカード２を見せながら）このカードの中にハナコさんの数字、入っている？
ハナコ：ないわ。
タロー：（ハナコにカード３を見せながら）このカードの中にハナコさんの数字、入っている？
ハナコ：あるわ。
タロー：（ハナコにカード４を見せながら）このカードの中にハナコさんの数字、入っている？
ハナコ：あるわ。
タロー：ハナコさんの数字は、５ですね！
各カード集合の中身：
Card1:1, 2, 3, 4, 5, 6, 7, 8
Card2:1, 2, 3, 4, 9, 10, 11, 12
Card3:1, 2, 5, 6, 9, 10, 13, 14
Card4:1, 3, 5, 7, 9, 11, 13, 15

この手品をシミュレートするプログラムを書いてください。ハナコの回答が文字型変数answerで与えられます。i番目の文字が'Y'であれば、i番目のハナコの回答は"YES"です。'N'であれば、i番目のハナコの回答は"NO"です。ハナコが頭の中で思い浮かべた数字をinteger型で返してください。

```java:
public class Main {
	int theNumber(String answer) {
		int[] ary = {15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0}; //この要素に当てはまる数は答えが(r + 1)となる
		int sum = 0;
		int count = 0;
		for(int r = 3; r >= 0; r--) {
			if(answer.charAt(r) == 'Y') {
				sum += Math.pow(2, count); //Math.pow()は第３引数をとるので本来ならばあまり推奨されない。
			}
			count++;
		}
		int ans = 0;
		for(int r = 0; r < ary.length; r++) {
			if(sum == ary[r]) {
				ans = r + 1;
			}
		}
		return(ans);
	}
	
	void doIt() {
		String[] str = {"YNYY", "YNNN", "NNNN", "YYYY", "NYNY"};
		
		System.out.println((theNumber(str[0])));
		System.out.println((theNumber(str[1])));
		System.out.println((theNumber(str[2])));
		System.out.println((theNumber(str[3])));
		System.out.println((theNumber(str[4])));
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new Main().doIt();
	}
}
```
サーバの基礎: httpd(apache)の基本設定

#httpdの基本設定

## デフォルト設定の変更
インストール直後のデフォルト設定のままだと、サーバ管理者のデバッグ・動作確認のために、レスポンスに様々な情報が出力される.

しかし、セキュリティ上に隠蔽しておきたい情報もあるので、サーバを外部公開する前にに、最低限以下の項目は変更しておきたい.

~~~apacheconf:/etc/httpd/conf/httpd.conf

# OS/Fullの場合、レスポンスヘッダにOS,apacheのバージョンを出力.
# apache であることだけを出力する ProductOnly に変更.
ServerTokens ProductOnly 

# Onの場合、エラー時にOS,apacheバージョン,ポート番号等を署名として出力.
# 署名を非表示にする Off に変更.
ServerSignature Off

# Onの場合、レスポンスヘッダにリクエストの内容(認証/Cookie等)も出力.
# デフォルトでは未記述もOnなので、Off設定を新たに追記.
TraceEnable Off

~~~
proxmoxでVM is locked (backup)が出て起動できない場合

## KVMの場合

* [[SOLVED] Problem with backup qemu/kvm VID](http://forum.proxmox.com/threads/3777-SOLVED-Problem-with-backup-qemu-kvm-VID)

```bash:
qm unlock 203
```

## LXCの場合(proxmox4)

* [TASK ERROR: VM is locked (snapshot) | Proxmox Support Forum](https://forum.proxmox.com/threads/task-error-vm-is-locked-snapshot.24012/)

```bash:
pct unlock 301
```
proxmoxでbackupからリストアに失敗する場合

proxmoxが稼働しているサーバ自体をRebootさせればよい。

```bash:リストア失敗時のメッセージ
you choose to force overwriting VPS config file, private and root directories.
extracting archive '/media/usb2tb//dump/vzdump-openvz-108-2014_06_10-01_43_00.tar.lzo'
Total bytes read: 469022720 (448MiB, 156MiB/s)
restore configuration to '/etc/pve/nodes/antec/openvz/108.conf'
TASK ERROR: unable to open file '/etc/pve/nodes/antec/openvz/108.conf.tmp.864779' - Input/output error
```

```bash:書き込みできない・・だと？
root@antec:/etc/pve/nodes/antec/openvz# ls -lh
合計 5.5K
-rw-r----- 1 root www-data  968 12月 16  2013 108.conf
root@antec:/etc/pve/nodes/antec/openvz# touch aaa
touch: `aaa' に touch できません: 入力/出力エラーです
root@antec:/etc/pve/nodes/antec/openvz# df -h .
ファイルシス   サイズ  使用  残り 使用% マウント位置
/dev/fuse         30M   28K   30M    1% /etc/pve
```

再起動で治った。
fstabでマウントさせずにcronでマウントさせよう

fstabの6番目のオプション(最後のオプションのこと)が1だとブート時にファイルシステムのチェックが入る。

ブート時には/dev/drbd0がないのでエラーになって途中で止まる。

```bash:/etc/fstab
# 最後のオプションは0
/dev/drbd0  /srv   ext4   noauto 0 0
```

/etc/rc2.d/S19drbd, /etc/rc2.d/S20cron
であるため以下でよい。

```bash:crontab&nbsp;-e
@reboot mount /srv
```
Swiftに関するメモ その8 - ネストされた型


* [
Swiftに関するメモ - 一覧](http://qiita.com/takkyun/items/f34abf857deed808c610)

https://developer.apple.com/swift/ より

[The Swift Programming Language (iBooks Store)](https://itunes.apple.com/us/book/the-swift-programming-language/id881256329?mt=11)をざっくり目を通してつらつらと。

# ネストされた型宣言 (Nested Types)

クラスや構造体の中で、独自のクラスや構造体、列挙型を定義することができます。

基本形：

```swift
class SomeClass {
  class InternalClass {
  }
  enum InternalEnum {
  }
  struct InternalStructure {
  }
}
```

それらはもちろん内部で変数や定数に利用できます。

```swift
class SomeClass {
  class InternalClass {
  }
  enum InternalEnum {
  }
  struct InternalStructure {
  }
  var aClass : InternalClass?
  var anEnum : InternalEnum?
  var aStruct : InternalStructure?
}
```

## ネストされた型を参照する

`.` を使って内部で宣言されたクラス、構造体などにアクセスすることができます。

```swift
class SomeClass {
  enum InternalEnum {
    case someValue
  }
}

let value = SomeClass.InternalEnum.someValue
```

---

## 以下、余談

とりあえず、ここまでで残っているセクションが

* Extensions : (クラス・構造体・列挙型の) 拡張
* Protocols : プロトコル
* Generics : ジェネリクス
* 特殊な演算子

なんですが、分量にして全体のおおよそ 1/3 程度にもなってしまうかなりボリュームのある内容です。ざっくりとは眺めておきたいところではあるんですが……。
Docker の nsinit を CoreOS で試してみた

[Attaching to a container with Docker 0.9 and libcontainer](http://jpetazzo.github.io/2014/03/23/lxc-attach-nsinit-nsenter-docker-0-9/) を参考に CoreOS で nsinit を試してみました。

流れ
1. Vagrant で CoreOS を起動する。
2. 適当なイメージでコンテナを作成する。
3. golang + `gcc` の環境が必要なので、`toolbox` を使う。
4. `nsinit` をビルドする。
5. `nsinit` を使ってコンテナにログインする。

```bash
$ vagrant init -m yungsang/coreos-alpha
$ vagrant up
$ vagrant ssh
   ______                ____  _____
  / ____/___  ________  / __ \/ ___/
 / /   / __ \/ ___/ _ \/ / / /\__ \
/ /___/ /_/ / /  /  __/ /_/ /___/ /
\____/\____/_/   \___/\____//____/
(alpha 349.0.0)
core@localhost ~ $ docker pull yungsang/busybox
core@localhost ~ $ docker run -d -p 8080:8080 yungsang/busybox nc -p 8080 -l -l -e echo hello world!
851e2caaea566342ca2d32bfbd6542041a07af6c2ff54f5cd82f6d1be23953e8
core@localhost ~ $ docker ps
CONTAINER ID        IMAGE                     COMMAND                CREATED             STATUS              PORTS                    NAMES
851e2caaea56        yungsang/busybox:latest   nc -p 8080 -l -l -e    9 minutes ago       Up 9 minutes        0.0.0.0:8080->8080/tcp   clever_wright
core@localhost ~ $ toolbox
Pulling repository fedora
3f2fed40e4b0: Download complete
64fd7993bcaf: Download complete
511136ea3c5a: Download complete
fd241224e9cf: Download complete
core-fedora
Spawning container core-fedora on /var/lib/toolbox/core-fedora. Press ^] three times within 1s to abort execution.
/etc/localtime is not a symlink, not updating container timezone.
[root@localhost ~]# curl -OL http://golang.org/dl/go1.2.2.linux-amd64.tar.gz
[root@localhost ~]# tar zxvf go1.2.2.linux-amd64.tar.gz
[root@localhost ~]# export GOROOT=$HOME/go
[root@localhost ~]# export PATH=$PATH:$GOROOT/bin
[root@localhost ~]# mkdir gocode
[root@localhost ~]# export GOPATH=$HOME/gocode
[root@localhost ~]# export PATH=$PATH:$GOPATH/bin
[root@localhost ~]# yum install -y git gcc
[root@localhost ~]# go get github.com/docker/libcontainer/nsinit
[root@localhost ~]# ls -l $GOPATH/bin
total 7904
-rwxr-xr-x 1 root root 8093520 Jun 18 19:35 nsinit
[root@localhost ~]# cd /media/root/var/lib/docker/execdriver/native/851e2caaea566342ca2d32bfbd6542041a07af6c2ff54f5cd82f6d1be23953e8
[root@localhost 851e2caaea566342ca2d32bfbd6542041a07af6c2ff54f5cd82f6d1be23953e8]# nsinit exec sh
/ # ps
PID   USER     COMMAND
    1 root     nc -p 8080 -l -l -e echo hello world!
    7 root     sh
   12 root     ps
/ # 
```
アプリケーションごとのウインドウ復元設定

システム環境設定の設定をオーバーライドする。

常に無効化
```
$ defaults write <#application bundle id#> NSQuitAlwaysKeepsWindows -bool false
```

常に有効化
```
$ defaults write <#application bundle id#> NSQuitAlwaysKeepsWindows -bool true
```
Mac OSXでPythonフレームワークDjangoをはじめる

[Python](https://www.python.org/)フレームワーク[Django](https://www.djangoproject.com/)のチュートリアルをMac環境ではじめるためのメモ。

## 環境チェック

```
% uname -a
Darwin grappa.local 13.2.0 Darwin Kernel Version 13.2.0: Thu Apr 17 23:03:13 PDT 2014; root:xnu-2422.100.13~1/RELEASE_X86_64 x86_64

% python
Python 2.7.5 (default, Mar  9 2014, 22:15:05) 
[GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.0.68)] on darwin
Type "help", "copyright", "credits" or "license" for more information.

%  which python 
/usr/bin/python
```

## インストール

`Python`パッケージマネージャー[pip](https://pypi.python.org/pypi/pip)をインストール

```
sudo easy_install pip
```

`django`のインストール

```
sudo pip install django
```

`Python`プロンプトでインストールの確認

```
% python
Python 2.7.5 (default, Mar  9 2014, 22:15:05) 
[GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.0.68)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import django
>>> print django.get_version()
1.6.5
```

1.6.5がインストールできた!

ついでに[Homebrew](http://brew.sh/)で見つけた便利そうなな奴

```
brew install homebrew/completions/django-completion
```

## チュートリアルをはじめる

Django1.4用だけど[日本語チュートリアル](http://docs.djangoproject.jp/en/latest/intro/tutorial01.html)があったので最初の方やってみる


```
% django-admin.py startproject mysite
% tree mysite
mysite
├── manage.py
└── mysite
    ├── __init__.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py

1 directory, 5 files
```

```
% python manage.py runserver
Validating models...

0 errors found
June 13, 2014 - 23:18:08
Django version 1.6.5, using settings 'mysite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
```

ブラウザで http://127.0.0.1:8000/ を開くと`Welcome to Django`!

![Welcome to Django](https://www.evernote.com/shard/s1/sh/80d58bdb-0052-4fd3-967a-c6b8c9642ff2/a4d6cdb7654dbb9853a7dd57bdd1de92/deep/0/Welcome-to-Django.png)

![Django Site Admin](https://www.evernote.com/shard/s1/sh/84f76c75-384e-4276-8962-fa1c0928d74c/2ad6a59d450638c8629ef65192a713ce/deep/0/Log-in---Django-site-admin.png)


```
-> % python manage.py syncdb
Creating tables ...
Creating table django_admin_log
Creating table auth_permission
Creating table auth_group_permissions
Creating table auth_group
Creating table auth_user_groups
Creating table auth_user_user_permissions
Creating table auth_user
Creating table django_content_type
Creating table django_session

You just installed Django's auth system, which means you don't have any superusers defined.
Would you like to create one now? (yes/no): yes
Username (leave blank to use 'tumf'): 
Email address: y.takahara@gmail.com
Password: 
Password (again): 
Superuser created successfully.
Installing custom SQL ...
Installing indexes ...
Installed 0 object(s) from 0 fixture(s)
```
Ctrl-cの強制停止はrescueで補足できる

Unix系においてプログラムの強制終了、停止でCtrl-cを使うことは周知のことかと思いますが
Rubyでも実行中にCtrl-cをすることで止めることができます。

百聞は一見にしかず。サンプルソースです。

```rb:sample.rb
begin
  sleep 1000
rescue Interrupt
  p 'exec Ctrl-C!'
end
# => "exec Ctrl-C!"
```

ということで、放っておいたら1000秒も待ってしまうプログラムです。
プログラムが実行されている間にCtrl-cをするとRubyでは例外クラスの一つである`Interrupt`が発生します。

> [class Interrupt | Ruby 2.1.0 リファレンスマニュアル](http://docs.ruby-lang.org/ja/2.1.0/class/Interrupt.html)

rescueは、捕捉するクラスを指定しない場合には`StandardError`に属するエラーだけを補足します。
`Interrupt`は`StandardError`ではなく`SignalException`クラスに属しているため、指定しなかった場合には捕捉されません。

Rubyでは他にも`ScriptError`なんかもあるので、これらを使えば自前でエラーが起きている箇所をもう少し分かりやすくするような構文チェックライブラリのようなものも作ることができるのではないかな、と思います。要るのかはさておき。

そもそもこのtipsも、どんな場面で使うねん、という気がしなくもないです。
例えば何かDBを更新するようなバッチがあるとして開発用に
`rescue Interrupt`したときにロールバックするような実装にしておくとか、いかがでしょうか。
僕はたぶん使いません。


<small>※本文は個人ブログの記事の焼き直しです。</small>
setup.py の extras_require を活用する


## 背景

python で新しいパッケージを作成する場合、setup.py に install_requires を書いて、

```bash:bash
$ python setup.py develop
```

で依存パッケージをインストールしますよね。

ただしこれだと、文書生成でのみ依存する sphinx や、テストでのみ依存する py.test などを管理するには不便です。

## extras_require を活用する

extras_require を利用すれば、コンテキスト依存の依存パッケージを定義することができます。

```python:setup.py
from setuptools import setup

setup(
    name='foo',
    packages=['foo'],
    install_requires=[
        "flask",
    ],
    extras_require = {
        'test': ['pytest'],
        'doc': ['sphinx'],
    },
)
```

pip を用いて編集モードでパッケージをインストールすれば、 setup.py develop と同じようにして、テストや文書作成用のモジュールもインストールできます。

```bash:bash
$ pip install -e .[test]
```

##参考
- https://bitbucket.org/tarek/distribute/issue/130
- https://pip.pypa.io/en/latest/reference/pip_install.html#examples

```bash:bash
$ pip install SomePackage[PDF]
$ pip install SomePackage[PDF]==3.0
$ pip install -e .[PDF]==3.0  # editable project in current directory
```
do ～ endと { ～ }の結びつきの違いについて

タイトルでネタバレしつつある気がしますが、唐突に問題を出してみます。

```rb:sample1.rb
data = {'hoge' => false}
p data.any? do |key, val|
  val
end
```

この結果は何が出力されるでしょう？
`any?`といえば、レシーバの要素が全てfalseyのときだけfalse、1つでもtruthyの要素があればtrueを返すEnumerableのメソッドです。

false、と答えた人はたぶん
「valがfalseなんだから、そりゃfalseだろ」って認識だと思います。

trueと答えた人は
「そんな聞き方するってことはtrueだろ」って人と
ちゃんと理由が分かる人の二種類がいると思います。
後輩に訊ねたところ、前者の答えが返ってきていささか面白くなくてぷんすこです。

結果は当然流れ的にtrue。

はて、ここで何が起きているのか？
ここで掲題の話になるわけです。

公式ドキュメントにはこうあります。

>{ ... } の方が do ... end ブロックよりも強く結合します
[Ruby 2.1.0 リファレンスマニュアル](http://docs.ruby-lang.org/ja/2.1.0/doc/spec=2fcall.html)

つまり

```rb:sample1.rb
data = {'hoge' => false}
p(data.any?) do |key, val|
  val
end
# => true
```

こうなっちゃってたわけですね。
`data.any?`にはブロックを渡しておらず、`data`の要素が全部偽であることのチェックをした結果を出力していたわけです。
また`data`はHashなので、空Hashでもない限りは要素を持っている＝trueとなりますので、こういった結果になっていたわけです。

ここで`do ... end`ではなく`{ ... }`を使用している場合は想定通りの結果になります。

```rb:sample2.rb
data = {'hoge' => false}
p data.any? { |key, val|
  val
}
# => false
```

また、`p`がブロックを受けてゴニョゴニョするようなメソッドだったらまた違った結果になっていたことでしょう。


`do ... end`と`{ ... }`の結びつきの違いの話は非常に有名ですが、初心者ですと違いが分からずに同じようにハマるかもしれないのでここに共有しておきます。

私の場合も独自のコーディングルールで

>ワンライナー(1行)で記述する際は { ... }を使い、
>ワンライナーで可読性が落ちる場合には do ... end で複数行で記述しましょう。

というものがありまして、それを守りつつ`any?`の挙動を確認しているときに引っかかってしまいました。
【メモ】とりあえずUbuntuに追加するaptリポジトリ

# GitとOracle JDKのPPAリポジトリを追加
```
sudo add-apt-repository ppa:git-core/ppa
sudo add-apt-repository ppa:webupd8team/java
```

# Cassandraのリポジトリを追加(optional)
```
sudo sh -c "echo deb http://www.apache.org/dist/cassandra/debian 20x main > /etc/apt/sources.list.d/cassandra.list"
```

# MongoDBのリポジトリを追加(optional)
```
sudo sh -c "echo deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen > /etc/apt/sources.list.d/mongodb.list"
```

# MySQLのリポジトリを追加(optional)
[ここ](http://dev.mysql.com/downloads/repo/apt/)から、debパッケージをダウンロードして、```dpkg -i```で入れる

# dockerのリポジトリを追加
```
wget -qO- https://get.docker.com/ | sh
```

# 各aptリポジトリが使う公開鍵のインポート(必要に応じて)
```
gpg --keyserver pgp.mit.edu --recv-keys 8C718D3B5072E1F5
gpg --export --armor 8C718D3B5072E1F5 | sudo apt-key add -
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys D8576A8BA88D21E9
```
PHPでクラスライブラリを再帰的に探索して自動でrequireするオートローダーを書いてみた


Composerのおかげで、外部ライブラリの読み込みを気にする必要がなくなった。しかし、自前のライブラリは依然として手作業でrequire_onceしていて、これが面倒のもと。

PHPunitでテストするときも、オートローダーがないと依存関係をいちいち管理しなくてはならず、これも面倒。

実をいうと、「オートローダーのオーバーヘッドってどうよ？」とか思ってたんだけど、Composerを導入した時点でオートローダーに頼ることは決定したわけで、だったら徹底的にオートローディングしたい。

また、クラスのファイルはなるべくディレクトリを階層化して整理したい。

というわけで、再帰的にクラスを探索するオートローダーです。

以下は、現在制作中の新しいミニ・フレームワークのためのものですが、18行目をコメントアウトして、33行目〜35行目を自分の環境に合わせて書き換えれば、そのまま使える……かも（Composerを使っていないなら、15行目も不要）。

```autoload.php

<?php
/**
 * 必要なクラスを自動的にロードする
 *
 *
 * @copyright	Tomoyuki Negishi and ZubaPitaTech Y.K.
 * @author		Tomoyuki Negishi <tomoyu-n@zubapita.jp>
 * @license	http://www.opensource.org/licenses/bsd-license.php The BSD License
 * @package	Min - Minimam INter framework for PHP
 * @version	1.0
 */

// Composerのautoloder呼び出し
$APP_ROOT = dirname(__DIR__);
require_once $APP_ROOT.'/vendor/autoload.php';

// フレームワークの設定ファイルを読み込み
require_once $APP_ROOT.'/etc/conf.php';

/**
 * Classファイルをロードする
 * 
 * @param string $class クラス名
 * @param boolean Classのロードに成功したときtrue、失敗のときfalse
 */
function autoLoadClass($class)
{
	$classFile = $class.'.php';
	$appRoot = dirname(__DIR__);
	
	// クラスファイルを探索するディレクトリ
	$classDirs = array(
		'lib',
		'model',
		'controller',
	);
	
	foreach ($classDirs as $dir) {
		if (searchClassInDir("$appRoot/$dir", $classFile)) {
			return true;
		}
	}
	return false;
}


/**
 * リカーシブにディレクトリを探索してClassファイルをロードする
 * 
 * @param string $dir 探索するディレクトリ名
 * @param string $classFile クラスファイル名
 * @param boolean Classのロードに成功したときtrue、失敗のときfalse
 */
function searchClassInDir($dir, $classFile)
{
	$files = glob("$dir/*");
	if (!empty($files)) {
		foreach ($files as $subFilePath) {

			if (is_dir($subFilePath)) {
				if (searchClassInDir($subFilePath, $classFile)) {
					return true;
				}
			} else {
				$fileName = basename($subFilePath);
				
				if ($fileName==$classFile) {
					require_once $subFilePath;
					return true;
				}
			}
		}
	}
	return false;
}

/**
 * オートローディング関数を登録
 */
spl_autoload_register( "autoLoadClass");


```
IE7でaの中のspan がクリックできない

#IE7だけaの中のspanがクリックできない

- ```display: block;```のときはクリックできない。
- ```display: table-cell;（display: inline;zoom: 1;）```のときはクリックできない。
- ```display: inline;```ではクリックできる。


#解決策
aの外側をhasLayout: trueにし、spanを```position: relative;z-index: -1;```にする。

##display: block;のとき

```html
/* HTML */
<ul class="clearfix">
	<li><a href="http://jsdo.it"><span class="pic"><img src="http://dummyimage.com/200x150/000/fff" alt=""></span><span>クリックできない</span></a></li>
</ul>
```

```css
/* CSS */
li a span {
	display: block;
}
↓
li a span {
	position: relative;
	display: block;
	z-index: -1;
}
```

デモ：http://jsdo.it/Ituki/agn4
参考：http://www.brunildo.org/test/IEaL.html

##display: table-cell;（display: inline;zoom: 1;）のとき

```
/* HTML */
<ul>
	<li><a href="http://jsdo.it/"><span><img src="http://dummyimage.com/50x50/000/fff" alt=""></span><span>クリックできない</span></a></li>    
</ul>
```

```css
/* CSS */
li {
	margin-top: 5px;
	list-style: none;
}

li a span {
	display: table-cell;
	/display: inline;
	/zoom: 1;
	vertical-align: middle;
}
↓
li {
	margin-top: 5px;
	list-style: none;
	/zoom: 1;
}

li a span {
	position: relative;
	display: table-cell;
	/display: inline;
	/zoom: 1;
	vertical-align: middle;
	z-index: -1;
}
```

デモ：http://jsdo.it/Ituki/aQhn

#おまけ。display: block;のときにbugfixしてもクリックできないときは・・・
親にposition: relative;がかかっていないか調べる。
※clearfixに含まれている場合もある。
デモ：http://jsdo.it/Ituki/agn4
PHPの外部ライブラリ管理ツール「Composer」はHomebrewで簡単にインストールできる


SmartyとかPHPunitとかphpQueryとかPHPExcel／Wordとか、いろいろライブラリを使うけど、最新版を持ってきてとかめんどい。

とくに自分の作ったものを配布するときに、他のフリーソフトウェアをパッケージ内に含めたいときにライセンスの管理も気になる。

世の中に「Composer」という便利な物があるらしいと、GitHubのあちこちで見かけていたけど、いままで時間がなくてスルーしてた。けど、ちょっと調べたら、とっても簡単便利で、使ってなかった自分を絞め殺したくなった。

## Homebrewでインストール

MacでHomebrewを使っていれば、Composerは一撃でインストールできる。

```
$ brew install composer
```

作成したPHPプログラム内でSmartyを使いたいときは、そのプログラムの一番上のディレクトリに「composer.json」というファイルを置く。

```composer.json

{
    "require": {
        "smarty/smarty": "v3.1.18",
    }
}

```

あとは、同じディレクトリでインストールコマンドを打つだけ。

```
$ composer install
```

すると、「vender」というサブディレクトリが掘られて、その下にSmartyがインストールされる。

あとは、PHPプログラムの先頭で

```hoge.php
<?php
require_once 'vendor/autoload.php';
```

みたいな感じで読み込んでおけば、

```hoge.php
$Smarty = new Smarty;
```

みたいに必要になった瞬間に自動的にrequireしてくれる。

## 複数のライブラリを使ったり削除したりも簡単

複数の外部ライブラリを使いたい場合は、次のように記述する。

```composer.json

{
    "require": {
        "smarty/smarty": "v3.1.18",
		 "php-console/php-console": "3.*",
	  	 "phpunit/phpunit": "4.1.2",
    }
}

```

composer.jsonを修正したらupdateコマンドを打つ。

```
$ composer update
```

ライブラリを削除するときも、composer.jsonから削除して「$ composer update」でOK。


##ライブラリの検索

使いたいライブラリは以下のサイトで検索する。

https://packagist.org/

PEARのパッケージもメジャーどころは登録されているようなので、ライブラリ管理はComposerに一本化してよさそう。
optimizelyみたいに他のサイトをJSでいじくる

Optimizelyみたいに、Webサイトに対してのWYSIWIG操作を提供したい場合。
または、オーバレイして何か表示したいとか。（Analytics系のツールとかで）

素直にiframeで埋め込んでやろうとしても、ドメインを跨いだ操作はセキュリティの問題で無理。
そもそもiframeでembedになることを拒否するサイトもある。

HTMLをそのままもってきて表示してやりたい。
そうすれば、クロスドメインでないので、JSで自由にアクセス出来る。

しかし、HTMLだけそのままぶっこ抜くと、ページ内のリソースのURLがおかしくなる。相対パスで読んでいる画像/CSS/JSは全てデッドリンクになってしまう。
また、こちらのドメインにあるリソースを間違って読んでしまう可能性もあるだろう。
このとき、ソースを解析して、相対パスで読んでるリソースを全て絶対パスに…というのは面倒。
手っ取り早く、相対パスのベースURLを書き換えたい…

驚くべきことに、これをやるタグがあります。

`<base>`

なので、フローとしてはこんな感じ

1. サーバで対象サイトにリクエストを飛ばしてHTMLをもらう
2. HTMLを弄る。
  1. `<base herf="元ページのURL">`を足す
  2. JSを足す
  3. `position:fixed;`とかでUIを足す。
  4. `<script>`が怖ければ除いておく。（ただし、`<script>`無ければ正しく表示されないサイトが多い…）
3. 2.で生成したHTMLを返す

あとは、GAとかoptimizelyみたいに、ベンダーが提供するJSを予めページに入れることが分かっているサービスなら、`<iframe>` + `window.postMessage()`を使った実装が出来ます。
むしろ、こっちのほうが主流。

#参考

kimono http://www.kimonolabs.com/
optimizely https://www.optimizely.com/
GoogleAnalytics http://www.google.com/analytics/
ScrapingHub http://scrapinghub.com/
Win版Atomを自分でビルドする

最近オープンソースになったエディタ「Atom」
さっそく使ってみたいのに[公式HP](https://atom.io/)には~~Mac版しかない！(2014/06/18現在)~~
→(2014/07/09)ついにWindows版出ました！！http://blog.atom.io/2014/07/09/hello-windows.html


なので自分でビルドしてみる。
というのも、ちゃんと[Github](https://github.com/atom/atom/blob/master/docs/build-instructions/windows.md)にビルドの方法が書いてます。


>各種誘導

他の解説では[@BeMarble](http://qiita.com/BeMarble)様の[Windows8でAtomをビルドするメモ](http://qiita.com/BeMarble/items/17107fdb08dd27714114)が参考になります。

Windows7 64bit を利用されている方は[@Katsumata_RYO](http://qiita.com/Katsumata_RYO)様が[こちら](http://qiita.com/Katsumata_RYO/items/0c5003308b620366307f)でまとめられています。

自分でビルドするのが面倒！という方は
[Someguy123's Atom Builds for Windows](http://atom.someguy123.com/#sthash.4vDQO1Tw.dpbs)というサイトでビルド済みのATOMがあります。（[@shiena](http://qiita.com/shiena) 様 情報提供ありがとうございます！）
※ダウンロードはもちろん自己責任でお願いします。
※ビルドに関しても毎日のようにソースが更新されていますし、まだ正式リリースがされていないのでご注意下さい。

ここではWindows8の場合を紹介します。
>準備するもの

* [Visual Studio Express 2013 for Windows Desktop](http://www.microsoft.com/ja-jp/download/details.aspx?id=40787)
* [node.js v0.10.x](http://nodejs.org/)
* [Python v2.7.x (required by node-gyp)](https://www.python.org/)
* [GitHub for Windows](https://windows.github.com/)

※各種環境変数のPATHは通して下さい。(自分はnode.jsのパスが通ってませんでした)

githubからソースをダウンロードして下さい。直接ダウンロードしてきてもいいですし、gitを使う場合は

```lang:コマンドプロンプト
git clone https://github.com/atom/atom/
```
でダウンロードできます。
その後atomフォルダに移動し

```lang:コマンドプロンプト
script\build
```

でビルドが開始します。
無事成功するとProgram FilesのAtomにビルドされています。
[Swift]演算子の定義

## 演算子の定義

2-tupleの```==```演算子を定義してみた

```swift
@infix func ==<T1: Equatable, T2: Equatable> (left: (T1, T2), right: (T1, T2)) -> Bool {
  return left.0 == right.0 && left.1 == right.1
}

(0, 1) == (0, 1) // true
(1, "a") == (1, "a") // true
```
あなたが絶対に覚えておくべきフレームワーク、AngularJSのサワリ！

> 本稿は[JavaEEのアーキテクチャを再興する。（まとめページ）](http://qiita.com/ukiuni@github/items/b9d18b44570ece0e3933)の一部です。

[AngularJS](https://angularjs.org/)をご存知でしょうか？Webシステムのクライアント、つまりはWebブラウザ上で動作するJavaScriptのフレームワークです。
先日ご紹介した[hogan.js](http://qiita.com/ukiuni@github/items/3653902e86bca75801d8)が、データから画面を作成する機能を持っていましたが、AngularJSはデータと画面を双方向で結びつけることができます。


入力が複雑なアプリケーションを作る場合はAngularJSのデータと画面を結びつける機能がとても有効に使えます。一度AngularJSを覚えてしまうと、AngularJSなしでWebアプリケーションを作るなんて考えられなくなってしまうことでしょう！

# サンプル
本稿では、AngularJS+Javaで作ったTODOアプリを紹介します。ソースコードはgithub上に[公開](https://github.com/ukiuni/AngularJSInspect)してあります。

 # 説明
セットアップは簡単。AngularJSをダウンロードして設定するだけです。サンプルでは簡易に試すために、以下のコードで読み込んでいます。

```html
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.0-beta.13/angular.min.js"></script>
```
読み込むファイルはこれだけ、簡単ですね。

AngularJSのキモはControllerです。幾つか実装方法はありますが、ここでは最も簡単に、関数をひとつ作るだけでControllerを作成しています。

```js:index.htmlから抜粋
var TodoController = function($scope, $http) {
		$http.get('api/loadMemos').success(function(data, status, headers, config) {
			$scope.memos = data
		}).error(function(data, status, headers, config) {
			$scope.accessError = "error occur";
		});
		$scope.addMemo = function() {
			$scope.memos.push({});
		}
		$scope.save = function() {
		$http.put("api/putMemos", $scope.memos)
	}
}
```
クライアントサイドのJavaScriptはこれだけ！TodoControllerがコントローラです。初期化時に、api/loadMemosからデータをとってきて、画面に表示しています。
また、addMemoとsaveという関数を定義しています。
このコントローラをHTMLと関連付けています。関連付け方も簡単。HTMLにAttributeとして挿入するだけです。

```html:index.htmlから抜粋
<div ng-controller="TodoController">
	<div ng-repeat="memo in memos">
		<input type="text" ng-model="memo.text">
	</div>
	<button ng-click="addMemo()">add</button>
	<br />
	<button ng-click="save()">save</button>
	<span style="color: red">{{accessError}}</span>
</div>
```
キモは、ng-XXXXXというAttributeです。ng-controllerでコントローラを指定、ng-modelで、どのデータと画面をひもづけるかを設定しています。ng-repeatのmemosは、javaScript中の$scope.memosを指しています。

触ってみると、ほんとうに簡単にインタラクティブなWebページを作成できます。ぜひお試しください。
python3.4 にpandas0.14をインストールする[on Mac]

homebrewでのインストールがうまく行かなかったのでソースコードからインストールした。
wget -i https://pypi.python.org/packages/source/p/pandas/pandas-0.14.0.tar.gz
tar xvf pandas-0.14.0.tar.gz
cd pandas-0.14.0
sudo python3.4 setup.py install

一旦端末を閉じる
$python3.4
...
import pandas
/opt/local/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/pandas-0.14.0-py3.4-macosx-10.9-x86_64.egg/pandas/io/excel.py:626: UserWarning: Installed openpyxl is not supported at this time. Use >=1.6.1 and <2.0.0.
  .format(openpyxl_compat.start_ver, openpyxl_compat.stop_ver))
Rubyの例外処理に関して色々、復習してみた。

Ruby歴2年になった自分が初心に戻って、
例外処理を再復習するために学んだまとめ。

## 例外処理
### rescue 引数なしは Standard Error を補足
```ruby
begin
    error_method # 例外発生を含むメソッド
rescue => e # standard Error とそのサブクラスを補足。

end
```

### rescue後のraiseで同様のエラーを発生させられる。
```ruby
begin
    error_method # 例外発生を含むメソッド
rescue => e
    raise # eと同じ内容の例外が発生
end
```

### 後置rescueはStandard Errorのみ補足
```ruby
（例１）
raise rescue puts('error') # error (例外を補足する)

（例２）
raise Exception rescue puts('error') # これはエラーを補足しない。
```

### メソッドで例外を補足する。
```ruby
def
    error_method
rescue
    ## メソッド呼び出し時に例外発生した場合に補足
end
```

### クラスやモジュールで例外を補足する。
```ruby
class
    ## 何らかの処理
rescue
    ## クラス定義時に例外発生した場合に補足
end
```

以上
chrome extensionとjsonp


callback関数が、extensionのsandbox側で定義されて、ページ本体で呼ぶ、
ってことになっちゃうので、chrome extensionではjsonp使えない。

(読み込んで、レスポンスのcallback関数実行したところで、function undefinedでエラーになる)

## 解決策

chrome extensionなら、
cross domainなxhrも使えるので、そっち使う。

## 参考
 - [javascript - JSONP request in chrome extension, callback function doesn't exist? - Stack Overflow](http://stackoverflow.com/questions/8495825/jsonp-request-in-chrome-extension-callback-function-doesnt-exist)
WindowsバッチでSSHトンネルを確立する

WindowsバッチでSSHトンネルを確立できます。

ちょっとした理由があって作ったのですが、よく考えたらこんなバッチは必要なかったので、メモだけ残しておきます。

#コード

```bat:foo.cmd
start ssh vagrant@dev.localhost -o StrictHostKeyChecking=no -i 'C:\path\to\ssh\vagrant\unsecured_secret_key' -L 10080:localhost:80
```

# 解説

* `start `は、別のコマンドプロンプトウィンドウを起動してそこで実行するWindowsコマンド。
* `ssh`を実行するためには`ssh.exe`を入手し、パスを通しておく必要がある。（`ssh.exe`はgitなどをインストールすると付いてくる）
* `-i 'C:\path\to\ssh\vagrant\unsecured_secret_key'`でパスコードなしの秘密鍵を指定。（[Vagrant](http://qiita.com/daichi87gi/items/d5da33c76295ee32a735)などで使う事を想定）（あらかじめpuTTYgenなどでパスコードなしの秘密鍵を作成し、サーバーに登録しておく）
* この時、`-o StrictHostKeyChecking=no`を指定すると接続が早くなる。
* `-L 10080:localhost:80`でポート10080を接続先サーバー内のポート80に転送。
今更ながら抑えておきたいシェルスクリプト用チートシート


シェルスクリプト書くときになかなか覚えていなくて、かつググラビリティが低い情報をまとめてみました。

- 6/19 コメントを元に一部修正しました
[hnakamur](http://qiita.com/hnakamur)さんありがとうございます！

## 参考になる文献

- [test] (http://linux.die.net/man/1/test)
- [bash manual](http://linux.die.net/man/1/bash)
- [zsh manual](http://linux.die.net/man/1/zsh)




## 特殊な変数

| 変数   | 説明 |
|--------|--------|
| $# |  シェル引数の数  |
| $0 |  シェル自身のファイル名   |
| \$1〜$n |  シェルの各引数      |
| $* |  シェルの全引数リスト（スペース区切り）  |
| $@ |  シェルの全引数リスト            |
| $$ |  シェルのプロセスID      |
| $! |  最後に実行したバックグラウンドプロセスID      |
| $? |  最後に実行したコマンドの終了コード      |

## 演算子

### 共通の演算子

| 演算子 | 説明       |
|--------|--------|
| a -a b | AND            |
| a -o b | OR            |


### 文字列用演算子

| 演算子 | 説明       |
|--------|--------|
| -z | 文字列長が０ならtrue (zero) |
| -n | 文字列長が０より大ならtrue (not zero) |
| a = b | 2変数が等しければtrue |
| a != b | 2変数が等しくなければtrue |  


### 整数用演算子

| 演算子 | 説明       |
|--------|--------|
| a -eq b | ２変数が等しければtrue (equal) |
| a -ne b | 2変数が等しくなければtrue (not equal) |
| a -lt b | aがbより小ならtrue (less than) |
| a -le b | aがb以下ならtrue (less than equal) |
| a -gt b | aがbより大ならtrue (greater than) |
| a -ge b | aがb以上ならtrue (greater than equal) |

### ファイル用演算子

| 演算子 | 説明       |
|--------|--------|
| -d | ディレクトリならtrue (directory) |
| -f | ファイルならtrue (file)   |
| -s | ファイルサイズが０より大ならtrue (size)      |
| -e | ファイルが存在するならtrue (exist) |
| -r | ファイルが読み込み可能ならtrue (readable) |
| -x | ファイルが実行可能ならtrue (executable) |
| -w | ファイルが書き込み可能ならtrue (writable) |
| -o | ファイルの所有権があるならtrue (owned) |
| -L | ファイルがシンボリックリンクならtrue (Link) |
| a -nt b | aファイルがbファイルより新しければtrue (newer than) |
| a -ot b | aファイルがbファイルより古ければtrue (older than) |


## 変数処理

path=/path/to/file.txtのようなデータとする
varは任意の文字列

| 項目|　説明　|
|---|---|
| ${path:h} | pathのディレクトリ階層(head) |
| ${path:t} | pathのファイル名(tail) |
| ${path:r} | pathの拡張子以外のファイル名(root) |
| ${path:e} | pathの拡張子(extension) |
| ${path:a} | pathの絶対パス(all) |
| ${var:=値} | varが初期化されていなければ値を変数に代入 |
| ${var:-値} | varが初期化されていなければ代わりに値を返す |
| ${var:+値} | varが初期化されていれば代わりに値を返す |
| ${var:?メッセージ} | varが初期化されていなければメッセージを返す |
| ${var#正規表現} | 前方一致で最短マッチの文字列 |
| ${var##正規表現} | 前方一致で最大マッチの文字列 |
| ${var%正規表現} | 後方一致で最短マッチの文字列 |
| ${var%%正規表現} | 後方一致で最大マッチの文字列 |
| ${var/文字列1/文字列2} | 文字列1を文字列2に置換 |


## リダイレクト

| 項目|　説明　|
|---|---|
|1> file|標準出力（１は省略可能）をファイルに上書き|
|2> file|標準エラー出力をファイルに上書き|
|>> file|標準出力をファイルに追記|
|2>> file|標準エラー出力をファイルに追記|
|>&- |標準出力をクローズ|
| command > file 2>&1|標準出力＆標準エラー出力|
| command > /dev/null 2>&1|実行結果やエラーメッセージをすべて捨てる|
|0< file|標準入力（０は省略可能）にファイルから読み込む|
|<< word|標準入力にヒアドキュメントを読み込む|
|<&- |標準入力をクローズ|
|: > file|ファイルのゼロリセット|

なお上記についてfileの部分は&m (mは数字）というファイルディスクリプタ番号を指定することで１の標準出力や２の標準エラー出力以外の独自の番号にリダイレクトできます。

## シグナル

trapなどで使うシグナルの一覧

trap 'commands' 番号（複数可）
で呼び出して使ったりする

| 項目|　説明　|
|---|---|
|1|SIGHUP ハングアップシグナル|
|2|SIGINT キーボードからの割り込みシグナル|
|3|SIGQUIT キーボードからの中止シグナル|
|9|SIGKILL プロセス強制終了のキルシグナル|
|15|SIGTERM アプリ終了のシグナル|


その他のシグナルは[こちら](http://linuxjm.sourceforge.jp/html/LDP_man-pages/man7/signal.7.html)参照
phpのビルトインウェブサーバーで拡張子.htmlをphpとして動作させる

例えば本番環境で "*.html" でPHPスクリプトを動かしている案件のサポートを依頼され、ローカルで簡単な動作確認を行いたいケースがあるとします。

Apacheなら.htaccess等で制御出来ますが、PHP5.4+のビルトインウェブサーバーで動作させたい場合はどうしたらよいでしょうか。

ビルトインウェブサーバーにはルータースクリプト機能がついていますので、ファイルの拡張子で判別して `require` してやれば動作します。

[PHP: ビルトインウェブサーバー - Manual](http://www.php.net/manual/ja/features.commandline.webserver.php)

`````php
<?php

$path = $_SERVER["SCRIPT_FILENAME"];

if(preg_match("/\.html$/", $path)){
    chdir(dirname($path));
    return require($path);
}

return false;
`````

`chdir` でディレクトリを変更しているのは、ルーティング時のカレントディレクトリがドキュメントルートになってしまっている為です。そのまま `require` すると、スクリプト内で相対パスのファイル扱いたい時にファイルが見つからずにエラーが発生してしまいますね。
Yahoo の API を node.js から利用する

# 概要
コピペ用にメモとして残しておきます。
`request`パッケージを使用します。

# サンプル

[キーフレーズAPI](http://developer.yahoo.co.jp/webapi/jlp/keyphrase/v1/extract.html)のサンプルをそのまま再現します。
「東京ミッドタウンから国立新美術館まで歩いて5分で着きます。」のリクエストを行い、結果を得ます。

```js:app.js
var request = require('request');

var options = {
    url:'http://jlp.yahooapis.jp/KeyphraseService/V1/extract',
    headers: {
        'User-Agent': 'Yahoo AppID:<appid>'
    },
    form: {
        sentence : '東京ミッドタウンから国立新美術館まで歩いて5分で着きます。',
        output: 'xml',
    }
};

var callback = function(err, res, body) {
    if (!err && res.statusCode === 200) {
        console.log(body);
    }
};

request.post(options, callback);
```

`<appid>`には取得したアプリケーションIDを入れてください。
`request`パッケージをインストールした後`node app`を実行すると、コンソールにレスポンス本文が表示されます。

```xml
<?xml version="1.0" encoding="UTF-8"?>
<ResultSet xmlns="urn:yahoo:jp:jlp:KeyphraseService" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:yahoo:jp:jlp:KeyphraseService http://jlp.yahooapis.jp/KeyphraseService/V1/extract.xsd">
  <Result>
    <Keyphrase>国立新美術館</Keyphrase>
    <Score>100</Score>
  </Result>
  <Result>
    <Keyphrase>東京ミッドタウン</Keyphrase>
    <Score>69</Score>
  </Result>
  <Result>
    <Keyphrase>5分</Keyphrase>
    <Score>10</Score>
  </Result>
</ResultSet>
```
浮動小数点数

float    32ビット単精度浮動小数点数
double   64ビット倍精度浮動小数点数

単精度浮動小数点数は
負の値は -3.4028235E+38 ～ -1.401298E-45、
正の値は 1.401298E-45 ～ 3.4028235E+38 の範囲の値をとる。
倍精度浮動小数点数は
負の値は -1.79769313486231570E+308 ～ -4.94065645841246544E-324、
正の値は 4.94065645841246544E-324 ～ 1.79769313486231570E+308 の範囲の値をとる。
PHP | ANSI Escape Sequencesを利用する

# PHPでANSI Escape Sequencesを利用する

## 概要
PHPでANSI Escape Sequenceを利用して、コンソールに色つき文字を出力します。
ANSI Escape Sequencesについては説明略。

## サンプルコード

~~~php
class AnsiEscapeSequences {
  static function red($text) {
    return static::color($text, '31');
  }

  static function blue($text) {
    return static::color($text, '34');
  }

  static function yellow($text) {
    return static::color($text, '33');
  }

  static function color($text, $color) {
    return "\033[".$color.";1m".$text."\033[0m";
  }
}

print(AnsiEscapeSequences::red('red')."\n");
print(AnsiEscapeSequences::blue('blue')."\n");
print(AnsiEscapeSequences::yellow('yellow')."\n");
print(AnsiEscapeSequences::color('green', '32')."\n");
~~~

## 出力

画面上

~~~
red
blue
yellow
green
~~~

実際の文字列

~~~
[31;1mred[0m
[34;1mblue[0m
[33;1myellow[0m
[32;1mgreen[0m
~~~

## 出力画像

![ansi_escape_php.png](https://qiita-image-store.s3.amazonaws.com/0/43480/42f9fec6-249d-a08e-344f-d4410285ca0e.png)
Juliaのパッケージのversion tagを上げる方法


Juliaのパッケージ管理は、`METADATA.jl`で行われている。([Document](http://julia.readthedocs.org/en/latest/manual/packages/))

今回、[SVM.jlにtestを追加した](https://github.com/JuliaStats/SVM.jl/pull/11)後、[version tagを上げたほうが良いと言われた](https://github.com/JuliaStats/SVM.jl/issues/7)ので、やってみた。

これが最適な方法かはわからないが、とりあえずこうしたという備忘録です。

まず、最新のmasterにリリースするべき機能がマージされているとします。

```bash
cd ~/.julia/v0.3/SVM
git checkout master
git pull --rebase origin master
```

juliaを起動後

```julia
Pkg.tag("SVM")
```

これで、METADATA.jlにtagが作られているはずです

```
cd ~/.julia/v0.3/METADATA/SVM
git show
```

で、この変更をコミットして、自分のforkしたMETADATA.jlのリポジトリにpushし、Pull requestを送ります

お作法がマニュアル見ても書いてないのでちょっと戸惑いましたが、意外となんとかなるものですね。
2進数、8進数、16進数それぞれの変換

String	Integer.toBinaryString(int i)	数値iを２進数表記の文字列で返す
String	Integer.toOctalString(int i)	数値iを８進数表記の文字列で返す
String	Integer.toHexString(int i)	数値iを１６進数表記の文字列で返す
RuboCop | Style/AlignParameters | EnforcedStyle

# RuboCop | Style/AlignParameters | EnforcedStyle

## 概要

RuboCopの「Style/AlignParameters EnforcedStyle」警告について。

### 設定値一覧

|設定対象|設定値|内容|デフォルト|
|:-------|:-----|:---|:--------:|
|EnforcedStyle|with_first_parameter|最初のパラメータに位置を合わせる|○|
|EnforcedStyle|with_fixed_indentation|メソッド呼び出しの行から1段階インデントする|--|

## EnforcedStyle

with_first_parameter, with_fixed_indentation  
の各値での rubocop 実行結果をまとめます。

### 検証プログラム

enforced_style.rb

~~~ruby
def some_method(a, b)
  "#{a}-#{b}"
end

some_method('hoge',
            'hige')

some_method('hoge',
  'hige')
~~~

### EnforcedStyle with_first_parameter(デフォルト) でチェックした場合

.rubocop.yml

~~~yaml
AlignParameters:
  EnforcedStyle: with_first_parameter
~~~

enforced_style.rb の2つ目の例が警告対象になります

~~~bash
$ rubocop
Inspecting 1 file
C

Offenses:

enforced_style.rb:9:3: C: Align the parameters of a method call if they span more than one line.
  'hige')
  ^^^^^^

1 file inspected, 1 offense detected
~~~

### EnforcedStyle with_fixed_indentation でチェックした場合

.rubocop.yml

~~~yaml
AlignParameters:
  EnforcedStyle: with_fixed_indentation
~~~

enforced_style.rb の1つ目の例が警告対象になります

~~~bash
$ rubocop
Inspecting 1 file
C

Offenses:

enforced_style.rb:6:13: C: Align the parameters of a method call if they span more than one line.
            'hige')
            ^^^^^^

1 file inspected, 1 offense detected
~~~

## 補足
この警告は `rubocop -a` で修正可能です。
主要な型まとめ

型　　　 ビット数(バイト数)　範囲
byte	8 (1)	(-27, 27-1) = (-128, 127)
int	32 (4)	(-231, 231-1)
char	16 (2)	Unicode の一文字
float	32 (4)	IEEE 754 規格の 32 ビット浮動小数点数
double	64 (8)	IEEE 754 規格の 64 ビット浮動小数点数
厳密比較演算子の是非

```===``` や ```!==``` などのいわゆる厳密比較演算子、自分は普段あまり使わなくて、厳密な比較をしたい場所だけに使うのですが、世間では ```==``` は悪だ即刻消えろ的な論説が多くて不安になります。なので自我を保つために、厳密比較演算子の嫌いなところをいくつかピックアップします。

## タイプ数が多い

アホみたいですが、これが嫌いな最大の理由です。たった1文字ですが、チリも積もれば山です。

## 見た目が気持ち悪い

イコールが3つも続いて生理的に気持ち悪いです。なんて言うと ```==``` も見慣れただけで、ほんとうは十分気持ち悪いんですけどね。比較を ```==``` にした人（C言語の人？）は責任を取ってもらいたい。

## ズボラな性格の人には向いていない

```==``` でハマる場合って、ほとんどの場合0とnullや空文字が混在したときだと思うんですよね。そもそも0を使わない運用にしていることが多いので、一括で比較できる ```==``` のほうが楽なことが多いです。

あとは数値と文字列、例えば '1' と 1 は等しいとしてくれたほうが助かる場合が多いです。


自分が適当すぎるのかなーとも思いますが・・・プログラマはもっと厳密であるべきなのでしょうか。
Rubyの文字数、バイト数取得について

# Rubyの文字数、バイト数取得について

## 文字数の取得は String#size/length メソッド

`String#size` , `String#length` を利用します。
http://docs.ruby-lang.org/ja/2.0.0/method/String/i/size.html

~~~ruby
puts "h".size      # => 1
puts "h".length    # => 1
puts "あ".size     # => 1
puts "あ".length   # => 1
~~~

ただし、 Ruby1.8 の場合は `String#size/length` メソッドは
後述の `String#bytesize` と同様の結果を返却します。

## バイト数の取得は String#bytesize メソッド

`String#bytesize` を利用します。

http://docs.ruby-lang.org/ja/2.0.0/method/String/i/bytesize.html

~~~ruby
puts "h".bytesize  # => 1
puts "あ".bytesize # => 3
puts "h".encode("EUC-JP").bytesize  # => 1
puts "あ".encode("EUC-JP").bytesize # => 2
~~~

## バイト数の取得 番外編
※コメント欄にて cielavenirさん から教えて頂いた内容（2014/06/26）。ありがとうございます。

Ruby1.9以上でも、ソースの先頭に#coding:ASCII-8BITと記述することでsizeをbytesizeと同義にすることが可能

~~~ruby
#coding:ASCII-8BIT

puts "h".size      # => 1
puts "h".length    # => 1
puts "あ".size     # => 3
puts "あ".length   # => 3
~~~
created_atがTimeクラスになる現象

モデルのtimestamp(created_at,updated_at)は通常、TimeWithZoneクラスのインスタンスですが、これがTimeクラスになる現象が発生しました。
Timeクラスになるとどうなるかと言うと、railsが時刻を扱う際には通常、DBにはUTCで格納し、入出力時にTimeZoneを加えるようになっていますが、これが行われないのでUTCのまま扱われ、viewにも当然UTCで出力されるようになります。

## 原因
せっかちな人のために結論を書くと、利用していた論理削除gem[rails4_acts_as_paranoid](https://github.com/joelteon/rails4_acts_as_paranoid)が原因でした。
これを[paranoia](https://github.com/radar/paranoia)に置き換えたところ解決しました。
以下、原因を調べた方法について書きます。

## 調査
まず、timestampがTimeWithZoneを返す正常なrailsアプリを用意し、DBを比較してみたところ、DBには差がないことが分かりました。
つまりActiveRecordがTimeZoneを付加するところをスキップしているということです。
というわけで[ActiveRecordのソース](https://github.com/rails/rails/blob/master/activerecord/lib/active_record/)を見ます。
[timestamp.rb](https://github.com/rails/rails/blob/master/activerecord/lib/active_record/timestamp.rb)の先頭のコメントに以下のような記述があります。

```ruby:timestamp.rb
  # If your attributes are time zone aware and you desire to skip time zone conversion to the current Time.zone
  # when reading certain attributes then you can do following:
  #
  #   class Topic < ActiveRecord::Base
  #     self.skip_time_zone_conversion_for_attributes = [:written_on]
  #   end
```

どうやら意図せずskip_time_zone_conversion_for_attributesを定義してしまっていたようです。
プロダクトコードを検索しましたが定義している様子はないので、gemのソースを検索してみると、[rails4_acts_as_paranoidのソース](https://github.com/joelteon/rails4_acts_as_paranoid/blob/multicolumns/lib/rails4_acts_as_paranoid.rb#L177)を発見しました。

```ruby:rails4_acts_as_paranoid.rb
def self.extended(base)
  base.define_callbacks :recover
  base.skip_time_zone_conversion_for_attributes =[base.paranoid_column, :created_at, :updated_at]
end
```

モジュールがincludeされると自動的にparanoid_column（デフォルトはdeleted_at）とcreated_at,updated_atがTimeZoneを解除されています。論理削除の際にTimeZoneに起因するバグが発生するのを避けたのかも知れません。
と言うわけでこのgemが犯人と分かったので、paranoiaに置き換えて事なきを得ました。
分かってしまえば原因は単純でしたが、トラブルシュートの良い経験になりました。
物理削除したファイルをステージに載せる


## 何回やっても覚える事が出来ないので
Gitを利用して、ソース管理をしている場合、時に不要になったファイルは削除する事がある。

そのとき、 *git status* で状態を見ると以下の様になっている。

```shell-session
# Changes not staged for commit:
#   (use "git add/rm <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#	deleted:    script.js
#
```

つまり、ファイルを削除したけど、その情報はステージングされていないよと言われている。  
言われているのは分かるのだが、じゃぁその後どうすれば良いんだっけ？と、いつも迷ってしまうので、いい加減メモする事にした。

## git rm を使うんだよ
そう、本当に削除したいのであれば

```shell-session
$ git rm script.js
```

とすれば良い。
LTSV から特定の項目を特定の並び順で TSV にするワンライナー

ワンライナーと言っても ruby ですが。

ltsv.log から ipaddr と status と time をこの並び順で取り出して TSV にする。

```console
$ cat ltsv.log|ruby -F"\t" -nae '$F.map!{|v|v.split":",2};puts %w{ipaddr status time}.map{|v|($F.assoc(v)||[])[1]}.join"\t"'
```

---

`-l` オプションを思いだしたので一文字短くなりました。

```console
$ cat ltsv.log|ruby -F"\t" -plae '$F.map!{|v|v.split":",2};$_=%w{ipaddr status time}.map{|v|($F.assoc(v)||[])[1]}.join"\t"'
```

---

`Hash[[[1,2],[3,4]]] #=> {1=>2, 3=>4}` という書き方を知ったのでさらに少し短くなりました。

```console
$ cat ltsv.log|ruby -F"\t" -plae 'h=Hash[$F.map{|v|v.split":",2}];$_=%w{ipaddr status time}.map{|v|h[v]}.join"\t"'
```
YUIDocで生成されるドキュメントにソースを含めないオプション


## 今まであまり気にせずに
YUIDocでJavaScriptのドキュメントを生成する際、以下のコマンドを実行していた。

```shell-session
$ yuidoc -o <ドキュメントを出力するディレクトリ>
```

どうも、このオプション指定では **生成されたドキュメントにjavascriptのソースコードも含まれて出力される事に気づいた。**

## ドキュメントにソースコードを含めずに出力するには
以下の様にして、-Cオプションを付け加えることで解決する。

```shell-session
$ yuidoc -C -o <ドキュメントを出力するディレクトリ>
```

ひとまず、自己解決したのでめでたしめでたし。
誕生日診断を作ってみた

今日は[JavaScriptで作る「あなたの誕生日診断」 (全5回)](http://dotinstall.com/lessons/date_js)に挑戦した。今回は日付オブジェクトという日付を扱う機能が登場。今回は変数が多い。[昨日作ったおみくじ](http://qiita.com/cervomansan/items/aebde36a74e8c48b5485)のおかげで、やっと意味がわかるようになったが初見だと頭が混乱すること間違いなし。「君はこういう人だよ」と登場人物に個性をつけてあげる作業だと考えればvarがいくつ羅列されてても落ち着いて見られるようになった。


```
function getAge() {
			// 入力値の取得
			var birthday = document.getElementById('birthday').value.split("-");

			// 日付オブジェクトの作成
			var d1 = new Date(birthday[0], birthday[1]-1, birthday[2]);
			var d2 = new Date();

			// 日数、年齢の計算
			var diff = d2.getTime() - d1.getTime();
			var daysPast = Math.floor(diff / (1000 * 60 * 60 * 24));
			var age = Math.floor(daysPast / 365.25);

			// 結果の表示
			document.getElementById('daysPast').innerHTML = daysPast;
			document.getElementById('age').innerHTML = age;
```

#失敗した点
##タイプミス
昨日と同じようなミスで、またもやプログラムが動かず15分ほど格闘。まずボタンを押しても反応がない。画面をにらみ続けてもミスが見当たらない。らちがあかないので一応コピーしておいて最初から打ち直す。すると今度は動いた。原因はMath.floorと書くべきところをmath.floorと書いたことだった。「あー」と1人で納得。しばらくレッスンを進めると今度は``<span></span>``で囲んだ???の部分が切り替わらない。よーく見るとid=がid~になっていた。

#まだ理解できていない点
##split
困ったときのMDNということで調べてみる。
>文字列を複数の部分文字列に区切ることにより、String オブジェクトを文字列の配列に分割します

うーん・・・よくわからない。レッスン動画の中で「値が正しいかどうかをチェックできる」と言っていたので、のちのち再登場するのかもしれない。配列にわけていたから再利用できるのかもしれない。

#総評
基本の日付を取得して現時刻との差を計算させるのは面白かった。例えばパズドラのようなアプリが日付をまたいだ瞬間に内容が変わるといったことも、こういう機能を使っているのかなと想像できる。今回は少しレベルが上がっていて動画の内容は50％ほどしか理解できてないので明日はおみくじと日付診断を復習しよう。日付オブジェクトは便利な機能だと思った。ぜひとも慣れておきたい。

そして1つ気がついた。例えば``<span></span>``の部分が書き換わらないといったエラーの場合、無闇に最初から見直すより原因に結びつきそうな部分から探っていくほうがいい。考えてみれば当たり前のことか。

Qiitaで編集リクエストというものが届いていて、これも面白かった。凄く便利だし勉強になる。毎日驚いてる気がする。
『体系的に学ぶ 安全なwebアプリケーションの作り方』の環境構築(Windows 7)

『[体系的に学ぶ 安全なwebアプリケーションの作り方](http://www.amazon.co.jp/%E4%BD%93%E7%B3%BB%E7%9A%84%E3%81%AB%E5%AD%A6%E3%81%B6-%E5%AE%89%E5%85%A8%E3%81%AAWeb%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E4%BD%9C%E3%82%8A%E6%96%B9-%E8%84%86%E5%BC%B1%E6%80%A7%E3%81%8C%E7%94%9F%E3%81%BE%E3%82%8C%E3%82%8B%E5%8E%9F%E7%90%86%E3%81%A8%E5%AF%BE%E7%AD%96%E3%81%AE%E5%AE%9F%E8%B7%B5-%E5%BE%B3%E4%B8%B8-%E6%B5%A9/dp/4797361190)』をWindows7で動かしながら読もうとしたけれども、VMWare上で動かしているWebサーバーにWindows側からアクセスできない問題に遭遇した。おそらく特に設定していなければ、皆さんのWindows7でも同様だと思う。

ググってもこの本と関連させて、Windows7の場合にどう設定すべきか書いているページが簡単には見つからなかったので、あえてここに記録しておく。[ここ](http://kapokpokpok.blog63.fc2.com/blog-entry-576.html)にあるように設定すればPingに応答するようになって、それ以降はPCで確かめながら本を読めるだろう。
インスタンス化したArrayオブジェクトの再初期化


##まずはArrayオブジェクトをインスタンス化

```js
var objArray = new Arrary();
```

##つづいて、配列に値を格納していく。
例では、1〜10の値を配列に格納していく。

```js
for(var idx=0; idx < 10; idx++){
    objArray.push(idx)
}
```

この後、プログラム内でobjArrayに格納された値の利用が終わり、次に配列の一番最初から11〜15までを格納したいと考えた。つまり、 **元々10個あった配列を5個に減らし** かつ **その値を変更したい** ということをしたいわけである。

##色々調べてみたところ
いくつかやり方があるみたいだった。

###1. shiftメソッドを利用し、配列数分の値を減らす。その後、1〜5の値を配列に格納していく。  

```js
for(var idx=0; idx < objArray.length; idx++){
    objArray.shift();
}
for(var idx=0; idx < 5; idx++){
    objArray.push(idx);
}
```

###2. 0個の配列を設定する

```js
objArray = [];
for(var idx=0; idx < 5; idx++){
    objArray.push(idx);
}
```

### 3. インスタンスを作り直す

```js
objArray = new Array();
for(var idx=0; idx < 5; idx++){
    objArray.push(idx);
}
```

##結論として
「1.」が一番確実なやり方かもしれないのだけれど、なんだか **ループを2回まわさないと行けないのが気持ち悪い**。

「2.」か「3.」がシンプルでよさそうなんだけど、「3.」は **同じ変数に再度インスタンスを作るのは気持ち悪い（なんだか効率悪そう・・・）**

ということで消去法ではあるのだけれど、ひとまず「3.」の方法でプログラムをくんでいこうと思う。
※どこかのタイミングでじっくり調べて見ようと。。。思う。。。
ls -R on Google Drive

```py
def list_recursively(id, dir="", maxResults=100):
    children = []
    query_result = drive_service.files().list(
            q='"%s" in parents' % id,
            maxResults=maxResults
            ).execute()
    while True:
        children += query_result['items']
        if not 'nextPageToken' in query_result:
            break
        query_result = drive_service.files().list(
                q='"%s" in parents' % id,
                pageToken=query_result['nextPageToken'],
                maxResults=maxResults
                ).execute()
 
    result = []
    for item in children:
        path = "%s/%s" % (dir, item['title'])
        result.append((path, item))
        if item['mimeType'] == 'application/vnd.google-apps.folder':
            result += list_recursively(item['id'], path)
 
    return result
```