OmniAICreator/Qiita-1.07M huggingface dataset:
うおーるぼっとについて

#うおーるぼっととは
私個人のプロダクトでうおーるぼっとの開発を初めてちょうど１０年が経ちました。
うおーるぼっととは、２つのタイヤを持った車型のロボットで、特徴的なのは壁を走ることができるということです。

##うおーるぼっとLED
現在、販売している最新型はうおーるぼっとLEDです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/109992/dad16f09-21f7-3ec5-7229-566d52607768.png)

壁を走るデジタルサイネージとして、絶賛＋Styleで販売中です。
https://plusstyle.jp/shopping/item?id=212

##うおーるぼっとBLE
うおーるぼっとLEDのベースとなっているのが、[クラウドファンディング](https://www.makuake.com/project/wallbotble/)で資金を集め、開発、販売をした[うおーるぼっとBLE](https://www.switch-science.com/catalog/2119/)です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/109992/e6384548-42dd-6f00-da33-bf525d3f641b.png)

うおーるぼっとBLEはMbedの[プラットフォーム](https://os.mbed.com/platforms/JKSoft-Wallbot-BLE/)の一つで、Mbedの[オンラインコンパイラ](https://os.mbed.com/users/nxpfan/notebook/lets_get_started_jp/)でプログラムを開発することができるプログラミング学習用のロボットキットです。

##うおーるぼっとR4
初めてWebショップで販売を始めたのは[うおーるぼっとR4](http://www.runele.com/ca4/15/p-r-s/)です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/109992/a731bead-1ef8-b05d-fe4c-1fb901b94e2e.png)

うおーるぼっとR4は[mbed LPC1768](https://os.mbed.com/platforms/mbed-LPC1768/)が乗っかるロボットベースボードになっています。

#開発中のうおーるぼっと
過去のうおーるぼっとの紹介はここまでにして、現在開発中の２つのうおーるぼっとを紹介します。

##ウェアラブルうおーるぼっと
服の上を走るアクセサリというコンセプトで開発を行っているのが、ウェアラブルうおーるぼっとです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/109992/904417f6-0b62-02f3-3c1c-422eb52ceca8.png)

Maker Faire Tokyo2017を目標に開発してましたが、そこには間に合いませんでした。引き続き開発中です。 
詳しい仕組みは内緒です。

##うおーるぼっとG
今年の夏前には販売を目指しているのが、うおーるぼっとGです。
うおーるぼっとGはGroveモジュールとして、Groveに対応しているマイコンボードがなんでも搭載できる仕様で開発中です。
現在はブロックエディタで誰でも簡単にプログラミングができる[micro:bit](http://microbit.org/ja/guide/)を搭載した試作して動作を確認しています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/109992/f2386da2-3277-f3ad-b2fa-1be99db6622f.png)

これももちろん壁を走ります。
micro:bitはmicro:bit同士で通信ができるので、片方をリモコンにして、操作することもできます。
次の動画はホワイトボードを走らせているところです。
https://www.youtube.com/watch?v=OfsvKt-GVTo

ほかにも[WioLTE](https://soracom.jp/products/wio_lte/)や[NefryBT](https://dotstud.io/docs/nefrybt/)を搭載できるようにするつもりです。

##うおーるぼっとIoT
うおーるぼっとは磁石がくっつくところであれば天井でも壁でも走ることができます。
その特徴を生かして、IoTのセンサーノードとしての可能性を考えています。
カメラや環境センサを載せて、いろんなところを走らせてクラウドにアップロードすれば、一つのノードでさまざまな場所のデータを集めることができると思います。
うおーるぼっとIoTの試作は３月に開催される[MANABIYA](https://manabiya.tech/?sip=t006_000_000)というイベントで展示予定です。

#最後に
うおーるぼっとを開発して10年、うおーるぼっとを使ったいろいろな可能性を考えてきました。
今後も、実用的なうおーるぼっとを目指して開発を続けていきます。
うおーるぼっとは、現在[ランニングエレクトロニクス](http://www.runele.com/)と共同開発を行っています。
Web屋さんやデザイン屋さん、機械屋さん等の共同開発者も募集中なので、ぜひお声がけください！
IPアドレスをワンクリックで変えるバッチファイルをつくる

#20180203　追記
###何も考えずに本番ネットワークにさして実行したらIPアドレスが重複してサーバを落としちゃったから気を付けような


#この記事を見てできること
- IPアドレスをワンクリックで変更できる


#何が助かるのか
ネットワークスイッチを触るのにとにかく楽

#経緯
- コンソールもCLIもないネットワークスイッチにあたった　　
- IPアドレスのセグメントを合わせるのに毎回【コントロールパネル】-【ネットワークとインターネット】-【ネットワークと共有センター】-【アダプターの設定の変更】-【イーサネット】-【プロパティ】-【インターネット プロトコル バージョン4(TCP/IPv4)】
という選択するのが苦痛すぎた（情弱）


- 【Windowsキー+ R】を押して`ncpa.cpl`と入力してショートカットしていたが、それすらだるすぎる

**→もっと簡単にできないのか？？？？？？？**

#結論
バッチファイル作ればいけそう。

#やり方
1. テキストファイルを作る
1. 下記の文をそのままコピー＆ペースト

```change_ip_192.bat
@echo off
netsh interface ipv4 set add name="イーサネット" source=static addr="192.168.1.1" mask="255.255.255.0" gateway=""
```
3.【名前を付けて保存】で拡張子を(.bat)で保存
4. 作成した.batファイルを右クリック、管理者権限で実行
5. IPアドレスを確認してみよう


#自動に戻したいときのbatファイル
先の手順でもう1つファイルを作ればOK。

```change_ip_auto.bat
@echo off
netsh interface ipv4 set add name="イーサネット" source=dhcp
```
#注意すべきこと
- 必ず管理者権限で実行すること
- 実行するかどうかの分岐や実行されたかどうかの結果を表示する機能はつけていない

#今後やりたいこと
- DNSや他の複雑な設定もワンクリックでできるようにする
inotifywaitでファイル監視するときに注意すべきこと

# はじめに
inotify-toolsに含まれるinotifywaitは、指定したファイルやディレクトリに関するイベント、例えばアクセスした、修正した、削除したなどを取得できるコマンドだ。
これを使えば、例えばソースコードを修正するたびに自動でコンパイルを走らせることも出来てとても便利に使える。

参考：[inotify-toolsでファイルやディレクトリを監視する - Qiita](https://qiita.com/stc1988/items/464410382f8425681c20)

のはずなのだが、残念ながら当初手元の環境ではうまく動かず期待する挙動を確認できなかった。
試行錯誤したところ、ようやく原因を見つけることが出来たのでメモを残しておく。

# 想定外の事態
やりたいことは`a.txt`を編集するたびにそのイベントを取得したい。
素直に書くと以下のようになる。

```sh
$ inotifywait -m -e modify a.txt
```

簡単に説明すると`-e modify`はinotifywaitで検知できるイベントのうち編集したときのイベントのみ取得するオプションで`-m`はイベントを一回だけでなく継続して取得することを意味している。

期待する動作として`a.txt`を編集すると以下のように表示して欲しい。

```sh
$ inotifywait -m  -e modify texdir/abstract.tex                        
Setting up watches.
Watches established.
# ここでa.txtを編集
a.txt MODIFY 
```

残念ながら手元の環境では期待する表示は得られなかった。

```sh
$ inotifywait -m -e modify texdir/abstract.tex                        
Setting up watches.
Watches established.
# ここでa.txtを編集
# が、無反応
```

# 原因
この問題は監視対象のファイルがいつのまにか削除されていることが原因だ。
削除されているので、それ以後のイベントは発生せず当然ながら何のイベントも取得できない。

混乱するのは`a.txt`は編集前も、後も目に見えて存在する点だ。
実は編集前と編集後のファイルは同じファイルに見えて、実は違うファイルになっている。

以下のようにiノードが変わっている。

```sh
$ ls -i a.txt
6032949 a.txt
# ここでa.txtを編集
$ ls -i a.txt
6033053 a.txt
```

inotifywaitで全てのイベントを見ても確認できる。

```sh
inotifywait -m a.txt
Setting up watches.
Watches established.
a.txt ATTRIB 
a.txt DELETE_SELF # a.txtが削除された、これ以後は何のイベントも取得できない
```

この挙動は使うエディターに依存する。
texのIDEであるtexstudioでは上記のような挙動だが、他のエディタ、emacsやvscode、nanoではiノードは変わらないままだった。
もちろん、後者のエディタを使った場合inotifywaitは`-e modify`イベントを取得し続けることが出来る。

# エディタを変えずに監視したい
使うエディタを変えるというのも一つの手だが、今回はエディタを変えない方法を考える。
原因がわかれば対処方法も分かる。
iノードを変更するエディタの場合modifyイベントを通知してくれないので`-e attrib`で代用する。 
またオプションの継続監視は出来ないので、代わりにwhileループで監視する。
以下のように、iノードを変更するエディタでも変更しないエディタでも編集を検知することが出来ている。

```sh
$ while; do
# 2> /dev/null はinotifyを起動するたびに表示されるメッセージを非表示にするため
echo `inotifywait -e modify -e attrib a.txt 2> /dev/null` 
done
# a.txtをtexstudioで編集
a.txt ATTRIB
# a.txtをemacsで編集
a.txt MODIFY
```

# 参考
[linux - inotify delete_self when modifying and saving a file - Stack Overflow](https://stackoverflow.com/questions/2754954/inotify-delete-self-when-modifying-and-saving-a-file)
RollupのBabel設定が通らない場合に

WebpackよりだいぶシンプルなRollupですが、公式サイトに書いてある通りに設定したはずなのにうまくいかない、という事態になっています。

# 公式サイトの通り…でも動かない

Rollupの結果をBabelに通す`rollup-plugin-babel`の公式サイトには、Babel 6での`.babelrc`の設定例が載っています（[README](https://github.com/rollup/rollup-plugin-babel#configuring-babel)）。

```json:.babelrc
{
  "presets": [
    [
      "env",
      {
        "modules": false
      }
    ]
  ],
  "plugins": [
    "external-helpers"
  ]
}
```

しかしながら、この通りに書いたはずなのに、`[!] (babel plugin) Error: It looks like your Babel configuration specifies a module transformer. Please disable it. See https://github.com/rollup/rollup-plugin-babel#configuring-babel for more information` とエラーを食らってしまいます[^1]。

# 別な手法を発見…`babelrc-rollup`

もちろん、`babel-preset-es2015-rollup`を使えば動くことは動くのですが、「`es2015`は古いので`env`を使ってね（意訳）」みたいなメッセージが出てしまいます。

なんとかならないのかとIssueを眺めていたところ、[eventualbuddha/babelrc-rollup](https://github.com/eventualbuddha/babelrc-rollup)というものを見つけました。これは自前で`.babelrc`を読み込んで、Rollupの動作に邪魔な変換を外す、というようなことを行っているとのことです。

```rollup.config.js
import babel from 'rollup-plugin-babel';
import babelrc from 'babelrc-rollup';

export default {
  plugins: [
    babel(babelrc())
  ]
}
```

と`babelrc-rollup`で生成したパラメータを`rollup-plugin-babel`に投入することで、適切な設定を行えるようにしています。


[^1]: というより、このエラーのリンクから上のREADMEにたどり着いて、そしてその通りの設定をしたにも関わらずまたエラーが出る、という無限ループに陥っていました。
メモ: pandas で列を加えるいろんな方法

概要
====

pandas で DataFrame (indexあり) の列を別の DataFrame (同じ構造のindexあり) に加える方法を試す。

※結論: index があえばレコードが一致してなくてもいい。left join 的に足せる。


## 単純に列を足す

※index があればレコード数が異なっていても問題ない。

```py
import pandas as pd
A = pd.DataFrame(data={'a':[1, 2, 3], 'b': ['b1','b2','b3'], 'c': ['c1','c2','c3']}).set_index('a')
B = pd.DataFrame(data={'a':[   2, 3], 'd': [     'd2','d3'], 'e': [     'e2','e3']}).set_index('a')

# d を足す (Series として足す)
A['d'] = B['d']

# もしくは
# DataFrame として足してもいい
A['d'] = B[['d']]

#    b   c   d
# a
# 1  b1  c1  NaN
# 2  b2  c2  d2
# 3  b3  c3  d3

# NaN の代わりに 0 を入れたいなら、上記のあとで
A['d'] = A['d'].fillna(0)

#    b   c   d
# a
# 1  b1  c1  0
# 2  b2  c2  d2
# 3  b3  c3  d3


# 条件の結果を代入することも可能
A['f'] = (B.d == "d2")

#    b   c   f
# a
# 1  b1  c1  NaN
# 2  b2  c2  True
# 3  b3  c3  False
```


## 複数列を同時に加えるなら

```py
import pandas as pd
A = pd.DataFrame(data={'a':[1, 2, 3], 'b': ['b1','b2','b3'], 'c': ['c1','c2','c3']}).set_index('a')
B = pd.DataFrame(data={'a':[   2, 3], 'd': [     'd2','d3'], 'e': [     'e2','e3']}).set_index('a')

A = A.merge(B, how='left', left_index=True, right_index=True)
# もしくは
A['d'] = B.d
A['e'] = B.e
```


## indexが重複していてもleft joinされる

```py
import pandas as pd
A = pd.DataFrame(data={'a':[1, 2, 3], 'b': ['b1','b2','b3'], 'c': ['c1','c2','c3']}).set_index('a')
C = pd.DataFrame(data={'a':[2, 2, 3]}).set_index('a')

C['b'] = A.b

#    b
# a
# 2  b2
# 2  b2
# 3  b3

# 当然だが right 側がキー重複してるとエラー
D = pd.DataFrame(data={'a':[2, 2, 3], 'g':['g1','g2','g3']}).set_index('a')
A['g'] = D.g

# ValueError: cannot reindex from a duplicate axis
```
microbit > Grove Shield



# micro:bit用Grove Shield

[Grove Shield for micro:bit \- Other for Development Platforms \- Seeed Studio](https://www.seeedstudio.com/Grove-Shield-for-micro%3Abit-p-2947.html)


[はじめてのコンピュータサイエンス \- Microsoft MakeCode](https://makecode.microbit.org/courses/csintro)


![スクリーンショット 2018-01-31 13.27.57.png](https://qiita-image-store.s3.amazonaws.com/0/49910/bc4fdfc8-1af2-23cc-e6e6-775e93afcd63.png "スクリーンショット 2018-01-31 13.27.57.png")



[makecode\.microbit\.org](https://makecode.microbit.org/#)


## 関数一覧


https://github.com/Seeed-Studio/pxt-grove/blob/master/main.ts
[pxt\-grove/main\.ts at master · Seeed\-Studio/pxt\-grove · GitHub](https://github.com/Seeed-Studio/pxt-grove/blob/master/main.ts)

## できること

LEDコントロール
ジェスチャセンサ
４桁ディスプレイの制御
ロータリースイッチ
距離センサ
ライトセンサ
LEDテープの制御（WS2812）


## Grove参照の追加

高度なブロック

![スクリーンショット 2018-01-31 12.59.49.png](https://qiita-image-store.s3.amazonaws.com/0/49910/05287bc5-035b-b7f8-d967-41f7b3695682.png "スクリーンショット 2018-01-31 12.59.49.png")



パッケージを追加する。

![スクリーンショット 2018-01-31 13.00.07.png](https://qiita-image-store.s3.amazonaws.com/0/49910/b7e0efe5-77aa-90f9-66fb-04c7c5df6fa8.png "スクリーンショット 2018-01-31 13.00.07.png")


検索BOXにgroveと入力して検索
表示されたgroveを選択する。（ダブルクリック）

![スクリーンショット 2018-01-31 13.00.57.png](https://qiita-image-store.s3.amazonaws.com/0/49910/f4d97cbd-a7bc-6928-1e98-c448b5546541.png "スクリーンショット 2018-01-31 13.00.57.png")

今までなかった部分（計算の下側）にGROVEが作成されている。

![スクリーンショット 2018-01-31 13.02.23.png](https://qiita-image-store.s3.amazonaws.com/0/49910/4d6dfaf1-9b07-0e34-698e-9134c85ebb69.png "スクリーンショット 2018-01-31 13.02.23.png")



## Shakeカウンター


Steps

1. Add basic block on start, then add variable block set item to 0, rename ‘item’ to ‘Display’. If you have added the Grove Package successfully, add block 4-Digit Display at (P0) and (P14).

2. Add input block on shake, then add variable block change item by 1,rename ‘item’ to ‘N’.

3. Add block item show number from Grove Package, rename ‘item’ to ‘Display’, replace ‘0’ with variable block ‘N’.

4. Add basic block pause (ms) (100). 

5. Hardware connection: Connect the Grove – 4-Digital Display to P0 port of Grove shield for micro:bit.

6. Click Download to transfer your code in your micro:bit.

7. Shake the micro:bit and you will find the number raises by 1 every time your shake the board.



## screen shot

![スクリーンショット 2018-01-31 13.19.41.png](https://qiita-image-store.s3.amazonaws.com/0/49910/449cb151-0649-5446-8bf8-375c3bfa93d6.png "スクリーンショット 2018-01-31 13.19.41.png")


## JS code

```
let N = 0
let Display: grove.TM1637 = null
input.onGesture(Gesture.Shake, () => {
    N += 1
    Display.show(N)
    basic.pause(100)
})
Display = grove.createDisplay(DigitalPin.P0, DigitalPin.P14)
```


## 接続と実行



![IMG_7039.jpg](https://qiita-image-store.s3.amazonaws.com/0/49910/23ab5658-6cf9-6565-44ec-6b0861aabcb8.jpeg "IMG_7039.jpg")
Grove > LED BAR



# LED BAR


![Grove_ｘ.gif](https://qiita-image-store.s3.amazonaws.com/0/49910/90649c8c-59bd-ca78-d615-5e9da2ac625c.gif "Grove_LED_Bar.gif")




[Grove LED Bar v2\.0 \- LED \- Seeed Studio](https://www.seeedstudio.com/Grove-LED-Bar-v2.0-p-2474.html)


[GitHub \- Seeed\-Studio/Grove\_LED\_Bar: control display](https://github.com/Seeed-Studio/Grove_LED_Bar)


D6に接続し、以下


``` BasicControl.ino

/*
Grove LED Bar - Basic Control Example
This example will show you how to use the setBits() function of this library.
Set any combination of LEDs using 10 bits.
Least significant bit controls the first LED.

The setBits() function sets the current state, one bit for each LED.
First 10 bits from the right control the 10 LEDs.

eg. 0b00000jihgfedcba
a = LED 1, b = LED 2, c = LED 3, etc.

dec    hex     binary
0    = 0x0   = 0b000000000000000 = all LEDs off
5    = 0x05  = 0b000000000000101 = LEDs 1 and 3 on, all others off
341  = 0x155 = 0b000000101010101 = LEDs 1,3,5,7,9 on, 2,4,6,8,10 off
1023 = 0x3ff = 0b000001111111111 = all LEDs on
                      |        |
                      10       1

The bits >10 are ignored, shown here as x: 0bxxxxx0000000000
*/

#include <Grove_LED_Bar.h>

Grove_LED_Bar bar(7, 6, 0);  // Clock pin, Data pin, Orientation

void setup()
{
  // nothing to initialize
  bar.begin();
}

void loop()
{
  // Turn on all LEDs
  bar.setBits(0x3ff);
  delay(1000);

  // Turn off all LEDs
  bar.setBits(0x0);
  delay(1000);

  // Turn on LED 1
  // 0b000000000000001 can also be written as 0x1:
  bar.setBits(0b000000000000001);
  delay(1000);

  // Turn on LEDs 1 and 3
  // 0b000000000000101 can also be written as 0x5:
  bar.setBits(0b000000000000101);
  delay(1000);

  // Turn on LEDs 1, 3, 5, 7, 9
  bar.setBits(0x155);
  delay(1000);

  // Turn on LEDs 2, 4, 6, 8, 10
  bar.setBits(0x2AA);
  delay(1000);

  // Turn on LEDs 1, 2, 3, 4, 5
  // 0b000000000011111 == 0x1F
  bar.setBits(0b000000000011111);
  delay(1000);

  // Turn on LEDs 6, 7, 8, 9, 10
  // 0b000001111100000 == 0x3E0
  bar.setBits(0b000001111100000);
  delay(1000);
}
```



![BasicControl.gif](https://qiita-image-store.s3.amazonaws.com/0/49910/73c877cf-1b73-70da-5051-5dd69a1ce84a.gif "BasicControl.gif")
Grove > OLED Display




[Grove \- OLED Display 0\.96"](https://www.seeedstudio.com/Grove-OLED-Display-0.96%22-p-781.html)


[GitHub \- Seeed\-Studio/OLED\_Display\_128X64: Seeed OLED Display 128\*64 library](https://github.com/Seeed-Studio/OLED_Display_128X64)


[arduino v1\.0 compile error: avr\\pgmspace\.h: No such file or directory](https://forum.arduino.cc/index.php?topic=86416.0)


[Grove \- OLED Display 0\.96 inch \- Seeed Wiki](http://wiki.seeed.cc/Grove-OLED_Display_0.96inch/)




Macの場合、そのままだとエラーがでます

```
Arduino：1.8.5 (Mac OS X), ボード："Arduino/Genuino Uno"

/Users/atsu/Documents/Arduino/libraries/SeeedOLED_Display_128X64-master/SeeedOLED.cpp:29:26: fatal error: avr\pgmspace.h: No such file or directory
 #include <avr\pgmspace.h>
                          ^
compilation terminated.
exit status 1
ボードArduino/Genuino Unoに対するコンパイル時にエラーが発生しました。

「ファイル」メニューの「環境設定」から
「より詳細な情報を表示する：コンパイル」を有効にすると
より詳しい情報が表示されます。

```

SeeedOLED.cppの以下の行のavrの次の文字を/(バックスラッシュ) に変更します。

```
#include <avr\pgmspace.h>
```

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

変更後にはビルドが通ります。



``` OLED_Hello_World.ino

#include <Wire.h>
#include <SeeedOLED.h>


void setup()
{
  Wire.begin();
  SeeedOled.init();  //initialze SEEED OLED display

  SeeedOled.clearDisplay();          //clear the screen and set start position to top left corner
  SeeedOled.setNormalDisplay();      //Set display to normal mode (i.e non-inverse mode)
  SeeedOled.setPageMode();           //Set addressing mode to Page Mode
  SeeedOled.setTextXY(0,0);          //Set the cursor to Xth Page, Yth Column  
  SeeedOled.putString("Hello World!"); //Print the String

}

void loop()
{
  
}
```
サーバ作業でよく使うUNIXコマンド

##概要
UNIXコマンドについて、サーバ作業をするさいのイディオムをまとめます。
シェルを書くためのイディオムではなく、その場でさっと作業するためよく利用するにやつです。


##文字列の検索

```bash
#単純に検索
grep 検索するキー 検索対象ファイル


#何らかの処理結果を検索
cat 検索対象ファイル | grep 検索するキー


#ルートから検索する場合エラーが出るのでエラーは捨てる
grep 検索するキー　/ 2>/dev/null
```


##文字列の置換

```bash
#sedでするパターン(ファイルを直接書き換え)
sed -i -e "s/置換対象の文字列/置換する文字列/" 対象ファイル
#=>ファイルが直接書き換わる


#sedでするパターン(パイプ受け取り)
cat 対象ファイル | sed -e "s/置換対象の文字列/置換する文字列/"
#=>標準出力に結果が出力される


#viで置換するパターン
:%s/hoge/fuga/

```


##当日用の日付ディレクトリを作成する
もっともよく使うコマンドです。

```bash
#基本パターン
mkdir `date '+%Y%m%d'`
#=>20180131


#同日作業で被らないように時間付き
mkdir `date '+%Y%m%d_%H%M%S'`
#=>20180131_221611


#プロセスID付き
mkdir `date '+%Y%m%d'`_ID$$
#=>20180131_ID39015

```


##プロセスIDの取得

以下は、sshdのプロセスを取得する

```bash

ps -ef | grep  sshd | grep -v grep | awk '{ print $2}'
#=>953
#=>15389
#=>15392
```


##特定行の抜き出し

```bash
#cutコマンドを利用するパターン(シンプルだが文字列の生成はやりづらい）
echo a b c | cut -f2 -d" "
#=>b

#awkを利用するパターン(文字列の生成がやりやすい)
echo a,b,c,d | awk 'BEGIN {FS=","} {print "先に"$2"後に"$1}'
#=>先にb後にa
```

##重複行の削除

```bash
cat 対象ファイル | sort | uniq
#=>標準出力に結果が出力される
```


##繰り返し処理
この形式で覚えておけば大抵の事には対応できるはず。

```bash
cat list.txt | while read LINE; do
　echo ${LINE}
done
```
一番シンプルなDI

DI難しい、ので出来る人に教えてもらった。ので自分ようでメモ

```scala
// Interface
trait TestInterface {
  def print(s: String): Unit
}

// Injection用Interface
trait UsesTestInterface {
  protected val test: TestInterface
}

// implimentation1
object Test1 extends TestInterface {
  override def print(s: String): Unit = {
    println(s"test1 = $s")
  }
}
// Injection1
trait MixInTest1 extends UsesTestInterface {
  override protected val test: TestInterface = Test1
}

// implimentation2
object Test2 extends TestInterface {
  override def print(s: String): Unit = {
    println(s"test2 = $s")
  }
}
// Injection2
trait MixInTest2 extends UsesTestInterface {
  override protected val test: TestInterface = Test2
}
trait Test extends UsesTestInterface {
  val i: String
  def run(s: String): Unit = {
    test.print(s"$s$i")
  }
}

// Injection & implimentation
class Test1 extends Test with MixInTest1 {
  override val i: String = "1"
}
// Injection & implimentation
class Test2 extends Test with MixInTest2 {
  override val i: String = "2"
}

(new Test1).run("hoge")
(new Test2).run("hoge")

```


結果

```
test1 = hoge1
test2 = hoge2
```
今更だけど gulp の Boilerplate 作った

実はだいぶ前に作ったあったものの、いろんなことにかまけてるうちにまとめる気力が減って途中で止まっていましたが、ちょうどまとまった時間ができたので乗り掛かった舟、勢いでまとめて公開しておきます。

[https://github.com/okamoai/gulp-boilerplate](https://github.com/okamoai/gulp-boilerplate)

フロントエンド界隈だと gulp 自体が若干レガシー化して来た感あるんですが、まだまだ案件でも使えると思うのでもし良かったら触ってやってみてください。  
最近はタスクランナー使わずに npm scripts でやった方がよさげですが、実はそっちの Boilerplate も作ってあったりします。これもそのうちリポジトリに上げる予定です。

## Feature

- 静的サイトの出力に適しています。
- 極力 gulp タスクのコードそのものは修正せず、 `gulp/config.js` ファイルと `src/` 以下の開発ファイルのみで既存案件の様々な構成に対応できるようになっています。
- 出力環境によって変わる CDNリソースやドメイン、ドキュメントルートパスなどを `development`, `staging`, `production` 別に定義できます。
- 開発ファイルは以下の形式に対応しています。複数形式のあるものはどちらかを `gulp/config.js` で選択できます。今後、gulp タスクを増やすだけで対応形式を追加できる構成になっています。
  - HTML: [Pug](https://pugjs.org/) or [EJS](http://ejs.co/)
  - CSS: [Sass](http://sass-lang.com/) or [PostCSS](http://postcss.org/)
  - JavaScript: [Babel(ES6)](https://babeljs.io/) or [ES5+ファイル連結 (gulp-concat)](https://github.com/gulp-community/gulp-concat)
  - Webフォント: [SVG から フォント/CSSファイルを生成 (gulp-iconfont)](https://github.com/nfroidure/gulp-iconfont)
  - CSSスプライト: [PNG から スプライト画像/CSSファイルを生成 (gulp.spritesmith)](https://github.com/twolfson/gulp.spritesmith)
- 以前に TIPS で書いた以下の内容はタスクの機能として取り込んであります。
  - [gulp-jade で JSON ファイルを変数に読み込む方法（gulp-pug v2 対応追記）](https://qiita.com/okamoai/items/224098a432e6e6df6da3)
  - [gulpで複数のスプライト画像やWebフォントを管理する](https://qiita.com/okamoai/items/e8a9f1c3e84093d102b0)
  - [gulp & browserify で 汎用的に 複数のエントリーポイントを管理する](https://qiita.com/okamoai/items/033a865c997540c6dcf7)
- 詳しい使い方は[リポジトリの README](https://github.com/okamoai/gulp-boilerplate/blob/master/README.md)を見て、実際にビルドしてみるのが早いです。


## GitHub

[https://github.com/okamoai/gulp-boilerplate](https://github.com/okamoai/gulp-boilerplate)

## ToDo

今後想定される作業は以下のような感じです。

- 対応形式の追加（要望があれば）
- ~~gulp v4 の正式リリース対応~~ [v1.3.0](https://github.com/okamoai/gulp-boilerplate/tree/v1.3.0)で対応しました
- ~~Babel v7 の正式リリース対応~~ [v1.2.0](https://github.com/okamoai/gulp-boilerplate/tree/v1.2.0)で対応しました
vue-cli で作ったプロジェクトを github pages 用にするときの注意点

## 何が問題か？

デフォルトだと `/` になっているため、そのままだとサブディレクトリがつく github pages ではパスが合いません。

## よく知られた(不完全な)対処法

ググってみると、相対パスとして生成するように **assetsPublicPath を空にする** 方法が見受けられました。

それでもだいたい動くのですが、インライン化されない大きな画像の場合に限り、参照する側のパスが

`static/css/static/img/xxx.png`

のようにおかしくなってしまいます。

これは url-loader の不具合なのか、それとも assetPublicPath を空にするのがダメなのかわかりません。

# 正しい対処法

```
assetsPublicPath: '/project-name/'
```

のようにサブディレクトリ(githubのリポジトリ名)を明記すると参照側のパスが直りました。
2018.1.31勉強まとめ

・デフォルトのリージョン：`us-east-1`

・AWS Storage Gateway：仮想テープライブラリ。オンプレのデータバックアップなどで使用

・`Route53`：エイリアスレコードを使用してELBにルーティングできる
Zone Apexに割り当てる場合もエイリアスレコード使用

・メタデータ
`http://169.254.169.254/latest/meta-data/`でメタデータ取得可能
`http://169.254.169.254/latest/meta-data/public-ipv4`：パブリックIP
`http://169.254.169.254/latest/meta-data/local-ipv4`：プライベートIP
curl/GETで取得可能。テキストとして返される

・ユーザデータ
`http://169.254.169.254/latest/user-data/`で取得可能
コンテンツタイプは`application/octet-stream`
カンマで区切られたテキストで取得

・`プレイスメントグループ`
同一のAZ内に複数のEC2を配置可能

>プレイスメントグループは、単一のアベイラビリティーゾーン内のインスタンスを論理的にグループ化したものです。サポートされているインスタンスタイプとともにプレイスメントグループを使用すると、アプリケーションが低レイテンシーの 10 Gbps (ギガビット/秒) ネットワークに参加できるようになります。
>どちらもインスタンス間における低レイテンシな通信を実現するための機能オプション
>クラスタコンピューティングやDBの同期レプリケーションのように、サーバ間の通信レイテンシがサービス品質に影響するような場合に効果を発揮

>`拡張ネットワーキング`
高い帯域幅、1 秒あたりのパケット (PPS) の高いパフォーマンス、常に低いインスタンス間レイテンシーを実現します。

>参考URL：https://dev.classmethod.jp/cloud/aws/ec2-placement-group/

・`侵入テスト`
事前にAWSに許可必要
EC2とRDSに限定対象外もある

参考URL：http://kakakakakku.hatenablog.com/entry/2016/08/08/022520
生物系研究者のインフォ備忘録

#純粋生物系研究者がインフォに奮闘
初めまして。
現在留学中なのですが、留学先の研究室では、次世代シークエンスによる解析が非常に盛んです。
僕は、これまでほどんど実験しかしてこなくて、解析は共同研究者に任せていたのですが、これからは自分でもできるようになりたいと思い、ここに備忘録としても書いて行こうと思います。

生物系の研究では、最近大規模なデータから、面白い現象を見つける、証明することが多くなって来ました。
それが出来るようになったのだから、自分の手でも出来るようになって、面白いことをしたいと思っています。

#どこにいるの？
留学先は世界で最も幸せな国などと言われている国に２０１７年１２月からきています。
日本の時には、朝１０時から、２４、２５時まで実験をしていましたが、こちらでは、８時半から遅くても１８時くらいです。その後の時間は家で解析をしたり、ほかの勉強ができそうだな、と思っています。
やっと家も借りられて、住めるようになったので、これからは少しずつ勉強していきたいと思っています。

みなさんぜひアドバイスなどお願いします。

#開発環境
OSは、macOS High Sierraを用いています。プログラミングをやろうと思って、ごちゃごちゃこれまでも色々とインストールしてあったりもしますが・・・

#レベル
僕のレベルは非常に低いと思われます。。。。
これまで、Perlを少しだけ勉強しましたが、ほどんど使わなかったため、忘れています。

ということで、これからは、Pythonの方がメインになりそうと言われたので、Pythonを使っていきたいと思っています。

#準備
どうもPythonでは、Jupyterを使うのがいいと聞いたことがあるので、Jupyterの準備から。
と思って調べていると、
Jupyter Notebook を使ってみよう
https://pythondatascience.plavox.info/pythonの開発環境/jupyter-notebookを使ってみよう

というサイトを見つけました。
言われた通り、anacondaをダウンロードします。

```
conda -V
```

とターミナルで打つと、

```
conda 4.4.8
```

と返されました。
（最初、`conda - v` と打っていたので、エラーが出ていて、うまく行っていないと思い、以下のほかのサイトを参考にして試しました。。。汗）

Macにanacondaをインストールする→ライブラリの追加
https://qiita.com/berry-clione/items/24fb5d97e4c458c0fc28


homebrewはインストール済みだったはずですが、もう一度やっておきました。
homebrewのサイトへ行き、

https://brew.sh

```
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```
をターミナルへ。

書かれている通りに打ち込んで行き、その後、

```
brew install pyenv
```

を入れるとさらにエラー。

```
Your Xcode (8.0) is too outdated.
Please update to Xcode 9.2 (or delete it).
Xcode can be updated from the App Store.
```

とあったので、
Xcodeの新しいのをダウンロードしました。

先は長いですが、今日はここまで。
なぜ、アプリのところにanacoda navigatorだけがあって、それでいいのか、それの使い方は？と疑問です・・・
ネットでできるJupytorを使えばよかったかな・・・汗
10万個のファイルを削除するコマンド

ファイル名が00000から99999の連番になっている10万個のファイルがあるとします。
（10万個のファイルを生成する方法は[こちら](https://qiita.com/miminashi/items/f15d8e4a89eb032deacb)）

```shell-session
$ ls | wc -l
  100000
```

まず、普通に`rm *`とやろうとすると、

```shell-session
$ rm *
-bash: /bin/rm: Argument list too long
```

となってできません。
なぜかというと、`rm *`はシェルの引数展開で、`rm 00000 00001 00002 00003 ...`という感じで展開されるのですが、引数として与えられる文字数には上限があるので、それに引っかかってしまうからです。

引数の最大長は`getconf ARG_MAX`で調べられるようです。
macOSの場合は262144のようでした。

```shell-session
$ getconf ARG_MAX
262144
```

仮に5文字の10万個のファイル名を引数展開したとすると、区切り文字1文字を足して (5 + 1) * 100000 = 600000 なので、262144を大幅に上回ることになります。

それでは、10万個のファイルを削除するにはどうしたらよいでしょうか。
`xargs`というコマンドを使うといいようです。

```shell-session
$ ls | xargs rm
```

これでめでたく10万個のファイルが消えてくれました。

ただし、今回は`00000, 00001, 00002, 00003, ....., 99999`のようにファイル名に区切り文字が含まれていないことが期待できたからこれでよかったのですが、ファイル名に区切り文字（スペース）が含まれている場合は、これだと失敗します。

```shell-session
$ touch 'aaa bbb.txt'
$ ls | xargs rm
rm: aaa: No such file or directory
rm: bbb.txt: No such file or directory
```

その場合、findコマンドで区切り文字を`\0`（ヌル文字）としてファイルのリストを出力してxargsコマンドに渡せばよいようです。
xargsコマンドもヌル文字を区切り文字として処理するように、`-0`オプションをつけて実行します。

```shell-session
$ find . -type f -print0 | xargs -0 rm
```

おしまい。
Processing - 03 - lineとtranslate及びscaleを使った描画

<img width="692" alt="スクリーンショット 2018-01-31 21.46.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/45520/94486f69-f8fe-316c-195c-a4f1a0b76006.png">

```java:
void setup () {
  size(700, 1000);
}

void draw () {
  background(80);
  smooth();
  strokeWeight(50);
  stroke(200);

  translate(width/2, height /2 - 400);
  line(-100, 0, 100, 0);

  translate(0, 100);
  scale(1.2, 1.2);
  stroke(180);
  line(-100, 0, 100, 0);

  translate(0, 100);
  scale(1.2, 1.2);
  stroke(160);
  line(-100, 0, 100, 0);

  translate(0, 100);
  scale(1.2, 1.2);
  stroke(140);
  line(-100, 0, 100, 0);

  translate (0, 100);
  scale (1.2, 1.2);
  stroke(120);
  line( -100, 0, 100, 0);

  translate (0, 100);
  scale (1.2, 1.2);
  stroke(100);
  line( -100, 0, 100, 0);
}

```
アジャイル開発手法のそれぞれの適応範囲

# アジャイル開発手法のそれぞれの適応範囲

## アジャイル開発

そもそもアジャイル開発とはアジャイル憲章の宣言のみです。
そこにプラクティスは含まれていません。

こちらの記事を参照して下さい。
[■そもそもアジャイル開発ってなんだ](https://qiita.com/newta/items/f39f4a89da26e828f702)


アジャイル開発したい！とだけ言っていると何をどう適応するのかを決めなければ、何も動けないでしょう。


## スクラム

現在、一番流行っているアジャイル手法の１つかと思われます。

このアジャイル手法はチームの体制のプラクティスや改善サイクルの会議の形、タスク管理方法が中心です。

`人間マネジメント部分` をカバーしている手法と言えるでしょう。

つまり、チームマネジメントに近い部分についてのプラクティスが中心となっている手法です。
チームの文化に影響するため、全てのプラクティスをいきなり適応するのは難しいと思われます。

経験のないチームは簡単なプラクティスから導入してみましょう。

どのプラクティスから始めるかは１度スクラムガイドに目を通してから、導入方法を検討してみましょう

[■最新のスクラムガイド](https://qiita.com/newta/items/ac5be1312e43ca64799c)


## XP (エクストリーム・プログラミング)

少し前、アジャイルという考えが入ってくる時に最も流行っていた手法かと思われます。

エンジニアがコードを書く時やデリバリーをする時の手法が中心となって書かれています。

`システム品質マネジメント` をカバーしている手法と言えるでしょう。

[■XP (エクストリームプログラミング)](https://qiita.com/newta/items/636a47c40f6a1650e827)


## リーン開発

無駄を省くと言うことに焦点を絞って宣言されています。

リーンソフトウェア開発ではトヨタ方式をベースにした開発原則が定義されています。

[リーンソフトウェア開発の７つの原則](http://www.e-ainet.com/LeanSoftwareDevelopmentPrinciples.html)

リーンスタートアップではリーンキャンバスやリーンボードなど、どのようなプロダクトを作るべきか？というプラクティスをカバーしていることが特徴的でしょう。
プロダクトがリリースした機能が良かったのか、計測する方法や改善のためにどのような項目を確認するべきかなど、フォーマットが用意されています。

出来るだけ無駄なものを作らないという焦点で `プロダクトマネジメント部分` をカバーしている手法と言えるでしょう。


## 大規模アジャイルの手法

ここにあるアジャイル開発手法を導入した先には、大規模人数でアジャイル開発を行うスケーラブルなアジャイル開発を行う手法もあります。スクラムチームが安定したならば、チャレンジしてみて下さい。
[■大規模アジャイルの手法](https://qiita.com/newta/items/83a36815fc5a264f4cc2)


# まとめ

アジャイル開発を行うと言っても、幾つもの手法があり、それぞれの手法がカバー範囲をオーバーラップした形でプラクティスが用意されています。

今のチーム課題はどこにあるのか？チームメンバーのスキルは？興味関心の高さは？
どこに課題感を感じてアジャイル開発を適応したいかによって、参考にするべき手法やプラクティスが違います。
自分たちのチームは何を解決するためにアジャイル開発を導入するのかをしっかり考えて、それぞれの手法を選択してチームに導入しましょう。
AWSセキュリティとコンプライアンス勉強まとめ

`AWS責任共有モデル`

- お客様自身でクラウドをコントロール可能
ネットワーク、サーバ、セキュリティなどなど
- AWSがクラウドのセキュリティを担当。AWS基本サービス

>AWS の責任は`クラウドのセキュリティ(Security "of" the Cloud)`
AWS は、AWS クラウドで提供されるすべてのサービスを実行するインフラストラクチャの保護に責任を負います。
このインフラストラクチャはハードウェア、ソフトウェア、ネットワーキング、AWS クラウドのサービスを実行する施設で構成されます。
`データセンターの物理セキュリティ`
`ネットワークセキュリティ（DDoS攻撃対策、ポートスキャニング対策、）`
`論理的なセキュリティ（ホストOS、ゲストOS）`
`従業員・アカウントの管理`
`データセキュリティ`
`ストレージの廃棄プロセス`

>お客様の責任は`クラウドにおけるセキュリティ(Security "in" the Cloud)`
お客様の責任は、選択した AWS クラウドのサービスに応じて異なります。選択によって、セキュリティに関する責任の一環としてお客様が実行する構成作業の量が決定します。例えば、Amazon Elastic Compute Cloud (Amazon EC2)、Amazon Virtual Private Cloud (Amazon VPC)、Amazon S3 などのサービスは Infrastructure as a Service (IaaS) に分類されているため、必要なすべてのセキュリティ構成および管理のタスクをお客様が実行する必要があります。お客様が Amazon EC2 インスタンスをデプロイした場合、お客様は、ゲストオペレーティングシステムの管理 (更新やセキュリティパッチなど)、インスタンスにインストールしたアプリケーションソフトウェアまたはユーティリティの管理、AWS より各インスタンスに提供されるファイアウォール (セキュリティグループと呼ばれる) の構成に責任を負います。
IAM, KMS, CloudTrail, Trusted Advisor, VPC, セキュリティグループなどなど
`サーバーOS、セキュリティ`
`Amazon Inspector（セキュリティ診断サービス）`
`ネットワークセキュリティ（VPCなど）`
`論理的アクセスコントロール（IAMなど）`
`Key Management Service`
`CloudHSM(ハードウェアセキュリティモジュール)`
`CloudTrail`

参考URL：https://aws.amazon.com/jp/compliance/shared-responsibility-model/

`Security by Design(SbD)`
AWSアカウントの設計の規格化、セキュリティ制御の自動

`CloudFormationで設計をテンプレート化`

`Trusted Advisor`定期的な調査

参考URL：https://www.slideshare.net/AmazonWebServicesJapan/awswebinar-aws-59853341
技術ブログ用CMS比較

社内導入向けの調査

|  | はてな | Qiita Organization | Wordpress | Medium Publications |
|:--|:--|:--|:--|:--|
| 記法 | Markdown<br/>はてな<br/>そのまま | Markdown | Markdown | Markdownライク (#とか使えない) |
| コード | ◯ | ◯ | ⚫️ プラグイン | ◯ |
| シンタックスハイライト | ◯ ^1 | ◯ ^2 | ⚫️ プラグイン | ✕ |
| プレビュー | ◯ | ◯ 同一画面 | ◯ | ◯ エディタ=プレビュー |
| slideshare展開 | ◯ | ✕ | ◯ | ◯ |
| 編集履歴 | ◯ 5 (⚫️ 50) | ◯ | △ comには見当たらず | ◯ |
| デザイン変更 | ◯ 150種類 | ✕ | ◯ | △ Publicationsのみ？ |
| 料金 | 無料 (⚫️ 600~1000円/月) | 無料 | 無料 (⚫️ 400~3000円/月) | 無料 (⚫️ 5$/月) |
| 容量 | 300MB (⚫️ 3GB) | 100MB? | 3GB (⚫️ 6G~) | 記述見当たらず |
| 動画 | △ youtubeかtwitterを貼り付け | ✕ | ⚫️ | ◯ |
| 独自アクセス解析 | ◯ | ✕ | ◯ | ◯ |
| Google Analytics | ◯ | ◯ | ⚫️ | △ Publicationsのみ |
| 自前ホスティング | ✕ | ✕ | ◯ org | ✕ |
| カスタムドメイン | ⚫️ | ✕ | ⚫️ | △ 承認が必要？ |
| HTTPS | ⚫️ 管理系のみ。全体は予定しているが遅れている | ◯ | ◯ | ◯ |
| 複数人管理 | ⚫️ | △ | ◯ | △ Publicationsのみ |
| サービスの広告削除設定 | ⚫️ | ✕ | ⚫️ | ⚫️ |
| 収益化 | ◯ | ✕ | ⚫️ | ◯ 独自システム |
| 投稿連携 | ◯ twitter facebook はてブ | ◯ twitter gist | ⚫️ プラグイン | ✕ |
| 続きを読む | ◯ | ✕ | ◯ | ✕ |
| エクスポート | ◯ | ✕ | ◯ | ◯ |
| インポート | ◯ | ✕ | ◯ | ◯ |

その他

|はてな | Qiita Organization | Wordpress | Medium Publications |
|:--|:--|:--|:--|
|  | 編集リクエスト<br/>審査あり<br/>技術以外のことをかけない<br/>各種ランキングがある<br/>  https://qiita.com/awakia/items/9c3c45fd5925e8c4136f | ビジネスプラン以上でプラグインが使用可能<br/>orgは全ての機能が無料で使える | 他のエディタで書いて貼付けするという<br/>手順で運用する例を散見 |

◯: 対応
●: 有料版のみ対応
△: 制限付き対応
✕: 非対応

間違いがあれば指摘していただけるとありがたいです

^1 http://pygments.org/languages/
^2 https://qiita.com/Qiita/items/e84f5aad7757afce82ba
rails5.1でprimary keyがBigIntにならない

rails 5.1からデフォルトでprimary keyがbigintになると聞いたけど、自分の環境ではbigintにならず、4bytes以上のidを保存しようとすると以下のようなエラーが出た。

```shell
rails 5.1 activemodel::type::integer with limit 4 bytes
```

色々調べた結果、SQLiteは対応してない模様。PostgreSQLとMySQLのみに対応しているとのこと。

【参考】 https://github.com/rails/rails/pull/26266

>
Per a conversation with @sgrif: changes default primary keys from
Integer to BIGINT for both Postgresql and MySQL. Leaves behavior
alone for SQLite since this database does not provide support for
BIGINT primary keys.
Alexaのスキル開発中、Warning: Application ID is not set

## alexa.APP_ID を alexa.appIdに修正すれば解決
結論から言うと仕様が変わったようで、文字列をほんの少し修正するとWarningが消えました。
以下経緯と解説です。

## スキルのデバッグ中にWarningを発見
Amazon EchoのAlexaのスキルの処理を`AWS Lambda`に書きながらデバッグしていたところ、`AWS ClowdWatch Management Console`にいつの間にか以下のエラーが出ており気になったので調査しました。

```
2018-01-28T03:58:29.297Z	xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx	Warning: Application ID is not set
```

アプリケーションIDがセットされていないとのことです。
今回AWS Lambdaの関数作成時に選択できる設計図である`alexa-skill-kit-sdk-factskill`を選択して開発を始めましたが、どうも仕様に変更があったらしくこのままだとWarningになるようです。（スキルは一応ちゃんと動くので気づきにくい！）

## どこがWarningの原因となっていたのか

`alexa-skill-kit-sdk-factskill`を選択して生成されるコードは以下のようになっていました。

```index.js
// 一部不要なコメント等を省略しています
// 以下10行目〜15行目付近
'use strict';
const Alexa = require('alexa-sdk');
// 以下の行にスキルの`アプリケーション ID`を指定する必要があります（最初はundefinedですね）
const APP_ID = undefined;  // TODO replace with your app ID (OPTIONAL).

// 〜
// （中略）
// 〜

// 以下140目付近〜
exports.handler = function (event, context) {
    const alexa = Alexa.handler(event, context);
    // 以下の行に上の方で設定したアプリケーションIDが入るようですね
    alexa.APP_ID = APP_ID;
    // To enable string internationalization (i18n) features, set a resources object.
    alexa.resources = languageStrings;
    alexa.registerHandlers(handlers);
    alexa.execute();
};
```

`alexa.APP_ID`が現在は使われていないようです。
以下のように`alexa.appId`に変更するとWarningが消えます。

```
- alexa.APP_ID = APP_ID; // こちらは現在Warningとなる
+ alexa.appId = APP_ID; // 正しくはこちら
```
以上でClowdWatch上でWarningが消えるのを確認しました。

## 補足：アプリケーションIDを環境変数で指定する
ファイル内にスキルのアプリケーションIDを直書きするのもあれなので`AWS Lambda`にて環境変数を指定して記述するほうが良いかなと思います。

スキルの`アプリケーションID`は開発者コンソールのAlexaスキルを管理するページで確認できます。

<img width="794" alt="スクリーンショット 2018-01-31 20.46.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/65902/e0a69b48-40a9-2899-5227-ecce2d764459.png">

`AWS Lambda`の環境変数部分に以下のように記述しました。
環境変数名を`ALEXA_APP_ID`、値に先程のアプリケーションIDを指定します。

<img width="963" alt="スクリーンショット 2018-01-31 21.08.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/65902/9c5f61be-e070-7ddc-9f82-1a36dd49062a.png">



（TZはタイムゾーンの設定です）


Alexa Skillの`index.js`のAPP_ID部分に環境変数で指定します。

```index.js
const APP_ID = process.env.ALEXA_APP_ID;
```

これでアプリケーションIDを直書きしなくて済みました。
ESLintで Parsing error: Unexpected token = となる場合の対処法

2018/2/1
誤った理解でしたのでタイトルと内容を修正いたしました。
@mysticatea さんご指摘ありがとうございました！

## 事象
以下のようなコードに対して、ESLintを掛けた所、

```js:Example.jsx
class Account extends React.PureComponent {
  // ここでパースエラー
  handleOpenAddDialog = () => {
    this.setState({ isAddDialogOpen: true })
  }
}
```

```
Parsing error: Unexpected token =
```
というerrorが発生した。


## 原因
* ESLint標準のパーサーでは、まだ標準化されていないクラスフィールド構文は扱えないため 


## 解決方法
[babel-eslint](https://github.com/babel/babel-eslint)をパーサーに指定することにより、解決できる。

```bash
npm install babel-eslint --save-dev
```
を実行。

そして、`.eslintrc.json`に　`"parser": "babel-eslint"`を加筆

```json:.eslintrc.json
{
    "parser": "babel-eslint",
    // 以下、設定が続く…
}

```

そして、ESLintを実行すればパースエラーがなくなる。

```bash
./node_modules/.bin/eslint --ext .js --ext .jsx ./
```

## 参考にさせて頂いた記事
[babel な ESLint の設定をがんばった](https://havelog.ayumusato.com/develop/javascript/e660-eslint_with_babel.html)
SparkからMSのSQLserverにアクセスしたい

ここからmssql-jdbc-6.2.2.jre8.jarをダウンロード
https://www.microsoft.com/en-us/download/details.aspx?id=55539
spark-submitするときにつける

```
spark-submit --driver-class-path mssql-jdbc-6.2.2.jre8.jar main.py
```

Sparkプログラムの中からsqlserverに接続

```main.py
jdbc_url = 'jdbc:sqlserver://<sqlserver address>:1433;database=<databasename>;user=<userid>;password=<password>;encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;'

table = spark.read.jdbc(url=jdbc_url, table='テーブル名')
```

ちなみに`dataframe.write.jdbc()`の関数は超遅いので使わない用がいい。tsvなりparquetなりファイルに吐き出して転送することにした。

ちなみにtable名にクエリを書くこともできる。転送量を削減できる。

```
pushdown_query = """
(select * 
from yourtable
WHERE 条件
) tmptable
"""
appverctrl = spark.read.jdbc(jdbc_url,pushdown_query)
```
CakePHP3でのTableオブジェクトでsave時にTransactionを行わないようにする

需要など知らない

結論から先に書くとSaveメソッドにオプションを追加する
```$tables->save($entity, ['atomic' => false]);```
atomicをfalseにしてやるとTransactionを発行しなくなる。

--
CakePHP3においてafterFindがなくなり
２までMaster-Slaveのように書き込みと読み込みのDBを分けていた場合など
defaultをMasterにして、検索の時だけSlaveみたいな事ができなくなったため
TableのSaveメソッドを使った際にSlaveに対してTransactionが発行されてしまう。

非常に具合が悪いためTransactionを発生せずにSaveする方法
が上記になる

参考：
https://book.cakephp.org/3.0/ja/orm/saving-data.html#id9
SparkのJypiterNotebookで.jarファイルを追加したい

前投稿した[これ](https://qiita.com/neppysan/items/f90156635571a0c327c6)をJypiterNotebook上でやりたいとき

参考文献
https://stackoverflow.com/questions/42599477/configure-external-jars-with-hdi-jupyter-spark-scala-notebook

```
%%configure -f
{"jars": ["wasb://$container$@$account#.blob.core.windows.net/folder/my-custom-jar.jar"]}
```
An Ordinary Sequence

## 問題
- https://yukicoder.me/problems/no/639
- 要約不要な程度には短いはず

## 解法
- 単純にメモ化再帰だけで良いです。これは、`n/x/y == n/y/x (== n/(x*y))` がどのような自然数に対しても成立するため、当然 `n/3/5 == n/5/3` となるからです。
- 証明は https://qiita.com/cielavenir/items/21a6711afd6be8c18c55 をご覧ください。

## 答案
- https://yukicoder.me/submissions/232565

```rb
$memo={0=>1}
def dfs(n)
	$memo[n]||=dfs(n/3)+dfs(n/5)
end
p dfs(gets.to_i)
```
markdownでの画像リサイズ

良い加減何回も調べてるのでメモ

## 画像をリサイズしたい時は

``![***代替テキスト***](***画像のURL***)``
ではなく
``<img src="***画像のURL***" width="***サイズ***">``
を用いる

## ソース
http://dackdive.hateblo.jp/entry/2015/05/08/110029
CakePHP3でDATE_FORMAT

- Datetimeで保存されているデータを`DATE_FORMAT`で`Y-m-d`の形式を条件として絞り込みたい。
- 難しいことではないのですが、少しはまったので備忘録。

- - -

#CakePHP2とCakePHP3での書き方の違い

##CakePHP2の場合

CakePHP2まではconditionsに思ったままの事を書けばできます。

```php
$conditions = ["DATE_FORMAT(created, '%Y-%m-%d')" => 'CURRENT_DATE()'];
```
これで`CURRENT_DATE()`で絞り込んだデータを取得することができます。

##CakePHP3の場合

CakePHP3でも似たようなものだと思っていたので下記の様に記述。
(ただし`=`をつけないとエラーが発生するので注意)

```php
$query->where([
    "DATE_FORMAT(created, '%Y-%m-%d') =" => $query->func()->now('date')
])
```
`CURRENT_DATE()`をCakePHP3っぽく`$query->func()->now('date')`と記述。

#問題

一見上記で問題がないように動作していたのですが、データがうまく取れていないことが発覚。
出力されたSQLの`WHERE`を確認してみると、

```mysql
WHERE 
  DATE_FORMAT(created, '%y-%m-%d') = (
    CURRENT_DATE()
  ) 
```
`%Y`で指定したはずが`%y`になっています。
……なぜ。

#対策
## 1. func()->date_format()を使う

そのまま記述するのが原因のようなので`func()`を使用して`DATE_FORMAT`を記述してみます。

```php
$created = $query->func()->date_format([
    'created' => 'identifier',
    "'%Y-%m-%d'" => 'literal'
]);

$query->where([
    $created => $query->func()->now('date')
]);
```
Illegal offset type…… :neutral_face:
条件に使用する想定ではないのでしょうか、怒られます。
でも`$query->func()->now('date')` も使いたい。(逆にしてみたけどやはり怒られる)

## 2. よりCakePHP3っぽい書き方にする
`func()->date_format()`を使用しつつ、よりCakePHP3の記述に近づけてみます。

```php
$created = $query->func()->date_format([
    'created' => 'identifier',
    "'%Y-%m-%d'" => 'literal'
]);

$today = $query->func()->now('date');

$query->where(function ($exp) use ($created, $today) {
   return $exp->eq($created, $today);
});
```
発行されたSQLを確認しても`%Y`のまま。
無事に希望通りのデータが取得できました。
ESLintの対象にjsxを含むようにする

## 結論
以下でjsxもESLintの対象に含むことができる。

```bash
eslint --ext .js --ext .jsx ./
```

## 参考
[How to pass JSX files to eslint correctly?](https://github.com/yannickcr/eslint-plugin-react/issues/34#issuecomment-86511721)
オフラインリアルタイムどう書くF09の回答

40分ほどで
配列をshift/pop・push/unshiftさせるかを入力から変換しています。

```ruby:f09.rb```

def parse( c )
  case c
  when /[a-c]/
    [ false, c.ord - 'a'.ord, :shift, :push, ]
  when /[d-f]/
    [ true, c.ord - 'd'.ord, :pop, :unshift, ]
  when /[g-i]/
    [ false, 2 - (c.ord - 'g'.ord), :pop, :unshift, ]
  when /[j-l]/
    [ true, 2 - (c.ord - 'j'.ord), :shift, :push, ]
  end
end

def solve( input )
  board = (1..9).each_slice(3).to_a
  input.chars { |c|
    is_trans, x, g, s = parse(c)
    board = board.transpose if is_trans
    temp = board[x].send(g)
    board[x].send(s, temp)
    board = board.transpose if is_trans
  }
  board.map(&:join).join('/')
end

def test( no, input, expected )
  actual = solve( input )
  if expected != actual
    puts '[%d] NG: %s, %s, %s' % [ no, input, expected, actual, ]
    exit 1
  else
    puts '[%d] OK' % no
  end
end

test( 0, "aegj", "286/435/971" );
test( 1, "a", "231/456/789" );
test( 2, "e", "183/426/759" );
test( 3, "g", "123/456/978" );
test( 4, "j", "126/459/783" );
test( 5, "bb", "123/645/789" );
test( 6, "jjj", "123/456/789" );
test( 7, "bd", "723/164/589" );
test( 8, "ah", "231/645/789" );
test( 9, "bj", "124/569/783" );
test( 10, "db", "723/561/489" );
test( 11, "dh", "723/615/489" );
test( 12, "dl", "123/456/789" );
test( 13, "hc", "123/645/897" );
test( 14, "gf", "128/453/976" );
test( 15, "hl", "623/745/189" );
test( 16, "ja", "261/459/783" );
test( 17, "ld", "123/456/789" );
test( 18, "ki", "315/486/729" );
test( 19, "lfa", "294/753/186" );
test( 20, "kga", "531/486/972" );
test( 21, "dbi", "372/561/489" );
test( 22, "che", "193/625/847" );
test( 23, "iea", "823/416/759" );
test( 24, "gbl", "523/964/178" );
test( 25, "egj", "186/425/973" );
test( 26, "jcf", "127/456/839" );
test( 27, "djh", "726/915/483" );
test( 28, "hld", "123/645/789" );
test( 29, "leeh", "453/678/129" );
test( 30, "heja", "851/629/743" );
test( 31, "cakh", "251/649/837" );
test( 32, "bhjik", "652/489/713" );
test( 33, "eabji", "483/269/751" );
test( 34, "cdbch", "823/156/974" );
test( 35, "ckgajc", "536/492/817" );
test( 36, "ggchha", "231/564/978" );
test( 37, "gfbkeg", "128/534/697" );
test( 38, "agfbcbf", "239/148/765" );
test( 39, "ekahijf", "123/645/789" );
test( 40, "hajdjbe", "789/432/615" );
test( 41, "elgililj", "976/325/814" );
test( 42, "chffefif", "317/629/845" );
test( 43, "ilbbihak", "462/587/319" );
test( 44, "abcdefghijkl", "123/456/789" );
test( 45, "hkijbglfaced", "768/125/493" );
test( 46, "dfkbjiechlga", "256/387/419" );
test( 47, "hgfkbidlajce", "186/745/239" );
test( 48, "baciefjhgkdl", "153/482/796" );
```
WordpressのカスタマイズTips：カスタマイザーでスライダーを利用する

WordPressのテーマカスタマイザーでスライダーを表示する方法です。
参考ページ：https://premium.wpmudev.org/blog/wordpress-theme-customizer-guide/

# WP_Customize_Controlを拡張して、独自のUI（スライダー）を作成する
- WP_Customize_Controlを拡張した**WP_Customize_Range**を作成
- パラメータで「min:最小値」「max:最大値」「step:ステップ」を渡せる

```php
if( class_exists( 'WP_Customize_Control' ) ) {
	class WP_Customize_Range extends WP_Customize_Control {
		public $type = 'range';

        public function __construct( $manager, $id, $args = array() ) {
            parent::__construct( $manager, $id, $args );
            $defaults = array(
                'min' => 0,
                'max' => 10,
                'step' => 1
            );
            $args = wp_parse_args( $args, $defaults );

            $this->min = $args['min'];
            $this->max = $args['max'];
            $this->step = $args['step'];
        }

		public function render_content() {
		?>
		<label>
			<span class="customize-control-title"><?php echo esc_html( $this->label ); ?></span>
			<input class='range-slider' min="<?php echo $this->min ?>" max="<?php echo $this->max ?>" step="<?php echo $this->step ?>" type='range' <?php $this->link(); ?> value="<?php echo esc_attr( $this->value() ); ?>" oninput="jQuery(this).next('input').val( jQuery(this).val() )">
            <input onKeyUp="jQuery(this).prev('input').val( jQuery(this).val() )" type='text' value='<?php echo esc_attr( $this->value() ); ?>'>

		</label>
		<?php
		}
	}
}
```
# カスタマイザーのセッティング、コントローラーを追加
- add_setting, add_controlでセッティングとコントローラーを作成
- add_controlで、UI部品にオリジナルのWP_Customize_Rangeを指定
- パラメータで、最小値、最大値、ステップを指定
- 以下のサンプルコードの場合、label、sectionは環境に合わせて適当に

```php
$wp_customize->add_setting( 'customizable_range' , array(
    'default'     => 15,
    'type' => 'theme_mod'
  ) 
);

$wp_customize->add_control(
  new WP_Customize_Range(
    $wp_customize,
    'ctrl_customizable_range',
    array(
      'label'	=> 'ラベル',
      'min' => 10,
      'max' => 20,
      'step' => 1,
      'section' => 'my_section',
      'settings'   => 'customizable_range',
    )
  )
);
```

# 出力は通常のWP_Customize_Control部品と同様に
- スライダーの値は**ge_theme_mod()**でアクセス可能
- 出力時のデフォルト値は、セッティングのデフォルト値とは別途必要

```php
<div id='photocount'>
    <span><?php echo get_theme_mod( 'customizable_range', 15 ) ?></span> photos
</div>
```

という感じで、カスタマイザーでスライダーを使うことができました。
フォントサイズを可変に…といった場面で利用できます。
Visual Studio on Mac で NBitcoinセットアップ

自分用メモ

NBitcoinをVisual Studio on Macでセットアップする。
普通はNuget Packageをインストールするだけで良いのだが、
NBitcoinの中も含めてデバッグしたい場合は、一工夫が必要？

Win版であれば、ソースサーバーサポートがあるため、自動でソースをとってきてる見合いなのだが、Mac版だとそれらしい設定がない模様？

0.githubからNBitcoinを適当な場所にクローン
　git clone https://github.com/MetacoSA/NBitcoin.git
1.Visual Studioでソリューションを開く
2.ソリューション内部で「右クリック」→「追加」→「フォルダからファイルを追加」
3.NBitcoinをクローンしたフォルダの一つ内部のNBitcoinディレクトリを選択して「開く」
4.「すべて含める」にして「OK」
5.リンクにするのか、移動するのかはおまかせ（すでにファイルがあるものはあるけど無視）
6.メインクラスにusing NBitcoin;追加してビルド
7.おそらくいくつかパッケージが足りないのでNugetからインストール
（Newtonsoft.Json, System.Net.Httpあたり）

これで恐らく使える
ディレクトリ内部にあるソースは、namespaceを追加すれば使える
（例：NBitcoin.DataEncoders...)

以上
Instagram Graph API と Instagram API Platform のアップデート発表を訳した


# はじめに
Facebookから、Instagram Graph API と Instagram API Platformについてアップデートが行われるという発表がありました。

- [Instagram Graph API Launches and Instagram API Platform Deprecation - 開発者向けFacebook](https://developers.facebook.com/blog/post/2018/01/30/instagram-graph-api-updates/)

今回はその発表の内容をざっくり日本語に訳してみました。

ビジネス向けの[Instagram Graph API](https://developers.facebook.com/docs/instagram-api)に3つの新機能が加わり、前からあった [Instagram API Platform](https://www.instagram.com/developer/)が2018年7月31日からの2年間でdeprecatedになっていくという話です。

※ `media`などの用語については公式ドキュメントを参照してください。

# Instagram Graph API: Features

詳しくは [documentation](https://developers.facebook.com/docs/graph-api/instagram-api/v2.10) を参照。

## 現在利用可能な機能
### Insights
businesses が自身のInstagram business profileの価値あるメトリクスにアクセスし分析するのを助ける。
businesses がInstagram上のオーガニックコンテンツのパフォーマンスを理解し最適化できるようにする。

### Comment Moderation
規模の相互作用を促進する。
businesses が彼らの media のコメントを通してより効率的にオーディエンスと関われるようにする。

## 新着機能
### Content Publishing Beta
Facebook Marketing Partners と Instagram Partners だけが利用できる。
画像をフィードにキャプション付き（キャプション無し）で投稿する。

### Business Discovery
business profiles の profile info や media を発見して読み込む。

### Mentions
business がタグ付けもしくは@メンションされた public media を読み込む。
business がタグ付けもしくは@メンションされた media において、business の代わりにコメントを投稿する。

## 将来サポートされる機能
non-business profiles のための基本的な provissioning が、2019年初期にサポートされる。


# Instagram API Platform: Deprecation
[Instagram API Platform](https://www.instagram.com/developer/) は3つのフェーズを経てdeprecatedとなる。

### 2018年7月31日まで利用可能なもの

- Follower List - ユーザーの、フォローしているユーザやフォローされているのリストを読み込む
- Relationships - ユーザーの代わりにアカウントをフォロー・アンフォローする
- Commenting on Public Content - ユーザーの代わりに public media 上のコメントを投稿・削除する

### 2018年12月11日まで利用可能なもの

- Commenting - ユーザーの代わりにオウンドメディア上のコメントを投稿・削除する
- Public Content - ユーザーの代わりにあらゆる public profile や media を読み込む
- Likes - ユーザの代わりに media のいいね・いいね解除を行う
- Subscriptions - media が投稿されたら通知を受け取る

### 2020年初期まで利用可能なもの
- Basic - ユーザーの profile info や media を読み込む


# その他
- Instagram business profile のユーザーをサポートするアプリケーションは、Instagram Graph API へ直ちに移行することが推奨される
- 今回のアップデートに関する質問は [Instagram Graph API Launch Q&A event](https://www.facebook.com/events/1775403846100340/?__mref=mb) で投稿できる。Facebookは 2018年2月9日まで回答を行う
- Facebook Graph APIは新機能のアップデートを発表した。詳しくは[blog](https://developers.facebook.com/blog/post/2018/01/30/graph-api-v2.12/)にて。


# さいごに
non-business profile向けの一部の機能を使っているアプリケーションは、2019年〜2020年でAPIを乗り換えることになりそうな予感です。InstagramログインについてはInstagram Graph APIに移行すればいいんでしょうか？
Instagram API Platformついてはごっそり機能が無くなる（非推奨になる）という印象です。機能が使えなくなり、成り立たなくなるWEBサービスが出て来る可能性も・・・
shellでyoutubeの動画をmp3ダンロード

# youtube-dlを使用して、youtubeをダウンロード

## 事前準備   
- python実行環境
- PC(当然)[osはなんでもok]

## youtube-dl   
[youtube-dl](https://youtube-dl.org/)をダウンロードしてください。
ダウンロードする際、「youtube-dl.py」というファイル名でダウンロードしてください。
youtube-dl.pyは作業ディレクトリにおいてください。

## インストール   
pipでインストール   ```
$ pip install youtube_dl
```
npmでインストール   ```
$ npm install youtube-dl
```
homebrewでインストール(MacOS)   ```
$ brew install youtube-dl
```
##ffmpeg  
yotuube-dlでは、mp4でダウンロードされます。
それを指定の形式に変換するためにffmpegが必要です。
[ffmepg](https://ffmpeg.zeranoe.com/builds/)でダウンロードできます。
自分の環境に合わせて選んでください。

version - releaseされているバージョン
Architecture - 自分のOSに合わせてください。
Linking - static
Download buildでダウンロードしてください。

ダウンロードしたフォルダの中にある bin/　にあるffmpegとffprobeを作業ディレクトリにコピー

## ダウンロードするshell
mp3でダウンロード　

```shell:mp3download.sh    
#!/bin/sh
echo "plz youtuve video url!!"
read url
python youtube-dl.py -x --audio-format mp3 $url
```

mp4でダウンロードするなら

```shell:mp4download.sh   
#!/bin/sh
echo "plz youtuve video url!!"
read url
python youtube-dl.py -f mp4 $url
```   
read　で形式を入力してif文でmp3とmp4のダウンロードを切り替えるようにしても良さそうです。
[youtube-dlのダウロードオプション](https://github.com/rg3/youtube-dl/blob/master/README.md#options)を参考にしていじってみてください。

## 実行
```
$ ./mp3download.sh
plz youtuve video url!!
https://www.youtube.com/watch?v=[videoid](youtube動画のURL)
...
..
.
```
これでダウンロードされます。
shellを実行しようとして、権限系のエラーが出た時   ```
$ chmod 755 mp3download.sh
```

youtube-dlはYoutube以外も対応しています。
対応している他の動画サイトは[ここ](https://rg3.github.io/youtube-dl/supportedsites.html)で見れます。
Android 8.0 で通知を表示すると System UI がクラッシュする

# 問題

Android 8.0 **未満** で実行した場合は問題なく、 Android 8.0 でだけ、通知を表示させた瞬間に System UI がクラッシュするという問題に遭遇しました。

通知を発行すると「Unfortunately, System UI has stopped.」と表示され、ダイアログの「OK」を押下するとクラッシュを繰り返し、通知を表示させようとしたアプリのプロセスが終了するまでその状況を突破することができなくなります。

今回自分がハマった状況では、 Service を `startForeground()` メソッドでフォアグラウンド実行する際に指定した通知に問題があったため、何が問題なのかがわからず長時間悩まされました。

# 原因

これは Android 8.0 のバグで、通知 (`Notification`) の smallIcon に Adaptive icon を指定すると発生します[^1][^2]。

通知バーに表示されるアイコンは Adaptive icon に対応していないため、たしかにそう言われてみれば Adaptive icon を Notification の small icon に指定していることが問題なような気がします。

しかし、 Android Studio 3.0.1 で [New Project] でプロジェクトを新規作成した場合、`drawable-anydpi-v26` ディレクトリに `ic_launcher.xml` として Adaptive icon が作成されるため、 `R.mipmap.ic_launcher` でランチャーアイコンを参照すると SDK 26 以上では自動的にアダプティブアイコンになります。

そのため、 `Notification` を生成する際に以下のような指定の仕方をしていると、上の問題が発生することになります。

```kotlin
val notification = Notification.Builder(this, "channelId")
	.setSmallIcon(R.mipmap.ic_launcher) // SDK 26 以上では Adaptive icon になる
	.setContentTitle("title")
	.setContentText("text")
	.build()
```

[^1]: https://github.com/firebase/quickstart-android/issues/382
[^2]: https://android.jlelse.eu/how-to-upgrade-your-app-to-android-oreo-and-avoid-a-factory-reset-f85e34767a09

# 回避策
`Notification` の small icon には Adaptive icon を指定しないようにしましょう。
この問題は既に Issue Tracker に報告されており、今後 Android Studio 3.0.1 のアップデートや 3.1 でリソースタイプの Lint チェックが追加される見込みのようです。[^3]

[^3]: https://issuetracker.google.com/issues/68716460