OmniAICreator/Qiita-1.07M huggingface dataset:
【Unity】複数Inspectorウィンドウのスクロールを同期するエディター拡張

# はじめに
Inspectorウィンドウのスクロール位置を変更した時、
他のウィンドウも**同じ位置まで**スクロールさせるエディター拡張を作ってみました。

<a href = "https://gist.github.com/rngtm/f17884dbce7488dcd010c629c72c8c86">ソースコード</a>

![5.gif](https://qiita-image-store.s3.amazonaws.com/0/44288/371f72de-5629-33e9-3680-f8ed38e12782.gif)

**Unity2018.2.0f2**で動作確認済みです

# InspectorウィンドウのカスタマイズTips
## 開いている全てのインスペクタを取得する
```csharp
// InspectorウィンドウのTypeを取得
s_TypeInspectorWindow = Assembly.Load("UnityEditor.dll").GetType("UnityEditor.InspectorWindow");

// 全てのInspectorウィンドウを取得
return (EditorWindow[])Resources.FindObjectsOfTypeAll(s_TypeInspectorWindow);
```

## Inspectorウィンドウの内部実装を見る方法
Unityテクノロジーズが公開しているGitHubからInspectorウィンドウのソースコードが確認できます。

https://github.com/Unity-Technologies/UnityCsReference/blob/master/Editor/Mono/Inspector/InspectorWindow.cs

Inspectorウィンドウはクラスそのものが非公開となっているため、情報を取得したい場合は**リフレクション経由で**呼び出すことになります。

## インスペクタが表示しているオブジェクトの取得
InspectorWindowクラスの**GetInspectedObject()**メソッドを実行すると、Inspectorウィンドウが表示しているオブジェクトを取得できます。

```csharp
var k_GetFlags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance;

// GetInspectedObjectメソッドの取得
var method = s_TypeInspectorWindow.GetMethod("GetInspectedObject", k_GetFlags);

// メソッド実行してInspectorが表示するオブジェクトを取得
return method.Invoke(inspector, null); 
```
sequelize の migrationで外部キー制約を貼り付けた時の undo 時の設定

## TL;DR
`removeConstraint` だけではなく `removeIndex` も指定しよう。

### どうして？
`constraint` を導入した時に同時に `index` が張られるので、 `removeConstraint` だけすると `index` が残ってしまうため。

気になる人は具体例を[後ろの方に書いてある](#実際にやってみる)のでそちらを参照。
### 正解の記述例
```
'use strict';
module.exports = {
  up: (queryInterface, Sequelize) => {
    return [
      queryInterface.addConstraint(
        'members',
        ['group_id'],
        {
          type: 'foreign key',
          name: 'members_group_id_groups_fk',
          references: {
            table: 'groups',
            field: 'id',
          },
          onDelete: 'cascade',
        },
      ),
    ];
  },
  down: async (queryInterface, Sequelize) => {
    return [
      await queryInterface.removeConstraint('members', 'members_group_id_groups_fk'),
      await queryInterface.removeIndex('members', 'members_group_id_groups_fk'),
    ];
  }
};
```



## 実際にやってみる

### スキーマ
例えば以下のような関係のテーブルがあったとする。
![group_member.png](https://qiita-image-store.s3.amazonaws.com/0/71497/4e9d8de9-f6cd-f20c-6f59-dee7d8a4edad.png)

### up する
それぞれのテーブルは既に create されているものとして、 `members.group_id` の外部キー制約として `groups.id` を設定したい場合、 up 時の記述としては以下のようになる。

```
addConstraint(
  'members',
  ['group_id'],
  {
    type: 'foreign key',
    name: 'members_group_id_groups_fk',
    references: {
      table: 'groups',
      field: 'id',
    },
    onDelete: 'cascade',
  },
)
```

`sequelize db:migrate` 実行後に `SHOW CREATE TABLE members;` を発行すると以下のように、 contraint とさらに index　が追加されていることがわかる。

```
CREATE TABLE `members ` (
  `id` char(26) COLLATE utf8mb4_unicode_ci NOT NULL,
  `group_id` char(26) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '0',
  `name` char(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  KEY `members_group_id_groups_fk` (`group_id`),
  CONSTRAINT `members_group_id_groups_fk`
  FOREIGN KEY (`group_id`) REFERENCES `groups` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
```

### down に `removeConstraint ` だけ記述
```
removeConstraint('members', 'members_group_id_groups_fk')
```
だけ記述して `sequelize db:migrate:undo` を実行し、`SHOW CREATE TABLE members;`　を発行して確認する。

```
CREATE TABLE `members ` (
  `id` char(26) COLLATE utf8mb4_unicode_ci NOT NULL,
  `group_id` char(26) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '0',
  `name` char(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  KEY `members_group_id_groups_fk` (`group_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
```

バッチリ index が残っておりますな。

## 備考

### `addConstraint` の name は省略可
`addConstraint` で name を書かない場合、自動的に key 名が生成される。
しかしそれだと `removeConstraint` ができないので、適当なものを記述しておくと良い。
(書かずにやる方法はあるにはあるが、オススメするメリットはない)

### await と順番
`removeConstraint ` と `removeIndex` に await を指定している。
これは制約が解除されてからじゃないと index を剥がせないため。
await にするので、実行元の関数に async を指定するのを忘れずに。

### 実際にやってしまった人の対応策
残ってしまった index を手動で削除する MySQL 文は以下の通り。
`ALTER TABLE [table_name] DROP INDEX [index_name];`
Swift：NSBezierPathをCGPathに変換する

#背景
画像処理を行おうとして、NSBezierPathをCGPathに一旦変更する必要があった。
意外と日本語のリファレンスがなかったため忘備録としてまとめる。

##ソースコード（2018/7/11 Swift4対応版）
```swift:
import Cocoa

extension NSBezierPath {
    
    public var cgPath: CGPath {
        let path: CGMutablePath = CGMutablePath()
        var points = [NSPoint](repeating: NSPoint.zero, count: 3)
        for i in (0 ..< self.elementCount) {
            switch self.element(at: i, associatedPoints: &points) {
            case .moveToBezierPathElement:
                path.move(to: CGPoint(x: points[0].x, y: points[0].y))
            case .lineToBezierPathElement:
                path.addLine(to: CGPoint(x: points[0].x, y: points[0].y))
            case .curveToBezierPathElement:
                path.addCurve(to: CGPoint(x: points[2].x, y: points[2].y),
                              control1: CGPoint(x: points[0].x, y: points[0].y),
                              control2: CGPoint(x: points[1].x, y: points[1].y))
            case .closePathBezierPathElement:
                path.closeSubpath()
            }
        }
        return path
    }
    
}
```

#使い方
上のソースコードを`PathExtension.swift`など適当な名前をつけてプロジェクトファイルに突っ込めば準備OK！
あとは`NSBezierPath`のパス生成後に`path.cgPath`とすればCGPathが取得できる。

##備考
UIBezierPathも同様にできる模様
UIWebViewでユーザー選択の無効化

ユーザー選択(↓これ)を無効にしないといけない作業がありました。
条件は「UIWebViewを利用しなければならない」というもの

![mihon.png](https://qiita-image-store.s3.amazonaws.com/0/71946/f578cfe0-4733-5ebf-db76-d6131ae02385.png)

##方法１: UIWebViewにUserInteractionEnabledをfalseに設定

```
let webview = UIWebView(frame: view.frame)
webview.isUserInteractionEnabled = false
```

##方法2: JSで禁止する(検索するとよく出てくる方法)

```
let webview = UIWebView(frame: view.frame)
webview.stringByEvaluatingJavaScript(from: "document.documentElement.style.webkitUserSelect='none'")
webview.stringByEvaluatingJavaScript(from: "document.documentElement.style.webkitTouchCallout='none'")
```

##方法3: canPerformActionをオーバーライド

UIWebViewを継承したクラスを作成し、canPerformActionをオーバーライド。
ユーザー選択全て無効にするにはfalseを戻り値にする。(有効にしたいユーザー選択があればその場合だけtrueを返してやる)

```
class MyWebView: UIWebView {
    
    override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
        return false
    }
}
```
【必見】Slackでスレッドに画像を貼る方法

「Slackのスレッドに画像貼れなくて不便だな...」と思っていませんか？
どうにかして貼れないか模索していたところ、貼れました！！！！！

## 【2018/07/31 追記】
**スレッドに画像をドラッグ＆ドロップすると、画像を貼れるようになったようです！**
Slackの中の人、ありがとうございます！

以下はもう古い手順になってしまいましたが、一応残しておきますね。

## Slackでスレッドに画像を貼る手順
① いつもどおり画像をアップロード

![1_R.jpg](https://qiita-image-store.s3.amazonaws.com/0/156147/cece5c73-e69e-e035-b739-45d12f8e34e2.jpeg)

![2_R.jpg](https://qiita-image-store.s3.amazonaws.com/0/156147/372c92e5-b892-aae2-ca83-695165be4ae1.jpeg)

② メニューの**「Copy link」**を選ぶ

![3_R.JPG](https://qiita-image-store.s3.amazonaws.com/0/156147/81fc5cfd-67c0-0aa7-54ff-b53fec242fb6.jpeg)

③ そのコピーしたリンクをスレッドに貼る

![4_R.JPG](https://qiita-image-store.s3.amazonaws.com/0/156147/410cb32f-5015-b711-133c-296b37e53a4e.jpeg)

**↓↓↓↓↓ スレッドに画像を貼れました！ ↓↓↓↓↓**

![5_R.JPG](https://qiita-image-store.s3.amazonaws.com/0/156147/a1b8bc1c-586f-a247-6a6a-515c2e6bb3f1.jpeg)

## おまけ

①の画像(※)を消してもスレッドの画像は残ります。
しかし、他メンバーがスレッドの画像を拡大表示できなくなるようなのでご注意ください！(2018/7/13追記)
※スレッドではなく、メッセージでアップロードした画像のこと

![6_R.jpg](https://qiita-image-store.s3.amazonaws.com/0/156147/6564672e-b6f8-591b-cf6f-cdcd33a9a9f3.jpeg)

スレッドの画像は無事残っていますね！

![7_R.JPG](https://qiita-image-store.s3.amazonaws.com/0/156147/23446331-aac8-369d-402e-3028cd6e0ccb.jpeg)


## あとがき
チームメンバーに共有したところ、意外と反響があったので投稿してみました。
ぜひ試してみてください！
【slick.js】2週目に入る際に「.slick-center」の位置がずれるバグ

http://kenwheeler.github.io/slick/
こちらの公式サイトの「**Center Mode**」のように、
オプションで **centerMode: true;** を設定した場合のみ、真ん中の要素に「.slick-center」を付与してくれます。

…が、もしかしたら同じ現象に遭遇された方もいるかもしれませんが、
2周目に入る際にこの「.slick-center」の位置が一瞬ずれるバグがあります。

まさかとは思い、
**github** に上がっている slick.js と**公式サイト**で読み込んでいる slick.js を比較してみたところ、何やら色々と差分が・・・
※両方ともバージョン1.8.0で比較

ひとまず、公式サイトで読み込んでいる以下のファイルを使用することでバグは回避出来るようです。
http://kenwheeler.github.io/slick/slick/slick.js
MySQLの既存のデータベースの見方


# はじめに
ある時、本番環境(production)のデーターベースの中身ってどうやったら見れるんやろ？？
本番環境のテーブルは開発環境とちゃんと同じになってるんかなぁ？？
と疑問に思いました。
そこで、色々調べると、本番環境のデータベースの
基本的な見方について知らなかったなぁ・・・と思ったので、
調べてわかったことをまとめることにしました。


# 対象とする人
・MySQLの本番環境のデータベースの見方がわからない人
・プログラミング初心者だよって人

#この記事の流れ
・準備
・データベースに何があるかを見よう！
・どのデータベースを使うかを決めよう！
・テーブルに何があるかをみてみよう！
・commentsテーブルの構造をみてみよう！
・commentsテーブルの中身をみてみよう！
・まとめ

# 準備
ターミナルからec2-userとしてログインします。
「mysql -u root -p」と
入力します。
すると、パスワードを求められるので、パスワードを入力します。
その後、
[こんな画面（画像）](https://gyazo.com/ec34589114e5ff6b41e4ca93ff591fab)になりますので、
ここまで準備をしておいてください。
※ちなみに、僕のこの画像の場合は、AWSでec2インスタンスを作成して、ec2-userとしてログインしています。


では、詳しく書いていきますね〜。

# データベースに何があるかを見よう！

まずは、データベースは何があるかを見てみます。

「show databases;」と入力し、「Enterキー」を押します。
すると・・・・データベースの一覧が表示されました。

[データベース一覧（画像）](https://gyazo.com/de664aa1706c900b79d4937d3d96e87d)



information_schema
mysql
performance_schema
story2_development
story2_production
story2_text
この6つが入っていましたね。

今回は
「story2_production」
という、production環境のもの、
つまり本番環境をみていこうと思います。

# どのデータベースを使うかを決めよう！

まずは、６つあるうちのどのデータベースを使うかの指定をする必要があります。
「use story2_production;」と入力し、「Enterキー」を押します。

[データベースの指定（画像）](https://gyazo.com/f85e131fb9c047311c25d8b5181a90ca)

Database changed
と出ており、どのデータベースを使うかの選択をすることができました。
これで「story2_production」のデータベースをみていくことができます。

# テーブルは何があるかをみてみよう！

続いて、テーブルは何があるかみてみましょう。

「show tables;」と入力し、「Enterキー」を押します。

[テーブル一覧（画像）] (https://gyazo.com/81cd6e4e47f97bcdae1c3e4714c0fa8c)

7つほどテーブルがありました。
どのテーブルでも良いのですが、今回はcommentsテーブルをみてみたいと思います。

# commentsテーブルの構造をみてみよう！

では、commentsテーブルの構造（どんなカラムがあるのか等）をみていきます。

「describe comments;」と入力し、「Enterキー」を押します。

[こんな構造になっていました（画像）](https://gyazo.com/98e267c1a8ef7b89beb96f9fa9e58c9f)

カラムには何が入っているか（fieldはカラムのことです。）
データ型はint型かtext型か
といったことが書かれています。
カラムとしては
id
user_id
story_id
text
created_at
updated_at
があることがわかります。

# commentsテーブルの中身をみてみよう！

では最後に、テーブルの中身をみてみましょう。

select * from commentsと入力し「Enterキー」を入力します。

[これが中身です。。。（画像）](https://gyazo.com/23972e98f1323d0e5636f9356c6522eb)

画像の一番上の１行をみてみると
id 1
user_id 6
story_id 53
text お疲れ様です！
created_at  2018-07-02 01:07:53
updated_at  2018-07-02 01:07:53
と書かれていますね。

ふぅ〜見れた。
本番環境のcommentsテーブルにはこんなことが書いてあるんやなぁ・・・・とわかりました。
やりましたね。

見事、データベースのテーブルの中身をみることができました。

# まとめ
show databases;　←データベースは何があるかの確認をする。
↓
use story2_production;　←どのデータベースをみたいかを指定する。
↓
show tables;　←テーブルが何があるかの確認をする。
↓
describe comments; ←指定したテーブルの構造をみる。
↓
select * from comments;　←指定したテーブルの中身をみる。

こんな流れですね。
無事、本番環境のデータベースの中身やテーブルの中身をみることができました。

# というわけで・・・
お読みいただきありがとうございました。
間違い等ございましたら、ご指摘いただけると嬉しいです！
Ubuntu17にPHP7.2を入れる


# コマンド

ついでに apache2 も入れる

```bash
# PHP Install
sudo add-apt-repository -y ppa:ondrej/php
sudo apt update
sudo apt -y install php7.2 php7.2-xml php7.2-mysql php7.2-dev php7.2-fpm php7.2-mbstring apache2 zip
sudo apt -y install libapache2-mod-php7.2
```

以上
Scrapy でWebページのリンクを抽出する

Beautifulsoup で行っているのと同じことを、Scrapy でやってみました。
[Beautifulsoup でWebページのリンクを抽出する](https://qiita.com/ekzemplaro/items/a0dd7dd2bbdcf077a626)

プログラム

```py:scrapy01.py
# -*- coding: utf-8 -*-
#
#	scrapy01.py
#
#
#					Jul/11/2018
#
import scrapy

class FirstScrapySpider(scrapy.Spider):
    name = 'scrapy01'
    allowed_domains = ['ekzemplaro.org']
    start_urls = ['https://ekzemplaro.org']

    def parse(self, response):
        for unit in response.css('a::attr(href)').extract():
            print(unit)
#
```

実行結果

```text
$ scrapy runspider --loglevel=WARN scrapy01.py
en/
ekzemplaro/
audio_books/
librivox/
./audio/
http://www.hi-ho.ne.jp/linux
./raspberry/
./storytelling/
./crowdsourcing/
https://twitter.com/ekzemplaro
https://github.com/ekzemplaro/
qiita/
./test_dir/
```

Arch Linux での Scrapy のインストール方法

```bash
sudo pacman -S scrapy
```
ridgepoleで特定のテーブルを無視する

## 背景
お仕事で担当してるシステムにて、DBがもはやmigrateが通らず詰んだオワタ状態だったのでridgepoleに移行してとても幸せな日々を送っております :raising_hand: 

今回「特定のテーブルは無視したい」ケースが出てきたのでそのオプションをメモがてら。 :pencil: 

## 特定のテーブルを無視するオプション
`--ignore-tables`オプションを使って特定のテーブルを無視できます。

正規表現を使えるので、たとえば`wp_`から始まるテーブルを無視したい場合は、`--ignore-tables ^wp_`とすればOK。

オプションは複数指定できます。
`--ignore-tables ^wp_,^hoge,fuga_items`

以上です。 :raising_hand: 

## ついでによく使うコマンドのおさらい

### schemaからDBに流し込む
```sh
$ bundle exec ridgepole --config config/database.yml -E development --apply
```

#### dry-run
```sh
$ bundle exec ridgepole --config config/database.yml -E development --apply --dry-run
```

### DBからschemaを作る
`--split`でテーブルごとにファイルを分割できます。

```sh
$ bundle exec ridgepole --config config/database.yml -E development --export --output db/schemas/Schemafile --split
```

#### `wp_`からはじまるテーブルは無視してexport
```sh
$ bundle exec ridgepole --config config/database.yml -E development --export --output db/schemas/Schemafile --split --ignore-tables ^wp_
```

## 参考
- [winebarrel/ridgepole: Ridgepole is a tool to manage DB schema\. It defines DB schema using Rails DSL, and updates DB schema according to DSL\. \(like Chef/Puppet\)](https://github.com/winebarrel/ridgepole)
Short variable declarationsの挙動メモ

https://golang.org/ref/spec#Short_variable_declarations

# 再定義がNGなパターン
```bash
height := 10
height := 20
```

```bash
height, weight := 10, 5
height, weight := 20, 10
```

```bash
height := 10
height, weight := "20", 10
```
# OKなパターン
```
height := 10
height, weight := 20, 10
println(height, weight)
```

```
height1, weight := 10, 5
height2, weight := 20, 10
println(height1, height2, weight)
```

どうやら未定義の変数が存在する　かつ　再定義される変数は型が同じじゃないとだめみたい

コレも読むといい https://t.co/JcIH6RmXwF
[Rails] csvファイルからReference型を含むオブジェクト(seeds.rb)を作る

# CSVから初期データを作る
### 前提条件
* 目的のCSVは、**db/csv/foodlist.csv**とする
* **Food**モデルのオブジェクトを作成し、csvの1列目を**name**、2列目の数値に"円"を付け加えて**price**とする。

seeds.rbに以下のコードを追記することで、csvからオブジェクトを作成できる。

```seeds.rb
require "csv"

CSV.foreach('db/csv/foodlist.csv', encoding: 'Shift_JIS:UTF-8') do |row|
  Food.create(name: row[0], price: "#{row[1]} 円")
end
```

### 注意
* CSVのパスは相対パス
* UTF-8で開かないとエラーが出るので、Encodeした方が良い
* rowの部分はお好きな変数名で
* csvの1列目はrow[1]ではなくrow[0]なので注意

# Reference型を含むデータを作る
### 前提条件
* **Order**モデルオブジェクトを作成し、csvの1列目が**Foodの名前**、2列目が**num**とする。
* ただし、Orderオブジェクトに入れるのはFoodの名前ではなく、その名前を持つ**Foodオブジェクト(Reference型)**とする。
* 読み込むcsvは**db/csv/orderlist.csv**

```seeds.rb
require "csv"

CSV.foreach('db/csv/foodlist.csv', encoding: 'Shift_JIS:UTF-8') do |row|
  Food.create(name: row[0], price: "#{row[1]} 円")
end

CSV.foreach('db/csv/orderlist.csv', encoding: 'Shift_JIS:UTF-8') do |row|
  food = Food.find_by(name: row[0])
  Order.create(food: food, num: row[1])
end
```

foreachの中で1列目(row[0])の名前でhitするFoodを見つけて、**Order.create**時にそのオブジェクトを渡してあげれば問題なくデータを作成できる
【エラー】SyntaxError: unexpected ':', expecting keyword_end への対処

##背景
Rails Tutorialにてバリデーションを書き、行が多くなったため改行をしながら書いていたら、`SyntaxError: unexpected ':', expecting keyword_end` と吐かれた。プログラミングも英語も初心者で英語に至っては外人に道を聞かれてもpardon?とAre you kidding?の2語を使って説明するレベルの人間なので、何が何だかわからないモーマンタイ。

##結論
エラーメッセージ `SyntaxError: unexpected ':', expecting keyword_end` は日本語に直すと

文法エラーで、「：」は期待されてなくて、期待されてるのはキーワードエンドだよ。
つまり、キーワードの終わりは「：」じゃないよ

という意味で、

区切りにはコロン「:」ではなくカンマ「,」を入れようね。という話。

##解決法

```rb
class User < ApplicationRecord
  validates :name,  presence: true, length: { maximum: 50 }
  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
  validates :email, presence: true, length: { maximum: 255 },
                    format: { with: VALID_EMAIL_REGEX }
                    uniqueness: { case_sensitive: false }
end
```
といったコードを書いていたが、これの4行目以降、```validates:email```の```uniqueness:```の行でエラーになっていた。

英語の意味を読み解くと、`SyntaxError: unexpected ':', expecting keyword_end` は

文法エラーで、「：」は期待されてなくて、期待されてるのはキーワードエンドだよ。
つまり、キーワードの終わりは「：」じゃないよ

ということらしい。

つまり、コンピュータ上でformatの処理は本来の意図である```format: { with: VALID_EMAIL_REGEX },```でなく、```format: { with: VALID_EMAIL_REGEX }uniqueness:
```まで認識されており、これが区切り方として違うだろ！という話。

このように

```format: { with: VALID_EMAIL_REGEX },
                  uniqueness: true```

でカンマで区切るべきである。

カンマ「,」やセミコロン「:」といった区切りを入れ忘れるとこんな目に遭うよという意味で、いい教訓になったのかなと。そのように思うで候。
(ニッチ) iPhoneカメラの内部パラメーターの取得方法

#結論
ものすごくニッチなんですが、iPhoneカメラの内部パラメーターを取得する方法。
[公式ドキュメント](https://developer.apple.com/documentation/arkit/arcamera/2875730-intrinsics) がとてもわかりづらかったので。。。。

```swift
guard let currentFrame = sceneView.session.currentFrame else {
  print("Error: Current frame is nil. [\(#function)]")
  return
}

let intrinsics = currentFrame.camera.intrinsics
print(intrinsics)
//simd_float3x3([[1579.0884, 0.0, 0.0)], [0.0, 1579.0884, 0.0)], [942.4918, 712.6197, 1.0)]])
```

## 内部パラメーターについて
画像上の点をカメラからの位置情報に置き換えるためのパラメーターです。
基本的にはカメラに固有のものなんですが、焦点距離によって値が変わるので、iPhone等モバイルデバイスは使うなら毎回取得したほうが良いです。

![スライド4-1.jpg](https://qiita-image-store.s3.amazonaws.com/0/194940/3f54407b-836f-a138-db7a-e6f789fb6f59.jpeg)
引用：[内部パラメータの意味を解説してみる  | NO MORE! 車輪の再発明](https://mem-archive.com/2018/02/21/%e5%86%85%e9%83%a8%e3%83%91%e3%83%a9%e3%83%a1%e3%83%bc%e3%82%bf%e3%81%ae%e6%84%8f%e5%91%b3%e3%82%92%e8%a7%a3%e8%aa%ac%e3%81%97%e3%81%a6%e3%81%bf%e3%82%8b)



#行列のパラメーターについて （雑談）
行列のパラメーターの割り振りは、日本語だと"行""列"の順番になるイメージですが、Appleは逆なんですね。

例えばSCNMatrix4で定義される、`init(m11: Float, m12: Float, m13: Float, m14: Float, m21: Float, m22: Float, m23: Float, m24: Float,m31: Float, m32: Float, m33: Float, m34: Float,m41: Float, m42: Float, m43: Float, m44: Float)`は、パッと見 m11,m12,m13,m14が1行目にありそうです。

ですが、これは数学的には下記と同値になります。(少しはまった）

```math
\begin{matrix}
m11 & m21 & m31 & m41 \\
m12 & m22 & m32 & m42 \\
m13 & m23 & m33 & m43 \\
m14 & m24 & m34 & m44 \\
\end{matrix}
```

もしかしてこれが一般的なんでしょうか。。

#Swiftについて（雑談）
いまさらSwift触って2ヶ月なんですが、言語としては無駄が少なくわかりやすいな〜と思うものの、ドキュメントに実装例ないのは厳しくないですか、、、

内部パラメーターの件も、いろんなクラスにまたがっててすぐにわからなかったです。。。個々では載ってるのですが。



参考：[ARKitを使いつつカメラの制御がどこまでできるか調べてみた](https://qiita.com/kotetuco/items/30f4c0eeea12ac3904a8)
ホスト環境のRubyを使わずにDockerを使ってRails newする

# お題

ホスト環境のRubyを使わずにDocker上のRubyだけで、`rails new`コマンドを使って、Ruby on Railsの環境を構築します。


# 環境
- fish-shell version 3.0.1
- Docker Desktop 2.1.0.3 (38240)
- ruby 2.6.5p114 (2019-10-01 revision 67812) [x86_64-linux-musl]
- Rails 6.0.0

# 手順
## RubyのDockerイメージを取得

```sh
docker pull 2.6.5-alpine3.10
```

## Gemfileを作る

```sh
docker run --rm -v (pwd):/usr/src/myapp -w /usr/src/myapp 2.6.5-alpine3.10 bundle init
```

`Gemfile`内の`rails`の行のコメントアウトを外します。

```ruby
# frozen_string_literal: true

source "https://rubygems.org"

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

gem "rails"
```

## Dockerイメージを作る

Railsは依存ライブラリが多いのでDockerfileを作って、依存ライブラリ入りのイメージを作ります。
次の内容を`Dockerfile`として保存します。

```yaml
FROM 2.6.5-alpine3.10

ENV BUILD_PACKAGES="curl-dev ruby-dev build-base" \
    DEV_PACKAGES="zlib-dev libxml2-dev libxslt-dev tzdata yaml-dev sqlite-dev" \
    RUBY_PACKAGES="ruby-json yaml"

# Update and install base packages and nokogiri gem that requires a
# native compilation
RUN apk update && \
    apk upgrade && \
    apk add --no-cache --update\
    $BUILD_PACKAGES \
    $DEV_PACKAGES \
    $RUBY_PACKAGES && \
    mkdir -p /usr/src/myapp

# Copy the app into the working directory. This assumes your Gemfile
# is in the root directory and includes your version of Rails that you
# want to run.
WORKDIR /usr/src/myapp
COPY Gemfile /usr/src/myapp
COPY Gemfile.lock /usr/src/myapp

RUN gem install bundler
RUN bundle config build.nokogiri --use-system-libraries && \
    bundle install --jobs=4 --retry=10 --clean
```

Gemfile.lockをコピーするので、空ファイルを用意します。

```sh
touch Gemfile.lock
```

dockerイメージを作成します。


```sh
docker build -t temp .
````


## Railsをインストール

```sh
docker run --rm -v (pwd):/usr/src/myapp temp bundle
```

## Rails new
```sh
docker run --rm -v (pwd):/usr/src/myapp temp rails
```

で、`rails`コマンドのオプションの説明が表示されます。
良さげなオプションを選択します。
ここでは`-MCTBS --skip-yarn --skip-turbolinks --skip-bundle --api`を指定することにします。

```sh
docker run --rm -v (pwd):/usr/src/myapp temp rails new . -f -MCTBS --skip-yarn --skip-turbolinks --skip-bundle --api
```

## 起動確認

Gemfileを更新され、依存Gemが追加されたので、Dockerイメージを作り直します。

```sh
docker build -t temp .
```

Ruby on Railsを起動します。

```sh
docker run --rm -it -v (pwd):/usr/src/myapp -p 80:3000 temp bin/rails s -b 0.0.0.0
```

ブラウザで http://localhost/ を開きます。

![スクリーンショット 2019-10-16 16.09.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15964/3568ae95-eb1b-57f1-6aa3-dd5cb737b355.png)

が開いたら成功です！
【Android】ステータスバーを下にスワイプしてクイック設定が出たことを検出する

# はじめに

![スクリーンショット 2018-07-11 17.26.50.png](https://qiita-image-store.s3.amazonaws.com/0/264726/491b4622-c66d-48da-81fe-74ba8dcc569c.png)

上の画像のようにステータスバーを下にスワイプするとクイック設定が出る。
クイック設定が表示されたことを何とか検出できないかと色々試してみた。

# 試してダメだった方法

Activity#onTouchEvent(MotionEvent event) での検出

onTouchEventでイベントが取得できるかと思ったが画面外の為に検出はできなかった。

# 成功した方法

Activity#onWindowFocusChanged(boolean hasFocus) での検出

実装は以下のみ。

```java:MainActivity.java
public class MainActivity extends AppCompatActivity {

    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
        Log.d("MainActivity", "onWindowFocusChanged hasFocus: " + hasFocus);
    }
}
```

Logを確認すると
クイック設定が出た場合

***D/MainActivity: onWindowFocusChanged hasFocus: false***

クイック設定が閉じた場合

***D/MainActivity: onWindowFocusChanged hasFocus: true***

のような通知がログで確認できた。


# 終わりに

一応、検出はできたが
Activity#onWindowFocusChanged(boolean hasFocus)
は、今回の操作以外に色々な状況で通知が来てしまう為、この方法だけでは不十分で完全にクイック設定が出たことを検出するのは難しいかもしれない。
フォームタグの中でのenterを押しても正しく挙動しなくて困った話（Vue.js）

#環境
・google chrome バージョン: 67.0.3396.99（Official Build） （64 ビット）


#エンターキーを押してもログインできない

<p data-height="265" data-theme-id="0" data-slug-hash="xJGZjN" data-default-tab="html,result" data-user="moimoi02649370" data-embed-version="2" data-pen-title="xJGZjN" class="codepen">See the Pen <a href="https://codepen.io/moimoi02649370/pen/xJGZjN/">xJGZjN</a> by moimoi (<a href="https://codepen.io/moimoi02649370">@moimoi02649370</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
上記のよう標準的なログインフォームを作成した。

ログインボタンを押下することでログインできる。
エンターキーを押すことでもログインが出来るべきだが、
フォームに入力した文字が消えるだけでログインができない。


#formタグ内にあるbuttonタグを1つにしその他をaタグにする

<p data-height="265" data-theme-id="0" data-slug-hash="xJGZjN" data-default-tab="html,result" data-user="moimoi02649370" data-embed-version="2" data-pen-title="xJGZjN" class="codepen">See the Pen <a href="https://codepen.io/moimoi02649370/pen/xJGZjN/">xJGZjN</a> by moimoi (<a href="https://codepen.io/moimoi02649370">@moimoi02649370</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
formタグのなかにあるbuttonタグの一つをaタグに変えてみたところうまく挙動した。
ログインボタンはそのままにし、Cancelボタンをaタグに変更した。

#まとめ
おそらくbuttonタグが2つ存在することが不具合の原因であると推測される。
最尤推定が訳がわからないあなたへ

###最尤法
ある確率分布を考えるとき，データは与えられていて未知母数$\theta$の関数と見たとき尤度または尤度関数と呼び$L(\theta)$ と表します．
Lはlikelihood(尤度)の頭文字をとったものです．
この尤度関数を最大にする$\hat\theta$を$\theta$の推定値とする．すなわち

```math
L(\hat\theta)=max_\theta L(\theta)
```
となる$\hat\theta$を$\theta$とみなす．これを最尤法といいます．
そして推定された値を最尤推定値といいます．実際に求めるときは積を和の形として表すために対数尤度関数

```math
l(\theta)=log_eL(\theta)
```
の最大値を考えると便利です．最尤推定値の実現値を確率変数に置き換えたものが最尤推定量になります．

では実際に問題を解いていきます．

１問目は

![1.png](https://qiita-image-store.s3.amazonaws.com/0/33329/0ba610ed-5271-38d4-dec9-db9d88cd0ba0.png)
![2.png](https://qiita-image-store.s3.amazonaws.com/0/33329/bec79a66-2a41-0477-71a6-a990bb33578c.png)

２問目は
![3.png](https://qiita-image-store.s3.amazonaws.com/0/33329/589752f4-dead-88eb-c670-fa3fd732f2a5.png)
![4.png](https://qiita-image-store.s3.amazonaws.com/0/33329/a8e491cd-433b-7ca3-2a19-586316fc750f.png)

参考文献
[詳解演習　確率統計](https://amzn.to/2KPipjt)
MSX キーマトリクス

z88dkのz80asm/zccでMSX用のキーマトリクス表示を作る。
参考：
[MSX Datapack - キーボード・インターフェイス](
http://ngs.no.coocan.jp/doc/wiki.cgi/datapack?page=3%BE%CF+%A5%AD%A1%BC%A5%DC%A1%BC%A5%C9%A1%A6%A5%A4%A5%F3%A5%BF%A1%BC%A5%D5%A5%A7%A5%A4%A5%B9)
[MSXキーマトリクス表](http://d4.princess.ne.jp/msx/datas/keyscan.html)

- z80asm

```snsmat.asm
CHPUT   equ     $00a2
CLS     equ     $00c3
SNSMAT  equ     $0141

        org     $d000

        xor     a
        call    CLS
start:
        ld      e, 0            ; E = キーマトリクスの行(0～10)
        ld      hl, text+3
        push    hl              ; 出力先 push
.line
        ld      a, e
        call    SNSMAT
        ld      d, a            ; D = キーマトリクスの行の状態
        pop     hl
        ld      bc, 12          ; 次の行
        add     hl, bc
        push    hl
        ld      b, 8
.bits
        xor     a
        sla     d
        adc     a, $30
        ld      (hl), a
        inc     hl
        djnz    bits

        inc     e
        ld      a, 11
        cp      e
        jr      nz, line

        pop     hl              ; 出力先 pop
        ld      hl, text
        call    puts
        jr      start

puts:
        ld      a, (hl)
        or      a
        ret     z
        call    CHPUT
        inc     hl
        jr      puts

text:   defm    11
        defm    "  76543210\r\n"
        defm    "0         \r\n"
        defm    "1         \r\n"
        defm    "2         \r\n"
        defm    "3         \r\n"
        defm    "4         \r\n"
        defm    "5         \r\n"
        defm    "6         \r\n"
        defm    "7         \r\n"
        defm    "8         \r\n"
        defm    "9         \r\n"
        defm    "A         \r\n"
        defm    0
```

アセンブル
`z80asm -b snsmat`
snsmat.binファイルが作られる。

`appmake +msx -b snsmat.bin --org 0xd000`
snsmat.msxファイルが作られる。

WebMSXを起動する。
snsmat.msxファイルを[Drive A]の[+ FILES]にドロップする（Altキーを併用してもいい）
`bload"snsmat.msx",r`
と入力する。

左Altキーを押した所
![WMSX Screen.png](https://qiita-image-store.s3.amazonaws.com/0/257554/05f831b9-2894-9ac7-1d17-d6322b1cdf1c.png)

- zcc

```snsmat.c
/*
zcc +msx -lndos -create-app snsmat.c
bload"cas:",r
*/

#include <stdio.h>
#include <stdlib.h>

int snsmat(int line)
{
#asm
        ld      a, l
        call    $0141           ; SNSMAT
        ld      l, a
        ld      h, 0
#endasm
}

void main()
{
        char buf[20];

        printf("\x0c");
        for (;;) {
                printf("\x0b  76543210\n");
                for (int i = 0; i <= 10; i++) {
                        int bits = snsmat(i);
                        itoa(0x100 | bits, buf, 2);
                        printf("%X %s\n", i, buf+1);
                }
        }
}
```

[ROMカートリッジ版](http://webmsx.org/?rom=http://www.maroon.dti.ne.jp/lance/file/snsmat.rom)
WWDCの日本語字幕が欲しい人へ

WWDCの字幕は英語しかなくて辛いですよね
そんなあなたのために、WWDCの字幕をダウンロードするツールを作りました。

https://github.com/malt03/wwdc_subtitle

ひたすらダウンロードして、Google翻訳さんに翻訳してもらいましょう。

# 参考
https://github.com/PizzaLiu/WWDC_Subtitle
これを参考にして作っています。動かなかったので作り直しました。
CSS で要素をスクロールに追従させる


## はじめに
<a href='https://redine.jp/' target='_blank'>こちら</a>のサイトのイベントページのように、
ある要素をスクロールしても特定の位置に固定したい時がありました。
今までは javascript を使って実装していましたが、CSS でもできるので今回は CSS で実装します。
## 実装
```hogehoge.html.haml
#sub_colum
  追従する要素

```
```hogehoge.scss
#sub_column{
  position: -webkit-sticky;
  position: sticky;
  top: 0; // 上部 0px の位置に固定
}
```
上記コードで `#sub_column` は、要素が指定した位置まで来ると `position: fixed;` のように振る舞ってくれます。
## まとめと注意点
javascript でやるよりもずっと楽に実装できました。
しかしまだ対応していないブラウザもあるので注意が必要です。IE とか Opera Mini は対応していません(対応表は<a href='https://caniuse.com/#feat=css-sticky' target='_blank'>こちら</a>)。

ただ個人的には対応していないブラウザでは要素が追従してこないだけなので、そこまで気にしなくていいのかなーと思っています。
が、追従にならないのが気になる方は<a href='https://github.com/wilddeer/stickyfill' target='_blank'>Stickyfill</a>を使えばいけるらしいです。
ESLint をデモする Vue.js コンポーネントを作った

[![image.png](https://qiita-image-store.s3.amazonaws.com/0/72555/838f4d96-e810-8b23-1550-200d74f5d07e.png)][vue-eslint-editor]

ESLint プラグインを作って公開するときにドキュメントに組み込んでおくと、ブラウザ上で動作確認できて便利です。例えば、[eslint-plugin-es] や [eslint-plugin-eslint-comments] のドキュメントではこのコンポーネントが使われています。

例: [eslint-plugin-es/no-optional-catch-binding](https://mysticatea.github.io/eslint-plugin-es/rules/no-optional-catch-binding.html)

## 💿 インストール

[npm] 等を使ってインストールします。

```
$ npm install vue-eslint-editor
```

## 📖 使い方

`<vue-eslint-editor>` コンポーネントには `linter`, `config`, `code` の 3 つの属性を与える必要があります。

Name | Description
:----|:-----------
`linter` | 実際にリントするための [Linter] オブジェクトです。ブラウザで動作する [Linter] オブジェクトを作るためには、[eslint4b] パッケージを使うと便利です。
`config` | [Linter] オブジェクトに渡す ESLint の設定です。
`code` | エディタに表示するソースコードです。

```html:例
<template>
    <eslint-editor
        :linter="linter"
        :config="config"
        :code="code"
    />
</template>

<script>
import EslintEditor from "vue-eslint-editor"

export default {
    components: { EslintEditor },

    /* 中略 */

    async mounted() {
        // Linter は大きいので非同期で読むと良い。
        const { default: Linter } = await import("eslint4b")
        this.linter = new Linter()
    },
}
</script>

<style>
/* omitting */
</style>
```

> 完全なサンプルコードとして [eslint-playground.vue](https://github.com/mysticatea/vue-eslint-editor/blob/master/docs/.vuepress/components/eslint-playground.vue) があります。

そして、[Webpack] 等の Dynamic Imports をサポートしているバンドラを利用して下さい。
(`<vue-eslint-editor>` は、まずコードを固定文字列で表示しつつ、エディタ実装部分を非同期で読み込んでから表示し直します)

```js:例
const path = require("path")
const VueLoaderPlugin = require("vue-loader/lib/plugin")

module.exports = {
    entry: {
        index: "src/index.js",
    },
    output: {
        filename: "[name].js",
        path: path.join(__dirname, "dist"),
    },
    module: {
        rules: [
            {
                test: /\.css$/,
                use: ["style-loader", "css-loader"],
            },
            {
                test: /\.vue$/,
                loader: "vue-loader",
            },
        ],
    },
    plugins: [
        new VueLoaderPlugin(),
    ],
}
```

### VuePress で使う場合

今のところ、VuePress の SSR ビルドにはバグがある[^1]ので相対パスで利用する必要があります。

```js:例
import EslintEditor from "../../../node_modules/vue-eslint-editor"
```

## 📚 より詳しいドキュメント

[API References](https://mysticatea.github.io/vue-eslint-editor/api/) を参照下さい。

----

[Linter]: https://eslint.org/docs/developer-guide/nodejs-api#linter
[MonacoEditor]: https://microsoft.github.io/monaco-editor/
[Webpack]: https://webpack.js.org/
[eslint4b]: https://www.npmjs.com/package/eslint4b
[npm]: https://www.npmjs.com/

[eslint-plugin-es]: https://mysticatea.github.io/eslint-plugin-es/
[eslint-plugin-eslint-comments]: https://mysticatea.github.io/eslint-plugin-eslint-comments/
[vue-eslint-editor]: https://mysticatea.github.io/vue-eslint-editor/

[^1]: https://github.com/vuejs/vuepress/issues/451
【UnityEditor】現在開いている全てのEditorWindowを取得する方法

# はじめに
EditorWindowを一括取得する方法を忘れてしまったので備忘録として記事にしてみました。

# 解説
**Resources.FindObjectsOfTypeAll()**を使うと現在開いている全てのEditorWindowを取得できます。

EditorWindow.FindObjectsOfType()だとなぜか取得できません


# ソースコード
```Hoge.cs
using UnityEngine;
using UnityEditor;

public static class Hoge
{
    [MenuItem("Hoge/Show EditorWindow All")]
    static void ShowEditorWindowAll()
    {
        foreach (var window in Resources.FindObjectsOfTypeAll<EditorWindow>())
        {
            Debug.Log("Exist: " + window.GetType());
        }
    }
}
```


# 環境
Unity2018.2.0f2
自分メモ　AWSその１

# この記事の対象者
AWSでIAMユーザーを割り当てられて手順通り管理したり、
初心者用の本読んだりしたけど、イマイチ理解できていない人が
いきなりAWSのアカウントを作成して、四苦八苦しながら
検証や勉強の環境を作っているライブ配信を見たい人
＊ただし更新はリアルタイムではないので注意
＊Markdownも慣れていないので読みにくいと思うけど我慢できる人

#このページの内容
アカウントを作っていきなり戸惑ったこと。
最初にやること（IAMでサインインリンクを作成）

# AWSで何をしたかったか

１）WinServer2012を2台用意して、AD環境を作って、検証
２）Ansibleのお勉強
３）欲を出してWebサーバのお勉強

# まずは何をしたか
1.アカウントの作成
作成じたいは各種サイトに解説任せます。
まず違和感を感じるのは、ここで作成するアカウントというのは、
「AWSサービス全体に対するあなた専用の仮想環境とコンソール」のアカウントです。
アカウントを作成すると、自動的に
「全てのリージョンに対し、VPCが１つずつ、AZが２～３個、VPC内の基本的なネットワーク」
が作成されます。
また、この時点では、管理者用のサインインしかできない状態です。
AWSのトップからサインインしようとすると、＊最初は＊アカウント名（登録したメールアドレス）を入れる画面になりますが、
これは管理者（ルートユーザー）用のサインイン方法で、この方法でサインインすると自動的に
あなたのアカウントの管理者（ルートユーザー）でサインインできます。
IAMユーザーでサインインしたことのある人はここで躓くかもしれません。僕は躓きました。

ともあれ、アカウントができたので、次やることは、IAMユーザーがサインインできるサインインリンクの作成です。
コンソールからIAMを選択して、IAMユーザーのサインインリンクを見ると、謎の文字列になっていると思います。
その右にある「カスタマイズ」で、わかりやすい名前を付けましょう。
https://作成した名前.signin.aws.amazon.com/console
という、見慣れたサインインリンクが表示されると思います。
このリンクからサインインしようとすると、見慣れた、自動的にアカウントIDが記入されたサインイン画面になります。

覚えておくことは
管理者（ルートユーザー）のサインインと、ＩＡＭユーザーのサインイン方法は別ですよ、ということです。
なお、いちどIAMユーザーのサインイン画面を出してしまうと、次回以降、管理者用のサインイン画面に行きたくても、IAMユーザー用のサインイン画面になってしまいます。
（Cookie？ここら辺は詳しくないので、すみません）

Chromeを利用している人は、管理者サインインにはシークレットウィンドウを使うようにしましょう。

続きはまたいつか


### 20180713 改稿　主に用語の統一（ログイン→サインイン、など）
CentOS7上のRubyスクリプトからMS SQLserverを操作する等

#はじめに
SQLserverのバックアップ/リストア、レプリケーション処理のパフォーマンスの測定をする必要が生じたので、Rubyの強力なイテレーション機能を使用して任意のデータ作成を行うための自分メモです。

環境はVMware上のCentOS7,Ruby2.5.1から、母艦のWin機(win10）にインストールしたSQL Server 2017(14.0)への接続を行っています。

##パッケージのインストール

まずはCentOSへSQLServerに接続する為のライブラリ「freetds」をインストールします。

```
# sudo yum install freetds freetds-devel
```
#
続いてRubyからfreetdsを使用する為のgem「tiny_tds」をインストールします。

```
# sudo gem install tiny_tds
```

##接続テスト

SQLserverへのDCNを記載したスクリプトで接続可否を確かめます。
参考：https://dev.classmethod.jp/server-side/server/connect_with_sqlserver_by_tiny_tds/

接続ホスト名はお使いの環境に合わせてください。
(今回のケースでは母艦側のipconfig/allの結果とVM側からのping結果等から割り出してIPを直書きしてますが、/etc/hosts等で名前解決しても行けると思います。)

```ruby
# frozen_string_literal: true
# get_time.sql
require 'tiny_tds'
begin
  client = TinyTds::Client.new username: 'sa', password: 'password', host: '192.168.132.1'
  sql = client.escape('select @@version as str')
  result = client.execute(sql)
  result.each do |row|
    p row
  end
ensure
  client.close if client&.active?
end
```

上記スクリプトを実行するとハッシュ形式でレスポンスの取得が出来ました。

```
# ruby sql.rb
{"str"=>"Microsoft SQL Server 2017 (RTM) - 14.0.1000.169 (X64) \n\tAug 22 2017 17:04:49 \n\tCopyright (C) 2017 Microsoft Corporation\n\tDeveloper Edition (64-bit) on Windows 10 Pro 10.0 <X64> (Build 16299: )\n"}
```
##テストデータ作成スクリプト1：INSERT文での実行
とりあえず、SQLserverに接続が出来たので、INSERT文でのデータ挿入を試みました。
※処理がスタックする場合、コメントアウトされたsleep処理を有効にすると上手く動作しましたが、詳細な原因分析は出来ておりません。。

```ruby
require 'tiny_tds'
begin
  puts 'start:' + Time.now.to_s # 開始時刻出力
  # SQLserver connection
  client = TinyTds::Client.new username: 'sa', password: 'password', host: '192.168.132.1'
  insert_rec = 100000;   # ぶち込むレコード件数を定義
  1.upto(insert_rec) do |i|
    tmp ="INSERT INTO [database_name].[dbo].[table_name] (column1,column2,column3) values ('f_name_#{i}','#{'a'*fs}'0);"
    EOF
    print '*' if (i % 10)==0 # 進捗確認用
    # DML exec
    result = client.execute(tmp)
    # print sql_execute status
    result.each do |row|
      p row
    end
    tmp = ''
    # sleep(1) if (i % 3)==0  #状況により、コメントアウト解除でインターバルを設ける。
  end
  puts ''
ensure
  # close connection
  client.close if client&.active?
  puts 'end:' + Time.now.to_s  # 終了時刻出力
end
```
[Unity] Rendererのmaterialプロパティはメモリリークの原因になりうる

知らずにメモリリークをさせないために

# Material(Clone)の恐怖
Rendererに存在しているmaterial,materialsはアクセスした時点で複製が作られる
これは参照元のマテリアルのパラメータが変更されるのを防ぐため

そしてやっかいなのが、**このCloneは自動で破棄されない**

```c#
var materials = Renderer.materials;
int number = Renderer.materials.Length;
Debug.Log( Renderer.material.shader.name );
```

どんな形であっても、アクセスした時点でCloneは強制的に作られる

## 対策
### sharedMaterial,sharedMaterialsを使う
参照元のマテリアルのパラメータを直で変更する
ただし永続的に変更されるので注意が必要

### OnDestroyでしっかり破棄する

```c#
var renderer = GetComponent<Renderer>();
int length   = renderer.materials.Length;
for(int i = 0; i < length; ++i)
{
 Destroy( renderer.materials[i] );
}
```

## リークしているかを調べるには
ProfilerのMemoryにあるMaterial Countが増えていっているようならリークしてます
IBM Cloud Function で擬似システムエンティティを実装

# はじめに
Watson Assistantの英語版では、sys-preson、sys-locationという辞書定義なしに、人名と地名を取得できるシステムエンティティがあります。
日本語版でできないのかとの質問が以前からあり、Cloud Functionを使えばある程度似たものができるのではと思って試してみた結果です。

# 前提
NLUを使ったCloud Functionの仕組み[IBM Cloud FunctionからNLUを呼び出す](https://qiita.com/makaishi2/items/2640d1b3f768330c04fa)が動いていることが前提です。
簡単にいうと、この機能をWatson Assistantから呼び出しているだけということになります。

# できること
下の図を見るのがわかりやすいと思います。
裏でNLUを呼び出すことで、

```
オリックスの鈴木一郎です。名古屋から来ました。
```

という自然文から、人名に該当する部分、会社名に該当する部分、地名に該当する部分を抜き出して、返答文の中で使っています。

![スクリーンショット 2018-07-11 14.02.11.png](https://qiita-image-store.s3.amazonaws.com/0/206130/d6edbc16-7e7f-36e4-a732-33a6d493c8f3.png)

# 実装
では、実際にWatson Assistantの中でどのように定義したかを説明します。

## ダイアログ定義
Cloud Functionの機能テストなので、下の図のような超単純なフローです。
デフォルトのダイアログで「ようこそ」に下に子と孫を一つづつ足しただけです。
子と孫の条件も単純な「true」です。
子の方は「Skip user input」を有効にして、ユーザー入力を待たずに即座に孫に制御が流れるようにしています。
Cloud Function呼出しは子のノードで行い、NLU解析結果の表示を孫のノードで行っている形になります。

![スクリーンショット 2018-07-11 15.53.11.png](https://qiita-image-store.s3.amazonaws.com/0/206130/b2f3a001-1395-7ea4-7e6c-1972842afd79.png)


## JSON定義
親(ようこそ)、子、孫ぞれぞれのJSON定義は以下の通りです。

### 親
以下のような定義になっています。
context.private.my_credenyials配下のuser, passwordは、Cloud FunctionsのAPIキーです。
詳細は[Watson AssistantからIBM Cloud Functionsを呼び出す](https://qiita.com/makaishi2/items/349d366e550b37cf4521)を参考にして下さい。

```json
{
  "context": {
    "private": {
      "my_credentials": {
        "user": "xxxx",
        "password": "yyyyy"
      }
    }
  },
  "output": {
    "text": {
      "values": [
        "どなたですか。"
      ],
      "selection_policy": "sequential"
    }
  }
}
```

### 子
「actions」の項目がCloud Functionの呼出し部分です。
それぞれの項目の意味は以下の通りです。


| 項目名       | 意味 |
|:-------------------|:------------------------------------|
|name              |Cloud Functionの名前。org_nameとspace_nameは固有のものに置き換えて下さい。 |
|type              |serverで固定。|
|parameters        |cloud functionの引数。今回の例ではtextのみです。|
|credentials       |Cloud FunctionのAPI Key。|
|result_variable   |Cloud Functionの戻りをどの変数にセットするかの指定。|


```json
{
  "output": {},
  "actions": [
    {
      "name": "/<org_name>_<space_name>/nlu-service",
      "type": "server",
      "parameters": {
        "text": "<? input.text ?>"
      },
      "credentials": "$private.my_credentials",
      "result_variable": "context.result"
    }
  ]
}
```

### 孫
孫は、Cloud Function呼出しで context.result.xxx に戻された値を表示しているだけです。
JSONの内容は以下のとおりとなっています。

```json
{
  "output": {
    "text": {
      "values": [
        "$result.location の $result.company から来られた$result.person さんですね。ようこそいらっしゃいました。"
      ],
      "selection_policy": "sequential"
    }
  }
}
```

# 終わりに
NLUの精度次第というところはあるのですが、ある程度sys-preson, sys-locationっぽいものはできたと思います。実装を見ていただければ分かるようにNLUで認識可能なエンティティなら、同じ方式でWatson Assistantの中で扱うことが可能です。
また、まだ試してはいないのですが、応用問題でNLU - Watson Knoledge Studio連携も行えば、Knowledge Studioのカスタム機械学習モデルで認識したEntiryも同じようにWatson Assistantから使うことができると思います。
TortoiseGitで--allow-unrelated-histories を指定したい

rejectエラーが出た時の--allow-unrelated-historiesオプションの指定ですが、CLIでのコマンドは書かれているものの、Tortoise Gitではどう指定すればよいの？というお話。

#--allow-unrelated-histories
下記の記事が参考になりますが、マージする時に異なるツリーからマージしたい場合(Subtreeなど）に発生することが多いです。
https://qiita.com/takanatsu/items/fc89de9bd11148da1438

そういった場合に、--allow-unrelated-historiesを指定しろと口酸っぱく書かれていますが、TortoiseGitにはそんなオプションが存在しません。

#で、結論
本来パスを指定する下記の赤枠部分に書いてしまえばOK。
`root/function --allow-unrelated-histories`てな具合に。（パスの後のスペース忘れずに）

![flame.png](https://qiita-image-store.s3.amazonaws.com/0/267148/302ae47c-7460-bbeb-e4c0-26397906eb17.png)

これでマージかければ--allow-unrelated-historiesが指定可能です。

#実はこんな方法も
下記のRejectエラーが出た時に、左下の"Merge unrelated history"ボタンを押しても同じ解決方法です。元々コマンドめんどい方の記事なので、こっちの方が楽かも。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/267148/ce8028c8-4fae-4181-4e90-f26891dadce2.png)
Laravelで未来 or 過去のレコードの取得方法

## やりたいこと

期限を設定出来る機能を実装し、`limited_at`というカラムに未来の日付を登録していたとします。
やりたいこととしては、`limited_at`が現在よりも未来に設定しているレコードだけを取得する。

```php
$items = Item::where('limited_at', '>', date('Y-m-d H:i:s'))->get();
```

で取得が出来ます。
個人学習メモ#4 Jquery　基礎

$('セレクタ').css('プロパティ','値');

複数プロパティがある場合

$('セレクタ').css({
'プロパティ':'値',
'プロパティ':'値',
'プロパティ':'値'
});

イベントタイプ一覧
$('セレクタ').on('イベントタイプ','イベントハンドラ')

・mouseover
（マウスが乗った時）

・mouseout
（マウスが離れた時）

・mousedown
（クリックボタンが押された時）

・mouseup
（クリックボタンが離れた時）

・mousemove
（マウスが動かされた時）

・click
（クリックされた時）

・dblclick
（ダブルクリックされた時）

・keydown
（要素にフォーカスした状態で、キーボードのキーが押された時）

・keyup
（要素にフォーカスした状態で、キーボードのキーが離された時）

・focus
（フォーカスが当たった時）

・blur
（フォーカスが外れた時）

・change
（入力内容が変更された時 textarea,input,selectなど）

・resize
（リサイズされた時）

・scroll
（スクロールされた時）
ps | grep でヘッダ行を出す

psコマンドを使うとき、ヘッダ行をみたことがないな…と思ったら、いつもgrep hogeをパイプラインしていたからだということに、今更ながら気づきました。
（ps auxだけだと、ズラーッと流れて見てなかった）

```
ps aux|grep -E "USER|hogehoge"
```

みたいな感じで、正規表現使えばいいんですね。
メモ：rails/slimでgoogle mapにlink_toする書き方

# この記事は

個人メモです

# やりたいこと

* ViewにslimつかったRailsからlink_toでgoogle mapの[Maps URLs](https://developers.google.com/maps/documentation/urls/guide)を開きたかったです
* これ使うと、いろんなスマホからいい感じにGoogleMapsアプリ開いたりブラウザ内地図開いたりできます

# やってみると

* ふつうこうかきますよね

```
= link_to '地図アプリで開く', "https://www.google.com/maps/search/?api=1&query=#{latitude}%2C#{longitude}", class: 'button'
```

* こうすると、GETパラメータを示す ```?``` がエスケープされて、 ```&amp;``` になってしまいます
* これがPCからならブラウザが適当に解釈してくれて大丈夫なんですが、スマホからGoogleMapsアプリへの橋渡しみたいなことをやると「サポートされていないリンク」とかいうエラーがでて使えないです

# で、

* こんな感じで ```html_safe``` ってつけるとうまく行きましたっていう

```
= link_to '地図アプリで開く', "https://www.google.com/maps/search/?api=1&query=#{latitude}%2C#{longitude}".html_safe, class: 'button'
```

* ちなみに```#{{xxx}}```とか```==```みたいな書き方は```link_to```とはうまくいかない

# 終わりに

* やっぱ、slimだpugだってテンプレートエンジンは好きになれない。。
create-react-appでの素振り時にparcelに切り替えてしてTypeScript化する

create-react-appでtypescript使って素振りしたくなったとき、parcelに即切り替えるのアリなのでは、と思ったのでまとめる。

今回は例示としてはじめから作ってるが、create-react-appで始めたものの、途中でTypeScriptにしたくなったときにも手順はそれほど変わらないはず。

# 手順
## とりあえず作る
```
$ npx create-react-app example-app
```

## parcelを入れる。あとTypeScriptも

```
$ yarn add parcel-bundler parcel-plugin-typescript typescript
```

parcel標準でcssやらhtmlやらだいたいよしなにしてくれるが、typescriptだけpluginいるので入れる。
pluginはpackage.jsonに入っているものは強制で全部読み込まれるので、installするだけで良い
`parcel-plugin-typescript`はお行儀よくtypescriptを`peerDependency`にしてるので、それに従う

あとはreactあたりは型定義を入れとくと良いだろう

```
$ yarn add @types/react
```

もし、TypeScriptが不要という場合は下記の記事が参考になるだろう
https://qiita.com/MegaBlackLabel/items/5d5592d624bc5f8a341d

## tsconfigを設定

tsconfigの雛形を作成

```
$ yarn tsc --init
```

jsxだけ最低限設定。あとはお好みで

```json
"jsx": "react"
```

## package.jsonを書き換える

もともとこうなってるのを

```json
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
```

こうじゃ！

```json
  "scripts": {
    "start": "parcel serve public/index.html",
    "build": "parcel build public/index.html",
   }
```

## index.htmlいじる。

ヘッダ部分の`%PUBLIC_URL%`がパースコケるので消す。parcelだと相対パスにしとけば普通にバンドルしてくれる

```html
<!-- 
  <link rel="manifest" href="%PUBLIC_URL%/manifest.json">
  <link rel="shortcut icon" href="%PUBLIC_URL%/favicon.ico">
-->

<link rel="manifest" href="./manifest.json">
<link rel="shortcut icon" href="./favicon.ico">

```

javascriptの読み込み部分も追加。相対パスで指定してやるといい感じにやってくれる

```html
  <!-- ↓追加-->
  <script src="../src/index.js"></script>
</body>
```

## gitignore設定

```.gitignore
# parcel
/.cache
/dist
```

## App.js -> App.tsx

ファイル名変更

```
$ mv src/App.js src/App.tsx
```

あとsvgファイルが型定義無くでコケるのめんどいのでts-ignore

```ts
// @ts-ignore
import logo from "./logo.svg";
```

べつにlogo周り使わないだろうし消してもいいと思う。

css周りは何もせずに動く


## start!

```
$ yarn start
```

これで動く。

## ビルドするとき

```
$ yarn build
```
でOK。netlifyにもすぐ上げられるはず。

# なんかおかしいとき

parcelは結構キャッシュをがっつり持つっぽいので、cacheと出力先ファイルを消すと良い

```
$ rm .cache
$ rm dist/
```

`--no-cache`オプションでキャッシュさせないというのもアリ

```
$ yarn start --no-cache
```
AndroidStudio Use same device for future launches解除

AndroidStudio
Use same device for future launches 解除
今後の起動で同じデバイスを使用する

[Run] - [Edit Configulations]
[実行] - [構成の編集]

表示されたダイアログの、[Deployment Target Options]項目の
Use same device for future launchesのチェックボックスをオフにする。

![名称未設定-1.png](https://qiita-image-store.s3.amazonaws.com/0/99276/eae40554-4b7e-e1ef-bc56-0121338f4125.png)
UITableViewでself-sizing（UITableViewAutomaticDimension）使ってるとき、cellにUIImageViewを入れるとAutoLayoutのエラーが出ることがある

# 事象

こんな感じで
![image.png](https://qiita-image-store.s3.amazonaws.com/0/48695/75971039-bed4-80cd-3fd4-b7eb8718f051.png)

```
V:|-10-画像（高さ30)-10-|
```
のような制約を貼っていて、さらにself-sizingを利用してるとなぜかAutoLayoutのエラーとなって怒られた
見た目上は影響ないけど制約が不整合となってrecoveryが走る

# 解決策

![image.png](https://qiita-image-store.s3.amazonaws.com/0/48695/76e44379-8278-d465-a891-e389247d63ea.png)

画像のbottom spaceのpriorityを1000 → 900 にしたら怒られなくなった

原因は不明


# 参考

https://stackoverflow.com/questions/28572319/autolayout-constraints-warning-will-attempt-to-recover-by-breaking-constraint
Laravel Mixで Laravel + React + BrowserSyncで今風のWeb環境をラクラク構築

# 背景
仕事でサーバサイドをlaravel、フロントサイドをReactでやろうということになりました。
Reactってbabelとかwebpackとかごちゃごちゃしている物でいっぱいで皆結構嫌になりません？
create-react-app：https://github.com/facebook/create-react-app
とか使うと、簡単なセットアップができるらしいですが、自前でやると

- gulp

- webpack

- babel

- BrowserSync

など、開発する前に色んな設定をしなければならんので大変でした。

# 結論
laravelの5.4以降ではデフォルトでLaravel Mixという、reactとかvueとかを編集して保存すると自動コンパイルする機能があるのでそれを活用すれば簡単にReactとlaravelの環境設定ができます。

# 具体例
編集するファイルはプロジェクト直下にある**webpack.config.js**のみです。
デフォルトでは以下のようになってると思います。

```php
let mix = require('laravel-mix');

mix.js('resources/assets/js/app.js', 'public/js')
   .sass('resources/assets/sass/app.scss', 'public/css');
```

# 解決

今回はreactのトランスパイルとブラウザのリロードを自動化したいので以下のように書き換えました。

```php
let mix = require('laravel-mix');

mix.react('resources/assets/js/', 'public/dist/bundle.js') //第一引数以下のreactファイルを第二引数のファイルにトランスパイル
   .sourceMap() //マップファイル作成
   .browserSync({
     files: 'resources/assets/js/**/*', // このパスにあるファイルが変更されたらリロード
     proxy: 'localhost:8000' // php artisan serveで起動したサービスのドメイン
   })
```
## 実行方法
- サーバーを起動 : `php artisan serve`

- これを実行してファイル監視 & リロード : `npm run watch` 

以上で、Reactを編集すると自動で変換してリロードすることができます。
sassなども同じく変換することができるので、詳しくはLaravelの[公式](https://readouble.com/laravel/5.5/ja/mix.html)を見ればいいと思います。
## `npm run watch`でエラーが起きた場合
私の環境では**package.json**内の**webpack**のバージョンが**4.1.0**だったため次のようなエラーが起きました。
`10% building modules 7/9 modules 2 active …toring/resources/assets/js/bootstrap.jsTypeError: dep.getResourceIdentifier is not a function`
どうやらwebpackモジュールのバージョンを下げないといけない見たいなので、[ここ](https://github.com/webpack/webpack/issues/6675)参照して**3.11.0**に戻しました。
`npm i -D webpack@3.11.0`
これで、上記のエラーは消えました。

# 感想
環境構築するって結構調べることあって大変、まあ公式もたまには見るの大事。
Ionicでbarcodeを生成する

#Ionicでbarcodeを生成する方法です
とりあえず、blankで作成して、homeページにバーコードを表示してみます。
完成イメージ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/56728/a245e7b9-d215-cd13-9c80-bc778c722db1.png)

##プロジェクト作成
今回はbarcode-tutorialというプロジェクト名にしました。

```
ionic start barcode-tutorial blank
```

## JsBarcodeのインストール

```
cd barcode-tutorial
npm install jsbarcode --save
```

##プロジェクトにインポート
```import JsBarcode from 'jsbarcode';```を追加して、ページがロードされたときに呼ばれるionViewDidLoad（）で描画するようにします。

```home.ts
import { Component } from '@angular/core';
import { NavController } from 'ionic-angular';
import JsBarcode from 'jsbarcode';

@Component({
  selector: 'page-home',
  templateUrl: 'home.html'
})
export class HomePage {

  constructor(public navCtrl: NavController) {

  }

  ionViewDidLoad(){
    JsBarcode("#barcode","12345");
  }
}
```

##svgで表示
```<svg id = "barcode"></svg>```を追加するだけです。

```home.html
<ion-header>
  <ion-navbar>
    <ion-title>
      Ionic Blank
    </ion-title>
  </ion-navbar>
</ion-header>

<ion-content padding>
  The world is your oyster.
  <p>
    If you get lost, the <a href="http://ionicframework.com/docs/v2">docs</a> will be your guide.
  </p>
  <svg id = "barcode"></svg>
</ion-content>
```

##オプション
バーコードの種類やサイズの変更の書き方はこんな感じです。
詳しい使い方などは[ここ](https://www.npmjs.com/package/jsbarcode)に書いてあります。

```home.ts
  ionViewDidLoad(){
    JsBarcode("#barcode")
    .options({font:"OCR-B"})
    .CODE128("1234567890128",{fontSize:10,textMargin:0,height:50})
    .render();
  }
```
request-promise KEEPALIVEで接続を維持したい

接続にかかる時間を短縮するためや接続しづらさを解消するために接続を維持したまま続けてリクエストをしたい場合がある。

request-promiseはkeepalive接続に対応している
オプションにforeverという項目があるのでこれをtrueにすると接続が維持されるようになる

以下はそのサンプルである


```
const rp = require('request-promise')
const get = async() => {
    const uri = "http://example.com"
    const opt = {
        uri : uri,
        method: "GET",
        timeout: 10 * 1000,
        forever: true,
    }
    const result = { success: null, error: null, time: 0 }
    const begintime = process.uptime()
    try{
        result.success = await rp(opt)
    }catch(e){
        result.error = e
    }
    const endtime = process.uptime()
    result.time = endtime - begintime
    return result
}

const main = async() => {
    for(let i=0; i<5; ++i) await get().then(console.log)
}

main()
```