OmniAICreator/Qiita-1.07M huggingface dataset:
Javaの人がJSのdelete演算子を知らないままTypeScriptを書いて爆死したお話


最近、こんなコードを書く機会がありました。

```typescript:index.ts
import {Promise} from "es6-promise";

interface Entity {
    id: number,
    name: string
}

class Repository {
  deleteEntity(entity: Entity) {
    return delete(entity.id)
  }

  delete(id: number) {
    return Promise.resolve(true);
  }
}
```

データ削除の関数を用意するときに、Entity型を受け取るものと、number型を受け取るものをそれぞれ用意しています。`deleteEntity(entity: Entity)`は`delete(id: number)`の単純なラッパーなので、戻り値の型は両方とも`Promise<boolean>`のはずですね。

確認のために、型をつけてみましょう。

![スクリーンショット 2016-01-14 11.31.19.png](https://qiita-image-store.s3.amazonaws.com/0/2276/7d597bb7-3969-5399-30e5-1fe5b8e00a3b.png "スクリーンショット 2016-01-14 11.31.19.png")

![スクリーンショット 2016-01-14 11.32.45.png](https://qiita-image-store.s3.amazonaws.com/0/2276/549eb67d-0ae4-e153-ab93-9daad761e996.png "スクリーンショット 2016-01-14 11.32.45.png")

> Type 'boolean' is not assignable to type 'Promise<boolean>'. Property 'then' is missing in type 'Boolean'.

`delete(id: number)`の定義は問題ないはずなのに、呼び出し側で「これの戻り値、Promise&lt;boolean&gt;じゃなくてbooleanだよ？」と怒られました。

## ２つの原因

この件は複数の要因がうまいこと噛み合ってしまったために起きたものでした。次の２つです。

* thisのつけ忘れ
* delete演算子

### thisのつけ忘れ

これは私の凡ミスです。自分のクラス内にある関数を呼び出したい場合は、必ずthisをつけないといけないのに、省略してしまっていました。Javaではthisは多くの場合で省略が可能なので、忘れてしまっていたのです。

次のようにちゃんとthisを書いていれば、問題ありませんでした。

```js:index.ts
  deleteEntity(entity: Entity): Promise<boolean> {
    return this.delete(entity.id)
  }
```

しかし通常は、単にthisを書き忘れただけならば、存在しない関数を呼ぼうとしているということで、それはそれでコンパイラに叱られるはずなのです。まだ、booleanが返る現象の説明がついていません。グローバル空間にbooleanを返すdeleteが存在しているはずなのです。

### delete演算子

今回初めて知りましたが、JavaScriptには[delete演算子](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/delete)というものがあります。オブジェクトからプロパティを削除してくれるそうです。

このdelete演算子はbooleanを返します。booleanを返します。大事なことなので二回言いました。

さて、ここで生成されたJSコードを見てみましょう。

```js:index.js
"use strict";
var es6_promise_1 = require("es6-promise");
var Repository = (function () {
    function Repository() {
    }
    Repository.prototype.deleteEntity = function (entity) {
        return delete (entity.id);
    };
    Repository.prototype.delete = function (id) {
        return es6_promise_1.Promise.resolve(true);
    };
    return Repository;
}());
```

特に注目すべき点はここです。

```js:index.js
        return delete (entity.id);
```

よく見ると、deleteの後ろにスペースがひとつ入っています。TypeScriptさんが気を利かせて入れてくれたんですね。ということは、この式の意味合いは関数呼び出しではなく、delete演算子を`entity.id`に対して適用する、というものになります。entity内のオブジェクトからidプロパティを消そうとして、その成否をbooleanで返してくれるんですね！　やったね！

やったねじゃないですね。今回は敢えて生成後のJSやd.tsもコミットに入れていたおかげで、プルリクのレビューで同僚の@circled9さんから指摘してもらえたからよかったものの、このまま通っていたら大惨事でした。

## 反省

* 自分が使う言語の予約語くらいは覚えておこう（[参考](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Reserved_Words)）
* 型推論に頼りすぎず、自明なもの以外は戻り値の型を指定する習慣を身につけよう
    - 今回のケースは本来かなり自明だったはずなんですけどね・・・
* thisの省略のようなJavaのクセを捨てて、JavaScript（ES6）に合ったクセを育ててTypeScriptを書こう

## まとめ

型推論、便利だけどこわいなーと思いました（こなみ

### 追記

「テスト書けよ」

ｱｯﾊｲ
[覚書]tsconfig.jsonの設定


Atomエディタでatom-typescriptパッケージを入れて、TypeScriptで開発していると、”今書いてるtsファイルはtsconfig.jsonに書かれてないからコンパイルできない”みたいなエラーが出て困っていた。

ファイルを追加するたびに毎回tsconfig.jsonを書き換えるのは面倒くさい。
簡単な方法があるだろうと思って調べた結果、辿り着いた答えが以下。


```json:tsconfig.json
{
    "fileGlob": [
        "./src/**/*.{ts,tsx}"
    ],
    "exclude": [
        "node_modules"
    ]
}
```

node_modulesフォルダに入っているtsファイルは無視したいので、"exclude"で指定している（たぶん、これで無視されるはず…）。

>
"fileGlob"と"files"を同時に指定すると、うまく認識してくれなかったので、"fileGlob"だけのほうがよさそう。
SQL Serverの新しいインスタンスを作成する

## インストール
1. MicrosoftよりSQL Serverインストーラーをダウンロード
2. インストーラーを実行
3. [インストールの種類]で名前付きインスタンス（a new installation）を選択
3. その他設定を環境に合わせてインストール

## ポート設定
1. [SQL Server ネットワークの構成]→["インスタンス名"のプロトコル]選択
2. [TCP/IP]の右クリックメニュから[プロパティ]を選択
3. [IPアドレス]タブを開き、TCPポートに任意の番号を入力
4. TCP動的ポートをブランクにする
5. [IP1]～[IP ALL]まで同様に設定
6. あわせてファイアウォール等設定
テーブルの内容をCSVに出力するコマンド

テーブルの内容をcsvに出力する。

```sample1
bcp "SELECT * from [DB名].dbo.[Table名]" queryout "[出力先フルパス]" -c -t "," -S [サーバ名] -U [ユーザ名] -P [パス]
```
DoctrineでJoinするとPaginatorで怒られるのをなんとかする

なんか今まで動いてたはずのプログラムが動かなくなって
Cannot count query which selects two FROM components, cannot make distinction
とかエラー出るんですよ
なんじゃ
https://www.google.co.jp/search?q=Cannot+count+query+which+selects+two+FROM+components%2C+cannot+make+distinction&oq=Cannot+count+query+which+selects+two+FROM+components%2C+cannot+make+distinction&aqs=chrome..69i57j0.688j0j7&sourceid=chrome&es_sm=91&ie=UTF-8
なんかよくわかんないけどjoinするなとかいうことなんですけど、ようdoctrineようおめーは何かの間違いでIT土方企業の管理職にのし上がってしまったOOPのわからないCOBOLERかなにかかよ　*COBOLERを貶める意図はありません
なんかみんな「FROMじゃなくて適当にwhereに移したりサブクエリにしたらうごくよ！」とか言ってる

幸い、joinはフィルタ条件にしか使われていなかったので、丸ごとぶち込めばよさそう

```php
$builder = $hogeRepository->createQueryBuilder('h');

// なんかあーだこーだ

return $builder->getQuery();
```

↓


```php
$builder = $hogeRepository->createQueryBuilder('h');

// なんかあーだこーだ

$builder->select('h.id');

$builder2 = $hogeRepository->createQueryBuilder('h2');
$builder2->select('h2.*');
$builder2->where($builder2->expr()->in('h2.id', $builder->getDQL()));
$builder2->setParameters($builder->getParameters());

return $builder2->getQuery();
```

はい動きました

一刻も早く世界中のORMが消え去りますようにナムナム
KotlinでHashMapをキャッシュとして使うときに便利なやつ

`HashMap#getOrPut`という素晴らしいメソッドが生えていたことに最近気づいた。

```kotlin
val cache = hashMapOf<Int, Hoge>()

fun getHoge(key: Int): Hoge {
    return this.cache.getOrPut(key) {
        // なにやらこねくり回したりしてデータを作る
        Hoge(key)
    }
}
```

Kotlinだと最後の引数のlambdaは()の外に書けて可読性が良い感じ。
あるファイルが前回チェックした時から更新されているかを判断する小技


bash のファイル比較演算子を使って一時ファイルと日付を比較すると楽です。

# is_update 関数を作成する

試しにやってみましょう。

```is_update_func.sh
function is_update
{
  TMPFILE=".${1}.ts"

  if [ "${1}" -nt "${TMPFILE}" ]
  then
    touch ${TMPFILE}
    echo "更新されたね"
    return 0
  else
    return 1
  fi
}
```

さて、こんな関数定義ファイルを作ってだ。

```bash
. is_update_func.sh
```

sourceします。

# 使い方


```
$ touch myfile
$ is_update myfile
更新されたね
$ is_update myfile
$ is_update myfile
$ touch myfile
$ is_update myfile
更新されたね
$ is_update myfile
$
```

ファイルが更新されたら「更新されたね」と出力されています。

# 解説

別に解説するまでもないんだけど、bash の `-nt` ファイル比較演算子は左辺のファイルの方が新しいと真を返す。

右辺のファイルがない時も真を返す。

```man_bash
       file1 -nt file2
              True if file1 is newer (according to modification date) than file2, or if file1 exists and file2 does not.
```

というわけで、こういう用途にはぴったりなのです。

なるべく別プロセスを起動したくないとか言って touch でやらずに `:>${TMPFILE}` するケースもあると思うけど、自分はあんまり気にしない…。意図がわかりづらいし。

# 余談

このくらいにしてもいいか。ワンライナー風味。戻り値 0 なら更新されている。0 以外だと更新されていない。

```
function is_update(){
  test "${1}" -nt ".${1}.ts"  && :>".${1}.ts"
}
```
ES6のあの記法について( let { hoge } = obj; )

ES6の記法でよく見かける以下の書き方ですが、どういう条件でhogeに値が渡ってくるのかまとめました(~~名前とかあるのかな~~ → [分割代入というそうです](http://qiita.com/kwst/items/0c4c24084f535a654779#comment-c83904aef5d5e9dfef79))

```javascript:
let { hoge } = obj;
```

今回のサンプルのために以下の関数を用意しました

```javascript:
function out(val) {
  let { value = 'no value' } = val;
  console.log(value);
}
```

## 値が渡ってこないパターン

```javascript:
out({});
```

```bash:結果
no value
```


```javascript:
out({ value: undefined });
```

```bash:結果
no value
```

## 値が渡ってくるパターン

```javascript:
out({ value: 'has value' });
```

```bash:結果
has value
```

```javascript:
out({ value: null });
```

```bash:結果
null
```

# その他の記法

```javascript:
let { value: temp = 'no value' } = val;
```
これは以下のような挙動になります

- valにプロパティvalueが有る時 → valueの値がtempに入る
- valにプロパティvalueが無い時 → 'no value'がtempに入る

[今回のサンプルはこちらに](https://babeljs.io/repl/#?experimental=false&evaluate=true&loose=false&spec=false&code=%22use%20strict%22%3B%0A%0Afunction%20out(val)%20%7B%0A%20%20let%20%7B%20value%3A%20temp%20%3D%20'no%20value'%20%7D%20%3D%20val%3B%0A%20%20console.log(temp)%3B%0A%20%20let%20%7B%20value%20%3D%20'no%20value'%20%7D%20%3D%20val%3B%0A%20%20console.log(value)%3B%0A%20%20console.log('----')%3B%0A%7D%0A%2F%2F%20%E5%80%A4%E3%81%8C%E6%B8%A1%E3%81%A3%E3%81%A6%E3%81%93%E3%81%AA%E3%81%84%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%0Aout(%7B%7D)%3B%0Aout(%7B%20value%3A%20undefined%20%7D)%3B%0A%2F%2F%20%E5%80%A4%E3%81%8C%E6%B8%A1%E3%81%A3%E3%81%A6%E3%81%8F%E3%82%8B%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%0Aout(%7B%20value%3A%20'has%20value'%20%7D)%3B%0Aout(%7B%20value%3A%20null%20%7D)%3B%0A)
binding.pryでsql文を表示したい時のおまじない

binding.pryの中で

```
> ActiveRecord::Base.logger = Logger.new(STDOUT)
=> #<Logger:0x007f8664e4a740
 @default_formatter=#<Logger::Formatter:0x007f8664e4a718 @datetime_format=nil>,
 @formatter=nil,
 @level=0,
 @logdev=
  #<Logger::LogDevice:0x007f8664e4a6c8
   @dev=#<IO:<STDOUT>>,
   @filename=nil,
   @mutex=
    #<Logger::LogDevice::LogDeviceMutex:0x007f8664e4a6a0
     @mon_count=0,
     @mon_mutex=#<Mutex:0x007f8664e4a650>,
     @mon_owner=nil>,
   @shift_age=nil,
   @shift_size=nil>,
 @progname=nil>
```

すると

```
>  User.active.count
D, [2016-01-14T11:19:50.133183 #29031] DEBUG -- :   CACHE (0.0ms)  SELECT COUNT(*) FROM `users` WHERE `users`.`active_flag` = 1 AND `users`.`deleted_at` IS NULL AND (`users`.`global_user_id` IS NOT NULL)
```
【Vim】コードの中の数値をソートしたい時

Vimでプログラムコードやテンプレートの中に記述された数値を並び替えたい場合。

```
<?php

$data = array(
           111111,
           222222,
           555555,
           666666,
           444444,
           333333,
        );  
```

↓↓↓↓↓↓

```
<?php

$data = array(
           111111,
           222222,
           333333,
           444444,
           555555,
           666666,
        );  
```



コマンドで４〜９行目を指定して
```
:4,9!sort
```
PhpStorm で、タブ文字を有効にする

PhpStorm は、デフォルトで「タブがスペース」になっている。
# タブ文字を有効にする
1.Ctrl+Alt+sで設定を開く
2.Code Style以下のGeneral,各言語の「Use tab character」にチェックを入れる

検索窓?で、「Use tab character」と入力すると、設定が絞り込まれます。
いまいるリポジトリの Pull Request 一覧を取得し peco でフィルターしてブラウザーで開く

hub でいまいるリポジトリの GitHub Issue 一覧取る機能あるのを利用して、 Pull Request 一覧を表示して peco で絞り込み、選択してブラウザーで開く、というのをやってみたら便利でしたので共有させていただきます。 hub が必要なので事前にインストールしといてください。

```bash
function peco-github-prs () {
    local pr=$(hub issue 2> /dev/null | grep 'pull' | peco --query "$LBUFFER" | sed -e 's/.*( \(.*\) )$/\1/')
    if [ -n "$pr" ]; then
        BUFFER="open ${pr}"
        zle accept-line
    fi
    zle clear-screen
}
zle -N peco-github-prs
bindkey '^G^P' peco-github-prs
```

こんな感じで使えます。

![peco-open-pr.gif](https://qiita-image-store.s3.amazonaws.com/0/1017/4f3a0d6d-3d0d-114f-f0d8-52beae9b4116.gif)

便利。
ES6+Karma+Jasmine環境のテンプレート

ちょっとしたES6スクリプトをテスト付きでさくっと試すためのテンプレを作りました。

テストランナーはKarma、テスト本体はJasmineです。

はじめてpackage.jsonとかreadmeまじめに書きました。

https://github.com/110chang/babel-starter

任意のリポジトリを作成して、一時的にこのテンプレをリモートに設定し、プルしてからリモートを削除。

```bash
git remote add babel-starter https://github.com/110chang/babel-starter.git
git pull babel-starter master
git remote rm babel-starter
npm i
karma start
```

余談ですが、Generatorを動かすにはbabel-polyfillをインストールして、設定に加える必要があるみたいです。

```js
    ...
    // list of files / patterns to load in the browser
    files: [
      'node_modules/babel-polyfill/browser.js',
      ...
    ],
    ...
```

via http://stackoverflow.com/questions/28976748/regeneratorruntime-is-not-defined

[ブログにも掲載しました](http://110chang.com/knowledge/es6-karma-jasmine/)

[fixtureの使用について続きを書きました](http://qiita.com/110chang/items/8a8eba2df51e9377b8a1)
C# で higher-kinded polymorphism を実現する

[Java で higher kinded polymorphism を実現する](http://qiita.com/lyrical_logical/items/2d68d378a97ea0da88c0) の C# 版。

>[ドトネトで真似てみようとしたが、「相互変換のためのメソッド」が出てきた時点で、おれはキャストしよう...…ってなった。](https://twitter.com/matarillo/status/680289895579926528)

ということなので、試しに C# で書いてみました。キャストしようというのが具体的に何を指してるのか良く分からないけれど。
.NET なら [F*](http://research.microsoft.com/en-us/projects/fstar/) があるじゃんと思ったんですが、これ MS Research の成果物のくせに .NET 系の言語吐けないんですねなんでやねん…CLR の制限あるし仕方ないか。

Java 版とは違い、highj と同じ、App<TypeConstructor.Type, Elem> を TypeConstructor が継承する作法。とりあえず Option クラスを実装してみました。C# 書くの久しぶりだなあ。

```csharp
namespace higherKinded {
  public interface App<F, A> { }

  public abstract class Option<A> : App<Option.Type, A> {
    public abstract R fold<R>(Func<R> none, Func<A, R> some);
  }

  public static class Option {
    public sealed class Type { }
    public static Option<A> some<A>(A value) { return new Some<A>(value);  }
    public static Option<A> none<A>() { return new None<A>(); }
    public static Option<A> narrow<A>(App<Option<A>.Type, A> app) {
      return (Option<A>)app;
    }
  }

  public sealed class Some<A> : Option<A> {
    public Some(A a) { value = a; }
    public A value { get; }
    public override R fold<R>(Func<R> none, Func<A, R> some) {
      return some(value);
    }
  }

  public sealed class None<A> : Option<A> {
    public override R fold<R>(Func<R> none, Func<A, R> some) {
      return none();
    }
  }
}
```

ということで、当たり前なんですが C# でもできました。めでたしめでたし。まあ Java で出来るんだから大体できる。

ところで roslyn の issue に [Higher Kinded Polymorphism / Generics on Generics](https://github.com/dotnet/roslyn/issues/2212) なんてものがあります。issue 作られたのは去年の四月だし、CLR の制限もあるので、あまり入りそうにはないですが…
SwiftプロジェクトをビルドするとlibswiftCore.dylibが見つからない人向け

# エラー内容

```shell-session:stackoverflowより
dyld: Library not loaded: @rpath/libswiftCore.dylib
  Referenced from: /var/mobile/Containers/Bundle/Application/3FC2DC5C-A908-42C4-8508-1320E01E0D5B/Stylist.app/Stylist
  Reason: no suitable image found.  Did find:
    /private/var/mobile/Containers/Bundle/Application/3FC2DC5C-A908-42C4-8508-1320E01E0D5B/testapp.app/Frameworks/libswiftCore.dylib: mmap() errno=1 validating first page of '/private/var/mobile/Containers/Bundle/Application/3FC2DC5C-A908-42C4-8508-1320E01E0D5B/testapp.app/Frameworks/libswiftCore.dylib'
(lldb)
```

# チェックポイント
## 証明書
調べてみると、Xcodeが自動で生成した証明書じゃなくて、自分でCertificateとProvisoning生成しないとダメだ、
みたいな記事を見つけましたが、Xcode7.2ではとくにそんなことはなかったです。

## Embedded Content Contains Swift
.swiftファイルがあるターゲットのBuildSettingの設定がYESになってないとダメなんですが、自分のプロジェクトでは設定されていました。
ちなみに.swiftファイルがない時にはNOにしておかないと、ストア申請時に「.swiftファイルあるっていってるけど、フォルダにlibswiftCoreとかがないんだけど」って言われて、申請エラーになったことがあるので注意です。

## キャッシュ削除
```
rm -rf "$(getconf DARWIN_USER_CACHE_DIR)/org.llvm.clang/ModuleCache"
rm -rf ~/Library/Developer/Xcode/DerivedData
rm -rf ~/Library/Caches/com.apple.dt.Xcode
```
自分のケースではstackoverflowにかかれていた上記の対応方法でなおりました
ただ注意点として上記のDerivedDataはデフォルトパスなのでXcodeのPreferenceのLocationで設定変えている人はそのパスに直してあげるといいと思います。

# 参考
http://stackoverflow.com/questions/32730312/reason-no-suitable-image-found
RICOH THETA Advent Calendar 2015 LT大会！のお知らせページです

http://qiita.com/advent-calendar/2015/theta ではありがとうございました！
これがきっかけのイベントですので、こちらに詳細をまとめたいと思います。

# 概要

* https://atnd.org/events/73476
* 日時：2016/01/27(水)　19:00-21:30予定
* 会場：リコーITソリューションズ(株) 会議室 BlueOcean
 * 東京都中央区晴海1-8-10 トリトンスクエア オフィスタワーX 42F
* 実施内容：LT大会＆懇親会（デモも歓迎！机、コンセントが一部ありますのでご自由にお使いください！）
* 当日ハッシュタグ **#thetalt** です！

## 当日タイムスケジュール

|時間|内容|
|:-----------|:------------|
|18:00|	LT参加者向けの開場時間|
|18:30|	一般参加者向け開場時間|
|19:00|	LT大会開始（5分×16名＋スペシャルゲスト(仮)）|
|20:30|	簡易懇親会＆フリータイム（デモ展示などこの機会にどうぞ！）|
|21:30| クローズ|

LT大会の話者順はカレンダー順を予定しております。

1. kawauso3 (Day1)
1. _syumai (Day2)
1. MobileHackerz (Day4,10)
1. itachin (Day6)「双子！？THETA 動画を合体させて遊ぶ」
1. Y-WORKs (Day8)「Theta S を天井にマウントする」
1. ogwatti (Day11)
1. kouki6 (Day12)
1. スペシャルゲスト
1. shrhdk (Day16)
1. sandinist (Day17)
1. noshipu (Day18)
1. Satoru Noda (Day19)
1. tth (Day20)
1. Shu Ubukata (Day23)「無限の彼方へ さあ行くぞ！」
1. やのせん (Day24)「THETAとUnityでVR英語教材を作ってみる」
1. GOROman (Day25)「1年前にアメリカ行った時にホテルで暇すぎたのでTHETA向けアプリ作って、SAMSUNGの人に見せたらそれがきっかけで未発表のTHETA S事前お借りできてTGS展示が決まってOculus Homeにリリースして1万DL達成できた話」

 
## お願い事項

* 懇親会＆フリータイムに参加される方はできるだけお釣りのないように1500円を用意いただけますようよろしくお願いいたします。当日受付にて参加可否を確認の上集めさせていただきます
* こちらでその場で着けていただくネームカードを準備予定です。ATNDのアイコン、お名前を元に作成します。変更を希望される場合は1/22までにATNDの設定より変更いただけますようよろしくお願いいたします。
* 写真の撮影に関しましては、それぞれのLTや展示の中でNGとなる部分がある可能性があります。会場や、展示者の指示を確認の上よろしくお願いいたします。


# 会場情報

## LT参加者向け案内

* こちらで準備する発表向け機材は以下のものとなります
 * マイク（スタンド利用可能、手持ちのコードレスタイプ）
 * プロジェクター（**VGA端子のみ、HDMIやMacな方は変換ケーブルをお持ちいただく必要があります**）
 * 比率は基本の設定が**16:9**となっております。プロジェクター詳細はこちらです＞ http://www.nec-display.com/jp/projector/old/p420xjl.html 天井から配線を通しているため、利用出来るものはVGA端子のみです。
* **LTの時間は5分間です。**


## フリータイムの展示検討者向け案内

* 事前の申請は特別必要ありません（当日受付でおおよその数の確認のためお聞きすることがあるかもしれません）
* 懇親会時にフリーで行う形となります、飲食物と遠くの場所なども用意しますが展示される場合は各自の責任で行っていただきますようよろしくお願いいたします
* 電源の場所が限られています、延長ケーブルなど必要に応じてお持ちいただくとスムーズかと思われます


## その他会場案内

* フリーのWiFiの用意はありません
* LT大会中机がある座席は一部のみです
* 電源がある場所に関しても一部のみです
* 喫煙所は42階にはありません（時間帯によって2階や外を利用していただく形となります）

# 当日緊急連絡先

* 参加者の方へATNDのメッセージよりお伝えします。
* 確認ができなかった場合はお手数ですが https://twitter.com/x71713 まで連絡をお願いします。（ATNDのメッセージ機能でも結構です）


以上です。
当日、お会いできるのを楽しみにしております！！！
Node.JS ＋ Express4（ECT）＋ Bootstrap サイト雛形

# 概要 #
Node.js + Express4（ECT) + Bootstrap にてサイトを構築する為の雛形

# 前提条件 #
+ OS:Windows 10 Pro
+ Node.JS ver.5.3.0 導入済

ソースを以下のサイトからダウンロードしてください。

https://github.com/nissato-hitoshi/myapp.git


# 今後 #
+ 認証機能を追加したい。。。
+ Mongodb 接続の機能を追加したい。。。
+ アクセスログ、デバッグログを共通で組込みたい。。。
+ クライアントのHTMLを AngularJS にしたい。。。
+ 上記に合わせて REST 形式の Webサービスにしたい。。。

以上です。
Edgeブラウザでファイルダウンロードに失敗する、PDFのインライン表示に失敗する

年明けから関わってるPJは、そこそこ規模があるWebシステムで、そのバグ対応を実施していた時に当たった問題。
(前提)システムのバックエンドはJSFだった。

- 【問題点1】Edgeブラウザで、ダウンロードしたファイル名が正しくない(_UTF-8～～～)みたいになる
- 【解決方針】ブラウザ判定を修正して、ファイル名エンコードをIEに合わせる

Windows10の、標準ブラウザになったMicrosoftEdge。
こいつからダウンロードするファイルの名前が不正になる。というありがち(だと思う)な問題。
EdgeのUserAgentは、後発なだけあって他の色んなブラウザの名称も含ませて持っている様子。
下記リンクを参考にさせていただいた。
http://qiita.com/tonkotsuboy_com/items/7b36bdfc3a9a0970d23b

ファイル名のエンコード仕様は、今回のシステムのソースを見ると、IE系とWebKit系で大きく2つに分けてあって、
1)　IE系(IE、IE11(trident/7)、Safariなど)→生文字
2)　WebKit系(Chrome、Firefoxなど)→base64でエンコード
こうなっていた。
ロジック的に、UserAgentのChrome判定が上位にあったため、
EdgeはWebKit系の分岐に入っていたがIE系に入る必要があるので、それを直して終了。

- 【問題点2】Edgeブラウザで、PDFファイルがインライン表示できない
- 【解決方針】インライン表示ではなく、ファイルダウンロードさせる

システムから出力するPDFファイルを別ウィンドウ開いてインライン表示するリンクをクリックしても、
白いblankページが開くだけでうまく動かない。というバグ。
なぜインライン表示に失敗するのか、真の原因追及をしたかったのだけど、ユーザと対応方針は決まっていたので
それに従い、ダウンロードさせる方向で改修を進めた。
ヘッダに付ける"Content-Disposition"を「inline(インライン表示)→attachment(添付ファイル)」に変更するだけで良かったのだけど、
作業時点では知らなかったので、"Content-Type"を「application/pdf→application/force-download」にしてみた。
これで解決。
Vivadoで論理合成と配置配線を実行するTclスクリプト

# はじめに

Xilinx 社のFPGA開発環境の Vivado、いちいち GUI でマウスボタンをポチポチするのは面倒です。
Vivado は Tcl スクリプトでバッチ処理が出来るので、決まり切った仕事なら Tcl スクリプトを書いて処理させたほうが楽です。
この記事では、Vivado で論理合成と配置配線を実行するTclスクリプトを解説します。

# 環境

 - Xilinx Vivado 2015.4
 - Xilinx Vivado 2016.4
 - Xilinx Vivado 2017.1
 - Xilinx Vivado 2017.2
 - Xilinx Vivado 2018.3
 - Xilinx Vivado 2019.1
 - Xilinx Vivado 2019.2 (Vitis)


# Tclスクリプトの説明

## 1 プロジェクトを開く

このスクリプトではすでにプロジェクトが作られていることを前提にしています。
変数 project_name にプロジェクト名を、変数 project_directory にプロジェクトのあるディレクトリを設定しておきます。
この例では、project_name に "project" を、project_directory にTclスクリプトのあるディレクトリを指定しています。
project_directory をカレントディレクトリにしておいた方が、間違いがなくて良いでしょう。

````Tcl:implementation.tcl
set project_directory   [file dirname [info script]]
set project_name        "project"

cd $project_directory
open_project [file join $project_directory $project_name]
````

## 2 論理合成(Synthesis)を行う

Vivado では論理合成(Synthesis)と配置配線(Implementation)の各工程を Design Run という単位で管理しています。
ここではプロジェクト生成時に作っておいた論理合成用の Design Run synth_1 を実行します。

なお、launch_runs コマンドは指定した Design Run をバックグラウンドで実行するように指示するだけで、指示し終えたらすぐに戻ってきます。論理合成が終わってからでないと次の工程(配置配線)に進めないので、wait_on_run コマンドで Design Run synth_1 が終了するのを待ちます。

````Tcl:implementation.tcl
launch_runs synth_1
wait_on_run synth_1
````

## 3 配置配線(Implementation)を行う

論理合成(Synthesis)と同じように Design Run impl_1 を実行します。

````Tcl:implementation.tcl
launch_runs impl_1
wait_on_run impl_1
````

## 4 配置配線(Implementation)の結果をレポートする

配置配線(Implementation)後にタイミング違反や使用したリソースを確認したい場合は次のようにしてレポートを出力します。
特にタイミング違反をチェックするのは重要です。

````Tcl:implementation.tcl
open_run    impl_1
report_utilization -file [file join $project_directory "project.rpt" ]
report_timing      -file [file join $project_directory "project.rpt" ] -append
````

## 5 ビットストリームファイルを生成する

ビットストリームの生成は Design Run impl_1 を -to_step write_bitstream オプションをつけて実行することで行います。

````Tcl:implementation.tcl
launch_runs impl_1 -to_step write_bitstream -job 4
wait_on_run impl_1
````

## 6 プロジェクトを閉じる

````Tcl:implementation.tcl
close_project
````

# Tclスクリプトの実行

## Vivado のバッチモードで実行する

Tclスクリプトを Vivado のバッチモードで実行する場合は次のようにします。

````
shell% vivado -mode batch -source implementation.tcl
````

## Vivado の GUIモードから実行する

Tclスクリプトを Vivado のGUIモードから動かす場合は次のようにします。

````
Vivado > Tools > Run Tcl Script... > implementation.tcl
````

# Tclスクリプトサンプル

````Tcl:implementation.tcl
#
# implementation.tcl  Tcl script for implementation
#
set     project_directory   [file dirname [info script]]
set     project_name        "project"
#
# Open Project
#
open_project [file join $project_directory $project_name]
#
# Run Synthesis
#
launch_runs synth_1
wait_on_run synth_1
#
# Run Implementation
#
launch_runs impl_1
wait_on_run impl_1
open_run    impl_1
report_utilization -file [file join $project_directory "project.rpt" ]
report_timing      -file [file join $project_directory "project.rpt" ] -append
#
# Write Bitstream File
#
launch_runs impl_1 -to_step write_bitstream -job 4
wait_on_run impl_1
#
# Close Project
#
close_project
````

# 参考

- [「VivadoをGUIを使わずに実行するためのTclスクリプト達」@Qiita](http://qiita.com/ikwzm/items/a0120079d2f7f86a5904)
最近のLinuxディストリビューションでタイムゾーンを変更するモダンな方法

#はじめに

systemdが導入されている最近のLinuxディストリビューションでタイムゾーン変更の方法を記す。Ubuntu14.04でもCentOS7でも使えるはずである。

もともとのタイムゾーン設定が以下のようになっていると仮定する。なお、ここから先はUbuntu14.04での作業を想定している。

```shell-session
$ date
Thu Jan 14 00:39:19 UTC 2016
$ cat /etc/timezone
Etc/UTC
```

# timedatectl
rootユーザで以下のコマンドを実行する。

```shell-session
# timedatectl set-timezone Asia/Tokyo
```

タイムゾーンを確認する。

```shell-session
$ date
Thu Jan 14 09:46:15 JST 2016
$ cat /etc/timezone
Asia/Tokyo
```

ちなみに`timedatectl`コマンドはsystemdのパッケージである。

以上。
ローカル関数として宣言した場合と関数リテラルとして宣言した場合の評価（生成）の違いについて

確認してみたのでメモ。

# 結論
def内にてdefによるローカル関数として宣言すると評価は1回だけだが、関数リテラルとして宣言すると外側のdefが実行されるたびに都度評価されてしまう模様。
**※「評価」という言葉が適切じゃない気がする。単に「生成」かな。**

# 確認
## ローカル関数の場合

```scala
  def foo(n: Int) = {
    def localFunc(a: Int)(b: Int) = a + b

    localFunc(1)(n) + localFunc(2)(n)
  }

  (1 to 10).foreach(n => println(foo(n)))
```

このプログラムを以下のコマンドで実行して確認してみる。  

```
> scalac src/main/scala/Main.scala -Xprint:jvm 
```

するとこう出力される（fooメソッド部分のみ抜粋）。
localFuncはfooの外側で宣言されたように扱われている。

```scala
def foo(n: Int): Int = Main.this.localFunc$1(1, n).+(Main.this.localFunc$1(2, n));
final private[this] def localFunc$1(a: Int, b: Int): Int = a.+(b);
```

## 関数リテラルの場合

```scala
  def foo(n: Int) = {
    val localFunc: Int => Int => Int = a => b => a + b

    localFunc(1)(n) + localFunc(2)(n)
  }

  (1 to 10).foreach(n => println(foo(n)))
```

関数リテラルで宣言した場合は以下のようになり、fooの呼び出しの度にnewが行われてしまうようだ。

```scala
def foo(n: Int): Int = {
  val localFunc: Function1 = {
    (new <$anon: Function1>(): Function1)
  };
  localFunc.apply(scala.Int.box(1)).$asInstanceOf[Function1]().apply$mcII$sp(n).+(localFunc.apply(scala.Int.box(2)).$asInstanceOf[Function1]().apply$mcII$sp(n))
};
```

## おまけ（ローカル関数を部分適用する）
こんな感じで部分適用した関数を宣言しても同様にfooの呼び出しの度にnewされる。  

```scala
  def foo(n: Int) = {
    def localFunc(a: Int)(b: Int) = a + b

    val f1 = localFunc(1) _
    val f2 = localFunc(2) _
		
    f1(n) + f2(n)
  }

  (1 to 10).foreach(n => println(foo(n)))
```

結果はこう。
localFuncは無事外で宣言されているもののf1とf2はfoo内。

```scala
def foo(n: Int): Int = {
  val f1: Function1 = {
    {
      (new <$anon: Function1>(): Function1)
    }
  };
  val f2: Function1 = {
    {
      (new <$anon: Function1>(): Function1)
    }
  };
  f1.apply$mcII$sp(n).+(f2.apply$mcII$sp(n))
};
final def localFunc$1(a: Int, b: Int): Int = a.+(b);
```

というわけでこれを避けるにはどうするか？
単純にfooメソッドの外で宣言すればよい。

```scala
  private val (f1, f2) = {
    def localFunc(a: Int)(b: Int) = a + b
    (localFunc(1) _, localFunc(2) _)
  }

  def foo(n: Int) = f1(n) + f2(n)

  (1 to 10).foreach(n => println(foo(n)))
```

しかし本来はfooメソッドの中でしか使わないからこそfoo内で宣言したという経緯があるはずで、privateが付いているとはいえf1とf2をfooのスコープ外で宣言するというのはちょっと悔しい感がある。
というわけでこのように書いてみた。

```scala
  val foo: Int => Int = {
    def localFunc(a: Int)(b: Int) = a + b

    val f1 = localFunc(1) _
    val f2 = localFunc(2) _

    (n:Int) => f1(n) + f2(n)
  }

  (1 to 10).foreach(n => println(foo(n)))
```
レンタルサーバーでPhalcon

#さくらレンタルサーバーで Phalcon をインストールした時の覚書

##1.適当なディレクトリを作って、権限なしでインストールするとエラーになります。
git clone git://github.com/phalcon/cphalcon.git
cd cphalcon/build
sh install
⇒
Configuring for:
PHP Api Version:         20100412
...
----------------------------------------------------------------------
Build complete.
Don't forget to run 'make test'.
Installing shared extensions:     /usr/local/php/5.4/lib/php/extensions/no-debug-non-zts-20100525/
cp: /usr/local/php/5.4/lib/php/extensions/no-debug-non-zts-20100525/#INST@93826#: Permission denied
*** [install-modules] Error code 1
Stop in /home/dgdg/tmp/phalcon/cphalcon/build/64bits.

##2.コンパイルは完了しているので、出来た phalcon.so を PHP の extension_dir 用ディレクトリにコピーします。
cp cphalcon/build/64bits/modules/phalcon.so /home/xxx/lib/php_extension/
##3.php.iniの設定
extension_dir=/home/xxx/lib/php_extension/
extension = phalcon.so

#参考にした情報
- [Phalcon ドキュメント](https://docs.phalconphp.com/ja/latest/reference/install.html)
残念ながらFreeBSD でSU権限が無い場合の記述はありません。
- [SqaleでPhalconを使えなかったという話](http://qiita.com/ryomojp/items/af7a7354adfd130301d1)
ここの手順のままで、インストール出来ました。
グリッドシステムとは

画面をグリッド状（格子状）に分割してレイアウトを行っていく手法のことを言います
グリッドシステムに割り当てる記述はcol-xx-NNと決められています

まとめ
１．この時、各グリッドにわける仕組みとしてBootstrapではcol-xx-NNという記述があります。
colはカラムの意味でこのまま記述します
xxには(xs/sm/md/lg)のブレイクポイントを指定します
NNには1～12までの(グリッドの範囲内)数値を入れます。
RedmineとZabbixを共存させるApacheの設定(Virtualhost)

# RedmineとZabbixの共存
監視上で検知したものを、自動的にインシデント登録されるようにしたいと考えている。RedmineとZabbixを使用して実現する。本来であれば、別々のサーバで立てるのが好ましいが、予算の関係上共存させなければいけないこともあるだろう。
Apacheの設定で分けることにした。忘れないようにメモレベルで投稿します。

# Apache設定(VirtualHost)
色々方法はあるが、Listenするポートを変更してしまうのが、一番楽。
Listenポートを2つ指定して、VirtualHostの設定をしよう。

```httpd.conf
#DocumentRoot "/usr/share/redmine/public         ★コメントアウト
Listen 80                # Redmine用
Listen 8080              # Apache用

# redmine用VirtualHost
<VirtualHost xxx.xxx.xxx.xxx:80>         #xxxにはIPアドレス
ServerName hogehoge　　　　　　　　　　　　#hogehogeにはServerName
DocumentRoot "/var/lib/redmine/public"   #RedmineのDocumentRoot
</VirtualHost>

# zabbix用VirtualHost
<VirtualHost xxx.xxx.xxx.xxx:8080>       #xxxにはIPアドレス
ServerName hogehoge                      #hogehogeにはServerName
DocumentRoot "/usr/share/zabbix"         #RedmineのDocumentRoot
</VirtualHost>

```

# アクセス
Apacheを再起動して、アクセスしてみよう。

```
# service httpd restart
```

アクセスは、以下のようになります。
http://hogehoge             ★Redmine
http://hogehoge:8080        ★Zabbix

# 今後の課題
RedmineとZabbixのMySQLのインスタンスを分ける(個々にメンテできなくなるため)。
冗長化の検討(監視もインシデント管理もミッションクリティカルではないが、巨大な規模になってくると停止したときに、別の管理方法に切り替えるのが面倒。あまり止めたくない)。
タスクランナを経由せずTypeDocの設定をファイルに保存する

# TypeDocのこと

[TypeDoc][td]という[TypeScript][ts]用のドキュメント生成器があります(`npm i -g typedoc`)。
[ts]: https://basarat.gitbooks.io/typescript/
[td]: http://typedoc.io/
[tdin]: http://typedoc.io/guides/installation.html
[tsconfig]: https://github.com/Microsoft/TypeScript/wiki/tsconfig.json

# 設定の方法

## コマンド引数

インストールすると、例によって`typedoc`というCLIのツールが用意されており、設定をコマンド引数で渡すことができます。

typedocはデフォルトでもある程度素敵な出力をしてくれますが、`d.ts`を含めるか無視するかを切り替えたり(`--includeDeclarations`)や、ページをファイル単位にするかモジュール単位にするか(`--mode`)など、なかなか気の利いた設定項目があります。

## gulp/gruntの設定中に含める

[インストール][tdin]の説明ページにはgulpとgruntの設定例が書いてあります。ただ、付属の`typedoc`コマンドを直接使う場合については、設定をコマンドラインで渡す方法以外の記述がありません。

## typedoc.jsというファイルを用意する

[`tsconfig.json`][tsconfig]のようにコマンドのフラグを保存する方法がないか探したところ、`typedoc.js`というファイルを用意すればそれを読んでくれるようでした。`--options`フラグでファイル名を指定することもできるようです(よく見るとヘルプに出ていました)。

```shell-session:typedocのヘルプ
$ typedoc 
(...)
--options    Specify a js option file that should be loaded.
If not specified TypeDoc will look for 'typedoc.js' in the current directory.
```

### typedoc.jsの形式

`typedoc.js`の雛形が見当たらなかったので、[中身を見ながら](https://github.com/sebastian-lenz/typedoc/blob/e44be23a9d16cc8c976747ca748916416f000183/src/lib/utils/options/readers/typedoc.ts)試したところ、オブジェクトをエクスポートすればいいようです。

```js:typedoc.js
module.exports = {
  "name": "hogeproject",
  "out": "doc",
  "mode": "file",
  "includeDeclarations": true,
  "hideGenerator": false
}
```

他に、関数をエクスポートすれば直接`TypeDoc.Application`オブジェクトを引数として呼び出されるようです。

## tsconfig.json中に書く

「設定ファイルを別に設けるよりも`tsconfig.json`に含めてはどうか？」という[issue](https://github.com/sebastian-lenz/typedoc/issues/130)がありました。記事自体はオープンのままですが、どうも[こっそり][commit][実装されている][tsconfigjs]ようです。

`"typedocOptions"`というキーで含めればいいようなので、試してからまた追記します。
[commit]: https://github.com/sebastian-lenz/typedoc/commit/a36d71281702eea70f352d1c87d53ae921d7c549
[tsconfigjs]: https://github.com/sebastian-lenz/typedoc/blob/e44be23a9d16cc8c976747ca748916416f000183/src/lib/utils/options/readers/tsconfig.js

# todo

ファイル内容をインラインで含める機能もあるようなのですが、ヘルプで見つけられなかったので今度探そうと思います。

# リンク

* [TypeScript][ts]
* [TypeDoc][td]
* [Support tsconfig.json #130](https://github.com/sebastian-lenz/typedoc/issues/130)
技術英語 > You have two days to become an expert. / It's his area of expertise.

@ Star Trek movie > 叛乱

今後必要となる情報が掲載された資料を入手したカウンセラートロイに対してピカード艦長が

> You have two days to become an expert.

字幕は「2日間で覚えろ」

<hr>
関連して思い出したのは

http://qiita.com/7of9/items/2b66014341bb784a416c

> It's his area of expertise.
EC-CUBE3でHTMLじゃなくてxmlとかで出力する

EC-CUBE3はSilexとSymfony Compornentsを使ってます。
テンプレートはtwigを使って、結果をSymfonyのResponse使って出力してるのですが、HTMLじゃなくてjsonとかXMLとかで特定のURLを出力したい事ってあると思います。僕はありました。
そんな時にどうやるかです。

# ``header("Content-Type: text/xml);``とか効かない
たぶん、ControllerでHTTPヘッダ吐いても、ResponseオブジェクトがHTMLとしてContent-Typeを吐いちゃうので効かないです。
なので、テンプレートにもろもろ埋め込んだ後の結果を返す際にResponseオブジェクトを渡して、ResponseオブジェクトでContent-Typeを指定する必要があります。

## Sample

### Controller
```php
<?php
namespace Eccube\Controller;

use Eccube\Application;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

class XmlSampleController
    public function ViewXml(Application $app, Request $request)
    {
        $response = new Response();
        $response->headers->set('Content-Type', 'text/xml');//Content-Typeを設定

        return $app->render(
            'Resource/template/Front/sample_xml.twig',
            array('product_id' => 1,"product_name"=>"おなべ")
            ,$response//第三引数でResponseオブジェクトを渡してあげる
        );
    }
}
```

### テンプレート
```xml+php
<?xml version="1.0" encoding="UTF-8"?>
<product>
   <id>{{ product_id }}</id>
   <name>{{ product_name }}</name>
<prodcut>
```

## でも面倒くさい...
こんな風にできたらいいのになぁ...

```php
<?php
namespace Eccube\Controller;

use Eccube\Application;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

class XmlSampleController
    public function ViewXml(Application $app, Request $request)
    {
        $app["response"]->headers->set('Content-Type', 'text/xml');//Content-Typeを設定

        return $app->render(
            'Resource/template/Front/sample_xml.twig',
            array('product_id' => 1,"product_name"=>"おなべ")
        );
    }
}
```

ちなみにコアのCSVファイルの出力は``Symfony\Component\HttpFoundation\StreamedResponse``を使ってこんな風に実装されてます。

```php
public function export(Application $app, Request $request)
{
    // タイムアウトを無効にする.
    set_time_limit(0);

    //データ抽出
    ...

    $response = new StreamedResponse();
    $response->setCallback(function () use ($app, $request) {

        //CSV Service使ってCSVの中身を出力
        ...
    });

    $now = new \DateTime();
    $filename = 'product_' . $now->format('YmdHis') . '.csv';
    $response->headers->set('Content-Type', 'application/octet-stream');
    $response->headers->set('Content-Disposition', 'attachment; filename=' . $filename);
    $response->send();

    return $response;
}
```

面倒くさいなぁ...


### [EC-CUBEのカスタマイズはこちら](https://www.xross-cube.com/service/ec-cube%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA)
CentOS 7 に Trac 1.0 をインストールする

## Trac
https://trac.edgewall.org/
**Trac** は Python で書かれた課題管理ツール。

（追記）「[Python 製の課題管理ツール Trac - Qiita]( http://qiita.com/bezeklik/items/304dbe67c692dca1d87f)」で Trac 1.2 のインストールを再検証した。

## 構築環境例
* CentOS 7.2.1511 (minimal)
* Apache 2.4.6
* Python 2.7.5
* setuptools 0.9.8 (easy_install)
* GNU Enscript 1.6.6
* Trac 1.0.9
* Babel 2.2.0
* Genshi 0.7


## Trac のインストール
```bash
yum -y install gcc python-devel python-setuptools enscript
easy_install Babel
easy_install Trac
```
Trac および trac-admin は自動で日本語化される。
この際、Babel を事前にインストールしていないと英語版のみのインストールとなる。[^1]
`easy_install Babel Trac` などと一括で処理すると英語版のみになってしまう。
[^1]: http://qiita.com/bezeklik/items/139c7096663a676481ea#comment-b98cde46bb8408296cc1

## Apache のセットアップ
```bash
yum -y install httpd mod_wsgi
mkdir /var/www/trac
chown apache:apache /var/www/trac
cat <<_EOF_ > /var/www/trac/trac.wsgi
import os
os.environ['TRAC_ENV_PARENT_DIR'] = '/var/www/trac'
os.environ['PYTHON_EGG_CACHE'] = '/var/www/trac/eggs'
import trac.web.main
application = trac.web.main.dispatch_request
_EOF_
chmod 755 /var/www/trac/trac.wsgi
cat <<_EOF_ > /etc/httpd/conf.d/trac.conf
WSGIScriptAlias /trac /var/www/trac/trac.wsgi
<Directory /var/www/trac>
    WSGIApplicationGroup %{GLOBAL}
    Require all granted
</Directory>
<LocationMatch "/trac/.*/login">
   AuthType Basic
   AuthName "trac"
   AuthUserFile "/var/www/trac/.htpasswd"
   Require valid-user
</LocationMatch>
_EOF_
firewall-cmd --permanent --add-service=http && firewall-cmd --reload
httpd -t
systemctl start httpd && systemctl enable $_
setenforce 0 #TODO
```
## BASIC 認証のユーザー追加
```bash
htpasswd -c /var/www/trac/.htpasswd user1
htpasswd /var/www/trac/.htpasswd user2
```

## Subversion
```bash
yum install subversion subversion-python mod_dav_svn
mkdir /var/www/svn
cat <<_EOF_ > /etc/httpd/conf.d/subversion.conf
<Location /svn>
    DAV svn
    SVNParentPath /var/www/svn
    <LimitExcept GET PROPFIND OPTIONS REPORT>
        AuthType Basic
        AuthName "Subversion - Authorization Realm"
        AuthUserFile /var/www/trac/.htpasswd
        Require valid-user
    </LimitExcept>
</Location>
_EOF_
httpd -t
systemctl restart httpd
```
## 参考
* http://trac.edgewall.org/wiki/TracInstall
Karabiner で Netbeansを無効、オフにする方法




* 自分用メモ


## 設定内容


```xml:private.xml
<?xml version="1.0"?>
<root>
    <appdef>
        <appname>NetBeans</appname>
        <equal>org.netbeans.ide.baseide.8.1</equal>
    </appdef>
<item>
  <name>Disable all settings while using NetBeans 8.1</name>
  <identifier>private.ignore_netbeans</identifier>
  <only>NetBeans</only>
  <autogen>__PassThrough__</autogen>
</item>
</root>
```

## 参考

[MacOSX - OSX上のVirtualBoxを使う時だけKarabinerを無効にする - Qiita](http://qiita.com/kazoo04/items/dca88bf882ce33be4fb5)


## 設定項目の意味ややり方

以下を参考

* EventViewerを起動して、アプリ名とかを取得、設定

[private.xml Reference Manual - Karabiner - OS X用のソフトウェア](https://pqrs.org/osx/karabiner/xml.html.ja)
struct と class で異なる Failable Initializers

<font color="Red">EDIT: Swift 2.2 ではこの問題は解決していますので、記事を参考にする際はご留意ください。</font><font color="silver">2016.5</font>

## Failable Initializers
Swift の Failable Initializers について調べていたら、 以下のような記述が出ていた。

https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Initialization.html#//apple_ref/doc/uid/TP40014097-CH18-ID224

```swift
struct Animal {
    let species: String
    init?(species: String) {
        if species.isEmpty { return nil }
        self.species = species
    }
}
```

Playground で試してみる確かにエラーにならない。しかし、struct を class に変えると…

```swift
class Animal {
    let species: String
    init?(species: String) {
        if species.isEmpty { return nil } // error
        self.species = species
    }
}
```
なんと「全てを初期化しないと nil を返して戻れないよ」と言われてしまった。

```
All stored properties of a class must be initialized before returning nil from an initializer.
```

ドキュメントもう少し下にスクロールすると、あった！ class の場合の記述。

## Failable Initializers for Classes
> A failable initializer for a value type (that is, a structure or enumeration) can trigger an initialization failure at any point within its initializer implementation. In the Animal structure example above, the initializer triggers an initialization failure at the very start of its implementation, before the species property has been set.
>
> For classes, however, a failable initializer can trigger an initialization failure only after all stored properties introduced by that class have been set to an initial value and any initializer delegation has taken place.
>
> The example below shows how you can use an implicitly unwrapped optional property to satisfy this requirement within a failable class initializer:
>
>```swift
class Product {
    let name: String!
    init?(name: String) {
        self.name = name
        if name.isEmpty { return nil }
    }
}
```

やっぱり、class の場合は、全てを初期化してからでないとダメだってさ。チェックする項目が多くて、if 文がいくらか必要な場合はそれ毎に、無意味な値に初期値を入れて、nil を返す必要があります。

例えば、PDFを扱うクラスを例に挙げると、PDFファイルのパスを与えると、最低限そのファイルがPDFとして開ける事ができるかどうかのチェックを行うと、チェックの都度 else で値を初期化して nil を返す必要があります。

```swift
class PDFContents {
	let filePath: String
	let numberOfPages: Int
	init?(filePath: String) {
		if NSFileManager.defaultManager().fileExistsAtPath(filePath) {
			if let document = CGPDFDocumentCreateWithURL(NSURL.fileURLWithPath(filePath)) {
				self.filePath = filePath
				self.numberOfPages = CGPDFDocumentGetNumberOfPages(document)
			}
			else {
				self.filePath = filePath
				self.numberOfPages = 0
				return nil
			}
		}
		else {
			self.filePath = filePath;
			self.numberOfPages = 0;
			return nil
		}
	}
}
```

まぁ、この場合はファイルの有無を確認を省いて、PDFを開いてみれば if 文を減らせるかもしれませんが、チェックが多い場合には不便です。何か良い記法がないものでしょうかねぇ？そして、将来のSwiftのバージョンのどこかでは、nil を返すときは初期化していない変数があっても見逃してくれるように期待したいものです。

【環境】
Xcode7.2
Swift 2
screenrecordの"unofficial" optionsは夢がいっぱいだった

はい、釣りタイトル。

Android 4.4から追加された**screenrecord**ってコマンドのソースコード読んでたら、**"unofficial" options**を見つけたのでその話。

screenrecordがどんなものなのかを知りたいなら、ざっくり以下の記事がいいと思う。
(簡単に言ってadb shell経由で画面の録画ができる便利機能)

[[Android4.4 KitKat] 新機能 screenrecordで画面を録画する方法 | アドカレ2013 : SP #19](http://dev.classmethod.jp/smartphone/android-screenrecord-tutorial/)

## "unofficial" options

さて、本題の**"unofficial" options**。コード的にはこんな感じに書いてあった。

http://tools.oesf.biz/android-6.0.0_r1.0/xref/frameworks/av/cmds/screenrecord/screenrecord.cpp#881

```java
881     static const struct option longOptions[] = {
882         { "help",               no_argument,        NULL, 'h' },
883         { "verbose",            no_argument,        NULL, 'v' },
884         { "size",               required_argument,  NULL, 's' },
885         { "bit-rate",           required_argument,  NULL, 'b' },
886         { "time-limit",         required_argument,  NULL, 't' },
887         { "bugreport",          no_argument,        NULL, 'u' },
888         // "unofficial" options
889         { "show-device-info",   no_argument,        NULL, 'i' },
890         { "show-frame-time",    no_argument,        NULL, 'f' },
891         { "rotate",             no_argument,        NULL, 'r' },
892         { "output-format",      required_argument,  NULL, 'o' },
893         { NULL,                 0,                  NULL, 0 }
894     };
```

"unofficial" optionsなものは以下っぽい。

### show-device-info
 * つけても`gWantInfoScreen`に`true`を設定するだけ
 * つまんねー

### show-frame-time
 * つけて録画すると、録画にフレームの数値とタイムスタンプが追加される
 * 下のGifの左上のやつな
 * `--bugreport` Optionでええやん

### rotate
 * まさかの反転録画機能！！胸熱
 * コード読む感じ90度動かしてる？？
 * まだ実験的な機能らしい

http://tools.oesf.biz/android-6.0.0_r1.0/xref/frameworks/av/cmds/screenrecord/screenrecord.cpp#954

```java
954         case 'r':
955             // experimental feature
956             gRotate = true;
957             break;
```

### output-format
 * 出力するFormatが選べる
 * 対応してるFormatは4つっぽい
 * **[mp4 / h264 / frames / raw-frames]**
 * 以下のような感じで`--output-format` Optionの後にFormatを指定する
 * `adb shell screenrecord --output-format raw-frames /sdcard/test`
 * まさか生のフレームも録画できる！？

## show-frame-time Option付けて撮った

![circleAnimationMuvie.gif](https://qiita-image-store.s3.amazonaws.com/0/43637/6e93004c-dae9-7597-c513-c3b2ea77e0f5.gif)

## rotate Option付けて撮った

![circleAnimationMuvie.gif](https://qiita-image-store.s3.amazonaws.com/0/43637/91462128-1e4e-590a-dab2-d26fdf3d9de0.gif)



## screenrecordのコード


基本的にメインのコードはこいつ

http://tools.oesf.biz/android-6.0.0_r1.0/xref/frameworks/av/cmds/screenrecord/screenrecord.cpp

全体的に読みたければこっち

http://tools.oesf.biz/android-6.0.0_r1.0/xref/frameworks/av/cmds/screenrecord/

## まとめ

コードを見た感じ**`TODO`**っていっぱい書いてあって、まだ夢がいっぱい詰まっている感じの実装だった。
これからの機能追加に期待！
yieldを悪用して一時停止可能なスレッドを実装する

普通のサブルーチンがあったとします

    def foo():
      print("foo")
      print("bar")

    foo()  # "foo"と"bar"を出力

これに`yield`を挟み込むことで分割します

    def foo():
      print("foo")
      yield 0
      print("bar")
      yield 0

    f = foo()
    f.__next__()  # "foo"を出力
    f.__next__()  # "bar"を出力

つまりひとつの処理を`yield`でイテレータにします
これを`Thread`に応用すれば一時停止/再開/中断(`pause/resume/halt`メソッド)が実装できます

	class Shred(Thread):
		def __init__(actions):
			Thread.__init__()
			self._actions = actions
			self.is_halted = False
			self.is_paused = False

		def run():
			while True:
				if self.is_paused:
					continue
				if self.is_halted:
					return
				try:
					self._actions.__next__()
				except StopIteration:
					self.is_halted = True
					return

		def pause():
			self.is_paused = True

		def resume():
			self.is_paused = False

		def halt():
			self.is_halted = True

（実際はフラグに`Event`を使ったほうがいいです）
これによって一時停止/再開/中断のチョークポイントを`yield`のみで表現でき、
可読性の向上に加え、他のロジックの記述に集中できるようになります

	def baz():
		for n in range(10):
			print(n)
			time.sleep(1)
			yield 0

	s = Shred(baz())
	s.start()
	time.sleep(2)
	#  0
	#  1
	#  2
	s.pause()
	time.sleep(2)
	#  2秒間出力なし
	s.resume()
	time.sleep(2)
	#  3
	#  4
	#  5
	s.halt()
	#  出力終了

ちなみにこのイテレータは内容をすべて実行すれば元のサブルーチンに戻ります

	list(baz())
	#  0
	#  1
	#  2
	#  ...
	#  9

・・・というのを考えついたのですが以下の理由で実際には使いませんでした

- 驚き最大
- たいてい後から普通に実装することになる
- 副作用を積極的に活用するのは気が引ける
- 言語に遊ばれてる気がして腹立ってきた
- ていうか今どきこんな低級API叩いてる人いないよ

というわけでどれだけ参考になるか知りませんがこれで終わります
AWSのGPU有りインスタンスにChainer 1.5を最も簡単にインストールする

## はじめに

執筆時点での一番簡単なインストール方法を記したつもりです。
間違い等ありましたらコメントしていただけるとありがたいです。

以下のような方を想定して書いています。

 - EC2インスタンスは建てたことがある(そこまで詳しくある必要は無い)
 - Chainerを使ってみた、あるいは初めて使ってみるがどうせならGPUを使いたい
 - **簡単にやりたい** [^1]

[^1]: GPUを使わない場合はもっと簡素にできます。


## 手順の概要

 1. NVIDIAが公開しているCUDA及びGPUドライバインストール済みのAMIを使用してインスタンスを作成
 2. Chainerが必要とする依存ライブラリ郡をインストール
 3. Chainerをインストール

## 下準備

GPUをフル活用するためにはNVIDIAのライブラリを使う必要があります。
NVIDIAのライブラリはフリーですが、使うには事前に登録する必要があるので先にしましょう(Registeringに多少時間がかかります)。

[公式cuDNNページ](https://developer.nvidia.com/cudnn)

詳しい手順は明記しませんが、 `Register` の ボタンから登録を済ませ、確認用メールにて本登録処理をしておいてください。

## 手順1. EC2インスタンスの作成
最も一般的と思われるインスタンスの作成はAmazon Linuxを選択して作成する方法だと思いますが、今回はAmazonマーケットプレイスに公開されているNVIDIAのAMIを使います。

この画面左のタブからAWS Marketplaceを選択して

![Screenshot from 2016-01-14 02:31:01.png](https://qiita-image-store.s3.amazonaws.com/0/39318/f2cf06e2-60a4-6d10-501b-3ef337f94e63.png)

検索窓で「NVIDIA」と入力して以下のイメージを探します。
![Screenshot from 2016-01-14 02:32:43.png](https://qiita-image-store.s3.amazonaws.com/0/39318/102977c0-df96-ec44-9cfb-1724ec157a61.png)

次へ進むと `2xlarge` と `8xlarge` が選択できるようになっていますが、 `2xlarge` しか使ったことがないのでどれほどの性能差があるかはわかりません。
このままあとはいつもどおり作成しましょう。

## 手順2. Chainer依存ライブラリ群のインストール
###cuDNN
NVIDIA公式AMIを使うとCUDAの状態は

 -  install directory: `/opt/nvidia/cuda` 
 -  version: 6.5

なので(執筆時)、CUDAに依存するパッケージであるcuDNNもこれに対応してインストールします。

下準備で登録したメールアドレスに `Congratulations, you are now a member of the Accelerated Computing Developer Program` のような内容が届いていれば本登録済みなので次に進みましょう。来てない場合は先に進まずにコーヒーでも淹れるのが吉です(Chainerは **本体より先に** 依存ライブラリを入れておくことが推奨されている)。

[公式](https://developer.nvidia.com/cudnn)からDownloadをクリック。
CUDA6.5に対応するcuDNNは `v2` なので、下の `Archived cuDNN Releases` クリックして `cuDNN v2 Library for Linux` をダウンロードし、インスタンスのサーバーにアップロードして展開しておきましょう。[^2]
[^2]: ちなみに最新版を使いたい場合など、CUDAを自前で入れる等している場合は対応するcuDNNのバージョンも違います。

あとは展開したディレクトリへ移動し、

```bash
$ sudo cp lib* /opt/nvidia/cuda/lib64
$ sudo cp cudnn.h /opt/nvidia/cuda/include/
```
これでおっけーです。[^3]
[^3]: CUDA7.0以上を使いたくてcuDNNもv3以上を用意する場合は、cuDNN解凍後のディレクトリ構造が違うので注意。また、Chainer1.5はcuDNN v3までの対応なので、v4とかはサポート外(執筆時)なのでやめておくことをおすすめします。

### hdf5
Chainer1.5から依存パッケージに `h5py 2.5.0` が仲間入りしました。
これはPythonのライブラリですが `hdf5` を前提にされているため、こいつだけ手動でいれてあげましょう。

```bash
$ sudo yum-config-manager --enable epel
$ sudo yum install -y hdf5-devel
```
依存パッケージはこれにて終了です。

## Chainerのインストール
1行です。[^4]

[^4]: sudoを使うと環境変数を維持できないので公式で書かれてる通りインストーラーに伝える

```bash
$ sudo CUDA_PATH=/opt/nvidia/cuda pip install chainer
```

一応確認しておきましょう。

```bash
$ python
>>> import chainer
```
エラーが出なければ問題ないでしょう。
お疲れ様でした。

## おわりに
長々と書きましたがだいたいは[公式](http://docs.chainer.org/en/stable/install.html)に書いてあるとおりやっただけです。
ただ、hdf5の依存でハマったりcuDNNのインストールでハマったり(テキトーに最新版入れとけ→あぼーん)したので、参考になれば幸いです。

以下、参考にさせていただきました。
> [Amazon EC2のGPUインスタンスにChainer v1.5を3行で入れる](http://qiita.com/unnonouno/items/8d8118bb38a589f7dbfa)
> [AWS EC2のg2.2xlargeをスポットインスタンスで立てて、chainerを動かしてみる](http://qiita.com/pyr_revs/items/e1545e6f464b712517ed)
MySQL 5.7.8以降で古いアプリが動かない場合の対処（sql_mode）

MySQL 5.7からはデフォルトの設定が色々変わっているので、5.6で動いていたアプリケーションが動かないケースがある。

# 主な理由はデフォルトのsql_modeの違い
- 5.7からはデフォルトで``ONLY_FULL_GROUP_BY``や``NO_ZERO_IN_DATE``とかが設定されている。
- ``ONLY_FULL_GROUP_BY``が設定されていると、postgreSQLみたいにorder by句とgroup by句で同じカラムが指定されていないとエラーになる。
- ``NO_ZERO_IN_DATE``が設定されていると、``careate_date = '0000-00-00 00:00:00'``みたいなのでエラーになる。
- 5.7系でもバージョンによって細かくデフォルトのsql_modeが違うので注意が必要。

詳しくは公式のドキュメントを[参照](http://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_sql_mode)

## <= 5.7.4
``NO_ENGINE_SUBSTITUTION``

## >= 5.7.8
``ONLY_FULL_GROUP_BY STRICT_TRANS_TABLES NO_ZERO_IN_DATE NO_ZERO_DATE ERROR_FOR_DIVISION_BY_ZERO NO_AUTO_CREATE_USER NO_ENGINE_SUBSTITUTION``

# 解決策
my.cnfとかでsql_modeを``NO_ENGINE_SUBSTITUTION``だけとかに設定する。
3D-CNNを実行可能なCaffeをまっさらなUbuntu 14.04にインストールする

まっさらなUbuntu 14.04環境から、pythonでcaffeを用いた3D-CNNを利用できるようになるまで環境構築した話を書きたいと思います。

なお、root権限を持っていると仮定します。
「これが一番早いと思います」

#pyenvのインストール
pyenvはダウンロード＝インストール。ただ、gitを利用するのでそれをインストールするのを忘れずに。

```bash
sudo apt-get install git
git clone git://github.com/yyuu/pyenv.git ~/.local/pyenv
```

保存位置にパスを通すため、.bashrcに下記を追加

```bash
export PYENV_ROOT=~/.local/pyenv  #この後のpyenv installするために必要
export PATH=$PYENV_ROOT/bin:$PATH
eval "$(pyenv init -)"
```

sourceするのを忘れずに。

```bash
source ~/.bashrc
```

（参考資料：[Ubuntuにpyenvを用いてpython環境を構築しました。](http://www.takunoko.com/blog/ubuntu%E3%81%ABpython%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F%E3%80%82/)）


#anacondaのインストール
pyenvにanacondaをぶち込み、それを既定のpython環境とする。

```bash
pyenv install anaconda-2.3.0 #10分くらいかかる
pyenv global anaconda-2.3.0
```

anacondaの環境整備

```bash
conda install protobuf
```

（参考資料：[TSUBAME2.5でのCaffeによる3D-CNNの利用方法](http://qiita.com/Leben4010/items/3fb103244c25666986db)）
#必要なモノの数々のインストール

```bash
sudo apt-get install libatlas-base-dev libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libhdf5-serial-dev protobuf-compiler libgflags-dev libgoogle-glog-dev liblmdb-dev python-numpy
sudo apt-get install --no-install-recommends libboost-all-dev
```

（参考資料：[Caffe - Ubuntu Installation](http://caffe.berkeleyvision.org/install_apt.html)）

#caffeのインストール

```bash
git clone https://github.com/jmerkow/caffe.git ~/.local/caffe
cd ~/.local/caffe
cp Makefile.config.example Makefile.config
```

Makefile.configを修正。私の手元の環境はGPUがないのだ。

```
-# CPU_ONLY := 1
+CPU_ONLY := 1  
```

makeの実行

```bash
make all
make test 
make runtest

make pycaffe
```

再度.bashrcを修正。この後にsourceしてね。

```bash
export PYTHONPATH=~/.local/caffe/python:$PYTHONPATH
```

ここまでやって、pythonインタプリタ上で

```py
import caffe
```
が上手く行ったらOK。完了です。

#caffeを動かしてみる
工事中。3D-CNNを走らせる例を示したい。



----
### 記事に書き足したいこと

- atlasではなくOpenBLASを使うバージョンの手順の作成
- caffeを用いた学習の実行
IO#pipeは書き込み続けると止まる

IO#pipeは読み出さずに書き込み続けるとブロックされる。

```
r, w = IO.pipe
20000.times { |n|
    print "\b\b\b\b\b%05d" % n
    w.print "hoge"  # 16384回ぐらいで止まる
}
w.close
```

スレッドの外側で読み出し続ければ止まらない。

```
r, w = IO.pipe
Thread.fork do
    20000.times { |n|
        print "\b\b\b\b\b%05d" % n
        w.print "hoge"
    }
    w.close
end
r.read  # 読み出せば止まらない
```

Thread#joinを使うとなぜか止まる。

```
r, w = IO.pipe
Thread.fork do
    20000.times { |n|
        print "\b\b\b\b\b%05d" % n
        w.print "hoge"  # 16384回ぐらいで止まる
    }
    w.close
end.join
r.read
```

Thread#abort_on_exceptionなら止まらない。

```
r, w = IO.pipe
Thread.fork do
    20000.times { |n|
        print "\b\b\b\b\b%05d" % n
        w.print "hoge"  # 止まらない
    }
    w.close
end.abort_on_exception = true
r.read
```