OmniAICreator/Qiita-1.07M huggingface dataset:
[MySQL]インデックスに関するコマンドまとめてみた


# はじめに
　MySQLにおけるインデックスとは、条件検索を高速に行うための仕組みです。よく検索されるカラムにインデックスを作成することで、検索の高速化を図ることが出来ます。しかし、保存や更新処理が遅くなったり、インデックスを作成した分容量を使うみたいなので、むやみやたらに作成したから良いってわけではないみたいです。
　今回は、インデックスを作成していく上で使うコマンドをまとめてみました。これなら色んな記事を走査する必要なく、高速に必要なコマンドを見つけることが出来ますね。
　
# コマンドまとめてみた
## 確認系
#### いま貼られているインデックスが知りたい！
```
show index from table_name;
```

## 作成系
#### 作成したい！（パート１）
```
alter table table_name add index (column1);
```

#### 作成したい！（パート２）
```
create index index1 on table_name(column1);
```

#### テーブル作成時に作成したい！
```
create table table_name (
	column1 char(20),
	column2 int(11),
	index(colum1) 
);
```
#### 複合インデックスを作成したい！
```
alter table table_name add index (column1, column2);
```

## 削除系
#### 削除したい！（パート１）
```
alter table table_name drop index index1;
```
#### 削除したい！（パート２）
```
drop index index1 on table_name;
```

## 分析系
#### 作成したインデックスの効果が知りたい！
```
explain [select文]
```


# まとめ
インデックスの基礎を頭で理解はしても、実際使ってみないとよく分からないのが正直なところ・・・。このコマンドが分かってればとりあえずインデックス入門は出来ると思うので、頑張っていきましょう。
AWS の Certificate Manager(ACM) で SSL 証明書を発行


## はじめに
SSL 対応するのって個人的には面倒くさい作業のイメージがあったのですが、
さすが Amazon 先生、Certificate Manager を使えばサクッとできてしまいます。
何より ELB を使っていればインスタンス代がかかるだけで無料なのが素晴らしい！！
今回は文字だけで恐縮ですが、ざっとやり方を。


## さっそく発行
### ドメイン名の追加
AWS のサービスから Certificate Manager を選択し、
`今すぐ始める` をクリックします。

すると `ドメイン名の追加` の画面に行くので、ドメインを入力し、`確認とリクエスト` で次の画面に遷移します。

画面上に下記説明があるよう、ドメインの入力にはワイルドカードを使ってサブドメインも指定できます。

> SSL/TLS 証明書により保護するサイトの完全修飾ドメイン名 (www.example.com など) を入力します。同じドメイン内の複数のサイトを保護するには、アスタリスク (*) を使用して、ワイルドカード証明書をリクエストします。たとえば *.example.com とすると、www.example.com、site.example.com、images.example.com が保護されます。

サブドメインがない場合もある場合も SSL 証明書を発行したい時には
まずどちらかのドメインを入力した後に `この証明書に別の名前を追加` をクリックして、
もう片方の名前を追加します。

### 確認とリクエスト
先程の `この証明書に別の名前を追加` をクリックすると、
SSL 証明書によって保護する名前の確認画面に行くので、
ただしいドメイン名が入力されているかを確認後、`確定とリクエスト` をクリック。

間違っていた場合は `戻る` で修正します。

### 検証
先程の `確定とリクエスト` をクリックすると、画面に表示されているメールアドレスにメールが飛ぶので、そのメール内の URL を踏んで `承認` すれば証明書の発行完了です。

## まとめ
これだけで SSL 証明書の発行完了。
ELB の割当もすぐにできます。割当についてはまたの機会に
入れ子dictの全keyを取得するメソッド


[^1]: shiracamus先生がコメントでより端的な書き方を教えてくれております

コメントによりスマートな書き方があるので、是非参考にしてください。

```py
test= {"w": {"y":{"z":1}},"ww":1, "www":{"yy":1}}

def allkeys(a):
    keys = a.keys()
    values = a.values()
    
    t = []
    for v in values:
        if isinstance(v, dict):
            t.extend(allkeys(v))
                
    result = [i for i in keys]
    result.extend(t)
    return result
    
r = allkeys(test)
print(r)


```

```:実行結果
['ww', 'www', 'w', 'yy', 'y', 'z']
``` 


https://gist.github.com/lnial/dedf2a98735c2826ca9ef7787bfb18fd


---

### キー名に親のキーを付けた場合 

```py
test= {"w": {"y":{"z":1}},"ww":1, "www":{"yy":1}}

def parentnema(k, v):
    return k +"."+ v

def allkeys(a):
    keys = a.keys()
    values = a.values()
    
    t = []
    for k in keys:
        v = a.get(k)
        if isinstance(v, dict):
            t.extend(map(lambda z: k + "." + z, allkeys(v)))

    result = [i for i in keys]
    result.extend(t)
    return result
    
r = allkeys(test)
print(r)

```

 ```:実行結果
 ['ww', 'www', 'w', 'www.yy', 'w.y', 'w.y.z']
 ``` 
 https://gist.github.com/lnial/cd57861fb00a38537dda8974f96a1e1b
PPPoE(PPP over Ethernet)とは

# PPP(Point to Point Protocol)とは
- 2点間を接続するプロトコルの一つ
- データリンク層（第2層）
- 伝送エラーの検出、アドレス情報の交換、接続相手の確認などの機能を持つ
- TCP/IP以外の通信プロトコルにも対応（電話回線からインターネットに接続）

# Ethernetとは
- LAN規格（限られた範囲内で、相互にデータ送信可能なネットワーク）
- バス型と、スター型がある
- どのコンピューターも通信回線を使用する権利を有する

# PPPoEとは
- PPPの機能をEthernet上で利用可能にするためのプロトコル
- インターネットの接続に、「認証ID」と「認証パスワード」が必要
- フレッツ光やフレッツADSLも含む
[JAWS-UG CLI] AWS Organizations 入門 (1) 事前準備

# この記事について

[JAWS-UG CLI専門支部 #83 Organizations入門](https://jawsug-cli.doorkeeper.jp/events/57578)で実施するハンズオン用の手順書です。


# 前提条件

## 必要な権限

- Organizationsのフルコントロール権限
- Identity and Access Managementのフルコントロール権限
- Security Token Serviceのフルコントロール権限

## 必要なリソース

**本日のハンズオンは、親アカウントの作成も含めて実施します。以下のリンクの通り、Organizationsで作成したアカウントは削除できません。**

[Creating an AWS Account in Your Organization](http://docs.aws.amazon.com/ja_jp/organizations/latest/userguide/orgs_manage_accounts_create.html)

- メールアドレス × 2（親アカウントおよび子アカウント用）
- クレジットカード情報
- 通話可能な電話番号（個人認証用）


# 1. 親アカウントの作成

リンク先の手順を参考にして親アカウントを作成してください。

[AWS アカウント作成の流れ](https://aws.amazon.com/jp/register-flow/)

**既存のアカウントを親アカウントとして利用する場合、この手順を省略できます。ただし、OrganizationsのAPIで作成したアカウントは完全に削除することができません。それにより、親アカウントで作成したOrganizationも削除できません。このハンズオンでは、アカウントを含む全てのリソースを新たに作成します。**

# 2. AWS CLIの設定

## 2.1. 認証情報の発行および権限の付与

以下のドキュメントを参考に、AWS CLIの認証情報を発行し、必要な権限を付与してください。

[Creating Your First IAM Admin User and Group](http://docs.aws.amazon.com/IAM/latest/UserGuide/getting-started_create-admin-group.html)

## 2.2. 認証情報の設定

以下のドキュメントを参考に、AWS CLIの認証情報を設定してください。

[Configuring the AWS Command Line Interface](http://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html)

## 2.3. リージョンの指定

Organizationのエンドポイントが提供されているバージニアリージョンを指定します。

```bash:コマンド
export AWS_DEFAULT_REGION="us-east-1"
```

以上
流れるようなインタフェースで条件分岐


# 前提

* java8以降

# 問題となる条件分岐

よく見るようなこんな処理。

```java
// 文字列が空ではない、かつアルファベット小文字である場合
// かつ
// 処理区分が登録・変更のいずれかである場合
if ((StringUtils.isNotEmpty(str) && StringUtils.isAlpha(str)
        && StringUtils.isAllLowerCase(str))
        && (processDivision.isRegister() || processDivision.isChange())) {
    // なんか処理
}
```

コードをぱっと見るとどこまでが条件なのか分かりづらいし、括弧を付ける位置とかミスもしやすい。
このくらいならまだマシかもしれないが、条件が増えてきたら絶望する...


# 流れるようなインタフェースで解決

以下のようなクラスを作る。

```java:Assume.java
public final class Assume<T> {

    private T obj;

    public static <T> Assume<T> that(T obj) {

        Assume<T> assume = new Assume<>();
        assume.obj = obj;

        return assume;
    }

    public AnyMatch<T> satisfiesAnyOf(Predicate<T> method) {

        AnyMatch<T> anyOf = new AnyMatch<>(obj, method);

        return anyOf;

    }

    public AllMatch<T> satisfiesAllOf(Predicate<T> method) {

        AllMatch<T> allOf = new AllMatch<>(obj, method);

        return allOf;

    }

}
```


```java:AnyMatch.java
public final class AnyMatch<T> {

    private T obj;

    private boolean match;

    protected AnyMatch(T obj, Predicate<T> checkMethod) {
        this.match = checkMethod.test(obj);
        this.obj = obj;
    }

    public AnyMatch<T> or(Predicate<T> checkMethod) {

        if (match) {
            return this;
        }

        this.match = checkMethod.test(obj);
        return this;
    }

    public boolean check() {

        return match;
    }
}
```


```java:AllMatch.java
public class AllMatch<T> {

    private T obj;

    private boolean match;

    protected AllMatch(T obj, Predicate<T> checkMethod) {
        this.match = checkMethod.test(obj);
        this.obj = obj;
    }

    public AllMatch<T> and(Predicate<T> checkMethod) {

        if (!match) {
            return this;
        }

        this.match = checkMethod.test(obj);
        return this;
    }

    public boolean check() {
        return match;
    }

}
```

この3つを用いると冒頭の処理は以下のように書けます。

```java
// 文字列が空ではない、かつアルファベット小文字である場合
// かつ
// 処理区分が登録・変更のいずれかである場合
if (Assume.that(str)
        .satisfiesAllOf(StringUtils::isNotEmpty)
        .and(StringUtils::isAlpha)
        .and(StringUtils::isAllLowerCase).check()
        && Assume.that(processDivision)
                 .satisfiesAnyOf(ProcessDivision::isRegister)
                 .or(ProcessDivision::isChange).check()) {
    // なんか処理
}
```


記述は長くなったが、何をしているかがわかりやすくなった。はず。

# さらに改良

[if文でも三項演算子でもない第三のIf文を書いてみる](http://qiita.com/mt-village/items/7d1b5560224d2675d770)
の記事を参考にさらに改良。


```java:AnyMatch.java
public final class AnyMatch<T> {
    
    ...

    public <A> Else<A> then(Supplier<A> a1) {
        return (Supplier<A> a2) -> match ? a1.get() : a2.get();
    }
}
```

を追加し、

```java:Else.java
public interface Else<A> {
    A orElse(Supplier<A> a2);
}
```

を用意すれば

```java
String hoge = Assume.that(str)
        .satisfiesAllOf(StringUtils::isNotEmpty)
        .and(StringUtils::isAlpha)
        .and(StringUtils::isAllLowerCase).then(() -> "aaa").orElse(() -> "bbb");
```

こんなこともできる。

# 参考

- [if文でも三項演算子でもない第三のIf文を書いてみる](http://qiita.com/mt-village/items/7d1b5560224d2675d770)
FFmpeg で AspectFill 的なリサイズを行う

App Store に載せる動画を作るのに、iPhone 6 サイズから iPhone 6 Plus サイズに動画をリサイズしました。
そのときにつかった FFmpeg のコマンドをメモします。

```bash
ffmpeg -i apppreview.mp4 -vf "scale=1080:1920:force_original_aspect_ratio=increase,crop=1080:1920"
```

元動画は 750 × 1334 のサイズ
1080 x 1920 にリサイズしています。

これらは比率が微妙に異なるので、単に `scale=1080:1920` と指定すると 1079x1920 のサイズの動画が生成されます。

`force_original_aspect_ratio=increase` と `crop` を指定すると、アスペクト比を保ったまま拡大、はみ出した部分を切り抜くようになります。
【メモ】iOS アーキテクチャ


# Mac OS vs iOSシステムアーキテクチャ
![system-architecture-of-ios.jpg](https://qiita-image-store.s3.amazonaws.com/0/134166/1273e7c8-dc6a-2f20-226e-7abe8fb203fe.jpeg)



# iOS stack
### iOS レイヤー
![iOS level.png](https://qiita-image-store.s3.amazonaws.com/0/134166/a68402fb-a256-5682-5527-a00d607e03cf.png)

![01_level 1.jpg](https://qiita-image-store.s3.amazonaws.com/0/134166/aad79134-dfaf-26f7-86d2-668e41ab86ef.jpeg)

![02_level 2.jpg](https://qiita-image-store.s3.amazonaws.com/0/134166/8d39731f-3e03-735e-3f81-4ef64febb424.jpeg)

![03_level 3.jpg](https://qiita-image-store.s3.amazonaws.com/0/134166/0f693fdd-644e-24a0-74ac-a55625d30364.jpeg)

![04_level 4.jpg](https://qiita-image-store.s3.amazonaws.com/0/134166/7095ebb3-37c4-a4fb-5338-1c5faffe2eba.jpeg)

### iOS レイヤーの全体像
![35f47-1.png](https://qiita-image-store.s3.amazonaws.com/0/134166/ea2c01f1-9a3b-98a5-3e9e-0148323be1fa.png)

### ハードウェアレイヤーを含む
![Iphone_os_architecture.png](https://qiita-image-store.s3.amazonaws.com/0/134166/7c46538e-78b5-231e-684d-425ef7e29d95.png)

### 3rdアプリを含むシステムアーキテクチャ
![ios-platform-10-638.jpg](https://qiita-image-store.s3.amazonaws.com/0/134166/fd317d6f-35a7-4655-3be4-724a627a12a9.jpeg)


# まとめ
![blog_2.jpg](https://qiita-image-store.s3.amazonaws.com/0/134166/aaceb203-2d3c-a50a-ffcd-282c942f534e.jpeg)


# 参考
> https://www.slideshare.net/mignev/ios-architecture-and-mvc

### ちなみに、android stack
![android full stack_01.jpg](https://qiita-image-store.s3.amazonaws.com/0/134166/a69b89b6-7b3e-ce8b-699c-c6b06e295ec8.jpeg)

![android full stack _02.jpg](https://qiita-image-store.s3.amazonaws.com/0/134166/3414eb82-e0cb-a75a-e2a8-6a58f13a4643.jpeg)
【ネタ】Swift で Sleep Sort

[Sleep Sort とかいう天才的な発見](https://bl0ckeduser.github.io/sleepsort/sleep_sort_trimmed.html)があって(ry

というわけで Swift でやってみた。

```swift
let array = [5, 3, 6, 3, 6, 3, 1, 4, 7]
let now = DispatchTime.now()
array.forEach { (i) in
	DispatchQueue.global().asyncAfter(deadline: now + .milliseconds(i)) {
		print(i)
	}
}

/* 出力：
1
3
3
3
4
5
6
6
7
*/
```
Ubuntuの起動中(ブート)の画面が変わってしまって悲しいとき

GNOMEをインストールしたら、スプラッシュ・スクリーンが変わってしまって悲しかったので、元に戻す方法のメモ。

Ubuntu 16.04 の話です。

```
sudo update-alternatives --config default.plymouth
# デフォルトは以下っぽい
# /usr/share/plymouth/themes/ubuntu-logo/ubuntu-logo.plymouth

sudo update-initramfs -u -k all
sudo update-grub
```

これで戻りました。
dictのkeyにlist要素が全て存在するかどうかを判定


 `hoge` のkeyに `fuga` の要素が全て含まれているかどうかの判定

```py
>>> hoge = {"a":1, "b":2, "c":3}
>>> fuga = ["a", "b"]
>>> 
>>> set(fuga).issubset(set(hoge.keys()))
True
```
Eclipseでhtmlファイルのコードフォーマットを設定する

# Eclipseでhtmlファイルのコードフォーマットを設定する

## 設定方法
eclipseのタブから
ウィンドウ->設定->Web->HTMLファイル->エディター
にて設定する。

![Qiita用_eclipse_web_format.png](https://qiita-image-store.s3.amazonaws.com/0/139291/a1bbadc5-5ae1-afe1-d98e-55d06b20bd12.png)


## 備考
javaなどのコードフォーマットを設定したい場合
ウィンドウ->設定->Java->コードスタイル->フォーマッター
より変更できる。

この際にコードフォーマットのプロファイルをインポートして使うこともできる
Light Tableを楽にUbuntu 14.04にインストールする(proxy環境)

メモ程度の簡単な内容だけど、たまにubuntu使ってこの設定を忘れるときがあるので備忘録として投稿

[How to Easily Install Light Table on Ubuntu Linux](https://itsfoss.com/install-lighttable-ubuntu)で書かれている方法で基本的にはOK

学内や社内等でPROXY環境の場合は、sudoのときに -E オプションを付けてproxy設定を読み込ませる必要がある。
そうでないと 次のようなメッセージが出る
`Cannot add PPA: 'ppa:dr-akulavich/lighttable'`

手順

```
sudo -E add-apt-repository ppa:dr-akulavich/lighttable
sudo -E apt-get update
sudo -E apt-get install lighttable-installer
```

これでlight tableを検索すると見慣れた青いアイコンが出て来る
SeabornのFacetGridでプロットして可視化

#seabornのFacetGridで美しく可視化
matplotlibでも出来るこの方法ですが、seabornで可視化するとより少ないコードでできるのを知って最近はこっちを多用してます。便利なのできになる人はぜひ使ってみてはいかがでしょうか。

今回も使用するのはirisデータセット。

![Screen Shot 2017-04-24 at 09.16.27.png](https://qiita-image-store.s3.amazonaws.com/0/161691/c2a94b4d-8d82-da60-b8af-5d2a9be42f4b.png)

必要なライブラリをインポートしてから始めます。
##FacetGridを作る前にHeatmapで相関関係を調べ、最適な変数の組み合わせでFacetGridを作ることをおすすめします。
詳しくは、前回の記事で詳しく書いてありますので、興味ある方はぜひ。
[前回の記事](http://qiita.com/kojitakahashi6/items/47fbb89b0922251a20bb)

##では早速SeabornのFacetGridを作っていきます。


```python:seaborn
g = sns.FacetGrid(iris, hue="Species", size=7)
g.map(plt.scatter, "PetalLengthCm",  "PetalWidthCm") 
g.add_legend()

plt.title("Relationship between length and width of Petal")
```
![Screen Shot 2017-04-24 at 09.49.18.png](https://qiita-image-store.s3.amazonaws.com/0/161691/fe3bd2c0-3d6d-84db-49d2-d22fcbef3f3d.png)



##では、中身の変数たちの詳細です。

かっこ内の最初の'iris'はirisというデータフレームを使いますよーってことです。ちなみにPetalは花弁のことです。

- hue
hueは色合いとか色彩という意味を持ち、２つの変数を比較した上で、それぞれのラベルごとに色分けできる優れものですね。 上記のグラフ上では、PetalLengthCmとPetalWidthCmでプロットし、そのプロットした点を、Speciesごとに色分けしますってことです。これで、speciesごとの分布が分かるので、この後どのようにclassfyしていくか考えるひとつの指標になりますね。

- size
サイズはただ単純に図のサイズです。大きくしたい時は数字を大きくし、小さくしたい時は数字を小さくします。

- palette 
パレットで表示する点の色を変更することができます。

- col 
コラム（列）で分ける時に使用します。詳しくは下記リンクのオフィシャルドキュメント参照。例えば、keyの性別ごとに分けたい場合などは、col = sex　などとすることで左列にmen、右列にwomenなどと分けることができる。

- .map(plt.scatter,x軸,y軸)
これは、scatter plotを作りますよっていう指示で、x軸とy軸をどの変数にするか指定しています。
上記ではx軸が"PetalLengthCm"でy軸が"PetalWidthCm"になっています。

- .add.legend()
これで、グラフ外に色分けされた'Species'はそれぞれどの種に対応しているかを示す表を挿入しています。

- plt.title('タイトル名')
この表のタイトルを最後につけています。



[SeabornのFacetGridのofficial pageです。](http://seaborn.pydata.org/generated/seaborn.FacetGrid.html)
Node.jsでESLintとMochaとPower-Assertのセットアップ

久しぶりにNode.jsに触ってプロジェクトを作ったので共有。

### フォルダ構成
---

- bin
  - hoge.js
- src
- test
  - mocha.opts
- .eslintrc
- index.js
- package.json

### mocha.opts
---

```bash
--ui bdd
--reporter spec
--timeout 5000
--require intelli-espower-loader
--preserve-symlinks power-assert
```

```--preserve-symlinks power-assert```が無いとESLintに怒られたので追加した。
node_modules直下に展開されていないと、requireエラーという意味らしい。でも、power-assertのデフォルトでは、symlinkで使えるようになっているので、それを辞める設定かな。

### .eslintrc
---

```bash
---
  extends: airbnb-base
  rules:
    comma-dangle: 0
```
ESLintの設定は、airbnb-baseを使用して、その中のケツカンマ設定のみ除外した（自動でケツカンマをつけると関数呼び出しまで付けられて、動かなくなるコードがあったため）（コメントも書けるのでyaml形式で書いた）

### package.json
---

```json
{
  "name": "hoge",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "bin": {
    "hoge": "bin/hoge.js"
  },
  "scripts": {
    "test": "mocha test/*.js",
    "test-w": "mocha -w test/*.js",
    "lint": "eslint **/*.js",
    "format": "eslint --fix **/*.js"
  },
  "author": "hoge@example.com",
  "license": "MIT",
  "dependencies": {
  },
  "devDependencies": {
    "eslint": "^3.19.0",
    "eslint-config-airbnb": "^14.1.0",
    "eslint-plugin-import": "^2.2.0",
    "eslint-plugin-jsx-a11y": "^4.0.0",
    "eslint-plugin-react": "^6.10.3",
    "espower-loader": "*",
    "intelli-espower-loader": "*",
    "mocha": "*",
    "power-assert": "*"
  },
  "private": true
}
```

- binの指定はタイトルとずれるけど、globalインストールしたらコマンドで打てるようになる。
- scriptsタグ内では、node_modules/.bin/mochaとか、フルパスで書かなくて良いらしい。知らなかった。
- scriptsの```eslint --fix```で、フォーマットまでかけてくれるらしい。昔は別途esformatterとか使ってました。
- devDependenciesのESLintの指定は、[コマンドが用意されていたため](https://github.com/airbnb/javascript/tree/master/packages/eslint-config-airbnb)そちらで入れたらこうなった。

### さいごに
---

おすすめは、ターミナルを2つ、エディタを１つ立ち上げて、

- [テスト駆動開発でwatchdog(watchmedo)を使う](http://qiita.com/daijinload/items/4529de446217df9edfbb)で```npm run lint```を流す
- ```npm run test-w```も流す
- エディタでコードを修正

していくと、テスト駆動開発が捗ると思います！！
tmuxのstatus-lineにtwitterを表示させる遊び

###tのインストール&初期設定

```
$gem install t
$t authorize
```
t authorizeでアクセストークン取得のためのwebページが開くので，テキトーに埋めてaccess tokenとaccess secret tokenを取得しましょう．
(必須項目埋めても弾かれる場合→ 電話番号登録)

###tmux.confに追記

```.tmux.conf
set -g status-left "#(t timeline -n 1)"
```
これでとりあえずは見られる．

ただ```status-interval 1```とか指定してるとすぐにAPI切れになる…
多分一旦別ファイルに落としていって，そのファイルを監視したほうが効率良い．

ので，.tmux.confには，こんな感じで書いておいて

```.tmux.conf
set -g status-left "#(cat /tmp/tweet|tail -n 3|head -n 2|tr -d '\n')"
```

立ち上げ時に以下のコマンドを発火させるように
```
$t stream timeline>/tmp/tweet&
```
【Windows】exeやdllの依存関係を調べるツール「Dependency Walker」 


# 概要
Windowsで開発を行っているときに、
dllを使おうと思ったんだけど、
そのdllがまた他のdllと依存関係を持っていたようで、
動作しなかったときの便利なツール。

# ダウンロードサイト
[Dependency Walker 2.2](http://www.dependencywalker.com/)

# 参考URL
[Visual C++ アプリケーションの依存関係の理解](https://msdn.microsoft.com/ja-jp/library/ms235265.aspx)
[実行プログラムやライブラリ（DLLファイル）の依存関係を確認するには？](http://www.atmarkit.co.jp/fdotnet/dotnettips/866depends/depends.html)
[Dependency Walkerで実行ファイルの依存ファイルを調べる](http://www.off-soft.net/ja/software/develop2/depens.html)
powerlineを使わずにtmuxのstatus-lineにIMEとか曲名とかを表示する遊び

タイトルに書いたものとかを取得/表示します．tmux-powerlineとかは使いません．
tmuxで扱えるように回りくどい書き方しているものもあります．
(音量は`osascript -e (get volume settings)'s output volume`で取れたりとか)

#実験環境

Mac
iTerm2
tmux

#シェルで値を取得してみる

今回は
- IME
- 音量
- WiFiの信号強度
- WiFiのSSID
- バッテリー残量
- iTunesで再生されてるトラック名
を取りました．

##IME

```
/usr/libexec/PlistBuddy -c "Print AppleSelectedInputSources" ~/Library/Preferences/com.apple.HIToolbox.plist|grep -Eo 'Japanese|Roman'
```

見やすくするとこんな感じ

```
if /usr/libexec/PlistBuddy -c 'Print AppleSelectedInputSources' ~/Library/Preferences/com.apple.HIToolbox.plist|grep -Eo 'Japanese'>/dev/null; then echo 'あ'; else echo 'Ａ'; fi
```

##音量

```
osascript -e 'get Volume settings'|tr ':,' '\n'|head -n 2|tail -n 1
```

##Wi-Fi信号強度(RSSI値)

```
/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -I|grep 'agrCtlRSSI:'|cut -d ' ' -f7
```

##Wi-FiのESSID

`en0`部分は使用環境に合わせて変更してください

```
networksetup -getairportnetwork en0|tr ': ' '\n'|tail -n 1
```

##バッテリー残量

```
ioreg -l|grep CurrentCapacity|tr '= ' '\n'|tail -n 1
```

…だとmAhの値が出てきちゃうので，以下のコマンドでパーセント表示させます．(追記)

```
pmset -g batt|tr '\t;' '\n'|tail -n 3|head -n 1
```

##再生中の曲名

```
osascript -e 'tell application "iTunes"' -e 'the name of current track' -e 'end tell'
```

#status-lineに表示してみる

見栄えのためにemojify使ってます．

```
set -g status-right "#(if pmset -g batt|grep 'AC'>/dev/null; then emojify :electric_plug:; else emojify :battery:; fi):#(pmset -g batt|tr '\t;' '\n'|tail -n 3|head -n 1) #(if osascript -e 'get volume settings'|grep false>/dev/null; then emojify :sound:; else emojify :mute:; fi):#(osascript -e 'get Volume settings'|tr ':,' '\n'|head -n 2|tail -n 1) #(emojify :musical_note:):#(osascript -e 'tell application "iTunes"' -e 'the name of current track' -e 'end tell') #(emojify :signal_strength:):#(networksetup -getairportnetwork en1|tr ': ' '\n'|tail -n 1)(#(if [ `/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -I|grep 'agrCtlRSSI:'|cut -d ' ' -f7` -gt -60 ]; then echo 強; elif [ `/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -I|grep 'agrCtlRSSI:'|cut -d ' ' -f7` -gt -80 ]; then echo 中; else echo 弱; fi)) #(if /usr/libexec/PlistBuddy -c 'Print AppleSelectedInputSources' ~/Library/Preferences/com.apple.HIToolbox.plist|grep -Eo 'Japanese'>/dev/null; then echo 'あ'; else echo 'Ａ'; fi) %m/%d(%a)%H:%M"
```
長いなぁ

https://github.com/yatei/dotfiles

#参考

- http://fantmsite.blogspot.jp/2015/06/wifi.html
- https://kenpg.bitbucket.io/blog/201508/26.html
- http://shokai.org/blog/archives/9703
- https://github.com/Bilalh/Shell-Tunes/blob/master/itunes.sh
【PHP】 文字をループさせてエクセルのカラム文字列を自動で作成する・・・という動作についての検証

# 概要
ある日、for文の式2の値がtrueの時続行なのか、falseの時続行なのかをど忘れした私が、PHP公式ドキュメントのfor文を読んでいました。
[PHP: for - Manual](http://php.net/manual/ja/control-structures.for.php)
一番下のUser Contributed Notesを読んでいた時、奇妙なコメントが

>Looping through letters is possible. I'm amazed at how few people know that.

```php
for($col = 'R'; $col != 'AD'; $col++) {
    echo $col.' ';
}
```
>
>returns: R S T U V W X Y Z AA AB AC
>
>Take note that you can't use $col < 'AD'. It only works with !=
>Very convenient when working with excel columns.

要訳すると
「文字をループできるって知ってる人意外と少ないよね。
（例文）
ちなみに < で比較はしないでね != でやるといいよ。
エクセルのカラムとかに使うと超便利！」

・・・文字をループって何？

# 検証してみた
つまり動作を分解して考えると

**文字列"R"に対して1を加えると文字列"S"になる（次の文字を表示する）**

ということになっていると仮定できる。
ちなみに文字の比較については、私が個人的に以前usort()をで色々やったときにお世話になったので今回は触れない。
詳しくは↓を読んでください。
[PHP: 比較演算子 - Manual](http://php.net/manual/ja/language.operators.comparison.php)

てわけで、[ideone](http://ideone.com/) を使っていろんな方法でやってみた。

```php
for($col = 'R'; $col != 'AD'; $col++) {
    echo $col.' ';
}

//returns: U V W X Y Z AA AB AC
```
コメント通りの動作。

```php
$b = "AA";
$c = $b + 1;

echo $c;
//return: 1
```
あれ、1を足すとただの数値の1になる・・・

```php
$b = "AA";

echo ++$b;
//return: AB
```
for文通りの動作になっている。

```php
$b = "string";
$c = "AA";

echo (int)$b; //0
echo (int)$c; //0
```
最後に2つ目の例で文字列がどのように認識していたのか調べてみる。
どうやらintキャストされて0になったため、実際の足し算では「0 + 1」になり、答えが1になったようだ。

どうも、**インクリメントの挙動が怪しい**ことに気がつく。

# マニュアルを読むと・・・書いてあった！
つまりは、最初から加算子/減算子を読めばいいだけだったという結論だったわけですが、
[PHP: 加算子/減算子 - Manual](http://php.net/manual/ja/language.operators.increment.php)

>PHP は、算術演算子で文字変数を扱った場合に C ではなく Perl の慣習に 従います。例えば、PHP や Perl では `$a = 'Z'; $a++;` の結果として `$a` が 'AA' になりますが C では `a = 'Z'; a++;` の結果として a は '[' になります ('Z' の ASCII 値は 90、そして '[' の ASCII 値は 91 です)。 文字変数はインクリメントされることは可能ですがデクリメントは不可能であるということ、 またプレーンな ASCII 文字と数字 (a-z、A-Z、そして 0-9) のみがサポートされるということに注意しましょう。 その他の文字変数のインクリメント/デクリメントは何の効果もなく、元の文字列は変更されません。

ちなみにそこに乗っている例文が以下。

```php
echo '== Alphabets ==' . PHP_EOL;
$s = 'W';
for ($n=0; $n<6; $n++) {
    echo ++$s . PHP_EOL;
}
// 数字の挙動は異なります
echo '== Digits ==' . PHP_EOL;
$d = 'A8';
for ($n=0; $n<6; $n++) {
    echo ++$d . PHP_EOL;
}
$d = 'A08';
for ($n=0; $n<6; $n++) {
    echo ++$d . PHP_EOL;
}
```

```text
== Characters ==
X
Y
Z
AA
AB
AC
== Digits ==
A9
B0
B1
B2
B3
B4
A09
A10
A11
A12
A13
A14
```

エクセルのカラムのタイプだけではないのも対応しているようです。
なにかその辺使えそうですね。
お手軽にFlowとBabelを組み合わせて利用してみる。

#概要
FlowとBabelを組み合わせて簡単にFlowで型付けの確認をおこないたかったので調べてみました。
必要なプラグインを導入して、型付けチェックをおこなうまでの手順です。

作業時間目安：15分

#目標
```yarn flow``` で型付けチェックを試すところまで。
#実践
## 導入手順
### 01. プラグイン追加
```
yarn add flow-bin
yarn add babel-plugin-syntax-flow
yarn add babel-plugin-transform-flow-strip-types
yarn add babel-preset-es2015
yarn
```
### 02. 設定ファイル変更・追加
- package.json に下記を追記します。

```js:package.json
  "scripts": {
    "flow": "flow"
  }
```

- flow を使うために .flowconfig を生成しておきます。

```
yarn flow init
```

```ini:.flowconfig
[ignore]
.*/node_modules/.*

[include]

[libs]

[options]

[version]
>=0.37.0
```
## 準備
### 01. サンプルファイルの準備

```js:src/helloworld.jsx
// @flow
class HelloWorld {
  constructor() {
    this.hellow = 'Hellow';
  }

  show(world) {
    console.log(this.hellow + world);
    return true;
  }
}

const helloWorld = new HelloWorld();
const result = helloWorld.show('World');

export default HelloWorld;
```

- 1行目に下記を追記することで Flowチェック対象になります。

```js
// @flow
```

## 実行
### 01. 実行コマンド
```
yarn flow
```
### 02. 実行結果（エラー時）
```
$ yarn flow
yarn flow v0.22.0
$ flow 
src/helloworld.jsx:4
  4:     this.hellow = 'Hellow';
              ^^^^^^ property `hellow`. Property not found in
  4:     this.hellow = 'Hellow';
         ^^^^ HelloWorld

src/helloworld.jsx:7
  7:   show(world) {
            ^^^^^ parameter `world`. Missing annotation

src/helloworld.jsx:8
  8:     console.log(this.hellow + world)
                          ^^^^^^ property `hellow`. Property not found in
  8:     console.log(this.hellow + world)
                     ^^^^ HelloWorld


Found 3 errors
error Command failed with exit code 2.
```

#### 03. エラーが発生しないように修正
```js:src/helloworld.jsx
// @flow
class HelloWorld {
  hellow: string;

  constructor() {
    this.hellow = 'Hellow';
  }

  show(world: string): boolean {
    console.log(this.hellow + world);
    return true;
  }
}

const helloWorld = new HelloWorld();
const result: boolean = helloWorld.show('World');

export default HelloWorld;
```
### 04. 実行結果（正常時）
```
$ yarn flow
yarn flow v0.22.0
$ flow 
No errors!
✨  Done in 0.40s.
```
### 05. 終わりに
これで Flow を利用した型チェックができました。
引数や、戻り値などを書き換えてみて Flow の効果を実感してみてください。

# 蛇足
##eslintの設定
### 01. プラグイン追加
```
yarn add eslint-plugin-flow-vars
yarn add babel-eslint
```
### 02. 設定ファイル変更・追加
- .eslintrc.json に下記を追記します。

```js:.eslintrc.json
  "plugins": [
    "flow-vars"
  ],
  "rules": {
    "flow-vars/define-flow-type": 1,
    "flow-vars/use-flow-type": 1
  }
```
##気になったこと。
冗長な記載が必要になるケースがありました。
助長にならないように、何かしら工夫が必要になってくるかもしれません。

- 元コード

```js
const text = document.getElementById('text').innerText;
```

- 次のように書くと Flowチェック NG となります。

```js
const text: string = document.getElementById('text').innerText;
```

- 次のように書くと Flowチェック OK となります。

```js
let text: string = "";
const textElement: ?HTMLElement = document.getElementById('text');
if (textElement instanceof HTMLElement) {
  text = textElement.textContent;
}
```
SetEnvIf Remote_Addr を使ってホワイトリスト方式でアクセス元を許可する場合のテスト方法。但しロードバランサー配下に限る

## 背景
インターネットに公開しているサーバには、望んでないアクセスが大量に来ます。望むアクセスだけを受け入れる方法としてアクセス元IPアドレスで判断する方法があります。

```apache
<DirectoryMatch / >
  SetEnvIf Remote_Addr "^192\.168\." AllowIP
  Order deny,allow
  Deny from all
  Allow from env=AllowIP
</DirectoryMatch>
```

アクセスを受け入れるIPアドレスが増えた場合には、 `SetEnvIf Remote_Addr` を追加します。追加した結果のテストを行うには、本物のネットワークからアクセスを行えばいいのですが、それを行えない場合があります。

管理しているWebサーバが **ロードバランサー配下にあり、X-Forward-forを設定している** のであれば、 リクエストヘッダーの X-Forward-for に許可したいIPアドレスを設定することで動作確認を行えます。

## 前提となる apacheの設定

mod_remoteip を使って リモートIPを取得できる状態にしておきます。

```apache 
RemoteIPHeader X-Forwarded-For
```

また、access_logの `%h` を `%a` に変更して、リモートIPをアクセスログで確認できる状態にしておきます。

## 擬似的なアクセス

webサーバ内でcurlを使ってapcaheにアクセスします。curlの `-H` オプションで `X-Forwarded-For` に 許可したいIPアドレスを設定します。

```bash
curl -H "X-Forwarded-For:192.168.1.2" \
  http://localhost/path/contents
```

## 総当たりでテストしたい
`SetEnvIf` で正規表現で許可するIPアドレスを指定するので、正規表現を間違えてしまうかもしれません。また、`192.168.1.0/24` や `192.168.0.0/16` などネットワーク単位に許可することもあります。そうした場合はIPアドレスを変えながら全IPでアクセスします。

HTTPステースコードは許可したIPアドレスであれば200、許可していないIPアドレスであれば403になります。総当たりテストの結果は HTTPステータスだけ得られれば十分です。 

```bash
curl -H "X-Forwarded-For:192.168.1.2" \
  -o /dev/null \
  -s \
  -w '%{http_code}\n' \
  http://localhost/path/contents
```

追加したオプションは下の通りです。

* `-o` で レスポンスのbodyを`/dev/null`に捨てます
* `-s` で進捗表示を抑止します
* `-w` で HTTPステータスコードを表示します



## 参考ページ
[SetEnvIfでHTTPヘッダー情報をもとに制御する](http://www.hiihah.info/index.php?apache：SetEnvIfでHTTPヘッダー情報をもとに制御する)
[cURLでHTTPステータスコードだけを取得する](http://qiita.com/mazgi/items/585348b6cdff3e320726)
VuejsでTypeError: Cannot read property 'hoge' of undefined


## 環境
"firebase": "^3.7.8",
"vue": "^2.2.2",


## 現象
firebase databaseから値取得してVueで表示させようとしたらconsoleに以下のエラーが出た。

```
vue.esm.js?65d7:558 [Vue warn]: Error in render function: 
(found in <hogeComponent> at /sample-project/src/components/hogeComponent.vue)
```

```
vue.esm.js?65d7:1447 TypeError: Cannot read property 'hoge' of undefined
    at Proxy.render (eval at <anonymous> (app.js:1204), <anonymous>:46:30)
    at VueComponent.Vue._render (eval at <anonymous> (app.js:723), <anonymous>:3608:22)
    at VueComponent.updateComponent (eval at <anonymous> (app.js:723), <anonymous>:2157:21)
    at Watcher.get (eval at <anonymous> (app.js:723), <anonymous>:2468:25)
    at new Watcher (eval at <anonymous> (app.js:723), <anonymous>:2451:12)
    at mountComponent (eval at <anonymous> (app.js:723), <anonymous>:2161:17)
    at VueComponent.Vue$3.$mount (eval at <anonymous> (app.js:723), <anonymous>:7251:10)
    at VueComponent.Vue$3.$mount (eval at <anonymous> (app.js:723), <anonymous>:9300:16)
    at init (eval at <anonymous> (app.js:723), <anonymous>:2930:13)
    at createComponent (eval at <anonymous> (app.js:723), <anonymous>:4655:9)
```

ソース

```hogeComponent.vue
<span class="new badge"
  v-bind:class="{
    blue:data.hoge,
    red:data.fuga}"
  data-badge-caption="">{{data.hogefuga}}
</span>
```

## 解決方法

firebase databaseからデータを取得し終える前に描画され、エラーとなっていたようだ。
v-ifでデータの存在を確かめるようにすると解決できた。

```diff
//hogeComponent.vue

<span class="new badge"
+ v-if="data"
    blue:data.hoge,
    red:data.fuga}"
  data-badge-caption="">{{data.hogefuga}}
</span>
```
Matplotlibを利用したソースコードの読み方


##目的
Kaggleのサイトで、[とある方のソースコード](https://www.kaggle.com/currie32/d/dalpozz/creditcardfraud/predicting-fraud-with-tensorflow/discussion)を参照し、それの見方を私なりに理解しようと思いまして、ここに記録致します。

環境はPython 3、matplotlibとpandasを利用しています。

##参照したソースコード

```python:
import matplotlib.pyplot as plt
import pandas as pd

df = pd.read_csv("./creditcard.csv")


f, (ax1, ax2) = plt.subplots(2, 1, sharex=True, figsize=(12,4))

bins = 50

ax1.hist(df.Time[df.Class == 1], bins = bins)
ax1.set_title('Fraud')

ax2.hist(df.Time[df.Class == 0], bins = bins)
ax2.set_title('Normal')

plt.xlabel('Time (in Seconds)')
plt.ylabel('Number of Transactions')
plt.show()
```


![image](https://qiita-image-store.s3.amazonaws.com/0/177123/99c59f56-d112-32ff-8a1e-3e34d8cd6360.png)


##matplotlibとは

```python:
import matplotlib.pyplot as plt
```

*Matplotlibは、プログラミング言語Pythonおよびその科学計算用ライブラリNumPyのためのグラフ描画ライブラリである。*[Wikipedia]()を参照

Python用のグラフ描画ライブラリと覚えておきます。マットプロットリブって読むんですかね。


##pandasとは

```python:
import pandas as pd
```

*Pandasは、プログラミング言語Pythonにおいて、データ解析を支援する機能を提供するライブラリである。特に、数表および時系列データを操作するためのデータ構造と演算を提供する。PandasはBSDライセンスのもとで提供されている。*
[Wikipedia](https://ja.wikipedia.org/wiki/Pandas)を参照

Python要のデータ解析用のライブラリとのことです。数表、時系列データの操作を提供しているそうです。
パンダスと読むんでしょうか。パンズなのでしょうか。よく分からないですね。

##subplotsとは
```python:
f, (ax1, ax2) = plt.subplots(2, 1, sharex=True, figsize=(12,4))
```
のところの、2と1はrowとcolumnとのことです。つまり、2行、1列ということのようです。[http://matplotlib.org/api/pyplot_api.html](http://matplotlib.org/api/pyplot_api.html)より

f, (ax1, ax2) というのがよく分かりませんが、上記サイトにこれに近いSampleがあるので、こういう書き方なんだろな、程度に理解しておきます。

rowが2でcolumnが1なので、2つのグラフということでax1とax2ということなんだろな、と思いますが。
fは何を意味しているのかいまいちよく分かりません。y軸（縦軸）のことで、どんな文字列でも良い変数という意味でしょうか。



##sharexとは
```python:
f, (ax1, ax2) = plt.subplots(2, 1, sharex=True, figsize=(12,4))
```
のところのsharex=Trueのことです。

*複数のグラフを表示するときに、X軸の設定をすべてのグラフで設定するのが面倒な時にShareが使えます。subplotsに引数でsharex=Trueとするだけです。*[[Python]Matplotlibで複数のグラフを描画する方法](http://qiita.com/supersaiakujin/items/543053ca4610437112df)より

##figsizeとは
```python:
f, (ax1, ax2) = plt.subplots(2, 1, sharex=True, figsize=(12,4))
```
のところのfigsize=(12,4)のことです。
*インチで、デフォルトでは(8, 6)とのことです。*グラフの画像サイズのことのようです。
[西尾泰和のはてなダイアリー](http://d.hatena.ne.jp/nishiohirokazu/20111121/1321849806)

##histとは
```python:
ax1.hist(df.Time[df.Class == 1], bins = bins)
```
のところのhistですが、これでヒストグラムを作ってくれるようです。hist(データ、bins=ビン数）のように指定するそうです。
[\[Python\]Matplotlibで複数のグラフを描画する方法](http://qiita.com/supersaiakujin/items/543053ca4610437112df)より


ヒストグラムと棒グラフの違いがいまいち分かってませんでしたがこちらのサイトを見て理解しました。
[棒グラフとヒストグラムの違い](https://sakura-education.com/myblog/archives/453)
面積で度数を表すのがヒストグラム、そうでないのが棒グラフのようですね。

##binとは
```python:
bins = 50
```
でbinsが50で定義されていますが、つまりグラフでいうところのX軸の数のことのようです。

ヒストグラムは、各々が互いに素である区間・階級（カテゴリ、これをビン (bins) という。　[Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%92%E3%82%B9%E3%83%88%E3%82%B0%E3%83%A9%E3%83%A0)より
cppcheckでMozilla Firefoxのソースコードを静的チェックしてみる

Mozilla Firefoxのソースコードを読んでバグを探していたのですが、ふと、ツールを使って脆弱性を検出できないかなと思って、cppcheckを使ってみることにしました。
他のソースコード静的解析ツールもいずれ使ってみたいのですが、Mozilla FireFoxはC++で記述されているので、とりあえず、cppcheckを使ってみます。
CLionとか、eclipseとかでも使えるみたいですが、とりあえず今日は、Macのターミナルでやってみることにします。

まず、cppcheckと、Mozilla Firefoxのソースコードを展開する必要があるので、ある程度の容量が使えるフォルダにターミナルで移動します。
Firefoxのダウンロードで使うので、Mercurialを事前にインストールしてください。

```
$mkdir cppcheckExecute
$cd cppcheckExecute
$git clone https://github.com/danmar/cppcheck.git
$hg clone https://hg.mozilla.org/mozilla-central
$cd cppcheck/
$make
```
これで、cppcheckをコンパイルできます。

```
$./cppcheck --enable=all /Users/daisuke/Documents/cppcheckExecute/mozilla-central
```

/Users/daisuke/Documents/cppcheckExecute/mozilla-centralについては、現在Mozilla Firefoxのソースコードを展開しているフォルダに読み替えてください。

実行してみると、全部チェックするのにものすごく時間がかかるはずです。とりあえず一個警告を見つけて、その警告をtrue positiveかfalse positiveかをチェックして、脆弱性だったらBug bounty programで報告してお金ゲットする目的なので、適当なところで中断します。
Control + Cで中断できます。

こんなのがありました。

```
(error) Uninitialized variable: xxxxxxxxx
```
xxxxxxxxxは変数が入ります。未初期化変数ですね。一応脆弱性とかだったらまずいので、伏字にしておきます。
該当するソースコードを読んでみると、確かに未初期化変数みたいですね。
これが脆弱性だったら、然るべき対処をした後、公開してもいい状態になったら公開します。
お楽しみに。
【しずおかアプリ部】活動ログ　第38回

![しずおかアプリ部2.jpg](https://qiita-image-store.s3.amazonaws.com/0/88105/ee800648-fa25-1829-20c3-bad9c2055d35.jpeg)

##■公式サイト##
[http://monolizm.com/shizuoka-app](http://monolizm.com/shizuoka-app)

##■タイトル##
第３８回


##■開催日##
２０１７年４月２２日（土）　１６：００～１８：００


##■参加者##
１１名


##■活動内容（概要）##
・最近の話題の技術ニュース、告知
・部員さんプレゼン「Fusion360　実践・解説」
・菅原プレゼン「Unityはじめるよ　～光と影①～」
・TEA BREAK　＆　VR体験



##■活動内容（詳細）##

【実演・プレゼン】

**・最近の話題の技術ニュース、告知**
　　・Wiiリモコンを使ってホワイトボードをタッチディスプレイに
　　　[https://www.ted.com/talks/johnny_lee_demos_wii_remote_hacks?language=ja](https://www.ted.com/talks/johnny_lee_demos_wii_remote_hacks?language=ja)
　　　[http://www.thedesignium.com/work/513](http://www.thedesignium.com/work/513)
　　　[http://d.hatena.ne.jp/jundime/20090122/](http://d.hatena.ne.jp/jundime/20090122/)

　　・[こたつでホッケー](http://sportie.com/2016/03/senioryuruspo)



<hr>



**・部員さんプレゼン「Fusion360　実践・解説」**

　　　■Fusion360の実践・解説
　　　　フリーCADソフト「Fusion360」の使い方を日本語チュートリアルを見ながら進めた。
　　　　Fusion 360入門者向け日本語チュートリアル P34～39 

　　　　①前回のおさらい 
　　　　　フィレットという機能を使って、カップのフチと、底部に丸みをもたせる。
　　　　　見た目的にも機能的にも、カップらしくなった。
　　　　　カップ本体はこれにて完成。

　　　　②8. コースターを作成する P35～39
　　　　　円柱を押し出して、コースターの原型を作る。
　　　　　この時-方向に押し出すことで、カップとぶつからないようにしている。
　　　　　コースターのフチを作る際に、同心円での「拘束」という方法を使った。
　　　　　拘束とは、同心円だったり、平行だったり、与えた条件を維持するための機能。
　　　　　平行状態で拘束したものは、片方を動かせば必ずもう片方も平行な状態を保ってくれる。

![IMG_7767.JPG](https://qiita-image-store.s3.amazonaws.com/0/88105/5d61e1ab-4c91-22a9-f77f-dc51c4464209.jpeg)
　　　
![IMG_7768.JPG](https://qiita-image-store.s3.amazonaws.com/0/88105/89cb36ab-5323-efe3-81fb-b69cd7a386d0.jpeg)

　　[Fusio360の日本語チュートリアルはこちらから](http://www.myautodesk.jp/jeff/material.html)

<hr>


**・菅原プレゼン「Unityはじめるよ　～光と影①～」**
　　　モバイル向け（低スペック機種含む）ゲームでグラフィックのクオリティを上げたい。
　　　その手法について調査中である。
　　　今回はその途中結果を発表。

　　　■AO(アンビエントオクルージョン)
　　　　現実世界では、入り組んだ箇所など関節光が届かない奥まった場所は暗くなる。
　　　　それを再現する技術。使えばクオリティが一段良くなる。
　　　　BakedGIのAOを使えば、モバイルでも負荷が小さくて済む。

　　　　BakedGIのAOを使わずに、頂点カラーを使う方法も試してみた。
　　　　クオリティはBakedGIのAOには敵わないが、処理負荷がほぼないので検討するに値する。
　　　　ただし、モデルデータを作る時に工夫がいるので、
　　　　Unity側でなんとかする処理を作りたい（今後の課題）

　　　　追記　アプリ部終了後の調査
　　　　　・頂点カラーにAOをベイクしてくれるアセットが販売されている模様
　　　　　・Blenderにも自動で頂点にAOをベイクする機能があるらしい

　　　■SSAO
　　　　AOをリアルタイムで動くように、画面内のオブジェクトに限定した処理。
　　　　動的なオブジェクトにもAOをかけられる。
　　　　ただし使えるグラフィックカードに制限がある。

![スクリーンショット 2017-04-22 14.28.08.png](https://qiita-image-store.s3.amazonaws.com/0/88105/dee6d10e-453c-d4d5-64d8-a533baebfb82.png)

![スクリーンショット 2017-04-24 15.17.01.png](https://qiita-image-store.s3.amazonaws.com/0/88105/7bcb1ac1-7a87-edc5-1d11-bef2778048db.png)

　　　　[第38回_プレゼン資料(～光と影①～).pdf](http://monolizm.com/sab/pdf/第38回_プレゼン資料(～光と影①～).pdf)
　　　　[プロジェクト一式（ao.zip）](http://monolizm.com/sab/src/ao.zip)


<hr>

**・TEA BREAK**
　　　　VR体験会
　　　　　OcclusuTouchを使ってVRを体験してもらった。
　　　　　今回は特にVR未経験の方が多いのもあって盛況でした。
TypeScript2.0時代の、型定義ファイル



npmから外部モジュールやライブラリをインストールしているプログラマーの皆さん、こんにちわ！どうも、はこです。
Angular2などで書いてると、なんとなく型定義ファイルを使ったり、ライブラリ側が用意してくれている(xxx.jsと同じ階層にxxx.d.tsがいる)等ありますが、jsしかないライブラリを使う機会も多いですよね！

さて、そういうときに既存の型定義ファイルを使うと便利です。
・・・が、型定義ファイルの書き方は歴史的経緯で混沌としています。


## 時代に沿わない古いやり方

これらの方法は、TypeScript 2.0 以降は動きません。

### 非推奨：TSD
> **管理ツール導入**
`npm install tsd -g`
**インストール**
`tsd install jquery --save`
**使用方法**
`/// <reference path="../typings/jquery.d.ts" />`

### 非推奨：typings
> **管理ツール導入**
`npm i --global typings`
**インストール**
`typings install dt~jquery --global --save`
**使用方法**
`/// <reference path="../typings/tsd.d.ts" />`


## 時代にマッチする推奨のやり方

TypeScript2.0 以降は、このやり方です。


**管理ツール導入は不要です！**

**インストール**

```
npm install -D @types/jquery
```

**使用方法**

```
import * as $ from 'jquery'
```

npmさえあれば、簡単に使えますね！

---

…もしも、あなたが探しているjsライブラリの型定義ファイルが

```
npm install -D @types/ライブラリ名
```
で見つからないようであれば、 `@`を抜いた `npm install -D types/ライブラリ名` を試してみてください。
<sub>( `@` を抜くと、 DT管理の型定義ファイルでなく、 github/types が作った型定義ファイルを参照するようになります。）</sub>




## 余談：

### DefinitelyTypedとMicrosoft-TyoesPublisherとtypesリポジトリ

[DefinitelyTyped (通称DT)](https://github.com/DefinitelyTyped/)
は非営利組織で、型定義ファイルの管理をしている団体。

[Microsoft-TyoesPublisher](https://github.com/Microsoft/types-publisher)
は営利組織 Microsoft inc. の管理するBOTで、たぶん非営利部門で、[npmの@types](https://www.npmjs.com/~types)の管理者であり、

[types](https://github.com/types) リポジトリは、npm上でホストされる [npmの@types](https://www.npmjs.com/~types) との違いは
1. npm上にないこと(単なるgitリポジトリ)
2. @typesに載ってないライブラリが存在するので便利
3. 運営主体が誰なのかよくわからない


### TypeScript型定義の雑な歴史

tsd : コメントで頑張って読む方式。DefinitelyTyped(DT)という組織が立ち上がり、様々なライブラリの型定義を登録。くそでかいリポジトリをpullする必要があった。
　↓
typings: とりあえずnpm上からも取れるし、DTからでも取れるようにした。
だが、基本的にはDTのまま。コメント定義で頑張って読む。非DTになりたい。
　↓
@types : 言語開発者(=Microsoft)が外部ライブラリをきちんと対応するために大議論。「npmでいれたい！」という主張にあわせ言語側の対応も再構築。
DTでホストしていた型定義をnpmに登録(BOTで)。
npm経由で入れることで

* package.jsonに定義がすべて統合される。typings.jsonのような依存性管理ファイルが不要に。
* tsd/typingsと違い、DTの巨大リポジトリをpullする必要がなくて早い
* 社外に出せないライブラリも `node_modules/@types/` 以下に保存されるように package.jsonで型定義作ればいいので簡単

とかの利点が得られるようになった。
ついでに言語側の方も対応したので、 `/// <reference path="..` ではなく `import {ClassName} from 'Modules/ModuleName'` と参照すれば型情報を取り込むようになった。
言語として完成された感ある・・・というか

**すごく楽！！！**


### 完全な余談

D!T! D!T!  [DT捨テル！](https://www.youtube.com/watch?v=J5eZRdspkxI)
[css] listを縦並びのまま中央寄せする方法

文章行頭は左揃えのままリストコンテンツを中央寄せにする方法をメモっておく。

色々な記事みて探ったけど、このやり方が一番いいっぽい。
ulにfloatかけてるので親要素で解除するのを忘れずに:ok_hand:

```css 

ul {
   float:left;
   position:relative;
   left:50%;
}

li {
   position:relative;
   left:-50%;
}
```

- ulにfloatをかけてリストコンテンツの横幅をコンテンツ内要素の幅と一致させる
- ulに`position: relative;`と`left: 50%;`でliコンテンツの起点を親要素の中央に
- その後にliに`position: relatibe`と`left: -50%;`でliコンテンツ幅の半分を右に寄せること全体が中央寄せになる

この方法ならコンテンツの中身やデバイスサイズに依存せずに中央寄せできるので便利！

## 追記
- スマホサイトの場合、`left: 50%;`で左にずらした分、コンテンツが画面幅をオーバーしてしまう場合がある
- `::after`で`clear: both;`入れる方法でfloatを解除すると画面が横にうにょうにょ動いちゃう
- なので親要素に`overflow:hideen;`つけて解除する方が良いみたい
Feature Requestを受けたエンジニアの5段階

1. denial / いらない機能だ
2. anger / この機能作って誰得。提案した人に会いたい
3. bargaining / なんでこういうの欲しいの?
4. depression / 汚い手段をとって実現しようとする自分も汚い、もう (嫁･婿) いけない
5. acceptance / 来週末に新バージョンリリースなのでよろしく
CSVファイルにデーターを出力する。

# 前提
現在RubyでCSVファイルにデーターを出力するのはいろいろな方法ありますが。データーが多い場合、処理スピードが遅いので新しいgemを開発しました。

今回のgemは一気全データを取らずに、リクエストごとに何千件(options[:batch_size]で指定された値)をデータベースから取ります。

### 使用方法
```ruby
self.response_body = Exporter.gen_csv(data, headers,
                                                :append => append,
                                                :mappings => MappingHelper.gen_mapping_user())
```
### 必須の引数
1. data
  * アクティブレコードの戻す値です.
  * 例: ```data = Ad.find(:status => 1).page(20)```
  
2. headers
  * Rubyの定数だから、そのままでつかえます。

### オプション
1. charset
 * 文字コードです。
 * デフォルトはShift_JIS。
2. include_column_names
 * カラム名をCSVファイルに出力判断のflagです。
 * デフォルトはtrueです。
3. structure
 * カラムを順番に出力します。
 * デフォルトは全カラムを出します。
 * 例: ["name", "status", "created_at"]
4. append
 * 他テブルのカラムもCSVに出します。
 * 例: append = ["ad.name", "ad.price_type", "ad.ext_campaign_id"]
 * 注意: テブル名必要です。
5. mappings 
 * カラムの整数型を文字列に交換します。
 * 例:
 
 ```ruby
     mappings = {
         :users_statuses => {1=>"有効", 2=>"退会済", 3=>"仮登録"}
     }
 ```

   users:テブル名
    status:カラム名(複数はstatuses)
 
### 注意
 カラム名をCSVファイルに出力したい場合、translation_ja.ymlを下記のように書いてください。

 ```ruby
 ja:
   activerecord:
         models:
           account: アカウント
         attributes:
           account: 
              user_name: ユーザ名
              password: パスワード
              password_confirmation: パスワード確認用
              name: 氏名
 ```

# 最後に
みなさん、ご拝読本当にありがとうございました。
mastodonをCentOS7.3に構築する（Docker利用版）

インターネット上にたくさん情報があり、特に説明は不要かと思いますが流行に乗って構築します。
以下の構築手順を参考にさせていただきました。
[DockerでMastodonをローカルで動かしてみた！ ので、その方法をご紹介](https://ai-create.net/magazine/2017/04/15/mastodon%E3%82%92docker%E3%81%A7%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E3%81%AB%E6%A7%8B%E7%AF%89%E3%81%97%E3%81%A6%E3%81%BF%E3%81%9F%EF%BC%81-%E3%81%AE%E3%81%A7%E3%80%81%E3%81%9D%E3%81%AE%E6%96%B9/)

**mastodonのソースコード**
https://github.com/tootsuite/mastodon

**mastodonの構築手順（Docker)**
https://github.com/tootsuite/documentation/tree/master/Running-Mastodon
→Docker-Guide.md
## ソースコードの取得
まっさらな状態から構築していきます。
まずは以下の方が書かれた記事を参考にDockerのパッケージを導入しておきます。
[CentOS7にdockerとdocker-composeの最新版をインストールする](http://qiita.com/LincolnHedgehog/items/f24694fde346dafc2b0d)

**ソースコードの取得**

```shell-session
# adduser mastodon
# gpasswd -a mastodon docker
# su - mastodon
$ git clone https://github.com/tootsuite/mastodon.git
// URLは上記の「mastodonのソースコード」より最新を確認してください
$ ls -l /home/mastodon/
drwxrwxr-x 15 mastodon mastodon 4096 Apr 23 19:01 mastodon
```

## WEBアプリの設定変更
取得したソースコードを動かすために設定ファイルを準備する。
**設定ファイルの変更**

```shell-session
$ cd /home/mastodon/mastodon
$ ls -a
.env.production.sample
$ cp .env.production.sample .env.production

// あらかじめdockerを動かしておく
$ docker-compose build
中略
Successfully
```
**.env.productionの編集**
私が保持しているnotebook.yokohamaドメインで動かします。
修正した箇所だけ抜粋。事前にSparkPostなどの外部サービスや、PostfixなどMTAを利用可能な状態にしておきます。今回はPostfixを利用します。

```:.env.production
LOCAL_DOMAIN=notebook.yokohama
LOCAL_HTTPS=false
DEFAULT_LOCALE=ja
SMTP_SERVER=DockerとホストPCのブリッジNWのIPを指定する
SMTP_PORT=25
SMTP_FROM_ADDRESS=info@notebook.yokohama

$ docker-compose run --rm web rake secret
→上記コマンドを3回実行して、以下にそれぞれ設定
PAPERCLIP_SECRET=省略
SECRET_KEY_BASE=省略
OTP_SECRET=省略
```

**メールの送信に関して、少し手間取ったので以下メモ**
参考記事：[Dockerコンテナ内部からホストのSMTPを利用したい](http://qiita.com/rerofumi/items/a6307f3db7c1cbfaaef2)
Docker上のmastodonからホスト上のPostfixを経由してメール送信を試みましたが、メール送信が失敗しました。原因はSMTP_SERVERにはlocalhostを指定していたためで、Docker上のコンテナから見た場合ホストサーバはネットワーク上別のサーバとなっています。そのためlocalhostはコンテナ自身となり、うまく動いていませんでした。コンテナとホストをブリッジしているNWのIPをSMTP_SERVERに指定すれば問題なく利用できました。

**ブリッジNWのIP**
ブリッジNWはdocker0というIF名らしい。

```shell-session
$ ip addr
docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN 
    link/ether 02:42:d4:1c:63:e8 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 scope global docker0
```


**DBの初期化**
DockerにおけるDB（おそらくPostgreSQL）の初期化

```shell-session
$ docker-compose run --rm web rails db:migrate
```

**CSSや、JSなど静的ファイルのプリコンパイル**
Railsのassets以下ファイルをコンパイルする

```shell-session
$ docker-compose run --rm web rails assets:precompile
```

## mastodonの起動
準備ができたので、Dockerを起動する

```shell-session
$ docker-compose up
```

https://notebook.yokohama
※サーバのリソースが不足したので、プロセスを落としています。
![mast.png](https://qiita-image-store.s3.amazonaws.com/0/110457/40361397-6710-9872-937b-6a7c869ac4df.png)

動きました。もともとこのドメインはSSLサーバ証明書を導入したNginxを使っていたので、前面のNginxにhttpsでアクセスして、mastodonにhttpで転送する形としました。

独自構築Postfixのため、スパムフィルタで止まる可能性があります。。。gmailや、yahooメールは問題なく受信できましたが、携帯電話のキャリアメールだと届きません。
Railsがrbenvローカルのみ状態で最新のrails newするお決まりパターン

Railsがglobalに入っていなくて、
localに古いRailsが入っている状態で、Rails newすると当然、古いRailsが展開される。
新しくRails newしようと、展開されたGemfileを新しいRailsに書き換えて、
`Rails new プロジェクト名`とかやっちゃうと下の階層にできてしまってややこしくなるよ。という話です。

要は、

```
Rails new .
```

と指定すると現在のカレントディレクトリ名でプロジェクトが展開されることを知っているかどうか。と

```
bundle init
```

で先にGemfileのみ生成する方法を知っているか。
です。

localモードで最新Railsをインストールする王道の手順は以下です。

```
mkdir project_name #プロジェクト名でファイルを作る
cd project_name 
bundle init #Gemfileのみで作る
vi Gemfile
require 'rails'
bundle install #最新のRailsを入れる
bundle exec rails new . #最新のRailsで展開される。
#Gemfileを上書きするかでYを選択。
bundle install
```
vim で ANSI color codes を除去する

ANSI color code が混ざったログファイルを読む際、 `less -R <filename>` で文字に色が付きます。

しかし、やっぱり vim の高度な編集機能を使いたい。でも、普通に vim でファイルを開くと `^[[4;36;1mSQL (0.2ms)^[[0m   ^[[0;1mSET NAMES 'utf8'^[[0m` のようにカラーコードがそのまま表示されてしまい、超読みづらい…。

いっそ vim で開く時は ANSI color code を消してしまいしょう。以下はその置換コマンドです。

```
:%s/<1b>\[[0-9;]*m//g
※ <1b> はそのまま入力するのではなく、 <Ctrl+v><ESC> で入力する Escape 制御文字です。
```

よく使う場合は、 vimrc にコマンドとして追加してしまいましょう。

```
command! DeleteAnsi %s/<1b>\[[0-9;]*m//g$  
```

これで `:DeleteAnsi` をタイプするだけで ANSI color code を削除できます。

良い vim ライフを。


参考
----
[syntax highlighting - Can Vim interpret terminal color escape codes? - Vi and Vim Stack Exchange](https://vi.stackexchange.com/questions/485/can-vim-interpret-terminal-color-escape-codes)
metaタグで自動翻訳を阻止する

英語サイトや中国語サイトにアクセスすると、よく勝手に翻訳されてしまう。

<img width="595" alt="スクリーンショット 2017-04-24 14.26.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/32100/27231263-6b09-a793-11a0-9b864df7f85a.png">

以下で、勝手に翻訳されないようにする。

```html
<meta name="google" content="notranslate">
```
seaborn の heatmap で美しく可視化


#Python の Seaborn で相関関係を美しく可視化

##変数の Correlation を綺麗に

まずpandasやnumpy、seabornなどの必要なライブラリをimportし、今回使うよく知られたデータセットのiris をデータフレームで読み込む。


![Screen Shot 2017-04-24 at 07.00.41.png](https://qiita-image-store.s3.amazonaws.com/0/161691/9dc2c2c8-a977-22b1-ad57-0c00c5544a80.png)

そして、このkeyのSepalLengthCm, SepalWidthCm, PetalLengthCm, PetalWidthCmの相関関係を seaborn の heatmap で可視化。


```python:seaborn

# correlation between それぞれの変数
cr = ['SepalLengthCm', 'SepalWidthCm', 'PetalLengthCm','PetalWidthCm']
cr_matrix = iris[cr].corr()
heatmap = sns.heatmap(cr_matrix,cbar=True,annot=True,square=True,fmt='.2f',annot_kws={'size': 15},yticklabels=cr,xticklabels=cr,cmap='Accent')


```
![Screen Shot 2017-04-24 at 07.10.32.png](https://qiita-image-store.s3.amazonaws.com/0/161691/7ad7f125-a0aa-8e67-f09f-d108a34ed4e2.png)


これで相関図ができる。上記の相関図を見てみると PetalLengthCmとPetalWidthCmが高い相関関係にあることがわかる。

下記はheatmap内の変数の意味である。


##heatmap 内の変数まとめ

- cbar 
cbarは相関図の右にある数値の大小を示しやすくするために挿入できる棒のこと。Trueで挿入できる。     

- annot
このannotをTrueにすることでひとつひとつの交わるboxのなかに数値を表示させることができる。

- square
squareをTrueにすると、ひとつひとつの枠が正方形になって見やすくなるのでおすすめ。

- fmt
枠の中の文字列に与えるルール。上記では .2f とし、少数第2点までを表示させている。

- annot_kws
annotがTrueの時の文字列の操作。

- yticklabels
y軸においての値。ここでは、correlation（相関）を見るので、x,yともにiris内のキーを入れる。

- xticklabels
同様にx軸においての値。

- cmap
matplotlibでも使われるカラーコードをseabornにおいても使うことができる。カラーコード一覧については下記のリンクを参照。今回は'Accent'のカラーコードを使用。

[cmapを使う際はこの中から選んで参照する](https://matplotlib.org/examples/color/colormaps_reference.html)
マストドンで流れてくる画像だけを表示したい！

マストドンのタイムラインを画像だけが流れてくるモードにするCSS拡張を作ったので導入方法を説明します。
![キャプチャ２.JPG](https://qiita-image-store.s3.amazonaws.com/0/177100/2c393d49-74fa-f84b-f598-1b9c02f26233.jpeg)
▲pawoo.netのキャプチャ

# Mastodon Image Tracker
https://userstyles.org/styles/141607/mastodon-image-tracker

# 使い方
1. 上URLを開いてブラウザ拡張のStylishをインストールします。
  - 「To use this style, first install Stylish.」の青いボタンを押す。
2. Stylishがインストールされてる状態だと同じ場所のボタンからテーマのインストールができます。
3. マストドンのメインページを開きます。

# その他
- chrome,firefoxでのみ表示確認しています
- 解除したい場合は、ブラウザ右上のStylishのアイコンからコントロールできます
- ログイン画面や設定画面のスタイルはそのままです
- その他のMastodonテーマはこちら https://userstyles.org/styles/browse/Mastodon
ディレクトリ配下のファイルアクセス

# ディレクトリ配下に存在するファイルへループでアクセスする方法memo

pythonであるディレクトリ内の全ファイルに対して処理をしたいが，
毎回忘れるためメモ．

```python:fild_all_files.py
def fild_all_files(directory):
    for root, dirs, files in os.walk(directory):
        yield root
        for file in files:
            yield os.path.join(root, file)
```

引数に対象ディレクトリのパスを渡してループするだけでファイルの中身が返ってくる．

## 使用例

```python:main.py
for filename in fild_all_files(file_dir):
    print filename
```

以上
S3+CloudFrontで、index.htmlが落ちてくる/付加されないばあい

### 概要

S3+CloudFrontで静的なページをAWSにもっていこうとした所、引っかかった部分のまとめ。

+ w3mで接続確認しようとすると、内容が表示されずにindex.htmlがダウンロードされる
+ Content-Typeを疑い、opensslでつなごうとするとSSLのエラー

以上の状態からの対応作業

### CustomSSL(SNI)の証明書の場合の接続確認

+ 証明書が有効か確認しようとしてみるとエラー

```
$openssl s_client -connect example.com:443
no peer certificate available
```


+ サーバーネームを指定する必要がある

```
$openssl s_client -connect example.com:443 -servername example.com
```


###  GET / HTTP/1.0で400 Bad Request

```
GET / HTTP/1.0

HTTP/1.1 400 Bad Request

Server: CloudFront
Date: Mon, 24 Apr 2017 03:00:56 GMT
Content-Type: text/html
Content-Length: 551
Connection: close
```

+ きちんとHostもつける

```
GET / HTTP/1.0
Host: example.com

HTTP/1.1 200 OK
Content-Type: application/x-directory
Content-Length: 0
Connection: close
```

### CloudFrontで設定したドメイン / へのアクセス時に、index.htmlが補完されない(デフォルトルートオブジェクト)

+ S3で設定していたとしても、CloudFront側で設定しなければindexは補完されない

```
HTTP/1.1 200 OK
Content-Type: application/x-directory
Content-Length: 0
Connection: close
```


http://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/DefaultRootObject.html


SNIのところと、indexの補完が出ずに二日も時間取ってしまった悲しみ…
macOS で Emacs 25.2 をビルド

Emacs 25.2 リリース。

https://www.gnu.org/software/emacs/news/NEWS.25.2

Bugfix な模様。

ObjC, Swift 以外の言語を使うシーンがあると相変わらず活躍するけど、
ほぼほぼ Xcode 上で開発することが多くなって、 magit ぐらいしか使っていないという...

が、長年使ってるエディタなので、どうしても手放せない。手放さない。

# 環境

* OSX 10.12.4
* Xcode 8.3.2 (8E2002)


# ビルド、インストール

```shell-session
cd src
curl -OL http://ftpmirror.gnu.org/emacs/emacs-25.2.tar.xz
tar Jxvf emacs-25.2.tar.xz
cd emacs-25.2
./configure --without-x
make
make install
cd nextstep
mv Emacs.app/ /Applications/Emacs.app
```

# メモとか

一回、クリーンインストールしてからビルドしてみないと、何かのタイミングで Homebrew で入れたもののおかげでビルド通ってるとかある気がするので、そのうち試す。

ImageMagick はそうかな。あと何があるだろう。


# 更新履歴

2017.04.24 新規投稿