OmniAICreator/Qiita-1.07M huggingface dataset:
初心者がAndroidアプリを作成したお話し

#概要

　Androidアプリ開発未経験だった私が作りたかったアプリをリリースした経緯(なにをしてきたのか)をお話しします。これからAndroidアプリ開発を始められる方の参考になればと思います。

#1.開発環境の導入
　まずは作る環境がないと始まらんということで、Androidアプリ開発に必要な開発環境であるAndroid Studioやjavaをインストールしました。これに関しては、ググれば丁寧に導入手順が記載されたページがあったので、それを参考にしました。何回かエラーが発生しましたが、Google大先生の助けもあり無事終了できました。

#2.書籍を使って学習
　全くの未経験だった私は、まずどのようにして作れるのか想像もつかない状態だったので、「ゼロからAndroidアプリを開発するまで」みたいなタイトルの入門書を読んで、書いてある手順にもとづき実際に手を動かして作ってみました。ここである程度の開発の流れをつかむことができました。
　しかし、私はAndroidアプリ開発の学習を書籍で行うことはお勧めしません。なぜなら、本に書いてある開発環境のバージョンと最新バージョンとの差異により、本に書いてある通りにコード書いてみても動かないことが往々にしてあるからです。また、書籍に書いてある手順にしたがってアプリ作るのは、時間がかかる割に、技術的な知識はあまり身につかないのであまり効率が良くないと感じました。
　わたしはこれまで３冊ほどAndroidアプリ関連の書籍を買いましたが、どれもほとんど使わなかったです。


#3.学習サイトを使って学習
　ある日、私は友人に薦められ、あるプログラム学習サイトの「ドットインストール」の存在を知りました。

-ドットインストール-
http://dotinstall.com/

　動画でプログラム学習ができるサービスなのですが、実際に開発風景を動画で見ながら学習できるので、開発のイメージをつかみやすいです。また一つの動画がたった３分なので、途中で挫折することなく継続できました(書籍で勉強を始める前に知りたかった)。
　私は「これは良い！」と思い、Android学習関連の動画を全て見ました(ただし、Android関連の学習動画は有料プレミアム会員じゃないと見れません)。これにより技術的な知識を得られました。

#4.開発開始
　アプリ開発のイメージをできるようになったので、実際にアプリを作り始めました(どんなアプリを作るかは最初から決めてました)。わからないことは、ググったり、「そういえばドットインストールでやってたな」と思い出して動画を見返したりしながら進めました。
　ここでググる際の注意なのですが、Androidアプリ開発は技術の移り変わりがはやく、一年たつと同じ機能でもまったく作り方が変わったり、メソッドが非推奨になったりするため、なるべく投稿日時が新しいページを見たほうがいいと思います。
　わたしは、よくググるときは以下のように、「１年以内」に期間指定して調べたりしています。
![県s買う.png](https://qiita-image-store.s3.amazonaws.com/0/102567/5c9b2fc4-9d61-607b-ca80-db16b52c87c4.png)

##テラテイル
　また、わからないことを調べても全然でてこないし、わからないし、時間だけが費やされていく状態になった場合(頻繁にあった)は、「teratail」というサービスを使ってました。

-teratail-
https://teratail.com/

一言でいうとヤフー知恵袋のプログラマ版みたいなものです。質問してから回答くるまでの時間が比較的早く、回答が全く来ないということも少ないので、おすすめです。

##英語でググる
　わからないことを英語でググって海外のサイトを閲覧してみたりもしました。英語圏のほうがエンジニアの数が多いため、それだけ情報量も多く、ほしい情報が見つかりやすいです。私はあまり英語ができませんが、Google翻訳を使ってなんとかしました。Google様様です。
　ちなみにAndroid開発関連で英語でググると「stack over flow」とかかれたページがヒットしやすかったです。
　日本語でググっても全く解決できなかった問題が、英語でググったらすんなり解決したということも結構ありました。

##Android公式サイトを見る
　あとはAndroid公式のAPIガイドを見て各クラスライブラリの仕様を学びました。
http://developer.android.com/intl/ja/guide/index.html

#5.最後に
 アプリを開発していると問題が解決せず丸一日つぶしてしまったりすることもざらにある(少なくとも私はあった)ので、そういったことで挫折してしまうケースも少なくないと思います。
私は、そんなときはホリエモンさんの
「自分の作りたい物作っちゃえばプログラミングなんて勝手に身につくよ」
という言葉を思い出して、気持ちを持ち直してました。何とか作れるものなのです。

この記事がこれからアプリ開発を始めようとしている人が開発に踏み出すきっかけとなれば幸いです。

あと、最後に私が最初に作成したアプリを載せます。ぜひ使ってみてください。
https://play.google.com/store/apps/details?id=jp.wings.nikkeiibp.napalerm
CURLでWebSocketに接続するコマンドメモ


完全では無いですがメモ

```
curl -i -N -H "Connection: keep-alive, Upgrade" -H "Upgrade: websocket" -H "Sec-WebSocket-Version: 8" -H "Sec-WebSocket-Extensions: deflate-stream" -H "Sec-WebSocket-Key: WIY4slX50bnnSF1GaedKhg==" -H "Host: localhost:8080" -H "Origin:http://localhost:8080" http://localhost:8080/chat
```
UITableViewController/UITableViewの実装メモまとめ


UITableViewの実装メモのまとめです。

## ViewControllerとUITableViewのデータの紐付け
### ViewControllerにUITableViewDataSource、UITableViewDelegateを継承
```ViewController.swift
class ViewController.swift : UIViewController, UITableViewDataSource, UITableViewDelegate {

```

### Storyboardでdatasourseとdelegateを設定
TBD

## 一覧のセルに動的に情報を設定/表示する
```ViewController.swift
func tableView(table: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        // Storyboardで設定したTable View CellのIdentifierを設定し、
        // Cellに設定するコンポーネントのレンダリング処理を実装
        let cell = table.dequeueReusableCellWithIdentifier("", forIndexPath: indexPath)
        return cell
}
```

## 一覧選択時のイベント
```ViewController.swift
func tableView(table: UITableView, didSelectRowAtIndexPath indexPath:NSIndexPath) {
        // 一覧のCell選択時イベント内容を実装
}
```
## 編集モードがある一覧の実装
TBD

## 参考
* [UITableView の編集モードを利用してデータの削除や並び替えを行う](http://himaratsu.hatenablog.com/entry/tableview/editmode)
* [UITableViewCell を左スワイプしてボタンを表示するUI](http://koze.hatenablog.jp/entry/2015/06/16/220000)
* [UITableViewのメモ](http://devmemo.blog116.fc2.com/blog-entry-85.html)
minecraft serverを1.8から1.9にバージョンアップする

# 概要
1.8の時に立てたマルチサーバ(バニラ)を1.9にバージョンアップする際に行った作業のメモです。
<blockquote class="twitter-tweet" data-partner="tweetdeck"><p lang="en" dir="ltr">Combat Update (1.9) unleashed! Chunky shields! Better fighting! Funky wings! Cute Shulkers! Evil skeleton riders! <a href="https://t.co/4yNTsWfuCv">https://t.co/4yNTsWfuCv</a></p>&mdash; Minecraft (@Minecraft) <a href="https://twitter.com/Minecraft/status/704336990188257280">February 29, 2016</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

# 環境

```bash
[minecraft@localhost ~]$ cat /etc/redhat-release 
CentOS release 6.6 (Final)

[minecraft@localhost ~]$ java -version
java version "1.7.0_75"
OpenJDK Runtime Environment (rhel-2.5.4.0.el6_6-x86_64 u75-b13)
OpenJDK 64-Bit Server VM (build 24.75-b04, mixed mode)
```

# 手順
* 1.9のマルチサーバを準備

```bash
#jarのダウンロード(https://minecraft.net/download で最新版を確認)
[minecraft@localhost ~]$ mkdir minecraft-1.9
[minecraft@localhost ~]$ cd minecraft-1.9/
[minecraft@localhost minecraft-1.9]$ wget https://s3.amazonaws.com/Minecraft.Download/versions/1.9.2/minecraft_server.1.9.2.jar

#起動確認
[minecraft@localhost minecraft-1.9]$ echo "eula=true" > ./eula.txt
[minecraft@localhost minecraft-1.9]$ java -Xmx1024M -Xms1024M -jar minecraft_server.1.9.2.jar nogui
```

* データの引き継ぎ

```bash
#ゲームデータ
[minecraft@localhost ~]$ cp -r minecraft-1.8/world/ minecraft-1.9/

#ホワイトリストやBANリストなど（必要に応じて）
[minecraft@localhost ~]$ cp minecraft-1.8/whitelist.json minecraft-1.9/
```

以上で1.8のデータを引き継いでバージョンアップすることができました。
gcc 4.7 以前では node-iconv のビルドに失敗する

## TL;DR

以下が必要なようです。

* gcc, g++ >= 4.8
* python >= 2.7.3

CentOS 6.x でインストールを実施していました。
CentOS 6.x では、デフォルトで入っている gcc のバージョンが古いので、失敗するようです。筆者の環境では v4.4.7 でした。
GitHub 上の node-iconv のリポジトリにイシューが上がっているのを見つけました。

- [Cannot install iconv via npm · Issue #99 · bnoordhuis/node-iconv](https://github.com/bnoordhuis/node-iconv/issues/99)
- [Cannot install iconv · Issue #129 · bnoordhuis/node-iconv](https://github.com/bnoordhuis/node-iconv/issues/129)

筆者の環境でも同様のエラーが発生しました。

gcc の新しいバージョンの RPM は、調べた範囲ではなさそうで、最新の 5.3 をソースからビルドしたところ、node-iconv がインストールできるようになりました。

- [gist - gcc ビルド手順](https://gist.github.com/key-amb/0dd7099c71e8d6bc888765861ee8e57b)

以上。

## 参考

- [npmでのiconvインストールがコケた話 - /dev/null](http://gitpub.hatenablog.com/entry/2014/06/08/221606)
- [さくら VPS 上に gcc4.8 をインストールする方法 - kawa0810 のブログ](http://kawa0810.hateblo.jp/entry/20130605/1370449220)
全てHTMLエレメントのスタイルを変更する

#１。HTML DOMを使いって、全てHTMLエレメントのスタイルを変更する

    var key = "..."
    var value = "..."
keyはCSSプロパティです。はCSSプロパティのバリュー
です。例：

    var key = "margin"
    var value = "10px"
keyがある全てHTMLエレメントのスタイルを検査する。

    $('*').filter(function () {
         return $(this).css(key)
    })
コンディションで全てHTMLエレメントのスタイルを検査する。

    $('*').filter(function () {
         return $(this).css(key)==value
    })

全てHTMLエレメントのスタイルを変更する

    $('*').filter(function () {
         return $(this).css(key, value)
    })

**class**と**id**

    $('#abc *').filter(function () {
         return $(this).css('margin')
    })
#２。Regexを使いって、全てHTMLエレメントのinlineCSSを変更する
innerHTMLはRegexでinlineCSSを変更する

    var html = document.body.innerHTML;
    html = html.replace(/(?=[^<>]+:|\s*")margin:(?=[^<>]+:|\s*")/g, '');
    $(document.body).html();
GithubへのPUSHを定期実行するCrontabとシェルスクリプトの作成方法

#目的
・1日に1回とかの定期実行を行いたい
・実行時に、GithubにもPUSHを行いたい

#環境
OS : CentOS 6.7

#構築方法
##Crontabの導入方法
以下のコマンドを実行して、crontabをインストール
```yum install crontab
```

以下のコマンドを実行して、Crontabの内容を編集する
``` crontab -e ```

vimと同じ操作になる。"a"や"i"を入力してインサートモードにする。
定期実行する時間＋処理内容を1行で記述する。
```1/* * * * * echo `date` >> out```
上記書き方だと、1分ごとに、時刻をoutに出力することになる。

ちなみに、実行時は、ユーザーのホームディレクトリから実行されることになるので、ユーザーのホームディレクトリのoutが作成され、出力されていくはずである。


## Githubへの定期PUSHの実行のシェルスクリプトの書き方

Crontab -eの中に直接書いてしまっても構わないが、あまり美しくない。
このため、シェルスクリプトを用いてGithubと連携することを考える。
すでにGithubにSSH接続等によりログイン情報を要求されない状態が構築されているものとする。

```
#!/bin/sh
cd /**/**/full path/ ; git add -A ; git commit -m "Git Push Agent by crontab " ; git push ; 
 ```
上記のように、一連のコマンドを全て";"でつなぎ、1行で書く必要がある。
なぜかというと、各コマンド実行ごとにホームディレクトリに戻ってしまうため。
フルパスで実行出来る場合は、別行でも構わないが、ディレクトリ場所が必要なものは、全て1行で構成されるシェルスクリプトを用意する必要がある。
PHP7で、mysql_connect()が無いと怒られる件　（undefined function mysql_connect）

解決に時間がかかったので備忘として残す。
（主原因は思い込み）

新規案件で、PHPやることになったので
PHPの7入れてDB接続の確認しようとしたら

Fatal error: Call to undefined function mysql_connect() 
と怒られ・・・
検索して、色々見た結果
※ver5.5以降ではmysql_系関数が使えないらしい。（既存は5系）
※まさか、Verアップで使えなくなる関数が有るとは思ってなかった

解決策は２つ
１、mysql_系関数を mysqli_系関数に書き換える。
　例：mysql_connect(。。。)
　　　　↓ 
　　　mysqli_connect(。。。) 

２、古いモジュールを使用する（php-mysqlを入れる等）

既存システムをそのまま使いたいなら「２」だけど、
後ろ向き対応な気がするし、今回は新しい案件なので、
「１」で対応していきたい。
自動生成されたプロパティのアクセサにブレークポイント

今更感が強いですが、Objective-Cはまだまだ現役です！

# 自動生成されるプロパティ
最近のObjective-Cの常識では、特別な処理を行わないプロパティの実装はコンパイラ任せにするのがよいとされています。

こんな感じですね。

```objc:ClassA.h
#import <Foundation/Foundation.h>

@interface ClassA : NSObject

@property (copy) NSString *name;

@end
```

```objc:ClassA.m
#import "ClassA.h"

@implementation ClassA

@end
```

# ブレークポイントはどこに設定すればいいの？
自動生成されたプロパティへ誰がアクセスしたのかを確かめたい。そのためにブレークポイントを仕込みたいけどどこに仕込めばいいか分からない。仕方がないから自分でアクセサを書く。そんなことはないでしょうか？
実は何も書かなくてもここにブレークポイントが仕込めます。

![スクリーンショット 2016-04-05 20.25.40.png](https://qiita-image-store.s3.amazonaws.com/0/2117/3673763b-54a9-8a75-0e63-18e6385e1e87.png)

プロパティの宣言部にブレークポイントを仕込めば、setter, getter双方にブレークポイントを仕込んだことになります。
問題解決ですね。

# setterだけでいいんだけど...
setterを確認したいだけでgetterはどうでもいい。というか、いちいちgetterで止まられると頻繁に止まりすぎてデバッグにならない。

そんな時は、setterだけにブレークポイントを仕込みましょう。
ポイントはアクセサは自動ではあるけど実装されている、ということです。

このようにすればブレークポイントが仕込めます。

ブレークポイント ナビゲータのブレークポイントの追加から「　Add Symbolic Breakpoint...」を選び、
![全画面_2016_04_05_20_28.png](https://qiita-image-store.s3.amazonaws.com/0/2117/1a0ac200-71a2-7c13-7492-26f6f0ee0006.png)

setterのシンボルを入力します。今の場合は`-[ClassA setName:]`です。
![スクリーンショット 2016-04-05 20.29.45.png](https://qiita-image-store.s3.amazonaws.com/0/2117/76bc7b00-1ac6-06f6-6f6f-beb6c0bd8db2.png)

無事に、setterだけでブレークしました。
![スクリーンショット 2016-04-05 20.30.17.png](https://qiita-image-store.s3.amazonaws.com/0/2117/4444d69c-1ad0-9848-5c24-7d241347ab8c.png)


# まとめ
自動生成されるプロパティはちゃんと生成されている！
Vagrant RLogin plugin を作ってみた

[vagrant ssh で RLogin を起動する](http://qiita.com/ngyuki/items/8953837384251f4b3c08) をプラグインにしてみました。

- https://github.com/ngyuki/vagrant-rlogin

というか、下記をフォークして RLogin のためにちょっと弄っただけです。

[Vagrant Teraterm pluginを作ってみた](http://qiita.com/tiibun/items/b1f1d47040660892067d)

## インストール

```
vagrant plugin install vagrant-rlogin
```

## 使い方

RLogin の接続設定ファイルを適当なファイル名で保存します（以降の例では `C:\Users\username\.vagrant.d\rlogin.rlg` に保存）。

`%USERPROFILE%\.vagrant.d\Vagrantfile` を開いて下記のように追記します。

```ruby
Vagrant.configure(2) do |config|
  config.rlogin.exe_path = 'C:\Program Files (x86)\RLogin\RLogin.exe'
  config.rlogin.config_path = 'C:\Users\username\.vagrant.d\rlogin.rlg'
end
```

適当な Vagrant 環境を実行します。

```
vagrant init bento/centos-7.1
vagrant up
```

`vagrant rlogin` で RLogin が起動します。

```
vagrant rlogin
```

## 簡単な解説

`vagrant rlogin` したときに次のようなことを行います。

- `config.rlogin.config_path` で指定されたファイルをコピー
    - コピー先は `.vagrant` の中のどっか
    - コピーするときに `Entry.IdKey` を秘密鍵のパスに書き換える
- 下記のオプションを指定して RLogin.exe を起動する
    - `/ssh`
    - `/ip`
    - `/port`
    - `/user`
    - `/pass`
    - `/inuse`
Mysqlでスコア順の順位を簡単に表示する

#Mysqlの得点テーブルから、特定の順位の得点を抜き出したい
と言う要望があったので、簡単に取得できる方法を考えてみた。


#対象のテーブルにsocre順の順位をつける
```順位設定
set @rank=0;select user_id,score,rank from (select user_id,score,(@rank:=@rank+1) as rank from user_scores order by score desc) a where rank in (1,10,100,500,1000,1500,3000,5000,8000);
Add Comment
```

##対象の順位の得点のみ取得する
```特定順位のみ抽出
set @rank=0;select user_id,score,rank from (select user_id,score,(@rank:=@rank+1) as rank from user_scores order by score desc) a where rank in (1,10,100,1000,10000);
Add Comment
```
Googleドライブアプリのファイルを他のアプリで編集する

最近のアップデートで、Googleドライブアプリが他のアプリでのファイル編集に対応しました。（やっと来た！）
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">お、Google ドライブが書き戻しに対応したみたい。 <a href="https://t.co/TTEEKf6hpN">pic.twitter.com/TTEEKf6hpN</a></p>&mdash; Jiro@Jota+開発 (@jiro_aqua) <a href="https://twitter.com/jiro_aqua/status/717165829196947456">2016年4月5日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

ということでまとめました。

まず、AndroidManifest.xml。

```lang:AndroidManifest.xml
<intent-filter>
  <action android:name="android.intent.action.EDIT" />
  <category android:name="android.intent.category.DEFAULT" />
  <data android:mimeType="text/*" />
</intent-filter>
```

ACTION_EDITとmime typeの宣言をします。この宣言のあるアプリが入っている場合、Googleドライブのファイルプレビュー画面に編集ボタン（鉛筆アイコン）が現れます。

![Screenshot_20160405-165918.png](https://qiita-image-store.s3.amazonaws.com/0/89529/62690fa8-9387-f149-ac69-0e126bf58929.png)

ここで編集ボタンを押すと、アプリ選択画面で編集するアプリが選択できます。

![Screenshot_20160405-165923.png](https://qiita-image-store.s3.amazonaws.com/0/89529/90f3d77f-f435-a899-3c75-6afee41e84ee.png)

getIntent().getData()することで、コンテンツのURIを取得出来ます。（※以下サンプルはkotlinです）

```kotlin
val uri = intent.data
```

こんな感じのURIが取れます。

```lang:uri
content://com.google.android.apps.docs.storage.legacy/enc%3DW1o6eSHXKnQ_fFOnAVPdpG9sVjKLXtVbiJrNIJp-aL8MQcZc%0A
```

ここで取得するURIは、Googleドライブアプリを終了した後でも、読み書きの両方で有効です。（後からこのurlを使って読み書きが出来ます！）

ファイルのコンテンツは ContentResolver#openInputStream(uri)で取得出来ます。

```kotlin
val input = contentResolver
    .openInputStream(uri)
    .bufferedReader(charset = Charsets.UTF_8)
    .use { 
      it.readText() 
    }
```

同様に、ContentResolver#openOutputStream(uri)で出力用のストリームが取得出来ます。

```kotlin
contentResolver
    .openOutputStream(uri)
    .bufferedWriter(charset = Charsets.UTF_8)
    .use{ 
      it.write(output) 
    }
```

入力ファイルのメタデータはコンテントプロバイダから取得出来ます。

```kotlin
val filename = contentResolver.query(uri, null, null, null, null)?.use {
  it.moveToFirst()
  it.getString(it.getColumnIndex(OpenableColumns.DISPLAY_NAME))
}
```

DatabaseUtils#dumpCursor(cursor)を使えば何が入っているか確認できます。
表示用の名前とかファイルサイズとかmimetypeなどが取得出来ます。

```
>>>>> Dumping cursor android.content.ContentResolver$CursorWrapperInner@e365673
0 {
   _id=acc=1;doc=6
   document_id=acc=1;doc=6
   _display_name=あああああ.txt
   _size=98
   mime_type=text/plain
   flags=263
   last_modified=1459836680290
   icon=null
}
<<<<<
```

![Screenshot_20160405-165944.png](https://qiita-image-store.s3.amazonaws.com/0/89529/9662049e-1471-71aa-c183-01344c50bd4e.png)
こんな風に編集すると、
![Screenshot_20160405-165951.png](https://qiita-image-store.s3.amazonaws.com/0/89529/43dbc384-4ef5-812b-9cd9-dd1dced3b757.png)
ドライブアプリ上に反映されます。

保存したファイルは、即座にGoogleドライブアプリのプレビューに反映されるので、レスポンスが割といいです。「アプリを選ぶ」ワンアクションが必要ですが、Storage Access Frameworkを使うよりもずっと簡単に実装できます。


サンプルアプリはgithubに上げておきました。
https://github.com/jiro-aqua/TestContentProvider.git

以上です。
コマンドラインでプロセスをインタラクティブに探してkillするワンライナー

これ

```zsh
ps aux | fzf | sed 's/  */ /g' | cut -d ' ' -f2 | xargs kill -9
```

`fzf`の部分は`peco`とか`percol`とかお好みのやつに。

`ps aux`でプロセス一覧を表示して`fzf`で選択し、`sed`で空白を一つにまとめて`cut`して2番目がPIDなので`kill -9`に渡す。

頻繁に使うので自分はこんな風にエイリアスにしてる。

```zsh
alias pskl="ps aux | fzf | sed 's/  */ /g' | cut -d ' ' -f2 | xargs kill -9"
```

tmuxの設定を反映させるときとかよく使うので便利。

シェルスクリプト覚えたてなのでもっと良い書き方あったらコメントで教えて下さい。

## 追記(2016/05/01)
awk使ってこうもかけるみたい

```zsh
ps aux | fzf | awk '{ print \$2 }' | xargs kill -9
```

こっちの方がすっきりして好みでした。

おわり
OSをEl Capitanにアップデートしたらlocalhostで404エラーになる

# はじめに
MacのOSをEl Capitanにアップデート後、localhostにアクセスしたするとなぜか404エラーになってしまったのでその時の対処法をまとめます。

# 対処法

とりあえず`httpd.conf`が怪しいと思い、ファイルの更新日時を見てみる。

```sh
$ la /private/etc/apache2
total 168
drwxr-xr-x  16 root  wheel   544B  4  5 17:37 extra
-rw-r--r--   1 root  wheel    20K  4  5 17:34 httpd.conf
-rw-r--r--   1 root  wheel    20K  8  1  2015 httpd.conf.pre-update
-rw-r--r--   1 root  wheel    20K  2 18 20:12 httpd.conf~previous
-rw-r--r--   1 root  wheel    13K  8  1  2015 magic
-rw-r--r--   1 root  wheel    52K  8  1  2015 mime.types
drwxr-xr-x   4 root  wheel   136B  8  1  2015 original
drwxr-xr-x   3 root  wheel   102B  8  1  2015 other
drwxr-xr-x   4 root  wheel   136B  4  5 17:36 users
```
なんと、OSアップデート時に`httpd.conf`も上書きされてしまうんですね。。

## 変更箇所

```sh
$  sudo vim /private/etc/apache2/httpd.conf
```

ということで`httpd.conf`の236行目〜237行目あたりのDocumentRootを今まで設定していた場所に変更します。

```vim
DocumentRoot "/Users/[username]/hogehoge"
<Directory "/Users/[username]/hogehoge">
```

`httpd.conf `を保存して、問題ないかをテストした後、apacheの再起動を行います。

```sh
$ sudo apachectl configtest
$ sudo apachectl restart
```

`http://localhost/hogehoge`にアクセスすると、問題なく表示されてます！
Pentaho BIサーバのWindowsサーバでのサービス化



# 背景

WindowsサーバへのPentaho BIサーバのサービス化でちょっとだけハマったのでメモとして。

まず発見したのが以下のサイト
http://i7-papion.blog.so-net.ne.jp/2012-03-28

上記のやり方では、web.xmlを編集して相対パスを絶対パスに変更する必要があるため、できればやりたくない、と思い更に調査。

ちゃんと公式Wikiにあった。
http://wiki.pentaho.com/display/ServerDoc2x/Starting+BI+Server+as+a+windows+service
(ご丁寧に、web.xmlを編集しなくてもこの方法ならいけるよと書いてあった)

# 手順

コマンドプロンプトにて、以下のコマンドを実行

~~~bat
C:\pentaho_path\tomcat\bin>service.bat install
## 以下の様な出力が出ればOK
Installing the service 'Tomcat8' ...
Using CATALINA_HOME:    "C:\pentaho_path\tomcat"
Using CATALINA_BASE:    "C:\pentaho_path\tomcat"
Using JAVA_HOME:        "C:\Program Files\Java\jdk1.8.0_77"
Using JRE_HOME:         "C:\Program Files\Java\jdk1.8.0_77\jre"
Using JVM:              "C:\Program Files\Java\jdk1.8.0_77\jre\bin\server\jvm.dll"
The service 'Tomcat8' has been installed.
~~~

既定のサービス化設定では正常に起動できないため、設定を変更するため以下のexeを実行

~~~
C:\pentaho_path\tomcat\bin\tomcat8w.exe
~~~

Startupタグ、Shutdownタグにて、Working Pathの末尾に\binを追加

あとは任意でサービスのスタートアップを自動にしたり、上記公式Wikiに記載してあるようにポートの変更をすれば完了。

# 未解決の問題

Pentahoのサービスを停止すると、Windowsサービスの既定のタイムアウト時間を超過してしまうようで、タイムアウトエラーが発生する。
サービス停止処理自体は実行されているので、待っていれば停止するが、長い時は10分程度かかっている模様。ローカル環境依存の問題なのかは現状は不明。
【Vagrantドキュメント意訳】02.なぜVagrantか？

# はじめに

本文章は、Vagrant公式サイト内のドキュメント内の[WHY VAGRANT?](https://www.vagrantup.com/docs/why-vagrant/)に記載されている内容を意訳に近い形で日本語化したものである。
誤訳が含まれている可能性が十分にあることを踏まえて、参考いただきたい。

# なぜVagrantか？

Vagrantは、設定が容易で、複製可能で、業界標準の技術の上に構築された可搬性のある環境であり、一貫性のある単一のワークフローによって制御するとによって、あなたとあなたのチームの生産性と柔軟性を最大化することを助ける。.

その魔法に到達するために、Vagrant巨人の肩に立っているようなものである。マシンはVirtualBox、VMWare、AWSやその他の[プロバイダ](https://www.vagrantup.com/docs/providers/)の上で供給される。そして、シェル・スクリプト、ChefやPuppetなどの業界標準の[プロビジョニング・ツール](https://www.vagrantup.com/docs/provisioning/)を、自動的にマシンにソフトウェアをインストールしたり、設定したりするために使用することができる。

## Vagrantもたらす利益

あなたが**開発者**であれば、Vagrantは、（エディタ、ブラウザ、デバッガなど）での作業に使用されるツールのいずれかを犠牲にすることなく、依存関係に関して、個別の使い捨て用の設定と一貫性のある環境によって分離する。一度、誰かが[Vagrantfile](https://www.vagrantup.com/docs/vagrantfile/)を生成すれば、`vagrant up`を実行するだけで、そのすべてがインストールされ、動作するように設定される。チームの他のメンバーは同じ設定から各自の開発環境を生成することが出来る。たとえあなたの環境がLinuxであれMac OS Xであれ、Windowsであれ、チームのメンバーは、同じ依存関係に対して、すべてが同じように構成された、同じ環境でコードを実行される。「私の環境では動く」というバグに別れを告げよう。

あなたが**オペレーション・エンジニア**であるなら、Vagrantはインフラ管理スクリプトの開発とテストのために使い捨て可能な環境と一貫したワークフローを与えるだろう。VirtualBoxやVMWareのようなローカル仮想環境を使用して、シェル・スクリプトやChefのcookbook、Puppetのモジュールやのようなものを素早くテストすることが出来るだろう。その後、同じ設定で、同じワークフローで、AWSやRackSpaceなでのリモート・クラウド上でそれらのスクリプトをテストすることが出来る。EC2インスタンスをリサイクルするためのカスタム・スクリプトを投げ捨て、いろいろなマシンに対するSSHプロンプトのごまかしをやめ、まともな生活をもたらす、Vagrantを使い始めよう。

あなたが**デザイナー**ならば、Vagrantは、あなたがあなたが最も行うべきこと「デザイン」に集中するために、自動的にWebアプリケーションが要求するすべてを設定する。一度、開発者がVagrantを設定すれば、どうやってアプリケーションが動く環境をもう一度手に入れるかについては心配する必要はない。デザインを試せるようにするために、その環境の修正対応で開発者をそれ以上悩ませることはない。ただ、コードをチェックアウトとし、`vagrant up`を実行して、デザインを始めるだけである。

# 関連記事

* 前の記事：[【Vagrantドキュメント意訳】01.概要](http://qiita.com/ringo0321/items/23c452ab04e75b211825)
* 次の記事：[【Vagrantドキュメント意訳】03.インストール詳細](http://qiita.com/ringo0321/items/7e771dda3493ab3c5382)
【Vagrantドキュメント意訳】01.概要

# はじめに

本文章は、Vagrant公式サイト内のドキュメント内の[OVERVIEW](https://www.vagrantup.com/docs/)に記載されている内容を意訳に近い形で日本語化したものである。
誤訳が含まれている可能性が十分にあることを踏まえて、参考いただきたい。

# Vagrantのドキュメント

仮想マシンのライフサイクル管理用コマンドライン・ユーティリティであるVagrantのドキュメントへようこそ。このウェブサイトは、可能な限りVagrantの上から下まですべての機能についてのドキュメントとなることを目的としている。Vagrantを始めたばかりなら、[初めてのガイド](https://www.vagrantup.com/docs/getting-started/)から読み始めることを強く推奨する。その後、このページに戻ってくること。

ナビゲーションはVagranのそれぞれのコンポーネントについて示してくれるだろう。Vagrantを始めるなら、または、なぜ開発者、設計者、操作者は彼らのニーズに対してVagrantと選んだのかについて知りたいのなら、ナビゲーション・アイテムをクリックすればよいだろう。

> 著者注)"ナビゲーション"とは、公式サイト内の左部分にある、ナビゲーション領域のこと。

# 関連記事

* 次の記事：[【Vagrantドキュメント意訳】02.なぜVagrantか？](http://qiita.com/ringo0321/items/8c60e13cca90924821eb)
OpenLDAPサーバーで、属性をスキーマに追加

# スキーマの設定

| 項目 | 設定値 |
|:--|:--|
| スキーマ名 | jack |
| 設定ファイル | /etc/openldap/schema/jack.schema |
| 継承クラス | inetOrgPerson |

# 追加する属性


|id| 名前 |タイプ |
|:--|:--|:--|
|1.1.2.1.1 | exampleCoJpSex | UTF-8文字列 |
|1.1.2.1.2 | exampleCoJpBirthday | UTF-8文字列 |
|1.1.2.1.3 | exampleCoJpMail | UTF-8文字列 |


# スキーマファイルの作成

/etc/openldap/schema/jack.schema を作成

```
attributeTypes: ( 1.1.2.1.1
        NAME 'eampleCoJpSex'
        DESC 'sex'
        EQUALITY caseIgnoreMatch
        SUBSTR caseIgnoreSubstringsMatch
        SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )

attributeTypes: ( 1.1.2.1.2
        NAME 'exampleCoJpMail'
        DESC 'MailAddress'
        EQUALITY caseIgnoreMatch
        SUBSTR caseIgnoreSubstringsMatch
        SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )


attributeTypes: ( 1.1.2.1.3
        NAME 'exampleCoJpBirthday'
        DESC 'Birthday'
        EQUALITY caseIgnoreMatch
        SUBSTR caseIgnoreSubstringsMatch
        SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )

objectclass (1.1.2.1.1
        Name 'jack'
        DESC 'user object'
        SUP inetOrgPerson
        STRUCTURAL
        MAY ( exampleCoJpSex $ exampleCoJpMail $ exampleCoJpBirthday ) )

```

# LDAPサーバーの設定に反映

## slapd.confの修正

/etc/openldap/slapd.conf のincludeにスキーマファイルを設定

```
(略)
include         /etc/openldap/schema/jack.schema
(略)
```

## テスト

```
# slaptest -f /etc/openldap/slapd.conf
config file testing succeeded
```

## slad.d 以下に展開

```
# rm -rf /etc/openldap/slapd.d/*
# slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d
config file testing succeeded

# chown -R ldap. /etc/openldap/slapd.d
```


## 再起動

```
# /etc/rc.d/init.d/slapd stop
# /etc/rc.d/init.d/slapd start
```

# 登録のテスト

## sample.ldif

```
dn: uid=101, ou=people, dc=example, dc=co, dc=jp
changetype: add
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: jack
uid: 101
cn: Test User
sn: user
o: people
userPassword: {SSHA}wvxuaDL+/m3phJE6fyrtGU8UODCfjA2i
exampleCoJpSex: 1
exampleCoJpMail: test@localhost.com
exampleCoJpBirthday: 1980/1/1
```


## 確認

```
# slapcat

(略)

dn: uid=101,ou=people,dc=example,dc=co,dc=jp
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: jack
uid: 101
cn: Test User
sn: user
o: people
userPassword:: e1NTSEF9d3Z4dWFETCsvbTNwaEpFNmZ5cnRHVThVT0RDZmpBMmk=
exampleCoJpSex: 1
exampleCoJpMail: test@localhost.com
exampleCoJpBirthday: 1980/1/1
structuralObjectClass: jack
entryUUID: b7bca988-8f62-1035-8aee-7dafcba3c12c
creatorsName: cn=Manager,dc=example,dc=co,dc=jp
createTimestamp: 20160405101259Z
entryCSN: 20160405101259.282635Z#000000#000#000000
modifiersName: cn=Manager,dc=example,dc=co,dc=jp
modifyTimestamp: 20160405101259Z
```
cdコマンドのシェルスクリプトを実行する方法

#目的
・cdコマンドによって、ディレクトリを移動するシェルスクリプトを作成する

#通常のシェルスクリプト作成時の問題
・シェルスクリプトの実行終了とともに実行ディレクトリに戻ってしまう。

#対処方法
通常の./とか、sh, bashではなく、sourceコマンドを利用して実行する
```source **.sh
```
sourceコマンドは、自分自身で一つひとつのコマンドをタイプしたのと同じ状態になるらしい。
http://x68000.q-e-d.net/~68user/unix/pickup?source

同様に、この方法によりcdコマンドと同様にシェルスクリプト終了後に反映されない
"source"コマンドを実行するシェルスクリプトも実行可能になる。
DoctrineのFilesystemCacheでローカルにキャッシュ


Redis とか、memcached とか使うまでもない、ちょちょっとしたキャッシュ用に。

## 1. インストール

composer.json

```
{
    "require": {
        "doctrine/cache": "1.6.*"
    }
}
```

```
$ composer install
```


## 2. キャッシュの保存

```
<?php

use Doctrine\Common\Cache\FilesystemCache;

$cache  = new FilesystemCache('/tmp/hoge');
$data = [
    'id' => 1,
    'name' => 'John',
    'phone' => '03-0000-2222',
];
$id = "users/1";
$cache->save($id, $data, $lifeTime = 10);

```


## 3. キャッシュの取得

```php
<?php

use Doctrine\Common\Cache\FilesystemCache;


$cache_id = "users/1";

$cache  = new FilesystemCache('/tmp/hoge');
$result = $cache->fetch($cache_id);

print_r($result);

```

```
Array
(
    [id] => 1
    [name] => John
    [phone] => 03-0000-2222
)
```

## 4. キャッシュの削除

```php
$cache->delete($id);
```

## 5. 確認

```php
$cache->contains($id);
```
gitでcloneしてきたAtomのPackageをインストールする

##問題
gitでcloneしてきたAtomのPackageをインストールしたいんだけどやり方がよくわからない。
公開するまででもない個人で使うようなPackageとか、チーム内だけで使う公開できないようなPackageを使う時とか。（そんなのあるかな？
##答え
```
git clone https://github.com/codamo/my-atom-snippets
apm link
```
落としてきたPackageに`apm link`で`~/.atom/packages`にリンクをつくればOK
##余談１
[my-atom-snippets](https://github.com/codamo/my-atom-snippets)は私が作った、個人的に使いたいスニペットを追加するためだけのPackageです。そんなPackageを作りたい時に参考になるかも。ならないかも。  
デフォルトのスニペットで基本事足りるのですが、そのプロジェクト固有で使うやつとかはautocomplete-plusがあっても入力が面倒くさいことが多々あるので、そんな時にプロジェクト独自のスニペットを用意しておくと開発効率が上がるかも知れないです。
##余談２
もっといい方法がある気がする。
youtubeの動画をCSSで固定比レイアウトにする


youtubeの動画をレスポンシブで表示させたいときに使えるCSSです。
埋め込むiframeとそれを囲う要素の2つにスタイルを指定します。

##埋め込みコード
以下のように、埋め込みコードは発行した際、縦と横の長さの数値を指定することになります。

```
<iframe width="640" height="360" src="https://www.youtube.com/embed/埋め込む動画のパス" frameborder="0" allowfullscreen></iframe>
```
このままだと、レスポンシブにならないのでdivなどでiframeを囲ってスタイルを指定します。

##幅と高さが一緒に変わるHTML要素をつくる
img要素の挙動のように、幅と高さが一緒に変わるようなHTML要素をつくります。

```lang:HTML
<div class="video">
    <iframe width="640" height="360" src="https://www.youtube.com/embed/埋め込む動画のパス" frameborder="0" allowfullscreen></iframe>
</div>

```
```lang:CSS
.video{
width:100%;              /*横幅いっぱいにwidthを指定*/
padding-bottom: 56.25%;  /*高さをpaddingで指定(16:9)*/
height:0px;              /*高さはpaddingで指定するためheightは0に*/
position: relative;
}
```
包含ブロックに対して横幅いっぱいに表示するためにwidthは100％にします。(左右マージンやボーダーを使いたい場合は包含ブロックに指定)
heightを%指定しても、包含ブロックの高さに左右されてしまいます。
**padding-topやpadding-bottomの%指定は包含ブロックの幅が基準になる**のでpaddingで高さを確保します。
youtubeの動画は16:9の画角なので縦幅は56．25%となります。
これで横幅が変わっても常に16:9の比率を保持する要素ができました。

##iframeのサイズを制御する
続いてiframeにスタイルを指定します。

```lang:CSS
.video iframe{
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
```
絶対指定をします。
widthとheightの指定によってiframeに記述されていてたwidth属性とheight属性のピクセル値によらず枠ぴったり収まるようになります。

##結論

iframeを要素で囲って以下のスタイルを追加すればOK

```lang:CSS
.video{
width:100%;
padding-bottom: 56.25%;
height:0px;
position: relative;
}
.video iframe{
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
```
MS Office複数バージョンインストール時のデフォルト起動バージョン設定

１台のPCにMS Officeを複数バージョンインストールしている方は、それなりにいると思われます。
複数バージョンが同居している場合、デフォルトでどちらのバージョンを起動するかについて、regserverコマンドやレジストリ編集による方法がありますが、いずれもうまく動かないことがあります。

今回いろいろいじっていて、簡単に切り替えることができる方法がありましたので記録します。
※ここでは私のPC環境において動作した方法であって、全ての環境で対応できるかは保証できません。またこの方法はおそらく内部的にレジストリを編集していると思われるため、PC環境に影響が出ないことは保証できません。
お試しになる場合には、自己責任でお願いします。

＜試した環境＞
Windows10(64bit)
MS Office2010 (32bit)
MS Office2016 (32bit)

＜切り替え方法＞
1) コントロールパネルの「プログラムと機能」から該当するMS Officeのバージョンを右クリックします。

2) 変更をクリックします。

3)Officeのインストールダイアログみたいな画面が表示されます。

4) 「修復」を実行して下さい。
（修復はしばらく時間がかかります。）

これで「プログラムと機能」で選択したバージョンがデフォルト起動するようになります。

※繰り返しますが、上記の操作の結果は自己責任ということでお願いします。
KVMホストの環境構築 (CentOS 7編)

CentOS 7でKVMホストを構築する際の設定方法です。

# KVMインストール
```
# yum -y install qemu-kvm libvirt bridge-utils

##モジュールが読み込まれているかの確認
# lsmod | grep kvm 

# systemctl start libvirtd 
# systemctl enable libvirtd
```

# ブリッジネットワークの設定
```
# nmcli c delete enp3s0 ←環境によって変わる
# nmcli c add type bridge autoconnect yes con-name br0 ifname br0
# nmcli c modify br0 bridge.stp no
# nmcli c add type bridge-slave autoconnect yes con-name enp3s0 ifname enp3s0 master br0
# nmcli c modify br0 ipv4.method manual ipv4.addresses 192.168.1.10/24 ipv4.gateway 192.168.1.1 ipv4.dns 8.8.8.8 ←適切な値に設定する
```

CentOS 7.1からは「ipv4.gateway」を明示する必要があります。
設定したら、ネットワークを再起動します。

# 参考
- [CentOS7をkvmで仮想環境のホストにする](http://spacekey.info/blog/archives/853)
- [CentOS 7.1.1503ではnmcliでIPアドレスを固定する方法が変更された](http://qiita.com/yunano/items/88a6e46b412d3be1d3ec)

 なぜかNetworkManagerで設定できない場合

- [CentOS6.4でブリッジの作成](http://alexei-karamazov.hatenablog.com/entry/2013/11/06/141007)
UIPickerViewで入力するTextField

自分用のメモとして。
TextFieldのinputViewにUIPickerViewを設定すればできる。

# 実装例
自分はUITextFieldのカスタムクラスにして実装した。こうするとUIPickerViewのdelegateを閉じ込められるのですっきりしていい感じ。
[minerva1129/PickerTextField](https://github.com/minerva1129/PickerTextField)

```swift:PickerTextField.swift
import UIKit

class PickerTextField: UITextField, UIPickerViewDelegate, UIPickerViewDataSource {
    var dataList = [String]()
    
    /*
    // Only override drawRect: if you perform custom drawing.
    // An empty implementation adversely affects performance during animation.
    override func drawRect(rect: CGRect) {
    // Drawing code
    }
    */
    
    init() {
        super.init(frame: CGRectZero)
    }
    
    override init(frame: CGRect) {
        super.init(frame: frame)
    }
    
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }
    
    func setup(dataList: [String]) {
        self.dataList = dataList
        
        let picker = UIPickerView()
        picker.delegate = self
        picker.dataSource = self
        picker.showsSelectionIndicator = true
        
        let toolbar = UIToolbar(frame: CGRectMake(0, 0, 0, 35))
        let doneItem = UIBarButtonItem(barButtonSystemItem: .Done, target: self, action: Selector("done"))
        let cancelItem = UIBarButtonItem(barButtonSystemItem: .Cancel, target: self, action: Selector("cancel"))
        toolbar.setItems([cancelItem, doneItem], animated: true)
        
        self.inputView = picker
        self.inputAccessoryView = toolbar
    }
    
    func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
        return 1
    }
    
    func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return dataList.count
    }
    
    func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        return dataList[row]
    }
    
    func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        self.text = dataList[row]
    }
    
    func cancel() {
        self.text = ""
        self.endEditing(true)
    }
    
    func done() {
        self.endEditing(true)
    }
}
```
初期化してsetup()して使う。
こんな感じ。
![gif.gif](https://qiita-image-store.s3.amazonaws.com/0/68584/63623ac4-f565-e036-4099-1316fda35a6a.gif)
Swiftで磁気センサの値を取得する方法

#CoreMotionフレームワーク
内蔵センサの値を使うにはCoreMotionフレームワークを利用する。

```swift
//CoreMotionマネージャを作成
let cmManager = CMMotionManager()
```

センサー値を定期的に読み取る更新間隔を設定する。

```swift
cmManager.magnetometerUpdateInterval = 0.1
```

更新用に定期的に実行するメソッドをクロージャとして定義する。startMagnetometerUpdatesToQueue()でキューとして登録。

```swift
//キューで実行するクロージャ
let handler:CMMagnetometerHandler = {(magnetoData:CMMagnetometerData?,error:NSError?) -> Void in
    self.showMagnetoData(magnetoData,error: error)
}
//キューを登録し、スタート
cmManager.startMagnetometerUpdatesToQueue(NSOperationQueue.mainQueue(), withHandler: handler)
```

データを読み取る

```swift
func showMagnetoData(magnetoData:CMMagnetometerData?, error:NSError?){
        if let data = magnetoData {
            
            var x = data.magneticField.x
            var y = data.magneticField.y;
            var z = data.magneticField.z;

            ...


```

全体のコード

```swift:ViewController.swift
import UIKit
import CoreMotion

class ViewController: UIViewController {

    @IBOutlet weak var xLabel: UILabel!
    @IBOutlet weak var yLabel: UILabel!
    @IBOutlet weak var zLabel: UILabel!
    
    let cmManager = CMMotionManager()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        cmManager.magnetometerUpdateInterval = 0.1
        
        
        let handler:CMMagnetometerHandler = {(magnetoData:CMMagnetometerData?,error:NSError?) -> Void in
            self.showMagnetoData(magnetoData,error: error)
        }
        cmManager.startMagnetometerUpdatesToQueue(NSOperationQueue.mainQueue(), withHandler: handler)
        
    }

    func showMagnetoData(magnetoData:CMMagnetometerData?, error:NSError?){
        if let data = magnetoData {
            
            var x = data.magneticField.x
            var y = data.magneticField.y;
            var z = data.magneticField.z;
            
            x = round(x*100)/100
            y = round(y*100)/100
            z = round(z*100)/100
            
            xLabel.text = String(x)
            yLabel.text = String(y)
            zLabel.text = String(z)
            
        }
    }
}

```

実行結果

<img width="320" alt="magnet_sensor.png" src="https://qiita-image-store.s3.amazonaws.com/0/118567/7aeb1720-cd56-17a9-8924-b506d92f3fb3.png" border="1">
馴染みあるツールで fluentd に対してお手軽にメトリクスを送信する


fluentd のアグリゲータサーバを建てたのはいいけど、アプリからログ送信開始後に疎通不能が発覚するなどという出戻りを防ぐために、実利用開始前にとりあえずインフラ的に疎通確認しておきたい。

ログ送信元のアプリサーバに fluent-cat が入っていなかったり、別途専用クライアントを用意する手間も省きたい場合にはよく telnet や ncat で代用している。

## fluentd

下記のような設定で fluent-dst.cie.la というサーバ上の 24224 ポートで起動済みのものとする。

```
<source>
  type forward
</source>

<match debug.**>
  type stdout
</match>
```

このサーバに `debug.ciela.test` というタグで　`["a","b",{"first":"one","second":"two"}]` という JSON データを送りたい。

## telnet

```
[ciela@fluent-src ~]$ telnet fluent-dst.cie.la 24224
Trying 10.100.100.100...
Connected to fluent-dst.cie.la.
Escape character is '^]'.
["debug.ciela.test",1459845632,["a","b",{"first":"one","second":"two"}]]
```

時刻は `date +%s` した結果でも利用しておくといいかと思う。

## ncat

```
[ciela@fluent-src ~]$ echo '["debug.ciela.test",1459845632,["a","b",{"first":"one","second":"two"}]]' | ncat fluent-dst.cie.la 24224
```

時刻は（ｒｙ

## 確認

上記2つともアグリゲータサーバのログにこんな感じで吐かれていればOK。

```
2016-04-05 17:40:32 +0900 debug.ciela.test: ["a","b",{"first":"one","second":"two"}]
```
Route 53のHealth checkでフェイルオーバーを設定する

フェイルオーバーの方法はいくつかあると思いますが、Route 53でも実現することが可能です。

# Health checkの設定
プライマリの生存を監視するヘルスチェックを設定します。

- Name：(分かるように名前をつける)
- What to monitor：Endpoint
- Specify endpoint by：IP address
- Protocol：HTTP (HTTPS, TCPも選択可)
- IP adress：(サーバのIPアドレス)
- Host name：(任意)
- Port：(適切なポート番号を設定)
- Request interval：Standard (30秒間隔で監視。Fastだと10秒間隔)
- Failure threshold：3 (適切な値に設定する)

# DNSレコードの設定
通常のレコード設定に加えて下記の設定を行います。なお、各レコードのTTLは短め (60秒とか)に設定します。

## プライマリ
- Rounting Policy : Failover
- Failover Record Type : Primary
- Set ID : (任意)
- Associate with Health Check : Yes
- Health Check to Associate : (適切なHealth checkを選択)

![Route_53_Management_Console.png](https://qiita-image-store.s3.amazonaws.com/0/48446/fe9e5782-7a65-e097-8bb9-2fc29066012d.png)

## セカンダリ
- Rounting Policy : Failover
- Failover Record Type : Secondary
- Set ID : (任意)
- Associate with Health Check : NO

![Route_53_Management_Console 2.png](https://qiita-image-store.s3.amazonaws.com/0/48446/c1672248-e454-8e98-303c-cdc836b7d4c4.png)

# 参考
- [[AWS] Route53 DNSフェールオーバー を試してみた。](http://www.proudit.jp/archives/771)
- [DNS フェイルオーバーの設定](http://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/dns-failover-configuring.html)
OpenLDAPサーバーで、ユーザーを追加

# 設定

以下のユーザーを登録するものとする

| 項目 | 設定値 |
|:--|:--|
| 組織DN | ou=people,dc=example,dc=co,dc=jp |
| 利用するスキーマ | top, person, organizationalPerson, inetOrgPerson |
| uid | 12345 |
| ユーザーDN | uid=12345,ou=people,dc=example,dc=co,dc=jp |
| cn | Test User |
| sn | Test |
| パスワード | password |
| パスワードのハッシュ値 | {SSHA}wvxuaDL+/m3phJE6fyrtGU8UODCfjA2i |


# 追加

## ldifファイルの作成

/tmp/user1.ldif というファイル名で作成するものとする

```
dn: uid=12345, ou=people, dc=example, dc=co, dc=jp
changetype: add
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
uid: 12345
cn: Test User
sn: user
o: people
userPassword: {SSHA}wvxuaDL+/m3phJE6fyrtGU8UODCfjA2i

```


## 追加

```
# ldapadd -x -D "cn=Manager,dc=example,dc=co,dc=jp" -W -f /tmp/user1.ldif
Enter LDAP Password:
adding new entry "uid=12345, ou=people, dc=example, dc=co, dc=jp"
```

# 確認

```
# slapcat

(略)

dn: uid=12345,ou=people,dc=example,dc=co,dc=jp
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
uid: 12345
cn: Test User
sn: user
o: people
userPassword:: e1NTSEF9d3Z4dWFETCsvbTNwaEpFNmZ5cnRHVThVT0RDZmpBMmk=
structuralObjectClass: inetOrgPerson
entryUUID: a88737f8-8f58-1035-832a-fbe69abdd39f
creatorsName: cn=Manager,dc=example,dc=co,dc=jp
createTimestamp: 20160405090058Z
entryCSN: 20160405090058.799276Z#000000#000#000000
modifiersName: cn=Manager,dc=example,dc=co,dc=jp
modifyTimestamp: 20160405090058Z

```
【PHP】shebang


bashでよく見るファイルの先頭の#!から始まるもの。シバンまたはシェバンと呼ぶらしい。プログラムを実行するインタプリンタを指定する。

PHPのシバンを書けば、phpファイルを実行するときphpコマンドから書かなくても実行できる。

````
//通常はphp書くけど
php ./hoge.php

//シバンならファイルだけでいける
./hoge.php
```

##PHPのシバンの書き方

### CakePHPのコンソールのシバンを参考に

```
#!/usr/bin/php -q
```

オプションの-qは、HTTP ヘッダの出力を抑制する。

### envを使う方法

phpが/usr/bin配下にあるとは限らない。envをつけるとPATHから探してくれるので柔軟に書けるらしい。

```php
#!/usr/bin/env php
```

ただしenvを使う方法だとphpにオプションをつけることはできない。

```php:実行不可な例
#!/usr/bin/env php -q
```
強い意志で定時に帰る

# 前置き

正直に答えてください。
**あなたが1日に集中してプログラムを書ける時間の長さは？**


12時間？11時間？9時間？
はい。
あなたはスーパープログラマーです。人間を超越していると言ってもいい。このポエムはなんの役にも立たないのでさっさとエディタに戻って人類の未来に貢献してください。


8時間？7時間？6時間？
本当？
すごい。ほんとうにすごい。引き続き頑張ってください。きっとあなたはコードに選ばれた人です。
しかしあなたにもこのポエムは役に立ちません。
そっとブラウザのタブを閉じて頂ければと思います。


4時間？3時間？
はい。ようやくめぐりあえましたね。**あなたのような方をお待ちしておりました。**
こんなに集中していられる時間が短いなんて、問題があるのでは、、とお考えかもしれません。
後ろめたい気持ちにとらわれることがあるかもしれません。
その気持ちを埋め合わせるために、終電間際まで仕事し
「ああ、今日もよく頑張った。結局スケジュール通りには進まなかったけど..」
なんて生活を繰り返していたりしないでしょうか。

しかし、それは誤りです。
Joelさんもおっしゃっております。

> **私は最初の仕事以来、開発者としての自分が生産的にコーディングするのは平均して1日に2、3時間だということを認識していた。**
*[射撃しつつ前進]より抜粋*
*http://japanese.joelonsoftware.com/Articles/FireAndMotion.html*



ここだけの話、私がコードに没頭していられる時間は、最大でも3時間程度です。
オフィスのホワイトノイズを背景に、集中した状態「ゾーン」に入る。
カタカタカタ...気がつけばお昼過ぎには1日の成果が既に出ている。。。

しかし、ゾーンに入れない日もあります。いや、入れない日の方が圧倒的に多いと言ってよい。
ここは現実から目を背けてはなりません。ゾーンに入るのは容易な事ではないのです。


# 現実を見つめる

現実に立脚しない作戦は、立てた時点で既に失敗が約束されています。
だからこそ現状をしっかりと認識することが大事です。
わかっている事実は以下です。

- ゾーンに居られる時間は短い
- ゾーンに居る時の生産性は、少なく見積もっても通常の3倍にのぼる
- 1日の大半は集中力が欠如した状態である
- 集中力が欠如した状態時の生産性は、少なく見積もっても通常の3分の1である

どうでしょうか？
思い当たるフシがあるのではないでしょうか。
集中している時としていない時で生産性に実に9倍もの差があることになります。
しかもこれは、少なく見積もって、です。
だからこそ意識的に自分をゾーンに入れるための作戦が必要になります。


![32688398.jpeg](https://qiita-image-store.s3.amazonaws.com/0/74328/41a75d6a-6589-670c-64d9-866f59439587.jpeg)



# ゾーンに入るために

ようやく本題です。
私がそれなりに長くコードを書いてきて得た、ゾーンに入るための知恵をおすそ分けします。


## オフィスに着いたら即コードを書き始める

我々はプログラマーです。プログラマーの武器はエディタです。
オフィスに着いて着座したら即エディタを起動し、コードを書き始めます。とにかく始めることです。
間違ってもメーラーやSlackを起動してはいけません。
できたらmesssengerやLINEもミュートします。
FacebookやInstagramも後回しです。
それらは我々の武器ではありません。ゾーンに入るために必要な時間をフラグメント化しとっちらかし、二度と戻らないようバラバラにするものです。
もちろん我々はチームで仕事しているので、コミュニケーションはおろそかにできません。
しかし考えてみてください。メールもSlackも非同期コミュニケーションのためのツールです。
同期的なコミュニケーションならば、対面や電話があります。MTGでもいい。
しかし非同期的なコミュニケーションは発明され、順調に発展してきました。
それがなぜなのか、よく考えてみるべきです。
マルチタスクが得意なPCですら、コンテキストスイッチにはCPU速度に比較すれば、莫大なコストがかかります。ましてや生身の人間をや、です。
**割り込みがいくらあっても、生産性は変わらないというフリはもうやめましょう。**
まず、コードを書き始める。ここがスタートラインです。
コミュニケーションは集中力が切れてからでもできるタスクです。後回しにしましょう。


## 当日の作業内容は前日のうちに決める

これもオフィスに着いてからあれこれ悩まないための方策です。
私が新米の頃、よく上司に

**「段取り半分」**

と言われておりました。まったくその通りです。
計画のないところに成功はありません。
1日の終わりにその日のダメだった点を検証して翌日に生かすのです。
あ〜〜今日もダメだった〜〜で終わってはいけません。
PDCAのCHECKです。


## 作業終了時間を決めて厳守する
夏休みの宿題、ちゃんと毎日やってましたか？
私は31日にまとめてやるタイプでした。まあこれ自体はダメな例なんですが、特筆すべきは31日の集中力です。
もう後がない、と意識することがゾーンへの扉を押し開きます。
そのためにはこれ以上、延ばさないという、断固たる意志を持って終了時間を決めるべきです。
人によってはこれを「終電時間」にしちゃったりするようですが、これは愚策です。
一見、もう延ばせない期限という意味では適切なようですが、とてもとても重要な要素を見落としています。
それが、**「睡眠時間」**です。

当たり前のことなのに軽視されがちな要素、「睡眠時間」。
ゾーンに入ることは重労働です。パワーが要ります。このパワーを得るためにしっかり休養するのです。
だらだらと勤務し睡眠時間を削っては、翌日もゾーンに入れないこと請け合いです。


**今日からきっちり定時にあがって明日のゾーンを手に入れましょう。**
OpenLDAPサーバーで、組織を追加

# 設定

以下のような組織を追加するものとする

| 項目 | 設定値 |
|:--|:--|
| トップDN | dc=example,dc=co,dc=jp |
| 組織名 | people |
| 組織DN | ou=people,dc=example,dc=co,dc=jp |

また、LDAPに接続する情報は以下とする

| 項目 | 設定値 |
|:--|:--|
| 管理者DN | cn=Manager,dc=example,dc=co,dc=jp |
| パスワード | password |


# トップオブジェクトを追加

## ldifファイルの作成

※ /tmp/top.ldif として作成するものとする

```
dn: dc=example,dc=co,dc=jp
objectClass: dcObject
objectClass: organization
dc: example
o: example
```

## 追加

```
# ldapadd -x -D "cn=Manager,dc=example,dc=co,dc=jp" -W -f /tmp/top.ldif
Enter LDAP Password: (パスワードを入力)
adding new entry "dc=example,dc=co,dc=jp"
```

## 確認

```
# slapcat

# slapcat
570376d9 The first database does not allow slapcat; using the first available one (2)
dn: dc=example,dc=co,dc=jp
objectClass: dcObject
objectClass: organization
dc: example
o: example
structuralObjectClass: organization
entryUUID: e9e1a9d6-8f53-1035-8328-fbe69abdd39f
creatorsName: cn=Manager,dc=example,dc=co,dc=jp
createTimestamp: 20160405082700Z
entryCSN: 20160405082700.960264Z#000000#000#000000
modifiersName: cn=Manager,dc=example,dc=co,dc=jp
modifyTimestamp: 20160405082700Z
```

# 組織を追加

## 定義するldifファイルを作成

※ /tmp/people_org.ldif として作成するものとする

```
dn: ou=people,dc=example,dc=co,dc=jp
objectclass: organizationalUnit
ou: people
```

## 追加

```
# ldapadd -x -D "cn=Manager,dc=example,dc=co,dc=jp" -W -f /tmp/people_org.ldif
Enter LDAP Password:(パスワードを入力)
adding new entry "ou=people,dc=example,dc=co,dc=jp"
```

## 確認

```
# slapcat
57037816 The first database does not allow slapcat; using the first available one (2)
(略)

dn: ou=people,dc=example,dc=co,dc=jp
objectClass: organizationalUnit
ou: people
structuralObjectClass: organizationalUnit
entryUUID: 781244c2-8f54-1035-8329-fbe69abdd39f
creatorsName: cn=Manager,dc=example,dc=co,dc=jp
createTimestamp: 20160405083059Z
entryCSN: 20160405083059.515268Z#000000#000#000000
modifiersName: cn=Manager,dc=example,dc=co,dc=jp
modifyTimestamp: 20160405083059Z
```
スマホ( iOS / Android )でブラウザをバックグラウンドにしたり、他のページを開いた時のイベントを取得する方法

音を流した時に、流しっぱなしになってしまってホームボタンを押して、バックグラウンドで音楽が鳴り続けてしまったので、そのイベントを取得する方法を検索しました。

この記事は、おもいっきり
[ホームボタンを押してSafariを裏にまわしたときにAudioを停止する](http://kimizuka.hatenablog.com/entry/2015/07/15/000000)
を参考にしてる、これを見てのメモです。ええ。

でiOSに関しては

```lang:A
document.addEventListener("visibilitychange", function() {
        if ( doc.hidden ) {
            //はなれた
        }else{
　　　　　　//あらわれた
        }
}, false);
```
をすると、ページが後ろに下がる時は何も表示されないのに、
ページが前に表示される時に、[はなれた]→[あらわれた]が発生する。

ただ、アンドロイドだとこの方法でうまくいくっぽい。


そして、

```lang:B
window.addEventListener("blur", function() {
        //はなれた
}, false);
```
みたいな事で、iOSの方でホームボタン押したり、新規ページ開いたりが取得できる。アンドロイドだと、若干過反応というか、URLを入力しようとするだけで、反応しちゃう。ので、

androidはBに反応しないようにiOSはAのはなれたに反応しないようにしつつ、
実装をすれば、ブラウザから離脱した時に音楽を消すとか、そういうのができます。

案外誰も書いてない。結構知りたいないようだったので、メモだけど、書いた。
【PHP】ディレクトリ関連の関数


関数知らないので覚えたものがメモ


##dirname
親ディレクトリのパスを返す

パスを渡すとその親ディレクトリを返す。

```php
echo dirname("/etc/passwd");
//=>/etc
```

dirnameと\__FILE__と組み合わせて、実行ファイルの親ファイルを出力する。

```php
echo dirname(__FILE__),PHP_EOL;
//ファイルが/tmp/hoge.phpだとすると、/tmpを出力する。
```
sudoについて　[ 自分用メモ ]

sudoは、SuperUserDOの略語。
指定したユーザ（デフォルトではroot権限）でコマンドを実行することができる。
suの代わりに使われることが多い。
sudoを実行するためには，あらかじめ/etc/sudoersファイルに権限を与えられるユーザとコマンドをOS内に設定しておく必要がある。

s(super) ・・・特権
u(user) ・・・ユーザ
do ・・・が操作する
guava

# guava

dependencies {
    ~ 省略 ~
    compile 'com.google.guava:guava:19.0'
}

#nullが来たら例外

```java:MainActivity.java

import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import static com.google.common.base.Preconditions.checkNotNull;

public class MainActivity extends AppCompatActivity {
    private String piyo;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        piyo = null;
        send(piyo);
    }
    private void send(@NonNull String value) {
        checkNotNull(value);
    }
}

```
configディレクトリの読み込まれる順番　[ 自分用メモ ]

configディレクトリ内の上から順番に
上
↓
"environment.rb",
"application.rb",
"boot.rb",
"environments/development.rb",
"initializers/backtrace_silencers.rb",
"initializers/filter_parameter_logging.rb",
"initializers/inflections.rb",
"initializers/mime_types.rb",
"initializers/secret_token.rb",
"initializers/session_store.rb",
"initializers/wrap_parameters.rb",
"routes.rb"
↓
下
読み込まれる。

参考サイト
http://d.hatena.ne.jp/yk5656/20140805/1407584394
Maya Python Timelineを変更する

# MayaでTimelineを変更する

## GUI
Windowの一番したのTimeLineの数値を変更する
![160405_mayaFrame_001.png](https://qiita-image-store.s3.amazonaws.com/0/111261/cdb14959-d811-6476-b836-8d01eabb8d90.png)

## Python

### Reference

[playbackOptions](http://help.autodesk.com/cloudhelp/2015/ENU/Maya-Tech-Docs/CommandsPython/playbackOptions.html)


### python

```py:playbackOptionsSample.py

import maya.cmds

# Get Info
animStart = cmds.playbackOptions(query=True,animationStartTime=True)
animEnd = cmds.playbackOptions(query=True,animationEndTime=True) 

min = cmds.playbackOptions(query=True,min=True) 
max = cmds.playbackOptions(query=True,max=True) 

print animStart
print animEnd
print min 
print max

# Set Info
cmds.playbackOptions( ast='1', aet='4', min='1', max='4' )

```

## 参照
[Output Maya Animation Data to .csv file](http://lukewalters.co.uk/coding/pymel/output-maya-animation-data-to-csv-file/)
CentOS 6.7 で OpenLDAP サーバーを構築

# 基本設定

以下の設定でLDAPサーバーを構築するものとする

| 項目 | 設定値 |
|:--|:--|
| 基本ドメイン | example.co.jp |
| 管理者のDN | cn=Manager, dc=example, dc=co, dc=jp |
| 管理者のパスワード | password |
| 管理者のパスワードのhash値(※) | {SSHA}WYEroAc4FZocN2Qn6fzV08nlu/IwKG7h |

※ slappasswdコマンドで確認する

```
# slappasswd -s password
{SSHA}WYEroAc4FZocN2Qn6fzV08nlu/IwKG7h
```

# パッケージのインストール

```
# yum install openldap openldap-servers openldap-clients
```

# デフォルト設定ファイルの配置

```
# cp -pr /usr/share/openldap-servers/slapd.conf.obsolete /etc/openldap/slapd.conf
# cp -pr /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
```

※ 一時的な設定ファイル(slapd.conf)は、上記のパスに置いて運用するものとする。


# 設定値の変更

## ドメイン

suffixの値を変更する

```
(snip)
database        bdb
suffix          "dc=example,dc=co,dc=jp"
(snip)
```

## 管理者

rootdnとrootpwの値を変更する

```
rootdn          "cn=Manager,dc=example,dc=co,dc=jp"
# Cleartext passwords, especially for the rootdn, should
# be avoided.  See slappasswd(8) and slapd.conf(5) for details.
# Use of strong authentication encouraged.
# rootpw                secret
# rootpw                {crypt}ijFYNcSNctBYg
rootpw          {SSHA}WYEroAc4FZocN2Qn6fzV08nlu/IwKG7h
```

※ monitorをしたければ、そちらの方も変更する必要があるかもしれない(未確認)



# 設定ファイルを slap.d/ ディレクトリ配下に変換

サービス起動時に、/etc/openldap/slapd.d ディレクトリがあれば、sladp.confディレクトリ下の設定ファイルが優先されて読み込まれるので、/etc/slapd.conf を /etc/openldap/slapd.d/ 以下のフォーマットに変換する

## slapd.conf のテスト

```
# slaptest -f /etc/openldap/slapd.conf
config file testing succeeded
```

## パッケージインストール時に追加された初期設定ファイルを削除

```
# rm -rf /etc/openldap/slapd.d/*
```

## 変換とパーミッション変更

```
# slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d
config file testing succeeded

# chown -R ldap. /etc/openldap/slapd.d
```

# サービス起動

```
# /etc/rc.d/init.d/slapd start
Starting slapd:                                            [  OK  ]
```
Zabbixエージェントの設定 (CentOS編)

CentOSにZabbixエージェント入れて監視するまでの設定方法です。Zabbixサーバは3.0です。

# Zabbixリポジトリの追加
```
# CentOS 7
rpm -ivh http://repo.zabbix.com/zabbix/3.0/rhel/7/x86_64/zabbix-release-3.0-1.el7.noarch.rpm

# CentOS 6
rpm -ivh http://repo.zabbix.com/zabbix/3.0/rhel/6/x86_64/zabbix-release-3.0-1.el6.noarch.rpm
```

# インストール
```
yum install zabbix-agent
```

# 設定
```text:/etc/zabbix/zabbix_agentd.conf
Server=(Zabbix server IP)
ServerActive=(Zabbix server IP)
#Hostname=[Hostname] (コメントアウトもしくはZabbixで表示するホスト名を設定)
HostnameItem=system.hostname (Hostnameをコメントアウトする場合はコメントアウト外す)
```

# ファイアウォール
```
##CentOS 7
# firewall-cmd --add-port=10050/tcp --permanent

##CentOS 6 (/etc/sysconfig/iptables)
-A INPUT -p tcp -m tcp --dport 10050 -j ACCEPT
```

# 監視設定
Zabbixの「設定」->「ホスト」から`ホストの作成`でホストを追加できます。Linux用のテンプレートが用意されているので、それを設定しておけばとりあえずは良いと思います。
PHPでWin32APIを呼ぶ(Windows)

- DynamicWrapper をインストールする
- php.ini で php_com_dotnet.dll を有効化する
- サンプル・コード
- 参考

PHP5.6.3で動作確認@2016-04-05

不備があれば教えてください。

## DynamicWrapper をインストール

1. [dynawrapNt.zip](http://glsft.free.fr/index.php?option=content&task=view&id=47) をダウンロード
1. **管理者権限**でコマンドプロンプトを起動
1. ```regsvr32.exe path_to_dynawrapNt\dynwrap.dll```でインストール

## php.ini で php_com_dotnet.dll を有効化

```php
extension=php_com_dotnet.dll
```
を追加。

## サンプル・コードを実行

```
# コマンドプロンプトで実行
C:\php php -f sample.php
```

***sample.php***

```php

<?php
	$win32 = new COM("DynamicWrapper");

	$win32->Register("user32.dll", "MessageBoxA", "i=hssu", "f=s", "r=l");
	$win32->MessageBoxA(null, "MessageBoxA", "Sample", 3); # MessageBoxを表示

	$win32->Register("KERNEL32.DLL", "GetTickCount", "i=l", "f=s", "r=l");
	echo $win32->GetTickCount(0); # 起動時間を表示
?>
```

## 参考

- [DynaWrap - DynaCall Wrapper](http://glsft.free.fr/index.php?option=content&task=view&id=47)
- [Hello, Win32 API(PHP) World!](http://cx20.main.jp/blog/hello/2012/04/29/hello-win32-api-php-world/)
- [MessageBox()](https://msdn.microsoft.com/ja-jp/library/cc410914.aspx), [GetTickCount()](https://msdn.microsoft.com/ja-jp/library/cc429827.aspx)