OmniAICreator/Qiita-1.07M huggingface dataset:
Visual Studio 2017 CommunityでリモートiOSシミュレータを使う

# まえがき
Windows上でiOSシミュレータを使うには、Visual StudioのEnterprise版が必要でした。
Communityでも使えるよう[投票](https://xamarin.uservoice.com/forums/144858-xamarin-platform-suggestions/suggestions/17194163-allow-use-of-remoted-ios-simulator-from-all-editio)まで行われていましたが、
めでたく15.5で使える様になりました。
さっそく試してみたいと思います。
<font color="red">**Mac必須です。**</font>

# 開発環境
- Windows 10 1709
- Visual Studio 2017 Community 15.5.1
- macOS 10.13.2 
- Xcode 9.2

# 初期設定
Visual Studio Installerを立ち上げ、Xamarin Remoted Simulatorがインストールされているか確認して下さい。
私はこれに気づくのにずいぶん時間を使いました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/190739/d2fd35f6-45b6-dc6b-ff24-ef443f580bc8.png)


インストールすると、「オプション」→「Xamarin」→「iOSの設定」に、「リモートSimulatorからWindowsへ」チェックボックスが追加されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/190739/c237eb1a-aaba-9939-c04d-7b4f9eb78165.png)

# 起動確認
さっそく動作を見るため、適当なソリューションを作成しましょう。
15.5から不要なプラットフォームを外せるようになったので便利ですね。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/190739/f8166d40-cd95-3085-5e12-ce9c0da71d4c.png)

よりどりみどりです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/190739/cc4953e1-07e2-be6d-cd2e-32f6917b808e.png)

無事動作確認できました。私のマシンではあまりキビキビ動かず、まあこんなものかなといったところでした。
内部の仕組みはMac上でiOSシミュレータを動かしてWindowsに出力しているらしいので、Macの性能がよければぬるぬる動くかもしれません。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/190739/21da7fc0-1e3b-7066-c49c-ad096b320b47.png)
ダミーテーブルについて

ダミーテーブルについてご紹介します。

#★ダミーテーブルとは★
各DBにセットアップ時から存在する、1行しかデータの存在しないテーブルのことです。

カレンダーを管理しているテーブル等を参照することなく、
SQL発行のみでシステム日付の取得や連番作成を行うことが可能です。
また、工夫次第でカレンダーテーブルを参照することなく、
現在から100年後までのカレンダーとその曜日を取得することが可能です。
  
##☆使用方法について☆
ダミーテーブルの中身はSELECT句で作成します。

###・ORACLE 

```　
SELECT　'1' AS DUMMY     1 
FROM DUAL　　←ORACLEのダミーテーブル名
```

上記のSQLを発行すると項目名はDUMMYで中身が1のテーブルができます。

以下、出力結果

```
DUMMY     ←項目名
1  　←値
```

システム日付を取得する際は、以下のように記載することで取得することが可能です。

```
SELECT　SYSDATE
FROM　DUAL
```

※各DBにおけるダミーテーブルの名前はそれぞれでシステム日付等の取得方法も異なります。

##★使用例★
ORACLEにおけるダミーテーブルのみを使用した2014年2月のカレンダー日付の取得方法の一例を紹介します。


    SELECT TO_DATE(STARTDATE + ROWNUM -1, 'YYYY/MM/DD') AS CALENDAR

    FROM

    (SELECT TRUNC(TO_DATE('2014-02-01')) AS STARTDATE,

    TO_NUMBER(TO_CHAR(LAST_DAY(TO_DATE('2014-02-01')), 'DD')) AS DAYS

    FROM DUAL),

    ALL_CATALOG

    WHERE ROWNUM <= DAYS
    
   
   以下、出力結果

```
CALENDAR

14-02-01

14-02-02

14-02-03

14-02-04

14-02-05

14-02-06

14-02-07

14-02-08

14-02-09

14-02-10

14-02-11

14-02-12

14-02-13

14-02-14

14-02-15

14-02-16

14-02-17

14-02-18

14-02-19

14-02-20

14-02-21

14-02-22

14-02-23

14-02-24

14-02-25

14-02-26

14-02-27

14-02-28
```

#★最後に★
今回はカレンダー日付を取得することに重点を置きダミーテーブルについてご紹介しましたが、
SELECT句によりテーブルの中身は変えることが可能ですので、
工夫次第でさまざまな使用方法があります。
ですので、機会があればぜひ使用してみてください。
今年使ってよかった開発ツール

## エディター
### [Rubymine](https://www.jetbrains.com/ruby/)(というか[jet brains]([JetBrains: Developer Tools for Professionals and Teams](https://www.jetbrains.com/))関連ツール)

これまでずっとAtomを使っていて、正直何も不満はなかったのですが、
IDEの世界も知っときたいと思って、軽い気持ちでダウンロードしました。

うん。もうAtomには戻れないですねw
Ruby半分、Js半分、たまにscalaみたいな感じで普段コード書いてます。
よく静的片付け言語だとIDEの恩恵を享受できるみたいな記事を見るので、
正直あまりRubymineに期待していませんでしたが、、、

+ Rubyでもコードジャンプできたり、
+ ブレイクポイント打てたり、(binding.pryいらず)
+ Rails(rake)コマンドや、gemのコマンドなどを登録でき、
+ そのログ内のファイルがリンクになっていてすぐにそこに飛べたり、
+ プロジェクトごとに設定を変えれたり、
+ DBに接続して、専用のGUIでDB見れたり、いじれたり

と、ざっくりまとめると、

+ ターミナル開いて、コマンド打って実行みたいな作業が一気に減り、コード書くときだけ、タイピングみたいな感じになります。

コマンド入力してて、タイポとか、無駄にbashとかにalias貼らなくて良いので、その辺りの鬱陶しさから解放されました。

## HTTPクライアント
### [Paw](https://paw.cloud/)
他にも様々なHTTPクライアントがありますが、
Pawを使っていて便利だと思ったのは、
+ プロジェクトごとにファイルを作れる(APIを束ねておけること)
+ 環境 を設定でき、環境ごとに変数を設定できる
+ paw使っている同士であれば、プロジェクトを共有できる(cloud共有)

と他にも色々ありますが、とにかく多機能で痒いとこに手が届きます。

そして、何よりUIが綺麗で、かつダークテーマが用意されています。(これ超重要)

## Git管理
### [SourceTree](https://ja.atlassian.com/software/sourcetree)
超有名なGitのGUIツールですw
特に機能説明はしませんw

もちろんのことながら、ターミナルで尋常じゃないスピードでコマンド打つよりも、圧倒的に楽だし、
何より各ブランチの関係性をグラフで見れるのは、レポジトリの全体感を把握する上でも良いですね。(ということに今更気づいた)
コマンドのオプションとかで無駄にググることが減りました。

これもUIが綺麗で、かつダークテーマが用意されています。(これ超重要)
エンジニア関わらず、長時間PC見てると、夜とか白背景のサービスとかツールは目が痛いので、ダークテーマはマジでありがたい。

## GitHub
[Insight.io | Best Place to Browse Code on the Web](https://insight.io)

GithubのレポジトリのURLを投げるとそれを解析して、
IDEライクにGithubのcodeを読めるというツール。

何回かやって見たけど、コードリーディングとか捗りそうです。

## メモ
### [Bear](http://www.bear-writer.com/)

これまでevernoteを使ってましたが、ちょっと自分には多機能すぎるのと、
挙動がもっさりしている、マークダウンが使えないなど、諸々の理由から、
シンプルにマークダウンをかけて、マルチデバイス対応してるメモアプリを探してました。

そんな時に現れたのが、 Bearです。

+ とにかくUIがシンプル
+ コードとかも言語してするとちゃんとsyntaxに色がつく。
+ ダークテーマがある。これ超重要。

## まとめ
とにかく、UIがシンプルでダークテーマがあれば俺はそれで満足ですw
正直ツール選定って、利便性(そもそもこれも人によって違う説)もそうですが、結構その人のポリシーとか、個人の趣味嗜好が大部分を占めてる気がします。
なので、使ってるツールからその人となりがチラ見したりするので、
こっそり皆さんが普段どういうツールを使って仕事しているのか気になりますw

もし、こういうの使ってるよーみたいなのがありましたらぜひ、教えてください。
Meteor + Blaze で匿名質問サービスをつくろう：第1夜 準備と環境構築

# 匿名質問サービスをつくろう。

## なぜ？
最近 Twitter で~~また~~流行りの匿名質問サービスに乗ろうとしてこんなアンケートをとってみましたが、

<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">匿名質問サービスに手を出すかどうか迷っている</p>&mdash; penta@mina ~$ meteor (@plageoj) <a href="https://twitter.com/plageoj/status/940839109509238784?ref_src=twsrc%5Etfw">December 13, 2017</a></blockquote>

こうなりました。車輪の再発明とはわかっていますが、自作します。

## 何を使って？
爆速で開発すべく、[Meteor](//www.meteor.com) を選択します。
テンプレートエンジンはデフォルトの [BlazeJS](http://blazejs.org/) を使いましょう。

サーバーは Heroku を使うのが一番安くて手っ取り早いと思います。

ついでに、Meteor は日本語ドキュメントが少ないので、JSは書けるんだけど程度の初心者がわかるように記事を書いてみます。
もしわかりづらい点があれば編集リクエスト等でご指摘いただければ幸いです。

### Meteor をインストール
既にインストールされている方は `meteor update` してください。

*nix 系のOSの方は `curl https://install.meteor.com/ | sh` を叩きます。
Windows 環境では www.meteor.com からインストーラーをダウンロード、実行してください。

Meteor のほか、node、npm 等も一発でインストールしてくれます。

### プロジェクトを作成
プロジェクトの名前を決めなくてはいけません。
ここは安直に、`Queuestion` にしましょう。実にプログラマー的な命名です。

適当なディレクトリに移動して、プロジェクトを作成します。

```bash
$ cd ~/project
$ meteor create queuestion
Created a new Meteor app in 'queuestion'.

To run your new app:
  cd queuestion
  meteor

If you are new to Meteor, try some of the learning resources here:
  https://www.meteor.com/tutorials

meteor create --bare to create an empty app.
meteor create --full to create a scaffolded app.
```

## 機能を決める
質問を受け付けるユーザー (ホストとしましょう) は

+ Twitter、または email でログインする
+ 質問受付 URL をツイートする
+ 質問にたいし Twitter タイムライン上で答える

質問をするユーザー (ゲストとします) は

+ 質問受付 URL を踏む
+ 質問を投稿する

おおまかにはこんな感じでしょう。細かいところは実装時に決めてしまいます。

この状態で、ソースはこのようになりました。今日はここまでにします。
[GitHubで見る](https://github.com/plageoj/queuestion/tree/397119c1a6129e4e60fbf3072dd94bf1b52ee7a5)

[第2夜では Twitter ログインを実装します](https://qiita.com/plageoj/items/67790c3ba3122fb1ea9d)。
シェル芸で駅すぱあとWebサービスのレスポンスをパースする

[ヴァル研究所 Advent Calendar 2017](https://qiita.com/advent-calendar/2017/val) 13日目の記事です。

今日はシェル芸で[駅すぱあとWebサービス](http://docs.ekispert.com/v1/)のレスポンスをパースして、探索結果を見やすく整形する方法を紹介しようと思います。

[シェル芸](https://ja.wikipedia.org/wiki/USP友の会#シェル芸)とは(Wikipediaによると)「主にUNIX系オペレーティングシステムにおいて『マウスも使わず、ソースコードも残さず、GUIツールを立ち上げる間もなく、あらゆる調査・計算・テキスト処理を CLI端末へのコマンド入力一撃で終わらせること』（USP友の会会長・上田隆一による定義）」というシェルのワンライナー活用法です。今回はこれを応用してみようというわけです。

## が、最初に注意

今日ご紹介する手順は、[駅すぱあとWebサービス](http://docs.ekispert.com/v1/)のXMLレスポンスの要素の並び順に大きく依存しており、返却されるレスポンスの追加といった仕様変更により、動作しなくなる可能性がある点にご注意ください。
(あくまでも、「こういうこともできますよ」的な紹介になります)

## まずは実行例

説明の前に、実行例を見てもらうのが良いかと思います。WebAPIを利用するにはアクセスキーが必要になります。「[駅すぱあとWebサービス](https://ekiworld.net/service/lp/webservice/)」からお申込みいただくことでアクセスキーを取得できます。

アクセスキーを設定して以下のCLIコマンドを実行すると...。

```sh
$ export ACCESS_KEY=アクセスキーを入力してください
$ curl -s -XGET "http://api.ekispert.jp/v1/xml/search/course/extreme?key=${ACCESS_KEY}&answerCount=1&searchType=plain&viaList=東京:博多" \
      | xmllint --format - \
      | egrep -A2 '(<Point|<Line)' \
      | egrep '(<Name)' \
      | grep -v '<Name>[A-Z]</Name>' \
      | grep -v '<Name>[A-Z][A-Z]</Name>' \
      | sed \
          -e "s/          <Name>/* /g" \
          -e "s/        <Name>/| /g" \
          -e "s/\">/: /" \
          -e "s/<\/Name>//"
```

東京駅〜博多駅の経路が見やすく整形されて表示されます！

```
* 東京
| ＪＲ京浜東北・根岸線快速
* 浜松町
| 東京モノレール
* 羽田空港第１ビル(東京モノレール・ＪＡＬ利用)
| 徒歩
* 羽田空港(東京)
| 空路(東京－福岡)
* 福岡空港
| 徒歩
* 福岡空港(鉄道)
| 福岡市地下鉄空港線
* 博多
```

## パース処理の解説

パース処理の解説、といっても行っていることはUNIXコマンドによるテキスト処理をつらつらと並べているだけです。大まかな流れは以下になります。

 1. `curl` コマンドで[駅すぱあとWebサービス](http://docs.ekispert.com/v1/)のAPIを呼びだし、レスポンスを取得する。
 2. 取得したXMLレスポンスを `xmllint --format -` で整形(ここでXMLの各要素を1行毎に切り出しているのがポイント)
 3. 必要なXML要素を `egrep` で抜き出す。
 4. `sed` で不要なタグ文字を除去する。

以下のようにXMLの子要素を取得したい場合は、 `egrep -A1` した後に、お目当のタグを指定して `grep` します。

```
$ # 例）例えば以下のような状態のXMLデータ
$ #   <Station code="22828">
$ #     <Name>東京</Name>
$ ... | grep -A1 '<Station ' | grep '<Name'
          <Name>東京</Name>
```
 
## これどういうときに役に立つの？

シェル芸でレスポンスをパースするというこの方法、WebAPIのデバッグにおいて、特定のXML要素だけ抜き出して確認したり、今回のような経路をパッと表示して確認したり等、地味に役立ちます。
また、お客様からの問い合わせに簡単な実行例を提示する際にも役立ちます(JavaScriptとかでサンプルを書くと、どうしても処理が長くなってしまうため)。

## まとめ

シェル芸で[駅すぱあとWebサービス](http://docs.ekispert.com/v1/)のレスポンスをパースする方法とその実行例を示しました。macOSとかだとターミナルを起動すればすぐに試すことができるので、WebAPIのお手軽なデバッグ手法として覚えておいて損はないかと思います。
BIOS 環境で NVMe から BitVisor と OS を起動する話

# はじめに
(明日国際会議で発表しないといけないので，記事を書いている場合ではなさそうですが)
以前 BIOS 環境で NVMe から BitVisor と OS を起動しようとしたとき起きた問題と，その回避策( not 解決策 ) を書こうと思います．
以前にあった話を思い出しながら書いているので，もしかしたら細かい部分で間違っている部分があるかもしれません．

以前，同じ内容を BitVisor の Slack 内で話題に挙げたので，Slack を見ている方は知っている内容かもしれません．

# 環境 & 現象

BitVisor を以下の条件で起動しようとすると, `MBR read error` や `load_bootsector error` と言われて落ちてしまいました．

- ブートディスクが M.2 接続の NVMe (SAMSUNG SSD 950 Pro M.2)
- BitVisor とゲスト OS が NVMe デバイスにインストールされている
- NVMe を GPT でパーティショニング
- BIOS ブートで Grub --> BitVisor -＊-> Grub --> Linux の順に起動 (＊ でエラー)

## エラーの詳細
調べてみると，どうも BIOS コールの int 13h ah=02h がエラーコード 20h (controller failure) を返しているようでした．

## 回避策 ( not 解決策 )
M.2 な NVMe だと CHS でアクセスできないのかな? と思い，試しに int13h ah=42h (LBA 指定でディスクを読む) をやってみたところ，一応，起動に成功しました．
実際に加えた変更は以下の通りです．

```diff
--- a/core/loadbootsector.c     Fri Jun 30 14:50:24 2017 +0900
+++ b/core/loadbootsector.c     Fri Jun 30 15:49:44 2017 +0900
@@ -133,13 +133,19 @@
        int i;
        u64 lba;
        struct mbr *p;
-
+       u8 err_code;
+
        if (tmpbufsize < 512)
                return false;
        printf ("Loading MBR.\n");
-       if (callrealmode_disk_readmbr (bios_boot_drive, tmpbufaddr)) {
-               printf ("MBR read error.\n");
-               return false;
+       err_code = callrealmode_disk_readmbr (bios_boot_drive, tmpbufaddr);
+       if (err_code) {
+               printf ("MBR read error %x.\n", err_code);
+               err_code = callrealmode_disk_readlba (bios_boot_drive, tmpbufaddr, 0, 1);
+               if (err_code) {
+                       printf ("MBR read (LBA) error %x.\n", err_code);
+                       return false;
+               }
        }
        if (config.vmm.boot_active) {
                printf ("Loading VBR.\n");
```

# 残っている問題
起動はしましたが，若干動作が怪しいです．
2回目の grub でゲスト OS を選択してからの Linux カーネルの起動中のメッセージが出力されるまでにかなり時間がかかります．
BitVisor を挟まなければ特に時間がかからない部分なんですが...

# NVMe と BIOS の組み合わせについて
そもそも，BitVisor 云々とは関係なく，BIOS 環境で OS を NVMe から起動するのは NVMe の仕様的に非推奨だったりします．
なので，起動するだけでもラッキーなのかもしれません...

# 終わりに
BIOS + NVMe + BitVisor で起きた問題とその回避策について書きました．
詳細な調査は行っていないので，M.2 NVMe だけで起きる問題なのかそうでないのかや，それ以外のストレージデバイスで起きるのかどうかなどはよくわかりません．

BIOS + NVMe という奇特な環境で BitVisor を使わないといけない諸事情がある人の役に立つと幸いです (そういう人がどれくらいいるのか謎ですが...).

(明日の国際会議での発表が終わったら僕はぐったりしてそうなので，誰かに記事を書いてほしいですね)
groovy.sql.Sqlのログ制御

これは[G* Advent Calendar](https://qiita.com/advent-calendar/2017/gastah)の15日目の記事で、Groovyの小ネタです。

あと、Advent Calendar初参加記事です :innocent:

----

# 便利なgroovy.sql.Sqlクラス

Groovyには超絶便利なgroovy.sql.Sqlクラスがあるおかげで、DBを簡単にプログラムで扱うことができます。

## でもこのクラスは

groovy.sql.Sqlクラスは、Groovyプログラムのログ出力にSlf4j+Log4j2を使っていたとしても、Log4j2とは別でログを出力してきます。

このため、例えばPKの一意制約エラーを利用した重複排除のコードを書いた場合、Sqlクラス内ではWARNINGとしてエラーメッセージを出力するようになっているため、Lo4j2でエラーレベルをERRORにしていても、発生の都度エラーメッセージがコンソールに出力されてしまいます。

想定の処理なのにエラーのようなメッセージがユーザに見えるのはよろしくないので、これは表示しないようにしたいですね。

## 解決策

Sql#newInstanceを実行してインスタンスを作る前に、以下の処理を入れることでログレベルを最高値に変更することができ、WARNINGを抑制することができます。

```groovy
Sql.LOG.level = Level.SEVERE
```

- 利用例：https://github.com/seriwb/reins/blob/master/src/main/groovy/box/white/reins/BootStrap.groovy

たったこれだけで私が2年位悩んだ問題が解決しました :rolling_eyes:

# じゃあ重大な障害が発生した場合は？

ログレベルをSEVEREにしているので、もちろん重大な障害が発生した場合はメッセージがコンソールに出力されてしまいます。

でも大丈夫です。
重大な障害なんて発生するわけ無いですよね :innocent:
テプラSR232を上位機種のSR333にする

# これもテプラ芸
テプラのSR232というモデルとSR333というモデルは内部の基板・FWは同じでジャンパでモデルを判別してるというお話。

## やり方
[ここに書いてある](https://togetter.com/li/605952)

要はジャンパにハンダをモリモリすればいい。

## やってみた
縁あって新品のSR232を入手したので試してみた。

![01823a767dea47e9e8585239588979944602285838.jpg](https://qiita-image-store.s3.amazonaws.com/0/151628/1589907b-e5b3-c27b-e6aa-fd64f8799bc0.jpeg)

### 開ける
新品なのに起動もせずにいきなり分解する。

開ける際結構ネジが固く締まってるので潰さないように注意しないといけない。

![0176f80324a689e3ba5639d323e9008d72842b6fd0.jpg](https://qiita-image-store.s3.amazonaws.com/0/151628/2dd78a85-bbbb-4b62-45eb-5a697428f2b4.jpeg)

### ハンダを盛る
H8近くのジャンパ（JP1）をブリッジしてやるだけ。

![0113e10a98a344739f1f759351d2aeb9b6da147456.jpg](https://qiita-image-store.s3.amazonaws.com/0/151628/3feb477a-8511-123e-13c8-1a594302a559.jpeg)

### 動作確認
明朝体を選べるね！！

![01b8c8ebe4b219705ff14c194428bf08baad1e2d65.jpg](https://qiita-image-store.s3.amazonaws.com/0/151628/11380080-ddc3-8fec-79c1-bab045f2c94b.jpeg)

## 注意
- もちろん保証はなくなります
- 失敗して壊れても自己責任
[とあるコンテスト: docker 入門] dockerをインストールしてhello-worldコンテナを作動＋削除してみる

Hello World !!!
さて今回は、dicker repository から docker をインストールしてみましょう。

# 環境
- CentOS 7.4.1708 (on VirtualBox)
- docker version 17.09.1-ce

# 事前準備
## ライブラリのインストール
```
$ sudo yum install yum-utils device-mapper-persistent-data lvm2
```

## レポジトリの設定
```
$ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

$ ls /etc/yum.repos.d | grep docker    # docker-ce.repo があれば設定成功
```

# インストール
```
$ sudo yum install docker-ce

$ sudo systemctl start docker    # docker の開始
$ sudo systemctl enable docker

$ sudo docker run hello-world    # 下記のメッセージがでれば成功

(省略)
Hello form Docker!
This message shows that your installation appears to be working correctly
(省略)
```

# イメージとコンテナの削除
```
$ sudo docker container ls -a      # container-id の参照
$ sudo docker rm [container-id]    # container の削除
$ sudo docker rmi hello-wolrd      # image の削除
```

これでDockerが使用できる環境が整ったので、
[Docker Hub](https://hub.docker.com/)からイメージをどんどんインストールして、より良い環境構築LIFEを!!

# 参照
- [Docker Official Documentation](https://docs.docker.com/engine/installation/linux/docker-ce/centos/)
- [Docker 日本語ドキュメント](http://docs.docker.jp/engine/installation/linux/docker-ce/centos.html)
初回投稿時にPayload Too Largeが出る

# Payload Too Largeエラー
[こちらの記事](https://qiita.com/genshun9/items/9e54325bf2dd3de2f99f)によると初回投稿時はアップロード制限が2MBらしいのでこのエラーが出るらしい。

一つでも投稿すれば制限がゆるくなるらしいのでこれを初回投稿とする。
appledocで生成されるdocが空っぽだったときの対処法

Objective-Cでドキュメントを生成するのに便利な[appledoc](https://github.com/tomaz/appledoc)。
久しぶりに使ったらドキュメント生成自体は成功するのに中に肝心の内容が書かれていない、という状況・・・調べても原因がわからない。
色々調べたら[twitterで書いてくれてる人](https://twitter.com/hironytic/status/699852170191966208)が。
[Issue](https://github.com/tomaz/appledoc/issues/561#issuecomment-149327949)も建てられてました。
[Issue](https://github.com/tomaz/appledoc/issues/561#issuecomment-149327949)の通りに対応したら治りました。
iOSプログラマならみんな使ってたappledocがバグった状態で2年放置されてるとは・・・隆盛を感じます。
今回はObjective-Cのまま運用するけど次あったらSwiftに書き直したい・・・。
URLに任意のqueryを追加したい

[stack overflow](
https://stackoverflow.com/questions/36316814/in-play-how-do-i-include-custom-query-parameters-in-a-reverse-routed-url-call)にもありますが、、

ちょっと複雑なので[scala-uri](https://github.com/NET-A-PORTER/scala-uri)を使って再実装。。

```scala
import play.api.mvc.Call
import com.netaporter.uri.Uri

object CallEnrichment {
  implicit def toRichCall(c: Call) = new {
    def withParams(params: (String, String)*): Call = {
      val uri = Uri.parse(c.url).addParams(params)
      Call(c.method, uri.toString, c.fragment)
    }
  }
}

```
KingfisherでRoundCornerImageProcessor使うと白い背景色になる問題

# ImageProcessor

Kingfisherは取得した画像を編集してから適用するImageProcessorがある

```swift
let cirlceImageProcessor = RoundCornerImageProcessor(cornerRadius: CGFloat.greatestFiniteMagnitude)
let options: KingfisherOptionsInfo = [.processor(cirlceImageProcessor)]
setImage(with: resource, options: options)
```

で、こんな感じで書くと角丸を付けて表示出来る。

![Simulator Screen Shot - iPhone 6 - 2017-12-13 at 23.11.22.png](https://qiita-image-store.s3.amazonaws.com/0/24979/c9e084fb-40a6-4c21-bf13-d87e3ef3b38b.png)

# 背景が白くなる問題

![Simulator Screen Shot - iPhone 6 - 2017-12-13 at 23.10.12.png](https://qiita-image-store.s3.amazonaws.com/0/24979/983d6d40-bca1-6c49-fc30-ef1eb28688a0.png)

稀にこのような状態になることがある

# 原因

原因はjpgの画像はjpgでキャッシュされる為。
最初の描画時はdrawでマスク後に描画されるが、２回目移行はディスクキャッシュから取ってきてそのまま表示される。jpgは透過情報を持たないので白くなってしまう

# 対策

pngでキャッシュすればOK
キャッシュポリシーはcacheSerializerのオプションで指定可能

```swift
let cirlceImageProcessor = RoundCornerImageProcessor(cornerRadius: CGFloat.greatestFiniteMagnitude)
let options: KingfisherOptionsInfo = [.processor(cirlceImageProcessor), .cacheSerializer(FormatIndicatedCacheSerializer.png)]
let url = URL(string: "https://www-tc.pbs.org/wnet/nature/files/2017/09/x1WLcZn-asset-mezzanine-16x9-6kkb4dA.jpg")
iv.kf.setImage(with: url, options: options)
```

# 注意点

既にjpgでキャッシュしている場合はそっちを引いてきてしまうので注意

# 参考文献

https://github.com/onevcat/Kingfisher/issues/693

こちらのissueで解消しました。
Ctrl+SpaceでVSCodeのIntelliSenseの候補を選択する

# はじめに

VSCodeでは、入力中に`Ctrl+Space`を押すことでIntelliSenseが表示される。IntelliSenseの候補は、矢印キーの上下で選択できるが、できるだけホームポジションから移動したくない。

そこで、`Ctrl+Space`でIntelliSenseの候補を選択できるように設定した。
具体的には、`Ctrl+Space`で1つ下、`Ctrl+Shift+Space`で1つ上に移動させる。

# キーバインド設定

ファイル(F)→基本設定(P)→キーボード ショートカットから設定を行う。

## 1つ下の候補に移動できるようにする

`Ctrl+Space`でカーソルを1つ下の候補に移動させる

### 競合するキーバインドを無効化

GUIからは、以下の手順で無効にできる。

1. テキストボックスに`Ctrl+Space`と入力し、キーバインドを検索する
2. `toggleSuggestionDetails`を無効にする (右クリック→キー バインドの削除)

もしくは、`keybindings.json`に下記の記述を追加する。

```json:keybindings.json
[
    {
        "key": "ctrl+space",
        "command": "-toggleSuggestionDetails",
        "when": "editorTextFocus && suggestWidgetVisible"
    }
]
```

### キーバインドを追加

1. キーボード ショートカットの設定画面にあるkeybindings.jsonをクリックする
![keyboard_shortcut.png](https://qiita-image-store.s3.amazonaws.com/0/40063/4173e1d4-4149-7164-c87f-422a69e3083e.png)
2. `keybindings.json`に下記の記述を追加する。

```json:keybindings.json
[
    {
        "key": "ctrl+space",
        "command": "selectNextSuggestion",
        "when": "editorTextFocus && suggestWidgetMultipleSuggestions && suggestWidgetVisible"
    }
]
```

## 1つ上の候補に移動できるようにする

`Ctrl+Shift+Space`でカーソルを1つ上の候補に移動させる

### キーバインドを追加

1. キーボード ショートカットの設定画面にあるkeybindings.jsonをクリックする
![keyboard_shortcut.png](https://qiita-image-store.s3.amazonaws.com/0/40063/4173e1d4-4149-7164-c87f-422a69e3083e.png)
2. `keybindings.json`に下記の記述を追加する。

```json:keybindings.json
[
    {
        "key": "ctrl+shift+space",
        "command": "selectPrevSuggestion",
        "when": "editorTextFocus && suggestWidgetMultipleSuggestions && suggestWidgetVisible"
    }
]
```
IchigoJamで文字の拡大表示

IchigoJamで文字の拡大表示を試してみました。

■内容
AからZまでの文字コードを0と1で表現しています。
PEEKで各行のデータを読み出しています。
なお、BIN$は桁数を指定しないと頭の部分がゼロの場合桁が欠けてしまうので注意が必要です。

■コード
1 'Character A to Z
5 FOR T=asc("A") TO asc("Z")
10 FOR I=0 TO 7:?BIN$(PEEK(T*8+I),8):WAIT3:NEXT
15 ?""
20 NEXT

■プログラムの実行(Chrome/FireFoxで開いてください)
http://fukuno.jig.jp/app/IchigoJam/#1%20'Character%20A%20to%20Z%0A5%20FOR%20T%3Dasc(%22A%22)%20TO%20asc(%22Z%22)%0A10%20FOR%20I%3D0%20TO%207%3A%3FBIN%24(PEEK(T*8%2BI)%2C8)%3AWAIT3%3ANEXT%0A15%20%3F%22%22%0A20%20NEXT%0A
※リンク先を開いた後　run [Enter]で実行されます。

■スクリーンショット
![image.png](https://qiita-image-store.s3.amazonaws.com/0/71746/68d73d97-e363-3b9c-cc38-529544f5f54a.png)
ROS command cheat sheet

### ROS shell
|Command|説明|
|:---|:---|
|roscd|指定されたROSパッケージのディレクトリに移動|
|rosls|ROSパッケージのファイルリストを確認|
|rosed|ROSパッケージのファイルを編集|
|roscp|ROSパッケージのファイルをコピー|
|rospd|ROSディレクトリインデックスにディレクトリを追加|
|rosd|ROSディレクトリインデックスを確認|

### ROS execute
|Command|説明|
|:---|:---|
|roscore|ROSマスター（ROSネームサーバ）、rosout（標準出力stdout/標準エラー出力stderr）、パラメータサーバ（パラメータ管理）の起動|
|rosrun|パッケージの一つのノードを実行|
|roslaunch|パッケージの複数のノードを同時実行|
|rosclean|rosログファイルを確認、削除|

### ROS information
|Command|説明|
|:---|:---|
|rosnode|ROSノード情報の確認|
|rostopic|ROSトピック情報の確認|
|rosservice|ROSサービス情報の確認|
|rosparam|ROSパラメータ情報の確認と修正|
|rosbag|ROSメッセージの記録と再生|
|rosmsg|ROSメッセージ情報の確認|
|rossrv|ROSサービス情報の確認|
|rosversion|ROSパッケージとリリースバージョン情報の確認|
|rosqtf|ROSシステムチェック|

### ROS catkin
|Command|説明|
|:---|:---|
|catkin_create_pkg|catkinビルドシステムでパッケージを自動生成|
|catkin_make|catkinビルドシステムのビルド命令|
|catkin_eclipse|catkinビルドシステムで生成したパッケージをEclipseで使用できるように変更|
|catkin_prepare_release|リリース準備するときに使用されるchangelog整理とバージョンのタグ管理|
|catkin_generate_changelog|リリースするときCHANGELOG.rstファイルの作成又は更新|
|catkin_init_workspace|catkinビルドシステムの作業フォルダの初期化|
|catkin_find|catkin検索|

### ROS package
|Command|説明|
|:---|:---|
|rospack|指定したROSパッケージに関連する情報を表示|
|rosinstall|ROS追加パッケージの自動インストール|
|rosdep|ROSパッケージの依存関係ファイルのインストール|
|roslocale|ROSパッケージの情報表示|
|roscreate-pkg|ROSパッケージの自動生成（旧rosbuildシステムで使用）|
|rosmake|ROSパッケージをビルド（旧rosbuildシステムで使用）|

### ROS tools
|Command|説明|
|:---|:---|
|RViz|3次元可視化ツール|
|rqt|QtベースのROS GUI開発ツール|
|rqt_image_view|カメラ映像を表示するツール|
|rqt_graph|ノードとメッセージ間の関係をグラフで表示するツール|
|rqt_plot|2次元データのプロットツール|
|rqt_bag|GUIベースのbagデータ分析ツール|
Slack × Flow XO × kintoneを連携して, 顧客情報検索botを作ってみよう！

みなさん、こんにちは！

サイバーマンデーでkindle white paper、楽天スーパーセールでGoogle homeを買っちゃいました。
大幅セールに弱いおんちゃんです:star:

#:pushpin: はじめに
先週cybozu developer networkにはまた一つの革新的な記事が更新されました。(←個人の感想です笑) 
それは、「[SlackとkintoneとFlow XOを使って出勤連絡ボットを作ろう！](https://developer.cybozu.io/hc/ja/articles/115005537606)」という記事です。

この記事を見て、会話ができるbotを今はやりの「ノンコーディング」で作れちゃうということ知って、これや、これからはプログラミング初心者の方や、プログラミングができない方でも自分がほしいbotを自分で作って使えるかも！と思ったら、なんだかワクワクして、早速bot作りに挑戦してみました。

※上記の記事をまだ読んでないという方がいらっしゃいましたら、よりスムーズな設定のために、是非上記の記事を先に試すことをお勧めします。

#:pushpin: 今回作るBotは？
みなさん、突然ですが、普段こんなこと思ったことありませんか？

>例1) お客様から電話がかかってきて、担当者に折り返しお電話お願いしますと言われたのに、会社名が長くて、もしくは独特で、一応復唱して「あってます」とまでいわれたけど、電話番号以外は自分のメモが正しいか自信がない……泣

>例2) 知らない番号から会社携帯に電話がかかってきた。お客様なのかな、でもいま外出中でパソコン開けないし、モバイルではクライアント証明書の問題でkintoneブラウザ版に入れないし、kintoneアプリは検索できないし…どうしよう…泣

などなど… (例がニッチすぎるかな笑ヾ(・ε・。)ｫｨｫｨ)

いつでも、どこでも！必要な時に！自分が持っている最小限の情報で！
顧客の情報が探せたらなーと思う方々のために挑戦しました！名付けて、　
####**"顧.客.情.報.検.索 BOT！"** (search_customer_bot)

![giphy.gif](https://qiita-image-store.s3.amazonaws.com/0/151005/41be9be7-07cb-cd3e-5ac7-320767628335.gif)
参照：http://bit.ly/2AcAtdT

#:pushpin: 完成イメージ
完成イメージはこんな感じです！

・一致する情報がある時
![qiita-gif11.gif](https://qiita-image-store.s3.amazonaws.com/0/151005/3d76c9af-0a35-678c-2648-0318d259549e.gif)

・一致する情報がない時
![qiita-gif11-1.gif](https://qiita-image-store.s3.amazonaws.com/0/151005/d2a71e98-5dd1-403f-5afb-b8b81608158f.gif)


#:pushpin: 会話のシナリオ
![会話の流れ.png](https://qiita-image-store.s3.amazonaws.com/0/151005/74223869-a586-7456-52a1-e8b99283e66d.png)


#:pushpin: 設定の流れ

    1. kintoneでのアプリ作成 ◀◀◀
    
    2. SlackのWorkspaceの作成と設定
    
    3. Flow XOの設定(とSlackの追加設定) ◀◀◀


今回botの設定の流れは「[SlackとkintoneとFlow XOを使って出勤連絡ボットを作ろう！](https://developer.cybozu.io/hc/ja/articles/115005537606)」に書いてあるのと同じです。

ただ細かい設定の部分で、1のkintoneの設定や，3のFlowXOの設定が少し異なりますので、その部分はこのQiitaの記事を見て設定していただいて、2と3のSlack側の設定やFlow XOのbotの設定は ↑ の記事にとても詳細に書いておりますので、そちらを参考に設定を進めてください。

それではbot作りスタートしてみましょう♪


#:tools: 設定方法

[![設定方法](https://image.slidesharecdn.com/2-171213134016/95/slackflow-xokintonebot-1-638.jpg?cb=1513172490)](https://docs.google.com/presentation/d/1lSakWZvr2rKoHjWVPniM55hRgFubV6j77y-ckPp6ZG8/edit?usp=sharing)


#:pushpin: 終わりに
いかがでしたでしょうか？
手順多くて大変だったけど、何回かやってみると簡単にできそう！プログラミングなしでここまでできるってすごい！と思ってくださったらそれで嬉しいです。

今回作成した顧客情報検索botは、進捗検索bot、図書検索bot、案件検索bot、お昼メニュー検索botなどなど、いくらでもみなさんの業務や生活に合わせてシナリオを変更できると思います。
是非これを機にオリジナルBot作りに挑戦してみてください！

それでは以上、おんちゃんでした:star:
Railsのバージョンが上げられていたので、自分でバージョンを上げた

こんにちは、リモートワーカーです。
普段はhtmlのベースコーディングとかデザインをしています。

GitHubで管理しているプロジェクトの、Railsのバージョンが上げられていた。おそらくプログラマーさんに「私のパソコンのRailsバージョン上げて下さい＞＜」とひと言訴えればリモートでパッと解決した。
が、今年はnodeのバージョンを上げたり下げたりしたし、自分でできそう……と思い、自分でやりました。

## 2.2系から2.4系になってた

メモするの忘れた。  
いつものようにbundleしようとしたらターミナルが「2.4系がない」と言う。多分「rbenvのバージョン上げてね」と言われていたので、上げようとすると「そんなのはない」と言われる。えー。
ググったらhomebrewのアップデートからすればOKでした。

    $ brew update
    $ brew upgrade ruby-build
    $ rbenv install 2.4.2
    $ rbenv global 2.4.2

[rbenvでruby2.4.2をインストール - Qiita](https://qiita.com/paranishian/items/48553b0f301751347a15 "rbenvでruby2.4.2をインストール - Qiita")

## バージョンは上がったけどbundleできない

バージョンはすんなり上がったけど今度はbundleできない。エラーメッセージまた忘れた。
どうやらbundleというコマンドがないみたい。またググったら、bundlerをインストールすればよかった。

    $ gem install bundler

[新しいRubyのバージョンをインストールすると`bundle install`できない - Qiita](https://qiita.com/opiyo_taku/items/f4459ce4f42e18d08e28 "新しいRubyのバージョンをインストールすると`bundle install`できない - Qiita")

## で、で、で〜〜〜nokogiriだ〜〜〜

で、すんなりbundleできるようになったけど、途中でnokogiriのエラー。Sierraにしたときも手こずった思い出があり、目の前がチカチカした。言われてることを実行してもエラーが消えずにまいっていたら、これもQiitaに書いてあった。

    $ bundle config build.nokogiri --use-system-libraries

[bundle install で nokogiri をインストールしろと言われる解決方法 - Qiita](https://qiita.com/pugiemonn/items/4b23a709ed194b02be6d "bundle install で nokogiri をインストールしろと言われる解決方法 - Qiita")

初回の立ち上がりに妙に時間がかかってしまいビクついたけど、無事動いた。よかった。
URLエンコードされたファイル名を一括でデコードしてmvする

# 背景
あるシステムで日本語を含んだファイルをダウンロードするとファイル名がURLエンコードされる場合がある．
例えば，`【重要】日本人ってこういうファイル名好きすぎでしょ.txt`というファイルであれば`%E3%80%90%E9%87%8D%E8%A6%81%E3%80%91%E6%97%A5%E6%9C%AC%E4%BA%BA%E3%81%A3%E3%81%A6%E3%81%93%E3%81%86%E3%81%84%E3%81%86%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%90%8D%E5%A5%BD%E3%81%8D%E3%81%99%E3%81%8E%E3%81%A7%E3%81%97%E3%82%87.txt`となる．

このようなファイル群をターミナルからコマンド一発で良い感じに元に戻したい．

# 方法
```
find -E . -regex '^.+%[0-9A-Z][0-9A-Z]+.*' -exec bash -c "mv {} \`echo {} | nkf --url-input \`" \;
```

## 解説
1. `find -E . -regex '^.+%[0-9A-Z][0-9A-Z]+.*'`でファイル名に`%`から始まり英語大文字と数字の2回以上の繰り返しを含むファイルを検索
2. `find`の検索結果のリストが`{}`に格納される
3. `echo {} | nkf --url-input`で2.の結果をURLデコード
4. ``mv {} \`echo {} | nkf --url-input`\ `` で` ``mv {デコード前のファイル名} {デコード後のファイル名}`という動作をしてくれる

# 参考
* [clmemo@aka/find コマンドでファイル名正規表現検索](https://at-aka.blogspot.jp/2014/07/find-regex.html)
* [正規表現に合致するファイル名をfindする方法](http://progmemo.wp.xdomain.jp/archives/301)
PHPから学ぶ、脆弱性の潰し方

これは 日本情報クリエイト [Engineer's Advent Calendar 2017](https://qiita.com/advent-calendar/2017/njc) の14日目の記事です。

## はじめに

皆さんは『脆弱性』についてどの程度意識してますか？
有効な対応はできていますか？
今回はPHPの脆弱性とその修正内容から何に気をつけるべきなのか、その一例を見てみたいと思います。

## 今回見ていくPHPの脆弱性

[CVE-2017-11142](http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-11142)

__対象Ver__

- ~ 5.6.31
- ~ 7.0.17
- 7.1.x ~ 7.1.3

__内容__
長い変数を使用するとCPUを消費させDosを引き起こす可能性があります。

## 脆弱なコード

今回の脆弱なコードは `main/php_variables.c` 内に定義されている `static zend_bool add_post_var()` という関数です。

実際のコードは

```php_variables.c

typedef struct post_var_data {
	smart_str str;
	char *ptr;
	char *end;
	uint64_t cnt;
} post_var_data_t;

static zend_bool add_post_var(zval *arr, post_var_data_t *var, zend_bool eof TSRMLS_DC)
{
	char *ksep, *vsep, *val;
	size_t klen, vlen;
	/* FIXME: string-size_t */
	unsigned int new_vlen;

	if (var->ptr >= var->end) {
		return 0;
	}

	vsep = memchr(var->ptr, '&', var->end - var->ptr);
	if (!vsep) {
		if (!eof) {
			return 0;
		} else {
			vsep = var->end;
		}
	}

	/* 中略 */

	var->ptr = vsep + (vsep != var->end);
	return 1;
}
```

こちらです。
そしてこの脆弱性の修正コードは

```diff

typedef struct post_var_data {
	smart_str str;
	char *ptr;
	char *end;
	uint64_t cnt;
+
+	/* Bytes in ptr that have already been scanned for '&' */
+	size_t already_scanned;
} post_var_data_t;

static zend_bool add_post_var(zval *arr, post_var_data_t *var, zend_bool eof TSRMLS_DC)
{
-	char *ksep, *vsep, *val;
+	char *start, *ksep, *vsep, *val;
	size_t klen, vlen;
	/* FIXME: string-size_t */
	unsigned int new_vlen;

	if (var->ptr >= var->end) {
		return 0;
	}

-	vsep = memchr(var->ptr, '&', var->end - var->ptr);
+	start = var->ptr + var->already_scanned;
+	vsep = memchr(start, '&', var->end - start);
	if (!vsep) {
		if (!eof) {
+			var->already_scanned = var->end - var->ptr;
			return 0;
		} else {
			vsep = var->end;
		}
	}

	/* 中略 */

	var->ptr = vsep + (vsep != var->end);
+	var->already_scanned = 0;
	return 1;
}
```

たったのコレだけです。
では、何がいけなくて何を解決したのか見ていきましょう。

## なぜ攻撃が成立するのか？

修正の要点は

```diff
-	vsep = memchr(var->ptr, '&', var->end - var->ptr);
+	start = var->ptr + var->already_scanned;
+	vsep = memchr(start, '&', var->end - start);
```

コレですね。
修正前は、POSTデータ全体に対して[^1]文字検索しているのに対して後者は既にスキャン済みの領域に対しては検索対象から外しています。
単純な文字検索だけでDosが成立してしまうとは[^2]・・・恐ろしい。

## まとめ

当たり前のことですが、入力値はどんな値が渡されるか予め知ることはできません。
ですので、コードを書くときには予期しないデータが渡された時にどんな影響があるか今一度考えてみましょう。
思わぬところに落とし穴があるかもしれません。

[^1]: 厳密には全データを一度に検索するわけではなさそうですが、どのくらいのデータをまとめて検索するかは調べきれませんでした。
[^2]: `docker` の `php:5.6.30-apache` と `php:5.6.31-apache` のイメージを使って実験してみましたが、残念ながら再現できませんでした。
Rの正規表現

## 標準のRにおける正規表現

標準のRが使う正規表現が何なのかを説明する。正規表現そのものが何なのかについてはあんまり説明しない(各自がんばろう)。

Rでの正規表現に関する一般的なヘルプは`?regex`で参照できる(そしてこのテキストの元ネタでもある)ので、一読しておくと良い。

## 正規表現はどこで使用できるのか

Rで正規表現を扱える関数はいくつかあり、`grep`、`grepl`、`regexpr`、`gregexpr`、`sub`、`gsub`、`strsplit`などの様々な関数の内部で、テキストの抽出や置換、分割などを行うために正規表現を指定できる。

Rで使える正規表現は拡張正規表現とPerl風正規表現の2種類があるが(後述)、標準では拡張正規表現が使用される。

また、場合によってはパターンを正規表現として解釈してほしくない、ただの文字列として解釈して欲しいという場合もあるだろう。`fixed=TRUE`を指定すればパターンはパターンではなくただの文字列リテラルとして解釈される。

```r:入力
tmp <- c("abc", "*bc", ".*c")
grep(".*", tmp)
```
```r:出力
[1] 1 2 3
```
```r:入力
grep(".*", tmp, fixed=TRUE)
```
```r:出力
[1] 3
```

他にも`apropos`、`browseEnv`、`help.search`、`list.files`、`ls`などの関数でパターンの記述に正規表現が使えるが、これらは内部的に`grep`を呼び出している場合が多い。そして、これらの関数では拡張正規表現しか使えない場合が多い。

### Rが扱う正規表現の種類

前述のように標準のRでは拡張正規表現とPerl風正規表現という2種類の正規表現を使うことができる。

#### 拡張正規表現(ERE)

拡張正規表現(Extended Regular Expressions: ERE)はPOSIX 1003.2で規定されている(cf. [Regular Expressions](http://pubs.opengroup.org/onlinepubs/007904975/basedefs/xbd_chap09.html))が、Rで使われているEREは、標準のEREよりも若干拡張されている。例えばEREでは定義されていない後方参照を使うことができる。

```r:入力
tmp <- c("1234", "1212", "3434", "3456")
grep("(\\d\\d)\\1", tmp) # 2桁の数字の繰り返しにマッチ
```
```r:出力
[1] 2 3
```

これはライブラリとしてTRE(cf. [TRE — The free and portable approximate regex matching library.](https://laurikari.net/tre/))を使用していることによる。TREはPOSIX 1003.2の仕様に厳密に従っているため、標準的なEREに沿った正規表現は通るはずだが、逆にTREで通ったからといって必ずしもEREに従っているとは言い切れない。

TREは後方参照以外にもキャプチャなしの括弧`(?:`や、`(?i)`のような一部のモード修飾子の埋め込みにも対応している。つまり、`perl=TRUE`でなくともPerlっぽい記法が結構通ってしまう。TREのRoadmapには先読み・後読みのようなPerl互換記法も載っているので、将来的に`perl=TRUE`との差はもっと小さくなるかもしれない。

なお、古いバージョンのRでは基本正規表現(BRE)も扱え、`extended=`という引数によってBREとEREの切り替えができたが、現在はdeprecatedとなっている(cf.[Regular Expressions with grep, regexp and sub in the R Language](https://www.regular-expressions.info/rlanguage.html))。

#### Perl風正規表現

`perl=TRUE`の指定でRはPCREライブラリを使用するようになる。これにより、Perl 5.xの正規表現が使用可能になる(若干の違いはある)。詳しくはPCREのman([perlre - perldoc.perl.org](http://perldoc.perl.org/perlre.html))を参照のこと。

perl風正規表現を有効にすると、後先読みなどが使えるようになる。ちなみに`perl=TRUE`を指定しないままperl風正規表現を使うと`...は不正な正規表現です、理由は 'Invalid regexp'`というエラーが出る場合が多い(経験者談)。

ところで、`?regex`を読むと、Perl風正規表現を有効にした場合に使えるようになる`(?...)`記法の例として`(?i)`が真っ先に挙げてあるが、前述のようにTREは`(?i)`をサポートしているので、これは別に`perl=TRUE`を指定しなくても使える。

### パターン記述時の注意点

大抵の場合、パターンは文字列として記述することになるだろう。Rで文字列を記述する上での注意事項として、バックスラッシュを記述したい場合にはバックスラッシュ二重にする必要があるという点に注意する必要がある。

正規表現のパターン中でのエスケープとは**別に**エスケープが必要という点に注意しなければならない。つまり、もしパターン中でバックスラッシュそのものを記述したかったら、エスケープ用のバックスラッシュとバックスラッシュ本体**それぞれに**エスケープが必要なので、4つのバックスラッシュを並べる必要がある。

```r:入力
tmp <- c("\\", "\\\\", "\\\\\\", "\\\\\\\\")
grep("^\\\\$", tmp) # 単一のバックスラッシュからなる文字列を探している!!
```
```r:出力
[1] 1
```

それぞれの関数についてはまたこんど。
処理時間計測モジュールを作成してみた

# やりたいこと
ソースで速度が遅い場合に、どこの部分がボトルネックとなるかを計測したいとき
関数レベルであると、デコレータつかったり、`timeit`利用したりできるけど、
関数内で、処理Aに何秒、処理Bに何秒、...みたいに測定したい場合に利用できるものが欲しかったので作成してみました。

# ソース
- https://github.com/komorin0521/python_sandbox/blob/master/python2/timer.py
  [python2](https://github.com/komorin0521/python_sandbox/blob/master/python2/timer.py)のフォルダにもありますが、シェバン以外は全く同じです。

# 使い方


```py
from timer import Timer

timer = Timer()
timer.start('fileread')
(ファイル読み込み処理）
timer.stop('fileread')

# 指定キー(fileread) の結果が出力される
print(timer.get_result('fileread'))

timer.start('sort')
(ソート処理)
timer.stop('sort')

 # 計測したキー全ての結果が出力される
print(timer.get_all_result())
```

よければ使ってみてください！

# 2017年12月19日 追記
`show_results`関数を追加しました。

```py
timer = Timer()

timer.start("fileread")
...
timer.stop("fileread")

timer.start("sort")
...
timer.stop("sort")

timer.show_results()
```

```
fileread   : 4.004
sort       : 3.003
```

という感じにちゃんと`timer.start`とした順番で表示されるようにしてます。
Node-RED(IBM Cloud) + Google home + IFTTT だけで音声会話が可能？


# はじめに
2017年 Node-RED Advent Calendarの14日目の記事です。

タイトルからして不穏な感じで申し訳ありません。初投稿かつNode-RED初心者なのですが、検証中のところで時間切れとなり、途中結果のご報告となります。

---

# 実施したいこと
**Google home　に話しかける**
→　**IFTTT(Google Assistant + Webhooks)**　　　
　→　**IBM Cloud(Node-red)　**
　　→　**google-home-notifier（PC)　**
　　　→　**Google Homeがしゃべる**

可能ならば、その後でWatsonのAPI等を用いて、機能を拡張して行きたい。

#実施できたこと
Node-REDでデータを受け取るところまで。（後述）

現時点での知見として、そもそもGoogle HomeとIFTTTを連携させる部分が難しい。
特定のワード(”Twitter”や”Line”等)はそれなりに音声認識して連携できるが、それ以外の単語はほぼ不可能だった。

また、Twitter等のワードに続けて話をしても、タイミングの問題なのか、

「OK,　Google **Twitterで**テストを実行して」　

という会話(IFTTT連携ワード：Twitterで)も、Google Home上でうまく認識できないことが多い。
さらに、IFTTT(Webhooks)→　Node-REDについても、文字の欠落が発生する場合がある。

#1. IFTTTでの手順（簡略版)

Google Assistant 部分は省略

Webhooksについては
[Using Google Home, IFTTT and Watson IoT Platform](https://developer.ibm.com/recipes/tutorials/using-google-home-ifttt-and-watson-iot-platform/)

を参考にして、Webhooks（Make a web request）の、
Content Type (optional) はapplication/x-www-form-urlencoded　を選択
Body (optional) は、{{TextField}}　と入力後、Applet作成

#2. Node-RED(IBM Cloud)の手順

２−１ IBM Cloud(無償)のアカウント作成　　すでに利用中の場合は2-2へ
https://www.ibm.com/cloud-computing/jp/ja/bluemix/lite-account/

2-2 ダッシュボード画面の左上隅のボタンから、メニューを開いてIoTを選択し、IoT サービスの作成　を行う

2-3 左側メニューから、ボイラーテンプレートを選択後、Node-RED Starter　をクリック

2-4 Cloud Foundry アプリの作成　画面にて必要な情報を入力し、アプリ作成
注記１）　上記2-1 のサイトで、無償利用の場合は地域に「米国南部」を選択する必要があると記載されています（2017/12/13時点)
注記2) アプリ名は、URLの一部として使用されるため、英大文字等の利用は注意
また、アプリ名は全ユーザで共有されるようで、メジャーなワードは使用不可


2-5 Node-REDの編集
作成したアプリが実行中（緑色)になったら　アプリURLをクリック (実行中になるまで5分程度必要)

プラウザ上でSecure your Node-RED editorが起動するので
アカウントを入力、 node-red-dashboard を選択して　Finish

Node-RED on IBM Bluemix　が表示される
Go to your Node-RED flow editer ボタン押下 

#3 検証手順(途中)
Google　Homeに、「OK,Google Twitter テスト」　と話しかけると、Node-RED上では以下のように表示される





<img width="726" alt="スクリーンショット 2017-12-13 20.23.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/80154/314e2886-aa57-f1e3-fdfa-c671cf188c70.png">

---
# さいごに

PCとGoogle Homeの連携は事前に確認していたので、もう少しのような気もしますが、まだハマりどころがありそうです。
中途半端な内容で大変恐縮ですが、ここまで読んでいただき、ありがとうございました。
POV-Rayでの外部ファイルの読み込み

# はじめに
これは [POV-Rayによる数学お絵かき入門 Advent Calendar 2017](https://qiita.com/advent-calendar/2017/povray4math) の13日目の記事です.

povrayでは外部ファイルを読み込むためのコマンドが用意されています.
これによって他の言語で計算した結果を取り込んでPOV-Rayで可視化させる事が可能になります.
この具体例は第15回で見る予定です.

公式ドキュメントでは以下に相当しますが, 具体例に乏しいので今回に限ってはあまり参考にならないかもしれません.
http://www.povray.org/documentation/3.7.0/r3_3.html#r3_3_2_3


# 使い方
他の殆どのプログラミング言語のそれとは異なり, POV-Rayでは特定の形式のテキストファイルしか扱えません.
換言すれば, あまり自由度は高くないです.

## 読み込み可能な形式
次に外部ファイルに必要な要件を箇条書きで示します.

* ファイルはテキストファイルでカンマ`,`区切りされている必要があります.
* 各要素は 数値 / ベクトル / 文字列 の何れかである必要があります.
* カンマ前後に改行やスペースなどの空白文字が含まれていても構いません.
* ただし次のような通常のcsvファイルは正常に読み込めません. これは行末にカンマが入っていないためです.

```
2,<4,0,0>,"hoge"
3,<8,0,0>,"fuga"
5,<0,1,1>,"piyo"
```

* 行末がカンマで終わるような形式であればこれは可能です.

```
2,<4,0,0>,"hoge",
3,<8,0,0>,"fuga",
5,<0,1,1>,"piyo"
```

* 拡張子は任意です.


## 構文
以下で`#fopen`, `#read`, `defined`の使い方を説明します.

### ファイルを開く
ファイルを開くには次のように`#fopen`を使います.
ここで`FILE_HANDLE_IDENTIFIER`にはファイルを扱うための識別子が, `FILE_NAME`にはファイル名が入ります.

```Povray
#fopen FILE_HANDLE_IDENTIFIER FILE_NAME read
```

最後の`read`はファイルを読むための宣言です.

### 要素を読み込む
ファイルの要素を読み込むためには次のように`#read`を使います.
ここで`FILE_HANDLE_IDENTIFIER`は先程宣言したファイル識別子で, `DATA_IDENTIFIER`には要素の読み込み先となる識別子が入ります.

```Povray
#read(FILE_HANDLE_IDENTIFIER, DATA_IDENTIFIER1, ... , DATA_IDENTIFIERn)
```

POV-Rayでは最初の`#read`でファイルの先頭の要素が読み込まれ, 続いて読み込まれる度に要素の読み込み位置が一つずつ下がっていきます.

つまり, 最初に`#fopen`でファイルを開いた後は`#read`を繰り返せば順々に要素が読み込まれていきます.


#### 関数definedについて
さて, POV-Rayには識別子が定義されているかを調べるための関数`defined`が用意されています.
この`defined`は識別子が宣言されていれば`true`を, 宣言されていなければ`false`を返します.
([第四回](https://qiita.com/Hyrodium/items/7fb5d257e292eb81b64e#%E7%9C%9F%E5%81%BD%E5%80%A4)に見たように, POV-Rayでは真偽値は数値で表現されていたのでした)
ファイル識別子にこの関数を使えば, 読み込む要素が残っている場合に`true`を, 残っていない場合に`false`を返します.
これの有用性は後述の具体例で見ます.

### ファイルを閉じる
レンダリング処理が終われば(正確には構文解析が終われば)ファイルは自動的に閉じられます.
`#fclose`でファイルを閉じることも可能ですが, 基本的には使う必要はありません.

## 具体例
### 最初の例
次のコードを最初の例とします.

```hoge.txt
2,<4,0,0>,"hoge",
3,<8,0,0>,"fuga",
5,<0,1,1>,"piyo"
```

```
#fopen fuga "hoge.txt" read
#read(fuga,val1,vec1,str1)
#read(fuga,val2,vec2,str2)
#read(fuga,val3,vec3,str3)
```

この宣言によって`val1`, `val2`, `val3`にそれぞれ`2`, `3`, `5`が入ります.
ベクトル, 文字列についても同様です.

### 点列の描画
外部ファイルに書かれた複数の座標から, それらを中心とする複数の球面を描くには次のようにします.

```hoge.txt
<1,0,0>,<2,0,0>,<3,0,0>,<4,0,0>,<5,0,0>,
<0,1,0>,<0,2,0>,<0,3,0>,<0,4,0>,<0,5,0>,
<0,0,1>,<0,0,2>,<0,0,3>,<0,0,4>,<0,0,5>
```

```
#fopen fuga "hoge.txt" read
#while(defined(fuga))
    #read(fuga,vec)
    sphere{vec,0.1 pigment{rgb<1,0,0>}}
#end
```

![](https://i.imgur.com/229kK8A.png)

このように, `defined`を使うことで, 座標の書かれたテキストファイルから点列を描くことが出来ます.

これを応用すれば次のアニメーションを描くことが出来ます.

![](https://media.giphy.com/media/3o6gb8t4hJLhMSu3jG/giphy.gif)

これはLorentzアトラクターのアニメーションで, 色々の初期条件からアトラクターに近づく様子を表しています.

# 注意点など
## 配列
`#read`で読み込む際に配列の要素に書き込む, つまり次のように書くことは出来ません.

```
#read(fuga,ary[1])
```

配列に入れたい状況では, 次のように一時変数を利用します.

```
#read(fuga,tmp)
#declare ary[1]=tmp;
```





## 書き込み
書き込みのための`#write`も用意されていますが, あまり使わないため今回は省略しました.
詳しくは上記の公式ドキュメントを参照して下さい.
(ひょっとすると改めて書くかもしれません)

## ファイル読み込み vs インクルードファイル
筆者の場合はファイル読み込みの使用頻度が低く毎度のように構文を忘れるので, インクルードファイル(第19回予定)を直接他のプログラミング言語から出力する方が使い易く感じる事もあります.
【Google Apps Script】その9　エラーを拾う

この記事は[Google Apps Scriptを実例交えて基礎からざっくり学ぶ Advent Calendar 2017](https://qiita.com/advent-calendar/2017/gas_beginner)　9日目の記事です。

本アドベントカレンダーは@rt_pの個人プロジェクトですが、筆者は[Ateam Brides Inc. Advent Calendar 2017](https://qiita.com/advent-calendar/2017/a-t-brides)にも参加しています。そちらでも出張版記事を書いているので、覗いていただけると嬉しいです。

# はじめに

今回の記事は何のことはない、単なるtry catchです。
GASを使っていると外部サービスと連携することが多いと思うのですが、例えば外部サービスのサービスが落ちたりだとか、APIの回数制限に引っかかって定期実行がうまくいかなかったりだとか…
そういう時に、エラーがしっかりキャッチできて通知できると嬉しいですよね。

![error2.png](https://qiita-image-store.s3.amazonaws.com/0/199678/251aaf87-4c03-8cc6-9db1-9e2ec4836c36.png)

# エラーが起きるサンプル

```javascript:error.gs
function myFunction() {
  errorSample();
}

function errorSample() {
  sheet.getRange(1, 1).setValue('hoge'); // sheetが未定義なのでエラーになる
}
```

上記サンプルを実行すると、`sheet`という変数が未定義なのに`getRange()`をしようとしてエラーで怒られるはずです。

![error.png](https://qiita-image-store.s3.amazonaws.com/0/199678/19fede11-4bf7-5b98-68fc-1da29bcb0010.png)

開発中はすぐにエラーに気付けますが、例えばこのスクリプトを[昨日の記事](https://qiita.com/rf_p/items/267a8d9daa8c9f1ef027)のように1分だとか1時間だとかで定期実行していると、エラーに気付くのも遅れますよね。

一応定期実行がコケた際のメール通知は標準機能で搭載されていますが、通知タイミングも遅いので対応も遅れがちです。

# try catchでエラーをキャッチする

下記サンプルを実行すると、先程のように画面にエラーは出なくなるはずです。

```javascript:error_catch.gs
function myFunction() {
  try {
    errorSample();
  } catch (e) {
    Logger.log(e);
  }
}

function errorSample() {
  sheet.getRange(1, 1).setValue('hoge'); // sheetが未定義なのでエラーなので例外が投げられる
}
```

Ctrl+Enterでログを開くと、今回はエラーがログに吐かれているのを確認できます。

![error2.png](https://qiita-image-store.s3.amazonaws.com/0/199678/251aaf87-4c03-8cc6-9db1-9e2ec4836c36.png)

ログに吐いているのは正直サンプルとしては不適切な気もしますが:sweat_smile:
次回の記事では自動でメールを送るサンプルを紹介するので、実行に失敗したタイミングですぐにメール通知をしたり、ChatworkのAPIを叩いて通知することですぐに気付ける仕組みが作れます。

また、サンプルでも分かるようにtryブロックの中で呼んだ関数の中でエラーが起きてもしっかりキャッチできるので、`myFunction()`の中身をtry catchで大きく囲ってしまうのも、スマートなやり方には見えませんが方法としては楽だしアリなのかなと思っていたりします。

# おわりに

今回は本当にこんなことができますよ程度のシンプルな内容でした。

本アドベントカレンダーは、1日目～9日目あたりは基礎編でGASに関する基本的な操作を紹介していきます。
10日目以降は応用編ということで、実際に作ったアプリケーションとそれに関する技術の紹介になります。お楽しみに！

# 明日

[【Google Apps Script】その10　スプレッドシートにボタンを設置して、ワンクリックで郵便番号から住所を自動入力する](https://qiita.com/rf_p/items/973c4af79212cdc5c320)
となります。
スプレッドシートにボタンを設置し、クリックすることで郵便番号から住所を自動入力するスクリプトを作成します。

前の記事
[【Google Apps Script】その8　スクリプトを定期実行し、ビットコインの1分ごとの価格を自動取得する](https://qiita.com/rf_p/items/267a8d9daa8c9f1ef027)
次の記事
[【Google Apps Script】その10　スプレッドシートにボタンを設置して、ワンクリックで郵便番号から住所を自動入力する](https://qiita.com/rf_p/items/973c4af79212cdc5c320)
【Sass】mixinで引数を省略したときプロパティを出力しないようにする

たとえばこんなときに、

```scss:style.scss
@mixin foo($w, $h){
 width: $w;
 height: $h;
}

div {
 @include foo(100px);
}
```

こうなってほしい

```css:style.css
div {
 width: 100px;
}
```

##引数の初期値をnullにする
Sass(scss)では引数の後ろに初期値を指定できます。

```scss:style.scss
@mixin foo($w, $h: 50px){
 width: $w;
 height: $h;
}

div {
 @include foo(100px);
}
```

```css:style.css
div {
 width: 100px;
 height: 50px;
}
```

この初期値にnullを指定すると実装したかった動きになります。

```scss:style.scss
@mixin foo($w, $h: null){
 width: $w;
 height: $h;
}

div {
 @include foo(100px);
}
```

```css:style.css
div {
 width: 100px;
}
```

##ちなみに
引数に真偽値を指定することもできます。

```scss:style.scss
@mixin foo($w, $h: true){
 width: $w;
 @if($h){
  height: 80px;
 }
 @else {
  height: 40px;
 }
}

div {
 @include foo(100px, false);
}
```

```css:style.css
div {
 width: 100px;
 height: 40px;
}
```
Visual Studio Codeを導入してみた

# Visual Studio Codeの話
## Markdownもいける
Visual Studio CodeはMicrosoft社の提供するオープンソースのソフトウェアで、Windows/MacOS/Linux上で動作する軽量のソフトウェアです。

元はというと、Qiitaもそうですが、「自分のブログもそろそろMarkdownで書こうかな」と思って色々調べていたところに、Visual Studio Code（以下VSCode）もMarkdownに対応しているという話を見つけ、早速ダウンロードしてみたわけです。

（便利な拡張機能があったら、随時追記していきます。）

### Markdownに関して
こちらの方のが画像付きで分かりやすいです。
https://qiita.com/akira6592/items/da5271a4987eab2c7a5a

## 多くのプログラミング言語に対応
Microsoftの提供するC#/VB.Net系列だけでなく、PHP, Ruby, Pythonなど様々な言語に対応しており、それらのハイライト表示にも対応しているとのこと。

また、このMarkdown書式の.mdファイルにも対応し、プレビュー機能も備えています。これがなかなか見やすくて、完成予想図がさっと見渡せるのが良いですね。

## その他気になること
### 拡張機能
Markdownだけで探してもずらっと拡張機能が並びます。何だろう、All in Oneパッケージって。

### ショートカットやカスタマイズ
ショートカット機能やカスタマイズが豊富で、カスタマイズ設定は、
- アプリケーション全体
- ユーザーごと
- ワークスペース（VS本家のソリューションとか）ごと

という風に分かれていて、下から順に優先し上書きされていくとのこと。

### 困ったときのCtrl+P
上記のショートカットは多岐にわたるので、正直覚えていられません。

しかし、「Ctrl+P」のショートカットキーさえ覚えていれば、クイックオープンウィンドウが表示され、やりたいことを（日本語でも出来るそうですが、英語で）入力するとコマンドの候補が出てくるので、カーソルキーで選択して実行、なんてことが出来ます。

## 言語別の便利な機能
### Markdown(.md)
- プレビュー機能が標準でついている（Qiitaとかはてなブログに応用が利く）
- 「All in One」パッケージでショートカット機能などを充実させられる

### html, css
- 「View In Browser」（[こちら](https://qiita.com/84zume/items/476a29264fdc98d98201)の記事より）でプレビューを楽にできる
- Emmetという短縮入力機能で、例えば```<li>```などの入力を一気に済ませられる
企業で使われているサービスは無料で使える。そう、学生ならね。

どうも。かちおです。
学生エンジニアの皆さんは、いろいろなWebサービスやツールを使いながら開発をしていると思います。
今回はそんな便利なサービスを、学生の間だけ無料で使う方法をいくつか紹介していきたいと思います。

# 学生の優遇について

クラウドサービスやビジネスツール、CIなど、特に海外で有名なものは、学生の開発を支援する取り組みがあります。
殆どのものが、学生の申請をすれば、有料のサブスクリプションを無料で利用できるようになったり、サービスで使えるクーポンコードなどを付与したりなどの方法を取っています。

それでは、さっそく見ていきましょう。

# Github Education

https://education.github.com/

githubでは、githubを利用する学生に向けて、プライベートリポジトリを無料で使えるようにするGithub Educationという仕組みがあります。

これに応募するには、学校発行のメールアドレスと簡単な英作文が必要になります。
自分は「学校の人たちでgithub使ってるんだけどいろいろと外部に公開できないコードかいたりするんだよね(意訳)」みたいなことを2行で英作文したら通りました。

また、Github Educationは、他の学生向け優遇の前提になっていることが多いです。とりあえず取得しておきましょう。

# AWS Educate (Amazon Web Service)

https://aws.amazon.com/jp/education/awseducate/

AWSには、AWS Educateというものがあります。学校にもよりますが、数千〜数万円分のクレジットをチャージしてくれます。またGithub Educationに参加していると、さらに数千円分クレジットをもらうことができるようです。(Github Educationのdeveloper packページからプロモコードを取得可能)

# Degital Ocean

https://www.digitalocean.com/community/questions/education-academic-deals

VPSで有名なDegital Pceanでは、これまたGithub Educationに参加していると$50分のクレジットをもらうことができます。

# Gitkraken

https://www.gitkraken.com/github-student-developer-pack

GitのGUIソフトで有名なGitkrakenでは、プロアカウントを無料で一年間利用できます。
これもGithub Educationに参加している必要があります。

# Sendgrid

https://sendgrid.com/partner/github-education

メールアドレスの運用やSMTPサーバーなどのSaaSが利用できるSendgridでは、プロエディションの機能が無料で利用できるようになります。これもGithub Educationを利用していることが前提になっています。

# Stripe

https://stripe.com

難しい実装をせずに、簡単にクレジットカード払いなどの決済をサービスに導入できるStripeでは、10万円までの決済なら手数料が免除されるようになります。

# TravisCI

CI（継続的インテグレーション）ツールであるTravisCIでは、通常有料であるプライベートリポジトリのCIを無料で使えるようになります。Github Educationへの参加が前提です。

# Atlassian Classroom

バグの管理やアジャイル開発のJiraやhipchat、trelloで有名なAtlassianでは、Atlassianのサービスを授業に取り入れることができるAtlassian Classroomを提供しています。学校ごとの申込みが必要です。

# Google for Education

https://edu.google.com/intl/ja/

Google for Educationでは、DriveやGmail、その他Google系サービスの有料プランであるG suiteを、無償で利用することができます。Google for Educationは学校や研究室単位で申し込まなければいけないので、導入は大変ですが、作業効率化でいうとたぶん相当効果があるはずです。

# Microsoft Imagine

https://imagine.microsoft.com/ja-jp/account

Microsoft Imagineは、Microsoftが販売する様々な有料ソフトを無償で利用できるツールです。
**(一部機能が制限されていますが)**Azureを始め、SQL ServerやWindows 8、Windows Server 2016などを利用できます。

# 最後に

ここで紹介したサービスは、実際のIT企業の現場に取り入れられているものです。
もちろん個人の趣味の開発に取り入れ、効率よく開発をすることもできますが、サービスの使い方を学ぶことで、これからのインターン、就職にも役に立つようになります。
せっかくの学生期間です。遠慮せずさまざまな有料サービスを使ってみましょう！
MySQLに4byte文字を格納するまで

文字コード`utfmb4`の設定が各所になされていないMySQLに4byte文字をインサートしようとすると
エラーが吐かれず、それ以降の文字列が途切れるので注意が必要。

# UTF-8で4byte判定される文字
#### JIS X 0213の第3・4水準漢字の一部
https://www.softel.co.jp/blogs/tech/archives/596
#### 絵文字
http://www.unicode.org/charts/PDF/U1F300.pdf
http://www.unicode.org/charts/PDF/U1F600.pdf
#### 中国漢字
http://www.fileformat.info/info/unicode/block/cjk_unified_ideographs_extension_b/utf8test.htm
http://www.unicode.org/charts/PDF/U4E00.pdf

# 各種設定
### MySQLのデフォルト設定
`utf8mb4`が対応されているのはMySQL 5.5以降なので、確認する。

```
[root@localhost]# mysql -v
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 735
Server version: 5.6.34-79.1-log Percona Server (GPL), Release 79.1, Revision 1c589f9
```

`my.cnf`（MySQLの設定ファイル）で下記を設定する。

```
[mysqld]
character-set-server = utf8mb4
skip-character-set-client-handshake

[client]
default-character-set=utf8mb4
```

MySQLを再起動して設定を確認する。

```
mysql> SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';
+--------------------------+--------------------+
| Variable_name            | Value              |
+--------------------------+--------------------+
| character_set_client     | utf8mb4            |
| character_set_connection | utf8mb4            |
| character_set_database   | utf8mb4            |
| character_set_filesystem | binary             |
| character_set_results    | utf8mb4            |
| character_set_server     | utf8mb4            |
| character_set_system     | utf8               |
| collation_connection     | utf8mb4_general_ci |
| collation_database       | utf8mb4_general_ci |
| collation_server         | utf8mb4_general_ci |
+--------------------------+--------------------+
10 rows in set (0.00 sec)
```

### 格納したいデータベース、テーブルも4byte文字の受け入れ態勢を整える
Laravelの場合、下記にて`set names $charset`と`collate $collation`をしている
https://github.com/laravel/framework/blob/5.2/src/Illuminate/Database/Connectors/MySqlConnector.php#L15

```
        'mysql' => [
            (略)
            'charset'   => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
　　　　　　 (略)
        ],
```

それぞれ`utf8mb4`が含まれる設定をした後
`Illuminate\Support\Facades\Schema::create`
でテーブル作成をすればvarcharカラムの照合順序は`utf8mb4`になる

# 結果
格納できた。

![キャプチャ1213.JPG](https://qiita-image-store.s3.amazonaws.com/0/220884/5636337e-3e31-b206-5d31-b880cd8b3df4.jpeg)

# 参考
[UTF8の4byte文字まとめ](https://hacknote.jp/archives/11195/ "UTF8の4byte文字まとめ")

# あとがき
ユーザーが絵文字を使うサービスは、DBのバージョンが問われるのである.
モブ検証をやってみました

SRA Advent Calendar 2017の19日目です。
関西事業部のなんぶです。
私事ですが、本日(12/19)に41歳になりました。
去年は12/19の予約を取り忘れてましたが、今年はしっかりGetです。

さて今年は、私が所属している第三者検証チームでの作業から記事を書きたいと思います。
モブプログラミングを真似て、「モブ検証」を試みたので、その紹介です。

# モブプログラミングとは。。。
- [モブプログラミングを実際にやってみた](https://qiita.com/TAKAKING22/items/31e027dfb6ea8b1a8d69)

を参照してみてください。
他にもたくさん記事がありました。

# ■Y：やったこと
モブプログラミングを第三者検証に応用してコードインスペクションを実施してみました

![やったこと.PNG](https://qiita-image-store.s3.amazonaws.com/0/154223/f407a0bc-7bdf-2720-0f4b-1df309d2ae6d.png)

# ■W：わかったこと

[前向き意見]
- 楽しかった
- 多角的視点で確認できたので、結果に自信が持てた
- 自分の知らない機能について知ることが出来た
- 新規参画者への導入に向いていそう
- 緊急を要する場合、難易度が高そうな場合のコードインスペクションに向いていそう

[課題]
- 集まったメンバ全員が不慣れな機能だと迷子になる
- 解像度の低いプロジェクターだとやりづらい
- 時間が短かった

# ■T：次にやること
- ドライバーの持ち回り
　⇒ 今回は初の試みだったので、持ち回りをしませんでした
- 事前準備なしでのモブ検証

と、自分的にも面白かったし、チーム内でも好評だったので、継続的に実施していきたいと思いました。
PythonでGitBucketのIssueをExcel出力する（その後）

前回まででPythonでGitBucketのIssueをExcel出力できるようになりました。その後、実際に利用してみて少し問題が出てきたので、その内容について紹介したいと思います。

* [PythonでGitBucketのIssueをExcel出力する（API呼び出し編）](https://qiita.com/5zm/items/57d7abca8e0d447e326d) 
* [PythonでGitBucketのIssueをExcel出力する（Excel出力編）](https://qiita.com/5zm/items/282956dbc1b4f6813108) 

## 1ページが最大25件で全Issueが取得できない

最初はIssueが少ないので気付かなかったのですが、GitBucketのIssueのAPIは1ページが最大25件でした。そして**GitBucketに全Issueを対象とするstate=allは未実装でしたが、[ページサイズを変更するper_pageパラメータ](https://developer.github.com/v3/#pagination)も未実装でした。**
ということで25件を超える場合は地道にページング（ページを指定して取得）する必要があります。

```console:ページを指定してIssueを取得するAPIのURL
set ISSUES_URL=http://localhost:8888/api/v3/repos/demouser/testrepo/issues?state=closed^&page=2
```

あと`&`はbat（Windowsコマンドプロンプト）で引数を意味するので、`^`でエスケープする必要があります。環境変数からURLを取得する方法は再検討した方がよさそうです。

## ヘッダー行に色を着けたい

せっかくExcelにしたので見た目も分かりやすくしたくなりました。
一覧のヘッダー行に色を着ける方法です。
ここでは背景色が青（#538DD5）で文字色が白としました。

```python:背景色を設定する方法（セルフォーマットの設定）
# ★ポイント1　：　セル書式の設定
headerFormat = workbook.add_format()
headerFormat.set_pattern(1)
headerFormat.set_bg_color('#538DD5')
headerFormat.set_font_color('white')

# ★ポイント2　：　作成したセル書式を設定
worksheet.write(rowNum, 0, unicode('issue番号', 'utf-8'), headerFormat)
```

## 1セルに設定する文字が255文字を超過してエラーになった

Issueの本文にたくさん書き込んでいたものは、Excelの1セル255文字制限に引っ掛かってしまいました。
この場合エラーメッセージが出力されますが、上限一杯の文字まではセルに反映されます。

この問題はExcelと同じくセル結合することで解決できます。
xlsxwriterでセル結合するには`merge_range()`を利用します。

```python:セルを結合する方法
# ★ポイント3　：　同じ行の6列と7列を結合
worksheet.merge_range(rowNum, 6, rowNum, 7, unicode('本文', 'utf-8'), headerFormat)
```