OmniAICreator/Qiita-1.07M huggingface dataset:
Goでhttpリクエストを送信する方法

Goでhttpリクエストを送る方法。
シンプルなものがあるものの、詳細まで設定しようとすると
やらなければいけないことが増えていきます。

## 1. シンプルなGETリクエスト

`net/http`の`func Get(url string) (resp *Response, err error)
`を使う。

(以下エラーは無視してます)

```go
package main

import (
  "fmt"
  "net/http"
  "io/ioutil"
)


func main() {
  url := "http://google.co.jp"

  resp, _ := http.Get(url)
  defer resp.Body.Close()

  byteArray, _ := ioutil.ReadAll(resp.Body)
  fmt.Println(string(byteArray)) // htmlをstringで取得
}
```

## 2. http.Clientを使ってGETリクエストを送信する。

まず、最初に`http.Request`を初期化して、メソッド、URL、bodyの値を設定してから、`http.Client`の`

```go
func main() {
  req, _ := http.NewRequest("GET", url, nil)

  client := new(http.Client)
  resp, _ := client.Do(req)
  defer resp.Body.Close()


  byteArray, _ := ioutil.ReadAll(resp.Body)
  fmt.Println(string(byteArray))
}
```

これでbodyを送信できるようになりました。

## 3. 独自ヘッダーを追加してGETリクエストを送信する

Headerに何かつけたい場合は`req`に値を設定する

```go
  req, _ := http.NewRequest("GET", url, nil)
  req.Header.Set("Authorization", "Bearer access-token")

  client := new(http.Client)
  resp, err := client.Do(req)
```

### リクエストヘッダー、レスポンスヘッダーの内容を取得する

リクエストヘッダー、レスポンスヘッダーの内容は
それぞれ`func DumpRequestOut` `func DumpResponse`で確認出来る。

```go
  req, _ := http.NewRequest("GET", url, nil)
  req.Header.Set("Authorization", "Bearer access-token")

  dump, _ := httputil.DumpRequestOut(req, true)
  fmt.Printf("%s", dump)

  client := new(http.Client)
  resp, err := client.Do(req)

  dumpResp, _ := httputil.DumpResponse(resp, true)
  fmt.Printf("%s", dumpResp)
```

結果

```bash
GET / HTTP/1.1
Host: google.co.jp
User-Agent: Go 1.1 package http
Authorization: Bearer access-token
Accept-Encoding: gzip

HTTP/1.1 200 OK
Transfer-Encoding: chunked
Alternate-Protocol: 80:quic
Cache-Control: private, max-age=0
Content-Type: text/html; charset=Shift_JIS
Date: Wed, 20 Aug 2014 23:10:47 GMT
Expires: -1
...(省略)...
```

## さらに細かい設定

cookieやらproxyの設定などは、`http.Client`の持っている設定に記載していくことになる。

```go
client := &http.Client{Transport: http.DefaultTransport}
```
Middleman で Slimを使って、render partialしたい時

# Middleman でブログを作ろうとしていた

- テンプレートはerbじゃなくてslimでやってみたい
- middleman-blogも使ってみたい

## ヘッダーの一部を部分テンプレートにして読み込みたい

- layout/layout.html.slim に変換済

layout.html.slimの、body と yield の間に部分テンプレート読み込みを書き込む

```
  == partial "share/_header"
```

読み込み用テストのファイルを作る。
share/_header.html.slim

```
header
```
↑すごい経ってから気づいたけど、この書き方が良くなかった・・
headerって文字で出てくるつもりで書いている（おバカ）
（slim記法知ってる人ならすぐわかる）

```
$ bundle exec middleman server
```
して、ページを読み込んでみると、コンソールにこんなメッセージが・・

```
Option :locals is not supported by Slim::Engine
```

もちろん```header```って文字も出てこない。
なんでだ〜Slim、部分テンプレート読めないのか！？とか悩んでたけど・・

参考URL [Middlemanを使うことにしました | e2esound.com業務日誌](http://www.e2esound.com/wp/2012/10/23/my_middleman/)

をみて、やはり書き方はあっている・・と思い、よーく確認してみたら・・

### 間違ってたのはSlim記法への私の理解・・

share/_header.html.slim

```
header
```
だと、HTMLタグのheaderじゃん！

```
p header here
```
に書き換えてみたら、ちゃんと出てきました・・・
ローカルIPアドレスをプログラムで取得するには

# はじめに

[Dockerで音を鳴らす](//abrakatabura.hatenablog.com/entry/2014/08/21/062305)という記事を書いた際に、Dockerコマンドを実行しているホストのローカルIPアドレスの取得方法が
気になり、最近使っている言語のいくつかでどうやって書くのか調べた。
OCamlも調べたが、ググる力と英語力が足りず断念。。。

# Ruby

2.1以降

```rb
ruby -r socket -e 'puts Socket.getifaddrs.select{|x| x.name == "eth0" and x.addr.ipv4?}.first.addr.ip_address'
```
## Link

- [Ruby 2.1.0 では Socket.getifaddrs で簡単にインターフェイスのアドレスを取れる - Qiita](http://qiita.com/suu_g/items/a03af621f5d6985879e0)
- [定番！Rubyでワンライナー書く時の基本テク - Qiita](http://qiita.com/bash0C7/items/749e60ff770b2e465b5e)

# Python

gethostnameを使う方法がすぐに出てきたが、Ubuntuなどでは、127.0.0.1を取得してしまうことが結構あるようで、それ以外の方法を探した。

```py
python -c "import socket;print([(s.connect(('8.8.8.8', 80)), s.getsockname()[0], s.close()) for s in [socket.socket(socket.AF_INET, socket.SOCK_DGRAM)]][0][1])"
```

```
pip install netifaces
python -c "import netifaces;print(netifaces.ifaddresses('eth0')[netifaces.AF_INET][0]['addr'])"
```

## Link

- [networking - Finding local IP addresses using Python's stdlib - Stack Overflow](http://stackoverflow.com/questions/166506/finding-local-ip-addresses-using-pythons-stdlib)
- [sockets - Python - Get localhost IP - Stack Overflow](http://stackoverflow.com/questions/11735821/python-get-localhost-ip)

# Perl

```
cpanm install IO::Interface
perl -MIO::Interface::Simple -e 'CORE::say IO::Interface::Simple->new(shift || "eth0")->address'
```
## Link

- [Perl でローカルのアドレスを取得する - naoyaのはてなダイアリー](http://d.hatena.ne.jp/naoya/20080110/1199944996)

# Node.js

標準のモジュールでいい感じに出来、Windowsでも動いた。

```js
node -e  "require('os').networkInterfaces()['eth0'].filter(function(elm){if(elm.family=='IPv4')console.log(elm.address)})"
```

```js
node -e "require('os').networkInterfaces()['ローカル エリア接続'].filter(function(elm){if(elm.family=='IPv4') console.log(elm.address)})"
```
## Link 
- [javascript - Get local IP address in node.js - Stack Overflow](http://stackoverflow.com/questions/3653065/get-local-ip-address-in-node-js)

# シェル

```bash
hostname -I
```

OSXのhostnameコマンドはダメでした。

# AppleScript

```applescript
osascript -e "IPv4 address of (get system info)"
```

## Link

- [local IPアドレスを得る - 名もないテクノ手](http://d.hatena.ne.jp/seuzo/20090514/1242311803)


# まとめ

意外と、ローカルIPアドレスの取得は難しいことが分かった。多くの言語は別途モジュール等をインストールして
それを使って書くのがスマートでプラットフォーム依存が低く抑えられる感じだった。

残念ながら、ここに挙げた書き方でどんな環境でもOKかというとそんなことは無いので、必要に応じて微調整が必要。

# 関連記事

- [ll言語でhttpsサーバを作る](//abrakatabura.hatenablog.com/entry/2013/09/18/070657)
- [Electronで自分のIPアドレスをLAN内のiPhoneに通知するには](//abrakatabura.hatenablog.com/entry/2015/10/24/113659)
- [WindowsだけでAmazon DashボタンのMACアドレスを取得できるjsを書いた](//abrakatabura.hatenablog.com/entry/2017/03/04/230941)
- [goroutineを使って高速にLAN内の*.localなホスト名の一覧を取得するツールを作った](//abrakatabura.hatenablog.com/entry/2018/07/04/213245)
my.cnfの場所を調べる

左から順に読み込まれている。
この場合は、`/etc/my.cnf`が一番最初。

```bash
$ mysql --help | grep my.cnf
                order of preference, my.cnf, $MYSQL_TCP_PORT,
/etc/my.cnf /etc/mysql/my.cnf /usr/local/etc/my.cnf ~/.my.cnf 
```
Unite2014速報！

Unite2014
http://unity3d.com/unite/unite2014/keynote

<速報>

（unity5に追加されるもの）
・WebGLはUnity/Unity Proどっちでも無料で出力できるらしい！
・64bit対応
・UIがパワーアップ※アンカーポイントの調整とかできるっぽい？
・光と影のクオリティがめっちゃあがる。
・SpeedTreeという木を作成するツールが入る。
・audio機能楽しみ
・tsugiを買収　http://tsugi.co/
・EVEYPLAYの説明
・Unity Ads

（unity5.xで更新が期待されるもの）
・シーンを二つ開ける。
・動画機能の強化？←これは勘違いだと思う。

unity4.6が出る。
unity3d.com/unity/beta/4.6
flipsnap.jsで表示中のページ数を取得

[flipsnap.js](http://pxgrid.github.io/js-flipsnap/)はフリックによるページャーを実装するための軽量なjavascrpt pluginです。
ドキュメントも簡潔で、とても使いやすい。

ですが、フリックで表示ページを変更後した時のイベントで、表示ページ番号を取得する方法が公式ドキュメントに書かれていなかったので覚書。

```javascript
var flipsnap = Flipsnap('.flipsnap');

// フリックではなく、前/次表示をボタンでもする
$('prev_button').on('click', function(){ flipsnap.toPrev(); });
$('next_button').on('click', function(){ flipsnap.toNext(); });

// フリック後のイベント定義。toPrev/toNextによるページ移動時には**発火しない**
flipsnap.element.addEventListener('fstouchend', function(ev) {
  ev.newPoint;      //=> 移動後の表示ページ番号
},false);

// ページ移動後のイベント定義。toPrev/toNextによるページ移動時にも**発火する**
flipsnap.element.addEventListener('fspointmove', function(en) {
  ev.newPoint;      //=> undefined
  flipsnap.currentPoint // 表示ページ番号
}, false);

// 主なプロパティ
flipsnap.currentPoint // 表示ページ番号（0..）
flipsnap.maxPoint     // 最終ページ番号
flipsnap.animation    // フリック時のアニメ表示(true/false)
flipsnap.transitionDuration // アニメの早さ(default 350ms)。再設定可能

```

補足：以下のようなページを想定。

```page.haml
.viewport
  .flipsnap
    .item page 1
    .item page 2
    .item page 3
    .item page 4
    .item page 5
```
```page.sass
$view-width: 320px
$item-border-bold: 5px

.viewport
  width: $view-width
  overflow: hidden
  margin: 0 auto

.flipsnap
  width: $view-width * 5

.item
  float: left
  width: $view-width - $item-border-bold * 2
  text-align: center
  padding: 50px 0
  border: $item-border-bold solid #999
```
FuelphpでMongoDBを使いこなす！

FuelPHP v1.7.2から、MongoDBのLIKEメソッドを利用して、前方一致検索を使用する場合の注意点。

**正規表現**を使って抽出しようとしたが、どうしてもFuelPHPのMongo_Dbクラスのlikeメソッドでは結果が正しくない。
coreのソースを確認して見ると、正規表現で値を渡しても、likeメソッド内部で***メタ文字がクォート***されてました。

coreのソース（/core/classes/mongo/db.php）をゴニョゴニョ変更して対応。
（他にもっといい方法があるかもしれないが、とりあえずこれで対応）

以下、変更箇所。

```php:/core/classes/mongo/db.php
public function like($field = '', $value = '', $flags = 'i', $disable_start_wildcard = false, $disable_end_wildcard = false)
{
  $field = (string) trim($field);
  $this->_where_init($field);

  $value = (string) trim($value);
  //$value = quotemeta($value);//この行をコメントアウト

  (bool) $disable_start_wildcard === false and $value = '^'.$value;
  (bool) $disable_end_wildcard === false and $value .= '$';

  $regex = "/$value/$flags";
  $this->wheres[$field] = new \MongoRegex($regex);

  return $this;
}
```

＜例＞
nameフィールドの値が、abcのいずれかで始まるドキュメントを抽出する場合

```php:
// インスタンスを取得
$mongodb = \Mongo_Db::instance();
$mongodb->like('name', '[a|b|c]', 'im', false, true);
$users = $mongodb->get('users');
```



ちなみに、日本語ドキュメントも
>$enable_start_wildcard　**true** がセットされた場合、文字列の先頭がマッチする。
>$enable_end_wildcard　**true** がセットされた場合、文字列の後尾がマッチする。

と、なっているが**false**なんじゃないのか・・・？
Swiftで，ソースをいじらずに値の更新を監視できるようにしてみる


ロジック部分に全く手を入れることなし，例えば，デバッグ中に値の変更時のログ表示などができると便利かもしれません．個人的には，代入が絡むとケアレスミス連発で「また，やってしまった」とデバッグ時によく思うことがあります．しかし，デバッグログを後からあっちこっちに挟むのも結構面倒ですし，コードが見苦しくなったりします．何かいい手はないものでしょうか？


### 普通はwillSet, didSetは使うべき？
Swiftではクラス／構造体のプロパティで`willSet`と`didSet`記述すれば，値の更新前後になんらかのメッセージなりを発して値を監視することができます．しかし，この簡易監視機能は後からは追加できません．extensionはプロパティのオーバライドを禁じているからです．大元のクラス／構造体を変更する必要が出てきます．少々面倒な気がします．デバッグ目的にはあまり向いていない気がします．

### 代入演算子を定義してしまう
そこで，別解としてまず思いつくのは代入演算子のオーバーロードでしょうか．ですが残念なことに，[言語仕様](https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/LexicalStructure.html#//apple_ref/doc/uid/TP40014097-CH30-XID_939)に

>NOTE
>The tokens =, ->, //, /*, */, ., and the prefix operator & are reserved. These >tokens can’t be overloaded, nor can they be used as custom operators.


とあり，デフォルトの代入演算子`=`に手を入れることは叶いません．
言語の見た目が随分と変わってしまうのを許容できれば，別の代入演算子を定義してしまえばO.K.です．
Pascalの`:=`も使えないなので，かなり変ですが，ここはとりあえず`<-`を使うことにします．
では関数の定義です．

```swift
infix operator <- {
associativity none
precedence 130
}

func <-<T>(inout lhs: T, rhs: T) {
    lhs = rhs
}

func <-<T:Debug>(inout lhs: T, rhs: T) {
    println("Before: \(lhs)")
    lhs = rhs
    println("After: \(lhs)")
}
```
普通の代入とデバッグ用の代入関数(演算子)を定義してます．デバッグ用のは見ての通り，実際の代入の前後にログを出すようにしているだけです．簡単ですね．
ここでは`Debug`という制約を付けていますが，これは単なるマーカーで，

```swift
protocol Debug {}
```
この通り．このマーカーが付かないタイプは普通の代入が行われます．

デバッグしたくなったら，このマーカーを監視したいタイプに単にextensionします．例えば，次のようなストラクトで，

```swift
struct A: Printable {
	var description: String {return "A(v=\(v))"}
    let v: Int
}

extension A: Debug {}  // Aにデバッグマーカーを設定
```
`Debug`をくっ付けます．このextension有無だけでログの出力ができるようになります．
以下，デモとその出力です

```swift
var a = A(v: 1)
var b = A(v: 10)

a <- b       // aにbを代入
println(a)

// Before: A(v=1)
// After: A(v=10)
// A(v=10)

var x: Int = 1
var y: Int = 10

x <- y
println(x)

// 10  // IntにはDebugを付けてない
```

と，まあこんな感じです．いかがでしょうか？（`<-`は微妙...?)

### まとめ
最初から代入演算子`<-`を使ってさえいれば，メインロジックをいじらずに後からデバッグログをオン/オフできる．メインロジック中のあっちこっちに（邪魔な）ログ関数を挟む必要がかなり減るかもしれません．

### (願望)

- デフォルトの`=`もオーバーロードできるようにしてほしい．文法的には単なる値の代入以上の意味があるから厳しいか．

- extensionでのプロパティのオーバーライドを条件付きで認めてほしい．`willSet`と`didSet`の追加だけでも．値を変更しないのであれば別に問題はないと思います．
AnsibleでのSSH接続ユーザー指定方法

Ansibleはセットアップ先のサーバーにChefみたいにエージェントを入れなくていいので楽ですね。
セットアップ先にSSHで接続できて、Python2.4以上が入っていればOK（大体のLINUXは入っています）という気軽さがいいです。

今回は、

> セットアップ先にSSHで接続できて

この部分の接続ユーザーをどう指定するか疑問があったので調べてみました。
方法は3つあります。

## 1. 実行時の引数で指定
-u オプションで指定します。

```:shell
newgyu@NewGyuMachine:~$ ansible-playbook -h
Usage: ansible-playbook playbook.yml
  :
  -u REMOTE_USER, --user=REMOTE_USER
                        connect as this user (default=newgyu)

newgyu@NewGyuMachine:~$ ansible-playbook -i dev_hosts -u ec2_user playbook.yml

```

* 一台だけならいいけど複数台あるとサーバーの役割ごとにSSH接続すべきユーザーが異なるケースもあるよね
* いちいち実行時に指定するのも面倒

ということであまり使わない気がする。（ansible-playではなく、ansibleコマンドで一発こっきりの時は使うかも)

## 2. インベントリファイルで指定

```ini:production.ini
[webservers]
hoge.local ansible_ssh_user=hoge_user
fuga.local
piyo.local

[webservers:vars]
ansible_ssh_user=webuser
```

これが一番使い勝手がいい気がします。
基本はグループ単位に大体同じだと思うので、[group variables](http://docs.ansible.com/intro_inventory.html#group-variables)に指定して、ホスト単位に違う場合は[Host Variables](http://docs.ansible.com/intro_inventory.html#host-variables)という使い方ができます。

## 3. playbook.ymlの中で指定

[remote_user](http://docs.ansible.com/intro_configuration.html#remote-user)に指定します。

```yaml:playbook.yml
- hosts: all
  remote_user: webuser
  tasks:
    - name: test connection
      ping:
```
Phalcon で Digest 認証

#  Phalcon で Digest 認証

ここでは Plugin として実装して追加された場合に全てのページに対して Digest 認証が必要なようになる実装としている．
特定のページのみなどは beforeDispatch() の最初あたりでアクション名などをチェックして認証が必要ないページならば true を返すなどするとよいと思う．

```php
<?php

use Phalcon\Events\Event;
use Phalcon\Mvc\Dispatcher;
use Phalcon\Mvc\User\Plugin;

class Digest extends Plugin
{
    private $realm = 'Restricted area';
    private $users = ['nise_nabe' => 'password'];

    public function beforeDispatch(Event $event, Dispatcher $dispatcher)
    {
        $data = $this->request->getDigestAuth();
        if (empty($data)) {
            $this->response->setStatusCode(401, 'Unauthorized');
            $header ='Digest realm="'.$this->realm.'",qop="auth",nonce="'.uniqid().'",opaque="'.md5($this->realm).',algorithm=MD5';
            $this->response->setHeader('WWW-Authenticate', $header);
            $this->response->send();
            return false;
        } else {
            $H1 = md5($data['username'].':'.$this->realm.':'.$this->users[$data['username']]);
            $H2 = md5($this->request->getMethod().':'.$data['uri']);
            $valid_response = md5(implode(':', [$H1, $data['nonce'], $data['nc'], $data['cnonce'], $data['qop'], $H2]));
            if ($data['response'] !== $valid_response) {
                $this->response->setStatusCode(401, 'Unauthorized');
                $this->response->send();
                return false;
            }
        }
    }
}
```

# 動作確認

上記コードを dispatcher に登録していると下記のような動作になるはず．（[追加方法例](http://qiita.com/nise_nabe/items/53e8d1fb2e2903128439)）

正しいユーザとパスワード（password)

```
$ curl -s -I http://localhost/ --digest --user nise_nabe | grep HTTP
Enter host password for user 'nise_nabe':
HTTP/1.1 401 Unauthorized
HTTP/1.1 200 OK
```

正しいユーザと間違ったパスワード

```
$ curl -s -I http://localhost/ --digest --user nise_nabe | grep HTTP
Enter host password for user 'nise_nabe':
HTTP/1.1 401 Unauthorized
HTTP/1.1 401 Unauthorized
```


# 参考文献

RFC 

> RFC 2617 - HTTP Authentication: Basic and Digest Access Authentication
>
> http://tools.ietf.org/html/rfc2617

Wikipedia

> Digest access authentication - Wikipedia, the free encyclopedia
>
> https://en.wikipedia.org/wiki/Digest_access_authentication

PHP の Digest 認証のサンプル

> PHP: PHP による HTTP 認証 - Manual
>
> http://php.net/manual/ja/features.http-auth.php

Response の返し方

> Class Phalcon\Http\Response — Phalcon 1.3.1 documentation
> 
> http://docs.phalconphp.com/ja/latest/api/Phalcon_Http_Response.html

Plugin 使い方

> Phalcon で Plugin クラスを使う - Qiita
>
> http://qiita.com/nise_nabe/items/53e8d1fb2e2903128439

Controller での実装例（この記事書いてからこのリポジトリに気づいた）

> dreamsxin/phalcon-digest-http-auth
>
> https://github.com/dreamsxin/phalcon-digest-http-auth
cocos2dx 2.2.5環境構築

# 感謝しながらSlideShareにアップされているスライドを見る。
cocos2d-xの開発環境をインストールしてみよう by Nishida Kansuke様
http://www.slideshare.net/tonosamart/cocos2dx-27513201
26/60までが環境構築です。

# しかし、そのままではダメ

## eclipseで[LabelReader.java]がエラーを吐く  
有名なバグらしい、[LabelReader.java]に以下を追記することで解決

```
#include <algorithm>
```


## こんなエラーが出てビルドできない

```
Unable to execute dex: java.nio.BufferOverflowException. Check the Eclipse log for stack trace.
Conversion to Dalvik format failed: Unable to execute dex: java.nio.BufferOverflowException. Check the Eclipse log for stack trace.
```

Projectを右クリック > プロパティ > Android > ProjectBuildTargetを最新のものにすることで解決
これはcocosのエラーではないよ。

# 最後に（環境構築とは関係ありません）

現在はcocos2d-x v3系が出ていますが、とある事情でv2系をインストールすることになり
詰まったところを備忘録として残しています。完璧かどうかはわかりません。
ちなみにv3系ではsetup.pyというセットアップするためのファイルがあるそうです。
v3系では色々変わっているそうなので、特殊な事情がない限りv3系を入れたほうがいいと思います。
jQueryのtextメソッドをnative JSで書く際の注意


jQueryでDOMの内容を書き換えるメソッドとして text() があります。
これをjQueryを使わずJavaScriptだけで書くなら、

innerText()

というメソッドを使うことで代替できます。
しかし、FireFoxでは innerText に対応しておらず、
代わりに textContent() というメソッドを使うことで代替できます。

マルチブラウザに対応するなら、

```
if( typeof document.textContent != 'undefined' ){
// textContent()
}
else{
// innerText()
}
```

という風に書くと良いです。
vimで一気にコメントアウトする方法(複数行の先頭に文字を追加する方法)

複数行を一気にコメントアウトしたい場合の解決法です。

`ctr + v`

で短形モードに

そしてカーソルを移動させてコメントアウトしたい行を選択

`shift + i`

で入力モードに

そして

`#` や `//`

などのコメントアウトするための記号を入力して

`esc`

これで完了です。

vimって便利ですね。

こちらも合わせてどうぞ…
[簡単にvimで複数行を一気にコメントアウトするための設定方法](http://qiita.com/shirochan/items/61fe9da15269062bbad5)

#### 参考書籍
[入門 Vim: 1時間で学ぶ最強コード編集技術のエッセンス](https://amzn.to/3T2ksBB)
[Vimテクニックバイブル～作業効率をカイゼンする150の技](https://amzn.to/3bCGcf5)
[マスタリングVim](https://amzn.to/2LEC9V1)
PythonでSMSを送ってみた


スクリプトからSMSって送れね〜のかと思った次第。

ググったら、どうやらtwilio（ http://twilio.kddi-web.com/ ) なるサービスを使えばいけそうとのこと。
APIライブラリ（ https://jp.twilio.com/docs/libraries ）もあったり。便利。

んで、さっそく使ってみようとしたわけだけど、どうやら無料アカウントに付いている電話番号では無理みたい。
有料会員(2000円チャージ)になる。
日本の電話番号(+81)ではSMSは使えないみたいなので、アメリカの電話番号(+1)を月額150円で購入する。

とここまでやって、必要な情報を以下のスクリプトに記入して、ベコッとコマンドを叩くと、
to電話番号宛にメッセージが送られる。(1メッセージあたり、1.5円)


```python:twilio_sample.py
#!/usr/bin/env python2.7
#-*- coding: utf-8 -*-

from twilio.rest import TwilioRestClient

ACCOUNT_SID = '{ Your Account Sid }'
AUTH_TOKEN = '{Auth Token}'


def main():
    '''
    '''
    client = TwilioRestClient(ACCOUNT_SID, AUTH_TOKEN)

    message = client.messages.create(body='{ message }',
                                     to='{ phone number }',
                                     from_='{ Twilio number }')

    print message.sid

if __name__ == '__main__':

    main()
サイト高速化のための基本ステップと参考リンク



# はじめに

ウェブサイトのロードスピードがなんか遅い気がする…って時に、どういうステップをたどったら良いのかまとめてみました。


# 1. スピードをチェックする

まず、本当にロードスピードが遅いのか（体感できるぐらいだから遅いんでしょうけど）、また何が原因なのか調べます。

便利なツールがいくつかあります。

## GTmetrix

http://gtmetrix.com/

![Latest Performance Report for  http   www.yahoo.co.jp    GTmetrix.png](https://qiita-image-store.s3.amazonaws.com/0/32771/9ec7b040-4fd4-3106-b40d-51efcd7119dd.png)

URLを入れてGO! を押すだけで、細かい分析をしてくれます。
スピード測定、ファイルサイズ測定、改善策の提示まで全て揃っています。


## PageSpeed Insight 
https://developers.google.com/speed/pagespeed/insights/

![PageSpeed Insights.png](https://qiita-image-store.s3.amazonaws.com/0/32771/c569b542-2f52-ef1f-1ead-23a44b7ece98.png)

google謹製のチェックツール。
スピード測定というよりも、スピードアップのための提案をしてくれるツールです。100点満点中80点を超えていれば、スピード対策はやっている方だと思います。


##その他
その他の測定ツールは、こちらの記事で紹介されています：
[ウェブページの読み込み速度を測定できる無料サービス5選] (http://gori.me/web/40389)


# 2. 対策をとる
スピードが遅い事実と、原因がわかりました。
そしたら、GTmetrix やPageSpeed Insight から「やった方がいいぞ」と指摘された対策をとります。

ここでは、代表的なロードスピード対策を紹介します。

## 画像圧縮をする
画像をふんだんに使っているページは、まず圧縮を考えましょう。
圧縮すると画質が粗くなるイメージがありますが、さほど画質を落とさずに圧縮することもできます。

便利な圧縮ツールがいろいろあります。

### Jpeg mini
デスクトップやサーバーにインストールする。
http://www.jpegmini.com/

### Optimizilla
ブラウザ上で画像の圧縮ができるお手軽サービス。
http://optimizilla.com/

### Tiny PNG
パンダがPNG画像を食べて、圧縮してくれる画期的サービス。
https://tinypng.com/


### その他
[画質の劣化を抑えつつ画像を圧縮するオンラインツールのまとめ - NAVER まとめ] (http://matome.naver.jp/odai/2136142731431231001)


## Gzip 圧縮をする

サーバーからいろんなファイルが読み出される時に、それを圧縮して送り出すことでスピードを速くする処置です。
CSSやjsの改行や空白を全削除する方法（いわゆるMinify）もありますが、Gzip圧縮なら元ファイルをいじる必要がなく、メンテナンス性は維持されます。

### Gzip 圧縮の方法
[ウェブサイトをgzip圧縮で高速化する](
http://www.koikikukan.com/archives/2012/06/19-015555.php)

[たった数分！ページ高速化のためhtaccessでキャッシュ設定は絶対やっておこう！](
http://syncer.jp/page-cache-setting)


## その他の方法
上２つは、特別な知識が無くてもできるお手軽な改善方法です。
他にもスピード改善策はいろいろあります。

- CSSスプライトを取り入れる
- データベースとのやりとりを減らす設計にする
- javascript の遅延実行
- 余分なコードを消す

などなど。たくさんあるので、下の記事を参考に！

### その他の方法 - 参考記事
[レベニューに直結！サイトスピード改善に不可欠な6つの知識](
http://growthhackjapan.com/2014-05-21-6-things-you-should-know-before-improving-your-site-speed/)

[今すぐやりたい！サイトの表示速度を改善して利益を増やす10の方法。](
http://jb-labo.com/speed-up-your-website/)

[Webサイトを分析してサイトを高速化させ、AA評価を目指す（お手軽版） | rokuro Fire ](http://www.rokurofire.info/2014/06/26/pagespeed/)

# 最後に - 開発者はマイノリティーである

開発者が普段使っているネット環境は恵まれたものです。ネットが遅かったらイライラして仕事になりませんからね。最低でも光回線で、テスト用のスマホなんかも社内のwifiでサクサクだったりするでしょう。

職場の速いスピードに慣れると、自分のサイトのロードスピードはあまり気にならなくなりますが、そのサイトのユーザーはだいたい、もっと遅い環境で見ています。多分。

そのことを忘れずに。開発者はマイノリティーです。
Ruby | Ruby のブロックパラメータと配列を組み合わせた際の挙動

# Ruby | Ruby のブロックパラメータと配列を組み合わせた際の挙動

## 概要
Ruby のブロックパラメータと配列を組み合わせた際の挙動について。

Rubyのブロックの利用時に、 yield 側が配列を渡すと
ブロックパラメータ側は複数の変数で受け取ることが出来ます。

## サンプルコード

~~~ruby
people = [
  [:id, :name, :age],
  [1, 'tanaka', 23],
  [2, 'suzuki', 39],
  [3, 'sato', 132],
]

# 配列の各要素を分割して別々の変数に取得
people.each { |id, name, age|puts "#{id}, #{name}, #{age}" }
# いつも通り一つの変数で受け取ることも可能
people.each { |person|print person, "\n" }
# each に限定された話ではないので map でも動かしてみる
print people.map { |id, name, age|[name, age, id] }
~~~

## 出力

~~~
$ ruby variable_block.rb
id, name, age
1, tanaka, 23
2, suzuki, 39
3, sato, 132
[:id, :name, :age]
[1, "tanaka", 23]
[2, "suzuki", 39]
[3, "sato", 132]
[[:name, :age, :id], ["tanaka", 23, 1], ["suzuki", 39, 2], ["sato", 132, 3]]
~~~
vimで任意の文字列が含まれる行を一括で削除する方法

任意の文字列が含まれる行を一括で削除したい場合

`:g/hogefuga/d`

逆に任意の文字列が含まれる行以外を削除したい場合

`:v/hogefuga/d`

たったこれだけです。
すごく便利ですね！

#### 参考書籍
[Vimテクニックバイブル～作業効率をカイゼンする150の技](https://amzn.to/3bCGcf5)
[実践Vim　思考のスピードで編集しよう！ (アスキー書籍)](https://amzn.to/2AsLmgA)
[マスタリングVim](https://amzn.to/2LEC9V1)
[入門vi 第6版](https://amzn.to/3e2dyWj)
Ruby | Gviz gem で、 テキスト内容・形状・色をランダムに選択してグラフを生成する

# Ruby | Gviz gem で、 テキスト内容・形状・色をランダムに選択してグラフを生成する
## 概要
Gviz gem で、 テキスト内容・形状・色をランダムに選択してグラフを生成してみます。
***この行為に意味はありません。***

テキストは Lorem ipsum を利用します。

## Lorem ipsum とは？
下記参照。
http://ja.wikipedia.org/wiki/Lorem_ipsum

## Loerm ipsum のテキスト
Sublime Text2 の Emmet plugin を利用して取得しました。

この Emmet の命令を Ctrl + E で展開すると

~~~
lorem10.item*5
~~~

こうなります。これで、 loerm ipsum の 10単語 × 5 行 で 50 単語を取得します。

~~~html
<div class="item">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Suscipit, nam.</div>
<div class="item">Aliquam, hic tempora iure quibusdam voluptatibus natus perferendis maiores veritatis.</div>
<div class="item">Doloribus dignissimos odio deleniti dolorum unde doloremque ex eaque voluptates.</div>
<div class="item">Ea placeat dolor quam provident distinctio voluptatibus, fuga ut incidunt.</div>
<div class="item">Ea, reiciendis repudiandae magnam aliquam eum debitis aliquid atque maiores.</div>
~~~

## サンプルコード

~~~ruby
require 'gviz'
require 'date'

lorem_ipsum = <<-EOS
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Suscipit, nam.
Aliquam, hic tempora iure quibusdam voluptatibus natus perferendis maiores veritatis.
Doloribus dignissimos odio deleniti dolorum unde doloremque ex eaque voluptates.
Ea placeat dolor quam provident distinctio voluptatibus, fuga ut incidunt.
Ea, reiciendis repudiandae magnam aliquam eum debitis aliquid atque maiores.
EOS

lorem_ipsum = lorem_ipsum.gsub(/[\n,\.]/, '').split(' ')
loerm_samples = lorem_ipsum.sample(9).map(&:to_sym)

shapes = %w(box polygon ellipse oval circle point egg triangle plaintext diamond trapezium parallelogram house pentagon hexagon septagon octagon doublecircle doubleoctagon tripleoctagon invtriangle invtrapezium invhouse Mdiamond Msquare Mcircle rect rectangle square star none underline note tab folder box3d component promoter cds terminator utr primersite restrictionsite fivepoverhang threepoverhang noverhang assembly signature insulator ribosite rnastab proteasesite proteinstab rpromoter rarrow larrow lpromoter)
shape_samples = shapes.sample(18)

colorschemes = %i(paired10 brbg10 piyg10 prgn10 puor10)
colorscheme = colorschemes.sample

Graph do
  global layout:'neato', overlap:false
  loerm_samples.each_cons(2).with_index(1) do |loerms, i|
    route loerms.first => loerms.last
    loerms.each_with_index do |loerm, j|
      node loerm, {:shape => shape_samples[2 * (i + j - 1)], :colorscheme=> colorscheme,:style => :filled, fillcolor: i%11 }
    end
  end
  route loerm_samples.last => loerm_samples.first
  date_sufix = DateTime.now.strftime("%Y%m%d_%H%M%S")
  save("loerm_#{date_sufix}".to_sym, :png)
end
~~~

## 出力1回目

![loerm_20140820_222718.png](https://qiita-image-store.s3.amazonaws.com/0/43480/2c07f7e7-d160-5666-f7c6-1b41967be6b7.png)

## 出力2回目

![loerm_20140820_222719.png](https://qiita-image-store.s3.amazonaws.com/0/43480/f974e345-61bf-549d-e77e-758a6da1ae58.png)

## 出力3回目

![loerm_20140820_222720.png](https://qiita-image-store.s3.amazonaws.com/0/43480/9afe4dc9-8358-9897-73c5-6a05813cc77e.png)
IRKitを使ってターミナルで家電を操作する

IRKitとは、記憶させた赤外線信号をwifi経由などで発信させる事が出来るガジェットです。
wifiだけでなく、インターネット上のサーバーを使ってHTTPリクエストで操作する事も出来ます。
外出先から家電をコントロールするスマホアプリやWebアプリが作れます。
http://getirkit.com


今回はターミナルで操作する方法をまとめます。
ターミナルでエアコンとかテレビとか操作するの楽しいです…！

なお、IRKitの初期セットアップは済んでる事とします。
初期セットアップは専用のiPhoneアプリを使って5分程度で出来ます。


##1. IRKitのIPアドレスを確認する
IRKitに割り当てられたIPアドレスを調べます。

まずは、以下のコマンドでIRKitのインスタンス名を確認します。

```shell-session:
$ dns-sd -B _irkit._tcp
```

```shell-session:
DATE: ---Wed 20 Aug 2014---
22:21:53.110  ...STARTING...
Timestamp     A/R    Flags  if Domain               Service Type         Instance Name
22:21:53.374  Add        2   5 local.               _irkit._tcp.         IRKit****
```

インスタンス名を使ってIPアドレスを調べます。

```shell-session:
$ dns-sd -G v4 IRKit****.local
```

```shell-session:
DATE: ---Wed 20 Aug 2014---
22:32:36.663  ...STARTING...
Timestamp     A/R Flags if Hostname                               Address                                      TTL
22:32:36.924  Add     2  5 irkit****.local.                       192.168.*.*                               10
```


##2. IRKitに赤外線信号を記録して、赤外線信号のデータを取得する

IRKit本体に向けて覚えさせたい赤外線信号を送って（リモコンをIRKitに向けてリモコンのボタンを押して）、赤外線信号を記録します。
青のLEDが点滅したら、以下のコマンドで赤外線信号のデータを取得します。

```shell-session:
$ curl -i "http://{IRKitのIPアドレス}/messages"
```

```shell-session:
HTTP/1.0 200 OK
Access-Control-Allow-Origin: *
Server: IRKit/2.1.0.0.g13da7b9
Content-Type: text/plain

{"format":"raw","freq":38,"data":[6648,3341,873,2451,873,787,873,787,873,787,873,...中略]}
```

JSON形式で赤外線信号のデータが取得できます。


##3. IRKitを使って、赤外線信号を発信する

先ほど取得したJSONデータを使って赤外線信号を発信をします。

```shell-session:
$ curl "http://{IRKitのIPアドレス}/messages"-d '{"format":"raw","freq":38,"data":[6648,3341,873,2451,873,787,873,787,873,787,873,...中略]}'
```


以上でターミナルからIRKitを使って、赤外線を発信し家電を操作する事が出来ます。
コマンドラインから1GB以上ディスク容量を食っているディレクトリを表示する

```shell-session
du -h / | grep -E '^[0-9]+\.?[0-9]+G'
```

蛇足ながら解説すると、`du`コマンドはディスク使用を表示し、`-h`フラグをつけると適当な単位で表示してくれます。あとは、`grep -E` (`-E`を忘れないようにしましょう、ハマります)で正規表現を指定するだけ。`1.5G`や`10G`などにマッチします。

【追記】
@richmikan@github さんのご指摘で、FreeBSDのduコマンドは行頭にインデントを入れてしまうとのことでした。そのため、上記の正規表現では動作しません。
正規表現を`^ *[0-9]+\.?[0-9]+G`とすることで、FreeBSD環境でも動作するようになります。
@richmikan@github さん、ありがとうございました。
Project Eulerをhaskellで練習していく日記: Problem 12

#問題
三角数列とは、第n項がnまでの自然数の和であるような数列である。
例えば、第７項は 1 + 2 + 3 + 4 + 5 + 6 + 7 = 28 であり、最初の１０項は以下のようになる。
1, 3, 6, 10, 15, 21, 28, 36, 45, 55, ...
この各項の約数を列挙していくと
1: 1
 3: 1,3
 6: 1,2,3,6
10: 1,2,5,10
15: 1,3,5,15
21: 1,3,7,21
28: 1,2,4,7,14,28
となり、28の項にて最初に約数が5個を超える。
このようにして、最初に約数が500個を超える項を求めよ。
#回答
```hs
import qualified List as L

-- 素因数分解
divisor 1 = []
divisor n = sd : divisor q
        where sd = head [d|d<-[2..n], n `mod` d==0]
              q = n `div` sd

-- 素因数の組み合わせの数を数えることで、約数の個数を求める
numdivs n = product $ map (\a->1+length a) $ L.group $ L.sort $ divisor n

-- 与えられた数列を三角化する関数
trian xs = (head xs): (zipWith (+) (tail xs) $ trian xs)

main = do 
     print $ head $ dropWhile (\n->numdivs n<500) $ trian [1..]
```
#感想
この問題は二つの点で難しかった。
１つめは、三角数列を構成する関数を見いだすこと。（なかなか思いつかず、犬の散歩中にやっと見いだせた。）
２つめは、約数の個数を求める関数。
きっと、約数の個数を求める関数はもっと効率のよいやり方があるのだろうね。。。
Facebook SDK for PHP v4.0で「いいね！」をしたFacebookページを取得


Facebook APIを使っていいねをしたページを取得します。
Facebookはよく仕様が変わるので今回のもいつまでもつか分からないのですが、、、
今回は
 * PHP5.6
 * Facebook SDK for PHP v4.0
を使っていきます。

PHP5.6のインストールはhttp://qiita.com/ykyk1218/items/c859870ef8dac79f5e1c
を確認してみてください。

# Facebook SDK for PHPのインストール

composerを使ったインストールがいかしているので、composerを使います。
あらかじめcomposerをインストールしておいてください。

下記の要領でcomposer.jsonファイルを作成。

```composer.json
{
  "require" : {
    "facebook/php-sdk-v4" : "4.0.*"
  }
}
```

composerを実行

```bash
$ php composer.phar
```

# Facebookアプリの登録
※この辺りはすぐに仕様が変わったしまいそうなのですが、2014年8月現在は下記の要領でFacebookアプリの登録ができます。

・開発者ページにアクセス
https://developers.facebook.com/

・Criate a New Appを選択
![developers.facebook.com-.jpg](https://qiita-image-store.s3.amazonaws.com/0/6808/4b079884-e273-6505-8658-c807d25206e9.jpeg "developers.facebook.com-.jpg")

### 設定内容
・Display Name
Facebookアプリの名前

・Namespace
アプリのURLになる文字列

・Is this a test version of another app?
既に作成済みのアプリのテストバージョンを作る場合はこちらを「はい」にする

・カテゴリ
作成するアプリのカテゴリ

### App IDとApp Secreatの確認
facebookアプリを作成したらApp IDとApp Secretを確認します。
settingsページにあります。

![settings.jpg](https://qiita-image-store.s3.amazonaws.com/0/6808/c8a8ee88-07d9-1c74-dfdb-ac5e2dedef89.jpeg "settings.jpg")


# PHPファイルの作成

この辺りを見ればきっとなんとかなります。
https://developers.facebook.com/docs/reference/php/4.0.0

```php
session_start();
require("../vendor/autoload.php");

use Facebook\FacebookSession;
use Facebook\FacebookRequest;
use Facebook\GraphUser;
use Facebook\FacebookRequestException;
use Facebook\FacebookRedirectLoginHelper;

define("APP_ID", '<facebookアプリID>');
define("APP_SECRET", '<facebookアプリのシークレットID>');

FacebookSession::setDefaultApplication(APP_ID, APP_SECRET);
$helper  = new FacebookRedirectLoginHelper('<facebook認証をした後の戻り先URL（今回はこのURLに戻ってくることとします）>');
$session = $helper->getSessionFromRedirect();
$scope=null;
if($session) {
        $accessToken = $session->getToken();
        $request = new FacebookRequest($session, 'GET', '/me/likes');
        $response = $request->execute();
}else{
        //「いいね」をしたページリストにアクセスできる権限を付与
        $scope = array('user_likes');
}
?>
<html>
        <div><a href="<?php echo $helper->getLoginUrl($scope); ?>">facebook認証</a></div>
        <?php if(isset($response)) {
                $graphObjList = $response->getGraphObjectList();
                foreach($graphObjList as $r) {
                        //Facebookページの名前
                        $name     = $r->getProperty('name');
                        //FacebookページID
                        $fbPageId = $r->getProperty('id');
        ?>
                <p><a href="http://www.facebook.com/<?= $fbPageId ?>"><?= $name ?></a></p>
                <?php }
                } ?>
</html>
```
rails.vimからrailsへの依存をなくしたprojectionist.vimを(railsで)使ってみた

# projectionist.vim とは

https://github.com/tpope/vim-projectionist
http://www.vim.org/scripts/script.php?script_id=4989

rails.vimの:Aとか:Exxxとかの機能を、railsに関係なく、jsonで記述したルールに従って使えるようになっているプラグイン。 **rails.vimと共存できない。**

# railsで使うとどのへんが嬉しいのか

## お詫びして訂正 2014/9/11

「プロジェクト固有に導入したものに対して:Aや:Exxxを使えるようにできる。」のは rails.vim でも出来ます。なので実はrailsのアプリ開発で使ってもほとんど嬉しくないです…

https://github.com/tpope/vim-rails/blob/0bb6d900af43c0fc274980ec2a8037b1f7dfdd7a/doc/rails.txt#L704 あたりに設定方法があります。

## 元々書いてた内容

プロジェクト固有に導入したものに対して:Aや:Exxxを使えるようにできる。例えば

* active_decoratorを使っていれば:Edecoratorができる
* active_adminを使っていれば、app/admin/hoge.rbから:Aでspec/features/admin/hoge_spec.rbを開ける

# 逆にどのへんが悲しいのか

rails.vimを使うのをやめないといけないので、:Emodelなどrails.vimでデフォルトなものの定義も書かないといけない。

https://github.com/tpope/vim-rails/issues/326

# 何をすれば使えるのか

## 1. rails.vimを使わないようにする

`" Bundle 'tpope/vim-rails'`

## 2. projectionist.vimを使うようにする

`Bundle 'tpope/vim-projectionist'`

## 3. .projection.jsonを記述する

プロジェクトのルート直下に置く。

```json:.projection.json
{
  "app/admin/*.rb": { "alternate": ["spec/features/admin/{}_spec.rb", "spec/features/admin/{plural}_spec.rb"], "type": "admin" },
  "app/controllers/*_controller.rb": { "alternate": "spec/controllers/{}_controller_spec.rb", "type": "controller" },
  "app/decorators/*_decorator.rb": { "alternate": "spec/decorators/{}_decorator_spec.rb", "type": "decorator" },
  "app/helpers/*_helper.rb": { "alternate": "spec/helpers/{}_helper_spec.rb", "type": "helper" },
  "app/mailers/*_mailer.rb": { "alternate": "spec/mailers/{}_mailer_spec.rb", "type": "mailer" },
  "app/models/*.rb": { "alternate": "spec/models/{}_spec.rb", "type": "model" },
  "app/workers/*.rb": { "alternate": "spec/workers/{}_spec.rb", "type": "worker" }
}
```

alternate項目を書けば:A系コマンドが、type項目を書けば:E系コマンドが使えるようになる。
:Aコマンドが一方通行なので、逆もやりたかったらそのための定義が必要っぽい。
*だけでディレクトリを再帰的に見てくれる。たとえば上記の設定でも、app/models/admin/user.rbから
:Aで
spec/models/admin/user_spec.rbを開くことができる。

詳細は :help projectionist に。

# projectionという考え方自体はvim関係ないよねという話

https://github.com/tpope/vim-projectionist#faq

> > Why not a clearer filename like `.vim_projections.json`?
>
> I don't see any reason to tie the concept of projections to Vim in particular.
> While some features (in particular navigation commands) are idiosyncratic to
> the way Vim works, others could make sense in a wide variety of editors.

関係ないので、guard-rspecの設定も.projection.jsonを読ませるようにしてみたりしたいなーと思っている。
【Android】よく使うadbコマンド

Androidアプリの開発を進めていると、動作確認やテストで前のバージョンのアプリが必要だったり、アプリのバックアップがとりたかったりすることが多々あります。
そんなときはコマンドをつかって操作するほうが楽だと思います。
よく使うコマンドをまとめます。

##コマンド

### 接続している端末の確認
```
adb devices
```

### アプリ(apkファイル)のインストール
```
adb install [apkファイルパス]
```
またadb install -r [apkファイルパス]でアップデートインストールができるようです。私は試したことがないです。今度やってみます。

### アプリのアンインストール
```
adb uninstall [アプリのパッケージ名]
```

### アプリのバックアップ
```
adb backup –f [保存するファイル名] –apk [アプリのパッケージ名]
```
-f：ファイル名の指定です。拡張子は「.ab」です。
-apk：バックアップにapkファイルを含めることができます。
大量のデータがはいっているアプリを別の端末でも使いたいときなどに便利です。
このコマンドを実行すると、端末側ではパスワードの入力とバックアップをしてもよいかと聞かれますが、パスワードは入力しなくても大丈夫です。

### アプリの復元
```
adb restore [復元したいファイル名]
```
バックアップをとっておいたファイルを復元するときに使います。
端末側では復元するかどうかということとパスワードが聞かれますが、パスワードを設定していない場合は何も入力しなくても大丈夫です。

## 最後に
バックアップをするときにパッケージ名の指定を間違っていてもエラーにならなかったと思います。
容量0のファイルができてしまってとても焦ります。
ページキャッシュがどんどん増えている…そんな時に役立つワンライナー

サーバーのメモリのグラフを見ているとどうもページキャッシュがどんどん増えているという状況があったとします

そんな時に例えば Nginx のログとか明確にページキャッシュに乗っていそうなログがあればいいのですが，心当たりがないのにどんどん増えているのは不穏なのでどのファイルがページキャッシュに乗っているのか調べたいです

そんな時に役立つのは cpan モジュールの `Sys::PageCache` です

  * [ファイル指定で、ページキャッシュにのっているか確認したり追い出したり - (ひ)メモ](http://d.hatena.ne.jp/hirose31/20130913/1379069149)

これを cpanm でインストールすれば `pagecache-check.pl` と `pagecache-clear.pl` というコマンドをインストールされます

そしてファイル名を指定すればそのファイルがページキャッシュにどの程度乗っているか確認できたり，ページキャッシュから追い出せたりする超便利コマンドです

このコマンドは超便利なのですがファイルを指定しなければいけないのでシステム全体でどのファイルのページキャッシュが多く乗っているのかは一つ一つ調べないといけません

そこでシステム全体でページキャッシュに多く乗っているファイルを見つけるワンライナーを書きました

```zsh
find / -type f -name "*" -size +1000k -mmin -60 2> /dev/null \
  | xargs sudo pagecache-check.pl 2> /dev/null \
  | perl -ne 'if ((m{(.*?)\s.*cached/total_pages=(.*)/.*}) && ($2 > 0)) { print $2, "\t", $1, "\n"; }' \
  | sort -nr
```

とりあえず find で軽くファイルを絞っておきます
権限的に開けないファイルがあるのでその時にエラーが出てしまって邪魔なので標準エラー出力を捨てています
1000kB 以上で 60 分以内に更新があるファイルにしぼります

find の出力を `xargs` を使って `pagecache-check.pl` に渡します
ここでもエラーが出ることがあって邪魔だったので標準エラー出力を捨てました

その後 `pagecache-check.pl` の出力はコマンドの組み合わせでパースするのが困難だったのでまた perl のお世話になりました
そして `sort` コマンドに渡しやすい形に出力します

そして最後に `sort -nr` で軽くフィニッシュです

数が多ければ `head` とかで絞りましょう

ちなみに今回はとあるログファイルのログローテートがコケていてすごくでかくなっていることが原因でした
このワンライナーを使えば一発で気付けたので皆さんも何かおかしいと思ったらぜひ使ってください
引数有り無しでgetter/setterを切り替えるメソッド(一行で)


天啓メモ。

```coffeescript
class K
  val: (@_val=@_val) -> @_val
```

使う時

```coffeescript
a = new K()
a.val("A")
console.info(a.val())
```

なんでしょね。
Plone 5 の開発用環境を作る


# 結論
結論が最後にあると、試す時に途中で挫けてしまうという指摘を受けたので、最初に結論を持ってきます。


Ploneの最新版をgithubなどから取得して、さらに日本語の翻訳をやりたい場合は以下を使う。

```
$ virtualenv plone5_dev
$ cd plone5_dev/
$ source bin/activate
$ git clone git@github.com:plonejp/buildout.coredev.git
$ cd buildout.coredev
$ git checkout -t origin/5.0-ja
$ python bootstrap.py
$ bin/buildout
```



# 前提条件

- Python 2.7 及び virtualenv がインストール済み
- gitがインストール済み

# 環境構築

## Ploneのインストール

**注意** 日本語翻訳に対応させる場合、最下部に書いた方法を使って下さい。

```
$ virtualenv plone5_dev
$ cd plone5_dev/
$ source bin/activate
$ git clone git@github.com:plone/buildout.coredev.git
$ cd buildout.coredev
$ git checkout -t origin/5.0
$ python bootstrap.py
$ bin/buildout
```

時々、pypiやgithubからダウンロードできずエラーとなる。何度か buildoutコマンドを実行し再取得を行う必要がある。

## 一部カスタマイズ

githubのploneグループにコミット権が無い場合は、clone元を変更する

```
$ git clone git@github.com:plone/buildout.coredev.git
↓
$ git clone https://github.com/plone/buildout.coredev.git
```

Plone JPのcoredevを使う場合。

```
$ git clone git@github.com:plone/buildout.coredev.git
↓
$ git clone git@github.com:plonejp/buildout.coredev.git
```


## 起動及び動作チェック

```
$ ./bin/instance fg
```

起動できた。
ユーザ: admin パスワード: admin でログインできた。

Plone JPのcoredevに切り替え

```
$ git remote add plonejp git@github.com:plonejp/buildout.coredev.git
$ git pull plonejp 5.0
```

plonejp でforkしているレポジトリに変更して、日本語訳を確認する。

```
$ git branch 5.0-ja
$ git checkout 5.0-ja
```

取得元を変更

```20140821現在以下のパッケージをplonejpグループにforkしているのでこれらの設定を変更
    plone.app.locales
    plone.app.event
    plone.app.dexterity
    plone.dexterity
```

```sources.cfg
# Plone JP
plone_jp = git://github.com/plonejp
plone_jp_push = git@github.com:plonejp
.
.
#plone.app.locales                   = git ${remotes:collective}/plone.app.locales.git pushurl=${remotes:collective_push}/plone.app.locales.git branch=master
plone.app.locales                   = git ${remotes:plone_jp}/plone.app.locales.git pushurl=${remotes:plone_jp_push}/plone.app.locales.git branch=master
```

```checkouts.cfg
auto-checkout =
.
.
# Add for Plone JP
    plone.app.event
    plone.dexterity
```

```
bin/buildout
```

完成!!


注記: 環境構築後(初回buildout後)に、coredevのbranchを切り替えたりplonejpにforkしたものを使うように変更しても、src以下のパッケージがgitの取得元を覚えているので、使いたいbranchにならない。
全ての環境を再構築するか、該当パッケージをsrc消して、再度 buildoutを実行すればよい。

# 著者関連Blog記事

[最新 Plone 5 の開発状況と環境構築](https://www.cmscom.jp/blog/dtk0yp)
MacOSでOS再インストールで復旧したら（もしくはTime Machineで復旧したら）brewで入れたものが全然使えねぇんだけど！って人へ。



# 背景

Mac が突然落ちて、電源入れてもグルグルグルグルして起動しなくなった。

何やってもダメなので再インストールしたんですが
（HDDをフォーマットしなければユーザーデータは残る）
そしたら今度は、lsコマンド使えないんですよ。
glsが無いですよーって。

```bash:glsが無いから。無いもんは無いから。無理だから。
$ ls
bash: gls: command not found
$
```

coreutilsを
brew uninstall ＆brew installすれば
使えたんですが、他にもbrewで入れたものが軒並み動かず、
全部いちいちそれやるの面倒だなーと思って
ワンライナーでやってみました。
（ちなみにupdateとかは出来なかった。（

## コマンド

```bash:
$ brew list -1 | xargs -I % bash -c "brew uninstall %; brew install %"
```

`brew list -1` で パッケージのリストだして
`xargs -I %` で `%` の中にbrew listで出して来た
パッケージ名を１つずつ突っ込めるようにして
後は `bash -c "brew uninstall %; brew install %"` で
ひたすらアンインストール&インストール。




復旧の仕方というより、macのxargsの使い方の話でした。
MySQLでrootのパスワードを忘れた場合(CentOS)

### 1. まずはMySQLを停止

```
$ sudo service mysqld stop
```

### 2. MySQLをセーフモードで起動

```bash
$ mysqld_safe --skip-grant-tables &
```

### 3. root でログイン

```bash
$ mysql -u root
```

### 4. パスワードの再設定

```mysql
> use mysql;
> update user set password=PASSWORD("新パスワード") where User='root';
> flush privileges;
> quit
```

### 5. セーフモードのMySQLを停止

```bash
$ sudo service mysqld stop
```

### 6. 通常モードでMySQLを起動

```bash
$ sudo service mysqld start
```
ActiveAndroidを使ってテーブル追加したつもりで、モデルを使おうとすると『no such table』と怒られるときの対応


しょうもないことでハマった。。

-

### 『新規テーブルの追加』はDBが作成されるタイミングか、アップロードするタイミングで行われる

と、いうことを知らなかった。

新しいモデルを追加するだけで勝手にテーブル作ってくれるのかな、と甘えていた。

なので、モデル追加してアプリ実行しても『no such table』とエラーが出ていた。

-

### ActiveAndroidの処理を理解するためにソースを読む。
DB系の操作を一任されてそうな`DataBaseHelper.java`を見てみる。

`private void executeCreate(SQLiteDatabase db)`

このメソッド内で

```java:executeCreate
private void executeCreate(SQLiteDatabase db) {
		db.beginTransaction();
		try {
			for (TableInfo tableInfo : Cache.getTableInfos()) {
				db.execSQL(SQLiteUtils.createTableDefinition(tableInfo));
			}
			db.setTransactionSuccessful();
		}
		finally {
			db.endTransaction();
		}
}
```

ユーザが定義したテーブル情報をもとにして、テーブルを作っていた。

なので、この`executeCreate`が呼ばれる場所を探す。
同クラスの`onCreate`と`onUpgrade`で呼ばれていた。
DBは既に作られているので、onCreateではなくonUpgradeを呼ばれるようにする必要がありました。

なので、

```java:AwesomeApplication.java
Configuration.Builder builder = new Configuration.Builder(getBaseContext());

builder.setCacheSize(1024 * 1024 * 4);
builder.setDatabaseName("awesome.db");
// バージョンを1から2へアップグレード
builder.setDatabaseVersion(2);

ActiveAndroid.initialize(builder.create(), true);
```

ApplicationクラスのonCreateで上記のように書き換えた。

無事テーブルが追加されました。よかった。
Ruby ちょっとした黒魔術

```ruby:array.rb
class NilClass
  def [] n
    nil
  end
end
```
効果
nil[1] = nil
になります。

```irb:
irb(main):001:0> [1][2][3]
NoMethodError: undefined method `[]' for nil:NilClass
        from (irb):1
        from c:/ruby/bin/irb:11:in `<main>'
irb(main):002:0> class NilClass;def [] n;nil;end;end
=> :[]
irb(main):003:0> [1][2][3]
=> nil
irb(main):004:0> [1][2].nil?
=> true
irb(main):005:0> [1][2][3] == nil
=> true
irb(main):006:0> {:a1 =>[1,2,3],:a2=>nil}[:a2][2] == nil
=> true
```

これによって深い場所の存在確認を一発でできるようになります。
副作用は多分そんなにないはず……
NoMethodError: undefined method `[]' for nil:NilClass
をキャプチャして何かやる人ってちょっと思いつかない。
真面目な人はちゃんと１階層ずつnilじゃない事を確認するはずですし
nil かどうかチェックするならnilと判定されるので

追記:2014/8/21
副作用を思いつきました。このトリックはしばしばデバッグを困難にします。

```ruby:fault.rb
c
case x
when 1 then
  c = x[1][:conf][1]
when 2 then
  c = x[2][:cnfo][1] #ここで表記ミス
#以下ちょっと長い処理
end

#ここでなんらかの例外が発生し、cがnilである事に気がつくが
#例外が発生する場所とミスをした場所が離れてて大変な場合もある
```
以下のようにした方が安全

```ruby:
class NilClass
  def [] n
    #-vや-W オプションを指定した場合コール元を表示
    $stderr.print("#{caller().first} was called NilClass#[]\n") if $VERBOSE
    nil
  end
end
```
WIP新しい開発手法

# WIPで新しい開発手法

**WIP(Work-in-progress)：仕掛り作業という意味**

WIPという文字が付いていると、その作業はまだ終了しておらず、作業中であるとわかる。
一つの作業においても作業が様々あるので、それを細分化して書いておく。

例）進行中のチケットの状態
【WIP】#12345 ○○機能の新規追加

- [✔]　○○.php にformを作成する
 * [✔]　○○テーブルを作成する
 * [　]　formをカスタマイズする
- [　]　formの挙動を確認する
- [　]　CSSの適応
- [　]　テスト

レビューワー（コードチェック）はWIPの状態を見ることで、その作業がどこまで進行しているかがわかり、タイトルの【WIP】が外れていたらその作業は完了（レビュー待ち）というように一目でわかるようになる。

プロジェクト管理において、今あるチケットがどういう状態なのか「見える化」することができるようになる。

例）作業完了時のチケットの状態
　#12345 ○○機能の新規追加

- [✔]　○○.php にformを作成する
 * [✔]　○○テーブルを作成する
 * [✔]　formをカスタマイズする
- [✔]　formの挙動を確認する
- [✔]　CSSの適応
- [✔]　テスト

## github等で開発を行う

最近、開発では欠かせないgit、これを活用してWIP開発を行う方法を書きます。

1. 最初にプルリクエストをだす
最初にプルリクエストを出すことで、そのプルリクエストの中身（コメント）に自分のやることのタスクを細分化して書く。
github等ではコミットがなければプルリクエストを出せないので、空のコミットをpushしてやる必要がある。

```bash
$ git checkout -b test
$ git commit --allow-empty -m "make empty commit"
$ git push origin test
```

2. プルリクエストの内容を編集する
タイトルに【WIP】○○、本文にその作業を細分化したものを書く。
細分化した作業を書いておけば、コミットメッセージ等も楽々。

3. コミットを重ねていく
作業が進んでいったら自分の細分化したコミットを重ねていく。

```bash
$ git add .
$ git commit --amend
```

4. 一つの細分化した作業が完了したらレ点にチェックする

5. 作業が完了したら【WIP】を外す
6. レビューワーがレビュー
レビューワーは【WIP】が外れたものからレビューを開始することができる。
プロジェクトマネージャーはどの作業がどのぐらい進んでいるか確認できる。

# 補足

現在githubのみ、GitHub Flavored Markdown という記法を取り入れていますので、

```text
- [ ] hogehoge
```

と書くことで、チェックボックスが生成できるというすごい機能があります。

以上がWIP開発という新しい開発手法でした。
AngularJSのControllerAs記法

### ControllerAs記法

1.2系からng-controllerで`HogeCtrl as hoge`という記法が使えるようになっています


```html
<div ng-controller="SomeCtrl as some">
  <p ng-bind="some.name"></p>
</div>
```

```js
angular.module('app').controller('SomeCtrl', function(){
  var vm = this;
  vm.name = "Ishikari gawa";
});
```

```
Ishikari gawa
```

classライクに書くことが出来ます



### nested controller

controllerがネストされた構造のとき、親のscopeを書き換えるには$parentで直接親スコープにアクセスするか、scope.obj.nameのように中間オブジェクトobjを挟み、jsのprototype chain経由で書き換えるかを迫られます。が、ControllerAs記法だとシンプルに書けます。

```html
<div ng-controller="GrandpaController as granpa">
  <p ng-bind="granpa.name"></p>
  <div ng-controller="ParentController as parent">
    <div ng-controller="ChildController as child">
      <p ng-bind="granpa.name"></p>
      <input type="text" ng-model="granpa.name">
    </div>
  </div>
</div>
```

![スクリーンショット 2014-08-20 7.03.27 PM.png](https://qiita-image-store.s3.amazonaws.com/0/27828/23f16d01-a3b5-d214-335c-17cd7f3ab610.png)


たとえParentとGrandpaの入れ子が逆転しても問題なくなります。

### $scopeが必要な時

\$scopeが使えなくなるわけではありません。\$broadcast, \$emit, \$onを使いたい時は$scopeをDIすれば普通に使えます

```js
angular.module('app').controller('SomeCtrl', function($scope){
  var vm = this;
  vm.name = "Ishikari gawa";
  $scope.$on('SomeCoolEvent', function(event, data) {
    // some cool process...
  });
});
```

\$watchはちょっと工夫が必要。第一引数でwatch対象を返すfunctionを指定します

```js
angular.module('app').controller('SomeCtrl', function($scope){
  var vm = this;
  vm.name = "Ishikari gawa";
  $scope.$watch(function(){
    return vm.name
  }, function(newVal, oldVal) {
    // do some thing
  });
});
```

### Directiveやrouterでの指定

\$routeProviderやdirectiveではcontrollerに加えてcontrollerAsを指定することが出来ます。

```js
// when you use ng-route
$routeProvider.when('/map', { controller: 'MapCtrl', controllerAs: 'map', templateUrl: 'map/index.html' })

```
ただし、[ui-router](https://github.com/angular-ui/ui-router)にはその記法は無いらしく、controllerで`HogeCtrl as hoge`のように指定します。

```js
// when you use ui-router
$stateProvider.state('map.home', { url: '/map', controller: 'MapCtrl as map', templateUrl: 'map/index.html' })

```

### まとめ
すごく便利。これをデフォにして欲しいくらいです

### 参考
https://github.com/johnpapa/angularjs-styleguide
windows上でgawkを勉強したい人は下記の情報はお役に立てればと思います。

#環境整備
1.Windows上で動くgawkのダウンロード
http://ftp.vector.co.jp/pack/win95/util/text/awk/gawk-mbcs-win32-20051223.zip?_ga=1.71611859.1794640146.1403167474
2.「おーくの友だち」ツールのダウンロード
http://hpcgi2.nifty.com/mozu/kz_download.cgi?Forawk111.zip

※このツールを持つと下記のことができます。
・gawk用のソースの作成、実行が楽になります。
・インプットファイルが複数の場合、簡単に指定できます。
・出力場所：クリップボード、スクリーン、ファイルなど指定できます。
・同じソースを複数のファイルに対して実行する時に楽です。

#勉強用サイト
「おーくの友だち」というツールを使いながら勉強が楽しいです。
http://homepage2.nifty.com/mozu/koza/park_of_text.html

勉強を終わったら、下記のサイトでまとめて復習したらよいかもしれません。
http://www.osaka-kyoiku.ac.jp/~kokugo/nonami/awk/awkmini.html


#サンプル
####１．受信ファイルの中にタイトル行しかないファイルである場合、そのファイルを削除するコマンドを自動作成するサンプル

```sh:
#------------------------------------------
#タイトルしかないファイルの削除用コマンド作成
#------------------------------------------

#------------------------------------------
#ファイルを読み込む前に１回だけ実行されるブロク
#------------------------------------------
BEGIN{
	count = 0;
    FS = "\t";#項目の区切り文字の指定する
}


#------------------------------------------
#1個目のフィールドの値でタイトルであるかどうかを判断し、
#タイトル行ではない行の個数を計算する
#------------------------------------------
$1  !~/^帳票種/ {count += 1;}

#------------------------------------------
#タイトル行しかないファイルの場合、削除コマンド作成
#------------------------------------------
END{
    #最後の行である場合、データレコードの合計件数により、削除命令の出力制御を行う
    if(count == 0){
         print "del" " " FILENAME >> "C:\\Users\\Fowawk111\\result.bat" ;
    }
}


#------------------------------------------
#この部分は$1  !~/^帳票種/ {count += 1;}と同じ役割
#------------------------------------------
#{    
    #タイトル行ではない行の計算を行う
#    if ($1 !~/^帳票種/) {
#		count += 1;
#	}
#}
#------------------------------------------
```
sqlからsqlを生成する

# sqlからsqlを生成する

mysqlで`group by` したやつを集計する時とか、
`case when` みたいなのを手動で列挙するのではなく、
他のテーブルを参照してsqlを組み立ててみる。

めんどくさい割にあんまメリット無いのでパズル感覚で。

## 例えばこんな感じのテーブルで

### types

```sql:table_of_types
CREATE TABLE `types` (
  `type_id` int(11) unsigned NOT NULL,
  `name` varchar(255) CHARACTER SET latin1 DEFAULT NULL,
  PRIMARY KEY (`type_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
```

```
type_id	name
0	free
1	paid
```

### coins

```sql:table_of_coins
CREATE TABLE `coins` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `player_id` varchar(255) CHARACTER SET latin1 NOT NULL,
  `type_id` int(11) NOT NULL,
  `platform` varchar(64) CHARACTER SET latin1 NOT NULL,
  `quantity` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
```

```
id	player_id	type_id	platform	quantity
1	4bb009bb-9901-406d-b080-ce73ca5a32e7	0	ios	1007
2	571c0ea8-bb36-4a75-90a9-ca3e834de916	0	ios	799764
3	6cc13b52-e279-4f55-a792-65c836211462	0	ios	264
4	987e7b4e-4d69-4077-b8c9-6e3f3caac3d1	0	ios	506
5	41069135-1df8-4760-9f39-bdbf185d6a88	0	android	492
6	6cc13b52-e279-4f55-a792-65c836211462	1	ios	0
7	41b9baea-d55f-4c5a-a568-610d6717896c	0	ios	2
8	41b9baea-d55f-4c5a-a568-610d6717896c	1	ios	0
9	4a3bd1ea-fac7-4a20-919a-c1dca355b559	0	ios	1006
10	6194b419-3b0b-4ba8-9a4d-cad352094062	0	ios	715
```

## ざっくりこんな感じで集計したい場合

```
player_id	platform	free	paid
31cf8316-4921-4190-8082-a4cdef5a9ab4	android	461	0
36c386ff-d5e1-4258-b95b-fde80259d8cc	ios	49956	0
39f8034a-3450-432a-8fc6-d07a9cce45f6	ios	1	0
3ea8b328-0012-4a99-ad7b-64f8fb9c2406	ios	610	0
41069135-1df8-4760-9f39-bdbf185d6a88	android	492	0
41b9baea-d55f-4c5a-a568-610d6717896c	ios	2	0
4a3bd1ea-fac7-4a20-919a-c1dca355b559	ios	1006	0
4bb009bb-9901-406d-b080-ce73ca5a32e7	ios	1007	0
51f5b3cb-fc57-48d8-b825-780ce934ce71	ios	186	0
571c0ea8-bb36-4a75-90a9-ca3e834de916	ios	799764	0
6194b419-3b0b-4ba8-9a4d-cad352094062	ios	715	0
```

## 目標

`coins`テーブルを`group by`して`quantity`の値をかき集めてくれば良いので、
こんな感じのsql投げればよいと思う。

```sql
select player_id, platform,
    sum(case when type_id = 0 then quantity else 0 end) free,
    sum(case when type_id = 1 then quantity else 0 end) paid
from coins
group by player_id, platform
```

ここで、`case when`の部分を`types`テーブルを参照して組み立てるように。

## sqlを組み立てるsql

`concat`とか`group_concat`でこねくり回してみる。
`group_concat_max_len`の値は大きめにしておかないと途中で途切れてしまうので注意。

```sql
set group_concat_max_len = 1000000;
select
    concat_ws(" ",
        "select player_id, platform,",
        group_concat(
            concat("sum(case when type_id = ", type_id, " then quantity else 0 end) ", name)
        ),
        "from coins",
        "group by player_id, platform"
    )
    from ( select type_id, name from types ) as A
```

これでおｋ。

## bashでそのまま流し込むとこんな感じ

```bash:bash
MYSQL="mysql -uroot -ppasswd --batch -Dhoge_db"

$MYSQL -N <<EOD | $MYSQL
set group_concat_max_len = 1000000;
select
    concat_ws(" ",
        "select player_id, platform,",
        group_concat(
            concat("sum(case when type_id = ", type_id, " then quantity else 0 end) ", name)
        ),
        "from coins",
        "group by player_id, platform"
    )
    from ( select type_id, name from types ) as A
EOD
```

ややこしくなっただけな気がする…