OmniAICreator/Qiita-1.07M huggingface dataset:
バッチファイルで配列とforeachを使う方法

# はじめに
Windows バッチファイルには、値の集合を取り扱うためのデータ構造や文法規則はありませんが、シンボル名をうまく処理することで、配列やforeachに近い処理を行うことが出来ます。

# 要素番号をカウントカウントアップする方法
シンボル名に要素番号を付けて定義することで、疑似的な配列のように扱うことができます。

```bat:script.bat
@echo off
setlocal enabledelayedexpansion

rem 要素番号をつけて変数を定義
set month_1=January
set month_2=February
set month_3=March

rem foreachループ
set i=1
:FOREACH_MONTH
set it=!month_%i%!
if defined it (
  echo month_%i%=%it%
  set /a i+=1
  goto :FOREACH_MONTH
)
```

## 実行結果

変数`month_<n>`を数値順に表示して、スクリプトは終了します。

```
>call script.bat
month_1=January
month_2=February
month_3=March
```

## 解説

エコー機能の無効化と遅延環境変数機能の有効化を実施します。
遅延環境変数は、後述するイテレータ(`it`)への`set`において必要となる機能です。

```bat:
@echo off
setlocal enabledelayedexpansion
```

配列を模擬して添え字を付けた変数`month_<n>`を設定します。

```bat:
set month_1=January
set month_2=February
set month_3=March
```

ループでは、添え字(`i`)を用いて`month_<n>`の要素を取り出してイテレータ(`it`)へ代入します。
これは遅延環境変数によって、下記の通り二段階の変数読み込みを実行して実現されます。[^1]

```bat:
set it=!month_%i%!
      =!month_1!  # 行解釈時に環境変数(%)を読み込み
      =January    # コマンド実行時に遅延環境変数(!)を読み込み
```

`it`への代入が有効な場合、`if defined`の条件が満たされて、カウンターのインクリメントと、ループ先頭へのジャンプが実行されます。

```bat:
if defined it (
  echo month_%i%=%it%
  set /a i+=1
  goto :FOREACH_MONTH
)
```

ループ回数が進み、存在しない添え字付き変数にたどり着くと、`set it=`によって`it`が削除されます。
これにより`if defined it`の条件が不成立となるため、ループが終了します。

[^1]: 変数を二段階に読み込む方法については @plcherrim さんの記事が参考になります。(https://qiita.com/plcherrim/items/c7c477cacf8c97792e17)

# setの変数一覧を使う方法

`set`コマンドの環境変数一覧を表示する機能を使ってループさせる方法です。
この方法では特定の文字列から始まる環境変数名に対してシーケンシャルに処理を行うことが出来ます。

```bat:script.bat
@echo off

rem monthから始まる環境変数
set month_1=January
set month_2=February
set month_12=December
set monthly=True

for /f "usebackq delims== tokens=1,2" %%a in (`set month`) do (
    echo %%a, %%b
)
```

## 実行結果

`month`から始まる変数を文字列順に表示して終了します。

```:
>call script.bat
monthly, True
month_1, January
month_12, December
month_2, February
```

## 解説

この方法では`for`コマンドのトークンスイッチ`/f`を使って`set month`コマンドの実行結果を順次処理しています。

```
FOR /F ["オプション"] %変数 IN (`コマンド`) DO コマンド [コマンド パラメーター]
```

`set month`コマンドを実行すると、`month`から始まる環境変数一覧を文字列順に出力します。

```
>set month
monthly=True
month_1=January
month_12=December
month_2=February
```

オプションの意味はそれぞれ下記のとおりです。
`usebackq`: 逆引用符で囲まれた文字列をコマンドとして処理して、結果を1行ずつ読み込む。
`delims==`: 区切り文字を`=`にしてトークンに分解する。
`tokens=1,2`: 分解されたトークンのうち1番目を`%%a`、2番目を`%%b`に割り当てる。
Pymel Control panel



な　なんじゃこりゃあメモ

#これはなに？

PyMELのgithubページの、
pymel > maintenance にあった「pymelControlPanel.py」

https://github.com/LumaPictures/pymel/blob/master/maintenance/pymelControlPanel.py

#起動

```python
import sys
sys.path.append('/path/to/downloadFolder')
import pymelControlPanel as pcp

pcpui = pcp.PymelControlPanel()
```

#スクリーンショット

<img width="1372" alt="スクリーンショット 2016-05-22 19.53.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/102581/0c52aa1e-67f7-5585-c8c7-f0757f186835.png">


#備考

- 左カラムはノードのリストっぽいです。選択すると中央カラムに読み込まれます。読み込みには数秒かかります。
- 起動時に`pymelControlPanel : could not find class Substance # `みたいな警告がでたやつは、触ってもなにも起きません。
- 右カラムのリストは、出るやつとでないやつがあります。Transformノードではいろいろ出てますが、fileノードではなにも現れませんでした。

#Cache Results?

追記です。
<img width="256" alt="スクリーンショット 2016-05-22 20.55.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/102581/21ba0050-fd4b-53f5-8747-1f6e9cae06b4.png">

UIを閉じるときにこういうのがでました。
ということは、Yesにしたらそれが今後反映されるってことですかね。本当にPyMELの挙動をメンテするのに使えるってことでしょうか。
チキンなのと、いまは時間とって確認とかできないので、今回はNoにしました。

#まとめ？

maintenanceフォルダにあるくらいだから、メンテナンス用なんでしょうね。
そのうちちゃんと眺めたいような気がします。

READMEちゃんと読もうという話し

> README
https://github.com/LumaPictures/pymel/blob/master/maintenance/README.md
texのソースファイルファイル分割方法

texでファイルを管理する方法を示します。
メインのソースファイルには\input{ファイルパス}を記述します。

```tex:report.tex
\documentclass[a4j]{jarticle}

\title{レポート}
\author{著者}
\date{2016/05/22}

\begin{document}
\maketitle

\input{./目的.tex} %目的の章です。

\input{./原理.tex} %原理の章です。

\input{./方法.tex} %方法の章です。

\input{./結果.tex} %結果の章です。

\input{./考察.tex} %考察の章です。

\end{document}

```

呼び出される側は以下のように書きます。

```tex:目的.tex
\section{目的}
目的です。
```

\documentclassなどは書けません。
メインのソースファイルの部分にそのまま挿入されるような感じになります。
(内部の処理はわかりませんが。)
docker-machine で、Debian(Jessie) 上に docker-engine を導入する

ゴールデンウィークにやってみましたので、その備忘録です。この後は、Swarm 入れてやろうなんてことを考えています。

微妙に突っかかったりしています。

# 前提条件/構成

次の構成で実施しました。

- クライアント
`iMac(El Capitan)` へ [docker-toolbox](https://www.docker.com/products/docker-toolbox) をインストールしておきます
- サーバ [Proxmox VE](https://www.proxmox.com/en/) 上に、次の 3つの仮想マシン(VM) を準備しました

1. docker00 [Debian jessie](http://www.debian.or.jp/) : Swarm Manager 用 (仮IP 192.168.0.100)
2. docker01 [Debian jessie](http://www.debian.or.jp/) : Docker agent #1 (仮IP 192.168.0.101)
3. docker01 [Debian jessie](http://www.debian.or.jp/) : Docker agent #2 (仮IP 192.168.0.102)

- debian サーバでは、次の通り構成してます

1. ssh で root以外はログインできるように設定
2. docker 管理をするユーザが、パスワードなし sudoできるように設定
3. 今回は `docker` ユーザで実行します


今回は、この 3台へ `docker-machine` を使って、`docker-engine` をインストールしました。

## docker-machine を利用する理由

リモートに Docker 用のサーバ/VM を準備するとなると、管理が必要です。その管理の手間は少しでも抑えたく、今回は `docker-machine` を利用することにしました。

以前は、[CoreOS](https://coreos.com/) でクラスタを構成して管理することも考えたのですが、管理側となるクライアントの Macの最新版 Dockerと、`CoreOS`上の Docker とで、バージョンがあわずに、接続すらできない事象が多くあり、その為にα版やβ版を利用することも難儀ですし、さらに言うと `CoreOS`のα版でも Dockerのバージョン追いついてこないことが多く、颯爽と諦めました。

## debianサーバへ Dokcerを構築する理由

自宅で [Proxmox VE](https://www.proxmox.com/en/) 使って、仮想サーバたくさん運用してるので、個人が下手にパブリッククラウドに手を出してしまうと、運用コストでガッカリするのでやめました。

3万くらいあると、そこそこのサーバがえいやと建てられてしまうのと、電気代も数百円単位で運用できてしまっているので、数年利用することを考えるとお察しなのです。

とは言え、最近、格安サーバが出てこなくなったので、ある程度のところでクラウドへ移行していくかも知れません。

# docker-machine を使って、debian へ docker-engine を導入しよう

フツーの Linux 上へ `docker-machine` を使ってインストールする場合には、次の `generic`ドライバを使います。実のとこ、`Proxmox` に対応したドライバがあるのですが、今はまだ時期尚早感すごかったので、見なかったことにしています。

[汎用(generic)ドライバ — Docker-docs-ja 1.11.0 ドキュメント](http://docs.docker.jp/machine/drivers/generic.html)

後は簡単。各サーバに対して、次のコマンド。

```bash:docker-machine
$ docker-machine create -d generic --generic-ssh-user docker --generic-ip-address 192.168.0.100 docker00
```

各コマンドラインオプションは、次の項目を設定しましょう

| オプション | 今回の設定値 | 説明 |
|--------|--------|---|
| -d    |  generic | 使用するドライバを指定します。今回は `generic` |
| --generic-ssh-user | docker | リモート(今回はdebian)側で、sudo 可能なユーザ |
| --generic-ip-address | 192.168.0.100 | 導入先のサーバ/VM のIPアドレス|

`docker00` は、管理するための名前で、ホスト名でもなんでも良いです。

簡単ですね、これを他の `docker01` `docker02` にも実行してみると、インストール完了です。ネットワーク環境にも寄りますが、1台の docker-engine 導入完了までに 5〜10分くらいかかるっぽいです。気長に待ちましょう。

導入後に `docker-machine ls` コマンドで、ステータスが見られます、今だとこんな感じですね。

```bash:docker-machine-ls
$ docker-machine ls
NAME       ACTIVE   DRIVER    STATE     URL                        SWARM   DOCKER    ERRORS
docker00   *        generic   Running   tcp://192.168.0.100:2376           v1.11.1
docker01   -        generic   Running   tcp://192.168.0.101:2376           v1.11.1
docker02   -        generic   Running   tcp://192.168.0.102:2376           v1.11.1
```

おめでとうございました(´∀｀)と言いつつ、重要なポイントは次

## 注意事項

generic ドライバ on docker-machine v0.7.0 では、`--generic-ssh-key` を使って、ssh-key のファイルを指定することはできません。bugっぽいです。直るの待ちましょう。
Amazon Machine Learningにとりかかる前の整理

Amazon Machine Learningを入門しようとしているが、機械学習が初めてでチュートリアルやっただけではよく分からなかったので、とりあえず何が出来るか、また始める前にどのようなことを知っておけばよいのかをまとめてみる。

# Amazon Machine Learningで出来ること
Amazon Machine Learning(以下ML)を使うと、これまでに貯めてきた様々なデータ(顧客データやユーザの行動データ)から、機械学習によりもっと精密にビジネス的な意思決定を行うことができるようになる。
ML内部では数学・統計的なアルゴリズムにより過去データを学習し、インプットデータに対し将来的な予測を立てる。
例えば、「こんな属性のユーザは将来的にこの商品を買う/買わない」や「来月のこの商品の売上予定は？」など

# MLで使用できるモデル
MLではいくつかの分析モデルがあり、用途に応じて適切なものを選んで構築するようになる。
具体的には以下のようなもの。
またそれぞれに対応した予測アルゴリズムがあるが、実際に使う分では知らなくても問題なさそう。時間があればそれぞれのアルゴリズムについても調べてまとめてみようと思う。

## Binary Classification(二項分類)
その名の通り、2値で表現できるもの。
ex). このユーザは商品を"買う"or"買わない"、このメールはスパムで"ある"or"ない"、このユーザは"ボット"or"人間"
予測アルゴリズムはロジスティック回帰分析

## Multiclass Classification(多項分類)
カテゴリ分けのようなもの。本のカテゴリや映画のカテゴリなど。
予測アルゴリズムは多項ロジスティック回帰分析

## Regression Classification(回帰)
過去データの傾向から将来の数値を予測する。
ex). この商品の、来月の売上は？など
予測アルゴリズムは回帰分析

# MLを使いはじめる前に
## INPUT/OUTPUTの整理
保有している膨大なデータから、何をINPUT(Datasource)とし、どのようなデータをOUTPUT(予測)したいかを整理する。その際に、OUTPUTが上述のどのようなモデルになるかを決めておく必要がある。
また基本的に、MLでデータを学習させる場合はcsvになり、1カラムに対し1ラベルが必要になる。

## Datasourceを学習用と評価用に分ける
これは実際にMLで作業している過程で出てくるのでこの段階でする必要はないが、いきなり言われても良くわからなかったので、事前に知っておくとよい。
MLで最初にすることが、既存のデータ(csv等)をMLに入力し学習させること。しかし、いくら学習したとしても、その学習がどの程度の精度があるのかが全く分からない。
そこで、Datasourceを"学習用(Training)"と"評価用(Evaluation)"に分割し、学習した内容がどの程度精度が高いかを評価用にしたデータを使って判定する。
一般的に70:30程度の割合でやるらしい(MLもデフォルトそうなっていた)

# MLを利用する流れ
実際にはもっと複雑だが、だいたい下記のような流れとなる。

* 学習用・評価用データの選定、加工など
    * csvなどのデータをS3に置いて、MLから読み込み。
* データを学習用・評価用に分ける
    * 70:30などに分けて予測モデルを作る
* モデルの学習
    * モデルを作り終わると、MLがモデルを学習させる
* モデルのパラメータ調整
    * モデルの予測精度を上げるために、調整する
* モデルの評価
    * 評価ウィザードによりモデルを評価する（予測のパフォーマンスなど）
    * 予測に使用する閾値の設定
* モデルを使って予測する
    * 大量のデータを一括で予測する"Batch Prediction"
    * モバイルやWeb等に最適な"Realtime Prediction"がある

# 今後の投稿予定
実際にMLを使ってみてハマったポイントや良くわからなかった部分等があればまとめてみる。
また、あまり知らなくてもML自体は進められるが折角なので統計的な側面についても時間があればまとめてみる。
【C#】ClosedXMLでExcelテーブルをIEnumerable<T>オブジェクトに変換

| CodePage | Name | DisplayName | Note |
|----------|------|-------------|------|
|932|shift_jis|Japanese (Shift-JIS)||
|20932|EUC-JP|Japanese (JIS 0208-1990 and 0212-1990)||
|65001|utf-8|Unicode (UTF-8)||

上記のようなテーブルのみ含むExcelファイルをencodings.xlsxという名前でCドライブ直下に保存した場合、下記コードでDisplayNameフィールドの値の一覧を表示することができる。

```csharp
using ClosedXML.Excel;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;

class EncodingInfo
{
    public int CodePage { get; set; }
    public string Name { get; set; }
    public string DisplayName { get; set; }
}

class Sample
{
    public static void SetProperty<T>(T obj, string name, object value)
    {
        PropertyInfo property = typeof(T).GetProperty(name,
            BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase);

        property?.SetValue(obj, Convert.ChangeType(value, property.PropertyType));
    }

    public static IEnumerable<T> ConvertExcelTable<T>(IXLTable table) where T : new()
    {
        var names = table.Fields.Select(field => field.Name).ToArray();

        foreach (var row in table.DataRange.Rows())
        {
            var obj = new T();
            foreach (var name in names)
            {
                SetProperty(obj, name, row.Field(name).Value);
            }
            yield return obj;
        }
    }

    public static void Main(string[] args)
    {
        var path = @"C:\encodings.xlsx";
        var workbook = new XLWorkbook(path);
        var worksheet = workbook.Worksheet(1);

        foreach(var encoding
            in ConvertExcelTable<EncodingInfo>(worksheet.RangeUsed().AsTable()))
        {
            Console.WriteLine(encoding.DisplayName);
        }
    }
}
```

* Excelで数値型は`System.Double`であるため、`int`型プロパティにセットしようとすると`System.ArgumentException`例外が発生する。問題を回避するために`Convert.ChangeType`メソッドを使用しているが、また別の条件で例外が発生する可能性は十分にある。
* `IXLWorksheet.RangeUsed`メソッドは、シート内の使われている範囲のみを取得する便利なメソッド。
* `ConvertExcelTable`メソッドの戻り値である`IEnumerable<T>`の要素をすべて処理し終える前に`workbook`もしくは`worksheet`を閉じると例外が発生すると思ったけれど、発生しない。具体的には、`Main`メソッドの中身を以下に書き換えても問題なく動作する。

```csharp
var path = @"C:\encodings.xlsx";

IEnumerable<EncodingInfo> enumerable;

using (var workbook = new XLWorkbook(path))
using (var worksheet = workbook.Worksheet(1))
{
    enumerable = ConvertExcelTable<EncodingInfo>(worksheet.RangeUsed().AsTable());
}

foreach (var encoding in enumerable)
{
    Console.WriteLine(encoding.DisplayName);
}
```
[ Pythonista ] 選択したテキストをコピーするアクションを作った話

# Pythonistaのカスタムキーボードにはペーストはあるのにコピーがないのでアクションを作りました

Pythonista、便利ですね。出先でちょろっとコーディングするにも最適ですし、GUIも簡単に作れるのでiOS端末のハックにもとても使い勝手が良いです。

カスタムキーボードも良く出来てて不満はほとんどないんですけど、ペーストキーはあるのにコピーキーがないのはなんでなんじゃいというわけでアクションで代用してみることにしました。

※ 本記事執筆時のiOSバージョンは9.3.2、Pythonistaのバージョンは2.0です

## 序論 Pythonistaとは
まずはPythonistaについて簡単にご紹介。PythonistaはiOS用の有料アプリでiPhone/iPad両対応の**Python開発環境**です。

[Pythonistaを App Store で](https://itunes.apple.com/jp/app/pythonista/id528579881?mt=8&ign-mpt=uo%3D4)

オンラインコンパイラではなく、本物のPython[^1]が同梱されておりローカル上で動作します。

またiOS用に設計されたカスタムキーボードの操作性も十分実用に耐えうるもので、ストレスのないコーディングが行えます。

![pythonista01-compressor.gif](https://qiita-image-store.s3.amazonaws.com/0/102012/0c967817-00c8-f81a-d4a0-47c4ccbfb4ad.gif)

同梱の専用モジュールも強力で、

- クリップボードへのアクセス
- 位置情報へのアクセス
- iOSのカメラ機能へのアクセス
- 共有シートからのデータ受け渡し
- Objective-Cのクラスへのアクセス

等々、ちょっと引くレベルの機能が満載です。パワフルなモジュールを使うことで、楽しい開発が行えるとってもオススメな環境です。

現在ユーザーの熱い要望によりPython3系のPythonistaベータ版も現在開発中とのこと。

[Pythonista 3.x Beta](https://docs.google.com/forms/d/10qRhNIvk7WzcR5_DsQSRNIqLkIqeTYYafbPi9bjj_cw/viewform?c=0&w=1)

## 本論 アクションを作成してエディタを拡張する
上記動画でもやっていますが、Pythonistaではキーボードを2本指スワイプで選択範囲をスムーズに変更できるのですが、範囲設定後Copyコマンドが出てこないのがストレスでした。

そこでPythonistaの勉強がてら、選択範囲の文字列をクリップボードにコピーするアクションを作ってみました。以下その作業手順です。

### site-packagesディレクトリにcopy_text.pyを作成する
site-packageディレクトリはPythonistaにデフォルトで用意されているディレクトリで、インポートパスが通ってるとのこと。(Readme.txtに書いてありました)

<img width="768" alt="IMG_0013.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/102012/67009b59-d323-a19a-9ff7-a5bc49c86f5b.png">


言われたとおり、そこにcopy_text.pyを作成しましょう。後々選択した文字列を取得して改変する用途も考えて、get_selected_textとcopy_textというふたつのメソッドに機能を切り分けています。(簡単なコードなのでスクリプトの説明は割愛します)


``` copy_text.py

# coding: utf-8

import sys,editor,clipboard,console
reload(sys)
sys.setdefaultencoding('utf-8')

def get_selected_text():
	text = editor.get_text()
	selection = editor.get_selection()
	selected_text = text[selection[0]:selection[1]]
	return selected_text
		
def copy_text():
	if get_selected_text():
		clipboard.set(get_selected_text())
		
if __name__ == "__main__":
	copy_text()	

```

コードが書き終わったら、copy_text.pyの編集画面でテキストを選択、Runボタンを実行すればクリップボードに選択範囲のテキストがコピーされているはずです。

### アクションを作成する
次にcopy_text.pyをアクションに登録します。アクションへの登録は画面右上のスパナボタンから。その様子も動画に撮ったのでご参照ください。(ファイルサイズの問題で解像度を半分に落としています)

![pythonista02_herf-compressor.gif](https://qiita-image-store.s3.amazonaws.com/0/102012/556884e3-73e8-5a87-7c82-d45f77f9684f.gif)

手順としては下記のとおりです。

1. スパナボタンを押す
2. Editを押す
3. +マークを押す
4. カスタムコマンド名、アイコンを指定する

### 使う
任意のファイルを編集中にコピーしたいテキストを選択したら、スパナボタンを押しCopyを実行するだけ。

もちろん、対象ファイルではcopy_textモジュールのインポートは不要です。

<img width="768" alt="IMG_0016.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/102012/527440b3-0cbc-58d5-60b0-fddd5d3868cf.png">

### 結論
**Pythonista楽しい！！**

[^1]: Pythonista2.0ではPythonのバージョンは2.7.5です。
「React.js界隈の人に聞きたい」だそうで

React.js界隈の人に聞きたい
http://anond.hatelabo.jp/20160521163144

今自分が絶賛React＋Reduxを書いてるからこんなエントリーが目に飛び込むと反応せざるを得ない気分だ。

### そもそも世の中にそんなにSPAがあるのか
数えたことがないのでなんとも言えない。ただSPAにしたら初回以後のLoadが圧倒的に軽くなるから、UXは間違いなくSPAが上という理由でみんな「次新規をやるならSPAでやろう」と思うんじゃないか？ 

### JSXを使うことに抵抗ないんですか？
最初はちょっとあったかも。それなりに恩恵を受けて今はなんとも思わない。気持ち悪いと思うなら他に代替案を言ってほしい。

### ページ遷移型のUIに比べて、SPAであることのメリットが明らかに生きているページって少なくないですか？
Loadingの発生と通信量をコントロールできる、パーツの再利用ができる、これだけで圧倒的にSPAがいい。Loadingのことを気にしないというなら別だが、Loadの長さとタイミング大きくUXに影響を与えるのは現在の定説だと自分は認識している。

### 五年後のビジョンがありますか？
変えたくなければ5年前のままでメンテしてればいい。アーキテクチャを変えれば改築にかかったコスト以上のメリットがあると思ってはじめて新しい概念・アーキテクチャをいれるだろう。

### virtual domのメリット
たしかに、10秒に一回レンダリングするようなサイトはそんな多くないから、パフォーマンスのよさはメリットとして少ないかも。みんなが飛びつく理由はデータの見通しがよくなるところじゃないかな？ FluxとかReduxとかと組み合わせると威力が発揮する。というか今のところ、React＋Redux以外の選択が見出せない。

### 結論
ペライチはjQueryでもよろしい。小規模は好きなMVCライブラリを使え。
ただ、フロントのロジックをサーバーで書くのはもうやめよう。
中規模以上は今のところ、React＋Redux以外が思いつかない（さぐっと＆メンテなしなら自分はCoffee＋Backboneを選ぶ）。React＋Redux＋React-Bootstrapでだいぶ幸せになれるはず（BootstrapのComponentは若干バージョンアップあるかも）。向こう5年は戦えると思うから存分に使うのがよろしい。
su|sudo|polkit を使うべきでないただ一つの理由(とりあえずの対策を追記)

#理由
現状の一般的な使われ方(特にデスクトップでの)では､ "権限を持つアカウント" と "権限を持たないアカウント" の分離を無意味なものにしてしまっているから｡

#概要
"現状の一般的な使われ方" とは､ネット閲覧などの普段使いのアカウントに "ALL=(ALL) ALL" のような設定をしているような使い方です｡
(例えばUbuntuのインストール時に作ったアカウントでそのまま普段使いをしているような場合)

これらのツールは実行時にパスワードによる認証を必要とするため､一見そのような使い方でも安全であるかのように思えます｡
しかし実際は､そもそもの第一歩となるこれらのツールがユーザーのセッションから起動されるためそのパスワードによる保護にはあまり意味がありません｡

なおあくまで一般的な状態での話であり､｢強制アクセス制御とか使えば防げるよ!｣といったあたりには触れません｡

#例
これらのツールのパスワード保護は実質的には無意味であること､ "su|sudo|polkit が使えるアカウント" (以下アカウントAとする)の侵害が "システム全体" の侵害と同等であることの説明であるため､スタート地点はアカウントAが侵害された時点です｡
つまり攻撃者はアカウントA自身のファイルを改ざんしたりはできるが､パスワードは知らないため "sudo rm -rf --no-preserve-root" などは実行しようとしても実行出来ないという状態です｡

- Bashのfunctionを使う

攻撃者はアカウントAの.bashrcなどは書き換えることが出来ます｡
なのでそれらのファイルに

```lang:
function sudo() {
    if [ ! -f "/tmp/pass" ] ; then
        stty -echo
        $(which sudo) -k
        echo "[sudo] password for $USER:"
        read pass
        stty echo
        echo $pass >> /tmp/pass
        echo "Sorry, try again."
    fi
    $(which sudo) "$@"
}
    
```
のように追記するだけで攻撃者は正規のユーザーが次にsudoを使う時に､実際のsudoをバイパスさせてパスワードを盗むことが出来ます｡

- Xorgを使う

Xは各クライアント毎の入出力になんら制限を課していません｡
なのでX上でアカウントAが入力するパスワードは同じXサーバに接続する他のクライアントプロセスから覗き放題となっています｡
簡単に確認するには､xinputを使ってみるといいと思います｡
端末を2つ起動し片方でxinputを実行､もう片方でsudoなどを使うと､パスワード入力もきちんと取得されているのが確認できます｡

ちなみに｢xinputをインストールするのにrootの権限が必要だろう｣と思う人がいるかもしれません｡
ですが､rootの権限が必要なのは書き込む権限のない場所に展開しようとするからであって､攻撃者はアカウントAのホームに展開すればいいだけなのでなんの問題にもなりません｡
｢共有ライブラリの存在やバージョン違いなどで起動できないだろう｣というのもディストロ配布のバイナリはそうなっている､というだけで攻撃者には大した制限にはなりません｡

#まとめ

**"su|sudo|polkit が使えるアカウント" は "権限を持たない普通のアカウント" ではありません｡ 
たとえそれらを使っていない時でも､ "su|sudo|polkit が使える" 時点でそれはrootと同じ "権限を持つアカウント" であり､そのアカウントでのログインはrootでのログインとセキュリティ的には同じです｡
"su|sudo|polkit が使えるアカウント" が侵害されれば､それは "システム全体" が侵害されたのと同じです｡**


#対策
根本的な対策はXやシェル等を巻き込んで大きく変更しないといけないため個人レベルでは難しいと思います。
それでも出来る対策としては、これらのツールでも2段階認証を行うようにするとかでしょうか。

ですが現状のLinuxの狙われ具合からするとそこまでする必要はないかな、と言う気もします。
とりあえず自分の行っている対策は次のような形です。
(ちなみに例であげたようにこれらのツールのパスワード保護は実質あまり意味のあるものではないため、この対策を行った上でならNOPASSWDを使ってパスワード入力を省略してしまっても安全性はたいして変わりません)

- /etc/pam.d/sudo 内で pam_exec.so を使いsudoによって目的のコマンドが実行される前にスマホにメールでアラートが行くようにし、メールの送信が失敗した場合は目的のコマンドも実行されないようにする


sudoによって対象のコマンドが実行される**前の段階**で**別のシステム上**にsudoが使われた記録を残すことで、侵害自体は防げなくとも少なくとも"侵害があった"という記録を攻撃者には消せない形で残せるようになります。

これがもし対象のコマンドが実行された後や、/var/log/に記録を残すという形の場合ユーザーに気づかれる前に攻撃者によって消されてしまう可能性があるため、**前の段階**と**別のシステム上**というのが重要です。




もっと良い方法のアドバイスや｢それじゃ駄目だよ！｣とか｢むしろ危険になってるじゃん！｣などもツッコミもいただけると嬉しいです。
fabricでバックグラウンドジョブを実行する


サーバ構築後、確認のためアプリケーションの起動・停止をして、その時のログを切り出して回収したかったのだけど、ちょっとはまったのでメモ。

run()が一度呼び出される毎に疑似端末を作成しているので、単純に"[command] &"などの方法でバックグラウンドで実行しただけではrun()を抜けたときにプロセスが終了してしまう。
"nohup"や"disdown"でデーモンとして実行させて、fabricのrun()が疑似端末を作成しないようpty=Falseを設定すると期待通り動作した。

以下サンプル。

```bash
# 実行
fab test_tail_logfile -H localhost -u xxxxx -p xxxxx --port 2222
```

```python:fabfile.py
from fabric.api import run, get, quiet


def kill_background_job(command):
    with quiet():
        run(u"pkill -f '%s'" % command)


def background_run(command, stdout):
    run(u"nohup %s > %s 2>&1 &" % (command, stdout), pty=False)


def test_tail_logfile():
    '''
    バックグランドでログをtailしつつほかの処理を実行、
    処理終了後にtailを止めてログを回収するサンプル
    '''
    # テスト用のログファイルを作る
    run(u"echo '**********************' > work.log")

    # ログのtail開始
    background_run(u"tail -f work.log", u"out.log")

    # ログに何か書き込んでみる
    run("echo 'piyo piyo' >> work.log")
    run("echo 'hoge' >> work.log")

    # tailを止める
    kill_background_job(u"tail -f work.log")

    # ログが取れてるか確認
    run(u"cat %s" % u"out.log")
    # ログを回収
    get(r"out.log", u".\\log\\out.log")

```
[CCNA ICND1] 04. IPv4アドレスとサブネット

# 1. IPv4アドレス

TCP/IPネットワークではIPアドレスを使用して通信相手を識別している。

## 1.1. IPアドレスの構成要素

IPアドレスは32ビットの階層型アドレス。

1. ネットワーク部：所属するネットワークを表す。

2. ホスト部：ネットワークに所属する個々のホストを識別する。

ただし、現在ではネットワーク部、サブネットワーク部、ホスト部の3つの要素で構成されることが一般的。

## 1.2. アドレスクラス

さまざまな規模のネットワークに対応するため、IPアドレスはクラスと呼ばれるカテゴリで分類されている。

### 1.2.1. 概要

|クラス|説明|
|:---:|:---|
|A|超大規模なネットワーク|
|B|比較的大規模なネットワーク|
|C|中規模なネットワーク|
|D|マルチキャスト用|
|E|実験用|

### 1.2.2. クラスA

1. 第1オクテットの先頭1ビットは「0」に固定。

2. ネットワーク部は8ビット、ホスト部は24ビット

### 1.2.3. クラスB

1. 第1オクテットの先頭2ビットは「10」に固定

2. ネットワーク部は16ビット、ホスト部は16ビット

### 1.2.4. クラスC

1. 第1オクテットの先頭3ビットは「110」に固定

2. ネットワーク部は24ビット、ホスト部は8ビット

## 1.3. 予約済みのアドレス

IPアドレスには、特別な用途で使用するために予約されているものがいくつかある。

そのようなアドレスは、割り当てることができない。

1. ネットワークアドレス：ホスト部が全て「0」

2. ブロードキャストアドレス：ホスト部が全て「1」

3. ループバックアドレス：第1オクテットが127で始まるアドレス(自分自身を表す)

4. 自動設定アドレス：169.254.0.0/16(リンクローカルアドレス)

## 1.4. グローバルIPアドレスとプライベートIPアドレス

```
* グロバールIPアドレス：インターネットで使用可能
* プライベートIPアドレス：組織または家庭の内部ネットワークでのみ使用可能
```
【プライベートIPアドレスの範囲】

|クラス|範囲|
|:---:|:---|
|A|10.0.0.0 - 10.255.255.255|
|B|172.16.0.0 - 172.31.255.255|
|C|192.168.0.0 - 192.168.255.255|

---
 
 
# 2. サブネットワーク

サブネットワークとは、ある1つのネットワークを複数に分割した小さなネットワークを指す。

また、ネットワークの管理単位を幾つかの小さい単位に分割する仕組みをサブネット化という。

## 2.1. サブネットワークの利点

1. より多くの端末をネットワークに接続できる

2. ブロードキャストドメインの分割できる

3. 全体的なパフォーマンスが改善される

4. ネットワーク構成が柔軟に出来、管理の手間も軽減できる

5. ネットワークセキュリティの適用が容易になる

## 2.2. サブネット化

1つのネットワークを小さなサブネットワークに分割する仕組みをサブネット化という。

```
* サブネット数＝2ⁿ(nはサブネット部のビット数)
* ホストアドレス数＝2ⁿー2(nはホスト部のビット数)
```

ホストアドレス数の計算では、必ずサブネットアドレスとブロードキャストアドレスの2つを除く。

---
 
 
# 3. VLSM

VLSMはIPアドレスの無駄をなくして効率的に利用するための技術。

```
* VLSM：Variable Length Subnet Mask
```

ネットワークアドレスをサブネット化する際に、サブネットごとに異なるサブネットマスクを使う技術。

VLSMにより、サブネットに接続するコンピュータの台数に応じたサブネットマスクが利用でき、IPアドレスを無駄なく効率的に使用することができる。
Raspbian(Jessie) のサウンド設定

RaspberryPiで音声合成、音声認識をやろうと思い、色々やってみたらJessieになって変わっているところがあるのでメモ

##config.txtの変更
モニター出力がHDMIモードでないと音声が出力されないので変更する。
/boot/config.txtの内容を変更
デフォルトでは「#hdmi_driver=2」とコメントアウトしてあるので、先頭の「#」を削除する。
保存したのち一度リブートすると設定が有効になる。

##サウンド出力先の変更
デフォルトではサウンド出力先は自動判別になっているが、強制的に変更することもできる。


```lang:自動判別の場合
$ sudo amixer cset numid=3 0
```

```lang:ライン出力の場合
$ sudo amixer cset numid=3 1
```

```lang:HDMI出力の場合
$ sudo amixer cset numid=3 2
```

##サウンド再生の確認
サウンド再生の確認するには以下のコマンドを実行する。

```lang:サウンド再生の確認
$ aplay /usr/share/sounds/alsa/Front_Center.wav
```

##サウンド入力の設定
マイク入力のためにサウンドデバイスの優先順位を変更します。
マイクはUSB接続になりますので、内蔵サウンドデバイスよりもUSBサウンドデバイスの優先順位を上にします。
/etc/modprobe.d/フォルダにalsa-base.confを作成します。

```lang:alsa-base.conf
options snd slot=snd_usb_audio,snd_bcm2835
options snd_usb_audio index=0
options snd_bcm2835 index=1
```
作成したらリブートします。
起動したら次のコマンドで設定を確認します。

```lang:サウンドデバイスの優先順位
$ cat /proc/asound/modules
  0 snd_usb_audio
  1 snd_bcm2835
```

##参照先
[Raspberry Piのサウンドを試したら音が出なかった話 ](http://s2jp.com/2013/12/raspberry-pi-sound/)
[簡単にできる！音声認識と音声合成を使ってRaspberrypiと会話](http://qiita.com/kinpira/items/75513eaab6eed19da9a3)
Herokuで作ったアプリにルートドメインを設定する

# 背景
- 某VPSで動かしているアプリケーションにルートドメイン（example-domain.comみたいなやつ）を設定していた。それをHerokuに移行しようとしたときにちょっと困った話
- CNAMEにしとけばよかった。
- やり方は下記に書いてある。
  - https://devcenter.heroku.com/articles/custom-domains
- 日本語だと下記にまとまっている。
  - http://shindolog.hatenablog.com/entry/2015/02/01/225521
- 私もPoitDNSというAdd-onを使ってAliasを使ったらできた。
- AレコードはIPアドレスと紐付いているのでHerokuみたいにIPアドレスが変わるやつだとよろしくない。なのでAliasを使う、と。

# PointDNSをつかう
Add-onを有効にする

```
$ heroku addons:create pointdns:developer
Creating pointdns-xxxxx-xxxxx... done, (free)
Adding pointdns-xxxxx-xxxxx to xxxx-xxxx-xxxx... done
Use `heroku addons:docs pointdns` to view documentation.
```

アプリ側にドメインを設定する。よく忘れるので注意。

```
$ heroku domains:add example-domain.com
Adding example-domain.com to ⬢ xxxx-xxxx-xxxx... done
 ▸    Configure your app's DNS provider to point to the DNS Target xxxx-xxxx-xxxx.herokuapp.com.
 ▸    For help, see https://devcenter.heroku.com/articles/custom-domains
```

あとはドメイン登録事業者の管理ページで対象ドメインのネームサーバーを登録すればOK。
私はお名前ドットコムを使っているのですが、UIがわかりにくくて大変だった。
Macport と anyenv を使っているときに ruby-build を使って最新の ruby をインストールする方法

てきとーめも.

## 前略

Ruby をあんまり使わない職場で(中略) Ruby 2.2.2 と Ruby 2.3.0 での挙動の差を見ることになった. しかし Ruby 2.3.0 をまだ入れたことはなく, `rbenv install -l` で出てくる最新のものは `2.3.0-dev` だった. `2.3.0` 入れねば.

`pull` しても出てこない...


## 状況

- 以前 Macport を使っていたが今は Homebrew.
- anyenv 経由で rbenv を入れている.
- よくわからんなぁと思って `~/.rbenv` 以下にも rbenv を入れた.

## 対処

- anyenv で入る `rbenv` は `~/.anyevn/envs/rbenv/bin/rbenv` で, そこから叩かれるべき `rbenv-install` は `~/.anyevn/envs/rbenv/plugins/ruby-build` 以下にいる.
- `rbenv` の中を見てみると `rbenv install -l` で `/usr/local/bin/rbenv-install` を叩いている. (多分 Macport で入ったやつな気がする.)
- `mv /usr/local/bin/rbenv-install{,.bak}` すると `rbenv install -l` で叩く `rbenv-install` は正しくなったが, 参照する `share/ruby-build` が正しくないらしく, 改善せず.
- `rbenv-install` を直に叩くと正しいものが出てくる.
-  `~/.anyevn/envs/rbenv/rbenv.d/plugins/ruby-build` は pull したけど `~/.anyevn/envs/rbenv/plugins/ruby-build` はまだ pull してなかった ＼(^o^)／
- pull して終わり.
Mac OSX 10.11 El Capitanでnokogiriがインストールできない 2016/5版

# 状況
OSX10.10 Yosemite環境・Ruby2.2.2で作られたアプリケーションをOSX10.11 El Capitanで起動しようと`bundle install`したらnokogiriでインストールエラー発生

# 対応

xcode-selectを改めてインストールすればOK。xcode-select自体はdevツールまわりのディレクトリ設定を管理するものです。devツールの設定更新で対応してあげると、nokogiriがエラーを吐かずにインストールされます。

```
// ターミナルなどで下記のコマンドを叩く
xcode-select --install
```

# 参考にしたIssue 
Error install nokogiri with MAC OSX El Capitan #876
https://github.com/wpscanteam/wpscan/issues/876
Matlab Image Acquisition Toolbox 利用開始時のトラブル

# 経緯
自宅のHomeライセンスMatlab にImage Acquisition Toolbox を追加したので、その使い勝手を探っていたところ、軽いトラブルに遭遇。

- 公式チュートリアル (http://jp.mathworks.com/help/imaq/getting-started-with-image-acquisition-toolbox.html)

# トラブル
公式チュートリアルに沿って進めたにも関わらず、映像入力デバイスをリストアップする関数imaqhwinfoでトラブルが発生した。No Image Acquisition adaptors found. だと。調べてみると、2014年ごろから仕様が変更され、デバイスのアダプターモジュールがデフォルトで何もインストールされなくなり、自分でインストールする必要があるようだ。(http://jp.mathworks.com/help/releases/R2014a/imaq/image-acquisition-support-packages-for-hardware-adaptors.html)
これは、コマンドsupportPackageInstallerを実行して、アダプタをインストールすればば解決した。 

-
herokuでhubotを動かしslackのbotを作る手順


2016年05月時点でherokuでhubotを動かして、slackのbotを作成する手順です。

研究室向けにこの文書を作りましたが、別に公開していい内容だったので公開します。

質問受けながら進めるスタイルを想定した資料なので、言葉足らずの部分があるかとは思いますが、疑問点があれば、適宜コメントください。

## 前提条件
+ nodeJSがインストール済み
+ Git コマンドラインツールがインストール済み
+ npm でyoeman, generator-hubotがインストール済み
+ heorku コマンドラインツールがインストール済み
+ heroku 設定済み

## プロジェクトの作成
プロジェクトディレクトリの作成

```
$ mkdir {botの名前}
$ cd {botの名前}
```

## hubotの初期設定

```
$ yo hubot
? Owner {開発者の名前} # ダイアログに從って必要項目を入力
? Bot name {botの名前}
? Description {botの説明}
? Bot adapter slack # slck bot を作る場合はここでslackと入力
```

## hubotの動作確認

```
$ bin/hubot
{botの名前}> {botの名前} ping
{botの名前}> PONG
```

## Gitリポジトリのイニシャライズ
```
$ git init
```

## コマンドを作る、試す
Botにコマンドを追加する際は、```./script``` 内にscriptを作ります。

参考
[hubotスクリプトの書き方とサンプル集 | mitc](http://blog.fumiz.me/2012/08/05/hubot-irc-bot-script/)


作ったコマンドを試す

```
$ bin/hubot
{botの名前}> {botの名前} {コマンド}
{botの名前}> {コマンドに対応するメッセージ}
```

## Gitコミット
動作確認ができたら、コミットします。

```
$ git add -A
$ git commit -m'Initial commit'
```

## Heroku アプリケーションの作成
Herokuにデプロイします。
herokuコマンドの利用が今回はじめての場合、ログインなどを求められます。

```
$ heroku create {botの名前} # ほかのでもいいけどわかりやすいのはこれ
$ git push heroku master
```


## Heorku アプリケーションの環境変数の設定
環境変数は https://dashboard.heroku.com/apps から直接編集できるが、以下ではコマンドによる設定法を示す。
好きな方でやればいいと思う。

https://myteam.slack.com/apps/manage/A0F7XDU93-hubot で Add Configration すればslackトークンは取得できる。（URLのmyteamのところは、自分のチームに読み替えてください）

```
$ heroku config:set HUBOT_SLACK_TOKEN={slackのトークン} # slack の設定画面より値を取得
$ heroku config:set HEROKU_URL='https://{slackのチーム名}.herokuapp.com'
$ heroku config:set HUBOT_SLACK_TEAM='{slackのチーム名}'
$ heroku config:set HUBOT_SLACK_BOTNAME='{botの名前}'
```

参考
[Slack + Hubot + Heroku で松岡修造botを作ったよ - すずきろぐ](http://tooooomin.hatenablog.com/entry/2016/01/03/132937)

## Heokru Keepalive関係の設定
HerokuのFree dynoプランでの動作対応
6時間はスリープしないといけないので、スリープする時間が6時間以上になりようにする。

まずは、環境変数の設定

```
$ heroku config:set HUBOT_HEROKU_WAKEUP_TIME=8:00
$ heroku config:set HUBOT_HEROKU_SLEEP_TIME=24:00
$ heroku config:set TZ='Asia/Tokyo'
$ heroku config:set HUBOT_HEROKU_KEEPALIVE_URL=$(heroku apps:info -s | grep web-url | cut -d= -f2) # 末尾は / です。
```

いったん、スリープしたbotは自分で起動できないのでHeroku Schedulerで起こします。

```
$ heroku addons:create scheduler:standard
$ heroku addons:open scheduler # 設定画面がブラウザで開く
```

UTCの時間で、起こすタイミングを設定する。
HUBOT_HEROKU_WAKEUP_TIME で 設定した時間帯-9時間した時間にスケジュールを設定
コマンドは、```curl ${HUBOT_HEROKU_KEEPALIVE_URL}heroku/keepalive```と設定する

参考
[HubotをHerokuのFree dynoに対応させる | スペースマーケットブログ](http://blog.spacemarket.com/code/hubot-on-heroku-free-dyno/)
Watson IoT Platform - Node-RED - 閾値によって判断する

#閾値によって判断する
- センサーからの値など、ある値を超えた際にだけ後続の処理を行わせたい場合があります。
- [Node-REDのフローをコピーする方法](http://qiita.com/egplnt/items/84b244a50d8bdaced324)を参照して、下記のフローをコピペします。

```lang:閾値によって判断する
[{"id":"d682710d.e25118","type":"function","z":"ad2e7b14.5fbf","name":"閾値判断","func":"if ( Math.abs(msg.payload) < 3 ) {\n    msg = \"\";\n}\nreturn msg;","outputs":1,"noerr":0,"x":340,"y":440,"wires":[["8788bb2e.f1407"]]},{"id":"9cc53fe5.5cf4","type":"debug","z":"ad2e7b14.5fbf","name":"","active":true,"console":"false","complete":"false","x":710,"y":460,"wires":[]},{"id":"2e2bbd21.d66d52","type":"inject","z":"ad2e7b14.5fbf","name":"","topic":"","payload":"1","payloadType":"num","repeat":"","crontab":"","once":false,"x":110,"y":460,"wires":[["d682710d.e25118"]]},{"id":"434d8c3c.dafe2c","type":"inject","z":"ad2e7b14.5fbf","name":"","topic":"","payload":"5","payloadType":"num","repeat":"","crontab":"","once":false,"x":110,"y":500,"wires":[["d682710d.e25118"]]},{"id":"87af1c05.3fd9c8","type":"debug","z":"ad2e7b14.5fbf","name":"","active":true,"console":"false","complete":"true","x":690,"y":400,"wires":[]},{"id":"284a0266.3214ae","type":"inject","z":"ad2e7b14.5fbf","name":"","topic":"","payload":"-1","payloadType":"num","repeat":"","crontab":"","once":false,"x":110,"y":420,"wires":[["d682710d.e25118"]]},{"id":"9e930281.5088f8","type":"inject","z":"ad2e7b14.5fbf","name":"","topic":"","payload":"-5","payloadType":"num","repeat":"","crontab":"","once":false,"x":110,"y":380,"wires":[["d682710d.e25118"]]},{"id":"8788bb2e.f1407","type":"template","z":"ad2e7b14.5fbf","name":"後続のノード","field":"payload","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"後続のノードは実行されました。","x":520,"y":440,"wires":[["9cc53fe5.5cf4","87af1c05.3fd9c8"]]}]

```

![スクリーンショット 2016-05-22 17.14.49.png](https://qiita-image-store.s3.amazonaws.com/0/125842/039658d6-1e73-eb68-0c98-4b7a45413a03.png)


- 「1」や「-1」では`msg`が伝搬されず後続のノードが実行されないことを確認します。
- 「5」や「-5」では後続のノードが実行されます。
![スクリーンショット 2016-05-22 17.14.41.png](https://qiita-image-store.s3.amazonaws.com/0/125842/0fbf8dce-a755-27f9-9d1d-f981aebd6e44.png)

- 「閾値判断」functionノードのjsは以下の通りです。

```js:閾値によって判断する
if ( Math.abs(msg.payload) < 3 ) {
    msg = "";
}
return msg;
```
addWebAllowedObject

# addWebAllowedObject
- UWPのWebViewのJavaScriptにオブジェクトを挿入して、JavaScriptからC#のメソッドにアクセスできる。AndroidのaddJavaScriptInterfaceみたいなもの。
- インジェクションできるオブジェクトはWindowsランタイムコンポーネントのみ？
- JavaScriptのUWPはappx化しても丸見え改竄し放題なので、これで隠したい実装や定数をWindowsランタイムコンポーネント側にC#で書くようなことができる。

# XAML+WebViewでaddWebAllowedObject
- XAMLにベタ書きしたWebViewのJavaScriptからWindowsランタイムコンポーネントのメソッドを呼べる。普通に値を返す場合はそれで事足りるんだけど、非同期にWebViewに値を戻したい場合はどうすればいい？具体的には確認ダイアログ。
- `MainPage.xaml.cs`からランタイムコンポーネント側にwebViewへの参照を渡しておいて、ランタイムコンポーネント側から`InvokeScriptAsync`するとSystem.Exception とか System.UnauthorizedAccessException になる。

```csharp
string x = await webView.InvokeScriptAsync("eval", new string[] { "confirmDialogResult('Yes')" });
```
- WebViewが配置されたMainPageからしかJavaScript流しこめないのかな。
- 確認ダイアログ程度ならJSでもまぁいいかと、`Windows.UI.Popups.MessageDialog` にしてみる。x86/x64では動くけど、armってかw10m実機で`showAsync`してYesNo押してもメソッドが呼ばれない。こんなところでモバイルとPCの非互換。うーん。。。

# JavaScript + x-ms-webviewでaddWebAllowedObject
- JavaScriptとWindowsランタイムコンポーネントの構成。index.htmlにx-ms-webviewタグを書いて、jsでaddWebAllowedObjectできた。
- ランタイムコンポーネント側でダイアログ系は動かない。まぁビューへの関連付けとか全然ケアしてないから折り込み済み。
- で、確認ダイアログ程度ならJSでもまぁいいかと、`Windows.UI.Popups.MessageDialog` にしてみたけど、`showAsync`しても何も表示されない。あれれ？。

```js:base.js
// If getForCurrentView fails, it is an indication that we are running in a WebView without
// a CoreWindow where some WinRT APIs are not available. In this case, we just treat it as
// if no WinRT APIs are available.
var isCoreWindowAvailable = false;
try {
_Global.Windows.UI.ViewManagement.InputPane.getForCurrentView();
isCoreWindowAvailable = true;
} catch (e) { }
```
- 要するにWebViewではWinRTの一部機能が使えませんよと。XAMLのほうはCoreWindow使えてるみたいだけど。

# さてどうするか
- JS + Windowsランタイムコンポーネントのほうがキレイだけど、x-ms-webviewでWindows.UI系のAPIが確実に利用できないので、諦める。
- XAMLのほうはJSのWindows.UI.Popups.MessageDialogがモバイル実機でちゃんと動いてくれたらなー。UWPのくせになんで環境依存してるんだよ…
- ランタイムコンポーネントからMainPage.xaml.csのメソッド呼べないのかな。MainPageクラスからならInvokeScriptAsyncが動く気がする。C#初心者なのでよくわからない。

# オチ
- [チュートリアル: 単純な Windows ランタイム コンポーネントの作成と JavaScript からの呼び出し](https://msdn.microsoft.com/ja-jp/library/windows/apps/mt609012.aspx)
- JSから直接Windowsランタイムコンポーネントを参照できたというね。
Watson IoT Platform - Node-RED - 自分のノード（サブフロー）を作成する

#ノードの追加（サブフローの作成）
- 画面右上の三本線を開き、「Subflows」メニューの「Create Subflow」から自分用のサブフローを作成することができます。
- 入力（input）数と出力(output)数を指定し、その間を自分が使用するノードを使って記述します。
![スクリーンショット 2016-05-22 16.47.44.png](https://qiita-image-store.s3.amazonaws.com/0/125842/2fa04fd3-7808-485e-1f3c-cb45f1f00fbc.png)

- Deployすると画面左上のパレット「subflows」セクションに新たに作成したサブフロー（自分のノード）が表示sれます。ドラッグ＆ドロップで使用可能です。
![スクリーンショット 2016-05-22 16.50.16.png](https://qiita-image-store.s3.amazonaws.com/0/125842/8e421999-11d2-dcff-97e8-24738b576ab4.png)

- 作成したサブフローを削除する際には、サブフローをダブルクリックし、当該サブフロー編集ページの「delete subflow」ボタンを押します．
![スクリーンショット 2016-05-22 16.52.00.png](https://qiita-image-store.s3.amazonaws.com/0/125842/a805bf37-7c61-8c41-eeea-acc10ffcb529.png)
Facebook APIをPython SDKで叩いてハマったメモ


```py

#coding:utf-8
import json, urllib2
import facebook
from setting import *

def getFriendsFromperson(person_id):
    fb_friends = graph.get_connections(id=person_id, connection_name='events')
    print(fb_friends)

facebook_app_id = 'xxxxxxxx'
facebook_app_secret = 'xxxxxxxxxxxxxxx'
facebook_access_token = 'xxxxxxxxxxxxxxxxxxxxxxxxx'
facebook_tedxutokyo_event = '682438141897525'

graph = facebook.GraphAPI(facebook_access_token)
event = graph.get_object(id=facebook_tedxutokyo_event, Connection='invited')
attending = graph.get_connections(id=facebook_tedxutokyo_event , connection_name='maybe', limit= 100)
# attending2 = graph.get_connections(id=facebook_tedxutokyo_event , connection_name='attending')

persons_id = {}
persons_pictures = {}

count = 0

for person in attending['data']:
    person_name = person['name'].encode('utf-8')
    person_id = person['id'].encode('utf-8')
    persons_id[person_name] = person_id
    print(person_id)
    count += 1

print(count)

```

limitをつけるのがポイント（デフォは25個）
Raspberry Pi でサーボモータ制御

---

新しい環境(raspbian-stretch)で動作しなくなっていました。
[新しい記事](http://qiita.com/lumbermill/items/1ffe476fb1720ec89f32) では標準のライブラリを使って制御しています。こちらを参照してください。

---

PWM信号とやらが面倒で敬遠してたんですが、サーボモータをお手軽に制御できるライブラリがあるみたいです。ということで試してみました。

## 準備
GitHubからクローンしてビルド・インストールします。

```
git clone https://github.com/richardghirst/PiBits.git
cd PiBits/ServoBlaster/user/
make servod
sudo ./servod
```

今回使用したサーボモータは、SG90 MicroServo という機種です（写真参照）。駆動用の電源は単三電池を4つ繋いだ電池パックを使用しています。VccとGroundを電池に接続し、PWMをGPIOの4番ピンに接続します。Groundはさらに、GPIO側のGround端子とも接続が必要です（このためにブレッドボードを挟んでます）。

```
PWM = 橙
Vcc = 赤
Ground = 茶
```

![IMG_1741.jpg](https://qiita-image-store.s3.amazonaws.com/0/50780/88e1af21-ad94-c8bf-a2c6-0b146061f1c6.jpeg)

これで準備完了です。

## 使い方
/dev/servoblaster に回転角(0~99%)を送るだけのシンプルな操作です。
```
echo 0=0% | sudo tee /dev/servoblaster
echo 0=99% | sudo tee /dev/servoblaster
```

細かい制御については、以下のドキュメントを参照してください。
https://github.com/richardghirst/PiBits/tree/master/ServoBlaster

## (その他の)参考URL
http://www.micropik.com/PDF/SG90Servo.pdf
http://cihatkeser.com/servo-control-with-raspberry-pi-in-5-minutes-or-less/
UIControl の addTarget や removeTarget に加え removeAllTarget あると便利だよね？

# removeAllTarget
覚書です。

`UIButton` などでよく動的にボタンが押された時の処理を変えたい時には次のメソッドを使いますよね。
ぶっちゃけこれぐらいだったら、普通に書いてもさほど変わらないけど、まぁ覚書程度に（笑）

## public func addTarget(target: AnyObject?, action: Selector, forControlEvents controlEvents: UIControlEvents)
```
button.addTarget(self,
                 action: #selector(TestController.testSelector(_:),
                 forControlEvents: UIControlEvents.TouchUpInside)
```
だったり、

## public func removeTarget(target: AnyObject?, action: Selector, forControlEvents controlEvents: UIControlEvents)
```
button.removeTarget(self,
                 action: #selector(TestController.testSelector(_:),
                 forControlEvents: UIControlEvents.TouchUpInside)
```

しかし、複雑な処理だったり状況次第では、以前セットしたSelectoreだったりTargetだったりがわからない場合も出てくることも・・・
（設計がいけていないからとかそういうのは今回無視していただけたら嬉しいですwww）

そんな時に、`addTarget:` したものを全て消せたら楽！！ということで、作っちゃおう！！

## public fund removeAllTarget()
```
extension UIControl {
    
    public func removeAllTarget() {
        self.removeTarget(nil, action: nil, forControlEvents: .AllEvents)
    }
}
```

これで、`UIButton` などから、 `removeAllTarget` が使えるようになる。

```
button.removeAllTarget()
```

## おまけ
ちなみに、ちゃんとコードを読めば書いてある！！

```
remove the target/action for a set of events.
pass in NULL for the action to remove all actions for that target
```
【PythonでGUI】PyQt5 -準備-

#【概要】
PyQt5を使うための環境整備です。
各自のやり方でインストールしてもかまいません。

#【環境】
Windows8.1

#【インストール】
①下記のサイトからPYTHON3.5の方のAnacondaをインストールします。
　　[DOWNLOAD ANACONDA](https://www.continuum.io/downloads)

②インストールしたPythonのIDEのSpyderを起動します。
　　<img width="49" alt="spyder.png" src="https://qiita-image-store.s3.amazonaws.com/0/121997/09ac5ab7-b7f4-4ef5-4d09-3e59fe7809ef.png">

③Spyderを開いたら右下のConsoleタブを開きます。
　そして右上にあるOptionsボタンを選択して、「Open command prompt」をクリックします。
　　<img width="434" alt="aaaa.png" src="https://qiita-image-store.s3.amazonaws.com/0/121997/63d53c56-d6ec-46b9-a954-4a834c98b030.png">

③そのコンソール画面で
　　`pip install virtualenv`
　と入力し、実行します。virtualenvがインストールされます。

④同じくコンソール画面で
　　`virtualenv pyqt`
　　`cd pyqt/Scripts`
　　`activate`
　を実行します。これで仮想環境が作成されました。
　そして、PyQt5をインストールします。
　　`pip install pyqt5`

これでPyQt5のインストールは終了です。これからコードの実行の仕方を確認します。
ファイルの置き場所などは、各自の整えたい環境に置き換えてください。

#【プログラム実行方法】
①Cドライブの中に「study_pyqt5」フォルダを作ります。
　このフォルダの中にスクリプトファイルを保存していきます。

②フォルダができたら、その中に「first.py」というファイルを作成します。
　好きなエディタでfirst.pyを開いて以下のコードをコピペし保存してください。

```py3:first.py
#!/usr/bin/python3
# -*- coding: utf-8 -*-

import sys
from PyQt5.QtWidgets import QApplication, QWidget

if __name__ == '__main__':
    
    app = QApplication(sys.argv)

    w = QWidget()
    w.resize(250, 150)
    w.move(300, 300)
    w.setWindowTitle('Simple')
    w.show()
    
    sys.exit(app.exec_())
```


③Spyderのコンソール画面で、
　　`cd C:\study_pyqt5`
　　`python first.py`
　を実行します。そうすると以下の画像のような画面が出てきます。
　　<img width="136" alt="fdafdsaf.png" src="https://qiita-image-store.s3.amazonaws.com/0/121997/d23c15c5-2cc0-8a09-2171-f3dd2f605816.png">

これで、プログラムが実行できました！ :laughing: 

#【参考サイト】
[PyQt5インストール](http://pyqt.sourceforge.net/Docs/PyQt5/installation.html)
[PyQt5チュートリアル](http://zetcode.com/gui/pyqt5/)


[次回](http://qiita.com/Algebra_nobu/items/67abf075177fc36484ff)は[First programs](http://zetcode.com/gui/pyqt5/firstprograms/)をざっくり試していきます。
自分のデフォルトで所属しているグループ名を取得する方法


linuxでユーザーを作った際は、必ず自分のユーザー名グループに所属しています
その、`gid`の名前のみを取得するスクリプトを書きました

自分のデフォルトで所属しているグループ名を取得する方法

```bash
$ id | awk '{print $2}' | sed -e 's/gid=[^(]*(*\(.*\))/\1/'
hogegroup
```


2016-05-22 17:40 追記

グループ名を取得するほうほうには、こんな方法もある

```bash
id -gn
```
[sugitk](http://qiita.com/sugitk)さんより
Docker for Macを使用してみる

Docker for macのベータ使用の登録をしていたのですが、使用出来るようになったよ。というメールが来ていたので使用してみました。
Docker for Macの使用登録をしていたのですが、Docker for Windowsもダウンロード出来るみたいです。使用する予定は無いですが。。

インストール後、エラーが出ることがあったので、対処法メモです。

# インストール
インストールは、サイトからイメージをダウンロードし、アプリケーションフォルダにドラッグ・アンド・ドロップ。
アプリケーションフォルダにあるDocker.appを起動するとtokenを入力する画面が表示されるため、メールで送られてくるtokenを入力する。
その後、default Vmをmigradeするかどうかなど聞かれますが、Nextを選んでいればインストール完了。


# エラー１　Dockerホストに接続出来ない
エラー内容

```
Error response from daemon: client is newer than server (client API version: 1.23, server API version: 1.20)
```

対処方法

```
$ docker-machine upgrade default
```

でDockerのホストをアップグレードする。

参考記事
http://qiita.com/kohey18/items/88314a1376d06f5687f5

# エラー2 証明書のエラー
エラー内容

```
Error checking TLS connection: Error checking and/or regenerating the certs: There was an error validating certificates for host "192.168.99.100:2376": tls: DialWithDialer timed out
You can attempt to regenerate them using 'docker-machine regenerate-certs [name]'.
Be advised that this will trigger a Docker daemon restart which will stop running containers.
```

対処方法

```
$ docker-machine regenerate-certs default
```
そのまま表示されていますが、どうやら証明書のIPアドレスがが違うらしい。
上記コマンドで証明書を作りなおして、dockerホストを再起動してあげればOK

```
$ docker-machine restart default
```

参考記事
http://qiita.com/kooohei/items/d370701d6c39727334f3




あとは、今まで通り使えそうです。
VM立ちあげなくていいというのは便利ですね。
ドラッグ可能なPopup

##実装
WPFのPopupコントロールをドラッグする必要がでてきたので、Behaviorで実装しました。

```csharp:DraggablePopupBehavior.cs

    public class DraggablePopupBehavior : Behavior<Popup>
    {
        private bool _IsMouseDown;
        private Point _OldPoint;
        private double _InitHorizontalOffset;
        private double _InitVerticalOffset;

        protected override void OnAttached()
        {
            base.OnAttached();

            AssociatedObject.MouseLeftButtonDown += AssociatedObject_MouseLeftButtonDown;
            AssociatedObject.MouseMove += AssociatedObject_MouseMove;
            AssociatedObject.MouseLeftButtonUp += AssociatedObject_MouseLeftButtonUp;
            AssociatedObject.Opened += AssociatedObject_Opened;
            AssociatedObject.Closed += AssociatedObject_Closed;
        }

        protected override void OnDetaching()
        {
            AssociatedObject.MouseLeftButtonDown -= AssociatedObject_MouseLeftButtonDown;
            AssociatedObject.MouseMove -= AssociatedObject_MouseMove;
            AssociatedObject.MouseLeftButtonUp -= AssociatedObject_MouseLeftButtonUp;
            AssociatedObject.Opened -= AssociatedObject_Opened;
            AssociatedObject.Closed -= AssociatedObject_Closed;

            base.OnDetaching();
        }

        private void AssociatedObject_Opened(object sender, EventArgs e)
        {
            // 初期表示位置を確保
            _InitHorizontalOffset = AssociatedObject.HorizontalOffset;
            _InitVerticalOffset = AssociatedObject.VerticalOffset;
        }


        private void AssociatedObject_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            // Captureに成功した場合のみ_IsMouseDown = trueとなるようにする
            _IsMouseDown = AssociatedObject.Child.CaptureMouse();
            _OldPoint = AssociatedObject.PointToScreen(e.GetPosition(AssociatedObject));
            
        }

        private void AssociatedObject_MouseMove(object sender, MouseEventArgs e)
        {
            if(!_IsMouseDown)
            {
                return;
            }

            // 前回位置からの差分を計算
            var currentPoint = AssociatedObject.PointToScreen(e.GetPosition(AssociatedObject));
            var offset = currentPoint - _OldPoint;
            _OldPoint = currentPoint;

            AssociatedObject.HorizontalOffset += offset.X;
            AssociatedObject.VerticalOffset += offset.Y;
        }

        private void AssociatedObject_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            // 後片付け
            _IsMouseDown = false;
            AssociatedObject.Child.ReleaseMouseCapture();
        }

        private void AssociatedObject_Closed(object sender, EventArgs e)
        {
            // 初期位置を元に戻す
            AssociatedObject.HorizontalOffset = _InitHorizontalOffset;
            AssociatedObject.VerticalOffset = _InitVerticalOffset;
        }
    }

```

ほぼ参考にしたサイトの通りですが、Popup.OpenedとPopup.Closedイベントをリッスンして、オフセットを初期化するようにしている点が異なります。

##参考
http://devlights.hatenablog.com/entry/2015/05/25/232704
RailsでDISTINCT ON を実行した時のまとめ


railsでモデルからデータを取得したい場合にテーブルから重複したカラムをまとめて、
他のレコードもほしい！っていうときに


```ruby:qiita_controller.rb
@hoge = Model.select("DISTINCT ON (hoge) *")
```
**disitinct on** は便利でした!
Bottleのhookを使ってレスポンスヘッダを付与する

### 概要

Pythonの軽量フレームワークであるBottleで、CORS(Cross-Origin Resource Sharing)のためにレスポンスヘッダを付与します。この記事では、公式ドキュメントのRecipeに書かれている標準的な方法を記載しています。

[Recipes — Bottle 0.13-dev documentation](http://bottlepy.org/docs/dev/recipes.html)

### コード

Bottleではhookというデコレータを使って、関数が実行される前後に処理を追加することができます。これを使うことにより以下のコードのように`@hook('after_request')`でWebAPIから返されるレスポンスすべてにレスポンスヘッダを設定することができます。

```py

from bottle import hook, response

@hook('after_request')
def enable_cors():
    response.headers['Access-Control-Allow-Origin'] = '*'
```

感覚的にはレスポンスヘッダはとりあえず全部`@hook('after_request')`の中に記述しておけば良いということで、内部処理実装と分けて管理することができて便利です。

最後に、実際にcurlを使ってレスポンスヘッダにAccess-Control-Allow-Originが含まれているかを確認します。


```sh
$ curl --head http://localhost:8080/
HTTP/1.0 200 OK
Date: Sun, 22 May 2016 05:26:09 GMT
Server: WSGIServer/0.2 CPython/3.4.3
Content-Length: 12
Access-Control-Allow-Origin: *
Content-Type: text/html; charset=UTF-8
```


### 参考

- [Bottle with Cross-origin resource sharing (CORS)](https://gist.github.com/richard-flosi/3789163)
- [Python Bottleのソースを読んでみる リクエスト・レスポンス編 - Git厨ブログ](http://taisa007.hatenablog.com/entry/2016/02/13/010808)
Couchbase cluster on CoreOS

Couchbase をオンプレやAWS以外のクラウド上にある CoreOS クラスタにデプロイは、[かつて提供されていたインストールスクリプトを使った方法](http://qiita.com/masato/items/3b4decb2cf093027c167)ではなく、https://github.com/tleyden/couchbase-cluster-go を使うと楽です。

基本的な手順は、上記リポジトリのREADME.mdにあるとおりです。下記のような罠にはまらなければ 10分弱でクラスタができあがります。

# 罠

しかし、Azure 上に立てたの CoreOS では、作者の [tleyden さんが残しているコメント](https://gist.github.com/bcwaldon/0ff9ecc53a09220fc988#gistcomment-1447046)のような加筆を cloud-config.yaml に行い、リブートが必要でした。

また、[README の Destroying the cluster](https://github.com/tleyden/couchbase-cluster-go/blob/e06c079/README.md#destroying-the-cluster) にサラッと書いてある「The following commands will stop and destroy all units (Couchbase Server, Sync Gateway, and otherwise)」の「otherwise」は本当に otherwise で、Couchbase に __無関係な units も__ stop され destroy されます。気をつけてください。
(私は stop の段階で気付きましたが、肝を冷やしました)
[AE]四角形をマスクを使って変形する．


# 手順
## 1. 四角形の作成
シェイプレイヤで四角形を作る．
![四角形の作成.gif](https://qiita-image-store.s3.amazonaws.com/0/113504/f16b396e-7f3b-dd39-9ec2-104613c9ec12.gif "四角形の作成.gif")

## 2. マスクの追加
上部メニュー -> レイヤ- -> マスク -> 新規マスク
![マスクの追加.gif](https://qiita-image-store.s3.amazonaws.com/0/113504/1bca0e41-4928-a520-c7d5-782cc6c6f100.gif "マスクの追加.gif")

## 3. マスクパスの追加
ペンツール長押し -> 頂点追加
![マスクパスの追加.gif](https://qiita-image-store.s3.amazonaws.com/0/113504/6a1ce166-6e42-c644-7234-868ade44dc15.gif "マスクパスの追加.gif")

## 4. マスクパスの移動
矢印ツール -> 移動させたい頂点を囲む -> 移動
![マスクパスの移動.gif](https://qiita-image-store.s3.amazonaws.com/0/113504/919a2246-01cc-c3ea-c5b8-0c7ac9d1f148.gif "マスクパスの移動.gif")

## 5. マスクパスの変形
ペンツール長押し -> 頂点を切り替えツール
![マスクパスの変形.gif](https://qiita-image-store.s3.amazonaws.com/0/113504/4a4a2262-c117-d017-a0e9-65a3c8c3a64c.gif "マスクパスの変形.gif")
vim の マクロ記録、閲覧、削除

# 背景

vimをあまり使っていなかったので、マクロの使い方がよく分からなかったのですが、基本的な使い方が分かったので備忘録として残します。

# マクロとは

vimには打ち込んだコマンド（命令）の集合を保存して、何度も繰り返すなどできるマクロ機能があります。

## マクロの記録

ノーマルモードの状態で、「qとアルファベット1文字（マクロ名）」を入力するとマクロが記録され、「q」で記録を終了します。
例） qa → マクロの記録 → q  

マクロの記録では、例えば 「i hoge esc」 と入力すると、「挿入モードへ切り替え、hogeと入力して、ノーマルモードへ変わる」というマクロを記録できます。

記録したマクロはノーマルモードで例えば 10@a （:は入りません）と入力することで 10回 aというマクロを実行します。
（上記の例では、10回 hogeと入力します）

_*vim初心者の僕は、よくノーマルモードの時に知らず知らず 「qw」などを押してしまい、何度も誤ってマクロを記録していました（突然、recoringと出て焦るという...）_

## マクロの閲覧

マクロはいくつも記録しておくことができ、閲覧するためにはノーマルモードで :reg と入力します。

![スクリーンショット 2016-05-22 14.20.46.png](https://qiita-image-store.s3.amazonaws.com/0/36752/decaf90f-1dcd-7d72-f913-cf1f057aa2ab.png)

## マクロの削除

記録したマクロの中で、不要になったものはノーマルモードで例えば `qa q` と入力して上書きしてしまうか、`:let @a=''`と入力して消すことが可能です(ただし`''`はそれぞれシングルクォーテーションであることに注意してください) 。
消されたマクロはvimを再起動すると何も登録されていない状態になります。:reg で確認してみましょう。
Xcodeを使う上で最初におさえること

XcodeとSwiftを使い始めたので、最初におさえるポイントをメモする。

# 1. はじめに
## Xcodeの説明
詳しくは以下のリンクに丁寧に紹介されている。
参考：http://www.atmarkit.co.jp/ait/articles/1601/08/news059_2.html

一つのiPhoneアプリを仕上げるために
 - Swiftの知識はもちろん必要
 - Xcodeに備わっているいくつかの機能を使う
ざっくり言うと、
Storyboardで、アプリのビューを作り、
Swiftで、コードを書いて、アプリを仕上げる。

## 「Xcodeプロジェクト」とは？
 1つのiPhoneアプリを構築する上で必要なプログラムやアセット（画像、動画、音声など）などのファイルを一まとまりにしたもの

iPhoneアプリ作成で利用する「iOS SDK」
⇨ iPhoneアプリを作る上で必要なクラスなどのプログラムやアセットファイルがAppleから提供されている

iOS SDKの中には、さまざまなクラスが用途別に分かれて入っている。
⇨ 例えば、UIKit = 画面上に表示するボタンやスイッチなどパーツ
などである。

## Xcodeプロジェクトの作り方
### iPhoneアプリで使えるテンプレートには、次の5つ

|テンプレート名|説明|テンプレートが合うiPhoneアプリ|
|:-----------|:--|:-------------------------|
|Master-Detail Application|リスト画面と詳細画面がセットで用意される|ニュースアプリなど、たくさんのコンテンツがあるアプリで使える|
|Page-Based Application|横スワイプで表示が切り替えられる画面が用意される|本のような使い方の読み物アプリで使える|
|Single View Application|真っ白な画面だけが用意される|シンプルなので、あらゆるアプリで使える **←最もシンプル**|
|Tabbed Application|画面下部にタブが表示されている画面が用意される|いくつかの機能を持ち合わせる、多機能なアプリによく使われる|
|Game|ゲームを作るための構成が用意される|ゲームアプリで使える|

### Xcodeワークスペースの各機能の役割
http://image.itmedia.co.jp/l/im/ait/articles/1601/08/l_swift8_workspace-01.jpg
- 1．ツールバー
- 2．ナビゲーター領域
- 3．エディタ領域
- 4．ユーティリティー領域
- 5．デバッグ領域

### Xcodeプロジェクトの構成
http://image.itmedia.co.jp/ait/articles/1601/08/swift8_prj-structure-01.jpg

| ファイル名 | 役割・用途 |
|:---------|:----------|
|AppDelegate.swift|アプリのさまざまなイベント（起動、終了、プッシュ通知など）を受け取るためのクラスが書かれたファイル|
|ViewController.swift|初めに表示される画面に何を表示するか制御を行うクラスが書かれたファイル|
|Main.storyboard|「画面にどのようなUI（部品）を置くか」や、画面と画面の切り替えを決めるファイル|
|Assets.xcassets|アプリに組み込むアセットファイル（画像など）を管理するファイル|
|LaunchScreen.storyboard|アプリが起動してすぐに表示される画面のレイアウトを決めるファイル|
|Info.plist|アプリの詳細な設定を定義するファイル|