OmniAICreator/Qiita-1.07M huggingface dataset:
Railsアプリからnet/httpsでリクエストを投げる


# 環境
- Ruby 2.5.0
- Rails 5.1.4


# ファイル構成
ModelからAPIにリクエストを投げて、データを取得するような構成にしました。

```
- app/
  |- controlers/
    |- xxx_controller.rb
  |- models/
    |- Api
      |- xxx.rb
```

# モデルの実装
クラスメソッドfindは、headerとクエリパラメータを引数とします。

そしてエンドポイントに対して、headerとクエリパラメータを投げ、json形式でレスポンスを受け取ります。

```ruby:xxx.rb
require 'net/https'
require 'uri'

class Api::Xxx

  class << self

    def find(header, params)
      res = self.fetch ('https://example,com',
                        header,
                        params)
      JSON.parse(res.body, symbolize_names: true)
    end

    def fetch(url, headers, params)
      uri = URI.parse url
  
      http = Net::HTTP.new uri.host, uri.port
      http.use_ssl = true if uri.scheme == 'https'

      req = Net::HTTP::Get.new uri.request_uri

      req["Content-Type"] = 'application/json'
      headers.each do |k,v|
        req[k] = v
      end
      req.body = params.to_json

      http.request req
    end
  end
end
```

# コントローラの実装
headerとクエリパラメータを引数として、json形式で取得しています。

```ruby:xxx_controller.rb

class XxxController < ApplicationController
  def hoge
    result = Api::Xxx.find(header, params)
    # (省略)
  end

  private
    def header
      { 'Accept-Language' => "ja" }
    end

    def params
      { 'hoge' => "test" }
    end

end

```


# 参考リンク
https://altarf.net/computer/ruby/2890
[Unity]An exception was thrown by the type initializer for Google.VersionHandler

Unityで広告を実装してて引っかかったこと。

GoogleAdMob、Unity Adsをインポートしてあるプロジェクトに
さらにAdColonyをインポートしてシーンをプレビューするとエラーが発生。

>Rethrow as TypeInitializationException: An exception was thrown by the type initializer for Google.VersionHandler

AdColny内のスクリプトで、PlayServiceResolverを取得してるとこで落ちている模様。
落ちてるとこ↓

>Type playServicesSupport = Google.VersionHandler.FindClass("Google.JarResolver", "Google.JarResolver.PlayServicesSupport");

Resolve Client Jarsを実行してみるも反応なし。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/147857/9b5701b1-3fee-caab-febf-16ed695f98da.png)

ググってるとUnityフォーラムで以下の質疑を発見。
https://answers.unity.com/questions/1425066/error-systemformatexception-int64parse-input-strin.html

後からインポートしたアセットによって
PlayServiceResolcerが破損することがあるらしい。

PlayServiceResolverフォルダをいったん削除後、
PlayServiceResolverをインポートしなおすとエラーは出なくなった。

PlayServiceResolverはここから↓
https://github.com/googlesamples/unity-jar-resolver
scpでディレクトリ転送時の'/'の有無による挙動の違い

scpでディレクトリをコピーするときに、転送元のパスに'/'をつけるかどうかとリモートから転送する場合かどうかで挙動が変わる。

# 元の状態

```shell-session
$ tree
.
├── d1
│   └── f1
└── d2
```

# '/'をつけずにローカルコピー

```shell-session
$ scp -r d1 d2
$ tree .
.
├── d1
│   └── f1
└── d2
    └── d1
        └── f1
```

d1がd2の下にコピーされる

# '/'をつけてローカルコピー

```shell-session
$ scp -r d1/ d2
$ tree .
.
├── d1
│   └── f1
└── d2
    └── f1
```

d1の「中身」がd2の下にコピーされる

# '/'をつけずにリモートから転送

```shell-session
$ scp -r localhost:~/test/d1 d2
f1                                                     100%    0     0.0KB/s   00:00
$ tree .
.
├── d1
│   └── f1
└── d2
    └── d1
        └── f1
```

d1がd2の下にコピーされる

# '/'をつけてリモートから転送

```shell-session
$ scp -r localhost:~/test/d1/ d2
f1                                                    100%    0     0.0KB/s   00:00
$ tree .
.
├── d1
│   └── f1
└── d2
    └── d1
        └── f1
```

**末尾に'/'があるのにd1がd2配下にコピーされる！**

ちなみにrsyncだとこのような挙動にはならず、末尾に'/'があればディレクトリの中身がコピーされる。
float3をCodableに対応させる(Swift4)

## はじめに
Swift4からCodableを使ってJsonを簡単に扱えるようになりました。
ゲームのマルチプレイを実装する上で、float3をJsonで送る必要がありました。
そこで、float3をCodableに対応させました。

## Codableに対応させるということ
Codableに対応させるためには、Encodableプロトコルと、Decodableプロトコルに対応させる必要があります。

## 実装方法
Encodable, Decodableプロトコルに対応させるためにContainerに入れるのですが、KeyedContainer, SingleValueContainer, UnkeyedContainerの３つがあります。

## Jsonをエンコード、デコードするコード
JSONEncoderとJSONDecoderを使ってCodableに対応したJsonに変換します。

```swift
        struct Message: Codable {
            var result: Bool
            var position: float3
        }
        do {
            let msg = Message(result: true, position: float3(1.2, 3.4, -5.1))
            
            let data = try JSONEncoder().encode(msg)
            let jsonString = String(data: data, encoding: .utf8)
            print("string : ", jsonString!)
            
            let msg2 = try JSONDecoder().decode(Message.self, from: data)
            print("Message : ", msg2)
            
        } catch {
            print("err json")
        }
```

### KeyedContainer
キー値を使ってデータを保存

```swift
extension float3: Codable {
    private enum ElementKeys:String, CodingKey {
        case x, y, z
    }
    public func encode(to encoder: Encoder) throws {
        var container = encoder.container(keyedBy: ElementKeys.self)
        try container.encode(x, forKey: .x)
        try container.encode(y, forKey: .y)
        try container.encode(z, forKey: .z)
    }
    public init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: ElementKeys.self)
        let _x = try container.decode(Float.self, forKey: .x)
        let _y = try container.decode(Float.self, forKey: .y)
        let _z = try container.decode(Float.self, forKey: .z)
        self.init(_x, _y, _z)
    }
}
```
jsonに出力した結果↓

```json
{"result":true,"position":{"x":1.2000000476837158,"y":3.4000000953674316,"z":3.4000000953674316}}
```


### SingleValueContainer
１つのデータを送りる

```swift
extension float3: Codable {
    public func encode(to encoder: Encoder) throws {
        var container = encoder.singleValueContainer()
        try container.encode(x)
    }
    public init(from decoder: Decoder) throws {
        let container = try decoder.singleValueContainer()
        let _x = try container.decode(Float.self)
        self.init(_x, 0.0, 0.0)
    }
}
```
jsonに出力した結果↓

```json
{"result":true,"position":1.2000000476837158}
```

### UnkeyedContainer
配列形式のデータになる

```swift
extension float3: Codable {
    public func encode(to encoder: Encoder) throws {
        var container = encoder.unkeyedContainer()
        for v in self {
            try container.encode(v)
        }
    }
    public init(from decoder: Decoder) throws {
        var arr = [Float]()
        var unkeyedContainer = try decoder.unkeyedContainer()
        while !unkeyedContainer.isAtEnd {
            arr.append(try unkeyedContainer.decode(Float.self))
        }
        self.init(arr)
    }
}
```
jsonに出力した結果↓

```json
{"result":true,"position":[1.2000000476837158,3.4000000953674316,-5.0999999046325684]}
```

## 終わりに
Codableは簡単にJsonにエンコード、デコードできるので便利です。
Rails join table: Ultimate tutorial

This is a complete tutorial for creating join table in Ruby on Rails. It will show you how to **generate the model**, **address associations** and **join table model**. Also, it will show you how to write a form with multiple select boxes and how to handle it in the controller.

First, let's create join table in Rails way, with the city and the cleaner as references.

`rails g model Assignment city:references cleaner:references`

This will create the migration:

`create_assignments.rb
class CreateAssignments < ActiveRecord::Migration
  def change
    create_table :assignments do |t|
      t.references :city, index: true, foreign_key: true
      t.references :cleaner, index: true, foreign_key: true
      t.timestamps null: false
    end
  end
end`

## cleaner.rb

`class Cleaner < ActiveRecord::Base
  has_many :assignments
  has_many :cities, through: :assignments
end`

## city.rb

`class City < ActiveRecord::Base
  has_many :assignments
  has_many :cleaners, :through => :assignments
end`

## assignment.rb

`class Assignment < ActiveRecord::Base
  belongs_to :city
  belongs_to :cleaner
end`

## cleaners_controller.rb

`private

def cleaner_params
  params.require(:cleaner).permit(city_ids: [])
end`

## _form.html.erb Select multiple form

`<%= form_for(@cleaner) do |f| %>
  <p>
    <%= f.label :cities %><br />
    <% for city in City.all %>
      <%= check_box_tag "cleaner[city_ids][]", city.id, @cleaner.cities.include?(city) %>
      <%=h city.name %><br />
    <% end %>
  </p>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>`

*Hope you find this tutorial helpful!*

 Originally posted at [kolosek.com](https://kolosek.com/rails-join-table/).
:=構文を理解していなかったのでメモ

# はじめに

`:=`構文の挙動についてちゃんと理解してなかったのでメモ。

# `:=`構文とは

declare-and-initialze（宣言して初期化）してくれる構文。
「宣言」してくれるので同じ変数に対して複数回`:=`を使うと、エラーがでる。

```go
package main

import "fmt"

func main() {
    x := "hello"
    x := "goodbye"
    fmt.Println(x)
}
```

```bash
$ go run hoge.go          
# command-line-arguments
./hoge.go:7:4: no new variables on left side of :=
```

# だとおもっていたが...

エラーからわかる通り新しい変数が左辺にないから怒られているだけ。左辺に複数の変数があって、そのうちの少なくとも1つが一度も宣言されていなければエラーは出ない。

```go
package main

import "fmt"

func hoge() (int, bool) {
        return 1, true
}

func main() {
        int1, ok := hoge()
        int2, ok := hoge()
        fmt.Println(int1)
        fmt.Println(int2)
        fmt.Println(ok)
}

```

```bash
$ go run hoge.go
1
1
true
```

# おわりに
基本は大事
ネストされたオブジェクトをドット記法の文字列で探索したい

うまく言葉に現すことが難しいのでまずはこんなコードを想定してみてください。

```javascript
const projectKey = 'project.name'

const state = {
    project: {
        name: 'Qiita' // この値を変数 projectKey により導きたい
    },
    user: {
        name: 'tksmrkm'
    }
}
```

state.project.nameを参照したいですが、キーは変数によって外部から注入されるため、場合によっては`user.name`が与えられる場合もあり、そのときはtksmrkmを求めたい。

ここまで専門用語らしきものが出てこないあたりから筆者のレベルはお察しですが、それゆえ上手な検索が出来ていないためもっとまともなメソッドが用意されているかもしれないのですが、ひとまずつくってみました。

```javascript
const findByDotCase = (target, key) => {
    return key.split('.').reduce((prev, current) => {
        if (prev[current]) {
            return prev[current]
        }

        throw new Error(`Not found ${current}`)
    }, target)
}

console.log(findByDotCase(state, projectKey)) // Qiita
```

もっと深くても大丈夫

```javascript
const deepNestedObject = {
    it: {
        is: {
            my: {
                first: {
                    kiss: 'chu♥'
                }
            }
        }
    },
    kiss: {
        with: 'you'
    }
}

console.log(findByDotCase(deepNestedObject, 'it.is.my.first.kiss')) // chu♥
```

末端である必要もない

```javascript
console.log(findByDotCase(deepNestedObject, 'it.is.my')) // { first: { kiss: 'chu♥' } }
```

最後までお読みいただきありがとうございました。もし誰かの役に立ったり、改善案だったり、標準メソッドあるよって意見が出てきたりしたら感涙です。
CodeIQ の「迷路」問題の僕の回答

[CodeIQ の迷路問題] (http://codeiq.jp/q/3528 ) の僕の回答。


sqlite3 に node と edge のテーブル作ってグラフの最短経路問題として解いています。
超スタンダードな解き方。

```
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sqlite3


def main():
    try:
        conn = sqlite3.connect(':memory:')
        # conn = sqlite3.connect('testDB')
        strSQL = '''
CREATE TABLE node(
    node TEXT CONSTRAINT pk_node PRIMARY KEY
    , dist integer);
--WITH N(n) AS (
--        SELECT UNICODE('0')
--        UNION ALL SELECT n + 1 FROM N WHERE n < UNICODE('9'))
--    INSERT INTO node(node) SELECT char(n) FROM N;
--WITH N(n) as (
--        SELECT UNICODE('A')
--        UNION ALL SELECT n + 1 FROM N WHERE n < UNICODE('Z'))
--    INSERT INTO node(node) SELECT char(n) FROM N;
CREATE TABLE edge(
    node1 TEXT
    , node2 TEXT
    , CONSTRAINT pk_edge PRIMARY KEY(
        node1
        , node2));
INSERT INTO edge
    VALUES
        ('0','6')
        , ('1','2')
        , ('2','3')
        , ('2','8')
        , ('3','4')
        , ('4','5')
        , ('4','A')
        , ('6','7')
        , ('7','8')
        , ('9','A')
        , ('9','F')
        , ('A','G')
        , ('B','H')
        , ('C','D')
        , ('D','J')
        , ('E','K')
        , ('H','N')
        , ('I','J')
        , ('I','O')
        , ('J','K')
        , ('J','P')
        , ('K','L')
        , ('M','N')
        , ('M','S')
        , ('N','T')
        , ('O','U')
        , ('Q','R')
        , ('Q','W')
        , ('R','S')
        , ('T','Z')
        , ('U','V')
        , ('V','W')
        , ('X','Y')
        , ('Y','Z')
        ;
INSERT INTO edge(node1, node2)
    SELECT
            node2, node1
        FROM
            edge
        --WHERE
        --    node1 < node2
        ;
'''
        conn.executescript(strSQL)
        strInput = input()
        opengate = strInput[0]
        strStart = strInput[1]
        strend = strInput[2]
        strSQL = '''
INSERT INTO edge VALUES (:node1,:node2),(:node2,:node1)
'''
        if opengate == 'a':
            conn.execute(strSQL, {'node1': '7', 'node2': 'D'})
        elif opengate == 'b':
            conn.execute(strSQL, {'node1': 'E', 'node2': 'F'})
        elif opengate == 'c':
            conn.execute(strSQL, {'node1': 'G', 'node2': 'M'})
        elif opengate == 'd':
            conn.execute(strSQL, {'node1': 'A', 'node2': 'B'})
        strSQL = '''
INSERT INTO node VALUES(?, 0);
'''
        conn.execute(strSQL, (strStart,))
        strSQL_AddNode = '''
INSERT INTO node
    SELECT
        node2, nS.dist + 1
    FROM
        edge
        INNER JOIN node nS
        ON edge.node1 = nS.node
        LEFT OUTER JOIN node nE
        ON edge.node2 = nE.node
    WHERE
        nE.node is null;
'''
        strSQL_GetDistance = '''
    SELECT
            dist
        FROM
            node
        WHERE
            node.node = ?
'''
        cur = conn.cursor()
        while(True):
            conn.execute(strSQL_AddNode)
            rows = cur.execute(strSQL_GetDistance, (strend,)).fetchall()
            if len(rows) > 0:
                break
        print(rows[0][0])
    finally:
        # conn.commit()
        conn.close()


if __name__ == '__main__':
    main()

```
初めてのＳＱＬ(Learning SQL)を読んだまとめ 1

# はじめに
独習PHPが終わったので次はSQL。ついでに初オライリー。
## 今まで

毎日就業前に一時間程度技術書を読み、読み終えてから付箋貼っておいたところを見返してまとめる

## これから

毎日就業前に一時間程度技術書を読み、その日の夜に前日読んだ部分をまとめる

## 気づき
この方法であれば多少内容が薄くても毎週投稿は叶うはずだし、忘却曲線的にも理に適っているはず…!  
あと本のとおりにやってるのに、うまくいかない…っていう時が一番学習になっている気がする

# まとめ

## 非リレーショナルデータベース
最近はNoSQLとも呼ばれているらしい。
すごく綺麗にまとめているところがあったので[参照](https://qiita.com/t_nakayama0714/items/0ff7644666f0122cfba1)  
要するに、RDBMSではトランザクション管理のためにデータをストレージを共有する必要があるため、スケールアウトが難しいこと、柔軟さの代償として複雑な処理を与えてしまいがちなことから、パフォーマンス的に新しい物を求める動きが出てきたということでしょうか。  
RDBMSの起源は1970年のIBM研究所から発表された論文、Oracleの発売から考えても40年以上が経過しているわけで、備えあれば嬉しいなの精神で

## 制約(CONSTRAINT)
PRIMARY_KEYやNOT_NULLみたいに、カラムに格納する値に制限をつけておくことができる  
ちょっと大変だなと思ったのはFOREIGN_KEYで、

```sql
CREATE TABLE favorite_food
(person_id SMALLINT UNSIGNED,
food VARCHAR(20),
CONSTRAINT pk_favorite_food PRIMARY_KEY (person_id, food),
CONSTRAINT fk_person_id FOREGINKEY (person_id)
REFERENCES person (person_id)
)
```

FOREIGNKEY (列) REFERENCES 親テーブル(列)で指定して、親テーブルの列に存在しない値が子テーブルの列に格納されないようになるんだけども、これをしてしまうと親テーブルの列が削除できなくなったりして意外と面倒だった。  
ちなみに普通の``show columns from hoge``や``desc hoge``では制約は見られないので``show create table hoge``を使う。削除や付加にはいつも通り``alter table``を
使うんだけれどもね

## 列エイリアス
``SELECT COUNT(hoge) AS fuga``みたいに書けばカラム名を変えられるのは知っていたけれども、ASを抜いて``SELECT COUNT(hoge) fuga``でも大丈夫なのは知らなかった。

## 式の評価順序
[いいまとめ](https://qiita.com/suzukito/items/edcd00e680186f2930a8)があったので詳しくはこちらを見ていただくとして、参考になったのはこの2点
1. LIMITは最後に評価されるので書いたからといってクエリは早くならない(描画とかはまた別問題)
1. SELECTに列エイリアスを書いてもwhereではそのエイリアスを使えない。

結果セットを早い段階で小さくしておくのがコツらしい。      
一番最初に全部入りのでかいテーブル(FROM, JOIN)を作っておいて、条件で絞り込んで(WHERE)、まとめて(GROUP BY)、必要そうなものだけ取り出す(SELECT, LIMIT)ってイメージしておくだけで全然違う気がする

## ビュー
普通のテーブルは正規化しておかないとデータが冗長になるので、単体で使えるテーブルにはなりにくい。そこで予めサブクエリとしてよく使うもの(SELECT文で取れる結果セット)を登録しておいて、1つのテーブルとして扱うことでクエリを簡潔にすることができる、ということらしい。  
便利そう。実際に[Laravelでビューを使って任意のSQLを書く方法](https://qiita.com/ak-ymst/items/a7833987f6a513d34364)もあるみたいだし、使ってみたい…！  

## ORDER BYの式による並び替え
たとえば会員番号(例:1234-111-567)の下3桁で並び替えたい、みたいなときは

```sql
SELECT *
FROM cutomers
ORDER BY RIGHT(cust_id, 3);
```

みたいに書ける。  
全然関係ないけど何でSQLの教本ってWeb系フレームワークの規約に多少なりとも沿った形では書いてくれないんでしょうね。

## between演算子
2000年生まれの人が欲しい時

```sql
SELECT *
FROM users
WHERE birth_date >= '2000-01-01' AND birth_date <= '2000-12-31';
```

みたいに書きがちなんだけどbetween演算子を使えば

```sql
SELECT *
FROM users
WHERE birth_date BETWEEN '2000-01-01' AND '2000-12-31' ;
```

って書けて多少楽なんだよということ。気をつけなければいけないのはANDの左が下限で右が上限だということと、指定した値が含まれること。

## 照合順序
``utf8_general_ci``とか``utf8_unicode_ci``のこと  
 名前からして日本語などの非アルファベット文字のソート順とかを決めてるのかなーとか思ってたんだけど、それだけにとどまらない様子  
詳しくは[こちら](https://qiita.com/kazu56/items/6af85ffcf8d3954455ad)などを見ていただきたいのだが、要するに  
文字列の比較に使われるので、フィルタ(WHERE句とかJOINの結合条件とか)のかかり方に影響が出るほか、速度にも違いが生じるとのこと  
ちなみに照合順序が違うカラムを結合するとエラーが出る(回避はできる)ので、普段は硬めの``utf8_general_ci``を使っておいて、あいまい検索したい時だけ``collate utf8_unicode_ci ``みたいに指定してあげるのが良さそうですね


## USING

```sql
SELECT e.fname, e.lname, d.name
FROM employee e INNER JOIN department d
USING (dept_id)
```

２つのテーブルの結合に使用する列の名前が同じであるときはONキーワードの代わりにUSINGを使って簡単に書くことが出来るというもの。  
そういう規約や設計をしておいて、すべてのテーブルがそういう結合の仕方が出来るようになってれば便利かな？ぐらい。Webフレームワークの中では出番は少なそうだなぁ。
【Xamarin.Forms】共通部分(PCL)に配置した画像を表示する

本記事は2018.01.29に投稿したものです。
~~検索「search」の綴りが脱字で「seach」になってるのは突っ込んだら負け~~

#環境
VisualStudio2017(15.5.7)

#<b>前提</b>
3点あります。
**※3点目が特に重要です。**

1・ `Xamarin.Forms`の`.NET Standard`でソリューションを作成している
2・ 共通部分に適当なフォルダを作り、フォルダ内に画像が配置されている
![WS004024.png](https://qiita-image-store.s3.amazonaws.com/0/232583/9d9c370a-c15b-a07d-beca-5055943b0ecd.png)

3・各画像の`プロパティ`の`詳細設定`にある`ビルド アクション`を`埋め込みリソース`に変更する
![WS004025.png](https://qiita-image-store.s3.amazonaws.com/0/232583/6d174e0b-3f4d-e0cc-5dd8-932f0622c1d6.png)

#<b>画像を表示してみる</b>
まず、`MainPage.xaml`に`Imageコントロール`を設定します。

```XML
<Image x:Name="MapPageIcon"/>
<Image x:Name="MyPageIcon"/>
<Image x:Name="SeachPageIcon"/>
```
各`Imageコントロール`に`x:Nameプロパティ`を使って名前を付けています。

続いて、コードビハインドである`MainPage.xaml.cs`に各画像のパスを記述します。

```Csharp
public MainPage()
{
    InitializeComponent();

    MapPageIcon.Source = ImageSource.FromResource("test180125c.Image.MapPageIcon.png");
    MyPageIcon.Source = ImageSource.FromResource("test180125c.Image.MyPageIcon.png");
    SeachPageIcon.Source = ImageSource.FromResource("test180125c.Image.SeachPageIcon.png");
}
```
先程`x:Nameプロパティ`で設定した名前に対応するパスを記述しています。
パスは、
**`名前空間`.`共通部分に作成したフォルダ`.`画像ファイル`.`拡張子`**
といった具合です。

これで画像が表示されたはずです。
表示されていない場合は前提を見直すか、パスをもう一度確認してください。

今回のような共通部分に画像を配置するケースでは、
`ImageSourceクラス`の**`FromResource()メソッド`を使わないと正しく表示されない**ようです。

`ImageSourceクラス`の詳細は以下の公式リファレンス参考に。

>公式 Xamarin.Forms.ImageSource Class
https://developer.xamarin.com/api/type/Xamarin.Forms.ImageSource/

#<b>表示できたがサイズがおかしい</b>
今回の記事のソースだけでは、同じサイズの画像を使っても、
機種によって表示される画像のサイズが異なります。

その為、ソース側でサイズを指定するなどの対策が必要です。

```xml
<Image x:Name="MapTabIcon"
        WidthRequest="40"
        HeightRequest="40"/>
```

`Imageコントロール`に**`HeightRequestプロパティ`**と**`WidthRequestプロパティ`**を追加しています。

これらのプロパティは文字通り、
**`HeightRequestプロパティ`**→縦の幅(px)
**`WidthRequestプロパティ`**→横の幅(px)
ですので、上記のコードは読み込んだ画像の縦・横の幅を40pxで指定しているということになります。

この辺り気になる方は**[ポイント ピクセル]**とかでggると幸せになれます。

別の対策案として、各プラットフォームごとに画像を用意するという方法がありますが、そこまでするなら各プロジェクトの`Resourcesフォルダ`に画像ファイルを入れて読み込んだ方が良さそうです。


#<b>まとめ</b>
>共通部分に画像を配置するケースでは、`ImageSourceクラス`の**`FromResource()メソッド`を使う**

ということです。

`ImageSource.FromResource()メソッド`を利用しないといけない、という点に気付くまで時間がかかりました。
同じポイントで詰んでいる方も多いのではないでしょうか。

>参考記事
http://ytabuchi.hatenablog.com/entry/2017/01/16/170000
Shade3D(ver16)は、Pythonでスクリプトかけるので、お絵かきしてみる


Shade3D(ver16)は、Pythonでスクリプトかけるので、お絵かきしてみる


```python
import math
scene = xshade.scene()
scene.begin_creating()
for n in range(0,360*20,2):
	m = n * 1.1
	scene.create_sphere(None,((50) * math.sin(m * math.pi/180)* math.cos(n * math.pi/180), (50) * math.sin(m * math.pi/180) * math.sin(n * math.pi/180), (50) * math.cos(m * math.pi/180)),3)
scene.end_creating()
```

出来る図形は、こんな感じ

<img width="368" alt="1.png" src="https://qiita-image-store.s3.amazonaws.com/0/107418/8209793e-3fd0-ddb4-2a01-cc88d2950158.png">
<img width="365" alt="2.png" src="https://qiita-image-store.s3.amazonaws.com/0/107418/f38955d0-35d6-6f31-69d6-4d4431286c9f.png">

このデータを元に3Dプリンタサービスに発注した結果が、こんな感じ
(注：Shade上で、若干手加工してます)

![r21photo.jpg](https://qiita-image-store.s3.amazonaws.com/0/107418/c6e903dc-195d-2ea0-2f4b-357f6a368917.jpeg)
MacでChromeのパスワード保存がされなくなったときにやること



# 概要
ふと気づくと、毎日いろんなサイトのログインパスワードを入力させられている。
「保存しますか？」って毎日聞かれて、「はい」って答えている。

でも次の日またログインフォームが空っぽになっている。٩(๑`^´๑)۶.

１年前くらいにも同じ症状になって直した気がするけど、、
どうやったのがまた忘れてたので自分用メモも兼ねて残します。
（滅多に起きなそうなのでかなり需要なさそう・・）

## 症状(末期の人)
###【再現手順】
1.ログインフォームのあるサイトでログインする
2.「パスワード保存しますか？」ってでる。
3. → もちろん、「保存」にする。
<img src="https://qiita-image-store.s3.amazonaws.com/0/187252/319465e7-441d-fde8-d16a-ff69e09f209c.png" width=50%>
4.その後、同じサイトにアクセスしてもパスワードをまた聞かれる!!

###【設定確認】
- Chromeの設定を見てみる

> Chrome設定 > 詳細設定 > パスワードとフォーム > パスワードを管理
> `ブラウザでこちらを開くと設定画面ひらけます`
> → `chrome://settings/passwords`
> ![image.png](https://qiita-image-store.s3.amazonaws.com/0/187252/4208b8d6-7b8b-08be-23e9-78497f1dbaf1.png)

- :x::warning::x:保存したパスワードの項目が空っぽ
<img src="https://qiita-image-store.s3.amazonaws.com/0/187252/4ddef033-b75e-879a-534f-5b74c152b441.png" width=60%>

→しかし、:exclamation::warning::exclamation: 
→[passwords.google.com](https://passwords.google.com/) にアクセスすると保存はされている。←ここ大事

## 対応
###【Chrome正規手順】
> :point_up:Chrome公式ヘルプ
> [保存したパスワードを管理する](https://support.google.com/chrome/answer/95606?co=GENIE.Platform%3DDesktop&hl=ja)
> →この辺みても治らなかったら下記手順をどうぞ。

- その他
- 再度ログインし直して見る、
- それでもダメならchromeを消せなどという乱暴な記事もたくさんあるが
- 普通にやって治らなかった人は以下の手順を試してみてください。

###【応急手順】
Macのローカルにあるログインファイルを消して、
クラウド保存されているデータを読み込み直す

- 1.Chromeのユーザデータのログイン情報を消す。(詳細は↓にスクロールするとあります）
    - ※消しても、クラウド（[passwords.google.com](https://passwords.google.com/)）に保存されていれば復元されます！
    - ※クラウドに保存されていない場合、そもそもデータはどこにもないのでこの手順は意味ないのでやらないでください

```
 【データの消し方詳細】 
「Macのライブラリ→Application Support→Google→Chrome→Default」の中にあるログインファイル
「Login Data」と「Login　Data-journal」 を削除してください。
(不安な方はバックアップ忘れずに)
```

<img src="https://qiita-image-store.s3.amazonaws.com/0/187252/585d3a02-7fc9-b6ac-a1b2-962bdb39f77e.png" width=50%>|

> 【豆知識】
> ライブラリフォルダは、隠しフォルダになっているので普通にはアクセスできません。
> ターミナルから、以下コマンドで開くことができます。
> `$ open /Users/<ユーザ名>/Library/Application\ Support/Google/Chrome/`
> <ユーザ名>の部分は自分のPCの名前に変えてください。           |

- 2.Chromeを再起動する
    - （起動時にログインデータは再生成されます。その際 [passwords.google.com](https://passwords.google.com/) に保存されていたデータが読み込まれます。）

- 3.正常に読み込みが完了すると以下の通りパスワード一覧が表示されるようになります。
<img src="https://qiita-image-store.s3.amazonaws.com/0/187252/50cf70d8-2629-5fbc-a2a1-8315d1c2b3d4.png" width=50%>

:beginner::warning::beginner:詳しいことはわからないので自己責任でお願いします:ghost:
UnityでYouTubeLiveのAPIを叩きに行く　メモ

# メモです
YouTubeLiveAPIを叩きに行って、コメントを取得したかったもののまだ途中です。
忘れないためのメモ。
コードが汚いのは、メモなので勘弁してほしい。

### UnityでYoutubeAPIを叩きに行く

```csharp
private IEnumerator GetYoutubeAPI()
    {
        
        UnityWebRequest request = UnityWebRequest.Get(uri);

        yield return request.SendWebRequest();

        if(request.isHttpError || request.isNetworkError)
        {
            Debug.Log(request.error);
        }
        else
        {
            Debug.Log(request.downloadHandler.text);
        }
　　　　Debug.Log(request.downloadHandler.text);
}
```

コルーチン内で、UnityWebRequestを作って、Get(uri)で、呼びに行く。
uriは、上の方で適当に定義する。

```csharp
Debug.Log(request.downloadHandler.text);
```

これで、コンソールにJSONのログが出現する。

```csharp
yield return request.SendWebRequest();
```

yield 節の意味を未だによくわかってない。誰か教えて。

とりあえずこれで、JSONデータがとれます。

### YouTubeLiveのコメントを見に行く。
たどる順番。

- チャンネルIDを知っているとする
- videoIDを取得
- chatIDを取得
- チャットを取りに行く！

### JSONのパースで大いにハマる。

結局、Unity標準のJsonUtilityは使い方がわからなかったので、MiniJSONを使用。
JSONの辿り方としてこれで正しいか全くわからないけど、
videoID取りに行くときのやり方をメモしておく。

```csharp
 //MiniJSON　つかうー！！！！
        var mjson = (IDictionary)MiniJSON.Json.Deserialize(jsontext);

        var mitems = (IList)mjson["items"];
        var mid = (IDictionary)mitems[0];
        var sid = (IDictionary)mid["id"];
        //videoIdを取得
        videoId = (string)sid["videoId"];
```

中に配列がはいっていてもパースできることがわかったので良かった。
こんな感じで、URI作って投げて、返ってきた値を、突っ込んで投げてすればチャットとれます。

全然まとまってないのは、そのうちちゃんとかきます。
まだ、表示部までできてないので・・・。

### 参考と言うか、ほぼそのままと言うか
#### JSONをパース
https://qiita.com/phi/items/914bc839b543988fc0ec
https://qiita.com/asus4/items/bac121c34cd3169116c0

#### YoutubeLive
https://blog.sky-net.pw/article/86
https://qiita.com/minakawa-daiki/items/2568afdc6d88a0de705a

その他もろもろ・・・。
うぅ。出来る人なら1時間もあれば出来ることを僕はまるっと一日かかってしまった。（しかもまだ途中

もっとこうした方がいいよ、。とか言うことがあれば、教えて下さい。お願いします。
あと、コルーチンとかまだまだよくわかってないし。。。
ロボライブ！【Pepperが踊るまで】BPM→FPS編

# 【ロボライブ！とは―】
[アキバハロウィン(秋葉原UDX)]
https://www.youtube.com/watch?v=XGIOsKIzLSg
https://www.youtube.com/watch?v=zmRJGeExxL8

[かわいい感じジャパン番外編～桃知&うさぎ生誕祭(新宿LOFT)]
https://lineblog.me/dessart/archives/13100495.html

[コミックマーケット91]
http://kai-you.net/article/36969

[Re:animation 10 -Rave In 潮風公園-]
http://anievez.com/anievez-event-report/re10-r


# 【課題】
・Choregrapheのタイムラインにモーションを打ち込む時、どのテンポの時、どの場所にキーフレームを打ち込めば「曲のリズムで動いてくれるのか」調べる必要があった。

・コレグラフのタイムラインFPS値は整数値しか設定できない為、モーション作成に適した数値を調べる必要があった。


# 【ツールの紹介】
http://devils-dozen.net/robolive/tools/bpm2fps.zip
![bpm2fps.jpg](https://qiita-image-store.s3.amazonaws.com/0/89941/794d396c-e49a-d87a-d014-ba58bef2701d.jpeg)


# 【使い方】
・踊らせたい曲のBPM(テンポ)を調べてその数字を設定すると、モーション作成に適したフレームレート(FPS)が緑色に強調表示されるようになっています。

・ツールにBPMを設定した時に、強調表示されたFPS値が無い場合は、音声編集ソフトで「曲のBPMを変える」か、「近似値」を使いますが、近似値を使用した場合、一定のフレーム間隔で作成できません。

・フレームレートを高く設定しすぎると、キーフレーム間の幅が大きくなりすぎて、どの場所を編集しているのか分かり難くなります。

・低すぎるとキーフレーム間が近すぎて、細かい調整や早いモーションが作れなくなってしまいます。

・1拍辺りのフレーム数が4か8(表の真ん中)付近から作り始めると比較的作りやすいです。

・例えば、135BPMに設定した時、9/18/27～と強調されるので、真ん中の辺りにある18を設定すると8フレームを1拍(1フレームが32分相当)と考えてタイムライン上で作業出来ます。


・Choregraphe上では、タイムラインボックスの編集→タイムラインのプロパティ→フレームレート の設定(FPS)の欄に、緑色に強調表示された数値を入力します。

≫タイムラインボックスの作成
![bpm2fps_3.jpg](https://qiita-image-store.s3.amazonaws.com/0/89941/5ead465e-a1f9-a521-0fff-b5b23d31ab7f.jpeg) ![bpm2fps_5.jpg](https://qiita-image-store.s3.amazonaws.com/0/89941/f15b7c60-ecb7-cd5c-009f-79954c1bb911.jpeg)

≫空のタイムライン
![bpm2fps_4-1.jpg](https://qiita-image-store.s3.amazonaws.com/0/89941/af4134bb-3cd4-7998-e401-3bd0b6d4f1c5.jpeg)

≫タイムラインFPS設定
![bpm2fps_2.jpg](https://qiita-image-store.s3.amazonaws.com/0/89941/06c8720e-16f7-90c3-0784-8a32f0d87442.jpeg)

≫一拍ずつ変化するタイムラインモーション入力例
![bpm2fps_4.jpg](https://qiita-image-store.s3.amazonaws.com/0/89941/2f6c5003-c339-65c4-7e98-c3f18c8def61.jpeg)


# 【ロボライブ！スポット部員、レギュラー部員募集中！】
・Twitter : https://twitter.com/_XICK_

## ≫2018/3/3開催イベント『 Love Palettes! 』参戦！！
http://twipla.jp/events/278699

また、イベント参加に伴い「ロボライブ制作体験会」を「2/3(土)」「2/4(日)」の二日間開催いたします。
開催場所は「Pepperアトリエ秋葉原 with SoftBank( https://pepper.doorkeeper.jp )」です。
※3331 Arts Chiyoda( http://www.3331.jp )内施設

下記、参加申し込み登録＆PC持参(推奨)の上ご来場ください。
※【経験者限定】となっていますが、初心者の方も同登録先から申請いただいて大丈夫です。
※全コマ参加希望の方は、全ての日時に参加登録してください。
※システム上定員となってしまい参加登録できない場合は、個別にご連絡ください。

#### ・2018/2/3(土) ↓参加申し込みはコチラ
https://pepper.doorkeeper.jp/events/70017 ( 13:00 - 14:50 )
https://pepper.doorkeeper.jp/events/70016 ( 15:00 - 16:50 )
https://pepper.doorkeeper.jp/events/70018 ( 17:00 - 18:50 )
#### ・2018/2/4(日) ↓参加申し込みコチラ
https://pepper.doorkeeper.jp/events/70019 ( 13:00 - 14:50 )
https://pepper.doorkeeper.jp/events/70020 ( 15:00 - 16:50 )
https://pepper.doorkeeper.jp/events/70021 ( 17:00 - 18:50 )

ご不明な点、ご質問等ございましたら、Qiita/Twitterどちらでもお気軽にコメントください＾＾
WEBページに数式を表示する方法

データサイエンスや機械学習のような数学が絡む分野の記事を書くときに、地味に困るのが「数式」の表示。

平均（相加平均）の式ですら、どう書けば良いかわからない。シグマ、分数・・・なんてHTMLでは無理で画像にするしかないかと思っていました。

# 数式に関するWeb標準規格があった
ダメもとで調べてみたら MathML という数学（数式）に関するWeb標準規格がありました！（恥ずかしながら全然知りませんでした）

2018年時点ではサポートブラウザは限定されるものの W3C によって標準化されているマークアップ言語です。

ということで、クロスブラウザの方法から高校数学程度のサンプル集まで全力でまとめました。

## 導入方法
<a href="https://it-engineer-lab.com/archives/781">Webページに数式を表示する方法を徹底解説 – 導入編 –</a> に MathML とクロスブラウザのためのJavaScriptライブラリについて、まとめました。

## はじめてのMathML
そのままのタイトルですが、一度も MathML を書いたことがない人向けに <a href="https://it-engineer-lab.com/archives/825">はじめてのMathML</a> という記事を書きました。

## 怒涛のサンプル集
自分で怒涛なんていうのも相当恥ずかしいですが、各種方程式、分数、平方根（ルート）、ベクトル、行列、部分・積分など高校数学程度ならおよそカバーできる内容のサンプルを載せました。

<a href="https://it-engineer-lab.com/archives/1000">Webページに数式を表示するサンプル集 – 分数・ルートから行列・積分まで網羅</a>

なにより大変だったのが、記憶喪失レベルで高校数学が思い出せないこと・・・。用語はわずかな記憶とGoogle先生を頼りに書いています。

間違いもあるかもしれませんし、気がついたら適宜追加・修正するかと思います。
zabbixのUserParameterに引数を複数渡す方法

## 環境
- Zabbix3.2(server, agent共に)

## 設定方法
### UserParameter設定
- 下記を設定してzabbix_agentをrestart

```shell:/etc/zabbix/zabbix_agentd.d
UserParameter=sample.key[*],/etc/zabbix/script/sample.sh $1 $2 $3 $4
```

### Zabbix Server設定
- 「アイテムの作成」から `[]` 内にカンマ区切りで引数を設定する

```
sample.key[str1,str2,str3,str4]
```
こんな感じ。

<img width="805" alt="スクリーンショット 2018-01-29 19.53.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/68292/f9b3a3e5-5758-f87b-a0b0-4177123b5dfa.png">

この設定をすると、順番に引数を読み取ってくれる

### 確認
- `zabbix_get` コマンドでキーを指定して値が取得できること

```
# zabbix_get -s localhost -k sample.key[str1,str2,str3,str4]
100
↑出力できるか確認
```
After Effects のスクリプトで、プロジェクトウインドウ内で選択しているアイテムの取得

# はじめに
AfterEffects でスクリプトを書くには、メニューの「ファイル」→「スクリプト」→「スクリプトエディタを開く」でスクリプトを記述するコンソールが表示されます。

# 方法
`app.project.selection`
で、選択しているアイテムのリストが取得できる。というか格納されている。

数は、
`app.project.selection.length`

要素は
`app.project.selection[0]`

コンポジションのレイヤーは
`app.project.selection[0].layer(j)`
コンポジションのレイヤー数は
`app.project.selection[0].numLayers`

# コツ的な
`app.project.selection`
は配列なので、`[]`でも`()`でもいいが、
`app.project.selection[0].layer(j)`
はメソッドなので、`()`でないといけない。
Djangoのmodel参照時のpylintの警告を出さないようにする

# 目的
VSCode利用時を利用していると以下のような問題に直面する。
- モデルのobjects参照時に、**そんなattributeないよ**。と言われる

実際にアプリケーションを動かすと、そのattributeは存在するので、
余計な警告は出したくないのでそれを解消する。

# 原因

モデルに対しての各種attributeは動的に作成されているので、
Django向けのpylintの追加モジュール(pylint_django)を導入して
pylintから利用できるようにする必要がある。

# 前提
- 拡張機能Pythonをインストール済みであること。
- Pythonパッケージとしてpylintおよびpylint_djangoがインストール済みであること。

# 手順

画面右下の歯車を選択肢、`設定`メニューを選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/40692/d5dfefc6-8c1a-1b4c-60dd-afa6e535e332.png)

ユーザ設定に、`"python.linting.pylintArgs"`とその値を追加します。

```json:ユーザ設定
{
　　〜〜〜（省略)〜〜〜
    "python.linting.pylintArgs": [
        "--load-plugins=pylint_django"
    ]
}
```
enum type traits

以前別のブログで書いた[内容](http://angeart.hatenablog.com)だが、一応Qiitaにも書いておこうかなと思った次第

# 概要
enumに応じてtype traitsを決定する
似たようなものとしては[こちら](https://qiita.com/chikashimiyama/items/4f022839d771b3bae535)があげられる

# source
```cpp
template<class Enum>
struct selector {
    template<
        bool Check,
        size_t N,
        Enum Select,
        Enum First,
        Enum ... Modes
    >
    struct resolve_select
    {
        static size_t const value = N - 1;
    };

    template<
        size_t N,
        Enum Select,
        Enum First,
        Enum ... Modes
    >
    struct resolve_select<false, N, Select, First, Modes ...> :
        public resolve_select<First == Select, N + 1, Select, Modes ...>{};

    template<
            size_t N,
            class Check,
            class ... Remain>
    struct resolve_type : public resolve_type<N - 1, Remain ... > {};

    template<
        class Check,
        class ... Remain>
    struct resolve_type<0, Check, Remain ...>
    {
        typedef Check type;
    };

    template<Enum ... Modes>
    struct which {
        template<Enum Select>
        struct select {
            template<class ... Types>
            struct types {
                typedef typename resolve_type<resolve_select<false, 0, Select, Modes ..., Select>::value, Types ...>::type type;
            };
        };
    };
};
```

# usage
こんな感じで使う

```cpp
enum class Test {
    hoge,
    fuga,
};
template<Test Selector>
struct select {
    using type = typename switch_types<Test>::which<hoge,fuga>::select<Selector>::template types<int,long>::type;
};
//select<hoge>::type -> int
//select<fuga>::type -> long
```

Boost.PPと組み合わせると

```cpp
#define TEST
(( hoge, int )) \
(( fuga, long )) \

#define REFERENCE_PARAM_ENUM(params) \
BOOST_PP_TUPLE_ELEM(2,0,params)

#define REFERENCE_PARAM_CLASS(params) \
BOOST_PP_TUPLE_ELEM(2,1,params)

#define REFERENCE_FORMAT_ENUM(z,index,params) \
BOOST_PP_COMMA_IF(index) REFERENCE_PARAM_ENUM(BOOST_PP_SEQ_ELEM(index,params))

#define REFERENCE_FORMAT_CLASS(z,index,params) \
BOOST_PP_COMMA_IF(index) REFERENCE_PARAM_CLASS(BOOST_PP_SEQ_ELEM(index,params))


#define JOINER_GEN_STRUCT(name,enum_type,params) \
template<enum_type Selector> \
struct name { \
    using type = typename util::switch_types<enum_type>::which<BOOST_PP_REPEAT(BOOST_PP_SEQ_SIZE(params),REFERENCE_FORMAT_ENUM,params)>::select<Selector>::template types<BOOST_PP_REPEAT(BOOST_PP_SEQ_SIZE(params),REFERENCE_FORMAT_CLASS,params)>::type; \
} \

JOINER_GEN_STRUCT(select,Test,TEST)

//select<hoge>::type -> int
//select<fuga>::type -> long
```
みたいな感じで書ける
Android studioを使用して背景画像を変更する

# 手順

※私のページではできる限り簡略化して伝えることを心がけている。細かな内容については適宜質問していただきたい。

![スクリーンショット 2018-01-26 11.10.21.jpg](https://qiita-image-store.s3.amazonaws.com/0/233661/70b1726c-b496-f086-4898-a12b5dfdcd76.jpeg)

![スクリーンショット 2018-01-26 11.10.28.jpg](https://qiita-image-store.s3.amazonaws.com/0/233661/ec7d0a56-16a4-bc80-89d1-eefeda9dccb3.jpeg)

![スクリーンショット 2018-01-26 11.10.36.jpg](https://qiita-image-store.s3.amazonaws.com/0/233661/8dd7b49a-ca9f-2db6-3d40-efefaa3d5f1c.jpeg)

![スクリーンショット 2018-01-26 11.10.42.jpg](https://qiita-image-store.s3.amazonaws.com/0/233661/fef70499-4f60-2dfb-252d-f7826180d65b.jpeg)

![スクリーンショット 2018-01-26 11.10.45.jpg](https://qiita-image-store.s3.amazonaws.com/0/233661/e9806c29-052e-e170-f12a-1f3ccc0088f6.jpeg)

![スクリーンショット 2018-01-26 11.12.08 copy.jpg](https://qiita-image-store.s3.amazonaws.com/0/233661/4672c73e-90bd-b4ff-5deb-c15534fc5846.jpeg)

![スクリーンショット 2018-01-26 11.12.31.jpg](https://qiita-image-store.s3.amazonaws.com/0/233661/331d4a05-0550-470c-52ff-5c4908ea6167.jpeg)

![スクリーンショット 2018-01-26 11.14.jpg](https://qiita-image-store.s3.amazonaws.com/0/233661/420823be-7639-ea00-5271-605c5a658a28.jpeg)

## まとめ

values/styles.xml に以下のように記載する。

```XML
<style name="AppTheme" parent="AppBaseTheme">
        <item name="android:windowBackground">@drawable/background</item>
</style>
```
Beautiful Soupで.stringを使うとNoneになってしまう時の解消法

#BeautifulSoupの.stringを利用してタグ内のデータを表示しようとするとNoneが返ってきてしまう時の解消法です。


```python3:filename.py
from bs4 import BeautifulSoup

table = '\
  <table>\
    <tr>\
      <td>2018/01/29<br/>18:55</td>\
      <td>晴れ</td>\
    </tr>\
    <tr>\
      <td>2018/01/28<br/>18:45</td>\
      <td>曇り</td>\
    </tr>\
  </table>'

bsObj = BeautifulSoup(table, 'lxml')

tr = bsObj.find_all('tr')

for r in tr:
  td = r.find_all('td')
  for d in td:
    print(d)

# <td>2018/01/29<br/>18:55</td>
# <td>晴れ</td>
# <td>2018/01/28<br/>18:45</td>
# <td>曇り</td>

```
こんなデータを取得した場合、タグを除去してデータを保管したいところですよね。
.stringを利用してタグの中のテキストだけ取得しようとするとこんな結果が返ってきます。


```python3:filename.py

for r in tr:
  td = r.find_all('td')
  for d in td:
    print(d.string)

# None
# 晴れ
# None
# 曇り

```
2つ以上のタグがある場合は.stringするとNoneが返ってきてしまうようです。
この場合は、.textを利用するとうまくいくようです。


```python3:filename.py


for r in tr:
  td = r.find_all('td')
  for d in td:
    print(d.text)

# 2018/01/2918:55
# 晴れ
# 2018/01/2818:45
# 曇り

```

<br/>タグが消されてしまっただけなので今回の例では
年月日と時間を切り分けなければなりませんが、、、
.stringでNoneになってしまう件は解消しました。
exceljsの範囲指定方法

## このページを読んでわかること
- exceljsを使って、Excelファイルに書き出すときのセルの指定方法

## exceljs
- Node.jsでExcelファイルの読み書きができるモジュール
    - https://www.npmjs.com/package/exceljs
- インストール

        npm install exceljs

## 使い方
- 以下のような準備を行う

        var Excel = require('exceljs');   // 宣言する
        var workbook = new Excel.Workbook();   // Excelファイルの作成
        var sheet = workbook.addWorksheet("サンプル");   // シートの作成
        

## 指定方法
- 一つのセルだけ指定 ＊B3のセルを指定する

        sheet.getCell('B3')

    もしくは

        sheet.getCell(3, 2)
        
- 列での指定　＊B列を指定する

        sheet.getColumn('B')

    もしくは

        sheet.getColumn(2)

- 行での指定　＊3行目を指定する

        sheet.getRow(4)

## 複数列複数行指定
- 範囲選択方法がないので、for文を使う（もしあったら教えてください）以下ヘッダーに色をつける例

        var rowCount = data1.length;
        var colCount = data2.length;

        for (row = 1; row <= rowCount; row++) {
          for (col = 1; col <= colCount; col++) {
            sheet.getCell(row, col).fill = {
              type: 'pattern',
              pattern: 'solid',
              fgColor: { argb: 'ffdaeef3' }
            };
          }
        }
Minikubeで快適にIngressを利用したいが、dnsmasqの設定は面倒なので省略したい

# はじめに
[Minikube で快適に Ingress を利用する](https://qiita.com/superbrothers/items/13d8ce012ef23e22cb74)のバリエーション(パクり)です。

# 手抜きポイント
- nip.ioを利用してdnsmasqのメンテを不要にする
- hostヘッダの指定も不要にする

# 手順
## Ingress controller有効化
```
$ minikube addons enable ingress
$ watch kubectl get po -n kube-system
```
## Nginxコンテナ実行/サービス公開
```
$ kubectl run nginx --image=nginx
$ kubectl expose deploy nginx --port=8080 --target-port=80
```

## Ingress作成(nip.io利用)
```
$ cat <<EOL | kubectl create -f -
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: nginx
spec:
  rules:
  - host: nginx.$(minikube ip).nip.io
    http:
      paths:
      - backend:
          serviceName: nginx
          servicePort: 80
EOL
```

## Servieへのアクセス
```
$ open http://nginx.$(minikube ip).nip.io/
```
mod_rewriteで、存在しないファイルへのリクエストに404を返す

表示するページの一部の画像がない場合、mod_rewriteで404を返してみる

```bash
RewriteEngine On
RewriteCond %{REQUEST_URI} ^.*(\.jpg|\.jpeg|\.png)$ #拡張子が画像の場合
RewriteCond %{REQUEST_FILENAME} !-f #ファイルが存在しない場合
RewriteRule ^.*$ - [NC,R=404,L]
```

| オプション |  |
|:-----------------|:------------------|
| NC | 大文字小文字を区別しない |
| R=404 | ステータスコードを404に変更 |
| L | 条件にマッチしてURLを書き換えた場合、ここで書き換えを終了する（これより後の条件は無視される） |

- `RewriteCond` の条件は正規表現で指定する
- `RewriteCond` は複数行書いた場合、AND の条件になる
- OR の条件にしたい場合は、`RewriteCond %{REQUEST_URI} ^.*(\.jpg|\.jpeg|\.png)$ [OR]` のように最後に `[OR]` を付ける
- オプションはカンマ区切りで複数指定可能
aptでパッケージ操作が一切できなくなった(pipで解決)

#apt-get upgradeでエラー発生

ある日普通にapt-get upgradeをしたところ、以下のようなエラーが発生。

```linux-config:Error
Setting up update-notifier-common (3.168.4) ...
Traceback (most recent call last):
File "/usr/lib/update-notifier/package-data-downloader", line 24, in 
<module>
import debian.deb822
ImportError: No module named 'debian'
dpkg: error processing package update-notifier-common (--configure):
subprocess installed post-installation script returned error exit status 1
Errors were encountered while processing:
update-notifier-common
E: Sub-process /usr/bin/dpkg returned an error code (1)
```

どうやらupdate-notifier-commonというパッケージがpythonで
`import debian`
をしたときに
`ImportError: No module named 'debian'`
エラーが返ってきているようだ。

このままではupdate-notifier-commonというパッケージが未設定として残っているため、apt-getコマンドを使った操作はエラーとなってしまう。つまり**apt-getを使ったあらゆるインストールが出来ない状態。**

## pipで`python-debian`をインストールして解決

`sudo pip install python-debian`
[Unity]PlayModeTestの使い方

# PlayModeとは
複数フレームに渡ってテストを実行できるツールです。
これにより、イベントや物理演算もテストが可能になりました。

# 試してみる
今回は物理演算を利用したSceneを作成して、PlayModeTestを試してみます。

## 前提
こんなSceneを作成しました
実行するとCubeが生成され、そのまま落下していきます
![説明.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/213392/580a590d-441d-a0e8-7858-6460c43e7202.gif)

## イベントを追加
2つのコードを作成して、Cubeのy座標が100以下になったら、OnCubeHellが呼ばれるように設定します。

```C#
public class CubeManager : MonoBehaviour {
    // cubeの座標が y < 100以下になったら呼ばれる
    public static UnityEvent OnCubeHell = new UnityEvent();
}
```
```C#
public class CubeController : MonoBehaviour
{
	// Update is called once per frame
	void Update () {
		if(transform.position.y < -100)
			CubeManager.OnCubeHell.Invoke();
	}
}
```

## テストを書いてみる
PlayModeTestを利用するためには、***Window -> TestRunner -> PlayMode***の「Enable playmode tests」を有効にする必要があります
<img width="399" alt="スクリーンショット 2018-01-29 18.18.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/213392/9b8b7aaa-4612-9b93-6152-30e81d139e91.png">
一旦Unityを再起動し、PlayModeが有効になったら。テストを書いてみます。
今回は、OnCubeHellが機能するか確かめるテストを書いて確かめてみます

```C#
public class CubeTest {
    
    /// <summary>
    /// [SetUp]
    /// 各テストが呼ばれる前に毎回呼ばれる
    /// </summary>
    [SetUp]
    public void Init()
    {
        SceneManager.LoadScene("Main");
    }

    [UnityTest]
    public IEnumerator OnCubeHellコールバックが呼ばれるか()
    {
        yield return new MonoBehaviourTest<OnCubeHellCallBackTest>();
    }
}

class OnCubeHellCallBackTest : MonoBehaviour, IMonoBehaviourTest
{
    /// <summary>
    /// Trueにすると呼び出し元のyieldに戻る(テスト完了となる)
    /// </summary>
    public bool IsTestFinished { get; private set; }

    void Start()
    {
        CubeManager.OnCubeHell.AddListener(OnCubeHellCallback);
    }

    void OnCubeHellCallback()
    {
        IsTestFinished = true;
    }
}
```
コードの内容について説明します

```C#
    [SetUp]
    public void Init()
    {
        SceneManager.LoadScene("Main");
    }
```
Sceneをロードします。
```[SetUp]``` が追加されたメソッドは、各テストば呼ばれる前に毎回呼び出されます。

```C#
    [UnityTest]
    public IEnumerator OnCubeHellコールバックが呼ばれるか()
    {
        yield return new MonoBehaviourTest<OnCubeHellCallBackTest>();
    }
```

```[UnityTest]``` が追加されたメソッドはTestRunner上でPlayModeTestとして扱われます。ここでは、コールバックを検出するクラスOnCubeHellCallBackTestを呼び出しています

```C#
class OnCubeHellCallBackTest : MonoBehaviour, IMonoBehaviourTest
{
    /// <summary>
    /// Trueにすると呼び出し元のyieldに戻る(テスト完了となる)
    /// </summary>
    public bool IsTestFinished { get; private set; }

    void Start()
    {
        CubeManager.OnCubeHell.AddListener(OnCubeHellCallback);
    }

    void OnCubeHellCallback()
    {
        IsTestFinished = true;
    }
}
```
OnCubeHellが機能するかテストします。```IMonoBehaviourTest```を実装することで、```IsTestFinished```変数が利用できるようになります。
```IsTestFinished = true```となるとテストが完了したとみなされ、呼び出し元のyieldに処理が戻ります。

## テストを実行する
コールバックが機能して、テストが終了したことがわかりました！
![名称未設定.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/213392/5c0a5b1d-ffa0-42d1-40c5-1137f1263118.gif)

## 最後に
今回使用したプロジェクトファイルを公開します。
https://github.com/rarudo/PlayModeTestExample
macOSでbashのショートカットキー（Alt-B, Alt-F）使う

![moving_cli.png](https://qiita-image-store.s3.amazonaws.com/0/26038/9fbb180d-14ed-0afd-2e46-9307d9c8d66d.png)

https://clementc.github.io/blog/2018/01/25/moving_cli/ より

こういうイケてる画像がバズってて、[タトゥーにしたいくらいだと言ってる人までいるほどの人気ぶり](https://twitter.com/xor/status/957013983327858689)ですが、macOSのデフォルトだと`Alt-B`と`Alt-F`がデフォルトだとドイツ語のエスツェットっぽい文字の入力に割り当てられているみたいで、カーソルの移動ができません。

ｷｪｪｪｯこれだからMacは、となるまえに、Terminalの `環境設定 > プロファイル > キーボード`の`メタキーとしてOptionキーを使用`にチェックをいれてみてください。

<img width="673" alt="スクリーンショット 2018-01-29 18.22.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/26038/eeb7318a-3e96-8e38-6ace-d10924c8b810.png">

これで`Alt-B`と`Alt-F`が使えるようになりました。
めでたしめでたし。
フローが返すHTTPレスポンスのCookieにHttpOnly属性をつけてみる

# はじめに
ASTERIAではWebブラウザなどHTTPクライアントからURLにリクエストをおくることでフローを実行できるHTTP起動のフローを作成することができます。URL実行設定、URLトリガーとも呼ばれるようです。
HTTPから実行するフロー用の終了コンポーネント、HTTPEndコンポーネントを使うとHTTPレスポンスのCookieを設定できるようになっています。
オプションとして「domain」「expires」「path」属性は指定できるようですが、HttpOnly属性をつける方法について考えてみました。

# 環境
+ OS:Windows Server 2012 R2
+ ASTERIA WARP:1712
+ Java:1.8.0_151
+ Google Chrome:63.0.3239.132

# フロー
HTTPStart -> Mapper -> HTTPEnd という単純なフローを作り、URL実行設定しておきます。

フロー
![HTTPOnly01.png](https://qiita-image-store.s3.amazonaws.com/0/180292/9388f2c6-caad-dc30-4c5a-ec2be39a0a8f.png)

URL実行設定
![HTTPOnly02.png](https://qiita-image-store.s3.amazonaws.com/0/180292/5cdb8932-1f67-2499-6f9b-fe503fa041b7.png)

# 動作確認

## 基本動作の確認
Cookieにはひとまず何もセットしないでブラウザーから実行してみます。

![HTTPOnly03.png](https://qiita-image-store.s3.amazonaws.com/0/180292/6cb9ff77-2790-9d24-6ae5-5c3f43a02e75.png)

Chromeのデベロッパーツールで確認してみます。

![HTTPOnly04.png](https://qiita-image-store.s3.amazonaws.com/0/180292/38d2ae21-639f-75a7-7cdd-8142c4bd4de1.png)

ASTERIA_FLOWSERVICE というシステム固有でセットされていると思われるCookieがありました。

## オプションで指定できる属性の確認
適当なCookieを1つと「domain」「expires」「path」属性をつけてみました。

![HTTPOnly05.png](https://qiita-image-store.s3.amazonaws.com/0/180292/a717bb8f-7b52-1943-0c88-879298dbe92b.png)

ブラウザーから実行してデベロッパーツールで確認してみます。

![HTTPOnly06.png](https://qiita-image-store.s3.amazonaws.com/0/180292/bab991e3-3a98-6180-d94e-9494ad92cd0c.png)

domainは一緒なのでしょうがないですが、pathとexpiresにはそれっぽい値がセットできていることを確認できました。

## HttpOnly属性の確認
HttpOnly属性は値なしの属性のようでCookieプロパティではうまく設定できませんでした。

![HTTPOnly07.png](https://qiita-image-store.s3.amazonaws.com/0/180292/d04eba59-5257-cb52-fc9e-e360d49dd490.png)
とkeyとvalueの組み合わせで値をセットする必要があるらしく、この状態で確認すると

![HTTPOnly08.png](https://qiita-image-store.s3.amazonaws.com/0/180292/32673acd-ea22-5604-a92f-c30b733d5f9a.png)

となり、HttpOnly属性は効いてないようです。
値をセットしない場合でも
![HTTPOnly09.png](https://qiita-image-store.s3.amazonaws.com/0/180292/59f0355c-e7dd-c95e-e62a-1396044e84ee.png)
とCookieの名前としてセットされてしまうようです。

そこで追加するヘッダーで「Set-Cookie」というヘッダー名を直書きして値に```;HttpOnly```と書く事でHttpOnly属性を有効にしてみました。

![HTTPOnly10.png](https://qiita-image-store.s3.amazonaws.com/0/180292/25ad4cc6-a972-da9a-12e7-8a2346f8a7aa.png)

この書き方だとHttpOnly属性を有効にできるようです。

![HTTPOnly11.png](https://qiita-image-store.s3.amazonaws.com/0/180292/43ec71ab-c455-5e63-dccb-972f81c00045.png)

ただし、追加するヘッダーのヘッダー名は重複を許していないようなので、1つしか登録することができないようです。

![HTTPOnly12.png](https://qiita-image-store.s3.amazonaws.com/0/180292/eed0c7f9-6ea8-0621-da1d-7377c171169d.png)

# おわりに

ブラウザーのデベロッパーツールで確認しましたが、さらにRestコンポーネントを使ってHTTPレスポンスのMIMEを確認するフローを作って確認してみると、

![HTTPOnly13.png](https://qiita-image-store.s3.amazonaws.com/0/180292/52228fa1-136d-5d9b-122e-0a49fe80782f.png)

デベロッパーツールとMIMEの対比もできてわかりやすかったです。
yarnを入れたら大変だった話

皆さん、Node.js使ってますか。
Node.jsのパッケージマネージャーとしてnpmを使っている方もいると思いますが、今回はyarnの話です。

#yarnって？
雑に言うとnpm互換で速いパッケージマネージャー。~~映画じゃないよ~~
キャッシュとか使ってオフラインでもinstall出来たりする、結構優れもの。

最初は、JavaのOkhttpみたいに、ラッパーと言うか、npmの上に載って裏であれこれしてくれるのかな、と思ってたんですが、どうやら違うらしい。

ンまぁそこはどうでも良いとして、yarnはBSDライセンスのフリーソフトですが、Facebook、Google、Exponent、Tildeが開発したらしいとも聞きます。
トップページにはこんな謳い文句が。
>高速で、信頼性が高く、そして安全な依存関係の管理

速度とともに信頼性を謳っています。
そしてネットで記事を漁っても、それほどネガティブな記事は見当たらない。
更には、何か忘れてしまったのですが、何かのプロジェクトをnpmでやろうとするとdeprecatedって言われるらしく。。。

これは入れるしかない！と思い、ビクビクしながら入れてみたところ…

**どこやねん。**

#yarnの入れ方
昔はnpmでも入れられたみたいですが、今はdeprecatedだしバージョンも古いかもなので、OSネイティブなパッケージマネージャーで入れましょう。Windowsはインストーラーもあり〼。
私はmacなので`brew install yarn`。
一応`yarn --version`で入ったかどうか確認を。

さてここからが問題。

#"npm互換"？
npm互換を謳われていますが~~(どこで)~~、互換なのはpackage.jsonだけで、node_modulesの階層が違ったりします。なので置き換えるより入れ替える方が良いでしょう。

**だが私が文句を言いたいのはここではない。**

#yarnを入れた後…
```bash
npm uninstall -g hoge
yarn global install hoge
```
こうすれば元あったnode_modulesに置いてくれると思ってました。
でも、無いんです。さぁどうする。Spotlightを使っても出てこない。どこだ…

しかも、入れたpackageのコマンドが反応しない！つまりPATHも通ってない。貴重な手がかりが…

と言うわけで大変なことになりました。

#結論
いました。`/Users/***/.config/yarn/global/node_modules`に。
`.config`。隠しフォルダ。そりゃSpotlightしてくれないわけだ。
中に`.bin`ってフォルダがあって、その中にシンボリックリンクが置いてあるので、ここにPATHを通してあげましょう。

```bash
export PATH=$PATH:/Users/***/.config/yarn/global/node_modules/.bin
```
一応echoで表示して追加されてるか確認しておきましょう。もしかしたら置き換わっちゃってるかもなので。

```bash
echo $PATH
```

これにてとりあえず解決。めでたしめでたし。
【iOS】エラー処理(Result型)

#Result型エラー処理

##Result型エラー処理の特徴
- 戻り値として「成功」か「失敗」のどちらかであることが保証される
- 失敗の場合に失敗の詳細情報を提供できる
- 非同期処理のレスポンスに使用できる

###1. Result型の定義
```swift:Result<T,Error>
enum Result<T, Error> {
  case success(T)
  case failed(Error)
}
```

###2. エラー型の定義
```swift:エラー
enum LoginError {
  case invalid
  case notFound
  case unknown
}
```

###3. 成功(結果)
```swift:成功
struct Account {
  let id: Int
  let token: String
}
```

###4. 処理定義
```swift
func login(id: Int) -> Result<Account, LoginError> {

  if id < 0 || 100000 < id { return .failed(.invalid) }

  let accounts = [
    Account(id: 111, token: "abc111"), 
    Account(id: 222, token: "xyz222")
  ]

  for account in accounts {
    if id == account.id {
      return .success(account)
    }
  }
  return .failed(.notFound)
}
```

###5. 実行
```swift
let result = login(id: 111)
switch result {
  case let .success(account):
    print(account.token)
  case let .failed(error):
    print(error)
}
```

###応用
```swift
// Result型定義
enum Result<T, Error> {
  case success(T)
  case failed(Error)
}

// エラー定義
enum LoginError: String {
    case invalid = "不正な値"
    case notFound = "見つからない"
    case unknown = "不明なエラー"
}

// データ定義
struct Account {
  let id: Int
  let token: String
}

// 処理定義
func login(id: Int) -> Result<Account, LoginError> {

  if id < 0 || 100000 < id { return .failed(.invalid) }

  let accounts = [
    Account(id: 111, token: "abc111"), 
    Account(id: 222, token: "xyz222")
  ]

  for account in accounts {
    if id == account.id {
      return .success(account)
    }
  }
  return .failed(.notFound)
}

// レスポンスハンドリング定義
func response<T, E>(result: Result<T, E>, failed: ((_ error: E) -> Void)? = nil, success: ((_ data: T) -> Void)? = nil) {
  switch result {
    case let .success(data):
      if let completion = success {
        completion(data)
      }
    case let .failed(e):
      if let completion = failed {
        completion(e)
      }
  }
}

// 実行
resuponse(result: login(id: 123), failed: { error in print(error.rawValue) }) { data in
  print(data.token)
}
```
change the background color of the search bar




```swift

let statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as! UIView
if statusBar.responds(to:#selector(setter: UIView.backgroundColor)) {
    statusBar.backgroundColor = UIColor.red
}
UIApplication.shared.statusBarStyle = .lightContent


```

source: https://stackoverflow.com/questions/38740648/how-to-set-status-bar-style-in-swift-3/40066798
LaravelのBladeで改行したいとき


phpの `nl2br` を使う。

## ポイント
`e` でエスケープ処理してから、`{!! !!}` で囲む。

```php:index.blade.php
<p>{!! nl2br(e($user->message)) !!}</p>
```

## 参考
- nl2br
http://php.net/manual/en/function.nl2br.php