OmniAICreator/Qiita-1.07M huggingface dataset:
Swift画像処理の基礎知識 〜iOS標準の画像クラス・フレームワーク〜

#概要
自作アプリで画像処理を色々行ったので基礎知識をまとめました。
本記事ではよく使う画像クラスとiOS標準で用意されている画像処理フレームワークの紹介をします。

#環境
- Xcode 7.3.1 (Swift 2.2)

#画像クラス
この辺の画像クラスの違いがよくわかっておらず、とりあえず使っていたので違いをまとめました。

- UIImage
    - UIKitフレームワークのクラス。
    - 主に既存の画像を使った処理を行う。
    - 長さや位置の指定は "point" 単位で行う
    - 主にviewとのやりとりに使用する
- CGImage
    - CoreGraphicsフレームワークのクラス。
    - オリジナルの図形などを描画したいときに使用する。
    - 長さや位置の指定は "pixel" 単位で行う
    - 画像加工やピクセル単位の処理を行う場合はだいたいこいつを使う(IN/OUTがCGImageになる)。
- CIImage
    - CoreImageフレームワークのクラス。
    - 画像にフィルタ/エフェクトをかけるときに使用する。

#画像処理フレームワーク
##CoreGraphicsフレームワーク
UIImageViewやUIImageなどの既存の画像を使った処理ではなく、オリジナルの図形などを描画したいときに使用する。
また、画像自体を加工したいときに使用する。
画像加工の例を下記に記す。

【切り抜き処理】

切り取り前
![18b93269-b6b2-50a7-f598-eaf8a5c845dc.png](https://qiita-image-store.s3.amazonaws.com/0/130432/576ccc64-6d17-1de1-b798-dbea57b75c82.png)

切り取り後
![f464b371-bd36-e2c4-94f4-1df55301e093.png](https://qiita-image-store.s3.amazonaws.com/0/130432/553c651f-aa9a-91a8-4a61-8b32ea6d8ef5.png)


【サンプルコード】

```
// 切り抜き処理 imageが元画像のUIImage。x,y,w,hがそれぞれ切り抜きたい画像範囲。
let cropRect  = CGRectMake(x, y, w, h)
let cropRef   = CGImageCreateWithImageInRect(image.CGImage, cropRect)
let cropImage = UIImage(CGImage: cropRef!)
```

この他にピクセル単位で色を取り出したり、画像を作成したり、図形を描画したりできる。
ピクセル単位の情報が抜き出せるので画像解析などをやろうと思えばできるが、画像解析をしたい場合はOpenCVを使用した方が良い。

##CoreImageフレームワーク
画像に対して下記のようなフィルタをかけることができる。
フィルタの種類はiOS9でなんと170種類あるらしい。
フィルタリングの例を下記に記す。

【セピア】

![efdcca55-674b-8255-af95-e69f6accc6cd.png](https://qiita-image-store.s3.amazonaws.com/0/130432/7eff4c73-10c8-7d85-0594-2ee9c63961c3.png)

【サンプルコード】

```
// image が 元画像のUIImage
let ciImage:CIImage = CIImage(image:image);
let ciFilter:CIFilter = CIFilter(name: "CISepiaTone")
ciFilter.setValue(ciImage, forKey: kCIInputImageKey)
ciFilter.setValue(0.8, forKey: "inputIntensity")
let ciContext:CIContext = CIContext(options: nil)
let cgimg:CGImageRef = ciContext.createCGImage(ciFilter.outputImage, fromRect:ciFilter.outputImage.extent())

//image2に加工後のUIImage
let image2:UIImage? = UIImage(CGImage: cgimg, scale: 1.0, orientation:UIImageOrientation.Up)
```

CIFileterにフィルタ名を文字列で指定してインスタンスを作成する。(上記でいう"CISepiaTone")
valueをセットするものはセットして後は出力するだけ。
フィルタ名や指定する値は公式リファレンス(引用にURL記載)を参照すれば全て記載されているので、上記サンプルに当てはめるだけで大体動くと思われます。

このようなエフェクトを付与する他に画像の境界をシャープ(境界線をくっきりさせる)にすることもできる。
単純に画像のエフェクト自体を目的とする他に、上記CoreGraphicsやOpenCVでの画像処理・画像解析の精度を上げる為にこれらのフィルタリングを利用することができる。

引用：
・Qiita：[Swift] 画像のサムネイル生成（縮小＆切り抜き）
http://qiita.com/taku/items/fb44d0bf10509d977bc0
・はてなブログ：【iOS9】Core Image の新機能：文字認識／追加フィルタ47種Add Star
http://d.hatena.ne.jp/shu223/20150622/1434924215
・Qiita：【iOS】【swift】たった数行で画像のフィルタ/エフェクトが実現できる超便利フレームワークCoreImage
http://qiita.com/kitanoow/items/2fd1c6dc415d7af769db
・AppleDeveloper：Core Image Filter Reference
https://developer.apple.com/library/content/documentation/GraphicsImaging/Reference/CoreImageFilterReference/index.html#//apple_ref/doc/filter/ci/CILanczosScaleTransform
Sadistic Analysis of Ruby Code

# The sadistic approach to writing ruby
#### 自分のコードを厳しく評価しながら書こう！

- 今回のトピックは大きいプロジェクトでなりがちな問題を事前に防ぐ手段の紹介！

## What is the issue?

- 初期のclassやmethodは至って単純。業務ロジックやデータの関連が少ないからちょっと汚くてもまだ大丈夫…だと後悔しますよね？
- 追加のロジックや複雑な関連ができてくるとそもそも元のmethodやclassが何をしてるかなんてわかんなくなってくるよね（namingがダメだとなおさら）

## When should we fix this problem?

- 問題がおきてからじゃあもう遅い！
- コードが読めなくなった時点でrefactorするのが極端に難しくなる。
- そもそも読めないコードは触りたくなくなる
- 目で見える汚さになる前にツールを使って複雑過ぎるmethodやclassをその場で検知しよう！

## Why?

- レビューで基本的に落とされるだろうけど、レビューされる前に自動で検知された方が楽では？（bad codeの効率的な検知）
- 汚くなってから「あれ、これって何するんだっけ、、え、んん？」ってなるのがほんとにつらくなる

## And onto a demo

- Flog (ruby.sadi.st)
 - http://ruby.sadi.st/Ruby_Sadist.html
 - http://ruby.sadi.st/Flog.html

- Ryan Davis
 - http://blog.zenspider.com/projects/

- Demo
 - https://github.com/nin042/flog_demo
rubyのoauth2(gem)について2_google認証やってみる

gem(oauth2)を使ってgoogle認証＆個人情報取得してみる。

### 事前準備
google developerに登録してclient_id, client_secretを取得。

### code
```ruby
require 'oauth2'

client = OAuth2::Client.new(
    'client_id', 
    'client_secret', 
    { site: 'https://console.developers.google.com', 
      authorize_url: '/o/oauth2/auth', 
      token_url: '/o/oauth2/token'
    })

client.auth_code.authorize_url(:redirect_uri => 'http://localhost:8080/oauth2/callback')

token = client.auth_code.get_token('認証時に取得したcode', :redirect_uri => 'http://localhost:8080/oauth2/callback')

response = token.get('https://www.googleapis.com/oauth2/v1/userinfo', {access_token: token.token}).parsed

response['email'] # email取得
```

こんな感じ。
[PHP, MySQL(mysqli)] Call to a member function bind_param() on null が発生する時

#現象 PHPで、ストアドプロシージャ/ファンクションの呼出用に、bind_param()を実行すると、"Fatal error: Call to a member function bind_param() on null in ～"が発生する

#対処法 DBの接続情報(ユーザ名、パスワードや、サーバのアドレス、ポートなど)を確認する
どこか間違えたかと思って、呼び出し側を探しても答えが見つからない時は、DB接続用のユーザ名などが間違えていないか確認しましょう。

※エラーの内容が"on null"でない場合は、bind_param()に渡すパラメータがおかしくないかも確認しましょう。
同様のエラーを検索すると、パラメータ間違いのパターンが多いので、DB接続用の情報が間違えている事には、以外と気づきにくいです。(デバッグ用に切替えたまま忘れているなど。)
flynn のリモートリポジトリから clone のようなことをしたい

flynn は heroku よろしく git を使って deploy 等やっていきます。なのでリモートリポジトリを持ってるものの、任意に publickey を追加することは出来ず `git clone` しようとすると弾かれます。複数環境で簡単に開発出来る状態にする為ここから clone したい。

なお全部書いたあと気付いたけど https で普通に clone 出来ます。

```
git clone https://git.cluster-name.doma.in/my-app-name-on-flynn.git myapp
```

でも deploy する為には結局 `flynn remote add` が必要だったり、不要な origin remote が出来たり、ssh 越しで clone したいという場合の為に以下。

前提
====

[CLI](https://flynn.io/docs/cli) を導入しておく。cluster 登録済 (`flynn cluster add`)。

手順
====

初期化したローカルリポジトリの git remote に flynn のアプリを追加し、やっていきます。

```bash
cd myappdir
git init
flynn -a my-app-name-on-flynn remote add
git reset --hard flynn/master
```

ｳｪｲ

備考
====
`flynn remote` コマンドの構文が分かり辛い。`flynn remote -h` すれば例見れるんだけど初見殺し。
CocoaPods : pod installを初めて実行したときに、全然終わらない

ここでいう「初めて」というのは、そのPCでのcocoapodの使用そのものが初めての場合、です。

---

# 症状
```
$ pod install
Setting up CocoaPods master repo
```
このまま微動だにしない。

---

# 原因
初めての```$ pod install```のときには、まずはじめに~/.cocoapods以下にSpecsのrepositoryをcloneしてきたりしています。
このcloneにものすごく時間がかかって、動かなくなっているように見えていたのが原因でした。

```
$ pod install --verbose
hironotadashiori-no-MacBook-Pro:UFO PITCHER masaori$ pod install --verbose
  Preparing

Setting up CocoaPods master repo

Cloning spec repo `master` from `https://github.com/CocoaPods/Specs.git` (branch `master`)
  $ /usr/bin/git clone https://github.com/CocoaPods/Specs.git master
  Cloning into 'master'...
```
(--verboseで何やってるか見られます)

---

# 対策
そのまま待てばいいです。
ただ、それだと不安が拭いきれないので、Specsレポジトリを先にcloneしてしまうという手を使って安心しました。

```
$ cd ~/.cocoapods/repos
$ git clone https://github.com/CocoaPods/Specs.git master
//... git cloneを直接叩くと進捗がよく見えて安心

$ cd path/to/your/ios/pj
$ pod install --verbose
```

---

# 結論
人々に不安を与えるようなUI設計は良くないです。
OpenWrtで自前バイナリリポジトリを作る方法

OpenWrt/LEDEでは、バイナリリポジトリのURLを`/etc/opkg/customfeed.conf`に登録することで標準以外のバイナリパッケージを`opkg`コマンドで管理することができます。

```text:/etc/opkg/customfeed.conf
src example_feed_name http://www.example.com/path/to/files
```

自前のバイナリリポジトリとして機能させるには、最低限バイナリパッケージ`*.ipk`とそれらのパッケージ情報を含んだメタデータファイル`Packages`が必要です。

`*.ipk`はOpenWrtのビルド環境を作れば簡単に作れます（参照：[OpenWrtで既存パッケージを再ビルドする - Qiita](http://qiita.com/hnw/items/83323a5582d152ba9262)）。

`Packages`は全パッケージ分の`opkg info`を連結したようなファイルです。これは`$SDK/scripts/ipkg-make-index.sh`を利用して作ります。

## OpenWrt 15.05.1（Chaos Calmer）からメタデータ検証機構が導入された

ところで、OpenWrt 15.05.1（Chaos Calmer）からはメタデータの正当性確認のため`Packages.sig`というファイルを使って元のファイル`Packages`の検証を行うようになりました。

この検証はデフォルトでオンになっています。何かの理由でシグネチャの検証を無効にしたい場合、下記のように設定すれば全ての`*.ipk`がインストール可能になります。

```text:/etc/opkg.conf
option check_signature 0
```

検証用シグネチャファイル`Packages.sig`は次のように作ります。

```
export PATH=${SDK}/staging_dir/host/bin/:$PATH
usign -G -s secret.key -p public.key
usign -S -m Packages -s secret.key -x Packages.sig
```

上記のうちpublic.keyは各マシンで検証に使う鍵で、利用者に公開すべきものです。このバイナリリポジトリを利用したいマシン上で次のように打つと公開鍵が取り込まれます。

```
opkg-key add public.key
```

秘密鍵の方はCIサーバから持ち出さないなどして秘密にしましょう。誰でも見えるようだと誰でも署名ができてしまい、バイナリパッケージの改ざんを防ぐことができません。

ちなみに、この鍵ペアおよび`*.sig`の形式はOpenWrt独自の実装のようです。他のディストリビューション（Yocktなど）の`opkg`ではGPGで作られた`*.sig`を利用しており、OpenWrtのものと互換性がありません。

## gzip圧縮

メタデータファイルをgzip圧縮した`Packages.gz`を利用することもできます。

```text:/etc/opkg.conf
src/gz example_feed_name http://www.example.com/path/to/files
```

このように書くと`Packages.gz`を探しにいくようになります。対応するシグネチャファイルは`Packages.gz.sig`になります。

## 元ネタ

- http://karl.idv.hk/2015/08/openwrt-package-signature/
Raspberrypi3にFlaskをインストールする

#pipインストール
  - pipをインストールしていない場合

```
sudo apt-get install python-pip
```

#Flaskのインストール

```
sudo pip install flask
```

#サンプルプログラム作成
  - 下記ソースをhello.pyとして保存する。

```py:hello.py
from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return "Hello World!"

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=80, debug=True)
```

#サンプルプログラム実行

```
sudo python hello.py
```

#結果確認
下記コマンド結果で"Hello World!"と表示されたら成功です。
（ブラウザでアクセスでも可）

  - raspberrypiのTerminal上で

```
curl localhost
```

  - 他端末（ローカルネットワーク内）上で

```
curl raspberrypiのipアドレス
```




#参考
[クイックスタート](http://mattrichardson.com/Raspberry-Pi-Flask/)
【Python】連番の画像ファイルをOpenCVで簡単に読み込む

前回の投稿で吐き出したような連番ファイルを読み込む方法メモ。
[【Python】OpenCVで取り込んだビデオデータを連番のjpgファイルで保存](http://qiita.com/Kazuhito/items/4a8a1e81ab94b970c0fd)

VideoCaptureに変換指定子を利用した構文で渡せます。
下のソースコードの例では、00000.jpg,00001.jpg,00002.jpg … と順に読み込みます。

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

import cv2

print(__doc__)

video_input = cv2.VideoCapture("%05d.jpg")

while(video_input.isOpened() == True):
    ret, frame = video_input.read()

    cv2.imshow('frame', frame)
    c = cv2.waitKey(50) & 0xFF
    if c==27: # ESC
        break

video_input.release()
cv2.destroyAllWindows()
```

C++版だとこんな感じ↓

```cpp
cv::VideoCapture capture("%05d.jpg");
```

以上。
CentOS 7 + MySQL 5.7で複数のMySQLインスタンスを起動する

CentOS 6以前とMySQL 5.6以前の構成ではmysqld_multiというものを使っていました。
これはMySQLをインストールすると入っているもので、複数のMySQLインスタンスを立ち上げたいときに使用します。

複数のインスタンスを立ち上げたいときとは、例えば本番環境で物理的に別れているDBサーバーを開発環境で再現したり、レプリケーションをテストをしたりするときに使います。

MySQLのオフィシャルサイトで紹介されていた方法があまりに簡単だったので、ここでも紹介します。
以下の方法は__MySQL 5.7.13以降でsystemctlを利用するシステムで有効__です。

# MySQL 5.7で複数インスタンスの起動はできるか

もちろんできます。結局引数でdatadirとかpidファイルの場所とか指定すれば、自力でも設定は可能です。

ちなみにMySQL 5.7.13の`systemctl`プラットフォーム向けのパッケージでは`mysqld_multi`はインストールされないそうです。

今からご紹介する方法以下のページに記載されている方法になります。

[2.5.10 Managing MySQL Server with systemd](http://dev.mysql.com/doc/refman/5.7/en/server-management-using-systemd.html)

# systemctl + MySQL 5.7で複数インスタンスの起動する方法

MySQLのインストール方法は割愛します。
私は以下の設定にしているので、`/etc/my.cnf`を書き換えます。

https://github.com/tomgoodsun/centos7_lamp_configs/blob/master/config/etc/my.cnf

今回はポート番号3306と3307のインスタンスを立ち上げますので、まずはそのためのディレクトリを作成しましょう。

```
[root@localhost ~]# mkdir /var/lib/mysqld/mysql_{3306,3307}; chown mysql: /var/lib/mysqld/mysql_{3306,3307}
```

次は`my.cnf`の設定です。以下を追記します。

```
[mysqld@mysql_3306]
port=3306
datadir=/var/lib/mysqld/mysql_3306
socket=/var/lib/mysqld/mysql_3306/mysql.sock
log-error=/var/log/mysqld_3306.log

[mysqld@mysql_3307]
port=3307
datadir=/var/lib/mysqld/mysql_3307
socket=/var/lib/mysqld/mysql_3307/mysql.sock
log-error=/var/log/mysqld_3307.log
```

ここまで来たら、起動するだけです。
以下のコマンドで起動と自動起動設定をします。

```
[root@localhost ~]# systemctl start mysqld@mysql_3306
[root@localhost ~]# systemctl enable mysqld@mysql_3306
```

初期パスワードは`/var/lib/mysqld_3306.log`に記録されていますので、以下の手順と同様のセットアップをするだけです。

https://github.com/tomgoodsun/centos7_lamp_configs#mysql-serverのセットアップ

最後にもうひとつの`mysqld_3307`も設定して完成。

# まとめ

`mysqld_multi`のときは起動スクリプトを書いたり、それがうまく動かなかったり面倒くさかったのですが、これだと`systemctl`に全部任せられるので楽です。
[Continuous Updating]IAM権限まわりの勉強用メモ

# はじめに

　AWS社内利用において、AWSセキュリティ管理統制の業務に携わっています。
　しかし、IAMの権限まわりについて、いまいちよく理解できておらず、ユーザ部門のやりたいことと必要なIAM権限をマッピングできていないので、ユーザ部門からの問い合わせ対応に少し困っています。
　余談(グチ)になりますが、時々ベンダーからユーザ部門経由で、「こんなことやりたいので、必要な権限をください」的なメールが届きますが、AWSを使ってシステムを構築していますから、IAM権限くらいは自分で調べてから連絡しろよと言いたくなります......が、自分もちゃんと理解できていないので、人のことを言えません。
　ですので、この記事をIAM権限まわりの勉強用メモとして、継続的にアップデートしていこうと思っています。

# やりたいことリスト

##  ELB証明書操作の権限

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iam:*ServerCertificate",
                "iam:*ServerCertificates"
            ],
            "Resource": "*"
        }
    ]
}
```

| Action      |       内容 |
|:----------------|:-----------------:|
|iam:DeleteServerCertificate||
|iam:GetServerCertificate||
|iam:UpdateServerCertificate||
|iam:UploadServerCertificate||
|iam:ListServerCertificates||

## EC2にロールを設定する権限

AWSマネコンでEC2ロールを設定する場合

```
{
  "Version": "2012-10-17",
  "Statement": [
　　{
    "Effect": "Allow",
    "Action": [
      "iam:PassRole",
      "iam:ListInstanceProfiles",
      "ec2:*"
    ],
    "Resource": "*"
  　}
　]
}
```

| Action      |       内容 |
|:----------------|:-----------------:|
|iam:PassRole|IAMロールをIAMユーザ以外のものに渡す(詳細を確認中)|
|iam:ListInstanceProfiles|すべてのロールの表示をユーザーに許可|


## Tagで特定のEC2 Instancesの保護

保護対象EC2 Instancesの停止、再起動、削除を禁止します。
また、保護手段である<font color="Red">Tagの削除も禁止</font>します。

※特定のVPCやSubnet内のEC2 Instancesの保護について、
[【Amazon EC2 API アクションでサポートされるリソースレベルのアクセス許可】](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-supported-iam-actions-resources.html)により、インスタンスの起動(StartInstances)、停止(StopInstances)、削除(TerminateInstances)、再起動(RebootInstances)(作成(RunInstances)を除く)のAPI　Actionはリソースベースのアクセス許可をサポートされていないため、Tagで特定のEC2 Instancesを保護することにしました。



```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "ProtectedEc2Instances",
            "Effect": "Deny",
            "Action": [
                "ec2:StopInstances",
                "ec2:RebootInstances",
                "ec2:TerminateInstances",
                "ec2:DeleteTags"
            ],
            "Condition": {
                "StringEquals": {
                    "ec2:ResourceTag/tag-key": "value"
                }
            },
            "Resource": "arn:aws:ec2:region:account:instance/*"
        }
    ]
}
```
サーバーに諸々設定する際のメモ

##はじめに
某サーバーに諸々設定する際のメモ

##環境
ubuntu14.04
GUIはなし
ローカルからのSSH接続を構築済み
pipは既にインストール済み

##諸々インストール
自分のここに従って諸々インストール
http://qiita.com/masataka46/items/94417a5974dba810e7b8

まずrootになる。

```
sudo su -
```

g++から入れてみる。

```
apt-get install g++
```

これは元々入ってたみたい。次にnumpyなど。

```
apt-get install python-numpy
apt-get install libhdf5-dev
pip install -U setuptools
```

このへんはまだ入ってなかった。次にこれ。

```
apt-get install python2.7-dev
pip install -U cython
```

##cuDNNをインストールする
これはちょっと面倒くさい。まずnVIDIAのHPから必要なパッケージをローカルのパソコンにダウンロードする。この際、developer program？にログインが必要。

それをSSHでファイル転送する。ここを参考にした。
http://d.hatena.ne.jp/hidde/20090518/1242621452

その後以下を実行。

```
cp cuda/include/cudnn.h /usr/local/cuda-7.5/include
cp cuda/lib64/libcudnn* /usr/local/cuda-7.5/lib64
chmod a+r /usr/local/cuda-7.5/lib64/libcudnn*
```

##chainerをインストールする
次にchainerのインストール。

```
pip install chainer
```

途中、cuDNNはダメみたいな表示が出た。cuDNNはインストールできてないのか？MNISTで確かめてみる。

```
wget https://github.com/pfnet/chainer/archive/v1.16.0.tar.gz
tar xzf v1.16.0.tar.gz
python chainer-1.16.0/examples/mnist/train_mnist.py -g=0
```

そもそもGPUが機能しなかった。CUDAもインストールされてなかったか？

```
python chainer-1.16.0/examples/mnist/train_mnist.py
```

は問題ないようだ。PATHに問題があるのかと思って.bashrcに以下の記述を行った。

```
CUDA_HOME=/usr/local/cuda-7.5
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:${CUDA_HOME}/lib64
PATH=$PATH:${CUDA_HOME}/bin
```

しかしGPUで学習できず。PATHを設定したので、インストールしなおしてみる。

```
pip uninstall chainer
pip install chainer --no-cache-dir
```

するとGPUは機能したが、cuDNNは機能せず。そこで、cudnnのライブラリがちゃんと必要箇所に入っているか確かめたところ、libcudnn.soとlibcudnn.so.5が/usr/local/cuda-7.5/lib64下にない。

そこでいろいろ試したが、その２つのファイルは解凍してから１つずつ転送するしかないみたい。その後必要箇所へコピーし、chainerを再インストールしたら、cudNNは稼働した。

##LIS ver2をインストールする
ここでも自分のこれ
http://qiita.com/masataka46/items/977eba5010c1f000dc1d
に従って進める。

サーバーはAgent側のみだろうから、Unityのインストールは行わない。まず必要なモジュールからインストール。

```
pip install -r python-agent/requirements.txt
```

データをダウンロードする。

```
./fetch.sh
・・・
curl: command not found
```

とエラーが出た。とりあえず

```
apt-get install curl
```

としたところ、うまくいった。
powershell: 2次元配列が微妙

# やりたかったこと
powershellで、Rubyの`each_cons`を実装してみたかった。

こんなイメージを目指していました

```powershell
Get-EachCons -Count 2 -Array @(1,2,3) #=> @(@(1,2), @(2,3))
Get-EachCons -Count 2 -Array @(1,2) #=> @(@(1,2))
```



# やったこと
PowerShellの配列が気持ち悪いのは、下記記事を読んで重々承知の上で、こんなコードを書いてみました。
参考: [そろそろ PowerShell の一次配列の罠と回避について一言いっておくか - tech.guitarrapc.cóm](http://tech.guitarrapc.com/entry/2015/09/05/012733)


```powershell
function Get-EachCons {
    param($Count, $Array)
    $size = ($Array | measure).Count
    $outer = (0..($size - $Count)) | ForEach {
        $i = $_
        $inner = (0..($Count - 1)) | ForEach { $Array[$i + $_] }
        # $retが単数だと勝手に単数に型変換するので
        @(, $inner)
    }
    # @(@())を勝手に@()に変換してくれるので
    @(, $outer)
}
```

```powershell
PS> $cons = Get-EachCons -Count 2 -Array (1,2,3)
PS> $cons #=> @(@(1,2),@(2,3)) のつもり
1
2
2
3
PS> $cons[0] #=> @(1,2) のつもり:OK
1
2
```
ここまでは記事通りうまくいきました。

# うまくいかなかったこと
で、ここからが本題。

配列を、１つだけ配列にいれると…

```powershell
PS> $cons = Get-EachCons -Count 2 -Array (1,2)
PS> $cons #=> @(@(1,2)) のつもり
1
2
PS> $cons[0] #=> @(1,2) のつもり:NG
1
```

いやいやまさかそんなことはないはず…

# sample code で検証
ここまでは[先程の記事](http://tech.guitarrapc.com/entry/2015/09/05/012733)に触れられていた通り、うまくジャグ配列として取得できたのですが…

```powershell
PS> $foo = @(, @(1,2))                                                                                                                                      
PS> $foo #=> @(@(1,2)) のつもり                                                                                                                                      
1
2
PS> $foo[0] #=> @(1,2) のつもり: OK                                                                                                                            
1
2
```
同じジャグ配列を関数に定義してあげると、なぜか1次元配列に元通り。

```powershell
PS> function bar { @(, @(1,2)) }                                                                                                                            
PS> $bar = bar                                                                                                                                              
PS> $bar #=> @(@(1,2)) のつもりだが、実は @(1,2)                                                                                                                                           
1
2
PS> $bar[0] #=> @(1,2) のつもり:NG 
1
```

# 結論？(というよりあきらめ)
もうこれは`List<T>`を使えというお達しなのでしょうか…

こんなモジュールも用意されているようですし…
[PowerShell で System.Collection.Generics.List を扱ってみる - tech.guitarrapc.cóm](http://tech.guitarrapc.com/entry/2013/09/22/122454)

うーん…

2016/10/5 add: 検証を別記事に起こしました。
[(タイトル変更) powershell: 2次元配列とパイプの罠](http://qiita.com/basso414f/items/c6e875a727988888fd09)
1ヵ月で取得するAWSソリューションアーキテクト (22日目)

#概要
ここまで一気にワープしてきましたね。
11日目から更新が途絶えて(厳密には13日目位だけど)、22日目に飛びました。

ここまで何をしていたのかといえば…
正直に話しますと怠けてました！

ほんとに毎日勉強するっていうのは難しいですねぇ…
サラリーマンだと飲みがあったり、お姉さんの誘惑があったりと大変です。

まぁ正直、ここまでくると1ヶ月で合格は厳しいかもしれませんね。
男はやるといったらやるもんなので、とりあえず最後までやってみようと思います。

##模擬試験
前回、まとめたところでメインに出題される領域は3つだということだったのですが、
残念ながらまだS3までしか触れておらず、VPCに触れておりません。

この項目名にもなっていますがAWSには模擬試験が存在しています。

というわけで手っ取り早く合格するには試験の傾向をつかむことであるという
初心に立ち返り、受けて参りました。

結果は…35%！
ひどい、絶対に受からない！

さぁ、どうしましょうか…

といいつつも模擬試験なんてぶっちゃけ何点でも構わないんですよね。
大切なのは本番で何点とるかということなのですから。

そして、今までの勉強の仕方が悪かったことがよく分かりました。

![image](https://qiita-image-store.s3.amazonaws.com/0/138274/4e4d2195-afe2-4cc1-1d2c-a79560b3415f.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/138274/5e12ab7f-886a-37b8-224e-723fe67b9585.png)

上の画面にも書いてありますけど、分野は全部で4つあるんですねぇ。

```
1 高可用性のデザイン、コスト最適化、フォールトトレラント、システムのスケーリング
2 実施/配備
3 データセキュリティ
4 トラブルシューティング

※一部、勝手に意訳…
```

一体、何がどんな振り分け方になっているのでしょうか…
はぁーさっぱりです。

残念ながら問題をお見せすることはできませんが、基礎を理解するというよりも
サービスの概要を問う問題、顧客の問題・課題に対して提案できるサービス、
サービス(特にEC2の細かい仕様)を問うものが傾向として多いようですね。

とりあえず、続きは明日書きますよ。体調がまだ本調子ではないので…
それにしても、トラブルシューティング0%って…

##試験の傾向

傾向というか問題の観点として感じられたのが設計時の考慮ポイントという印象を強かったです。

顧客の要件があり、それに対してどのようなサービスを利用して満たせば良いのか？
或いは指定したサービスで顧客の要件を満たすにはどのような設定を利用すれば良いのか？

これを踏まえて勉強するべき内容として…

①前提としてサービスの仕様部分は確実に落とさないようにする
②顧客の要件パターン別に有効なサービスを覚えておく

問題数は少なかったのですが、恐らくこのような出題で問題数が増える形なのが本番なのでしょう。
以下に2日に跨って模擬試験を受けた上で覚えていくべきポイントを整理していこうと思います。


##覚えるべきポイント

全20問出た中の内訳は以下の通りでした。

##EC2

(1)セキュリティグループの仕様

既存のセキュリティグループのルールを変更し、新しいインスタンスを追加した場合。
既にセキュリティグループを適用済みのインスタンスには変更したルールは適用されない。
<b>既存の(古い)インスタンスに変更を適用するにはいったん停止してから再起動する必要がある</b>

(2) 2日目に追記

##AutoScaling

(1)仕組みについて

　　・アベイラビリティゾーンに対して適用可能
　　・Weighted Round Robin(WRR)はRoute53の機能

　　<b>※3つのアベイラビリティゾーンに対してAutoScalingで
　　   　ピークロードの50%を処理できるように設定すれば、
　　   　理論上、1台故障しても100%の稼働状態を実現可能。</b>

(2) 2日目に追記

##Amazon Glacier

(1)適切な利用方法

　　・あまり頻繁にアクセスされないデータ
　　・データアーカイブ

GlacierはS3と異なり、データの保存、解凍に時間がかかる。
ただし、S3よりも安くサービスを利用できるため、
ログやバックアップなどのデータアーカイブに適している。

##VPC

(1)パブリックサブネットとプライベートサブネット

　　・パブリックサブネット：
　　インターネットゲートウェイへの経路が設定されているサブネット
　　※インターネットゲートウェイが経路にあればインターネットと接続可能

　　・プライベートゲートウェイ：
　　インターネットゲートウェイの経路が設定されていないサブネット

(2)パブリックサブネットの設定

送信先：0.0.0.0/0 --> ターゲット：インターネットゲートウェイ

経路上にインターネットゲートウェイが存在していれば、
パブリックサブネットになるという話でした。

<b>0.0.0.0/0 は「既知でない送信先」という意味</b>で
それをインターネットゲートウェイにアタッチするイメージですね。

##総括

今日はサービスごとという形で話をまとめましたが、
実は試験に関してはこういう形ではないので、
明日は利用別にパターン分けして要点を整理しようと思います。
fgets(STDIN)で入力したエンターは当然ながら改行コードとして受け渡される

考えてみれば当たり前の話なんだけど微妙に詰まったので備忘録的に

普段ちょっとした処理の動作確認するときって

```php
$input = 'hoge';
```

みたいにコードに処理する文字列をべた書き書きしてるんですが、
標準入力から処理する文字列を取得したいことがあって

```php
$input = fgets(STDIN);
```

ってすると`$input`の末尾に`\n`が入ってることに気づかなくて処理がこけてた
文字列の末尾から処理したくて

```php
$reversed_char_array = array_reverse(str_split($input));
```

みたいなことしてたら思ってたのとキーが違った('hoge'を反転したのに0番目が'e'じゃない！？って混乱した)ので気を付けます

暇つぶしにやってたpaizaの問題で10分ぐらいロスした…
脆弱性スキャナVulsのTUIが動かなかった→動きます

※作者の@kotakanbe@githubさんがストックされたと思ったら、READMEが修正されたので現在はREADME通りでOKです。
https://github.com/future-architect/vuls/commit/63f0a272c4be2b28423995d42517d6ab464c365f

# はじめに
つい先日、脆弱性検知ツールVulsというものの存在を知って、ここら辺の記事を見てインストールしてみた、
http://qiita.com/tags/vuls
特にこちらの記事
http://qiita.com/usiusi360/items/aeb3cd3630badfacdb4e
http://qiita.com/sadayuki-matsuno/items/0bb8bb1689425bb9a21c

# TUIが動かない…
公式サイトを見ながら "Step8. Start Scanning"まで順調に進む。
https://github.com/future-architect/vuls/blob/master/README.ja.md (c2eab87)
が、しかし、"Step9. TUI" を素直に実行してみると。

```shell-session
$ vuls tui
ERRO[0000] Failed to read /home/vuls/results: open /home/vuls/results: no such file or directory
```

ファイルが見つからないってエラーになった。

# 解決(JSONレポート出力)
ちょっと悩んでオプション(-report-json)を指定して解決

```
$ vuls scan -cve-dictionary-dbpath=$PWD/cve.sqlite3 -report-json
```

無事TUIが動いたのでした。

# いい感じ
これからWebUIとかメールに飛ばして実運用して見ます。
Googleマイマップを使ってイングレスの作戦地図を作る

#Googleマイマップを使って作戦地図を作ろう
##はじめに
最近イングレスという位置情報ゲームで遊んでいます。
健康のため歩き回る切っ掛けなればと始めたのですが、そこそこリアルと絡んで中々面白いです。
まだ始めて間もないので、コミュニティーへ登録してもFFで補給するくらいなのですが、多重CFを作ったりするのにも興味が出てきました。
リンクを張る順番やポータルキーの数を机上演習する目的で、グーグル マイマップについて調べてみました。
そのうち大人数のエージェントによる作戦にも参加してみたいので、役に立つといいなと思ってます。
##インテルマップを表示
イングレスは、スマートフォンのスキャナー画面だけではなくブラウザのインテルマップでもポータルの配置とステータスを確認できます。
グーグルマップをベースに作成されていてよく出来ているのですが、CFやリンクが邪魔で作戦を練る地図には、あまり向いていません。
グーグルマップには、マイマップという自分だけにカスタマイズした地図を作るサービスがありますので、マイマップを使って作戦地図を作ることにしました。
![インテルマップ.png](https://qiita-image-store.s3.amazonaws.com/0/7839/062dff27-eefc-586b-90b9-3077216b7e62.png)
##ポータルのリンクを取得する
ポータルと呼ばれるポイントは、右上のリンクボタンを押すことによってURLを取得できます。
このURLをそのままブラウザへ貼るとインテルマップでポータルが選択されて表示されます。
エージェント同士で、ポータル位置を共有する際には、この機能が使われます。
![リンク.png](https://qiita-image-store.s3.amazonaws.com/0/7839/39655b34-50b5-6c32-b803-e370367aea98.png)
##緯度経度でマップ検索
取得したリンクの引数を見ると緯度経度が指定されているのが分かると思います。
グーグルマップでは、緯度経度で検索することもできますので、URLの最後尾の２つの数値を使って検索を行います。
地図に黄緑色のマーカーが追加されました。
![マップを緯度経度で検索.png](https://qiita-image-store.s3.amazonaws.com/0/7839/e6dfacd3-5a11-b6fd-7181-5d7c48151484.png)
##マーカーの追加
作成したマイマップに、マーカーを追加していきます。
マーカーの横にマウスオーバーするとプラスボタンが表示されますので押してください。
現在選択されているレイヤーへ青いマーカーが追加されます。
![マーカーの追加.png](https://qiita-image-store.s3.amazonaws.com/0/7839/185e6015-d7c8-6f8a-6686-0ef81e53fd76.png)
![マーカーの追加2.png](https://qiita-image-store.s3.amazonaws.com/0/7839/5124a5dc-741b-2dd0-2f0d-bea7527a5694.png)
##ポータル名称を取得する
追加したての状態では、ラベルは緯度経度の数値になっています。
わかりやすいように、ラベルをポータル名称へ変更します。
ポータル名称は、ブラウザのデバッグツールを利用して取得します。
ChromeならF12ボタンで起動します。(終了もF12)
![名前の取得.png](https://qiita-image-store.s3.amazonaws.com/0/7839/8083fcea-a286-1cd6-d4c8-8619d3b6bc46.png)![名前をクリップボードへコピー.png](https://qiita-image-store.s3.amazonaws.com/0/7839/c145ec05-cd5e-0e46-ed19-21f14b7d52be.png)
##マーカーの名称をポータル名称へ変更する
鉛筆ボタンを押すとラベル名称を変更することができます。
![マーカー名称の変更.png](https://qiita-image-store.s3.amazonaws.com/0/7839/f963cb5f-c6ad-5be5-1374-005a3bf8f7fd.png)
マーカーが沢山ならんでもポータル名称だと判りやすいと思います。
![マーカー追加完了.png](https://qiita-image-store.s3.amazonaws.com/0/7839/b3edcd0c-f8db-a4bf-97e6-ed78b4f3db00.png)
##色分けして完成
マイマップには、ラインと色分け機能があります。
作戦のステップを色分けすると判りやすいかもしれませんね。
![完成図.png](https://qiita-image-store.s3.amazonaws.com/0/7839/23f93df0-b91c-d90f-326b-ef63d527fb85.png)
##最後に
ポケモンGOに飽きたらイングレスを遊んでみてはどうでしょうか。
【SpriteKit】歩くアニメーション

##人の歩くアニメーション
###考えられるやり方
1. 人の体をパーツごとに分けた`SKSpriteNode`を`SKAction`で動かす
2. `SKAction`の`animateWithTextures`を使ってパラパラアニメーション

現時点では2. の方法に挑戦してみます。1番は時間があればやってみたい...

###画像を用意

まずは画像を何枚か作ります。

human0.png
![human1.png](https://qiita-image-store.s3.amazonaws.com/0/140528/d2fd7107-5d00-5b02-c956-a312b96a5402.png)
.
.
.
human3.png

枚数が多いほど滑らかになりますが、とりあえず4コマで作ってみます。


###テクスチャアトラスに追加

アニメーションで使う画像を扱いやすいようにしておきます。
Assetsに画像を追加する際、New Sprite Atlasから、テクスチャアトラス用のフォルダを作りその下に画像をドラッグ&ドロップして読み込みます。
humanフォルダの右側に4つの四角マークがあります。それが普通のフォルダとの違いですね。
<img width="1018" alt="スクリーンショット 2016-10-03 22.15.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/140528/a8788ace-7e5e-90d6-f5a8-5ed53142d847.png">


###ソースコード
プロジェクトはGameテンプレのSpriteKitを選んで作っておきます。
あとはGameScene.swiftのコードに少し手を加えるだけです。

```swift:GameScene.swift
import SpriteKit

class GameScene: SKScene {
    
    var texture:[SKTexture] = []
    
    override func didMoveToView(view: SKView) {
        // テクスチャアトラスのフォルダ名を指定
        let atlas = SKTextureAtlas(named: "human")
        //human0~human3を配列textureに追加
        for i in 0...3{
            texture.append(atlas.textureNamed("human" + String(i)))
        }
    }
    
    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
       /* Called when a touch begins */
        for touch in touches {
            let location = touch.locationInNode(self)
            let sprite = SKSpriteNode(texture: texture[0])
            
            //スケール
            sprite.setScale(0.2)
            sprite.position = location
            //パラパラアニメのアクション
            let animation = SKAction.animateWithTextures(texture, timePerFrame: 0.2)
            //画面の左方向に80pixcel/secの速さで動かす
            let moveAction = SKAction.moveByX(-40.0, y: 0, duration: 1.0)
            sprite.runAction(SKAction.repeatActionForever(animation))
            sprite.runAction(SKAction.repeatActionForever(moveAction))
            
            self.addChild(sprite)
        }
    }
   
    override func update(currentTime: CFTimeInterval) {
        /* Called before each frame is rendered */
    }
}
```

###完成

<blockquote class="twitter-video" data-lang="ja"><p lang="ja" dir="ltr">iOSでアニメーション <a href="https://t.co/OAFKYQvh9N">pic.twitter.com/OAFKYQvh9N</a></p>&mdash; Junya Yamamoto (@yamajyn) <a href="https://twitter.com/yamajyn/status/782942502441455617">2016年10月3日</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
Rails4.*でbootswatchを使用する

## Bootswatch？
  - 無料で使用可能なBootstrapテーマ
  - 多数のテーマ有り
  - railsへの導入が容易
  - [公式サイトはコチラ](http://bootswatch.com/)

## インストール

Gemfileに次のように追記

~~~ruby:Gemfile
# コレ以外のbootstarap系のgemは入れないでOK
gem 'twitter-bootswatch-rails', '~> 3.3.4'
gem 'twitter-bootswatch-rails-helpers'
~~~

次に```bundle install```を実行してgemを入れる
gemが入ったら、レイアウトを選んで次のコマンドを実行。これで好みのレイアウトをインストールできる。

~~~sh
# simplexの部分はレイアウト名です
$ rails g bootswatch:install simplex
$ rails g bootswatch:import simplex
$ rails g bootswatch:layout simplex
~~~

インストールできたら、application.cssに以下のように追記

~~~
/*
 *= require_self
 *= require_tree .
 *= require [theme_name]/loader
 *= require [theme_name]/bootswatch
*/
~~~

また、application.jsに以下のように追記

~~~
//= require jquery
//= require jquery_ujs
//= require [theme_name]/loader
//= require [theme_name]/bootswatch
~~~

これで、bootswatchのレイアウトが使えるようになる！
escape_utilsとweb-consoleの組み合わせにて

Rails開発を行っていますが、標記の2つを組み合わせると思わぬ挙動となってしまいました。

# escape_utilsとは
RailsのようなWebアプリでは、あちこちで文字列のエスケープ処理が必要となりますが、基本的にはRuby内部で正規表現マッチにより行っています。[brianmario/escape_utils](https://github.com/brianmario/escape_utils)は、そのような定型的なエスケープ処理をC言語で行うことで、数十倍に高速化するためのgemです。

## 使い方
読み込んだだけでは適用されないので、`config/initializers/`以下でモンキーパッチを適用する必要があります。

```rb:config/initializers/escape_utils.rb
begin
  ######### あとで解説します
  EscapeUtils.html_secure = false
  ######### 今回の記事のポイント

  require 'escape_utils/html/rack' # to patch Rack::Utils
  require 'escape_utils/html/erb' # to patch ERB::Util
  require 'escape_utils/html/cgi' # to patch CGI
  require 'escape_utils/html/haml' # to patch Haml::Helpers

  # for patches in Rails 4.2 ActiveSupport
  if ActiveSupport.version.to_s.start_with?('4.')
    module ActiveSupport
      class SafeBuffer # :nodoc:
        private

          def html_escape_interpolated_argument(arg)
            return arg if !html_safe? || arg.html_safe?
            CGI.escapeHTML(arg.to_s)
          end
      end
    end
    class ERB
      module Util # :nodoc:
        def unwrapped_html_escape(s) # :nodoc:
          s = s.to_s
          if s.html_safe?
            s
          else
            CGI.escapeHTML(s)
          end
        end

        singleton_class.__send__(:remove_method, :unwrapped_html_escape)
        module_function :unwrapped_html_escape
      end
    end
  end
rescue LoadError
  Rails.logger.info 'Escape_utils is not in the gemfile'
end
```

なお、Rails 4では一部のルーチンについて自前実装しているので、別個でモンキーパッチをかける必要がありました（`if`文を見ての通り、Rails 5の場合には不要です）。

# web-console
Rails開発者にはもはや説明不要かもしれませんが、Web上でRailsのコンソールにアクセスできるという、開発には欠かせない一品です（[rails/web-console](https://github.com/rails/web-console)）。

# 2つ組み合わせてみると
開発環境でこの2つを合わせて使っていたのですが、コンソールに何を打ち込んでも`untranslated ja.errors.unacceptable_request`のようなメッセージが出るようになってしまいました。

Chromeのほうのコンソールを開いて追いかけてみると、web consoleが投げたリクエストに406を返していました。ヘッダを見てみると、`Accept: application&#46;vnd.web-console.v2`と、実体参照をそのまま投げていました。

## 答え合わせ
実際に吐かれたJavaScript上で実体参照となってしまった箇所のソースを探してみると、`/lib/web_console/templates/console.js.erb`の中にありました（[リンク](https://github.com/rails/web-console/blob/master/lib/web_console/templates/console.js.erb#L837)）。そして、ふつうであればスラッシュのエスケープはされないところ、escape_utilsが気を利かせて[スラッシュまでエスケープしてくれる](https://github.com/brianmario/escape_utils#escaping)ために、ここまでエンコードされてしまった、ということでした。

これがweb-console側でIssuになるかはわからないですが（標準状態では問題にならないので）、とりあえずモンキーパッチ前に`EscapeUtils.html_secure = false`として、スラッシュのエスケープを止めることで、とりあえず動くようになりました。
Chromeのブックマーク用区切り線を作ったよ！

→[http://nurseangel.sakura.ne.jp/sep/](http://nurseangel.sakura.ne.jp/sep/)←


## Chromeのブックマーク用区切り線を作ったよ！

Firefoxには存在するのに、何故かChromeには区切り線が存在しない！
これは困った！
というわけで作ってみたよ！
しかもプラグイン追加とか一切不要、以下のページにアクセスするだけで簡単に区切り線が使えるよ！

## 区切り線の追加方法

1.ページを開きます
2.アイコンを、セパレータを入れたいところにドラッグします。
3.完了！
![drag.png](https://qiita-image-store.s3.amazonaws.com/0/26088/8388c2cb-7530-a2f7-3102-5eeaddfe1ea8.png)


## 区切り線を自由に自作できるよ！

フォームに使いたい文字と繰り返し数を入れれば、簡単に区切り線が作れるよ！
もしくは直接URLにリンクしてもOK！

[/sep/-/50](http://nurseangel.sakura.ne.jp/sep/-/50) (初期値)
　→--------------------------------------------------

[/sep/♡/20](http://nurseangel.sakura.ne.jp/sep/%E2%99%A1/20)
　→♡♡♡♡♡♡♡♡♡♡♡♡♡♡♡♡♡♡♡♡

[/sep/杏マナー/10](http://nurseangel.sakura.ne.jp/sep/%E6%9D%8F%E3%83%9E%E3%83%8A%E3%83%BC/10)
　→杏マナー杏マナー杏マナー杏マナー杏マナー杏マナー杏マナー杏マナー杏マナー杏マナー

[/sep/下广卞廿十亠卉与本二上旦上二本与卉亠十廿卞广/2](http://nurseangel.sakura.ne.jp/sep/%E4%B8%8B%E5%B9%BF%E5%8D%9E%E5%BB%BF%E5%8D%81%E4%BA%A0%E5%8D%89%E4%B8%8E%E6%9C%AC%E4%BA%8C%E4%B8%8A%E6%97%A6%E4%B8%8A%E4%BA%8C%E6%9C%AC%E4%B8%8E%E5%8D%89%E4%BA%A0%E5%8D%81%E5%BB%BF%E5%8D%9E%E5%B9%BF/2)
　→下广卞廿十亠卉与本二上旦上二本与卉亠十廿卞广下广卞廿十亠卉与本二上旦上二本与卉亠十廿卞广

## 技術的な話

見てのとおり、単にブックマークのtitleをそれっぽい文字列にしてるだけです。
技術的に目新しい話は全く一切何一つ存在しない。

## 開発動機

ブックマークが多いからセパレータが欲しいなと思って探してみたけど、Chromeにはそもそもセパレータ機能がなかった。
[過去あった要望](https://productforums.google.com/forum/#!topic/chrome-ja/JDVjWYDpqac)は[リジェクトされていた](https://bugs.chromium.org/p/chromium/issues/detail?id=7789)ので、今後の追加も見込めないだろう。

[プラグイン](https://chrome.google.com/webstore/detail/benzo-bookmarks/pnchdkpeolmmjdpoabdkjdajjlklndjf?hl=ja)は見つかったけど、この程度の内容のためにわざわざ入れたくない。

同じ発想のサイトは[幾つか](http://separatr.com/)[見つかった](http://separatethis.com/)んだけど、セパレータ文字列が固定で使いにくい。
ブックマーク編集で変更しろとか書いてあるけど、だったら最初からこんなサイト使う必要ないだろう。
[ここ](http://chromesep.rakuin.com/)なんかに至ってはそもそもセパレータの目的を放棄してるとかいうね。

というわけで作った。

## ソース

→[GitHub](https://github.com/NurseAngel/php_bookmark_separator)

## その他

見た目がやる気なさすぎるのは仕様です。
誰かHTMLプルリクください。
Go 1.7のホスト名前解決の仕様変更

Go 1.7の名前解決の仕様変更とDockerのscratchイメージの組み合わせで少しハマったのでそのメモです。

# Go 1.7の名前解決の仕様

Go 1.6までpure Goの名前解決の実装は`/etc/hosts`を先に読み、なければDNSを引くという順序で固定でした。参考: [Go 1.6のnet/conf.go](https://github.com/golang/go/blob/da6b9ec7bf1722fa00196e1eadc10a29156b6b28/src/net/conf.go#L128)

Go 1.7からはpure Goの実装でも`/etc/nsswitch.conf`の設定に基づいた順番で名前解決を行うようになりました。 参考: [net: allow netgo to use lookup from nsswitch.conf](https://go-review.googlesource.com/#/c/19523/)

> The pure Go name resolution implementation now respects nsswitch.conf's stated preference for the priority of DNS lookups compared to local file (that is, /etc/hosts) lookups.
> [Go 1.7 Release Notes](https://golang.org/doc/go1.7#minor_library_changes)

`nsswitch.conf`が存在しない場合は、Go 1.6までと違ってDNSルックアップが優先で、引けなければ`/etc/hosts`を見るという順番がデフォルトになり挙動が変わります。なおこの挙動は[glibcのデフォルト](http://www.gnu.org/software/libc/manual/html_node/Notes-on-NSS-Configuration-File.html)(`dns [!UNAVAIL=return] files`)と同じにしているようです。 参考: [net/conf.go#L200-L211](https://github.com/golang/go/blob/26531b3846694b311aec87fc4f5de65b4cc48a44/src/net/conf.go#L200-L211)


# nsswitch.confが存在しないとき

GoでビルドしたバイナリをDockerイメージで動かすとき、ベースイメージにscratchやAlpine Linuxなどを選択することがあると思います。scratchやAlpine Linuxにはglibcが入っていないので`nsswitch.conf`が存在しません。そのため1. 7でビルドしたタイミングからDNSルックアップが優先されるようになるので注意が必要です。

自分はdocker-composeのlink機能で`/etc/hosts`に設定されるホスト名を使っていて、さらに運悪くDNSで引けるホスト名だったので1.7でビルドしてからリンクしたコンテナに繋げなくなりハマりました。Dockerのホスト側の`/etc/hosts`に同じホスト名の設定が入っている場合もコンテナ側からDNSで引けてしまうので注意が必要です。

ひとまずDockerイメージに`/etc/nsswitch.conf`を含めることで解決しました。
【Visual Studio】よく使われるショートカットキーのまとめ 

<p><strong>Visual Studioでよく使われるショートカットキーをまとめてみました。</strong>
<p>※Visual Studioのバージョンによっては異なるものもあるかもしれません。

<p>なお、ショートカットキーはカスタマイズして変更することができます。
<ul><li><a href="http://teapipin.blog10.fc2.com/blog-entry-587.html">Visual Studioでショートカットキーをカスタマイズする方法 - creativi.tea</a></li></ul>

<h1>ファイル</h1>
<table id="table-01"> <tbody> <tr> <th>ショートカットキー</th> <th>意味</th></tr> <tr> <td>Ctrl + Shift + N</td> <td>プロジェクトの作成</td></tr> <tr> <td>Ctrl + N</td> <td>ファイルの作成</td></tr> <tr> <td>Ctrl + Shift + O</td> <td>プロジェクトを開く</td></tr> <tr> <td>Ctrl + O</td> <td>ファイルを開く</td></tr> <tr> <td>Ctrl + Shift + A</td> <td>項目の追加</td></tr> <tr> <td>Ctrl + S</td> <td>ファイルの上書き保存</td></tr> <tr> <td>Ctrl + Shift + S</td> <td>すべてを保存</td></tr></tbody></table>

<h1>ビルド</h1>
<table id="table-01"> <tbody> <tr> <th>ショートカットキー</th> <th>意味</th></tr> <tr> <td>F6<br>Ctrl + Shift + B</td> <td>ソリューションのビルド</td></tr> <tr> <td>Ctrl + F6</td> <td>プロジェクトのビルド</td></tr> <tr> <td>Ctrl + Break</td> <td>ビルドの中止</td></tr></tbody></table>

<h1>デバッグ</h1>
<table id="table-01"> <tbody> <tr> <th>ショートカットキー</th> <th>意味</th></tr> <tr> <td>F5</td> <td>デバッグの開始</td></tr> <tr> <td>Ctrl + F5</td> <td>デバッグなしで開始</td></tr> <tr> <td>Ctrl + F10</td> <td>カーソルの位置までデバッグ</td></tr> <tr> <td>F10</td> <td>ステップオーバー</td></tr> <tr> <td>F11</td> <td>ステップイン</td></tr> <tr> <td>F9</td> <td>ブレークポイントの作成/解除</td></tr> <tr> <td>Ctrl + F9</td> <td>ブレークポイント行のブレークポイントの有効/無効の切替</td></tr> <tr> <td>Ctrl + Shift + F9</td> <td>すべてのブレークポイントの削除</td></tr></tbody></table>

<h1>編集</h1>
<table id="table-01"> <tbody> <tr> <th>ショートカットキー</th> <th>意味</th></tr> <tr> <td>Ctrl + E, C</td> <td>選択範囲のコメントアウト</td></tr> <tr> <td>Ctrl + E, U</td> <td>コメントアウトの解除</td></tr> <tr> <td>Ctrl + E, D</td> <td>ドキュメントのフォーマット</td></tr> <tr> <td>Ctrl + E, W</td> <td>コードを右端で折り返す</td></tr> <tr> <td>Ctrl + R, W<br>Ctrl + E, S</td> <td>空白記号の表示/非表示の切り替え</td></tr> <tr> <td>Ctrl + Shift + V</td> <td>クリップボードリングの切り替え</td></tr></tbody></table>

<h1>検索</h1>
<table id="table-01"> <tbody> <tr> <th>ショートカットキー</th> <th>意味</th></tr> <tr> <td>Ctrl + F</td> <td>クイック検索</td></tr> <tr> <td>Ctrl + Shift + F</td> <td>フォルダを指定して検索</td></tr> <tr> <td>Ctrl + H</td> <td>クイック置換</td></tr> <tr> <td>Ctrl + Shift + H</td> <td>フォルダを指定して置換</td></tr> <tr> <td>Ctrl + I</td> <td>インクリメンタル検索</td></tr></tbody></table>

<h1>表示</h1>
<table id="table-01"> <tbody> <tr> <th>ショートカットキー</th> <th>意味</th></tr> <tr> <td>Ctrl + -</td> <td>直前のカーソル位置に戻る</td></tr> <tr> <td>Ctrl + Shift + -</td> <td>Ctrl + - にて戻る前のカーソル位置に移動する</td></tr> <tr> <td>F12</td> <td>定義へ移動</td></tr> <tr> <td>Shift + F12</td> <td>参照へ移動</td></tr></tbody></table>

<h1>リファクタ</h1>
<table id="table-01"> <tbody> <tr> <th>ショートカットキー</th> <th>意味</th></tr> <tr> <td>F2</td> <td>名前の変更</td></tr> <tr> <td>Ctrl + R , M</td> <td>メソッドの抽出</td></tr> <tr> <td>Ctrl + R , E</td> <td>フィールドのカプセル化</td></tr> <tr> <td>Ctrl + R , I</td> <td>インターフェイスの抽出</td></tr> <tr> <td>Ctrl + R, P</td> <td>ローカル変数をパラメータへ昇格</td></tr> <tr> <td>Ctrl + R, V</td> <td>パラメータを削除</td></tr> <tr> <td>Ctrl + R, O</td> <td>パラメータ順序の再定義</td></tr></tbody></table>
UnityのPrefabをSerializeFieldに設定したときのメモリの状態

#内容
Prefabに関連付いているAssetはいつロードされるのかという調査。

#環境
Unity5.4.0p4
Windows10
実行デバイスはAndroid Nexsus5X

#実装
SpriteRendererのSpriteにTextureを設定したGameObjectをPrefabにする。

下記のような何もしないMonoBehaviourをアタッチした状態で
Prefabを関連付けるのと関連付けないのでテストした。

```csharp:
using UnityEngine;

public class Loader : MonoBehaviour
{
    [SerializeField]
    GameObject _prefab;

    void Awake()
    {
    }

    void Update()
    {
    }
}
```

#結果
Prefabに関連付いているアセットもロードされていた。

![メモリ1.png](https://qiita-image-store.s3.amazonaws.com/0/36154/8d203ba5-6db2-130c-f941-698ac8250a0e.png)

![メモリ2.png](https://qiita-image-store.s3.amazonaws.com/0/36154/6db0b2fb-1394-1fda-9086-11263aafdb21.png)

読み込むリソースが違うステージなどを作る場合は
別々のシーンを作った方がよさそうですね。
RESTful APIの設計でやること

# 前提

[Web APIとは何なのか](http://qiita.com/NagaokaKenichi/items/df4c8455ab527aeacf02)
[リソース指向アーキテクチャ(ROA)とは何なのか](http://qiita.com/NagaokaKenichi/items/0f3a55e422d5cc9f1b9c)
[RESTful APIとは何なのか](http://qiita.com/NagaokaKenichi/items/0647c30ef596cedf4bf2)

# RESTful API設計でやること

体系的にまとめてみた。
リンクになっているところは以前Qiitaに投稿した記事。詳細はリンク先を参照してほしい。

1. [リソース設計](http://qiita.com/NagaokaKenichi/items/ef23ca15ba0e9e5ee022)
2. インターフェース設計
    3. [URI設計](http://qiita.com/NagaokaKenichi/items/6298eb8960570c7ad2e9)
    4. レスポンス設計
        5. [HTTPステータスコード設計](http://qiita.com/NagaokaKenichi/items/eb85b5fbb719d60c6627)
        6. [データモデル設計](http://qiita.com/NagaokaKenichi/items/cb04af4f2c71e36bb670)
        7. [例外設計](http://qiita.com/NagaokaKenichi/items/20825ae9256d9f4c6f35)
3. ログ設計
4. 詳細設計

ログ設計、詳細設計に関しては以下に軽く述べておく。

# ログ設計

APIにリクエストがあった時に、どのようなログを出力する必要があるか検討する。
考え方として、「ログ = 何か問題があった時のための調査資材(運用業務含む)」ということを念頭に考えると良い。主に検討する内容としては以下のようなものがある。

* ログフォーマット
* ログメッセージ
* ログレベル
* ログ出力タイミング
* ログ出力先
* ログローテート

※個人情報の類は極力ログに含めるべきではないが、やむを得ず含める場合はマスキングをする等の工夫をする。

### 詳細設計

APIのパッケージ構成、APIの処理フロー、(データストアがDBであれば)各APIのデータ取得先テーブルのマッピング。プロジェクトによってはこの設計を省くこともある。


RESTful APIの設計というか、Web API全般における設計になってしまった。
/usr/local/を開く方法(mac)

/usr/local/などのディレクトリは、Finderで通常のやり方では表示されない。
プログラムをインストールなど、確認したい時は、
shift+command+G 
で、フォルダの場所を入力するフォームが表示されるので、そこで検索する。
[Lubuntu][Linux] Lubuntu 16.04で、Caps LockをCtrlにする方法いろいろ

Ubuntu 16.04を入れたあと、`apt-get install lubuntu-desktop`してLubuntuにした環境でのお話です。

とりあえずはできるようになったのですが、正しいお作法教えてください。


# :x: 方法1 /etc/default/keyboard を編集

情報源 → http://micchan.com/tips/2016/01/17/replace-ctrl-key-with-caps-lock-key-of-lubuntu/

/etc/default/keyboardに次のような行を付け加え、再起動します。

```text:/etc/default/keyboard
XKBOPTIONS="ctrl:nocaps"
```

結果、だめでした。

# :x: 方法2 ~/.config/lxsession/Lubuntu/autostart を編集

情報源 → http://qiita.com/tnarihi/items/a46bcf96558951505d98

~/.config/lxsession/Lubuntu/autostart に次のような行を付け加えてログインし直します。

```text:~/.config/lxsession/Lubuntu/autostart
@setxkbmap -option "ctrl:nocaps"
```

結果、だめでした。

LXDEのWikiによると、autostart内の各行は、スペースで区切られた先頭要素しか読み込まないみたいです。引数があるならシェルスクリプトを用意しろとか。 → https://wiki.lxde.org/en/LXSession

# :x: 方法3 ~/.config/lxsession/Lubuntu/desktop.confを編集

desktop.confファイルのKeyboadセクションにある行を書き換えて、ログインし直します。

```text:~/.config/lxsession/Lubuntu/desktop.conf
[Keymap]
options=ctrl:nocaps
```

結果、だめでした。

# :o: 方法4 シェルスクリプトでsetxkbmapを実行

簡単なシェルスクリプトを用意します。

```bash:~/bin/lx-caps2ctrl
#!/bin/sh
exec setxkbmap -option caps:nocaps
```

作成したシェルスクリプトをautostartから実行するようにします。

```text:~/.config/lxsession/Lubuntu/autostart
@/home/ofyou/bin/lx-caps2ctrl
```

結果、うまくいきました。

# :interrobang: 方法5 ~/.config/autostart/setxkbmap.desktopを作成


試していないですが、こんなファイルを作ればよいみたいです。

```text:~/.config/autostat/setxkbmap.desktop
[Desktop Entry]
Type=Application
Name=Caps2Ctrl
Exec=setxkbmap -options caps:nocaps
OnlyShowIn=LXDE
```
WPFメモ　コントロールの拡大

# 概要

コントロールの大きさを2倍にするサンプル。

# コード

```xml:MainWindow.xaml
<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApplication1"
        mc:Ignorable="d"
        Title="MainWindow" Height="465.718" Width="525">
    <Window.Resources>
        <!-- サイズ2倍 -->
        <ScaleTransform x:Key="ScaleXY" ScaleX="2" ScaleY="2" />
        <!-- ベースのスタイル -->
        <Style x:Key="BaseStyle" TargetType="{x:Type FrameworkElement}">
            <Setter Property="LayoutTransform" Value="{StaticResource ScaleXY}" />
        </Style>
        <!-- コントロールのスタイル -->
        <Style TargetType="{x:Type Button}" BasedOn="{StaticResource BaseStyle}" />
        <Style TargetType="{x:Type CheckBox}" BasedOn="{StaticResource BaseStyle}" />
        <Style TargetType="{x:Type ComboBox}" BasedOn="{StaticResource BaseStyle}" />
        <Style TargetType="{x:Type Label}" BasedOn="{StaticResource BaseStyle}" />
        <Style TargetType="{x:Type ListBox}" BasedOn="{StaticResource BaseStyle}" />
        <Style TargetType="{x:Type RadioButton}" BasedOn="{StaticResource BaseStyle}" />
        <Style TargetType="{x:Type TextBlock}" BasedOn="{StaticResource BaseStyle}" />
        <Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource BaseStyle}" />
    </Window.Resources>

    <StackPanel>
        <Button x:Name="button" Content="Button"/>
        <CheckBox x:Name="checkBox" Content="CheckBox" IsChecked="True"/>
        <ComboBox x:Name="comboBox" SelectedIndex="0">
            <ComboBoxItem Content="コンボ項目1" />
            <ComboBoxItem Content="コンボ項目2" />
            <ComboBoxItem Content="コンボ項目3" />
        </ComboBox>
        <Label x:Name="label" Content="Label"/>
        <ListBox x:Name="listBox" Height="50">
            <ListBoxItem Content="AAAA" />
            <ListBoxItem Content="BBBB" />
            <ListBoxItem Content="CCCC" />
        </ListBox>
        <RadioButton x:Name="radioButton" Content="RadioButton" IsChecked="True"/>
        <TextBlock x:Name="textBlock" TextWrapping="Wrap">
            テキスト一行目<LineBreak />
            テキスト二行目<LineBreak />
        </TextBlock>
        <TextBox x:Name="textBox" Height="23" TextWrapping="Wrap" Text="TextBox"/>

    </StackPanel>
</Window>
```

# 実行結果

![w01-02.png](https://qiita-image-store.s3.amazonaws.com/0/142879/7d827f87-9158-5f3c-296c-c480214717c4.png)

参考(通常サイズ)
![w01-01.png](https://qiita-image-store.s3.amazonaws.com/0/142879/db8a5969-190b-fbab-a953-6db260e8498c.png)

# 環境
* Windows 8.1
* Visual Studio Express 2015 for Windows Desktop
負の索引を持った配列を定義したいっ！


# 背景
EditGraphの最短距離を計算したくなりました。
えーそりゃぁもー突然に…

MyersさんやらWuさんやらのアルゴリズムを実装すれば良いです。実装サンプルや解説サイトは簡単に見つかります。
でも、ここ等辺で解説されているのは例えば``-D``から``+D``までの索引を持った作業エリアを使ったりするのですが、プログラムで表現する際は、まぁ当然のようにオフセットを掛けて``0``~``2*D``の範囲をアクセスしている訳です。

いや、全く問題ありません。
それで良いじゃないですか。

良いんですけどぉ、マイナス索引でアクセスできる``Array``ってのがあっても良いかなぁ…
なんて。

# 方針

* ``Collection``系は何となく重いような気もするんで、あくまでも``System.Array``系で実装したいかなぁ
* ``System.Array``をサブクラス化しても何ともならん気がするので、ラッパする感じで行きましょう
* となると、``Array``と同等に扱うには``ICloneable,  IList, ICollection, IEnumerable``等をインタフェース継承するのが良いんでしょうけど、とてもめんどくさいので``foreach``できれば良いよね、位のノリで…

# 実装

で、こんな感じで…

```csharp
public class VArray<T> {
    public VArray(int LBound, int UBound) {
        array = new T[UBound - LBound + 1];
        this.LBound = LBound;
        this.UBound = UBound;
    }
    
    T[] array;
    
    public int Length { get { return array.Length; } }
    public T this[int index] {
        get { return array[index - LBound]; }
        set { array[index - LBound] = value; }
    }
    public int LBound { get; private set; }
    public int UBound { get; private set; }
    public IEnumerator<T> GetEnumerator() {
        foreach (T item in array)
            yield return item;
    }
}
```

使い方はこんな感じ。

```csharp
VArray<int> array = new VArray<int>(-5, 5);

for(int i=-5; i<=5; i++)
    array[i] = i;

foreach(int item in array)
    Console.WriteLine(item);
```

これで、１１個の``item``が``WriteLine``されてきます。
<br/>
ま、どれだけ役に立つかは微妙ですけどね。
iPadでSSHクライアントを使ってみる

#はじめに
この記事は、iPadでSSHを利用してAWSのEC2にアクセスしたい方に対し、クライアントアプリのインストールからアプリの設定、アクセスの仕方までを解説するものです。

筆者の環境は以下の通りです。

iPad: iPad4 + iOS10.0.2
Bluetooth Keyboard:Logicool製 

なお、これから紹介するアプリはiPhone版もあります。試しにiPhone7で[vSSH Lite](http://itunes.apple.com/jp/app/vssh-lite/id535055496?mt=8)を動かしてみましたが、きちんとログインできました。画面は小さいですが、Ctrl+Cも機能しました。

#無料SSHクライアントを探そう

APP Storeで"ssh"をキーに検索するといくつか出てきますが、[Serverauditor](http://itunes.apple.com/jp/app/serverauditor-ssh-shell-console/id549039908?mt=8)が広告も出ず、画面も広くてよいと思います。

ほかには

- [iTerminal](https://itunes.apple.com/jp/app/iterminal-ssh-telnet-client/id581455211?mt=8)
- [vSSH HD Lite](https://itunes.apple.com/jp/app/vssh-hd-lite/id535056241?mt=8)

等がありますが、iTerminalは若干使い勝手がよくないかなあ？ と思いました。個人の感覚もあると思うので、自分にあったものを選んでください。

#Serverauditorのインストールと設定

インストールは特に問題ないと思います。アプリを起動すると以下の画面が表示されます（画像が白いですが、気にしない:-p）。

![IMG_0270.PNG](http://qiita-image-store.s3.amazonaws.com/0/143076/5387d9d6-8ded-2dee-aad2-3de7b41401c9.png)

矢印にしたがい「＋」をタップしたいところですが、EC2へのアクセスにキーペアを利用したいので、まずはキーペアを作成し最寄りのPCにダウンロードし、メールソフト等を利用してiPadからキーペアファイルをテキストを閲覧できるようにしてください。

筆者の場合、ダウンロードしたキーペアファイルの拡張子を.pemから.txtに変更、gmail宛にファイルを添付して送り、iPadのgmailアプリでテキストファイルを開きました。なお、キャプチャーしたキーは、無効化しています。

![IMG_0271.PNG](http://qiita-image-store.s3.amazonaws.com/0/143076/be4b7441-9209-bb89-eb23-a0b0e4706529.png)

テキストをクリップボードにコピーしたら、Serverauditorに戻って左上のメニューアイコンをタップし、「Keychain」をタップしてください。

![IMG_0272.PNG](http://qiita-image-store.s3.amazonaws.com/0/143076/3b2cbcce-4b47-edaa-1087-9cd99c4817b2.png)

Keychainの画面で右上の「＋」をタップし、「New Key」を選び、「Paste」タブをタップすると次の画面となるので、任意のKey Nameを入力し、下半分の入力欄にペーストしてから「Save」をタップすると秘密鍵が保存されます。

![IMG_0275.PNG](http://qiita-image-store.s3.amazonaws.com/0/143076/2faca9d2-c492-78d9-b15a-95dde26679cf.png)

次にメニューから「Hosts」をタップし、右上の「＋」アイコンをタップし、「New Host」を選択します。

![IMG_0277.PNG](http://qiita-image-store.s3.amazonaws.com/0/143076/df283df4-9814-2df4-2284-0e0ff665540c.png)

任意のAlias、定められたHost、Port、Usernameを入力し、Passwordは鍵のアイコンをタップし、先ほど保存した秘密鍵を選択、文字の大きさと色合いをお好みで選択し、Saveをタップしてください。

![IMG_0281.PNG](http://qiita-image-store.s3.amazonaws.com/0/143076/32aad46e-378f-6870-2962-a3b34feffcfd.png)

作成されたホストをタップすると接続されます。Wi-Fi環境によってはアクセス制限かかっている可能性もあるため、その場合は4Gでアクセスしましょう。次の画面が開けば、無事アクセス完了です。

![IMG_0283.PNG](http://qiita-image-store.s3.amazonaws.com/0/143076/104f07e1-938b-294b-e761-ca392fbcf79a.png)

以上、説明終わりです。
UIBezierPathの背景を透明にする

<img width="381" alt="Main_storyboard3.png" src="https://qiita-image-store.s3.amazonaws.com/0/12939/19b6bcd7-d7c0-52d1-9d2c-880f14beee84.png">

いまいち役に立たないInterface Builderくんが役に立ってくれました。

ちなみにここでは**GraphView**というクラスを作り、そのプロパティに`UIBezierPath`を持たせています。

```swift:GraphView.swift
class GraphView: UIView {
    ...
    var graph: UIBezierPath!
```

```swift:GraphView.swift
    required init?(coder aDecoder: NSCoder) {
        graph = UIBezierPath()
        super.init(coder: aDecoder)
    }
```

というか、最初から透明にしてくれればいいのに？

---
ブログ書いてます：http://weed.nagoya