OmniAICreator/Qiita-1.07M huggingface dataset:
V-USBのPINアサインを変更する



V-USBはAVRマイコンを使った工作でUSBトランシーバーの無いAtmega328などで手軽にUSBガジェットを作成出来る優れものなのですが、抵抗やツェナーダイオードなど小規模な回路が必要となり、小さく回路を纏めたい時など標準のPINアサインを変更したい時があります。
割り込みをINT0からPCINT0に変更しAtmega328のPIN14(PB0),PIN15(PB1)に変更した時の変更箇所について書き留めておきます。

###変更箇所
usbconfig.hの下記の所を変更

```c:usbconfig.h
/* ---------------------------- Hardware Config ---------------------------- */

#define USB_CFG_IOPORTNAME      B
/* This is the port where the USB bus is connected. When you configure it to
 * "B", the registers PORTB, PINB and DDRB will be used.
 */
#define USB_CFG_DMINUS_BIT      1
/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected.
 * This may be any bit in the port.
 */
#define USB_CFG_DPLUS_BIT       0
/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected.
 * This may be any bit in the port. Please note that D+ must also be connected
 * to interrupt pin INT0!
 */
```
ポートとピン番号の割り当てを変更します。


```c:usbconfig.h
/* ----------------------- Optional MCU Description ------------------------ */

/* The following configurations have working defaults in usbdrv.h. You
 * usually don't need to set them explicitly. Only if you want to run
 * the driver on a device which is not yet supported or with a compiler
 * which is not fully supported (such as IAR C) or if you use a differnt
 * interrupt than INT0, you may have to define some of these.
 */
 #define USB_INTR_CFG            PCICR
 #define USB_INTR_CFG_SET        (1 << PCIE0)
// #define USB_INTR_CFG_CLR        0
 #define USB_INTR_ENABLE         PCMSK0
 #define USB_INTR_ENABLE_BIT     PCINT0
 #define USB_INTR_PENDING        PCIFR 
 #define USB_INTR_PENDING_BIT    PCIF0
#define USB_INTR_VECTOR          PCINT0_vect
#endif /* __usbconfig_h_included__ */
```
割り込み関係の定義もPCINT0を使うように定義し直しますがPCINTを使うので優先順位の関係でINT割り込みは使用出来ません。
この変更でD+がPB0,D-がPB1になり縦長に実装し易くなります。

あまりコンパクトで無い実装例
![SANY0063.JPG](https://qiita-image-store.s3.amazonaws.com/0/205783/db157104-9818-663f-41ee-5f0ff226a7d2.jpeg)
json to csv by jq command

# json to csv by jq command

## 目的
json形式のデータから、目的のデータをcsv形式で出力する。
## テストデータと期待する結果
### テストデータ
```json:test.json
[
  {
    "actions": [],
    "name": "ペドロ",
    "status": {
      "HP": 100,
      "speed": 50
    }
  },
  {
    "actions": [],
    "name": "ピート",
    "status": {
      "HP": 300,
      "speed": 20
    }
  }
]
```

上記データからには2人分のデータが格納されているが
それぞれのHPとspeedを抜き出し下記のような出力としたい。
### 期待する結果
```cv:result.csv
100, 50
300, 20
```

## 下記コマンドで期待する結果を出力できる
```bash
 cat test.json | jq  ". [].status | [.HP,.speed] | @csv" | sed 's/"//g' > result.csv
```
Fitbit Ionicで開発事始め

# これは何？
Fitbit Ionicで[apps](https://dev.fitbit.com/build/guides/glossary/#app-application)や[clock faces](https://dev.fitbit.com/build/guides/glossary/#clockfaces)を作る事前準備の備忘録。うろ覚えだけど。

# ここから備忘録

## 準備
まずはFitbit Studioにアクセス

1. 開発者用アカウントを作る

次にスマホアプリを操作

1. Fitbit Studioで作った開発者用アカウントでスマホアプリにログイン<br><br>
1. Ionicをアカウントに登録して、Wi-Fi設定をする<br>
   Ionicとdev.fitbit.comを繋ぐ為に必要<br><br>
1. 「開発者者向けメニュー」を出す<br>
   勝手に出てきた気がするが、出てこない場合は、[こちら](https://qiita.com/2fbCvmiYKX/items/3020ddce0ecf20638b5f)を参考にして何とかしてメニューを出す

## 開発時

1. Fitbit Studioで開発したい[apps](https://dev.fitbit.com/build/guides/glossary/#app-application)や[clock faces](https://dev.fitbit.com/build/guides/glossary/#clockfaces)を開く<br><br>
1. スマホアプリのIonicの設定から、「開発者者向けメニュー」の下の「開発者用ブリッジ接続」を有効にする<br><br>
1. Ionicの「設定」メニューに「Developer Bridge」をタップする
-> 最初`Conneccting to Server`と表示されるが、我慢強く待つと`Connected to Server`と表示される<br>&nbsp;&nbsp;&nbsp;&nbsp;<img src="https://qiita-image-store.s3.amazonaws.com/0/90361/45f7a5a8-691e-a002-52dc-2d858d4f4403.png" width="30%"><br><br>

1. Phonesにスマホ名、とDevicesに`Ionic`が表示されるまで<img src="https://qiita-image-store.s3.amazonaws.com/0/90361/83b312f2-ed5e-a4a7-8df8-1d14e7ccc17b.png" width="10%">を連打
<img src="https://qiita-image-store.s3.amazonaws.com/0/90361/e3610fa3-1d0a-1c3d-ad95-02280a8037f9.png" width="30%"> →<img src="https://qiita-image-store.s3.amazonaws.com/0/90361/d795b248-014d-d86b-3419-6b5e7efcc7bc.png" width="30%"><br><br>
1. 表示されたら、それぞれをクリック
   -> それぞれの状態が`Connected`になる
<img src="https://qiita-image-store.s3.amazonaws.com/0/90361/7f7ae52f-2be5-525d-659d-56669ed22437.png" width="30%"> & <img src="https://qiita-image-store.s3.amazonaws.com/0/90361/b68da7a7-0133-9fb8-376b-27852c4c2eef.png" width="10%">ボタンも押せるようになる

# なぞ
[apps](https://dev.fitbit.com/build/guides/glossary/#app-application)はスマホとIonicの両方が`Connected`にならないと「Run」が押せないが、[clock faces](https://dev.fitbit.com/build/guides/glossary/#clockfaces)はIonicだけでも「Run」が押せる。

そういう仕様？
UbuntuでキーボードのCtrlの位置を変える

#背景
CtrlキーはAの左が好き！デスクトップなら好きなキーボードを繋げますが、ラップトップで下記のようなJP106キーボード レイアウトだったとき、カスタマイズしたい場合の備忘録。

![keyboard.jpg](https://qiita-image-store.s3.amazonaws.com/0/152272/4187eac6-7f73-e175-e163-e6c4f2ab5075.jpeg)

#動作環境
Ubuntu 17.10 64bit

#操作
1. まずは、カスタマイズに必要なTweaksをインストール。
```$ sudo apt install gnome-tweak-tool```

2. Tweaksを起動して、「キーボードとマウス」を選択して、「追加のレイアウトオプション」を選択。
![Screenshot from 2018-01-21 11-36-02.png](https://qiita-image-store.s3.amazonaws.com/0/152272/ae2cd2e8-8240-bcfb-7404-b958fbfcbeb1.png)

3. 「Caps Lockキーの動作」のトグルを選択して、「Caps Lock is also a Ctrl」を選択。
![Screenshot from 2018-01-21 11-36-17.png](https://qiita-image-store.s3.amazonaws.com/0/152272/06eb68a3-952c-98ef-d1aa-d52072eb8656.png)
これでCpas LockがCtrlになります。CtrlキーもCtrlのままです。
*※「Caps Lockキーの動作」の少し上にある「Ctrlキーの位置」でも変更することができます。CtrlとCaps Lockの入れ替え等も設定できます。*
![Screenshot from 2018-01-21 12-06-23.png](https://qiita-image-store.s3.amazonaws.com/0/152272/7f335a3b-3c39-7a98-0490-73deb50f6e19.png)
【R入門】R言語の基本:2変数の記述統計

統計とR言語の勉強をしています。
[「Rによるやさしい統計学」](http://amzn.to/2mDoNMH)の写経で勉強。

#実行環境
- Windows10 Pro 64bit
- R：3.4.3
- RStudio：1.1.383

RStudioのConsoleを使って実行しています

# 散布図
2変数の散布図出力。

```R
> shinrigaku_test1 <- c(11, 14, 7, 12, 10, 6, 8,15, 4, 14, 9, 6, 10, 12, 5, 12, 8, 6, 12, 15)
> statistics_test1 <- c(6, 10, 6, 10, 5, 3, 5, 9, 3, 3, 11, 6, 11, 9, 7, 5, 8, 7, 7, 9)
> statistics_test2 <- c(10, 13, 8, 15, 8, 6, 9, 10, 7, 3, 18, 14, 18, 11, 12, 5, 7,12, 7, 7)
> plot(statistics_test1,statistics_test2)
> plot(shinrigaku_test1,statistics_test1)
```

![10.R_Basis01.JPG](https://qiita-image-store.s3.amazonaws.com/0/134273/e212e698-18c7-ee7e-81c9-bd3ec8681800.jpeg)

# 共分散
「偏差の積の平均」である共分散の出力。上のコードの続きです。
地味に計算します。

```R
> kyoubunsan1_2 <- sum((statistics_test1-mean(statistics_test1))*(statistics_test2-mean(statistics_test2)))/length(statistics_test1)
> kyoubunsan1_2
[1] 7.55
```

共分散はcov関数で算出できるのですが、不偏共分散なので上の結果の7.55と異なります。

```R
> cov(statistics_test1,statistics_test2)
[1] 7.947368
```

# 相関係数
相関係数は、共分散を標準偏差の積で割ったものです。cor関数で算出できます。

```R
> #地味計算
> cov(statistics_test1,statistics_test2)/(sd(statistics_test1)*sd(statistics_test2))
[1] 0.749659
> #using cor function
> cor(statistics_test1,statistics_test2)
[1] 0.749659
```

# クロス集計表
table関数を使ってクロス集計表を出力。

```R
> math <- c("嫌い","嫌い","好き","好き","嫌い","嫌い","嫌い","嫌い","嫌い","好き","好き","嫌い","好き","嫌い","嫌い","好き","嫌い","嫌い","嫌い","嫌い")
> table(math)
math
嫌い 好き 
  14    6 
> stat <- c("好き","好き","好き","好き","嫌い","嫌い","嫌い","嫌い","嫌い","嫌い","好き","好き","好き","嫌い","好き","嫌い","嫌い","嫌い","嫌い","嫌い")
> table(stat)
stat
嫌い 好き 
  12    8 
> table(math,stat)
      stat
math   嫌い 好き
  嫌い   10    4
  好き    2    4
```

# ファイ係数
1と0の2つの値からなる変数に対して計算される相関係数をファイ係数と呼びます。
ifelse関数を使ってテキストを1/0に変換して相関係数を計算することでファイ係数を算出します。

```R
> math10 <- ifelse(math=="好き",1,0)
> math10
 [1] 0 0 1 1 0 0 0 0 0 1 1 0 1 0 0 1 0 0 0 0
> stat10 <- ifelse(stat=="好き",1,0)
> stat10
 [1] 1 1 1 1 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 0
> cor(math10, stat10)
[1] 0.3563483
```
Alpine linuxで動かないshellがあったときにやったこと。

# 経緯
- mac上で書いたコードを`alpine linux`ベースのdocker containerで動かそうとした時に動かなくて困った。

# 原因
- `alpine linux`には標準のシェル `ash` では、`nl` コマンドが入っていなかった。
- `ash`は`bash`とは違う軽量シェルというのは理解していたが、 `POSIX`にも書いてある`nl`ぐらい入っているだろ・・・と思って書いてたら入っていなくて焦った。`cat -n`で代用しようと思ったら、`ash`で動く`cat`にはオプションがなくて使えなかった。

# 解決方法
- `apk add coreutils`　を実行する。
- `apk` は`alpine linux` のパッケージ管理ツール
- `apk add` でパッケージを追加する
- `coreutils`はgnu coreutilsのpackage
    - https://pkgs.alpinelinux.org/package/v3.3/main/x86/coreutils
- `nl`単体でinstallとかどうやってやるんだろ・・・とか悩んでいたら、同僚に`coreutil`辺りに入ってるんじゃない？と言われ、パッケージ検索したら発見。すごい感謝です・・・


# さいごに
- シェルは結構実行環境依存があるので、ちゃんと実行環境を揃えましょう。
- これでも動かなかったら、ちゃんと`bash`が入っているイメージを使ったほうが良い。
Bash on Windows壊したので再召喚した

なんか色々いじってたらパッケージマネージャーが壊れてしまった。

- PHPのサブモジュールインストールするときにいつもsuアカウントでログインした状態になってインストールが止まる
- `dpkg --configure -a`で怒られたパッケージを消して入れ直すのが日常茶飯事に
- zshとかvimとか色々ビルド通らない

みたいな感じで荒れ放題だったので作り直し。

# Bash on Windowsを潰す
```cmd
C:\Windows\System32>lxrun /uninstall
警告: lxrun.exe は、Linux ディストリビューションのためにレガシ Windows サブシステムを構成するだけに使用されます。
ディストリビューションは次の Windows ストアを訪問してインストールすることができます:
https://aka.ms/wslstore

これにより Windows 上の Ubuntu がアンインストールされます。
Ubuntu 環境および次の項目を除くすべての変更内容と新しいアプリケーションが削除されます。

C:\Users\Kage\AppData\Local\lxss\home
C:\Users\Kage\AppData\Local\lxss
oot

続行するには、"y" を入力してください:
```
これでyを入力してエンターを叩くとBash on Windowsが綺麗さっぱり消えます。
このとき、途中で今のユーザーを残しますか？　って感じで訊かれるので、残すを選択するとhomeディレクトリは残ったままになります。ある程度環境再構築が楽になって便利。

# Bash on Windowsを再召喚する
```cmd
C:\Windows\System32>lxrun /install
警告: lxrun.exe は、Linux ディストリビューションのためにレガシ Windows サブシステムを構成するだけに使用されます。
ディストリビューションは次の Windows ストアを訪問してインストールすることができます:
https://aka.ms/wslstore

これにより Windows に Ubuntu がインストールされます。Ubuntu は Canonical によって配布される製品であり、次のサイトに示さ れる条件に基づいてライセンスされています。
https://aka.ms/uowterms

続行するには、"y" を入力してください:
```
yを押すとUbuntuが再び召喚されます。

あとはお好きにdotfilesを落としてくるなり`sudo apt-get update && sudo apt-get upgrade`するなりしてください。
Server Side Swiftで作ったアプリケーションをHerokuにデプロイ #love_swift


[Swiftサーバーサイド入門 Vaporの紹介](https://qiita.com/nakailand/items/c68514263c1fadcd695e)の手順が参考になりました。

## Herokuコマンド

```
$ wget -qO- https://cli-assets.heroku.com/install-ubuntu.sh | sh
```

> 参考: https://qiita.com/ryotaro76/items/6aa9d3187d742eed0325

インストールが完了したら、Herokuのアカウントでログインします。

```
$ heroku login
```

## Procfile作成

今回はSwiftのプロジェクトとしては、webappというプロジェクト名です。

```
web: webapp --port=$PORT
```

## Herokuでアプリケーション作成

`lineswiftapp`というアプリケーションをHeroku上で作成しました。

![](https://i.gyazo.com/74ae0ded493b26a4dcc816ec2c7de9b7.png)

(Swiftのプロジェクト名と合わせてwebappと名付けたかったのですが、ネームスペース的に無理でした。)

## デプロイ

* [Buildpacks](https://devcenter.heroku.com/articles/buildpacks)の設定

```
$ heroku buildpacks:set https://github.com/kylef/heroku-buildpack-swift.git --app lineswiftapp
```

```
Buildpack set. Next release on lineswiftapp will use https://github.com/kylef/heroku-buildpack-swift.git.
Run git push heroku master to create a new release using this buildpack.
```

* git pushする

```
$ git init
$ git add -A
$ git commit -m 'init'
$ heroku git:remote -a lineswiftapp
$ git push heroku master
```

これでデプロイがスタートします。

エラーが出なければ成功です。

## LINE BOTのエンドポイントに

sslが利用できるので前回作ったLINE BOTもホスティングできます。

![](https://i.gyazo.com/ced28deaa08af92f618cbb63a8ccff72.png)

ssl対応が地味にめんどくさいですからね。笑
Ubuntuでカーネルをビルドするには

#背景
組込みシステムで必要なクロス ビルド環境の構築。
Ubuntuをカーネルのビルド環境として構築する方法を備忘録として残します。
*※Ubuntuのカーネルをビルド方法ではありません。*

#動作環境
Ubuntu 17.10 64bit

#操作
```$ sudo apt install build-essential ncurses-dev libssl-dev```

コンフィグレーションにnconfigを使う場合は、これでカーネルがビルドできるようになります。
Google Workspace で契約したドメインとは別のドメインでメールを送受信する方法

**NOTE: Google Workspace (← 旧 G Suite) (← 旧 Google Apps) 用に記事を修正**

`Google Workspace` で契約したドメイン (プライマリドメイン) とは別の新たに取得したドメインを使ってメールを送受信したい場合の設定方法



----

## 条件

* `Google Workspace` に契約
    * **NOTE: 以前あった 無償版 Google Apps (旧称) のままでは受信のみ**



----

## ドメイン設定

1. `Google Workspace` の管理画面 [Google Admin](https://admin.google.com/) にアクセス
1. 左上のプルダウンより `アカウント > ドメイン > ドメインの管理` に進む
    * https://admin.google.com/u/2/ac/domains/manage
1. `ドメインの追加` で追加したいドメインを追加
1. `続行してドメインの所有権を証明`
    * DNS の設定で TXT (or CNAME) レコードの追加と MX レコードの追加を対応



----

## 受信設定

1. `Google Workspace` の管理画面 [Google Admin](https://admin.google.com/) にアクセス
1. 左上のプルダウンより `ディレクトリ > グループ` (=`Google Groups`) に進む
    * https://admin.google.com/u/2/ac/groups
1. `グループを作成`
1. `グループのメールアドレス` の host name 選択プルダウンで追加したドメインを選択
1. `次へ`
1. `アクセスタイプ` の `投稿を公開` で `外部` を有効に設定
    * **NOTE: この設定をしないと外部からメール受信不能**
1. `グループを作成`
1. `完了`



### 受信設定 確認

* `Google Workspace` に契約したドメイン (プライマリドメイン) とは別のドメインから登録した「`グループのメールアドレス`」宛にメールを送信し、グループのメンバー宛にメールが届くことを確認



----

## 送信設定

1. `Google Workspace` で契約している方の Gmail にアクセス
1. `設定 > すべての設定を表示 > アカウント > 名前 > 他のメール アドレスを追加`
1. `メールアドレス` に `Google Groups` に追加したメールアドレスを入力して `次のステップ` を押下
    * `エイリアスとして扱います。` はチェックを入れたまま
    * `確認メールの送信`
1. 追加したメールアドレス宛に届いた `確認コード` を入力して `確認` を押下

### 送信設定 確認

`Google Workspace` で契約している方の `Gmail` で新規のメールを作成する際、
差出人の欄がプルダウンとなり、追加したメールアドレスを選択してメールが送信できるようになっていれば成功
Server Side Swiftで土善旅館周辺の天気を知る #love_swift


LINE BOTを作ってみてVaporの`Droplet`のHTTP Client使えそうだと思ったので、そこだけ切り離して使って見ます。

* Swift 4.0.3
* Vapor 2.4.0

です。

> VaporをHTTPリクエストだけに利用するのは大きすぎるので、HTTPリクエストだけするライブラリでServer Side Swiftでよく使われるライブラリって何があるのか知りたいです。


HTTPリクエストの練習で天気はよく使います。

## 土善旅館周辺の天気

ライブドアの天気APIです。

> http://weather.livedoor.com/weather_hacks/webservice

土善旅館は千葉の東の方なので、用意されてて近い場所は`銚子`みたいですね。

> http://weather.livedoor.com/forecast/webservice/json/v1?city=120020

## 実装

フォルダ作って移動

```
$ mkdir tenki
$ cd tenki
```

初期化、このコマンド省略系の書き方できないのかな...

```
$ swift package init --type executable
```



```Package.swift
// swift-tools-version:4.0
// The swift-tools-version declares the minimum version of Swift required to build this package.

import PackageDescription

let package = Package(
    name: "tenki",
    dependencies: [
        // Dependencies declare other packages that this package depends on.
        .package(url: "https://github.com/vapor/vapor.git", from: "2.4.0")
    ],
    targets: [
        // Targets are the basic building blocks of a package. A target can define a module or a test suite.
        // Targets can depend on other targets in this package, and on products in packages which this package depends on.
        .target(
            name: "tenki",
            dependencies: ["Vapor"]),
    ]
)

```

```main.swift
import Vapor

let drop = try Droplet()
let endpoint = "http://weather.livedoor.com/forecast/webservice/json/v1?city=120020"
let res: Response = try drop.client.get(endpoint)

let mes = res.data["description"]?.object?["text"]?.string
print(mes)
```

[WIP]まだJSONの扱い方が怪しいのでもう少し調べたい

## 実行

```
$./.build/x86_64-unknown-linux/debug/tenki
Could not load config files from: /home/n0bisuke/myswift/tenki/Config/
Try using the configDir flag
ex: .build/debug/Run --configDir=/absolute/path/to/configs
The default hash should be replaced before using in production.
The default cipher should be replaced before using in production.
Optional(" 西日本から東日本にかけて高気圧に覆われています。\n\n 千葉県は、晴れや曇りとなっています。\n\n 21日は、高気圧に覆われますが、上空の気圧の谷や寒気の影響により、\n晴れ時々曇りとなるでしょう。\n \n 22日は、低気圧が発達しながら伊豆諸島を通過するため、曇りで、昼過\nぎから北西部では雪か雨、北東部と南部では雨となる見込みです。\n\n 太平洋沿岸では、21日は、うねりを伴い波がやや高いでしょう。22日\nは、波が高い見込みです。船舶等は注意してください。")
```



> 西日本から東日本にかけて高気圧に覆われています。\n\n 千葉県は、晴れや曇りとなっています。\n\n 21日は、高気圧に覆われますが、上空の気圧の谷や寒気の影響により、\n晴れ時々曇りとなるでしょう。\n \n 22日は、低気圧が発達しながら伊豆諸島を通過するため、曇りで、昼過\nぎから北西部では雪か雨、北東部と南部では雨となる見込みです。\n\n 太平洋沿岸では、21日は、うねりを伴い波がやや高いでしょう。22日\nは、波が高い見込みです。船舶等は注意してください。

とのことです。
JSライブラリ highcharts.jsの紹介と技術メモ

# はじめに

Web案件でグラフ機能を実装する必要があり、
その際に**highcharts.js**というJavascirptの有償ライブラリを使いました。
結構グラフィカルな感じで、実績もあってイイ感じ！なのですが、
日本語リソースがあまりなかったので、
自分向けの技術メモ兼情報共有を目的にこの記事を書きました。

あと、QiitaがCodepPen対応したとのことだったので、それも試したかった感じです。

# 概要

公式サイトは以下です。

- [トップ](https://www.highcharts.com/)
- [デモ一覧](https://www.highcharts.com/demo)
- [ドキュメント一覧](https://www.highcharts.com/docs)

highcharts.jsの特徴をざっくり記述すると、
以下になります。

- グラフィカルな表示
- オプションが多く、カスタマイズしやすい
- 商用利用は有償、非営利目的は無償
- APIリファレンスにデモサンプルがリンクされているため、躓くことが少ない(かも・・・)

他グラフ系ライブラリとの比較は、以下記事でまとめてくださっています。
参考になりました。
[JSのグラフライブラリを今選ぶならHighchartsで決まり](https://qiita.com/grgrjnjn/items/fa39778657493008c3b6)

また、highcharts.jsはFacebookやTwitterでも採用実績があると、
公式サイトのトップ画面に表示されているので、
採用(購入)する際に会社側にも説得しやすいかな〜と思います。

# 学習の進め方

Javascript熟練者の方はデモを見ればパッとわかってしまうかと思いますが、
自分はJavascript初めて1ヶ月ちょっとだったので、
[Highchartsのパーツ説明](https://www.highcharts.com/docs/chart-concepts/understanding-highcharts)から読みときました。
↑読んでおくと、どのパーツがなんて名称か、
どのようにAPIを使えば良いかが頭の中で紐付けしやすいです。

# 問題の解決方法

こういうことやりたいけど・・・どうしたらよいかわからん。
という場合は、自分は以下手順で大体解決できました。
参考になれば幸いです。

1. [Highchartsのパーツ説明](https://www.highcharts.com/docs/chart-concepts/understanding-highcharts)でどのパーツに対して設定を行いたいか理解
2. [APIリファレンス](https://api.highcharts.com/highcharts/?_ga=2.3485552.1346087283.1516420797-1989438060.1515225776)にて、該当のパーツのリンクを開く
3. リンク内に記載された内容で理解できなかったら、デモを開く

APIのデモは、以下画像の**Try it**の下のリンクから閲覧可能です。

![スクリーンショット 2018-01-21 10.37.31.png](https://qiita-image-store.s3.amazonaws.com/0/140704/def592db-d313-4487-3586-93d11f6b6ad2.png)

**Tooltip in styled mode**のリンクを用意しましたので、
興味のある方は、試しに閲覧してみてください。
[Tooltip in styled mode - ツールチップにCSSスタイルを適応する方法](http://jsfiddle.net/gh/get/library/pure/highcharts/highcharts/tree/master/samples/highcharts/css/tooltip-border-background/)

# CodePenデモ

<p data-height="500" data-theme-id="0" data-slug-hash="ppGjvL" data-default-tab="result" data-user="zucky_zakizaki" data-embed-version="2" data-pen-title="highcharts_sample_for_japanese" class="codepen">See the Pen <a href="https://codepen.io/zucky_zakizaki/pen/ppGjvL/">highcharts_sample_for_japanese</a> by zucky (<a href="https://codepen.io/zucky_zakizaki">@zucky_zakizaki</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://production-assets.codepen.io/assets/embed/ei.js"></script>

うまく表示できてますかね。。。以下を参考に試したのですが。。。
[Qiitaで記事にCodePenが埋め込めるようになりました](https://qiita.com/Qiita/items/edae7417214c8e957f54)
下書きだとCodePenが表示されないとのことなので、投稿後チェックするようにしてくださいね。

現在、↑デモでは以下のことを技術メモとして実装しています。
また課題→解決することがありましたら、更新していくようにします。

- Highchartsの生成〜オブジェクト取得方法
- 各Pointへのイベント設定
- ツールチップのフォーマット変更
- crosshair(フォーカスしているPointに対して縦線を引く)の表示
- タイトル、URL(右下)の非表示
- ズーム設定
- XY軸反転(btnInvertedの処理参照)
- チャートのリサイズ(btnResize〜の処理参照)
- 折れ線の垂直描画(data4参照)
- グラフからマウスがはずれてもツールチップを隠さない(hideしない)　→　[方法はこちらの記事を参考にしてください](https://qiita.com/zaki_zaki/items/f3142a2b6ea9f2bdeff1)

# その他

~~一部、CodePenだと実現できないデモがありましたので、~~
~~そういったメモは箇条書き＆githubへソースを公開するような形にしたいと思います。~~
~~別途後ほど更新します。~~

CodePenに入れ込むことができました！
失礼いたしました。。。
UbuntuでTwitterの動画を再生するには

#背景
Ubuntuをインストールした直後はFirefoxでTwitterの動画を再生できません。
コマンド1行で再生できるようになるけど、Ubuntuのインストールはたまにしかしないので、備忘録として残しておきます。

#動作環境
Ubuntu 17.10 64bit
Mozilla Firefox 57.0.4

#操作
```$ sudo apt install ffmpeg```
これだけ。
Jupyter + Matplotlib > plt.cm.Set2の表示 (jetとの違い) | colormap(Set2など)のRGB値取得

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04 LTS desktop amd64
TensorFlow v1.2.1
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
scipy v0.19.1
geopandas v0.3.0
MATLAB R2017b (Home Edition)
ADDA v.1.3b6
```

### 処理概要

[make_pov_180121.py > bashの処理(2007年)をPythonで実装(2018年) > 43分の処理は3.5秒になった](https://qiita.com/7of9/items/90958fb15db6d4a7d564)

Matplotlibで描画処理をしていたが、Povrayでの処理が速いことが分かった。
Povrayで処理する場合、RGB値を自分で設定することになりそう。

Matplotlibで使用していたのはSet2というカラーバーだった。

Set2を使ったコードを実装してみた。

参考: [Jupyter | Matplotlib > 2次元データの可視化 > imshow() | scatter()](https://qiita.com/7of9/items/208e55caa6a9713030aa)

### code

Jupyterコード。

```py:test_colorByRGB_180121.ipynb
%matplotlib inline

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm
from pylab import rcParams

rcParams['figure.figsize'] = 7, 3
rcParams['figure.dpi'] = 130

def get_value(ax, ay):
    return ax

# 1. get data
NUM_DATA = 10000
x = np.random.rand(NUM_DATA)
y = np.random.rand(NUM_DATA)
color = get_value(x, y)

# 2. draw data
size = 25  # arbitrary

fig = plt.figure()
ax1 = fig.add_subplot(1,2,1)
im1 = ax1.scatter(x, y, size, color, cmap=plt.cm.Set2)
fig.colorbar(im1)

ax2 = fig.add_subplot(1,2,2)
im2 = ax2.scatter(x, y, size, color, cmap=plt.cm.jet)
fig.colorbar(im2)

fig.tight_layout()

```

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/2bfe0393-83e0-24fa-b54a-44101d5b17df.png)

### 分かった事項

- jetではなだらかに色が変わる
- Set2では断続的に色が変わる


### RGB値取得

以下のJupyterコードで取得できた。

```py:test_colorByRGB_180121.ipynb(二つ目のセル)
%matplotlib inline

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm
from pylab import rcParams

for pos in range(0, 10 + 1):
    val = pos / 10.0
    print(val, plt.cm.Set2(val))

```

```txt:run
0.0 (0.40000000000000002, 0.76078431372549016, 0.6470588235294118, 1.0)
0.1 (0.40000000000000002, 0.76078431372549016, 0.6470588235294118, 1.0)
0.2 (0.9882352941176471, 0.55294117647058827, 0.3843137254901961, 1.0)
0.3 (0.55294117647058827, 0.62745098039215685, 0.79607843137254897, 1.0)
0.4 (0.90588235294117647, 0.54117647058823526, 0.76470588235294112, 1.0)
0.5 (0.65098039215686276, 0.84705882352941175, 0.32941176470588235, 1.0)
0.6 (0.65098039215686276, 0.84705882352941175, 0.32941176470588235, 1.0)
0.7 (1.0, 0.85098039215686272, 0.18431372549019609, 1.0)
0.8 (0.89803921568627454, 0.7686274509803922, 0.58039215686274515, 1.0)
0.9 (0.70196078431372544, 0.70196078431372544, 0.70196078431372544, 1.0)
1.0 (0.70196078431372544, 0.70196078431372544, 0.70196078431372544, 1.0)
```
Elm でネストされたJSONを処理する

Elm で API を呼び出して、ネストしている JSON を処理する時に少し迷ったのでここに書いておく。

以下のような Record を処理する。

```elm
type alias Item =
    { id : String
    , value : String
    }
```

# 必要なパッケージを Import

```elm
import Json.Decode as Decode
import Http
```

# Msg　を定義

以下の形式で呼び出される。

```elm
type Msg
    = ...
    | Init (Result Http.Error (List Item))
```

# APIを呼び出す処理を定義

Cmdと、Http.Requestを定義する。

```elm
fetchItem : Cmd Msg
fetchItem =
    Http.send Init getItems

getItems : Http.Request (List Item)
getItems =
    Http.get "http://localhost:8080/items" decodeItems
```

# JSONのパースする処理を定義

Itemをパースする処理を定義する。
Decode.mapXのXは、要素の数を指定する。

```elm
decodeItem : Decode.Decoder DateItem
decodeItem =
    Decode.map2 Item
        (Decode.field "id" Decode.string)
        (Decode.field "value" Decode.bool)
```

ItemのListをパースする処理を定義する。

```elm
decodeItems : Decode.Decoder (List Item)
decodeItems =
    Decode.list decodeItem
```

これを Http.get の引数に渡してあげるとネストした JSON が処理できる。
WebPackを使用したSPAをElectron化する

学習のために、SPA 作った[Markdown エディタ](https://info.growtech.tk/)を Mac のアプリとして使いたくなったので、Electron 化した。
その時にしたことをメモ。

# Webpack の設定

Electron を SPA の Javascript に バンドルしてほしくないので、externals の設定を追加。

```javascript
externals: {
  electron: 'require("electron")',
  fs: 'require("fs")'
},
```

# SPA 側で electron かどうかを判定

`process.type` を参照して renderer の場合のみに、Electronを読み込み。

```javascript
if (window.process && window.process.type == "renderer") {
  const ipcRenderer = require("electron").ipcRenderer;
  ...
}
```

あとは Electron 側で index.html てきなものを `loadURL`　するだけで、SPAのソースを流用できた。
JavaScript で Google Drive を読み書き

JavaScriptでGoogle Driveを読み書きしようとしたが、REST API のドキュメントしか見当たらず困ったことがあったので、やり方をメモ。

# Google Drive を読み込み

以下の js を読み込む。

```
https://apis.google.com/js/api.js
```

drive を load する。

```javascript
gapi.load("client", () => {
    gapi.client.load("drive", "v3", () => {
      // gapi.client.drive が使用可能になる
    }
    // APIのアクセストークンを設定。
    gapi.auth.setToken({
      access_token: "XXXXXXXXXXXXXXXXXXXXXXXXXXX"
    });
}
```

# 一覧を取得

```javascript
const request = gapi.client.drive.files.list({
  pageSize: 31, //　取得件数
  orderBy: "name,modifiedTime", // 取得するフィールド
  fields: "files(id, name, kind, size, mimeType, modifiedTime)",
  q: "trashed=false and XXXXXX in parents",　// 親フォルダを指定
  spaces: "drive"
});
request.execute(res => {
  result.files.map(v => {
    // ファイルを処理
  })
});
```

# ファイルを取得

```javascript
gapi.client.drive.files.get({
  fileId: id,
  alt: "media"
})
.then(res => {
  console.log(res.body);
});
```

# ファイルを作成

```javascript
const fileMetadata = {
  mimeType: "application/vnd.google-apps.document"
};
const media = {
  mimeType: "text/plain"
};
const request = gapi.client.drive.files.create({
  name,
  parents: [parent],
  uploadType: "media",
  fields: "id, name, parents",
  media,
  resource: fileMetadata
});
request.execute(res => {
  console.log(res.id);
});
```

(なんか指定しなくてもいい情報もありそうだが、ひとまず動いている)

# ファイルの更新

```javascript
const media = {
  mimeType: "text/plain"
};
const request = gapi.client.drive.files.update({
  name,
  media: media,
  fields: "id",
  fileId: id,
  uploadType: "media"
});
request.execute(res => {
  console.log(res);
});
```

# ファイルの内容を更新

create, update でファイルの内容自体を更新する方法がわからなかったので、
別途 upload 処理を実施。

(これは他の方の投稿を参照すればわかるものだが、v3に対応したものをこちらに書いておく)

```javascript
const auth_token = gapi.auth.getToken().access_token;
const boundary = "-------314159265358979323846";
const delimiter = "\r\n--" + boundary + "\r\n";
const close_delim = "\r\n--" + boundary + "--";

const metadata = {
  mimeType: "text/plain"
};

const multipartRequestBody =
  delimiter +
  "Content-Type: application/json\r\n\r\n" +
  JSON.stringify(metadata) +
  delimiter +
  "Content-Type: application/json\r\n\r\n" +
  text +
  close_delim;

gapi.client
  .request({
    path: "/upload/drive/v3/files/" + id,
    method: "PATCH",
    params: { fileId: id, uploadType: "multipart" },
    headers: {
      "Content-Type": 'multipart/form-data; boundary="' + boundary + '"',
      Authorization: "Bearer " + auth_token
    },
    body: multipartRequestBody
  })
  .execute(function(file) {
    console.log(file.name);
});
```

情報もいっぱいあるので、簡単かなと思っていたら、APIのバージョンが変わっていたり、少しめんどくさかった。

# 参考

https://developers.google.com/drive/v3/web/search-parameters
DSAキーキャップ（キートップ）を削る

DSAのキーキャップを削ってみたので、そのメモです。

![IMG_0119 (1).jpg](https://qiita-image-store.s3.amazonaws.com/0/104778/cb5fb163-fbbb-5760-367d-b9a641308480.jpeg)

# 動機

なぜキーキャップを削るかというと、より自分の指にフィットさせたかったから。
特に僕の使っているErgodoxは通常のキーボードと違い、親指を多様するのですが、親指は他の4本指と違い、指を曲げる方向が違います。そのため、親指キーだけキーキャップの角を打鍵することになり、ちょっと角が痛いなあ…と感じていました。
親指キーを指の腹で打鍵できるような、より立体的なキーボードを使うという選択肢もあるのですが、お手軽、ということでキーキャップを削ってみました。

# 道具

以下の2つの商品を購入しました。

SUN UP ダイヤモンドヤスリ 3本組 チタンコーティング 140mm
https://www.amazon.co.jp/gp/product/B00BCG23WE/ref=od_aui_detailpages00?ie=UTF8&psc=1
粗削り用として購入。

SOFT99 ( ソフト99 ) 99工房 耐水サンドペーパーセットM 09123
https://www.amazon.co.jp/gp/product/B006G644AE/ref=od_aui_detailpages00?ie=UTF8&psc=1
仕上げ用。

1000円以下で揃います。

# 作業

実際にヤスリで削りたい方向をこすり、最後にサンドペーパーでこする、という作業。
意外とすぐに削れます。あと、サンドペーパーでの仕上げは必要だと感じました。
一番不安だったのは、DSAの着色が取れてしまうのではないか、ということ。ですが、削っても内部まで着色されているため、色落ちしたりはしませんでした。

# 感想

指に馴染んでかなりいい感じです！
卓球のラケットだって、自分の指に合わせて削るのであれば、キーキャップだって指の形に合わせて削っていいのでは？と思いました。
pragma(crt_constructor) を試してみる

これはD言語アドベントカレンダー2017の記事です（は？？？？）

[DMD 2.078でC runtime construction and destructionが入りました](https://dlang.org/blog/2018/01/04/dmd-2-078-0-has-been-released/#cruntimeconstructionanddestruction) ね。これはGCC拡張の `__attribute__((constructor))`, `__attribute__((destructor))` 相当のもので、実装もそうなっているんですが、実際に同じように振る舞うのかちょっと気になりますよね。GCC拡張でよく使われている(????)テクニックを実践してみました。

## 1. mainの2回呼び出し

```d
import core.stdc.stdio;

extern(C):

pragma(crt_constructor)
int main()
{
    puts("C main");
    return 0;
}
```

- 実行結果

```console
(dmd-2.078.0)$ rdmd -betterC adc1.d
C main
C main
```

## 2. mainを変数にする

```d
import core.stdc.stdio;
import core.stdc.stdlib : exit;

extern(C):

__gshared int main = 0;

pragma(crt_constructor)
void init()
{
    printf("hello, ");
    exit(0);
}

pragma(crt_destructor)
void fini()
{
    puts("world!");
}
```

- 実行結果

```console
(dmd-2.078.0)$ rdmd -betterC adc2.d
hello, world!
```

`'main' is usually function` がでないのが悲しいですね。

## できないこと

DMD限定だとsectionいじって `.text` にmainを置くとか `__attribute__((cleanup(hoge)))` みたいなのはまだ使えないです。LDCとかGDCとかだとsectionは普通にできるはず。GDCはcleanupも使えるのかな、よくわかんないです。まだすべてのトリックが使えるというわけではなですが、なんかおもしろそうな材料が増えてよかったですね。
python-fireで始める簡単CLI開発

## 背景
pythonでちょこちょこお遊びしてたところ、[python-fire](https://github.com/google/python-fire
)なるツールを見つけたので紹介


## 環境
Python 3.6.1


## 導入手順
```
pip install fire
```

## 使い方
[ガイドはこのページ](https://github.com/google/python-fire/blob/master/docs/guide.md)にしっかり書いてあります。


```py
import fire

def add(x, y):
  return x + y

def multiply(x, y):
  return x * y

if __name__ == '__main__':
  fire.Fire()
```

Fire()をcallしたら、もうコマンドが叩けます。

```
$ python example.py add 10 20
30
$ python example.py multiply 10 20
200
```

classを渡すことも可能です。

```py
import fire

class BrokenCalculator(object):

  def __init__(self, offset=1):
      self._offset = offset

  def add(self, x, y):
    return x + y + self._offset

  def multiply(self, x, y):
    return x * y + self._offset

if __name__ == '__main__':
  fire.Fire(BrokenCalculator)
```

オプションとして渡した値をコンストラクタで利用することが出来ます。

```
$ python example.py add 10 20 --offset=0
30
$ python example.py multiply 10 20 --offset=0
200
```

他にもヘルプの表示機能なども可能です。便利！


## まとめ
- すごく簡単にCLIが作れます
- 開発中のデバッグもしやすくて良い感じ
- 「ファイル操作がけっこうあってシェルスクリプトだとちょっと書きにくいなー」みたいなシーンに良さそうです
ポケモンの種族値を検索するコマンドラインツール作った

ポケモンの対戦をしているときに、自分のポケモンと相手のポケモンの素早さ種族値ってどっちが上だっけ？となることが多かったので、ポケモンの種族値を検索できるコマンドラインツールをPythonで作成しました。

[donchan922/search_pokemon_base_stats](https://github.com/donchan922/search_pokemon_base_stats)

# 環境
- Python 2.x

# 使い方
```bash
$ git clone https://github.com/donchan922/search_pokemon_base_stats.git
$ cd search_pokemon_base_stats/source
```

以下使用例です。

```bash
$ python search_base_stats.py ピカチュウ

No.,ポケモン名,HP,攻撃,防御,特攻,特防,素早,合計
025,ピカチュウ,35,55,40,50,50,90,320
```

```bash
$ python search_base_stats.py ネクロズマ

No.,ポケモン名,HP,攻撃,防御,特攻,特防,素早,合計
800,ネクロズマ,97,107,101,127,89,79,600
800,ネクロズマ(たそがれのたてがみ(日食)),97,157,127,113,109,77,680
800,ネクロズマ(あかつきのつばさ(月食)),97,113,109,157,127,77,680
800,ネクロズマ(ウルトラネクロズマ),97,167,97,167,97,129,754
```

```bash
$ python search_base_stats.py メガルカリオ ジャローダ

No.,ポケモン名,HP,攻撃,防御,特攻,特防,素早,合計
497,ジャローダ,75,75,95,75,95,113,528
448,メガルカリオ,70,145,88,140,70,112,625
```

これでポケモンマスターに一歩近づけた！？

# 参考リンク
- [ポケモン種族値リスト/ランキング](https://yakkun.com/sm/status_list.htm)
- [ポケモン関連の英語](https://blog.mono0x.net/blog/2011/12/19/)
- [テキストファイルから指定した文字列を含む行を出力する](https://qiita.com/qt-luigi/items/76f7955d68418f967efb)
- [実行スクリプトからの相対パスでファイルにアクセスする.](https://qiita.com/FGtatsuro/items/52ad08640df6bfad5c2a)
永続化されている redis のバックアップ、復元

#はじめに

復元チェックのために
Redis Desktop Manager
https://redisdesktop.com

があると便利。

・データファイル redis.conf ファイルのdirを見てね
・データファイル名 redis.conf ファイルのdbfilenameを見てね
・redisは永続化起動されている状態で始める。
・サーバーAでバックアップを取得、Bに渡して復元
・redis-cli のパスがわからんけりゃ以下で調べる
・monitなど自動でredisを再起動するサービスを使っている場合はそれも止める。

```

find / -name '*redis-cli*' -print

```


#サーバーAで作業
##バックアップを実行

```

/home/your/redis-3.2.11/src/redis-cli bgsave

```

#バックアップできたかな？

現在の時刻よりも古いのが表示されたらバックアップ完了してる。

```

date --date "@`/home/your/redis-3.2.11/src/redis-cli lastsave`" +"%Y/%m/%d %H:%M"

```

#winscp で ダウンロード

```

/dump.rdb

```

**バックアップを取得完了したよ。**


#以下、すべてサーバーBで作業

**さぁ、復元作業の始まり**

#winscp で アップロード

```

/your/dump.rdb

```


権限ないと怒られるので、まずはユーザーフォルダにアップしておく。


#Redisを止めて、/dump.rdbを削除

**かならず、サーバーを止めてからファイルを削除してね。じゃないとうまくバックアップを復元できません。また、ファイル名、場所は /dump.rdb（初期値の場合） にしてね。**

```
#service monit stop
sudo systemctl stop redis
rm /dump.rdb

```


#さっきアップロードした /your/dump.rdb を移動

```

mv /home/your/dump.rdb /dump.rdb

```
 


#再起動

```

sudo systemctl start redis
#service monit start

```
 

以上
Hugoで生成したコンテンツをlftpでアップロードする

いまどきはHugoで生成したコンテンツも、

0. コンテンツを書く
0. どこかのプライベートリポジトリにプッシュして
0. どこかでビルドして
0. ステージング環境で確認して
0. 公開リポジトリにプッシュして
0. Webサーバーにデプロイ

みたいなことが当たり前になってきていますね

でもそんなに**大事じゃないサイト**の構築にそんなにリソースをかけてられない

**大事じゃないサイト**＝なにかをやらかしてとしても、しれっと再デプロイするだけで済んでしまうサイト

でもFTPでやるのは面倒くさい

0. コンテンツを書く
0. ローカルでビルドするとWebサーバーにアップロード

くらいでちょうどいい

# やってみた
lftpを使えばいいみたい
[ lftp - Sophisticated file transfer program](https://lftp.yar.ru/lftp-man.html)

## インストール
```
$ sudo apt -y install lftp
```

## 設定ファイルを書く
```
$ nano lftp.dat
open -u [ID],[Password] [FTPServer]
mirror -R --only-newer --verbose=3 --log=/hugo/site/lftp.log /hugo/site/public /
echo end
close
quit

```

キモなのは`mirror`コマンド

```
mirror [option] [src] [dist] 
```

上に書いた設定だと

* -R：[src]がローカル側、[dist]がリモート側になる 
* --only-newer：新しいファイルだけコピーする
* --verbose=3：コマンドが出す表示の詳細度
* log=/hugo/site/lftp.log：ログ・ファイルのパス
* /hugo/site/public：Hugoで生成されるコンテンツが入ったディレクトリ
* /：Webサーバーのディレクトリ

あと`open`コマンドでパスワードを指定するときに、パスワードに&が含まれるときは''(一重引用符)でくくってあげるとうまくいった

## lftpでアップロードする

```
$ lftp -f lftp.dat
```

で設定ファイルを読み込んで実行される

## Hugoでコンテンツを生成したらアップロードする
```
$ nano site_generate.sh
#!/bin/sh
cd /hugo/site
rm -rf public/
hugo --destination public --theme shirouto
rm lftp.log
lftp -f lftp.dat
```
FreeCADのエラーメッセージ集

たぶんここいらへん
\FreeCAD-master\src\Mod\Part\Gui\Resources\translations\Part_ja.ts
\FreeCAD-master\src\Mod\PartDesign\Gui\Resources\translations\PartDesign_ja.ts
\FreeCAD-master\src\Mod\ReverseEngineering\Gui\Resources\translations\ReverseEngineering_ja.ts

ErrorMessage(Japanese,English)
誤った選択
2つ以上の面を選択
OK

誤った選択
3つ以上の頂点を選択
OK

誤った選択
パーツオブジェクトを選択
OK

誤った選択
部品オブジェクトを1つだけ選択して下さい。
OK

入力エラー
Support shape is not a solid
OK

非ソリッドが選択されています
非ソリッドをブーリアン演算に用いると、予期しない結果を引き起こす可能性があります。続行しますか？
Yes No

Boolean Operation
Select a shape on the right side, first
OK

Boolean Operation
Performing union on non-solids is not possible
OK

Current Window not showing a Drawing Page
Drawing Dimensioning tools are for page objects generated using the Drawing workbench. Aborting operation.
OK

Double constraint
The selected edge has already a horizontal constraint!
OK

Extrude
Select a shape for extrusion, first.
OK

Non-solids selected
The use of non-solids for boolean operations may lead to unexpected results.
Do you want to continue?
Yes No

Select sketch
Select a sketch from the list
Sketch
OK Cancel

Wrong selection
Select exactly one Part object.
OK


等々
空行削除コマンド(win版)

(参考)空行削除コマンド UNIX
https://qiita.com/meriy100/items/7cce6438882862aa4db5

Windowsでファイル1個。ほとんどのエディタでできます。
(例)サクラエディタの正規表現
http://sakura.qp.land.to/?%C0%B5%B5%AC%C9%BD%B8%BD%2F%C5%EA%B9%C6#i31f7ed2
日本語を含む Powershell スクリプトを UTF-8 で書く

# 結論

ファイルの先頭に

```ps1
$OutputEncoding='utf-8'
```

を付ける。

> 2018/03/12 追記
> すいません、これ、 UTF-8 BOM にしかなりません…。
> 詳しくは [PowerShellでBOM無しUTF8を簡単に扱う、デフォルト設定を簡単に変える方法 - しばたテックブログ](http://blog.shibata.tech/entry/2016/10/02/154329)

## Wi-Fiのパスワードを表示するワンライナー

を以前作っていて、忘れないようにファイルに保存した。
が、これが動かなくて小一時間悩んだ。

```ps1
netsh wlan show profiles | %{ $_.Split(":")[1]} | `
Where-Object{$_ -ne $null -and ( $_  -notmatch "^\s*$" ) } | `
ForEach-Object{$_.trim()} | `
ForEach-Object{ netsh wlan show profile name="$_" key=clear} | `
Where-Object{ $_ -like "*主要なコンテンツ*" -or ( $_ -like "*SSID 名*" ) } 
```

## 文字コード

結論から言うとファイルの文字コードを間違っていた。
Powershell のスクリプトを SJIS や UTF-8 BOM 以外で書くと文字化けしてしまう。
しかし、

* Git のホスティングサービスなどに sjis を上げると面倒
* UTF-8 BOM もなんかやだ、UTF-8 で統一させてくれ



## とりあえず

こうしたら動いた。


```ps1
$OutputEncoding='utf-8'
Write-Host "さようなら文字化け"
```
Swift4でのPackage.swiftエラー #love_swift


[Swift愛好会合宿 2018/1/20-1/21](https://love-swift.connpass.com/event/72804/)で記事書いてます。 #love_swift


[Manual Quickstart](https://docs.vapor.codes/2.0/getting-started/manual/)を参考にVaporでWebサーバー立ててた時の内容です。

```
$ swift build
```

をしたときにエラーになりました。

```
$ swift build
error: manifest parse error(s):
/home/n0bisuke/myswift/webapp/Package.swift:11:10: error: type 'Package.Dependency' has no member 'Package'
        .Package(url: "https://github.com/vapor/vapor.git", majorVersion: 2)
        ~^
```

```
$ swift build
error: manifest parse error(s):
/home/n0bisuke/myswift/webapp/Package.swift:10:10: error: ambiguous reference to member 'package'
        .package(url: "https://github.com/vapor/vapor.git", majorVersion: 2),
         ^      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/n0bisuke/myswift/webapp/Package.swift:10:10: note: overloads for 'package' exist with these partially matching parameter lists: (url: String, from: Version), (url: String, Package.Dependency.Requirement), (url: String, Range<Version>), (url: String, ClosedRange<Version>), (url: String, version: Version), (url: String, branch: String), (url: String, revision: String), (url: String, range: Range<Version>)
        .package(url: "https://github.com/vapor/vapor.git", majorVersion: 2),
         ^
```


他も見てるとSwift3系までのPackage.Swiftでの例が多いので注意が必要そうです。

## 3系と4系のPackage.swift

* 3系

```
// swift-tools-version:3.1

import PackageDescription

let package = Package(
    name: "Hello",
    dependencies: [
        .Package(url: "https://github.com/vapor/vapor.git", majorVersion: 2)
    ]
)
```

* 4系

```
// swift-tools-version:4.0
// The swift-tools-version declares the minimum version of Swift required to build this package.

import PackageDescription

let package = Package(
    name: "webapp",
    dependencies: [
        // Dependencies declare other packages that this package depends on.
        .package(url: "https://github.com/vapor/vapor.git", from: "2.4.0"),
    ],
    targets: [
        // Targets are the basic building blocks of a package. A target can define a module or a test suite.
        // Targets can depend on other targets in this package, and on products in packages which this package depends on.
        .target(
            name: "webapp",
            dependencies: ["Vapor"]),
    ]
)
```

ざっくりと、`.Package`は`.package`に、 `majorVersion`は`from`に変更するところです。

[Swift Package Manager Manifest API Redesign](https://swift.org/blog/swift-package-manager-manifest-api-redesign/)など参考にすると良さそうです。
WordPressで記事内に最初に使われている画像を取得する方法

#記事内で最初に使用されている画像の取得方法

記事の簡単な見出しを作ろうと思った時に記事で使用されている画像を使いたかったのでやり方メモ

- functions.phpに以下の関数を追加

```php
function catch_that_image() {
    global $post, $posts;
    $first_img = '';
    ob_start();
    ob_end_clean();
    $output = preg_match_all('/<img.+src=[\'"]([^\'"]+)[\'"].*>/i', $post->post_content, $matches);
    $first_img = $matches [1] [0];
  
if(empty($first_img)){
        $first_img = "/images/default.jpg";　// 記事に画像がなかった場合表示する
    }
    return $first_img;
}
```

- 表示したい箇所に記載する内容

```php
<img src="<?php echo catch_that_image(); ?>" alt="<?php the_title(); ?>" />
```

これで無事に最初の画像が取得できました！

以上
django-admin-interface を試してみる

「管理者自身がカスタマイズ可能な、最新の応答性の高いフラット管理インタフェース」
[Django Packages](https://djangopackages.org/grids/g/admin-interface/) の管理サイトインターフェース部門で機能比較表で✓が多かったので試してみることに。（人気はイマイチか？）
ドキュメント に従って設定。

# 使用した環境
Windows10
Python 3.5.4
Django 1.11.8
django-admin-interface-0.5.9

# インストール

```
> pip install django-admin-interface
```

# 設定
## settings.py
INSTALLED_APPS に django-admin-interface を追加。
django.contrib.admin の前に追加すること。

```py3
INSTALLED_APPS = [
    # TODO: for admin-interface
    'admin_interface',
    'flat_responsive',  # only if django version < 2.0
    'colorfield',
    'django.contrib.admin',
]
```

## django-admin-interface の DBテーブルを作成

Djangoプロジェクトのディレクトリに移動し django-admin-interface のモデルをマイグレート。

```
> cd project_directory
> python manage.py migrate
```

## collectstaticコマンド実行
今回はローカル環境だけなのでこれは不要。

# 管理サイトを起動
## デフォルトの管理サイト(Home)
比較のため django-admin-interface 適用前のデフォルトの管理サイト

![通常_admin_.png](https://qiita-image-store.s3.amazonaws.com/0/112763/5707959c-6709-32f2-b9e7-997885d0d6f6.png)

## django-admin-interface 適用後の管理サイト(Home)
あ、[Django ドキュメント](https://docs.djangoproject.com/ja/2.0/) これと同じでは？

![admin-interface_admin.png](https://qiita-image-store.s3.amazonaws.com/0/112763/d88f9d04-96d4-457a-999c-68cf610f1cd8.png)

ADMIN INTERFACE の Themes が追加されてるのでクリックしてみる。

![change_theme_1.png](https://qiita-image-store.s3.amazonaws.com/0/112763/c6e76d46-9961-ad73-cd44-9fad9e579918.png)

色を変えられる。

![change_theme_2.png](https://qiita-image-store.s3.amazonaws.com/0/112763/53f0cf6f-71a0-44da-ee9c-648d78d7c786.png)
 
センスがあればカッコ良くなるはず。

# オプションのテーマがある

## Bootstrap theme

以下のコマンド実行。1回目重複エラーがでたけれど、もう１回実行したらOKだった。

```
> cd project_directory
> python manage.py loaddata admin_interface_theme_bootstrap.json
```

白っ。

![change_theme_bootstrap.png](https://qiita-image-store.s3.amazonaws.com/0/112763/423844ab-c3c2-ba34-9f10-d29407854c07.png)

一応他のテーマも。

## Foundation theme

```
> python manage.py loaddata admin_interface_theme_foundation.json
```

![change_theme_Foundation.png](https://qiita-image-store.s3.amazonaws.com/0/112763/284764af-10df-028e-d6ba-60bcd2f0a28e.png)

## U.S. Web Design Standards theme:

```
> python manage.py loaddata admin_interface_theme_uswds.json
```

![change_theme_US.png](https://qiita-image-store.s3.amazonaws.com/0/112763/9958d9c1-47ea-aa23-313a-460ce515e4ba.png)

Themes のレコードをインサートしてるのです。

![change_theme_3.png](https://qiita-image-store.s3.amazonaws.com/0/112763/33611d0d-773f-70b1-da8e-59cdf2782a91.png)

ちなみにスマホから。

<img src="https://qiita-image-store.s3.amazonaws.com/0/112763/642bff86-77d8-b6b7-18bb-3bfc9014c285.png" width=50%>

「管理者自身がカスタマイズ可能な、最新の応答性の高いフラット管理インタフェース」説明の通り。

# ライセンス

MIT （[MITの説明](http://wisdommingle.com/mit-license/)）ということでわりと自由。
Twitter ログインのウェブサイトをスクレイピングする

Twitter などの OAuth 認証でログインするウェブサイトのスクレイピングをするときってどうすればいいんだっけと思ったのでメモ。

1. まず該当ウェブサイトの Twitter 認証用ページへ行く
2. Twitter にリダイレクト
3. 認証後, Callback URL に遷移

この流れの通り実装してあげればよい。

```
# initialize
import requests
from bs4 import BeautifulSoup
session = requests.Session()
```

```
# login with twitter
redirect_from = "https://*****.***/auth/twitter"
res = session.get(redirect_from)
soup = BeautifulSoup(res.text.encode(res.encoding), 'lxml')
oauth_token = soup.find(attrs={'id':'oauth_token'}).get('value')
authenticity_token = soup.find(attrs={'name':'authenticity_token'}).get('value')
redirect_after_login = soup.find(attrs={'name':'redirect_after_login'}).get('value')

twitter_id = "********"
twitter_password = "********"
dataset = {
               'authenticity_token': authenticity_token,
               'redirect_after_login': redirect_after_login,
               'oauth_token': oauth_token,
               'session[username_or_email]': twitter_id,
               'session[password]': twitter_password
          }

twitter_oauth_url = "https://twitter.com/oauth/authorize"
login_res = session.post(twitter_oauth_url, data=dataset)
login_soup = BeautifulSoup(login_res.text.encode(login_res.encoding), 'lxml')
redirect_to = login_soup.select('.maintain-context')[0]['href']
session.get(redirect_to)
```

これで認証された状態が得られます。あとはよしなに。

## References

- [Python 3.x - requestsを使ってTwitterID経由でqiitaにログインしたい(48883)｜teratail](https://teratail.com/questions/48883)
[Swift] イニシャライザ内では willSet/didSet は呼ばれない

タイトルのままです。
少しハマりました。

```swift
class A {

  var prop: Int {
    willSet { print("willSet", prop) }
    didSet { print("didSet", prop) }
  }

  init() {
    self.prop = 0
  }

  convenience init(_ prop: Int) {
    self.init()
    
    // convenienceイニシャライザ内で上書きしてもwillSet/didSetは呼ばれない
    self.prop = prop 
  }
}

let a = A()  // willSet/didSetは呼ばれない
let aa = A(3)  // こちらも呼ばれない
```
SAP Cloud Platform上のセンサーデータをUI5で可視化

SAP Cloud Platform(SAP CP)トライアルシリーズ。
今回もBeeX社の技術ブログを参考にすすめてみます。

[【詳細手順書公開】SAP Cloud Platform上のセンサーデータをUI5で可視化する](https://www.beex-inc.com/blog/sensor-data-visualization-sapcp-iotsvcs/)


#**前提**
こちらの続きとなります。
[SAP Cloud PlatformのIoTサービスでiPhone内蔵センサー情報をストリーミング](https://qiita.com/mahko2/items/a297e8728bf0c2e3a8d4)

DashboardInCloud.zipは[こちら](https://www.dropbox.com/sh/xf3e0j9tkyf56bp/AADFZgfcCjECfq32aaLJ2WxNa?dl=0)からダウンロード

#**手順**

##**IoT Destinationを作成**

![スクリーンショット (547)_LI.jpg](https://qiita-image-store.s3.amazonaws.com/0/22526/b651080a-82e9-c2db-c023-dc2a95ed04b2.jpeg)

メッセージが気になりますが、、
![スクリーンショット (548)_LI.jpg](https://qiita-image-store.s3.amazonaws.com/0/22526/f996bbc4-95fb-c657-4ce1-4c69e02f897b.jpeg)

##**SAP Web IDE**
![スクリーンショット (549)_LI.jpg](https://qiita-image-store.s3.amazonaws.com/0/22526/b0530d88-8925-c3a6-f8b2-077f32c45f82.jpeg)

![スクリーンショット (550)_LI.jpg](https://qiita-image-store.s3.amazonaws.com/0/22526/30e6d332-cd4e-bc7d-60d2-56d2d5f51454.jpeg)

![スクリーンショット (551).png](https://qiita-image-store.s3.amazonaws.com/0/22526/35154736-1919-d962-6a6a-f0b7d691ffeb.png)

![スクリーンショット (552).png](https://qiita-image-store.s3.amazonaws.com/0/22526/8ba87f2f-b8fd-4c93-d47a-4f73c23f83ae.png)

index.html を実行(Run)
![スクリーンショット (553)_LI.jpg](https://qiita-image-store.s3.amazonaws.com/0/22526/c99d3a82-ea82-fa83-ac60-5c729475a075.jpeg)

![スクリーンショット (554)_LI.jpg](https://qiita-image-store.s3.amazonaws.com/0/22526/04e6d261-5e2e-1bb2-a946-0087089324c3.jpeg)

![スクリーンショット (555)_LI.jpg](https://qiita-image-store.s3.amazonaws.com/0/22526/5b1677e6-9629-7aaf-6feb-437dc9333f0e.jpeg)

出力されました(データが同じなのであんまですが)
![スクリーンショット (556).png](https://qiita-image-store.s3.amazonaws.com/0/22526/53da3658-1580-6a2d-99f8-dae1801cb19e.png)

#**まとめ**
簡単な手順でここまでできるとは。
他にもトライアルシリーズを探してみます。
巨大なGitリポジトリのOculus-VR/UnrealEngineからサンプルだけをダウンロードする

# はじめに

Oculusの開発者センターに[Unreal Samples](https://developer.oculus.com/documentation/unreal/latest/concepts/unreal-samples/)のリンクがあるのですが、Gitリポジトリが巨大でダウンロードに時間がかかるのでサンプルのみダウンロードしてみました。

# sparse checkout と shallow clone

詳細は [巨大なリポジトリ を Git で上手く扱う方法](http://japan.blogs.atlassian.com/2014/05/handle-big-repositories-git/) の解説にあり

* 一部のフォルダのみcheckoutするsparse checkout
* 指定した履歴だけをcloneするshallow clone

この2つを組み合わせます。

# UE4のOculusサンプルのみcloneする

次のコマンドで `/Samples/Oculus/` フォルダのみcloneされます。

```
## 不要なfetchしないために、initとremote add originを組合せる
$ git init UnrealEngine
$ cd UnrealEngine
$ git remote add origin https://github.com/Oculus-VR/UnrealEngine.git


## sparse checkoutで/Samples/Oculus/のみcheckoutする
$ git config core.sparsecheckout true
$ echo /Samples/Oculus/ > .git/info/sparse-checkout


## checkoutしたいbranchが4.18なので同じ名前のbranchを作る
$ git checkout -b 4.18


## shallow cloneで履歴を1つだけにする
$ git pull origin 4.18 --depth 1
```

# 参考にしたリンク

* [Unreal Samples](https://developer.oculus.com/documentation/unreal/latest/concepts/unreal-samples/)
* [Oculus-VR/UnrealEngine](https://github.com/Oculus-VR/UnrealEngine)
* [巨大なリポジトリ を Git で上手く扱う方法](http://japan.blogs.atlassian.com/2014/05/handle-big-repositories-git/)
【Django】django-taggitで日本語のタグを検索するとき

#django-taggitで日本語のタグを検索する方法

日本語（が含まれる）のタグを検索する際は、一文字ずつ分割される仕様?となっていますが、
下記のように指定したいタグが一つの場合でもリストとして渡すことで期待した動作を得られます。

from django.shortcuts import get_object_or_404, render, redirect
from django.views.generic.list import ListView
from hoge.models import Article, Blog

###上手く動作する例
```python3:my.view
class Tag(ListView,):
    template_name = 'hogehtml'
    paginate_by = 20

    def get(self, request, *args, **kwargs):
        articles = Article.objects.filter(
            tags__name__in=kwargs['tag_name']).distinct().order_by('published_at').reverse()
        tag_list = kwargs['tag_name'].split()
        self.object_list = articles
        context = self.get_context_data(
            articles=self.object_list, tag=tag_list)
        return self.render_to_response(context)
```

###参考）うまく動作しない例
```python3:my.view
class Tag(ListView,):
    template_name = 'hogehtml'
    paginate_by = 20

    def get(self, request, *args, **kwargs):
        articles = Article.objects.filter(
            tags__name__in=kwargs['tag_name']).distinct().order_by('published_at').reverse()
        self.object_list = articles
        context = self.get_context_data(
            articles=self.object_list, tag=kwargs['tag_name'])
        return self.render_to_response(context)
```
「日本語」で文字列のまま使おうとすると「日」「本」「語」の３つで検索されます。使いづれえ…

###雑記
Djangoさん扱いやすくて便利だと思いきや色々なところでつまづきまくってます。
まあこれはそもそもDjango本体ではないのですが。。。
[個人的メモ]ChainerのLSTMのupdater

# コード

```python:lstm_updater.py

# -*- coding: utf-8 -*-
import chainer
from chainer import training

class LSTMUpdater(training.StandardUpdater):
    def __init__(self, data_iter, optimizer, device=None):
        super(LSTMUpdater, self).__init__(data_iter, optimizer, device=None)
        self.device = device

    def update_core(self):
        data_iter = self.get_iterator('main')
        optimizer = self.get_optimizer('main')

        batch = data_iter.__next__()
        x_batch, y_batch = chainer.dataset.concat_examples(batch, self.device)
        optimizer.target.reset_state()

        optimizer.target.cleargrads()
        loss = optimizer.target(x_batch, y_batch)

        loss.backward()

        loss.unchain_backward()
        optimizer.update()

```

# 読み出し

```python
from updater import LSTMUpdater
from chainer import training

updater = LSTMUpdater(train_iter, optimizer)
trainer = training.Trainer(updater, (epoch, 'epoch'), out='result')

```
Fitbit Ionic の設定画面に "開発者向けメニュー" を出す方法

# これは何？

スマホの Fitbit アプリの [Fitbit Ionic](https://www.fitbit.com/ionic) 設定画面に "開発者向けメニュー" (=Developer Bridge) を表示する方法。

[Getting Started](https://dev.fitbit.com/getting-started/) の 3. Installing に書かれている、  "Before we can install, we need to enable the Developer Bridge on our device." の Developer Bridge です。
Fitbit studio は英語しかないのに、スマホアプリの表示は "開発者向けメニュー" に成っているので分かりにくいです。。。

# 結論

https://community.fitbit.com/t5/SDK-Development/Enabling-Developer-Bridge-in-Mobile-App/m-p/2293178#M1426

1. [Fitbit studio](https://studio.fitbit.com/) からログアウト
2. [Fitbit ダッシュボード](https://www.fitbit.com) からログアウト
3. Fitbit スマホアプリ からログアウト
4. [Fitbit studio](https://studio.fitbit.com/) にログイン
5. Fitbit スマホアプリ にログイン

つまり、一度 Fitbit studio にログインした後に、スマホアプリをログインし直してリロードが必要のようです。

# 蛇足

ちなみに私は、初めて Fitbit studio にログインする時に、何度もエラーが発生しました。
おそらく、 ダッシュボードにログインしっぱなしだったのが原因と思われます。ダッシュボードからログアウトしておいたらエラーがなかったんじゃないかな。
VisualStudioCodeで.vueファイルにESLintを適応させる

忘れないようにメモ
VSCodeで.vueファイルを開いた際に
そのままだとエディタ上でESLintが走ってくれなかったので調べてみました。

settings.jsonに以下を記載

```json:settings.json
{
  "eslint.validate": [
    "javascript",
    {
      "language": "vue",
      "autoFix": true
    }
  ]
}
```
とりあえずvue-cliでセッティングしてみたところなので
不具合が出たりしたら更新します。