OmniAICreator/Qiita-1.07M huggingface dataset:
BigQueryのユーザ定義関数は結果が再利用される

# 概要
BigQueryのユーザ定義関数は呼び出し結果が再利用されるよーって話です。
再利用させないためにはカラムの値を引数として与えよう。

# BigQueryのユーザ定義関数
BigQueryのユーザ定義関数を使って、呼び出す度に乱数を返す処理を作成して結果のカラムに追加してみます。
BigQueryでは標準で乱数を返す関数`RAND()`が用意されていますが今回はあえてJavaScriptで書きます。

ユーザ定義関数の書き方は
[ユーザー定義の関数  |  BigQuery  |  Google Cloud](https://cloud.google.com/bigquery/sql-reference/user-defined-functions?hl=ja)
を参照

## 引数を与えない場合
JavaScriptの乱数生成処理`Math.random()`にはseed値の入力ができないため、乱数を生成するための引数は不要です。
なので、呼び出すだけで乱数を返す関数を作ります。

### Query
```sql
CREATE TEMPORARY FUNCTION random()
RETURNS STRING
LANGUAGE js AS """
return Math.random().toString();
""";
WITH numbers AS
  (
  SELECT 1 AS x
  UNION ALL
  SELECT 2 AS x
  UNION ALL
  SELECT 3 as x
  UNION ALL
  SELECT 4 AS x
  UNION ALL
  SELECT 5 AS x
  UNION ALL
  SELECT 1 as x
  )
SELECT x, random() as random
FROM numbers;
```

### 結果

![no_arg.png](https://qiita-image-store.s3.amazonaws.com/0/115059/c0b0979f-2e45-5f5b-c144-51399ee79538.png)

全て同じ値が帰ってきます。

## 引数を与える場合
ユーザ定義関数内で特に使い道はありませんが、カラムの値を引数として渡してみます。

### Query
```sql
CREATE TEMPORARY FUNCTION random(x FLOAT64)
RETURNS STRING
LANGUAGE js AS """
return Math.random().toString();
""";
WITH numbers AS
  (
  SELECT 1 AS x
  UNION ALL
  SELECT 2 AS x
  UNION ALL
  SELECT 3 as x
  UNION ALL
  SELECT 4 AS x
  UNION ALL
  SELECT 5 AS x
  UNION ALL
  SELECT 1 as x
  )
SELECT x, random(x) as random
FROM numbers;

```
### 結果
![arg_1.png](https://qiita-image-store.s3.amazonaws.com/0/115059/d2c21f80-3629-16a7-16f4-b0cd31db407c.png)

すべて違う結果になりました。
また、xが1の項目が2つありますが、それぞれ違う値が帰ってきているところを見ると、カラムを引数と取る場合には値が同じでも毎回呼び出しているようです。
というか、処理中に値まで参照して判定していない…？

## 引数に定数を与えてみる
引数として全ての呼び出しに1を与えてみると…

### Query

```SQL
CREATE TEMPORARY FUNCTION random(x FLOAT64)
RETURNS STRING
LANGUAGE js AS """
return Math.random().toString();
""";
WITH numbers AS
  (
  SELECT 1 AS x
  UNION ALL
  SELECT 2 AS x
  UNION ALL
  SELECT 3 as x
  UNION ALL
  SELECT 4 AS x
  UNION ALL
  SELECT 5 AS x
  UNION ALL
  SELECT 1 as x
  )
SELECT x, random(1) as random
FROM numbers;
```

### 結果

![fixed_arg.png](https://qiita-image-store.s3.amazonaws.com/0/115059/69f97840-289d-fd48-39a2-033e05e3237b.png)

結果は同じになります。

# まとめ
BigQueryにユーザ定義関数を作成した場合の呼び出しについて、

1. 引数を渡さない場合、引数に同じ数値を固定値として渡す場合には呼び出し結果は再利用される
2. カラムの値を引数として渡した場合、毎回ユーザ定義関数を呼び出すことが出来る
3. カラムの値を引数として渡した場合、中の値が同じでも結果は再利用されずにもう一度呼び出される

処理速度を上げるために必要な最適化処理だと思いますが、
知らなくてちょっと悩みました。

で、コレが何の役に立つのかというと、
例えば、全てのログに対してUUIDを発行したい場合などに、引数を渡さずにUUIDを生成した場合に全て同じUUIDを返すという悲しい事が発生します。
「テストするから分かるだろう」って話ですが、
じゃぁ、前任者から引き継いだ関数に内部で使っていない引数があって…
なんてパターンがありそうだなと思いました。

再利用させたくない場合はカラムの値を引数にとりましょう。
Google I/O Extended 2018 Tokyo@GDGに参加したのでまとめました

# [Google I/O 2018](https://events.google.com/io?gclid=EAIaIQobChMIrq-c8dqQ2wIV2AorCh32IAl6EAAYASAAEgJdwfD_BwE) の報告会
Google I/O 2018に参加した人、内容を見た人達によるLTや報告会です。

# タイムテーブルと発表資料
タイムテーブルと分かってる範囲で発表資料です。※間違ってたら指摘ください。

|時間|項目|登壇者|
|:--|:--|:--|:--|
|10:00-10:30|受付|-|
|10:30-10:40|Opening|-|
|10:40-10:45|（LT）[ARCoreの新機能とSceneformによるARアプリ開発](https://docs.google.com/presentation/d/e/2PACX-1vT_vdHs5_yq_H74T0WhGJbxNFRScwjkWRXB3lO3XIQlDwnpXMDZJqcngEv9S3okzoKPhO2jlMPXbOpZ/pub?start=false&loop=false&delayms=3000&slide=id.p)|[ken1_taka](https://twitter.com/ken1_taka) さん|
|10:45-10:50|（LT）[ChromeOS/Firebase](https://qiita.com/Yatima/items/3e564cdfb6482ef9d9cf)|@Yatima さん|
|10:50-10:55|（LT）[CodeLab / Flutter](https://speakerdeck.com/takattata/flutter)|@takattata さん|
|10:55-11:00|（LT）Cloud Anchors|西良浩さん|
|11:00-11:05|（LT）[What's new in Chrome DevTools](https://docs.google.com/presentation/d/1FCu_lbsqAhwUpg7pg3Wr__-oeZItXju3ozWfV2GNZ2k/edit?usp=sharing)|[tomoyukikashiro](https://twitter.com/tomoyukikashiro)さん|
|11:05-11:10|（LT）[Post-evolution state of the web](https://speakerdeck.com/edwardkenfox/post-evolution-state-of-the-web)|@EdwardKenFox さん|
|11:10-11:25|質問タイム|LTスピーカー全員|
|11:25-11:35|Google I/O 現地レポート|[しょこさん](https://twitter.com/_okohs)|
|11:35-11:45|じゃんけん大会|-|
|11:45-13:00|お昼休憩
|13:00-13:20|Google I/O 全体俯瞰|@taquo さん|
|13:20-13:40|[Session (1) Android](https://drive.google.com/file/d/1NuxBCmuz6f5oDUmukQAYdg8d7Y4_mv8I/view)|@zaki50 さん|
|13:40-14:00|[Session (2) Android / Flutter](https://www.slideshare.net/kanbara/google-io-2018-highlights-flutter-wearos)|@korodroid さん|
|14:00-14:10|休憩|
|14:10-14:30|[Session (3) Assistant](https://speakerdeck.com/yoichiro/o-extended-2018-tokyo-at-gdg-assistant)|@yoichiro さん|
|14:30-14:50|Session (4) Web|[jxck](https://twitter.com/Jxck_)さん|
|15:10-15:20|Session (5) Firebase / Cloud / ML|@dddaisuke さん|
|15:20-15:30|休憩 and 移動|
|15:30-17:30|Codelab（ハンズオン）||
|17:30-17:35|写真撮影||
|17:35-17:40|Closing||

# コードラボ（ハンズオン）
今回はハンズオンがありました。
内容としては以下
・[PWAハンズオン](https://codelabs.developers.google.com/codelabs/your-first-pwapp/index.html?index=..%2F..%2Findex#0)
・[Assistantハンズオン](http://www.eisbahn.jp/codelabs/actions-1/)
この2つから選んでやる形式でした。

Assistantのは前にshibuya.apk（yahoo開催）のときに見た気がするなー。。。
と思いつつも、アナウンスちゃんと聞いてなくてAssistantのハンズオンに出ちゃいました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/151973/81daa3d0-b701-7e91-bebd-2ca4bdb79708.png)
こんな感じで。
PWAのハンズオンのURLもゲットしたので、時間があるときにでもやろうかなと思います。

# 感想
今回はAndroid開発者なのでAndroidメインで聞きましたが、
**Navigation**と**Paging**がいいなーと思いました。I/OのYoutubeとか見ないと。

SingleActivityを推奨するわけではないけど、1Activity1Fragmentみたいな構成はそもそもあんまり推奨してないのかなと思いました。（ここらへんは結構議論の的のような気がしている）

まぁVMを各Fragmentで管理するようにしちゃえば、特段Activityをいっぱい生やさなくてもなんとかなるのか・・・
とりあえず、暇なときに触りたい機能です。いや、触ります。

**Paging**は、Roomと相性がいいって言う点で現在のPJとは完全に無縁。
ですが、リストに対して必要なデータのみ出るようにするってことなんで、一覧を表示するアプリは是非使ってみたい機能です。（うちのプロジェクトでは残念ながら使えないので）

今回のところは以上です。

※今度時間取ってだめなところは更新できそうなら更新します。
[Flutter] デバッグ時にPythonのImportErrorが起きた話

# 出くわしたエラー
## 状況
VSCodeからDebugをStartしてアプリを起動した際、以下のエラーが出た。
なお、アプリの起動・挙動には問題なし。

## エラー内容
```
Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "/usr/local/Cellar/python@2/2.7.15/Frameworks/Python.framework/Versions/2.7/lib/python2.7/copy.py", line 52, in <module>
    import weakref
  File "/usr/local/Cellar/python@2/2.7.15/Frameworks/Python.framework/Versions/2.7/lib/python2.7/weakref.py", line 14, in <module>
    from _weakref import (
ImportError: cannot import name _remove_dead_weakref
```

# 原因
そもそもこれは**pythonのエラー**であり、flutterのエラーではない。

なぜ発生したか。
flutterのインストール後に`flutter doctor`を叩き、
「`✗ Missing Xcode dependency: Python module "six".`」というメッセージが出たので、
brewでpythonをダウンロードしたのだが、それが原因だったぽい。(たぶん競合)

# 解決策
**`brew remove python@2 --ignore-dependencies`**
でいけた。

念のため、`flutter doctor`を叩いて問題がないことを確認する。

```
Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel beta, v0.3.2, on Mac OS X 10.13.4 17E202, locale ja-JP)
[✓] Android toolchain - develop for Android devices (Android SDK 27.0.3)
[✓] iOS toolchain - develop for iOS devices (Xcode 9.3.1)
[✓] Android Studio (version 3.1)
[✓] VS Code (version 1.22.2)
[✓] Connected devices (1 available)

• No issues found!
```
お手軽に Instagram風PageControlを実装してみる

# 作るもの
![タイトル](https://d3sw39zdfkajdx.cloudfront.net/art_img/07b0535f-9dc0-4b20-ad47-12644ea5addcgif)

### FlexiblePageControlが便利
今回はshima11さんのFlexiblePageControlを使用して実装していきます

参考: https://github.com/shima11/FlexiblePageControl

### Pods
```Podfile
pod "FlexiblePageControl", :git => "https://github.com/shima11/FlexiblePageControl.git"
```

### Storyboard
UIViewから選択
表示させたい位置に配置してください
<img width="1087" alt="スクリーンショット 2018-05-19 15.20.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/186277/ba7689d9-3ef1-94b1-1548-36e88298cef5.png">


### Code

必要なものをIBOutletで接続

```swift
import FlexiblePageControl

class CardCell: UITableViewCell, UIScrollViewDelegate {

@IBOutlet weak var scrollView: UIScrollView!
    
@IBOutlet weak var flexiblePageControl: FlexiblePageControl!
```

pageControlの実装は特に難しくありません

```swift
        flexiblePageControl.numberOfPages = images.count
        flexiblePageControl.pageIndicatorTintColor = .gray
        flexiblePageControl.currentPageIndicatorTintColor = .blue
        flexiblePageControl.currentPage = 1
```

### ScrollViewのDelegateで更新
```swift
    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        flexiblePageControl.setProgress(contentOffsetX: scrollView.contentOffset.x, pageWidth: scrollView.bounds.width)
    }
```

おしまい
[rails5.2] Active Adminの導入


Active Adminを利用してみました。導入手順を残しておこうと思います。

## 環境
|||
|:-:|:-:|
| Rails | 5.2.0 |
| ruby  | 2.5.1 |
| mysql | 5.7.20 |

##　まず 
```ruby:Gemfile
gem 'activeadmin'
```
※deviseはすでにインストール済みです

## Install
管理ユーザーのモデルを今回は「ActiveAccount」として作成したいと思います。

```
$ bundle install
$ bin/rails g active_admin:install --skip-users # オプションはadminuserを作成しない
      create  config/initializers/active_admin.rb
      create  app/admin
      create  app/admin/dashboard.rb
       route  ActiveAdmin.routes(self)
    generate  active_admin:assets
   identical  app/assets/javascripts/active_admin.js.coffee
   identical  app/assets/stylesheets/active_admin.scss
      create  db/migrate/20180518132718_create_active_admin_comments.rb

# 管理ユーザーのモデルの作成
$ bin/rails g active_admin:install AdminAccount
      invoke  devise
    generate    No need to install devise, already done.
      invoke    active_record
      create      db/migrate/20180518133149_devise_create_admin_accounts.rb
      create      app/models/admin_account.rb
      invoke      rspec
      create        spec/models/admin_account_spec.rb
      invoke        factory_bot
      create          spec/factories/admin_accounts.rb
      insert      app/models/admin_account.rb
       route    devise_for :admin_accounts
        gsub    app/models/admin_account.rb
        gsub    config/routes.rb
      append    db/seeds.rb
    conflict  config/initializers/active_admin.rb
Overwrite /Users/sakai/sakaibox/railsApps/blog/config/initializers/active_admin.rb? (enter "h" for help) [Ynaqdh] n #active_admin.rbは上書きしない
        skip  config/initializers/active_admin.rb
       exist  app/admin
   identical  app/admin/dashboard.rb
      create  app/admin/admin_accounts.rb
      insert  config/routes.rb
    generate  active_admin:assets
   identical  app/assets/javascripts/active_admin.js.coffee
   identical  app/assets/stylesheets/active_admin.scss
   identical  db/migrate/20180518132718_create_active_admin_comments.rb
```

### ActiveAdminの設定ファイルを変更

今回は管理者ユーザーモデルを「AdminAccount」として作成しているので
下記のように修正します。

```ruby:config/initializers/active_admin.rb
- config.authentication_method = :authenticate_admin_user!
+ config.authentication_method = :authenticate_admin_account!
- config.current_user_method = :current_admin_user
+ config.current_user_method = :current_admin_account
- config.logout_link_path = :destroy_admin_user_session_path
+ config.logout_link_path = :destroy_admin_account_session_path
```

### 管理画面のURLの変更
デフォルトでの管理画面のURLは admin/xxx（admin/login、admin/logout等）に設定されているが
下記で変更可能です。

```ruby:config/initializers/active_admin.rb
# config.default_namespace = :admin
config.default_namespace = :admin_login
```

```
# 確認
$ bin/rake routes
```

```
$ bin/rake db:migrate

# db/seeds.rbのデフォルトのユーザの記載があるので管理ユーザーを作成します。
$ bin/rake db:seed
```

## 確認

```
$ bin/rails s
```

http://localhost:3000/admin_login/login

## 参考
[Active Admin](https://activeadmin.info/documentation.html)
[Railsで最速で管理画面を作る！](https://qiita.com/enomotodev/items/5f6d9348207124a41bf9)
slimでinputやradioとかcheckboxでchecked属性を動的に付ける

いつもどうやるんだっけ？？と嵌るので備忘録

## 結論

checked属性の後に=(式)と書けば式の結果がtrueならcheckedが入る falseなら入らない
たとえばUserクラスにadmin?メソットがある場合など

```slim
input(type="checkbox" checked=(@user.admin?)) //=> <input checked type="checked">
```

なんかわかりにくいですよね。
 checked if @user.admin? だっけ？
 #{"chekced" if @user.admin? } だっけ？
 (checked if @user.admin?) だっけななぁ〜？
って、いつも思っちゃうんですよねぇ
ファイル システム制限のため、要求された操作を完了できませんでした

「ファイル システム制限のため、要求された操作を完了できませんでした」

が客先で唐突に出始め、アプリケーションが起動できなくなった問題が起こった。
そもそもこのエラーは何だオイと思ってGoogle先生に頼って調べると、
「VHD」とか
「Hyper-V」とか
「Windows Server 2008バックアップ」での記事が出てきた。

でもうちのシステムそんなことしてないよなあと思って情報を切り捨てた。
ただ、**「ファイルが何か関係してるんだろう」**ぐらいは頭に留めた。

### 客先検証
と言ってもリモートデスクトップで見た程度なんだけど、客先の環境は複数台のPCと1台のサーバーで動かしていて、
「そのうちの1台のPCで動かない、他は動く」
との前情報があったので、動かないPC固有の問題だなあと思ってスタックトレースとかを見ていた。
そしたら、
**File**とか
**StreamWriter**とか
がスタックトレースに出てきて、*あ～～～～～～～～*(言葉にならない感情)

### 結局なんだったの
*「ファイルが何か関係してるんだろう」の予測は的中*していて、
ローカルにログを残してる**TXTファイルの大きさが13.8GBになっていて、書き込処理を完了できなかった**。
これだけだった。
元のファイルを消すなりリネームするなりして、無事解決となった。


詳しく調べていないのだが、まあ単純に、操作できるサイズではなかったんだろうという個人的見解。
数年分のtxtはヤバいな～
メモ帳で開こうとして、「開けるサイズを超えています」ってエラーが出た時に「あっ……」と。


「VHD」とか「Hyper-V」とか「Windows Server 2008バックアップ」とか絡んでないのに同じエラーが出る人はご参考までに……
(こんな内容の記事どこにもなかった)
Unity3DでiOSビルドの設定

iPadやiPhone向けのゲームを作るとき、ビルドで作ったものを確認したい時があった。
特殊な方法でビルドするので、記述しておく。

##**iOSで開発する場合のビルドの設定方法**
**iOSでビルドする場合、DeviceかMacが必要である。**
- C#でスクリプトなどを作成するが、iOSではXcodeでビルドするため。
- 今回はMacでビルドした。

**Unity上の設定**
- ビルドする前に、Unity上の設定を変える必要がある。
- Edit→Project Settings→Player項目から Target SDKを変更する。
- Deviceがない場合、simulator SDKに変更する必要がある。（自分はシミュレーターで実行した）

**Unityでビルド**
- ビルドしてからビルドが生成されたフォルダーを確認すると、「○○.xcodeproj」という名前のファイルがあるのでそれを実行。
- 実行するとXcodeで立ち上げることができ、上段のUnity-iPhoneの項目でどういうデバイスで実行するかの選択もできる。
- 自分が開発するデバイスを選択してビルド実行。
- するとログインを求める画面が出てくるが、キャンセルで無視できる（20180519現在）



これで自分のチームが作ったものをMac上でシミュレーターから確認でき、修正点を見つけられる。
[WIP]M5GO/M5Stack MicroPythonメモ

# M5GO/M5Stackについて

* http://m5stack.com 
* 以前はPayPalが使えないaliexpress https://www.aliexpress.com/store/3226069 が公式ショップ
* 今はPayPalが使えるココ→ http://m5stack.com/shop/index.html
* 安全安心スイッチサイエンス(ただし売り切れ多し) https://www.switch-science.com/catalog/list/770/
 * https://twitter.com/integra/status/995979158558687232
* 店頭で買うなら、千石電商、ツクモロボット王国…

# ツールなど

* esptool.py
 * ESP32にfirmwareをflashするツール  https://github.com/espressif/esptool
 * M5GOにfirmwareをflashする場合 

```https://github.com/m5stack/M5GO/blob/master/firmware/v0.11/flash.sh(COMポートを修正)
esptool.py --chip esp32 --port COM5 --baud 961200 write_flash -z 0x1000 firmware.bin
esptool.py --chip esp32 --port COM5 --baud 961200 --before default_reset --after no_reset write_flash -z --flash_mode dio --flash_freq 40m --flash_size detect 0x1b0000 spiffs_image.img
```

* REPL:Read Evaluate Print Loop
 * MicroPythonの対話実行環境。シリアルに接続することで実行可能
 *  https://docs.micropython.org/en/latest/esp8266/esp8266/tutorial/repl.html

* ampy:Adafruit MicroPython tool
 * PCからM5GOにpythonファイルなどを書き込み可能
 * https://github.com/adafruit/ampy

```
ampy -p COM5 ls /flash
ampy -p COM5 run file.py
ampy -p COM5 put file.py /flash/_main.py
```

* フォントファイル変換ツール
 * メモリの関係か、ポイント数の大きなフォントは表示できないので、不要なグリフを削除すると表示できる場合があります。
 * https://github.com/loboris/MicroPython_ESP32_psRAM_LoBo/tree/master/MicroPython_BUILD/components/micropython/esp32/modules_examples/tft/font_tool/

# 言語、ライブラリ仕様など

* MicroPython
 * https://docs.micropython.org/en/latest/esp8266/index.html
* ESP32(LoBo実装)
 * https://github.com/loboris/MicroPython_ESP32_psRAM_LoBo/wiki
* M5Stack/M5GO独自部分
 * https://github.com/m5stack/M5Cloud
 
# 参考リソース

* techtutorialsx 
 * https://techtutorialsx.com
* robo8080さん
 * https://blog.goo.ne.jp/roboz80
 * https://twitter.com/robo8080
*
Affinity Propagation

#Affinity Propagation(AP)とは

あらかじめクラスタ数を決めることなくクラスタリングできる方法。

#Affinity Propagationの概要
オブジェクトのペア(i, j)について以下の2つのメッセージを計算する。

- responsibility $r_{i,j}$
- availability $a_{i,j}$

収束するか、資源が尽きるまで、イテレーションごとに
$r_{i,j}$と$a_{i,j}$は更新される。

収束したら、オブジェクトiのexempler:$c_{i}$は、
$$c_{i} = arg\max_{j}\left( a_{i,j} + r{i,j} \right)$$
で得られる。

##responsibility 
オブジェクトiがオブジェクトjをどれくらいexamplerとしたいか、という指標。
以下のように計算される。
$$ r_{i,j} = \boldsymbol{L_{i,j}} \left( \sum_{k:k \neq j}{a_{i,k}\boldsymbol{L_{i,k}}} \right)^{-1}$$

ここで、$\boldsymbol{L}$は尤度行列。つまり$\boldsymbol{L_{i,j}}$はオブジェクトi,j間の類似度を表す。$\boldsymbol{L_{i,j}}$が大きくなると、i,jは似ている、ということになる。$\boldsymbol{L}$の対角成分は自分で決定する。対角成分の大小はクラスタ数の大小に影響を与える。経験的には、$\boldsymbol{L}$の非対角成分の平均値か中央値にすると良いらしい。

##availability
オブジェクトjが、どれくらいオブジェクトiのexamplerでいたいか、という指標。
初期値は1にセットされ、以下のように計算される。

$$ a_{j,j} = -1 + \prod_{k:k \neq j}{(1+r_{k,j})} $$
$$ a_{i,j} =  [ {1 + (\frac{1}{r_{i,i}} - 1) \prod_{k:k \neq i, k \neq j}{(1+r_{k,j})^{-1}}}]^{-1} $$




#参考文献
[Alejando et al.] [Clustering-Based Anomaly Detection in Multi-View Data] (http://www.kecl.ntt.co.jp/people/kimura.akisato/pdf/cikm2013.pdf)
素のjavascriptでCSS操作

# 背景

以前作った
 [cssのみで立体な球体を表現](https://qiita.com/hashito/items/18ce6b629d0851e79d24)
 [目で追従するやつをriotで実装](https://qiita.com/hashito/items/6e33e59e6fe8dc3b352a)

という記事を合わせれば、光の当たる点を動かせるのかと思い立ったので実装。
ついでに素のjavascriptのみで実装してみました。

# 結果
こんな感じで実装できました。

![名称未設定.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/89227/de252cea-667d-6dc1-11ca-b323c260acb6.gif)

<p data-height="265" data-theme-id="0" data-slug-hash="vjvddN" data-default-tab="js,result" data-user="hashito" data-embed-version="2" data-pen-title="Movement of shadow of ball by mouse" class="codepen">See the Pen <a href="https://codepen.io/hashito/pen/vjvddN/">Movement of shadow of ball by mouse</a> by hashito (<a href="https://codepen.io/hashito">@hashito</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

# 内容

基本的にはCSSは「[cssのみで立体な球体を表現](https://qiita.com/hashito/items/18ce6b629d0851e79d24)」の実装と同じです。


``` javascript
// マウスムーブイベント
document.onmousemove = function (e){
  // スタイルシートからお探しの定義を検索する関数
  // c:対象のスタイルシートオブジェクト
  // tg:対象の文字列
  var get_syle=(c,tg)=>{
    return c[Object.keys(c).filter((v)=>{
      return c[v].selectorText==tg
    })[0]]
  };  
  var styleEl = document.querySelector('style'); //　スタイルシートを取得
  var cssRuleList = styleEl.sheet.cssRules;      //　スタイルシート各種定義を取得
  var mb=get_syle(cssRuleList,".mi1::before");   //　.mi1::before定義を取得
  var ma=get_syle(cssRuleList,".mi1::after");    // .mi1::after定義を取得
  // ２つのポイントから角度を検索
  var point2angle=(p1,p2)=>{
    return Math.atan2((p1.y-p2.y),(p1.x-p2.x)); 
  }
  // 角度から点を算出
  // r:角度
  // l:中心点からの距離
  var angle2point=(r,l)=>{
    return {x:Math.cos(r)*l,y:Math.sin(r)*l};
  }

  var _k  = point2angle(e,{x:150,y:150});//差を算出
  var _p  = angle2point(_k,25);//白い点の移動値
  var _p2 = angle2point(_k,15);//影の移動値
  //白い点の更新
  mb.style.top  =37.5+_p.y+"px";
  mb.style.left =37.5+_p.x+"px";
  //影の更新
  ma.style.boxShadow = 'inset '+ _p2.x +'px '+_p2.y+'px 10px 3px #000';
};
```

# 思ったこと
 * ```box-shadow``` は ```style.boxShadow```でアクセスする必要がある
 * ```style.boxShadow```とかで設定する時に最後に```;``` とかが有るとエラーが起きず更新もされない
 * スタイルを検索する関数を作ったけど、他にいいアクセスの方法無いかなぁ…
Pythonでリスト中のユニークな要素に対して順番に数値ラベルをつけていくコードについて

たとえば，アルファベット26文字の中からランダムに1文字選んでリストに追加する処理を50回行ったとすると，

```python:makedata.py
import random

chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
data = []

for i in range(50):
    data.append(random.choice(chars))

print(data)
```

```python:data
['Y', 'B', 'G', 'H', 'D', 'R', 'I', 'I', 'R', 'R', 'R', 'W', 'R', 'R', 'L', 'P', 'V', 'K', 'N', 'M', 'O', 'T', 'P', 'T', 'I', 'E', 'S', 'Q', 'F', 'W', 'W', 'T', 'D', 'M', 'E', 'E', 'R', 'R', 'X', 'E', 'X', 'K', 'K', 'T', 'L', 'Y', 'D', 'C', 'F', 'N']
```
このように要素数50個かつ重複ありのアルファベットのリストが得られる．

ここで，```data```内において少なくとも1回は登場するアルファベットに対して，数値ラベルを0から順番につけたいという状況を考える．以前は，

```python:unique.py
data_dict = {}
count = 0

for char in data:
    if char not in data_dict.keys():
        data_dict[char] = count
        count += 1

print(data_dict)
```

```python:data_dict
{'Y': 0, 'B': 1, 'G': 2, 'H': 3, 'D': 4, 'R': 5, 'I': 6, 'W': 7, 'L': 8, 'P': 9, 'V': 10, 'K': 11, 'N': 12, 'M': 13, 'O': 14, 'T': 15, 'E': 16, 'S': 17, 'Q': 18, 'F': 19, 'X': 20, 'C': 21}
```

のようなコードを書いていたのだが，```count```という変数をわざわざ用意してインクリメントしていくのは微妙な気がしていた．
そこで，このような書き方があることに気づいた．

```python:unique.py
data_dict = {}

for char in data:
    if char not in data_dict.keys():
        data_dict[char] = len(data_dict) #data_dictのサイズを数値ラベルとして付与

print(data_dict)
```

```python:data_dict
{'Y': 0, 'B': 1, 'G': 2, 'H': 3, 'D': 4, 'R': 5, 'I': 6, 'W': 7, 'L': 8, 'P': 9, 'V': 10, 'K': 11, 'N': 12, 'M': 13, 'O': 14, 'T': 15, 'E': 16, 'S': 17, 'Q': 18, 'F': 19, 'X': 20, 'C': 21}
```

要は，新しいユニークなアルファベットが登場した際につける数値ラベルを，その時点での```data_dict```のサイズにしただけである．
細かいところだが，ちょっとした工夫でコードの見映えは変わったと思う．

自然言語処理で学習データとして使用する文章を単語単位で区切ってリストに追加していき，得られる単語群から少なくとも1回は登場する単語に対して順番に数値ラベルをつけていくときにこんなことを考えたので，メモ程度に．
Fortran で FizzBuzz 

#前置き
『FizzBuzzを1byteで実装する』という記事を読んだので、それを参考として、しばらくぶりに Fortran でFizzBuzz をやってみました。
https://qiita.com/ymg_aq/items/b8e5d26035180bc8797e

以前やった FizzBuzz は長めｗ
『4桁までしかできない FizzBuzz』
https://qiita.com/cure_honey/items/d5b23f75365b2d610692

#今回のアイデア 
今回のアイデアは、FORMAT 指定子の絶対位置タブを使って、数字を書き出した後に t1 で書きだし位置をカラム１に戻して、もしその後に文字列があれば上書きして書き出すというものです。

ここで部分文字列は 'text'(1:0) などのように終端位置が開始位置より前にあると、空白文字ではなく NULL 文字列になるという性質と組み合わせます。NULL の場合数字が上書きされずに残ります。

これらによって、数字と文字の切り替えを実現します。

##ソースコード Fortran2008
###案1 75文字
```fortran
print'(g0,t1a)',(i,'Fizz'(5**mod(i,3):)//'Buzz'(5**mod(i,5):),i=1,100);end
```

format 指定子の解釈が処理系によってブレがあるのですが、gfortran なら (g0t1a) と続けても大丈夫です。１文字減ります。intel fortran は g0 の後に , が無いと駄目です。g0 は i0 でも大丈夫です。

###案2 76文字
```fortran 
do 1 i=1,100;1 print'(g0,t1,2a)',i,pack(['Fizz','Buzz'],0==mod(i,[3,5]));end
```

全配列操作を使って mod の反復を無くしてみました。pack 関数を使ったため do loop にする必要が出てしまいました。gfortran の場合 行番号ラベルのあと空白が必要です。intel fortran は空白が要らないので１文字減ります。

###案3 78文字
```fortran 
print'(g0,t1a)',(i,'FizzBuzz'(5-4*2**mod(-i,3):4+4*2**mod(-i,5)),i=1,100);end
```

文字列 'FizzBuzz' を分割せずに始点と終点を変える形にしてみました。関数をもっと簡潔に出来るかもしれません。


以上、今朝布団の中で更に考えてみましたが、この辺で煮詰まりました。


##実行結果
```
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
17
Fizz
19
Buzz
Fizz
22
23
Fizz
Buzz
26
Fizz
28
29
FizzBuzz
31
32
Fizz
34
Buzz
Fizz
37
38
Fizz
Buzz
41
Fizz
43
44
FizzBuzz
46
47
Fizz
49
Buzz
Fizz
52
53
Fizz
Buzz
56
Fizz
58
59
FizzBuzz
61
62
Fizz
64
Buzz
Fizz
67
68
Fizz
Buzz
71
Fizz
73
74
FizzBuzz
76
77
Fizz
79
Buzz
Fizz
82
83
Fizz
Buzz
86
Fizz
88
89
FizzBuzz
91
92
Fizz
94
Buzz
Fizz
97
98
Fizz
Buzz
続行するには何かキーを押してください . . .
```
Amazon EC2でIPv6の設定

# 目的
- AWSでIPv6の設定を行った時の備忘録

# 参考リンク
- [Amazon EC2とVPCがIPv6に対応しました #reinvent ｜ Developers.IO](https://dev.classmethod.jp/cloud/aws/vpc-ipv6/)
- [AWSでVPCがIPv6をサポート(東京リージョン含む) | ぼぶろぐ](https://ameblo.jp/hackerbobchan/entry-12243285385.html)

# 大まかな手順
## AWSコンソールでの作業
- VPC設定
 - デフォルトVPCにIPv6 CIDRを追加
 - サブネットにIPv6 CIDRを追加
 - ルートテーブルの設定
- EC2設定
 - 対象となるEC2インスンタンスにIPアドレスを設定
 - セキュリティグループの設定変更
 
## EC2インスンタンス（Linux）での作業
- インターフェイスの設定
 - /etc/sysconfig/networkの修正
 - /etc/sysconfig/network-script/ifcfg-eth0の修正
 - ネットワークの再起動

## 検証
- ping6で内部・外部から接続できることを確認
ownCloudのアップデートの失敗

# トラブル
ownCloudをアップデートしたらアップデート自体は成功しているのにその後のメンテナンスモードからの復帰が行われなかった。

# 原因
アップデートの際、いくつかのファイルが更新されなかったためにハッシュ値が一致しなくなったためメンテナンスモードから復帰しなかった。

GitHubのissueを見る限りちょくちょく発生しているらしい。
WebUIからしか触ってなくて対応に困ったので復旧などをメモ。

# 調査
ログを見ようにもそもそもWebUIがメンテナンスモードになっているのでサーバにログインしないといけない。
その上、ログファイルが/var/logではなく/var/www/html/owncloud/data/owncloud.logにあって無駄に時間を溶かした。
見ても原因が分からなかったので、とりあえずメンテナンスモードから復旧させてみることにした。

調べた結果、/var/www/html/owncloud/config/config.phpのmaintenanceをtrueからfalseにすればメンテナンスモードから復旧できるっぽかったので復旧させる。
WebUIにアクセスすると、警告が出ていたので確認するとハッシュ値が一致しないファイルがあるらしかった。
検索してみるとどうやら他のバージョンからのアップデートでも似たような問題があったらしく、該当するバージョンのファイルで直接置き換えれば解決したようだった。

# 復旧
とりあえず同じようにやってみたら解決した。
まず公式サイトからアップデートする予定だったバージョンのソースファイルを取得し、ハッシュ値が一致しているかを検証した。
sha512みたいだったのでsha512sumに通すと、どうやら一致しているのでアップデートミスだったらしい。
一応元のファイルのバックアップを取ってから置き換えて、ファイルを再スキャンすると警告が消えていたのでどうやら大丈夫らしい。

解決！
Clojureで継承っぽいことをする

2018/5/23追記:
内容をかみ砕いてまとめました。
[Clojureでオブジェクト指向を行うまとめ](https://qiita.com/yosgspec/items/25d392c47b883480e09d)

Clojureでクラスの継承っぽいことを探してようやく一つの物にたどり着いたので備忘録です。
若干何故動かなかったのか、何故動いたのか分かっていないところも有り。
(エラーメッセージの解読辛い…)

```clj:
(defprotocol IPerson
	(put[self I])
)
(def MPerson{
	:put(fn[self I]
		(println (str I "は「" (:format-output self) "」です。"))
	)
})
(defrecord Person[name age high format-output])
(extend Person IPerson MPerson)
(defrecord Person2[name age high format-output hobby])
(extend Person2 IPerson MPerson)

(defn make-Person[name age & {:keys [high] :or {high 162.3}}]
	(let [format-output (str "名前: " name " 年齢: " age " 身長: " high "cm")]
		(Person. name age high format-output)
	)
)
(defn make-Person2[name age high hobby]
	(let [format-output (str "名前: " name " 年齢: " age " 身長: " high "cm 趣味: " hobby)]
		(Person2. name age high format-output hobby)
	)
)

(let [
	bob (make-Person "bob" 24)
	shon (make-Person2 "Shon" 53 199.9 "崖登り")
]
	(put bob "僕")
	(put shon "たわし")
)

;僕は「名前: bob 年齢: 24 身長: 162.3cm」です。
;たわしは「名前: Shon 年齢: 53 身長: 199.9cm 趣味: 崖登り」です。
```
正しいReact Nativeの環境作り（Mac / 2018年度版）

### 追記（2019/1/18）：create-react-native-appがexpo-cliに統合されたという情報をいただき、修正しました。

**・公式docs**
https://facebook.github.io/react-native/docs/getting-started.html

React Nativeプロジェクトを作成するには、以下の二つの方法があります。
① expo CLIを使う
② React Native CLIを使う

# ① expo-cliを使う
Github：https://github.com/expo/expo-cli/
ドキュメント：https://docs.expo.io/versions/latest/workflow/expo-cli

## Expo CLIとは
expo-cliを使用することで、expoというiOS/Androidアプリを通じて、ビルド不要のデバッグを行うことができるようになります。

最終的にネイティブビルドするときには、ejectという作業で標準プロジェクトへ変換します。

公式のdocsではこの方法が推奨されています。

### インストール
npmとyarnがインストールされていることが前提です。どちらもbrewでインストールできます。

```
brew install yarn
brew install nodebrew
```

次に、create-react-native-appをインストールします。

```bash
yarn global add create-react-native-app
create-react-native-app MyApp

cd MyApp
yarn start
```

<img width="645" alt="スクリーンショット 2018-05-19 13.24.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/114895/b621567c-96fc-7916-1817-fb91d7832e1b.png">

これでMyAppというアプリがexpoを通じて確認できるようになります。

iOSのシミュレータを起動する場合は、ターミナル上で「s」を、Androidのエミュレータで確認する場合は「a」をタイプします。シミュレータやエミュレータ上でexpoが起動し、expo経由でプロジェクトを確認できます。

expoの公式サイト
http://expo.io/

注）ちなみに2018年春ごろから、iOSでは自分のアカウント以外のプロジェクトが確認できなくなりました。

## ネイティブのビルドを行う
expoでは実際のビルドや、ネイティブSDKの利用等ができません。（対応しているものを除く）
そこで、ejectを行い、標準のReact Nativeプロジェクトへの変換を行います。

### ejectする
**・EJECTINGの公式docs**
https://github.com/react-community/create-react-native-app/blob/master/EJECTING.md

実際にビルドしたり、XcodeやAndroid Studioで確認したい場合には、ejectという作業でexpoプロジェクトを標準のReact Nativeプロジェクトへ変換できます。

```bash
yarn run eject # コマンド実行後にいくつか質問されます。

? How would you like to eject from create-react-native-app? (Use arrow keys)
❯ React Native: I'd like a regular React Native project. #これを選ぶ
  ExpoKit: I'll create or log in with an Expo account to use React Native and the Expo SDK.
  Cancel: I'll continue with my current project structure.

? What should your app appear as on a user's home screen? #ホームスクリーンに表示するアプリ名を入力
```

これで標準のReact Nativeプロジェクトに変換されます。これで、下記のReact Native CLIコマンドが使えるようになります。

# ② React Native CLIを使う

初めから標準のReact Nativeプロジェクトで開始したい場合は、React Native CLIをインストールし、以下のコマンドでinitできます。

```bash
yarn global add react-native-cli # CLIのインストール
react-native init MyApp

cd MyApp
react-native run-ios #iOSで起動します
```

## React Native CLIコマンド

```bash
react-native init アプリ名 #新規アプリを作成
react-native run-ios #iOSで起動します
react-native run-android #Androidで起動します
react-native link #ネイティブコードとのリンクを行う（パッケージをインストールするときによく使う）
```
Windows10 Home の WSL で Docker を使う

# はじめに
Windows10 Homeでは、Hyper-Vがサポートされておらず、
Docker for Windowsすら使用できません。
そこで、Docker toolboxを使用することになりますが、
VirtualBoxと併用することはできず、
困ったことになりました。

そこで、WSLを用いてDockerを使おうという経緯です。

# 使用環境
- Windows 10 Home 1803
- Ubuntu 16.04 on WSL (Windows Storeからダウンロード)

# 準備
Ubuntu on WSLにて、

```bash
sudo apt update
sudo apt upgrade

sudo apt install docker.io

sudo cgroupfs-mount

sudo usermod -aG docker $USER

sudo service docker start
```
を実行します。
ここで、重要なのはWSLを起動する際に、
__管理者として実行する__必要があります。

二回目以降の使用では、
同様に管理者としてWSLを起動し、

```bash
sudo cgroupfs-mount && sudo service docker start
```

とすることでDockerサービスを起動できます。
あとは通常通り、Dockerを使用するだけです。

# 参考文献
[Reddit : docker is running natively on wsl](https://www.reddit.com/r/bashonubuntuonwindows/comments/8cvr27/docker_is_running_natively_on_wsl/)

## コメント
何かありましたら、コメント等お願いします。
ROS講座11 gitリポジトリ

# 概要
ROS講座では途中でいくらかのサンプルコードを表示しています。これらのサンプルコードをより実行しやすくするために[gitリポジトリ](https://github.com/project-srs/ros_lecture)を用意しておきました。

# 環境
このROS講座は以下の環境で行っています。

| 項目 | 値 |
|:-:|:-:|
| CPU | Core i5-8250U |
| Ubuntu | 16.05 |
| ROS | Kinetic |

# 使い方

## ROSのインストール
[02 インストール](https://qiita.com/srs/items/e0e0a9dc3f94c2d3348e)で説明しています。

## インストールの後工程
[02 インストール](https://qiita.com/srs/items/e0e0a9dc3f94c2d3348e)の中でも説明していますが、重複して説明します。02 インストールの手順を実行している人は飛ばしてください。

### catkinワークスペースの設定
[02 インストール](https://qiita.com/srs/items/e0e0a9dc3f94c2d3348e)の手順で行っている場合は必要ありません（インストール手順の中でcatkinワークスペースの設定をしている）。

```shell
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src
catkin init
```

### source
ターミナルを立ち上げなおすたびにこの設定が必要です。

```shell
source ~/catkin_ws/devel/setup.bash
```

## git clone
```shell
cd ~/catkin_ws/src
git clone https://github.com/project-srs/ros_lecture.git
```

## submoduleのアップデート
git submoduleとして抱えているコードの更新が必要です。

```shell
cd ~/catkin_ws/src/ros_lecture
git submodule update --init --recursive
```

## rosdepでの依存パッケージの取得

```shell
cd ~/catkin_ws/src/ros_lecture
rosdep install -i -y --from-paths ./
```

```shell
cd ~/catkin_ws
catkin build
```

## 実行
例えば[04 roslaunch](https://qiita.com/srs/items/d7b0be3392a3a224b02f)のサンプルプログラムを実行するためには以下のように打ち込みます。

```shell
roslaunch basic_lecture pubsub1.launch
```

# ROS講座とのファイルの対応関係
例えば[03 Pub & Sub 通信](https://qiita.com/srs/items/26ca826802d07a9e3d4e)の記事の中に以下のような形式でプログラムが載っています。

```c++:basic_lecture/src/basic_simple_talker.cpp
#include "ros/ros.h"
#include "std_msgs/String.h"

////////以下略////////
```

このプログラムはgitリポジトリの[master/basic_lecture/src/basic_simple_talker.cpp](https://github.com/project-srs/ros_lecture/blob/master/basic_lecture/src/basic_simple_talker.cpp)にあります。

# 移行作業メモ

## kinetic -> melodic
* navigator_baseでtfからtf2を使うように変更しているための対応

## melodic -> noetic
* cmakeのバージョンが変わったのかビルドがうまくいかないところが多い。今までcatkin_makeでビルドしていたものをcatkin buildでビルドするように変更
* opencv4になったためにヘッダが変更された
* behavior_tree_cpp_v3のaptで入れるビルド済みパッケージに不具合があるようで、リンクが失敗する。ソースを抱えるように変更

# 目次ページへのリンク
[ROS講座の目次へのリンク](https://qiita.com/srs/items/5f44440afea0eb616b4a)

# ビルドコマンドについて
色々なwebサイトを見ているとrosのワークスペースのビルドで3種類のこまんどがあります。結論から言うとcatkin buildを使うのがおすすめです。

||WSの初期化|ビルド|pkg間の依存が疎|並列ビルド|特徴|
|:--|:--|:--|:--|:--|:--|
|(1)|catkin_init_workspace|catkin_make|×|〇|初期にあったビルドツール|
|(2)|catkin_init_workspace|catkin_make_isolated|〇|×|catkin_makeを改良したもの、ただcatkin以外のCMakeプロジェクトがビルドできないなどの欠点も多い|
|(3)|catkin init|catkin build|〇|〇|ROSの標準では入っていないので別途インストール必要|

* 特別なことが無ければ(3)のツールを使うべきです。またCMakeのマクロが違うのかcatkin buildでないとビルドできないOSSのROSパッケージも一部あります。
GOのポインタ

Goはポインタを扱います。 ポインタは値のメモリアドレスを指します。

変数 T のポインタは、 *T 型で、ゼロ値は nil です。

```Go
var p *int
```

& オペレータは、そのオペランド( operand )へのポインタを引き出します。

```Go
i := 42
p = &i  //　i　のポインタを代入する
```

\* オペレータは、ポインタの指す先の変数を示します。

```Go
fmt.Println(*p) // ポインタ p を通して i から値を読みだす
*p = 21         // ポインタ p を通して i へ値を代入する
```

これは "dereferencing" または "indirecting" としてよく知られています。

なお、C言語とは異なり、ポインタ演算はありません。

### 例

```Go
i, j := 42, 2701

p := &i         // i　のポインタを p に代入する
fmt.Println(*p) // 「42」 ポインタ p を通して i から値を読みだす
*p = 21         // ポインタ p を通して i へ値を代入する
fmt.Println(i)  // 「21」 i の値は新しい値へ変わる

p = &j         // j　のポインタを p に代入する
*p = *p / 37   // ポインタ p を通して j　の値を演算する
fmt.Println(j) // 「73」 演算された j の値が表示される
```

### 参考
[A Tour of Go / Pointers](https://go-tour-jp.appspot.com/moretypes/1)
Docker構築

# はじめに
proxy、db、rocketchatと３つの構成でdockerコンテナを構築します。
それぞれのコンテナの構成は次のイメージです。

/var/www/
├proxy(nginx) 
├db(mongodb) RocketChatのＤＢとして利用
├rocketchat rocketchat本体
└hubot チャットボット

nginx 近年のトレンドとなっているWebサーバ。Apacheよりもクライアントの同時大量アクセスに強く、メモリ使用量も少ない。
dockerコンテナのサーバに外部から直接アクセスするのは望ましくないため、nginxをReverseProxyにして運用。

mongodb NoSQLデータベース。rocketchatのリポジトリ。

rocketchat SLACK風OSSチャットサービス。

hubot チャットボット。他のチャットサービスでも利用可能。

複数コンテナを扱うため、コンテナ間の依存関係やネットワークの設定はdocker-composeを導入して解決します。

本稿はdockerとdocker-composeの導入までの手順となります。

# 準備
AWSのamazon linuxインスタンスで実施しています。

始めに、インストール済みパッケージを更新しておきます。

```
$ sudo yum update -y
```

# Dockerのインストール
```
$ sudo yum install docker -y
```

# sudoなしでdockerを実行可能にします。
```
$ sudo usermod -a -G docker ec2-user
```

# docker-composeのインストール

docker-composeをダウンロードします。

```
$ sudo curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
```

実行権限を付与

```
$ sudo chmod +x /usr/local/bin/docker-compose
```

docker-composeが実行できることを確認します。

```
$ docker-compose --version
docker-compose version 1.21.2, build a133471
```


# 参考
Amazon ECS における Docker の基本
https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/docker-basics.html

Install Docker Compose
https://docs.docker.com/compose/install/#install-compose
Windowsで日本語･英語キーボードを同時に使用する

## この記事について…

今回、どうしてもWindowsで日本語･英語キーボードを同時に使用したいと思った為、以下の設定を試みました。
尚、Windows 7 Professional SP1にて動作確認しました。

> 参考
> https://wikiwiki.jp/fpag/%E9%85%8D%E5%88%97%E3%81%AE%E7%95%B0%E3%81%AA%E3%82%8B%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89%E3%82%92%E5%90%8C%E6%99%82%E3%81%AB%E4%BD%BF%E3%81%86%E6%96%B9%E6%B3%95

## 注意！

以下の手順では、途中レジストリ エディターを使用した操作が発生します。
レジストリの変更は**自己責任**で行ってください。

## デバイス インスタンス パスの確認

デバイス マネージャーを起動して、接続しているキーボードの「デバイス インスタンス パス」を確認します。
「HID\VID_xxxx&PID_xxxx&MI_xx\x&xxxxxxx&x&xxxx」というような構成になっていると思われます。
日本語キーボード、英語キーボード共に確認しておきましょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/78896/9d4bfe15-dc52-9aef-a090-82d79bf78cf5.png)

## レジストリの変更

レジストリ エディターを起動して、`HKEY_LOCALMACHINE\SYSTEM\CurrentControlSet\services\i8042prt\Parameters`を開きます。
下記図赤枠内のように値を変更 又は 追加します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/78896/6338bd5d-49e5-9275-9fb8-71f24a0f33c2.png)

次に、`HKEY_LOCALMACHINE\SYSTEM\CurrentControlSet\Enum\HID`を開きます。
その中に先ほど確認したデバイス インスタンス パスと一致する`VID_xxxx&PID_xxxx&MI_xx\x&xxxxxxx&x&xxxx`というエントリが存在するはずなので、それを開きます。
その後、下記図赤枠内のように値を追加します。(下記図は**英語キーボード**の例です！)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/78896/ce16600b-43c2-611d-7f95-7b0d05b0c072.png)

日本語キーボードについては`"KeyboardSubtypeOverride"="2"`とします。


ここまで設定した後にWindowsを再起動すると、日本語キーボードは日本語レイアウトで、英語キーボードは英語レイアウトでそれぞれ動作するはずです。
但し、「デバイス インスタンス パス」はキーボードを接続するUSBポートを変更すると値が変わってしまう為、都度設定が必要になります。
その点はご注意ください。
Google I/O '18 で発表されたFirebaseアプデ雑記 #firebase #fjug #io18jp #gdgtokyo

多少今更感はありますが，Google I/O '18 で発表されたFirebaseの新情報を軽くメモしておきます．
[I/O extendedのスライド](https://speakerdeck.com/yatima/chromeos-firebase-google-i-slash-o-18)
![Screenshot 2018-05-19 at 11.51.59.png](https://qiita-image-store.s3.amazonaws.com/0/17440/0a3e220e-416d-4796-db9f-e64f8e927ce2.png)


# ML Kit for Firebase
機械学習 + Firebase
（これまでFirebaseの機械学習ではPredictionsもあったが，Analyticsから予測するだけだった）
##今使える機能
- 文字認識
- 顔認識
- バーコード認識
- 画像のタグ付け
- ランドマーク認識
- 機械学習の独自のモデル
（GCPのMLのAPIが元ネタになってるっぽい．Cloud Vision API, Cloud ML Engine）
（元ネタが他にもあるのでまだまだ増えそう．音声認識，動画認識，翻訳，自然言語処理など）

# Performance Monitoring GA
ベータ外れました．その他多少追加機能

- issueのまとめを表示してくれる
- どこで一瞬フリーズするか見つけやすくなった
（画面ごとに何フレームくらいドロップするのかが表示される）

# Analyticsの強化
- プロジェクトレベルでのレポート
- 柔軟なフィルタ

# iOS用 Test Lab
AndroidだけでなくiOSでも使えるように

#参考
[What’s new in Firebase at I/O 2018](https://firebase.googleblog.com/2018/05/whats-new-in-firebase-at-io-2018.html)

#コミュニティ
よろしければぜひお願いします〜
[Firebase Japan User Group](https://firebase.asia/)
![Firebase Japan User Group](https://firebase.asia/logo.png?198d711b493f1e2ad15472f9f7f8bb2e)
Windows用RubyのEncoding

## (お詫びと訂正)

Windows Serverでrubyがファイルを読み込む際のデフォルトエンコーディングがUTF-8になってて、従来ずっとWindows-31J(SJIS)だと思っていて不思議だったので先日このエントリを書いたのですが、その後の確認の結果、rubyをインストールする際のダイアログで
``Use UTF-8 as default external encoding.``
という項目にチェックを入れていたためということが判りました。
![rubyinstalldialog.png](https://qiita-image-store.s3.amazonaws.com/0/21992/8642e1ef-0c86-bbf2-7c87-39b8334048c6.png)
これ、一つ上の
``Associate .rb and .rbw files with this Ruby installation``
という項目のチェックを外すついでに、余計なチェックを入れてしまったようです。

なお、コメントで@asmさんからご教示ある通り、この"Use UTF-8.."にチェックを入れた場合は、環境変数RUBYOPTを使ってUTF-8を設定するだけで、レジストリに何か書くなどの挙動はないようなので、インストール後でもここの修正は可能です。

以上、早とちりなエントリを書いてしまって申し訳ありませんでした。
(先日のエントリは、有益なコメントもいただけましたし、以下にこのまま残しておきます)。

## 概要

Windows用のrubyで外部ファイルを読む場合、rubyのデフォルトエンコードに注意する必要があるようです。

手元のWindowsクライアント(Windows 10)とWindowsサーバ(2016)でrubyの挙動が違っていたのでメモしておきます。クライアントだとWindows-31J(SJIS)でサーバだとUTF-8でした。

なおrubyのバージョンは[RubyInstallers](https://rubyinstaller.org/downloads/)のサイトからダウンロードしたもので、

ruby 2.4.4p296 (2018-03-28 revision 63013) [x64-mingw32]

です。

- Windows サーバーの場合

```
　C:>ruby -v
　ruby 2.4.4p296 (2018-03-28 revision 63013) [x64-mingw32]
  C:\>irb
  irb(main):001:0> p Encoding.default_external
  #<Encoding:UTF-8>
  => #<Encoding:UTF-8>
```

- Windows クライアントの場合

```
　C:>ruby -v
　ruby 2.4.4p296 (2018-03-28 revision 63013) [x64-mingw32]
  C:\>irb
  irb(main):001:0> p Encoding.default_external
　#<Encoding:Windows-31J>
　=> #<Encoding:Windows-31J>
```

###気づいたきっかけ

SJISのファイルを読んだとき、クライアントPCでは問題のなかったスクリプトがサーバでは文字化けを起こして、あれ？ と思って調べたところ上記の通りでした。
「Windows10とWindows Serverだから異なる」のではなく、何か別の原因で異なっているのかもしれませんが、自分には判りませんでした(教えてエライ人)。

問題を起こしたスクリプトは単に

```
File.read(filename)
```

と書いていてEncodingを指定していなかったので、これを

```
File.read(filename, :encoding=>'Windows-31J')
```

と変更することで当面の問題は解決しました。
壁などを貫通しないようにするためには

**壁などを貫通しないようにするためには**

あたり判定が曖昧になっているオブジェクトや、物が貫通してしまうオブジェクトはありませんか？

そんな時に使えるのが、*Rigidbody*です。




![bandicam 2018-05-19 09-33-47-855.jpg](https://qiita-image-store.s3.amazonaws.com/0/257079/45d1a65c-4bf1-de4d-108f-fa4dbf19becb.jpeg)

Add ComponentでRigidbodyを追加。

その後に上の画像のようなものが追加されるので、*Collision Detection*というところを
DiscreteからContinuousに変更

![bandicam 2018-05-19 09-33-58-698.jpg](https://qiita-image-store.s3.amazonaws.com/0/257079/7f4c4e03-cdda-2278-83cc-00c062c12a5e.jpeg)

これで貫通などがなくなり、あたり判定などもつくので、ぜひ試してみてください。
ChromebookでVSCodeをネイティブに動かせるようになったので試した #Chromebook #io18jp #VSCode #gdgtokyo

_2020/1/6追記：_

_現在はより改良されており，GUIのみの操作で完結します．_
![Screenshot 2020-01-06 at 10.08.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17440/8137bb95-1892-7fcd-d4de-e6e4fc1f31b4.png)

_Linuxをオン（下記参照）にした後，VSCode公式サイトの `.deb` ファイルをダウンロードしダブルクリックで実行するだけ．
これは簡単！
（追記ここまで）_

　

　

[I/O extendedのスライド](https://speakerdeck.com/yatima/chromeos-firebase-google-i-slash-o-18)
![Screenshot 2018-05-19 at 11.51.59.png](https://qiita-image-store.s3.amazonaws.com/0/17440/360b9bd7-6489-25fb-0ed0-063134720f3a.png)


#前提
ChromebookはChrome専用機としては大変優秀[^yuusyuu]である．
[^yuusyuu]: 低コストながらもパフォーマンスやセキュリティレベルは比較的高く，管理も容易であり，操作性も良い．
しかしPCの一般的なソフトウェアはなかなか動かせない[^crossover]のがネックではあった．
[^crossover]: [CrossOver](https://www.codeweavers.com/products/crossover-chromeos)というAndroidアプリ経由でWindowsのソフトウェアを実行することは可能ではあったが，対応ソフトが少ない，あるいはバージョンが古いなどで，常用には困難を伴うものであった．
　
そこで黒画面など手を加えることでLinuxを導入[^Linux]し，Linuxアプリケーションを利用することは可能であった．
[^Linux]: 非公式なプロジェクトとしてcroutonやgallium OSなどがある．
ところがそれには開発者モード[^dev-mode]の適用が必要であり，セキュリティのメリットが損なわれるものであった．
[^dev-mode]: Androidで言うroot化のようなものである．つまりセキュリティを犠牲に自由を手に入れる類．
　 
#変更点
**開発者モードなしでLinuxが動かせるように**なった(Debian 9.4)．
ただし18/05/10現在，対応は**Pixelbookのみ**である．
~~持っていない場合は購入[^buy]すること．~~
[^buy]: ~~高い．~~

#手法
まずはLinuxをインストールする．
︙ > Help > About Chrome OSを選ぶ．
![Screenshot 2018-05-09 at 23.16.55.png](https://qiita-image-store.s3.amazonaws.com/0/17440/2aeb1326-d069-0517-cc16-7f6255081696.png)
Detailed build informationを押下．
![Screenshot 2018-05-09 at 23.17.07.png](https://qiita-image-store.s3.amazonaws.com/0/17440/6929d27e-d4d8-a1c1-9bac-db0a382540ee.png)
CHANGE CHANNELを押下．
![Screenshot 2018-05-09 at 23.17.32.png](https://qiita-image-store.s3.amazonaws.com/0/17440/c464766e-cfe9-b633-f1d3-200367cd0726.png)
Developer - unstable を選択(18/05/10現在ではDev版でしかLinux対応していない)，CHANGE CHANNELを押下．
Dev版ダウンロード終了後に再起動．
︙ > Settingsの検索窓より"linux"と検索．
![Screenshot 2018-05-09 at 23.26.57.png](https://qiita-image-store.s3.amazonaws.com/0/17440/0c8ea7ee-7948-c3f8-dcd7-b3b42490e506.png)
Turn on, Installを押下．
以上でLinuxのインストールは終了．

VSCodeをインストールしていく．
　
アプリ一覧よりTerminalをクリック（これで既にLinux内でコマンドを叩ける状態）．

```bash
sudo apt-get update
curl -L https://go.microsoft.com/fwlink/?LinkID=760868 > code.deb
sudo apt-get install ./code.deb
```
*追記(18/06/20)：libxss1やlibasound2のinstallは不要になったようである．*
あとはアプリ一覧にVSCodeが表示されているはずなので，クリックするだけである．


実用上の注意は[別記事](https://medium.com/@Yatima/chromebook%E3%81%A7vscode%E3%82%92%E4%BD%BF%E3%81%86%E6%99%82%E3%81%AE%E6%B3%A8%E6%84%8F-chromebook-pixelbook-io18-io18jp-vscode-gdgtokyo-e8c5fa7b3271)で紹介．


#第一印象
(18/05/10時点，今後改善する可能性あり)

- ~~**VSCodeが起動しない場合**がある．**OSを再起動すると改善**する~~ *→18/06/20時点で問題なし*
- Chromebookで有用なアプリ切り替えショートカットのAlt + 数字キーが効かない
- シェルフ(ChromeOSのタスクバー)にピン留めしても消えることがある
- 解像度周りが反映されない場合がある
Excel で 大きい数の DEC2BIN()がなくて困った時の対処 (32bitまで対応)



A1のセルに目的の数値を置いた場合

```text
=CONCATENATE(RIGHT("00000000"&DEC2BIN(QUOTIENT(A1,2^24)),8)," ",RIGHT("00000000"&DEC2BIN(QUOTIENT(  MOD(A1,2^24),2^16)),8)," ",RIGHT("00000000"&DEC2BIN(QUOTIENT(MOD(A1,2^16),2^8)),8)," ",RIGHT("00000000"&DEC2BIN(MOD(A1,2^8)),8))
```
LSTM（Long Short Term Memory）によるShow and Tellモデル

## 目次

- 人工知能の歴史と変遷（研究の方向性と順序の再確認）
- はじめに（Show and Tellとは）
- LSTM（Long Short Term Memory）とは？
- RNN（Recurrent Neural Network）の問題点
- LSTMの特徴: Forget Gate（忘却ゲート）
- 参考資料

---

## 人工知能の歴史と変遷

![LTSM入門.png](https://qiita-image-store.s3.amazonaws.com/0/92038/5bd62b39-0792-b21a-b2d4-c795389fda60.png)

---

## はじめに

### Show and Tellとは？

主に北米で行われる教育科目の一つで、オーストラリアでも一般的である。普通は、小学校の低学年の授業で実施され、小さな児童に公述のスキルを教えるための技術である。たいてい、児童はなにか家からひとつ道具を持って行き、みんなに「なぜその道具を特に選んだか、どこで手に入れたか、その他、関連する情報」について説明する。[Wikipediaから引用](https://ja.wikipedia.org/wiki/%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%BB%E3%82%A2%E3%83%B3%E3%83%89%E3%83%BB%E3%83%86%E3%83%AB
)

### Show and Tell: A Neural Image Caption Generator

- [論文](https://arxiv.org/abs/1411.4555)
- [実装](https://github.com/tensorflow/models/tree/master/research/im2txt)

---


## どんなネットワークなのか
![ltms_04.png](https://qiita-image-store.s3.amazonaws.com/0/92038/32a89ec9-c1b9-ebd3-72f1-a0e8f83bfb07.png)

---

## LSTM（Long Short Term Memory: 長・短期記憶）とは？

### CNN(Convolutional Neural Network)と、RNN(Recurrent Neural Network)のおさらい

- CNN: 画像識別などに適する
- RNN: 音声、言語、動画などの系列データに適する


### RNN(Recurrent Neural Network)の問題点

- 10分程度の短期的な記憶保持することができるが、勾配消失が大きい（爆発するか、消滅するか）
 - 例）短期的な株価の予測には適しているが、長期の経済成長を見越した判断などには不向き。
 - 例）チャットボッドなど、短期間では、矛盾がないような会話ができても、一時間前に話した内容を加味することが難しい。


### LSTM(Long Short Term Memory)の概要

- 上記、RNNの問題点を克服し、長期にわたる記憶を実現する方法の一つ。
- 基本的な入出力層は、RNNと同じで、中間層がメモリユニットというものに置き換えられる。

---

## LSTMの特徴：Forget Gate（忘却ゲート）

### LTMSの変遷

- Original 95,97 Hochreiter & Schmidhuber
- ***Forget Gate 99 Gers & Schmidhuber***
- Peephole Connection 00 Gers & Schmidhuber
- Full Gradient 05 Graves & Schemidhuber

### メモリユニット内のForget Gate

RNNの中間層を増やせば、永遠に記憶させることも可能だが、
ただ長く保持すれば良いということではないので、適切に解放する必要がある。
これにより、より長い文脈を捉えた、推定が可能になる。

![スクリーンショット 2018-05-19 12.40.21.png](https://qiita-image-store.s3.amazonaws.com/0/92038/397acf1a-c7fc-b33b-a1aa-c8512d9e0a5b.png)

---

### 参考資料

 - [nvidia/tensorflowコンテナイメージでShow and Tell](https://qiita.com/m1takahashi/items/e8b301db93c89e497021)
ロリポップマネージドクラウドのRailsで環境変数を設定、またはln -sを張る。

初期化に必要な環境変数周りの設定方法。

※公式ガイドも3日前にできてた。
[アプリケーションに環境変数を設定する – ヘルプ - ロリポップ！マネージドクラウド](https://mclolipop.zendesk.com/hc/ja/articles/360001308127-%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%81%AB%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B)

以下、Rails5.2.0で試してある。

## 基本
~/user_command.shでなんとかする。

## 環境変数
一通り試したが、公式ガイドにある通り`dotenv-rails`を通して扱うのが安定している。
単にuser_command.sh内でexportしても上手くいくときといかない時がある。

## 任意のシンボリックリンク
サーバー毎に何かしら独自設定を仕込む場合を想定。
例「~/shared/sample.ymlのリンクを~/current/config/sample.ymlに設定」

user_command.shの実行ディレクトリが~/current/の中なので、
`ln -s ~/shared/sample.yml ./config/sample.yml`
をuser_command.shに書き足せばOK。

## 備考
シンプルなのでcapistrano的なイメージでできる事は工夫すればできる気もする。もっとドキュメント欲しい。
モバイルでPGPをやりとりする


## Android

- [K-9 Mail](https://play.google.com/store/apps/details?id=com.fsck.k9)と[OpenKeychain](https://play.google.com/store/apps/details?id=org.sufficientlysecure.keychain)の組み合わせが最良と思われます。どちらも無料です。
- 鍵のインポートはOpenKeychainから行います(Androidですから多種多様な方法があると思います)。
- EFAIL: アカウント設定->メール閲覧->画像を自動で表示->しない

## iOS

iOSは仕様上、PGPを内蔵したメーラーである必要がある。クリップボードできた文字列を復号アプリに持っていく運用はなしで。

### [Trustera](https://itunes.apple.com/us/app/trustera-mail/id1049069951)

- 無料
    - PGP機能を使用するにはアカウント登録が必要。セキュアといえるかわからない。
    - 少なくとも。秘密鍵バックアップ機能はオプトインなので、オンにしないように。
- iCloud / Dropbox / GoogleDriveから鍵をダウンロードできる。
- Settings -> Account -> Trustera Account
    - Manage Personal Keys から秘密鍵
    - Manage Contact Keys から公開鍵 をインポートできます
- EFAIL: _対応策なさそう_

### [Canary Mail](https://itunes.apple.com/us/app/canary-mail/id1155470386)

- 有料 (9.99USD / 1200JPY)
- iCloud / Dropbox / GoogleDriveに加え、iTunesファイル共有に対応。
- Preferences -> Encryption Mode -> Keys -> 右下の追加ボタン
- EFAIL: Load Remote Content をオフ

有料で問題なければCanary Mailでしょうか。それほど高価というわけでもないですし。。
エクセルのフォントを設定するホットキー

# フォントの設定をマクロで行う必要性

- 日本語用フォントと英語用フォントを設定するため、1発で設定できない
- セルを編集すると意図しないフォント変更が生じることがある
- したがって、めんどうな作業を繰り返し行わなくてはいけなくなる

## 日本語用フォントの設定項目がない

日本語用フォントは、漢字やひらがなだけでなく、アルファベットも含まれています。

一方で、英語用フォントは半角英数字と一部の記号のみが含まれています。

日本語でエクセルを記述する場合、日本語用フォントと英語用フォントを両方とも設定する必要があります。

しかしながら、Power PointやWordとは異なり、Excelには「日本語用フォント」を設定する機能がありません。

## 日本語用フォントの設定方法

そこで、次のような手順を取ります。

- 日本語用フォント（例： ＭＳ Ｐゴシック）を適用する
- 英語用フォント（例： Arial）を適用する

フォントに含まれていない文字は「現状維持」となります。

したがって、上の手順でフォントを適用した場合は、英語用フォントがある文字はArialに、ない文字は（Arial適用前に適用されたフォントである）ＭＳ Ｐゴシックになります。

## 1つのセルに2つ以上のフォントを設定する

エクセルは、1つのセルの中でフォント・フォントサイズ・フォントスタイルなどを使い分けることができます。

たとえば、5文字目まではArial、6文字目からはTimes New Romanといった設定が可能です。数式バーで文字列を選択して、リボンからフォントを選択すればこのように設定できます。

日本語用フォントと英語用フォントを共存させるということは、上記のような「セル内で複数のフォントを使い分ける」といった動作をしているということです。

日本語用フォントと英語用フォントを両方使っているセルの文字列を編集すると、意図せずに英数字が日本語用フォントになることがあります。

このため、フォントの設定は「デフォルト設定をすればその後は意識しなくて済む」というようなものではなく、こまめに再設定が必要な項目になっています。

# サンプルコード

## 日英フォントを単純に設定する

気を付けるべき点は1つだけで、日本語フォント=>英語フォントの順に記述することです。

```visualbasic
Sub Serif_Fonts()
' セリフ体フォント
    With Selection.Font
        .Name = "ＭＳ Ｐ明朝"
        .Name = "Times New Roman"
    End With
End Sub
```

```visualbasic
Sub Sans_Fonts()
' サンセリフ体フォント
    With Selection.Font
        .Name = "ＭＳ Ｐゴシック"
        .Name = "Arial"
    End With
End Sub
```

## フォントサイズやアラインメントも併せて設定する

ホットキーを設定するのであれば、正規表現でメモ書きしておくとよいでしょう。
そうすると、VBProjectオブジェクトなどから抽出しやすくなります。

### 選択した範囲のみ

```visualbasic
Sub Set_Default_Font_Selection()
' Hotkey: Alt + Ctrl + Shift + 6
' Onkey: "%^+6"

    With Selection
        With .Font
            .Size = 10
            .Name = "ＭＳ Ｐゴシック"
            .Name = "Arial"
        End With
        .VerticalAlignment = xlCenter
    End With

End Sub
```

### シート全体

使用していないセルにフォントを設定すると、ファイルサイズがかさんでしまいます。
機械的に、シート全体 ＝ UsedRange と覚えておくのがよいでしょう。

Cellsコレクションなどからシート全体に何かを行うことはまずありません。

```visualbasic
Sub Set_Default_Font_Wholesheet()
' Hotkey: Alt + Ctrl + Shift + 6
' Onkey: "%^+6"

    With ActiveSheet.UsedRange
        With .Font
            .Size = 10
            .Name = "ＭＳ Ｐゴシック"
            .Name = "Arial"
        End With
        .VerticalAlignment = xlCenter
    End With

End Sub
```

## フォントサイズサイクルを作る

サイクル型のマクロにすると、より実践的になります。

```visualbasic
Sub Fonts_Cycle()
' Hotkey: Alt + Shift + 6
' Onkey: "%+6"

    Dim mspg As String
    Dim mspm As String
    
    mspg = "ＭＳ Ｐゴシック"
    mspm = "ＭＳ Ｐ明朝"
    
    With Selection.Font
        If .Name = "Arial" Or .Name = mspg Then
            .Name = mspm
            .Name = "Times New Roman"
        Else
            .Name = mspg
            .Name = "Arial"
        End If
    End With

End Sub
```

VBEは、日本語が文字化けすることがあるので、最小限に抑えたいところ。
やむを得ず全角文字を書く場合は、下記のように変数に格納したほうが読みやすくなります。

# Notes

.NameFarEast プロパティは、WordやPower Pointで使われるほか、エクセル上のShapeオブジェクトにも使用可能ですが、Range.Fontオブジェクトには使用できません。
WordPresを使用した際のJqueryの記述方法（Elementorのエレメントの追加で対応する場合）

# WordPresを使用した際のJqueryの記述方法
Elementorで一般エレメントの追加でJQueryをしたいときの記述方法


##### 実行環境
- Elementotを使用

##### 方法
HTMLのエレメントをドラッグ＆ドロップで画面に追加する。
そのご、HTMLを記述するコードに以下の形式でJQueryコードを記述する。

```js:jquery
<script type="text/javascript">
(function($) {
    $(function() {
#ここから---------------------------------------------------------------------
        $('button').on('click',function(){
            alert("click");
        });         
#ここまでに好きなコードを記述する-----------------------------------------------
    });
})(jQuery);
</script>
```
Railsでマルチスレッドを使う時はDB_Connectionの最大数に注意

# 危険な書き方

```
Thread.new do
   puts "#{User.find(1).id}"
end
```

上記の様に`Thred.new`の中でDB接続を行っている場合、スレッド毎にDBコネクションが作成されてしまう。
database.ymlのconnection_pool数(デフォルトは5)を超えると以下の様なエラーが発生します。

```
could not obtain a connection from the pool within 5.000 seconds (waited 5.000 seconds); 
all pooled connections were in use (ActiveRecord::ConnectionTimeoutError)
```


# 解決策

マルチスレッド内でDBアクセスする場合にDBコネクションを使い回す様に書き直す。

```diff
Thread.new do
-  puts "#{User.find(1).id}"
+  ActiveRecord::Base.connection_pool.with_connection do
+    puts "#{User.find(1).id}"
+  end
end
```

# 参考
http://shirusu-ni-tarazu.hatenablog.jp/entry/2013/07/02/042448
https://easyramble.com/activerecord-with-multi-threads.html