OmniAICreator/Qiita-1.07M huggingface dataset:
python でよくわからないオブジェクトの中身を表示する

Tensorflow 等を使っていると、このオブジェクトは一体なんのクラスのインスタンスで、どんな情報（プロパティ）を持っているのだろう、とわからなくなるときがしばしばあります。
しかも、まともなドキュメントが無いこともしばしばあります。
（例えば BeamSearchDecoderOutput など）

このような時に便利な関数 explain を作りました。

# 例
tf.constant の戻り値を調べてみましょう。

```py
In [7]: tensor = tf.constant([[1, 2], [3, 4]])

In [8]: explain(tensor)
EXPLAIN ------------------
Tensor("Const_2:0", shape=(2, 2), dtype=int32)
<class 'tensorflow.python.framework.ops.Tensor'>
ATTRIBUTES:
OVERLOADABLE_OPERATORS:	{'__truediv__', '__mul__', '__rpow__', '__rdiv__', '__neg__', '__pow__', '__rmul__', '__or__', '__rxor__', '__div__', '__ge__', '__rfloordiv__', '__lt__', '__gt__', '__getitem__', '__rand__', '__add__', '__abs__', '__invert__', '__rmatmul__', '__rsub__', '__floordiv__', '__xor__', '__ror__', '__rtruediv__', '__and__', '__sub__', '__radd__', '__matmul__', '__le__', '__rmod__', '__mod__'}
device:
dtype:	<dtype: 'int32'>
graph:	<tensorflow.python.framework.ops.Graph object at 0x119f61d30>
name:	Const_2:0
op:	name: "Const_2"
op: "Const"
attr {
  key: "dtype"
  value {
    type: DT_INT32
  }
}
attr {
  key: "value"
  value {
    tensor {
      dtype: DT_INT32
      tensor_shape {
        dim {
          size: 2
        }
        dim {
          size: 2
        }
      }
      tensor_content: "\001\000\000\000\002\000\000\000\003\000\000\000\004\000\000\000"
    }
  }
}

shape:	(2, 2)
value_index:	0
```
型は Tensor で、名前をとるのは name でとれて・・といったことがわかります。
皆様の闇デバッグ作業に役立てれば幸いです。
（存在するプロパティを勝手に叩いてしまうので、プロパティ読み出しの中で危ない処理をやる不法者なオブジェクトにはご注意下さい）


# 実装
```py
import types


def explain(item, shows_private=False, shows_method=False):
    '''
    与えた python オブジェクトの詳細を表示します。
    '''
    print('EXPLAIN ------------------')
    print(item)
    print(type(item))
    print('ATTRIBUTES:')
    for d in dir(item):
        if d == 'type':
            continue
        if not shows_private and d.startswith('_'):
            continue
        attr = getattr(item, d)
        if not shows_method and (
                isinstance(attr, types.MethodType) or
                isinstance(attr, types.BuiltinMethodType) or
                isinstance(attr, types.CoroutineType) or
                isinstance(attr, types.FunctionType) or
                isinstance(attr, types.BuiltinFunctionType) or
                isinstance(attr, types.GeneratorType)
        ):
            continue
        print('{}:\t{}'.format(d, attr))
```
rubyのdockerイメージで２つ以上のGemfileを使えない問題

officialのRuby2.5.1のイメージを使って、bundlerで２つ以上のGemfileを使おうとした際に遭遇した問題。
bundlerにすでにissueとして上がっているが、日本語の情報が少ないのでまとめておく。
https://github.com/bundler/bundler/issues/6154

# 問題の再現条件

ruby:2.5.1のイメージから初めて以下のようにDockerfileとGemfileを作り、Dockerイメージをビルドする。

```dockerfile:Dockerfile
FROM ruby:2.3

ADD Gemfile /tmp/bundle/
RUN cd /tmp/bundle && bundle install
```

```ruby:Gemfile
# frozen_string_literal: true

source "https://rubygems.org"

git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }

# gem "rails"
gem "json"
```

```shell-session
$ docker build -t rb_test .
```

（最初から `docker run -it ruby:2.5.1 /bin/bash` として対話的環境の中で同等の作業をすれば良いと思われるかもしれない。しかし、この方法では問題は再現しない。"/etc/profile"が読まれるとこの問題は回避できるようだ。）

ここで２つ目のRubyプロジェクトがあるとして、新しいGemfileを作ってインストールしてみる。

```shell-session
$ docker run -it rb_test /bin/bash
```

コンテナ内にログインできるので、ここで新たにGemfileを作って`bundle`を実行してみる。

```shell-session
$ mkdir -p ~/proj
$ cd ~/proj
$ bundle init
$ # 適当なGemfileを作って、中身に適当なgemを加える
$ echo 'gem "pry"' >> Gemfile
$ bundle
```

するとbundle自体は正常終了するのだが、/tmp/bundle/Gemfileに書かれたgemがインストールされてしまう。
projに移動した後も/tmp/bundle/Gemfileの方を参照し続けてしまうようだ。
当然`bundle exec pry`を実行しても必要なgemがないのでエラーになる。

# 問題の調査

どうやらこれはRubyのdockerイメージで、かつbundler1.16の場合に発生する問題のようだ。

rubyのdockerのイメージではgemを「グローバル」にインストールする方式が取られている。
詳細は理解していないが、この仕様がbundler1.16との相性が悪い模様。

```dockerfile:Dockerfile
# install things globally, for great justice
# and don't create ".bundle" in all our apps
ENV GEM_HOME /usr/local/bundle
ENV BUNDLE_PATH="$GEM_HOME" \
    BUNDLE_BIN="$GEM_HOME/bin" \
    BUNDLE_SILENCE_ROOT_WARNING=1 \
    BUNDLE_APP_CONFIG="$GEM_HOME"
```

2.5.1のdockerfileは[こちら](https://github.com/docker-library/ruby/blob/c9644fe5c95cd71913db348baa41240f05d882b3/2.5/stretch/Dockerfile)

何が起きているか詳細にみてみる。
まずイメージを起動した直後、bundleコマンドは `/usr/local/bin` にインストールされている。

しかしながら、一度bundleを実行した後は以下のようになる。

```shell-session
$ which bundle   # /usr/local/bundle/bin/bundle
```

`/usr/local/bundle/bin/bundle`というファイルが作られて、その中身をみていくと次のような記述がある。

```rb:/usr/local/bundle/bin/bundle
  def gemfile
    gemfile = ENV["BUNDLE_GEMFILE"]
    return gemfile if gemfile && !gemfile.empty?

    File.expand_path("../../../../../tmp/bundle/Gemfile", __FILE__)
  end
```

なんと、/tmp/bundleのGemfileのパスがハードコードされている（！！！）
以後bundleコマンドを実行しても、この新しくできたbundleコマンドが参照され、カレントディレクトリのGemfielが参照されないという罠だった。
（これに気づくまであれやこれや調べてかなり時間を使った:cry:）

# 回避方法

2018年5月現在、まだgithubのissueはオープンなまま。
とりあえずgithubのissueでも議論されている暫定的な回避策としては環境変数として `export BUNDLE_GEMFILE=./Gemfile`を指定する方法がある。

通常bundleを実行した時にはカレントディレクトリにあるGemfileが参照される。（カレントにGemfileがない場合は親ディレクトリを探しにいく）
しかし、一度bundleを実行したあとにGemfileのパスが決め打ちされるような状況になるので、環境変数BUNDLE_GEMFILEを使って無理やりカレントのものを参照することで回避できる。

なぜbundleがbinの下にbundleコマンドを自ら作るのかまだ把握していないので、もし知っている方がいれば教えてください。bundleコマンド自身のバージョンを固定するため（？）
golangでbigqueryのReadでエラーが起きてはまった話

本題の通り
調べたサンプルで例えば

```
q := client.Query("SELECT word FROM [bigquery-public-data.samples.shakespeare] LIMIT 1;")
```

```
 Failed to Read Query:googleapi: Error 400: Syntax error: Unexpected "[" at [2:6]. If this is a table identifier, escape the name with `, e.g. `table.name` rather than [table.name]., invalidQuery
exit status 1
```

このエラーが

[じゃなくて`でてと言われているみたいだけど


```
q := client.Query("SELECT word FROM `bigquery-public-data.samples.shakespeare` LIMIT 1;")
```

と書くと今度はテーブルないよエラーになりなぜだという状態に。。

いろいろと調べたところどうもlegacySQLとstandardSQLがあるらしいです。

テーブルのオプションでSQL DialectにUse Legacy SQLのチェックがあれば
legacySQL使えるとありデフォルトはチェックあり

だけどエラーに。


ようやく解決方法がわかったので記事に

解決方法1

ヒントを書く

```
q := client.Query("#legacySQL\n SELECT word FROM [bigquery-public-data.samples.shakespeare] LIMIT 1;")
```

or

```
q := client.Query("#standardSQL\n SELECT word FROM `bigquery-public-data.samples.shakespeare` LIMIT 1;")
```

解決方法2

QueryConfigで設定する

```
q := client.Query("SELECT word FROM [bigquery-public-data.samples.shakespeare] LIMIT 1;")
q.QueryConfig.UseLegacySQL = true
```

or

```
q := client.Query("SELECT word FROM [bigquery-public-data.samples.shakespeare] LIMIT 1;")
q.QueryConfig.UseStandardSQL = true
```


この方法でエラーが出なくなった。

githubのissuesとか調べてもこの情報見当たらなかったけど
解決方法が別にあるのかも。。

とりあえず、解決方法2で実装することに
Sketch で Font Awesome のアイコンをテキストとして表示する (プラグイン無し)

Sketch でプラグインを使わずに Font Awesome のアイコンを **テキストとして** 表示したくなった。

検索しても「プラグイン入れろ」みたいな記事しか引っかからず、「面倒くさいし、なんかベクターで出力されそう」みたいな気持ちが芽生えて、海外のフォーラム読んでたらやり方が書いてあったのでメモ。

## 環境

- Sketch v50
- Font Awesome v4.7.0 インストール済み

(最新の v5.x でも大して変わらないはず)

## やりかた.gif

![output.gif](https://qiita-image-store.s3.amazonaws.com/0/32100/3052a728-5040-2c0c-79ce-7fe09874d6b9.gif)

## やりかた.txt

1. [Cheatsheet](https://fontawesome.com/v4.7.0/cheatsheet/) にアクセスする
2. アイコンをコピーする (Cheatsheet以外ではコピーできない)
3. Sketch でペーストする
4. そのままだと [?] みたいなトウフが表示される
5. Typeface で FontAwesome を選択する

## 結論

プラグイン無くてもサクッとイケる。
Windows7にscoopでgitをインストールした時のメモ

Windows7にscoopでgitをインストールしたので忘れないようにメモする。

##PowerShellの起動、更新
powershellを起動する
（スタートメニューの"プログラムとファイルの検索"に"powershell"を入力する）

バージョンを確認する
$PSVersionTable

バージョンが2.0の場合、Windows Management Framework を 3.0にアップデートする
https://docs.microsoft.com/ja-jp/skypeforbusiness/set-up-your-computer-for-windows-powershell/download-and-install-windows-powershell-3-0

Windows Management Framework 3.0 のダウンロード先
https://www.microsoft.com/en-us/download/details.aspx?id=34595
インストールした場合は再起動が必要


##Scoopのインストール
Scoopをインストールする
Set-ExecutionPolicy RemoteSigned -scope CurrentUser
iex (new-object net.webclient).downloadstring('https://get.scoop.sh')


##gitのインストール
gitをインストールする
scoop install git


##参考にしたサイト
Scoop と PackageManagement を使った Windows 環境の構築
https://qiita.com/kikuchi_kentaro/items/77793e4a21db6ffdb7cd


##おまけ（gitの動作確認）
git用ディレクトリへ移動する
cd C:\xampp\htdocs

git cloneでリポジトリを取得（初期設定）する
git clone https://github.com/uneri/calendar.git
※cloneしたいURLを入力する

取得したディレクトリに移動する
cd calendar

・・なにか変更する・・

gitのコミット用の値を設定する（gitのユーザーでなくてもよい）
git config --list
git config --local user.email "xxxxx@xxxx"
git config --local user.name "xxxx"

ローカルリポジトリへの追加
git add *
git commit -m "xxxx(コメント)"

リモートリポジトリへの追加
git remote -v
git push origin master
※ユーザー・パスワードのポップアップ画面が表示されます。

反映されたことの確認
git log

取り消す場合
git reset --hard xxxxx
git push -f
LogicProX 10.4.1  AppleLoops再インデックス手順

#AppleのLogicProX最新情報
##更新の遅さの問題
UIが変わっており、
「Apple Loops のライブラリを再インデックスするには、ループブラウザの上部にある「ループ」をクリックします。次に、ポップアップメニューから「すべてのループを再インデックス」を選択します。」
では現在非常にわかりづらい（新規ユーザーが推測しづらい）。

##本家の対処法
https://support.apple.com/ja-jp/HT201368
が更新されていない

##最新バージョンLogicProX 10.4.1の対処法
現在は「ループブラウザの上部にある「ループバック：すべてのジャンル」をクリックし、最下部にある全てのループを再インデックス」が正しい方法である。
![スクリーンショット 2018-05-15 21.25.29.png](https://qiita-image-store.s3.amazonaws.com/0/95487/40d32d9c-623f-c3a7-643a-2f3ee6d39398.png)
![スクリーンショット 2018-05-15 21.25.39.png](https://qiita-image-store.s3.amazonaws.com/0/95487/b90ad500-b7ec-2116-9187-48f485eea30d.png)
Ubuntu 18.04でマウスホイールのスクロール量を調節する

##Linux全般のマウスホイールが遅い問題
Ubuntu系、Cent系のデスクトップは使ったことあるけど、
ブラウザ見てて何でこんなにスクロールしないのって思った。

## 救世主imwheelの登場
みんな使っているimwheel。
ubuntu18.04を検証的に使ってみているので、16.04までのやり方で使えるか
試してみた。

## 結果
今までのやり方でできました。
参考
https://qiita.com/yumetodo/items/de3ae4155ff83544879b

## インストール
@yumetodoさんのやり方とほぼ同じ。

```
$ sudo apt install imwheel
```

## imwheelの設定

```
$ vim ~/.imwheel

".*"
None,      Up,   Button4, 2
None,      Down, Button5, 2
```

コマンド実行ユーザのホームディレクトリに.imwheelファイルを作成。
Button4、Button5の後ろの数字がスクロール量のようです。
これButton4とButton5入れ替えればMac見たいなスクロールになるのかな。


## imwheelの起動

```
$ imwheel
```

これで終了です。

## 自動起動設定
上の記事だと自動起動設定は自作serviceを作ってsystemdに登録するやり方だけど、
うまく動かなかったので、シンプルな方法で登録。

- スタートメニューみたいなボタンを押してType to search...から[Startup Applications Preferences]を選択
- Addを選択
- Nameにimwheel(何でもいい)
- commandにimwheel(起動コマンド)
- Commentは自由
- 右下のAddを選択

すると無事に再起動してもimwheelが立ち上がってくるように。
このやり方が一番シンプルで簡単だと思います。
Herokuを使って簡単にIoTサーバを立ち上げる 

ここでは、IFTTT用に簡単な簡単にIoTサーバを立ち上げる手順を紹介します。

##IFTTTとは
[IFTTT（イフト）](https://ifttt.com/)とはWebサービス上で、他のWebサービス（FacebookやTwitter、Gmail等）と簡単に連携できるサービスです。IFTTTにはWebhooksのチャンネルが用意されているので、特定のURLにPOST、GETで送信が可能です。

##Herokuとは
[Heroku](https://www.heroku.com/)はPaaS（Platform as a Service）というWebアプリケーションを実行するプラットフォームを提供してくれるサービスです。
詳しくはこちらのサイトの記事がわかりやすいと思います。
[【5分でわかる】herokuとは？概要や特徴をわかりやすく解説](https://www.sejuku.net/blog/7858)

<img width="500" alt="スクリーンショット 2018-05-15 19.04.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/46262/001f587a-e47b-8fd4-3ee8-5a69506f51d6.png">

##IoTサーバを立ち上げる

早速IoTサーバを立ち上げますが、こちらのデータを使用します。
[https://github.com/nyampass/iot-srv](https://github.com/nyampass/iot-srv)
herokuへのデプロイボタンが設定されていますが、試して見た所うまくいかなかったので、一旦、githubの「clone or download」ボタンをクリックして、ソースをダウンロードします。
![スクリーンショット-2018-05-13-12.01.36.png](https://qiita-image-store.s3.amazonaws.com/0/46262/89da9c9a-59cd-40b6-884c-0c2f3776a649.png)

ダウンロードしたファイルの「iot-srv-master/app.js」を下記の様に修正します。
![スクリーンショット-2018-05-13-12.08.48.png](https://qiita-image-store.s3.amazonaws.com/0/46262/51bd42ec-f677-5ee4-d233-4034d76db911.png)

修正したファイルを丸ごと、Herokuにデプロイします。
私は、Dropbox経由で視覚的にデプロイしています。詳しい方法は[herokuを使って、10分でWebサイトを公開する](http://mediamill.jp/archives/693)をご覧ください。

正常にデプロイ後、作成したドメインにアクセスすると、下記のサイトが表示されます。
<img style="border:solid 1px #cccccc;" width="500" alt="スクリーンショット 2018-05-15 15.41.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/46262/2c3d4339-cf2d-827c-1674-b747fa4e2ef9.png">

続いて、アドレスバーのURLに「/iot」と入力し「Enter」を押します。
<img width="294" alt="スクリーンショット 2018-05-15 15.49.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/46262/57fe947f-104e-22e4-ca93-20019243e6d1.png">

その後、再度ドメインにアクセスし直すと、下記画像の様に[デバイス一覧]に「iot」というリンクが表示されます。
※今回作成した「iot」は自由な名前に書き換えてOKです。また複数作成することが可能です。
<img width="500" alt="スクリーンショット 2018-05-15 15.52.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/46262/3f1f0641-082d-665d-f84e-c6b037ee8693.png">

[デバイス一覧]の「iot」をクリックすると下記の様なページが表示されます。
<img width="500" alt="スクリーンショット 2018-05-15 15.52.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/46262/3c4ccf22-c96b-3705-926d-1c68e2452b45.png">

アドレスバーに「/on」を入力して「Enter」を押してみてください。
下の図の様にブラウザに「on」の表示が表示されます。
<img width="500" alt="スクリーンショット 2018-05-15 15.54.42のコピー.png" src="https://qiita-image-store.s3.amazonaws.com/0/46262/2c63c6b6-26bf-8b9d-b970-bb911f30cf0f.png">

次にアドレスバーの「/on」を決して「/off」を入力して「Enter」を押してみてください。
下の図の様にブラウザに「off」の表示が表示されたでしょうか。
<img width="500" alt="スクリーンショット-2018-05-15-15.54.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/46262/73bfd688-1db4-5b44-0adc-78b85dd7fb69.png">

次にアドレスバーから「/off」を削除して「Enter」を押してみてください。
下記の図の様に表に大きな三角形が表示されたでしょうか？
これは、三角形のてっぺんがON時の記録、右の下がOFFになった時の記録です。
<img width="500" alt="スクリーンショット 2018-05-15 15.55.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/46262/14bcff5e-bb9e-f8f3-95a7-56ff1afb5cfe.png">

ON、OFFが記録できれば、デバイス側からONの時はライトを光らす、OFFの時はライトを消すなど設定することも可能です。

次回は、デバイス側の設定を紹介したいと思います。
【ASMR】プログラミングに疲れたらこれを聴け！！【催眠音声】

[Programastar.comという萌えキャラのYouTube動画でプログラミングが学べるチャンネル](https://www.youtube.com/channel/UCOznO6ysTr3PD9nVkHBmGOA
)があるのですが、その中にアップロードされている2本のASMR動画がエンジニアの脳をトロけさせると話題になっていたので紹介します。
ちなみに動画のタイトルにはASMRと書かれていますが、どちらかというと**催眠音声**に近い内容です。

## 1本目

![mqdefault.jpg](https://qiita-image-store.s3.amazonaws.com/0/16060/da9aa7e1-5732-72d8-b9b6-d49212acecf0.jpeg)
【 ASMR 】プログラミング初心者を応援します！【プログラミング初心者向け】
https://www.youtube.com/watch?v=WrbyJr76Ims
「**プログラミングって今この瞬間にできあがらなきゃいけないものじゃないからさ**」と問題を先送りにしてくれる七海有里佳ちゃんの動画。
その聖母のような優しい囁きはひと時だけでも**納期**という現実を忘れさせてくれます。

## 2本目

![mqdefault (1).jpg](https://qiita-image-store.s3.amazonaws.com/0/16060/4d01db86-8810-e25d-6cd2-6deabd51bd71.jpeg)
【 ASMR 】エンジニア応援！先輩と久しぶりの再会編【エンジニア向け】
https://www.youtube.com/watch?v=C3aheUvaEI8
「**エンジニアって困ってる人を助けてくれるスーパーマンだと思います**」と持て囃してくれる七海有里佳ちゃんの動画。
エンジニアという人種は女性と会話しただけで相手に惚れてしまうことで有名ですが、ここまで褒められるともはや結婚を意識せざるをえません。

## まとめ

女の子の声は癒やされますね。
SourcetreeやTowerでhuskyを使おうとするとnodeコマンドが見つからなくて動かないのを解決する

タイトル通り。GUI使いたいし、[husky](https://www.npmjs.com/package/husky)使いたいのに以下のようなエラーがでてくるので直接Gitコマンドを叩かざるを得なくなり困った。

```
.git/hooks/pre-commit: line 49: node: command not found
```

SourcetreeやTowerは`.bash_profile`や`.bashrc`を読み込まないので(?)、nodeがどこにあるかわからない模様。対応としては、いちどSourcetreeやTowerアプリを終了して、普段使うターミナルからアプリを起動しなおせばOK。

#### SourceTree

- **SourceTreeのコマンドラインツール**をインストールした状態で「`stree`」コマンドを実行。
- もしくは「`open ~/Applications/SourceTree.app`」のコマンドを実行

#### Tower

- [Towerのコマンドラインツール](https://www.git-tower.com/help/mac/integration/cli-tool)をインストールした状態で「`gittower `」を実行。

- もしくは「`open /Applications/Tower.app`」のコマンドを実行。

### 参考
- [SourceTree : Hook failing because paths don't seem to be set correctly](https://community.atlassian.com/t5/Bitbucket-questions/SourceTree-Hook-failing-because-paths-don-t-seem-to-be-set/qaq-p/274792)

### 環境
- macOS High Sierra 10.13
- Sourcetree 2.7
- Tower 2.6
- ndenv 0.4.0 でNodeを管理
BIND のインストール（ソースから）

メモ

# 手順

1. 実行用ユーザとグループを追加する

    ```
    # groupadd named \
    && useradd -g named -d /var/named/ -s /bin/false named \
    && chown named:named /var/named/
    ```

2. BIND のソースコードをダウンロードする

    ```
    # cd /usr/local/src/ \
    && curl -Lkvf https://www.isc.org/downloads/file/bind-9-11-3/?version=tar-gz -o bind-9.11.3.tar.gz \
    && sha256sum bind-9.11.3.tar.gz
    
    0d9dde14b2ec7f9cdc3b69f19540c7a2e4eee7b6c727965dfae48810965876f5  bind-9.11.3.tar.gz
    ```

3. ファイルを展開する

    ```
    # tar xvzf bind-9.11.3.tar.gz
    ```

4. ビルドする

    ```
    # cd /usr/local/src/bind-9.11.3/ \
    && ./configure \
    && make && make install
    ```
Rails5.2でExecJSのRuntimeエラー[ Windows10 ]

https://github.com/twbs/bootstrap-rubygem/issues/153

これによると、```config/boot.rb```に追記する変更が必要。

なので、以下を```config/boot.rb```へ追記

```ruby
ENV['EXECJS_RUNTIME'] = 'Node'
```

もちろん、Nodeを別でインストールしたうえでPathに通す必要があるが、
言わずもがな。

この情報は、英語のGithubのサイトにしか展開されていなかったので、
投稿。

他の記事が出たら、削除するよ～
ソース解読 > 手順 > 関数コール元を4つのディレクトリに対してgrepで調べる > Sublime Text 3使用

```txt:動作環境
Windows 7 Pro (32bit)
Sublime Text 3 Build 3143 (以下、ST3)
```

### やりたいこと

- 4つのフォルダにソースが分かれている
- １つのファイルで定義された関数が、どのフォルダのどのファイルの関数からコールされているか知りたい

### 準備

1. ST3を起動し、4つのウィンドウにする
    - タブを増やして、ウィンドウ外にドラッグ (位置は任意)
2. ST3の4つのウィンドウをGrid(2行2列)に整列する
    - 関連: [Windows 10 > ウィンドウの整列 > 手順 > 4つのウィンドウのGrid(2行2列)表示](https://qiita.com/7of9/items/a6974b5721abd110d5fa)
3. それぞれのウィンドウに対して下記を行う
    1. Ctrl + Shift + Fにてgrep検索機能を表示する
    2. Where:に関して、検索したいフォルダを設定する
        - ClearとAdd Folder使用

### 手順

1. 検索キーワードをCtrl+C
2. ST3の4つのウィンドウにおいて以下を行う
    1. Ctrl + Shift + Fにてgrep検索機能を表示する
    2. Find:の項目にてCtrl + V
    3. Enter
3. grepの結果から関数コール元を確認する

### 別のソフトでも試した

```txt:動作環境
秀丸エディタ Version 8.79
```

秀丸エディタでも試した。

秀丸エディタの場合、検索結果が空の場合に選択したフォルダ情報が破棄された。
別の関数を調べる時にフォルダを再度選択することになるため、ST3を使う方が作業効率は高いだろう。
Vue.jsでアロー関数を使うと詰む

#概要
この1週間、Vue.jsを使っていて、詰んだことを書きます。

#何があったの？
Vue.jsでは、関数内で"this"を使うことができます。this を用いて、Vue内の他のdataの値や関数を取得できる……はずだった。

```js
new Vue({
	el: "#root",
	data: {colorcode: "#FF00FF"},
	methods: {
		change_code: (event) => {
			console.log(this.colorcode);
		});
	}
});
```

ですが、change_code 関数内から呼び出した、this.colorcodeの値は "undefined" のままです。いろいろ試してみたけれど、やはり "undefined" のままでした。
原因は、アロー関数「(event) => {...}」を使ったせいでした。なので、アロー関数を、アロー関数でない形「function(event) {...}」に書き換えれば、値を取得することができるようになります。

```js
new Vue({
	el: "#root",
	data: {colorcode: "#FF00FF"},
	methods: {
		change_code: function(event) {
			console.log(this.colorcode);
		});
	}
});
```

#おわりに
対処法が分かれば簡単ですが、なかなか気づけなかったので、Qiitaに投稿しておきます。皆さまも、お気をつけくださいませ。
Google Todo リストを Google カレンダーで表示する

[先日リリースされた Google Todo リストアプリ](http://www.itmedia.co.jp/news/articles/1804/26/news067.html)の TODO リストをGoogle カレンダーに表示する方法です

## TL;DR

「リマインダー」カレンダーを「[TODO リスト] に切り替える」のです。

![TODO リストへ切り替える](https://docs.google.com/drawings/d/e/2PACX-1vQULJGjHQfZ-lN852UBSnGI55gKgoY0Ea3s3kt4QwHbMzPfTNR5fNk_s5dsx1aJPWdOzqnTXmJTzXDl/pub?w=429&h=376)

## "TODO リスト" はいずこ？

> タスクはGmailやカレンダーと互いに同期され、変更内容は両方のタスクに自動的に反映される。

と書かれているのに、Google カレンダーを探しても探しても探しても TODO リストを表示する方法がわからなかったのです。
結局「リマインダー」が「[TODO リスト]」だったという話でした

## やりかた

「リマインダー」のメニュー (赤枠) をクリックすると **[TODO リスト]へ切り替える** が出てきますので、それをクリックします

![TODO リストへ切り替える](https://docs.google.com/drawings/d/e/2PACX-1vQULJGjHQfZ-lN852UBSnGI55gKgoY0Ea3s3kt4QwHbMzPfTNR5fNk_s5dsx1aJPWdOzqnTXmJTzXDl/pub?w=429&h=376)

## 期限がカレンダーに反映されます

アプリで入力すると

<img width="375" alt="IMG_0050.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/22754/5d06bd01-33db-12d4-16b4-032554a38a9d.jpeg">

もちろんこのように反映されます。しかも期限に応じてカレンダーに表示されるのもいいですね

![todo.png](https://qiita-image-store.s3.amazonaws.com/0/22754/11fe36a6-9698-0dc1-cd26-29afa7940083.png)

## あとがき

というわけで、TODOリストを使い始めました

EoT
C# 稀によく使う機能

# 定数

~~~cs
System.Environment.NewLine;// 環境に応じた改行コード
~~~

# 引数

## 可変長引数

~~~cs
void Hoge(params int[] args)
{
...
}
~~~

#演算子

## 型変換

~~~cs
// 明示的型変換
public static explicit operator OutType(InType value)
{
}
// 暗黙的型変換
public static implicit operator OutType(InType value)
{
}
~~~

## Null合体演算子

~~~cs
// nullの場合は"null"を返す
string text = hoge ?? "null";
~~~

## Null条件演算子

~~~cs
// nullの場合はnullを返す
string text = hoge?.ToString();
~~~

# LINQ

## 配列の生成

~~~cs
// 0,1,...,8,9 の配列を作成
int[] ary = Enumerable.Range(0, 10).ToArray();

// 1,1,...,1,1 の配列を作成
int[] ary = Enumerable.Repeat<int>(1, 10).ToArray();
~~~

## 配列の比較

~~~cs
bool x = ary1.SequenceEqual(ary2);// 同じならtrue
~~~

## 重複の削除

~~~cs
var list2 = list.Distinct();
~~~

## 集計
 - accumulator：累積値
 - 1回目の呼出では、accumulatorに第1要素が, itemに第2要素が入っている。
 - リストの要素数が1個の場合、要素がそのまま返される。

~~~cs
// 例：全要素を乗算
var mul = list.Aggregate((accumulator, item) => accumulator * item);
~~~

## Dictionary のソート

* キーでソート後、Dictionaryに戻す。

~~~cs
sample = sample.OrderBy(item => item.Key)
    .ToDictionary(item => item.Key, item => item.Value);
~~~

* 値でソート後、Dictionaryに戻す。

~~~cs
sample = sample.OrderBy(item => item.Value)
    .ToDictionary(item => item.Key, item => item.Value);
~~~

#Enum
- 文字列 → Enum値
 - 第３引数：大文字と小文字を区別しない=true　区別する=false

~~~cs
var value = (EnumType)Enum.Parse(typeof(EnumType), str, true);
~~~

- Enum値 → 文字列

~~~cs
var str = value.ToString();
~~~

~~~cs
var str = Enum.GetName(typeof(EnumType), value);
~~~

- Enum値一覧取得

~~~cs
var hogeTypes = (HogeType[])Enum.GetValues(typeof(HogeType));// System.Arrayが返されるので、キャストする。
~~~

# Encoding

## シフトJISエンコーディングの取得

~~~cs
var encoding = Encoding.GetEncoding("Shift_JIS");
~~~

- コードページは932
- 以下の名前でも取得可能(全パターンは試していないが、大文字小文字関係なさそう)
 - SHIFT_JIS   
 - shift-jis   
 - Shift-JIS   
 - csShiftJIS  
 - csWindows31J
 - ms_Kanji    
 - x-ms-cp932  
 - x-sjis      

# ToString のフォーマット
- 浮動小数点数を指数表記ではなく普通の小数表記で表示するときは"0.#####…"を指定する。
 - ToString("G")の場合、0.00001ぐらいから指数表記になってしまう
 - ToString("F")の場合、精度99桁として"F99"を指定すると、0.00001は"0.00001000…"となり、不要な0が付く
 - float.Epsilon を表示するなら"#"が51個必要
 - double.Epsilon を表示するなら"#"が338個必要
 - スマートなやり方ではないが、調べた感じこうするしかない？

~~~cs
var str = value.ToString("0.##############");
~~~

## 2進数で表現した文字列に変換する

~~~cs
var str = Convert.ToString(hoge,2);
~~~

# DateTime

- 文字列に変換するときに、フォーマットを指定する

~~~cs
var dateTime = DateTime.Now;
dateTime.ToString("yyyy年MM月dd日 HH時mm分ss秒");// "2022年06月07日 14時26分01秒"になる
~~~

- 文字列からDateTimeに変換するときに、フォーマットを指定する

~~~cs
var str = "2019/11/22 12:34:56";
var format = "yyyy/MM/dd HH:mm:ss";
var dateTime = DateTime.ParseExact(str, format, null);
~~~

# IO
- カレントディレクトリの取得

~~~cs
System.Environment.CurrentDirectory;
System.IO.Directory.GetCurrentDirectory();
~~~

実行ファイルのパスを取得

~~~cs
string path = System.Reflection.Assembly.GetExecutingAssembly().Location;
~~~

# コメント

- 例外を記述する

~~~cs
/// <exception cref="System.Exception">～～の場合にスローされます。</exception>
~~~
xpathで正規表現を使いたい。Nokogiriにおける対応方法。

xpathで正規表現を使うapiは策定されているみたい（しらんけど）だけれど、ほとんどの環境でサポートされていない。

xpathで正規表現を使えると、複雑な条件をシンプルに指定できて幸せになれる(かもしれない)。

nokogiriではxpathの拡張ができるので、独自のapiをなんでも定義できる。
それをつかって正規表現を独自にサポートすることも可能である。

大したあれじゃないけど、クローラとかの実装でいろいろ役に立つので、スニペットとしてシェアしとく。

### api
```ruby
Nokogiri_opt = Class.new {
  def _extract_tgt(node, prop)
    tgt = nil
    if prop[0] == "@"
      tgt = node[prop.slice(1, 1024)]
    else
      # if ['class'].include?(prop)
      #   puts("warn: xnoko xpath prop is #{prop}. I guess it is not intended.")
      # end
      tgt = node.send(prop)
    end
    return nil unless tgt
    raise "tgt is not string. prop:#{prop}. tgt:#{tgt}" if tgt.class != String
    tgt
  end

  def regex(node_set, arg, regex)
    node_set.find_all do |node|
      tgt = _extract_tgt(node, arg)
      tgt =~ /#{regex}/
    end
  end
  def iregex(node_set, arg, regex)
    node_set.find_all do |node|
      tgt = _extract_tgt(node, arg)
      tgt =~ /#{regex}/i
    end
  end
}.new

def xnoko(doc, xpath)
  doc.xpath(xpath, Nokogiri_opt)
end

def xnoko0(doc, xpath)
  xnoko(doc, xpath).first
end
```

### how to use
```ruby

html = File.open('/tmp/a.html').read
doc = Nokogiri::HTML(html)

xnoko(doc, '//*[ regex(., "name", "a|span") and text()="ugg" ]') # a or spanタグ
xnoko(doc, '//a[ regex(., "text", "パターソンの妻は遊んでばかり") ]')
xnoko(doc, '//a[ regex(., "@href", "^http") ]')
xnoko(doc, '//div[ iregex(., "@class", "islarge") ]')
xnoko(doc, ' //a[ regex(., "@href", "^\s*http:.+/xx_(?:md|dt)_index/xx_(?:md|dt)_list/xx_(?:md|dt)_info/") ] ').each do |x|
  puts x[:href]
end
```
Kotlin nullable と Java Optional の変換

## nullable => Optional

Kotlin でコードを書いていると、 Java の Optional に変換する必要が出てきます。
そういった場合は `Optional.ofNullable` を使って `Optional` に変換します。
nullable でなければ `Optional.of` を使うこともできます。

### サンプル

```
    class SecurityAuditorAware: AuditorAware<Long> {
        override fun getCurrentAuditor(): Optional<Long> {
            val authentication = SecurityContextHolder.getContext().authentication

            if (authentication == null || !authentication.isAuthenticated) {
                return Optional.ofNullable(null)
            }

            return Optional.ofNullable((authentication.principal as UserDetail?)?.user?.id)
        }
    }
```

Java から見たら Kotlin の nullable はそうでないものと同じものに見えるので、 `Optional<Long?>` も `Optional<Long>` も `Optional<Long>?` も `Optional<Long?>?` も同じです。 サンプルにある `getCurrentAuditor()` の返り値の型には それらの 4パターンを使うことができます。


## Optional => nullable / not-nullable

Spring 5 の リポジトリ で `findById` を使うと、 `Optional<T>` が返ってきます。
そういう場合に Kotlin に値を渡すために `Optional` から中身を取り出したいことがあります。

```
optionalValue.get() => not-nullable
optionalValue.orElse(null) => nullable
```

## その他

`Optional` 型 の値にはほかにもさまざまなmethodが用意されています。

次の記事に詳しく記載されていました。
https://qiita.com/tasogarei/items/18488e450f080a7f87f3
TensorFlowで使う主なAPIを整理する(初心者向け)

# はじめに

[Machine Learning Crash Courseの内容を整理する](https://qiita.com/k3nNy_51rcy/items/832eab321c602aa587c6)で登場したTensorFlowのAPIを整理します。
機械学習の初心者向け講座で使われているAPIなので、TensorFlowの中でも抽象度の高いAPIばかりです。
機械学習マスターだ！という人がより繊細なチューニングがしたい場合、より下位のAPIが必要になるでしょう。

## Estimator

``tf.estimator``に定義されている分析器のAPI。どのような分析(線形回帰, ロジスティック回帰 など)を行うかを決める。
ざっくり二種類に分類できる。

* Regressor: 回帰モデルを作成したいとき(連続した値を予測したいとき)に使う。
    * LinearRegressor: 線形モデル
    * DNNRegressor: Neural Network
* Classifier: 分類モデルを作成したいとき(クラス分けしたいとき)に使う。
    * LinearClassifier: 線形モデル
    * DNNClassifier: Neural Network

## Optimizer

``tf.train``に定義されているAPI。学習時に使うアルゴリズムを選択する。
講座に出てきたのは以下の4種類(だったはず)。
他にもいっぱいアルゴリズムがあるようなので、勉強が必要かなぁ。

* GradientDescentOptimizer
    * 講座の最初に出てきた基本的なアルゴリズム。損失関数の勾配が下がる方向へweightを調整する。
    * 線形モデルで解ける問題のときに相性が良いらしい。
* FtrlOptimizer
    * "For the Regularized Leader" というアルゴリズム。先に到着したデータを正としてweightを調整する。
    * オンライン学習(学習中にも新しいデータが到着する)と相性が良いらしい。
* AdagradOptimizer
    * "Adaptive Gradient"(適応的な勾配)の略じゃないかと予想してる。(知ってる人いたら教えてください。)
    * 学習ステップが進むごとに学習率を変動させて、効率よく学習できるようにしたアルゴリズム。
    * 損失関数が凸型になる問題(線形モデルで解ける問題)には良くフィットするらしい。
    * 損失関数が凸型にならない問題では、常に最適とは言えないらしい。
    * 他のアルゴリズムに比べて学習率を高めに設定すると良い。(途中で学習率を調整していくため)
* AdamOptimizer
    * 損失関数が非凸型な問題の場合、Adagradアルゴリズムより良くなることがあるらしい。
    * 調整できるパラメータがいくつかあるけど、受けた講座では学習率以外はノータッチ。

## feature columns

``tf.feature_column``に定義されているAPI。featureの値の種類によって使い分ける。

* numeric_column
    * 連続した数値で表現されるfeatureの場合に使う。
* bucketized_column
    * 連続した数値で表現されているfeatureをいくつかのクラスに分類したいときに使う。
    * 例: 「年齢」をfeatureとして使うときに、「~20」「21~25」...「60~」というようなクラスに分けて扱う。
* crossed_column
    * ベクトルで表されるfeature同士をかけ合わせてfeature crossを作りたいときに使う。
    * 例: クラス分けした「年齢」と「出身地」をかけ合わせて新たなfeatureを作り出す。
        * 「年齢」 = [0, 0, 1, 0, ..., 0]
        * 「出身地」 = [0, 1, 0, 0, ..., 0] (出身地と対応する位置の要素だけ1、その他は0のベクトル)
        * crossed_column = [[0, 0, ..., 0], [0, 0, ..., 0], [0, 1, ..., 0], ... ]
* categorical_column
    * すべての値がどれかのカテゴリに分類できるfeatureの場合に使う。
    * 大量のカテゴリを定義しやすいように、categorical_columnを作成するAPIがいくつか用意されている。
        * categorical_column_with_vocabulary_file: 全てのカテゴリを行区切りで書き下したファイルを使ってカテゴリを定義する。
        * categorical_column_with_vocabulary_list: 全てのカテゴリを書き下したリストを使ってカテゴリを定義する。
        * categorical_column_with_hash_bucket
        * categorical_column_with_identity
    * "よく分からない"カテゴリのデータの扱いは二通りある。
        * デフォルトの値に置き換えてしまう。
        * out-of-vocabularyというカテゴリに分類してしまう。out-of-vocabularyカテゴリを複数用意することもできる。(複数使いたくなるシーンってどんなとき…？)
* embedding_column
    * 入力するfeatureが膨大で、featureの次元を落としたいときに使う。
    * ニューラルネットのニューロン数を落として計算コストを下げるのに有用。ニューラルネット以外で使えるのかどうかは分からない。

# あとがき

講座に出てきた中から重要そうな(よく使いそうな？)APIを整理してみました。
tensorflow触りたてなので、他にも「これはよく使うよー！」とかあれば教えてください。
React Native version mismatch


## error: React Native version mismatch

参照：[React Native version mismatch (on app that was working a couple of hours ago) ](https://github.com/facebook/react-native/issues/19259)

## エラー内容
エミュレータは起動するが、`React Native version mismatch`のエラーがでる

## 対処
`app/build.gradle`の`dependencies`に下記を追加する

使用しているreact-native version: 0.54.4の場合

`compile ("com.facebook.react:react-native:0.54.4") { force = true }`

```app/build.gradle
dependencies {
 ...
   compile ("com.facebook.react:react-native:0.54.4") { force = true }
 ...
}
```
Webpack / Electronでモジュールの再リロードが出来なくて困った件

# 急いでいる人向け
```js
delete global.require.cache[global.require.resolve('moduleName')];
let module = global.require('moduleName');
```

# 概要
とある残念なサードパーティモジュールがあり、そいつは関数式を返すのではなく、
Functionオブジェクトを返してきた。

もちろん、そのオブジェクトのプロパティに値を詰めたりして使っていたのだが、
初期化して再度そのオブジェクトを使う場面が出てきやがった。

require.cacheをdeleteして、再度requireしたら、
直近のオブジェクトに酷似したものを返してきたんだ。

それはもう数日かけて、眠い目を擦らせながら調べたものさ。

# 実験 & 調査
**[1]本当にキャッシュが消えていないのか**

```js
console.log(require.cache);
delete require.cache[require.resolve('moduleName')];
console.log(require.cache);
```

これだと対象のモジュールのキャッシュは消えていなかった。

**[2]本当にキャッシュはあるのか**

```js
console.log(require.cache[require.resolve('moduleName')]);
delete require.cache[require.resolve('moduleName')];
console.log(require.cache[require.resolve('moduleName')]);
```

しかし、これだとdelete後はundefinedになっていた。
じゃあrequireしたオブジェクトが過去のオブジェクトと酷似している理由はなんだ！？
require.cacheからとってきているんじゃないのか！？

**[調査結果]**
nodejsのrequireとは違う動きしてるんじゃないか・・？

# 解決策
https://stackoverflow.com/questions/49342888/webpack-electron-require-dynamic-module

https://stackoverflow.com/questions/37339866/using-node-require-with-electron-and-webpack/37349344#37349344

**global.requireを使いなさい。**

requireは、__webpack_require__()に変換されているらしく(未確認)、
それでうまくいかないらしい。

# 後日談
global.requireとやらがそもそも知らなかったので調べて見たものの、
これといった資料が見当たらない・・・。

とりあえず中をのぞいてわかったことは、キーをモジュールのフルパスで持っているということだ。

何かいい情報が載っている記事がありましたら、誰か教えてください。
react-native android build failed

## react nativeでandroid エミュレータ build failed

`react-native run-android`でBUILD落ちる

```
Could not install the app on the device,
```

```
FAILURE: Build failed with an exception.
```

## 原因
- JDKのバージョン 10.0.1だった

## 対処
- ダウングレード
- DL: http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
-  Java SE Development Kit 8u172

```sh
$ java -version
java version "1.8.0_171"
Java(TM) SE Runtime Environment (build 1.8.0_171-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.171-b11, mixed mode)
```
herokuで一時ファイルを使用する場合

## herokuでのファイルの取り扱い
herokuではdynoが再起動するため、ローカルファイルを保存できないのは有名だと思います。

では、一時ファイルを使う場合どうするか。

``/tmp``以下を使う

もちろん``/tmp``以下のファイルもdyno再起動時に削除されます。
macのスクリーンセーバーをメッセージボード（伝言板）として使う

#macOSのComputer nameというスクリーンセーバーをメッセージボード（伝言板）として使う

![スクリーンショット1.png](https://qiita-image-store.s3.amazonaws.com/0/207772/da474e96-678b-bf66-21ff-d8db98a0d465.png)


macのコンピューター名、スクリーンセーバーは自由にメッセージを設定する事ができます。ただ毎回、システム環境設定を開いて設定を行うのは面倒です。そこで簡単に設定出来ないか調べました。

スクリーンセーバーの設定は、~/Library/Preferences/ByHostの中に設定ファイルが保存されているのですが、直接書き換えはできません。そこで、defaultsコマンドを使います。

```bash
$ defaults write ~/Library/Preferences/ByHost/com.apple.ScreenSaver.Basic MESSAGE "ほげほげ"
```

macOSには一連の処理を自動化するアプリ「Automator」があるので其方で３ステップアプリを作成します。
![スクリーンショット2.png](https://qiita-image-store.s3.amazonaws.com/0/207772/e080c90d-a199-4867-0076-f6ea8b3296d2.png)

すると、どうでしょう。ダブルクリック起動でメッセージ入力ダイアログが表示され、OKボタンを押すとスクリーンセーバーを自動的に起動するようになりました。
Alibaba Cloud各リージョンのスピードテスト


中国のアリババが展開するクラウドサービス、Alibaba Cloudの記事の第二弾です。
前回の記事は[こちら](https://qiita.com/biosugar0/items/266e4c68c8759a6b4cc6)。
今回はAlibaba Cloudが提供する仮想サーバーサービス、ECS(AWSで言うEC2)を使います。

ECSでは、日本や中国、アメリカ、シンガポールなど、リージョンの選択肢から1つ選んでインスタンスを作ります。

一般的には、リージョンが日本から遠くなると日本との通信速度が遅くなってしまいますが、各リージョンでどれくらい速度が違うものなんでしょうか？

ということで、今回は各リージョンで作成したインスタンスでスピードテストをしてみました。リージョンを選択するときの参考にしてみて下さい。
>きちんと分布を見たり統計的に出してるわけではないのであくまで参考に。


## 結果

まずは計測結果から。速い順です。
日本との通信なので、やはり圧倒的に`Asia Pacific NE 1 (Japan)`リージョンが速いですね。

リージョン      | ping(ms)      |download(Mbit/s)|upload(Mbit/s)
------------- | -------------|-------|---
Asia Pacific NE 1 (Japan)|2.656|425.81|113.39
Hong Kong(China)|52.896|267.14|93.02
Singapore|69.222|285.26|102.59
China North 2 (Beijing)|70.192|273.90|90.85
China North 5 (Huhehaote)|76.508|137.45|80.53
China East 2 (Shanghai)|78.734|7.03|94.89
Asia Pacific SE 3 (Kuala Lumpur)|80.511|164.16|83.89
Asia Pacific SE 5 (Jakarta)|84.301|203.23|98.82
China North 1 (Qingdao)|89.155|14.11|92.82
China East 1 (Hangzhou)|95.617|3.22|4.43
China North 3 (Zhangjiakou)|103.387|248.91|90.27
US West 1 (Silicon Valley)|111.39|215.78|79.52
Asia Pacific SOU 1 (Mumbai)|146.203|48.50|44.88
Dubai|161.715|61.87|71.32
Australia 1 (Sydney)| 197.195 |119.28 |65.22
US East 1 (Virginia)|220.451|92.69|56.74
China South 1 (Shenzhen)|229.961|3.31|65.00


## 方法

計測には、[speedtest-cli](https://github.com/sivel/speedtest-cli)を使いました。

### 測定対象

#### OS

* CentOS 7.4 64bit

#### リージョン

* China North 1 (Qingdao)
* China North 2 (Beijing)
* China North 3 (Zhangjiakou)
* China North 5 (Huhehaote)
* China East 1 (Hangzhou)
* China East 2 (Shanghai)
* China South 1 (Shenzhen)
* Hong Kong(China)
* Asia Pacific NE 1 (Japan)
* Singapore
* **Australia 1 (Sydney)
* Asia Pacific SE 3 (Kuala Lumpur)
* Asia Pacific SE 5 (Jakarta)
* Asia Pacific SOU 1 (Mumbai)
* US East 1 (Virginia)
* US West 1 (Silicon Valley)
* Dubai

### speedtest-cliのインストール

```
pip install speedtest-cli
```


### 計測

#### 使用するテスト用サーバ

東京のサーバを用いて通信速度をテストしました。

* 14623) IPA CyberLab (Bunkyo, Japan)

#### コマンド

```
speedtest --server 14623 --simple
```
右からスライドインしてくるCollectionViewのアニメーション


CollectionView表示時に右からスライドインするアニメーションをつけた際の備忘録

![スクリーンショット 2018-05-15 17.51.16.png](https://qiita-image-store.s3.amazonaws.com/0/97817/c69a642f-10f0-8fbe-f630-7c88713f717a.png "スクリーンショット 2018-05-15 17.51.16.png")

↑こんなのをつくりたい

## 実装

```objective_c
- (void)collectionView:(UICollectionView *)collectionView willDisplayCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath {

    CGRect cellRect = cell.frame;
    cell.frame = CGRectMake(self.mCollectionCell * indexPath.row + self.view.frame.size.width, cell.frame.origin.y, cell.frame.size.width, cell.frame.size.height);
    float value = indexPath.row * 0.1;
    [UIView animateWithDuration:1 delay:value options:UIViewAnimationOptionCurveEaseInOut animations:^{
        cell.frame = CGRectMake(cellRect.origin.x + self.view.frame.size.width, cellRect.origin.y, cellRect.size.width, cellRect.size.height);
    } completion:^(BOOL finished) {
        cell.frame = cellRect;
        }];
    }];

```

これで右からスライドしてくるcollectionViewを実装できた。
もっといい方法あったら知りたい。。
SPSS Modelerでつくったモデルの式を抜き出す

# SPSS Modelerでつくったモデルの式を抜き出す

SPSS Modelerでつくった式をModelerのGUIで確認するだけではなく、テキストで抜き出したいことがあります。
モデルによってはそれは可能です。

## 決定木分析の場合
「モデル」タブで「モデルをクリップボードにコピー」のボタンをクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/60a343de-2ab6-edde-682f-ea134b98d4c6.png)

次の情報がクリップボードにコピーされます。

Income <= 1 [ モード: F ] 
　Credit_cards <= 1 [ モード: T ] 
　　Age <= 37 [ モード: F ] => F 
　　Age > 37 [ モード: T ] => T 
　Credit_cards > 1 [ モード: F ] 
　　Age <= 34 [ モード: F ] => F 
　　Age > 34 and Age <= 45 [ モード: F ] => F 
　　Age > 45 [ モード: F ] => F 
Income > 1 and Income <= 2 [ モード: T ] 
　Credit_cards <= 1 [ モード: T ] 
　　Age <= 29 [ モード: T ] => T 
　　Age > 29 and Age <= 37 [ モード: T ] => T 
　　Age > 37 [ モード: T ] => T 
　Credit_cards > 1 [ モード: F ] 
　　Age <= 27 [ モード: F ] => F 
　　Age > 27 and Age <= 37 [ モード: F ] 
　　　Car_loans <= 1 [ モード: T ] => T 
　　　Car_loans > 1 [ モード: F ] => F 
　　Age > 37 and Age <= 45 [ モード: T ] => T 
　　Age > 45 [ モード: T ] => T 
Income > 2 [ モード: T ] 
　Credit_cards <= 1 [ モード: T ] 
　　Age <= 34 [ モード: T ] => T 
　　Age > 34 [ モード: T ] => T 
　Credit_cards > 1 [ モード: T ] 
　　Age <= 27 [ モード: T ] => T 
　　Age > 27 and Age <= 37 [ モード: T ] => T 
　　Age > 37 [ モード: T ] => T 



## 線形の場合
「係数」のビューの「表」スタイルを選び、表を右クリックして、「オブジェクトをコピー」を選びます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/826580b1-503a-db0b-e0d1-ceebff8dfa8f.png)

次の情報がクリップボードにコピーされます。
Coefficientが回帰式の係数になります。

attribute	superColumn	rowName	superRow	V5
Importance	facet2column3	定数項		
Sig	facet2column1	取扱品目		.000
Importance	facet2column3	間口		0.131
Coefficient	facet2column1	定数項		6.754
Importance	facet2column3	取扱品目		0.138
Sig	facet2column1	間口		.000
Coefficient	facet2column1	乗降客数		0.514
Sig	facet2column1	乗降客数		.000
Importance	facet2column3	乗降客数		0.730
Coefficient	facet2column1	取扱品目		0.287
Sig	facet2column1	定数項		.546
Coefficient	facet2column1	間口		12.509
knockでRails5.2のAPIモードにユーザ認証を追加する

## はじめに
[knock](https://github.com/nsarno/knock)というJWT認証のGemを使ってRails5.2のAPIモードで構築したWebAPIにユーザ認証を付けてみます。

## 準備
てことで、とりあえずknockをbundle installして、完了したらRailsにインストールします。

```
rails g knock:install
```

これで`config/initializers/knock.rb`が生成されてるはず。

knockはAuth0っていうユーザ認証サービス?に対応しているらしいんですけど、
今回はUserモデルを用意して認証情報は自前で管理します。
下記コマンドでUserリソースで認証するためのコントローラを生成します。

```
$ rails g knock:token_controller user
```

`app/controllers/user_token_controller.rb`っていうコントローラが生成されてると思います。
ついでに`config/routes.rb`に生成したコントローラに対するルーティングも追加されます。
これで必要なファイルは揃ったので実装していきましょう。

## 実装
まずUserモデルのマイグレーションを作成。

```db/migrate/yyyymmddhhiiss_create_users.rb
class CreateUsers < ActiveRecord::Migration[5.2]
  def change
    create_table :users do |t|
      t.string :email
      t.string :password_digest

      t.timestamps
    end
    add_index :users, :email, unique: true
  end
end
```

サクッとマイグレーションしましょう。

```
$ rails db:migrate
```

次にUserモデルに`has_secure_password`メソッドを追加します。

```app/user.rb
class User < ApplicationRecord
  has_secure_password
end
```

最後にapplication_controllerにknockの認証モジュールをインクルード。

```app/application_controller.rb
class ApplicationController < ActionController::API
  include Knock::Authenticable
end
```

## 動作確認
適当なユーザを作ってHTTPクライアントから`config/routes.rb`に追加されたルートに、

```
POST /user_token
{"auth": {"email": "作成したユーザのメールアドレス", "password": "作成したユーザのパスワード"}}
```

を送信するとステータスコード201と共にJWTトークンが返ってくる。

## はずなんだけど…
上手くいきませんでした、TypeErrorが返ってきます。
GitHubを調べてたら似たようなIssueを見つけました。
[https://github.com/nsarno/knock/issues/205](https://github.com/nsarno/knock/issues/205)

どうやら`Rails.application.secrets.secret_key_base`はRails5.2以降はnilを返すようで、
`config/initializers/knock.rb`の`config.token_secret_signature_key`を変更する必要があるようです。
てことで下記のように変更しました。

```config/initializers/knock.rb
## Signature key
## -------------
##
## Configure the key used to sign tokens.
##
## Default:
# config.token_secret_signature_key = -> { Rails.application.secrets.secret_key_base }
# 以下を追加
config.token_secret_signature_key = -> { Rails.application.credentials.read }
```

これでちゃんとJWTトークンが返ってくるようになりました。
あとは認証が必要なコントローラに`before_action :autheticate_user`を追記すれば
認証されていないリクエストはステータスコード401が返ってくるようになります。
Facebookログインがhttps必須になったので、localhost開発でも対応する

# 追記⚠️（2018/08/05）
正直ngrokを毎回通すの面倒だなと思っていたら 素晴らしい記事を見つけました。
私もこれからpumaでは↓の方法でやるつもりです。
[Rails5 + pumaのローカル環境でSSL/HTTPSを有効にする](https://qiita.com/zaru/items/ccf328e87c768168134d)

SSL証明書とは何かなど、もっと勉強しなければですね😅

追記終わり

# 結論だけ知りたい方へ

- ngrokを使うとlocalhostで動くものを外部に公開できます。
- しかもhttpsのURLがランダムで付与されるので、実質的にhttps通信によるFacebookログインが可能になります。

Macの場合以下でインストール可能
`$ brew cask install ngrok`

実行は、以下。
`$ ngrok http 3000`
この3000はportナンバーなので適宜変更が必要です。

Facebookの管理画面の項目をngrokで得たURLに合わせて修正します。

# 背景

Facebookログインにhttps通信が必須となりました。
通常の開発環境でのlocalhostではhttp通信ですので、Facebookログインが実装できません。

## Facebookのデベロッパー管理画面
以下の「HTTPSを強制」のところを「いいえ」にできなくなっています。
また、「有効なOAuthリダイレクトURI」をしっかりと指定しなければエラーします。

<img width="945" alt="スクリーンショット 2018-05-15 17.20.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/98204/792801ea-dd64-8d57-cbb6-02cbb08ecadd.png">


# ngrokを使用

## ngrokとは
localhostで動くものを外部に公開できます。
ネット上には有料・無料の情報が両方ありますが、バージョンの違いによるものです。
実際に使ったところバージョン１系はまだ無料のようです。

## ngrokのインストール

Macの場合以下でインストール可能
`$ brew cask install ngrok`

## ngrok実行

`$ ngrok http 3000`

3000は今回localhostで使用しているポート番号。
環境ごとに変更する必要があります。

```
ngrok by @inconshreveable                                                (Ctrl+C to quit)

Session Status                online
Session Expires               2 hours, 28 minutes
Version                       2.2.8
Region                        United States (us)
Web Interface                 http://127.0.0.1:4040
Forwarding                    http://80149e9e.ngrok.io -> localhost:3000
Forwarding                    https://80149e9e.ngrok.io -> localhost:3000

Connections                   ttl     opn     rt1     rt5     p50     p90
                              24      0       0.00    0.00    20.81   37.58

HTTP Requests
-------------

GET /                             200 OK
GET /users/auth/facebook/callback 302 Found
GET /users/auth/facebook          302 Found
GET /favicon.ico                  200 OK
GET /                             200 OK
GET /users/auth/facebook/callback 500 Internal Server Error
GET /users/auth/facebook          302 Found
GET /favicon.ico                  200 OK
GET /favicon.ico                  200 OK
GET /                             200 OK
```

## Facebook側の設定

### 設定>ベーシック画面
アプリドメインのところにngrokを実行した結果のドメインを入力します。
上の例ですと、

```
80149e9e.ngrok.io ngrok.io
```

の様に入力します。

### Facebookログイン設定画面
以下の様にします。
「有効なOAuthリダイレクトURI」をしっかりと指定しなければエラーします。

<img width="945" alt="スクリーンショット 2018-05-15 17.20.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/98204/792801ea-dd64-8d57-cbb6-02cbb08ecadd.png">

以上でlocalhostでもFacebookログインを試しながら開発をできます。
CentOS7でyumのgroupinstallができなかった件


###経緯など
エラーが出たので確認したところそもそもCentOS7からパッケージグループ名が変わっててbaseとかcoreとか存在しないっぽい。

個人的にgroup名のスペースや言語設定で名前変わることに納得いかなかったのでgroupidつかってました。groupidはgrouplistのとき-vつけるとカッコ()内に表示されてるやつ。（ansibleのyumモジュールだとgroupidは@^groupidという表現をする）

ここ↓みると`--setopt=group_package_types=mandatory,default,optional`つけると元通りのgroup、groupid名でいけますと書いてある
https://access.redhat.com/solutions/1310043

インストールはできたが、grouplistでもとのgroup、groupid名を引くことができない。

で、どうするかというと、`# yum groups mark convert`を打つと現在入ってるパッケージをもとにパッケージグループをupgrade対象のホワイトリストに割り当てる？インストール済みとしてmarkする？というような。manと動確でそんな感じでよさそうな気がした。


そうすると、変更後前後のインストール済みgroup、groupid名は以下のかんじになる

Ansibleのyumモジュールではsetoptオプションの対応がないっぽいのでcommandモジュールかなんかつかうしかなさそう。

```yaml

- name: base packages group install
  #yum:
  command: yum -y groupinstall "{{ item }}" --setopt=group_package_types=mandatory,default,optional
#    name: "@^{{ item }}"
#    state: present
#    conf: /etc/yum.conf
  with_items:
    - core
    - base
    - development
    - compat-libraries
    - console-internet
    - perl-runtime
```
このタスクでインストールしたあとに、`yum groups mark convert`打つ前後の確認すると以下のように★のとこが増えてる

```
# yum grouplist -v
Installed Groups:
   Compatibility Libraries (compat-libraries)
   Console Internet Tools (console-internet)
   Development Tools (development)
↓
Installed Groups:
   Compatibility Libraries (compat-libraries)
   Console Internet Tools (console-internet)
   Development Tools (development)
   Legacy UNIX Compatibility (legacy-unix)★
   Security Tools (security-tools)★
   System Administration Tools (system-admin-tools)★
```

`yum groups mark convert`で増えてたlegacy-unixなどでgrouplistでチェックタスクつくるといいのと入れる時もこの名前にしたほうがいいのかも？
と思いきや実際に`yum groupinstall legacy-unix security-tools system-admin-tools --setopt=group_package_types=mandatory,default,optional`で表示されたパッケージと`yum groupinstall core base perl-runtime --setopt=group_package_types=mandatory,default,optional`で表示されたものは結構違ってました。

それとAnsibleにしたときは@^じゃなくて@で動いたりはしたのですが、他のあとからのタスクでバージョン指定で入れてたりexcludeしてたりすると1回目の後からタスクの時と2回動かしたグループインストールの時にパッケージ競合でエラーで止まるので冪等とはなんだったのかという感じになったりなど。
対策としては
・groupinstallしない
・1回いれたら2回目はリポジトリを無効化しpriorityはなし
・rpm -qaのリストを食わせてカスタムリポジトリからインストールする(environmentごとにdiffって差分を別のリストから入れる）
というくらいがよさそうなんじゃないでしょうか。updateする場合は個別にタスク生成して実行などで。

~~パッケージ管理は統合する話もなんとなくちら聞きしましたがいつになるのか等よくわからず願望なだけかもしれなくて眉唾なんですかね。~~
と思ったらYumの後継としてDNFというのがある模様でした。([めんどうだ](https://qiita.com/smallpalace/items/57bf018909644e7c3e70)からaptと統合しないかなとか思ってしまったけど、エディタとOSと同様に統合するわけなくて用途にあわせて好きに使えばいい話ですかね）
https://ja.wikipedia.org/wiki/DNF_(%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2)

###さんこう
[`man 8 yum`](http://man7.org/linux/man-pages/man8/yum.8.html)
https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/system_administrators_guide/sec-working_with_package_groups
treeコマンドめっちゃ便利〜〜

なんかターミナルを早く打つ方法ないかな〜とか検索してたら、「treeコマンド」っていうの見つけました。

結構便利そうなので、入れてみることにした。

Windowsは元から入ってるらしい（知らんけど）

macはインストールしないといけないので、インストール

# treeをインストール

```
brew install tree
```

シンプルですね。


#treeを使ってみる

```
$ tree
```

これだけでいけます。
出力はこんな感じ。
ファイル名適当すぎるけどw


![スクリーンショット 2018-05-15 17.23.14.png](https://qiita-image-store.s3.amazonaws.com/0/238739/6782feaf-a316-6a92-9617-1d7a45e90e9c.png)


もっとtreeコマンドについて知りたい方はこのサイトがオススメ
[【 tree 】コマンド――ディレクトリをツリー状に表示する](https://www.k-tanaka.net/cmd/tree.php)

終わり。
Xcode9で謎エラー unknown error -1=ffffffffffffffff

Xcodeでビルドすると、ある日突然このようなエラーが。

```
xxxx.framework: unknown error -1=ffffffffffffffff
```

Clean しても DerivedData してもダメ。

直前に起きた変な現象としては、何故かキーチェーンアクセスのパス入力を求められたこと。

ということで以下コマンドを実行

```
security set-key-partition-list -S apple-tool:,apple:,codesign: -s /Users/YOUR_USERNAME/Library/Keychains/login.keychain-db
```

無事ビルドできました。
QEMUのRaspberry Pi 3モデルでコアを識別する

QEMUのRaspberry Pi 3モデルをベアメタルで使うと、デフォルトで４つのコアでロードしたコードが動いて不便なので、不要なコアを無理やり止めてみました。

QEMUは2.12を使いました。

# コアの識別方法
Raspberry Pi 3には、Cortex-A53が４個載っています。　Cortex-A53で、コアを識別するには、各コアが持つ Multiprocessor Affinity Register　(MPIDR_EL1) の下位8ビットを読めばよいです。詳しくはCoretex-A53のTRMをみてください。(http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0500g/BABHBJCI.html)

このレジスタを読むココードをインラインアセブラを使って書いてみました。

```c
uint32_t get_core_id(void)
{
    uint64_t id;
    asm volatile("mrs %0, mpidr_el1" : "=r" (id));
    id &= 0xff;
    return id;
}
```

このレジスタは、circl64のブート部分 (https://github.com/rsta2/circle64/blob/master/lib/startup.S) を見ていて発見しました。


# コアの止め方
とりあえず、不要なコアに対して、HALT命令を発行して止めました。

HALTはアセンブラで記述しました。

```
.section .text

.globl io_hlt
io_hlt:
    wfe
    ret
```

コアのIDが1-3だったら、io_hlt()を呼びます。

```
    // disable core1 , core2 and core3
    if (get_core_id() != 0) {
        while (1) { io_hlt(); }
    }
```

# 動作例

サンプルコード

```
void io_hlt(void);

void kernel_main(uint32_t r0, uint32_t r1, uint32_t atags)
{
    // disable core1 , core2 and core3
    if (get_core_id() != 0) {
        while (1) { io_hlt(); }
    }

    printf("core_id %u\n", get_core_id());
}
```


コアを止めないと、４コア分の表示がされます。

```
qemu-system-aarch64 -m 128 -M raspi3 -nographic -kernel kernel.elf
core_id 0
core_id 1
core_id 2
core_id 3
```


コアを止めると、表示が１回になります。

```
qemu-system-aarch64 -m 128 -M raspi3 -nographic -kernel kernel.elf
core_id 0
````

# よくわからない

コアを止めない場合、４回出力されるのですが、idの値が変な場合が多々あります。
おそらくUARTデバイスをアクセスする際に競合がおきているんだと思われます。

```
qemu-system-aarch64 -m 128 -M raspi3 -nographic -kernel kernel.elf
core_id 3
core_id 1
core_id 1
core_id 0
```

```
qemu-system-aarch64 -m 128 -M raspi3 -nographic -kernel kernel.elf
core_id 3
core_id 0
core_id 0
core_id 0
```

```
/qemu-system-aarch64 -m 128 -M raspi3 -nographic -kernel kernel.elf
core_id 2
core_id 2
3
core_id 2
3
1
core_id 2
3
1
core_id 2
```
FlutterでCloud Firestoreが動かない


## 結論

結論からいうと動かせました。でも手順通りにやっても動かないので
誰かの力になればと思い書きます。
また、この問題はFlutterが対応すれば直ることなのでこの記事執筆時点では動きませんでしたが、
すぐに直ると思います。


## Google developers の Codelab通りにやってもうごかない

「Flutter Firebase」とかで検索するとたぶん上の方に出てくるCodelab通りにやっても動かず時間を潰してしまいました。

https://codelabs.developers.google.com/codelabs/flutter-firebase/#0

## 手順通りにやっても動かない場合の対処方法

上のURL通りにやっても動かない！って場合は「Flutterのチャンネル」を変更しましょう！


## そもそもCloud Firestore pluginにちゃんと明記されている

そもそもこの件は下記のURLにちゃんとかかれています。

https://github.com/flutter/plugins/tree/master/packages/cloud_firestore

<img width="919" alt="スクリーンショット 2018-05-15 17.10.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/139360/7ad31d62-a7aa-7525-e154-1767a6fc300a.png">

ざっくり要約すると

「まだ、betaチャンネルにはこのプラグインはリリースされてないから、devチャンネルを使ってね！」ってことでしょうか。

## チャンネルを変更する

実行環境を下記のコマンドで変更します。

```
flutter channel dev
```

![スクリーンショット 2018-05-15 17.13.00.png](https://qiita-image-store.s3.amazonaws.com/0/139360/9586d843-1986-aa71-0e8e-613f094c7726.png)

Flutterをcloneしたディレクトリに移動したときに「dev」と表示されていれば成功です。

※Flutterのパスが通ってない方はこちらをどうぞ
https://github.com/flutter/flutter/issues/15408

これで再実行するとエラーがなくなり実行できるようになります。

<img width="359" alt="スクリーンショット 2018-05-15 16.45.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/139360/210ae5e7-3c67-a9f7-b382-b113152486ac.png">

## 早く直してほしい

プラグインがbetaの方にもリリースされればそもそもこの問題は起こらないかと思います。
誰かの力になれば。
EHCache + Playのdevだけエラー出る

EHCacheとPlayframeworkの組み合わせで、どういうわけかデフォルトのCacheAPIを使ってないと起こるClassNotFoundExceptionやClassCastExceptionが起こる問題がある。

Play2.5までは

https://qiita.com/ponkotuy/items/d587b3dd635482292405

で解決していたのだが、2.6でできなくなってしまった。

結論から言うとEHCacheがメモリ内のCacheデータが引き継がれるときにエラーが発生するので、Serializeしてしまうかreload時に古いものを全消しするという雑な手法で解決できる。雑過ぎるので最後の手段でどうぞ
git リポジトリのコミット数をメールアドレスで集計するワンライナー

```bash
git shortlog --summary --email|
awk '{arry[$NF] += $1;} END{for(i in arry){print arry[i] " " i}}'|
sort -n
```

`git shortlog --summary --email` はnameが違うと別に集計されちゃうし、 [`.mailmap` 用意する](https://git-scm.com/docs/git-shortlog#_mapping_authors)のも面倒って時に。
PHP Generator

# generatorを、for文で使ってハマったのでメモ

## コード

````php
<?php
function randGenerator($count)
{
    for($i = 1; $i <= $count; $i++) {
        if($i >= 5){
            yield $i;
        }
        yield $i * 2;
    }
}
 
$sum = 0;
foreach(randGenerator(10) as $num => $value) {
    print($num."個目: ".$value."\n");
    $sum += $value;
}
print("合計: ".$sum);
````

## 結果
yieldで処理が止まっているので、再開された場合、次のyieldの処理が実施されてしまう。

`````
0個目: 2
1個目: 4
2個目: 6
3個目: 8
4個目: 5
5個目: 10
6個目: 6
7個目: 12
8個目: 7
9個目: 14
10個目: 8
11個目: 16
12個目: 9
13個目: 18
14個目: 10
15個目: 20
合計: 155
`````