OmniAICreator/Qiita-1.07M huggingface dataset:
クラウドサーバと物理サーバの違いについて

よくクラウドサーバと物理サーバについて、簡単に説明してほしいと言われることがあります。
調べてみるとわかりやすい記事があったので、メモとして残しておきます。

ざっくりとまとめて書いたので誤字などあったらすみません。。m(__)m

## 参考記事

* [Webデザイナーなら知っておくべき サーバ知識相談室](http://gihyo.jp/design/serial/01/server-knowledge/0001)

## サーバとは？

> 簡単に言うと，サーバとはクライアントに対してサービスを提供するもののことです。

サーバには、様々な種類のものがあります。

* WEBサーバ
* メールサーバ
* ファイルサーバ
* DNSサーバ
* FTPサーバ
* データベースサーバ
* プロキシサーバ
* アプリケーションサーバ

### ビールサーバを例にする

> 先ほどのサーバの説明に当てはめると，「ビールサーバとは，客に対してビールを提供するもの」となります。簡潔です。違和感もありません。急に分かりやすくなってきました。

「ビールをお客に提供する」という部分がわかりやすかったです。

WEBサーバだと、お客（見ている人）に対してWEBページを提供するということになります。

サーバを直訳すると「給仕する人、仕える人」という意味

## クラウドサーバ（仮想サーバ）と物理サーバの違い

ここから本題です。

物理サーバは、物理的な実体があるサーバのこと

| 名前 | 意味 |
| ---- | ------------------------ |
| 物理サーバ | 物理的な実体があるサーバのこと |
| クラウドサーバ（仮想サーバ） | 物理的な実体がないサーバのこと |

### クラウドサーバを「店舗」として例える

* サーバ＝店舗

> あなたは練りに練った企画書を元に，これからまったく新しいお店を始めようとしている新進気鋭の店舗開業プロデューサーです。お店を始めるにあたって，最初にどこに店舗を構えるか決めなければいけません。

> もしクライアントの資金が潤沢でないのなら，ショッピングモールの中の1店舗を借りて始めるのがよいでしょう。ショッピングモールの中で店舗を構えれば，建物を作るところから始めなくてよいため，開業までの時間もお金もだいぶ節約できます。

> お店が大繁盛したら，モール内で自店舗の隣にお店をもう1つ作って，店舗を広くすることもできます。また，万が一非常ベルが鳴って一時的にショッピングモールの東館を閉めることになっても，すぐにお店ごと西館に移れば営業を続けることもできます。

上記の引用で述べている店舗が「クラウドサーバ」というものです。

> ショッピングモールの中の一店舗なら，モール自体は自分だけの建物ではありません。先ほど話した「クラウドサーバには物理的な実体がない」というのは，「自分のお店だけの建物がない」ということなのです。けれど，自店だけの建物はなくても，ショッピングモールの建物という物理的な「実体」はあります。

* クラウド環境=ショッピングモール

クラウドに実体はないと書いていると、クラウドは物理的なものはないと認識する人がいますが、物理的な実体はあります。

> ただし，ショッピングモールが休業になるときは，店舗もお休みにしなければなりません。また，モールの他のお店が混んでくると駐車場が満杯でお客さんが入れなかったり，人気店が近くにあると人の波が自店舗まで押し寄せてきます。このように，ショッピングモール自体の都合や他店の影響を受けるリスクがあります。

上記、引用のようにサービスとして提供しているものなので、クラウド環境のラックサーバそのものが壊れたりするとクラウドサーバも止まってしまいます。

### AWS・さくらクラウドと仮想サーバ（VPS）の違い

よく話が出てくるAWS・さくらクラウドと仮想サーバと何が違うのって言われます。

基本は、ショッピングモール（仮想）と考え方は同じである

自分の中で、抑えているところは下記になります。

| 名前 | 説明 |
| ---- | ------------------------ |
| 仮想サーバ（VPS） | サーバスペック等は決まっている（スペックを上げることは基本できない） |
| AWS・さくらクラウド etc | サーバスペック等は自由に選べる。時には拡張（削除）ができる |

### 物理サーバは「自社ビル」として例える

* サーバ=自社ビル

物理サーバは、データセンターなどにラックを借りてサーバを自分でセットアップしたりする方法になります。（社内サーバとかも同じ）

> そうしたリスクが心配であれば，新築のビルを丸ごと借りてそこに店舗を構えるやり方がお勧めです。もちろん，手元の資金がそこそこあり，お店を開業したらお客さんがどっと押し寄せる見込みがある，ということも大きな判断材料です。

> この場合には用途に応じて好きな広さのビルが選べますし，ショッピングモールの1店舗という制約がなくなります。そのため，自由度が非常に高くなり，「高齢者向けのお店なのでエレベータの台数を増やす」といったように要望に応じた作りにできます。また，自社専用のビルなら他社の人は入ってこられないという安心感もあり，ショッピングモールのように他の店舗から影響を受けることもありません。

> ただし新築のビルの場合，ビルを建てるところから始まるため，設計して資材を集めて建てて…と開業までにかかる時間はモールに比べて長くなり，賃貸費用も高くなります。

クラウドサーバのショッピングモールとは違い、適したスペックを選ぶことも可能ですし他のサーバからの影響を受ける心配はなくなります。

デメリットとして、記事にも書いていましたがサーバ自体の劣化は避けられない。

一般的には5年くらい

#### 共有レンタルサーバ（ハウジング）と仮想サーバが同じように扱われる

よく共有レンタルサーバと仮想サーバは、同じと勘違いされることがある

ショッピングモールと同じようにみえますが、根本的な違いとしては以下のようなイメージになります。

| 名前 | 説明 |
| ---- | ------------------------ |
| 仮想サーバ（VPS） | サーバをまるっと借りることができる |
| 共有レンタルサーバ | サーバなかの一部を借りることができる |

イオンなど大型ショッピングセンターの食品売り場をイメージしてもらえるとわかりやすいかもしれません。

仮想サーバがショッピングモールの店舗と例えるなら、共有レンタルサーバは食品売り場の試食コーナーのようなイメージになります。店舗をまるっと貸すのではなく、店舗の一部を貸すという感じなります。
【CakePHP】insertされたレコードのプライマリキーを取得する


##取得方法

$this->getLastInsertID();

もしくは、

$this->getInsertID();

でinsertされたレコードのプライマリキー(デフォではid、プライマリキーを変更していれば変更後のカラム)を取得できる。

```php:取得例
$this->save($data);
$lastInsertID = $this->getLastInsertID();
```

ちなみに、getLastInsertID()はgetInsertID()をラップしているだけ。たぶんどっちを使ってもいいけど、名前が直感的だからgetLastInsertID()をよく使う。

以下は、lib/Cake/Model/Model.phpのgetLastInsertIDメソッド。

```php
public function getLastInsertID() {
  return $this->getInsertID();
}
```
PHPのプロセス/スレッド処理のパフォーマンステスト

百聞は一見にしかず。[github](https://github.com/rokugasenpai/php_worker_test)をご覧ください。
テスト結果は[こちら](https://github.com/rokugasenpai/php_worker_test/blob/master/README.md#%E7%B5%90%E6%9E%9C)
* * *
* PHPでも並列処理は有効！  
* マルチプロセスの場合、CPUのコア数で同時実行すると良い。  
* PHPでのマルチスレッド実行は、pthreadsを有効にする必要があり、  
  http://qiita.com/rana_kualu/items/02f380f2f3d5020051bb  
  特に、*nixだと大変。  
  http://fd0.hatenablog.jp/entry/2012/10/18/232827  
  Windowsでのテスト結果を見る限りは、マルチプロセス実行より遅い。
* ロールバックがあるバッチ処理だとやっかいなので、  
  そういう場合は素直にJavaでマルチスレッドなコードを書いたほうがいいと思う。
ActiveModelのAssociationのvalidateで


```
class AssociationValidator < ActiveModel::Validator
  def validate(record)
    all_associations = record.class.reflect_on_all_associations.map {|a| a.name.to_s}
    all_associations.each do |association|
      record.errors.add(:base, "#{association} doesn't exist") if record.send("#{association}").nil?
    end
  end
end
```
というのバーっと書いたんだけど再発明感すごい（こんな基礎的なvalidateがないわけがない……）
とはいえパッと調べて見つからなかったのでとりあえずメモしておく。
iPadでUIAlertControllerのActionSheetが落ちる問題

UIAlertControllerのActionSheetをiPadで普通にやったら落ちる。
sourceViewとsourceRectを指定しなければいけない。

```MyViewController.swift
class ViewController: UIViewController {
    @IBAction func pushButton(sender: UIButton) {
        let ac = UIAlertController(title: "hoge", message: "moge", preferredStyle: .ActionSheet)
        let ok = UIAlertAction(title: "ok", style: .Default, handler: nil)
        ac.addAction(ok)
        
        ac.popoverPresentationController?.sourceView = view
        ac.popoverPresentationController?.sourceRect = sender.frame
        presentViewController(ac, animated: true, completion: nil)
    }
}
```

sourceViewは表示するviewを指定して、
sourceRectはそのviewの中のどこからピヨっと表示するかを指定する。

![iOS Simulator Screen Shot 2015.04.08 19.45.15.png](https://qiita-image-store.s3.amazonaws.com/0/44356/61ee3e5e-e4f4-d3d2-e808-a00af508f4d0.png)

iPhoneではsourceViewとsourceRectは関係ない。
![iOS Simulator Screen Shot 2015.04.08 19.46.50.png](https://qiita-image-store.s3.amazonaws.com/0/44356/cc329bd0-d094-6e7a-1f8e-743b902c540a.png)
ReactNative で RefluxJS を使ってTODOリストを作ってみた


## やろうとしたこと

ReactNativeでちょっとしたアプリを作ってみたいと思った時に、ファイルや処理の分割をある程度決めたい。

### やりたくないこと

ReactNativeのサンプルに含まれる Movies アプリを見てみると、処理するメソッドを props で下層の Componentに渡して処理をさせている。
階層が深くなると、親から子、子から孫 みたいに多段で渡さなければならず、さらに自身に関係ない処理を、受け渡し中間のComponent が持たなければならなくなる。

https://github.com/facebook/react-native/blob/master/Examples/Movies/SearchScreen.js

```SearchScreen.js
var SearchScreen = React.createClass({
  // 省略..

  onSearchChange: function(event: Object) {
    // 省略..
  },
    
  render: function() {
    return (
      <View style={styles.container}>
        <SearchBar
          onSearchChange={this.onSearchChange} //←これ
          isLoading={this.state.isLoading}
          onFocus={() => this.refs.listview.getScrollResponder().scrollTo(0, 0)}
        />
        <View style={styles.separator} />
        {content}
      </View>
    );
  },

  // 省略..
});

var SearchBar = React.createClass({
  render: function() {
    return (
      <View style={styles.searchBar}>
        <TextInput
          autoCapitalize="none"
          autoCorrect={false}
          onChange={this.props.onSearchChange} //←これ
          placeholder="Search a movie..."
          onFocus={this.props.onFocus}
          style={styles.searchBarInput}
        />
        <ActivityIndicatorIOS
          animating={this.props.isLoading}
          style={styles.spinner}
        />
      </View>
    );
  }
});
```


### Fluxを使う

ReactJSの思想とセットで、Fluxという考え方を Facebookが提唱している。

詳細はこちらの記事が詳しい。
[React.jsとFlux](http://qiita.com/koba04/items/b32ba449d753fdb2b597)

Fluxの実装はいくつかあって、Facebook の Flux を使ったサンプルがすでにある。

MoneyForward のエンジニアブログだ。

[ReactとReactNativeでFluxなTODOを実装してみた話](https://moneyforward.com/engineers_blog/2015/03/30/flux-todo/)
https://github.com/khirayama/ReactNative-flux-todo

MoneyForwardのサービスにはいつもお世話になってます。

## やったこと

Fluxの別実装の [RefluxJS](https://github.com/spoike/refluxjs) を使って同じような TODOアプリを作ってみた。
詳細は githubのコード見てみてください。

https://github.com/marucc/ReactNative-refluxjs-todo

### ディレクトリ構造

* index.ios.js
* Apps/
	* Actions/
	* Components/
	* Stores/



### 最後に

RefluxJS 自体調べながら作ったので、もっと効率いい書き方があったら教えて欲しいです。
【Unity】uGUIでCanvasのRender Modeによってローカル座標への変換方法が異なる件

Unity4.6から導入されたuGUIはなかなかベンリなもので、さくっとGUIが作れる。
今回は、そのuGUIのRender Modeによる座標系への影響に関するお話。


#Render Modeについて

CanvasのRender Modeは、デフォルトで「Screen Space - Overlay」となっている。
これはCanvasをオーバーレイ表示するモードで、普通に使う分にはこの状態で全然問題なっしんぐ。

しかし、uGUIとパーティクルを併用しようとすると、オーバーレイではパーティクルに被せてGUIを描画してしまうので、パーティクルが表示されない。

そういうときはRender Modeを「Screen Space - Camera」に変えて、CanvasのRender Cameraにメインカメラを紐付ければOK。
オーバーレイ表示とは違って、メインカメラに写して描画させるイメージですな。


#Render Modeに応じたローカル座標系への変換方法

で、本題。

「Screen Space - Camera」に変えてもほとんどの機能は問題無く使える。
**ただし、IDragHandler等でクリック位置の座標を得て、ローカル座標に変換しようとする場合には注意が必要。**


例えば、下記のような形でドラッグ可能なGUI要素を作るとする。
この際、Render Modeに応じてローカル座標への変換方法が異なる。

```lang:C#
public class Hoge : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler
{
    ...略...
	
    public void OnDrag(PointerEventData ped)
    {
	    // TODO ここでped.positionをthisのローカル座標に変換して使いたい
    }
	
	...略...
}
```

1.「Screen Space - Overlay」の場合
「Screen Space - Overlay」だと、PointerEventDataのローカル座標変換は下記の形でOK。

```lang:C#
var localPos = transform.InverseTransformPoint(ped.position);
```


2.「Screen Space - Camera」の場合
「Screen Space - Camera」では下記の方法でローカル座標に変換する。

```lang:C#
Vector2 localPos = Vector2.zero;
RectTransformUtility.ScreenPointToLocalPointInRectangle(GetComponent<RectTransform>(), ped.position, Camera.main, out localPos);
```


「World Space」は試してないけど、RectTransformUtilityにそれっぽいメソッドがあったので、そのへん使えば出来るかも。

覚える事は結構あるけども、uGUIホント使えますなぁ。
Docker Composeを使用してDjangoのテストを実行する


DjangoでCIを回すときにDocker起動してテスト実行したいなと思ってちょっと試してみました。

簡単なサンプル
[source](https://github.com/hirokazumiyaji/docker-django-test)

redisとかの接続してテストもしたかったのでDocker Composeを使用してコマンド一発で行えるようにしました。

`docker-compose`は`pip install docker-compose`でインストールしています。

* docker-composeのconfig

```yaml:docker-compose.yml
web:
  build: .
  ports:
    - "8000:8000"
  links:
    - redis
  volumes:
    - app:/app
redis:
  image: redis
  ports:
    - "6379:6379"
```

* webのDockerfile

```Dockerfile
FROM python:2.7
ADD app /app
WORKDIR /app
RUN pip install django redis
CMD cd /app && python manage.py test
```

Djangoは`start project`したものに下記のテストファイルを追加しただけです。

```pyhton:tests.py
from django.test import TestCase
import redis


class Test(TestCase):

  def setUp(self):
      self.r = redis.StrictRedis(host="redis")
      self.r.flushdb()

  def test_ok(self):
      self.assertEqual(1, 1)

  def test_error(self):
      self.assertEqual(2, 1)

  def test_redis(self):
      self.assertEqual(self.r.get("name"), None)

      self.r.set("name", "name")
      self.assertEqual(self.r.get("name"), "name")
```

サンプルのリポジトリのところで、`docker-compose run web`を実行すると下記のようになりテストが実行されます。本当はmysqlとも連携したかったけどコネクトできなくて諦めました。databaseはなんでもいいというならsqlite3のほうが作成が早いのでテストはsqlite3のほうがいいですしね。

```
$ docker-compose run web

Creating dockerdjangotest_redis_1...
Building web...
Step 0 : FROM python:2.7
 ---> 38960da60ac6
Step 1 : ADD app /app
 ---> 8176a8eb5810
Removing intermediate container f0dcd557a477
Step 2 : WORKDIR /app
 ---> Running in 13b39ca62c46
 ---> 237ded13f022
Removing intermediate container 13b39ca62c46
Step 3 : RUN pip install django redis
 ---> Running in 286f081c5147
You are using pip version 6.0.8, however version 6.1.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
Collecting django
  Downloading Django-1.8-py2.py3-none-any.whl (6.2MB)
Collecting redis
  Downloading redis-2.10.3.tar.gz (86kB)
Installing collected packages: redis, django
  Running setup.py install for redis

Successfully installed django-1.8 redis-2.10.3
 ---> 2e59a3a2bc76
Removing intermediate container 286f081c5147
Step 4 : CMD cd /app && python manage.py test
 ---> Running in f164c5af9ec0
 ---> 49ae601130fb
Removing intermediate container f164c5af9ec0
Successfully built 49ae601130fb
Creating test database for alias 'default'...
F..
======================================================================
FAIL: test_error (app.tests.Test)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/app/app/tests.py", line 15, in test_error
    self.assertEqual(2, 1)
AssertionError: 2 != 1

----------------------------------------------------------------------
Ran 3 tests in 0.006s

FAILED (failures=1)
Destroying test database for alias 'default'...
```
git で競合したときに自分の変更を適用する方法

**※本家は[こちら](http://tmlife.io/git/git-conflict-merge?preview=true&preview_id=554&preview_nonce=99234ed144&post_format=standard)**

hoge.md が競合した場合に自分の変更を適応する方法

```
$git checkout --ours hoge.md
$git add hoge.md
```

ちなみに相手側を適応する場合は

```
$git checkout --theirs hoge.md
$git add hoge.md
```
flask で gevent 使用時に greenlet に g が引き継げない時

# flask で gevent 使用時に greenlet に g が引き継げない時

`copy_current_request_context` の AppContext版。
普通にやると `flask.g` が空になっちゃうので。

```py:usage
from flask import g

@copy_current_app_context
def hoge():
    print g.__dict__

gevent.spawn(hoge)
```

用途とかはこのへんを参考に。
http://flask.pocoo.org/docs/0.10/api/#flask.copy_current_request_context

```py:copy_current_app_context.py
import copy
import flask
from functools import update_wrapper

def copy_current_app_context(f):
    top = flask._app_ctx_stack.top
    if top is None:
        raise RuntimeError('This decorator can only be used at local scopes '
            'when a app context is on the stack.  For instance within '
            'view functions.')
    reqctx = copy.copy(top)
    def wrapper(*args, **kwargs):
        with reqctx:
            return f(*args, **kwargs)
    return update_wrapper(wrapper, f)
```
Vagrant環境構築メモ (Windows)

# Vagrant環境構築メモ (Windows)

## Tasks

- Vagrantのインストール
- ゲストOSとしてCentOSをインストール
- Vagrant初期設定

## Environments

- Windows 7
- Vagrant 1.7.2
- VirtualBox 5.0.10
- CentOS 6.5

## Main

### Vagrantのインストール

１）下記よりダウンロードし、インストール

- Vagrant 1.7.2: https://www.vagrantup.com/downloads
- VirtualBox 5.0.10: https://www.virtualbox.org/wiki/Downloads

２）Windowsを再起動

３）端末で以下を確認

```
DOS> vagrant -v
Vagrant 1.7.4
```

### ゲストOS (CentOS) のインストール

１）作業フォルダを作成

```
DOS> cd %HOME%
DOS> mkdir -p ws/vagrant/centos
DOS> cd ws/vagrant/centos
```

２）CentOSのboxを追加

[Vagrantbox.es](http://www.vagrantbox.es/)から利用可能なboxを探してインストール
※今回はCentOS 6.5 x86_64(https://github.com/2creatives/vagrant-centos/releases/download/v6.5.3/centos65-x86_64-20140116.box)を使用。

```
DOS> vagrant box add centos-6.5 https://github.com/2creatives/vagrant-centos/releases/download/v6.5.3/centos65-x86_64-20140116.box
```

(5分ぐらい待つ)

３）Vagrantfile作成

```
DOS> vagrant init centos-6.5
```
※boxを追加するときに指定したbox名("centos-6.5")を指定。

４）Vagrantfile編集

- プライベートアドレスを指定（下記行をコメントアウト）

```
config.vm.network "private_network", ip: "192.168.33.10"
```

５）ゲストOSを起動
$ vagrant up

### ゲストOSへログイン

１）puttyのインストール

下記よりダウンロードし、インストール
http://hp.vector.co.jp/authors/VA024651/PuTTYkj.html

２）putty初期設定

下記項目を設定し、「開く」をクリック

- ホスト名またはIPアドレス: 192.168.33.10
- ポート: 22

下記を入力し、ログイン

- username: vagrant
- password: vagrant

TBD: 設定の保存

## Memo
### ゲストOSのboxの場所
~/.vagrant.d/boxes

### 作ったVMの場所
~/VirtualBox\ VMs
VMのファイル名と.vagrant/machines/default/virtualbox/action_set_nameの値で結びついている？

## Links

##### Vagrant
- official documents: https://docs.vagrantup.com/v2/
- source code: https://github.com/mitchellh/vagrant
- vagrant --help

##### VirtualBox
- official documents: https://www.virtualbox.org/manual/UserManual.html
- source code: https://www.virtualbox.org/browser/vbox/trunk

##### Vagrantのbase box入手先
- http://www.vagrantbox.es/
- https://atlas.hashicorp.com/boxes/search?utm_source=vagrantcloud.com&vagrantcloud=1

##### チートシート
- http://wp-static-images.s3-website-ap-northeast-1.amazonaws.com/wp-content/uploads/2014/08/vagrant_cheat_sheet.png
wgetでのプロキシ設定

wgetでプロキシ経由でのダウンロードを行いたい場合は、/etc/wgetrcのhttp_proxy,https_proxy,ftp_proxyへプロキシサーバの設定を追加します。

##設定例(10.0.0.1:3128は適宜変更)
```
echo 'http_proxy=http://10.0.0.1:3128/' >> /etc/wgetrc
echo 'https_proxy=http://10.0.0.1:3128/' >> /etc/wgetrc
echo 'ftp_proxy=http://10.0.0.1:3128/' >> /etc/wgetrc
```
guestfish (libguestfs-tools)を使う

libguestfs: http://libguestfs.org/
ディスクイメージを直接編集できる。QCOW2以外にもVMDKなど多数のフォーマットに対応している。

* cloud-initの設定をしたい
* yum.confにproxyの設定をしておきたい
* 気になるあの子のVMにバックドアを埋め込みたい

といった場合に有用。
また、ディスクが溢れてOSが死んだとか、VMがぶっ壊れたとか、そういう時にも有用。
ディスクイメージからのデータの吸い出しや不要ファイルの削除により、データの保護や迅速な復旧が期待できる。

# インストール

```bash
yum install libguestfs-tools # or apt-get install libguestfs-tools
```

Ubuntuでは途中でsupermin-applianceのインストールのためにncursesの赤い画面が出る。
`<Yes>`で良いと思うが、びっくりして思わず`<No>`を選んだ場合でも、インストール後に

```bash
sudo update-guestfs-appliance
```

とすればOK。

ちなみに、結構な数の依存パッケージがインストールされる。libvirtとかqemuとかいう文字が見えたりしても、インストール後にlibvirtdとdnsmasqがデーモン起動していたとしてもビビらないこと。つまり、一時的に小さいLinuxカーネルのVMを作成し、そのVMに操作対象のディスクイメージをSCSIで認識させて編集するという仕組み。`ps`するとqemuが起動していることが確認できる。

ただ、そういうわけなので、KVMホストで直接guestfishを使うのは避けたほうが良いだろう。

# 使い方
## ディスクイメージを取得
qemuユーザーでVMが起動するので、qemuユーザーが見えるところにイメージを置く。`/tmp`とか。

```bash
cd /tmp
wget hoge.com/test.qcow2
```

## guestfishを起動
`EDITOR`環境変数で`edit`時のエディタを指定できる。指定しないとviが使われる。ゆとりには辛い。

```bash
sudo guestfish --rw -i -a test.qcow2 EDITOR=vim
```

VMが起動するので、シェルが使えるようになるまで少し時間がかかる。

## guestfishシェル
```
><fs>
```

このシェルで使用可能なコマンドは山ほどあるが、`ls`/`cat`/`edit`/`copy-in`/`copy-out`などを最低限覚えておけばよさそう。他にも`la`/`touch`/`rm`/`ll`など見覚えのあるコマンドもある。これらのコマンドはguestfishの引数に付けることもできる。

```bash
sudo guestfish --rw -i -a test.qcow2 edit /etc/cloud/cloud.cfg
```

# guestfishラッパー

guestfishのコマンドを直接使わなくても、便利なラッパーコマンドが多数用意されている（`virt-ls`/`virt-resque`/`virt-edit`）。`man virt-edit`曰く`virt-edit`は`guestfish --rw -i -d domname edit /file`とほぼ同義とのこと。
他にもそれはそれはたくさんの機能と使用可能なコマンドがある。こんなコマンドないかなーとかこんなことしたいなーって時には、下記のドキュメントを探してみるべし。

# 逆引き
逆引き: http://libguestfs.org/guestfs-recipes.1.html
FAQ: http://libguestfs.org/guestfs-faq.1.html
ラッパー: http://libguestfs.org/ （右下）
マジかよ: https://rwmj.wordpress.com/2013/03/13/guestfish-now-supports-502-commands/
CodeIgniterで言語指定を動的に変更する方法

CodeIgniterでは、/application/config/config.phpで指定された言語に基づいて、$this->lang->line('hoge');の値が出力されますが、以下のように記述することで、動的に言語指定を変更することができます。

```
$this->lang->is_loaded = array();
$this->lang->language = array();
$this->lang->load('言語ファイル名','言語');
```
※上記言語ファイル名には「hoge_lang.php」の「hoge」を指定します。


```php:/application/controllers/hoge.php
function hoge() {
	// ここからはconfig.phpで指定された言語になる
	$result['default'] = $this->lang->line('hoge');
	// ここまではconfig.phpで指定された言語になる

	$this->lang->is_loaded = array();
	$this->lang->language = array();
	$this->lang->load('hogehoge','japanese');

	// ここからは日本語になる
	$result['jp'] = $this->lang->line('hoge');
	// ここまでは日本語になる


	$this->lang->is_loaded = array();
	$this->lang->language = array();
	$this->lang->load('hogehoge','english');

	// ここからは英語になる
	$result['en'] = $this->lang->line('hoge');
	// ここまでは英語になる

	$this->lang->is_loaded = array();
	$this->lang->language = array();
	$this->lang->load('hogehoge');

	// ここからはconfig.phpで指定された言語になる
	$result['default2'] = $this->lang->line('hoge');

	// ビューを表示する
	$this->load->view('hogeview',$result);
}
```
情弱なのでCannot find module って怒られる

gulpfile.js に require("DIR/MODULE") と記述し、gulp を実行したところ下記のように怒られた。


`module.js:340
    throw err;
          ^
Error: Cannot find module 'DIR/MODULE'
    at Function.Module._resolveFilename (module.js:338:15)
    at Function.Module._load (module.js:280:25)
    at Module.require (module.js:364:17)
    at require (module.js:380:17)
...
`

DIR/MODULE が無いと怒られて実行できない。
どうやら NODE_PATH が指定していないと対象のファイルを見つけられないよう。
env NODE_PATH=./ を設定するか
NODE_PATH=./ gulp みたいに指定して実行する。

gulp というより node.js を勉強してね
ErlangのindentをEmacsのerlang-modeで整形する簡単スクリプト

intelliJ等でErlangを書きたいが、コーディング規約のindentが「Emacsのindentにあわせる」　みたいなパターンの時に使える。
Emacsではコマンドラインよりスクリプトをファイルに適用出来るので、それを利用。


```erlang_indent.el
(find-file (nth 0 command-line-args-left)) ; 第一引数に指定されたファイルを開く
(setq override-mode t) ; 上書き前提
(require 'erlang-start) ; erlang-mode
(setq indent-tabs-mode nil) ;;ソフトタブ
(setq c-basic-offset 4) ;; 4タブ
(indent-region (point-min) (point-max)) ; 最初から最後まで整形
(untabify (point-min) (point-max)) ; tab禁止
(fset 'yes-or-no-p 'y-or-n-p) ; 質問をy/n に
(save-buffer) ; SAVE
```
より、
```
$ emacs --script ~/.emacs.d/erlang-indent.el $FILE
```

gitでコミットする時にhookしたりすれば楽かなと思うけど、たまーにとんでもないindentになったりする問題があるので要検証。
静的バイナリファイルが64bit対応しているかチェックする

# 前置き

iOSでは2015/02から新規アプリの64bit対応が必須に、また2015/06からアップデートも64bit対応が必須になりました。

- [64-bit and iOS 8 Requirements for App Updates](https://developer.apple.com/news/?id=12172014b)

自分のコードだけで完結すればいいのですが、third partyのライブラリなどをつかっているとそのライブラリも64bit対応をする必要があります。

# チェック方法

fileコマンドを用いるとチェックが可能です。

```sh
$ file libzbar.a
libzbar.a: Mach-O universal binary with 3 architectures
libzbar.a (for architecture armv7):	current ar archive random library
libzbar.a (for architecture armv7s):	current ar archive random library
libzbar.a (for architecture arm64):	current ar archive random library
```

iosの静的バイナリはいわゆる universal binaryとかfat binaryという形式で、複数のアーキテクチャのマシンコードが含まれています。
この中に `arm64` が含まれているとそのライブラリは64bit対応がなされています。

```sh
$ file Crashlytics.framework/Crashlytics
Crashlytics.framework/Crashlytics: Mach-O universal binary with 5 architectures
Crashlytics.framework/Crashlytics (for architecture armv7):	current ar archive random library
Crashlytics.framework/Crashlytics (for architecture armv7s):	current ar archive random library
Crashlytics.framework/Crashlytics (for architecture i386):	current ar archive random library
Crashlytics.framework/Crashlytics (for architecture x86_64):	current ar archive random library
Crashlytics.framework/Crashlytics (for architecture arm64):	current ar archive random library
```

また*.frameworkなども中身にstatic binaryがふくまれているので、fileコマンドで同様に対応を確認することが可能です。
VolleyでCookieとUserAgentをまとめていじりたい

Volleyは便利なんだけれども、どうしてもログインが維持されずに困った。
調べて見たところ、某サービスはセッション管理にcookieとUserAgentの一致を見ているらしい。なるほど。

そこで、Volleyで通信する際にCookieとUserAgentをいじって双方意図したものを使ってもらうようにした。

**追記：2015/4/27**
結局気持ち悪かったのでCookieManagerというのを見つけてきてそっちで書き直しました
[Volleyでcookieをちゃんと扱う（あるいはHttpURLConnectionの話）](http://qiita.com/YukiAsu/items/e4c92d0a9f4f9ba2ecdb)

# VolleyはどうもRequestを拡張するのが基本形のようです
[VolleyでCookieを使い回す](http://qiita.com/mochico/items/20c228a87e000039cd54)
こんな感じでRequestを拡張するとcookieに関しては解決した。（たぶん）UserAgentもこの手法で設定できるだろう。

でもなんかクラス増やすのちょっとスマートじゃない気もする。だいたい、拡張したらXXXRequestを全部MyXXXRequestに置き換えるのか？HAHAHA、冗談じゃない。そんなダサいの嫌だね。
それを知らないでうっかり標準クラス使ったら全てが終わるしね。

# 根元のRequestQueueでどうにかする
そこで各Requestではなくそれらを束ねるRequestQueueでどうにかする方法を探しました。

一番近い、というかほぼ答えだったのがこれ
[Android、Volley にヘッダ情報を付加する（HurlStack）](http://www.donga-donga.net/tips/android-volley-add-header-HurlStack.htm)

これ自身は今回関係ないコードが混じっていたり、try-catchがあんまり好みじゃなかったりで結局以下のような感じに変えて使うことにしました。

```java:RequestQueueWithCookie
// Volleyのリクエストキューを生成
RequestQueue mRequestQueue = Volley.newRequestQueue(getApplicationContext(), new HurlStack(){
    @Override
    public HttpResponse performRequest(Request<?> request, Map<String, String> additionalHeaders)
            throws IOException, AuthFailureError {
        Map newHeaders = new HashMap();
        newHeaders.putAll(additionalHeaders);
        // セッション維持のためcookieとUserAgentを設定する
        newHeaders.put("User-Agent", "ユーザーエージェント");
        newHeaders.put("Cookie", "クッキーの中身");

        // responseを拾えばSet-Cookieを回収できる
        HttpResponse response = super.performRequest(request, newHeaders);
//        response.getHeaders("Set-Cookie");

        return response;
    }
});
```
思ったよりシンプルだ。

# その他参考にしたサイト
[【Android】Volley各種設定メモ](http://outofmem.hatenablog.com/entries/2014/11/04)
他にもいくつか書いてあって便利
[ネットワーク通信用ライブラリVolleyを使いこなす](http://techbooster.org/android/hacks/16474/)
そもそもVolleyってなんじゃ？というころにたくさん読み返しました。
MacのAndroid Studioバージョンアップで「Android Studio does not have write access to /Applications/Android Studio.app/Contents. Please run it by a privileged user to update.」と言われたとき

# 参考（というかすべてです）
http://stackoverflow.com/questions/27857395/android-studio-update-error-on-osx-yosemite

# やったこと
1. ターミナルを開く
2. sudo chmod -R 777 /Applications/Android\ Studio.app/Contents/
3. Android Studioを起動。メニューの[Android Studio] - [Check for Updates...]をクリック
Linux に最新版の peco をインストールするシェルスクリプト

これ↓のシェルスクリプト版です。

- [AnsibleでLinuxに最新版のpecoをインストールする - Qiita](http://qiita.com/samurai20000@github/items/8d77f4b5a503ca58b64e "AnsibleでLinuxに最新版のpecoをインストールする - Qiita")

```bash
#!/bin/bash

set -eu

latest=$(
  curl -fsSI https://github.com/peco/peco/releases/latest |
    tr -d '\r' |
    awk -F'/' '/^Location:/{print $NF}'
)

: ${latest:?}

mkdir -p $HOME/bin

curl -fsSL "https://github.com/peco/peco/releases/download/${latest}/peco_linux_amd64.tar.gz" |
  tar -xz --to-stdout peco_linux_amd64/peco > $HOME/bin/peco

chmod +x $HOME/bin/peco

$HOME/bin/peco --version
```
cloud-initでパスワード認証できるユーザーを作成する

公開鍵認証したくない時がある。

`/etc/cloud/cloud.cfg`

```yaml
users:
 - default

disable_root: 1
ssh_pwauth:   1

system_info:
  default_user:
    name: centos
    plain_text_passwd: 'P@ssw0rd'
    lock_passwd: false
```

人は誰しも、そういう時がある。
秘密鍵のパスワードを忘れた時、
コンソールを使わなければならない最悪の時、
夜、眠れない時。
だけどこれだけは忘れないで欲しい。rootは禁止。
[PayPal] 返金時のCreateRecurringPaymentsProfileのIPN通知について

初回決済（即時支払い、定期支払い）が成功した後に、DoExpressCheckoutPaymentのIPN通知でpayment_status=Pendingになった場合、CreateRecurringPaymentsProfileのIPN通知には影響するのでしょうか？また、DoExpressCheckoutPaymentのIPN通知がpayment_status=Reversedになった場合は、CreateRecurringPaymentsProfileのIPN通知も連動するのでしょうか？
【Socialボタン】Facebook / Twitter


## Facebook の「いいね！」ボタンの埋め込み方法
```めちゃ簡単！
1. FB Developer アカウントにログイン
2. 開発者メニュー「アプリを管理」を選択
3. Social Pluginsを選択
4. Get started
5. いいねボタンを選択
6. 必要事項を記入　※レイアウトも変更可
7. コードを得て、配置したいページ・部位に埋め込む！
```

## Twitter ボタンの埋め込み方法

> https://about.twitter.com/ja/resources/buttons#tweet

```すーぱー簡単！
1. 上記のURLにアクセス
2. いろいろ自分用にカスタマイズ
3. コードを貼りたいところに埋め込む！
4. 以上
```

以上！
ソーシャルボタンの実装は簡単なのですね〜
Mac .DS_Storeの削除

#DS_Storeを作らない

DS_storeを作らない
`defaults write com.apple.desktopservices DSDontWriteNetworkStores true`

DS_storeを作る（元に戻す）
`defaults write com.apple.desktopservices DSDontWriteNetworkStores false`

#一括削除
`find . -name .DS_Store -exec rm -fr {} \;`
cloud-initで起動時にタイムゾーンを変更する

```
「該当時間に変なログは出ておりません隊長！」
「おまえのなかではな！」
```

という事態を避けるためにもnptd含め、時刻には敏感になっておきたい。

`/etc/cloud/cloud.cfg`

```yaml
timezone: Asia/Tokyo
```

初回起動時に設定される。reboot時ではないので注意。
Windows Server 2012 Classic ASPでOracle接続

Windows 2012 Server 
Classic ASPでOracleに接続

Windows 2003 Serverで稼働中のASPアプリケーションを
新OSに載せ替える案件が急浮上してきたので、事前調査を行った。

DB接続にはMSDAORAを使用。

MSDAORAが32bitなので、32bit対策が肝といえる。

接続は成功したが、設定ミスがあってもわかりやすいエラーが出るわけでもなく
嵌ると怖いので備忘録がわりに記事をアップ。

###1. Oracle 11g Server (64bit) インストール
###2. Oracle 11g Client (32bit) インストール　& TnsNames.Oraの設定
###3. サーバーの役割の追加
   「Webサーバー」
![image](https://qiita-image-store.s3.amazonaws.com/0/66748/8920865f-2094-c35e-031d-4923731f89eb.png)
###4. アプリケーションプール の詳細設定 
   「32ビットアプリケーションの有効化」
![image](https://qiita-image-store.s3.amazonaws.com/0/66748/2882f3d7-bc29-cb22-cc88-9c258cf3358e.png)

###5. 32bitOracle ClientのORACLE_HOMEのセキュリティタブに
「IIS_IUSR」を登録。　登録後は、OSを再起動すること。`※IIS再起動ではないことに注意`
![image](https://qiita-image-store.s3.amazonaws.com/0/66748/71ba7d4e-1395-8a9c-c1ef-aba38436eed8.png)
`64bitServerと32bitクライアントが別フォルダになっていることに
注目`

###6. 32bit Client SQLNet.Oraを変更
```　SQLNET.AUTHENTICATION_SERVICES= (NONE)　
```

詳細な情報は、下記に頼った。
https://support.microsoft.com/ja-jp/kb/255084/ja

私的には4.設定後のOS再起動に気付かず、時間を費やしてしまった。
cloud-initで起動時にresize2fsする

起動時に、と言ったな。あれは嘘だ。

`/etc/cloud/cloud.cfg`

```yaml
packages:
 - cloud-utils-growpart
yum_repos:
    epel:
        baseurl: http://download.fedoraproject.org/pub/epel/6/$basearch
        mirrorlist: https://mirrors.fedoraproject.org/metalink?repo=epel-6&arch=$basearch
        enabled: true
        failovermethod: priority
        gpgcheck: true
        gpgkey: file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6
        name: Extra Packages for Enterprise Linux 6 - $basearch
```

RPM-GPG-KEY-EPEL-6はあらかじめ置いておく。
https://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-6

cloud-utils-growpartがEPELにあるので、EPELを追加している。

で、起動したら2回リブートする。
2回言う。起動したら2回リブートする。
1回目のリブートで`growpart`が走るが、リブートしないと`resize2fs`できない。
2回目のリブートで`resize2fs`が走る。これで`df`すると拡張されたことが分かる。

……かっこわるい。だからCentOS6を使うのはやめろとあれほど。systemdこわくないよ。
一日一万回、感謝のsystemdすれば、いつか音を置き去りにしてsystemdできるようになる。
PythonでMeCabを使おうとして躓いたので覚書

MacにMeCabをインストールして、Pythonで使うまで。

```

$ brew install mecab
$ brew install mecab-mecab-ipadic
```

brewがアップデートしてなかったらこの時点で躓くらしい。
これで基本MacにはMeCabが入るのだけど、wgetで躓いた。
wgetもbrewで入れてしまえば良い様子。

```
$ brew install wget
$ wget https://mecab.googlecode.com/files/mecab-python-0.996.tar.gz
$ pip install mecab-python-0.996.tar.gz 
```

おしまい。これでPythonでもMeCabが使える。
CentOS6上でActiveAdminが動作しない問題について

# 環境

|OS/Framework|Version|
|---|---|
|CentOS|CentOS release 6.6 (Final)|
|Rails|4.2.0|

# 問題
CentOS上で、ActiveAdminをインストールした状態で、サーバーを起動すると、以下のエラーがでる。

```
$ RAILS_ENV=development bin/rails s
```

出力結果

```
NameError: uninitialized constant ActiveAdmin
```

# デバック

binding.pryをしこむ

```ruby:./config/initializers/active_admin.rb
binding.pry
ActiveAdmin.setup do |config|
```

pryの中身

```
[1] pry(main)> ActiveAdmin
NameError: uninitialized constant ActiveAdmin
from (pry):1:in `<top (required)>'
[2] pry(main)> require 'activeadmin'
ExecJS::RuntimeUnavailable: Could not find a JavaScript runtime. See 
```

# 原因
Rails4.2のデフォルトでは、`therubyracer`がコメントアウトされてるため、インストールされずエラーになっていました。実は、ActiveAdminは関係なく、最初に読み込まれる設定ファイルになりやすいため、ActiveAdminの問題と勘違いしやすいです。

aから始まるので最初に呼ばれる。

```
$ ./config/initializers/active_admin.rb
```

# 解決方法

`therubyracer`をコメントインして、`bundle install`する

```ruby:Gemfile
gem 'therubyracer', platforms: :ruby
```

# 教訓
OSX上で開発しているときは問題は発生しないです。
本番環境を構築するときにCentOS上で動作させる場合に問題が発生するため、早めに本番環境と同じ環境でテストしましょうヽ(´ー｀)ノ
検索エンジン、SEOまとめ 2015



## SEOトピックス

* ドメインエイジは評価されていない
* meta keywordsはまったく評価されていない
* メガフッタはリンク数に応じて効果が薄まるようになった
* 非パーソナライズ検索結果を見るにはシークレットモード（コマンド+N）
* ドメイン名チェック
　http://www.aguse.jp/
* ページランクチェック
　http://pagerank.bookstudio.com/



## スパム項目

* 隠しテキスト、隠しリンク
* ソーシャルリンクスパム
* クローキング、ステルス、ファントム
* ミラーコンテンツ、重複ページ
* キーワードスタッフィング


### スパム対策チェック

ウェブマスターツール
『手動による対策を確認』
https://www.google.com/webmasters/tools/reconsideration


## 無意識に陥りやすいスパム、減点項目

* レスポンスコードの設定エラー
* トップページの広告バナー
* "前科持ちドメイン"
* キーワード数、最適化過多
* 他サイトのコピーやミラーコンテンツ
* メガフッター
* ロボットと閲覧ユーザーに見せている情報がまったく異なる


## Google searchが望む近未来

* SEOが効かないこと
* ユーザーに役立ちたい
* SERPsにQDF、QDDなど固有コンテンツ表示
* 会話型検索、ハミングバード
* Schema.orgなどのセマンティック
* SERPsのリッチ化
* パフォーマンス改善
* まとめ → もう一度純粋に「流入される」を狙う


## マークアップ最適化

### title要素

```html
<title>ページ名 サブカテゴリ名 カテゴリ名:サイト名</title>
```

### meta description

* 画面毎に、画面を説明する固有の説明文をライティングする
* 全画面に共通の文章はサイト名以外不要
* トップページにはサイトの説明文
* 記事タイトルや日時情報、価格情報など、ごく固有な情報を積極的に含むのが好ましい
* 120字以内


### meta keywords

* 設定する必要がない
* 存在してもエラーにはならない


### hx要素

* h1〜h6見出し要素にキーワードを適切に設定する
* 画面全体で適切な数を設置する

※多すぎると逆効果


### alt属性、title属性

* alt属性はimg要素に付与し、imgに文字要素を含む場合にその文字を設定
* title属性はおもにa要素に付与し、リンク先の情報を設定


### viewport

スマートフォンなどデバイス毎のviewportを設定する


### パフォーマンス

パフォーマンス性が高いほどよい
AndroidStudio1.1.0でLogCatのWindowを表示させる

色々と便利と噂のAndroidStudioをインストールしたところ、
LogCatの表示方法が分からなかったのでいろいろ探ってみました。

Toolバーの

Tools -> Android -> Android Device Monitor

を選択して起動

Devices,LogCatなどなどAndroidの実機を接続して使用するWindowが揃った形で起動します。
MySQLのユーザー追加とDB追加

MySQL のユーザー追加やDB追加の手順。

# 設定

## DB設定

| 項目 | 値 |
| --- | --- |
| DB名 | hoge |
| 文字コード | utf-8 |

# ユーザー設定

| 項目 | 値 |
| --- | --- |
| ユーザー名 | jack@localhost |
| パスワード | foobar |
| アクセスできるDB名 | hoge |
| 権限 | 全て |

# DB追加

```
$ mysql 
mysql> CREATE DATABASE hoge CHARACTER SET utf8;
Query OK, 1 row affected (0.00 sec)
```

# ユーザー追加

```
$ mysql 
mysql>  GRANT ALL PRIVILEGES ON hoge.* TO jack@localhost IDENTIFIED BY 'foobar';
Query OK, 1 row affected (0.00 sec)
```
cloud-initでyumリポジトリを追加する

EPELを使いたいなら
`/etc/cloud/cloud.cfg`

```yaml
packages:
  - tmux

yum_repos:
  epel:
    baseurl: http://download.fedoraproject.org/pub/epel/6/$basearch
    mirrorlist: https://mirrors.fedoraproject.org/metalink?repo=epel-6&arch=$basearch
    enabled: true
    failovermethod: priority
    gpgcheck: true
    gpgkey: file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6
    name: Extra Packages for Enterprise Linux 6 - $basearch
```

RPM-GPG-KEY-EPEL-6はあらかじめ置いておく必要がある。
https://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-6

初回起動時のみ発動すると思われるので、rebootしてもリポジトリが増えていない場合はVMを作り直す必要がある。
EASELJS GETTING STARTEDを試してみる

http://www.createjs.com/tutorials/Getting%20Started/
createjsに挑戦しようと思い、EaselJSのGetting Startedをやってみました。
赤い円を表示するだけです。
すこし歯ごたえなかったですね・・・

#SETTING UP YOUR HTML DOCUMENT
* 今回はjsfiddleを使います。
* Frameworks & Extensionsでcreatjsを指定します。
* HTMLにcanvas要素を作成します。
* 識別のためcanvasにはIDが必須です。

https://jsfiddle.net/kzqooq/5668a1j4/

#SETTING UP THE STAGE
* `var stage = new createjs.Stage("demoCanvas");`でcanvas要素をStageとして取得します。
* StageはDisplay Objectsを保持します。
* Display Objectはスクリーンに描画されるオブジェクトです。
* canvasの指定にはIDを使います。

https://jsfiddle.net/kzqooq/5668a1j4/1/

#CREATING A SHAPE
* 赤い円を描くShapeオブジェクトを作成します
* ShpaeオブジェクトはDisplay Objectです
* Shapeはx,yの座標をもちます
* Shapeはgraphicsをもち、これはShapeの形を定義します
* graphicsはメソッドをチェーンすることで形を定義します
* ここでは`.beginFill`と`.drawCircle`を用い赤い円を定義しています
* 最後に円をステージに登録しています

https://jsfiddle.net/kzqooq/5668a1j4/2/

#UPDATING THE STAGE
* 描画を反映するには`stage.update();`を呼ぶ必要があります
* 赤い円がキャンバスに表示されます

https://jsfiddle.net/kzqooq/5668a1j4/3/

以上です。
試しにjsfiddleで段階的にコード載せてみましたけど
この例だと最後しか描画がないから、あんま意味なかったですね・・・
過去にLinuxからWindowsへRDP出来ていたのに、急に出来なくなった場合

自分への覚書も兼ねて投稿です。

# 現象

普段使用しているDesktop PC(Ubuntu 14.04 Desktop)から、踏み台として利用していたWindows Server 2012へRDP接続出来なくなった。
パスワードのリセットをしてもダメ。Win7→WinSV2012へ正常に接続出来ていた隣の人が私のUbuntuからRDPしようとしても失敗。

# 原因

色々調査していると、下記QAを発見。
http://goo.gl/TckHpN

普段RDPには[Remmina](http://remmina.sourceforge.net/)というツールを使用しているのですが、WinSV2012がアップデートされた後に証明書の更新が上手く行われずに認証失敗となったようです。

# 対処法

.freerdp内にあるknown_hostsを編集し、接続先の情報を削除します。

```bash
$ vi ~/.freerdp/known_hosts
```

```
192.168.0.101 xx:xx:xx:xx:.......
192.168.0.102 xx:xx:xx:xx:.......
```
※上記、リストの中から対象の接続先を削除

-----------------------
これで再びLinux上からRDP出来るようになりました。
cloud-initでパッケージをインストールする

`/etc/cloud/cloud.cfg`

```yaml
packages:
  - vim
  - zsh
```

これは初回ブート時にのみ実行される。rebootしても実行されないので注意。テストしにくい。

順序は考慮されない。従って、

```yaml
packages:
  - epel-release
  - tmux
```

とやっても、epel-releaseインストール後にtmuxをインストールしてはくれない。リストではなく集合。
windows環境でgemパッケージ「bson_ext」のインストールが失敗する

windows環境で ruby + mongodb の環境を作るときに
bson_ext という gem をインストールしますが
以下のエラーが出ることがあります。

```cmd
cbson.c:25:23: fatal error: arpa/inet.h: No such file or directory
```

早い話、この arpa/inet.h というファイルが
存在していないのに読み込まれていることが問題です。

一番てっとり早い解決策は、
arpa/inet.h を空のファイルで作成して
配置すればインストールできるようになります。

以下の場所にファイルを保存します。

[前提] devkit がインストールされていること

```
{devkitフォルダ}/mingw/i686-w64-mingw32/include/arpa/inet.h
```
arpaフォルダをincludeフォルダの配下に新規作成し、
arpaフォルダの中にinet.hを空ファイルで新規作成します。

これでインストールが正常にできるようになります。

[参考URL]
http://stackoverflow.com/questions/26092541/windows-rails-error-installing-bson-ext
JavaScript での配列の比較


ECMAScript 5 の規格を見ると、比較演算子による配列の比較は、それぞれ `toString()` した結果を比較したものになるようだ。

Chrome 41 で試したところ、確かにそのような挙動だった。

```javascript
var x = [1];
var y = [2];
x.toString() < y.toString(); // true
x < y; // true

x.toString = function(){ return "b"; } 
y.toString = function(){ return "a"; } 
x.toString() < y.toString(); // false
x < y; // false
```

なので、数値を格納した配列を比較しても、数値を基準に比較した結果にはならない。

```javascript
[2] < [12] // false
```


参考:

- [11.8.1 The Less-than Operator ( < )](http://ecma-international.org/ecma-262/5.1/#sec-11.8.1)
- [11.8.5 The Abstract Relational Comparison Algorithm](http://ecma-international.org/ecma-262/5.1/#sec-11.8.5)
- [9.1 ToPrimitive](http://ecma-international.org/ecma-262/5.1/#sec-9.1)
- [8.12.8 DefaultValue (hint)](http://ecma-international.org/ecma-262/5.1/#sec-8.12.8)
【超初心者向け】テスト用webサーバーについてなんとなく概念的なもの

サーバーって何？ローカルホストって？テスト環境って何？
そんなレベルの超初心者向け（私の）覚書
ぐぐって得た知識なので間違っているかもしれない…。
* * *

【前提】
macの場合
http://localhost/
でテスト用のwebサーバー？が使える

このURLをたたくとデフォルトは
/Library/WebServer/Documents
に入っているindex.html.enが表示される。

* * *


##ドキュメントルートの変更
1.ターミナルで下記を入力。

```lang:ターミナル
$sudo vi /etc/apache2/httpd.conf
```

2.開いたファイルの中に下記があるので#をつけてコメントアウト
（iを押してインサート、:wq で保存）

```lang:httpd.conf内
#DocumentRoot "/Library/WebServer/Documents”
#<Directory "/Library/WebServer/Documents">
```

3.コメントアウトしたテキストの下に、それぞれ表示させたいルートを記載
※この場合Sitesというディレクトリを作成

```lang:httpd.conf内
DocumentRoot "/Users/ユーザ名/Sites”
<Directory "/Users/ユーザ名/Sites">
```

4.下記にあるファイルのディレクトリを上記と同様に書き換え

```lang:ターミナル
$sudo vi /private/etc/apache2/users/ユーザ名.conf
```

5.apacheリスタート

```lang:ターミナル
$ sudo apachectl restart
```

6./Users/ユーザ名/Sitesこの場所にindex.htmlを置いて
http://localhost/
をたたいた時に表示されれば成功

* * *

##バーチャルホストを設定する
これは、管理するサイトが増えてきたときに、いちいち
localhost/a-site/
localhost/b-site/
って階層に入って打つのが大変だから名前で管理する、みたいなニュアンスだと思われる
（ほんとかよ）

1./etc/apache2/httpd.confの下記をコメント解除

```lang:httpd.conf内
#Include /private/etc/apache2/extra/httpd-vhosts.con
```

2.コメント解除したファイル（/etc/apache2/extra/httpd-vhosts.conf）の設定
　デフォルトでたくさん書いてあるけど全部消しちゃっていいみたい。

```lang:httpd-vhosts.conf内
<VirtualHost *:80>
    DocumentRoot "/Library/WebServer/Documents"
    ServerName local.test.com
　　　<Directory "/Library/WebServer/Documents">
　　　　order deny,allow
　　　　allow from All
　　　</Directory>
</VirtualHost>
```

これも人によってかいてあること少し違ったのだけど
だいたいDirectorの中に場所をかいて、サーバーnameをつけておしまい。

3.Hostsにて紐付け
 Hostsっていうアプリにてひも付けた。

```lang:httpd-vhosts.conf内
127.0.0.1 local.test.com
```

これでlocal.test.comのURLをたたくと、
自分のローカルホストのドキュメントルートのindexが表示される…という感じだと思う。
AWSで全てのリージョンから無駄リソースを抽出するワンライナー


ありがちな消去忘れなどを防ぐため、たまに以下のスクリプトを動かしてきれいな状態にしておきましょう。

- aws configure は済ませてある前提です。まだの方はaws configureで設定するか、環境変数に設定するかを済ませて下さい。
(2015/04/09 01:20 ELBに関する記述を変更しました)


# EBS
```
for region in `aws ec2 describe-regions --query 'Regions[].RegionName' --output text`;do aws ec2 describe-volumes --region ${region} --filters Name=attachment.status,Values=detached;done
```

# ElasticIP
```
for region in `aws ec2 describe-regions --query 'Regions[].RegionName' --output text`;do aws ec2 describe-addresses --region ${region} --query 'Addresses[?InstanceId==`null`]';done 
```

# ELB
```
for region in `aws ec2 describe-regions --query 'Regions[].RegionName' --output text`;do aws elb describe-load-balancers --query 'LoadBalancerDescriptions[?length(Instances)==`0`].LoadBalancerName' --region ${region};done 
```

# ENI
```
for region in `aws ec2 describe-regions --query 'Regions[].RegionName' --output text`;do aws ec2 describe-network-interfaces --filters Name=attachment.status,Values=detached --region ${region};done
```


# 参考
JMESpath
http://jmespath.readthedocs.org/en/latest/index.html
ember DS.Store#createRecordと#pushの違いに気をつけよう

## はじめに

DS.Store#createRecordとはこうゆうものです。

```js
export default Ember.Route.extend({
  model() {
    return this.store.createRecord("product", { id: 1, name: "foo" });
  }
});
```

この場合、作成されたProductモデルのインスタンスはisNewフラグがtrueであり、保存されていない全く新しいオブジェクトとして扱われます。

DS.Store#pushとはこうゆうものです

```js
export default Ember.Route.extend({
  model() {
    return this.store.push("product", { id: 1, name: "foo" });
  }
});
```

基本的には１番目の引数に型名、２番目の引数にプレーンなオブジェクトを渡すことで新しいProductモデルのインスタンスを作成します。

## #pushで追加したインスタンスはisNewがfalse

インスタンスの作成に#createRecordを使う場合も#pushを使う場合も、第２引数のオブジェクトにidを含めることは可能ですが、#createRecordではisNewがtrueに、#pushではisNewがfalseに設定されるためその後の#saveの挙動が異なります。

```js
var product = this.store.createRecord("product", { id: 1, name: "foo" });
product.save(); // => XHR POST /products がとぶ
```

```js
var product = this.store.push("product", { id: 1, name: "foo" });
product.save(); // XHR PUT /products/1 がとぶ
```

isNewがtrueならまだDBに保存されていないレコードなのでPOSTリクエストが飛んでしまいます。これがDB上でも本当にisNewならいいのですがid 1が既に保存されている場合、リクエストは成功するがサーバーの吐くjsonのidが2になったりして整合性がとれなくなるわけです。

pushで作成したばあいはisNewがfalseなのでPUTリクエストがとぶだけなので安心です。

WebSocketで複数端末の状態を同期するような場合に起きがちなバグだと思います。くれぐれも気をつけましょう！（自分はやってしまいました・・・）
カスタムURLスキームの命令部分にコロンをいれると起動しない

以前、社内のとあるプロジェクトを途中から引き継いだときのこと。
Xcode5.1.1で作業を進めてたが、とある理由でXcodeのバージョンを6にあげることに。
ビルドして動作確認すると、今までボタンタップでカスタムURLスキームが起動していたところが起動しない・・

どうやらカスタムURLスキームの命令部分（myApp://hogeでいうhoge部分）にコロンがはいっていたのが原因らしい。（Xcode5.1.1でビルドしたものは問題なし）

ちなみに下記のように設定されてた。
```myApp://hoge({ fuga: piyo })
```

おそらく命令部分にコロンがはいることで、正しいURLとみなされなかったものと思われる。


というか、なんでこんな形式にしてたんだろう・・
SKKを自身のhomeディレクトリ配下の.emacs.d/にインストールする

ソースをDLし、コンパイル、その後にインストール先の設定を変更する

```shell-session
% mkdir tmp && cd tmp
% curl -O http://openlab.ring.gr.jp/skk/maintrunk/ddskk-15.2.tar.gz
% tar xvf ddskk-15.2.tar.gz && cd ddskk-15.2
% make
% emacs SKK-CFG
```

下記の内容を設定する。

```el:SKK-CFG
(setq SKK_DATADIR "~/.emacs.d/etc/skk")
(setq SKK_INFODIR "~/.emacs.d/info")
(setq SKK_LISPDIR "~/.emacs.d/site-lisp/skk")
```

念の為にインストール先が正しく設定されているかを確認する

```shell-session
% make what-where

emacs -batch -q -no-site-file -l SKK-MK -f SKK-MK-what-where
Loading ~/tmp/ddskk-15.2/SKK-CFG...

Running in:
  GNU Emacs 24.4.1 (x86_64-apple-darwin13.4.0, NS apple-appkit-1265.21)
 of 2015-04-08 on m3-2014mac13.office.so-netm3.com

SKK modules:
  skk-viper, skk-jisx0213, skk-emacs, ccc, cdb, context-skk, queue-m, skk-abbrev, skk-act, skk-annotation, skk-auto, skk-autoloads, skk-azik, skk-cdb, skk-comp, skk-cursor, skk-cus, skk-dcomp, skk-develop, skk-gadget, skk-hint, skk-inline, skk-isearch, skk-jisx0201, skk-jisyo-edit-mode, skk-kakasi, skk-kcode, skk-leim, skk-look, skk-macs, skk-num, skk-server-completion, skk-server, skk-show-mode, skk-sticky, skk-tankan, skk-tut, skk-vars, skk-version, skk, skk-study
  -> ~/.emacs.d/site-lisp/skk

SKK infos:
  skk.info
  -> ~/.emacs.d/info

SKK tutorials:
  SKK.tut, SKK.tut.E, NICOLA-SKK.tut, skk.xpm
  -> ~/.emacs.d/etc/skk
```

問題がなさそうであれば、インストールを実行する

```shell-session
% make install
```

その後は.emacs.d/init.elにロードとキーの設定をする

```shell-session
% emacs ~/.emacs.d/init.el
```

```el:init.el
;; load-path 追加                                                                                                   
(let ((default-directory (expand-file-name "~/.emacs.d/site-lisp")))
  (add-to-list 'load-path default-directory)
  (if (fboundp 'normal-top-level-add-subdirs-to-load-path)
           (normal-top-level-add-subdirs-to-load-path)))

;; skkの設定
(require 'skk-autoloads)
(global-set-key (kbd "C-x C-j") 'skk-mode)
```
MOAspects - SwiftでViewControllerに対してアスペクト的にログを出してみる

# SwiftでViewControllerに対してアスペクト的にログを出してみる

前回こんな記事を書いた

単純に呼べば使えるAOPライブラリMOAspectsを作った
http://qiita.com/__moai/items/efcd43016b9320cf6d63

このライブラリ自体Objective-C製なのでSwiftで使いづらいという課題があったのだけど、実はSwift用のインターフェース対応ということで2.0.0にバージョンを上げたので報告（ステマ）

MO-AI/MOAspects
https://github.com/MO-AI/MOAspects

## MOAspectsのインターフェース

Objective-Cのときと同じで単純に下の二つだけ

### インスタンスメソッド

```swift
MOAspects.hookInstanceMethodForClass(①CLASS, selector:②SEL , position:③POSITION) {
    // ④HOOK
}
```


### クラスメソッド

```swift
MOAspects.hookClassMethodForClass(①CLASS, selector:②SEL , position:③POSITION) {
    // ④HOOK
}
```

## 必要なパラメータ

### ①CLASS

処理をフックしたいクラス

### ②SEL

処理をフックしたいクラスの持つフックしたいメソッド名

### ③POSITION

`.Before`と`.After`があり、フックの処理を前か後のどちらに置くかを選べる

### ④HOOK

フックしたときに実行する処理

## 実際に使って見た

仮定として以下の3画面のViewControllerをフックして画面の表示タイミングでログを出すのを例とする

* HogeViewController
* FugaViewController
* PiyoViewController

書くのはこれだけ

```swift
var classes: [AnyClass] = [HogeViewController.self, FugaViewController.self, PiyoViewController.self]
for viewControllerClass in classes {
    MOAspects.hookInstanceMethodForClass(viewControllerClass, selector:"viewDidAppear:", position:.After) {
        var className = NSStringFromClass(viewControllerClass)
        NSLog("did appear \(className)")
    }
}
```

やってることは画面のクラスの配列を用意してループで該当クラスのviewDidAppear:に対してフックをかけている
すると以下のようなログが出る

```
did appear PROJECT.HogeViewController
did appear PROJECT.FugaViewController
did appear PROJECT.PiyoViewController
```

## 課題

* Objective-Cと違いAnyObject型（id型）にクロージャが入らないので、メソッドのパラメーターの値をフック時にvoidポインタ型、パラメータの個数を0〜9決め打ちで受け取るようにしている、動的・Any型に全部変えたい

### 追記

<blockquote class="twitter-tweet" lang="ja"><p>&#39;dynamic&#39; keywordは完全に見落としてたなぁ、これでSwiftでもAOPできる！&#10;<a href="https://t.co/EJyv0bu3Yq">https://t.co/EJyv0bu3Yq</a></p>&mdash; MOAI (@__moai) <a href="https://twitter.com/__moai/status/586043918514421760">2015, 4月 9</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

Swiftでもdynamicを付けることでObjective-Cランタイム経由になるのでMOAspectsでのAOPが可能とのこと！
git > manページのインストール

動作確認

    CentOS 6.5

$git help help
すると「No manual entry for git-help」となり、gitのmanページが入ってなかったので入れた。

[参考1](http://sleepinghacker.blog.fc2.com/blog-entry-25.html)

上記のサイトではmanページの最新バージョン番号を調べてからwgetすることになる。
そうではなく、バージョン番号を調べなくても現在の最新を取得する方法として、以下を行った。

```
(rootアカウントにて)
$git clone git://git.kernel.org/pub/scm/git/git-manpages.git
$cp -r git-manpages/man1 /usr/local/share/man
$cp -r git-manpages/man5 /usr/local/share/man
$cp -r git-manpages/man7 /usr/local/share/man
$rm -rf git-manpages
```

これでmanページが見れるようになった。
RDSがincompatible-networkと表示されて削除できない時の対応

## RDSが削除できない
AWS Console上でRDSのStatusが赤文字でincompatible-networkなって削除できなかった。
AWS CLIでの削除も不可能だった。

## 原因
Subnetを作ったり消したりしていたのではっきりと覚えていないがRDSのSubnet groupsに含まれているsubnetを削除してしまった。
こちらに書かれているように、ネットワーク周りで問題があった時に発生する。
> https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/Overview.DBInstance.Status.html

## 対応
Subnet Groupsから該当のsubnetを削除しようと思ったがAWS Console上ではSubnetが表示されなかった。
しかしAWS CLIから `describe-db-subnet-groups` を実行すると該当のsubnetが確認できた。
`modify-db-subnet-group` を使って該当のsubnetを削除して存在するsubnetだけにした.

## ダメだった
削除してみたがincompatible-networkで待ってみてもavailableになることはなかった。
仕方ないのでAWS Supportに問い合わせて強制的に削除してもらうことになった。

## 問い合わせの対応
待ってみると直ることもあるらしい？
今回は直らなかった。

## 結局の対応
どうにもならなくなったらとりあえずサポート投げてみよう。
PhoenixFramework(v0.11.0)で新しいアプリの作りかたが変わった

v0.10.0 までは，phoenix のルートディレクトリで `mix phoenix.new ../new_app_path` などとしていた．

v0.11.0 では `phoenix/installer` ディレクトリで `mix phoenix.new ../../new_app_path` とするようになったみたい．

v0.11.0 のルートディレクトリで `phoenix.new` すると

```
~/niku/projects/phoenix% mix phoenix.new ../new_app_path
** (Mix) The task phoenix.new could not be found
```

となるので注意すること．


参考 [Could not be found the task phoenix.new on v0.11](https://groups.google.com/d/msg/phoenix-talk/xrFG5PZtdT0/g8gw-66iTXAJ)
[小ネタ][angularjs] ng-classで複数のクラス付を制御する


# ひとつのクラスを制御したい場合

変数`hoge`がtrueかfalseかで、currentを付ける場合、
以下のような書き方をします。

```haml
%div( ng-class="{ 'current': hoge }")
```

- hogeが`true`の場合、cssのクラスである`.current`がdivにアサインされる。
- hogeが`false`の場合、cssのクラスである`.current`はdivにつかない。

を実現します。


# 複数のクラスを制御したい

複数の場合、記述方法に迷いますが、下記でいけます。

```haml
%div( ng-class="{ 'current': hoge, 'changing': moge }")
```

基本angularのoptionに入るのはobjectなので、
迷ったらobjectの記述を書けば大抵うまくいきます。


＊`ng-style`など特に、
cssの記法かjsのobjectの書き方なのか迷いますが、
ng-styleに入るのもobjectです。
cssの記法で書くとうんともすんともしません、
jsのobjectとcssに記法がびみょ〜に似ているので注意です..(俺だけかも)
UI-Routerを使ってみる



## 概要

AngularJSのngRouterの代替用のモジュール。
複数のviewを持てるようになっている。

- [GitHub: angular-ui/ui-router](https://github.com/angular-ui/ui-router/wiki)
- [APIリファレンス](http://angular-ui.github.io/ui-router/site/#/api/ui.router)


## 準備

### AngularJSの開発環境を整える

[こちら](http://qiita.com/kiarina/items/e911d928f542a381e257)を参考にセットアップする。

### UI-Routerを組み込む

```bash
$ bower install angular-ui-router --save
```


## 使ってみる

### テンプレート

```html
<div ui-view="view1"></div>
<div ui-view="view2"></div>
```

### モジュールの登録

```javascript
angular.module('myApp', ['ui.router']);
```

### ルーティング設定

```javascript
angular.module('myApp')
    .config(['$stateProvider', '$urlRouterProvider', function($stateProvider, $urlRouterProvider) {
        $stateProvider
            .state('state1', {
                url: '/state1',
                views: {
                    'view1': {
                        templateUrl: 'views/test1.html'
                    },
                    'view2': {
                        templateUrl: 'views/test2.html'
                    }
                }
            })
            .state('state2', {
                url: '/state2',
                views: {
                    'view1': {
                        templateUrl: 'views/test2.html',
                        controller: 'Test2Ctrl'
                    },
                    'view2': {
                        templateUrl: 'views/test1.html',
                        controller: 'Test1Ctrl'
                    }
                }
            });

        $urlRouterProvider.otherwise('/state1');
	}]);
```

### 遷移

```javascript
angular.module('myApp')
    .controller('myCtrl', function($scope, $state) {
    	$state.go('state1');
	});
```

### 現在の情報を取得

### イベント


## 参考

- [AngularUI Routerのつかいかた](http://b.denkizakana.com/2014/02/angularui-router.html)
- [AngularJS のテンプレートを入れ子にしたかったから angular-ui-router を使ってみた](http://tnakamura.hatenablog.com/entry/2014/06/06/120000)
WebformモジュールからのメールをSMTP経由で送れない時の対処法


## Modules

- [Webform | Drupal.org](https://www.drupal.org/project/webform "Webform | Drupal.org")
- [Mail System | Drupal.org](https://www.drupal.org/project/mailsystem "Mail System | Drupal.org")

## 問題点

- Webformは標準でDrupalデフォルトの方法しか選択できない
- WebformからSMTP経由で送信しようとすると、`The submitted from address (=?UTF-8.....) is not valid `のエラーが出て送れない

## 対処方

### Mail Systemモジュールでモジュールごとのメール送信方法を設定する
- [Webform not sending e-mail (general troubleshooting, tips) [#364673] | Drupal.org](https://www.drupal.org/node/364673#comment-6811066 "Webform not sending e-mail (general troubleshooting, tips) [#364673] | Drupal.org")
- `/admin/config/system/mailsystem`に移動してNEW SETTINGでWebformを追加。保存後、SmtpMailSystemが選択されている事を確認する。


![](https://qiita-image-store.s3.amazonaws.com/0/4319/13db6897-6551-c49e-631f-125c124f7ec8.jpeg)





### WebformからSMTP経由で送信エラー回避
- [The submitted from address (=?UTF-8.....) is not valid [#1790436] | Drupal.org](https://www.drupal.org/node/1790436#comment-7466396 "The submitted from address (=?UTF-8.....) is not valid [#1790436] | Drupal.org")
- `/en/admin/config/content/webform`のADVANCED OPTIONSでE-mail address formatをShort fromatに変更する。


![](https://qiita-image-store.s3.amazonaws.com/0/4319/593612fa-9171-56af-53d5-2183995481b2.jpeg)