OmniAICreator/Qiita-1.07M huggingface dataset:
MySQLで(日付をまたぐ)24時間表記ごとのレコードを正しくORDER BYするには

#はじめに

【MySQLでユーザー抽出をするときのこと】

* 基本的には日付ベースとかでソートすると思うけど、
    * プロモーションがはじまった
    * この機能をリリースした　
ときとかで速報に近いものを出したいときあるじゃん。(たぶん)
 
* `hour(<datetime>なカラム)`だと日付合わせられないし、日付をまたいじゃうと時間に統合されちゃう


# やりたいこと

* SELECT文でデータをカウントする
* X日分のデータを24時間ごとに見たい
* それを1つのクエリで済ましたい
* スプレッドシートに展開するかもだけど、抽出時に昇順で並べておきたい

#んじゃどうするの？

**結論：**
`DATE_FORMAT`でデータを成形します。

※元々datetimeが`yyyy-mm-dd hh:mm:ss`で入っていると仮定し
(例：2016-05-16 23:12:47)
アウトプットとして欲しいのは`mm/dd hh:00`を複数日程分とします。
(例：05/16の23時台のデータ)

**やること**


```sql:
SELECT DATE_FORMAT(<datetime>,"%m/%d %H:00")
```
を文頭に入れる。

重要:
ここの「H」は大文字でないといけません。
なぜかと言うと、小文字の「h」を使うと12h換算で返ってくるためです。

#### 「H」のとき

```
05/16 00:00
05/16 01:00
05/16 02:00
05/16 03:00
05/16 04:00
05/16 05:00
05/16 06:00
05/16 07:00
05/16 08:00
05/16 09:00
05/16 10:00
05/16 11:00
05/16 12:00
05/16 13:00
05/16 14:00
05/16 15:00
05/16 16:00
05/16 17:00
05/16 18:00
05/16 19:00
05/16 20:00
05/16 21:00
05/16 22:00
05/16 23:00
05/17 00:00
```

きちんと 24hで返ってくる

#### 「h」のとき

```
05/16 01:00
05/16 02:00
05/16 03:00
05/16 04:00
05/16 05:00
05/16 06:00
05/16 07:00
05/16 08:00
05/16 09:00
05/16 10:00
05/16 11:00
05/16 12:00
```

※AM1:00のデータもPM1:00(=13:00)のデータも01:00に統合されちゃいます。。

#### 「k」のとき

ちなみに「k」でもいけません。

```
05/16 0:00
05/16 10:00
05/16 11:00
05/16 12:00
05/16 13:00
05/16 14:00
05/16 15:00
05/16 16:00
05/16 17:00
05/16 18:00
05/16 19:00
05/16 1:00
05/16 20:00
05/16 21:00
05/16 22:00
05/16 23:00
05/16 2:00
05/16 3:00
05/16 4:00
05/16 5:00
05/16 6:00
05/16 7:00
05/16 8:00
05/16 9:00
```

※24hで返ってくるけど、10の位を基準にソートされるので、順番になりません。


# その他

当然だけど、文頭で

```sql:
SELECT DATE_FORMAT(<datatime>,"%m/%d %H:00")
```

を指定しているので

WHERE以下の条件に

```sql:
GROUP BY
	DATE_FORMAT(<datetime>,"%m/%d %H:00") 
ORDER BY
	DATE_FORMAT(<datetime>,"%m/%d %H:00")
```

をいれてくださいね。

## 相性が良さそうなもの

`COUNT` : その時間帯に登録したユーザー,送られたメッセージなどをカウントする機会は多そう。

`BETWEEN <Aの期間>　AND　<Bの期間>`：特定の期間を指定したい機会はあるでしょう。等号/不等号もしかり。

`SUM(IF(条件,1,0))` : リリース後の影響を見る際などに、2パターンのデータとったりとかか使えそう。

# 実際に使えそうな形に成形

ユースケース：
・`messages`というメッセージ情報を保存するテーブル
・`created`というカラムにdatetimeの形(yyyy-mm-dd hh-mm-ss)でレコードが入る
・`deleted`というカラムで'0'は消えてない,'1'は消えている

⇒では、ここから特定期間の時間帯ごとの傾向を見てみる

```sql:
SELECT
	DATE_FORMAT(created,"%m/%d %H:00") AS created_time,
	SUM(IF(deleted = "0",1,0)) AS valid_messages,
	SUM(IF(deleted = "1",1,0)) AS invalid_messages,
FROM 
	messages
WHERE 
	created BETWEEN '2014-05-01' AND '2014-05-07'
GROUP BY
	DATE_FORMAT(created,"%m/%d %H:00") 
ORDER BY
	DATE_FORMAT(created,"%m/%d %H:00")
	 ;
```

全部適当に書いたｗ
なんかこんな感じで使えればm(_ _)m
CreateEvent ノードを使って、関数をイベントとして指定できるようにする

イベントディスパッチャーや Set Timer by Event ノードなどで引数として**「イベント」**を指定することがあります。

UE4 公式のドキュメントでは、**「カスタムイベントノードを作ってイベントを指定する方法」**が書かれていますが、これ以外にも**「CreateEvent ノードを使って、関数をイベントとして指定する方法」**があります。

# CreateEvent ノードを使う
**CreateEvent ノード**はブループリントエディタの右クリックメニューから作ることができます。CreateEvent ノードを作ると、以下のように何も指定できないノードができます。

![UE4_CreateEvent_01.jpg](https://qiita-image-store.s3.amazonaws.com/0/43814/fd97f69d-1146-1357-223e-51545b5af71c.jpeg)

これを右側にある Set Timer by Event ノードに繋げると……

![UE4_CreateEvent_02.jpg](https://qiita-image-store.s3.amazonaws.com/0/43814/35869c5f-0980-aed8-3278-eb0289248401.jpeg)

この通り、関数を選択できるようになります。

選択できる関数は、接続先のノードの仕様によって異なります。
例えば、この Set Timer by Event ノードの場合は、

* 引数なし
* 戻り値なし

の関数が選択できます。
（「戻り値あり」の関数も選択できますが、コンパイルすると警告が表示されますので、選択しないほうがいいです。）

# CreateEvent ノードを使うメリット
CreateEvent ノードを使うことで、以下の様なメリットがあります。

* イベントグラフ以外で引数にイベントを指定するノードが書けるようになる。
* ノードの整理がしやすくなる。
* 関数名のリネームがしやすくなる。<br>
(Set Timer by Function Name ノードのように関数名を文字列で指定する場合、関数名は自動でリネームされない。)
Laravel5で全レコードに対してSoft Deleteしたい

## Soft Deleteとは

Laravel5のEloquentにはSoftDeletesという、DBテーブルからデータを物理削除するのではなく論理削除を行う機能があります。

このSoft Deleteを行うと、テーブルからはデータが削除されずに残るのですが、通常のSELECTなどでは引っ張ってくることができないようになるため、削除したときと同じ挙動になります。
この機能により、一度削除した情報がふたたび必要になった時に抽出することができます。

## Laravel5におけるSoftDeletesの方法

1.モデルに以下のような記述を追加し、SoftDeletesを使えるようにします。論理削除された際は以下で指定したdeleted_atカラムにタイムスタンプがセットされます。

```php
use Illuminate\Database\Eloquent\SoftDeletes;

class User extends Eloquent {

    use SoftDeletes;

    protected $dates = ['deleted_at'];

}
```

2.対象のテーブルのカラムにdeleted_atを追加するために、マイグレーションファイルに以下の記述を追加します。

```php
$table->softDeletes();
```

これで準備は完了です。
あとはモデルに対してdeleteメソッドを実行すれば、Soft Deleteすることができます。

## 全レコードに対してSoft Deleteを行う

お待たせしました。タイトルの件についてです。
テーブルの全レコードを対象にSoft Deleteしたい時はどうしたら良いのか、調べてみてもあまりヒットしなかったので、備忘録的に以下にまとめます。
何かの参考になれば幸いです。

* deleted_atカラムがNULLになっているもの（すでにSoft Deleteされているレコードは除外）に対して実行する場合

```
ArticleDailyRanking::where('deleted_at', NULL)->delete();
```

* idカラムがNULLじゃない＝すべてのレコードに対して実行する場合

```
ArticleDailyRanking::whereNotNull('id')->delete();
```

## 参考記事
http://readouble.com/laravel/5/0/dev/ja/eloquent.html#soft-deleting
UnityとF#で機械学習④：k Nearest Neighbor (K近傍法）による画像分類

# はじめに
"F# for Machine Learning Essentials" (Sudipta Mukherjee 著　以下「原著」)　の第3章 "Classification Techniques"（分類法）では、機械学習でよく用いられる分類法をF#で記述する方法について説明されています。最初に出てくるのが、[以前にも紹介した](http://qiita.com/yanosen_jp/items/5cfbb0d3950c46ec9283) k-nearest neighbour(k近傍法）を用いた分類法です。

今回は、[Kaggleにある犬と猫の画像データ](https://www.kaggle.com/c/dogs-vs-cats/data)を用いて、犬と猫の分類を行います。分類法は単純で、犬と猫では毛の色の感じが違うので、写真の色の分布をヒストグラムにして、その形から分類する、というものです。顔の形とかは全く考慮しません。

# 参考資料

残念ながら、今回は原著のコードがネットに見当たりませんでした。フルコードをご覧になりたい方は、原著をご覧ください。

# ヒストグラム

原著では、以下の方法でヒストグラムを計算しています。

```fsharp:Library1.fs

    let getHist(values: float[]) = 
        values |> Seq.groupBy(fun color -> color)
               |> Map.ofSeq
               |> Map.map(fun t colors -> Seq.length colors)
               |> Map.toArray
               |> Array.map(fun colorCount -> float (snd colorCount))

```
`Seq.groupBy(fun color -> color)`において、`fun`はラムダ式を定義するためのキーワードです。`fun parameter-list -> expression`という形式をとります。`Seq.groupBy`は、ラムダ式でつくられるkeyをもとに、配列をグループ化します。[MSDNの例](https://msdn.microsoft.com/visualfsharpdocs/conceptual/sequences-%5bfsharp%5d)を挙げておくと。

```
    let sequence = seq { 1 .. 100 }
    let sequences3 = Seq.groupBy (fun index ->
                                    if (index % 3 = 0) then 0
                                      elif (index % 3 = 1) then 1
                                      else 2) sequence
```
この計算結果は、`(1, seq [1; 4; 7; 10; ...]) (2, seq [2; 5; 8; 11; ...]) (0, seq [3; 6; 9; 12; ...])`になります。

Seq.groupByのあとは、Map.ofSeqで配列からmapを生成し、Map.map...でmapのcolorsに対して配列の長さの計算を適用し、Map.toArrayで配列に戻したあと、snd でタプルの二番目の要素を取り出しています。


# Unityでの実行
[UnityでF#を実行する際の基本的な手順](http://qiita.com/yanosen_jp/items/74fe2b279aa2ff51858a)に従ってください。このサンプルでは、System.Drawingという名前空間を使うので、そちらもSolution ExplorerのReferenceフォルダを右クリックし、
![image](https://qiita-image-store.s3.amazonaws.com/0/58503/c1e1adc8-d053-06e9-e7f0-0886ab5b3bae.png)

Add Referenceを選んで、下図の通り、Assemblies/FrameworkタブのSystem.Drawingを選んでOK。

![image](https://qiita-image-store.s3.amazonaws.com/0/58503/f310290a-fc32-b21e-03f1-cde54b606607.png)

これで、Imageクラスなどが使えるようになります。

そして、いつも通り、namespaceとmoduleを指定します。

```fsharp:Library1.fs

  namespace kNNDogCat

  open System
  open System.IO
  open System.Drawing
  module kNNDogCatEntry = 
    type Entry = {Label:string;Values:float[]}

  \\ 以下略

```

あと、UnityでつかえるF#3.0ではList.itemが使えないので、List.nthで代用します。具体的には

```fsharp:Library1.fs
 \\ 略

  let guess1 = fst (List.nth labels1 0)

 \\ 略
```
のようになります。

また、原著では計算結果の表示はprintfnを使ってますが、ここでは、Unity側に出力しましょう。Unity C#のコードは以下の通りです

```csharp:ReadFSharp.cs
using UnityEngine;
using kNNDogCat;

public class ReadFSharp : MonoBehaviour
{
    void Start()
    {
        Debug.Log(kNNDogCatEntry.labels1);
        Debug.Log("The known dog is identified as a "+kNNDogCatEntry.guess1);
        Debug.Log(kNNDogCatEntry.labels2);
        Debug.Log("The known dog is identified as a "+kNNDogCatEntry.guess2);
    }
}
```
rename コマンドで Bareword "..." not allowed while "strict subs" in use at ... と怒られる場合の回避方法

環境は Mac OSX 10.11

```
rename s/hoge_hoge/fuga_fuga/g *.png
```
を実行すると

```
Bareword "th_festival" not allowed while "strict subs" in use at (eval 2) line 1.
```

アンダースコア"_"が文法エラーと怒られる

これを回避するには

```
rename s/hoge_hoge/fuga_fuga/g *.png
```

とすればよい。
（正規表現も使えるし今度からこっちを使おうかな・・・）
React Nativeでアニメーションさせる基本を理解する

React Nativeにおいて現時点でメジャーなAnimationの方法は２つあります。
https://facebook.github.io/react-native/docs/animations.html
AnimatedとLayoutAnimationです。

![ezgif.com-resize.gif](https://qiita-image-store.s3.amazonaws.com/0/29793/0f23e245-1464-8ae5-8c8c-38cb98f70f7f.gif)


### Animated
#### timing, spring, decay

変化させる変数を`new Animated.Value`で定義します。
`Animated.spring`などに上記変数を渡すことでアニメーションさせられます。

```
this.state = {
  yellowScale: new Animated.Value(1)
};

// ...

Animated.spring(
  this.state.yellowScale,
  {
    toValue: this._yellowScale - 0.1,
    friction: 1,
   }
).start();
```

- Valueの他にValueXYというものもあり、これはtranslateで位置を動かすときに使います。
- springの他にdecay, timingがある。timingにはeasingが渡せるので最もオーソドックスな方法だと思います。
- `new Animated.Value`で生成されたインスタンスは`addListener`メソッドを通して、変数の変化を取得できる。純増していくとか状態によってアニメーションを変える場合に使えそうです。

#### Interpolate

`new Animated.Value`で生成されたインスタンスはinterpolateメソッドを通して、値を別のレンジに割り当てて出力できます。これは1->100という数字の変化だけじゃなく、colorコードと角度に対応してます。

```
var color = this.state.backgroundColor.interpolate({
  inputRange: [0, 150, 300],
  outputRange: ['rgba(1, 87, 155, 1.0)', 'rgba(26, 35, 255, 1.0)', 'rgba(38, 50, 56, 1.0)']
});

var deg = this.state.whiteDegree.interpolate({
  inputRange: [0, 1],
  outputRange: ['0deg', '180deg']
});
```

#### sequence, parallel, stagger

複数のアニメーションを組み合わせる方法として`sequence`,`parallel`,`stagger`があります。
sequenceは順番にparallelは同時にstaggerは一定間隔で実行します。staggerの第一引数は間隔のミリ秒です。

```
Animated.sequence([
  Animated.parallel([
    Animated.timing(
      this.state.backgroundColor,
        {toValue: 300, duration: 2000}
    ),
    Animated.spring(
      this.state.whiteDegree,
      {toValue: 1, duration: 1500}
    )
  ]),
  Animated.parallel([
    Animated.timing(
      this.state.backgroundColor,
      {toValue: 0, duration: 2000}
    ),
    Animated.spring(
      this.state.whiteDegree,
      {toValue: 0, duration: 1500}
    )
])
```

### LayoutAnimation

Animatedを使わない方法として、LayoutAnimationがあります。
これは次の画面描画サイクルのアニメーションを指定するもので、
例えば、Viewのサイズを広げるstateの変化の前に宣言しとけば、
次の描画サイクルではAnimationが適用されアニメーションしながらViewが広がります。
シンプルなアニメーションしかしない場合には便利かもしれないです。

```
LayoutAnimation.spring();
this.setState({greenWidth: this.state.greenWidth + 20});
```

### さらにインタラクティブに

ここまでのものを駆使すれば、一方的な動きはある程度表現出来ると思います。
ユーザーの入力に応じてアニメーションさせる際に役立つものとして、`PanResponder`や`Animated.event`があります。長くなるので詳細は別の機会に残しときます。

### サンプル

背景と白い四角はAnimated.sequence, Animated.parallelを使って同時に動かし続けてます。
背景はinterpolateを使って色を変えてます。
startの引数にcallbackを渡すとアニメーション実行後呼ばれるのでローテーションさせられます。

緑の四角はLayoutAnimationを、黄色の四角はAnimateを使って動かしてます。

![ezgif.com-resize.gif](https://qiita-image-store.s3.amazonaws.com/0/29793/0f23e245-1464-8ae5-8c8c-38cb98f70f7f.gif)

コードはこちら
https://gist.github.com/imaimiami/dc90f6315c2964228de8bf3dd3722b3c

以上です。
ImageMagickの最新版をEC2にインストールする

ImageMagickのセキュリティの問題で、最新版をインストールする必要が出てきました。
意外とyumとかだとハマって面倒だったので、ソースをコンパイルしました。
例によってコマンドを書いておきます。(自分の覚書ですが…)
操作はrootになってからやっているので、rootになるのに抵抗があれば、sudoして下さい。
と言うかその方がいいのかな。

```
# cd /usr/local/src
# wget http://www.imagemagick.org/download/ImageMagick.tar.gz
# mkdir -p ImageMagick && tar xzvf ImageMagick.tar.gz -C ImageMagick --strip-components 1
# cd ImageMagick
# ./configure
# make
# make install
# sudo /sbin/ldconfig /usr/local/lib
# convert -version
```
最後のコマンドはバージョン確認です。
インストールには直接的には関係ないですが、念のため。

特定のバージョンをダウンロードしたい場合は[こちらから](http://www.imagemagick.org/)好きなバージョンを選んでダウンロードして下さい。
wgetの先を変えてもらって、tarの対象ファイルをダウンロードしたファイル名に変えてもらえれば、後は同じはず。
CakePHP3 フォームから入力した日付がおかしくなる

えらくハマりました...
CakePHP3.2.1～でのお話
config/app.phpの設定項目が微妙に変わってて、  そこに気づかずに苦しんだ...
  
## 問題
フォームから以下のようなデータをポストして
`'birthday' => '2016/05/17'`    

save時にpatchEntityすると、

```php
	'birthday' => object(Cake\I18n\FrozenDate) {
		'time' => '2184-12-05T00:00:00+00:00',
		'timezone' => 'UTC',
		'fixedNowTime' => false
	},
```
凄くタイプスリップした。

## 解決法
app.php

```php
    'App' => [
        ～省略～
        'defaultLocale' => env('APP_DEFAULT_LOCALE', 'en_US'),
        ～省略～
    ],
```

`en_US` を `ja-JP` で解決

### リリースノートはちゃんと読まないとね！（自戒
社内ライブラリをオープンソースしないデメリット・リスク


社内の再利用性のあるライブラリを、クローズドソースにする（オープンソースにしない）事には、デメリット・リスクがあるように思う。

※ 本稿は私の個人的な意見（ポエム）です。何らか、オーソライズされたものではありませんし、一般的な話でも無いと思います

ここでいう社内ライブラリとは？
------------------------

再利用性のあるライブラリで、社内で、複数のプロジェクトで使われている、または使われることを目指しつくられたものを示す事にします。


オープンソースにしないデメリット・リスク
------------------------------

### 機能・品質面で同種のオープンソースに負ける

社内で生じたニーズは、ほとんどの場合、一般的なニーズのはずです。そのため、同種のオープンソースがいつかは生じるものです。
そのニーズが一般的であるほど、オープンソースは、ユーザを集め、進化をします。そのため、どこかの時点で、オープンソースの方が、機能的にも品質的にも優位になる可能性があります。

もちろん、クローズドソースでも、優位性を維持でき、利益の源泉となる領域は存在します。そういった所でのみ、クローズドにすべきです。（これについては後述します）
その他の領域では、社内ライブラリの維持は、コストとみなされてしまい、進化が停滞します。

### 社外向けの教育コストで同種のオープンソースのライブラリに負ける

クローズドソースの場合、社内・協力会社・オフショアに対する教育コストを全て自社でおわなければなりません。また、社外に情報は無いため、契約後にしか、教育を開始することはできないという点もリスクになります。

一方で、オープンソースであれば、契約以前の、見積依頼の時点で、詳細な情報を提示できます。これは、受発注の双方にとって、教育コスト・期間削減のメリットを提供します。

また、オープンソースライブラリは、ユーザーが一定量増えると、サンプル・チュートリアルがネット上に勝手に公開される事もあるでしょう。これは、社内外の教育用リソースして活用でき、コスト低減につながります。
さらにメジャーなオープンソースライブラリでは、既にそのライブラリについて、知っている人に仕事をお願いできる可能性が高くなります。

コスト低減について書きましたが、ここで述べたいのは「オープンソースにすると教育コスト低減につながる」という事では無く、「社内ライブラリをコストを掛けて整備しても、オープンソースの方が教育面でメリットが大きいので、そちらが選択される」というリスクです。

### 開発環境・ツールで同種のオープンソースのライブラリに負ける

オープンソースのライブラリは、周辺の開発環境・ツールの進化が望めます。
たとえば、パッケージシステム（npmなど） に入っていると、環境構築が劇的に簡単になりますし、Scaffold システム(Yeomanなど)にテンプレートが作られると、プロジェクト開始のハードルが劇的に下がるなどの効果が期待できます。
また、利用している言語の、Lint/Hint システムなどの、静的解析ツールが対応してくれるかもしれません。

もちろん、上記のメリットは、それなりにユーザ数が増えないと期待できません。
しかし、クローズドのライブラリだと、上記の整備コストを全て自社で賄わなければならないため、「オープンソースの方が開発環境が整っているので、そちらが選択される」というリスクが生じます。

これらリスクは何が問題か？
---------------------

「オープンソースが選択される」という事がリスクと書いてきましたが、これがリスクとなるのは、それによって、結果的には社内ナレッジの分散が発生するためです。

前述の通り、社内ライブラリをがんばって整備しても、別のオープンソースライブラリが台頭してくると、新しい製品開発やバージョンの開発の時に、オープンソースライブラリを選択される可能性があります。

これは、一案件だけで見ると、問題はありませんが、社内で過去に収斂・集積してきたナレッジが不要になるという事を意味します。
ソフトウェア開発を主とする企業では、技術的優位性の確保が常に重要です。これは、社内で使うライブラリ・環境をある程度、統一する事によってナレッジを蓄積し、開発効率を上げることで、実現可能です。

この点は議論が分かれる点のはずですが、本稿を結論の方からまとめると、

「ソフトウェア開発企業の技術的優位性の確保のためには、開発に用いるライブラリをある程度統一し、ナレッジを蓄積することが重要である。そのためには、選択したライブラリの優位性ができるだけ長く確保される必要が有る。クローズドなライブラリは、オープンソースライブラリに比べ、優位性の確保が難しい場合が有る。」

という事です。ただし、全てのライブラリをオープンにする必要は無いはずです。

何をクローズドにすべきか
------------------

逆に、クローズドにすべきものも存在するはずです。

### 利益の上がるライブラリ

まず明確なのは、それ単体で利益の上がるライブラリは、クローズドでも問題がありません。
逆に、単体で利益が上がらないライブラリは、そのライブラリのメンテナンス費は追加コストと見られる場合があります。そのようなライブラリは、進化が停滞し、前述のようなリスクが発生します。

### プロダクトが長期にわたり存続し、それを支えるライブラリ

ライブラリ単体で利益が上がらなくても、それが特定のプロダクトを支えていて、その販売が長期に渡り存続する場合は、メンテナンス費用を捻出できます。
ライブラリは進化を続けていけるため、類似のものがオープンソースで生まれたとしても、優位性を確保できます。
また、少数のプロダクトに、長期に渡って使われるのであれば、載せ替えのコストの方が大きくなるため、オープンソースと比較して劣位になるということは少ないと思います。

逆に、1年〜2年ごとに、ほぼ１から作り直す必要のある種類のプロダクトを扱っている場合は、ライブラリのコストの捻出は、難しくなっていきます。これは、ウェブサイトや、スマホアプリに使われるライブラリが該当するでしょうか。

何を目指さなくて良いか
------------------

ここまで述べてきたことは、あくまで、リスク回避のためのオープンソース化を提言しています。
そのため、以下のような、いわゆる大成功を期待してはいません。

### 社外の Contributor が参加することで、タダで製品が進化する

そんな都合の良い事は、ほとんどの場合、おこりません。大部分のオープンソースライブラリは、最初の開発者しか Contirubution がない状況かと思います。（ただし、ごく少数のバグ報告・パッチは期待できますが。）


### 自社の宣伝になる

そこまで成功するオープンソースライブラリはごく一部です。これは、単に、「自社製品が売れるか？」という話と同じで、成功するには多大な努力とコストと運が必要となります。
provide関数とyield

provide関数（<% provide(:title, 'Home') %>）を使ってViewからLayoutにデータを引き渡すことができます。実際に各Viewに設定しています。

<% provide(:title, "Home") %>のようにviewに記述すると

layoutのapplication.html.erbなどに
<title><%= yield(:title) %> | サイト名</title>
と記述して呼び出せるようになる。

provide(あらかじめ準備して供給)したものをyield(生み出す)
Sinatraにseed-fuを求めるのは間違っているだろうか(Sinatraでseed-fuを使う方法)

## seed-fuとは何か
DBに初期データを投入するための仕組みとして、Rails(ActiveRecord)には`db:seed`というrakeタスクが用意されています。
このrakeタスクには冪等性がないため、実行するたびに新たなレコードが登録されます。そのため、変更が想定されるデータにおいては`db:seed`で投入する際に工夫が必要となります。

その煩雑さを解決する手段として登場するのが、[seed-fu](https://github.com/mbleigh/seed-fu)です。seed-fuでは更新されたレコードのみを操作します。つまり、値が変わったレコードは`UPDATE`され、追加されたレコードは`INSERT`されます。

## Sinatraで使う方法
この便利なseed-fuですが、Sinatraとの組み合わせで使う場合にひと手間必要となります。
Rails上での使用が前提とされているため、Sinatraにおいては自前でrakeタスクを定義する必要があります。

以下の`Rakefile`をルートディレクトリに配置します。

```rb
require 'sinatra/activerecord'
require 'sinatra/activerecord/rake'
require 'seed-fu'

namespace :db do
  task :seed_fu do
    SeedFu.seed
  end

  task :load_config do
    require './app/app' # FIXME ActiveRecordの設定を行っているファイルを指定します。環境に合わせてパスを修正してください。
  end
end

Rake::Task['db:seed_fu'].enhance(['db:load_config'])
```

これにより`rake db:seed_fu`を実行できるようになります。

## 参考リンク
[mbleigh/seed-fu - GitHub](https://github.com/mbleigh/seed-fu)
[sinatra-activerecord で seed_fu を使ってみた](http://blog.monora.me/2015/10/use-seed_fu-in-sinatra-with-sinatra-activerecord/)
エラーを読む大切さをわかりやすく伝えるためのアニgif作った

![blindprogrammer.gif](https://qiita-image-store.s3.amazonaws.com/0/54922/7628923f-bf18-c45c-ba38-4e2f298029a1.gif)
（※再生されないっぽいのでクリックして開いてね！）
だれかもっとかっこよくて気の利いたバージョン作ってください
git tagの使い方まとめ

tagの作成、確認、共有の手順メモ。
[ドキュメント](https://git-scm.com/book/ja/v1/Git-%E3%81%AE%E5%9F%BA%E6%9C%AC-%E3%82%BF%E3%82%B0)に細かく書いてあるが、**日常的に使うものだけ**を抜粋した。

# tagの**作成**
大前提として、**tagは特定のコミットに対して付与**される。
つまり、コミットを指定せずにtagをつけた場合は、**現在のブランチの最新のコミットに対して付与**される。

## コメント（注釈）付きの場合
```
git tag -a タグ -m 'タグのコメント'
```
例) git tag -a v1.4 -m 'my version 1.4'

-m を省略して実行するとエディタが立ち上がるので、そこで編集することも可能。
**タグ付けした人の情報・日時・コメント**も格納される。

## コメント（注釈）なしの場合

```
git tag タグ
```
例) git tag v1.4

コメント付きの場合と違い、**タグに関する情報は格納されない**。

## 後からtagをつける場合
```
git tag -a タグ -m 'コメント' コミット
```
例）　git tag -a v1.2 -m 'version 1.2' 9fceb02
tagを打ち忘れた場合でも大丈夫。
コミットを指定してtagを打てばいい。

# tagの**共有**
```
git push origin タグ名
```
例) git push origin v1.5

**tagは作成しただけではリモートには反映されない**のでpushしてやる必要がある。

# tagの**確認**
## 一覧の表示
```
git tag
```
tagのリストがアルファベット順に表示される。

```
git tag -l 'v1.4.2.*'
```
のように、パターンマッチで検索することも出来る。
## 特定のtagを確認
```
git show タグ名
```
例） git show v1.4

注釈なしで登録された場合は
・commit
・Merge
・Author: コミットを行った人
・Date: コミットが行われた日時
の情報が、

注釈ありで登録された場合は
・タグ付けした人の情報
・タグをつけた日時
・注釈メッセージ
が追加で表示される。

## タグの削除
### まだpushしていないtagの場合
```
git tag -d タグ名
```
で削除可能。

### 既にpushしたtagの場合
既にpushしたtagは**原則削除してはならない。**
どうしても削除したい場合は、別途下記を読んだ上で対応するのがよい。
[【git tag】プッシュしたtag名を削除・変更してはいけない理由〜manコマンドで読めるgitメンテナの怒り〜](https://qiita.com/growsic/items/60928fc67c9efe373a73)

## 参考書籍
[GitHub実践入門](https://amzn.to/2DEdyvG)
弊社での新卒エンジニア向け課題図書になった。
必要なコマンドを随時調べるのも良いけど、最初に一通り理解して置くとスムーズにいく。
C/C++で実行時に自身のプロセス名を取得する (Linux向け)

C, C++ で実行時に自身のプロセス名を取得する方法まとめ

```cpp:get_process_name.cpp
#include <iostream>
#include <cstdlib>
#include <errno.h>

extern char *__progname;

int main(int argc, char const* argv[])
{
        // argv[0]
        std::cout << "argv[0] : " << argv[0] << std::endl;

        // linux environment
        std::cout << "getenv(\"_\") : " << getenv("_") << std::endl;

        // libc
        std::cout << "__progname : " << __progname << std::endl;

        // errno.h
        std::cout << "program_invocation_name : " << program_invocation_name << std::endl;
        std::cout << "program_invocation_short_name : " << program_invocation_short_name << std::endl;

        return 0;
}
```

```shell-session:実行例
/tmp$ g++ get_process_name.cpp -o hoge && ./hoge
argv[0] : ./hoge
getenv("_") : ./hoge
__progname : hoge
program_invocation_name : ./hoge
program_invocation_short_name : hoge

/tmp$ g++ get_process_name.cpp -o hoge && $PWD/hoge
argv[0] : /tmp/hoge
getenv("_") : /tmp/hoge
__progname : hoge
program_invocation_name : /tmp/hoge
program_invocation_short_name : hoge
```

# 参考
[c - How to get current process name in linux? - Stack Overflow](http://stackoverflow.com/questions/9097201/how-to-get-current-process-name-in-linux)
リファクタリングとは

ソフトウェアの外部的振る舞いを保ちつつ、理解や修正が簡単になるように、内部構造を改善することです。 また、リファクタリングは非常に統制された方法でコードを洗練していくため、バグの入り込む余地が少なくなっています。

こまめにリファクタリングを繰り返してコードを常にすみずみまで美しくコンパクトに保ち、他の開発者や未来の自分の開発意欲を阻喪することのないようにしなければなりません。
DELL製Windows Serverのサービスタグをコマンドにて確認する手順

目的
---
DELL製Windows Serverにおいてサービスタグをコマンドプロンプトから確認する方法があるため、実際に試した。

手順
---
>コマンドプロンプトにて以下のコマンドを実行するとサービスタグが確認出来る。

>```
C:\Users\Administrator>wmic bios get serialnumber
SerialNumber
FCCC9C2
```

引用元:http://www.dell.com/support/article/us/en/04/SLN268357/JA

利用環境
---
Dell PowerEdge Server
Windows Server 2012 R2 Standard
職場Python環境

個人環境のメモです。

Windows10 Home
---
**Python3**

公式サイトのAnaconda3-4.0.0をバイナリインストール

この時点でコマンドプロンプトでpython3.5.1が確認できる。

netCDF4モジュールをインストール

```
>anaconda search netCDF4
色々出るが、anacondaでインストールしたのでanacondaで統一する
>anaconda show anaconda/netcdf4
のメッセージに従いインストール（バージョン指定の仕方は不明）
>conda install --channel https://conda.anaconda.org/anaconda netcdf4
```

この状態でanaconda navigatorのJupyterを起動するとPython3でnetCDF4モジュールがimport出来る。

---
**Python2.7**

basemapモジュールを使ってみたかった。（Python3は未対応らしい）

anaconda navigatorのEnvironmentsのタブでCreateボタンを押して仮想環境の名前とPythonのバージョンを指定できる、適当に名前を付けてPython2.7を選択する。


出来上がった仮想環境をクリックすると右矢印マークがあるのでそこをクリックする
Open Terminal
Open with python
Open with Ipython
Open with Jupyter notebook
と4つタブが出る。

ここで選ぶだけでJupyter notebookが起動してpython2.7が使えれば良かったのだがここでは起動してくれない。（Homeタブからは起動するがPython3のみ）

Open Terminalを選択して**仮想環境上**で必要なモジュールをインストール

```
>conda install --channel https://conda.anaconda.org/anaconda netcdf4
>conda install --channel https://conda.anaconda.org/anaconda basemap
>conda install notebook ipykernel
>ipython kernel install --user
```

3行目と4行目が肝でanaconda navigatorのHomeタブのJupyterを起動して
Python2とPython3が選べるようになった。
Django プロジェクトの外のバッチスクリプトから Django の機能を使う

Django で、バッチ処理を行いたい時は、マネジメントコマンドを書きますよね。

でも、マネジメントコマンドを書くほどでもないバッチ処理がたまにあります。
書き捨てのデータマイグレーションスクリプトとか。
トラブル調査のためだけの集計ツールとか。

そんな時、マネジメントコマンドとして登録しなくても、Django プロジェクトの外に置いた Python ファイルから、Djangoの機能にアクセスできます。

このようなスクリプトを用意しておきます。

```python:django_setup.py
"""
django_setup() を実行すると、Django の機能(モデルのインポートなど)が使えるようになる。
"""

import os
import sys
import django


def django_setup():
    os.environ.setdefault(
        'DJANGO_SETTINGS_MODULE', 'myapp.settings')
    base_dir = os.path.dirname(os.path.dirname(os.path.dirname(__file__)))
    sys.path.append(os.path.join(base_dir, 'myproject'))
    django.setup()
```

要は、Django のプロジェクトルート ( ./manage.py のある所 ) を `sys.path` に追加し、**`django.setup()`** を実行すれば良いです。

独自の設定ファイルを使っている場合は、環境変数 `DJANGO_SETTINGS_MODULE` に指定しておきましょう。

`__file__` を `os.path.dirname` で辿ったりしてますが、このへんはお使いの環境で適宜変更してください。
base_dir が、Django プロジェクト (myproject) の 「1つ上」のディレクトリの想定です。

こうすれば、書き捨てのスクリプトなどで

```py
from django_setup import django_setup


def main():
    from myapp.models import MyModel
    
    for item in MyModel.objects.filter(...):
        ...

  
if __name__ == '__main__':
  django_setup()
  main()
```
このように、Django プロジェクト内の機能にアクセスすることができます。
次はWEBデザイナーがGulp+Compass+Sassでコーディング作業効率の良い環境を作ってみた[Mac]

#はじめに
[前回はGruntで環境を作った](http://qiita.com/yancharica/items/dda81bad9156478d1eef)が今回はGulpで。

## なぜGulpなのか
Gruntと並んで使用されているため比較としてやってみる。

## 目的
* WEBデザイナーがhtml、cssコーディング作業をするときに少しでも無駄を減らしたい
* WEBデザイナーが感じる「環境をつくるということの心の壁」を乗り越えたい
* なんか新しいことやってみたい

#すること
* タスクスタート時ブラウザ自動オープン
* ファイル更新時ブラウザ自動更新
* sassからcssへの自動コンパイル
* ローカルでHTTPサーバー起動

#Nord.jsインストール

http://nodejs.jp/

#Nord.jsの確認
インストールできたかバージョンチェックで確認

`$ node -v`

#Sassインストール

`$ gem install sass`

#Compassインストール

`$ gem install compass`

#作業フォルダをつくる
こちらが今回の最終的な構造

```
project
    ├index.html
    ├stylesheet
    │  └style.css            
    ├sass
    │  └style.scss              
    ├node_modules
    │└gulp
    │└gulp-compass
    │└gulp-webserver
    │└gulp-plumber
    ├config.rb
    ├package.json
    └Gulpfile.js
```
以下をまず作っておく。ほかは自動で作られる。

```
project
    └index.html
```

以下からprojectディレクトリで作業する

#Gulpインストール
`$ npm install gulp --save-dev`

#package.jsonをつくる
`$ npm init`
いろいろ聞かれるがEnter連打でOK

#npmパッケージインストール
Compassタスク
`$ npm install gulp-compass --save-dev`

HTTPサーバー起動タスク
`$ npm install gulp-webserver --save-dev`

エラー時監視続行タスク
`$ npm install gulp-plumber --save-dev`
※sassのコンパイル中にシンタックスエラー時に監視が止まってしまうのを防止するため導入。こちらはなくても良い。

#Compass実行
`$ compass create`

エラー出たら

`$ rbenv rehash`

#Gulpfile.jsの作成
こちらは手作業。。

```Gulpfile.js
var gulp = require('gulp');
var compass = require('gulp-compass');
var plumber = require('gulp-plumber');
var webserver = require('gulp-webserver');

// webserver
gulp.task('webserver', function () {
    gulp.src('.') 
        .pipe(webserver({
            host: 'localhost',
            port: 8000,
            livereload: true
        }));
});

// compass
gulp.task('compass', function(){
    gulp.src('sass/**/*.scss')
    .pipe(plumber())
    .pipe(compass({
        config_file: 'config.rb',
        comments: false,
        css: 'stylesheets/',
        sass: 'sass/'
    }));
});

//watch
gulp.task('watch', function(){
  gulp.watch('sass/*.scss',['compass']);
});

gulp.task('default', ['watch' ,'webserver']);
```
#Gulp 実行

`$ gulp`

#確認

こちらへアクセス
http://localhost:8000/

Done!!

#まとめ感想

Gruntと比較して
・ファイルが少ない
・jsのコード書くの少ない
と思ったのは最初だけで、[Grunt](http://qiita.com/yancharica/items/dda81bad9156478d1eef)と特に変わらず。
おそらく便利なプラグインの多さなどで決まるだろうが、、WEBデザイナー視点ではどっちもどっち。
開発メンバーが採用したほうでおこなう、が良し。
テストを先に書くべきか後回しにすべきかの基準

「テスト駆動(最初に「正しいコードがないと失敗するテスト」を書き、次に本編のコードを書いてそのテストがパスするようにする)」にするか「一括テスト」にするかを決める目安となるガイドラインがあると便利です。

・アプリケーションのコードよりも明らかにテストコードの方が短くシンプルになる (=簡単に書ける) のであれば、テストを先に書けるようになることを目指す。

・期待している動作がまだ固まりきっていないのであれば、先にアプリケーションのコードを書き上げ、続いて期待する動作をテストコードで記述することを目指す。

・セキュリティが最重要課題であれば、セキュリティモデルでエラーが発生した場合のテストを最初に書くべき。

・バグを見つけたら、そのバグを再現するテストを真っ先に書き、回帰バグを防ぐ体制を整えてからアプリケーションのコードの修正に取りかかる。

・将来変更の可能性が少しでもあるコード (HTML構造の細部など) があれば必ずテストを書く。

・リファクタリングの前には必ずテストを書き、エラーを起こしそうなコードや、特に止まってしまいそうなコードを集中的にテストする。
swift2.0 background teach

タイマーを作成しているのですが、バックグラウンドに入ると処理が止まるので、
background fetchを使ったところ180秒で止まってしまう。
これ以上のバックグラウンドでの処理は不可能なのか知りたく初投稿してみました。


やりたい事
1、NSTimerを作成し、1秒おきに処理を進めます。
2、バックグラウンドでも処理は続きます。
3、指定時間になった時に、音とアラートを表示

何か助言いただけると幸いです。
ssh-keygenのメモ

| オプション | 意味 |
|:-----------|:------------|
| -f | ファイル名の指定 |
| -N | パスフレーズ指定。空文字(""など)でパスフレーズ無し |
| -t | 暗号化方式。rsaなど |
| -b | 鍵の長さ。鍵長。4096など |
| -C | コメント |

# こんな使い方
手元で対象ホスト名で鍵を作成して、公開鍵を作成。表示。

```bash
$ export HOSTNAME=example.com ;\
 ssh-keygen -f ~/.ssh/$HOSTNAME -N '' ;\
 cat ~/.ssh/$HOSTNAME.pub
```

リモートホストで鍵の束に登録してchmodなど。

```bash
$ mkdir ~/.ssh/ ;\
 cat > ~/.ssh/authorized_keys ;\
 chmod 700 ~/.ssh/; chmod 0600 ~/.ssh/*
```

# 所感
ファイル名=ホスト名って扱いやすいけどファイルが漏れるだけでかなり危険。
リスクと利便性をちゃんと考えましょう。
SystemdでSSHのLocalForwardをサービス化


systemdを使って、SSHのLocalFowardの接続をサービス化する。
再起動時の自動接続や、接続が切れた場合の再接続ができるようになる。

# Unit設定ファイルの作成

```ini:/lib/systemd/system/forward-example.service
[Unit]
Description=Forward Example
After=network.target

[Service]
#User=ubuntu # ユーザ指定したい場合
ExecStart=/usr/bin/ssh -NT -o ServerAliveInterval=60 -o ExitOnForwardFailure=yes -i /path/to/identity -L 8080:localhost:80 user@host

RestartSec=3 # 3秒ごとに再接続
Restart=always

[Install]
WantedBy=multi-user.target
```

# SSHコマンドのオプション

## -N

コマンドを実行せず、ポートフォワードのためだけに接続する

## -T

pseudo ttyを割り当てない

## -o ServerAliveInterval=60

接続が切れることを回避するため、60秒に1回サーバにkeep-aliveを送る

## -o ExitOnForwardFailure=yes

フォワードに失敗した場合にexitさせる。
これによりフォワードだけが失敗した場合でもsystemdが再起動してくれる。

# Unitの読み込み

```
sudo systemctl daemon-reload 
```

# サービスの有効化

再起動時に自動実行されるようになる。

```
sudo systemctl enable forward-example
```

# サービス開始

```
sudo service forward-example start
```
【SQL問題03】入会者数と退会者数を日付ごとに集計

http://qiita.com/jnchito/items/1d21fa3970b3c76bee43
【SQL腕試し問題！】入会者数と退会者数を日付ごとに集計するSQL
をOracle11gR2で解きました。

図でイメージするOracleのSQL全集の第8回 PivotとUnPivotの
7 UnPivotの使い方
http://www.oracle.com/technetwork/jp/articles/otnj-sql-image8-1869574-ja.html#g
を見ながら作りました。

```sql
with users(ID,joined_on,left_on) as(
select 1,date '2014-08-01',date '2014-08-10' from dual union
select 2,date '2014-08-01',date '2014-08-05' from dual union
select 3,date '2014-08-03',NULL              from dual union
select 4,date '2014-08-03',date '2014-08-10' from dual union
select 5,date '2014-08-10',NULL              from dual)
select Days,
sum(IsJoin) as joined_count,
sum(decode(IsJoin,0,1,0)) as left_count
  from users UnPivot(Days for IsJoin in(joined_on as 1,
                                        left_on   as 0))
group by Days
order by Days;

Days        JOINED_COUNT  LEFT_COUNT
----------  ------------  ----------
2014-08-01             2           0
2014-08-03             2           0
2014-08-05             0           1
2014-08-10             1           2
```

応用問題は、分析関数のSum関数を使うだけですね

```sql
with users(ID,joined_on,left_on) as(
select 1,date '2014-08-01',date '2014-08-10' from dual union
select 2,date '2014-08-01',date '2014-08-05' from dual union
select 3,date '2014-08-03',NULL              from dual union
select 4,date '2014-08-03',date '2014-08-10' from dual union
select 5,date '2014-08-10',NULL              from dual)
select Days,
sum(IsJoin) as joined_count,
sum(decode(IsJoin,0,1,0)) as left_count,
sum(sum(IsJoin) - sum(decode(IsJoin,0,1,0)))
over(order by Days) as user_count
  from users UnPivot(Days for IsJoin in(joined_on as 1,
                                        left_on   as 0))
group by Days
order by Days;

Days        JOINED_COUNT  LEFT_COUNT  USER_COUNT
----------  ------------  ----------  ----------
2014-08-01             2           0           2
2014-08-03             2           0           4
2014-08-05             0           1           3
2014-08-10             1           2           2
```
【SQL問題02】締め切り日が近いイベントの一覧

http://qiita.com/jnchito/items/7d5d7e829690ea3c4d6f
【SQL腕試し問題】締め切り日が近いイベントの一覧の取得するSQL
をOracle11gR2で解きました。

```sql
with events(id,name) as(
select 1,'Completed event'   from dual union
select 2,'No schedule event' from dual union
select 3,'Continuing event'  from dual union
select 4,'Future event 1'    from dual union
select 5,'Future event 2'    from dual),
schedules(id,event_id,due_date) as(
select 1,1,date '2014-01-23' from dual union
select 2,3,date '2014-01-01' from dual union
select 3,3,date '2014-02-01' from dual union
select 4,3,date '2014-03-01' from dual union
select 5,4,date '2014-01-24' from dual union
select 6,4,date '2014-01-25' from dual union
select 7,5,date '2014-01-24' from dual),
sysdate_dummy(sys_date) as(
select date '2014-01-24' from dual),
tmp as(
select a.id,a.name,b.ID as schedule_id,b.due_date,
count(b.event_id) over(partition by a.id) as JoinCnt,
min(case when b.due_date >= (select max(sys_date) from sysdate_dummy)
         then b.due_date end)
over(partition by b.event_id) as SaisyouJyoukai
  from events a
  Left Join schedules b
    on a.id = b.event_id)
select id,name,schedule_id,due_date
  from tmp
 where JoinCnt = 0
    or due_date = SaisyouJyoukai
order by due_date,schedule_id;

ID  NAME               SCHEDULE_ID  DUE_DATE
--  -----------------  -----------  ----------
 4  Future event 1               5  2014-01-24
 5  Future event 2               7  2014-01-24
 3  Continuing event             3  2014-02-01
 2  No schedule event         null  null
```
HandsontableとChart.jsでWebでExcelとグラフを表現する

# 目的

ExcelライクなUIとグラフを表示したいという相談があったのででとりあえず簡単なコンセプトコードをかいたぞ。

## Handsontable

HandsontableなるExcelっぽい見た目や操作感を表現できるJavaScriptライブラリ。
[Handsontable](https://handsontable.com/)
非常に細かい操作感がExcelライクに実装されており、なんとなく適当に触っただけで

* シート内でのコピー＆ペースト
* tabやenterによるセル移動
* Excelからのコピー＆ペースト
* F2を押したらセルにフォーカスが移動する

など細かい挙動が実現できる。
それに加えて、OpenSourceエディションであればMITライセンスなので自由に使える。

## Chart.js

最近バージョンが2.0にあがっておしゃれになった気がするライブラリ
[Chart.js](http://www.chartjs.org/)
今回は棒グラフの表示に使う。
こちらもMITライセンスなので安心して利用できる。

# 実装

[つくったもの](https://jsbin.com/futoqododa/1/edit?js,output) 
[gist](https://gist.github.com/anonymous/78efd5555940b031c11938908d24154a)

ソース内で大事なのは、棒グラフの更新時に適切に更新しないと、棒グラフをマウスオーバーした時に更新前のグラフが見えるなどの挙動をします。

今回は、グラフの更新の際にdestroyとnewをしています。（適切かどうかは判断しかねますが自然に動作はします。）

# 注意点

* 見た目はもうちょっと検討の余地あり。（グラフの棒全部同じ色だし）
* 大きなデータセットで動くかは未確認。
【SQL問題01】現在の部署に所属する社員の一覧

http://qiita.com/jnchito/items/29e22cc5a73da29f65a3
【SQL腕試し問題】現在の部署に所属する社員の一覧を取得するSQL
をOracle11gR2で解きました。

```sql
with employees(id,name) as(
select 1,'John' from dual union
select 2,'Mary' from dual union
select 3,'Tom'  from dual),
section_histories(employee_id,start_date,section_name) as(
select 1,date '2013-01-01','Sales' from dual union
select 2,date '2013-01-01','IT'    from dual union
select 3,date '2013-01-01','IT'    from dual union
select 1,date '2014-01-01','IT'    from dual union
select 2,date '2014-01-01','Sales' from dual),
tmp as(
select employee_id,start_date,section_name,
max(start_date) over(partition by employee_id) as MaxStartDate
  from section_histories)
select a.id,a.name,b.section_name,b.start_date
  from employees a
  Join tmp b
    on a.id = b.employee_id
 where b.start_date = b.MaxStartDate
   and b.section_name = 'IT'
order by a.id;

ID  NAME  SECTION_NAME  START_DATE
--  ----  ------------  ----------
 1  John  IT            2014-01-01
 3  Tom   IT            2013-01-01
```
pbzip2 のインストール（と速度比較メモ）


## インストール

```
$ wget -q https://launchpad.net/pbzip2/1.1/1.1.13/+download/pbzip2-1.1.13.tar.gz
$ tar zxf pbzip2-1.1.13.tar.gz
$ cd pbzip2-1.1.13
$ make
$ mv pbzip2 ../../bin
$ mv pbzip2.1 ../../share/man/man1/
```

pigz に関しては、[こっち](http://qiita.com/bunzaemon/items/91f6681498403289091c)

## 速度比較

対象 19G

```
$ ls -lh test/
合計 17G
-rwxr-xr-x 1 bunzaemon wheel 8.4G  3月 24 17:56 XXXX_R1_001.fastq
-rwxr-xr-x 1 bunzaemon wheel 8.4G  3月 24 17:57 XXXX_R2_001.fastq
```

### 圧縮

#### gzip

```
$ time tar -czf test1.tar.gz test

real    25m7.279s
user    25m0.571s
sys     0m28.705s
```

#### pigz

```
$ time tar -cf test2.tar.gz test  --use-compress-program=pigz

real    1m44.431s
user    27m29.231s
sys     0m17.186s
```

#### bzip2

```
$ time tar -cjf test1.tar.bz2 test

real    31m58.804s
user    31m39.180s
sys     0m23.891s
```

#### pbzip2

```
$ time tar -cf test.tar.bz2 test  --use-compress-program=pbzip2

real    2m8.139s
user    33m11.678s
sys     0m52.146s
```

### 解凍

#### gzip

```
$ time tar xzf test1.tar.gz

real    2m16.619s
user    2m12.263s
sys     0m19.514s
```

#### pigz

```
$ time tar -xf test2.tar.gz test  --use-compress-program=pigz

real    1m6.249s
user    1m25.253s
sys     0m22.869s
```

#### bzip2

```
$ time tar xjf test1.tar.bz2

real    11m29.571s
user    11m21.948s
sys     0m33.843s
```

#### pbzip2

```
$ time tar -xf test2.tar.bz2 --use-compress-program=pbzip2

real    1m7.773s
user    13m25.331s
sys     0m51.292s
```

### ファイルサイズ

```
$ ls -lh *tar*
-rw-r--r-- 1 bunzaemon wheel 3.7G  3月 24 18:08 2016 test1.tar.bz2
-rw-r--r-- 1 bunzaemon wheel 5.1G  3月 24 19:26 2016 test1.tar.gz
-rw-r--r-- 1 bunzaemon wheel 3.7G  3月 24 19:35 2016 test2.tar.bz2
-rw-r--r-- 1 bunzaemon wheel 5.1G  3月 24 19:32 2016 test2.tar.gz
```
同時に開けるファイル数


ちょっと前、`Compress::Zlib` の `gzopen` が失敗する件で `perl` が原因かと思って、悩んでた。
その時は、他の方法で回避したものの、思い出したので、メモ。

原因は、ファイルディスクリプタの数の上限に引っ掛かったから。

## ファイルディスクリプタの数

```
% ulimit -n
256
% mkdir tmp
% cd tmp
% perl -le 'my %f ; open $f{$_}, ">", $_ or die $_, $! for 0 .. 255'
253Too many open files at -e line 1.
% perl -le ' my %f ; $f{$_} = gzopen( "$_.gz", "wb") or die $_, $! for 0 .. 256' -MCompress::Zlib 
253Too many open files at -e line 1.
```

0,1,2 は、それぞれ、STDIN, STDOUT, STDERR に割り振られてるから、合ってる。

```
% ulimit -n 1024
% perl -le 'my %f ; open $f{$_}, ">", $_ or die $_, $! for 0 .. 255'
%
```


## 恒久的に変更する

ユーザー単位で、恒久的に変更させるお手軽な方法は、`*shrc` に、

```
ulimit -n 512
```

もちろんスクリプト自体に埋め込んでも。

```
% cat test.pl
ulimit -n 24
perl -x $0
exit;

#!/usr/bin/env perl
my %f;
open $f{$_}, '>', $_ or die join "\t", $_, $! for 0 .. 30 ;
```

```
% sh test.pl
21     Too many open files at hoge.pl line 3.
% perl -x test.pl
%
```

## 蛇足

### fileno

ファイルハンドルが開けてるかの、真偽判定だけに使いがちだが、本来、ディスクリプタ番号を返すもの。

```
% perl -le 'my %f ; open $f{$_}, ">", $_ and print fileno $f{$_} or die $_, $! for 0 .. 255'
```
MacからWindowsへリモートデスクトップ接続したとき、バックスラッシュを使えるようにする

### 2018/4/14更新

KarabinerがHigh Sierraでは利用出来ないため、Karabiner-Elementsで同様の問題を対応させる方法について
https://qiita.com/KNaito/items/e4436cb73f9ff257394d
に記述しました。

### 問題

現状の最新版であるMicrosoft Remote Desktop 8.0.31でMacからWindows 10に
接続したときに、Mac側で¥キーを入れても、Windows側では¥にならず、未定義文字の
ような扱いになってしまう。
Mac側で\を入れた場合でも、Windows側では¥にならない。

### 解決法

Mac側にKaribinerをインストールする

https://pqrs.org/osx/karabiner/index.html.ja

(AXNotifierは使わなくてOK）

起動したら、Preferenceを開き、misc & uninstallから、Open private.xmlを選択
（参考：https://pqrs.org/osx/karabiner/document.html#privatexml ）

テキストエディタでprivate.xmlを開き、つぎのようにする

    <?xml version="1.0"?>
    <root>
        <item>
          <name>Change yen to backslash</name>
          <identifier>windows.rdp.yen_2_backslash</identifier>
    <!--      <only>REMOTEDESKTOPCONNECTION</only> -->
          <autogen>
            __KeyToKey__
            KeyCode::JIS_YEN,ModifierFlag::NONE,KeyCode::VK_JIS_BACKSLASH
          </autogen>
        </item>
    </root>

（Chrome Remote Desktopでも使うので、REMOTEDESKTOPCONNECTIONはコメントアウトしたが、
コメントアウトしなくてもよいのかも）

これで、リモートデスクトップで外部Windowsに接続したときに、¥入力で¥が入力される。
Mac上でも、¥入力で¥が入力され、\入力(alt+¥)で\が入力される。

Karibinerは、Macリブート時にも自動で起動してくれるので、特に設定はいらない。

### 補足

Windows 10にリモートデスクトップしたときに、英語キーボード扱いになってしまうのは解決
できなかった。自分の環境では、Windows 10にローカルログインした状態でリブートすると、
日本語キーボードとして認識され、その後リブートしなければ、外部から英語キーボードで
ログインしても日本語キーボードのままだった。
リモートキーボードのデバイスドライバを更新して106キーボードにしても解決しなかった。

また、自分の環境は、Mac、Windowsともに日本語キーボードを利用。どちらかがUSキーボード
の場合、今回の方法ではうまくいかないかも。
Rでヒストグラムを描く（ラベルについて補足）

[前回の記事](http://qiita.com/nishi_bayashi/items/acc3a346df7b7d893f75)で2つのヒストグラムを重ねてそれぞれのバーの上にラベルを表示させるということをしました。
(↓こんなの)

![image](https://qiita-image-store.s3.amazonaws.com/0/61492/c70bf78d-fdd3-ec41-35ea-b6151ed0aeab.png)


しかし、このラベルの位置は「data1のデータ量分（counts）をy軸方向にオフセット」ということをしているので、常にdata1のほうがdata2より大きい場合はいいのだが、data1よりdata2のほうがcountsが大きい場合はそうもいかない。

![image](https://qiita-image-store.s3.amazonaws.com/0/61492/9bc8656d-3753-fc98-9049-214b67728b0d.png)

このようにdata2の方が大きい場合でもdata1分のcountしかオフセットされないので、バーの中にラベルが入ってしまう。
やっぱりdata1の方が大きいバーはdata1のcounts分、data2の方が大きい場合はdata2のcounts分オフセットされたい。

そこで新しくラベルのオフセット用のベクトルデータを作成する。

`hoge <- c()`
data1のヒストグラムもdata2のヒストグラムもそれぞれ作成した際に戻り値が手に入る。
戻り値のうち、それぞれのバーのデータの数は＄countsに入っていると前述した。
data1とdata2のcountsは以下のとおりである。
data1＄counts
 [1]  37 157 313 445 472 354 230 131  71  36  12   1   2   0   0   0
data2＄counts
 [1]   0   3   7   5  19  39  69  97 105  96  73  70  50  31  24   9

これらを比較して、高い値の方を新規で作成したラベル用ベクトルに格納すればよい。

比較はforとifでおこなった

```
for (i in 1:k){
	if (data1$counts[i] >= data2$counts[i])
	hoge[i] <- data1$counts[i]
	else
	hoge[i] <- data2$counts[i]
}


```
1行目：以下の作業をk（ヒストグラムの階級数）回繰り返す
2行目：data1のcountsの[i]個目がdata2のcountsの[i]個目より同じかそれ以上のとき
3行目：ベクトルhogeの[i]個目にdata1のcountsの[i]個目の数字を格納
4行目：そうでない場合
5行目：ベクトルhogeの[i]個目にdata2のcountsの[i]個目の数字を格納



という具合。（他に賢い方法があるかと思いますが）

hogeを確認してみると
 
 [1]  37 157 313 445 472 354 230 131 105  96  73  70  50  31  24   9
きちんと多きほうの数字が格納されているようだ。
あとはtextをその数字分y軸方向に動かしてやればご覧のとおり
![image](https://qiita-image-store.s3.amazonaws.com/0/61492/70dc9891-9485-b259-4412-12cf01b50078.png)

ちゃんと値が高いほうのバーにあわせてラベルが表示されました。
ルーター技術まとめ

# ルーターとハブの違い
OSI参照モデルで，物理層，データリンク層のみのサポートがハブ．ルーターはそれより高次のネットワーク層，トランスポート層をカバーする．

# ルーターの機能
## NAT設定
### IPマスカレード
IPマスカレードは，ポート指定を含めたNATであり，指定のIPアドレス，ポートから来た通信を指定のIPアドレス，指定のポートに送り先を書き換える．
優先度があるため，サーバダウンの冗長性として使用可能．
jQuery bxsliderを使ってページ内にパワポのスライドショーを表示する簡単な方法

①表示したいパワポを「画像で保存」して1スライドずつ画像で保存する

②以下サイトの方法でスライドのみのページを作る
http://fukafuka295.jp/hp/hp_no3.html

↓こんな感じ
※「auto: true,」について、「true」の後をセミコロン「;」にしないように注意
※li内のimgが左に寄ってしまうのでstyleで真ん中に持ってくる
```



	<head>
		<!-- bxsliderのファイル読み込み -->
		<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
		<script src="js/jquery.bxslider.min.js"></script>
		<link href="css/jquery.bxslider.css" rel="stylesheet"/>
		<!-- bxsliderの呼び出し -->
		<script type="text/javascript">
	        $(document).ready(function(){
	            $('.bxslider').bxSlider({
	                mode:'fade',
	            });
	        });
		</script>
	</head>
	<body>
			<ul class="bxslider">
				<li><img src="slide/1-1/slide01.jpg" width="720px" height="540px" style="margin:auto;left:0;right:0;"></li>
				<li><img src="slide/1-1/slide02.jpg" width="720px" height="540px" style="margin:auto;left:0;right:0;"></li>
				<li><img src="slide/1-1/slide03.jpg" width="720px" height="540px" style="margin:auto;left:0;right:0;"></li>
				<li><img src="slide/1-1/slide04.jpg" width="720px" height="540px" style="margin:auto;left:0;right:0;"></li>
				<li><img src="slide/1-1/slide05.jpg" width="720px" height="540px" style="margin:auto;left:0;right:0;"></li>
				<li><img src="slide/1-1/slide06.jpg" width="720px" height="540px" style="margin:auto;left:0;right:0;"></li>
				<li><img src="slide/1-1/slide07.jpg" width="720px" height="540px" style="margin:auto;left:0;right:0;"></li>
				<li><img src="slide/1-1/slide08.jpg" width="720px" height="540px" style="margin:auto;left:0;right:0;"></li>
				<li><img src="slide/1-1/slide09.jpg" width="720px" height="540px" style="margin:auto;left:0;right:0;"></li>
				<li><img src="slide/1-1/slide10.jpg" width="720px" height="540px" style="margin:auto;left:0;right:0;"></li>
				<li><img src="slide/1-1/slide11.jpg" width="720px" height="540px" style="margin:auto;left:0;right:0;"></li>
			</ul>
	</body>




②スライドを表示したいページにiframeを記述して、src属性に上記ページのURLを指定する
↓こんな感じ
※高さは元ページのスライドの高さに合わせる(デベロッパーツールで確認)
`
<iframe src="slideshow.html" seamless width="720px" height="610px"></iframe>
`
NodeOSを試す

リリースされたので、取り敢えず試してみようということで使ってみましたが、今の所ファイル作成もエディタもやり方不明という惨状、、、

何はともあれやったことだけまとめてみます

# 公式サイト

https://node-os.com/

# dockerでインストール

dockerに入れるのが簡単そうだったので、取りあえずdockerで入れてみました。

```bash
$ docker pull nodeos/nodeos
$ docker run -i -t nodeos/nodeos:latest
loopback device not activated
----> starting init
      bind: 127.0.0.1
      port: 1
      boot: 0
----> starting first runner
      exec: nsh
      args: []
      cwd : /
```

# ちょっと操作してみる

取り敢えずlsしてみました。

```bash
/ ＄ ls
[ '.dockerenv',
  '.dockerinit',
  'bin',
  'dev',
  'etc',
  'lib',
  'lib64',
  'npm-debug.log',
  'proc',
  'root',
  'sbin',
  'share',
  'sys',
  'usr' ]
```

なんとなくjson的な表示になりました

# パッケージインストール

manがインストール可能っぽかったので、manをインストール

```bash
/ $ npkg install bin-man
```

manが使えるように

# ファイル作成とかエディタとか

これが見当たらない、、、

取り敢えず無理矢理ファイル作ってみましたが、どうやってやればいいのやら。
関数作って即時実行させないと出来なかったので即時関数で、、、

```bash
$ node
> var fs = require("fs");
> (function test() {
... fs.appendFile('test.txt', "aaa" ,'utf8', function (err) {
...    console.log(err);
... });
... })();

null

$ ls
[ '.dockerenv',
  '.dockerinit',
  'bin',
  'dev',
  'etc',
  'lib',
  'lib64',
  'npm-debug.log',
  'proc',
  'root',
  'sbin',
  'share',
  'sys',
  'usr',
  'test.txt' ]
```

取り敢えずパワープレーでファイルができた模様

---

う〜ん、まだいまいちよくわからない、、、
ドキュメントもほぼないし、取り敢えず色々漁ってみようと思いますorz
ScalaのREPLからJDBCを使って対話的にMySQLを操作する

#背景
Play2/Scala 開発環境を作っていて、MySQL JDBCドライバーを経由してローカルマシンのMySQLに接続しようとしたが、上手くいかない。
原因箇所が、
* ライブラリの依存関係不足
* JDBCの設定ミス
* MySQL側の設定や状態がおかしい
と３つあり、変更する箇所を迅速に切り替えつつ、効率的に問題の切り分けをしたかった。
REPLから対話的にJDBCを経由して、MySQLへの接続を試すのが、最も効率的と思い、やってみました。
# Scala REPLから対話的に使う
まず、MySQLドライバーを[ダウンロード](https://dev.mysql.com/downloads/connector/j/)し、そのjarファイルをロードしながらScalaのREPLを立ち上げます。
> $ scala -classpath PATH_TO/mysql-connector-java-5.1.39-bin.jar 

ScalaのREPLが立ち上がりました。
> scala>

JDBCをimportします。
> scala> import java.sql.{Connection, DriverManager, ResultSet};
> import java.sql.{Connection, DriverManager, ResultSet}

MySQLのJDBCドライバーをロードします。
> scala> classOf[com.mysql.jdbc.Driver]
> res0: Class[com.mysql.jdbc.Driver] = class com.mysql.jdbc.Driver

接続情報を設定します。
> scala> val conn_str = "jdbc:mysql://localhost:3306/some_database?user=root&password=''"
> conn_str: String = jdbc:mysql://localhost:3306/some_database?user=user_name&password=some_password

接続します。
> scala> val conn = DriverManager.getConnection(conn_str)
> conn: java.sql.Connection = com.mysql.jdbc.JDBC4Connection@32709393

これで接続されました。
あとは、JDBCのコードを対話的にかけます。

> scala> val statement = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY)
> scala> val rs = statement.executeQuery("SELECT * FROM some_table LIMIT 5")

Scalaといいながら、Javaのライブラリを使っているので、90%位はJavaそのものです。

接続を閉じます。
> scala> conn.close

ちなみにこの結果、build.sbt上の依存ライブラリの記述に原因があることが迅速にわかりました。今回は、開発環境上で行いましたが、テスト環境上での問題切り分けにも有効ですね、REPL。

# その他応用
ScalaからJavaのライブラリが使えることを利用して、REPLで簡単に対話的にライブラリの動作を確認できました。。

その後、調べて、[Java REPL](http://www.javarepl.com/console.html)もあることを確認。一般的にJava界では、コードやライブラリを対話的に試すっていう感覚が少ないですよね。
自分もRubyとJavaを行ったり来たりしてたのに、これまでJavaでは対話的にコードを触ろうという発想がなかった(固定観怖い)。なので、スクリプト言語では当たり前の対話的な実行方法で、Javaのライブラリを対話的に触れる、というのはすごく新鮮、かつ地味に便利なのではないかなと思い記録
[CSS] z-index とスタックコンテキスト

`z-index` を使って要素の重なりを制御するとき、何も考えずに適当に `z-index: 100;` などと指定したりしていませんか？ このあたりの仕組みをよく理解せずに `z-index` を濫用していると、いつか怪奇現象に見舞われてつらいことになるかもしれません。

## 怪奇現象の例
早速ですが、以下のコードを御覧ください。

``` html:html
<div class='boxes'>
  <div class='box1'>
    .box1 { z-index: 1 }
  </div>
  <div class='box2'>
    .box2 { z-index: 2 }
    <div class='box3'>
      .box3 { z-index: 0 }
    </div>
  </div>
</div>
```

``` css:css
.boxes {
  color: white;
  position: relative;
}
.boxes div {
  width: 10em;
  height: 10em;
  position: absolute;
}
.box1 {
  background-color: red;
  top: 0;
  left: 0;
  z-index: 1;
}
.box2 {
  background-color: green;
  top: 3em;
  left: 3em;
  z-index: 2;
}
.box3 {
  background-color: blue;
  top: 3em;
  left: 3em;
  z-index: 0;
}
```

これをブラウザで開くとどのように表示されるでしょうか？
`z-index` の値を見た感じでは、 box2 > box1 > box3 の順番で重なって表示されそうですね。

しかしこれは以下のように表示されます。

![](https://qiita-image-store.s3.amazonaws.com/0/16369/17bce190-0ca9-2555-5358-8e9875d44b4d.png)

`z-index` が一番小さいはずの box3 が最前面に表示されています。これは何故でしょうか。

## スタックコンテキスト
CSS には**スタックコンテキスト(スタック文脈)**という概念があります。

スタックコンテキストは、ある特定の要素をベースとした子孫要素の集合です。
html 要素は初期状態でルートスタックコンテキストを生成しているため、すべての要素は何らかのスタックコンテキストに所属しています。

スタックコンテキストを生成しうる「ある特定の要素」は、いくつかあるのですがひとつだけ挙げると

- 「`position` が `static` 以外」かつ「`z-index` が `auto` 以外」である要素

です。
要するに、「`z-index` を有効にした要素はスタックコンテキストを生成する」ということです。

上記の例で言うと、box1, box2, box3 はすべてスタックコンテキストを生成しています。

**[2022.06 追記]**
`isolation` を使ってスタックコンテキストを生成することもできるらしいです。
https://developer.mozilla.org/ja/docs/Web/CSS/isolation

## z-index とスタックコンテキスト
`z-index` の値は**スタックレベル**と言い、要素の重なる順番を表すプロパティですが、実はこれは**所属するスタックコンテキスト内での**順番を指定するものです。

|class|z-index|スタックコンテキスト|重なり順のイメージ|
|---|---|---|---|
|.box1|1|html (root)|root > 1|
|.box2|2|html (root)|root > 2|
|.box3|0|**.box2**|root > 2 > 0|

`.box3` のスタックレベルは 0 ですが、 `.box3` は `.box2` のスタックコンテキストに所属しているため、**`.box2` のスタックコンテキストに所属している要素集合の中でのスタックレベルが 0 である**、ということです。

そのため、最終的な重なり順は box3 > box2 > box1 となるわけです。

## まとめ
`z-index` の値が同じでもスタックコンテキストによって重なり順序が変わることがあるので、スタックコンテキストを意識してスタイルを書いていけると良さげ ₍₍⁽⁽(ી( ･◡･ )ʃ)₎₎⁾⁾

## 参考
- [スタック文脈 - Web developer guide | MDN](https://developer.mozilla.org/ja/docs/Web/Guide/CSS/Understanding_z_index/The_stacking_context)
- [要素の重なりについて本気出して考えてみた（z-indexとか何とかとか） – No.1026](http://no1026.com/archives/104)
CakePHP3のpatchEntitiesの使いどころについて

# CakePHP3のpatchEntitiesの使いどころについて

[Cookbook3](http://book.cakephp.org/3.0/ja/core-libraries/validation.html#id12)を見てイマイチ使い方が分からなかったので調べてみました。  
結論を先に書くと、複数レコードのデータを一括でpatchしてくれるものだった（entitiesと複数形になっているくらいだからそりゃそうだ）

# 早速使ってみる

## 今回用意したDBテーブル

![01.png](https://qiita-image-store.s3.amazonaws.com/0/25290/6af3b89b-3a65-b76f-14c0-edc08529b215.png)
※postgreSQLです

## Postデータを作る画面

![02.png](https://qiita-image-store.s3.amazonaws.com/0/25290/d1f77dba-d27e-b969-55f8-910e4da57236.png)

## ブラウザの開発者ツールで見るとこんな感じ

![03.png](https://qiita-image-store.s3.amazonaws.com/0/25290/c22d43b9-6234-8263-9f69-289b3a11f2fd.png)

※name属性が配列になっていて、1年分ということで12個あることになります。

## Postされるデータの確認

`patchEntities` に引数として渡すので先に中身を確認

```
dump($this->request->data);
```

![04.png](https://qiita-image-store.s3.amazonaws.com/0/25290/a71ea676-364d-352e-dc98-bf29becc6e10.png)

## 問題のpatchEntitiesを使ってみる

こんな感じで使う  

```
$entities = $table->patchEntities($entities, $this->request->data('MonthlyMarks'));
```

・args1：entityの配列データ
・args2：postの配列データ


## ちゃんとバリデーションもやってくれます

![05.png](https://qiita-image-store.s3.amazonaws.com/0/25290/e0d760a4-2ea6-ff0d-6bd2-3a535ad16518.png)

レコード単位で処理してくれます。
凄い便利！


## 折角なのでpatchEntitiesされたentitiesをSaveしてみる

`patchEntities`をした次の行に記述

```
if ($table->saveMany($entities)) {
    $this->Flash->success(__d($pluralar, 'The {0} has been saved', __(Inflector::camelize($pluralar))));
    return $this->redirect(['action' => 'index']);
}
$this->Flash->error(__d($pluralar, 'The {0} could not be saved', __(Inflector::camelize($pluralar))));
```

## 何してくれてるの？

端的に言うと`patcheEntities`が`Entity`単位で処理してくれます。（複数形だか（ｒｙ
そして`patchEntities`されたものを最終的に`saveMany`で一括保存してます。
（CakePHP2のSaveAllみたいなことができます）

## 動かない場合は

`patcheEntities`の引数がミスっている。

・args1：`entityの配列構造`になっていること
・args2：`postデータがpatchできる配列構造`になっていること

この辺を確認してみましょう。


## まとめ

複数レコードの一括保存があった場合は`patchEntities`と`saveMany`を使いましょう。