OmniAICreator/Qiita-1.07M huggingface dataset:
go-bindataでまとめたファイルをhttp.FileServerで配信する

Goはアプリケーションを1バイナリで配布できて楽なのですが、webアプリケーションの場合は大抵静的ファイルを配信する必要があり、これが外部ファイルになってしまいます。CSSとか。

そこで [go-bindata](https://github.com/jteeuwen/go-bindata) を使うとファイルをバイナリに同梱できて便利ですが、これを http.FileServer で配信できたら更に楽になるのでは…と思ってこんな風にしてみました。

`http.FileServer` interfaceを実装した `AssetFileSystem` と、`http.File` interfaceを実装した `AssetFile` を適当に定義して、go-bindata で作った `Assets()` から取得したデータを配信してやるサンプルです。

ただし、[http.serveFile() がindex.htmlへのアクセスをリダイレクトしてくれるという気の効かせ方](http://golang.org/src/net/http/fs.go#L343) をするため、現状は index.html というファイルへのアクセスのみができない(404になる)、という辛い状態です。

実行例

```
$ go-bindata -prefix=pubic public/...
$ go build
```

```go
package main

import (
	"bytes"
	"log"
	"net/http"
	"os"
	"strings"
)

func main() {
	http.Handle("/", http.FileServer(AssetFileSystem{}))
	log.Fatal(http.ListenAndServe(":3000", nil))
}

type AssetFileSystem struct {
}

type AssetFile struct {
	*bytes.Reader
	os.FileInfo
}

func (fs AssetFileSystem) Open(name string) (http.File, error) {
	path := name
	path = strings.TrimLeft(path, "/")
	log.Println("open asset", path)
	data, err := Asset(path)
	if err != nil {
		log.Println(err)
		return nil, err
	}
	info, _ := AssetInfo(path)
	file := &AssetFile{
		bytes.NewReader(data),
		info,
	}
	log.Printf("%#v", file)
	return file, nil
}

func (f *AssetFile) Close() error {
	return nil
}

func (f *AssetFile) Readdir(count int) ([]os.FileInfo, error) {
	return []os.FileInfo{}, nil
}

func (f *AssetFile) Stat() (os.FileInfo, error) {
	return f, nil
}
```
【Swift】【Xcode6】【初心者】文字を音声にして読んでくれる簡単なアプリのソースコード

環境
OS X Yosemite10.10
Xcode6.1.1

#アプリ説明
・テキストに文字を入力すると、その文字を読み上げてくれるアプリ
・テキストを消すための☓印がついている
・テキスト入力の後returnキーを押すか、ボタンを押すとキーボードを非表示にできる

![スクリーンショット 2015-01-22 13.20.33.png](https://qiita-image-store.s3.amazonaws.com/0/63942/c189bc3a-d62c-15d7-b99f-295e9e8639bc.png)

実際の動きはこんな感じ。
http://youtu.be/1j28rl-YThg

#ソースコード
```swift
//１．ボタン、テキストフィールドを設置→viewcontroller.swiftに接続



import UIKit
import AVFoundation //２．フレームワークをインポート
                                        //５．
class ViewController: UIViewController, UITextFieldDelegate {
    

    @IBOutlet weak var textArea: UITextField!   //１．
    
    var speak:AVSpeechSynthesizer = AVSpeechSynthesizer()   //３．変数speakを作る
    
    override func viewDidLoad() {
        super.viewDidLoad()
        //５．キーボードを表示させる
        textArea.delegate = self
        textArea.clearButtonMode = UITextFieldViewMode.Always
        textArea.keyboardType = UIKeyboardType.Default
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()

    }


    @IBAction func speakBtn(sender: UIButton) { //１．
        //４．ボタンが押されたら音声を読み上げ
        let content = AVSpeechUtterance(string: self.textArea.text)
        content.voice = AVSpeechSynthesisVoice(language: "ja-JP")
        self.speak.speakUtterance(content)
        textFieldShouldReturn(textArea) //６．

        
    }

    //６．returnキーを押したらキーボードが消えるようにする
    func textFieldShouldReturn(textField: UITextField) -> Bool {
        textArea.resignFirstResponder()
        return true
    }

}
```

書き加えた順番に番号をふってあります。

#作る過程のエラー
###iOS8.1ではコードが正しくても音が出ない　
Xcodeをインストールした状態だと、渡しの場合iOS SDK 8.01しか入っておらず、それでは音声機能が使えなかった。
http://stackoverflow.com/questions/24472766/avspeechutterance-swift-initializing-with-a-phrase

###シミュレーターをiOS7.0で動かす　
機能を使えるのはiOS7.0とわかったが、シミュレーターをiOSにするのも一調べ。
http://wayohoo.com/mac/apps/developer-tools/if-there-is-no-ios-simulator-in-xcode-6-1-workaround.html

###シミュレーターのキーボードが表示されない
音はなるようになったけれど、キーボードが出てこず、ここでもハマった。
http://yutaihara.com/archives/147

ちょっとずつですが、Swiftの書き方やXcodeの使い方に慣れてきてプログラミングが楽しくなってきました〜。
UITableViewやUICollectionViewなど（UIScrollview系）のtouchesBeganが遅い対処

ハマりました・・・。

```swift
self.tableView.delaysContentTouches = false
```
これを追加すると即反応します。

これはタッチをホールドしてドラッグする場合に判断するので必要なもののようです。特にドラッグしない場合はfalseで良いと思います。
要求抽出について

要求抽出を行うにあたり、３つの難点があります。
1.システム化の境界が明確に定義できない(どこまでがシステム、どこまでが人の作業なのか)
2.要求者自身が要求について完全に理解していない。
→コンピュータの能力や限界についての理解が不十分・ユーザフレンドリといった要求が曖昧過ぎる。
　こんな風にしたいんだけれど、どうすれば良いのかな？程度の認識しかなく、何があれば自分の問題が解決するか分かっていない
3.時間の経過とともに要求が変化する。


では具体的に、どのように要求を抽出すれば良いのでしょうか？
1.資料収集：業務に関する既存の資料を収集・分析を行い、問題点や要求事項を抽出する手法。
→ある程度正確なドキュメントが残されている前提で行います。データマイニングが一番近い？

2.アンケート：システムを使うであろう人にアンケートにし、要求を抽出する手法。
→てっとり早い方法ですが、誘導尋問に近い形になる手法です。アンケートの質問を超える内容は出てこないケースがほとんどです。

3.インタビュー：オープン型インタビュー(自由に意見を貰う)と、構造化インタビュー(エンジニアが予め想定した回答に誘導する)の二種類がある。後者は責任分散が主な目的です。
→ほぼアンケートに近いですが、顔を合わせる分お互いの解答が印象に残りやすいです。

4.現場観察：現場に属することにより、事実、問題、対処策、改善の機会、成功するために必要な条件、KPI候補を導き出す。
→情報収集を、資料ベースでなく自分の感覚で進めていくやり方。人によって向き不向きがくっきり別れる手法です。


結論として、要件抽出の精度を上げるには適切なコミュニケーションを取るしかないです。
お互いが機能要件に熟知していれば最小で済みますし、逆の場合は僅かな意思疎通の乱れが命取りになります。
お互いのコミュニケーションを基本として、使いやすい手法・ツールを試し、質の高い要件抽出を目指しましょう。


最後に、コミュニケーション手法の例を示します。
・会議：最も一般的です。原則同一部署(利害関係が一致)内で行われますが、複数の利害関係者を同時に集めて議論する「協調セッション」という方法もあります。集団の合意を得るためには一番効率的な方法だそうです。
		しかし、会話内容が十分正確に記録できないと、作成される要求仕様が不正確になる恐れがあります。
→真面目な人ほど会議好きのイメージです。

・ブレインストーミング：細かい意見が出やすく想定外の意見が出やすいため、活発なコミュニケーションが期待出来ます。しかし、まとめ役が不在の場合、生産性があるように見えてほとんどない場となってしまいます。
→学生が好きなイメージです。

・シナリオの利用：そのシステムが実際に使われたと過程してみんなでシミュレーションする。
例：福祉支援システムの要求を抽出する場合：年齢83 歳の花子おばあさんのある1日を具体的に各々想定する。
→一番能力のある人が全体を引っ張っていくケースが多発しそうなので、初学者の意見は吸い上げにくいかもしれません。
Javaをアップデートした後、それをNetBeansに反映させる


#netbeans.conf を探す

JavaをアップデートしたのにNetBeansにそれを反映させるやり方が分からない！！と思って検索したら、 __netbeans.conf__ というファイルを編集してやらないといけないことが分かりました。しかし、Spotlightで検索しても見つからない。
で、更に検索したところ、NetBeans 8.0.2.appを右クリックして __パッケージの内容を表示__ しなければならないことが判明。

![netbeans right click.png](https://qiita-image-store.s3.amazonaws.com/0/66771/ca3b0882-007d-c49c-e75e-affde140e199.png "netbeans right click.png")

netbeans.confの場所をフルパスで書くと
/Applications/NetBeans/NetBeans 8.0.2.app/Contents/Resources/NetBeans/etc/netbeans.conf
です（私の環境では）。

#netbeans.confの編集

netbeans.confに、

> \#netbeans_jdkhome= ...

という記載があるので、コメントアウトを外してあげて、

> netbeans_jdkhome="/Library/Java/JavaVirtualMachines/jdk1.8.0_31.jdk/Contents/Home"

と書けばOK!!
でも、その少し上には

> \# It can be overridden on command line by using --jdkhome <dir>

と書いてあったから、わざわざこんなことをしなくてもターミナルで変更できるっぽいです・・・。
td-agent + CentOS6.5


# 環境
OS: CentOS6.5

# Rubyのアップデート

```
既存のRubyを削除する手順なのでRubyを使っているスクリプト類がないことをご確認ください。
Ruby1系から2系へのアップデートなので動かなくなるスクリプトがある可能性があります。
```

CentOSの6.5のRubyのバージョンは1.8.x系なので以下の方法でアップデートしておきます。
最新版は2.2系ですが、個人的にまだ怖いので2.1系を入れておきます。

```
$ sudo yum update
$ sudo yum -y install gcc zlib-devel openssl-devel sqlite sqlite-devel # 必要パッケージのインストール
$ sudo yum -y remove ruby # 既存のrubyの削除
$ which ruby
/usr/bin/which: no ruby in (/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/opsadmin/bin)
$ cd /usr/local/src
$ sudo wget http://cache.ruby-lang.org/pub/ruby/2.1/ruby-2.1.5.tar.gz
$ sudo tar zxvf ruby-2.1.5.tar.gz
$ cd ruby-2.1.5
$ sudo ./configure
$ sudo make
$ sudo make install # /usr/local/binにインストールされます。
$ which ruby
/usr/local/bin/ruby
$ ruby --version
ruby 2.1.5p273 (2014-11-13 revision 48405) [x86_64-linux]
$
```

# td-agentのInstall
インストールの前に以下を確認してください。
http://docs.fluentd.org/ja/articles/before-install

以下のコマンドでインストールすることができます。

```
$ curl -L http://toolbelt.treasuredata.com/sh/install-redhat.sh | sh
$ td-agent --version
td-agent 0.10.55
$ 
```

# td-agentの設定

以下apache2のアクセスログをTreasureDataに転送する設定となります。
apache2というDBのaccessというテーブルにデータを入れる設定が以下となります。

アクセスログの形式は以下となります。

```
::1 - - [22/Jan/2015:10:46:21 +0900] "GET / HTTP/1.1" 403 4954 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.16.2.3 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2"
```

```file:/etc/td-agent/td-agent.conf
# Tailing the Appache Log
<source>
  type tail
  path /var/log/httpd/access_log
  pos_file /var/log/td-agent/apache2-access.pos
  tag td.apache2.access
  format /^(?<host>[^ ]*) [^ ]* (?<user>[^ ]*) \[(?<time>[^\]]*)\] "(?<method>\S+)(?: +(?<path>[^ ]*) +\S*)?" (?<code>[^ ]*) (?<size>[^ ]*)(?: "(?<referer>[^\"]*)" "(?<agent>[^\"]*)")?$/
time_format %d/%b/%Y:%H:%M:%S %z
</source>

# Treasure Data Input and Output
<match td.*.*>
  type tdlog
  apikey ${your_api_key} # TreasureDataのAPI-Key
  auto_create_table
  buffer_type file
  buffer_path /var/log/td-agent/buffer/td
  endpoint ybi.jp-east.idcfcloud.com
  flush_interval 10s
  use_ssl true
</match>
```

以下sourceタグ内のformatとtime_formatの意味です。

* format: ログの正規表現を記載
* time_format: 時刻のformatを記載

`(?<host>[^ ]*)`の意味は次の先頭が空白となるブロックまでの部分をhostというタグ名に紐付けるという意味です。

TreasureDataに入れたくないデータについては`(?<xxxx>)`を付けずに単純に`[^${区切り文字}]*`のようにすれば読み飛ばすことができます。

# 参考になるサイト
* Fluentd公式ドキュメント http://docs.fluentd.org/ja/articles/quickstart
* Fluentd正規表現チェック http://fluentular.herokuapp.com/
シェルで1行の疎通確認用簡易Webサーバ


ネットワークの設定が正しいかを確認するため、疎通確認を行うのにWebサーバ等を入れずにコマンドだけで確認する方法。

1.簡易Webサーバを実行

```:疎通を確認したいサーバ上で実行
$ while true; do { echo -e 'HTTP/1.1 200 OK\r\n'; echo 'HELLO'; } | nc -l 8000; done
```

2.疎通確認

```:疎通確認
$ curl http://疎通確認先サーバ:8000/
GET / HTTP/1.1
User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.13.1.0 zlib/1.2.3 libidn/1.18 libssh2/1.2.2
Host: XXXXXXXX:8000
Accept: */*

HELLO
```
IntelliJでよく使うショートカット

- `cmd + alt + ←`
  - 定義箇所へジャンプした後戻る
- `cmd + shift + t`
  - テストコードにジャンプ
- `cmd + o`
  - クラス検索
- `cmd + shift + o`
  - ファイル検索
- `cmd + e`
  - なんでも検索
- `cmd + shift + e`
  - 最近開いたファイル

----

- `cmd + alt + o`
  - import最適化
- `cmd + alt l`
  - 自動整形

----

- `cmd + ,`
  - 設定(Preference)を開く

----

- [チートシート](https://www.jetbrains.com/idea/docs/IntelliJIDEA_ReferenceCard_Mac.pdf)

独自の定義多いのでアレ。tab移動は`cmd + shift + [` とか。

他にもよく使うのがあれば追記してく
Node.js開発入門_01


必要にかられてnode.jsを始めることにしました。
javascript、昔はテーブルをチカチカさせたりするだけの使えない子だったのに、いつの間にこんなに高機能になったのでしょう。
あの頃手を付けておけば今どんなに楽だったか。

## 目標
リクエストを受け取ってそれに応じたデータをDBから取り出すスクリプトの作成
※DB側が重くなることが多いので、それにつられてブラウザが固まるのを回避したい

## 参考
 - [ドットインストール](http://dotinstall.com/lessons/basic_nodejs)
 - [株式会社LIG](http://liginc.co.jp/web/programming/node-js/85318)
 - [ビギナーのためのNode.js入門](http://libro.tuyano.com/index2?id=1115003)

## 概要 - Node.jsって？

 - サーバーサイドjavascriptの一種
 - リアルタイムwebの構築が可能

つまり、例えば私がメイン技術としているPHPなどのように「わざわざ画面をリロード」しなくても「サーバーサイドとして振る舞い」、「データの取扱が可能」
……みたいなものと理解しました。

ajaxはブラウザ実行のはずなので、POSTとかでデータ送受信して画面を書き換えることは出来ますが、サーバーサイドに例えばPHPなどでメソッドを用意してやらねばならず、node.jsではそれが必要なく、直接DBとのやりとりを行う。
逆にフロントの書き換えができないのがnode.jsなのでしょうか。

詳しい話は私自身学習しながら都度書いていくということで。

## 必要なもの

 - 動作環境
 - node.js本体
 - データベース

ドットインストールの方ではmongoDBでやっていたようです。
vagrant導入はまたごっちり別記事になってしまうので、その辺は適宜。

次回からソースコードに入っていきますヽ(´@ω@｀)ﾉ

※追記[2015.01.30]
思いっきり誤字脱字間違った表記がありましたのでそっと修正しました。内容に変更はありません。
bashで安全にパスワードを入力させる


```bash:enter_password.sh
#! /bin/bash

read -sp "Enter password: " password
tty -s && echo

schema_list=`mysql --defaults-extra-file=<(printf '[client]\npassword=%s\n' $password) -u root -N -e "SHOW DATABASES;"`

for schema in $schema_list
do
    if [ $schema != mysql -a  $schema != information_schema -a $schema != performance_schema ]; then
        mysql --defaults-extra-file=<(printf '[client]\npassword=%s\n' $password) -u root -e "CREATE TABLE $schema.test_table (id MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT, name CHAR(20) NOT NULL, PRIMARY KEY (id)) ENGINE=InnoDB;"
    fi
done
```
hostsを管理権限で編集するショートカットを作成する

いざというときに手順が多くてイラっとするのでショートカットを作っておくと便利

# 手順

## メモ帳のショートカットを作成

![1.PNG](https://qiita-image-store.s3.amazonaws.com/0/64098/33a907d0-7bfd-49cd-26e8-91b13278aaf6.png)

## hostsへのショートカットへ変更

![2.PNG](https://qiita-image-store.s3.amazonaws.com/0/64098/7b8359c0-728b-8442-c5f9-50c34b419d7e.png)

* リンク先 （引数にhostsのパスを追加）

```%windir%\system32\notepad.exe C:\Windows\System32\drivers\etc\hosts```

## このショートカットを管理者として実行する

![3.PNG](https://qiita-image-store.s3.amazonaws.com/0/64098/b1d6cc02-d021-d060-2a5d-353692713be8.png)

* 詳細設定ボタン押下
* 管理者として実行にチェックをつけてOK
* 適用

# おわり

あとは全般タブでショートカットに好きな名前を付けて終わり。
これで、アイコンのダブルクリックで管理者権限でメモ帳が開くので、いつでもさくっと編集できるようになっちゃいますよと。
git操作に関するtips

#方針
* gitを使った作業してる時の「あれってどうやるんだっけ？」って言うののメモ。作業に対する逆引き的な。
* 動作背景のメモも書くかも。
* 本当に基本的な操作についてはやらない。（ブランチの移動とかコミット方法とか）
* 随時追加予定。
* 破壊的な操作に関してはその旨書く（つもり）。

#ローカルブランチがどのブランチを追跡しているか調べる
`git branch -vv`

#ブランチ間の差分を表示する
`git diff branchA..branchB`

#ブランチ間のファイル単位の差分を表示する
`git diff --stat branchA..branchB`

#ブランチ間のコミット単位の差分を表示する
（branchAに入っておらず）branchBにだけ入っているコミットの表示
`git log branchA..branchB`
スマホサイトでサブミットボタンの表示をオリジナルデザインにするcssの記述方法

![logo_pippi.png](https://qiita-image-store.s3.amazonaws.com/0/63640/e598517a-5179-7f1d-451a-264d984a6649.png "logo_pippi.png")

せっかくスタイルをcssで記述したのに、スマホサイトで見たら角丸の四角で変なグラデーションと枠線がついてる！なんで(>o<)

```css
input[type="submit"] {
  -webkit-appearance: none;
}
```

上記のcssを追加すれば、オリジナルデザインが適用されます〜
メルマガ配信企画のTips

# メルマガ配信を企画したときのあれこれ
上からメルマガを配信するぞー！文章とか計画を立てろっ！と指示が出たときに考えたこととか、調べたことのざっくりのまとめ

## 経緯とか
* 自社サービスに（半分死んでるような）会員登録機能がついていた
* それに2万人ぐらいの会員リストがあった
* この会員に対して何かしらのマーケティング活動を行って、顧客を掘り起こしていきたい

## メルマガが物理的にちゃんと配信されるために気を付けること
つまり「迷惑メール」としてスパムフィルタに引っかからず、会員にちゃんとメールが届くようなメルマガをいかにして書くのかということを意識した。

http://mailstand.hatenablog.com/entry/2015/01/20/060000
ここを参考にした。以下抜粋。
<blockquote>1. RFC5322に従ってね
2. HTML規格に従ってね
3. メールには Message-IDを付けてね
4. メールヘッダに Precedence: bulk って付けて一括送信メールって教えてね
5. リンク先ページやメールの送信者を隠蔽しないでね
6. 本文に関係のある件名を付けてね
7. ドメインは正しく書いてね</blockquote>

### メールアドレス
* 半角英数字、アンダーバーが@の前に使える
* RFC5233的な決まりで行くと、「半角文字でメールアドレスに使えない文字はない」とされている

### メールには有効な「Message-ID:」ヘッダー欄が必要
一般的なMTA（メールサーバーのメールソフト）を使っていれば特に意識しなくてよい。

### メールには、「Precedence: bulk」ヘッダー欄を使用して一括送信メールであることを示す必要がある
明らかにスパムで、スパムであることを隠している場合はアレだが、読者にのぞまれて一括送信しているときはヘッダに「一括送信だよ」と書いておくのが良いらしい

### メールの送信者を偽装したり、メール内のURLを転送リンクにしてごまかそうとしない
怪しいと思われるので、メールの本当の送信者は明らかにし、メール本文内のリンクもそのままのURLにする。

### 件名はちゃんと本文とリンクさせて書く
件名と本文があまりに一致してないとスパムと捉えられる

### ドメイン名は正しく書く
fromのメアドは適当でいけるんだけれども、gmailは正しくないメアドだと迷惑メールにしてしまうので、ちゃんとしたドメイン名で書くようにする

### HTMLメールを使うなら、ちゃんとHTMLを書く
今回はテキストによるメールなので、これはパス。


ここのABCメールは中々良さそう。何かのタイミングで導入したい。
[Swift]計算結果などに上限値・下限値を設けるサンプルコード


* Xcode 6.2 beta 4
* Playground

## 上限値

**値が◯◯を超えないようにしたい（＝値が◯◯以下になるように抑えたい）** とき。

例えば、
「車の速度を加速させるけど、時速 60km は絶対に超えないようにしたい」
...みたいな場合に使用します（良い例が思いつきませんでした）。


学校で習いそうな書き方は以下のようなものでしょうか。

```swift:サンプルコード
import UIKit

let upperLimit = 60.0
var speed = 50.0

speed += 50.0 // なんかの計算。ここでは"100.0"となる

if speed > upperLimit {
    speed = upperLimit
}

println(speed) // "60.0"
```

上記のコードでも全く問題無いのですが、通な（？）プログラマは以下のように`min`関数を用いていると思います。

```swift:サンプルコード
import UIKit

let upperLimit = 60.0
var speed = 50.0

speed = min(speed + 50.0, upperLimit) // なんかの計算＆上限値込み

println(speed) // "60.0"
```

比較的短く書ける（値と上限値の登場回数が少なくて済む）ところにメリットがあるのかなと思われます（厳密な所はわかりませんが）。

上限値を超えた時（または上限値に達した時）に値の補正以外に何か別の処理を書きたい場合は前者のコードになると思いますが、単純な計算結果などに上限値を設ける場合は後者の方がよく利用するかなと思います。

若かりし頃、「上限」値を設けるためになんとなく逆の意味っぽい「`min`」関数を使うという違和感に悩まされましたが、慣れればなんてことはありません。

## 下限値

**値が◯◯より小さくならないようにしたい（＝値が◯◯以上になるように抑えたい）** とき。

例えば、
「画像のアスペクト比を固定したままサムネイルを作りたい、このとき、画像の横幅と縦幅は 1 より小さくならないようにしたい（1より小さいとマズイ）」
...みたいな場合に使用します。

今度は`max`関数を使ってやると楽です。

```swift:サンプルコード
import UIKit

let lowerLimit = 1
let scale = 0.001 // 拡大率（適当）
let oldWidth = 10 // 旧横幅（適当）

let newWidth = max(Int(Double(oldWidth) * scale), lowerLimit) // サムネイルの横幅

println(newWidth) // "1"
```

## 上限値＆下限値

**値が◯◯以上△△以下になるように抑えたい** とき。

例え話が思いつきません。

`min`関数と`max`関数を組み合わせれば一行で書けます（minとmaxの入れ子の順番はどちらでもよいです）。
値は適当です。

```swift:サンプルコード
import UIKit

let lowerLimit = 1
let upperLimit = 100

let test = min(max(34 * 56, lowerLimit), upperLimit) // 34 * 56の計算結果を1以上100以下に抑える

println(test) // "100"
```


...で、ここからが本題。

この記事を書くきっかけは、そもそもこれと同等の処理が一発で出来る関数はswiftには無いの？という疑問がわいた事でした（ざっと探した限りでは見つけられませんでした）。

他のプログラム言語などでは`clamp`という関数が有るようでして、この関数をswiftで書いてみることにしました。
（`clamp`関数の存在自体、Twitterで教えてもらうまで知りませんでした...）

```swift:clamp関数の実装
import UIKit

func clamp<T: Comparable>(value: T, lowerLimit: T, upperLimit: T) -> T {
    if value < lowerLimit {
        return lowerLimit
    }
    if value > upperLimit {
        return upperLimit
    }
    return value
}

// テスト
println(clamp(4, 1, 100)) // "4"
println(clamp(-4, 1, 100)) // "1"
println(clamp(400, 1, 100)) // "100"
println(clamp(400.0, 1.0, 100.0)) // "100.0"
```

ジェネリクスを使っているので、大抵の型で使えると思います。

もし他に良い方法などがあれば教えていただけると幸いです。
JavaFXでウィンドウを表示するための最低限のコード

##Applicationクラスを継承

JavaFXアプリケーションのエントリーポイントは javafx.application.Application クラスです。
このクラスは、抽象メソッド start(javafx.stage.Stage) を持つ抽象クラスなので、このメソッドをオーバーライドする必要があります。

また、通常のJavaアプリケーションを作成する際には

```java
public static void main(String[] args) {...}
```

という記述が必要なはずなのですが、JavaFXアプリケーションの場合は不要なようです（下の方にある追記と[こちら](http://qiita.com/toshi71/items/763eb2aa23a5b890b7f8)の文章も参照してください）。

ですので、最低限のコードは次のようになります。

```java:JavaFXApplication.java
import javafx.application.Application;
import javafx.stage.Stage;

public class JavaFXApplication extends Application {

	@Override
	public void start(Stage stage) throws Exception {
		stage.show();
	}
}
```

##実行結果

このコードをコンパイルして実行してやるとこのようになります（環境は、Mac OS X Yosemite、JDK 8u31、NetBeans IDE 8.0.2）。

![JavaFXで作った空のウィンドウ](https://qiita-image-store.s3.amazonaws.com/0/66771/24a89a11-1af4-71e7-f112-0a2f46433e99.png)

これの素晴らしいところは、既に簡単なメニューとそのショートカットが実装されていてるところです。

![空のウィンドウのメニュー](https://qiita-image-store.s3.amazonaws.com/0/66771/0b555884-df39-1054-3865-a52483cb01d3.png)

***

__2015.01.22追記__

この記事は私の初めての投稿だったのですが、なんと投稿の数時間後に、
> JavaFXはmain()が不要

とご指摘をいただきました。ご指摘通りに、ソースを改変しています。

元々のソースは下記の通りです。

```java:JavaFXApplication.java
import javafx.application.Application;
import javafx.stage.Stage;

public class JavaFXApplication extends Application {

	public static void main(String[] args) {
		launch(args);
	}

	@Override
	public void start(Stage stage) throws Exception {
		stage.show();
	}
}
```
Thymeleafで検索結果の表を書く（tableの書き方)

# Thymeleafの利点と便利なところ

ThymeleafはHTMLファイルをそのままWebアプリケーションのテンプレートとして使え、名前空間:thで値を出力する属性を指定します。つまり、ブラウザで直接HTMLファイル（一般的にモックアップHTMLと呼ばれるもの）を見ても、Webアプリの出力結果も画面のレイアウトは崩しません。



## 例：検索結果の一覧表

一覧表を\<table\>でレイアウトするときは、たいてい仮の検索結果を数件程度モックアップに組み込みます。その後、Webアプリに組み込むときには、この仮に作ったタグを削除し、JSPなどへ変換しますが、Thymeleafではこの手間もなくせます。

```html:table.html
<!-- 一覧結果 -->
<table class="table table-striped">
	<thead>
		<tr>
			<th>#</th>
			<th>タスク名</th>
			<th>登録日</th>
			<th>ステータス</th>
		</tr>
	</thead>
	<tbody th:remove="all-but-first" th:each="result : ${action.resultList}">
		<tr th:class="${result['limitdate']} &lt; ${action.systemDate} ? 'danger' : ''">
			<td th:text="${result['id']}">1</td>
			<td><a href="update.html" th:href="@{display(vo.id=${result['id']})}" th:text="${result['name']}">タスク1</a></td>
			<td th:text="${#dates.format(result['writedate'], 'yyyy/MM/dd')}">3/5</td>
			<td th:text="${beans.master.getValue('status',result['status'])}">Open</td>
		</tr>
		<tr>
			<td>2</td>
			<td>タスク2</td>
			<td>3/7</td>
			<td>Close</td>
		</tr>
		<tr>
			<td>3</td>
			<td>タスク3</td>
			<td>1/9</td>
			<td>NotOpen</td>
		</tr>
	</tbody>
</table>
```

大事なところは、\<tbody th:remove="all-but-first"\> です。

これは、テンプレートとして読む場合は、「子要素である \<tr\>を全部消すけれど、先頭は残してね」と、便利な機能です。
そのあと、th:each属性で指定した検索結果のオブジェクト(List<Object>など)を指定するだけです。

繰り返し要素の使い方は、他のテンプレートエンジンやJSTLでも同じですね。

# まとめ

以上をまとめる＆私の所感も添えると…

* HTMLからJSPへ変換し、同じ画面なのに複数のファイルに持つことがなくなります。
 * JSPちょっと直したらHTMLモックも直す…という2重メンテがなくなりますね d(・ω・)
 * HTMLで下地を作ってJSPへ変換し、またその逆を考えてHTMLを構築する **JSP職人業が不要です。**
 * View実装と画面レイアウトの分担がしやすいですね。
 * 書き方は今までのテンプレートエンジンやJSTLとそっくりです。
godocのhttpサーバーをTerminalを閉じても起動させ続ける

local環境にgodocのhttpサーバー立ち上げても、Terminalのウィンドウを閉じると一緒にプロセスも落ちちゃいますよね？

でも、再起動させるのがめんどうなので、godocを起動させ続けられないか調べました。

## やり方
nohupコマンド経由で、godocをバックグラウンドに流します。

```
nohup godoc -http=:6060 &
```

以上！

これで、Terminal落としてても、ログアウトしてから戻って来ても、godocのhttpサーバーが立ち上がりっぱなしになります。
	

で、落とす時はこんな感じ。

```
kill -9 `pgrep godoc`
```

## おまけ

bashrcやzshrcに、こんなかんじで書いておくとちょっとだけ幸せになれるかもしれないです。

```zsh:.zshrc
if [ -z "`pgrep godoc`" ]; then
  (nohup godoc -http=:6060 &) &> /dev/null
fi
```
Xcodeに独自のショートカットキーを登録する簡単な方法








#Xcodeに独自のショートカットキーを登録

システム環境設定 -> キーボード -> ショートカット
<img src="https://qiita-image-store.s3.amazonaws.com/0/63942/b464ea19-67e4-d449-9b0c-79506c38abdb.png" width=450>



 -> アプリケーション -> 「＋」→Xcode選択 -> 操作名などを入力 -> 追加
<img src="https://qiita-image-store.s3.amazonaws.com/0/63942/5be2d4a2-6017-c700-1c57-90b5bdd063cb.png" width=450>

メニューバーや、右クリックした時に操作名が表示されている動作なら、これで登録できます。

私はDocument Outlineの表示・非表示をcmd + 9 に登録しました。

<img src="https://qiita-image-store.s3.amazonaws.com/0/63942/5d69b6e5-643e-6942-8fdb-244d5249f135.png" width=500>

解説動画もあります。

http://youtu.be/WUi9Ui8dA8c
Ubuntu 14.04でトラックパッドを手軽にオン/オフ

新しいノートPCを購入したところ、トラックパッドが文字入力中に邪魔だったので手軽にオンオフできるようにしました。


# トラックパッドのデバイスID

``` sh
$ xinput list

⎡ Virtual core pointer                    	id=2	[master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer              	id=4	[slave  pointer  (2)]
⎜   ↳ PS/2 Logitech Wheel Mouse               	id=13	[slave  pointer  (2)]
⎣ Virtual core keyboard                   	id=3	[master keyboard (2)]
    ↳ Virtual core XTEST keyboard             	id=5	[slave  keyboard (3)]
    ↳ Power Button                            	id=6	[slave  keyboard (3)]
    ↳ Video Bus                               	id=7	[slave  keyboard (3)]
    ↳ Video Bus                               	id=8	[slave  keyboard (3)]
    ↳ Sleep Button                            	id=9	[slave  keyboard (3)]
    ↳ USB2.0 UVC HD Webcam                    	id=10	[slave  keyboard (3)]
    ↳ Asus WMI hotkeys                        	id=11	[slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard            	id=12	[slave  keyboard (3)]

```

使う id は、次で実際に無効化することで発見できます。

# オン・オフのコマンド

``` sh
$ xinput disable 13
$ xinput enable 13
```

私の環境では ``PS/2 Logitech Wheel Mouse : id=13`` がトラックパッドでした。

# ショートカットに登録

System Settings > Keyboard > Custom Shortcuts から好きなキーを登録します。私は全く使わないキーとして Menu に割り当てたので、一つのキーでオン・オフさせるために次のスクリプトを書きました。引数は先程のデバイス id です。

``` sh
#!/bin/bash

state=`xinput list-props "$1" | grep Enabled | tail -c 2`

if test $state = '1'
then
    xinput disable "$1"
else
    xinput enable "$1"
fi
```

こんな感じで登録します。

![Screenshot from 2015-01-22 08:38:07.png](https://qiita-image-store.s3.amazonaws.com/0/37859/6a87b7ba-9de6-0b0e-6483-d30ce690d7f6.png)

追記：

Ubuntu 18.04 だと GNOME3 になっているので若干設定が違うけど，同じ雰囲気でやっています．あとデバイスIDはデバイスの抜き差しで変わることがあるようなので，NAME（上の例だと `"PS/2 Logitech Wheel Mouse"` ）の方で登録しています．シェルコマンドの関係上，スペースを含むので二重引用符が必須．

![image.png](https://qiita-image-store.s3.amazonaws.com/0/37859/8c86d499-d8a1-96d5-558b-18385bc52868.png)
Hubotに電車の運行情報をしゃべらせる

Yahooの運行情報を取得してきてHubotにしゃべらせるScript作ってSlackの社内チャンネルに入れてます。  
こんな感じ。

```js
cheerio = require 'cheerio-httpcli'

module.exports = (robot) ->

  robot.respond /電車/i, (msg) ->

    # send HTTP request
    baseUrl = 'http://transit.loco.yahoo.co.jp/traininfo/gc/13/'

    cheerio.fetch baseUrl, (err, $, res) ->
      if $('.elmTblLstLine.trouble').find('a').length == 0
        msg.send "事故や遅延情報はありません"
        return
      $('.elmTblLstLine.trouble a').each ->
        url = $(this).attr('href')
        cheerio.fetch url, (err, $, res) ->
          title = "◎ #{$('h1').text()} #{$('.subText').text()}"
          result = ""
          $('.trouble').each ->
            trouble = $(this).text().trim()
            result += "- " + trouble + "\r\n"
          msg.send "#{title}\r\n#{result}"
```
cronとかで1時間毎とか出勤退勤時刻に15分間隔くらいで流してもたのしいかもしれない。
【メモ】地理院地図のフォーク

http://github.com/gsi-cyberjapan/gsimaps のフォークについてメモ

# 植生図を追加して公開
技術情報：http://d.hatena.ne.jp/tmizu23/20150121

成果：http://tmizu23.github.io/tmizu23_gsimaps/?ll=38.227393,140.845413&z=11&base=std&ls=vegehill&vs=c1j0l0u0

github でクローンしてカスタマイズ（地図タイルを追加してlayers.txtを追加）して gh-pages から公開

# Fx0 アプリを作成
技術情報：http://shimz.me/blog/map/4043

manifest.webapp を書き換えて実行（作業時間約10分）

「（「ホーム画面に追加でいいのでわ？」とか言わない）」

「FirefoxOSは、公開されているStatic Web Applicationを簡単にアプリとしてインストールできるので面白い」

# 避難地域までの距離を追加して公開
成果：http://wata909.github.io/muroran_opendata/?ll=42.34516%2C141.016989&z=15&base=std&ls=muroran_ortho%7Cmuroran_ortho&vs=c1j0l0u0#15/42.347364/141.025786

# 陰影段彩と地域区画を追加して公開。TMS 対応
技術情報：http://www.chuogeomatics.jp/archives/3527

成果：http://www2.chuogeomatics.jp/demo/webapp/gsimaps/?ll=35.362876,138.729858&z=12&base=std&ls=dem_color_5m%7Cmesh2&vs=c1j0l0u0
インストールしたRパッケージのあれこれ

**について調べている。**同様のことは以前、@R_Linuxさんが書かれている（[R - パッケージの出所を確認 - Qiita](http://qiita.com/R_Linux/items/4c3ccdbe61c088fac008)）のだが、そこで触れられていないことをメモ代わりに。

## パッケージのインストール先

パッケージのインストール先（ディレクトリ）を知りたいときには`find.package`, `path.package`の２つの関数を使うと良い。

```r
find.package("dplyr")
path.package("ggplot2")
```

この２つの関数の違いは、すでにパッケージが読み込まれているかどうかで挙動が変わってくる。目的のパッケージを読み込んだ後であれば`path.package`で良いが、読み込む前ならば`find.package`を使用しないとパッケージは見つからない。

## パッケージのバージョンを知る

パッケージの情報を得るには、@R_Linuxさんの記事にある`packageDescription`関数を使えば良いのだが、そんなにいろいろな情報は知りたくない。**パッケージが新しいかどうかだけを知りたいんじゃ**というときには`packageVersion`関数が有効。

## パッケージのvignetteを呼び出す

Rパッケージには、パッケージおよび関数の説明が書かれたファイルとは別に、パッケージの使用方法や解説などが書かれたvignetteを備えている場合がある（個人的にvignetteを用意している開発者は親切な方なのだろうなと思う）。そんなときには`vignette`関数にパッケージ名を引数で渡すことで呼び出すことができる（ちょいと時間がかかる）。vignetteを用意していないパッケージであれば、vignetteがない旨を知らせるエラーを返す。

### インストールしているパッケージのvignetteを一覧する

`browseVignettes()`でブラウザが起動する。

## パッケージの内部ファイルのパスを得る

自身のパッケージで使用しているファイルなど、使うときは限られるだろうが（ディレクトリ構造を理解していないと...）。

```r
system.file("csv/uspop2000.csv", package = "leaflet")
```

個々の環境により、パスは変わってくるので、一度こちらで得たパスを代入しておくと、[yeah::detayo](https://github.com/dichika/yeah/blob/master/R/yeah.R#L19)のようなことも可能になる。

## おまけ

関係ないが、良いページを見つけた。良い開発者になるためにvignetteの書き方も覚えたいところ。

[Vignette | Rパッケージ用vignetteの書き方](http://stat.biopapyrus.net/dev/vignette.html)

もう一つおまけ。見覚えのある盾アイコンのクールなhrbrmstrさん（ほかにもナイスなパッケージがある）が開発されている[dtupdate](https://github.com/hrbrmstr/dtupdate)を使うとGitHubからインストールしたパッケージの更新情報を知ることができる。

## 参考

* Rプログラミングマニュアル 第２版 -Rバージョン３対応-. 間瀬茂 2014. **数理工学社**
画面の向きを動的に設定する

端末の向きと画面の向き設定によらず、画面の向きを指定したい場合がある。

# 静的に指定する場合
下記のようにAndroidManifest.xmlで指定する。

* 縦固定

```xml:AndroidManifest.xml
<activity
    android:name=".MainActivity"
    android:screenOrientation="portrait">
```

* 横固定

```xml:AndroidManifest.xml
<activity
    android:name=".MainActivity"
    android:screenOrientation="landscape">
```

* 自動

```xml:AndroidManifest.xml
<activity
    android:name=".MainActivity"
    android:screenOrientation="unspecified"> <!-- 未指定でもOK! というか、普通は未指定 -->
```

# 動的に指定する場合

下記のように `Activity#setRequestedOrientation` を呼び出す。
呼び出した結果、実際に画面の向きが変わった場合はActivityが再生成される(android:onConfigChangesでorientation等を指定していなければ)。

* 縦固定

```java:MainActivity.java
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
```

* 横固定

```java:MainActivity.java
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
```

* 自動

```java:MainActivity.java
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
```
Filezillaインストール

インストールするときに
Error opening file for writingがでてインストール出来ない場合
インストール時は管理者として実行必須
![クリップボード02.png](https://qiita-image-store.s3.amazonaws.com/0/44687/4eec93ca-e544-3416-e1a9-503325461436.png)
a tagの中身がないとIEで動かない

もっともしょっぱいものの１つがIE対応だと思う人も多いだろう。

キャンペーンサイトなどすぐにクローズしてしまうサイトなどは工数削減のために、テキストを画像で書き出してしまう場合があるだろう。

ここでその書き出したテキストの該当する文字だけにリンクを付けてほしいなどという要望が出たとする。

全く悲しいが無理矢理a tagを追加して、そのtagをposition:absoluteで該当箇所の上に重ねて、リンク機能を実装してしまうような場合も出てくるだろう。

該当a tagに

```
a {
    display:block;
    width: Apx;
    height: Bpx;
    position: absolute;
    top: x;
    left: y;
}
```

などcssを指定する。

しかしなぜかIEではcursorがpointerにならない。
IEではa tagに文字列が何もないと読み込まない仕様になっているからのようだ。

しかたなく

```
a {
    display:block;
    width: Apx;
    height: Bpx;
    position: absolute;
    top: x;
    left: y;
    background-color: #ffffff;
    opacity: 0;
}
```

などするとリンク先に飛ぶことができる。
しかしIE8ではopacityが使えない。

しょうがないので、透明な画像を背景に敷く。
画像を書き出さないといけないが、IE8だとbackground-sizeが使えないので小さい画像を用意してはいけない。

```
a {
    display:block;
    width: Apx;
    height: Bpx;
    position: absolute;
    top: x;
    left: y;
    background: url(path/transparent-image.png);
}
```

IE8対応は大変。
enchant.jsとtmlib.jsを使ったゲーム作成フレームワーク「enforce」チュートリアル（１０）敵の爆発を作る

ここでは、「**game01**」というディレクトリ内で作業しているという前提で説明しています。

# 敵の爆発をつくる

ここまでの状態では、敵に弾が当たるとそのまま消えていました。
それでは寂しいので爆発パターンをパーティクルで作ってみます。

まず、「**burnControl.coffee**」と「**burnParticle.coffee**」というクラスを新規に作成します。
ゲームのトップディレクトリ（**game01**直下）で、下記コマンドを実行して、「**src**」ディレクトリにクラスファイルが生成されていることを確認してください。
監視コマンドが実行されている場合は、自動でコンパイルされます。

$ **enforce derive burnControl**
$ **enforce derive burnParticle**

クラスファイルの生成が終わりましたら、「**burnControl.coffee**」の「**constructor**」に、

```coffeescript
        @num = 0
```
を追記します。
次に、「**behavior**」を下記のようにします。

```coffeescript
    behavior:->
        super()
        switch @_processnumber
            when 0
                addObject
                    motionObj: burnParticle
                    image: 'bear'
                    x: @x + (rand(8) - 4)
                    y: @y + (rand(8) - 4)
                    xs: rand(6) - 3 
                    ys: rand(6) - 3 
                    scaleX: 1.5 
                    scaleY: 1.5 
                    gravity: 0.5 
                    width: 32
                    height: 32
                    animlist: [
                        [100, [0]]
                    ]   
                @num++
                if (@num > 15) 
                    removeObject(@)
```
ここの処理は、「**burnParticle**」クラスオブジェクトを16個生成しています。
実際にゲームを作る時は爆発パターン用のスプライト画像を用意しますが、このチュートリアルではデフォルトで設定されている「**chara1.png**」をそのまま使います。
生成する時の座標は、「**burnControl**」が生成された時に渡されたx座標、y座標それぞれに「-4〜4」までの乱数を足した数に設定し、x方向とy方向の加速度は、「-3〜3」までの乱数に設定します。
スプライトの見掛けのサイズを1.5倍にしています。
重力は自機の半分で0.5に設定しています。
「**burnParticle**」を16個生成し終わると、自分自身を削除します。

次に、「**burnParticle.coffee**」を修正します。
「**burnParticle.coffee**」は、「**behavior**」だけを下記のように修正します。

```coffeescript
    behavior:->
        super()
        switch @_processnumber
            when 0
                @opacity -= 0.02
                @scaleX *= 0.95
                @scaleY *= 0.95
                if (@opacity < 0.0)
                    removeObject(@)
```
この処理は、自分自信の透明度（初期値は1.0）から毎フレーム0.02づつ減算していき、x方向とy方向それぞれの拡大率を毎フレーム0.95倍していくというものになります。
そして、透明度が0.0を下回った場合は、自分自信を削除しています。

最後に、敵に弾が当たった時の処理を修正します。
「**enemy01.coffee**」の「**burn**」メソッドの、

```coffeescript
    removeObject(@)
```
の前に、

```coffeescript
        @burnControlObj = addObject
            type: CONTROL
            x: @x
            y: @y
            motionObj: burnControl
```
を追記してください。
敵に弾が当たった時に、爆発パターンオブジェクトを生成しています。
画面にスプライトを表示する必要にない制御用オブジェクトでは、オブジェクトの元になるクラス名を渡すだけでいいはずなのですが、この処理ではx座標と、y座標を渡しています。
これは、「**burnControl**」で生成するパーティクルに爆発する敵の座標を渡す必要があるからです。

これで、敵に弾が当たった時は破片が飛び散るような感じになると思います。


[チュートリアル（９）](http://qiita.com/digitarhythm/items/1cd10eb34b69d585992f) <--- ⬛︎ ---> [チュートリアル（１１）](http://qiita.com/digitarhythm/items/382b836788c84eaf58f4)

---

[enforceチュートリアル一覧](http://qiita.com/digitarhythm/items/9e75c871f5ce582a4d01)
Octpressがgithubにデプロイする仕組み

`rake setup_github_pages`の動作をちゃんと理解していなかったせいで`rake deploy`してもサイトに反映されなくなってしまいました。

## 経緯

1. あるマシンでoctopressをセットアップして使い始める
2. 最初の記事を書き、`rake gen_deploy`して公開できたことを確認してsourceブランチをpushする
3. __別のマシンで__2でpushしたリポジトリをcloneしてきて、sourceブランチをcheckoutして記事を書く
4. `rake generate`すると`_deploy`ディレクトリが無いと怒られる
5. `mkdir _deploy`する <- まちがい
6. 記事を書き、`rake gen_deploy`する -> エラー無く完了するも、デプロイされない

## 原因と対応

`_deploy`ディレクトリがgithub pagesリポジトリのcloneじゃなかったからです。

2の状態では上手くいっていたので、[Rakefile](https://github.com/imathis/octopress/blob/master/Rakefile)を読んでみました。

[ドキュメント](http://octopress.org/docs/deploying/github/)にもちゃんと書いてありますが、`rake setup_github_pages`は以下のことをやっています。

1. originをoctopressにリネームする
2. デプロイ先(username.github.io)をoriginにする
3. masterブランチをsourceブランチにリネームする
4. `_deploy`ディレクトリを作り、その中でgit initしてfirst commitをする
5. こちらもoriginをデプロイ先リポジトリにする

username.github.ioを使っている場合は、4で作られるブランチ名はmasterになります(それ以外はgh-pages)。

この`_deploy`ディレクトリは、.gitignoreに入っていて除外されているため、username.github.ioをcloneした時点では存在しません。

そのため、他のマシン(あるいは他の人)がcloneするときは以下の手順が必要です。

```
git clone -b source git@github.com:username/username.github.io
cd username.github.io
git clone git@github.com:username/username.github.io _deploy
```

## あれ、新しいOctopressがある

書いてるときに気づいたんですが、[Octopress3.0リリースのアナウンス](http://octopress.org/2015/01/15/octopress-3.0-is-coming/)が…

This release is full rewrite. とか書いてあるし、CLIもまったく別物になっているようです。

せっかく仕組み把握したのに…と思いつつも、そのうち移行します。
プログラマになること#9 三大美徳

#記述する動機
私、とある専門学校でPGを教えています。はや８年。いまだにSEもやってます。
学生さんたちに読んでもらうために書いているのですが、悩めるプログラマ、悩めるSE、悩める教育関係者にも何かのヒントにはなると思い、あえて公開していきたいと思います。全て実例です。個人名は秘密！！

ここから２０１８/04追記
明日から新しい年度が始まります。各記事をメンテしています。
ここまで２０１８/04追記

#三大美徳
当たり前のことなんです。記事引用。
http://itpro.nikkeibp.co.jp/article/Watcher/20061005/250057/

![kobito.1421855485.946352.png](https://qiita-image-store.s3.amazonaws.com/0/33317/5f5f5fc3-2c3e-a50c-b0c8-f2976c1fbefc.png "kobito.1421855485.946352.png")

##怠慢
![kobito.1421855667.920285.png](https://qiita-image-store.s3.amazonaws.com/0/33317/b1df17ef-0beb-c475-13df-e8eebbc72873.png "kobito.1421855667.920285.png")

私的に解説します。
「要求を満たすための最小限の仕事をすること」
お客様もプログラマ、エンジニアもハッピーやね。
くそまじめに書かれた冗長なコードはゴミです。
なんでも使って、美しく、短く書くべし。

##短気
![kobito.1421856660.253049.png](https://qiita-image-store.s3.amazonaws.com/0/33317/29b35a26-e847-82bb-a19e-0fa0cde72b3e.png "kobito.1421856660.253049.png")

私的に説明します。
（２０１８/04上書き　ここから）
「答えを最速で出すこと」「チーム全員さっさと帰る」
（２０１８/04上書き　ここまで）

##傲慢
![kobito.1421857673.045538.png](https://qiita-image-store.s3.amazonaws.com/0/33317/429d0fcc-4cb1-e738-2558-22945a807f79.png "kobito.1421857673.045538.png")

私的に説明します。
（２０１８上書きしました　ここから）
「貴方がわからないのなら、わかる私にまかせてください。」といいたい。
でも、こう言うと角がたつので「お手伝いしましょうか？」になってしまいます。
で、結局なしくずし。時間、体力、やる気、お金すべて浪費していく。
それなら、悪者になったほうが正解。
傲慢に言ってのけるのです。仕方ないです、
（２０１８上書きしました　ここまで）

#やるべからず。
##暗記
無限のパターンの暗記なぞありえません。理解が大事
使う。理解。覚えちゃう。忘れたらちょいと調べて試せば良い。

##マーカー、付箋
やった気になるだけ、自己満足。
結局、全部マークしてるだけ。百害あって、一理なし。
そもそも書籍にはIndexがある。電子にはFindがある。

##盲信
公的資格がどうとか、メーカー資格がどうとか…
あっさり無意味になるかもよ？
資格は有る方が有利に決まってます。
しかし、必要条件かもしれないけど、十分条件ではない。
時間とお金を使ったから、ほんのちょっと有利になっただけなのよ。


##反射の「はい」
反射で「はい」は無理解の証拠。
分かってないのに「分りました」は一時回避の証拠
やりもしないくせに「頑張ります」は達成不能の証拠
かけ声はいいから結果をください

##自己責任
やれるなら一緒にやりましょう。
できないなら他の道にいってください。
自分できめましょう。
バイナリファイルをAjaxで取得する際に注意する点

サーバ上のバイナリファイルを jQuery の $.ajax() を使用して取得しようとしたところ思わぬ罠に嵌まったので対処法を記載します。

## jQuery の $.ajax() を使うと発生する問題点
jQueryを使って、バイナリファイルをAjaxで取得しようとする際、まず思いつくコードは以下のようになると思います。

```js:test1.js
$(function(){
    $.ajax({
        url : 'http://example.com/foobar.jpg',
        cache : false,
        success : function(data, status, xhr){
            console.log(arguments);
        }
    });
});
```

一見、これでバイナリが取得できそうです。しかし、このコードの console.log で出力される中身を確認すればわかりますが、バイナリがテキストとして扱われてしまうため、バイナリを使用するには扱いづらい状態になってしまいます。ここから、TypedArrayに変換しようとしても、Blobでないというエラーが出てしまったりするため、jQueryの$.ajax() だけではバイナリを扱うのが厳しい状況になってしまいます。

## 解決策
バイナリを扱う際は、先人の知恵（[その1](http://tech-sketch.jp/2013/01/javascript-1.html)、[その2](http://www.qript.co.jp/blog/technique/215/)）によると、XMLHttpRequestを使ってバイナリを呼び出すのが一番簡単だと思われます。


```js:test2.js
$(function(){
    var xhr = new XMLHttpRequest();
    xhr.open('GET', 'http://example.com/foobar.jpg', true);
    xhr.responseType = 'arraybuffer';
    xhr.onload = function(e) {
        // ArrayBufferで返ってくる
        console.log(this.response.byteLength);
    };

    xhr.send();
})();
```

一応、[$.ajax()を使用しても、$.ajaxTransport()に追記することで扱えるようにする方法](http://www.henryalgus.com/reading-binary-files-using-jquery-ajax/)もあるようですが、コードの行数も上記より増えてしまうため、XMLHttpRequestを使った方が良いかと思われます。

## 参考文献
1. [JavaScriptでバイナリファイルを扱う方法](http://tech-sketch.jp/2013/01/javascript-1.html)
1. [Javascriptでバイナリデータを取得する](http://www.qript.co.jp/blog/technique/215/)
1. [Reading binary data using jQuery Ajax](http://www.henryalgus.com/reading-binary-files-using-jquery-ajax/)
Mac でも背景変更コマンド

```zsh:.zshrc
# get screen resolution 解像度
alias screensize="xdpyinfo | grep 'dimensions' | egrep -o '[0-9]+x[0-9]+' | head -1"

# change background
case ${OSTYPE} in
    darwin*)
        background() {
            bg=$1
            if [ ${bg%%:*} = "http" ] ; then ;
                filename=${${bg:t}%\?*}
                wget $bg -O ~/Pictures/tmpbg/$filename
                bg=~/Pictures/tmpbg/$filename
                ;fi
            osascript -e "tell application \"Finder\" to set desktop picture to POSIX file \"$bg\""
        }
        ;;
    *)
        alias background="display -window root -resize \`screensize\`"
        ;;
esac
```

.zshrc に上の設定を書いておく

```shell-session
background path/to/image.png
```

ローカルファイルは直接背景に



```shell-session
background http://path/to/image.png
```

macの場合は最初に mkdir ~/Pictures/tmpbg などが必要
リモートファイルは~/Pictures/tmpbg に保存してから背景に
C-M-d (Control-Command-D) による辞書引きを停止する

Emacs Mac Port はデフォルトで Mac OS X の辞書サービスに対応しており、`C-M-d` でポイントしている単語の意味を Mac OS X のポップアップで表示させることができ便利です (参考: https://github.com/railwaycat/emacs-mac-port/blob/2e5ff4921e4474713878c587965b7e45a0cd12bf/README-mac#L66-L69 )。

しかし、`C-M-d` は smartparens の `sp-down-sexp` (あるいは、paredit の `paredit-forward-down`)を奪っており、このままでは私がコードを書く際にとても不便です。そこで、`C-M-d` による辞書引きを Mac OS X 全体で停止することにします。Mac OS X の `C-M-d` を禁止しても、辞書サービスは三本指タップで引き続き利用できるので、Emacs 以外のアプリケーションでの不便はありません。

```shell-session
% defaults write com.apple.symbolichotkeys AppleSymbolicHotKeys -dict-add 70 '<dict><key>enabled</key><false/></dict>'
% sudo /sbin/shutdown -r now
```

## 参考

+ http://apple.stackexchange.com/questions/22785/how-do-i-disable-the-command-control-d-word-definition-keyboard-shortcut-in-os-x
pplog のユーザー名をクリックするとその人の Twitter を開く Google Chrome 拡張を作りました

## 概要

[pplog](https://pplog.net) を読んでいると、その人の Twitter アカウントが気になるときがあります。そんなときにすぐにその人の Twitter アカウントを開けるように Google Chrome 拡張を作りました。pplog ではポエムを表示するページの上部にユーザー名が表示されています。この拡張をインストールすると、そのユーザー名の部分を Twitter へのリンクに変更します。

![main_image.png](https://qiita-image-store.s3.amazonaws.com/0/16758/c94f76c2-be51-38b0-c32f-f8013d3e6c56.png)

## Chrome ウェブストア
https://chrome.google.com/webstore/detail/addlinktotwitter-for-pplo/cehjdnflgjdajammopipcgipddmjjoin

## GitHub
https://github.com/suzuki86/add-link-to-twitter-for-pplog
CentOS 4サーバの/(ルートパーティション)に対するfsck

はじめに
===
古めのOSですが、CentOS 4サーバが突然停止し、サーバを起動したところ、コンソールに以下のメッセージが表示されておりました。

/tmp配下など/(ルートパーティション)にファイルを書き込めなくなっており、fsckでルートパーティションのファイルシステム修復が必要になりました。

```
/: UNEXPECTED INCONSISTENCY; RUN fsck MANUALLY.
(i.e., without -a or -p options)

*** An error occurred during the file system check.
*** Dropping you to a shell; the system will reboot
*** when you leave the shell.
Give root passwrd for maintenance
(or type Control-D to continue):
```

以下はfsckを実行して、ルートパーティションを修復した時のコマンドメモです。
fsck完了まで数時間かかりましたが、サーバは無事復旧しました。
今回は幸いにも、ルートパーティション内のファイルは消えることなく残っており、ファイルの書き込みなども正常に行えるようになりました。

/(ルートパーティション)に対するfsck実行例
===

・fsckを実行したいサーバのコンソールで、rootユーザのパスワードを入力します。

```
Give root password for maintenance
(or type Control-D to continue): →　rootのパスワードを入力します。
```

・fsck対象サーバのルートパーティションの情報を確認します。
fsck対象サーバのルートパーティションのデバイスファイル名を確認します。また、cat /etc/fstabとmountコマンドを実行して、ルートパーティションのファイルシステムを確認します。今回のサーバの場合はext3でした。

```
# df -Ph /
Filesystem          サイズ  使用  残り 使用% マウント位置
/dev/cciss/c0d0p3      20G  9.4G  8.9G  52% /
#

# cat /etc/fstab
　　(省略)
LABEL=/                 /                       ext3    defaults        1 1
　　(省略)

# mount
　　(省略)
/dev/cciss/c0d0p3 on / type ext3 (rw)
　　(省略)
```

・ルートパーティションを読み取りモードでマウントしなおします。
既に/tmp配下等にファイル書き込めない状態になっていましたが、念の為、ルートパーティションを読み取りモードでマウントしなおします。

```
# mount -o ro,remount /
```

・念の為、ルートパーティションに対して、ファイル書き込めない状態(読み取りになっている事)になっている事を確認します。

```
# date > /tmp/write_test.txt
```

・fsckを実行します。

```
# fsck -y -t ext3 /dev/cciss/c0d0p3
```

・ルートパーティションに対するfsckが完了するのを待ちます。以下のメッセージが完了されたらfsck完了です。

```
　(省略)
Free inodes count wrong (XXXXXXX, counted=XXXXXXX)

Fix? yes

/: ***** FILE SYSTEM WAS MODIFIED *****
/: ***** REBOOT LINUX *****
(Repair filesystem) 26 # exit

(Repair filesystem) 26 # reboot
```

fsck対象サーバ起動後の動作確認
===

fsck対象サーバの用途に応じて、動作確認の内容は異なると思いますが、最低限確認した方が良いかなと思う事を記載しました。

fsck実行後にサーバが起動してきたら、ルートパーティションにファイルが残っているか、ファイルを書き込めるか、fstabに記載したパーティションがマウントされているなどを確認します。

```
# ls -lrta /
# cat /etc/fstab
# df -Ph
# mount
# date >> /tmp/write_test.txt
# date >> /tmp/write_test.txt
# cat /tmp/write_test.txt
# rm /tmp/write_test.txt
```

ログを見てHDDやハードウェア系のエラーが出ていないか確認します。

```
# cat /var/log/messages
# dmesg
```

fsckで復旧したサーバのネットワークインターフェースや別サーバへの疎通が正常であるか確認します。

```
# ifconfig
# netstat -nr
# ping XX.XX.XX.XX
```

名前解決が行えるか確認します。

```
# dig www.example.com
```

自動起動を設定しているような意図したサービスやプロセスが起動している事を確認します。

```
# chkconfig --list
# ps awux | grep -v grep | sort
```

今回のfsck対象サーバはntpで時刻同期を行っているサーバでしたが、念の為、時刻がずれていない事も確認します。

```
# date
```

以上になります。
Docker でホスト再起動時のコンテナ起動を考える

自前サーバーで Docker コンテナを使ってサーバーにするのは便利なのですが、ホストを再起動するとコンテナが停止したままなのが不便なのです。

再起動後に自動とはいかないまでも、手動で一括サーバー起動をさせたいと思いました。

問題点
=====
 1) 再起動時に Docker コンテナが停止している、自動で起動しない
 2) fig を使ってコンテナ間異存や環境変数の指定を構築している場合、起動順序等必要な情報が fig の中にあって単純な再起動だと問題となる
 
Docker デーモンに `-r` スイッチを付けると、以前のコンテナを再起動してくれるという話も聞くのですが、なんかうまくいかなかったのと 2) が問題として解決しないといけないまま残るので不採用。

これまでどうしていたの
=====
これまでは再起動後各プロジェクトごとに `fig start` をして回っていました。

fig の指定ファイル名がデフォルト fig.yml でどれも同じ名前なこともあって、各プロジェクトごとにディレクトリが散らばっていてそこを巡回しつつ起動していくのが面倒だなと思っていた次第。

対策
=====
## 方針
 * 散らばっている fig ファイルを一ヶ所にまとめておきたい
   * figがあること前提です
 * /etc/docker-fig というディレクトリを作って、そこに各 fig.yml ファイルをシンボリックリンクはって集めておく
 * /etc/docker-fig に置いてあるシンボリックリンクに対し一つずつ `fig start` をかけていくスクリプトを用意
 * 再起動後は手作業でその起動スクリプトを実行する
   * 手作業だけれども手間は一回に減るので、まあよし

## fig のシンボリックリンクをまとめる
まあこれは手作業でやっていく

```
$ ln -s /home/mydir/myproject/fig.yml /etc/docker-fig/myproject
```
こんな感じで。

## スタートスクリプト
```
#!/bin/bash

ETCDIR=/etc/docker-fig

for FILE in ${ETCDIR}/*
do
  if [ -L ${FILE} ] ; then
    fig -f ${FILE} start
  fi
done
```

展望
=====
手作業が多くてダサいけれども、とりあえずこれでやってみる。

システム起動時にスタートスクリプトを実行させれば自動になるきもするのですが、コンテナが時たま起動に失敗するみたいなので手作業で見張っていないとまだ不安なところがあるのですよね。

これ以上になったらオーケストレーションツールの出番でしょうか。
Cognitoで認証して、STSで認可して、S3に画像をアップロードする。Rubyで。


## Cognitoとは

この記事が一番わかりやすかった。
http://qiita.com/imaifactory/items/b66cdf91118e3be6fe17

## 前提

- ````test.png```` がおいてある
- ARN（arn:aws:iam::00000000000:role/Cognito_photo1Auth_DefaultRole）にS3の操作権限を設定してある

````json:ARN
{
    "Version": "2012-10-17",
    "Statement": [{
        "Action": [
            "mobileanalytics:PutEvents",
            "cognito-sync:*",
            "s3:*"
        ],
        "Effect": "Allow",
        "Resource": [
            "*"
        ]
    }]
}
````

## 実装

````ruby:cognito.rb
require 'aws-sdk'

# Cognitoクライアントを作成する
cognito_identity = Aws::CognitoIdentity::Client.new(
    region: 'us-east-1',
    access_key_id: 'ACCESS KEY',
    secret_access_key: 'SECRET ACCESS KEY'
  )

# developer identityでログイン処理を行う
resp = cognito_identity.get_open_id_token_for_developer_identity(
    identity_pool_id: 'us-east-1:00000000-0000-0000-0000-000000000000',
    logins: { 'com.yujiroarai.provider' => 'abcde' }
  )

puts "Identity ID: #{resp.identity_id}"
puts "Access Token: #{resp.token}"

# STSクライアントを作成する
sts = Aws::STS::Client.new(
    region: 'ap-northeast-1',
    access_key_id: 'ACCESS KEY',
    secret_access_key: 'SECRET ACCESS KEY'
  )

# STSを使って、取得するアクセス権を定義
# user1以下の操作を許す
policy = JSON.generate(
      'Version' => '2012-10-17',
      'Statement' => [{
        'Effect' => 'Allow',
        'Action' =>  '*',
        'Resource' => 'arn:aws:s3:::s3upload-sample/user1/*'
      }]
    )

# Cognitoで取得したアクセストークンを使って、STSでアクセス権を取得する
r = sts.assume_role_with_web_identity(
    role_arn: 'arn:aws:iam::00000000000:role/Cognito_photo1Auth_DefaultRole',
    web_identity_token: resp.token,
    role_session_name: 'session_name',
    policy: policy
  )

# STSで取得したクレデンシャル情報を使って、S3クライアントを作成する
s3 = Aws::S3::Client.new(
  region: 'ap-northeast-1',
  credentials: r.credentials,
  http_wire_trace: true
)

# ファイルを読み込み
file_open = File.open('test.png')

# ファイルをアップロードする
s3.put_object(
    bucket: 's3upload-sample',
    body: file_open,
    key: 'user1/test.png'
)
````
DapperのQueryを使ってマルチマッピングしてみる

#はじめに
先日、[このような](http://qiita.com/NetSeed/items/7e0e25757080e0259416)投稿をしましたが、もっと楽にマルチマッピングする方法があったので、追記的にまとめていきたいと思います。

#下準備と利用環境
以下の環境を利用しています。

1. C# 5.0
2. Dapper 1.38.0.0
3. System.Data.SQLite 1.0.94.0

また、以下のようなテーブルスキーマを使います。

```sql

CREATE TABLE Categories (
    Id   INTEGER PRIMARY KEY,
    Name TEXT    NOT NULL
                 UNIQUE
);

CREATE TABLE Items (
    Id         INTEGER PRIMARY KEY,
    CategoryId INTEGER NOT NULL
                       REFERENCES Categories (Id) ON UPDATE CASCADE
                                                  ON DELETE CASCADE,
    Name       TEXT    NOT NULL
                       UNIQUE
);

```

また、マップ先は以下の通りです。

```csharp
	public class Category
	{
		public long? Id { get; set; }
		public string Name { get; set; }
	}

	public class Item
	{
		public long? Id { get; set; }
		public long? CategoryId { get; set; }
		public string Name { get; set; }

	}
```

#実際に使ってみる

```sql
SELECT *
  FROM Categories
       INNER JOIN
       Items ON Categories.Id = Items.CategoryId;
```

上記のようなクエリを先に定義した、Categoryクラスと、Itemクラスにマップして、匿名クラスを生成するには以下のように書きます。

```csharp
	internal class Program
	{
		private static void Main(string[] args)
		{
			SQLiteConnectionStringBuilder bld = new SQLiteConnectionStringBuilder
			{
				DataSource = "Sample.db3",
				ForeignKeys = true,
			};

			using (SQLiteConnection conn = new SQLiteConnection(bld.ToString()))
			{
				var ret =
					conn.Query("select * from Categories inner join Items on Categories.Id=Items.CategoryId ",
						(Category c, Item i) => new {i.Id, CategoryName = c.Name, i.Name});

				foreach (var elem in ret)
				{
					Console.WriteLine(elem);
				}
			}
		}
	}

```

このケースの場合、splitOnは、デフォルトのIdとなっているので指定せずに済みますが、もし違う場合は、適宜調整が必要になります。

その他の注意する点に関しては、先日のエントリの、[ここらへん](http://qiita.com/NetSeed/items/7e0e25757080e0259416#%E8%A9%B3%E7%B4%B0)とか、[このへん](http://qiita.com/NetSeed/items/7e0e25757080e0259416#%E5%BF%9C%E7%94%A8%E4%BE%8B%E3%81%A8%E8%A8%80%E3%81%86%E5%90%8D%E3%81%AE%E8%9B%87%E8%B6%B3)を参考にしてください。

#まとめ
先日のQueryMultiple経由の場合に比して、GridReader経由で取得する必要がない分、楽にすっきりかけると思います。
ただ、GridReaderは結果をBufferしてくれるので、逆に様々な形で繰り返し同じテーブルを相手にする場合は、[QueryMultiple](http://qiita.com/NetSeed/items/7e0e25757080e0259416)を利用した方が良いと思います。
部分適用ってなんだ

## はじめに

この記事はポエムです。「ポエムである」とは、形式的定義に依らず、頭の中にあるふわっとした概念をだらだらとdumpした文章に過ぎないことを意味します。

カレーはとてもスパイシーで魅惑的な料理ですが、PHPでは特に覚えておく必要のある単語ではないので忘れてください。OCamlとかHaskellに興味が湧いたらまたきてね。

## 部分適用(partial application)とは

いくつかの引数が必要な函数があったとします。ここでは例として台形の面積を求めます。

台形の面積公式は $\frac{(上底 + 下底) \times 高さ}{2}$ だと小学校で習ったおぼえがあるので、PHPでは以下のように書けます。

```php
<?php

/**
 * @param  int|float $height 高さ
 * @param  int|float $b1     上底
 * @param  int|float $b2     下底
 * @return float             台形の面積
 */
function area_trapezoid($height, $b1, $b2)
{
    return (float)((($b1 + $b2) * $height) / 2);
}

area_trapezoid(3, 5, 4); // 13.5
```

じゃあ次に上底を`3`、下底を`5`に固定して、高さだけを変更したいとします。

```php
area_trapezoid(なにか, 3, 5);
```

こんなふうに、決まってる引数を穴埋めするのが部分適用の基本的な概念です。

なにかって何だよ。どうやって実現すりゃいいんだよ、ってのはPHPでもいくつもやりかたがあるので紹介します。

### `function`を定義する

```php
function area_trapezoid_3_5($height)
{
    return area_trapezoid($height, 3, 5);
}

foreach (range(1, 10) as $n) {
    var_dump(area_trapezoid_3_5($n));
}
```

とてもわかりやすいやりかたです。しかし、「30と50に固定したい」ときには `area_trapezoid_30_50()` をいちいち定義しなければいけなくなります。

また、函数定義はグローバルに影響するので、あまりやりたくありません。

### `class`を定義する

```php
final class Trapezoid
{
    /** @var int|float */
    private $b1;
    /** @var int|float */
    private $b2;

    public function __construct($b1, $b2)
    {
        $this->b1 = $b1;
        $this->b2 = $b2;
    }

    public function area($height)
    {
        return area_trapezoid($height, $this->b1, $this->b2);
    }
}

$trapezoid_3_5 = new Trapezoid(3, 5);

foreach (range(1, 10) as $n) {
    var_dump($trapezoid_3_5->area($n));
}
```

このアプローチのいいところは、`$t2 = new Trapezoid(30, 50)`のように別のインスタンスを作れば、固定する値を簡単に変更できるところです。

しかし、面積を求めたいがためにクラスを定義するのは大がかり過ぎる感じもします。

それに、「上底と高さ」を固定したいと思ったときはクラスの設計を変更したり、別のメソッドを定義しなければなりません。

### クロージャ

```php
$trapezoid_fix_base = function ($b1, $b2) {
    return function ($height) use ($b1, $b2) {
        return area_trapezoid($height, $b1, $b2);
    };
};

$trapezoid_area_3_5 = $trapezoid_fix_base(3, 5);

foreach (range(1, 10) as $n) {
    var_dump($trapezoid_area_3_5($n));
}
```

この方法の良いところは、単なる変数なので、(適切にメソッド内などで利用すれば)影響範囲をローカルにできることです。また、クラスを定義したときと同じように、インスタンスを生成するのと似た感覚で利用することができます。

クラスを定義するときと比較したデメリットとしては、同じパラメータを使って面積ではなく周の長さを求めたい、と思ったときに値を再利用しにくいことです。 *(工夫をすればできなくはないんだけど、うーん…)*

上の例は柔軟にしたいがためにやりすぎた感じもあるので、下のようにも書けます。

```php
$b1 = 3;
$b2 = 5;
$trapezoid_area = function ($height) use ($b1, $b2) {
    return area_trapezoid($height, $b1, $b2);
};

foreach (range(1, 10) as $n) {
    var_dump($trapezoid_area($n));
}
```

```php
$trapezoid_area_3_5 = function ($height) {
    return area_trapezoid($height, 3, 5);
};

foreach (range(1, 10) as $n) {
    var_dump($trapezoid_area_3_5($n));
}
```

### 素朴な解答

最初の題意を満たすなら、奇を衒ったりしないで、これが一番素直でいいんじゃないかな…

```php
foreach (range(1, 10) as $n) {
    var_dump(area_trapezoid($n, 3, 5));
}
```

大正義。

## 配列が欲しい

上の問題では`foreach`でループを廻して`var_dump()`で出力してますが、配列が欲しいとします。

```php
$a = [];
foreach (range(1, 10) as $n) {
    $a[] = area_trapezoid($n, 3, 5);
}

$result = $a;
```

はい、これで完成です。よかった!

## 今回のまとめ

素直に`foreach`すればいいし、`array_map`とか特別な部分適用とか、PHPでは別に必要なかった。