OmniAICreator/Qiita-1.07M huggingface dataset:
SCSSで使うcubic-bezier値を変数化しておく

## 元ネタ

**Easing Function**
http://easings.net/ja

* イージングアニメーションの種類がたくさんライブラリ化されていて、JSで使用できる。
* [Compass Ceaser](https://github.com/jhardy/compass-ceaser-easing) プラグインを入れればSCSS上で `ceaser($easing名)` として呼び出すことが可能。

## SCSS変数にした
Ceaserプラグインを入れなくてもSCSS上で呼び出せるようにしたいと思って、
SCSSの変数として移植させていただいたのが下記。[元ネタ](http://easings.net/ja) のeasing名とcubic-bezier値をまま移植しています。

```scss:例：transitionやanimationの中で使える
.hoge {
  transition: all .2s $easeOutCubic;
}
```

### コード

```scss:variable.scss
/*
 * Easing function
 * Original：http://easings.net/
 */

$easeInSine:     cubic-bezier(0.47,  0,     0.745, 0.715);
$easeOutSine:    cubic-bezier(0.39,  0.575, 0.565, 1    );
$easeInOutSine:  cubic-bezier(0.445, 0.05,  0.55,  0.95 );
$easeInQuad:     cubic-bezier(0.55,  0.085, 0.68,  0.53 );
$easeOutQuad:    cubic-bezier(0.25,  0.46,  0.45,  0.94 );
$easeInOutQuad:  cubic-bezier(0.455, 0.03,  0.515, 0.955);

$easeInCubic:    cubic-bezier(0.55,  0.055, 0.675, 0.19 );
$easeOutCubic:   cubic-bezier(0.215, 0.61,  0.355, 1    );
$easeInOutCubic: cubic-bezier(0.645, 0.045, 0.355, 1    );
$easeInQuart:    cubic-bezier(0.895, 0.03,  0.685, 0.22 );
$easeOutQuart:   cubic-bezier(0.165, 0.84,  0.44,  1    );
$easeInOutQuart: cubic-bezier(0.77,  0,     0.175, 1    );

$easeInQuint:    cubic-bezier(0.755, 0.05,  0.855, 0.06 );
$easeOutQuint:   cubic-bezier(0.23,  1,     0.32,  1    );
$easeInOutQuint: cubic-bezier(0.86,  0,     0.07,  1    );
$easeInExpo:     cubic-bezier(0.95,  0.05,  0.795, 0.035);
$easeOutExpo:    cubic-bezier(0.19,  1,     0.22,  1    );
$easeInOutExpo:  cubic-bezier(1,     0,     0,     1    );

$easeInCirc:     cubic-bezier(0.6,   0.04,  0.98,  0.335);
$easeOutCirc:    cubic-bezier(0.075, 0.82,  0.165, 1    );
$easeInOutCirc:  cubic-bezier(0.785, 0.135, 0.15,  0.86 );
$easeInBack:     cubic-bezier(0.6,  -0.28,  0.735, 0.045);
$easeOutBack:    cubic-bezier(0.175, 0.885, 0.32,  1.275);
$easeInOutBack:  cubic-bezier(0.68, -0.55,  0.265, 1.55 );
```

`$ease` まで書いた所でエディタがサジェストを出してくれるので便利。
これら全部を使い分けるというよりは、今回はこれとこれを使う、
というのを決めてさらに変数でラップしておくのも良さそう。

ただし「Elastic」や「Bounce」などベジエ曲線で表現できないものは非対応なので、JSで呼び出すか、CSSだけの場合は `@keyframe` で書く必要がある。


## 追記

通常のtiming-functionも同じノリで書きたいときは、

```scss
$ease:      ease;        // = cubic-bezier(0.25, 0.1, 0.25, 1.0)
$linear:    linear;      // = cubic-bezier(0.0,  0.0, 1.0,  1.0)
$easeIn:    ease-in;     // = cubic-bezier(0.42, 0,   1.0,  1.0)
$easeOut:   ease-out;    // = cubic-bezier(0,    0,   0.58, 1.0)
$easeInOut: ease-in-out; // = cubic-bezier(0.42, 0,   0.58, 1.0)
```

も変数化しておくといいかも...？
(例：`$easeOutQuint`を 普通の`ease-out`にしたいときに Quintを削るだけでいいので)
Oracle ORA-23421が発生した場合に確認する項目


以下のエラーが発生した場合、接続しているセッションのユーザを確認すると良いかもしれない。

```
…（省略）…
*
行1でエラーが発生しました。:
ORA-23421: ジョブ番号141はジョブ・キュー内のジョブではありません ORA-06512:
"SYS.DBMS_SYS_ERROR", 行86
ORA-06512: "SYS.DBMS_IJOB", 行781
ORA-06512: "SYS.DBMS_JOB", 行224
ORA-06512: 行1
```

例えば、DBA権限を持たないユーザで「as sysdba」をつけてログインすると、「PERFSTAT」ユーザではなく「SYS」ユーザで接続される。

```bash:
sqlplus perfstat/oracle as sysdba

# PERFSTATユーザはDBA権限を持たないとする。
# OS認証ログイン可能なOSユーザで上記のコマンドを実行する。

…（省略）…

SQL> show user
ユーザーは"SYS"です。
```
Git 超入門(SourceTreeじゃなくてターミナル)

Git 超入門(SourceTreeじゃなくてターミナル)

mac を使います。
ちょっとずつ書いていきます。
対象は、
普段SourceTreeを使っているけどターミナルでかっこよくgitを使いたい人
です。

##追記:
書いてて思ったけど
http://www.backlog.jp/git-guide/reference/
サルでもわかるGit入門　
のサイトの方が分かりやすいや(´･ω･`)ｼｮﾎﾞｰﾝ

##gitのsystem 設定(ユーザー名・メールアドレスを記入する)

```lang:system設定
$ git config —-global user.name “ダブルクォーテーションの中にユーザー名”
$ git config —-global user.email testemail@yahoo.co.jp
```

##checkout のコマンドを co でできるようにする

```lang:checkoutをcoでもできるように
$git config --global alias.co checkout
```

##最初のローカルリポジトリを作る
カレントディレクトリにリポジトリが作られるから注意ね！

```lang:リポジトリ作成
$ git init
成功すると「Initialized empty Git repository in **pass*」と表示される
```
成功するとカレントディレクトリに.gitファイルが作成される。


##gitignoreを作成する

gitignoreはgitの作成したリポジトリのルートディレクトリに置く必要がある。

```lang:.gitignore
$ vim .gitignore
```

##indexに追加する

```lang:indexに追加
$ git add .
```
addの後に[.]を使うことでカレントディレクトリを含む以下の全階層にあるディレクトリ・ファイルをindexに追加できる

##ステージングエリアを確認する

```lang:ステージングエリアを確認
$ git status
```

##コミットをしよう

```lang:コミット
$ git commit -m  "こめんとはちゃんと書こうね"
```
-m をつけることで　末尾にコメントを記述してすぐにコミットすることができる


##logを確認しよう

```lang:logを確認しよう
$ git log
結果
commit ididiidiididiidididiid ->commitのid
Author: コミットした人の名前 <test@yahoo.co.jp> ->commitした人の情報
Date:   Wed May 29 15:31:19 2015 +0900 ->commitした日時

  "こめんとはちゃんと書こうね" ->コメント
```

#リモートリポジトリにpushするために

##githubとかでリモートリポジトリを作成する
https://github.com/!!!username!!!/first_app.git
みたいなurlを取得する

##ローカルリポジトリにリモートリポジトリを登録する
```lang:ローカルリポジトリにリモートリポジトリを登録する
$ git remote add origin https://github.com/!!!username!!!/first_app.git
```

##リモートリポジトリにpushする
```lang:pushする
$ git push -u origin master
```

#ブランチを変えよう

##ブランチを新規作成する
```lang:ブランチの作成
$ git branch -b 新規ブランチ名
```

##現在いるブランチを確認
```lang:ブランチを確認
$ git branch 
結果
  master
* 新規ブランチ名

アスタリスクが付いているブランチが現在のブランチです
```
RDSのRestore to Point in Timeを勘違いしていた件

## Restore to Point in Timeとは？

> 特定の時点への DB インスタンスの復元
> https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_PIT.html

## 勘違いとは？
これでDBぶっ飛ばしちゃってもすぐ戻せるから安心だ、とか思ってた。
指定した時間にDBを一瞬で戻せるとか思ってた。

## 障害発生
本番運用中のものでなんかデータの整合性が合わない。
そもそものバグを除去するのも重要だが、とりあえずサービスを復旧したい

## Restore to Point in Time を使えば元に戻せるよ
「RDSにはですねー、Restore to Point in Timeっていう便利なものがあるんですよー」とかドヤ顔で言ってた。
よし、じゃあ30分前に戻してくれって言われたので戻そうと思ったが、実際に今まで戻したことがなかったので初めて触った。

その時、頭をよぎったこと

- DBのdead timeはあるか
- 復元時間はどれぐらいなのか
- 復元中に実行されたINSERTとかはどうなるか

Restore to Point in Timeを実行する勇気がなかった。

## 実際の機能
翌日冷静になって機能を検証してみた。

Restore to Point in TimeはDBを復元して、新しいインスタンスとして立てれる機能であった。
つまり、インスタンスもEndpointも変わる。
直近のSnapshotを常に取ってくれる機能だった。

- DBのdead timeはあるか
  - 別のインスタンスを立ち上げるので死なない
- 復元時間はどれぐらいなのか 
  - 普通にRDSを立てるのと同じなので20分ぐらい？
- 復元中に実行されたINSERTとかはどうなるか
  - 元のDBに書き込まれ続ける

## 復旧するために対応すること
- サービスのEndpointを変更する
  - Route53のPrivate DNSで向き先変えたり、ソースコード変更したりが必要

- 復元中に書き込まれたデータを新しいDBに反映する

## まとめ
障害時の復旧機能はちゃんとテストしておくこと
よく言われることだが、復旧手順は動作確認しなければ意味がない、ぶっつけ本番と同じ
障害時は冷静な判断がしにくいので思わぬミスに繋がる可能性がある
PHP7調査(33)カスタムセッションハンドラの返り値の意味を変更

PHPでは独自のセッションハンドラをプログラマが実装することができます。具体的には、[session_set_save_handler](http://php.net/session_set_save_handler)関数を使うことで、標準のセッションハンドラが対応していないようなストレージにセッション情報を保存することができます。

ところで、PHP5まではカスタムセッションハンドラの返り値の扱いが間違っていました。マニュアルでは`true`か`false`を返すことになっているのですが、実際には失敗なら`-1`を、成功ならそれ以外を返すというインターフェースになっていました。

これが、PHP7ではマニュアル通りになるよう修正されます。

以下、PHP5でのセッションハンドラの利用例です。

```php
<?php
ini_set('session.gc_divisor',1);

/* PHP5用のカスタムセッションハンドラ */
session_set_save_handler(
    /* open */
    function ($savePath, $sessionName) { return 0; }, /* -1だとFatal error */
    /* close */
    function () { return 0; }, /* -1でもエラーにならない */
    /* read */
    function ($sessionId) { return ['foo' => 'bar']; },
    /* write */
    function ($sessionId, $data) { return 0; }, /* -1だとWarning */
    /* destroy */
    function ($sessionId) { return 0; }, /* -1だとWarning */
    /* gc */
    function ($lifetime) { return 0; },  /* -1でもエラーにならない */
    /* create_sid */
    function () { return 'baz'; }
);

session_id('baaz');
session_start();
session_regenerate_id(TRUE);
session_write_close();
```

このように、セッションハンドラ内でエラーが起きたときは`-1`を返す必要がありました。驚くべきことに、マニュアル通りに`true`を返そうが`false`を返そうが成功として扱われていたのです（`true`と`false`を整数にキャストしても`1`と`0`なので、失敗ではない＝成功として扱われる）。

一方、PHP7では次のように記述できます。

```php
<?php
ini_set('session.gc_divisor',1);

/* PHP7用のカスタムセッションハンドラ */
session_set_save_handler(
    /* open */
    function ($savePath, $sessionName) { return true; }, /* falseだとFatal error */
    /* close */
    function () { return true; }, /* falseでもエラーにならない */
    /* read */
    function ($sessionId) { return ['foo' => 'bar']; },
    /* write */
    function ($sessionId, $data) { return true; }, /* falseだとWarning */
    /* destroy */
    function ($sessionId) { return true; }, /* falseだとWarning */
    /* gc */
    function ($lifetime) { return true; },  /* falseでもエラーにならない */
    /* create_sid */
    function () { return 'baz'; }
);

session_id('baaz');
session_start();
session_regenerate_id(TRUE);
session_write_close();
```

成功なら`true`を、失敗なら`false`を返すというわけです。平和ですね。

# どうしてこうなった

PHP内部のCの関数は次のような返り値で成功失敗を受け渡しています。

```c
typedef enum {
  SUCCESS =  0,
  FAILURE = -1,		/* this MUST stay a negative number, or it may affect functions! */
} ZEND_RESULT_CODE;
```

今回のセッションハンドラはbooleanを返すPHP関数ですが、この返り値をそのままC関数の返り値に利用していたために意味が変わっていたというわけです。Cでありがちなうっかりミスと言えなくもないですが、今まで誰も気がつかなかったのがビックリですね。

# 参照

* [PHP RFC: Fix handling of custom session handler return values](https://wiki.php.net/rfc/session.user.return-value)
* [PHP: session_set_save_handler - Manual](http://php.net/session_set_save_handler)
ubuntu 14.04で redmineのインストール・バックアップ・リストア（その２）

その２はバックアップ、リストアを行います。
バックアップ元は CentOS5
バックアップ先は ubuntu 14.4
です。

## 必要なもののバックアップ

http://redmine.jp/faq/system_management/backup/
これを参照しながら進めていきます。

```shell:バックアップ元
$ cat /opt/redmine-2.6.2/config/database.yml
# Default setup is given for MySQL with ruby1.9. If you're running Redmine
# with MySQL and ruby1.8, replace the adapter name with `mysql`.
# Examples for PostgreSQL, SQLite3 and SQL Server can be found at the end.
# Line indentation must be 2 spaces (no tabs).

production:
  adapter: mysql2
  database: redmine
  host: localhost
  username: redmine
  password: redmine
  encoding: utf8

※DB名の確認

$ cd /home/xxx/backup/
$ mysqldump -u redmine -predmine redmine > redmine.sql
※ sqlのダンプ

$ su
# cd /opt/redmine-2.6.2/
# tar zcvfp /home/xxx/backup/redmine-files.tar.gz ./files
※filesをtarで固める
```

転送先にファイルを持っていきます。
（ftpでもsftpでもscpでもなんでもどうぞ）

その１でインストールした ubuntuの redmineはディレクトリが色々違うので注意！


| |CentOS5|ubuntu 14.4|
|---|---|---|
|インストールパス|/opt/redmine-xxx|/usr/share/redmine|
|database.yml|/opt/redmine-xxx/config|/etc/redmine/default|

```shell:転送先
root@raidtest:~# cd /etc/redmine/default
root@raidtest:/etc/redmine/default# cat database.yml
production:
  adapter: mysql
  database: redmine_default
  host: localhost
  port:
  username: redmine_default
  password: redmine
  encoding: utf8

※DBの名前とか確認

root@raidtest:~/redmine-backup# ls -al
合計 296
drwxrwxr-x 2 nyamagu nyamagu   4096  5月 20 14:30 .
drwxr-xr-x 5 nyamagu nyamagu   4096  5月 20 14:29 ..
-rw-r--r-- 1 nyamagu nyamagu  99262  5月 20 14:30 redmine-files.tar.gz
-rw-r--r-- 1 nyamagu nyamagu 191826  5月 20 14:29 redmine.sql
※バックアップファイルの確認

root@raidtest:~/redmine-backup# mysql -u redmine_default -predmine redmine_default < redmine.sql
root@raidtest:~/redmine-backup#
※DBファイルのリストア

oot@raidtest:/usr/share/redmine# cd /usr/share/redmine/
root@raidtest:/usr/share/redmine# ls
Gemfile       Rakefile  config     db     lib     script     test
Gemfile.lock  app       config.ru  extra  public  templates
※filesをリストアしようと思ったけどfilesってディレクトリがない。。。いいやこのまま展開

root@raidtest:/usr/share/redmine# tar zxvfp /home/xxx/redmine-backup/redmine-files.tar.gz
./files/
./files/delete.me
./files/2015/
```

これでアクセスしてみると、とりあえず元通りになってる感じになってます。
ActiveRecordでサブクエリのJOIN

たとえば

「ユーザー1がコメントした記事の中で、コメントのlike数が1以上の記事を検索する」

```sql
SELECT `posts`.* 
FROM `posts` 
  INNER JOIN (
    SELECT `comments`.* 
    FROM `comments`
    WHERE 
      `comments`.`user_id` = 1 AND
      `comments`.`likes_count` >= 1
  ) liked_user_comments ON liked_user_comments.`post_id` = `posts`.`id`
```

こんなのをRailsで書くには？

## コード

### Arel::Table オブジェクトの取得

```rb
user = User.find(1)
posts = Post.arel_table
comments = Comment.arel_table 
```

### サブクエリの組み立て

.project などによってできる Arel::SelectManagerオブジェクト の .as を呼ぶと Arel::Nodes::TableAliasオブジェクト を得ることができ、テーブルと同様に扱うことができるようになります。

```rb
liked_user_comments = comments
                          .project(Arel.sql('*'))
                          .where(comments[:user_id]
                              .eq(user.id)
                              .and(comments[:likes_count].gtdq(1)))
                          .as('liked_user_comments') # これ

```

### JOIN句の組み立て

先ほど得た Arel::Nodes::TableAlias を .join に渡すとサブクエリになります。
最後に .join_sources を呼ぶことでJOINの右辺を取り出すことができます。（Arel::Nodes::InnerJoinオブジェクト）

```rb
join_conds = posts
                 .join(liked_user_comments, Arel::Nodes::InnerJoin)
                 .on(liked_user_comments[:post_id].eq(posts[:id]))
                 .join_sources
```

### ActiveRecord の joins に渡す

```rb
Post.joins(join_conds)
```

## 参考

http://qiita.com/tkawa/items/e65c8847e57a5329f336
Gruntfile.jsを編集してdistにコピーするファイルを設定する

#やりたいこと
Gruntで本番環境をビルドするときに、開発環境からdistフォルダにコピーするファイルを指定する

#環境
YEOMANを入れたばっかり
- Grunt
- bower
- font-awesome

※今回はfont-awesomeを使って本番環境にアイコンを表示させたかったのでこれを設定するやり方を書きますが、多分bowerでインストールしたものを使いたい時は大体同じことすればいいと思います。

#やりかた
Gruntfile.jsにコピーするファイルを明記します。

Gruntfileには以下のように、本番環境をビルドするときにコピーするファイルを指定する記載があります。

```js:Gruntfile.js
    copy: {
      dist: {
        files: [{
          expand: true,
          dot: true,
          cwd: '<%= yeoman.app %>',
          dest: '<%= yeoman.dist %>',
          src: [
            '*.{ico,png,txt}',
            '.htaccess',
            '*.html',
            'views/{,*/}*.html',
            'images/{,*/}*.{webp}',
            'styles/fonts/{,*/}*.*'
          ]
        }, {
          expand: true,
          cwd: '.tmp/images',
          dest: '<%= yeoman.dist %>/images',
          src: ['generated/*']
        }, {
          expand: true,
          cwd: '.',
          src: 'bower_components/bootstrap-sass-official/assets/fonts/bootstrap/*',
          dest: '<%= yeoman.dist %>'
        }]
      },
・・・
```

Bootstrapを入れていれば、一番最後に指定する記述があると思います。
これを元に

```js
 {
          expand: true,
          cwd: '.',
          src: 'bower_components/font-awesome/fonts/*',
          dest: '<%= yeoman.dist %>'
        }
```

この記述を追加します。
記述の意味についてはGruntのドキュメントに書いてあります〜〜
日本語訳されたものを参考に記しておきます。


書いてある意味を大雑把に言うと、
bower_components/font-awesome/fonts/以下のファイルを全てコピーして
distフォルダ以下にフォルダ構成もそのままコピーするという意味になっています。

記述が終わったら

```
grunt build
```

でdistフォルダにちゃんとビルドされてるか確認してみてください。

#参考
[タスクの設定](http://js.studio-kingdom.com/grunt/doc/configuring_tasks)
[Cocos2dx] CCScale9Sprite, 9-patch png

First time to know the 9-patch images is from the android development.
Some tools or introductions, see [here](http://pikaho.hatenablog.com/entry/2013/10/01/211602)

For cocos2dx, there is a class `CCScale9Sprite` in `cocos2d::extension` do the same thing.

This [article](http://pikaho.hatenablog.com/entry/2013/10/01/211602) has a good explanation about this.
VagrantにてAnsibleでソースからhttpd, MySQL, PHPをインストールして起動確認するまで

## 経緯
LAMPが主戦場という会社はまだまだ多くあり
Vagrant+AnsibleでLAMP構築するのも需要があるかな、
と思い個人的に利用していたものをまとめました。

## 何故ソースから？
バージョン指定が明確な為です。

yumでのインストールはリポジトリに左右され
バージョン指定がしにくいです。

なので指定バージョンのソースからのインストールをするようにしました。


## 開発環境

* MacOSX Yosemite 10.10.3
* VirtualBox 4.3.26 r98988
* Vagrant 1.7.2
* Ansible 1.9.1

## 手順

#### 1. Vagrant Box追加

```
$ vagrant box add centos6.5 https://github.com/2creatives/vagrant-centos/releases/download/v6.5.1/centos65-x86_64-20131205.box
```

#### 2. gitリポジトリをclone

```
$ git clone https://github.com/kenzo0107/Vagrant-Ansible
```

こちらのGitでは以下バージョンを指定しています。
- httpd : 2.4.12
- mysqld : 5.5.39
- PHP : 5.3.6

※バージョン変更する際、URLが正しく存在するかチェックした後に変更してください。
※変数以外の箇所も異なる場合は変更するようにしてください。

#### 3. vagrantからVM起動

```
$ cd Vagrant-Ansible/centos6
$ vagrant up
```

#### 4. ssh-config設定をssh.configへ転記

vagrant起動後に以下実行します。
一度`vagrant halt`などで停止状態にした後再度`vagrant up`した場合でも以下実行してください。

```
$ vagrant ssh-config > ssh.config
```

▼ssh.configは以下のようになります。

```
Host default
  HostName 127.0.0.1
  User vagrant
  Port 2222
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile /Users/kenzo/Vagrant/Vagrant-Ansible/centos6/.vagrant/machines/default/virtualbox/private_key
  IdentitiesOnly yes
  LogLevel FATAL
```

※IdentityFile のパスはgitをcloningし、vagrant upしたパス配下のprivate_keyが指定されます。

▼ansible.cfg

Ansibleの設定ファイルに以下設定しておくとコマンドがシンプルになります。
イベントリファイル `hostfile = hosts`
ssh接続時の設定 `ssh_args = -F ssh.config`

```
[defaults]
hostfile = hosts

[ssh_connection]
ssh_args = -F ssh.config
```

▼hosts

Vagrantのnode名は変更していない限り、`default`なので
defaultを指定しています。
Ansibleはこのhostsで指定したnodeにしかアクセスできません。

```
default
```

#### 5. VM疎通テスト

それでは疎通テストしてみましょう。

```
$ ansible default -m ping
```

※defaultというnodeに対し、-m でモジュール(コマンド)指定しています。

```
default | success >> {
    "changed": false,
    "ping": "pong"
}
```
上記のようにsuccessと出力されれば成功！
疎通確認でき、環境構築準備が整いました。

#### 6. Ansibleで環境構築実行

```
$ ansible-playbook lamp.yml
```

※時折、Timeoutが確認されましたが、再度実行いただくと問題なく構築されたことを確認してます。

簡単にlamp.ymlについて概要説明です。

* httpdインストール

```
A. httpdをビルドする為に必要な以下モジュールをインストールしビルド
- APR (Apache Portable Runtime)
- APR-Util (Apache Portable Runtime Util)
B. ドキュメントルートを /var/www/htmlに変更
C. apacheユーザ追加
D. 起動スクリプト登録/起動
```

* mysqlインストール

```
A. mysqlをビルドする為に必要な以下モジュールをインストールしビルド
- CMAKE
B. mysqlユーザ追加
C. 起動スクリプト登録/起動
```

* PHP

```
A. PHPソースをインストールしビルド
```


#### 7. Apache起動確認

<http://192.168.33.10>にアクセスし
`Working!`と表示されれば成功

#### 8. phpからMySQLへの接続確認

<http://192.168.33.10/dbtest.php>にアクセスし
`Connect Success: Localhost via UNIX socket`
と表示されれば成功

以上です。

---

その他、Vagrant+AnsibleでCentOS7にSentry構築も個人ブログですがまとめました。

<http://kenzo0107.hatenablog.com/entry/2015/05/10/234645>

今度は Vagrant+Ansibleで nginx + golang 環境構築 辺りを着手してみよう♪
【bxSlider】jQueryでappendしたHTMLを動かす

jQueryでappendしたHTMLをbxSliderで動かすときはそのままじゃ動かないみたいなのでメモ。

#HTML（そのままでOK）

```html
<ul class="bxSlider">
</ul>
```

#js

```js
/* bxsliderを呼び出すのを変数にする */
var slider = $('.bxSlider').bxSlider({
	//設定
});

/* append */
var slideDate = '<li><a href="http://qiita.com/"><img src="https://pbs.twimg.com/profile_images/842946405/profile_img_normal.png"></li>';
$('.bxSlider').append(slideDate);

/* appendしたあとにリロード */
slider.reloadSlider();
```

参考：[Examples | Responsive jQuery Slider | bxSlider](http://bxslider.com/examples/reload-slider)
GAEデプロイ失敗からのロールバック方法


mac環境 + gae + eclipse です。
たまに起きるけど起きた時に対処方法忘れているのでいい加減メモ。

## デプロイに失敗するとき
gaeデプロイがversion数上限で失敗したり、途中でデプロイを中止したりすると今後対象のバージョンに再デプロイしようとするとエラーが出る

appcfg rollbackしろ

![スクリーンショット 2015-05-20 14.02.45.png](https://qiita-image-store.s3.amazonaws.com/0/32138/0f6399d9-43cd-d2e7-278f-03d962399ac5.png "スクリーンショット 2015-05-20 14.02.45.png")

## appcfg rollback


workspace内の該当プロジェクトのwarを指定。

```
$ sudo /Applications/eclipse/plugins/com.google.appengine.eclipse.sdkbundle_1.9.20/appengine-java-sdk-1.9.20/bin/appcfg.sh rollback ~/Documents/workspace/xxxxxx/xxxxxx/war/
```

#### "Command not Found"とか出たら

以下を実行してからappcfg.shを実行する

```
$ sudo chmod 755 /Applications/eclipse/plugins/com.google.appengine.eclipse.sdkbundle_1.9.20/appengine-java-sdk-1.9.20/bin/appcfg.sh
```

```
$ sudo chmod 755 /Applications/eclipse/plugins/com.google.appengine.eclipse.sdkbundle_1.9.20/appengine-java-sdk-1.9.20/bin/run_java.sh
```

## appcfg.sh実行

コンソールに Please enter code:とか出る。
コードって何？って思ったらブラウザ（safari）起動以下画面が表示される。
このコードを入力すればrollbackが完了し、再デプロイできるようになる。

![スクリーンショット 2015-05-20 14.04.48.png](https://qiita-image-store.s3.amazonaws.com/0/32138/a9a8c70a-6dc7-7b8e-b597-d028e7221665.png "スクリーンショット 2015-05-20 14.04.48.png")
gitのローカルのブランチ名を変更したい

ローカルのブランチ名を変更する方法です。Pull Requestのissue番号を間違っていたときなどに活躍します。

```sh
git branch -m <古いブランチ名> <新しいブランチ名>
```

今開いているブランチをリネームする場合は、単純に新しいブランチ名を指定するだけです。

```sh
git branch -m <新しいブランチ名>
```

---

最後までお読みくださりありがとうございました。Twitterでは、Qiitaに書かない技術ネタなどもツイートしているので、よかったらフォローお願いします:relieved:→[Twitter@suin](https://twitter.com/suin)
オンプレなインフラエンジニアがAWSを使った時にはまりそうなこと

オンプレなインフラエンジニアがAWSを使った時にはまることをメモしておく

- RDS のタイムゾーンが UTC（協定世界時）にしか対応してない
 - アプリで対応してもらうことになる
- ELB には固定IPを振れない
 - CNAME で名前解決させる
- Direct Connect も計画停止する
 - 複数契約して冗長構成にしておく
- RDS ではレスポンスタイムを期待しない
 - おそらくオンプレよりは悪くなるがデータ増加時でもさほど悪化しない
- ELB は L7 機能を持たない
 - ElastiCache 等で他サービスで代替する
- 公式AMIにはswap領域が追加されていないものもある
 - 初期構築時に確認しておく
Go : float64からintにキャストすると切り捨てになる

float64からintにキャストすると切り捨てされる　※実行結果[2]参照

http://play.golang.org/p/jaMp35UTxA

```go:main.go
package main

import "fmt"

func main() {
	a := 2.0 / 3.0 * 100 // float64になる
	fmt.Println("[1] float64 で出力 ：", a)
	fmt.Println("[2] int で出力     ：", int(a))	
	b := int(a) // float64からintにキャスト
	fmt.Println("[3] float64 で出力1：", float64(b))
	fmt.Printf("[4] float64 で出力2： %f\n", float64(b))
}
```

実行結果

```
[1] float64 で出力 ： 66.66666666666667
[2] int で出力     ： 66
[3] float64 で出力1： 66
[4] float64 で出力2： 66.000000
```
ubuntu 14.04で redmineのインストール・バックアップ・リストア（その１）

次のミッションはHDDが一個しかない業務系のサーバのお引越し
その第一弾がそのサーバで動いているredmineの移動です。

まず redmineのインストールから

##redmineのインストール
http://www.wildwest-service.com/redmine_on_ubuntu1404/
こちらを参考に（ほぼコピペ）で進めていきます。

ということで、どんどん一気にいくよー！

### 必要なパッケージのインストール

```
apt-get update
apt-get install -y apache2 libapache2-mod-passenger
apt-get install -y mysql-server mysql-client
※パスワード聞かれたりと。。。

apt-get install -y Redmine Redmine-mysql
※途中質問されたけど日本語だったからよかった～
```

### 色々設定

shellで

```
cd /etc/apache2/sites-available
cp -iv 000-default.conf redmine.conf
```

コピーしたコンフィグを開いて変更

```apache:/etc/apache2/sites-available/redmine.conf
<VirtualHost *:8000>

ServerAdmin webmaster@localhost
ServerName redmine
DocumentRoot /usr/share/redmine/public
```

その他コンフィグも

```apache:etc/apache2/ports.conf
Listen 8000
```

redmine用ポートを追加


```apache:/etc/apache2/mods-available/passenger.conf
PassengerDefaultUser www-data
```

追加

## Bundlerのインストール

```
sudo gem install bundler

cd /usr/share/redmine/public
sudo chmod 777 /usr/share/redmine
bundler install --without development test rmagick postgresql sqlite
sudo chmod 755 /usr/share/redmine
```

※ほとんどコピペですけど ubuntu 14.4 はいらない気がする

これで <インストールしたサーバのIP>:8000でradmineが見えます。
google のサイト内検索に javascript を使わずに form　からの飛ばす方法


下記で google のサイト内検索の結果ページの飛ぶ。
`target="_blank"` は必要に応じて。

``` html
      <form action="https://www.google.co.jp/search" target="_blank" class="google-search">
        <input type="hidden" name="q" value="site:http://ndinc.jp/">
        <input type="text" name="q">
      </form>
```
全角英数を半角にする

メモを取ってると半角全角が入り乱れるので、英数字だけ置換しちゃいたかった。
置換だけできればいいのでやっつけ仕事

```henkan.c

#include <stdio.h>

int main( void ){

 FILE *fp,*fpo;
 char *fname = "hogehoge.txt";
 char s[100];
 unsigned char *p;
 unsigned int moji;

 fp = fopen( fname, "r" );
 if( fp == NULL ){
    printf( "no open ?n");
    return -1;
 }
 fpo = fopen("hogehoge.dat","w");
 
 while( fgets( s, 100, fp ) != NULL ){
  for ( p = s ; *p != '\0' ; p += 2 ){
	moji = (p[0] << 8) | p[1];
	moji = _mbctombb( moji );

	if((p[0]==130)&&(p[1]<=154)){
		fprintf(fpo,"%c",moji);
	}else if((p[0]<=127)) {
		fprintf(fpo,"%c",p[0]);
		p=p-1;
	}else{
		fprintf(fpo,"%c%c",p[0], p[1]);}
  }
 }
  printf( "done ?n" );
  fclose( fp );
  fclose( fpo );
  return 0;
}
```

ファイルのパスを直に書いてるあたりすごいやっつけ仕事だった
Unity-Android でMACアドレスを取得


以下のようにWifiManagerからMACアドレスを取得

```Sample.cs
	string macAddr = "";
	if (null == m_wifiManager) {
		using (var activity = new AndroidJavaClass("com.unity3d.player.UnityPlayer").GetStatic<AndroidJavaObject>("currentActivity")) {
			m_wifiManager = activity.Call<AndroidJavaObject>("getSystemService", "wifi");
		}
	}
	macAddr = m_wifiManager.Call<AndroidJavaObject>("getConnectionInfo").Call<string>("getMacAddress");
	return macAddr;

```


# 参考

* http://forum.unity3d.com/threads/android-and-iphone-macaddress.108506/
* http://answers.unity3d.com/questions/33213/how-i-get-local-physical-address-mac-address.html
* http://stackoverflow.com/questions/6232556/do-android-phones-have-a-mac-address-when-connected-to-3g
iOSデバイス上のアプリケーションコンテナの内容を確認する方法


iOSのバージョンが上がって、iFunBoxなどのサードパーティ製アプリでのアプリケーションコンテナの参照ができなくなったので、それに代わる方法を調査した。

以下のとおり、Xcodeを使えば、自分でビルドしたアプリについてアプリケーションコンテナの内容を確認できるらしい。


Xcode を立ち上げ、メニューから Window - Devices を選択。
開いた画面の左側"DEVICES"から参照したいデバイスを選択。

![スクリーンショット 2015-05-20 13.10.33.png](https://qiita-image-store.s3.amazonaws.com/0/8219/0cf4dff3-6b7d-dac9-a82c-4a70d03bac60.png "スクリーンショット 2015-05-20 13.10.33.png")


Installed Apps から参照したアプリを選択して、歯車マークをクリックし表示されるメニューから Show Container を選択。

![スクリーンショット 2015-05-20 13.10.42.png](https://qiita-image-store.s3.amazonaws.com/0/8219/cefb5aba-50ce-04d2-1e65-910cbc0bcbdc.png "スクリーンショット 2015-05-20 13.10.42.png")

すると、以下のようにアプリケーションコンテナのファイル等が参照できる。

![スクリーンショット 2015-05-20 13.11.25.png](https://qiita-image-store.s3.amazonaws.com/0/8219/ca836617-d4f0-a4e1-49f5-b920236aa548.png "スクリーンショット 2015-05-20 13.11.25.png")


#参考

アプリケーションの配布に関するガイド(pdf)
https://developer.apple.com/jp/documentation/AppDistributionGuide.pdf
LaravelのEloquentで複数の項目のsumをする

#なんでこの記事を書いたか

pointsテーブル

```php
+--------+----------------+
|id      |  point|    used|
+-------------------------+
|       1|     10|      10|
+-------------------------+
|       2|     20|      11|
+-------------------------+
|       3|     30|      12|
+-------------------------+
|       4|     40|      13|
+-------------------------+

```
このようなテーブルがある。
pointは総ポイント、usedは使用済ポイント
全ユーザの所持ポイントと使用済みポイントの合計を知りたい時

```php
$point_sum = Point::sum("point");
$used_sum = Point::sum("used");
```
のように、２行で書く必要がある。
この場合、SQLクエリは2回流れる（はず）

できれば１度のSQLクエリで結果を得たい。

#他の問題点
- groupByできないよね
- where句をつけたら条件の数だけコードが増えるよね

#解決方法 ?

```php
Point::select(DB::raw("sum(point) as total_point,sum(used) as total_used"))->get();
```

このようにする

また

```php
Point::select(DB::raw("sum(point) as total_point,sum(used) as total_used"))->where("point","=","used")->get();
```

のように、where句をつけるとができ、ポイントを使い切っていない人のみの集計などができる

```php
Point::select(DB::raw("type,sum(point) as total_point,sum(used) as total_used"))->groupBy("type")->get();
```

※type列をテーブルに追加したと仮定して
typeごとの集計なども得られる

#問題点
DB::raw()になるので、中の式が固定になる（動的に文字列結合とかは怖い）

他にいい方法があれば教えてください
今さらIE8の互換表示モードに悩まされた時

もはや切り捨ててもいいんじゃないか感はんぱではないIE8ですが、
業務上やむを得ず対応しないといけないことはままあります。

IEとえば互換表示モードなるものがあり、親切にも以前のIEバージョンでも動作するようにしてくださっていて、
それが原因で最新のブラウザーモードとドキュメントモードにしておけば問題なく表示されるところを、
これまた親切にもIEがよしなに互換表示モードに切り替えてくださることで、
見事表示が崩れるという素敵現象が発生することがあります。

基本的にこういった事態を回避する方法としてよくあるのが、
htmlのheadタグ内に以下のmetaタグを記入して互換表示モードにさせないというものがあります。

```html:まほうのじゅもん
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<!-- IE=edge,chrome=1 とすることもある -->
```

基本的にはこれで問題ないことが多いのですが、(事実今まではこれで何とかなってた)
何故か急にこの指定が効かなくなり、
エラーが発生した旨のポップアップとともに強制的に互換表示モードにさせられる謎現象にハマりました。
(なったりならなかったり、開発者モードで設定かえるとなおったりする)

あれこれ試行錯誤した結果、
サーバーのレスポンスヘッダにも

```apache:/etc/httpd/conf/httpd.conf
Header set X-UA-Compatible 'IE=edge'
```
のように`X-UA-Compatible: IE=edge`を追加したところ見事解決しました。
(そもそも互換表示に切り替えるボタン自体disabledになる)

なので同じような問題に幸運にもぶち当たった方は一度お試しいただくといいかもしれません。
jsinspectを使ってJavaScriptの類似コードを探す


[jsinspect](https://github.com/danielstjules/jsinspect)はJavaScriptの類似コードを見つけてくれるツールです。
ES6にも対応しています。

# インストール

```
npm install -g jsinspect
```

# 使い方

ソースコードのあるディレクトリを指定します。

```
jsinspect ./
```

ライブラリを含めると鬼のように時間がかかるので気をつけましょう。

# 結果

以下のように発見した類似コードを表示してくれます。


![スクリーンショット 2015-05-20 12.12.53.png](https://qiita-image-store.s3.amazonaws.com/0/15964/4ef6acac-beda-84fc-c823-ae2b60ec437f.png "スクリーンショット 2015-05-20 12.12.53.png")

ファイル名と行数を頼りに、ファイルを見比べると大体わかります。

# 便利な使い方

検出数が多過ぎる場合は`-t`オプションを使います。
20を指定するとだいぶ減ります。
0件になってしまった場合は少し19にするなど、少し減らします。
まだ多過ぎる場合は21などに増やします。
デフォルトは15です。


# 参考
[jsinspect·JavaScriptアプリケーションの類似コードを検索 MOONGIFT]
(http://www.moongift.jp/2014/11/jsinspect-javascript%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E9%A1%9E%E4%BC%BC%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E6%A4%9C%E7%B4%A2/)
文字の幅と文字のバイトの違い。

#結論からいうと、、
公式より
>マルチバイト文字は、通常はシングルバイト文字の倍の幅となります。
[mb_strwidth()](http://php.net/manual/ja/function.mb-strwidth.php)

aの幅は1
あの幅は2

UTF8の場合
aは1byte
あは3byte

|    |      byte      |  幅 |
|----------|:-------------:|:------:|
| こ |  3 | 2 |
| こん |  6 | 4 |
| こんにちは |  15 | 10 |
| a |  1 | 1 |
| abc |  3 | 3 |
| abc012#$#% |  10 | 10 |
| こんにちabc |  15 | 11 |
| \n |  1 | 1 |
| \r\n |  2 | 2 |
*byteはstrlen()、幅はmb_strwidth()で取得。


##どこで問題になるのか
[mb_strimwidth](http://php.net/manual/ja/function.mb-strimwidth.php)
気軽にこれを使おうとしてwidthの正体に悩まされて泣かされました。

ここで言う幅はbyteではなく**mb_strwidth()の幅**です。
これでスッキリきっかりstrimwidthできますね！

[substr()](http://php.net/manual/ja/function.substr.php)とか[mb_strcut()](http://php.net/manual/ja/function.mb-strcut.php)の引数$lengthは**byte**です。

幅って書いてあるし、すぐ分かったやろという残念な感じになってしまいましたが。
cocoapods インストールしても command not found: pod と言われた時の対処法

### **事象**

cocoapodsインストールをしたのに、``` command not found: pod ``` と言われた。

```
$ sudo gem install cocoapods
$ pod setup
zsh: command not found pod
```

### **対処法〜その1〜**
#### **ターミナル再起動**

うまくいかなかった。。

### **対処法〜その2〜**
#### **rbenv rehash**

こっちでうまくいった。

```
$ rbenv rehash
$ pod setup
```

### **参考**

- [sudo gem install cocoapodsしてもpodコマンドが使えない](http://qiita.com/shoma2da/items/77bf092a5536422ffb40)
- [【SwiftからXcodeを使う人対象】Cocoapodsのインストール](http://qiita.com/kiiita/items/44300246d1b8a4df0e53)
Rails4でtrailing_slashを付与する

### **前提**

- Ruby 2.1.5
- RubyOnRails 4.2.0

### **trailing_slashって？？**

URLの一番最後（末尾）にあるスラッシュ「/」のこと
（こんな説明は不要かと思いますが、念のため。。。）

### **trailing_slashを付与する方法**

#### :one: **全てのURLに対して付与したい場合**

```rb:application.rb
class Application < Rails::Application
 
    # Add trailing slash
    config.action_controller.default_url_options = { :trailing_slash => true }
 
end
```

#### :two: **一部のURLに対して付与したい場合**

```rb:routes.rb

  get 'hoge/:id' => 'hoge#show', trailing_slash: true

```

### **参考資料**

- [Railsでトレイリングスラッシュを自動付加](http://www.yefisys.com/blog/2014/01/04/trailing-slash-in-rails/)
- [Enforce trailing slash in Rails Routing](http://stackoverflow.com/questions/16218670/enforce-trailing-slash-in-rails-routing)
- [How to add a trailing_slash to all urls without in Rails 4?](http://stackoverflow.com/questions/23097756/how-to-add-a-trailing-slash-to-all-urls-without-in-rails-4)
vimでsudoを付け忘れた時に…

# こんな経験にあったことはありませんか

![スクリーンショット 2015-05-08 16.50.20.png](https://qiita-image-store.s3.amazonaws.com/2409/74539/addc49c1-5967-2f3a-b60d-a869e3b67017.png)

「うわーん、ドラ◯もん！sudoつけ忘れたよぉ！」

# 解決方法

```bash
:w !sudo tee > /dev/null %
```

# 覚えられないよ
.vimrcに

```bash
# 保存時にsudo権限で無理やり保存
cnoremap w!! w !sudo tee > /dev/null %<CR> :e!<CR>
```

と設定し、vimで保存時に

```bash
:w!!
```

# 注意事項
- そもそもsudo権限がない
- 3回以上パスワードを間違える
- ctrl+c等でキャンセルする

と編集がリフレッシュされて消えます.

これが嫌な人は、.vimrcを

```bash
# 保存時にsudo権限で無理やり保存
cnoremap w!! w !sudo tee > /dev/null %<CR>
```

に変更して

```bash
:w!!
```

で保存した後に

```bash
:e!
```

で再読み込みをするか

```bash
:q!
```

でバッファを閉じでください。
Base62変換をC#で

Base62というのは、ざっくりいうとBase64から記号を省いて、短縮URLなどに使いやすくしたものです。

使用する文字は、`'A'`～`'Z'`、`'a'`～`'z'`、`'0'`～`'9'`の62種類です。


Base64では、64種類の英数字記号に加えて、パディング記号が定義されていますが、Base62にはパディングがありません。したがって、Base62文字列からバイト配列に変換するときは、元のバイト配列の長さがどれだけだったかを外から与える必要があります。
（追記）すみません間違いでした。計算すればいいですね（1バイトはBase62だとおよそ1.35文字）。コードを直しました。（さらに追記）とはいっても長い文字列から正しいバイト数を誤差なく計算するのは難しいです……が、2GB (≒2^31バイト)あたりまで誤差なく計算できれば問題ないでしょう。

```csharp
using System;
using System.Linq;
using System.Numerics;
using System.Text;

class Base62
{
    public static string ToBase62String(byte[] bytes)
    {
        if (bytes == null) throw new ArgumentNullException("bytes");
        if (bytes.Length == 0) return "";
        var charLength = (int)Math.Ceiling((double)bytes.Length * Math.Log(256d, 62d));

        const string characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
        var number = ToUnsignedBigInteger(bytes);

        var chars = new char[charLength];
        var base62 = new BigInteger(62);
        for (var i = 0; i < charLength; i++)
        {
            BigInteger mod62;
            number = BigInteger.DivRem(number, base62, out mod62);
            chars[i] = characters[(int)mod62];
        }
        return new string(chars);
    }

    static BigInteger ToUnsignedBigInteger(byte[] bytes)
    {
        var zeroAppended = new byte[bytes.Length + 1];
        bytes.CopyTo(zeroAppended, 0);
        var unsigned = new BigInteger(zeroAppended);
        return unsigned;
    }

    public static byte[] FromBase62String(string s)
    {
        if (s == null) throw new ArgumentNullException("s");
        if (s.Length == 0) return new byte[0];
        var byteLength = (int)Math.Floor((double)s.Length * Math.Log(62d, 256d));

        var number = new BigInteger(0);
        var base62 = new BigInteger(62);
        for (var i = s.Length - 1; i >= 0; i--)
        {
            var c = s[i];
            number = number * base62 + new BigInteger(FromBase62Char(c));
        }

        // BigIntegerのToByteArray()メソッドだと、
        // 末尾にゼロが続くケースなどで正しいバイト長が得られないため
        // 文字列長から計算したバイト長を元にバイト配列化する
        var bytes = new byte[byteLength];
        var base256 = new BigInteger(256);
        for (var i = 0; i < byteLength; i++)
        {
            BigInteger mod256;
            number = BigInteger.DivRem(number, base256, out mod256);
            bytes[i] = (byte)mod256;
        }
        return bytes;
    }

    static int FromBase62Char(char c)
    {
        if ('A' <= c && c <= 'Z')
        {
            return (int)c - (int)'A';
        }
        else if ('a' <= c && c <= 'z')
        {
            return 26 /*A-Z*/ + (int)c - (int)'a';
        }
        else if ('0' <= c && c <= '9')
        {
            return 26 /*A-Z*/  + 26 /*a-z*/ + (int)c - (int)'0';
        }
        throw new ArgumentOutOfRangeException("c");
    }
}
```
OS X Yosemite (v10.10 ) で DNS キャッシュを削除するコマンド

ターミナルで下記のコマンドを実行する。

```sh
$ sudo dscacheutil -flushcache
```

# 参考

- [OS X：DNS キャッシュをリセットする方法 - Apple サポート](https://support.apple.com/ja-jp/HT202516)
PostgreSQL の日本語ロケールの LIKE で INDEX を使用する

LIKE の前方一致で INDEX を使用できるのは、 C ロケールのみです。
日本語のロケールを使用した場合は、 INDEX を張っても、通常使用できません。

日本語のロケールで LIKE に INDEX を使用したい場合は、 INDEX に **text_pattern_ops** を指定します。

```sql
CREATE INDEX index_name_idx ON table_name (column_name text_pattern_ops);
```

こうすることで、前方一致の場合のみ INDEX を使用可能です。

### 参考

[Let's Postgres - ロケール(国際化と地域化)](http://lets.postgresql.jp/documents/technical/text-processing/2)
c++ builder > XE4 | 10.2 Tokyo > フォルダ名を分割取得 > (A\\B\\C)をA, B, Cとして取得 > DelimitedText を使う

```txt:動作確認
C++ builder XE4
```

A\\B\\C
というフォルダ名の文字列からA, B, Cを個別に取得したい。

http://www.gesource.jp/programming/bcb/121.html
にあるTStrings.DelimitedTextプロパティを使って取得した。

```cpp
String folder = L"A\\B\\C";

TStringList *list = new TStringList;
list->StrictDelimiter = true;
list->Delimiter = L'\\';

// list->CommaText でなく、DelimitedText に入れる
list->DelimitedText = folder;

delete list;
```

もっとさくっと使える関数があるのかもしれない。

### Tokyo 
(追記 2017/12/26)

```txt:動作確認
Rad Studio 10.2 Tokyo Update 2
```

問題なく動作した。
Teratermのマクロで"ホスト名＋プロンプト"待ちをして、waitの精度を上げる

```:ttl macro


   	sendln
	recvln

	strscan inputstr '#' ; 他には'>'など
	Count = result
	strcopy inputstr 1 (Count-1) HostName
```
;　あとはHost名＋Promptで待ちたいところにwaitを入れる。
wait HostName
```
20150515 Ruby講義memo

### 昨日の補足

succすごい

```rb
"test001Z".succ == "test002A"
```


#### 質問

+ 多態性がよくわからなかった
+ クラスとインスタンスの違い？

#### デバッグするときに pry-byebug が便利
http://blog.toshimaru.net/rails-pry-byebug/

```rb
biding.pry
```

#### デザインパターン

古い
http://www.amazon.co.jp/Ruby%E3%81%AB%E3%82%88%E3%82%8B%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3-Russ-Olsen/dp/4894712857
http://orangain.hatenablog.com/entry/design-patterns-in-ruby
http://blue1st.hateblo.jp/entry/2014/10/12/014015


Effective Rubyがいいよ
http://www.amazon.co.jp/Effective-Ruby-Peter-J-Jones/dp/4798139823/ref=sr_1_1?s=books&ie=UTF8&qid=1431650604&sr=1-1&keywords=Effective+Ruby

http://tbpgr.hatenablog.com/entry/20140515/1400160516
http://morizyun.github.io/blog/ruby-design-pattern-matome-mokuzi/
http://qiita.com/kidach1/items/4b63de9ad5a97726c50c

## Block

```rb
def block_args_test
  yield()
  yield(1)
  yield(1, 2, 3)
  yield(x:1, y:2)
end

block_args_test do |a|
  p [a]
end

puts
block_args_test do |a,b,c|
  p [a,b,c]
end

puts
block_args_test do |*a|
  p [a]
end
```

ブロック内の break 戻り値ありもできる。
ブロックをオブジェクトとして受け取る

## 数値

## 配列

 + index付の配列
 + 集合として
 + 列として　（cue,stack）

```rb
a = [1,2,3,4,5]
a[0,2] = [10,11,12] # 要素の置換
p a

a[0,0] = [101,102]  # 要素の挿入
p a

# 集合として
a1 = [1,2,3]
a2 = [3,2,5]
p a1 - a2
p a1 + a2
p a1 | a2
```

## String

```rb
p Encoding.name_list

str = "あたらしいString"
puts str[2..3]
p str.bytesize

# printf相当がこれで書ける
p "%04d" % 123
p "%04d + %05d" % [123,44]
```

## Hash

```rb

#最新バージョンでのハッシュは
p "a".hash
p :a.hash
```


Rubyによるデザインパターン　いい本だな。
この知見は共有したい。


## Hash

```rb
#最新バージョンでのハッシュは
p "a".hash
p :a.hash

s = Regexp.quote("abc*def+")
p s

$stdout.puts "output to $stdout"
$stderr.puts "output to $stderr"

p "abacdeafg".scan(/.a/)

s = "Ruby is Language"
p s[/Ru.*\s+/]

m = /(.)(\d\d)+(.)/.match "12345"
p m
p $1
p $2
p $3

```

## IO

### Time

```rb

require 'open-uri'
stringio

t = Time.parse("S54.3.4")
p t
now_t = Time.now

p t_r = (t..now_t)
p t_r.cover?( Time.parse("H20.4.1") )
```
20150514 Ruby講義memo

ruby association silver,gold 対策本は赤い本しかない、
あとはネットでみてみよう。

## 条件判断

奇数、偶数

```rb
p 3.even?
p 3.odd?
p 3.methods.grep /\?/
```

## 論理演算

```rb
p 3 || 5
p nil || 5
a ||= 3
a = a || 3 

# true,falseのみ返したい場合の使われる書き方
!!(a || 3)
```

unless の際も else は使えるが、紛らわしいため、非推奨。

case はobjectのクラスでも確認できる。
それは === 演算子を使用しているため。

unless は後置方式で使うことが多い。

eql? と equal? の違い。

## 繰り返し

1行で処理をかける場合のみ{}推奨。
map などで戻り値をさらに使いたい場合は複数行でも{}使う。

## method

ブロックつきメソッド呼び出しが便利さのひとつ

シンタックスシュガー

class.method はクラスメソッドで
class::TEISUU

module::method はモジュールのメソッドが多いかも

### method definition

キーワード引数をどんどん使いたい。
もう1.X系は使わないよね

```rb
def foo(x:0,y:0, **args)
  p [x,y,args]
end
foo(y:35,x:22,z:3)
foo(z:24,y:35,x:22)

# ハッシュからキーワード引数にもっていける
h = {y:2, x:5, z:9}
foo(h)
```


オブジェクト思考

p 1.instance_of?(Fixnum)

class

クラスメソッド　特異メソッド

```rb
class CC
  def self.hello(name)
    puts "test"
  end
end
```
クラス変数はあまり使わないほうがいい。

public, private, prtected が結構違うため確認してほしい。

## Open Class 

```rb
class RingArray < Array
  def [](i)
    idx = i % size
    super(idx)
  end
end

wday = RingArray.new(["a","b",'c','d'])
p wday[-1]

p RingArray.ancestors
```

undef

```rb
class << Time
  undef :now
end
p Time.now # no method error
```

特異クラス
特異メソッド

## Module

include　　インスタンスメソッドとして追加
  includeが複数あったら？
prepend
extend　クラスメソッドとして追加

<=> UFO演算子

## Object oriented

object自身が自分が何ができるか知ってたほうがよい

デザインパターン
http://qiita.com/kidach1/items/4b63de9ad5a97726c50c#1-3
GoF

## 演算子

### 範囲演算子

```rb
p ("a".."aa").to_a
p 3.succ
p -2.succ
p "z".succ
```

not, or, and は = より優先順位が低いため怖い

### 演算子を定義する

単項演算子は +@ -@ ~@ !@

## 例外

rescue 内での raise は補足した例外をそのまま投げる

```rb
def ee1
  File.open("/no/file") # raise err
end

def ee2
  ee1
end

ee2 rescue puts "1liner"

begin
  ee2
rescue => ex
 puts ex.message, ex.class, ex.backtrace
ensure
 puts "tets"
end
```

## Block
20150513 Ruby講義memo

# 20150513 Ruby講義

## 紹介
ruby -v 2.0.0p645 (2015-04-13) [i386-mingw32]

terapad
文字コードを指定してできるので選んでいる。

Rubyはプログラマが書きやすいのを目指している言語

るりま
http://docs.ruby-lang.org/ja/
http://docs.ruby-lang.org/ja/2.0.0/doc/index.html

インタプリタ
Rubyはインタプリタ言語ですので プログラムを実行するためにコンパイルする必要はありません。

変数に型が無い (動的型付け)
Rubyの変数はどのような型のデータも格納する事ができますので、 変数の型について心配する必要はありません。 半面、コンパイル時のチェックは弱くなります。

反面バグを見つけにくい


## install

windows installer

mac
ports
brew   rubyで書いているので楽


linux
apt
debian 向け

red hat系
cent os
rpm

rbenvもあるよ

rubyをbuild する場合、
依存するパッケージを入れておかないと
https://github.com/sstephenson/ruby-build/wiki


## editor

sublime 
補完機能があったりする。

私はvimをつかってるんですが

## gem
ローカルだけ探した場合
```
gem search -l pry
```

## bundler
gemをまとめて扱うことのデフォルト。ほぼこれ経由で使う。


## irb, pry
pry便利
色付けしてくれる
CTRL+r コマンド検索してくれる

## print method

"", ''
''は特殊文字どれも展開しない

## Ruby コーディング規準

Ruby コーディング規準 cookpad
https://github.com/cookpad/styleguide/blob/master/ruby.ja.md

github
https://github.com/styleguide/ruby

前田さんの

to_s, inspect はより人間への説明的。開発者向け、pメソッド向け

## 日本語の扱い

shift-jis で保存すると大変。
UTF-8N のほうであるべき。
http://www.solidpanda.com/book/article/944/
BOMなしが一般的

```
# encoding: Shift-JIS
```
を1行目に書くのが重要

sheban
実行ファイル指定
これがあるときはしょうがないので encoing は2行目に。

ここが一番簡単
Ruby M17N の設計と実装
http://magazine.rubyist.net/?0025-Ruby19_m17n

## 数字
2/3 は整数演算扱い

to_X は慣用的な名前

methods(false)
で当該クラスで追加したメソッドのみ表示できる

## 変数

マジックナンバーだめです
複数形には s とつけてやりましょう
変数名は説明的になるべく省略せずにしたほうがいい

## コメント

1行ごとでなく、ブロックごとでまとめて説明したほうがいい。
rdoc
http://ruby.gfd-dennou.org/tutorial/rdoc/


## 制御構造

例外とはなにか？　どう説明したらいいかな、、、

コマンドプロンプト　コマンド入力の途中でTABを押したら補完してくれるよ

if で戻り値を書ける

```calc.rb
a = 9
res = 
  if(a >= 10)
    "bigger"
  else
    "smaller"
  end
```

条件演算子　　cond ? a : b


### loop
while はそんなには使わないかな。
times 

pry 上で日本語打つと文字化けするな、irb上では大丈夫だな
chcp 65001

hash

symbolだと省メモリにつながる

### 正規表現

大文字小文字関係なしに比較
/Ruby/i =~ "RUBY"

```argv.rb
puts "最初の引数：#{ARGV[0]}"
ARGV.each.with_index(1) do |arg, i|
  puts "#{i}番目: #{arg}"
end
```
each.with_index(1)
が便利。

```read_file.rb
filename = ARGV[0]
reg_pattern = Regexp.new(ARGV[1])

file = File.open(filename)
file.each_line.with_index(1) do |line, i|
  if reg_pattern =~ line
    print "#{i}:#{line}"
  end
end

file.close
```

るりまサーチ

require_relative: 実ファイル位置から相対パスを見つけてくれる
require: 実行したフォルダから探す

グローバル変数は変更箇所が特定できないため、使いづらく、
あまり使わないほうがよい。

### 多重代入がまだ認識できていない

変数を入れ替える

```rb
a, b = b, a
```

るびまいいので見ましょう
http://magazine.rubyist.net/
AWSにCISCO ASA 5505でのVPN接続メモ

情報があまりなく苦労したのでメモります。

※追記（2015/7/15）
　常時VPN接続が要件でしたが、sla monitor対象をトンネルIPアドレスに
　していても不定期に接続が切れてしまうのでEC2のサーバIPアドレスを
　指定しました。それでもReKeyによる接続し直しが発生するようですが
　要件的には問題無いのでそちらの設定に変更しました。

#環境
[社内LAN] － [CISCO ASA 5505] － [ブロードバンドルータ] － [AWS VPC]
元々インターネット接続用のブロードバンドルータがあるためCISCOを配下に設置
グローバルIPは、ISPから5つほど取得済みなのでそのうちの一つを使用
グローバルIPは、NAT変換のため社内LAN向けIPと1対1で紐づけられている

***
1.CISCO ASA 5505初期設定
　INBOUND、OUTBOUNDインタフェースのVLANを設定しインターネットへの接続確認
2.AWS側でVPC、VPN環境を作成
　VPCウィザードを起動
　「1つのプライベートサブネットのみ、およびハードウェアVPNアクセスを持つVPC」を選択
　VPCネットワークアドレスはデフォルトを使用（10.0.0.0/24）
　作成後、VPN接続から「設定のダウンロード」ボタンをクリックし、カスタマーゲートウェイ用の
　設定ファイルをダウンロード
　*※IGW、EIPは使用しません。*
3.カスタマーゲートウェイ用のファイルの内容をCISCO ASA 5505に設定
　コンフィグモードに移行

　ファイルの内容
　80行目付近：access-list <outside_access_in> extended permit ip host AWSのトンネルIPアドレス（その１） host 社内LAN向けのグローバルIPに紐づけられているIPアドレス
　　　　　　　access-list <outside_access_in> extended permit ip host AWSのトンネルIPアドレス（その２） host 社内LAN向けのグローバルIPに紐づけられているIPアドレス
　94行目付近：access-list acl-amzn extended permit ip any <vpc_subnet> <vpc_subnet_mask>
　　　　　　　any　→　any4　に変更
　　　　　　　access-list acl-amzn extended permit ip any4 10.0.0.0 255.255.255.0
　108行目付近：crypto map <amzn_vpn_map> 1 match address acl-amzn
　　　　　　　<amzn_vpn_map>のラベルは、アンダースコアが使えないのでハイフォンに変更
　155行目付近：type echo protocol ipIcmpEcho <sla_monitor_address> interface <outside_interface>
　　　　　　　<sla_monitor_address>は、AWSから指定されているトンネルIPアドレスを指定

　
4.ダウンロードファイルには記載されていない設定（これを設定しないとトンネル開通後インスタンスにアクセスできない）
　コンフィグモードに移行
　VPN通信はNAT対象外とする以下の設定を実施
　object network LOCAL
　subnet 192.168.1.0 255.255.255.0　←　社内LANローカルサブネットの指定
　object network REMOTE
　subnet 10.0.1.0 255.255.255.0　←　AWS側EC2インスタンスを生成するサブネットの指定
　nat (inside,outside) source static LOCAL LOCAL destination static REMOTE REMOTE

5.開通の儀式
　CISCO ASA 5505側でADSMツールやコマンドラインからのshowコマンドを利用して
　トンネルがMM_ACTIVEになっていることを確認
　社内LANのPCなどからEC2インスタンスIPアドレスに対してpingコマンドを実行
　*※AWS側のネットワークACLは、pingが通るように設定しておくこと*
How to Remove All Gems

全ての gem を削除する方法。

```bash
% gem uninstall -axI
```

以下の gem が残ったけど、まあいいや…。

```
*** LOCAL GEMS ***

bigdecimal (1.2.7, 1.2.6)
bundler-unload (1.0.2)
executable-hooks (1.3.2)
gem-wrappers (1.2.7)
io-console (0.4.3)
json (1.8.2, 1.8.1)
psych (2.0.13, 2.0.8)
rake (10.4.2)
rdoc (4.2.0)
rubygems-bundler (1.4.4)
rvm (1.11.3.9)
```
GitLab Omnibusを操作するコマンドたち

# 1. はじめに

メモ書きです．
Ubuntu 14.04，GitLab 7.10.4の状態で．

# 2. rake

バックアップなら，
```
sudo gitlab-rake gitlab:backup:create
```
バックアップしたファイルのレストアは，
```
sudo gitlab-rake gitlab:backup:restore BACKUP=<file_name>
```

# 3. rails

console操作したいとき
```
sudo gitlab-rails console
```

# 4. ctl

ログを見たいとき
```
sudo gitlab-ctl tail
```

/etc/gitlab/gitlab.rb
の変更を反映するとき
```
sudo gitlab-ctl reconfigure
```

# 5. version

最新版を入れたいとき
```
sudo aptitude update
sudo aptitude install gitlab-ce
```
バージョン指定(ダウンも含めて)したいとき
バックアップをレストアするときにバージョンが異なるとできないので，
その辺りやGitLabの最新版で問題がある場合
```
sudo apt-cache showpkg gitlab-ce
```
```
Provides: 
7.10.4~omnibus.1-1 - 
7.10.4~omnibus-1 - 
7.10.1~omnibus.2-1 - 
7.10.1~omnibus-1 - 
7.10.0~omnibus.4-1 - 
7.10.0~omnibus.3-1 - 
7.10.0~omnibus.2-1 - 
7.10.0~omnibus.1-1 - 
7.10.0~omnibus-1 -
```
```
sudo aptitude install gitlab-ce=7.10.0~omnibus-1
```
phpでリダイレクト（301）

突発的に、ほとんど知識のないphpでリダイレクト処理を記述することになり。
その時のメモ。


# 結果的に採用した記述内容
301を指定して、Locationにリダイレクト先のURL（絶対パス）を記述する。

```
<?php
header( "HTTP/1.1 301 Moved Permanently" ); 
header( "Location: http://***.jp/" ); 
exit;
?>
```

記述内容について確認した点
---
1. header関数より前に一切の記述がないこと（それ以降の記述はそもそも読み込まれない）
2. 301の指定があること
3. **exitしていること（※ 2015/05/21追記）**

**（※ 2015/05/21追記）
✕「それ以降の記述はそもそも読み込まれない」
→ それ以降の記述も実行はされるので、「読み込まれない」は誤り。**

すごく基本的な記述位置（上記 1.）に関することが分からなくて苦戦した。。
header関数の記述位置はDOCTYPE宣言よりもhtmlタグよりも前。

301と302
---
301は検索エンジンに蓄積されたデータも関連付けがされ引き継ぐことができるため、SEOを考慮すると重要。

* 301 ・・・ 恒久的な移転（引越し）
* 302 ・・・ 一時的な移転（いずれ帰ってくる短期・長期の旅行）


# php以外のリダイレクト方法
時間の都合上phpで記述することがほぼ確定ではあったけど、一応それ方法以外も検討。

metaタグ（refresh）
---
遷移するまでの秒数を「0」にするとスパム判定がされペナルティがつけられるという説があり。
301, 302の指定もできないため、実装は手軽でリダイレクト自体の機能は十分に果たせるかもしれないが、広い目で見ると内容不十分。

```
<meta http-equiv="refresh" content="0（遷移するまでの秒数）;URL=http://***.jp/">
```

.htaccess
---
301の指定も可能。
phpが1ページずつ個別に記述する必要があるのに対し、1ファイルにまとめて記述でき、
その内容もファイル別、ディレクトリ別など、より多岐にわたった指定が可能。

```
RewriteEngine on
RewriteRule ^***.html$ http://***.jp/***.html [R=301,L]
```


# できることならリダイレクトは.htaccessで設定したかったな
設定内容の詳細度や管理面を考慮すると、
.htaccessで設定できるならそれに越したことがなさそうだな、という印象。

次回からもうちょっと先手打って検証しよう。。
検索結果の様々な並び替え方

モデルから検索結果を取得するときのデータ並び替え方法についてまとめます。

#シンプルな並び替え
orderオプションに「カラム ASC or DESC」並び替えできます。

```php:単純にカラムの昇順（ASC）・降順（DESC）を指定する例
//商品データを名前の昇順（ASC）で並び替えて取得
$this->Item->find('all', array('order' => array('Item.name ASC')));

//商品データを名前の降順（DESC）で並び替えて取得
$this->Item->find('all', array('order' => array('Item.name DESC')));
```

#複数カラムを組み合わせた並び替え
組み合わせもカラムを複数指定するだけでできます。

```php:複数カラムを順に指定する例
//商品データを名前の昇順（ASC省略）、更新日の降順（DESC）で並び替えて取得
$this->Item->find('all', array(
	'order' => array('Item.name', 'Item.updated DESC')
));
```

#アソシエーションしたモデルを使った並び替え
以下のようにItemにCategoryがバインドされているという前提でならバインドされたモデルのカラムを指定することも可能。

```php:バインドモデルによる並び替え例
//商品データ（Item）と商品カテゴリ（Category）をバインドする
$this->Item->bindModel(
	array('belongsTo' => array(
		'Category' => array(
			'foreignKey' => 'category_id'
		)
	))
);
//商品データをアソシエーション先の商品カテゴリ名の昇順（ASC）で並び替えて取得
$this->Item->find('all', array('order' => array('Category.name ASC')));
```

#ランダムな並び替え
毎回ランダムなパターンで並び替えたい場合もあるかと思います。

```php:ランダムな並び替え例
//商品データをランダムに並び替えて取得
$this->Item->find('all', array('order' => 'RAND()'));
```

#順番を指定した並び替え
取得したい順番が決まっている場合、データ取得した後でこの並びにソートし直すのは面倒ですので以下のように並び替えることができます。

```php:順番を指定して並び替える例
//商品データを指定したID順に並び替えて取得
//以下の場合、Item.idが24,50,351,142,345,78の順でデータが取得できる
$this->Item->find('all', array(
	'order' => 'FIELD(Item.id,24,50,351,142,345,78)'
));
```
VBAでR1C1表示形式とA１表示形式を切り替える方法

vbaで大量のエクセルブックの表示形式をA1形式に統一する必要があったので
その時の備忘録。


```
Function changeViewStyle(sheetobj As Worksheet)
    If (Application.ReferenceStyle = xlR1C1) Then
        Application.ReferenceStyle = xlA1
    ElseIf (Application.ReferenceStyle = xlA1) Then
        Application.ReferenceStyle = xlR1C1
    End If
End Function
```
Github Pagesのブランチを作成する

make-gh-pages.sh

    githubAccount=XXXXXX
    projectName=XXXXXX

    mkdir ${projectName}
    cd ${projectName}
    git init
    git symbolic-ref HEAD refs/heads/gh-pages
    rm .git/index
    git clean -fdx
    echo "Hello World" > index.html
    git add .
    git commit -a -m "init"
    git remote add origin https://github.com/${githubAccount}/${projectName}.git
    git push origin gh-pages
Mac版Excelショートカット

|内容|ショートカット|
|---|---|
|行/列/セルの追加|[control] + [i]|
|行/列/セルの削除|[control] + [k]|
|セル内改行|[command] + [option] + [enter]|
|SUM|[command] + [shift] + [t]|
|外枠罫線|[command] + [option] + [0]|
|一辺の罫線|[command] + [option] + [矢印キー]|
|罫線クリア|[command] + [option] + [-]|
|直前の動作を繰り返す|[command] + [y]|
|左右シート切替|[control] + [上下キー]|
|左揃え|[command] + [L]|
|中央揃え|[command] + [E]|
|右揃え|[command] + [R]|
|太字設定の切替|[command] + [B]|
|表示拡大/縮小|[control] + [command] + [スクロール]|
docker run時に日本標準時間(Asia/Tokyo)にする

```bash:
run -it -d --env TZ=JST-9 -p 8000:8000 \
  vanjanssen/apache-bloodhound
```

というように`--env TZ=JST-9`をくっつければJSTになる。[CoreOSのtimezone設定](http://qiita.com/tukiyo3/items/969af2cdbbd0d20ab0fd)

## ついでにapache-bloodhoundの説明

* http://ipaddr:8000/main/login
* admin / adminpassword

でアクセスが出来る。
Observableでつまづいた

Observableを使用していた際につまづいたことで得た知見もどき。

遭遇した事案の擬似コード

```
CompositSubscription subscriptions = new CompositSubscription();

...

Observable<Integer> numberObservavle = Client().getNumber()
									  .map(Response::Entity)
								      .toBlocking()
								      .single();
								      
subscriptions.add(AppObservable.bindActivity(this,
							numberObservable.map(/*以下略*/)
							).subscribe());	
```

かなりてきとーだけど、上記のようなコードを実行しようとすると、subscription.add()の部分でnumberObservableの処理が終わらないままになってしまう。

このコードだと、numberObservableObservable<Integer> numberObservavle = ... の部分ではnumberOnservableはあくまで処理待ちの状態になっただけで、実際はsubscriptions.add(bindActivity())で実行される。

これを解消するにはnumberObservableの.toBlocking().single()をなくすと
subscriptions.add(bindActivity())で期待通り実行される。

なので、下記みたいに書き直せばOK。

```
(省略)

Observable<Integer> numberObservavle = Client().getNumber()
									  .map(Response::Entity);
								      
subscriptions.add(AppObservable.bindActivity(this,
							numberObservable.map(/*以下略*/)
							).subscribe());	
```

擬似コードという言い訳を使って、割りと適当に書いてるけどそのあたりはスルーしてください。

SB69早く観ないと・・・。