OmniAICreator/Qiita-1.07M huggingface dataset:
webpack.resolve.aliasを設定しているプロジェクトでの.flowconfig設定

## `webpack.resolve.alias`とは

こんな内容のファイルがあるとして

```js
import Foo from '../../components/foo';
```

ここから`../../`を取る去ることができます。

例えばこんな感じで設定しているとすると、上記は`path.join(__dirname, 'src/js/components/foo')`をファイルを読んでくれるようになります。

```js:webpack.config.js
//...
  resolve: {
    alias: {
      components: path.join(__dirname, 'src/js/components')
    }
  },
//...
```

つまり、このように書き換えることができます。

```js
import Foo from 'components/foo';
```

## `.flowconfig`でも同じように設定する

ただ、flowも使っているプロジェクトの場合、ただ単にこのようにしてしまうと、「は💢 `components/foo`なんてね～ぞ」と怒られます。

```js
/* @flow */
import Foo from 'components/foo'
```

WebpackとFlowは別物なのでしょうがないです。ごめんなさい。

### FlowにもAliasなPathを教える

`.flowconfig`の`[options]`テーブルの中で`module.name_mapper`
というのを設定してあげます。これは、左側の正規表現でマッチした部分を右で解決するようにお願いしてます。
例えば、上記のWebpackと同じようにするにはこう書けば良いです。

```toml:.flowconfig
#...
[options]
module.name_mapper='^components/\(.*\)$' -> '<PROJECT_ROOT>/src/js/components/\1'
#...
```

```js:こんな感じ.js
'components/foo'.replace(
  /^components\/(.*)$/,
  "<PROJECT_ROOT>/src/js/components/$1"
);
```

設定後、`flow`が通ればちゃんとできてますね。`\(`の辺りとかタイプミスし易いので注意すると良いと思います。
ちなみに、`<PROJECT_ROOT>`は`.flowconfig`の置かれてるディレクトリまでのPathが入ってます。
SmatraPDFとVisualStudioCodeでSyncTeXする


# SmatraPDF側の設定
SmatraPDFのオプションを開き、逆順検索コマンドラインの設定を以下に変更する。

```
"C:\Program Files (x86)\Microsoft VS Code\Code.exe" -g "%f":"%l"
```
`%f`がファイル名、`%l`が行数に置換される。

# VSCode側の設定
特になし
以下のライブラリを導入しておくと捗る

## LaTeX Language Support
https://marketplace.visualstudio.com/items?itemName=ms-vscode.latex
LaTexのシンタックスハイライトやショートカット（コメントアウト等）が追加される。
なんとマイクロソフトの純正（？）プラグインである。
【FileMaker】ゼロ詰め数値のゼロを取り除きたい

さて、計測機器などからcsvやexcel形式でデータをFileMakerにインポートすると、こんなことはないですか？

![getasnumber2.png](https://qiita-image-store.s3.amazonaws.com/0/60538/1558f699-264c-6c76-4f54-4ecfcffa43eb.png)
なんだこれ？
と思って、元のexcelをみてみると、

excelのデータ自体が固定長で文字列書式でした。
![getasnumber1.png](https://qiita-image-store.s3.amazonaws.com/0/60538/26481b31-674e-629b-af91-46d5711c7738.png)

この場合、ゼロいらないですよね？
余分ですよね？
取っちゃいたいですよね？

取りましょう。

至極簡単です。
![getasnumber3.png](https://qiita-image-store.s3.amazonaws.com/0/60538/b119a9cc-62f6-e4dc-a40c-0aa491498a8f.png)
フィールドにデータがセットされるタイミングで、GetAsNumberで、テキスト形式から数値形式に変換します。

他の言語から来た場合、左のゼロをなにかでマスクして、、、と考えがちですが、
なんの小細工も必要ありません。

GetAsNumber

のみです。

改めてデータをインポートしましょう。
インポートする際、計算式が機能するよう、インポートオプションのチェックをするのを忘れずに。
![getasnumber4.png](https://qiita-image-store.s3.amazonaws.com/0/60538/ebfabc25-a362-c0cc-2299-283d04f79465.png)

さて、どうでしょうか。
![getasnumber5.png](https://qiita-image-store.s3.amazonaws.com/0/60538/e380c28a-8da4-8a52-1fb6-c515d008152e.png)
よし！
ゼロがいません！


※この実装は、FileMaker Pro 15を使っていますが、FileMaker Pro 6以上であれば、同じく機能します。

では、FileMakerライフをお楽しみください。
Windows Subsystem for Linux メモ

# はじめに

Windows Subsystem for Linux のイメージが Windows Store からインストールできるようになり、わからないことが増えたのでメモ

# Misc
- 旧イメージは Legacy と言う
- Legacy のアンインストール方法

```
lxrun /uninstall /full
```

- インストールされているイメージの確認

```
wslconfig /l
```

- chsh でログインシェルを zsh へ変更できるようになった。
- 実行ファイルのパス

```
c:\Users\"user"\AppData\Local\Microsoft\WindowsApps\ubuntu.exe
```

- イメージの展開先

```
%LOCALAPPDATA%\Packages\CanocialGroupLimited.UbuntuonWindows_"何か"\LocalState\rootfs
```

# これから確認する
- ConEmu への統合
docker for mac環境下でgcr.ioにpushできない

いつものようにpushしようとすると、こんな感じのエラーメッセージが表示された

~~~shell
$ gcloud docker -- push gcr.io/GCP_PROJECT/image:latest

Error response from daemon: login attempt to https://appengine.gcr.io/v2/ failed with status: 404 Not Found
~~~

# 対処方法

Docker for Macの設定 

### チェック外す

![image.png](https://qiita-image-store.s3.amazonaws.com/0/24105/5e7037c6-1356-9dcb-007a-99d707a5b103.png)
Docker compose + CentOS7でFailed to get D-Bus connection: Operation not permittedが出た場合の対処法

CentOS7のコンテナ上にdocker execで入ってsystemctlを打ったらエラーになって焦った方の為に。

# 対処法

dokcer-compose.ymlに　`privileged:true` を追加するだけでおｋです。

```:docker-compose.yml
version: '2'
services:
  web:
    build: ./web
    ports:
      - "80:80"
    privileged: true
```

ローカル開発の為だけにdocker-compose使っているならおまじない的に `privileged:true` をつけても良いのでは、と個人的には思っています。
Rails kaminariを使用したページネーションにBootstrapデザインを適用させる

# 前提環境
- RoRプロジェクト
- プロジェクトにBootstrapの環境が整っている
- プロジェクトにkaminariでページネーションが生成できる環境が整っている


# kaminariを用いたページネーションのソースはとてもシンプル
```rb
<%= paginate @pagination %>
```

このどこにBootstrapを適用させる余地があるんだ...と頭を2秒ほど抱えた。

# kaminariにBootstrapを適用させる

## Bootstrap用のViewテンプレートをジェネレートする

```sh
rails g kaminari:views bootstrap3
Running via Spring preloader in process 68165
      downloading app/views/kaminari/_first_page.html.erb from kaminari_themes...
      create  app/views/kaminari/_first_page.html.erb
      downloading app/views/kaminari/_gap.html.erb from kaminari_themes...
      create  app/views/kaminari/_gap.html.erb
      downloading app/views/kaminari/_last_page.html.erb from kaminari_themes...
      create  app/views/kaminari/_last_page.html.erb
      downloading app/views/kaminari/_next_page.html.erb from kaminari_themes...
      create  app/views/kaminari/_next_page.html.erb
      downloading app/views/kaminari/_page.html.erb from kaminari_themes...
      create  app/views/kaminari/_page.html.erb
      downloading app/views/kaminari/_paginator.html.erb from kaminari_themes...
      create  app/views/kaminari/_paginator.html.erb
      downloading app/views/kaminari/_prev_page.html.erb from kaminari_themes...
      create  app/views/kaminari/_prev_page.html.erb
```

テンプレートが作成される。

<img width="188" alt="スクリーンショット 2017-07-12 16.16.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/147005/4b5ba039-39a6-c414-365b-73a616e400cd.png">



## これだけ
<img width="289" alt="スクリーンショット 2017-07-12 16.18.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/147005/2d0952e3-d39a-2622-cc34-19577d06aa5a.png">


一瞬で適用できた。

# 懸念点
逆にこのページだけBootstrapのデザイン使いたくないとなった時の対処方法が今の所わからない...


#参考サイト
http://morizyun.github.io/blog/kaminari-gem-paginator-rails/
macOS カーソル強制バインディングのすすめ

[昨日の記事(macOSでディスプレイ1枚で作業する技術)](http://qiita.com/saboyutaka/items/d6cfd2a2b60f1a374d60)が思いの外バズってびっくりしてるさぼです。せっかくなのでもう一つ連投しようかなと。

普段、macOSのデフォルトのショートカットキーで`ctrl-n`, `ctrl-p`, `ctrl-f`, `ctrl-b`を使っている人向けのtipsです。

## デフォルトの移動系emacsキーバインド
`ctrl`と`n`, `p`, `f`, `b`で↓↑→←に移動できるのは使っている人ならわかると思います。これはターミナル上やemacsではうまく動きます。しかしそれ以外のアプリではショートカットキーの設定はバラバラで全然効かないものがあったり挙動が期待するものじゃなかったりします。どうにかならないかなーと思ってて解決策思いつきました。実験的にやってみて良さそうなので共有します。

⌘英かな、またはKarabiner-elementsのどちらかで設定します。

## 追記(2020/11/16)
macOS 11.0 Big Sur でも Karabiner-elements が動くことを確認できました。


## Karabiner-elements
https://gist.github.com/saboyutaka/459c258579729da9046bc4697c23ea81
設定のJSONおいてます

<img width="600" alt="cfef24ce-9993-a1ed-b780-6e63891155af.png" src="https://qiita-image-store.s3.amazonaws.com/0/28262/82a01a8c-d511-32bd-0319-ff98289da665.png">

## ⌘英かな

<img width="600" alt="⌘英かな 2.png" src="https://qiita-image-store.s3.amazonaws.com/0/28262/0231b7a9-ee60-ed35-6281-3c5c466767d1.png">

## 何をやっているか

`ctrl-p`などを強制的にやじるしのカーソルに置き換えています。キーボードにある物理カーソルキーです。これを行うことで、**ショートカットキーを完全にカーソルキーと同じ挙動**にします。

この設定をして数年使ってますが、他のアプリでショートカットが衝突してません。メジャーなショートカットキーなのであえて避けられているんだと思います。

キーバインドを変更するアプリは他にもあると思うので好みのやつでどうぞ。



## どこで便利なの？

### 絵文字パレット
<img width="435" alt="Characters.png" src="https://qiita-image-store.s3.amazonaws.com/0/28262/e536c8db-5307-1def-f684-5f344fc7f58c.png">


みなさんMac使っていたら command + ctrl + space で出てくる絵文字パレット無いと生きていけないと思うのですが、これショートカットキーで出してもカーソル移動するショートカットキーなくて困りません？カーソルバインディングしてると操作できるようになります！

## JetBrains系エディタ(RubyMine, PhpStorm, PyCharm, GoLandなど)
![59f802c93165ce5385e5e78f4e9f6174-2.gif](https://qiita-image-store.s3.amazonaws.com/0/28262/e308ce85-a4c9-12f1-258b-b04019465579.gif)



### Safari, Crome
* スクロールを`ctrl+n`, `ctrl+opt+n`, `ctrl+command+n`で行える。
<img width="600" alt="safari" src="https://i.gyazo.com/f8e13be05af371f545989c82e6d24e71.gif">
* ぐぐった後に1つ目の記事を見るときは`ctrl+n`するとカーソルが行くのですぐ開ける

### Finder
Finder内の遷移も可能
<img width="600" alt="finder" src="https://i.gyazo.com/f1dad05c00ec230090ebac3cc1f4b366.gif">

### 他にもいろいろ
* macの環境設定でもメニューバーでもどこでも使える
* JetBrains系のエディタでソースツリーをカーソル移動できる
* Slackで`ctrl+opt+n`で下のチャネルにいける
* Web上のアプリで
  * Trelloでカードのカーソル移動できる
  * Google検索でカーソル移動できる

などなど。使える場所は数えらえられないほどたくさんあります。あまり普段意識しなくても一度使ってしまうとこれなしでは生きていけない体になります...

## まとめ
実験的に初めて見ましたがいまとのころ不便に感じたところはないのでたぶん問題あまりないのかなと思います。アプリ側でもだいたいデフォルトのemacsのキーバインドを意識してここにショーカットを設定してるものは少ないと思います。
使うときはすごいシンプルでやじるしカーソルだと思って使えば良い。それだけです。ぜひおためしくださいー。
Oracle Databaseのネットワークセキュリティ設定

少し前まで、Oracle Advanced Securityの機能として提供されて、Enterprise Edition + ASOのライセンス料金が必要だった。
現在は、Standard Edition でも利用可能になっている。

[Oracle Databaseライセンス情報](https://docs.oracle.com/cd/E16338_01/license.112/b56284/options.htm#CIHFDJDG)

> ネットワーク暗号化(ネイティブ・ネットワークの暗号化およびSSL/TLS)と厳密認証サービス(Kerberos、PKIおよびRADIUS)は、Oracle Advanced Securityの一部ではなくなり、ライセンスが供与されているすべてのOracleデータベース・エディションに含まれるようになりました。

ここではJDBC Thin Driver での利用について記述する。

元ネタ：[Oracle Database JDBC開発者ガイド](https://docs.oracle.com/cd/E49329_01/java.121/b71308/clntsec.htm#i1022564)  

- JDBC Thinドライバによるデータ暗号化と整合性のサポート

## ネットワーク暗号化

デフォールトでは、サーバー側もクライアント側もACCEPTED。
これでネゴシエーションすると、暗号化OFF となり、平文通信となる。

暗号通信にするには、クライアント側だけでも REQUESTED にすれば、デフォールト設定のサーバは acceptして、暗号通信を使う。

暗号通信を request するか、暗号アルゴリズムに何を使うかは、Javaプロパティ・オブジェクトを介して対応するパラメータを設定し、データベース接続するときに引数で渡せば使用できる。

元ネタのサンプルコードでは、Properties のキー名について、`OracleConnection.CONNECTION_PROPERTY_THIN_NET_ENCRYPTION_LEVEL` と定数名しか記述がない。ここでは現在のdriverでのキー値を示す（おそらく今後も変更はない）。

```
oracle.net.encryption_client=REQUESTED
oracle.net.encryption_types_client=( DES40C )
```

> タイプの値は、丸カッコで囲み、リスト形式で指定できます。複数の値を指定した場合は、サーバーとクライアントの間のネゴシエーションにより、実際に使用される値が決定されます。

## 設定方法

3通り考えられる。

- JVM起動オプションの `-Doracle.net.encryption_client=REQUESTED`
- プログラム初期動作中に `System.setProperty("key", "value")`
- JDBCコネクション作成時 `java.sql.Driver.connect(String url, Properties info)`

コマンドラインツールなら、properties に記述があれば、初期動作中に設定するのがいいだろう。

Tomcatなら起動オプションにデフォールトを記述しておき、必要に応じて書き換えるのがいいだろう。

## 確認方法

サンプルコード

```java
java.sql.Connection con = driver.connect(url, info);
OracleConnection oraConn = (OracleConnection)con;
System.out.println("Encryption algorithm is: " + oraConn.getEncryptionAlgorithmName());
```

上記を参考にして、コネクション作成後にDEBUGまたはINFOログを出す。

## 設定値の決定

encryption_types_clientを指定せずに requested で、デフォールト設定の12cサーバとのコネクションを作成すると、getEncryptionAlgorithmName() は AES256である。

この状況ならtypeについてはデフォールトに任せてもいいが、設定ファイルに明に書いてある方が、何が行われているかわかりやすく、Oracleの都合でデフォールトが変更になったときにもキー名を調べ直す必要がなく対応しやすい。

```
oracle.net.encryption_client=REQUESTED
oracle.net.encryption_types_client=(AES256, AES192, AES128)
```

他にも選択可能なアルゴリズムはあるが、候補リストに入れる意味はない。

- RC4_128以下は安全とはいえない
 - 2015年2月、TLSのすべてのバージョンにおいてRC4の利用を禁止する RFC 7465 が公開された。
 - RC4-256 もあるがこれを残しても誰も嬉しくない。
- DESは安全とはいえない
- 3DESは遅かったDESの3回適用なので、安全かもしれないが遅かろう

## ネットワーク整合性

セキュアなメッセージ・ダイジェストを生成し、データの変更、パケットの削除、反射攻撃などの攻撃から保護する。

サーバ・クライアントのネゴシエーション、設定方法、確認方法ともネットワーク暗号化と同様である。

```
oracle.net.crypto_checksum_client=REQUESTED
oracle.net.crypto_checksum_types_client=(SHA256, SHA1, MD5)
```

```java
java.sql.Connection con = driver.connect(url, info);
OracleConnection oraConn = (OracleConnection)con;
System.out.println("Encryption algorithm is: " + oraConn.getEncryptionAlgorithmName()
  + ", Message Digest algorithm is: " + oraConn.getDataIntegrityAlgorithmName());
```

crypto_checksum_types_clientを指定せずに requested でコネクションを作成すると、getDataIntegrityAlgorithmName() は SH1である。

デフォールト設定の12cサーバでは、SHA256にならない。
SHA256を使うには、サーバ側の sqlnet.oraファイルを編集する必要がある。サービス(プロセス）の再起動までは必要ない。

例："C:\app\oracle\product\12.2.0\dbhome_1\network\admin\sqlnet.ora"に追記。

```
SQLNET.CRYPTO_CHECKSUM_TYPES_SERVER = (SHA256, SHA1, MD5)
```
Delveで対象プログラムの起動オプションを指定する

Go言語のデバッガとしてDelveを使っているのですが、デバッグ対象のプログラムの起動オプション(flagパッケージのやつ)がDelveのオプションとして認識されてうまくいかなかった

```bash
dlv debug -f='./file'
```

```
Error: unknown shorthand flag: 'f' in -f=./file
Usage:
.
.
.
```

なんてことはないですが`--`で解決しました

```bash
dlv debug -- -f='./file'
```

```
Type 'help' for list of commands.
(dlv)
```

そういやrakeでも同じようなことしたっけ

#### reference url
https://github.com/derekparker/delve/issues/715
Elixirでランダムな文字列を作る

# Elixirでランダムな文字列を作る
Elixirでランダムな文字列を作りたかったのでメモ。

## 方法1
```Elixir
defmodule RandomString do
    def randstr do
        "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
        |> String.codepoints
        |> Enum.take_random(30)
        |> Enum.join
    end
end
# iex(1)> RandomString.randstr
# "LUoSFEV4xhDnQ8ARBd9z5vuNrMfKeG"
```
使用する文字を詰め込んだ文字列からランダムに30文字を選択して文字列を生成する方法。

**しかし**、これでは同じ文字の重複がないペラペラな文字列になってしまうことに気づいたので修正。

```Elixir
defmodule RandomString do
    def randstr, do: _randstr([])

    defp _randstr(list) when length(list)>=30, do: Enum.join(list)

    defp _randstr(list) when length(list)<30 do
        char = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
                |> String.codepoints
                |> Enum.take_random(1)
                |> List.first
        _randstr([char|list])
    end
end
# iex(1)> RandomString.randstr
# "cM7EpLFWRvZTMeAufWneyU1NaGwsaf"
```
長い！わかりにくい！

## 方法2
stackoverflowではこんなやり方が書いていました。
[Phoenix framework Generate random string using the controller](https://stackoverflow.com/questions/41735442/phoenix-framework-generate-random-string-using-the-controller)

```Elixir
iex(1)> length = 32
32
iex(3)> :crypto.strong_rand_bytes(length) |> Base.encode64 |> binary_part(0, length)
"YiX2oINVqVWCCQZdmESBN44OxcErAFR4"
```

うーんこちらの方がスマートですね。
そういえばa要素ってなんでaなの？

リンク要素として、a要素とlink要素の二種類があります。
どちらも同じく、別の文書と紐づける目的ですが、なぜa要素はaなんでしょうか？

#a要素は出発点・到達点、link要素は関連しているもの
**a要素**は、**anchor（アンカー）**の頭文字から来ています。**出発点・到達点の意味**です。
a要素の部分を出発点として別の場所へジャンプさせたり、逆に到着店としてジャンプ先に指定したりします。
href要素は必須ではなく、hrefを指定しない場合はグローバル属性を指定します。

**link要素**は、こちらは略称ではありませんが、**関連文書**を紐づけるための要素です。
空要素のため、要素内容を指定できない代わりにhref属性とrel属性が必須となります。

| 要素 | 意味 | 必須属性 |
|:-:|:-:|:-:|
| a（anchor）  | 出発点・到達点  | href属性必須ではない  |
| link  | 関連・リンク  | href属性・rel属性必須  |


#おまけ：href属性とsrc属性の違いは？
どちらもURLを指定する属性ですが、何が違うのでしょうか？

**href属性**は、**Hypertext Reference（リファレンス）**の略です。
**src属性**は、**source（ソース、情報元）**の略です。

リンク先や、関連文書（CSSなど）はリファレンスに当たるのでhref属性
画像や挿入するものは表示する情報元を辿るのでsource属性
といったあたりでしょうか。

よくどっちがどっちかわからなくなるので由来を調べてみました。

#参考リンク
[hrefやaは何の略？各種HTMLタグで省略表記の基になっている語句一覧](https://kw-note.com/website/what-does-html-stand-for/)
PHPUnittestのheaderでのエラー

#問題
PHPのUnitテスト時にheader()を使った際に起こった問題


```
Cannot modify header information - headers already sent by 
(output started at /vagrant/vendors/phpunit/phpunit/PHPUnit/Util/Printer.php:172)
```

既にヘッダーが送信されているので送信できない、らしい。

#原因
1: <?phpの前に改行や空白、文字列などを入力している
2: ?>の後に改行や空白、文字列などを入力している
3: print,echoなどアウトプットするものをheader()実行前に実行している

#解決
1:最初にheaders_sent()やheaders_list()を追加、実行、結果を確認→既に送信されてることを確認
2:<?php ?>の周りに問題がないか確認
3:ob_start()を入力し、バッファ領域に出力するようにして回避


#参考
[1](https://ja.stackoverflow.com/questions/5453/php-%E3%81%AE-headers-already-sent-%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%AF%E3%81%A9%E3%81%86%E7%9B%B4%E3%81%97%E3%81%9F%E3%82%89%E3%81%84%E3%81%84%E3%81%A7%E3%81%99%E3%81%8B)
[2](http://php.net/manual/ja/function.headers-sent.php)
【シェル芸】最後のファイルを探して中身を表示する

最後のファイルを探してcatで表示するのに、スペースがファイル名に入っていた場合に苦戦したのでメモ。

追記 7/13 スペースとパイプに対応したものがこちら(コメントから反映)

```
find . -type f -name "*議事録*" -not -name "trashed*" | tail -1 | xargs -I% cat '%'
```

スペースのみ対応したものがこちら

```bash
cat "`find . -type f -name "*議事録*" -not -name "trashed*" | tail -1`"
```

出来ればパイプでつないで、最後にcat に渡したいが、tailを使ったところでどうしても、ヌル文字が切れてしまう。

以下が、スペースに対応できなかった失敗作

```bash
find . -type f -name "*議事録*" -not -name "trashed*" | tail -1 | xargs cat
```

通常は、find -print0 とxargs -0 のコンビで解決できるのだけれども、tailが中につくと引き継げなかった。
Laravel5.7: 単体テストの例

[以前の記事](https://qiita.com/sutara79/items/fa351a907ae5ba3a9802#%E3%83%98%E3%83%AB%E3%83%91%E3%83%BC%E9%96%A2%E6%95%B0%E3%82%92%E4%BD%9C%E3%82%8B)で`my_locale_url`というヘルパー関数を作りました。
この関数は、日本語から英語へ表示を切り替えるために`?lang=en`のようなパラメータを追加したURLを返します。
今回はこのヘルパー関数の単体テストを作ります。


# 親記事
[Laravel 5.7で基本的なCRUDを作る - Qiita](https://qiita.com/sutara79/items/ef30fcdfb7afcb2188ea)


# テストを生成する
:link: readouble.com: [テストの生成と実行](https://readouble.com/laravel/5.7/ja/testing.html#creating-and-running-tests)

```text:PowerShell
# テストファイルを生成
> php artisan make:test HelpersTest --unit

# デフォルトのテストが通ることを確認
> composer test -- --filter='HelpersTest'
```


# テストを記述する
```php:tests/Unit/HelpersTest.php
    /**
     * my_locale_url() のテスト
     *
     * @return void
     */
    public function testMyLocaleUrl()
    {
        // 指定したページへ移動 (実在しないURLでもOK)
        $this->get('https://foo.com:8080');

        // ヘルパー関数を実行し、加工されたURLを取得する
        $actual = my_locale_url('ja');

        // 期待と実際が同じであることを確かめる
        $this->assertEquals('https://foo.com:8080/?lang=ja', $actual);

        // テスト2回目
        $this->get('http://bar.info:9999/?lang=ja');
        $actual = my_locale_url('en');
        $this->assertEquals('http://bar.info:9999/?lang=en', $actual);

        // テスト3回目
        $this->get('https://baz.io/posts?lang=en&page=23');
        $actual = my_locale_url('ja');
        $this->assertEquals('https://baz.io/posts?lang=ja&page=23', $actual);
    }
```

その後、`composer test -- --filter=HelpersTest`を実行します。


# (補足) テスト内でページを移動する方法
## Requestファサードはモックできない
テスト対象のヘルパー関数では[Request::fullUrl](https://laravel.com/api/5.7/Illuminate/Http/Request.html#method_fullUrl)を使って現在のページのURLを取得しています。
テストではこの値を取得できないので、何らかの対処が必要です。
しかし、Requestファサードのモックは禁じられています。

> Note: Requestファサードをモックしてはいけません。代わりに、テスト実行時はgetやpostのようなHTTPヘルパメソッドへ、望む入力を引数として渡してください。

:link: readouble.com: [ファサード (モック)](https://readouble.com/laravel/5.7/ja/mocking.html#mocking-facades)

無理やり`Request::shouldReceive('fullUrl')`と記述してテストを実行すると、下記のように警告されます。

```
BadMethodCallException: Method shouldReceive does not exist.
```

## HTTPヘルパメソッドとは?
公式ドキュメントに従って「HTTPヘルパメソッド」を使うしかありません。
この「HTTPヘルパメソッド」とは、`TestCase`クラスのメソッドのことのようです。
:link: Laravel API: [TestCase](https://laravel.com/api/5.7/Illuminate/Foundation/Testing/TestCase.html)

`TestCase`クラスは全てのテストに継承されているので、テストの中で`$this->get('/posts/23')`のように記述することでページを移動できます。
公式ドキュメントでも下記のように説明しています。

> getメソッドはアプリケーションに対して、GETリクエストを作成します。

:link: readouble.com: [HTTPテスト](https://readouble.com/laravel/5.7/ja/http-tests.html)

`get`だけでなく、上のAPIリファレンスにもあるとおり、`post`, `put`, `delete`などあらゆるリクエストを作成できるようです。


## (余談) visitメソッドはLaravel5.3まで
`get`メソッドを使えばいいと知らずにページを移動する方法を探していた時、[visitメソッド](https://laravel.com/api/5.3/Illuminate/Foundation/Testing/TestCase.html#method_visit)を使っている例を見つけました。
ただ、これはLaravel5.4では廃止されたようです。
代わりに、通常のページ移動では`get`を、ブラウザでのページ移動ではブラウザテストの`Laravel Dusk`を使います。
また、5.3までの`visit`メソッドを使いたい場合はComposerで`laravel/browser-kit-testing`を追加します。
:link: Stack Overflow: [laravel - acceptance test method visit undefinied](https://stackoverflow.com/questions/42645066/acceptance-test-method-visit-undefinied)
vimの自動補完プラグインYMC (YouCompleteMe)のポップアップメニューの色を変える方法🏁

#　結果
<img width="649" alt="Screen Shot 2017-07-11 at 9.00.04 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/78600/643b0f1c-b262-8038-7d17-0524b356585f.png">

この用にvimで大人気のプラグインYouCompleteme(以下YCM)ポップアップ部分の色を変えるやり方。

YCMはIDEのように入力に合わせて自動で補完候補を出してくれるvim用プラグインです。知らなかった方は今すぐ使ってみましょう。

[https://github.com/Valloric/YouCompleteMe](https://github.com/Valloric/YouCompleteMe)

# 動機
[vim-quantum](https://github.com/tyrannicaltoucan/vim-quantum)というMaterial Designなスキーマを入れているのですが、初期状態だとYCMのポップアップが読みずらい😥
<img width="904" alt="Screen Shot 2017-07-11 at 9.55.39 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/78600/8da4b317-1fdf-e4c8-4772-ebe80ea27997.png">
なので変える方法はないかなーって思ったところあったので投稿することにしました。


# やり方

1. vimでは使える色が限られているようなのでどの色が使えるのか把握する必要があります。

```:runtime syntax/colortest.vim```をvimのコマンドにコピペして実行してください。こんな結果が出るはずです。
<img width="909" alt="Screen Shot 2017-07-11 at 8.56.52 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/78600/012156c1-4722-cfb4-214f-a5a782f298d3.png">
ここに表示されているのがvimで使える色のリストです。gvim(macvim)などではヘックスも使えるようです。

[参考: vimdoc](http://vimdoc.sourceforge.net/htmldoc/syntax.html#colortest.vim)


2.　```~/.vimrc```でPmenuの設定をします。

.vimrcに次のようにコピペしてください。以下のコードでは選択されていない候補の文字を白、背景を黒。そして、選択されている候補の文字を白、背景をグレーに変えています。


```vim:.vimrc
highlight Pmenu ctermfg=white ctermbg=black
highlight PmenuSel ctermfg=white ctermbg=gray
```

Pmenu: 選択されていない候補の設定
PmenuSel:　選択されている候補の設定
ctermfg:　文字の色の設定
ctermbg:　背景色の設定

ちなみの自分の.vimrcのスニペットです。

```vim:.vimrc
" Change popup menu color for non selected items
highlight Pmenu ctermfg=lightgrey ctermbg=black 
" Change popup menu color for selected item
highlight PmenuSel ctermfg=white ctermbg=gray
```


```highlight PmenuSel ctermfg=white ctermbg=gray　guifg=#000000 guibg=#ffffff```
こんな風にしてgvimの設定もできるらしいのですが自分はいじってません。。。

詳細は```:h Pmenu```コマンドをvimで実行してください。
またはStackOverFlowをどうぞ。
https://stackoverflow.com/questions/29628586/change-color-settings-in-you-complete-me


3.```:w```でセーブ、```:source %```で.vimrcのリロードを行ってください。

成功していたらこんな風に素晴らしいYouCompleteMeとvimによる素晴らしい開発環境が待ってますよ！vim楽しい！😆

<img width="1280" alt="Screen Shot 2017-07-11 at 9.24.23 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/78600/82147ea0-0195-db40-7a34-7a1794671524.png">

## 私の育成中のドットファイルたちをみたいっていう物好きな方はこちらにどうぞ

https://github.com/YukiKuroshima/dotfiles

🎉🎉🎉 Happy Coding with *vim*! 🎉🎉🎉



# 参考にしたサイト
* https://stackoverflow.com/questions/29628586/change-color-settings-in-you-complete-me
* https://github.com/Valloric/YouCompleteMe/issues/70
NCMB PHP SDKの使い方:データストア

NCMB PHP SDKでデータストアを扱う方法を解説します。

## データストアへの保存

```php
use Ncmb\GeoPoint;
use Ncmb\Object;

$className = 'example';
$obj = new Object($className);
$obj->serialId = 1; // 整数
$obj->name = 'Example Object';  // 文字列
$obj->timestamp = new DateTime();  // 時間
$obj->position = new GeoPoint(35.695985, 139.689318); // 緯度経度
$obj->isValid = true // 真偽値
$obj->save();
```

データストアに保存するには、\Ncmb\Object クラスのインスタンスを作成し、そのプロパティに保存する値をセットした後に save() メソッドを呼び出します。

値のセットはプロパティの代わりに set() メソッドを呼ぶことでも可能です。

```php
$obj->set('someKey', 'some variable');
```

## objectId を指定したデータストアの読み込み

```php
use Ncmb\Object;

$className = 'example';
$objectId = '3Dw7EnByRYvtZ3rh';
$obj = new Object($className, $objectId);
$obj->fetch(); // 読み込み実行

echo $obj->name;
```

データストアから値を読み込むには、objectId がすでに分かっている場合にはそれを指定して \Ncmb\Object クラスのインスタンスを作成し、fetch() メソッドを呼びだすのが簡単です。

## Query を使ったデータストアの検索

objectId が分からないデータの読み込みや、特定条件にマッチしたデータを取得したい場合は、\Ncmb\Query クラスを使用します。

```php
use Ncmb\Query;

$className = 'example';
$query = new Query($className);
$query->equalTo('serialId', 1);
$obj = $query->first();
echo $obj->name;
```

### Query オブジェクトの生成

検索したいデータストアのクラス名を渡して \Ncmb\Query クラスのインスタンスを作成します

```php
$query = new Query($className);
```

### 検索条件の指定

\Ncmb\Query オブジェクトに対して検索条件を指定するメソッドを追加します。

```php
$query->equalTo('serialId', 1);
```

検索条件を指定するメソッドには以下のものがあります。

* equalTo : 値が等しい
* notEqualTo: 値が等しくない
* lessThan: 指定した値より小さい ($lt)
* greaterThan: 指定した値より大きい ($gt)
* lessThanOrEqual: 指定した値以下 ($lte)
* greaterThanOrEqual: 指定した値以上 ($gte)
* containedIn: 値が含まれる ($in)
* notContainedIn: 値が含まれない ($nin)
* exists: 値が存在する ($exists)
* doesNotExists: 値が存在しない
* regex: 正規表現にマッチ ($regex)
* inArray: 配列に含まれる ($inArray)
* notInArray: 配列に含まれない ($ninArray)
* containsAll: すべての値が含まれる ($all)
* matchesQuery: サブクエリに合致するデータをポインタとして持っている ($inQuery)
* relatedTo: オブジェクトIDが指定された親のリレーションにひもづく子 ($relatedTo)

### 検索の実行と結果の取得

find メソッドを呼び出すと、検索結果が返ります。検索に何もマッチしない場合は空配列になります。

```php
$results = $query->find();
```

先頭の一つだけ欲しい場合は first メソッドを使います。

```php
$result = $query->first()
```
WordPress Instant ArticlesプラグインでのGoogle Mapの出力方法

WordPressのInstant Articlesプラグインを使って、FBインスタント記事を出力して申請しましたが、Google Mapを以下のようなタグで出力している記事があると審査で記事内容が異なるエラーで審査が下りなかった。

```
<div class="gmap">
  <iframe src="https://www.google.com/maps/embed?pb=XXXXXXXXXXXX" width="600" height="450" frameborder="0" style="border:0" allowfullscreen=""></iframe>
</div>
```
*※ pbのパラメータはダミーです*

色々調べたが、具体的な解決方法が見つからず、YouTubeの動画出力の方法を参考に以下の手順で、出力されることが出来たので、メモとして残します。

WordPress管理画面の「Instant Articles」メニューから「Publishing Settings」にある「Custom transformer rules」で、「Enable custom transformer rules」にチェックを入れ以下のルールを追加しました。

```
{
  "rules": [
    {
      "class": "InteractiveRule",
      "selector": "//div[iframe]",
      "properties": {
        "interactive.url": {
          "type": "string",
          "selector": "iframe",
          "attribute": "src"
        },
        "interactive.height": {
          "type": "int",
          "selector": "iframe",
          "attribute": "height"
        },
        "interactive.width": {
          "type": "int",
          "selector": "iframe",
          "attribute": "width"
        },
        "interactive.iframe": {
          "type": "children",
          "selector": "iframe"
        }
      }
    }
  ]
}
```

*※ 上記の「interactive.width」は、[変換ツールのルール](https://developers.facebook.com/docs/instant-articles/sdk/transformer-rules)では「column-width」とあったが、うまく行かなかったので、「interactive.width」にしたところ想定通りに出力されました*

変換出力されたものは以下のようになりました。

```
<figure class="op-interactive">
  <iframe src="https://www.google.com/maps/embed?pb=XXXXXXXXXXXXXXX" class="no-margin" width="600" height="450"></iframe>
</figure>
```

*※ 本来、地図は以下のURLにある<figure>要素にop-mapクラスにしたものを出力した方がいいみたいです*
https://developers.facebook.com/docs/instant-articles/reference/map
ネットワーク系コマンドチートシート（macOS）


- 特記なき場合はすべて macOS Sierra を想定しています
- Linux版は[こちら](https://qiita.com/miminashi/items/c75351dcd957021c01fc)

# ネットワークアダプタのリンク状態を調べたい

`ethtool`を使う？


# IPアドレスがどこの組織に所属するか調べる

```shell-session
$ whois -h whois.nic.ad.jp 2408:210:a524:3c00:1048:5dd6:xxxx:xxxx | nkf
```

# ネットワークのスループットを実測する

`iperf`を使う。

http://qiita.com/takish/items/bff7a1df712d475432df

# 経路の一覧を表示する

```shell-session
$ netstat -nr   # -r 経路を表示する  -n 名前を問い合わせしない
```

**IPv4のみ**

```shell-session
$ netstat -nr -f inet
```

**IPv6のみ**

```shell-session
$ netstat -nr -f inet6
```


# プロセスが使用中のポートの一覧を表示する

```
lsof -i
```

- lsofコマンドってobsolateなの？fuserコマンドしかないシステムもある

# LISTENしているポートの一覧を表示する

```sh
sudo lsof -i -P -n | grep LISTEN
```

# DHCPリクエストが送られているか確認する

```sh
tcpdump -i eth0 -n port 67 and port 68
```


# 自分のいるネットワークのIPアドレスなどを調べる

```sh
curl http://ifconfig.co/json | jq .
```
Github | 特定のコミットハッシュが含まれるプルリクを検索する

PullRequestの検索フィールドに **コミットハッシュ** を打つだけでOK。
全然知らなかった。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/be24d8b3-f42d-fcef-e299-72a5151ec94a.png)



`git blame` とかと組み合わせると幸せになれそう。

# 参考

- [Searching issues - User Documentation](https://help.github.com/articles/searching-issues/#search-by-the-commit-shas-within-a-pull-request)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Leaf Classificationで良精度を出すまで＿2日目

tensorflowのtutorialをやっておりまして、やっと理解しかけたので今回はtensorflowを使ってLeafClassificationをしようと思います。

ちなみに、前回英語論文でなんとなく理解した**192個の特徴量は使わず990枚の画像の99クラス分類問題として**扱っています。

前処理には**OpenCV**を使用しました。

##画像前処理
###まずは読み込み

```py3:読み込み.py
import cv2
import matplotlib.pyplot as plt

images = []
for i in range(1,1585):
    image = cv2.imread("images/%d.jpg"%i)
    grayed = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    images.append(grayed)
```

まずは同フォルダ内にある「image」フォルダからそれぞれの画像についてグレースケール化を行いつつ読み込み、imagesというリストの中に格納していきます。

次に、前回の記事の前処理を試していきます。
imagesの中の一つ目は元々ほぼ正方形なので、ここではimages[1]について見ていきます。ちなみにimages[1]はこれ。

<img width="532" alt="スクリーンショット 2017-07-11 8.17.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/190157/a99b8786-8f55-f603-ac93-66f6eb49744a.png">

横に細長い形であることがわかります。

###一つ目。(100,100)に比率はあまり考えず直す方法です。

```py3:前処理１.py
plt.imshow(cv2.resize(images[1], (100, 100)), "gray")
plt.show()
```

![new_image.jpg](https://qiita-image-store.s3.amazonaws.com/0/190157/0cbddac0-e5e6-443f-2ad3-cdc0b959551a.jpeg)

やはり、**細長いという特徴が消えてしまっている**ので、よくなさそうです。

###では２つ目。比率を保ちながら最終的に正方形にします。

```py3:前処理２.py
end_size = 100 #最終的な縦横サイズ
max_ = np.maximum(images[1].shape[0], images[1].shape[1]) #縦横のうち、大きな方をmax_という変数に代入。
scale = end_size / max_
height, width = images[1].shape
size = (int(width*scale), int(height*scale)) #scaleを保ったまま大きな方を100に合わせる。

rescale_image = cv2.resize(images[1], size, interpolation=cv2.INTER_CUBIC) #リサイズを行う。

height, width = rescale_image.shape #その後、もう一度とりなおします。

#幅の方が大きければ、[(幅ー高さ)/2,幅]の０行列を作り、上下に足す処理です。
#こうすることで画像が真ん中に保たれます。
if width > height:
    z_pad = np.zeros([int((width-height)/2), width], dtype=np.uint8)
    end_image = np.vstack((z_pad, rescale_image, z_pad))
else:
    z_pad = np.zeros([height, int((height - width)/2)], dtype=np.uint8)
    end_image = np.hstack((z_pad, rescale_image, z_pad))

#幅ー高さの値が奇数の場合、99となってしまうので100にリサイズしています。
end_image = cv2.resize(end_image, (100, 100))
    
print(end_image.shape)
plt.imshow(end_image, "gray")
```

<img width="368" alt="スクリーンショット 2017-07-11 8.24.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/190157/6b57993c-4d3e-470f-2174-4e39686926ad.png">

どうやら成功しました。

ちなみに、一部を変えて、

```py3:前処理2_2.py
if width > height:
    z_pad = np.zeros([width-height, width], dtype=np.uint8)
    attempt_image = np.vstack((z_pad, rescale_image))
    M = np.float32([[1,0,0],[0,1,-(width-height)/2]])
    end_image = cv2.warpAffine(attempt_image, M,(end_size,end_size))
else:
    z_pad = np.zeros([height, height - width], dtype=np.uint8)
    attempt_image = np.hstack((z_pad, rescale_image))
    M = np.float32([[1,0,-(height-width)/2],[0,1,0]])
    end_image = cv2.warpAffine(attempt_image, M,(end_size,end_size))
```

とすることでも同じ画像が得られます。
こちらでは先に

![new_image2.jpg](https://qiita-image-store.s3.amazonaws.com/0/190157/eeed9ee1-0c29-d558-9962-5740cfcdbb10.jpeg)
こういう画像(attempt_image)を作ってから、並行移動することで真ん中に引き上げています。

これを全てに適用して、前処理は終わりです。

他にも、100x100のnumpyのarrayを０で埋めたものを作ってからそこに$100×K(k≤100)$にスケールを変えた画像をおくという方法でもできるなーとか思います。

実装編はまた長くなりそうなので一回分けることにします。
できるだけプログラムっぽくないプログラミングへの挑戦（Objective-C編）

- 「いつからポエムだと錯覚していた？」 → 残念！実はソースコードでした。
- 「こいつ・・・（ビルドしたら）動くぞ！」

これを体現するのがこの試みの究極目標である。
今回、[Swift編](http://qiita.com/rotors123/items/113407168a362d7e321d)に続いてObjective-C編に突入する訳だが、先に結果から述べておきたい。

- 冒頭のimport文以外では「英語を一切使わない」事に成功。
- 但し、「おまじない（.pch）」という名の古からの禁呪を全面的に利用。（Bridging-Headerを使えば理論的にはSwiftでも応用可）
- 残念ながら「絵文字」は文字表示以外の実装部分では利用できなかった。（Obj-Cが悪いのでは無い。Swiftが凄すぎるのだ）

筆者の力量の問題かと思うが、率直な感想としては「**なんだか わけがわからない**」といったところだ。
引き続き、各界識者からのご意見を求めたい。

### 実装例（抜粋）

#### 画面の制御.m

![line35まで.png](https://qiita-image-store.s3.amazonaws.com/0/187895/28ae8f06-5cae-ff28-a669-6d5d9df5d51a.png)
![line36から.png](https://qiita-image-store.s3.amazonaws.com/0/187895/ff2efc96-9aba-1edb-fb0d-dfb468c002ec.png)

#### おまじない.pch

```C:おまじない.pch
//
//  おまじない.pch
//  できるだけプログラムっぽくないプログラミング
//
//  ロータース123によって2017年7月某日に作られました。
//  著作権: 2017年 ロータース123
//

#ifndef _______pch
#define _______pch

#define 親クラスの super
#define 自クラスの self
#define 何も戻さない関数 void
#define 画面が読み込まれた後に viewDidLoad

#define 編集可能 editable
#define 選択可能 selectable
#define いいえ NO
#define テキスト text

#define 実装ここから  @implementation
#define インターフェイスここから @interface
#define ここまで @end

#define 特性 @property
#define 同時に高速に動く nonatomic
#define 強い参照 strong

#define 文字用の部品の雛形 UITextView

#define ポインタを使って *

#define レイアウトの制約 NSLayoutConstraint
#define メモリを確保 alloc
#define フレームを指定して初期化 initWithFrame

#define テキストの整列 textAlignment
#define テキスト中央揃え NSTextAlignmentCenter

#define 画面の部品 view
#define 境界範囲 bounds

#define 辞書 NSDictionary

#define 画面部品を追加 addSubview
#define 従来の自動幅調整機能の利用 setTranslatesAutoresizingMaskIntoConstraints
#define 制約を有効化 activateConstraints
#define いわゆるアスキーアート的な記述で制約を constraintsWithVisualFormat

#define 部品の名前 @"textView"

#define オプション群 options
#define 幅とかの指標 metrics
#define 部品群 views
#define 空っぽ nil

#define 文字列型 NSString
#define 書式を指定した文字列 stringWithFormat

#define 横の指定 @"H:"
#define 縦の指定 @"V:"

#define 繰り返すよ for
#define この中から in

#define 改行文字 @"\n"

#endif
```


### 実行結果

![縦.png](https://qiita-image-store.s3.amazonaws.com/0/187895/b4b9634e-cd8f-8d32-70ed-851850950b1d.png)

![横.png](https://qiita-image-store.s3.amazonaws.com/0/187895/7b253794-af3e-2098-b89d-028c58f4a411.png)

### バージョン情報

Swift：3.1
Xcode：8.３.3

### ソースコード

https://github.com/rotors123/ProgrammingNoProgrammingObjC.git
※githubでプロジェクト／リポジトリ名称を日本語にしたらうまくいかなかったので英語で登録。
Nvidia Shield TVで似非JetsonTX1をつくる

# Nvidia Shield TV とは
Nvidiaが提供している家庭用AndroidTV端末で、GPUとしてJetsonTX1と同じTegraX1を搭載しています。
約２００ドルでAmazon.comで購入できます。送料は２０ドルかからなかったと思います。
メモリが3GBとやや少ないのが残念ですが、ディープラーニングや暗号通貨マイニングなど、話題の技術を手軽に遊べます。気が向いたらこのあたりも記事にします。

これまでに発売しているのは下記モデルがあるようです：

* 2015 Pro w/HDD
* 2015 16GB
* 2017 Pro w/HDD
* 2017 16GB

2017モデルには、2015モデルにあったmicroUSBポート・sdカードスロット・電源ボタンがありません。ネット上には2015モデルの情報が多く、適宜読み替える必要があります。

# この記事について
2017 16GBモデルにUbuntu16.04とCUDA開発環境をセットアップする際の情報を記載します。
思い出しながら書いているので、間違いがあるかもしれません。やりかたによっては最悪デバイスが使えなくなる可能性もあります。
**実施は自己責任でお願いします。**

# 手順概要

## モノを用意する

### 使うモノ
* USB Aオス-Aオスケーブル
* USBメモリ（8GB以上？）
* USBハブ
* HDMIケーブル,HDMIモニタ
* LANケーブル
* Ubuntu等がインストールされたホストPC

### あれば便利なモノ
* USBマウス・キーボード

ACアダプタは日本のコンセントに対応していましたので、変換器等は不要です。

##セットアップ作業
概要のみ記載します。詳細は参考記事などで調べてください。

1. ホストPCのセットアップ
    1. fastbootをインストールする
1. USBメモリのセットアップ
    1. USBメモリをフォーマットする
    2. Linux for Tegra (L4T)をダウンロード（[R24.2.1](https://developer.nvidia.com/embedded/linux-tegra-r2421)を使います）
    3. L４Tを展開して書き込む
1. 配線する
    1. ホストPCとshieldをUSBケーブルでつなぐ（HDMIと離れた方の端子）     
    2. shieldのもう一方の端子にUSBハブをつなぐ
    3. USBハブに付属コントローラとUSBメモリをつなぐ
    4. HDMIケーブルとLANケーブルをつなぐ
1. ブートイメージを書き込む
    1. ブートイメージを入手する
    2. 付属コントローラのAボタンとBボタンを押しながら電源プラグをつなぐ
    3. ブートローダーのunlock
    4. ブートイメージを書き込む（[こちら][1]のsda1.imgを使います）
1. 動作チェック・初期設定
    1. 再起動する
    2. Ubuntuの一般的なセットアップ
    3. Wifiドライバ等のセットアップ
1. CUDA開発環境などのインストール（ここからはJetsonのセットアップと同様です）
    1. ホストPCでJetpack for L4Tをダウンロードして実行

##メモ
* androidをセットアップしてからadb経由でfastbootモードに入る手順をよく見ますが、androidのセットアップが案外面倒です。この記事ではコントローラを使う方法を取っています。
* shieldでUbuntu起動後、元Androidのファイルにアクセスするとwifi_mac.txtというファイルがあり、MACアドレスが記載されています。MACアドレス等を事前にメモしておく必要はないと思われます。
* 参考記事でmmcblk0p1となっている部分はUSBメモリを指す識別子で読み替えます（例：sdd1）
* Jetpackは選択したライブラリによっては時間がかかりますし消費容量も大きいです。必要なものを選べば速いです。
* 内臓eMMCへのインストールも可能らしいですが試してません。

##参考記事：
* [Build kernel from source and boot to Ubuntu using L4T (Linux for Tegra) rootfs][1]
* [Jetson TX1の代わりにSHIELD Android TVでTegra X1開発環境を構築する][2]
* [How to boot Ubuntu 16.04 on the Shield TV with X1 GPU drivers][3]

[1]: https://forum.xda-developers.com/shield-tv/general/build-kernel-source-boot-to-ubuntu-t3274632
[2]: http://musyoku.github.io/2016/08/12/Jetson-TX1%E3%81%AE%E4%BB%A3%E3%82%8F%E3%82%8A%E3%81%ABSHIELD-Android-TV%E3%81%A7Tegra-X1%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83%E3%82%92%E6%A7%8B%E7%AF%89%E3%81%99%E3%82%8B/
[3]: https://forums.dolphin-emu.org/Thread-how-to-boot-ubuntu-16-04-on-the-shield-tv-with-x1-gpu-drivers
DockerHubに自作イメージを公開する

## 概要
[DockerHub](https://hub.docker.com/)に、自作のイメージを公開する手順です。
まずは、DockerHubでアカウントを作成してください。アカウント作成手順は、ブラウザでポチポチするだけなので割愛します。


## login
アカウントが作成できたら、以下のコマンドでログインします。

```
$ docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: username
Password:
Login Succeeded
```

## イメージを作成
Dockerfileを作成して、イメージを作成します。

```
$ docker build -t username/sample-image:latest .
```

## push
DockerHubにpushします。

```
$ docker push username/sample-image
```

以上で完了です。
DockerHubの自分のレポジトリで確認してください。

## 参考
- [オープンソース版Droneで、自作のDocker imageを使ってビルドを行う方法
](http://yosssi.hatenablog.com/entry/2014/02/10/030831)
【ネタ】Go言語 で Sleep Sort


## まえおき
最近 Golang を学習し始めた。
良い題材が浮かばなかったので、少し前に流行った Sleep Sort を実装してみた。

## やってみた

```go
package main

import (
	"fmt"
	"time"
)

func main() {

	array := []int{5, 3, 6, 3, 6, 3, 1, 4, 7}
	c := make(chan int)

	for _, v := range array {
		s := v
		go func() {
			time.Sleep(time.Duration(s) * time.Second)
			c <- s
		}()
	}

	for _ = range array {
		fmt.Printf("%d\n", <-c)
	}
}
```

正直、学習し始めなので良し悪しの判断がつかない．．．
詳しい方教えてください！

## 元ネタ

 [【ネタ】Swift で Sleep Sort](http://qiita.com/lovee/items/9701151633d61e7ed4e3)
 [【ネタ】JavaScriptでSleep Sort](http://qiita.com/takustaqu/items/412d6c36534b1145a024)
 [【ネタ】Java で Sleep Sort](http://qiita.com/krmtyshr/items/2d2904ea29dbc3ab4644)
 [【ネタ】PythonでSleep Sort](http://qiita.com/nnsnodnb/items/9e6dad912926c3d25844)
 [【ネタ】Pythonでスレッドセーフな Sleep Sort関数 (threading編)](http://qiita.com/shiracamus/items/76fa50ad8aa0c0de8c3c)
 [【ネタ】SmalltalkでスレッドセーフなSleepSort](http://qiita.com/sumim/items/e1fe59c46aabea82c31c)
 
## 参考にさせていただきました
 
 [golang チートシート](http://qiita.com/jca02266/items/56a4fb7b07b692a6bf34)
 [Goルーチンで並行化する方法: 6秒かかる処理を3秒にしよう](http://qiita.com/suin/items/82ecb6f63ff4104d4f5d)
 [Golang Goの並列処理を学ぶ(goroutine, channel)](http://qiita.com/TakaakiFuruse/items/241578174fd2f00aaa8a)
 [Goのforとgoroutineでやりがちなミスとたった一つの冴えたgo vetと](http://qiita.com/sudix/items/67d4cad08fe88dcb9a6d)
コンピューターずぶの素人がORACLE PGXを使ってみた①

##まず初めに
---

- 大学でコンピューターを使わない生物の勉強ばかりしてきたので完全に未経験
- 将来SEになりたいために自分の研究として利用しようと決意

なので**生暖かい目**で見てください・・・

##ORACLE PGXとは？　―データベース管理に用いられるグラフ分析エンジン
---

そもそもORACLE PGXとはなんなのか。もちろん生物分野（Network Biology）で使えるから使うわけだけど、、

　データベース管理という点で、SQLというクエリ言語が1970年代から発展してきた（最初にできたsystem Rに実装された言語であるSEQUEL (Structured English Query Language)からとった文字らしい？）。しかしこれはデータを表として扱っていることに長けているみたいです。
　しかし、生物はとてつもなく複雑な「ネットワーク」を持っていて、SQLで大量のデータを分析するのには限界があり（**例：ネットワークに向きがあったり！**）、バイオインフォマティクスのような学問が生まれてきたみたいです。自分の研究室では遺伝子やたんぱく質を「ノード」、そのつながりを「エッジ」として捉えて、グラフとしての解析が求められています。

てことで、そのさなかにたまたま機会がありORACLE PGXを知ることに・・・

OLACLE PGXは、**プロパティ・グラフ形式でデータを格納する**らしいのでその分SQLなんかよりも表現力が柔軟で直感的なクエリ言語（PGQLという言語でSQLライク）で検索可能だそう。その中で、Network Biologyにおいて重要な「つながり」を用いたアルゴリズムが使えるそう。

（どういうこと・・・？って最初はなりましたが（今も））

「使えるんじゃない？」ということで始めてみます！

もっと詳しく知りたい人は
- [Oracle Labs PGX: Parallel Graph AnalytiX Overview](http://www.oracle.com/technetwork/oracle-labs/parallel-graph-analytix/overview/index.html)

を見てどうぞ
WindowsでRuby2.4.1、Rails5.1の開発環境を作成する。

## はじめに

WindowsでRuby関連の開発環境を作成すると異常に苦労するので残しておく。
画面組み立てたり、ゆるく使いたい時限定。
本気でやるならVM環境を用意したほうが良い。

## 用意
pacmanの環境変数通すとかは各自適当に行ってください。

- [msys2](http://www.msys2.org/)
- [RubyInstaller2](https://github.com/oneclick/rubyinstaller2/releases)

## pacmanで必要なライブラリを入れる

```bash:
$ pacman -S base-devel
$ pacman -S mingw-w64-x86_64-toolchain
$ pacman -S mingw-w64-x86_64-sqlite3 mingw-w64-x86_64-libxslt
$ pacman -Syu
```

## グローバルで必要なgemを入れる。

```bash:
$ gem install bundler
```

## プロジェクトフォルダの作成

```bash:
$ mkdir sampleProject
$ cd sampleProject
```

## bundlerの設定

```bash:./sampleProject
$ bunlde init
$ bundler config --local force_ruby_platform true
$ bundle config  --local build.nokogiri --use-system-libraries　#ここでmsys2のライブラリを利用するように指定
```

## Gemfileを編集する

```ruby:./sampleProject/Gemfile
source 'https://rubygems.org'

git_source(:github) do |repo_name|
  repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include?("/")
  "https://github.com/#{repo_name}.git"
end

gem 'rails', '~> 5.1.0'
gem 'sqlite3'
gem 'tzinfo-data'
gem 'puma', '~> 3.7'
gem 'sass-rails', '~> 5.0'
gem 'uglifier', '>= 1.3.0'
gem 'therubyracer', platforms: :ruby
gem 'coffee-rails', '~> 4.2'
gem 'turbolinks', '~> 5'
gem 'jbuilder', '~> 2.5'
gem 'bcrypt', '~> 3.1.7'

group :development, :test do
  gem 'byebug'
  gem 'capybara', '~> 2.13.0'
  gem 'selenium-webdriver'
end

group :development do
  gem 'web-console', '>= 3.3.0'
end
```

## ローカルgemを用意して、rails newする

```bash:./sampleProject
$ bundle install --path=vendor/bundle
$ bundle exec rails new --skip-gemfile --skip-bundle ./
$ bundle exec rails s
```

あとはlocalhost:3000でアクセス可能。
エクセルアドインをバージョン管理する

#目的
* エクセルアドインを開発するいい感じの手順を見つける  
（つまり、Vimで編集して、バージョン管理する）

#背景
[Vimexcel](http://www.vector.co.jp/soft/winnt/business/se494158.html)[^vimexcel]を使い始めて、いくつか修正もしたりして、思った。

* Vimで編集したい
* Git管理したい

[vbac(vbaidiot/Ariawase) - GitHub](https://github.com/vbaidiot/Ariawase)という便利そうなものがある。

#参考
* [Ariawase v0.6.0 解説（vbac 編） - いげ太の日記](http://igeta-diary.blogspot.jp/2014/03/what-is-vbac.html)（作者さん自らの解説）
* [ExcelにはVBAがある！ - アスタミューゼ](http://lab.astamuse.co.jp/entry/2016/08/31/114500)
* [vbacでエクセルVBAのソースコードをGitバージョン管理する方法 - いつも隣にITのお仕事](https://tonari-it.com/vba-vbac-git/)
* [VBAのソースコードを保守し易くするためのツール vbac - ClockAhead 開発Blog](http://blog.clockahead.com/2012/11/vba-vbacwsf.html)

[^vimexcel]: エクセルをvim風に操作できる素晴らしいエクセルプラグイン。キーマッピングも変えられるし、機能追加もできる。（要ソース修正）

#作業手順
##開発環境を構築する
###vbacを入手する
[vbac(vbaidiot/Ariawase) - GitHub](https://github.com/vbaidiot/Ariawase)から。
###フォルダ構成を決める
vbacの基本構成をベースに、以下のようにした。

```
MyAddin/
    .gitignore

    vbac.wsf

    bin/ （吸出し用。Git管理外）
        *.xla （吸出し用。Git管理外）

    src/

    (template/) （シートにも意味がある場合、元ファイルを置く）（この例では作らない）
        (*.xla)
```

###フォルダ構成を作る
1. フォルダを作る

    ```bat
mkdir MyAddin
cd MyAddin
git init
mkdir bin src
```

1. ファイルをMyAddin/に置く
vbac.wsf
アドイン
（アドインへvbacからアクセスできるようにしておくのを忘れずに。）
（手順は参考URLを参照）（ファイルごとの設定ではないので、環境で一度やればOK）

1. .gitignoreを作る  

    ```gitignore
bin/
```

###マクロを吸い出す

1. vbacを実行し、マクロを吸い出す
    実行コマンド：`cscript //nologo vbac.wsf decombine`
    実行後のフォルダ構成：

    ```
    MyAddin/
        bin/
            エクセルアドイン（例：myaddin.xla）
        src/
            myaddin.xla/
                macro1.cls
                macro2.bas
```

1. とりあえずコミット
`git commit -a -m "AHAHA...! MyAddin was version controled!"`

##開発する
快適な編集体験（今回の目的の一つ）のために、Vimで編集する。

1. （リモートリポジトリがある場合）ローカルを最新化
`git pull`

1. マクロを編集する
    Vimで編集する(`vim macro2.bas`)

1. マクロをアドインに反映して動作確認する
`cscript //nologo vbac.wsf combine`

1. 修正が満足のいくものでなければ、再編集。

1. 動作確認をパスしたら変更をコミットする
`git commit -a -m "comment"`

###フォームが含まれる場合の注意点
フォームは、エクスポートすると「\*.frm」「\*.frx」という2つのファイルになる。
frmは、フォームのイベント処理コードなどを保持するテキストファイル。
frxは、フォームコントロールの位置などを保持する**バイナリファイル!!**
このバイナリは、エクスポートするたびに差分が出る。
インポート時に読み込まれるので、管理から外すわけにはいかない。
割り切ってすべてコミットしてしまうか、変更したときだけコミットするか。

##デプロイ
ここでいうデプロイとは、自環境のアドイン置き場のアドインを更新すること。
アドイン置き場には、いくつかあり、エクセル起動中の操作に違いがある。

###C:\Program Files\Microsoft Office\Office14\Library
ここに置くの推奨。("Office14"は、Excelのバージョンによって変わる)
####特性
* VBA Editorで編集できるが保存できない。（読み取り専用と怒られる）
* エクスプローラでファイル操作ができる。

####手順
1. MyAddin/bin/myaddin.xlaをアドイン置き場に置く（上書き）
1. アドインを読み直す（エクセルを開き直してもよい）
    1. [開発]-[アドイン]ダイアログでアドインのチェックを外してOK
    2. [開発]-[アドイン]ダイアログでアドインのチェックを入れてOK

#補足
##開発する（のVBA Editor版）
メリット：すぐにマクロを試せる
パラメータの微調整などtry-and-errorになることがわかりきっている場合やVimがない場合。

1. （リモートリポジトリがある場合）ローカルを最新化
`git pull`

1. ソースをマクロに反映する
`cscript //nologo vbac.wsf combine`

1. マクロを編集、動作確認する
エクセルを開いてAlt+F11

1. マクロを吸い出してコミット
`cscript //nologo vbac.wsf decombine`
`git commit -a -m "comment"`

##デプロイする（の別の場所）
###％USERPROFILE%\AppData\Roaming\Microsoft\AddIns
####特性
* VBA Editorで編集と保存ができる。
* エクスプローラでファイル操作（上書きコピー、削除など）ができない。（開いているので無理と怒られる）

####手順
1. エクセルを閉じる
1. MyAddin/bin/myaddin.xlaをアドイン置き場に置く
Oracle PaaSのコマンドラインツール(PSM CLI)の実行環境をDockerコンテナに作る

PSM CLIは、オラクルの提供するPaaSを操作するコマンドラインツールです。
PSM CLIについての詳細は、先達の記事がすでにありますので、そちらを参照ください。

- [Oracle Cloud の PaaS Service Manager CLI ツールを使う](http://chiroito.hatenablog.jp/entry/2017/03/24/184603)

PSM CLIを利用するには、Pythonをインストールするなどの事前準備が必要ですが、この作業を簡略化するために、DockerコンテナにPSM CLIを実行可能な環境を作るDockerfileを書いてみました。
dockerコマンドを実行できる環境があれば、Dockerコンテナを立ち上げることでPSM CLIを使えるようになります。また、コンテナイメージを削除すれば環境が綺麗サッパリなくなりますので、自分のPCを汚さずに済みます。

使い方
------

### 1. GitHubのリポジトリをcloneまたはダウンロード
リポジトリは[こちら](https://github.com/hhiroshell/opccli-utils)

### 2. Dockerコマンド実行の準備
"psmcli"フォルダにDockerfileが入っているので、dockerコマンドが使えるところに持ってきます。

### 3. イメージのビルド

    docker build -t psmcli:sample_id_domain --force-rm=true --rm=true ./ \
                 --build-arg user=sample_admin \
                 --build-arg password=sample_password \
                 --build-arg identitydomain=sample_id_domain \
                 --build-arg region=us \
                 --build-arg datacenter=psm.us.oraclecloud.com

--build-argの値は、自身のOracle Cloud環境に合わせて適宜変更してください。
regionは"us"または"emea"、datacenterは"psm.us.oraclecloud.com"または"psm.europe.oraclecloud.com"を指定します。

### 4. コンテナ起動

    docker run --rm=true -it psmcli:sample_id_domain /bin/bash

### 5. PSM CLI のコマンドを実行

    psm -v
    psm help


以上です。
CIがPASSしていない場合に、GitlabのMRをできなくする

忘れそうなので、残しておきます。

# 環境
- GitLab Community Edition 9.2.6 332a71d
- gitlab-ci-multi-runner 9.3.0
- Ubuntu precise (12.04.5 LTS) (runner host)

# 設定
プロジェクトページのSettings→Generalから、1行目のチェックボックスをONにする。

![settings.png](https://qiita-image-store.s3.amazonaws.com/0/82600/b3c343c6-bdf4-b6c7-25d2-1a89d3ab0d47.png)

## 失敗すると Merge できなくなる
![image.png](https://qiita-image-store.s3.amazonaws.com/0/82600/3f38d061-1a99-514a-1c1c-97031a0bafbb.png)
【Unity拡張】アセットストアからDLしたファイルの保存場所を開くエディター拡張

# はじめに
アセットストアからダウンロードしたファイルの保存場所を開くエディター拡張を作ってみました。

# 動作環境
バージョン: Unity5以降
OS: Windows / Mac

# ソースコード
以下のスクリプトをプロジェクト内のEditorフォルダ以下へ入れてください。

``` EditorOpenDirectory.cs
using System.IO;
using UnityEngine;
using UnityEditor;
using UnityEditorInternal;

public class EditorOpenDirectory
{
    [MenuItem("Open/Asset Store Directory")]
    static void OpenAssetStoreDirectory()
    {
		string path = "";
        if (SystemInfo.operatingSystem.Contains("Windows")) // OSがWindowsの場合
		{
        	path = InternalEditorUtility.unityPreferencesFolder + Path.DirectorySeparatorChar + "../../Asset Store-5.x";
		}
        else if (SystemInfo.operatingSystem.Contains("Mac")) // OSがMacの場合
		{
			path = InternalEditorUtility.unityPreferencesFolder + Path.DirectorySeparatorChar + "../../../Unity/Asset Store-5.x";
		}
        OpenDirectory(path);
    }


    private static void OpenDirectory(string path)
    {
        System.Diagnostics.Process.Start(path);
    }
}
```

※Macでの動作確認はしていないため、もしかするとMacでは動かないかもしれません。

# 使う
メニューの **Open/Asset Store Directory** を選択するとアセットの保存場所が開かれます。

![1_assetstore_edit.gif](https://qiita-image-store.s3.amazonaws.com/0/44288/dfd1c1dc-02fe-11de-6a59-b21bb7566fac.gif)

# 参考URL
Unityで使用しているフォルダ一覧
http://masa795.hatenablog.jp/category/unity?page=1368587772

Asset Storeからダウンロードしたファイル(.unitypackage)の保存場所
http://d.hatena.ne.jp/nakamura001/20120312/1331567986
Bootstrap3のコンポーネントを使うテストを安定させる方法

# 課題：poltergeistのテストが安定しない

Bootstrap3のモーダル系を使ったテストがpoltergeistの気分次第で落ちる:ghost:
sleepで調整しても終わりがないので、それを是正したい。

# 改善策：JavaScriptでフラグを立てて管理する方式にする
[Capybara Poltergeist で Bootstrap3 のモーダルを使ったテストが失敗する](http://qiita.com/shunichi/items/003c32a454eae8e3fa8a)

という記事を読んで、これはいいなぁと思ったので参考にすることに。
自分の場合は、モーダルが表示されたときよりもモーダルが消える前にテストが評価しようとして落ちたりしたので、そっちをなんとかしたかった。ついでにモーダル以外のも定義しときたかった（後で追加するの面倒）ので、いろんなイベントに対応できるようにメタプログラミングでメソッドを作るようにした。

（2018-07-03 追記）
`wait_until_hidden_backdrop`を定義しました。`hidden.bs.modal`が走った後でも、モーダルダイアログの背景（透過の黒背景）が画面を覆っている場合があったので、追加しました。`wait_until_hidden_bs_modal`の中で背景が消えるまで待つという処理を入れてみたのですが、モーダルから更にモーダルを呼び出したりすると初回のモーダルの影響で背景が消えなくて処理が終わらずタイムアウトエラーになったので、個別に使うようにしています。

```rb:wait_until_bootstrap3_components.rb
module WaitUntilBootstrap3Components

  def self.define_wait_bootstrap3_event(event_name)
    event_name_underscore = event_name.gsub('.', '_')
    event_name_camelcase = event_name_underscore.camelize
    define_method :"wait_until_#{event_name_underscore}" do |&b|
      script = <<~EOS
        window._capybara#{event_name_camelcase} = 1;
        jQuery(document).one("#{event_name}", function(){ window._capybara#{event_name_camelcase} = 0; });
      EOS
      page.execute_script(script)
      b.call unless b.nil?
      Timeout.timeout(Capybara.default_max_wait_time) do
        loop until page.evaluate_script("window._capybara#{event_name_camelcase}").zero?
      end
    end
  end

  def wait_until_hidden_backdrop
    Timeout.timeout(Capybara.default_max_wait_time) do
      loop until page.all('.modal-backdrop').blank?
    end
  end

  def self.included(_)
    %w(popover modal tooltip collapse dropdown tab).each do |component_name|
      %w(shown.bs hidden.bs).each do |event_prefix|
       define_wait_bootstrap3_event("#{event_prefix}.#{component_name}")
      end
    end
    %w(loaded.bs.modal closed.bs.alert slid.bs.carousel inserted.bs.tooltip inserted.bs.popover).each do |event_name|
     define_wait_bootstrap3_event(event_name)
    end
  end
end

RSpec.configure do |config|
  config.include WaitUntilBootstrap3Components, type: :feature
end
```

## 使い方

Bootstrap3で使われるイベント名の`.`を`_`に変換して、メソッドの接頭辞に`wait_until_`をつけるという感じです。

```rb
# モーダルが開き終わるのを待つ
wait_until_shown_bs_modal do
  click_button "モーダルを表示する"
end
# モーダル上で作業する

# モーダルが閉じるのを待つ
wait_until_hidden_bs_modal do
  click_button "閉じる"
end
```

# 感想

よく落ちていた箇所のテストがこれで安定するようになったので、bootstrap3を入れているプロジェクトにどんどん適用していきたい所存。
Brackets 1.10 にアップデートするとフリーズする場合の解決策

# 事象

2017/07/07 に [Brackets 1.10 がリリース](http://brackets.io/)されたので早速アップデートしたところ、ファイルを開く段階でアプリ自体がフリーズする不具合に遭遇しました。
（macOS Sierra 10.12.5）

# 解決策

1.10 の主なアップデート内容に

> **複数のエンコードのサポート**
Brackets が 40 種類以上のファイルエンコードに対応するようになりました。様々なエンコードを使用して、ファイルを表示/保存できます。

があったため、エンコード系の拡張機能が影響しているのかな？と考え、元々インストールしていた**「Shizimily Multi-Encoding for Brackets」を無効**にしたところ、Brackets が正常に動作するようになりました。
PHPでJavaScriptのイベントハンドラを削除

```html
<button onclick="alert('push_button')">alert</button>
```

これを

```html
<button>alert</button>
```

こういう風にしたい

# コード

```php
<?php
$str = '<button onClick="alert(\'push_button\')">alert</button>';

$patan = '/( |　|)(onLoad|onClick|onDblClick|onBlur|onFocus|onChange|onSelect|onSelectStart|onSubmit|onReset|onAbort|onError|onLoad|onUnload|onKeyPress|onKeyDown|onKeyUp|onMouseOut|onMouseOver|onMouseDown|onMouseUp|onMousemove|onDragDrop)=("(.*?)"|\'(.*?)\')/i';

//on〇〇を削除する
$rep = preg_replace($patan,"",$str);

//削除してもまだon〇〇があるか
if(preg_match($patan,$rep)){
  //あったら、なくなるまでwhileで削除し続ける
  while (preg_match($patan,$rep)) {
    $rep = preg_replace($patan,"",$rep);
  }
  echo $rep;
} else {
  //なかったら出力
  echo $rep;
}
```

# 結果

```html
<button>alert</button>
```


いい感じにできた。


# 追記
```html
<button onclick=alert(1)>a</button>
```
このように書くと処理が実行されます...

正規表現マスターの人助けて！