OmniAICreator/Qiita-1.07M huggingface dataset:
フォルダを圧縮して自動バックアップするスクリプト

##シェルスクリプトを作成

```
vim images_backup.sh
```

#####images_backup.sh
```
#!/bin/sh

# バックアップファイルを何日分残しておくか
period='+7'
# バックアップファイルを保存するディレクトリ
dirpath='/path/to/backup/images'

#バックアップ元フォルダ
backupfolder="/path/to/from"

# ファイル名を定義(※ファイル名で日付がわかるようにしておきます)
mydate=`date +%y%m%d%H%M%S`
filename="images_$mydate.tar.gz"
#backup実行
tar -zcvf $dirpath/$filename $backupfolder

# パーミッション変更
chmod 700 $dirpath/$filename

# 古いバックアップファイルを削除
find $dirpath -type f -daystart -mtime $period -exec rm {} \;
```

##権限設定の変更

```
chmod 700 images_backup.sh
```
epel、remiのリポジトリを導入

##epel

###ダウンロードサイトから最新版を取得
####URL:
- [http://dl.fedoraproject.org/pub/epel/6/x86_64/](http://dl.fedoraproject.org/pub/epel/6/x86_64/)


※ epel-releaseで検索する(執筆時点では、epel-release-6-8.noarch.rpm)

```
wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm


rpm -Uvh epel-release-6-8.noarch.rpm
```

設定ファイルを変更

```
cp /etc/yum.repos.d/epel.repo /etc/yum.repos.d/epel.repo.org
vim /etc/yum.repos.d/epel.repo
```

##### /etc/yum.repos.d/epel.repo
```
enabled=0

# enabled=0で利用する
```

##remi

###ダウンロードサイトから最新版を取得
####URL:
- [http://rpms.famillecollet.com/](http://rpms.famillecollet.com/)



※centosで検索

```
wget http://rpms.famillecollet.com/enterprise/remi-release-6.rpm


rpm -Uvh remi-release-6.rpm

```
remiはデフォルトで設定がenabled=0なので設定ファイルは変更しない

```
sudo vim /etc/yum.repos.d/remi-safe.repo

# enabled=0で利用する
```
Zshのインストール

###参考サイト
- [Linuxで自宅サーバ構築 » Linux » ZSHのインストール](http://linuxserver.jp/linux/zsh%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB.php)

### zshがインストールされているかを確認

```
zsh --version

```

### yumでzshをインストール

```
sudo yum -y install zsh

```

##  zshの起動とログイン・シェルの設定

### 現在使用しているshellの確認
```
echo $SHELL

```

### 使用可能なshellの確認
```
cat /etc/shells

```

### ログイン・シェルに設定
```
chsh -s /bin/zsh

```

##zshの設定をgithubから取得して反映する

```
git clone https://github.com/abgata20000/zsh.d.git ~/.zsh.d
echo "source ~/.zsh.d/zshrc" > ~/.zshrc
echo "source ~/.zsh.d/zshenv" > ~/.zshenv

```

ログインし直すと反映される
※ユーザー毎に設定
Entity FrameworkでSQLiteのCodeFirstを利用する

細々としたプログラム書くのに使えたら便利なのにとか思いながらいろいろ調べつつ試行錯誤してました。

環境・テーブル構造・フォームのコードについては[EntityFramework6で単純なデータ表示フォームを作成](http://qiita.com/keidrumfreak/items/15fc7217817c7f8b01b3)と同じ。
Entityクラスについては[Entity FrameworkでPostgreSQLに接続する](http://qiita.com/keidrumfreak/items/48df731391174f99b828)と同じものを流用。

ちなみに今回はデータベースについては予め用意したものではなく、CodeFirstによって生成しています。

###パッケージインストール
NugetよりSQLite.CodeFirstをインストール。
依存関係は全部引っ張ってきてくれます。~~ものぐさ万歳。~~

###App.configの編集
`<configration>`セクション内に以下を追記。
今回はローカルファイルへの接続。サーバー接続の場合は別の書式が必要かもしれません。

```xml:App.condig
  <entityFramework>
    ~~~
    <providers>
      ~~~
      <provider invariantName="System.Data.SQLite"
        type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />
    </providers>
  </entityFramework>
  <connectionStrings>
    <add name="musicGame"
      connectionString="Data Source=db.sqlite;"
      providerName="System.Data.SQLite.EF6"/>
  </connectionStrings>
```

###コンテキストクラスの作成

```csharp:MusicGameData.cs
using SQLite.CodeFirst;
using System.Data.Entity;

namespace SQLite_CodetoDB
{
    class MusicGameData : DbContext
    {
        public MusicGameData()
            : base("name=musicGame")
        {
        }

        public DbSet<Model> Models { get; set; }
        public DbSet<Title> Titles { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            var sqliteConnectionInitializer = new SqliteCreateDatabaseIfNotExists<MusicGameData>(modelBuilder);
            Database.SetInitializer(sqliteConnectionInitializer);
        }
    }
}
```

これで以前のコードを用いてデータのINSERT、及びSELECTが可能なことを確認しました。
Xcodeでオブジェクトを前面・背面に移動する


# これは何

Xcode の Storyboard 上でオブジェクトを前面移動・背面移動する方法のメモです。

![image](https://qiita-image-store.s3.amazonaws.com/0/8292/d83d3342-bdd2-b9bd-396c-4446a728a875.png)

青いViewを赤いViewの上に移動したかったのです。

![image](https://qiita-image-store.s3.amazonaws.com/0/8292/f87a7e5d-5d14-6779-5e4b-2da53e2a5a5c.png)

Stack Overflowで調べたら、すぐに出てきました。

[xcode - IPhone Interface Builder: Z-Index, Z-order of a button, image, ui element, etc? - Stack Overflow](http://stackoverflow.com/questions/2276116/iphone-interface-builder-z-index-z-order-of-a-button-image-ui-element-etc)

いくつか方法があるようですが、ここでは一番Vote数が高かった方法を選択しました。

## 環境

Xcode Version 6.4 (6E35b)

# やりかた

Document Outline から移動したいオブジェクトを選択します。（Document Outline が表示されていない場合は、Xcode メニューの Editor > Show Document Outline で表示します）

![OutlineView_2x.png](https://qiita-image-store.s3.amazonaws.com/0/8292/bd5a71f1-55b3-c576-d61e-ebe830e96c9f.png)

選択する際、<b>シングルクリックではなく、ダブルクリックで選択しないとダメ</b>なようです。

この状態で Xcode メニューの Editor > Arrange を選択します。

![スクリーンショット 2015-09-07 16.12.40.png](https://qiita-image-store.s3.amazonaws.com/0/8292/6fe2f8c7-2a06-33b2-1c0d-682a18c0656b.png)

* 「Send to Front」で最前面へ
* 「Send to Back」で最背面へ
* 「Send Forward」で一つ前面へ
* 「Send Backward」で一つ背面へ

移動できました。
vue.js props にオブジェクトを渡した時、子で中身を変更すると親でもそれが反映される挙動をなんとかしたいとき

タイトルが長い！

vue.js での props のバインディングでは、下記のURLにある通り、オブジェクトを渡した場合は参照渡しとなるので、結果的に、子で中身を変更すると、親でもそれが反映されてしまいます。

http://jp.vuejs.org/guide/components.html#Props_のバインディングタイプ

> もし、渡される prop がオブジェクトまたは配列ならば、それは参照で渡されることに注意してください。オブジェクトの変更または配列は、使用しているバインディングのタイプに関係なく、子の内部それ自身は、親の状態に影響を与えます。

この挙動が困る場合、下記のような clone フィルタを作り、それを介して prop に渡すことで、one-way バインディングのような挙動にすることができます。

```js
var _ = require('lodash');

Vue.filter('clone', function (value) {
  return _.cloneDeep(value);
});
```

```html
<my-component my-object="{{myObject | clone}}"></my-component>
```

が、cloneDeep を使う以上、スペックを気にする必要がありそうです。
……どなたか「中身を一個ずつ渡す」以外にいいやり方ご存知でしたら教えて下さい。
コマンドライン（バッチファイル）から明示的に UAC 昇格する一番短い方法

* 2018.01.19 追記：もっと短い方法がありました
    * [管理者権限でbatを実行したい時にやッた事](https://qiita.com/resolver/items/7187bd6ee8016ee5c741)

-------

今まで [VB.Net](https://github.com/zetamatta/wouldyou) で書いたり、[バッチファイル＋JScript](https://gist.github.com/zetamatta/6148dc1aecdc78d83add) を書いたり、いろいろ考えてきたけど、PowerShell ならワンライナーで出来たー

```
powershell "$obj=New-Object -Com Shell.Application ; $obj.ShellExecute('cmd.exe','/k dir','','runas')"
```

なお、これは COM を使っているんだけど、本来は .NET 方面のオブジェクトを使った方がいいんでしょうね
[memo] sudo の環境変数

`.bashrc` なんかに

```.bashrc
alias y='yum'
```

と書いてやっても、

```
sudo y install emacs
```

は「y なんて command は知らないよ」という error を出す。sudo を使うと環境変数が引き継がれないのだ。`sudo` には `-E` option があるが、これを使ってもうまくゆかない。

http://stackoverflow.com/questions/8633461/how-to-keep-environment-variables-when-using-sudo

に答があるようなので、後で読む。

# 解決編

……と思ったが、 alias は環境変数ではないというのが答だった。 ailas を引き継ぐには、

```.bashrc
alias sudo='sudo '
```

と書いてやる。末尾の space が味噌。こう書くと、alias が引き継がれる。[heliac2000](http://qiita.com/heliac2000) さんに教えていただいた。ありがとうございます。
普通のPaginationパッケージ作った

ごく普通の**[Paginationパッケージ](https://github.com/TuumPHP/Pagination)**を作ったので、Qiitaで公開してみます。フレームワークやORMと密結合していない、オフセットとリミットを使うことを想定したページネーション用パッケージです。

特徴は、

* ページ番号などをセッションに保存して、使い勝手を向上、
* HTMLの生成オブジェクトを使って、柔軟性をもたせている。
* PSR-7オブジェクトも使える、

といったところです。
ライセンスなどについてはGitHub参照してもらって…

> 何故作ったのかというと、Doctrine2を単独で使うプロジェクトがあったのですが、独立して使いやすいページネーションライブラリが見つからなかったからです。昔作ったコードを引っ張りだして作りなおしました。肝心のプロジェクトには間に合わなかったので、いまだ実際に使ったことのないパッケージなので注意して下さい。まだアルファ状態です。

簡単な使い方
-----

### HTMLフォーム

こんなフォームを作って下さい。無くてもOKです。

```html
<form action="find">
  <input type="text" name="type" />
  <input type="integer" name="num" />
  <input type="submit" />
</form>
```

ただし、`_page`という変数は使わないで下さい。

### `Pagination`オブジェクト

`Pagination`というオブジェクトで、フォームからの入力からSQLなどを操作します。

```php
use Tuum\Pagination\Inputs;
use Tuum\Pagination\Pagination;

$pages = Pagination::forge()->call(
    $request, // PSR-7 ServerRequestInterface object
    function(Inputs $inputs) use($pdo) {
        // sample query using PDO
        $found = $pdo->prepare("SELECT * FROM tbl WHERE type=? and num>? OFFSET ? LIMIT ?")
            ->execute([
                $inputs->get('type'),
                $inputs->get('num'),
                $inputs->getOffset(),
                $inputs->getLimit(),
            ])
            ->fetchAll();
        $inputs->setList($found);
    });
$found = $pages->getList();
$type  = $pages->get('type');
```

クロージャーを渡しておいて、その中でPDOやORMを操作してもらう形になります。オフセットとリミット、あるいはフォームからの入力は`Inputs`オブジェクトから読み出します。結果も`Inputs`オブジェクトに突っ込んで、後で読み出します。

フォームの入力やページ番号はセッションに保存され、この後のリクエストに備えます。なお、**セッションに保存するのは`_page`変数が存在しない場合のみです。**

### ページ番号指定

`_page`変数を使ってページ番号を指定します。

```
GET /find?_page=2
```

最初と同じコードが走りますが、フォーム入力はセッションから読み出します。オフセットだけ、ページ番号から計算した値を渡します。

### ページ番号未指定

`_page`変数は渡しますが、ページ番号を未指定にします。

```
GET /find?_page
```

すると、ページ番号も含めて全ての変数をセッションから読み出します。最後のページと同じ条件でクエリを走らせることが出来ます。


HTMLの生成方法
-----

`Pagination`オブジェクトではデフォルトで、Bootstrap3用のHTMLを生成します。

```php
echo $pages->__toString();
```

![ページネーションHTMLサンプル](https://qiita-image-store.s3.amazonaws.com/0/31171/01772dfd-4b1e-41aa-ea0c-0f583b1576cd.jpeg)

それ以外のHTMLを作りたい場合は、`PaginateInterface`あるいは`ToHtmlInterface`を実装したオブジェクトを使って下さい。

```php
use Tuum\Pagination\Paginate\PaginateInterface;
use Tuum\Pagination\ToHtml\ToHtmlInterface;

class MyPaginationClass implements PaginateInterface {...}
class MyToHtmlClass implements ToHtmlInterface {...}

$pages = Pagination::forge(
   new MyPaginationClass,
   new MyToHtmlClass
);
```

*  `PaginationInterface`は、ページネーション用の配列を作ります。
*  その配列を受け取って、HTMLに変換するのが`ToHtmlInterface`になります。
*  実装方法は、GitHubとソースを読んで…お願いします。


今後の予定
-----

### テストを増やす

テストのカバー率をもう少しあげたいです。さらに実際のプロジェクトに使ってみて、使い勝手やバグ出しが必要と思ってます。


### セッションとの密結合

セッションを使ってるのが前提で動いてます。ので、セッションがない場合への対応が必要と思ってます。
SolrのmultiValuedなFieldにPHPから値をいれる

PHPからsolrのmultiValuedなFieldに値を追加する方法です。

solr schema.xmlの設定の一部はこんな感じ。

```schema.xml
...
<field name="multi_no" type="int" indexed="true" multiValued="true"/>
...
```

----

当初は↓のように、

```php
$multiNos = array();
$multiModels = $this->getMultiModel($id);
foreach ($multiModels as $multiModel) {
    $multiNos[] = $multiModel->multi_no;
}

$doc = new SolrInputDocument();
$doc->addField('multi_no', $multiNos);

```

単にarrayを突っ込めばいけるのかと思ってました。
しかしそれではダメで、

```php
$multiNos = array();
$multiModels = $this->getMultiModel($id);
foreach ($multiModels as $multiModel) {
    $multiNos[] = $multiModel->multi_no;
}

$doc = new SolrInputDocument();
foreach ($multiNos as $multiNo) {
    $doc->addField('multi_no', $multiNo);
}
```

↑のようにforeachで回すんですね。
知らんかった。
gomでginをrunする

gomはgoのパッケージをgemっぽく管理できるやつ

プロジェクトのカレントディレクトに行き、まずgomを入れる。

```
$ go get github.com/mattn/gom
```

んでGomfileをつくる。

```
$ gom gen gomfile
```

ファイルの中身はこんな感じ

```
$ gom 'github.com/gin-gonic/gin' 
```

パッケージは予めinstallする必要があります

```
$ gom install
```

こうすると`_vendor`ディレクトにginがインストールされます。

で、main.goをとりあえずginのサンプルどおり作ってみます。

``` main.go
func main() {
    router := gin.Default()

    // This handler will match /user/john but will not match neither /user/ or /user
    router.GET("/user/:name", func(c *gin.Context) {
        name := c.Param("name")
        c.String(http.StatusOK, "Hello %s", name)
    })

    // However, this one will match /user/john/ and also /user/john/send
    // If no other routers match /user/john, it will redirect to /user/join/
    router.GET("/user/:name/*action", func(c *gin.Context) {
        name := c.Param("name")
        action := c.Param("action")
        message := name + " is " + action
        c.String(http.StatusOK, message)
    })

    router.Run(":8080")
}
```

それでは実行してみましょう。`_vendor`ディレクトを有効にするためにgomコマンドを使って実行します。

```
$ gom run main.go
[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
 - using env:	export GIN_MODE=release
 - using code:	gin.SetMode(gin.ReleaseMode)

[GIN-debug] GET   /user/:name               --> main.main.func1 (3 handlers)
[GIN-debug] GET   /user/:name/*action       --> main.main.func2 (3 handlers)
[GIN-debug] Listening and serving HTTP on :8080
```

こんな感じで実行されブラウザから http://localhost:8080/user/oresama 等と打てば動作確認できると思います。
AndroidStudioでdemoを取り込む方法

##課題
AndroidStudioで用意されているdemoを取り込みたい。

##手順
1.まずSDKの場所を特定する
file->ProjectStructureの**Android SDK  Location**のパスをコピー

2.importする
file->New->**ImportProject** パスを入力する所に先程のパスを貼り付け

3.ファイルを探す
sdkフォルダの下の**samples**を開き、該当のandroidを選択後、該当のdemoを選択

これでいろんな機能を試せると思います。
楽しみ！
Selenium（Geb）でChromeの拡張機能を使用する

`FireMobileSimulator` を例にしてますが他の拡張機能でも手順は同じです。
> **FireMobileSimulator for Google Chrome**
https://chrome.google.com/webstore/detail/firemobilesimulator-for-g/mkihbloiacgiofaejgagokalpeflnmbe


# まず、拡張機能をパッケージ化（*.crx）する

拡張機能がインストールされているフォルダを特定する

```:OSXの場合
~/Library/Application\ Support/Google/Chrome/Default/Extensions
```

Chromeのアドレスバーに下記を入力して拡張機能画面を表示

```
chrome://extensions/
```

画面右上の `デベロッパーモード` チェックをONにすると各拡張機能のIDが表示されるので、FireMobileSimulatorのID（*mkihbloiacgiofaejgagokalpeflnmbe*）を覚えておく

`拡張機能のパッケージ化...` ボタンを押下

拡張機能のルート ディレクトリで、FireMobileSimulatorがインストールされたディレクトリを選択し `拡張機能のパッケージ化` ボタンを押下

```
拡張機能のルート ディレクトリ: /Users/<ユーザ名>/Library/Application Support/Google/Chrome/Default/Extensions/mkihbloiacgiofaejgagokalpeflnmbe/<バージョン名>
秘密鍵ファイル（省略可能）: 空欄
```

しばらくすると `*.crx` が作成される


# 続いて、拡張機能の設定ファイルを取得する

拡張機能で必要なオプション設定があれば済ませておく
（ex. FireMobileSimulatorの場合は端末登録やUIDの設定など）

拡張機能の設定は下記ファイルに保存される

```
~/Library/Application\ Support/Google/Chrome/Default/Local\ Storage/chrome-extension_mkihbloiacgiofaejgagokalpeflnmbe_0.localstorage
```


# Gebでブラウザ起動時に拡張機能をロードする

さて実際にGebで拡張機能をロードする方法ですが、下記の手順で行います。

1. 一時的に使用する`Chrome Profile`フォルダを作成（システムのTempフォルダに作成）
2. 作成したProfileフォルダに`localstorage`ファイルをコピー
3. ChromeOptionsの`addExtensions`に拡張機能をセット
4. ChromeOptionsの`addArguments `にProfileのパスをセット
5. ChromeOptionsを指定してChromeDriverを生成

※あらかじめソースコードの下記ディレクトリに `*.crx` と `*.localstorage` を格納しておくこと

```:/extension/chrome
 chrome-extension_mkihbloiacgiofaejgagokalpeflnmbe_0.localstorage
 firemobilesimulator.crx
```

GebConfig.groovyに記載する場合のサンプルは以下の通りです。

```groovy:/src/test/resources/GebConfig.groovy
...省略...

environments {
  'mobile' {
    driver = {
      ChromeOptions options = new ChromeOptions()
      String extensionId = "mkihbloiacgiofaejgagokalpeflnmbe"
      String extensionName = "firemobilesimulator.crx"
      String extensionDir = System.getProperty("user.dir") + "/extension/chrome"

      // 一時ディレクトリにProfile用のフォルダを作成
      String profilePath = System.getProperty("java.io.tmpdir") + "/chrome-profile"
      String localstoragePath = profilePath + "/Default/Local Storage"
      new File(localstoragePath).mkdirs()
      println "ProfileDir: " + profilePath

      // コピー元のlocalstorageパス
      String localstrageName = "chrome-extension_" + extensionId + "_0.localstorage"
      Path sourcePath = Paths.get(extensionDir + "/" + localstrageName)

      // コピー先のlocalstorageパス
      Path targetPath = Paths.get(localstoragePath + "/" + localstrageName)

      // localstorageをProfileフォルダにコピー
      Files.copy(sourcePath, targetPath, StandardCopyOption.REPLACE_EXISTING)

      // 拡張機能とProfileディレクトリの設定
      File extension = new File(extensionDir + "/" + extensionName)
      options.addExtensions(extension)
      options.addArguments("user-data-dir=" + profilePath)

      // Driverを生成
      DesiredCapabilities capabilities = DesiredCapabilities.chrome()
      capabilities.setCapability(ChromeOptions.CAPABILITY, options)
      chromeDriver = new ChromeDriver(capabilities)
      BrowserInstance.instance.driver = chromeDriver
      return chromeDriver
    }
  }
}

...省略...
```
Qiitaのマイページにある円グラフを大きくする

マウスポインタを拡大したい部分とその外へ高速で出したり入れたり、オラオラオラオラオラ〜とやると大きくなります。

![スクリーンショット 2015-09-07 14.28.16.png](https://qiita-image-store.s3.amazonaws.com/0/32383/4b643b01-1a1b-6a7a-1717-3e6c45f3a502.png)
mysqlのinnodbのテーブルごとのレコード数を正確に出したい

# やりたいこと
mysql では大抵エンジンは **innodb** を使うと思いますが、、、
`show table status` や `schema_infomation.tablesのtable_rows` の件数が概算値となりブレてよくわからなくなる時があります。
特にレコードを大量に消した時やレコードを追加した時に正確な値が取れない。。。
なぜそうなるのか、、、調べきれていないけどとりあえず件数が知りたい。。。

# 解決策

必要な分だけカウントを取るワンライナーを書けばいいんだということに辿り着いた。
以下のようなSQLを書くとイケる！！！！

サクッとSQLで書くと以下のようになる。各テーブルごとのcountをとって出力する。

```
mysql> SELECT (SELECT count(*) FROM table1) AS table1, (SELECT count(*) FROM table2) AS table2\G
*************************** 1. row ***************************
                     table1: 28
                     table2: 233
```

上記のようにレコード数の知りたいテーブルに対して、 **`(SELECT count(*) FROM table1) AS table1`** の部分をふやしていけばいいんですが、、
すべてのテーブルのレコード数を知りたいなど、単純に何個もコピペすることになり、増やすだけでめんどくさい。。。 

ということで上記のデータを出すためのワンライナーを書きました。

## Rubyのワンライナーでレコード数を取得

```
$ mysql -N -uroot DB名 -e "SHOW TABLES" | \
  ruby -nle 'BEGIN{$counts=[]}; $counts << "(SELECT COUNT(*) FROM #{$_}) AS #{$_}"; END{puts "SELECT " + $counts.join(",").concat("\\G")}' | \
  mysql -uroot DB名

```

* **注意)** mysqlコマンドのところは `-p` `-h` などのオプションを使って適切なアカウントやホスト情報を設定するのが環境によっては必要になります。

Rubyを使っていますが、いろんな言語 でも同様のことができそうですね！！
上記のRubyのものももっと最適化とかもできそうな感じもしますし。。
あまりワンライナーとか書かないのでこういう書き方もあるなどあれば教えてほしいです。

Gistにもコードを置いていますので、ご参考までに。
[MySQLのテーブルカウント数を取得する。Rubyワンライナー - Github Gist](https://gist.github.com/yusabana/16b3444a7584bb8181d8#file-mysql-ruby)
[Realm 0.95.0] Migrationの書き方

Realm Swift0.95.0でAPIが色々変わったので、メモ。

# ChangeLog

[realm-cocoa/CHANGELOG.md](https://github.com/realm/realm-cocoa/blob/master/CHANGELOG.md)

# Migrationの書き方

```swift:AppDelegate
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

//↓↓↓↓

  let config = Realm.Configuration(
    schemaVersion: 1,
    migrationBlock: { migration, oldSchemaVersion in
      if (oldSchemaVersion < 1) {
      }
    })

  Realm.Configuration.defaultConfiguration = config

  let realm = Realm()
//↑↑↑↑

```

# References

[Official](https://realm.io/docs/swift/latest/)
vagrantがmysqlのport forwardの関係でupできなかったので解決策をメモ

## 動機
docker-composeでmagento(php製ECフレームワーク)を動かしたかった。
環境差異を無くすためにdocker on vagrantになってて楽なはずだった
https://github.com/andreaskoch/dockerized-magento

## 問題
mysqlとnginxのコンテナが死んでた。

```
>> docker-compose ps                                                                                           


              Name                             Command               State     Ports
--------------------------------------------------------------------------------------
dockerizedmagento_cache_1           /entrypoint.sh redis-server      Up       6379/tcp
dockerizedmagento_fullpagecache_1   /entrypoint.sh redis-server      Up       6379/tcp
dockerizedmagento_installer_1       /bin/install.sh                  Up
dockerizedmagento_mysql_1           /entrypoint.sh mysqld            Exit 1
dockerizedmagento_nginx_1           entrypoint.sh nginx              Exit 1
dockerizedmagento_php_1             php-fpm                          Up       9000/tcp
dockerizedmagento_sessions_1        /entrypoint.sh redis-server      Up       6379/tcp
dockerizedmagento_solr_1            /usr/bin/java -Xmx1024m -D ...   Up       8983/tcp
```
エラーを見ると

```
==> default: Forwarding ports...
    default: 80 => 80 (adapter 1)
    default: 443 => 443 (adapter 1)
    default: 3306 => 3306 (adapter 1)
    default: 8983 => 8983 (adapter 1)
    default: 22 => 2222 (adapter 1)
```
のあとに「3306番ポートはホスト上で専有されてるよ」って言われてた

## 解決策
mysqlのプロセスを様々な手段で消そうとしたけど死なない
http://mysql.javarou.com/dat/000580.html

OSXのLaunchDaemon的なやつで不死身化してるんだと思い消し方をググった
http://stackoverflow.com/questions/100948/how-do-you-stop-mysql-on-a-mac-os-install

homebrewでmysql入れた人は
`launchctl unload -w ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist`
で不死の力を弱められる

## 結果
なんでホスト側の環境に依存してしまうようなVagrantfileなのかよくわかってないが、追々追記する。とりあえず動いたのでよし。
Amazon RDS for MySQLをremoteにしてSpiderストレージエンジンを利用する

## 初めに
[こちら](http://d.hatena.ne.jp/kskmeuk/20121117/1353156057)の要約として書きました。
助かりました。ありがとうございました。

## 概要
RDSのMySQLをSpiderのremoteとして設定した時、ただインストールしただけだとテーブルにアクセスした時次のようにエラーに。

```
ERROR 1227 (42000): Access denied; you need (at least one of) the SUPER privilege(s) for this operation
```

ただ、RDSの制約上ユーザーにSUPERを設定できないので、そもそもSUPERが必要なくなるように設定を追加する必要があります。

my.cnfに次のように追加し、再起動してください。

```
[mysqld]
spider_internal_sql_log_off = ON
spider_remote_sql_log_off   = 1
```


### 補足1
SpiderストレージエンジンはMariaDBにプリインされているものを使用しました。

### 補足2
設定される値の詳細については以下の通りです。
https://mariadb.com/kb/en/mariadb/spider-server-system-variables/#spider_remote_sql_log_off
https://mariadb.com/kb/en/mariadb/spider-server-system-variables/#spider_internal_sql_log_off
PowerMokitoでstaticクラスをSpyする。

mockitoでスタティッククラスをmock化する方法や、mock化されたオブジェクトをSpyする方法は検索すると結構ひっかかったのですが、Staticクラスの1部のメソッドだけをmock化する方法がなかなか見つからなかったので自分用にメモ。

```
@RunWith(PowerMockRunner.class)
@PrepareForTest({DateUtil.class, ... })
public class AAATest {

@Before
public void setUp() throws Exception {
	PowerMockito.spy(DateUtil.class);
}

@Test
public void test() {

	Date systemDate = DateUtil.toDate("2015/01/01"); // Mockの戻り値

	// Mockの振る舞い定義は前置記法で2行続けて記述する
	PowerMockito.doReturn(systemDate).when(DateUtil.class);
	DateUtil.getSystemDate(); // この呼び出しがMock化される
    
    Date expectedDate = DateUtil.toDate("2015/01/01")
    Assert.assertThat(DateUtil.getSystemDate(), is(expectedDate))
}


```
Static#getSystemDate()の呼び出しはMock化され、それ以外のメソッドDateUtil#toDate(String)等の呼び出しは実際のロジックが呼び出されるようになります。

## その他気づいたこと
### new
* コンストラクタ(new)をMock化するときは@prepareForTestにテスト対象のクラスを設定しないと動作しない。

### static method
* newのMock化を使用せず、static methodだけのMock化ならば@prepareForTestにテスト対象を追加しないほうがいい。
* Jacoco(EclEmma)などを使用してカバレッジを採ることができる。
iOS SDK 9 beta 5で Multiple methods named 'setTransform:' found with mismatched result, parameter type or attributes

# 発生したコード
```objc
UIToolbar *toolBar;
for (UIBarButtonItem *item in [toolBar items]) {
    [item.customView setTransform:CGAffineTransformIdentity];
}
```

# 解決方法
```objc
UIToolbar *toolBar;
for (UIBarButtonItem *item in [toolBar items]) {
    [(UIView *)item.customView setTransform:CGAffineTransformIdentity];
}
```
SourceTree > default branchの設定

```txt:動作確認
SourceTree version 1.6.19.0 on Windows 7Pro
```

default branchというのが樹形図の一番左に来るらしい。
https://answers.atlassian.com/questions/310287
> Any other branch can be configured to be the default branch. Saying this, it does not make sense to have master branch displayed always leftmost

例として、左のメニューの[ブランチ]において、以下がある状況でfeature_XXXをdefault branchとする手順を示す。

- feature_XXX
- master

参考
https://answers.atlassian.com/questions/172242/how-to-setup-default-push-branch

> Right-click your local branch in the sidebar on the left, then select Track Remote Branch, and then the remote branch you want it to track. That will then be the default when you push next time.

手順
1. 左メニュー「ブランチ」の feature_XXX 上にて右クリック > リモートブランチを追跡 > origin/feature_XXX を選択
2. 次回pushした時に、feature_XXXが一番左に来る
setlockを使ってwheneverの重複排除を実現する

#setlockとは
ファイルをロックすることで重複排除を実現するコマンドです。
daemontoolをインストールすると使えるようになります。
[setlockを使って簡単に多重起動防止機能を実装する]
(http://qiita.com/mogulla3/items/0a955196c524712f48ba)

#実現方法
利用するjob_typeにsetlockの記述を追加します。
/tmpにタスク名のファイルを作り、それをロックすることで重複排除するようにしました。


```config/schedule.rb
# original runner
# job_type :runner, "cd :path && bin/rails runner -e :environment ':task' :output"
# new runner
job_type :runner, "cd :path && setlock -n /tmp/:task bin/rails runner -e :environment ':task' :output"

every 1.minutes do
  runner 'SampleModel.sample_method'
end
```

これにより`/tmp/SampleModel.sample_method`を通して重複排除が実現できます。

以上です。
whenever rails prohibit duplicate runとかで検索しても期待する答えに行き着かなかったので、共有しました。
誰かの役に立てれば幸いです。
もっと良い書き方があれば、教えてもらえると嬉しいです。

#参考
[setlockを使って簡単に多重起動防止機能を実装する]
(http://qiita.com/mogulla3/items/0a955196c524712f48ba)
[javan/whenever]
(https://github.com/javan/whenever)
Astersikのリアルタイム化　設定ファイルの関連付け

Asteriskの設定を、ファイル(*.conf)からDB化した際に設定ファイルの関連付けにハマったときのメモです。

##参考

[Voip-info.org - Asterisk RealTime Static](http://www.voip-info.org/wiki/view/Asterisk+RealTime+Static)
[Ubuntu manuals - odbcinst](http://manpages.ubuntu.com/manpages/oneiric/man1/odbcinst.1.html)
##環境
- CentOS 6.5
- Asterisk 11.6.0
- Mysql OBDC

##設定ファイルの関連

sip.confをリアルタイム化した場合

```ini:/etc/asterisk/extconfig.conf
[settings]
;
; Static configuration files:
sip.conf   => odbc, mysql-odbc, tbl_sip_conf (sip.confのTABLE)
```

**mysql-odbc**は、res_odbc.confのセクション名になります。
tbl_sip_confは、TABLE名です。

```ini:/etc/asterisk/res_odbc.conf
[mysql-odbc]
enabled     => yes
dsn         => ASTERISK_CDR
username    => username  (Databaseのログインユーザー)
password    => pass      (Databaseのログインパスワード)
pre-connect => yes
limit       => 5
pooling     => no
isolation   => repeatable_read
```

dsnの**ASTERISK_CDR**は、odbc.iniのセクション名になります。

```/etc/odbc.ini
[ASTERISK_CDR]
Driver      = MySQL
Description = ASTERISK_CDR
SERVER      = localhost
PORT        = 3306
USER        = root
Password    = pass     (Databaseのログインパスワード)
Database    = DATABASE (DATABASE名)
OPTION      = 3
SOCKET      = /var/lib/mysql/mysql.sock
CHARSET     = utf8
```

Driverの**MySQL**は、odbcinst.iniのセクション名になります。

```/etc/odbcinst.ini
# Driver from the mysql-connector-odbc package
# Setup from the unixODBC package
[MySQL]
Description  = ODBC for MySQL
Driver       = /usr/lib/libmyodbc5.so
Setup        = /usr/lib/libodbcmyS.so
Driver64     = /usr/lib64/libmyodbc5.so
Setup64      = /usr/lib64/libodbcmyS.so
FileUsage    = 1
```

最後に下記のコマンドを実行して、設定を反映します。

```
$ odbcinst -i -s -f /etc/odbc.ini

 -i インストール
 -s DSN名
 -f ファイル名
```
Docker の WebUI 作りました

　
Docker、コマンドラインでの操作が一般的ですが
どうしてもGUIがほしくてWebUI作りました。

もちろん世の中にはいくつかすでに実装があって

```bash
$ docker search docker-ui
```

とかやればたくさんスターがついたよさげなのはあるものの
ほしい機能がなかったので forkせず re:Inventしました。[^1]

https://github.com/pottava/docker-webui/

# やれること

## 1. ブラウザからDocker操作できます

http://localhost:9000/
http://localhost:9000/images

* 状態、検索文字列でコンテナを検索
* コンテナに inspect, top, stats, logs, diff, rename, commitコマンド実行
* コンテナの start, stop, restart, rm
* 新規 Dockerイメージの pull
* 検索文字列でローカルにあるイメージを検索
* イメージに inspect, history, tag, rmiコマンド実行[^2]

## 2. ブラウザからログ見れます

http://localhost:9000/container/statlog/container [^3]

![](https://raw.github.com/wiki/pottava/docker-webui/images/logs.png)

## 3. ブラウザからCPU・メモリ使用率見れます

http://localhost:9000/statistics
数秒おきに、リアルタイムにグラフ化されます[^4]

![](https://raw.github.com/wiki/pottava/docker-webui/images/stats.png)

# インストール・実行

DockerのソケットかAPI用のTCPに繋がることが前提ですが。

## Dockerコンテナとして

```bash
$ docker run -d --name dw -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -e DOCKER_HOST=unix:///var/run/docker.sock pottava/docker-webui
```

## Goの実行ファイルとして[^5]

```bash
$ go get github.com/pottava/docker-webui
$ docker-webui
```

## ブラウザでアクセスできます

デフォルトでは9000番ポート使いますが、
[環境変数](https://github.com/pottava/docker-webui/blob/master/app/config/config.go#L60)か [設定ファイル](https://github.com/pottava/docker-webui/blob/master/app/config/config.go#L81)で変更もできます。

http://localhost:9000/

　
[^1]: 今後もちゃんとメンテしますー
[^2]: 現状 `run`できないのがかなしい
[^3]: コンテナ一覧画面で、コンテナ名を右クリックして飛べます
[^4]: 監視しているコンテナが停止してしまうと画面の更新が必要^^;
[^5]: Go初心者なのでどう配布するのがいいのか知りたい・・。クロスコンパイルを自動化しないとダメですか先生・・
Raspberry Pi で wiringPi を install / uninstall するためのシェルスクリプト


Raspberry Pi でよく使用されるであろう [wiringPi](http://wiringpi.com) は Raspbian の apt-get コマンドで install / uninstall 出来ないため、シェルスクリプトを作成しました。

ソースコードは `/usr/src/wiringPi/` ディレクトリに展開されます。


```bash:wiringpi.sh
#!/bin/bash

PWD=$(pwd)
CMD=$1
gpio -v 1>/dev/null 2>/dev/null; GPIO=$?

#echo $GPIO
#echo $CMD

if [ "$CMD" = "install" ]; then
    if [ $GPIO -ne 0 ]; then
        echo "Install wiringPi"
        cd /usr/src; sudo git clone git://git.drogon.net/wiringPi
        cd wiringPi; sudo ./build
        cd $PWD
    else
        echo "wiringPi was always installed."
    fi
elif [ "$CMD" = "uninstall" ]; then
    if [ $GPIO -eq 0 ]; then
        echo "Uninstall wiringPi"
        cd /usr/src/wiringPi; sudo ./build uninstall
        cd ..; sudo rm -rf wiringPi
        cd $PWD
    else
        echo "wiringPi is not installed."
    fi
elif [ "$CMD" = "-v" ]; then
    if [ $GPIO -eq 0 ]; then
        echo $(gpio -v | grep version | sed -e "s/gpio/wiringPi/g")
    else
        echo "wiringPi is not installed."
    fi
else
    echo "Usage: wiringpi -v" 
    echo "       wiringpi install"
    echo "       wiringpi uninstall"
fi
```
容量が多いdocker machineの作成

#症状
```
no space left on device
```

#対策
```
~/git/testserver (develop ✘)✹ ᐅ docker-machine rm default
Successfully removed default
~/git/testserver (develop ✘)✹ ᐅ docker-machine create default --driver virtualbox --virtualbox-disk-size "500000"
Creating VirtualBox VM...
Creating SSH key...
Starting VirtualBox VM...
Starting VM...
To see how to connect Docker to this machine, run: docker-machine env default
~/git/testserver (develop ✘)✹ ᐅ eval "$(docker-machine env default)"
```
Raspberry Pi で Bluetooth を使ってみた。(2)


Bluetoothのドングルは、BLE (Bluetooth Low Energy) 対応のPlanexの[BT-Micro4](https://www.planex.co.jp/products/bt-micro4/)を使用。

#ライブラリのインストール

```bash
$ sudo apt-get update
$ sudo apt-get install libdbus-1-dev libdbus-glib-1-dev libglib2.0-dev libical-dev libreadline-dev libudev-dev libusb-dev make
```

#BlueZのダウンロード
BlueZ のソースコードを `/usr/src` にダウンロードします。
2015年9月7日時点での最新バージョンは ver.5.34 でした。

```bash
$ cd /usr/src/
$ sudo wget https://www.kernel.org/pub/linux/bluetooth/bluez-5.34.tar.xz
$ sudo xz -d bluez-5.4.tar.xz
$ sudo tar xvf bluez-5.34.tar
```

#BlueZのインストール
ソースコードをビルドします。ビルドには少し時間がかかります。

```bash
$ cd bluez-5.34
$ sudo ./configure --disable-systemd
$ sudo make
```

ビルドが完了したらインストール。

```bash
$ sudo make install
```

#作動確認
Raspberry PiにBluetoothドングルを挿します。
まず `lsusb` コマンドでドングルが認識されていることを確認。
PlanexのBT-Micro4の場合、`Cambridge Silicon Radio, Ltd Bluetooth Dongle (HCI mode)` と認識されました。

次にドライバの作動確認。`hciconfig` コマンドを使用。以下のような結果になりました。

```bash
$ hciconfig
hci0:	Type: BR/EDR  Bus: USB
	BD Address: 00:1B:DC:04:AA:4B  ACL MTU: 310:10  SCO MTU: 64:8
	UP RUNNING 
	RX bytes:15799 acl:0 sco:0 events:189 errors:0
	TX bytes:931 acl:0 sco:0 commands:78 errors:0
```

もし、`UP RUNNING` ではなくて `DOWN`  と表示されていたら、

```bash
$ sudo hciconfig hci0 up
```

を実行。

#Bluetooth機器を検索
- コマンド `hcitool scan` を実行し、Bluetooth機器を検索します。
- BLE機器を探すには `sudo hcitool lescan` を実行。
`hcitool scan` と違って検索し続けるので、`Ctrl+C` で検索を中止します。

#リンク
- [Raspberry Pi で Bluetooth を使ってみた。(1)](http://qiita.com/tchisaka/items/f7ebdb2de7ce9135e1cc)

#参考
- [Raspberry Pi を Bluetooth Low Energy (BLE) の Peripheral として動作させる - Dream of Electric Cat](http://dream-of-electric-cat.hatenablog.com/entry/2015/04/13/221940)
- [RPi Bluetooth LE](http://www.elinux.org/RPi_Bluetooth_LE)
java.util.regex.Matcher#replaceAll が StackOverflowError で落ちる

# バージョン情報
* Java 1.8

# 現象
以下のような, 空白を除去するメソッドを作成する.

```java:java
private static String stripSpaces(String text) {
    // 改行・空白類にマッチするパターン
    final Pattern pattern = Pattern.compile("(\\s|\\p{javaSpaceChar}|\\p{Zs})+");
    
    return Stream.of(text)
        .map(pattern::matcher)
        .map(matcher -> matcher.replaceAll(""))
        .findAny().get();
}
```

このメソッドが, 引数`text`の値によっては, 以下のエラーで落ちる.

```text
Exception in thread "main" java.lang.StackOverflowError
	at java.util.regex.Pattern$Loop.match(Pattern.java:4765)
	at java.util.regex.Pattern$GroupTail.match(Pattern.java:4717)
	at java.util.regex.Pattern$BranchConn.match(Pattern.java:4568)
	at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3798)
	at java.util.regex.Pattern$Branch.match(Pattern.java:4604)
	at java.util.regex.Pattern$GroupHead.match(Pattern.java:4658)
	at java.util.regex.Pattern$Loop.match(Pattern.java:4785)
	at java.util.regex.Pattern$GroupTail.match(Pattern.java:4717)
	at java.util.regex.Pattern$BranchConn.match(Pattern.java:4568)
	at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3798)
	at java.util.regex.Pattern$Branch.match(Pattern.java:4604)
	at java.util.regex.Pattern$GroupHead.match(Pattern.java:4658)
	at java.util.regex.Pattern$Loop.match(Pattern.java:4785)
	:
	:
```

# 原因
不定量指定を複数個ORで繋げると危ないらしい.

* 参考URL
  * [Java、特定の正規表現パターンで容易にStackOverFlowErrorを起こせる](http://d.hatena.ne.jp/gnarl/20111215/1323951952)
  * [
Javaの正規表現で文字列を分割、置換え、抽出、検索する](http://dev.livetp.com/java/0308.html) ※最下部の注釈

# 解決方法
```java:java
final Pattern pattern = Pattern.compile("(\\s|\\p{javaSpaceChar}|\\p{Zs})+");
```
を

```java:java
final Pattern pattern = Pattern.compile("[\\s\\p{javaSpaceChar}\\p{Zs}]+");
```
に変えたら動きました. Javaの正規表現はちょっと気をつけて書いた方が良さそうです.
requireのキャッシュを消す


requireは、キャッシュされていれば、キャッシュを返して、キャッシュされていなければ、ロードします。
キャッシュを削除してから、requireを実行すれば、再度ロードされます。
require.cacheに指定する値は、ファイル名。requireで指定した値ではない。


``` main.js
var sys = require('sys');

function sleep(time, callback) {
	setTimeout(callback, time);
}

function p() {
	delete require.cache[__dirname + '/config.js']
	var config = require(__dirname + '/config');
	sys.print(config.PORT + '\n');
	sleep(3000, p);
}

sleep(3000, p);

```

``` config.js
var config = {
	"PORT": 3302
}

module.exports = config;
```
Raspberry Pi で Bluetooth を使ってみた。(1)


Bluetoothのドングルは、BLE (Bluetooth Low Energy) 対応のPlanexの[BT-Micro4](https://www.planex.co.jp/products/bt-micro4/)を使用。

#ドライバのインストール
以下のコマンドを実行。

```bash
$ sudo apt-get update
$ sudo apt-get install bluetooth bluez-utils
```

インストールされたパッケージを以下のコマンドで確認する。

```bash
$ dpkg -l | grep blue
ii  bluetooth         4.99-2  all    Bluetooth support
ii  bluez             4.99-2  armhf  Bluetooth tools and daemons
ii  bluez-alsa:armhf  4.99-2  armhf  Bluetooth ALSA support
ii  bluez-cups        4.99-2  armhf  Bluetooth printer driver for CUPS
ii  bluez-gstreamer   4.99-2  armhf  Bluetooth GStreamer support
ii  bluez-utils       4.99-2  all    Transitional package
```

インストールされたバージョンは4.99-2のもの。コマンド `apt-cache show bluetooth` で再確認。

```
Package: bluetooth
Source: bluez
Version: 4.99-2
Installed-Size: 71
Maintainer: Debian Bluetooth Maintainers <pkg-bluetooth-maintainers@lists.alioth.debian.org>
Architecture: all
Depends: bluez
Recommends: bluez-alsa, bluez-cups, bluez-gstreamer
Size: 37480
SHA256: a7f16719c9aae764c76ca260a1edfb9fbf040360eadb0235544eb4d06d8b5ab8
SHA1: 758b734d568b8103e1c18af59e14300bc3555f86
MD5sum: 25d721725f4ab9fc4f4e4d79bb239d69
Description: Bluetooth support
Homepage: http://www.bluez.org
Description-md5: c9c3278c19393dc7c6582892d29bf660
Tag: role::dummy
Section: admin
Priority: optional
Filename: pool/main/b/bluez/bluetooth_4.99-2_all.deb
```

実はBLE対応はver.5.0以降らしい。

#ドライバのアンインストール
ver.4.99-2のパッケージと設定ファイルを削除。

```bash
$ sudo apt-get autoremove bluetooth
$ sudo apt-get --purge remove bluez
```

コマンド `dpkg -l | grep blue` でBluetooth関連パッケージが全てアンインストールされたことを確認。

進まなかった。orz

#リンク
- [Raspberry Pi で Bluetooth を使ってみた。(2)](http://qiita.com/tchisaka/items/80d4dcbfe83bb88acf02)

#参考
- [Bluetooth LEをつかってみるの巻 その1 - つれづれなるまゝに](http://blog.goo.ne.jp/mikotolv5/e/b41638a51339d1e49a57a7fd92ab3693)
node-reset-scssを使ってgulpでreset cssを挿入する方法

[node-reset-scss](https://www.npmjs.com/package/node-reset-scss)を使うと、gulpでSassをコンパイルする際に、自動的にreset cssを挿入することができます。
公式サイトを見ても今一つ使い方が分からなかったので、備忘録代わりにメモしておきます。

# 必要な環境

すでにnodeがインストール済みで、プロジェクトのディレクトリ内に以下のnpmパッケージがインストールされている前提とします。

- node.js
- gulp
- gulp-sass

# インストール方法

プロジェクトのディレクトリで以下のコマンドを実行。

```
npm i node-reset-scss --save-dev
```

# 使い方

[gulp-sass](https://www.npmjs.com/package/gulp-sass)を使ってコンパイルする場合、gulpfile.jsに以下のように記述してオプションを追加。

```gulpfile.js
var gulp = require('gulp');
var sass = require('gulp-sass');
 
gulp.task('sass', function () {
  gulp.src('path/to/input.scss')
    .pipe(sass({
      includePaths: require('node-reset-scss').includePath
    }))
    .pipe(gulp.dest('path/to/output.css'));
});
```

公式サイトの説明では、上記の設定しか書かれていないのですが、当然（？）というか、これだけではreset cssの挿入は行われません。

そもそも[includePaths](https://github.com/sass/node-sass#includepaths)とは、node-sassで `@import` 機能を使って読み込むためのパスを追加するオプションなので、Sassファイル側からも `@import` してあげる必要があります。

```style.scss
@charset "utf-8";

（中略）

@import "_reset";

（中略）
```

上記のように記述した上でコンパイルすると、cssファイルの冒頭にreset cssを挿入することができます。

# 結論

実際にやっていることは、node-reset-scssのフォルダに入っている `_reset.scss` をインポートしているだけなので、果たしてこれをプラグインを使ってやる意味があるかという疑問は残ります。

自前で `_reset.scss` を設置してインポートさせても、手間的にはほとんど変わらないでしょう。ただ、予めよく使うpackage.jsonやgulpfile.jsに組み込んでしまえば、導入しやすいという利点はあるかもしれません。

また、gulp-sassでincludePathsオプションを活用すれば、外部のパスをインクルード先として定義できるので、複数プロジェクトで使い回せるmixinなどは、プロジェクト内ではなく、共通のフォルダにまとめておくと管理がしやすそうです。
Slackでbotからgroupメンションを送る記法

サーバを監視して異常が起きたらSlackに通知する仕組みを作っていたのですが、botからgroupメンションが出来ない！と困ったのでそれを解決する方法です。

## 普通にメンションを書く

botから通知する際に普通に `@group` という形でメンションを書くとこうなります。

```
"@group groupメンションのテスト"
```

![image](https://qiita-image-store.s3.amazonaws.com/0/18007/020f84d9-632e-6031-2db0-d6cd281e4002.png)

これで困って先頭にバックスラッシュを入れてみたり色々ためしたのですが、答えはヘルプセンターに書いてありました。

https://slack.zendesk.com/hc/en-us/articles/202009646-Making-announcements

## botからgroupメンションを送る記法

以下のように書きます。`<!group>`と書いたところが`@group`に置換され、メンションとして扱われます。

```
"<!group> groupメンションのテスト"
```

![image](https://qiita-image-store.s3.amazonaws.com/0/18007/737ba194-da58-e4fb-0d9f-9d0395c68958.png)

## 参考

https://slack.zendesk.com/hc/en-us/articles/202009646-Making-announcements
phpagiのget_variableで値取得に失敗したときの対応方法

phpagiを利用したAsteriskのシステムをつくるとき、
実行処理が遅くなるとget_variableでAsteriskから値取得に失敗することがあります。

そのときに対応したときのメモ
初期の状態は改行(\n)までをAsteriskからのパケット応答と判定していますが
処理が遅くなると改行以降もパケット応答があるようです。

```php:phpagi.php
    function __construct($config=NULL, $optconfig=array())
    {
             ・
             ・
        // initialize error handler
        if($this->config['phpagi']['error_handler'] == true)
        {
          set_error_handler('phpagi_error_handler');
          global $phpagi_error_handler_email;
          $phpagi_error_handler_email = $this->config['phpagi']['admin'];
          error_reporting(E_ALL);
        }

        // make sure temp folder exists
        $this->make_folder($this->config['phpagi']['tempdir']);

-       // read the request
-       $str = fgets($this->in);
-       while($str != "\n")
-       {
-         $this->request[substr($str, 0, strpos($str, ':'))] = trim(substr($str, strpos($str, ':') + 1));
-          $str = fgets($this->in);
-       }

+       //clear the buffer
+       stream_set_blocking($this->in,0);
+       do{
+         $str = fgets($this->in);
+       }while($str);
+       stream_set_blocking($this->in,1);
             ・
             ・
    }
```
Location制約へのdiscovery設定

# discovery設定(probeの省略)
## 機能
Pacemkaer1.1.13以降から利用可能なlocation制約への追加設定属性で、設定することによって、PacemakerのリソースのProbe(monitorをタイマー0で実行してリソースの起動状態を初期確認)を省略することが出来ます。
Probeは基本的に全てのノードのクラスタ参加時にリソースの起動状態を確認する為に実施されます(ノードで起動済みのリソースを確認する必要があるため）が、絶対にリソースが起動しないノード(後術するpacemaker_remoteや、ノード数が非常に多い場合など)では、実行することによって、余計な処理時間がかかります。

```:crmファイル

location rsc_location-1 prmDummy1 resource-discovery="always" \
        rule $id="rsc1_location-rule-1" 200: #uname eq node1

location rsc_location-2 prmDummy1 resource-discovery="never" \
        rule $id="rsc2_location-rule-1" 200: #uname eq node2

```

設定値に関しては、マニュアルに詳細がありますが、
1. always(デフォルト) : 設定locationでProbeを実行する
2. never : 設定locationでProbeを実行しない
3. exclusive : 設定locationのみでProbeを実行する-設定以外のノードではProbeを実行しない

上記のcrm設定の場合では、以下となります。

* node1では、prmDummy1リソースのProbeは実行されます
* node2では、prmDummy1リソースのProbeは実行されません

## マニュアル
 http://clusterlabs.org/doc/en-US/Pacemaker/1.1-pcs/html/Pacemaker_Explained/_deciding_which_nodes_a_resource_can_run_on.html
Javaで外部サイトのOGPメタ情報を取得する方法

Javaを使用し外部URLからHTMLを取得して、簡単にパースしOGP情報を取得したい

スクレイピングには**Jsoup**を使用します。

```java
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;

public class Ogp {
   public Elements getOgp(String url) throws IOException {
        Document document = Jsoup.connect(url).get();
        return document.select("meta[property~=og:*]");
    }
}
```

取得するだけならこれだけ

データもこんな感じで取り出せる

```java
Elements elements = getOgp("http://gamy.jp");
for (Element element : elements) {
   System.out.println(element.attr("property"));
   System.out.println(element.attr("content"));
}
```
iPhoneアプリの数値分析体制を一挙公開



[今朝2.0をリリースしたPlayer!](https://itunes.apple.com/jp/app/player!-your-sports-news-curator/id897872395)の、数値の分析体制を公開します。


![KGI&KPI.001.jpg](https://qiita-image-store.s3.amazonaws.com/0/58836/24eb3c43-e182-0800-1bb2-f19e14ed166b.jpeg)


数値の取得先は、大きく5つです。
1.Google Analytics
2.Treasure Data
3.fabric
4.App Analytics
5.Search Man


そして、それらで取得した数字はGoogle SpreadSheetに集めています。
数値の落とし込み方は、「自動」と「手動」の2つあります。

自動：
1.Google Analytics<br>
→Google Apps Scriptのトリガーを設定し、毎日定期的にデータを取得するように設定しています。

2.Treasure Data<br>
→HiveQLでデータ取得のクエリを作り、Treasure Data上でそのクエリをまわす時間を設定し、毎日定期的にデータを取得するように設定しています。


手動：
3.fabric
4.App Analytics
5.Search Man<br>
→これらのデータを自動で集める手段が見つからず苦戦しております。何か良い手段や代替手段がある方は、お助けください;;


また、そうして取得したデータを、spreadsheet内でvlookup関数などを使い、1枚のsheetに重要な指標のみを集め、チームのメンバーにはこれだけ見て！！という形で共有しています。



![KGI&KPI.001.jpg](https://qiita-image-store.s3.amazonaws.com/0/58836/dd825809-a915-d0ab-17dc-677d11c764bf.jpeg "KGI&KPI.001.jpg")

使い分けとしては、上記のようになっております。
特にfabricに関しては、痒い所に手が届くような細かいイベントのデータが取得できるので、非常に使いやすいです。

ちなみに、weblpというのは、Player!内での投稿をした際にSNS上にシェアされる記事ページのことを意味します。
参考ページ：[日本、中国撃破３大会ぶり五輪切符／女子バスケ詳細：日刊スポーツ](http://web.playerapp.tokyo/news/281670?tag=96)
AppStore上でのiOSアプリのスクリーンショットのうまい見せ方


[今朝2.0をリリースしたPlayer!](https://itunes.apple.com/jp/app/player!-your-sports-news-curator/id897872395)の、デザイナーの @riotherio 作成のスクリーンショットがかっこよくてさすがだなと思ったので、ご紹介します。

要は、スクリーンショットの1〜2枚目を使って1つの大きな絵を表現しています。

とくに、iPhoneで見た時に、今のAppStoreでの見せ方にすごくフィットしていて、他のアプリより一際目をひくし、アイディアもデザインもさすがだなと思いました(　´･‿･｀)

こういう工夫で、ダウンロード数が伸びれば嬉しいですね(　´･‿･｀)

### iPhoneで見た時

![IMG_2007.PNG](https://qiita-image-store.s3.amazonaws.com/0/19398/7e527c76-cd39-afde-7825-1f9f284631e3.png "IMG_2007.PNG")

### Macで見た時

![Screen Shot 2015-09-07 at 7.56.54 AM.png](https://qiita-image-store.s3.amazonaws.com/0/19398/f3d76455-d49c-a42e-89c2-e1451f8c141b.png "Screen Shot 2015-09-07 at 7.56.54 AM.png")
【Go】標準パッケージをトレースする


勉強がてら、Goの標準パッケージがどんな値をとっているか、トレースしてみました。
とりあえずできたやり方であり、そもそも標準パッケージをいじるのはよろしくないかと思いますので、同じようにやる際は**自己責任**にてお願いします。
むしろ詳しい方、「こういう方法がありますよ」と教えていただけるとありがたいです :worried: 

※Goのバージョンは1.5です。

## GOROOTの確認
go env コマンドで GOROOT が確認できます。

```bash
$ go env
GOARCH="amd64"
GOBIN=""
GOEXE=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOOS="linux"
GOPATH="/home/vagrant/gocode"
GORACE=""
GOROOT="/usr/local/go"
GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64"
GO15VENDOREXPERIMENT=""
CC="gcc"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0"
CXX="g++"
CGO_ENABLED="1"
```

## 対象ファイルをいじる
GOROOT以下で調べたいファイルをいじります。くれぐれも自己責任で。 :relieved: 

自分の場合は以下の投稿にて go/ast パッケージを調べたかったので、

```bash
$GOROOT/src/go/ast/import.go
```

をいじりました。
[【Go】go fmt でフォーマット化された後のimportの順番について](http://qiita.com/taji-taji/items/91559e2b5b6c22631535)

具体的には

```go
fmt.Printf("%+v", var)
```
という感じでいろいろな値を出力してみました。


## ビルドし直す

all.bash を実行し、ビルドし直します。

```bash
$ cd $GOROOT/src
$ ./all.bash
```

数分かかります…。

ビルドが終了したら、いじったファイルの変更が反映されているはずです。


## おわりに

以上となりますが、
冒頭でも触れた通り、あくまで自己責任でお願いします:hushed:
技術英語 > In all probability Larson will win. > １０中8、９ラーソンが勝つだろう

引用: 冠詞マスター教本 by 石井隆之さん

> In all probability Larson will win. (１０中8、９ラーソンが勝つだろう)

<hr>

関連して思い出したのは

in nine cases out of ten

http://ejje.weblio.jp/content/in+nine+cases+out+of+ten
> 十中八九(まで).

<hr>
[Hangout] Stack, Heap, boost::xxx

### Stack

```cpp:stack.cpp
int* stack_a(){
    int *x;
    return x;
}

int main()
{   
    std::cout << *stack_a() << std::endl;
}
```



#### output
    [1]    2595 segmentation fault  ./a.out


How can we make it works?

### Heap

Easiest way is to just use heap memory. But in practice you should do consider recursive algorithm which is able to keep value.

```cpp:heap.cpp
int* heap_a(){
    int *x = new int;
    return x;
}

int main()
{   
    std::cout << *heap_a() << std::endl;
}
```

#### output
```
0
```

### boost::scoped_ptr

```cpp
int* scoped_ptr(){
    boost::scoped_ptr<int> x;
    return x;
}

int main()
{
    std::cout << *scoped_ptr() << std::endl;
}
```

equality to `stack_a`
socket.io 1.x でプライベートチャット作成

socket.ioを使ってプライベートのチャットルームを作成してみました。

## 参考記事
http://qiita.com/mito_log/items/a6207d2b43189687d750
http://stackoverflow.com/questions/23619015/creating-a-private-chat-between-a-key-using-a-node-js-and-socket-io
http://socket.io/docs/rooms-and-namespaces/#joining-and-leaving

## 開発環境
ubuntu14.04 + nginx + unicorn
node + express + socket.io


## ざっくりとした流れ

1. クライアント側でRoomIdを生成（プライベートチャットユーザー間でRoomIdを共有する）
2. クライアント側でroomIdを使ってjoinする
3. メッセージを送信する時に、テキストとRoomIdをサーバに送信する
4. サーバ側でtoでルームを指定して、emitする






## サーバーサイド
```index.js
var app = require('express')();
app.get('/',function(req, res) {
  res.sendFile('socket.html',{root:'./'});
  console.log("hosting socket.html");
});

var http = require('http').Server(app);
http.listen(1337, function() {
  console.log("listening on *:1337");
});

var io = require('socket.io')(http);
io.on('connection', function(socket){
  socket.on('joinRoom', function(roomId) {
    socket.join(roomId, function(){
      console.log('joined test room: '+ roomId);
    }); 
  }); 
  socket.on('disconnect', function(){
    console.log('user disconnected');
    io.emit('chatMessage','user disconnected');
  }); 
  socket.on('chatMessage', function(data) {
    console.log('message: '+data.message);
    //4. サーバ側でtoでルームを指定して、emitする
    io.to(data.room).emit('chatMessage', data.message);
  }); 
});
```


## クライアント
```socket.html
<!doctype html>
<html>
  <head>
    <title>Socket.IO chat</title>
    <style>
    * { margin: 0; padding: 0; box-sizing: border-box; }
    body { font: 13px Helvetica, Arial; }
    form { background: #000; padding: 3px; position: fixed; bottom: 0; width: 100%; }
    form input { border: 0; padding: 10px; width: 90%; margin-right: .5%; }
    form button { width: 9%; background: rgb(130, 224, 255); border: none; padding: 10px; }
#messages { list-style-type: none; margin: 0; padding: 0; }
#messages li { padding: 5px 10px; }
#messages li:nth-child(odd) { background: #eee; }
    </style>
    <script src="https://cdn.socket.io/socket.io-1.3.5.js"></script>
    <script src="http://code.jquery.com/jquery-1.11.1.js"></script>

  </head>
  <body>
    <ul id="messages"></ul>
    <form action="">
      <input id="m" autocomplete="off" /><button>Send</button>
    </form>
    <script>
      var socket = io.connect('/');
      var roomId = 'testRoom';
      socket.emit('joinRoom', roomId);
      $('form').submit(function(){
          socket.emit('chatMessage' ,{message:$('#m').val(),room:roomId});
          $('#m').val('');
          return false;
      });
      socket.on('chatMessage', function (msg) {
        $('#messages').append($('<li>').text(msg));
      });
    </script>
  </body>
</html>
```
VyOSからWOLでマシン起動


[VyOSでDDNSの更新を行う](http://qiita.com/nao007_smiley/items/d10282aa015b2f077a89)の続きです。
というわけで、Squeezeのリポジトリ追加等は完了している前提です。

MagicPacketをVyOSに投げさせて、Sleep状態のNASを起動させようというお話。
やることは2つ。

---

1.WakeOnLanのパッケージインストール
> apt-get install wakeonlan

2.wakeonlanコマンドでMagicPacketを送信
> wakeonlan XX:XX:XX:XX:XX:XX(該当機器のMACアドレス)

---

以上。とっても簡単(∩´∀｀)∩ﾜｰｲ
PHPでの言語判定

# 環境
+ PHP (5.4.17)

# メモ

+ 趣味のWebアプリを多言語化した際のメモ。

    ```
    1. ブラウザに設定された言語で判定する。

    2. 言語は複数指定され、優先順位も決められている。

    3. 優先順位が一位の言語だけ取得するのであれば下記が楽です。
    ```

+ 言語コード表示。

    ```php
    echo substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);
    ```

    <b>注意：</b>「英語」(en)と「英語(アメリカ合衆国)」(en-US)などを
　　　同じに扱ってよい場合のみ。

# 参考にしたページ
+ <a href="http://www.kanzaki.com/docs/html/lang.html" target="_blank">言語コード</a>
+ <a href="http://stackoverflow.com/questions/3770513/detect-browser-language-in-php/3770616#3770616" target="_blank">スタックオーバーフローの投稿</a>