OmniAICreator/Qiita-1.07M huggingface dataset:
what3wordsをiOSでいじってみる



## はじめに

前回は,[what3words APIを使ってみる](https://qiita.com/yodaaa/items/bf61a3812c1efc03f5d6)を書きました.

iOSからwhat3wordsを使うには, [w3w-swift-wrapper](https://github.com/what3words/w3w-swift-wrapper)を使用します.
このREST APIを使うことで, 前回の記事をと同様のこと(forward geocoding, reverse geocoding)をおこなうことができます.

## APIKEY取得
前回の記事の方法で取得できますので, そちらで取得しておいてください.

## インストール

* CococaPods(iOS 8+, OS X 10.9+)

```Podfile.
platform :ios, '8.0'
use_frameworks!

target 'MyApp' do
    pod 'what3words', :git => 'https://github.com/what3words/w3w-swift-wrapper.git'
end
```

* Carthage (iOS 8+, OS X 10.10+)

```Carthage.
github "what3words/w3w-swift-wrapper"
```

* Swift Package Manager

```Package.swift
import PackageDescription

let package = Package(
    name: "YOUR_PROJECT_NAME",
    targets: [],
    dependencies: [
        .Package(url: "https://github.com/what3words/w3w-swift-wrapper.git", versions: Version(1,0,0)..<Version(1, .max, .max)),
    ]
)
```

* Manually (iOS 7+, OS X 10.10+)
 
W3wGeocoder.swiftを自身のプロジェクトにドラッグし, 追加しましょう.

## サンプルコード
```AppDelegate.swift
//import文を追加
import what3words 

//func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {}の中に追加
//自身のAPIKEYに置き換える
W3wGeocoder.setup(with: "<Secret API Key>")
```
### Forward Geocode
```
W3wGeocoder.shared.forwardGeocode(addr: "index.home.raft") { (result, error) in
    print(result)
}
```


### Reverse Geocode
```
let coords = CLLocationCoordinate2D(latitude: 51.4243877, longitude: -0.34745)
W3wGeocoder.shared.reverseGeocode(coords: coords) { (result, error) in
    print(result)
}
```

### AutoSuggest
```
W3wGeocoder.shared.autosuggest(addr: "index.home.raft") { (result, error) in
    print(result)
}
```

### StandardBlend
```
W3wGeocoder.shared.standardBlend(addr: "plan.clips.a", completion: { (result, error) in
    print(result)
}
```
v-cloakが効かない

## 一瞬表示される {{ hoge }} を隠したい

一瞬下記のような表示がされてしまう。

```

{{ hoge }}

```

これを防ぐために、`v-cloak`ディレクティブが用意されている。

## v-cloak ディレクティブ

[https://jp.vuejs.org/v2/api/#v-cloak](https://jp.vuejs.org/v2/api/#v-cloak)

> このディレクティブは Vue インスタンス が用意されるまでの間、コンパイルされていない Mustache バインディングを隠すのに使うことができます。

※Mustache バインディング ( `{{ }}` <- これ )

サンプルのとおりにすればよかったものを、下記のように記述した。

```

<div id="foo" v-cloak style="display:none;">
{{ foo }}
</div>

```

これだとまったく表示されなかった。

サンプルのとおりに、インラインでスタイルを書かないようにして解決。

```
<style>
[v-cloak] {
  display: none;
}
</style>
```

```
<div id="foo" v-cloak>
{{ foo }}
</div>
```

## 結論
`v-cloak` ディレクティブを使うときは、インラインで `display:none;` のスタイルを書いちゃだめ。
pipenvでPIPENV_PIPFILE環境変数を指定する場合は絶対パスにする

# Pipenvとは

Pythonのパッケージ管理ツール（Rubyでいうところのbundlerのようなもの）としてpipenvが標準的になってきている。
https://pipenv-ja.readthedocs.io/ja/translate-ja/

Pipfileで必要なパッケージを指定し、`pipenv install`するとパッケージがインストールされた仮想環境が構築され、以後`pipenv shell`を実行するとその仮想環境上のshellで作業することができる。
また特定のコマンドを実行したい場合は、`pipenv run [実行したいコマンド]`とすれば実行できる。

# Pipfileのパスを指定する

さて、デフォルトでは実行時のカレントディレクトリにある"Pipfile"という名前のファイルを参照して仮想環境を構築する。
しかし、バッチ処理などをしたい場合に任意のディレクトリからアプリケーションを実行したい。つまりカレントではない場所にあるPipfileを指定して処理を行いたい。

カレントディレクトリにはないPipfileを使うには環境変数`PIPENV_PIPFILE`でパスを指定すればよい。

```bash
export PIPENV_PIPFILE=/path/to/Pipfile
pipenv run python my_script.py
```

こうすれば事前にこのパスでインストールした仮想環境を使って`python my_script.py`を実行することができる。

# PIPENV_PIPFILEに相対パスを使うとバグる

ただし、相対パスを使うとバグる場合がある。例えば以下のようなシェルスクリプトを使って起動することを考える。

```bash:run.sh
script_dir=$(cd $(dirname ${BASH_SOURCE:-$0}); pwd)               # 実行中のシェルスクリプトがあるパスを取得
export PIPENV_PIPFILE=$script_dir/../Pipfile                      # そのシェルスクリプトの親ディレクトリにあるPipfileを参照
pipenv run python $script_dir/my_script.py                        # pythonを起動
```

するとpythonを実行しようとしても必要なモジュールがないというエラーが出ることになる。

なぜか？
こちらのページにヒントがあった。以下、引用する。
[pipenvで任意のディレクトリからアプリケーションを実行したい](https://ja.stackoverflow.com/questions/46841/pipenv%E3%81%A7%E4%BB%BB%E6%84%8F%E3%81%AE%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%81%8B%E3%82%89%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%97%E3%81%9F%E3%81%84)

"こうなるのは仮想環境が（カレントディレクトリに対してではなく）Pipfileのパスに対して作られるためのようです。残念ながら、この振る舞いについて明記されたドキュメントは見つけられませんでした。以下にソースコードの該当箇所を抜粋します。"

```py:project.py
    @property
    def name(self):
        if self._name is None:
            self._name = self.pipfile_location.split(os.sep)[-2]
        return self._name
```

となっている。ここで`pipfile_location`には`PIPENV_PIPFILE`で指定したファイルパスが入っていると思われる。
先ほどはパスを相対パスで指定してしまったので、`self.name = ".."` となってしまったものと思われる。

# 解決法

よって先ほどの挙動を修正するにはシェルスクリプトを以下のように書き換える必要がある。

```bash:run.sh
script_dir=$(cd $(dirname ${BASH_SOURCE:-$0}); pwd)
PIPFILE=$script_dir/../Pipfile
export PIPENV_PIPFILE=$(cd $(dirname $PIPFILE) && pwd)/$(basename $PIPFILE)    # 正規化された絶対パスにする
pipenv run python $script_dir/my_script.py
```
コンテナーは再起動せずにredmineのみ再起動したい


ただそれだけです

dockerも触り始め、k8sも触り始めの状態です

コンテナーのredmineにpluginを入れたかった
みんな再起動して、再起動してというので、、、、
調べた

##よくみる再起動手順が使えない

http://redmine.jp/tech_note/apache-passenger/

tmp/restart.txtを作ってもう一回アクセス

**動かね**

コンテナーを利用するとこの方法は使えない様子



コンテナー再起動すればいいのか
でも外に保存してないデータ消えたら困る（保存しろ）

誰かやってる人いないか。。。


##redmineのみを再起動

いました
https://github.com/sameersbn/docker-redmine/issues/196

`$docker exec -it redmine supervisorctl restart unicorn`

調べていたときは
`$kubectl exec -it [コンテナ名] /bin/bash`
でログインしていたので、直接実行


```$supervisorctl restart unicorn```



無事再起動して、プラグインもインストールできました

上記のリンクはsameerasbn/docker-redmineですが、
私はbitnami/bitnami-docker-redmineでした。
Pythonの空配列とNoneの同時判定

## 空配列とNoneの判定

Pythonで
Objectが空配列かNoneの場合、後続の処理をしたくないことがあるとする。

素直に書くと
こんな感じ

```python
a = []

# Noneを弾く
if a is None:
  return
# 空配列を弾く
if len(a) == 0:
  return

do_process()
```


今日下記で書けることを知った。

```python
a = []

if not a:
  return

do_process()
```



## 参考URL:
 [Why does “[] == False” evaluate to False when “if not []” succeeds?](https://stackoverflow.com/questions/10440792/why-does-false-evaluate-to-false-when-if-not-succeeds)

## 所感
もちろん判定一回の後者の方がよいが、これを数ヶ月後まで覚えておける自信がない。
腕時計がミルクの時間を教えてくれるようにした。

# スマートウォッチ（以後スマォ）を買ってもらった
こんにちわ。

私事ですが、先日誕生日をむかえ、妻にスマォを買ってもらいました。
Wear OS by Google が入ってるやつです。
スマォは携帯の通知が見れたり、散歩の時に心拍数を測って健康にしてきたりかわいいヤツです。
Googleアシスタントも内蔵されているので、スマォに向かって「OK Google」なんてたまに話しかけたりもします。

そんなスマォを使ってもっと日常を便利にしたいと思いました。
ちょうど夏に子供が産まれたばかりなので、スマォがミルクの時間を教えてくれるようにちょっとチャレンジしてみましょう。
Googleアシスタントに「リマインダー」の機能がある事は知っていますが、自分で作るから楽しいのです。

さっそく作ってみましょう。

# 構成図
![ミルクの時間.png](https://qiita-image-store.s3.amazonaws.com/0/234427/d661f65c-5da3-c8b8-2836-61ab8bd17a37.png)


こんな感じです。
「ミルクのんだくん」はこのために作成したGoogle アシスタント のアクションの名前です。（未公開）
赤矢印の流れと青矢印の流れでそれぞれ役割が違いますので、それぞれ概要を書いていきます。

#### プッシュ通知を送るための時間とユーザIDを取得する（赤矢印）

1. 僕がスマートスピーカーにミルクをあげた事を言う
2. スマートスピーカーが「ミルクのんだくん」を起動する
3. 「ミルクのんだくん」が、僕にプッシュ通知を送るために、ユーザIDとミルクを飲んだ時刻を、Firebase Realtime Databaseに格納しにいく
4. 格納しおわる
5. 「ミルクのんだくん」が「あとで通知するで」と返信を返す
6. 僕がそれをスマートスピーカーから聞く。

#### プッシュ通知を送る（青矢印）

1. VPSで動いているcronがCloud Functions for Firebaseを定期実行（5分間隔）する
2. Firebase Realtime Databaseにアクセスし、格納されているユーザIDとミルクを飲んだ時刻を取得する
3. 現在時刻がミルクを飲んだ時刻より3時間たっていた場合、スマートフォンにプッシュ通知を送り、Firebase Realtime Databaseから該当レコードを削除する
4. スマートフォンの通知がスマォに連動される
5. 僕が通知を受け取る！

# 実装してみる
実装のHow Toは書きませんが、参考URLを書いて置きます。
[Push notifications](https://developers.google.com/actions/assistant/updates/notifications)
こちらを見ればPushの実装方法が書かれています。

# プッシュ通知の罠

早速実装してみたものの上手くいきません。
Googleアシスタントからのプッシュ通知がサイレント通知なのです。
めちゃくちゃ控えめなのです。
携帯がピクリともしないわりに、しれっと通知が来ているのです。
これではスマォもピクリとはしません。
黙ったままです。
サイレントスマォ。

# プッシュがダメならメールを送ればいいじゃない

プッシュ通知はやめてメールを送るようにします。
Gmailからメールを送りましょう。
下記のように修正を行います。

- 赤矢印の③で取得していたユーザIDをmailアドレスに変更
- 青矢印の③で送っていたPush通知をGmail送信に変更

# 再び実装してみる
同様にHow Toは書きません。URLを置いておきます。

Actions on Google でのmailアドレス取得はこちらを使います。
[Account linking with Google Sign-In](https://developers.google.com/actions/identity/google-sign-in)

Gmail送信にはこちらのmoduleを使用します。
[Nodemailer](https://nodemailer.com/about/)
OAuth2でGmailを送る方法は色々ありますので省略します。


# できた

![P_20181114_145453.jpg](https://qiita-image-store.s3.amazonaws.com/0/234427/17ff8082-eb5d-9a9f-731a-20ebedaa105b.jpeg)
できました。ミルクの時間になるとスマォが震えて教えてくれます。
ういやつ、ういやつ。
PHPの正規表現で^$より\A\zがいい理由

正規表現のメタ文字とエスケープシーケンスについておさらい。

* メタ文字 `^`: (ハット記号) 検索対象（複数行モードでは行）の始まりを言明
* メタ文字 `$`: (ドル記号) 検索対象の終わりあるいは終端の改行文字の前（複数行モードでは行の終わり）を言明
* エスケープシーケンス `\A`: 検索対象文字列の始端（複数行モードとは独立）
* エスケープシーケンス `\z`: 検索対象文字列の終端（複数行モードとは独立）

> 言明 \A, \Z, \z は、（アンカー で説明する）ハット記号やドル記号とは 異なり、**オプション設定によらず、文字列の始端または終端だけに マッチします**。これらの言明は、PCRE_MULTILINE および PCRE_DOLLAR_ENDONLY オプションの影響を受けません。 \Z と \z との違いは、 \Z は文字列の末尾の改行の前の位置および文字列の 終端にマッチするのに対し、\z は文字列の終端にのみ マッチすることです。

つまり、文字列全体の始端と終端の意図で`^`や`$`を使っているなら、`\A`と`\z`のほうが厳密だよ、とういこと。

```php
assert(preg_match('/^hello$/', 'hello') === 1);
assert(preg_match('/^hello$/', "hello\n") === 1); // 末尾に改行(LF)がある文字列が通る(意図と違う動き)
assert(preg_match('/\Ahello\z/', "hello") === 1);
assert(preg_match('/\Ahello\z/', "hello\n") === 0); // 末尾に改行があると通らない(意図通り)
```

## 参考

* [PHP: メタ文字 - Manual](http://php.net/manual/ja/regexp.reference.meta.php)
* [PHP: エスケープシーケンス - Manual](http://php.net/manual/ja/regexp.reference.escape.php)
Mac 環境に Emacs 26.1 インストールする方法を丁寧に説明してみる

(2019 7/12 追記)
※ `brew install emacs` で 26.2 がインストールされるようになっていたので適宜読み替えてください
※ 私の[ブログ](https://suwaru.tokyo/mac%e3%81%aeemacs%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab%e6%96%b9%e6%b3%95%e3%82%92%e4%b8%81%e5%af%a7%e3%81%ab%e8%a7%a3%e8%aa%ac%ef%bc%81%e3%80%90path%e8%a8%ad%e5%ae%9a%e3%80%91/)でもう少しわかりやすい記事にしました

# Mac 環境の Emacs インストールを丁寧に説明してみる

**PATH の通し方**まで書いてる記事が少なかったので。

この手順で行うと現在バージョン **26.1** がインストールされます。

## 現在の Emacs 確認

まず `emacs --version` でバージョンを確認します。
Mac デフォルトで起動する Emacs は現在バージョン **22.1.1** と古く、Emacs を便利にするパッケージが簡単に扱えないため新たに別のものを導入します。

## brew で Emacs インストール

[brew が入っていなければここに従ってインストール](https://brew.sh/index_ja)

```sh
brew install emacs
```

## PATH を通す

`brew install emacs` で `/usr/local/Cellar/emacs/[バージョン]` に Emacs の実ファイルがインストールされますが PATH は `/usr/local/bin` で通します。　　

`/usr/local/bin` とは自分が brew などでインストールしたパッケージに関するコマンド (シンボリックリンク) が置いてある場所です。PATH にこの場所を追加することで、わざわざ `/usr/local/bin/emacs` と入力して実行しなくても `emacs` だけで実行できるようになります。

では `echo $SHELL` して `/bin/bash` と表示されたらシェルは **bash** なので `~/.bash_profile` に以下を記述してください。私は **zsh** を使っているので `~/.zshenv` に記述します。

```sh:~/.zshenv
export PATH=/usr/local/bin:$PATH
```
Terminal の画面を開き直して再度 `emacs --version` でバージョンを確認してみてください。現在の新しいバージョンになっているはずです。

### emacs コマンドでうまく動かない場合

`emacs-26.1` というコマンドでしか動かなかったり、`emacs` で GUI の Emacs が起動してしまう人向けです。

#### やること

1. `/usr/local/bin` 内にシンボリックリンクを作成する (コマンドの新規作成)  
2. 干渉しているシンボリックリンクを削除する (コマンドの削除)

```sh
#
# emacs-26.1 というコマンドでしか動かないので、emacs というコマンドで再定義する例
#

cd /usr/local/bin

# 既存シンボリックリンクの確認 (出力内容の頭に l が付いているものがシンボリックリンク)
ls -la

lrwxr-xr-x  1 [ユーザ名]  admin    37B  8 31 15:48 emacs-26.1 -> ../Cellar/emacs/26.1_1/bin/emacs-26.1

# emacs という名前でシンボリックリンクを作成
ln -s ../Cellar/emacs/26.1_1/bin/emacs-26.1 emacs

# 既存の emacs-26.1　を削除
unlink emacs-26.1

# シンボリックリンクの確認
ls -la

lrwxr-xr-x  1 [ユーザ名] admin    37B 11 14 12:04 emacs -> ../Cellar/emacs/26.1_1/bin/emacs-26.1
```

Terminal の画面を開き直して確認してみてください。

### 補足

#### パスの調べ方

```sh
# 現在どのパスが適用されているか確認。/usr/bin/emacs だと Mac デフォルトの Emacs になっている
which emacs
/usr/local/bin/emacs

# emacs で通るパスの数だけ場所が表示される
where emacs
/usr/local/bin/emacs
/usr/bin/emacs
```

#### エイリアスを作って簡単に起動する

**bash** の人は `~/.bashrc` に記述してください。**zsh** の人は `~/.zshrc` に記述してください。

```sh:~/.zshrc
alias e="emacs"
```

`source ~/.zshrc` を実行すると、`e` で Emacs が起動するようになります。
railsのseedの書き方いろいろ

#seedファイルって何？
seedファイルというのは簡単に言うと初期データのことです。　　
例えば、コーディング中に何らかの理由でデータベースをリセットした場合中に入っているデータももちろんですが消えてしまいます。
ですが、ユーザー登録機能がある場合リセットするたびに毎回ユーザー登録をし直す必要が出てきます。　　
仮にそれが普通のユーザーだった場合はそれでもいいかもしれませんが、アドミン権限をユーザーにrollカラムをつける形でアドミン権限の設定を行っていた場合、ユーザー登録のあとにコンソールでアドミン権限を付与するという2度手間になってしまいます。　　
なのでrailsではseedファイルに入れておきたいデータを```db/seeds.rb```に記述していきます。　　

今回は以下のような、userが複数のarticleを持つような構造を持つテーブルを考えたいと思います
<img width="574" alt="スクリーンショット 2020-05-27 14.46.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281558/1ab07dbf-6bd5-9bc5-f4d4-98a3409f4899.png">


# 基本

```ruby
User.create!(
   email: 'test@test.com',
   name: 'テスト太郎',
   image: File.open('./app/assets/images/test.jpg')
)
```

おそらくこの書き方が一番ベーシックで基本となる書き方だと思う。
なんかよくわからないときはこうやって書いておけばなんとかなる。


## 複数のユーザーを一気に作る

```ruby
  5.times do |n|
    User.create!(
      email: "test#{n + 1}@test.com",
      name: "テスト太郎#{n + 1}",
      image: File.open('./app/assets/images/test.jpg')
    )
  end
```
rubyのfor文を使って複数のユーザーを作っていくやり方です。
userとかだとemailはuniqueバリデーション（同じカラム内に同じデータは存在できない）がかかってることが多いと思うのでemail内に変数を入れて同じデータが作成されないようにしています。

## 関連記事を作る
```ruby
User.all.each do |user|
  user.articles.create!(
    title: 'タイトル',
    body: 'テキストテキストテキストテキスト'
  )
end
```

このような形で実装するとuserに紐づいたarticleを作成することができる
(複数形になってるところが割とハマりポイントなのでお気をつけて！)

# 番外編

## 配列系1

```ruby
User.create!(
  [
    {
      email: 'test1@test.com',
      name: 'テスト太郎',
      image: File.open('./app/assets/images/test.jpg')
    },
    {
      email: 'test2@test.com',
      name: 'テスト徹子',
      image: File.open('./app/assets/images/test.jpg')
    }
  ]
)
```

個別にレコードを複数作成したいときはこんな感じに配列の中に入れてあげると、一気に作成してくれる。

## 配列系2
```ruby
[
  ['test1@test.com', 'テスト太郎', image: File.open('./app/assets/images/test.jpg')],
  ['test2@test.com', 'テスト徹子', image: File.open('./app/assets/images/test.jpg')]
].each do |mail, name, img|
  User.create!(
    { email: mail, name: name, image: img}
  )
```

この書き方は無駄な記述が一番少ないような気がする。
でも、カラム数が多くなるとどれがどのカラムを指しているのかがわかりにくくなるのが欠点かと、、、


#まとめ
seedファイルを書いたあとは

```console
rails db:seed
```

としてあげることでseedに書かれた内容をデータベースに反映させることができます。
unityのdll読み込みで謎の現象あったのでメモ

#Unityで謎のDllNotFoundと
・開発PCではnativePluginとしてc++ビルドdllをプロジェクトに含めて動いていた
・GPDPocketで動かそうとしたらDllNotFound（同じプロジェクト）
・dependencywalkerで依存すべて確認、マルチスレッド化でdll一個に済むようにしたり
　そのPCでビルドしてexe状態で動く環境にしたり、v140ランタイム、win10sdk入れたり
　色々やったけどDllNotFound
・万策尽きる
#その解決法（たぶん邪道）
・unityから起動したVSプロジェクトで参照追加でそのdll指定したらエディターで動いた。何故か。
・unityビルドしてもdllが含まれなかったが、実行ファイル直下にdll手動で置いたら動いた。

##環境
・開発PC：win10、vs2015、unity2017.3
・GPDPocket：win10,vs2017（動くよう調整した）、unity2017.3

※こんな不思議な事があって、外法でこうやったら動いたという記録です。
【IoT】ボタン長押しで電源OFFする回路とプログラムを考えてみた

# はじめに
会社で*RaspberryPi*を使ったモバイルIoTデバイスの開発にチャレンジしていますが、Raspbianを搭載したRaspberryPiは**OSが立ち上がるまで何もできない**ため、電源周りの制御が組みづらいのかなと思っています。

例えば最近のスマホでは、電源ボタンに下記のような機能が割り当てられていることが多いですよね。

- 電源が切れた状態で電源ボタンを押すと**ON**
- 起動した状態で長押しすると**OFF**
- 起動した状態で通常の押下は**ロック**

しかし、普通のタクトスイッチに**長押ししたら通電する**なんて便利機能はありません。
これも何らかの仕掛けで通電の状態を制御する必要がありますが、OSが立ち上がっていない状態でも機能する必要があるため、*RaspberryPi(Raspbian搭載)*のような**OSの中で動作するアプリケーション**では手が出せない領域になってきます。

そこで、おすすめなのが*ATtiny*などの**小さなマイコンとRaspberryPiを組み合わせる方法**です。
*Arduino*(*ATmega*シリーズ)が有名ですが、そこまで大きなマイコンでなくても、プログラムの大きさや制御する内容によってはもっと小さなマイコンで事足ります。

上記のような電源制御の回路とプログラムを考えてみましたので、参考にしてください。

# Tinkercadで手軽に試してみる

<a href="https://www.tinkercad.com/"><img width="153" alt="2018-11-14_13h45_46.png" src="https://qiita-image-store.s3.amazonaws.com/0/165224/dc79964c-6691-90b4-3490-fc393a8f81fa.png"></a>

IoTデバイスを開発するためには部品を購入する必要がありますが、*AT*シリーズは *[Tinkercad](https://www.tinkercad.com/)* でシミュレーションすることができます。
電子回路のみのシミュレーションもできますし、*Arduino*や*ATtiny*もシミュレーションできますので、組み合わせて動作を確認することができます。
Amazonでポチる前に、ある程度の動作確認ができてから部品を購入する、ということもできますね。

今回は、*Tinkercad*を使って電子回路とプログラムをご紹介します。

# 作ってみた
電子回路とATtiny85のプログラムに分けてご紹介します。
今回出来上がったプロジェクトはこちらから試すことができます。

**[:link: Tinkercad：電源ボタン長押しOFFサンプル](https://www.tinkercad.com/things/k1QBhTcr6Hp)**

## 電子回路
ブレッドボード上に下記の部品を配置しました。

- 電源ボタンに該当するタクトスイッチ
- 電源（のMOS-FET）を制御するATtiny85
- 電気を必要とする部品（話の流れ的にRaspberryPiを配置するべきですが、Tinkercadに登録されていないためLEDを代用しています）
- 電源そのもののスイッチの役割を担うMOS-FET(N型)

また、抵抗はATtinyに対してはプルダウン用、LEDに対しては負荷を下げるために使用しています。
<img width="609" alt="2018-11-14_13h39_42.png" src="https://qiita-image-store.s3.amazonaws.com/0/165224/045e473f-b65e-c57d-f84b-88c89e729bbd.png">

なお・・、MOS-FETを使用せず、直接ATtiny85からLEDに電流を流すこともできますが、たとえばたくさん電流を消費する部品の電源としたい場合、ATtinyの中を大電流が流れるとマイコンチップを壊して（焦がして？）しまいます。
なので、ゲートに電圧をかけるとドレインからソースに電流が流れる、という性質を持ったMOS-FET（トランジスタでもOKです！）を電源スイッチに利用するのが一般的のようです。

## プログラム
ATtiny85のプログラムはC言語で記述します。
下記のように（もう少し整理できるかもしれませんが。。）ONとOFFの状態によって通電の経過時間を見るように制御しています。

```c
int flg = 0;
int processed = 0;
unsigned long time = 0;

void setup()
{
  pinMode(5, INPUT);
  pinMode(0, OUTPUT);
  digitalWrite(0, LOW);
}

void loop()
{
  unsigned long now = millis();

  if(digitalRead(5) == HIGH) {
    if (time == 0) {
      time = now;
    }

    if (processed == 0) {
      if (flg == 0) {
        // OFF to ON
        digitalWrite(0, HIGH);
        flg = 1;
        processed = 1;
      } else if (now - time >= 3000) {
        // ON to OFF
        digitalWrite(0, LOW);
        flg = 0;
        processed = 1;
      }
    }
  } else {
    time = 0;
    processed = 0;
  }
  
  // wait 100ms
  delay(100);
}
```
変数```flg```が```0```のときは電源がOFF、```1```のときONとしています。
5番ピン（ATtiny左下）でタクトスイッチの通電状態を読み取ります。
タクトスイッチが押下（通電）になっていれば、```HIGH```になります。
```flg```がONの時にタクトスイッチが押されると、即座に電源をONにします。
逆にOFFの時にタクトスイッチが押されると、3000ms経過した（押し続けた）のちに電源をOFFにします。
電源のON/OFFは0番ピン（ATtiny右上）を```HIGH```にすることで電圧をかけてMOS-FETの通電を開始します。
```delay```（ポーリング間隔）は100msとしました。

# まとめ
IoTが世間で賑わいを見せていますが、私たちが実際に手にしている製品はかなり高度な制御がなされています。
また、書き込みのできるROMもかなり手ごろな価格で入手できる時代になりました。
どうしても１チップでやり切らないといけないケースは稀だと思いますので、難しいことは別の部品を使って組み合わせてみる、というやり方も試してみてください。
CloudFormation Drift Detectionを試してみた

投稿内容は私個人の意見であり、所属企業・部門見解を代表するものではありません。

##はじめに
昨年(2017年)のRe:Inventで発表されたCloudFormation Drift Detectionがリリースされました。
https://aws.amazon.com/jp/blogs/aws/new-cloudformation-drift-detection/

CloudFormation Drift Detectionは、CloudFormationで作成したStackのリソースに対して手動で変更したものを検出して表示する機能です。

手動で変更してしまった後で、変更箇所とは別の箇所を変更するためテンプレートを修正してupdate stackをした場合は、手動で変更した箇所が元に戻ってしまうといったことが起こります。

今回リリースされたCloudFormation Drift Detectionは、変更内容を検知することにより、事前にテンプレートに手動変更の内容を反映することで、意図しない挙動を防ぐことが可能になります。

サポートしているリソースは、以下の通り
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/using-cfn-stack-drift-resource-list.html?icmpid=docs_cfn_console

##雰囲気を掴むために動かしてみる

###流れ
CloudFormation(以降はcFnと表記)でセキュリティグループを作成する
セキュリティグループのCidrIPを手動で変更する
テンプレートファイルのPortを変えてUpdate Stackする
Drift Detectionする

###CloudFormation(以降はcFnと表記)でセキュリティグループ作成する
```yaml
AWSTemplateFormatVersion: '2010-09-09'
Resources:
  SecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      VpcId: vpc-26505643
      GroupDescription: SecurityGroup
      SecurityGroupIngress:
      - IpProtocol: tcp
        FromPort: '80'
        ToPort: '80'
        CidrIp: 0.0.0.0/0
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/271c9860-c9d4-5b24-e0eb-adcc0f163cd0.png)

###セキュリティグループのCidrIPを手動で変更する

![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/f97da183-e830-7813-38e4-9edf7a1ce205.png)

###テンプレートファイルのPortを変えてUpdate Stackする

```yaml
AWSTemplateFormatVersion: '2010-09-09'
Resources:
  SecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      VpcId: vpc-26505643
      GroupDescription: SecurityGroup
      SecurityGroupIngress:
      - IpProtocol: tcp
        FromPort: '443'
        ToPort: '443'
        CidrIp: 0.0.0.0/0
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/5e3caa82-0cae-a6a1-ec83-269413f68a66.png)


![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/a5b50e35-066e-86b9-46ec-75e36db971f8.png)

手動で既存のルールを編集してるため新規にルールが作成されいる。cfnの管理するリソース自体はテンプレート通りに変更されている。
>
注意: 既存のルールを編集すると、編集したルールが削除されて、新しい詳細を含む新しいルールが作成されます。これにより、そのルールに依存するトラフィックは、新しいルールが作成されるまで短時間切断されます。


###Drift Detectionする

![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/a4d9eb4b-dabf-158c-852a-211142e95230.png)

左のペインからDriftsを選択する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/d294220a-df14-3827-36e5-a95069e189e0.png)

セキュリティグループを選択してView drift detailsをクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/bd9bdfa7-8d07-4dfe-8e66-4a68e5d6dd0d.png)

手動で追加した変更が差分として出力される。
手動で追加したルールを削除する
Detect drift for resourceをクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/3069a5ad-e867-8f3a-6080-0809820bd320.png)
IN_SYNCになることを確認する。


##まとめ
実際の運用では、Update stackを実施するまえにDrift Detectionを実施し差分がないか確認することが想定される。cFn用のパイプラインを実装している場合は、update stack前にDrift Detectionを実施するフェーズを付け加えるんどのユースケースがあるかと思います。
FeedlyへのGoogleアラート登録

RSSリーダの１つである、Feedly。

情報収集として、GoogleアラートのRSSを登録して使っていたのですが
久しぶりにアラートを追加しようと思ったら、前は無料でできたのですが
今では、登録するためには有料プランにしなくてはならなくなっていました。。

![feedly.jpg](https://qiita-image-store.s3.amazonaws.com/0/73741/513b992d-e916-9cbf-4c4c-8cbf53300434.jpeg)

有料にするまででもないけれど、GoogleアラートのRSSは追加したい！
という方には以下の方法があります。

### OPMLファイルを直接編集する

OPMLとはOutline Processor Markup Language の略称で
RSSリーダーの購読データを保存しているXML形式のファイルです。

Feeldyの設定からファイルをエクスポートできます。

![feedly2.jpg](https://qiita-image-store.s3.amazonaws.com/0/73741/d7285a60-6232-a85d-8c72-9f7fe53f3a08.jpeg)

エクスポートしたファイルを編集し、追加したいGoogleアラートのRSSのURLを追加。
ファイルを保存し、編集したファイルをインポートすれば完了です。
ons-fabタグの:visible=falseが初期表示では機能しなかったのでv-showを使ってみた

onsen-uiをVue.jsで最近使っています。
様々なCSSセットがあって便利なんですが…かゆいところに手が届かなかったりします。

#例えば
スクロールしたらふわっと出てくるTOPページに戻るfab
https://giga-log.com/homepage/pagetop-button/

####こんな感じの初期表示時や画面位置がトップのときは非表示でスクロールされたらでてくるものを作りたい。。

#ということでやってみた

公式ドキュメントでは…
※https://ja.onsen.io/v2/api/vue/v-ons-fab.html
⬆︎のページで以下のコード書き換え&実行もできるので実際に試してみてください。

```html
//html
<template id="main">
  <v-ons-page>
    <v-ons-toolbar>
      <div class="center">Floating action button</div>
    </v-ons-toolbar>

    <p style="text-align: center">
      <label>Show FAB <input type="checkbox" v-model="fabVisible" /></label>
    </p>
    <v-ons-fab position="bottom right" :visible="fabVisible">
      <v-ons-icon icon="md-face"></v-ons-icon>
    </v-ons-fab>
  </v-ons-page>
</template>
<div id="app"></div>
```


```javascript
//js
new Vue({
  el: '#app',
  template: '#main',
  data() {
    return {
      fabVisible: true //ここを変えます
    };
  }
});
```

となっているのですが、

```javascript
//js
new Vue({
  el: '#app',
  template: '#main',
  data() {
    return {
      fabVisible: false //ここを変えました
    };
  }
});
```

に変更をしてもons-fabは表示されてしまいます。
ここから初期表示時には:visibleの評価をしていないということです。

#やっぱり初期表示時は非表示にしたい
ということで、

```html
<!--    <v-ons-fab
      position="bottom right"
      :visible="fabVisible"
    >-->
    <v-ons-fab
      position="bottom right"
      :visible="fabVisible"
      v-show="flg"
    >
```

```javascript
//js
new Vue({
  el: '#app',
  template: '#main',
  data() {
    return {
      fabVisible: true ,
      flg=false
    };
  },
  mounted(){
    document.getElementById('main').addEventListener('scroll',this.setFlg)
  },
  methods:{
   //スクロールされたら表示される
   setFlg(){
     this.flg=true
　　　　　　　　　　if(document.getElementById('main').scrollTop === 0){
        this.showFab = false
      }else{
        this.showFab = true
      }
   }
  }
```

#やってみて
付け焼き刃のような書き方になってしまいました。
どうして初期表示時にvisible=falseが機能しないのかは不明です。（バグ？ご存知の方教えてください。）

おそらく他に良いやり方があるはずですが…私が今できるのはここまでです
[Laravel 5.7] キャッシュ系コマンドまとめ

# artisanコマンド

## キャッシュ削除

`php artisan optimize:clear`で以下のコマンドが全て実行されます。
(パスは初期設定状態で削除されるファイル)

- `php artisan clear-compiled`
    bootstrap/cache/services.php
    bootstrap/cache/packages.php

- `php artisan config:clear`
    bootstrap/cache/config.php

- `php artisan route:clear`
    bootstrap/cache/routes.php

- `php artisan view:clear`
    storage/framework/views

- `php artisan cache:clear`
    storage/framework/cache/data


## キャッシュ生成

`php artisan optimize`で以下のコマンドが実行されます。

`php artisan config:cache`
`php artisan route:cache`

以下は実行されないので、個別に実行します。

`php artisan view:cache`

また、`route:cache`はクロージャでルーティング指定しているとキャッシュファイル生成に失敗します。生成できないだけなのでアプリが動作しなくなる等の害はありません。

```php
// キャッシュファイルを生成できない
Route::middleware('auth:api')->get('/user', function (Request $request) {
    return $request->user();
});
```

# composerコマンド

`composer dump-autoload`
autoloadを作り直します。

`composer dump-autoload --optimize(-o)`
デプロイするときは-oオプションをつけると、高速化します。

# [おまけ] Laravel Envoyでひとまとめにする

[Laravel Envoy](https://readouble.com/laravel/5.7/ja/envoy.html)はコマンドをまとめて実行できるタスクランナーです。Envoy.blade.phpでタスクを設定します。

例えば以下のように設定して

```php:Envoy.blade.php
@servers(['localhost' => '127.0.0.1'])

@task('refresh-cache', ['on' => 'localhost'])
    php artisan optimize:clear
    php artisan optimize
    php artisan view:cache
    composer dump-autoload --optimize
@endtask

```

以下のコマンドで

```sh
$ envoy run refresh-cache
```

接続先サーバーでタスクが実行されます。（上記例ではローカル)

[ドキュメント](https://readouble.com/laravel/5.7/ja/envoy.html)には複数サーバでタスク実行するなど色々な設定方法が書いてありますのでご覧ください。
Openapi 3.0 (Swagger)のツール周りの調査結果

# やりたいこと

- ファイル分割して書きたい
- 複雑なツールの構成にしたくない


## エディタ
好みのエディタ

ローカルだとvalidationがリアルタイムでできなさそうなので、要再調査

#他 
Openapi Codegeneratorだけで十分のようだ。

Openapi Codegeneratorは**Dockerでやる**のが環境を汚さなくて良さげ
./作業ディレクトリ/src の中にyamlを書いていく前提
dockerさえ入っていて、起動していればイメージはオンライン上にあるので、下記コマンドでいけるはずである。

## Validator
openapi-codegeneratorのvalidate機能

```
docker run --rm -v ${PWD}:/work --workdir=/work openapitools/openapi-generator-cli validate -i src/index.yaml
```


## コード連結
openapi-codegeneratorのなぜかDocumentってリストの中にあるopenapiとopenapi-yamlテンプレートを使う。

### json
```
docker run --rm -v ${PWD}:/work --workdir=/work openapitools/openapi-generator-cli generate \
    -i src/index.yaml \
    -g openapi \
    -o /work/oepnapi-json
```

### yaml
```
docker run --rm -v ${PWD}:/work --workdir=/work openapitools/openapi-generator-cli generate \
    -i src/index.yaml \
    -g openapi-yaml \
    -o /work/oepnapi-yaml
```

## ドキュメント
openapi-codegeneratorのドキュメント生成generatorを使えば良い
ドキュメントのリストの中にopenapiとopenapi-yamlというテンプレートもあるがコイツラは実は人間飲みやすいドキュメントではなく、コード連結してくれるやつである。
html2が自分にはしっくり来たかな。
htmlは文字化けした。日本語には向かなそうである。

    - cwiki
    - dynamic-html
    - html
    - html2

サンプルコード

```
docker run --rm -v ${PWD}:/work --workdir=/work openapitools/openapi-generator-cli generate \
    -i src/index.yaml \
    -g html2 \
    -o /work/doc
```


### モックサーバ
- openapi-codegeneratorのgenerate機能がよい。go-serverにすれば後で配布も楽そう。
- api-sproutというツールを使おうとしたが分割ファイルに対応していないようだ。

```
docker run --rm -v ${PWD}:/output --workdir=/output openapitools/openapi-generator-cli generate \
    -i src/index.yaml \
    -g go-server \
    -o /output/go-mock-server
```

立ち上げるためには依存ライブラリがあったので下記のようにしたらできた。

```
cd go-mock-server
go get -d -v ./...
go run main.go
```

###クライアント生成
Flow対応のJS版とTypescript版にお世話になることが多そうだ。

```
docker run --rm -v ${PWD}:/output --workdir=/output openapitools/openapi-generator-cli generate \
    -i src/index.yaml \
    -g  typescript-fetch \
    -o /output/api-client-typescript
```
UnityでVRを始めるための情報まとめ

#UnityでVRを始めるための情報まとめ。

本家のチュートリアル
[https://unity3d.com/jp/learn/tutorials/topics/xr/getting-started-vr-development](https://unity3d.com/jp/learn/tutorials/topics/xr/getting-started-vr-development)

Unity関連、UnityでVR系の情報まとめ
[http://vsyncin.blogspot.com/](http://vsyncin.blogspot.com/)
WIP > C++ Builder > Indy > using IndyTextEncoding_ASCII() instead of IndyTextEncoding(TEncoding::ASCII).

**WIP: Work in Progress**

```txt:動作環境
C++ Builder XE4
```

[SHA-512 returns NULL even using 2 DLLs (ssleay32.dll and libeay32.dll)](https://stackoverflow.com/questions/53292571/sha-512-returns-null-even-using-2-dlls-ssleay32-dll-and-libeay32-dll/53292691#53292691)
にて付いた回答に以下のコメントがあった。

> answered 1 hour ago
> Remy Lebeau
> 1: BTW, you should be using IndyTextEncoding_ASCII() instead of IndyTextEncoding(TEncoding::ASCII).

何故そちらの方がいいかについては未調査。
(後で調べる予定）
create-react-appで作ったReactアプリでsetupTests.jsが読み込まれない

要はEnzymeのセットアップファイルが読み込まれないって話です。

```js
import { configure } from 'enzyme';
import Adapter from 'enzyme-adapter-react-16';

configure({ adapter: new Adapter() });
```

これ。
package.jsonの"jest"に

```js
    "setupTestFrameworkScriptFile": "<rootDir>/src/setupTests.js",
```

を追加しよう。
【LIG・エアークローゼット・DMM】フロントエンド勉強会に行ってきた

#勉強会【LIG・エアークローゼット・DMM】3社のフロントエンド開発最新事情に行ってきた

[【LIG・エアークローゼット・DMM】3社のフロントエンド開発最新事情](https://genki-techblog.com/2018/11/14/%E5%8B%89%E5%BC%B7%E4%BC%9A%EF%BC%9A%E3%80%90lig%E3%83%BB%E3%82%A8%E3%82%A2%E3%83%BC%E3%82%AF%E3%83%AD%E3%83%BC%E3%82%BC%E3%83%83%E3%83%88%E3%83%BBdmm%E3%80%913%E7%A4%BE%E3%81%AE%E3%83%95%E3%83%AD/)
　日時　2018年11月13日　19時30分〜

　イベントURL
　https://dmm.connpass.com/event/97012/

※まだ現段階では資料が共有されていないため昨日のメモを元に内容の要約を記載させていただきます。

##グラフィック表現に関して、デザイン領域に踏み込んで開発を行える制作体制の魅力
- フロントエンド＋デザイン
- デザインの実装もフロントエンジニアが実装する
- フロントエンドの技術選定は各エンジニアに裁量が与えられている

##フルJSアーキテクトで作るエアークローゼット
- フルJs開発のメリット
- 早い（開発）、安い（学習コスト）、美味い（共通化）
- デメリットは飽きてしまうこと
 - パーツの実装単位で興味のある技術を使って新鮮さを出している

##DMMのサービスを支える最近のフロントエンド技術 ~ next.js の実践利用 ~
- 発表者の方は元デザイナーのWebエンジニア
- DMMはフロントエンド、バックエンドという括りを無くしてWebエンジニアで統一したそう。
- NextJs導入理由
 - DMM社内で使った前例がなかった
 - 発表者の方が以前から触っていた
- **こういう動き方は自分も真似したいと参考になりました**

###発表の中で個人的に気になった内容
**redux (redux-saga) の設計にシーケンス図を用いてみた話**
https://inside.dmm.com/entry/2018/08/09/redux-saga-sequence-diagram

DMMのエンジニアブログ
https://inside.dmm.com/

##パネルディスカッション"フロントエンド悩みゴト相談会"

###チームの雰囲気作りについて
・チームランチなどチームで動く機会を増やす
・特に職種間での関係を意識している

###技術選定について
・ちょうどいいものを使う（オーバースペックはX）
・デザイナーや、バックエンドエンジニアにも積極的に相談する

###今後のフロントエンドの技術の流れについて
・Vue、Reactはここ3年近く使われてきており、すぐには無くならないだろう

・コーダーとしての仕事はどんどんなくなっていくだろう
＝＞スペシャリストとしての分野が今後増えていくだろう
＝＞フロントエンド＋バックエンド、フロントエンド＋デザイン　などできる業務の幅を広げる

##まとめ
- **フロントエンドの領域にとどまらずデザイン、バックエンドなどにも領域を広げよう**
- **フロントエンドは変化が激しい職種なので各々にマッチした生存戦略を考えよう！**
kerasの初心者向け豆知識

誰でも簡単にディープラーニングが出来ると有名なkeras

初めのうちは簡単で便利だなあとしか思ってなかったのですが、使ってるうちにこうした方が良いというポイントを結構発見したのでそれをまとめようと思いました。


#初期化
kerasの初期設定を見てみましょう

```python:glorot_uniform.py
keras.layers.Dense(units, activation=None, use_bias=True, kernel_initializer='glorot_uniform')
```
すると初期化はglorot_uniformとなっていることがわかります。

実はこの初期化は活性化関数が原点対称であると考えたときに使える関数なのです。(詳しくは[ニューラルネットにおける変数の初期化について](https://nykergoto.hatenablog.jp/entry/2017/10/15/%E3%83%8B%E3%83%A5%E3%83%BC%E3%83%A9%E3%83%AB%E3%83%8D%E3%83%83%E3%83%88%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E5%A4%89%E6%95%B0%E3%81%AE%E5%88%9D%E6%9C%9F%E5%8C%96%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)を読んでください

<br>
なのでreluで活性化するときにはhe_normalを使いましょう


```python:he_normal.py
keras.layers.Dense(units, activation=None, use_bias=True, kernel_initializer='he_normal')
```

#コールバック

使うと便利です

#### ModelCheckpoint

```python:ModelCheckpoint.py
keras.callbacks.ModelCheckpoint(filepath, monitor='val_loss', verbose=0, save_best_only=False, save_weights_only=False, mode='auto', period=1)

#学習が終わった後
model.load_weights(filepath)
```

monitorしている指標が一番よかった時のものを保存してくれます。これで常にベストな結果を使えます。

#### EarlyStopping

```python:EarlyStopping.py
keras.callbacks.EarlyStopping(monitor='val_loss', min_delta=0, patience=0, verbose=0, mode='auto')
```

patienceに設定した値の間に更新がなかったら打ち切ります。これで電気代の無駄を防げます

#### ReduceLROnPlateau

```python:ReduceLROnPlateau.py
keras.callbacks.ReduceLROnPlateau(monitor='val_loss', factor=0.1, patience=10, verbose=0, mode='auto', epsilon=0.0001, cooldown=0, min_lr=0)
```
patienceに設定した値の間に更新がなかったら学習率をfactor倍します。これで学習率を下げると学習が進むことがあるのでなかなか有用です。

<br>
こんな感じでまとめて使えます。

```python:matome.py
callbacks = [
    EarlyStopping(patience=0),
    ReduceLROnPlateau(patience=0),
    ModelCheckpoint(filepath)
]
model.fit(x_train, y_train, callbacks=callbacks)
```

#Keras backend

backendを使えば好きな層を追加できて便利です。
でもLambda層でラップすることを知らないと

```python:error.py
from keras import backend as K
from keras.layers import Dense,Input
from keras.models import Model
model_input = Input(shape=(10,))
calculated = K.sqrt(model_input + 1.0)
calculated = Dense(1)(calculated)
model = Model(inputs=model_input, outputs=calculated)

#AttributeError: 'Tensor' object has no attribute '_keras_history'
#AttributeError: 'NoneType' object has no attribute '_inbound_nodes'
```

みたいなエラーが出て意味が分からないことになります。

<br>
なのでちゃんとLambda層を使ってこのように書きましょう。

```python:Lambda.py
from keras import backend as K
from keras.layers import Dense,Input,Lambda
from keras.models import Model
model_input = Input(shape=(10,))
calculated = Lambda(lambda x: K.sqrt(x + 1.0), output_shape=(10,))(model_input)
calculated = Dense(1)(calculated)
model = Model(inputs=model_input, outputs=calculated)
```

これに気づくのに大分時間を溶かしました。

#まとめ
簡単使えるけどkerasは奥が深い



###参考元

[kerasで頭に描いたネットワーク構造を実現するためのTips ~ Lambda 編 ~](https://qiita.com/Mco7777/items/158296ed7f66aed2ffc3)
PostgreSQL dropdb出来ない時の対策


## エラー

普通に
`$ dropdb [db name]`
しようとしても

```bash
$ dropdb [db name]
...
DETAIL:  There is 11 other session using the database.
```
のようなエラーが出ます。

この場合は11こセッション使用中があるような感じです。

## 対策
それ、killすれば解決します。
PostgreSQLのDBのkill方法は以下です

```sql
SELECT pg_terminate_backend(pid)
  FROM pg_stat_activity
 WHERE datname = '[db name]'
   AND pid <> pg_backend_pid() -- 自分自身を切断しないように
;
```

そしてファイルに書いて保存しておけば便利です。

`$ psql [dbname] < kill.sql`
のような感じでセッション使用中をなくせば後はdropするだけです。
`$ dropdb [dbname]`
完了！！

心地良いPosgres Lifeを！！

## 参考
[PostgreSQL のサーバー側でセッションを切断する方法](https://qiita.com/yteraoka/items/90f61beb1ade1b002a54)
tensorflowで九九

#概要

tensorflowで九九、やってみた。

#結果

```

0.395087
0.0249247
0.00668623
0.00196402
0.000861049
0.000167826
0.000323401
4.22531e-05
1.31142e-05
0.000113024
      1   2   3   4   5   6   7   8   9
  1   1   2   3   4   5   6   7   8   9
  2   2   4   6   8  10  12  14  16  18
  3   3   6   9  12  15  18  21  24  27
  4   4   8  12  16  20  24  28  32  36
  5   5  10  15  20  25  30  35  40  45
  6   6  12  18  24  30  36  42  48  54
  7   7  14  21  28  35  42  49  56  63
  8   8  16  24  32  40  48  56  64  72
  9   9  18  27  36  45  54  63  72  81

```

#サンプルコード

```
import numpy as np
import tensorflow as tf
#kuku

def in_encode(i, j):
	k = j * 16 + i
	return np.array([k >> d & 1 for d in range(8)])

def out_encode(i, j):
	k = j * i
	return np.array([k >> d & 1 for d in range(7)])

def decode(p):
	f = 0
	if p[0] > 0.5:
		f += 1
	if p[1] > 0.5:
		f += 2
	if p[2] > 0.5:
		f += 4
	if p[3] > 0.5:
		f += 8
	if p[4] > 0.5:
		f += 16
	if p[5] > 0.5:
		f += 32
	if p[6] > 0.5:
		f += 64
	return f

trX = np.array([in_encode(i, j) for i in range(1, 10) for j in range(1, 10)], dtype = np.float32)
trY = np.array([out_encode(i, j) for i in range(1, 10) for j in range(1, 10)], dtype = np.float32)

g = tf.Graph()

with g.as_default():
	x = tf.placeholder(tf.float32, shape = (None, 8))
	h1 = tf.layers.dense(x, 96, activation = tf.nn.relu)
	y_answer = tf.placeholder(tf.float32, shape = (None, 7))
	y_pred = tf.layers.dense(h1, units = 7)
	loss = tf.losses.mean_squared_error(labels = y_answer, predictions = y_pred)
	optimizer = tf.train.AdamOptimizer(0.01)
	train = optimizer.minimize(loss)

with tf.Session(graph = g) as session:
	session.run(tf.global_variables_initializer())
	dic = { 
		x: trX, 
		y_answer: trY
	}
	for i in range(1000):
		_, loss_value = session.run((train, loss), dic)
		if i % 100 == 0:
			print (loss_value)
	#print ('prediction:', session.run(y_pred, dic))
	y = session.run(y_pred, dic)
	p = '    '
	j = 1
	for i in range(1, 10):
		p += '%3d ' % (i * j)
	p += '\n'
	for j in range(1, 10):
		p += '%3d ' % (j)
		for i in range(1, 10):
			g = y[(i - 1) * 9 + (j - 1)]
			k = decode(g)
			p += '%3d ' % (k)
		p += '\n'
	print (p)

```

以上。
Haskell に python の find みたいなのがない

はじめての Qiita 投稿

# Haskell の find
Haskell にも `Data.List` に `find` があるのだけど

```
find :: Foldable t => (a -> Bool) -> t a -> Maybe a
```

これじゃない。 python の `heystack.find('needle')` みたいなやつがほしい。

# あるかないか
python の `find` にも使い方がいくつかあると思うが、 `needle` の有無だけを知りたいなら `isInfixOf` を使えば良い。

# インデックス
`Data.List` に findIndex とか findIndices とかあるけど求めているものじゃない。

```
findIndex :: (a -> Bool) -> [a] -> Maybe Int
findIndices :: (a -> Bool) -> [a] -> [Int]
```

こうかな？

```findPython.hs
import Data.Maybe
import Data.List

findPython :: (Eq a) => [a] -> [a] -> Int
findPython needle heystack =
  maybe (-1) fst $ 
  listToMaybe . filter (isPrefixOf needle . snd) $ zip [0 .. ] (tails heystack)

main :: IO ()
main = do
  print $ findPython "abc" "0123456789abcde"
  print $ findPython "xyz" "0123456789abcde"
```

結果

```
$ stack runghc findPython.hs
10
-1
```

# インデックス自体は必要ない時
インデックスを見つけるのは目的ではなく、見つけたインデックスの場所に書いてあるものを利用したい、という場合が多いのでは。 `needle` のインデックスを探すとか、 Haskell っぽくない気がする。

上にも出てくるが、 `tails` を使うのが Haskell 的なのだろう。

``` findURL.hs
import Data.Maybe
import Data.List

-- | "https://" を探し、その後が URL であると認識して URL を返す関数
findURL :: String -> Maybe String
findURL s = listToMaybe . filter (isPrefixOf "https://") $ tails s
  
main :: IO ()
main = do
  print $ findURL "qawsedrfujikolphttps://qiita.com/"
```

結果

```
$ stack runghc test2.hs
Just "https://qiita.com/"
```

# References

[Data.List -- Hackage](https://hackage.haskell.org/package/base-4.9.1.0/docs/Data-List.html)

`isInfixOf` の実装を参考にしました。
Sigfox: End product certificateとprototype登録

SigfoxクラウドにDeviceを登録する時に、**End product certificate**という入力があります。Sigfox対応の商用デバイスは、[Sigfox Ready Certification (P2認証)](https://build.sigfox.com/sigfox-ready-certification)と呼ばれるデバイス認証を取得することになっています。
このEnd product certificateは、Sigfox Ready Certificationの認証取得済みのデバイスを登録する場合と、認証未取得のデバイスを登録する場合で、設定内容が異なります。

#Sigfox Ready Certification認証取得済みデバイスを登録する
Sigfox Ready Certificationの認証を取得したデバイスは、End product certificate番号が発行されます。この番号は、**"P_"**から始まる番号となっており、デバイスメーカーに問い合わせいただくか、https://partners.sigfox.com から製品検索することで確認できます。
例えば、Sens'it V3は[こちら](https://partners.sigfox.com/products/sensit-rc3)にアクセスし、CERTIFICATIONのところにある番号（下図赤枠）を使用します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172313/5b60661f-2f6e-5839-31ef-67ac879a6cac.png)
この番号を、デバイス登録画面の**End product cettificate**欄に入力してください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172313/df4b6983-72a2-126d-733e-8c2d0a0b83da.png)

#Sigfox Ready Certification認証未取得デバイスを登録する
Sigfox Ready Certificationを未取得のデバイスは、End product certificate番号が割り振られていません。
**"Where can I find the end product certificate?"**をクリックすると下図のようにスライド表示されるので、
**☑Register as a prototype**
にチェックを入れてください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172313/b36e0cd9-33a3-3514-a6c6-834899e64fa2.png)

##prototypeとして登録する時の注意点
prototypeとして登録できるデバイス数は原則1グループに1,000台までという制限があります。
1,000台を超える認証未取得デバイスを使用されたいという場合は、各国Sigfox Operator（日本においては[京セラコミュニケーションシステム](https://www.kccs.co.jp/sigfox/)）までお問い合わせください。

[Sigfox Japan KCCS](https://qiita.com/organizations/sigfox)
Facebookの学習済みモデル「WSL Embeddings」

メモ書き

Facebookが凄まじい量の画像を元に学習させたモデルを公開するらしい。
じゅるりっ　早く転移学習したいですね待ち遠しいですね。
ONNXで提供されるとなお良し！

[公式](https://facebook.ai/developers/tools/wslembeddings)ページでは
GitHubがComingSoonとなってるので、サンプルが公開されるまで待ちます。


その他の、2018年版FacebookのAIプロダクト一覧

#### [Facebook AI Products](https://facebook.ai/developers)

- Vision
  - [Detectron](https://facebook.ai/developers/tools/detectron) [(GitHub)](https://github.com/facebookresearch/Detectron)
  - [DensePose](https://facebook.ai/developers/tools/densepose) [(GitHub)](https://github.com/facebookresearch/DensePose)
  - Deepmask
  - [House 3D](https://facebook.ai/developers/tools/house3d) [(GitHub)](https://github.com/facebookresearch/House3D)
  - ResNeXt3D
  - [WSL Embeddings](https://facebook.ai/developers/tools/wslembeddings) [(GitHub coming soon!)]()


- Language
  - [FastTesxt](https://facebook.ai/developers/tools/fasttext) [(GitHub)](https://github.com/facebookresearch/fastText)
  - VoiceLoop
  - [ParlAI](https://facebook.ai/developers/tools/parlai) [(GitHub)](https://github.com/facebookresearch/ParlAI)
  - [Translate](https://facebook.ai/developers/tools/translate) [(GitHub)](https://github.com/pytorch/translate)
  - [Fairseq](https://facebook.ai/developers/tools/fairseq) [(GitHub)](https://github.com/facebookresearch/fairseq-py) 
  - [MUSE](https://facebook.ai/developers/tools/muse) [(GitHub)](https://github.com/facebookresearch/MUSE)


- Speech
  - [Wav2letter](https://facebook.ai/developers/tools/wav2letter) [(GitHub)](https://github.com/facebookresearch/wav2letter)


- Reasoning
  - DrQA
  - [ELF Reinforcement Learning](https://facebook.ai/developers/tools/elf) [(GitHub)](https://github.com/pytorch/elf)
  - MemNets
  - Starcraft
  - CommNet
  - [TorchCraft](https://facebook.ai/developers/tools/torchcraft) [(GitHub)](https://github.com/TorchCraft/TorchCraft)


- Tools
  - [FAISS](https://facebook.ai/developers/tools/faiss) [(GitHub)](https://github.com/facebookresearch/faiss)
  - [Tensol Comprehensions](https://facebook.ai/developers/tools/tensorcomprehensions) [(GitHub)](https://github.com/facebookresearch/TensorComprehensions)
  - TorchMPI
  - [Visdom](https://facebook.ai/developers/tools/visdom) [(GitHub)](https://github.com/facebookresearch/visdom)
  - [StarSpace](https://facebook.ai/developers/tools/starspace) [(GitHub)](https://github.com/facebookresearch/StarSpace)

  
- Deep Learning Frameworks
  - [PyTorch](https://facebook.ai/developers/tools/pytorch) [(GitHub)](https://github.com/pytorch/pytorch)
  - [Caffe2](https://facebook.ai/developers/tools/caffe2) [(GitHub)](https://github.com/caffe2/caffe2)
  - [ONNX](https://facebook.ai/developers/tools/onnx) [(GitHub)](https://github.com/onnx)
  - [Glow](https://facebook.ai/developers/tools/glow) [(GitHub)](https://github.com/pytorch/glow)
iOS シミュレータでオフライン時のテストをしたい「Additional Tools > Network Link Conditioner」で解決

# ハードウェアのシミュレーションをおこなう「Additional Tools」

## iOS シミュレータでオフライン時のテストをしたい
- `Network Link Conditioner` というツールで実現できそう
    - [iOSシミュレータでの通信状態のテストにNetwork Link Conditionerが便利だった \- 絶品ゆどうふのタレ](http://yudoufu.hatenablog.jp/entry/2016/05/28/120951)
- `Network Link Conditioner` は、`Hardware IO Tools` というパッケージに同梱されている
- `Hardware IO Tools` は 現在（2018/11） `Additional Tools` というパッケージに含まれて提供されている


## 動作確認した環境
- Xcode 9.4.1 (9F2000)


## Additional Tools のダウンロード

- [More Downloads for Apple Developers](https://developer.apple.com/download/more/?name=Hardware) に**開発者登録済みのApple IDでサインイン**します。

### **Additional Tools for Xcode x.x** をインストール

（今回は**Additional Tools for Xcode 9.3**をダウンロードしました）

 - Xcode 7.3 までは `Hardware IO Tools` という名称で提供されていたが、
 - Xcode 8.0 〜は `Additional Tools` に統合されたようです

> ![additional-tools.png](https://qiita-image-store.s3.amazonaws.com/0/2883/1aaa9103-6f10-2779-047c-5d5c9984e72f.png)

### Network Link Conditioner のインストール

パッケージの中の `Network Link Conditioner` を実行すると、インストールの確認がでてシステムにインストールします。
正常に完了すると、**システム環境設定** にインストールされます。

> ![system-preference.png](https://qiita-image-store.s3.amazonaws.com/0/2883/335057ea-d764-ce9e-bb72-3d0e5985ab12.png)


## ネットワーク圏外をつくる

- Profile で `100% Loss` を選択
- `ON` に切り替える

> ![image.png](https://qiita-image-store.s3.amazonaws.com/0/2883/bf77f83a-5a86-40cd-2cd0-d3150cf6ae0d.png)

- ONにした時点で、ネットワークが圏外となり通信できない状態となる。
- ON/OFFはいつでも切り替え可能なので「通信可能→圏外になったとき」やその逆のパターンのテストにもつかえそうです。
グッドデザイン賞

#はじめに

2018年11月、**[グッドデザイン賞の展示会](http://www.g-mark.org/)**を見に行きました。
学生は**無料**と聞いたので、足が勝手に**展示会**へ行ってしまいました。

なかなか**ユニーク**な展示品が沢山あって楽しかったです。

今回はUI/デザインのお話です。

#先日投稿されたとある記事

**[グッドデザイン賞の会場で見た、？なデザイン](https://qiita.com/wa2c/items/beda63e106554281277e)**

という記事があったので、拝見してみました。

この記事を見て、**"そんなに分かりづらいデザインなのか!?"**と思い、
ついでに確認してきました。

#こんな感じ

![1.png](https://qiita-image-store.s3.amazonaws.com/0/213065/fb963bba-8a99-b88a-8095-ae6befb8f943.png)

人が過疎っている時に、撮ってきました。
**このポスター**、なかなかに巨大です。

正確には測っていませんが、
**2m以上**は確実にあるのではないでしょうか？

**[グッドデザイン賞の会場で見た、？なデザイン](https://qiita.com/wa2c/items/beda63e106554281277e)**
この記事で詳しく説明しています。


#ポスターは6枚ある

###1枚目
![1.png](https://qiita-image-store.s3.amazonaws.com/0/213065/fb963bba-8a99-b88a-8095-ae6befb8f943.png)
###2枚目
![2.png](https://qiita-image-store.s3.amazonaws.com/0/213065/a992f4f4-4400-6be9-d4c7-284ebcba23d6.png)
###3枚目
![3.png](https://qiita-image-store.s3.amazonaws.com/0/213065/4b0c1d3a-cc3d-6573-c34c-3cbf9566a145.png)
###4枚目
![4.png](https://qiita-image-store.s3.amazonaws.com/0/213065/034a0f56-0f8b-7f74-6f7f-03b18227b696.png)
###5枚目
![5.png](https://qiita-image-store.s3.amazonaws.com/0/213065/e3d39960-d415-5a1c-aca5-f6205b2452c3.png)
###6枚目
![6.png](https://qiita-image-store.s3.amazonaws.com/0/213065/b01df14e-8e49-3abd-0fbc-0d7a3897da02.png)

###1~6の順で左から回るルート
brewでインストールしたyarnのバージョンを変更する方法

brewでインストールしたyarnのバージョンを切り替える方法について説明します。

## 手順

1. まず、すでにbrewでyarnを入れている場合は`brew unlink yarn`でリンクを解除します。
2. 次に、[Pull Request that has been merged which contained the formula (version) of Yarn](https://github.com/Homebrew/homebrew-core/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Amerged+yarn+) からインストールしたいyarnのバージョンを探します。
3. プルリクエストで変更されたファイルには、`Formula/yarn.rb` のファイルが存在するはずです。
4. 変更された`Formula/yarn.rb`を"View"ボタンから確認し、ファイルを確認します。
5. "Raw"ボタンをクリックすると、`https：//raw.githubusercontent.com/...`で始まるURLが開きます。このURLをコピーしてください。
6. 最後にターミナルで`brew install`コマンドを、先ほどコピーしたURLを対象に実行します。例えば、yarnのv1.6.0をインストールするには、以下のコマンドを実行します。

```
brew install https://raw.githubusercontent.com/Homebrew/homebrew-core/fba7635ab69384ac980c635483a7af825bc06088/Formula/yarn.rb
```

`brew list --versions yarn`によってHomebrewで実行できるyarnのバージョン一覧が表示されるため、使いたいバージョンを`brew switch yarn VERSION_NUMBER`で指定します。

以上です。

## 参考

https://github.com/yarnpkg/yarn/issues/1882#issuecomment-421372892
VisualStudio2017LocalDBのつなぎ方


サーバーエクスプローラを開く
![image.png](https://qiita-image-store.s3.amazonaws.com/0/310991/2b1fa912-95dd-a32c-fbb5-0604d0e94103.png)
データを接続を右クリックして「接続を追加」を選択
![image.png](https://qiita-image-store.s3.amazonaws.com/0/310991/380d0dde-30fe-3ad7-181f-cec4df693f97.png)
「Microsoft SQL Server データベースファイル」を選択して続行を押す
![image.png](https://qiita-image-store.s3.amazonaws.com/0/310991/d8ee10f8-998a-0ae5-25ec-1ad790065cb8.png)
ＳＱＬが入っていないと以下のような警告が出るので、パッケージをインストールする
![image.png](https://qiita-image-store.s3.amazonaws.com/0/310991/71070760-bfde-712b-5df2-d62e76e8a821.png)
参照を押す
![image.png](https://qiita-image-store.s3.amazonaws.com/0/310991/88a7e4e8-02df-e706-199d-d569378fef6c.png)
DBファイルを選択

![image.png](https://qiita-image-store.s3.amazonaws.com/0/310991/9baf70f8-0d1c-8d52-eba8-fb1fd3343ca3.png)
テスト接続してみる、下のメッセージが出ればＯＫ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/310991/ed13a8e1-5b40-7871-e629-dc8fb8058a97.png)
接続したＤＢを右クリックし、プロパティを選択
![image.png](https://qiita-image-store.s3.amazonaws.com/0/310991/d4c7ce39-8a69-c9d4-f291-883026816d37.png)
接続文字列をコピーする
例
Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=\\Example\共有\研修資料\C#\参考プロジェクト\Login-Form-in-Csharp-master\DB\LoginDB.mdf;Integrated Security=True;Connect Timeout=30
![image.png](https://qiita-image-store.s3.amazonaws.com/0/310991/7681be46-e9be-20fb-516e-07556bd7e3b2.png)
new SqlConnectionの参照設定部分を自分の接続文字列(conection)と入れ替え、ＤＢが置いてある環境と接続の仕方で変わります
![image.png](https://qiita-image-store.s3.amazonaws.com/0/310991/ca898963-1e88-fea3-b06c-f6b25adda6df.png)
これで動くはず
良い感じのテキストセンタリングの CSS

`text-align: center` だと微妙なセンタリングになる事がちょこちょこと。
と言う事で、ブロックはセンタリング、中身は左寄せに、をシンプルにやる CSS。

```
display: table;
margin-left: auto;
margin-right: auto;
```

テーブルにするとマージンの上下相殺が出来ないのでその辺りご注意を。

- [jsfiddle テスト](//jsfiddle.net/9dwy56ag/show/)
Docker内のRedisのAOFファイルが壊れてしまった場合の対処法

## TL;DR
```
docker-compose run --rm redis redis-check-aof --fix /data/appendonly.aof
```

## Docker内のRedisのAOFファイルが壊れてしまった

ある日突然Dockerで使用しているRedisが起動しなくなってしまいました。

```
redis_1 | Bad file format reading the append only file: make a backup of your AOF file, then use ./redis-check-aof --fix <filename>
redis_1 exited with code 1
```

AOFファイルがおかしくなっているのでFIXしてあげれば良い模様。
しかしredisが起動してくれないためAOFファイルのパスすらわからない。

[What is the default location for Redis AOF file for Ubuntu?](https://stackoverflow.com/questions/50504692/what-is-the-default-location-for-redis-aof-file-for-ubuntu)

上記のStackOverflowを参考にするとパスは
`/var/lib/redis/appendonly.aof`であったためこのパスで実行してみます

```
docker-compose run --rm redis redis-check-aof --fix /var/lib/redis/appendonly.aof
Cannot open file: /var/lib/redis/appendonly.aof
```
失敗
上記パスのファイルが開けないため、このパスのファイルは存在しないようです...

上司に DockerのRedis内の`appendonly.aof`のパスを確認してもらうと`/data/appendonly.aof`でした。

```
docker-compose run --rm redis redis-check-aof --fix /data/appendonly.aof
0x        1874d306: Expected prefix '
AOF analyzed: size=410310560, ok_up_to=410309382, diff=1178
This will shrink the AOF from 410310560 bytes, with 1178 bytes, to 410309382 bytes
Continue? [y/N]: y
Successfully truncated AOF
```

truncateされてる!?
しかしコンテナを起動すると無事redisに接続できてデータも残っていた、良かった。

全てのDocker内のAOFファイルのパスが私のと同じとは限らないですが、参考になればと思います。
C#のAndroid開発でJava SEを捨てる

Oracle Java SEは、将来有料化が決まっており、いろいろ問題を抱えたAndroidの開発はOpenJDKに移行しています。すでに、Android Studioでは、OpenJDKが利用されています。しかし、VisualStudio 2017 にXamarin開発環境を入れ利用しようと思っても、今までの環境はOracleのJava SE(ver8)が入ってしまいます。

というのは過去の話。本日（2018年11月14日）より、15.9のバージョンに更新することで、OpenJDKをインストールするようになりました。

# Visual Studio Installer から更新する

すでにVS2017をインストールしている場合、メニューからVisual Studio Installerから更新を行います。なお、更新にはコンピュータの再起動が必要になるかもしれません。

次に、「更新」を選択して「個別のコンポーネント」の選択から、「Java SE Development Kit」のチェックを外し、下にある「Microsoft配布のOpenJDK」にチェックをつけます。というより、Microsoft配布のOpenJDKを無効にしようとすると、Android開発をするための環境も消されます。

なお、「ワークロード」の「.NETによるモバイル開発」でチェックをつけると、Java SE Development Kitもチェックがついてしまいます。なお、Java SE 8のセキュリティアップデートは、2020年12月まで対応されるようですが、来年以降のアップデートは有償です。
早めに目の前から消しておきましょう。

# まとめ

Java問題がなかなかややこしく、以前XamarinですべてのコンポーネントをC#で実装したAndroidがサンプルとして公開されていました。これが、本当にAndroidとしてのプラットフォームとして公開されていれば、今、どんなに楽だったことだろうかという思いです。
結局、Kotlinという環境が出ても、内部的にはJavaなので結局本質的には変わっていませんからね。まぁ、今更ミドルウェアを一新も難しいところでしょうから致し方ありませんね。