OmniAICreator/Qiita-1.07M huggingface dataset:
最近の Web 開発者が使ってるらしいサービス

MDN のページのヘッダ部分に、開発者が使っているサービスについてのアンケートがあったので回答してみた。

内容は、開発の上で使える様々なサービスについてだったんだけど、その選択肢が知らないのもいくつかあっておもしろかった。
MDN のアンケートの選択肢にあがるってことは、今こういうサービスがメジャーなんだなーと思ったので貼っておく。
(ただし、 Code Hosting -> Github や IaaS -> AWS みたいな分かりきってるのは省く)

ちなみにサーベイは以下。

https://www.surveygizmo.com/s3/1972646/mdn-services-2015q1

# load-test
- [Loader.io](http://loader.io/)
- [LoadImpact.com](http://loadimpact.com/)
- [Loadstorm.com](http://loadstorm.com/)

# browsertest
- [SauceLabs](https://saucelabs.com/)
- [BrowserStack](http://www.browserstack.com/)
- [W3C validators](http://validator.w3.org/)
- [CrossBrowserTesting](https://crossbrowsertesting.com/)
- [Browsera](http://www.browsera.com/)

# security
- [Nessus](http://www.tenable.com/products/nessus)
- [WebInspect](http://www8.hp.com/us/en/software-solutions/application-security/index.html) ?
- [NetSparker](https://www.netsparker.com/)
- [OpenVAS](http://www.openvas.org/)
- [Rapid 7](http://www.rapid7.com/)
- [AppScan](http://www.ibm.com/developerworks/downloads/r/appscan/) ?

# a11y
- [FAE](http://fae.cita.uiuc.edu/)
- [WAVE/WebAIM](http://wave.webaim.org/)
- [A-Tester](https://chrome.google.com/webstore/detail/a-tester-wcag-20-web-acce/mbmcfgbjmddnnpkibfgnofecdemjcdaa?hl=en-GB)

# traffic
- [KISSMetrics](https://www.kissmetrics.com/)
- [Google Analytics](http://www.google.com/intl/ja_jp/analytics/)
- [Piwik](http://piwik.org/)

# performance
- [Google PageSpeed](https://developers.google.com/speed/pagespeed/insights/?hl=ja)
- [WebPageTest.org](http://www.webpagetest.org/)
- [Google Analytics](http://www.google.com/intl/ja_jp/analytics/)
- [New Relic](http://newrelic.com/)
MogokのDBにSQLを実行する方法

# MogokのDBにSQLを実行する方法

Mogok管理ページから
アプリケーション管理 > xxx > Rubyスクリプト実行

```
require "#{Rails.root}/app/models/user"

@result = ActiveRecord::Base.connection.select("select * from users")

p @result
```
Mogokことはじめ

# Mogokことはじめ

ローカルで動いてたRailsアプリをMogokで動かすまで。

```bash

$ git clone xxx.git

$ mogok bind

$ vim config/secrets.yml

production:
  secret_key_base: xxxx

$ vim Gemfile
gem 'mysql2', groups: %w(production), require: false
gem 'therubyracer', :platforms => :ruby, groups: %w(production), require: false

$ vim config/database.yml
production:
  <<: *default
  adapter: mysql2
  database: db/production.pg

$ git push origin master

$ git push mogok master

$ mogok rake db:migrate

$ mogok build

$ mogok start

```
PythonでRedisのトランザクションっぽいことをやる

```py:test_transaction.py
# -*- coding: utf-8 -*-
from __future__ import absolute_import
from __future__ import unicode_literals

import redis
import time
from multiprocessing import Process

r = redis.StrictRedis(host='localhost', port=6379, db=0)
key = "abc"

def do(name, value):
    with r.pipeline() as pipe:
        try:
            pipe.watch(key)
            pipe.multi()

            pipe.set(key, value)
            time.sleep(1)

            pipe.execute()

            print "{} Success!!!".format(name)
        except redis.exceptions.WatchError:
            print "{} WatchError!!!".format(name)

p1 = Process(target=do, args=("p1", 1))
p1.start()
p2 = Process(target=do, args=("p2", 2))
p2.start()

time.sleep(3) # 処理が終わるまで待つ
print r.get(key)
```

実行結果:
% python test_redis.py 
p2 WatchError!!!
p1 Success!!!
1

エラーとなったほうが取り消させるような感じになります。
使いかってがRDBSほどよくないので、ちょっとできるかも的な感じで。
hitSuji\Templateクラス

# hitSuji\Templateクラス

[Web framework delivered as a C-extension for PHP](https://github.com/Yujiro3/hitSuji "Web framework delivered as a C-extension for PHP")


* [基底クラス](http://qiita.com/Yujiro3/items/c2700cc874188046a085)

```php:hitSuji\Templateクラス
class hitSuji\Template {
    public function layout(string $failename);
    public function content(string $failename);
    public function assigns(array $values);
    public function assign(string $key, mixed $value);
    public function display();
}
```

## レイアウトの設定

public function layout(string $failename);

**引数**

| 名前       | 型      | 概要       |
|:----------:|:-------:|:----------:|
| failename  | string  | ファイル名 |

```php
\hitSuji::view(
)->layout('layout.tpl');
```

## メインコンテンツの設定

public function content(string $failename);

**引数**

| 名前       | 型      | 概要       |
|:----------:|:-------:|:----------:|
| failename  | string  | ファイル名 |

```php
\hitSuji::view(
)->content('main.tpl');
```


## 配列の登録

public function assigns(array $values);

**引数**

| 名前       | 型      | 概要       |
|:----------:|:-------:|:----------:|
| values     | array   | 連想配列   |

```php
\hitSuji::view(
)->assigns(array(
  'id'  => 3,
  'name'=> 'seeps',
));
```

## 変数の登録

public function assign(string $key, mixed $value);

**引数**

| 名前     | 型      | 概要       |
|:--------:|:-------:|:----------:|
| key      | string  | キー       |
| value    | mixed   | 変数       |

```php
\hitSuji::view(
)->assign('id', 3);
```

## 表示処理

public function display();

```php
\hitSuji::view(
)->layout('layout.tpl'
)->display();
```
手っ取り早くあなたのWordPressサイトをローカルＰＣで動かしたい

# はじめに
あなたが運営しているWordpressサイトを試しに自分のＰＣ内のxampp上で動かしたいことってありますよね。

しかし、wordpressってご存知の通りドメインを変更するだけなのに、要所要所でフルパスが使われているため、いろんなテーブルをアップデートしたりと、ほんと疲れます。

そこで、とりあえずログインできて、最低限ページを確認できればいいやってかたに、試す価値のあるとてもお手軽な方法をお伝えします。
**※この方法は決して万能ではございません**
# やり方
## 手順１
ＦＴＰ等でコンテンツ一式ダウンロードして、ローカルのwebサーバに配置
## 手順２
mysqlのデータベースをエクスポート＆ローカルにインポート

## 手順３
あなたのテーマのfunctions.phpに下記のソースを書く。
__your.domain__ の部分を変更しましょう

```php:wp-content/themes/your_theme/functions.php
<?php
if(preg_match('/localhost/', $_SERVER['HTTP_HOST'])):
  function replace_host_callback($html){
    $html = str_replace('your.domain', $_SERVER['HTTP_HOST'], $html);
    return $html;
  }
  ob_start("replace_host_callback");
endif;
```
HTMLを出力する時にドメインをローカルドメインに強引に変換してやるだけです。。

この方法は、下記のような方法でサブドメインで振り分けるような設定をしている方にとって便利です。

```text:hosts
127.0.0.1       localhost
127.0.0.1       site1.localhost
127.0.0.1       site2.localhost
...
```
```text:httpd.confなど
<VirtualHost *:80>
  DocumentRoot "C:/xampp/htdocs"
  ServerName localhost

  RewriteEngine on
  RewriteCond %{HTTP_HOST} ^[^.]+\.localhost$
  RewriteRule (.*) %{HTTP_HOST}$1  [C]
  RewriteRule ^([^.]+)\.localhost(.*) C:/xampp/htdocs/$1/$2  [L]
</VirtualHost>
```
# おわりに
思いついた時、個人的にはヒットだったので、つい投稿しました。。
完了ハンドラをn回待つ非同期テスト用ヘルパーメソッド


## 動機
いくつかの非同期処理を挟んだとしても、一番最後に結果を評価することが出来る機構が欲しかったので作りました。


## 実装

```swift

extension XCTestCase {
    
    typealias DoneStatement = () -> Void
    func wait(till num: Int = 1, message: String = __FUNCTION__, _ block: DoneStatement -> DoneStatement) {
        self.wait(till: num, message: message, timeout: 10, block)
        
    }
    func wait(till num: Int, message: String = __FUNCTION__, timeout: NSTimeInterval, _ block: DoneStatement -> DoneStatement) {
        
        let expectation = self.expectationWithDescription(message)
        let queue = dispatch_queue_create("XCTestCase.wait", nil)
        var living = num
        
        var completion: (() -> Void)!
        let done: DoneStatement = {
            dispatch_async(queue) { //シングルキューで必ず順番に処理する
                living--
                if living == 0 {
                    completion?()
                    expectation.fulfill()
                }
            }
        }
        
        completion = block(done)
        
        self.waitForExpectationsWithTimeout(timeout) { (error) -> Void in
            completion?()
            return
        }
    }
}
```


## 使い方

上記`extension`を実装し、以下のように呼び出します。

```swift:HogeTests.swift


func test_一つの場合() {
    wait { done in
        
        let queue = dispatch_queue_create("hoge", nil)
        dispatch_async(queue) {
            XCTAssertEqual(1 + 2, 3, "")
            done()
        }
        
        return {
            XCTAssertEqual(1 + 1, 2, "waitの一番最後に呼び出される")
        }
    }
}


func test_複数の場合() {
    wait(till: 2) { done in
        
        var ret = 0
        let queue = dispatch_queue_create("hoge", nil)
        
        dispatch_after(when(0.4), queue) {
            XCTAssertEqual(1 + 2, 3, "")
            done()
        }
        
        dispatch_after(when(1), queue) {
            XCTAssertEqual(1 + 3, 4, "")
            ret = 2
            done()
        }
        
        return {
            XCTAssertEqual(2, ret, "")
            XCTAssertEqual(1 + 1, 2, "waitの一番最後に呼び出される")
        }
    }
}

```
function(e)を使ってみる

**宿題**
↓を実行してクリックした対象のconstructorがHTMLDivElementのときにconsole.log("success");を実行する

```js:js
document.body.addEventListener("click", function (e) {
  // -- 解答ここから  

  // -- ここまで
  e.preventDefault();
  e.returnValue = true;
});
```

###eはeventのe
function(e) この引数eは、eventの「e」

イベントハンドラにはイベントオブジェクトが渡される
https://developer.mozilla.org/ja/docs/Learn/JavaScript/Building_blocks/Events

firebugなどのコンソールでconsole.log(e)してDOMのプロパティ調査などで色々見るといい。
色々応用できそうな気分になれます。
<br>
**解答例**
（今回はe.target.tagNameを使用）

```js:js
document.body.addEventListener("click", function (e) {
  // -- 解答ここから
  if ( e.target.tagName == "DIV" ) {
    console.log("success");
  }else{
    console.log("failed");
  }
  // -- ここまで
  e.preventDefault();
  e.returnValue = true;
});
```
PHP5.3で不可能な配列関数処理後の参照

5.4の環境で何気なく書いていたコード。

```php
array_keys($test_array)[0];
```

どうやら5.3（以下？）では直接のインデックス参照を許してくれないらしい。

仕方がないので以下のように記載。

```php
$keys = array_keys($test_array);
$keys[0];
```
PythonでRedisのパイプライニング


```py:test_pipline.py
# -*- coding: utf-8 -*-
from __future__ import absolute_import
from __future__ import unicode_literals

import redis
import time

r = redis.StrictRedis(host='localhost', port=6379, db=0)

# 通常の場合
start = time.time()
for key in range(1000):
    r.get(key)
stop = time.time()
print stop - start

# パイプライニングした場合
start = time.time()
with r.pipeline() as pipe:
    for key in range(1000):
        pipe.get(key)
    pipe.execute()
stop = time.time()
print stop - start
```

実行結果:
% python test_pipline.py 
0.168359994888
0.0300588607788
【openssl】opensslをC++で使う為にビルドした

#概要
そこら中に転がってるであろうopensslのビルド方法まとめ。
C++で利用するのに必要だったので、折角やったからとりあえずざっくりとまとめてみた(タイトルも完全なものではなかったから一応変更)。

#入れたOS
CentOS6.6。

#最新のopensslを落とす

ここから落とす。

> https://www.openssl.org/source/

![kore.png](https://qiita-image-store.s3.amazonaws.com/0/59944/c441f240-a82f-18f9-c7b2-b55c9b56ddb3.png)

自分はCUIだったのでwgetを使った。無いなら入れても良いと思う。

```bash
$ sudo su
$ yum install wget
$ wget https://www.openssl.org/source/openssl-1.0.2.tar.gz
$ tar zxvf openssl-1.0.2
```

#ビルドしてインストール

##事前準備
ビルドの際にlibsslが必要なんだけど入れていない場合は入ってないので入れる必要がある。

```bash
$ yum install openssl-devel
```

##コンフィグ
./configする。基本的には次の３つだと思う、それ以外にも色々あるけど詳細は同梱されてるINSTALLってテキストファイルを読むか

> http://wiki.openssl.org/index.php/Compilation_and_Installation

がとても参考になる。
コンフィグでは基本的には以下３つを設定することになると思う。

  * インストールフォルダの指定
  * 不要なライブラリを切る指定
  * シェアードライブラリにするかどうか

指定なしの場合は次のコマンドを打ったのと同じになると書かれてるのでこれが嫌な人はどうぞ。

```bash
# 以下が $ ./config と同じ
$ ./config --prefix=/usr/local --openssldir=/usr/local/openssl
```

###インストールフォルダの指定
--prefix、--openssldirのオプションを使って指定する。
指定無しの場合は上記で既に解説済み。

###不要なライブラリを切る指定
> no-ライブラリ名

ってオプションを噛ますと指定できる。
利用していないライブラリに特許が入っていると面倒くさいことになる。だから使わないライブラリは極力切った方が良い。とはいえ特許の専門家でも無いので使ってないライブラリが入ってたからどうのみたいなところの詳細については知らない。怖い人は切った方が良い程度に。

###シェアードライブラリにするかどうか
sharedってオプションがある。
ようはシェアードライブラリとして作りたい人用。お好きなように。

###参考までに自分のconfig
最終的にこういうconfigになった。

```bash
$ ./config --prefix=/opt/openssl-1.0.2 no-idea no-mdc2 no-rc5 no-ec shared
```

##make
コンフィグを噛ますとライブラリの有効無効を１つでも設定した場合make dependしろと言われる。
configの際に「no-何たら」でライブラリを無効にした人はmake dependすること。

```bash
# ライブラリを無効にした場合
$ make depend
$ make
$ make test
```

```bash
# 特に無効とかの指定はせずに./configだけした場合
$ make
$ make test
```

make testでERRORとかが一番最後に出なければOK。ERRORとかいう文字が出ている場合は何かおかしい。
自分の場合次のエラーが出た。

> cannot find -lssl

libsslが無かったらしい。ちゃんと上述の「事前準備」でopenssl-develをインストールしていればこのエラーはでないはず。
何もエラーが出なければmake installして終わり。

```bash
$ make install
```

デフォルトのインストール先は/usr/local/opensslらしいのでlsとかで確認しても良いししなくても良い。

```bash
$ ls /usr/local/
(省略)... openssl ...(省略)
```
webで頑張っている元教え子ちゃんにおくるまとめ＃6 無料サンプルコード


#記述の動機
専門学校でPG、Webを教え始めてもう８年。
マイナススタートの２年はあまりに短い。教えきれなかったことが多い。
頑張ってる元教え子ちゃんにむけてまとめているのですが
ついでに、公開しておきます。

#コンピュータ書籍は高価。
コンピュータ書籍は、残念ながら当たり外れが大きい。
安定してるのはオライリージャパンなんだけど、高価ですね。
私なんか、書店一回で３万円くらい使ってしまう。
何とか金銭コストを圧縮したい。

#本家サイトはサンプルコードがDL可能
http://shop.oreilly.com/
ここでサーチします。
書籍によるけど、サンプルコードがzip,又はGithubで得られます。
![スクリーンショット 2015-02-04 18.05.52.png](https://qiita-image-store.s3.amazonaws.com/0/33317/c847480c-a000-0403-5ef9-d90674922420.png "スクリーンショット 2015-02-04 18.05.52.png")

右側にDLリンクが有る場合はゲット出来ます。
![スクリーンショット 2015-02-04 18.22.29.png](https://qiita-image-store.s3.amazonaws.com/0/33317/f07fef83-18ec-4c2a-d434-1071273d2ae5.png "スクリーンショット 2015-02-04 18.22.29.png")

#注意事項
購入前提です。著作権を侵害してはなりません
サンプルコードとREADMEを読むだけで、買わんでいいってのも結構あります。
時間コストはかかるけど、試す価値有りです。
優秀なプログラマの美しいコードを学びましょう。
良い時代だと思う。
統計学の代表的な手法を実践する (1)

西内啓氏著書の「[統計学が最強の学問である](http://www.amazon.co.jp/dp/4478022216)」と「[統計学が最強の学問である実践編](http://www.amazon.co.jp/dp/4478028230)」はシリーズ累計 37 万部を突破する異例のベストセラーとなりました。読まれた方も多いのではないでしょうか。

この前後 2 冊では、統計学の教科書に登場する様々な手法を「[一般化線形モデル](http://ja.wikipedia.org/wiki/%E4%B8%80%E8%88%AC%E5%8C%96%E7%B7%9A%E5%BD%A2%E3%83%A2%E3%83%87%E3%83%AB)」という考え方に基づき一枚の表にまとめています。

ここではその表を引用致します。

統計学が最強の学問である p170 一般化線形モデルをまとめた一枚の表

![1.png](https://qiita-image-store.s3.amazonaws.com/0/38501/345ff65d-461c-0bd8-a46d-e87b2196dec8.png)

統計学が最強の学問である実践編 p344 統計学の理解が劇的に進む 1 枚の表増補版

![1.png](https://qiita-image-store.s3.amazonaws.com/0/38501/bb5ec092-f995-8277-d619-7a0e24179765.png)

これらの 2 冊は、ビジネスでよく使う統計手法について、一通りそれらがどういう意味を成しているか、どのようなアイデアから生まれてどう使えばいいかといったことが解説されています。

また上著実践編 p357 では本書では得られない 3 つの知識として
1. ツールと実データを使った実践
2. 数理面での手法の深い理解
3. 近年生まれたより発展的な手法
を挙げています。

今回から特に上記 1. に注目し、今まで使ってきた分析用言語で実践をするにあたり簡単なデータを元に例を挙げていきたいと思います。

とは言っても今までに記述してきた中ですでにおこなっているものもありますので、それらの復習を兼ねて進めていきましょう。

## ケースコントロール研究とカイ二乗検定

疫学的推計の最初のものと言われるドールとヒルの「ケースコントロール研究」の話です。

肺がんと喫煙の関連性として 1948 〜 1952 年にかけてイギリス中の病院から 1465 名の肺がんによる入院患者のデータを調査したところ次の通りでした。

||人数|喫煙者|非喫煙者|
|:--|:--|:--|:--|
|男性で肺がん患者|1357|1350(99.5%)|7(0.5%)|
|男性で非肺がん患者|1357|1296(95.5%)|61(4.5%)|
|女性で肺がん患者|108|68(63.0%)|40(37.0%)|
|女性で肺がん患者|108|49(45.4%)|59(54.6%)|

疫学におけるケースとは症例つまり病気となった事例 (患者) のことであり、コントロールとはその比較対照のことです。

このデータに対しカイ二乗検定をおこなうと結果は次のようになります。

```py3
import scipy as sp
import scipy.stats as stats

# 男性のデータ (肺がん患者と非肺がん患者)
man = sp.array([[1350, 7], [1296, 61]])
# 女性のデータ (肺がん患者と非肺がん患者)
female = sp.array([[68, 40], [49, 59]])

def chi_squared_test(data):
    """カイ二乗検定をおこなう関数"""
    # カイ二乗値、 p 値、自由度
    x2, p, dof, expected = stats.chi2_contingency(data)
    return x2, p, dof, expected

results = chi_squared_test(man)
results = chi_squared_test(female)
```

これにより男性については、カイ二乗値は 42.3704259482 p 値は 7.5523446617e-11 自由度は 1 となり、有意な差が認められます。
同じく女性についても、カイ二乗値は 6.04195804196 p 値は 0.0139697819212 自由度は 1 となり、有意な差があります

これにより喫煙の有無が肺がんの症例に影響がないとは言えないことがわかりました。

次回に続きます。
設定ファイルをバージョン管理するためのブランチ戦略

## 解決したい問題

設定ファイルに環境に依存した項目があり、これをローカル環境と本番環境とで変更する必要がある。しかし、環境変数等で適切に切り替える仕組みが存在せず、いちいち手動で修正している。

### 例

設定ファイル

```
LOG_DIR=/var/log/hoge
```

ソース

```
File logDir = new File(properties.getProperty("LOG_DIR");
```

### 理想

設定ファイル

```
LOG_DIR=/var/log/hoge
LOG_DIR_DEV=C:\log\hoge
```

ソース

```
if (env.equals("production")) { // 本番環境
  File logDir = new File(properties.getProperty("LOG_DIR");
} else {
  File logDir = new File(properties.getProperty("LOG_DIR_DEV");
}
```

むしろ今なら「動作確認用の環境をVagrant等で作る」のが王道ですかね？

### 現実

設定ファイル

```
# LOG_DIR=/var/log/hoge
LOG_DIR=C:\log\hoge
```

- 設定ファイルを「変更なしを想定」にして、ブランチを切り替えるたびに修正  
　→ めんどくさい！！
- あれ、いつの間にか「変更なしを想定」じゃなくなってる…  
　→ 間違えて本番リリースしてしまった！！！

## 解決方法

- 設定ファイル専用ブランチを用意し、それに修正をコミットする。
- 動作確認時にrebaseする。

### 例

設定ファイル@master,developブランチ

```
LOG_DIR=/var/log/hoge
```

あるタイミングでdevelopブランチからlocal/mynameブランチを切り、そちらでローカル用の修正＆コミットを行う。

```
LOG_DIR=C:\log\hoge
```

開発フロー

1. developブランチからtopicブランチを切る。
2. 開発→コミットする。
3. local/mynameブランチに切り替え、topicブランチからrebaseする。
4. 動作確認を行う。
5. 不具合が見つかったら、hotfixブランチを切り、そこに修正をコミット。
6. 動作確認が終わったらtopicブランチに戻る。
7. hotfixブランチから変更をcherry-pickで取り込む。
8. 使い終わったhotfixブランチは破棄する。
9. topicブランチをpushする。
10. レビュー後、topicブランチはdevelopにマージされる。

local/mynameブランチは使い回しでOKです。
元の設定ファイルへの変更は、リベースにより取り込まれます。もちろん、設定ファイルに対する変更はそれぞれ(master,develop <=> local/myname)でバージョン管理されます。
うっかりミスでローカル修正分がdevelopに混入する危険もありません。
App ビデオプレビュー登録で You havent't made any changes.　が出た


初めてApp ビデオプレビューを登録しようとしましたが、 You havent't made any changes. がでて小一時間はまりました。

![kobito.1423040320.408554.png](https://qiita-image-store.s3.amazonaws.com/0/8941/4d1e7b39-d008-6839-d150-43a145ba5669.png "kobito.1423040320.408554.png")

## 発生手順

- iTunes Connectで既存アプリのApp ビデオブレビュートスクリーンショットに作成したビデオプレビューをアップロードします。
	- iPad用アプリだったのでiPadのみにアップロードしました。
- 保存を押します。

暫くすると上記エラーが出ます。


## 対応

暫く悩んだんですが、メッセージの通り変更してないよ！ということ？と思ったので

- バージョンの最新情報を少し変更
	- 。の前にスペースを入れるなど
	- 末尾のスペースや改行は無視されるような気がしました。
- 保存を押す。

やったー

- 変更箇所を元に戻す。


## 結論

- App ビデオプレビューだけの登録は変更として扱ってくれない様だ。
GHOST対応してたら色々ちゃけた(壊れた)


glibc脆弱性(CVE-2015-0235)の対応中にyumがおかしくなったので調査
どちらかと言えばrpmとかがメインの話

## yumアップデートに失敗
ログが保存していなかったのでyumのところが無い
　>のあとはコメントです

```
# yum update glibc
> 失敗

#  rpm -q glibc
glibc-2.12-1.47.el6_2.12.x86_64

# yum clean all
> yumのキャッシュとかクリアしてみる

# yum update glibc 
> glibcが無いと言われる(無かったらそもそも動いてないんじゃね

# rpm -q glibc
パッケージ glibc はインストールされていません。
> だからなかったらｒｙ

# yum install glibc
インストール完了
> 何故通ったのかわからない

```

一度サーバを再起動してみる
再起動後にrpm等の確認を実施

```
# rpm -q glibc
glibc-2.12-1.149.el6_6.5.x86_64
glibc-2.12-1.149.el6_6.5.x86_64
glibc-2.12-1.149.el6_6.5.x86_64
> 何故かglibcgが3つある

# sudo yum check > yum.log
Error: check all
> yum checkで状況を確認

# cat yum.log
Loaded plugins: fastestmirror
glibc-2.12-1.149.el6_6.5.x86_64 is a duplicate with glibc-2.12-1.149.el6_6.5.x86_64
glibc-2.12-1.149.el6_6.5.x86_64 is a duplicate with glibc-2.12-1.149.el6_6.5.x86_64
glibc-common-2.12-1.149.el6_6.5.x86_64 is a duplicate with glibc-common-2.12-1.149.el6_6.5.x86_64
glibc-common-2.12-1.149.el6_6.5.x86_64 is a duplicate with glibc-common-2.12-1.149.el6_6.5.x86_64
glibc-devel-2.12-1.47.el6_2.12.x86_64 has missing requires of glibc = ('0', '2.12', '1.47.el6_2.12')
glibc-headers-2.12-1.47.el6_2.12.x86_64 has missing requires of glibc = ('0', '2.12', '1.47.el6_2.12')
> めっちゃ重複してるやん・・・

```


## やったらダメなこと
```
# rpm -e --nodeps --allmatches glibc glibc-common
> これやるとglibcが死ぬのでAWS環境とかだと死ぬ、というか詰む

# yum-complete-transaction
# yum check duplicates | awk '/is a duplicate/ {print $6}' > /tmp/DUPES
# yum remove `cat /tmp/DUPES`
> 他の方のブログにも有りましたが、glibcが死ぬからダメ(依存関係の無いようなパッケージならOK)

```

## 解決策
```
# wget http://yourrepository/glibc-2.12-1.149.el6_6.5.x86_64.rpm
> OS別に使用可能なglibcのrpmを持ってくる

# rpm -e --nodeps --allmatches --justdb glibc
> rpmのdbからglibcの情報を削除する

# rpm -q glibc
パッケージ glibc はインストールされていません。
> dbから削除されたことを確認

# rpm -ivh --justdb glibc-2.12-1.149.el6_6.5.x86_64.rpm
準備中...                ########################################### [100%]
> dbへglibcを追加

# rpm --rebuilddb
> dbの再構築

# rpm -q glibc
glibc-2.12-1.149.el6_6.5.x86_64
> glibcが1個になっているのを確認！！！
　で同じ手順をglibc-commonにも実施

同じ手順なので略

# rpm -qa | grep glibc
glibc-common-2.12-1.149.el6_6.5.x86_64
glibc-headers-2.12-1.47.el6_2.12.x86_64
glibc-devel-2.12-1.47.el6_2.12.x86_64
glibc-2.12-1.149.el6_6.5.x86_64
> 直ったのでこれでOK
```

ちなみに最初にyumが失敗した時に`rpm --rebuild`してたらこんなことにはならなかった

## おまけ
glibcを削除してみるとどうなるのか

``` 
# rpm -e --nodeps --allmatches glibc glibc-common
警告: /etc/localtime は /etc/localtime.rpmsave として保存されました。
警告: /etc/ld.so.conf は /etc/ld.so.conf.rpmsave として保存されました。
/sbin/ldconfig: 設定ファイル /etc/ld.so.conf を開けません: そのようなファイルやディレクトリはありません
/sbin/ldconfig: 設定ファイル /etc/ld.so.conf を開けません: そのようなファイルやディレクトリはありません
以下略

# rpm -q glibc
-bash: /bin/rpm: /lib64/ld-linux-x86-64.so.2: bad ELF interpreter: No such file or directory
# yum install glibc glibc-common
-bash: /usr/bin/yum: /usr/bin/python: bad interpreter: No such file or directory
> /bin配下とかが使えなくなったcatもrpmもyumもvimも使えないから詰み
　SSHのセッション切ったら接続も出来なくなります
```

オンプレならCDブートとかから必要なものをインストール出来るんだろうけどAWSだとそういうことが出来ないので修復不可能

以上
JavaScriptで文字列をパスカルケース/キャメルケースからスネークケースに変換する

既出だったらすいません
~~くだらないことだから誰も書かないし話題にもならないのかもしれない~~
[ANTON072](http://qiita.com/ANTON072)さんの[キャメルケースに変換する](http://qiita.com/ANTON072/items/e91b445a71bbd4a6ef74)の逆を行う

```js
var str = "JavaScript";//サンプル文字
  
str.replace(/^[A-Z]/,function(mached){return mached.toLowerCase()}).replace(/[^^][A-Z]/g,function(matched){return matched.charAt(0)+"_"+matched.charAt(1).toLowerCase()})  
// java_script
```

見やすくしようとすると以下

```js
str.replace(/^[A-Z]/,
    function(mached){
        return mached.toLowerCase()
    }
).replace(/[^^][A-Z]/g,
    function(matched){
        return matched.charAt(0)+"_"+matched.charAt(1).toLowerCase()
    }
)  
```
makefile > あるフォルダの.cファイル名を取得 > wildcard使用

makefileにおいて、あるフォルダ内の.cファイルが複数ある場合、以下のようにwildcardを用いてSRCSという変数に取得することができる。

    FLD = /tmp/folder1
    SRCS = $(wildcard $(FLD)/*.c)

    .PHONY: all
    all:
        @echo "$(SRCS)"


上記を`Makefile.allcpp`として保存し、最後の行の`@の前`は`タブ`に変更して

    $ make -f Makefile.allcpp
とすると以下のように表示される (a.c, b.c, c.cがある場合)。

    /tmp/folder1/a.c /tmp/folder1/b.c /tmp/folder1/c.c


ライブラリを使ったビルド用のMakefileなどにおいて使うと便利かもしれない。


その他の有用な関数については、[Makefileの関数](http://qiita.com/shouta_a/items/b8c5f36434d5d3fbfa4a)がよくまとまっている
TiledMapEditorでは同レイヤーに複数のマップチップを使ったステージ作りはしてはいけない

#問題
*Tiled Map Editor* (執筆時点でv0.11.0)で作成したマップをcocos2d-xを使用したゲームで読み込ませたあと、以下のコードを実行すると、何も問題がないはずのマスでゲームがコケることがある。

```cpp
//マップファイルからノード作成
auto map = TMXTiledMap::create("someRandomMap.tmx");

//レイヤー取得
auto terrainLayer = map->getLayer("someRandomLayer");

auto mapSize = map->getMapSize();
for(int x = 0; x < mapSize.width; ++x){
    for (int y = 0; y < mapSize.height; ++y) {
        auto coordinate = Vec2(x, y);
        //coordinate (cocos2d::Vec2) で指定された座標にあるタイルを
        //cocos2d::Spriteとして取り出す...はずがコケる
        auto sprite = terrainlayer->getTileAt(coordinate);    
    }
}


```

#症状
実際にはcocosの内部コードの中のAssertionでコケている。  

```cpp:cocos2d/cocos/2d/CCTMXLayer.cpp
ssize_t TMXLayer::atlasIndexForExistantZ(int z)
{
    int key=z;
    int *item = (int*)bsearch((void*)&key, (void*)&_atlasIndexArray->arr[0], _atlasIndexArray->num, sizeof(void*), compareInts);

    //***Game Crashes Here***
    CCASSERT(item, "TMX atlas index not found. Shall not happen");

    ssize_t index = ((size_t)item - (size_t)_atlasIndexArray->arr) / sizeof(void*);
    return index;
}
```

しかし、Threadを辿ってコケたときに指定されていた座標をTME上で確認してもとくに問題は見受けられないことがほとんどである。

#対処法
いろいろ試してみてわかったのだが、ゲームがこけた原因は  
**TME側で、同じレイヤーに複数のマップチップから取られたデータが混在していること**  
だった。中身を見ているわけではないので詳しいことはわからないが、例えばレイヤー`Terrain`に対してマップチップ`A`のデータと`B`のデータを両方使っているようなことがあるとまずいということだ。
OSX YosemiteにアップデートするとAptana Studio 3が起動しなくなる


Javaのバージョンが違うと言われる場合
ここからJava for OS X 2014-001をインストールすると解決する
http://support.apple.com/kb/DL1572?viewlocale=en_US&locale=en_US

引用元
https://github.com/aptana/studio3/issues/278
confluence > @マークを入力したい

confluenceの機能で`@`を入力した時に候補が表示されてしまい、`@`そのものを入力する方法がわからなかった。

色々試してうまくいったのは以下の通り

1. @を入力 (候補が表示される)
2. カーソル右矢印を押す、または、Escを押す
バージョン比較を簡単にRuby / PHP / Objective-C


`1.0.0`と`1.0.1`どっちが新しいバージョンなの？って比較しなきゃいけない時ってあると思うんです。でも、自前でやろうとすると案外面倒。でも、そこらに転がっている機能で実はできたりするので忘れないように書いておきます。

ドットを抜いて、無理やり数値化して比較すると、桁ズレ等で不幸になるので気をつけよう。

## Ruby

Gem::Versionを使うとさくっと比較できる。内部の処理を見たら、けっこう参考になった。

```ruby
Gem::Version.new('1.0.0') > Gem::Version.new('1.10.0')
#=> false
```

## PHP

PHPにこんな関数あったんだシリーズに入りそうな感じ。それとも皆、常識だったんだろうか。

```php
version_compare('1.0.0', '1.10.0');
#=> -1

version_compare('2.0.0', '1.10.0');
#=> 1

version_compare('1.10.0', '1.10.0');
#=> 0
```

## Objective-C

`[hoge compare:piyo options:NSNumericSearch]`で、PHPの`version_compare()`のように、-1 / 1 / 0 の値が返ってきます。NSOrderedAscendingなどで比較してあげればOK。

```objective-c
NSString *verA = @"1.0.0";
NSString *verB = @"1.10.0";

[verA compare:verB options:NSNumericSearch] == NSOrderedAscending
#=> true

[verA compare:verB options:NSNumericSearch] == NSOrderedDescending
#=> false


NSString *verA = @"1.10.0";
NSString *verB = @"1.10.0";

[verA compare:verB options:NSNumericSearch] == NSOrderedSame
#=> true

```

## JavaScript

JavaScriptには、標準でそんな機能はなかったけど、作っている人がいたので紹介。

http://stackoverflow.com/questions/6832596/how-to-compare-software-version-number-using-js-only-number

```javascript
function versionCompare(v1, v2, options) {
    var lexicographical = options && options.lexicographical,
        zeroExtend = options && options.zeroExtend,
        v1parts = v1.split('.'),
        v2parts = v2.split('.');

    function isValidPart(x) {
        return (lexicographical ? /^\d+[A-Za-z]*$/ : /^\d+$/).test(x);
    }

    if (!v1parts.every(isValidPart) || !v2parts.every(isValidPart)) {
        return NaN;
    }

    if (zeroExtend) {
        while (v1parts.length < v2parts.length) v1parts.push("0");
        while (v2parts.length < v1parts.length) v2parts.push("0");
    }

    if (!lexicographical) {
        v1parts = v1parts.map(Number);
        v2parts = v2parts.map(Number);
    }

    for (var i = 0; i < v1parts.length; ++i) {
        if (v2parts.length == i) {
            return 1;
        }

        if (v1parts[i] == v2parts[i]) {
            continue;
        }
        else if (v1parts[i] > v2parts[i]) {
            return 1;
        }
        else {
            return -1;
        }
    }

    if (v1parts.length != v2parts.length) {
        return -1;
    }

    return 0;
}
```

## Java

Java…には、あるんだろうか。謎。

## SQL

SQL…も、やりようってあるのかな。
FlexでFlashProのswcを使うと発生する不具合

FlashPro内に以下３点のいずれかの要素を含めてswcにすると、そのswcを使用したFlexプロジェクトが正常に起動しなくなります。
(Flash Pro CC 2014,Flash Builder 4.6)

■ムービークリップの「表示する」のチェックを外す
■別々のクラスに関連付けたムービークリップを連続で配置して同じ名前を付ける
■ムービークリップの中に配置したムービークリップにフレームスクリプトを記述する

まだまだ他にもあるかもしれませんが、とりあえずこれだけ見つけました。

不具合の具体的な症状としては
■VerifyError: Error #1107: The ABC data is corrupt, attempt to read out of bounds.
■「デバッガへの接続が確立されずにプロセスが終了しました。」
■プログラムが起動しない

などでした。
詳しい調査はしていませんがとりあえずメモしておきます。
oculus dk2が認識されない...


oculus runtimeをインストールする時に/Users/ユーザー名/Library/LaunchAgents/にcom.oculusvr.ovragent.plistが作られるがそれがうまく作られてなく起きる問題。

Applications/Oculus/Logs/Runtime_Installer/ovr_install.txtの中身でcom.oculusvr.ovragent.plistが作られてるのか確認できる。

permission問題なのでinstallAgent.shを実行すればいい。

```
chmod 755 installAgent.sh
sudo ./installAgent.sh
```
PHPで未定義変数のプロパティにアクセスしようとするときのエラーレベルはE_NOTICE

## 説明

PHPで、未定義変数または`null`を持つ変数のメンバにアクセスするコードを実行すると、そのメンバがプロパティかメソッドかでエラーのレベルが異なります。

* プロパティ(メンバ変数)へのアクセス: Notice (`E_NOTICE`)
* メソッド(メンバ関数)へのアクセス: Fatal error (`E_ERROR`)

これらのレベルの違うエラーがレポートされるかどうかは、`error_reporting`の設定によります。

そしてプログラムの制御に関しては次の違いがあります。

* `E_NOTICE`: 中断**しない**
* `E_ERROR`: 中断

## 背景

私は先日あるバグを調べているときに、

* ある変数のプロパティにアクセスする部分を無事に通過し
* その後のメソッド呼び出しで`Fatal error`になっている

という現象に遭遇し、なぜプロパティへのアクセスの時点でエラーにならないのか、理解できませんでした。いろいろと調べた結果、エラーレベルの違いによるということが判明しました。

## 実験1

```php:sample.php
<?php
error_reporting(E_ALL & ~E_NOTICE);

$a = null; // この行がなくても同じ
echo '[', $a->someProperty, "]\n"; // レポートされない
echo '[', $a->someMethod(), "]\n"; // エラーで中断
```

結果

```
[]
[PHP Fatal error:  Call to a member function someMethod() on a non-object in /Users/wada/sample.php on line 6
```

## 実験2

```php:sample2.php
<?php
error_reporting(E_ALL);

$a = null; // この行がなくても同じ
echo '[', $a->someProperty, "]\n"; // レポートされるが継続
echo '[', $a->someMethod(), "]\n"; // エラーで中断
```

結果

```
[PHP Notice:  Trying to get property of non-object in /Users/wada/sample2.php on line 5
]
[PHP Fatal error:  Call to a member function someMethod() on a non-object in /Users/wada/sample2.php on line 6
```
ActiveMerchant1.46.0からOffsitePaymentsというgemに分割されたので注意しましょう

参考： https://github.com/Shopify/active_merchant/blob/master/CHANGELOG

ActiveMerchant1.46.0から、Railsに依存する処理がOffsitePaymentsというgemに分割されました。
(1.46以前から分割はされてたけど依存gemとして残ってました。それが1.46で依存関係も削除されたっぽいです)

そのために例えばPayPalでipnを受け取るときに `PayPal::Notification` インスタンスを使っていると思いますがそのクラスの名前空間が変更になっています。

* `Gemfile` に `gem 'offsite_payments'` を追記
* `ActiveMerchant::Billing::Integrations::Paypal::Notification` と書いていた箇所を `OffsitePayments::Integrations::Paypal::Notification` と変更

注意点としてはモジュールのトップレベルが `ActiveMerchant` から `OffsitePayments` に変更されているところです。
Tkinter でオープンディレクトリダイアログを使うとへんなウィンドウが出る

Windows7、python2.7.8

    import Tkinter
    import tkFileDialog 

    dir = tkFileDialog.askdirectory()

見たいな事すると、タイトルが「Tk」となるblankウィンドウが意味もなく出てくる。
フォルダを選択し終わってもこのウィンドウは消えず、
最悪落ちる。
linuxだと起こらないらしい。

以下が回避策らしい。

    import Tkinter
    import tkFileDialog 

    root = Tkinter.Tk()
    root.withdraw()
    dir = tkFileDialog.askdirectory()
    root.destroy()
Apache Commons HTTPClient はマルチスレッド版を使うほうが良い？

記事がかなり古いですが、、。
http://www.acroquest.co.jp/webworkshop/JavaTroubleshooting/trouble012Phenomenon.html
http://oyahiroki.exblog.jp/12750938/

上記を見ると、マルチスレッド版を使うほうが良さそう。

+ マルチスレッド版は、ThreadLocalを使ってインスタンスを管理するので、インスタンスが意識しなくても使いまわされて性能が良い
+ シングルスレッド版は、インスタンスの管理がユーザ任せなので、毎回生成する(≒毎回Connectionを貼り直しに行く)ため遅くなる
ということなんですかね。
metaio の Tracking Configuration を外部からロードする

Unity で [Tracking Configuration](http://dev.metaio.com/sdk/documentation/tracking-config/) (マーカー画像とその設定ファイル) を、アプリに内蔵した StreamingAsset とかからじゃなくって Web サーバーから取ってきて使う方法。

# Tracking Configuration をつくる

マーカー画像と設定ファイル (XML) をがっちゃんこした ZIP ファイルをつくる。

## [Metaio Creator](http://dev.metaio.com/creator/) をつかって作るばあい

1. マーカー画像よみこむ。ウィンドウ下側の Trackable を + 。
2. Tracking Technology えらぶ。ふつうのマーカーつかう AR なら Image Tracking。くわしくは[こちら](http://dev.metaio.com/sdk/documentation/tracking-config/)。
3. 必要あればコンテキストメニュー → Properties で設定。
4. メニューの Export → Export Tracking Configuration File で ZIP ファイルかきだす。

## 手動でつくるばあい

Creator では細かい設定ができないので、こっちのがおすすめ。

1. マーカー画像用意する。
2. [このへん](http://dev.metaio.com/sdk/documentation/tracking-config/)参考にがんばって XML 書く。
3. まとめて ZIP にかためる。

# Web サーバーから読み込む

1. metaio 初期化されるの待つ。
2. `WWW` クラスで ZIP ファイルをダウンロード。
3. てきとうな場所に保存。
4. 保存した ZIP ファイルのパスを `MetaioSDKUnity.setTrackingConfigurationFromAssets` にわたして読み込む。
5. できた！

```csharp:metaio/Scripts/metaioCallback.cs
virtual protected void onSDKReady()
{
	StartCoroutine(loadExternalConf("http://example.com/TrackingData.zip"));
}

IEnumerator loadExternalConf(string url)
{
	var www = new WWW(url);
	yield return www;
	string path = Application.persistentDataPath + "/marker.zip";
	Debug.Log("Save downloaded marker to: " + path);
	System.IO.File.WriteAllBytes(path, www.bytes);
	MetaioSDKUnity.setTrackingConfigurationFromAssets(path);
}
```
~日前表示

地味にハマったので残します。和暦に注意。


```objc:viewController.m


- (void)viewDidLoad {

    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    [formatter setCalendar:calendar];
    NSDate *date = [formatter dateFromString:@"2015-02-04 00:00:00"];
    
    UILabel *label = [UILabel alloc]init];
    label.text = [self displayDate:date];

}

- (NSString *)displayDate:(NSDate*)timestamp {

    NSDate *now = [NSDate date];
    NSTimeInterval passed = [now timeIntervalSinceDate:timestamp];
    int min = passed / 60;
    if (min <= 1) {
        return @"1分前";
    }
    if (min < 60) {
        return [NSString stringWithFormat:@"%d分前", min];
    }
    int hour = min / 60;
    if (hour < 24) {
        return [NSString stringWithFormat:@"%d時間前", hour];
    }
    int day = hour / 24;
    return [NSString stringWithFormat:@"%d日前", day];
}
【bash】行ごとに処理する

自分用のメモ。
行ごとに処理する方法。while readとfor inの二通りの方法がある。

##while read

```bash:while_read
cat out.dat | while read line
do
echo $line
done
```

##for in

```bash:for_in
IFS=$'\n'
for line in `cat out.dat`
do
echo $line
done
```
IFSは環境変数で区切り文字が設定される。
区切り文字のデフォは改行、タブ、スペースなので、改行のみにしてている。
JIRAのプロジェクトキーのルールを調整する


# プロジェクトキーと課題IDの関連は？

JIRAのプロジェクトキーは、デフォルトで大文字英語のみになっています。
課題の番号は、このプロジェクトキーに連番になる形で生成されます。

たとえば:

- ProjectKey = DEV
- IssueID (課題のID) = DEV-1, DEV-2 ...

のような感じです。

# 良く打ち当たる問題？

プロジェクトが少ないうちはいいんですが、エンタープライズでの利用になってくるとちょっと大文字だけでは厳しいですよね。運用管理者へのリクエストとしてよくあるのが、部署単位での課題管理に利用したいケースとか。

- XX2課の全体の課題管理として、プロジェクトを立てたいんだけど、"XX" というキーが既に使われちゃっててなんとかならないですか？"XX2" って指定できませんか？
- ABCプロジェクトの2ndシーズンとしてプロジェクトを立てたいんですが、"ABC2" っていうプロジェクトキーはダメですか？

ということで、設定変更できるか...と言いますと、変更できるようです。

## 設定変更は管理画面から

以前は WEB-INF/classes/ 以下のプロパティファイルで設定変更するようだったのですが、現在（少なくとも6.x以上) は、管理画面から変更できるようです。

- perl5のパターンマッチが利用できます
- "-" (ハイフン）は使わないほうがいい（JIRAの課題IDが、ハイフン＆数字になるので）
- できればデフォルト設定 ([A-Z][A-Z]+)を使ってね

一応自己責任ということで...。

![jira-key.jpg](https://qiita-image-store.s3.amazonaws.com/0/27976/97bd299b-3a17-f6f6-a180-080434dbeb02.jpeg "jira-key.jpg")

# メモ
## JIRA関連のシステムでは？
Confluenceは未だ....

- https://jira.atlassian.com/browse/CONF-8800
- Bambooなども、まだキーの変更は対応していないようです

## 今回の確認環境

今回設定変更を確認したのは、下記の環境となります。

- JIRA Server版 / Version6.3.7
【bash】行番号を指定しての行の取得

自分用のメモ。
行番号を指定しての行の取得方法。sed、awk、bashの３通り。

##sed

```sed:out.datの2行目取得
#sed -n 行番号P 対象ファイル
sed -n 2P out.dat
```

##awk

```awk:out.datの2行目取得
#awk 'NR==行番号' 対象ファイル
awk 'NR==2' out.dat
```

##bash

```bash:out.datの2行目取得
#head -n 行番号 対象ファイル | tail -n 1
head -n 2 out.data | tail -n 1
```
Rubyでn回まではリトライして処理して欲しい時

たまにないですか？
3回ぐらいはとりあえずリトライして、その後はエラーとするか〜みたいな事。
そんな時どう書くのが良いのかな〜と。

というわけで、試しに書いてみました。

# コード

```rb:module_retry.rb
module Retry
  DEFAULT_RETRY_LIMIT = 3

  # retry_limit以下の回数分yieldする.
  # 指定が無い場合は、DEFAULT_RETRY_LIMIT回以下
  def challenge(options = {})
    raise ArgumentError.new "give block" unless block_given?

    begin
      count = count.to_i + 1
      yield(count)
    rescue => e
      limit ||= (options[:retry_limit] || DEFAULT_RETRY_LIMIT)
      if (count < limit)
        retry
      else
        puts "over retry limit #{limit}."
        raise
      end
    end
  end

  # includeしなくても、モジュールメソッドとしても呼び出したい時用
  extend self
end

if __FILE__ == $0
  def hoge
    puts "hoge"
    raise "raise error test1."
  end

  puts "test1:モジュールメソッドとして呼び出し"
  Retry.challenge(retry_limit: 2){|times|
    hoge
  } rescue nil # エラーで停まらないように

  include Retry
  begin
    puts "\ntest2:includeして呼び出し"
    challenge{|times|
      puts times
      raise "raise error test2."
    }
  rescue => e
    puts "#<#{e.class}: #{e.message}>"
    puts "  #{e.backtrace.join("\n  ")}"
  end
end
```

後は、このファイルをrequireすれば目標達成ですね。

# 実行結果

```bash
$ ruby module_retry.rb 
test1:モジュールメソッドとして呼び出し
hoge
hoge
over retry limit 2.

test2:includeして呼び出し
1
2
3
over retry limit 3.
#<RuntimeError: raise error test2.>
  module_retry.rb:42:in `block in <main>'
  module_retry.rb:10:in `challenge'
  module_retry.rb:40:in `<main>'
```

backtraceに余分なモノが挟まってしまうのが気になりますね。
他に良い書き方があるような気がします（＝ｗ＝；
RubyのArrayの.uniq.sortと.sort.uniq

#### 背景

自分で Ruby のコードを書いていて、Array に対して「重複を取り除いて昇順に並び替えたい」ってときがある。たとえば Rails 製アプリを運用していて、特定の条件を満たす User モデルのレコードの id の一覧を取り出すときとか。

そんで、なんとなくいつものように `array.uniq.sort` といったコードを書いていて、ふと思った。これ `array.sort.uniq` って書くのとどっちがいいんだろう。`uniq` と `sort` の順番を替えたときに、実行速度に影響があったりするんかな。影響しそう。

と思ったので、ベンチマークを取った。

#### 測定コード

```rb
require "benchmark"

array = Array.new

1_0000_0000.times do
  array << rand(100)
end

puts ".sort.uniq"
puts Benchmark.realtime { array.sort.uniq }

puts ".uniq.sort"
puts Benchmark.realtime { array.uniq.sort }
```

0〜99の整数を要素に、長さ1億の配列を作って試した。

めっちょ余談だけど、桁の大きい整数を3桁区切りで表示されてもぜんぜん頭に入ってこない、ぼくは4桁区切りじゃないとだめだ。英語圏の人だと3桁区切りがいいんですかねぇ。

#### 結果

ちなみに Ruby 2.2.0 で実行した。

```
.sort.uniq
13.716189389000647
.uniq.sort
3.5271070249982586
```

#### はい

先に uniq してから sort した方がよさそう。なんとなくそう書いていたけれど、最初に要素数を減らしてから並び替えるといい、ということか。実装を確認して追記したい。

試しに GitHub のリポジトリを検索してみると… (結果の件数は2015年2月4日14:00頃のもの)

- [Search · &quot;.uniq.sort&quot;](https://github.com/search?l=ruby&q=%22.uniq.sort%22&ref=searchresults&type=Code&utf8=%E2%9C%93 "Search · &quot;.uniq.sort&quot;") 36,935件
- [Search · &quot;.sort.uniq&quot;](https://github.com/search?l=ruby&q=%22.sort.uniq%22&ref=searchresults&type=Code&utf8=%E2%9C%93 "Search · &quot;.sort.uniq&quot;") 20,756件

ここでは立て続けにチェインして呼び出している場合しか検索できていないけれど、これを見る限りでは uniq してから sort しているコードの方が多いっぽい。逆に sort してから uniq した方が有効な場面ってあるのかな。今のところ思い付いていない。
異なるディレクトリーにあるファイルを読み込む方法


# 目的
異なるディレクトリーにあるファイルを読み込みたい

# 方法
読み込みたいファイルがあるディレクトリー下の`__init__.py`に以下のコードを追加する。

```
import os, sys
sys.path.append(os.path.abspath(os.path.dirname(__file__)))
```
Paperclip で S3 に動画アップロードしたけど FFMpeg使うことにいろいろ絶望。。。からのAmazon Elastic Transcoder利用

## プロローグ

凄い頑張ってRails + Paperclip with S3 + FFMpeg 環境な動画アップロード＆配信サービス作ってみたものの、EC2のスペックあげなきゃどうにもFFMpegのエンコード
処理待ちに耐えられなくなった。ライブラリ地獄でFFMpeg稼働してるサーバのメンテも半端ない。でいろいろ調べてみたらAmazon使ってるならElastic Transcoderだろ？と言われてハッとなった

## Amazon Elastic Transcoder 利用環境を整える

### Amazon S3 入出力バケット作成

開発者ガイドサンプルではin/out別に作成するようになってますが、別記事では「バケットの節約をしましょう（上限１００なので）」とうたっているので**ひとつだけ**作成して上手に利用しましょう

### Amazon SNS トピック作成

### Amazon SQS キュー作成

作成したら「Queue Action」->「Subscribe Queue to Amazon SNS Topic」からさっきのトピックと関連付けておきます

### Amazon Elestic Transcoder パイプライン作成

ここでの注意は「Configure Amazon S3 Bucket for Transcoded Files and Playlists」「Configuration for Amazon S3 Bucket for Thumbnails」の出力バケット設定が入力バケットと同じですよと

### Amazon CloudFront ディストリビューション作成

Create Origin Access IdentityしたらAmazon S3 Canonical User ID を控えておいてください
Create Distributionしますが、出力バケットは例によって入力と同じで

### Amazon S3 バケットポリシー追加

> {
  "Version":"2012-10-17",
  "Id":"PolicyForCloudFrontPrivateContent",
  "Statement":[{
     "Sid":" Granting CloudFront OAI access to private content",
     "Effect":"Allow",
     "Principal":{ "CanonicalUser":"さっき控えた値" },
     "Action":"s3:GetObject",
     "Resource":"arn:aws:s3:::出力バケット/*"
   }]
}

### さてRuby書きましょう

https://s3.amazonaws.com/codesamples/ets/latest/rubyhls.zip

基本的にはサンプルコードを流用してください。
Railsならlib下にrbファイル作ってclass定義して、transcodeするメソッド切ったらサンプルを貼り付ける感じ。require 'aws-sdk'は忘れずに

### バケット内がファイルのIN/OUTでごっちゃになっちゃうじゃん！

おっと忘れてた。今回Paperclip使ったので、オリジナルファイルだけS3に保存したら、Elastic Transcoderにジョブを追加します

Paperclip使う設定はまあこんな感じ。Elastic Transcoder使うのでstylesとかは不要です。

>   has_attached_file :file,
    :url => "#{Rails.env}/:id/:style.:extension",
    :path => "#{Rails.env}/:class/:id/:attachment/:style.:extension",
    storage: :s3,
    s3_credentials: "#{Rails.root}/config/aws.yml",
    s3_permissions: :private

あれ？カスタムProcessor書いてやるんじゃないのかよ！というツッコミがありそうですが、それはチャレンジしてくださいませ。
delayed_jobをかませる関係からやってはみましたが、大変だったので別出しにしました。FFMpeg使ってたリファクタリング前のコードではいろいろやってたんですけど、自分が完全に把握出来ない部分が多すぎたので保守性を鑑み断念

さて本題に戻すとS3のバケット統一があるので、肝はサンプルコードにあるAWS::ElasticTranscoder::Clientのcreate_jobメソッドに渡すパラメータ「output_key_prefix」をしっかり決めておくこと


```rb:lib/transcoder.rb
        transcoder_client = AWS::ElasticTranscoder::Client.new(region: 'ap-northeast-1') # 東京リージョン対応
        job = transcoder_client.create_job(
                pipeline_id: pipeline_id,
                input: input,
                output_key_prefix: "#{Rails.env}/:class/:id/trans/",
                outputs: outputs
              ).data[:job]
```

「:class/:id/」のところはこんな書き方では動かないので、ちゃんとinitializeで設定しておきます。要するにバケット内の整理整頓をしっかりハンドルしておきましょうということです

inputはオリジナルファイルのS3URLを指定します。outpusは配信に必要なだけフォーマット定義をするのですが、システムプリセットを使えば大抵足りるでしょう。この辺の話は割愛。

後はdelayed_job導入してジョブ追加の上記処理を含むメソッドは非同期で呼ぶといいと思います

※PaperclipのオリジナルファイルをS3に置くところもdeleyed_jobしたかったのですが、分からず。。。

ここから先、SQSからジョブステータス見てゴニョゴニョも結構面倒臭いのですが、時間とれたら続き書きます
AmazonLinuxでのタイムゾーン設定

EC2上のAmazonLinuxでタイムゾーンをAsia/Tokyoにしていたつもりが、
glibcの更新時にUTCに戻されるという目にあったので、その対応メモ。

# 要約
すでに起動済みのインスタンスの場合は以下の2点を行う。

1. /etc/localtimeに使いたいタイムゾーンへのシンボリックリンクを作成する。
1. /etc/sysconfig/clockを書き換える

# すでに動いているインスタンスの場合

## /etc/localtimeの変更

こちらに記述されている対応方法の通り。
これで即時反映される。

[【Linux】タイムゾーン(Timezone)の変更 - Qiita](http://qiita.com/azusanakano/items/b39bd22504313884a7c3)

## /etc/sysconfig/clockの変更

/etc/localtimeの変更だけだと、glibcの変更時にUTCに戻ってしまう。
対応方法は以下に記述されている通り。
本来ならこちらの手順だけでいいが、AmazonLinuxだと設定後rebootしないと反映されないので、
/etc/localtimeの方も更新している。

[glibcを更新しても大丈夫な「正しい」タイムゾーンの設定方法 (2/3追記あり) - めもおきば](http://d.hatena.ne.jp/nekoruri/20150130/glibclocaltime)

```cinf:/etc/sysconfig/clock
ZONE="Asia/Tokyo"
UTC=true
```

/etc/sysconfig/clock内の「UTC=true」の箇所はそのままの方がいいと思われる。
falseにするとハードウェアのクロックもローカルタイムで設定されてしまう。

# これからインスタンスを起動する場合

UserDataでtimezoneを指定してから起動する。
こちらが参考になる。
[Amazon Linux起動時にCloudInitで設定するもの « サーバーワークス エンジニアブログ](http://blog.serverworks.co.jp/tech/2012/04/16/amazonlinux-cloudinit/)

```
#cloud-config
timezone: "Asia/Tokyo"
```
ポート番号からプロセスを調べる

掲題の通り。

root権限で実行する必要がある。

* 参考
http://www.atmarkit.co.jp/flinux/rensai/linuxtips/664useportps.html

```
$ sudo lsof -i:8080
COMMAND   PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
node    31335 userA   11u  IPv4 561166      0t0  TCP *:http-alt (LISTEN)
```
@Html.BeginForm() の第３ (第４?) 引数にコントローラに渡すパラメタを指定しようとしても無駄な件

Razor 記法に対応したコードハイライトはまだないのかー… orz

```html
<table>
  <tr>
    <th>社員番号</th>
    <th>所属部署</th>
    <th>氏名</th>
    <th>詳細</th>
  </tr>
  @foreach (var staff in ViewBag.StaffList as IEnumerable<StaffInfo>)
  {
    <tr>
      <td>@staff.Number</td>
      <td>@staff.PostName</td>
      <td>
        @staff.Name
        (@CommonUtils.CalcAge(staff.Birth) / @staff.Sex)
      </td>
      <td>
        @using (Html.BeginForm("StaffDetail", "StaffMaster",
          new { sn = staff.Number }, FormMethod.Get))
        {
          <button type="submit">詳細...</button>
        }
      </td>
    </tr>
  }
</table>
```

…などと書いたりした場合、`@using (Html.BeginForm()) { ... }` ブロックの部分について…

期待する出力結果:

```html
<form action="/StaffMaster/StaffDetail" method="get">
  <input type="hidden" name="sn" value="12345678" />
  <button type="submit">詳細...</button>
</form>
```

実際の出力結果:

```html
<form action="/StaffMaster/StaffDetail?sn=12345678" method="get">
  <button type="submit">詳細...</button>
</form>
```

…おいコラ。こんな HTML でブラウザがフォームパラメータをちゃんと渡してくれると本気で思ってるのか? (とりあえず Firefox ではパラメータが渡されませんでした)

[ドキュメント](https://msdn.microsoft.com/ja-jp/library/dd492933%28v=vs.118%29.aspx)にもちゃんと

> ルートのパラメーターが含まれるオブジェクト。 オブジェクトのプロパティを調べることで、リフレクションを介してパラメーターが取得されます。 通常、このオブジェクトは、オブジェクト初期化子構文を使用して作成されます。

って書いとるやんか… ちゃんと期待したとおりに動いてえな…。

(Visual Studio 2013 / .NET Framework 4.5 にて確認)
Theme.Translucentを継承せずにActivityの背景を透過にする


メモです。

たまたまActivityの背景を透過にしたく、さくっと調べてみたところほとんどが「Theme.Translucentを使おう、もう少し手を加えたければそれを継承したThemeを作ろう」ということだった。
確かにこれでできたのだけれど、そのActivityに限ってこれにはBaseに設定していたThemeが外れてしまい、各部品のStyleが変わってしまうという副作用がある。

Androidのソースを見ると

```xml:themes.xml
<!-- Default theme for translucent activities, that is windows that allow you
     to see through them to the windows behind.  This sets up the translucent
     flag and appropriate animations for your windows.  -->
<style name="Theme.Translucent">
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:colorBackgroundCacheHint">@null</item>
    <item name="android:windowIsTranslucent">true</item>
    <!-- Note that we use the base animation style here (that is no
         animations) because we really have no idea how this kind of
         activity will be used. -->
    <item name="android:windowAnimationStyle">@android:style/Animation</item>
</style>
```

となっていて、Activityの背景を透過にするには

```
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:colorBackgroundCacheHint">@null</item>
    <item name="android:windowIsTranslucent">true</item>
```

の3つを指定するだけで足りる模様。

なので、最終的には自分の作ったThemeを継承して、上記の3を付け足した新しいThemeを該当Activityに設定する事で解決した。
ruby 中的 alias_method 和 Rails 中的 alias_method_chain



- ruby 中有这样一个给方法添加别名的函数:

通过这个方式, 可以一定意义上做到方法的重写. 因为新方法可以有新的行为,而且还保留着旧方法的访问.

```ruby
module Mod
  alias_method :orig_exit, :exit # 这个有点坑,乍一看,以为这个 exit 就是下面的这个方法呢!!!
  def exit(code=0)
    puts "Exiting with code #{code}"
    orig_exit(code)
  end
end
include Mod
exit(99)
    
```
> 输出`Exiting with code 99`

- rails 中为了能够实现类型装饰模式的行为,基于上面的这个 `alias_method` 做了一个 `alias_method_chain` 的方法, 它的作用就是能够在原本执行的方法前后加上一些起装饰作用的代码. 下面看看它源码:

```ruby
class Module

  def alias_method_chain(target, feature)
    # Strip out punctuation on predicates or bang methods since
    # e.g. target?_without_feature is not a valid method name.
    
    # 剔除方法名中的 ? = 和 !, 然后保存这个符号
    aliased_target, punctuation = target.to_s.sub(/([?!=])$/, ''), $1
    yield(aliased_target, punctuation) if block_given?

	# 定义2个方法名字
    with_method, without_method = "#{aliased_target}_with_#{feature}#{punctuation}", "#{aliased_target}_without_#{feature}#{punctuation}"


    alias_method without_method, target
    alias_method target, with_method

    case
      when public_method_defined?(without_method)
        public target
      when protected_method_defined?(without_method)
        protected target
      when private_method_defined?(without_method)
        private target
    end
  end

  ...
  
end
```

可以从上面的说明中感觉到,有时候会把方法名给`别来别去`的, 这个时候就 rails 按照自己的风格作为一个约束来封装了这个一系列的动作.
看看下面的代码:

```ruby

module Foo
  class Bar
    def initialize
      p 'init'
    end

    def initialize_with_p
      p 'with p'
      initialize_without_p
    end

    def initialize_without_p
      p 'without p'
    end

    alias_method_chain :initialize, :p
  end

end


fb = Foo::Bar.new

```
NSBezierPathで点線を描画する

[NSBox](https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSBox_Class/)のborderTypeに指定する[NSBorderType](https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSView_Class/index.html#//apple_ref/swift/enum/NSBorderType)は以下の様なenumになっている。

```swift
enum {
   NSNoBorder     = 0,
   NSLineBorder   = 1,
   NSBezelBorder  = 2,
   NSGrooveBorder = 3
};
typedef NSUInteger NSBorderType;
```

点線を表現したかったんだけど、素直には出来そうにない。どうやらPathをつかって地道にやる必要があるっぽいので調べて書いた。

```swift
import Cocoa

class DashedLine: NSBox {

    override func drawRect(dirtyRect: NSRect) {
        NSColor.lightGrayColor().set()
        var path = NSBezierPath(rect: dirtyRect)
        path.lineWidth = 10.0
        
        let pattern: [CGFloat] = [5.0, 5.0]
        path.setLineDash(pattern, count: 2, phase: 0.0)
        path.stroke()
    }
}
```

見ての通りview側のプロパティにアクセスしていないので個人的には違和感大有のコードなんだけど、これでグレーの点線が表現出来る。間隔の調整には、`setLineDash()`に渡している`CGFloat`の配列の数値を変えれば良い。

ちなみにconstraintの制御とかが面倒臭くて最終的には使わなかった。
Thunderbirdの統合受信トレイにRSSフィードの新着を表示する

みんなが便利に使っている Thunderbird の統合フォルダ。全アカウントの受信箱を 1 つの「受信トレイ」で読めるので便利。そこに見逃せない RSS フィードを表示させる方法で、すでにそういう設定の Thunderbird が手元にあるにもかかわらず設定がわからなかったのでメモ。

+ ローカルフォルダに受信箱を作る

登録しているメールアカウントが1つだけだと統合フォルダの受信トレイが、メールアカウントのInboxと同様になってしまうので、2つ以上のアカウントの受信箱を表示させる必要があります。
1つしかアカウントを持ってない人は、ローカルフォルダに受信箱を作って2つ以上の要件を満たします。

+ 表示 → フォルダ → すべてのフォルダ で表示を変更
+ ローカルフォルダを右クリック → 新しいフォルダ... から "inbox" を作成
+ 表示 → フォルダ → 統合フォルダ で表示を戻す

受信トレイに複数アカウントの受信箱がぶら下がります。

この状態で、受信トレイを右クリック → プロパティ を表示して、検索対象の横の「選択...」ボタンを押します。

フォルダ一覧から、チェックを付けたフォルダの受信メッセージが受信トレイを選択したときに表示されるようになります。
RSSフィードの購読フォルダも一覧に現れます。全社通達など、未読管理してしっかりチェックする必要のあるものも、選択することで受信トレイに表示されるようになりますのでチェック漏れが減るかも、ね。
UILabelを角丸 or パディングしたいならUIButtonで代用するテク

UILabelで角丸が付いたものや、パディングしたいと思っても若干面倒そう。
↓
[UILabelを角丸にする＆パディングを設定する方法](http://qiita.com/myaaaaa_chan/items/cb168bd041c77ec54b0a)

代わりにUIButtonが使えるよね。っていう話です。
![image](https://qiita-image-store.s3.amazonaws.com/0/24308/c1d797ac-e9e5-81e6-42df-ab8fa589aa84.png)

```swift
var buttonAsLabel = UIButton(frame: CGRectMake(100, 100, 200, 50))

//テキスト入れる
buttonAsLabel.setTitle("ラベルの代わりに", forState: .Normal)
//角丸を指定できる
buttonAsLabel.layer.cornerRadius = 15
//テキストのカラー
buttonAsLabel.setTitleColor(UIColor.whiteColor(), forState: .Normal)
//背景カラー
buttonAsLabel.backgroundColor = UIColor.orangeColor()
//titleEdgeInsetsでpaddingができる
buttonAsLabel.titleEdgeInsets.left = 30
//ボタンとしての機能を停止→iOS7ではテキストが表示されなくなったのでやめます。
//buttonAsLabel.enabled = false

self.view.addSubview(buttonAsLabel)
```

ちなみに「アイコン＋文字」みないなのもUIButtonが便利。

![image](https://qiita-image-store.s3.amazonaws.com/0/24308/f1435c4c-69c3-498e-4afb-487d367c5fff.png)

```swift
var buttonAsLabel2 = UIButton(frame: CGRectMake(100, 300, 200, 50))
//画像を設定
buttonAsLabel2.setImage(UIImage(named: "apple.png"), forState: .Normal)
buttonAsLabel2.setTitle("サンプルテキスト", forState: .Normal)
buttonAsLabel2.setTitleColor(UIColor.blackColor(), forState: .Normal)
//ボタンとしての機能を停止→iOS7ではテキストが表示されなくなったのでやめます。
// buttonAsLabel2.enabled = false
self.view.addSubview(buttonAsLabel2)
```
bash > 行を取り出す > headとtailの組合せ > コメントに改良案あり

動作環境
  
    CentOS 6.5
    bash version 4.1.2(1)

あるテキストファイルがあり、その中身を1行単位で処理したいとする。その場合、bashで行を取り出す方法としてはheadとtailの組合せがある。

    #!/bin/env bash

    file=out.dat
    numline=$(wc $file | awk '{print $1}')
    #echo $numline

    for idx in $(seq 1 $numline)
    do
       line=$(head -n $idx $file | tail -n 1)
       echo $idx $line
    done

問題はheadとtailの組合せだと行が多い時のオーバヘッドが大きそうだということ。

perlやrubyなどを使わずに行単位の取り出し方法が別にあれば知りたい。