OmniAICreator/Qiita-1.07M huggingface dataset:
Railsで大量import

 
業務でcsvを読み込んでそれをDBに保存するというロジックを実装した時にパフォーマンス面、DB設計について色々と思ったので、共有することにした。

## 状況設定
読み込むcsvは6000行*70列で、1列は1個のテーブルに対応している(<= ここがやばい原因)。このcsvファイル内のデータをインポートしようとした。

## ざっくり見積もり
railsのimportメソッドを使うことを前提にしてざっくりまず発行クエリ数などを見積もってみる。
importメソッドは基本的に1テーブルごとに使用するので、これで単純計算70クエリ。しかし現実問題、一回のimportメソッドで6000レコードを突っ込むのはDBに対して半端ない負担になるので200くらいずつに分割。これで1列あたり30クエリなので、合計 70 * 30 = 2100クエリ。まあDBにできるだけ負担をかけないようにsleepするとしても、うーん、まあ悪くはないかも。

## 現実は甘くない
いざ実装スタート。非同期処理のためにdelayed_jobを使っていたが、あれ、「delayed_jobテーブルには入らない！？」handlerカラムにcsvの中身がそのまま入るので、まあ冷静に考えてそんな量なんか入らないよね。やむなく30レコードずつ分割(ファイルをどっか保存して処理すれば良いんじゃんというツッコミはしないで...)。これで1列あたり200クエリなので、合計 70 * 200 = 14000クエリ(汗)。まあこれはこれで良いとして、いざコードを動かしてみた。すると以下のようなことが発覚した。

### ActiveRecordなめんな
いざimport開始と思いきや処理が重いことよ。30レコード突っ込むのに30s。しかも突っ込めば突っ込むほど遅くなる。まあ確かに前処理が多いのは仕方がないが、それにしても遅すぎる。しかもメモリも結構食う。このペースだと6000行のimportで1h30min。恐ろしや。

## 解決策
結局ActiveRecordは「重い」、「メモリ食う」、「インスタンス生成で時間がかかる」のような問題が生じるので、本当にクエリ数が多くなる場合や、大量のデータを入れる場合には不向き。

```
ActiveRecord::Base.connection.update(insert_sql)
```

のように、実際に生のsql文を書いたところ、30レコード突っ込むのに7sくらいしかかからなくなり、しかもメモリも食わない。6000行も30minくらいでimportできるようになる計算。万々歳！

## 反省
今回のような問題が発生した原因の一つとしてDBの過剰な正規化があげられる。70列70テーブルとかいたが、これらは実質は同種の「データ結果」を記録したものであり、突っ込むデータの型(int, string, datetime, floatなど)は違えど、処理としては全く同じだった。そこで正規化しか考えずにテーブルを切ったところ、それによる弊害を受けてしまったのである。まあ、正規化は確かに今後のデータの永続化おいて非常に重要ではあるが、正規化しすぎてデータが扱いにくくなってしまってもそれはそれで問題。まあ今回このようにデータが扱いにくいのはここだけなので良しとしよう...

## まとめ
* テーブルの正規化は良いが、ちゃんとデータの扱いにくさ、実装を考えて。
* 大量データのインポートはActiveRecordに頼らず生sqlで！
オフラインリアルタイムどう書くE04 をビット演算で解いた

鍋谷さんの解法が綺麗でなんか悔しかったので、別解を模索しました。
結果、頂上から麓へ向けて横道を一回走査するだけで答えを算出できる方法を見つけました。
せっかくなのでビット演算で実装しています。

解説は近いうちに…。

- 問題はこちら: http://mtsmfm.github.io/2016/06/04/doukaku-e04.html
- 各人の実装へのリンク集はこちら: http://qiita.com/mtsmfm/items/6d9112fcc568908caaba

```ruby:orde04.rb
def solve(input)
  brahces, rock = ->(bs, r) { [bs.chars.map {|b| (0x181 >> (8 - b.to_i)) & 0xff }, 1 << (r.ord - ?A.ord)] }[*input.split(':')]

  death_route = brahces.reduce(rock) {|death_route, branch|
    if (rock & branch) != 0
      rock ^= branch
      death_route | branch
    else
      mask = branch
      mask ^= branch if ((death_route ^ branch) & branch) * (death_route & branch) == 0
      death_route ^ mask
    end
  }

  ('A'..'H').map.with_index {|c, i| c if death_route[i] == 0 }.join
end

def test(input, expected)
  actual = solve(input)

  if actual == expected
    print "\x1b[32m.\x1b[0m"
  else
    puts <<~EOS
      \x1b[31m
      input:    #{input}
      expected: #{expected}
      actual:   #{actual}\x1b[0m
    EOS
  end
end

test('2512:C', 'DEFGH')
test('1:A', 'CDEFGH')
test(':C', 'ABDEFGH')
test('2345:B', 'AGH')
test('1256:E', 'ABCDH')
test('1228:A', 'ADEFG')
test('5623:B', 'AEFGH')
test('8157:C', 'ABDEFGH')
test('74767:E', 'ABCFGH')
test('88717:D', 'ABCEFGH')
test('148647:A', 'ACDEFH')
test('374258:H', 'BCDEFH')
test('6647768:F', 'ABCDEH')
test('4786317:E', 'ABFGH')
test('3456781:C', '')
test('225721686547123:C', 'CEF')
test('2765356148824666:F', 'ABCDEH')
test('42318287535641783:F', 'BDE')
test('584423584751745261:D', 'FGH')
test('8811873415472513884:D', 'CFG')
test('74817442725737422451:H', 'BCDEF')
test('223188865746766511566:C', 'ABGH')
test('2763666483242552567747:F', 'ABCG')
test('76724442325377753577138:E', 'EG')
test('327328486656448784712618:B', '')
test('4884637666662548114774288:D', 'DGH')
test('84226765313786654637511248:H', 'DEF')
test('486142154163288126476238756:A', 'CDF')
test('1836275732415226326155464567:F', 'BCD')
test('62544434452376661746517374245:G', 'G')
test('381352782758218463842725673473:B', 'A')
puts
```
めざせpythonライブラリマスター （43）cpmoptimize

#【ライブラリ説明】
　素早く指数計算を行う

#【プログラム】
```py:cpmoptimize.py
# -*- coding: utf-8 -*-

from benchit import BenchIt

b = BenchIt()

def fib(n):
    a = 0
    b = 1
    for i in xrange(n):
        a, b = b, a + b
    return a

result = fib(10 ** 6)

b.mark("not use cpmoptimize")

from cpmoptimize import cpmoptimize

@cpmoptimize()
def fib(n):
    a = 0
    b = 1
    for i in xrange(n):
        a, b = b, a + b
    return a

result = fib(10 ** 6)

b.mark("use cpmoptimize")
b.display()
```

#【結果】
```text:output.text
+---------------------+----------+------+-------+----------+----------+---------+
| Marker              | Method   | Line | Loops | Avg Time |  Runtime | Percent |
+---------------------+----------+------+-------+----------+----------+---------+
| not use cpmoptimize | <module> |   16 |     1 | 28.56600 | 28.56600 |   96.95 |
| use cpmoptimize     | <module> |   30 |     1 |  0.89900 |  0.89900 |    3.05 |
+---------------------+----------+------+-------+----------+----------+---------+
Total runtime: 29.47
```

#【参考サイト】
　[pypi](https://pypi.python.org/pypi/cpmoptimize/0.3.post2)
　[github](https://github.com/borzunov/cpmoptimize)
　[めざせpythonライブラリマスター （27）benchit](http://qiita.com/Algebra_nobu/items/e9d495a6e15f3e36aebc)
MacのMysql workbenchから多段SSH接続。(ポートフォワード接続)

Mysql workbenchで2段以上の多段SSHを使った接続方法を調べたので備忘録として残しておきます。
（踏み台1段までならMysql workbenchがサポートしてます。）

##前提
- host1とhost2の2台のサーバーが存在。
- host2にmysqlサーバーがインストールされている。
- host2のサーバーへはアクセス制限があり、host1からでないとアクセスできない。

##やりたいこと
- host2にあるmysqlサーバーにmacのmysql Workbenchを使って接続したい。

[Mac] ==> [host1] ==> [host2] ==> [Mysql]

##実装
mysql workbenchでは1段階しか踏み台できないので、まずはターミナルからSSHで穴（ポートフォワード）をつくってからworkbenchを繋ぐ。

- 1.host1を踏み台にしてhost2へSSH接続 → .ssh/configを使って簡単に！
- 2.Mysql workbench接続

# 1.host1を踏み台にしてhost2へSSH接続
ターミナルからhost1を踏み台にする設定。
後から簡単なコマンドで接続できるように.ssh/configを編集する方法を解説します。
（~/.ssh/configは無ければディレクトリと合わせて新規作成）

~/.ssh/configに接続情報を記載。

```text:~/.ssh/config
Host host1
  hostname XXX.XXX.XXX.101
  port 22
  user user1
  IdentityFile ~/.ssh/user1.pem

Host host2
  hostname XXX.XXX.XXX.102
  port 22
  user user2
  IdentityFile ~/.ssh/user2.pem
  ProxyCommand ssh host1 -W %h:%p
  GatewayPorts   yes
  LocalForward   53306   127.0.0.1:3306
```

ポートフォワード
```GatewayPorts   yes```
```LocalForward   53306   127.0.0.1:3306``` ←この部分。
- ```53306``` ← local（自分のMac） に開くポート番号（任意の数字）
- ```127.0.0.1:3306``` ← 接続先情報（127.0.0.1 = host2 の 3306ポート)

ファイルを保存したらターミナルから下記のコマンドで接続。
```$ssh host2```

これでlocalhostの53306ポートがhost2の3306と接続され利用可能に。
※ ターミナルを終了させると、接続も切れるのでターミナルは開いたままに。

# 2.Mysql workbench接続
ターミナルでポートフォワードしたlocalhostのポートを使って接続します。
Mysql workbenchでは普通のサーバーを追加するのと同じ要領で下記のように設定。
<img width="663" alt="Mysql workbench Screenshot" src="https://qiita-image-store.s3.amazonaws.com/0/11087/cd3d9871-d31e-d8ca-2f2d-761105194436.png">

```text:設定内容
Hostname: 127.0.0.1 ← これは自分のMac
port: 53306 ←自分で開けたポート番号
Username: mysqluser
pass:*****
```

これで登録した接続を開けば connection successです！

--------------------------------------------
ちなみに、SSHを閉じた状態で接続しようとすると、
Server Status が Stopped と表示されます。
<img width="600" alt="Mysql workbench status view" src="https://qiita-image-store.s3.amazonaws.com/0/11087/2b3e9aba-1383-f3fe-3fdc-64093c3597ac.png">
Laravel5.2でパスワードリセットのメールをテキストで送りたい

# 結論
`config/auth.php`ファイルの`passwords['email']`を
`['text' => 'auth.emails.password']`に変えてみたら見事にテキストメールで送られた。


### ブログでソース追った経緯とか書きました。
http://tossy-yukky.hatenablog.com/entry/2016/06/06/204544
「ドキドキ登山」をrubyで解いてみた

オフラインリアルタイムどう書くE04 の問題をRubyで解いてみました。
http://qiita.com/mtsmfm/items/6d9112fcc568908caaba

```rb
module DeadTrail
  refine(Object) do
    def dead_trail
      def self.dead_trail; end
    end

    def dead_trail?
      respond_to?(:dead_trail)
    end
  end
end

using DeadTrail

def reach_the_top?(rock, trails, hiker)
  return if hiker == rock

  trails.reverse.each do |trail|
    case [hiker, trail]
    when %w(B 1), %w(H 8)
      return if trail.dead_trail?
      hiker = 'A'
    when %w(C 2), %w(A 1)
      return if trail.dead_trail?
      hiker = 'B'
    when %w(D 3), %w(B 2)
      return if trail.dead_trail?
      hiker = 'C'
    when %w(E 4), %w(C 3)
      return if trail.dead_trail?
      hiker = 'D'
    when %w(F 5), %w(D 4)
      return if trail.dead_trail?
      hiker = 'E'
    when %w(G 6), %w(E 5)
      return if trail.dead_trail?
      hiker = 'F'
    when %w(H 7), %w(F 6)
      return if trail.dead_trail?
      hiker = 'G'
    when %w(A 8), %w(G 7)
      return if trail.dead_trail?
      hiker = 'H'
    end
  end

  true
end

def rock_rolling_down(rock, trails)
  trails.each do |trail|
    case [rock, trail]
    when %w(B 1), %w(H 8)
      rock = 'A'
      trail.dead_trail
    when %w(C 2), %w(A 1)
      rock = 'B'
      trail.dead_trail
    when %w(D 3), %w(B 2)
      rock = 'C'
      trail.dead_trail
    when %w(E 4), %w(C 3)
      rock = 'D'
      trail.dead_trail
    when %w(F 5), %w(D 4)
      rock = 'E'
      trail.dead_trail
    when %w(G 6), %w(E 5)
      rock = 'F'
      trail.dead_trail
    when %w(H 7), %w(F 6)
      rock = 'G'
      trail.dead_trail
    when %w(A 8), %w(G 7)
      rock = 'H'
      trail.dead_trail
    end
  end
  rock
end

def solve(input)
  trails, rock = input.split(?:)
  trails = trails.chars

  rock = rock_rolling_down(rock, trails)

  hikers = %w(A B C D E F G H)
  hikers.select {|hiker| reach_the_top?(rock, trails, hiker) }.join
end

def test(input, expected)
  actual = solve(input)
  unless actual == expected
    puts "test(#{input.inspect}) #=>\n  expected: #{expected}\n    actual: #{actual}"
  end
end

test("2512:C", "DEFGH")
test("1:A", "CDEFGH")
test(":C", "ABDEFGH")
test("2345:B", "AGH")
test("1256:E", "ABCDH")
test("1228:A", "ADEFG")
test("5623:B", "AEFGH")
test("8157:C", "ABDEFGH")
test("74767:E", "ABCFGH")
test("88717:D", "ABCEFGH")
test("148647:A", "ACDEFH")
test("374258:H", "BCDEFH")
test("6647768:F", "ABCDEH")
test("4786317:E", "ABFGH")
test("3456781:C", "")
test("225721686547123:C", "CEF")
test("2765356148824666:F", "ABCDEH")
test("42318287535641783:F", "BDE")
test("584423584751745261:D", "FGH")
test("8811873415472513884:D", "CFG")
test("74817442725737422451:H", "BCDEF")
test("223188865746766511566:C", "ABGH")
test("2763666483242552567747:F", "ABCG")
test("76724442325377753577138:E", "EG")
test("327328486656448784712618:B", "")
test("4884637666662548114774288:D", "DGH")
test("84226765313786654637511248:H", "DEF")
test("486142154163288126476238756:A", "CDF")
test("1836275732415226326155464567:F", "BCD")
test("62544434452376661746517374245:G", "G")
test("381352782758218463842725673473:B", "A")
```
Epsonが作ってくれたWindows 10へのアップグレードを無効にするプログラムを試す

Windows7を再インストールしたマシンが手元にあったので、Epsonさんが作ってくれた
「Windows 10へのアップグレードを無効にするプログラム」
http://faq.epsondirect.co.jp/faq/dl/app/servlet/qadoc?034748
を試してみる。

![2016-06-06 20.39.49.jpg](https://qiita-image-store.s3.amazonaws.com/0/82956/6d879ff9-d30d-52ff-a057-85d7991530fc.jpeg)
確かにいやがるな！

![2016-06-06 20.40.06.jpg](https://qiita-image-store.s3.amazonaws.com/0/82956/0d9c43c5-4db7-8808-e82e-462642931bd8.jpeg)
gwx_stop.batを管理者権限で実行

![2016-06-06 20.40.54.jpg](https://qiita-image-store.s3.amazonaws.com/0/82956/acee52e6-4a12-a3f9-043b-94b3e052f250.jpeg)
何回かEnterキーを押して終了、そして再起動。

見事に消えている！
が、諸悪の根源KB3035583自体は残っていた・・・。
Java Silver 勉強しよう　1章

会社でいい加減Silverとろうってことで勉強会をします。
テキストのポイントをまとめて、勉強会の資料として使うようにするため定期的に投稿します。
とりあえず第1章です。

---

#Javaテクノロジーの特徴

以下の3つが挙げられる。

- Write Once, Run Anywhere（一度書けばどこでも動く）
…OSとの依存関係がない。
- Java実行環境（JVM）による処理
…OS上で直接動くのでなく、実行環境上で動く。
- オブジェクト指向

#セットアップ

~省略~

#クラスとソースファイル

- public指定のクラスは1つのソースファイルにつき1つだけ
- public指定した場合、ソースファイル名をpublicのクラス名に合わせる。


#リテラル

##整数リテラル



| 進数        | 例          |
|:-----------:|:------------:|
| 10進数      |        255 | 
| 2進数     |      **0b**101 |
| 8進数       |        **0**377 | 
| 16進数       |        **0x**ff |  


##不動小数点リテラル

| 標記        | 例          |
|:-----------:|:------------:|
|10進数|　12.33|
|指数表現　|**3e4**→3.0の4乗＝30000.0|

##文字リテラル

|         | 例          |
|:-----------:|:------------:|
|1文字　|'A'|
|Unicode|　'\u3012'|

(￥は試験では\になっているので注意)


###エスケープシーケンス

~省略~


##数値リテラルとアンダースコア

- JavaSE7以上数値リテラルに「_」（アンダースコア）使用可能に
- 適用ルールは「リテラルの先頭および末尾、記号の前後には利用できない」


#変数

変数の識別子のルールは以下

- 1文字目は英字、アンダースコア、ドル記号
- 2文字目以降に数字も利用可能
- 予約語はだめ
- 大文字・小文字は区別される
- 文字数制限はない


#データ型

~大体省略~

longにL、floatにFをつけるくらい
ダイクストラ法の実装

#実装メモ
友達にダイクストラ法を教えて貰ったので実装してみた。

```py
inf = float('inf')

TRUE = 1
FALSE = 0
NOT_CHECKED = 0
CHECKED = 1

N = 6
scores = [0,inf,inf,inf,inf,inf]
check = [NOT_CHECKED]*N

graph = [[1,2],[0,2,3],[0,1,3,4],[1,2,4,5],[1,2,3,5],[3,4]]
edg_distance=[
	[0,1,6,0,0,0],
	[1,0,2,4,4,0],
	[6,2,0,1,7,0],
	[0,4,1,0,5,2],
	[0,4,7,5,0,3],
	[0,0,0,2,3,0]
	]


def untreated(check):
	for flag in check:
		if flag == NOT_CHECKED:
			return TRUE
	return FALSE

def minNode_untreated(scores,check):
	min_node = inf
	node = 0
	N = len(scores)
	for i in range(0,N):
		if min_node>scores[i] and check[i] == NOT_CHECKED:
			min_node = scores[i]
			node = i
	return node

def dijkdtrs(graph,edg_distance):
	while untreated(check):
		node_now = minNode_untreated(scores,check)
		for node_next in graph[node_now]:
			if check[node_next] == 1:
				continue
			prescore = scores[node_now] + edg_distance[node_now][node_next]
			if scores[node_next]>prescore:
				scores[node_next] = prescore
		check[node_now] = CHECKED

	print scores[-1]

dijkdtrs(graph,edg_distance)



```

#参考サイト
[Library of Algorithms](https://library-of-algorithm.herokuapp.com)
[SpringBoot,Thymeleaf] ページの一部だけ更新する際のセッションタイムアウト対応

SpringBoot＋ThymeleafでAjax処理してHTMLを部分的に書き換える場合があります。
検索処理をAjaxでやって検索結果のところだけ動的に書き換える、みたいな感じですね。
別にSpringBoot＋Thymeleafじゃなくたってありますが。
SpringBootと言ってますが要はSpringMvcですね。

この組み合わせでやるとき、Controllerの戻り値を

Return "hogehoge:fugafuga"

のようにしてth:fragmentを指定した一部分のHTMLだけを返すようにします。

![WS000039.JPG](https://qiita-image-store.s3.amazonaws.com/0/113385/a436c19d-b3e9-8cb8-d831-1cd080fd4a7c.jpeg)
こんな感じですね。
「検索」、「クリア」のあと、「前へ」の手前までの部分がfragmentになっています。


が、こうしているとセッションタイムアウトしている場合に悲劇が発生します。

具体的には
![WS000040.JPG](https://qiita-image-store.s3.amazonaws.com/0/113385/72e36d6e-f165-f725-721f-13326b7828ef.jpeg)

こうなります。
fragmentの部分にログイン画面がはまってしまいました。

SpringSecurityの認証フィルタを使うとタイムアウトしている場合は自動的にログイン画面に飛ばしてくれるのですが、ajaxでfragment部分だけ戻している場合も例外では無く。


さてさて、これでは大変見栄えがよろしくないのでなんとかしたいところです。
しかしサーバーサイドではSpringSecurityがばっちり拾ってくれているので介入のしようが無く、クライアントサイドでは正常（ステータスコード＝200）でログイン画面が返ってきます。
さてどうしたものか。

返ってきたのがログイン画面だったらリダイレクトすればいいじゃない。

というわけでログイン画面にコメントで目印を埋め込んで・・・

```html:ログイン画面先頭
<!DOCTYPE html> <!-- this is login form -->
<html xmlns:th="http://www.thymeleaf.org">
```

それを見つけたらリダイレクト！

```js:js-Ajax共通処理
// タイムアウトしてから検索すると、検索エリアにログイン画面が埋め込まれる事象の対応
$(document).ajaxSuccess(function(e, xhr, options){
    // レスポンスにDOCTYPEが含まれたらログイン画面と判断する
    if(xhr.responseText.match(/<!-- this is login form -->/)){
    	// ログイン画面を受信した場合は自画面に遷移させる（ことで親画面をログイン画面にする）
    	window.location.href = './';
    	return false;
    }
});
```

fragmentでは含まない`<!DOCTYPE html>`を拾おうかとも考えたのですが、一応ログイン画面に限定した実装にしておこうかと。

力技ですのでもっとスマートなやり方をご存じの方は是非コメントをお願いします。
sshのDynamicForwardで学内専用サービスを家から使う

#やりたいこと
VPNやTeamViwerではなく、家に居ながら学内の計算リソースが使いたい、学内限定のwebページが使いたい人への記事です。
自分がポート指定してつないだり、踏み台経由してなど面倒なことで困ったので、ここに残したいと思います。結論から言えば、DynamicForwardと、SOCKSproxyを調べると幸せになれました。


#やり方
自分の環境はこんな感じです。
local -> 踏み台サーバー1(ho.host.jp) -> 目的サーバー(mokutekisa-ba)

まずconfigを設定などします。
多段sshの設定と同様ですが、最後の目的サーバーの設定でDynamicFowardを設定します。

```bash:.ssh/config
Host 踏み台サーバー1
 User ユーザーネーム
 HostName ho.host.jp
 IdentityFile ~/.ssh/id_rsa
 
Host 目的サーバー
 User ユーザーネーム
 HostName mokutekisa-ba
 ProxyCommand ssh -W %h:%p 踏み台サーバー1
 DynamicForward 1080
```

これで、`ssh 目的サーバー`とすれば目的サーバーに到達できます。
学内限定のサービスにつなぎたい場合は、SystemPreferences->Network->Advanced->ProxiesでSOCKSproxyを設定します。

![Screenshot 2016-06-06 19.40.41.png](https://qiita-image-store.s3.amazonaws.com/0/96637/adc01b0c-314e-5274-34dd-de2f17ace863.png)

これで学内ページが見れるようになったはずです。
満足したら、SOCKSproxyのチェックを外してコンソールを閉じれば終了です。

#おまけ
いちいちSOCKSproxyのチェック入れるの面倒！
`proxy.sh`と叩くとSOCKSproxyがON OFFできます。

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

e=$(networksetup -getsocksfirewallproxy wi-fi | grep "No")
if [ -n "$e" ]; then
  echo "Turning on proxy"
  sudo networksetup -setsocksfirewallproxystate wi-fi on
  echo 'display notification "ON" with title "proxy.sh"'  | osascript
else
  echo "Turning off proxy"
  sudo networksetup -setsocksfirewallproxystate wi-fi off
  echo 'display notification "OFF" with title "proxy.sh"' | osascript
fi
```
xcopyで更新分だけフォルダとファイルを一括コピー

## 困ったこと
**「ホームページの更新分だけ階層構造を保ったままZipファイルにして先方にメールしといて」**...などと偉い人に言われて困ったことはありませんでしょうか？
...私はあります。

Gitがあまねく普及している2016年に必要なテクニックなのかはいまいちよくわからないところではありますが、上記のような場合に手作業でコピペをしてミスをしないために、コマンドプロンプトを使って更新分（差分）だけ階層構造を保ったままフォルダごとファイルを一括コピペする方法を書き残しておきますね。
フリーソフト等もあるようですが、このやり方が一番楽だと私は感じました。

## xcopyを使う
コマンドプロンプトを開き
`xcopy コピー元フォルダまたはファイル コピー先フォルダまたはファイル /D:MM/DD/YYYY /S /Y`
と記入してエンターキーを押下すればOKです。
例：2016年6月6日以降に更新したファイルをフォルダごとデスクトップにコピペ
`xcopy C:\Users\user\Documents\folder_a C:\Users\user\Desktop\folder_a_copy /D:06/06/2016 /S /Y`

気持よく一発で差分だけのフォルダとファイルが出来ましたよ。

### 上記のオプション
<dl>
<td>/D:MM/DD/YYYY</td>	<dd>指定した日付以降に更新されたファイルのみコピーする</dd>
<td>/S</td>	<dd>ファイルが存在する場合のみディレクトリごとコピーする</dd>
<td>/Y</td>	<dd>同名のファイルが存在する場合、上書きの確認を行わない</dd>
</dl>

#### その他のオプション
下記リンクを参照。

- [ファイルをディレクトリ構造ごとコピーする - k-tanaka.net](http://www.k-tanaka.net/cmd/xcopy.php)
- [Xcopy - Microsoft](https://technet.microsoft.com/ja-jp/library/cc771254(v=ws.10).aspx)


## 所感

プログラマーの方には常識かもしれませんが、デザイナー上がりの私は最近までこのやり方を知りませんでした。少しずつ黒い画面と友達になれてきたような気がしています。また、このやり方は〇〇日以降という形でしか差分抽出できないので、数日にわたって更新した差分や過去のある期間の差分抽出などでは使いにくいかもですね。...精進します。
OAuth2 Token Exchangeのサンプルを見てみた

# RFCに載ってるサンプル

まだDraftですがOAuth2のトークン交換のためのプロトコルが公開されています。
この仕様を利用することで、ベースとなる共通のトークンを１つだけ発行し、それを各コンポーネントで共有するといった設計が可能となります。

![token exchange.png](https://qiita-image-store.s3.amazonaws.com/0/114752/ddf061f8-4204-0607-4ea1-9d43b899a2e5.png)


RFCにサンプルが載っているので、見てみましょう。

https://tools.ietf.org/html/draft-ietf-oauth-token-exchange-04#section-2.3

このサンプルでは、アプリとバックエンドサーバの間をフロントサーバが仲介し、トークンの交換を行うというシナリオになっています。



##アプリがフロントサーバに、リクエストを送る

`GET /resource HTTP/1.1
    Host: frontend.example.com
    Authorization: Bearer accVkjcJyb4BWCxGsndESCJQbdFMogUC5PbRDqceLTC`

"accVkjcJyb4BWCxGsndESCJQbdFMogUC5PbRDqceLTC"が交換元となるアクセストークンです。
普通のOAuth2リクエストですね。
（この例では）アプリ側はトークン交換を意識せず、普通のOAuth2 APIと同じ感覚で使うことができそうです。

##フロントサーバが、認証サーバにトークン交換リクエストを送る

`POST /as/token.oauth2 HTTP/1.1
    Host: as.example.com
    Authorization: Basic cnMwODpsb25nLXNlY3VyZS1yYW5kb20tc2VjcmV0
    Content-Type: application/x-www-form-urlencoded`

`grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Atoken-exchange&resource=https%3A%2F%2Fbackend.example.com%2Fapi%20&subject_token=accVkjcJyb4BWCxGsndESCJQbdFMogUC5PbRDqceLTC&subject_token_type=urn%3Aietf%3Aparams%3Aoauth%3Atoken-type%3Aaccess_token`

フロントサーバはアプリから受け取ったアクセストークンを認証サーバに転送し、新しいトークンを取得します。
その際に、grant_typeは"urn:ietf:params:oauth:grant-type:token-exchange"を指定し、subject_token_type=には"urn:ietf:params:oauth:token-type:access_token"を指定します（アクセストークンを元に交換する場合。例えばID Tokenの場合は"urn:ietf:params:oauth:token-
   type:id_token"）になります。
認証サーバはこのリクエストの内容と定められたポリシーを照らし合わせて交換の可否を決定します。
（例えばトークンのオーナーがサービスを退会してないかどうかを確認する等）

そして次のようなレスポンスが返ってくれば交換が成立です！！

`HTTP/1.1 200 OK
    Content-Type: application/json
    Cache-Control: no-cache, no-store`

    {
     "access_token":"eyJhbGciOiJFUzI1NiIsImtpZCI6IjllciJ9.eyJhdWQiOiJo
       dHRwczovL2JhY2tlbmQuZXhhbXBsZS5jb20iLCJpc3MiOiJodHRwczovL2FzLmV
       4YW1wbGUuY29tIiwiZXhwIjoxNDQxOTE3NTkzLCJpYXQiOjE0NDE5MTc1MzMsIm
       F6cCI6InJzMDgiLCJzdWIiOiJiY0BleGFtcGxlLmNvbSIsInNjcCI6WyJhcGkiX
       X0.vHJKtJ-zFIN75Tk7qGlmQsWPlvnChb2uSaGwPLvlWl64ts7-vvfwYDaVoXIQ
       e_HkTVdljIzavVlPT60_b_9pDQ",
     "issued_token_type":
         "urn:ietf:params:oauth:token-type:access_token",
     "token_type":"Bearer",
     "expires_in":60
    }

##フロントサーバは、入手したアクセストークンを使ってバックエンドサーバから情報を取得する

`GET /api HTTP/1.1
    Host: backend.example.com
    Authorization: Bearer eyJhbGciOiJFUzI1NiIsImtpZCI6IjllciJ9.eyJhdWQ
       iOiJodHRwczovL2JhY2tlbmQuZXhhbXBsZS5jb20iLCJpc3MiOiJodHRwczovL2
       FzLmV4YW1wbGUuY29tIiwiZXhwIjoxNDQxOTE3NTkzLCJpYXQiOjE0NDE5MTc1M
       zMsImF6cCI6InJzMDgiLCJzdWIiOiJiY0BleGFtcGxlLmNvbSIsInNjcCI6WyJh
       cGkiXX0.vHJKtJ-zFIN75Tk7qGlmQsWPlvnChb2uSaGwPLvlWl64ts7-vvfwYDa
       VoXIQe_HkTVdljIzavVlPT60_b_9pDQ`

以上がサンプルは終わりです。
特に難しいところはありませんね。

#疑問

- 実はToken Refreshと実質的にやってることはそれほど変わらない？
- ID Tokenをsubject tokenに使うのは、セキュリティ的にどうなんだろうか？
- フロントサーバが毎回トークン交換してるとオーバーヘッドがが大きいので、アプリ側で交換を実施して、交換済みのトークンをフロントサーバに送った方がよい気がする（セキュリティ的には望ましくない？）。
- 実装してるサービスあるのか？
jQueryプラグインサイト紹介

####1. noUiSlider | http://refreshless.com/nouislider/
シンプルでデザインがかわいいSliderを提供します。

####2. iCheck | http://fronteed.com/iCheck/
デザインがすごく綺麗なチェックボックス・ラジオボタンなどがあります。

####3. jQeury Selectric | http://lcdsantos.github.io/jQuery-Selectric/index.html
こちらはセレクトボックスを提供します。
テーマがサイトの右上に色々あるので自分が好きなテーマで導入するのはいかがですか？

####4. CSS3とjQueryを使ったテキストエフェクト | http://tympanus.net/Tutorials/TypographyEffects/index6.html
単語も、文字列も素敵なエフェクトで表示させるプラグインです。

####5. 動的サイドメニュー | https://www.berriart.com/sidr/
左、右、画面の上にメニューが重なるのではなく、画面を動かしてメニューを表示します。
JMC（Java Mission Control）リモート接続の方法

Java Mission Controlクライアントは、リモートで実行しているJVMに接続し、JFR（Java Flight Recorder）記録を取得することができます。
![2016-06-06_175819.png](https://qiita-image-store.s3.amazonaws.com/0/123138/dbedf14b-eb97-9024-d305-f3ce4e8bb3af.png)

#サーバー側の設定
JVMのリモート接続は、JMXRMI (JMX over RMI) が使用されます。それを有効するには、以下のJVMオプションが使用されます。
・`-Dcom.sun.management.jmxremote.port`
・`-Dcom.sun.management.jmxremote.authenticate`
・`-Dcom.sun.management.jmxremote.ssl`

接続認証なしでJVMの起動例：

```bash
$java -Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=7091 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false myApp
```

又は、JAVA_TOOL_OPTIONSで指定する。


```bash
$set JAVA_TOOL_OPTIONS "-Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=7091 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false"
```

※JFRを有効には以下のオプションも必要です。
`-XX:+UnlockCommercialFeatures -XX:+FlightRecorder`


#クライアント側の設定
１．`%JAVA_HOME%\bin\jmc.exe`からJMC クライアントを起動する。
![2016-06-06_180455.png](https://qiita-image-store.s3.amazonaws.com/0/123138/5334092d-7eb2-5361-d88a-2caffaf1bc84.png)

２．「ファイル」⇒「接続」でJVM接続画面を開き、接続情報を入力する。
![2016-06-06_182134.png](https://qiita-image-store.s3.amazonaws.com/0/123138/e31e63e1-7805-2744-8846-2fa1d6556519.png)

３．「フライト記録の開始」画面で記録方法を入力する。
![2016-06-06_182707.png](https://qiita-image-store.s3.amazonaws.com/0/123138/b123a821-10b0-1818-46d1-397b1a7b5486.png)

４．結果を確認する。
![2016-06-06_183449.png](https://qiita-image-store.s3.amazonaws.com/0/123138/87218f5c-19e6-a90b-b7cc-db7b889febf3.png)
HTKをUbuntu14.04にインストールする

# 音声認識ライブラリHTK
Ubuntu14.04にインストール

# X11 が無いと怒られる
hlmtoolsで使うものがないとのこと
HTKのインストールで困るのはそこだけ！と言っても過言ではない。
じゃあどうするのが良いのか。

# hlmtoolsとhslabをインストールしないのが一番
そもそもX11はなぜ必要なのかというと、hslabというツールキットで用いるのだ。正直これは使ったことがない。
ということで、
`./configure --disable-hslab --disable-hlmtools`
実はこれが最短。みんな32bitがどうとかいっているが、先述同様そもそもhslabがいらない状況は多い。ならば最初からインストールしないというのも解決策。

このあとは、
`make all`
`make install`
でOK


# 先人の投稿たちを集めた
どれもX11の問題で止まって、頑張って解決している。どうしてもhslabが必要な時、以下のページを見ると良い。。。
http://htktools.blogspot.jp/2015/02/installation-issue-of-htk-on-ubuntu-1404.html
http://d.hatena.ne.jp/seeker9/20091119/1258588393
http://d.hatena.ne.jp/Cheru/20100720/1279625574
http://aidiary.hatenablog.com/entry/20130113/1358046622
http://ubuntuforums.org/archive/index.php/t-1090377.html
http://www.voxforge.org/home/dev/acousticmodels/linux/create/htkjulius/tutorial/download/comments/htk-install..
空のプルリクを作りたかったら空のcommitが便利


### ブランチ作成
```sh
$ git checkout -b topic-branch
```

### 空コミット
```sh
$ git commit --allow-empty -m "make pull request"
```

### push
```sh
$ git push origin topic-branch
```

これでGitHub上で空のプルリクが作れるようになる。
jQueryでCSSを使う方法

#####こちらは初心者向けです。

#jQueryでCSSを使う

CSSファイルやスタイルシートを定義しなくてもjQueryでデザインを定義、変更することができます。
こちらをできるようにする関数は「.css()」です。

```html:css.html
$(".css-div").css("width", "100px").css("border", "#000 2px solid");
```

.css(///).css(///)
こんな感じでcssをずっとつないで定義することもできまして

```html:css.html
$(".css-div").css({
  width: "100px",
  border: "#000 2px solid"
});
```
のように１つの「.css()」の中に複数のスタイルを定義することもできます。

ボタンを押したら線の色が変わることを作ってみましょう。
コードはこちらです。

```html:css.html
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>

<p><button>変更</button></p>

<div class="css-div">こんばんは</div>

<script type="text/javascript">
$(document).ready(function() {
  $(".css-div").css({
    width: "100px",
    border: "#000 2px solid",
    padding: "5px"
  });
  $(document).on("click", "button", function() {
    $(".css-div").css("borderColor", "#f00");
  });
});
</script>
```

![Cap 2016-06-06 18-47-21-344.png](https://qiita-image-store.s3.amazonaws.com/0/113820/f5f7d059-7e79-b8ac-0285-e13a91f17faa.png)

ボタンを押すと線の色が赤に変更します。

![Cap 2016-06-06 18-47-26-373.png](https://qiita-image-store.s3.amazonaws.com/0/113820/f568f826-82ca-b594-a7d8-34a438b8480e.png)
flywayでDBマイグレーションする時、baselineがない!と怒られる時

```
FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':flywayMigrate'.
> Error occurred while executing flywayMigrate
  Found non-empty schema `hogehoge` without metadata table! Use baseline() or set baselineOnMigrate to true to initialize the metadata table.
```
初めてflywayでDBマイグレーションする時や、DBに存在するすべてのテーブルをdropした後再度flywayを使うとき、上記のようなエラーが出る。
マイグレーション管理用テーブルが存在していないことが原因。
これを生成するには、

```
gradle flywayBaseline -i 
```

上記コマンドを使う。

参考:
 * [FlywayでDBスキーマのマイグレーションをしてみた | Siguniang's Blog](https://siguniang.wordpress.com/2013/11/10/db-schema-migration-made-easy-with-flyway/ "FlywayでDBスキーマのマイグレーションをしてみた | Siguniang's Blog")
 * [Command-line: baseline - Documentation - Flyway by Boxfuse • Database Migrations Made Easy.](https://flywaydb.org/documentation/commandline/baseline "Command-line: baseline - Documentation - Flyway by Boxfuse • Database Migrations Made Easy.")
ngInfiniteScrollを1.2.2にアップするのは待ちましょう


# ある日のこと...

特定の画面だけ digest loop が止まらないことを発見。
あれやこれや試行錯誤して、ng-infinite-scrollディレクティブが怪しいことに気づく。
公式を見に行く。

https://github.com/sroze/ngInfiniteScroll/issues/235

```
This causes a serious performance degregation since the count was removed from the $interval call - it causes a digest loop to run indefinitely which will slow down to the ground every application

The new version 1.2.2 is just not usable and should revert to 1.2.0
```


ナンテコッタイ

というわけでしばらくは1.2.0固定で使うのが良さげです。
rex0220 ルックアップ自動取得プラグイン

kintone のアクション処理でルックアップ項目を設定した場合、標準機能ではルックアップ項目を手動でクリックして値を取得しなければなりません。
ルックアップ自動取得プラグインを導入すると、自動的にルックアップ取得します。


主な機能
・アクション処理でルックアップ自動取得
・レコード複写時、ルックアップ自動取得
・PC・スマホ対応


[rex0220 stores](https://rex0220.stores.jp/)で、販売中です。


Ver.5 変更点
・'ja','en','zh'以外の言語設定時のエラー対応

# アクション処理でルックアップ自動取得

アプリストアの営業支援パックの案件管理アプリに、ルックアップ自動取得プラグインを適用した例です。
顧客アプリからアクション機能で案件管理アプリに登録すると、ルックアップ自動取得します。

<img width="953" alt="2020-05-20_16h58_28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/889d0bc9-6df4-3e08-9154-d36c9cbd8cc6.png">


# レコード複写時のルックアップ自動取得

同じく案件管理アプリでレコード複写した場合、ルックアップ自動取得する例です。
最新の顧客情報を取得します。

<img width="957" alt="2020-05-20_17h08_45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/3de8350a-f712-f51d-bc98-bf461aa24f92.png">



# kintoneプラグイン追加
ルックアップ自動取得プラグインを読み込みます。

![autolookup2.png](https://qiita-image-store.s3.amazonaws.com/0/100572/b481388b-fe31-79f4-1e5b-4e01cd273b63.png)

# アプリプラグイン設定画面
対象アプリで、プラグイン設定画面を開くとルックアップ項目が表示されますので、自動取得対象にする項目をチェックし、「保存する」ボタンをクリックします。

- NOTE： プラグイン設定のメモ用
- プラグイン有効：　プラグインを有効にする場合にチェック
- コピー時有効：　レコード複写時にルックアップ自動取得する場合にチェック
- ルックアップ項目のチェック：　ルックアップ自動取得する場合にチェック


<img width="844" alt="2020-05-20_17h16_29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/323496ca-3cc9-a4c7-89dd-7440922f89f7.png">

#注意事項

- 既に、JavaScript によるカスタマイズを行っているアプリの場合、処理が競合して、エラーになる場合があります。その場合は、該当するアプリでプラグインの使用を中止してください。
- ルックアップ項目がレコード番号以外の場合、参照されるアプリで「値の重複を禁止する」が設定されている必要があります。
- ルックアップ項目のフィールドコードを変更した場合は、プラグインを再設定してください。
シェルスクリプトとedで、テキストファイルの行を逆順にする。(小ネタ・読了に要する時間：推定約30秒)

# はじめに

シェルスクリプトとedをちょっと真面目にお勉強したら、プログラム書くまでもなく、色々できることが増えて幸せになれるかも？と思わせてくれたお題について書きます。

なお、以下で、$ はシェルプロンプトです。

# お題

指定したテキストファイルの行を逆順にするようなプログラム reverse を作る。
具体的には以下のような感じ。

```shell-session:shell
$ cat abc.txt
111
222
333
444
555
```
というテキストファイルabc.txt があり、これに対して

```shell-session:shell
$ reverse abc.txt
```
とすると、abc.txt が以下のようになる。

```shell-session:shell
$ cat abc.txt
555
444
333
222
111
```
このような reverse を作成したい。

# 答え

```bash:reverse
#!/bin/sh                                                                                                            

ed - $1 <<- !
g/^/m0
w
q
!
```

以下実行したところ

```shell-session:shell
$ cat abc.txt
111
222
333
444
555
$ reverse abc.txt; cat abc.txt
555
444
333
222
111
$ reverse abc.txt; cat abc.txt
111
222
333
444
555
$ 
```

# 引用元

[入門UNIXシェルプログラミング―シェルの基礎から学ぶUNIXの世界](http://www.amazon.co.jp/dp/4797321946) 
P.107 4章10節 ヒアドキュメント

# 参考

Wikipedia: [ed](https://ja.wikipedia.org/wiki/Ed)
Stemsファイルの各チャンネルの中身を取り出すコマンド


Stemsフォーマットって聞いたことしかなく、使ったことなかったのだけど。

http://www.stems-music.com/ja/stems-is-for-djs-jp/
4ch分、個別にミックス前のトラックが入ったフォーマットらしい。ほぼDJ用。
stemsのサンプルファイルもここからダウンロード出来る。(1.5GB)


エンコードの方は、アプリがあって誰でも作れる感じ。
http://www.stems-music.com/ja/stem-creator-tool-jp/


でも、デコードする方法は無いなと思って。
しらべらただのmp4コンテナに、音声ファイルがはいってるだけぽい。

ので。

```sh
# チャンネルの情報見る
ffmpeg -i sample.stem.mp4
```

```sh
# チャンネルごとwavに書き出す
ffmpeg -i sample.stem.mp4 -map 0:0 stereo.wav -map 0:1 drums.wav -map 0:2 bass.wav -map 0:3 synths.wav -map 0:4 vox.wav
```
パターンスペースへ全行を読み込む

入力ファイル全体をパターンスペースへ読み込む方法です。何かの役に立つかな･･･？

## サンプル入力
```foo.txt
foo
bar
baz
qux
quux
```
## 全ての行をパターンスペースへ
```
:read
N
$!b read
# 以下チェック用
# =s/\n/:/g # 試しに行番号を表示し、改行を:で置き換えてみる
# l # もしくは曖昧でない形での表示
```
JSONの配列その他を作るのに使えそう。

```!!:tojsonarray.sed
:read
N
$!b read

s/^/["/
s/$/"]/
s/\n/","/g

```
```bash
$ sed -f tojsonarray.sed foo.txt 
["foo","bar","baz","qux","quux"]
```
## LIFOで全ての行をパターンスペースへ
もっと簡単に書けないかな？

```
:read
1!G
h
s/.*//
N
s/^\n//
$!b read
G
```
テスト。

```lifo.sed
p

:read
1!G
h
s/.*//
N
s/^\n//
$!b read
G

l
s/\n/:/g
```
```bash
$ sed -f lifo.sed foo.txt 
foo
quux\nqux\nbaz\nbar\nfoo$
quux:qux:baz:bar:foo
```

sedで制御構造扱うのはつらいなあ･･･。
can't start git /usr/bin/git を消す

AndroidStudioで開発中に

can't start git /usr/bin/git 

なるメッセージが出ます。
×ボタン押しても押しても出てきますｗ
これを消します。

XCodeを起動して、何やらlicenseをAgreeしてくれと尋ねられるので
Agreeします。

消えました。

AndroidStudio側からXCodeの何かを使ってたんでしょうかね。
ブラウザでMarkdownを表示する方法

READMEやメモ書き等でよく使われるMarkdown記法ですが、これをブラウザで表示できるようにする方法について紹介します。

#Firefox
1. Firefoxを起動します。
2. [Markdown Viewer – 🦊 Firefox (ja) 向け拡張機能を入手](https://addons.mozilla.org/ja/firefox/addon/markdown-viewer-chrome/)より、アドオンを追加します。

#Google Chrome, Vivaldi
1. Google Chrome (Vivaldi) を起動します。
2. [Markdown Preview Plus - Chrome ウェブストア](https://chrome.google.com/webstore/detail/markdown-preview-plus/febilkbfcbhebfnokafefeacimjdckgl)より、アプリを追加します。
3. `chrome://extensions`にアクセスします。
4. チェックを入れます。<br>![拡張機能 - Google Chrome_018.png](https://qiita-image-store.s3.amazonaws.com/0/52291/b3476bdd-420b-f6f9-5ae9-74dd2f28b3e6.png)
5. ![新しいタブ - Google Chrome_021_.png](https://qiita-image-store.s3.amazonaws.com/0/52291/f1a8b606-4438-aff6-1241-14bd354b2a67.png)
をクリックします。<br>![新しいタブ - Google Chrome_020.png](https://qiita-image-store.s3.amazonaws.com/0/52291/17f7a150-9caf-4822-0edf-153c3dc135bf.png)
6. `Options`をクリックします。<br>![新しいタブ - Google Chrome_021.png](https://qiita-image-store.s3.amazonaws.com/0/52291/7200ef9a-91f1-b0ba-c834-6d48a0b2b3a7.png)
7. チェックを外します。<br>![77c256d2-fc5b-ac4b-1a2e-83ef97ffe35b.png](https://qiita-image-store.s3.amazonaws.com/0/52291/d194f082-77f4-fe0c-0e1e-bd1381667abb.png)

#共通
1. `md`ファイルの関連付けをブラウザに設定します。
AWS Key Management Serviceを使ってconfigファイルを暗号化すると便利

以前、[yaml_vault](https://github.com/joker1007/yaml_vault) というyamlで書いた設定ファイルを暗号化するgemを作りました。
そのyaml_vaultでAWS KMSを利用した暗号化をサポートしました。

AWS KMSで作った暗号化キーで、4kバイトまでの文字列を直接暗号化できます。
普通のconfigパラメーターは4kバイトも無いので、ほとんど直接暗号化だけでカバーできるでしょう。

使い方はこんな感じ

```
% yaml_vault encrypt secrets.yml -o encrypted_secrets.yml --cryptor=aws-kms \
  --aws-region=ap-northeast-1 \
  --aws-kms-key-id=<kms-cms-key-id> \
  --aws-access-key-id=<AWS_ACCESS_KEY_ID> \
  --aws-secret-access-key=<AWS_SECRET_ACCESS_KEY>
```

ちなみにDockerイメージもあるので、rubyを入れなくてもdockerが入ってれば以下の様な形で利用可能。

```
docker run -it \
  -v `pwd`/:/vol \
  joker1007/yaml_vault \
  encrypt /vol/secrets.yml -o /vol/encrypted_secrets.yml -k production.password \
  --cryptor=aws-kms \
  --aws-region=ap-northeast-1 \
  --aws-kms-key-id=<kms-cms-key-id> \
  --aws-access-key-id=<AWS_ACCESS_KEY_ID> \
  --aws-secret-access-key=<AWS_SECRET_ACCESS_KEY>
```

アカウント情報については、一般的なRubyのaws-sdkの読み込みルールに従うので、指定しなければ、自動的に環境変数やIAM Roleを利用する。

この方式の暗号化の良い点はどの鍵で暗号化したかの情報を暗号化後のデータ自体が持っている点。
つまり暗号化した文字列を復号化したい、というリクエストを送るだけで良い。
後はAWS側のキーポリシーとIAMポリシーで鍵の利用権限を持っているアカウントだけが復号化したデータにアクセスでき、そうでない場合は復号化に失敗する。

例えばEC2のIAM Roleを使って復号化する場合にはかなりシンプルに復号化できる。

```
% yaml_vault decrypt encrypted_secrets.yml -o secrets.yml --cryptor=aws-kms \
  --aws-region=ap-northeast-1
```

これを利用すれば、productionのEC2ノードでだけ設定ファイルを復号化したり、ちょっと面倒だけどパラメーター毎に暗号化する鍵を変えれば、特定のconfigパラメーターだけ扱える権限を絞り込んだりできる。

もし設定ファイルを丸ごと暗号化したい場合は、s3のサーバーサイド暗号化にkmsを利用して、aws-cli等を使ってデータを送受信するのが楽で良さそう。
JavaScriptによるcookieが有効か無効かの判定

cookieが有効か無効かの判定の際に、IEとEdgeだけうまくいかなかったので対処法のメモになります。自分用ですが誰かの役に立てば幸いです。

#IEおよびEdge以外

「cookie javasicrpt 無効 判定」などでググると"navigator.cookieEnabled"による判定の記事をよく目にします。しかしChrome、Firefox、Safariは判定できるのですが、IEとEdgeはcookieをブロックにしても"true"が返ってきてしまいました。

```js

if(navigator.cookieEnabled){
  //cookie 有効
}else {
  //cookie 無効
}

```

[DEMO1](http://tatsuyankmura.com/cookie-test/test01.html)
※ cookieの設定を切り替えてお試しください、IEおよびEdgeでご覧ください。

#対処方法

```js

var setCookie = function(cookieName, value){
  var cookie = cookieName + "=" + value + ";";
  document.cookie = cookie;
}

var getCookie = function(cookieName){
  var l = cookieName.length + 1 ;
  var cookieAry = document.cookie.split("; ") ;
  var str = "" ;
  for(i=0; i < cookieAry.length; i++){
    if(cookieAry[i].substr(0, l) === cookieName + "="){
      str = cookieAry[i].substr(l, cookieAry[i].length) ;
      break ;
    }
  }
  return str;
}

setCookie('check_cookie', true);
var val = getCookie('check_cookie');

if(val) {
  //cookie 有効
} else {
  //cookie 無効
}

```

あらかじめcookieと値をセット。
値が返ってきたら有効、返ってこなければ無効と判別します。

[DEMO2](http://tatsuyankmura.com/cookie-test/test02.html)
※ edgeはcookieの設定を変更した後ブラウザの再起動が必要です。

#対処方法（jQuery）

```js

function setCookie(cookieName, value){
  $.cookie(cookieName, value);
}

function getCookie(cookieName){
  var c = $.cookie();
  var str = '';
  for(key in c){
    if(key === cookieName){
      str = c[key];
    }
  }
  return str;
}

```

jquery.cookie.jsを使い、setCookieとgetCookieをそれぞれ書き直してみました。
ソースも簡潔になり、特別な理由がない限りはjQueryで十分そうです。
【WordPress】標準のRSSをカスタマイズして出力する

#【WordPress】標準のRSSをカスタマイズして出力する

***RSS出力用のフックに引っ掛けて、独自作成したRSSテンプレートを読み込ませる***

・RSSテンプレートを作成する。
今回は使用しているテーマの直下にfeedsというディレクトリを作成して、
その中に独自に作成したRSSテンプレートを格納します。
~/wordpress/wp-content/themes/任意のテーマ/feeds/feed-excite.php

独自RSSテンプレートの作成は、wordpress標準の、
~/wordpress/wp-includes/feed-rss2.php
などをコピーして編集すると作りやすいと思います。

・作成したテンプレートを読み込む
作成した独自RSSテンプレートを読み込む関数を作成し、
add_actionでアクションフックを追加する。

```lang:function.php
/*
 * 作成した独自RSSテンプレートを読み込む
 */
function do_feed_new() {
    load_template( get_template_directory() . '/feeds/feed-new.php');
}
//独自RSSテンプレート呼び出し用アクションフックを追加
add_action('do_feed_new', 'do_feed_new');
```
・ホームURLの最後尾に/?feed=newを指定してアクセスする。
<pre>例： http://sample_url/?feed=new</pre>

feed-new.phpに書かれた内容でRSSが出力されます。
power-assert でAPIテスト


基本的なmocha/supertestによるAPIテストは
http://qiita.com/mikakane/items/312f901850cc33b3b07b
を参照。

ここでは検証ツールにpower-assertを使ってみる。

まずは準備
 
````
$ npm i power-assert intelli-espower-loader supertest --save
````

test code はmochaの形式で記述出来る。

````
var request = require('supertest');
var assert = require("power-assert");


describe("SEE API",() => {
    this.timeout(2000)
    var agent = request.agent("http://localhost:8000/");

    it('send addTask',(done) => {

        agent
            .post('/api/news')
            .set('Accept', 'application/json')
            .send({
            	page: 1
            })
            .expect(function(res){
                assert(res.status === 200);
                assert(res.body.status === "OK");
            }).end(function(err,res){
            if(err){
                throw err;
            }
            done();
        });
    });
})
````

power-assert を使えばassert関数を用いて高度なデバッグが可能になる。

supertest は テスト向けのsuperagent wrapper。簡単にテストを作成する際には便利で、sessionの引き継ぎなどを行ってくれる。

実行は

````
$ mocha --require intelli-espower-loader tests/index.js
````

## 注意など

### フォルダ構成を触る場合

intelli-espower-loader は test ディレクトリの中でのみ有効のよう

カスタムのディレクトリ内にソースを起きたい場合には、自分で設定ファイルを作る必要がある。

例えば `api/tests/`というディレクトリにファイルを起きたい場合。

追加モジュールのインストール

````
$ npm i espower-loader --save
````

例えば api/tests/enable-power-assert.js という名前でテスト設定ファイルを作成。

````api/enable-power-assert.js
require('espower-loader')({
    cwd: process.cwd(),
    pattern: '**/*.js' //対象のファイルを指定
});
````

power-assert 変換対象のファイルをminimatch記法で記述するとよいらしい。

テスト実行は以下のコマンドで。

````
$ mocha api/tests --require api/tests/enable-power-assert.js 
````

こちらの情報は@t_wada さんより Twitterでご連絡頂きました。

https://twitter.com/t_wada/status/718269595652616192
session.use_trans_sidが効かない理由

Cookie非対応の携帯でセッションを扱えるようにするため等に
session.use_trans_sidを有効（URLやFORMに自動的にSIDを付加する）にしようとして、１日ハマったので、未来を担う子供たちには私と同じような過ちを起こして欲しくない、という願いから投稿しました。

```php
ini_set('session.use_cookies', 0);
ini_set('use_only_cookies', 0);
ini_set('session.use_trans_sid', 1);
```
↓のように書き換えたら動いた。

```php
ini_set('session.use_cookies', 0);
ini_set('session.use_only_cookies', 0);
ini_set('session.use_trans_sid', 1);
```

`use_only_cookies`ではなく、正しくは`session.use_only_cookies`です。
ただのtypoでした。

参考
[PHP: 実行時設定 - Manual](http://php.net/manual/ja/session.configuration.php#ini.session.use-only-cookies)
[SESSION.USE_TRANS_SIDが効かない理由](http://blog.memolib.com/memo/40/)
Wave Analytics - Wave Labs Appの利用方法

これまで、Herokuアプリとして利用していた、Wave Labs Appですが、非管理のパッケージとして、Salesforceにインストールできるようになりました。下記に利用方法をまとめます。

## インストール
下記のURLから、環境に適したパッケージをSalesforce環境にインストールしてください。
・ 本番環境
　http://bit.ly/WaveLabsApp
・ サンドボックス環境
　http://bit.ly/WaveLabsAppCs

## インストール後手順
リモートサイトの設定を行います。パッケージインストール後に下記の画面が表示されたら、"Create Remote Site Settings"ボタンを押してください。
![image](https://qiita-image-store.s3.amazonaws.com/0/32377/ba42637f-fb5b-9020-ab1b-c911dfef1fb6.png)

## 利用方法
右上のアプリケーションメニューから、"Wave Labs"を選択すると、下記の画面が表示されます。
![image](https://qiita-image-store.s3.amazonaws.com/0/32377/a3b027d1-03df-1d23-5bca-becdb49d717b.png)

### Workflow Editor
従来はDataflowのjson定義を直接編集していましたが、ノードとして作成・編集、ドラッグアンドドロップできるUIが提供されています。((未確認)複数フローも定義できそうな...)
![image](https://qiita-image-store.s3.amazonaws.com/0/32377/1f2895ea-a641-1dcd-77f6-7b42ad0e5d14.png)

### XMD Editor
これは、従来のWave Labs Appと変わりません。データセットの型などを定義している拡張メタデータ定義をUIで変更できます。
![image](https://qiita-image-store.s3.amazonaws.com/0/32377/37682315-6cd4-aca9-b12f-0814d4acdc12.png)

### Wave Workbench
従来はJSON Workbenchと表示されていたものです。DashboardやLenseの定義を変更できます。
![image](https://qiita-image-store.s3.amazonaws.com/0/32377/0ed8728a-72b8-1c15-ca59-45805a2f1168.png)

### SAQL Editor
こちらも従来と同じ機能です。pigに似た記法でSAQLを記述し、Runすることで実際にデータを検索することができます。
![image](https://qiita-image-store.s3.amazonaws.com/0/32377/9ad04aba-3c4d-129e-9982-5b6d7e80bf1a.png)

### Create Snapshots
Salesforce上のレポートや、定義したSOQL、ODataなどからのデータを、スナップショットデータとして、Waveのデータセットに格納する際に利用します。
Waveの標準UIでSalesforce上のデータからデータセットを作ると、スケジュールでフローが実行されると、データが全て現時点でのデータで上書きされます。つまり、商談が昨晩削除されていると、今朝Waveで見ると、同じくその商談がなくなっている、ということがあります。このスナップショットで保存しておけばヒストリカルに分析することも可能です。
![image](https://qiita-image-store.s3.amazonaws.com/0/32377/f21dde41-a398-2d21-ce07-6a629a7b1987.png)

### Dashboard Templates
[Github](https://github.com/jumpstartwave/DashboardTemplates)上に事前定義されたテンプレートを使って、新しいダッシュボードを作成することができます。
![image](https://qiita-image-store.s3.amazonaws.com/0/32377/3e54bb42-315f-1e49-284c-290a0e99c55c.png)


# まとめ
従来のHeroku URLで提供されていたものが、非管理パッケージとなって、新しい機能が追加されました。実際に、Wave Analyticsを使い込んで行くと、どうしても、このWave Labs Appで提供されている定義変更機能が必要になってきます。簡単にダッシュボードを作成できることが、Wave Analyticsの売りですが、データ分析・活用を進めるにあたり、このツールの使い方も理解していくことが必要です。
OSXのデフォルトフォントがなぜか変なものになった時

新しくMacbook Airが手元にやってきてくれました。
起動してみたら、なぜかフォントが変なフォントになっているではないか！

こんな感じです↓
![Screen Shot 2016-06-06 at 12.02.15 PM.png](https://qiita-image-store.s3.amazonaws.com/0/63543/c471339a-90ec-cbe0-581c-b74a7862d4d8.png)


こんなふざけたフォントではまともに作業できないので、直す方法を探したのですがなかなか見つからなかったのでqiitaにもメモとして残しておきます。


#ブラウザー
ブラウザーの場合はブラウザーの設定フォントと言語設定を確認する。
Chrome > Preference > advance setting > Language and input setting

エンコードも疑う。
Chrome > Preference > advance setting > Web content > Customise fonts > Encoding

#ターミナル
他のアプリケーションでもフォントが変な場合、
フォントキャッシュを削除
```$ sudo atsutil databases -remove```
Tessel2で環境センサモジュールで騒音レベルと照度をサクッと取得 #tessel


**Tessel2では初代Tesselで使えたモジュールが再利用できます(割と朗報)。**  
今回は手元にあったambient-attx4モジュールをTessel2から試してみます。

## Ambient-attx4モジュール

こんな感じのやつです。

![](http://i.gyazo.com/6042a787a89bd42f7b40e5ecd5ee48b0.png)

`getSoundLevel`や`getLightLevel`のメソッド名からわかるように、この環境センサモジュールで`騒音と照度`の値が取得できます。

* 購入は[こちら](https://www.antratek.nl/tessel-ambient-module)
* リポジトリはこちらです。https://github.com/tessel/ambient-attx4

[Web制作者にもチャレンジできるIoT入門～Tesselの基礎～](https://html5experts.jp/n0bisuke/13562/)の記事も参考にしてみましょう。

## 環境

* Node.js v6.1.0
* DMM.make Akibaのシールドルーム ([前回記事参照](http://qiita.com/n0bisuke/items/e716d4b4af113d8090f7))


## Tessel2から制御してみる

公式サイトにもあるように。

>環境センサー（ambient）モジュールをTesselのポートAに挿しこんでください。このとき、六角形のTesselロゴの面が裏側、電子部品が有る側を表側になるようにしてください。最後に、TesselとパソコンをUSBケーブルで接続してください。

![](https://i.gyazo.com/a8ad9602bfb9f124df524d7bc9a823bf.png)

こんな感じで差し込みます。

```bash
$ npm i ambient-attx4
```

これだけで準備完了です。

```index.js
'use strict'

const tessel = require('tessel');
const ambientlib = require('ambient-attx4');
const ambient = ambientlib.use(tessel.port['A']); //ポートBならBと記述

ambient.on('ready',()=> {
 // Get points of light and sound data.
  setInterval(()=> {
    ambient.getLightLevel((err, lightdata) => {
      if (err) throw err;
      ambient.getSoundLevel((err, sounddata) => {
        if (err) throw err;
        console.log("Light level:", lightdata.toFixed(8), " ", "Sound Level:", sounddata.toFixed(8));
      });
    });
  }, 500); // The readings will happen every .5 seconds
});

ambient.on('error',(err) => {
  console.log(err);
});

```

* 実行

```bash
$ t2 run index.js
```

![](https://i.gyazo.com/75028256d5cd1aa56a75ff3c56f00b70.gif)

こんな感じでサクッと騒音レベルと照度を取得できました。

## まとめ

tessel1と2でモジュール共有ができるのがよかったですね。
去年買ってたやつをそのまま使えそうです笑
Vimの細かいコマンドが覚えられないから綺麗なチートシート作ってみた

# きっかけ
昔からコマンドラインで編集出来るということでVimは使っていたしNeoBundleとかつかってカスタマイズもそこそこしてたんですが、コマンドを覚えるのは面倒だということでほぼほぼVimの操作はまったく知らないままでした。

Emacs vs Vimの話に関してもやれGedit派だとかAtom派だとかいって避けてきたのですがこれだけVimばっかり使っていてEmacs使ってないのにVimの機能の百分の一も使ってないのは真のVimmerに失礼だな…などと思うところもあり、先日から[知識0から始めるVim講座](http://qiita.com/JpnLavender/items/fabcc79b4ab0d52e1f6d)を見てちゃんとVimらしい使い方をするようになりました。


ですがよく使うコマンドはすぐ覚えられても特殊な状況下でしか使わないコマンドや、他でも代替できるけど便利なコマンドなどはどうしても覚えられず、その度にページを開いてスクロールして...とやるのは流石に面倒だと感じたのでせっかくだからチートシート作ろうとなったのがきっかけです。

# 目標
とりあえずいつでもすぐ見れるようデスクトップの画像になるようにと作り始めました。
さきほどの記事のコマンドの部分だけスクショしてそれをイラレでペタペタ...

ですが少し考えれば想像出来ると思いますがこれがまー見にくいしカッコ悪い。
でもエクセルに入力し直すのもな...となったのでせっかくだからビジュアル的にパッと分かってかっこいいものを目指そうということになりました。

# 結果
できたものは下の画像です(1280×800)
解説部分はグレースケールでつくって、最後に背景に少しパステルっぽい色を入れてみました。（配色はわりと適当です汗）
文章の部分が多くなってしまいましたが、それなりに目標に近づけたんではないかと思います。

![vim_チートシート.png](https://qiita-image-store.s3.amazonaws.com/0/10943/328d7a64-f9fa-cb72-2a66-c0299d3c4b5d.png)



# 使用例
僕の場合vimはiTerm2でスプリットして全画面表示で使っているのですぐに見れるようデスクトップの一個の背景をこの画像にして下のスクリーンショットのように使っています。

![スクリーンショット 2016-06-06 16.43.58.png](https://qiita-image-store.s3.amazonaws.com/0/10943/1f42af6b-02f2-1568-bcaa-bcd4ee64da26.png "スクリーンショット 2016-06-06 16.43.58.png")


いままでマウスあるしvimrcの設定で全選択やコピーなどを他のGUIエディタと同じにしてたりもしてかなり侮っていたところがありましたが、一回ちゃんと学べば作業効率が数段アップするというのは真実なのでぜひこの画像を活用してVimに入門してくれる人がいたらなと思います。

またこれで僕自身もちゃんと胸をはってVim教に入信出来るようになったと思うのでどんどんVimを活用していきたいです。（AtomもVimモード入れましたｗ）


またなにか間違っているだとかこれ足しといたほうがいいだとか(たとえば:wqや:q!みたいなものを入れていないのですが)あれば気軽にコメントしていただければ修正してあげなおすので是非よろしくお願いします。
[アルゴリズム問題付] &と&&、|と||の違い

# アルゴリズム問題
0, 1, &, |, ^からなるboolean expression(論理式)と、その式から導きたい答えが与えられたときに、その答えを導くような論理式への括弧のつけ方が何通りあるか答えよ。

例えば、

```
Expression: 1^0|0|1
Desired result: false(0)
Output: 2 ways: 1^((0|0)|1)または1^(0|(0|1))
```
*Cracking the coding interview, 問題9.11*

# ひっかかった
![image](https://qiita-image-store.s3.amazonaws.com/0/112938/06e1aa70-600b-1374-2605-b6a31bc0a16c.png)
(\*_*) { 0 || 1って1じゃないの？


![image](https://qiita-image-store.s3.amazonaws.com/0/112938/15d0f0db-f75f-d200-4938-ef6601dd398b.png)
(\*_*) { 0 && 1って0じゃないの？

# &&は演算子式であり、&はメソッドである
**演算子式**...if elseなどの構文と同じグループということ

```
確かにそう言われると、andで代替できることもしっくりくる！
```

**メソッド**...あるクラスに対して定義されている、つまりオブジェクトに対して使われる

```
確かに[ruby doc](http://ruby-doc.org/core-2.3.1/)で&&の定義がなくて&があったのはそういうことだったのか！(上記リンクにはClassとMethodの定義しかない)
```

つまり？
[Rubyリファレンスマニュアル](http://docs.ruby-lang.org/ja/1.9.3/doc/spec=2foperator.html)

**&&**
*左辺を評価し、結果が偽であった場合はその値(つまり nil か false) を返します。左辺の評価結果が真であった場合には 右辺を評価しその結果を返します。*

**||**
*左辺を評価し、結果が真であった場合にはその値を返します。 左辺の評価結果が偽であった場合には右辺を評価し その評価結果を返します。*

**つまり：**演算子なので、`if operator then 式 end`と同じ！つまり、&&、||の左右は**演算子**として扱われ、

(op1 && op2)の場合：「op1が真ならば、op2を返せ」
(op1 || op2)の場合：「op1が真だったらop1を返せ」

という意味になる。

***

ひっかかったコードおさらい

```
0&&1 -> 1
1&&0 -> 0
```

```
0||1 -> 0
1||0 -> 1
```

左辺について、両方とも、rubyでは0や1はオブジェクトとして評価されるので、真！
よって&&では、右辺の値が返り、
||では、左辺の値がそのまま返っていた！

***

&、| 単独だとビット演算をするメソッドなので、(00や11ではなく)0、1で計算すると論理式の結果と同じになります。

#解答
上記問題の解答in ruby
何か疑問・良い解答などあれば教えていただきたいです^^

```answer.rb
def check(exp, desired_result)
  if exp.length == 1
    if exp.to_i == desired_result
      return 1
    else
      return 0
    end
  end
  counter = 0
  0.step(exp.length - 3, 2) do |start_index|
    new_exp = exp.dup
    calculated = cal(new_exp, start_index)
    new_exp[start_index..start_index+2] = calculated.to_s
    counter += check(new_exp, desired_result)
  end
  return counter
end

def cal(exp, start_index)
  case exp[start_index+1]
  when '|'
    return exp[start_index].to_i | exp[start_index+2].to_i
  when '&'
    return exp[start_index].to_i & exp[start_index+2].to_i
  when '^'
    return exp[start_index].to_i ^ exp[start_index+2].to_i
  end
end

print "counter = ", check('1^0|0|1', 0), "\n"
```
【ASP.NET Web API】謎のOperationCanceledException

とあるコンテンツをリリースした直後に以下のようなエラーがちょいちょい発生していました。

```
System.OperationCanceledException: 操作は取り消されました。
   場所 System.Threading.CancellationToken.ThrowIfCancellationRequested()
   場所 System.Web.Http.Filters.ActionFilterAttribute.<CallOnActionExecutedAsync>d__5.MoveNext()
--- 直前に例外がスローされた場所からのスタック トレースの終わり ---
   場所 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   場所 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   場所 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   場所 System.Web.Http.Filters.ActionFilterAttribute.<ExecuteActionFilterAsyncCore>d__0.MoveNext()
--- 直前に例外がスローされた場所からのスタック トレースの終わり ---
   場所 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   場所 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   場所 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   場所 System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
   場所 System.Web.Http.Controllers.ActionFilterResult.<ExecuteAsync>d__2.MoveNext()
--- 直前に例外がスローされた場所からのスタック トレースの終わり ---
   場所 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   場所 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   場所 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   場所 System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
   場所 System.Web.Http.Controllers.ExceptionFilterResult.<ExecuteAsync>d__0.MoveNext()
```

スタックトレースにコンテンツ側のコード情報が出てなかったり、ネットで調べてもTaskベースの非同期処理がキャンセルされた時に発生するとは出てくるものの、そもそもそのコンテンツでは基本的に非同期処理を使っていなかったので、原因がよくわからない状態でした。

ただ、エラーが発生しているURLを見てみたら全部ASP.NET Web APIでの箇所しか出てなかったので、そこに絞って調べてみたら以下のページにたどり着きました。

http://stackoverflow.com/questions/22157596/asp-net-web-api-operationcanceledexception-when-browser-cancels-the-request

要はAjax処理がキャンセルされた時に発生する(ASP.NET Web APIのバグ？な)ようで、独自実装したExceptionFilterAttributeに以下の処理を追加したら出なくなるようになりました。

```csharp
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true)]
public class ApplicationErrorApiFilterAttribute : ExceptionFilterAttribute
{
    public override void OnException(HttpActionExecutedContext actionExecutedContext)
    {
        if (actionExecutedContext?.Exception == null)
            return;

        if (actionExecutedContext.Exception is OperationCanceledException)
        {
            // HttpCode:200を返して何事もなかったようにする
            actionExecutedContext.Response = actionExecutedContext.Request.CreateResponse();
            return;
        }

        actionExecutedContext.Response = new HttpResponseMessage(HttpStatusCode.InternalServerError);
    }
}
```

そのコンテンツの場合はクライアントサイドでAjax処理中に他のアクションも起こせるようになっていため、↑のような処理を記述して対応せざるをえませんでしたが、サービスやアプリケーションによってはAjax処理中は他のアクションをブロックするなどの対応が必要になります。

その辺はアプリケーションの非機能要件次第なので、各担当者に確認して適した対応を行う必要があります。