OmniAICreator/Qiita-1.07M huggingface dataset:
Cocos2d-xで作ったAndroidアプリに内包されているOpenSSLのバージョンを確認する

#Google Play warning: You are using a vulnerable version of OpenSSL
Google様から「てめぇの出してるアプリに入ってるOpenSSLのバージョン古いぞｺﾞﾗｧ！」ってメールが来た。

> Please migrate your app(s) to OpenSSL 1.02f/1.01r or higher as soon as possible and increment the version number of the upgraded APK. Beginning July 11, 2016, Google Play will block publishing of any new apps or updates that use older versions of OpenSSL. If you’re using a 3rd party library that bundles OpenSSL, you’ll need to upgrade it to a version that bundles OpenSSL 1.02f/1.01r or higher.

以前OpenSSLの脆弱性云々って話が出てたときは「使ってないし関係ないね(^^)」ってスルーしてた。

が、Cocos2d-xの中にはOpenSSLのライブラリが含まれてるので使ってなくても対応が必要な罠。
現時点でDeveloper Consoleにはアラート出てないけど対応しないと死ぬ。

※追記：アラート出てた
<img width="490" alt="スクリーンショット 2016-04-07 12.17.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/6380/529ff724-a0c0-6504-8310-a4b6d5afee87.png">

リンク先の記事内容はメール本文と一緒みたい
[How to address OpenSSL vulnerabilities in your apps - Google ヘルプ](https://support.google.com/faqs/answer/6376725)

#Cocos2d-xに内包されているOpenSSLのバージョンを確認する
内包されているOpenSSLのバージョンは、apk内をgrepして確認できる。

```
$ unzip -p hoge.apk | strings | grep "OpenSSL"
```

ちなみにCocos2d-x 3.3に内包されていたのは
**OpenSSL 1.0.1j**
 でした。

Google様からの警告文では「OpenSSL 1.02f/1.01r以上にしろ」とのお達しなので、確かにバージョンは古い。

#対応について
ザッと調べてみると、2014年にCocos2d-xで作ったAndroidアプリに対して同じような警告メールが来たことがあった模様。その際は内包されているOpenSSLのライブラリを新しいものに入れ替える対応で回避できたらしい。

今回は改めてセキュリティの水準が引き上げられた感じかな。
対象ライブラリは以下フォルダに入っていた。

```
/cocos2d/external/curl/prebuilt/android/armeabi/libcurl.a
/cocos2d/external/curl/prebuilt/android/armeabi-v7a/libcurl.a
/cocos2d/external/curl/prebuilt/android/x86/libcurl.a
```
フォーラムにも議題上がってたのでしばらく様子見てから対応する予定。
[OpenSSL problem again - Cocos2d-x Forum](http://discuss.cocos2d-x.org/t/openssl-problem-again/28270/)

広告系ライブラリの可能性もあるので。
ライブラリ入れ替えてビルドし直すだけだったら一番楽なんだけど…
## 追記
### 2016/04/05 16:30
4/26に対応版（ver 3.11）がリリース予定？
[Update OpenSSL for libcurl · Issue #15359 · cocos2d/cocos2d-x](https://github.com/cocos2d/cocos2d-x/issues/15359#issuecomment-205582789)

個人で対応してみたよ！って人も居た（要検証）
[Cocos2d-x Fix for OpenSSL problem | Bengigi Studio](http://www.bengigi.com/cocos2d-x-fix-for-openssl-problem/)

### 2016/04/26 22:30
フォーラムで情報提供してくれていたObg1さんの[fixファイル](http://www.bengigi.com/cocos2d-x-fix-for-openssl-problem/)をあててみたところ、内包されているOpenSSLのバージョンが規定値以上（1.01r）になった。

アプリの動作も問題なかったのでGoogle Playにアップ。3,4時間くらい経過後にアラートが解消されたことを確認。
GridEngineでのホスト名の解決について

# 概要

```
qconf
```

と入力しただけでも、ホスト名が解決できないエラーがでていた。


```
reresolve hostname failed: can't resolve host name
```

/etc/hosts には、ホスト名が書いてあったので、どこが問題なのかよくわからなかった。

エラーがでたときのエントリー

```
192.168.33.10 master1.devops.test
```

# 結論

ホスト名とFQDNと両方を書くと問題を解決できた

```
192.168.33.10 master1.devops.test master1
```
OpenAMを使ってAWSマネジメントコンソールにSSOする

# 概要
OpenAMを使って、AWSマネジメントコンソール ( AMC ) にIdP-InitiatedなSingle-Sign-On（SSO）をする手順を書きます。

# 前提
- OpenAMのインストールが完了していること（まだの場合は、[こちら]
(http://qiita.com/Tom3/items/4f5634244efc20196928))

# 手順
ざっくりな手順は以下のとおり。

1. Circle of Trust ( CoT ) を構成する
2. ID連携を行う

## CoTを構成する
まず最初に、IdPとSP間でメタデータの交換（相互設定）を行います。

<ol><li>OpenAMに管理者アカウントでログインして、[Top Level Realm]>[Create SAMLv2 Providers]>[Create Hosted Identity Provider]の順で選択したら、以下の値を入力して「Configure」をクリックする。
<br>
- Signing Key = test<br>
- New Circle of Trust = AWSSSO
<br>
なお、metadataは	[title](http://~)[こちら](https://signin.aws.amazon.com/static/saml-metadata.xml)より入手して、アップロードしてください。

"Your Identity Provider has been configured"と表示されたら、「register a service provider」リンクをクリックします。

</li><li>OpenAMへAMCのメタデータを登録する
</li>
AMCにログインしてIAMの「IDプロバイダ」画面にアクセスし、「プロバイダの作成」をクリックします。「プロバイダの設定」画面では以下の値を設定して「次のステップ」をクリックします。<br>
 - プロバイダーのタイプ＝SAML<br>
 - プロバイダ名＝OpenAM<br>
 - メタデータドキュメント＝http://sso.xxxx.com:8080/openam/saml2/jsp/exportmetadata.jspよりダウンロードしアップロードする。（拡張子をXMLにする）<br>
「プロバイダー情報の検証」画面に遷移するので、「作成」をクリックすればSAMLプロバイダーの作成が完了します。
</ol>

# ID連携を行う
<ol>
<li>IAMロールを作成する
<ol>
ここでは「SAMLRole」というロールを作成します。
<li>ロール画面で「新しいロールの作成」をクリックする。
<li>ロール名に「SAMLRole」と入力し「次のステップ」をクリックする。
<li>ロールタイプの選択で「IDロールプロバイダアクセス用のロール」＞「SAMLプロバイダへのWebSSOアクセスを付与」を選択する。
<li>追加したIDプロバイダを選択して「次のステップ」をクリックする。
<li>ポリシードキュメントを確認して「次のステップ」をクリックする。
<li>ポリシー「ReadOnlyAccess」をアタッチして「次のステップ」をクリックする。
<li>内容を確認して「ロールの作成」をクリック。
<li>作成したロールの概要を開き、「ロールARN」「信頼されたエンティティ」を控えます。
</ol>
<li>~~SSOするIAMユーザを作成する~~
<ol>~~ここでは「samluser」というIAMユーザを作成します。パスワード設定は不要です。~~
</ol>
<li>OpeAMに対応するユーザを作成する
<ol><li>「Top Level Realm」＞「Subjects」の順に選択し、「New」をクリックする。
<li>以下の値を入力して「OK」をクリックする。
ID: samluser
First Name: samluser
Last Name: samluser
Full Name: samluser test
Password: samluser3
User Status: Active
<li>「samluser」のカスタム属性「Employee Number」に「ロールARN」と「信頼されたエンティティ」をカンマで繋げた値を入力して、「Save」をクリックする。
<li> SP「urn:amazon:web service」の設定画面を開き、「Assertion Processing」タブの「Attribute Map」に以下を追加して「Save」をクリックする。
https://aws.amazon.com/SAML/Attributes/Role=employeeNumber
https://aws.amazon.com/SAML/Attributes/RoleSessionName=uid
(Emailを連携したい場合は、https://aws.amazon.com/SAML/Attributes/RoleSessionName=mail)
</ol>
</ol>

# 動作確認
次のURLにアクセスして、「samluser」でログインします。
http://sso.xxxx.com:8080/openam/idpssoinit?metaAlias=/idp&spEntityID=urn:amazon:webservices

![016.png](https://qiita-image-store.s3.amazonaws.com/0/118448/b92dabb3-f548-887b-5eda-81ddca59a907.png)

すると、AMCが開きます！
![017.png](https://qiita-image-store.s3.amazonaws.com/0/118448/8d8b4027-b355-cc1a-3ed6-990764c9ac93.png)

# 訂正
- 2016.4.4 AWS側にSSO用のユーザー作成の必要はありません。
CentOS6.6から6.7にあげたらlibMagickCore.so.2が見つからなくなった

sakuraのVPSのCentOSが6.6から6.7にあがっていたので更新

```
# yum update
```

したらばRailsのrakeが動かなくなってしもた

```
$ RAILS_ENV=production bundle exec rake db:migrate
rake aborted!
LoadError: libMagickCore.so.2: cannot open shared object file: No such file or directory - /usr/local/rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/extensions/x86_64-linux/2.2.0-static/rmagick-2.15.4/RMagick2.so
```

RMagick2.soはある

```
$ ls -l /usr/local/rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/extensions/x86_64-linux/2.2.0-static/rmagick-2.15.4/
-rwxr-xr-x 1 xxxxxx xxxxxx 521011 12月  7 19:05 2015 RMagick2.so
```

でもlibMagickCore.so.2はいない

```
$ sudo find / -name libMagickCore.so.2
$
```

[libMagickCore.so.2がそもそも見つからない件](http://manap.jpn.com/?p=1105) に書いてあった
**appのgemフォルダ(bundler?)を削除して、bundle installしなおす**
を参考に

```
$ bundle exec gem uninstall rmagick

Select gem to uninstall:
 1. rmagick-2.13.4
 2. rmagick-2.15.2
 3. rmagick-2.15.4
 4. All versions
> 4
ERROR:  While executing gem ... (NoMethodError)
    undefined method `name' for nil:NilClass
```

なんのErrorだ？？意味わからんけど無視ｗ

```
$ cd /usr/local/rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems
$ rm -rf rmagick*

$ cd /var/www/xxxxxxxx
$ bundle install

....
Installing rmagick 2.15.4
....
```

これでrakeコマンドを実行してみたら動いた！

泣きそうだったぜ
bootstrapでnavbar-fixed-topを指定するときはbodyにpaddingが必要

# tl;dr

Boostrapを使っていて、```navbar-fixed-top```もしくは```navbar-fixed-bottom```を使うときは、
bodyにpaddingを入れる。
じゃないと他のエレメントに重なる。

# ドキュメント

以下は```navbar-fixed-top```についての説明。
[bootstrapのドキュメント](http://getbootstrap.com/components/#navbar-fixed-top)に注意書きが書いてあった。

## 簡単に翻訳

<b>Body paddingが必要です</b>

もし```<body>```の```top```に```padding```を指定していなかった場合、固定navbarは他のコンテンツに重なってしまいます。下記のスニペットを利用するか、ご自身で値を設定してください。TIP: デフォルトでは、navbarの高さは50pxです。

```css
body { padding-top: 70px; }
```

これが、core Bootstrap CSSの<b>後に</b>インクルードされているかを確かめてください。

## サンプル

試してみたものは下記。

* https://plnkr.co/edit/BHfipK2ETHZ9Rr74GeFG?p=preview

# 参考

* http://getbootstrap.com/components/#navbar-fixed-top
* http://qiita.com/tags/bootstrap
Gitlabのrootユーザー（admin）のパスワードを忘れてしまった場合


# Gitlabのrootユーザー（admin）のパスワードを忘れてしまった場合

GitlabCEのrootユーザー（admin）のパスワードを忘れてしまったため、
コンソールから強制的にパスワードリセットを実施した時のメモです。

## 環境
+ CentOS67
+ GitLab 7.14.1 481c966 Check

## 手順
Gitlabをインストールしたアカウントかサーバのrootアカウントで
サーバへsshログインして以下コマンドを実行します。

1.  `gitlab-rails console production`　# コンソール起動（少しが時間かかります。）
2.  `user = User.where(id: 1).first`   # rootアカウント設定モードへ
3.  `user.password = 'secret_pass'`    # 新パスワード設定
4.  `user.password_confirmation = 'secret_pass'` # 新パスワード設定（確認）
5.  `user.save!` # 設定の保存
6.  `exit` # コンソールを抜ける


## 実行結果
```
[root@gitlab_server ~]# gitlab-rails console production
Loading production environment (Rails 4.1.11)
irb(main):001:0> user = User.where(id: 1).first
=> #<User id: 1, email: "admin@example.com", 
中略
public_email: "", dashboard: 0, project_view: 0>
irb(main):002:0> user.password = 'password'
=> "password"
irb(main):003:0> user.password_confirmation = 'password'
=> "password"
irb(main):004:0> user.save!
=> true
irb(main):005:0> exit
[root@gitlab_server ~]# 
```
## 参考
[How to reset your root password](http://doc.gitlab.com/ce/security/reset_root_password.html)
Sublime text | プロジェクト全体から一斉検索する

# 解決

**Ctrl+Shift+F** で Find in Files を開く。
そして `Where:` を**空欄**にして検索すれば良い。

![image](https://qiita-image-store.s3.amazonaws.com/0/90607/17f22c86-2c09-0251-4837-1d4b1819ff4c.png)

これで「現在開いているファイル」が何なのかを問わずに。
プロジェクト全体から検索することが出来る。

# 問題

今までは

1. カレントディレクトリから検索するために、いったん最上位ディレクトリのファイルを開く
2. `Where: ./` の状態で検索する

という手順をとっていたので面倒だった。

![image](https://qiita-image-store.s3.amazonaws.com/0/90607/cab1d482-284c-3c4c-c2b8-0319f2fe3c43.png)

`Where: /` を指定しても、うまく動かなかった。

# 環境

- Sublime Text3


![image](https://qiita-image-store.s3.amazonaws.com/0/90607/05202fe0-7894-5e51-31a5-aacfb272bbb0.png)



<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
Zybo > Chronicles blog 09 > EMIO > Extended Multipurpose IO / 64 GPIO pins > do not forget to the enable the level shifters between the PS and PL to ensure correct operation

MicroZed Chronicles リスト http://adiuvoengineering.com/?page_id=285
@ Adam Taylor blog
https://forums.xilinx.com/t5/Xcell-Daily-Blog/Meet-the-Zynq-MIO-Adam-Taylor-s-MicroZed-Chronicles-Part-9/ba-p/386661


> you can extend the MIO into the Programmable Logic (PL) side of the Zynq SoC. This is called Extended Multipurpose IO or EMIO. EMIO can provide up to 64 additional GPIO pins

...

> The GPIO will be split into two banks of 32 bits each if the maximum 64-bit size is selected.

...

> Note: Because the EMIO is within the PL side of the Zynq SoC, do not forget to the enable the level shifters between the PS and PL to ensure correct operation.
Numpy 1D array[x] と 2D array[x,1]の違い

Python初心者のメモ。内容の間違いなどご注意ください。

    import numpy as np
    
    def test():
        a = np.zeros([5,1]) #2D array columnができる
        b = np.ones([5]) #1D array　columnなし。
        
        print a 
        print 
        print "Dimension a: ", a.shape 
        print 
        print b, b.shape
        print 
        print "Dimension b: ", b.shape 
        print
        print a + b ＃1D + 2Dの演算になる
        print 
        
        a = np.squeeze(a)
        print a, #1D に変更
        print 
        print a + b
        
    if __name__ == '__main__':
        test()

Output: 

	[[ 0.]
 	[ 0.]
 	[ 0.]
 	[ 0.]
	[ 0.]]

	Dimension a:  (5, 1)

	[ 1.  1.  1.  1.  1.] (5,)

	Dimension b:  (5,)

	[[ 1.  1.  1.  1.  1.]
 	[ 1.  1.  1.  1.  1.]
 	[ 1.  1.  1.  1.  1.]
 	[ 1.  1.  1.  1.  1.]
 	[ 1.  1.  1.  1.  1.]]

	[ 0.  0.  0.  0.  0.]
	[ 1.  1.  1.  1.  1.]
Zybo > Chronicles blog 09 > MIO > two voltage banks > MIO0 pins 0 to 15 / MIO1 pins 16 to 53

MicroZed Chronicles リスト http://adiuvoengineering.com/?page_id=285

@ Adam Taylor blog
https://forums.xilinx.com/t5/Xcell-Daily-Blog/Meet-the-Zynq-MIO-Adam-Taylor-s-MicroZed-Chronicles-Part-9/ba-p/386661


> The MIO is split into two voltage banks:
> 
> 1. MIO0 pins 0 to 15
> 1. MIO1 pins 16 to 53

...

> there are seven mode pins mapped to MIO[8:2]

...

> The voltage standard defined on MIO bank 0 and 1 can be changed from LVCMOS to HTSL following completion of the boot loader.
itunes connectから売り上げなどのレポートをダウンロードする方法

# 準備

1. [Reporterツール](https://itunespartner.apple.com/assets/downloads/Reporter.zip)をダウンロードし、適当なところに配置する。
2. ダウンロードしたディレクトリに移動する。

# 実施

1. Reporter.propertiesに**Sales権限を持つ**ユーザーのユーザーID/Passwordを設定する。下記のような感じ。

```
UserId=ユーザーIDを設定する
Password=パスワードを設定する

Mode=Robot.xml

SalesUrl=https://reportingitc-reporter.apple.com/reportservice/sales/v1
FinanceUrl=https://reportingitc-reporter.apple.com/reportservice/finance/v1
```

2.コマンドラインで下記のように実行する。

VENDOR_NUMBERはitunesconnectの支払いと財務報告のページの左上に載ってる「ベンダー#」のところの数値です。
下記の場合は2016/3/15売り上げとのトレンドのサマリーをダウンロードするのですが、他にもなレポートが取得できるようです。

```
java -jar Reporter.jar p=Reporter.properties Sales.getReport VENDOR_NUMBER, Sales, Summary, Daily, 20160315
``` 

[ドキュメント](http://help.apple.com/itc/appsreporterguide/#/itcbe21ac7db)に色々書いてるので試してみてください。

3.実行すると何やらXMLが返ってくる。下記のような感じだとOKです。

```
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <Output>     <Message>Successfully downloaded S_D_00000000_20160315.txt.gz</Message> </Output>
```

下記のように圧縮ファイルになってます。解凍したテキストはExcelとかで綺麗に見える形式になっているので、Excelでみてください。

```
$ ls
S_D_00000000_20160315.txt.gz
```
PHP 配列の初期化、代入、削除、ループ

## 配列定義

```php

$a = array("foo", "bar");

print_r($a);

Array
(
    [0] => foo
    [1] => bar
)

// キーを指定（連想配列）

$a = array(
    "a" => "foo",
    "b" => "bar",
);

// PHP 5.4
$a = [
    "a" => "foo",
    "b" => "bar",
];

print_r($a);

Array
(
    [a] => foo
    [b] => bar
)
```

## 角括弧構文で代入

```php
$a = array();

$a[] = 1;

$a["x"] = 2;

print_r($a);

Array
(
    [0] => 1
    [x] => 2
)
```

## 配列削除
unsetの引数に配列のキーを指定することで、指定したキーと値が削除される。

```php
$a = array(10, 100, 1000);

unset($a[1]);

print_r($a);

Array
(
    [0] => 10
    [2] => 1000
)
```

## キー生成動作
配列にある正の整数のキーの最大値 +1となる。

```php
$a = array(1, 2, 3, 4, 5);

// 全てのアイテムを削除。配列自体は要素が空となって残る
foreach ($a as $i => $v) {
    unset($a[$i]);
}

print_r($a);

Array
(
)

// アイテムを追加（新しい添字は5)
$a[] = 6;

print_r($a);

Array
(
    [5] => 6
)

// 添字の振りなおし
$a = array_values($a);

$a [] = 7;

print_r($a);

Array
(
    [0] => 6
    [1] => 7
)

```

## ループで変更
PHP 5 以降、配列を参照渡しすることで値を直接変更できる。
参照渡し -> ```&$color```

```php
$colors = array('red', 'blue', 'green', 'yellow');

foreach ($colors as &$color) {
    $color = strtoupper($color);
}

unset($color);

print_r($colors);

Array
(
    [0] => RED
    [1] => BLUE
    [2] => GREEN
    [3] => YELLOW
)
```

## PHPマニュアル 配列
http://php.net/manual/ja/language.types.array.php
[memo] AngularJs ng-if, ng-show, ng-switchのDOMからの追加・削除とCSSでの表示・非表示について

開発してて、当たり前の事をたまにふと忘れてしまいそうになるのでメモ。

# テスト

```
　　　<div>
    <input type="checkbox" name="test" ng-model="testModel">
    <div ng-if="testModel">IfTrue</div>
    <div ng-if="!testModel">IfFalse</div>
    <div ng-show="testModel">showTrue</div>
    <div ng-show="!testModel">showFalse</div>
    <div ng-switch="testModel">
      <div ng-switch-when="true">switchTrue</div>
      <div ng-switch-when="false">switchFalse</div>
      <div ng-switch-default>switchDefault</div>
    </div>
  </div>
```

よく使うディレクティブを使ってテスト的なコードを使って、どれがDOMから削除され、どれがCSSで見かけ上消えるだけなのかを、簡単なテストコードで確認。

# 結果
<img width="652" alt="スクリーンショット 2016-04-01 12.10.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/117677/1eeb1e72-abfa-9b3b-9cdc-8ccef01e589b.png">

- `ng-if` と `ng-switch` がDOMから追加と削除
- `ng-show`がCSSで制御

# ついでに
DOMからの追加・削除とCSSでの表示・非表示の気をつけることもメモ

## DOMからの追加・削除
CSSのリストなどで`:first-child`をする場合、影響を受ける段落が変わってしまい、レイアウトが崩れてしまう。

## CSSでの表示・非表示
閲覧者に隠れてる部分が見えてしまう為、条件に応じて見られたらまずいものを扱う場合は危険

# 最後に
開発後半で全てのコードの`ng-if`・`ng-if`・`ng-switch` ..etc
をチェックするのはかなり手間と、再デバッグが必要になるので気をつけて開発していきたい。
PowerShellからMicrosoft Azureを管理する【準備編】

Microsoft Azure管理ポータルには旧来のクラシック版と、新しいリソースマネージャ版があります。

PowerShellにも新しい版があるようです。[Azure Resource Manager Cmdlets](https://msdn.microsoft.com/ja-jp/library/mt125356.aspx)にインストール方法がありました。

# ステップ :one: Windows Management Framework 5.0をインストール

Windows Management Framework 5.0がインストールされていなければ、ダウンロードしてインストールします。

Windows 10のひとは不要です。

https://www.microsoft.com/en-us/download/details.aspx?id=50395


# ステップ :two: PowerShellモジュールをインストール

管理者権限でPowerShellプロンプトを立ち上げます。

インストールを実行します。

```ps1:
Install-Module AzureRM
Install-AzureRM
```

# 結果

PowerShell ISEを立ち上げると、こんな感じにコマンドが入っていました。

![azurermcmdlet.JPG](https://qiita-image-store.s3.amazonaws.com/0/59475/9a0049c1-f211-5c62-2d72-a1955173bb3d.jpeg)
Bluemixで、お手軽PostgreSQL（ by Compose.io）

有言実行というわけで。
http://qiita.com/azzeten/items/e9e09c3586c153916332

手順をまとめて載せてみますが、とりあえずこの記事で何が言いたいかというと、
**とにかく早い！**
アカウント作るときにクレジットカードをどれにしようかな〜とか選んでるともちろんその分時間はかかりますが、
**「さあ始めてみよう」と思い立ってから、PostgreSQLのクラスタ環境が作れちゃうまで、リアルに5分くらいです。サクサクで感動・・・ :sunglasses:**

自分が新人のときは、PCがガシガシに重くなりながらもなんか頑張って環境構築とかしてたけど、今はこういうサービスがあるから簡単に勉強もできるし、開発の現場でもこういうの活用できるだろうし、エンタープライズでだってきっと使えるのだろうし（IBMが買収したくらいだから）、便利な世の中になったものですね〜。

##BluemixからCompose.ioにアクセス
Bluemixにログインし、「カタログ」から「PostgreSQL by Compose」をクリック

![スクリーンショット 2016-04-01 11.48.15.png](https://qiita-image-store.s3.amazonaws.com/0/119378/2fd791a7-43dc-c739-ea5c-8c4f237b11de.png)

とりあえず入力項目はデフォルトのまま、Composeへの窓口っぽいリンクをクリック

![スクリーンショット 2016-04-01 11.49.33.png](https://qiita-image-store.s3.amazonaws.com/0/119378/bb5907e7-5fee-7360-4ea3-c0b6b8dea86c.png)



##Compose.ioのアカウント作成　＆　DBの作成

それっぽくアカウントを作る。

![スクリーンショット 2016-04-01 11.50.42.png](https://qiita-image-store.s3.amazonaws.com/0/119378/a562422f-b3dd-0295-dcc7-39571fa09ced.png)

で、Enterしたら、すぐにDBが作られるフェーズへ・・・。待つこと3分。
（It's so beautifulとか書いてあるけど。。。日本人感覚からするとちょっとセリフが寒いｗ）

![スクリーンショット 2016-04-01 11.56.26.png](https://qiita-image-store.s3.amazonaws.com/0/119378/bdcc8c54-1376-b0f8-012e-2b330f54d87c.png)

はい、できあがり！

![スクリーンショット 2016-04-01 11.58.11.png](https://qiita-image-store.s3.amazonaws.com/0/119378/56aab10b-3545-5b79-ee89-5b6c10f5dfac.png)


色々遊んでみよ〜。
ajax書き方(&phpで送ったファイルを受け取ってサーバーに入れる)

## ■ ajaxがよく分からない、ajaxは何もの？
ajaxはページを更新しなくても裏側でデータを取得して表側に表示させるヤツです。
ページ全体が更新されないため、**速度が速い**、**一定部分だけ表示を変える**ことができます。

```lang:javascript
$.ajax({
  url: URLを入力, // 例：/ajax/?param=member
  type: "POST", //POSTで送信するのがより安全
  cache: false, //場合によってはデータが更新されない時があるのでキャッシュを無効化
  dataType: "json", //かえってくるのは「json」だというのを定義
  data: {
    "seq": 1,
    "name": "test"
  },
  beforeSend: function() { //処理中に動作
    //主にローディング画像を見せたりする時に使います。
  }
  success: function(result) { //問題なくレスポンスできたら動作
    console.log(result); //json形式
  },
  complete: function() { //successが終わったら動作
  }
  error: function(e) { //エラーが発生したら動作
    console.log(e); //エラー時のみ出力
  }
```
success, error以外にも最近はdone, failがよく使われるらしいです。

##■ ajaxで画像ファイルを送信したい
もちろんajaxでテキストだけではなく、ファイルを送信することもできます。
ポイントは「**processData: false,**」と「**contentType: false,**」が入ることです。

```lang:javascript
var formData = new FormData($("form")); //form(<form enctype="multipart/form-data"></form>)を指定
formData.append("picture", $("#picture").prop("files")[0]); //<input type="file" id="picture">

$.ajax({
  url: URLを入力, // 例：/ajax/?param=picture
  type: "POST", //POSTで送信するのがより安全
  cache: false, //場合によってはデータが更新されない時があるのでキャッシュを無効化
  processData: false,
  contentType: false,
  dataType: "json", //かえってくるのは「json」だというのを定義
  data: formData,
  beforeSend: function() { //処理中に動作
    //主にローディング画像を見せたりする時に使います。
  }
  success: function(result) { //問題なくレスポンスできたら動作
    console.log(result); //json形式
  },
  complete: function() { //successが終わったら動作
  }
  error: function(e) { //エラーが発生したら動作
    console.log(e); //エラー時のみ出力
  }
```

これをPHPなどに送って受け取ったデータをサーバーとDBに入れることができます。

ちなみにPHPでは$_REQUEST["picture"]のような形で受け取るので

```lang:php
if (isset($_REQUEST["picture"]) == true) {
  move_uploaded_file($_REQUEST["picture"]["tmp_name"], "/var/www/html/images/(パスを指定)" . $_REQUEST["picture"]["name"]);
  $picture = substr($_REQUEST["picture"]["name"], 0, strpos($_REQUEST["picture"]["name"], "."));
} else {
  $picture = null;
}
```
にすれば、サーバーの指定したパスにファイルが入り、ファイルの名前($picture)も取得できます。

これじゃなくても色んな方法があるので、使いやすい、理解しやすい方法でコードを組みましょう。
Sidechain ユースケース

Sidechainの適用先について。

## 機密取引(Confidential Transaction)
Bitcoinの取引は全て第三者に公開されており、秘密にできない。その課題を克服するためにSidechainを用いる。送信者と受信者にしか知られない取引を実現する。
https://www.elementsproject.org/elements/confidential-transactions

## 署名の分離(Segregated Witness)
Bitcoinのスケーリング問題を解決するために、署名を分離する。それによってブロックに空きを作る。
https://www.elementsproject.org/elements/segregated-witness/

## Schnorr Signatureの導入
ECDSAに変わる形で、Schnorr Signatureを認証方法として導入する。
メリットは以下

- Efficient threshold signatures for n-of-n. 
- Smaller signatures (64 bytes instead of 71-72) with none of the problems that DER encodings have caused for Bitcoin. 
- Provably no inherent signature malleability, while ECDSA has a known malleability, and lacks a proof that no other forms exist. Note that Witness Segregation already makes signature malleability not result in transaction malleability, however.
- Slightly faster to sign/verify than ECDSA.

https://www.elementsproject.org/elements/schnorr-signatures/

## 新しいOpcodes

https://www.elementsproject.org/elements/opcodes/

## 価値を内包する署名(Signature Covers Value)
https://www.elementsproject.org/elements/signature-covers-value/

## 決定論的ペッグ(Deterministic Pegs)
https://www.elementsproject.org/elements/deterministic-pegs/

## ブロックへのサイン(Signed Blocks)
https://www.elementsproject.org/elements/signed-blocks/
railsでModelから引っこ抜いたデータの並び順を変えるOrderの使い方を極める

特に極める、というほどではないんですが、色々と実際に試してみたので備忘録代わりに。

## 基本的な使い方


```ruby:controller
#Userテーブルのカラム、nameでソート　どっちの書き方でもOK
User.order(:name)
User.order('name')

#Userテーブルのカラム、nameで、降順にソート
User.order('name DESC')
=> 昇順のASCは通常省略されている、と考える

#2つのカラムname,emailでソート
User.order(:name, :email)

#2つのカラムでソートだけど、名前だけ降順
User.order({ name: :desc }, :email)
```


##　ちょっと変わった使い方

```ruby:controller
#.unscopeで一度並び替えたものをキャンセル
User.order(:email).unscope(:order)
=> User.all と同じ結果となる（orderがキャンセルされている）
※ちなみに、unscopeには、whereとかselectとかもハッシュで渡すとキャンセル出来るらしい。
何に使うかは不明。

```

## INCLUDE/JOINした他のテーブルのカラムでORDER BY
ここがかなり詰まったので。。。

```ruby:controller

#Userテーブルに紐づくCountryテーブルの国名で並び替えたい場合。
User.joins(:country).includes(:country).order("countries.name")

```

ポイント
・orderで他のテーブルを使う場合は、joinsでINNER JOINをしてあげないと探せない
・でも、この後国名を一覧で表示するときとかはjoinｓだと、N+1問題起こしてしまうので、includeｓもあわせて行う（なんか無駄な気がする。。。）
・で、order（）内のモデル名は必ず複数形（joinは単数形だから結構はまった。。。）

joinsは、1行のSQLでINNER JOINを発行しているけど、includeは、2行のSQLに分かれているのが、ポイントでした。。。
UbuntuにおけるGridEngineのutilbinのパス

# 結論

Ubuntu 14.04のGridEngine(6.2u5-7.3)では、utilbinは、以下のような位置にある。

```
/var/lib/gridengine/utilbin/lx24-amd64/gethostname
```

# 動機

```
# qconf -Mc /etc/gridengine/complex_values
reresolve hostname failed: can't resolve host name
```

こんなメッセージがでたときに、エラーメッセージで検索すると
以下のようなものがみつかる。

* [[gridengine users] reresolve hostname failed: can't resolve host name](http://gridengine.org/pipermail/users/2013-August/006534.html)
* [Discussion list for users of Grid Engine](http://comments.gmane.org/gmane.comp.clustering.gridengine.users/22525)
* 
その中で、utilbin/gethostbyaddr のようなコマンドの結果を貼り付けているのだが
このコマンドが、Ubuntu ではどこにあるのかわからなかった。
2016/04/01 日報

#1.インストール

+ visual studio 2015 community
+ git 32bit ver2.8.0
+ sourcetree
+ sqlserver 2014 express + SQL Server Management Studio

#2.VB.netでSQL Serverと接続
練習としてDB.testというプロジェクトを作り、SQL Serverに接続しtestテーブルを表示させる。

>　SQL Serverに接続するし、SQL文を作る所まで終了。
>　次回からはSQL文を実行し表示させる。
暗号技術入門を読んでhttps通信の仕組みを学ぼう

暗号技術の定番本として知られている[暗号技術入門 第3版 秘密の国のアリス](http://www.amazon.co.jp/3/dp/4797382228/ref=tmm_other_meta_binding_swatch_0?_encoding=UTF8&qid=&sr=)を読み終えました。暗号周りの基礎知識が身につくので、新人のみならず、その辺をおさえきれていない人にとってもおすすめです。暗号の仕組みの細かい部分を除けば、エンジニアでない人にとっても読む価値はあると思います。

# どんな内容か

次の6つの技術を軸に、暗号技術を説明しています。

* 対称暗号
* 公開鍵暗号
* 一方向ハッシュ関数
* メッセージ認証コード
* デジタル署名
* 疑似乱数生成機

## 対称暗号

暗号化と複合化に同じ鍵を使う形の暗号で、AES、DESがその代表例です。そのため、共通鍵暗号とも呼ばれます。公開鍵暗号に比べて、暗号化にかかる時間や強度は優れているのですが、暗号文をやりとりする双方が同じ鍵を持つ必要があるため、鍵配送問題が生じます。

暗号化に使った鍵が盗聴されてしまうと、暗号文が解読されてしまい、機密にしたい情報を守るには、鍵を安全にやりとりする問題に帰着されるということです。

## 公開鍵暗号

上述の鍵配送問題を解決策のひとつして、公開鍵暗号がでてきます。これは、暗号化と復号化の鍵を別々に作成し、暗号化用の鍵（公開鍵）のみを公開してやりとりするものです。

公開鍵のみでは、暗号文を解読することは事実上不可能であることと、対応する秘密鍵でないと復号できないことから、公開鍵を渡すことによって鍵配送問題が解決されます。

### 公開鍵の認証の問題

これで万事解決にはならず、あらたな問題が発生します。それは入手した公開鍵が、自分がやりとりしたい相手のものであるかどうかを判断する必要があるからです。

その問題をついたのが、man-in-the-middle攻撃です。
下記サイトのように、AとBの間に、攻撃者Cが入り込んで、公開鍵のやりとりを仲介してしまうことです。
http://masuipeo.com/tech/mitm.html

こうなると、暗号技術に関係なく、AとBのやりとりを攻撃者は取得できてしまいます。Aとしては、受け取った公開鍵がBのものであることを確かめる仕組み、つまり認証が必要になります。

## デジタル署名

認証の仕組みとして、デジタル署名がでてきます。公開鍵暗号の応用で、秘密鍵を使って署名（≒メッセージのハッシュ値を暗号化）し、公開鍵を使って署名の検証（≒ハッシュ値を復号化し、受け取ったメッセージのハッシュ値と比較）と、鍵の役割を逆にすることで実現しています。

### 公開鍵証明書

man-in-the-middle攻撃の対策として、証明書の仕組みがでてきます。
信頼できる組織、認証局（CA）によってデジタル署名された公開鍵を使うことで、デジタル署名の検証を通信の前に行うことで、これからやりとりする相手が信頼できるものかどうかを判定できるようになります。これがいわゆるSSL証明書になります。

### 認証局はどうやって、公開鍵が本人のものかを確認しているのか？

証明書のレベルによりますが、メールアドレスが届くかどうかで済むものもあれば、対面と身分証の提示を伴うケースもあるようです。

### 認証局への信頼は何で担保するのか？

これで万事解決かというと、やはりそうでもないです。例えば、認証局が署名に使っている秘密鍵が漏洩してしまうと、攻撃者にとって都合のよい証明者がつくられてしまいます。あるいは、攻撃者がもっともらしい認証局になるということもできます。 公開鍵の信頼から、認証局への信頼に問題を移し替えたようなものです。

個々人から組織に変わったので、その意味では判断しやすいといえます。会社としてちゃんとしているとか、実績があるとか、そういった別の情報源で信頼できるかどうかを判断することになります。

# まとめ

資格試験などでも、https通信やRSA公開鍵についての知識が問われることが多いです。
この本を読むと、そのあたりを大分カバーできると思います。

また、GitHubに公開鍵を登録したり、SSL証明書を更新したり、オレオレ証明書をつくることの意味もわかってきますので、なんとなくやっている人にもあらためて知識を整理するにはうってつけです。

現状の技術では、なにもないところから信頼は生み出せないので、どこかで何かを信頼するということの本質につきあたるようです。
 

# 参考サイト

* http://qiita.com/seizans/items/3412bdaa4a70673445de
* http://daiksy.hatenablog.jp/entry/2015/10/24/225054
* http://qiita.com/fkrw/items/412aa3997b6d60a67173
* https://qiita.com/TakahikoKawasaki/items/4c35ac38c52978805c69
Welcart の「商品」ってカテゴリ名がつらいときに

投稿>カテゴリー>カテゴリーの編集から
「名前」欄を好きに変更するだけで行けそうな気がするので、
以下の分は不要な気はするのですが、書いてしまったのでそのまま。

あとは [category-item.php] でも作れば一覧ができると思うので、
wp_head() さんが拾ってくれるのではないかと思います。

4.4? からtitle タグが深いとこで作成されるので、
いろいろあってカテゴリの名前を変えずに、titleだけ変えるには面倒なfilter作業で対応

[wp_get_document_title()] がページの情報を基にタイトル付けてくれたあとに
[document_title_parts] ってフィルター待機してくれてるので、
上澄みをすくってしまいます。

```lang:functions.php
function yukari_shop_title( $title ){
    if( is_category('item') ){
        $title['title'] = 'ゆかりさんの野営グッズ';
    }
    return $title;
}
add_filter( 'document_title_parts', 'yukari_shop_title', 10, 2 );
```

補足
WordPress にプラグインでEC的な機能を付けてしまうのが「Welcart」
正式な名前ではなさそうだけど、たぶん検索は「Welcart」が良さそう
プラグインの仕様? により商品的な機能をつける投稿はスラッグが「item」のカテゴリーに強制参加
Xamarin無償化したらしいのでVisualStudioでAndroidアプリ開発を試してみた

[祝Xamarin無償化] MSに買収されてもしかしたら……と期待していましたが、Xamarinが無償になったらしいです！！
[Xamarin 日本語情報 - 【速報】Xamarin のこれからについて！](http://ytabuchi.hatenablog.com/entry/ms-xamarin)

だけど今日はエイプリルフール。本当に無償化したか確認するまでは信じられない…

ということで入れて動かしてみることにしました！！

## インストール

[このあたりからダウンロードできるみたい…？](https://www.xamarin.com/platform)

VisualStudioで使いたいのでそれっぽいのをDLしました

起動
![Ce6yg8QVIAAE60N.jpg](https://qiita-image-store.s3.amazonaws.com/0/51176/9a253dfb-65c7-3d02-5b5c-3cc8ff06e634.jpeg)

おお！？ちゃんとインストーラーが起動しました！(スクショ取り忘れ)

あとはポチポチ規約などに同意していればインストールが完了しました

## HelloWorld

入れてもちゃんとBuildできるか怪しいのでHelloWorldしてみることにします

VisualStudio起動、新規プロジェクト
![Xamarin.PNG](https://qiita-image-store.s3.amazonaws.com/0/51176/b0945829-3431-ce85-1286-1bd9f850fe58.png)

作成![Xamarin2.PNG](https://qiita-image-store.s3.amazonaws.com/0/51176/427e2048-60a4-3971-613f-f17e05818660.png)

うぉぉぉぉぉぉおおおおおおC#だぁああああああ

とくに弄らずに動かします  

このときに、自分の環境だとこのまま三角ボタン押してXamarinが勝手に作成したエミュレーター起動してもOSが動かなかったので普段Android開発してるときに使っているエミュレーターを動かすことにしました
三角ボタンの右のツール群にAndroid AVD起動するボタンがあるのでポチっと押して起動、RAMが多すぎると警告があったので最大の768MBに変更、ついでにOSのverが合わないのでMinimum Android to target:をAPI15に

そして起動![Xamarin3.PNG](https://qiita-image-store.s3.amazonaws.com/0/51176/68e85cb3-6f2d-b713-1234-c58d29116d28.png)

動いたぁあああああああああああああ

あれ、エミュレーターの外見が昔のに戻ってる…?

## さいごに
エイプリルフールネタじゃなくて本当に良かったです…

Javaに苦痛を感じてKotlinに逃げてましたがこれからはC#で開発することにします(たぶん)

それにしても最近のMS神すぎやしません？？
PHPでバルス！って打つと強制終了する。ｷﾘｯ(｀・ω・´)

この記事は移行しました！[最新の内容はこちら](https://naoqoo2.github.io/blog/PHP%E3%81%A7%E3%83%90%E3%83%AB%E3%82%B9-%E3%81%A3%E3%81%A6%E6%89%93%E3%81%A4%E3%81%A8%E5%BC%B7%E5%88%B6%E7%B5%82%E4%BA%86%E3%81%99%E3%82%8B-%EF%BD%B7%EF%BE%98%EF%BD%AF(-%CF%89-)/)をご覧ください😀

※エイプリルフールネタですが嘘ではないよ。

## PHPで「バルス！」って書いてみる

```php:
処理1

バルス！();

処理2
```

と書くとなんとexitします！
※処理2には進みません

## ネタばらし

そう、関数名に日本語が使えるんですね。
実は下記functionを定義しています。

```php:
function バルス！(){
    die(); // exitよりdieのほうが滅びの呪文ぽい
}
```

くだらないネタでごめんなさい。

## 本当は();なしで「バルス！」だけにしたかった

可変関数とかいろいろ考えたけど、どうしても();は必要だった。。。

```php:
// 実行はされない・・・
$バルス！ = "バルス！()";
$バルス！; // 実行されたとしても$付きになっちゃうね・・・
```

## それでも();が邪魔、、、ハッ！ :bulb: 

```php:
バルス！ｷﾘｯ(｀・ω・´);
```
いかがだろうか。
無駄に引数を与え、まさかの顔文字。
Noticeエラー発生しないようにdefine定義しておけば完璧です。

```php:
define('｀・ω・´', true);
function バルス！ｷﾘｯ(){
    die();
}
```

## これプログラミングが楽しくなりそう！


```php:
//DB登録
φ(・ω・);
```

```php:
//メール送信
｡⌒ヽ(´ー｀);
```

```php:
//異常発生
おっおっおっ(＾ω＾　≡　＾ω＾);
```
コーディングの新たな扉を開いてしまったかもしれない・・・
[メモ] Visual C++ for linux Development を軽く使ってみた

\# orchelyさんの[記事](http://qiita.com/orchely/items/da86710a6010d41df434)とかぶった... 無事動作することを祈ってます。


![VC2015LinuxDev6.png](https://qiita-image-store.s3.amazonaws.com/0/75594/9ded2268-e1c1-2578-ddae-b90064a5558d.png)
## 環境
- Windows 10 (64bit)
- Visual Studio 2015 Update 2 (Enterprise) 全部入りでインストール。
- Linuxは、Ubuntu 14.04-64bit (build-essentialとか、いろんなパッケージが入ってる)

## インストール
1. Visual Studio 2015を開いて、
2. ツール > 拡張機能と更新プログラム から
3. オンライン　を選んで 
4. CTRL+Eで、`linux` を検索
5. `Visual C++ for linux Development` を[ダウンロード]
<br>![VC2015LinuxDev1.png](https://qiita-image-store.s3.amazonaws.com/0/75594/23f33731-424b-9568-bc53-dcb4160fc122.png)
6. ブラウザ起動して、`VC_Linux.exe`がダウンロードされるので、それを[実行]
7. Please close Visual Studio now to ~うんぬんとでてくるので、Visual Studioを閉じてから、[Continue] ... でインストール。
<br>![VC2015LinuxDev2.png](https://qiita-image-store.s3.amazonaws.com/0/75594/ce83adbd-e038-df75-88ce-eeed1e14089f.png)

## Linux
必要なものをインストール<br>`% sudo apt-get install openssh-server g++ gdb gdbserver`


## Getting Started
1. VS2015 ファイル>新規作成 > プロジェクト　<br>で、新しいプロジェクト　ダイアログから、
2. インストール済み>テンプレート>Visual C++>クロスプラットフォーム > Linux を選んで
3. Console Application (Linux)　をえらんで、
4. (名前、場所、とか、かえたりしてもよい)
5. [OK]
<br>![VC2015LinuxDev3.png](https://qiita-image-store.s3.amazonaws.com/0/75594/fec8c93f-f6a8-e66a-a20e-fc1dbb4da53b.png)
6. `Getting Started`タブで、スクショつきで説明がある(英語だけど)
7. `main.cpp` タブを選択して、 printf()行にカーソルを持ってきて、[F9]で<font color='red'>●</font>赤丸つけて(ブレークポイントを張って)
8. 上のとこで、[Debug] [x64](接続先のLinux)をえらんで、
9. [F5]を押す。ビルドしますか　=> [はい(Y)]
10. `Connect to Linux`ダイアルが出てくるので、接続先の情報を入れて、[Connect]
<br>![VC2015LinuxDev4.png](https://qiita-image-store.s3.amazonaws.com/0/75594/432625e6-b516-76db-ec38-68a30696c7ae.png)
11. ブレークポイントで、停止<br>![VC2015LinuxDev5.png](https://qiita-image-store.s3.amazonaws.com/0/75594/e28dff0b-3f68-d295-a353-4124522d2956.png)

## [このへん](http://qiita.com/mt08/items/cb2ca56ef86ba05c4a59)で使ったコードを使ってみる。

```c:main.cpp
#include <cstdio>
int add(int x, int y)
{
	return x + y;
}
int main()
{
	int a = 5;
	int b = 4;
	int c = add(a, b);
	std::printf("Hello World %d\n", c);
	return 0;
}
```

![VC2015LinuxDev6.png](https://qiita-image-store.s3.amazonaws.com/0/75594/9ded2268-e1c1-2578-ddae-b90064a5558d.png)
いろいろ見れてますね。

一方、linux側では、こんなかんじ。`スレッド[13242]`の数字と`gdb`で検索。

```bash
user01@u1404:~⟫ ps aux | grep gdb
user01   13240  0.0  0.0  11884  1964 pts/2    S    18:24   0:00 gdbserver :4444 /home/user01/projects/ConsoleApplication1/bin/x64/Debug/ConsoleApplication1.out
user01   14461  0.0  0.0  15944  2184 pts/5    S+   18:26   0:00 grep --color=auto gdb
user01@u1404:~⟫ ps aux | grep 13242
user01   13242  0.0  0.0   4196   652 pts/2    t+   18:24   0:00 /home/user01/projects/ConsoleApplication1/bin/x64/Debug/ConsoleApplication1.out
user01   14482  0.0  0.0  15944  2228 pts/5    S+   18:26   0:00 grep --color=auto 13242
user01@u1404:~⟫ 
```


## ん？
- printfの出力って、どこにでる？？<br>(追記2016-07) => Debugメニュー > Linux Console　で表示
sshpassを使用してsvnサーバから別のホストにsvn updateでデプロイする

sshpassを使用して、subversionサーバから、別のホストにsvn updateを使用してデプロイします。
筆者環境ではOSはCentOS6.7を使用しました。

sshpassは便利ですが、セキュリティ上の問題がある場合は、公開鍵認証を使用してください。

- sshpassを両方のサーバにインストールします。(epelリポジトリにあります)
- svnサーバのリポジトリ内のhooksディレクトリにある、post-commit.tmplをpost-commitに変更します。
- 下記のスクリプトを貼り付けて、変数に必要なユーザー名とパスワード、サーバ名を入れます。
- デプロイされる側のホストの、sshpass接続ユーザの".subversion/config"ファイルの[auth]セクションに、以下のようにパスワード保存の問い合わせをしない設定を入れます。

```bash:~/.subversion/config
[auth]
store-passwords = no
store-plaintext-passwords = no
```

- post-commitのスクリプトに実行権限を付与します。
- 実際にリポジトリにコミットしてテストします。

下記のデフォルトでは、post-commitのログは/var/log/svn/post-commit.logに出力しています。


```bash:/var/svn/repos/target_repos/hooks/post-commit
REPOS="$1"
REV="$2"

#Deploy target server's info.
DEPLOY_SERVER="user_name@target.server"
DEPLOY_SERVER_PASS="password"
#Sub version user's info for svn update.
SVNUSER="svn_user_name"
SVNPASS="svn_user_pass"
SVN_UPDATE_DIR=/var/www/html/svn_update_dir/
HOOK_BRANCH="trunk"
SVNOPTS="--username $SVNUSER --password $SVNPASS"
#Log file path.
LOG=/var/log/svn/post-commit.log

#Pick up changed files.
CHANGED_FILES=`svnlook changed -r $REV $REPOS`

#svn update on target server.
#Affect only hook branch.
if echo $CHANGED_FILES | grep $HOOK_BRANCH > /dev/null; then
    echo "--- `date` deploy started." >> $LOG
    echo "deploy target server: $DEPLOY_SERVER" >> $LOG
    echo "repos and rev: $REPOS $REV" >> $LOG
    #svn update on server using sshpass.
    RESULT=`sshpass -p $DEPLOY_SERVER_PASS ssh -o StrictHostKeyChecking=no $DEPLOY_SERVER svn $SVNOPTS update $SVN_UPDATE_DIR`
    echo "svn update result: $RESULT" >> $LOG
    echo "--- `date` deploy ended." >> $LOG
fi
```
1年に1回ぐらい必要になるgitのコマンドメモ


たまーに必要になって、毎回検索していたコマンドのメモです。

#### 無視されているファイルを強制的に追加する

	git add -f hoge.swift


#### 無視されているファイルの一覧を表示

	git status --ignored


#### リポジトリの先頭からrebase

	git rebase -i --root

#### remoteのアドレスを確認

	$ git remote -v


## 情報元

【Git】無視されているファイルを強制的に追加する - Qiita
http://qiita.com/hirofumiymmto/items/fe7227652e989ca50c11

First commit が git rebase -i できない問題 → git rebase -i --root でできる - 納豆には卵を入れる派です。
http://d.hatena.ne.jp/ken_c_lo/20130421/1366558065

[git] リモートリポジトリの URL を確認する方法 - Qiita
http://qiita.com/phi/items/113f88cc87fe465bdcfe
ウェブで実行できるJavascript製ニューラルネットワークのライブラリ

#convnetjs

[ConvNetJS: Deep Learning in your browser](http://cs.stanford.edu/people/karpathy/convnetjs/)

##公式demo

![](http://cs.stanford.edu/people/karpathy/convnetjs/demo/imgs/cat.jpg)
[ConvNetJS demo: Image Painting](http://cs.stanford.edu/people/karpathy/convnetjs/demo/image_regression.html)

CNNを用いてCIFAR-10のサンプルをリアルタイムで分類
[ml4a :: CIFAR-10 confusion](http://ml4a.github.io/dev/demos/cifar_confusion.html)

##非公式demo
- [Visualisation of Convolutional Neural Networks Topology](http://terencebroad.com/convnetvis/vis.html)
    - threejs
    - MNIST
- [JavaScript Neural Network Demos](http://45deg.github.io/neural-network_v2/#3)
    - XOR
- [Neural Face | 프사 뉴럴](http://carpedm20.github.io/faces/)
    - Visualization of asian face generation with Tensorflow and convnetjs

#RecurrentJS
RNN、LSTMを実装。
[karpathy/recurrentjs: Deep Recurrent Neural Networks and LSTMs in Javascript. More generally also arbitrary expression graphs with automatic differentiation.](https://github.com/karpathy/recurrentjs)

入力した文章をもとに次に来る語を予測する?デモ。
[RecurrentJS Sentence Memorization Demo](http://cs.stanford.edu/people/karpathy/recurrentjs/)

#Synaptic
[Synaptic - The javascript neural network library](http://synaptic.juancazala.com/#/)

# 編集リクエスト歓迎
一人で更新していくのは大変なので編集リクエスト受け付けております :pray: :pray: :pray: 

また新しくライブラリが見つかったら更新しますー :smiley:
Amazon Linux に MySQL-Server & Client をインストールする

特にCentOSやRHELとやりかたが変わるわけではありません。自分向けかんたんメモ。

# インストール環境

**AMI :** amzn-ami-hvm-2016.03.0.x86_64-gp2 (ami-f80e0596) 
**環境:** EC2/t2.micro    

# MySQL Client/Serverのインストール

```console:console
$ sudo su -
$ yum install -y mysql yum install -y mysql-server
$ yum info mysql mysql-server
読み込んだプラグイン:priorities, update-motd, upgrade-helper
インストール済みパッケージ
名前                : mysql
アーキテクチャー    : noarch
バージョン          : 5.5
リリース            : 1.6.amzn1
容量                : 0.0
リポジトリー        : installed
提供元リポジトリー  : amzn-main
要約                : MySQL meta package
URL                 : http://www.mysql.com
ライセンス          : GPLv2 with exceptions
説明                : MySQL is a multi-user, multi-threaded SQL database server.
                    : MySQL is a client/server implementation consisting of a
                    : server daemon (mysqld) and many different client programs
                    : and libraries. The base package contains the standard
                    : MySQL client programs and generic MySQL files.

名前                : mysql-server
アーキテクチャー    : noarch
バージョン          : 5.5
リリース            : 1.6.amzn1
容量                : 0.0
リポジトリー        : installed
提供元リポジトリー  : amzn-main
要約                : The MySQL server and related files
URL                 : http://www.mysql.com
ライセンス          : GPLv2 with exceptions
説明                : MySQL is a multi-user, multi-threaded SQL database server.
                    : MySQL is a client/server implementation consisting of a
                    : server daemon (mysqld) and many different client programs
                    : and libraries. This package contains the MySQL server and
                    : some accompanying files and directories.
$ mysql --version
mysql  Ver 14.14 Distrib 5.5.46, for Linux (x86_64) using readline 5.1
```

# サービス自動起動設定

```console:console
$ chkconfig mysqld on
$ chkconfig | grep mysqld
mysqld         	0:off	1:off	2:on	3:on	4:on	5:on	6:off
```

# MySQL起動

```console:console
$ service mysqld start
```

# rootパスワード変更

mysqlにログインし、rootのパスワードを変更します
input-your-passwordの部分は任意に変更してください。

```console:console
$ mysql -u root
mysql> show databases;
mysql> use mysql;
mysql> show tables;
mysql> update user set password=password(‘input-your-password’) where user='root';
mysql> flush privileges;
mysql> quit;
```

上で設定したパスワード付きで再度ログインを試みます。
成功したらquitで抜けます。

```console:console
$ mysql -u root -p
password:
mysql> quit;
```
MySQL5.6でINSERT/UPDATE時のエラーを無視する


ずっと5.5環境で開発していて、5.6に移したら、

```bash
ERROR 1406 (22001): Data too long for column 'name' at row 1
```

などと、オーバーフローを知らせるエラーが。
調べてみると5.6から、Strict Modeの設定がされていて、チェックが文字通り厳格になったようである。

##回避方法

###その１：my.cnfをいじる

/etc/my.cnfを見てみると、

```bash
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
```
という記述がある。これを、

```bash
sql_mode=''
```
とすると無効になるらしい。MySQLの再起動を忘れずに。

###その２：SQL文にIGNOREを入れる

条件が許せばこちらのほうが手軽か。

```bash
INSERT IGNORE INTO members(name) VALUES('hogehogehoge');
```
などとする。UPDATE IGNOREというのも使える。単に長さエラーだけでなく、その他の制約も無視できる。
【RDS】　sleepプロセス大虐殺。1分以上眠ってたら殺してやる。同情なんてしない。



同情?
ボクはそんな心持ってないよ。
でもボク優しいから1分間だけ待つんだ。

でも1分待ったらワンライナーで殺してあ♪げ♪る♪


```shell:path/to/hoge
mysql {DB名} -h {host} -u {ユーザー名} -p{パスワード} -e "select concat('KILL ', id, ';') from information_schema.PROCESSLIST where USER='{ユーザー名}' and Command='Sleep' and TIME > 60;" > /tmp/kill.log;cat /tmp/kill.log|awk 'NR > 1 {print}' > /tmp/rds_kill.log |mysql {DB名} -h {host} -u {ユーザー名} -p{パスワード} -e "source /tmp/rds_kill.log"
```
ドットチェイン表現で配列要素をget/set/unset

# 目的とする関数

パフォーマンス面はおいといて，利便性の面からこんな関数が欲しい．できれば`eval`は使いたくない．

```php
<?php

$array = [
    'a' => [
        'b' => [
            'c' => 1,
        ],
    ],
];

var_dump(array_get($array, 'a.b')); // ['c' => 1]
var_dump(array_get($array, 'a.b.c')); // int(1)
var_dump(array_get($array, 'a.b.x')); // NULL

array_set($array, 'a.b.d', 2);
var_dump(array_get($array, 'a.b')); // ['c' => 1, 'd' => 2]

array_unset($array, 'a.b.c');
var_dump(array_get($array, 'a.b')); // ['d' => 2]

array_unset($array, 'a.x');
var_dump(array_get($array, 'a')); // ['b' => ['d' => 2]]

array_unset($array, 'a');
var_dump($array); // []
```

# 実装

`array_unset`だけちょっと複雑になってます．

- 要素を削除するためには必ず**親**が必要なので`$current`を辿りつつ`$parent`も同時にずらしていく
- 存在しない要素を参照代入で作ってしまわないように`array_key_exists`でのチェックが必要

```php
<?php

function array_get(array $array, $path, $separator = '.') {
    $keys = explode($separator, $path);
    $current = $array;
    foreach ($keys as $key) {
        if (!isset($current[$key])) return;
        $current = $current[$key];
    }
    return $current;
}
 
function array_set(array &$array, $path, $value, $separator = '.') {
    $keys = explode($separator, $path);
    $current = &$array;
    foreach ($keys as $key) {
        $current = &$current[$key];
    }
    $current = $value;
}

function array_unset(array &$array, $path, $separator = '.') {
    $keys = explode($separator, $path);
    $current = &$array;
    $parent = &$array;
    foreach ($keys as $i => $key) {
        if (!array_key_exists($key, $current)) return;
        if ($i) $parent = &$current;
        $current = &$current[$key];
    }
    unset($parent[$key]);
}
```
技術英語 > They haven't had the chance to [voice] their opinions. / If you insist…

@ Star Trek Voyager > ALLIANCES

Chakotay と Janeway の議論の中、Chakotay が部下について

> They haven't had the chance to <font color=red>voice</font> their opinions.

http://eow.alc.co.jp/search?q=voice&ref=sa

<hr>
関連して思い出したのは

> If you insist…

http://eow.alc.co.jp/search?q=if+you+insist
UFW(Uncomplicated FireWall)覚書

[iptables](http://qiita.com/JhonnyBravo/items/74efc79f10dbccdcddde) を簡単に設定する為のツール。

# ヘルプ表示

```bash
ufw help
```

ufw のコマンド一覧を表示する。

# 状態表示

```bash
ufw status
```

ufw が有効か無効かを表示する。
ルールが設定されている場合は設定済みのルール一覧を表示する。

```bash
ufw status numbered
```

ufw の有効 / 無効、設定済みルールの一覧を番号付きで表示する。

# UFW の有効化 / 無効化

```bash
ufw enable | disable
```

ufw を有効 / 無効にする。

# 通信ルールの設定

```bash
ufw default DENY | REJECT
```

|ルール|動作|
|---|---|
|DENY|外部から入ってくる通信を遮断する。外部からの接続が試行された場合、 Connection Refused を返さず、タイムアウトする。|
|REJECT|外部から入ってくる通信を遮断する。外部からの接続が試行された場合、 Connection Refused を返す。|

```bash
ufw allow ポート番号/プロトコル
```

ポート番号のみを指定した場合は指定した番号のポートを開く。
``ポート番号/プロトコル`` を指定した場合は
指定した番号のポートを開き、指定したプロトコルにおける通信のみを許可する。

```bash
ufw allow from IP アドレス
```

指定した IP アドレスからの接続を許可する。

```bash
ufw allow from IP アドレス to any port サービス名
```

指定した IP アドレスからの、指定したサービスによる接続を許可する。

```
ufw allow アプリケーション名
ufw app list
```

指定したアプリケーションにおいて使用される通信を許可する。
アプリケーション定義は ``/etc/ufw/application.d/`` ディレクトリに格納されている定義を使用する。
``ufw allow アプリケーション名`` で使用可能なアプリケーション定義の一覧は
``ufw app list`` で確認することができる。

```bash
ufw allow サービス名
```

指定したサービスで使用するポートを開き、通信を許可する。
ポート番号とプロトコルの組合せは ``/etc/services`` に記載された定義が使用される。

```bash
ufw limit サービス名
```

指定したサービスにおいて繰返し試行される接続を拒否する。
ブルートフォースアタックに対する防御に使用されることが多い。

# 定義済みルールの削除と追加

```bash
ufw delete ルール
```

指定したルールを削除する。

```bash
ufw insert ルール番号 ルール
```

指定したルール番号の位置へルールを追加する。

# ログの出力設定

```bash
ufw logging off | low | medium | high | full
```

ログに記録するレベルを設定する。
ログは ``/var/log/syslog`` へ出力される。

|ログレベル|動作|
|---|---|
|off|完全に無効|
|low|default 以外のルールによりブロックされる通信を記録する。|
|medium|allow / deny に合致する通信、不正なパケット、新しい接続を記録する。(既定値)|
|high|allow / deny に合致する通信、不正なパケット、新しい接続を記録する。 medium よりも詳細な記録を出力する。|
|full|全てのログを記録する。|

このページに記載したコマンドの他にも
パケット転送を定義するコマンドが存在するようだが書式がやや複雑。
[/etc/ufw/sysctl.conf](http://qiita.com/JhonnyBravo/items/f66eef4ccf6de1360454) や [/etc/default/ufw](http://qiita.com/JhonnyBravo/items/6ad183637a9d2a09b1f7) 、 [/etc/ufw/before.rules](https://qiita.com/JhonnyBravo/items/3416bb092e7e74d06577) 等を
直接編集する方が早いような気がする。
ナップサック問題

「重さが1,3,5,6,8 という5つの品物をいくつか選んで、最も10に近づけるにはどう組み合わせればいいか」
こういう問題のことをナップサック問題といいます。
今回は1,3,6と詰めれば、丁度10になりますが、どのように組みわせてもぴったりになることはない問題もあります
[ナップサック問題](https://ja.wikipedia.org/wiki/%E3%83%8A%E3%83%83%E3%83%97%E3%82%B5%E3%83%83%E3%82%AF%E5%95%8F%E9%A1%8C)

一次元のタイルパズルという感じで簡単そうに見えますが、完全に求めるには総当りしかない、結構厄介な問題です
品物の候補が100個ある場合、2^100通りの選び方があるのでとてもまともには計算できません

そこで、枝刈りポイントを探していきましょう
多くの場合は、100個の品物があっても、せいぜい入るのは10個前後でしょう
ですので、全てをチェックする必要がないことがわかります

入るパターンを効率よく探すために、以下のアルゴリズムで探索していきます
まず、メモを用意して、1個目の品物の重さを書きます
2個目は、2個目の品物の重さと、これまでメモに書いていた値と2個目の品物の重さを合計したものを書きます
ナップサックの限界を超えたものはメモには書きません
こうすることで効率よく重さの組み合わせを羅列することが出来ます

さらに、このメモには同じ重さの時は1つだけ残すようにします
こうすることで、際限なくメモが必要ということが避けられます

例として、15kg入るナップサックに1g単位の品物を入れることを考えます
ナップサックに入る重さは0～15000gの15001通りの値しかありません
ですから、15001個分のデータを保存できるメモリがあれば充分です

そんな感じでC++で組んだプログラムが以下になります

```cpp:knapsack.cpp
#include<map>
#include<vector>
#include<algorithm>
#include<iostream>

std::vector<int> knapsack(const std::vector<int> &item, int limit){
	typedef std::map<int, int> MemorizeMap;
	MemorizeMap data;
	int index = 0;
	for (auto m : item){
		std::vector<int> add;
		for (auto d : data){
			int weight = d.first + m;
			if (weight <= limit) add.push_back(weight);
		}
		for (auto v : add) data.insert(MemorizeMap::value_type(v, index));
		data.insert(MemorizeMap::value_type(m, index));
		index++;
		if (!data.empty() && data.cbegin()->first == limit) break;
	}

	auto it = data.lower_bound(limit);

	std::vector<int> ret;
	for (;;){
		if (it == data.end()) break;
		ret.push_back(item[it->second]);
		int rest = it->first - item[it->second];
		if (rest == 0) break;
		it = data.find(rest);
	}

	return ret;
}

int main()
{
	std::vector<int> data;

	int total = 0;

	for (int i = 1; i <= 12; i++){
		int cube = i * i * i;
		data.push_back(cube);
		total += cube;
	}

	auto result = knapsack(data, total / 2);
	for (auto r : result){
		std::cout << r << std::endl;
	}

	return 0;
}

/*Output
1331
1000
343
216
125
27
*/
```

サンプルとして、1辺が1cm～12cmの1cm刻みの立方体が12個あって、
この重さ(1辺の3乗)が丁度二等分に近い分け方を探しだすパターンを出しています
毎日の作業フォルダを作成するためのBAT

#概要
仕事で、その日の作業フォルダを作成するときにデスクトップにドカドカ置かずに
**システム日付を使ってフォルダを作れないか？**
**そのフォルダにアクセスしやすくならないか？（クリックするとその日のフォルダに行けるショートカットのイメージ）**
と思っていたので昔作ったもので今でも改良しつつ使っている。

#メリット
フォルダを毎日作ることで、
・常にバックアップを意識しなくてもその日のフォルダに残ってる
　今日日付内のフォルダで間違えて上書きしてしまっても昨日時点のものは残ってる。
・ある過去の日に何やっていたかが何となく分かる可能性がある。
・消すときに楽(過去一年は要らないとか。一ヶ月単位、1日単位で消しやすい）
・フォルダ管理が楽（その日のものはその日のフォルダに入れる習慣づけ）

デメリットは、
いつの間にか30GBぐらい使っていて容量が少なくなった時とか。
助長な管理になってしまうとか。

##サンプル
`C:\work\個人用\2016\201604\0401`
が作成され上記のパスのExplorerが立ち上がる。
※ソース上でC:\work\個人用\がリテラルで記入されている前提。好きなフォルダに変える必要あり。
　ネットワークドライブでも動作する。
このBATでは、フォルダが存在しなかったとしても実行するとその日のフォルダが作成される。


#ソース
```lang:Work.bat
@echo off
rem システム日付ディレクトリ作成&移動用マクロ
rem デスクトップに置くと幸せ。
rem ★任意のディレクトリを書く。
set workDir=C:\work\個人用\
set dt=%date%
set yy=%dt:~-10,4%
set mm=%dt:~-5,2%
set dd=%dt:~-2,2%
rem このへんで、C:\work\個人用\yyyy\yyyymm\mmdd\の文字列を作る。
set dateDir=%workDir%\%yy%\%yy%%mm%\%mm%%dd%\

rem パスを確認して、なければディレクトリを作成
if not exist %dateDir% mkdir %dateDir%
rem ディレクトリ移動
cd /d %dateDir%
rem エクスプローラ起動。
start.
```

#最後に
直接batを起動せずにショートカットを作成して、
プロパティから以下のように設定してしまえば実行時のDOS画面がじゃまにならない。
後、ショートカットタブの実行時の大きさについても最小化を選ぶと更に目立たなくなる。
![image](https://qiita-image-store.s3.amazonaws.com/0/53550/09a8705e-6b68-5196-fb55-d82c72cbf4b1.png)
jQueryの先頭にセミコロンがあるのはなぜか(ただのメモ)

本当にただのメモです

コードの意図しない動作を防ぐためらしい。以上。

[[JS] jQuery で ;(function () ...と、セミコロンで始めることがあるのはなぜか](http://d.hatena.ne.jp/kitokitoki/20110831/p2)

[jQueryプラグインの先頭にセミコロンがある理由](http://www.koikikukan.com/archives/2013/04/09-003300.php)
SensioLabsInsightを使ってみた

SensioLabsが提供する解析ツールSensioLabsInsightを使ってみました。

## 設定
https://insight.sensiolabs.com/
真ん中にあるボタンから
今回の解析対象はGitHubのpublicリポジトリだったので"GitHub"を押下
あとは画面の指示に従ってアプリケーション連携の設定などをしていきます。

## 解析
ひととおり設定が終わると指定したリポジトリに対して解析が走ります。
解析結果はこのように
![Analysis_msmsny.png](https://qiita-image-store.s3.amazonaws.com/0/117117/5e4c39dd-1a98-7607-8442-b7a580d61585.png)

## 使用感
もともとScrutinizerを使っていたので指摘箇所は少なめでしたが

* unused useを検出してくれる
* 指摘箇所やどうすればよいかがわかりやすい
* 解析結果が出るまでが速い
* 無料版だと直近5件の結果までしか保存されない

unused useはScrutinizerでは指摘されていなかったところなので、Scrutinizerとあわせて併用するとよさそうですね。

またSensioLabsInsightの設定時に選択したプロジェクトタイプ"Symfony bundle"特有の指摘事項を期待していたのですが今回は特にありませんでした。（ここの指摘があるとおもしろそうだったのですが）
以下に解析内容が詳しく書いてあります。いろいろ細かくチェックしているようです。
https://insight.sensiolabs.com/what-we-analyse
「Advanced Swift」のSwiftコーディング規約


> 以下は書籍「[Advanced Swift](https://www.objc.io/books/advanced-swift/)」のSwiftコーディング規約の部分を翻訳したものです。原文はオンラインプレビューで公開されています。
[Advanced Swift - Swift Style Guide](https://www.objc.io/books/advanced-swift/preview/#swift-style-guide)

この本を書くとき、そして私たちのプロジェクトでSwiftのコードを書くとき、以下のルールに従うようにしています。

- 可読性が最も重要です。これには簡潔性が助けになります。
- 関数には常にドキュメントとしてのコメントをつけましょう。ジェネリクスを使うものは特に。
- 型は大文字で始め（`UpperCaseLetters`）、関数と変数は小文字で始めます（`lowerCaseLetters `）。
- 型推論を使いましょう。型が明らかなのに明示的に書くことは可読性を損ないます。
- 曖昧さがある場合や規約を定義する場合は型推論を使わないようにしましょう。（例えば`func`が明示的な戻り値の型を持つのはこれが理由です）
- クラスにしかない機能や参照型の性質が必要でない限り構造体を使いましょう。
- クラスは継承される前提の設計でない限り`final`としましょう。
- 後置クロージャ（trailing closure）を使いましょう。直後に別の開き括弧が来る場合は例外です。
- `guard`を使って関数から早期に離脱しましょう。
- 強制アンラップや暗黙的アンラップオプショナル（implicitly unwrapped optional）の利用は避けましょう。これらはときに便利ですが、これらが頻繁に必要になる場合はたいてい他の何かが間違っていることのサインです。
- 同じコードを複数書かないようにしましょう。似たようなコードを何回か書いていることに気づいたらそれを一つの関数にまとめましょう。その関数はプロトコル拡張として実装することを検討してください。
- `map`、`reduce`を積極的に使いましょう。ただし強制はせず、`for`ループが適切な場合はそちらを使いましょう。高階関数を使う目的はコードの可読性を高めることです。`for`ループの方がわかりやすい場面でむりやり`reduce`を使うことはこの目的に反します。
- 定数を積極的に使いましょう。値を変更することがわかっている場合を除いて`let`を使いましょう。ただしコードがより分かりやすく効率よくなる場合は変数にしてください。その場合、値の変更を関数内に閉じることで予想外の副作用を防ぎましょう。
- Swiftのジェネリクスを使うと関数のシグネチャが長くなりがちです。残念ながら長い関数定義を複数行に分ける良い方法が今のところ定まっていません。サンプルコードではできる限り一貫性を持たせるようにします。
- この本の著者の半数にとってとても残念なことですが、「cuddled else」がSwiftの公式スタイルです: `} else {`
Rails系のgemのversion.rbが独特だった話

独特かどうかはわかりませんが、、、

僕はこんなことしなかったし考えもしなかったなと。


まず、gemを作るときはversion.rbというファイルにversionを書きます。
そしてgemspecでそれを読むわけですが、
普通はこれくらいかなと。

Hogeというgemを作ると仮定して、

```rb
# hoge/version.rb
module Hoge
  VERSION = "1.0.0".freeze
end
```

しかし、rails系(actionxxxxやactivesupportなどは)

```rb
# active_support/version.rb
module ActiveSupport
  # Returns the version of the currently loaded ActiveSupport as a <tt>Gem::Version</tt>
  def self.version
    gem_version
  end
end

# active_support/gem_version.rb
module ActiveSupport
  # Returns the version of the currently loaded Active Support as a <tt>Gem::Version</tt>.
  def self.gem_version
    Gem::Version.new VERSION::STRING
  end

  module VERSION
    MAJOR = 5
    MINOR = 0
    TINY  = 0
    PRE   = "beta3"

    STRING = [MAJOR, MINOR, TINY, PRE].compact.join(".")
  end
end
```

gem_version.rbを定義し、そこで管理している。
そこまでやる必要があるのかが正直わからないが、かっこいいなとだけ思いました。