OmniAICreator/Qiita-1.07M huggingface dataset:
Google Apps ScriptでWeb上にあるJsonデータを取得してSpreadSheetに入力する

tentatsuさんの週に一つくらい技術を勉強しようコーナー
今週はGoogleAppScript + SpreadSheet

2020-03-18 
コードに少しミスがあったので修正

# スクリプトの作り方

この辺の記事を参考にしよう！！
http://qiita.com/negito6/items/c64a7a8589faaffcfdcf

平たく言えば、SpreadSheetのメニュー ＞ ツール ＞ スクリプトエディタ
から新規でスクリプトを選択して作成します。

# 欲しいデータのあるJSONを狙う

さがしましょう。

# GoogleAppScriptでJSONデータを取得する

はい、いきなり結論です。
まず、SpreadSheetのURLを入力して、オブジェクト取得します。

で、狙いしましたJSONのURLを取得、取得したキーを配列にする。

あとは

```javascript

var json = UrlFetchApp.fetch(json_url).getContentText();
var jsonData = JSON.parse(json);
```

という超カンタンなコマンド一発でjsonとれます。
あとは煮るなり焼くなりゴニョゴニョループして・・・

```javascript

sheet.getRange(i, j).setValue(shop[idx][key]);  
```

という形でSpreadSheetに書き込んでおしまい。

以下が全文でござる。

```javascript

 //変数spreadsheetに指定のスプレッドシートオブジェクトを取得します
  var sp_url = "https://docs.google.com/spreadsheets/d/*************/";
  var spreadsheet = SpreadsheetApp.openByUrl(sp_url);

  // 適当にページングとか
  var count = 100;
  var page = 1;
  var start = ((page-1)*count)+1
  
  //JSONのURL
  var url1 = "https://json_no_url/" + "?start="+start+"&count="+count;
  var keys = {
    'id' : "",
    'name' : "",
  };
  
function myFunctionJSON() {
  // spread sheetのシート設定
  var sheet = spreadsheet.getSheetByName("sheet1");
  var json = UrlFetchApp.fetch(url1).getContentText();
  var jsonData = JSON.parse(json);
  var shop = jsonData.results.shop;

  for (var idx in shop) {
    var j=1;
    for(var key in keys) {
      var type = typeof shop[idx][key];
      sheet.getRange(i, j).setValue(shop[idx][key]);  
      j++;
    }
    i++;
  }
}

```

おしまい。
[Rails 5.1]webpackerを使用して、Spectre.cssを適用する方法


## はじめに

Rails 5.1で導入された **[webpacker](https://github.com/rails/webpacker)** を利用して軽量CSSフレームワーク **[Spectre.css](https://picturepan2.github.io/spectre/)** を適用する方法を残しておきます。

## 対象バージョン

- macOS 10.12.5
- Rails v5.1.1
- Ruby v2.4.1
- webpacker v2.0
- webpack v2.6.1
- node v7.10.0
- yarn v0.24.6

## 前提条件

Webpackerのインストールが完了していること。

## Spectre.css の適応方法

yarnでインストール

```
$ yarn add spectre.css
```

./node_modules/spectre.css/ の配下に一式インストールされます。


CSS周りの構成はwebpackerのGithubを参考に、以下のように設定します。

```app/javascript/packs/application.js
...
import '../app-style'
```


```app/javascript/app-style.sass
@import '~spectre.css/dist/spectre'
```

拡張子を付けるとWarningが出るので、拡張子は省いて設定します。

https://github.com/rails/webpacker/issues/461

```app/views/layouts/application.html.erb
...
<%= javascript_pack_tag 'application' %>
<%= stylesheet_pack_tag 'application' %>
...
```

## コンパイル

コンパイルには ```bin/webpack``` を使います。

```
$ bin/webpack
```

## 動作確認

```
$ bin/rails s
```

http://localhost:3000 にアクセスしてSpectre.cssのスタイルが適用されていれば成功です！🎉
【質問】pythonで3dアニメーションが枠の外にまで出ていってしまうのを直したい

python3を使っています．下に作成したアニメーションのスクショとプログラムを載せておきます．合成波が進んでいくところのアニメーションを作ってみましたが，波がどこまでも進んでいきます．適当なところで波の表示がなくなるようにしたいです．どなたか分かる方教えて下さい．
よろしくお願いします．


![3danime.PNG](https://qiita-image-store.s3.amazonaws.com/0/187979/afe066a9-7665-cace-d4b5-ddf3b0444987.png)


```py
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.animation as anm
import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure()
ax = fig.gca(projection='3d')
f=np.pi/6
d=np.pi/2
t=[]

def update(i):
        if i !=0:
             plt.cla()
                
        X1=0
        Y1=0
        Z1=0
        U1=-np.cos(i/10)*np.sin(f)*np.cos(f)
        V1=np.cos(i/10)*np.sin(f)*np.sin(f)
        W1=0

        X2=0
        Y2=0
        Z2=0
        U2=np.cos(i/10)*np.sin(f)*np.cos(f)
        V2=np.cos(i/10)*np.cos(f)*np.cos(f)
        W2=0
        
        X3=0
        Y3=0
        Z3=0
        U3=U1+U2
        V3=V1+V2
        W3=0
        
        X4=[X1,U1]
        Y4=[Y1,V1]
        Z4=[Z1,W1]
        X5=[X2,U2]
        Y5=[Y2,V2]
        Z5=[Z2,W2]
        X6=[X3,U3]
        Y6=[Y3,V3]
        Z6=[Z3,W3]

        ax.set_xlim(-1.5,1.5)
        ax.set_ylim(-1.5,1.5)
        ax.set_zlim(0,3)
        ax.axis("off")
        ax.plot(X4,Y4,Z4,"-",c="r",lw=2)
        ax.plot(X5,Y5,Z5,"-",c="b",lw=2)
        ax.plot(X6,Y6,Z6,"-",c="m",lw=2)
        
        t.append(i)
        t1=np.array(t)
        
        x1=-np.cos((i-t1)/10)*np.sin(f)*np.cos(f)
        y1=np.cos((i-t1)/10)*np.sin(f)*np.sin(f)
        z1=t1/100
        

        x2=np.cos((i-t1)/10)*np.sin(f)*np.cos(f)
        y2=np.cos((i-t1)/10)*np.cos(f)*np.cos(f)
        z2=t1/100
        
        x3=x1+x2
        y3=y1+y2
        z3=z1
        
        ax.plot(x1, y1, z1,"-", c="r")
        ax.plot(x2, y2, z2,"-", c="b")
        ax.plot(x3, y3, z3,"-", c="m")
        




ani = anm.FuncAnimation(fig, update, \
    interval = 15, frames = 10000)


plt.show()

```
PRレビューに絵文字を使おう！

[Gitのコミットに絵文字を使おう！ - Qiita](http://qiita.com/syu_chan_1005/items/e1a18896107d8cedfc45)
こちらの記事を読んでなるほどと思ったので、PRレビューにも使えないか考えてみました。

### ルール

PRレビューの際に1コメントに1つだけ、頭に絵文字をつけます。
つける絵文字はチームで共有しましょう。以下は例です。

| 絵文字       | 文字列     | 意味                                                              |
|:------------:|:-----------|:------------------------------------------------------------------|
| :book:       | book       | TOPIC: 参考までに。修正する必要はないけどこうゆう書き方もあるよ。 |
| :wrench:      | wrench       | HACK: リファクタリングの余地あり。                                |
| :turtle:     | turtle     | OPTIMIZE: パフォーマンス改善の余地あり。                          |
| :pencil2:    | pencil2    | DOC: ドキュメントを書こう。                                       |
| :red_circle: | red_circle | TEST: テストを書こう。                                            |
| :unlock:     | unlock     | SECURITY: セキュリティに問題あり。                                |
| :hammer:     | hammer     | IMPLEMENT: 仕様を満たしていない。                                 |
| :bug:        | bug        | BUG: バグあり。                                                   |
| :cool:       | cool       | COOL: このコードいいね。                                          |
| :hand:       | hand       | HELP: 自分じゃわからないから他の人レビューして。                  |
| :sos:        | sos        | SOS: よくわからないので説明して。                                 |
### メリット

以下のメリットがあるのではないかと思っています。

- 議論がゴッチャにならない
1つのコメントに1つしか絵文字が使えないので、一度に複数のことを言うことはできません。

- レビュー時間短縮
絵文字だけでも意図が伝わるのでコメントを書く時間が減ります。

- 何が言いたいのか伝わりやすい

- なんか楽しげ

### まとめ

自分はまだ導入していないのでうまくいくかわかりませんが、PRレビューのコミュニケーションでお困りの方は導入を検討してみてはどうでしょうか?
導入した際にはぜひとも使ってみた感想を聞かせてください。
画像オートエンコーダの学習におけるロスの選び方の違い 後編（MIT Places2の場合）

前回 [画像オートエンコーダの学習におけるロスの選び方の違い（CelebAの場合）](http://qiita.com/YusukeSuzuki@github/items/0f3a9fa774f405644f04) の続きです。

# 課題のおさらい

ディープラーニングの画像オートエンコーダにおいて出力のロスを計算する方法がいろいろな実装によって異なるので実際どれくらい違うのかを試そうというお話。以下のそれぞれのロスの取り方でどれくらい学習の傾向が異なるのかを試します。

- 画素毎に二乗誤差をとる
- 画素毎にバイナリクロスエントロピーをとる
- 画素毎の二乗誤差をサンプルごとに平均する
- 画素毎のバイナリクロスエントロピーをサンプルごとに平均する
- 画素毎の二乗誤差をミニバッチ全体で平均する
- 画素毎のバイナリクロスエントロピーをミニバッチ全体で平均する

# 実験条件

前回はデータセットとして [CelebA](http://mmlab.ie.cuhk.edu.hk/projects/CelebA.html) を使用しました。今回はCelebAよりも個々の画像の違いが大きい [Places2](http://places2.csail.mit.edu/) を使用します。

Places2の256x256のTrainイメージを128x128にリサイズしたものを学習データとしています。

使用するデータセット以外は前回 [画像オートエンコーダの学習におけるロスの選び方の違い（CelebAの場合）](http://qiita.com/YusukeSuzuki@github/items/0f3a9fa774f405644f04) と同一です。

# ロスの推移

学習中のロスの推移です。全体で見るとあまり変わらない印象。

![2017-06-19 22_31_12-フォト.png](https://qiita-image-store.s3.amazonaws.com/0/25288/caf5f3b7-ca94-947e-288d-42a6b5e721ad.png)

中盤から後半にかけての部分の拡大表示。傾向としてバイナリクロスエントロピーよりも二乗誤差の方が常に下で推移している。画素で取るか、サンプルで取るか、ミニバッチで取るかはあまり影響しない。

チャートは二乗誤差の平均値でプロットしているため二乗誤差のロスが有利になっていて、バイナリクロスエントロピーで比較すると逆転するのかもしれない。

![2017-06-19 22_31_50-フォト.png](https://qiita-image-store.s3.amazonaws.com/0/25288/db355dd2-cad1-156c-2d4f-97d4a33a8961.png)


# 出力画像

ロスの種類は左から以下の順。

- ミニバッチ全体の平均、バイナリクロスエントロピー
- ミニバッチ全体の平均、二乗誤差
- 画素単位、バイナリクロスエントロピー
- 画素単位、二乗誤差
- サンプルごとに平均、バイナリクロスエントロピー
- サンプルごとに平均、二乗誤差

今回の調査には関係ないがCelebAよりも分散が大きいので見た目の再構成がうまくいっていない。こういう時にエンコーダ、中間特徴、デコーダのどこをどうすれば十分になるのかの勘どころもよく分かっていない。

![2017-06-19 22_32_40-フォト.png](https://qiita-image-store.s3.amazonaws.com/0/25288/b4ca3109-a140-447a-6d25-6beed0e8c002.png)
![2017-06-19 22_32_59-フォト.png](https://qiita-image-store.s3.amazonaws.com/0/25288/b10f04cc-83ed-3005-0d87-2982c8943f46.png)
![2017-06-19 22_33_19-フォト.png](https://qiita-image-store.s3.amazonaws.com/0/25288/30ed930e-f5c2-6a04-735e-afdf577b5fef.png)
![2017-06-19 22_33_35-TensorBoard.png](https://qiita-image-store.s3.amazonaws.com/0/25288/fedac165-d6d9-7513-a4b2-eb84f5fec43b.png)

# まとめ

前回に引き続いて実験して、前回同様に「あまり気にしなくていいんじゃないか」という感想になった。

モデルが表現可能な分散を増やして（ネットワークのチャネル数や次元数を大きくして）ピクセル単位でほぼ一致するところまで学習を進めようとしたときにどれだけ影響が出るのかわからないしGAN系列やVAE系列でどうなるかもよくわからない。

結論「あんま変わらないけど最終的には違いが出るかも知れないけどよくわからない！」
Pythonのdatetimeで日付の範囲を比較演算子で指定する


最近発見したんですが、Pythonの `datetime` オブジェクトは **比較演算子** が使えるようです。

```py
from datetime import datetime

targets = [ # 6/1から6/30までのデータ
  datetime.datetime(2017, 6, 1, 0, 0),
  datetime.datetime(2017, 6, 2, 0, 0),
  datetime.datetime(2017, 6, 3, 0, 0),
  datetime.datetime(2017, 6, 4, 0, 0),
  datetime.datetime(2017, 6, 5, 0, 0),
  # （中略）
  datetime.datetime(2017, 6, 25, 0, 0),
  datetime.datetime(2017, 6, 26, 0, 0),
  datetime.datetime(2017, 6, 27, 0, 0),
  datetime.datetime(2017, 6, 28, 0, 0),
  datetime.datetime(2017, 6, 29, 0, 0),
  datetime.datetime(2017, 6, 30, 0, 0)
]
```
たとえば上記のような一ヶ月のデータが配列で渡されたとして、

```py
from_dt = datetime(2017, 6, 10)
to_dt = datetime(2017, 6, 20)
```
取得したい日付の **開始日** と **終了日** の `datetime` オブジェクトを作ります。
そして `開始日 <= 判定するdatetimeオブジェクト <= 終了日` という形で比較演算子を用います。

```py
for target in targets:
  if from_dt <= target <= to_dt: # 6/20より小さく6/10よりも大きい
    print target

# 結果:
# 2017-06-10 00:00:00
# 2017-06-11 00:00:00
# 2017-06-12 00:00:00
# 2017-06-13 00:00:00
# 2017-06-14 00:00:00
# 2017-06-15 00:00:00
# 2017-06-16 00:00:00
# 2017-06-17 00:00:00
# 2017-06-18 00:00:00
# 2017-06-19 00:00:00
# 2017-06-20 00:00:00
```
これで開始日から終了日までのデータを取得することができました。割りと簡単ですね
IntelliJ系のIDE(RubyMine, CLion)を使ってみる。(キーボードショートカット等)

# コード書くときに使うショートカット
## Alt + Enter(クイックフィックス)
いろいろ都合よく修正してくれる。
電球マークが出たり、波線出たり...　等々のエラーが出たときに、とりあえず押してみると、参照追加したり、クラスのメンバの実態を実装してくれたり...とにかくいい感じにしてくれる。

困ったら押してみる。

## Ctrl + Space(コード補完)
どんなIDEでも大体あるやつ。

## Ctrl + Shift + Space(スマート補完)
通常の補完よりも「スゴイ」補完、らしい。
(お、おう。。。)

なんか型とかみながら、より良いコード補完を提供してくれるらしい。

## Alt+Insert(コード生成オプション)
今カーソルのある所に合わせた、コードやらメソッドやらを作れるオプションメニューを表示する。
プロジェクトウィンドウにあるファイルなんかをクリックした状態で表示すると、クラス定義なんかも作れる。

-----
覚えれば覚えるほど超高速でコードが書けるようになっているのだろう。
以降他にも覚えながら追記予定。
【質問】pythonのmatplotlibで直方体を描きたいです

pythonのmatplotlibのグラフ上に3次元の直方体を描きたいです．調べてみたらmplot3dなどを使えば出来そうな気がしましたが，使い方がよくわかりませんでした．pythonはpython3.5を使っています．どなたか分かる方いませんか？

よろしくお願いします．
Djangoアプリの初期設定をする





## DB設定と言語、タイムゾーン

めんどくさいので`mysite/settings.py`のgit diffを貼り付けておく。

```diff
 DATABASES = {
     'default': {
-        'ENGINE': 'django.db.backends.sqlite3',
-        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
+#        'ENGINE': 'django.db.backends.sqlite3',
+#        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
+        'ENGINE': 'django.db.backends.mysql',
+        'NAME': '******',
+        'USER': '******',
+        'PASSWORD': '******',
+        'HOST': 'localhost',
+        'PORT': '3306',
     }
 }
 
@@ -103,9 +109,11 @@ AUTH_PASSWORD_VALIDATORS = [
 # Internationalization
 # https://docs.djangoproject.com/en/1.11/topics/i18n/
 
-LANGUAGE_CODE = 'en-us'
+#LANGUAGE_CODE = 'en-us'
+LANGUAGE_CODE = 'ja'
 
-TIME_ZONE = 'UTC'
+#TIME_ZONE = 'UTC'
+TIME_ZONE = 'Asia/Tokyo'
```

## DBマイグレーション

DBの初期化をして、管理用アカウントの登録先とそれに付随する諸々のテーブルを定義。

```
$ python3 manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying contenttypes.0002_remove_content_type_name.../usr/local/lib/python3.6/site-packages/django/db/backends/mysql/base.py:101: Warning: (1146, "Table 'mysql.column_stats' doesn't exist")
  return self.cursor.execute(query, args)
 OK
  Applying auth.0002_alter_permission_name_max_length.../usr/local/lib/python3.6/site-packages/django/db/backends/mysql/base.py:101: Warning: (1146, "Table 'mysql.column_stats' doesn't exist")
  return self.cursor.execute(query, args)
 OK
  Applying auth.0003_alter_user_email_max_length.../usr/local/lib/python3.6/site-packages/django/db/backends/mysql/base.py:101: Warning: (1146, "Table 'mysql.column_stats' doesn't exist")
  return self.cursor.execute(query, args)
 OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length.../usr/local/lib/python3.6/site-packages/django/db/backends/mysql/base.py:101: Warning: (1146, "Table 'mysql.column_stats' doesn't exist")
  return self.cursor.execute(query, args)
/usr/local/lib/python3.6/site-packages/django/db/backends/mysql/base.py:101: Warning: (1146, "Table 'mysql.index_stats' doesn't exist")
  return self.cursor.execute(query, args)
 OK
  Applying sessions.0001_initial... OK
```


## 管理用アカウント作成

古いバージョンのDjangoはDB初期化時に、ユーザ作成も聞いてくれるらしいが、聞いてもらえなかったので自分で作った。

```
$ python3 manage.py createsuperuser
Username (leave blank to use 'kumanoshuta'): shoota
Email address: 
Password: 
Password (again): 
This password is too short. It must contain at least 8 characters.
Password: 
Password (again): 
Error: Your passwords didn't match.
Password: 
Password (again): 
Superuser created successfully.
```

途中でパスワード短くて怒られた。

　次は[アプリの生成](http://qiita.com/shoota_github/items/48236ed1bbb55ccfa4ae)をする
RailsのTimeについて

# 設定

```rb:config/application.rb
class Application < Rails::Application
  config.time_zone = 'Tokyo'
  config.active_record.default_timezone = :local
end
```
参考： [Rails 4 でTimeZoneにちょっとはまった](https://ameblo.jp/motoyamaken/entry-11898457024.html)


# Timeオブジェクト

どれを使えば良いのか、全然わかってない。
とりあえず、Time.nowかTime.currentを使おうと思う。

```
 pry(main)> Time.now
=> 2017-06-19 20:50:54 +0900
 pry(main)> Time.now.class
=> Time
 pry(main)> Time.current
=> Mon, 19 Jun 2017 20:51:22 JST +09:00
 pry(main)> Time.current.class
=> ActiveSupport::TimeWithZone
 pry(main)> Date.today
=> Mon, 19 Jun 2017
 pry(main)> Date.today.class
=> Date
 pry(main)> DateTime.now
=> Mon, 19 Jun 2017 20:54:23 +0900
 pry(main)> DateTime.now.class
=> DateTime
 pry(main)> DateTime.current
=> Mon, 19 Jun 2017 20:54:37 +0900
 pry(main)> DateTime.current.class
=> DateTime
```

# MySQLとActiveRecord

MySQL

```
mysql> SHOW VARIABLES LIKE '%time_zone%';
+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| system_time_zone | JST    |
| time_zone        | SYSTEM |
+------------------+--------+
2 rows in set (0.00 sec)

mysql> SELECT NOW();
+---------------------+
| NOW()               |
+---------------------+
| 2017-06-19 20:48:32 |
+---------------------+
1 row in set (0.00 sec)

mysql> SELECT * FROM users WHERE id = 1\G
*************************** 1. row ***************************
                    id: 1
                 email: admin@example.com
                  name: 管理者
    encrypted_password: 
   password_updated_at: NULL
  reset_password_token: NULL
reset_password_sent_at: NULL
   remember_created_at: NULL
         sign_in_count: 1
    current_sign_in_at: NULL
       last_sign_in_at: NULL
    current_sign_in_ip: 192.168.33.1
       last_sign_in_ip: 192.168.33.1
       failed_attempts: 0
          unlock_token: NULL
             locked_at: NULL
       created_user_id: 1
       updated_user_id: 1
            created_at: 2017-06-19 14:51:23
            updated_at: 2017-06-19 14:51:23
            deleted_at: NULL
1 row in set (0.00 sec)

```

上記のusersデータは、日本時間で、14:51:23に登録したものです。

```
 pry(main)> User.find(1).created_at
  User Load (0.4ms)  SELECT  `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1
=> Mon, 19 Jun 2017 14:51:23 JST +09:00
 pry(main)> User.where('created_at >= ?', Time.now).first
  User Load (0.4ms)  SELECT  `users`.* FROM `users` WHERE (created_at >= '2017-06-19 21:03:23.052284') ORDER BY `users`.`id` ASC LIMIT 1
=> nil
 pry(main)> User.where('created_at >= ?', Time.now - 12.hours).first
  User Load (0.4ms)  SELECT  `users`.* FROM `users` WHERE (created_at >= '2017-06-19 09:03:51.739876') ORDER BY `users`.`id` ASC LIMIT 1
=> #<User id: 1, email: "admin@example.com", name: "管理者", password_updated_at: nil, role: 1, created_user_id: 1, updated_user_id: 1, created_at: "2017-06-19 05:51:23", updated_at: "2017-06-19 05:51:23", deleted_at: nil>
```
LocalStackをつかってローカルでLambdaを実行してみた

ローカルに擬似的なAWS環境を作ってくれて、
料金など気にせずにテストや動作確認を可能にしてくれる
「LocalStack」をつかってLambdaを実行してみました。

詳細な手順は下記リンク先に記載しています。
http://dev.classmethod.jp/cloud/aws/localstack-lambda/
MSYS2+neovim+dein.vimで躓いた

msys2でneovim+dein.vimを使うときに躓いた点があったので備忘録のためにメモ。とりあえず自分の環境では下記で動いているよう。

## 環境

- Windows 7 pro 64bit
- msys2 64bit
- neovim 0.2.1

## エラーその１ jobstartで動かないものがある

※下記の追記での対処がより適切と思われる。
~~jobstartに値を渡すときに引数が文字列かつ空白ありの時にコマンド呼び出しに失敗しているよう。
dein.vim/autoload/dein/job.vim
のjobstartの引数を変更~~

```diff:job.vim
-let args = type(a:args) == type([]) ?
-          \ a:args : [&shell, &shellcmdflag, a:args]
+let args = type(a:args) == type([]) ?
+          \ a:args : split(a:args)
```

~~&shell、&shellcmdflagは残したほうが良いのかも・・~~
### ※2017/7/4追記

失敗する原因は
`&shell = C:/msys64/usr/bin/bash`
`&shellcmdflag = /c`
と、ちぐはぐな状態となっていたため。以下を追記してエラー回避するのが正解。

```vim:init.vim
set shellcmdflag=-c
```

## エラーその２ rmdirが動かない

msys2に入っているrmdirを呼び出してしまうよう。windowsのものを使うよう変更


```diff:install.vim
-rmdir /S /Q ...
+cmd /c rmdir /S /Q ...
```
BOM付きCSVを読み込む[Ruby 2.3.0]

# 経緯
おかしいなぁ、data["name"]で取得できないや・・・

```test.csv
name,age,comment,type
aoi,29,Idol,male
```

# 原因
ExcelでCSV作って、UTF-8にしたは良いが、BOM付きだった。
（nameは一番左のカラムだった）
以下のようにしてやると取得できる。
![bom.png](https://qiita-image-store.s3.amazonaws.com/0/54592/b5cfa45c-4230-8ef9-9534-a57b63eb84f7.png)

```hidden.rb
p data["﻿name"]    #BOMがついてる
```

# 解決
CSV.readで以下のように指定して取得する。~~（foreachで取得できなかった）~~(追記参照)

```csv.rb
csv_data = CSV.read('test.csv', 'r:BOM|UTF-8', headers: true)
csv_data.each do |data|
    p data["name"]
end
```

## 追記(6/22)
コメントいただきまして、下記にもありますが`CSV.foreach`でも取得できました！:thumbsup:

```csv.rb
CSV.foreach 'test.csv', {encoding: 'BOM|UTF-8', headers: true} do |data|
    p data["name"] # 取得できる
end
```


# 参考
[Ruby CSVを扱うためのメモ](http://qiita.com/shizuma/items/7719172eb5e8c29a7d6e)
[ファイルから読み込む時に自動的にBOMを削除する](http://qiita.com/KitaitiMakoto/items/2e2d425e439d4b16a279)
canvas 上の画像に矩形を描く

canvas に書いた画像の上に、矩形を描きます。
顔認識の後の画像処理に使えます。

参考
[OpenCV で顔認識](http://qiita.com/ekzemplaro/items/3b84759e9119d342b2ba)

```html:index.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Cache-Control" content="no-cache" />
<meta http-equiv="CONTENT-TYPE" content="text/html; charset=utf-8" />
<script src="photo.js"></script>
<title>Photo on Canvas</title>
</head>
<body>
<h1>Canvas</h1>
<canvas id="area_aa" height="767" width="1280"></canvas>
Jun/19/2017<p />
</body>
</html>
```

```js:photo.js
// ----------------------------------------------------------------------
//	photo.js
//
//							Jun/19/2017
// ----------------------------------------------------------------------
window.onload = function()
{
	var canvas = document.getElementById ("area_aa")

	var ctx = canvas.getContext('2d')

	var img = new Image()
	img.src = "./family-557100_1280.jpg"

	img.onload = function()
		{
		ctx.drawImage(img, 0, 0)

		ctx.lineWidth = 5
		ctx.strokeStyle = "rgb(0, 0, 255)"
		ctx.strokeRect (858,230,137,137)
		ctx.strokeRect (316,227,122,122)
		ctx.strokeRect (548,261,120,120)
		ctx.strokeRect (73,350,112,112)
		ctx.strokeRect (1026,358,108,108)
		}
}

// ----------------------------------------------------------------------
```

次のアドレスで動作を確認できます。
>https://ekzemplaro.org/data_base/doc/graphics/canvas/photo/
>>2019/Jul/19 に動作を確認しました。
![canvas.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/d94287a0-d808-654b-2130-e0f86559b96d.png)
HoloLensで始めるUWP - HoloLens上でファイルI/O可能な範囲

# UWPでのファイルI/O
UWPアプリケーション自体かなりセキュリティを意識した機構を持っていてローカルのストレージへのアクセスがかなり制限されています。
また、HoloLens自体はベースはWindows 10ではありますが、通常のPCと比べてもデバイスとして制約や制限が入っています。
HoloLens上でUWPアプリからファイルを出力するとどのあたりまで可能なのか調べる機会があったので結果を整理してみました。

## 開発環境
* Windows 10 Pro
* Unity 5.5.0f3

## 参考になる資料
MSDNにはUWPでファイルI/Oを扱うための資料が以下の場所に公開されています。

* [ファイルの作成、書き込み、および読み取り](https://docs.microsoft.com/ja-jp/windows/uwp/files/quickstart-reading-and-writing-files)
* [ファイルアクセス許可](https://docs.microsoft.com/ja-jp/windows/uwp/files/file-access-permissions)

HoloLens上でも基本このルールに従っていると思われるのでまずは使えそうな場所すべてにファイルのI/Oを実施しその結果とパスを整理しました。

## 確認結果
HoloLens上でファイルの読書きをした結果とその際アクセスしたパスの情報は以下の通りです。

| No. | カテゴリ | 説明 | 実パス | R/W |
|:--|:-:|:-:|:--|:-:|
| 1 | streamingAssetsPath(Unity) | UnityのAsset内で作成したstreamingAssetフォルダ  | C:\Program Files\WindowsApps\\[パッケージ名]VS.[構成名]_[アーキテクチャ].[ユーザ名]\Data\StreamingAssets\  | R  |
| 2 | persistentDataPath(Unity)  | アプリケーション内で利用するファイルの格納するフォルダ。  | C:/Users/[ユーザ名]/AppData/Local/Packages/[パッケージファミリ名]/LocalState | R/W  |
| 3 | temporaryCachePath(Unity)  | アプリケーションで一時的に使用するファイルを格納するフォルダ。 |  C:/Users/[ユーザ名]/AppData/Local/Packages/[パッケージファミリ名]/TempState  | R/W  |
| 4 | DocumentsLibrary  | サインインしたユーザのドキュメントフォルダ。このフォルダはファイルの読込みのみ対応。  | D:\\[ユーザ名]\Documents  | R |
| 5 | PicturesLibrary  | サインインしたユーザのピクチャフォルダ。書込む際は「Package.appxmanifest」にて「ピクチャライブラリ」をチェック  | D:\\[ユーザ名]\Pictures  | R/W  |
| 6 | MusicLibrary  | サインインしたユーザの音楽フォルダ。未設定では読込のみ。書込む際は「Package.appxmanifest」にて「音楽ライブラリ」をチェック  | D:\\[ユーザ名]\Music | R/W  |
| 7 | VideosLibrary  | サインインしたユーザのビデオフォルダ。未設定では読込のみ。書込む際は「Package.appxmanifest」にて「ビデオライブラリ」をチェック  | D:\\[ユーザ名]\Videos | R/W  |
| 8 | LocalCacheFolder  | アプリケーションで利用できるローカル一時キャッシュフォルダ。アプリケーションがアイドル状態になった場合には破棄される領域（と言われているが実際はどうでもない） | C:\Users\\[ユーザ名]\AppData\Local\Packages\\[パッケージファミリ名]\LocalCache  | R/W |
| 9 | RoamingFolder  | ローミングフォルダ  | C:\Users\\[ユーザ名]\AppData\Local\Packages\\[パッケージファミリ名]\RoamingState  | R/W  |
|10 | TemporaryFolder  | アプリケーションで一時的に使用するファイルを格納するフォルダ。 | C:\Users\\[ユーザ名]\AppData\Local\Packages\\[パッケージファミリ名]\TempState | R/W  |
|11 | LocalFolder | アプリケーション内で利用するファイルの格納するフォルダ。  | C:\Users\\[ユーザ名]\AppData\Local\Packages\\[パッケージファミリ名]\LocalState  | R/W  |

[ユーザ名]：サインインユーザ
[パッケージ名]：「Package.appxmanifest」を開き「パッケージ化」タブ内の「パッケージ名」値
[構成名]：ビルド時の構成（Debug/Release/Master）
[アーキテクチャ]：x86/ARM/x64　※HoloLensなのでx86
[パッケージファミリ名]：「Package.appxmanifest」を開き「パッケージ化」タブ内の「パッケージファミリ名」値

### 基本的な考え方
基本的にはUnityで提供されているパス系の情報だけで十分対応できると思います。「音楽ライブラリ」等OSの特定のフォルダへのアクセスについてもUWPで提供されている方法を使うと便利ですが、同じパスを指定できればUnityのみで処理はできます。

### Roming Folderについて
このフォルダは少し特殊なフォルダになります。UWPアプリケーションはWindows 10が稼働するデバイスであれば、基本的には動作します。この際にアプリケーションの設定（背景色や保存途中の情報）をデバイス間で同期し共有するためのフォルダになります。
Node.jsでFitBit APIから今日の歩数を取得する


FitBitのアクセストークンを取得したらcurlなどでも値を取得できるのでどんな言語からでもFitBitのデータにアクセスできます。


## 準備

* アクセストークン取得

アクセストークン取得は[FitbitのAPIを手っ取り早く試してみる方法](http://qiita.com/makopo/items/32f41128c2e055cec68f)この記事がわかりやすかったです。

* インストール

```bash
$ npm init -y
$ npm init --save axios
```

## コード

https://dev.fitbit.com/docs/activity/ を見ると`activities/steps`が歩数を取得するAPIであることがわかります。

`/user/-/activities/steps/date/today/1m.json`の指定だと直近1ヶ月の日毎の歩数を取得できます。

```app.js
'use strcit';

const axios = require('axios');
const TOKEN = `アクセストークン`;

const CONFIG = {
    baseURL: 'https://api.fitbit.com/1',
    url: '/user/-/activities/steps/date/today/1m.json',
    method: 'get',
    headers: {'Authorization': `Bearer ${TOKEN}`}
}; 

axios.request(CONFIG).then((res)=>{
    const items = res.data['activities-steps'];
    const lastItem = items[items.length-1];
    console.log(`日付: ${lastItem.dateTime}, 歩数: ${lastItem.value}`)
});
```

`res.data['activities-steps']`に1ヶ月間のデータが入ってきます。
最新の状態にFitBitを同期していることが前提ですが、最新の値を取得すると今日の歩数を取得したことになります。

## 実行

```bash
$ node app.js
日付: 2017-06-19, 歩数: 4722
```

## 所感

[エンタープライズIoTLT #8 ヘルスケアIoTLT @デジハリ](https://iotlt.connpass.com/event/58554/)で何か話すべく、試してみています。

FitBitはAPIドキュメントや事例などが日本語の情報が少なすぎてなかなか手を出しにくいイメージでしたが参考にした記事など、分かりやすい記事も増えて来ていて昔ほどハードルは無いようにも感じました。

FitBit使って何かしてればヘルスケアIoTの部類になるのか自問自答しながら何か作ってみます。


今日全然あるいてないなぁ...
IBM Cloud IaaS(旧SoftLayer)におけるVRAの選択基準

#1. はじめに
IBM Cloud IaaS(旧SoftLayer)では、ネットワーク・ゾーニングやVPNやGREを利用可能なVRA(Virtual Router Appliance)がよく利用されています。本記事では、よく質問される**どのVRAを買えばいいの？**という疑問について解説したいと思います。

#2. VRAサーバーの選択基準(TOK02の場合）

東京DC(TOK02)では、VRAは以下のモデルから選択可能です。以下はTOK02での構成を例にして説明します。

<img width="896" alt="VyattaOrder.png" src="https://qiita-image-store.s3.amazonaws.com/0/62127/d73b1588-44c3-9e8a-8008-ea4a48aa2bc6.png">


#2.1 どのネットワーク帯域を選択するか？

**原則、テスト環境を除き100Mbps構成は選択するべきではありません**。単なる動作確認レベルなら問題ないかもしれませんが、擬似本番環境や本番環境では必ず1Gbps以上を選択しましょう。
ただし、Single Processor Multi-Core Serversは1Gbpsまでしか選択できません。**10Gbps以上必要な場合は、Dual Processor Muti-Core Serversを選択して下さい。**
なお、Endurance Storageへのアクセスまで含めて全てのNWアクセスをVRA経由にする場合は、VRA自身がボトルネックにならないように必ず10Gbps portを選択して下さい。VRAが1GbpsのままだとVRAが通信ボトルネックになる問題が発生します。どうしても1Gbpsを選択したくない場合には、少なくともEndurance StorageへのアクセスはVRAを通らないように構成するべきです。

#2.2 CPUモデル(v3)? CPUモデル(v4)？CPUモデル(v6)

CPUのv3モデルとはHaswellを、v4はBroadwellを、v6はKaby Lakeを指します。EOSのことを考えると、v3はプロセッサー的に古い世代なので、今後は可能な限りv4もしくはv6を選択することが望ましいでしょう。

#2.3 コア数やメモリは幾つにするか？

基本的にコアもメモリも使い切れるものではないので、選択できるものの中で最小のものでよいでしょう。
VRAは、はっきり言ってDDoSなどの攻撃を受けなかったりストレージI/Oが通らなければ、2 core、2GB RAM、1Gbps portのVSIでもリソース的には十分なレベルだと思います。大抵のお客様はDirect Linkの先が100Mbps以下だったりするので、なおのことCPUやメモリは使いきれません。最小構成で十分でしょう。

#2.4 ディスク構成は？

VRAは原則メモリ上での処理になりますが、HDDが死んでしまうとそれに引きずられて通信にも障害を与えてしまう可能性があります。本番環境ではSATAで良いのでRAID1で冗長化しておくことを推奨します。

#2.5 1Uモデル？2Uモデル
ストレージが`Up to 4 Drive`のサーバーは1Uモデルであり、電源冗長化が選択できません。もし電源冗長化まで必要な場合は`Up to 12 Drive`の2Uモデルを選択しましょう。

#3 結局どれを選択すればいいの？

- 電源まで含めて冗長化したい
- ある程度の規模のストレージ（Endurance Storage/Performance Storage)へのアクセスまで含めてVRAを通して厳密なゾーニングを行いたい（もしくは、仮想サーバーなどを利用しているためにストレージ専用のVLANを設けることができない）

のであれば、以下を選択しておけばよいと思います。

- Intel Xeon E5-2620 v4(Redundant Power Supplyが標準搭載）
- メモリは最小サイズ
- 10 Gbps Redundant Public & Private Network Uplinks
- 1TB SATA x 2でRAID1構成
- Redundant Power Supply

一方で、

以下の条件が満たせるのであれば、Single Processor Multi-Core Serversの1Gbpsモデルを使っても良いでしょう。

- 1Gbpsで十分であるという根拠がある。特にストレージ（Endurance Storage/Performance Storage)への大量アクセスはVRAを経由しないように構成できるし、将来もそのような予定はない(10Gbpsにupgradeする要件がない）。構成例：VMWare環境上でStorageアクセス用のVLANを別途設け、そのVLANに関してはVRAを通さないようにする、等。
- 2台構成でVRRPを使って冗長化しているので、電源障害については電源障害時は副系に切り替わることで対応できると割り切れるシステムである。
Git LFSを利用するための備忘録

Git LFSについてはこちら
https://git-lfs.github.com/

上記サイトからダウンロードすることもできますがbrewを利用してインストールしていきます。

## Git LFSインストール
```
$ brew install git-lfs
$ git lfs install
```
## バージョン確認
```
$ git lfs version
```

## Git LFSで管理したいファイルの設定
```
$ git lfs track “*.psd”
$ git lfs track “*.ai”
```
→リポジトリ内に.gitattributesが作成される

## GitLFS設定の確認
```
$ git lfs track
Listing tracked patterns
    *.psd (.gitattributes)
    *.ai (.gitattributes)
```

## LFS管理対象の確認
```
$ git lfs ls-files
xxxxxxxxxx * sample_20170616.ai
```

設定できたらコミット、プッシュはいつもどおりでOK。
Swift3 TextViewにToolBarを追加する方法

![no.gif](https://qiita-image-store.s3.amazonaws.com/0/135794/700e4593-4453-0d27-ce2e-7fb6ee3ed02e.gif)



```swift

    func keyboardToolbar(textView: UITextView) {
        
        let toolbar: UIToolbar = UIToolbar(frame: CGRect(x: 0, y: 0, width: 1, height: 1))
        toolbar.barStyle = UIBarStyle.default
        toolbar.bounds.size.height = 28
        
        let flexSpace = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.flexibleSpace, target: nil, action: nil)
        

        let done: UIBarButtonItem = UIBarButtonItem(title: "done", style: UIBarButtonItemStyle.done, target: self, action: #selector(self.doneButtonActionn))
        done.tintColor = UIColor.red
        
        let clear: UIBarButtonItem = UIBarButtonItem(title: "Clear", style: UIBarButtonItemStyle.plain, target: self, action: #selector(self.doneButtonAction))
        clear.tintColor = UIColor.black
        
  
        var items = [UIBarButtonItem]()
        
        items.append(clear)
        items.append(flexSpace)
  
        items.append(done)
        
        toolbar.items = items
        toolbar.sizeToFit()
        
        textView.inputAccessoryView = toolbar
    
    
    }
    
    
    func doneButtonAction() {
        
        self.bodyTextView.resignFirstResponder()
        //self.bottomSpace.constant = 12
    }
    
    func doneButtonActionn() {
        
        self.bodyTextView.resignFirstResponder()
        //self.bottomSpace.constant = 12
    }

    func textViewShouldBeginEditing(_ textView: UITextView) -> Bool {
        
        self.keyboardToolbar(textView: textView)
        return true
    }


```
OSGeo4WでiPythonを利用できるようにする

（走り書き的メモですすみません）

## 32bit
1. Visual C++ 9.0のコンパイラを入れる
[Microsoft Visual C++ Compiler for Python 2.7](https://www.microsoft.com/en-us/download/details.aspx?id=44266)
2. OSGeo4W setup起動
    1. アドバンスインストールでpipを追加
3. OSGeo4W shell 起動
4. pip install setuptools
5. pip install ipython
6. しあわせ。

## 64bit
上記32bit版の2.1のあとで、python-develを入れる
2.2. python-devel追加

以下同でしあわせ。

---
（2017/06/21 追記）

64bit、win8.1の環境だと、

> NoConsoleScreenBufferError

というのが出てiPythonが起動しない。
ひとまず、

> \OSGeo4W64\apps\Python27\Lib\site-packages\prompt_toolkit\terminal\win32_output.py

の中にある **get_win32_screen_buffer_info** で

```python
success = windll.kernel32.GetConsoleScreenBufferInfo(self.hconsole, byref(sbinfo))
```

を

```python
success = self._winapi(windll.kernel32.GetConsoleScreenBufferInfo, self.hconsole, byref(sbinfo))
```

に差し替えれば動く。
（コード内にコメントアウトされてるので、差し替えは簡単。）
Kotlinコルーチンによるリアクティブストリームのガイド (日本語訳)

このページにはkotlinx.coroutinesのドキュメント「Guide to reactive streams with coroutines」を掲載していました。
現在、この文書は翻訳元から削除され、リアクティブストリームに関する説明はフローのドキュメントの[「フローとリアクティブストリーム」](https://github.com/pljp/kotlinx.coroutines/blob/japanese_translation/docs/flow.md#%E3%83%95%E3%83%AD%E3%83%BC%E3%81%A8%E3%83%AA%E3%82%A2%E3%82%AF%E3%83%86%E3%82%A3%E3%83%96%E3%82%B9%E3%83%88%E3%83%AA%E3%83%BC%E3%83%A0)セクションで少しだけ言及されています。
sakuraのDB使用制限に対応するTruncate実行

#概要
MySQLのあるDatabaseを全てtruncateするために行なったことを記す。

#環境
sakuraのレンタルサーバ　スタンダード

#背景
sakuraでサーバを借りている。そこでWeb上の色々な情報をスクレイピングして取ってきていたのだが、ある日DB使用が多すぎるとの通知が届いた。
面倒だなぁと思いつつも、お世話になっているのでユーザ削除とかされたら困る。対応した。

#今までの対応策
全てをtruncateする方法の多くはコマンドライン上で動くものであった。ただ、これらはLinuxの対応策であり、BSD系は少しコマンドが違う。というか、動かなかった。なので、sakuraでデフォルトで使えるPHPで実装を行なった。pythonも考えたけど、今更2系なんて書きたくないし、root権限なんて当然もらえないのでpipが使えない。面倒だ。よってPHPで行なった。

#行なったこと

##mysqldumpで自分の領域に持って行く
sakuraのターミナル上で実行
```
mysqldump -u USER_NAME -p -h HOST_NAME DB_NAME > OUTPUT_FILE_NAME
```

##PHPで全てを一括削除する
```all_mysql_truncate.php
<?php
try{
    $pdo = new PDO("mysql:dbname=DB_NAME;host=HOST_NAME", "USER_NAME", "PASSWORD");
}catch (PDOException $e) {
    exit("fail to connect to database".$e->getMessage());
}
try{
    $stmt = $pdo->prepare("show tables;");
    $stmt->execute();
    $results = $stmt->fetchAll(PDO::FETCH_NUM);
} catch (Exception $e) {
    exit("fail to fetch data".$e->getMessage());
}
$stmt = $pdo->prepare("SET FOREIGN_KEY_CHECKS=0;");
$stmt->execute();
foreach($results as $result){
    $stmt = $pdo->prepare("truncate table `".$result[0]."`");
    $stmt->execute();
    echo ("truncate table ".$result[0]."\n");
}
$stmt = $pdo->prepare("SET FOREIGN_KEY_CHECKS=1;");
$stmt->execute();
?>
```
以上にうまくDBなどを設定し、「php all_mysql_truncate.php」で実行完了する。
外部キーのあるところは削除したくなければ、SET FOREIGN_KEY_CHECKS=0;のあたりを実行しないようにすること。

##所感
PHPのデータベース接続周りは色々なやり方があるようで..少し戸惑った。
よくある「?」を使ってそこに後からarrayを与える方法は今回は使えなかった。
InsertとUpdate文のためのものなのかしら。
Mathf.Clampを使ってプレイヤーを画面内でのみ移動させる備忘録

上から落ちてくる障害物を避けるゲームを制作中のお話。
作っている本人は画面外に出ないのが当たり前なので全く気にしておりませんでした。
しかし、ふと気づいてしまったのです。
このままだと画面外を飛び出して永遠の彼方へ行けてしまうと。。。


#Mathf.Clampを使ってみた
キャラクターのx座標の延長線上にオブジェクトを配置してColliderをつけて画面外に出ないようにすることも試してみました。(キャラクターは左右にしか動けません。)
きっとできないことはないのでしょうが私の今の知識ではできませんでした。
どうしたもんかなぁ〜と方法を探してやっと見つけました。
↓ご参考にさせていただいたサイト
http://www.clrmemory.com/unity/move-restrict-mathf-clamp/

Mathf.Clampは制限したオブジェクトの範囲を制限できるコード。
`Mathf.Clamp(制限したいオブジェクトの座標,座標の最小値,座標の最大値)`

今回はx座標だけを制限したいので

```
player.transform.position = new Vector3(Mathf.Clamp(player.transform.position.x,leftWall.transform.position.x,rightWall.transform.position.x),y,z);
```
としました。

これで実行してみると。。。
ちゃんと画面内だけに制限できました。

##まとめ
Inspector上から何でも出来ると思っておりました。
その固定概念にとらわれていたため、何時間も費やしてしまいました。
やはり視野を広く持つことは大切だなと改めて気づかされました。

参考にさせていただいたサイトを上に載せましたが、x座標、y座標どちらも制限するやり方が載っておりますのでy座標も制限したいという方はサイトへ。
複数Sceneをロードした状態でSceneManager.SetActiveSceneでシーンを切り替えたらSkyBoxやGIも切り替わるようにする方法

##◆検証したいこと
複数SceneをLoadAdditiveした状態で、SceneManager.SetActiveSceneでアクティブなシーンを切り替え時、SkyBoxやGIもそのシーンのものに切り替わるか？

##◆結論
**変わる**
![SceneManagerTest002.gif](https://qiita-image-store.s3.amazonaws.com/0/22909/315fec21-e0b2-b06c-98a9-41a0e0eb19c4.gif)

##◆検証方法
1. SkyBoxやLightを設定したSceneを2つ作成（それぞれScene001, Scene002と命名）<br>Scene001<br>![SceneManagerTest001.PNG](https://qiita-image-store.s3.amazonaws.com/0/22909/958db9e3-75e6-620e-b946-69a4c8c1eed5.png)<br>Scene002<br>![SceneManagerTest002.PNG](https://qiita-image-store.s3.amazonaws.com/0/22909/af5d0bff-c0ab-7e2b-c7b9-bf0a065b2805.png)


1. SceneManagerを制御するGameObjectを配置した、カメラもLightも無いシーンを作成（Mainと命名）
- 全てのシーンで下記のLightingの設定を行う
・Mixed Lightingを無効
・Auto Generateのチェックボックスも無効
・Generate Lightingを実行した後にシーンを保存
![SceneManagerTest004.PNG](https://qiita-image-store.s3.amazonaws.com/0/22909/24f5420a-8619-1d77-9971-aade37021034.png)

1. SceneManager.LoadSceneAsyncでシーンをAdditiveでロード（Asynである必要はない）
1. SceneManager.SetActiveSceneでシーンを切り替える（今回は、シーンのルートオブジェクトのActiveも切り替えるようにしてみた）

##◆検証プロジェクト
https://github.com/kaiware007/SceneManagerSkyboxGITest/
検証環境： Unity5.6.1f1

##◆参考情報
https://forum.unity3d.com/threads/gi-not-following-scene-when-using-scenemanager-loadsceneasync.411208/#post-2714594
画像を表示する際にモアレ(干渉縞)を抑制する方法

## 概要
iOSアプリでUIImageViewを使用して画像を表示する際に、モアレが発生することを回避する為の方法を記載します。

## モアレとは
> モアレまたはモワレ（仏: moiré）は、干渉縞ともいい、規則正しい繰り返し模様を複数重ね合わせた時に、それらの周期のずれにより視覚的に発生する縞模様のことである。
また、規則正しい模様を、デジタル写真などのビットマップ画像にした場合も、画像の画素解像度と模様の周波数のずれが原因で同様の縞模様が発生するがこれもモアレと呼ぶ。
<img src="https://upload.wikimedia.org/wikipedia/commons/3/31/Moire_pattern_of_bricks.jpg" width="300" alt="元画像">　<img src="https://upload.wikimedia.org/wikipedia/commons/f/fb/Moire_pattern_of_bricks_small.jpg" width="300" alt="モアレ発生画像">
[wikipediaより引用](https://ja.wikipedia.org/wiki/%E3%83%A2%E3%82%A2%E3%83%AC)

上記の画像2つを見比べて頂けるとわかりやすいかと思いますが、
左側の画像が元画像で、右側の画像がモアレが発生している状態の画像です。 

## どのような場合に起こりうるか
モアレが発生しやすい上記のようなパターンの画像を本来の画像サイズよりも小さいサイズのUIImageViewで表示で表示するだけで容易に発生します。
(本来のサイズよりも小さい程に発生しやすい)

## 回避方法
`UIImageView`の`layer.minificationFilter`に **kCAFilterTrilinear** を設定することでモアレを発生させることなく画像表示が可能です。

```swift:sample
extension UIImageView {
    override open func awakeFromNib() {
        super.awakeFromNib()

        self.layer.minificationFilter = kCAFilterTrilinear
    }
}
```
ドキュメント： [minificationFilter](https://developer.apple.com/documentation/quartzcore/calayer/1410898-minificationfilter)

設定可能な縮小フィルタ

- kCAFilterLinear：線形補間
- kCAFilterNearest：近傍補間
- kCAFilterTrilinear：トリリニア補間

## おわりに
`UIImageView`や`UIImage`の設定を探し回り結果CALayerでの設定でした。
画像コンテンツをメインで扱うようなアプリでは設定を検討してみては如何でしょうか。
誤りなどありましたら、コメント/編集リクエスト頂けると助かります。
組合せ最適化で、ゲームのグループ分け

# これなに
あなたは、結婚式の2次会の幹事です。
9人の参加者が、3人ずつ3つのグループに分かれてゲームをします。
このゲームは4回行われます。
**どの2人**も、**同じグループになるのが1回まで**になるようグループ分けを考えましょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/13955/4ddb9916-1561-9d47-ab15-27bc63923d5e.png)

※ [LocalSolver例題集](http://www.msi-jp.com/localsolver/quickguide/example/)の[Social golfer](http://www.localsolver.com/documentation/exampletour/socialgolfer.html)をヒントにしています。

# 定式化 ＆ Python
[組合せ最適化](http://qiita.com/SaitoTsutomu/items/bfbf4c185ed7004b5721)を使って解きましょう。例によって、[PuLPとpandasを使い](http://qiita.com/SaitoTsutomu/items/070ca9cb37c6b2b492f0#pulp%E3%81%A8pandas%E3%81%AE%E7%B5%84%E5%90%88%E3%81%9B%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)ます。
「誰が、いつ、どのグループか」が成立するかを **0-1 変数 Var**で表します。

```py3:python3
import pandas as pd
from pulp import *
from ortoolpy import addvars, addbinvars
from itertools import permutations
uss = [chr(65+i) for i in range(9)] # Users
a = pd.DataFrame([(us,wk,gr) for us in uss for wk in range(4)
        for gr in range(3)], columns=['User','Time','Group'])
a['Var'] = addbinvars(len(a)) # 変数
a[:3] # 先頭の3行表示
```

<table>
  <thead>
    <tr>
      <th></th>
      <th>User</th>
      <th>Time</th>
      <th>Group</th>
      <th>Var</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>A</td>
      <td>0</td>
      <td>0</td>
      <td>v0001</td>
    </tr>
    <tr>
      <th>1</th>
      <td>A</td>
      <td>0</td>
      <td>1</td>
      <td>v0002</td>
    </tr>
    <tr>
      <th>2</th>
      <td>A</td>
      <td>0</td>
      <td>2</td>
      <td>v0003</td>
    </tr>
  </tbody>
</table>

## 定式化

目的関数|なし
:--|:--
制約|各人各回で1つのグループに所属
 |1グループは3人
 |どの2人も、同一グループになる回数は1回まで<br>(同一のグループのとき1になる変数を使う)

```py3:python3
m = LpProblem() # 数理モデル
for _,v in a.groupby(['User','Time']):
    m += lpSum(v.Var) == 1 # 各人各回で1つのグループに所属
for _,v in a.groupby(['Time','Group']):
    m += lpSum(v.Var) == 3 # 1グループは3人
for uu in permutations(uss,2):
    y = addvars(4*3) # 同一のグループのとき1になる変数
    m += lpSum(y) <= 1 # どの2人も、同一グループになる回数は1回まで
    for w,(_,v) in zip(y, a[a.User.isin(uu)].groupby(['Time','Group'])):
        m += lpSum(v.Var) <= 1+w # yとVarの関係
m.solve()
a['Val'] = a.Var.apply(value)
a[a.Val>0].groupby(['Time','Group']).User.sum() # 結果表示
```

## 結果

<pre>Time  Group
0     0        AFI
      1        EGH
      2        BCD
1     0        ABH
      1        CEF
      2        DGI
2     0        ACG
      1        BEI
      2        DFH
3     0        BFG
      1        ADE
      2        CHI
</pre>

# 補足 - その1
素直に定式化すると、目的関数が2次の非線形最適化になります。そのままでは、MIPソルバでは解けないので、ペアごとに新たな変数(y)を追加することで（変数は多くなりますが）線形最適化になります。
とはいえ、規模が大きい場合は、局所探索法などの近似解法の方が有効かもしれません。

# 補足 - その2
- PuLP の LpProblem は、問題ではなく、**モデル**です！
  - 問題：解決したいと思っていること
  - モデル：コンピュータで扱えるように表現されたもの

- 結果を見直すときに変えるのは、問題ではなくモデル！

以上
プログレッシブとベースラインの違い

jpegの保存形式に迷ったのでメモ


JPEG形式	表示方法
ベースライン　：　上から徐々に読み込んで表示する一般的な方式。
プログレッシブ：画像全体を荒く（低解像度）表示し、徐々に細かく（高解像度）表示する。

*プログレッシブの方が、データがやや軽い。参考サイト参照。

参考サイト
https://naifix.com/jpeg/
[Linux] Ubuntu16.04にteamViewerをインストールしようとしたらエラーが出た

# まえがき
Linux Ubuntu 16.04 x86_64にteamviewerをインストールしようとした際に発生したエラーの対処法について書き記します。

# 症状
[こちら](https://www.teamviewer.com/ja/download/linux/)から.debパッケージをダウンロードした後に

```shell-session
$ dpkg -i teamviewer_?.?.?_i386.deb
```
を実行したところ、「**処理中にエラーが発生しました: teamviewer:i386**」
というエラーによりインストールが中断されました。

# 解決方法


```shell-session
$ wget http://download.teamviewer.com/download/teamviewer_i386.deb
```
```shell-session
$ sudo apt-get -f install ./teamviewer_i386.deb
```

しばらく待つと...

```shell-session
$ teamviewer
```
で起動できました。
稼働しているEC2インスタンスからAMIを作成するshell script

久しぶりの投稿です。

最近、稼働しているEC2インスタンスのAMIをリアルタイムで作成する必要が有ったので、shell scriptを使って実装してみました。

- 前提
    - AWS CLIの設定(インストール～ `aws configure` での設定)が完了している
    - [jq](https://stedolan.github.io/jq/)は使用せず、AWS CLIのオプション(filters, query, output等)のみで対応する

処理の流れはこんな感じ↓です

1. "Instance State"が `running` で "tag" に `Name` が設定されているインスタンスのInstanceIdを取得して変数に格納する
2. 1で取得したInstanceIdをキーにしてインスタンスに設定されている "tag" の `Name` を取得して変数に格納する
3. 格納した変数をそれぞれ配列に格納する
4. InstanceIdをキーにAMIを作成(AMI NameとDescriptionには2で取得した "tag" の `Name` + "-" + 今日の日付を設定する)
5. 4で作成したAMIの "tag" の `Name` に2で取得した "tag" の `Name` + "-" + 今日の日付を設定する
6. キーにしたInstanceIdが存在する間、4～5を繰り返す

ソースは以下↓です。

```
#!/bin/bash

set -eu

TODAY=`date '+%Y%m%d'`
instance_ids=""
instance_names=""
source_ids=""
source_names=""
j=0

## get instance_ids (only status is 'running' and tag-key=Name)
instance_ids=`aws ec2 describe-instances --filters "Name=instance-state-name,Values=running" "Name=tag-key,Values=Name" --query "Reservations[].Instances[].InstanceId" --output text`

## get instance_Name (only status is 'running' and tag-key=Name)
instance_names=`aws ec2 describe-instances --instance-ids ${instance_ids} --filters "Name=tag-key,Values=Name" --query "Reservations[].Instances[].Tags[].Value" --output text`

source_ids=($instance_ids)
source_names=($instance_names)

for i in "${source_ids[@]}"
do
  ami_id=""
  
  ## create ami
  ami_id=`aws ec2 create-image --instance-id ${i} --name "${source_names[$j]}-${TODAY}" --description "${source_names[$j]}-${TODAY}" --no-reboot --output text`

  ### put tags to ami
  aws ec2 create-tags --resources ${ami_id} --tags Key=Name,Value="${source_names[$j]}-${TODAY}"
  
  ## count up
  j=$((j+1))
done

exit 0

```

- 注意事項
    - AMIを作成するインスタンス情報の取得の際にOWNER ID等での制限をしていないので、クロスアカウントでの使用の際には注意が必要
    - インスタンスの状態が'running'になっているもの全てに対してAMIを作成するようになっているので、台数が多い場合には注意が必要

スクリプトは [こちら](https://github.com/kwsmkn/scripts/blob/master/AWS/create-ami/create-ami-realtime.sh) にもありますので、ご自由に使ってください。
処理自体は非常にシンプルになっています(自分の実力でもありますが...)
基本的な動作確認はしていますが、もし何かありましたらそっと修正して教えていただくと非常にありがたいです！
SQLチューニング（Oracle)

#ルールベースオプティマイザを使う

ヒント句を指定することで、廃止されたルールベースオプティマイザを使うことができます。

```
 /*+ RULE */
```

を指定するだけ。
システムのバージョンアップに伴って、性能改善ができず、苦し紛れの策です。
現行保障はできたものの、Oracleさんのサポート対象外になるらしい。
Spring Boot CLI と Groovy 7行で Hello, world! してみる

Spring Boot CLI と Groovy 7行で Hello, world! してみたのでメモっとく。

[Spring Boot で Hello, world! するのを Java と Kotlin と Groovy で比較する](http://qiita.com/takuya0301/items/8af40fee6089abbfe4e5)よりマイクロにできることがわかったのでついでに書いておく。

なお本稿は macOS 環境を前提にしている。

# Spring Boot CLI をインストールする

Homebrew で Spring Boot CLI をインストールする。

```shell-session
$ brew tap pivotal/tap
$ brew install springboot
```

ターミナルで下記のコマンドを実行してみるとバージョンが表示される。なお、Rails 環境がローカルにあると Rails が使用している spring が実行されてしまう可能性があるので PATH 環境変数を調整しよう。

```shell-session
$ spring --version
Spring CLI v1.5.4.RELEASE
```

# Hello プロジェクトを作成する

Hello プロジェクトのディレクトリを作成して移動する。

```shell-session
$ mkdir hello
$ cd hello
```

そのディレクトリに HelloApplication.groovy ファイルを作成する。

```groovy:HelloApplication.groovy
@RestController
class HelloApplication {
    @RequestMapping("/")
    def hello() {
        "Hello, world!"
    }
}
```

# Hello プロジェクトを実行する

Hello プロジェクトのディレクトリに移動して Spring Boot CLI の run サブコマンドを HelloApplication.groovy に対して実行すると Web サーバーが起動する。

```shell-session
$ spring run HelloApplication.groovy
```

# GET リクエストを送信する

起動した Hello プロジェクトに GET リクエストを送信すると Hello, world! が返ってくる。

```shell-session
$ curl localhost:8080
Hello, world!
```

---

Groovy に限定されてしまうけどマイクロフレームワーク並のコードで Spring の機能が利用できるのは魅力的。動作の詳細については時間があるときに記事にまとめたいな。プロダクション用にパッケージングすることもできるようなのであなどれない機能だね。

# 参考文献

[Spring Boot in Action](https://www.manning.com/books/spring-boot-in-action)
https://docs.spring.io/spring-boot/docs/current/reference/html/cli-using-the-cli.html
CircleCI で yarn install が失敗したので対策を共有

## 環境
- CircleCI 1.0
- yarn v0.21.3


## 手順通りに `circle.yml` を書いてみたところ
[公式ドキュメント](https://circleci.com/docs/1.0/install-and-use-yarn/)

## yarn インストール失敗 
そう簡単に行くことなく、yarn インストールが失敗。

```
$ yarn
yarn install v0.21.3
[1/4] Resolving packages...
⠁ [2/4] Fetching packages...
error laravel-mix@0.12.1: The engine "node" is incompatible with this module. Expected version ">=6.0.0".
error Found incompatible module
info Visit https://yarnpkg.com/en/docs/cli/install for documentation about this command.
```

## node のバージョンをあげてみる

`Node version: 4.2.6` でさすがに低すぎたので、
既に手元で動いていた `7.10.0` に上げてみる。 

```circle.yml
machine:
  node:
    version: 7.10.0
```

```
$ yarn
yarn install v0.21.3
[1/4] Resolving packages...
⠁ [2/4] Fetching packages...
warning fsevents@1.1.1: The platform "linux" is incompatible with this module.
info "fsevents@1.1.1" is an optional dependency and failed compatibility check. Excluding it from installation.
[3/4] Linking dependencies...
warning "eslint-plugin-vue@2.0.1" has incorrect peer dependency "eslint@^2.0.0 || ^3.0.0".
warning "eslint-plugin-react@6.10.3" has incorrect peer dependency "eslint@^2.0.0 || ^3.0.0".
[4/4] Building fresh packages...
Done in 73.65s.
```

一部 warning が出てるけど成功した。

## と思ったら PHPUnit が失敗

```
$ vendor/bin/phpunit
bash: line 1: vendor/bin/phpunit: No such file or directory
vendor/bin/phpunit returned exit code 127
```

コンテナに `ssh` してみたところ、 `vender` ディレクトリがそもそもなかった。
つまり、`composer install` されていなかったもよう。

それならと思い、明示的に `composer install` するように書いてみたら、無事に PHPUnit も実行されてビルドが成功した。

```circle.yml
dependencies:
  override:
    - composer install --no-interaction
```

なぜ `composer install` されなくなったのかは不明だが、正常にビルドできたので一旦良しとする。

## 最終的な `circle.yml`
```circle.yml
machine:
  php:
    version: 7.1.0
  node:
    version: 7.10.0
  environment:
    PATH: "${PATH}:${HOME}/${CIRCLE_PROJECT_REPONAME}/node_modules/.bin"

dependencies:
  override:
    - yarn
    - composer install --no-interaction
  cache_directories:
    - ~/.cache/yarn

test:
  override:
    - vendor/bin/phpunit
```
ROI: Region of Interest | 関心領域

ROI: Region of Interest

[監視カメラとしての利用例](https://www.qnap.com/ja-jp/how-to/tutorial/article/roi-region-of-interest-%E3%83%A2%E3%83%BC%E3%83%89%E3%82%92%E5%88%A9%E7%94%A8%E3%81%97%E3%82%AB%E3%83%A1%E3%83%A9%E3%81%AE%E8%A4%87%E6%95%B0%E3%81%AE%E3%83%95%E3%82%A9%E3%83%BC%E3%82%AB%E3%82%B9%E3%82%A8%E3%83%AA%E3%82%A2%E3%82%92%E8%87%AA%E7%94%B1%E8%87%AA%E5%9C%A8%E3%81%AB%E7%9B%A3%E8%A6%96%E3%81%99%E3%82%8B)

[白書PDF @ HIKVISION](http://oversea-download.hikvision.com/UploadFile/file/Hikvision_ROI_Encoding_Technology_V0.5.pdf)

ROI機能の利点としては何か。
http://soho-jp.com/modules/products/content0379.html
> ROI（Region Of Interest＝関心領域）とは、監視対象として重要な箇所を枠で囲いフレームレートおよび画質を高くして、重要でない箇所はフレームレートおよび画質を落とし、効率の良い録画を行うための機能です。
CKEditor のキャッシュをクリアする

WYSIWYG エディタとして、[CKEditor](http://ckeditor.com/) を使っている。

この CKEditor というのは、各種の設定に `config.js` というのを使うのだが、それを更新した際になかなか設定が反映されなかったので備忘として残しておく。

最初、ブラウザにキャッシュされてるのかなと思って、以下のようにしてけども、キャッシュはクリアされなかった。

```html
<script src="/public/common/ckeditor-4.6.2/ckeditor.js?20170619"></script>
```

ググってみると、どうやら `CKEDITOR.timestamp` という専用 API を呼ばないといけないらしい。
これでキャッシュがちゃんとクリアされ、設定が反映される。

```js
$(function() {
  CKEDITOR.timestamp = '20170619';
  CKEDITOR.replace('body');
});
```

Resource versioning とかをフレームワークとかに任せちゃってると、うっかり反映されてなかったとかあるので注意が必要。

## 参考

- https://stackoverflow.com/questions/14940452/force-ckeditor-to-refresh-config
- http://ckeditor.com/forums/CKEditor/Problem-with-config.js-not-updating
wmicコマンドでPC環境の性能情報を入手する(CPU,OS,MEMORY,DISK)

```dos:CPU
C:\Windows\system32>wmic CPU get NAME,NumberOfLogicalProcessors
Name                                             NumberOfLogicalProcessors
AMD Ryzen Threadripper 1950X 16-Core @ 3.39 GHz  32
```

```dos:OS
C:\Windows\system32>wmic os get caption,csdversion
Caption                           CSDVersion
Microsoft Windows 7 Professional  Service Pack 1
```

```dos:メモリ(Byte)
C:\Windows\system32>wmic computersystem get totalphysicalmemory
TotalPhysicalMemory
8547061760
```

```dos:指定ドライブの空き容量
C:\Windows\system32>wmic logicaldisk get deviceid,freespace | find "C:"
C:        50167795712
```
Visual Studio > Windows Forms Application > Error: System.Resources.MissingManifestResourceException: '指定されたカルチャまたはニュートラルカルチャに対して適切なリソースが見つかりませんでした。...

```txt:動作環境
Windows 7 Pro (32bit)
Microsoft Visual Studio 2017 Community
```

とあるライブラリを使うWindows Formsアプリケーションのサンプルプログラムがあった。

それを参考に新プロジェクトを作ってビルドしようとした。

以下を新規プロジェクトに上書きした。

- ライブラリのcs
- Form1.cs
- Form1.Designer.cs

namespaceを合わせてビルドすると以下のエラーが出た。

> this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));

> 例外はハンドルされていません
> System.Resources.MissingManifestResourceException: '指定されたカルチャまたはニュートラルカルチャに対して適切なリソースが見つかりませんでした。...

### 対応

Iconの指定があやしいことは分かった。
Iconをどこで設定するのか。

Form1のiconプロパティにアイコン画像を設定する。

参考: 
迫(Seko) 廣太郎さん
[Formのアイコン（Icon）を変更する](http://20100718seko.blog130.fc2.com/blog-entry-10.html)
Objective-C の中で Swift のクラスを呼び出す時、.mm ファイルではなく .m ファイルの中でないといけない

> 参考：
- [SwiftとObjective-Cの相互利用する際の注意](http://qiita.com/fmtonakai/items/d9ba99ee8c5af096dbb9)
- [import swift class in objective-c, <myModule>-Swift.h file not found](https://stackoverflow.com/questions/32098696/import-swift-class-in-objective-c-mymodule-swift-h-file-not-found)

###現象
- `Swift <- Objective-C` とクラスを使いたい場合は<br/>
`(適当な名前)-Bridging-Header.h`
- `Objective-C <- Swift` とクラスを使いたい場合は<br/>
`(初期設定プロジェクト名)-Swift.h`

を使えばいいことはわかってた（どちらも Build Setting で編集可）

が、

```objc
#import "Hoge-Swift.h" // なんか循環してるみたいなエラーがでる
```

を設定してもなんかやたらエラーがでて全く使用できない
(´・ω・\`)意味わからんなあ・・・

###原因
**`.mm`** の中で呼んでたからでした

```objc++:hoge.mm
#import "Hoge-Swift.h" // エラーいっぱい
```

```objc:hoge.m
#import "Hoge-Swift.h" // エラーでない！
```
<br/>
終わりです
.m 以外に書いたらだめということですね
<br/>
なんでかはしりません
UK(うんこ) ですね