OmniAICreator/Qiita-1.07M huggingface dataset:
PandasでGoogleスプレッドシートの内容からDataFrameを作る

# 試したこと

[前回](https://qiita.com/FrozenVoice/items/966d2778086f2b707922) はWeb上の公開データを使ってDataFrameを生成した。
ただ、自分で用意したデータを扱いたい場合にはGoogleスプレッドシートを元にするのが楽そうなのでその方法を確認した。

# Googleスプレッドシートを扱うためのモジュールをインストール

Google Colaboratory環境なので下記にてインストール

```
!pip install gspread
```

# 読み込み元となるGoogleスプレッドシートのファイルを用意

適当にデータを入れたファイルを用意する。

|![skitch2.png](https://qiita-image-store.s3.amazonaws.com/0/165884/db6472aa-a21d-e89f-14f6-28ee53a16dfb.png)|
|:--|

また、コード内にてスプレッドシートのURLを指定するので予めメモしておく。

# Colaboratoryにコードを用意して実行

```python
from google.colab import auth
from oauth2client.client import GoogleCredentials
import gspread
import pandas as pd

auth.authenticate_user()
gc = gspread.authorize(GoogleCredentials.get_application_default())

url = '[スプレッドシートのURL]'

worksheet = gc.open_by_url(url).get_worksheet(0)
df = pd.DataFrame(worksheet.get_all_values())

print(df)
```

実行すると認証コードを求められるので、表示されているリンクから認証コードを取得して入力する。

# 結果

|![skitch3.png](https://qiita-image-store.s3.amazonaws.com/0/165884/737461a5-3ac3-29c5-dcbc-585d26136bb2.png)|
|:--|
フォローユーザーのみのタイムライン

#前説
特に進展がなかったので、小さな話だけして寝ます。

#前提
Rails4.2
[この回](https://qiita.com/networkyohan69/items/bdc83a0b9519c4fe5306)にてフォローフロワー機能を実装しています。

#実装
- フォローしているユーザーのみをタイムラインに表示

#プログラム
```ruby:products_controller.rb
   #フォローしているユーザーのみタイムラインに表示
   #N+1問題を防ぐためにincludesメソッド(gem: bulletを導入)を使用
    @products_all = Product.includes(:user,:taggings,:like_users,:likes)

    @user = User.find(current_user.id)
   #フォローしているユーザーを取得
    @follow_users = @user.all_following
   #フォローユーザーのツイートを表示
    @products = @products_all.where(user_id: @follow_users).order("created_at DESC").page(params[:page]).per(10)
```

```
@follow_users = @user.all_following
```
all_followingでフォローしているユーザーを全取得できます。
Alexaに話しかけてSAPサーバを起動する

Alexaに「アレクサ、トリガー、つけて」と話しかけると、
サーバ機が起動して、SAPのDBが立ち上げる仕組みを作ってみました。

※経緯についてはこちら
[Alexaに話しかけてSAPサーバを起動する](http://www.sapsumikko.jp/entry/2018/05/14/230500)


仕組みはこんな感じ。
![スクリーンショット (1162).png](https://qiita-image-store.s3.amazonaws.com/0/22526/6bc8d941-3b93-de16-82b8-0a33b76a3127.png)


# **Alexa → IFTTT**
AmazonEchoDotを使用。

IFTTTのトリガーに「Alexaに『つけて』と話したら」を設定。
本当は『SAPサーバつけて』にしたかったのですが、認識してくれず。。
『エスエイピー』も ~~『サップ』も~~ 『サーバ』も認識してくれず。。
なぜか『つけて』はセーフだったのでこちらを採用。
今後、認識できる言葉は増えていくのかな？

# **IFTTT → PushBullet → Android端末 Automagic(Android端末) → Wake on Lan → サーバ機起動**
IFTTTのアクションに「PushBulletでAndroid端末に通知」を設定。
AutoMagicでPushBulletからの通知を受け取ったらWoLを実行するように設定

IFTTTからのWoLについてはこちらを参考にさせていただきました。
[Google HomeからノンプログラミングでWindows起動＆シャットダウン](https://qiita.com/daichin/items/66fb29d8d52a42071773)

AutoMagicのために、使っていなかったAndroid端末を引っ張り出してきました。
WoLの設定(主にルータ)に苦戦。

#**サーバ機起動 → タスクスケジューラでUiPathを実行**
Windowsのタスクスケジューラで、PC起動時にUiPath(UiRobot)が実行されるように設定。

UiRobotでの起動方法はこちらを参考にしました
[シナリオの自動実行](https://uipath.amebaownd.com/posts/3803843)

が、なかなかうまくいかず。
こちらを参考に「基本のタスク」ではなく「タスク」に切り替えたら成功しました。
[タスクスケジューラからプロジェクトを実行する方法](https://uipath.site/tips/taskscheduler.html)

*ちなみに、スタートアップにバッチファイルを仕込んだ場合は、セキュリティソフトに隔離されました。。。*

#**UiPathでSAP MaxDBを起動**
こちらは過去に設定済でした。
SAPインスタンスの起動までは仕込んでおらず。


#**まとめ**
他にも自動化できそうな処理があったらやってみようと思います。
もしも改善ポイント等ありましたらご連絡いただけると嬉しいです。
(私、AlexaもAndroidもUiPathもSAPベーシスも初心者なので、、、)
損益分岐点計算を中学数学知識で考える

# 見出し
* 変動費率とかの式がややこしかったので自分用をかねてまとめ
* 暗記の方がわかりやすい人は暗記で・・・
* わかりやすく書けると思って書いてみたら、案外わかりにくいまとめになってしまいました(´・ω・｀)

# 重要なこと
1. 利益 = 売上高 - 変動費 - 固定費
  - 売上から費用を引いたら利益だよと考えるのはとてもスムーズ
2. 変動費は**売上高**に応じて変動するもの
  - 変動費は売上高に比例する
  - y(変動費)=ax(売上高)が成り立つ
  - この時の比例定数aを変動費率と呼ぶ

# 例題
[応用情報技術者試験過去問より](https://www.ap-siken.com/kakomon/30_haru/q77.html)

- 下記の時の損益分岐点売上高を計算する問題（単位　百万円）
  - 売上高 500
  - 変動費 300
  - 固定費 180

# 解いてみる
* 損益分岐点は利益が0になるところ

`1.より 0（利益） = 売上高 - 変動費 - 固定費
 求めたいのは売上高なので売上高をxと置く。
 変動費もわからないのでyと置く。
 固定費は定数なので代入する。
 0 = x - y - 180
 180 = x - y  ・・・①
`

`2. より 変動費 = a × 売上高
   売上高が500のとき変動費が300なので
   300 = 500a
   a = 0.6
   従って売上高xの時の変動費yは
   y = 0.6x ・・・②
`

`①、②より
180 = x - 0.6x
180 = 0.4x
x = 180 / 0.4
x = 450
`

# 参考
- https://keiriplus.jp/tips/sonekibunkiten_keisan/
Macでプロキシとの戦いに疲れたので、透過型プロキシを導入してみた

#背景
macOSだとプロキシ必須の環境ではうまく動かないソフトウエアがいくつかあります。例えば、KindleとかMicrosoft OneNoteとかがシステムのプロキシ設定を読み込んでくれず、うまく使えません。そのほかに`.bashrc`にも環境変数をセットしたり、Dockerや仮想マシンを立ち上げるたびに環境変数をセットしてまわったりとかなり手間がかかります。このような時に便利なのが透過型プロキシで「[NAT をやめて、透過 SOCKS プロキシを導入した](http://blog.cybozu.io/entry/2016/03/14/130000)」や「[プロキシとの戦いに疲れたのでgoで透過プロキシを作ってみた](https://qiita.com/wadahiro/items/7fa852b7217940e6ef26)」でiptablesを利用したLinux向けの実装が紹介されています。しかし、新しいネットワークを切りたくはないし、それだけのためにLinuxの仮想マシンを用意したくもなかったので、macOSやFreeBSDで採用されているpfを用いてローカルで動く透過プロキシを構成してみました。

#実装方法
実装は「[プロキシとの戦いに疲れたのでgoで透過プロキシを作ってみた](https://qiita.com/wadahiro/items/7fa852b7217940e6ef26)」で紹介されていた`go-transproxy`からiptablesを無効化できるようにしたバージョンを利用します。~~そのうち本家にマージされるかもしれませんが、[私のリポジトリ](https://github.com/informationsea/go-transproxy)においてあります。~~→マージされました。また、iptablesの代わりにpfを用いており、さらにルーティングされるパケットではなく出ていくパケットを全部捕まえるので、ネットワークを分けることなく手元のマシンから出ていくパケットをすべてプロキシ経由にできます。

#使い方
- [go-transproxyリポジトリ](https://github.com/wadahiro/go-transproxy)から最新版のソースコードをダウンロードし、ビルドする。
- http_proxy, https_proxy, no_proxy（IPアドレスのみ対応可能）をセットする
- `./transproxy -disable-iptables` でgo-transproxyを立ち上げる（sudo不要）
- 以下の内容のpf.confを適当なディレクトリに作成する。
    - もとに戻すためにも/etc/pf.confではない方がよいでしょう。
    - `{!192.168.0.0/16}`の部分はno_proxyに設定した範囲と正確に逆転させた範囲を指定します。
        - 範囲が一つだけなら!が使えますが、複数ある場合にはとても面倒で、間違えると通信がループします。
    - `em0`となっている２か所は適切な外部接続インターフェース書き換えます。macOSなら`en0`かもしれません。

```
Packets = "proto tcp from em0 to {!192.168.0.0/16}"
rdr pass log on lo0 $Packets port 80 -> 127.0.0.1 port 3129
rdr pass log on lo0 $Packets port 443 -> 127.0.0.1 port 3130
pass out on em0 route-to lo0 inet $Packets port {80, 443} keep state
```

- `sudo pfctl -f ./pf.conf`で作成したFirewallルールをロードする。
- private DNS, public DNSを指定して、DNS Proxy機能も使いたい場合にはシステムのDNSをlocalhostに設定する。
- 終了するときには`sudo pfctl -f /etc/pf.conf`で元のルールをロードする。

## ヘルパーツール
no_proxyの設定やpfの設定ファイルを作成して読み込むためのヘルパーツールを作成して、[gist](https://gist.github.com/informationsea/f10191cc78db95fee617aff4ffe05776)においておきました。Python3が必要ですが、同じディレクトリに`transproxy`を置いておけば環境変数のセットやpfのロード、アンロードを自動的に行います。

#注意点
制限事項として以下のことがあります。

- macOSのアプリケーションファイアウォールとは共存できません。
    - 原因はわかりませんがmacOSのファイアウォールのanchorと共存できないので、外部接続を行うノートPCでは別途設定を行っておいた方が良いでしょう。
    - たぶん同様の理由でネットワーク共有とも共存できない気がします。
    - 誰か解決出来たら教えてください。
- ホスト名でのプロキシ除外はできません
    - `go-transproxy`の本来の想定であるルーターでの透過型プロキシでなく、ローカルから出ていく通信のすべてを透過型プロキシ経由にするので、pfのIPアドレスで除外設定をしておかないと通信がループします。そのため、あらかじめIPアドレスのわからないホスト名での除外はできません。
        - うまくプロセス単位の設定ができれば解決しますが、誰か教えてください。
        - ユーザー単位での除外もできるので、`go-transproxy`だけ別ユーザーで動かして、除外しておけば対応可能です。
- pfのルールを書くのにOpenBSDのドキュメントを参照してはなりません
    - FreeBSDやmacOSのpfはバージョンが古く、syntaxが違います。

#参考
- [プロキシとの戦いに疲れたのでgoで透過プロキシを作ってみた](https://qiita.com/wadahiro/items/7fa852b7217940e6ef26)
- [OS X 10.8: redirecting locally initiated ssh connections to localhost:22](https://serverfault.com/questions/421261/os-x-10-8-redirecting-locally-initiated-ssh-connections-to-localhost22)
- [pf.conf(5) - FreeBSD](https://www.freebsd.org/cgi/man.cgi?query=pf.conf&sektion=5&n=1)
- [29.3. PF - FreeBSD](https://www.freebsd.org/doc/handbook/firewalls-pf.html)
Windows10の復元（ビルドバージョンを戻す）

先日のアップデートにより
とうとうWindowsUpdateでPCデバイスがまともに操作できない事態となり
一旦、前ビルドに復元してもスリープ中に自動更新される始末。
~~（今更だけど）Windows10は私の中でウィルスと同義になってしまった。~~
仕方なく取り急ぎの対応記録のメモ

#前のバージョン（ビルド）に戻す

```
Windowsボタンを押してスタートメニューを表示
「update」と入力して表示された「Windows Update の設定」をクリック
「回復」の項目を選択して、下にスクロール
「前のバージョンの Windows 10 に戻す」的な項目を選ぶ
`新たな更新内容を確認して解決～`のような文言が表示されるが「確認はせず」
次へ進める。
理由の回答に関しては適当に入力して進める
ウィザードに沿って次へ進めれば最終的に再起動＆前バージョンへの復元作業が実行される。
```

#自動更新させない設定
自分の場合はUpdateを「手動」更新にしているにもかかわらず
**スリープ時に勝手に更新実行されていた**ので「無効」にするしかないのだろうか？

```
Windowsボタン を押してスタートメニューを表示
「サービス」と入力して表示された「サービス」項目をクリック
「Windows Update」の項目を右クリックして「プロパティ」をクリック
「スタートアップの種類」を「無効」に設定、「OK」を押して閉じる。
```

これだけだと不安なので[フリーソフト](http://www.asahi-net.or.jp/~tz2s-nsmr/)で設定を試みる。

[ダウンロード（一応、直リンクはやめときました）](http://www.asahi-net.or.jp/~tz2s-nsmr/WinUpdateSettings.html)

ダウンロードしたソフトを解凍、適当なソフト用フォルダに配置。
解凍したフォルダ内の「WinUpdateSettings.exe」を実行してソフトを起動
設定した項目は以下

- 更新プログラムを確認しない（推奨されません）
- WindowsUpdateManagerをタスクスケジューラから削除

---

正直、これでうまく設定できているのかわからないけど
とりあえず備忘録として。

※ 古いPCに関してはデバイス環境的に今後のWindows10アップデートにはついていけないのかもしれない（さっさと買い替えろということか）。
【Oracle】SQL集

Oracle SQLのメモ

---

1.統計情報の取得

```sql
SELECT
    A.TABLE_NAME
   ,B.COMMENTS
   ,A.NUM_ROWS
   ,A.BLOCKS
   ,A.AVG_ROW_LEN
   ,A.SAMPLE_SIZE
   ,to_char(A.LAST_ANALYZED, 'YYYYMMDD HH24:MI:SS') LAST_ANALYZED
   ,C.STATTYPE_LOCKED
   ,C.STALE_STATS -- この統計が失効しているか否か YES | NO
   ,A.STATUS
FROM
    USER_TABLES A
   ,USER_TAB_COMMENTS B
   ,USER_TAB_STATISTICS C
WHERE
    A.TABLE_NAME = B.TABLE_NAME
AND A.TABLE_NAME = C.TABLE_NAME
AND B.TABLE_TYPE = C.OBJECT_TYPE
AND A.TABLE_NAME LIKE '%' -- 統計情報を調べたいテーブル
ORDER BY 1
```

2.インデックスの統計情報

```sql
SELECT
    A.INDEX_NAME
   ,A.TABLE_OWNER
   ,A.TABLE_NAME
   ,C.COMMENTS
   ,A.TABLESPACE_NAME
   ,B.PARTITION_NAME
   ,B.NUM_ROWS
   ,B.SAMPLE_SIZE
   ,to_char(B.LAST_ANALYZED, 'YYYYMMDD HH24:MI:SS') LAST_ANALYZED
   ,B.STATTYPE_LOCKED
   ,B.STALE_STATS
   ,A.STATUS
FROM
    USER_INDEXES A
   ,USER_IND_STATISTICS B
   ,USER_TAB_COMMENTS C
WHERE
    A.INDEX_NAME  = B.INDEX_NAME
AND A.TABLE_OWNER = B.TABLE_OWNER
AND A.TABLE_NAME  = B.TABLE_NAME
AND A.TABLE_NAME  = C.TABLE_NAME(+)
AND A.TABLE_NAME  like '%' -- 統計情報を調べたいテーブル
ORDER BY 2,3,1
```

3.列の統計情報

```sql
SELECT
    A.*
FROM
    DBA_TAB_COL_STATISTICS A
   ,DBA_TAB_COLUMNS B
WHERE
    A.OWNER       = B.OWNER(+)
AND A.TABLE_NAME  = B.TABLE_NAME(+)
AND A.COLUMN_NAME = B.COLUMN_NAME(+)
AND A.OWNER       like '%' -- 統計情報を調べたいスキーマ
AND A.TABLE_NAME  like '%' -- 統計情報を調べたいテーブル
ORDER BY
    B.COLUMN_ID
```

4.統計情報を取得、削除

```sql
EXECUTE DBMS_STATS.GATHER_TABLE_STATS('ownname','tblname', FORCE =>TRUE);
EXECUTE DBMS_STATS.GATHER_INDEX_STATS('ownname','indname');

EXECUTE DBMS_STATS.DELETE_TABLE_STATS('ownname','tblname');
```

5.統計情報のロック、解除

```sql
EXECUTE DBMS_STATS.LOCK_SCHEMA_STATS('ownname');
EXECUTE DBMS_STATS.UNLOCK_SCHEMA_STATS('ownname');

EXEC DBMS_STATS.LOCK_TABLE_STATS('ownname', 'tblname'); -- テーブル単位
```

6.統計情報の取得履歴を確認

```sql
SELECT
    A.TABLE_NAME
   ,A.PARTITION_NAME
   ,A.STATS_UPDATE_TIME
FROM
    USER_TAB_STATS_HISTORY A
WHERE
    A.TABLE_NAME like '%' -- 統計情報の取得履歴を調べたいテーブル
ORDER BY 3 desc
```

7.統計情報の取得時間を確認

```sql
SELECT
    A.CLIENT_NAME
   ,A.WINDOW_NAME
   ,A.WINDOW_START_TIME
   ,A.JOB_STATUS
   ,A.JOB_START_TIME
   ,A.JOB_DURATION
FROM
    DBA_AUTOTASK_JOB_HISTORY A
WHERE
    A.CLIENT_NAME = 'auto optimizer stats collection'
ORDER BY
    A.WINDOW_START_TIME
```
LAMP環境の構築(自分用メモ)

#　参考にしたサイト

PHPのインストール前までとシンボリック設定
[VirtualBox Vagrant でローカル開発web環境の共通化](https://qiita.com/yasshcy/items/8079c0cf4a96e461863b)

MySQLを考慮したPHP環境のインストール
[centOS7でLAMP環境を作る](https://qiita.com/KaI_Qiita/items/6a085571e1a75c69fb4c)

---
上だとMySQLを考慮しておらず，PHPの拡張モジュールをそれぞれ入れるとうまくいかなかったため，下の記事を参考

初めてローカル環境を立てて，インストールに失敗しまくったので自分用メモに．

#　経験談
うまくいかなかったらとりあえず

```
vagrant destroy
```
をして再構築しました．
【PHP】serializeの落とし穴

配列や独自クラスをDBに入れておいて、それを後から使うようなこと、したくなりますよね。
そんな時に便利なのが`serialize`です。([serializeとは？](http://php.net/manual/ja/function.serialize.php))
`JSON`と言う手もありますが、型の情報が失われてしまうので、serializeを使うことも多くあると思います。
ですが、そのserializeした情報、DBに入れる時どうしてますか？
もしかして、`text`型のカラムに直接突っ込んだりしていませんか？(私は`text`型のカラムに突っ込んでいました)
戻り値が`string`だからと言って、`text`型のカラムに入れるのは**NG**です。

以前趣味で作っていたwebアプリではまったので、その際のポイントをかいつまんでまとめてみました。

## 何がいけないのか
実は`text`型のカラムにserializeされた文字列を入れると、unserializeする際に上手くいかないことがあります。
insert自体に問題はなく、そこでエラーが出たりexceptionがthrowされることもありません。
でも、その時点でDBに格納されるデータは壊れており、unserializeすることができないため復旧も不可能となります。

何故こんなことが起きるのか、ですが、簡単に言うとinsert時にデータが欠損してしまい、unserialize時に正しく元に戻せなくなってしまうことが原因でした。
insert時にデータが欠損してもinsert自体には問題がないため、DBには中途半端な状態でinsertされてしまい、気付くのはunserializeのタイミング、と言うなんとも悲しい状態の出来上がりです。

## 解決策
serializeメソッドでは`string`が返ってくるのに、DBには`text`で入れてはいけません。ではどうしたらいいのか。
実は答えは簡単で、[PHPのマニュアル](http://php.net/manual/ja/function.serialize.php)に記載があります。
> これはバイナリ文字列であり、null バイトを含む可能性もあることに注意しましょう。 保存したり利用したりするときも、null バイトが含まれることを想定しておかないといけません。 たとえば、serialize() の出力をデータベースに格納するときには、 通常は CHAR 型や TEXT 型ではなく BLOB 型を使わないといけません。

上記の通り、serializeメソッドの戻り値は`バイナリ文字列`であるため、**BLOB**型のカラムを用意してそこに入れる必要があります。(参考：[BLOBとは？](https://ja.wikipedia.org/wiki/%E3%83%90%E3%82%A4%E3%83%8A%E3%83%AA%E3%83%BB%E3%83%A9%E3%83%BC%E3%82%B8%E3%83%BB%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88))
serializeメソッドの戻り値は`string`なんですが、中身は`バイナリ文字列`なので、普通に文字列として扱うとデータが欠損することがあるようでした。
考えてみれば単純なことなんですが、戻り値が`string`であることに惑わされ、解決までに結構時間を費やしてしまいました。

この時はこれで解決できましたが、正直なところデータの検証をしたわけではないので、正確には別の原因があった可能性もあります。
もし別の原因をご存知の方がいらっしゃれば、是非お教えいただければと思います。

## 補足
実はMySQLのBLOB型にはいくつか種類があり、バイナリデータによっては格納しきれない場合があります。
参考：[MySQLのBLOBについて](https://dev.mysql.com/doc/refman/5.6/ja/blob.html)
> BLOB はさまざまな容量のデータを保持できる大きなバイナリオブジェクトです。BLOB 型は、TINYBLOB、BLOB、MEDIUMBLOB、および LONGBLOB の 4 つがあります。これらの違いは、保持できる値の最大長だけです。

保持できる値の最大長が違うだけで4種類あり、格納したいデータのサイズを見積もった上でテーブルを作る必要があります。
格納したいデータによってはカラムのサイズを超えてしまい、BLOB型でも欠損が起こる場合があるので、テーブルを作る際はデータサイズの確認を怠らないよう気をつけたいと思います。
pipのupgradeができなかった件

# 経緯

[M5stackでMicroPythonを使えるようにする](https://qiita.com/inachi/items/d23b9e39551836cddb09)がやりたくて、esptoolをインストールしようと、

```
$pip install esptool
```

とやったら、

```
You are using pip version 9.0.1, however version 10.0.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
```

と出てしまいました。
pipが古いことはすぐわかりましたが、

```
pip install --upgrade pip
```

と言われたままやっても同じことの繰り返し。

# 解決策
一旦、pipをアンインストールしてから、入れ直し。


```
sudo python -m pip uninstall pip
sudo python get-pip.py
```

あくまでも私の環境での話ですので、ご注意ください。

これで、microPythonで、hello worldも表示できました。
WindowsのMicrosoft Storeで入手を押してもダウンロードしてくれない現象。

2018/5/14執筆

[こういう記事](https://qiita.com/Brutus/items/f26af71d3cc6f50d1640)を見つけて、歓喜して、WSLでUbuntuをDLしようか！として、Microsoft Storeに行ったら、入手を押してもリロード無限ループに陥った人向けの記事です。

[このツイート](https://twitter.com/tanakasan2525/status/995529919986778113)通りにサインインしなおしたら、うまくいきました。

（ググっても出てこないので導線として書いた記事です。5分クオリティーなのは許して。あと、これにいいねするより、元のツイートにいいねしてください）
Alexaねぇさんに関西弁をしゃべらせてみる

Alexaねぇさんの声でどこまで関西弁をうまく発話できるか実験してみたいと思います。

# 準備
## ①スキルを用意する
発話調整するまでのステップは[Amazon Echo Alexaスキル 開発チュートリアル](https://qiita.com/zono_0/items/57247bed70dbe2b3ce28)などの記事を見て済ませておきます。

![alexa_step_check.png](https://qiita-image-store.s3.amazonaws.com/0/65230/0d29a9c2-70be-c79b-cdd2-0f6401ca08f5.png)

## ②発話調整の用意をする
ここを使います。
![alexa_test.png](https://qiita-image-store.s3.amazonaws.com/0/65230/dd609996-b460-c3dd-1231-fd501a08e10f.png)

あとは`<speak>ほげほげ</speak>`のところに好きなこと書いて再生ボタンを繰り返せばOKですね。

# つくる
## ①セリフをさがす
今回は小藪さんがすべらない話で話していた、スノーボードのネタからこのセリフを抜粋してしゃべらせてみたいと思います。

> そぉっとオカリナ吹くな！

※関西弁ネイティブでない方はかならずお手本を用意しましょう。

## ②完成イメージを決める
私はTTSの調整をする時にいつもこういうイメージを頭の中で作ってから、音の高低差を狙ってつくります。
![Screen Shot 2018-05-14 at 20.27.05.png](https://qiita-image-store.s3.amazonaws.com/0/65230/b25043fc-9621-2e09-eccf-7b8cc09ec7bb.png)
※ Alexaねぇさんに限らず、この完成系がわからない人は一生音声調整とかできないので今すぐ諦めましょう。
（特殊な訓練受ければできるのかも？）
参考までに、「はし」の同音異義語で「橋」「箸」「端」それぞれ「は」と「し」を比較した時にどちらの文字が高くなっているか違いがわからない人は上記に該当する可能性が高いです。

## ③日本語だけでまずがんばる
今回は２種類の手法を組み合わせて挑戦してみたいと思います。
・ひらがな・カタカナ・漢字・記号でがんばる
・[SSML](https://developer.amazon.com/ja/docs/custom-skills/speech-synthesis-markup-language-ssml-reference.html)でがんばる

まずは文字のバリエーションが豊かな日本語の特徴を生かしてざっくり調整します。
音の高低差を精密に狙える人はいきなりSSMLを使っても良いと思います。
SSMLは使いすぎると変な間ができることがあるので、私はベースの高低差をなるべく日本語の文字列だけで作って、高低差を大きくするのにSSMLを使うのが好みです。

まずそのまま台本通りの文字列を入れてみて、理想との差分を確認。

```xml
<speak>
    そぉっとオカリナ吹くな！
</speak>
```
- 「そぉっと」が標準語っぽい
- 「オカリナフクナ」っていう一単語みたいに聞こえる

「単語」や「文節」「フレーズ」などの単位で一箇所ずつ狙って調整していきます。

まずは「そぉっと」の部分を集中攻撃してみます。
経験的に「カタカナはなんとなく音を上げやすい」傾向がある(気がする)ので、一部をカタカナにしてみます。

```xml
<speak>
    ソオオっとオカリナ吹くな！
</speak>
```
ちょっとそれっぽくなりました。

次に「オカリナフクナ」の部分。
「オカリナ」自体はさほど特殊な単語でもないと思うので、「吹くな！」の文字列に何らかの影響を受けて聞いたこともないイントネーションになっちゃったのかな、Alexaねぇさん日本語下手だなかわいいな、という想像のものと、「オカリナ」部分には手を入れず、「吹くな！」を最初にいじってみます。

ひらがな

```xml
<speak>
    ソオオっとオカリナふくな！
</speak>
```
「オカリナ」のイントネーション変わらず。

カタカナ

```xml
<speak>
    ソオオっとオカリナフクナ！
</speak>
```
「オカリナ」のイントネーションが正常になりました。
「吹くな！」のイントネーションもベースの高低は外れていないので、日本語だけでの調整はいったんここまでにしておきます。

## ④SSMLでがんばる
今回は「音の高低差」を調整したいので、[prosodyタグ](https://developer.amazon.com/ja/docs/custom-skills/speech-synthesis-markup-language-ssml-reference.html#prosody)をメインで使っていきます。

![Screen Shot 2018-05-14 at 20.27.05.png](https://qiita-image-store.s3.amazonaws.com/0/65230/b25043fc-9621-2e09-eccf-7b8cc09ec7bb.png)
完成イメージをもとに、「ぉっ」をもうちょっと、「くな！」「く」を特に思いっきり上げたいので、こんな感じでpitchの値を上げ下げしてみます。

```xml
<speak>
	ソ<prosody pitch="+5%">オオ</prosody><prosody pitch="+0%">っと</prosody>オカリナフ<prosody pitch="+45%">クナ！</prosody>
</speak>
```
この状態でもう関西弁になりました。

前後に文章がくっつく時は、おまけで[emphasisタグ](https://developer.amazon.com/ja/docs/custom-skills/speech-synthesis-markup-language-ssml-reference.html#emphasis)とか使ってみます。

```xml
<speak>
    <prosody rate="105%">大丈夫ですか優たら、</prosody><prosody rate="70%">おぉー、</prosody>やデ、
	<prosody rate="155%">
    	<emphasis level="strong">
    		ソ<prosody pitch="+5%">オオ</prosody><prosody pitch="+0%">っと</prosody>オカリナフ<prosody pitch="+45%">クナ！</prosody>
    	</emphasis>
    </prosody>
</speak>
```

※改行位置でも読み方変わります。


## おわりに
ちゃんとしたもの作りたいなら音声ファイルでやればいいよね。
[忘備録]DBのインデックスについて調べた

今までなんとなくでやっていたので、
自分で理解できるように調べたことの忘備録です。
後からいろいろ補足等できたらなと。

ツッコミや補足等がありましたらコメントしてください。
お願いします。


# Nested Loops
## 駆動表と内部表
駆動表・・・外側のループの対象となる表
内部表・・・内側でループしている表

駆動表(テーブル) x 内部表(テーブル)
内部表(テーブル) x 駆動表（テーブル)
結合コストは変わらないと思うが「駆動表を小さく」
--> 内部表の結合キーにインデックスが存在している場合、内部表のループをスキップできる

#INDEX
## INDEXを作成すべきかの基準
カーディナリティが高い + 選択率が低い

###カーディナリティ
- 値のばらつき具合
- 最も高いのはすべての行において値が異なる(Ex. 一意のキー列)

###選択率
- 特定の列の値を選択したに行を母集合からどの程度絞り込めるか

##INDEXによる効果が期待できない
- 絞り込み条件がない
- ほとんど絞り込めない
- ユーザーの入力によって選択率が変化

##INDEXが利用できない条件
- 中間一致（%~%) 、後方一致(%~)の検索
- 牽引列で演算を行う
- is Nullを利用している
- 牽引列に関数を利用している
- 否定形を使用している
C#に元々ある機能で学ぶデザインパターン "Iterator Pattern"

# 概要

何番煎じか分かりませんが、***イテレータパターン(Iterator Pattern)***のお話です。
**C#**においては、言語に組み込まれていると言って良いでしょう。
[Iterator パターン @ Wikipedia](https://ja.wikipedia.org/wiki/Iterator_%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3)のクラス図に合わせた形で、C#の機能を説明していきます。

# 型

```
Aggregate -----------------> Iterator
    △                          △
    │                           │
Concrete                     Concrete
Aggregate -----------------> Iterator
```

## `IEnumerator<T>`

デザインパターンで出てくる`Iterator`インタフェースは、C#では**`IEnumerator<T>`**に当たります。
『列挙する者』みたいな意味(*Enumurate + -or*)ですね。

### `Current`,`MoveNext()`

`next()`,`hasNext()`は、C#では**`Current`,`MoveNext()`**のように少し違った形で実装されます。

```csharp
interface IEnumerator<out T> {
    // 現在の要素を取得する。
    T Current { get; }
    // 次の要素に移動する。次の要素があればtrue,無ければfalseを返す。
    bool MoveNext();
    // その他の定義は省略
}
```

## `IEnumerable<T>`

デザインパターンで出てくる`Aggregate`インタフェースは、C#では**`IEnumerable<T>`**に当たります。
『列挙可能』みたいな意味(*Enumurate + -able*)ですね。

### `GetEnumerator()`

`iterator()`メソッドは、C#では**`GetEnumerator()`**に当たります。

```csharp
interface IEnumerable<out T> {
    // イテレータを取得
    IEnumerator<T> GetEnumerator();
    // その他の定義は省略
}
```

## `IEnumerable<T>`を実装した型

`ConcreteAggregate`に当たるC#の型は無数にあります。
**同一の型のインスタンスを複数扱うようなデータ型**はほぼこれに当てはまると思って良いでしょう。

- 配列
- `List<T>`
- `Dictionary<TKey,TValue>`

## `IEnumerator<T>`を実装した型

`IEnumerator<T>`を実装した型は、例えば`List<int>.Enumerator`型などがあります。
ただ、こちらは実装型を意識せずに利用することが普通ですね。

## 組み込まれている機能

### foreach構文

**foreach構文**では、`GetEnumerator()`メソッドを持つインスタンスであれば、同一の構文で要素を列挙できます。
これはC#プログラマなら無意識レベルで使っているであろう例です。

```csharp
foreach (var item in obj) {
    Console.WriteLine(item);
}
```

↑の構文は↓とほぼ同義になります。

```csharp
var iterator = obj.GetEnumerator();
while (iterator.MoveNext()) {
    Console.WriteLine(iterator.Current);
}
// 実際には例外処理や後処理などがあるが、ここでは省略
```

### LINQ

**LINQ to Object**では、`IEnumerable<T>`を『流れるようなインタフェース』として扱うことで、様々な標準クエリを利用可能にしています。


```csharp
Enumerable
   .Range(3, 10)
   .Where(i => i % 2 == 1)
   .Select(i => new { A = i, B = i * i / 2, C = i * i / 2 + 1 })
   .ToList()
   .ForEach(Console.WriteLine);
```

### ジェネレータ

C#では`IEnumerable<T>`を利用した**イテレータを生成するための構文**が用意されています。
自前で`IEnumerable<T>`と`IEnumerator<T>`を作成する手間は基本的に不要と言えます。
(少しややこしいのですが、この構文は"*Iterator block*"と呼ばれます。)

```csharp
// イテレータ構文と呼ばれているが、実際にはジェネレータ
static IEnumerable<int> Generate5Primes() {
    yield return 2;
    yield return 3;
    yield return 5;
    yield return 7;
    yield return 11;
}

// 無限ループも使い方次第
static IEnumerable<double> RandomDoubles() {
    var random = new Random();
    while (true) {
        yield return random.NextDouble();
    }
}

```

# まとめ

"Gang of Four"によるデザインパターンの紹介が1994年のことになります。つまり、C#に限らずその後にリリースされた言語ではこれらの**デザインパターンが言語に取り込まれている**ことも多いのです。
これからデザインパターンを勉強しようとしている人は、自分の得意とする言語(やフレームワーク)にどのようなデザインパターンが組み込まれているのかを調べてみると良いと思います。
iPadの縦置きと横置きでレイアウトを切り替える

iOSのアプリ開発では、Size Classを使って1つのStory boardでiPhoneやiPadの画面サイズに応じて異なるレイアウトを作成することができるようになりました。
Size Classは2018年5月現在、以下のように定義されています。

|  | w:compact | w:regular |
|:-:|:-:|:-:|
| h:compact  | iPhone(横置き) | iPhone Plus(横置き)  |
| h:regular  | iPhone(縦置き) | iPad(縦置き/横置き)  |

参考 https://developer.apple.com/ios/human-interface-guidelines/visual-design/adaptivity-and-layout/

ここで問題になるのは、iPadは縦置き(portrait)も横置き(landscape)もwidth = regular, height = regularに割り当てられているので、縦置きと横置きでレイアウトを変えることができないということです。

これを以下のような割り当てに変えて、iPadの縦置きと横置きで異なるSize Classにする方法がわかったので書き残しておきます。

|  | w:compact | w:regular |
|:-:|:-:|:-:|
| h:compact  | iPhone(横置き) | iPhone Plus(横置き)、iPad(横置き)  |
| h:regular  | iPhone(縦置き) | iPad(縦置き)  |

ただし、見てわかるようにiPhone Plus(横置き)とiPad(横置き)は同じSize Classが割り当たるので、同じレイアウトになってしまいます。

手順は以下の通りです。

1. 対象となる画面にContainer Viewを配置する。この画面のView Controllerを`ContainerViewController`とします。

1. Container Viewに組み込まれたView(自動的にセグエで接続されているView)に表示したい内容を配置します。上記のSize Classに応じてレイアウトが変わるように作成してください。このView Controllerを`MyViewController`とします

1. `ContainerViewController`に以下の実装を行います。

``` swift:ContainerViewController.swift
class ContainerViewController.swift: UIViewController {
    let traitCollectionsRC = UITraitCollection(traitsFrom: [UITraitCollection(horizontalSizeClass: .regular), UITraitCollection(verticalSizeClass: .compact)])

    // 初期表示用
    override func viewDidLoad() {
        super.viewDidLoad()
        setChildTrait(size: CGSize(width: self.view.bounds.width, height: self.view.bounds.height))
    }
    
    // 回転後用
    override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
        super.viewWillTransition(to: size, with: coordinator)
        setChildTrait(size: size)
    }
    
    func setChildTrait(size: CGSize) {
        if ( self.traitCollection.horizontalSizeClass == .regular && self.traitCollection.verticalSizeClass == .regular ) {
            // 両方ともregularの場合をiPadだと判断
            if size.width > size.height {
                // 幅の方が大きい場合は横置きだと判断し、w:regular,h:compactで上書きする
                // なおchildViewController[0]がMyViewControllerになっている 
                self.setOverrideTraitCollection(traitCollectionsRC, forChildViewController: self.childViewControllers[0])
            } else {
                // それ以外の場合は縦置きになっているので上書きをnilで解除
                // 上書きしなければ、本来のw:regular, h:regularが適用される
                self.setOverrideTraitCollection(nil, forChildViewController: self.childViewControllers[0])
            }
        }
    }
}
```

Container Viewを経由する必要があるので若干面倒ですが、これでiPad縦置きと横置きのレイアウトをSize Classで変えることができるようになります。

#### 環境
* Xcode 9
* Swift 4
* iOS 11.3
gRPCでファイル転送ツール作成(python)

# なぜgRPC？？
gRPCの理解のため実際にツールを作ってみよう！ということで、gRPCを利用してファイル転送ツールを作ってみました。
言語はpythonです。
質問やアドバイスなどがあれば、コメントを頂けると幸いです。
なぜgRPCに興味を持ったかというと、[Distributed Tensorflow](https://www.tensorflow.org/deploy/distributed)でサーバー間通信に使われていて、
理解のためにとりあえず作ってみよーという感じです。
詳細はgRPCの[公式](https://grpc.io/)を参照するといいです。
簡単に言うと、gRPCはHTTP2を利用して、様々なプラットフォーム間でリモートで関数を呼び出し、その出力を得ることができます。
また、インターフェースの言語に縛られないのも大きな特徴になっています。
構成としてはclientとserverに分かれていて、clientがRequestを送って、serverがResponseを返して通信を実現しています。
以下の図参照。

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/135030/1fc72ac6-70a4-dd78-506d-0f2083ac5ba2.png)

gRPCのいいところは、

* 対応インターフェースが多いところ（C++, python, golang, ruby, Java..）
* clientとserver側で違うインターフェースでもOK
* .protoでserveの定義を書けば各インターフェース向けのひな型を自動生成してくれる。
    * それをimportすれば基本的な実装を使える！！

# pyuploader
作ったツールは[ここ](https://github.com/kuroko1t/pyuploader)に上げました。
送信したいマシンのipアドレスを指定することでclientからserver側にファイル転送をすることができます。
linux-Windows間,Windows-Windows間のファイル転送などに使えるかなと思います。
自分はWindowsからlinuxにアクセスして作業してるのですが、linuxからWindowsにファイルを持ってくるのって結構めんどくさいのでこのツール使っています。
Windows起動時に```python uploader.py -s``` でserverを常時起動しておいて、いつでもlinuxからファイル転送できるようにしています。
ファイル送る時はこんな感じです。（とりあえず送ったファイル全部表示させてます。）
![howto.gif](https://qiita-image-store.s3.amazonaws.com/0/135030/1179c28d-2ee1-72ca-4421-6119616f168d.gif)


# 実装
[Python Quickstart](https://grpc.io/docs/quickstart/python.html)を参考にして作りました。
他の言語のガイドも載っています。
Python Quickstartを見るとわかると思いますが、protoをから以下のようにするとひな型を自動生成してくれます

```
$ python -m grpc_tools.protoc --python_out=. --grpc_python_out=. helloworld.proto
```
自分が作ったツールの[upload_pb2.py](https://github.com/kuroko1t/pyuploader/blob/master/proto/upload_pb2.py),[upload_pb2_grpc.py](https://github.com/kuroko1t/pyuploader/blob/master/proto/upload_pb2_grpc.py)は自動生成されたファイルです。

gRPCの1Requestで送れる通信容量には制限があるので、大きなファイルを転送するのには向きません。
なので今回は、下記のようにStreaming方式でファイル転送を行っています（ファイルを分割して複数回に分けて通信しています。）

```proto:upload.proto
syntax = 'proto3';

service Upload {
    rpc Fileup(stream Tdata) returns (stream Tdata) {}
}

message Tdata {
    string data = 1;
    int64 size = 2;
    string name = 3;
}
```
Ionic3に入門してみる～その7 Angular4チュートリアル⑤～

# サービス
HeroesComponentにデータまで記載されている。
HeroesComponentからデータを分離し、ユニットテストなどを容易に行うことができるようにする。

## なぜサービスが必要なのか？
>コンポーネント内では直接データの取得や保存を行うべきではありません。
>もちろん、故意に仮のデータを渡してもいけません。
>コンポーネントはデータの受け渡しに集中し、その他の処理はサービスクラスへ委譲するべきです。

コンポーネントの定義
https://qiita.com/tokky_se/items/3e97506e81fad6013f04

>コンポーネント=構成要素
>要するに画面を構成する部品のこと。

なので実際に表示されるデータ自体は独立させてきましょう！

下記から、アプリケーション全体でヒーローを取得できる HeroService を作成します。
そのサービスは new で生成するのではなく、Angular による 依存性の注入(いわゆるDI) で、 HeroesComponent コンストラクタに注入します。
DIについては、下記などを参照してください。
https://qiita.com/hshimo/items/1136087e1c6e5c5b0d9f

要するに、ここでは単純にデータの分離を意味していると思われます。

## HeroService の作成
ionic CLIで作成してみましょう。
コマンドは下記です。

ionic generate provider hero

serviceではなくproviderとなっています。気をつけてください。
下記のように作成されたことを確認してください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/196422/4673f3e6-bf62-9e9d-59e5-7d78b76ce0e4.png)

## ヒーローデータの取得

>HeroService はさまざまな場所からヒーローデータを取得する可能性があります。— 外部Webサービス、ローカルストレージ、またはモックデータかもしれません。
>コンポーネントからデータ取得ロジックを切り離すということは、そういったサービス側の事情にとらわれず、いつでも実装方針の変更ができることを意味しています。 コンポーネント側は、サービスがどのように動いていようと関係ありません。
>この章の実装では、引き続き モックヒーロー を使用します。

下記のように変更します。(クラス名はHeroProviderのままとしました)
なおデフォルトのコンストラクタはhttpClientを使用するので一旦コメントアウトしました。(次くらいのチュートリアルに出てきます)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/196422/9aef1004-4552-fbba-45b5-df7eae53ef57.png)


## HeroService の提供
依存性注入できるようにする云々の話があるのですが、generate providerで作成した場合はすでに下記のように登録されているはずです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/196422/8f434bb2-c653-e126-f63b-227b803ace7c.png)

### HeroesComponent の更新と注入
HeroesComponentも合わせて変えていきましょう。
HEROESのインポートを削除し、代わりにHeroService(HeroProvider)をインポートします。
heroes プロパティの定義を、単純な配列の宣言に置き換えます。
さらにgetHeroes()を追加し、Service(Provider)からヒーローを読み込むようにします。
そして最後にngOnInitでのgetHeroesメソッド呼び出しを書きます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/196422/7be43335-edda-d476-6632-a0bb699c1833.png)

ここまでで実際にserveしてみて確認すると、変わらず動作するはずです。
モックヒーローを使いまわしているので、表示は何も変わりませんが…。
ActionView の options_for_select でアイテムによって disabled にしたりしなかったりする方法

### やりかた1

```ruby
options_for_select([
  ['item 1', '1'],
  ['item 2', '2'],
  ['item 3', '3'],
  ['item 4', '4'],
], disabled: [1, 4])
```

### やりかた2

これでもいける

```ruby
options_for_select([
  ['item 1', '1', disable: true],
  ['item 2', '2', disable: false],
  ['item 3', '3', disable: false],
  ['item 4', '4', disable: true],
])
```

See also [ActionView::Helpers::FormOptionsHelper#options_for_select](http://api.rubyonrails.org/classes/ActionView/Helpers/FormOptionsHelper.html#method-i-options_for_select)
いろんな書き方がありすぎる…

### 付録

一括で `disabled` にするのはこれで

```ruby
options_for_select(items, disabled: true)
```
react-native linkしてPackage name not found in Project/android/app/src/debug/AndroidManifest.xml

## エラー内容

```
$ react-native link xxxx
Scanning folders for symlinks in /project/path/node_modules (20ms)
rnpm-install ERR! ERRPACKAGEJSON No package found. Are you sure this is a React Native project?

Package name not found in /project/path/android/app/src/debug/AndroidManifest.xml
```

- ネイティブコードに依存しているReactNativeのライブラリは `react-native link xxxx` (xxxxはライブラリ名)をしてandroid、iosのプロジェクトそれぞれに依存性を足すことで動作する。
自分が関わるプロジェクトで `react-native link xxxx` 実行時にこのエラーが出たのでメモ
- 発生条件は恐らく `app/src/debug/AndroidManifest.xml` に `<manifest package="com.example.packagename">` の属性の記述がないとエラーになるので、 `react-native link` コマンドを実行する時だけ　package= の記述を足せば通る

```
$ vim /project/path/android/app/src/debug/AndroidManifest.xml 
-   <manifest ...>
+   <manifest ... package="com.example.packagename">
```

ReactNativeは日本語の情報少ないですよね…こういうトラブルシューティングみんないっぱい書いて欲しい
趣味でも出せる電子工作系の展示会・コンテストまとめ

プログラムが楽しいけど，物理的にものを動かせる電子工作も楽しい！　ということで
最近ブームのように電子工作をする人が増えていますが，せっかく何か作ったら色んな人に触ってみてほしい！試してみてほしい！ですよね

じゃぁどこで見てもらえばいいの？というのがあるので，個人でも出展できる電子工作系展示会・コンテストを調べてみました，
自分が参加したことがあるものもあれば，ネットで調べてはじめて知ったものもあるので，いずれは制覇してみたいものです


## 展示会
- [Maker Faire Tokyo](http://makezine.jp/events) 
おそらくいちばん有名な展示会．世界各地でやっているものの東京版，
ビックサイト開催．4~5月申込，8月実施

- [Ogaki Mini Maker Faire](http://ommf.iamas.ac.jp)
隔年で開催している岐阜県大垣市でのmaker faire
偶数年開催，2016年は9月申込，12月実施，（2014年は6月申込，8月開催）

- [メイカーズバザール大阪](http://makersbazaar.jp) 
大阪でやる大きめの展示会．
3~4月申込，7月実施

- [オープンハードカンファレンス](http://oshwc.project2108.com/)
こじんまりしてるけど，頻度が多い（年3〜4回！)展示会．いろんな地方でやってるのもすごい

- [つくると](http://www.tsukuruke.info/guide/)
福岡での展示会．
4~5月申込，6月実施

- [つくるけぇ](http://www.tsukuruke.info/guide/)
広島での展示会．つくると　と運営がおなじ？
9月申込，10月実施

- [つくるよ](https://www.tsukuruyo.net)
横浜での展示会。つくると　と運営がおなじ？
２０１８年に初で、11月に実施

- [ニコニコ超会議 にこつく](http://nicotsuku.com)
電子工作以外もいっぱいいるけれども，電子工作系もいる展示会．
1〜2月申し込み，GW開催

- [ニコニコ技術部wiki](http://wiki.nicotech.jp/nico_tech/)
ニコニコ技術部タグの有志で行われている、工作物の展示・発表会
各地で随時開催

## コンテスト
- [GUGEN](https://gugen.jp/) 
P版.comがやっているコンテスト
7〜11月申込，12月実施


- [ソレコン](http://www.takaha.co.jp/kokuchi/)
ソレノイドを使っていることが参加条件のコンテスト
HP上で1〜2月申込，2月下旬結果発表

- [ハムフェア　自作品コンテスト](http://www.jarl.org/Japanese/1_Tanoshimo/1-3_Ham-Fair/2018/jisaku2018/jisaku2018.htm)
アマチュア無線機器の自作に関するコンテスト．
小中学生は電子工作の範囲でOK．
３〜５月申込，８月開催

- [みんなのラズパイコンテスト](http://trendy.nikkeibp.co.jp/pcls/rpic/) 
 雑誌でやってるコンテスト.
5〜10月申込，11月結果発表

- [Mash Up Award](http://mashupaward.jp)
コンテストと言うか，ハードウェアのハッカソン？．
年間３０のイベント（ハッカソンバトル，プレゼンバトル等）をやっているらしい


- [yahoo JAPAN hack day](https://hackday.jp/about/)
電子工作もOKなハッカソン
半年に１回ぐらい．大体２月+αでの開催

#詳細を後で書く予定の展示会
- つくるよ！
- MakerFaire Kyoto
- [KoF](https://www.k-of.jp/2018/)

##とりあえず展示会・コンテストに申し込もう！
結構いろんな展示会・コンテストがありますが，何か作ってる！という人はぜひ申し込んでください．
まだ作りかけだから・・・といって完成を待つのではなく，とりあえず申し込んでしまって，
，展示会までに作らなきゃいけない！となったほうがはかどります（夏休みの宿題のように・・・笑）



他にもこんな展示会あるよ！ってのがあれば教えてください．
FFmpeg コマンドメモ

## MOV から Windows で再生できる MP4 に変換
	
```
ffmpeg -i /path/to/in.mov -pix_fmt yuv420p -strict -2 /path/to/out.mp4
```


## 動画の情報を確認

```
ffprobe /path/to/video
```


## 動画をフレームごとの連番画像に変換

```
ffmpeg -i /path/to/video -q:v 0 -vf scale=1280:-1 /path/to/image_%05d.jpg
```

- `-q:v 0`: 画質を落とさない
- `-vf scale=1280:-1`: 画像サイズ変更。 "-1" は等倍


## 連番画像を動画に変換

```
ffmpeg -framerate 30 -i /path/to/image_%05d.jpg /path/to/video
```


## 動画を切り出し

```
ffmpeg -ss [開始秒] -i /path/to/in -t [切り出す秒数] [-strict -2] /path/to/out
```


## 動画を連結

```
ffmpeg -i in1.mp4 -i in2.mp4 -filter_complex "concat=n=2:v=1:a=0" out.mp4
```

- `n` は連結する動画数
- `v` は映像を連結する(1)か否か(0)
- `a` は音声を連結する(1)か否か(0)


## 動画をリサイズ

```
ffmpeg -i /path/to/in -s 1280x720 /path/to/out
```
Gradle Properties の設定方法

Gradle のプロパティには様々な設定方法があります。 きっと他にもあると思いますが、よく使いそうなものとしてまとめました。

## システムプロパティ

コマンドラインから `-D` をつけて渡すのは **システムプロパティ**

```
./gradlew -Dsomething=value
```

## プロジェクトプロパティ

コマンドラインから `-P` をつけて渡すのは **プロジェクトプロパティ**

```
./gradlew -Psomething=value
```

システムプロパティを設定するようにしてプロジェクトプロパティを渡すこともできる。 先頭に `org.gradle.project.` をつける。 

```
./gradlew -Dorg.gradle.project.something=value
```

このようにすると `-Psomething=value` と同じように、 プロジェクトプロパティが使える。

Gradle のスクリプトの中では `System.getenv(something)` のように書くことで、 環境変数
 `something` の値を取得することができるが、 先頭に `ORG_GRADLE_PROJECT_` のついた環境変数はプロジェクトプロパティとして扱うことができる。 `ORG_GRADLE_PROJECT_something` は プロジェクトプロパティ `something` の値になる。

## gradle.properties

`gradle.properties` というファイルを作り、次のように記述すると、 プロジェクトプロパティとシステムプロパティを定義できる。

```
first=firstValue
systemProp.second=secondValue
```

`first` は プロジェクトプロパティ、 `second` はシステムプロパティ。
zsh-bd の Tab 補完で大文字・小文字を無視する

[Tarrasch/zsh-bd](https://github.com/Tarrasch/zsh-bd) は親ディレクトリへの移動を簡単にするプラグイン。

Tab 補完で大文字・小文字を区別しないようにするには `compctl` コマンドを用いる。
コマンドは、 `.zshrc` かソースコードに記載する。
以下の `'m:{[:lower:]}={[:upper:]}'` は好みのマッチングパターンに変更可能。
詳しくは、[zshで適度なcase-insensitive補完](https://qiita.com/watertight/items/2454f3e9e43ef647eb6b)を参照。

## 手法1: `.zshrc` を編集
`.zshrc` 内で zsh-bd を読み込んだ後、以下のコマンドを追加。

```zsh:~/.zshrc
compctl -M 'm:{[:lower:]}={[:upper:]}' -V directories -K _bd bd
```

## 手法2: ソースコードを編集
zsh-bd のソースファイル `bd.zsh` の最後の行を変更。

```zsh:bd.zsh
#compctl -V directories -K _bd bd
compctl -M 'm:{[:lower:]}={[:upper:]}' -V directories -K _bd bd
```

## 追記
上記の内容も含めて `zsh-bd` を再実装してみました。
[zsh-bd を再実装してみた](https://qiita.com/ryutok/items/4e4d045c2e4d29d9b667)
Cognos Analytics のデータ・サーバー接続のチューニング

#データ・サーバー接続のチューニング
Cognos Analyticsのデータ・サーバーの機能を使用していて、Cognos Analyticsノードと、データソースのノード間のネットワークが細い時、データ・サーバーの接続プロパティーに以下のパラメーターを入れて最適な値を指定する事で、チューニングが行えます。
Cognos Cloudを使っているとか、IaaSクラウド上で構成とかで、物理的にデータソースとロケーションが異なってしまっている場合などで、パフォーマンスが悪い時にご使用ください。

データ・サーバー接続の設定で、以下の赤枠の箇所に「ibmCognos.fetchBufferSize=1000」を記載してください。
※値はテストを行って、環境に応じて最適な値を見つけてください。
![001.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/f6bd4b36-7cf0-fccf-a8b8-c5e343aa5326.jpeg)

#参考情報
詳細な手順は、以下のTechnoteをご参照下さい。
**How to Increase the Row FetchSize for DQM data sources.**
http://www-01.ibm.com/support/docview.wss?uid=swg22011289
消化用本棚

# 【前置き】
いろいろ買って読んだりした本やら読んでないものの感想を付けたり付けなかったりする。

# 【本棚】
・RDB技術者のためのNoSQLガイド 2016年出版

[感想]
RDB触ったことある方向けのNoSQLとはなんぞや？という本。2016年とちょっと古いがNoSQL全体でまとめてる書籍が更に古いものしかなかったので購入。内容についてはNoSQLについての種類やどういうパターンでNoSQLを導入したほうがいいか？というナレッジ的なものが書かれていてRDBからNoSQL触ろうという方の導入にはお勧めできる。ただし実際使っていこうと思うと各種専門書があると思うのでそれを読んだ方がいいと思う。私は定番のMongoDBとRedisの導入部を知りたかったので結構満足


・Amazon Web Services 基礎からのネットワーク＆サーバー構築　2018年 2版

[感想]
AWSをとりあえず触って見る為の導入として購入。内容としてはAWSを使用しつつネットワーク構築方法を織り交ぜたHowTo本で、最終的にはAWSにＤＢサーバーとＷＥＢサーバーを構築し、WordPress導入まで行っている。いい所は本が薄く、ちょっと読みたいと思えば数時間で消化出来、経験値を補ってくれる。悪い所は詳しいインフラエンジニアが見れば内容薄すぎと言われかねないだろうという事・・・恐らく基本情報レベルのインフラかなぁ（人によりけり）と。個人的にはいろいろタメになる部分があったので結構満足。

・いまどきのＪＳプログラマーのためのNode.jsとReactアプリケーション開発テクニック

[感想]
JavaScriptをいい加減触ろうと思った所、Reactの技術を絡めて覚えたいなぁと思って購入した本。この本を読んでNode.jsとかに触れる事になり、JSってサーバーサイドいける様になったんや（今更）と驚愕した。でReactがいわゆるWebアプリケーションフレームワークみたいにテンプレ作ったりViewしたりすると目からウロコ的な情報が書いてあったりします。深くやるなら他の方が～とかamazonレビューにあったりするがもしNodo.jsとかも触れた事ない方には取り合えず読んでみるといいかなぁと思いました。ＪＳがいろいろあって標準化されES2015～と進化を遂げている個人的には一番熱い言語になりつつある。どこでも動くし導入も楽ならJSでいいんじゃね？という流れ、これからも要注目。

----
取り合えずここまで

# 【最後に】
読んだりストックする本を書き溜めて置くつもりなのでゆるーくどうぞ。
お勧めの書籍があれば連携下さい。
VS Codeからrspecを実行する

# 前提

Bundler (Gemfile) で rspec をインストールする場合を想定します。
また、`launch.json` は書き換えない方針とします。

# 手順

## 拡張機能のインストール

拡張機能 `Ruby (rebornix.ruby)` をインストールする。

## binstub の生成

bundle install 時に `--binstubs` オプションを付けて実行する。

```shell-session:実行例
$ bundle install --binstubs
```

## `launch.json` の生成

メニューから `デバッグ > 構成を開く` をクリック。（もしくは、コマンドパレットから `デバッグ: launch.json を開く (Debug: Open launch.json)` を実行）

`環境の選択` と聞かれるので `Ruby` を選択する。

（この操作で `.vscode/` 以下に `launch.json` が生成される）

## テストの実行

アクティビティ バー の デバッグ ビュー から以下のいずれかの構成を選択して `デバッグ > デバッグの開始 (F5)` をクリック。（もしくは、コマンドパレットから `デバッグ: 選択してデバッグを開始 (Debug: Select and Start Debugging)` を実行）

- `RSpec - all`
- `RSpec - active spec file only`
Webサービスを作ったので、その技術スタックの紹介

# 追記(2020) - 本サービスは終了しています。

## お断り

特に技術的に特別なことをしているわけではないので、実質サービスの宣伝ポストです。ごめんなさい。


## どんなサービス?

自分のWebサイトにダウンロードストア機能を追加して、デジタルデータを簡単に販売できるようにするサービスです。

[TRICLIN](https://triclin.com)

![triclin.com.png](https://qiita-image-store.s3.amazonaws.com/0/231669/3def7ce1-39c9-b7f2-5f1a-89b9aa2685d3.png)


<a href="https://triclin.com/store/10000" target="_blank">
<img src="https://triclin.com/api/v1/badge" /></a>

↑こんな感じのバッジをホームページやブログに配置できます。





## インフラ

AWS EC2 + RDSの鉄板構成です。Route 53がDNSです。
本当はRedisを使いたかったのですが、サーバー代が捻出できないのでスティッキーセッションです。
アップロードされたファイルはS3に突っ込んでいます。

デイジョブではオンプレのサーバーばかりだったので、実はクラウドをきちんと使ったのは初めてでした。あまりの便利さに驚いているところです。
あとは値段がもう少しわかりやすくなれば良いのですが。

ログにはSentryを使っています。サーバーの監視にはAntruisです。いつもSSL証明書の更新を忘れるので……。


## バックエンド

プログラミング言語はKotlinです。Javaと同じ感覚で使え、Javaの悪いところが治っているいい言語です。ScalaやClojureを選ばなかった理由は、私がScalaを使えるほど頭がよくなかったからです。KotlinはJavaプログラマーにとってなじみ深い作りで、安心してプログラミングができました。

HTTPサーバーにはRatpackを使用しています。これに関しては、おとなしくSpringにするかだいぶ迷いました。

* IoCコンテナー - 機能がコンテナーに強く統合されすぎている
* アノテーション - 何をするにもアノテーションが必要
* 重くて遅い

結局、単なるHTTPサーバーが欲しいだけなので、Springは「全部入り」なのが嫌でRatpackを選択しました。一方で、実際にRatpackを使ってみて、期待通りにいかなかったこともありました。
特にアプリケーションのロジックをサーバーと分離するという点では、Ratpackがノンブロッキングなサーバーという点で、ロジック中に`Promise`が散らばってしまいました。「DBアクセスだけだから大きな影響はない」と考えていたのですが、Webアプリケーションだと大抵の個所にDBアクセスが絡むため、結局Ratpackと強く統合されてしまいました。分かりやすいAPIと使いやすさは気に入っているのですが、やはりJavaでノンブロッキングなフレームワークは無理があったかもしれません。

理想的なフレームワークを探し続けているのですが、なかなか見つかりませんね。HTTPサーバーを決めるのは、本当に聖杯探しの旅のようなものです。


## フロントエンド

正直私はフロントエンドに詳しくないので、もっといいやり方があるのではないかと思っています。改善していきたいです。

フロントのコードはTypeScriptとVueで書いています。
KotlinのJavaScriptランタイムを使うことも検討しましたが、JavaScriptフレームワークは当たり前ですがJavaScript向けに書かれているので、AltJS言語ではどうしても自然に書けない部分が生じてきます。TypeScriptの良いところは、JavaScriptのスーパーセットとして、多くのフレームワークで違和感なく利用できるところです。特にVueは標準でTypeScriptのサポートがあるので、期待通りに使うことができました。

VueはReactよりもずっと導入が簡単なことが魅力だと思います。Vueのテンプレートは賛否両論あるでしょうが、JSXのようにプリプロセッサが必要ないのはメリットかと思います。

フロントのビルドにはnpmとGulpを使っています。GradleのタスクからGulpを呼ぶようにしています。

```groovy:build.gradle
task buildTypescript(type: FluentExec, dependsOn: resolveTypescript) {
    windows 'cmd', '/c', 'npm run build'
    linux 'npm', 'run', 'build'
}
```

バンドラーはrollupです。webpackはGulpと相性が悪そうだったのでrollupを選んだのですが、webpackでもよかったかもしれません。
Babelを通してgulp-uglifyして完成です。





## まとめ

技術面では、今後の安定性や拡張性がどうなるか、課題になってくると思っています。「プロダクトは技術が原因で失敗しない」とは言いますが、やはり使っていて楽しい技術を選びたいものです。
改善点はいろいろと残っていると思います。MVPという言い方は好きではありませんが、「動くものを出せ」の原則に従ってリリースです。

今後も改良を続けていきたいと思います。
[サクラエディタ]Grep置換で正規表現にマッチする部分をすべて置換したい

## 結論

**クリップボードから貼り付け** にチェックを入れて、**置換文字列をクリップボードにコピー** してから置換を実行する。

## ことの発端

デフォルト（**クリップボードから貼り付け** にチェックがない状態）のGrep置換の動作は、各行の最初にマッチした部分しか置換してくれないという残念な結果になった。。。

```text:Grep置換条件
置換前　：タブ（\t）
置換後　：半角スペース4文字
正規表現：チェック
```

```text:置換前テキスト
\t  \t  あいうえお
....\t  かきくけこ

**凡例**
 \t  ：タブ
 .   ：半角空白
```

```text:置換後テキスト（Expected）
........あいうえお
........かきくけこ

**凡例**
 \t  ：タブ
 .   ：半角空白
```

```text:置換後テキスト（Actual）
....\t  あいうえお
........かきくけこ

**凡例**
 \t  ：タブ
 .   ：半角空白
```

## 答えは公式ヘルプに（ただし分かりづらい）

公式ヘルプの [Grep置換](http://sakura-editor.sourceforge.net/htmlhelp2/HLP000362.html) を参照しても、最初はできるかどうかも分からない状態だったが、**クリップボードから貼り付け** の説明にある

```
正規表現置換の場合、通常「行置換」なのがクリップボードからの場合は「置換の繰り返し」になります。」 
```

を見て、これか？？と半信半疑で試してみたところ、期待通りの結果となることを確認できた。

## 補足

Grep置換は、2.2.0.0以降から利用できるそうです。
突然管理者ログインできなくなった

いろいろページの登録でしくじったので、drupalを再インストールした。

DBも作成でき、drupalのインストールも問題なく終わったのに、
いざブラウザから管理画面へログインしようとするとうまくログインできず。。

エラーの内容が

```
There have been more than 5 failed login attempts for this account. It is temporarily blocked
```

とでてきてパスワードを新しく更新してもログインできなくなってしまった。

ぐぐったらでてきました。
https://www.drupal.org/forum/support/post-installation/2010-03-01/how-to-unblock-my-own-admin-account-after-5-failed-login

ブロックされていたようで。

mysql上で下記を実行

```
delete from flood
```

それから再度パスワードを再設定して、ログインしたらログインできました。
Hack/HHVMのインストール方法と実行方法

最近業務でHack/HHVMについて調べることがあったのでまとめてみます。
特にphperの方や、静的言語を使ったことがない方向けの内容になっております。

今回はまずはインストール方法と実行方法について簡単にまとめます。
今後はhackの型やクラスや静的解析、エディタなどの開発環境もまとめていきたいと思います。
最後にhack/hhvmが適しているケースや今後のphpとhack/hhvmの流れについてもまとめていきたいと思います。

## Hack/HHVMとは
HHVM(Hip Hop Virtual Machine)とはFacebook社が開発したPHPまたはhackのコンパイラおよび実行環境です。

もともとは **HipHop for PHP(HPHPc)** という、phpプログラムをC++にコンパイルして高速化するための技術でした。古参のphperの方は記憶されている方も多いのではないでしょうか。

HHVMはその後継として開発されたもので、JITコンパイラによる高速化、最適化を実現しています。このへんの詳しい経緯は[wikipedia](https://ja.wikipedia.org/wiki/HipHop_Virtual_Machine)などでも紹介されているのでご覧ください。

一方、Hackはphpをベースにした言語ですが、phpに加えて以下の機能を持ち合わせており、HHVM環境で実行できます。

- 静的型付け(クラスプロパティなどにも対応)
- ジェネリクス
- Nullable型
- 複数のcollection型
- Lambda

今回はインストール方法と実行方法について簡単にまとめたいと思います。

## インストール方法

LinuxではUbuntuおよびDebian向けのパッケージが提供されています。
他にもHHVMのDockerイメージが提供されていたり、Macの場合ではHomebrewを使ってインストールすることもできます。

今回は Vagrantを使ってUbuntu 14.04 TrustyをVirtualboxで構築してみました。
詳細はインストール方法は[こちら](https://docs.hhvm.com/hhvm/installation/linux)をご覧ください。


```
vagrant init ubuntu/trusty64
vagrant up
```
ubuntuが起動したら`vagrant ssh`でログインして`sudo su`でrootになったあと、hhvmをインストールしていきます。

```
apt-get update
apt-get install software-properties-common apt-transport-https
apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xB4112585D386EB94

add-apt-repository https://dl.hhvm.com/ubuntu
apt-get update
apt-get install hhvm
```

## 設定ファイル
ubuntuのパッケージでは/etc/hhvmというディレクトリにphp.iniとserver.iniが生成されています。
ここで各設定を行うことができます。

## 実行
例えば`hoge.php`というファイルを作成して下記のようなプログラムを保存します。

```hh
<?hh
echo 'hoge';
```

そしてコマンドを実行します。

```
hhvm hoge.php
```
そうすると`hoge`と出力されます。
ご覧の通りいつもは`<?php`となっているところが`<?hh`となっています。
これでhhvmにこれからhackで書くよ、ということを宣言しています。

なお、実行するプログラムファイルと同階層のところに`.hhconfig`というファイルを置かないと`Fatal Error`になります。
本来はこの`.hhconfig`にいろいろ設定ができるのですが空でも動作します。

また`hhvm -m server -p 8080`のようにすることでサーバーモードとして起動することもできます。
上記では8080ポートへのアクセスをlistenしてhackアプリケーションを実行します。
また設定によってはfastcgi形式の通信を受け取ることもできるため`php-fpm`のようにnginxのバックエンドとして立てておくことが可能です。

次回はhackの特徴についてまとめたいと思います。
【Win / Wireshark】NICのIPヘッダーチェックサムオフロードの無効の方法（IP Header Checksum Offload）

ほぼ自分用のメモ書き扱いです。

画像もなく、わかりにくいと思います。すみません。

<h2>背景：wiresharkのパケットキャプチャの勉強中に、苦戦したため。</h2>

Wiresharkの設定で、プロトコル→IPv4の設定で、Validate the IPV4 checksum if possibleに、チェックを入れた場合、wiresharkでpcapデータを閲覧すると、エラーの嵐が起こると思います。

そこで、どうしてもip headerチェックサムを取得したい場合は、以下の設定をします。

田(windows)ボタン
↓
コントロールパネル\ハードウェアとサウンド\デバイスとプリンター
↓
自分のPCで右クリックで、プロパティ→タブ：ハードウェアで
→名前：Intel(R)..つまりNIC.. 　　種類：ネットワークアダプター
のものを選択して、プロパティ
↓
全般タブのドライバー詳細→設定の変更
↓
Intel(R)....のプロパティのウインドウが出てくる
→詳細設定タブ→IPv4Checksum Offloadが出てくるのでDisabled

で完了です。
※WIN7の場合


原因は、本来、送信側のIP header checksumをCPUが計算するはずが、最近のPCだとCPUの代わりにNICが肩代わりしてくれるため、ダミーのチェックサムをキャプチャしてしまうため（これはNICによるIP Header Checksum Offloadの機能）

わかりやすく書くと

L３でCPUがchecksumを計算せずに、ダミーのchecksumを投げる
↓
NICドライバー（ここでwiresharkがキャプチャ）
↓
NICで、チェックサムを計算する

このため、wiresharkは、ダミーのチェックサムをキャプチャしてしまうため、計算結果の整合性がとれず、エラーの嵐になります。

逆に受信側の場合は、上記の流れの逆になるので、とくに問題なし。
JavaScriptでのページリダイレクトについて改めて考えてみた。

# javascriptリダイレクトについて改めて考えてみた。
## 概要
この記事は以下の記事を読んで2018年5月に実装し直したものである。
[やはり、お前らのJavaScriptでのリダイレクト実装は間違っている](https://qiita.com/1987yama3/items/5ff58b6195fe6c3f268b)

おおきなポイントとしては

- 記事公開以降googleアナリティクスコードがanalytics.jsからgtag.jsに変わったこと
- リダイレクト後の"referrer="http://~~~""が気になるので消したい

ということ。

~~この問題、何も言わないでおいたら多分誰も気づかずに放置されるだけな気がするけど
気の回るエンジニアがどうします？と聞くとだいたいやってくれって言われるのつらい。
アナリティクス管理画面のアクセス解析をしたい。ちゃんと活かしてる人いたらごめんなさい。~~

## analytics.jsからgtag.jsへ

困ったことにいつの間にかgtag.jsという見慣れないものに変わったので
参照記事の
`ga('set', 'referrer', decodeURIComponent(kv[1]));`
というコードでは成り立たなくなっていたので、調べたところここの部分は
`gtag('config', 'UA-xxxxxxxx-x', {'page_referrer':kv[1]});`
というコードに置き換えられるらしい。

## リダイレクトのurlお掃除したい。

referrer="https\://facebook.com"みたいなのがurlにあるとアクセス解析してる感満載なので取れないかどうか試してみた。
`window.location.search=''`とかはページのリロードはしるのでだめだった。
histroyオブジェクトの書き換えならできた!!
`window.history.replaceState()`
replaceState使えばブラウザ履歴にも残らずです。
urlもきれいになった後にga送られるっぽいのでアナリティクスにノイズが入る問題も
クリアになったかも！

抜粋するとこんな感じ。
リダイレクト元のスクリプトはよしなに。

```.js
//url文字列取得
var url = window.location.href;
//kv[0]: referrer, kv[1]: http://~~ として
//exp: リファラの保存に使った文字列の正規表現。?もしくは&から始まる任意の文字列
var exp = new RegExp("(\\?|&)"+kv[0]+"="+kv[1]);
//urlからリファラの部分抜く
url = url.replace(exp, '');
//一応replaceSatateあるかチェックしてから更新
if(typeof(window.history.replaceState) === 'function') {
  window.history.replaceState(null, null, url);
}
//最後にga送信
gtag('config', 'UA-xxxxxxxx-x', {'page_referrer':kv[1]});
```
## 検証してみた
例えば英語ページから日本語ページへリダイレクトするケース。
facebookの投稿の公開設定を自分のみにしてアクセス。
<img width="527" alt="スクリーンショット 2018-05-14 18.55.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/79986/c130d476-4d15-f500-126b-1b521775a55f.png">

ちゃんと日本語ページになってるか確認。
<img width="351" alt="スクリーンショット 2018-05-14 18.55.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/79986/39d9ec7b-eae0-7644-d4a1-8f2d69890115.png">

検証用のアナリティクス画面を確認。

<img width="1484" alt="スクリーンショット 2018-05-14 18.55.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/79986/c3b0d7b5-527d-4a19-f185-8985c4be35f2.png">

問題なさそうです。
WEBアプリケーションにて「認証」と「認可」とは


# 認証
ログインのこと。

# 認可
その時のユーザーの状況によって
どの操作を許すかをコントロールする。

（例）
・ログインしていない時にedit画面にアクセスしてきたら、プロフィール画面へ飛ばす
Android Studioのバージョン上げたら"Gradle sync failed"と出てしまった場合の対処。

ノンプログラマーなのに無謀にもAndroidアプリ開発に手を出してしまったものです。ごめんなさい。

ストレージ整理を機に1年ぶりにAndroid Studio起動したら、「新しいバージョン出てるよ」的な表示が出たんで、ホイホイとアップグレードしました。
すると画面上部に"Gradle project sync failed. Basic functionality (e.g. editing, debugging) will not work properly"って出てしまって、"Try Again"とか試しても一向に治りません。
ビルドも全く通りません。

![スクリーンショット 2018-05-14 18.56.32.png](https://qiita-image-store.s3.amazonaws.com/0/226122/3584b1c8-29d4-f472-0fb1-8b239fb23837.png)


ひたすらググったらとりあず"apt"なるものが不要かつ悪さしてるっぽいことがわかってきました。

https://qiita.com/noboru_i/items/f477c99878078d2b78c1

さっぱり理解できないけどとりあえずソース内の以下の記述3箇所をコメントアウトしてみました。
（ソース全体から"apt"で検索してそれっぽいのを片端からコメントアウトしてみただけです。）

classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
apply plugin: 'android-apt'
apt 'com.github.hotchemi:permissionsdispatcher-processor:2.3.0'

で、"Try Again"するとエラー表示消えます。

そのままビルドすれば普通に通ります。めでたしめでたし... なのか？
そもそもaptってなんなの... ?

http://blog.64p.org/entry/2015/03/26/055347

コードを自動生成したい時に使う便利ツール、ってくらいの解釈でいいのでしょうか。
わからないけどこれ以上ここに時間割きたくないから解決したことにします。
PostgreSQL チートシート 入門

※{}の中身は、自分で置き換えてください。

### 最初に自分のuser(role)作成
まずpostgresというユーザが自動で作成されるので
それでログインする。

```
$ sudo su - postgres
```
次にuser(role)を作成

```
$ createuser {user name}
```
この時通常時使用しているユーザ名じゃないと色々と面倒になるので気をつけてください。

さらに全ての権限を与えておくと作業しやすいです。

```
$ sudo su - postgres
$ psql
postgres=# grant all privileges on all tables in schema public to {user name};
postgres=# alter role {user name} createdb;
```

## 一般のプロンプトによる操作
### Versionの確認
```
$ psql --version
```

### DBの一覧
```
$ psql -l
```

### DBの作成
```
$ createdb {db name}
```

### DBの削除
```
$ dropdb {db name}
```

### DBのバックアップ作成
```
$ pg_dump {db name} > {dumpfile name}
```
{dumpfile name}は、ディレクトリも指定できます。

### DBのリストア(復元)
```
$ psql < {dumpfile name}
```
{dumpfile name}は、ディレクトリも指定できます。

### DBに接続
```
$ psql {db name}
```

## DBに接続後の操作

### DBの一覧表示
```
db=> \l
```

### Tableの一覧表示
```
db=> \dt
```

### Tableのカラム表示
```
db=> \d {tablename}
```

### 外部ファイル複数命令文実行
```
db=> \i {file name}
```

### 拡張表示ON/OFF切り替え
拡張表示とは、一つのデータごとに表示するモード
普段は、OFFでいいが、データが多いときにONにする

```
db=> \x
```
### DBの接続終了
```
db=> \q
```
もしくは、Ctrl + D

## SQL文

### SQL:Table名の変更
```sql
db=> alter table {table name} rename to {new name};
```

### SQL:現在時刻の表示
```sql
db=> select now();
```

### SQL：テーブルの作成
```sql
db=> create table {samples (id serial primary key, title varchar(255), body text)}
```

id のtypeをintegerではなく
serial primary keyにすることで
主キーとして登録し、かつ自動で番号が更新される。
### SQL:テーブルの削除
```sql
db=> drop table {table name};
```

### SQL:テーブルのカラムにプライマリーキーを割り当てる
```sql
db=> alter table {table name} add primary key(id);
```

### SQL:テーブルのプライマリーキーを捨てる
```sql
db=> alter table {table_name} drop constraint "{table name} + _pkey";
```
例えば、テーブル名がsampleなら
drop constraint "sample_pkey";

### SQL:コメント
```sql
db=> create database /*ここを部分的にコメントアウトできます。*/ sample;
db=> create database sample; -- ここは、文末までコメントアウトできます。
```

参考：
[権限がなくてcreatedbができなくてしばらくはまっていました。](https://qiita.com/mochizukikotaro/items/197d526e71ef40544171)
docker-compose execでTTYの改行がおかしいとき

`docker-compose exec`でコンテナのbashにログインしたとき、現象として長いコマンドを打つと改行されずに、キャレットが同じ行をぐるぐる巡ったり、シェルの右端も短かったりする。

![2018-05-14 19_09_34.gif](https://qiita-image-store.s3.amazonaws.com/0/889/1e239ace-34d8-1deb-4ef4-d83acb96278b.gif)

この解決策としては、ログイン時に環境変数として`COLUMNS`と`LINES`を渡す:

```
docker-compose exec -e COLUMNS=$(tput cols) -e LINES=$(tput lines) web bash
```
Docker execやrunで入ったターミナルの幅が変なのを回避する

docker exec や run で長い文字を入力すると、改行されずに同じ行の先頭にキャレットが戻ってしまうという現象が発生することがあります。これはCOLUMNSとLINES環境変数を設定することで回避することができます。`docker-compose exec` でも同じ現象が発生する。

```bash
docker-compose exec -e COLUMNS=$(tput cols) -e LINES=$(tput lines) {container_name} bash
```

`container_name` は読み替えてください。

## 参考

* [Strange terminal behaviour inside docker #33794](https://github.com/moby/moby/issues/33794)
Web3 v1.0.0 を使用した ether と wei の相互変換

* Ethereum の通貨 ether にいくつかの単位があります。
* ether の最小単位は、wei と呼ばれます。
* 1 ether = 1000000000000000000 wei です。

# Web3 のインストール
* Web3 は JavaScript から Ethereum を使用するためのライブラリです。

```
$ npm install web3
```

# サンプルコード
 * Web3 v1.0.0 を使用した ether と wei の相互変換の方法は次の通りです。

```js
var Web3 = require('web3');
console.log(Web3.version);
// => 1.0.0-beta.34

const weiValue = Web3.utils.toWei('1', 'ether');
console.log(weiValue);
// => 1000000000000000000

const etherValue = Web3.utils.fromWei('1000000000000000000', 'ether');
console.log(etherValue);
// => 1
```

# Note
- Ethereum 関連の情報は https://scrapbox.io/sushiether/ に集約することにしました。
- この記事の内容に変更・更新がある場合は、以下の URL を更新します。
- https://scrapbox.io/sushiether/Web3_v1.0.0_を使用した_ether_と_wei_の相互変換