OmniAICreator/Qiita-1.07M huggingface dataset:
CodeIQ 壊れたパスカルの三角形

# 壊れたパスカルの三角形

2月21日（水）AM10:00の締め切りが過ぎたので投稿します。
CodeIQで[こんな問題](https://codeiq.jp/challenge/1644)があったのでちょちょいとやってみました。

# 問題
```
パスカルの三角形を作るとき、隣り合った数の和を下段に追加していきますが、一か所だけ差を計算してしまっています。
次の図では、4段目・左から3つ目の値が、2 - 1 = 1になっているので、そこから下の部分の数が通常のパスカルの三角形と異なっています。
```

![fig2.png](https://qiita-image-store.s3.amazonaws.com/0/225010/835d3472-03aa-6bc8-b231-b54a44441380.png)

```
このような、壊れてしまったパスカルの三角形の一番下の段が入力として与えられたとき、
“何段目の”、“左から何番目”の値を求める際に差を計算してしまったのかを特定するプログラムを書いてください。
※「差」は、『大きい方の値から小さい方の値を引く』と考えてください。

【入力・出力】
入力データは1行目にパスカルの三角形の段数k、
2行目にk個の整数値が半角スペース区切りで与えられます。
kは最大60です。
k個の整数値は、壊れたパスカルの三角形のk段目を表しています。

これらの値を読み込み、間違えた計算方法で計算してしまった部分（差を計算した部分）を特定し、
その段数と左から数えて何番目に当たるかを半角スペース区切りで出力してください。
```

# パスカルの三角形とは？

![fig1.png](https://qiita-image-store.s3.amazonaws.com/0/225010/42ddc360-9b71-e5d1-1b5d-cc3b54cd3c24.png)

パスカルの三角形とは上段の隣あった2つの数字の和を下段に書くことでできる三角形です。

# 解答

とりあえずpython3で書いてみました

## コード

```python:codeiq_pascal.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

def pascal(n):
	row = [1]
	for _ in range(1,n):
		row = list(map(lambda x, y: x+y, [0]+row, row+[0]))
	return row

	
def check(a,b):
	count = 0
	pos=0
	i=0

	for s,t in zip(a,b):
		i+=1
		if s != t:
			count += 1
		if count == 1:
			pos = i
	return count, pos
	
def main():
	k = int(input())
	while not 0 < k <= 60:
		print("k : invalid")
		k = int(input())

	numbers = list(map(int, input().split()))
	while len(numbers) != k:
		print("number : invalid")
		numbers = list(map(int, input().split()))

	pas = pascal(k)

	print("%s %s" % check(pas,numbers))

if __name__ == '__main__':
    main()
```

## 解説

パスカルの三角形が一箇所誤っているということは、そこを頂点として誤った三角形ができている（<font color=“Green”>緑の枠</font>）ことに着目しました。
よくみてみると、最下段（入力値）の左から数えて初めて誤りがある位置と頂点の誤り位置の関係が（<font color=“Blue”>青矢印</font>）同じであるっぽいぞ。
さらに頂点までの段数（<font color=“Gold”>黄色矢印</font>）は

```
(頂点までの段数) = (最下段の誤った数字の個数)
```

で表せそうですね。


![4D652A49-4797-476E-8859-A1241ACF8959.jpeg](https://qiita-image-store.s3.amazonaws.com/0/225010/d028ab9d-191d-9dbd-eb55-dbd08c33f16f.jpeg)


最初は入力の取得の処理です。バリデーションをテキトーに書いたのでちょっと汚いです。

`pascal()`は引数の値の段数までのパスカルの三角形をリストで返してくれるメソッドです。

`check()`は引数に取った2つのリストを比較し、異なる数字の個数と左から数えて最初の誤り位置を返してくれるメソッドです。

これらを使って最下段のものが正しいパスカルの三角形とどう違っているかを調べるだけで誤った頂点の位置を知ることができます。

あとは標準出力に表示するだけ。

```:入力
7
1 6 13 14 9 4 1
```

```:出力
4 3
```

# 感想

こういうクイズ形式の問題を解くのは楽しいですね。いい頭の体操になりました。
他にもやり方があると思いますし、高速化を目指したり、綺麗に書くことを意識したり、改善の余地はまだまだありそうです。
自分のコーディング力を見返すいい機会になりますね。

# 2/23追記

ご指摘いただいたコードを修正しました。
BimapSourceを利用した様々な形式のTIFFファイルの読み込み

# はじめに
各チャンネルが16bitのRGB画像を読み込む必要があったので、様々な形式のTIFFファイルを読み込めるような方法について調査した。

# TIFFファイルの読み込み
TiffBitmapDecoderでファイルを読み込んであげれば簡単に様々な形式に対応できるらしい。
ちなみ、目的のファイルは1ページのFormat48bppRgbであった。

コードは下記の通り。

```csharp
using System;
using System.IO;
using System.Windows.Media.Imaging;

/// 中略

using (var stream = new FileStream(@"ファイルパス", FileMode.Open))
{
    var decoder = new TiffBitmapDecoder(stream, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
    var cnt = decoder.Frames.Count;  // ページ数
    for (int i = 0; i < cnt; i++)
    {
        var img = decoder.Frames[i];  // iページ目の画像
        var format = img.Format;  // 画像フォーマット

        // 画像フォーマット毎に処理
        if (format == PixelFormat.Format48bppRgb)
        {
        }
    }
}
```

# その他
Drawing.Bitmapでも読み込むことができるらしいが、16bit画像だと上手く値を取得することができなかった。
UIPageViewControllerの謎の空白

PageViewControllerを使って画面を作っていた時、画面の下に謎の白い空白が表示されていたので、なんでだろうと、StoryboardのPropertyをいじっていたのですが、どうやっても解決できず困っていました。

PageViewControllerの上に乗っけているViewがおかしいのかと、PageViewControllerのviewの背景色を変えて見たところ、○がみえるじゃありませんか。

<img width="347" alt="UIPageControll.png" src="https://qiita-image-store.s3.amazonaws.com/0/4664/4ff7a061-c1f6-a343-14cb-9eec362502ee.png">

そう、背景色が白で気づかなかっただけで、UIPageControllが表示されていたのです。今回はデザイン上不要なので、下記のコードで対応しました。ドキュメントにはないのですが、間違っていたら教えてください。

```
- (NSInteger)presentationIndexForPageViewController:(UIPageViewController *)pageViewController
{
    return -1;
}
```

SafeAreaのせいじゃないかとか色々無駄に時間を使うことに。
大きいデータに対するクエリを複数回に分ける方法

AWSのdynamoDBでは1度のクエリで取ってこれるデータの最大容量が **1MB**となっています。
これを超える場合1度にデータを全部取ってくることができないので複数回に分けてクエリを投げないといけません。
クエリ内で再帰関数を渡してあげれば簡単にいけました。

``` query.js
const aws = require("aws-sdk");
const dynamodb = new aws.DynamoDB.DocumentClient({ region: "ap-northeast-1" });


const queryToBigData = (params) => {
	const result = [];
	dynamodb.query(params, onQuery);

	function onQuery(err, data) {
		if (err) {
			console.error(err);
			return Promise.reject(err);
		} else {
			if (result.length !== 0) {
				data["Items"].forEach(item => {
					result[0].push(item);
				});
			} else {
				result.push(data.Items);
			}
			if (typeof data.LastEvaluatedKey !== "undefined") {
				params.ExclusiveStartKey = data.LastEvaluatedKey;
            	dynamodb.query(params, onQuery);
			} else {
				console.log("データ全部取れたよ");
				return Promise.resolve(result);
			}
		}
	}
	
}

```

`data.LastEvaluatedKey`に取りきれなかったデータの最初の位置が入るのでこれに値が入っている限りデータを取り続けます。
paramsのExclusiveStartKeyに取り始める位置を入れてあげることで途中からクエリを投げてくれるみたいです。
Swift4 CodableでJsonデータの値をネストさせてエンコードする

Swift4からのCodableのエンコード処理少し迷ったところがあったのでメモ。

# 一対一形式のJSONをEncodableに対応

下記のようなKeyとValueが一対一になっているJSONがあるとします。
ログインユーザーを表すAPIのリクエストデータを想定しています。

```json

{
  "id": 0,
  "first_name": "tommy",
  "user_token": "AAAAAA"
}
```

上記のJSONをCodableでエンコードすると以下のようになります。


```swift
struct User: Encodable {
    var id: Int
    var firstName: String
    var userToken: String
    enum CodingKeys: String, CodingKey {
        case id
        case firstName = "first_name"
        case userToken = "user_token"
    }
}

let user = try! JSONEncoder().encode(User(id: 0, firstName: "tommy", userToken: "AAAAAA"))
print(String(data: user, encoding: String.Encoding.utf8)!)
```

`CodingKeys`でJSONキーを指定すれば、エンコードができます。
便利。

# Jsonの構造が変わった場合

困ったのがこんな場合の時。
サーバー側の仕様が変わって先程のJSONに「`user`というトップのキーを追加する」仕様が加わったとします。

```json
{
  "user": {
    "id": 0,
    "first_name": "tommy",
    "user_token": "AAAAAA"
  }
}
```

この場合にSwiftコードはどうするべきか。

Encodableに適応している型であればエンコードができるので新しい型を作るのがまず考えられます。
`RootUser`型を新しく作ってみます。

```swift
struct RootUser: Encodable {
    var user: User
}

let user3 = try! JSONEncoder().encode(RootUser(user:User(id: 0, firstName: "tommy", userToken: "AAAAAA")))
print(String(data: user3, encoding: String.Encoding.utf8)!)

```

これでも期待するJSONデータを作ることができます。
が、Jsonの形式が変わる度に新しい型を作るのはちょっと面倒。


# マニュアルエンコードでネストさせる

JSONの形式がSwiftの型と一致しない場合独自にエンコード実装をすることができます。
こうすればJSON形式が変わってもその度にSwiftの方では型を新しく追加する必要はありません。

```swift

struct User: Encodable {
    var id: Int
    var firstName: String
    var userToken: String
    enum CodingKeys: String, CodingKey {
        case user
    }
    private enum NestedKeys: String, CodingKey {
        case id
        case firstName = "first_name"
        case userToken = "user_token"
    }
    func encode(to encoder: Encoder) throws {
        var container = encoder.container(keyedBy: CodingKeys.self)
        var nestObject = container.nestedContainer(keyedBy: NestedKeys.self, forKey: .user)
        try nestObject.encode(id, forKey: .id)
        try nestObject.encode(firstName, forKey: .firstName)
        try nestObject.encode(userToken, forKey: .userToken)
    }
}

let user = try! JSONEncoder().encode(User(id: 0, firstName: "tommy", userToken: "AAAAAA"))
print(String(data: user, encoding: String.Encoding.utf8)!)
```


`CodingKeys`に`user`というキーを指定して、さらにネストされた各キーを`NestedKeys`で指定します。

`func encode(to encoder:)`を実装することで独自にエンコードすることができます。
`encoder.container`でトップのコンテナを取得した後に、`container.nestedContainer`メソッドを実行することで、ネストされたObjectを取得できます。
あとは`encode`メソッドで各プロパティをエンコードすればよいです。


結果

```json
{
  "user": {
    "id": 0,
    "first_name": "tommy",
    "user_token": "AAAAAA"
  }
}
```

# まとめ

独自でEncodableでエンコードする方法を紹介しました。
Encodableが自動で行ってくれるのもいいのですが、今回のように「ネストされたデータ形式は今まで同じだから型を新しく作るまででもない」っていう時は上手くハマると思います。
【シェルスクリプト】コマンドの有無による条件分岐

## はじめに
シェルスクリプトでコマンドが入っていなかったらインストールするようなスクリプトが書きたかった。
メモとして残しておく

## コマンドの有無による条件分岐
typeを使う

``` sh:hoge.sh
if type "コマンド" > /dev/null 2>&1; then
    echo "exist!"     #コマンドが存在する時の処理
else
    echo "NOT exist!" #コマンドが存在しないときの処理
fi
```

## コマンドが入っていなかったらインストール
対象のコマンドが入っていなかったらインストールするときは、こう。

``` sh:fuga.sh
if !(type "コマンド" > /dev/null 2>&1); then
    # 対象のコマンドをインストールするような処理
fi
```

以上

## 参考
* [typeコマンド](https://bash.open-code.club/Linux%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89/T/type.html)
* [シェルスクリプトでコマンドの有無を確かめる](http://please-sleep.cou929.nu/check-command-existence-on-shellscript.html)
* [Bashでコマンドの存在チェックはwhichよりhashの方が良いかも→いやtypeが最強](https://qiita.com/kawaz/items/1b61ee2dd4d1acc7cc94)

---

> ### 余談 - 追記(2018/02/21 13:28)
> 本記事のhoge.shの実装だと、「コマンドが存在するときの処理だけをgrepしにくい。」、というアドバイスをいただいた。

> そういうときは、強調の「do」や「does」を使ってメッセージの識別性を高めるといった方法が有効らしい。(勉強になる...)
> 実装は以下の通り、

> ``` sh:ex_hoge.sh
if type "コマンド" > /dev/null 2>&1; then
    # echo "exist!"
    echo "do exist!"  #コマンドが存在する時の処理
else
    echo "NOT exist!" #コマンドが存在しないときの処理
fi
```
> 参考: [運用者に優しいエラーメッセージ](https://qiita.com/aim120g/items/3445b34039a8dafaf57a) by [@aim120g](https://qiita.com/aim120g) さん
> [@7of9](https://qiita.com/7of9) さん、アドバイスありがとうございました。
別ブックへのリンクはどこ？

# こんな警告が出るとき
![image.png](https://qiita-image-store.s3.amazonaws.com/0/214653/5f27e0cc-f074-fae1-b07c-b0643c50eab6.png)
このブックには、ほかのデータソースへのリンクが含まれています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/214653/9fa9f658-ba7b-6938-f781-cdc706e5a936.png)
リンクの自動更新が無効にされました

![image.png](https://qiita-image-store.s3.amazonaws.com/0/214653/bd37ca8b-d228-35be-229e-a9f4325f5eb3.png)
このブックには更新できないリンクが 1 つ以上含まれています。
・
・
・

だいたいは数式に別ブックへのリンクが貼られていることが多いけど、それよりも↓の3つを先に調べたほうが解決時間が短くなることが多い。

# この辺を調べると解決できる(ことがある)
1. 名前の定義
![image.png](https://qiita-image-store.s3.amazonaws.com/0/214653/0ce9291d-eedf-eed3-d0da-fd61c7036db5.png)

1. 条件付き書式
![image.png](https://qiita-image-store.s3.amazonaws.com/0/214653/4b18c78f-09ba-e689-e711-9933f99e68b8.png)

1. データの入力規則
![image.png](https://qiita-image-store.s3.amazonaws.com/0/214653/77205526-66eb-a8cd-c2de-ad82321682b1.png)
LinkIt Smart 7688 用 OpenWRTのコンパイル方法

* OpenWRT Chaos Calmerのコンパイル方法

- Download
-- https://git.openwrt.org/?p=15.05/openwrt.git;a=tree;h=c170d84bbe08e0f049c99d3f376aae170a36458e;hb=c170d84bbe08e0f049c99d3f376aae170a36458e
- cd openwrt
- cp feeds.conf.default feeds.conf
- echo src-git linkit https://github.com/MediaTek-Labs/linkit-smart-7688-feed.git >> feeds.conf
- ./scripts/feeds update
- ./scripts/feeds install -a
- make -i menuconfig
-- Target System: Ralink RT288x/RT3xxx
-- Subtarget: MT7688 based boards
-- Target Profile: LinkIt7688
-- Global build settings->Compile with support for patented functionality
-- Libraries->IoT->libupm
-- Libraries->libmraa
- make -j1 V=99
- vi build_dir/host/automake-1.15/bin/automake.in
-- https://github.com/openwrt/openwrt/issues/507
- make -i -j1 V=99
- make -j1 V=99
homebrew導入時エラーについて

# 概要
macOS High Sierra (10.13.3)にhomebrewをインストールしようと公式のコマンドを叩いたところエラーが出た。

* インストールコマンド
* 
```
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

* エラー
* 
```
curl: (77) error setting certificate verify locations:
  CAfile: /usr/local/etc/openssl/cert.pem
  CApath: none
```

# 解決策
httpsでアクセスする際のcurlの証明書関係のエラーのようで、解決策が無いかと色々探したが、よくよく考えたら

1. curlを使わず、https://raw.githubusercontent.com/Homebrew/install/master/install にブラウザからアクセス
2. 右クリックでファイルの内容をダウンロード(ex. ファイル名: install_brew)
3. rubyで実行
```
/usr/bin/ruby install_brew
```

でよかった。
[Salesforce][WebDriverIO][XPath] SFDC の項目を参照する XPath サンプル

E2Eテストを [WebDriverIO](http://webdriver.io/) で自動化しています。
通常のフォームなどでは、項目をつかむ（参照する）には id を付与して如何様にでもすればOKです。

``` ref-by-id.js 
 let myButton = $('#myButton');
 myButton.click();
```

しかし、 Salesforce のオブジェクト詳細画面などでは各項目の id は Salesforce ID っぽい規則性のない値が振られてしまうため id で参照することはできません（厳密にはできなくはないですが、項目の増減に柔軟に対応できません）。

そこで、 WebDriverIO ではセレクタに XPath が使えるので XPath で各項目のラベルから項目をつかむようにしています。
※ 注意： Lighting には非対応です。

``` ref-by-xpath.js
let label;
let selector;

/* 詳細画面の当該オブジェクトの各項目値を包含するブロックの参照 */
label = '項目名';
selector = "//table[@class='detailList']/tbody/tr/td[text()='" + label + "' and contains(@class, 'labelCol')]/following-sibling::td[1]/div";

/* 詳細画面上部の hover リンク（関連リストへのリンク） */
label = 'オブジェクト名';
selector = "//span[@class='listTitle' and text()='" + label + "']/parent::a";

/* 詳細画面 関連リスト内の当該オブジェクトへのリンク */
label = 'オブジェクト名';
selector = "//h3[contains(@id, '_title') and text()='" + label + "']/../../../../../../div[@class='pbBody']//tr[contains(@class, 'dataRow')]/th[@scope='row']/a";

/* 詳細画面 関連リスト内のボタン */
label = 'ボタン名';
selector = "//td[@class='pbButton']/input[@value='" + label + "']";

/* 詳細画面上での編集用オブジェクト（選択リスト) */
label = '項目名';
selector = "//table[@class='detailList']/tbody/tr/td[text()='" + label + "' and contains(@class, 'labelCol')]/following-sibling::td[1]/div[2]//select";

/* 保存ボタン */
selector = "//td[@id='topButtonRow']/input[@name='inlineEditSave']";

/* 当該オブジェクトの登録、更新画面の各項目値の入力UI */
label = '項目名';
selector = "//table[@class='detailList']/tbody/tr//*[normalize-space()='" + label + "']/../following-sibling::td[1]//*[self::input or self::select or self::textarea]";
```

selector でつかんだら、後は click するなり、値を check するなり、 input するなり自由にできます。

``` action.js
let item = $(selector);

/* クリック */
item.click();

/* 値のチェック ( chai が必要です ) */
expect(item.getText()).to.equal('項目値');

/* 値の入力 */
item.setValue('入力値'); // text or textarea
item.selectByValue('選択値'); // select
item.click(); // radio or checkbox
```

当然、 Salesforce の画面仕様が変われば selector は変えないといけませんが、 2018/02/21 現在はこれでいけます。
Power BIでテーブルをフィルタして値を計算するとき、"+ 0"を追加しておくと便利

以下のようなデータ（Tableと名付けます）を読み込み、「総売上に対する商品Aの売上比率」を各都市ごとに計算したいとします。

![Table.jpg](https://qiita-image-store.s3.amazonaws.com/0/203824/cfc49c59-90f3-3075-d56e-3f49c18224d5.jpeg)

新しいメジャーを作成し、以下のようにDAXを書くとします。一応説明しておきますと、Item = "A"の行のRevenueを合計し、それを全行のRevenueの合計で割っています。

```
Rate of Item A = 
DIVIDE(
    CALCULATE(SUM('Table'[Revenue]), 'Table'[Item] = "A"),
    SUM('Table'[Revenue])
)
```
この値を各都市ごとにビジュアライズしてみましょう。

![Chart1.jpg](https://qiita-image-store.s3.amazonaws.com/0/203824/65d10db2-33fe-19e5-02fb-05f1ffa50f76.jpeg)

名古屋のデータが表示されません。これは名古屋には商品Aの売上レコードがない為、CALULATEの返す値が0ではなくNULL（なのか分かりませんが、数値ではない）為です。

解決の為にもちろん売上0円でもレコードを存在させるようにすればこの問題はありませんが、必ずしもデータをそのように作れるとは限りません。

こういった場合、CALULATEの結果に"+ 0"を付けるだけで問題が解決できます。

```
Rate of Item A = 
DIVIDE(
    CALCULATE(SUM('Table'[Revenue]), 'Table'[Item] = "A") + 0,
    SUM('Table'[Revenue])
)
```
このDAXにするとチャートはどうなるでしょうか。

![Chart2.jpg](https://qiita-image-store.s3.amazonaws.com/0/203824/7f4f66a0-06c0-9e9e-a86d-7337c0cbdd9b.jpeg)

これで名古屋のデータも表示されるようになりました。
Chrome DevToolsで変更したCSSを保存する方法

# やりたいこと
Chrome DevTools上でデザインを調整した後、その内容を保存したい。

# 問題点とか
以前はローカルファイルを直接書き換えるようにできたが、調べた範囲だと今はできなくなった模様。
参考： http://ys.moon-sky.net/usage-css-mapping-on-workspace/

そもそも、CSSを直接書き換えても、SCSSやCSSinJSなどに再度書き直さないといけないので、ローカルにあるCSSを変更するのではなくて、変更した内容をCSSファイルに書き出して欲しい。

# Finch Developer Toolsを使おう
[Finch Developer Tools](https://chrome.google.com/webstore/detail/finch-developer-tools/phgdjnidddpccdkbedmfifceiljljgdo) というChrome Extensionを使って実現。

![スクリーンショット 2018-02-21 08.18.02.png](https://qiita-image-store.s3.amazonaws.com/0/114828/36dd2b57-5fb4-c3b3-eb72-2458f0e587f9.png)

## メリット
- DevTools上でのCSS変更内容をダウンロードできる
- 差分表示されるので変更点がわかりやすい
- 間違えてブラウザをリロードしてしまっても変更内容が消えない

## やり方
1. [Finch Developer Tools](https://chrome.google.com/webstore/detail/finch-developer-tools/phgdjnidddpccdkbedmfifceiljljgdo) をChromeへ追加する
2. 念のためChromeを再起動する（しなくても動くかも）
3. 適当なページでDevToolsを開く（⌥Option + ⌘Command + i)
4. 適当な箇所のCSSを変更してみる（今回は背景色を変更してみた）
![スクリーンショット 2018-02-21 08.23.53.png](https://qiita-image-store.s3.amazonaws.com/0/114828/e44ed826-36f4-2ff9-380d-e8fc46f344b6.png)

5. [Finch]タブを開くと、先ほどの変更内容が表示されている。
![スクリーンショット 2018-02-21 08.25.36.png](https://qiita-image-store.s3.amazonaws.com/0/114828/54c638fd-48bc-8738-7fc7-efa94eb6b087.png)

6. 後は変更内容を見ながら元ファイルを編集するなり、そのままダウンロードして保存しておくなり。
7. ブラウザをリロードしても変更内容は消えないので、右上のFinchアイコンから[Clear Changes]をクリック
![スクリーンショット 2018-02-21 08.29.14.png](https://qiita-image-store.s3.amazonaws.com/0/114828/f1e762da-cd56-5a78-f291-e422f98c269b.png)

# まとめ
これでインブラウザデザインが捗る！気がする。
DevToolsの標準機能でも出来るよ！という情報があれば是非コメントをください。
Angularで作るER DIAGRAM TOOL - 第一回　Cloud9へAngularをインストールする

自前で開発しているLaravel用Scaffoldパッケージが、
複雑化するとともに、JSONデータを書くのが煩雑になってきたため、
Angularの勉強もかねて、ER図作成ツールを作ることにしました。

■開発環境
IDE：Cloud9
開発言語：Typescript
フレームワーク：Angular v5.2.3
CSSフレームワーク：ngx-bootstrap
JSライブラリ：jsplumb Community Edition

■機能要件
・Model(Table)の作成・修正・削除
・Schema(Column)の作成・修正・削除・並び替え
・Relationship(one-to-many or many-to-many)の作成・削除
※one-to-manyの削除は、targetのSchemaを削除で実装
※many-to-manyの削除は、pivot modelの削除で実装
・JSONのエクスポート

■gitリポジトリ（随時更新）
https://github.com/dog-ears/er-diagram-tool

自分が、Angular初心者なので、
初心者にもわかりやすい解説をしようと思ってます。

では、まずCloud9へAngularをインストールしましょう。

##（１）Cloud9

■cloud9
https://c9.io/

アカウントを作る、またはGithubのアカウントでログイン。
Create new workspaceする。

・templateはblankを選択
・READMEは削除



##（２）nodeとnpmのアップデート

もともとのバージョン（2018/2/6現在）
node v6.11.2
npm 3.10.10

■nodeJS 公式
https://nodejs.org/

Recommended Version は 8.9.4なので、
それをインストールする。

//node アップデート
`nvm install v8.9.4
nvm alias default v8.9.4`

node v8.9.4に
npm 5.6.0になりました。



##（３）Angularのインストール

公式に従って、AngularCLIを使用。

// Angularのインストール
npm install -g @angular/cli

// プロジェクトの作成
ng new er-diagram

ルート直下にer-diagramフォルダができるが、不要なので、階層を変更します。

`shopt -s dotglob
mv er-diagram/* ./
rm -rf er-diagram`

// ドキュメントルートを変更
`sudo vi /etc/apache2/sites-available/001-cloud9.conf`

・iで編集モードに移行。
・終了するときは、escキーを押して、:wq!で保存終了できます。

[変更]
DocumentRoot /home/ubuntu/workspace
↓
DocumentRoot /home/ubuntu/workspace/dist

これで、
`ng build`
を実行すると、distフォルダが生成されます。

distフォルダ内のindex.htmlを開いて、「Run」でプレビューしましょう。
※表示されるurlは、https://***.c9users.io/dist/index.htmlで、notFoundになるため、
https://***.c9users.io/を開きましょう。

なお、作業中は、
`ng build -w`
を実行すれば、ファイル状況を監視するようになり、
保存するたびに自動で更新されます。


##（４）githubの設定
Angular CLIでインストールした時点で、git init されてます。
なので、リモート設定して、pushします。

`git remote add origin git@github.com:dog-ears/er-diagram-tool.git
git push -u origin master
git tag 0.1.0
git push origin 0.1.0`

■github
https://github.com/dog-ears/er-diagram-tool/tree/0.1.0

今回はここまで。
次回は、ngx-bootstrapのインストール、google material iconの追加、ナビバーの作成を行います。
MemoryEnhancer > MEGLV > UI > 音声によるコマンド受付の応答 | sayコマンドのセットアップ(Ubuntu 16.04 LTS)

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04 LTS desktop amd64
TensorFlow v1.2.1
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
scipy v0.19.1
geopandas v0.3.0
MATLAB R2017b (Home Edition)
ADDA v.1.3b6
Jaybird RUN (ワイヤレスイヤホン)
```

プロジェクト開始: https://qiita.com/7of9/items/4077c92b9a773e054193

### 音声によるコマンドの確認

[MemoryEnhancer > MEGLV > udpGraph_180218.ipynb > v0.1, v0.2 > ESP8266+MPU-9250測定データの確認用リアルタイムグラフ出力](https://qiita.com/7of9/items/bbec0f600f5ef1d831d8)
によるUIを検討中。

グローブ型のESP8266 + MPU-9250の動きにより、いくつかのコマンドを実装する。

- Home position
    - コマンド受付状態
    - 手のひらは下
- ~~right rotation (仮)~~
    - 腕を右回転
    - 回転の定義が色々あり、分かりにくい
- vertical upward (仮)
    - 腕を天頂角0度にした状態
- palm upward (仮)
    - 手のひらを上にする
- etc

コマンドの識別として音声で応答があれば画面の前にいなくてもよくなる (JaybirdのRUNの音声ステータス表現のように「Fully charged」「80%」「connected」「power off」...) 。

### setup

https://askubuntu.com/questions/501910/how-to-text-to-speech-output-using-command-line

```bash
$ sudo apt-get install gnustep-gui-runtime
...
$ say "hello"
$ say "home position"
$ say "right rotation"
$ say "vertical upward"
```

何種類のコマンドが識別できるかは実際にデータをとってから検討することになる。
TensorFlowが必要か、シンプルな処理で識別できるか。

### 思いつき

[リスニング > ラスボス > Part 1](https://qiita.com/7of9/items/7e76ec3db33dbe268e08)の動画の中で女の子が父親のPCにハッキングしてsayコマンドを使っていたのを思い出した。
(父親：「なんで俺のPCはしゃべっているんだ?」)
DockerをつかってZendFramework3+mysqlの環境を構築する

# はじめに
インターンシップで使うということでPHPのZendFrameworkとmysqlの環境構築をしてみました。
phpは初めてで、Dockerも慣れてなく割と苦労したのでまとめます。
もっといい方法ある！とかあれば教えてほしいです。

**対象読者**
- ZendFrameworkを利用したアプリ開発がしたい方。
- apacheとかnginxとかをインストールしたくない方。※1
- PHPの開発環境を作ってみたい方。※2

※1 Dockerを利用するとわりとブリッジ周りが荒れたりします。
※2 PHP始めるならもっと新しいフレームワークもあるのでfuelPHPとかcakePHPとかも見てから決めるほうがいいと思います。

**記事の内容**
- Dockerfile, docker-composeを利用してphpの環境を構築します。
- mysqlで実行時にユーザ、DB、テーブルを作成します。

**動作環境**
- OS Arch Linux x86_64
- カーネルバージョン 4.15.3-2-ARCH
- Docker 18.02.0-ce
- docker-compose 1.19.0

# 結果
下記をクローンしてもらって`docker-compose up --build`を実行するとSkeleton Applicationの起動、テーブルの作成が行われます。
GitHub : https://github.com/Juju-62q/ZendFrameworkWithMySQL.git

# リポジトリの説明

## Dockerに関して
phpのDockerimageを引っ張るようにしています。
phpとapacheの環境を引っ張っており環境変数の設定とcomposer.jsonからのインストールをしています。

```dockerfile:Dockerfile
FROM php:7.2-apache

RUN apt-get update \
 && apt-get install -y git zlib1g-dev \
 && docker-php-ext-install zip pdo_mysql mysqli \
 && a2enmod rewrite \
 && sed -i 's!/var/www/html!/var/www/public!g' /etc/apache2/sites-available/000-default.conf \
 && mv /var/www/html /var/www/public \
 && curl -sS https://getcomposer.org/installer \
  | php -- --install-dir=/usr/local/bin --filename=composer

RUN yes | pecl install xdebug 

WORKDIR /var/www
```

phpのファイルに加えてmysqlを追加しています。データの保存にはbusyboxを利用しました。
.envという環境変数の読み込みやDockerとホスト間で共通のリソースとなる部分の追加をしています。

```yml:docker-compose.yml
version: '2'
services:
  zf3:
    build: .
    ports:
      - "80:80"
    volumes:
      - .:/var/www
    env_file: ./.env
    links:
      - mysql

  data:
    image: busybox
    volumes:
      - ./misc/data:/var/lib/mysql

  mysql:
    image: mysql:5.7
    env_file: ./.env
    ports:
      - "3306:3306"
    volumes_from:
      - data
    volumes:
- ./sql/:/docker-entrypoint-initdb.d/
```

## MySQLの環境変数の設定
.envファイルにmysqlに関する環境変数を設定しています。
変数はその名の通りで上からrootパスワード、追加するユーザ、追加したユーザのパスワード、データベース名となっています。
ホスト名はphpからmysqlにアクセスする際に利用できます。
作成されるユーザはall grantの権限で作成されます。
なお、見られると良くないので.gitignoreに追加するといいかと思います。

```shell:.env
MYSQL_ROOT_PASSWORD=root_password
MYSQL_USER=zend
MYSQL_PASSWORD=zend_password
MYSQL_DATABASE=db
MYSQL_HOST=mysql
```

## MySQLでテーブルの作成
sql/以下のファイルがコンテナ作成時に自動実行されます。
ここではpersonという名のidと名称と作成時刻を持つテーブルを作成しています。

```sql:initial.sql
CREATE TABLE `person` (
  `id` int(20) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(20),
  `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
```

## ZendFramework関係ファイル
数が多いのでテーブルにまとめました。このあたりはZend Frameworkの解説を見たほうがいいと思います。

| ディレクトリ名 | 使いみち |
|:---:|:---:|
|config |設定ファイル(読むべきディレクトリや、DB接続情報等) |
|module |ZendFrameworkのアプリケーションの実態 |
|public |公開されているファイル |
|vendor |composerで追加されるファイル等(大きいので必要に応じてignore) |
|misc |データベースの実データ |

# ZendFrameworkを利用した開発について
ZendFrameworkの公式チュートリアルを見ながら作っていくといいと思います!

Zend Framework Quick Start
https://framework.zend.com/manual/1.12/ja/learning.quickstart.html

# おわりに
初めてのphpでの環境構築でした。Dockerに慣れていないこともあり、正直かなり時間がかかりましたがこの記事を見て環境構築の手間がなくなれば嬉しいです。
XDebugがまだ正常に動かせていないのでどなたか教えてほしいです。(分かり次第追記したいと思います。)
Alibaba Cloud OSS Image Serviceをさわってみた

[Alibaba Cloud OSS Image Service](https://jp.alibabacloud.com/help/doc-detail/44686.htm)をさわってみました。

# 必要なもの
* Alibaba Cloudアカウント


# 作業概要

　1. 画像のアップロード
　2. スタイルの作成
　3. プレビューで確認

# 1. 画像のアップロード

　1. ログイン後、[Object Storage Service]を選択します。
　2. 適当なバケットを作成します。
　3. 作成したバケットに画像ファイルをアップロードします。

PNGファイルのアップロード後の画面です。
<img width="763" alt="file.png" src="https://qiita-image-store.s3.amazonaws.com/0/192584/580ee234-a4b8-e398-7327-987a854ccf81.png">

# 2. スタイルの作成

あらかじめ、画像処理したい内容をスタイルとして定義します。
定義は、コンソール上で選択する[基本編集]と、直接操作名とパラメータを指定する[高級編集]の2種類があります。
今回は3種類定義してみました。

### 1. ウォーターマーク(テキスト)

<img width="379" alt="def.png" src="https://qiita-image-store.s3.amazonaws.com/0/192584/510de798-3c8e-b1a4-ca4b-9c30be6dba24.png">


### 2. トリミング(角丸の長方形)

```
image/rounded-corners,r_30
```

### 3. トリミング(円形)

```
image/circle,r_300
```

### 4. 作成したスタイルの一覧

<img width="1129" alt="style.png" src="https://qiita-image-store.s3.amazonaws.com/0/192584/2892ca12-98b8-befc-fabb-c8e9dcd1cb65.png">


# 3. プレビューで確認

コンソールでファイルを選択すると、プレビュー画面が表示されます。
[イメージスタイル]で作成したスタイルを指定すると変換後の画像を確認することができます。

### 1. ウォーターマーク(テキスト)

<img width="495" alt="watermark.png" src="https://qiita-image-store.s3.amazonaws.com/0/192584/8dc95194-76b0-3de0-5a1c-2f771373f716.png">

### 2. トリミング(角丸の長方形)

<img width="497" alt="round.png" src="https://qiita-image-store.s3.amazonaws.com/0/192584/5a3562aa-181a-997d-9e75-8035a7f95e58.png">

### 3. トリミング(円形)

<img width="496" alt="circle.png" src="https://qiita-image-store.s3.amazonaws.com/0/192584/a5948d83-bd76-13f7-2f1d-eed5f74f5862.png">


# 雑感
画像変換処理がオブジェクトストレージのサブ機能として実装されているところが新鮮な感じがしました。
[Node.js] オブジェクトから特定の key-value だけ抜き出したオブジェクトを作る

[Lodash](https://lodash.com/) の [pickBy](https://lodash.com/docs/4.17.5#pickBy) 、または　[omitBy](https://lodash.com/docs/4.17.5#omitBy)　を使うと簡単です。

``` pickBy-and-omitBy-sample.js
let lodash = require('lodash');

let obj = {
    'pick_a': 'a',
    'pick_b': 'b',
    'omit_c': 'c',
    'omit_d': 'd'
};

/* obj から pick で始まる key だけからなるオブジェクト ( newObj ) を作成する */

let newObj;

// pickBy の例
newObj = lodash.pickBy(obj, function(value, key) {
    return key.match(/^pick_/);
});
// => { 'pick_a': 'a', 'pick_b': 'b' }

// omitBy の例
newObj = lodash.omitBy(obj, function(value, key) {
    return ! key.match(/^pick_/);
    // or return key.match(/^omit_/);
});
// => { 'pick_a': 'a', 'pick_b': 'b' }
```

pickBy は ピックアップするか否かの　boolean を返す function を第二引数に、 omitBy は オミットするか否かの boolean を返す function を第二引数に渡します。
Word2Vecの学習済み日本語モデルを読み込んで使う

##モデルを読み込む
https://qiita.com/Hironsan/items/8f7d35f0a36e0f99752c
上記のサイトに書かれているようにWord2Vecの学習済み日本語モデルを読み込んでみる。

```python

import gensim
model = gensim.models.KeyedVectors.load_word2vec_format('ja.bin', binary=True)
```

するとこんなエラーが

```
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 0: invalid start byte
```

少し調べてみて、引数で`binary=False`にしたり`unicode_errors='ignore'`にしたりしてみたがダメ

もう少し調べてみると、どうやら

**`save_word2vec_format`で保存したモデルは`load_word2vec_format`で読み込めて、
`save`で保存したモデルは`load`で読み込めるらしい**

そこで、モデルを構築しているコードをみているとやはり`save`で保存していたので`load`を試してみる

```python

model = gensim.models.Word2Vec.load('ja.bin')
```
読み込めました

##モデルを使ってみる
ベクトルを取り出す

```python

>> model["日本"]
array([ -1.74537051e+00,  -4.53219324e-01,  -6.23617232e-01,
        -2.89993620e+00,   3.06393117e-01,  -3.30475301e-01,
        -1.27820873e+00,  -1.35765445e+00,  -8.48491848e-01,
        ....
```

類似の単語を探す

```python
>> model.most_similar("日本")
[('ドイツ', 0.5213181376457214),
 ('インドネシア', 0.45377281308174133),
 ('トカラ', 0.4508640170097351),
  ....
```

単語の加減を計算して類似の単語を探す

```python

>> model.most_similar(positive=['姪', '男性'], negative=['女性'])
[('叔母', 0.5650175213813782),
 ('伯母', 0.5648938417434692),
 ('甥', 0.5636885762214661),
 ('義弟', 0.550722599029541),
 ('義妹', 0.5479429960250854),
```

(正解は"甥")


参考:https://qiita.com/naotaka1128/items/2c4551abfd40e43b0146
Rustのpiston_windowのループをmatch式で処理する最新の書き方

### 始めに
今回初めてQiitaに投稿してみました。「ちゃんと調べりゃわかるだろ！」とかはあるとは思うんですけど、Rustに関してはいかんせん日本語の記事が少ないし、自分用のメモとしても経験としてもこうして書いてみようと思いました。

では本題入ります。

# 古い記事が多い
現在pistonを利用したゲームを作りたいとちまちま勉強しています。
Rustに関する記事で、piston_windowクレートを利用しているものはいくつもあったのに、その内容が古かったり、そもそもこれで動いていたのか？というものがいくつかあり、その中でもなんとか動くように書き直して使いたいというものがありました。

pistonを用いたゲーム製作について調べていると、描画と更新の処理をmatchで分岐させる書き方を以下のブログなどで見かけました。が、コピペしても動かず、また似たような書き方を探しても見つからなかったため、今風?の書き方を調べてみました。(英弱にはツラかった。。。
[A RUST/PISTON GAME DEVELOPING TUTORIAL](http://piston-tutorial.logdown.com/posts/306682)
[Getting started with Piston, a game library for Rust](https://leotindall.com/tutorial/piston-a-game-library-in-rust/)

## じゃあコード書いてみます
バージョンは1.24.0(stable)です。

```rust
// クレートのインポート
extern crate piston_window;
use piston_window::*;
```
```rust
// ウィンドウの作成
let window: PistonWindow = WindowSettings::new("title", [640, 480])
  .build().unwrap();
```
ここまでは大体どこも一緒です。
ちなみにこの後メインループの処理に入るのですが、だいぶ前から更新されていないようなサイトでは以下のように書いてあるものがあるので注意です。~~(例えば、意外にも[crates.ioのpiston_window](https://crates.io/crates/piston_window/0.12.0)のページとか)~~こちらは古いページでした。最新のページではちゃんと`Some(e)`を使った書き方になっていました。

```rust
// 古い書き方
for e in window {
  // 中の処理
}

// 現在の書き方
while let Some(e) = window.next() {
  // 中の処理
}
```
そしてここからが今回記事を書くに至った処理方法です。

```rust
// 以下を追加
use piston_window::Event::*; // Event::Loop()用
use piston_window::Loop::*; // Loop::Render(), Loop::Update()用
```
```rust
while let Some(e) = window.next() {
  // ここ
  match e {
    Loop(Render(_)) => {
      // レンダリング(描画)に関するフレームで入るブロック
      // draw_2d()なんかはここで呼ぶ
    }
    Loop(Update(_)) => {
      // アップデート(更新)に関するフレームで入るブロック
      // 例えば移動するボールの座標更新なんかはここで行う
    }
    _ => { }
  }
}
```
追加のuseは無くてもいいのですが、その場合は`Event::Loop(Loop::Render(_))`などとそれぞれを書き直してください。

大学の授業の方針でProcessingを触っていた自分としては、描画と更新は同時にやればいいんじゃないの？と思ったんですけど、実は`Loop(Update(_))`に入るときは描画処理は一切行われないようです。描画とはこういうものなのだろうか...
`(Loop(Render(_))`を空にして、`Loop(update(_))`に描画処理と、確認の`println!`などを用意しておくとわかります）

ちなみに、`Render()`や`Update()`に引数を与えると、ブロック内で引数に情報を付加させて利用できます。

```rust
Loop(Render(r)) => {
  // r: RenderArgs
}
Loop(Update(upd)) => {
  // upd: UpdateArgs
}
```
例えば、upd.dtでデルタタイムが取得できます。
詳しくは[リファレンス](http://docs.piston.rs/piston_window/input/enum.Loop.html)を見てもらえればわかると思います。

## 終わりに
リファレンスが英語しかないのはしょうがないですが、もう少しわかりやすいといいですね...。自分の力不足をひしひしと感じました。
他にももうすこし日本語の記事が増えるといいですね。

あとこういう書き方の方がいいよ、など意見がありましたらぜひご教授ください。よろしくお願いします。
railsでhome画面のrouting-controller-viewを設定する

今回も備忘録的に。

もっとQiitaの使い方に慣れたい。泣

まず、routing-controller-viewの役割として、

PCからサーバーへのリクエストを返すレスポンスの仕組みであること。

例えば、https://hogehoge/qiitaをリクエストした場合、

このqiitaの部分がパスとなるので、

get 'qiita' => 'qiita#index'

みたいな書き方をすることでindexをアクションとすることができます。

このindexアクションはcontrollerに定義するので、ターミナルを使ってqiita-controllerを作る必要があります。

rails g controller qiita

これでcontrollerの生成が完了。

ちなみにcontrollerを消したくなったら

rails d controller qiita

で、生成時に作ったファイルも一緒に削除してくれるので便利。

routingに書いたqiitaアクションがcontrollerで定義されたので、

次はviewの設定ですね。

viesファイル以下に、index.html.erbというファイルを作成しましょう。

ここで分かることは、viewファイルはcontrollerと同じ名前のフォルダにあるアクションと同じ名前のファイルが実行されるという点。

作ったviewファイルにhmtlなどを記述、layoutsファイルには全ページ共通の要素を入れることができるのでうまく活用したいです。
The name org.freedesktop.PolicyKit1 was not provided by any .service files

```:エラー
The name org.freedesktop.PolicyKit1 was not provided by any .service files
```

[The name org.freedesktop.PolicyKit1 was not provided by any .service files - みちのいに!!](http://m77.hatenablog.com/entry/2015/03/05/111930)

#権限がない。
sudo。以上
Viが終了できない（E20: Mark not set）

Viで編集終了のため `:` を押下しても入力されない。

```:
E20: Mark not set
```

#言語設定が原因
[「E20: Mark not set」と表示されいくつかのViコマンドが使えない。](http://kajuhome.com/cgi-bin/patio/patio.cgi?mode=view&no=697&p=2)によるとキーボードの言語設定が原因。

キーボードの設定を日本語にするとなおった
（方法は各自で調べて）

編集状態なら`Shift` + **`;`**で`:`が入力できる
Vi で方向キーを押すとABCDになる

Viで方向キーの割り当てが `ABCD`になっている。 

```:エラー
ABCD
```

そもそも挿入モードを押しても`-- INSERT --`が表示されない

#原因はvi互換モード

[Vimで方向キーを押すとABCDが出る問題を直す](http://marupeke296.com/IKDADV_PI_ABCDProb.html)で解決

投稿によると互換モードになっていることが原因で、`:set nocompatible`するか、`.vimrc`に設定すればなおった
※sudoする場合はrootも忘れずに

```:.vimrc_設定例
set nocompatible
```
移行アシスタントでデータ移行したファイルが開けない (OSX High Sierra)

# はじめに
移行アシスタントでデータ移行したら新しいMacの方で古いMacから移行したファイルが開けなくなった。
> 「“ファイル名”は壊れているため開けません。 ゴミ箱に入れる必要があります。」

解決できたので共有する。

## 解決策
切り分けしたところHFS PlusのEA (拡張情報) が原因だとわかったので
> % xattr -cr /Users/user/

したら解決した。

とはいえ、この解決策は脳筋対処でしかないので変な副作用が起こらないとも言えない。
良い子のみなさんは移行アシスタントを使わず手動で新しいMacの環境構築した方が良いと思う。

## 余談
### 他の解決策
試せていないが[移行アシスタントでデータ移行したMacが使えない](https://origin-discussions-jp-dr.apple.com/thread/110197229)によると購入直後やクリーンインストール直後等のユーザ作成前の状態でのデータ移行なら前述のようなファイルが開けない問題は発生しないらしい。

ただ、この解決策を行うためには以下の通り必要物品が多かったため断念した。

#### High Sierraのインストールディスク (USBフラッシュメモリ等) 
>移行アシスタントでは古いMacと新しいMacのOSXのバージョンを揃える必要がある。古いMacがHigh Sierraで新しいMacがSierraだと移行アシスタントは使えない。すでにユーザを作っている場合にユーザ作成前の状態にするにはクリーンインストールを行う必要があるが、新しいMacが2016年モデル以前の場合に内蔵ディスクによるクリーンインストールを試みた際にPreboot問題が発生すると内蔵ディスクによるリカバリができず、インターネットリカバリをしたらSierra以前になってしまう。そこでHigh Sierraのインストールディスクを使ってHigh Sierraをインストールする。

※つまり、新しいMacが2017年モデル以降なら不要。

#### Thunderbolt 3（USB-C）- Thunderbolt 2アダプタ
>「[lua4-u3-agt](http://buffalo.jp/product/wired-lan/lan-adapter/lua4-u3-agt/)」のようなUSB NICだと「開発元が未確認のアプリケーションを開く」で許可した上でドライバのインストールを行う必要があるがその一連の操作はユーザ作成前には実施できない。(参考:[LUA4-U3-AGTをmacOS High Sierraで使う話](https://qiita.com/tfunato/items/7197ddc0e53c9d0dfe64))

#### Apple Thunderboltケーブル
> 同上

### Preboot問題に遭遇した
SMC とPRAMの初期化をした後にインターネットリカバリすることで解決した。
（参考:[Mac > High Sierra > APFSインストール用のprebootボリュームを作成できませんでしたの解決](https://qiita.com/sugasaki/items/3d0a1ae27fc85c7e030f)）
[Swift4] ボタンのクリックイベントを別クラスで拾う

# したいこと
例えば、こんな感じでボタンの設置されたクラスがある

```swift
class ItemView: UIView {

    func hogehoge() {
        let btn = UIButton()
        btn.addTarget(self, action: #selector(self.btnClick(btn: )), for: .touchUpInside)
        self.addSubview(btn)
    }

    @objc func btnClick(btn: UIButton) {
        print("btn clicked")
    }
        
}
```

<font color="ORANGE">このクリックイベントをViewControllerクラスでも拾いたい!</font> ということ


```swift
class Box_VC: UIViewController {
    @IBOutlet weak var itemView: ItemView!

    // itemViewのクリックイベントを拾って色々したい！
}
```

# 簡単
まずは、イベントのターゲットを追加

```swift
class ItemView: UIView {

    func hogehoge() {
        let btn = UIButton()
        btn.addTarget(self, action: #selector(self.btnClick(btn: )), for: .touchUpInside)

        // 追加
        btn.addTarget(nil, action: #selector(Box_VC.btnClick(btn:)), for: .touchUpInside)

        self.addSubview(btn)
    }

    @objc func btnClick(btn: UIButton) {
        print("btn clicked")
    }
        
}
```

次に、ViewControllerでちゃんと拾ってあげる

```swift
class Box_VC: UIViewController {
    @IBOutlet weak var itemView: ItemView!

    // 追加
    @objc func btnClick(btn: UIButton) {
        print("yeah")
    }
}
```

# 備考
- イベントは**ターゲット指定順**に呼ばれる
- 追加したaddTargetの第一引数は、Box_VC()でも可。違いは**[ResponderCahin](https://developer.apple.com/documentation/uikit/touches_presses_and_gestures/understanding_event_handling_responders_and_the_responder_chain)**で発火させるかどうか。

```swift
// これもok
btn.addTarget(Box_VC(), action: #selector(Box_VC.btnClick(btn:)), for: .touchUpInside)
```
IonicでOSに依存しないファイル選択・読み込み

# 今回やったこと
IonicベースのアプリでAndroid・iOS問わずファイル選択画面→読み込みを実装しました。
※文字コード変換付き

# 悪戦苦闘
Ionicベースのアプリ開発中にユーザーの任意のファイルをロードしたくなりました。でもAndroidでもiOSでもというのが意外と大変で...stackoverflowにもスレが結構立っています。

## 初手

Ionic native APIの[File API](https://ionicframework.com/docs/native/file/)を利用。でもこれ、**読み込みファイルのパスわかる前提で「ドコドコにあるファイルを読み込むよー」的なところから使うもの**...今回はパスもわからないんですごめんなさい...。

## 次手


一旦iOS対応は諦めて
**Androidのみ対応**なnative APIの[File Chooser API](https://ionicframework.com/docs/native/file-chooser/)を利用。ファイルを選ばせてくれるらしい。Windowsでいうエクスプローラー、MaｃOSでいうFinderかな？
この子はファイルまでのURI（`content://path/to.file`という形式）を拾ってきてくれるので、あとはこれを参照するために[HTTP API](https://ionicframework.com/docs/native/http/)を利用。
**ところがどっこい怒られた**。
エラー：`HttpURLConnection Invalid HTTP method: content`
**AndroidのcontentメソッドはHTTP APIでは読めませんでした。**

## いろいろ考えましたが...。
「そういえばIonicってもともとHTMLなんだから、formで送信すれば良くないですか」と気づきました。
一度[Ionicで使えるForm送信](https://ionicframework.com/docs/developer-resources/forms/)を試してみましたが、`type="file"`だとうまくいかなかったです。（リンク先のIonicのサイトにもtextとかselectしか例がない...うまくいったら教えてくださると助かります）

## 最終結果。
大筋は先程のform利用と同じですが、`<form></form>`は使わずに`<input type="file">`の変更検知でうまくいきました。

```home.html
<label for="js-import-file__form">読み込むファイル</label>
<input id="js-import-file__form" (change)="fileUp($ev)" type="file">
<button id="js-import-file__submit" (click)="submitNewFile()" ion-button block disabled="disabled">読み込み</button>
```

```home.ts

// クラスのフィールド
// のちのち書き込みとかで native API の File を使うときは
// 型名が競合してしまうので File ではなく any に。
private inputFile: any;

// file選択フォームの値（＝選択ファイル）を変更すると発火
public fileUp(ev: Event) {
  this.inputFile = (<HTMLInputElement>ev.srcElement).files[0];
  // ファイル非選択時はButtonをdisabledにします
  if (this.inputFile.name) { // ファイルが選択されているとき
    document.getElementById('js-import-file__submit').removeAttribute('disabled');
  } else { // ファイルが選択されていないとき
    document.getElementById('js-import-file__submit').setAttribute('disabled', 'disabled');
  }
}

// submitボタンおすと発火
submitNewFile() {
  // ローディング画面でも表示...
  let loading = this.loadingCtrl.create({
    spinner: 'circles',
    content: '読み込み中...'
  });
  loading.present();
  // Ionic の native API も使えますが、
  // もし文字コード変換も行うときは Web API の FileReader 使います。
  var reader = new FileReader();
  reader.readAsText(this.inputFile, "Shift-JIS");
  reader.onload = () => {
    // reader.result に読み込んだテキストがいつも通り格納されます。
    // console.log(reader.result);

    // ローディング画面を解除しましょう...
    loading.dismiss();
  }
}


```
Expo で Firebase Authentication で認証する

## 前置き

expo を使う場合、認証周りが非常に面倒臭い印象だったが、 expo と firebase 周りが非常に整理されて使いやすい感じになっていた。

基本的に https://docs.expo.io/versions/latest/guides/using-firebase.html に書いてあるとおりにやるだけでFirebaseの認証が実装できる。

## 手順

- developers.facebook.com/apps > 新しいアプリを登録 > APP_ID と secret_token をメモ
- console.firebase.google.com > アプリを選択 >  Authentication > Sign-in providers > Firebase > Enable にして APP_ID と secret_token を入力

```js
import firebase from 'firebase'

// Firebase web 用の config
const config = {
  apiKey: '<api key>',
  authDomain: '<domain>',
  databaseURL: '<database url>',
  projectId: '<project id>',
  storageBucket: '<sotarge bucket>',
  messagingSenderId: '<id>'
}

firebase.initializeApp(config)

// 認証時のコールバック
firebase.auth().onAuthStateChanged(user => {
  if (user != null) {
    console.log('We are authenticated now!')
  }

  // Do other things
})


// このボタンを render

      <Button
        title="Start with Facebook Auth"
        onPress={async () => {
          const {
            type,
            token
          } = await Expo.Facebook.logInWithReadPermissionsAsync(
            '<Facebook APP ID>',
            {
              permissions: ['public_profile']
            }
          )

          if (type === 'success') {
            // Build Firebase credential with the Facebook access token.
            const credential = firebase.auth.FacebookAuthProvider.credential(
              token
            )

            // Sign in with credential from the Facebook user.
            firebase
              .auth()
              .signInWithCredential(credential)
              .catch(error => {
                console.error(error)
                // Handle Errors here.
              })
          }
        }}
      />

```

## その他の認証

https://stackoverflow.com/questions/44616596/any-way-to-use-firebase-google-authentication-in-expo-create-react-native-app

によると次のようなコードで行けるらしいと書いてあるが、試してはない。まあ雰囲気はわかる。

```js
const googleAuthenticate = (token) => {
  const provider = firebase.auth.GoogleAuthProvider;
  provider.addScopes('profile');
  provider.addScopes('email');
  const credential = provider.credential(token);
  return firebase.auth().signInWithCredential(credential);
}; 
```

要は provider で認証させて token がとれたら provider.credential(token) の結果を firebase.auth().signInWithCredential(credential) すればいいっぽい
CodeIQ 集合写真できれいに写る配置は何通り？

# 集合写真できれいに写る配置は何通り？

2月20日（火）AM10:00の締め切りが過ぎたので投稿します。
CodeIQに[こんな問題](https://codeiq.jp/challenge/3548)があったので解いてみました。

# 問題

```
みんなで集合写真を撮るときの並び方の配置を考えます。
人数が少なければ一列に並ぶこともありますが、横に長くなると
図のように複数列に並ぶことがあります。
```

<img width="215" alt="q118_1.png" src="https://qiita-image-store.s3.amazonaws.com/0/225010/1979a8f5-f76a-f771-45a1-48a00c4debb8.png">

```

複数列に並ぶときは、互い違いに並ばないと全員の顔が見えないので、
前の人の間から顔が見えるように並びます。
また、隣の人とは間を空けずに並ぶものとし、後ろに行けば行くほど人数が少なくなるものとします。

標準入力から人数 n が与えられたとき、n人が並ぶときの並び方が何通りあるかを求め、
標準出力に出力してください。
（個人は区別せず、その配置だけを考えます。）
なお、n は 1≦n≦200を満たす整数とします。

例えば、n=6 のとき、以下の8通りがあります。
```

<img width="400" alt="q118_2.png" src="https://qiita-image-store.s3.amazonaws.com/0/225010/60326a26-cc11-20b3-9b54-b14500d1110a.png">

# 解答

とりあえず何も考えずpython3で書いてみました。

## コード

```python3:codeiq_combination.py
#! python3

# お題：集合写真できれいに写る配置は何通り？

from functools import lru_cache

# num : これから並べる人数, space : すでに並んでいる人の間の数
@lru_cache(maxsize=10000)
def Lineup(num,space):
	if num == 0:
		return 1
		
	count = 0
	for forward in range(1,num+1)[::-1]:
		# 並べられるかチェック
		if forward > space:
			continue
		# 次後ろの人たちの数
		back = num-forward
		tmp = Lineup(back,forward-1)
		cmb = space - forward + 1
		count += tmp * cmb
	return count
		


n = int(input())
result = 0
for forward in range(1, n+1)[::-1]:
	back = n-forward
	result += Lineup(back,forward-1)

print(result)
```

## 解説

基本的には再帰で後ろの人の並び方を求めていく感じで書いていきました。再帰なのですごく処理が重く時間もかかり、実行時間のリミット内に終わらない問題が発生してしまいました。（C++とかでやったら早いのかな？）
私はpython以外で書くのがめんどくさかったのでどうにかして早くする方法はないかを探してみたところ、高速化の定番の**メモ化**を発見しました。

**メモ化**とは、関数実行時の引数と結果を記録しておき、再度その引数で関数を実行するときに、記録していた結果を出力することによって余分な計算を省く高速化の手法です。
ただし関数は引数の値によって結果が一意に決まるものでしか使えません。

今回の再帰呼出に使っている関数は引数の値で結果が固定されているので導入してみました。

メモ化には`lru_cache`というライブラリが用意されているみたいなのでこちらを使いました。

使い方は、以下のようにインポートして再帰関数の上に`@lru_cache(maxsize=10000)`を付けるだけです。

```python3
from functools import lru_cache

@lru_cache(maxsize=10000)
def foo(hoge):
  return foo(hoge-1) 
```

`maxsize`はメモのサイズです。大きく設定すればそれだけ多くのパターンに対応できますがメモリの消費量が多くなりますので注意してください。

これによって数秒かかっていた処理が1秒もかからず処理できるようになりました。すばらしい！

実際に実行してみて体感してみてください。

```:input
100
```

```:output
970174745
```

# 感想

高速化はあまり意識したことがなかったのですが実際問題にぶち当たって、試して体感すると、その重要さと感動に気付かされるものですね。
これから高速化も意識してコードを書いていきましょう。
gnuplotでオセロっぽい図を作る方法

#はじめに
私の研究上
http://journals.jps.jp/doi/10.1143/JPSJ.74.1674 のFig.2
http://journals.jps.jp/doi/abs/10.1143/JPSJ.76.053702 のFig.2
のような**オセロっぽい図**を書く必要が出て来ました。
gnuplot が大好きな私はこれを gnuplot で楽に再現出来ないかと考え、試行錯誤して出来た簡単な方法を紹介したいと思います。
同じくオセロっぽい図を書きたい方(？)に参考にして頂きたいと思います。
#データファイルの準備
まず、黒石と白石の座標データをそれぞれカタマリにして書き下します。

``` position.dat
#white stone
-0.062500 0.062500
-0.187500 0.187500
-0.437500 0.312500
0.062500 0.062500
0.187500 0.187500
0.062500 0.312500
0.437500 0.437500
-0.312500 -0.062500
-0.437500 -0.187500
-0.062500 -0.187500
-0.312500 -0.312500
-0.062500 -0.437500
0.187500 -0.062500
0.062500 -0.187500
0.312500 -0.312500


#black stone
-0.187500 0.062500
-0.062500 0.187500
-0.312500 0.312500
0.312500 0.062500
0.437500 0.187500
0.062500 0.187500
0.312500 0.312500
0.062500 0.437500
-0.062500 -0.062500
-0.187500 -0.187500
-0.062500 -0.312500
-0.437500 -0.437500
0.062500 -0.062500
0.187500 -0.187500
0.437500 -0.312500
```
一行の座標が石一個の座標に対応しているワケです。
#プロットする
マス目を書く必要があるのでグリッドを入れます

```
set grid
```

オセロっぽく正方形にするために

```
set size square
```

目盛りの間隔は丁度石が一個になるように

```
set xrange[-0.5:0.5]
set yrange[-0.5:0.5]
set xtics 0.125000
set ytics 0.125000
```
黒石、白石のプロット点をindexによって指定します。
index 0 が1つ目の塊、index 1 が２つ目のカタマリなので

```
plot "position.dat" index 0 w p ps 4.0 pt 7 lt -1 notitle
```

まとめると、

``` perl:stone.plt
set xrange[-0.5:0.5]
set yrange[-0.5:0.5]
set xtics 0.125000
set ytics 0.125000
set grid
set nokey
set size square                                                            
set tics font "Helvetica,0.1"
plot "position.dat" index 0 w p ps 4.0 pt 7 lt -1 title "-1","position.dat" index 1 w p ps 4.0 pt 6 lt -1 title "+1"
set terminal postscript enhanced color
set terminal postscript font "Helvetica,0.1"
set output "stone.eps"
replot
```
という感じになります。

#完成
プロットしてみました。
![stone.png](https://qiita-image-store.s3.amazonaws.com/0/238983/5ee21473-8b19-e0bc-99e1-fad76cbafd72.png)
**オセロっぽい**

#使用例
完成した図に更に色々書き加えて投稿論文のFig.4に載せました。
http://iopscience.iop.org/article/10.7567/JJAP.57.030309
(arXiv:https://arxiv.org/abs/1710.04812)
JavaScriptのプロトタイプチェーン（継承）について　ES6のclass

[前回](https://qiita.com/maron8676/items/7476fcbaf08ae4f1a39d)に続いて、プロトタイプチェーン（継承）を勉強というか調べてみました

ECMAScript6ではclass構文が使えるので以下のように書けますが

```javascript:es6.js
class Dog{
  constructor(name){
    this.name=name;
    console.log('dog');
  }
  say(){
    console.log(this.name);
  }
}

class MyDog extends Dog{
  constructor(name){
    super();
    console.log('mydog');
  }
  say(){
    console.log('my'+this.name);
  }
}
```

これをbabelでECMAScript5にすると以下のようになりました。
babelの出力そのままではなく、コメントを加えてインデントを調整しています。
関数の巻き上げがあるせいでいまいち読み解けないです。

```javascript:es5.js
'use strict';

// クラスに相当するfunctionの作成
var _createClass = function () {
  // functionへのproperty設定
  function defineProperties(target, props) {
    for (var i = 0; i < props.length; i++) {
      var descriptor = props[i];
      descriptor.enumerable = descriptor.enumerable || false;
      descriptor.configurable = true;
      if ("value" in descriptor)
        descriptor.writable = true;
      Object.defineProperty(target, descriptor.key, descriptor);
    }
  }

  // 普通のプロパティはprototypeに、static(newしなくても使える)ならfunctionに設定する
  return function (Constructor, protoProps, staticProps) {
    if (protoProps)
      defineProperties(Constructor.prototype, protoProps);
    if (staticProps)
      defineProperties(Constructor, staticProps);
    return Constructor;
  };
}();

// 何のためにあるかよく分かっていない
function _possibleConstructorReturn(self, call) {
  if (!self) {
    throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
  }
  return call && (typeof call === "object" || typeof call === "function") ? call : self;
}

// 前回のプロトタイプチェーン作成にあたる部分
function _inherits(subClass, superClass) {
  if (typeof superClass !== "function" && superClass !== null) {
    throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
  }
  subClass.prototype = Object.create(superClass && superClass.prototype,
    {
      constructor: {
        value: subClass, enumerable: false, writable: true, configurable: true
      }
    });
  if (superClass)
    Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;
}

// newで呼ばれているかチェックしている？
function _classCallCheck(instance, Constructor) {
  if (!(instance instanceof Constructor)) {
    throw new TypeError("Cannot call a class as a function");
  }
}

var Dog = function () {
  function Dog(name) {
    _classCallCheck(this, Dog);

    this.name = name;
    console.log('dog');
  }

  _createClass(Dog, [{
    key: 'say',
    value: function say() {
      console.log(this.name);
    }
  }]);

  return Dog;
}();

var MyDog = function (_Dog) {
  _inherits(MyDog, _Dog);

  function MyDog(name) {
    _classCallCheck(this, MyDog);

    var _this = _possibleConstructorReturn(this, (MyDog.__proto__ || Object.getPrototypeOf(MyDog)).call(this));

    console.log('mydog');
    return _this;
  }

  _createClass(MyDog, [{
    key: 'say',
    value: function say() {
      console.log('my' + this.name);
    }
  }]);

  return MyDog;
}(Dog);

```

なかなか分からないものを使いにくいし、基本的には前回で事足りるような気がします。
TypeScriptはまた少し違っているみたいですね。。。
[python]DataFrameを利用して既存Excelファイルのシートを編集・追加する方法

単一シートの[excelファイルの書き出し・読み込み・編集](https://qiita.com/hasepy/items/06d5d2e2b6495752442c)はよく行いますが、単純にsheet_nameだけを指定するのではそのシート以外が削除されてしまいます。これを知らずに既存のファイルにシートを追加して保存しようとしたとき、少々手間取ったのでメモとして残します。
# 既存excelファイルに新しいシートを追加する方法

```python:edit_sheet.py

import pandas as pd
import openpyxl as opx

# 対象ファイルのExcelWriterの呼び出し
EXL=pd.ExcelWriter('file_path', engine='openpyxl')

# ExcelWriterに既存の対象ファイルを読み込ませる
EXL.book=opx.load_workbook('file_path')
# 既存のsheet情報を読み込ませる
EXL.sheets=dict((ws.title, ws) for ws inEXL.book.worksheets)

# ExcelWriterを用いて新規シートにDataFrameを保存
df.to_excel(EXL, sheet_name='sheet_name', index=False)

# ExcelWriterの処理を保存
EXL.save()
```
indexの指定はお好みで
PhpStormのExternal Toolsをフル活用しよう

# はじめに

IDEに外部ツールの実行機能はだいたい入ってる機能ではありますが、PhpStormのExternal Toolsはほんと気が利くんですよ～
もう私なんてなんでも設定しちゃうぞ～！ってStormにゾッコンです！

# Tree Viewで選択したディレクトリやファイルを元に実行

## 例）Tree Viewからのls -l

例えば、logフォルダ内のファイルサイズを確認したい時どうしてますか？
Terminal Viewを開いて、移動して、、、なんてやってたら面倒ですよね。

External Toolsに設定してしまえば、こんな感じですぐls -lですよ～

<img width="674" alt="ls -l" src="https://qiita-image-store.s3.amazonaws.com/0/68254/0ba6fabf-7af6-fb3f-f059-db1024dc1c76.png">
今見て思いましたが、グループ名がlinuxってなんか意味わからんですね...

## 設定

こんな感じに設定してやりましょう。

```text
Program:    ls
Arguments:  -l $FilePath$
Project Viewにチェック
```

<img width="1053" alt="設定" src="https://qiita-image-store.s3.amazonaws.com/0/68254/18153402-c327-72cd-cce5-a9d3b0072b20.png">


# Editorで選択した文字を元に実行

## 例）選択した文字をURL Encoding

選択した文字をURL Encodingしたいって時よくありますよね！

<img width="802" alt="urlencode" src="https://qiita-image-store.s3.amazonaws.com/0/68254/964d016f-d1fa-41f9-03fb-e12d93479e6d.png">

## 設定

こんな感じに設定してやりましょう。

```text
Program:    php
Arguments:  -r "echo urlencode('$SelectedText$');"
Editor menuにチェック
```

<img width="1052" alt="設定" src="https://qiita-image-store.s3.amazonaws.com/0/68254/25c404cc-59c3-9eb1-8ff9-5b96a6acb732.png">
こんなもんEditorでも標準でついとるって！？

# おわりに

[PhpStormで楽チンansible-vault](https://qiita.com/albyte/items/16c0aa658f54cb05b962)みたいにansibleコマンドやよく使うやつをどんどん登録してみましょう！

awscliとか登録し出したら、キリなさそうですね(^^;