OmniAICreator/Qiita-1.07M huggingface dataset:
Unityでコンポーネント拡張時にインスペクターに追加した変数を出力する方法

##やりたいこと
ボタンがPress状態の時にハイライト画像を上から重ねたい

##実装手法
Buttonの子オブジェクトにハイライトオブジェクトを配置し
Press時にアクティブに、離したときに非アクティブにする。

##実装プログラム
Buttonを継承する
ハイライトオブジェクトを設定する
各イベントでハイライトのアクティブを切り替える

```csharp:ButtonHighlight.cs

using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;

public class ButtonHighlight : Button
{
    // ハイライトオブジェクト
    public GameObject highlight;
	
    public override void OnPointerClick(PointerEventData eventData)
    {
        base.OnPointerClick(eventData);
        if (highlight != null && highlight.activeSelf)
            highlight.SetActive(false);
    }

    public override void OnPointerExit(PointerEventData eventData)
    {
        base.OnPointerExit(eventData);
        if (highlight != null && highlight.activeSelf)
            highlight.SetActive(false);
    }
    public override void OnPointerDown(PointerEventData eventData)
    {
        base.OnPointerDown(eventData);
        if (highlight != null && !highlight.activeSelf)
            highlight.SetActive(true);
    }
}

```

##問題点
追加したGameObjectのhighlightの変数がインスペクター上に表示されない
コンポーネントを継承した場合、追加した変数はインスペクター上に表示されないらしい

##解決方法
エディタ拡張を使い、強制的に変数を表示させる

Editorディレクトリに以下のスクリプトを入れる

```csharp:ButtonHighlightEditor.cs

using UnityEngine;
using UnityEditor;
using UnityEditor.UI;

[CustomEditor(typeof(ButtonHighlight))]
public class ButtonHighlightEditor : ButtonEditor {
    public override void OnInspectorGUI()
    {
        var bh= target as ButtonHighlight;
        GUILayout.BeginHorizontal();
        bh.highlight = EditorGUILayout.ObjectField("highlight", bh.highlight, typeof(GameObject), true) as GameObject;
        GUILayout.EndHorizontal();

        base.OnInspectorGUI();
    }
}

```
powershell > サブフォルダ内のcppファイルに対して、キーワードで検索する > Get-ChildItem D:\WORK *.cpp -Recurse | Select-String -pattern "main\.h"

```txt:動作確認
Windows 7 pro
```

今日Powershellのコードを教えてもらい非常に便利だと感じた。

複数フォルダ内のcppファイルからキーワード検索するのはpowershellを立ち上げてから以下でよさそう。

```
Get-ChildItem D:\WORK *.cpp -Recurse | Select-String -pattern "main\.h"
```

バッチファイルの場合、以下で取得できた。

```findkeyword.bat
powershell "Get-ChildItem D:\WORK *.cpp -Recurse | Select-String -pattern main\.h" > file3.txt
```

"main.h"のドットについては、"\"をつけないと余分なものがひっかかる。
[XCode、 Objective-C] iOS 7系、LabelなどのFont種類でSystem Mediumを使うと起きる問題

iOS7系でLabelなどのFont種類を指定する時に
>System FontのスタイルをMediumにすると
数字のフォントがおかしくなる

iOS7系ではバクがあるようなので
>System FontのスタイルをRegularに戻したら
ちゃんと表示するようになった
CakePHP3 json出力のヘッダーを指定する

'_serialize'　とか使わないで、直接自分で `json_encode` したいような時、ヘッダーが

```
application/json; charset=UTF-8
```

になってくれないので以下のように指定する。


```php
    public function jsonOutput()
    {
        $this->autoRender = false;

        $someVariable = .....;

        $this->response->charset('UTF-8');
        $this->response->type('json');
        echo json_encode($someVariable);
    }
```
Date で、IE8 が NaN を返すときにしたことメモ

### 日付のフォーマットが、`2015-11-10T12:37+09:00`のとき IE８で `NaN`を返したので、そのときの対策をメモしておきます。

`new Date("2015-11-10T12:37+09:00")` だと、`NaN` になるので
`2015,10,25,17,11,00` のフォーマットが良いらしい。

※ ライブラリを使えるならこのような方法はしなくても良いかもしれません。

現在の年月日時と、与えられた年月日時（2015-11-10T12:37+09:00）のフォーマットを比較するとき、IE8では単純にnew Date(2015-11-10T12:37+09:00).getTime() ができないので、
下記のようなフォーマット変換後に比較することにしました。

```js
var date = "2015-11-25T17:11+09:00";
// var date = "2015-11-25T17:11Z";
var dateTimeArr = date.split('T');
var ymdArr = dateTimeArr[0].split('-');
var y = ymdArr[0];
var m = Number(ymdArr[1]) - 1;
var d = ymdArr[2];
var sepTime = dateTimeArr[1];
var resTime = sepTime.replace('Z', '').split(/\+|\-/)[0].split(/:/g);
var h = resTime[0];
var min = resTime[1];
var sec = '00';
console.log( new Date(y, m, d, h, min, sec).getTime() );
```

ここで気になったのが、タイムゾーンで、この時間を考慮すると、年や、月、日またぎ計算がとても複雑になります。でも比較なら
`"2015-11-25T17:11+09:00"` 日本はタイムゾーンが +09:00 ですが考慮する必要はなく、

```js
new Date() // Wed Nov 25 17:11:00 UTC+0900 2015 <- IE8での出力結果
new Date("Wed Nov 25 17:11:00 UTC+0900 2015").getTime()
// 1448439060000
```

で得られる時間 と、+09:00 がない年月日時

```js
new Date(2015,10,25,17,11,00).getTime() // 1448439060000
```

は同じミリ秒になります。

なので、現在の年月日時と、IE8用にフォーマットした年月日時 を比較できます。

```js
if (new Date().getTime() > new Date(y, m, d, h, min, sec).getTime())
```


この方法でタイムゾーンを考慮しなくても、ミリ秒で比較できるのは、
> 日付文字列でタイムゾーン文字列がない場合、UTC として扱うという ECMAScript 5 の仕様

ということらしいです。
以外と便利。
Railsのバッチではオプションパーサを使うべきではない

Railsでバッチを実行する場合、runnerで以下のようにできる。

```
bundle exec rails runner Batches::Sample.function
```

値を渡したかったのでオプションをつけてみた。

```rb:バッチ本体
class Batches::Sample
  def self.function
    if ARGV.empty?
      puts "NO ID"
      return
    end
    my_id = nil
    argv = ARGV.dup
    argv.delete "--" if argv.include? "--"
    OptionParser.new do |parser|
      parser.on("-i", "--my_id MY_ID", Integer) { |v| my_id = v }
      parser.parse!(argv)
    end
    puts "SUCCESS"
  end
end
```

```
bundle exec rails runner Batches::Sample.function -- -i 1
```

バッチをcronで定期的に実行したい。wheneverというGemが便利。

```
every 1.hour do
  runner 'Batches::Sample.function'
end
```

これが

```
$ bundle exec whenever
0 * * * * /bin/bash -l -c 'cd /home/user/project && bin/rails runner -e development '\''Batches::Sample.function'\'' >> log/cron.log 2>&1'

## [message] Above is your schedule file converted to cron syntax; your crontab file was not updated.
## [message] Run `whenever --help' for more options.
$ bundle exec whenever --update-crontab
[write] crontab file updated
```

こうなって

```
/home/user/project/lib/batches/sample.rb:12:in `block in function': invalid option: -e (OptionParser::InvalidOption)
        from /home/user/project/lib/batches/sample.rb:10:in `new'
        from /home/user/project/lib/batches/sample.rb:10:in `function'
        from /home/user/project/vendor/bundle/ruby/2.1.0/gems/railties-4.1.10/lib/rails/commands/runner.rb:62:in `<top (required)>'
        from /home/user/project/vendor/bundle/ruby/2.1.0/gems/railties-4.1.10/lib/rails/commands/runner.rb:62:in `eval'
        from /home/user/project/vendor/bundle/ruby/2.1.0/gems/railties-4.1.10/lib/rails/commands/runner.rb:62:in `<top (required)>'
        from /home/user/project/vendor/bundle/ruby/2.1.0/gems/railties-4.1.10/lib/rails/commands/commands_tasks.rb:128:in `require'
        from /home/user/project/vendor/bundle/ruby/2.1.0/gems/railties-4.1.10/lib/rails/commands/commands_tasks.rb:128:in `require_command!'
        from /home/user/project/vendor/bundle/ruby/2.1.0/gems/railties-4.1.10/lib/rails/commands/commands_tasks.rb:95:in `runner'
        from /home/user/project/vendor/bundle/ruby/2.1.0/gems/railties-4.1.10/lib/rails/commands/commands_tasks.rb:40:in `run_command!'
        from /home/user/project/vendor/bundle/ruby/2.1.0/gems/railties-4.1.10/lib/rails/commands.rb:17:in `<top (required)>'
        from bin/rails:4:in `require'
        from bin/rails:4:in `<main>'
```

ご覧の有様。

railsコマンドに対するオプションがバッチにも与えられてしまっているらしい。
対処法が無いか調べたがどうにもならず。
結局、値はハッシュを使って引数で渡すことにした。

```
bundle exec rails runner 'Batches::Sample.function(id: 1)'
```
CPythonに後置インクリメントを加えてみた　番外編

# リンクリスト
全三回プラス番外編になっています。
[CPythonに後置インクリメントを加えてみた　概要とまとめ](http://qiita.com/DOSS_INCREMENT/items/36629e1f4044de4742a1)
[CPythonに後置インクリメントを加えてみた　実装編](http://qiita.com/DOSS_INCREMENT/items/8b050847145f635211e2)
[CPythonに後置インクリメントを加えてみた　全変更点一覧](http://qiita.com/DOSS_INCREMENT/items/8371b7a1711c8c680a1a)
[CPythonに後置インクリメントを加えてみた　番外編](http://qiita.com/DOSS_INCREMENT/items/c8719c3a78502f097c76)

# 番外編：リスト内包表記をHaskellっぽくする

本来インクリメントはリスト内包表記の変更の練習のための課題であった。しかし、インクリメントが設計思想にそぐわないという背景もあってか予想以上にその実装には苦労した。リスト内包表記の変更は構想はともかく、いままでの知識があれば五分ほどで終了する。

まず、変更を独立させるためにこちらはDOSS_INCREMENTではなく、DOSS_HASKELLを用いる。したがってconfigureは以下のようになる。

```bash
CFLAGS="-O0 -g -DDOSS_INCREMENT=1 -DDOSS_HASKELL=1" ./configure --prefix="/home/denjo/piyothon_install"
```

## 仕様
現状のPythonのリスト内包表記は以下である。

```python3
lst = [x for x in range(10) if x >= 5]
```

一方Haskellは以下である。

```Haskell
lst = [x | x <- [0..9], x >= 5]
```

改造後のPythonは以下のように表せるようにする。

```python3
lst = [x $ x <- range(10), x >= 5]
```

なおここで`|`ではなく`$`を用いているのは、`|`は論理和としての演算を持っているので、そちらとして認識されてしまうからである。

## 変更箇所
変更箇所は以下の三箇所のみである。

```:Grammar
comp_iter: comp_for | comp_if
#ifdef DOSS_HASKELL
comp_for: ('for' | '$') exprlist ('in' | '<-') or_test [comp_iter]
#endif
comp_if: ('if' | ',') test_nocond [comp_iter]
```

```c:token.h
#ifdef DOSS_INCREMENT
#define INCREMENT 58
#define PRE_INCREMENT 61
#endif
#ifdef DOSS_HASKELL
#define LARROW 59
#define DOLLAR 60
#endif
```

```c:toknizer.c
case '<':
        switch (c2) {
        case '>':               return NOTEQUAL;
        case '=':               return LESSEQUAL;
        case '<':               return LEFTSHIFT;
        #ifdef DOSS_HASKELL
        case '-':               return LARROW;
        #endif
        }
        break;
```

## 変更内容
結局やったことはfor,in,ifの代わりに$,<-,”,”をも許容するようにGrammarを書き換え、トークンを登録しただけである。
因みにこれだけだと、`[x**2 $ x in range(10), x % 2 == 0]`などという気持ちの悪い書き方もできる。また、`,`のあとの条件式は`,`で区切って並べるのではなく`and`で繋げなければならないのもご愛嬌。

## 解説
Q. なぜforやinに対して意味を定義していないのに動くのか。forやinのエイリアスになっているのか？

A. そもそもforやinに対して意味は定義されていない。forに対して、forの後にくるトークンは繰り返しに用いる変数で、そのあとにくるトークンは…、と言ったふうに文法の定義がなされているわけではない。forは単なる区切り文字に過ぎず、その後にくるトークンに対していかなる操作を行うか、ということはforに対してではなく、Grammarにおいてforの次にくるもので定義されている。

```:Grammar
comp_iter: comp_for | comp_if
comp_for: 'for' exprlist 'in' or_test [comp_iter]
comp_if: 'if' test_nocond [comp_iter]
```

上は書き換える前のリスト内包表記に当たるGrammarの部分である。`comp_for`を見ると`’for’`の後にくる語は`exprlist`として呼び出されていることが定義されている。また`’in’`の後は`or_test`が呼び出されることになっている。したがってどのような定義（構文木がどのように作られ、どのようなバイトコードが実行されるか）は、forやinよりもむしろ`exprlist`、`or_test`、そして`comp_for`に対して定まっていると言える。


# 余興：前置インクリメントも実装してみる
新たなオペコードUNARY_PRE_INCREMENTを作成し、ceval.cにおいてスタックに積む順番に注意すれば30分もあれば作成することができる。
comment > @spec > -spec

`@spec`というコメント記載について以下を見つけた。

http://d.hatena.ne.jp/hiroe_orz17/20110803/1312387973

> 注意：これは古い書き方です。最新のErlangでは、この下に書いた-spec(～)に対応していますので、そちらが良いと思います。
...
> 一応コメント中の`@spec`もドキュメント化されますが、-spec()を使う事でTypErによる実際の型チェックに役立てる事ができます。


あとで、「こちらの方がいいよ」というのが出てくるのが往々にしてある。その際にはこれまでの使用を天秤にかけて、新しい方法を取り入れるかどうかはよく考える必要がある。
Arduino1.6.4~で Boards Managerを使ってATtiny85を開発してみた

初めてATtiny85をさわりました。なかなかいいっすね、これ。
お手軽に使えるし、機能も値段も自分にはちょうどいい。
Boards Managerの記事が見あたらなかったので書いときます。

っていうか[こちらのページ](http://highlowtech.org/?p=1695)のまんまなんですが...

準備、というか書き込み装置にはArduino as ISPを使いました。
すでにArduinoにISPのスケッチを書き込んでスタンバイ済み、ATtinyも結線済みという設定です。
#Arduinoは1.6.4~で
Arduino1.6.4~にあるBoards Managerという機能を使います。
1.6.4以前、1.7系には見あたらないようです。ご注意を。
#Boards Managerを追加する
preferences...>Additional Boards Manager URLs:
という欄に
https://raw.githubusercontent.com/damellis/attiny/ide-1.6.x-boards-manager/package_damellis_attiny_index.json
と書き込みます。
もし他にBoards Managerを追加していたら、コンマで区切って書き加えてください。
OKを押します。
#Boards Managerを開く
ツール>ボード>Boards Manager...
で Boards Managerが開きます。
リストからattinyを選んでinstallを押します。
INSTALLEDが表示されればOK。
Boards Managerを閉じます。
これで普通にボードとして選べるようになりました。
#Boot Loaderを書き込む
...というのも変ですが一応手順としてはそうです。いろいろ大事な設定をしてくれるようです。

ボード:"ATtiny"
プロセッサ:"ATtiny85"
Clock:"8MHz(internal)"
Port:Arduinoがささっているところ
書込装置:"Arduino as ISP"

のように設定してブートローダーを書き込みます。
#Sketchを書き込む
あとはスケッチを書き込むだけです。
ファイル>書込装置を使って書き込む
で書き込みます。
"docker-machine env"実行エラー - Error running connection boilerplate: Error checking and/or regenerating the certs:

#| エラー内容

```:エラー内容
Error running connection boilerplate: Error checking and/or regenerating the certs: There was an error validating certificates for host "192.168.99.100:2376": x509: certificate is valid for 192.168.99.121, not 192.168.99.100
```

## 背景
Docker Machineを起動させ、`docker-machine env`コマンドを実行して環境変数の設定方法を確認しようとしたところ、このようなエラーが発生しました。

```bash:エラー発生時
$ docker-machine start kooohei-test
Started machines may have new IP addresses. You may need to re-run the `docker-machine env` command.

$ docker-machine env kooohei-test
Error running connection boilerplate: Error checking and/or regenerating the certs: There was an error validating certificates for host "192.168.99.100:2376": x509: certificate is valid for 192.168.99.121, not 192.168.99.100
You can attempt to regenerate them using 'docker-machine regenerate-certs name'.
Be advised that this will trigger a Docker daemon restart which will stop running containers.
```

## 原因

内容を見てみると、なにやらエラー文の末尾に記載されている「certificate is valid for 192.168.99.121, not 192.168.99.100」がポイントそうです。
「このDocker Machineのcertificate(認証書)は”192.168.99.100”ではなく"192.168.99.121"です」という内容が記載されています。

ということで現在のIPを確認してみます。

```bash:DockerMachine一覧
$ docker-machine ls
NAME           ACTIVE   DRIVER       STATE     URL                         SWARM
default        -        virtualbox   Stopped                               
kooohei-test   -        virtualbox   Running   tcp://192.168.99.100:2376 
```

確かに今回の"kooohei-test"は"192.168.99.100"で起動しています。ですが、前回起動していた時のIPを思い出すと"192.168.99.121"でした。


#| 解決方法

TLS証明書を再度作成し直してあげればOKです。

```:文法
文法： docker-machine regenerate-certs NAME
```

それでは作成してみます。

```bash:TLS証明書の再作成
$ docker-machine regenerate-certs kooohei-test
Regenerate TLS machine certs?  Warning: this is irreversible. (y/n): y
Regenerating TLS certificates
Copying certs to the local machine directory...
Copying certs to the remote machine...
Setting Docker configuration on the remote daemon...
```

作成が完了したら再度、Docker Machineを確認してみます。

```bash:確認
$ docker-machine env kooohei-test
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.100:2376"
export DOCKER_CERT_PATH="/Users/kohei/.docker/machine/machines/kooohei-test"
export DOCKER_MACHINE_NAME="kooohei-test"
# Run this command to configure your shell: 
# eval "$(docker-machine env kooohei-test)"
```

これで無事エラーが解消され環境変数の設定方法が表示されました。
SwiftLintを導入してみる

Swift用のLinterです
realmが作っているので結構いい感じかもと思い、インストールしてみたのでメモ
https://github.com/realm/SwiftLint

## Homebrew

とりあえずHomebrewを更新します

```bash:
$ brew update
```

Homebrewのバージョン

```bash:
$ brew -v
> Homebrew 0.9.5 (git revision 677f; last commit 2015-11-24)
```

## インストール

```bash:
$ brew install swiftlint
```

結果
バージョン0.4.0がインストールされました

```bash:
==> Downloading https://homebrew.bintray.com/bottles/swiftlint-0.4.0.yosemite.bo
######################################################################## 100.0%
==> Pouring swiftlint-0.4.0.yosemite.bottle.tar.gz
🍺  /usr/local/Cellar/swiftlint/0.4.0: 215 files, 55M
```

## ビルド時にlinterを実行するように
プロジェクトのTARGETS > Build Phases にて左上の"+"ボタンをクリックし、"New Run Script Phase"を選択します

Shellは "/bin/sh"を入力
下記ソースコードを追加

```bash:
if which swiftlint >/dev/null; then
swiftlint
else
echo "SwiftLint does not exist, download from https://github.com/realm/SwiftLint"
fi
```
これでビルドするとErrorかWarningが出るようになります
デフォルトではgithubのスタイルガイドを採用しているようです
https://github.com/github/swift-style-guide

### カスタマイズ
プロジェクトのルートディレクトリに.swiftlint.ymlファイルを作成します
これが設定ファイルになりますので、自分なりに編集していきましょう
https://github.com/realm/SwiftLint#configuration
FileOutputCommitterの新アルゴリズムについて (MAPREDUCE-5485)


Hadoop 2.7.3/2.8.0 (どちらもまだリリースされていない) 以降では、mapreduce.fileoutputcommitter.algorithm.versionを指定することで、OutputCommitterのアルゴリズムを変更できる。設定可能な値は1(Hadoop 2系のデフォルト)と、2(Hadoop 3系のデフォルト)のみ。以下で、詳細について解説する。

## 新アルゴリズムの解説

```java:FileOutputCommitter#isCommitJobRepeatable
  @Override
  public boolean isCommitJobRepeatable(JobContext context) throws IOException {
    return algorithmVersion == 2;
  }
```

2だと、commitJobがrepeatableである。なんじゃそりゃ。本機能が導入されたチケット([MAPREDUCE-5485](https://issues.apache.org/jira/browse/MAPREDUCE-5485))を読もう。

> There are chances MRAppMaster crush during job committing, or NodeManager restart cause the committing AM exit due to container expire. In these cases, the job will fail. However, some jobs can redo commit so failing the job becomes unnecessary. Let clients tell AM to allow redo commit or not is a better choice.

うーん。そもそもcommitJobって何だろう。

```java:FileOutputCommitter#commitJob
  /**
   * The job has completed, so do works in commitJobInternal().
   * Could retry on failure if using algorithm 2.
   * @param context the job's context
   */
  public void commitJob(JobContext context) throws IOException {
```
```java:FileOutputCommitter#commitJobInternal
  /**
   * The job has completed, so do following commit job, include:
   * Move all committed tasks to the final output dir (algorithm 1 only).
   * Delete the temporary directory, including all of the work directories.
   * Create a _SUCCESS file to make it as successful.
   * @param context the job's context
   */
  @VisibleForTesting
  protected void commitJobInternal(JobContext context) throws IOException {
```

MapReduceジョブでは、タスクの出力結果を一時領域に書き込み、タスクが完了すると、`commitJobInternal`を実行して、最終的な出力先に移動する。

ここまで読んでおわかりいただけただろうか。つまり、commitJobの途中でMRAppMasterがクラッシュした場合、MapReduceジョブ自体を最初からやり直すのではなく、commitJobの処理だけリトライすればよいので、それを可能にしようというのがOutputCommitterの新アルゴリズムの概要である。

```java:FileOutputCommitter#commitJob
  public void commitJob(JobContext context) throws IOException {
    int maxAttemptsOnFailure = isCommitJobRepeatable(context) ?
        context.getConfiguration().getInt(FILEOUTPUTCOMMITTER_FAILURE_ATTEMPTS,
            FILEOUTPUTCOMMITTER_FAILURE_ATTEMPTS_DEFAULT) : 1;
    int attempt = 0;
    boolean jobCommitNotFinished = true;
    while (jobCommitNotFinished) {
      try {
        commitJobInternal(context);
        jobCommitNotFinished = false;
      } catch (Exception e) {
        if (++attempt >= maxAttemptsOnFailure) {
          throw e;
        } else {
          LOG.warn("Exception get thrown in job commit, retry (" + attempt +
              ") time.", e);
        }
      }
    }
  }
```

新アルゴリズムを採用すると、`maxAttemptsOnFailure`に、プロパティ`mapreduce.fileoutputcommitter.failures.attempts`で指定した値が入る。ここに2以上を設定することで、`commitJobInternal`メソッドが失敗しても、リトライされる。

もっと詳しく知りたい人は、ソースコードを読んでください。[FileOutputCommitter.java](https://github.com/apache/hadoop/blob/6502d59e73cd6f3f3a358fce58d398ca38a61fba/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-core/src/main/java/org/apache/hadoop/mapreduce/lib/output/FileOutputCommitter.java)
C# 6.0 "$" Dollar Syntax

C# 6.0 "$" Dollar Syntax

**"何それおいしいの？"**

そう思ったそこのお兄さん！お姉さん！ちょっとよければ軽く見ていきましょう
単純なシンタックスですが、良い機能なので是非使っていきましょう

#### before

```csharp
var name = "John";
Console.WriteLine( string.Format( "Hello {0}", name ) );
```

#### after

```csharp
var name = "John";
Console.WriteLine( $"Hello {name}" );
```
java ボンバーマン風ゲーム

今回はjavaで、ボンバーマンのようなゲームを
作ってみました。
初期段階なので爆弾が一つしか置けないなど
ゲーム的要素は少ないです。

<img width="636" alt="スクリーンショット 2015-11-25 14.36.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/85554/057780ad-24c8-e721-c163-b8cb8b7bf894.png">

　　　・実行環境は　OS X version 10.10.4
　　　・eclipseを使用しています。

自キャラは青い鬼。
敵キャラはマリオで、
ゲームの操作は、↑↓←→キーで上下左右移動、
spaceキーで爆弾を設置、
となっています。

OS Xでの動作は確認済みです。

下記URLにjarファイル、クラス図、PGListと
eclipseプロジェクトをzipファイルにして
あげておきたいとおます。

https://drive.google.com/folderview?id=0B2WHxRmwACk-UlIzbHFXbWREanM&usp=sharing
WAS CE3のインストール on Win7でエラー

geronimoはServerAdapterの依存関係が未だ怪しくて使えないので、WAS CE入れようとしました。
しかしこちらもインストーラがエラーで起動せずNG。

![error.png](https://qiita-image-store.s3.amazonaws.com/0/69798/2a55b639-398f-085f-0b94-69c9d42d2186.png)

LaunchAnywhere使ってVMのエラーが発生しているようなので、`LAX_VM`パラメータでJVMのフルパス指定。
WASCEのフルパッケージに添付されていたIBM Java7を指定すると起動した。

```bat:CommandPromt
C:\>:wasce_setup-3.0.0.4-win.exe LAX_VM "C:\Program Files\IBM\Java70\jre\bin\java.exe"

```

無事インストーラが起動しました。

![OK.png](https://qiita-image-store.s3.amazonaws.com/0/69798/5b2c9466-4329-e4c9-6b5c-3ac57c608187.png)

後はそのままインストールを継続すればOKです。
Vagrant up で rsync のエラーが出てしまう現象.

# 現象が起きた環境
<dl>
  <dt>OS</dt>
    <dd>Windows 7</dd>
  <dt>rsync</dt>
    <dd>rsync  version 3.1.0  protocol version 31</dd>
  <dt>Vagrant</dt>
    <dd>Installed Version: 1.7.4</dd>
  <dt>Cygwin</dt>
    <dd>Cygwin for 64-bit versions of Windows</dd>
  <dt>Client</dt>
    <dd>mintty 2.1.5 (x86_64-pc-cygwin)</dd>
</dl>

# 前提・現象
Vagrant に手を出してみようと思ってセットアップ後、初めて `vagrant up` したときに以下のようなエラーが出た.

```sh
Host path: /c/vagrant_root/
Guest path: /home/vagrant/sync
Command: rsync --verbose --archive --delete -z --copy-links --chmod=ugo=rwX --no-perms --no-owner --no-group --rsync-path sudo rsync -e ssh -p 2222 -o StrictHostKeyChecking=no -o IdentitiesOnly=true -o UserKnownHostsFile=/dev/null -i 'C:/vagrant_root/.vagrant/machines/default/virtualbox/private_key' --exclude .vagrant/ /c/vagrant_root/ vagrant@127.0.0.1:/home/vagrant/sync
Error: Warning: Permanently added '[127.0.0.1]:2222' (ECDSA) to the list of known hosts.
rsync: change_dir "/c/vagrant_root" failed: No such file or directory (2)
FATAL I/O ERROR: dying to avoid a --delete-during issue with a pre-3.0.7 receiver.
rsync error: requested action not supported (code 4) at flist.c(1882) [sender=3.1.0]
```

# なんか…
`rsync` の **change_dir** したときのパス、おかしくない？

> /c/vagrant_root

なんて場所ないよね、そりゃそうだ.
どうやら `cygwin` でのパス解決ができてないっぽい？

# 解決方法
https://github.com/mitchellh/vagrant/blob/master/plugins/synced_folders/rsync/helper.rb#L48
(実際にインストールされる場所は `C:\HashiCorp\Vagrant\embedded\gems\gems\vagrant-1.5.1\plugins\synced_folders\rsync\helper.rb` だと思う.)

上記箇所を以下のようにする.

https://github.com/mitchellh/vagrant/issues/3230#issuecomment-46613077

> `hostpath = "/cygdrive" + Vagrant::Util::Platform.cygwin_path(hostpath)`

コードに修正を入れてしまうのはちょっと気が引けるが…

別件でどうしても Cygwin を使いたいのでこれで我慢することに.

ひとまずエラーもなくなったので解決！

それでは良きエンジニアライフを(^w^)ﾉｼ
jQueryでDropイベントを受け取る方法


# きっかけ
ブラウザからサーバーにファイルをアップロードする際、アップロードするファイルをPCのファイラーからブラウザへドラッグ・アンド・ドロップすることで行えるようにしようとしたら、何故かそのイベントハンドラの引数がDragEventになっていなかった。その原因と、対策について

# 状況
コードは下記
https://jsfiddle.net/kkotaro0111/8dsv37xu/5/

```javascript
//with jQuery 2.x
$(function(){
	var $f = $("#fileinput");
	var $d = $("#dragarea");
	var $c = $("#clickarea");
	
	$f.on("change", function(){
		handleFiles(this.files);
	});
	
	$c.on("click", function(e){
		if( $f.length > 0 ){
			$f.click();
		}
		e.preventDefault();
	});
	
	$d.on("dragenter", function(e){
		e.stopPropagation();
		e.preventDefault();
	});
	$d.on("dragover", function(e){
		e.stopPropagation();
		e.preventDefault();
	});
	
	$d.on("drop", function(e){
		e.stopPropagation();
		e.preventDefault();

		var dt = e.dataTransfer; // dt is undefined
		var files = dt.files; // ここでエラー出る
		handleFiles(files);
	});
});

function handleFiles(files){
	console.log("files", files);
}
```
```slim
input#fileinput[type='file']
#dragarea
  button#clickarea
    |ファイルを追加する
```
```sass
#fileinput
  display: none
 
#dragarea
  padding: 40px
  border: 2px dashed #666
  border-radius: 6px
```

## 動作について
このページを開き、点線エリアにファイルをドラッグ・アンド・ドロップすると、``e``が``jQuery.Event``クラスのインスタンスになっている。ドラッグ・アンド・ドロップされたファイルは、``DragEvent``クラスのインスタンスが持つ``dataTransfer.files``プロパティから取得するのだが、``jQuery.Event``にはこのプロパティが含まれていない。

# 原因
クラス名を見て分かる通り、jQueryは本来起きる``Event``を``jQuery.Event``でラップするようだ。この時、オリジナルのイベントをそのまま継承したり拡張したりはせず、jQuery独自のものになるっぽい。それによる恩恵も大きいので、それはそれでいいのだが、今は``DragEvent``が欲しいのだ。

# 対策
一つは、「jQueryを使わない」という方法。普通に下記のようなコードにすれば、問題なくDragEventを取得できる。

```javascript
var da = document.getElementById('dragarea');
da.addEventListener('drop', function(e){
  if(e.dataTransfer){
    console.log("e is DragEvent");
  }
});
```
しかし、他はjQueryでイベント監視してるのに、ここだけバニラというのも美しくない。

もう一つは、``jQuery.Event``から取得する方法である。``jQuery.Event``は、オリジナルのイベントをラップするのだが、その際、ちゃんとそのオリジナルのイベントを取得する方法が用意されている。それが``jQuery.Event.originalEvent``だ。
これを本来の引数であるとして用いれば、問題なく``dataTransfer.files``にアクセスすることができた。

https://jsfiddle.net/kkotaro0111/8dsv37xu/6/

```javascript
	$d.on("drop", function(_e){
		var e = _e;
		if( _e.originalEvent ){
			e = _e.originalEvent;
		}
		e.stopPropagation();
		e.preventDefault();

		var dt = e.dataTransfer;
		var files = dt.files;
		handleFiles(files);
	});
```

# 参考サイト
- Web アプリケーションからファイルを扱う | MDN https://developer.mozilla.org/ja/docs/Using_files_from_web_applications
- JavaScript でのローカル ファイルの読み込み - HTML5 Rocks http://www.html5rocks.com/ja/tutorials/file/dndfiles/
- html5 - using jquery .on for drop events when uploading files from the desktop? - Stack Overflow http://stackoverflow.com/questions/9544977/using-jquery-on-for-drop-events-when-uploading-files-from-the-desktop
java マリオ風ゲーム

javaでのマリオ風ゲームを作ってみました。
音はありません
<img width="639" alt="スクリーンショット 2015-11-25 15.25.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/85552/6a3c1d72-b7a1-dd1c-1bd7-8079658372dc.png">

実行環境は OS X version 10.10.2
開発環境　 eclipse

↑でジャンプ、←・→で移動します。
基本的にはマリオと一緒です。

落とし穴の判定はうまくできていないので、途中で止まります。
ブロックの当たり判定も曖昧なのでブロックと重なってしまいます。
画面スクロールもしません。
ただ動くだけのマリオという感じなので、おおめにみてください。

下のURLからjarファイルを選び実行してください。
https://drive.google.com/file/d/0B5ypboR-e4Wdc2gzejR3QlYzeXM/view?usp=sharing

 Macであれば、ターミナルから下のコマンドを打つと実行されます。

 $ java -jar marios.jar
LibreOfficeCalcに関数候補表示機能を付けるまで 最終回 LibreOfficeにコミットしてみる

#前回のまとめ
やりたかったことを全部実装して満足した。

#LibreOfficeのコミッターになる
[参考文献(Development/gerrit/SubmitPatch)](https://wiki.documentfoundation.org/Development/gerrit/SubmitPatch)
これを読んでみると、どうやらまずContributor listに登録する必要があるらしい。
英語のメールを送って、その後gerritに登録する。

[参考文献(Development/gerrit)](https://wiki.documentfoundation.org/Development/gerrit)
[ここ](https://gerrit.libreoffice.org/)からgerritにアクセスして、右上のRegisterから登録する。OpenIDは、例えばyahoo!japanのIDを使いたかったらyahoo.co.jpと入力すればOK。

[LibreOfficeのドキュメント](https://wiki.documentfoundation.org/Development/BuildingOnLinux)に従ってビルドした人なら、多分LibreOfficeのフォルダに/logerritなるファイルがあるはず。それをwikiに書いてあるとおりに実行するだけ。

https://gerrit.libreoffice.org/Documentation/cmd-hook-commit-msg.html
コミットする前に、ここを参考にして、Change-Idなるものを自動でコミットメッセージ最下部に付けてくれる設定をしておく。
最初にレビューを受けるときはこう。

```sh:
$ git checkout -b <適当な名前>
# 自分好みにコードを書き換える
$ git add file [file ...] # 変更したファイルや新しいファイルを全部指定する
$ git commit
$ ./logerrit submit master
```

そして、更新するときはこう。

```sh:
$ git checkout <適当な名前>
# 自分好みにコードを書き換える
$ git add file [file ...] # 変更したファイルや新しいファイルを全部指定する
$ git commit --amend  # ここで、絶対にChange-Idを消さないこと
$ ./logerrit submit master
```
すると、`https://gerrit.libreoffice.org/#/c/*****`みたいなページができて、みんながコードをレビューしてくれる。なんて素晴らしいシステム！

#レビュワーに言われたこと

- AuthorとCommitterはどちらも本名にしよう
- [ハンガリー記法](https://en.wikipedia.org/wiki/Hungarian_notation)に則って変数名とかを書きなおそう
- [バグ報告ページ](https://bugs.documentfoundation.org/)で、（たとえバグではなく機能拡張の要望であっても）変更したい内容を報告しておこう
- あとで他の言語に直すときのために、「if, iferror, ifna and 10 more」といった表現をするときは「%1 and %2 more」を定数一覧に追加して、日本語に翻訳するときに「%1 と他 %2 件の候補」などが簡単にできるようにしておこう

みなさんも、投稿する前に確認してみてくださいね。

#今回のまとめ
コミットは思ってたよりだいぶめんどくさかった。
ちなみに4日くらい前からレビューがぱったり途絶えてしまって、Margeもされず宙ぶらりんの状況。私のパッチは見捨てられてしまったのだろうか…？

#これから大規模なソースコードと戦う人へ
全検索は非常に強い！積極的に活用しよう。gdbでちまちま見てたら何年掛かっても目的の関数にはたどり着けない。
フォルダ名でアタリを付けるのはもっと強い！！変なファイルが検索に掛かってそのファイルの確認に時間を取られるくらいなら、このファイル！と決めてそこだけ検索したほうが時間的リソースを大きく節約できる。勘が外れたらドンマイ。

#リンク
##LibreOfficeCalcに関数候補表示機能を付けるまで

- [第1回：目的の設定と準備](http://qiita.com/KRiver1/items/2188d71d316a28ad23ac)
- [第2回：デバッガでメインループを探す](http://qiita.com/KRiver1/items/1f93efcf47d2146c78b8)
- [第3回：メインループと全探索](http://qiita.com/KRiver1/items/d7ab9614d5bbd409c541)
- [第4回：フォルダ名でアタリを付ける](http://qiita.com/KRiver1/items/3531679de3c262332de7)
- [第5回：関数候補の集合を返す](http://qiita.com/KRiver1/items/08ef4586866833048805)
- [第6回：関数候補・説明表示機能を実装する](http://qiita.com/KRiver1/items/c33d62f4bcc73e76b359)
- [第7回：LibreOfficeにコミットしてみる](http://qiita.com/KRiver1/items/7aba2a32cc42672c105d)
Java ゲームプログラム 雛形

Javaゲームプログラムのキー操作の動きを作成しました。

![スクリーンショット 2015-11-25 15.09.39.png](https://qiita-image-store.s3.amazonaws.com/0/85551/a31b3d1c-001b-b564-e970-c1b7d47c54e8.png)
・実行環境- OS X version 10.10.2
・eclipseを使用
・参考書「15歳から始めるJAVAゲームプログラミング」


操作はspaceキーを放していると下に落ち続け、押すと上がり続ける
単純なプログラムです。
参考書のプログラムに少し改良を加えているだけです。

下記URLにjarファイル、eclipceプロジェクトがあります。

https://drive.google.com/file/d/0B4EcxWTw5z0UcFJYR0tad09iYTg/view?usp=sharing
Java ゴルフゲーム

Javaでホールインワンゴルフゲームを作ってみました。
音はありません。
ボールの跳ね返りの部分で多少バグが起こるところがあります。


![スクリーンショット 2015-11-25 14.36.19.png](https://qiita-image-store.s3.amazonaws.com/0/85550/11fe9800-2410-ee24-4fc2-db5421d90ad0.png)

- 開発環境 OS X version 10.10.1
- eclipseを使用

操作は、スペースキー長押しでパワー設定、離すとボールが発射されます。
カップイン時、ボールが止まった時、ゲームオーバーになった時は↑キーでリスタートできます。
カップイン時に↓キー押下で自機の数が元に戻ります。

下記URLにjarファイル、クラス図、eclipseプロジェクトがあります。
https://drive.google.com/folderview?id=0B07gncyM-3Lyc1VxVXJuS2pncUE&usp=sharing
windows > powershell > 重複なしでファイルリストを見たい

```txt:動作確認
Windows 7Pro
```

## 背景

Utilxxx.cppというファイルが複数のプロジェクトに分散している状態。
重複なしのリストを見たい。


## 手法0. 思いつきの方法 (手作業)

以下を行う。

1. 複数プロジェクトの上位フォルダにてエクスプローラで検索しておく (キーワード例: Util*.cpp)
  - 重複ありのリストが表示される
2. デスクトップにフォルダを新規作成する (新しいフォルダー)
3. 1のフォルダで全部選択(Ctrl+A)をして、２のフォルダへコピー
  - ファイルのコピーダイアログにて「同じ処理を次の４個の競合に適用」にチェックし、「コピーして置き換える」を選ぶ
  
以上で「新しいフォルダー」には重複なしのファイルリストができる。

使用後は「新しいフォルダー」を消す。

<font color=red>注意: 手順３で「コピー」でなく「移動」しないこと。</font>


## 手法1. batファイルで再実行可能版

@jTakasuRyuji さんに教えていただいたPowerShellを使う方法。

- D:\WORK以下のサブフォルダに対してUtil*.cppを探索する例

```getUniqueFileList.bat
powershell "Get-ChildItem D:\WORK Util*.cpp -Recurse | Select-Object Name"> file1.txt
powershell "Get-Content file1.txt | Sort-Object | Get-Unique" > file2.txt
```

上記のファイルをgetUniqueFileList.batという名前などで作成する。

getUniqueFileList.batをダブルクリックするたびに、file2.txtにファイルリストが取得できる。

非常に便利!
思いつきの方法のように「移動」の失敗の恐れがない。

## 手法2. 手法1のワンライナー版

さらに @jTakasuRyujiさんに調べていただいた改良版。
-uniqueを使用。

```getUniqueFileList2.bat
powershell "Get-ChildItem D:\Work Util*.cpp -Recurse | Select-Object Name -unique"> file1.txt
```

- file1.txtの段階で重複がなくなっている。
- "Name", "---"がソートされることがない
Node.jsでNunjucksを設定する

## Nunjucks

node.jsのテンプレートエンジンはたくさんあるけど、nunjucksはpythonで書けたりします。
詳しいドキュメントはこちらを参照。
[https://mozilla.github.io/nunjucks/](https://mozilla.github.io/nunjucks/)

Jinja2とほぼ一緒。
[http://jinja.pocoo.org/docs/dev/](http://jinja.pocoo.org/docs/dev/)

####nunjucksのnpmをインストール
`$ npm install nunjucks --save`

####app.jsで読み込み

```app.js
var express = require('express');
var path = require('path');
var nunjucks = require('nunjucks');
var app = express();

// nunjucks view engine
nunjucks.configure('views', {
    autoescape: true,
    express: app
});
// setup view engine
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'html');

```
`express`を使っている場合は、`nunjucks.configure`に指定してやる。
`view engine`は`html`に。

####変数宣言
```html+jinja

{% set x = 5 %}

```

####変数表示
```html+jinja

{{ x }}

```

#####if文
```html+jinja

{% if variable %}
  It is true
{% endif %}

```

####for文
```html+jinja

{% set items = [{"title": "a"}, {"title": "b"}] %}
{% for item in items %}
  <p>{{ item.title }}</p>
{% endfor %}

```
##日付フォーマットで変換したい場合
[nunjucks-date-filter](https://www.npmjs.com/package/nunjucks-date-filter)というライブラリを使ってみる。
[moment](http://momentjs.com/)を雛形に作られているみたいです。

####nunjucks-date-filterとconsolidateをインストール

```
$ npm install nunjucks-date-filter --save
$ npm install consolidate --save
```

####app.jsで設定

```app.js
var express = require('express');
var path = require('path');
var nunjucks = require('nunjucks');
var dateFilter = require('nunjucks-date-filter');
var cons = require('consolidate');
var app = express();

// nunjucks view engine
cons.requires.nunjucks = require('nunjucks');
var env = cons.requires.nunjucks.configure('views', {
    autoescape: true,
    express: app
});
// date format
dateFilter.setDefaultFormat('YYYY-MM-DD');
env.addFilter('date', dateFilter);

// setup view engine
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'html');
```

####htmlでの記述方法

```html+jinja
// with no format
This blog has been created at {{ creation_date | date }}.
 
// with a custom format
This blog has been created at {{ creation_date | date("YYYY") }}.
 
// with an addition first
This blog has been created at {{ creation_date | date("add", 7, "days") | date }}.
```
rsyncでサブディレクトリ含む特定パターンのファイルのみコピーする

あるディレクトリ以下の特定パターンのファイルのみrsyncしたい。

例えば以下のディレクトリでgz拡張子のファイルだけrsyncしたい。gz拡張子を含まないsub3ディレクトリ以下はrsyncしたくないとする。

```
$ tree src
src/
├── a.gz
├── sub1/
│   ├── b.gz
│   └── sub2/
│       └── c.gz
└── sub3/
    └── other.log
```

これをこうコピーしたい。

```
dst/
├── a.gz
└── sub1/
    ├── b.gz
    └── sub2/
        └── c.gz
```

これを実現するにあたって結構な時間はまったのでメモする。

* `--include`, `--exclude`は定義した順に評価される。マッチしたらそこで評価終わり。
* `--include="*.gz"`をサブディレクトリにも適用するには`--include="*/" --include="*.gz" --exclude="*"` と書く。`--include="*/"`がポイント。
* `--include="*/"`としたのでsub3が空ディレクトリで宛先にコピーされてしまう。これを回避するためには`-m` (prune empty directory chains from file-list) を付ける。これでsub3はディレクトリごとコピーされなくなる。


というわけで最終的には以下で。

```
$ rsync -arm --include="*/" --include="*.gz" --exclude="*" src/ dst/
```
JAVA Time API 曖昧な日時を表すクラス

```java
import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;

public class Test03 {
	public static void main(String[] args) {
		Instant i1 = Instant.now();

		Instant i2 = Instant.ofEpochMilli(31920291332L);
		long l = i2.toEpochMilli();

		ZonedDateTime z1 = ZonedDateTime.now();
		ZonedDateTime z2 = ZonedDateTime.of(2015, 5, 1, 2, 1, 4, 7,
				ZoneId.of("Asia/Tokyo"));

		Instant i3 = z2.toInstant();
		ZonedDateTime z3 = i3.atZone(ZoneId.of("Europe/London"));

		System.out.println("東京:" + z2.getYear() + z2.getMonth()
				+ z2.getDayOfMonth());
		if (z2.isEqual(z3)) {
			System.out.println("これらは同じ瞬間を指しています");
		}
	}

}
```

■実行結果
東京:2015MAY1
これらは同じ瞬間を指しています
Linux mint のバージョン確認する方法

## 端末で以下のコマンドをうつ

```
$  lsb_release -r
Release:	17.1
```
このコマンドのManページを参考にすると Description には

```
DESCRIPTION
       The  lsb_release command provides certain LSB (Linux Standard Base) and
       distribution-specific information.

       If no options are given, the -v option is assumed.
```

って書いてあります。
Javaを使ったロックマン風ゲーム

今回はJavaを使ってロックマン風の横スクロールゲームを作ってみました。	クリア判定とボスの攻撃,音源は未実装です。

![スクリーンショット 2015-11-25 14.27.20.png](https://qiita-image-store.s3.amazonaws.com/0/85547/41b411d2-eb08-899b-9540-50b46b40b947.png "スクリーンショット 2015-11-25 14.27.20.png")

ブロックの当たり判定や弾の当たり判定が甘いです。

操作方法は、

左右方向キーで移動
上方向キーでジャンプ
Xキーで弾を発射


開発環境
`Mac Version 10.10.5`

ターミナルコマンド
`java -jar rockman.jar`


Google Drive でダウンロードできます。
https://drive.google.com/file/d/0B1hor7stv_n2WGtxNjRacUs0bFU/view?usp=sharing
apacheのmod_dosdetectorでDos（F5アタック）対策

## 方式
apacheで同一IPアドレスからの連打を検出した場合アクセスを拒否するか、
特定の静的なページに飛ばすことでサーバの負荷を低減させる。

有名なのは下記の２つだが、今回は mod_dosdetector を選択した。

#### mod_evasive
即アクセス禁止になるため、特定のエラーページ等への遷移ができない（かもしれない）。
目的からすれば充分だが、エンタープライズでは
意図せぬ連打（F5の上に本置きっぱなし状態とかも）した顧客に
いきなり403を見せるというのは結構キツイ。

何より、apacheをpreforkで動かしている場合
子プロセス単位の個別でアクセス数がカウントされるため
（サーバ単位でアクセスをカウントしてくれないため）
httpサーバやpreforkの設定次第では、結構連打したけど防いでくれないとか、普通にあり得る。

#### mod_dosdetector
こちらは同一IPから一定時間内に一定数以上のアクセスを検知したら
環境変数を立ててくれるだけ。二段階方式で環境変数をみてのアクセス制御をいれなくてはならない。

多少面倒だが、融通は効く形式になるしpreforkでもきちんと動く。

## mod_dosdetector をインストール
```shell:
$ wget http://ncu.dl.sourceforge.net/sourceforge/moddosdetector/mod_dosdetector-0.2.tar.gz
$ tar -xzvf mod_dosdetector-0.2.tar.gz
$ cd mod_dosdetector-0.2
$ make
$ make install
Libraries have been installed in:
   /usr/lib64/httpd/modules
```

## apacheの設定

1分間に100回アクセスがあれば、Dos攻撃とみなす設定の例。

```shell:httpd.conf
LoadModule dosdetector_module /usr/lib64/httpd/modules/mod_dosdetector.so

# 検出を行うかを指定。ここをoffにしてapache再起動で無効化可能
DoSDetection     on

# 連打の検出をカウントする秒数を指定。以下は１分間。
DoSPeriod        60

# Dosの疑いありの閾値を設定、現在は利用していない。
# 「DosHardThreshold」に合わせておく。以下は100回アクセスで疑いありとみなす。
# 閾値に達すると環境変数SuspectDoS=1がセットされる
DoSThreshold     100

# Dosとして明確にみなすの閾値を設定。判定はこれを利用している。
# 800回アクセスでDos攻撃とみなす。
# 閾値に達すると環境変数SuspectHardDoS=1がセットされる
DoSHardThreshold 100

# 閾値に到達してからセットした環境変数がクリアされるまでの秒数を指定。
# 以下は5秒で判定を解除し、再判定に入ることを示す。
DoSBanPeriod     5

# 保持するIPの履歴を指定。
# 実際のIP種類は下記設定より遥かに多いが
# Dos判定に利用する=連続でリクエストが来るため、さしあたって3000で設定。
DoSTableSize     3000

# 判定から除外するMIMEタイプを指定
DoSIgnoreContentType  image|javascript|css

```

これで設定は終わるが・・・
あくまで環境変数立てるだけなんで、連打を検出した振る舞いを続けて入れてみる。

```shell:httpd.conf
## 連打対応
# ドメインを指定
RewriteCond %{HTTP_HOST} www\.foo\.co\.jp

# Dos攻撃判定（上記で設定される）を確認
RewriteCond %{ENV:SuspectHardDoS} .+

# 対象外のURL指定したければここで
RewriteCond %{REQUEST_URI} !^/hoge/.* [NC]

# 同じようにDos検出時に遷移させるページも当然除外
RewriteCond %{REQUEST_URI} !^/error/dos.page [NC]

# Dos判定されたらエラーページに飛ばしてあげる
# /inner で始まるUELは社内とかアクセス用なので除外とかも設定できる
RewriteRule !^/inner/(.*) http://xx.xx.xx.xxx/error/dos.page [P,L]

```

## apacheの再起動で終わり

```shell:
$ service httpd restart
```

## 補足

DOS攻撃を防ぎたいくらいの規模の場合は
数台のWeb(httpd)サーバをLBで繋いでいる環境が殆どだ思う。

上記の設定はあくまで１台単位なので、
LBを介した クライアント と Web(httpd)サーバ 間の接続が
stickinessなのか、Round Robinなのか確認して閾値を設定する必要がある。

もしRound Robinの場合は多少雑だが
（防ぎたい回数の閾値 / サーバ台数） の値を各apacheに設定するのが良いと思う。

あと、エンタープライズで、企業ユーザの場合は
大抵企業から外に出るグローバルIPアドレスは１つ（ないし数個）なので
これは個人単位ではなく、企業単位のアクセス制限になる、ということは意識しておくと良い。
Qiita > UI > 投稿のたびにAdventCalenderのメッセージダイアログが表示される

Qiitaへの投稿は普通の人は１日２，３件なのかもしれない。
その場合、現状の投稿のたびにAdventCalenderのメッセージが出るのは気にならないだろう。

一方で、僕のように個々の情報を個別に投稿する場合は、AdventCalenderのメッセージが表示されるのが気になる。

cookieなどで、１日１回表示にできないのだろうか。

Kobitoを使えば回避できるのだろうか? >> Kobitoを使えば回避できた。

投稿処理をした後にメッセージダイアログを表示するのではなく、Qiitaページの右側の広告欄の上にAdventCalenderなど現在のイベント情報を表示すればすっきりするように思う。

そうすると、その情報を見たい人は右側を見ればいい。

すでに見ている人に２回目以降のメッセージダイアログ表示をするのは良いUIではないと思われる。

<hr>
トップページには右側にあまり目立たない感じで「Advent Calender」のリンクがある。
一般の記事ページには右側にはAdvent Calenderへのリンクはない。

メッセージダイアログでなく、一般の記事ページにも右側に用意するのはいいと思う。その際は、もう少し目立つ背景色にしてもいいと思う。
c++ builder > 時計変更時の処理 / SetLocalTime()実行後

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

```Unit1.cpp
bool __fastcall TFormMain::AdjustLocalTime(String datetime)
{
	TSystemTime systime;
	TDateTime dt;

	dt = VarToDateTime(datetime);
	DateTimeToSystemTime(dt, systime);
	if (SetLocalTime(&systime) == false) {
//		RaiseLastOSError();
		return false;
	}

	if (m_thr_main != NULL) {
		m_thr_main->NotifyClockAdjusted();
	}
	return true;
}
```

m_thr_main : はTThread *型。

時刻調整が入ったら、スレッド処理に連絡を入れて、その先のスレッドで必要な処理を実行するという感じ。

VarToDateTime()を使っているのは、ENU対応。
ターミナルからVisual Studio Codeを起動する方法【公式の方法】

2018.07.03 新規で来てくださった方にわかりやすいように更新しました。

ターミナルからエディタを起動したい。`atom hoge.js`とかやって特定のファイル開いたり`atom .`とかやってカレントディレクトリ開くといったことをVisual Studio Codeでやる方法について書いています。

## MacでVisual Studio Codeをターミナルから起動する方法。

1. Command + Shift + Pでコマンドパレット開く。
2. Shellって検索
3. インストール

![image](https://qiita-image-store.s3.amazonaws.com/0/58800/66dbddbf-b540-65fe-41e9-86353bbf81e9.png)

たったこれだけです。とってもかんたんですね！

## サンプル

起動

```
code
```

カレントディレクトリをプロジェクトとして開いて起動

```
code .
```

```jsディレクトリ内のhoge.jsを開く
code js/hoge.js
```

以上です。

## 過去にエイリアスの設定をした人の解決策

もう1年以上経っているので、需要はほとんどないと思いますが、記載しておきます。
`.bash_profile`なり`.zshrc`なりにエイリアスを追記する方法を書いていた人には以下のようにエイリアス消せってアラートが出ます。
![image](https://qiita-image-store.s3.amazonaws.com/0/58800/b1b3466d-ee8e-77cc-8a7d-b7ae2f96bec0.png)

消した後に上述の設定をしましょう。

---

Windowsでももちろんできます。
Linuxは知らない。

[公式ドキュメント](http://code.visualstudio.com/Updates#_setup)
mkr --versionでversion情報が出てこない場合

# TL;DR
- sourceからbuildすると出てこないようなので他の方法でinstallするとよい
- ``` brew ``` , ```yum ```, ```apt-get```

# 参考

- go get && go install

```
-> % which mkr
/usr/local/go/bin/bin/mkr

-> % mkr --version
mkr version
````

- homebrewでinstall

```
-> % which mkr
/usr/local/bin/mkr

-> % mkr --version
mkr version v0.7.1
```
Gif画像のリロード問題

#Gif画像のアニメーションが、リロードすると再生されない。
gifアニメーションを含んだ、webページをリロードすると、gifアニメーションが再生されず、最後のコマで止まっている現象がおきた。この原因はキャッシュが残っているために起こるものだとわかった。

## 対策：gif画像の名前をロードするたびに変更する!
gifの名前の後に "?現在時刻" を入れることで、毎度のリロード時にgifの名前が変更される。そのため、もう一度gifを読み込み、アニメーション再生をしてくれる。

``` js:gifImage.js
var gifImage = document.getElementById("hoge");
gifImage.src = "hogehoge.gif?" + (new Date).getTime();
```

jsで書いたけど、JQueryでも同内容で対策できるのでは？
instagram-ruby-gemの形式でnext_urlを扱う方法

2015/11/25の時点で、`instagram-ruby-gem`は`next_url`を使ったデータの取得をサポートしていません。
そのため、この記事ではgemで取得したデータと同じ形式で`next_url`のデータを扱う方法を共有します。
なぜなら、それができると`view`を使いまわせて便利だからです。

# 実現方法
`Hashie::Mash`と`Instagram::Response`を使います。
この例では`tag_recent_media`で取得した`next_url`から、次のデータを取得しています。

````rb
medias = Instagram.tag_recent_media('タグの名前')
next_url = medias.pagination.next_url

if next_url
  response = Faraday.get(next_url)
  response_hash = JSON.parse(response.body)
  response_hashie = Hashie::Mash.new(response_hash)
  next_url_medias = Instagram::Response.create(response_hashie, {})
end
````

上記の内容を実現するpull requestを申請中です。
賛同頂ける方は+1のコメントをしていただけると、pull requestが受理してもらいやすくなるかもしれません。
https://github.com/Instagram/instagram-ruby-gem/pull/194

もっと良さそうなデータの扱い方があれば、教えて頂けると嬉しいです。

# 参考
https://github.com/Instagram/instagram-ruby-gem
Windows > 終了処理 > EWX_POWEROFF / EWX_SHUTDOWN

Windowsのシャットダウン処理で以下のページを読んでいた時の疑問。

https://msdn.microsoft.com/ja-jp/library/windows/desktop/aa376868(v=vs.85).aspx

- EWX_POWEROFF 
- EWX_SHUTDOWN

上記の違いは何なのか?

<hr>

http://mfc-ml.ldblog.jp/archives/306538.html
> EWX_POWEROFFは、ユーザー権限（ＮＴの場合），マシン
（もっと正確に言うとマザーボード）等によって
実行できない場合があります。
その場合、電源を切っても大丈夫な状態にするだけなので
EWX_SHUTDOWNと見かけ上同じとなります。

実行権限だけの違いであるなら、EWX_SHUTDOWNを使っておけばいいということなのか?
Swift版 WKWebViewでJavaScript(Alert,Confirm,Prompt)の処理

Obj-C版はこちら 
WKWebViewでJavaScript(Alert,Confirm,Prompt)の処理 
http://qiita.com/ShingoFukuyama/items/5d97e6c62e3813d1ae98


Swift版がggっても出てこないということで、作成してみました。 
WKWebViewの生成のあたりは省いていますのでそこは頑張ってください。 

```swift
import UIKit
import WebKit

class WebViewController: UIViewController,WKNavigationDelegate,WKUIDelegate {
    
        .    
        .    
        .    

    // display alert dialog
    func webView(webView: WKWebView, runJavaScriptAlertPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler: () -> Void) {
        let alertController = UIAlertController(title: "", message: message, preferredStyle: .Alert)
        let otherAction = UIAlertAction(title: "OK", style: .Default) {
            action in completionHandler()
        }        
        alertController.addAction(otherAction)
        presentViewController(alertController, animated: true, completion: nil)
    }        
   
    // display confirm dialog
    func webView(webView: WKWebView, runJavaScriptConfirmPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler: (Bool) -> Void) {   
        let alertController = UIAlertController(title: "", message: message, preferredStyle: .Alert)
        let cancelAction = UIAlertAction(title: "Cancel", style: .Cancel) {
            action in completionHandler(false)
        }        
        let okAction = UIAlertAction(title: "OK", style: .Default) {
            action in completionHandler(true)
        }        
        alertController.addAction(cancelAction)
        alertController.addAction(okAction)
        presentViewController(alertController, animated: true, completion: nil)
    }        
   
    // display prompt dialog
    func webView(webView: WKWebView, runJavaScriptTextInputPanelWithPrompt prompt: String, defaultText: String?, initiatedByFrame frame: WKFrameInfo, completionHandler: (String?) -> Void) {
        
        // variable to keep a reference to UIAlertController
        let alertController = UIAlertController(title: "", message: prompt, preferredStyle: .Alert)
             
        let okHandler: () -> Void = { handler in
            if let textField = alertController.textFields?.first {
                completionHandler(textField.text)
            } else { 
                completionHandler("")
            }        
        }        
        let cancelAction = UIAlertAction(title: "Cancel", style: .Cancel) {
            action in completionHandler("")
        }        
        let okAction = UIAlertAction(title: "OK", style: .Default) {
            action in okHandler()
        }        
        alertController.addTextFieldWithConfigurationHandler() { $0.text = defaultText }
        alertController.addAction(cancelAction)
        alertController.addAction(okAction)
        presentViewController(alertController, animated: true, completion: nil)
    }        
}
```
mocha と supertest で file upload の test をする


一応、想定としては

[jQuery-File-Upload](https://github.com/blueimp/jQuery-File-Upload)

を使っていて、アップロードすると、

```js
{"files":[
	{
	"name":"small.jpg",
	"size":15805,
	"type":"image\/jpeg",
	"url":"http:\/\/127.0.0.1:8765\/files\/small.jpg",
	"thumbnailUrl":"http:\/\/127.0.0.1:8765\/files\/thumbnail\/small.jpg",
	"deleteUrl":"http:\/\/127.0.0.1:8765\/index.php?file=small.jpg",
	"deleteType":"DELETE"
	}
]}
```

というようなjsonが返って来る、というような状態に今いる。

npm で mocha と supertest を入れる。

```bash
npm install -g mocha
npm install supertest --save-dev
```

test.js を作る。

```js:tests/TestCases/scripts/test.js
var request = require('supertest')
describe('POST /uploads', function(){
    it('respond with json', function(done){
        request('http://127.0.0.1:8765')
            .post('/uploads/upload')
            .attach('files', 'tests/TestCase/Controller/_files/small.jpg')
            .set('Accept', 'application/json')
            .expect('Content-Type', /json/)
            .expect(200, 
                    {files: [
                        {
                            name: 'small.jpg',
                            size: 79551,
                            type: 'image/jpeg',
                            url: 'http://127.0.0.1:8765/files/small.jpg',
                            thumbnailUrl: 'http://127.0.0.1:8765/files/thumbnail/small.jpg',
                            deleteUrl: 'http://127.0.0.1:8765/index.php?file=small.jpg',
                            deleteType: 'DELETE'
                        }
                    ]}        
            , done);
    });
});

```

supertestのgithubに書いてあるけど、

```
.expect(status, body[, fn])
```

というように使うので、bodyの部分には期待するjson出力をそのまま入れる。
サーバーにpostした結果がきちんとしたjsonになってて、content-typeヘッダーも

```
application/json; charset=UTF-8
```

になっていれば、bodyにはjsonがそのまま入るって仕組み。


直接 mocha でテスト実行

```bash
mocha tests/TestCase/scripts/test.js
```


grunt から実行。
最初にgrunt-simple-mocha入れて、

```bash
npm install grunt-simple-mocha --save-dev
```

```js:Gruntfile.js
module.exports = function(grunt) {
    grunt.initConfig({
        pkg: grunt.file.readJSON('package.json'),
        simplemocha: {
            options: {
                ui: 'bdd',
                reporter: 'nyan'
            },
            all: { src: ['tests/TestCase/scripts/**/*.js'] }
        },
    });
    grunt.loadNpmTasks('grunt-simple-mocha');
    grunt.registerTask('mocha', ['simplemocha']);
};    
```

実行する。

```bash
grunt mocha
Running "simplemocha:all" (simplemocha) task
 0   -__,------, 
 1   -__|  /\_/\  
 0   -_~|_( x .x) 
     -_ ""  "" 

  0 passing (1s)
  1 failing
```
activerecord で aws::RDS と aws::Redshift に複数接続

# activerecord で aws::RDS と aws::Redshift に複数接続

~~`activerecord-redshift-adapter` だと今のところ 
`type_cast_from_user` とか `column_types` あたりでエラーが出るので、
`select` 系メソッドも `update` 系メソッドも使えないらしい。
カラム情報の取得とか、普通にクエリ投げるとかはできる。~~

~~あんま `pg` で頑張るのと大差ない気がするけど、共通で`activerecord`使えるのが嬉しいかな。~~

直接クエリ投げるのは `execute` メソッドでOK。

# 追記

`activerecord4` 以上だといけるらしい。
詳細は以下の記事を参照。
http://qiita.com/saicologic/items/8e7ca16c551708d002c0

`activerecord-import` はダメでした。


```rb
#!/usr/bin/env ruby
# coding:utf-8

require "toml"
require 'psych' # 日本語を使う場合 active_record より前に読んでおく
require "active_record"

conf = TOML.load(DATA.read)
RDSCONF = conf["aws"]["rds"]
REDSHIFTCONF = conf["aws"]["redshift"]

class Rds < ActiveRecord::Base
  self.abstract_class = true
  establish_connection RDSCONF

  class SomeTable < self
  end
end

class RedShift  < ActiveRecord::Base
  self.abstract_class = true
  establish_connection REDSHIFTCONF

  class SomeTable < self
  end
end


p RedShift::SomeTable.columns

p Rds::SomeTable.all

__END__
[aws]

[aws.redshift]
adapter = "redshift"
database = "database"
host = "xxxx@yyyy.redshift.amazonaws.com"
port = 5439
user = "user"
password = "pass"
encoding = "utf8"
pool = 5
timeout = 30000

[aws.rds]
adapter = "mysql2"
database = "database"
host = "0.0.0.0"
port = 3306
username = "user"
password = "pass"
```

```rb:Gemfile
source 'https://rubygems.org'

gem 'toml'
gem 'pg'
gem 'mysql2'
gem 'psych'
gem 'activerecord'
gem 'activerecord-redshift-adapter'
```