OmniAICreator/Qiita-1.07M huggingface dataset:
ニフティクラウド 上の SQL Server 2012 R2 サーバーに Windows 7 から WinRM 経由でログインする


今回はたまたま SQL Server 2012 R2 のイメージを利用したが、Windows Server 2012 でもおそらく同じコマンドで行けるはず。

## SQL Server 2012 R2 側の設定

すべて PowerShell を管理者権限で起動する必要あり。

### WinRM の有効化

Windows Server 2012 はデフォルトで PSRemoting が有効になっている (?) というのもどこかで見たので、この手順はもしかしたら不要かも。

```ps1
PS > Enable-PSRemoting # 質問にはすべて Y で回答する
```

### ネットワーク接続種別の変更

```ps1
PS > Get-NetConnectionProfile -IPv4Connectivity Internet
```

上記コマンドで Network Category が Public と表示される場合には、

```
Set-NetConnectionProfile -InterfaceAlias (Get-NetConnectionProfile -IPv4Connectivity Internet).InterfaceAlias -NetworkCategory Private
```
で Private に変更する。(参考: [AnsibleからWindowsを叩く | 雲間を泳ぐ](http://sebas.kzmx.net/archives/115))

### Computing のファイアウォールで WinRM 用のポートを許可する

IN ルールで `TCP 5985` を許可する。 (アクセス元はあなたの社内からの IP アドレス等を適宜設定する。)

なお、HTTPS によるトランスポートを利用している場合には `5985` ではなく `5986` を設定する必要あり。 (参考: [Installation and Configuration for Windows Remote Management (Windows)](https://msdn.microsoft.com/en-us/library/aa384372(v=vs.85).aspx))

### その他操作メモ

サービス起動：

```
PS > net start winrm
```

サービス停止：

```
PS > net stop winrm
```

自動起動確認：

```
PS > (Get-WmiObject Win32_Service -filter "Name='winrm'").StartMode
Auto
```

## Windows 7 側の設定

すべて PowerShell を立ち上げて作業する。(管理者権限で立ち上げる必要があるかも。)

### プロキシを設定する (必要な場合のみ)

IE からプロキシ設定をインポート。

```ps1
PS > netsh winhttp import proxy source=ie
```

### 接続してみる

```ps1
PS > Enter-PSSession (サーバーのIP) -Credential:(ユーザー名)
# パスワードが聞かれるので適宜入力する
```

## 参考

* [AnsibleからWindowsを叩く | 雲間を泳ぐ](http://sebas.kzmx.net/archives/115)
* [PowerShellでリモートPCの操作を行うに為にEnable-PSRemotingをするための準備 - tech.guitarrapc.cóm](http://tech.guitarrapc.com/entry/2013/02/12/000202)
* [WinHTTP proxyの設定方法まとめ｜noramikeの雑記帳](http://ameblo.jp/noramike299/entry-11083035846.html)
* [メモOFF: Powershellのリモート接続で嵌った件](http://memo-off.blogspot.jp/2014/06/powershell.html)
* [Installation and Configuration for Windows Remote Management (Windows)](https://msdn.microsoft.com/en-us/library/aa384372(v=vs.85).aspx)
* [[WinRM:初級編] WinRM を構成してみよう！ - 管理者は見た！～AD と ILM 一家の秘密～ - Site Home - TechNet Blogs](http://blogs.technet.com/b/jpilmblg/archive/2009/11/25/winrm-winrm.aspx)
* [PowerShell サービス取得・変更を行うコマンドレットのまとめ - 元「なんでもエンジニ屋」のダメ日記](http://nasunoblog.blogspot.jp/2014/01/powershell-get-service-matome.html "PowerShell サービス取得・変更を行うコマンドレットのまとめ - 元「なんでもエンジニ屋」のダメ日記")
[JAWS-UG CLI] ELB:#4 インスタンスの登録削除


前提条件
========


ELBへの権限
-----------

ELBに対してフル権限があること。


EC2への権限
-----------

EC2に対してフル権限があること。


AWS CLIのバージョン
-------------------

以下のバージョンで動作確認済

* AWS CLI 1.10.63

```bash:コマンド:
aws --version
```

```text:結果(例):
      aws-cli/1.10.63 Python/2.7.11 Darwin/15.6.0 botocore/1.4.53
```

バージョンが古い場合は最新版に更新しましょう。

```bash:コマンド:
sudo -H pip install -U awscli
```


0. 準備
=======


0.1. リージョンの決定
---------------------

```bash:変数の設定:
AWS_DEFAULT_REGION='ap-northeast-1'
```


0.2. 変数の確認:
----------------

プロファイルが想定のものになっていることを確認します。

```bash:変数の確認:
aws configure list
```

```text:結果(例):
            Name                    Value             Type    Location
            ----                    -----             ----    --------
         profile       ec2elb_full-prjZ-mbp13        env    AWS_DEFAULT_PROFILE
      access_key     ****************XXXX shared-credentials-file
      secret_key     ****************XXXX shared-credentials-file
          region        ap-northeast-1        env    AWS_DEFAULT_REGION
```


0.3. ロードバランサ名の指定
---------------------------

```bash:変数の設定:
ELB_LB_NAME='lb-handson-20160912'
```


1. 事前作業
===========


1.1. 稼動インスタンスの確認
---------------------------

```bash:コマンド:
aws elb describe-load-balancers \
        --load-balancer-names ${ELB_LB_NAME} \
        --query 'LoadBalancerDescriptions[].Instances[].InstanceId'
```

```text:結果(例):
      [
        "i-xxxxxxxx"
      ]
```


1.2. 削除対象の指定
-------------------

ロードバランサから削除するインスタンスを指定します。

```bash:変数の設定
ARRAY_EC2_INSTANCES='< 削除するインスタンス 例:i-xxxxxxxx >'
```


2. インスタンスの削除
=====================

```bash:変数の確認:
cat << ETX

        ELB_LB_NAME:         ${ELB_LB_NAME}
        ARRAY_EC2_INSTANCES: ${ARRAY_EC2_INSTANCES}

ETX
```

```bash:コマンド:
aws elb deregister-instances-from-load-balancer \
        --load-balancer-name ${ELB_LB_NAME} \
        --instances ${ARRAY_EC2_INSTANCES}
```

```text:結果(例):
      {
        "Instances": []
      }
```


3. 事後作業
===========


稼動インスタンスの確認
----------------------

```bash:コマンド:
aws elb describe-load-balancers \
        --load-balancer-names ${ELB_LB_NAME} \
        --query 'LoadBalancerDescriptions[].Instances[].InstanceId'
```

```text:結果(例):
      []
```

```text:結果(例)
      (戻り値なし)
```


完了
====
よく使うショートカットキー

# 個人的によく使うショートカットキーを紹介します。

---------**共通**------------------------------------------------------------

```
ctrl+c ---コピー
ctrl+x ---切り取り
ctrl+v ---貼り付け
ctrl+a ---全選択
ctrl+s ---保存（上書き）
ctrl+y ---操作をやり直す
ctrl+z ---戻る
ctrl+f ---文字検索
```


--------**windows**---------------------------------------------------------

```
win+d ---全てのウィンドウを最小化（もう一度押すと戻る）
win+l ---ログオフ
win+e ---コンピューターを開く
Win+Break ---システムを表示

F2 ---名前変更
ctrl+shift+n ---新しいフォルダ作成
BackSpace ---前のフォルダに移動

Ctrl+Alt+矢印 ---画面回転

Win + ↓ ---ウィンドウを最大化する
Win + ↓ ---ウィンドウを最小化する
```
--------**device**----------------------------------------------------------

```
ctrl+u  ---ソース表示
ctrl+r ---ページ更新
F5 ---ページ更新

ctrl+t ---新しいタブを開く
ctrl+w ---タブを閉じる
Alt+Tab ---タブ移動

ctrl+l ---ロケーションバー（URL打つ所）に移動

Home ---ページの先頭に移動します。
End ---ページの末尾に移動します。
PgUp ---ウィンドウを上にスクロールします。
PgDn ---ウィンドウを下にスクロールします。
↑ ---ウィンドウを上に少しスクロールします。
↓ ---ウィンドウを下に少しスクロールします。
```

--------**sublimeText**-----------------------------------------------------

```
ctrl+Tab ---タブ移動
Ctrl＋H ---置換
Ctrl＋G ---指定した行へ移動

Ctrl＋L ---行の選択
Ctrl＋Shift＋L ---複数行を一行ずつ分割して一度に編集
Ctrl＋Shift＋D ---行のコピー
Ctrl＋Shift＋K ---行の削除

Ctrl＋Enter ---下を改行
Ctrl＋Shift+Enter ---上を改行
Ctrl＋Shift+↑or↓ ---行を丸ごと移動

Home ---カーソルの先頭に移動
End ---カーソルを末尾に移動

Alt+shift+1~4 ---画面分割

Ctrl＋/ ---1行コメント
Ctrl＋Shift＋/ ---ブロックコメント

Ctrl+G ---指定行へ移動

Ctrl＋Shift+P ---コマンドパレットを開く

Ctrl＋Shift＋F ---ファインド機能
Ctrl＋F  ---文字列検索 (Escを押すとテキストに飛ぶ)


～～～Emmet～～～

Ctrl+矢印 ---値の変更
ctrl+E ヒヤドキュメント内などでのショートカット（Tabの役割）
```
--------**photoShop**---------------------------------------------------------

```
F ---画面広く
Tab ---画面広く

Ctrl+Shift+Alt+s ---Web用に保存 

V ---移動ツール
M ---長方形選択ツール
Z ---ズーム
ctrl+1 ---縮小度100％
ctrl+0 ---全体表示
U ---長方形ツール
C ---切り抜き
ctrl+h ---グリッド線非表示
ctrl+d ---選択範囲解除


Ctrl+Alt+Z ---戻す

speas押しながらドラッグ ---移動
ctrl押しながらレイヤークリック ---選択
Alt+ドラッグ ---スライス範囲コピー

Ctrl+Enter ---テキスト入力モードから抜ける
```
delete-word的なコマンドがなかったので作った

Emacsにはデフォルトで`kill-word`（M-dにバインド）や`backward-kill-word`（M-backspaceにバインド）がある。削除系コマンドとして確かに便利なのだが、削除したものをkill-ringにどんどん放りこむのがイヤだと思ったので、純粋に削除のみを実行するコマンドを書いたということ。


```el:
(defun delete-word (arg)
  "Delete characters forward until encountering the end of a word.
With argument ARG, do this that many times."
  (interactive "p")
  (delete-region (point) (progn (forward-word arg) (point))))

(defun backward-delete-word (arg)
  "Delete characters backward until encountering the beginning of a word.
With argument ARG, do this that many times."
  (interactive "p")
  (delete-word (- arg)))
```

適当なキーバインドに設定して中々便利に使っている。例えば私は以下のように設定している。

```el:
(global-set-key (kbd "C-M-<backspace>") 'backward-delete-word)

```

車輪の再発明感は高い。
Apple Watchアプリ開発を始める前にWatch OS2の変更点を知る

#はじめに
Apple Watchで利用できるアプリケーションを開発するには、2015年8月時点だとWatch OS1をベースとして開発する必要があるのでWatch OS1でできること（[こちらを参照](http://qiita.com/kjkoma/private/7dbe6212880a56b827e6)）がベースとなりますが、2015年秋には実装される予定のWatch OS2では設計思想がだいぶ変わってしまうので、そちらを見越した開発が必要になるかと思います。
ここでは、Apple社の公開しているWatch OS2への移行文書（[watchOS 2 Transition Guide](https://developer.apple.com/library/prerelease/watchos/documentation/General/Conceptual/AppleWatch2TransitionGuide/index.html)）を元に何が変わるのかを記載しておきたいと思います。

#Watch OS1の課題
Watch OS1からWatchOS2にアップデートされるまでに約半年という短い期間（正確にいうならば、Apple Watchが世に送り出されてから約半年という期間）で、そもそものコンセプトが変わるような変更が行われるようなので、その理由を勝手ながら挙げてみます。

* Watch OS1では、WatchKit extensionがiOS側（iPhone側）で動作する仕組みである為、Apple Watch側のアプリの起動がとても遅くて、本来の目的である"素早く必要な情報を見る"ということができないという課題があった。
* Watch OS1では、Apple Watch側にユーザーインターフェースの部分（storyboardとリソースファイル）しかインストールされず、全ての動作がiOS側に依存してしまっている為、Apple Watch単体では時計としての役割しか果たせずに機能性に課題があった。

最初に"コンセプトが変わるような"と書きましたが、コンセプトが変わるというよりは、本来のコンセプトがWatch OS1では達成できていなかったというのが正しい表現かもしれないですね。

#Watch OS2でのアーキテクチャの変更
![image](https://qiita-image-store.s3.amazonaws.com/0/77804/cdf34fc6-9f3d-d863-a5d4-701b27eec074.png)
\*「watchOS 2 Transition Guide」より抜粋

上図の通り、一番の変更点はiOS上で動作していたWatchKit extensionがApple Watch側に移動したことです。
動作するOSがiOSよりwatchOS上に移動しても、アプリケーション上におけるWatchKit appとWatchKit extensionの役割の分離については変更はありません。iOS上で動作するように記述されたWatchKit extensionのソースコードはWatch OS2上に移動した後もほとんど手を加えることなく利用することができます。

ただ、上記の変更により設計変更が必要な点もあります。
1. iOS SDKの代わりにwatchOS SDKのフレームワークを利用してextensionを開発する必要があります。その為、watchOS SDKで対応していない機能については、iOS側のアプリケーションに依存した設計にする必要があります。
2. WtachKit extensionはデータをApple Watch上に格納するようになりますので、iOS上のデータを利用するには、iOS上より取得する必要があります。また、iOS上のshared group containerが利用できないので、iOS側のアプリケーション等を通じてファイル交換し、Apple Watch側に転送するなどの考慮が必要になります。

#complications
Watch OS2では、「complications」という機能が提供されるようになります。「complications」はclock face上の小さな領域で、システムが提供する現在日時や月齢、日出時刻などと一緒にアプリケーションの重要な情報を素早く表示することができます。

#Watch OS1 から Watch OS2へのマイグレーションの判断
Apple社の提供している文書ではマイグレーションする際の検討事項として挙げられれていますが、ここに記載されている内容はつまりのところWatch OS2でアプリケーションを開発する際の注意事項にもつながると思います。

1. iCloudへの依存度による配慮
Watch OS2上のWatchKit extensionからはCloudKitのように直接iCloudへアクセスすることができない為、iCloud上のデータへのアクセス（データ取得、Apple Watchへの転送、受信、データ保存など）方法をiOSアプリ側に依存して行うか、もしくはwireless通信などを利用して行う必要があります。

2. 対応するiOS側のアプリケーションデータへの依存度による配慮
iOS上で作成されたファイルはApple Watch側のアプリが起動される前にApple Watch側に転送する必要があり、ファイルが変更されたら、iOS側に戻すことが必要になります。この転送の為の機能をApple Watchは提供していますが、APIがWatch OS2では異なっています。

3. Apple Watchの以前のバージョン（Watch OS1）のサポートへの配慮
Apple WatchではWatch OS1とWatch OS2のアプリケーションを同時に同動作させることができます。ただし、それぞれでコンパイルする必要があるため、それぞれをメンテナンスしていく必要があり複雑性が増すことになる点に注意してください。
Error: Cannot retrieve metalink for repository: epel. Please verify its path and try again というエラーが出てyumコマンドが実行できなくなった状態からの脱出

CentOS6.4(on Verualbox + Vagrant)にPHP5.6を入れたくて、
remiとepel RPMリポジトリを追加したところ、以下のエラーが出てyumコマンドが何もできなくなってしまった。

```
Error: Cannot retrieve metalink for repository: epel. Please verify its path and try again

```

epelの証明書のアップデートが必要だったらしい。
以下を実行して解決

```
sudo yum upgrade ca-certificates --disablerepo=epel
```


参考：
http://serverfault.com/questions/637549/epel-repo-for-centos-6-causing-error
PHPでTwitterOAuth

#### composer.json
```json
"require": {
  "mpyw/twistoauth": "@dev"
}
```

```php
$twitter = new TwistOAuth(
  $consumerKey,
  $consumerSecret,
  $accessToken,
  $accessTokenSecret
);

$result = $twitter->post("statuses/update", ['status' => $comment]);
echo $result->id_str.PHP_EOL;
```
AndroidStudio1.3でproductFlavor (外部参照jarまで差し替えるよ)

producflavorsでググると割と古い情報(0.xx時代とか)ばかりなので、最新版でまとめておきます。

# 1 前提条件

AndroidStudio1.3を使用

# 2 最終目標

ProductFlavorsとBuildTypeを使い、BuildVariantsを使いこなす。
proguardは適用。
外部参照jarもflavor毎に切り替える。

#3 BuildType

デフォルトで用意されているdebugとreleaseを使う。

## (1) release用設定

・releaseはproguard適用のため、ProjectStructure-BuildTypes-releaseで「minifyEnabled」をtrueにする。
・ビルドと同時に署名済みapkを生成したい場合は、ProjectStructure-Signingで必要な指定を行い、その設定名をProjectStructure-BuildTypes-releaseの「Signing Config」に指定しておく。
※パスワードなどがbuild.gradleにべた書きになるので注意。

## (2) debug用設定

debugは別パッケージでインストールしたいので、ProjectStructure-BuildTypes-debugで「Application Id Suffix」に".debug"など任意のsuffixを指定する。
※AndroidAnnotations(3.2.2)を使うと、この指定だけでなぜかgradleがエラーになるので使用を諦めました。回避方法ご存じでしたらどなたか教えて下さい！！

#4 Flavors

## (1) develop用設定

・ProjectStructure-Flavorsで「＋」を押して追加し、Nameに「develop」(任意の名前)をセットする。
 分かり易くするため、versionNameに「n.m.dev」と設定する(n,mは任意の数字)

## (2) staging用設定

・ProjectStructure-Flavorsで「＋」を押して追加し、Nameに「staging」(任意の名前)をセットする。
 分かり易くするため、versionNameに「n.m.staging」と設定する(n,mは任意の数字)

#5 フォルダ構成

## (1) javaソースとリソース関連を配置

app/src下に、以下のようにフォルダを配置する

```
app
+ main
  + java
  + res
  + assets
+ debug
  + java
  + res
  + assets
+ release
  + java
  + res
  + assets
+ develop
  + java
  + res
  + assets
+ staging
  + java
  + res
  + assets
```

resやassets下のファイルは、マージされ、main以外にもあれば上書きされます。
javaソースコードだけは、<b>mainと各Flavorに同じクラスがあってはいけません。</b>
また、<b>BuildType別に置いたクラスは、各Flavorに同じクラスがあってはいけません。</b>
例＞debug/releaseに、ログ出力有/無しのLog.javaを置いた場合、developやstagingにLog.javaがあってはいけません。

## (2) 外部参照jarを配置

app/libs下に、以下のようにフォルダを配置する。
staging時のみ、あるjarファイルを使いたい場合、以下のように置く。

```
app
 + libs
   + staging
     + stagingLib.jar
```

他にも、例えば、debugは検証用ライブラリ、releaseは商用ライブラリ、といった指定のあるSDKなども、この方法で切り替えられます。

# 6 Dependenciesの設定

appのbuild.gradleに以下の設定を記述する。
これは、stagingFlavorのときのみ、libs/staging下のjarファイルを参照する場合の記述。

```build.gradle(app)
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    stagingCompile fileTree(dir: 'libs/staging', include: ['*.jar'])
}
```

# 7 確認

## (1) すべてを一度ビルドする。

```
projectDir $ ./gradlew assemble
```

app/build/outputs/apk下に、以下のようにapkがいろいろ出来ているはず。

```
app-develop-debug.apk
app-develop-release.apk
app-staging-debug.apk
app-staging-release.apk
```

※xxx-unaligned.apkは無視

## (2) libsの確認

proguardがかかると、使っていないコードは当然削除されるので、ライブラリを使用するコードを記述した上で、リリースビルドする。

app/build/outputs/mapping/develop/release/mapping.txt
app/build/outputs/mapping/staging/release/mapping.txt

上記でstagingLib.jarのパッケージ名などを検索してみる。
developでは見つからず、stagingでは見つかるはず。
Cordovaを4.0.0から5.2.0にしてみる

少し古めのアプリでCordova4.0.0で作っていたモノがあったので、5.2.0にしたときのメモ。
あくまでメモということで、間違いとか認識違いあればご指摘頂ければ。

# 4.0.0と5.2.0での違い(躓いたところ)
* cordovaで提供されるプラグイン名が変っている
* ホワイトリストの扱いが変更になっている
* iOSにおいてContent Security Policy(CSP)の記述が必要

# アップデート手順
1. バックアップ
1. そもそものCordovaを5.2.0にする
1. platformをアップデート
1. プラグインを入れ替え
1. ホワイトリスト対策
1. Content Security Policy(CSP)
1. ビルド・確認

WindowsとMacの両方で作業しているプロジェクトの場合、Windows環境でも出来ると思いますが、ファイルパーミッションとかを考慮するとMac環境で作業することをお勧めします。

# アップデート手順詳細

## バックアップ

cordovaプロジェクトそのものをバックアップ。
Gitなどバージョン管理を導入しているのであれば、それでも事足りる。

~~~sh
$ tar czf PROJECT.tgz PROJECT
~~~

## そもそものCordovaを5.2.0にする

~~~sh
$ npm install -g cordova@5.2.0
~~~
グローバルのcordovaを変えたくないときは -g を付けない。
(プロジェクト毎にCordovaを分けるのは別で記事にしたい)

## platformをアップデート

cordovaプロジェクトのディレクトリ(config.xmlがあるディレクトリ)に移動して、

~~~sh
$ cordova platform update android
$ cordova platform update ios
~~~
を実行。
この他のプラットフォームもある場合はすべて行う。

## プラグインの入れ替え

Cordova 5.0から

~~~diff
- org.apache.cordova.PLUGINNAME
+ cordova-plugin-PLUGINNAME
~~~
という命名規則に変ったようで、 *org.apache.cordova.* で始まるプラグインは入れ替えたい。
(例 org.apache.cordova.console は conrdova-plugin-console に変っている)

ということで、

~~~sh
$ cordova plugin list
~~~
でインストールされているプラグインを確認し、 *org.apache.cordova.* で始まるプラグインを削除→インストール。

~~~sh
$ cordova plugin rm org.apache.cordova.PLUGINNAME
$ cordova plugin add cordova-plugin-PLUGINNAME
~~~
上記をプラグイン数分繰り返します。

## ホワイトリスト対策
ホワイトリストについて詳しくは
[Whitelist Guide - Apache Cordova API Documentation](http://cordova.apache.org/docs/en/edge/guide_appdev_whitelist_index.md.html#Whitelist%20Guide)
を参照

cordova-plugin-whitelist を導入

~~~sh
$ cordova plugin add cordova-plugin-whitelist
~~~

config.xml に対して、以下の宣言を追加

~~~xml
  <access origin="*" />
  <allow-intent href="*" />
  <allow-navigation href="*" />
~~~

本当は * とアスタリスクではなく、アプリから本当にアクセスする先を指定するのがベスト。
* アスタリスクはセキュリティ的にも邪道です。


## Content Security Policy(CSP)

[Content Security Policy Reference & Example](http://content-security-policy.com/)
ここを見ながら、各HTMLファイルにmetaタグを記述。
この記述が無いとiOSにおいて外部との通信をしてくれなかった…。

~~~html
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; connect-src *; img-src *; frame-src *; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-eval' 'unsafe-inline' *;">
~~~

上記の場合、

|Directive|Value|Note|
|:--------|:---:|:---|
|default-src|'self'|基本<br><br>自身のホストからのみ|
|connect-src|*|AJAX<br><br>すべてのホストへ接続可能|
|img-src|*|imgタグ<br><br>すべてのホストへ接続可能|
|frame-src|*|frameタグ<br><br>すべてのホストへ接続可能|
|style-src|'self'<br>'unsafe-inline'|スタイルシート<br><br>自身のホストからのみ取得可能<br>インライン展開も可能|
|script-src|'self'<br>'unsafe-eval'<br>'unsafe-inline'<br>*|JavaScriptなどスクリプト<br><br>自身のホスト<br>eval呼び出し<br>インライン展開<br>すべてのホストからの読みこみが可能|

という意味合いになる。
(script-src のところが、雑な気がしているが…こうしないとローカルのJavaScriptと外部ホストのJavaScriptの両方を読み込む事が出来なかった。)

## ビルド・確認

今まで通りのビルドを実行して、何も起きなければそのまま実行できます。
Eclipseでビルドしている場合、プロジェクトの再読込を行わないとファイルが入れ替わったことにEclipseが気付かずエラーになります。
名前がC++/Dの予約語であるC関数を呼び出す


このようなC言語の関数がある。

```catch.c
#include <stdio.h>
void catch(){
	puts("FLAG_CPP-KEYWORD-CALLER");
}
```

(実際には、`gcc -c catch.c`した後のcatch.oだけが手元にあるとする)

これを、C++/Dから呼び出したい。
ところが、catchはC++/Dでは予約語であるため、普通の方法では呼び出すことはできない。

私が考えたのは、関数名を文字列で指定するということだ。そのためには、自分自身をdlopen()すれば良い。

```caller.cpp
#include <dlfcn.h>
#include <stdio.h> //NULL
typedef void (*Tvoid)();
Tvoid pcatch;
int main(){
	void *h=dlopen(NULL,RTLD_NOW);
	pcatch=(Tvoid)dlsym(h,"catch");
	pcatch();
}
```

`g++ caller.cpp catch.o`すれば、所望のプログラムが生成される(ただしstripすると動作しなくなることに注意)。
OSXだとオプションは不要。Linuxだと-ldlが必要なのは勿論だが、-Wl,--export-dynamicも必要なのが少し面倒か。

D言語だと、次のようになる。

```caller.d
import core.sys.posix.dlfcn;

void main(){
	void *h=dlopen(null,RTLD_NOW);
	void function() pcatch=cast(void function())dlsym(h,"catch");
	pcatch();
}
```

Linuxだと`dmd caller.d catch.o -L-ldl -L--export-dynamic`となるようだ(未確認)

---

dlopen()不要なコード判明。
`__asm__("call catch");`を使えば普通に呼び出せるようです。
http://yukicoder.me/submissions/46544
@_alpha_virginis氏に感謝。
Swift 2のfor-inフィルタとパターンマッチ (for-in-whereとfor-case-let-in)

Swift 2.0では、ループ処理のfor-in文にフィルタとパターンマッチを適用できるようになります。[WWDC 2015のビデオ "What's New in Swift"](https://developer.apple.com/videos/wwdc/2015/?id=106) の19:20あたりから説明を見ることができます。

## フィルタ (for-in-where)

### Swift 1.x

```swift
    for value in 0..<10 {
        if value < 2 {
            println(value)
        }
    }
    
    // Prints:
    // "0"
    // "1"
```

### Swift 2.0

```swift
    for value in 0..<10 where value < 2 {
        print(value)
    }
    
    // Prints:
    // "0"
    // "1"
```

## パターンマッチ (for-case-let-in)

### 列挙型

#### Swift 1.x

```swift
    enum Exam {
        case Pass(Int)
        case Fail(Int)
    }

    let exams: [Exam] = [.Fail(40), .Pass(100), .Pass(80)]

    for exam in exams {
        switch exam {
        case .Pass(let score):
            println(score)
        default:
            break
        }
    }

    // Prints:
    // "100"
    // "80"
```

#### Swift 2.0

```swift
    for case .Pass(let score) in exams {
        print(score)
    }

    // Prints:
    // "100"
    // "80"
```

### タプル

#### Swift 1.x

```swift
    let prices = [("Mocha", 430), ("Latte", 370), ("Cappuccino", 370), ("Americano", 340)]

    for (name, price) in prices {
        if price == 370 {
            println(name)
        }
    }

    // Prints:
    // "Latte"
    // "Cappuccino"
```

#### Swift 2.0

```swift
    for case let (name, 370) in prices {
        print(name)
    }

    // Prints:
    // "Latte"
    // "Cappuccino"
```

## フィルタとパターンマッチの組み合わせ (for-case-let-in-where)

### Swift 1.x

```swift
    for (name, price) in prices {
        if price == 370 {
            if name.hasPrefix("L") {
                println(name)
            }
        }
    }

    // Prints: "Latte"
```

### Swift 2.0

```swift
    for case (let name, 370) in prices where name.hasPrefix("L") {
        print(name)
    }

    // Prints: "Latte"
```

## まとめ

for-inでフィルタやパターンマッチを利用することにより、if文の入れ子を減らすことができます。[filter, map, flatMap, reduce](http://qiita.com/koher/items/6a95cb8edb04fb81f787)と比較し、わかりやすく書ける方を採用すればいいでしょう。
Nexus9でRemixOSを動かす

# RemixOSとは

Androidをベースにマルチウィンドウ､マウス､キーボードなどでPCライクな操作性を実現したOS｡[Kickstarter](https://www.kickstarter.com/projects/1123481999/remix-a-laptop-experience-on-a-big-android-tablet)で資金を集めていた｡
詳細は以下｡
[Jide Technology](http://www.jide.com/en/remixos)
[［CES ASIA］PCに似た使い勝手、Androidをカスタマイズした「Remix OS」が展示](http://itpro.nikkeibp.co.jp/atcl/news/15/052801794/)

# image公開場所

Nexus9版は8/3に以下スレッドで公開｡
[[ROM][5.0.2]Remix OS for Nexus 9 [official]](http://forum.xda-developers.com/nexus-9/development/rom-remix-os-nexus-10-t3171155)
ただし､上記スレッドは8/16までは存在していたが､現在は`404 Page Not Found`となる｡

公式Forumの[Nexus 9 ROM now available!!!](https://forum.jide.com/index.php?p=/discussion/770/nexus-9-rom-now-available)でもImageが公開されている｡

なお､公式Forumでダウンロード可能なバージョンは7/30版だが､XDAのコメント上では
7/31版も公開されていた｡
→なお､7/30版を起動させればSettingsのSystem Updaterにより､最新版にアップデート可能｡

# インストール方法
## OEM Unlock方法
巷のリソース参照

## Flash Image

[公式Forum Nexus 9 ROM now available!!!](https://forum.jide.com/index.php?p=/discussion/770/nexus-9-rom-now-available)からダウンロードできるzipには
![remixos.png](https://qiita-image-store.s3.amazonaws.com/0/78540/dcb5fe9c-a995-5c3f-0f80-5ca8ecc21967.png)
が含まれている｡
投稿には以下の手順となっているが､
![instruction.png](https://qiita-image-store.s3.amazonaws.com/0/78540/8f5a1a86-008b-8843-fee7-dcfdf00247c4.png)
この通りにflashしても､一瞬RemixOSのロゴが表示されるだけで､すぐGoogleロゴが表示され､その後いくら待っても起動しない｡

そのため､[Nexus9 Factory Image](https://developers.google.com/android/nexus/images#volantis)の5.0.2(LRX22L)のimageをダウンロードして､含まれていない`bootloader-flounder-3.43.0.0114.img`と`vendor.img`もflashすることで､RemixOSが起動した｡

なお､[Installing RemixOS to the HTC Nexus 9](http://kmyers.me/blog/android/installing-remixos-to-the-htc-nexus-9/)に､全部含まれたzipが配布されているので､自己責任でどうぞ｡(一応ハッシュは同じっぽい｡)

有料アプリをインストール出来ないという話もあるが､Web版のPlayストアからは以下のように問題なくインストールできた｡
![play.png](https://qiita-image-store.s3.amazonaws.com/0/78540/3bdd2bc8-78ff-d360-ad36-116f914379f0.png)

# バージョンアップ手順
自動でもidle時にアップデートされるようだが､強制的に最新版をダウンロード&インストールすることも可能｡SettingsのSystem updaterから最新版をダウンロード&インストール可能｡
(もしかしたらSystem updaterは最初は表示されていないかもしれない｡その場合は通常のAndroidと同様にSettingsのInformationからビルド番号連打で､開発者オプションやSystem Updaterを表示できる｡)

# その他
現在Heliumでバックアップからリストア中だが､かなり軽快な使い勝手で､しばらくは遊べそうだ｡

# 注意
当然だが､上記手順はすべて自己責任でどうぞ｡
git commit --amendでaddし忘れたファイルを救済する

一旦コミットしてからちょっとした修正を入れた場合に、この修正も元のコミットに含めてしまいたいことがある。
そんな時には、`git commit --amend`すれば一つ目のコミットに後からの修正もまとめることができる。

```bash
# aというファイルを追加し、一旦コミットする
$ git commit -m "add a file"

# その後、aに修正を入れる
$ git status
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   a # <- aが修正されている

$ git add . # 変更をインデックスに登録
$ git commit --amend --no-edit # 登録されたインデックスを直前のコミットにまとめる 
$ git status
On branch master
nothing to commit, working directory clean
```

`git commit --amend --no-edit`とすることで、エディタを開かずに修正することができる。
tmuxinator使ってみた

## 参考

* [tmuxのwindow, pane設定を一発で再現できるtmuxinatorが便利](http://tactosh.com/2014/01/tmux-window-pane-tmuxinator/)

## 準備

* CentOS5に入れる場合、[このrpm](http://pkgs.repoforge.org/tmux/)を使うのもよいかも。

```bash:
sudo apt-get install -y tmux
sudo gem install tmuxinator
```

```bash:~/.bashrc
export EDITOR="vim -p"
```

## 設定サンプル

```yaml:
name: prj1
root: ~/foo

windows:~/.tmuxinator/prj1.yml
  - window1:
      layout: even-horizontal
      panes:
        - pane1:
          - echo "it's pane1" > pane1
          - vim pane1
        - pane2:
          - cd ~
          - echo "it's pane2" > pane2
          - vim pane2

  - server: bundle exec rails s
  - logs: tail -f log/development.log
  - app:
      layout: tiled
      panes:
        - pane1:
          - vmstat 3
        - pane2:
          - top
```

## 起動

```bash:
mux new prj1
```

```bash:プロジェクト起動
mux prj1
```

* バインドキーは`ctrl-b`
* tabs: は window: に変わりました。

## ペイン分割サイズを均等にする

* [tmuxのペイン分割サイズを均等にする - Qiita](http://qiita.com/blp1526/items/390020ca9e1e56be3028)
  * layout even-horizontal
  * layout even-vertical


## その他

* [Ruby - tmuxinatorで一瞬で開発環境を起動する - Qiita](http://qiita.com/naoty_k/items/869b00fdde27c2225989)
  * ~/.tmuxinator/default.yml で共通設定

```bash:セッションの終了
control-b :kill-session
```
git commit --amendでコミットメッセージを修正

git commit -m "hogehoge"とした後に、さっきのコミットログを修正したい！と思った時にはgit commit --amendを使う。

```bash
$ git commit -m "hogehoge"
$ git log

# commit 01afc1b0c5d25302625ca64dc0f6682ad21526f5
# Author: author <author@mail.com>
# Date:   Mon Aug 17 16:21:26 2015 +0900
#
#    hogehoge

$ git commit --amend

# エディタが開くので、そこで「hogehoge」を「fugafuga」に修正して保存

$ git log

# commit 01afc1b0c5d25302625ca64dc0f6682ad21526f5
# Author: author <author@mail.com>
# Date:   Mon Aug 17 16:21:26 2015 +0900
#
#    fugafuga
```

また、これと同様にコミットメッセージを修正したい場合、`git commit --amend -m "fugafuga"`としても修正することができます。（コミットメッセージの修正だけが目的ならこっちのほうがいいかも？）
はじめてのApple Watchの前にコンセプトを知る


#まとめ
最初にまとめを書いてしまいますが、これからApple Watch（Watch OS1）で何か開発しようとする方（自分も含めて）はApple Watchのコンセプトを知っておいた方が何ができるかを理解する上で役にたつのではないかと思います。つまり、Apple社がiPhoneと対で動作し、相互補完するツールとしてApple Watchを提供しているということです。

なんとなく、Apple Watchが何もできないと考えてしまいがちですが、そもそものコンセプトがiPhoneとセットなのであたりまえといえばあたりまえ。それを基にApple Watchというデバイスを生かせればより便利なことができるようなアプリケーションが作れるかもしれません。

Watch OS2になるとコンセプトも変わってしまい、Apple Watch単体でできることが増えるようなので、あくまでここに記載したことはWatch OS1であることをご了承ください。

****

# Apple Watch開発　概要

この文書は[Develping for Apple Watchのドキュメント](https://developer.apple.com/library/ios/documentation/General/Conceptual/WatchKitProgrammingGuide/index.html)を基にApple Watchで開発できること（Watch OS1）を手っ取り早く斜め読みするために記載したものです。

# Apple Watchのコンセプト
Apple Watchのコンセプトは、iPhoneをポケットから出すまでもなく、重要な情報の通知を簡素な方法で素早く得ることができるということ。つまり、Apple Watchの開発者は、最も簡単な方法で、最もその人が必要とする情報をいかに提供するかを考えることが開発の始まりになるのではないでしょうか。

# Apple WatchとiPhone
Apple Watch上で動作するApple標準以外のアプリケーション（サードパーティアプリケーション）は、 **すべてiPhoneアプリとして作成**される必要があります（ *注：2015年秋頃に展開されるWatch OS2ではどうもApple Watch単体で動作するアプリが開発できるようになるみたいです*）。

#### Apple Watchの開発に必要な要素
1. WatchKit app
     Apple Watch上で実行され、アプリケーションのユーザーインターフェースに関連付けられたストーリーボード（storyboards）とリソースファイルのみが含まれます

2. WatchKit Extension
     iPhone上で実行され、WatchKit appのユーザーインターフェースの管理コードやユーザーとの対話に対するレスポンスを処理するコードが含まれます。

Apple Watchのアプリケーションを開発する場合、iPhoneアプリとしてWatchKit app、WatchKit extensionを含む形で開発することで、開発したiOSアプリケーションをiPhone上にインストールする際にインストールするiPhoneと関連付けられたApple WatchにWatchKit appをインストールするかどうかのプロンプトが表示されるようになります。

Apple Watchのアプリ（WatchKit app）は以下のインターフェースで動作することを考えて開発します。

* Apple Watchのフルアプリケーションとしてホーム画面から表示して動作する複数画面で構成されて動作するインターフェース

* Apple Watchのグランス（Glance）に表示される読み取り専用の１画面で構成されて動作するインターフェース（標準の通知インターフェースではない、カスタムした通知用インターフェースとして利用できるインターフェースとして捉えればよいでしょう）

# WatchKit Appとは
WatchKit appとはユーザーがApple Watch上で開いて表示させ、必要な情報を見たり対話するためのインターフェースを持つアプリケーションのことです。データよっては、iOSアプリのサブセットのデータとして表示されるものになるかもしれません。

WatchKit appは前に書いたようにiOS側で動作するWatchKit extensionと対になるアプリケーションなので、基本的にはiPhone、および、iPhone上で動作するWatchKit extensionアプリケーションが必要になります。

# Glanceインターフェース
Apple Watchには「Glance」（グランス）と呼ばれる表示領域があります。ここは、アプリケーションで最も重要な情報を表示する１画面構成の読み取り専用の画面です。ここにはボタンなどのコントロールは配置できません。また、スクロールもできませんが、この画面をタップするとWatchKit app本体が起動するようになっています。なお、このインターフェースは必ずしもWatchKit appに含める必要はありません。

# ローカル／リモート通知
Apple Watchは対となるiPhoneのローカル／リモート通知を表示します。Apple Watch自身は通知を受信しません。Apple WatchにはiPhone上の通知を最小限の形で表示して、必要であれば詳細画面へ移動する方法を提供します。詳細画面はカスタムインターフェースとしてアプリケーションの開発者が用意します。iOS8で導入された「Actionable notifications」を利用することで通知画面にボタンを配置してユーザーのアクションを求めることもできます。
iOSアプリ側で「actionable notifications」のサポートを設定している場合、Apple Watch側ではこの設定を自動的に反映して通知インターフェースにボタンを配置します。アプリ開発者はWatchKit extension側でこのボタンのアクションの処理を用意することになります。

# Apple Watchのインターフェースのデザイン
Apple WatchのインターフェースはiOSアプリの代替として利用することを想定してデザインするべきではありません。iOSアプリと相互に補完しあうインターフェースとして情報を素早く表示し、次のアクションに導くインターフェースにするべきでしょう。
JavaでSetに含まれる要素を順番に取り出す方法

JavaのSetについてはその仕様上、1つずつ順番に取り出す、という操作の仕方は想定されていません。
なので、Listのgetメソッドのように中に含まれる要素を一個だけ取り出すみたいな使い方は基本的にはできません。

もし、どうしてもSetに含まれる要素を1つずつ取り出して使いたいという時には、**iterator**を~~使いましょう~~使って取り出すことができます。

```java
import java.util.*;

public SetIterator {
    public void main(String args) {
		Set<String> set = new HashSet<>();
		set.add("1");
		set.add("2");
		set.add("3");

		Iterator iterator = set.iterator(); // <- SetのIteratorを作る
		System.out.println(iterator.next());
		System.out.println(iterator.next());
		System.out.println(iterator.next());
	}
}
```

こうして、Iteratorを仲介することで要素を1つずつ取り出して処理することができます。

ただし、HashSetを使用すると中に含まれる要素の型に応じて勝手にソートされてしまいます。Setに含まれた順番のとおりに取り出したいときにはLinkedHashSetを使用しましょう。

2015/08/17 追記
もちろん、for-eachを使ってSetの各要素を取り出すことも可能です。ご指摘ありがとうございました。
EC2に開発用のSSL証明書を入れてみた

##背景
Mac 10.10.4, AWS (EC2 Amazon Linux), Ruby on Rails, passenager

##証明書生成
SSL証明書の生成は[wikipediaのページ](http://www.maruko2.com/mw/Apache/SSL%E8%87%AA%E5%B7%B1%E8%A8%BC%E6%98%8E%E6%9B%B8%E3%81%AE%E4%BD%9C%E6%88%90%E3%81%A8mod_ssl%E3%81%AE%E8%A8%AD%E5%AE%9A#.E8.A8.BC.E6.98.8E.E6.9B.B8.EF.BC.88.E5.85.AC.E9.96.8B.E9.8D.B5.EF.BC.89.E3.81.AE.E4.BD.9C.E6.88.90_.28server.crt.29)を従えばいいでしょう。

ただし、最初からパスフレーズレスのキーを使って下さい。

```
openssl rsa -in server.key.back -out server.key
```

終わったら、以下の３つのファイルがあるはず

```
server.key, server.csr, server.crt
```

##EC2での設定

* mod_sslをインストールしましょう

```
yum -y install mod_ssl
```

* SSL設定

```
# vim /etc/httpd/conf.d/ssl.conf

SSLCertificateFile /etc/httpd/conf/ssl.crt/server.crt

SSLCertificateKeyFile /etc/httpd/conf/ssl.key/server.key
```

* 証明ファイルを置いときましょう。

```
mkdir /etc/httpd/conf/ssl.key -m 700
mkdir /etc/httpd/conf/ssl.crt
mv server.key /etc/httpd/conf/ssl.key/
mv server.crt /etc/httpd/conf/ssl.crt/
chmod 400 /etc/httpd/conf/ssl.key 
```

* 次はApacheファイルの設定

下の内容を/etc/httpd/conf/httpd.confに追加して下さい。

```
NameVirtualHost *:443
<VirtualHost *:443>
    ServerName example.com
    RailsEnv development
    DocumentRoot /home/ec2-user/project/public
    <Directory /home/ec2-user/project/public>
        AllowOverride all
        Options -MultiViews
    </Directory>
    SSLEngine on
    SSLCertificateFile /etc/httpd/conf/ssl.crt/server.crt
    SSLCertificateKeyFile /etc/httpd/conf/ssl.key/server.key
</VirtualHost>
```

##ハマッたこと

* Railsの環境を設定しない場合

```
Error: no selected database
```

**RailsEnv development**がないとおそらくproduction環境と認識されちゃうので、databaseが見つからないエラーが出た。

* NameVirtualHostを忘れた

**NameVirtualHost *:443**がなければ

```
[warn] _default_ VirtualHost overlap on port 443, the first has precedence
```

default 80にオーバーラップしてしまった。
[nginx] Amazon Linuxにnginxをインストールする (yumパッケージ)

# インストール

```bash:コマンド(例/AmazonLinux):
sudo yum install nginx -y
```

```text:結果(例):
完了しました!
```

# 起動

```bash:コマンド(例/AmazonLinux):
sudo service nginx start
```

```text:結果(例):
Starting nginx:                                            [  OK  ]
```

# 起動設定変更

```bash:コマンド(例/AmazonLinux):
sudo chkconfig nginx on
chkconfig --list nginx
```

```text:結果(例):
nginx          	0:off	1:off	2:on	3:on	4:on	5:on	6:off
```

# アクセス確認

インスタンスのパブリックIPアドレスにブラウザでアクセスしてコンテンツを確認してみましょう。

![スクリーンショット 2015-10-08 17.09.11.png](https://qiita-image-store.s3.amazonaws.com/0/48158/43651c1f-8864-3d14-fc7d-cfbd48c9edd7.png)


# ログ確認

```bash:コマンド(例/AmazonLinux):
sudo tail /var/log/nginx/access.log
```

```text:結果:
118.xxx.xxx.xxx - - [17/Aug/2015:05:41:33 +0000] "GET / HTTP/1.1" 200 3770 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/600.8.9 (KHTML, like Gecko) Version/7.1.8 Safari/537.85.17" "-"
118.xxx.xxx.xxx - - [17/Aug/2015:05:41:33 +0000] "GET /nginx-logo.png HTTP/1.1" 200 370 "http://54.xxx.xxx.xxx/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/600.8.9 (KHTML, like Gecko) Version/7.1.8 Safari/537.85.17" "-"
118.xxx.xxx.xxx - - [17/Aug/2015:05:41:33 +0000] "GET /poweredby.png HTTP/1.1" 200 3412 "http://54.xxx.xxx.xxx/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/600.8.9 (KHTML, like Gecko) Version/7.1.8 Safari/537.85.17" "-"
118.xxx.xxx.xxx - - [17/Aug/2015:05:41:34 +0000] "GET /favicon.ico HTTP/1.1" 404 3696 "http://54.xxx.xxx.xxx/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/600.8.9 (KHTML, like Gecko) Version/7.1.8 Safari/537.85.17" "-"
```

完了
======
Swift,SpriteKitでプログレスバーを表示する



## 内容

##### SKScene上でプログレスバーを表示する方法について
######(※SpriteKitのSKSceneでは、UIViewControllerを多重継承できず、UIProgressViewが使えません。UIProgressViewを使わない方法を紹介します）


## 完成イメージ
![pngne.gif](https://qiita-image-store.s3.amazonaws.com/0/30253/9d6da3ac-dce8-4a7f-8368-4f2664dbd211.gif)

## 実装

**(1) 画像をプロジェクトにimport**
 (画像サイズは任意。今回では300×20を使用)

![progressbar.png](https://qiita-image-store.s3.amazonaws.com/0/30253/927dade6-9057-424a-3cf9-b0dc8df8134b.png)

**(2) プログレスバー専用のクラスを作成**

```Swift:Swift2.0
import SpriteKit

class ProgressBar: SKCropNode {
    
    override init() {
        super.init()
        
        let sprite = SKSpriteNode(imageNamed: "progressbar")
        sprite.anchorPoint = CGPoint(x: 0, y: 0)
        let maskSprite = SKSpriteNode(color: SKColor.blackColor(), size: sprite.size)
        maskSprite.anchorPoint = CGPoint(x: 0, y: 0)
        self.maskNode = maskSprite
        
        addChild(sprite)
    }
    
    required init(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    // 初期値設定メソッド (0.0 〜 1.0)
    func setProgress(progress: CGFloat) {
        self.maskNode?.xScale = progress
    }
    
    // プログレスバーの数値を増やすメソッド
    func updateProgress(progress:CGFloat){
        self.maskNode?.xScale += progress
    }
}
```


**(3) SKSceneにプログレスバー追加**

```Swift:Swift2.0
import SpriteKit

// プログレスバー
let progressBar = ProgressBar()

class GameScene: SKScene{
    
    override func didMoveToView(view: SKView) {

        // プログレスバーを追加
        self.addChild(progressBar)
        progressBar.setProgress(0.0) // 初期値
        progressBar.position = CGPoint(x: 30, y: self.frame.height-40)
        progressBar.zPosition = 1 // 背景バーよりレイヤーを前に

        // プログレスバー(背景)を追加
        let backgroundBar = SKSpriteNode(color: UIColor.grayColor(), size: CGSizeMake(150, 10))
        backgroundBar.anchorPoint = CGPoint(x: 0, y: 0)
        backgroundBar.position = CGPoint(x: 30, y: self.frame.height-40)
        
        self.addChild(backgroundBar)
    }
}
```

**(4) プログレスバーの数値を増やす**

体力の増減や経験値が増加したタイミングなどで使います。

```Swift:Swift2.0
// 任意の場所で下記実行(引数に指定された数値分、加算される）
progressBar.updateProgress(0.1)
```

**(5) SKSceneを表示するViewを作成**

```Swift:Swift2.0
import UIKit
import SpriteKit

class GameViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let scene = GameScene()
        let skView = self.view as! SKView
        scene.scaleMode = .AspectFill
        scene.size = skView.frame.size

        skView.presentScene(scene)
    }
}
```

作ったばかりで全然リファクタリングできてませんが、ひとまず上記でSKSceneにプログレスバーを表示することができます。
Rubyでlower_bound


C++のSTLにある、その値以上の要素のインデックスを見つける関数

```ruby:lower_bound.rb
def lower_bound(array, value)
  left = -1;
  right = array.length;
  while left + 1 < right
    mid = left + (right - left) / 2;
    if array[mid] >= value
      right = mid
    else
      left = mid
    end
  end
  right
end
```

### 参考
- Rubyで2分探索 http://qiita.com/saytx@github/items/74eb27bb98641ba05b2f
- 二分探索 http://topcoder.g.hatena.ne.jp/cafelier/20120703/1341324546
フォーム画面から移動する際のナビゲーションの確認ダイアログを表示する

フォームに何か入力された状態でページを移動しようとしたとき確認してくるダイアログを表示する。

```js:sample
$(document).ready(function () {
  /*
   * フォーム中のINPUT要素等に入力された
   * 文字列長から変更の有無を判定する
   */
  isChanged = function () {
    textLength = 0;
    $('input[type="text"]').each(function () {
      textLength += $(this).val().length;
    });
    $('input[type="email"]').each(function () {
      textLength += $(this).val().length;
    });
    $('input[type="number"]').each(function () {
      textLength += $(this).val().length;
    });
    $('input[type="tel"]').each(function () {
      textLength += $(this).val().length;
    });
    $('input[type="checkbox"]:checked').each(function () {
      textLength += $(this).val().length;
    });
    $('textarea').each(function () {
      textLength += $(this).val().length;
    });

    return (textLength > 0);
  };

  /*
   * 他の画面へ移動する直前に入力状況を確認し、
   * 入力がある場合警告を表示する
   */
  $(window).on('beforeunload', function () {
    if (isChanged()) {
      return 'このページを離れようとしています。';
    }
  });

  /*
   * フォームが送信されるときは、beforeUnloadイベントを消しておかないと
   * 「このページを離れようとしています」が表示されてウザい
   */
  $('form').on('submit', function () {
    $(window).off('beforeunload');
  });
});
```

フォームのデフォルト値などが設定されてるとこの仕組みでは上手く判定してくれないので、デフォルト値を含んでいるときはそれとの比較をしたり色々やらないといけない。
Javascriptのリッチテキストエディタライブラリ

### HTMLのリッチエディタ
- http://www.tinymce.com/index.php
- http://www.alohaeditor.org/demo/aloha-ui/

### Markdownのリッチエディタ
- http://hallojs.org/demo/markdown/
- http://markitup.jaysalvat.com/examples/markdown/
Macにdocker 1.8をインストールしてdocker run hello-worldまで

Docker 1.8がリリースされたので、我が家のMacにDockerを入れました。これはそのメモです。
私はDockerは全くの初めて触る、本当の初心者です。

## 環境

私のMacはMacBook Pro(Retina 13インチ　Early 2015)です。メモリは16Gです。OSはもちろん、Yomisete(10.10.4)です。
このマシンにインストールしました。以前のバージョンのdockerはインストールしていない、クリーンな状態です。

## インストール

まずは、[Docker Tools](https://www.docker.com/toolbox)をダウンロードしてインストールします。Dockerは1.8からDocker Toolsを入れれば必要なものは全部インストールされるらしく、便利です。次のようなものがインストールされます。

- Docker Client
- Docker Machine
- Kitematic(Beta)
- Virtual Machine(5.0.2)

インストーラにそってインストールすれば、必要なものは全部インストールされます。


## docker run hello-worldまでの長い道のり

### 仮想マシンが起動しない

インストールが終わったら、LaunchpadにDocker Quickstart Terminaruがあるので、それをクリックします。これは、中で

```bash
source "/Applications/Docker Quickstart Terminal.app/Contents/Resources/Scripts/start.sh"
```

してるだけのようです。普通のターミナルからも、上のコマンドを叩けば同じ状態になります。
それで、

```bash
docker-machine start default
```

すると、すぐに終了してしまいます。VirtualBoxを開いて直接起動しようとするとVERR_VMM_SMAP_BUT_AC_CLEARとエラー表示されています。[VirtualBoxのフォーラム](https://forums.virtualbox.org/viewtopic.php?f=8&t=69591&sid=2ae02999bc24012ecbdf1379a2d18ce3)にMacの特定のモデルで発生するらしいことがかています。[ここからテストビルド](https://www.virtualbox.org/wiki/Testbuilds)という恐ろしげなものを使うとこの問題を回避できるとあります。仕方なくインストールして、docker-machine start defaultすると、今度は起動出来ました


### docker run hello-worldはまだまだ


それでは、ようやくdocker run hello-worldを実行します。すると、「
  
     Post http:///var/run/docker.sock/v1.20/containers/create: dial unix /var/run/docker.sock: no such file or directory.
     * Are you trying to connect to a TLS-enabled daemon without TLS? 
     * Is your docker daemon up and running?
 
とか言うメッセージともう少し何かがでます。googleさんに聞くとsudoつけろ、って出ますが、それをつけても無意味です。

とりあえず、Kitematicを立ち上げると、ca.pemがないとエラー画面がでています。メニューからAbout Kitematicをクリックすると、hub.docker.comにsign inかsign upする画面が出てくるので、sign upします。そのあとメールによるアカウントのverificationして、Kitematicを再起動するとKitemticからイメージをダウンロードして起動できるようになりました。

これで、きっとTLSの問題もこっそり解決していることを期待して、もう一度ターミナルからdocker run hello-worldします。うまく動きます。

**※ start.shを読み込まないとエラーは出続けます**

あと、Ketematicのメニュー「File」-「Open Docker Terminal Command」から開くターミナルか、LaunchpadからのQuickInstall Terminalで実行すると、うまく動きます。

それ以外にもいくつかのイメージをダウンロードしつつ、dockerが動くことを確認できます
エクセルやパワーポイントのドキュメントを捨てて、超美麗なドキュメント作成をasciidoctorで実現しよう！

# エクセルやパワーポイントのドキュメントを捨てて、超美麗なドキュメント作成をasciidoctorで実現しよう！

開発には付き物のドキュメント作成、現場ではワードやエクセル、パワーポイントを使うことが普通ですよね？
そんなドキュメント作成に革命を起こしそうなのがasciidoctorです。
Office製文書の悪い問題を簡単に解決してくれます。

# Officeで技術文書を作成する時の問題点

1. 成果物がバイナリなので Git などのバージョン管理ツールと相性が悪い
1. 内容以外の修飾に掛かる時間が膨大すぎる、ワード以外では目次の作成、章番号の連番付け、印刷結果との違いの確認など 文章の内容を記述する時間より、体裁を整えるのに時間が掛かる
1. Windows以外ではなかなか編集できない
1. コードのハイライトなどできない
1. コピーペーストがままならず同じパワポ同士でもテンプレート元が違うと体裁が崩れてしまう
などなど、問題山盛り手間がかかりすぎです。
## もっと手軽にバージョン管理ができて、 体裁も綺麗な ドキュメントを 簡単に 作りたい！！

## asciidoctorがめちゃめちゃお勧めです！

asciidoctorは、AsciiDocというMarkdownとかと同じようにテキストフォーマットで書いてHTMLやPDFに変換できるRuby製のツール群です。

### メリット

1. 変換元がテキストファイルであるため、バージョン管理ツール GIT との相性がよい
1. include機構があるため、共通化しやすくメンテナンス性が良い
1. 目次な章番号など自動で割り振りするためメンテナンス性が良い
1. ソースコードをハイライトする機能や行番号の付与など自動で行ってくれる
1. 図やテーブルもテキストで記述可能である
1. マークアップで出力されるフォーマットが決まるため、書式の統一化を行いやすい
### デメリット

1. 変換処理が必要であるため、変換機構を自動化する仕組みがないと不便
1. 図が直感的にイメージしづらい場合がある
1. フォーマットがある程度固定であり、自在に編集可能というわけではない

### 導入は超簡単！
[続きはasciidocでGistに記述しています。](https://gist.github.com/panghea/6b14b544b8c3f378eacc)

<script src="https://gist.github.com/panghea/6b14b544b8c3f378eacc.js"></script>


[Github:asciidoctor-pdf-live-reload-seed](https://github.com/panghea/asciidoctor-pdf-live-reload-seed)

[参考：自分のブログの記事です。](http://price-checker.jp/asciidoctor-pdf/)
[Swift] Custom Cell を使って TableView をいい感じに実装する - 最初の一歩

# はじめに

TableViewをいい感じに作りたいので、いい感じにカスタムしたいと思い、Custom Cellを扱ってみることにしました。

Swift幼稚園児の備忘録です。

# 手順

## 1. StoryboardでTableViewを設置

## 2. Prototype CellsにTitleとSubTitleのlabelを設置

ここで好きなようにレイアウトする

![Screen Shot 2015-08-17 at 13.52.33.png](https://qiita-image-store.s3.amazonaws.com/0/18705/747bcfe1-3ae4-acfe-fa2f-70d48944126b.png)

## 3. Tableに表示するDataModelを作成

ここでデータを管理します。
DBから読んでもいいし、直書きでもいいし、ここにまとめるとスッキリしていいかもしれないです。

```swift:FooTableDataModel.swift
import Foundation

class FooTableData {
    class FooTableDataModel : NSObject {
        var title: String
        var subTitle: String
    
        init(title: String, subTitle: String){
            self.title = title
            self.subTitle = subTitle
        }
    }
    let items = [
        FooTableDataModel(title: "title 1", subTitle: "subTitle 1"),
        FooTableDataModel(title: "title 2", subTitle: "subTitle 2"),
        FooTableDataModel(title: "title 3", subTitle: "subTitle 3"),
        FooTableDataModel(title: "title 4", subTitle: "subTitle 4")
    ]    
}
```

## 4. Custom Cellの作成

UITableViewCellのサブクラスを作成。

```swift:FooTableViewCell.swift
import UIKit

class FooTableViewCell: UITableViewCell {

    // これは後からStoryboardでOutlet接続するので、実際にはこのタイミングでこれらのコードは記載しません。
    @IBOutlet weak var title: UILabel!
    @IBOutlet weak var subTitle: UILabel!
    // ここまで

    override func awakeFromNib() {
        super.awakeFromNib()
    }

    override func setSelected(selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)
    }

}
```

## 5. TableViewControllerの作成

UITableViewControllerのサブクラス。

```swift
import UIKit

class FooTableViewController: UITableViewController {

    let ftd = FooTableData()

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func numberOfSectionsInTableView(tableView: UITableView) -> {
        return 1
    }

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) ->; Int {
        return ftd.items.count
    }

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) ->; UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as FooTableViewCell // ここを忘れないように
        let item = ftd.places[indexPath.row]
        let title.text = item.title
        let subTitle.text = item.subTitle
        return cell
    }
}
```

## 6. cellのcustom classとidentifierを設定

### custom class
1. Storyboardで対象のTableViewの中のセルを選択。
2. custom class欄から、classをFooTableViewCellを選択

### identifier
1. Table View Cell欄から、identifierをcellに設定。

## 7. titleとsubTitleのラベルからFooTableViewCellにOutlet接続して、IBOutletを作成。

## 8. ViewControllerのクラスを設定
1. Storyboardで対象のTableViewのViewControllerを選択
2. CustomClass欄から、classをFooTableViewControllerに設定。


# References
- [UITableView and UITableViewCell Customization in Swift
7 months agoby Shrikar](http://shrikar.com/uitableview-and-uitableviewcell-customization-in-swift/)
一つのドメインの下にPassengerでRailsアプリをたくさんぶら下げる方法

ググると古い情報がたくさんでてきて、シンボリックリンクを貼るとか貼らないとか、貼らないと動かないという内容もあったりでよくわからなくなってしまったので、ちゃんとドキュメントを読んで理解の範疇でまとめました。

Passenger 5.0.13 + Rails 4.2.3 を使いました。

# 例1. サブディレクトリだけRailsアプリ

次のは / にアクセスしたときは、静的なHTML /var/www/default/index.html を見て /app1 の場合は /var/www/app1 に capistrano でデプロイした Rails アプリを見る場合の設定です。

| URL| 実際のパス|
|:-------|:----------------------------|
| /      | /var/www/default/index.html |
| /app1  | /var/www/app1/current       |

```httpd.conf
<VirtualHost *:80>
  ServerName xxx.sakura.ne.jp

  DocumentRoot /var/www/default
  <Directory /var/www/default>
    Allow from all
    Options -MultiViews
  </Directory>

  <Directory /var/www/*/current/public>
    Allow from all
    Options -MultiViews
  </Directory>

  # app2を作る場合は次の5行をコピペで増やしてapp2にする
  Alias /app1 /var/www/app1/current/public
  <Location /app1>
    PassengerBaseURI /app1
    PassengerAppRoot /var/www/app1/current
  </Location>
</VirtualHost>
```

# 例2. 全部Railsアプリ

次のは / もRailsアプリ app0 になっている例です。

| URL | 実際のパス |
|:-------|:----------------------------|
| /      | /var/www/app0/current       |
| /app1  | /var/www/app1/current       |

```httpd.conf
<VirtualHost *:80>
  ServerName xxx.sakura.ne.jp

  <Directory /var/www/*/current/public>
    Allow from all
    Options -MultiViews
  </Directory>

  DocumentRoot /var/www/app0/current/public

  # app2を作る場合は次の5行をコピペで増やしてapp2にする
  Alias /app1 /var/www/app1/current/public
  <Location /app1>
    PassengerBaseURI /app1
    PassengerAppRoot /var/www/app1/current
  </Location>
</VirtualHost>
```

Railsアプリのデプロイ先は /var/www/* 以下にまとめることで、Directory設定を共通化しています。

またRailsは、Passengerが設定してくれる環境変数 **RAILS_RELATIVE_URL_ROOT** を考慮して、自動的にパスにプレフィクスを付与してくれるので、昔はやけに難しかった記憶があるのですが、今では特別に何かする必要はなくなりました。

# 例3. 全部Railsアプリのはずだったが一部だけ静的HTMLの場合

例2と同じ構成だけど app3 だけは静的HTMLの場合。

| URL | 実際のパス |
|:-------|:----------------------------|
| /      | /var/www/app0/current       |
| /app1  | /var/www/app1/current       |
| /app3  | /var/www/app3/current/index.html       |

```httpd.conf
<VirtualHost *:80>
  ServerName xxx.sakura.ne.jp

  <Directory /var/www/*/current/public>
    Allow from all
    Options -MultiViews
  </Directory>

  DocumentRoot /var/www/app0/current/public

  # app2を作る場合は次の5行をコピペで増やしてapp2にする
  Alias /app1 /var/www/app1/current/public
  <Location /app1>
    PassengerBaseURI /app1
    PassengerAppRoot /var/www/app1/current
  </Location>

  # Railsアプリではないとき。例2の設定にこの5行だけ追加
  Alias /app3 /var/www/app3/current
  <Location /app3>
    PassengerEnabled off
    Options All
  </Location>
</VirtualHost>
```

Passenger を無効にする **PassengerEnabled off** がポイントです。無効にしなくても /app3/index.html のように直リンクであれば一応見れますが、/app3 にアクセスするとPassengerがRailsアプリと勘違いしてエラーになります。ファイル一覧機能(Options Indexes)などを正しく動作させるためにも無効にしておく方がよいです。
vagrantでrails-dev-box使う + 準仮想化にKVMを選択

* Vagrantを久々に使ってみた。
* [railsbox - Fast and easy Ruby on Rails virtual boxes](https://railsbox.io/)もあるみたい。

## 参考

* [[Mac] rails-dev-boxで環境構築 - Qiita](http://qiita.com/yamagh/items/b37d21debd2487c50d82)

## 準備

```bash:
git clone https://github.com/rails/rails-dev-box.git
cd rails-dev-box
```

## Vagrantfile修正

```diff:Vagrantfile
+  config.vm.provision :shell, inline: "sudo gem install rails"
+  config.vm.provider "virtualbox" do |vm|
+    # メモリを1024MBに設定
+    vm.customize ["modifyvm", :id, "--memory", "1024"]
+    # 準仮想化にKVMを選択
+    vm.customize ["modifyvm", :id, "--paravirtprovider", "kvm" ]
+  end
```

## 環境構築

```bash:30分くらいかかる
vagrant up
```

## 接続

```bash:
vagrant ssh
```

* なおVagrantfileを書き換えたら`vagrant reload`すると反映される。

## サンプルアプリを作成して確認

```bash:
rails new foo
cd foo
vi Gemfile  # therubyracer をコメント解除
bundle install --path=vendor/bundler
rails s -b 0.0.0.0
```

* ホストのブラウザで http://localhost:3000 を開いて確認

![aaa.png](https://qiita-image-store.s3.amazonaws.com/0/25728/06287261-fc6e-440a-c9f6-b933e3c1620b.png)


## box保存

* 構築に時間がかかるのでexportしておきたい。
* [How to Create a Vagrant Base Box from an Existing One | Scotch](https://scotch.io/tutorials/how-to-create-a-vagrant-base-box-from-an-existing-one)

```bash:清掃
sudo apt-get clean
sudo dd if=/dev/zero of=/EMPTY bs=1M; sudo rm -f /EMPTY
cat /dev/null > ~/.bash_history && history -c && exit
```

```bash:box保存
vagrant package --output rails-dev-box-`date -I`.box
```
pepperめも_09:本体の修理から帰ってきたペッパーにSSHで繋げなくなった時の対処法

#本体の修理から帰ってきたペッパーにSSHで繋げなくなった時の対処法

ペッパーの修理だしたことあります？
帰ってきたペッパーにSSHで繋げなかったので対処法を書いておきますめも

#こんなエラーが出る

```
tonosamalabo:~ tonosamart$ ssh nao@tolebot.local
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@       WARNING: POSSIBLE DNS SPOOFING DETECTED!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
The RSA host key for tolebot.local has changed,
and the key for the corresponding IP address 192.168.1.192
is unknown. This could either mean that
DNS SPOOFING is happening or the IP address for the host
and its host key have changed at the same time.
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
ce:35:be:c1:5a:44:a9:65:c5:20:b5:ad:e2:b6:51:76.
Please contact your system administrator.
Add correct host key in /Users/tonosamart/.ssh/known_hosts to get rid of this message.
Offending RSA key in /Users/tonosamart/.ssh/known_hosts:51
RSA host key for tolebot.local has changed and you have requested strict checking.
Host key verification failed.
```

いつものコマンドでつながらない・・・＞＜
そんなときは、known_hostsから、設定を削除する必要があります。

/Users/tonosamart/.ssh/known_hosts
このファイルの、自分のロボット名で始まる行を削除します。そしたら、つながるようになるはずです。

ssh-keygen -R tolebot.local
みたいな感じでコマンド使うと簡単にできますよ！

#おしまい
以上、再設定の方法でした！
CentOS6.6(x64)で外部からのhttpアクセスを許可する方法（iptables設定）

現在の設定を確認

    /sbin/iptables -L --line-numbers

httpとhttpsを許可

    /sbin/iptables -I INPUT 1 -p tcp -m tcp --dport 80 -j ACCEPT
    /sbin/iptables -I INPUT 2 -p tcp -m tcp --dport 443 -j ACCEPT

セーブ

    service iptables save

内容確認

    cat /etc/sysconfig/iptables

反映

    /etc/init.d/iptables restart
jQueryの一歩進んだ知識





##Namespace Events(名前空間)

jQueryはイベントに名前空間を持たせることができる。html/cssで言ったらクラスをつけるのに似ている。

イベント(clickだとかscrollだとか)に名前空間をつけるメリットとして、off()でイベントを削除するときに、その名前空間を持ったイベントのみを消すことができることが挙げられる。

```javascript:namespace.js

$("button").on("click.event1", submit())
           .on("click.event2", confirm())
           .on("mouseover.event1", changeColor());

//buttonのclickイベントがすべて消える
$("button").off("click");

//.event1に属するclickイベントのみ消える
$("button").off("click.event1");

//.event1に属するイベントがすべて消える
$("button").off(".event1");


```
CentOS6.6(x64)にhttpdをインストールする

rootになり、下記を実行する。


    yum -y install httpd


confの場所

    /etc/httpd/conf/httpd.conf


起動

    /etc/rc.d/init.d/httpd start

ドキュメントルート

    /var/www/html

ドキュメントルートに適当な index.html を作成して、
ブラウザでlocalhostにアクセスして見えたらOK。