OmniAICreator/Qiita-1.07M huggingface dataset:
golang で html/template でのテンプレートの継承と、HTML エスケープしないで変数を出力する方法 (Django, Jinja みたいに)


コード
--------
*template/base.html*

```jinja
{{define "base"}}<!doctype html>
<html>
    <head>
        <meta charset="utf-8">
        <title>{{template "title" .}}</title>
    </head>

    <body>
        <div class="content">
            {{template "body" .}}
        </div><!-- /.content -->
    </body>
</html>{{end}}

```


*template/view.html*

```jinja
{{define "title"}}{{.Title}}{{end}}

{{define "body"}}
<h1>{{.Title}}</h1>
<article>
    {{.Body|safehtml}}
</article>
{{end}}
```

*templatetest.go*

```go
package main

import (
	"html/template"
	"net/http"
)

func viewHandler(w http.ResponseWriter, r *http.Request) {
	funcMap := template.FuncMap{
		"safehtml": func(text string) template.HTML { return template.HTML(text) },
	}
	templates := template.Must(template.New("").Funcs(funcMap).ParseFiles("templates/base.html",
		"templates/view.html"))
	dat := struct {
		Title string
		Body  string
	}{
		Title: "メイジェイって",
		Body:  "いっつも<b>ありのまま</b>だよね",
	}
	err := templates.ExecuteTemplate(w, "base", dat)
	if err != nil {
		http.Error(w, err.Error(), http.StatusInternalServerError)
	}
}

func main() {
	http.HandleFunc("/", viewHandler)
	http.ListenAndServe(":8080", nil)
}
```

```bash
go run templatetest.go
```

して ブラウザで `http://localhost:8080` を開く。


ポイント
------
- `template.FuncMap{}` と `template.Funcs()` でテンプレート中で使える独自メソッドをテンプレート側に登録しているところ。
  *template/view.html* の `{{.Body|safehtml}}` で使ってる
- ネスト対象の子テンプレートを  
    
    ```go
    template.ParseFiles("templates/base.html", "templates/view.html")
    ```
    で読み込んでいるところ。

-  
    ```go
    templates.ExecuteTemplate(w, "base", dat)
    ```
    で、一番大きな範囲の `base` だけを明示的に指定しているところ。



メモ
--------
Go では `var := template.HTML(var)` することで、
Django での `var = mark_safe(var)`  みたいなことが出来る。

ただ、このままだと、
例えば DB に保存する場合に型の違いを処理しないといけなかったりして、
そうじゃなくて、出力時だけ生で出力する、
Django や Jinja2 での `{{var|safe}}`
みたいな仕組みが欲しかった。

ちなみに `html/template` じゃなくて `text/template` を使うと自動エスケープを気にしなくて良くなる感じだった。この場合、必要なところだけ `html.EscapeString()` でエスケープ出来るが、せっかく安全側に倒してくれる仕組みを言語のほうで用意してくれているので、そっちの恩恵にあずかりたかった。

----

下記を参考にさせて頂いた。

- [html/templateでテンプレートを継承する - YAMAGUCHI::weblog](http://ymotongpoo.hatenablog.com/entry/2012/12/16/225803)
- [go - Template and custom function; panic: function not defined - Stack Overflow](http://stackoverflow.com/questions/17843311/template-and-custom-function-panic-function-not-defined)
- [build-web-application-with-golang/07.4.md at master · astaxie/build-web-application-with-golang · GitHub](https://github.com/astaxie/build-web-application-with-golang/blob/master/ja/ebook/07.4.md)

ちなみに [html - GoDoc](https://godoc.org/code.google.com/p/go.net/html#UnescapeString) を見ると `func UnescapeString(s string) string` なんてものもあるみたい。
webkitAudioContextからAudioContextに変更

chrome36?からWeb Audioの仕様が変わったようなのでとりあえず動くコードのメモ
[http://updates.html5rocks.com/tag/webaudio](http://updates.html5rocks.com/tag/webaudio)


```coffeescript:audio.coffee
# https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API/Porting_webkitAudioContext_code_to_standards_based_AudioContext#Removal_of_the_synchronous_AudioContext.createBuffer_method

# webkit以外も動くように
window.AudioContext = window.AudioContext || window.webkitAudioContext
context = new AudioContext()
src = context.createBufferSource()
gain = context.createGain()   # createGainNode()から変更
analyserNode = context.createAnalyser()
analyserNode.connect(context.destination)
src.connect(gain)
gain.gain.value = 0.85
gain.connect analyserNode
_analyzedData = new Uint8Array(analyserNode.frequencyBinCount)

play = ->
  context.decodeAudioData request.response, (onSuccess = (decodedBuffer) ->
    # bufferはcallback内に変更
    src.buffer = decodedBuffer
    src.start(0) #noteOn()から変更
  ), onFailure = -> console?.info "Decoding the audio buffer failed"

# 再生用
request = new XMLHttpRequest()
url = "some/audiodata.mp3"
request.open "GET", url, true
request.responseType = "arraybuffer"
request.onload = -> play()
request.send()

```
Macの/lost+found/以下のファイルを調べて必要なければ消してディスクスペースを空ける

# 概要
macのディスクスペースがいっぱいになってきたから消せるものないか調べたら`/lost+found/`以下に数GBあるファイルがあったので、調べて消した。その手順の共有。

# 状況
こんな感じだった

```
$ ls -la /lost+found
total 18824776
drwxrwxrwt@  4 root     wheel         136 Jan  5  2014 .
drwxr-xr-x  34 root     wheel        1224 Aug  1 05:20 ..
-rw-r--r--   1 takc923  staff  5290062380 Jan  5  2014 iNode171581888
-rw-r--r--   1 root     wheel  4348218934 Sep 22  2012 iNode94162499
```

# そもそも/lost+found/とは
Unix系OSでOSが異常終了した時とかにファイルはあるけどどのディレクトリにあったファイルか分からん、ってやつをとりあえずここに置いておく、って言うディレクトリ。

# /lost+found/にあるファイルを調べる。
`file`コマンドを使う

```
$ file /lost+found/iNode*
/lost+found/iNode171581888: xar archive - version 1
/lost+found/iNode94162499:  xar archive - version 1
```

xar圧縮ファイルらしい。
中身を調べる。

```
$ xar -t -f /lost+found/iNode171581888
Distribution
InstallMacOSX.pkg
InstallMacOSX.pkg/Bom
InstallMacOSX.pkg/Payload
InstallMacOSX.pkg/Scripts
InstallMacOSX.pkg/PackageInfo
InstallMacOSX.pkg/InstallESD.dmg
Resources
Resources/ar.lproj
Resources/ar.lproj/Localizable.strings
Resources/ar.lproj/VolumeCheck.strings
Resources/ca.lproj
Resources/ca.lproj/Localizable.strings
Resources/ca.lproj/VolumeCheck.strings
Resources/cs.lproj
Resources/cs.lproj/Localizable.strings
略
```

```
$ xar -t -f /lost+found/iNode94162499
Distribution
InstallMacOSX.pkg
InstallMacOSX.pkg/Bom
InstallMacOSX.pkg/Payload
InstallMacOSX.pkg/Scripts
InstallMacOSX.pkg/PackageInfo
InstallMacOSX.pkg/InstallESD.dmg
Resources
Resources/ar.lproj
Resources/ar.lproj/Localizable.strings
Resources/ar.lproj/VolumeCheck.strings
Resources/ca.lproj
Resources/ca.lproj/Localizable.strings
Resources/ca.lproj/VolumeCheck.strings
Resources/cs.lproj
Resources/cs.lproj/Localizable.strings
略
```

どちらもOSのインストーラらしい。OS上げて結構経つし消したところで問題なさそう。

# いらないファイルをゴミ箱に移す
とは言え念には念を入れて、完全に消す前にゴミ箱に移して復旧出来るようにしておく。
FinderでCommand+Shift+g押して`/lost+found/`と入力してEnter押して`/lost+found`に移動する。
あとは普通に削除する。
これで何日か過ごして問題なさそうなら完全に消す。

# 参考

- [Big iNode file in lost+found | Apple Support Communities](https://discussions.apple.com/thread/3249491)
GitHub FlowでPull Requestベースな開発フローの進め方

弊社、[日本CAW](http://j-caw.co.jp/)での開発フローはGitHub Flowをベースにしてpull requestを活用したスタイルを採用しています。

最近、有志のチームでサクっと行きたいラーメン屋さんを見つけることができるアプリ「[めんこれ](https://play.google.com/store/apps/details?id=com.mencolle)」というのを開発しているのですが、そろそろ開発フローを整備しようという話になったので、今まではクローズドでやってましたが、公開しちゃおうと思ったわけです。

普段はdevelopブランチをメインブランチにしているんですが、スピード感あるデプロイサイクルにするためにmasterブランチをメインにします。

#実装者のフロー
GitHub Flowについてはこちらの日本語訳を参照のこと。
https://gist.github.com/Gab-km/3705015

GitHubのissueで開発タスクを管理していますので、開発対象のリポジトリで自分にAssignされているタスクを確認します。

![スクリーンショット 2014-08-03 14.11.51.png](https://qiita-image-store.s3.amazonaws.com/0/47677/a1b389e1-45be-54aa-63a9-f1af3b92855c.png)

下記の#58のissueに着手する例を示します(GUIツールは対応する操作を)。

![スクリーンショット 2014-08-03 14.21.10.png](https://qiita-image-store.s3.amazonaws.com/0/47677/542b87ec-10fe-baa1-58a0-ec9855a62c67.png)

ローカルマシンでmasterから作業ブランチを作成し、そのブランチ上で実装します。

```
# カレントブランチをmasterに移動
$ git checkout master

# リモートからmasterブランチを取得し最新にする
$ git pull origin master

# masterブランチから作業ブランチを派生する
$ git checkout -b issue-58
```

実装が終わったらブランチにソースコードをコミットします。作業中コミットが複数回発生しても問題ありません。

```
# 変更をindexに追加
$ git add -A

# 変更をコミット
# 必ずissue番号を含めて下さい(GitHub上で参照しやすくなるので)。
$ git commit -m "#58 広告設置  
```

作業ブランチをpushしてpull requestを作成します。

```
$ git push origin issue-58
```

New pull request

![スクリーンショット 2014-08-03 14.29.13.png](https://qiita-image-store.s3.amazonaws.com/0/47677/aa1e72ca-ec53-5177-f531-0709350613a9.png)

自分がpushした作業ブランチを選択します。左がmasterブランチ、右が自分が作成したブランチになっていることを確認し、問題なければCreate pull requestします。

![スクリーンショット 2014-08-03 14.32.42.png](https://qiita-image-store.s3.amazonaws.com/0/47677/f9e895f2-98b3-5c08-7d87-1add762412b0.png)

特記事項などあれば、 下記画面で入力してCreate pull requestしたら完了です。

![スクリーンショット 2014-08-03 14.34.44.png](https://qiita-image-store.s3.amazonaws.com/0/47677/3bd5bafc-51e1-b5a2-bf3f-c3e4b7813796.png)

#WIP PRについて
実装の仕方や、コードの設計など、コードに紐づく議論をしやすくするために、WIP PR(Work In Progress Pull Request)という手法を使います。

参照
http://www.slideshare.net/asuenami/wip-pr

下記のように、pull request作成時に頭に[WIP]をいれてください。

 ![スクリーンショット 2014-08-03 14.54.01.png](https://qiita-image-store.s3.amazonaws.com/0/47677/19a39eb5-4a77-4036-3c5d-26dcc492faa5.png)

この名前がついたpull requestはマージされず、議論や確認のために参照されます。WIP PR作成者は議論や確認が済んだらClose pull requestしてください。

#レビュワーについて
pull request画面で未消化のpull requestを確認します。

![スクリーンショット 2014-08-03 15.03.29.png](https://qiita-image-store.s3.amazonaws.com/0/47677/d92ecd3e-ed6b-bf13-3599-22f1432d5c64.png)

基本はissue作成者が対象のpull requestをマージしますが、全てのメンバがpull requestをマージする権限を持つので、可能なものはマージお願いします。ただし自分のpull requestは必ず他メンバにマージしてもらってください。

またWIP PRの回答可能なものには回答をお願いします。

#めんこれ渋谷
何気なく「あー今日ラーメン食べたいなー」ってときにサクッと行きたいラーメン屋をみつけられるアプリ「めんこれ渋谷」現在Android版のみ公開されてます！

https://play.google.com/store/apps/details?id=com.mencolle

![Screenshot_2014-06-26-11-38-56.png](https://qiita-image-store.s3.amazonaws.com/0/47677/edefe300-1dff-c250-7296-9fd1c0ad80b8.png)
Android Studio使うときにハマりそうなところ


完全に個人用の備忘録だし
やっている設定は自己責任なのでよろしくお願いします

Javaの実行環境がない状態で、Android Studioを起動させようとしたら
何も言わずに起動もしないというの共有したい

## JDKインストール

JDKかJREをインストールしましょう

## JAVA_HOMEの設定

```
export JAVA_HOME=`/usr/libexec/java_home`
```

## Android StudioがJVM8でも動くようにする

```
中略
    <key>JVMOptions</key>
    <dict>
      <key>ClassPath</key>
      <string>$APP_PACKAGE/lib/bootstrap.jar:$APP_PACKAGE/lib/extensions.jar:$APP_PACKAGE/lib/util.jar:$APP_PACKAGE/lib/jdom.jar:$APP_PACKAGE/lib/log4j.jar:$APP_PACKAGE/lib/trove4j.jar:$APP_PACKAGE/lib/jna.jar</string>

      <key>JVMVersion</key>
-      <string>1.6*</string>
+      <string>1.8*</string>
後略
```
MacOSX 10.9.4 へのRuby導入メモ


## Homebrew 導入
これはバージョンによって異なるので、
http://brew.sh/index_ja.html
を参考にインストールする。

以下は、
http://www.d-wood.com/blog/2014/03/20_5847.html
を参考にしながら、入れていく。

## rbenvの導入
Brewを利用してインストールする。

```
brew install openssl readline
brew install rbenv
brew install rbenv-gemset
brew install rbenv-gem-rehash
```

## rbenv でのruby 導入

### インストール
```
rbenv install --list
rbenv install 2.1.2
```

### 環境設定
```.bash_profile
export PATH=$HOME/.rbenv/bin:$PATH
eval "$(rbenv init -)"
```

環境設定を読み込んでから、以下のコマンドを実行することで、実際に実行されるRuby のバージョンに変更される。

```
renv global 2.1.2
ruby -v
```
以下のように導入したバージョンが表示されていれば完了。

```
ruby 2.1.2p95 (2014-05-08 revision 45877) [x86_64-darwin13.0]
```
express4でsocket.io 1.0xを使ってみる


express-generatorのコマンド  

```
$express -e socketSample
```
で生成したテンプレートとsocketIO v1.0を混ぜる方法。
express4では、  npm startで
bin/www
が実行されるようになっています。

``` javascript:www
#!/usr/bin/env node
var debug = require('debug')('sockets');
var app = require('../app');

app.set('port', process.env.PORT || 3000);

var server = app.listen(app.get('port'), function() {
  debug('Express server listening on port ' + server.address().port);
});
```

これをsocket.ioを使うように変更します。
socket.ioの[document](http://socket.io/docs)によれば、
express3 or 4の場合は、

```javascript:
var app = require('express')();
var server = require('http').Server(app);
var io = require('socket.io')(server);

server.listen(80);
```

とせよとありますので、wwwを以下のように変更しました。  skioというモジュールを作って、そちらにsocketioの処理は任せています。
expressはapp.jsにメインのコードが書かれますが、app.jsからの相対パスを各コードの上に書いておきます。

``` javascript:改良後の./bin/www
#!/usr/bin/env node
var debug = require('debug')('sockets');
var app = require('../app');
var skio = require('../routes/model/skio');

app.set('port', process.env.PORT || 3000);

socketio();
````

``` javascript:./routes/model/skio.js
var app = require('../../app');
var http = require('http').Server(app);
var io = require('socket.io')(http);

function skio() {
  // Socket.IO
 http.listen(app.get('port'), function() {
      console.log('listening!!!');
  });

 io.on('connection', function(socket){
        socket.on('chat message', function(msg){
            console.log('message: ' + msg);
            io.emit('chat message', msg);
      });
  });
}

module.exports = skio;

```

このようにwwwではexpressにport番号だけを設定し、
後でhttpでlistenしておきます。
app.jsへの修正はいっさいしていません。generetorが吐いたコードのままです。

localhost:3000では無事つながりました。
それ以外は試していません。
CoreOSインストール

ISOからインストールする手順

ISOを設定するマシン → マシンA
マシンAにSSHでログインするマシン → マシンB

# (マシンA)ISOを設定してインストールするマシンを起動する

# (マシンA)coreユーザーのパスワード設定

```
sudo passwd core
```

# (マシンB)先ほど設定したcoreユーザーでログイン

# (マシンB)インストール設定ファイルを作成

```
sudo vi cloud-config.yml
```

```yaml:cloud-config.yml
#cloud-config
ssh_authorized_keys:
    - ssh-rsa AAAA
coreos:
  units:
    - name: 10-static.network
      command: start
      content: |
        [Match]
        Name=enp0s3

        [Network]
        DHCP=false
        Address=192.168.0.XXX/24
        Gateway=192.168.0.YYY
        DNS=8.8.8.8
```

# (マシンB)CoreOSのインストール

```
sudo coreos-install -d /dev/sda -C stable -c cloud-config.yml
```

# (マシンB)シャットダウン

```
sudo shutdown -h now
```

# マシンAからディスク(ISO)を取り出す

# マシンAを起動する

以上でcoreosのインストールは終了です。
Django で ダミー画像ファイルを置かずに Python で作成して画像アップロードのテストをする

画像ファイルをローカルに置いてもアップロードのテストできるが、テストコード内で完結させるため。

## サンプルアプリ作成
(python2.7, django1.6)


```
$ django-admin.py startproject core
$ mv core photo_book
$ cd photo_book
$ python manage.py startapp photos
$ mkdir -p static/upload  # 画像を保存するディレクトリ

```

### core/

``` python:settings.py
# 追加箇所のみ
IINSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'photos',  # 追加
)

MEDIA_ROOT = os.path.join(BASE_DIR, 'static/')  # 追加
```

``` python:urls.py
from django.conf.urls import patterns, include, url

from django.contrib import admin
admin.autodiscover()

from photos.views import ImageCreateView

urlpatterns = patterns(
    '',
    url(r'^images/$', ImageCreateView.as_view(), name='images'),
    url(r'^admin/', include(admin.site.urls)),
)

```


### photos/

#### モデル

``` python:models.py
from django.db import models


class Photo(models.Model):
    image = models.ImageField(upload_to='upload')

```

#### フォーム

``` python:forms.py
from django import forms


class PhotoForm(forms.Form):
    image = forms.ImageField()
```

#### ビュー

``` python:views.py
from django.views.generic.edit import CreateView

from photos.models import Photo


class ImageCreateView(CreateView):
    model = Photo
    success_url = '/'

```

#### テスト

``` python:test.py
from StringIO import StringIO

from django.core.urlresolvers import reverse
from django.test import TestCase
from photos.models import Photo


class CreateImageTest(TestCase):
    def test_post(self):
        url = reverse("images")

        dummy_image = StringIO(
            'GIF87a\x01\x00\x01\x00\x80\x01\x00\x00\x00\x00ccc,\x00'
            '\x00\x00\x00\x01\x00\x01\x00\x00\x02\x02D\x01\x00;'
        )
        dummy_image.name = 'dummy_image.gif'
        dummy_image.content_type = 'image/gif'
        response = self.client.post(url, {'image': dummy_image})

        self.assertEqual(response.status_code, 302)
        # dbに保存されたか確認
        self.assertEqual(Photo.objects.count(), 1)
        # 保存された画像とアップロードしたダミー画像が同じか確認
        uploaded_image = StringIO(open(Photo.objects.last().image._get_path(), 'rb').read())
        self.assertEqual(uploaded_image.getvalue(), dummy_image.getvalue())
```


## テスト実行

```
$ python manage.py test
Creating test database for alias 'default'...
.
----------------------------------------------------------------------
Ran 1 test in 0.042s

OK
Destroying test database for alias 'default'...
```


## 参考

- [http://stackoverflow.com/questions/2473392/unit-testing-a-django-form-with-a-filefield]()
- [http://stackoverflow.com/questions/22535240/in-django-which-format-does-models-imagefield-take-by-default]()
Spring Data JPA の Specificationでらくらく動的クエリー


Spring DATA JPA では Repository インターフェイスにメソッドを定義するだけで簡単にクエリーを実装することができるが、任意指定の検索条件があるような動的クエリーの実装には向いていない。

動的クエリーとは、検索条件の値が変化するだけでなく、検索条件そのものが変化するようなクエリーである。

例えば、ユーザーの検索条件に「ユーザー名」と「メールアドレス」の２つがある場合、`findByNameAndEmail()`というメソッドをつくればいいが、検索条件が任意入力の場合、

* 両方入力 -> findByNameAndEmail()
* ユーザー名のみ入力 -> findByName()
* メールアドレスのみ入力 -> findByEmail()
* 両方未入力 -> findAll()

の4パターンの検索メソッドが必要になってしまう。
４つくらいならそれぞれに対応したfindBy***メソッドを作成してもいいが、検索条件が増えてくるととても対応しきれなくなる。

こういったケースでは、Specification を使用して「パラメータが未入力だったら無効になる検索条件」を実装すると簡単に動的クエリーを作成することができる。

Specificationは何らかの検索条件を表すインターフェイスで、実装クラスではCriteriaAPIを使用して検索条件を実装する。

Specification を使用するには、先ず Repositoryインターフェイスを JpaSpecificationExecutor を継承した形にする。
JpaSpecificationExecutor には `List<T> findAll(Specification<T> spec)` 等のメソッドがあり、これでSpecificationを使った検索を実行できる。

```java:UserRepositoly.java
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
public interface UserRepository extends JpaRepository<User, Long>, JpaSpecificationExecutor<User> {
}
```

次に、検索条件を実装した Specification を返すメソッド群を作成する。
**ここで引数がnullや空文字の時にnullを返すことでその検索条件を無効にすることができる。** 

```java:UserSpecifications.java
import org.springframework.data.jpa.domain.Specification;
public class UserSpecifications {
    /**
     * 指定文字をユーザー名に含むユーザーを検索する。
     */
    public Specification<User> nameContains(String name) {
        return StringUtils.isEmpty(name) ? null : new Specification<User>() {
            @Override
            public Predicate toPredicate(Root<User> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
                return cb.like(root.get("name"), "%" + name + "%");
            }
        };
    }
    /**
     * 指定文字をメールアドレスに含むユーザーを検索する。
     */
    public Specification<User> emailContains(String name) {
        :
    }
}
```

java8のラムダ式で書くとこんな感じ。

```java:UserSpecifications.java
    public Specification<User> nameContains(String name) {
        return StringUtils.isEmpty(name) ? null : (root, query, cb) -> {
            return cb.like(root.get("name"), "%" + name + "%");
        };
    }
```

最後に呼び出し側では Specifications を使用して検索条件を結合する。
ここでは引数のnullチェック等は不要なのでそのまま呼び出せばよい。
検索条件が増えた場合には、対応するSpecificationを返すメソッドとそれを呼び出す行を追加するだけで良い。

```java:UserService.java
import static UserSpecifications.*;
public List<User> findUsers(String name, String email, Tag followTag, Long ContributionCount) {
    return userRepository.findAll(Specifications
        .where(nameContains(name))
        .and(emailContains(email))
        .and(flolowTagsHas(followTag))
        .and(contributionCountGreaterThan(Contribution))
    );
}
```
PHPUnitの実行結果をGrowlに通知する方法

を作ったという話（宣伝）。

![phpunit-growlprinter.png](https://qiita-image-store.s3.amazonaws.com/0/17438/416ffbff-8c8b-ff22-bb0e-8679c357e747.png)

- https://github.com/iakio/phpunit-growlprinter
- https://packagist.org/packages/iakio/phpunit-growlprinter

なお、他の方法としては、[Stagehand_TestRunner](https://github.com/piece/stagehand-testrunner)や、Rubyのwatchr、guard、Nodeのgruntやglupもあります。

これらの方法とは以下のような違いがあります

* GNTPもPHPで実装しているので、growlnotifyコマンドなどは不要
* 通知しかしない。ファイルの更新の監視してテストを自動実行するような機能は無い

(2015/9/13)
このようなツールのためにcomposer.jsonを書き換えるのはイマイチのような気がしたので、pharで導入できるようにしました。

# 使い方
## PHAR

* [Githubのリリース](https://github.com/iakio/phpunit-growlprinter/releases)からpharファイルをダウンロードしてください。

* phpunitのbootstrapファイルを新たに作ります。既に他にbootstrapファイルがある場合はこのファイルからrequireしてください。

```php:bootstrap_growl.php
<?php
require_once "phpunit-growlprinter.phar";
// require_once "bootstrap.php";
```

* bootstrapとprinterClassを指定して実行します。

```
$ phpunit --bootstrap=bootstrap_growl.php --printer=iakio\\phpunit\\GrowlPrinter
```

## Composer

### インストール

composerでインストールしてください。

```:composer.json
{
    "require-dev": {
        "iakio/phpunit-growlprinter": "*"
    }
}
```

PHPUnit自体はcomposerでインストールしたものでもphar版phpunitでも大丈夫なはずです。但し現状、PHPStormのPHPUnitから使う場合は問題があるようです。PHPStormのRUN/Debug ConfigurationでPHPUnitではなくPHP Scriptとして動かすことはできます。

### 設定ファイルで設定する場合

```:phpunit.xml.dist
<phpunit printerClass="iakio\phpunit\GrowlPrinter"
         printerFile="src\iakio\phpunit\GrowlPrinter.php">
...
</phpunit>
```

autoloaderでprinterClassを見つけられる環境であれば、printerFileは不要なはずです。例えばcomposerでインストールしたphpunitであれば不要です。phar版phpunitを使っているのであれば、bootstrapファイルでautoloaderを指定してあれば問題ないでしょう。

あと、このphpunit.xml.distをTravisとかに持っていくとマズいので、phpunit.xmlで設定して.gitignoreしておくのが正解かもしれません。


### コマンドライン引数で設定する場合

```
$ vendor/bin/phpunit --printer=iakio\\phpunit\\GrowlPrinter
```

以上です。

# その他

* 設定とかないので、通知先のホストなどを変えたいときは23053番ポートをポートフォワードするか、GrowlPrinterクラスをオーバーライドしてください(README参照)。
* 私はMacを持ってないので、[Growl for Windows](http://www.growlforwindows.com/gfw/)でしか動作確認していません。Macでも動いたよとか教えていただけると嬉しいです。
* Growl以外にもいろんなものに通知できる作りにすればよかったかなあ。
SocketIO v1.0の勉強

socetIOのv1.0がリリースされたので、古いコードをアップデートしようとしたら、はまったのでメモ。
そのまま使えると思ったのだが。私がへぼいんだが。

## はまったところ
### socketio-clientへのパス
本家のchat[サンプル](http://socket.io/get-started/chat/)がnode.jsをweb serverにしたサンプルで、

```html:こんなファイルはない
<script src="/socket.io/socket.io.js"></script>
```

とindex.htmlに書かれており、該当のファイルはどこにもない。
私やcordovaのclientアプリからサーバーに接続したいので、loalhost相当で実行することになる。なので、実際の静的なディレクトリ的には以下。

```html:正式なパス
<script src="node_modules/socket.io/node_modules/socket.io-client/socket.io.js"></script>
```

猛烈にダサいし何か間違っていると思うが、仕方なし。

### io.connectが消えた。
io.connetがない。io()だけでいい。引数に何も指定しないと、勝手にコンテンツを起動したローカルホストにsocket.ioをつけて送信される。WebStormからテストプログラムを起動すると、
http://localhost:63342/socket.io
につなげようとするので、http://localhost:3000で立ち上げているテストサーバーにつながらなかった。アホすぎる。

```javascript
io('http://localhost:3000')
````
でつながった。
Singleton パターン


物議を醸し出しがちなパターン

## どんなパターン?

アプリの中で、そのclassのインスタンスの存在が1つしか許されない時に使用するパターン

```
Singleton パターンを用いると、そのクラスのインスタンスが1つしか生成されないことを保証することができる。 ロケールやLook&Feelなど、絶対にアプリケーション全体で統一しなければならない仕組みの実装に使用される
```
- [Singleton パターン - Wikipedia](http://ja.wikipedia.org/wiki/Singleton_%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3)

## どんな時に使うの?

例えば、設定ファイルの内容のコンテナ。アプリ上で1回だけ読めば良いやつとか

## ruby だと、singleton モジュールを使えばOK

```singleton.rb
require 'singleton'

# 設定ファイルの情報を格納する class
#
class Setting
  include Singleton
  def initialize
    @settings = YAML.load_file("settings.yml")
  end

  def [](key)
    @settings(key)
  end
end

# シングルトン は、#instance で、インスタンスを呼び出す
p Setting.instance.object_id # 70341972008800
p Setting.instance.object_id # 70341972008800

Setting.instance['name']

# private method `new' called for SingletonClass:Class (NoMethodError)
```

## クラス変数を使っても同様の実装は可能

```singleton.rb
require 'singleton'

# 設定ファイルの情報を格納する class
#
class Setting
  def self.[](key)
    settings(key)
  end

  def self.settings
    @@settings ||= YAML.load_file("settings.yml")
  end
end

Setting['name']
```

どっちが良いかはよくわかってないけど、個人的には明示的にシングルトンであることが判るから、
```Singleton``` を Mix-in する方が良いと思う

## Singleton の問題点

いろいろある

### グローバル変数の代わりになってしまう

何かしら状態を持つ Singleton の場合、その状態が色々な所で勝手に変更されてしまうとカオス

→ 状態が変更されるようなクラスは、Singleton にしない方が良い

### テストで順序依存が発生しやすい

何かしら状態を持つ Singleton の場合、
次のテストでも、その状態が維持されるため

→ ```before``` で、クラスをリセットする必要がある

### コードが密結合になる

```Setting.instance``` を呼んだ class は、```Setting``` class と密結合になる

- 密結合はテストの敵
- ```Setting``` ではない class を使うように変更になった時に、全てのコードを置換する必要が出る

→ 取りに行くのではなく、コンストラクタの引数で、貰うようにする
→ シングルトンにするのは良いけど、色んな class で好き勝手に instance を呼ばないようにする

## で、シングルトンは使って良いものなの?

個人的には、上記の意見を意識した上で使うべき理由が見いだせないので、使うことには消極的
ただ、色々な所でコンストラクタの引数で必要なインスタンスを渡すというのもちょっと違和感があるよね...

**迷ってます**

## 参考

- [例えば, Singleton を避ける - Born Too Late](http://blog.yuyat.jp/archives/1500)
- [70-シングルトンパターンの誘惑に負けない - やさしいデスマーチ](http://d.hatena.ne.jp/shuji_w6e/20110228/1298904578)
- [シングルトンが邪悪な理由 - まつぼ x Web](http://matsu.teraren.com/blog/2012/11/20/evil-singleton/)
パーティクル作成ツールparticle2dxがCoronaに対応

私はパーティクル作成サイトをやっています。
http://particle2dx.com/

cocos2dx専用でしたが、同じparticleDesigner形式のパーティクルがcoronaで使えるようになったので対応しました。

pro以上のライセンス(年6万)でないと実機では使えないのですが、シミュレータでなら誰でも使えますのでご興味ある方はどうぞ。
[Rails]Devise使ってて招待機能を実装したい時に使えるdevise_invitable


deviseと連携して使える招待の拡張機能メモ
https://github.com/scambra/devise_invitable

### 招待用のカラムを追加

```
def change
    add_column :users, :invitation_token, :string
    add_column :users, :invitation_created_at, :datetime
    add_column :users, :invitation_sent_at, :datetime
    add_column :users, :invitation_accepted_at, :datetime
    add_column :users, :invitation_limit, :integer
    add_column :users, :invited_by_id, :integer
    add_column :users, :invited_by_type, :string
    add_index :users, :invitation_token, :unique => true
end
```

### modelで招待を有効にする

```
devise :database_authenticatable, :confirmable, :invitable, :invite_for => 2.weeks
```

招待の期限とかも設定できるのいいですね

### 招待メールの送信

```
User.invite!(:email => "user@example.com", :name => "xxxxxxxx")
```

### 招待の承認

```
User.accept_invitation!(:invitation_token => params[:invitation_token], :password => "zzzzzzzz", :name => "xxxxxxxx")
```

### その他

色々カスタマイズできます。ドキュメントも充実してるので参考に。
https://github.com/scambra/devise_invitable
可変引数テンプレートで多重継承して新しい型を作るメモ

型を組み合わせた型を作るのに手作業だとめんどい。
テンプレートを使えば楽にできるらしい。
やってみよう
##コード例##

```cpp

#include <iostream>

// 頂点位置
class vec3_t
{
    float v[3];
};

// 色
class color4_t
{
    float c[4];
};

// テクスチャ座標
class uv_t
{
    float uv[2];
};

template < class... Bases >
    class compound_job : public Bases... {};

using vb_00_t = compound_job< vec3_t, color4_t >;
using vb_01_t = compound_job< vec3_t, uv_t >;

int main()
{
    using namespace std;
    
	cout << "sizeof( vec3_t )  " << sizeof( vec3_t )   << endl;
	cout << "sizeof( color4_t )" << sizeof( color4_t ) << endl;
	cout << "sizeof( uv_t )	   " << sizeof( uv_t )	   << endl;
    cout << "sizeof( vb_00_t ) " << sizeof( vb_00_t )  << endl;
    cout << "sizeof( vb_01_t ) " << sizeof( vb_01_t )  << endl;
    
    return 0;
}

```

### 結果 ###

```txt

Start

sizeof( vec3_t )  12
sizeof( color4_t )16
sizeof( uv_t )	   8
sizeof( vb_00_t ) 28
sizeof( vb_01_t ) 20

0

Finish

```

##参照##
Faith and Brave 様
[可変引数テンプレートで多重継承](http://faithandbrave.hateblo.jp/entry/20090527/1243413620)


コード確認。
[[Wandbox]三へ( へ՞ਊ ՞)へ ﾊｯﾊｯ](http://melpon.org/wandbox/permlink/DEnEsuUFzVP9ZpO7)


C++11の文法と機能
[可変引数テンプレート(Variadic Templates)](http://ezoeryou.github.io/cpp-book/C++11-Syntax-and-Feature.xhtml#temp.variadic)
多段階選抜

当日はテストケースがいくつか通らないところがあったのですが、
全く同じロジックで、Pythonで書き直したところテストが通りました。
（Rubyで動かなかったのがまだ原因突き止められず^^;）

問題は以下URL
http://nabetani.sakura.ne.jp/hena/ord24eliseq/

```py
# -*- coding: utf-8 -*-

import sys
import math
from scipy.special import cbrt
from string import rstrip
max = 10000

sqrts = []
cbrts = []

for i in range(1,max):
  if math.sqrt(i) - int(math.sqrt(i)) == 0:
    sqrts.append(i)

  if cbrt(i) - int(cbrt(i)) == 0:
    cbrts.append(i)

if __name__ == '__main__':
  while True:
    input = list(sys.stdin.readline().rstrip())
    ret = range(1,max)
    for x in input:
      count = 0
      tmp = list(ret)

      if x == 'S':
        for r in ret:
          for s in sqrts:
            if r == s:
              tmp[count + 1] = None

          count += 1

        ret = []
        for y in tmp:
          if y is not None:
            ret.append(y)
          
                        
      elif x == 's':
        for r in ret:
          for s in sqrts:
            if r == s:
              tmp[count - 1] = None

          count += 1

        ret = []
        for y in tmp:
          if y is not None:
            ret.append(y)
            
      elif x == 'C':
        for r in ret:
          for s in cbrts:
            if r == s:
              tmp[count + 1] = None

          count += 1

        ret = []
        for y in tmp:
          if y is not None:
            ret.append(y)
            
      elif x == 'c':
        for r in ret:
          for s in cbrts:
            if r == s:
              tmp[count - 1] = None

          count += 1

        ret = []
        for y in tmp:
          if y is not None:
            ret.append(y)
            
      elif x == 'h':
        ret = ret[100:]
      else:
        for y in range(0,len(ret),int(x)):
          tmp[y-1] = None
          
        ret = []

        for y in tmp:
          if y is not None:
            ret.append(y)
      
    print ','.join(str(x) for x in ret[0:10])
```
第24回オフラインリアルタイムどう書く「多段階選抜」の rubyによる実装


問題 http://nabetani.sakura.ne.jp/hena/ord24eliseq/
解答リンク集 http://qiita.com/Nabetani/items/1c83005a854d2c6cbb69
イベント http://yhpg.doorkeeper.jp/events/13159

当日お見せした実装。

```ruby
def is_sq(b)
  (b**0.5).round**2==b
end

def is_cu(b)
  (b**(1r/3)).round**3==b
end

module Enumerable
  def prepend( a )
    if block_given?
      a.each{ |e| yield e }
      self.each{ |e| yield e }
    else
      to_enum( :prepend, a )
    end
  end
end

def remove_before( seq )
  seq.each_cons(2).select{ |i| ! yield i[1] }.map{ |i| i[0] }
end

def remove_after( seq )
  seq.each_cons(2).select{ |i| ! yield i[0] }.map{ |i| i[1] }.prepend( seq.first(1) )
end

def solve_core( s )
  seq=loop.lazy.with_index(1).map{ |*i| i.last }
  s.chars.each do |cmd|
    seq=case cmd
    when "s"; remove_before( seq ){ |n| is_sq(n) }
    when "S"; remove_after( seq ){ |n| is_sq(n) }
    when "c"; remove_before( seq ){ |n| is_cu(n) }
    when "C"; remove_after( seq ){ |n| is_cu(n) }
    when "h"; seq.drop(100)
    when /[2-9]/
      seq.each_slice(cmd.to_i).flat_map{ |i| i[0..-2] }
    else
      raise "unexpected cmd : #{cmd} in #{s}"
    end
  end
  seq
end

def solve( s, len=10 )
  solve_core( s ).first(len).to_a.join(",")
end

DATA.map{ |line|
  id, src, expected = line.split(/\s+/ )
  actual = solve( src )
  ok = actual == expected
  puts "***NG*** : %s %s->%s ( %s )" % [ id, src, actual, expected ] unless ok
  ok
}.all?.tap{ |r| puts ( r ? "ok" : "NG" ) }

__END__
0 ss6cc24S  1,9,21,30,33,37,42,44,49,56
1 h 101,102,103,104,105,106,107,108,109,110
2 hh  201,202,203,204,205,206,207,208,209,210
3 hhh 301,302,303,304,305,306,307,308,309,310
50  23h465Ssc9CchC  1027,1033,1045,1047,1057,1069,1071,1075,1081,1093
```

いつも通り、テストデータの大半は省略。

たぶん、遅延評価を前提に無限リストを作って、それをこねると出来上がる、というのが順当な実装だと思う。

遅延評価がない処理系だと固定長で用意していくんだと思うけど、ruby には lazy があるので大丈夫。

実装で手間取ったのは
　「無限リストの前に要素を１つ追加する」
という処理を書く部分。
当初はどうせあるだろうと思って調べたんだけど実は存在せず、実装するはめになった。
普通に `[1]+lazy_enum` という感じで加算できていいと思うんだけど。

当日罠として機能した三乗根の計算は

`(b**(1r/3)).round**3==b`

という風にして浮動小数点の計算誤差を回避したんだけど、ruby には  `Math.cbrt` があることを教えていただいた。

```ruby
Math.cbrt(100**3) #=> 100.0
(100**3)**(1r/3) #=> 99.99999999999997

Math.cbrt(100.00000000000001**3) #=> 100.00000000000001
 (100.00000000000001**3)**(1r/3) #=> 99.99999999999999
```

という感じ。素晴らしい。
Crashlyticsを初めて導入した時にハマったことまとめ


先日初めてiOSアプリをリリースし、アプリの中にCrashlyticsを導入したのですが、いくつかハマった点があったのでまとめました。Crashlytics入れたのにうまく動かない！ということがあって、もし以下のケースに当てはまる場合は参考にしていただけると嬉しいです。

Crashlyticsの導入手順はasakaharaさんのこちらの記事が丁寧でわかりやすいです。

[Crash Report解析サービスのCrashlyticsを試してみた](http://qiita.com/asakahara/items/cfa404267ed60fb21927)

参考までに現在の環境は以下のとおりです。今後改善することもあるかもしれません。

* OS: Mac OS 10.9.4 Mavericks
* XCode: version 5.1.1

### Project作成はSingle View Projectを選ぶ
まず最初projectを作る際に気をつけないといけないのは、 **「Single View Project」** を選んでおくことです。
自分は画面ごとにxibを作る開発スタイルで、最初に **「Empty Application」** を選んで進めていたらなぜかクラッシュレポートが届きませんでした。

### アプリを起動したらUnable to locate application iconというエラーが出る
作りたてのプロジェクトにCrashlyticsを入れると、以下の様なエラーログが出ると思います。

```
2014-07-27 11:23:04.283 sample[925:3603] [Crashlytics] Unable to locate application icon

```

Crashlyticsのdashboardでアイコンを表示させることができない時に表示されるエラーのようです。
Images.xcassetsでAppIconを設定してあげないとダメなようでした。Icon.pngを放り込むとDEBUG環境だとアイコンが表示されるので、気づかない場合があるかもしれません。

ググってたら具体的な解決策が出ていなくて、なぜか[TwitterのDM](https://twitter.com/crashlytics/status/394907904110624768)で回答が送られていて分からなかったので結構ハマりました…。

### [[Crashlytics sharedInstance] crash] でクラッシュレポートが届かない

Crashlyticsを自分のアプリに組み込んだ後に、「実際にクラッシュレポートが届くかどうか確認したい！」というケースがあると思います。

強制的にクラッシュするにはどうするか、については公式サポートページに書いてありました。

[Is there a quick way to force a crash? – Support for Crashlytics](http://support.crashlytics.com/knowledgebase/articles/92522-is-there-a-quick-way-to-force-a-crash)

こちらに書いてあるとおり、`[[Crashlytics sharedInstance] crash]`でクラッシュさせることはできるようです。

ですが、ウィザードが完了した後にこちらのコードを挿入し、シミュレータや実機でクラッシュさせてもなぜかレポートが届きませんでした。
（ウィザード内で、アプリを起動させてくださいという画面が出るタイミングでコードを挿入してから起動させるとレポートが届く場合がありました）

導入後クラッシュレポートを送るには、以下の様なクラッシュさせるコードを入れて試してみるとよいでしょう。

```objectivec
    NSArray *array = [NSArray array];
    id data = array[0];
```

実際にこちらのコードをUIButtonをおした時のIBActionへ挿入すると、クラッシュレポートが届きました。

![スクリーンショット 2014-08-03 8.11.46.png](https://qiita-image-store.s3.amazonaws.com/0/36593/97f18fd3-6854-faa9-36bc-df036a2e157b.png "スクリーンショット 2014-08-03 8.11.46.png")
gemの作成


gem作成&rspec, ci_reporter, rcov, pry設定手順です.

参考: http://qiita.com/yusabana/items/8ce54577d959bb085b37

### bundle, etc

    $ bundle gem my_gem
    $ cd my_gem
    $ mkdir spec

### my_gem.gemspec

    ...
    spec.add_development_dependency "ci_reporter"
    spec.add_development_dependency 'rspec'
    # spec.add_development_dependency 'rspec-rails' # for Rails
    spec.add_development_dependency 'rspec-its'
    spec.add_development_dependency 'rspec-activemodel-mocks'
    spec.add_development_dependency 'rspec-collection_matchers'
    spec.add_development_dependency 'simplecov'
    spec.add_development_dependency 'simplecov-rcov'
    spec.add_development_dependency 'pry'
    # spec.add_development_dependency 'pry-rails' # for Rails
    spec.add_development_dependency 'pry-doc'
    spec.add_development_dependency 'pry-stack_explorer'
    spec.add_development_dependency 'pry-byebug'
    ...

### .rspec

    --colour

### spec/spec_helper.rb

    require "pry"
    require "rspec/collection_matchers"
    require "rspec/its"
    require "simplecov"
    require "simplecov-rcov"

    SimpleCov.formatter = SimpleCov::Formatter::RcovFormatter
    SimpleCov.start

### Rakefile

    require "bundler/gem_tasks"

    require "rspec/core"
    require "rspec/core/rake_task"
    RSpec::Core::RakeTask.new(:spec) do |spec|
      spec.pattern = FileList["spec/**/*_spec.rb"]
    end

    task :default => :spec

    require "ci/reporter/rake/rspec"

    RSpec::Core::RakeTask.new(:rcov) do |spec|
      spec.pattern = "spec/**/*_spec.rb"
      spec.rcov = true
    end

    RSpec::Core::RakeTask.new("spec:rcov") do |t|
      t.rspec_opts = ["-v"]
    end

    require "yard"
    require "yard/rake/yardoc_task"
    YARD::Rake::YardocTask.new do |t|
      t.files   = ["lib/**/*.rb"]
      t.options = []
      t.options << "--debug" << "--verbose" if $trace
    end
vagrant インストール (ホストOS: Cent OS 7)

参考：
<http://qiita.com/Itomaki/items/9a6a314a853cdcd00f80>

インストール先ホストOS：Cent OS 7 (1406) (miminal)
→2016/02/18更新にて試したホストOS：Cent OS 7 (7.2.1511) ConoHa VPS

# 必要な環境を入れる

## wgetを入れる

```
$ su -
# yum install wget
```

## CentOS外部リポジトリを登録する

dkmsのインストールに使用する
※epel-releaseがインストール済みなら飛ばす

```
# yum install epel-release
```
※2016/02/18修正、簡素化した。
参考：http://qiita.com/chidakiyo/items/3b81a442dda34d439b42
## virtual boxに必要なdkmsを入れる

```
# yum info dkms
# yum install dkms
```

## virtual boxを入れる

virtual box用リポジトリ設定

```
# cd /etc/yum.repos.d/
# wget http://download.virtualbox.org/virtualbox/rpm/rhel/virtualbox.repo
```

リポジトリ設定の更新

```
# yum update

```

virtual boxインストール

```
# yum search VirtualBox
# yum install VirtualBox-5.0.x86_64
# /usr/lib/virtualbox/vboxdrv.sh setup
```

Failed, trying without DKMSというエラーが出る場合は
ホストOSをリブートする。
※カーネルモジュールと起動しているカーネルのバージョンを合わせるため
参考：http://qiita.com/AKB428/items/13875eb2a09601c71698 のコメント

※2016/02/18変更：VirtualBox 5で試した結果を反映

## yumがtimeoutしてしまう場合の設定
※VirtualBoxのダウンロードでタイムアウトエラーが何回も出る場合に実施する。
以下を追記する。

```/etc/yum.conf
timeout=60
```

## virtual boxに必要な設定

```
# usermod -a -G vboxusers <user_name>
```

# Vagrantをインストールする

## rpm取得

適当な作業ディレクトリを掘って、そこにダウンロードする
※ホストOSのビット数と同じrpmを取得すること。

```
# cd /tmp
```
```shell-session:x86
# wget https://releases.hashicorp.com/vagrant/1.8.1/vagrant_1.8.1_i686.rpm
```
```shell-session:x64
# wget https://releases.hashicorp.com/vagrant/1.8.1/vagrant_1.8.1_x86_64.rpm
```

なお、ブラウザからダウンロードする場合はここ
<https://www.vagrantup.com/downloads.html>
※2016/02/18修正：リンク切れを直した

## rpmインストール

```shell-session:x86
# yum install vagrant_1.8.1_i686.rpm
```
```shell-session:x64
# yum install vagrant_1.8.1_x86_64.rpm
```

## インストールできたか確認

```
# vagrant
```

Usageが出ればOK。


以降は一般ユーザで実施する

```
# exit
```

# VagrantでOS起動するまで

vagrant boxを取得、初期設定して起動という流れ。

## vagrant boxの取得
以下を参考にし、今回はCent OS 6系を取得する。
http://www.vagrantbox.es/

※ゲストOSを64bitにすると仮想化のハードウェアアクセラレーションがない場合に起動に時間がかかる。その結果、SSHがタイムアウトしやすくなる(らしい)ため、今回は32bitのものを使う。

```
$ vagrant box add centos https://atlas.hashicorp.com/bento/boxes/centos-6.7-i386/versions/2.2.3/providers/virtualbox.box
```
thanks for http://qiita.com/liubin/items/a0765fc36bd87dcb4a5e

## Vagrantfileという起動設定ファイルを作る

```
$ mkdir centos6
$ cd centos6
$ vagrant init centos
```

## 起動設定を編集する

※IPアドレス振っておくとSSHしやすくなるっぽい

以下をコメントインする

```rb:Vagrantfile
config.vm.network "private_network", ip: "192.168.33.10"
```

## 起動する

```
$ vagrant up
```

## 接続する

```
$ vagrant ssh
```

## シャットダウンする

```
$ vagrant halt
```
MySQLのルートパスワードを初期化する方法

よくやっちゃうアレです。

rootになる。

	$ sudo su -


mysqldを停止する。

	# /etc/init.d/mysql stop


セーフモードで起動する。

	# /usr/bin/mysqld_safe --user=root --skip-grant-tables &

MySQLにログインする。

	# mysql -u root mysql

ルートパスワードを再設定する。

	mysql> update user set Password=PASSWORD('newpassword') where User='root';
	mysql> FLUSH PRIVILEGES;

mysqldを再起動する。

	# /etc/init.d/mysql restart

完了ー。

参考リンク
> [MySQL :: MySQL 4.1 リファレンスマニュアル :: A.4.2 忘れたルートパスワードをリセットする方法](http://dev.mysql.com/doc/refman/4.1/ja/resetting-permissions.html)
Requests の使い方 (Python Library)


## TL;DR

- Requests とは Python の **今風な** HTTP ライブラリである.
- `requests.get('URL')` で GET リクエストができる.
- レスポンスに対して `.text` とすることで, レスポンスボディをテキスト形式で取得できる.

## Requests とは

Python の HTTP ライブラリ.
Python には urllib2 というライブラリがあるが, 公式サイトに `Requests is an Apache2 Licensed HTTP library, written in Python, for human beings.` という説明がある通り, 人類にとって読みやすくコーディングできる.

## 導入

```bash
pip install requests
```

## 使い方

### ライブラリのインポート

```python
import requests
```

### リクエスト

各種 HTTP メソッドに一対一対応するメソッドが用意されている.

```python
# GET
requests.get('URL')
# POST
requests.post('URL')
# PUT
requests.put('URL')
# DELETE
requests.delete('URL')
# header の取得
requests.head('URL')
```

#### パラメータの付与

リクエストメソッドの引数に `params=付与するパラメーターの hash` で付与する.

```bash
>>> payload = {'key1': 'value1', 'key2': 'value2'}
>>> r = requests.get('URL', params=payload)
```

#### カスタムヘッダー

GET リクエストで UA を指定するとき

```bash
>>> headers = {'User-Agent': 'Sample Header'}
>>> requests.get('URL', headers=headers)
```

POST リクエストで HTTP ヘッダーにデータを追加する時

```bash
>>> payload = {'send': 'data'}
>>> requests.post('URL', data=json.dumps(payload))
```

### レスポンスの中身

#### text

返ってきたレスポンスボディをテキスト形式で取得. リクエストは自動的に unicode にデコードされている.

```bash
>>> r = requests.get('http://yahoo.com/')
>>> r.text
'<!DOCTYPE html>\n<html lang="en-US" class="dev-desktop uni-purple-border  bkt901 https  uni-dark-purple sasb-space" style="">\n<!-- m2 template  -->\n<head>\n    <meta http-equiv="Content-Type" ...
```

#### encoding

エンコーディング情報を取得

### content

レスポンスボディをバイナリ形式で取得.

```bash
>>> import requests
>>> r = requests.get('http://www.fnal.gov/faw/designstandards/filesfordownload/FermiLogo_blue.gif')
>>> r.content
```

### 各種レスポンス毎の処理

#### 画像

PIL の Image モジュール を使う.

```bash
>>> from PIL import Image
>>> from StringIO import StringIO
>>> r = requests.get('http://www.fnal.gov/faw/designstandards/filesfordownload/FermiLogo_blue.gif')
>>> i = Image.open(StringIO(r.content))
```

#### JSON

```bash
>>> requests.get('http://ci.nii.ac.jp/ncid/BB08796640.json').json()
{'@context': {'foaf': 'http://xmlns.com/foaf/0.1/', 'prism': 'http://prismstandard.org/namespaces/basic/2.0/', 'rdfs': 'http://www.w3.org/2000/01/rdf-schema#', 'owl': 'http://www.w3.org/2002/07/ ...
```

## サンプル

```requests_use.py
# -*- coding: utf-8 -*-

import doctest
import requests

def sample(query):
    """ requests sample that use qiita search api
    >>> 'title' in sample('python')
    True
    >>> 'totle' in sample('python')
    False
    """
    q = {'q':  query}
    r = requests.get('https://qiita.com/api/v1/search', params=q)
    return list(r.json()[0].keys())

if __name__ == "__main__":
    doctest.testmod()
```

## References

- [Requests: HTTP for Humans — Requests 2.3.0 documentation](http://docs.python-requests.org/en/latest/)


team information: (housyu, 3cdc8fdc466a6315c030)
Three.js TextGeometry（3D文字）で日本語を使う


### デモ
http://jsdo.it/calmbooks/TextGeometryTest

![test.png](https://qiita-image-store.s3.amazonaws.com/0/8719/4c78d765-d435-37a6-5479-5c7783fbe766.png "test.png")



---

英数字だけなら、
https://github.com/mrdoob/three.js/tree/master/examples/fonts
にあるtypeface.jsを適当に使えばok

日本語も使い方場合は、以下のサイトでフォントフォントを
アップロードし、typeface.jsを生成する必要がある

**typeface.js**
http://typeface.neocracy.org/

このサイトでは、ある程度使いたい文字だけを
ファイルにしてくれるのだけど、細かい指定ができない。

そのため漢字を使う場合は、tapeface.jsが極端に重くなる（7MBとかいっちゃう）

以下のようなツールで使いたい文字だけ抜き出したフォントを
typeface.js化するのがおすすめ。

**サブセットフォントメーカー**
http://opentype.jp/subsetfontmk.htm

あと漢字は3D化でつぶれる文字が結構あるけど、それはしょうがないぽい


使ったフォントは以下です。

**やさしさゴシック**
http://www.fontna.com/blog/379/
CentOS 7にautojumpをインストールする

autojumpはcdやpushdで辿ったディレクトリを記録し、`j <末端ディレクトリに含まれる文字列>`で、あるいは候補が複数ある場合はそこからTabかctrl+iで補完すれば選択肢を示し、過去に行ったディレクトリに移動してくれる、という便利ツールである。
https://github.com/joelthelion/autojump

しかしEPEL6にはrpmパッケージがあるのだがEPEL7 betaにはまだ（？）ない。
とはいえcdの入力の手間を随分減らしてくれるかなり便利なツールなのでインストールしたい、というわけで。

**2014-12-17追記**: やっとEPEL7にautojumpが追加された。v21.7.1だが挙動のおかしい点は今のところ見当たらない。以下でインストールできる。

```
# yum install epel-release
# yum install autojump
```

# まずは正攻法

ドキュメントに書かれている通りのマニュアルインストール。

```
# yum install git
# git clone git://github.com/joelthelion/autojump.git
# cd autojump/
# ./install.py
# echo "[[ -s ~/.autojump/etc/profile.d/autojump.sh ]] && . ~/.autojump/etc/profile.d/autojump.sh" >> ~/.bashrc
# . ~/.bashrc
```

と、やってはみたものの、何か挙動がおかしい。
そのあと`git checkout release-v21.7.1`とか`git checkout release-v21.6.9`で少し古いバージョンを試してみても症状は多少違うがやっぱり何かおかしい。

# じゃあ他から

autojumpは実体はpythonのスクリプトであり、特に必要なライブラリなどはなく、デーモンでもなくbashrcなどで読み込ませるもののようだ。
じゃあCentOS 7でも別にEPEL6にあるものインストールしても問題ないよね。

```
# yum install http://ftp.iij.ad.jp/pub/linux/fedora/epel/6/x86_64/autojump-19-2.el6.noarch.rpm
```

ログインし直すと問題なく動く。

じゃあFedora20に含まれているrpmパッケージでも使えるよね。

```
# yum install http://ftp.iij.ad.jp/pub/linux/fedora/updates/20/x86_64/autojump-21.6.9-2.fc20.x86_64.rpm
```

これも問題なし。
こちらのバージョンの方が動作が私の好みである。

ちなみに7用のrpmパッケージは http://mirrors.karan.org/epel7/Packages/autojump/20131231020945/19-2.el6.x86_64/autojump-19-2.el7.noarch.rpm にはあるようだ。外部リポジトリなので信用できない、というわけでなければこちらも。
Wordpressで「画像を切り抜く際にエラーが発生しました。」が出る問題(PHP5.5)

# 環境
* CentOS 6.5
* PHP 5.5
* Wordpress 3.9.1

# 症状
Wordpressをインストールしてみたところ、ぱっと見は動いているが画像の切り抜きに失敗する。

![wordpress_error.png](https://qiita-image-store.s3.amazonaws.com/0/37334/cc41c6ad-681e-e4eb-6012-5d8ec38d5f25.png)

## エラーメッセージ
### 日本語
「画像を切り抜く際にエラーが発生しました。」
### 英語
「There has been an error cropping your image.」

# 原因
`php-gd`がないため、エラーと判断されている。
ソースコードは以下の場所。ちなみにデバッグログなど出してくれない。

```php:class-wp-image-editor-gd.php
// public static function test
if ( ! extension_loaded('gd') || ! function_exists('gd_info') )
	return false;
```

# 解決策
PHP5.5に[php-gd](http://php.net/manual/ja/book.image.php)をインストールした。

```bash
# gd-lastをアップデート
sudo yum install --enablerepo=remi gd-last
# php-gdをインストール
sudo yum install --enablerepo=remi-php55 php-gd
```

解決！！

# 参考にしたサイト
* [CentOS6にPHP5.5をyumでインストール](http://nob-log.info/2013/07/01/centos6%E3%81%ABphp5-5%E3%82%92yum%E3%81%A7%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB/)
「文章のように読めるメソッドを作る」 Composed Method パターン

# 「文章のように読めるメソッドを作る」 Composed Method パターン

## 概要
Kent Beckによって提唱されたデザインパターン。

***Composed Method パターン*** は、適切な命名とともにメソッドを
小さく分割することによって可読性を上げる手法です。
適切な命名によるメソッド分割＝ **単一責務** 。

メソッド内の **抽象度を揃え** 、低いレイヤーの処理を隠蔽することで
メソッド内を英文のように、 **人間が読みやすい形** にします。
これにより、低レイヤーの処理の詳細を気にすることなく、
そのメソッドが何をしているのか読み解くことが容易になります。


メソッドの呼び出しを読むだけでコードを理解できるようになるため、
SI'erのプログラムなどでよく見かけるような、処理内容をなぞっただけの
コメント群は不要になります。

処理を適切な命名とサイズに分割することで冗長なコード・構造などの
コードの臭いを発見するきっかけとなり、さらなるリファクタリングの土台となる、
という効果もあります。

## 現実の障壁
過去の栄光に囚われている、古いタイプの開発者には嫌われる手法だったりします。

そういったタイプの方は、処理の詳細が一箇所にまとまっていないと不安に駆られるようで、
**「お前は可読性の意味をはきちがえている！」**
などと暴言を浴びせられることもあるでしょう。

そして、相手の権力が強い場合はせっかく分割したメソッドを全てインライン化される
ところまでワンセットです。

## Composed Method パターン サンプル
### 仕様
パイプ区切りで、人々の名前と年齢を保持しているファイルの内容を
読み込んで、Personモデルのリストにして返却するメソッドを実装します。

年齢に数値以外が合った場合は、 'unknown' に変更します。
言語はRubyを利用します。

### 適用前サンプル

~~~ruby
require 'pp'

Person = Struct.new(:name, :age)

class PeopleReader
  def read_people(people_file)
    people_src = people_file.read
    people_src.each_line.each_with_object([]) do |person_src, people|
      person_columns = person_src.chomp.split('|')
      age = person_columns.last =~ /^\d+$/ ? person_columns.last : 'unknown'
      people << Person.new(person_columns.first, age)
    end
  end
end

people_reader = PeopleReader.new
pp people_reader.read_people(DATA)

__END__
tanaka|25
suzuki|30
sato|125
samuragochi|hoge
~~~

* 出力

~~~
[#<struct Person name="tanaka", age="25">,
 #<struct Person name="suzuki", age="30">,
 #<struct Person name="sato", age="125">,
 #<struct Person name="samuragochi", age="unknown">]
~~~

* 注1: Rubyでは `__END__` 以降をコメントとして扱いますが *DATA* 変数によってファイルとして扱うことができる
* 注2: *chomp* は文字列の末尾改行を削除した文字列を返却します
* 注3: *pp* は人間が見やすいフォーマットで標準出力を行うメソッドです。 Pretty Print。

### 適用後サンプル

~~~ruby
require 'pp'

Person = Struct.new(:name, :age)

class PeopleReader
  SEPARATOR = '|'
  INVALID_AGE_TEXT = 'unknown'

  def read_people(people_file)
    people_src = people_file.read
    people_src.each_line.each_with_object([]) do |person_src, people|
      person_columns = read_person_attributes(person_src)
      name = read_name(person_columns)
      age = read_age(person_columns)
      people << Person.new(name, age)
    end
  end

  private

  def read_person_attributes(person_src)
    person_src.chomp.split(SEPARATOR)
  end

  def read_name(person_columns)
    person_columns.first
  end

  def read_age(person_columns)
    age = person_columns.last
    convert_age_if_invalid(age)
  end

  def convert_age_if_invalid(age)
    integer?(age) ? age : INVALID_AGE_TEXT
  end

  def integer?(age)
    age =~ /^\d+$/
  end
end

people_reader = PeopleReader.new
pp people_reader.read_people(DATA)

__END__
tanaka|25
suzuki|30
sato|125
samuragochi|hoge
~~~

※出力は適用前と同じ

## まとめ
***Composed Method パターン*** 適用前のコードは、 *read_people* 内の処理の抽象度がバラバラで読みにくく感じます。
People, Personといったモデルレベルの概念と、 split('|') などの処理の詳細レベルのロジックが
混在しているためです。

***Composed Method パターン*** 適用後のコードは、全体としては長いコードになりましたが、
各処理の抽象度が揃って読みやすくなりました。
*read_people* メソッドは他のメソッドの呼び出しの集合になっていますが、
メソッド名を見れば処理の詳細をみなくても何をしているのか把握できます。

また、命名に気を遣い単一責務にしたことによってバグ対応や仕様変更の修正範囲が
分割したメソッド内で閉じることが多くなります。
tcp-upstreamを設定したunboundでUDPしか受け付けないDNSを組み合わせて使う

# はじめに
これは、unboundで上流への問い合わせをTCPのみにするオプションであるtcp-upstreamを有効にした状態で、一部のドメインに対してUDPしか受け付けないDNSコンテンツサーバへ問い合わせたいときに行った内容のメモです。
ここでは、UDPしか受け付けないDNSコンテンツサーバとして、NTT東日本のサービス情報サイト(NGN IPv4)のDNSコンテンツサーバを取り上げます（Bフレッツ時代はTCPも通ったのですが、NGNに移管されてからはダメになった）。

# やり方

## TCPによるDNS問い合わせをUDPに変換する
トンネリングソフトウェアであるstoneを使って、TCPによるDNS問い合わせをUDPに変換することでtcp-upstreamが有効でも間接的にUDPのDNSコンテンツサーバを使用できるようにします。
やっていることは、[stone に UDP ⇔ TCP 相互変換機能を実装](http://www.gcd.org/blog/2007/06/121/) と同じです。
具体的なコマンドとしては、

```shell-session
$ stone -n <DNSコンテンツサーバへのアドレス>:53/udp 127.0.0.1:10253
```

といった感じにします。

Gentoo Linux上で設定したので、このようなinitスクリプトを書いておきます（アドレスはサービス情報サイトのもの）。

```bash
#!/sbin/runscript

PID=/var/run/stone.pid
PROG=/usr/bin/stone
ARG="-n 123.107.190.5:53/udp 127.0.0.1:10253"
USER=nobody
GROUP=nobody

depend()
{
        need net
        before unbound
}

start()
{
        start-stop-daemon --start --user $USER --group $GROUP --pidfile $PID --make-pidfile --background --exec $PROG -- $ARG
        return $?
}

stop()
{
        start-stop-daemon --stop --pidfile $PID
        return $?
}
```

これで、123.107.190.5:53/udpを127.0.0.1:10253/tcpで使用することができます。

## unboundへの設定
stub-zoneを使って、サービス情報サイトで使われているドメインを127.0.0.1:10253/tcpに問い合わせるようにするだけです。
tcp-upstreamが有効なので、自動的にTCPのみでの通信になります。

```
    stub-zone:
        name: "flets."
        stub-addr: 127.0.0.1@10253

    stub-zone:
        name: "v4flets-east.jp."
        stub-addr: 127.0.0.1@10253
```

# 問題点
EDNS0が絡むとまずそうですが、この例ではそこまで大きな応答は返ってこないだろうし大丈夫かも。
CentOS7からprelinkが無効に変更されていた件

# prelinkって何？
詳しくはggってください。
有り体に言うとインストールされているバイナリを変更して高速化を図るプログラムらしいです。`/etc/cron.daily/prelink`としてインストールされるので一日に一度動作します。

[Gentoo Linux ドキュメント -- Gentoo Linux Prelinkガイド](http://www.gentoo.org/doc/ja/prelink-howto.xml)

[prelink の効果を測定する - bkブログ](http://0xcc.net/blog/archives/000088.html)

# 無効になったってどういうこと？
rpmを展開すると、CentOS7におけるデフォルト値がyesからnoに変更されています。これにより、バイナリ変更の動作は入らなくなっています。

```bash
$ wget http://ftp.riken.jp/Linux/centos/6.5/os/x86_64/Packages/prelink-0.4.6-3.1.el6_4.x86_64.rpm
$ rpm2cpio prelink-0.4.6-3.1.el6_4.x86_64.rpm | cpio -id
$ cat etc/sysconfig/prelink
PRELINKING=yes

$ wget http://ftp.riken.jp/Linux/centos/7/os/x86_64/Packages/prelink-0.5.0-6.el7.x86_64.rpm
$ rpm2cpio prelink-0.5.0-6.el7.x86_64.rpm | cpio -id
$ cat etc/sysconfig/prelink
PRELINKING=no
```

[rpmで入れたバイナリのchecksumが一致しないと思ったらprelinkのせいだった - As a Futurist...](http://blog.riywo.com/2012/08/12/162527)

# これまで何が問題だったの？
prelinkのバイナリ変更によってプログラムがうまく動作しなくなるものがありました。当方も痛い目に合った一人。誰も触っていないハズなのにいつの間にか壊れているので、原因調査に苦労しました。

[CentOS で Ruby が動かないときは prelink が怪しい - Qiita](http://qiita.com/hwaki11/items/678db06ee9dfdcf5862d)

# 何かする必要あるの？
CentOS7の人は特になにも。それ以外の人はrootで`prelink -au`して改変されたバイナリを元に戻しておきましょう。その後cron.dailyからprelinkを削除するのが良いかと。
※prelink自体をアンインストールすると何かのひょうしにまた入っちゃうことがあるので残しておくのがymko的にポイント高いかも！

[prelink削除 - ymkoの日記](http://d.hatena.ne.jp/ymko/20100904/1283612236)（自記事）
[rpmで入れたバイナリのchecksumが一致しないと思ったらprelinkのせいだった - As a Futurist...](http://blog.riywo.com/2012/08/12/162527)