OmniAICreator/Qiita-1.07M huggingface dataset:
VMのCentOSのネットワーク設定

メモ。

## ネットワーク設定

+ 192.168.1 を環境に合わせる。

```properties:ifcfg-eth1
DEVICE=eth1
HWADDR=08:00:27:FA:A0:57
TYPE=Ethernet
UUID=31eb95fb-21ca-4b39-9977-cbf6070d991e
ONBOOT=yes
NM_CONTROLLED=yes
# BOOTPROTO=dhcp
BOOTPROTO=static

# IPv4 static
IPADDR=192.168.1.2
GATEWAY=192.168.1.1
NETWORK=192.168.1.0
NETMASK=255.255.255.0

DNS1=8.8.8.8
DNS2=8.8.4.4
```

### ルーティング

```bash:
# /etc/init.d/network restart
# route del default gw 192.168.0.1
# route add default gw 192.168.1.1
```

### ホスト名の変更

```bash
# cp -p /etc/sysconfig/network /etc/sysconfig/network.$(date -I)
# vi /etc/sysconfig/network
```


```properties:/etc/sysconfig/network
NETWORKING=YES
NETWORKING_IPV6=NO
HOSTNAME=localhost.localdomain
```

```bash
# reboot-n now
```

### SELINUX の無効化

```bash
# cp -p /etc/selinux/config /etc/selinux/config.$(date -I)
# vi /etc/selinux/config
```

```properties:/etc/selinux/config
SELINUX=disabled
SELINUXTYPE=targeted
```

### SELINUX の無効有効化

```bash
# cp -p /etc/selinux/config /etc/selinux/config.$(date -I)
# vi /etc/selinux/config
```

```properties:/etc/selinux/config
SELINUX=enforcing
SELINUXTYPE=targeted
```

### sshdの許可

```bash
# cp -p /etc/host.allow /etc/host.allow.$(date -I)
# vi /etc/host.allow
```

```text:/etc/host.allow 
sshd : 192.168.1.
```
パッケージ名が必要なadbコマンドを、パッケージ名を省略して使う

先日、以下のような記事を書きました。

[コマンドでAndroidのアプリ情報画面を起動する - Qiita [キータ]](http://qiita.com/t2low/items/4ec1e9cab8621cd23396 "コマンドでAndroidのアプリ情報画面を起動する - Qiita [キータ]")

`appinfo パッケージ名` でアプリ情報画面を表示させるコマンドを用意したのですが、今度はパッケージ名を打つのが面倒になってきました。

なんとか現在開発中のアプリを推測して、パッケージ名の入力を省略できないものか考えました。

* パッケージ名はどこから取るか → AndroidManifest.xml から取るのが確実
* 開発中のアプリはどう推測するか → 開発中は`git`コマンドを打つためにだいたいプロジェクトのディレクトリ(AndroidManifest.xmlと同じディレクトリ)にいる

この条件下なら意外と簡単そうです。
とりあえず、以下のコマンドでAndroidManifest.xmlからパッケージ名を取得出来ました。

```bash:コマンド
grep package= AndroidManifest.xml | cut -d '=' -f 2
```

コマンドは詳しくないので、簡単な方法しかわかりませんでした。
以下のように1行にpackageのみ書かれていないとうまく動きません。

```xml:AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.app"
    android:versionCode="1"
```

とりあえず、自分の環境では動いたので良しとします。
これをエイリアスとして登録しておきます。
名前は`mypkg`としました。

```bash:.bashrc
alias mypkg='grep package= AndroidManifest.xml | cut -d '=' -f 2'
```

続いて、前回の`appinfo パッケージ名`と組み合わせて呼べるようにします。
関数は`export -f`しないとうまく呼べないようです。
あとアンインストールコマンドも引数なしで呼べるようにしました。
以下の様な形になりました。

```bash:.bashrc
appinfo() {
	adb shell am start -a android.settings.APPLICATION_DETAILS_SETTINGS -d package:$1;
}
export -f appinfo
alias mypkg='grep package= AndroidManifest.xml | cut -d '=' -f 2'
alias infpkg='mypkg | xargs -I % bash -c "appinfo %"'
alias rmpkg='mypkg | xargs adb uninstall'
```

これでAndroidManifest.xmlと同じディレクトリにいるときであれば、わざわざパッケージ名を入力しなくても良くなりました。
使うときは以下のとおりです。

```bash:コマンド
# アプリ情報を表示するとき
infpkg
# アプリをアンインストールするとき
rmpkg
```

上でも書いたとおり、コマンドは詳しくないので、きっともっと良い書き方があるんだろうな、と思っています。
が、まずは動いたので良しとします。以上です。
ログインしてないときにアクセスした画面に戻りたい、GET以外でも。


deviseの話です。

routes.rbにはこんなかんじの定義があるとします。

```confg/routes.rb
devise :users
resources :events do
  resource :attendances, only: [:create, :destroy] # 参加処理
end
```

例えば、`/events/new` にアクセスするには`user`の認証が必要。そんな時はコントローラーに以下のように書きますよね。

```app/controllers/events_controller.rb
class EventsController < ApplicationController
  before_action :authenticate_user!, only: [:new] # rails3 以下なら before_filter
  def show
     # イベント表示処理
  end

  def new
    # イベント作成準備処理
  end
end
```

この時、ログインしてない状態で、`/events/new` に アクセスすると、ログインしていないので`new_user_session_path` にリダイレクトされますね。
んで、ログインした跡は、`/events/new` に戻ってこれる。よい。`devise`よい。


今度は、イベント参加時に`user`の認証が必要。そんな時は以下。

```app/controllers/attendances_controller.rb
class AttendancesController < ApplicationController
  before_action :set_event
  before_action :authenticate_user! # rails3 以下なら before_filter

  def create
    # イベント参加処理
  end

  def destroy
    # イベント参加キャンセル処理
  end

  private
  def set_event
    @event = Event.find(params[:event_id])
  end
end
```

`/events/:id` の`view`に、こんなボタンが置いてあるイメージです。

```app/views/show.html.haml
= link_to(event_attendances_path(@event), method: :post, class: 'btn') do
  = t('nav.attendaces.create')
```



この時、ログインしてない状態でこの参加ボタンをクリックすると、`/events/:id/attendances` に `POST` するわけですが、ログインしていないので`new_user_session_path` にリダイレクトされますね。

んで、ログインすると、`root_path` に戻ってしまうのがだるい。おれの参加したかったイベントよ、、、どこへ。本当なら、`/events/:id` に戻りたいですよねーということで、そんな時どうするか。（前置きの長さよ）

## 磯野〜ソース読もうぜ〜

deviseのソースを読みましょう。

https://github.com/plataformatec/devise/blob/10c9a492ab27f48d66f50df7f1e7f5e8c68f2b0f/lib/devise/failure_app.rb#L183

```
session["#{scope}_return_to"] = attempted_path if request.get? && !http_auth?
```

なるほどね、っと。`session[:user_return_to]` に、`/events/:id` を入れておけばうまくいきそうです。

## イベント参加ボタンクリック後に、イベントページに戻る

参加処理の`before_action` で `session[:user_return_to]` に、`/events/:id` を入れる処理をかきます。

```app/controllers/attendances_controller.rb
class AttendancesController < ApplicationController
  before_action :set_event
  before_action :store_event_url # 追加！
  before_action :authenticate_user! # rails3 以下なら before_filter

  def create
    # イベント参加処理
  end

  def destroy
    # イベント参加キャンセル処理
  end

  private
  def set_event
    @event = Event.find(params[:event_id])
  end
  
  # 追加！
  def store_event_url
    session[:user_return_to] = event_path(@event) unless user_signed_in?
  end
end
```

はい。こんな感じです。deviseの使っているsessionの中身を書き換えるのは怖いよ〜という方は好きにして下さい。
railroadyでrailsのモデルを可視化する

## 概要
railroadyとgraphvisを利用して,railsのモデルからデータベーススキーマの状態とモデルに設定したリレーションを可視化することができます.

##インストール
graphvisのインストールにはbrewを利用します. 後でいろいろ試せるようにライブラリも一緒にインストールします.

```shell-session
brew install graphviz  --with-gts
```

railroadyのインストール

```shell-session
gem i railroady
```

##使い方
railsのプロジェクトディレクトリ内でコマンドを実行.

```shell-session
#基本的な使い方
railroady -M | circo -Tpng > rody.png
railroady -M | neato -Tpng > rody.png

#モデルに解析を加える
railroady -M | tred | circo -Tpng > rody.png
```

## スクリプト化

```bash
#! /bin/sh
railroady -M | circo -Tpng > ~/${1:-rody}.png
open ~/${1:-rody}.png
```
staticなZend\Validatorの利用

```php:
<?php
use Zend\Validator\StaticValidator as Validator;

Validator::execute('http://example.co.j', 'uri'); // true
Validator::execute('../image/sample.jpg', 'uri', ['allowRelative' => true]); //true
Validator::execute('../image/sample.jpg', 'uri', ['allowRelative' => false]); //false
Validator::execute('http://example.co.jp', 'uri', ['uriHandler' => 'Zend\Uri\Mailto']); //false
```

executeへの第3引数は、各ヴァリデータのオプションを指定します
AndroidのSurfaceViewの基礎

## 簡単に
* アニメーションとかゲームみたいに描画のパフォーマンスが必要なもの、凝ったグラフィックを描画したい場合はSurfaceView使え。
* メインスレッド以外でも描画可能だけど、スレッド間での排他処理とかは気をつけてね。
* Surfaceへのアクセスは`SurfaceHolder`インターフェイス経由で行うよ。

## 普通のViewとSurfaceViewの違い

| - | 普通のView | SurfaceView |
|:--|:--|:--|
| 描画処理 | メインスレッドのみ | バックグラウンドスレッドでも可能 |
| 使い道 | 静的なコンテンツ(意味深)に最適 | 常に更新されるような描画内容に最適 |

## 疑問
### Surfaceってなに? 
画面に描画される内容の生のバッファ(のハンドル)

### SurfaceHolderは?
`Surface`のピクセルを実際にいじったり、`Surface`の変化を監視する人のためのインターフェイス。`SurfaceView`には`getHolder()`メソッドが用意されていて、その`SurfaceView`のホルダーのインスタンスを取得できる。

```java
  public MySurfaceView(Context context) {
    super(context);
    SurfaceHolder holder = getHolder(); // でもこのタイミングではまだSurfaceの準備ができてない
  }
```

## その前に、知っておかなければ行けないAndroidのグラフィック描画のための4要素
### ビットマップ
実際にスクリーンに転送される最終的なピクセルの配列。

### キャンバス(Canvas)
「ここに青い四角を描く」「ここに白い丸を描く」というような命令をビットマップの形にするための機構。

### プリミティブ
四角(Rect)とか文字列(Text)とかのこと。

### ペイント(Paint)
色とかスタイルとか、プリミティブを描画する時の属性的な情報。

## SurfaceViewの基本的な使い方
バックグラウンドスレッドで描画処理できるのが肝だけど、基本を理解するにはとりあえずメインスレッドで一回だけ描画するような使い方をしてみるのがわかりやすい。

基本的には、`SurfaceView`を継承したサブクラスを用意して、その中で独自の描画の処理を書いてく。

```java
public class MySurfaceView extends SurfaceView
```

`SurfaceView`は自身の`Surface`の状態変化についても監視する必要がある(途中でサイズが変わったら、それに応じて描画内容も調整したりとか)ので、実際には`SurfaceHolder`からのコールバックを受け取るための`SurfaceHolder.Callback`をimplementすることになる。

```java
public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback
```

`SurfaceView`のコンストラクタの中で、ホルダーのコールバックに自身をセットしておけば、`Surface`の準備ができたタイミング(実際に描画できるようになったタイミング)等でコールバックが呼ばれるようになる。

```java
public MySurfaceView(Context context) {
	super(context);
	getHolder().addCallback(this);
}
```

`SurfaceHolder.Callback`で実装しなければいけないメソッドは下記の三つ。各メソッドが呼ばれるタイミングは名前の通り、`Surface`が作られた時/変化があった時/破棄された時。

```java
public void surfaceCreated(SurfaceHolder holder) {}
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {}
public void surfaceDestroyed(SurfaceHolder holder) {}
```

`surfaceCreated`あるいは`surfaceChanged`が呼ばれたタイミングでは、実際に`Surface`に描画する準備ができている。都合良く引数で`SurfaceHolder`のインスタンスまで渡してくれている。

```java
public void surfaceCreated(SurfaceHolder holder) {
    Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
    paint.setColor(Color.BLUE);
    paint.setStyle(Style.FILL);
		
    Canvas canvas = holder.lockCanvas();
    canvas.drawColor(Color.BLACK);
    canvas.drawCircle(100, 200, 50, paint);
    holder.unlockCanvasAndPost(canvas);
}
// https://www.linux.com/learn/tutorials/707993-how-to-draw-2d-object-in-android-with-a-canvas の内容を少し改変して使用
```

`SurfaceHolder`からは`Canvas`を取得できるので、そこに対して描画命令を出していく。`lockCanvas()`と`unlockCanvasAndPost()`はマルチスレッド用の排他処理だけど、Canvasの取得と描画内容の反映のために必然的にこのペアを使うことになるので、強く意識しなくても大丈夫かも。

## 注意事項・おまけ
* SurfaceViewの上に普通のUI要素(ボタンとか)を重ねてもOKだけど、パフォーマンスは悪化するよ。
* OpenGLで描画したい場合は`GLSurfaceView`というサブクラスがあるよ。

## 参考
* http://developer.android.com/reference/android/view/SurfaceView.html
* http://developer.android.com/reference/android/view/Surface.html
* http://developer.android.com/reference/android/view/SurfaceHolder.html
* http://developer.android.com/reference/android/graphics/Canvas.html
* https://www.linux.com/learn/tutorials/707993-how-to-draw-2d-object-in-android-with-a-canvas
spoonx/sxbootstrap を用いた ZF2 でのTwitter Bootstrapの利用

Twitter Bootstrapを利用するための、zf2モジュールはいくつかありますが、
http://modules.zendframework.com/?query=Twitter

ここでは、rwoverdijk/assetmanager (kriswallsmith/assetic を内部的に利用) の依存を前提に作られた、spoonx/sxbootstrapの導入について紹介します。
https://github.com/SpoonX/SxBootstrap
（基本的にはREAME.mdでこと足りるでしょう）

ZendSkeletonApplicationの構成（Zend\Mvc\Application::init()でのアプリケーション）を前提とします。

変更箇所は以下のとおり。

- composer.json

```json:
{
    "require":{
        "zendframework/zendframework": ">=2.2.0",
        "rwoverdijk/assetmanager": "1.*",
        "spoonx/sxbootstrap": "1.*",
    }
}
````

 - config/application.config.php

```php
<?php
return array(
    'modules' => array(
        'Application',
        'AssetManager',
        'SxBootstrap',
     ),
```

 - module/Application/view/layout/layout.phtml

```php
<?php echo $this->doctype(); ?>

<html lang="en">
    <head>
        <meta charset="utf-8">
        <?php $this->sxBootstrap();?>
```

headタグ内では他に、すくなくともjqueryの読み込みは行いましょう。よって上記の続きは、

```php
    <?php echo $this->headScript()->prependFile($this->basePath() . '/js/jquery.min.js');?>
</head>
```

config/autoload内に設定情報を記述します。以下はApcをキャッシュに使う場合のサンプルです。

 - config/autoload/bootstrap.local.php

```php
<?php
return array(
    'twitter_bootstrap' => array(
        'variables'             => array(),
        'included_components'   => array(),
        'excluded_components'   => array(),
        'included_plugins'      => array(),
        'excluded_plugins'      => array(),
        'plugin_alias'          => 'js/bootstrap.js',
        'filter'                => array(
            'node_bin'      => '/usr/bin/node',
            'node_paths'    => array(),
        ),
    ),
    'asset_manager' => array(
        'caching' => array(
            'js/bootstrap.js' => array(
                'cache' => 'Apc',
            ),
            'css/bootstrap.css' => array(
                'cache' => 'Apc',
            ),
        ),
    ),
);
```

再度ですが配置する際に、public配下のcss,jsそのものと phpで返却するassetのレスポンスのルーティングに注意します。

### 動作確認

viewファイル *.phtmlにて 以下のようなヘルパーメソッドの呼び出しが行えれば確認できるはずです。

```php:
<?php echo $this->sxbAlert("alert");?>
<h1>It works!</h1>
<?php echo $this->sxbButton('Click me!')->toggle('button'); ;?>
<?php echo $this->sxbBadge('This is a badge', 'badge-info');?>
<?php echo $this->sxbForm($this->form); ?>
```

![Screenshot_from_2013-07-24 22:52:35.png](https://qiita-image-store.s3.amazonaws.com/0/7949/8ad99b6e-6028-2a43-dfa5-07db2084af0b.png)
Padrinoをオススメする6つの理由

Railsなんて勉強しない方がいいよ！的なエントリが話題になっているのを見かけたので、

**そうだよねそれより[Padrino](http://www.padrinorb.com/)だよね！**

と曲解してみました。

というわけで、Padrinoの良いところを思いつくまま記してみました。

# Padrinoの良いところ

## 要はSinatraだ

> Padrino is a ruby framework built upon the excellent Sinatra web library.

[Guides Home - Padrino Ruby Web Framework](http://www.padrinorb.com/guides)

ということで[Sinatra](http://www.sinatrarb.com/)を使いつつ、各種O/Rマッパーやテンプレートエンジンなどと簡単に連携しながら開発が出来ます。

中身はSinatraなのでアクションもこんな感じで簡単に作れます。

```rb:
get '/users/:id' do
end
```

これだとたくさんURLを作りたいときはごちゃごちゃになっちゃうよねということで

```rb:users.rb
## /users/:id と同じ
MyApp::App.controllers :users do
  get index, with: :id do
  end
end
```
のようにURLをPadrinoのコントローラに作成してもらうようにも出来ます。

routes.rbのような簡単なような難しいようなものを書かないで済むのが僕的にかなりでかいです。


URLの作り方は以前にまとめたので良かったらどうぞ。
[PadrinoでRESTfulなURLを作ろう](http://qiita.com/kakkunpakkun/items/c685cf558d79a893089e)

## generatorがある
[豊富なgenerator](http://www.padrinorb.com/guides/generators)があるのでプロジェクトを作成してコントローラーやモデルを追加してすぐに「キレイな形で」開発しやすい

```rb:
# プロジェクトの作成
padrino g project your_project -d activerecord -t rspec -e slim

# modelを共有しながらプロジェクト内にモバイル向けのアプリケーションを作ることも出来ます
padrino g application mobile

# コントローラを作成
padrino g controller users

# モデルを作成
padrino g model user
```

プラグインの作成もgeneratorから行えます。


## spec, minitestなどテストがすぐ書ける

rspecを使うようにプロジェクトをgenerateしておけば、rspecの設定をしておいてくれるのですぐにとりあえずrspecを使って開発することが出来ます。

generatorを使ってcontrollerやmodelを作成すると同時にspecなどテストファイルも作成してくれます。
``padrino rake spec``と叩けばspecを実行出来ます。



## ActiveRecordなどRailsのコンポーネントが使える

当然ですが、ActiveRecordやActiveSupportのような便利なものはrequireして使えるので結構Railsを使ってるのと変わらない使い勝手で開発ができます。
modelsディレクトリ内にあるmodelはプロジェクト内のどのapplicationからでもアクセス出来るのがうれしいです。

その他slim, haml, rspec, sequel, datamapper, mongoid, sass, lessなど有名なコンポーネントともすぐ連携出来るようになっています。



## consoleがある

これは僕としてはかなり大事です。
padrino consoleを叩けばrails consoleと同じように作っているプロジェクトのmodelを叩いて動きを確かめることが簡単に出来ます。
他にもデータ処理をmodelに書いてあるロジックを通して行うことが出来るので、Web画面を準備したりするのは大変だけどちょっとデータ変更をしたいという時にすごく便利です。
これがないとウチの仕事は回らなくなるかも。あんまり頼るのも良くなけどね :)


## Rails風にキレイなディレクトリ構成がすぐに使える

Railsはキレイなディレクトリ構成がいいっすよね。それも取り込んでます。
generatorで作ってくれたりするのでlib, log, spec, models, configなど分かりやすい名前で期待した通りの役割を果たしてくれます。
Railsっぽい構成でRailsやっていればすぐ分かる気がする。


# Padrinoのよくないところ

## 結局Rails使えばよくない？と思えなくもない

見出しの通り。
でも、やっぱりSinatraの軽快さを活かしつつキレイな構成でconsoleを使いつつ開発出来るのは素晴らしいと思うなー。


# というわけで

Railsの勉強はしないよりした方がいいんじゃないかと思うけど、Padrinoもとてもいいですよと思って書きました。
メールサーバをチューン

※大幅に改訂しました

## 想定環境

パッケージ管理でインストールできるソフト

* Postfix2.x
* Dovecot2.x


#基本設定
送受信がSMTP/POPでできるレベル

```main.cf
myhostname = hostname.doma.in
mydomain = doma.in
myorigin = $myhostname
mydestination = $myhostname, localhost.$mydomain, $mydomain
relay_domains = $mydestination
home_mailbox = Maildir/
smtpd_banner = $myhostname ESMTP
html_directory = no
```

```/etc/dovecot/10-mail.conf
mail_location = maildir:~/Maildir
```

基本的な設定。Maildir形式あたりはデファクトスタンダード

#TLSの導入
送信サーバは993、受信サーバは995番で送受信できるようにする。ファイアーウォールなどで該当ポートをブロックしていた場合、解除する。
証明書が必要になるので用意する。

```main.cf
smtpd_use_tls = yes
smtpd_tls_cert_file = /etc/httpd/conf/ssl.crt/server.crt
smtpd_tls_key_file  = /etc/httpd/conf/ssl.key/server.key
```

```master.cf
smtps     inet  n       -       n       -       -       smtpd
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes

submission inet n       -       n       -       -       smtpd
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
```

```dovecot.conf
protocols = pop3
ssl = yes
```

```/etc/dovecot/10-master.conf
service pop3-login {
  inet_listener pop3 {
    port = 110
  }
  inet_listener pop3s {
    port = 995
    ssl = yes
  }
}
```

```/etc/dovecot/10-ssl.conf
ssl_cert = </etc/httpd/conf/ssl.crt/server.crt
ssl_key  = </etc/httpd/conf/ssl.key/server.key
```

#SMTP-SASL認証
SMTP送信時に認証されたユーザ意外は弾く。下記設定では認証ユーザ情報をDBファイルに外置きするsasldb形式とする。（POPは普通にPam認証なので俺は注意すること。）

```main.cf
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
smtpd_recipient_restrictions =
    permit_mynetworks,
    permit_sasl_authenticated,
    reject_unauth_destination
smtpd_sasl_local_domain = $myhostname
broken_sasl_auth_clients = yes
```

```/etc/sasl2/smtpd.conf
pwcheck_method: auxprop
mech_list: cram-md5 digest-md5 plain login
```

###SASLDB操作
sasldblistusers2 ユーザ一覧を見る。
saslpasswd2 ユーザの追加・削除
圧縮を意識したJavaScript

javascriptのソースコードを圧縮、最適化した場合はどんな感じになるの？
圧縮、最適化を意識したコードって？
っていう話です。

簡単にできる事として、
・ローカル変数に置き換える
ことが挙げられます。

#圧縮・最適化ツールの代表例
Closer CompilerやYUI Compressorの二つが挙げられます。


#圧縮・最適化の例
##例１

```javascript:
function show() {
  console.log('a');
}
show();

// minify
function show(){console.log("a")}show();
```

これは普通ですね。
ただこれに対して即時関数を挟むと例２のようになります
##例２

```javascript:
(function() {
  function show() {
    console.log('a');
  }
  show();
})();

// minify
(function(){console.log("a")})();
```
minifyを活かすにはローカルスコープの活用が大事です。
ただ基本的にグローバル変数はminify以前に利用しない方がいいですね。

##例３

```javascript:
(function() {
  var number = 5;
  console.log(number++);
  console.log(number++);
  console.log(number++);
})();

// minify
(function(){var a=5;console.log(a++);console.log(a++);console.log(a++)})();
```

ローカル変数は変数名が大幅に簡略化されます。
##例4
ローカルスコープ内でオブジェクトのプロパティを使用する際は、
下記のようにローカル変数に代入し直してからすると、
minifyを意識した実装ができます。

```javascript:
function test(object) {
  console.log(object.number);
  console.log(object.number);
}

test({
  number: 5
});

// minify
function test(a){console.log(a.number);console.log(a.number)}test({number:5});
```

```javascript:

function test(object) {
  var number = object.number;
  console.log(number);
  console.log(number);
}

test({
  number: 5
});

// minify
function test(a){a=a.number;console.log(a);console.log(a)}test({number:5});
```

#ブラウザでminifyお試し
下記でブラウザから実際にminifyを試す事ができます。
[closure-compiler](http://closure-compiler.appspot.com/home)

# 外部アカウント

技術情報のみつぶやくアカウント作成しました。JavaScriptは最新情報も追っていきます。
[Twitterはこちら]
(https://twitter.com/takeharumikami)
[Feedlyのフォローはこちら]
(http://cloud.feedly.com/#subscription%2Ffeed%2Fhttp%3A%2F%2Fqiita.com%2Ftakeharu%2Ffeed)

# おすすめの記事

入門者がつまづく、thisの挙動を4種類に分けて簡単に学ぶならこれ。Apply, callの挙動までわかる。
[JavaScriptの「this」は「4種類」？」](http://qiita.com/takeharu/items/9935ce476a17d6258e27)

JavaScriptはオブジェクト指向？プロトタイプベースのオブジェクト指向を学ぶなら。
[JavaScriptのプロトタイプからオブジェクト指向を学ぶ](http://qiita.com/takeharu/items/809114f943208aaf55b3)

関数型プログラミングを強力に後押しするライブラリ、Underscore.jsとlodashとは。
[JavaScriptで関数型プログラミングを強力に後押しするUnderscore.jsのおすすめメソッド12選(lodashもあるよ)](http://qiita.com/takeharu/items/7d4ead780710c627172e)
AWSにrailsサーバーを構築する方法


AWSのAmazon Linux AMI にrailsサーバーをたてて外部に公開する方法。
今回はrvmを使わない。

[前提条件]
AWSのインスタンスを確保している。
SecurityGroupsの設定が完了している。

##yumのアップデート
```
sudo yum update
```

##必要なパッケージのインストール
```
sudo yum -y install gcc
sudo yum -y install gcc-c++
sudo yum -y install zlib-devel
sudo yum -y install httpd-devel
sudo yum -y install curl-devel
sudo yum -y install sqlite-devel
```

##ruby1.9.3のインストール
```
mkdir src
cd src
wget ftp://core.ring.gr.jp/pub/lang/ruby/1.9/ruby-1.9.3-p392.tar.gz
tar xzf  ruby-1.9.3-p392.tar.gz

cd ruby-1.9.3-p392
./configure
make
make test
sudo su - root
make install

ruby -v
```

AWSに元々インストールされているrubyは1.8.7。
homeのsrcとか適当にディレクトリ作ってダウンロードしたファイルはそこに入れる。

##railsインストール
```
gem install bundler
gem install rdoc
gem install rails
rails -v
```

※sudo gemができないのでrootユーザーに変更して行う。


##sqlliteインストール
```
gem install sqlite3
```

##Unicornインストール
```
gem install unicorn
```

##nginxインストール
```
sudo yum -y install nginx
sudo /etc/init.d/nginx start
```

nginx起動後にアクセスしてnginxのページが出れば成功
http://XX.XXX.XXX.XXX/

##railsアプリ作成
```
mkdir app
cd app 
rails new myapp
```
myappなど適当なアプリを作成。

##JavaScriptを有効にする
```
cd myapp
vi Gemfile
gem 'therubyracer', :platforms => :rubyをコメントイン
bundle install
```

##railsサーバー起動
```
rails server -d
curl -I localhost:3000
```

curlで起動の確認が可能。
ポートを指定して画面にアクセスすればrailsアプリを画面で確認することが可能
http://XX.XXX.XXX.XXX:3000/ 

##niginxとunicornの設定
unicorn起動スクリプト作成。

```
cd myapp
vi config/unicorn.conf
```

```unicorn.conf
worker_processes 2
listen '/tmp/unicorn.sock'
stderr_path File.expand_path('unicorn.log', File.dirname(__FILE__) + '/../log')
stdout_path File.expand_path('unicorn.log', File.dirname(__FILE__) + '/../log')
preload_app true
```

```
sudo cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bk
sudo vi /etc/nginx/nginx.conf
```

nginxの設定を変更。
ファイルは全文書き換える。

```nginx.conf
worker_processes  1;

events {
    worker_connections  1024;
}

http {
    upstream unicornapp {
        server unix:/tmp/unicorn.sock;
    }

    server {
        listen       80;
        server_name  localhost;

        location / {
            proxy_pass http://unicornapp;
        }
    }
}
```

```
sudo /etc/init.d/nginx restart
```

##unicorn起動
```
unicorn -c config/unicorn.conf -D
```

これでrailsのアプリが公開される。
http://XX.XXX.XXX.XXX
S3の特定バケットだけを"AWS Consoleを使って"操作できるIAMユーザを作る

適当にIAMユーザを作って以下のようなポリシーを設定すれば良い。

```json:
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "s3:*",
      "Resource": [
        "arn:aws:s3:::example-bucket",
        "arn:aws:s3:::example-bucket/*"
      ]
    },
    {
      "Effect": "Allow",
      "Action": "s3:ListAllMyBuckets",
      "Resource": "*"
    }
  ]
}
```

Statementを２つ設定してやるのがポイント。

- １つ目のStatementは example-bucket に対するフル権限を与えている。Resourcesが`/*`付きのバケット名だけだとバケットのルートディレクトリで一覧取得できないので、バケット名そのものにも権限を与えている。
- 2つ目のStatementはバケット一覧を取得する権限を与えている。これはAWS ConsoleからS3の操作をする際に必要です(単にREST APIでS3にアクセスするだけなら不要)。example-bucket以外のバケット名も見えてしまうのは諦めるしか無い。バケット名は見えても操作は一切できないので問題無いと割り切る。

AWSコンソールを使う必要がなければ１つ目のStatementだけで十分です。
Xamarin Studio でコードテンプレートを使う

Visual Studio や Eclipse とか、IDE ならだいたい備えているコードテンプレート、呼び名はそれぞれ違いますが、``for`` ってタイプすると ``for (object o : items) {  }`` 的なコードのひな形を生成してくれる機能の事です。

Xamarin Studio にも当然ありまして、その使い方を説明します。

## きっかけ

MvvmCross っていうフレームワークの Tutorial 動画で Visual Studio を使っているんですが、その中で多用されてるので、真似してみたくなりました。

例えばこれ

* [N=0 : A first MvvmCross Application (N+1 days of MvvmCross) | N+1 days of MvvmCross](https://www.youtube.com/watch?v=_DHDMNB_IeY&list=PLR6WI6W1JdeYSXLbm58jwAKYT7RQR31-W&feature=player_detailpage&t=178)

## 手順

### 1. Xamarin Studio の Preference を開く

システムメニュー → Preference → テキストエディタ → コード テンプレート です。

![img1](http://blog.amay077.net/assets/images/posts/using_code_template_in_xamarin_studio_01.png)

###  2. コードテンプレートを作成する

追加 で "新しいテンプレート" の画面を開き、

![img2](http://blog.amay077.net/assets/images/posts/using_code_template_in_xamarin_studio_02.png)

のように設定します。

* ショートカット : pmvx
* グループ : C#
* 説明 : 適当に
* Mime : text/x-csharp
* [展開されるテンプレート] にチェックを入れる

テンプレート テキスト は以下の通り

```c#:
private $type$ $property$;
public $type$ $Property$
{ 
	get { return $property$; }
	set { $property$ = value; RaisePropertyChanged(() => $Property$); }
}
```

``$type$``, ``$property$``, ``$Property$`` という3つの変数を使っています。画面右端にあるドロップダウンで、各変数が選択できるので、それぞれ Default で既定値を設定します。

ここでは、以下のようにしました。

* type : object
* property : _property
* Property : MyProperty

OK を押して保存します。

### 3.  使ってみる

コードエディタで ``pmvx`` とタイプすると、

![img2](http://blog.amay077.net/assets/images/posts/using_code_template_in_xamarin_studio_03.png)

となり、タブを2回ほど押すと、

![img2](http://blog.amay077.net/assets/images/posts/using_code_template_in_xamarin_studio_04.png)

と、テンプレートコードが挿入されます。
あとは、ハイライトされている部分を変更すると、テンプレート内も連動して変更されます。

これでコード入力が楽になりました。

コードテンプレートのインポート／エクスポートや、Visual Studio との互換性なども調べてみたいですね。
Twitterでmax_idを指定してリクエストする際の注意




ページングではなく`max_id`と`since_id`を使ったタイムライン操作の仕組みはここ読むとして。
[Working with Timelines](https://dev.twitter.com/docs/working-with-timelines)


直近のリクエストで一番古いツイートの`max_id`を指定してさらに古いツイートをリクエストする際、`max_id`を1減らす必用があるのだけど、Javascriptだと「[53bit を超える整数は正しくパースできない](http://blog.fkoji.com/2010/10201250.html)」ので、一手間必要。

便利な関数がここにあった。
[Decreasing 64-bit Tweet ID in JavaScript](http://webapplog.com/tag/twitter-api-max_id/)


```
function decStrNum (n) 
{ 
    n = n.toString(); 
    var result=n; 
    var i=n.length-1; 
    while (i>-1) 
    { 
        if (n[i]==="0") 
        { 
            result=result.substring(0,i)+"9"+result.substring(i+1); 
            i --; 
        } 
        
        else 
        { 
            result=result.substring(0,i)+(parseInt(n[i],10)-1).toString()+result.substring(i+1); 
            return result; 
        } 
    } 
    return result; 
}
```

TwitterのREST API の開発用にこれ便利。
[twitSandbox - Twitter API v1.1検証用のWebアプリケーション](http://twitsandbox.com)
[Exploring the Twitter API | Twitter Developers](https://dev.twitter.com/console)
PIL（Python Imaging Library）で、点を描画するサンプル。

Python 2.7で実行。まだPILはPython 3系には対応していないもよう。

※自分の学習用のメモです。

## なにをやりたいのか

CGの基本はふたつあります。

ひとつは、任意の座標に点を打つこと。

もうひとつは、任意の座標の点を読み込むこと。

このふたつの機能があれば、理論上、どんな絵もかける……らしいです。

ここでは前者の点を描画してみます。

後者については後ほど（こちら→）[PIL（Python Imaging Library）で、画像をセピア調に変換する - Qiita](http://qiita.com/suto3/items/7c3f2d392ad60977d49e "PIL（Python Imaging Library）で、画像をセピア調に変換する - Qiita")

##実行結果

はじめに結果から。こんな風に点を打ちます。

![image-set-flower.png](https://qiita-image-store.s3.amazonaws.com/0/26107/327f8816-a823-5e04-fd7d-0c9e4c704079.png)

## スクリプト

[PIL（Python Imaging Library）を使って画像ファイルを作成する。 - Qiita](http://qiita.com/suto3/items/5181b4a3b9ebc206f579 "PIL（Python Imaging Library）を使って画像ファイルを作成する。 - Qiita")

を元に以下のように書きました。

```py:image-set-flower.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
'''
点を打つサンプル
'''

import Image
import ImageDraw

def drawing(img, gap):
    """
    描画（ファイルに書く画像データを編集する）
    点を打つ
    """
    x,y = img.size
    draw = ImageDraw.Draw(img)
    for i in range(0,x,gap):
        for j in range(0,y,gap):
            # ↓こんなパターンを描く
            #■■■□
            #■□■□
            #■■■□
            #□□□□
            draw.point((i  , j  ),(0xff,0x00,0x00)) #red
            draw.point((i+1, j  ),(0xff,0x00,0x00)) #red
            draw.point((i+2, j  ),(0xff,0x00,0x00)) #red
            draw.point((i+3, j  ),(0x00,0xff,0x00)) #green
            
            draw.point((i  , j+1),(0xff,0x00,0x00)) #red
            draw.point((i+1, j+1),(0xff,0xff,0x00)) #yellow
            draw.point((i+2, j+1),(0xff,0x00,0x00)) #red
            draw.point((i+3, j+1),(0x00,0xff,0x00)) #green
            
            draw.point((i  , j+2),(0xff,0x00,0x00)) #red
            draw.point((i+1, j+2),(0xff,0x00,0x00)) #red
            draw.point((i+2, j+2),(0xff,0x00,0x00)) #red
            draw.point((i+3, j+2),(0x00,0xff,0x00)) #green

            draw.point((i  , j+3),(0x00,0xff,0x00)) #green
            draw.point((i+1, j+3),(0x00,0xff,0x00)) #green
            draw.point((i+2, j+3),(0x00,0xff,0x00)) #green
            draw.point((i+3, j+3),(0x00,0xff,0x00)) #green

    return img

def make_image(screen, bgcolor, filename):
    """
    画像ファイルを作成
    """
    img = Image.new('RGB', screen, bgcolor)

    # 間隔（5～32くらい）
    gap = 8

    img = drawing(img, gap)
    img.save(filename)

if __name__ == '__main__':
    # 画像のサイズ
    screen = (800,600)

    # 画像の背景色（RGB）
    bgcolor=(0xdd,0xdd,0xdd)

    # 保存するファイル名（ファイル形式は、拡張子から自動的に判別する）
    filename = "image-set-flower.png"

    make_image(screen, bgcolor, filename)

#EOF


```
W3C UnicornからのアクセスはOKにする


以下の設定で、W3C Unicornからの検証は可能だが、ブラウザで表示する際はベーシック認証が必要になる

```
<Location /HOGE>
  Satisfy Any
  AuthType Basic
  AuthName "Basic Auth"
  AuthUserFile /etc/httpd/conf.d/htpasswd
  Require valid-user

  SetEnvIf User-Agent "W3C_Unicorn" w3c-ok
  SetEnvIf User-Agent "W3C_CSS_Validator" w3c-ok
  SetEnvIf User-Agent "FeedValidator" w3c-ok
  SetEnvIf User-Agent "W3C_I18n-Checker" w3c-ok
  SetEnvIf User-Agent "W3C_Validator" w3c-ok
  Order Deny,Allow
  Deny from all
  Allow from env=w3c-ok
 </Location>
```
Windowsのエクスプローラのアドレスバーからプログラムを起動する

Windowsのエクスプローラのアドレスバーにcmdとを入力するとコマンドプロンプトが起動し、
powershellと入力するとpowershellが起動する。
それ以外にも、環境変数pathに登録した先にあるプログラムも起動できる。
例えば、Rubyをインストールしている場合、irbをアドレスバーに入力し、Enterボタンを押すと
irbが起動される。
今すぐ辞めて欲しい、「高級言語勉強してます」

元ネタ
今すぐ辞めて欲しい、「Ruby on Rails勉強してます」「CakePHP勉強してます」
http://blog.sumyapp.com/2013/07/no-recommend-rails/

なぜかみんな「シーってイケてる技術だよね」「シーっだったらこんなこともいとも簡単にできちゃうんだよね」みたいな印象を持っている。もちろん、それは間違いではない。フォートランは早い。ライブラリもたくさんある。弾道計算なんて昔は数人月かけて作ったものだが、いまはmath.hなんて使えば、１人日で出来てしまうほどのものだ。

自動車のABS(アンチロック・ブレーキ・システム)なんかとは全く違う。ABSはあくまでブレーキがロックしてしまう事象を発生しないようにアシストしてくれるシステムである。



Hello worldと出力しようとした場合下記のようなコードが必要になる。

```helloworld.c

#include<stdio.h>
int main(){printf("hello world!");}
```

これをコンパイルすると、

```helloworld.s
	.file	"hellowrld.cc"
	.section	.rodata
.LC0:
	.string	"hello world!"
	.text
	.align 2
.globl main
	.type	main, @function
main:
.LFB2:
	pushq	%rbp
.LCFI0:
	movq	%rsp, %rbp
.LCFI1:
	movl	$.LC0, %edi
	movl	$0, %eax
	call	printf
	movl	$0, %eax
	leave
	ret
.LFE2:
	.size	main, .-main
.globl __gxx_personality_v0
	.section	.eh_frame,"a",@progbits
.Lframe1:
	.long	.LECIE1-.LSCIE1
.LSCIE1:
	.long	0x0
	.byte	0x1
	.string	"zPR"
	.uleb128 0x1
	.sleb128 -8
	.byte	0x10
	.uleb128 0x6
	.byte	0x3
	.long	__gxx_personality_v0
	.byte	0x3
	.byte	0xc
	.uleb128 0x7
	.uleb128 0x8
	.byte	0x90
	.uleb128 0x1
	.align 8
.LECIE1:
.LSFDE1:
	.long	.LEFDE1-.LASFDE1
.LASFDE1:
	.long	.LASFDE1-.Lframe1
	.long	.LFB2
	.long	.LFE2-.LFB2
	.uleb128 0x0
	.byte	0x4
	.long	.LCFI0-.LFB2
	.byte	0xe
	.uleb128 0x10
	.byte	0x86
	.uleb128 0x2
	.byte	0x4
	.long	.LCFI1-.LCFI0
	.byte	0xd
	.uleb128 0x6
	.align 8
.LEFDE1:
	.ident	"GCC: (GNU) 4.1.2 20080704 (Red Hat 4.1.2-54)"
	.section	.note.GNU-stack,"",@progbits
```

これは尋常ではない。まるで核ミサイルの発射スイッチのようである。
核の発射スイッチはむしろまだ単純だ。押したら破裂する。結果が明白である。

````helloworld2.s
.text
	.global	_start
_start:
	movl	$len,　	%edx
	movl	$msg, 	%ecx
	movl    $1, 	%ebx
	movl    $4, 	%eax
	int	　　$0x80
	
	movl	　$0, 	%ebx
	movl    $1,	%eax
	int	　$0x80
.data
msg:
	.ascii "Hello World\n"
	len = . - msg
````
こう書けばすむ話である

movl call leave
どれもプログラマにとっては当たり前のキーワードだが、%eaxって何？って人がほとんどなのではないだろうか？

一体、「高級言語勉強してます」といった人の内どれだけが、この自動生成された各種のコードを理解しているのだろうか？
「高効率」「最先端」みたいなキーワードに踊らされている初心者が多すぎるのではないだろうか？

K&Rの頃はまだよかった。まだその程度の機能量ですんでいた。
C99なんて狂気の沙汰だ

自動化は「既にルーチン化できるようになったもの」に対して行うべきだ。未知のものを自動化するのは狂気だ。

この記事にぐさっときた人、プログラミング初心者にとっておすすめしたいのはこの書籍だ。

[CPUの創り方](http://www.amazon.co.jp/CPU%E3%81%AE%E5%89%B5%E3%82%8A%E3%81%8B%E3%81%9F-%E6%B8%A1%E6%B3%A2-%E9%83%81/dp/4839909865 "CPUの創り方")

というわけで、本記事のまとめ。
1. つけびして 
2. 煙り喜ぶ
3. 田舎者
Emacsで編集中のバッファのファイル名を変更する

## やりたいこと
Emacsで編集してるバッファのファイル名とバッファ名を変更したい。
Dired はよくわからないので使いたくない。

## 解決策

```10-file.el
;; source: http://steve.yegge.googlepages.com/my-dot-emacs-file
(defun rename-file-and-buffer (new-name)
  "Renames both current buffer and file it's visiting to NEW-NAME."
  (interactive "sNew name: ")
  (let ((name (buffer-name))
        (filename (buffer-file-name)))
    (if (not filename)
        (message "Buffer '%s' is not visiting a file!" name)
      (if (get-buffer new-name)
          (message "A buffer named '%s' already exists!" new-name)
        (progn
          (rename-file name new-name 1)
          (rename-buffer new-name)
          (set-visited-file-name new-name)
          (set-buffer-modified-p nil))))))
```
を使う。

## 情報ソース
http://stackoverflow.com/questions/384284/can-i-rename-an-open-file-in-emacs
retina対応のsprite画像をbackground-imageに表示するのに便利なcompassの記述


スマホサイト用に、compassでsprite画像を生成して、background-imageに表示させるmixinは使ってたのですが、
sprite画像を複数使う時どうしよってなったので、
調べてみた。

下記のサイトを参考に、ちょっと改良しました。

http://webamb.com/compass/890.html

参考のサイトは、それぞれのクラスでサイズを指定するのが、ちょっとめんどくさい。
なので、sprite画像を生成する段階で、spriteの最大横幅を変数に入れて、mixinの引数に渡しています。
まあ、あとで画像追加して横幅が変わったら、手動で変えなきゃならないのですが…。


### mixinを作る
```mixin
@mixin sprite-bg-retina($name, $sprites, $spriteSize) {
     background-image: $sprites;
     background-repeat: no-repeat;
     display: block;
     height: image-height(sprite-file($sprites, $name)) / 2;
     width: image-width(sprite-file($sprites, $name)) / 2;
     $ypos: round(nth(sprite-position($sprites, $name), 2) / 2);
     background-position: 0 $ypos;
     @include background-size(spriteSize auto);
}
```

### sprite画像を作る

```scss
/* sprite01 */
$spriteFiles01: sprite-map("icon01/*.png");
$spriteURL01: sprite-url($sprites-icon01);
$spriteSIZE01: 200px; //sprite画像の最大横幅の半分

/* sptrite02 */
$spriteFiles02: sprite-map("detail/UI/*.png");
$spriteURL02: sprite-url($sprites-detail-UI);
$spriteSIZE02: 310px; //sprite画像の最大横幅の半分
```



### 該当の背景画像を表示させたいclassに記述
```scss
@include sprite-bg-retina('画像名', $spriteURL00, $spriteSIZE00);

```


#### 参考サイト
http://webamb.com/compass/890.html
Compassでのグラデーション指定

[Compass](http://compass-style.org/)でのグラデーション指定について。
IEについては７〜10まで確認済み。

よくある垂直・2色のグラデーションです。

```scss:style.scss

// SVG指定も出力するように(IE9用)
$experimental-support-for-svg: true;

// 色を登録しておくよ
$bottomColor:	#3b5998;
$topColor:		lighten($bottomColor, 10%);

// グラデーションを指定するよ
.button {
	background: $bottomColor;
	@include background-image(linear-gradient(top, $topColor, $bottomColor));
	@include filter-gradient($topColor, $bottomColor, vertical);
}

```


出力されるCSSはこちら

```css:style.css

.button {
	background: #3b5998;
	background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjUwJSIgeTE9IjAlIiB4Mj0iNTAlIiB5Mj0iMTAwJSI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzRjNzBiYSIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzNiNTk5OCIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');
	background-size: 100%;
	background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #4c70ba), color-stop(100%, #3b5998));
	background-image: -webkit-linear-gradient(top, #4c70ba, #3b5998);
	background-image: -moz-linear-gradient(top, #4c70ba, #3b5998);
	background-image: -o-linear-gradient(top, #4c70ba, #3b5998);
	background-image: linear-gradient(top, #4c70ba, #3b5998);
	*zoom: 1;
	filter: progid:DXImageTransform.Microsoft.gradient(gradientType=0, startColorstr='#FF4C70BA', endColorstr='#FF3B5998');
}

```
if(is_array())とforeachを少し格好良く

どっかで見ただけなんだけど、どこで見たのか忘れたのでメモ。

```php:
<?php
$a = array(1, 2);
if(is_array($a)) foreach($a as $each){
    echo $each;
}
```

と、ifとforeachを同じ行に書ける。
構文的にどうなってるかは何となく想像が付く気がするけど、foreachってこういう存在なんだ。
jenkinsのディスク容量がいっぱいになって対処したこと

ビルドが失敗するようになって調べていたのですがディスク容量がいっぱいだった事が判明。
jenkinsのバージョンか何かが原因かと思って「Jenkinsの管理」ページを表示した事で解った。ディスク容量とか超重要なの管理のページ以外にも表示しておいてほしいですね。

という事で対策

## 圧迫原因

自分の場合は

- svn up
- ビルド(ユニットテスト、カバレッジ作成、コーディングスタイルチェック、諸々)

て流れで今までのビルド履歴(スタイルチェックのxmlやらカバレッジのhtmlやら)が圧迫していた。


## プラグインの導入

- ディスク容量の把握

[Disk Usage Plugin] (https://wiki.jenkins-ci.org/display/JENKINS/Disk+Usage+Plugin)

入れるだけで１ビルドの使用ディスク容量とか表示してくれる。
全体の容量を6時間ごとに収集してグラフ表示とかもしてくれるみたい


- ビルド履歴の削除

[Discard Old Build plugin] (https://wiki.jenkins-ci.org/display/JENKINS/Discard+Old+Build+plugin)

ビルド履歴はなるべく残しておきたいけどあんまり古すぎると意味ないし消さなきゃいけないしということで設定値以上になったら削除してくれるやつ。
１プロジェクト毎に設定を行うので別プロジェクトに影響がなく簡単に設定できた。

自分は30日以上、400ビルド以上で削除するようにした(もっと少なくても良いかな)なんかいい感じで設定する。

## おわり

おしまい
emacsからgdbを使用する方法

emacsからgdbを使用するには以下の手順で実行する。

1. emacs上でM-x gdbコマンドを実行する
2. デバッグするタスク名を入力する。
3. emacs内のウィンドウにgdbウィンドウが表示される。

注意点としてgdbが実行されるカレントディレクトリは
M-x gdbを実行したウィンドウのカレントディレクトリとなる。

そのためgdb起動前にデバッグを行うタスクがあるディレクトリまで移動してからgdbを起動する
新規プロジェクト立ち上げ時にとりあえず決めておく事メモ

個人的なメモ。心境の変化、宗旨替え等あった場合は都度更新します。

----

ガリガリ開発を始める前にこれだけは決めておく。

* 命名規則
* コーディングルール
* 基底クラス
* 例外処理
* ログ (※1)
* メッセージについて (※2)
* ソース内にマジックナンバーを仕込むなという周知徹底。定数化しろ。しろったらしろ。
* DB アクセス フレームワーク

> ※1　なにで吐くか(log4j, etc..)、このタイミングでは必ず吐く、等。
とりあえず Logger クラスだけ作って中の実装は後からにしても良い？<br>
> ※2　ソース内にベタ打ちはあんまり好きじゃない。定数か、 .NET だったら Resource とかが良いか？
</pre>

----
実装しながら決めても良い、けど割と早めに決める。

* 定数クラス
* 共通部品
* 画面デザイン。特に共通的な部分はとりあえず早めに。<br>
（あとからスタイルを当て込むのでも良いけど共通部品とかにするなら早めに決める）

-----
git aliasで複合コマンドを設定したい

`git-alias`でファイルにshellとして書くほどではないけど、gitのコマンドを複数実行したい場合はこんな感じで設定する事が可能です。

```.gitconfig
[alias]
    checkoutclean = !sh -c "git checkout . && git clean -f -d"
```

**コメントで@ngyukiさんから指摘を受けていますが、`!sh -c`とかしなくても以下で大丈夫でした。**

```.gitconfig
[alias]
    checkoutclean = !git checkout . && git clean -f -d
```


つまり、gitをshellとして実行して `&&` で連結して実行する形になります。

以上です。

### 参考サイト

* [Git Alias - Multiple Commands and Parameters](http://stackoverflow.com/questions/7534184/git-alias-multiple-commands-and-parameters)
gdbで実行ステップ行を戻す方法

gdbでデバッグをする場合VSのように実行ステップ行を戻すには、以下の手順でデバッグを行う。

1. ステップを戻して調べたい箇所の直前で一度中断する
1. recordコマンドを実行する
1. nextコマンドでステップを進め、reverse-nextコマンドでステップを戻す

詳しい内容は以下のリンク先を参照する。

* [ GDBで歴史をさかのぼれるように!なりました! GDB 7.0 の新機能Reverse Debuggingを使ってみた](http://d.hatena.ne.jp/hayamiz/20090930/1254323169)
* [GDB and Reverse Debugging](http://www.gnu.org/software/gdb/news/reversible.html)
grunt-contrib-connectでのルートフォルダ指定

全然大したことではないけど一応メモ

自分のprojectファイルの構成は以下みたいな感じにしたい。

```

├── README.md
├── config
│   └── config.rb
├── docs
│   └── styles
├── gruntfile.js
├── htdocs
│   ├── css
│   │   ├── _dev
│   │   │   ├── _scss
│   │   │   │   ├── mixin
│   │   │   │   │   └── libs
│   │   │   │   ├── style.scss
│   │   │   │   └── vars
│   │   │   └── style.css
│   │   └── style.css
│   ├── img
│   └── index.html
└── package.json
```

けど、どっかからコピペしてきたgurunt.jsの設定だとgrunt-contrib-connectでローカルサーバーを立ち上げたときにルートがprojectフォルダになってしまっていたのでhtdocsをルートにするためにgrunt-contrib-connectのタスクを以下のように書き換え。

```js:grunt.js
var path = require('path');
var lrSnippet = require('grunt-contrib-livereload/lib/utils').livereloadSnippet;
var folderMount = function(connect, dir) {
	return connect.static(path.resolve(dir));
};
module.exports = function(grunt) {
 grunt.initConfig({
  connect: {
   server: {
    options: {
     port: 9001,
      middleware: function(connect, options) {
       return [
        lrSnippet,
        folderMount(connect, 'htdocs') //ここでルートにしたいフォルダを指定
       ];
      }
     }
   }
  },
 });
};
```
.swpや.~を常に任意のディレクトリに作成する

指定したディレクトリがなかったら作る

```vim:
if isdirectory($HOME . '/.vimbackups')
    set backupdir=~/.vimbackups
else
    call mkdir($HOME . '/.vimbackups')
    set backupdir=~/.vimbackups
endif
if isdirectory($HOME . '/.vimswps')
    set directory=~/.vimswps
else
    call mkdir($HOME . '/.vimswps')
    set directory=~/.vimswps
endif
```
emacs で文字コードをUnicode(UTF-8 or UTF-16)のBOM付きにする

EmacsでUnicodeのBOM付きで保存するためのメモ Windows対策です

emacs上で

```
C-x RET f 
```

を使い文字コードをutf-8 or utf-16のsignature付きものを指定してから保存する
指定できるのは以下のもの


utf-16be-with-signature 
utf-16be-with-signature-dos
utf-16be-with-signature-mac
utf-16be-with-signature-unix
utf-16le-with-signature
utf-16le-with-signature-dos
utf-16le-with-signature-mac
utf-16le-with-signature-unix
utf-8-with-signature 
utf-8-with-signature-dos
utf-8-with-signature-mac
utf-8-with-signature-unix


例：

```

C-x RET f utf-8-with-signature 

```
なんかかっこいいプレゼンテーションテンプレートを探しているならreveal.js使ってみろって


ちょうどいくつかプレゼン用の資料を作らなきゃと思っていてなんかいいテンプレートないかな〜って探していたらので[reveal.js](https://github.com/hakimel/reveal.js)が超絶に良かったのでメモ

[reveal.js](https://github.com/hakimel/reveal.js)

htmlで綺麗でカッコいいプレゼンテーションを作れるフレームワークです。

## 3Dでグィングィン動きます

[デモ画面](http://lab.hakim.se/reveal-js/#/)見ればどんな風にグィングィン動くかわかります（開いたら右スクロールボタンを押してみてください）

## Escキー押すとプレゼンテーションのドキュメント一覧が見れます

それがまたカッコよく3Dでみれます。

## PDFへのエキスポートが楽チンです

書いたドキュメントをプリントしてメンバーに配布とかってシーンがあるとおもいますが
reveal.jsなら綺麗にできます。

## 使い方

### zipパッケージで落としてくる

[hakimel/reveal.js](https://github.com/hakimel/reveal.js)にいって
「Download ZIP」をポチッと押します。

### 書きたい内容をindex.htmlで編集

コレだけです。

## プレゼン内容の書き方

### HTMLでゴリゴリ書きたい場合

プレゼン内容は ```<div class="slides">``` 以下に ``` <section> ```区切りで一枚のページになります。(右スクロールを押すたびに次のページに移動する)

### markdowon形式でゴリゴリ書きたい場合

公式にも説明がありますがこんな感じで

```html:index.html
<section data-markdown>
    <script type="text/template">
        ## Page title

        A paragraph with some text and a [link](http://hakim.se).
    </script>
</section>
```

### 下スクロールでのページを作成したい場合

``` <section> ```をネストさせましょう

```html:index.html
<section>
	<section>
		<h3> 題名
	</section>
</section>
```

コレで下スクロールのページが作れます

## PDFに変換する方法

以下がやり方(MAC)

* 1. chromeで開きます
* 2. URLにindex.html?print-pdfを付与します
* 3. comannd + p　で印刷画面を表示させます
* 4. 「レイアウト」を横にして「pdfにして保存」を選びます

他にも色々オプションがあるのでgithubのドキュメントを読んでみてください
Javascriptのthisのパターンは4つじゃなくて3つだと思っている

apply,callパターンとコンストラクタパターンで2パターン。それはいい。
###だけど、関数呼び出しパターンとメソッド呼び出しパターンは同じ。
###どちらかというと、関数呼び出しパターンがメソッド呼び出しパターン。
つまり、関数呼び出しパターンというのは、単にwindowオブジェクトから呼び出されているメソッド呼び出しパターンだということ。たまたまwindowオブジェクトのプロパテイの呼び出しの際にwindowを省略できるだけの話なので、メソッド呼び出しに対して関数呼び出しと呼んで区別すると、違和感がある。
オッカムの剃刀を愛好している者としては、ぜひ3つで推したいんですが、そのへんどうなっているんでしょうか。
@Haru39さんが詳しそうなので、この認識で不都合が生じる点があればご教授頂けると幸いです。よろしくお願いします。
Javaで改行コードを検出するために使える正規表現 "\r\n|[\n\r\u2028\u2029\u0085]"

よく知られているように，テキストを改行する際の文字コードは環境に依存する．Windowsでは\r\n, Linuxでは\nとか．

汎用的に改行コードを検知するにはどうしたらいいかと思ってOpenJDKのソースコードを見てみると
[Scannerクラス](http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7-b147/java/util/Scanner.java)では以下のような正規表現が使われていたのでメモしておく．

```java:Scanner.java(500行目付近)
String LINE_SEPARATOR_PATTERN =  "\r\n|[\n\r\u2028\u2029\u0085]";
```

ちなみに，[u2028](http://www.fileformat.info/info/unicode/char/2028/index.htm)はLine Separator，[u2029](http://www.fileformat.info/info/unicode/char/2029/index.htm)はPragraph Separator，[u0085](http://www.fileformat.info/info/unicode/char/85/index.htm)はNext Line らしい

---

なお，[BuffredReaderクラス](http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7-b147/java/io/BufferedReader.java)ではもうちょっと泥臭い読み方をしている模様

```java:BufferedReader#read()(180行目あたり)
if (skipLF) {
    skipLF = false;
    if (cb[nextChar] == '\n') {
        nextChar++;
        continue;
    }
}
```

```java:BufferedReader#readline()(350行目あたり)
if (c == '\r') {
    skipLF = true;
}
```
Chromeのプリフェッチでニコニコ動画の視聴履歴インジェクション

# 経緯

僕はいつもFirefoxを使っているのだが、[某氏とChromeの話で盛り上った時](http://twitter.com/ranha/status/359602745709314048)に事件は発生した。
これはニコニコ動画にログインしている状態のChromeを持っている人であれば、誰でも再現可能であると思われるのでちょっと書いてみる。

# 視聴履歴インジェクション

次の手順でやると分かりやすい。

1. ニコニコの視聴履歴を見ておく。（とりあえずはこんな感じ）
![初期](https://qiita-image-store.s3.amazonaws.com/0/10815/a6f3117c-ddf6-0747-d484-2b96af9c4fcf.png)
2. 別のタブを作って、ニコニコ動画の何かが一番上に出てくるような検索ワードをGoogleで検索する。（例えばこれ）
![検索](https://qiita-image-store.s3.amazonaws.com/0/10815/3cedebba-a868-5bbe-c25a-c87dc2327dff.png)
3. 視聴履歴のタブを更新すると……
![更新](https://qiita-image-store.s3.amazonaws.com/0/10815/2356e74f-38f9-9e97-a99e-5b8bf6e0e3ee.png)

と、何故かこんな感じで視聴してない動画が視聴履歴に追加される。

# 何故か

どうやらChromeはWebサイトを見たときに上の方にあるリンクを先読み（プリフェッチ）するらしい。適当なプロクシを通して検索してみると、

![プロクシ](https://qiita-image-store.s3.amazonaws.com/0/10815/98f29656-4168-c88a-987c-1f48d28ccb4a.png)

このように、Googleと関係ないところにいっぱいアクセスしている他、普通に動画自体にもアクセスしている。

![アクセス](https://qiita-image-store.s3.amazonaws.com/0/10815/71e03673-39b3-63ea-edd1-2d8d4a73b513.png)

そして、`nicohistory`というCookieが書き込まれるなどして視聴履歴が増える。

![レスポンス](https://qiita-image-store.s3.amazonaws.com/0/10815/0767f81d-eb35-6854-cadf-e4e8d57a650b.png)

# 結局

ただプリフェッチしているChromeは、プリフェッチであることを示すようなHTTPヘッダなどを付与してないと思われるので、これ（プリフェッチ）をニコニコ動画側で判定して視聴履歴に入れないようにする、というのは難しいかもしれない。
ただ、いくらプリフェッチをしても再生回数は増えないので、再生回数を増やすタイミングで視聴履歴を弄ればなんとかなるかもしれない。

とりあえず、誰かの視聴履歴を弄りたい人はプリフェッチを利用して面白いことが出来るかもしれないです。
UTF-8として妥当な文字列か1行でチェックする

```php
<?php
Zend\Stdlib\StringUtils::isValidUtf8($str);
```
ソース:https://github.com/zendframework/zf2/blob/master/library/Zend/Stdlib/StringUtils.php

ちなみに、u modifier使える環境かいなかの確認に、hasPcreUnicodeSupportメソッドがあります。

参照： PCREはUnicode文字プロパティをサポートするとは限らない - http://d.hatena.ne.jp/hnw/20090628
AngularJS on-flick

フリック入力を簡単に書けるように、ディレクティブにしてみました。

利用サンプルは後で書きます。

```coffeescript:angular-on-flick.coffee
###*
 * angular on-flick directive
 * 
 * @author atomita
 * @license MIT
 * @version 0.2.2
###
angular.module("on-flick", []).directive("onFlick", ["$window", ($window)->
	if "ontouchstart" of $window
		_get_position = (event)->
			{
				x: event.changedTouches[0].pageX
				y: event.changedTouches[0].pageY
			}
	else
		_get_position = (event)->
			{
				x: event.pageX
				y: event.pageY
			}

	_apply = (scope, str_apply, start, current, element)->
		moved =
			x: current.x - start.x
			y: current.y - start.y

		angule_base = if 0 <= moved.x then (if 0 < moved.y then 360 else 0) else 180

		flick = scope.flick || {}
		flick.start = start
		flick.current = current
		flick.moved = moved
		flick.range = Math.sqrt(Math.pow(Math.abs(moved.x), 2) + Math.pow(Math.abs(moved.y), 2))
		flick.angule = Math.atan((-1 * moved.y) / moved.x) * (180 / Math.PI) + angule_base
		scope.flick = flick

		scope.$apply(str_apply)
		return


	{
		restrict: "CA"
		scope:
			option: "=flickOption" # optional
		link: (scope, element, attrs)->
			start = current = null
			
			scope.angular = angular
			scope.element = element
			scope.attrs = attrs
			
			element.bind("touchstart mousedown", (event)->
				event.preventDefault()
				
				start = current = _get_position(event)
				
				scope.event = event
				return
			)
			element.bind("touchmove mousemove", (event)->
				if not current?
					return

				event.preventDefault()

				current = _get_position(event)
				
				scope.event = event

				if scope.option?.moveing?
					_apply(scope, scope.option.moveing, start, current, element)
				return
			)
			element.bind("touchend mouseup touchcancel mouseleave", (event)->
				if not current?
					return

				moved =
					x: current.x - start.x
					y: current.y - start.y
				tmp_current = current
				tmp_start = start
				start = current = null
				
				scope.event = event

				attrs.onFlick and _apply(scope, attrs.onFlick, tmp_start, tmp_current, element)
				return
			)
			return
	}
])
```

flick_scope = scope.$new()
flick_scope = angular.extend(flick_scope, scope)
ってしたら無限ループに陥ってしまった…
任意の文字列群からランダムな文字列を生成する

```php
<?php
Zend\Math\Rand::getString(6, '23456789abcdefghjkmnpqrstuvwxyz', true);
````

第三引数は暗号学的に強度にするかという指定です。

参照 : http://framework.zend.com/manual/2.2/en/modules/zend.math.introduction.html
Xamarin.iOS で、スワイプで View を切り替える方法

いろんなアプリで使われてるからもっと簡単なのかと思ってましたよ…。

* [Storyboardから始めるiPhoneアプリ開発 [Xcode][objective-c]UIScrollViewを使ってスワイプでページを切り替える方法](http://blog.casualappteam.com/blog-entry-47.html)
* [UIPageControlの使い方 | Basilの息子](http://sonsofbasil.blog55.fc2.com/blog-entry-9.html)

ここら辺りを参考に Xamarin.iOS で実装してみた。

## Xamarin.iOS プロジェクトを作って、InterfaceBuilder で UIScrollView を配置する

ほぼ上記サイト通りなので割愛。
中でも ``Paging Enabled`` を ON にしておくのが重要。
UIScrollView は Outlet で変数にしておく。

## プロジェクトに画像を追加する

``image1.png``, ``image2.png``, ``image3.png`` をプロジェクトに追加。ビルドアクションを ``Content`` にする。

画像のサイズは w:320px, h:460px にしました。

一応おいておきます → http://blog.amay077.net/assets/images/posts/swipe_view_images.zip

## 実装する

Android の Gelleley みたく、「画像を追加するだけであとはよろしくやってくれる」もんだと思ってたんですが、**ほぼなにもやってくれない** のですね。
自力で座標をずらして追加する、ってゴリゴリじゃないですか。

```cs:SwipeSampleViewController.cs
public override void ViewDidLoad()
{
    base.ViewDidLoad();

    SizeF imageSize = new SizeF(320f, 460f);
    for (int i = 0; i < 3; i++)
    {
        var image = UIImage.FromFile(String.Format("image{0}.png", i));

        var imgView = new UIImageView(image);
        // x方向にずらしながら…
        imgView.Frame = new RectangleF(imageSize.Width * i, 0f, 
                                       imageSize.Width, imageSize.Height);
        // 子として追加。
        scrollView.AddSubview(imgView);
    }
    // スクロール可能領域を設定する
    scrollView.ContentSize = new SizeF(imageSize.Width * 3, imageSize.Height);
}
```

なんか参考サイトのコードよりずいぶんすっきりしたぞ。

``imgView`` の破棄とかやってないので、ちゃんと使う時はちゃんと破棄しましょう。(``ViewDidUnload`` が Deprecated なようなのだけど、どこで破棄したら？Dispose？)

## その他

* 「ページが変わった時のイベント」があるかと思ったらなかった、これも自力実装かorz
* 「無限スクロール」みたいなのやりたいけどこのアプローチじゃない気がする