OmniAICreator/Qiita-1.07M huggingface dataset:
Draper::CollectionDecoratorにwithとかcontextとか渡せる

# いきなり詳しくはこちら
https://www.rubydoc.info/github/drapergem/draper/Draper/Factory#decorate-instance_method

# withについて
通常のDecoratorではなく、別のDecoratorを使いたい時に指定する。
例えば、ユーザは個々の詳細画面(プロフィール画面とか)持ってて、管理者側からは別の詳細画面を作る場合。

```ruby
class UserDecroator < ApplicationDecorator
  delegate_all

  def show_link(options = nil) 
    options ||= {}
    h.link_to(name, user_path(object), options)
  end
end
class Admin::UserDecorator < ApplicationDecorator
  delegate_all

  def show_link(options = nil)
    options ||= {}
    h.link_to(name, admin_user_path(object), options)
  end
end

@users.decorate.each do |user|
  user.show_link
  # => <a href="/users/1">ほげ</a>
end

@users.decorate(with: Admin::UserDecorator).each do |user|
  user.show_link
  # => <a href="/admin/users/1">ほげ</a>  
end
```

# contextについて
追加でデータを渡したい場合に使うらしい。
こんなユースケースあるか知らんがこんな感じ。

```ruby
class UserDecroator < ApplicationDecorator
  delegate_all

  def show_link(options = {}) 
    options.merge(context[:show_link_options] || {})
    h.link_to(name, user_path(object), options)
  end
end
class Admin::UserDecorator < ApplicationDecorator
  delegate_all

  def show_link(options = {})
    options.merge(context[:show_link_options] || {})
    h.link_to(name, admin_user_path(object), options)
  end
end

@users.decorate(context: { show_link_options: { target: '_blank' } }).each do |user|
  user.show_link
  # => <a target="_blank" href="/users/1">ほげ</a>
end

@users.decorate(with: Admin::UserDecorator, context: { show_link_options: { target: '_blank' } }).each do |user|
  user.show_link
  # => <a target="_blank" href="/admin/users/1">ほげ</a>  
end
```

# 何が嬉しいのか
前まで、user.admin_show_linkみたいな感じで書いてたのをdecoratorクラス分けて書くようになって、よりオブジェクト指向っぽくなった。
なぜもっと早く気がつかなかったし。

# 感想、というか愚痴
これDraper::CollectionDecoratorには使えるけど、ActiveRecordのインスタンスに生えるdecorateメソッドにはcontextしか対応していないのでuser.decorate(with: Admin::UserDecorator)みたいなのできない。Admin::UserDecorator.new(user)って書き方。
欲しいなぁと思いつつdecorator側に無いあたり敢えて外してるんだろうかと勘ぐったり。

あと、decorates_associationで関連モデルもまとめてdecorateできるようになってるけど、これ欲しい場合と欲しく無い場合の切り分けにそれぞれクラス作る必要が出てくる。
この辺ももうちょい柔軟に使えたら便利な気もする(もしくはできない方が良いケースが多い？
ESP32でIPアドレス固定(ESP-IDF)

#はじめに
ESP-IDFのサンプルscan.cでは、DHCPで自動的にローカルIPアドレスが割り当てられた。
これを、自分で指定したいIPアドレスに設定してみる。

scan.cでWi-Fiの初期化とスキャンを行う部分はこうなっている。

```c:scan.c
/* Initialize Wi-Fi as sta and set scan method */
static void wifi_scan(void)
{
    tcpip_adapter_init();
    ESP_ERROR_CHECK(esp_event_loop_init(event_handler, NULL));

    wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
    ESP_ERROR_CHECK(esp_wifi_init(&cfg));
    wifi_config_t wifi_config = {
        .sta = {
            .ssid = DEFAULT_SSID,
            .password = DEFAULT_PWD,
            .scan_method = DEFAULT_SCAN_METHOD,
            .sort_method = DEFAULT_SORT_METHOD,
            .threshold.rssi = DEFAULT_RSSI,
            .threshold.authmode = DEFAULT_AUTHMODE,
        },
    };
    ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));
    ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config));
    ESP_ERROR_CHECK(esp_wifi_start());
}

```

結果

```
〜(略)〜

I (3662) event: sta ip: 192.168.0.14, mask: 255.255.255.0, gw: 192.168.0.1
I (3662) scan: SYSTEM_EVENT_STA_GOT_IP
I (3662) scan: Got IP: 192.168.0.14
```

#設定する
tcpip_adapter_init()の後でIPアドレスを設定する。

```c:scan.c
/* Initialize Wi-Fi as sta and set scan method */
static void wifi_scan(void)
{
    tcpip_adapter_init();

    tcpip_adapter_dhcpc_stop(TCPIP_ADAPTER_IF_STA);

    /* IPアドレスの設定 */
    tcpip_adapter_ip_info_t ipInfo;
    IP4_ADDR(&ipInfo.ip, 192,168,0,20);
    IP4_ADDR(&ipInfo.gw, 192,168,0,1);
    IP4_ADDR(&ipInfo.netmask, 255,255,255,0);
    tcpip_adapter_set_ip_info(TCPIP_ADAPTER_IF_STA, &ipInfo);

    ESP_ERROR_CHECK(esp_event_loop_init(event_handler, NULL));

    /*    〜略〜    */
}
```

#結果
```
〜(略)〜

I (1981) event: sta ip: 192.168.0.20, mask: 255.255.255.0, gw: 192.168.0.1
I (1981) scan: SYSTEM_EVENT_STA_GOT_IP
I (1981) scan: Got IP: 192.168.0.20
```
指定したIPアドレスになった。

#参考
https://esp32.com/viewtopic.php?f=13&t=340&sid=7ab1de64756ac4e83401a652b9aa2108
【React Native】buildが終わらん `running x of y custom shell scripts`

## running 1 of 2 custom shell scripts

上記の表示のまま、ビルドが数分以上進まない。

## 調べた
![image.png](https://qiita-image-store.s3.amazonaws.com/0/103475/05899bad-7ba7-d044-b3f1-a9f718c1513d.png)

https://groups.google.com/forum/#!topic/cocoapods/xq9qqw1979w

いろいろ見ていると関連しているプロセスをkillしろとのコメントが。（url紛失）

該当のプロセスを見つけるのも億劫なので

**再 起 動**

## 再起動により
**解 決**
🔰HTML&CSS Lv4 おさらい編

✅確認しよう

## セレクターの記述

- [ ] クラスと要素の違いに注意してセレクターを書くことができる
- [ ] スペースはどんなときに使うのか説明できる

```html
<部屋 class="101号室 赤い">
  <人間 class="太郎 男"></人間>
</部屋>
```
```css
部屋 人間 {...}
部屋 .太郎 {...}
部屋 .男 {...}
部屋 .太郎.男 {...}
.赤い .男 {...}
部屋 .男 {...}
部屋.赤い .男 {...}
部屋.赤い 人間.男 {...}
```

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

- [ ] HTMLファイルに外部のCSSファイルを読み込むことができる
- [ ] 階層が異なるファイルを読み込むことができる

## ボックスを横並び

- [ ] flexプロパティを使って横並びさせることができる
- [ ] floatプロパティを使って横並びさせることができる
- [ ] displayプロパティを使って横並びさせることができる

参考
- 記事: https://qiita.com/yukinaka/items/c4fcb7f0878702485f70
- 記事: https://www.sejuku.net/blog/52822
- Google: "css 横並び"
メモ

# 見出し h1
## 見出し h2
### 見出し h3
#### 見出し h4
##### 見出し h5
###### 見出し h6

- リスト
- リスト
    - リスト

1. 番号付きリスト
2. 番号付きリスト
    1. 番号付きリスト

- [ ] チェックボックス
- [x] チェックボックス


**text**

```ruby:qiita.rb
puts 'code with syntax'
```

| Left align       |       Right align |    Center align    |
|:-----------------|------------------:|:------------------:|
| This             |              This |        This        |
| column           |            column |       column       |
| will             |              will |        will        |
| be               |                be |         be         |
| left             |             right |       center       |
| aligned          |           aligned |      aligned       |

---

\

~~text~~

:frowning2:

```math
\left( \sum_{k=1}^n a_k b_k \right)^{!!2} \leq
\left( \sum_{k=1}^n a_k^2 \right) \left( \sum_{k=1}^n b_k^2 \right)
```
gitで直近のcommitと2つ以上前のcommitをまとめる

直近のcommitと1つ前のcommitをまとめるのはやったことあったけど、掲題の件をやりたくなったのは初めてなので。

# シチュエーション
1. Aの修正を行ってcommitした
2. Bの修正を行ってcommitした
3. Aの修正ミスに気づいて再修正してcommitした

1と3のcommitをまとめたい！

# git rebaseだけでうまくいく
HEADの3つ前まで、つまり上記の1,2,3のcommitを全て対象にしてrebaseコマンドを叩く

```
git rebase -i HEAD~~~
```

すると

```
pick commit_no_1 commit_message
pick commit_no_2 commit_message
pick commit_no_3 commit_message
```

て感じの画面がエディタで開く。

当たり前なのかもしれないが、この画面でcommitの位置を変更することができる。
つまり、rebaseでcommitの時系列も変更できる。

今回は3を1にまとめたいので、

```
pick commit_no_1 commit_message
pick commit_no_3 commit_message
pick commit_no_2 commit_message
```

こうする。

そして

```
pick commit_no_1 commit_message
fixup commit_no_3 commit_message
pick commit_no_2 commit_message
```

としてやることで、commit_no_3が手前のcommit_no_1にまとめられる。

あとはpushすればいいだけ！
カンタン。
🔰HTML&CSS Lv3 CSS編 ~よく使うプロパティを覚えよう~


💡覚え方: そのプロパティが持つすべての値もセットで使ってみること

## ボックスモデル

- width
- height
- margin
- padding
- border
- position
- left
- right
- top
- bottom
- display

## 横並び系

- float
- flex

## 文字関係

- font-size
- font-weight
- font-family
- line-height
- vertical-align
- color
- letter-spacing
- word-break
- white-space
- word-wrap
- text-align

## その他

- backgrond
- overflow
- visibility
- z-index
- list-style
- outline
- content

## CSS3

- box-shadow
- text-shadow
- transition
- transform
- animation
- opacity
- box-sizing

## 疑似セレクター

- :after
- :before
- :nth-child()
- :nth-of-type()
- :hover
- :active
- :link
- :visited
- :focus
VS CodeのGit History拡張機能でcommit間の差分を見る方法

## 環境

* Visual Studio Code 1.27.2
* Git History 0.4.3 [Git History - Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=donjayamanne.githistory)

## 方法

### History表示

* コマンドパレットから「Git View History (git log)」を実行する

### 比較元を選択

* 比較元コミットの「-○-」ボタンをクリックすると専用のコマンドパレットが開くので「Select this commit...」を実行する

### 比較先を選択

* 同様に比較先コミットの「Compare with...」を実行する

### ファイル比較

* エクスプローラペインに「COMPARE COMMITS」が開いてファイル差分」ツリーが表示されるのでdiffを見たいファイルを選択する。
AtomのHydrogenを仮想環境で動かす

#Hydrogenとは
atom内でpythonを動かせる(ように見える)ものです。
裏ではjupyterが動いています。

#環境
ubuntu(18.04) (windowsでもいけると思います。)
python == 3.6.4
atom == 1.31.1
Hydrogen == 2.6.0

#仮想環境の構築
pythonのvenvを使って仮想環境を作成します。
仮想環境を使わない人は次のkernelのインストールまでとばしてください。
ここではhydrogenという名前にします。
１、`python -m venv venv`で環境を構築
２、`source venv/bin/activate`で有効化(windowsなら`hydrogen\Scripts\activate`)

```
$ python -m venv venv
$ source venv/bin/activate
(venv) $
```

するとカレントディレクトリの前に(hydrogen)が付きます。

#kernelのインストール
３、仮想環境にはいったまま`pip install ipykernel`と`python -m ipykernel install --user`でkernelをインストール

```
(venv) >pip install ipykernel
Successfully installed

(venv) >python -m ipykernel install --user
Installed kernelspec python3 in C:\Users\***\jupyter\kernels\python3
```

一度`pip freeze`でパッケージを確認してみる

```
(hydrovenv) >pip freeze
backcall==0.1.0
colorama==0.3.9
decorator==4.3.0
ipykernel==5.0.0
ipython==7.0.1
ipython-genutils==0.2.0
jedi==0.13.0
jupyter-client==5.2.3
jupyter-core==4.4.0
parso==0.3.1
pickleshare==0.7.5
prompt-toolkit==2.0.5
Pygments==2.2.0
python-dateutil==2.7.3
pyzmq==17.1.2
simplegeneric==0.8.1
six==1.11.0
tornado==5.1.1
traitlets==4.3.2
wcwidth==0.1.7
```
こんな感じになっていればOK

#Hydrogenの設定
atomのパッケージからHydrogenの設定に行きます。
![Screenshot from 2019-12-16 17-28-44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246279/1355e159-c077-6781-d99a-75c393dc59ef.png)
そのなかの`Directory to start kernel in`の項目を`The project directory relative to the file`にします。
こうすることで実行するファイルと同ディレクトリにある仮想環境を自動で読み込んでくれます。

#Hydorogen実行
今回は`test.py`を動かします。
test.pyとvenvは同ディレクトリにあるとします。

```python:test.py
print("hello world!")
```

`ctrl + Enter`で画像のように動けば成功です!
![Screenshot from 2019-12-16 17-41-21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246279/f719d869-e943-35ec-0e08-9f5f35268778.png)
HAProxyでACLを使ってURLごとにサーバを振り分ける

サブディレクトリでWebサーバの振り分けを検証してみます。
HAProxyはCentOS7で構築します。

# HAProxyをインストール
HAProxyをyumでインストールする。

```
# yum install haproxy
```

# サーバを振り分ける条件を追加

HAProxy設定でサーバを振り分ける条件を追加する

```:/etc/haproxy/haproxy.cfg
frontend main
  option forwardfor
  bind 0.0.0.0:80
  acl is_hoge path_beg /hoge
  acl is_fuge path_beg /fuge
  use_backend hoge_backend if is_hoge
  use_backend fuge_backend if is_fuge

backend hoge_backend
  option forwardfor
  reqirep ([^\ ]*)\ /hoge/(.*) \1\ /hoge/\2
  server hoge 192.168.0.101:80 check

backend fuge_backend
  option forwardfor
  reqirep ([^\ ]*)\ /fuge/(.*) \1\ /fuge/\2
  server fuge 192.168.0.102:80 check
```

HAProxyを起動する。

```
# systemctl start haproxy
```

これだけで簡単に振り分けが出来ました！
🔰HTML&CSS Lv1 準備編

## 推奨本

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17342/45253e34-4b1f-5a2c-5e57-189f472f8da8.png)

- 左: どの書籍よりも非常にわかりやすい（2018/06/05現在）
- 右: フロントエンドとしての全体像がわかる

## つけておきたい習慣

非常に基本であり、これが出来ないと怒られる。

- すべて小文字で書く
- すべて半角で書く
- [インデント](https://www.google.co.jp/search?q=%E3%82%A4%E3%83%B3%E3%83%87%E3%83%B3%E3%83%88%E3%81%A8%E3%81%AF&oq=%E3%82%A4%E3%83%B3%E3%83%87%E3%83%B3%E3%83%88%E3%81%A8%E3%81%AF&aqs=chrome..69i57j0j69i61l2j0l2.2640j0j7&sourceid=chrome&ie=UTF-8)は文字を打つ度にきれいにする
- 覚える時は実際にエディタで書きながら覚えると、覚えが早い

## インストールしておくと良いアプリ

- SublimeText3
- LINE: 連絡用
- [Evernote](https://itunes.apple.com/jp/app/evernote-%E3%81%82%E3%82%89%E3%82%86%E3%82%8B%E6%83%85%E5%A0%B1%E3%82%92%E3%81%BE%E3%81%A8%E3%82%81%E3%81%A6%E8%A8%98%E6%86%B6/id406056744?mt=12): メモ用
- Chrome: ブラウザ
- Opera: ブラウザ
- FireFox: ブラウザ
- SourceTree: ソースコードの管理用
- TeamViewer: 画面共有&遠隔操作用

## 1週間ほどで習得しておくべき事項

- [SublimeText3（=エディタ）](https://www.sublimetext.com/3)に慣れてること
- 作ったhtmlファイルをブラウザで開いて確認できること
- Chromeの検証ツールの使い方を調べ、実際に触ってみること
- パスの書き方（絶対パスと相対パスの違い, 親フォルダへの行き方）
- HTML: [超基本のタグ](https://qiita.com/howling_wolf/items/d4054302d4c93d4cc634) を暗記すること（実際に書くことが大切）
- CSS: [超基本プロパティ](https://qiita.com/howling_wolf/items/469043209b517c18fdbb) を暗記すること（実際に書くことが大切）
AWS RDS snapshot からの復旧時に怒られたのでメモ

AWSのRDS(MySQL Community Edition)スナップショットからの復元を
AWSコンソールから実行しようとしたら怒られましたのでメモ。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/223740/a11e040c-ca50-e66d-08fa-bd4c79717e2b.png)

えー...
DBName を null にせよとかいう心無いお言葉。いろいろ試しましたがコンソールからのリストアは
無理っぽいので aws コマンドにてリストアしました。

aws rds restore-db-instance-from-db-snapshot --db-instance-identifier "DB ID名" --db-snapshot-identifier "スナップショット名" --availability-zone "AZ名" --db-subnet-group-name "Subnet名"

同じ目に遭う恐れのある方はawsコマンド実行端末をご用意しておくことをお薦めします。
awsコマンドでsnapshot取った場合のみかと思ったら自動snapshotからのリストアでも発生したので。。。

検索キー : "DBName must be null when Restoring for this Engine"
IonicでAWS Amplifyを使用しようとすると、paho-mqtt.js, but '--allowJs' is not set.で serve できない件

#問題点
https://aws-amplify.github.io/amplify-js/media/ionic_guide
に従い、amplifyを既存のIonicプロジェクトに追加し、
ionic serve
したところ、下記のエラーが発生した。

```
"node_modules/@aws-amplify/pubsub/lib/vendor/paho-mqtt.js', but '--allowJs' is not
 set. "
```

#暫定対応
```
npm i --save-dev @types/paho-mqtt
```
を実行


\node_modules\@aws-amplify\pubsub\lib\Providers\MqttOverWSProvider.d.ts

を開き、1行目


``` :\node_modules\@aws-amplify\pubsub\lib\Providers\MqttOverWSProvider.d.ts
import * as Paho from '../vendor/paho-mqtt';
```

を

``` :\node_modules\@aws-amplify\pubsub\lib\Providers\MqttOverWSProvider.d.ts
import * as Paho from 'paho-mqtt';
```

に変更。


以上です。
WSL の MySQL に A5:SQL Mk-2 から接続する

[ブログから転載](https://1bed.allright.life/?p=2754) の何に使うかは聞かないで欲しい個人メモ

## Ubuntu のセットアップ

* WSL をインストール
  PowerShell を起動して次のコマンドを実行する

```powershell
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
```

* WSL に Ubuntu をインストール
  Microsoft Store から「Linux」で検索して、Ubuntu をインストール
  ※今回は Ubuntu 18.04 LTS を入れた
  [![](https://1bed.allright.life/wp-content/uploads/2018/10/2018-10-02_1-300x220.png)](https://1bed.allright.life/wp-content/uploads/2018/10/2018-10-02_1.png)

* Ubuntu の起動
  Windows メニューから Ubuntu を実行する
  [![](https://1bed.allright.life/wp-content/uploads/2018/10/2018-10-02_2-300x94.png)](https://1bed.allright.life/wp-content/uploads/2018/10/2018-10-02_2.png)
  ※もしここで「0x8007019e」というエラーが出るようなら、WSL のインストールを行う

* Ubuntu のセットアップ
  Ubuntu 起動中に root ユーザーのパスワード登録を求められるので登録する

## MySQL のセットアップ

* MySQL のインストール

```bash
  $ sudo apt install mysql-server mysql-client
```

* MySQL の起動

```bash
  $ sudo service mysql start
```

* MySQL へ接続

```bash
  $ sudo mysql -u root
```

* データベースの作成
  ここではデータベース名 misono を、4 バイト対応 UTF-8 で作成

```sql
  mysql> CREATE DATABASE misono DEFAULT CHARACTER SET utf8mb4;Query
```

* 外部接続ユーザーを作成
  全ての権限を持ち、どこからでもアクセス可のユーザー「hoge」を作成する  

```sql
  mysql> GRANT ALL PRIVILEGES ON *.* TO hoge@"%" IDENTIFIED BY 'hoge' WITH GRANT OPTION;
```

## A5:SQL Mk-2 から WSL MySQL へ接続

* A5:SQL を起動し、「データベースの追加と削除」ウィンドウを開く
  [![](https://1bed.allright.life/wp-content/uploads/2018/10/2018-10-02_3-300x296.png)](https://1bed.allright.life/wp-content/uploads/2018/10/2018-10-02_3.png)

* 「データベースの追加と削除」ウィンドウで [追加] ボタンを押下し、接続するデータベース接続タイプで「MySQL/MariaDB (直接接続)」を選択する
  [![](https://1bed.allright.life/wp-content/uploads/2018/10/2018-10-02_4-220x300.png)](https://1bed.allright.life/wp-content/uploads/2018/10/2018-10-02_4.png)

* 接続する
  下記情報を設定して、[テスト接続] ボタンを押下する
  * ホスト名： localhost  
  * ユーザーID： hoge  
  * パスワード： hoge  
  * データベース： misono  
  [![](https://1bed.allright.life/wp-content/uploads/2018/10/2018-10-02_5-300x216.png)](https://1bed.allright.life/wp-content/uploads/2018/10/2018-10-02_5.png)
Node.js v9.4.0 > qiita_export_all v1.2.0使用時 > Error: Cannot find module 'mime/lite' の対処 > 本来はmimeはインストール済かもしれない

```txt:動作環境
Ubuntu 16.04.3 LTS desktop amd64
tmux 2.1-3build1
Python 2.7.12
Python 3.5.2
Node.js v9.4.0
```

### 症状

@yumetodo さんのqiita_export_allのv1.1.0でこれまでQiitaのバックアップをしてきました。
( [Qiita API v2 を使って自身の全投稿をエクスポートするJavascriptを書いた](https://qiita.com/yumetodo/items/ea9ecb5a30dbd120f955) )

v1.2.0でコメント者名のJSON保存機能が実装されましたので、v1.2.0にして使おうとしました。

```shell
$ npm start

> qiita_export_all@1.2.0 start /home/XXX/QIITA_BACKUP_180111/qiita_export_all
> node bin/index.js

module.js:557
    throw err;
    ^

Error: Cannot find module 'mime/lite'
    at Function.Module._resolveFilename (module.js:555:15)
    at Function.Module._load (module.js:482:25)
    at Module.require (module.js:604:17)
    at require (internal/module.js:11:18)
    at Object.<anonymous> (/home/yasokada/QIITA_BACKUP_180111/qiita_export_all/bin/image-manager.js:6:14)
    at Module._compile (module.js:660:30)
    at Object.Module._extensions..js (module.js:671:10)
    at Module.load (module.js:573:32)
    at tryModuleLoad (module.js:513:12)
    at Function.Module._load (module.js:505:3)
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! qiita_export_all@1.2.0 start: `node bin/index.js`
npm ERR! Exit status 1
npm ERR! 
npm ERR! Failed at the qiita_export_all@1.2.0 start script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
```

### 対処

mime/liteについては以下でインストール情報がありました。
https://stackoverflow.com/questions/32994407/error-cannot-find-module-mime

```shell
$npm install mime
```

`npm start`でv1.2.0のqiita_export_all が動くようになりました。


### 備考
(追記 2018-10-04)

コメント記載のとおり、別Ubuntu16.04LTS環境で再セットアップした場合、mimeは入っていました。

上記環境をどういうセットアップしたのか記録がありません。
WindowsにPyAudioをインストールする際にはバージョンに注意

昨日Windows Server 2016にPythonとPyAudioをインストールしようとしてインストールできずハマりました。
当初はビルド済みのアーカイブを入れてみようとか、PortAudio入れてみようとか考えましたが単純なことだったのでメモがてら残しておきます。

以下のURLを見てください。
https://pypi.org/project/PyAudio/#files

この記事を書いている時点でに対応しているPythonの最新バージョンはcp36です。
しかし昨日、最初にインストールしたPythonは3.7でした。
これが問題でPython3.7が入った状態でpip install pyaudioをするとダウンロードはするもののその後以下のようなエラーが出ます。

```
Collecting pyaudio
  Downloading https://files.pythonhosted.org/packages/ab/42/b4f04721c5c5bfc196ce156b3c768998ef8c0ae3654ed29ea5020c749a6b/PyAudio-0.2.11.tar.gz
～～～中略～～～
    running install
    running build
    running build_py
    creating build
    creating build\lib.win32-3.7
    copying src\pyaudio.py -> build\lib.win32-3.7
    running build_ext
    building '_portaudio' extension
    error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools": http://landinghub.visualstudio.com/visual-cpp-build-tools
```

ちなみに http://landinghub.visualstudio.com/visual-cpp-build-tools は404です。リダイレクトして欲しいものですね。

Microsoft Visual C++ Build Toolsで検索すると、[Cコンパイラのインストール](https://www.python.jp/install/windows/install_vstools2017.html)が見つかり、記載の通りツールをインストールすると今度は以下のエラーになります。

```
Collecting pyaudio
  Using cached https://files.pythonhosted.org/packages/ab/42/b4f04721c5c5bfc196ce156b3c768998ef8c0ae3654ed29ea5020c749a6b/PyAudio-0.2.11.tar.gz
～～～中略～～～
    src/_portaudiomodule.c(29): fatal error C1083: include ファイルを開けません。'portaudio.h':No such file or directory
    error: command 'C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\BuildTools\\VC\\Tools\\MSVC\\14.15.26726\\bin\\HostX86\\x86\\cl.exe' failed with exit status 2
```

なんとかできそうな気もしますが面倒なのでよほど新しいバージョンを使いたいとかでなければPyAudio側に合わせたほうが良いかなと思います。
Python help(pyperclip)

英語がわからないのでGoogle先生に翻訳してもらいました。

# >>> help(pyperclip)
```:help(pyperclip)
pyperclipパッケージに関するヘルプ：

NAME
    pyperclip - Pyperclip

DESCRIPTION
    プレーンテキストのコピー＆ペースト機能を持つ、Python用のクロスプラットフォームのクリップボードモジュールです。
    By Al Sweigart al@inventwithpython.com
    BSD License
    
    使用法:
      import pyperclip
      pyperclip.copy('The text to be copied to the clipboard.')
      spam = pyperclip.paste()
    
      if not pyperclip.is_available():
        print("Copy functionality unavailable!")
    
    Windowsでは、追加のモジュールは必要ありません。
    Macでは、pyobjcモジュールが使用され、pbcopyおよびpbpaste cliコマンドに戻ります。 （これらのコマンドはOS Xに付属する必要があります）
    Linuxでは、パッケージマネージャーを使用してxclipまたはxselをインストールします。たとえば、Debianでは:
        sudo apt-get install xclip
        sudo apt-get install xsel
    
    それ以外の場合、LinuxではgtkまたはPyQt5 / PyQt4モジュールがインストールされている必要があります。
    
    gtkとPyQt4モジュールはPython3では利用できませんが、
    このモジュールはまだPyGObjectでは動作しません。
    
    注意: Python3でgtkを入手する方法があるようです。
        https://askubuntu.com/questions/697397/python3-is-not-supporting-gtk-module
    
    Cygwinは現在サポートされていません。
    
    セキュリティ上の注意: このモジュールは、これらの名前を持つプログラムを実行します。:
        - which
        - where
        - pbcopy
        - pbpaste
        - xclip
        - xsel
        - klipper
        - qdbus
    悪意のあるユーザーは、これらの名前のプログラムの名前を変更したり追加したりすることができます。Pyperclipは、Pythonプロセスの権限によって実行されます。

PACKAGE CONTENTS
    __main__

FUNCTIONS
    copy = lazy_load_stub_copy(text)
        実際のcopy（）関数が後の呼び出しで使用されるように呼び出されたときに、実際のcopy（）関数をロードするcopy（）のスタブ関数。
        
        これにより、ユーザーはdetermin_clipboard（）を持たずにpyperclipをインポートできます。
        自動的に実行され、自動的にクリップボード機構が選択されます。
        
        これは、メモリ重いPyQt4モジュールを選択すると問題になる可能性があります
        ユーザーはすぐにset_clipboard（）を呼び出して
        異なるクリップボードメカニズム。
        
        このスタブ関数が実装する遅延読み込みは、ユーザーに
        set_clipboard（）を呼び出して、別のクリップボードメカニズムを選択します。あるいは、ユーザ
        最初にset_clipboard（）を呼び出さずに単にcopy（）またはpaste（）を呼び出すだけで、
        decide_clipboard（）が呼び出すクリップボードのどの機構でも、
        自動的に選択されます。
    
    determine_clipboard()
        OS /プラットフォームを特定し、それに応じてcopy（）とpaste（）関数を設定します。
    
    paste = lazy_load_stub_paste()
        実際のpaste（）関数が後の呼び出しで使用されるように呼び出されたときに実際のpaste（）関数をロードするpaste（）のスタブ関数。

        これにより、ユーザーは自動的にdetermin_clipboard（）を実行することなくpyperclipをインポートできます。自動的にクリップボードのメカニズムが選択されます。これは、メモリ重いPyQt4モジュールを選択すると問題になる可能性がありますが、ユーザはただちにset_clipboard（）を呼び出して、別のクリップボードメカニズムを使用することになりました。 

        このスタブ関数が実装する遅延読み込みは、set_clipboard（）を呼び出して別のクリップボードメカニズムを選択する機会をユーザに与えます。または、set_clipboard（）を最初に呼び出さずに単にcopy（）またはpaste（）を呼び出すだけであれば、自動的にchoose_clipboard（）が選択するクリップボードメカニズムを使用します。
    
    set_clipboard(clipboard)
        明示的にクリップボードのメカニズムを設定します。 「クリップボードメカニズム」は、copy（）関数とpaste（）関数がコピー/ペースト機能を実装するためにオペレーティングシステムとどのように対話するかを示します。 clipboardパラメータは次のいずれかでなければなりません。
            - pbcopy
            - pbobjc (Mac OS Xのデフォルト)
            - gtk
            - qt
            - xclip
            - xsel
            - klipper
            - windows (Windowsではデフォルト)
            - no (これは、クリップボード機構が見つからないときに設定されるものです)

DATA
    __all__ = ['copy', 'paste', 'set_clipboard', 'determine_clipboard']

VERSION
    1.7.0

FILE
    /home/hoge/.local/lib/python3.6/site-packages/pyperclip/__init__.py
```
FileMakerとGoogleカレンダーの連携

## Google Apps Script を作成する
~~~javascript
function doPost(e){  
  var api_key="filemaker";

  // 上記のapi_keyとparameterのapi_keyが一致していたら
  if (api_key === e.parameter.api_key) {
    //カレンダーを取得
    var calendar = CalendarApp.getCalendarsByName(e.parameter.calendarName)[0];
    
    //イベント作成に必要な値をパラメータから設定
    var title = e.parameter.title;
    var date = new Date(e.parameter.date);
    var option = {
      description: e.parameter.description,
      location: e.parameter.location
    }
    
    //イベントを作成する
    var result = calendar.createAllDayEvent(title,date,option); 
    
    //作成したイベントのidを取得する
    var res = result.getId();
    
    //上記で取得したイベントIDを呼び出し元に返す
    return ContentService.createTextOutput(res).setMimeType(ContentService.MimeType.TEXT);
  }

}
~~~~

##
DesktopのiCloudのシンボリックリンクを作る。

# DesktopのiCloudのシンボリックリンクを作る。
- iCloudに保存されているファイルをターミナルで操作する場合、ディレクトリを掘るのがめんどくさいのでシンボリックリンクを作っておくと便利です。

`ln -s ~/Library/Mobile\ Documents/com~apple~CloudDocs ~/Desktop/iCloud\ Drive`
Rails でf.hidden_formできなかった

Railsで、f.hidden_fieldでパラメタを送信しようとしたらできなかったので、代わりにhtmlで実装した。

`<input type= ~~, name= ~~ > ` でフォームに送信するパラメタを指定することができる。  

- type
    - text : 一行程度の文字
    - number : 数字
    - hidden : 隠れパラメータでvalueに設定した値を送信

- name
    - ハッシュを指定する。
    - name : フォーム内でuser[id] などとすれば、[:user][:id]で参照できる（はず）

- data-method
    - メソッドを指定できる。
    - deleteを指定するときとか特に便利。
Microsoftサポートページが消えてpdfファイルになっている……

https://www.microsoft.com/ja-jp/services/sup_compare.aspx

のページなんですが
本日からPDFに飛ばされるようになりました……

なぜーーーーーー

support_offerings.pdf
```support_offerings.pdf
■問い合わせ先
サポート契約センタ―： TEL : 0120-17-0196 FAX : 0120-74-0196
営業時間: 9:00 ～ 17:30 (土日祝日、弊社指定休業日を除く)
※ソフトウェアサポートのお問い合わせ先のみ窓口が異なります。詳しくはこちらをご確認ください。
```
ってあるから問い合わせてみる？？？
SMTP認証を代替するStreamRelay.NET.exe

[System.Net.Mail.SmtpClient](https://msdn.microsoft.com/ja-jp/library/system.net.mail.smtpclient(v=vs.110).aspx) の認証機能が PLAINぐらいしか対応していなかったので、StreamRelay.NET.exe の Proxy 機能として実装してみた。

---
### -RemoteProxy オプション

-RemoteProxy オプションのスキームに mailauth を新設した。

例えば、`-RemoteProxy mailauth://user:password@mail.example.com/DIGEST-MD5?cNonce=AAAAAAAAAAAA`
として、メール送信経路上に挟めば、Mailクライアントが対応していないSMTP認証を通してメール送信ができる

認証は、StreamRelay.NET.exeが肩代わりするのだから、Mailクライアントは認証無しで起動する必要があるよ。

---
### mailauth スキーム

仕様はこんな感じ
`mailauth://ユーザ名:パスワード@ホスト名:ポート/認証方法?オプション&オプション....`


---
### ユーザ名:パスワード

SMTP認証に使うユーザ名とパスワード

---
### ホスト名:ポート

SMTP の `EHLO ホスト` コマンドのホスト
または、
POPbeforeSMTP の対象POPサーバホスト名とポート
または、
APOPbeforeSMTP の対象POPサーバホスト名とポート

に使う

---
### 認証方法

以下に対応
- PLAIN
- LOGIN
- CRAM-MD5
- DIGEST-MD5
- POP3BS (POP3 before SMTP)
- APOP
- POP3
- SMTP-AUTO

APOP と POP3 は SMTP ではなくて、POP。POPクライアントで認証機能がぶっ壊れている。って事はないと思うので、使う場面はないと思う。
まぁ、POP3 しか対応していないPOPクライアントをこのツールでAPOPに対応させる。って事はできなくなはないけど、その場合、POP認証用のパケットがでちゃうので、(サーバとしてはAPOPで認証したのに、POP認証パケット来たけど、これは何?状態)あまりよろしくないだろう。

SMTP-AUTO は、SMTP認証の DIGEST-MD5/CRAM-MD5/LOGIN/PLAIN から、さらにサーバから提示された方法の中からテキトーな認証方法が選択される

---
### オプション

基本的には、`名前=値&名前=値....` という形式

- Encoding=文字コード (既定はUTF-8)
- CNonce=Base64文字列(固定値) (DIGEST-MD5 で使用する)
- CNonceHex=Base16値(固定値) (DIGEST-MD5 で使用する)
- CNoceRand=num%2cアルゴリズム名 (アルゴリズム名で指定したアルゴリズムを使用してnum長の乱数バイト列)  (DIGEST-MD5 で使用する)
- CNoceRand=min-max%2cアルゴリズム名 (アルゴリズム名で指定したアルゴリズムを使用してmin-max長の乱数バイト列)  (DIGEST-MD5 で使用する)
- NC (既定値は 000000) (DIGEST-MD5 で使用する)
- UserName2nd=文字列 (PLAINでの認証IDというやつ。既定はユーザ名と同じだけと異なる値を指定したい場合)
- URI=文字列 (既定は smtp/local) (DIGEST-MD5 で使用する) この値とレルム値で URI が形成される

---
### StartTLS も兼用する

[STARTTLS ゲートウェイとしての StreamRelay.NET.exe → STARTTLSクライアントにもなる](https://qiita.com/tomoki0sanaki/items/e0331b329013de049b14#starttls%E3%82%AF%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%83%88%E3%81%AB%E3%82%82%E3%81%AA%E3%82%8B)

---
### sendmail.net.exe

高機能かどうか分からんが、mail 専用のコマンドを作った。

[BlatJ.exeのようなsendmailのようなメール送信するCLIコマンド sendmail.net.exe](https://qiita.com/tomoki0sanaki/items/927f3a1f8a36d96dbff3)

---
### 目次へ戻る

[目次というか最初の一歩](http://qiita.com/tomoki0sanaki/items/85f20cbe18378e33cd6f)
iOS12.0にアップデートしたら登録されているBasic認証のパスワードがSafariで自動入力できなくなった

環境はiphone6S iOS12.0です。
2018/10/3にiOS12.0へバージョンを上げたところ、いつもはAPPを立ち上げるとSafariが起動しBasic認証を入力する鍵のマークが出てくるのですが、こちらが無くなっていました。

![Image from iOS_0.png](https://qiita-image-store.s3.amazonaws.com/0/263462/f29033d2-78d9-7d95-6260-0ed1f87f8190.png)

設定のパスワードとアカウントのところを確認するとパスワードの自動入力がoffになっていましたので、onにしてみます。

![Image from iOS_4.png](https://qiita-image-store.s3.amazonaws.com/0/263462/582bc75b-de09-0a0e-1b67-caabc9990f34.png)

再度APPよりSafariが起動されると今度は自動入力のための鍵マークが表示されていました。

![Image from iOS_2.png](https://qiita-image-store.s3.amazonaws.com/0/263462/35ec3047-41b9-e4df-df01-12e83ddea59c.png)

メジャーバージョンアップなので他にも設定項目がいろいろ変わっているかもしれませんね。
ストレス測定ツール作成～セットアップ編～(BH1792GLC・ローム社)


* 目的
  * 2017年より、ローム社の脈拍センサ(BH1790GLC)がバージョンアップし、各種バイタルセンシング(血管年齢、ストレス測定など)に対応したとのことで、機能を試す。


* 準備
  * Arduino uno
  * SensorShield-EVK-001
  *  脈波センサモジュール BH1792GLC　https://www.rohm.co.jp/products/sensors-mems/optical-sensor-for-heart-rate-monitor/bh1792glc-product

  * Arduino IDE
  * USB2.0 A-Bケーブル　オス

* 嵌った個所
  * ハードのセットアップ(後述)

* 今後の課題
  * センサから得た測定結果より、ストレス値を抽出する
 
##流れ

先ず、公式の使い方マニュアル参考に、サンプルプログラムをArduino uno に書き込む。
https://www.rohm.co.jp/sensor-shield-support/pulse-wave-sensor2

* ハードのセットアップ

・VDD(ハイ)を5V
・抵抗(ロー)の設定=橙色の逆側で、黒い被膜を2か所INT 1に差し替える
・センサモジュールの端子を3Vに接続

**センサモジュールの緑色光が点けば、測定準備完了**
![IMG_0142.JPG](https://qiita-image-store.s3.amazonaws.com/0/198177/d68dd4c9-d510-25c5-de9b-d82679dc730f.jpeg)

センサモジュールに指を載せると、青色の破線がうごき、脈波の測定がはじまる。
![IMG_0143.JPG](https://qiita-image-store.s3.amazonaws.com/0/198177/cdddb9f2-c79c-ac06-2580-6f84432df319.jpeg)


測定結果を接続のPCに保存するため、TeraTermをシリアルで接続し、ログを出力する
※文字化けしたが、以下を参考に解消
https://qiita.com/miyabisun/items/73bb2e0b75c30fba9f3c
SQLServer: レプリケーションに関するトラブルシューティング

実際に経験した、SQLServerのレプリケーションに関するトラブルシューティングを1例紹介したいと思います。
突然レプリケーションが止まった、という場合にもし同様の状況であれば、ここで紹介している手順によって解消できる可能性があります。
（自己責任でお願いします）

# レプリケーション概要
レプリの種類：トランザクションレプリケーション
push/pull： push

# トラブル概要
突然、ログリーダーエージェントがハング。
これによりレプリケーションの遅延が発生。

mslogreader_historyテーブルで↓の警告メッセージを検知したことにより判明。（検知の仕組みを作っていました）
※いくつかのテーブルからのメッセージを検知していたので、もしかしたら違うテーブルかも、、

```
レプリケーションエージェントでは、進捗状況メッセージが10分間ログに記録されていません。
この現象は、エージェントの応答が止まったか、システムの使用率が高いことを示している場合があります。
レコードがレプリケーション先にレプリケートされていること、およびサブスクライバー、パブリッシャー、ディストリビューターへの接続がアクティブなままであることを確認してください。
```

ログリーダーまわりのプロセスの実行状況を確認するために、下記クエリを実行

```sql
select * from sys.dm_exec_sessions
where [program_name] like '%logreader%'
```
すると、2つのプロセスが取得できた。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/148310/497ee4c1-d445-9c6d-ccaf-db44723871db.png)

ログリーダーが二つ？と混乱したけど、こちらは正常な状態らしい。
パブリッシャーに対するプロセスとディストリビューターに対するプロセスとがあって、いわゆるreader-threadとwriter-threadってやつだと思う。

実際、一つのプロセスのdatabase_idはパブリッシャのDBIDを指していて、もう一つのプロセスのdatabase_idはディストリビューションDBのDBIDを指していた。

そして、DBIDがディストリビューションDBであるログリーダープロセスは、open_transaction_countが1であった。また、sys.dm_exec_requestsには該当のIDのレコードが存在しないことから、writer-threadがトランザクションを開きっぱなしで終了してしまったような挙動にみえる。

数十分間ハングしているような挙動にみえたため、手動にてwriter-threadと思われるセッション（database_idがディストリビューションDBとなっているプロセス）をKILLすることで、ログリーダーが正常に稼働し始めて、レプリケーション遅延が解消された。

加えて、必要に応じて ログリーダーAgentジョブの再起動も行うといいかもしれません。

なかなか発生しない事象かと思いますが、万一同様の事象が発生した方への役にたてれば嬉しいです。
AndroidXへの移行がすぐできたのでまとめ

# はじめに
## AndroidX
AndroidXとは今までのSupport Libraryを代替するAndroid拡張機能ライブラリのオープンソースプロジェクトです。
[Google I/O 2018の発表](https://youtu.be/jdKUm8tGogw?t=4m14s)を見てみると"AndroidX"の読み方は"アンドロイドエックス"です。
注意点として、iPhone X (アイフォーン テン)のような新機種の名称ではありません。
テンでもありません。
また、[Android-x86](http://www.android-x86.org/)プロジェクトとは別物です。

細かい箇所ですが書くときは[Android KTX](https://developer.android.com/kotlin/ktx?hl=ja)のようなスペースはいれないようです。
(Android KTXはAndroidXの一部となるようです)


## 公式記事

公式ドキュメントは以下です。

AndroidX Overview
https://developer.android.com/jetpack/androidx/

Migrating to AndroidX
https://developer.android.com/jetpack/androidx/migrate

導入に関する公式ブログ記事は以下です。

Hello World, AndroidX
https://android-developers.googleblog.com/2018/05/hello-world-androidx.html
AndroidX の紹介 (上記の日本語版)
https://developers-jp.googleblog.com/2018/05/hello-world-androidx.html


# 移行してみた

2018年9月24日に[Android Studio 3.2](https://developer.android.com/studio/)が公開されました。
Android Studio 3.2にはAndroidX移行機能があるのでこちらを使用します。

前提としてSDKのVersionは28以上にする必要があります。

``` app.gradle
:
compileSdkVersion 28
```

Jetpackを使用していないプロジェクトで移行したのですがBeforeのapp.gradleは以下のような状態です。

[Before]
<img width="617" alt="スクリーンショット 2018-10-02 10.08.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/19692/80441e71-0403-87f9-05cd-b49a462f306b.png">

## ボタン一発変換
`Refactor > Migrate to AndroidX` で一発変換されました。
<img width="943" alt="スクリーンショット 2018-10-02 10.11.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/19692/3e9c62fa-2596-ea38-ead3-3b144c17cc05.png">

以下、変換後のapp.gradleです。support-v4などはlegacy扱いとなります。

[After]
<img width="626" alt="スクリーンショット 2018-10-02 10.15.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/19692/16beb091-863e-5ece-ed26-569f46ad6dc0.png">



また、`gradle.properties` の更新も行ってくれました。

```
android.enableJetifier=true
android.useAndroidX=true
```

<img width="618" alt="スクリーンショット 2018-10-02 10.17.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/19692/207ec404-2cad-cbd9-6098-45c5deafd1fd.png">


## 移行されなかったところ

移行後にテストしたところ、
excludeなどでサポートライブラリを指定している箇所は手作業で更新する必要がありました。
公式ドキュメントMigrating to AndroidXにてライブラリを照らし合わせて対応。

<img width="627" alt="スクリーンショット 2018-10-02 10.47.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/19692/05034b2e-7b73-9744-c2d4-f948e6da31e6.png">



# 感想

移行自体はすぐ完了し、動作も現状問題なさげです。
Material Designだけandroidxパッケージではなくcom.google.materialなので手動で置換する場合は注意です。

|旧|新|
|:--|:--|
|android.support.**|androidx.@|
|android.databinding.**|androidx.databinding.@|
|android.design.**|com.google.android.material.@|
|android.support.test.**|（将来のリリース）androidx.test.@|

とりあえずAndroidXの読み方だけ覚えると良さげ。
macosで、公衆Wi-Fiに接続する「あの画面(Captive portal)」を出さなくする方法

```
sudo defaults write /Library/Preferences/SystemConfiguration/com.apple.captive.control Active -bool false
```

## 元に戻す方法

```
sudo defaults write /Library/Preferences/SystemConfiguration/com.apple.captive.control Active -boolean true
```
iPhoneでMarkdown書きたい欲求に答えてくれそうなアプリを見つけた

## 概要

定期的にスマホでMarkdown書きたい欲求が湧いてきて、アプリ探しますよね？
そんなときに見つけた「# Type」というアプリのご紹介です。

AppStoreの「おすすめのアプリ」に上がってました。欲求を読まれてる。怖い

<img width="375" alt="0437AEBC-34C4-47C8-B36E-E1ADEC7D7A30.png" src="https://qiita-image-store.s3.amazonaws.com/0/48549/951bbdde-cc34-50b7-cae5-65a1cdf1a6cd.png">

Typeのダウンロードはこちらから^^
https://itunes.apple.com/jp/app/type/id1214613873?mt=8

## 気に入った点

### Markdownで書ける

大前提です。キーボード上にショートカットキーがあって、いちいちキーボード切り替えしなくていい感じです。
けど、癖でキーボード切り替えてしまいます///

<img width="375" alt="8C81C375-A497-4EF3-AE9E-BDB75BEAD4D5.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/48549/4303ef4d-dc13-d7cd-8664-62d17e76de2e.jpeg">

### プレビューがすぐに確認できる

右にスワイプしたらすぐにプレビュー表示に切り替わって便利です。
わかりやすいように動画を撮って添付しようとしましたが、そこまでは対応していませんでした。

Twitter経由で動画共有してみる
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr"># TypeってiPhoneのMarkdownエディタがいい感じぽいので、Qiita記事をお試しで書いてる <a href="https://t.co/dEZU19Urj1">pic.twitter.com/dEZU19Urj1</a></p>&mdash; 甲斐甲@GCPとUnity勉強中 (@k_aik_ou) <a href="https://twitter.com/k_aik_ou/status/1047084805043580929?ref_src=twsrc%5Etfw">October 2, 2018</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

※Twitterサイトの「ツイートを埋め込む」機能からHTMLを貼り付けて、Previewモードに切り替えると、アプリがクラッシュしたので、ご注意ください^^

### エンジニア向けのエクスポート先がある

エクスポート先には

- Qiita
- GitHub(Gist、Issue)

があって、これでもう十分です。

Qiitaでプライベート投稿？
って思って試したら限定共有投稿に保存されました。


<img width="375" alt="1C2F4D1A-DCAA-4CB5-A007-F9F51EBFD1CD.png" src="https://qiita-image-store.s3.amazonaws.com/0/48549/a7d71c5d-d64e-e5da-1297-2d177e169822.png">
<img width="375" alt="7D2B5BD8-E1DF-4AFC-B684-73A127323FE7.png" src="https://qiita-image-store.s3.amazonaws.com/0/48549/372099d7-d381-8e9a-3a2d-40872fbc82b1.png">

※アプリで画像追加して、Qiitaに投稿してみたら、うまく画像表示されませんでした。
※Gistも同様でした。
※仕方ないので、Qiitaで編集しましたが、iPhoneで編集するの面倒でしたorz

## まとめ

他にも機能はありますが、個人的には紹介した機能があれば、必要要件が揃っていて、十分な感じでした。

- 勉強会に参加したけど、PC開けない！辛い！
- ふとアイデアを思いついたけど、Markdownじゃなきゃ嫌だ！
- Markdownで十分なのだけれど、投稿するならプレビューみたい！
- エモい話を今すぐにQiitaにあげたい！

などなど、非常にエンジニアの要求に応えるアプリじゃないでしょうか！

Typeのダウンロードはこちらから^^
https://itunes.apple.com/jp/app/type/id1214613873?mt=8


## 追記

ググってたらアプリ開発された方もやっぱりエンジニアさんでした^^

TypeというiOS用のMarkdownエディタを作った
https://qiita.com/fromkk/items/43d669b8bd5063b11702
Railsでドメインごとにroutesを設定する

サブドメインで切り替えるのはあるけどドメインごとに切り替える情報はあまりなかったのでメモ。

環境: Rails5.2.0, ruby2.5.1

``` ruby:routes.rb
Rails.application.routes.draw do
  constraints -> (req) { req.host == ENV['MAIN_HOST'] } do
    root 'dashboard#index'
    devise_for :users, path: 'users'

    resources :hoges
  end

  constraints -> (req) { req.host == ENV['ADMIN_HOST'] } do
    devise_for :admin_users, path: 'admin_users'

    mount RailsAdmin::Engine => '/rails_admin', as: 'rails_admin'

    scope module: 'admin_users' do
      root 'dashboard#index'
      resource :fugas
    end

  end

  mount LetterOpenerWeb::Engine, at: '/letter_opener' if Rails.env.development?
end
```

constraintsでHOSTを判定して使えるルートを切り替えています。
管理用のドメイン(ENV['ADMIN_HOST'])のコントローラーは`controllers/admin_users`フォルダの配下に全てツッコミますが、url上は`/admin_users`を見せなくても良いように、moduleを指定しています。

なので、dashboard_controllerは`controllers/dashboard_controllerは.rb`と`controllers/admin_users/dashboard_controllerは.rb`の2つを用意しているような形です。
php-master-changes 2018-10-02

今日は内部クラスの静的プロパティの扱い修正、run_time_cache をヒープで持つ部分や内部フラグのリファクタ、ext/mbstringのバグ修正があった！

# 2018-10-02
## dstogov: Allocate only necessary space for static properties of internal classes in ZTS mode.
- https://github.com/php/php-src/commit/a2e83346134c7a197492cb520ad440e0e1aff463
- ZTS 版で内部クラスの静的プロパティについて、必要な量のメモリのみ確保するよう修正

## dstogov: Rename ZEND_ACC_NO_RT_ARENA into ZEND_ACC_HEAP_RT_CACHE and use it for pseudo-main op_arrays.
- https://github.com/php/php-src/commit/26065662692f2ce7d1b7ebd1ab6c1c96d177a067
- ZEND_ACC_NO_RT_ARENA を ZEND_ACC_HEAP_RT_CACHE と改名し、クロージャだけでなくトップレベル main の擬似 op_array でも使うようリファクタ
- op_array は [run_time_cache](https://wiki.php.net/rfc/runtimecache) を持つ
- 基本的に同じクロージャーは同じ [Arena](https://phpinternals.net/categories/zend_arena) の領域を run_time_cache に使うが、`\Closure::call()` などでスコープを変えて使う際には Arena ではなくヒープへ別途確保、という[修正](https://github.com/php/php-src/commit/3c288b12b45763b3215ee0463e51f8be9d643425)が2015年にあって、この際ヒープへ run_time_cache が確保されてることを示すよう導入されたのが ZEND_ACC_NO_RT_ARENA

## dstogov: Make ZEND_ACC_IMMUTABLE and ZEND_ACC_HAS_TYPE_HINTS to be common (for functions and classes)
- https://github.com/php/php-src/commit/f52158681422c15a33d43f31b8dad5d3a5d80bc7
- ZEND_ACC_IMMUTABLE と ZEND_ACC_HAS_TYPE_HINTS のフラグを関数とクラスで共通のフラグとしてヘッダでの定義位置で明示

## dstogov: typo
- https://github.com/php/php-src/commit/9bfb97241367445234675dc103bc0c93fcfc55dc
- ↑の typo を修正

## nikic: Don't fall back to vtbl_pass if no matching vtbl found
- https://github.com/php/php-src/commit/9cfd8f43c2a6386bcf1567a5c0de47dcb182b109
- [7.3~]
- ext/mbstring で vtbl_pass へのフォールバックを廃止
- mbstring の文字コード変換は、 [mbfl_convert_vtbl](https://github.com/php/php-src/blob/49a4e695845bf55e059e7f88e54b1111fe284223/ext/mbstring/libmbfl/mbfl/mbfl_encoding.h#L132) という、各エンコーディング間の変換処理を持つ C 言語構造体というか関数テーブルというか C 言語でオブジェクト指向！みたいなノリのブツがあり、入力と出力のエンコーディングに応じ適切なものを使う
- vtbl_pass は素通し用で、適切な変換方法が見つからない場合に使われていたが、これをやめてエラーとするよう修正、かな
- 変換元と変換先が同じ場合には vtbl_pass が使われる
- これ BC break ではないのだろうか？という素朴な疑問
- ↓のバグ修正の一環で「わかりづらいわ！」となって直したっぽいかな

## nikic: Fixed bug [#76958](https://bugs.php.net/bug.php?id=76958)
- https://github.com/php/php-src/commit/26f82a77061b7389c4507a2277643139339b430b
- [7.3~]
- ext/mbstring で UTF7-IMAP を変換元/変換先とする [mb_convert_encoding()](http://php.net/manual/ja/function.mb-convert-encoding.php) が動かない問題の修正
- 当初適切な vtbl を引く処理は[配列に一通りの vtbl を詰め](https://github.com/php/php-src/blob/fb9bf5b64b6c09b9d93bbd1dadd64884e0af66f3/ext/mbstring/libmbfl/mbfl/mbfl_convert.c#L113)て[線形探索する](https://github.com/php/php-src/blob/fb9bf5b64b6c09b9d93bbd1dadd64884e0af66f3/ext/mbstring/libmbfl/mbfl/mbfl_convert.c#L606)、という処理だったが、後に[テーブルは分割され](https://github.com/php/php-src/commit/e20fbd43bad65d10af1e0d648f7bfa0c40baa893#diff-67768ed771c00ea5120e30955aed2ed7)、更に vtbl が [mbfl_encoding へ埋め込み](https://github.com/php/php-src/commit/633a471ba0c9acc6d1cca04880c1e69e7b2dc18e#diff-67768ed771c00ea5120e30955aed2ed7)になって、デカい表を使わなくなった
- が、このタイミングで vtbl_utf7imap_wchar への埋め込みが漏れていたために起きた問題
GETでIDを渡す方法

# GETでIDを渡す方法

今回使ったコード
商品一覧ページから商品詳細ページへGETでIDを取得してページへ移動

```ruby:qiita.rb

//SELECT文
<?php $stmt=$db->query("SELECT * FROM item WHERE id=".$_GET["id"]); ?>

//リンク先へ移動するaタグ
<?php echo "<a href='shop_item_info2.php?id=" . $row ['id'] . "'>編集</a>" ?>

```

##　注意

$stmt=$db->queryの書き方はセキュリティ上良くないのでprepareを使うほうがいいということ。
Kubernetes勉強 その2（Pod）


引き続き「Kubernetes完全ガイド」読んでお勉強。

## Pod と ReplicaSet と Deployment

`Pod` はリソースの最小単位であり、`ReplicaSet` は `Pod` を管理するリソース。 `ReplicaSet` は `Pod` が停止すると自動的に再起動したりする。
`Deployment` は、 `Pod` に含まれるコンテナをバージョンアップする際に、古いコンテナを徐々に減らし、新しいコンテナを徐々に増やすなどの管理をする。

### Pod

* Podはリソースの最小単位。
* Podは1つ以上のコンテナから構成される（2つや3つの場合もある）。
* 同じPodに含まれる複数のコンテナはIPアドレスを共有している。
	* 従って、同じPodに含まれるコンテナ同士で同じポート番号を使用することはできない。

#### Podの作成

こんな感じで設定ファイルを用意する。

```yaml:sample-pod.yml
apiVersion: v1
kind: Pod
metadata:
  name: sample-pod
spec:
  containers:
    - name: nginx-container
      image: nginx:1.12
```

起動する。

```
$ kubectl apply -f sample-pod.yml

pod "sample-pod" created
```

状態を確認

```
$ kubectl get pods

NAME         READY     STATUS    RESTARTS   AGE
sample-pod   1/1       Running   0          8s
```

Podを削除する

```
$ kubectl delete -f sample-pod.yml

pod "sample-pod" deleted
```

#### 複数のコンテナを内包するPodの作成

設定ファイルを作る

```yaml:sample-2pod.yml
piVersion: v1
kind: Pod
metadata:
  name: sample-2pod
spec:
  containers:
    - name: nginx-container
      image: nginx:1.12
    - name: redis-container
      image: redis:3.2
```

起動する。

```
$ kubectl apply -f sample-2pod.yml 

pod "sample-2pod" created
```

状態を確認。２つ走ってる。

```
$ kubectl get pods

NAME          READY     STATUS    RESTARTS   AGE
sample-2pod   2/2       Running   0          1m
```

停止する。

```
$ kubectl delete -f sample-2pod.yml 

pod "sample-2pod" deleted
```

複数のコンテナを起動する場合、同じポートを使うコンテナを複数起動することはできない。

コンテナにログインしてコマンド実行

```
$ kubectl exec -it sample-2pod /bin/bash

Defaulting container name to nginx-container.
Use 'kubectl describe pod/sample-2pod -n default' to see all of the containers in this pod.

root@sample-2pod:/# ls
bin  boot  dev	etc  home  lib	lib64  media  mnt  opt	proc  root  run  sbin  srv  sys  tmp  usr  var

root@sample-2pod:/# cd home/
root@sample-2pod:/home# ls

root@sample-2pod:/home# ls /usr/
bin  games  include  lib  local  sbin  share  src
```

実際には擬似端末を生成しており、ログインしているわけではないですがSSHでログインしているように操作できるらしい。
みんな大好きQiitaのバックアップツールを作ったので公開

## 1. はじめに

Qiitaで記事あげているのですが、誤って消してしまったりしたら恐いなーと思い、Python3を使ってバックアップツールを作ってみました。

【2020/02/21 追記】
Pythonを使ってこんなの作ってみました！
[**【LINE BOT + COTOHA API】君の文章は相手を不快にしていないか？COTOHA先生にチェックしてもらおうぜ**](https://qiita.com/i-tanaka730/items/a32b3ce7ca8c7edc9634)

## 2. 変更履歴

- [2018/10/12] HTML形式で出力できるように変更しました。

## 3. GitHub

[**qiita_backupper**](https://github.com/i-tanaka730/qiita_backupper)

## 4. デモ
![qiita_backupper.gif](https://qiita-image-store.s3.amazonaws.com/0/247638/62ea8047-a33f-da47-c801-d73bd6e577bd.gif)

## 5. 今後やりたいこと

- 限定公開記事のバックアップ
doc2vecのサンプル



http://toriaezu-engineer.hatenablog.com/entry/2016/09/12/214618
を参考にしたところ、gensimのマイナチェンジがあったらしく、
警告が色々出たので、調整版を載せる。

gensimは2018/10/03に

```
pip3 install --user gensim
```
でインストールした、0.14。



```
from gensim import models

def sample():
	sentence = models.doc2vec.TaggedDocument(words=[u'犬', u'今日', u'吠えた'], tags=["SENT_0"])
	sentence1 = models.doc2vec.TaggedDocument(words=[u'猫', u'明日', u'吠えた'], tags=["SENT_1"])
	sentence2 = models.doc2vec.TaggedDocument(words=[u'今', u'猫', u'魚'], tags=["SENT_2"])
	sentence3 = models.doc2vec.TaggedDocument(words=[u'魚', u'泳ぐ', u'海'], tags=["SENT_3"])

	sentences = [sentence, sentence1, sentence2, sentence3]

	model = models.Doc2Vec(sentences, dm=0, vector_size=300, window=15, alpha=.025, min_alpha=.025, min_count=1, sample=1e-6)
	
	print('\n訓練開始')
	for epoch in range(20):
		print('Epoch: {}'.format(epoch + 1))
		model.train(sentences, epochs=model.iter, total_examples=model.corpus_count)
		model.alpha -= (0.025 - 0.0001) / 19
		model.min_alpha = model.alpha


	model.save("my_model.doc2vec")
	model_loaded = models.Doc2Vec.load('my_model.doc2vec')

	# ある文書に似ている文書を表示
	print ("SENT_0")
	print (model.docvecs.most_similar(["SENT_0"]) )
	print ("SENT_3")
	print (model.docvecs.most_similar(["SENT_3"]) )
	print ("SENT_1")
	print (model_loaded.docvecs.most_similar(["SENT_1"]) )

	# ある単語に類似した単語を取得
	print (model.similar_by_word(u"魚"))

if __name__ == '__main__':
	sample()
```


具体的には、models.Doc2Vecとmodel.trainの引数を調整。
Arduino・ラズパイでハマったところ

# 環境
Arduino・ラズパイをI2Cを使用して連携 + α
Arduino側 : PSDセンサ、超音波センサ、[ラインセンサ](http://daisen-netstore.com/shopdetail/000000000090/Robot-option/page3/brandname/)
ラズパイ側 : ダイセンコンパスセンサ、ダイセン4chモーターボート、9軸センサ、[PRLidar A2](https://www.robotshop.com/jp/ja/rplidar-a2m8-360-laser-scanner.html)、ラズパイ用カメラ

# Arduino

## I2C

### I2Cの刺すピンを間違えていた
正解は下の通り
Arduino   I2C先のデバイス
GND ------　GND
SCL　---|---　SCL
　　　抵抗
5V　 ---|---　5V
　　　抵抗
SDA　---|---　SDA
抵抗は、1kΩ程度でOK

### Wire.begin()を書き忘れていた
Wire.begin()をしていないのに、Wire.transmission()をしていたら　できるわけがない。

## その他

### 突如Arduinoにプログラムをダウンロードできなくなった
原因は、アナログの値を返すPSDセンサを、デジタルピンのほうに刺していたから



# Raspberrypi

## 突然画面が真っ暗になり何もできなくなった
SDカードを初期化して対応

## cannot import name ~
githubからソースコードを落としてくる

## souce : コマンドが見つかりません
pyenvをインストール[このサイト](https://qiita.com/ysdyt/items/f232e6481b44f92276cf)に基づいてしようとした。
が、
`$ pyenv install --list`
が動かず...

詳しく調べてみると、[このサイト](https://qiita.com/h-sakano/items/cb8df027b81acd78bd77)に出会った。
そこでは、`$ sudo source ~/.bash_profile`を、設定を反映するために実行しないといけない、と書いてあった。
帰ってきた答えは、
'sudo : source: コマンドが見つかりません'

色々調べていくうちに、
`$ sudo vi ~/.bash_profile`
として、環境変数を書き込むのではなく、
`$ sudo vi ~/.bashrc`
に書き込まないといけなかった。
RxJS6のカスタムオペレータを作るのが簡単なので、redux-observableで利用する

RxJS6でpipeオペレータが使えるようになったことで、カスタムオペレータを作るのも簡易になった。

https://github.com/ReactiveX/rxjs/blob/master/doc/pipeable-operators.md#build-your-own-operators-easily

上記にある通り、例えば既存のオペレータをまとめる程度であればこのぐらい簡単にできると例示されている。

```ts
/**
 * You can also use an existing operator like so
 */
const takeEveryNthSimple = (n: number) => <T>(source: Observable<T>) =>
  source.pipe(filter((value, index) => index % n === 0 ))
```

## redux-observableで使ってみる

例えばよく使う`tap`でconsole.logに表示して`ignoreElements`で消すというのはよくやるデバッグの手段だろう

```ts
export const pingEpic = (action$) =>
  action$.pipe(
    ofType("PING"),
    tap(console.log),
    ignoreElements()
  )
```

今回はこれをカスタムオペレータとして置き換えてみるとこうなる

```ts
const debug = () => <T>(source: Observable<T>) =>
  source.pipe(
    tap(console.log),
    ignoreElements()
  )

export const pingEpic = (action$) =>
  action$.pipe(
    ofType("PING"),
    debug()
  )

```


オペレータは`Observable`を受け取って`Observable`を返せば良い。例示に併せて、ここでは関数化している。debugが関数を返す関数になっているので、例えばtapに渡す値を変更できるようにしたいならこういう具合だろう

```ts
const debug = (tapFn = console.log) => <T>(source: Observable<T>) =>
  source.pipe(
    tap(tapFn),
    ignoreElements()
  )

export const pingEpic = (action$) =>
  action$.pipe(
    ofType("PING"),
    debug(item => console.log("This is DEBUG => ", item))
  )
```
【python】絶対パスに~(チルダ)は使わない【tensorflow】

# はじめに
tensorflowにて，絶対パスでモデルを指定してrestoreしようとしたらエラーが出て詰まったので自分用メモ．
結論から書くと，**ホームディレクトリを~(チルダ)で指そうとしていた**のがマズかった．

# 環境
OS: Ubuntu 14.04.4 LTS
python: Ver 2.7.6
tensorflow: Ver 1.2.1

# (解決)os.path.expanduserでホームディレクトリを取得

os.path.expanduser()でカレントユーザのホームディレクトリを取得できる．絶対パス指定の時はとりあえずこれを使えば間違いなさそう．

```
import os.path

print(os.path.expanduser('~'))  
# => /Users/ユーザー名
```
ちなみに自分はその場しのぎで相対パスで指定した．

# 参考URL

https://www.lifewithpython.com/2015/10/python-get-current-user-home-directory-path.html
【Laravel】Eloquentのスコープでcould not be converted to stringが出たときの話

こんな感じのソースを書いていた時のこと。

##やりたいこと
・GroupとGroupUserというモデルがあり、1対多の関係
・ログイン中のユーザが所属してるグループを取得したい

##コード
```Group.php
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Group extends Model
{
    /**
     * グループに所属するユーザのリレーション定義（1対多）
     *
     * @return \App\GroupUser
     */
    public function groupUsers()
    {
        return $this->hasMany('\App\GroupUser');
    }
    
    /**
     * ユーザが所属するグループを取得するスコープ
     * 
     * @param int $user_id
     * @return \App\GroupUser
     */
    public function scopeAffiliatedGroups($user_id)
    {
        return $this->whereHas('groupUsers', function($query) use($user_id)
        {
            $query->where('user_id', '=', $user_id);
        });
    }
}
```

##結果
実行してみると…。

```
ErrorException Object of class Illuminate\Database\Eloquent\Builder could not be converted to string
````

というエラーになってしまいます。

え？？なんでBuilderなんて渡ってるんだ？と一瞬思いましたが、スコープはBuilderを第一引数に受け取ることを完全に忘れてました。
ちゃんとドキュメント読みましょうね…。

>スコープパラメーターは**$query引数の後に定義**する必要があります。
>[Laravel 5.7 Eloquent：利用の開始](https://readouble.com/laravel/5.7/ja/eloquent.html)

修正するとこんな感じになりました。めでたしめでたし

##修正後

```php:Group.php(修正後)
    /**
     * ユーザが所属するグループを取得するスコープ
     * 
     * @param \Illuminate\Database\Eloquent\Builder $query
     * @param int $user_id
     * @return \App\GroupUser
     */
    public function scopeAffiliatedGroups($query, $user_id)
    {
        return $query->whereHas('groupUsers', function($query) use($user_id)
        {
            $query->where('user_id', '=', $user_id);
        });
    }
```