OmniAICreator/Qiita-1.07M huggingface dataset:
PHPで配列の末尾からひとつ前の要素を取り出す

リストや配列の後ろから二番目の要素を取り出すとき、Python[^python]やPerl[^perl]だと`list[-2]`といった形で指定できますが、PHPだとどうするのだろうと調べたメモ。

結果として、Qiitaに既に良記事があったため解決しました。

* [PHPで配列の最後の値を取得する - Qiita](http://qiita.com/t_cyrill/items/da1e6c73b1a25eaeee16)
* [連想配列のn番目の要素を取り出す - Qiita](http://qiita.com/mpyw/items/2f75091579546e416069)

おわりです。

# 試行錯誤

ここは自分で無い知恵絞っていたときの形跡を記録しておきます。

```php

<?php
error_reporting(-1);

$a = range('a', 'z');

// 連想配列でなければ、添字にcount()の結果を使えば良さそう。
if (isset($a)) {
    $c = count($a);
    if ($c >= 2) {
        // インデックス配列であること
        if (array_values($a) === $a) {
            print $a[ $c - 2 ].PHP_EOL;
            //#=> y
        }
    }
}
```

```php

<?php

error_reporting(-1);

$a = array(
  'ド' => 'ドーナッツ',
  'レ' => 'レモン',
  'ミ' => 'みんな',
  'ファ' => 'ファイト',
  'ソ' => 'あおいそら',
);

// ポインタ移動させていいならendしてprevが連想配列でも動くから良さそう。
if (isset($a)) {
    if (count($a) >= 2) {
        end($a);
        print prev($a).PHP_EOL;
        //#=> ファイト
    }
}
```
~~「末尾からふたつ前の要素」って言われたらもう一回prevする。~~

# 参考や注釈

* [count](http://php.net/manual/ja/function.count.php)
* [end](http://php.net/manual/ja/function.end.php)
* [prev](http://php.net/manual/ja/function.prev.php)
* [配列か連想配列か判定する - Qiita](http://qiita.com/Hiraku/items/721cc3a385cb2d7daebd)

[^python]: [Pythonでリストの最後(一番後ろ)の値を取得する方法 - Qiita](http://qiita.com/komeiy/items/971ead35d33c25923222)
[^perl]: [Perl5,Perl6で配列の末尾からひとつ前の要素を取り出す](http://qiita.com/B73W56H84/items/d8352d06f83f9ec29ec4)
Android DevelopのトレーニングをKotlinでやってみる -Building Your First App[1]-

#まえがき
Androidをもう一回ちゃんと再入門したい。Kotlinも使ってみたい。両方やるのがかんぶの。。。(ry
っということで、Android TrainingをKotlinでやってみることにする（失踪常習者）
http://developer.android.com/intl/ja/training/index.html

Gitにも公開しながらやっていこうと思います！
https://github.com/kamedon/KotlinAndroidTraining

Building Your First Appで作ったアプリを元に章毎に章名のブランチを作って、やっていこうと思います！。
ちなみにTopic力は、サイコロと同じですのでご注意を。。。

##Building Your First App編
http://developer.android.com/intl/ja/training/basics/firstapp/index.html

###Set Up Your Environment
Android Studio,Android Sdkは用意しておく。

##Creating an Android Project
http://developer.android.com/intl/ja/training/basics/firstapp/creating-project.html

Kotlinでも関係なく、手順通り進めます。
適当に、パッケージネームやSDKバージョンを週力して
手順と同じように Blank Activityのテンプレートを選びます。

##Running Your App
http://developer.android.com/intl/ja/training/basics/firstapp/running-app.html
実機端末の設定やエミュレータの設定をする（割愛。たくさん情報あるはず）

###Run the app from Android Studio
>In Android Studio, select your project and click Run ▶  from the toolbar.

実行してとりあえず確認します。

#Kotlin化
Building a Simple User Interface　に進む前に、一番シンプルなこの状態でKotlin化しちゃいます！
※Kotlinのバージョンは要確認です。
手順はこちらを参考にしてます。
https://kotlinlang.org/docs/tutorials/kotlin-android.html

##Android Studioにkotlinのプラグインを導入
Settings->Plugins->Install JetBrains plugin ->kotlin(検索など見つける）->Download and Install->Apply->Restart
インストール完了後Android Studioを再起動します。

##Android StudioにKotlinの自動設定してもらう
めんどくさいbuild.gradleの設定をAndroid Studioにやってもらいましょう。
手動の場合はこちらを
https://kotlinlang.org/docs/reference/using-gradle.html

###とりあえずさっき作ったアプリのMainActivityをKotlinにコンバートする
え？まだKotlinの設定してないのにいいのっか？いい～んです。
手順のページ（Converting Java code to Kotlin）では、最強コマンドctrl+shift+aでやってるのですが、guiからもできます！

1.MainActivityを開く
2.code->Converting Java code to Kotlin
```kotlin
class MainActivity : AppCompatActivity() {
```
こんな感じに変換されたはずです。
今後もしKotlinの文法がよくわからない、リファレンス読むのもめんどいっていう時に、一旦Javaで書いて、変換するも有りです。

###build.gradleの設定する
Tools->Kotlin->Configuring Kotlin in the project->ダイアログでok
これでKotlin化以上になります。

再度実行して、成功してるか確認する
>In Android Studio, select your project and click Run ▶  from the toolbar.

長くなるので、今回はここまでです。

次回：Android DevelopのトレーニングをKotlinでやってみる -Building Your First App[2]-
http://qiita.com/kamedon39/items/73f956dcc0cf1811b6bc
NeoVimの.nvimrcの場所が変更された

githubにある最新版(2015/10/27)をビルドしてみたところ、`.nvimrc`が読み込まれないようだったので調べて見た.
どうやら、つい直前のマージで、デフォルトで**XDG Base Directory Specification**に対応したらしい.
なので、これ以降は`$HOME/.nvimrc`ではなく、`~/.config/nvim/init.vim`に設定を書かなくてはならないようだ.
詳しくは、`:help vim-differences`またはWeb版のヘルプ([vim-differences](https://neovim.io/doc/user/vim_diff.html#nvim-configuration))に書いてあるのでそちらを参照してほしい. 

ただ、ホームディレクトリが綺麗になっていくのはいいが、`.nvimrc`も読み込んで置いて、起動時に`XGD_CONFIG_HOME`に移行せよといったエラーメッセージを出すようにして欲しかった気がする...
helpに書いてあるのに気づかずに、githubのissueを漁ってしまった.(何人かこのことについて、issueを立てている人がいた)

参考
[[RFC] XDG base directory specification support](https://github.com/neovim/neovim/pull/3470)
[Support XDG directory specification](https://github.com/neovim/neovim/issues/78)
[Ubuntu フォルダー構造 その10 - XDG Base Directory Specificationについて](http://kledgeb.blogspot.jp/2013/04/ubuntu-10-xdg-base-directory.html)
[AndroidStudio初心者向け]今のところ使えるショートカット

※windows向けです

##検索
ショートカット|機能|名前
----|----|----
**Ctrl+f**|ページ内検索|
**Shift+Shift**|プロジェク内検索|SerchEveryWhere
**Alt+F7**|使用されている場所を検索|Find Usages

##その他
ショートカット|機能
---|----
**Ctrl+Alt+o**|インポートの整理
**Ctrl+メソッド名**|メソッドの中に入る

##コメント
覚えることが多いのでショートカットまで手が回りませんが、少しづつ覚えたいと思います。
AWS Mobile Hubで作ったスマホアプリでAMIMOTOを起動させる

## 概要
![hub_splash_1.png](https://qiita-image-store.s3.amazonaws.com/0/65478/bb439e75-0bbb-eb52-75f6-340413339432.png)

AWSのMobile Hubで簡単にmobileアプリが作れるとのことなので、試して見ました。
実機からAMIMOTOのEC2インスタンスを起動・停止ができるアプリを作ってみましょう

## Lambdaファンクション
まずは、AMMIMOTOを起動と停止させるファンクションを作ります。

### start-instance
```js

var AWS = require('aws-sdk');

function startInstance(instance_id, context) {
	var ec2 = new AWS.EC2();
    var params = {
        InstanceIds: [
            instance_id
        ]
    };
 
    ec2.startInstances(params, function(err, data) {
        if (err) console.log(err, err.stack);
        else     context.done();
    });
}

exports.handler = function(event, context) {
    startInstance(event.instance_id, context);
};
```

## Mobile Hubからアプリを作る
今回はMobile HubのCloud Logicの機能を使って、アプリからLambdaを叩ける用にします。

<img width="799" alt="スクリーンショット 2015-10-27 8.52.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/65478/dc85d498-0baa-6b76-110b-b88978db38e2.png">

Cloud Logicを有効化して、アプリから叩きたいLambdaファンクションを指定します。


<img width="832" alt="スクリーンショット 2015-10-27 8.57.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/65478/e9c6e268-a031-f233-0bff-400fbc6af375.png">
その後Buildメニューを選択して、iOSを選択します。Download iOS source packageをクリックすると構築済みのiOSアプリのパッケージがダウンロードできます。

## アプリをiPhoneへインストール
[Xcode7で1円も払わずに自作iOSアプリを実機確認する](http://qiita.com/FumihikoSHIROYAMA/items/a754f77c41b585c90329)にあるようにここ最近出たxcode7では、無料で特に申請や難しい手順もなく、作ったアプリをiPhoneへインストールして立ち上げることが出来ます。

<img width="334" alt="スクリーンショット 2015-10-27 9.04.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/65478/b537be77-e66f-bc7a-20f4-0fcd70b90366.png">
xcode7でMobile Hubからダウンロードしたアプリを読み込みます。そしてUSBでiPhoneを接続。ビルドの対象に自身のiPnoneを指定した上で実行ボタンを押すだけで実機にインストールして実行出来ます。

![IMG_0374 copy copy.jpg](https://qiita-image-store.s3.amazonaws.com/0/65478/ce0f5b4c-ae9d-fee8-e283-2f03a9332903.jpeg)
こんな感じで実機の上にアプリが現れます。

## アプリの実行
![IMG_0375.jpg](https://qiita-image-store.s3.amazonaws.com/0/65478/5e1bbe35-f6eb-63f6-5ae1-ad6e5acc8522.jpeg)
アプリを実行するとこんな画面が立ち上がります。デザインを適用しない場合にMobile Hubが自動で作ってくれる画面ですね。Cloud Logicを選択してLambdaファンクションを実行しましょう

![IMG_0376.jpg](https://qiita-image-store.s3.amazonaws.com/0/65478/a0f0cbe6-ba1b-ef1d-a893-25c9869ad0bf.jpeg)
start-instance関数を設定してinvokeをタップします。

<img width="644" alt="スクリーンショット 2015-10-27 9.29.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/65478/d0d289ad-2dde-0eaa-581f-3b4461d4c818.png">
こんな感じでインスタンスが起動し始めました。

<img width="801" alt="スクリーンショット 2015-10-27 9.51.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/65478/25fb2112-46fc-ee8c-e354-162f5fbabe69.png">
しばらくしてブラウザからアクセスすると、AMIMOTO起動しました！
Swiftの文字列formatでargumentsを配列で指定するときに配列の長さが足りない場合のEXC_BAD_INSTRUCTIONを避ける

StringにはFoundation内のextensionでイニシャライザに、`init(format: String, arguments: [CVarArgType])`が定義されていますが、`init(format: String, _ arguments: CVarArgType...)`と同様に、argumentsの配列数が書式指定子数を下回った場合クラッシュします。

```swift
String(format: "%@ + %@ = %@", arguments: [
    "1", "2", "3"
    ]) // => 1 + 2 = 3

String(format: "%@ + %@ = %@", arguments: [
    "1", "2", "3", "4", "5"
    ]) // => 1 + 2 = 3

String(format: "%@ + %@ = %@", arguments: [
    "1"
    ]) // EXC_BAD_INSTRUCTION
```

バグの早期発見につながって有り難いことかもですが、クラッシュするのはやり過ぎな場面（APNSの、`(loc-)key`と`(loc-)args`からクライアント側で文字列を作る場合など）もあるかと思います。

# 回避方法
NSStringのお力をちょっとだけお借りする方法しか思いつきませんでした。

```swift
let arguments = [
    "1"
    ] as [CVarArgType]
NSString(format: "%@ + %@ = %@", arguments: getVaList(arguments)) as String // => 1 + (null) = (null)
```

他にいい方法がありましたら教えて下さいm(_ _)m
CKAN でdebug=true にすると AttributeError が出る時の対処


確認バージョンは CKAN 2.4.2。

http://docs.ckan.org/en/latest/maintaining/installing/install-from-source.html?highlight=debug#attributeerror-module-object-has-no-attribute-css-main-debug-css

に答えがあった。

nodejs と npm をインストール

`sudo yum install nodejs npm`

CKAN のフォルダに移動し、less と nodewatch をインストール

`npm install less@1.7.5 nodewatch`

less を実行すると、main.debug.css が生成される

```
$ bin/less
Watching /var/local/ckan/default/pyenv/src/ckan/ckan/public/base/less
[2015-10-27 00:28:08] recompiled main.debug.css in 2027ms
```

所定のフォルダに debug.main.css が生成されるので、サービスを再起動すればOK
Rxにおけるscanとreduceの違い

## TL;DR

* `reduce`はcompleteするまで値が返らない
* `scan`はnextで次々に値が返っていく
* 値を逐次利用したい場合は`scan`使いましょう

## 他言語でのreduce

```ruby
# in Ruby
# reduceはinjectのalias
(0..10).inject { |sum, n| sum + n }
```

```js
// in JavaScript (ECMAScript 2015)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10].reduce((sum, n) -> sum + n)
```

### Reduce operator

> apply a function to each item emitted by an Observable, sequentially, and emit the final value
>
> ![Screen Shot 2015-10-24 at 02.16.35.png](https://qiita-image-store.s3.amazonaws.com/0/14845/cafddea3-ce7a-860f-0ab0-5b2945bd5660.png)
>
> <cite>[ReactiveX - Reduce operator][reduce]</cite>

**emit the final value**とあるように，結果をaccumulatorに溜め込んでいって最後（`onComplete()`）に値を返す．
即ち，データが全て流れ切るまで次のメソッドに値は流れてこない．

### Scan operator

> apply a function to each item emitted by an Observable, sequentially, and emit each successive value
>
> ![a6ffabb5-8e10-486d-a58e-ac28039d7fd6.png](https://qiita-image-store.s3.amazonaws.com/0/14845/aa4001d7-50ff-d639-93c0-e84d86e4528e.png)
>
> <cite>[ReactiveX - Scan operator][scan]</cite>

**emit each successive value**とあるように，accumulatorの値を次々に（`onNext()`）流してくれる．

即ち，データを1つ食えば1つ吐いてくれる．

## どういうときに気をつければいいか
ひとつ前の結果を利用して値を変換し，その結果を逐次利用していく場合（センサ値にlow pass filterのようなものをかけるときとか）に`reduce`を使ってしまうと，センサ値読み出しをやめない限り値が返ってこない．Rubyist/JSerは反射的に`reduce`しそうになるけど，そこはグッとこらえて`scan`使いましょう．

## References

* [ReactiveX - Reduce operator][reduce]
* [ReactiveX - Scan operator][scan]

[reduce]: http://reactivex.io/documentation/operators/reduce.html
[scan]: http://reactivex.io/documentation/operators/scan.html
pgbackup の仕組み


https://devcenter.heroku.com/articles/heroku-postgres-backups


## 手動バックアップ

`pg:backups`コマンドで実行される。アプリケーションの`DATABASE_URL`設定がデータベース選択の基準となる。

````bash:
$ heroku pg:backups capture -a sushi
Hit Ctrl-C at any time to stop watching progress; the backup will
continue running. Stop a running backup with heroku pg:backups cancel.

HEROKU_POSTGRESQL_BLACK (DATABASE_URL)  ----backup--->  b251

Running... done
````

プランによって保持可能なバックアップの数が違う。
保有可能なバックアップ数を越えた場合、自動で古いものから順に削除されていく。


|Plan|	保有可能なバックアップ数|
|---|---|
|Hobby-Dev	|2|
|Hobby-Basic|	5|
|Standard-*|	25|
|Premium-*	|50|
|Enterprise|	50|


## スケジュールの設定

定期的にバックアップを取りたい場合、スケジューラから設定可能。

````bash:
$ heroku pg:backups schedule DATABASE_URL --at '02:00 Asia/Tokyo' -a sushi
````
時刻は00分で指定しないとエラーになって怒られる。
スケジューラの設定は一つのみ有効で、新しく設定を追加した際には前のスケジュールが削除されるっぽい。

スケジューラの解除は`unschedule`コマンドで。

````bash:
$ heroku pg:backups unschedule DATABASE_URL --app sushi
````

現在のスケジュール一覧は`schedules`コマンドで確認する(こっちは複数形)。

````bash:
$ heroku pg:backups schedules --app sushi
Current backup schedules:
RED: daily at 2:00 (America/Los_Angeles)
````

## バックアップの管理

バックアップの一覧は`pg:backups`コマンドで確認できる。

````bash:
$ heroku pg:backups --app sushi
=== Backups
ID    Backup Time                Status                              Size    Database
----  -------------------------  ----------------------------------  ------  --------
b013  2015-03-18 19:03:16 +0000  Running                                     IVORY
b011  2015-02-18 17:55:38 +0000  Finished 2015-02-18 17:55:39 +0000  1.9GB   IVORY
b010  2015-02-17 19:14:43 +0000  Finished 2015-02-17 19:14:48 +0000  1.9GB   IVORY
b004  2015-02-11 19:00:55 +0000  Finished 2015-02-17 19:14:48 +0000  1.9GB   IVORY

==== Restores
ID    Restore Time               Status                              Size    Database
----  -------------------------  ----------------------------------  ------  --------
r002  2015-03-16 17:33:19 +0000  Finished 2015-03-16 17:33:19 +0000  1.9GB   IVORY
r001  2015-03-15 12:13:44 +0000  Failed 2015-03-15 12:13:47 +0000    1.7GB   IVORY
````

各バックアップのダウンロードURLは `public-url`サブコマンドで取得する。

````bash:
$ heroku pg:backups public-url b001 -a sushi
The following URL will expire at 2015-04-07 18:35:50 +0000:
"http://s3.amazonaws.com/xkpgbackups/app1234567@heroku.com/b004.dump?AWSAccessKeyId=ABCD1234&Expires=1289261668&Signature=3mMBeKISewgEUDT%2FL5mRz4EYS4M%3D"
````

ここで与えられるURLは一次的なURLなので、永続的なバックアップとして利用する場合には、ドコかしらに転送する必要がある。
もちろん、URLの発行は何度でも行えるのだが、先に述べたバックアップ保持個数の制限があるため、必要な特定の世代は別途保管をおすすめします。

スクリプト等で利用するときなど、URLだけほしい時は

````bash:
$ heroku pg:backups public-url b001 -a sushi | cat
````

などのようにして、パイプで`cat`に繋げればいいらしい。
Lubuntu15.10を使ってみたメモ

* [Xubuntu15.10をvirtualboxにインストールメモ - Qiita](http://qiita.com/tukiyo3/items/e964adc587d6c808d143)

## Xubuntu15.10より気に入った点

* 1GBのUSBメモリに入るところ
    * インストールあとの容量も少なめ
* キーボードショートカットが好み
* 画面端に持って行くと自動でフルスクリーンになるのが、ないので良い。
* 軽い

## 追加アプリ

* [Virtualbox](https://www.virtualbox.org/wiki/Downloads)
* [Slack](https://slack.com/downloads)

## virtualbox guestにインストールした場合

```bash:
sudo apt-get install -y virtualbox-guest-dkms
```

* これでウィンドウサイズに応じて画面サイズが変更される


### Altキーがホストに横取りされるのを防ぐ

* [Xubuntu15.10をvirtualboxにインストールメモ - Qiita](http://qiita.com/tukiyo3/items/e964adc587d6c808d143#alt%E3%82%AD%E3%83%BC%E3%81%AE%E6%A8%AA%E5%8F%96%E3%82%8A%E3%82%92%E9%98%B2%E3%81%90)

## 追加のドライバー

* Processor microcode firmware for intel CPUs を intel-microcodeから使用
    * 昔は intel-microcode というパッケージで提供されていた。
    * [[lubuntu] Slow Lubuntu, Intel Atom](http://ubuntuforums.org/showthread.php?t=2265752)に対して有効っぽい
* 他あればチェック

## DPIを96から120に変更

* [LXDE.org Forum • View topic - font anti-aliasing and dpi settings](http://forum.lxde.org/viewtopic.php?f=24&t=1486)

```bash:~/.Xresources
!Xft.dpi: 96
Xft.dpi: 120
Xft.antialias: true
Xft.rgba: rgb
Xft.hinting: true
Xft.hintstyle: hintslight
```

ログアウトしてログインすれば反映される

```bash:値の確認
xrdb -query
```

## 音量コントロール

* [古いWindowsXPノートPCにLubuntu 14.04を入れる: エンプティ・エアクラフト](http://bigarrow.tea-nifty.com/blog/2014/05/windowsxppclubu.html)

```bash:
sudo apt-get install -y pavucontrol
```


## キーボード・ショートカット

* win + e : ファイラー起動
* win + r : ファイル名を指定して実行
* ctrl + esc : スタートメニューを開く
* PrintScreen : 画面全体をキャプチャ
* Alt + PrintScreen : アクティブウィンドウをキャプチャ
    * 画面キャプチャは[scrot](http://iroiroboubiroku.blogspot.jp/2015/06/lubuntu_1.html)のようですね。$HOMEに保存されます

----

# LXSession のデフォルトのアプリケーション

## 立ち上げるアプリケーション

```bash:
sudo apt-get install -y \
  xfce4-screenshooter xfce4-terminal
```

* 設定 ＞ LXSession のデフォルトのアプリケーション ＞ 立ち上げるアプリケーション
    * Screenshot manager : xfce4-screenshooter に変更
    * Terminal manager : Xfce Terminal に変更

![スクリーンショット_2015-11-02_05-53-42.png](https://qiita-image-store.s3.amazonaws.com/0/25728/226947c1-17cc-63b0-6173-e7a14c519b72.png)

## 自動立ち上げ

* 設定 ＞ LXSession のデフォルトのアプリケーション ＞ 自動立ち上げ
    * SSH鍵エージェント (チェックしていること)
    * PolicyKit Authentication Agent (チェックを外していること)

----

# netbeans8

* [NetBeans IDE ダウンロード](https://netbeans.org/downloads/?pagelang=ja)

```bash:
sudo apt-get install -y default-jre
```
共用SSH踏み台環境を考える

# はじめに
[ここ](http://qiita.com/kawaz/items/a0151d3aa2b6f9c4b3b8)のエントリ等が最たる例だが
私もご多分に漏れず、多数のサーバを管理している踏み台環境を持っている。
しかし、部署が複数あったりそもそも技術者がそれぞれ各々の踏み台を持っていると
人の入れ替わりの度に踏み台環境を各々が用意する手間と、管理上の問題から
カオスになっていく。

従って、便利な共通踏み台を作りましょう、という大号令の下、
アカウントやホスト管理もしていきましょう。と言うことでその辺りを整備する。

# やりたいこと
はっきり言って個人個人の踏み台の方が使い勝手が良いことがある。
技術者の性格上、それは仕方ないので、共通踏み台を作る以上、
ある程度の利便性が無いとその時点でRejectされてしまうのでその辺りは考慮が必要。

とりあえず、経緯からして踏み台環境の条件を作り
そこから利便性の為のあれこれを考える。

## 必須機能
0. 自分たちが管理（ログイン）するホストが網羅・管理されていること
1. 管理対象の機器にログインする全てのユーザが網羅・管理されていること
2. 管理対象機器の操作ログが全て記録されていること

### オプショナル機能
0. ログインの際、補完機能が効くこと
 - 補完が利くだけで無く、shellのTAB補完のように複数候補がある場合は候補を列挙してくれる方が好ましい
1. ループ処理が可能なこと
 - Capistoranoのような同時操作でなくとも、for i in `hosta host2` do; ssh $i ; done; みたく自分でループをわざわざ書かなくて済むと便利
1. 多段ログインが可能なこと
 - 共通踏み台にすればするほど直接は入れない動線が発生する為、予めこういった拡張の余地を残しておく
 - 共通踏み台なのだから全てに足を出しておけ、というのはその通りだがそういう裏線ネットワークを全てに這わせるのは非現実的だったりする
1. 移植が容易なこと
 - これ重要。リプレースの度にライブラリだのなんだのが環境に引っ張られるのはナンセンス。

# 機能考察
必須機能はどれも踏み台サーバを作る意義としては重要だが、
これらの機能は管理上必要なだけであって、別に技術者にとっては操作ログの記録ぐらいしか恩恵が無い。
その操作ログとて無ければならない機能では無く、各々がメモを作ったりツールを作れば住むだけの話なのでこれしか機能を設けないのであれば不便なだけで意味が無い。

# 設計方針
バイナリで作り込まず、スクリプトで作る。（Cで書いてmakeとかやらない。手堅い言語だけどgcc,glibcの影響は避けたいし、気づいた人間が即修正できない）
ruby の thor を使えばオプションやら何やらが簡単に実装できそうだったがCentOSだとメジャーバージョンが変わるとrubyのバージョンが大幅に変わり、使えない機能が出てくるなどの弊害があるので枯れているperlで書くことにした。CPANは勿論使わない。
この辺りは右翼的な思考だが、運用・保守の考え方を前提にすると致し方ない。

## ユーザ管理、ホスト管理
最終的にはローカルで持つ（都度、聞きに行くタイプだと認証サーバが障害で、踏み台が使えません！等というばかげたことが起きる）が、マスターデータはここで持つことはしない。あくまで踏み台なので。

- ユーザ管理
    - POSIXアカウントで管理する
    - ユーザと権限で認証するだけなのでLDAPを建てて連携（スレーブ）にまでする必要が無い
- ホスト管理
    - DNSや監視リストと同じようになるのでそこから引っ張る仕組みにする
    - 前述の通り、syncで取ってきてローカルに持つ感じ

# Tips

## 多段ログイン仕込み
[ここ](http://qiita.com/kawaz/items/a0151d3aa2b6f9c4b3b8)のエントリの設定でやってみたが残念ながら幾つかの環境は-Wオプションをサポートしていなかったのでncを使う方法を仕込んでおく。

ついでに頻繁にTimeOutが来ると面倒なことになるのでServerAliveも追記。
但し、これをやるとログインしっぱなしの人が出てくるのでどこかで切る設定は仕込んでおいた方が良さそうではある
<pre>
ServerAliveInterval 15
Host */*
  ProxyCommand ssh "$(dirname "%h")" nc -w 300 "$(basename "%h")" %p
</pre>
SPICE

https://pve.proxmox.com/wiki/SPICE

# Windows 10 20H2で確認

## サーバー側

https://spice-space.org/download/windows/spice-guest-tools/

* https://spice-space.org/download/windows/spice-guest-tools/spice-guest-tools-latest.exe


## クライアント側

https://virt-manager.org/download/

* https://virt-manager.org/download/sources/virt-viewer/virt-viewer-x64-10.0-1.0.msi

----

# (古い記事) xubuntu15.10にて確認

## 参考

* [Xspice in containers | S3hh's Blog](https://s3hh.wordpress.com/2014/04/18/xspice-in-containers/)

## インストール

```bash:
sudo apt-get install -y xserver-xspice spice-client
sudo apt-get install -y virt-viewer #<-不要？
```

## 設定

```bash:雛形コピー
cp /usr/share/doc/xserver-xspice/spiceqxl.xorg.conf.example.gz ~
gzip -d ~/spiceqxl.xorg.conf.example.gz
```

```diff:spiceqxl.xorg.conf.example
Section "Device
    ...
    # Do not request any password from client
-   #Option "SpiceDisableTicketing" "0"
+   Option "SpiceDisableTicketing" "1"
    ...
    EndSection
```

## spiceサーバ起動

```
sudo Xorg -config ~/spiceqxl.xorg.conf.example :2 &
```


## spiceサーバに接続

```
spicec -h localhost -p 5900
```

## プログラム起動

```bash:
export DISPLAY=:2
xterm
```

キーをおすだけで落ちる
XephyrでXサーバを起動

* xubuntu15.10にて確認
* vnc版は[こっち](http://qiita.com/tukiyo3/items/1077630060b5716cd93e)

## メリット

* vncでは解像度の変更が起動後にできなかったが、Xephyrではできる。

## Xサーバ起動

```bash:Xサーバ起動
Xephyr -ac -br -noreset -screen 1280x1024 :1
# 解像度を簡単に変更したい場合
Xephyr -ac -br -noreset -screen 1280x1024 :1 -resizeable
```

## session設定

```bash:~/.vnc/xstartup
#!/bin/sh

unset SESSION_MANAGER
unset DBUS_SESSION_BUS_ADDRESS
#exec /etc/X11/xinit/xinitrc

# 環境変数
export LANG=ja_JP.UTF-8
export SHELL=/bin/bash

setxkbmap -model jp106 -layout jp

# Imput Method
export GTK_IM_MODULE=fcitx
export XMODIFIERS=@im=fcitx
export QT_IM_MODULE=fcitx
fcitx-autostart
# クリップボード用
killall vncconfig
vncconfig -nowin &
# xfce4
xfce4-session
```

## Xサーバでsession開始

```bash:Xサーバでsession開始
export DISPLAY=:1
sh ~/.vnc/xstartup
```
python > print > 処理終了時にしかリダイレクトされない? > -u 付きで実行する

```txt:動作確認
Raspberry Pi2 (raspbian)
MacOS X 10.8.5
```

## pythonでの出力

以下のコードを用意

```hello.py
#!/usr/bin/env python
import time

print "hello"

for x in range(0,60):
	print x
	time.sleep(1)
```

以下のように実行

```
$ ./hello.py > log.tmp
```

別のターミナルで以下を実行

```
$ tail -f log.tmp
```

上記を行った時、log.tmpの中身の更新は<font color=red>60回のprintが終わった後</font>になっているようだ。

stdoutで見た時は毎秒表示されるが、ファイル出力の場合は毎秒出力されない。

## bashでの出力

代わりにbashのスクリプトを用意

```bash:test-exec
#!/usr/bin/env bash

for x in $(seq 1 60)
do
  echo $x
  sleep 1
done
```

こちらを実行した場合は、毎秒ファイル出力される。


## 疑問
pythonのprint文で毎秒ファイル出力させるにはどうするのだろうか。

print以外のファイル書込み命令を使えばいいのかもしれないが、ファイルのリダイレクトと組合せられる方法を調べないと。

DHT11で温度、湿度が測れてもファイル出力時にtail -fで見れないのが惜しい。

## 解決
http://stackoverflow.com/questions/107705/disable-output-buffering

python実行時に -u オプションを指定すればいいようだ。

```hello.py
#!/usr/bin/env python -u
import time

print "hello"

for x in range(0,60):
	print x
	time.sleep(1)
```

上記の指定 `#!/usr/bin/env python -u`でMacOSX上では動いた。
一方で、raspberry Pi2では`-uオプションがない`というようなエラーとなった。
`#!/usr/bin/python -u`にしたら動いた。
技術英語 > along with / together with > Along withの場合は、「dependence」がある

along withを耳にして、ふと思った疑問。
along with と together with の使い分けはどうなのだろうか。

<hr>

[StackExchange](http://english.stackexchange.com/questions/66739/whats-the-difference-between-along-with-and-together-with)

> Along with and together with don't have too much of a different meaning. Although along with sort of implies a dependance on the two subjects.

上記にて、Along withの場合は「dependence」があると言っている。
リンク先には例として、付き添いとしてパーティにやってきた例が紹介されている。

<hr>
[chiebukuro](http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1313375773)

> along withは
in addition to somebody/something; in the same way as somebody/something
...
> together withは
>1 including
>2 in addition to; as well as
>ほぼ一致していますが、along withにはincludingの意味がないようです。

<hr>

パーティの例が自分には腑に落ちる。
人でなくても物についても、dependenceを意識して、along withを使おうかと思う。
Oracleのアカウントとパスワード忘れた...

たまにこういうことがあります...
とくに、自分自身でOracleのインストールはしていない時など。（しっかり引き継げば問題ないのかと思いますが...)

### やってみること

#### Unix系ならバックアップスクリプトを探してみる

もしかして cron 関連で、Oracleのバックアップスクリプトや運用上に使うスクリプトがあるかもしれません。その中にアカウント＆パスワードが書いてあるかもしれませんので、探してみましょう。

#### OSユーザで接続できないか確認する

リモート接続や、Oracle内部DBのアカウントで接続できない場合、OS認証で接続できるようになっているかもしれません。
いったん sqlplus /nolog でsqlplusに入り、そこから system/xxxx as sysdba してみましょう。

```
% sudo su oracle # OSのoracle専用ユーザになる
$ sqlplus /nolog
SQL*Plus: Release xxxxxx Production on xxxx xxx xx:03:22 2015

Copyright (c) 198x, 201x, Oracle.  All rights reserved.

SQL> connect system/manager as sysdba
接続されました。
SQL> select * from v$version; # v$表とかをチェック

```

#### ドメインユーザで接続できないか確認する

上記のOS認証と同じく、Windowsサーバ上で起動している場合は、Windows上のOSユーザや一定のドメインユーザ、ドメイン上の指定グループ上に所属するユーザならOracleに接続できる設定になっているかもしれません。
Macで複数のフォルダのファイルを一括して移動する方法

# はじめに
日付ごとフォルダにあるExcelファイルなど日誌を、一つのフォルダに移動したいことがあると思います。
一発で実行する方法はWindowsではよくわかりませんが、MacやLinuxではTerminalから以下のようにするとできます。

# コマンド
```terminal:command
find . -type f -print0 | xargs -0 -I% mv % /path/to/new/dir/
```
# 説明
ファイルの一覧を出力します。  
``find . -type f``

-print0 と xargs -0 が関係するようですがよくわかりません。
%にxargsの引数が入っているので指定してください。

-------　2017/6/4 追記 -------
同じファイルがあると上書きになってしまうので、気をつけてください。
pepperのpythonでHTTP GETしてJSONパースするサンプル


[HTTP Getボックスの作成](http://qiita.com/Atelier-Akihabara/items/acc8d2ad6c3881f112a4)をもとに作ってみました。

APIはこの天気APIです。
http://weather.livedoor.com/forecast/webservice/json/v1?city=200010

```
class MyClass(GeneratedClass):
    def __init__(self):
        GeneratedClass.__init__(self)

    def onLoad(self):
        #put initialization code here
        pass

    def onUnload(self):
        #put clean-up code here
        pass

    def onInput_onStart(self, url):
        import urllib2, json
        api = "http://weather.livedoor.com/forecast/webservice/json/v1?city=200010"
        r = urllib2.urlopen(api)
        root = json.loads(r.read())
        self.onStopped(root['title'].encode('utf8'))
```

![](https://i.gyazo.com/4921a4f92ec95d2f2ba1ee55e836e375.png)
デコレータでデコレーション

#デコレータ
デコレータは、既存の関数に何か追加動作を加える感じのもの。
例えば、実行時間を測って出力したり、"〜〜関数が実行されました"とかのメッセージを付け加えたりできます。

##サンプル
今回は、出力にメッセを付け加えるものと実行時間計測を作りました
作ったコード：https://github.com/KodairaTomonori/Qiita/tree/master/default_module/syntax
###メッセージを付け加える
```decoration.py
deco =  '｡+ﾟ+｡･ﾟ･｡+*+｡･★･｡+*+｡･===[ '
deco_end = deco.replace('[', ']')[::-1]
deco_result = [' ∧____∧  結果を', '( ｀Д´ )    出力するぞ', '(っ▄︻▇〓┳═ ', '/　　 )', '( /￣∪']

def deco_func(func):
    def decoration(*args, **kwargs):
        print(deco + 'start   ' + func.__name__ + deco_end)
        for i in range(len(deco_result) ):
            if i != 2: print(deco_result[i])
            else: print(deco_result[i], func(*args, **kwargs) )
        print(deco + 'end     ' + func.__name__ + deco_end)
    return decoration

@deco_func
def addition(a, b):
    return '{} + {} = {}'.format(a, b, a + b)

if __name__ == '__main__':
    addition(103842, 283746)
```
###出力
>![スクリーンショット 2015-10-27 2.02.23.png](https://qiita-image-store.s3.amazonaws.com/0/86999/330c51ec-2f18-f004-7489-7b469dc0fb41.png)

###
デコレータは、`deco_func`関数は、関数内で作った`decoration`関数を返すものになってます。
`decoration`は、始まりと終わりをprintして出力を飾っています。
`func.__name__`で、関数名を取得できます。
また、`(*args, **kwargs)`とすることで、大体の関数に対応できるようになってます。


デコレータとして使う場合には、関数の前に`@deco_func`を付け加えるだけです。
こうすることで、`addition` = `deco_func(addition)(a, b)`となるわけです。

###時間計測
```timer.py
#usr/bin/python

import time

def timer(func):
    def print_time(*args, **kwargs):
        start = time.time()
        func(*args, **kwargs)
        print(func.__name__ + \
            'の実行にかかった時間は{}秒です'.format(time.time() - start) )
    return print_time

@timer
def roop_timer(a):
    return roop(a)

def roop(a):
    sum_ = 0
    for i in range(a):
        sum_ += i
    return sum_

if __name__ == '__main__':
    roop_timer(10000)
    timer(roop)(10000)
```
###出力
```output.txt
roop_timerの実行にかかった時間は0.0008311271667480469秒です
roopの実行にかかった時間は0.0008249282836914062秒です
```
###
`print_time`では、時間を計って、その結果を出力しています。
`func.__name__`は、関数名をとってきてくれます。
`@timer`を一部にしか反映させたくない場合は、`timer(roop)(10000)`とすることで、同じ動作をすることになる。
また、`roop_timer`のようにそれ専用の関数を作っても可能(二つ以上つかう時はこれ作ったほうが楽)。

##まとめ
`@decorate_function`を付け加えることで、簡単に関数に他の機能を付け加えることができる。
Webサイト評価の指標

Ｗｅｂページを分析する時に良く出てくる用語
分類も用語整理もしてません。

アクセス解析用語
・PV数　訪問回数　訪問者数　訪問当PV数
・離脱率　直帰率
・新規　リピート率　リピート回数　訪問頻度
・平均滞在時間
・コンバージョン数
・ランディングページ　離脱ページ

ディメンション
・サイト別　カテゴリ別　ページ別
・端末別（PC、SP,タブレット）
・OS別　機種別　ブラウザ別
・地域別
・時間帯別　曜日別　休日　平日
・新規　リピート別
・流入元別（検索サイトとか）
・検索キーワード別

KGI:重要目標達成指数
　　⇒売上高、利益率、成約件数
KDI:プロセス実施状況を計測する為に実行度合い（パフォーマンス）を定量的に示すもの
　　⇒引き合い件数、顧客訪問回数、歩留まり率、解約件数
CSF/KGI/KDIを使った経営手法
　　⇒バランスト・スコアカード（BSC)

A/Bテスト
ヒートマップ
CVR
全体動向　サイトアクセス傾向・ステップ別ユーザ数
顧客ロイヤル化ステップ
ナビゲーション改善
追加開発効果
会員登録プロセス

分析視点の確認
リニューアル目的やゴールが達成しているかを、数値で確認する為のアクセス解析でどのような数値を取得すべきかを定義する。
　　⇒ビジネスゴールとその指標となる数値

[アクセス解析用語](http://xfusion.jp/yougo.html)
[Google analytics forum](http://gaforum.jp/)
multidex環境でのビルドの高速化


[SDKバージョン21からmultidex環境でのビルドが最適化され、高速にビルドできるようになりました。](http://developer.android.com/intl/ja/tools/building/multidex.html#dev-build)これを有効にするためにはgradle.build上でminSdkVersionを21以上にする必要があります。

ただ、実際のプロダクトにおいて、minSdkVersionが21(Android 5.0以上)というのは[現実的ではありません](https://developer.android.com/intl/ja/about/dashboards/index.html)。そこで、開発環境とプロダクション環境で別々のproductFlavorを定義することで、開発時にはminSdkVersionを21に指定し、プロダクトとしてリリースする場合にはminSdkVersionを実際使われる値を使用することができます。これにより、開発時は高速なビルドで効率的な開発を行うことができます。


```
android {
    productFlavors {
        // Define separate dev and prod product flavors.
        dev {
            // dev utilizes minSDKVersion = 21 to allow the Android gradle plugin
            // to pre-dex each module and produce an APK that can be tested on
            // Android Lollipop without time consuming dex merging processes.
            minSdkVersion 21
        }
        prod {
            // The actual minSdkVersion for the application.
            minSdkVersion 14
        }
    }
          ...
    buildTypes {
        release {
            runProguard true
            proguardFiles getDefaultProguardFile('proguard-android.txt'),
                                                 'proguard-rules.pro'
        }
    }
}
dependencies {
  compile 'com.android.support:multidex:1.0.0'
}

```

[参考URL](http://developer.android.com/intl/ja/tools/building/multidex.html#dev-build)


自分の環境ではもともとdebugビルドで1分30秒くらいかかっていたのが、50秒くらいに短縮されました。


# すでにflavorが設定されている場合

しかし、すでにflavorによって複数のソースツリーの管理などが行われている場合、単純にflavorによってminSdkVersionを分けることはできません。（ちなみにbuildTypeではminSdkVersionは指定できません）そのためには次のような方法を用います。

- [flavorDimensionsによるflavorの指定方法](http://qiita.com/boohbah/items/389b159a1693247b15de)
Milkcocoaの送信テスト用JSサンプル


https://mlkcca.com/ の接続テスト用アプリでよく作るやつのメモ。
es6な感じです。

```app.js
'use strict'

import MilkCocoa from 'milkcocoa';
const milkcocoa = new MilkCocoa("your-app-id.mlkcca.com");
const ds = milkcocoa.dataStore('message');

setInterval(()=>{
  ds.send({v:1}, (err, sended) => {
    console.log('送信:', sended);
  });
},2000);

ds.on('send', (sended) => {
  console.log('受信:',sended);
});

```

実行すると2秒ごとに送受信が行われます。

```bash
$ babel-node app.js
送信: { id: undefined, value: { v: 1 }, timestamp: undefined }
受信: { path: 'message', value: { v: 1 } }
送信: { id: undefined, value: { v: 1 }, timestamp: undefined }
受信: { path: 'message', value: { v: 1 } }
送信: { id: undefined, value: { v: 1 }, timestamp: undefined }
受信: { path: 'message', value: { v: 1 } }
```
動画変換 ( Digital Transcoding ) サービスの利用方法  

# 概要
ソフトレイヤーには、デジタル・トランスコーディングの機能が提供されています。 これは音源や動画のフォーマットを変換できる便利な機能です。

この機能は、ブラウザ画面で手操作する方法と、PythonなどのプログラムからソフトレイヤーのAPIを呼び出して自動処理する方法がとれます。ここではFTPコマンドとブラウザ操作で変換する方法をご紹介します。

参考URL トランスコーディング・サービス (http://www.softlayer.com/jp/digital-transcoding)


# 変換元ファイルをFTPでアップロードする。
FTPでログインするためのユーザーIDとパスワードは、アカウント毎に付与されます。これらを取得するには、https://control.softlayer.com/ -> **Service** -> **Digital Transcoding**に進んだ画面に表示されます。

次はFTPでアクセスする手順で サーバーのアドレスは、**transcode.service.softlayer.com** です。

```
maho$ ftp transcode.service.softlayer.com
Connected to transcode.service.softlayer.com.
220 NAS FTP Service
Name (transcode.service.softlayer.com:maho): SLT294470-1
331 Please specify the password.
Password: 
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
```
ログインすると in と out のディレクトリがあるので、in へ移動して、変換したいファイルをアップロードします。

```
ftp> dir
229 Entering Extended Passive Mode (|||45382|).
150 Here comes the directory listing.
drwxrwx---    2 206184   1005            0 Aug 05  2014 in
drwxr-x---    2 30470    1005            0 Aug 05  2014 out
226 Directory send OK.
ftp> cd in
250 Directory successfully changed.
ftp> put GameOnSoftLayer.mp4
```
# 変換ジョブ登録

アップロードが完了したら、SoftLayerカスタマーポータルの https://control.softlayer.com/services/digitaltranscoding をアクセスして、次の **Select Input File** をクリックして、ファイルを選択します。

![スクリーンショット 2015-10-27 0.22.32.png](https://qiita-image-store.s3.amazonaws.com/0/42829/bdccf40d-537b-55c5-69a1-c2acce5902af.png)

次の画面で、ファイルが表示されない場合は、ブラウザで再読み込みボタンをクリックすると、表示される様になります。

![スクリーンショット 2015-10-26 23.57.36.png](https://qiita-image-store.s3.amazonaws.com/0/42829/0b4ecebb-bd63-d084-fa76-ae2e0441b816.png)

画面の沿って進め、次の様に入力ファイル、出力フォーマット、ジョブ名、出力ファイル名を設定して、**Convert File** をクリックしてジョブを開始します。


![スクリーンショット 2015-10-26 23.59.41.png](https://qiita-image-store.s3.amazonaws.com/0/42829/937a703f-a875-88f5-e941-636955466135.png)


次は、出力フォーマットの選択画面です。 
![スクリーンショット 2015-10-26 23.58.53.png](https://qiita-image-store.s3.amazonaws.com/0/42829/591e5ecb-cfe2-a955-0699-668c573aea29.png)

ジョブが完了した事は、同ブラウザ画面で次の様にStatusで知る事ができます。
![スクリーンショット 2015-10-27 0.16.31.png](https://qiita-image-store.s3.amazonaws.com/0/42829/1819854e-b3de-8e25-9fdc-51092c2f7fc6.png)

# 出力ファイルのダウンロード

FTPでダウンロードして変換結果を確認します。

```
ftp> cd out
250 Directory successfully changed.
ftp> dir
229 Entering Extended Passive Mode (|||48742|).
150 Here comes the directory listing.
-rw-r--r--    1 30470    1005     13249885 Oct 26 15:04 GameOnSL1.wmv
226 Directory send OK.
ftp> get GameOnSL1.wmv
```
iTerm2でColorsにJapanesqueを設定する

iTerm2のColorsにJapanesqueを設定しみます

## <i class="fa fa-files-o" style="font-size:1em;"></i> 設定手順
* GitHubの[aereal/dotfiles](https://github.com/aereal/dotfiles)をclone
* Preference => Colors => Load Presets => Import
    * `colors/Japanesque/Japanesque.itermcolors` を選択
* ColorsにJapanesqueが追加されました

<img width="945" alt="theme.png" src="https://qiita-image-store.s3.amazonaws.com/0/43480/1b69253c-eb61-e2b3-1758-c59f11ac34d7.png">

## <i class="fa fa-bookmark" style="font-size:1em;"></i> 外部資料
* <i class="fa fa-external-link" style="font-size:1em;"></i> [iTerm 2 で使えるカラースキーム、Japanesque を作った](http://this.aereal.org/entry/2013/01/02/222304)
* <i class="fa fa-external-link" style="font-size:1em;"></i> [aereal/dotfiles - GitHub](https://github.com/aereal/dotfiles)
nginxのWebDAVでMOVE時に一部クライアントで動かない対策

nginxはWebDAVの仕様通りに実装されているのだが、結果として動かなくなっているので修正する

# 修正箇所
以下を削除してビルドする
https://trac.nginx.org/nginx/browser/nginx/src/http/modules/ngx_http_dav_module.c#L621

```c
    if ((r->uri.data[r->uri.len - 1] == '/' && *(last - 1) != '/')
        || (r->uri.data[r->uri.len - 1] != '/' && *(last - 1) == '/'))
    {
         ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
                       "both URI \"%V\" and \"Destination\" URI \"%V\" "
                       "should be either collections or non-collections",
                       &r->uri, &dest->value);
         return NGX_HTTP_CONFLICT;
    }
```

一応ビルドオプション

```
./configure --prefix=/usr/local --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --with-http_ssl_module --with-http_stub_status_module --with-http_gzip_static_module --with-http_spdy_module --with-http_dav_module --add-module=./nginx-dav-ext-module --with-debug
```

# 事象
MacのCyberduckがWebDAVのMOVEメソッド時にRequestの`Destination`項目に移動先がディレクトリにもかかわらず`/`を付けて送信しないため、WebDAVの仕様通りに実装してるっぽいnginxのwebdavモジュールがNG判定してくれるのが原因。

```
MOVE /test2/ HTTP/1.1
Destination: http://hoge.com/test/test2
Overwrite: T
Host: hoge.com
Connection: Keep-Alive
User-Agent: Cyberduck/4.7.2.18004 (Mac OS X/10.11) (x86_64)
Accept-Encoding: gzip,deflate
```

この処理除いても、それ以降にディレクトリかどうかとかチェックしてるので大丈夫でしょう。
実体参照されるまでわからなくなるのでパフォーマンスは低下するかも。
iTerm2で💩に反応してAlertを表示する

:poop: の例はともかく、vagrant upなど時間のかかる処理を行う際に
終了時のアラートを表示するのは便利です。  

## <i class="fa fa-files-o" style="font-size:1em;"></i> 設定手順
* Preference => Profile => Advanced
* TriggersのEditを選択
* Alert条件を設定する

<img width="1036" alt="iterm_alert.png" src="https://qiita-image-store.s3.amazonaws.com/0/43480/ff571c22-40f9-62b2-85c3-45249aa71436.png">

## <i class="fa fa-flask" style="font-size:1em;"></i> 試行
3秒寝ると :poop: がでるスクリプトで実験します。

![iterm_alert.gif](https://qiita-image-store.s3.amazonaws.com/0/43480/343b8547-f897-a0bb-0c3e-49c4420f03b8.gif)
XtraFinderやTotalFinderから移行する先のFinder代替アプリ候補

今まで Finder 拡張として XtraFinder を使っていたのだが、以下の記事を見てOS X 10.11 “El Capitan” では使えないらしい事がわかった。

> El CapitanではXtraFinderやTotalFinderではなくForkliftを使おう | Stocker.jp / diary
> http://stocker.jp/diary/el-capitan-forklift/

SIPの詳しい話はともかく手元に Forklift はあったので試しているが、他にもありそうだなと思い代替品をググってみた。

なお、どれもまだ試してはいない。

##### ※2015/10/28追記
Commander OneとPathFinderを試してみた。前提としてFinderを置き換えられるオプションが欲しかったので、"完全にFinderを置き換えることのできる" PathFinderをお試し期間利用している。

CommanderOneはどちらかというとFTPクライアント、そういったファイラーの文脈にある使いごこちで、前述のオプションも見当たらないため Forkliftと同じくFinder代替としては求めているものではなかった。「◦◦を標準のファイラーとして使用する」、の様なオプションがOSXのどこかにあるのだろうか？今一度確認はしてみたい。

## Commander One
OS X 10.11に対応している拡張ではなく代替アプリ。現在、TotalFinder ユーザー向けに50%OFFキャンペーンを実施してる。＄30が＄15。

そもそも TotalFinder の代替品として開発をしていたとか。
機能は十二分っぽくて良さそう。

> Dual-pane file manager for Mac - Commander One
> http://mac.eltima.com/totalfinder-promo.html

## PATH FINDER 7
El Capitanに対応していて、こちらも拡張ではなく代替アプリ。クーポンコード"TOTALFINDER "を入力すると50%OFFらしい。＄40が＄20。

詳しくは知らないが、古参のアプリらしいし、ぽい。

> Path Finder 7 by Cocoatech
> http://www.cocoatech.com/pathfinder/

## その他
とにかく試していないのでなんとも言えないが、言及やサイトの雰囲気安心できそうなのは以上の二つで、他にもいろいろあるらしい。以下はその一覧。

> Unclutter for Mac
> http://unclutterapp.com/

> DCommander - Advanced File Manager for Mac, with FTP, SCP and ZIP
> http://www.devstorm-apps.com/dc/

> CRAX Commander
> http://crax.soft4u2.com/

## 備考
代替アプリが通常のFinderと同じように、「フォルダを開いたら起動」してくれるなら、選択肢は多いので楽しく選べそうだ。

## 参考ページ
> TotalFinder alternatives - TotalFinder - BinaryAge
> http://discuss.binaryage.com/t/totalfinder-alternatives/4124

> Do More With Finder for Mac: Third Party Applications - Tuts+ Computer Skills Tutorial
> http://computers.tutsplus.com/tutorials/do-more-with-finder-for-mac-third-party-applications--cms-24577

> Commander One offers Mac users a potent Finder alternative - TechRepublic
> http://www.techrepublic.com/article/commander-one-offers-mac-users-a-potent-finder-alternative/

## 検索方法メモ
期間 1年〜1ヶ月以内で「mac totalfinder alternative」「mac finder alternative」でググった。
MongoDB3系をAmazon Linux(EC2)にインストールする

AWSのAmazon LinuxにmongoDB3系をyumで入れたメモ
参考: [Install MongoDB on Amazon Linux — MongoDB Manual 3.0](https://docs.mongodb.org/manual/tutorial/install-mongodb-on-amazon/)

## 手順

####リポジトリの追加
まずyumにmongodbを登録する必要があります。

```bash
echo "[MongoDB]
name=MongoDB Repository
baseurl=http://repo.mongodb.org/yum/amazon/2013.03/mongodb-org/3.0/x86_64/
gpgcheck=0
enabled=1" | sudo tee -a /etc/yum.repos.d/mongodb.repo
```

### インストール
最新版をインストールします。

```bash
sudo yum install -y mongodb-org
```

バージョンを指定する場合

```bash
sudo yum install -y mongodb-org-3.0.7 mongodb-org-server-3.0.7 mongodb-org-shell-3.0.7 mongodb-org-mongos-3.0.7 mongodb-org-tools-3.0.7
```

### バージョンの確認

```bash
mongo --version
```

### 起動

```bash
sudo service mongod start
```

自動起動するようにする

```bash
sudo chkconfig mongod on
```
VMware vCenter Server 6のインストール

# vCenter Server 6はブラウザでインストール

業務で複数のESXiサーバを管理するvCenterサーバの6を入れる機会があったのですが、5以前と違って、ブラウザ画面上だけでサーバのOSから何から入れてしまえるというところにカルチャーショックを受けたので、メモ。

因みに関係者にvCenterサーバをOSインストールから全部ブラウザで出来る様になったと言っても、意味が分からないと言われました（笑）

# 今回の前提条件

- 既に構築済のESXiサーバがある。
- アプライアンス版(SUSELinuxベース)を選択しても良い。

# 今までと比較したメリット

- 高額なWindowsServerライセンス料が不要
- ブラウザ経由でインストールできるので簡単

# 今までと比較したデメリット

- 特に思いつきません（笑）

# Ver６のインストール方法の概要

1. インストーラのISOをマウントすると、vcsaというフォルダがあるので、その中の「VMware-ClientIntegrationPlugin-6.0.0.exe」を実行してブラウザ用のプラグインをインストール。
2. ルートフォルダにある「vcsa-setup.html」をブラウザで開く。
3. ブラウザでインストーラ画面が表示されるので、後は今までと同じく必要事項を入力して進めるだけ。PSCを組み込みにするか外部にするか、という点が今までに無かったですが、1台のvCenterしか構築しないなら組み込みでOKです。
4. インストールが終わったらvSphereクライアントで接続可能となりますが、クライアントもブラウザです。URLが表示されるので、そこからIDとパスワードを入れるとブラウザで見慣れたクライアントに似た画面が表示されます。

# 雑感

最近は何でもブラウザでできてしまうようになっていて凄いですね。
そういえば、物理サーバのインストールさえも、ブラウザでOSインストール前のサーバにアクセスして出来るようになってますよね。
あらゆる事が全てブラウザだけで実現してしまう時代が来てもおかしくなさそうです。

# 参考にしたサイト

[VMware vCenter Server 6のインストール](http://thinkit.co.jp/story/2015/04/14/5836/page/0/2)
compass createすると固まる時はcompass-railsを確認しよう


[semantic-UI](http://semantic-ui.com/)の練習を兼ねて久々にフロント開発しようと思い、じゃあ`compass create`しますかー！とコマンドを打つと…

何も表示されない。

そのまま、待てど暮らせど何も表示されず、`<Ctrl-C>`で強制停止。
すると

```
^CInterrupt on line ["18"] of /Library/Ruby/Gems/2.0.0/gems/compass-rails-2.0.0/lib/compass-rails.rb:
Run with --trace to see the full backtrace
```

いやRubyで書かれたパッケージとか読めませんわ、と思ってスルーしていろいろ調べてみるも、そもそもコンソールに何も出ないから検索のしようもなく悩む…。

で、もう一度ログを見てみると、なんかパスが…`compass-rails-2.0.0`を見に行ってる！！！

今ローカルでRuby on Railsは全く触る気がないので迷わず

```bash
sudo gem uninstall compass-rails
```

今回はこれでよいけれど、railsとcompassとcompass-railsは同居するとあんまり良いことなさそうな記事が散見されるから、次Rubyを触る時は開発環境を仮想化してしまおうか固く決意しました。

あと、 **わからないなりにでもログの大事そうなところは1文字1文字読もう。**
【swift】変数によく付いている「！」や「？」（ビックリマーク・クエスチョンマーク）の説明

# オプショナルデータ型
```swift
var strA:String?
var intA:Int!
```
swiftをやっていると上のような引数の宣言を見たことがあると思います。
他の言語ではあんまり見ない仕様なので、私自身困惑をしました。
この解説をしていきたいと思います。

swiftだと、データを用いる際「オプショナル」という情報を持たすことができます。

#オプショナルとは
・"変数にnul(null)が入っているかもしれないよ？"
・"予想しているデータ型と違うかもよ？"

と言った情報のことです。


#?（クエスチョンマーク）の意味
では実際にどのようなものなのかコードを見てみようと思います。

```swift
var strA:String?
strA = nil //問題なく実行できます

var strB:String
strB = nil //エラーが出る
```
つまり、?をつけていないと「絶対にnil(null)は入れたらダメだからね」という意味になります。
反対に、?をつけていると「nil入っているかもしれないけどいいんじゃない？」という意味になります。
デフォルトでは、nilは許容しないとおぼえていたほうがいいですね。

# ！（ビックリマーク）の意味
以下の様なコードを見ることがあります。

```swift
var strA:String?
strA!
```
この！（ビックリマーク）はアップルのマニュアル『The Swift Programming Language』で”Forced Unwrapping”と説明されており”Forced Unwrapping”とは、直訳すれば”強制的に包装を解く、あける”といった意味になるでしょう。

変数を強制的に開封し、そこに爆弾であるnul(null)が含まれていた場合エラーが起きるということになります。

以下は具体的なコードです。

```swift
var strA:String?
strA = "不発弾"
strA! //爆発はしない（エラーはでない）

var strB:String?
strB = nil
strB! //爆発する（エラー）
```
ということになります。

#補足
上記の例のコードはすべてString型ですがInt型も同様にnil(null)の確認を行います。

#まとめ
・基本的に変数に？（クエスチョンマーク）がついていればエラーにならない
・nilが入っているか確かめたいのであれば！（ビックリマーク）を使用し、nil(null)チェックを行う。
Webページが表示されるまで

一般的なwebページをブラウザで表示するまでの流れをかなり大雑把にメモ
# 流れ
<ol>
<li>HTTPリクエスト</li>
<li>HTTPレスポンス</li>
<li>返ってきたHTMLの評価</li>
<li>レンダーツリーの構築と描画</li>
</ol>

# HTTPリクエスト
## DNSルックアップ
アクセスしようとしているURLに含まれるドメイン名からアクセスすべきホストのIPアドレスを取得します

```
http://hoge.com
↓
◯◯.◯◯.◯◯.◯◯
```
## TCP接続の確立
3ウェイハンドシェイクと呼ばれる手法でTCP接続を確立させます
通信の信頼性を担保する必要があるため、この手続きが発生します
<a href="https://ja.wikipedia.org/wiki/3%E3%82%A6%E3%82%A7%E3%82%A4%E3%83%BB%E3%83%8F%E3%83%B3%E3%83%89%E3%82%B7%E3%82%A7%E3%82%A4%E3%82%AF">
<img src="https://upload.wikimedia.org/wikipedia/commons/9/9a/Tcp_normal.svg" alt="" width="300" /></a>

## HTTPリクエスト
TCP接続が確立したら、データをHTTPリクエストとして送信します

```
GET / HTTP/1.1
Host: hoge.com
```
# HTTPレスポンス
サーバーへとHTTPリクエストを送信したら、それに応じたレスポンスが返ってきます
静的なHTMLを返す場合もあれば、サーバーサイドでHTMLを動的に生成して、返す場合もあります。

# 返ってきたHTMLの評価
サーバーからHTMLを取得すると、ブラウザでDOMが構築されます
linkタグ、imgタグ、scriptタグなどのサブリソースがあれば順次HTTPリクエストが発生します
画像、CSS、JavaScriptなどもこのタイミングでロードされます

# レンダーツリーの構築と描画
サブリソースのロードが終わるといよいよ描画計算をします
DOMとCSSのスタイル情報をもとに、描画すべき要素の視覚情報を計算します
画像などはデータをビットマップデータにデコードして描画処理に回されます
[milkcocoa] milkcocoa コネクションを切断する方法

# milkcocoa コネクションを切断する

## 追記
非同期なのを忘れてたので追記です。
milkcocoaで色々したい場合は接続後にする必要があります。

## onConnected(func)
`onConnected(func)`メソッドを使うと、良いです。
使い方は次に書きます。

## milkcocoa.disconnect()
milkcocoaオブジェクトのメソッド
`disconnect()`
を使用すると切断できます。

```js
// 接続を試みる
var milkcocoa = new Milkcocoa('api-key.mlkcca.com');

milkcocoa.onConnected(function(){
  console.log('接続完了');
  // ここでデータの保存や取得などの処理を行う
  // 不要になったら切断
  milkcocoa.disconnect();
});

```

## なぜ切断する必要があるのか

理由は人によると思いますが、私の場合は単純にデータベース感覚で使いたかったので、無料枠の20コネクションを超えないように使用するときだけ接続して、使い終わったら切断したかったからです。

## そもそもmilkcocoaとは
詳しく説明はしませんがこれです。
https://mlkcca.com/
秋のAzure勉強会に参加しました

# 勉強会の基本情報

* 【日　時】2015年10月24日 13:00~18:00
* 【会　場】〒108-0075 東京都港区港南 2-16-3 品川グランドセントラルタワー 日本マイクロソフト 品川本社 (SGT) 31F セミナールーム A
* 【参加費】無料
* 【主　催】Japan Azure User Group
* 【申し込み】https://jazug.doorkeeper.jp/events/31734

# 概要
 * Windows10 IoTとAzureでお手軽IoT入門	吉野翼
 * Azure データストア概要	亀渕 景司

# 内容

## Windows10 IoTとAzureでお手軽IoT入門	吉野翼

### IoTの未来

* データ量は[ムーア法則](https://ja.wikipedia.org/wiki/%E3%83%A0%E3%83%BC%E3%82%A2%E3%81%AE%E6%B3%95%E5%89%87)以上に伸びている、2020年20ZB([ゼタバイト](https://ja.wikipedia.org/wiki/%E3%82%BC%E3%82%BF%E3%83%90%E3%82%A4%E3%83%88) = 1TB*1024*1024)に達成する勢い
* 感想： WEB時代に、ユーザは手動でデータを入力して、データの量はユーザ数より、何倍に増えたが、IoT時代にデバイスの数だけじゃなくて、一つのデバイスのデータ量が多いなので、システム全体のデータ量も多い。mysqlなどSQL DBも利用できるか？自作のDBシステムを利用できるか？いろいろ問題があると思う

### AzureとIoT

* IoTを支えるAzure
    * 収集： Azure IoT Hub, Azure Event Hub
    * 加工： Stream Analytics, Data Factory
    * 保存： DocumentDB, storage table
    * 分析： Machine Learning, Data Lake
* https://azure.microsoft.com/en-us/documentation/articles/architecture-overview/

### Azure IoT Suite

* IoTポータル的なサービス
* それぞれの機能はAzureの単体サービス
* デバイス監視、データ解析、IoTの一連機能、わかりやすくシンプル的な課金モデル

### IoT時代の考え方

* 大量のトラフィック、大量のデバイス、大量のビジネスチャンス
* デバイスの小型化
* ビッグデータ収集の安定した基盤
* 迅速な構築
* 電源効率向上
* 省エネ
* 大量のトラフィック処理
* データの活用
* セキュリティ
* シンプルな実装

### IoT時代のプロトコル

* HTTP/HTTPS
* AMQP
* MQTT

### AMQP

* 金融系の取引メッセージ基盤
* 信頼性と負荷がトレードオフ
* Job Queueで負荷分散
* IoTデバイスに優しくない重い（マイコンレベルだと重すぎて無理ぽい）

### MQTT

* 軽量、シンプル
* １対Nに特化
* 低速、不安定環境での利用想定
* HTTPの1/10~1/100のトラフィック量
* 消費電力が1/10以下

### Azure IoT Hub

* デバイス監視機能
* Event Hubとコンパチで動作
* プロトコル： HTTP/HTTPS, AMQP, (MQTT: 頑張ってできる）


## Azure データストア概要	亀渕 景司

### いろいろなAzure Storageが紹介された

* Storage BLOB/table/File, SQL Database, DocumentDB, Redis Cache
* Azure Search, SQL Data Warehouse, Data Lake, Backup

### Azure BLOB Storage

* ドキュメントなどいわゆるファイル用のストレージ
* テキストやバイナリなど
* ブロックBLOB, ページBLOB, 追加型BLOB

### Azure Table Storage

* Key/Value
* その他のデータストアーと比べ安価

### Azure File Storage

* 共有フォルダとして使えるストレージ
* SMB3.0対応
* ACL無し

### DocumentDB

* NoSQLベース
* JSONドキュメント
 

# 感想

* IoT Hub中心として、IoT SuiteがいろいろなIoT機能が提供されている。Google, AWSと同じで、IoTサービスじゃなくて、いろいろなサービスを組み合わせて、Suiteとして提供される
* AWS, GCP, AzureのIoT Suiteが、各特点があって、目的よりどうなサービスを選択することを考えないといけない
xmpppyで'_ssl._SSLSocket' object has no attribute 'issuer' 


なんか、xmpppyで通信しようとすると表題のエラーで失敗します。どうもSSL周りの動きがおかしい。ググっていると[こちら](http://terminus.ignaciocano.com/k/2015/02/03/solucionado-el-error-attributeerror-_ssl-_sslsocket-object-has-no-attribute-issuer-en-ubuntu-utopic-unicorn/)を発見。

どうもパッチ適用でいけるっぽい？ちなみに手元のバージョンはこちら

```bash
[sayamada@PyXmppClient]$pip freeze|grep xmpp
xmpppy==0.5.0rc1

```

* パッチ
https://raw.githubusercontent.com/freebsd/freebsd-ports/master/net-im/py-xmpppy/files/patch-xmpp-transports.py

```patch
--- xmpp/transports.py.orig	2010-04-06 21:05:04.000000000 +0800
+++ xmpp/transports.py	2010-04-06 21:05:20.000000000 +0800
@@ -27,7 +27,7 @@ Transports are stackable so you - f.e. T
 Also exception 'error' is defined to allow capture of this module specific exceptions.
 """
 
-import socket,select,base64,dispatcher,sys
+import socket,ssl,select,base64,dispatcher,sys
 from simplexml import ustr
 from client import PlugIn
 from protocol import *
@@ -312,9 +312,9 @@ class TLS(PlugIn):
         """ Immidiatedly switch socket to TLS mode. Used internally."""
         """ Here we should switch pending_data to hint mode."""
         tcpsock=self._owner.Connection
-        tcpsock._sslObj    = socket.ssl(tcpsock._sock, None, None)
-        tcpsock._sslIssuer = tcpsock._sslObj.issuer()
-        tcpsock._sslServer = tcpsock._sslObj.server()
+        tcpsock._sslObj    = ssl.wrap_socket(tcpsock._sock, None, None)
+        tcpsock._sslIssuer = tcpsock._sslObj.getpeercert().get('issuer')
+        tcpsock._sslServer = tcpsock._sslObj.getpeercert().get('server')
         tcpsock._recv = tcpsock._sslObj.read
         tcpsock._send = tcpsock._sslObj.write
 

```

ということで、当ててみたところ無事に解消しました。
【swift】【Xcode7】Int,String,Douleの変換の仕方

String型からInt型に変換するのに

```swift
var strA = "100"
var intA = strA.toInt()?

```
って書いてあるブログが多かったんですけど、そのまま書いてもコンパイルエラーが起きたので調べたらやっぱり仕様が変わっていました。(仕様が変わっているのを知らなかった…)
ということで、メモ書き程度に書いて置きます。

# Int型→String型
```swift
var intA = 100

var strA = String(intA)

var strB = intA.description
```
#Int型→Double型
```swift
var intA = 100

var doubleA = Double(intA)
```
#Double型→Int型
```swift
var doubleA = 1.0

var intA = Int(doubleA)
```

#Double型→String型
```swift
var doubleA = 1.0

var strA = String(doubleA)
```

#String型→Int型
```swift
var strA = "100"

var intA = Int(strA)
```
#String型→Double型
```swift
var strA = "1.009"

var doubleA = atof(strA)
```

大体使用するのはInt型からString型とString型からInt型なのかな。  
基本的に変換するときは、変換したい変数名を変換した型で（）くくりにすればおｋな感じ。
String型からDouble型はちょっと違うけど。
Swift2.1の地味に嬉しい変更点

文字列リテラルの中に文字列リテラルを入れれるようになりました。

```swift
"\("")"
```

下のようにメソッドの引数で文字列を使う時に楽になりそうです。

```swift
import SwtftDate

let date = NSDate()
let label = UILabel()
label.text = "時間: \(date.toString(format: .Custom("YYYY-MM-dd")))"
```

## tvOS関連
`@available`でtvOSが使えるようになっていました。

```swift
@available(tvOS 1.0, *)
func method() {}
```

## 参考URL
[Document Revision History](https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/RevisionHistory.html#//apple_ref/doc/uid/TP40014097-CH40-ID459)