OmniAICreator/Qiita-1.07M huggingface dataset:
ECDiffieHellmanCngのサンプル

#ECDiffieHellmanCngの動作サンプル

C#でEC-DH鍵交換を試すためのアプリケーションです。

* フォームにTextBox3つとボタン2つが必要です。
* 一方の当事者だけを実現するアプリケーションですので、同じマシンでも別のマシンでもいいですがアプリケーションを2つ起動してください。
* button1をクリックすると、自分側のキーがtextBox1に入ります
* 相手から受け取ったキーをtextBox2に入れてbutton2をクリックすると、textBox3に共有キーが入ります。
* もう一方でも同じ操作をすれば共有キーは一致するはずです。

```csharp
using System;
using System.Windows.Forms;
using System.Security.Cryptography;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public static byte[] publicKey;
        ECDiffieHellmanCng ecdh = new ECDiffieHellmanCng();
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            ecdh.KeyDerivationFunction = ECDiffieHellmanKeyDerivationFunction.Hash;
            ecdh.HashAlgorithm = CngAlgorithm.Sha256;
            publicKey = ecdh.PublicKey.ToByteArray();
            textBox1.Text = BitConverter.ToString(publicKey);
            Clipboard.SetText(textBox1.Text);
        }

        private void button2_Click(object sender, EventArgs e)
        {
            String[] arr = textBox2.Lines[0].Split('-');
            byte[] array = new byte[arr.Length];
            for (int i = 0; i < arr.Length; i++) array[i] = Convert.ToByte(arr[i], 16);
            CngKey.Import(array, CngKeyBlobFormat.EccPublicBlob);
            byte[] key = ecdh.DeriveKeyMaterial(CngKey.Import(array, CngKeyBlobFormat.EccPublicBlob));
            textBox3.Text = BitConverter.ToString(key);
        }
    }
}
```
CentOS 6 や 7 の curl の SSL は OpenSSL ではなく NSS

OpenSSL ではなく NSS らしいので `--ciphers` に OpenSSL の名前で指定しても通りません。

```
$ curl https://ssl.example.com/ --tlsv1 --ciphers ECDHE-ECDSA-AES256-SHA
curl: (59) Unknown cipher in list: ECDHE-ECDSA-AES256-SHA
```

NSS の名前で指定する必要があります（https://git.fedorahosted.org/cgit/mod_nss.git/plain/docs/mod_nss.html#Directives の NSSCipherSuite の辺り）。

```
$ curl https://ssl.example.com/ --tlsv1 --ciphers ecdhe_ecdsa_aes_256_sha
```
Swift版 Nifty Cloud Mobile Backendでアイコンに付くバッチをリセットする方法



せっかくiOSアプリをSwiftで書けるようになったのに、Objective-Cのスニペットが多すぎる！
ということで、私が変換したSwiftコードを貼り付けていくシリーズです。

Xcode 7.1, Swift2.1で確認しています。


元ネタはこちら
バッジ数をリセットしたい #52
https://github.com/NIFTYCloud-mbaas/UserCommunity/issues/52


```swift
func updateBadgeNumber(number : Int) {
    if ( number < 1 ) {
        UIApplication.sharedApplication().applicationIconBadgeNumber = -1
    } else {
        UIApplication.sharedApplication().applicationIconBadgeNumber = number
    }
    
    let currentInstallation = NCMBInstallation.currentInstallation()
    if (currentInstallation.deviceToken == nil) {
        return
    }
    
    // installation class update
    currentInstallation.setObject(number, forKey: "badge")
    currentInstallation.saveInBackgroundWithBlock{(error) -> Void in
        if ((error == nil)) {
            print("updateBadgeNumber complete")
        } else {
            print("updateBadgeNumber error: \(error)")
        }
    }
    
}
```
アクセスログからセッションを作成する方法

## 背景
ログ解析の分野において、セッション集計というのは主流でありますが、それを実現するには特定の業者のツールやルールによって集計されていることが多い。
なかなか自分でルールを決めて集計するということ以前は難しかったのですが、クエリで簡単に集計できるという手順を説明いたします。


## 準備　　<br>
今回もトレジャーデータの機能を利用して試してみます。
[前回](http://qiita.com/itochu0523/items/4113e35c587ab40c384f)同様JavaScriptSDKでデフォルトで取得できるログを利用します。

* 主に集計に利用するユーザ関数（UDF）：TD_SESSIONIZE<br>
  使い方は[マニュアル](http://docs.treasuredata.com/articles/udfs#tdsessionize)を参考にしました。<br>
* やりたいこと<br>
　- セッション集計をしてみる<br>
　- セッションごとにユーザセグメントなどを作成してみる

では実際に実行してみましょう。


## 集計方法

集計したテーブルはトレジャーデータのResultOutput機能を利用して<br>
データを書き出す。

* 用意したログをセッションIDを付与する
作成した集計テーブル:session

```sql
--hive
SELECT 
  TD_SESSIONIZE(time, 86400, td_ip) as session_id
, time
, td_ip
, td_path
, td_client_id
, td_title
, td_browser
, td_color
, td_os_version
, td_browser_version
, td_referrer 
, td_screen 
, td_os
, td_host 
, td_url
, td_language
FROM 
(
  SELECT time, td_ip, td_path, td_client_id, td_title
        ,td_browser, td_color, td_os_version
        ,td_browser_version, td_referrer, td_screen 
        ,td_os, td_host, td_url, td_language
  from access
  distribute by td_ip
  sort by td_ip,time
) a 
```

<br><br>
* セッションIDごとに開始時間と終了時間を集計する
　（そのセッションが何PVかも一緒に出力）
集計したテーブル名：session_summary


```sql
SELECT
   b.session_id as session_id
 , b.td_client_id as td_client_id
 , TD_TIME_FORMAT(b.session_start_time, 'yyyy-MM-dd HH:mm:ss', 'JST') as session_start_time
 , TD_TIME_FORMAT(b.session_end_time, 'yyyy-MM-dd HH:mm:ss', 'JST') as session_end_time
 , (b.session_end_time - b.session_start_time) as session_stay_time
 , b.session_cnt as session_cnt
FROM
(
SELECT
   a.session_id as session_id
 , a.td_client_id as td_client_id
 , min(a.time) as session_start_time
 , max(a.time) as session_end_time
 , count(1) as session_cnt
FROM
(
  SELECT 
    TD_SESSIONIZE(time, 86400, td_ip) as session_id
  , time
  , td_ip
  , td_path
  , td_client_id
  FROM (
    SELECT time, td_ip, td_path, td_client_id
    from access
    distribute by td_ip
    sort by td_ip,time
  ) t
) a
GROUP BY a.session_id,a.td_client_id
ORDER BY a.session_id
) b
```

<br><br>
* 出力結果
<img src="https://gyazo.com/fb4f9335f0f5c477973abcdb703e5e5a.png" alt="session" title="session">


<br><br>
* やってみて思うこと
 - 1日分のログを集計単位とすれば、１日における一人のセッションに関して情報をまとめることが可能。
 - ipが同じものをセッションと定義し集約している。他の要素でもセッションが定義できそう。
   例えば、同じユーザエージェントであるという要素も加えることが可能。


簡単に作成できるので試してみてください。
機能制限用パスコードを忘れてしまった時の対処法

機能制限用パスコードを忘れてしまって、長らく放置していたけれど、
どうしても気持ちが悪いので再設定出来ないか調べてみました。

# 結論：PCへのバックアップファイルの中身を除く

pinfinder (https://github.com/gwatts/pinfinder) というツールを使ってバックアップファイルの中から機能制限用パスコードを抜き出すことが出来ました。
私は Mac 版で試しましたが、他に Windows, Linux 版もあります。

## pinfinder の使い方

1. iThnes で iPhone のバックアップを「このコンピュータ」に取ります。
この時、「iPhoneのバックアップを暗号化」のチェックボックスはoffにします。
（暗号化しているとうまく動作しません）

2. pinfinder の最新版をダウンロードします。[ダウンロードページ](https://github.com/gwatts/pinfinder/releases)

3. pinfinder を実行！

```
$ ./pinfinder
PIN Finder 1.2.0
Searching backup at /Users/username/Library/Application Support/MobileSync/Backup/hogehogehoge
Finding PIN... FOUND!
PIN number is: 1234 (found in 960.516755ms)
Press Enter to exit
```

とこんな感じで機能制限用パスコード(1234)を発見することが出来ました。

発見した後は「iPhoneのバックアップを暗号化」をonにしてバックアップしておきましょう。


# 機能制限用パスコードについて（メモ）

今回の調査で自身も曖昧だった点をメモとして残します。

## デフォルトのパスコードは無い

iPhoneを購入した最初、機能制限はオフの状態です。
パスコードが設定されているということは過去に自身で設定した可能性が高いです。
あとは購入店舗で設定されたケースもあるかもしれません。

## パスコードと機能制限用パスコードは別モノ

iPhone起動時に入力するパスコードと機能制限用パスコードは別々の扱いのため、
異なったパスコードが設定できます。（用語も似ているのでここら辺が混乱のもとでもありますが）

## バックアップの暗号化

バックアップを暗号化していないと、バックアップから機能制限用パスコードが漏れる可能性があるということを実感しました。
機能制限パスコードとパスコードを同じ値にしていると、そこからパスコードも漏れてしまう可能性も。
暗号化大事。
ruby on rails - libv8, mysql2のアップデートでエラーと対処



Amazon Linux ( AWS EC2 )での話です。

gemのlibv8を3.16.14.11から3.16.14.13へ
mysql2を0.3.18から0.4.1へアップデートするときエラーとなった

対処としては

```bash
yum install mysql56-libs
yum install mysql56-devel
```
として対応

nativeなgemに必要なライブラリがインストールされていなかったのだが、どのライブラリか特定するのに時間がかかった。

おそらく、mysql56-develだけでOKだと思われるがlibsからインストールしてしまったため、両方併記しておきます。

root権限で

```bash
bundle update
```
して解決


root権限がないとパーミッションエラーになりました。
（この辺は環境依存かも知れません）
keyhacから corvusSKKを 再起動する方法

ここで言う corvusSKK の「再起動」とは，
一旦 IMEオフしてから 再度 IMEオンする（トグル操作）だけのことを言います。

corvusSKK を使用中に「今どのモードにあるか」をけっこう見失いがちですが
これでいつでもワンアクションで初期状態に戻せます。（デフォルトは「かな」モード）

なお 前提として，デフォルト IME を corvusSKK とします。
また corvusSKKの「キー０」設定はデフォルトのまま用います。

keyhac設定に記述する Pythonスクリプト（例）は以下の通りです。
定義した init_ime()関数を 好みのキーバインドに割り当てるだけです。
この（例）では Alt + Space に割り当てています。

```Python:（例）
def init_ime():
    # IME OFF
    wnd = keymap.getTopLevelWindow()
    wnd.setImeStatus( 0 )
    
    # IME TOGGLE
    Input.send([
        Key(VK_KANJI),
    ])

keymap_global[ "A-Space" ] = init_ime     # Alt + Space : IME 初期化
```

備考：
・keyhac は キーボード操作をカスタマイズする（Windows用）アプリケーションです。
・CorvusSKK は Windowsで動作するSKK風のIMEです。
両ソフトの開発者様にはこの場をかりて感謝の意を表します。
Material Design for Bootstrap を Rails4で使う

[Material Design for Bootstrap](https://fezvrasta.github.io/bootstrap-material-design/)をRails4で使う設定のメモです。

必要なGem。

```rb:Gemfile
gem 'jquery-rails'
gem 'bootstrap-sass'
gem 'bootstrap-material-design'
```

Material Design for Bootstrap を Bootstrap の後に読み込む必要があるので、 `require_self` を使って `bootstrap-material-design` より先に `bootstrap-sass` をインポートします。

```application.css.scss
//= require_self
//= require bootstrap-material-design

@import 'bootstrap-sprockets';
@import 'bootstrap';
```

Turbolinks で `page:load` が発火されたタイミングで `$.material.init();` を実行します。

```application.js
//= require jquery2
//= require jquery_ujs
//= require turbolinks
//= require bootstrap-material-design
//= require bootstrap-sprockets

$(document).on('ready page:load', function() {
  $.material.init();
});
```
Web魚拓が作られた時に、魚拓内容を書き換え強制リダイレクトする

Web魚拓超怖い。元ネタ削除前に魚拓されると、ずっと残り続けます。今年に入っても某退職エントリとか...[サイトミラーリングの対策を実行されたこちらのエントリ](http://webimemo.com/web/8525)をより汎用的にしたコードです。ドメイン名が異なると非表示になるためミラーサイト対策にもなります。


## 魚拓元のサイト
[http://subc.github.io/gyotaku/](http://subc.github.io/gyotaku/)

## Web魚拓結果
魚拓しましたがコンテンツが非表示になっていてます。
[http://megalodon.jp/2015-1102-1443-25/subc.github.io/gyotaku/](http://megalodon.jp/2015-1102-1443-25/subc.github.io/gyotaku/)
![スクリーンショット 2015-11-02 15.10.11.png](https://qiita-image-store.s3.amazonaws.com/0/65312/68cfdbd9-50e6-79be-fa60-a9c4d44170e7.png)



# ソースコード

```js:deny.js

// ホストネームに含まれる文字列
host_name = 'github.io';

// コピーされたときのredirect先
redirect_deny_url = 'http://megalodon.jp/';
redirect_millisec = 5000;

// コピーされたときに表示するメッセージ
deny_message = '<h3>本ページは削除されました。(・ω<) ﾃﾍﾍﾟﾛ </h3>';


function main(){
    // ローカルなら動かさない
    if ($(location).attr('hostname') == ''){
        console.info('is local');
        return null;
    }

    // ホストが異なるなら実行
    if ($(location).attr('hostname').match(host_name)){
        // 正常
        console.info('my site');
        return null;
    }else{
        // コピーサイト
        console.info('copy site');
        disable();
    }
}

function disable(){
    console.info('start disable');
    // div.mainを書き換え
    $("div.main").html(deny_message);
    // 5秒後にredirect
    setTimeout(function(){
        $(document).ready( function() {
            $(location).attr("href", redirect_deny_url);
        });
    },redirect_millisec);
}

$(main);

```

```html:index.html
<html>
<head>
<title>Portfolio</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script src="http://code.jquery.com/jquery-1.11.1.min.js"></script>
<script src="./deny.js"></script>
<body>

<div class="main">
    <p style="margin: 100px">
    土星レイドハードのオリックス強すぎてギスギス絆崩壊ハロウィーン...<br />
    <img src="http://livedoor.blogimg.jp/games084/imgs/0/d/0d3cf4ec.jpg">
</div>

</body>
</html>

```

# 完全に消える訳ではない
非表示になるだけで、ソースを見るとデータが残っているので復元できてしまいます。
![スクリーンショット 2015-11-02 15.13.54.png](https://qiita-image-store.s3.amazonaws.com/0/65312/da25441b-58aa-67c9-a06c-fea92118a7bd.png)
vimで複数行に渡る同じ列の情報をサクッと置き換えるメモ

複数行に渡る情報を一気に置き換える方法のメモです。

使用例

以下のクエリ内にある'testXX'を全て、'test start'のように変換させたい時に便利です。(%sでの置き換えが面倒な時なども)

insert into (id, value) into ('0001', 'test開始');
insert into (id, value) into ('0001', 'test終了');
insert into (id, value) into ('0001', 'test開始');
insert into (id, value) into ('0001', 'test終了');



#\<Ctrl-v\>で短形選択し、開始終了にフォーカスがあるように選択#
<img width="574" alt="短形選択.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/66506/85581dda-699d-8463-89df-bc6827f8de63.jpeg">

#cで挿入モード#

<img width="574" alt="cで挿入.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/66506/544df355-9a76-2eb9-917d-92d198c2720c.jpeg">

#’ start’を入力#
<img width="569" alt="入力.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/66506/68e2149e-50b7-12e9-e1fd-f5504cd6bb46.jpeg">

#escで終了#
<img width="572" alt="escで終了.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/66506/9fd35ca5-12c2-141f-1be6-30b548d14f48.jpeg">



これで置き換え完了！
定形外の作業で１度きりのようなところで使う想定です。
Laravel Homestead PHP7版の導入手順

LaravelでPHP7環境を試そうと思ったとき、公式の手順だとちょっと詰まったのでメモ。
（公式は→ http://laravel.com/docs/5.1/homestead ）
導入環境はmac、Homesteadはプロジェクト毎にcomposerでインストールする形を想定。
## PHP7のHomesteadのBoxを追加
```
$ vagrant box add laravel/homestead-7
```
DLが超遅かったので時間がある時にやるのが吉。
複数人数で使う場合は
```
~/.vagrant.d/boxes/laravel-VAGRANTSLASH-homestead-7
```
にBoxが入っているので、これを渡すとGOOD。
## composerでHomesteadのphp-7ブランチをインストール
以降はプロジェクトディレクトリでの作業を想定。
```
$ composer require laravel/homestead:dev-php-7 --dev
```
## Homestead.ymlとVagrantfileを生成
```
$ php vendor/bin/homestead make
```
プロジェクトディレクトリ直下にファイルが生成される。
## Homestead.ymlでboxを指定
```
---
```
の次の行に
```
box: laravel/homestead-7
```
を追加。
## VMを起動
```
$ vagrant up
```
デフォルトだとlocalhost:8000で繋がるようになる。
## その他メモ
HomesteadのMySQLに繋ぐ場合、
```
ID: homestead
PASS: secret
```
のユーザがデフォルトで登録されているので、これを使うとGOOD。
Atomでリモートファイルを更新するパッケージ


## はじめに

vimでいう`netrw`、emacsでいう`tramp`のようなものがAtomにもないかと思い調べてみた。
結論から言うと[remote-edit](https://atom.io/packages/remote-edit)が一番求めているものに近かったのでこれを導入することにしたが、折角他のパッケージについても調査をしたのでまとめてみることにした。

## `netrw`や`tramp`を知らない方へ

vimの`netrw`、emacsの`tramp`を知らない方のために、先にどのようなものであるかを簡単に説明する。

vimの場合、通常のファイルを開く場合は以下のようなコマンドを入力して行う。

```vim
:e /path/to/target.txt
```

ここでふとあるサーバに置いてある`target.txt`を別バッファ(Atomで言うペイン)に表示したくなった場合、下記のようなコマンドを入力する。

```vim
:vnew scp://user@server//path/to/target.txt
```

`scp://`としているところは`ftp://`でも`sftp://`でも`rsync://`でも良いのだが、このようにすると`netrw`プラグインがよしなにやってくれて、別バッファ(Atomでいうペインのようなもの)に指定したファイルを読み込んでくれる。
実ファイルはテンポラリディレクトリ内に一時ファイルとして保存されているが、利用者はそういった裏のことを意識することなくリモートファイルをまるでローカルファイルであるかのように扱うことが可能となる。

vimでの操作が慣れているためvimを例として説明したが、emacsの`tramp`も似たようなプラグインである。

## 調査・検討を行ったAtomパッケージ

### remote-atom

[remote-atom](https://atom.io/packages/remote-atom)

[rmate](https://github.com/textmate/rmate)をAtomで利用できるようにするためのパッケージ。
rmateをすでに利用していて、別のエディタからAtomに乗り換えたいというケースには最適だと思われる。
個人的にはAtom内で完結しない、rmateコマンドを別途インストールする必要がある等初期導入コストが他と比べて高めに感じたため導入は見送った。

### remote-edit

[remote-edit](https://atom.io/packages/remote-edit)

vimmerなら[neossh(unite-ssh)](https://github.com/Shougo/neossh.vim)に近い動きと言えば理解してくれるだろうか？
コマンドパレットから接続サーバ及び編集対象ファイルを選択して編集を行う。
編集対象ファイルはテンポラリファイルとして保存され、利用者は実ファイルがどこに保存されているかを意識する必要がない。
vimで`Unite ssh://`したときのように絞り込んで対象ファイルを選択する挙動が快適であるため、他のパッケージを利用している方も一度試してみることをお勧めしたい。

これが求めている機能に一番近かったのだが、事前に接続サーバのセットアップが必要であるのがvimの`netrw`に慣れている身としては若干わずらわしい。

#### 2015/11/17 注意事項

現時点での最新版であるAtom 1.2.0ではバグがあり動作しないため注意が必要。
詳しくは[別エントリ](http://qiita.com/from_kyushu/items/7b1462179e2b2ba95319)に書いたのでこちらを参照してほしい。

#### 2015/12/07 追記

2015/11/17に追記した件は2015/12/05に取り込まれたPRによって解決した。
Atom 1.2.3以降であれば動作する。

### remote-ftp

[remote-ftp](https://atom.io/packages/remote-ftp)

パッケージの説明にもある通り、FTP/SFTPクライアントと言うのが適切。
プロジェクトフォルダごとに`.ftpconfig`というファイルにFTP/SFTP接続情報を書いて保存し、通常のツリービューとリモートのツリービューを行き来してファイルのアップロード/ダウンロードを行う。
`.ftpconfig`はプロジェクトフォルダのサブフォルダ内に作成することも可能だが、同期対象はプロジェクトフォルダ全体となるため注意が必要。
上記2パッケージと違い、ローカルとリモートの同期を取ることが主目的であり、求めているものとは異なったため導入は見送った。

### remote-sync

[remote-sync](https://atom.io/packages/remote-sync)

ローカルとリモートの同期を取ってくれるパッケージ。
ローカルで保存するとバックグラウンドでリモートにアップロードを行う。
個人的には前述したremote-ftpのツリービューなし版という認識だが、こちらはローカルとリモートでdiffを取ることも出来るようだ。
こちらもremote-ftpと同じように`.remote-sync.json`というファイルをプロジェクトフォルダに保存する。
`.remote-sync.json`はプロジェクトフォルダのサブフォルダ内に作成することも可能だが、同期対象はプロジェクトフォルダ全体となるため注意が必要。
c++ builder > IDE > ファイル内の検索 > 「対象:プロジェクト内のファイル」> #includeで使用する.hファイルは検索対象外

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

- XXX.h というファイルを作成 (XXX.cppはなし. constだけのファイル)
- あるフォームで #include "XXX.h"
- 「ファイル内の検索」で「対象: プロジェクト内のファイル」として検索する

上記の場合、XXX.hの中身は検索されない。

XXX.hをプロジェクトに追加すると検索対象にはなるが、#includeだけすればいい.hファイルをプロジェクトに追加することには抵抗がある。
AndroidStudioプラグイン開発で、選択したテキストを取得する

すごいしょぼいところですがスニペットとして残します。

# コード

```java
// AnActionEventからEditorを取得
Editor editor = event.getData(PlatformDataKeys.EDITOR);
// SelectionModelを取得
final SelectionModel selectionModel = editor.getSelectionModel();
// 選択中の判定
boolean hasSelection = selectionModel.hasSelection();
if (hasSelection) {
    // 選択中のテキストを取得
    final String selectedText = selectionModel.getSelectedText(true);
}
```

# 覚えておくといいかも
エディタに対して何かしたい時は `Editor`から `~Model` を取得するとできます。
例えば、カーソルの情報を取りたいなら `editor.getCaretModel()` ですし、
インデントの情報を取りたいなら `editor.getIndentsModel()` です。

参考にしたコード: [StringManipulation](https://github.com/krasa/StringManipulation/blob/master/src/osmedile/intellij/stringmanip/DecrementAction.java#L35-L40)
Drupal7をサブディレクトリで動作させる方法

### 概要
Drupal7をドキュメントルートではなくサブディレクトリで動作させる方法です。
Apacheなどのサーバー設定の詳細は記載しません。ご了承ください。

出来ること 例 
/var/www/project をドキュメントルートとし、http://example.com/ でアクセス可能になっている場合、
/var/www/project/drupal にdrupal一式を配置して、以下のようなURLでアクセス可能とする。

http://example.com/drupal
http://example.com/drupal/node/100
http://example.com/drupal/admin/config

### 修正箇所
#### drupalのルートディレクトリの.htaccessに追記

```/var/www/project/drupal/.htaccess
RewriteBase /drupal
```

#### ドキュメントルートに.htaccessを配置(もしくは追記)
```/var/www/project/.htaccess
  # ルートのアクセスをサブディレクトリdrupalへ
  RewriteCond %{REQUEST_FILENAME} -f [OR]
  RewriteRule ^$ /drupal/index.php [L]

  # ルートファイルへのアクセスは、そのまま有効とする
  RewriteCond %{REQUEST_FILENAME} -f [OR]
  RewriteCond %{REQUEST_FILENAME} -d
  RewriteRule ^ - [L]

  # サブディレクトリdrupalへファイルアクセスを流す
  RewriteCond %{DOCUMENT_ROOT}/drupal/%{REQUEST_URI} -f [OR]
  RewriteCond %{DOCUMENT_ROOT}/drupal/%{REQUEST_URI} -d
  RewriteRule ^(.*)$ /drupal/$1 [L]

  # その他アクセスはサブディレクトリdrupalへ流す
  RewriteRule ^(.*)$ /drupal/index.php?q=$1&%{QUERY_STRING} [L]

```

### ポイント
ドキュメントルートの.htaccessは記述すると安心ですが、必須ではないです。
その運用に合わせて記述を変えてください。

サブディレクトリで動作させる場合、
カスタムテーマで画像のパスを「/sites/all/〜」など独自に指定してるとパスがずれるので対応が大変になるかも。
リンクの生成はDrupalにお任せするのがベスト。

どうしても、自分でパスを生成する必要があるときは、

```ex.php
$base_url  ・・・ 例 : http://example.com 
base_path() ・・・　例 : /drupal/
```

などで取得すると楽です。以上です。
MySQL 5.0から5.6にアップグレード

# バックアップ
`mysqldump -u (ユーザ名) --password (パスワード) --all-databases`

# MySQLを停止
`service mysql stop`

# MySQLをアンインストール
```
yum list mysql*
yum remove (パッケージ)
```

# MySQLをインストール
http://dev.mysql.com/downloads/mysql/5.6.html#downloads
あたりからMySQL-5.6.27-1.linux_glibc2.5.x86_64.rpm-bundle.tarをダウンロードして、解凍

`rpm -i ***.rpm`

# MySQLを起動
`service mysql start`

# 多分エラーが発生するので
`vi /var/lib/***.err`
を見てエラーを修正していく。
EC2でpip installする時に必要なyumパッケージまとめ

いっつも同じことググってるのでメモ。

`pip`でインストールする時に必要になるパッケージ。

ちゃんと細かく調べて無いので、余計なものも入れちゃってるかも。


# いろいろ用

```bash
sudo yum install gcc
sudo yum install patch
```

`gnureadline`とか、`patch`コマンド使ってるパッケージがある。


# MySQL-Python用

```bash
sudo yum install mysql-devel
```


# Pillow用

```bash
sudo yum install libjpeg-turbo-devel
sudo yum install zlib
sudo yum install libtiff-devel
sudo yum install freetype-devel
sudo yum install libwebp-devel
sudo yum install lcms2-devel
sudo yum install openjpeg-devel
sudo yum install openjpeg-libs
```

[ここ](http://pillow.readthedocs.org/en/3.0.x/installation.html#external-libraries)を参考に。

openjpegいれても、jpeg2000サポートが有効になってないっぽい。
なので、最後の2行いらないかも。


# lxml用

```bash
sudo yum install libxml2-devel
sudo yum install libxslt-devel
```

元ネタは、[ここ](http://stackoverflow.com/questions/5178416/pip-install-lxml-error)。


# iPython用

```bash
sudo yum install ncurses-devel
```

`gnureadline`をインストールする時に必要な気がする。


# 何用かわかんない

```bash
sudo yum install libffi-devel
```
Bandwidth Pool のグループ設定地域に東京DCが無い件

# 概要
**Bandwidth Pool** を ソフトレイヤー東京データセンターに設定しようとしたところ、Region (地域)の選択リストの中に、東京が無い。　もしかして、東京データセンターでは、**Bandwidth Pool** が出来ないのではないか？ と不安になってしまいます。　その疑問について答えを確認しました。


# Bandwidth Pool のグループ作成画面

Bandwidth Pool を作るには、「**Network**」 -> 「**Pools**」 -> 「**Add**」に進むと、次の画面になります。 問題のRegion(地域)の部分ですが、AUS（オーストラリア), MEX（メキシコ）などはあるのに、日本がありません。　

![Bw_Pool_add.png](https://qiita-image-store.s3.amazonaws.com/0/42829/10e0aaf3-dca5-360a-7a0d-359eea5a6845.png)

という事は東京データセンターで、Bandwidth Pool を設定できないという事なのでしょうか? いえいえ心配無用です。　東京データセンターは、**SNG/HKG**リージョンに含まれているからです。


# 東京とシンガポールでの帯域プール作成

いろいろ記述して説明するより、**SNG/HKG**リージョンに東京データセンターのサーバーが含まれている状態のスクリーンショットを見ることが、もっとも説得力がると思います。　という事で次のスクリーンショットを見てください。

![Bw_Pool_Detail.png](https://qiita-image-store.s3.amazonaws.com/0/42829/11d8460e-c043-9279-7262-dfdf59b85140.png)

**Region: SNG/HKG** シンガポール・香港地域となっています。 これに対して、その下のサーバーリストの **Location** カラムを見ると、Tokyo2, Singapore1 のサーバーが混在しています。この事から同じ地域のデータセンターを股がって、Bandwidth poolが作れることが理解できます。

# まとめ
東京DCは、シンガポール・香港と一つの地域と見なされ、一つの帯域プールで、東京、香港、シンガポールのサーバーの固定料金枠を共有することができるのです。　なんだかスケールが大きいですね。
LXDでブリッジ接続する方法

※最新の記事を投稿しました。

https://qiita.com/tabimoba/items/e5ea32c8359f0f9e0f3b

# はじめに
LXDでは、LXCと同様デフォルトではlxcbr0というインターフェースが参照され、ゲスト（コンテナ）側にはDHCPで10.0.3.xというIPアドレスが割り当てられます。

LXDでブリッジ接続を利用したい（物理NICと同じセグメントのIPアドレスを利用したい、グローバルIPアドレスを利用したい）場合は、以下の設定を行うことで利用可能となります。

# 手順
* 下記はUbuntu 14.04 LTSの場合の設定例となります。
* LXDは事前にインストール済みであることとします。

## ブリッジインターフェースを追加する
/etc/network/interfaces を以下の通り設定します。IPアドレス、サブネット等は環境に合わせて適宜変更します。
 
```
auto lo
iface lo inet loopback

auto p1p1
iface p1p1 inet manual

auto br0
iface br0 inet static
address 192.168.1.100
netmask 255.255.255.0
network 192.168.1.0
broadcast 192.168.1.255
gateway 192.168.1.254
dns-nameservers 8.8.8.8 8.8.4.4
bridge_ports p1p1
bridge_stp off
bridge_fd 0
bridge_maxwait 0
```
## lxcのprofileを変更します。

以下のコマンドを実行すると、登録されているprofileを確認することができます。

```
# lxc profile list
default
migratable
```

今回は、defaultを変更します。デフォルトのプロファイルですので、これを変更することで、基本的には全てのコンテナがブリッジ接続になります。

```
# lxc profile edit default
```

上記コマンドを実行するとviが起動しますので、以下「変更後」のとおり変更します。（parentをlxcbr0→br0に変更します）

### 変更前

```
name: default
config: {}
devices:
  eth0:
    nictype: bridged
    parent: lxcbr0
    type: nic 
```

### 変更後

```
name: default
config: {}
devices:
  eth0:
    nictype: bridged
    parent: br0
    type: nic
```

# 結果
## 変更前

```
# lxc list
+-------------+---------+-----------+------+-----------+-----------+
|    NAME     |  STATE  |     IPV4  | IPV6 | EPHEMERAL | SNAPSHOTS |
+-------------+---------+-----------+------+-----------+-----------+
| centos-test | RUNNING | 10.0.3.54 |      | NO        | 0         |
+-------------+---------+-----------+------+-----------+-----------+
```

## 変更後

ブリッジ側（物理NIC側）にDHCPサーバ（ブロードバンドルーター等）が存在する場合は、そのIPアドレスが割り当てられます。

ゲストに対して固定IPを割り当てたい場合は、ゲスト側で通常のLinux(CentOS,Ubuntu等)と同じ要領でネットワーク設定を行います。

```
# lxc list
+-------------+---------+-------------+------+-----------+-----------+
|    NAME     |  STATE  |     IPV4    | IPV6 | EPHEMERAL | SNAPSHOTS |
+-------------+---------+-------------+------+-----------+-----------+
| centos-test | RUNNING | 192.168.1.6 |      | NO        | 0         |
+-------------+---------+-------------+------+-----------+-----------+
```
Swift2.0で正規表現を簡単に扱う。

## Swift2.0

Swfit2.0からSwiftのお勉強を始めたのですが、
ブログなどで共有していただいているSwfitのコードが通らなくて難儀する日々です。

SwiftでJSのような手軽さで正規表現をマッチさせるLibraryを書かれていた人がいたのですが、

Swift2.0ではビルドが通りませんでした。
それを修正してみたので共有します。
matchesInStringのエラーハンドラーがなくなりかわりにtryを使わないといけなくなったみたいです。

http://easyramble.com/swift-regular-expression-utility.html

## ソースコード

```swift|Regexp.swift
import Foundation

class Regexp {
    let internalRegexp: NSRegularExpression
    let pattern: String
    
    init(_ pattern: String) {
        self.pattern = pattern
        self.internalRegexp = try! NSRegularExpression( pattern: pattern, options: NSRegularExpressionOptions.CaseInsensitive)
    }
    
    func isMatch(input: String) -> Bool {
        let matches = self.internalRegexp.matchesInString( input, options: [], range:NSMakeRange(0, input.characters.count) )
        return matches.count > 0
    }
    
    func matches(input: String) -> [String]? {
        if self.isMatch(input) {
            let matches = self.internalRegexp.matchesInString( input, options: [], range:NSMakeRange(0, input.characters.count) )
            var results: [String] = []
            for i in 0 ..< matches.count {
                results.append( (input as NSString).substringWithRange(matches[i].range) )
            }
            return results
        }
        return nil
    }
}
```

## 使い方

URLを抽出してみます。
使い方自体は参考ページと変わりません。

```swift
let pattern = "http://([a-zA-Z0-9]|.)+"
let str:String = "銘柄コード:1557,銘柄名:SPDR S&P500 ETF TRUST板価格:25270.0,板数量:10000にいびつな板(寄与率:81.20178%)を検出しました。http://oreore.com/servlets/Action?SRC=1234"
Regexp(pattern).isMatch(str) //マッチした結果　ここではtrue
let ret:[String] = Regexp(pattern).matches(str)! //http以下を取得
```
Qiita 記事の URL の末尾に .md をつけると生の Markdown になる

# Qiita の記事 URL の末尾に .md をつける

* と生の Markdown になる

<!-- コメント -->

![gazou.png](https://qiita-image-store.s3.amazonaws.com/0/3603/2a3b603e-97eb-5a0e-ade9-1196693b7c14.png)

----

.json もいけたらしい。
http://qiita.com/tukiyo3/items/f5285f836f7c4d2143ec
c++ builder XE4, 10.2 Tokyo > コンピュータ名を取得 > GetComputerNameA(name, &buf);

```txt:動作確認
C++ Builder XE4
Rad Studio 10.2 Tokyo Update 2 (追記: 2017/12/27)
```

コンピュータ名を取得したい。ASCII版。

参考: http://lupin.client.jp/delphi/

```cpp
char name[130];
unsigned long buf;

buf = 120;
GetComputerNameA(name, &buf);

ShowMessage(String(name));
```

関連
http://owlsperspective.blogspot.jp/2010/07/getcomputername.html
sc5-stylgeduigeの記述方法

sc5-styleguideを使う際に日本語での解説が見つからず。
KSSの記述方法なのか、sc5-stylgeduige特有の記述方法なのかわからないですが、一応メモです。
## style.scssファイル内での記述
~~~css
// 色 /*←セクション名（ページ名）になる*/
// /*←この行も必要っぽい*/
// markUp:/*←これが必要*/
// <p class="red">テキスト赤</p>/*←実際にスタイルガイド内に表示されるHTML*/
// <p class="black">テキスト黒</p>/*←実際にスタイルガイド内に表示されるHTML*/
// /*←この行も必要っぽい*/
// Styleguide 1.0/*←最初が大文字でしっかりStyleguideと書き半角スペース後に章のナンバー 1.0なら1章、1.1なら1章のもうひとつ下のセクション？1となる、番号は上から順でなくてもいいが、ダブるのはだめ*/

//↓スタイル、自由に書く
.red{
  color: #ff0000;
}
.black{
  color: #000000;
}

~~~
## Overviewファイル
gulpfile.jsのstyleguide:generate内のpipe()内にこんな感じで書く。

~~~js
.pipe(styleguide.generate({
  title: 'サイトのスタイルガイド',
  server: true,
  rootPath: 'パス',
  overviewPath: 'パス/overview.md',/*overviewファイルの場所を指定*/
  port: 5001,
  basicAuth: {
    username: 'username',
    password: 'password'
  }
}))
~~~

##_styleguide_variables.scss内の変数はブラウザから変更して保存可能
sc5-styleguideのウリのようだが、変数をブラウザから変更して保存ができる。
_styleguide_variables.scssに

~~~css
$color-red: #ff0000;
~~~

みたいに書いておいて、style.scss内でインポートしておくとスタイルガイドをたちあげた状態で変更保存が可能。

##元ファイル
https://github.com/SC5/sc5-styleguide の test/projects 内のどれかを持ってきてコピーして使うのがいい。
Pessimize で Gemfile のバージョン指定をサクッと追記

# 概要

Ruby 開発者のみなさん、Gemfile でちゃんとバージョン指定してますか？
[Effective Ruby](http://www.amazon.co.jp/Effective-Ruby-Peter-J-Jones/dp/4798139823/) の第 7 章項目 43 にこう書かれています。

> バージョン要件の上限を省略するのは、自分のアプリケーションやライブラリが依存コードの将来のすべてのバージョンをサポートすると公言するようなものだ。

あなたにその覚悟がおありですか？ `bundle update` してもプロジェクトは壊れませんか？

「でも私全然バージョン指定してないわ…。かといって、ひとつひとつバージョンを調べて指定するの超めんどい…」

という方も安心。[Pessimize](https://github.com/joonty/pessimize) ならね。
("gem version add auto" でググったらこいつが出てきました。)

# 使い方

```
$ gem install pessimize
$ pessimize --version-constraint patch
```

すると以下の Gemfile が…

```:Gemfile
# before
gem 'rails'
gem 'responders'
gem 'pg'
gem 'database_cleaner'
gem 'devise'
gem 'cancancan'
```

なんということでしょう！
悲観的バージョン演算子 `~>` によってしっかりバージョン指定されているではありませんか。

```:Gemfile
# after (with --version-constraint patch)
gem 'rails', "~> 4.2.4"
gem 'responders', "~> 2.1.0"
gem 'pg', "~> 0.18.1"
gem 'database_cleaner', "~> 1.4.1"
gem 'devise', "~> 3.4.1"
gem 'cancancan', "~> 1.10.1"
```

なお `--version-constraint patch` を省略する、つまりデフォルトでは

```:Gemfile
# after (default or with --version-constraint minor)
gem 'rails', "~> 4.2"
gem 'responders', "~> 2.1"
gem 'pg', "~> 0.18"
gem 'database_cleaner', "~> 1.4"
gem 'devise', "~> 3.4"
gem 'cancancan', "~> 1.10"
```

とマイナーバージョンまでの指定となります。

# 余談

[Effective Ruby](http://www.amazon.co.jp/Effective-Ruby-Peter-J-Jones/dp/4798139823/) では、
「悲観的バージョン演算子はファジーなので利用せず、バージョン番号の範囲を明示的に示せ」とも指摘されていますが、
そこまでは厳密でなくてもいいかなと個人的には考えています。
WordPress 管理画面とadmin bar から色々消す (4.0.1 時点)

```php:functions.php
// admin bar のロゴ非表示
function hide_admin_logo() {
global $wp_admin_bar;
$wp_admin_bar->remove_menu( 'wp-logo' );
}
add_action( 'wp_before_admin_bar_render', 'hide_admin_logo' );


// ダッシュボード非表示
function example_remove_dashboard_widgets() {
  global $wp_meta_boxes;
  unset($wp_meta_boxes['dashboard']['normal']['core']['dashboard_right_now']);   // 現在の状況（概要）
  unset($wp_meta_boxes['dashboard']['normal']['core']['dashboard_recent_comments']);   // 最近のコメント
  unset($wp_meta_boxes['dashboard']['normal']['core']['dashboard_incoming_links']);   // 被リンク
  unset($wp_meta_boxes['dashboard']['normal']['core']['dashboard_plugins']);   // プラグイン
  unset($wp_meta_boxes['dashboard']['side']['core']['dashboard_quick_press']);   // クイック投稿
  unset($wp_meta_boxes['dashboard']['side']['core']['dashboard_recent_drafts']);   // 最近の下書き
  unset($wp_meta_boxes['dashboard']['side']['core']['dashboard_primary']);   // WordPressブログ
  unset($wp_meta_boxes['dashboard']['side']['core']['dashboard_secondary']);   // WordPressフォーラム
}
add_action('wp_dashboard_setup', 'example_remove_dashboard_widgets');


// 更新系非表示
if (!current_user_can('administrator')) {
  add_filter('pre_site_transient_update_core', create_function('$a', "return null;"));
}

// 表示オプションとヘルプ非表示
function my_admin_head(){
 echo '<style type="text/css">#contextual-help-link-wrap{display:none;}</style>';
 echo '<style type="text/css">#screen-options-link-wrap{display:none;}</style>';
 }
add_action('admin_head', 'my_admin_head');

// WordPress のご利用ありがとうございます。非表示
function custom_admin_footer() {
 echo '&nbsp;';
 }
add_filter('admin_footer_text', 'custom_admin_footer');

```
ひとまずこれだけ
vagrant box addで [Windows-3 1J and ASCII-8BIT (Encoding::CompatibilityError)]

##環境：Windows7 Pro SP1(32bit) + VirtualBox + Vagrant

追記：最新版で問題が発生しないようになりました

win7 enterprise SP1(64bit) + VritualBox5.0.8 + Vagrant1.7.4
では、問題は一切発生しませんでした。

##組み合わせ

Windows7 Pro SP1(32bit)

| VirtualBox |Vagrant  |結果|
|-----------:|--------:|----|
| 5.0.16     | 1.8.1   |OK|
| 5.0.8      | 1.7.4   |NG *1 |
| 5.0.8      | 1.7.2   |NG *2 |
| 4.3.32     | 1.7.2   |OK|
| 4.3.32     | 1.7.3   |NG *1|
| 4.3.32     | 1.7.4   |NG *1|


##NG *1
```lang:command
C:\Vagrant\CentOS6>vagrant box add CentOS6.5_64 https://github.com/2creatives/va
grant-centos/releases/download/v6.5.3/centos65-x86_64-20140116.box
C:/HashiCorp/Vagrant/embedded/gems/gems/childprocess-0.5.6/lib/childprocess/wind
ows/process_builder.rb:63:in `join': incompatible character encodings: Windows-3
1J and ASCII-8BIT (Encoding::CompatibilityError)
        from C:/HashiCorp/Vagrant/embedded/gems/gems/childprocess-0.5.6/lib/chil

(以下略）
```

[incompatible character encodings: CP850 and Windows-1252 #3937](https://github.com/mitchellh/vagrant/issues/3937)

>set VAGRANT_HOME=C:\HashiCorp\Vagrant
>AND
>Changing the default VM folder on VirtualBox preferences

を参考にしました。

 'é' が問題?

確かに「山田太郎」の場合「t-yamada」の様に - 入りのアカウントを利用しています。
VirtualBoxのdefault仮想領域フォルダは「C:\VirtualBox」ですので
set VAGRANT_HOME=C:\HashiCorp\Vagrant　して

```lang:command
C:\Vagrant\CentOS6>set
（略）
USERPROFILE=C:\Users\t-yamada
VAGRANT_HOME=C:\HashiCorp\Vagrant
VBOX_MSI_INSTALL_PATH=C:\Program Files\Oracle\VirtualBox\
（略）
```

再度 box addしてみたが変わらず。
（コマンドプロンプトを管理者権限で実行しても同じ)


##NG *2
```lang:command
C:\Vagrant\CentOS6>vagrant up
No usable default provider could be found for your system.

Vagrant relies on interactions with 3rd party systems, known as
"providers", to provide Vagrant with resources to run development
environments. Examples are VirtualBox, VMware, Hyper-V.

The easiest solution to this message is to install VirtualBox, which
is available for free on all major platforms.

If you believe you already have a provider available, make sure it
is properly installed and configured. You can see more details about
why a particular provider isn't working by forcing usage with
`vagrant up --provider=PROVIDER`, which should give you a more specific
error message for that particular provider.
```

いや、ちゃんとインストールは成功してますから
vagrant入れたあとrebootもしましたし　"Orz

##OK
VAGRANT_HOME=C:\HashiCorp\Vagrant
環境変数 有り,無し All Ok。
環境変数,関係ないようです。

vagrant box add
vagrant up
vagrant reload
vagrant halt
vagrant package

全てOkでした。

###共通して利用したboxはこちら
***
ttps://github.com/2creatives/vagrant-centos/releases/download/v6.5.3/centos65-x86_64-20140116.box
[Javascript]new Dateで引数の日付文字列の形式でのブラウザの挙動の違い

new Date()の引数に日付を表す文字列値を指定した場合、以下の形式がブラウザによってエラーが出たり出なかったりしたのでメモ。

2015-11-02 13:00:59

上記の形式での日付文字列値を指定した場合、

- Chromeでは日付として認識してくれ、エラーがならない
- FireFoxでは日付として認識してくれなくて、エラーになる
- IEでも日付として認識してくれなくて、エラーになる

という結果になりました。
よって日付の形式としては、「2015/11/02 13:00:59」がよさそう。
Bandwidth Pool に加えたのに帯域が減ってしまう件

# 概要
Bandwidth Pool を購入して、その Pool にサーバーを追加したのにも関わらず、使える帯域が増えないケースがある。 この理由について調べたところ、月額課金サイクルの中で、締日までに残り日数が少ない場合は、リンク速度と日数から、日割りで比例計算して使える累積通信量を表示している。そのため、締日(Anniversary Billing Date) を過ぎるとサーバーで確保されている帯域が表示されるとのことであった。

# Bandwidth Pool とは
SoftLayerの公式な説明は、[Virtual Dedicated Racks Topic Description] (http://knowledgelayer.softlayer.com/articles/virtual-dedicated-racks-topic-description)にありますが、英語の説明は、簡潔なのですが、良く判らないので、補足すると、この Bandwidth Pool とは、異なるラックとデータセンター間で、仮想ラックを設定して、サーバーの累積通信量の固定料金枠を合わせてプールして利用できるものです。この Bandwidth は、帯域として訳され、回線の速度を表す言葉に利用されますが、ここでは、累積通信量を指し、一ヶ月の請求サイクルの中での累積量を指しています。


# 帯域プールが目論みどおりに増えないケース
二つの月額仮想サーバーを **WebBwPool** に入れた例です。 月額仮想サーバーの１台当りの月間累積通信量の固定枠（Bandwidth)は、250GB なのですが、以下の表示では、その ５分の2のBnadwidth しか確保されていません。　このプール **WebBwPool** を設定したのは、課金サイクルの締日１日前でした。

![Pool_Details_増えないケース.png](https://qiita-image-store.s3.amazonaws.com/0/42829/1b2c407f-a8f5-a978-6f2c-7efa597f6a81.png)

この表示だけを見ると、「いったい、どうなってるの？　帯域を合わせて合算されるハズじゃないの？ それが、僅か **100GB** ！？」 と怒りたくなりますよね。　

そこで、チケットに問合せたところ、以下の様な回答がきました。（意訳）

    月額課金サイクルの中で、締日までに残り日数が少ない場合は、リンク速度と残り日数から、比例計算して利用可能な累積通信量の固定料金枠を表示している。そのため、締日(Anniversary Billing Date) を過ぎるとサーバーで確保されている全ての固定料金枠の累積通信量(帯域)が表示されます。


# 締日を超えた場合

それでは、課金サイクルの締日(Anniversary Billing Date) を超えた場合、どの様な表示に変わるかというと、以下の様になります。 プールを構成するサーバーの帯域は、本来の 250GB が表示されています。

![Pool_Details_増えたケース.png](https://qiita-image-store.s3.amazonaws.com/0/42829/e5f46070-b6d8-c2ed-7844-3fe5d5253047.png)

# まとめ
サーバーの利用可能帯域が減った様に見えても、課金サイクル締日を過ぎると確保した全量が表示されるので、心配しなくて良いって事でした。

参考資料
- http://knowledgelayer.softlayer.com/articles/virtual-dedicated-racks-topic-description
MYSQLでDROP DATABASEがエラーになる（ ERROR 1010 (HY000): Error dropping database ）

TimeMachineで新しいMacBookへ移行する度にこうなって調べてる気がするので備忘に記す。

DBとしては存在しているが、色々壊れてしまってる（SQLがエラーになったり）ので、一旦DROPして再CREATEしようとしたらDROPできないという事態になってしまう。

下記のhogeが対象

```sql
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| hoge               |
+--------------------+
2 rows in set (0.00 sec)
```

DROPできない

```sql
mysql> drop database hoge;
ERROR 1010 (HY000): Error dropping database (can't rmdir ‘./hoge', errno: 66)
```

もうこういう時は、一度データファイルを削除して、CREATEし直すほうが手っ取り早い。

データディレクトリごと削除

```
$ rm -rf /usr/local/var/mysql/hoge
```

※ データファイルの場所どこだっけ？となった場合

```sql
mysql> show variables like 'datadir';
+---------------+-----------------------+
| Variable_name | Value                 |
+---------------+-----------------------+
| datadir       | /usr/local/var/mysql/ |
+---------------+-----------------------+
1 row in set (0.00 sec)
```

無事消えていることを確認

```sql
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
+--------------------+
2 rows in set (0.00 sec)
```

あとはCREATEし直してあげておしまい
[Android]Spinnerの文字色をJavaで指定する

#なにこれ
「Spinner」に表示される文字の文字色をJava側で変更できるようにする。
同じSpinnerに渡すObjectsが変化しても、内容に応じて文字色を変えることができるようになる。

#環境
Android Studio 1.4.1
Min SDK Version : API 16 (Android 4.1 (Jelly Bean))
Compile/Target SDK Version : API 23 : (Android 6.0 (Marshmallow))
テストした実機 : Xperia Z3 Compact (Android 5.1.1 (Lollipop))

#ソース
**Spinnerに自作Adapterを渡す**

```java:Java
//** Spinnerで表示するデータ例 **//
String[] strings = { "aaa", "bbb", "ccc" };
int[] colors = { Color.RED, Color.BLUE, Color.YELLOW };

CustomAdapter customAdapter = new CustomAdapter( getApplicationContext(), android.R.layout.simple_spinner_dropdown_item, strings, colors );

Spinner spinner = (Spinner)findViewById(R.id.spinner);
spinner.setAdapter( customAdapter );
```

**CustomAdapterを作る**

```java:Java
public class CustomAdapter extends ArrayAdapter<String> {

    int[] colors;

    public CustomAdapter( Context context, int resource, String[] strings, int[] colors ) {

        super( context, resource, strings );
        this.colors = colors;
    }


    @Override
    public View getDropDownView( int position, View convertView, ViewGroup parent ) {

        if( convertView == null ) {
            LayoutInflater inflater = LayoutInflater.from( getContext() );
            convertView = inflater.inflate( android.R.layout.simple_spinner_dropdown_item, parent, false );
            //** android.R.layout.simple_spinner_dropdown_item で inflate **//
        }

        this.setCustomTextView( (TextView) convertView, position );

        return convertView;
    }


    @Override
    public View getView( int position, View convertView, ViewGroup parent ) {

        if( convertView == null ) {
            LayoutInflater inflater = LayoutInflater.from( getContext() );
            convertView = inflater.inflate( android.R.layout.simple_spinner_item, parent, false );
            //** android.R.layout.sinple_spinner_item で inflate **//
        }

        this.setCustomTextView( (TextView) convertView, position );

        return convertView;
    }


    //** Spinnerの中身のTextViewを作る **//
    private void setCustomTextView( TextView textView, int position ) {

        textView.setText( super.getItem( position ) );
        textView.setTextColor( colors[position] );
    }
}
```

#あとがき
参考にさせて頂きました : [androidのSpinnerの文字色を変えるのが難しい件](http://www.synapse.ne.jp/anko/spinner.html)

このサイト様のままだとドロップダウンのレイアウトが崩れてしまったので、`ArrayAdapter`のソースを読んで改造しました。
`LayoutInflater.from()`とか`inflater.inflate()`の`parent`とか良く分かってないけど上手くいったからいいよね。

これをさらに改造していろいろなことができそう。
Elixir: for vs Enum vs 再帰

# 概要

再帰使った方が関数型言語らしくみえるし、```for``` より```Enum```の方が最近の言語らしい。
ループをきれいに書くには？

# list の要素を表示

まずは単純なもの。```Enum``` が短い。

```ex:list
IO.puts "for"
for x <- [1, 2, 3] do
  IO.puts x
end

IO.puts "Enum"
Enum.map([1, 2, 3], &IO.puts(&1))

IO.puts "recursion"
defmodule Sample do
  def show([x|tl]) do
    IO.puts x
    show(tl)
  end

  def show([]) do
    # noop
  end
end

Sample.show [1, 2, 3]
```

# 二重ループ

２つのリストの全組み合わせを表示するループ。
```for``` が短い。
再帰が汚い。。。

```ex:double_loop
IO.puts "for"
for x <- [1, 2, 3],
    y <- [4, 5, 6] do
  IO.inspect {x , y}
end

IO.puts "Enum"
Enum.map([1, 2, 3],
  fn x ->
    Enum.map([4, 5, 6], &IO.inspect {x, &1})
  end)

IO.puts "recursion"
defmodule Sample do
  def show([x|tl], y) do
    show(x, y)
    show(tl, y)
  end

  def show([], _) do
    # noop
  end

  def show(x, [y|tl]) do
    IO.inspect {x, y}
    show(x, tl)
  end

  def show(_, []) do
    # noop
  end
end

Sample.show [1, 2, 3], [4, 5, 6]
```
# 条件付き２重ループ

```x < y``` となる組み合わせを表示するループ。
```for```は filter を使いました。
再帰はあえて guard を使ってみました。
```Enum``` は汚く。。。

```ex:double_loop_and_conditional
IO.puts "for"
for x <- 1..3,
    y <- 1..3,
    x < y do
  IO.inspect {x , y}
end

IO.puts "Enum"
Enum.map(1..3,
  fn x ->
    Enum.map(1..3,
      fn y ->
        if x < y do
          IO.inspect {x, y}
        end
      end)
  end)

IO.puts "recursion"
defmodule Sample do
  def show([x|tl], y) do
    show(x, y)
    show(tl, y)
  end

  def show([], _) do
    # noop
  end

  def show(x, [y|tl]) when x < y do
    IO.inspect {x, y}
    show(x, tl)
  end

  def show(x, [y|tl]) do
    show(x, tl)
  end

  def show(_, []) do
    # noop
  end
end

Sample.show Enum.to_list(1..3), Enum.to_list(1..3)
```

# 最後に

```for``` 最強！

ではなく、あきらかに経験不足だと思います。
パイプとか高階関数とか使うと綺麗に書けるのかもしれません。

```Enum``` 的なもので次のように書けるものを作るといいのかもしれません。

```ex:ExEnum
ExEnum.map([1,2,3], [1,2,3], &IO.inspect({&1, &2})
ExEnum.map([[1,2,3], [1,2,3]], &IO.inspect({&1, &2})
```

また、当然状況によって使い分ける必要もあると思います。
経験積んで良い書き方が分かってきたら更新します。

# 追記

@antimon2 さんに [順列組合せの関数を使った回答例](http://qiita.com/antimon2/items/bd4c3c2f6bd02654fe10) を書いていただけました。
順列組合せの関数があればさくっと書けるレベルだと思いますが、順列組合せの関数から作っていただいているので、すごく勉強になります。
最後のは組合せを狙ったわけではなかったのですが、条件を見て簡潔な関数を選ぶところも参考になりました。
history.pushState対応をブラウザ判定に使うと危険

新しく作ったIE9以下に対応していないサイトで、IE9以下をはじくために

```html:HTML
<script>if(!history.pushState) location.replace("/legacy.html")</script>
```

みたいな感じで、legacy.htmlに飛ばすコードを全てのページに書いていたところ、Googleの検索結果が全てのページでlegacy.htmlの内容になってしまい、意図したキーワードで検索にヒットしなくなりました。
googlebot?はhistory.pushState非対応のようで注意が必要だというお話でした。

こういう場合、素直に以下のようなコードにしましょう！

```html:HTML
<!--[if lte IE 9]>"}}<script>location.replace("/legacy.html")</script>
```
【第５回】Swiftアプリ開発チュートリアル -Food Tracker- のお供に（Define Your Data Model 編）


# はじめに

AppleのSwiftアプリ開発チュートリアルを進めていて出てきた関数やクラスなどについて、調べたことを残していきます。
チュートリアルを進めながら、**ざっくりと**どういうものかを把握するためのお供になればと思います。

初学者のため、間違い等あればご指摘ください。 :bow: 

第１回：[Swiftアプリ開発チュートリアル -Food Tracker- のお供に（Build a Basic UI 編）](http://qiita.com/taji-taji/items/9202d944bf403957a22e)
第２回：[Swiftアプリ開発チュートリアル -Food Tracker- のお供に（Connect the UI to Code 編）](http://qiita.com/taji-taji/items/da3b800914fa3313d5a8)
第３回：[Swiftアプリ開発チュートリアル -Food Tracker- のお供に（Work with View Controllers 編）](http://qiita.com/taji-taji/items/a3a103b949bb7694c8b3)
第４回：[Swiftアプリ開発チュートリアル -Food Tracker- のお供に（Implement a Custom Control 編）](http://qiita.com/taji-taji/items/1ca474a4c2d2b4d779db)
第５回：Swiftアプリ開発チュートリアル -Food Tracker- のお供に（Define Your Data Model 編）←今回はここ

# チュートリアルページ
https://developer.apple.com/library/prerelease/ios/referencelibrary/GettingStarted/DevelopiOSAppsSwift/Lesson2.html#//apple_ref/doc/uid/TP40015214-CH5-SW1

以下のような構成でレッスンが進んでいくので、それに沿って進めていきます。

- Building the UI
 - Build a Basic UI
 - Connect the UI to Code
 - Work with View Controllers
 - Implement a Custom Control
 - **Define Your Data Model**（今回はここ）
- Working with Table Views
 - Create a Table View
 - Implement Navigation
 - Implement Edit and Delete Behavior
 - Persist Data


# Define Your Data Model

今回は以下のレッスンで出てきたものについて見ていきます。

https://developer.apple.com/library/prerelease/ios/referencelibrary/GettingStarted/DevelopiOSAppsSwift/Lesson6.html#//apple_ref/doc/uid/TP40015214-CH20-SW1

## ■ isEmpty

チュートリアルでは`String`型のプロパティとして登場しており、文字列が空のときに`true`を返す。
同様のプロパティは辞書型や配列型でも定義されている。

### チュートリアルでの使用例

```swift:Meal.swift
if name.isEmpty || rating < 0 {
    return nil
}
```

### ドキュメント

- 公式  
https://developer.apple.com/library/prerelease/ios/documentation/Swift/Reference/Swift_String_Structure/#//apple_ref/swift/structp/String/s:vSS7isEmptySb


## ■ XCTAssertNotNil()

Xcodeのテストフレームワーク「XCTest」にて用いる。
引数に与える値が`nil`でないことをテストする際の関数。

### チュートリアルでの使用例

```swift:FoodTrackerSampleTests.swift
// Success case.
let potentialItem = Meal(name: "Newest meal", photo: nil, rating: 5)
XCTAssertNotNil(potentialItem)
```


## ■ XCTAssertNil()

Xcodeのテストフレームワーク「XCTest」にて用いる。
引数に与える値が`nil`であることをテストする際の関数。

### チュートリアルでの使用例

```swift:FoodTrackerSampleTests.swift
// Failure cases.
let noName = Meal(name: "", photo: nil, rating: 0)
XCTAssertNil(noName, "Empty name is invalid")
    
let badRating = Meal(name: "Really bad rating", photo: nil, rating: -1)
XCTAssertNil(badRating, "Negative ratings are invalid, be positive")
```
Reactとは

# Reactとは

- UI開発用JavaScriptライブラリ
- not フレームワーク
- View用のコンポーネント


## キーワード
- Flux
    - ページ下部に記述
- JUST THE UI
    - React.jsはComponentを作るためのライブラリ 
- VIRTUAL DOM
	- バックエンドにあるDOM構造を抽象化したデータ構造
	- rerenderされるときに、その構造体の前後の状態を比較し、差分更新でDOMに反映
	- 必要最低限のDOMしか更新されないので高速に処理する
	
- DATA FLOW
	- ステートレスコンポーネント
		- Stateは親がもつ
		- 子にはPropsで渡す
		- Propsは不変で子はStateを持たない
	- コンポーネントのI/F: PropsとState
- State
- Props
- JSX
	- 
- Immutable.js
	- Immutableなデータ構造を提供するライブラリ

## Flux

- アーキテクチャ
- observerパターン
- Reactとは疎結合
- データフローは常に一方向


![flux-diagram.png](https://atlas-dev.qiita.com/files/0b6b7a91-cd92-4f01-4419-eea7305a58ca.png "flux-diagram.png")

- Action
	- トリガーされたイベントに応じてデータを構築し、Dispatherへ

- Dispatcher
	- Actionから命令とデータを受け取り、命令に沿って配送先へデータを配信する
- Store
	- データを命令に合わせて操作する
	- Storeは複数のViewへデータを配送することがある
- View
	- Storeが更新されるとデータがViewにくる
	- Reactはデータに従いDOMを差分更新する
	- Viewはイベントに応じてActionを発行できる
csharp > difference > Ordinal IgnoreCase / InvariantCulture IgnoreCase > 比較例 / Orderの例

[Qiitaのコメント](http://qiita.com/7of9/items/e0b87c05bc4f0bcee659#comment-caec9342bcd6a3781e35)にて教えてもらった Ordinal と Culture についてStackOverflowで見つけた。

http://stackoverflow.com/questions/492799/difference-between-invariantculture-and-ordinal-string-comparison

上記リンクからの抜粋。
> There's a great sample at http://msdn.microsoft.com/en-us/library/e6883c06.aspx that shows the results of the various StringComparison values.

また、Eugene Beresovskyの回答で色々な場合のOrderの例があってわかりやすい。

CurrentCulture と InvariantCulture などの違いは今後。
Relationship between concurrency and relativity

The first time I realized that **concurrency** and **relativity** is related to each other was when reading the book [SICP](https://mitpress.mit.edu/sicp/full-text/sicp/book/node68.html). It mentioned that 

> The basic phenomenon here is that synchronizing different processes, establishing shared state, or imposing an order on events requires communication among the processes. In essence, any notion of time in concurrency control must be intimately tied to communication. **It is intriguing that a similar connection between time and communication also arises in the Theory of Relativity, where the speed of light (the fastest signal that can be used to synchronize events) is a fundamental constant relating time and space.** The complexities we encounter in dealing with time and state in our computational models may in fact mirror a fundamental complexity of the physical universe. 

For **concurrency**, the basic problem is **synchronization**, that is, we need to know which event happens first. If we can't get such a relationship, we say that the events happen concurrently.

Let's take [amazon's dynamo](http://www.allthingsdistributed.com/files/amazon-dynamo-sosp2007.pdf) as an example. 

First, we execute `put key1 value1` on server1. **Before** this update is synchronized to server2, we execute `put key1 value2` on server2. After the above two operations, we need to achieve eventual consistency by synchronizing the value associated with `key1`. Since we don't have a **causal** relationship between the two update operations, we have no idea which value is the final value for `key1`.

You can think of this as [**space-like**](https://en.wikipedia.org/wiki/Spacetime#Space-like_interval) events in relativity theory. 

The [**spacetime intervals**](https://en.wikipedia.org/wiki/Spacetime#Basic_concepts) is defined as:

$$
s^{2} = \Delta r^{2} - c^{2} \Delta t^{2}.
$$

where $c$ is speed of light.

Space-like events have a positive spacetime interval, that is

```math

c^{2} \Delta t^{2} < \Delta r^{2} \\ s^{2} > 0

```

The above equation means, for space-like events, it's impossible to get a causal relationship by crossing the spatial distance at the speed of light.

For example, given a reference frame, Jack rolled a dice at coordinate $(x_1,x_2,x_3,t_1)$ while Sam rolled a dice at coordinate $(y_1,y_2,y_3,t_2)$. Then

```math
\Delta t^{2} = (t_2-t_1)^2 \\
\Delta r^{2} = \sum_{i=1}^{3} (x_i - y_i) ^2
```
Jack and Sam agreed that when rolling the dice, they would also send a message to each other **at the same time**. If someone received the message before rolling the dice, he would know the other people rolled the dice **first**.

If $c \Delta t^2 < \Delta r^2 $, then even if Jack and Sam could communicate with each other at speed of light, they couldn't get a causal relationship for the events since both of them would receive the message after rolling the dice.
atomでreact勉強しようと思ったらJSXにlinter-jshint氏ブチ切れ問題


linter-jshint使ってたらこうなる。
![Screenshot 2015-11-02 03.27.46.png](https://qiita-image-store.s3.amazonaws.com/0/28464/f171041a-bd31-50a8-fe34-d9f2e08b022c.png "Screenshot 2015-11-02 03.27.46.png")

つらい

# 全くもって根本的ではない対策
おもむろにlinter-jshintをdisableする。
![Screenshot 2015-11-02 03.06.01.png](https://qiita-image-store.s3.amazonaws.com/0/28464/eb3620cf-5062-592a-11f7-cc0f795d4d07.png "Screenshot 2015-11-02 03.06.01.png")

jshintをインストール。
![Screenshot 2015-11-02 03.23.27.png](https://qiita-image-store.s3.amazonaws.com/0/28464/61fd2ee6-3247-4af7-34ba-fd8c359c9da7.png "Screenshot 2015-11-02 03.23.27.png")


コマンドラインでやる場合は以下。

```
$ atom install jshint
```

jshintの"Support Linting JSX"にチェックを入れる。
![Screenshot 2015-11-02 03.14.43.png](https://qiita-image-store.s3.amazonaws.com/0/28464/8ece326c-af88-2746-0c96-71d742bb9aaa.png "Screenshot 2015-11-02 03.14.43.png")

ちゃんとJSXを認識する。
![Screenshot 2015-11-02 03.26.35.png](https://qiita-image-store.s3.amazonaws.com/0/28464/a3dc39f8-5d4a-be95-247c-f0a0c64dd331.png "Screenshot 2015-11-02 03.26.35.png")

めでたい。

# linter使ってないじゃん

linter-jsxhintを使おうとしたけど使い方分かんなくて、全く怒ってくれなかった。
![Screenshot 2015-11-02 03.26.14.png](https://qiita-image-store.s3.amazonaws.com/0/28464/f3056570-9709-8b70-51c3-301e157d1cde.png "Screenshot 2015-11-02 03.26.14.png")

そのうちちゃんと調べたい。
Kinect v2のパフォーマンスを上げる方法

Kinect v2を使ってコードを書いている時、ColorFrameをDepthFrameにMapすると1920*1080だけループを回す必要になったりするが、非常にパフォーマンスに影響を与えてしまう。
これは、Debugビルドだと最適化がなされないためである。
プロジェクトの設定から、最適化オプションをいじるとパフォーマンスが向上するので、一度確認するべきである。

具体的には、Releaseビルドに構成プロパティを変更すればよい。
Releaseビルドにできない場合は、

`「プロジェクトのプロパティ」→「構成プロパティ」→「C/C++」→「最適化」`

から変更可能。
その際に他のプロパティも変更しないとビルドが通らなくなる。
また、その変更に伴いステップ実行などができなくなる場合がある。