OmniAICreator/Qiita-1.07M huggingface dataset:
Einsum.jlの紹介

[Julia Advent Calendar 2017](https://qiita.com/advent-calendar/2017/julialang)の記事です。JuliaはPython/Numpyは遅いけどC++書きたくないときや、Matlabで謎の行列計算プログラムがあるけどMatlab起動したくないときに代わりに使っています。データもなんとか読めますしね。過去記事の宣伝…。

- <a href='https://qiita.com/taki__taki__/items/f5f8bca4123f227009e0' target='_blank'>JuliaでMatlabのMATファイルを読む - Qiita</a>
- <a href='https://qiita.com/taki__taki__/items/866e3e1b689ef024d356' target='_blank'>JuliaでExtreme Learning Machineを書く - Qiita</a>

# Einsum.jlの概要

Python/Numpyで一部の層にニッチな受容がある**np.einsum**というメソッドがあるのですが、それをJuliaでも使えるパッケージがEinsum.jlです。マクロで実装されています。例えば三次元ベクトル$A=(A_1, A_2, A_3)$と$B=(B_1, B_2, B_3)$について、その内積は$A\cdot B = A_1 B_1 + A_2 B_2 + A_3 B_3$と書けるわけですが、この「要素iについて演算して足す」に相当する部分をEinsum.jlが担います。例えば次のような記事を読んで頂ければ、どういうものなのかもう少し真面目に具体的に分かると思います。

- <a href='http://zellij.hatenablog.com/entry/20130701/p1' target='_blank'>アインシュタインの縮約表記 - 大人になってからの再学習</a>


インストールは普通にやります。

```julia
Pkg.add("Einsum")
```

内積の計算にEinsumを使うと次のように書きます。Σの中身をそのまま書いているような雰囲気になります。

```julia
using Einsum.jl
A = randn(3);
B = randn(3);
AB = 0;
@einsum AB = A[i] * B[i] 
println(AB)         # Einsum.jlによる計算
println(dot(A, B))  # build-in functionによる計算
```

# Pythonとの比較

あまり真面目に比較するつもりはないですが（測定方法どうしたらいいか分からない・・・）、一応github上でベンチマーク用っぽいものを実行してみました。Pythonのnp.einsumは高次元だと遅いという噂がありますが、実際遅かったです。

```julia
using Einsum

function benchmark(;dim1=30, dim2=20)
    A = randn(dim1, dim2)
    B = randn(dim1, dim2)
    C = randn(dim1, dim2)
    D = randn(dim1, dim2)
    E = randn(dim1, dim2)
    X = zeros(dim2, dim2, dim2, dim2, dim2)
    @einsum X[a,b,c,d,e] = A[r,a] * B[r,b] * C[r,c] * D[r,d] * E[r,d]
end
```

Pythonとnumpyで同じ計算を実行した結果のグラフ。雰囲気だけお楽しみください。

![figure](https://github.com/cocomoff/SampleEinsum/blob/master/compare.png?raw=true)

# 実装詳細の話

最初に少し触れましたが、実装はマクロでされています。なぜマクロが必要なのかというと、Einsumの式が

    X[a,b,c,d,e] = A[r,a] * B[r,b] * C[r,c] * D[r,d] * E[r,d]

のように、Juliaの式で渡されるからです。Python/Numpyでは、これを**ra,rb,rc,rd,rd->abcde**というような文字列で渡して実行しています。一方Juliaでは、この式がパースされたデータ構造Exprで渡ってきます。実際に行列積の場合を例に、Exprの中身を見てみると、なんとなくこれをパースしていけば、上のEinsum計算を実行するfor文に変換できそうですね（これをEinsum.jlがやってます）。余談ですが、与えられた行列（BやC）の型を見てAの型を決定するために、**promote_type**や**eltype**が使われています。Juliaerにしたら常識かもしれないですが、自分はこの関数たちは使ったことなかったです。

```julia
julia> expr = :(AB[i, k] = A[i, j] * B[j, k])
:(AB[i,k] = A[i,j] * B[j,k])

# 第一引数を見てみる
julia> expr1 = expr.args[1]

# dumpで中身を可視化 (xdumpはdeprecated)
julia> dump(expr1)
Expr
  head: Symbol ref
  args: Array{Any}((3,))
    1: Symbol AB
    2: Symbol i
    3: Symbol k
  typ: Any

# 実際にevalしてみる
julia> A = zeros(2, 2, 2); i = 1; j = 1; k = 1;

julia> eval(expr1)
0.0 # zeros(2, 2, 2)の[1, 1, 1]要素
```

# オマケ
公式のgithubには特別書かれてないですが、左辺の行列インデクスに出てこない右辺の行列インデクスについて和を取るという仕組みが実装されていました。動作確認してみましょう。

```julia
A = zeros(2)
B = rand(2, 2)
C = rand(2, 2)
@einsum A[i] = B[i, j] * C[j, k]  # kが浮いている
```

これはCの行方向が浮いている状態なので、Cを行方向に和したベクトルで置き換えられます。つまり上のAは下のA2と同じ結果になります。

```julia
C2 = sum(C, 2)
@einsum A[i] = B[i, j] * C2[j]
```

# まとめ
Einsum.jlの簡単な使い方を説明して、中身を少し読んでみました。300行程度の短いコードなので、1行ずつ読んでいってもなんとかなりますね。本題には関係ないですが、今回の記事の内容はGitbookで書きました。テンプレート環境などを構築して下さった方に感謝します（もちろん作者にも）。

https://www.gitbook.com/book/cocomoff/julia_ac_einsum/details
初めてのRaspberry PiはanyPiで

#初心者向けラズパイのスターターキット!?
2017年の4月頃、初心者歓迎！Raspberry Pi ではじめる "クラウド × IoT 勉強会"という言葉に惹かれて参加してきた[【女性限定！】 ラズパイ × Bluemix IoTハンズオンセミナー](https://bmxug.connpass.com/event/51402/)で使用したデバイスについて紹介します。

今回使用したのは[anyPi](https://mechatrax.com/products/anypi/)（エニーパイ）というスターターキットです。

##anyPi 内容物
・Raspberry Pi 3 Model B（ラズベリーパイ3）
・3GPi（スリージーパイ）
・PiConsole I/F（パイコンソールアイエフ）
・microSD(OSインストール済み)
・3Gアンテナ、大容量ACアダプタ　　　　　等
　
箱を開けたらこんな感じでした。
<img width="615" alt="IMG_3284.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/152003/6be13545-f3b6-8fcc-b951-42040971c62c.jpeg">

　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　

##セットアップは「3分」
<img width="615" alt="IMG_3286.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/152003/1b0e8fb3-c16c-469d-1d80-2bd3785a9d16.jpeg">

Raspberry Piを使う時、OSのセットアップ、ネットワークの設定・・・といった作業が必要になります。また、それらの設定のためにディスプレイやキーボードが必要です。初心者にはハードルが高い！！
しかし、anyPiは必要なものは全て用意されており、OSもセットアップ済みです。**簡単な４Step**でセットアップができてしまいます。右も左もわからない私でもできました。
個人的にはSIMカード同梱プランがオススメです。

せっせと部品を組み立てていきます。
<img width="615" alt="IMG_3286.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/152003/d72dc5aa-6ada-9838-44cc-be0d2a543f0d.jpeg">

最終的にはこのようになりました。
<img width="615" alt="IMG_3286.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/152003/938f238e-f2bf-91f6-562b-ebfa84df10e3.jpeg">

##ハンズオンの内容
今回のハンズオンではRaspberry Piから情報を取得し、その情報をグラフで可視化するNode-REDアプリを作成しました。

Node-REDはパズル感覚でプログラムを組むことができるため、プログラム未経験でも大丈夫です。
<img width="615" alt="IMG_3286.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/152003/1bf56b21-16b0-bdc4-9d7a-326f4e2968c1.jpeg">

イベントページにもあがっていますが、当日の資料は[こちら](https://www.slideshare.net/softlayerjp/bluemix-iot-75074203)からも参照できます。


#まとめ
Raspberry Piを使ってみたいと前々から思っていましたが、なかなかやる気と機会がなかったので今回のイベントは私にとってとても良い機会でした。

また、女性限定ということで、気軽に参加できました！！
<img width="615" alt="IMG_3286.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/152003/81374a45-9f12-53a7-90b8-1b70e61c6cca.jpeg">

是非またセミナーを開催して欲しいです。
Arduino＋複数温度センサー３つ（０ｍ、１０ｍ、１５ｍ）

#概要
Arduino＋複数の温度センサー(DS18B20)を使用して計測してみました。

今回は下記のサイトを参考にして作成してみました。
http://blog.goo.ne.jp/mkidmtr70/e/a95e8d383e4f62e58afa4e34ffdeb7b7

#回路図とコード
わかりにくいですが、DS18B20が３つ並列で並んでいます。
また、実際には２つ目、３つ目は１０ｍ、１５ｍのケーブルの先にセンサーをつなげています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/191429/2ccb17b3-7f08-8205-92b1-39dc946d434f.png)

```c

#include <OneWire.h>
#include <DallasTemperature.h>


#define ONE_WIRE_BUS 2

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress temp0 = { 0x28,0xFF,0x5D,0x54,0xB0,0x16,0x04,0x7C };
DeviceAddress temp1 = { 0x28,0xFF,0xEE,0x21,0xB0,0x16,0x04,0x54 };
DeviceAddress temp2 = { 0x28,0xFF,0x7F,0x0E,0x00,0x17,0x03,0x3F };

void setup(void)
{
  Serial.begin(9600);
  sensors.begin();
}

void loop(void)
{
  sensors.requestTemperatures();

  delay(300);

  Serial.print("0:");
  Serial.println(sensors.getTempC(temp0));
  Serial.print("1:");
  Serial.println(sensors.getTempC(temp1));
  Serial.print("2:");
  Serial.println(sensors.getTempC(temp2));
  
  delay(500);
}
```

※各種温度センサーのアドレスの調べ方は下記サイトを参考にしました。
http://henrysbench.capnfatz.com/henrys-bench/arduino-temperature-measurements/ds18b20-arduino-user-manual-introduction-and-contents/ds18b20-user-manual-part-2-getting-the-device-address/


#実行してみると、、
実行してみると、、取得した温度が全て０℃になってしまいました。。

ただ、ケーブルを延長していない状態、または０ｍ、１０ｍだけ、０ｍ、１５ｍだけのケーブルをつないだ場合は正常に温度が取得できました。

#改善
調べてみると、ケーブルが長いことによる抵抗値の増加が問題だったようなので抵抗値を下げることにしました。

ただ、０ｍだけのケーブルをつなげる場合もあるので、途中で抵抗値を変更できるよう2kオームの抵抗と5kオームの半固定抵抗を並列でつなげ、途中で変更できるように配線しました。(2kオーム～7kオームまで変更できるようになりました）

無事に正常な温度が取得できましたので、実際のセンサーにも反映しました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/191429/ec411a07-702a-73bd-eed6-e4429c5f3359.png)


１０ｍ、１５ｍのセンサーをつないだ場合は2kオームだけの抵抗で正常に温度が取得できることを確認しました。

今日は以上です。
アレクサのスキルでDynamoDB


備忘録ようです。

# 設定
1. IAMにいって、左の画面からロールを洗濯
2. lambdaと入力し、作成したロール選択
3. ポリシーのアタッチを押して、「AmazonDynamoDBFullAccess」のチェックをオンにして画面右下の[ポリシーのアタッチ]ボタンをクリックする。


# export.handler内でテーブルの定義
ここでDynamoDB内で定義されていないテーブルなら自動で作るみたい

```js
exports.handler = function(event, context, callback) {
  var alexa = Alexa.handler(event, context);

  alexa.dynamoDBTableName = 'TestTable'; // TestTableテーブルを定義

  alexa.registerHandlers(handlers, synastriesHandlers); // 既存のハンドラに加えてステートハンドラ(後半で定義)も登録
  alexa.execute();
};
```

# 保存

```js
this.attributes["test"] = "test"
```

<img width="906" alt="スクリーンショット 2017-12-07 22.02.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/195882/47a77eff-4f29-164d-1944-d40bf8446b7c.png">
DynamoDBでこんな感じに見れる

#取得
発話によってインテントを分けているので、条件分岐で取得するのは必要になると思われる

```js
if (this.attributes['sign']) {
      var sign = this.attributes['sign']; // DynamoDBから読み込んだデータを参照
} else {
  this.emit('AMAZON.HelpIntent');
}
```
micro:bitの回路図どこ？→あるみたい。すみませんでした！

こんにちは。
NaKaTaFuです。
microbit Advent Calendar 2017 の10日目です。

今日は、microbit.orgの"404 page not found"がかわいい！
<img alt="width=500" src="http://drive.google.com/uc?export=view&id=1ztcSnIffLAL7DqpzNR4Ur5YnsjTHjV-c">
という話のついでに、micro:bitの回路図を探した結果分かってきたことを書いていきます。

5日目に[micro:bitでmicro:pixel EDGE : フルカラーLEDが10個付いたモジュールを使ってみる](https://qiita.com/nakatafu/items/f963921146d2ccaddd3e)で困ったことの１つに、電源周りの回路が良く分からなかったということがあります。

(12/24修正)実は、以下のようなじゃれ事を書いていたのですが、
https://github.com/bbcmicrobit/hardware/blob/master/SCH_BBC-Microbit_V1.3B.pdf
のものがどうも製品の回路図のようです。

http://tech.microbit.org/hardware/schematic/
の内容が更新されないままなので、たどり着けていませんでした....

(以下、適宜修正しておきます。)

以下は、micro:bitの製品版の回路図にたどり着けない段階で、リファレンスボードの回路図を読んでいろいろ勉強した記録となります。

回路図そのものは、
http://tech.microbit.org/hardware/schematic/
にいずれ公開されるのだと思いますが、もうずーっと長い間、以下のままです。
なので、上記製品版（と思われる）回路図に気づけていませんでした。

そこには未だに以下のように書かれており、
「The schematic will be kept in version control in the micro:bit GitHub account. It will be released by the BBC once final sign-off around license terms has completed.」
(回路図はmicro:bitのGitHubアカウント上でバージョン管理されます。ライセンス条項の締結が完了したらBBCにより公開されます。)

代わりに、リファレンスデザインへのリンクと、幾つかのキーデバイスの開設、データシートへのリンクが掲載されています。

[リファレンスデザインのページ](http://tech.microbit.org/hardware/reference-design/)の最後の方に「Design and BOM」セクションがあり、その中に「micro:bit reference design GitHub page」というリンクがあります。
そのリンクの先のGitHubレポジトリに「PDF」というディレクトリがあり、その中をたどっていくと、やっとありました。
https://github.com/microbit-foundation/microbit-reference-design/blob/master/PDF/Schematic%20Print/Schematic%20Prints.PDF

リファレンスデザインの回路図を見ても、製品と違うのであれば役に立たないと思うかもしれませんが、いろいろとコメントが書かれています。

例えば、電源周りで言えば、
"Not same as microbit, this one supports coin cell and support higher loads on 3.3V."
”Not same as microbit, support higher loads on 3.3V, Can also run from up to 5.5V (safe for fully charged Li-Ion)”
”Coin cell Schottky replaced with lower current, less reverse leakage part"
"Changed battery holder for something less annoying.”
などいろいろ書かれていますので、実機を眺めながら、
[電源周りの説明ページ](http://tech.microbit.org/hardware/powersupply/)を眺めていくと、いろいろ分かってくるわけです。
JAVA備忘録

Javaのよく使うけど覚えられないことを書いていく。

##### Mapのループ

```java
for (Map.Entry<String, String> entry : map.entrySet())
```

##### 配列の初期化
 
```java
String[] str = new String[3];
String[] str = { "aaa", "bbb", "ccc" };
```

##### 配列の結合

```java
org.apache.commons.lang3.ArrayUtils.addAll(配列1, 配列2);
```

##### 複数の文字列と比較

```java
if (Arrays.asList("aaa", "bbb").contains(比較する文字列)) {}
```

##### ファイルの読み込み

```java
try (BufferedReader br = new BufferedReader(new FileReader(file))) {
    String line;
    while ((line = br.readLine()) != null) {
    }
}
```

##### 正規表現のグループ

```java
String str = "aaa-bbb-ccc-ddd";
Pattern p = Pattern.compile("^aaa-(.*)-(.*)-ddd$");
Matcher m = p.matcher(str);
if (m.find()) {
    System.out.println(m.group(1)); // bbb
    System.out.println(m.group(2)); // ccc
}
```

##### 日時フォーマット

```java
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss.SSS");
Date date = sdf.parse("2018/01/01 10:00:00.000");
String dateStr = sdf.format(date);
```

##### String.format

```java
// ゼロ埋め
String.format("%05d", 1); // 00005
String.format("%02d", 1); // 01
```

##### BeanのtoStringの簡単実装

```java
@Override
public String toString() {
    return org.apache.commons.lang3.builder.ReflectionToStringBuilder.toString(this);
}
```

##### Mapの使い分け

HashMap　k=vの並びが適当。高速
Hashtable　keyが降順になる
TreeMap　keyが昇順になる
LinkedHashMap　k=vを入れた順番に並ぶ。MapをList化するのであればこれで作るべき

##### VM引数

メモリを増やす。-Xmx3072m -Xms512m

##### Javaコードを試せるWebサービス

https://paiza.io/ja/projects/new

##### 例外の再スロー

catch句でthrow e とするとスタックトレース情報が失われるため、throw new XXXException("", e)など、別の例外でラップしてthrowする
統計学のための数学入門30講をひたすら解いてみる(第2講)

#第2講 和と積
##2.1 和の記号Σの定義と性質
###(2.2)

```math
\begin{align}
\sum_{i=1}^n (ax_i +b) &= (ax_1 +b) + (ax_2 +b) + \cdots + (ax_n +b) \\
&= a(x_1 + x_2 + \cdots + x_n) + nb \\
&= a \sum_{i=1}^n x_i + nb
\end{align}
```

###(例 2.1)

```math
\begin{align}
\sum_{i=1}^2 \sum_{j=1}^2 x_i y_j &= \sum_{i=1}^2 (x_i y_1 + x_i y_2) \\
&= \sum_{i=1}^2 x_i(y_1 + y_2) \\
&= (y_1 + y_2) \sum_{i=1}^2 x_i \\
&= (y_1 + y_2) (x_1 + x_2) \\
&= (x_1 + x_2) (y_1 + y_2) \\
&= \sum_{i=1}^2 x_i \sum_{j=1}^2 y_j
\end{align}
```

###(2.13)の証明

```math
\begin{align}
0 \leq \int_c^d \{g(x)t - h(x) \}^2 dx &= \int_c^d \{g(x)^2 t^2 - 2 g(x) h(x) t + h(x)^2 \} dx \\
&= t^2 \int_c^d \{g(x)\}^2 dx - 2t \int_c^d g(x)h(x)dx + \int_c^d \{h(x)\}^2 dx
\end{align}
```

$\int_c^d g(x)^2 dx \geq 0$ なので、上式を$t$の二次関数と考える。
それがつねにゼロ以上となるので、判別式 $D = b^2 -4ac \leq 0$ となる。
すなわち、

```math
\begin{align}
&D = 4 \{ \int_c^d g(x)h(x)dx \}^2 - 4[\int_c^d \{g(x)\}^2 dx][\int_c^d \{h(x)\}^2 dx] \leq 0 \\
\Leftrightarrow \quad &\{ \int_c^d g(x)h(x)dx \}^2 \leq [\int_c^d \{g(x)\}^2 dx][\int_c^d \{h(x)\}^2 dx]
\end{align} 
```

である。

###(2.20)

$(k+1)^3 - k^3 = 3k^2 + 3k + 1$ に $k = 1, 2, \cdots , n$ を順次代入したものを辺々加えると、次式を得る。

```math
\begin{align}
(n+1)^3 - 1^3 &= 3 \sum_{k=1}^n k^2 + 3 \sum_{k=1}^n k + n \\
&= 3 \sum_{k=1}^n k^2 + \frac{3n(n+1)}{2} + n
\end{align}
```

これより、

```math
\begin{align}
\sum_{k=1}^n k^2 &= \frac{1}{3} * \{ (n+1)^3 - 1 - \frac{3n(n+1)}{2} - n \} \\
&= \frac{1}{3} * \{ n^3 + 3n^2 + 3n +1-1 - \frac{3n(n+1)}{2} - n \} \\
&= \frac{1}{3} * \{ n^3 + 3n^2 + 2n - \frac{3n(n+1)}{2} \} \\
&= \frac{1}{6} * \{ 2n^3 + 6n^2 + 4n - 3n^2 -3n) \} \\
&= \frac{1}{6} * \{ 2n^3 + 3n^2 + n) \} \\
&= \frac{n}{6} * (2n + 1)(n + 1)
\end{align}
```

###(例2.3)

(2.30)の数式は幾何分布の確率密度関数に相当する式であるが、[統計学入門](https://www.amazon.co.jp/%E7%B5%B1%E8%A8%88%E5%AD%A6%E5%85%A5%E9%96%80-%E5%9F%BA%E7%A4%8E%E7%B5%B1%E8%A8%88%E5%AD%A6%E2%85%A0-%E6%9D%B1%E4%BA%AC%E5%A4%A7%E5%AD%A6%E6%95%99%E9%A4%8A%E5%AD%A6%E9%83%A8%E7%B5%B1%E8%A8%88%E5%AD%A6%E6%95%99%E5%AE%A4/dp/4130420658)とは式の形が異なっていた。
調べてみると、幾何分布の確率密度関数は2種類の定義があるらしい。（[Wikipedia](https://ja.wikipedia.org/wiki/%E5%B9%BE%E4%BD%95%E5%88%86%E5%B8%83))

(2.30)のまま、(2.31)の無限和を計算すると釈然としなかったので、
より一般的であるらしいwiki前者の定義に直す。
まず、(2.30)は「最初に成功するまでに重ねた失敗の回数」を$x$ととしており、
その確率密度関数は

```math
Pr(x=k) = PQ^k \quad(k=0,1,2,\cdots)
```

である。
wiki前者の定義では、「最初に成功するまでにかかった回数」を変数$x$とおく。
その回数を$l:=k+1$と定義すると、

```math
Pr(x=l=k+1) = PQ^{l-1} \quad(l=1,2,3,\cdots)
```

と書ける。この式は、初項：$P$、公比：$Q$の等比数列の一般項を表す式と同じ形である。
今、$Q=1-P$であり、$0 < P < 1$であるので、$|Q|<1$である。
よって、この等比数列の無限和は以下の通り得られる。

```math
\begin{align}
\sum_{l=1}^\infty Pr(x=l) &= \sum_{l=1}^\infty PQ^{l-1} \\
&= \frac{P}{1-Q} \\
&= \frac{P}{P} = 1
\end{align}
```

確率密度関数の無限和が$1$となり、幾何分布は確率分布である、と言える。
pandasのデータ集計メモ

#はじめに
最近Kaggleを始めたのですが,pandasで出来ることの便利さと多さ,それに付随してたまにメソッドを忘れてしまう問題が発生したのでメモ次いでにirisデータでデータをいじりまとめてみることにした。


#読み込み
```py3
import pandas as pd
import numpy as np
from sklearn.datasets import load_iris
iris = load_iris()
iris = pd.DataFrame(iris.data, columns=iris.feature_names)
```
#行,列指定
pandasのdataframeではスライスがしようできないのでilocメソッドなとを使用する

```py3
iris.iloc[1,2]#1行目の2列目
iris.iloc[:,2]#2列目
```

#ある列の値からフラグ付け
irisのsepal lengthが5.0cm以上の時にフラグを付けたい場合はapplyとlambdaを利用する

```py3
iris["sepal_len_flag"] = iris["sepal length (cm)"].apply(lambda x:1 if 5 < x  else 0)
```

#groupごとに集計をする
groupbyによってグループごとの統計量を取得できる]

```py3
iris.groupby("sepal_len_flag")["sepal width (cm)"].mean()#sepallenflagごとのsepalwidthの平均を取得する
```
#グループごと,カラムごとに別々の統計処理を行う
groupbyの後ろにaggとつけ引数に辞書形式で指定することで,カラムごとに個別の処理を書けることができる

```py3
iris.groupby("sepal_len_flag").agg({"sepal length (cm)":"mean","sepal width (cm)":["max","min"]})
```

#ある行の最大値のインデックスをとる
idxmaxメソッドによって最大値のインデックスが返される

```py3
iris["sepal length (cm)"].idxmax()"sepal lengthの最大値のインデックスを返す
```
NefryBTで日本語表示させてみる

前日の記事は @ykarakita さんで、[AWS DeepLensのトレーニング済みサンプルモデル全部試す！](https://qiita.com/ykarakita/items/b3e88f582b4bdf9f41c8) でした。
AWS DeepLensうらやましくなんか…！うぅ

さて、本日はNefryBTで何かやるということでしたが、日本語フォントを表示してみました。

## 概要
NefryBTに日本語を表示させよう！

## 既存プロジェクトの調査

Arduino上で日本語を表示させるプロジェクトは、いくつかあります。

### Arduino-misakiUTF16

https://github.com/Tamakichi/Arduino-misakiUTF16
解説記事：http://nuneno.cocolog-nifty.com/blog/2016/03/arduino-e818.html

Arduinoに美咲フォントを組み込むプロジェクト。
簡単に使えるがライセンスが不明。
まあアドベントカレンダーで使うぐらいなら大丈夫でしょう。

### ESP8266-KanjiFont-Library-SPIFFS

https://github.com/Tamakichi/ESP8266-KanjiFont-Library-SPIFFS

上の美咲フォントのライブラリの上位(?)プロジェクト。
こちらはライセンス表記ありで独自ライセンス。

### ShinonomeFONTread

https://github.com/mgo-tec/ShinonomeFONTread
解説記事：https://www.mgo-tec.com/blog-entry-adafruit-oled-ssd1351-lib01.html

Arduinoに東雲フォントを組み込むプロジェクト。
MITライセンス。

## 作ってみよう

今回はライブラリの依存が少なく、導入方法がシンプルな**Arduino-misakiUTF16**を使うことにしました。

### ライブラリの改造

そのままだとESP系のデバイスで動かそうとするとコンパイルエラーになってしまうので、
少し書き換えました。

```C
#include <avr/pgmspace.h>
```
↓

```C
#if defined(ESP8266) || defined(ESP32) || defined(ESP31B)
  #include <pgmspace.h>
#else
  #include <avr/pgmspace.h>
#endif
```

プロジェクトをForkしてパッケージにしておきました。
使いたい場合は、ArduinoIDEの**.ZIP形式のライブラリのインクルード**でインストールできます。

[misakiUTF16_1.04.zip](https://github.com/m2wasabi/Arduino-misakiUTF16/releases/download/1.04-b/misakiUTF16_1.04.zip)

### サンプルコードの作成

とりあえず雑に作ったサンプルが以下になります。

```C:nefry_misaki_font.ino
#include <Nefry.h>
#include <NefryDisplay.h>
#include <NefrySetting.h>
#include <misakiUTF16.h>

void setting(){
  Nefry.disableDisplayStatus();
}
NefrySetting nefrySetting(setting);

void misakiPrint(int x, int y, char * pUTF8) {
  int n=0;
  byte buf[20][8];  //160x8ドットのバナー表示パターン
  while(*pUTF8)
    pUTF8 = getFontData(&buf[n++][0], pUTF8);  // フォントデータの取得
    
  // 文字の描画
  for (byte i=0; i < 8; i++) {
    for (byte j=0; j < n; j++) {
      for (byte k=0; k<8;k++) {
        if(bitRead(buf[j][i],7-k)) {
          NefryDisplay.setPixel(x + 8*j + k , y + i);
        }
      }
    }
  }
}

void setup() {
    NefryDisplay.clear();
    misakiPrint(0,0, "みさきフォントで書き出してみる☆");
    misakiPrint(0,16, "5000兆フロップス欲しい!!");
    misakiPrint(0,24, "5000兆フロップス欲しい!!");
    misakiPrint(0,32, "5000兆フロップス欲しい!!");
    misakiPrint(0,40, "5000兆フロップス欲しい!!");
    NefryDisplay.display();

    delay(5000);

    NefryDisplay.clear();
    misakiPrint(60,28, "ざわ…");
    NefryDisplay.display();

    delay(1500);
    misakiPrint(15,50, "ざわ…");
    NefryDisplay.display();

    delay(1500);
    misakiPrint(80,36, "ざわ…");
    NefryDisplay.display();

    delay(1500);
    misakiPrint(20,3, "ざわ…");
    NefryDisplay.display();

}
 
void loop() {
}
```

動かしてみた。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">NefryBTで日本語表示テスト <a href="https://t.co/hixqO3LlKX">pic.twitter.com/hixqO3LlKX</a></p>&mdash; えむにわ (@m2wasabi) <a href="https://twitter.com/m2wasabi/status/938738692193107968?ref_src=twsrc%5Etfw">2017年12月7日</a></blockquote>

ざわざわ便利ですね。これを発明した福本伸行先生は天才ですね。

## さいごに

ディスプレイに日本語が表示できると、可能性が広がりますね。
ゆくゆくはNefryのファームウェアに組み込めればいいのですが、その場合はライセンスがクリアなライブラリを採用すべきですね。

今後もNefryBTの使い道を広げていきましょう。

明日は @algopia さんで、画像認識とIoTの話らしいです。お金になりそうな話ですね…！
Clova waveのだめなところ

この記事は[yurueアドベントカレンダー](https://qiita.com/advent-calendar/2017/yurue)9日目のものです！

[Clova wave](https://clova.line.me/) はLINEが販売しているAIスピーカーの商品名です。
私はwaveに早いうちから魅力を感じており、早期予約版（価格：10000円）を予約して購入しました。
予約版が販売されている時点から、本販売では15000円で販売されると記載されていたのでこれは買わない手はないと思い、速攻で予約購入しました。
また、10000円でもLINE musicの半年分の利用権（960円＊6ヶ月=5760円）が含まれていて、実質約4000円で買ったようなものなので、とてもお買い得でした！
そんなwaveの使ってみた感想を書いていこうと思います。

# 結構音質がいい
wave は20Wのウーファ１つと5Wのツィータ２つを搭載しているそうです。[参考サイト](https://linecorp.com/ja/pr/news/ja/2017/1893)
部屋の隅において利用していましたが、部屋のどこに居ても音は聞こえてきます。
思っていたより重低音も出ていて迫力があるサウンドを楽しめます。
ちょっと軽いなと感じることはたまにあるけど。。
低音がそんなに出ない曲を聞くときは結構いい音が出ているのではないでしょうか。

#誤認識がすごい
これは個人差があるかもしれませんが、「音楽かけて」と言っても、「もう一度、おっしゃってください」（スローボイス）
と返されるときにはストレスが溜まりますね。
使っているうちに声をかけるのが面倒になって、本体についているボタンからの操作が多くなり、
終いにはほとんどペアリングモードで利用するようになりました。笑

# 会話ができない
連続で会話はできるようにはなっているのですが、固定文な感じが凄いですね。
利用できる機能もニュース、占い、天気などありますが、それ以外のことは全然できない、という感じが凄いです。
普段Siriを利用している分そういうところが気になってしまうのかも。。
今後のアップデートに期待したいですね。

# ペアリングモードでもインターネットの利用が必須
これが正直結構辛いところです。
waveは持ち運びもできるサイズだし、バッテリー駆動で動くのに、ペアリングモードでの利用時も
インターネット環境が必須のようです。
また、出先でインターネットにつなげようとしても、なかなかうまくいかない。
yurue の開発合宿にも持っていったのですが、結局繋がらず部屋の片隅で寝ていました。
Clovaの状態がひと目でわからない（わかりづらい？）のも問題かもしれません。

# IoTできない
Clova Extension Kit というものがリリースされると思っていたのですが、まだ出ていないようです。
というか、ぐぐっても出てこないし、韓国のサイトに飛ばされる。。ｗ
スピーカーとかマイクとか、LEDとか赤外線センサとか色々積んでいるので、いじれたら楽しそうなのですが、残念です。

---
本当はもっとありそうだけど、思いつかなかったのでこれくらいで。
明日は @Tsuyoposon です！
よろしくお願いします〜〜！
g++: テンプレートクラスの明示的インスタンス化で `=default` した関数が生成されないバグ

# 問題となるケース

以下のようなコードをコンパイルする。

```C++:foo.h
#include <vector>

template <typename T>
struct Foo {
#ifdef USE_DEFAULT
  Foo() = default;
#else
  Foo() {}
#endif
  std::vector<int> x;
};
```
```C++:foo.cc
#include "foo.h"
template struct Foo<int>;
```

`Foo() {}` のほうだと

```shell-session
$ g++ -std=c++11 -c foo.cc 
$ nm -C foo.o | grep Foo
0000000000000000 W Foo<int>::Foo()
0000000000000000 W Foo<int>::Foo()
0000000000000000 n Foo<int>::Foo()
```

のようにコンストラクタのコードが生成されていることがわかる。
一方、  `Foo() = default;` だと


```shell-session
$ g++ -std=c++11 -c -DUSE_DEFAULT foo.cc 
$ nm foo.o 
(出力なし)
```

のように生成されない。

これは g++ のバグのようだ → https://gcc.gnu.org/bugzilla/show_bug.cgi?id=57728

C++11 以降だと、テンプレートの明示的インスタンス化は、利用側での extern template と併せて使われることが多いと思うが、その場合このコンストラクタの定義が生成されていないため、リンク時にエラーになる。

確認は以下の g++ 5.4.0 で行ったが、最新の 7.2.0 でも同様の結果だったので直っていないようだ。

```shell-session

$ g++ --version
g++ (Ubuntu 5.4.0-6ubuntu1~16.04.5) 5.4.0 20160609
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
```

## インライン ?

extern template でインスタンス化を抑制しているからといって、インライン化しないわけではない。
インライン化された場合にはこのバグは問題にならない。

上の例の `foo.h` を利用する以下のコードを考える。

```C++:main.cc
#include "foo.h"

extern template class Foo<int>;

int main() {
  Foo<int> foo;
}
```

最適化オプションなしでコンパイルすると以下のようになる。

```shell-session
$ g++ -std=c++11 -c -DUSE_DEFAULT main.cc
$ nm -C main.o  | grep Foo
                 U Foo<int>::Foo()
0000000000000000 W Foo<int>::~Foo()
0000000000000000 W Foo<int>::~Foo()
0000000000000000 n Foo<int>::~Foo()
```

コンストラクタのシンボルを参照している。しかしこのコンストラクタは生成されていないから、リンク時にエラーとなる。

```shell-session
$ g++ -std=c++11 -DUSE_DEFAULT main.cc foo.cc
/tmp/ccQHJquT.o: In function `main':
main.cc:(.text+0x1f): undefined reference to `Foo<int>::Foo()'
collect2: error: ld returned 1 exit status
```

一方、 `-O2` をつけてみると

```shell-session
$ g++ -std=c++11 -c -DUSE_DEFAULT -O2 main.cc
$ nm -C main.o  | grep Foo
(出力なし)
$ g++ -std=c++11 -DUSE_DEFAULT -O2 main.cc foo.cc
$ echo $?
0
```

と問題なくリンクできる。 インライン化により、コンストラクタ呼び出しが消滅しているためである。


# 対処法

- 明示的インスタンス化するクラスでは `= default` を使わない
- extern template を使わない

のような消極的な方法しか思いつかない…。

# まとめ

C++ テンプレートクラスの明示的インスタンス化の際、 `=default` で定義された関数が生成されない g++ のバグについて書きました。
EC-CUBEからMySQL8で新しく予約語となった「rank」を消した話

MySQL8で `rank` が新しく予約語となりました。
EC-CUBEでも `rank` をソート順のカラム名として利用していたのでMySQL8対応で別のカラム名に置換する必要が出てきました。
この対応でいろいろと調べたので[次回12/17の記事](https://qiita.com/okazy/items/b6d01f5aa87ea44d6931)で解説します！
Nuxt.jsとElementUIを組み合わせて使う

## 経緯

ReactのNext.jsが2系の時代にちょっと使ってみたもののCSSまわりが馴染めず（当時外部ファイルでグローバルCSSを管理したかった）だいぶ放置してしまっていたところ、Vue.jsのNuxt.jsで1系（RC版）が出ていることに気づいたので試してみることに。

せっかくなので、良さげなUIライブラリのElementも使ってみよう。

## Nuxt.js？

<img width="400" alt="スクリーンショット 2017-12-07 23.55.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/1403/317e20fe-ad5a-d0b1-6016-2b0ea096207d.png">


https://ja.nuxtjs.org/

サーバサイドレンダリングやルーティングが楽にできるVue.jsのライブラリ（と捉えている）。
ReactのNext.jsに対して、Vue.jsのNuxt.js。


## ElementUI？

<img width="400" alt="スクリーンショット 2017-12-07 23.55.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/1403/204bee8b-8161-20b5-ecd8-f13506145532.png">


http://element.eleme.io/

グリッドレイアウトからボタン・タブなどのUI、フォーム要素、ダイアログ、ツールチップ、ローディングまでいろいろ揃ってるVue.js向けUIライブラリ。
これがあればjQueryライクにVue.jsを使いながら、整ったレイアウトやUIを作り込めるのではないか（と期待している）。


## 手順

### Nuxt.jsのインストール

```shell-session
npm i nuxt -S
```

package.jsonは以下のようになっている（nuxt 1.4.0）。

```package.json
{
  "name": "nuxt+element",
  "version": "1.0.0",
  "description": "",
  "main": "nuxt.config.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "nuxt": "nuxt"
  },
  "keywords": [],
  "author": "teriyakisan",
  "license": "ISC",
  "dependencies": {
    "nuxt": "^1.4.0"
  }
}
```

### Elementのインストール

```shell-session
npm init -y
npm i element-ui -S
```

Nuxt.jsのプラグインとして使うため、`plugins/element-ui.js`、`nuxt.config.js`を作成。

```plugins/element-ui.js
import Vue from 'vue'
import ElementUI from 'element-ui'
import locale from 'element-ui/lib/locale/lang/ja'

Vue.use(ElementUI, { locale })
```

```nuxt.config.js
module.exports = {
  build: {
    vendor: ['element-ui']
  },
  plugins: [
    '~plugins/element-ui'
  ],
  css: [
    'element-ui/lib/theme-chalk/index.css'
  ]
}
```

サーバ起動。

```shell-session
npm run nuxt
```

### ページを作成

`pages/index.vue`を作成
ElementのRateコンポーネントを使ったサンプルを記述。
なんとなく★の色がNuxt.jsカラーになるようにしておく。

```html:pages/index.vue
<template>
  <div>
    <div class="block">
      <h4>Nuxt.js + Element？</h4>
      <el-rate v-model="value" :colors="['#2F3D4D', '#64B486', '#4B7C6E']"></el-rate>
    </div>
  </div>
</template>

<style scoped>
  .block {
    padding: 0 20px;
  }
</style>

<script>
export default {
  data () {
    return {
      value: null
    }
  }
}
</script>
```

### ブラウザで確認

![nuxtjs_n_element.gif](https://qiita-image-store.s3.amazonaws.com/0/1403/259afb44-1541-3b77-6ee7-a80a50156227.gif)


いい感じ！ :beer:
Python3とPySide2でGUI作成

PySide2でのGUI開発の環境を整えたので覚書に。
- OS：Ubuntu17.10
# 1. Python3の開発環境構築
PySide2の入手が一番簡単なので今回はAnaconda or Minicondaで構築していきます。
自身は余計なパッケージとかいらないのでMinicondaでいきます。

- Anaconda　https://www.anaconda.com/download/#linux
- Miniconda https://conda.io/miniconda.html

AnacondaとMinicondaについての詳しいことは他の方の投稿を参照ください
インストールしたら作業用の環境を作っておきます。

# 2. PySide2をインストール
- https://wiki.qt.io/PySide2_GettingStarted

GitリポジトリをCloneしてビルド実行...とかしたかったんですが何度やってもうまくいかない！！！
なぜでしょう...
そこで今回はconda経由でパッケージを取得します。

- https://anaconda.org/conda-forge/pyside2


```
$conda install -c conda-forge pyside2
```

# 3. ソースコード
- https://www1.qt.io/download-open-source/?hsCtaTracking=f977210e-de67-475f-a32b-65cec207fd03%7Cd62710cd-e1db-46aa-8d4d-2f1c1ffdacea#section-2

QtをDLしてインストール。
そしたらQtCreatorで.uiファイルを編集してGUI部分を作成して保存します。
.uiファイルを.pyに変換します。

```
pyside2-uic -o 出力したい.pyファイル 作成した.uiファイル

```

とりあえず初期状態のウィンドウを.pyで出力しました。

```.py3:mainwindow.py
# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'Desktop/mainwindow.ui'
#
# Created: Thu Dec  7 20:53:34 2017
#      by: pyside2-uic 2.0.0 running on PySide2 2.0.0~alpha0
#
# WARNING! All changes made in this file will be lost!

from PySide2 import QtCore, QtGui, QtWidgets

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(400, 300)
        self.menuBar = QtWidgets.QMenuBar(MainWindow)
        self.menuBar.setObjectName("menuBar")
        MainWindow.setMenuBar(self.menuBar)
        self.mainToolBar = QtWidgets.QToolBar(MainWindow)
        self.mainToolBar.setObjectName("mainToolBar")
        MainWindow.addToolBar(self.mainToolBar)
        self.centralWidget = QtWidgets.QWidget(MainWindow)
        self.centralWidget.setObjectName("centralWidget")
        MainWindow.setCentralWidget(self.centralWidget)
        self.statusBar = QtWidgets.QStatusBar(MainWindow)
        self.statusBar.setObjectName("statusBar")
        MainWindow.setStatusBar(self.statusBar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle(QtWidgets.QApplication.translate("MainWindow", "MainWindow", None, -1))


```

そしたらこのGUIの.pyファイルを読み込んで出力するmain.pyを書きます。

```py3:main.py

# -*- coding: utf-8 -*-
import sys
from mainwindow import Ui_MainWindow
from PySide2.QtWidgets import *

class MainWindow(QMainWindow):
    #Ui_MainWindow生成のための初期化処理
    def __init__(self, parent = None):

        #UI初期化処理
        super(MainWindow, self).__init__()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

#実行処理
if __name__=="__main__":
    #アプリケーション作成
    app = QApplication(sys.argv)
    #オブジェクト作成
    window = MainWindow()
    #MainWindowの表示
    window.show()
    sys.exit(app.exec_())

```

# 4. 実行
2つのファイルを同じフォルダに入れて実行

```
$python main.py
```

無事にウィンドウが表示されたら成功です
![Screenshot from 2017-12-07 21-18-53.png](https://qiita-image-store.s3.amazonaws.com/0/221989/720fb248-14ce-645d-5c09-6e921934a16c.png)

とりあえずPySide2でGUI開発をするためのスタート地点ですね。
ここからいろんな機能を追加していけたらと思います。
Android開発者からデザイナーの皆様へ

Nuco Advent Calendar 7日目の記事です。

[Design | Android Developers](https://developer.android.com/design/index.html)
[Human Interface Guidelines](https://developer.apple.com/ios/human-interface-guidelines/overview/themes/)

ちなみに上記の両記事を既にお読みの方は本記事を読む必要はありません。
ブラウザの戻るボタンをクリックしてください。


# スマホアプリのデザイン
恐らくほとんどの人はAndroid、iOSのどちらか一方しか所持していないですよね？
お近くに自分と異なるOSを使っている人がいたら、是非アプリのUIを見比べてみましょう。

思っていたより違うんじゃないでしょうか？
特に有名なアプリはほぼデザインが異なるはずです。

メニューバーはiOSは画面下部、Androidは画面上部にあるのではないでしょうか？
(もちろんそうでないアプリもあると思いますが。)

あるある話なのかはわかりませんが、スマホアプリの開発を行うときにデザインが一種類しかないことがあります。
その場合、たいていはiOS風のデザインになっているかと思われます。
(デザイナーの方がiOSユーザーが多いからなのかな？)

そこでAndroid開発者は思うわけです。
「またか…」


# がっかりするAndroidアプリエンジニア
もちろんデザインにかける予算には限りもあるし、必ずしも両OS向けのデザインをそれぞれつくることができるわけでないのは理解できます。
プロジェクトマネージャーやプロダクトマネージャーの方がUI/UXへの意識が薄い人だとそうなってしまうのかもしれません。
しかし私は以下の理由からスマホアプリはきちんと両OSごとにデザインを変更することをおすすめします。

- 実装しづらい
- 使いづらい

私が以前担当した案件ではこんなことがありました。

PM「これがクライアントから渡されたデザインね」
ワイ(またか…)
PM「Androidのデザインや仕様はiOSに合わせてね」
ワイ「(一応言っておくか…)しかし、iOSにデザイン合わせるとAndroidユーザー的には使いづらいと思いますよ」
PM「そうかもしれないけど、iOSに合わせてってのはクライアントからの指定だから合わせてね」
ワイ(思考停止かよ…)
ワイ「はい」


渡された仕様書にはいくつか実装しづらい仕様がありました。（ほんの一部だよ！！）

- ステータスバーをタップしたらリストの最上段までスクロールする
- リストをスワイプすると削除ボタンが表示される

この仕様があると一体どうなるのでしょうか。


# 使いづらい
Androidはステータスバーをタッチすると通知パネルが降りてきます。
アプリ使用中にwifiにつなぎたくなるかもしれません、逆に回線が重いのでwifiを切りたくなるかもしれません。
Android端末のデフォルトの挙動を改変するとユーザーは混乱してしまうでしょう。
（そもそもAndroidはステータスバー操作時の挙動をアプリ側で奪うのは簡単にはできない。）

また、Androidユーザーの方々は基本的にリスト中のアイテムに対して何か操作をしたいときは、
経験的にアイテムを長押ししてコンテキストビューが表示されることを期待するはずです。
まさかリストのアイテムを削除するためにアイテムを横スワイプする必要があるとは思わないでしょう。

ユーザーは今までの経験によりスマホアプリの挙動に対する一般的な概念モデルを持っています。
それに反するような挙動はユーザーが混乱するだけです。

よいデザインとは単に見た目がおしゃれとか、奇抜なデザインという意味ではありません。
アプリではなくて、AndroidというOS・端末自体がユーザーにアフォードするものに沿っている必要があるのです。


# 実装しづらい
PMに伝えられたアイテム削除の仕様を実現するにあたり、Androidにはコンテキストメニューという便利なToolがあるにも関わらず、AndroidSDKが提供しないリスト横スワイプ時の動作をわざわざ自分で実装する必要があります。
しかし世の中は便利なもので、githubなどを調べるとけっこうiOS風にデザインされたViewクラスがそこそこ見つかります。

[AndroidSwipeLayout](https://github.com/daimajia/AndroidSwipeLayout)
↑こういうのとか。他にも結構あります。

StackOverFlowにも「Android ○○ like iOS ××」みたいなタイトルの質問結構あります。
~~国が違ってもエンジニアの悩みはだいたい一緒~~

私も当時こちらのライブラリを使って実装を行おうと思ったのですが、
一度に複数のアイテムをスワイプできるという理由で却下されました(泣)
たしかにiOSは一つのアイテムをスワイプしてから、他の領域を操作すると自然と閉じてたような。。
私は普段からAndroidユーザーなのでうろ覚えですが。。

結局隣でiOSエンジニアがささっとリストアイテム削除ボタンを実装しているのを恨めしい顔で横目に見ながら、PagerAdapterとviewpagerを使って自分でその機能を実装したのですが、

PM「iOSに比べて操作性が悪い」
PM「スワイプに反応しないときがある、なんとかしろ」
PM「他の領域タップしたらスワイプを戻せ」
ワイ「はい…」

半泣き状態で色々と改善を重ねて何とかご満足頂きました。。


# 結論
スマホアプリ開発に関わるのであれば、開発者やデザイナーでなくとも、
各々のOSのデザインガイドラインには目を通しておきましょう。

普通におもしろいし、勉強になります。
やはりPMやエンジニアであってもある程度デザインに関する知識があったほうが、
プロジェクトが円滑に進むと思います。

~~iOS風にしてってAndroidアプリエンジニアに言うのやめてね！！！！~~
LINQで選択肢の全組み合わせ展開

# 選択肢を与えて、重複のない全組み合わせを返す

1,2,3の選択肢がある時に、{1,2,3}{1,3,2}{2,1,3}{2,3,1}{3,1,2}{3,2,1}のように重複のない全組み合わせを書く必要があったのでやってみた。
使う時にお手軽にしたいので、拡張メソッドとして作る。

```csharp:Extention.cs
        /// <summary>
        /// 選択肢の列挙の全組み合わせを展開
        /// choices {1,2,3}⇒ 戻り値{1,2,3}{1,3,2}{2,1,3}{2,3,1}{3,1,2}{3,2,1}
        /// </summary>
        /// <typeparam name="T">型引数</typeparam>
        /// <param name="choices">選択肢の列挙</param>
        /// <returns>展開結果</returns>
        public static IEnumerable<T[]> Expand<T>(this IEnumerable<T> choices)
        {
            //重複あり
            if (choices.Count() != choices.Distinct().Count()) { throw new Exception("has duplicate value"); }

            //選択結果は空からスタート
            var choosed = new T[] { };

            //展開開始
            var query = Expand(choices, choosed);
            return query;
        }

        /// <summary>
        /// 選択肢の列挙の全組み合わせを展開(再帰)
        /// </summary>
        /// <typeparam name="T">型引数</typeparam>
        /// <param name="choices">選択肢の列挙</param>
        /// <param name="choosed">選択済要素の列挙</param>
        /// <returns></returns>
        private static IEnumerable<T[]> Expand<T>(IEnumerable<T> choices, IEnumerable<T> choosed)
        {
            //選択肢がなくなったら終了
            if (!choices.Any()) { yield return choosed.ToArray(); }

            foreach (var choice in choices)
            {
                //選択肢から1つ選んで、選択済要素に入れる
                var newChoosed = choosed.Concat(new T[] { choice });

                //選択肢から削除
                var newChoices = choices.Where(v => !choice.Equals(v));

                //新たな選択肢と選択済要素で再帰
                var query = Expand(newChoices, newChoosed);
                foreach (var qq in query)
                {
                    //配列を順次返す
                    yield return qq.ToArray();
                }
            }
        }

        /// <summary>
        /// 結果表示用
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="query"></param>
        public static void DisplayElement<T>(this IEnumerable<T[]> query)
        {
            foreach (var q in query)
            {
                Console.WriteLine(string.Join(" ", q));
            }
        }
```

## 実行してみる
実行用のドライバ書いて。。。

```csharp:Program.cs
        public static void Main(string[] args)
        {
            var items = new int[] { 1, 2, 3 };

            var query = items.Expand<int>();
            query.DisplayElement<int>();
        }
```

実行！想定通り。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/221879/aa9b138f-fd8a-2a9f-99f2-e56c7bc7d2d7.png)


要素を4つに増やしてみる。

```csharp:Program.cs
        public static void Main(string[] args)
        {
            var items = new int[] { 1, 2, 3, 4 };

            var query = items.Expand<int>();
            query.DisplayElement<int>();
        }

```

おっけー。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/221879/76e91493-dd57-4447-489b-75122335cdc9.png)
Vuexについてまとめてみた

# Vuexについて

---

## 目次

- vuexとは
- メリット デメリット

---

## vuexとは

---

- Vuex は Vue.js アプリケーションのための 状態管理パターン + ライブラリです。 これは予測可能な方法によってのみ状態の変異を行うというルールを保証し、アプリケーション内の全てのコンポーネントのための集中型のストアとして機能します。

---

- コンポーネント外にデータを管理する場所(ファイル)を作ることによって共通のデータを複数のコンポーネントから呼び出せるようにする

---

## vuexの流れ

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

---

- dispatch
    - コンポーネント側からvuexのactionを動かす
- action
    - commitを呼び出したり、非同期の処理を行う事ができる
- commit
    - コンポーネント側から直接mutationを呼び出す
    - store内でも呼び出す事ができる
- mutation
    - stateの状態を変更する
- 単一方向データフロー
    - 必ずcommit →　mutation しないと状態を変えられない

---

## 今まで

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

---

## Vuex

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

---

## メリット

#### 今までは都度propとemitを繰り返していたがvuexを使うと
```javascript
this.$store.state.key名
```
#### でどのコンポーネントからでも呼び出せるのでデータが扱いやすくなった

- データがcommitによってしか変えられないのでエラーが起きた際にわかりやすい

---

## デメリット

- commitが何をしてるかを追うのがちょっとめんどくさい
    - でも以前のprop emitを追うよりはいい


----

## まとめ

- データがどのコンポーネントからでもアクセスできるので追加で何か動きや機能をつけたい時は実装しやすいと思いました

---
AWS SageMakerをコンソールから試したらハマったのでメモ

#はじめに
先週のRe:Invent2017でリリースされた[AWS SageMaker](https://aws.amazon.com/jp/sagemaker/)を早速試してみました。
AWSの[ドキュメント](http://docs.aws.amazon.com/sagemaker/latest/dg/gs.html)では
ノートブックインスタンスを作成し、コマンドでその後の手順を実行していますが、
今回はコンソールから試してみました。けっこうハマったのでメモです。

#使用データ
今回はモデルデータとしてirisのデータセットを使用。
[こちら](http://home.a00.itscom.net/hatada/ml/data/iris01.html)から生データを入手しました。

#やってみる
SageMakerでは、

1. ノートブックインスタンスの作成
1. ジョブの作成
1. モデルの作成
1. エンドポイントの作成

の順で実施していけばいいらしい。

![sagemaker1.png](https://qiita-image-store.s3.amazonaws.com/0/182484/55880920-d7a0-70e0-a793-a49c856ac912.png)

##ノートブックインスタンスの作成
設定項目をいい感じで入力すると、jupyter notebookのインスタンスが作成される。
この中でデータの整形だったりの前準備をするといいらしい。

今回はpythonを書いて行うような前処理もないので、ここは割愛。


##ジョブの作成
早速、ハマる。

今回、K-Meansを試してみる。
この他にも全10種類ほどのアルゴリズムが用意されている。
また、自前のDockerイメージを使えば、独自のアルゴリズムを搭載することもできる。


設定をポチポチ入力していく。

![sagemaker8.png](https://qiita-image-store.s3.amazonaws.com/0/182484/c279ef50-5b20-4b58-3440-b663c34dea73.png)

アルゴリズムの調整パラメータもポチポチ入力していく。
ここは選択したアルゴリズムによって変わる。

![sagemaker9.png](https://qiita-image-store.s3.amazonaws.com/0/182484/fbfc82cc-1a5c-c380-977d-e657fc427fbe.png)

で、次がハマりポイント。
コンテンツタイプをtest/csvみたいに誤字ったり
S3の場所設定をミスったりすると、
わけの分からないエラーがでる。
(新しいサービスだからエラーメッセージが追いついてない...?)

ちゃんと入力するとこんな感じです。

![sagemaker10.png](https://qiita-image-store.s3.amazonaws.com/0/182484/2d1bf027-9fc8-e5dd-726c-07f94ad5e15e.png)

##モデルの作成
ここでもちょいハマり。
ジョブの作成時に結果としてS3に格納されるのは、
学習結果のパラメータ（アーティファクト）のみなので、
トレーニングに用いた推論の本体部分イメージが別途必要となる。

なので、
先ほど作成したジョブの詳細から、トレーニングイメージのアドレスをコピーして、
![sagemaker13.png](https://qiita-image-store.s3.amazonaws.com/0/182484/84468260-4d4e-453d-4014-b16b2f74a39e.png)


モデルの設定画面に入力する。
(私は空のECRレポジトリのアドレスを入力し続けてハマりました。。)
![sagemaker14.png](https://qiita-image-store.s3.amazonaws.com/0/182484/9264c209-4b7d-6d63-e1ed-f80746910925.png)




##エンドポイントの作成
最後にエンドポイント設定の作成、エンドポイントの作成を行う。
エンドポイントの作成が完了すると、以下のようにAPIが作成され、
テストデータをPOSTすることで、結果を得ることができる。
![sagemaker21.png](https://qiita-image-store.s3.amazonaws.com/0/182484/011ecf52-7ce6-702e-8372-a61994eaa7e0.png)

エンドポイントがInServiceの間は課金が続くが、
現状、エンドポイント停止の操作ができないので、
使用しなくなったら一旦エンドポイントを消去し、
使うときに再び、エンドポイント設定からエンドポイントを作成するのが良さそう...?

#おわりに
今回はAWS SageMakerを試してみました。
機械学習をちょっと導入してみたい方にはとてもおすすめなサービスだと思います。

また、Lambdaにデフォルトで導入されているboto3は
まだSageMakerに対応していないので、
Lambdaを使ってPOSTするときは、最新のboto3を自分で導入する必要があります。

次は自前Dockerイメージからの作成を試してみたいと思います。では。
Jupyter notebook/JupyterLab/Google Colaboratory 行番号の表示

（2020.10.08追記）
JupyterLabについても追記します。

（2019.06.29追記）
少し情報を追記します。

###1. Jupyter notebook（ローカル環境）上で行番号を表示する場合
対象のCell上で、

```
「esc」+「l」（エスケープ、小文字のエル）
```

###2. Jupyter Lab上で行番号を表示する場合
メニューからの操作になります。

```
JupyterLabのメニュー「View」→「Show Line Numbers」にチェックを入れる
```



###2. Google colaboratory上で行番号を表示する場合
対象のCell上で、

```
「Ctrl」+「m」+「l」（コントロールと小文字のエムを押した状態で、小文字のエル）
```

です。

以下、以前の記事。
---------------------------------
備忘録として。

環境は、
Windwos10 
bas on ubuntu on windows
jupyter notebook
python3
です。

pythonでエラーを出しまくってます( ;∀;)

エラーも困りますが、エラーが発生している箇所（行番号）を探すのにはもっと困っています。
ステップ数が多いコードだと、行番号を探すのがとても大変で((+_+))

行番号を表示できないかと調べえていたところ、@7of9さんの情報を発見。
https://qiita.com/7of9/items/a872f9514aef3fb2fc8a

以前、@7of9さんにはコードの修正依頼を頂いたこともあります。
また今回も、ありがとうございます。

では、具体的に行番号の表示方法を。

行番号を表示するには、対象のCell上で、

```
「esc」+「l」（小文字のエル）
```

戻す（行番号を非表示にする）のも「esc」+「l」。

Cellの選択状態によっては「l」だけでも行けるみたいです。
ただし、一応「esc」して置いたほうが安心ですよね。

これでエラーの対処が格段に楽になりそうです(;´∀｀)
openmaptiles のデータ規模と処理時間の関係

# 国レベルのベクトルタイル作成の所要時間
[gh:openmaptiles/openmaptiles](https://github.com/openmaptiles/openmaptiles/) を使って、実際に Geofabrik の OSM extract データを変換した時の処理時間を共有します。もちろん、計算機の設定によって速度は10倍程度くらいは変わるでしょうが、100倍ほど変わるということはそうそうないと思います。その程度の参考にされてください。

データセット | pbfサイズ | imposm3 | mapnik | タイル数 | 最高速 
--- | --- | --- | --- | --- | ---
australia | 318MB | 11m50s | 15h23m | 586万 | 117tiles/s
congo-democratic-republic | 95MB | 4m34s | 1h56m | 35万 | 53tiles/s
egypt | 34MB | 1m43s | 14h4m | 338万 | 76tiles/s
estonia | 65MB | 3m21s | 1h42m | 53万 | 94tiles/s
ethiopia | 34MB | 1m35s | 1h10m | 24万 | 71tiles/s
europe | 19GB | 72h58m | 終了させず | 終了させず | (18tiles/s)
fiji | 6MB | 16s | 6m23s | 4万 | 108tiles/s
germany | 3GB | 6h8m | 1d0h18m | 281万 | 108tiles/s
guinea | 48MB | 2m6s | 47m3s | 18万 | 65tiles/s
hungary | 141MB | 6m19s | 1h18m | 29万 | 62tiles/s
japan | 1.2GB | 57m4s | 12h10m | 311万 | 79tiles/s
latvia | 56MB | 2m16s | 1h40s | 49万 | 97tiles/s
madagascar | 44MB | 1m47s | 1h7m | 27万 | 72tiles/s
north-americas | 7GB | 7h8m | 終了させず | 終了させず | (37tiles/s)
philippines | 221MB | 11m32s | 6h50m | 183万 | 81tiles/s
somalia | 14MB | 35s | 3h6m | 76万 | 74tiles/s
south-america | 1GB | 47m | 7d14h34m | 6328万 | 116tiles/s

なお、上記のデータを採取した時点の gh:openmaptiles/openmaptiles には、wikidata の対応づけは統合されていませんでした。

# 所見
## データとの関係について
- 日本やイタリアなど、pbf 1GB 級のデータは本当に気軽にベクトルタイル化できる。
- フランスやドイツなど、pbf 3GB 級のデータのベクトルタイル化には多少気合いが必要。 
- 欧州や北米など、10GB 級のデータのベクトルタイル化は、私が試したPC一台の環境で実施することは未だ現実的ではない。タイル出力速度が顕著に下がるからである。
- 南アメリカのように、疎であるが面積が広い領域については、100tiles/s 前後の速度で安定して変換できるので、時間を待ちさえすれば良い。
- PostGIS データベースのなかのデータベースが大きくなった場合に、パフォーマンスが落ちる傾向がある。タイルに出す時に空間検索をしているようなので自然だし、パフォーマンスをあげるのであれば、（ある意味での）レンジパーティショニングを含めた空間分割が有効であろう。

## ソフトウェアの性能について
- osm.pbf 形式は本当に優秀。これが小さいおかげで現実的な速度でダウンロードできる。
- imposm3 は本当に優秀。これらが恐ろしく高速なおかげで現実的な速度で変換できる。
- (wikidata データを統合するパーツは、かなりやっつけ仕事で作っているように見える。)
- mapnik-tile-copy の働きはそこそこ。
- (mbtiles 形式はかなり圧縮してくれている。同内容のタイルの参照を束ねる等しているからか。)
Python リスト内の連続しない複数要素を抽出する方法

リスト内の連続しない複数要素を抽出する方法
（リスト内の複数要素を飛び飛びで抽出する方法）

連続しない要素をitemgetterで選択する
http://lightson.dip.jp/zope/ZWiki/099_e9_85_8d_e5_88_97_e3_81_8b_e3_82_89_e8_a4_87_e6_95_b0_e3_81_ae_e8_a6_81_e7_b4_a0_e3_82_92_e4_b8_80_e5_ba_a6_e3_81_ab_e5_8f_96_e5_be_97

連続しない要素を削除
https://qiita.com/saa/items/d18a36d764c74fc8bf26
DIB

帰りの電車でぽちぽち入力シリーズ。

windowsで画像を扱う時に使うDIB。
基本的には画像データがピクセルデータとしてならんでるだけのもの。
これにbitmapヘッダをくっつけるとbmpファイルになる。

データ部、いわゆるscan0は単純な構造で、rgbaのビットが行儀よく並んでいるだけ。
rgbはそのまま赤緑青の成分。
aはアルファチャネルでいない場合もある。透過を示す値。
8ビットの場合はそれぞれが0-255で表される。
0(黒、透過)-255(白、不透明)
32ビットrbgaの場合は4バイトで1ピクセルを示す。

画像は矩形なので幅と高さがあるから、一行のバイト数を示す値があって、それがstride。
strideで次の行に入ると矩形になる。
つまりstrideにheightを乗じると全体のデータサイズになる。
strideをwidthで割るとピクセルあたりのバイト数がわかる。

グレースケールにするとか、半透明にするとか、そういった時にはピクセルを直接書き換える方が速いかもね！？
解像度と単位

帰りの電車でぽちぽち入力シリーズ。

解像度、Dots Per Inch でdpi。
単位はだいたい以下を扱うことが多い？

ピクセル(px)
インチ(inch)
ミリ(mm)
ポイント(pt)

この中でピクセルだけが実際の大きさを持たないため、解像度が必要。

1inch=25.4mm
1pt=1/72inch

px / dpi = inch
inch * 25.4 = mm
inch / 72 = pt

たとえば1000ピクセルは300dpiで、
(1000 / 300) × 25.4mm ≒ 84.66mm
200dpiだと
(1000 / 200) × 25.4mm = 127mm
と、解像度によって実寸が変わる。

当然解像度が大きい方が1mmあたりに入るピクセルが増えるのでそのぶん高画質になる。
けれども肉眼だとせいぜい300dpiがいいとこみたい。
Rubyで書かれた設定ファイルから雑に取り出す

# この記事は

[表参道.rb #29 ~ Module ~](https://omotesandorb.connpass.com/event/73378/) におけるLT発表資料です hask(\_ \_)eller

----

# 自己紹介

- [山本悠滋](https://twitter.com/igrep) ([@igrep](https://twitter.com/igrep))
- Haskell歴 ≅ プリキュア歴 ≅ 社会人歴 ≅ 約5年半。
- 仕事はJavaじゃば！
- 前職はSansanで、EightのバックエンドをRailsで書いておりました。
    - **元**なので私がいた時代の話ならあんなこともこんなことも話せちゃうよ！ :smirk:

----

# 軽い宣伝

- Haskellでリッチな静的型付けの世界にハマりましょう！
- Haskell-jpというコミュニティーグループで、[Slack Workspace](https://haskell-jp.slackarchive.io/)などを運営しています。
    - 続きは [haskell.jp](https://haskell.jp/) で hask(\_ \_)eller

----

# Vagrantめんどい

- チームで使っているVagrant boxとVagrantfileがあった。
- 一方自分には丹精込めて育てている、Vagrantで管理されてないVMがあった。
- けちんぼなんでVMをいくつも作るのはいやだった。
    - :whale: Dockerにすれば大体解決する話なんですが、ちょっと大人の事情で...。

----

# :bulb: そこで！

- :arrow_right: Vagrantfileから、port forwardingの設定など、必要な部分だけ取り出すスクリプトを書こう
    - `Vagrant`が何をしているか詳しく知る必要がない
    - 取り出したら後は`VBoxManage`コマンドなどを適当に呼んで、丹精込めたVMに、Vagrantfileに書いた設定を適用！ :muscle:

----

# 作った その1

[vagrant2vboxmanage](https://gitlab.com/igrep/vagrant2vboxmanage/blob/master/vagrant2vboxmanage.rb)

----

# 作った その1: ソース抜粋

```ruby
module Vagrant
  def self.configure(*args, &block)
    @config = Config.new
    block.call @config
  end

  class Config < ::OpenStruct
    ...
  end
end
```

----

# 作った その1: 仕組み

- `Vagrant`という名前の、各メソッドが受け取った引数だけを記録する偽物の ~~クラス~~ モジュールを作った
- 本物の`Vagrant`は一切ロードしない
- 偽物の`Vagrant`を定義した状態で`load './Vagrantfile'` する。

----

# :thinking_face: .oO(待てよ？)

これはいろいろ動的にできちゃうRubyのことだ、`method_missing`を使えばもっと楽ができたんじゃないか...？

----

# 作った その2

[spy-void](https://gitlab.com/igrep/spy-void/blob/master/spy-void.rb)

----

# 作った その2: 詳細な動作

[みんな大好き`method_missing`](https://docs.ruby-lang.org/ja/2.4.0/method/BasicObject/i/method_missing.html)を使い、  

- 任意のメソッドに対して引数とメソッド名を記録する
- 戻り値はすべて`self`（続けて呼び出したメソッドもすべて記録しちゃう）
- ブロックが渡された場合は、ブロックが必要とする引数の数だけ`self`を渡して呼ぶ

----

# 作った その2: 詳細な動作

最終的に記録したメソッドを取り出すときは

```ruby
SpyVoid.retrieve_log(Vagrant)
```

:arrow_right: 記録したメソッドがキーで、渡された引数の記録が値の[`OpenStruct`](https://docs.ruby-lang.org/ja/latest/class/OpenStruct.html)が返る

----

# 作った その2: 詳細な動作

- 後は`OpenStruct`をいじって好きにしよう！
- Hashieとかもっと良さそうなやつがあるのは知ってるけど、所詮雑なものなので！

----

# 作った その2: ちなみに

やっていることがTest Spyとよく似ていたため、「Spy Void」と名付けました。  
そのままSpyとして使うのも悪くないかも。

----

# あしからず vim(\_ \_)mer

- 書き捨て用に作ったものだし、普段Rubyを使うこともなくなったのでrubygemsには上げません！
    - コピペして適宜書き換えて使うのでも十分便利だと思う。
    - ライセンスはMITにしとくので、やりたくなったら勝手にやっちゃって！

----

# まとめ

- :v: `method_missing`たのしい！ :v:
ひかり電話の主装置がipv6を通さない場合でもipv6化する方法

[ネットを爆速にする！](http://koyakeishintaido.blog52.fc2.com/blog-entry-925.html)
と意気込んでipv6にしようとしたものの、ビジネスホンの[主装置](http://www.hitachi-ite.co.jp/products/et/ie_spec.html#types)がipv6を通さないカードしか入れていないので、どうやったら、ipoe接続になるのか考えてなんとかしました。

#結論
 [ネットワークスイッチ](https://www.netgear.jp/products/details/GS105E.html)にVLANを設定すればいける！
#やり方
https://www.netgear.jp/products/details/GS105E.html
この機種の場合を説明します。
Windowsで[管理ツール]（https://www.netgear.com/support/product/GS105Ev2#ProSAFE Plus Configuration Utility v2.4.9)を落としてきて、
 上記機種の管理画面に入って、ファームウェアアップデート（最近17/11/01新しくなった）。
 タグvlan　じゃない方の　VLAN の画面に入って、
wanをポート１　主装置につなぐlanを２　に設定するなら、　vlan id １番の組み合わせを wan 1 lan 2 のポートにチェックを入れて、 add new vlan. 
続けてポート１　ポート３をつなぐ vlanも作成する。ポート３にはルーターをつなぐ。僕は[これ](http://buffalo.jp/product/wireless-lan/ap/wxr-1900dhp2/)を直接挿してます。

あとは普通に、[ネットを爆速にする！](http://koyakeishintaido.blog52.fc2.com/blog-entry-925.html)の手順でipv6を設定。

ハマったのは、自分の主装置が ポート３の方に刺すと何故かうまく動かなかったりしたところです。一回電話が繋がらなくなると、主装置の再起動が必要になるので、そこは容赦なく電源を切ったり入れたりしていきましょう。

　普通に電話会社の口車に乗っていると、ipv6を通すボードを４万円で買わされたり、　[これ](http://flets-w.com/solution/kiki_info/product/network/vgx/)を買わされたりします。
Wordpress記事をTwitter自動連携したときのプラグイン設定

株式会社オズビジョンの @masayofff です。
オズビジョンでは、UXDチーム、マーケティング担当を経て、現在は採用広報をしています。

9月末まで [ハピタス](http://sp.hapitas.jp/)のトップページで実装していたハピタスヘッドラインという施策でWordpressとTwitter設定したときの覚書です。

私自身、Wordpressは記事を投稿したりテーマのPHPをGoogle先生にお世話になりながらちくちくいじったりという点では慣れているものの、こういう連携はやったことありませんでした。

作業している途中で、えっ、アプリ作成？！そんなおおげさなー！とか、
これちゃんと連携できてんのかなぁ…ハラハラ(;´･ω･)

って考えながら作業してました。

## やりたいこと
・Wordpressサイトで投稿を新規追加した際に、
「記事タイトル」
「URL」
「サイト名」
「アイキャッチ画像」
…の4点をTwitterアカウント側の新規投稿として正しく表示する。

### Wordpressサイト
http://fan.hapitas.jp/

### twitterアカウント
https://twitter.com/_hapitas_

## 使用したプラグイン
NextScripts: Social Networks Auto-Poster
https://ja.wordpress.org/plugins/social-networks-auto-poster-facebook-twitter-g/

## 参考にさせていただいた記事
https://koskywalker.com/wordpress-nextscripts-social-networks-auto-poster/
http://tabibitojin.com/wordpress-plugin-auto-tweet/

## 設定方法
1．プラグインのインストール＆有効化
2．TwitterでApplication Managementでアプリを作成
3．Wordpressでプラグインの設定
4．テスト投稿

※細かな工程は素敵な参考記事をご覧くださいませ。

## 実際の設定画面
3.の工程での実際のWordpressでプラグインの設定画面です。
![Twitterプラグイン設定.png](https://qiita-image-store.s3.amazonaws.com/0/221980/1023db64-d5bb-5e88-3f6f-6a3eecf7c657.png)

## Twitter投稿イメージ
https://twitter.com/_hapitas_/status/907204788571357185

## 苦労したこと
設定自体は難しいものではないのですが、思ったより工程が長かったので、間違えてないか何度も確認しました。
英語のプラグインなので合ってるかなぁと不安になったりもしましたが、一回でできました。

## 追記
・リリースの際、ハピタスのフロント側への表示の自動連携もされていましたが、そちらはエンジニア陣が行っていました。
・Wordpressはこういう連携とか自動化を効率よくできるところがほんとに優秀だと思います。
・冒頭でも書きましたが、この「ハピタスヘッドライン」機能は現在は休止しております。
さいきんおもったこと

若いっていいよね。

でも、言語とかフレームワークとかってしょせん道具なんだ。
だから、趣味なら自分の好きなものを使えばいい。
仕事ならそこに合わせればいい。
別に変えることも否定しないけど、同じでも構わない。

短期的には、問題が楽になったように感じるけど、本質的に複雑なことは、結局、何をしても変わらない。
そんな気がしている。問題点を上に下にと動かして、別のより優れているといっても、結局手間が別の手間になっている。
そんなことが多い。

たぶん、初めてまともに触れたのはCだと思う。
その後C++、Perl、Java・JavaScriptとかいろいろやった。
RubyとかPythonとかもやったけど、やっぱり合わない.......
誰かにとって良い・優れたものでもやっぱり合わない。
{}くらい書くから、邪魔しないでと思う。
ということで人それぞれ。

でも、言語にも無期・不向きがあるから、batだろうがvbaだろうがなんでも適材適所でやっつける。
そんな感じ。

Androidで何かを検索しようと、Qiitaの記事が出ていることがある。
そこで、こんなことをおもったらしい。