OmniAICreator/Qiita-1.07M huggingface dataset:
Google Home + IFTTT で Twitter に画像付きツイートする

Google Home Mini を購入しました。
早速 Chromecast に命令したりして遊びましたが、
やっぱり自分で何か作りたい。最終的には電気とか操作したいです。

今回は手始めに Google Home に何か言ったら、
Twitter にツイートする。をやります。

## 事前準備

- Google Home Mini
- IFTTT
- Twitter

## 事前確認

前に IFTTT 使った時に使った Twitter アカウントなんだったっけなーと。。。
設定が全然見つからなくて困りました。

`My Applets -> Service -> Twitter` で `Setting` から行くんですね。
アカウントの設定を一生懸命探してました:cry:

- IFTTT
    - Twitterの設定確認
        - https://ifttt.com/services/twitter/settings
    - Google Assistant の設定確認
        - https://ifttt.com/services/google_assistant/settings

連携されて無い場合は、このあと
`This` , `That` を作る際にアプリ連携を言われるかと。

## Applet 作成

久々に IFTTT 使ったのでかなり画面が変わってるような～。。。

### New Applet

<img src="https://qiita-image-store.s3.amazonaws.com/0/53393/d527f807-27d2-0215-50d2-5b667c8d3e49.png" width="500" alt="" />

`My Applets -> Applets -> New Applet` で新規 Applet を作成

### This (Google Assistant)

<img src="https://qiita-image-store.s3.amazonaws.com/0/53393/b8c97025-6de7-4dcc-8c26-715a05c8da1b.png" width="500" alt="" />

上記 `This` をクリック。

<img src="https://qiita-image-store.s3.amazonaws.com/0/53393/9fd0149e-aad9-2d41-f8ab-6b1f24c0239a.png" width="500" alt="" />

そして `Google Assistant` を検索して選択

<img src="https://qiita-image-store.s3.amazonaws.com/0/53393/3abdcb43-3e08-331f-1031-d2f786cb8e71.png" width="500" alt="" />

今回はシンプルな `Say a simple phrase` をトリガーとします。

<img src="https://qiita-image-store.s3.amazonaws.com/0/53393/05f51444-bacd-c15e-6b52-c8b082ce812d.png" width="500" alt="" />

トリガーのフィールドを埋めていき `Create trigger` で完了。
音声認識は変換も(?)完全にマッチしないといけないようで、候補を何個か入れられます。

今回はポルンガを呼び出します。

### That (Twitter)

<img src="https://qiita-image-store.s3.amazonaws.com/0/53393/954d6eeb-c1e1-0281-7eb5-c6804b0541f0.png" width="500" alt="" />

上記 `That` をクリック

<img src="https://qiita-image-store.s3.amazonaws.com/0/53393/7a3f1c15-3e30-2cad-de71-79c98131e96f.png" width="500" alt="" />

そして `Twitter` を検索して選択

<img src="https://qiita-image-store.s3.amazonaws.com/0/53393/79fcaa54-af81-158b-eb29-9ce23fb620c0.png" width="500" alt="" />

今回は、ポルンガを呼び出しますので、
`Post a tweet with image` をアクションとします。

<img src="https://qiita-image-store.s3.amazonaws.com/0/53393/f698e1ba-fde4-e948-2bc9-7c7658f31bbc.png" width="500" alt="" />

トリガーの時と同じようにフィールドを埋めて、
`Create action` で完了

### Applet 名を決める

<img src="https://qiita-image-store.s3.amazonaws.com/0/53393/665cdd07-5bd4-3bfe-efe8-bb39bda2a471.png" width="500" alt="" />

Finish!!!

## OK Google, タッカラプトポッポルンガプピリットパロ

<img src="https://qiita-image-store.s3.amazonaws.com/0/53393/6cce4e38-5dec-59d6-b94d-18fae0a8098d.png" width="500" alt="" />

Google Home さんも「ツイッター上でポルンガを呼び出しました」と言ってくれました。

## 今後の予定

- Actions on Google を使う
- 神龍を呼び出すと電気が消えて暗くなる
- ホログラムで神龍出現

がやりたい。

## 参考

IFTTT で Google Assistant をトリガーにする際に参考にさせて頂きました。ありがとうございます。

[Google Home＋IFTTTで、お手軽に家電コントロール](https://qiita.com/kazunori279/items/e3485f00fbe0ad85cce2)
「『かき』は9画、『こけら』は8画」とは言い切れない

漢字のトリビアでこんなの聞いたことはありませんか。
「こけら落とし（劇場の初公演）は漢字で『柿落とし』と書くが、この『柿』は果樹の『柿』の字とは違う」
というもの。

『かき』は9画、『こけら』は8画説
---
![スクリーンショット 2017-11-28 23.12.41.png](https://qiita-image-store.s3.amazonaws.com/0/2852/6b4a9b08-9bab-e753-3e75-57013143446e.png)

上の図のように、木偏に市と書く9画の字が果物のかき、似ているけど縦棒が上から下まで突き抜けているので8画なのがこけら、という説明がよくされます。「かき こけら」でぐぐってみてください。この図のような説明図が大量に出てきます。

実際、文字の成り立ちをたどるとこの説はおかしくありません。市（5画）を音符とするかきはシと音読みし、巿（4画）を音符とするこけらはハイと音読みします。しかし、成り立ちだけで字形を決めるわけにいかないのが漢字。例えば肺はハイと音読みするとおり巿（4画）を音符としていたはずなのですが今は完全につくりを市（5画）とする字形になっています。10^24を意味する𥝱（ジョ）にいたっては市（5画）を音符としていたはずのに書き間違えから予で定着してしまいました。
成り立ちだけでなく、実際どう書かれている（きた）かも重要なのです。

歴史的にどう書かれてきたか、それはわれらがJISがJISコードを定めるにあたって調査してくれました。

字形揺れ
---
JISコードは、文字を収載した根拠をちゃんと記録に残して公開しています。
結論から言うとかきとこけらは19区33点「柿」の一字に包摂されたのですが、そう判断された経緯もJIS X0208の附属書7に書かれており、多くの文献から事例を引いています。

9画の字形をA型、8画の字形をB型とここでは呼んでいるのですが、

| 文献 | 時代 | かき | こけら | |
|---|---|---|---|---|
|龍龕手鏡|遼代|B型（と附属書7にはありますがA型に見えますね⋯）|別字形|![龍龕手鏡.png](https://qiita-image-store.s3.amazonaws.com/0/2852/92d10795-70d2-660f-200d-2e4230a9b1d0.png)|
|五経文字|唐代|別字形（龍龕手鏡のこけらの字形）|B型|![五経文字.png](https://qiita-image-store.s3.amazonaws.com/0/2852/033b3f86-15a3-cf6c-6599-3d61634c8eab.png)|
|色葉字類抄|平安時代|A型|B型|![色葉字類抄.png](https://qiita-image-store.s3.amazonaws.com/0/2852/b84ec3eb-75cb-debf-aa11-858f3a723cba.png)|
|新撰字鏡|平安時代|A型でもB型でも同じと記載||![新撰字鏡.png](https://qiita-image-store.s3.amazonaws.com/0/2852/267e6750-e554-7b23-3378-3dff7ff05bde.png)|
|清原宜賢自筆本|室町時代|A型|A型|![清原宜賢自筆本.png](https://qiita-image-store.s3.amazonaws.com/0/2852/63483be3-d565-d8cd-8a37-ff03825e52ee.png)|
|康熙字典|　清代|別字形（枾）|A型|![康熙字典.png](https://qiita-image-store.s3.amazonaws.com/0/2852/bac57756-3211-bce7-eebe-ec03e84566a2.png)|

かき・こけらを異なる字とし字形も別とする文献も多いながら字形には揺れがあり、字形揺れの範囲はかぶっています。これはJISの資料にはない解釈ですが、広義の同形異字というべきかもしれません。

JISコードは同形異字を容赦なく一字に包摂します。23区61点「芸」なんかそうですね。字形の差が歴史的に明確でなかったかき・こけらはJISコード的には包摂対象でした。実際の書かれ方という観点からするとかきはA型字形、こけらはB型字形なのだとは言い切れないのです。

今後誰かに「『かき』は9画、『こけら』は8画」という蘊蓄を聞かされることがあるかもしれません。そのときは（成り立ちだけを考えたらね）と心の中でつぶやくのがよろしかろうと存じます。
xmlからcsvへの変換（xsltprocコマンド）

職場にて、古くからあるxml形式で保存されている表形式の定義ファイルを
DBに格納するためにcsv形式に変換にしたいが、やり方がわからないと部下に泣きつかれ、
10年ほど昔にXML資格試験の勉強したなぁと懐かしくなりつつ、
xmlの変換方法を調べたので、備忘もかねて記載します。

細かいxsl記載方法については、後日余裕があれば記載しなおします。

準備するファイル
1. 読み込むxmlファイル（test.xml）
2. 上記xmlファイルをparseしてcsv変換するXML定義：xsltファイル(csv.xsl)

前提環境：CentOS 7.x
利用コマンド：xsltproc


test.xmlの内容は以下の通りとします。


```xml
<?xml version="1.0" encoding="utf-8"?>
<root>
  <path>/tmp</path>
  <as>
    <a>
      <name>1</name>
      <al>abc</al>
      <date>2008-01-01</date>
    </a>
    <a>
      <name>2</name>
      <al>efg</al>
      <date>2009-01-01</date>
    </a>
    <a>
      <name>3</name>
      <al>xyz</al>
      <date>2010-01-01</date>
    </a>
  </as>
</root>
```

/root/as/a　パス配下が表にかかわる定義で、name,al,dateといった列があるという前提です。
今回のパターンでは３パターンある状態です。

```xml
   <path>/tmp</path>
```
については、/root/pathについては読み取らないことを確認するためのダミーデータとしています。

上記xmlファイルをcsv変換するXML定義（csv.xsl）を以下の通りに作ります。


```xml
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text" encoding="utf-8" />

  <xsl:param name="delim" select="','" />
  <xsl:param name="break" select="'
'" />

  <xsl:template match="/">
    <xsl:apply-templates select="root/as/a" />
  </xsl:template>

  <xsl:template match="a">
    <xsl:apply-templates />
    <xsl:value-of select="$break" />
      <xsl:text>
</xsl:text>
  </xsl:template>

  <xsl:template match="*">
    <xsl:value-of select="text()" />
    <xsl:if test="following-sibling::*">
      <xsl:value-of select="$delim" />
    </xsl:if>
  </xsl:template>

  <xsl:template match="text()" />
</xsl:stylesheet>
```


（xslの詳細のリンク先をのちに貼ります。）




２つのファイルを準備したうえで、以下のコマンドを入力して、標準出力に出力します。
ファイル出力する場合は、リダイレクトで出力ファイルを出力するとよいでしょう。

```console
$ xsltproc csv.xsl test.xml
```

出力結果は以下のようになりますので、DBに入れるなり、EXCELで処理するなり、
実施しやすくなると思います。

```
1,abc,2008-01-01
2,efg,2009-01-01
3,xyz,2010-01-01
```
今年のMA応募作品のアルコール濃度を勝手に判定してみる

泥酔ポータルZというアルコール系のサイトを運営してるのですが、しばらく筆が止まってるので、Mashup Awards応募作品を見ながらネタ探しをしてみようかと思います。

* * *

# SENSYソムリエ for Pepper
https://hacklog.jp/works/51805

- 酒の好みを入力すると最適な一本を選んでくれるSENSYソムリエ。
- ムービーを見てみると、なるほどAIに判断してもらった内容は人間に読み上げてもらうより、Pepperに読み上げてもらったほうがしっくりくる。
- もし泥酔ポータル賞を贈るとしたら、これかな。

* * *

# 一見さんいらっしゃい
https://hacklog.jp/works/51973

- 紹介がないと入りにくいお店を紹介するシステム。
- 作者は、、、え！すがやみつる！
- 「自分が本当に好きなお店や場所は、秘密にしときたいんじゃないの？　あるいは、特定の人とだけ行きたいんじゃないの？」という問題提起、共感できます。
- ムービーも味がある！

* * *

# かんぱーい！ヨシノリくん
https://hacklog.jp/works/52528

- 飲み会中に『誰かがスベった時』や『話題が無くなって沈黙が生まれた時』にその場のまずい空気を察知し、みんなが一気に盛り上がるような『かんぱーい』の発声
- アイデア段階とのことだが、実装するとしたら、音量？それとも音声認識？

* * *

# グローバルKANPAIツールキット
https://hacklog.jp/works/50370

- 画面を傾けるとビールが注がれる音がながれるアプリ。
- 触感表現ツールキットを使っているというのも気になる。

* * *

# 摂取IoTデバイス
https://hacklog.jp/works/52924

- お酒を飲んだ量を計測し、Twitterにツイート
- ムービーを見てたら「始発なら相方にばれない」とか、酔っぱらいのようなことを言ってますが、大丈夫なんでしょうか。

* * *

# ku-haku
https://hacklog.jp/works/51523

- 最後に、私が作った「写真も口コミもない店」だけ表示するグルメサイト
- 口コミに踊らされず、自分の味覚だけを信じて食事を楽しめます
- レンタル自転車と組み合わせると楽しいですが、飲んだら自転車に載っちゃだめですよ〜

* * *

失礼しました〜
PDFのサムネイルを作成する

今回はImageMagickで作成しますが、今後JavaScriptのpdf.jsを使用して試してみたいと思います。
http://mozilla.github.io/pdf.js/api/draft/PDFJS.html
[pdf.js版](https://qiita.com/horikeso/items/3acce0cbd1efae05345f)作りました。



# インストール

前提：phpと一緒にphp-pearがインストール済み

```
# ImageMagick

yum -y install ImageMagick ImageMagick-devel

# ImageMagick for php
# printf "\n" means press Enter (Please provide the prefix of Imagemagick installation)

printf "\n" | pecl install imagick
sed -i -e '$ a \\n[PECL]\nextension=imagick.so'  ${PHPINI_PATH}
```

# ソース

```php
try
{
    $imagick = new Imagick();
    $result_flag1 = $imagick->readimage($file_path . '[0]');// $file_pathはPDFの場所1ページ目のみ読み込む
    $result_flag2 = $imagick->setIteratorIndex(0);// 1ページ目
    $result_flag3 = $imagick->setImageFormat('jpeg');
    $result_flag4 = $imagick->setImageBackgroundColor('#FFFFFF');// jpegで背景が黒くなる場合の対応
    $imagick = $imagick->mergeImageLayers(Imagick::LAYERMETHOD_FLATTEN);// 背景レイヤー合成
    $image_info = $imagick->getImageGeometry();
    $result_flag5 = $image_info['width'] <= $image_info['height']
                    ? $imagick->resizeImage(0, 170, Imagick::FILTER_LANCZOS, 1)// 縦長 アスペクト比維持してリサイズ
                    : $imagick->resizeImage(240, 0, Imagick::FILTER_LANCZOS, 1);// 横長 アスペクト比維持してリサイズ
    $result_flag6 = $imagick->writeimage($thumbnail_path . 'thumbnail.jpg');// $thumbnail_pathは保存場所
    $imagick->clear();
}
catch (ImagickException $exception)
{
    throw new RuntimeException('サムネイル画像の作成に失敗しました。', 0, $exception);
}

if ( ! $result_flag1 || ! $result_flag2 || ! $result_flag3 || ! $result_flag4 || ! $result_flag5 || ! $result_flag6)
{
    throw new RuntimeException('サムネイル画像の作成に失敗しました。');
}
```

# 参考
http://php.net/manual/ja/imagick.readimage.php
http://php.net/manual/ja/imagick.resizeimage.php
powershellは拡張メソッドを使えない...どうする？

C#の場合、LINQの拡張メソッド機能を使用して簡単にコードを記述できる

```Example.cs
using System.Collections.Generic;
using System.Linq;

namespace ConsoleApp1 {
    class Program {
        static void Main(string[] args) {
           //実際に使用できる
           List<int> list =  Enumerable.Range(0, 10).Where(i => i % 2 == 0).Select(i => i * 2).ToList();
        }
    }
}

```
ところが、powershellの場合(5.0以降であっても)拡張メソッドを使用することはできない

```Example.ps1
 #このような式は使用できない
 [List[int]]$list = [Enumerable]::Range(0,10).Where({ $args[0] % 2 -eq 0 }).Select({ $args[0] * 2 }).ToList();
```

#解決策1:拡張メソッドとしてではなく、通常のstaticメソッドとしてLINQを使用する

```Example.ps1
using namespace System.Collections.Generic;
using namespace System.Linq;

 #powershell5.0以降であれば、usingを使用できる。
 #使用できない場合は、[System.Linq.Enumerable]とする。余計長くなってしまう。
 [List[int]]$list = [Enumerable]::ToList([Enumerable]::Select([Enumerable]::Where([Enumerable]::Range(0,10),[Func[int,bool]]{ $args[0] -eq 2 }),[Func[int,int]]{ $args[0] * 2 }));
```

#解決策2:拡張メソッド風のクラスを宣言して疑似的にLINQにする

```Example.ps1
using namespace System.Collections.Generic;
using namespace System.Linq;

#型宣言部分。記述量全体でいうと、かえって増えてしまう
class E
{
  [IEnumerable[int]]$inner; 
  E([IEnumerable[int]]$x){
    $this.inner = $x;
  }

  static [E] Range([int]$x,[int]$y){
    [E]$r = [E]::New([Enumerable]::Range($x,$y));
    return $r;
  }
  [E]Where([Func[int,bool]]$y){
    $this.inner = [Enumerable]::Where($this.inner,$y);
    return $this;
  }
  [E]Select([Func[int,int]]$y){
    $this.inner = [Enumerable]::Select($this.inner,$y);
    return $this;
  }
  [List[int]]ToList(){
    return [Enumerable]::ToList($this.inner);
  }
}

 #本体部分。本体はLINQのように短く記述できるが、単純にパイプのほうが効果的かもしれない
 [List[int]]$list = [E]::Range(0,10).Where({ $args[0] % 2 -eq 0 }).Select({ $args[0] * 2 }).ToList();
```
Visual Studio Team Service で MavenプロジェクトのCIを設定してみる

##概要
Visual Stuido Team Services(VSTS)を使ってCI(Continuous Integration)を思い出しながらやってみたので手順をメモとして残しておく

##VSTSとは
開発プロジェクトやアプリケーションライフサイクルを管理するクラウドサービスです
下記参考サイト
https://www.microsoft.com/ja-jp/dev/products/visual-studio-online.aspx
https://www.visualstudio.com/ja-jp


##内容
GUI上からCIの設定を行ってみる
最近はymlファイルを読み込んで設定も出来るようになったらしいが今回は保留

##手順
VSTS上から該当のプロジェクトを「Build and Release」を選択する
※今回はJavaProject上のgitに対象のソースもpushしています
![image.png](https://qiita-image-store.s3.amazonaws.com/0/217019/37d0268d-95bf-84eb-7278-df2b766103b8.png)

Buildの一覧が表示されるがまだ何もない為、「+New」を選択する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/217019/ec964496-5e4d-f856-39cb-479d767d8513.png)

Template一覧が表示されるので「Maven」を検索してApplyを選択する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/217019/e51fb800-9418-7d8a-6d5d-6252310dec29.png)

Templateのタスク一覧が表示されるので独自にカスタマイズしていく
![image.png](https://qiita-image-store.s3.amazonaws.com/0/217019/2b29625e-c728-e730-3887-f467a2efaa1d.png)

カスタマイズした結果がこれ
全体としてはmavenのタスクを追加しただけ
画面に見えているAgent queueはlinuxを選択…どうやらbuildを行う環境みたいで他にもwindowsなどの環境もあった
![image.png](https://qiita-image-store.s3.amazonaws.com/0/217019/441748ea-1e58-3f25-cac0-99ee72fc509d.png)

Mavenタスクはこんな感じ
せっかくなのでjacocoを使ってテストカバレッジレポートを出してみた
VSTSの設定自体はCodeCoverageToolでJacocoを選択しただけ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/217019/01fcf181-bce9-47e0-3df6-aedb62b32ad7.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/217019/d31f8297-2ebd-cf6f-20bc-8b37f2519c4e.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/217019/1c0ff3d8-da8f-e7a4-bd59-1f093548e6cc.png)
jacocoについてはこちらを参照にさせて頂いた
https://ishiis.net/2016/10/13/jacoco-coverage/

設定が完了したので保存してqueueしてみる
![image.png](https://qiita-image-store.s3.amazonaws.com/0/217019/9bae9aaf-67e7-3913-0336-1b496d8a379d.png)

##結果
もりもりビルドとテストが実行されている…
![image.png](https://qiita-image-store.s3.amazonaws.com/0/217019/d988ab49-205c-22c5-78a1-b983406591e6.png)

完了
![image.png](https://qiita-image-store.s3.amazonaws.com/0/217019/422153a8-e74a-a3e6-ecc6-8d291b916f95.png)

結果のサマリーを確認するとカバレッジが表示されている
![image.png](https://qiita-image-store.s3.amazonaws.com/0/217019/b8e1b2a0-c1f5-97aa-e568-10a0494cfc8c.png)
※一部テスト不備で失敗したので、サマリーは成功時のを掲載しています

##補足
- CIのタスクに関しては、スケジュール実行や特定のbranchにpushがあったときなど
様々なトリガーが設定できる模様
これで開発してpushしたときに自分のソースに問題がないかすぐに発見できる

##今後の予定
今回はmavenのbuild,自動テスト実行,テストカバレッジの表示までを行った
- Build後にDocker imageを作成してACRにpushするところまでをやってみる

##ハマった点
- jacocoレポートが表示されなかった
    - これは単純に自分のpomの書きかたがよくなかっただけっぽい...下記のサイトを参考にさせて頂きました
    http://d.hatena.ne.jp/yamap_55/20140727/1406438741
スクラムをうまく機能させるためのタスク分解

「スクラムを導入してみたけれどうまくいかなかった or 続かなかった」という話をよく聞きます。うまく続けるためのポイントとして、今回はタスク分解についてまとめました。

# 前提
## 私たちのチームの環境
エンジニア6名、デザイナー2名のチームで1週間で1スプリントのペースで実施しています。

## タスク分解とは？
スプリントで行う開発項目をタスク（スクラムガイドでは「作業」と呼んでいます）に分解する作業を指します。分解作業はスプリントプランニングで行うことが多いですが、スプリントの途中で行うこともあります。

# タスク分解のポイント
## チーム全員で行う
「××の開発項目は○○さんに任せます」といった専任状態を作らず、全員でタスク分解をしましょう。設計・実装方針を皆で考えることにより、方針のブレや間違いを早期に発見できる上、作成する機能に対しての共通認識をチーム内で作ることができます。

## タスクを小さく保つ
スクラムガイドでは「作業の単位は1日以下にすることが多い。」とありますが、私たちのチームでは1~2時間まで小さくするように心がけています。
3~5時間のタスクが作成された時には、実際の作業時間がブレてしまうことが多い（何故か大きくなることの方が多い。。）ため、さらに分解ができないか、チームで検討しましょう。初めのうちは「こんなに細かく分解しなくても良いのに。。」と思うぐらいがちょうど良いです。小さく分割することができると、スプリント中に設計等で迷う時間が減り、より実装に集中しやすい状態が作れます。

## 不明瞭なタスクをそのままにしない
プランニング時点では、必要な作業内容や時間が正確に見積もれないことも多いです。タスクの詳細な内容がわからないままスプリントがスタートした時は、詳細な内容が見積れるようになった時点で、タスクの見直しをしましょう。予想よりタスクが膨れ上がってしまった時なども同様です。バーンダウンチャートなどで残り時間を管理しているチームでは、スプリントの途中で時間が大きくなってしまうことを、ネガティブに感じてしまうかもしれないですが、実際の進捗が見える方が重要です。

# タスク分解がうまくできた時のメリット
実際に私たちのチームで運用している際には以下のような良いことがありました。

## タスク分解の時点でチームメンバーの認識が揃う
前述の通り、メンバー全員でのタスク分解がうまくできていると、スプリントが始まる時点で共通認識が作れているため、スプリント中の共同作業やタスクの受け渡しがスムーズにできるようになります。

## チームの進捗が見えるようになる
1つのタスクが大きい時は、メンバーの作業に問題が発生していても気づけないこともあるため、フォローが遅れてしまうことがあります。タスクが1~2時間の大きさで分割できていると、進捗が悪いメンバーがいた時にはデイリースクラムでの進捗報告ですぐにわかるため、チームでのフォローや対策が素早く立てられるようになります。

## 複数人での作業がやりやすくなる
作業量が多かったり、重要度の高い開発項目はペースを上げるために、複数人体制を作る必要が出てきますが、作りかけの機能の開発に途中から参加するのは難易度が高く、結局1人に任せてしまったり、複数人で取り組んでもペースが上がらないこともあります。
タスク分解が細かくできている & メンバー間で共通認識ができていると、スムーズに共同作業ができます。

# まとめ
スプリント中の開発作業をスムーズに進めるためのタスク分解のコツをまとめました。上手にタスクを分解してスプリントを効率よく進めましょう！

# 参考文献
スクラムガイド
http://www.scrumguides.org/docs/scrumguide/v2017/2017-Scrum-Guide-Japanese.pdf
UTextFieldのソフトキーボードを数値のみにして完了ボタンを追加する

UITextFieldやUITextViewのkeyboardTypeをnumberPadにした場合に
ソフトキーボードに完了キーが無くて困ったので追加方法を共有します。

```
let toolbar: UIToolbar = UIToolbar()
let space = UIBarButtonItem(barButtonSystemItem: .flexibleSpace,
                            target: nil,
                            action: nil)
let done = UIBarButtonItem(title: "done",
                           style: .done,
                           target: self,
                           action: #selector(doSomething))
toolbar.items = [space, done]
toolbar.sizeToFit()
self.textField.inputAccessoryView = toolbar
self.textField.keyboardType = .numberPad

```
UIPasteboardがクラッシュすると思ったらしなかった件


最近はもっぱらSwiftばっかり書いているので、Objective-Cに戻りたくないなぁって思っていたんですけど、ちょっと触る機会があった際にUIPasteboardで妙なことが起こったので、そのことについて書きます。

#そもそもUIPasteboardってなんぞや
アプリ内、もしくはアプリからアプリにユーザーデータ共有を支援するオブジェクトって公式ドキュメントを翻訳したGoogle先生が言ってました。

これを使うことで、アプリ内とか、アプリとアプリの間でStringとUIImageとかDataとかを簡単に受け渡したりできる仕組みって感じですね。
使い方に関しては散々語られているのでここでは省略。

#で、今回の話
既存のObjective-Cで作成されたアプリでNSDataをUIPasteboardにセットして、別のアプリに渡す処理があったのですが、別のアプリの方でUIPasteboardにセットされたはずのNSDataが取れない問題が発生しました。

色々原因を探っていると、既存アプリ側でUIPasteboardにNSDataをセットする際に一定条件でnilがセットされる不具合が発生していることが発覚し、nilをセットしたらクラッシュするはずなのでは？って思ったのですが、既存アプリはクラッシュしていませんでした。

#実際に検証してみた

UIPasteboardに値を置く際には以下のメソッドを使用します。

```objc:UIPasteboard.h
- (void)setValue:(id)value forPasteboardType:(NSString *)pasteboardType;

- (void)setData:(NSData *)data forPasteboardType:(NSString *)pasteboardType;

```

この二つのメソッドは、 **setValue** では、NSString, NSArray, NSDictionary, NSDate, NSNumber, UIImage, NSURLをセットするのに対し、 **setData** は、その名の通りNSDataをセットするという点で違います。

そしてこの二つのメソッドを使用してそれぞれnilが入ったオブジェクトをUIPasteboardにセットする処理を実行してみました。

```objc:UIPasteboardTest.m
- (void)setValueTest {
    UIPasteboard *pasteboard = [UIPasteboard pasteboardWithName:@"test" create:YES];
    
    NSString *string = nil;
    
    [pasteboard setValue:string forPasteboardType:@"public.text"];
}


- (void)setDataTest {
    UIPasteboard *pasteboard = [UIPasteboard pasteboardWithName:@"test" create:YES];
    
    NSData *data = nil;
    
    [pasteboard setData:data forPasteboardType:@"public.data"];
}
```

なんとsetValueの方はアプリがクラッシュし、setDataの方はクラッシュしませんでした。
その代わり、setDataの方では、以下のエラーメッセージがログに出ます。

```setDataにnil入れたときのError
Could not save pasteboard named test. Error: Error Domain=PBErrorDomain Code=0 "Cannot load representation of type public.data" UserInfo={NSLocalizedDescription=Cannot load representation of type public.data, NSUnderlyingError=0x60400044dec0 {Error Domain=PBErrorDomain Code=15 "No loader block available for type public.data." UserInfo={NSLocalizedDescription=No loader block available for type public.data.}}}
```

公式の[setValue](https://developer.apple.com/documentation/uikit/uipasteboard/1622079-setvalue)や[setData](https://developer.apple.com/documentation/uikit/uipasteboard/1622075-setdata)のページでも特にこの違いに関する記述がなさそうなのでこの違いの理由はイマイチわかりませんでした。

今回の自分のように、気づかない間に、setDataにnilのNSDataを入れる可能性があるので、Objective-Cで使用する際は、setDataする際にnilチェックをしておいた方が、いざ出した時に入ってなくて焦るってことがないのでいいのではないかと思います。

#まとめ
・UIPasteboardのsetValueの引数にnilのオブジェクトを渡したらクラッシュします。
・UIPasteboardのsetDataはnilのNSDataを引数に渡してもクラッシュしないけどエラーメッセージを吐きます。
・Objective-CでsetDataする場合はnilチェックして、セットする前に気づくようにしたい。
・setValueもsetDataも引数はnonnullなので、Swiftだったらnil入れれないし、入れたらビルド通らないから、Swift使うのが一番最強。
APIを使う際にマッピングクラスを簡単に作る方法

APIの仕様が決まっているときにAndroidやiOSのマッピングクラスを作るのは面倒だったりします。

その中よく使うのが以下の２つ。
# jsonschema2pojo
[jsonschema2pojo](http://www.jsonschema2pojo.org/)

jsonもしくはjsonschemeからPOJO(Plain Old Java Object)を作成してくれるWEBサービス

コマンドやgradleプラグインとしても使える。

[joelittlejohn/jsonschema2pojo](https://github.com/joelittlejohn/jsonschema2pojo)


# JSONExport
[Ahmed\-Ali/JSONExport](https://github.com/Ahmed-Ali/JSONExport)

Mac専用のアプリでよければJSONExportがおすすめ。
SwiftやObjective-Cのモデルも作成できる

# その他

内製のAPIであればSwaggerでしっかりAPIの定義をしておくとCodegenで作成できるので便利

参考:[SwaggerでRESTful APIの管理を楽にする](https://qiita.com/disc99/items/37228f5d687ad2969aa2)
splat 展開は少し遅い

[プロを目指す人のためのRuby入門](http://gihyo.jp/book/2017/978-4-7741-9397-7) を今読んでいる。

で。

ちょっと気になった事があった。

120ページ、4.7.8。

配列を連結する際に

```ruby
a=[10,20,30]
b=[1,2,*a,3,4]
```

と書くことを薦めていた。

えーこれって遅かったりするんじゃないの？　と思って測ってみた。

ソースコードは

```ruby:ruby
require "benchmark"

a=Array.new(ARGV[0].to_i){ |x| x }

N=1000000

puts "%.3f" % ( Benchmark.realtime do
  N.times do
    b=[1,2,*a,3,4]
  end
end )

puts "%.3f" % ( Benchmark.realtime do
  N.times do
    b=[1,2]+a+[3,4]
  end
end )
```

こんな感じ。実行結果は

■ a.size==100

||`[1,2,*a,3,4]`|`[1,2]+a+[3,4]`|
|:--|:--|:--|
|ruby 2.4.2|0.949|0.630|
|ruby 2.3.5|0.946|0.639|
|ruby 2.2.7|1.225|0.748|

■ a.size==3

||`[1,2,*a,3,4]`|`[1,2]+a+[3,4]`|
|:--|:--|:--|
|ruby 2.4.2|0.779|0.556|
|ruby 2.3.5|0.789|0.563|
|ruby 2.2.7|0.836|0.591|

というわけで、やっぱり若干 splat 展開が遅い。
でももっと差が出ると思っていたので、大差ないことに驚いた。

2.2 と 2.3 の間で何かあったらしいことが伺える。ありがたや。
ESP32に内蔵プルアップ抵抗はあるか（ある）

### ESP32とArduinoと内蔵プルアップ抵抗

[ESP32-DevKitC](http://akizukidenshi.com/catalog/g/gM-11819/)買いました．ESP-WROOM-32開発ボードです．

それはさておき，I2C通信では，SDA/SCLを[プルアップ](http://www.wdic.org/w/SCI/%E3%83%97%E3%83%AB%E3%82%A2%E3%83%83%E3%83%97)する必要があります．Arduinoでは，```pinMode(ピン番号, INPUT_PULLUP)```とするだけで内蔵のプルアップ抵抗を有効にできます．

[意外と知られていない？INPUT_PULLUP | スイッチサイエンス マガジン](http://mag.switch-science.com/2013/05/23/input_pullup/)
[Arduino便利な内部でのプルアップ機能 | プログラミングテクニック集キヤミー](http://cammy.co.jp/technical/2016/01/23/arduino_006/)

では，Arduino **っぽく扱える** ESP32には内蔵のプルアップ抵抗はあるでしょうか？　結論から言えば，あります．

### 試してみた

Arduino IDEで，pinModeを切り替えるスケッチを作りました．
[esp32_sketch/pullup_test.ino at master · typewriter/esp32_sketch](https://github.com/typewriter/esp32_sketch/blob/master/pullup_test/pullup_test.ino)

IO13に抵抗(220Ω)とLEDを繋ぎ，実行します．
プルアップ抵抗があれば，わずかに電流が流れ，LEDがうっすらと光るはずです．

#### INPUT_PULLUP (プルアップ抵抗有効)

![20171128_PB280937_mini.jpg](https://qiita-image-store.s3.amazonaws.com/0/1045/683615a0-7caf-add7-a96e-ee3e7e47369b.jpeg)

#### INPUT (プルアップ抵抗無効)

![20171128_PB280938_mini.jpg](https://qiita-image-store.s3.amazonaws.com/0/1045/8be21e6a-ce10-3579-5ffd-12f440762fc0.jpeg)

#### OUTPUT HIGH (出力モード, HIGH)

![20171128_PB280939_mini.jpg](https://qiita-image-store.s3.amazonaws.com/0/1045/058d09d2-1b0f-495b-94be-26cf0554dd08.jpeg)

#### OUTPUT LOW (出力モード, LOW)

![20171128_PB280940_mini.jpg](https://qiita-image-store.s3.amazonaws.com/0/1045/21ad3a6d-f2f3-7075-c66d-9e51d5481d0d.jpeg)

#### 結果

INPUT_PULLUPでは非常に弱く光り，OUTPUT HIGHでは強く光りました．期待通りです．

### そのほか

公式のデータシートにも記載があります．

> Most of the digital GPIOs can be configured as internal pull-up or pull-down, or set to high impedance.
> (訳: デジタルGPIOの多くで，内部プルアップ・プルダウンやハイインピーダンス状態の設定が出来ます)
> - ESP32 Datasheet: http://espressif.com/sites/default/files/documentation/esp32_datasheet_en.pdf (4.1.1)

IO34～IO39はプルアップしません．

> These input-only pins don't have PU/PD circuits.
> (訳: 入力専用ピンにはプルアップ/プルダウン回路はないよ!)
> - [pinMode(x, INPUT_PULLUP) does not pull up on GPIO34 ... GPIO39 · Issue #316 · espressif/arduino-esp32](https://github.com/espressif/arduino-esp32/issues/316)
コマンドラインでGit Flowをインストールして使ってみる

今までGUIのGitクライアントを使ってきたけど、どうせGitを使うならコマンドラインでやってみたい。さらに、色々コードをいじって実験してみたくなることも多々あるので、Subversionのような使い方(masterブランチ一本)よりもブランチを切って今っぽくやってみたい。ということで、Git Flowを導入して使ってみることにした。

## 前提環境

ソフトウェア|バージョン
---|---
CentOS|7
Git | 2.15.0.rc1

※ ここでは、Git自体はインストール済みとする。

### Git Flowのインストール

``` shell
$ cd /usr/local/src
$ sudo bash
$ wget -q -O - --no-check-certificate https://github.com/nvie/gitflow/raw/develop/contrib/gitflow-installer.sh | bash
$ git flow  # Confirm whether installation was successful
$ exit      # exit bash as sudoer
```

### Git Flowのコマンド

#### ヘルプ
``` shell
$ git flow help
```

#### 初期化
``` shell
$ git flow init
Which branch should be used for bringing forth production releases?
   - master
Branch name for production releases: [master]
Branch name for "next release" development: [develop]

How to name your supporting branch prefixes?
Feature branches? [feature/]
Release branches? [release/]
Hotfix branches? [hotfix/]
Support branches? [support/]
Version tag prefix? [] v
```

大体は表示されているデフォルト値(feature/とか)をそのまま使えばよい。
Version tag prefixについては、何か指定すると、releaseブランチを終了するときに、releaseブランチ名に指定のプレフィックスをappendしたタグを作ってくれる。例えば、上の例ではVersion tag prefixをvとしているが、releaseブランチを開始した時の名前に1.0と指定していたら、タグがv1.0で作成される。

#### featureブランチの開始と終了

``` shell
$ git flow feature start loginpage
$ # feature/loginpage というブランチが作成される

$ # リモートブランチにプッシュ。2回目以降は -u は不要
$ git push -u origin feature/loginpage

$ # 色々コミット・プッシュし、物ができたらfeatureブランチを終了。
$ git flow feature finish loginpage

$ # developにマージされ、developに切り替わるのでpush
$ git push origin develop
```

#### releaseブランチの開始と終了

``` shell
$ # 要領はfeatureブランチとだいたい同じ。
$ git flow release start 1.0
$ git push -u origin release/1.0
$ git commit -m "hogehoge"
$ git push origin release/1.0
$ git flow release finish 1.0
$ # これでv1.0というタグが付く (vをVersion tag prefixに指定している場合)
$ # ここでは、masterとdevelopにマージされる。releaseブランチ終了後はdevelopに切り替わる。

$ # まずdevelopをpush
$ git push origin develop

$ # masterもpush
$ git checkout master
$ git push origin master
```
GoogleCloudPlatformでMastodonインスタンス設置(HTTP)

#はじめに
Google Cloud Platform の無料クーポンがかなり余っていたので、実験的にMastodonインスタンスを設置してみた。

あくまでインスタンスを設置できるかどうかという点を重視しているので、SSL証明や独自ドメインなどは省いている。

個人的な実験メモなので、実運用できるものは作れないので悪しからずご了承ください。


#Google Cloud Platform への登録
こちらの記事を参考に登録を済ませておく
[初心者のためのGCPプロジェクト始め方入門](http://www.apps-gcp.com/gcp-startup/)

#Google Cloud Platform 上での作業
##プロジェクトの作成
まず、[こちら](https://support.google.com/cloud/answer/6251787?hl=ja)を参考にしてプロジェクトを作成する。

##ファイアウォールルールの作成
[GCPでMastodonを構築](https://qiita.com/Hoshito/items/3a043b65f787be856754)
上記の記事を参考に、プロジェクトで使うファイアウォールルールを作成。
「名前」と「ターゲットタグ」は「test」で統一しておく。
最後に「作成」を押す。


##仮想マシンの作成
「Compute Engine」の中にある「VMインスタンス」を選択。「作成」ボタンを押し、ガイドにそってVMインスタンスを作成。

この時の、OSは「Ubuntu 16.04 LTS」を選択し、「HTTPトラフィックを許可する」と「HTTPSトラフィックを許可する」にチェックを入れておくこと。

あと、「ネットワーキング」内の「ネットワークタグ」に「test」と入れておく。

##仮想マシン上でMastodonを構築
作成した仮想マシンの「SSH」をクリックし、[この記事の 4. Mastodon インスタンスの構築](https://qiita.com/S_H_/items/327a38306da14a8dd56d)を実行。

基本的には、記事通りに進めて問題ないが数か所注意するところがある。
本番環境用の設定を変更する際に以下の個所を下記の通り変更する必要がある。


```
LOCAL_DOMAIN=(VMインスタンスの外部IPアドレス)
LOCAL_HTTPS=false

```

##実際のインスタンスにアクセス
http://(VMインスタンスの外部IPアドレス):3000 で実際に動いているインスタンスにアクセスできる。

#終わりに
今回は実験的なインスタンス立ち上げだったけど、無料分を使って少人数向けのインスタンスとか立てても面白そうだと思う。
GCPでのインスタンス設置に関して、HTTPS化関連の情報があんまりヒットしないので、そのあたりは課題として残るんじゃないかと思う。


#参考記事
[初心者のためのGCPプロジェクト始め方入門](http://www.apps-gcp.com/gcp-startup/)
[GCPでMastodonを構築](https://qiita.com/Hoshito/items/3a043b65f787be856754)
[rbenv+ruby-buildを利用してUbuntuにRubyをインストールする](https://qiita.com/itayan/items/e146289f430dffc71360)
[Mastodonインスタンスをローカルに立てる簡単な手順(Docker環境、SSLなし)](http://l-w-i.net/t/mastodon/init_local_001.txt)
[Windows10の仮想環境下でMastodonインスタンス設置](https://qiita.com/S_H_/items/327a38306da14a8dd56d)
Raspberry Pi Zero WをWi-Fi帰属させる

Raspberry Pi Zero W を購入したのでセットアップ。

まずは電源だけ挿せば ssh でログインできるようにする。

下記２つの記事を読めばできます。
助かりました。

https://qiita.com/hishi/items/8bdfd9d72fa8fe2e7573
https://qiita.com/MarieKawasuji/items/b088ffb252a92eee8f5d

ありがとうございました。
RubyXLでオートフィルタ付きでカラム幅とか整形済のExcelファイルを出力したい

# RubyXL ?
Open Sourceの.xlsxファイルを扱えるRuby Gem.ぐぐるとQiita内でも記事がいっぱいでてくる．
https://github.com/weshatheleopard/rubyXL

# TL;DR (長い3行で)
Rubyから.csvで結果やログを出力することはよくありますが，そのたびに.csvをExcelで開いて色をつけたり，カラム幅を調整したり，オートフィルタを設定したり，してから.xlsxとして保存，をするのがめんどうなので，RubyXL使って.xlsxの基本的なスタイリングまで自動化します．

# 出力する.xlsx
サンプルとして ↓ のようなExcelを書き出してみます．
![filtered_xlsx.png](https://qiita-image-store.s3.amazonaws.com/0/129035/bb059910-7804-7d60-4ad9-d2e12f484bc5.png)
・1行目のヘッダ行は背景色とフォント色を変更
・1行目のヘッダ行にオートフィルタを設定
・各カラム幅は各カラムの値の長さに合わせて可変，ただし幅が大き過ぎる場合は任意の最大値まで

# Code
↓ のようなScriptで ↑ のExcelが出力されます．

```ruby
#! ruby
# encoding: utf-8

require 'rubyXL'

workbook = RubyXL::Workbook.new
worksheet = workbook[0]

# Contents.
contents = [
    ['column_A', 'column_B', 'column_C'],
    [100, 200, 300],
    ['value_a', 'too long string', 'long long string over than default column width'],
]

column_width = [0, 0, 0]

# Add cells.
contents.each.with_index { |values, row|
  values.each.with_index { |value, column|
    # Add.
    cell = worksheet.add_cell(row, column, value)

    # Header line.
    if row == 0
      cell.change_fill('808080')
      cell.change_font_color('FFFFFF')
    end

    # Column width.
    column_width[column] = value.to_s.size if column_width[column] < value.to_s.size
  }
}

FILTER_BUTTON_WIDTH = 2
MAX_COL_WIDTH = 30

# Column width.
column_width.each.with_index { |width, column|
  rounded = width + FILTER_BUTTON_WIDTH
  rounded = MAX_COL_WIDTH if rounded > MAX_COL_WIDTH
  worksheet.change_column_width(column, rounded)
}

# Set filter.
range = RubyXL::Reference.new(0, 0, 0, 2) # row from/to, col from/to
filter = RubyXL:: AutoFilter.new
filter.ref = range
worksheet.auto_filter = filter

# Output.
workbook.write("filtered.xlsx")
```

# 背景色，フォント色変更
```ruby
cell.change_fill('808080')
cell.change_font_color('FFFFFF')
```

普通にRGBで指定する感じ．文字列の先頭に`#`をつけて`#808080`みたいにすると動かない．

# カラム幅の設定
```ruby
worksheet.change_column_width(column, rounded)
```
カラム番号と幅の値を指定するだけ．
設定する幅の値はだいたい `1 = 1文字分` になっている気がするけど，正確なところはよくわからない．

各カラムの値の文字数の最大値をそのままカラム幅に設定するだけでもOKですが，このサンプルはオートフィルタのボタンぶん(2文字ぶん)幅を広げています．

値の型が文字列だったり数値だったり混在するときは`column_width`の取得のところにもっと工夫が必要．

# オートフィルタの設定
```ruby
range = RubyXL::Reference.new(0, 0, 0, 2) # row from/to, col from/to
filter = RubyXL:: AutoFilter.new
filter.ref = range
worksheet.auto_filter = filter
```
Referenceというclassでどのcellにオートフィルタを設定するか，を指定します．
この場合は`[0, 0]`から`[0, 2]`まで (A1, B1, C1)にオートフィルタを設定．

# まとめ
`RubyXL`は`README.rdoc`に書かれているよりもはるかに高機能なようです．
人間がやってるExcelの整形作業とかほとんど機械化できてもっとはかどりそう．

# 不具合?
RubyXLでもaxlsxでも，書き出した.xlsxをExcelで読み込んだあと，オートフィルタでSort等の処理をするとExcelが強制終了するようです．(100%再現)

一度，オートフィルタの▼をClickしてリスト表示 → 何もせずOK とした後なら問題なく動きました．

いまのところ原因不明のままで，ぐぐっても同件ぽい問題は出てこなかったので環境依存かもしれません．
RubyXL, axlsxで書き出した直後の.xlsxと，オートフィルタで何もせずOKして保存しただけの.xlsxの中身が変わっていることは確認しましたが，その違いが何を意味するところなのかまではわからず．．．

---///
無線の安定チェックポイントメモ

# 概要と前提
---
無線が安定しないときに原因と考えられる要素をまとめた。
<dl>
  <dt>通信が安定しないのが</dt>
  <dd>特定の端末なら端末側の問題</dd>
  <dd>不特定多数ならネットワーク側の問題</dd>
</dl>

として、ネットワーク側の問題で解決できそうなものをまとめる。

---

# 元のルータが問題の場合
---

NATセッション数問題
-
 - YAMAHA RTX1200とかだとセッション数が20,000なので、同時に使用するのが※40台以上あると足りなくなり、安定しない可能性がある。

 - Cisco製のルータの場合、 NATセッションの上限は、ルータで使用できる DRAMの量により制限される。NAT変換1つにつき、DRAMで約312バイト(512MBあれば164万セッション張れる)

 ※　1端末（ユーザー）が使用するセッション数は、おおよそ200〜300程度。使用するアプリケーションによっては400から500程度を見込む。

---

# 無線の規格周りの問題の場合
---

無線の規格は大きく分けて2種類ある。

1. 5GHz帯域  
  - 電波干渉を受けにくいが、障害物に弱い
 
1. 2.4GHz帯域 
  - 電波干渉を受けやすいが、障害物に強い。Wi-Fiに多く使用されている。
			 (Bluetoothやコードレス電話、電子レンジなど)

無線の規格によって、最大通信速度と周波数帯が決まっている。
とんでもなく古いルータなら対応の無線の規格を確認すること。

---
最大通信速度と周波数帯
--
| 帯域 | 規格| 最大速度|
|:-----------|:------------|:------------|
| 2.4GHz帯| IEEE802.11b |  11Mbps|
| 2.4GHz帯| IEEE802.11g |  54Mbps|
| 5Ghz帯| IEEE802.11a | 54Mbps|
| 5Ghz帯|IEEE802.11ac | 6.9Gbps|
| 2.4GHz/5Ghz帯|IEEE802.11n| 600Mbps|
基本的に高速な無線LAN規格対応のルーターであれば、両方の帯域に対応している。

---
# 無線の帯域、チャネル選択の問題の場合
---

2.4GHzの場合
---

![0800_2.png](https://qiita-image-store.s3.amazonaws.com/0/3094/78545c31-1171-15c6-b098-43149e1b5280.png)

ひとつの通信で4チャネル強を占有するため　一般的には、チャネル1、6、11が利用されることが多い

チャネル選択を自動設定にすると中途半端なチャネルが選択されてしまい、複数の通信への干渉を引き起こす。

2.4GHz帯の場合、同じ帯域を利用する機器と無線ルーターなるべく遠い場所に設置するなどで、問題を解決できる可能性がある。
		また、近くに複数の無線ルータ、アクセスポイント等がある場合、干渉して通信が不安定になる可能性もある。

---

５GHzの場合
---

![0800_3.png](https://qiita-image-store.s3.amazonaws.com/0/3094/9e41f1ec-b362-05b0-ceeb-da51a4ee0bba.png)

- 干渉する電波帯が通常使用されていない(例外は　気象レーダー、軍事用、非公開レーダーなど)
- もともと各チャネルを離して設定されているため、同じ5GHz帯同士の機器でもチャネル番号が違えば干渉はほとんどおきない

W52,W53,W56などチャンネル番号を変えて設定しておく。
同じ番号の場合は機器を離すなど工夫をしないと干渉する可能性がある

---
５GHzのレーダー干渉
---

- 法律により、レーダーを受信したら、自動でチャンネルが切り替わる。

- レーダーが利用するチャンネル帯に関しては、**起動後1分間は受信のみでレーダーの通信を受信しないか確認する** 仕様になっている。

W52以外のチャンネルで、時々全く通信できないならレーダー干渉を疑う。

---
# その他 細かい理由
---
ファームウェアやドライバ version
---
セキュリティアップデートやパフォーマンス向上の更新があるため、無線ルータのファームウェアのアップデートや端末側のドライバを更新しておくと安定する可能性がある。

---
電源による干渉
---
 電線、鉄道架線、発電所など、特定の外部電気設備が、干渉の原因となる場合がある。
 無線ルータは、電線が通っている壁面やブレーカーボックスの近くに置かないようにする。

---
アクセスポイントまでの距離や障壁
---
ルーターまたはアクセスポイントの配置場所が端末がある部屋の外(コンクリートで隔離された場所)にある場合、通信が弱くなったり、遮られたりする場合がある。

---
多台数の接続 / 高密度な無線LAN環境
---

多数のワイヤレスデバイスがコンピュータに接続されていたり、近くにあったりする場合、
複数チャネルを用いて空間を分割利用するような設定、発想が必要。
アクセスポイントがそれに対応していれば楽。

---
アクセスポイントの性能
---
速度よりも端末収容数（同時接続数）が重要
収容数を超えた場合は、複数のアクセスポイントを用意し、それぞれで接続する

---
SSIDが多すぎる場合
---
APのスペックが低く、同じ周波数帯を利用する機器が多すぎる場合は、

1. ビーコン
 - APの存在通知　
 
1. プローブ
 - 各端末が周辺のSSIDへ一斉に「プローブリクエスト」を送信し、APはSSIDごとに「プローブレスポンス」を送信する


これら2つの低速な通信でAPが占有され、性能が低下する可能性がある。
不要なSSIDを減らすことができれば良い。

---
ネットワークケーブルの問題
---
ケーブル規格：Category 5e以上なら大きな問題はないが、ネットワーク上にひとつでもCategory5があると遅くなる可能性がある。

---
参考記事
---
https://www.cisco.com/JP/support/public/ht/q_a/100/1006395/nat-faq-j.shtml
http://uso59634.blog63.fc2.com/blog-entry-72.html?sp
https://www.nic.ad.jp/ja/newsletter/No61/0800.html
http://itpro.nikkeibp.co.jp/article/Watcher/20130801/495930/?P=4

---
# 以上！

もし他になにか安定する方法、チェックポイントを知っていたらぜひ教えてください！
RailsチュートリアルのアプリをHerokuにデプロイしたけどDBの設定ができてなかったので見直しした話

## 開発環境

- CentOS 7
- RubyOnRails 5.1
- PostgreSQL(production環境用)

## 問題

Railsチュートリアル(rails5.1版)をHerokuにデプロイしたが、Signupでエラーページが表示された。
見直してみると結構しょぼいが、メモや今後のために記録しておく。

## 原因その1

よくよく考えたら、production用DBの設定を`database.yml`にしていなかったので設定。

``` yml
production:
  adapter: postgres
  url: <%= ENV['DATABASE_URL'] %>
```

## 原因その2

これでデプロイしたが、まだエラーページに行くので

```
$ heroku logs
```

で確認してみた。

```
ActiveRecord::StatementInvalid (PG::UndefinedTable: ERROR:  relation "users" does not exist
```

と出力されていたので、DBにテーブルを作ってやる必要がある。
てことで

```
$ heroku run rails db:migrate
```

これでめでたくテーブルが出来て、Signupページも表示できた。

## ついでに、作成したDBに接続してみる

```
$ heroku pg:psql *********** --app $$$$$$$$$$$$
```

を実行。
このコマンドは、Herokuの管理画面のHeroku Postgresアドオンから確認できる)
*や$は、マスクしてある部分なので、アプリによって読み替える。

(Postgresがローカルに入ってない場合は `sudo yum install postgresql` を実行)
こんな私でも Vim が好きと言いたい

# 自己紹介的な

まあ、まずは私の vimrc を見てくださいよ。

```vim
" complement
set wildmode=list:longest

" edit
syntax on
filetype plugin indent on

" encoding
set encoding=utf-8
set fileencodings=utf-8,iso-2022-jp,euc-jp,sjis

" search
set ignorecase
set smartcase
set incsearch
set nohlsearch

" format
set expandtab
set shiftwidth=4
set softtabstop=4
set tabstop=4
set autoindent

set number
set cursorline

" display
set t_Co=256
set background=dark
colorscheme hybrid
highlight Normal ctermbg=none
```

びっくりするくらいシンプルでしょ。
せっかくだから ~/.vim/ の下も見ていきますか？

![vim-directory.png](https://qiita-image-store.s3.amazonaws.com/0/41691/9e7f46ca-725d-8cc4-2db2-5557a35c575d.png)

清々しいでしょ。

# じゃあお前は Vim の何が好きなんだ

って、言われると困りますけど、このような最低限ほしいものだけを入れている vimrc で使ってても、標準的なキーバインドのエディタ使うよりは圧倒的に早く編集できますよね。それで私にとっては充分です。しいていえば、Vim のキーバインドが好き、ということになるんでしょうかね。

# なので

素の状態でも便利な Vim をぜひぜひ気軽に使ってほしいと思う今日このごろなのでした。
認証付きProxyの設定を安全に運用したい

# 背景・目的

弊社では社内NWからインターネットに接続する場合は必ずProxyを通らなければならない。
Linuxの場合、環境変数`HTTP_PROXY`を設定してあげれば大体うまく行く。
大体どの記事読んでも.bashrcあたりに`export`を書いてくださいとあるけど、
下記のような理由でこれをしたくない。

- Proxyにユーザー認証が必要で、個人のユーザー名とパスワードが必要
- 弊社ルールによりパスワードを90日毎に変更しなければならず、その都度パスワードを書き換えるのは美しくない
- そもそも、個人のパスワードを平文で書かなければならずセキュリティ的に論外

そんなわけで、認証付きProxyを上手いこと設定する方法を模索。

# 目標

- 認証付きProxyを環境変数に追加したい
- 設定するときにユーザー名とパスワードを尋ねる形にしたい

# できたもの

ひとまず、下記のようなスクリプトを書いてみた。
プロキシサーバー名とかホスト名は仮で。

~~~sh
#!/bin/bash

function set_proxy() {
  echo -n "user name:"
  read user
  echo -n "password:"
  read -s pass
  echo

  export HTTP_PROXY=http://$user:$pass@proxy.server.co.jp:8080
  export http_proxy=http://$user:$pass@proxy.server.co.jp:8080
  export NO_PROXY=localhost,127.0.0.1
}

function unset_proxy() {
  unset HTTP_PROXY
  unset http_proxy
}

while :
do
  echo "1 : Proxyを設定します"
  echo "2 : Proxy設定を解除します"
  echo -n "mode :"
  read mode

  case "$mode" in
    "1" )
      set_proxy
      echo "Proxyを設定しました"
      break ;;
    "2" )
      unset_proxy
      echo "Proxy設定を解除しました"
      break ;;
  esac
done
~~~

これを`set-proxy`とか適当な名前で保存して、適当なところに配置する。
実行権限を与えるのを忘れずに。

## 使い方

とりあえず呼び出して、あとはメニューに沿って所望の設定をしてあげるだけ。
ひとつ注意点として、`source`コマンドと併せて呼び出さないと反映されない。

~~~sh
source set-proxy
~~~

うーん...美しくない...

## 補足

HTTPSとか他のプロトコルでもProxy設定したい場合は、必要な分だけ行を追加する。
`NO_PROXY`はunsetしてないけど、弊害はないでしょう。多分。

# 雑感
## よくできたところ

- ひとまず目標としていたことはクリアできた
- マルチユーザー環境でも個別にProxy設定できるので、セキュリティ的にも安心

## イマイチなところ

前述のとおり。`source`コマンドを使わないといけないので、なんともダサい。

# おわりに

Proxy関連の話をちょっとググると大量に記事が出てくるので、
それだけ悩んでる人がいるのでしょう。
少しでも助けになれば。
もっと良い方法があれば是非ご連絡ください。
iOS11 Vision.frameworkで顔トラッキング

# はじめに
リアルタイムテキスト検出を行っている、[こちらの有難いソース](https://github.com/tondol/TextDetectionSample-iOS)を一部修正すればできます。
元記事は[こちら](https://tech.recruit-mp.co.jp/mobile/ios-11-vision-framework/)をご参照ください。

# ソース（変更する部分のみ）

```swift
    func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
        let uiImage = sampleBufferToUIImage(sampleBuffer: sampleBuffer, with: UIApplication.shared.statusBarOrientation)
        let orientation = CGImagePropertyOrientation(uiImage.imageOrientation)
        let ciImage = CIImage(image: uiImage)!

        // UI の変更はメインスレッドで実行
        DispatchQueue.main.async { [weak self] in
            if let frame = self?.imageFrameOnViewController(uiImage: uiImage) {
                self?.imageView.image = uiImage
                self?.visualizeRectanglesView.frame = frame
            }
        }

        // orientation を必ず設定すること
//        let handler = VNImageRequestHandler(ciImage: ciImage, orientation: Int32(orientation.rawValue))
        let handler = VNImageRequestHandler(ciImage: ciImage, orientation: orientation)

//        let request = VNDetectTextRectanglesRequest() { request, error in
        let request = VNDetectFaceRectanglesRequest() { request, error in
            // 顔ブロックの矩形を取得
            let rects = request.results?.flatMap { result -> [CGRect] in
//                guard let observation = result as? VNTextObservation else { return [] }
                guard let observation = result as? VNFaceObservation else { return [] }
                return [observation.boundingBox]
            } ?? []

//            // 文字ごとの矩形を取得
//            let characterRects = request.results?.flatMap { result -> [VNRectangleObservation] in
//                //guard let observation = result as? VNTextObservation else { return [] }
//                guard let observation = result as? VNFaceObservation else { return [] }
//                return observation.characterBoxes ?? []
//            } ?? []

            // UI の変更はメインスレッドで実行
            DispatchQueue.main.async { [weak self] in
                self?.visualizeRectanglesView.rectangles = rects
//                self?.visualizeRectanglesView.characterRectangles = characterRects
            }
        }

//        request.reportCharacterBoxes = true

        try! handler.perform([request])
    }
```
カスタム例外に関する微ネタ

[Fluent Python](https://www.oreilly.co.jp/books/9784873118178) の 632 ページより

> カスタムメイドな例外は通常、本体を持たないマーカークラスです。単に pass 文だけより、例外の用法を説明する docstring の方がよいです。

なるほど :innocent:  

```pycon
>>> class NoPokemonError(Exception):
...   """てもとには たたかえるポケモンが もういない！"""
...
>>> NoPokemonError.__doc__
'てもとには たたかえるポケモンが もういない！'
```
GoでMySQLにアクセスしてみる（gorp編）

## まずはGoの標準パッケージでアクセスしてみる
GoにはRDBにアクセスするための`database/sql`が標準で用意されています
普通に使用するのには特に問題はありません

### Query
```go
// 接続　
db, err := sql.Open("mysql", "user:password@tcp(xx.xx.xx.xx:3306)/db?parseTime=true")
defer db.Close()

// Select
rows, err := db.Query("select * from user")
defer rows.Close()

// 構造体へマッピング
for rows.Next() {
    user := User{}
    err := rows.Scan(&user.Id, &user.Name)
}
```

### Insert
```go
_, err = db.Exec("insert into user values (?, ?, ?) ", 1, "hoge", 30)
```

SelectのSQLを発行する部分はシンプルで良いが、構造体に値をマッピングする処理が煩雑
Insertでは構造体を直接追加したいのにSQLで書くのは煩雑
もっとスッキリ書きたい

## そこでORM(gorp)を使ってアクセスしてみる
**gorp(Go Relational Persistence)**
https://github.com/go-gorp/gorp  
  
gorpについて(特徴など)
- GolangのORMの一つ
- SelectはSQLを直書き。複雑なQueryとかも自由に直接かけるのでORMでよくあるパフォーマンスがでないとか気にしなくて良い
- 取得結果と構造体とのマッピングはORMがやってくれる
- Insert,Update,DeleteはSQL書かなくても良い

### Select

```go
// 接続　
db, err := sql.Open("mysql", "user:password@tcp(xx.xx.xx.xx:3306)/db?parseTime=true")
dbmap := &gorp.DbMap{Db: db, Dialect: gorp.MySQLDialect{"InnoDB", "UTF8"}}
defer dbmap.Db.Close()

// Select複数行
var users []User
_, err := dbmap.Select(&users, "select * from user order by id")

// Select単一行
var user1 User
err = dbmap.SelectOne(&user1, "select * from user where id=?", 1)

// PKで取得
obj, err := dbmap.Get(User{}, 1)
user2 := obj.(*User)

```

接続文字列に`?parseTime=true`を書くと日時をGolangのtimeにParseしてくれる
構造体へのマッピングはgorpが行ってくれるのでポインタを渡すのみ
簡単ですね

### 構造体とのマッピング定義
```go
type User struct {
    Id        int64      `db:"id, primarykey"`
    Name      string     `db:"name"`
    Age       int64      `db:"age"`
}
```
タグでマッピングするカラム名を指定できるので、構造体のプロパティ名と異なっていても大丈夫
テーブル名が構造体の名前と異なっている場合は下記コードでマッピングが必要
Insert/Updateを利用する場合は`primarykey`でPKを指定します
`autoincrement`とかも指定可能

```go
dbmap := dbmap.AddTableWithName(User{}, "user").SetKeys(false, "Id")
```
コードでテーブルのマッピングを指定する。コードでprimarykeyの指定も可能
テーブル名を構造体に合わせれば問題ないのですが、異なっている場合はdbmapを生成する毎に書かなければいけないので、なんとかならないかな。。

### Insert/Update/Delete

```go
user1 := &User{1, "ほげ 太郎", 23}
user2 := &User{2, "ふが 二郎", 41}

// Insert
err := dbmap.Insert(user1, user2)

// Update
user1.Age=42
count, err := dbmap.Update(user1)

// Delete
count, err := dbmap.Delete(user1)
```

### Transaction
トランザクションも使えます

```go
// Begin
tx, err := dbmap.Begin()

//(省略)...
tx.Insert(user1)
tx.Insert(user2)

// Commit
tx.Commit()
```

### その他の機能

- Create/Drop Tables
    - 構造体からDBをマイグレーションする機能、構造体のタグで桁数とかも指定できるし、Indexも定義できる
- Hooks
    - Insert,Update直前に処理を追加。作成日時、更新日時を設定したりするのに使える
- Optimistic Locking
    - `version`カラムを追加することで楽観的排他をORMが行ってくれる。RailsのActiveRecordみたいですね

### ハマりポイント
- `import _ "github.com/go-sql-driver/mysql"`でドライバーを初期化は忘れずに
- 構造体のプロパティのマッピングはタグでできるがテーブルとのマッピングはコードでしかできないので、毎回書くしかない
- 日付を扱う場合は接続文字列に`parseTime=true`を書きましょう

## 所感
- gorpは構造体にマッピングしてくれるため、すっきりコードが書ける
- SQLを直接書けるので学習コストの低く、ORMにありがちがパフォーマンス問題（ORMが発行するSQLが遅い）も回避できる
- やろうと思えがDBマイグレーションや楽観的排他等RailsのActiveRecordのような機能も使える
- gorpは機能と使い勝手がほどよいORMだと思いました（ActiveRecordのような多機能なORMもありますが、私にはこれくらいがほどよい）

*※コードが見やすいようにエラー処理は省略してます*
[re:inventレポート] ElasticSearchServiceとKibanaを用いたリアルタイムデータ分析

re:invent参加中です。
今は現地で朝4時ですが目が覚めてしまったので、初日のセッション参加レポートを書きます。

参加したのはこちらのセッション。
「ABD302 - Real-Time Data Exploration and Analytics with Amazon Elasticsearch Service and Kibana」

ElasticSearchとKibanaは2年くらい前にハンズオン参加して少し使ってみただけくらいでその後触れることはなかったのですが、今回ちょうど時間と場所が自分の予定と合ったので参加してみることにしてみました。

## 機能紹介

まずはAWS Elasticsearch Serviceってこんなものですよという紹介から。

![IMG_0037.JPG](https://qiita-image-store.s3.amazonaws.com/0/47589/385c78a9-e144-68bb-7da8-e14d73ae98f1.jpeg)

次にElasticsearchではprimary shardとreplica shardが作られ、各インスタンスに分散して配置されるという説明がありました。

![IMG_0040.JPG](https://qiita-image-store.s3.amazonaws.com/0/47589/a396c5d9-65e3-4e9f-bdda-5fcd93980670.jpeg)

レポート書きながらどういうものなのか復習してみると、まさに以下のサイトでまとめられている内容ですね。
https://medium.com/hello-elasticsearch/elasticsearch-afd52d72711

おそらくElasticsearch慣れている方には一般的な話だったのではないかなと思います。

あとは、こういうユースケースではこういうアーキテクチャですという説明や、その一例としてWebアプリのログをKibanaで可視化したデモがありました。デモはJMeterで負荷をかけて数値が増えてますねというオーソドックスなシナリオでしたので目新しさはなかったです。

ここまでだと、ElasticsearchServiceの基本を紹介するセッションなのかな？という印象でした。

## 実運用で使うときのサイジングの目安

ここが個人的にはすごくよかったです。
実際に実運用で使おうと思った際に自分として一番不安になる点がノウハウとして共有されているのはすごく価値がありました。

自分自身あまり理解できていない部分も多いのですが、リファレンスになりそうなのでスライド載せておきます。

### インスタンス数
![IMG_0043.JPG](https://qiita-image-store.s3.amazonaws.com/0/47589/b74af640-89dd-2759-96ea-6f866efd6fb2.jpeg)

### shards数
![IMG_0044.JPG](https://qiita-image-store.s3.amazonaws.com/0/47589/8e81f3d1-eb9e-8e73-4cc7-45c97d43fc58.jpeg)

### インスタンスサイズ
![IMG_0045.JPG](https://qiita-image-store.s3.amazonaws.com/0/47589/d49d3fe2-b432-52d9-9f7b-280e9169b77f.jpeg)

### 想定するアクセスは書き込みor読み込みどちらが多いのか
![IMG_0046.JPG](https://qiita-image-store.s3.amazonaws.com/0/47589/d0b52bb2-5417-3aea-4861-52d66bf59376.jpeg)

### マスターノードの推奨インスタンスサイズ
![IMG_0049.JPG](https://qiita-image-store.s3.amazonaws.com/0/47589/ac36f79f-168e-c610-c210-65a9e9972a52.jpeg)

## セキュリティ

publicアクセス可能にした場合はIAMでのユーザ・アクセス元制御をしましょうという話からの・・

### **[NEW]** **VPCサポート**

ここで新機能がさらっと出てきました！！　
ElasticsearchServiceがVPCの中（Privateな環境）に配置できるようになりましたよという話。

あまりに聞いている人の反応が薄いので以前から発表されていたのかな？と思いましたが、どうやらそうではないようです。

![IMG_0047.JPG](https://qiita-image-store.s3.amazonaws.com/0/47589/ae9c2c09-9ebc-187a-9d1f-11877248fe1c.jpeg)


## 監視

### Cloudwatch Alarmの設定例

これも個人的にはすごくためになる情報でした。監視しておくべきポイント・最初の目安となる判断基準があるのはよいことです。
![IMG_0050.JPG](https://qiita-image-store.s3.amazonaws.com/0/47589/27d3db73-9ac5-b417-6212-779d530658bd.jpeg)

## 感想

正直時間余ったので出てみるか、というくらいで直前に席を予約して参加したセッションではあるのですが、実案件適用の際にためになる情報があつまっているのは素晴らしいことだと思います。あと、こんなにしれっと新発表していいのですか？という気持ちになりました（keynoteで発表あるのかな・・？
Hugoで記事内に画像を貼り付ける方法

まあ個人用のメモということで。  

静的サイトジェネレーター[Hugo](https://github.com/gohugoio/hugo)で画像の貼り付け方法について備忘録。

Markdown形式で記事を書けるのが特徴なんだけど、Hugoの独自機能としてshortcodeというものがあるので。   


コンテンツ生成元のリポジトリのルート直下の`static`フォルダに`images`という画像を配置している前提。

なお、口述しているように一部のテーマではCSS指定の方が優先されて画像のサイズ指定が効かないケースがあるので要注意、です。

## Markdown 拡張方式

おそらくなんとか拡張という名称があるんでしょうけど調べてないです。[ghost blog platform](https://ghost.org/)などで採用されている形式。

```
![This is a image](/images/image01.png)
```

のように書くと、以下のようなHTMLに変換される。

```
<p><img src="/images/image01.png" alt="This is a image" /></p>
```

画像サイズなどの指定はできない。

## Shortcode 方式

Hugoの独自機能。Railsなどのヘルパーみたいなもの。Shortcode についての解説は下記を参照。

[Hugoで画像や動画を投稿する時はShortcodeを使おう - Qiita](https://qiita.com/waytoa/items/4107945cbd3883f51755)

以下のように画像サイズやクラス名を指定できるのが特徴。  

```
{{< figure src="/images/image02.png" title="Screenshot" class="center" width="320" height="640" >}}
```

`class`、`width`、`height`は省略化。他にも`img`タグのアトリビュートを指定できる。  

公式ドキュメント：[Hugo | Shortcodes](https://gohugo.io/content-management/shortcodes/)

以下のようなHTMLが生成される。HTML5のfigureタグ。  

```
<figure class="center">
    
        <img src="/images/wordclip/appicon.png" width="320" height="640" />
    
    
    <figcaption>
        <h4>英単語Clip</h4>
        
    </figcaption>
    
</figure>
```

なお、`height`は最近新たに対応したとのこと。

[figure shortcode does not parse the height argument · Issue #4014 · gohugoio/hugo · GitHub](https://github.com/gohugoio/hugo/issues/4014)

<br />


## 注意事項

ぶっちゃけこれが本題。  

テーマに公式チュートリアルで紹介されている`ananke`を指定していると、横幅が強制的に100%になるので注意。

Shortcode方式で適当なCSSのクラス名を付加するか、CSSをいじるか、いっそ別のテーマにするなどの対応が必要。  

画像が拡大されて「ナニコレ？」みたいにならないようにしましょう。
xtsでいろいろ混在したカラムをapproxしたい場合

時系列パッケージのxtsを使っていて便利なのが、時系列の再集計、補完処理です。
不定期tickの時系列を再集計用tickを指定するだけで補完してくれる以下の関数は、痒いところに手が届く機能を提供していると思います。

[na.approx](https://www.rdocumentation.org/packages/zoo/versions/1.8-0/topics/na.approx) 線形補完します
[na.locf](https://www.rdocumentation.org/packages/zoo/versions/1.8-0/topics/na.locf) 直前の値をコピーします

# こんな時系列の時どうする？
xtsであるカラムは線形補完したい、他のカラムはLOCF(Last Observation Carried Forward)したい、また数値と文字列が混在している。などです。
これが一筋縄でいかなかったのでまとめておきます。

## 数値カラムの線形補完
zooパッケージのna.approxがあなたの手間を一行で解決してくれます。

```R
filled <- na.approx(object = xts$numeric, xout = grid, rule = 2)
```

## 数値カラムのLOCF
na.approxを並行移動させてもだめで、どうやらzooにアップキャストする必要がありました。


```R
filled <- na.locf(object = as.zoo(xts$numeric), xout = grid, rule = 2)
```

さもないと、"Error in na.locf.xts(object = xts$numeric) : unsupported type"な、エラーが出てしまいます。xts自体にna.locfはあるにはあるようですが。

## 文字列カラムの線形補完
これはnon-senseですが、一応

```R
filled <- na.approx(object = xts$chr, xout = grid, rule = 2)
```

"need at least two non-NA values to interpolate" エラーになります。zooキャストしても同じ。

## 文字列カラムのLOCF

文字列で埋めたいわけですが、以下もありそうなシナリオです。

```R
filled <- na.locf(object = xts$chr, xout = grid, rule = 2)
```

zooキャストしないとunsupported typeエラー、zooキャストしても上記と同じエラーになります。

[xtsのgithub](https://github.com/joshuaulrich/xts/issues/42)に、charデータが通らないバグ報告が2015年にされていますが、openのままですね。

ただ、上の状況でxoutをなしにすると通りますので、根本的には動いているようです。xoutは便利なだけにそのまま動かしたいところです。

# ワークアランドぽいもの

いくつか代替になりそうなものがありましたので、トライしてみました。

## na.locf.default()

上記gitにdefaultをつけるとうまくいくとあります。

```R
filled <- na.locf.default(object = as.zoo(xts$chr), xout = grid, rule = 2)
```

"Error during wrapup: zero non-NA points" と、同じようなエラーを吐きます。

## na.approx( ... , method="constant")

実質これもおなじですが、同じエラーでした。そもそもxoutを使った展開が文字列に対しては機能していないようです。

```R
filled <- na.approx(object = as.zoo(xts$chr), xout = grid, rule = 2, method="constant")
```

デバッガで追ってみると、
[na.approx@github](https://github.com/cran/zoo/blob/master/R/na.approx.R) で、

26行目の

```R
objectm <- merge(object.x, zoo(, xout))
```

で、うまくxoutとマージされてNAが埋め込まれた時系列ができあがっているのですが、そのあとにna.approx.defaultを経由してapproxを呼び出し、以下の中にある

[approx@github](https://github.com/SurajGupta/r-source/blob/master/src/library/stats/R/approx.R)

以下の行で、

```R
    if (nx <= 1) {
	if(method == 1)# linear
	    stop("need at least two non-NA values to interpolate")
	if(nx == 0) stop("zero non-NA points")
    }
```

そのエラーが発生しているようなのですが、具体的な解決法のようなものは見出せませんでした。。。
そもそもlocfは完全にna.approxのラッパになっており、na.apporxはもれなくapproxを呼んでいる、というのがなんとも罠なように思います。characterデータを一度integerに変換して戻すのがよさそうです。

便利すぎるライブラリを使うときは、こういった難所が待ち構えていることを覚悟したほうが良いですね。

## 追記
以下にPythonで行った例を示します（逃げたな！）
[Rの時系列ライブラリxtsでつまづいた処理をPythonで](https://qiita.com/Masutani/items/f6c01f0fac66023a5c5a)