OmniAICreator/Qiita-1.07M huggingface dataset:
USB-serial と Arduino Leonardo で作る簡易KVMコンソール (キーボード編)

[サーバセットアップの強い味方、ノートパソコン接続KVMコンソールの紹介 | ツチノコブログ](http://tsuchinoko.dmmlabs.com/?p=2668)によると、VGA, Keyvboard, Mouseをノートパソコンなどで実現する機械のようですが、これのうちVGAはちょっとつらいにしても、キーボードやマウスくらいなら簡易的に実現できるのではないかと思って、USB-serial変換器とArduino Leonardoで作成してみました(キーボードのみ)

## Arduino Leonardo

Arduino Unoとは違いCPUのSoC自体がUSBも持っていて、ArduinoでUSB keyboardやMouseに化ける事が出来ます。Leonardo以外でも同じようなのがあるのでそれでもいけるはずです。

## 回路

回路というほどではないですが、USB-serialとLeonardoを結線します。

USB-serial|Arduino Leonardo
----------|----------------
GND       |GND
RXD       |TX (PB1)
TXD       |RX (PB0)

## ソース

https://github.com/erukiti/tiny-kvm にソースを置きました。

* app/ Electronアプリケーション。Nodejs 5系が必要です
* leonardo Arduinoスケッチ

app の方は分量が多いので貼らないですが、Arduinoのスケッチだけ貼ってみます。

```C
#include <keyboard.h>

void setup(void) {
  Serial.begin(9600);
  Serial1.begin(9600);
  Keyboard.begin();
}

void keyWait() {
  while (Serial1.available() <= 0)
    delay(1);
}

void loop(void) {
  char buf[1024];
  byte ch;

  keyWait();
  byte tp = Serial1.read();
  switch (tp) {
  case 1:
    keyWait();
    ch = Serial1.read();
    Keyboard.press(ch);
    sprintf(buf, "%02x", ch);
    Serial.println(buf);
    break;

  case 2:
    keyWait();
    ch = Serial1.read();
    Keyboard.release(ch);
    sprintf(buf, "%02x", ch);
    Serial.println(buf);
    break;
  }
}
```

## 問題点や今後

* キーボードのリピート周りがおかしい
* まだ、Mac to Mac でしか試していない

今後はマウスも対応していきたいです。
swift playgroundでNSTimerを使う

swift playgroundでNSTimerを使う方法を記載

playgroundの実行はそのままだと終了してしまうので、
XCPlaygroundPage.currentPage.needsIndefiniteExecutionをtrueに設定して永続するようにします。

```swift

import UIKit
import XCPlayground

XCPlaygroundPage.currentPage.needsIndefiniteExecution = true

class timerController:NSTimer {
    
    func setTimer() {
        let _fps = round(1000/30)*0.001;
        NSTimer.scheduledTimerWithTimeInterval(_fps, target: self, selector: Selector("ticker"), userInfo: nil, repeats: true)
    }
    
    func ticker() {
        print("hoge")
    }
    
}

var obj:timerController = timerController();
obj.setTimer()
```


以上
Upverter > Module > 2. Moduleを使用

[Upverter > Module > 1. Moduleを作成](http://qiita.com/7of9/items/8c4b670d147686594567)
で作成したモジュールをデザインに使ってみる。

## Moduleの使い方

### 1. デザインでModuleを置く

- Moduleを使うデザインを新規作成または開く
- コンポーネント追加アイコン(左の上から２つ目）を押してAdd Component画面を開く
- modulesを選択する
- 作成したModuleの一部をキーワードとして検索する (下図)。今回の例では「Module_test」
  - 以下のように作成したモジュールが検索できる

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/1aa4ff47-f810-ab1a-8945-57976b2cebd9.png)

- [Place Module]を選択して、デザインにモジュールを置く

置かれたモジュールはピンの情報のみが表示され、詳細は表示されない。
このモジュールと他のICパーツを接続していきデザインを行う。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/0d2c7f84-333c-1743-1828-121da1a0e7b8.png)


デザインに置いたModuleには以下のようにシンボルを接続できる。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/2309718c-78f2-2803-89c2-98df493707d6.png)

複数のモジュールを接続することで、上位側で見通しのよいデザインを作成することができる。

関連デザイン
https://upverter.com/7of9/c62921c059af5825/Module_call160222/
https://upverter.com/eda/#tool=schematic,designId=c62921c059af5825

### 2. Moduleの詳細を見る

Module同士を結合したデザインを進める中で、Module詳細を閲覧したい時がある。
手順は以下のようにする。

- デザイン上に置いたModuleをダブルクリックすると以下のメニューが表示される


![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/fbfb1edc-d373-1717-969f-00bf6f3562c7.png)

- Viewを押すとModuleの詳細画面(下図)に飛ぶ

- 画面上部の「Close Module」を押すと、元のデザイン画面に戻る

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/437a0922-8c51-bf79-d8b3-b0a820c689ff.png)
Upverter > Module > 1. Moduleを作成 

```txt:動作確認
Windows 8.1 pro (64bit)
google Chrome バージョン 48.0.2564.116 m
```

UpverterのModuleの使い方をトライ5回目でようやく理解できた。
zakさんとのやり取りでその使い方が理解できた。感謝。
https://forum.upverter.com/t/can-i-combine-two-designs/22902/10

将来の自分のために手順を整理しておく。

## Moduleとは

Moduleは作成したデザインを抽象化する機能だと思う。
プログラムでも同様だが、パーツを抽象化することで、複雑な回路の設計においては上位側ではモジュールの結合したものとして設計できる。それにより上位設計で詳細まで読む必要がなくなる。
Code Completeにもある「Managing Complexity」に通じる。

一方で、[別記事に記載](http://qiita.com/7of9/items/f215ab1b7353c0ca3124)のようにModule内部を開くことができるので、見たい詳細を逐次追うことが可能となる。


## Moduleの作り方

### 1. デザイン作成

まずプロジェクトで以下のように外部へのシンボルがあるデザインを作成する。

ここで、名前は「Module_test160222」とする。<font color=red>(この名前はモジュール使用時の検索で使用することになる)</font>。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/ac2afca1-bf7e-80ab-143a-489703e3fb39.png)

上記では以下のシンボルが外部に出ている

- VCC
- Output
- Input
- GND

### 2. モジュールに変換

- [Porject]-[Convert to Module]を選択する
  - メニューに[Publish Module Revision]というのが表示されModuleになっていることが分かる
- [Publish Module Revision]を選択する
  - Symbol Revisionという画面が表示される


例として以下のように設定する。
ここで、「Revision Name」はModuleの詳細画面でバージョン管理に使われる。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/21b47f8f-b452-29e0-839f-8af250ba3d7f.png)

<!-- ![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/3136089a-4f0f-6228-bf3d-64fdb9321520.png) -->


- Create Symbolを押す
  - Symbol作成画面(Component Editor)が表示される

- Pinsを開くと上記で設定した4つのピンが表示される(下図)
  - すべてのピンの位置はUnassigned (未割当)になっている

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/1f5d8128-4a81-16b0-576d-5a40438aa8ce.png)

- [Handle Unassigned]を押すと自動的にピンの位置が割り当てられる(下図)
- 用途により位置を手動で変更するが、この例ではこのままとする

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/98b12590-2da1-09bb-d81c-932d3b10693d.png)

- [Attributed]-[Edit]を押す

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/49d58af1-1f96-998c-e1e1-f13b0ae65f39.png)

- [Part Number]を入力して[Save]を押す

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/4ef2daa7-b4dd-a2e6-8b4e-00e4f6613c69.png)

- Component Editorにて[Save]を押すとSymbol Revision画面(下図)に戻る
- Saveを押してModule保存が完成

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/f3d07008-7f5c-b86d-6111-d56d7178ef35.png)

<!-- ![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/14675136-5010-ae79-0c8b-07afd3c8db02.png) -->

画面上部に「Successfully published new module revision v0.1」などと表示される。

<!-- ![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/6d0022d3-d155-7f8c-473c-b56505b5a71a.png) -->

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/9139103b-7535-07f5-9ca0-09813120bc40.png)


関連デザイン
https://upverter.com/7of9/71863b074a519998/Module_test160222/
TomcatをJS/CSS静的コンテンツの扱い方法

簡易の環境では、Nginxなどの代わりに、Tomcatから静的コンテンツを返却してほしいです。

Warファイルは`webapps/ROOT`に展開されていて、JS/CSSは`webapps/ROOT/assets-dir`に格納しています。

この場合`server.xml`設定ファイルを下記のように、`Context`要素を利用することができます。

```xml
<Host name="localhost"  appBase="webapps"
    unpackWARs="true" autoDeploy="true">

    <Context docBase="ROOT/assets-dir" path="/assets" />

</Host>
```

Tomcatを再起動すると、`http://localhost/assets/some.css`がアクセスことができるようになるはずです。
Androidアプリにおける起動を判定する必要があったのでシンプルに実装してみた


### 背景
アプリを作る時にログを仕込んで、改善に役立てるのはよくあると思います。
アプリ起動時にログを送りたいということもよくあると思いますが、そのタイミングで詰まってしまったためまとめておきます。

### 今回想定するアプリ起動時
今回想定する **アプリ起動時**は以下のタイミングとします。

- ランチャーから立ち上げた時
- アプリ履歴(タスク)から立ち上げた時

一般的にはアプリ起動時にログを送る場合、`Application#onCreate`でログを送ればいいと思いますが、今回はアプリ履歴から立ち上げた時にも送る必要があるのでこれだけは不十分です。

### 対応
1. `Application.ActivityLifecycleCallbacks`を使用
1. `ComponentCallbacks2#onTrimMemory`を使用
1. 状態をフラグで管理

`Application.ActivityLifecycleCallbacks`はその名の通りActivityのライフサイクルのコールバックを取れます。
`ComponentCallbacks2#onTrimMemory`はAPIレベル14で追加されたものになります。OSがmemoryをtrimするすべきタイミングでこのメソッドが呼ばれます。アプリのが見えなくなった場合に引数の`level`に`ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN`が入ってきます。

これらを使って、UI_HIDDENのタイミングでログ送信フラグをtrueにして、Activityのいいタイミングでログを送って再びフラグをｆalseにするだけです。以下コードを貼ります。

```java
private boolean shouldSendLaunchLogs = true;

@Override public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
    if (shouldSendLaunchLogs) {
      // send logs
      shouldSendLaunchLogs = false;
    }
  }

  @Override public void onActivityStarted(Activity activity) {
    if (shouldSendLaunchLogs) {
      // send logs
      shouldSendLaunchLogs = false;
    }
  }

  @Override public void onActivityResumed(Activity activity) {
    if (shouldSendLaunchLogs) {
      // send logs
      shouldSendLaunchLogs = false;
    }
  }

  @Override public void onActivityPaused(Activity activity) {
    if (shouldSendLaunchLogs) {
      // send logs
      shouldSendLaunchLogs = false;
    }
  }

  @Override public void onActivityStopped(Activity activity) {
    if (shouldSendLaunchLogs) {
      // send logs
      shouldSendLaunchLogs = false;
    }
  }

  @Override public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
    // no op
  }

  @Override public void onActivityDestroyed(Activity activity) {
    // no op
  }

  @Override public void onTrimMemory(int level) {
    if (level == ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN) {
      shouldSendLaunchLogs = true;
    }
  }

  @Override public void onConfigurationChanged(Configuration newConfig) {
    // no op
  }

  @Override public void onLowMemory() {
    // no op
  }
```

### まとめ
今回はアプリ起動を判定するために`Application.ActivityLifecycleCallbacks`と`ComponentCallbacks2`を使いました。
他の方法として、コールバックでActivityの数をカウントするなどの方法もあると思いますが、単純なロジックで実現できたためもし必要になれば使ってみてくださいm(_ _)m
Selenium Builder がローカル実行出来なくて暫定対応

Firefox 44.0.2
Selenium Builder 3.0.5

操作を記録して、ローカルで実行してみようとしたら、メニューのrunのところにrun test locallyがない。

https://github.com/SeleniumBuilder/selenium-builder/issues/6

Firefoxの仕様変更の影響を受けて、現状ではローカルで実行する機能を外してるらしい。

どうしても今すぐローカル実行したい場合は、
Firefoxのabout:configを開いて、xpinstall.signatures.requiredをfalseにしてから、
上記issueページ内の古いバージョンのxpiをインストールすると、ローカル実行出来る。

Firefox46ではこの設定は廃止するらしいので、その前にローカル実行復活して欲しいです。
phpMyAdminしか使えない環境で、Latin1で保存されているMySQLのdumpデータをUTF8に変換する方法

Movable Type ユーザーさんの環境移行のサポートを行った時のメモ。

MySQLのデータがLatin1で保存されていた場合SSHやmysqldumpコマンドが使える環境であれば、dumpデータをUTF8に変換するTipsはいくつか存在します。

例:http://qiita.com/tukiyo3/items/77c75f355e71d52e65f7

しかし諸事情でssh接続できず、phpMyAdminしか使えない環境の場合、上記のようなTIPSが使えません。

このような状況下で、phpMyAdmin経由でエクスポートしたSQLデータを、ローカル環境でUTF8に変換した際のメモです。

## Latin1対応のエディタを利用する

phpMyAdminはデータのエクスポート時に、UTF8でdumpデータを生成するようです。

しかし、MySQLの照合順序(collation)がLatin1に設定されているDBの場合、phpMyAdminはLatin1で保存されたデータをわざわざUTF8でdumpするため、文字化けしてしまいます。

これを以下の手順で解消しました。

1. Latin1での読み込み・保存が可能なエディタを用意する
2. phpMyAdminから出力されたSQLデータをエディタで読み込み
3. 2で読み込んだデータをLatin1形式で保存
4. 3で保存したSQLデータを、UTF8形式で再読み込み
5. CHARSETの指定がLatin1になっている箇所をUTF8に変更
6. 4,5の操作を行ったものをUTF8形式で保存
7. 6で保存したSQLデータをMySQLにインポート


先述の通り、phpMyAdminはLatin1で保存されていたDBデータをUTF8で出力しているため、これを1-3の手順でLatin1に変更し直します。
その後、改めてUTF8形式のデータとして保存し直します。

CHARSETをUTF8に指定することで、インポート時に齟齬が起きないようにします。


## 作業を行った環境

以下の環境で作業を行いました。

- Windows 8.1 + さくらエディタ

Macでも、Latin1をあつかえるエディタなら対応可能と思われますが未検証。
svgの小数点以下桁数による差がどれだけあるか

小数点以下の桁数を7で書き出したsvgと、svgoで桁数を落としたものとどれだけ違うか比べてみた。
文字なら1桁でも大丈夫かな。。。。

[デモ](http://jsdo.it/ksk1015/yXf1)
アノテーションについてまとめてみた

## アノテーションとは
@Override、@NonNull、@Nullable
よく使うアノテーションだけどそもそも何者？

オラクル曰くこう

```
Annotations, a form of metadata, provide data about 
a program that is not part of the program itself. 
Annotations have no direct effect on the operation of the code they annotate.
```

つまりこんな感じ。

 * メタデータ(付属情報である)
 * プログラム自体ではない
 * コードの処理に直接影響は与えない

## アノテーションを定義する
一番簡単な方法はこう

```
定義して
public @interface SampleAnnotation {}

使う！
@SampleAnnotation

```

## アノテーションには引数も渡せる
アノテーションの定義に引数を渡す場合はこう

```
引数(argStrとargInt)を定義して
public @interface SampleAnnotation {
    String argStr();
    int argInt() default 0;
}

渡す！
@SampleAnnotation (
    argStr = "sample",
    int = 1
)
```

## コンパイル時にアノテーションを処理する
引数を渡せるって？ 引数渡してだから何？
そんなときにAnnotationProcessorというものがあります。

AnnotationProcessorを使うことでコンパイル時にアノテーションを処理できます。
例えば、ButterKnifeを例にアノテーションの引数に渡したものがどう処理されているかを
見ていくとわかりやすいです。

詳しくは下記のサイトがわかりやすく説明していますのでここではざっくりと説明します。
http://qiita.com/kgmyshin/items/7713a07da86fafec056e
### ButterKnife
ButterKnife自体は下記のようにViewをいちいちfindViewByIdで参照しなくても、
変数にアノテーション付与することで簡単にViewを生成できるライブラリです。

```
@InjectView(R.id.sample)
View mSampleView;

@Override
public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.simple_activity);
  ButterKnife.inject(this);
}
```

### なぜ、findViewByIdはいらないのか？
アノテーションにResouceIdを指定することで、コンパイル時にfindViewByIdしてmSampleViewに代入するための処理をButterKnife.inject()内に用意しています。

```
余談
最終的にはfindViewByIdをinject内で行うので記述は楽になりますが、
処理が軽くなることはないような気がします。
```

### 具体的にどうやって？
ButterKnife.inject(this)を呼ぶことで最終的に「対象Activity$$ViewInjector」という
クラスのinjectメソッドを呼び出すようになっています。

ButterKnifeでは、この「対象Activity$$ViewInjector」をコンパイル時に生成するために主題のAnnotationProcessorを使っています。

### AnnotationProcessorとは
ProcessorまたはAbstractProcessorクラスを継承することでOverrideしたprocess()というメソッドがコンパイル時に動きます。
このような仕組みをAnnotationProcessorというようです。

そして、ButterKnifeの場合、ButterKnifeProcessorというクラスがそれにあたります。
このButterKnifeProcessorのprocess()内でinjectメソッドを持つ「対象Activity$$ViewInjector」というクラスファイルを生成する処理を行っています。


## まとめ
・アノテーションはメタデータ
・引数が渡せる
・AnnotationProcessorでコンパイル時に処理を行える
[Swift]ColorManagerで色を一括管理

#開発環境
Xcode 7.2.1

#作成方法
まず、新たなSwiftファイルをつくります。
<img width="999" alt="AppDelegate_swift.png" src="https://qiita-image-store.s3.amazonaws.com/0/75302/cd25dda8-01ce-7b37-754d-f25bd7d33b66.png">

作成したswiftにColorManager.swiftという名前を付けてあげます
<img width="737" alt="スクリーンショット_2016_02_22_17_52.png" src="https://qiita-image-store.s3.amazonaws.com/0/75302/767d75a4-ee93-b557-db69-8e701309bbec.png">


次に今つくったSwiftファイルにUIKitをインポートし、ColorManagerというクラスを作成します。
そして、それぞれ戻り値がUIColorという関数をそれぞれつくります。
以下の感じ!!

```swift:
import UIKit

class ColorManager {
    func mainColor() -> UIColor {
        return UIColor(red: 30/255, green: 120/255, blue: 45/255, alpha: 1)
    }
}
```

ViewControllerなどで使いたいときは、こんな感じ

```
label.textColor = ColorManager().mainColor()
```
Google Web Fonts を使ってみた

Google Web Fonts を使ったので、忘れないように自分用メモ。

※使用するフォントは、商用・個人利用が無料でできるのかを、必ず事前にご確認ください！（商用では使用禁止のものや、有料のものもあります。）

　

##簡単に使う
（1）Google Fonts（https://www.google.com/fonts/）から
使いたいフォントを選ぶ。
［例］Lobster
https://www.google.com/fonts/specimen/Lobster

（2）HTML の head内に以下のような記述を追加する。

```html
<link href='https://fonts.googleapis.com/css?family=Lobster' rel='stylesheet' type='text/css'>
```

（3）CSSで設定する

```css:
.ttl {
font-family: 'Lobster';
}
```

（完成！）

　

##フォントのデータをアップロードする
「別サーバからリンクを設定できない場合」は、
フォントのデータをアップロードすることで Google Web Fonts を使用できます。

（1）Google Fonts（https://www.google.com/fonts/）から
使いたいフォントを選ぶ。

（2）データをダウンロードする
フォント詳細ページの右上にある「↓」ボタンをクリックして、ダウンロード。

（3）ダウンロードした「Lobster.zip」を解凍
・Lobster-Regular.ttf
・OFL.txt

※「.ttf」はIEで対応していないため、IE用の形式を用意する。
［参照］Can I use... Support tables for HTML5, CSS3, etc http://caniuse.com/#search=ttf


（4）IE だけに対応しているフォント形式「.eot」か、各種ブラウザに幅広く対応している「.woff」に変換する。

［参照］Online font converter
http://www.fontconverter.org/


（5）問題がないエリアにアップロードする
今回は一番上の階層に「fonts」フォルダを作成し、格納しました。

（6）CSSで設定する　［例］IE9以降に対応するように記述

```css:
/* ----- Google Fonts ----- */
@font-face { /* IE用 */
	font-family: 'Lobster';
	src: url('../fonts/Lobster-Regular.eot');
}
@font-face { /* その他ブラウザ用 */
	url('../fonts/Lobster-Regular.woff') format('woff'),
	url('../fonts/Lobster-Regular.ttf') format('truetype'),
}
```

※IE 9 でうまく動作しなかったので、こんなカンジに…。
（「,」区切りだと IE でうまく読み込めないらしいので、途中で分割した。）


　
##（おまけ）エフェクト　※IE 非対応。
Getting Started  |  Google Fonts  |  Google Developers
https://developers.google.com/fonts/docs/getting_started#Effects

カゲを付けたり、キャンバスに描いたようなニュアンスのある文字や、炎がぼうぼう燃えているアニメーション付き文字にもできるみたいです。
案件では使えないけど、遊びで使うには便利！
※Chrome, Firefox, Opera, Safari 対応。（一部、Chrome, Safari のみのものも有）
iOSのChromeでキーボードが立ち上がるとDOMが圧迫される


モバイルのキーボードの高さ分windowサイズも圧迫される問題。
iOSのchromeで起きた現象。safariだとキーボードの高さは無視されてた。

これを放置しておくと、高さ可変のコンコンテンツがキーボード入力の度に小さくなってしまって鬱陶しくなる。ので、下記のようにwindowのサイズを戻してあげる必要がある。

```javascript
var window_default_height = $(window).outerHeight();
$(window).on('resize', function () {
  $(window).css('height', window_default_height + 'px');
});
```
ただこれだと、普通にブラウザのサイズを変えたときもwindowがページロード時のサイズに戻ってしまうので、あまり良い解決策ではないと思う。
もっと良いやり方がありそう。
フレッツ・スポット（Web 認証方式、西日本）で iPhone 6 から Wi2_club に簡単にローミング接続する方法

1. Safari にログイン ID とパスワードを記憶させます。
2. 設定 → Wi-Fi → Wi2_club とタップして（もしくは Wifi をオンにして）認証画面を表示します。
3. ローミングのタブをタップします。
4. フレッツ・スポットをタップします。
5. *パスワード* を入力する部分をタップします。
6. キーボードの上側に表示されるパスワードをタップします。

# なぜこの方法か
* フレッツ光と光電話を契約したら無料で6ヶ月使え、最初にもらったポイントでさらに1年間無料で、このサービスを使えることを知りました。無料なのでまずは使ってみることにしました。
* 公式アプリ「フレッツ・スポット」カンタン接続アプリでは、2016/02/16現在iPhone 6からWi2_clubに最初に接続するときにまったくつながりませんでした。ある[レビュー](https://searchman.com/ios/app/jp/633811296/ja/%E8%A5%BF%E6%97%A5%E6%9C%AC%E9%9B%BB%E4%BF%A1%E9%9B%BB%E8%A9%B1%E6%A0%AA%E5%BC%8F%E4%BC%9A%E7%A4%BE-nippon-telegraph-and-telephone-west-corporation/%E3%80%8C%E3%83%95%E3%83%AC%E3%83%83%E3%83%84%E3%83%BB%E3%82%B9%E3%83%9D%E3%83%83%E3%83%88%E3%80%8D%E3%82%AB%E3%83%B3%E3%82%BF%E3%83%B3%E6%8E%A5%E7%B6%9A%E3%82%A2%E3%83%97%E3%83%AA/)でもアプリに対して厳しいコメントが付いていました。そこでこのアプリをWi2_clubに最初に接続するときに使わないことにしました。
* 単語登録で、たとえば、「あ」から「ログインID」と「パスワード」を変換にする方法も考えました。しかし、パスワードを入力する部分にカーソルを合わせると英語キーボードしか表示されないので漢字変換で単語を入力することができませんでした。

# 感想
* この方法でも、端末認証に比べると面倒に感じます。もっといい方法を見つけたらこの記事を更新したいと思います。
* Qiita をはじめたばかりなのですが、このような投稿をしてもいいのでしょうか。
Python2.6で制御構造を扱う際の注意

Python 2.6を使っている人へ。
2.6だと以下のコードはエラーになる。

```py
for i in range(10):
  if(i%2 == 0):
      print("{} is even".format(i))
  else:
      print("{} is odd".format(i))
print("done")
```

2.6は上記の書き方ではだめみたい。
http://stackoverflow.com/questions/10054122/valueerror-zero-length-field-name-in-format-python

```py
for i in range(10):
  if(i%2 == 0):
      print("{0} is even\n".format(i))
  else:
      print("{0} is odd\n".format(i))
print("done")
```

とすれば動く。

2.7か3系を使うことをおすすめします。
Macに繋いだiPhoneから、Mac上の開発サーバにHTTP接続する方法

iPhoneアプリをローカルで開発していて、Mac上で動かしている開発サーバにhttpで接続したい時がある。
その時のやり方を覚え書き。

# 手順

ソースコードの中にIP指定で書いてしまうと不便なのでコンピュータ名でアクセスするようにする
まずiPhoneからアクセスするMacの~~コンピュータ名~~ローカルホスト名を取得する

Macの「システム環境設定」→「共有」→「コンピュータ名」の下の「編集」

![01.png](https://qiita-image-store.s3.amazonaws.com/0/4990/5c653786-9e7f-e41a-4012-6f664afdd7de.png)

この時、デフォルトで設定されている~~コンピュータ名~~ローカルホスト名は

> xxxxxx-no-MacBook-Air.local

というように"-no-MacBook-Air"部分が付いているのでこれを編集で削除する
(この部分があるとInfo.plistでATSを無効にする設定が効かない模様)


次に、開発しているiPhoneアプリのInfo.plistに以下の設定をする

```xml:Info.plist
	<key>NSAppTransportSecurity</key>
	<dict>
		<key>NSExceptionDomains</key>
		<dict>
			<key>xxxxxxxx.local</key>
			<dict>
				<key>NSIncludesSubdomains</key>
				<true/>
				<key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
				<true/>
			</dict>
		</dict>
	</dict>
```

"xxxxxxxx.local"部分は設定した~~コンピュータ名~~ローカルホスト名を記述
(NSIncludesSubdomainsは不要かもね)

~~コンピュータ名~~ローカルホスト名に"-no-MacBook-Air"部分があるとATSに引っかかり、以下の様なエラーがログに出力されるので注意

> App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app's Info.plist file.

　  
---- 

ちなみにSierraから(？)なのか、「共有」のサービスのどれか(例えばファイル共有)にチェックが入っていないとこのローカルホスト名でLAN内からアクセスできない模様  
しばらくハマった・・・
error: Couldn't resolve host 'bitbucket.org' while accessing...解決策

https://bitbucket.org/site/master/issue/6904/error-couldnt-resolve-host-bitbucketorg
記事にある通りのエラーが起きた。

pull出来なくなった。
Hosterというサービスを使ってからpullができなくなった。
http://ayumu-homes.hateblo.jp/entry/2015/03/02/032705
が参考になった。

.git/configの中身のurlをipに変更したことで解決。
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
[remote "origin"]
url = git@131.103.20.168:test/testapp.git
fetch = +refs/heads/:refs/remotes/origin/
[branch "master"]
remote = origin
merge = refs/heads/master

上記にした後に、pullしたところうまく出来た。

他に以下の参考にした。
http://mamansoft.net/blog/vagrant%E3%81%A7%E4%BD%9C%E6%88%90%E3%81%97%E3%81%9Fvm%E3%81%A7%E5%90%8D%E5%89%8D%E8%A7%A3%E6%B1%BA%E3%81%97%E3%81%AA%E3%81%84/
http://stackoverflow.com/questions/13195814/trying-to-git-pull-with-error-cannot-open-git-fetch-head-permission-denied
http://nwpct1.hatenablog.com/entry/2013/10/27/025636
http://131.103.20.167/
リモートリポジトリとカレントの差異を取得

現在の変更をきちんとpushしたかどうかを確認する方法

・基本的にgit status コマンドで確認可能

console$ git status
On branch master
Your branch is ahead of 'origin/master' by 3 commits.
(use "git push" to publish your local commits)

push先のリポジトリよりも3コミット進んでいるのが確認できる。

その後、Pushを行う。
$ git push origin master

console$ git status
On branch master
nothing to commit, working directory clean

push先のリポジトリとローカルのリポジトリの状態が同じ状態に。
再度pushした場合は、Everything up-to-dateと出力される。
特定のリモートからブランチを指定してcloneする方法    

通常
$ git clone https://リポジトリのアドレス
とした場合、masterブランチがローカルに作られます。

特定のリモートブランチを指定しクローンさせたい場合次のようにします。
$ git clone -b ブランチ名 https://リポジトリのアドレス
インスタンス内変数の辞書化ー＞シリアライズ・デシリアライズ

**オブジェクトのシリアライズ・デシリアライズ関連メモ**
pythonのオブジェクト指向関連の表現が違ったらすんません。


なんと、クラスインスタンス（この場合agent）は
```py
dic = agent.__dict__
```
で、agent（インスタンス）の内部変数と値が辞書化して出力される。
戻すときは、
```py
agent.__dict__.update(dic)
```

下記のagent2クラスのように作れば
コンストラクターに辞書を食わせられる。

辞書化すればjsonシリアライズ、デシリアライズは容易。
クラス・オブジェクトごとシリアライズする際は、
jsonシリアライズでは出来ない。
pickleでやる。

python3でも同様にできた。
（文字コードの扱いには注意がいる）

備考
なお、シングルトン的にやろうとすると、インスタンス化しないからだと思うけど
引数にselfがあると引数の数でエラーになる。

```py
import json

class agent():
    def __init__(self,idd):

        self.idd = idd
        self.aaa = idd*2
        self.bbb = idd*3
        self.str = u"agent"

    def dicLoads(self,d):
        self.__dict__.update(d)
        
    def search():
        print("search")

    def work():
        print("work")

class agent2(object):
    def __init__(self,j):      
        self.__dict__.update(j)
```
```py
from Agent import agent,agent2

AGENTS = [agent(i) for i in range(0,10)]

print(AGENTS[1].__dict__)
print(AGENTS[2].__dict__)

j = {'idd': 20, 'aaa': 40, 'bbb': 60, 'str': u'env'}

AGENTS[3].dicLoads(j)
Adict3 = AGENTS[3].__dict__
print(Adict3)

AGENTS[2].dicLoads(Adict3)
print(AGENTS[2].__dict__)

p = agent2(j)
print(p.__dict__)
```
結果
{'idd': 1, 'aaa': 2, 'bbb': 3, 'str': u'agent'}
{'idd': 2, 'aaa': 4, 'bbb': 6, 'str': u'agent'}
{'aaa': 40, 'bbb': 60, 'str': u'env', 'idd': 20}
{'aaa': 40, 'bbb': 60, 'str': u'env', 'idd': 20}
{'idd': 20, 'aaa': 40, 'bbb': 60, 'str': u'env'}
ElixirからGitHubのRestAPIを叩いてissue listをゲットしよう！

GitHubのREST APIを叩いて、issue一覧を見てみたいなー、と思って、Elixirベースで何かないかな、と探していたところ見つけました。


## [tentacat](https://github.com/edgurgel/tentacat)


Simple Elixir wrapper for the GitHub API

## 0. tentacatを使ってみているリポジトリ

https://github.com/letusfly85/github_stalking

## 1. 設定

### 1-1. mixでアプリケーションを作成します。

```bash
mix new github_stalking
```

### 1-2. dependencyを追加します。

```mix.ex
defmodule GithubStalking.Mixfile do
  use Mix.Project

  def project do
    [app: :github_stalking,
     version: "0.0.1",
     elixir: "~> 1.2",
     build_embedded: Mix.env == :prod,
     start_permanent: Mix.env == :prod,
     escript: escript,
     deps: deps]
  end

  def escript do
    [main_module: GithubStalking]
  end

  # Configuration for the OTP application
  #
  # Type "mix help compile.app" for more information
  def application do
    [applications: applications(Mix.env)]
  end

  defp applications(_all), do: [:logger, :tentacat]

  # Dependencies can be Hex packages:
  defp deps do
    [{:mix_test_watch, "~> 0.2", only: :dev},
     {:tentacat, "~> 0.2"},
     {:riak, "~> 1.0"},
     {:poison, "~> 2.0"},
     {:factory_girl_elixir, "~> 0.1.1"}]
  end
end
```

### 1-3. `mix deps.get`を実行します。

## 2. interactiveに実行して標準出力してみます。

### 2-1. `iex -S mix`を実行します。

### 2-2. issue listをゲットします。

clientを生成します。

```ex
iex(1)> client = Tentacat.Client.new()
%Tentacat.Client{auth: nil, endpoint: "https://api.github.com/"}
```

issueを取得するファンクションを実行します。

```ex
iex(2)> Tentacat.Issues.filter "letusfly85", "github_stalking", %{state: "open"} , client
```

引数は、organization, repository name, issue status, Tentacat.Clientの４つです。シンプルですね！

標準出力は以下のとおりです。

```ex
[%{"assignee" => %{"avatar_url" => "https://avatars.githubusercontent.com/u/1466545?v=3",
     "events_url" => "https://api.github.com/users/letusfly85/events{/privacy}",
     "followers_url" => "https://api.github.com/users/letusfly85/followers",
     "following_url" => "https://api.github.com/users/letusfly85/following{/other_user}",
     "gists_url" => "https://api.github.com/users/letusfly85/gists{/gist_id}",
     "gravatar_id" => "", "html_url" => "https://github.com/letusfly85",
     "id" => 1466545, "login" => "letusfly85",
     "organizations_url" => "https://api.github.com/users/letusfly85/orgs",
     "received_events_url" => "https://api.github.com/users/letusfly85/received_events",
     "repos_url" => "https://api.github.com/users/letusfly85/repos",
     "site_admin" => false,
     "starred_url" => "https://api.github.com/users/letusfly85/starred{/owner}{/repo}",
     "subscriptions_url" => "https://api.github.com/users/letusfly85/subscriptions",
     "type" => "User", "url" => "https://api.github.com/users/letusfly85"},
   "body" => "", "closed_at" => nil, "comments" => 0,
```

`List[Map]`のような結果セットが取得できることが確認できました。

## 3. 所感

内部実装としては、[httpoison](https://github.com/edgurgel/httpoison)を呼んでいる、感じみたいですね。不足機能とかがあったら、PRしてみるのもいいかもしれません。

---

本日はここまでとなります。
.gitconfigに設定する内容 .gitconfigメモ用

# 目的
どの環境になってもすぐに.gitconfigの設定が出来るようにメモとして残す

# .gitconfigの中身
```
[user]
    name = !gitユーザー名!
    email = !git用メールアドレス!
[alias]
    graph = log --graph --date='format:%Y-%m-%d %T' --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cd) %C(bold blue)<%an>%Creset' --abbrev-commit
```
Swift中结构体(Struct)和类(Class)的使用、区别


-
###结构体是值拷贝类型，两个对象的值不会相互影响。而类是引用类型，只有一个值，两个对象的指针都指向那一个值。
-

```Swift
//  Created by Kxx.xxQ 一生相伴 on 16/2/22.
//  Copyright © 2016年 Asahi_Kuang. All rights reserved.
//

import Foundation
/*结构体和类的使用、区别*/
struct student {
    var name: String
    var sex : String
    var age : Int
} // 结构体

class studentClass {
    var name: String?
    var sex : String?
    var age : Int?
} // 类

// 结构体是值拷贝类型。
var kxx = student(name: "邝清旭", sex: "男", age: 24)
var xxq = student(name: "夏恋秋", sex: "女", age: 22)
var kxxxxq = student(name: "kxxxxq", sex: "unknown", age: 10000)
// 打印初始值
print(kxx.name," ",xxq.name)
// 赋值后打印
kxx = kxxxxq
print(kxx.name," ",xxq.name,"\n\n")


// 类是引用类型。内存中只有一个值，只是对象分别有自己的指针指向这个值。
var 邝小旭 = studentClass()
邝小旭.name = "邝小旭"
var 夏小秋 = studentClass()
夏小秋.name = "夏小秋"
var 邝小旭2夏小秋 = studentClass()
邝小旭2夏小秋.name = "KXX.XXQ"
// 打印初始值
print(邝小旭.name!," ",夏小秋.name!)

// 赋值后打印
夏小秋 = 邝小旭
夏小秋.name = 邝小旭2夏小秋.name
print(邝小旭 !== 夏小秋)  // 判断两个对象是否指向同一个内存区域
print(邝小旭.name!," ",夏小秋.name!)

//输出
/*
	邝清旭   夏恋秋
 	kxxxxq   夏恋秋 


	邝小旭   夏小秋
	false
	KXX.XXQ   KXX.XXQ
*/

```
Macでbin+cueをマウントする（El Capitan 10.11.3）

bin+cueをマウントできるようにisoに変換するメモ。

##結論
hoge.binを、hoge.bin.isoとリネームする。以上。
これでマウントできました。


##やったこと
直接マウントすることはできないだろうと考え、bin+cueをisoに変換しようと思いました。
Macでisoに変換するツールを調査したら、bchunkというツールがありました。

インストール

```shell-session
~ brew install bchunk
```

変換

```shell-session
~ cd dir
~ bchunk ./hoge.bin ./hoge.cue hoge
```

結果
hoge01.ughが生成された....
isoに変換されてない....

ダメ元で、hoge01.ugh.isoにリネームしてみる。
マウントできた！

hoge.binをhoge.bin.isoにリネームしてみる...
マウントできた！！
PHP-FPMで遅い処理を特定する

```
;slowlog = /var/log/php5/slow.log
;request_slowlog_timeout = 10s
```

コンフィグにこのような記述があると思うのでコメントアウトを外して有効化する

参考URL
https://easyengine.io/tutorials/php/fpm-slow-log/
504 Gateway Time-out が出た際は Elastic Load Balancing の設定にも注意しよう


## 前書き

nginx と php の設定をすれば速攻対応できるはずだった `504 Gateway Time-out` に悩まされたということと、
毎回設定の仕方をググるのも面倒なので nginx と php の設定についても備忘録を残します。


## nginx と php の設定

必要な設定は以下の3ファイルになります。出力されたエラーログに応じて設定します。

※ 数値は任意の値です。今回は全て 180 ( 3 分 ) としています。

## nginx.conf

### エラーログ

```nginxのエラーログ
upstream timed out (110: Connection timed out) while reading response header from upstream
```

### 設定

|ディレイクティブ|デフォルト|コンテキスト|意味|
|:---|:---|:---|:---|
| `fastcgi_read_timeout` | 60s | `http` `server` `location` | FastCGIプロセスへデータを送信するための待ち時間 |

コンテキストである `http` `server` `location` ディレイクティブのブロック内に `fastcgi_read_timeout` ディレイクティブを適用します。


```file:/etc/nginx/nginx.conf
fastcgi_read_timeout 180
```

## php.ini

### エラーログ

```phpのエラーログ
Fatal error: Maximum execution time of 60 seconds exceeded
```

### 設定

|項目|デフォルト|意味|
|:---|:---|:---|
| `max_execution_time` | 0 | PHP スクリプトの最大実行時間 |


```file:/etc/php5/fpm/php.ini
max_execution_time = 180
```
 
## php-fpm.conf

### エラーログ

```nginxのエラーログ
recv() failed (104: Connection reset by peer) while reading response header from upstream
```

### 設定

|項目|デフォルト|意味|
|:---|:---|:---|
| `request_terminate_timeout` | 0 | リクエストを終了するまでの待ち時間 |

```file:/etc/php5/fpm/php-fpm.conf
request_terminate_timeout 180
```

### 再読み込み

```
$ sudo service php-fpm reload
$ sudo service nginx reload
```

これで `504 Gateway Time-out` を回避！出来ない…。  
Elastic Load Balancing ( 以下、 ELB ) に最近繋いだことを思い出し、下記にたどり着きました。

## ELB の設定

[ロードバランサーに対するアイドル接続のタイムアウトの設定 - Elastic Load Balancing](http://docs.aws.amazon.com/ja_jp/ElasticLoadBalancing/latest/DeveloperGuide/config-idle-timeout.html "ロードバランサーに対するアイドル接続のタイムアウトの設定 - Elastic Load Balancing")
> デフォルトでは、Elastic Load Balancing は両方の接続についてアイドルタイムアウトを 60 秒に設定しています。

とのことで、

> 1. https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)にある Amazon EC2 コンソールを開きます。
> 1. ナビゲーションペインの [LOAD BALANCING] で [ Load Balancers] をクリックします。

> 1. ロードバランサーを選択します。
> 1. 下部のペインで、[Description] タブを選択します。
> 1. [Connection Settings] を見つけ、[(Edit)] をクリックします。
> 1. [Configure Connection Settings] ダイアログボックスで、[Idle Timeout] の値を入力します。アイドルタイムアウトの範囲は 1 ～ 3,600 秒です。
> 1. [Save] をクリックします。

に書いてある通りにELBのアイドルタイムアウトを設定し、やっと `504 Gateway Time-out` を回避できました！

## 参考文献

* [ロードバランサーに対するアイドル接続のタイムアウトの設定 - Elastic Load Balancing](http://docs.aws.amazon.com/ja_jp/ElasticLoadBalancing/latest/DeveloperGuide/config-idle-timeout.html "ロードバランサーに対するアイドル接続のタイムアウトの設定 - Elastic Load Balancing")
Xcodeのコンソールに"_BSMachError:"が出たらチェックすべきこと

Xcode 7.2.1での話です。
ある日突然デバック中のXcodeのコンソールに以下のログが出力。

```
_BSMachError: (os/kern) invalid capability (20)
_BSMachError: (os/kern) invalid name (15)
```

実害はないんですが気持ち悪いんでぐぐってみたら以下がヒット。

Xcode 7 で “_BSMachError: …” というエラー
http://web.konetacho.com/post/94.html


Info.plist にある Localization native development regionなんて変えた覚えはないんですが、とりあえず"en"だったものを"Japan"に変更したら出力されなくなりました。
<img width="545" alt="Screen Shot 2016-02-22 at 17.07.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/74328/35288946-7d30-10eb-c928-034e253f95f8.png">



めでたしめでたし。
画面キャプチャ方法（Mac＆Win）

色んな場面で活躍する画面キャプチャについてまとめました。画像としてキャプチャは、いわゆるスクリーンショットです。

# Macで画面キャプチャ
## **画像**としてキャプチャ(Mac)

- 画面の一部をキャプチャ　>　**⌘ + Shift + 4** の後に対象範囲をドラッグ
- 特定のウィンドウ全体をキャプチャ　>　 ⌘ + Shift + 4 の後に対象のウィンドウの上でSpaceキーを押す
- 画面全体をキャプチャ　>　⌘ + Shift + 3

上記方法でデスクトップに保存されるはずです。
ちなみに、Controlキーも一緒に押しておくとクリップボードにコピーされるので覚えておくと便利。

## **動画**としてキャプチャ(Mac)
**QuickTime Player**を使いましょう。
1. QuickTimePlayerを起動する
2. ファイル　>　新規画面収録
3. 録画ボタンを押す
4. 全体を取りたい場合はクリック、一部を取りたい場合はドラッグで範囲を選択し、「収録を開始」ボタンを押す
5. 止めたくなったら画面上部のメニューバーの停止ボタンを押す
6. ⌘ + s で保存

録音も同時にしたい場合などはこちらの記事が参考になります。
http://macwin.org/mac/movie-capture/
※ ↑の記事内のLadioCastは必須ではないです。SoundFlowerのみを使っても録音できますが、その場合、録音中にMacのスピーカーから音が出ません。

# Windowsで画面キャプチャ
## **画像**としてキャプチャ(Windows)
- 画面の一部をキャプチャ

**Snipping Tool**を使うのが便利。
Windowsにデフォルトで入っていると思います。
使い方は直感的にわかると思います。
http://windows.microsoft.com/ja-jp/windows/use-snipping-tool-capture-screen-shots#1TC=windows-8

- 画面全体をキャプチャ

PrintScreen キーを押すとクリップボードにコピーされる。（→ペイント等に貼り付けて保存しないといけないので面倒）
Altキーも一緒に押しておくとアクティブウィンドウだけコピーされる。
Windows8以降は、Windowsロゴキーを一緒に押しておくとファイルとして保存されるらしい。保存場所は「ピクチャ」フォルダ内の「スクリーンショット」フォルダ
http://windows.microsoft.com/ja-jp/windows/take-screen-capture-print-screen#take-screen-capture-print-screen=windows-8

## **動画**としてキャプチャ(Windows)
Windowsのデフォルト機能やプリインストールソフトではできないので、無料ソフトを紹介します。(Windows10からはできると聞いたような気もします)
### Bandicam
使い方も簡単で、軽いので使いやすいです。ただし、無料版だとロゴが入ります。
Bandicamの[導入はこちら](http://www.bandicam.com/jp/downloads/)
Bandicamの[使い方はこちら](http://michisugara.jp/archives/2012/bandicam.html)

### AGデスクトップレコーダー
個人的におすすめですが、使ってる人が少ない印象です。ロゴ入らないです。
AGデスクトップレコーダーの[導入はこちら]
(http://michisugara.jp/archives/2012/bandicam.html) 
AGデスクトップレコーダーの[使い方はこちら](http://aviutl.info/ag-desctoprecoder/)

その他におすすめのソフトがあったら教えてください。
おわりです。
【質問】PHP, Qdmail ライブラリのsmtpServer() のパラメータについて

Mac(OS X Yosemite 10.10.2)のローカル環境にて、Qdmail を用いて、
上記環境のMacをSMTPサーバーにして、メールを送信したいのですが、
エラーが出てしまい、送信ができません。そもそもMacをSMTPサーバーにする設定がわからないので、ご教授いただけませんでしょうか。

PHPコード
$mail->smtp(true);
    $param = array(
        'host' => 'localhost'
        , 'port' => 25
        , 'from' => 'xxx@xxx'
    );

エラーメッセージ
PHP Warning:  fsockopen(): unable to connect to localhost:25 (Connection refused)

何卒、よろしくお願いいたします。
PowerPoint や OmniGraffle で TeX の数式フォントを使う

http://www.ring.gr.jp/pub/text/CTAN/fonts/cm/ps-type1/bakoma/otf/ から cmmi10.otf や cmmi12.otf をダウンロードしてクリックします。OmniGraffle でフォントを指定したいテキストを選択して Cmd+t を押下します。

# 参考にしたリンク先
* http://robotics440sblog.seesaa.net/article/283532862.html
* https://texwiki.texjp.org/?TeX%E3%81%AE%E6%95%B0%E5%BC%8F%E3%82%92DTP%E3%82%BD%E3%83%95%E3%83%88%E3%81%AB
CloudPi(p2ptunnel server) on RasberryPi

#目的
* 外出先からLANのRaspberryPiにリモートアクセスする

#方法
* プラネックスコミュニケーションズ株式会社が提供する[CloudPi](https://www.planex.co.jp/support/download/cloudpi/sm_rp.shtml)を使用する
    * ドメインや踏台サーバを用意しなくてもいいのでランニングコストが大きくならない

#設定
* [CloudPi](http://www.amazon.co.jp/dp/B00R71QJLY/ref=cm_sw_r_tw_dp_uvQYwb0KWRNY5)を購入する

|製品仕様||||
|:-----------|:-----------|:-----------|:-----------|
| 製品名|クラウドパイ / Cloud Pi|
| 製品型番|CLOUDPI|
| パッケージ内容|サーバ利用ID（有効期間：サーバ利用開始より1カ年）
| クラウドパイ構成モジュール|サーバモジュール|対応OS:Raspbian|対応ハードウェア:Raspberry Pi B/B+|
| |クライアントモジュール|対応OS:Android(4.x推奨、2.xは制限付き)Windows(XP以降)||


* install

![image-05.png](https://qiita-image-store.s3.amazonaws.com/0/58788/e926e0df-248e-7796-9266-10ae1937a2f7.png)

```bash:インストール手順書
============================================================
 How to install the CloudPi(p2ptunnel server) on RasberryPi 

 2014/12/26
 PLANEX COMMUNICATIONS INC.
============================================================

piユーザーでログインする。

$ cd

$ mkdir cloudpi でディレクトリを作成する。

$ cd    cloudpi に移動する。

p2ptunnel_v***.tar.gzをダウンロードする。

$ tar zxvf p2ptunnel_v***.tar.gzで解凍する。

$ cd p2ptunnel

$ sudo cp cloudpi /etc/init.d/cloudpiでクラウドパイ実行ファイルをコピーする。

$ sudo chmod 755  /etc/init.d/cloudpiで実行権限を設定する。

$ nano cloudpi.confでcloudpi.confファイルを編集し、クラウドパイカードに書かれたuid(20桁)と、
  自分で決めたパスワード(4桁以上10桁以下)を書き込む

$ sudo insserv cloudpiでサービスに登録する。

$ sudo sysv-rc-conf -list | grep cloudpi
cloudpi      0:off	1:off	2:on	3:on	4:on	5:on	6:off

$ sudo service cloudpi startでサービスを開始する、または再起動してクラウドパイを開始する
```



#接続
* JuciceSSHを使用
![Screenshot_2016-02-22-15-57-58.png](https://qiita-image-store.s3.amazonaws.com/0/58788/09ca97c9-915a-4241-ace8-2809d1b62d8d.png)



![Screenshot_2016-02-22-15-59-18.png](https://qiita-image-store.s3.amazonaws.com/0/58788/af836349-8b14-454c-77b5-fe472930afb9.png)


![Screenshot_2016-02-22-16-00-17.png](https://qiita-image-store.s3.amazonaws.com/0/58788/5c576c30-5714-7776-b380-b007e83a9b44.png)
Centos7 note


# systemd
## systemd & sysvinit 
https://gist.github.com/houtianze/59b89ca71cc2029dd61d3c4bd86e6ee7

### How systemd convert sysvinit?
Start the service: `service foo start`. After this, `systemd-sysv-generator` will generate this file `/run/systemd/generator.late/foo.service`

This is censu-client's unit-file.

```ini:
# Automatically generated by systemd-sysv-generator

[Unit]
Documentation=man:systemd-sysv-generator(8)
SourcePath=/etc/rc.d/init.d/sensu-client
Description=LSB: Sensu monitoring framework client
Before=runlevel2.target runlevel3.target runlevel4.target runlevel5.target shutdown.target
After=remote-fs.target network-online.target network-online.target
Wants=network-online.target
Conflicts=shutdown.target

[Service]
Type=forking
Restart=no
TimeoutSec=5min
IgnoreSIGPIPE=no
KillMode=process
GuessMainPID=no
RemainAfterExit=yes
ExecStart=/etc/rc.d/init.d/sensu-client start
ExecStop=/etc/rc.d/init.d/sensu-client stop
```


# /etc/sysctl.d
apply
`# sysctl --system`

# vm.swappiness tuned ???
@ boot secuence, `tuned` runs after  `sysctl`. So, your vm.swappiness conf via sysctl, overwriteen by tuned.
ChromeでXPathを取る・検証する


スクレイピングなどで HTML の XPath が必要になることがありますが、Chrome で簡単に取れる・検証する方法があります。

## XPath を取る

* Chrome 上で、XPath を取りたい要素を右クリック、「検証」を選ぶ
* デベロッパーツール上で該当要素を右クリック、「Copy→Copy XPath」を選ぶ

これでクリップボードに XPath が入ります。

## XPath を検証する

* Chrome で対象のサイトを開く
* デベロッパーツールからコンソールを開く
* `$x('//div/p/span[@class="hoge"]')` などとして XPath を指定し、実行する

これで XPath に対応する要素が取れます。

2018/12/25 追記: Chrome 71 で動作確認しました。
FuelPHP DBへのアクセスの方法について。ORMとDBクラスの違いとか。

FuelPHPやってると、SQLどうやって書こうかなっって・・・毎回迷う。
参考サイトをいつもぐるぐる回遊しつつ公式を見ているので、それらをまとめました。


#DBクラス
http://fuelphp.com/docs/classes/database/db.html
>DB クラスは、データベースクエリの生成と実行および結果の取得を行います。

DB::query()　で、直接SQL文を実行できるほか、
DB::select()などのクエリビルダも用意されてる。


#CRUD
http://fuelphp.com/docs/packages/orm/crud.html
>Model定義にもとづき、作成、読み取り、更新、削除を行う。

Modelクラスを用意するので、MVCの形に一歩近づく。



#ORM
http://fuelphp.com/docs/packages/orm/intro.html
>ORMはオブジェクト 関係マッピングの略です。 
これは、2つのことを行います: オブジェクトにデータベースのテーブルの行をマップし、 それはあなたがそれらのオブジェクト間の関係を確立することができます。
それは Active Record パターンに従いますが、 他のシステムに影響も受けます。

制約やリレーションの定義も持てる。

*Orm/Modelを拡張しているのであって、Model_Crudではないことに注意*




#そのほか、参考サイト
http://blog.a-way-out.net/blog/2014/07/09/fuelphp-database/
http://runble1.com/fuelphp-model-dbaccess/


#結論
どれを選ぶか・・・私の場合は、SQLインジェクションとか、オーバーヘッドとかはともかく、
ソースの可読性が大事に思う。
開発チーム内でORMを使おう、と決まったら、できるだけORMを使おう。。。


どうしても複雑なSQL投げたかったり
欲しい結果が取れなかったりする（謎）ときに
DBクラスのクエリビルダを使うようにしています。
test kitchen でテストしたあと、destroyするオプション

# 概要

```
kitchen test --destroy=always 
```

これで、自動で、destroyまでしてくれるオプションがあるらしい。

その他いろいろ、下の記事に書いてある。

[[和訳] Test Kitchen: 開発のフィードバック工場 #getchef - クリエーションライン株式会社](http://www.creationline.com/lab/11557)

手元の環境でもいろいろCI的にチェックしているので、おもしろそうだった。

# ためしてみたいこと

concurrency オプションも紹介されていたが、
これって、
vagrant cachier
とかつかっているときに、パッケージのディレクトリ共有するとおもうのだが
大丈夫かな？？？
centosとubuntu ならいけるかもしれない。
あとは、実行するインスタンスをわければよいのかな。
CygwinでGit‐Flowを行う際の手順

**CygwinでGit‐Flowを行う際の手順、環境構築**

・ git flow の準備
・ Cygwin インストール
　　http://qiita.com/budgerigar/private/0c54970efad831f342f8
・ git 本体のインストール選択
　git-flow のインストールには `wget`と`util-Linux`が必要
　
・ cygwin を起動する。
![image](https://qiita-image-store.s3.amazonaws.com/0/98337/a69f319e-c3dd-61f2-4bf1-60730e18477b.png)
以下のコマンドをうち、git-flowをインストールする。
$ wget -q -O - --no-check-certificate https://github.com/nvie/gitflow/raw/develop/contrib/gitflow-installer.sh | bash


1, Cygwuinのgit設定

`$ git config --global user.name` "GitHubに登録されている名前"
`$ git config --global user.email` "xxxxxx@exampl.com"
`$ git config --global color.ui true`
`$ git config --global color.ui "auto"`

gitで始まるURLを使いたい場合は
$ git config --global url."http://".insteadOf git://

GitHubからリポジトリをクローンする
`$ git clonw *******.git`


git リポジトリに移動し、git flow の初期設定を行う

`$ git flow init `
すべてデフォルトの設定で行ってもよい

2, 通常の開発を行う。
`$git flow init` を行った際に作成された" `develop` "ブランチから開発を始める。

” `develop` ”ブランチをベースとして、新たな開発用ブランチを作成する。
`$ git flow feature start [MYFEATURE]`  *[ ]は任意のブランチ名を入力

`Feature`を`Github`にプッシュする
`$ git flow feature publish  [ 案件featureチケット番号 ]`

  開発をするにあたっての頻繁に使用するコマンド

・`$ git pull origin [ブランチ名]`
ローカル、リモートのブランチを最新にする
・ `$ git fetch`
リモートのブランチを最新にする。
・ `$ git checkout [ブランチ名]`
ローカルブランチを切り替える
・ `$ git commit -m "コメント欄"`
リモートにコミットする
・ `$ git push `
GitHubにコミットされた内容をプッシュする。
・ `$ git branch`
現在使用しているブランチを表示する。
・ `$ git branch -a`
リモートのブランチ、GitHubに存在するブランチをすべて表示する。
・ `$ git log -p -[X]`
`github` にコミットされた履歴を表示する。

開発が終了したら。
MYFEATUREブランチを" `develop` "ブランチにマージする
開発用ブランチを削除する

`$ git flow feature finish MYFEATURE`


3, リリースの準備を行い、リリース作業を開始する
`$ git flow relaease start RELEASE`

リリース作業をGitHubに反映させる
`$ git folw release publich RELEASE `

リリース作業を終了させる(コマンドを打つだけではGitHub上には反映されないので、必要な情報はpushする)
`$ git flow relaase finish RELEASE`

・リリース作業の内容を反映するためにmasterにpushをする
`$ git push origin master`

・tagの作成が行われているのでtags をPushする
`$ git push --tags`

・不要になったreleaseブランチを削除する
`$ git push origin :[ release name ]`
NTLM認証のProxy下でMSYS2のpacmanを利用する作業メモ


## はじめに

長らくMinGW + MSYS環境を利用していたが、いい加減MSYS2環境に移行することにした。
私の環境はProxyを通さなければ外部と通信が出来ないため、`pacman`を利用するためにひと手間かける必要があった。

## Proxy認証の種類

- 一般端末はNTLM認証のProxyを利用
- 一部サーバは認証なしのProxyを使用

一部サーバが利用している認証なしのProxyを一般端末から利用することも可能だが、こちらはフィルタの制限が厳しくsourceforge等にアクセスが出来ない。
MSYS2のパッケージはsourceforgeに置いてあるため、NTLM認証のProxyを利用する必要があった。
`pacman`はパッケージのダウンロードに`curl`や`wget`等の外部プログラムを利用できるが、NTLM認証に対応している`curl`を利用することとした。
NTLM認証の仕様には詳しくないのだが、`curl`でNTLM認証を利用するにはSSPIにも対応している必要があるようだ。

`curl`ではなく[Cntlm Authentication Proxy](http://cntlm.sourceforge.net/)を利用しても通信は可能となる。
が、こちらはバイナリ版をインストールしようとすると管理者権限が必要となるため、必要ならばまずは`curl`で`pacman`を利用出来る様にしてから自前でビルドすることをお勧めしたい。

## NTLM及びSSPI対応のcurlの準備

MSYS2標準の`curl`はNTLM認証には対応しているものの、SSPIには対応していない。

```shell-session
$ /usr/bin/curl -v -V
curl 7.47.1 (i686-pc-msys) libcurl/7.47.1 OpenSSL/1.0.2d zlib/1.2.8 libidn/1.32 libssh2/1.6.0
Protocols: dict file ftp ftps gopher http https imap imaps pop3 pop3s rtsp scp sftp smb smbs smtp smtps telnet tftp
Features: Debug IDN IPv6 Largefile GSS-API Kerberos SPNEGO NTLM NTLM_WB SSL libz TLS-SRP UnixSockets Metalink
```

私の環境ではこの`curl`を利用しようとすると403エラーを吐いてProxyから弾かれたため、別の`curl`を準備する必要がある。
こちらの環境で正しく通信できた`curl`は以下のものとなる。

- mingw32/mingw-w64-i686-curl または mingw64/mingw-w64-x86_64-curl
- Git for Windows付属のcurl

私は確認していないが、[公式サイトのダウンロードページ](https://curl.haxx.se/download.html)にて"Dirk Paehl"氏が配布しているビルド済みパッケージもSSPIに対応しているようなので恐らく利用できるはずだ。

## 通信の確認

`curl`を準備したら下記コマンドで通信が可能かどうかを確認する。

```shell-session
$ /path/to/bin/curl -U : --proxy-ntlm -x (proxy url) -L (url)
```

オプションの詳細はmanpageでご確認いただきたいが、軽く説明する。

- `-U`: Proxy認証のユーザー、パスワード。今回は空欄でよいため":"を引数に渡すだけでよいらしい。
- `--proxy-ntlm`: Proxy認証にNTLMを利用するためのスイッチをオンにする。
- `-x`: ProxyのURL。
- `-L`: リダイレクト先まで追いかけるためのスイッチをオンにする(sourceforgeはリダイレクトが多発するため)。

これで指定したURLが正しく開ければ成功となる。

## pacman.confの編集

`pacman`で`curl`を利用するには`pacman.conf`のうち`XferCommand`の項を有効にする。
デフォルトでは以下のようになっているはずである。

```
#XferCommand = /usr/bin/curl -C - -f %u > %o
#XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u
```

今回はどちらも利用せず、この直下に設定を追記する。

```
XferCommand = /path/to/bin/curl -U : --proxy-ntlm -x (proxy url) -L -C - -f %u > %o
```

（言うまでもないが、`/path/to`は自身の環境に適時置き換えてほしい）

## pacmanのDB更新

`pacman -Sy`でDBを更新し、`/var/lib/pacman/sync`以下のファイルが正しく更新されていれば正しく通信が出来ている。
ファイルサイズが0だったりやけに小さい場合は、「通信の確認」の項で正しく通信が出来ているかを確認したり、`pacman.conf`の`XferCommand`に`-v`オプションを加える等して詳細を確認してみると解決の手助けとなるはずだ。
CSSの命名に役立つ単語



##レイアウト
container: ブロックを囲むときのレイアウト
inner: 内側の要素を囲む場合はinner
media: 画像やテキストを内包する
block: 多数のコンテンツを内包するブロック
grid: グリッド
main: 主となるもの
sub: 主となるものに付随して補足するもの
header: サイト共通ヘッダー
footer: サイト共通フッター

##文章など
article: 記事、本文
caption: 画像や表につく補足文
description: 説明文章
summary: 概要。description > summary
note: 補助的な文章,何かの情報に付随する文章に
text: 普通の文が入る。なんでもない文章

##画像
logo: ロゴ
thumb: サムネイル画像
image: 画像
icon: アイコン

##大きさ
giant: とにかくでかい
huge: 巨大な
big: でかい
large: 大きい
normal: 普通
small: 小さい
little: ちっちゃな
tiny: もっと小さい

##ページ遷移
prev: 前（previousだけど長いから略語）
next: 次

##共通
local: 一部のページだけで使う
global: 全体のページで使う

##アクション
is-active: アクティブ時
is-disabled: 機能が無効になっているもの
is-show: 表示しているもの
is-hidden: 非表示にしているもの
is-visible: もともと非表示なものが、表示された
is-opened: 何かが開いている状態
is-closed: 何かが閉じている状態

##コンポーネント(部品)
button: ボタン（場合によってはbtn）
search: 検索する要素
input: 1行入力エリア
textarea: 複数行入力エリア用
nav: ナビゲーション
navbar: ナビゲーションバー
breadcrumb: パンくず
pagination: ページネーション
label: ラベル
panel: パネル

##優先(ボタンなど)
default
primary
success
info
warning
danger


##参考
BEMで命名する時に役に立ちそうな単語
http://geckotang.tumblr.com/post/69554882865/bem-words
Bootstrap
http://bootstrap3.cyberlab.info/components/glyphicons.html
xcode spritekitのエラーについて

現在spritkitでゲームを作っているのですが
登場キャラクターをシュミュレーターで動かしてみようと思ったときに、"consecutive declarations on a line must be separated by "
が最後の段に表示されランできません。

今までアプリを作っているときも
たまにこのエラーは表示されていたのですが
気づかないうちに直ってたりします。

何か解決法はあるでしょうか？


import SpriteKit

class GameScene: SKScene {
    
    struct Constants {
    static let PlayerImages = ["shrimp01","shrimp02","shrimp03","shrimp04","shrimp01","shrimp02","shrimp03","shrimp04"]
     func didMoveToView(view: SKView) {
            }
    
    /// プレイヤーを構築
    func setupPlayer() {
        // Playerのパラパラアニメーション作成に必要なSKTextureクラスの配列を定義
        var playerTexture = [SKTexture]()
        
        // パラパラアニメーションに必要な画像を読み込む
        for imageName in Constants.PlayerImages {
            let texture = SKTexture(imageNamed: imageName)
            texture.filteringMode = .Linear
            playerTexture.append(texture)
        }
        
        // キャラクターのアニメーションをパラパラ漫画のように切り替える
        let playerAnimation = SKAction.animateWithTextures(playerTexture, timePerFrame: 0.2)
        // パラパラアニメーションをループさせる
        let loopAnimation = SKAction.repeatActionForever(playerAnimation)
        
    
     func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
       /* Called when a touch begins */
        
            }
   
     func update(currentTime: CFTimeInterval) {
        /* Called before each frame is rendered */
    }
}
func setupBackgroundSea() {
    let texure = SKTexture(imageNamed: "background")
    texure.filteringMode = .Nearest


}
}
Railsでwhere.notを複数連結する場合

RailsでIS NOT NULLの条件を複数利用する場合

```ruby:
Comment.where.not(receiver_id: nil).where.not(value: nil)
```

と複数連結して書いてましたが

```ruby:
Comment.where.not(receiver_id: nil, value: nil)
```

`where.not`利用時も上記の用にまとめられるんですね。
両方実行結果は以下のSQLが発行されます。

```sql:
SELECT `comments`.* FROM `comments` WHERE (`comments`.`receiver_id` IS NOT NULL) AND (`comments`.`value` IS NOT NULL)
```
Gitを使う際のCygwinの設定

**Cygwinの環境構築**

・Cygwin のインストール
![image](https://qiita-image-store.s3.amazonaws.com/0/98337/4901466f-9181-08e4-219b-09cc320cce98.png)

・任意のサーバーを選択してinstall
![image](https://qiita-image-store.s3.amazonaws.com/0/98337/5ba0187c-930b-b6b5-7029-19e2e310ef69.png)

・[ git ]から[ Devel ]をinstallにする。
![image](https://qiita-image-store.s3.amazonaws.com/0/98337/0a52e59f-0958-f8cb-ea4c-091b8bd6c322.png)

・[ wget ]から[ web ]をinstallにする。
![image](https://qiita-image-store.s3.amazonaws.com/0/98337/9c3d9b1f-4934-9672-3eaa-84cc2279c187.png)

・[ util-linux ]からをinstallにする。
![image](https://qiita-image-store.s3.amazonaws.com/0/98337/2483b9d8-139a-721c-99b4-e5666be241e8.png)

・インストールが完了する
![image](https://qiita-image-store.s3.amazonaws.com/0/98337/d730c97e-4785-a7f9-ecdc-7aa7b4ce76b0.png)
mysql server で外部から接続できるユーザを作成する。

## 概要

今回mysqlサーバに外部から接続して動きを確認したかったので、vagrantを使用してcentosサーバの中にmysqlをインストールし、mysqlサーバを構築しようと考えた。(centosサーバを構築した状態からスタート。)

サーバ構築後、外部から接続できるユーザの発行を少し調べたのでメモに残そうと思います。


## 作業内容


まずはサーバにsshでログインし、mysqlをインストールする。

```
$ yum install mysql-server
$ vi /etc/my.cnf
```

必要最小限ですが、my.cnfを修正する。

```mysql
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

# 下記のcharacter-setを追加してやる。
character-set-server = utf8

...

```

修正が終わったらmysqlを起動する。

```bash
$ /etc/init.d/mysqld start
```


下記のような感じで外部から接続できるユーザを作る。

```mysql
> grant all privileges on [db_name].* to [user_name]@"[ip_address]" identified by '[password]' with grant option;
```



今回はすべての権限を持っていて、どこからでもアクセスできるようにしたかったので、ワイルドカードを使用して以下のようなユーザを作成した。
（権限はもちろんすべてのDBにアクセスできる）

```bash
$ mysql -u root
```

```mysql
> grant all privileges on *.* to test_user1@"%" identified by 'test1234' with grant option;
> select user,host from mysql.user;

# 上記で設定したアクセス権限でユーザが作られているか確認する。
# 今回は  test_user1 が % （どこからでも）になっているか確認できる。

+------------+-----------------------+
| user       | host                  |
+------------+-----------------------+
| test_user1 | %                     |
| root       | 127.0.0.1             |
|            | localhost             |
| root       | localhost             |
|            | localhost.localdomain |
| root       | localhost.localdomain |
+------------+-----------------------+

```


あとは、mysqlを再起動してmysqlクライアントがインストールされている端末から下記のコマンドでアクセスしてみる。

```bash
$ mysql -h [ip or address] -u [user_name] -p
```
Elixir/PhoenixアプリケーションをMac上で実行した際に"local"環境として認識させる方法

mixで生成したElixir/Phoenixアプリケーションは、デフォルトで3種類の環境に対応しています。

* :dev - デフォルト
* :test - テスト用
* :prod - 本番用

基本的にはこの3種類の設定だけでも問題無いのですが、「開発中のアプリケーションの動作を開発サーバー上で複数人で確認したい」という場合に、「ローカル環境」と「開発サーバー環境」を自動的に区別出来ると便利な場合があります。

このようなケースの場合、(Mac限定になりますが)下記のような方法で対応可能です。

# 方法

```ex
# config/config.exs
# use Mix.Configの下に下記のコードを追加
{_, osname} = :os.type()
if osname == :darwin && Mix.env == :dev do
  Mix.env(:local)
  System.put_env("MIX_ENV", Atom.to_string(Mix.env)) 
end
```

```ex
# config/local.exs
use Mix.Config

# 〜ローカル環境用の設定を記述〜
```

```ex
# mix.exs
defp deps do
  # 下記のように変更
  {:phoenix_live_reload, "~> 1.0", only: [:local, :dev]},
end
```

# 確認

Macで`iex -S mix phoenix.server`でPhoenixを起動し、環境として:localが自動設定されていることを確認してみてください。

```iex
iex> Mix.env
:local
iex> System.get_env("MIX_ENV")
"local"
```

Mac以外の環境で実行された場合は、環境として:devが自動設定されます。
Go言語でhttpサーバー1


###補足説明
####http.HandleFunc
The http.HandleFunc function maps the path pattern "/" to the function we pass as the second argument, so when the user hits http://localhost:8080/, the function will be executed

####func(w http.ResponseWriter, r *http.Request)
common way of handling HTTP requests throughout the Go standard library


```Go
package main

import (
	"log"
	"net/http"
)

func main() {
	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		w.Write([]byte(`
      <html>
        <head>
          <title>Chat</title>
        </head>
        <body>
        Let's chat!
        </body>
      </html>
    `))
	})
	if err := http.ListenAndServe(":8080", nil); err != nil {
		log.Fatal("ListenAndServe:", err)
	}
}
```

vagrantの中でFWを解除(centOS7)

```Bash
sudo systemctl stop firewalld
```

起動

```Bash
go run main.go 
```

vagrantの中でプロセスの確認(centOS7)

```Bash
ss -antp
```