OmniAICreator/Qiita-1.07M huggingface dataset:
Ubuntu の Apache2 とさくらインターネットのドメイン管理でバーチャルホストの設定のメモ

# 始めに
同様な内容について有益な記事が他に多数ある中、あまり一般性のない内容の記事を自分へのメモとして僭越ながらこの場に置かしていただきました次第にございますれば、効率的でない点や間違っている箇所の御指摘などいただけましたら僥倖にございます。

# 要件
[apache2 のバーチャルホストの設定](http://httpd.apache.org/docs/2.2/ja/vhosts/examples.html)は、名前で分ける場合とか IP で分ける場合とかいろいろございますが、このメモの要件は以下でございます

- サーバは Ubuntu Trusty です
- IP Address は一つしかないです、ので**名前で**バーチャルホストを作ります
- ドメインはさくらインターネットでとってもらったので、さくらの管理ツールで管理してます
- 関係ないかもしれないけど一応、サーバは scaleway の C1 です

以下、ドメインを *domain.com*として、サーバのホスト名を *host*、仮想ホスト名を *v-host*、仮想サーバのドキュメントルートを /var/www/v-host にするものとして例示させていただきます
# 手順
## Ubuntu 側の設定
### sites-available の作成
/etc/apache2/sites-available/000-defalut.conf をコピーして v-host.conf をつくる

```bash:
cd /etc/apache2/sites-available/
cp 000-defalut.conf v-host.conf
```

v-host.conf を編集して ServerName と DocumentRoot の２カ所を修正する

```v-host.confの一部
	# The ServerName directive sets the request scheme, hostname and port that
	# the server uses to identify itself. This is used when creating
	# redirection URLs. In the context of virtual hosts, the ServerName
	# specifies what hostname must appear in the request's Host: header to
	# match this virtual host. For the default virtual host (this file) this
	# value is not decisive as it is used as a last resort host regardless.
	# However, you must set it for any further virtual host explicitly.
	#ServerName www.example.com
	ServerName v-host.domain.com

	ServerAdmin webmaster@localhost
	DocumentRoot /var/www/vhost
```

### 設定の反映
```bash:
a2ensite v-host
```

### apache2 の再起動

```bash:
service apache2 reload
```

## さくら側の設定
ドメイン管理で以下のように *host* の Aレコードと *v-host* の CNAME を設定します。さくらのマニュアルだと反映に数分かかるとのことですが、なんか瞬時に反映される感じでした

| エントリ名  |タイプ |データ               |
|:-----------|:-----:|:-------------------|
| *host*     |     A | *host* のIPアドレス |
| *v-host*   | CNAME |    *host*    |


# 参考URL
- [apache2 のマニュアル](http://httpd.apache.org/docs/2.2/ja/vhosts/examples.html)
- [ワイルドカード CNAME と Apache の vhost_alias でバーチャルホストを作る](http://qiita.com/ngyuki/items/8cb089023075b825e41a)
- [Apache2@Debianでのバーチャルホスト設定まとめ](http://qiita.com/ninneko/items/87a76f0f1dc6d82500fb)
- [apache/ubuntuでvirtual hostを設定したメモ](http://qiita.com/mickey390/items/0c81d14c9c1ad5367675)
SWITCHSCIENCE ESP-WROOM-02 開発ボードを試した


![20151114_030245000_iOS.jpg](https://qiita-image-store.s3.amazonaws.com/0/2080/9911d380-1746-1527-2ed7-fa2a89fec562.jpeg)

買ったのはこちら。
https://www.switch-science.com/catalog/2500/

ピンヘッダがついてませんので、つけました。(久しぶりのハンダ付けで腕が鈍っていることを痛感。ううう。)

今回は動作確認を兼ねてWiFiに接続してみます。

## 環境構築

まず、環境構築。今回はArduino 1.6.6をインストールしました。
https://www.arduino.cc/en/Main/Software


IDEのセットアップ手順はこちらのドキュメントが一番わかりやすかったです。
http://qiita.com/azusa9/items/264165005aefaa3e8d7d

## WiFiに接続してみる

ATコマンドを使ってボードをWiFiに接続してみます。

Arduinoのメニューにある「ツール」から「シリアルポート」を選びます。
私の環境では「COM3」でした。

次に、「ツール」の下にある「シリアルモニタ」を選びます。表示されたウインドウの右下のプルダウンから「CRおよびLF」「115200 band」を選びます。

最後に画面上部から「AT」と入力して横のボタンを押して送信すると、「OK」と帰ってくれば準備完了ということになります。

次に以下のコマンドを順番に送信します。

- AT+CWMODE=1
- AT+CWJAP="SSID","PASSWORD"
- AT+CIFSR

最後にIPアドレスが表示されたらOK.

こちらは私の実行したときの様子はこんな感じ。
(SSIDとPasswordにモザイク入ってます)
![espwroom02_01.jpg](https://qiita-image-store.s3.amazonaws.com/0/2080/227a44ee-706f-3ac2-82f4-b3e5d466b82b.jpeg)

## まずはここまで。

買ってきて、ピンヘッドつけて、動作確認まですぐでした。
これはいいぞ。

次はArduinoとして使ってみます。
IntelliJ IDEAのsbt consoleからScala2.9系のprojectをcompileできない

## 現象

大人の事情で、Scala 2.9.2でjarファイルを作る必要があったのですが、すんなりとできなかったのでメモ。
（ちなみに2015/11/14現状の安定板はScala 2.11.7）
まず、IntelliJ IDEAを使ってプロジェクトを新規作成し、クラスを適当に定義。
そのあと、IntelliJ IDEAのsbt consoleから`compile`してみたところ、以下のエラーが出てコンパイルできない。。目的のjarも作れない。。
```
[error] error while loading AnnotatedElement, class file 'C:\Program Files (x86)\JetBrains\IntelliJ IDEA 14.1.5\jre\jre\lib\rt.jar(java/lang/reflect/AnnotatedElement.class)' is broken
```

## 環境

* IntelliJ IDEA: 14.1.5
* sbt: 0.13.8
* Scala: 2.9.2
* Java: 1.7.0u80
* OS: windows 10

## 対策

### その1：IntelliJ IDEAのsbtを使わない

sbtの公式(<http://www.scala-sbt.org>)からsbtをダウンロードしてパスを通してコマンドプロンプトを立ち上げてプロジェクトに移動して、`sbt compile`。
普段Java8を使っている人は、Java7用のJAVA_HOMEに変更しておくことをお忘れなく。

### その2：sbt consoleを使わない

IntelliJ IDEAの`SBT Task`としてTasksに`compile`を登録して`Run`。

### その3：番外編

大人の事情がなければScalaのバージョンを上げればいいよ。

## その他

* 単にどこかの設定が不足しているだけかもしれないけど、上の組み合わせだとデフォルトの状態で失敗します。
* External Librariesにはjdkのライブラリがちゃんと読み込まれています。
* Scala 2.10以降なら問題ないです。
* sbtのバージョンを下げても改善しません。
* Java6でも改善しません。
* IntelliJ IDEA 15だとなぜだかset consoleがインストールされなくてそもそも上の問題が発生しません。
* Scalaのメジャーバージョンは２桁目。なので、２桁目が違っていたら互換性はないものと考える。
* Scala 2.9.2を使うときのJavaのバージョンは7か6か。8はダメ。
* IntelliJ IDEAのsbtと公式のsbtは違うようです。
Swift勉強メモ(1)-四則演算・変数宣言-

# Swiftはじめました

大学時代の友人がiPhoneアプリで４択アプリを作りたいと言っていたので、
私もこの機会に勝手に巻き込まれるかたちで勉強始めました。
勉強メモという形で残しておきます。
アプリがいつまでにできるかは未定です。

## 目的・目標
目的：iPhoneアプリを作って遊ぶ、Swiftと戯れる
目標：iPhoneで4択アプリの完成

目的は「遊ぶこと」。
友達がやるから一緒に巻き込まれちゃえ！！っていう感じです。

目標は友人と同じiPhoneで４択アプリの作成としました。
同じ参考書を買ったので、何聞かれても、
いつでも答えられるようにしなければ・・・（汗

## 言語の基礎的な構文
とりあえず、買った参考書をもとにPlaygroundでSwiftと戯れる
###　１.四則演算
```
1 + 1      //2
10 - 100   //-90
100 * 100  // 10000
9 / 3      // 3
100 % 3    // 1
9 / 0      // error
```
9/0 は０徐算のため案の定エラー。

###　2.変数、定数

```
// 変数宣言　
// var <変数名> = <値>
var value = 200
```
変数宣言は、javascriptと同じvar。
そもそもSwiftではvarつけないとそもそも変数宣言できないようなので、
javascriptのようにvarをつけ忘れて、殺されるようなことはないみたいです。

```
// 定数宣言
// let <定数名> = <値>
let age = 23
```
定数宣言は、let。
これから使うぞ！let'sみたいな感じですね（意味不明）

Swiftは変数や定数の型はRubyみたいに、自動的に推論してくれるっぽい。
嬉しい。

```
// 文字列の中での展開(おまけ)
// "\(<変数 or 定数>)"
var myAge = "私の年齢は\(age)歳です" // 私の年齢は23歳です
```

## まとめ
初回メモは四則演算と変数、定数でした。

本当はこの記事で、配列までまとめようと思ったのですが。
Swiftは配列とDictionaryとTuple(?)というのがある（らしい）。
配列まで入れると長くなりそうなので、別記事で。
Djangoでmechanizeをプーリング


## 前提
DjangoでWEB APIつくって[業務改善と称して](http://www.slideshare.net/satoshiyamada71697/django-54909370)社内においてまして、一部にmechanizeを使ってイントラログインとイントラの操作をAPI化して楽をしてました。

## 問題
WEB APIなので基本的にアクセスはステートレスでして、都度mechanizeのインスタンスを作成してイントラ操作をしています。そのため、イントラから見ると**APIへの1リクエストごとに新規ログイン**状態でした。近い将来情シスに怒られるので改善したくなります。

## 対処
mechanizeのインスタンスを毎回作成するのではなく、プーリングすることにしました。

```python:元々の呼び出し元
worker = IntraWorker(USER,PASS)
worker.do_something()
```

IntraWokerはmechanizeを使ったクラスです。``__init__``で毎回ログインしています。これを以下にしました。

```python:新しい呼び出し元
# get from pool
worker = IntraWorkerPool().get(USER,PASS)
worker.do_something()
# back to pool
worker.close()
```

IntraWorkerPoolというクラスを追加して、これにプールを管理させます。

```python:IntraWorkerPool
from threading import Lock

class IntraWorkerPool(object):
    """
    Mechanizeのプーリング管理

    """
    # poolされているWorker
    # user,passのタプルをキーとする
    pooled_workers = {}

    def __init__(self):
        self.lock = Lock()
    def get(self, user, password):
        """
        Workerインスタンスをプールから取り出す
        """
        ret_aw = None
        pool = IntraWorkerPool.pooled_workers
        key = (hashed(user), password)
        with self.lock:
            if key in pool:
                # 使用可能なのがなければ作る
                if len(pool[key]) == 0:
                    pool[key].append(IntraWorker(*key, pool_control=self))
            else:
                pool[key] = []
                pool[key].append(IntraWorker(*key, pool_control=self)
            
            # Workerがまだログイン出来る状態かチェック
            while (ret_aw is None) or (not ret_aw.is_login()):
                ret_aw = pool[key].pop()

        return ret_aw

    def back_to_pool(self, aw_inst):
        """
        poolにインスタンスを戻す
        実際はこれを直接コールしない。Worker側のcloseで呼ばせる

        """
        key = (hashed(aw_inst.user_no), aw_inst.user_password)
        pool = IntraWorkerPool.pooled_workers
        with self.lock:
            pool.setdefault(key, [])
            pool[key].append(aw_inst)
```

やってることは、クラス変数としてpooled_workersというディクショナリを用意してユーザ名とパスワードのタプルとWorkerインスタンスのリストの管理です。また、リスト操作はスレッドセーフにしないといけないはずなのでthreading.Lock()をつかってシリアライズしています。プールへの返却は```back_to_pool```というメソッドを用意し、こちらもLockで保護していますが、実際にはWorkerインスタンス側のCloseメソッド実行時にback_to_poolを実行されるようにしています。

正直、Pool管理クラスと管理対象クラスが相互依存チックなのが気に食わないのですがいまいちスマートな実装が思いつかずこんな形でお茶を濁しています。

もっとスマートなのがあればどなたか教えて頂けますと幸いです。
節電モードを検出してお行儀の良いアプリに


# 省電力モード？
iOS9はバッテリーが少ない時にLow Power Mode（低消費電力モード）へ切り替わるようになっており（ユーザー自身が設定することもできます）、設定すると省エネ対策（通信頻度やアニメーションなどなど）が働きバッテリーの寿命を節約します。

## 低消費電力モードの取得
現在省電力モードか判定する実装です。

- Objective-C

```
if ([[NSProcessInfo processInfo] isLowPowerModeEnabled]) {
    // Low Power Mode is enabled. Start reducing activity to conserve energy.
} else {
    // Low Power Mode is not enabled.
};
```
- Swift

```
if NSProcessInfo.processInfo().lowPowerModeEnabled {
    // Low Power Mode is enabled. Start reducing activity to conserve energy.
} else {
    // Low Power Mode is not enabled.
}
```
## 低消費電力モード変更の取得
電力モードが変更された通知を受け取るための実装です。

- Objective-C

```
[NSNotificationCenter defaultCenter] addObserver:self
   selector: @selector(yourMethodName:)
   name: NSProcessInfoPowerStateDidChangeNotification
   object: nil];
```
- Swift

```
NSNotificationCenter.defaultCenter().addObserver(
    self,
    selector: “yourMethodName:”,
    name: NSProcessInfoPowerStateDidChangeNotification,
    object: nil
)
```
### 注意
状態が不明だったり、デバイスが低電力モードをサポートしていない場合は常にNO(false)となります。

## まとめ
省電力モードの際は、位置情報の取得頻度や通信頻度やアニメーションを減らし、バッテリーの節約を行うことでユーザーにとって嬉しいお行儀の良いアプリにしていきましょう。

## 参考
https://developer.apple.com/library/prerelease/ios/documentation/Performance/Conceptual/EnergyGuide-iOS/LowPowerMode.html
VMware vSphere Clientのダウンロード方法

VMware vSphere Clientのダウンロード方法についての備忘録です。

# ESX/ESXi Serverからダウンロード
一番簡単な方法です。
IEなどのWebブラウザを開いて、

```
https://「ESX(ESXi)のIPアドレス」
```
を入力してアクセスするとWelcomeページが表示されるため、そのページのリンク（「Download vSphere Client」）からダウンロードできます。
アクセス時に「セキュリティ証明書に問題があります」等のメッセージが表示されることもありますが、無視して問題ありません。

# インストール済みのvSphere Client経由でダウンロード
互換性のないバージョンのvSphere ClientからESX/ESXi Serverにアクセスした場合、「更新中」のダイアログが表示されます。
そのダイアログで「インストーラの保存」を選択することで、対応するバージョンのインストーラがダウンロードできます。
ちなみに、同じOSに異なるバージョンのvSphere Clientを複数インストールでき、ESX/ESXiに接続した時に適切なバージョンのvSphere Clientが選択されるようになっています。

# VMware公式サイトからダウンロード
上述の方法はいずれもESX/ESXi Serverがインストール済みであることを前提としていましたが、新規構築前やバージョンアップ前などの事情で、先にvSphere Clientをインストールする必要もあります。
その場合は、VMware公式サイトからダウンロードすることになります。**My VMwareのIDを持っており**、かつ、**そのIDに有効なラインセンスが紐付いている**ことが条件です。
下記のURLは6.0ですが、サポートされているバージョン(2015/11/14現在では5.0以降)をオプションから選択できます。
https://my.vmware.com/jp/web/vmware/info/slug/datacenter_cloud_infrastructure/vmware_vsphere/6_0
それより古いバージョンが必要な場合は、下記から検索できます。
https://my.vmware.com/jp/web/vmware/downloads
最近のOpenCVで画素を探索する

まずcocopaods.

```
% cat podfile                                                                                                           [8:01:36]
platform :ios, "9.0"
pod 'OpenCV', '2.4.9'
```

**ver2.4.9.1以上**はなんとエラーがでてビルドできないので2.4.9でやるのが無難

また画像にもよるが大抵のネットに落ちているような画像であれば以下のコードで探索、操作できる

```
+(UIImage *)CenterToBlack:(UIImage *)image{

    //UIImageをcv::Matに変換
    cv::Mat4b mat;
    UIImageToMat(image, mat);
    
    int ave = 0;
    for(int y = 0; y < mat.rows; ++y){
        for(int x = 0; z < mat.cols; x++){
        mat.at<cv::Vec4b>(y, x)[0] = 0;
        mat.at<cv::Vec4b>(y, x)[1] = 0;
        mat.at<cv::Vec4b>(y, x)[2] = 0;
        }
    }
    
    UIImage *img;
    if (mat.channels() == 3) {
        cv::Mat4b mat4b(mat.size());
        cvtColor(mat, mat4b, CV_RGB2RGBA);
        img = MatToUIImage(mat4b);
    } else {
        img = MatToUIImage(mat);
    }
    
    return img;
}

```
CentOS7 JenkinsでAndroidアプリをビルドする 1/2


## 環境
* CentOS 7.1
* Oracle JDK 8u65 
* Android SDK
* Gradle
* BitBucket

## 概要
Jenkins自体がAndroidのビルド環境を提供してくれるわけではありません。

今回は、Jenkinsが動いているサーバー内にAndroidのビルドができる環境を構築し、

* CentOS上に、Androidのビルド環境を構築
 * JDKのインストール
 * Android SDKのインストール
 * SDKマネージャによるアップデート
* BitBucketからプロジェクトのクローン
* Gradleによるビルド

次回、Jenkinsの設定を行い、ビルドを実行してみたいと思います。

## CentOS上に、Androidのビルド環境を構築
### JDKのインストール
* JDKのダウンロード＆インストール

```
wget http://download.oracle.com/otn-pub/java/jdk/8u65-b17/jdk-8u65-linux-x64.rpm
yum localinstall jdk-8u65-linux-x64.rpm
```

* Oracle JDKを利用するように設定

```
vi /etc/profile.d/java.sh

#!/bin/bash
JAVA_HOME=/usr/java/jdk1.8.0_65
PATH=$JAVA_HOME/bin:$PATH
export PATH JAVA_HOME
export CLASSPATH=.
```

* 実行権限の付与

```
chmod +x /etc/profile.d/java.sh
``` 

* 確認（あとでJenkinsの設定で利用します）

```
echo $JAVA_HOME

/usr/java/jdk1.8.0_65
```

### Android SDKのインストール
* Android SDK
 * Android SDKを配置したディレクトリは、あとでJenkinsの設定で利用します

```
wget http://dl.google.com/android/android-sdk_r24.4.1-linux.tgzwget 
tar xvf android-sdk_r24.4.1-linux.tgz
mv android-sdk-linux/ /var/lib/jenkins/ # Jenkinsが参照できるディレクトリに配置
chown -R jenkins:jenkins android-sdk-linux/
```

* SDK Managerによるアップデート
 * すべてのプラットフォームがインストールされるので、時間がかかります。
 * JUnitで複数バージョンのテストをする予定なので、全部インストールしましたが、ターゲットが決まっているなら、選択した方が良いかもしれません。
 
```
tools/android update sdk --no-ui
```

## BitBucketからプロジェクトのクローン
* 予め、ローカル環境でビルド可能なプロジェクトをコミットしておきます。
 * 必要なのは、プロジェクトなので、CVSは、GitHubでも、Subversionでも構いません。

```
git clone https://bitbucket.org/{ユーザー名}/com.sample.test01.android.git
```

## Gradleによるビルド
### とりあえず、gradleコマンドを叩いてビルドできるか確認
* 『BUILD SUCCESSFUL』と表示されれば成功です 

```
ANDROID_HOME=/var/lib/jenkins/android-sdk-linux ./gradlew build --stacktrace
```

### エラーが表示される場合
* 『ava.io.IOException: Cannot run program "〜/build-tools/23.0.2/aapt": error=2, そのようなファイルやディレクトリはありません』
 * そのようなファイルがある場合でも、エラーが表示されます……。 
 * 『aapt』が64bit対応していないので、それ用のライブラリが必要なんだそうな。

```
yum install -y ld-linux.so.2
yum install -y libz.so.1
yum install -y libgcc_s.so.1
```

どうでもよいことだけど、
El Captanにアップデートしてから、ことえりの変換がおかしくて、”Jenkins”と入力すると、時々、"Jankins"になっていることがある……。
一文字違うだけで、執事から危ない奴になった。
フィボナッチを求める回路をPolyphonyとMessagePack-RPCでFPGAに実装してみた(シミュレーション編)

#はじめに

shtaxxxさんのブログ[「Pythonベースの高位合成コンパイラPolyphonyを試してみた」](http://shtaxxx.hatenablog.com/entry/2015/11/12/225637)でフィボナッチをPythonで記述してPolyphonyという高位合成ツールでVerilog-HDLにするという記事を見て、これは是非とも試してみねばなるまいと思ってやってみました。

#用意するもの

 - Xilinx Vivado 2015.3
 - [polyphony](http://www.sinby.com/PolyPhony/we-need-your-feedback.html)
 - Ruby 1.9.3 以降
 - [msgpack-vhdl-examples](https://github.com/ikwzm/msgpack-vhdl-examples)

#ブロック図

![akgeo2.jpg](https://qiita-image-store.s3.amazonaws.com/0/24981/d9802aeb-3dc3-1f7e-daf5-b2a3d070fbdf.jpeg)

#ソースコード

フィボナッチを求めるpythonのソースコードです。[「Pythonベースの高位合成コンパイラPolyphonyを試してみた」](http://shtaxxx.hatenablog.com/entry/2015/11/12/225637)のものをそのまんま使わせてもらいました。

````python:fib.py
def fib(n):
    if n <= 0: return 0
    if n == 1: return 1
    r0 = 0
    r1 = 1
    for i in range(n-1):
        prev_r1 = r1
        r1 = r0 + r1
        r0 = prev_r1
    return r1
````

#手順

##リポジトリと各submodule をダウンロード

````
shell% git clone git://github.com/ikwzm/msgpack-vhdl-examples.git
shell% cd msgpack-vhdl-examples
shell% git submodule init
shell% git submodule update
````

##fib.pyを高位合成

````
shell% cd examples/fibonacci/src/main/polyphony
shell% polyphony -o fib fib.py
````

polyphonyは[こちら](http://www.sinby.com/PolyPhony/we-need-your-feedback.html)からダウンロードしてください。
詳しくは[「Pythonベースの高位合成コンパイラPolyphonyを試してみた」](http://shtaxxx.hatenablog.com/entry/2015/11/12/225637)を参照してください。

##テストシナリオの作成

すでに作成済みのテストシナリオ(examples/fibonacci/src/test/scenarios/test_1_32.snr)を用意しています。このテストシナリオを使う場合は、以下の点順は飛ばしてください。

AXI4_Stream_Master_PlayerおよびAXI4_Stream_Slave_Player用のテストシナリオを作ります。

````
shell% cd examples/fibonacci/src/test/scenarios
shell% ruby test_1_32.rb
````

test_1_32.rb はテストシナリオ(YAML形式)を生成するためのrubyスクリプトです。


##Vivado プロジェクトの作成

Vivado プロジェクトを作成するためのTclファイル(create_project.tcl)を用意しています。
Vivadoを起動して次のメニューからTclファイルを実行してください。

````
Vivado > Tools > Run Tcl Script... > examples/fibonacci/sim/vivado/polyphony/create_project.tcl
````

##シミュレーションを実行

前節で作った Vivado プロジェクトを開き、次のようにシミュレーションを実行してください。

````
Vivado > Flow > Run Simulation > Run Behavioral Simulation
````

#結果
とりあえずシミュレーションすることは出来ました。
演算のビット幅を64ビットにする方法がわからなかったので、結果が32ビットに収まる範囲のnでしか計算していません。
何故かn=0の時の結果が0じゃなく1になってしまいますが、それ以外は正しい結果を返しているようです。
ちなみに、n=0の時の波形は下図のようになりました。
レジスタの一部がリセット後も不定になっているのもちょっと気になりますね。
![fibonacci_polyphony.jpg](https://qiita-image-store.s3.amazonaws.com/0/24981/622284a8-9cfe-d496-02db-a117f3836e29.jpeg)

#参考

- [polyphony](http://www.sinby.com/PolyPhony/we-need-your-feedback.html)
- [Pythonベースの高位合成コンパイラPolyphonyを試してみた](http://shtaxxx.hatenablog.com/entry/2015/11/12/225637)
- [msgpack-vhdl-examples](https://github.com/ikwzm/msgpack-vhdl-examples)
- [フィボナッチを求める回路をVHDLとMessagePack-RPCでFPGAに実装してみた(シミュレーション編)](http://qiita.com/ikwzm/items/a0ff6cf559f766162951)
- [フィボナッチを求める回路をSynthesijerとMessagePack-RPCでFPGAに実装してみた(シミュレーション編)](http://qiita.com/ikwzm/items/6b3e8120cc4ebbdd5a27)
- [フィボナッチを求める回路をSynverllとMessagePack-RPCでFPGAに実装してみた(シミュレーション編)](http://qiita.com/ikwzm/items/37e496680e44d4b80347)
- [フィボナッチを求める回路をneonlightとMessagePack-RPCでFPGAに実装してみた(シミュレーション編)](http://qiita.com/ikwzm/items/1b7cae327719c23fe55d)
OpenCV3で画像キャプチャしてウインドウ表示するだけ

```cpp:camcap.cpp
#include <iostream>
#include <opencv2/opencv.hpp>

int main()
{
    const char * const window = "Capture (Press ESC to exit)";
    const double scale = 0.75;
    const int delay = 32;   // [msec]

    cv::VideoCapture cap(0);
    if (!cap.isOpened()) {
        std::cerr << "fail to open cv::VideoCapture" << std::endl;
        return 2; 
    }

    const double width = cap.get(cv::CAP_PROP_FRAME_WIDTH) * scale;
    const double height = cap.get(cv::CAP_PROP_FRAME_HEIGHT) * scale;
    cap.set(cv::CAP_PROP_FRAME_WIDTH, width);
    cap.set(cv::CAP_PROP_FRAME_HEIGHT, height);
    std::cout << "frame=" << width << 'x' << height << std::endl;

    cv::namedWindow(window);
    cv::Mat frame;
    do {
        cap >> frame;
        cv::imshow(window, frame);
    } while (cv::waitKey(delay) != '\x1b');

    return 0;
}
```

```
$ brew install science/opencv3
...
$ clang++ -std=c++14 -W -Wall -O2 -o camcap camcap.cpp -I/usr/local/opt/opencv3/include -L/usr/local/opt/opencv3/lib -lopencv_core -lopencv_highgui -lopencv_videoio
$ ./camcap
```
TensorFlowでn次元ベクトル間の成す角を計算する

TensorFlowのいいところは、機械学習用のツールとしてもかなり優秀であるということと、数値計算系の機能がライブラリの中に隠蔽されず外で自由に実装できることにあると思う。
ということで、表題の通り*n次元ベクトル間の成す角を計算してみた*。

計算式にはベクトルの内積を使った方法で行う。
式で表すと、「cosx = a･b / (|a||b|)」というのでcosxを求めて、最後に角度に変換する。

まずは、2次元のベクトル同士の計算の場合を考える。
入力はあとから自由に設定したいので、変数や定数ではなくplaceholderを使う

```py
import tensorflow as tf

a = tf.placeholder(tf.types.float32, [1, 2])
b = tf.placeholder(tf.types.float32, [1, 2])
```

次に、内積「a･b」を計算する。
2つのベクトルの各要素がわかっているので、「a1 b1 + a2 b2」という計算式で求められる。
高次元の入力同士の掛け算には`tf.matmul()`を使用する。

```py
a_dot_b = tf.matmul(a, b, transpose_b=True)
# transpose_b=True とすると、第2引数の次元数を入れ替える(転置)してくれる。
# 今回はベクトルbが[1, 2] -> [2, 1]の形に変わる
```

続いて、各ベクトルの大きさ|a|, |b|を求める。
ベクトルの大きさは各要素の2乗和のルートをとることで計算できる。
tensorflowを使って書くとこんな感じ。

```py
a_abs = tf.sqrt(tf.matmul(a, a, transpose_b=True))
b_abs = tf.sqrt(tf.matmul(b, b, transpose_b=True))
```

あとは、はじめの式「a･b / (|a||b|)」に当てはめてcosxを計算する。

```py
cos = tf.div(a_dot_b, tf.mul(a_abs, b_abs))
```

ここまでで、「cosx = ベクトル間の成す角によって計算されるコサイン」を求める計算式が作れた。
この計算式に具体的な2次元ベクトルを入力し、コサインを計算する。

```py
with tf.Session() as sess:
    y = sess.run([cos], feed_dict={a: [[1, 1]], b: [[1, 0]]})[0][0]
# feed_dictに渡している辞書の各valueがcosが持っている入力ベクトルa、bに対応している。
# この計算結果は行列の値として取り出されるので、含まれる定数部分だけをyに代入する。
```

さて、ここまででベクトル間の成す角によって計算されるコサインが求まった。
あとは逆コサイン関数arccosを使えば成す角が求まるのだが、残念ながらtensorflowには実装されていなかった。

諦めかけた、その時！numpyにarccos関数が実装されていることを見つけた！
...ということで、最後はnumpyの関数を使ってコサインの値から角度に変換する。

```py
import numpy as np
print np.arccos(y) * 180 / np.pi
# arccosの計算結果がラジアンなので、180をかけてパイで割ることで角度を求めている。
```

できた。
試しにうえで入力にしたa = [[1, 1]], b = [[1, 0]]を計算してみると、[[45.]]と表示される。
これは、このa, bの成す角は高校数学でお馴染みの1:1:√2の2等辺三角形の底辺と斜辺になっているので、その間の角度は45度で正しいことがわかる。
他にも、a = [[1, 1.73205]], b = [[1, 0]] （= 1:2:√3の直角三角形に含まれる2辺）とすると、ほぼ60度という値が返ってくる。

さて、これで2次元のベクトルについて計算できることがわかった。
次に、これを2次元だけではなく好きな次元数のベクトルに対応できるように拡張する。

ただ修正するのは、一番初めのplaceholderの次元数の設定をNoneにするだけ。

```py
a = tf.placeholder(tf.types.float32, [1, None])
b = tf.placeholder(tf.types.float32, [1, None])
# shape(placeholderの第2引数)の要素にNoneを指定すると、どのような次元数の値が来ても対応できるようになる。
```

これで出来た。
あとは、入力ベクトルに好きな値を入れて計算してみる。
例えば、

```py
with tf.Session() as sess:
    y = sess.run([cos], feed_dict={a: [[1, 1, 1]], b: [[1, 1, 0]]})[0][0]
print np.arccos(y) * 180 / np.pi
# => [35.26438522]
```

この入力ベクトルa, bは「正立方体の底面の対角線と中心を貫く対角線との成す角」を表している。
計算してみると、確かにこれは35〜36度のあたりになる。

このようにTensorFlowを用いれば、ベクトル計算が簡単にできるようになる。
同様に、行列についても柔軟に計算ができそうなので、そちらも試してみる。

以下、今回実装したコード。（n次元ベクトル対応）

```py
import tensorflow as tf
import numpy as np

a = tf.placeholder(tf.types.float32, [1, None])
b = tf.placeholder(tf.types.float32, [1, None])

a_dot_b = tf.matmul(a, b, transpose_b=True)
a_abs = tf.sqrt(tf.matmul(a, a, transpose_b=True))
b_abs = tf.sqrt(tf.matmul(b, b, transpose_b=True))

cos = tf.div(a_dot_b, tf.mul(a_abs, b_abs))

with tf.Session() as sess:
    y = sess.run([cos], feed_dict={a: [[1, 1, 1]], b: [[1, 1, 0]]})[0][0]
print np.arccos(y) * 180 / np.pi
```
aptコマンドのSuper Cow Powers(?)


```:apt
$ apt moo
                 (__)
                 (oo)
           /------\/
          / |    ||
         *  /\---/\
            ~~   ~~
..."Have you mooed today?"...
```

```:apt-moo-moo
$ apt moo moo
                 (__)
         _______~(..)~
           ,----\(oo)
          /|____|,'
         * /"\ /\
           ~ ~ ~ ~
..."Have you mooed today?"...
```

```:apt-moo-moo-moo
$ apt moo moo moo
                     \_/
   m00h  (__)       -(_)-
      \  ~Oo~___     / \
         (..)  |\
___________|_|_|_____________
..."Have you mooed today?"...
```
今日除外したリファラスパム

さっき久しぶりにGoogle Analyticsを確認してみたら、サイトコンテンツのページタイトルに怪しげなタイトルを発見。ウチのサイト内にそんなタイトルねーよ！ってことでざっと調べてみた。

## AliBestSale.comというページタイトル
そんなページ作ってません。で、アドレスを確認すると`/`だ。11月8日からぽちぽち出てきてる。 **あやしい。**

[alibestsale.comはリファラスパム！AliExpressのサイトに見せかけるサイト / AnalyzeFindOut～アクセス解析を調べる](http://analyze.siraberu.info/post-560/)によると11月1日に取得された新ドメインとのこと。さっそく除外設定しました。

当該ドメインについては[alibestsale.comというリファラースパム【追記】/ サム☆スタイル的備忘ログ](http://blog.sam-style.biz/2015/11/08/alibestsale-com/)にもいろいろと書かれていました。

## 他にもいくつかあった
先のものはページタイトルがおかしかったので気づいたのだけれど、気になったのでトラフィックログを確認したら他にもいくつか。。。

1. alibestsale.com

2. claim********.copyrightclaims.org

3. rankings-analytics.com

4. nexus.search-helper.ru

5. floating-share-buttons.com

6. get-free-social-traffic.com

上位３つは複数のサイトにありました。２番目のやつはclaimの後ろ８桁にGoogle AnalyticsのアカウントIDが入っているので、それぞれ違うドメインです。

まったく、困ったもんだ。

## 11月21日追記
…増えた。o...rz

1. get-your-social-buttons.info

2. site********.snip.to

3. video--production.com

4. snip.to

めんどくさいよぅ。
最新の機械学習系フレームワーク（2015/11/14時点）


## FireCaffe 
* コーネル大学が開発
* DNNの分散学習時の処理を高速化（ex. NiN： 23倍、GoogleNet： 16倍）
* まだ開発環境はオープンにされていない
* http://arxiv.org/pdf/1511.00175v1.pdf
 
## TensorFlow
* Googleが開発
* `data flow graphs`という機械学習のオペレーションを記述して開発する
* モバイルデバイスにもデプロイ可能
* Dockerで開発環境が提供されている(`docker run -it b.gcr.io/tensorflow/tensorflow`)
* PythonとC++がある（※今後、GoやJavascriptなど様々な言語に対応させていくっぽい）
* http://tensorflow.org/

## DMTK
* Microsoftが開発
* 分散学習向けのフレームワーク
* C++で作られている
* 学習データの分散配置やマルチスレッドの管理など、煩わしい部分をフレームワークで吸収
* 使い手が学習ロジックやモデルの開発に専念できることを目的にしている
* MPIとZMQに対応している
* http://www.dmtk.io/
UnityEventのインスペクタチェック方法

UnityEventに、インスペクタ上でイベントが適切にアサインされているかを判断するコードです。
UnityEventにアサインされたイベントがない場合にエラーを出してくれるので、
リンク切れ時なんかに素早く気づくことができます。

チェック項目は３つ。
1. PersistentEventCountが適切な数であるか。
2. GetPersistentTargetがnullでないか。
3. GetPersistentMethodNameが空でないか。

例えば、unityEventという変数に１つのイベントを登録し、
その中にちゃんとイベントがアサインされていることを
Awakeで確認する場合、以下のようになります。

```csharp:UnityEventCheck.cs

public UnityEvent unityEvent;

void Awake()
{
    //UnityEventを使う時のエラーチェック
    // (1) PersistentEventCountが1であることを確認（この例では０であってもいけないし、２以上であってもいけない）
    if (unityEvent.GetPersistentEventCount() != 1)
        Debug.LogError("PersistentEventCount muse be 1 !", transform);
    else
    {
        Debug.Log("PersistentEventCount is " + unityEvent.GetPersistentEventCount().ToString());
        
        // (2) GetPersistentTarget(0)がnullでないことを確認
        if (unityEvent.GetPersistentTarget(0) == null)
            Debug.LogError("Persistent Target is null!", transform);
        else
        {
            Debug.Log("PersistentTarget' name is " + unityEvent.GetPersistentTarget(0).name);
       
            // (3) GetPersistentMethodName(0)が空でないことを確認
            if (string.IsNullOrEmpty(unityEvent.GetPersistentMethodName(0)))
                Debug.LogError("PersistentMethodName is NullOrEmpty !", transform);
            else
                Debug.Log("PersistentMethodName : " + unityEvent.GetPersistentMethodName(0));
        }
    }
}
```
このエラーチェックはUnityEngine.UI.ButtonのonClickなどにも利用できます。
fedora23 に機械学習ライブラリ TensorFlow をインストールする

fedora23 に Python の機械学習ライブラリ TensorFlow をインストールします。
[TensorFlow ってなんだろ - Qiita](http://qiita.com/shuhei_f/items/5ba61fff4e47e073c24f)

# 必要なもの

## Python のインストール

http://tensorflow.org/get_started/os_setup.md

によると、現時点では Python2.7 が必要です。

fedora23 にデフォルトで入っているのは Python3 のみのため、Python2 系をインストールします。

numpy のビルドに必要なので、 python-devel を同時にインストールします。

```bash
sudo dnf install python python-devel
```

2系と3系の共存が可能です。

```
$ python --version
Python 2.7.10
$ python3 --version
Python 3.4.3
```

## specs ファイルの追加

以下のエラーが出る場合は、 rpm-build が必要です。

```
gcc: エラー: /usr/lib/rpm/redhat/redhat-hardened-cc1: そのようなファイルやディレクトリはありません
```

rpm-build をインストールします。

```
sudo dnf install rpm-build
```

参考: ["mysql_config --cflags" does not work on fedora 21 - Ask Fedora: Community Knowledge Base and Support Forum](https://ask.fedoraproject.org/en/question/61075/mysql_config-cflags-does-not-work-on-fedora-21/)

これは specs ファイルと言い、ビルド時の動作を決定するファイルらしいです。 
参考: [猫科研究所 - GCCのspecsとは](http://www.up-cat.net/GCC%25A4%25CEspecs%25A4%25C8%25A4%25CF.html)

# インストール

ここではCPUのみを演算に使うバージョンをインストールします。

```
$ pip install https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.5.0-cp27-none-linux_x86_64.whl
```

GPUを利用する場合は、CUDAのSDKが必要です。

# 動作確認

```bash
$ python
Python 2.7.10 (default, Sep  8 2015, 17:20:17) 
[GCC 5.1.1 20150618 (Red Hat 5.1.1-4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow as tf
>>> hello = tf.constant('Hello, TensorFlow!')
>>> sess = tf.Session()
I tensorflow/core/common_runtime/local_device.cc:25] Local device intra op parallelism threads: 1
I tensorflow/core/common_runtime/local_session.cc:45] Local session inter op parallelism threads: 1
>>> print sess.run(hello)
Hello, TensorFlow!
```
[Unity] Image Effectでフェードアウト


Unity5から、今まではPro版でしか使えなかった機能が使えるようになっています。
そしてこの「Image Effect」もそのひとつ。

今回はフェードアウトをやってみます。
といってもImage Effectが使えれば全然むずかしくなく、単純に時間に応じて黒色を画面に載せるだけ、という簡単なお仕事です。

ちなみにそれを適用するとこんな感じ↓

[![https://gyazo.com/546b8cb766d7668b1b23d4974d6e87bb](https://i.gyazo.com/546b8cb766d7668b1b23d4974d6e87bb.gif)](https://gyazo.com/546b8cb766d7668b1b23d4974d6e87bb)
*今個人で開発中のVRゲームのシーンｗ*

## カメラにスクリプトをアタッチする

まず、Image Effectを適用するために、カメラに対してスクリプトをアタッチします。

![cap.png](https://qiita-image-store.s3.amazonaws.com/0/5616/0e7d16c7-aef1-1d33-a0f7-cc86c27f8351.png "cap.png")


アタッチするのはこんな感じのシンプルなスクリプトです。

```fader.cs
using UnityEngine;
using System.Collections;

public class Fader : MonoBehaviour {

	[SerializeField]
	Material m_Material;

	void OnRenderImage(RenderTexture src, RenderTexture dest) {
		Graphics.Blit(src, dest, m_Material);
	}
}
```

`m_Material` はインスペクタからマテリアルを設定する想定です。
（当然、コードだけで取得したりしても構いません）

さて、これで準備が整いました。
最後はフェードエフェクトをかけるためのシェーダを記述します。

ちなみにUnity5から、シェーダの追加時にタイプを選ぶようになっていました。（テンプレートが違う？）
タイプは「Image Effect Shader」を選んで追加します。

そして追加されたシェーダのうち、`frag` 関数をちょっとだけ修正します。
（`frag` 関数だけ抜粋します）

```fade
fixed4 frag (v2f i) : SV_Target
{
	fixed4 col   = tex2D(_MainTex, i.uv);        // 1)
	fixed4 black = 1 - fixed4(_Time.yyy / 2, 1);  // 2)
	col *= black;                               // 3)
	return col;                                 // 4)
}
```

やっていることは単純で、時間から色を算出しています。

1行ずつ説明すると、

**1)**
ここはデフォルトのままです。`fixed4 col = tex2D(_MainTex, i.uv);` の部分はエフェクトを掛けるために準備されたテクスチャ、つまりシーンのレンダリング結果からテクセルを取得しています。
これをそのままリターンすれば画面にはなにも変化が出ないことになります。

**2)**
`_Time` はビルトインの変数で時間経過を渡してくれる変数です。
（ちなみに定義済みの変数などは[以前こちらにまとめている](http://qiita.com/edo_m18/items/591925d7fc960d843afa)のでよかったら参考にしてください）

`_Time.y` は純粋な経過時間です。さらに `xzw` についても2倍、3倍などの時間経過が格納されています。
表現したい内容に応じて変えるといいでしょう。

そしてその半分の値を3成分に適用し、透明度は `1` としています。

```
1 - fixed4(_Time.yyy / 2, 1)
```

そして結果を `1` から引くことで徐々に暗くする、という演出を行っています。

**3)**
計算結果をテクスチャの色にかけています。
仮に、スタート直後だと `1 - fixed4(_Time.yyy / 2, 1)` の部分は `1 - fixed4(0, 0, 0, 1)` で結果は `1` と同等（つまり `x1` してもなにも変化しない）となるため、結果としてなにもしていないことになります。（そして時間経過で `0` に近づくので、結果としてフェードアウトしているように見える）

**4)**
あとは計算結果を戻すだけでフェードアウトの完成です。


ほぼ生成時のままですが、シェーダを載せておきます。

```hlsl
Shader "Custom/Fade"
{
	Properties
	{
		_MainTex ("Texture", 2D) = "white" {}
	}
	SubShader
	{
		// No culling or depth
		Cull Off ZWrite Off ZTest Always

		Pass
		{
			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			
			#include "UnityCG.cginc"

			struct appdata
			{
				float4 vertex : POSITION;
				float2 uv : TEXCOORD0;
			};

			struct v2f
			{
				float2 uv : TEXCOORD0;
				float4 vertex : SV_POSITION;
			};

			v2f vert (appdata v)
			{
				v2f o;
				o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
				o.uv = v.uv;
				return o;
			}

			uniform float _Timer;
			sampler2D _MainTex;

			fixed4 frag (v2f i) : SV_Target
			{
				fixed4 col = tex2D(_MainTex, i.uv);
				fixed4 black = 1 - fixed4(_Time.yyy / 2, 1);
				col *= black;
				return col;
			}
			ENDCG
		}
	}
}
```
Chainerで機械学習と戯れる: Treasureゲームの強化学習を110日程続けた経過メモ


はじめに
========

[Chainerで機械学習と戯れる: Treasureゲームの強化学習を50日程続けた経過メモ](http://qiita.com/mokemokechicken/items/7a398533042c2b40ddaa) から 更に60日以上経過しました。

賢い学習モデルでなくてもそれなりに目的は達成できるのか、というところに興味があるところです。

TreasureGameの現状
======

現在のハイスコア時の動きを動画にキャプチャしました。
https://youtu.be/iyBHR1gzumA

ハイスコア更新にかかる時間
------------------

前回の記録を見ると、

* 「27万回」「107万回」「192万回」「207万回」「269万回」「297万回」「371万回」

でスコア更新していたようです。今回のを見ると

* 「549万回」「558万回」「1057万回」「1308万回」

でスコアを更新していたようです。
遂に1000万回突破してました。感慨深い。。

新しい動き
------------

「549万回」目(0:43~)のときに、 敵をぐるっと一周するような動きをしていました。
遂に追いつめられるだけじゃない感じになったのかな。

「1057万回」目(2:09~)のときに、画面中央で上下に大きく振動するようになりました。
徐々に右にずれていって、結果的にお宝を１つ残してあとは全部回収できてました。
惜しい・・・

「1308万回」目(2:52~)のときに、何度か敵と左右を入れ替わりながらお宝を回収している様子が見受けられました。ただ、お気にいりの右下エリアに入ると幼いころの体験のせいか抜け出せないようでした。。。
途中もう少しで残りの一つも取れてそうだったのにな。惜しい・・・

年内には全部回収してくれるかもしれないなぁ。ここまで来たら、そこまではやらせてみようかなと思います。


ちなみにJumpGameの方は・・・
=========

JumpGameも同様に実行していたので結果を見てみました。
こちらはルールが単純な割に、途中に意地悪な穴の連続があって、そこを超えられるかが課題のようでした。
結果として、面の最後までいった記録は残っていましたが、現時点でも途中の穴に落ちることが頻繁にありました。

学習したというよりは「たまたま上手くクリア出来たことがあった（がその行動自体を学ぶことはできなさそうだった）」という感じです。

こういうモデルだと、一回のKey入力のミス（１フレームタイミングがずれること）が致命的な誤操作になるようなシビアなゲームはもしかしたら辛いのかなぁ、とも思います。
人間向けのゲームで普通それはないですしね。


さいごに
=======

TensorFlowとかも面白そうですね。
この分野は夢が広がるなー。
TensorFlowをpipで入れるときにPyUnicodeUCS4_FromStringAndSizeでつまづいた

PyUnicodeUCS4_FromStringAndSizeでググってもあまり出てこなかったのでメモ
pyenv及びanyenv環境の人はこれにはまるかも。


pythonのコンパイルオプションに`--enable-unicode=ucs4`を指定してやれば良いみたい。

```shell
$ PYTHON_CONFIGURE_OPTS="--enable-unicode=ucs4" pyenv install 2.7.10
```
解決。

参考
[Qiita: pyenvでpythonのコンパイルオプションを設定する](http://qiita.com/tumf/items/523abea8b3097fd31448)

TensorFlowあまり関係ないのでPythonタグにしました
line monitor > dummySerialの実装 / staticメソッド

```txt:動作確認
CentOS 6.5
```

RPi2にはpython3-serialが使える。CentOSでも使えそうだけど、調べる時間が惜しいのと、色々なCentOS環境でとりあえず実行が失敗しないように、ということでダミーを作った。

ついでにstaticメソッドの実装を [SO](http://stackoverflow.com/questions/735975/static-methods-in-python)を参考に行った。

[v0.2 @ github](https://github.com/yasokada/python-151113-lineMonitor/releases/tag/v0.2)

toLearn/dummySerial.pyを使う。

```dummySerial.py
class CDummySerial:
	def __init__(self):
		# do nothing
		return

	def read(self):
		# do nothing
		print "read:" # TODO: 0 > remove
		return ""

	def write(self,txstr):
		# do nothing
		print "write:", txstr # TODO: 0 > remove
		return ""

	@staticmethod
	def Serial(name, baud, timeout_sec):
		work = CDummySerial()
		return work

# Usage

'''
from dummySerial import CDummySerial

serial = CDummySerial()

con1 = serial.Serial('/dev/ttyUSB1', 9600, 0.1)
res = con1.read()
con1.write("test")
'''
```

Usageにもあるように以下のように使う

```151114b.py
from dummySerial import CDummySerial

serial = CDummySerial()

con1 = serial.Serial('/dev/ttyUSB1', 9600, 0.1)
res = con1.read()
con1.write("test")
```

```txt:結果
[toLearn]$ python 151114b.py 
read:
write: test
```

これでpython3-serialがない環境でもエラーは出なくなった。
smallbasicでlogicanalyzer

# 概要
　smallbasicでarduino unoを使って、logicanalyzerを作った。
# 写真
![logic.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/cc3cbb2a-8cef-049d-d013-dfc16bc47c2c.jpeg)

# サンプルコード１
```
x = 0
y = 0
yCenter = 300
Setup()
class1.OpenPort("COM5", 9600)
Loop:
  a = Class1.RXByte()
  x = x + 2
  If x > 800 Then
    x = 0
  endif
  If a - 128 < 0 then
    y = 220
  Else
    y = 200
    a = a - 128 
  endif
  If a - 64 < 0 then
    y = 250
  Else
    y = 230
    a = a - 64 
  endif
  If a - 32 < 0 then
    y = 280
  Else
    y = 260
    a = a - 32 
  endif
  If a - 16 < 0 then
    y = 310
  Else
    y = 290
    a = a - 16
  endif
  If a - 8 < 0 then
    y = 340
  Else
    y = 320
    a = a - 8 
  endif
  Shapes.Move(Dot3[x], x, y)
  If a - 4 < 0 then
    y = 370
  Else
    y = 350
    a = a - 4 
  EndIf
  Shapes.Move(Dot2[x], x, y)
  If a - 2 < 0 then
    y = 400
  Else
    y = 380
    a = a - 2 
  EndIf 
  Shapes.Move(Dot1[x], x, y)
   If a < 1 then
    y = 430
  Else
    y = 410
  EndIf 
  Shapes.Move(Dot0[x], x, y)
Goto Loop
Sub Setup
  GraphicsWindow.Width = 800
  GraphicsWindow.Height = 600
  GraphicsWindow.BackgroundColor = "Black"
  GraphicsWindow.Title = "logic analizer"
  GraphicsWindow.Show()
  For x = 0 To 800 Step 2
    GraphicsWindow.PenColor = "blue"
    GraphicsWindow.BrushColor = "blue"
    Dot0[x] = Shapes.AddEllipse(4, 4)
    Shapes.Move(Dot0[x], x, yCenter)
    GraphicsWindow.PenColor = "orange"
    GraphicsWindow.BrushColor = "orange"
    Dot1[x] = Shapes.AddEllipse(4, 4)
    Shapes.Move(Dot1[x], x, yCenter)
    GraphicsWindow.PenColor = "green"
    GraphicsWindow.BrushColor = "green"
    Dot2[x] = Shapes.AddEllipse(4, 4)
    Shapes.Move(Dot2[x], x, yCenter)
    GraphicsWindow.PenColor = "red"
    GraphicsWindow.BrushColor = "red"
    Dot3[x] = Shapes.AddEllipse(4, 4)
    Shapes.Move(Dot3[x], x, yCenter)
  EndFor
EndSub
```
# サンプルコード２
```
void setup()
{
	Serial.begin(9600);
}
void loop()
{
	byte val = PINB;
	Serial.write(val);
}
```
Jenkins_Homeをバックアップする


tarとかgzipとかオプション忘れがちなのでメモ。

```bash
sudo tar cfv jenkins_home.tar ./jenkins_home
sudo gzip -f9v ./jenkins_home.tar
sudo mv ./jenkins_home.tar.gz ./backup/
```

でも結局、Jenkins自身でバックアップを取りたくなったので、こちら使わせていただいてます。
https://github.com/sue445/jenkins-backup-script
Dockerのコンテナをまとめて削除する

(追記） 最近のバージョンのDockerでは、「prune」オプションが追加されましたので、お手軽に削除できますな。ついでに、imageもprune、systemもpruneできますね。

Stopしているコンテナをまとめて削除する。

```bash
$ docker container prune
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
```

確認不要なら、 ```-f``` オプションをつける。

```bash
$ docker container prune -f
```

Docker Versionが古い場合は、下記のコマンドで。

```bash
$ docker rm $(docker ps -aq)
```

ps コマンドの　-q オプションで、コンテナIDのみを取得します。
-a オプションで、全てのコンテナ（止まっているコンテナも）を対象にします。
なお、動いているコンテナは、エラーになって削除できません。

-f オプションで、強制削除できます。

```bash
$ docker rm -f $(docker ps -aq)
```
【超簡単！】Pythonで日本語を含む辞書やリストの中身を表示する方法

# はじめに
Pythonで日本語を扱う際に，辞書やリストの中身を確認したいときがあります．
しかし，日本語が含まれているとそのまま出力できません．
prettyprintという便利で簡単な方法があるのですが，さらに簡単な方法があるのでご紹介します．
prettyprintについては，以下の記事が参考になると思います．
[日本語対応prettyprintメモ(python2.7 windows7も )](http://qiita.com/zaoriku0/items/f4edbb5e044648994a0d)

# 超簡単な方法

```
print str(辞書名orリスト名).decode("string-escape")
```

このように書くだけです．
簡単ですよね！

# 比較
例として，以下のようなリストおよび辞書を作ります．

```
>>> # -*- coding: utf8 -*-
>>> list = ['明日','天気に','なあれ']
>>> dic = {'日にち':'10日','時間':'10時'}
```

## 普通に出力する

```
>>> print list
['\xe6\x98\x8e\xe6\x97\xa5','\xe5\xa4\xa9\xe6\xb0\x97\xe3\x81\xab', '\xe3\x81\xaa\xe3\x81\x82\xe3\x82\x8c']
>>> print dic
{'\xe6\x97\xa5\xe3\x81\xab\xe3\x81\xa1': '10\xe6\x97\xa5', '\xe6\x99\x82\xe9\x96\x93': '10\xe6\x99\x82'}
```

このようになり，日本語として表示できていませんよね．

## print str(辞書orリスト名).decode("string-escape")  

```
>>> print str(list).decode('string-escape')
['明日', '天気に', 'なあれ']
>>> print str(dic).decode('string-escape')
{'日にち': '10日', '時間': '10時'}
```

きちんと日本語で表示することができました！

## pretty print
 
以下のようにターミナルに打ち込むだけで，インストールができます．

```
easy_install prettyprint
```

これでもう使えるようになりました．
実際にリストや辞書に対して使うと以下のようになります．

```
>>> from prettyprint import pp
>>> pp(list)
[
    "明日", 
    "天気に", 
    "なあれ"
]
>>> pp(dic)
{
    "日にち": "10日", 
    "時間": "10時"
}
```

見やすい形に整形された状態で出力されます！


# まとめ
Pythonの日本語の辞書やリストの中身を表示する超簡単な方法と`prettyprint`をご紹介しました．
`print str(辞書orリスト名).decode("string-escape")` と `prettyprint`は状況によって使い分けるといいと思います．
`prettyprint` は，行替えをしてくれるので，要素の一つ一つが見やすいです．短いリストであったり，辞書やリストの中身がちゃんと入っているか確認するために先頭だけみたい場合であったりすれば，`print str(辞書orリスト名).decode("string-escape")`の方が見やすいかもしれません．

# 参考URL
-日本語対応prettyprintメモ(python2.7 windows7も )
http://qiita.com/zaoriku0/items/f4edbb5e044648994a0d
-Pythonで日本語を含んだリストと辞書をpretty printしたい件
http://sucrose.hatenablog.com/entry/20111112/p1
python > import seiral > ImportError: No module named serial

```txt:動作確認
CentOS 6.5
RaspberryPi2 + raspbian
```

```151114a.py
import serial
import time
import socket

def main():
	print "hello"

if __name__ == '__main__':
	main()
```

上記のスクリプトをCentOSで実行しようとすると以下のようになる。RPi2ではエラーとはならない。RPi2では対応するパッケージをインストールしたかは覚えていない。

```txt:結果
[toLearn]$ python 151114a.py 
Traceback (most recent call last):
  File "151114a.py", line 1, in <module>
    import serial
ImportError: No module named serial
```

[SO](http://stackoverflow.com/questions/23378208/importerror-no-module-named-serial)にはUbuntuでの対応方法が書かれていた。

```
# yum install python3-serial
```

を実行してみたが、`No package python3-serial available`となる。
Visual Studio 2013 CommunityがUTF-8 BOMなしファイルの日本語コメントでエラーになる

Cocos2d-xの書籍のサンプルコードを動かす際にWin32プロジェクトをVisual Studio 2013 Community(英語版)でビルドすると、日本語コメントがビルドエラーになることがあります。
![buiderror.png](https://qiita-image-store.s3.amazonaws.com/0/100700/9b0e6f63-eb8f-6a26-1bda-9231735427d9.png)
そういう時はソースコードがUTF-8のBOMなしになっているので、
UTF-8のBOM付きにするとビルドが通るようになります。
そういう時は、[KanjiTranslator](http://www.kashim.com/kanjitranslator/)を使ってソースコードを一括変換しています。
![kanjiTranslator.jpg](https://qiita-image-store.s3.amazonaws.com/0/100700/5b37a5d6-543f-64bf-2044-c5b493c5c445.jpeg)
技術英語 > a certain way > people don't know why something was built [a certain way].

http://money.cnn.com/2015/10/27/technology/voyager-nasa/

> People who work on the project now don't know why something was built <font color=red>a certain way</font>.

引き継ぎをうまくしなかったり、ソースやコミットメッセージの意図がきちんと残っていないとこういうことになる。

<hr>

http://qiita.com/7of9/items/442e742c7ef637d4eb32
> 微妙に干渉する > interfere with each other in subtle ways

と上記を比べると

- a certain way
- in subtle ways

inの有無が異なる。
どこかの文法の本で見た、「アメリカ英語の時のinの省略」が起きているのだろうか？
未消化。
OpenWeatherMapから気象情報を取得する


世界中の気象情報を取得でき、商用利用も可能なWebサービス「OpenWeatherMap」の利用手順を記します。

##アカウントの作成
[OpenWeatherMapサイト](http://openweathermap.org/)の「SignUp」ページで新しいアカウントを作成します。
次の情報を入力して「Create Account」ボタンをクリックしてください。

- ユーザ名
- 電子メールアドレス
- パスワード


![スクリーンショット 2015-11-14 3.06.16.png](https://qiita-image-store.s3.amazonaws.com/0/90456/0cafa83b-c5c2-b2b4-5102-5e2a53548d97.png "スクリーンショット 2015-11-14 3.06.16.png")

##APIキーの取得
アカウントが作成されると自身の設定画面が表示されます。
そこに記載されている「API key」が利用可能なキー文字列となります。

##Freeプランの制限について
自アカウントの設定画面にある「My Services」をクリックすると、気象情報を取得する際の上限が表示されます。
「10分間に600回」かつ「1日あたり50,000回」のアクセスがFreeプランの上限のようです。

![スクリーンショット 2015-11-14 3.27.38.png](https://qiita-image-store.s3.amazonaws.com/0/90456/50f12c92-dad7-81c7-2081-95e2d253958a.png "スクリーンショット 2015-11-14 3.27.38.png")

##気象情報の取得
気象情報を取得する際のオプションはURLパラメータで指定します。
####取得形式
パラメータ名： __mode__

|値|意味|
|:-------|-----------------|
|(省略時)| JSON形式で取得|
|  xml  | XML形式で取得|
|  html | HTML形式で取得|

####温度単位
パラメータ名： __units__

|値|意味|
|:-------|-----------------|
|(省略時)| ケルビン|
| metric  | 摂氏|
| imperial | 華氏|


###指定地点の気象情報の取得
####都市名での取得
パラメータ名： __q={都市名},{国コード(ISO3166)}__
指定例： q=Sapporo-shi,jp
　
####都市IDでの取得
パラメータ名： __id={都市ID}__
指定例： id=2128295
>都市名で曖昧検索するよりもID値で明確に指定する方式が推奨されています。
[こちら](http://bulk.openweathermap.org/sample/)から都市一覧「city.list.json.gz」をダウンロードしてください。

　
####緯度・経度での取得
パラメータ名： __lat={緯度}&lon={経度}__
指定例： lat=43.064171&lon=141.346939
>正確な座標でない場合、近似地点の気象情報が返却されます。

　　
***
###取得例
取得したAPIキーを用いて、札幌市の気象情報を取得してみます。
都市名を指定して問い合わせる場合のURL例は次の通り。（気温は「摂氏」）

http://api.openweathermap.org/data/2.5/find?q=Sapporo-shi,jp&units=metric&APPID=（ここにAPIキー文字列を指定してください）

情報は JSON形式の文字列 の形で取得できます。

```
{"message":"accurate","cod":"200","count":1,"list":
  [{"id":2128295,
    "name":"Sapporo-Shi",
    "coord":{"lon":141.35,"lat":43.058},
    "main":{"temp":5,"pressure":1030,"humidity":80,"temp_min":5,"temp_max":5},
    "dt":1447435800,
    "wind":{"speed":5.1,"deg":150},
    "sys":{"country":"Japan"},
    "clouds":{"all":75},
    "weather":
      [{"id":803,
        "main":"Clouds",
        "description":"broken clouds",
        "icon":"04n"
      }]
  }]
}
```

Freeプランでの気象データの更新間隔は「１〜２時間」なので、急激な天候の変化には追従できないかもしれません。
その場合は更新間隔の短い Developerプラン などへの変更を検討すべきでしょう。
（もちろん金銭的に余裕がある場合に限りますが）

##アイコン画像の取得
__weather:icon__ の"04n"は気象アイコンのファイル名です。
次のURLでアイコン画像をダウンロードできます。

http://openweathermap.org/img/w/04n.png
Mac で Docker Toolbox 使うときの設定いろいろ

Linux 以外でも Docker を使えるようになる Docker Toolbox だけどそのままだとまだちょっとツライものがあったので少しいじってみた。

https://www.docker.com/docker-toolbox

タイプ数を減らす
----------------

別にこれは Toolbox に限ったことじゃないけど。 git と同じノリ。

```sh
alias d="docker"
```

<kbd>d ps</kbd> は手癖。


zsh の RPROMPT に active な docker-machine を表示する
-----------------------------------------------------

いま操作対象になっている docker-machine を active な machine と呼ぶそうだけど、これ確認するためには <kbd>docker-machine active</kbd> と打たなきゃいけないのでめんどくさい。

じゃあ常にどっかに表示しようということで zsh の RPROMPT を使う。次のコードが最低限のもの。 git の branch 名出すのと一緒。

```sh
precmd() {
    psvar=()
    if [ ${DOCKER_MACHINE_NAME} ]; then
        psvar[1]="{${DOCKER_MACHINE_NAME}}"
    fi
}

RPROMPT="%1v"
```

うちはもろもろ表示させるためにこんな感じにしてる。

```sh
precmd() {
    psvar=()
    LANG=en_US.UTF-8 vcs_info
    psvar[1]=$vcs_info_msg_0_
    if [ ${DOCKER_MACHINE_NAME} ]; then
        psvar[2]="{${DOCKER_MACHINE_NAME}}"
    fi
}

RPROMPT="%B%{$fg[cyan]%}[%~%1v%2v]%{$reset_color%}%b"
```

active な machine を楽に切り替える / deactivate する
----------------------------------------------------

active な machine を切り替えるには <kbd>eval "$(docker-machine env &lt;machine-name&gt;)"</kbd> すればいいだけなんだけど極力補完がきいたほうが楽なので次のようなスクリプトをパスの通ったところにおいておく。

https://gist.github.com/januswel/e0acfed05205a01d2ed0

```sh:docker-active.sh
#!/bin/sh

command="docker-machine"
action="env"

which ${command} > /dev/null
if [ "$?" -ne 0 ]; then
    echo "$command is not installed"
fi

if [ "$1" != "" ]; then
    eval "$(${command} ${action} $1)"
else
    unset DOCKER_MACHINE_NAME
    unset DOCKER_CERT_PATH
    unset DOCKER_HOST
    unset DOCKER_TLS_VERIFY
fi
```

で、 <kbd>. docker-active.sh &lt;machine-name&gt;</kbd> すれば machine-name が active になる。
さらに <kbd>. docker-active.sh</kbd> とマシン名を指定せずに呼ぶとどの machine も操作対象にしないようにできる。
MacでTensorFlowを使う際に出たエラー、warning

11/9にGoogleがリリースした機械学習ライブラリTensorFlow http://tensorflow.org/ を軽く利用してみたところ遭遇したWarningやエラーについて、まだ日本語で情報が出ていないように思われるものについて整理しておきます。

利用方法については、本家に丁寧なチュートリアルがあり、また、他の記事で日本語化なども試みられていますので、そちらを参照してください。

著者の環境はOSX10.9.5で、MacOS向けバイナリを利用しています。

* numpyのバージョン問題

```pycon
>>> import tensorflow as tf
module compiled against API version 9 but this version of numpy is 6
```

既に入っていた古いnumpyが参照されているよう

numpy.\_\_path\_\_にあるnumpyをnumpy_tmpなど適当にrenameするとimport tensorflowは通るようになった
(renameで対処してしまって良いものなのか、より良いノウハウがありましたらpython屋さんの方ご教授下さい。)

```pycon
>>> import numpy
>>> numpy.__version__
古いnumpyのバージョンが出るはず、上のエラーではnumpyが6だよと言われているので'1.6.0'など
>>> numpy.__path__
今見ているnumpyのpathが出るはず、これを控えてrenameする
```

* セッションを作成すると以下のwarningが出た

```pycon
>>> sess = tf.Session()
can't determine number of CPU cores: assuming 4
I tensorflow/core/common_runtime/local_device.cc:25] Local device intra op parallelism threads: 4
```

http://stackoverflow.com/questions/33617638/tensorflow-mac-os-x-cant-determine-number-of-cpu-cores
によると、これはOSXバイナリを利用している場合に発生している現状のようで、

```pycon
NUM_CORES = <コア数>
```

と明示的に指定してやると、出なくなります。
https://github.com/tensorflow/tensorflow/commit/430a054d6134f00e5188906bc4080fb7c5035ad5 のコミットにて対応されており、将来リリースされるバイナリでは問題なく実行されるようです。

* その他

他、なにか遭遇したら追記します。
(普段はpythonマンではありませんので、よくわかってなさそうな箇所があれば、よくわかっていない可能性があります。ご指摘、ご教授いただけましたら幸いです。)
World Spaceに置いたCanvasにボタン等を設置する時の注意点

普通に置けば普通に反応すると思ってたんですが、教えてる学生さんのプロジェクトに置いてみたら全然反応しなかったので「何故じゃー」となってハマったので備忘録的に書いておきます。

結論から言うと
「 **そのCanvasを映しているカメラのタグが "MainCamera" じゃないとUI部品はクリックできない** 」
ということでした。普段からメインカメラのタグは MainCamera にしてたから全然気づきませんでした。

さらにこの原因を調査していく過程で発見した、しかし通常この知識が利用される機会は無いだろうなという点についても書いておきます。
それは
「 **Canvasの方向がカメラの向きから90°を超えると見た目が押せそうに見えてもボタンは押せない** 」
ということでした。Perspectiveなカメラだとカメラと直角な面でも画面中心にいなければ画面には見えていますが何故かこの状態だとボタンは反応しません（下図のような状態）。なんとなく裏向きだと反応しないんじゃないかとは思っていたものの見えててもダメとは。

![スクリーンショット 2015-11-14 2.57.45.png](https://qiita-image-store.s3.amazonaws.com/0/53460/e0ccaf57-34cb-a5b2-8b7e-5fd81f9dc15a.png "スクリーンショット 2015-11-14 2.57.45.png")

まあ普通ワールドスペースにボタンを置くならCanvasのrotationはカメラのrotationに合わすだろうからこの状況自体が「無い」とは思うものの一応見た目は押せそうなのでとりあえず注意点として。

####おまけ： World Spaceに置いたCanvas用「いつでもカメラ方向を向くスクリプト」

```
void Update () {
	transform.rotation = Camera.main.transform.rotation;
}
```

カメラと同じ方向にすると裏向きになりそうな気がするけどこれがこちら向きなのです。なんとなくモヤモヤするけどいちいち向かい合わせにしなくて良い分スクリプトはスッキリしますね。
TensorFlow と Numpy で乱数の seed 固定ちょい違うやも

大変どうでも良いメモ.
TensorFlow の `tf.set_random_seed()` は Numpy の `np.random.seed()` と若干挙動が違うっぽい.
Numpy は `np.random.seed()` する度にシードがリセットされて再び同じ擬似乱数列が生成されるのに対して, TensorFlow はリセットされないみたい.

なんか日本語が不自由な文章を書いてしまったが, 以下のようなコードを実行してみると多分伝わる.

```python
import numpy as np
import tensorflow as tf

print '===== Numpy ====='
np.random.seed(0)
print np.random.uniform(size=5)
print np.random.uniform(size=5)

print 'Numpy can reset seed'
np.random.seed(0)
print np.random.uniform(size=5)
print np.random.uniform(size=5)

print '===== TensorFlow ====='
tf.set_random_seed(0)
with tf.Session() as sess:
    print sess.run(tf.random_uniform([5]))
    print sess.run(tf.random_uniform([5]))

print 'TensorFlow does not reset seed'
tf.set_random_seed(0)
with tf.Session() as sess:
    print sess.run(tf.random_uniform([5]))
    print sess.run(tf.random_uniform([5]))
```

```
===== Numpy =====
[ 0.5488135   0.71518937  0.60276338  0.54488318  0.4236548 ]
[ 0.64589411  0.43758721  0.891773    0.96366276  0.38344152]
Numpy can reset seed
[ 0.5488135   0.71518937  0.60276338  0.54488318  0.4236548 ]
[ 0.64589411  0.43758721  0.891773    0.96366276  0.38344152]

===== TensorFlow =====
I tensorflow/core/common_runtime/local_device.cc:25] Local device intra op parallelism threads: 4
I tensorflow/core/common_runtime/local_session.cc:45] Local session inter op parallelism threads: 4
[ 0.32064009  0.69209957  0.7421422   0.86931682  0.95991254]
[ 0.70880806  0.3939954   0.67383504  0.34078181  0.98877013]
TensorFlow does not reset seed
[ 0.30350876  0.06209636  0.98059976  0.51447523  0.15706789]
[ 0.48785222  0.40416086  0.97456396  0.57969069  0.09107506]
```

コードをまるっと実行し直せばまた同じ擬似乱数列が生成されるので実験の再現性という意味では問題ないが, 例えば IPython 上で続け様に `%run hoge.py` とかやっているとシードがリセットされないので気を付けられたしというか, それで気付いた.

ちなみに R は Numpy と同じ宗派.

```r
> set.seed(0)
> runif(5)
[1] 0.8966972 0.2655087 0.3721239 0.5728534 0.9082078
> set.seed(0)
> runif(5)
[1] 0.8966972 0.2655087 0.3721239 0.5728534 0.9082078

```
【Rails】特定のページから遷移した時だけ前のページにリダイレクトするリンクを表示する


## Railsで前のページにリダイレクトしたい時

AというページとBというページがあったとして、
通常の方法でBにアクセスした場合はボタンが出ないけど、AからBへアクセスしたときだけBにもどるボタンを出したいという場合を考えます。

Aで link_toにgetのパラメータを渡すというやり方でもいいかもしれませんが、そういう時は **request.referer**を使うと意味的に分かりやすいでしょう。



```B.slim

- if request.referer.include?('/A/')
  = link_to :back

```


## 参考

- http://oka-nori.hatenablog.com/entry/2014/03/16/114159
- http://qiita.com/syshun/items/0d3436e32ad6d39e206d
日本語を含む JSONP を jq する

JSONP を `jq` コマンドで確認したいと思い、調べてたら下記の Wiki を発見し、
試してみたんですがどうやら日本語を含む JSONP だと動かない。。

* https://github.com/stedolan/jq/wiki/FAQ#general-questions

### 日本語を含まない JSONP の場合

~~~~sh
$ echo 'callback({"foo":"bar"});' | jq -R '.[1+index("("): rindex(")")] | fromjson'
{
  "foo": "bar"
}
~~~~
意図したとおりの結果が返ってくる。

### 日本語を含む JSON の場合
~~~~sh
$ echo 'callback({"foo":"ばあ"});' | jq -R '.[1+index("("): rindex(")")] | fromjson'
jq: error (at <stdin>:1): Invalid numeric literal at EOF at line 1, column 18 (while parsing '{"foo":"ばあ"});')
~~~~

`rindex` 関数が byte 数で計算してるようで後ろの `);` が消されない。。


## 解決策
下記のように `ruby` で JSONP のコールバック関数部分を除去してから `jq` に渡す `jqp` という名前のエイリアスを作成。

~~~~sh
$ alias jqp="ruby -e 'print gets.gsub(/^[a-zA-Z0-9_ \.]*\(|\);?$/, \"\")' | jq"`
~~~~
※除去する正規表現部分はこれだとまだ不十分かも？

### jqp エイリアスの実行結果
~~~~sh
$ echo 'callback({"foo":"bar"});' | jqp .
{
  "foo": "bar"
}
~~~~
sqlplusに接続する２つの方法の違い

　
コマンドプロンプトなどでOracleに接続する際のメモ。

```lang:接続方法①
$ export ORACLE_SID=orcl
$ sqlplus user/passwd
```

```lang:接続方法②
$ sqlplus user/passwd@orcl
```

**接続方法①は環境変数を指定してインスタンスに接続します。**
サーバに複数Oracleインスタンスが起動していても、環境変数で指定したインスタンスに接続ができます。

**接続方法②はlistner.oraの接続情報を参照してインスタンスに接続します。**
@マークの後のインスタンス名をキーにlistner.oraに記載された接続情報を参照し、インスタンスに接続します。


サーバ内に同じ名前のインスタンスは存在できませんが、同じネットワーク内には同じ名前のインスタンスが存在できます。
ネットワーク内に同じOracleインスタンス名が存在する場合(テスト環境サーバと本番環境サーバ 等)どちらのインスタンスに接続するかを意識しなければなりません。

サーバ内のインスタンスに接続する場合は、環境変数を指定する接続方法①で接続します。
外部サーバのインスタンスに接続する場合は、listner.oraに記載されている情報を参照する接続方法②でインスタンスに接続します。

ここで誤って、テスト環境から本番環境に接続する際に、接続方法①で接続してしまうと、本番環境に接続しているつもりが、テスト環境に接続していた・・ということも起こりうるわけです。

誤ってテスト環境に接続してしまったのであればまだいいですが、逆だと大変です。
listner.oraに本番環境のインスタンス情報が記載されており、かつ何も意識せず接続方法②で接続してしまった場合、テスト環境に接続しているつもりが本番環境に接続してしまっていた。。ということが起こりえます。
(そもそもテスト環境サーバと本番環境サーバを同じネットワークセグメント内に存在させることがナンセンスな話なのですが・・。)

考えるだけでゾッとしますね。。
 

　
おしまい。