OmniAICreator/Qiita-1.07M huggingface dataset:
継承を捨てよう！

#初めに
継承ではなくインターフェースで行こうという話
(ボロカスに叩かれてもいいかなって言う気持ちで)

#インターフェースと継承
そもそも、インターフェースと継承って何でしょうか。
一言で言うと、あるオブジェクト/クラスに対して「この機能(メソッド)がある」「このパラメータ(メンバ)がある」ということを**保証する**システムです。
つまり、本質的には同じです。

#違い
同じと言っても少しだけ違いがあります。とはいえ、どちらが得意かというだけの違いでしかありません。
継承では実装の無いのメソッド(純粋仮想関数)以外は実装を強制させられません。一方でインターフェースは宣言したメソッドすべての実装がありません。したがって、インターフェースを実装したクラスはそのインターフェースで宣言したメソッドを全て実装する必要があります。
つまり、継承はインターフェースに対して「すでに実装したコードをサブクラス側で記述する必要が無い」と言うメリットがあります。

#ならインターフェースを使おうよ
しかし、この継承の「実体のあるメソッドをサブクラスのインスタンスを用いてコールできる」と言う点が問題を複雑化させます。
複数のクラスを継承(多重継承)したときに、メソッド名とシグネチャが衝突した場合に問題が起こってしまうのです（いわゆるダイヤモンド継承の問題）。
しかし、インターフェースは異なるインターフェース間でメソッドとシグネチャが衝突しても、実装は各クラス側に委ねられているので、実体が一つとなり、この問題が発生しません。
まとめると

継承：多重継承の問題があるけど、サブクラス側でいちいちメソッドを実装しなくていいよ。
インターフェース：多重継承の問題は無いけど、各クラスでいちいちメソッドを実装しないといけないよ。

と、言うことになります。一長一短で、どちらの短所についても本質的な解決は難しいですが、インターフェースの場合はこの短所をかなり軽減することが出来る方法があります。

#解決策
解決策は非常に簡単で、外部のクラスにメソッドの実装を委譲してしまえばいいのです。そして、外部のクラスのメソッドではダメな場合は必要に応じて各クラスに応じた処理を実装すればいいわけです。
ちょうどこんな感じですね
![InterFaceSample.png](https://qiita-image-store.s3.amazonaws.com/0/123981/6792c045-878b-8d63-98a8-12464ed6ff99.png)


こうしておけば、実際の標準的な処理をだらだらと複数のクラスにわたって記述することが無くなります。
継承において標準的な処理を1か所にまとめるのは本質的には保守性の観点からの要請なわけですから、この実装方法の場合、継承と比べて保守性が低下することはありません。

##メンバ変数もインターフェース
メンバ変数もインターフェースに落とし込むことが出来ます。もちろん、通常のインターフェースでもメンバ変数を宣言できますが、その際の制約は複数のインターフェース間でメンバ変数の名前が衝突してはいけないということです(これは継承でも同じですが)。そこで、ゲッターとセッターをインターフェースで用意します。こうすることで各インターフェースを実装する個別のクラス側で制御することが出来るようになります。
![InterFaceSample2.png](https://qiita-image-store.s3.amazonaws.com/0/123981/e205c089-f214-f055-11e4-c90622507fc4.png)

#このあたりで
小ネタなので、この辺で終わりです。
モダンCPU命令のクロックサイクル数

Infographics: Operation Costs in CPU Clock Cycles - IT Hare on Soft.ware
http://ithare.com/infographics-operation-costs-in-cpu-clock-cycles/
より。

![image](https://qiita-image-store.s3.amazonaws.com/0/79394/0aa7cf56-aa16-b950-9c68-d364f1d8d7c3.png)

対象アーキテクチャはx86/x64。データは末尾のReferenceにある論文などから取ったのだろう。その中でも最高のリファレンスと言われている[Agner4]は293ページの巨大な一覧表だ。
http://www.agner.org/optimize/instruction_tables.pdf

- C++の例外のコストは大きい。昔の家庭用ゲームでは例外は使わないとされていたのもむべなるかな
- メモリの書き込みは完了する前に次の命令へ進めるから1クロックで済むというのは恥ずかしながら知らなかった
- コンテキストスイッチもやはりコスト大。システムコールは必ずコンテキストスイッチを伴うものだと思っていたけどKernel callとThread context switchがほぼ同コストになっているのはどういうことだろう
- RAM読み込みは予想通りに遅い
- 関数呼び出しもそれなりにかかるので昔は再帰が遅いと言われていたのもわかる
- 分岐予測失敗（branch misprediction）のペナルティはもっと大きいのかと思っていた
- 整数の割り算がすごく遅い（足し算、引き算に比べると。掛け算と比べても遅い）

---
こんなデータも。出典はGoogleの Jeff Dean が発表した資料らしい。
https://gist.github.com/jboner/2841832

```
L1 cache reference                           0.5 ns
Branch mispredict                            5   ns
L2 cache reference                           7   ns                      14x L1 cache
Mutex lock/unlock                           25   ns
Main memory reference                      100   ns                      20x L2 cache, 200x L1 cache
Compress 1K bytes with Zippy             3,000   ns        3 us
Send 1K bytes over 1 Gbps network       10,000   ns       10 us
Read 4K randomly from SSD*             150,000   ns      150 us          ~1GB/sec SSD
Read 1 MB sequentially from memory     250,000   ns      250 us
Round trip within same datacenter      500,000   ns      500 us
Read 1 MB sequentially from SSD*     1,000,000   ns    1,000 us    1 ms  ~1GB/sec SSD, 4X memory
Disk seek                           10,000,000   ns   10,000 us   10 ms  20x datacenter roundtrip
Read 1 MB sequentially from disk    20,000,000   ns   20,000 us   20 ms  80x memory, 20X SSD
Send packet CA->Netherlands->CA    150,000,000   ns  150,000 us  150 ms
```

---

[プログラマが知っておくべき、メモリ/ディスク/ネットワークの速度まとめ - Qiita](http://qiita.com/awakia/items/c8ada6c8101efe2de561)
いよいよ「クロージャとは何か」という質問に答えよう。(読書メモ)

　JavaScriptの「クロージャ」の定義を　[クロージャを一言で表すと (読書メモ)](http://qiita.com/junykt68/items/58ea6085e1304c025836)　にてメモしましたが、今読み進めている別の良書でも見つけたので、こちらも備忘のため書き写しておきます。

　以下のサンプルコードおよび説明は、オライリー刊[シングルページWebアプリケーション](https://www.oreilly.co.jp/books/9784873116730/) P.60 第2章 2.6.3.1 「クロージャとは」からの引用です。

```JavaScript
var prison = (function() {
    var prisoner = 'Josh Powell';

    return {
        prisoner: function() {
            return prisoner;
        }
    }
})();

//「Josh Powell」と出力する
console.log(prison.prisoner());
```

> いよいよ「クロージャとは何か」という質問に答えよう。クロージャは、変数を作成した実行コンテキスト外から変数にアクセスできるようにしておくことで、ガベージコレクタがメモリから変数を削除しないようにするプロセスである。クロージャは、prisonオブジェクトにprisoner関数を格納したときに作成される。（ガベージコレクタがprisoner変数を削除するのを防ぐ） 現在の実行コンテキスト外からのprisoner変数への動的アクセスを伴う関数を格納することで、クロージャは作成される。
Travis CIでbundle updateを実行し、Pull Requestを作成するGemを作った

# travisci-bundle-update-pr

https://rubygems.org/gems/travisci-bundle-update-pr

* Travis CIでbundle updateを実行し、Pull Requestを作成する。

# GitHub Personal access tokens

* [GitHub Personal access tokens](https://github.com/settings/tokens)を取得する。
* Travis CIの環境変数に、`$GITHUB_ACCESS_TOKEN`を設定する。
    * [Defining Variables in Repository Settings](https://docs.travis-ci.com/user/environment-variables/#Defining-Variables-in-Repository-Settings)
* または`$GITHUB_ACCESS_TOKEN`を暗号化した値を`.travis.yml`に記述する。

```
$ gem install travis  
$ travis encrypt GITHUB_ACCESS_TOKEN=secretvalue  
```

```yaml:.travis.yml
env:
  global:
    - secure: ".... encrypted data ...."
```

# 使い方

```yaml:.travis.yml
$ gem install travisci-bundle-update-pr
$ travisci-bundle-update-pr TravisCI travisci@example.com master target_path
```

* 第1引数
    * gitユーザー名
* 第2引数
    * gitメールアドレス
* 第3引数
    * プルリクエスト先ブランチ
    * 省略した場合、`master`
* 第4引数
    * Gemfileパス
    * 省略した場合、カレントディレクトリ

# Cron Jobs

* Travis CIの[Cron Jobs](https://docs.travis-ci.com/user/cron-jobs/)はデフォルトでは使えない。
* サポートにメール問い合わせすることで使えるようになる。
    * support@travis-ci.com
* 設定内容
    * Branch
    * Interval
        * monthly
        * weekly
        * daily
    * Options
        * Always run
        * Only run if no new commits

* Travis CIのCron Jobsを使って、実行する場合

```yaml:.travis.yml
before_script:
  - if [ "${TRAVIS_EVENT_TYPE}" = "cron" ]; then gem install travisci-bundle-update-pr; travisci-bundle-update-pr TravisCI travisci@example.com master; fi
```
iOS10のpushでaps-environmentがdevelopに変わっちゃう問題


iOS10のpush NotificationsをONにするとentitlement.plistのaps-environmentがデフォルトでdevelopになってしまう

##リリースするときは？
リリースするときはこれをproductionにする
![スクリーンショット 2016-09-12 17.54.50.png](https://qiita-image-store.s3.amazonaws.com/0/64331/fd21f7e8-85a0-ef52-9fad-540b256717f6.png "スクリーンショット 2016-09-12 17.54.50.png")

するとPush Notificaionsのところが以下のようなエラーに
![スクリーンショット 2016-09-12 17.55.02.png](https://qiita-image-store.s3.amazonaws.com/0/64331/c419e588-15cb-32dc-0b69-751722463a8e.png "スクリーンショット 2016-09-12 17.55.02.png")

ちなみにFix Issueを押したりON -> OFF -> ONにしてもdevelopになります。


productionにして申請をしてtestflightで確認したところプッシュは無事届きました。

このエラーはこのままでいいのかそれともうまく直るようになるのか詳細がわかったら追記します。
iOS10でウィジェットのデザインが崩れる問題の対処法


iOS10のウィジェットがそのままでは高さ固定になって崩れてしまう。


対処法
ウィジェットを広げるボタンを追加する

以下実装

##swift
viewDidLoadとかに
     
```
self.extensionContext?.widgetLargestAvailableDisplayMode = NCWidgetDisplayMode.Expanded
```


```
func widgetActiveDisplayModeDidChange(_ activeDisplayMode: NCWidgetDisplayMÓode, withMaximumSize maxSize: CGSize) {
    if (activeDisplayMode == NCWidgetDisplayMode.compact) {
        self.preferredContentSize = maxSize;
    }
    else {
        self.preferredContentSize = CGSize(width: 0, height: 200);
    }
}
```

##objective-c
viewDidLoadとかに

```
[self.extensionContext setWidgetLargestAvailableDisplayMode:NCWidgetDisplayModeExpanded];
```

```
- (void)widgetActiveDisplayModeDidChange:(NCWidgetDisplayMode)activeDisplayMode
                         withMaximumSize:-(CGSize)maxSize
{
    if (activeDisplayMode == NCWidgetDisplayModeCompact) {
        self.preferredContentSize = maxSize;
    }
    else {
        self.preferredContentSize = CGSizeMake(0, 200);
    }
}
```

これで広げてデザイン崩れを防げます:muscle:
【Laravel4.2&Mac】$_ENVが空っぽで読めなくなった...。


# 概要
Mac上でLaravel4.2のプロジェクトをクローンして

```
php artisan serve
```

でビルトインサーバしようとしたところ、

```
{"error":{"type":"ErrorException","message":"Undefined index: 〇〇","file":"path/to/app/config/app.php","line":20}}%
```

というエラーが出てきた。

プロジェクトは開発環境と本番環境用でそれぞれenvがあり、
`bootstrap/start.php`でそれらを分けている状態でした。

$_ENVをvar_dumpしてみるとarray(0)と書いてあったので、そもそも読めてないみたいです。

# 解決?

* http://stackoverflow.com/questions/23882856/laravel-4-database-configuration-with-env
* http://culttt.com/2014/04/07/working-configuration-laravel-4/

を参考見てみたところ、
どうやらホスト名ベースの名前はUnix系のシステムでしか動作しないらしいので、
MacのPC名を調べ、`bootstrap/start.php`へPC名の記述を追加したところ、
動作しました。

```
$ uname -n
MY_PC_NAME
```


```php:env
$env = $app->detectEnvironment(array(

    'local' => array(...., 'MY_PC_NAME'),
```

まだまだLaravelの使い方がわかっていないので、
こういったenvのところで困らないようになりたいです...。
sort > link > 8項目程度のソート > 挿入ソートを薦めるのが多い

8項目程度をソートする場合、どれがいいのだろうか。

stackoverflowにて以下を見つけた。
http://stackoverflow.com/questions/2748749/fast-algorithm-implementation-to-sort-very-small-list

アルゴリズムのシンプルさなども考慮して、挿入ソートが良いという回答が多い。

項目数が固定であればそれに最適なソートがある、というJustin Peelの回答も興味深い。
Highstockレンジセレクターを選択できない時のメモ


以下の3Mのようにデータ量に応じで押せるボタン、押せないボタンをHighstockがよしなに制御してくれる。

<img width="675" alt="スクリーンショット 2016-09-13 18.53.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/15637/7fb3498d-6347-6541-0016-705bad7c373c.png">


なのでデータ量によっては6Mしか押せないケースとかあり、「気持ち悪いから全部押せるようにして」とか言われちゃうことがある。

`rangeSelector.allButtonsEnabled: true` で押せるようになるけど、押しても当然機能しなくて「バグ？」とか言われちゃうこともあるので注意が必要。
Ruby で全角英数字を半角英数字に変換する

全角英数字だけではなく、半角カタカナなど文字種の揺れを修正したい。

Moji モジュールを利用してみる。
  ・namespace gimite
  ・Ruby小物集
  ・Moji モジュール
サンプル
Windows XP 上で実行。文字コードを変換しているのは、コマンドプロンプトに実行結果を表示させるため。

コード sample.rb

$KCODE = 'u';

require 'moji'
require 'nkf'

string = 'ＡＢＣＤＥＦＧ－！？ kakikukeko　あいうえおｱｶｻﾀﾅ１２３４５６'

str_1 = Moji.zen_to_han(string, Moji::ZEN_ALPHA)
puts NKF.nkf('-s', str_1)

str_2 = Moji.han_to_zen(str_1, Moji::HAN_KATA)
puts NKF.nkf('-s', str_2)

str_3 = Moji.zen_to_han(str_2, Moji::ZEN_ASYMBOL)
puts NKF.nkf('-s', str_3)

str_4 = Moji.zen_to_han(str_3, Moji::ZEN_NUMBER)
puts NKF.nkf('-s', str_4)
実行結果。

C:\>ruby "test.rb"
ABCDEFG－！？ kakikukeko　あいうえおアカサタナ１２３４５６
ABCDEFG－！？ kakikukeko　あいうえおアカサタナ１２３４５６
ABCDEFG-!? kakikukeko あいうえおアカサタナ１２３４５６
ABCDEFG-!? kakikukeko あいうえおアカサタナ123456
DatePickerがModalDialogの裏で表示されてしまう

BootStrapのDatePickerのプラグインがModelDialogで表示する時以下のような状態になってしまうと思います。

![スクリーンショット 2016-09-13 16.45.43.png](https://qiita-image-store.s3.amazonaws.com/0/139068/9bb6b9c7-9ded-4a0d-8f72-7e7535d118a4.png)

なぜか意外にDialogの裏で表示されてしまったのかと考えてみるとz-orderのせいかと思いました。Dialogのcssを修正するのではなくてdatepicker3.cssを以下のように修正してみたら表示が正しくなりました。

```CSS
.datepicker {
  padding: 4px;
  border-radius: 4px;
  direction: ltr;
  /*.dow {
		border-top: 1px solid #ddd !important;
	}*/
   z-index:9999 !important /*追加する*/
}
```

修正した結果：

![スクリーンショット 2016-09-13 16.50.59.png](https://qiita-image-store.s3.amazonaws.com/0/139068/b8b3741d-326c-0a8c-9c11-5a1caf9fef90.png)

以上です。
Terraform使ってEC2インスタンスにエフェメラルディスクを追加するぞい！

## About
エフェメラルディスクを使いたいという話があったので、Terraformでやってみました！

## エフェメラルディスクについて
### これは何？

こちらから引用

>Ephemeral Diskとは、インスタンスストア(Instance Store)とも呼ばれる、揮発性のストレージです。揮発性なので、EC2インスタンスを停止するとデータは削除されます。
EC2インスタンスが稼働する物理ホストのディスクアレイの一部を切り出してアタッチするので、ネットワーク経由でアタッチされるEBSと比較して速度が早いという特徴があります。そして何より、利用料金はEC2インスタンスのランニングコストの中に含まれているため、実質追加コストなしで使うことが出来るので非常にお得なのです。
上記の特性より、Ephemeral Diskはworkerなどで処理用の一時データを置いておく場所として最適です。消えちゃ困るデータの長期保存はEBSですね。

http://blog.serverworks.co.jp/tech/2014/11/28/use-ephemeral-disk-as-swap/

### 利用用途
* swap
* 消えてもよい大きめのデータ
* 速度が求められるデータ

### 使う上での注意
* 利用できるインスタンスタイプに制限がある。
http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/InstanceStorage.html

* 再起動によってデータは消える。

## 追加するぞい！

こんな感じです。

```
resource "aws_instance" "web-1c" {
    ami = "${var.web_ami}"
    instance_type = "m3.medium"
    key_name = "${var.key_name}"
    security_groups = ["${aws_security_group.web.id}"]
    subnet_id = "${aws_subnet.1c-public.id}"
    iam_instance_profile = "${var.project_name}-instance"
    count = 1
    root_block_device {
        delete_on_termination = "true"
    }
    ebs_block_device {
        device_name = "/dev/xvdb"
        volume_type = "gp2"
        volume_size = "16"
    }
    ephemeral_block_device {
        device_name = "/dev/xvdc"
        virtual_name = "ephemeral0"
    }
    tags {
        Name = "${var.stage}-web"
        Project = "${var.project_name}"
        Stage = "${var.stage}"
        Roles = "app,web"
    }
}
```

ephemeralディスクは設定が間違っていなければ、cloud-initによって自動で`/mnt`にマウントされました。

番外編としてebs_block_deviceの追加を試してみたところ、volumeはattachされてますが、自動でfilesystemの作成、マウントはされなかったのでcloud-initとかでやればいいのかなと思います。
全角英数字及び空白文字を半角に変換する方法

全角英数字と全角スペースを半角に変換したくMojiを使ってみたのですが
http://gimite.net/gimite/rubymess/moji.html

全角スペースも対応させるための適切な文字種分類が見つけられませんでした。

全角英数字に関しては

Moji.zen_to_han(str, Moji.ALNUM)
で期待通りの変換が行えています。Moji.SYMBOLでは長音記号ーなどまで半角化されてしまうため

Moji.zen_to_han(str, Moji.ALNUM).gsub("　"," ")
で全角スペースを半角スペースに変換していますが、せっかく全角半角の変換ためのGemを使っているのに二度手間のような気がします。

もっと良い対応方法はあるでしょうか？


回答

ライブラリを使うと便利ですが、細かい動きを制御しようと思うととたんに面倒くさくなったりします。
（Railsを使うときに「レール」にちゃんと乗らないと実装が複雑になるのも同じですね。）
ご質問の件も「全角英数字と全角スペースだけを半角変換したい」というのがユースケースとしてやや特殊なので、ライブラリにどうにかしてほしいと願うのはちょっと厳しそうです。

こちらのページに Moji を使わずにRubyだけで変更する方法が載っていました。

http://qiita.com/y-ken/items/17181f322d0413edd3dc#comment-0e29423fc28020a63133

これを参考にするとこんなふうに実装できます。

require 'minitest/autorun'

def zen_to_han(str)
  str.tr("０-９Ａ-Ｚａ-ｚ　", "0-9A-Za-z ")
end

class ZenToHanTest < Minitest::Test
  def test_zen_to_han
    assert_equal "ABCabc 123", zen_to_han("ＡＢＣａｂｃ　１２３")
    assert_equal "あいうえお123－456", zen_to_han("あいうえお１２３－４５６")
  end
end
これであれば比較的自由に全角半角変換のルールを制御することができます。
Moji.zen_to_han(str, Moji.ALNUM).gsub("　"," ") と比べてシンプルかどうかは微妙かもしれませんが、変換の自由度が高くなるというメリットはあるかなと思います。
Oracle Database の SELECT文・SAMPLE句が、BLOCK句有り／無し で 読込量 が 全く異なる。

表題の通り、Oracle Database の SELECT文 の SAMPLE句が、
BLOCK句有り／無し で 読込量 が 全く違うんやで。知らんかった。。。彡(ﾟ)(ﾟ)

- SAMPLE句無し の 場合

```sql
SET AUTOTRACE TRACEONLY;
SELECT /*+ FULL(A) CACHE(A) */ COUNT(*) FROM TEST_TABLE_A A;
：
Statistics
----------------------------------------------------------
：
       8841  consistent gets
          0  physical reads
：
```
　

- SAMPLE句有り、BLOCK句無し の場合

```sql
SET AUTOTRACE TRACEONLY;
SELECT /*+ FULL(A) CACHE(A) */ COUNT(*) FROM TEST_TABLE_A SAMPLE(1) A;

：
Statistics
----------------------------------------------------------
：
       8702  consistent gets ★SAMPLE句無しと余り変わらない。
          0  physical reads
：
```
　

- SAMPLE句有り、BLOCK句有り の場合

```sql
SET AUTOTRACE TRACEONLY;
SELECT /*+ FULL(A) CACHE(A) */ COUNT(*) FROM TEST_TABLE_A SAMPLE BLOCK(1) A;
：
Statistics
----------------------------------------------------------
：
        144  consistent gets ★ブロック読込量が圧倒的に少ない。
          0  physical reads
：
```

まとめると

　・BLOCK句無しのSAMPLE句の動作
　　⇒ テーブルを全ブロック読み込んで、そこからレコードをサンプリングして返す。

　・BLCOK句有りのSAMPLE句の動作
　　⇒ テーブルを読む段階でブロックをサンプリングして(絞り込んで)、
　　　絞り込んだブロックのレコードを返す。

と云う動作になるんやね彡(ﾟ)(ﾟ)

ちな BLOCK句付きのSAMPLEは、今回対象にした表では件数のバラ付きが多かったです。

```sql
SELECT /*+ FULL(A) CACHE(A) */ COUNT(*) FROM TEST_TABLE_A SAMPLE BLOCK(1) A;

  COUNT(*)
----------
     37197

SQL> /

  COUNT(*)
----------
    111963

SQL> /

  COUNT(*)
----------
     37197

SQL> /

  COUNT(*)
----------
     74462
```

マニュアルは下記の通りやで彡(ﾟ)(ﾟ)

 > Oracle Database SQL言語リファレンス 11gリリース2 (11.2) B56299-08
 > http://docs.oracle.com/cd/E16338_01/server.112/b56299/statements_10002.htm#i2065953
 > BLOCKを指定すると、ランダムな行サンプリングのかわりに、ランダムなブロック・サンプリングを実行できます。
カタログ登録のないVSAMデータセットを削除する

## はじめに（おさらい）
VSAM編成データセット（以下VSAMデータセット）は、必ずカタログされて利用されます。
非VSAM編成データセットはカタログ登録がなくてもJCL中に```UNIT=``` ```VOL=SER=```を指定することでアクセスできますが、VSAMデータセットに対してはこれらの指定はできず、必ずカタログを利用してアクセスすることになります。

VSAMがカタログ管理されていればこそ、下記のようにAMSユーティリティーによって一発でVSAMの索引部とデータ部を同時に削除することができるのですね。

```
//DELVSAM JOB CLASS=A,MSGCLASS=X,NOTIFY=&SYSUID,REGION=0M
//DELETE   EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*    
//SYSIN    DD *           
DELETE (VSAM.TEST.KSDS) CLUSTER
/*
```

## カタログ登録のないVSAMデータセットの削除
ところが、なんらかの不運によって「カタログ登録のないVSAMデータセット」が生まれてしまう or 残ってしまうことが稀にあります。
先ほど、VSAMがカタログ管理されていればこそAMSユーティリティーでずばっとデータセットを一発で削除できると書きました。ところがカタログ管理されていない場合、これらのデータセットは普段どおりの```DELETE CLUSTER```では削除できません。

ではそんなさまよえる亡霊と化したデータセットを除霊するにはどうするか。そんなときに役立つ呪文がAMSユーティリティーの**VVR**オプションです。

```
//DELVSAM JOB CLASS=A,MSGCLASS=X,NOTIFY=&SYSUID,REGION=0M
//DELETE   EXEC PGM=IDCAMS
//DD1      DD   VOL=SER=YYYIMS,UNIT=3390,DISP=OLD
//SYSPRINT DD SYSOUT=*    
//SYSIN    DD *           
  DELETE-
       VSAM.TEST.KSDS.INDEX -
       FILE(DD1) - 
       VVR
/*
```

VVRは大雑把に言うと、**カタログを経由せずVTOC情報からデータセットを探す**という指定です(詳しくは参考文献のリンクを見てください)。
カタログを経由しないので、当然索引部ならば```.INDEX```、データ部ならば```.DATA```まで手書きでデータセット名を指定してやらないといけません。

```DELETE CLUSTER```を弾かれた時にはびっくりしましたが、これで無事、亡霊を退治することができました。

## 参考文献

+ IBM Knowledge Center - Optional Parameters  
http://www.ibm.com/support/knowledgecenter/en/SSLTBW_2.2.0/com.ibm.zos.v2r2.idai200/da6i2172.htm
普段使っているGNU screenのtips

もう20年ぐらいGNU screenを使っています。カスタマイズ自体はあまりしていない(プリフィックスキーを変える程度)のですが、利用上のいろいろな知見があるので、ここにまとめてみます。

# 一つのセッションを使いまわす

screenは一つのセッションに同時に接続することができます。ある場所でscreenを接続したまま、他の場所からsshでつないでscreenのセッションにつなげるといった使い方ができます。セッションがひとつだけの場合は以下のコマンドでできます。

```shell-session
screen -x
```

複数セッションがある場合にはセッション名も引数として与える必要があります。
ACL等を設定すれば異なるユーザーが同時にattachできるので、かつてはペアプログラミングに利用していたりしました。

detach操作は通常と変わりなくC-a d (コントロール+a dの順に押す。以下screenのprefixはC-aと表記)でできます。他の端末からattachしている状態は維持されます。

## 仮想端末のサイズが変わった時

自分は普段、80x25サイズの仮想端末を使っているのですが、同時にattachした際にscreen上のサイズと仮想端末のサイズとが異なってしまう場合があります。今現在使っている端末にサイズを合わせるには以下を入力します。

```shell-session
C-a : fit
```

他のattachしている端末が表示しているウィンドウ以外は、基本的に切替時に表示端末のサイズに合わせるような挙動をするので、そう頻繁には使わない機能です。

# コマンドラインからのプレフィックススキーの変更

普段どんなプレフィックスキーを使うかは人によるところですが、C-aのままという人は少数派ではないかと思います。例えばスマホアプリのJuice SSHなど入力できない・しづらいものを使っている場合は、コマンドラインから変更することが可能です。

```shell-session
screen -X escape ^zz
```

-Xオプションは生きているscreenセッションに指定したscreen内部コマンドを実行させるものです。この例ではプレフィックスキーがC-zに変更されます。本物のC-zを入力するにはC-z zを入力します。
この変更はセッション全体に影響するので、他の端末からattachしている場合もプレフィックスが変わってしまう点に注意が必要です。

# 10を超えるウィンドウへの切り替え

screenはselect(2)を使って端末の入出力を監視しています。仕様上ビルド時にMAXWINマクロで定義した数を超えることはできませんが、通常10を超える数のウィンドウを扱えます。
しかしながら直接指定のウィンドウに切り替えるショートカットはC-a 0 〜 9 までしかありません。メニュー形式で対話的に切り替える手段が用意されているので、そちらを使うほうが容易でしょう。

```shell-session
C-a "
```

他の記事では、C-a : select (C-a ')を使う方法も紹介されています。
[[memo] GNU screen で10以上のウィンドウ番号の画面に飛ぶ方法](http://qiita.com/lazynick/items/9b2e979ca636134a1f35)

## ウィンドウ番号の付け替え

たくさんのウィンドウを作っていると、割り当てられた番号を変更したくなる時があります。その場合、numberコマンドを使います。

```shell-session
C-a : number 数値
```
これを実行すると、今表示されているウィンドウの番号が入力した値に変わります(変えられた方のウィンドウ番号と入れ替わる)。

こちらの記事[[memo] GNU screen でウィンドウの番号を変更する](http://qiita.com/lazynick/items/7269ba5ad0011c131f33)にも同様の内容が解説されています。

## タイトルをつける

特に設定をしていないと、ウィンドウのタイトルがshell名になります。自分はだいたい特定の番号のウィンドウに用途を定めて使っているのですが、タイトルもそれに沿うように変更することでよりわかりやすくなります。変えるコマンドは以下です。

```shell-session
C-a : title
```

# 環境変数の上書き

screenの環境変数は基本的に最初に起動した時のものを継承します。attach/detachを繰り返していると、「この変数の値はこうなってほしい」という事態によく遭遇します(DISPLAY, SSH_AUTH_SOCK等)。これはsetenvコマンドで変更できます。

```shell-session
C-a : setenv
```

# 最後に

とりとめもなく自分がよく行っている操作について書いてみました。他に思い出したら追記するかもしれません。
サーバールーティングな環境でTurbolinks 5とReactを共存させる

※ @ANTON072 に指摘頂きましたが、crossroadsの扱いで、route変更時にイベントが発火しないパタンがあるので一部修正しましたm m

# これはなに

SPAではない（コレなんて言えば良いんですかね？ググラビリティ低くて辛い...）普通のRailsアプリケーションで、ページごとに異なるReactのコンポーネントを描画する方法を試行してみました。

また、速度向上の影響はかなり美味しいので、Turbolinksにも対応してみました。


# 環境

- rails 5
- react 15.2.1
- crossroads 0.12.2

crossroadsは特定のurlで起動するコンポーネントの決定および起動のために使用。
なんでも良いとは思うのですが、turbolinksがhistory apiにstateをガンガンpushするので、そこに影響が無いものが良いと思います。

# つくってみる

## Rails

とりあえず行き来できれば良いので、２ページ作成する

```
dummy_index GET    /dummy(.:format)          dummy#index
	  dummy GET    /dummy/:id(.:format)      dummy#show
```

```index.html.slim
#react-component

= link_to 'go to show page', dummy_path(1)
```

```show.html.slim
#react-component

= link_to 'go to index page.', dummy_index_path
```

ReactDOMをマウントするためのidを用意しておく

## React

※turbolinksに乗るので、JSファイルはwebpackとかでまとめてapplication.htmlのheaderで読み込まれること。

```index.tsx
import * as React from 'react';
import * as ReactDOM from 'react-dom';
import * as crossroads from 'crossroads';

/* 手っ取り早くコンポーネントを２個用意しておく */
const Hello = () => {
    return (
        <p>hello</p>
    );
};

const World = () => {
    return (
        <p>world</p>
    );
};

let router;
const createRouter = () => {
    let router = crossroads.create();
    router.addRoute('/dummy', () => {
        render(<Hello />);
    });
    router.addRoute('/dummy/{id}', (id) => {
        render(<World />);
    });
    return router;
};

/* turbolinks5により、ページ遷移毎に発火 */
document.addEventListener('turbolinks:load', event => {
	const render = (dom) => {
        const target = document.querySelector('#react-component');
        ReactDOM.render(dom, target);
    };
    
    if (!router) {
        router = createRouter();
    }
    // こちらを実行しないと、同一ページに対するリンクの場合、crossroadsが発火しない
    router.resetState();
    router.parse(window.location.pathname + window.location.search);
});
```

# 動作確認

リンクをポチポチして遷移後、chromeにてReact Developer Toolsにて確認　

![スクリーンショット 2016-09-13 17.45.33.png](https://qiita-image-store.s3.amazonaws.com/0/9186/3eb2bc66-2c84-a205-87ca-0e6c6bbfe10a.png "スクリーンショット 2016-09-13 17.45.33.png")

コンポーネントがGCされてませんね。

# 対策

[turbolinks#full-list-of-events](https://github.com/turbolinks/turbolinks#full-list-of-events)

こちらのturbolinksのイベントリストを参考に、画面遷移時にコンポーネントをunmountすれば良いのでは？

ということで対策版のコードです

```index.tsx
...略　

document.addEventListener('turbolinks:visit', event => {
    ReactDOM.unmountComponentAtNode(
		document.querySelector('#react-component')
	);
});

```

最初は名前的にbefore-visitだろうと思ったのですが、historyでの遷移時には発火しないのでこちらを採用しました。

# まとめ

turbolinksの恩恵を受けるためには多少ライフサイクル毎の処理を書く必要がありますね。
また、JavaScriptが初回しかロードされないので、eventListenerやtimeout系のメソッドにも気を使わないといけません。

それと、SPAではないアプリケーションにおいて、任意のページに任意のコンポーネントを起動する良いサンプルが見つからなかったのでこういう実装になりましたが、イケてる方法があったら是非教えていただきたいです！
Mailcatcherを使うphpでsendmail設定(CentOS7)


*参考
http://berk.es/2011/05/29/mailcatcher-for-drupal-and-other-php-applications-the-simple-version/

```shell-session
which catchmail
/usr/local/bin/catchmail
```

```php:php.ini
sendmail_path = "/usr/bin/env /usr/local/bin/catchmail"
```

```shell-session
systemctl restart httpd.service
```

メールテスト
*参考
https://www.conetix.com.au/support/article/simple-php-mail-test

```php
<?php 
    ini_set( 'display_errors', 1 );
    error_reporting( E_ALL );
    $from = "emailtest@YOURDOMAIN";
    $to = "YOUREMAILADDRESS";
    $subject = "PHP Mail Test script";
    $message = "This is a test to check the PHP Mail functionality";
    $headers = "From:" . $from;
    mail($to,$subject,$message, $headers);
    echo "Test email sent";
?>
```
NetAddr で CIDR を統合・分割する

[netaddr](https://rubygems.org/gems/netaddr/versions/1.5.1) という gem がありまして、色々便利なのですが AWSer 的にも便利です。

- [dspinhirne/netaddr](https://github.com/dspinhirne/netaddr)
- [Documentation for netaddr (1.5.1)](http://www.rubydoc.info/gems/netaddr/1.5.1)

使い方も超簡単なのでワンライナーで紹介。

# 統合

なんといっても [Security Group](http://docs.aws.amazon.com/ja_jp/AmazonVPC/latest/UserGuide/VPC_SecurityGroups.html) 1つあたりのルール個数制限（最大50）のやりくりで苦労してる人に朗報です。 `/32` が `/31`, `/30` になるだけでだいぶ減らせるはず。

```
ruby -r netaddr -e 'puts NetAddr.merge(%w(192.168.0.1/32 192.168.0.2/32 192.168.0.3/32 192.168.0.4/32 192.168.0.5/32 192.168.0.6/32 192.168.0.7/32 192.168.0.8/32 192.168.0.9/32))'
192.168.0.1/32
192.168.0.2/31
192.168.0.4/30
192.168.0.8/31
# 9つのレンジが4つまで統合された
```

# 分割

`/8`, `/16`, `/24`, `/32` にしか対応していない [AWS WAF の IP での制限](http://docs.aws.amazon.com/waf/latest/developerguide/web-acl-ip-conditions.html) を使うときに `/27` くらいのレンジを `/32` にバラすのに便利でしょう。

```
ruby -r netaddr -e 'puts NetAddr::CIDR.create("192.168.0.0/29").enumerate'
192.168.0.0
192.168.0.1
192.168.0.2
192.168.0.3
192.168.0.4
192.168.0.5
192.168.0.6
192.168.0.7
```
ReactiveCollectionの変更を雑に取りたい時のアレ


```csharp

ReactiveCollection<Hoge> Hoges;
// Hogesにかかるあらゆる変更を取得する
IObservable<ReactiveCollection<Hoge>> observeChanged;
public IObservable<ReactiveCollection<Hoge>> ObserveChanged()
{
    if (observeChanged == null)
    {
        observeChanged = Hoges.ObserveReplace().Select(x => Hoges)
            .Merge(Hoges.ObserveCountChanged().Select(x => Hoges))
            .Publish()
            .RefCount();
    }

    return observeChanged;
}

```



ReactiveCollection のAdd,Remove,Replace,Clearあたりで毎回通知が来る奴
個性的な三種類のツールチップ


　会社帰りに川島瑞樹さんと高垣楓さんと待ち合わせて焼き鳥屋でビール飲みたい

## ngMouseOver/ngMouseLeaveでツールチップの表示/非表示を切り替え

``` HTML:index.html

<p class="text">
	Lorem ipsum dolor sit amet, 
	<span class="clickable" ng-mouseover="showTip($event,1)" ng-mouseleave="tip=0" >
		consectetur
	</span>
	<span class="tooltip" ng-style="toolTipStyle" ng-show="tip==1">
		Gottes Tod
	</span> adipiscing elit.
</p>

```

　神は死んだ


``` JavaScript:main.js

$scope.showTip=function(event,num){
	$scope.tip=num;
	$scope.toolTipStyle={'left':event.offsetX+'px','top':event.offsetY+'px'};
}

```

　$event引数を使ってツールチップの表示位置を調整しています。
　offsetXとoffsetYが親要素からの位置？っぽかったのでpに`position:relative`をかけました。なんとなく想定通りの場所になりました。だんだんCSSがやっつけ作業になっていきます。

## ngMouseMoveでツールチップの表示位置を変更

``` HTML:index.html

<p class="text">
	Lorem ipsum dolor sit amet, 
	<span class="clickable" ng-mouseover="showTip($event,1)" ng-mousemove="moveTip($event)"  ng-mouseleave="tip=0" >
		consectetur
	</span>
	<span class="tooltip" ng-style="toolTipStyle" ng-show="tip==1">
		Gottes Tod
	</span> adipiscing elit.
</p>


```

``` JavaScript:main.js

$scope.moveTip=function(event){
	$scope.toolTipStyle={'left':event.offsetX+'px','top':event.offsetY+'px'};
}

```

## $timeoutを使ってツールチップの消失を遅延させる

　日本語が来い

``` HTML:index.html

<p class="text">
	Lorem ipsum dolor sit amet, 
	<span class="clickable" ng-mouseover="showTip($event,1)" ng-mousemove="moveTip($event)"  ng-mouseleave="tip=0" >
		consectetur
	</span>
	<span class="tooltip" ng-style="toolTipStyle" ng-show="tip==1">
		Gottes Tod
	</span> adipiscing elit.
</p>

```

　ngMouseLeaveで関数を呼び出す中で$timeoutを用いて遅延を発生させます。
　$timeoutは$scopeと同じく読み込んでやらないと使えないので注意。

``` JavaScript:main.js

angular.module('sample', []).controller('IndexController',
		[ '$scope', '$timeout', function($scope, $timeout) {
			$scope.showTip=function(event,num){
				$scope.tip=num;
				$scope.toolTipStyle={'left':'350px','top':'-8px'};
			}
			
			$scope.hideTip=function(){
				$timeout(function(){
					$scope.tip=0;
				},3000);
			}
		} ]);

```

　あーちなみにこのコードだとツールチップはいくつあっても一つしか表示されないので（遅延してる間に別のツールチップを開こうとすると最初のツールチップが消える）、その場合は各ツールチップにboolean持たせるなどして対処してください。
chromeのDeveloper Toolsでデバイスを変更するとCakePHPのセッションが切れてしまう件

CakePHPでAuthコンポーネントを使いログイン回りを実装していた時、レスポンシブ対応でchromeのDeveloperToolsのデバイスを変更するたびにセッションが切れてログアウトになってしまうので、何でだろうと調べてみた結果、CakePHPは同一セッションでUser-Agentが異なるリクエストがあった場合、セキュリティ的によろしくないということで、セッションを削除してしまうということらしい。

http://book.cakephp.org/2.0/ja/development/sessions.html

> Session.checkAgent - ユーザーエージェントはチェックされるべきです。 ユーザーエージェントがセッションとマッチしない場合、そのセッションは破棄されます。

確かに実運用上はこれの方がいいけども、デバッグ時はこれだと面倒なので、設定を変更。

```php:core.php
	if (Configure::read('debug') != 0) {
		Configure::write('Session.checkAgent', false);
	}
```
PhantomJS 2.1.1にアップデート後、attach_fileでCapybara::Poltergeist::ObsoleteNodeエラーが出る場合


## 遭遇した問題

PhantomJS 1.9系からPhantomJS 2.1.1にアップデートした後、既存のテストコードを実行すると次のようなエラーが出た。

```
Capybara::Poltergeist::ObsoleteNode:
 The element you are trying to interact with is either not part of the DOM, or is not currently visible on the page (perhaps display: none is set). It's possible the element has been replaced by another element and you meant to interact with the new element. If so you need to do a new 'find' in order to get a reference to the new element.
# ./spec/features/posts_spec.rb:15:in `block (2 levels) in <top (required)>'
# ./spec/rails_helper.rb:67:in `block (2 levels) in <top (required)>'
# ------------------
# --- Caused by: ---
# Capybara::Poltergeist::BrowserError:
#   There was an error inside the PhantomJS portion of Poltergeist. If this is the error returned, and not the cause of a more detailed error response, this is probably a bug, so please report it. 
#   
#   Poltergeist.ObsoleteNode: 
#   ./spec/features/posts_spec.rb:15:in `block (2 levels) in <top (required)>'
```

## エラーが発生する箇所

問題が発生するのは`attach_file`メソッドを使っている箇所。

```ruby
file_path = "#{Rails.root}/spec/fixtures/images/sample.png"
attach_file '添付画像', file_path
```

なおかつ、View側ではjquery-fileuploadプラグインを使ってファイルをAjaxでアップロードしていた。

## 原因と解決策

CapybaraとPoltergeistのバージョンが古かった。最新版をインストールしたら直りました。。

Before/After

- Capybara 2.5.0 => 2.8.1
- Poltergeist 1.8.1 => 1.10.0

## 教訓

PhantomJSのバージョンを上げたら、CapybaraとPhantomJSも最新版にアップデートしましょう！！

## 関連Issue

[Getting \`Capybara::Poltergeist::ObsoleteNode\` using Phantomjs 2\.1 · Issue \#725 · teampoltergeist/poltergeist](https://github.com/teampoltergeist/poltergeist/issues/725)
SwiftのaddSubViewの概念からUIButtonが動かない原因を解決する

詰まったのでメモ

storyboard上にUIButtonを配置した。

ビルドしたら成功してシュミレーターは動く。

iPhone画面は表示される。

なのにボタン押しても反応しない。

ボタン押しても遷移しない。

こういう場合 

```ruby:qiita.rb
 addsubview

```

の設定がおかしい場合があります。

例えばViewの上にUIButtonを配置したら、その時点でUIButtonはaddsubviewです。

コードで書くと以下のようになります。


```ruby:qiita.rb
 self.view.addSubview(UIButton)
```

これは

```ruby:qiita.rb
 self
```

で自分を呼び出してviewの中に



```ruby:qiita.rb
 addSubview(UIButton)
```

を

```ruby:qiita.rb
 add(追加)
```
するという意味。Viewの中にbuttonを追加するよという意味

```ruby:qiita.rb
 self.view.addSubview(UIButton)
```

そして、butoonが動かない原因の一つとして考えられるのが

```ruby:qiita.rb
　他のUIの制約の下にUIbuttonとかが隠れてる

```

この可能性あります。自分はありました。

ViewからViewへ遷移するシチュエーションを考えると理解しやすいのですが

showで画面を遷移する時、画面Aという折り紙の上に画面Bという折り紙が重なるイメージができます

画面Bという折り紙が画面Aをかぶってる以上画面Aはそうさできません


今、storyboard上のUIがどういう配置をしてるのか。

よくよく見ていると、ボタンが動作しない理由がわかったりします。
Macでバーチャルホストを構築してテスト環境

## httpd.confを編集

Apache2のconfigを書き換えて、バーチャルホストを有効にする。

`$ sudo vi /etc/apache2/httpd.conf`

下記の行のコメントを外す

```
# Virtual hosts
Include /private/etc/apache2/extra/httpd-vhosts.conf
```

-----

## バーチャルホストのconfigを編集

バーチャルホストの設定を追加する。

`$ sudo vi /private/etc/apache2/extra/httpd-vhosts.conf`

下記のブロックを追加する

```
<VirtualHost *:80>
    ServerAdmin webmaster@local.example.com
    DocumentRoot "/usr/docs/local.example.com"
    ServerName local.example.com
    ServerAlias www.local.example.com
    ErrorLog "/private/var/log/apache2/local.example.com-error_log"
    CustomLog "/private/var/log/apache2/local.example.com-access_log" common
</VirtualHost>
```

-----
## hostsファイルの編集

バーチャルホストとして追加したドメインにアクセスした時に、ローカルアクセスとなるように設定を追加する。

`$ sudo vi /etc/hosts`

下記行を追加する

```
127.0.0.1    local.example.com
```

-----
## Apacheの再起動

configが正しく読み込めるかチェックする

`$ apachectl -t`

パスの書き間違いなどがあれば下記のように表示される

```
AH00112: Warning: DocumentRoot [/usr/docs/local.example.com] does not exist
AH00112: Warning: DocumentRoot [/usr/docs/local2.example.com] does not exist
Syntax OK
```

問題がなければ下記のように表示

`Syntax OK`

sudoで再起動を実行

`$ sudo apachectl restart`

-----
## シンボリックリンクを作成する

シンボリックリンクの元となるバーチャルホスト側のディレクトリを作成する

`$ sudo mkdir /usr/docs/local.example.com`

ワークスペースにシンボリックリンクを作成する

`$ ln -s /usr/docs/local.example.com ~/work/local.example.com`

lsで確認すると、下記のように表示される

```
$ ls -ltr
total 2
lrwxr-xr-x   1 user  staff   45 Sep 13 12:16 local.example.com -> /usr/docs/local.example.com
```

-----
## ブラウザで確認

index.htmlを作成し、ブラウザで表示できるか確認する

`vi index.html`

`hello.`

<img width="270" alt="browser_check.png" style="border=1em;" src="https://qiita-image-store.s3.amazonaws.com/0/2567/19cb2f63-575c-0497-ce75-d5c6725db6dd.png">
Goで時間でファイルをローテートする

単純に時間で分割してほしいだけだったんですが、ピンポイントのものがなかったので作ってみました

https://github.com/ngc224/trfile

```
package trfile

import (
	"os"
	"path"
	"time"
)

type TimeRotateFile struct {
	fileNameFormat string
	file           *os.File
}

var (
	FileMode    os.FileMode = 0644
	DirFileMode os.FileMode = 0755
)

func NewFormat(fileNameFormat string) (*TimeRotateFile, error) {
	trf := &TimeRotateFile{
		fileNameFormat: fileNameFormat,
	}

	if err := trf.fileSet(); err != nil {
		return nil, err
	}

	return trf, nil
}

func (trf *TimeRotateFile) fileNameNow() string {
	return time.Now().Format(trf.fileNameFormat)
}

func (trf *TimeRotateFile) fileSet() error {
	fileNameNow := trf.fileNameNow()

	if dir, _ := path.Split(fileNameNow); len(dir) > 0 {
		if err := os.MkdirAll(dir, DirFileMode); err != nil {
			return err
		}
	}

	file, err := os.OpenFile(fileNameNow, os.O_RDWR|os.O_CREATE|os.O_APPEND, FileMode)

	if err != nil {
		return err
	}

	trf.file = file

	return nil
}

func (trf *TimeRotateFile) Write(b []byte) (int, error) {
	if fileNameNow := trf.fileNameNow(); fileNameNow != trf.file.Name() {
		if err := trf.file.Close(); err != nil {
			return 0, err
		}

		if err := trf.fileSet(); err != nil {
			return 0, err
		}
	}

	return trf.file.Write(b)
}

func (trf *TimeRotateFile) Name() string {
	return trf.file.Name()
}

func (trf *TimeRotateFile) Close() error {
	return trf.file.Close()
}
```

Golangの "2006-01-02 Mon 15:04:05" みたいなタイムフォーマット用いてファイル名やディレクトリを指定します

```
package main

import (
    "log"
    "os"

    "github.com/ngc224/trfile"
)

var fileNameFormat = "logs/2006/01/02/halo.log"

func main() {
    w, err := trfile.NewFormat(fileNameFormat)

    if err != nil {
        os.Exit(1)
    }

    log.SetOutput(w)
    log.Println("Halo World!")
}
```
ASP.NET で SQLのコマンドがタイムアウトした場合の対応方法

ASP.NET で重たいクエリをSQL Serverに投げたところ、タイムアウトしてしまいました。
その対処についての記録です。
ログには「Timeout に達しました。操作が完了する前にタイムアウト期間が過ぎたか、またはサーバーが応答していません。」のメッセージ。

スタックトレースはこんな感じ。

```
   場所 System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   場所 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
   場所 System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj, UInt32 error)
   場所 System.Data.SqlClient.TdsParserStateObject.ReadSniSyncOverAsync()
   場所 System.Data.SqlClient.TdsParserStateObject.TryReadNetworkPacket()
   場所 System.Data.SqlClient.TdsParserStateObject.TryPrepareBuffer()
   場所 System.Data.SqlClient.TdsParserStateObject.TryReadByteArray(Byte[] buff, Int32 offset, Int32 len, Int32& totalRead)
   場所 System.Data.SqlClient.TdsParserStateObject.TryReadByteArray(Byte[] buff, Int32 offset, Int32 len)
   場所 System.Data.SqlClient.TdsParser.TrySkipValue(SqlMetaDataPriv md, Int32 columnOrdinal, TdsParserStateObject stateObj)
   場所 System.Data.SqlClient.TdsParser.TrySkipRow(_SqlMetaDataSet columns, Int32 startCol, TdsParserStateObject stateObj)
   場所 System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
   場所 System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
   場所 System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, SqlDataReader ds)
   場所 System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean asyncWrite)
   場所 System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean asyncWrite)
   場所 System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
``` 

時間に関する設定は3か所。
(1)web.configのconnectionString属性にConnection Timeout=180;を追記しました。

```
 <connectionStrings>   
    <add name="DefaultConnection" connectionString="Data Source=XXXXX;Initial Catalog=XXXXX;Persist Security Info=False;Integrated Security=False;User Id=XXXXX;Password=XXXXX;Connection Timeout=180;" providerName="System.Data.SqlClient" />
  </connectionStrings>
```

(2)web.configのhttpRuntimeにexecutionTimeout属性を追加し180秒に設定しました。

```
<system.web>
    <httpRuntime executionTimeout="180" />
</system.web>
```


(3)ソースコードの中でコマンドのタイムアウト時間を180秒に設定

```
  SqlCommand cmd = new SqlCommand("ExportCSV", cn);
・・・・中略
  cmd.CommandTimeout = 180;
  cmd.ExecuteNonQuery();
```

私は(3)のコマンドのタイムアウト時間について漏れていてハマりました。
ConvertTo-SecureString使ったら「指定された状態で使用するには無効なキーです。」と怒られた

JenkinsでPowerShellスクリプトのテストをしようと試みたけど、こんな形で怒られた

```powershell
ConvertTo-SecureString : 指定された状態で使用するには無効なキーです。
発生場所 C:\Program Files (x86)\Jenkins\workspace\TOOL\sample.ps1:17 文
字:31
+ $secpasswd = cat .\passwordfile.txt| ConvertTo-SecureString
+                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [ConvertTo-SecureString]、Cr 
   yptographicException
    + FullyQualifiedErrorId : ImportSecureString_InvalidArgument_Cryptographic 
   Error,Microsoft.PowerShell.Commands.ConvertToSecureStringCommand
```


## 原因
ググってもいい感じの答えが載ったページがなかったけど、原因としては

- ConvertFrom-SecureStringで暗号化した際のユーザが異なると
　復号化ができない
- Jenkins/PowerShell Pluginで動く実行ユーザはauthority\system　なので、
　基本、実行ユーザが違う形になる

この条件が組み合わさった結果っぽい。

## 解決法

サービスが実行するとか、実行ユーザが違う場合のために　暗号化キーを渡すことができる。
書き方は試しに流した感じでは以下のような形でOKだった

```powershell
>Read-Host -AsSecureString | ConvertFrom-SecureString -Key (1..16)
```

ただしこれはあくまでサンプル。
16/24/32長のバイト型を流してやればいいので、
しっかりやるならもっとうまくやること。


ConvertTo-SecureString側でも同じキーを指定してやる

```powershell
>***** | ConvertTo-SecureString -key (1..16)
```

もっと厳重にやるならSecureKeyなんてオプションもあるけど
いったん内部で動けばいいレベルなので割愛します
シェルスクリプト　メモ

##■シェルスクリプトで実行したコマンドの結果の改行をそのままにする($() とかバッククオートでコマンドを実行時)

**全体をダブルクオートでくくれば改行を残せる**

下記URLを参照
http://please-sleep.cou929.nu/get-command-result-with-newline.html


●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
● 全体をダブルクオートでくくらない時
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
実行シェル（gitで未追跡のものを取得してArrayにいれる）

```
Array=`git ls-files --other --exclude-standar`
echo ${Array[@]}
```

実行結果

```
abcde のコピー 2.txt abcde のコピー.txt abcde.txt
```

●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
● 全体をダブルクオートでくくる時
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
実行シェル（gitで未追跡のものを取得してArrayにいれる）

```
Array=`git ls-files --other --exclude-standar`
echo "${Array[@]}"
```

実行結果

```
abcde のコピー 2.txt
abcde のコピー.txt
abcde.txt
```


##■カラム指定ソート
下記を参考に
http://blog.geta6.net/post/63985316076/shellでsortコマンドを使って多重ソートする

```
// 指定ファイルをカンマ区切りの２つめを降順、３つめを昇順にした中身を取得(この場合、２つ目を降順に並べてから３つ目を昇順にする。)
cat ファイルパス名 | sort -t, -k2,2nr -k3,3n

# 先に３つ目からソートしたければ順番を入れ替える
// 指定ファイルをカンマ区切りの２つめを降順、３つめを昇順にした中身を取得(この場合、３つ目を昇順にしてから２つ目を降順に並べる。)
cat ファイルパス名 | sort -t, -k3,3n -k2,2nr
```

##■ファイル内データ取得

```
// tailを使用して指定ファイルの2行目以降を取得
tail -n +2 ファイルパス名
```

##■ファイル内を並び替えた先頭だけを取得

```
tail -n +2 ファイルパス名 | sort -t, -k2,2nr -k3,3n | head -n1
```

##■ファイル内に１行もなかった場合のNULLチェック

変数を""""で囲ってから比較する。

```
val=`tail -n +2 ファイルパス名 | sort -t, -k3,3nr -k2,2nr | head -n1 | cut -d',' -f2-2`

if [ "$val" = "" ]; then
  echo null
else
  echo not null
fi
```

##■ファイル内を並び替えた先頭だけを取得し、カンマ区切りにした２つめを取得

```
tail -n +2 ファイルパス名 | sort -t, -k2,2nr -k3,3n | head -n1 | cut -d',' -f2-2
```

##■ファイル内データをループ(スペースで改行される)

```
for l in `tail -n +2 ファイルパス名 | sort -t, -k2,2nr -k3,3n`
do
  echo l=$l
done
```

##■ファイル内データをループ(スペースで改行しない設定にする)

下記を参考に
http://linux.just4fun.biz/逆引きシェルスクリプト/スペースが含まれる文字列を1行として扱う方法.html

```
#!/bin/bash
IFS_BACKUP=$IFS
IFS=$'\n'
for l in `tail -n +2 ファイルパス名 | sort -t, -k2,2nr -k3,3n`
do
  echo l=$l
done
IFS=$IFS_BACKUP
```

##■空ファイル作成（空ファイルによる上書き保存も可能）
下記URLを参照
http://shellscript.sunone.me/input_output.html

```
>file
```
ヒアドキュメントで、うまくファイルが作れないと思った失敗談

# 概要

ヒアドキュメントがうまく動いてないなぁ思って調査した

# 結論

ヒアドキュメントのデリミタの後ろにスペースが入っていた

# 状況

こんな感じのメッセージが出ていた

```
/tmp/a.sh: line 8: warning: here-document at line 3 delimited by end-of-file (wanted `EOS')
```

もともとのコード、見た目としては、最後のEOSの後に、スペースがあるかは、わからないが、実際には入っている

```
#!/bin/bash

cat << EOS > /tmp/a.txt
hello $(hostname)
$(date)
EOS

# HERE IS OUTSIDE
```

結果出来上がったファイルの中身

```
hello test
Tue Sep 13 07:20:18 UTC 2016
EOS

# HERE IS OUTSIDE
```
CentOS7でVagrantを起動するのに躓いた話

dockerをvagrantで起動したいなと思いたち、以前からvagrantを使って仮想環境を作っていたがcentos7にアップデートした際に軽くハマった。

解決策のひとつとして共有。

##1.前提
vagrantとvirtualboxの環境構築


##2.動作環境
・Windows10 64bit
・Vagrant ver.1608
・CentOS7

##3.解決策～流れ
###・プラグインのダウンロード [vagrant-vbguest](https://github.com/dotless-de/vagrant-vbguest)
Vagrantfileがあるディレクトリで
````$ vagrant plugin install vagrant-vbguest```
を実行

###・boxのダウンロードorアップデート
```$ vagrant box add centos/7````
```$ vagrant box update --box centos/7````

###・該当ディレクトリで
```vagrant init centos/7; vagrant up --provider virtualbox```
Vagrantfileの初期化
参考：https://atlas.hashicorp.com/centos/boxes/7

###・Vagrantfileに以下を追記
```config.vm.synced_folder ".", "/vagrant", disabled: true ```

###・vagrant up

巡り巡りましたが、公式をよく読めばもっと早く解決できたな。
https://seven.centos.org/2016/09/updated-centos-vagrant-images-available-v1608-01/

この調子でdockerも導入しよう。



###余談：
最近参加した勉強会でmac（termanal）の良さを実感した次第でした・・・
買うか・・・
Atomは検索欄で上下キーを押すと履歴が表示される

## はじめに
Atomでテキスト検索すると、以前に検索した検索結果画面が上書きされてしまって、もう一度同じキーワードで検索しようとしても履歴が残ってないから不便だなぁと思っていたら、実は履歴機能が実装されてました。

参考: https://github.com/atom/atom/issues/5784

## やり方

入力欄で上下キーを使うのだ
![スクリーンショット 2016-09-13 15.43.54.png](https://qiita-image-store.s3.amazonaws.com/0/19724/f4471418-c35e-2683-e54b-e73f5db7905c.png)
Jenkinsから実行したシェルの内部値を取得メモ

Jenkins側でシェルの戻り値の取得方法がわからなかったのでteratailで質問した内容をメモしておく
https://teratail.com/questions/47734?nli=57d680a4-2440-4fbe-abec-77579d07a784#r76623

■Jenkinsから呼び出されるシェルスクリプト(return.sh)

```shell-session

echo 2

```


■Jenkins側シェルの実行

```
value=`sh return.sh`

echo $value
```

■Jenkins側実行結果

```
++ sh return.sh
+ value=2
+ echo 2
2
Finished: SUCCESS
```
iOS 10 から CoreText で背景色が設定できるようになった

iOS 9 まで、CoreText の CTLineDraw などで文字を描画するとき、必要あらば手動で別々に背景色を描いてやる必要がありましたが、iOS 10 では、テキストと一緒に背景が描画できるようになっています。

[CoreText Changes for Objective\-C](https://developer.apple.com/library/prerelease/content/releasenotes/General/iOS10APIDiffs/Objective-C/CoreText.html) を見ると、新しく `kCTBackgroundColorAttributeName` が追加されているのが確認できます。

## 例

単純に NSAttributedString を CTTypesetterCreateWithAttributedString に渡して、CTLine を作って描画してみます。

```swift:Playground
import UIKit

var attributedText = NSMutableAttributedString(string: "あいうえお", attributes: [
    NSForegroundColorAttributeName: UIColor.red,
    NSBackgroundColorAttributeName: UIColor.blue
])

let typesetter = CTTypesetterCreateWithAttributedString(attributedText)  // NSAttribtedString が CFAttributedString にブリッジして渡される
let ctline = CTTypesetterCreateLine(typesetter, CFRangeMake(0, attributedText.length))

class TestView: UIView {
    override init(frame: CGRect) {
        super.init(frame: frame)
        self.backgroundColor = UIColor.white
    }

    override func draw(_ rect: CGRect) {
        guard let context = UIGraphicsGetCurrentContext() else { return }
        context.textPosition = CGPoint(x: 0, y: 20)
        context.translateBy(x: 20, y: 20)
        CTLineDraw(ctline, context)
    }
    
    required init?(coder aDecoder: NSCoder) {}
}
let testView = TestView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
testView
```

<img width="181" alt="Screen Shot 2016-09-13 at 14.56.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/14941/5c857828-cdf1-f5b5-4bc2-49caf50fc10b.png">

青い背景色が描画されているのが分かります。

## 弊害と対応策

CoreText (CoreGraphics) と UIKit では座標系が異なる (y軸が逆) ため、ユーザーにとって読みやすくするために、描画対象を上下反転しておく必要があります。（これは今までと同様です）

```swift
override func draw(_ rect: CGRect) {
    guard let context = UIGraphicsGetCurrentContext() else { return }
    context.textMatrix = CGAffineTransform(scaleX: 1, y: -1)  // ←テキストを上下反転
    context.textPosition = CGPoint(x: 0, y: 20)
    context.translateBy(x: 20, y: 20) 
    CTLineDraw(ctline, context)
}
```
こうすると、テキストの文字列は上下反転しますが、テキストの背景は反転しない罠があります😱

<img width="100" alt="Screen Shot 2016-09-13 at 15.01.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/14941/7cc23309-f468-852d-814e-d8f80e504561.png">→<img width="100" alt="Screen Shot 2016-09-13 at 15.01.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/14941/511f2e9c-9881-585d-9ae6-6fd1a1dec7bb.png">

背景はテキストと紐付いているので、同じように動く挙動をするのが自然だと思うのですが、とりあえず、context を scaleBy でまるごと反転することで対応できます。

```swift
override func draw(_ rect: CGRect) {
    guard let context = UIGraphicsGetCurrentContext() else { return }
    context.textPosition = CGPoint(x: 0, y: -20)
    context.translateBy(x: 20, y: 20)
    context.scaleBy(x: 1, y: -1)
    CTLineDraw(ctline, context)
}
```
<img width="100" alt="Screen Shot 2016-09-13 at 15.08.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/14941/ec77946e-53d9-a1e9-55b9-b88d07085c8a.png">

上手に描けました :tada:
よく使うワンライナー

Linuxでよく使うコマンド集
Linxuを利用するにあたって、よく使うコマンドや陥りやすい罠など、整理します。

# サーバのリソースを取得する
## vmstat
CPU使用率、メモリの仕様状況等を取得するためのコマンド

```shell-session
vmstat 1 | awk '{print strftime("%y/%m/%d %H:%M:%S"), $0}'
```

但し、そのままファイル等にリダイレクトする場合は、awkがキャッシュしてしまうので、タイムラグが発生します。
以下の通りにすることで、回避可能

```shell-session
vmstat 1 | awk '{print strftime("%y/%m/%d %H:%M:%S"), $0}{ system(":") }' > vmstat.log
```

# ファイルのいらないところを除外する
CSVファイルとか、他システムの連携ファイルとか、ヘッダーや、フッターいらないケースが多々あると思います。

## ヘッダーを除外する
```bash
cat ファイル名 | awk 'NR > 1 {print}'
```

## フッターを除外する
```bash
cat ファイル名 | sed -e '$d'
```

## ヘッダーとフッターを除外する

```bash
cat ファイル名 | sed -e '$d' | awk 'NR > 1 {print}'
```
ffmpeg 複数音声ストリームをマージする！！

ffmpegを使って、DeckLink SDI 4KボードからSDI出力を行う時に
XDCAMフォーマットのMXFファイルだと音声のストリームが８個（全部モノ）なので
単純に再生できませんでした。

複数のストリームをマージして、映像ストリームX1　音声ストリームX1（８CH）に
する必要があるようなのでfilterを使ってみました

コマンドは・・

ffmpeg -i INPUT.mxf -bm_v210 1 -f decklink -c:v rawvideo -pix_fmt uyvy422 -flags +ildct+ilme -filter_complex "[0:1][0:2][0:3][0:4][0:5][0:6][0:7][0:8] amerge=inputs=8" -c:a pcm_s16le -ac 8 -bufsize 1000k "deckLink SDI 4K"

DeckLink SDI 4Kボードは音声はステレオか７．１ｃｈ（8ch）のどちらかした対応してないようです

もう少し弄ればXDCAMの再生機がかなりお手軽に作れそう！
ディクショナリにデフォルト値ってないのか？


ディクショナリにない値が入力されたとき、デフォルト値を返したい。



デフォルト値とは正確な名前かわからないが、引数の後に`=`入れておけばfunctionの引数が与えられなかったときにその値使ってくれるというやつ。

```python:関数のデフォルト引数
def func(arg1):
	print(arg1)

 # $ func()   # 引数がないとエラー起こす
 # [Out]
 # ---------------------------------------------------------------------------
 # TypeError                                 Traceback (most recent call last)
 # <ipython-input-6-08a2da4138f6> in <module>()
 # ----> 1 func()

 # TypeError: func() missing 1 required positional argument: 'arg1'


def func(arg1=0):   # デフォルト引数があれば引数なくても自動でデフォルト引数を使ってくれる
	print(arg1)

 # $ func()
 # [Out] # 0
```



このデフォルト引数みたいに辞書にも
1. キーのない値が入力されたとき
2. 指定した値を返す
っていうのがほしい。

こういうときはgetメソッドを使う。

get method docstring
> dict.get?
> Docstring: D.get(k[,d]) -> D[k] if k in D, else d.  d defaults to None.




```python:dict.getメソッド
dic={'a':6,'b':4}
 # $ dic['a']
 # 6

 # $ dic['b']
 # 4

 # $ dic['c']　　　# キーにない値が入力されるとエラー
 # ---------------------------------------------------------------------------
 # KeyError                                  Traceback (most recent call last)
 # <ipython-input-11-0c3be353eb91> in <module>()
 # ----> 1 ic['c']

 # KeyError: 'c'

$ dic.get('c',0)   # dic内に'c'がないので第二引数が返される
 # [Out] # 0

```

また、`get`に第二引数を指定しなければ、`None`が返される。



参考：[Return None if Dictionary key is not available](http://stackoverflow.com/questions/6130768/return-none-if-dictionary-key-is-not-available)
CSSで長すぎる文章を省略する方法

CSSで文章を省略します。

![スクリーンショット 2016-09-13 13.59.16.png](https://qiita-image-store.s3.amazonaws.com/0/69864/04101174-407d-1552-a3a5-bf6028e8cd48.png)

# HTML

```html
<p class="textbox">ここはその間もうある指導めといったのの時を引きんない。いくらでも毎日に詐欺顔は何だかその思索ででしょほどをしているでしをは注意至るましませて、たったにはやまたでましで。一部分をつかあるものはもし将来を単にないうた。もし大森さんに立証事業ますます教育をしない世の中こうしたdo私か関係のという肝学問たですでたから、同じ当時はここか教場飯を描いと、岡田さんの訳がつまりのそれからとやかくお養成と見えてそれ地位より肝用意でさようにどうしてもご煩悶で考えんますながら、すでにすでに発展を載せでがいたのが突っついまします。それでまたご数のなっのもはっきり立派と畳んですて、この世の中をもすまなけれてという目的に飛びて来あっまし。</p>
```

# CSS

```css
.textbox {
  position: relative;
  height: 80px;
  overflow: hidden;
  line-height: 20px;
}

.textbox:before, .textbox:after {
  position: absolute;
  background: #fff;
}

.textbox:before {
  content: "･･･";
  bottom: 0;
  right: 0;
}

.textbox:after {
  content: "";
  width: 100%;
  height: 100%;
}
```

#DEMO
http://codepen.io/takanorioki4/pen/EgPNJr

#解説
`overflow: hidden;`でテキストを隠し、`.textbox:before`が「・・・」を表示しています。
しかしこれだけだと文章が短い場合も「・・・」が表示されてしまいます。

そこで文章が短い時は`.textbox:after`を`.textbox:before`の上にかぶせて見えなくしている、という感じです。

`position: absolute;`を指定した時、`top`などを指定しないと文章の末尾にくっつくのを利用しています。