OmniAICreator/Qiita-1.07M huggingface dataset:
どうなってるの！？while+list+each vs foreach

以前書いた[この記事](http://qiita.com/piotzkhider/items/6a94d10b83cf770a1b04)で気になったことがあったので調べていたら、

http://tweeeety.hateblo.jp/entry/20130416/1366096299

> whileのほうが時間が20倍近くかかっ。。。。

なにぃ！？そんな馬鹿なと調べてみたところ、
確かに同様のソースだとwhileの方が遅い模様。なんでだろう！？

でも以前のソースだとwhileが群を抜いて早い。なんでだろう！？！？


誰か詳しい解説できる方いましたらお願いいたします…。

# 追記
`foreach`や`while`自体をループさせるとかなりwhileの方が早くなっているよう。
それ以外は`foreach`の方が若干早いように思えます。
`foreach`は配列のコピーを作りループをしているので、その辺りがミソなのかも。
migrationで安全にtableをdropする

開発途中だと、何らかの原因でテーブルが既に消えていて、migrationのdownに失敗することがあります。
きれいに作ることができれば、ありえないパターンですが、発生してしまいまいがちです。
回避するためにテーブルをチェックしてからdropします。

```rb
def down
  :hoge_tables.tap{ |t| drop_table t if ActiveRecord::Base.connection.table_exists?(t) }
end
```
Meteor 1.0 備忘録


全部入りフルスタックの web 開発環境、Meteor をさわり始めたので、備忘録的に書いていく。

* [Meteor](https://www.meteor.com/)


# セットアップ

## インストール

```sh
curl https://install.meteor.com | /bin/sh
```

* Windows 環境は Cygwin とかで色々頑張ると動くらしい。


## アンインストール

```sh
rm -rf ~/.meteor/
sudo rm /usr/local/bin/meteor
```

* [Uninstalling Meteor](https://github.com/meteor/meteor#uninstalling-meteor)


## プロジェクト作成

`myapp` というディレクト名でプロジェクトの土台を作成:

```sh
cd /path/to/parent/
meteor create myapp
```

`myapp` ディレクトリに移動してローカルサーバーとタスクランナーを起動:

```sh
cd ./myapp/
meteor
```


# ディレクトリ構成と暗黙ルール

## ファイルの読込

後述する"特別なディレクトリ" の外にあるファイルに対しては次のような処理が実行される:

1. HTML テンプレートは HTML へとコンパイルされてクライアントサイドに送られる。
2. CSS はクライアントサイドに送られる。Production モードでは自動で結合と圧縮が適用される。
3. JavaScript はクライアントとサーバーサイド両方に送られる。`Meteor.isClient` と `Meteor.isServer` でコードブロックを分ける事で、クライアント/サーバー両方のコードを 1 つファイルに記述できる。
4. `main.*` という名前のファイル、続いてアルファベット順にファイルが送られる。

* [Meteor.isClient](http://docs.meteor.com/#/basic/Meteor-isServer)
* [Meteor.isServer](http://docs.meteor.com/#/basic/Meteor-isServer)

## 特別なディレクトリ

`meteor create` コマンドで生成した土台は、階層構造のないシンプルな構成だが、Meteor の暗黙ルールに沿った構成にすると以下のようにできる。

尚、`.meteor` というディレクトリも `myapp` 下に生成されるが、こちらは基本手動ではさわらない。

```sh
myapp/
├── client/
│   ├── main.css
│   ├── main.html
│   └── main.js
├── lib/
├── packages/
├── public/
└── server/
    └── main.js
```

### client/

* このディレクトリのファイルはクライアントサイドにのみ送られる。

### lib/

* このディレクトリのファイルはクライアント/サーバーサイド両方で、一番最初に送られる。

### packages/

* Meteor のパッケージ管理システム [Atomsphere](http://atmospherejs.com/) では管理されていない、ローカルで作成したパッケージが格納される。

### public/

* このディレクトリ下の全ファイルが静的ファイルとして送られる。
* デフォルトではこのディレクトリ下が URL 上のルートパス `/` になる。

### server/

* このディレクトリのファイルはサーバーサイドにのみ送られる。


# API

* [Documentation - Meteor](http://docs.meteor.com/#/full/)

## リアクティビティ

Meteor のリアクティブオブジェクトは次の 2 つの名前で区別される:

* Reactive computation
* Reactive data source

前者はリアクティブにトリガーされ処理を実行するコールバックとして実装されている。後者は HTML テンプレートのように予め宣言しておく事で、データに変更があると自動更新されるオブジェクトとして実装されている。

* [Reactivity - Documentation - Meteor](http://docs.meteor.com/#/full/reactivity)

### Reactive computation

* [Templates](http://docs.meteor.com/#/full/livehtmltemplates)
* [Tracker.autorun](http://docs.meteor.com/#tracker_autorun)
* [Blaze.render](http://docs.meteor.com/#blaze_render)
* [Blaze.renderWithData](http://docs.meteor.com/#blaze_renderwithdata)
* [ReactiveVar](http://docs.meteor.com/#/full/reactivevar)

### Reactive data source

* [Session](http://docs.meteor.com/#session)
* [Collection](http://docs.meteor.com/#find)
* [Meteor.status](http://docs.meteor.com/#meteor_status)
* [Meteor.user](http://docs.meteor.com/#meteor_user)
* [Meteor.userId](http://docs.meteor.com/#meteor_userid)
* [Meteor.loggingIn](http://docs.meteor.com/#meteor_loggingin)
mergepbxを使ってみる



## 概要

XcodeのプロジェクトをGitで管理する際、複数人で作業をしていると ```.pbxproj``` ファイルのコンフリクトに悩まされる。
これを解消するため ```mergepbx``` を使って見る。

## mergepbx

https://github.com/simonwagner/mergepbx

## インストール

```bash
$ git clone https://github.com/simonwagner/mergepbx
$ cd mergepbx/
$ ./build.py
$ sudo cp mergepbx /usr/local/bin/
```

## gitconfigに設定を追加

```bash
$ vi ~/.gitconfig
```

以下を追加する。

```:.gitconfig
# driver for merging Xcode project files
[merge "mergepbx"]
name = XCode project files merger
driver = mergepbx %O %A %B
```

## gitattributesに設定を追加

```bash
$ cd ${git_repository_root_dir}
$ vim .gitattributes
```

以下を追加する。

```:.gitattributes
*.pbxproj merge=mergepbx
```

## 実行

準備が整ってからマージしてみると、あら不思議とコンフリクトしなくなってました。
WordPressの主なコーディングスタンダード

## PHPのコーディングスタンダード
### インデントと整列
インデントはタブ、立て位置の調整はスペースで行う。
HTMLと混在する場合もインデントはタブで統一。
### スペース
`function my_function( $param1 = 'foo', $param2 = 'bar' ) {`
のように スペースを挿入する。
### 配列
`$x = $foo['bar']`
前後にスペースは不要
###関数名
関数名には常に小文字を使用し、単語と単語はアンダースコアでつなぐ。
###クラス名
クラス名はキャピタライズした単語をアンダースコアでつなぐ。
###ファイル名
ファイル名は全て小文字で単語はハイフンでつなぐ。クラスファイルはclass-ではじまるようにする。
Pharo Smalltalkでクラウドサービスを操作してみる

# Pharo Smalltalkでクラウドサービスを操作してみる
Smalltalk Advent Calendar 2014最後はSmalltalkでクラウドサービスを操作してみます。今回はAmazon Web Servicesを操作してみます。また、クリスマスプレゼントとは言えないかもしれませんが、現在作成中のSDKの一部を公開します。SDKを作り始めたころは初めてAWS自体もEC2、S3ぐらいしか知らなかった私でしたが、公式ドキュメントを読みながらAWSのNoSQLデータベースサービス[DynamoDB](http://aws.amazon.com/jp/dynamodb/)と接続しました。

![dynamodb.png](https://qiita-image-store.s3.amazonaws.com/0/18287/f4b69927-1b9f-0014-1d7c-81828891f872.png)

 
# 制作した経緯
* 自社クラウドサービスのプロトタイプ早急に作成する必要があった
* 仕様変更に柔軟に対応できるSmalltalkで作った
* AWSの公式SDKはSmalltalk版が存在していなかった

Smalltalkのダイナミックな開発環境のおかげでなんとか無事サービスイン。今も改良をし続けております。Smalltalkに何か還元すべきだと考え、公開することにしました。仕事を作成したものはサービスに特化させて作ってしまっため、業務外の時間を使って切り出して一般公開できるものを準備しました（いずれはSDK全てを公開します）。

# 公開して期待したいこと
**Smalltalkerが増えること。特に日本のSmalltalker。** あと私が英語が苦手（というかできないため）。心優しい方が翻訳していただけることを期待。*私の来年の最大の課題です。*

----
----

# インストール

```smalltalk
Gofer new
url:'http://smalltalkhub.com/mc/newapplesho/aws-sdk-smalltalk/main';
    package: 'ConfigurationOfAWS';
    load.
(Smalltalk at: #ConfigurationOfAWS) load.
```

#使い方等
slideshareで公開しました。
http://www.slideshare.net/newapplesho/aws-sdk-for-smalltalk


# 今後について
DynamoDBの改良版、S3, EC2, Elastic Transcoderを公開予定。またEC2を操作するための証明書Signature V2も公開予定。ただし、業務外で作成しているかつ、AWSを色々いじるための時間と私のポケットマネーとの相談しながら作成していきます。

#まとめ

あるきっかけで始まったSmalltalk Advent Calendar 2014でしたが、ほぼ毎日Smalltalkネタが公開されSmalltalkerの私としてはとてもいい月だったと思います。*発起人の私自身が忙しい理由に更新が遅れてしまい申し訳ありませんでした。* 「Smalltalkって何？」って言われ続けたり、「どこがいいの？」と言われ続けることが多いですが、今回のAdvent Calendarを通じて少しでもSmalltalkの良さや実用性について分かっていただければよいと思っております。来年もチャンスがあればこういったイベントをやってみようと思います。では。

#参考
AWS SDK for Smalltalk
https://github.com/newapplesho/aws-sdk-smalltalk

AWS SDK for Smalltalk - slideshare
http://www.slideshare.net/newapplesho/aws-sdk-for-smalltalk

情熱Smalltalker SmalltalkとAWSでクラウドサービスを実現するための挑戦
http://www.slideshare.net/newapplesho/20140925smalltalk-study

愛せよ、さもなくば捨てよ。
http://www.slideshare.net/newapplesho/ss-42024412

DynamoDB
http://aws.amazon.com/jp/dynamodb/

Signing AWS API Requests
http://docs.aws.amazon.com/general/latest/gr/signing_aws_api_requests.html

DynamoDB Local
http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Tools.DynamoDBLocal.html

DynamoDB Local for Desktop Development
http://aws.amazon.com/jp/blogs/aws/dynamodb-local-for-desktop-development/

DynamoDB API Reference
http://docs.aws.amazon.com/amazondynamodb/latest/APIReference/Welcome.html
长连接和Keepalive

TCP协议中有长连接和短连接之分。短连接在数据包发送完成后就会自己断开，长连接在发包完毕后，会在一定的时间内保持连接，即我们通常所说的Keepalive（存活定时器）功能。
默认的Keepalive超时需要7,200,000 milliseconds，即2小时，探测次数为5次。它的功效和用户自己实现的心跳机制是一样的。开启Keepalive功能需要消耗额外的宽带和流量，尽管这微不足道，但在按流量计费的环境下增加了费用，另一方面，Keepalive设置不合理时可能会因为短暂的网络波动而断开健康的TCP连接。

keepalive并不是TCP规范的一部分。在Host Requirements RFC罗列有不使用它的三个理由：（1）在短暂的故障期间，它们可能引起一个良好连接（good connection）被释放（dropped），（2）它们消费了不必要的宽带，（3）在以数据包计费的互联网上它们（额外）花费金钱。然而，在许多的实现中提供了存活定时器。
一些服务器应用程序可能代表客户端占用资源，它们需要知道客户端主机是否崩溃。存活定时器可以为这些应用程序提供探测服务。Telnet服务器和Rlogin服务器的许多版本都默认提供存活选项。
个人计算机用户使用TCP/IP协议通过Telnet登录一台主机，这是能够说明需要使用存活定时器的一个常用例子。如果某个用户在使用结束时只是关掉了电源，而没有注销（log off），那么他就留下了一个半打开（half-open）的连接。如果客户端消失，留给了服务器端半打开的连接，并且服务器又在等待客户端的数据，那么等待将永远持续下去。存活特征的目的就是在服务器端检测这种半打开连接。
也可以在客户端设置存活器选项，且没有不允许这样做的理由，但通常设置在服务器。如果连接两端都需要探测对方是否消失，那么就可以在两端同时设置（比如NFS）。


keepalive工作原理：
若在一个给定连接上，两小时之内无任何活动，服务器便向客户端发送一个探测段。（我们将在下面的例子中看到探测段的样子。）客户端主机必须是下列四种状态之一：
1) 客户端主机依旧活跃（up）运行，并且从服务器可到达。从客户端TCP的正常响应，服务器知道对方仍然活跃。服务器的TCP为接下来的两小时复位存活定时器，如果在这两个小时到期之前，连接上发生应用程序的通信，则定时器重新为往下的两小时复位，并且接着交换数据。
2) 客户端已经崩溃，或者已经关闭（down），或者正在重启过程中。在这两种情况下，它的TCP都不会响应。服务器没有收到对其发出探测的响应，并且在75秒之后超时。服务器将总共发送10个这样的探测，每个探测75秒。如果没有收到一个响应，它就认为客户端主机已经关闭并终止连接。
3) 客户端曾经崩溃，但已经重启。这种情况下，服务器将会收到对其存活探测的响应，但该响应是一个复位，从而引起服务器对连接的终止。
4) 客户端主机活跃运行，但从服务器不可到达。这与状态2类似，因为TCP无法区别它们两个。它所能表明的仅是未收到对其探测的回复。
 
服务器不必担心客户端主机被关闭然后重启的情况（这里指的是操作员执行的正常关闭，而不是主机的崩溃）。当系统被操作员关闭时，所有的应用程序进程（也就是客户端进程）都将被终止，客户端TCP会在连接上发送一个FIN。收到这个FIN后，服务器TCP向服务器进程报告一个文件结束，以允许服务器检测这种状态。
在第一种状态下，服务器应用程序不知道存活探测是否发生。凡事都是由TCP层处理的，存活探测对应用程序透明，直到后面2，3，4三种状态发生。在这三种状态下，通过服务器的TCP，返回给服务器应用程序错误信息。（通常服务器向网络发出一个读请求，等待客户端的数据。如果存活特征返回一个错误信息，则将该信息作为读操作的返回值返回给服务器。）在状态2，错误信息类似于“连接超时”。状态3则为“连接被对方复位”。第四种状态看起来像连接超时，或者根据是否收到与该连接相关的ICMP错误信息，而可能返回其它的错误信息。

linux内核包含对keepalive的支持。其中使用了三个参数：tcp_keepalive_time（开启keepalive的闲置时 长）tcp_keepalive_intvl（keepalive探测包的发送间隔）和tcp_keepalive_probes （如果对方不予应答，探测包的发送次数）；在liunx中，keepalive是一个开关选项，可以通过函数来使能。具体地说，可以使用以下代码：
setsockopt(rs, SOL_SOCKET, SO_KEEPALIVE, (void *)&keepAlive, sizeof(keepAlive));
当tcp检测到对端socket不再可用时(不能发出探测包,或探测包没有收到ACK的响应包),select会返回socket可读,并且在recv时返回-1,同时置上errno为ETIMEDOUT。此时TCP的状态是断开的。


keepalive参数设置代码如下： 

```
// 开启KeepAlive
BOOL bKeepAlive = TRUE;
int nRet = ::setsockopt(socket_handle, SOL_SOCKET, SO_KEEPALIVE, (char*)&bKeepAlive, sizeof(bKeepAlive));
if (nRet == SOCKET_ERROR) {
	return FALSE;
}
// 设置KeepAlive参数
tcp_keepalive alive_in = {0};
tcp_keepalive alive_out = {0};
alive_in.keepalivetime = 5000; // 开始首次KeepAlive探测前的TCP空闭时间
alive_in.keepaliveinterval = 1000; // 两次KeepAlive探测间的时间间隔
alive_in.onoff = TRUE;
unsigned long ulBytesReturn = 0;
nRet = WSAIoctl(socket_handle, SIO_KEEPALIVE_VALS, &alive_in, sizeof(alive_in), &alive_out, sizeof(alive_out), &ulBytesReturn, NULL, NULL);
if (nRet == SOCKET_ERROR) {
	return FALSE;
}
```

开启Keepalive选项之后，对于使用IOCP模型的服务器端程序来说，一旦检测到连接断开，GetQueuedCompletionStatus函数将立即返回FALSE，使得服务器端能及时清除该连接、释放该连接相关的资源。对于使用select模型的客户端来说，连接断开被探测到时，以recv目的阻塞在socket上的select方法将立即返回SOCKET_ERROR，从而得知连接已失效，客户端程序便有机会及时执行清除工作、提醒用户或重新连接。

TCP连接非正常断开的检测(KeepAlive探测)
此处的”非正常断开”指TCP连接不是以优雅的方式断开,如网线故障等物理链路的原因,还有突然主机断电等原因
有两种方法可以检测:1.TCP连接双方定时发握手消息 2.利用TCP协议栈中的KeepAlive探测
第二种方法简单可靠,只需对TCP连接两个Socket设定KeepAlive探测。

备注：长连接虽好，但是比较好用但是占用系统资源比较大。个人建议如无特殊需要，用自己的心跳包机制最好
SystemRescueCdでsambaを使う

## download

* http://www.sysresccd.org/Download

## 起動

* キーボードの種類で 22 (ja) を選択

##  smb.conf

```bash:
cp /etc/samba/smb.conf{.sample,}
```

```diff:
- security = user
+ security = share

+ [public]
+    path = /media/
+    public = yes
+    only guest = yes
+    writable = yes
+    printable = yes
```

```bash:smbd起動
killall smbd
smbd
```

```bash:IPアドレス確認
ip a | grep 192
```
Using Kibana4 with ElasticSearch Java API

# Kibana4 and requirements for instance which launched thorough Java API

Launch elasticsearch through Java API.

* Open HTTP Port.
* Enable http Cross domain access for Kibana4.

```scala
import java.nio.file.Paths

import org.elasticsearch.client.Client
import org.elasticsearch.common.settings.ImmutableSettings
import org.elasticsearch.node.{Node, NodeBuilder}

object Main {
  def main(args: Array[String]) {
    val path = Paths.get("./elasticsearch")
    NodeBuilder
      .nodeBuilder()
      .clusterName("test")
      .local(false)
      .settings(
        ImmutableSettings
          .settingsBuilder()
          .put("path.home", path)
          .put("path.logs", path.resolve("logs"))
          .put("http.enabled", true)
          .put("http.port", 9200)
          .put("http.cors.enabled", true)
          .put("http.cors.allow-origin", "/.*/")
      ).node().client()
  }
}
```

Since Kibana4 using script plugin groovy. Latest elasticsearch contains groovy plugin itself, but not groovy runtime. And this dependency is not solved. We have to add groovy runtime explicitly like below.

```sbt
name := "kibana4-and-elasticserach"

libraryDependencies ++= Seq(
  "org.elasticsearch" % "elasticsearch" % "latest.release",
  "org.codehaus.groovy" % "groovy-all" % "latest.release"
)
```
CakePHP2.x系の安定版をComposerでインストール

コマンドラインから以下を実行する。

```bash
composer create-project --prefer-dist -s stable cakephp/cakephp myapp
```

以下の値を変更する。

```php:app/Config/core.php
	Configure::write('Security.salt', 'ABCD....');
	Configure::write('Security.cipherSeed', '1234....');
```

bootstrap.phpにプラグインの設定を追加。（DebugKit用）

```php:app/Config/bootstrap.php
 App::build(array(
     'Plugin' => array(ROOT . '/Plugin/'),
 ));

 CakePlugin::load('DebugKit');
```

AppControllerでDebugKitのツールバーを読み込む。


```php:app/Controller/AppController.php
class AppController extends Controller {
		public $components = array('DebugKit.Toolbar');
}
```

以下を削除。

```php:app/View/Layouts/default.ctp
	<?php echo $this->element('sql_dump'); ?>
```

/Plugin/DebugKit/webroot 以下のcss, img, jsフォルダーを
/app/webroot/debug_kit 以下にコピー。

微妙にプラグインとベンダーディレクトリの名称が違うので.gitignoreに追加。
あと、vimのun~ファイル対策追加。


```text:.gitignore
/Plugin
/vendor
*.un~
```
.gitignoreの生成にはこちらを参照されたし。
https://www.gitignore.io/


あと、database.phpを作ったり、tmpフォルダーのパーミッションを設定したりは各自の環境に合わせて実施のこと。
Using ELK(ElasticSearch 1.4.2 + Logstash 1.4.2 + Kibana 4 Beta3)

This content moved to [Using ELK(ElasticSearch 1.4.2 + Logstash 1.4.2 + Kibana 4 Beta3)](https://watermint.org/2014/12/24/using-elasticsearch-logstash-kibana/).
Slack + Hubot で v2 services token provided, please follow the upgrade instructionsと出るとき

## hubot-slack adapter が新しくなっている


[SlackのHubot Integrationが知らぬ間にアップデートされてた - Qiita](http://qiita.com/KeitaMoromizato/items/0ee11d795d18a49538d8)

連携が新しくなったんですね・・・

コレをちゃんと把握せずに、古いSlack Hubot Integrationで生成されたトークンを使って、新しいhubot-slackを使おうとするとエラーになります。

## Hubot install

```
$ npm install -g yo generator-hubot
$ mkdir my-hubot
$ yo hubot
```

で新しいhubotを作った場合、Slackのアダプタも新しくなっているので要注意。
古いIntegrationで使ってたトークンをそのまま使おうとすると・・

```
v2 services token provided, please follow the upgrade instructions
```
と出て来てHubotが起動出来ない。

## 原因

参考URL: [hubot-slack/slack.coffee at master · slackhq/hubot-slack](https://github.com/slackhq/hubot-slack/blob/master/src/slack.coffee)

このメッセージのままググってみると、アダプタのソースコードがヒットしてくる。
よーく見てみると、

```
return @robot.logger.error "v2 services token provided, please follow the upgrade instructions" unless (options.token.substring(0, 5) == 'xoxb-')
```

と書いてあるところで引っかかっているので、トークンの頭５桁は新しいものだと```xoxb-```になってるので、それ以外のトークンを指定された場合は起動しないようになってました。

古いのを使い回す輩対策なんですね・・

新しいHubot Integrationを作ると、ちゃんと新しいトークンが出てくるので、あんまりこんなのにハマる人居ないかも・・

新しいのだと、```HUBOT_SLACK_TOKEN```だけで良くなって、他の設定は要らなくなります。
~~```HEROKU_URL```とかもnpmの```hubot-heroku-keepalive```なんかが入って要らなくなるみたいです。~~
↑間違えてました。
hubot-heroku-keepaliveで使う環境変数が、HEROKU_URLが非推奨になり、HUBOT_HEROKU_KEEPALIVE_URLを使うようになったそうです。

参考URL : [hubot-scripts/hubot-heroku-keepalive](https://github.com/hubot-scripts/hubot-heroku-keepalive)

herokuにデプロイしてて、keep-aliveさせたければ


```
$ heroku config:set HUBOT_HEROKU_KEEPALIVE_URL=PASTE_WEB_URL_HERE
```

せよ。とのことでした。

逆パターンで古いHubotのnpm versionのまま、新しいSlack Hubot Integrationやろうとする場合もハマるんだろうな。
SourceTree 2.0.4 Update Mac OS X でエラーの場合の対処法

Mac版 SourceTree を 2.0.4 にアップデートすると、大量のエラーメッセージがダイアログに表示され Mercurial のローカルリポジトリが使えなくなる、という現象に遭遇した

Preferences > Mercurial で「拡張機能」内の
hgattic と hgsubversion のチェックを外すと動作する

hgattic を外すだけでも動くかもしれないが、開発元のブログには hgsubversion のチェックを外してくれ、と書かれている
[Swift]AnyObject型の配列からString型の値だけ抜き出す方法


俺の名はケンヤ。難事件をいくつも迷宮入りさせたニート。しかし ある時謎の組織入社し薬を飲まされ身体が縮んで **Braian** になっちゃった。

***詰まったのでメモ残します〜***

```
var k: AnyObject = []
var array: [AnyObject] = ["abc", 1, "def", 2, "ghi", 3]

for (var i = 0; i < array.count; i++) {
    if let string = array[i] as? String {
        k.append(string)
    }
}
println(k)
//["abc", "def", "ghi"]
```
macからVirtualBox VMにssh接続する

# VirtualBox の環境設定を変更する
- メニューバーから「VirtualBox」→「環境設定」→「ネットワーク」→「ホストオンリーネットワーク」を選択
- 右のほうにある「＋」を押す
- ![7340e6cdaced0112f8adcc8287e66862.png](https://qiita-image-store.s3.amazonaws.com/0/62697/0d2f6cc4-f63b-cb31-69c4-ef9036924bc9.png)


# ホストオンリーアダプターのIPアドレスを確認する
- メニューバーから「VirtualBox」→「環境設定」→「ネットワーク」→「ホストオンリーネットワーク」を選択
- 上の手順で作ったホストオンリーネットワークアダプターを選択
- 右のほうにある3つのぼたんのうち、一番下のボタンを押す（オンマウスすると「ホストオンリーネットワークを編集する」って出る）
- ![ed8cd174a21fb76e355ea59cd8924b7d.png](https://qiita-image-store.s3.amazonaws.com/0/62697/fe93613a-27b5-7736-b0a6-52badc0bdf66.png)
- IPv4アドレスを控えておく


# VMのネットワーク設定を変更する
- 「ネットワーク」→「アダプター2(有効化されてないアダプターならどれでも可)」を選択
- 「ネットワークアダプターを有効化」にチェックを入れる
- 「割り当て」のプルダウンを「ホストオンリーアダプター」にする
- ![8d0e143516d95002e8b4fb4993428311.png](https://qiita-image-store.s3.amazonaws.com/0/62697/d2a839f3-73d3-1311-a9bf-ef10c344ecc1.png)
- MACアドレスはあとで使うので控えておく
- ここまで出来たらVMを起動する

# ifconfig を確認する
- VirtualBoxマネージャーによる設定後にVMを起動したら、ifconfigでネットワークアダプターが追加されてた。
- この状態でmacからsshできるのであれば以下は省略してよい。

# ifcfg-eth1 を作成する
- root 権限で以下のファイルを作成する
    - /etc/sysconfig/network-scripts/ifcfg-eth1

```
DEVICE=eth1
TYPE=Ethernet
ONBOOT=yes
BOOTPROTO=static
HWADDR=08:00:27:20:C6:DD
NAME="eth1"
IPADDR=192.168.56.101
NETMASK=255.255.255.0
NETWORK=192.168.56.1
```

# ネットワークアダプターを起動する
```
ifup eth1
```

# sshできるか確認する
```
ssh (ログインするユーザ名)@192.168.56.101
```
NTPDのCVE-2014-9295脆弱性に関するちょっとした分析

# リンク
### CVE-2014-9295の参考情報
http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-9295
https://bugzilla.redhat.com/show_bug.cgi?id=1176037

### CVE-2014-9295は以下のバグを含んでいます
http://bugs.ntp.org/show_bug.cgi?id=2667
http://bugs.ntp.org/show_bug.cgi?id=2668
http://bugs.ntp.org/show_bug.cgi?id=2669

### バグの利用コード
http://www.securityfocus.com/bid/2540/exploit

以下はバグの分析になります、ntpdに関してはあまり詳しくないのでちょっとしか読めません。

# Buffer overflow in crypto_recv()

### 修正パッチ
http://bugs.ntp.org/attachment.cgi?id=1161&action=diff#a/ntpd/ntp_crypto.c_sec1

### 解説
まずはRSA_public_encryptとRSA_private_decryptはどう動くかを見てください。
https://www.openssl.org/docs/crypto/RSA_public_encrypt.html
RSA_public_encryptは指定した平文をRSAに通して暗号化します

```c
char buffer[128]; // RSA_size(1024)
RSA_public_encrypt(4, "\x00\x00\x00\x01", buffer, rsa, RSA_PKCS1_OAEP_PADDING);
```

次にRSA_private_decryptは暗号化したデータを復号化します
もし平文が4 bytesなら、cookie_bufは先頭の4 bytesしか書き込まれません。

```c
char cookie_buf[128];
RSA_public_encrypt(128, buffer, &cookie, rsa, RSA_PKCS1_OAEP_PADDING);
```

問題のあるコードはcookieの平文を4 bytesしか想定していません、
temp32のサイズは4 bytesなのでもし平文が4 bytes以上ならばオーバーフローが発生します。
オーバーフローする最大のサイズは```RSA_size(host_pkey->pkey.rsa) - 41 - 4```になります。

```c
u_int32 temp32;

...

if (RSA_private_decrypt(vallen,
    (u_char *)ep->pkt,
    (u_char *)&temp32,
    host_pkey->pkey.rsa,
    RSA_PKCS1_OAEP_PADDING) <= 0) {
    rval = XEVNT_CKY;
```

修正後のコードはtemp32を使わず代わりにcookie_bufを動的に確保します、サイズはRSA_private_decryptが書き込める最大のサイズ```RSA_size(host_pkey->pkey.rsa)```、これでオーバーフローが発生しなくなりました。
このあとは平文サイズもチェックされます、4 bytesでなければエラーを返すようになりました。

# Buffer overflow in ctl_putdata()

### 修正パッチ
http://bugs.ntp.org/attachment.cgi?id=1158&action=diff

### 解説
普通のmemcpyバグです。
dataptは送信するパケットデータのバッファ、サイズは```dataend - datapt```。
```ctl_putdata(const char *dp, unsigned int dlen, int bin)```関数はdpの指すデータをdataptに書き込みます。
元の処理はサイズが足りない場合、```ctl_flushpkt```で現存のデータを送信してdataptをrpkt.u.dataにリセットします。
しかしリセットしてもなお足りない場合（```dlen + overhead > CTL_MAX_DATA_LEN```）はオーバーフローを引き起こします。
修正したコードではサイズが足りない場合は分割して送信するようになりました。

**しかしバグはまだ残っています。**
この一行はポインタオーバーフローを引き起こす可能性があります。
```while (dlen + overhead + datapt > dataend)```
正しくはこう書くべきです
```while (dlen + overhead > dataend - datapt)```

ポインタオーバーフローについてはこの記事を参考してください
http://lwn.net/Articles/278137/

# buffer overflow: configure() 

### 修正パッチ
http://bugs.ntp.org/attachment.cgi?id=1159&action=diff

### 解説
また普通のmemcpyバグです。
修正したコードではreqptからreqendまでのデータをremote_config.bufferにコピーする前にサイズをチェックするようになりました。

# まとめ
バッファに対する操作のコードを書くとき、十二分の注意を払わなければいけません。
それができなければrustまたはjavaのようなメモリー安全な言語を使うべきです。
バグを検出するために以下のツールが使えます。
http://valgrind.org/
http://code.google.com/p/address-sanitizer/
http://cppcheck.sourceforge.net/
http://clang-analyzer.llvm.org/
しかしこれらのツールが2667みたいなバグを検出できるとは思えません、ツールだけを頼ってもだめです。
WordPressでカスタムルーティングを実装

## WordPressをMVC風につかう
WordPressは洗練された管理画面や豊富なテーマファイル、プラグインが存在することから、ブログのようなシンプルなものからECなど複雑なWebアプリケーションの開発にまで様々な用途で用いられています。
カテゴリ機能やタグ機能が標準で実装され、パーマリンクの変更も手軽にできる反面、デフォルトのURLパターンを無視したURL構造の実現には少しテクニックが必要です。
システムの設計上、あるいはSEOを意識したURL構造を自由に実現したいときに使えるカスタムルーティングの実装方法をご紹介します。

## URLのリライトルール
ユーザー登録やログインに関する機能のURLを、
登録: http://www.example.com/user/register
ログイン: http://www.example.com/user/login
のように/user以下のディレクトリにまとめたいとします。

```php:plugin.php
/*コンストラクタ内に記述*/
add_action( 'init', array( $this, 'manage_user_routes' ) );
/*ここまで*/

public function manage_user_routes() {
  add_rewrite_rule( '^user/([^/]+)/?', 'index.php?control_action=$matches[1]', 'top' );
    }

```

まずプラグインのメインファイルのコンストラクタの中でinitアクションをフックしてURLのカスタムルールを定義します。user/以降の文字列を正規表現で取得し、一致した文字列をcontrol_actionというパラメーター名でindex.phpにGETリクエストを送るように設定しています。
第3引数のtopは、このリライトルールを既存のリライトルールよりも高い優先順位とするためのオプションです。

## カスタムクエリ変数
次に、control_actionをパブリッククエリ変数として認めるよう以下のコードをコンストラクタに追加します。

```php:plugin.php
/*コンストラクタ内に記述*/
add_filter( 'query_vars', array( $this, 'manage_user_routes_query_vars' ) );
/*ここまで*/
public function manage_user_routes_query_vars( $query_vars ) {
  $query_vars[] = 'control_action';
  return $query_vars;
}
```

control_actionという新しいカスタムクエリ変数を追加して書き換えた配列を返します。
また、URLのリライトルールに変更を加えたためフラッシュしてWordPressに再認識させるための関数も実装します

```php:plugin.php
/*コンストラクタ内に記述*/
register_activation_hook( __FILE__, array( $this, 'flush_application_rewrite_rules' ) );
/*ここまで*/

public function flush_application_rewrite_rules() {
  $this->manage_user_routes();
  flush_rewrite_rules();
}
```


## カスタムURLに応じたテンプレートを描画
MVCモデルでのコントローラーに当たる部分を下記のように実装します。

```php:plugin.php
/*コンストラクタ内に記述*/
add_action( 'template_redirect', array( $this, 'front_controller' ) );
/*ここまで*/

/*プラグインの接頭辞をhogeとしています*/
public function front_controller() {
  global $wp_query;
  $control_action = isset ( $wp_query->query_vars['control_action'] ) ? $wp_query->query_vars['control_action'] : '';
  switch ( $control_action ) {
    case 'register':
      do_action( 'hoge_register_user' );
      break;

    case 'login':
      do_action( 'hoge_login_user' );
      break;
  }
}
```

WordPressがテンプレートファイルを探すプロセスに割り込むために、"template_redirect"というアクションフックが提供されています。
これをフックしてcontrol_actionというパラメーターが存在する場合は、パラメーターに応じたアクションフックを作成するようにします。
あとは以下のようにアクションフックごとに該当のテンプレートファイルをincludeするような関数を実装して完成です。

```php:plugin.php
/*コンストラクタ内に記述*/
add_action( 'hoge_register_user', array( $this, 'register_user' ) );
/*ここまで*/

public function register_user() {
  include dirname(__FILE__) . '/templates/register.php';
}
```

※ここでdo_actinoを使わずに直接関数を呼び出してしまうと後の機能拡張に弱くなってしまうので、あえてdo_actionを用いてアクションフックを作成し、新機能の追加をしやすいように設計しています。

## 参考
[WordPressによるWebアプリケーション開発](http://www.amazon.co.jp/WordPress%E3%81%AB%E3%82%88%E3%82%8BWeb%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E9%96%8B%E7%99%BA-Rakhitha-Nimesh-Ratnayake/dp/4873117062/ref=sr_1_1?ie=UTF8&qid=1419404246&sr=8-1&keywords=wordpress%E3%81%AB%E3%82%88%E3%82%8Bweb%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E9%96%8B%E7%99%BA "WordPressによるWebアプリケーション開発")
WebView で自己署名サーバ証明書を使ったサイトを表示する

JavaFX 8 では `WebView` を使用して Java アプリケーション上に WebKit ベースのブラウザ機能を配置することが出来ます。ただこれ自己署名証明書を使用した HTTPS サイトと通信しようとするとデフォルトでは真っ白になったまま何も表示されない状態になってしまいます。

プロダクション環境では信頼できる CA から発行された (高価で期限付きの) サーバ証明書を使用しても、ローカルやステージング環境では自己署名証明書で済ませていることがよくありますよね。

`WebView` (`WebEngine`) は根本の通信部分で `HttpsURLConnection` を使用していますので、ステージング環境でのみ全てのサーバ証明書を検証しない `TrustManager` を設定してやれば自己署名証明書を使用したサイトも `WebView` で表示されるようになります (以下のコードは Scala ですが Java への読み替えは難しくないと思います)。

```scala
import java.security.SecureRandom
import java.security.cert.X509Certificate
import javax.net.ssl.{HttpsURLConnection, SSLContext, TrustManager, X509TrustManager}

val trustAll:Array[TrustManager] = Array(
  new X509TrustManager {
    override def getAcceptedIssuers:Array[X509Certificate] = null
    override def checkClientTrusted(x509Certificates:Array[X509Certificate], s:String):Unit = None
    override def checkServerTrusted(x509Certificates:Array[X509Certificate], s:String):Unit = None
  }
)
val sc = SSLContext.getInstance("SSL")
sc.init(null, trustAll, new SecureRandom())
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory)
```

この方法は `WebView` だけでなく `URL` や `URLConnection` クラスを使用して自己署名証明書を使用したサイトと通信する場合にも有効です。
【FileMaker】Selfって出来んのね

という結論は、元々いたJava関連ではthisをよく使っていたので、すんなり入ってきた感じです。

例えば、条件付き書式であるフィールドで、

DayNameJ ( Self ) = "日曜日"

みたいに指定して、日曜日だったら色を赤色にする、とかね。
FileMakerのSelfヘルプは、[こちら](http://www.filemaker.co.jp/help/html/func_ref3.33.18.html)。

ただ、特に何も他言語をやったことがなかったら「俺だよ、俺！俺のことを聞いてんだろ〜」と自己チューな関数だって覚えておくといいかもしれません。

いろんな場面で使う機会が多いと思うので、残しておきます。

おまけで、上記の条件付き書式を指定した例を出します。

いたって単純ですが、土日に色をつける設定です。
![1211_1.png](https://qiita-image-store.s3.amazonaws.com/0/60538/fdf0f9cb-9b39-a117-4645-9f8ec5aa8bb5.png)

Excelに保存してあった今年の祝日カレンダーをインポートしてみると、条件付き書式が機能していることがわかりますね〜。
![1211_2.png](https://qiita-image-store.s3.amazonaws.com/0/60538/5557e95c-355c-ac99-bd87-190ef48afa86.png)

日付の色つけ、いろんなところであると思うので、Selfで条件付き書式を使ってくださいね。
【Mac】よく使うeclipseコマンド【自分用メモ】

eclipseで私がよく使うショートカットキーです
あまり参考にはならないかもしれませんが、見ていってください

control + Space
コンテンツ・アシスト

command + Z
元に戻す

control + Up
control + Down
行のスクロール

command + S
ファイルのセーブ

command + W
ファイルを閉じる

shift + command + F11
実行

あれ？よくよく書いてみたら全然使ってないですね・・・
今後使えるコマンドを増やしていきたいです
Facebookにシェアする時に「API Error Code: 100」が出る時の備忘録

#YouTubeの共有ボタンでエラーがでる時とか

YoutubeにあるFacebookの共有ボタンで、動画を投稿できないと問い合わせがあった。
調べてみたら、確かにIEでは以下のエラーが出て投稿できない。

```
This dialog has been passed a bad parameter.

API Error Code: 100
API Error Description: Invalid parameter
Error Message: Requires valid redirect URI.
```

##IEはURLを2083文字までしか受け付けない

パラメータがおかしいと仰っているので、
URLの文字数を数えたら案の定2083文字で途切れている。
IEさんのいつものやつです。

> [Microsoft サポート - Internet Explorer では URL に最大 2,083 文字が使用可能 ](http://support.microsoft.com/kb/208427/ja) 

Youtubeの共有ボタンは動画のタイトルはもちろん、
説明文まで含めてあるので、それらが長いと溢れてしまう。

具体的には以下の様になっていて、

```html
https://www.facebook.com/dialog/feed?
app_id=XXXXXXX&
link=XXXXXXX&
display=popup&
name=動画のタイトル&
caption=アップロードしたユーザー：XXXXXXX&
description=動画の説明文&
picture=XXXXXXX&
source=XXXXXXX&
ref=share&
actions=XXXXXXX&
redirect_uri=https://www.youtube.com/facebook_redirect
```

最後の `redirect_uri` が溢れてしまうのでエラーになるみたい。
もちろん日本語を使っていると上限は更に短くなる。

##とはいえ

とはいえ動画の投稿者が編集するほか回避する事はできないし、
視聴者としては、別のブラウザを使って頂くしかなさそう。

今回はYouTubeだけど、長さの分からない文章をシェアするボタンとかを
用意する時には気をつけた方が良いんだろうなーという備忘録でした。
指定した拡張子のみ、特定のHTTPレスポンスヘッダを追加する方法


以下、URLが「rss.xml 」で終わるときのみ、
「Access-Control-Allow-Origin : * 」をレスポンスヘッダに設定する例です。
正規表現で特定の拡張子のみレスポンスヘッダを書き換えるのに使ってます。

```xml:設定例.config
</configuration>
  </system.webServer>
（中略）
    <rewrite>
      <outboundRules>
        <rule name="カスタムヘッダ（RSS出力）">
          <match serverVariable="RESPONSE_Access_Control_Allow_Origin" pattern=".*" />
          <conditions>
            <add input="{REQUEST_URI}" pattern="rss\.xml$" />
          </conditions>
          <action type="Rewrite" value="*"/>
        </rule>
      </outboundRules>
    </rewrite>
（中略）
  </system.webServer>
</configuration>

```



設定する個所を[[\*\*\*hoge\*\*\*]]とすると、

```xml:web.config
</configuration>
  </system.webServer>
（中略）
    <rewrite>
      <outboundRules>
        <rule name="カスタムヘッダ">
          <match serverVariable="[[***追加したいHTTPレスポンスヘッダ***]]" pattern=".*" />
          <conditions>
            <add input="{REQUEST_URI}" pattern="[[***対象のファイル***]]" />
          </conditions>
          <action type="Rewrite" value="[[***追加したいHTTPレスポンスヘッダの値***]]"/>
        </rule>
      </outboundRules>
    </rewrite>
（中略）
  </system.webServer>
</configuration>

```

・追加したいHTTPレスポンスヘッダ
　１．追加したいレスポンスヘッダのハイフン（-）をアンダーバー（\_）に置き換える
　２．頭に RESPONSE_をつける
　Access-Control-Allow-Originの場合
　⇒ RESPONSE_Access_Control_Allow_Origin


・対象のファイル
　rss\\.xml$：URLが rss.xml で終わる場合の指定
　\\.xml：拡張子がXMLの場合の指定（URLが .xml で終わる）


・追加したいHTTPレスポンスヘッダの値
　レスポンスヘッダの値として出力したい任意の値を設定してください



参考１：[IIS Rewrite モジュール2.0 の設定（公式）](http://www.iis.net/learn/extensions/url-rewrite-module/url-rewrite-module-20-configuration-reference)
　　　「Accessing Response Headers from Rewrite Rules」の項を参照
参考２：[\[stackoverflow.com\] *.xml.gzでのみ「X-Robots-Tag」を有効にしたい](http://stackoverflow.com/questions/9522348/add-custom-header-based-on-file-type)
プルダウンの少し特殊な操作

selectbox選択時にmodalウィンドウを表示するという
少し意味不明な仕様を実装しょうとして詰まった時のメモ。

```lang:javascript
$("#test select").click(function() {
  $(this).trigger("blur");

  # modal開く処理
});
```

clickのみのイベントハンドラのみだとoption選択値が残ってしまい、
モーダルよりも前面に表示されてしまう。
UEFI の資料の行方 Adventカレンダー２４日目

UEFI Advent Calendar 2014 の２４日の記事です。

新しいブートローダEFI,資料の行方とEDKの行方について調べてみました。だいたい、資料が無くてハマる、資料を探せなくて挫折する事が多い僕のただの備忘録になっていますが、同じような事が起きる事を防ぐ為に、ひたすら資料をURLを貼っていく。

1.先ずは、堅くIntelのサイト
http://www.intel.co.jp/content/www/jp/ja/architecture-and-technology/unified-extensible-firmware-interface/efi-homepage-general-technology.html

2.またIntelだけどこちらはUEFIのコミュニティサイト
http://uefidk.intel.com/

3.uefi.orgのサイト
http://www.uefi.org/

4.ご存知、Archのwiki
https://wiki.archlinux.org/index.php/Unified_Extensible_Firmware_Interface_%28%E6%97%A5%E6%9C%AC%E8%AA%9E%29

5.UDKやらEDKのサイト
http://tianocore.sourceforge.net/wiki/UDK2014

6.実はIntelGalileoは32bitUEFIで遊べるというお話
https://intel.activeevents.com/sz14/connect/sessionDetail.ww?SESSION_ID=1155

7.EFIシェルのコマンド一覧
https://software.intel.com/en-us/articles/efi-shells-and-scripting/

8.Intel UEFI Architecture and Technical Overview
https://software.intel.com/en-us/articles/uefi-architecture-and-technical-overview

ひたすらサイトの紹介になりましたが、だいたいこの辺をググりまくってやっています。EDKの環境構築について書こうと思ってましたが、ベース環境が余りにも広すぎて絞れず挫折。

ということで、皆様良いクリスマスイブを！
OracleでORA-00257が出た時のリカバリ

## アーカイブログでパンクするとき
開発環境などで、何もしてないとアーカイブログが溜まりに溜まったせいで、
高速リカバリ領域として使用可能な最大ディスク領域を越えてしまった際にエラーが発生して接続も出来なくなっちゃう
```
ORA-00257: アーカイブ・エラーです。解除されるまで内部接続のみにしてください。
```

これはアーカイブログをOSから削除してもエラーは直らない
そこで、リカバリ方法
※アーカイブログを削除するので、本番環境でやるときはそれなりに注意

## リカバリ方法
### RMANコマンドで当日分のアーカイブログまで削除

```bat:cmd
set ORACLE_SID=HOGE
RMAN TARGET /
RMAN> DELETE ARCHIVELOG UNTIL TIME 'sysdate';

このオブジェクトを削除しますか
と聞かれるので[YES]

```


### 先にOSからファイルを消している場合
先にOSからファイルを削除していると上記のコマンドでは領域が開放されないので
以下の手順を実行

```bat:cmd
set ORACLE_SID=HOGE
RMAN TARGET /
RMAN> CROSSCHECK ARCHIVELOG ALL;
RMAN> DELETE EXPIRED ARCHIVELOG ALL;

このオブジェクトを削除しますか
と聞かれるので[YES]

```


## 補足：高速リカバリ領域の使用率確認クエリ
V$RECOVERY_FILE_DESTを見るだけ
これが100%になるとパンクする

```sql:sqlplus
select
    name,
    round(space_limit/1024/1024/1024,2)||'GB' space_limit,
    round(space_used/1024/1024/1024,2)||'GB' space_used,
    round((space_limit - space_used)/1024/1024/1024,2)||'GB' space_available,
    NUMBER_OF_FILES,
    round(space_used/space_limit ,3)*100 used_percent
from 
	v$recovery_file_dest
;
```
Yeomanで作成したMEANアプリを別環境(Mac)で動作させる方法

1. MongoDBをインストールする `brew install mongodb`
2. MongoDBを動作させる `launchctl load ~/Library/LaunchAgents/homebrew.mxcl.mongodb.plist`
3. node.jsをインストールする `brew install node`
4. package.jsonで管理されている依存関係を解決する `npm install`
5. bower.jsonで管理されている依存関係を解決する `bower install`
6. MEANアプリを実行する `grunt serve`
ntpdのバージョンアップ

ntpのバージョンアップを行います


# ntpd起動状態の確認

psで確認します


```shell-session
[root@i-2411-45830-VM ~]# ps aux | grep ntpd
ntp       1243  0.0  0.0  30440  1544 ?        Ss   Nov14   0:03 ntpd -u ntp:ntp -p /var/run/ntpd.pid -g
root     25939  0.0  0.0 107448   936 pts/1    S+   10:56   0:00 grep ntpd
```


serviceのステータスでも確認

```shell-session
[root@VM ~]# service ntpd status
ntpd (pid  1243) を実行中...
```



# ntpdのバージョン確認

バージョン確認

```shell-session
[root@VM ~]# ntpq -c rv
---中略---
version="ntpd 4.2.4p8@1.1612-o Fri Feb 22 11:23:27 UTC 2013 (1)",
---中略---
```

yumで確認

```shell-session
[root@VM ~]# yum list installed | grep ntp
ntp.x86_64            4.2.4p8-3.el6.centos
ntpdate.x86_64        4.2.4p8-3.el6.centos
```

4.2.4でした。

# ntpdのバージョンアップ
## yumでupdateバージョンを確認
```shell-session
[root@VM ~]# yum check-update | grep ntp
ntp.x86_64                         4.2.6p5-2.el6.centos             updates     
ntpdate.x86_64                     4.2.6p5-2.el6.centos             updates 
```

## update

```shell-session
[root@VM ~]# yum update ntp
---中略---
Updated:
  ntp.x86_64 0:4.2.6p5-2.el6.centos                                             

Dependency Updated:
  ntpdate.x86_64 0:4.2.6p5-2.el6.centos                                         

Complete!
```

## updateされたか確認

```shell-session
[root@VM ~]# yum list installed | grep ntp
ntp.x86_64            4.2.6p5-2.el6.centos
ntpdate.x86_64        4.2.6p5-2.el6.centos
```


```shell-session
[root@VM ~]# ntpq -c rv
---中略---
version="ntpd 4.2.6p5@1.2349-o Sat Dec 20 02:53:39 UTC 2014 (1)",
---中略---
```


# ntpdを再起動

```shell-session
[root@VM ~]# service ntpd restart
ntpd を停止中:                                             [  OK  ]
ntpd を起動中:                                             [  OK  ]
```
標準入力を受け取ってトリミングする

## コード
```php
<?php
    $input_data = trim(file_get_contents('php://STDIN'));
?>
```


## 使用した関数
- [trim](http://php.net/manual/ja/function.trim.php)
- [file_get_contents](http://php.net/manual/ja/function.file-get-contents.php)
ansible tower インストール


## ansible towerとは
・ansibleのGUIツール
・10ノードまでは無償
・オフィシャルサイト
　http://www.ansible.com/tower
・オフィシャルマニュアル
　http://releases.ansible.com/ansible-tower/docs/tower_user_guide-latest.pdf

## 手順まとめ
・事前にオフィシャルサイトからライセンス登録する（初回起動時に必要）
・検証用のdocker containerをcentos6で作る
・ansibleをインストールする
・ansible towerをインストールする

## container 作成


```
$ docker run --name ansible -h ansible -t -i -p 80:80 -p 443:443 -p 8080:8080 centos:centos6 /bin/bash
```

### ansible インストール

epelインストール

```
# yum install -y http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
```

ansibleインストール

```
# yum install -y ansible
```

## ansible tower インストール準備

必要なコマンドインストール

```
# yum install -y sudo wget curl tar
```


## ansible tower インストール

インストーラをダウンロード

```
# wget -O ansible-tower-setup-latest.tar.gz  http://goo.gl/PqwnjK
```

解凍

```
# tar zxvf ansible-tower-setup-latest.tar.gz 
```

設定ファイル修正
　下記４箇所のパスワードを指定
　・pg_password: {password}
　・admin_password: {password}
　・munin_password: {password}
　・rabbitmq_password: {password}

```
# cd ansible-tower-setup-2.0.5/
# vi group_vars/all 
```

セットアップシェル実行

```
# ./setup.sh
```


TASK: [awx_install | create awx database schema]でlogが書けないとエラー
とりあえずLOGGING_SETTINGSのセクションをコメントアウト

```
# vi /etc/awx/settings.py
###############################################################################
# LOGGING SETTINGS
###############################################################################

#LOGGING['handlers']['syslog'] = {
#    'level': 'ERROR',
#    'filters': ['require_debug_false'],
#    'class': 'logging.handlers.SysLogHandler',
#    'address': '/dev/log',
#    'facility': 'local0',
#    'formatter': 'simple',
#}
```

セットアップシェル再実行

```
# ./setup.sh
```

iptables saveでエラー
ダミーファイル作成して当該taskが動かないようにする

```
# touch /etc/sysconfig/iptables
```

セットアップシェル再々実行

```
# ./setup.sh
```

## ライセンス登録
ブラウザ起動
https://192.168.59.103/

ログイン
![スクリーンショット 2014-12-24 13.13.12.png](https://qiita-image-store.s3.amazonaws.com/0/59856/3d4a6ca2-74c8-2ba7-e302-f23fdf0e9d3d.png "スクリーンショット 2014-12-24 13.13.12.png")

ライセンス登録画面が開くので、メールで送られてくるライセンスを登録

## 画面イメージ
ライセンス登録が完了すると使えます。
https://192.168.59.103/
![スクリーンショット 2014-12-24 13.13.41.png](https://qiita-image-store.s3.amazonaws.com/0/59856/dfbe22c4-cd37-2e63-9e79-58bd185b2bb9.png "スクリーンショット 2014-12-24 13.13.41.png")
CLGeocoderを使って逆ジオコーディング


緯度経度から住所を文字情報で取得する。

# コード

    func revGeocoding(coordinate: CLLocationCoordinate2D)
    {
        let location = CLLocation(latitude: coordinate.latitude, longitude: coordinate.longitude)
        var geocoder = CLGeocoder()
        geocoder.reverseGeocodeLocation(location, completionHandler: { (placemarks:[AnyObject]!, error:NSError!) -> Void in
            if (error == nil && placemarks.count > 0) {
                let placemark = placemarks[0] as CLPlacemark
                println("Country = \(placemark.country)")
                println("Postal Code = \(placemark.postalCode)")
                println("Administrative Area = \(placemark.administrativeArea)")
                println("Sub Administrative Area = \(placemark.subAdministrativeArea)")
                println("Locality = \(placemark.locality)")
                println("Sub Locality = \(placemark.subLocality)")
                println("Throughfare = \(placemark.thoroughfare)")
            } else if (error == nil && placemarks.count == 0) {
                println("No results were returned.")
            } else if (error != nil) {
                println("An error occured = \(error.localizedDescription)")
            }
        })
    }

# CLPlacemarkに入っている情報

-   Administrative Area
    -   都道府県
-   Locality
    -   区や市名
-   Sub Locality
    -   さらに細かい地域名

などなど。
端末の設定言語で取得される。
Tech-Circle #2 事前準備

# Tech-Circle #2 事前作業

**注意点**
**作業はAdministrator権限のあるユーザで実施して下さい。**

## VirtualBoxインストール

https://www.virtualbox.org/wiki/Downloads

上のURLから
自身の環境に該当するパッケージ(VirtualBox platform packages)をダウンロード

あとは、ダウンロードしたパッケージをダブルクリックして画面上の設定に従ってインストール

## Vagrantインストール

https://www.vagrantup.com/downloads.html

上のURLから
自身の環境に該当するパッケージをダウンロード

あとは、ダウンロードしたパッケージをダブルクリックして画面上の設定に従ってインストール

インストールが完了したら
コマンドラインから以下のコマンドを実行して確認

```shell-session
> vagrant version
Installed Version: 1.7.1
```

**注意点**

Vagrantのバージョンは1.6以上でお願いします。
ハンズオンで実施予定のDocker providerは1.6以降で利用可能となっています。

## OpenSSH for Windowsインストール

Windowsユーザの方はコマンドラインからsshコマンドが実行できるようsshクライアントのインストールをお願いします。

http://sourceforge.net/projects/opensshwindows/

上のURLからダウンロード

ダウンロードしたmsiファイルをダブルクリックし、インストール実施

インストールが完了したら
コマンドラインから以下のコマンドが実行できるか確認

```shell-session
> ssh
usage: ssh [-1246AaCfghkNnqsTtVvXxY] [-b bind_address] [-c cipher_spec]
           [-D port] [-e escape_char] [-F configfile] [-i identity_file]
           [-L port:host:hostport] [-l login_name] [-m mac_spec] [-o opt
           [-p port] [-R port:host:hostport] [user@]hostname [command]
```

## その他

### 32bitOSを利用の場合、Intel VTやAMD-Vを有効化

今回のハンズオンでは64bit版のUbuntuをVMとして稼働させる予定です。
そのため、32bitOSを利用の場合はIntelVTやAMD-Vを事前に有効に設定してください。

有効化するにはBIOSの設定画面からの有効化が必要です。
BIOS画面上での設定方法は機器毎に異なるため各自確認お願いします。
NginxにSSL証明書を設定してローカルPCから設定確認する


以前 [Nginxにオレオレ証明書を設定する](http://qiita.com/nenokido2000/items/1d1c79a0a443ed923e92)ということをやりましたが、
正規の証明書を入れることになったので、そのメモ書きを残します。

設定確認については、DNS切替前などの理由で設定対象サーバに
FQDN指定でのインターネットアクセスができない場合の確認方法を記載しています。


# 証明書の設定

##証明書の用意
業者に申請して証明書取得するかと思いますが、契約形態によって必要な証明書が
異なりますよね。
今回はクロスルート証明書を使用したため、以下の資材が必要になりました。

* サーバ証明書
* 中間証明書
* クロスルート証明書
* ルート証明書

事前にテキスト形式で用意しておきます。

## 証明書の結合
Nginxでは、中間証明書を個別で設定するディレクティブがないので、
ssl_certificateに全部の証明書を結合したファイルを設定する必要があります。
先程用意した証明書を、エディタでもリダイレクトでも何でもいいので結合しましょう。
※ 今回は結合したファイルを「/etc/nginx/server.crt」として話を進めます。

上から以下の順番で結合されるようにします。

```結合イメージ
-----BEGIN CERTIFICATE-----
サーバ証明書の內容
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
中間証明書の內容
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
クロスルート証明書の內容
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
ルート証明書の內容
-----END CERTIFICATE-----
```

順番を間違えると証明書エラーが発生するので気を付けましょう。

## Nginxへの設定

nginx.confを編集します。
ssl_certificateディレクティブに結合した証明書のファイル、
ssl_certificate_keyに証明書作成に使用した秘密鍵のファイルを設定します。

```nginx.conf
中略...
    server {
        listen 443 ssl;
        ssl_certificate /etc/nginx/server.crt;
        ssl_certificate_key /etc/nginx/server.key;
中略...
    }
```

設定が完了したら、Nginxをリスタートしておきましょう。

# ローカルPCからの設定確認
## hostsの設定
証明書に設定したFQDNで、ローカルPCからSSL設定したサーバに接続できるように、hostsを書き換えて対応します。
Macであれば`/etc/hosts`が編集対象となります。

「210.xxx.xx.xx」というGIPに対して「www.hoge.co.jp」を割り当てたい場合は、以下のような記述を追加することになりますね。

```/etc/hosts
210.xxx.xx.xx www.hoge.co.jp
```

※ 証明書の確認が終わったら、hostsの設定は元に戻しておきましょう。
　意外と忘れがちなので。

## 疎通確認
あとはブラウザで
「https://www.hoge.co.jp」
みたいに指定すれば、先ほど設定した証明書でのSSL通信が確認できます。

もしくは、opensslを使用して確認してもよいですね。

`openssl s_client -connect www.hoge.co.jp:443`

と叩けば、証明書情報の確認ができます。

`Verify return code: 0 (ok)`

が表示されれば、証明書は正しく設定されているということになります。
詳細な情報が表示されるため、証明書エラーが出ているときは
ブラウザよりもこちらの方法で確認したほうがよいかと思います。
【FileMaker】枠線って必要ですか？

FileMakerで作る画面って、枠線がなくてもそれなりに綺麗に出来上がると思うのです。
スターターソリューションでも枠線って多用している感じがありませんよね。

こんな感じで。
![ 1224_1.png](https://qiita-image-store.s3.amazonaws.com/0/60538/8a679a91-e635-d932-b645-1560f61dbb6a.png)
とてもスッキリとして見えます。

枠線があったとしても、
![ 1224_2.png](https://qiita-image-store.s3.amazonaws.com/0/60538/bac3c33b-ced6-ccde-51c4-839800408f8c.png)
フィールドにあるくらいで、項目名にはありません。

だがしかし、（画像は出せないけれど）実際にFileMakerで開発する案件のデザインを見せられると、必ずと言っていいほどExcelのように項目名にも枠線が付いているんですよね。

そんなデザインを見ると、

**枠線書くの、めんどくさいです！**
**いちいちポイント合わせるのもめんどくさいです！**
**手間は一つでも減らしたいです！**

と心の中で叫んでいます。

枠線、必要ですか？
もう、Excelから卒業したんだから、やめましょうよ。
リリースバージョン固定したAmazonLinuxでntpをアップデートする方法

NTPの脆弱性が公開され、年の瀬にアップデート祭りに追われている方も多いかと思います。

http://jvn.jp/vu/JVNVU96605606/
http://itpro.nikkeibp.co.jp/atcl/news/14/122202355/
https://alas.aws.amazon.com/ALAS-2014-462.html


#yumでupdate
Redhat系では、yumのアップデートで脆弱性が修正されたバージョンに入れ替えを行うことができます。

```
yum clean all
yum update ntp
```

しかし、リリースバージョンを固定したAmazonLinuxでは、上記を実行しても

```
No Packages marked for Update
```

と表示され、パッケージが見つからない模様。

#最新版のリリースバージョンからダウンロード
yumの実行時にreleaseverオプションをつけると、リリースバージョンを指定できます。
lastestを指定してntpパッケージを更新すると、修正されたntpパッケージがインストールされました。

```
yum update ntp --releasever=latest
:
================================================================================
 Package        Arch        Version                   Repository           Size
================================================================================
Updating:
 ntp            i686        4.2.6p5-2.22.amzn1        amzn-updates        798 k
Updating for dependencies:
 ntpdate        i686        4.2.6p5-2.22.amzn1        amzn-updates         79 k

Transaction Summary
================================================================================
Upgrade       2 Package(s)
:
```



2014年は大きな脆弱性がたくさん公開され大変な思いをしましたが、これで安心して年を越せそうです。（きっともうこれ以上は...）
[blackbird-td-agent] Monitoring td-agent

この[プラグイン](https://github.com/Vagrants/blackbird-td-agent)ではtd-agentの[monitor_agent](http://docs.fluentd.org/ja/articles/monitoring#)を使ってtd-agentのbufferを監視します。

事前準備
--------

blackbird-td-agentを入れる前に`monitor_agent`の準備をしておきましょう。

### Fluentd `monitor_agent`

`monitor_agent`はfluentdのpluginでbufferの状態をHTTPで取得できるようになるものです。defaultでinstallされているので特にgemを新規にインストールする必要はありません。

```
<source>
  type monitor_agent
  bind 0.0.0.0
  port 24220
</source>
```

上記のようにconfigを書いてfluentdを再起動すれば、`monitor_agent`が有効になります。`monitor_agent`のエンドポイントは`http://localhost:24220/api/plugins.json`です。このURLに対してGETするとbufferのbyte sizeやbuffer queueのlengthが取得でき、blackbird-td-agent pluginではこの値をparseして値を取得しています。


Architecture
------------

`monitor_agent`はその特性上、複数のoutputプラグインが存在すれば複数のjson outputが存在します。そこで、zabbixのLaw Level Discovery Itemを使って動的にアイテムを増やしたり減らしたりすることにしました。

output系のpluginで且つ、json内に`buffer_queue_length`が存在している場合にzabbixのtemplateにひもづくHOSTに対して対象のアイテムをふやしていきます。アイテムの名前には、`plugin_id`が割り振られます。(plugin_idは各プラグインに対して固有のpluginが割り振られるもので、`{"plugin_id": "object:XXXXXXXXXX"}`のような形式のjsonがoutputされるものです。)


Zabbix Template
---------------

### Items(Normal)

通常のアイテムは以下のものが取得できます

* fluentd Processが使用しているmemory量
* fluentdのProcess数

### Law Level Discovery Items(Dynamic)

Law Level Discoveryで動的に変化するアイテムは以下の通り

* buffer queue accumulate rate
    + queue内のアイテムの使用率で`現在のqueue length ÷ configに指定したbuffer_queue_limit`で算出されます
* buffer queue bytes
    + `http://MONITOR_AGENT_HOST:24420/api/plugins.json`から`buffer_total_queued_size`の値を抽出
* buffer queue length
    + `http://MONITOR_AGENT_HOST:24420/api/plugins.json`から`buffer_queue_length`の値を抽出
* current retry count
    + 外部ソースにoutputできなくてretryしている回数
    + `http://MONITOR_AGENT_HOST:24420/api/plugins.json`から`retry_count`の値を抽出
* buffer queue increase amount of buffer queue bytes per-seconds
    + queueにつまれるアイテムのbyte数の秒間増加量、増加量の差分値を取得間隔(blackbird config内のinterval)で割ったもので算出
* buffer queue increase amount of buffer queue length per-seconds
    + 上とおんなじっす(こっちはqueueにつまれるアイテムの量、queue_lengthの増加量)
* buffer queue buffer_queue_limit
    + fluentdのconfigに設定されたbuffer_queue_limitの値

### Triggers

Triggerとしては以下のものを実装しています

* fluentd プロセスがいない
* `retry_count`が一定回数以上
    + 一定回数はMacroで指定できます。defualtは1
* queueのたまってる率が一定数以上
    + Info, Average, Highの三段階でそれぞれMacroで指定できます。

### Graphs

* buffer queue bytes
* buffer queue length
* buffer queue increase amount of buffer queue bytes per-seconds
* buffer queue increase amount of buffer queue length per-seconds

の値をそれぞれ、単一のグラフにしたものです。

----------

fluentdってqueueたまってきてやばいとか、送り先がおかしくて送信できないって時に他のホストORミドルウェアの監視と合わせた複合監視になったり、そもそもretry_count検知するにはlog監視するしかなかったりして、監視するのが微妙に難しかったり、難しいせいでめんどくせーから後でいいやみたいなのになりがちな気がしますｗ
monitor_agentでfluentd自体をしっかり監視ですね。
ZendFramework1 で setcookie する

ZF1 で `Set-Cookie` ヘッダを吐きたかったんですが、ググると `Zend_Http_Cookie` ばっかり引っかかります。
`Zend_Http_Cookie` は `Zend_Http_Client` で利用するもので、フロントコントローラでの利用は想定されていません(多分)。

さらにググると、ネイティブの `setcookie` 関数を使用している例も結構見つかります。
「まさかできないわけないだろー」と調べた所、無事`Zend_Http_Header_SetCookie` クラスを発見出来ました。
このクラスを使用するとクッキーの属性などをオブジェクティブに扱えるので便利です。

…が、実は公式ドキュメントに書いてあったりします。
[レスポンスオブジェクト - Zend_Controller - Zend Framework](http://framework.zend.com/manual/1.12/ja/zend.controller.response.html#zend.controller.response.headers.setcookie)

上記から引用：

```php
$cookie = new Zend_Http_Header_SetCookie();
$cookie->setName('foo')
       ->setValue('bar')
       ->setDomain('example.com')
       ->setPath('/')
       ->setHttponly(true);
$this->getResponse()->setRawHeader($cookie);
```

`Zend_Http_Header_SetCookie` でググっても 49 件しかヒットしないんだぜ？
結構ありそうな処理なのになぜ…。
EC2のAmazon Linuxでntpd祭り対応をする

[JVNVU#96605606: Network Time Protocol daemon (ntpd) に複数の脆弱性](http://jvn.jp/vu/JVNVU96605606/)

これ対応するためにはntpd v4.2.8に上げないとダメらしいですが、Amazon Linuxに関しては別途対応済みパッケージが配られているようです。Amazon Linux AMI Security Centerという公式のサイトで対応策が報告されているので指示にしたがってntpをアップデートしていきます。

* [ALAS-2014-462](https://alas.aws.amazon.com/ALAS-2014-462.html)

### 実行したコマンド
```
$ sudo yum clean all
$ sudo yum update -y ntp 
```

これで、`4.2.6p5-2.22.amzn1`のバージョンのntpが入ってくればおっけーのようです。

```
$ sudo yum list installed | grep ntp
fontpackages-filesystem.noarch       1.41-1.1.2.amzn1             installed
ntp.x86_64                           4.2.6p5-2.22.amzn1           @amzn-updates
ntpdate.x86_64                       4.2.6p5-2.22.amzn1           @amzn-updates
```

自分がコマンドを試した時はAmazon Linux 2014.03では配布されてなかったので、2014.03のOSに関してはAmazon Linux 2014.09にアップグレードしたら、アップデート分が入りました。
elasticsearch kopf plugin インストール


## kopfとは
・クラスタ管理用のプラグイン
・ドイツ語で頭という意味
・headプラグインと似たようなもの
・headプラグインよりなんとなくかっこいい
・多機能


## インストール

elasticsearchのpluginコマンドで実施

```
[root@kibana4 bin]# /usr/share/elasticsearch/bin/plugin --install lmenezes/elasticsearch-kopf/master
-> Installing lmenezes/elasticsearch-kopf/master...
Trying http://download.elasticsearch.org/lmenezes/elasticsearch-kopf/elasticsearch-kopf-master.zip...
Trying http://search.maven.org/remotecontent?filepath=lmenezes/elasticsearch-kopf/master/elasticsearch-kopf-master.zip...
Trying https://oss.sonatype.org/service/local/repositories/releases/content/lmenezes/elasticsearch-kopf/master/elasticsearch-kopf-master.zip...
Trying https://github.com/lmenezes/elasticsearch-kopf/archive/master.zip...
Downloading ..................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................DONE
Installed lmenezes/elasticsearch-kopf/master into /usr/share/elasticsearch/plugins/kopf
Identified as a _site plugin, moving to _site structure ...
```

## 画面アクセス
http://{ipaddress}:{port}/_plugin/kopf でアクセス

ex)http://192.168.59.103:9200/_plugin/kopf

![スクリーンショット 2014-12-24 12.06.30.png](https://qiita-image-store.s3.amazonaws.com/0/59856/03affe92-b5f2-088a-438f-16069c7b9bac.png "スクリーンショット 2014-12-24 12.06.30.png")