OmniAICreator/Qiita-1.07M huggingface dataset:
SwiftのViewControllerで定義されているメソッドをReactNativeで実行する

# 背景
既存のSwiftで書かれているiOSアプリケーションにReactNativeを取り入れていく場合に、手っ取り早くViewController内で定義されたメソッドをjs側で呼び出したいことがある。

# 手法
SwiftとReactNativeとでイベントのやりとりをするには、ネイティブ側で編集するべきは下記の３つのファイルになる。

1. appname-Bridging-Header.h （add or edit）
2. FooViewController.m（add）
3. FooViewController.swift（edit）

Swiftだけではメソッドの受け渡しができないため、少しだけ Objective-C を取り入れる必要がある。

### 1. appname-Bridging-Header.h

Reactのヘッダーファイルを読み込んでおく必要があるため、

```
#import <React/RCTBridge.h>
#import <React/RCTEventDispatcher.h>
```

を書き足す。Bridging-Headerファイルがない場合は新たに作成する。（その場合、2.の手順を先に行うと、Xcodeが Bridging-Headerファイルを作成するかどうか尋ねてくれる。）

### 2. FooViewController.m

新たに作成すべきファイル。メソッドをやりとりしたい {ViewController名}.m で作成する。

```objc
#import "RCTBridgeModule.h"

@interface RCT_EXTERN_MODULE(ChatViewController, NSObject)

RCT_EXTERN_METHOD( testEvent:(NSString *)eventName )

@end
```

これで、ReactNative側とやりとりができるように宣言したことになる。

### 3. FooViewController.swift（edit）

さて、2. だけではまだswift側が対応できていないので、

```swift
class FooViewController: UIViewController {

    func testEvent( arg: String ) {
        // whatever
    }

}
```

という既存のコードにおける `class`, `func` それぞれに対して

```swift
@objc( FooViewController )
class FooViewController: UIViewController {

    @objc func testEvent( arg: String ) {
        // whatever
    }

}
```

と、 `@objc` を付け足す。
すると、ReactNative側では

```js
import React, { Component } from 'react';
import {
  AppRegistry,
  Platform,
  NativeModules,
  NativeAppEventEmitter,
  StyleSheet,
  Text,
  View,
  TouchableHighlight,
  TouchableNativeFeedback
} from 'react-native';

class FooComponent extends Component {

  constructor(props) {
    super(props);
  }

  onTouch() {
    NativeModules.FooViewController.testEvent('test');
  }

  render() {
    let self = this;

    let TouchableElement = TouchableHighlight;
    if (Platform.OS === 'android') {
      TouchableElement = TouchableNativeFeedback
    }

    return (
      <View>
        <TouchableElement onPress={this.onTouch.bind(self)}>
          <View>
            <Text>
              Button
            </Text>
          </View>
        </TouchableElement>
      </View>
    );
  }
}

AppRegistry.registerComponent('FooComponent', () => HelloWorld);
```

とすることで、 `Button` をタップしたときに、ViewController の testEvent が呼ばれることが確認できる。

また、 ReactNative -> Swift -> ReactNative と、もう一度 ReactNative に値か何かを返したい場合は、

```swift
import React

@objc( FooViewController )
class FooViewController: UIViewController {

    var bridge: RCTBridge!

    @objc func testEvent( arg: String ) {

        // whatever

        let eventName: String = arg
        self.bridge.eventDispatcher().sendAppEventWithName( eventName, body: "test event emitted." )

    }

}
```

```js
class FooComponent extends Component {

  constructor(props) {
    super(props);

    NativeAppEventEmitter.addListener('test', (body) => {
      console.log(body);
    });
  }

  onTouch() {
    NativeModules.FooViewController.testEvent('test');
  }

  render() {
    ...
  }
}
```

とすれば、 `console.log(body)` 経由で `test event emitted.` が吐かれていることが確認できる。
ServerQueen作ってから最初にやったこと

## バージョン確認

```
# cat /etc/redhat-release
CentOS release 6.7 (Final)
```

## yum の更新

```
# yum update
==> 一回サーバー停止と再起動
```

## ユーザー追加

```
# useradd ユーザー名
# passwd ユーザー名
# gpasswd -a ユーザー名 wheel
```

## sudoの権限を付ける
```
# vi /etc/pam.d/su

#auth       required     pam_wheel.so use_uid
↓
auth       required     pam_wheel.so use_uid


# id ユーザー名
id=500(ユーザー名) gid=500(ユーザー名) 所属グループ=500(ユーザー名),10(wheel)


# visudo
 
## Allows people in group wheel to run all commands
#%wheel        ALL=(ALL)       ALL
↓
## Allows people in group wheel to run all commands
%wheel        ALL=(ALL)       ALL
```


## SSH の設定変更

```
# vi /etc/ssh/sshd_config
 
#標準の22から変更 数字は各自設定
Port 12345
#rootでのログインを禁止
PermitRootLogin no
#ログイン許可ユーザを作業ユーザに限定
AllowUsers ユーザー名
```
/etc/rc.d/init.d/sshd restart
検索機能改善tips

# kaelaela(Yuichi Maekawa)
Qiitaのプロフィール参照
@kaelaela
work@ Cyberagent

LTなので簡潔です

---

# 検索のちょっとした改善のお話

---
# よくある改善
- 検索履歴表示
- ヒントを入れる
- 入力中に候補が絞り込まれる
- 検索結果がヒットなしのときの表示(Empty表示)
- ~して検索してみてください

---
# これら以外が今日の内容(新しいことではないです)
---
# 見てみたアプリ
- AbemaTV
- Abema FRESH!
- Ameba
- Google Play Music
- Slack
- DroidKaigi2016(PRしてもよいでしょうか :bow:)
- Kindle
- LINE などなど

---
# いつでもどこでも検索
- 常に検索バーを表示しておく
![device-2016-07-22-151632.png](https://qiita-image-store.s3.amazonaws.com/0/26883/7176ace7-5c1a-7f92-a933-517ab37b944e.png)

- 「検索結果ページ」に遷移しない(SPA)
- RecyclerViewでAdapterを交換するなど
- タブが入るとややこしい

---
# 検索ワードの**強調**

- どんな内容に**ヒット**したかユーザーは気になる
- `Html`クラスの`fromHtml`メソッドを使い**強調**
- Htmlタグで消耗したくないので**シンプル**に

---
# 即キーボード
- 検索ページに遷移したら即キーボードを出す
   - `getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);`
- 逆に検索が終わったら即キーボードを閉じる
 - `getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);`

---
# Fast Scroll
 - [RecyclerView-FastScroll](https://github.com/timusus/RecyclerView-FastScroll)
 - [RecyclerViewFastScroller](https://github.com/danoz73/RecyclerViewFastScroller)
 (個人的にこちら)
<img width="779" alt="スクリーンショット 2016-07-19 10.33.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/26883/4fae2138-a078-b0ae-8db9-f148871da85d.png">

---
# Fast Scroll
- 結果の量が増えるとすぐに移動が面倒になる
- 画面の右(左)端に小さなインジケータを表示
- 検索結果が分けれるならセクションを表示

--- 
# Tap to Top
- 一発で上にスクロール
 - `RecyclerView#scrollToPosition(0)`
- `smoothScrollToPosition()`は時間がかかる
- iOSではStatusbarのタップでリストの上に行く 

--- 
# Tap to Top
- タブがあればタップしたら上に戻す

```java:TabLayout.OnTabSelectedListener()
@Override
public void onTabReselected(TabLayout.Tab tab) {
   TapToTopTab currentTab = (TapToTopTab) pagerAdapter.getItem(position);
   currentTab.scrollToTop();
}
```
- タブがないときは...？

--- 
# Swipe to Refresh
- トレンドなど最新の情報に意味がある場合
- 同じキーワードで最新をみたいユーザーは多い
- Twitterとかみんな意味もなく引っ張る（本能）
- 公式: [Adding Swipe-to-Refresh To Your App](https://developer.android.com/training/swipe/add-swipe-interface.html)

---
# まとめ
- いつでもどこでも検索
- 検索ワードのハイライト
- 即キーボード
- Fast Scroll
- Tap to Top
- Swipe to Refresh

--- 

# thx ;-)
LogicとProcessing間でMIDI送受信

ちょっと詰まったのでメモ

※ Macのみ

# Midi設定

![Screen Shot 2016-07-17 at 17.31.52.png](https://qiita-image-store.s3.amazonaws.com/0/49526/c3c7ab5d-17ba-bec0-a9d2-b2625c09c4ee.png)

IAC Driverをonlineにする。
これが、ProcessingとLogicの橋渡しをしてくれる。

# Logic Pro X

1. 新規トラックを作成
2. 新規MIDI出力でIACDriverっぽいものを出力に設定して作成
3. 再生して、MIDIが出力されてるっぽいことを確認。

<img width="759" alt="Screen Shot 2016-07-17 at 17.37.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/49526/c09cac9f-a9f4-5f5a-ecdc-782925ee746c.png">


#processing

[MidiBus](http://www.smallbutdigital.com/themidibus.php)を使う。

consoleに　IACDriverっぽい名前のやつがあれば成功。

```java
import themidibus.*;

MidiBus myBus;

void setup() {
  MidiBus.list();
  myBus = new MidiBus(this, 0, 1);
}

void draw() {
  int channel = 0;
  int pitch = 64;
  int velocity = 127;

  // Send a Midi noteOn
  myBus.sendNoteOn(channel, pitch, velocity);
}

void noteOn(int channel, int pitch, int velocity) {
  // Receive a noteOn
  println("on: "+pitch);
}

void noteOff(int channel, int pitch, int velocity) {
  // Receive a noteOff
  println("off: "+pitch);
}

void controllerChange(int channel, int number, int value) {
  // Receive a controllerChange
}

```

Logic以外でもおんなじ感じでイケルと思う。

※ MacOS 10.11.5
※ 32bitOSだと[mmj](http://www.humatic.de/htools/mmj.htm)をインストールしないといけないかも。
Instrumentsを使ってみた


##はじめに
以前から、ふんわりと存在は知っていたけど、殆ど使ったことがなかったInstrumentsを使って遊んでみました。

##そもそもInstrumentsって？
Instrumentsでは、instrumentと呼ばれる各種の専用ツールを使って、プロセスの振る舞いをさまざまな視点からトレースできます。また、OS Xユーザインターフェイス上の一連の操作を記録しておき、 これを繰り返し再現しつつ、instrumentをいくつか使ってデータを収集することも可能です。

参考：
https://developer.apple.com/jp/documentation/InstrumentsUserGuide.pdf

##実際に使ってみた

###前準備
まず、Xcodeで何かプロジェクトを開きます。（とりあえず、InstrumentsTestというプロジェクトを作ってみました。）

![instruments_ss_1](https://dl.dropboxusercontent.com/s/r58g22vbwng80f0/instruments_ss_1.png)

次に、一度そのプロジェクトを検証したい実機またはシミュレータにビルドします。（私はシミュレータに入れました。）

###Instruments起動
Xcodeから起動するには、
"Xcode">"Open Developer Tool">"Instruments"
と辿っていって下さい。

![instruments_ss_2](https://dl.dropboxusercontent.com/s/3qnj5czk38h1ww8/instruments_ss_2.png)

Instrumentsを起動すると、以下のようなウィンドウが開きます。

![instruments_ss_3](https://dl.dropboxusercontent.com/s/9chio04iyxp7pgj/instruments_ss_3.png)

とりあえず、よく名前を目にする"Time Profiler"を使ってみることにしました。
※"Time Profiler"はシステムのCPUがどのプロセスを実行しているか、時間軸に沿って調べることができます。オーバーヘッドもあまりありません。

起動したら、以下のように先程プロジェクトをビルドした実機またはシミュレータを設定します。

![instruments_ss_4](https://dl.dropboxusercontent.com/s/01c5cdiq5e2na3p/instruments_ss_4.png)

###トレースしてみよう
みなさん、すでに気になっていると思いますが、Instrumentsウィンドウの左上にある赤い「●」。これをクリックすると、検証端末の中のアプリが起動し、トレースがはじまります。

![instruments_ss_6](https://dl.dropboxusercontent.com/s/enrsu2jtwfqtzff/instruments_ss_6.png)

ちなみに、とりあえず作ったアプリはこんな感じです。（ただラベルを表示しているだけ。）

![instruments_ss_7](https://dl.dropboxusercontent.com/s/r3fsj4pxm82zc0y/instruments_ss_7.png)

何度か起動すると、こんな感じで過去ログも見れます。

![instruments_ss_8](https://dl.dropboxusercontent.com/s/i0f12nhlynzqhpz/instruments_ss_8.png)

これだけではあまり面白くないので、他にも何かトレースしてみましょう。

###ちなみに
InstrumentsをXcodeでデバッグしつつ使いたい場合は、以下のように、
"Product">"Profile"
を実行して下さい。

![instruments_ss_5](https://dl.dropboxusercontent.com/s/1pykrw6yv9ilwyi/instruments_ss_5.png)

##新たなLibraryを追加してみよう
Instrumentsは一度に複数のデータを計測することができます。
Instrumentsウィンドウの右上にある「＋」ボタンをクリックすると、Libraryリストが表示されます。

![instruments_ss_9](https://dl.dropboxusercontent.com/s/7runyf6yapzndmp/instruments_ss_9.png)

個人的にメモリ関連が気になるので、"Allocations"と"Leaks"を追加してみました。（追加したいLibraryをダブルクリックする。）
※"Allocations"はヒープメモリの使用量を、割り当て処理(クラスによるオブジェクトの割り当てを含む)を追跡することにより測定します。また、仮想メモリの状況も、その統計情報をリージョンごとに記録します。
※"Leaks"はメモリ総使用量を計測し、メモリリークが起こっていないか確認し、クラスによるオブジェクト割り当ての統計情報を提供し、さらに、アクティブな割り当てやリークしたブロックすべてのアドレス履歴を示します。

![instruments_ss_10](https://dl.dropboxusercontent.com/s/d1qwx79kin50qb7/instruments_ss_10.png)

一度にCPUだけでなく、ヒープメモリの使用量とメモリリークの確認ができるようになりました。だいぶ便利そうです。

##せっかくだし、もっと遊んでみよう
ただラベルを表示させているだけではつまらないので、ちょっと無茶してみました。

###プロジェクトの修正
こんな感じなら、表示が面白くなるはずです。

![instruments_ss_11](https://dl.dropboxusercontent.com/s/41r4bisorkyjbeb/instruments_ss_11.png)

###実行してみた
ヒープメモリの使用量ががんがん上がっていっています。

![instruments_ss_12](https://dl.dropboxusercontent.com/s/zo1ge35hiqe2eox/instruments_ss_12.png)

##まとめ
Instrumentsは、CPUやメモリ使用量などのデータを可視化し、アプリのパフォーマンス改善に役立つツール群です。

今回はメジャーな"Time Profiler"と"Allocations"と"Leaks"しか使いませんでしたが、他にも様々なLibraryがあるので、興味のある方は調べてみて下さい。

今回の例だけではまだなんとも言えませんが、大きなプロジェクトで使ってみたらもっと恩恵に与れると感じました。
UIViewにおけるレイアウトのライフサイクル


# UIViewにおけるレイアウトのライフサイクル

以下の3つのステップにより構成される。

1. 制約の更新
2. フレームの更新
3. レンダリング

## 制約の更新

以下の条件で、Viewの制約が変更されると`UIView`クラスの`updateConstraints()`が呼び出され制約の再計算が行われる

- 制約のactiveフラグによる有効/無効化
- 制約の優先度変更
- 制約の追加・削除
- 制約が与えられたviewの階層の変更

`updateConstraints()`内で制約を更新すると、複数のレイアウトパスの中でバッジ処理が行われるため、効率良く制約を更新できる。
***制約更新の処理が重い場合などは、`updateConstraints()`内で制約を更新したほうが良い。***

### 明示的に制約の更新を行う場合

- `updateConstraintsIfNeeded()`
- `setNeedsUpdateConstraints()`

この二つのメソッドは、制約の更新は行われるがフレームの更新の実行は保証されているわけではない。`setNeedsUpdateConstraints()`は即座に`updateConstraints()`は呼ばれず、複数のレイアウトの更新があっても同じレイアウトパスで更新されるためパフォーマンスが良い。


## フレームの更新

制約が更新されると`layoutSubviews()`が呼び出され、フレームが更新される。`layoutSubviews()`が呼び出されると`updateConstraintsIfNeeded()`も呼び出され、必要であれば制約も更新される。

- ビューのフレームが変更された時(端末が回転した時など)
- サブビューの追加・削除
- `UIScrollview`クラスの`contentOffset`が変更された時

### 明示的にフレームの更新を行う場合

- `layoutIfNeeded()`
- `setNeedsLayout()`

明示的にフレームの更新を行った後、何らかの処理を実行する場合は`layoutIfNeeded()`を使用し、それ以外は`setNeedsLayout()`を使ったほうがパフォーマンスが良い。

### `layoutSubview()`のオーバライド

`super.layoutSubview()`を実行する時点で制約の更新処理は終了しているので、そのレイアウト情報を利用して処理を実行する場合に有効。メインスレッドをブロックせずレイアウトの更新ができる。
トップダウン(親ビュー → 子ビュー)に更新されるので親ビューのレイアウトの更新をすると再起的に更新され、クラッシュを招く。


## レンダリング
フレーム情報が更新されるとディスプレイに表示されるためにレンダリングが行われ、`drawRect_:`が呼び出される。また、以下の条件で、`drawRect_:`が呼び出され再描画を行う。

- ビューの一部を隠してる別のビューの移動・削除
- hidden(非表示)になっていたビューの再表示
- ビューを画面外までスクロールし、再び画面内に戻す
- ビューの`setNeedsDisplay()`, `setNeedsDisplayInRect(_:)`の明示的な呼び出し
[tips] Macにmysqlクライアントのみインストール 

### ※ vagrantやローカル上には無いmysqlDBにログインしたいけど、Macは極力汚したくない(余計なものを入れたくない)人向け

+ インストール

```text:cmd
$ brew install mysql --client-only
```

+ 確認

```text:cmd
$ mysql --version
mysql  Ver 14.14 Distrib 5.7.12, for osx10.11 (x86_64) using  EditLine wrapper
```

+ 使ってみる

```
$ mysql -h192.168.33.91 -u${mysql_user} -p${mysql_password}
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.6.28-0ubuntu0.15.04.1-log (Ubuntu)

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>
```


--> OK! (cli上でpasswordを使うなと怒られているが、テストなので気にしない)
Chromeのアドレスバーからの検索結果を日本語のページのみにする

#環境
Mac OSX El Capitan US環境
Google Chrome Version 51.0.2704.103 

#設定
Chromeの右上のハンバーガーボタン(三本の棒のアイコン)を押してSettingsを押す
Search -> Manage search engines...
からDefault search settingsのアドレスの文字をクリック
色が変わるので
`http://www.google.co.jp/search?hl=ja&q=%s&lr=lang_ja`
をコピペしてDoneを押すと完了

- 通常のgoogle.co.jpを使った検索に戻したい場合は
`http://www.google.co.jp/search?hl=ja&q=%s` に変更

- 英語での検索をしたい場合は
 `https://www.google.co.jp/search?hl=ja&as_q=%s&lr=lang_en` に変更 

#普段から検索の方法を使い分けたい場合
Default search settingsではなく、その下のother search enginesに登録しておくのが便利です。
keywordに例えば
- Add a new search engine: Google(英語)
- Keyword: gen
- URL with %s in place of query:  `https://www.google.co.jp/search?hl=ja&as_q=%s&lr=lang_en`
という感じで登録しておくと
検索バーで「gen」と入力してTabを押すと検索エンジンを任意のものに切り替えることができます。
Rails(WEBRick)をIPを指定して起動する

# 事象
WEBRickでrailsサーバを起動した場合、localhost:3000でアクセスできない

# 環境
- universal.x86_64-darwin14
- ruby 2.0.0p481
- Rails 4.2

# 対処

以下のようにIPを指定して起動する

```
rails s -b '0.0.0.0'
```

- 参考
http://qiita.com/tmf16/items/bb789a45c0f456eac11f
Blender Bezierからチューブを作る

# チューブを作る

## Bezierカーブからチューブに変更する

![image](https://qiita-image-store.s3.amazonaws.com/0/111261/42e36a38-8b92-6676-e76b-d1f65c261249.png)


![image](https://qiita-image-store.s3.amazonaws.com/0/111261/1764db67-c3ad-3a39-9154-e52cbee57778.png)


![image](https://qiita-image-store.s3.amazonaws.com/0/111261/ec774fe4-2d8c-6c4f-b771-620007c1406d.png)

## チューブを伸ばす
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/4fcd4995-2fd3-078c-c409-4239f0b76547.png)

## チューブのカーブを分割する
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/c6bcfc51-3498-00df-bc02-8b7e503f26af.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/111261/3177a0a0-1e3a-9f4a-11eb-317d9e610b46.png)

## Bezierカーブをメッシュに変更する
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/61a396ee-8724-d5a1-4f5a-54830319f1f1.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/111261/d55ac24e-71ff-fe8a-adfd-61cc024a1e46.png)
MacOSXでautopointが実行できなくてautoreconf -iが失敗する場合の対処

MacOSX上で`autoreconf -ifv`などと打った場合に、次のようなエラーが出ることがあります。

```
$ autoreconf -ifv
autoreconf: Entering directory `.'
autoreconf: running: autopoint --force
Can't exec "autopoint": No such file or directory at /usr/local/Cellar/autoconf/2.69/share/autoconf/Autom4te/FileUtils.pm line 345.
autoreconf: failed to run autopoint: No such file or directory
autoreconf: autopoint is needed because this package uses Gettext
```

`autopoint`コマンドが見つからないというエラーです。`autopoint`はgettextが提供するプログラムで、gettext関連の必要ファイルをプロジェクトにコピーするもののようです。

Homebrewを利用している場合、gettextパッケージをインストールするだけでは実行ファイル類にパスが通らないので、手動でパスを通してやる必要があります。

```
$ PATH=${PATH}:$(brew --prefix gettext)/bin autoreconf -ifv
autoreconf: Entering directory `.'
autoreconf: running: autopoint --force
Copying file gl/m4/glibc2.m4
Copying file gl/m4/intdiv0.m4
Copying file gl/m4/intl.m4
Copying file gl/m4/intldir.m4
Copying file gl/m4/intmax.m4
Copying file gl/m4/printf-posix.m4
Copying file gl/m4/uintmax_t.m4
Copying file gl/m4/visibility.m4
Copying file po/Makevars.template
（以下略）
```
BabylonJS VisualStudio 環境設定 メモ

#概要

なんだか面白そうだと思いBabylonJSのリサーチを始めた。
手始めに、使い慣れたVisualStudioにてBabylonJS+TypeScriptの環境を設定したいと考えた。
しかし公式サイトの方法は情報が古いためか成功せず。しかしながら、情報は古いながらもそこで得た知見及び直感にて、ようやく成功にこぎつけた。
そのメモを残す。

#方法

前提：Visual Studio Community 2015

１．新規プロジェクト "ASP.NET Webアプリケーション(VisualC#)"
　　テンプレート Emptyを選択。 

２．ソリューションエクスプローラの"参照"を右クリック
　　"NuGetパッケージの管理"を選択

３．BabylonJSパッケージを選択しインストール
　　インストール中の"TypeScriptをサポート・・"ダイアログは"はい"を選択

４. ソリューションエクスプローラにて新規の"index.html"をダミーとして作成
　　※次のステップで無関係なエラーを出さないため

５．ビルド＆デバッグを行う
　　ブラウザが立ち上がりエラーを表示

６．エラーの対応
　　web.config (ソリューションエクスプローラのルート直下)をエラーの指示に従い修正
　　多重構成定義のエラーが出る。指摘部分をコメントアウト
　　合計３ヵ所修正

７．sandbox.tsの作成

　　新規フォルダ typescriptの直下にsandbox.tsを作成

　　公式サイトのが動作しなかっため、修正。

```ts:sandbox,ts
module Sandbox {
    export class MainClass {
        public engine: BABYLON.Engine;
        public scene: BABYLON.Scene;
        public camera: BABYLON.TargetCamera;

        constructor(canvas: HTMLCanvasElement) {

            this.engine = new BABYLON.Engine(canvas, true);

            this.scene = new BABYLON.Scene(this.engine);

            this.scene.clearColor = new BABYLON.Color3(56 / 256, 87 / 256, 145 / 256);

            this.camera = new BABYLON.ArcRotateCamera("camera1", 0, 0.8, 100, BABYLON.Vector3.Zero(), this.scene);
            this.camera.attachControl(canvas);

            var mesh = BABYLON.Mesh.CreateBox("box01", 50, this.scene);

            var light = new BABYLON.HemisphericLight("light1", new BABYLON.Vector3(0, 1, 0), this.scene);

        }
        public runRenderLoop(): void {
            this.engine.runRenderLoop(() => {
                this.scene.render();
            });
        }
    }
}
```

８．index.htmlの編集

```index.html
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
	<meta charset="utf-8" />
    <script src="scripts/babylon.max.js" type="text/javascript"></script>
    <script src="typescript/sandbox.js"></script>
</head>
<body>
    <div>
        <canvas width="600" height="600" id="renderCanvas"></canvas>
    </div>
    <script type="text/javascript">
		var canvas = document.getElementById("renderCanvas");

		function runBasicScene() {
		    mainScene = new Sandbox.MainClass(canvas);
			mainScene.runRenderLoop();
		}

		runBasicScene();
    </script>
</body>
</html>
```

９．実行

![ok.png](https://qiita-image-store.s3.amazonaws.com/0/131511/bd8c40bb-734e-0ee6-0195-b54bbe096168.png)

#参考

http://www.babylonjs.com/ BabylonJS Official 
http://doc.babylonjs.com/generals/setup_visualStudio Setup VisualStudio

#追記
## デバッグについて

Edgeのデバッガーにて可能
VS上からのデバッグ方法は不明


以上
InputStreamとOutputStreamの扱いメモ


* OutputStream⇒InputStreamの変換

```java
// OutputStreamの生成
ByteArrayOutputStream baos = new ByteArrayOutputStream();
/*
 * 何かOutputStreamに書き込む処理
 */
// InputStreamに書き出す
ByteArrayInputStream bais = new ByteArrayIntputStream(baos.toByteArray);
```
Dockerコマンドメモ

Dockerで使うコマンドなどのメモ
***
コマンドメモ

* `docker search [キーワード]`  
DockerHubからイメージを検索する。
* `docker pull [イメージ名]:[タグ]`  
イメージをローカルに取得する。
* `docker run [イメージ名]:[タグ]`  
イメージからコンテナを起動する。
* `docker run -p [ホスト側ポート番号]:[コンテナ側ポート番号] [イメージ名]:[タグ]`  
イメージからコンテナを起動し、指定したポートを転送する。
* `docker run --name [コンテナ名] [イメージ名]:[タグ]`  
コンテナ名を指定してイメージからコンテナを起動する。
* `docker run -d [イメージ名]:[タグ]`  
イメージからコンテナをバックグラウンドで起動する。
* `docker run -v [ホスト側ディレクトリパス]:[コンテナ側ディレクトリパス] [イメージ名]:[タグ]`  
イメージからコンテナを起動し、指定したディレクトリをマウントする。
* `docker commit [コンテナ名] [イメージ名]:[タグ]`  
コンテナからイメージを作成する。

***

- Dockerコマンド

```text:ホスト上のDockerイメージの一覧
docker images
```
```text:Dockerコンテナの一覧
・起動中コンテナ
docker ps

・停止中コンテナ含めた一覧
docker ps -a
```
```text:Dockerコンテナ内での処理の開始
docker exec -it [コンテナ名] bash
・・・コンテナ内の処理を終了する場合はexitコマンドを実行
```

***
- Dockerfile

```text:FROM
元となるDockerイメージ、タグを指定する。
タグの指定がない場合は最新のイメージを取得する。
```

***
- docker-compose

***
- その他

```text:Linuxコマンド
・ファイル検索
find / -name "[ファイル名]"

・対象ファイル監視
tail -f [対象ファイルのパス]
・・・監視を終了する場合はCtrl+c
```
ローカル開発時のサーバへのHTTPS接続方法

Glassfishの場合
<ol>
<li>ポート[8181]で接続する。

```text:例
【HTTP接続】https://localhost:8080/・・・
【HTTPS接続】https://localhost:8181/・・・
```

</li>
</ol>

Tomcatの場合
<ol>
<li>キーストアをTomcatのconfフォルダ内に作成する。
 キーストアのパスワードは[changeit]にする。

```text:例
【キーストア格納先フォルダ】%TOMCAT_HOME%\conf
【キーストア作成コマンド】keytool -genkey -alias tomcat -keyalg RSA -keystore keystore.jks
```

</li>

<li>Tomcatのconfフォルダ内のserver.xml内のSSL設定部分(port="8443")のコメントを外す。

```text:例
<Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol"
               maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
               clientAuth="false" sslProtocol="TLS" 
               keystoreFile="C:\develop\eclipse\4.4\pleiades\tomcat\7\conf\keystore.jks"
/>
```

</li>

<li>ポート[8443]で接続する。

```text:例
【HTTP接続】https://localhost:8080/・・・
【HTTPS接続】https://localhost:8443/・・・
```

</li>
</ol>
Raspberry PiのIPアドレスを自動でメールに送信する(CNS編)

#SFC生にとってラズパイは無くてはならない

だがCNSでデモしようとするとIPアドレスの確認がめんどい。
自動的ににIPアドレスをメールで送ってほしい。

##sSMTPを導入

`sudo apt-get install sSMTP`

##sSMTPを設定する
`sudo nano /etc/ssmtp/ssmtp.conf`

```
#
# Config file for sSMTP sendmail
#
# The person who gets all mail for userids < 1000
# Make this empty to disable rewriting.
root=hogehoge@sfc.keio.ac.jp

# The place where the mail goes. The actual machine name is required no
# MX records are consulted. Commonly mailhosts are named mail.domain.com
mailhub=smtp.sfc.keio.ac.jp:465

# Where will the mail seem to come from?
rewriteDomain=sfc.keio.ac.jp

# The full hostname
hostname=hoge

# Are users allowed to set their own From: address?
# YES - Allow the user to specify their own From: address
# NO - Use the system generated From: address
#FromLineOverride=YES

AuthUser=ログイン名
AuthPass=メールパスワード
UseTLS=YES

```

##ネットワークが上がったら自動でメールを送るスクリプトを書く
`sudo nano /etc/network/if-up.d/ipmail`


```
#! /bin/bash
sleep 30s
ip addr | mail -s "ip is..." "送りたいアドレス@sfc.keio.ac.jp"
```

30秒くらいスリープを入れないと、ネットが上がってもIPアドレスが取れてなかったりして送信に失敗するので。
base64の文字列をファイルオブジェクトに変換する方法


base64文字列で表現された画像データなどをjavascriptのファイルオブジェクトに変換する方法。

大まかな手順としては以下の通りとなる。

1. base64文字列をデコードする。(atobメソッド)

1. バイナリデータのオブジェクトにデコードしたデータを格納する。(Uint8Array)

1. ファイルオブジェクトを生成する。(File)

```javascript:例
//引数はbase64形式の文字列と作成するファイルオブジェクトのファイル名
var createJpegFile4Base64 = function (base64, name) {
    // base64のデコード
    var bin = atob(base64.replace(/^.*,/, ''));
    // バイナリデータ化
    var buffer = new Uint8Array(bin.length);
    for (var i = 0; i < bin.length; i++) {
        buffer[i] = bin.charCodeAt(i);
    }
    // ファイルオブジェクト生成(この例ではjpegファイル)
    return new File([buffer.buffer], name, {type: "image/jpeg"});
};
```

* 参考
http://qiita.com/uin010bm/items/150003f016287750cf34
Eclipseのめも

Eclipseで作業するときに便利なプラグインなどをメモ書き

Eclipse追加プラグイン

* ER図
* 
```text:ERMaster
http://ermaster.sourceforge.net/update-site/
```

* Git操作
* 
```text:EGit
http://download.eclipse.org/egit/updates/
```

* バグ解析ツール
* 
```text:FindBugs
http://findbugs.cs.umd.edu/eclipse
```

* Java逆コンパイラ
* 
```text:JD-Eclipse
http://jd.benow.ca/jd-eclipse/update
```

* UML作成ツール
* 
```text:PlantUML
http://basar.idi.ntnu.no/svn/tdt4100/anonymous/trunk/updatesite/
```

Marketplace
<ul>
<li>Spring Tool Suite (STS)

```text:STS
https://marketplace.eclipse.org/content/spring-tool-suite-sts-eclipse
```
</li>
<li>Scala IDE

```text:Scala
https://marketplace.eclipse.org/content/scala-ide
```
</li>
</ul>

Eclipse JavaDocコメントの@auhtorの設定
<ol>
<li>eclipse.ini内に以下の内容を追記する。

```text
-Duser.name=【設定したい名前】
```

</li>

<li>Eclipseを再起動する。
</li>
</ol>
PostgreSQLを別の端末から接続する方法(Windows)

　
<ol>
<li>pg_hba.confの内容を環境に合わせて編集。

```text
# TYPE  DATABASE        USER            ADDRESS                 METHOD
host    all             all             【接続を許可するIPアドレス】            md5
```

</li>

<li>ファイアウォールの設定でポートを解放する。
※セキュリティソフトの設定によって解放の方法は異なります。
</li>
</ol>
【.gitignore生成ツール】giboの使い方

　
<ol>
<li>giboを[github](https://github.com/simonwhitaker/gibo)からcloneする。
</li>

<li>clone先のフォルダにパスを通す。
</li>

<li>以下のコマンドを実行し、動作することを確認。


```text:コマンド
gibo -v
```
```text:出力結果
gibo 1.0.4 by Simon Whitaker <sw@netcetera.org>
https://github.com/simonwhitaker/gitignore-boilerplates
```

</li>

<li>以下のコマンドを実行し、.gitignoreファイルを作成します。

```text:コマンド
gibo [オプション] > [出力先]
```

※オプションには開発する言語やIDEを指定できます。
　以下のコマンドで、使用できるオプションの一覧が確認できます。

```text:コマンド
gibo -l
```

</li>
</ol>
PCカメラがないPCでカメラ機能を確認する


* ManyCam
 1. 以下のサイトからインストーラをダウンロード。
 https://manycam.com/
 1. インストーラを起動し、インストールする。
 （HPの設定など必要ないものは適宜チェックを外す）
 1. インストール先のManyCam.exeを実行する。
市区町村を人口の多さで色分け

# データ準備
- [埼玉県推計人口 - 埼玉県](http://www.pref.saitama.lg.jp/a0206/03suikei/index.html) の
CSV版(1)（CSV：11KB）市区町村別現在人口と異動人口
- [国土数値情報 行政区域データ](http://nlftp.mlit.go.jp/ksj/gml/datalist/KsjTmplt-N03.html) 埼玉県

# 人口データ 整形
csv を Excel で開く

元の状態

| 1 | 埼玉県推計人口（埼玉県総務部統計課） |  |  |  |  |
|----|--------------------------------------|----------------|--------------|--------------|----------------------------------------------------------------------------------------------------------------------------------------------------------|
| 2 |  |  |  |  | 平成28年6月1日現在人口と5月中の異動人口 |
| 3 |  |  |  |  | 注：さいたま市の各区の転入・転出には … |
| 4 |  |  |  |  |  |
| 5 | 標準地域コード | 市区町村コード | 地域識別番号 | 市区町村名 | 世帯数（世帯） |
| 6 | 11000 |  | a | 埼玉県 | 3004576 |
| 7 | 11001 |  | b | 埼玉県　市部 | 2813943 |
| 8 | 11002 |  | b | 埼玉県　郡部 | 190633 |
| 9 | 11100 |  | 1 | さいたま市 | 541103 |
| 10 | 11101 | 1015 | 0 | 西区 | 34501 |

1-4行を削除し、項目名が1行目になるようにする

| 5 | 標準地域コード | 市区町村コード | 地域識別番号 | 市区町村名 | 世帯数（世帯） | 人口　総数（人） |
|----|----------------|----------------|--------------|--------------|----------------|------------------|
| 6 | 11000 |  | a | 埼玉県 | 3004576 | 7277247 |
| 7 | 11001 |  | b | 埼玉県　市部 | 2813943 | 6774027 |
| 8 | 11002 |  | b | 埼玉県　郡部 | 190633 | 503220 |
| 9 | 11100 |  | 1 | さいたま市 | 541103 | 1272716 |
| 10 | 11101 | 1015 | 0 | 西区 | 34501 | 87862 |

行政区域データと結合するための共通列「標準地域コード」と「人口　総数（人）」のみを残して削除する

| 標準地域コード | 人口　総数（人） |
|----------------|------------------|
| 11000 | 7277247 |
| 11001 | 6774027 |
| 11002 | 503220 |
| 11100 | 1272716 |
| 11101 | 87862 |

1行目の項目名を半角英数にする

| hyoujunchiiki_code | jinkou |
|----------------|------------------|
| 11000 | 7277247 |
| 11001 | 6774027 |
| 11002 | 503220 |
| 11100 | 1272716 |
| 11101 | 87862 |

名前を付けて保存 する（例：jinkou_saitamaken.csv）

# QGIS に入れる
## 国土数値情報 行政区域データ
レイヤ > レイヤの追加 > ベクタレイヤの追加

- エンコーディング：Shift-JIS

［ブラウズ］から N03-15_11_150101.shp を指定して［開く］
## 人口データ
レイヤ > レイヤの追加 > デリミティッドテキストレイヤの追加
[参照] から 先ほど整形して保存した人口データ（jinkou_saitama.csv）を指定

- エンコーディング：Shift-JIS
- ファイル形式：csv
- ジオメトリ定義：ジオメトリなし

［OK］でクリック

# 行政区域データ に 人口データを結合
左のレイヤパネルの 行政区域データ（N03-15_11_150101）の上で右クリック > 結合 > ［＋］ボタン

- レイヤの結合：人口データ（jinkou_saitama）
- フィールドを結合する：人口データにある共通列（hyoujunchiiki_code）
- ターゲットフィールド：行政区域データにある共通列（N03_007）
- 結合するフィールドを選択する：ON にし、人口の列（jinkou）にチェック

［OK］

左のレイヤパネルの 行政区域データ（N03-15_11_150101）の上で右クリック > 属性テーブルを開く で 属性テーブルを見ると、人口の列が追加されている

# 人口を色の濃淡に反映する
左のレイヤパネルの 行政区域データ（N03-15_11_150101）の上で右クリック > スタイル

- 上の［共通シンボル ▼］となっているところを［段階に分けられた］にし、
- カラム：人口の列（jinkou_saitama_jinkou）
- モード：お好み
- 分類数：お好み

「分類」をクリックし、「OK」
HerokuでWebアプリ(Tomcatプロジェクト)公開メモ

　
<ol>
<li>環境構築
参考リンク：http://www.dcom-web.co.jp/technology/heroku1/
</li>

<li>herokuデプロイプラグインをインストール

```text
heroku plugins:install https://github.com/heroku/heroku-deploy
```

</li>

<li>herokuにログインする
コマンド実行後メールアドレスとパスワードを入力

```text
heroku login
```

</li>

<li>herokuにアプリを作成

```text
heroku apps:create [アプリ名]
```

</li>

<li>アプリのDBを作成

```text
heroku addons:create heroku-postgresql:hobby-dev --version=[バージョン] --app [アプリ名]
```

</li>

<li>DBにテーブルを作成
 <ol>
  <li> 以下のコマンドでDBへの接続情報を取得

  ```text:コマンド
  heroku config --app [アプリ名]
  ```

  ```text:取得情報
  DATABASE_URL: postgres://(username):(password)@(host):(port)/(db name)
  ```

  </li>

  <li>先程取得したDBの接続情報を使い、pgAdminでサーバの追加を行い接続する。
  </li>

  <li>テーブル作成のDDLを対象のDBで実行する。
  </li>
 </ol>
</li>

<li>アップロードするWARファイルを作成
eclipse上でプロジェクトを右クリック⇒[Tomcatプロジェクト]-[プロジェクト設定に従いWARファイルを作成]
※プロジェクトを右クリック⇒[プロパティ]-[Tomcat]のWARエクスポート設定タブで出力先を設定しておくこと。
</li>

<li>作成したWARファイルをアップロードする

```text
heroku deploy:war --war [warファイルを出力したいディレクトリ]/[コンテキスト名].war --app [アプリ名]
```

</li>
</ol>
ディレクトリ削除処理(再帰処理)


Javaの処理で対象ディレクトリの配下のファイルを含め、削除をする処理。
※JavaのFileクラスのdeleteメソッドでは
　ディレクトリ配下にファイルがある場合はエラーとなるため、
　再帰的な処理が必要となる。
　ApacheCommonsにはフォルダごと削除するメソッドもある。

```java
/**
 * 対象パスのディレクトリの削除を行う.<BR>
 * ディレクトリ配下のファイル等が存在する場合は<BR>
 * 配下のファイルをすべて削除します.
 *
 * @param dirPath 削除対象ディレクトリパス
 * @throws Exception
 */
public static void deleteDirectory(final String dirPath) throws Exception {
    File file = new File(dirPath);
    recursiveDeleteFile(file);
}

/**
 * 対象のファイルオブジェクトの削除を行う.<BR>
 * ディレクトリの場合は再帰処理を行い、削除する。
 *
 * @param file ファイルオブジェクト
 * @throws Exception
 */
private static void recursiveDeleteFile(final File file) throws Exception {
    // 存在しない場合は処理終了
    if (!file.exists()) {
        return;
    }
    // 対象がディレクトリの場合は再帰処理
    if (file.isDirectory()) {
        for (File child : file.listFiles()) {
            recursiveDeleteFile(child);
        }
    }
    // 対象がファイルもしくは配下が空のディレクトリの場合は削除する
    file.delete();
}
```
Gitコマンド備忘録


コマンドベースでGitの操作を行う際に使うコマンドのメモを書いていく。

* リポジトリ作成
* 
```text
新規作成       ：git init
リモートから取得 ：git clone 【リポジトリのURL】
```

* ブランチ操作
* 
```text
ローカルブランチのみ表示  ：git branch
リモート含め全ブランチ表示 ：git branch -a
ブランチ名変更           ：git branch -m 【旧ブランチ名】 【新ブランチ名】
```

* ブランチ作成、切替
* 
```text
作成のみ                 ：git branch 【ブランチ名】
ブランチの切替             ：git checkout 【ブランチ名】
作成＋作成ブランチへの切替  ：git checkout -b 【ブランチ名】
リモート→ローカルブランチ     ：git checkout -b 【ローカルブランチ名】 origin/【リモートブランチ名】
```

* ローカルブランチ削除
* 
```text
削除(マージ確認あり)  ：git branch -d 【ブランチ名】
削除(マージ確認なし)  ：git branch -D 【ブランチ名】
```

* リモートブランチ操作
* 
```text
masterへのpush                                ：git push
masterからのpull                               ：git pull
ローカルブランチのリモートへの反映                  ：git push origin 【リモートブランチ名】
指定ブランチのpull                              ：git pull origin  【リモートブランチ名】:【ローカルブランチ名】
リモートブランチ削除                              ：git push origin :【リモートブランチ名】
リモートブランチの状態取得(削除済ブランチの反映含む)  ：git fetch --prune
```

* 【ローカルmasterブランチの復旧方法】
* 
```text
ローカルmasterの削除                             ：git branch -D master
リモートのorigin/masterからローカルのmasterを再作成  ：git checkout -b master origin/master
```

* ファイル操作
* 
```text
変更内容のリセット      ：git checkout 【ファイル名】
ファイル削除           ：git rm 【ファイル名】
ファイル移動(リネーム)  ：git mv 【ファイル名】【変更後のファイル名】
```

* コミット関連操作
* 
```text
コミット対象への追加       ：git add 【ファイル名】
コメントつきコミット         ：git commit -m 【コメント】
直前コミットの修正         ：git commit --amend
ローカルブランチのマージ   ：git merge 【マージ対象ブランチ名】
編集の一時退避          ：git stash save -u 【メッセージ】
stashの確認             ：git stash list
指定stashの反映          ：git stash pop 【stash名】
指定stashの削除          ：git stash drop 【stash名】
最新コミットの確認          ：git log -1
```

* タグ操作
* 
```text
タグの一覧を表示             ：git tag
タグの一覧を表示（コメントつき）：git tag　-n
タグをつける                 ：git tag 【タグ名】
タグをつける（コメントつき）     ：git tag -a 【タグ名】 -m 【コメント】
タグのリモートへの反映         ：git push origin 【タグ名】
複数タグのリモートへの反映     ：git push origin --tags
過去のコミットにタグをつける     ：git tag -a 【タグ名】 -m 【コメント】 【コミット名】
```

* リモート関連
* 
```text
向け先の変更　：git remote set-url 【リポジトリ名】 【リモートリポジトリのURL】
向け先の確認　：git remote　-v
```

* Gitエディタ(viエディタ)での操作
* 
```text
入力(編集)の開始      ：i
入力(編集)の終了      ：[Esc]
保存して終了          ：:wq
保存せず終了          ：:q!
```

* プルリクエスト手順(GitBucket)
 1. 修正用のブランチを作成。
 1. 作成したブランチに対して修正。(コミット、プッシュの実行)
 1. 対象のリポジトリのGitBucketの画面上から[Pull requests]-[New pull request]を選択する。
 1. マージ対象を選択し、[Create pull request]を選択する。

*参考*  
* [Git-viエディタの操作](http://qiita.com/sotoshigoto/items/14d392168b389b9ab6a1)
[覚え書きシリーズ]AWS EC2 LinuxでS3にバックアップ

##XFSの場合
###ファイル名に日時をつけてダンプする
`#xfsdump -p 60 -l 0 - /dev/xvdb1 | bzip2 -c | aws s3 cp --storage-class REDUCED_REDUNDANCY - s3://Backet/Backup/files.$(date +%x-%X).dmp.xfs.bz2`
###バケット内に日付をつけたディレクトリをつけてダンプする
`#xfsdump -p 60 -l 0 - /dev/xvdb1 | bzip2 -c | aws s3 cp --storage-class REDUCED_REDUNDANCY - s3://Backet/Backup/$(date +%Y%m%d)/files.$(date +%x-%X).dmp.xfs.bz2`

|オプション                        |効能                                            |
|:---------------------------------|------------------------------------------------| 
|-p 60                             |60秒おきに状況を表示                            |
|-l 0                              |レベル0（全体）バックアップ                     |
|-                                 |標準出力に出力 （ファイルなら -f <ファイルパス>)|
|--storage-class REDUCED_REDUNDANCY|低冗長性（書き込み速度を上げるため）            |
|$(date +%x-%X)           |ファイル名に日付と時刻を入れる                  |

##ext2/3/4の場合
###ファイル名に日時をつけてダンプする
`#dump 0uf - / | bzip2 -c | aws s3 cp --storage-class REDUCED_REDUNDANCY - s3://Backet/Backup/root.$(date +%x-%X).dmp.bz2`
###バケット内に日付をつけたディレクトリをつけてダンプする
`#dump 0uf - /dev/xvda1 | gzip -c | aws s3 cp --storage-class REDUCED_REDUNDANCY - s3://Backet/$(date +%Y%m%d)/root_$(date +%x-%X).dump`

|オプション                                                    |効能                                                                             |
|:---------------------------------------------|-------------------------------------------------------| 
| 0                                                                  |レベル0（全体）バックアップ                                      |
| u                                                                  |差分バックアップ用ファイル(/etc/dumpdates)を更新|
| f                                                                   |標準出力に出力 （ファイルなら -f <ファイルパス>)  |
|--storage-class REDUCED_REDUNDANCY|低冗長性（書き込み速度を上げるため）                     |
|$(date +%x-%X)                   |ファイル名に日付と時刻を入れる                                |
CentOS7での初期環境設定

CentOS7での初期環境設定
==

### 前提
初期設定は、すべてrootユーザを使用して実行する。

### ホスト名の変更
ホスト名変更は、今まで/etc/sysconfig/network等に定義していたが、hostnamectlへ移行した。

```
# hostanmectl set-hostname ${hostname}
```

```example.command
# hostnamectl set-hostname new_host
```


### タイムゾーンの変更
タイムゾーンは、/usr/share/zoneinfo配下にある、各々のゾーンファイルを/etc/localtimeへ置き換える形で変更していたが、timedatectlへ移行した。

```
# timedatectl list-timezones # タイムゾーンの一覧表示
# timedatectl set-timezones ${timezone}
```

```example.command
# timedatectl set-timezones Asia/Tokyo
```

### localeの変更
localeは、/etc/sysconfig/i18nや/etc/sysconfig/keyboardへ定義していたが、localectlへ移行した。

```
# localectl list-locales # localeの一覧表示
# localectl set-locale LANG=${locale}
```

```example.command
# localectl set-locale LANG=ja_JP.utf8
```

### iptablesの設定変更
iptablesは、/etc/iptablesなどに直接定義を記述する、または、iptablesコマンドを使用していたが、firewall-cmdへ移行した。

```
# firewall-cmd --state # 起動確認
# firewall-cmd --reload # 定義反映
# firewall-cmd --add-port=${port_num}/${protocol} # 対象ポートの許可
```

httpプロトコルの許可を代表として記載

```exmaple.command
# firewall-cmd --add-service=http --permanent # httpプロトコル（デフォルト）の解放
# firewall-cmd --add-port=3000/tcp --permanent # port=3000の解放
```

※ firewall-cmdは、機能が多彩なため、別途書籍等で学習するのが良い。
CakePHP3 で CSVエクスポート機能（マルチバイト文字対応）

## cakephp-csvview をインストール

すでに composer で利用可能なパッケージ [cakephp-csvview](https://github.com/FriendsOfCake/cakephp-csvview) というものが存在する。

~~しかし、 普通にインストールして利用したのではマルチバイト文字のエンコーディング変換ができない。 
（内部で `iconv` を利用しているため）~~



~~実はマルチバイト対応の変更が　[master ブランチにマージ](https://github.com/FriendsOfCake/cakephp-csvview/commit/ac9ed2e20dc13f6a636128c33701c0dc8334f430) されており、~~

~~```composer require friendsofcake/cakephp-csvview:dev-master```
とすれば利用可能。~~

~~※ 2016/07/17 現在、タグはつけられていない
※ dev-master 指定は master ブランチに変更がある度に中身が変わってしまうので注意~~

※ 2016/08/19 追記

どうやら[この記事を書いたすぐあとにタグが付けられ](https://github.com/FriendsOfCake/cakephp-csvview/releases/tag/3.1.0)、普通に利用可能になった模様。

## 利用のしかた

インストールしたあとは、基本的には README に従えばOK。

文字エンコーディングを指定した場合は、併せて `_extention` 変数に `'mbstring'` を指定してやる。


```php:config/bootstrap.php（追記）
Plugin::load('CsvView');
```


```php:src/Controller/任意のController.php
public function export($id = null)
{
    // データを配列に整形 （本来はモデルにロジックを記述）
    $data = [['ほげ', 'ふが', 'ぴよ']];   
    $_serialize = 'data';
 
    // 文字コード変換の関数指定
    $_extension = 'mbstring';
 
    // 変換前の文字エンコーディング
    $_dataEncoding = 'UTF-8';
 
    // 出力文字エンコーディング
    $_csvEncoding = 'sjis-win';
 
    $this->viewBuilder()->className('CsvView.Csv');
    $this->set(compact('data', '_serialize', '_extension', '_dataEncoding', '_csvEncoding'));
}
```
Railsでサーバのログとバッチ処理のログを別出力する方法

# 目的
Railsで`bundle exec rails s`でのログと`ruby foo.rb`のログを別出力する

# 試した環境
OS : CentOS 6.8 (Final)
ruby : ruby 2.3.1p11
rails : 5.0.0

# 前提
- rubyがインストールされている
- rails アプリが既にある
- `${app}/console/` 以下にバッチ処理のスクリプトがある

# 手順
## batch用のenvironmentsを作成
`$ cp ${app}/config/environments/production.rb ${app}/config/environments/batch.rb`

## batch環境で利用するDBを設定
`$ vim ${app}/config/database.yml`

    batch:
      <<: *default
      database: db/prodcution.sqlite3

mysql, postgresql等の場合は`batch:`以下はproductionと同じように設定してください

## `${app}/console/foo.rb`の最初に以下を記述

    ENV['RAILS_ENV'] = 'batch'
    require File.join("~", "sample_app","config", "environment.rb")
    logger = Rails.logger
    logger.info("=== batch log ===")
    (省略)

(*)sample_appは適宜自分のアプリの名前に変更してください

## 確認
`$ ruby ${app}/console/foo.rb`

上記を行って'log/batch.log'に`=== batch log ===`が出力されているかを確認

# 補足
model内の関数で定義した`logger.info("model log")`もbatchから呼び出したときとサーバで呼び出されたときで別出力される
【プログラマーのための数学】ベクトル

## 目次
[プログラマーのための数学 - 目次](http://qiita.com/Esfahan/items/ab63e7c5bcf812dff2a9)

## ベクトルとは
ベクトルとは、向きと大きさを持ったものである。
位置に依存はしないので、向きと大きさが等しければ、そのベクトル同士は等しいということになる。

#### 余談
日常会話の中で、「ベクトルが等しい」という表現が使われることがあるが、
大抵の場合は、「方向性が等しい」という意味で使用されている。
しかし、上記で述べた通り、ベクトルとは、方向だけでなく、大きさの2つを持っているので、
数学でいうと、方向性が同じでも大きさが異なれば、それは違うベクトルである。

## ベクトルの演算
![vector_001.png](https://qiita-image-store.s3.amazonaws.com/0/105936/17518b2c-f1e2-5f9d-c2a0-0eda3548d9a9.png)
出典：[受験の月](http://examist.jp/mathematics/planar-vector/vector-enzan/)

上図のような平行四辺形があるとき、下記の和、差が成り立つ。

- ベクトルの和

```math
OC→ = OA→ + AC→
```

足し算は、2つのベクトルの終点と始点を合わせる。
OA→の終点と、AC→の始点を合わせる。

ベクトルの始点と始点をあわせる考え方の場合は`OA→ + OB→`となり、これでも同等の解になる。
ただ、個人的に、足し算は終点と始点をあわせるほうがイメージしやすい気がする。

- ベクトルの差

```math
BA→ = OA→ + (-OB→)
```

引き算は、2つのベクトルの始点と始点を合わせる。
OA→の始点と、OB→の始点を合わせる。
ベクトルの差は、マイナスの足し算として捉えたほうが理解しやすい。

こちらも、OA→の終点と、AC→の始点を合わせる考え方もできるが、引き算は、始点と始点をあわせるほうがイメージしやすいと思う。

## 絶対値について
数学には絶対値という概念があり、簡単に言えば、向きを無視した大きさだけを表すものです。

最初に書いた通り、ベクトルとは向きを持っているので、
`CA→`と`AC→`は等しくない。`CA→ = -OB→`であり、`AC→ = OB→`である。

しかし、これらを絶対値で比較すると向きが関係なくなるので、すべて等しくなる。
`|`は絶対値であることを示す数学の記号。

```math
|CA| = |AC| = |OB| = |BO|
```

[参考]
[受験の月](http://examist.jp/category/mathematics/planar-vector/)

[関連記事]
[プログラマーのための数学 - 目次](http://qiita.com/Esfahan/items/ab63e7c5bcf812dff2a9)
Riot.jsでjQueryライクにDOM操作する

Riot.jsでも、jQueryライクに$()とかで、簡単にDOM操作できないのかなと思って調べてみました。

環境は Riot.js 2.5.0

Riot.js本体のコードはどうやら短いらしいので、直接読んでみると、\$()と\$\$（）の定義を発見。

lib/browser/tag/util.js のL.376行目くらいに以下のような記述があります。

```util.js
/**
 * Shorter and fast way to select multiple nodes in the DOM
 * @param   { String } selector - DOM selector
 * @param   { Object } ctx - DOM node where the targets of our search will is located
 * @returns { Object } dom nodes found
 */
function $$(selector, ctx) {
  return (ctx || document).querySelectorAll(selector)
}

/**
 * Shorter and fast way to select a single node in the DOM
 * @param   { String } selector - unique dom selector
 * @param   { Object } ctx - DOM node where the target of our search will is located
 * @returns { Object } dom node found
 */
function $(selector, ctx) {
  return (ctx || document).querySelector(selector)
}
```

第二引数は通常のブラウザであれば、何も入れなくて平気かと思います。

ちなみに以下のファイルでimportされているので、すぐに使えるはずです。

```lib/riot.js
import 'browser/wrap/prefix'
import 'browser/global-variables'
/* istanbul ignore next */
import '../node_modules/riot-observable/dist/riot.observable.js'
/* istanbul ignore next */
import '../node_modules/riot-route/dist/riot.route.js'
/* istanbul ignore next */
import '../node_modules/riot-tmpl/dist/riot.tmpl.js'
import 'browser/tag/mkdom'
import 'browser/tag/each'
import 'browser/tag/styleManager'
import 'browser/tag/parse'
import 'browser/tag/tag'
import 'browser/tag/update'
import 'browser/tag/util'
import 'browser/index'
import 'browser/wrap/suffix'
```

ソースコードを読まないと気づけなかったのですが、
\$()はdocument.querySelector()
\$$()はdocumet.querySelectorAll()
なので注意が必要でした。
rails http cache

https://robots.thoughtbot.com/introduction-to-conditional-http-caching-with-rails

http://railscasts.com/episodes/321-http-caching

https://robots.thoughtbot.com/take-control-of-your-http-caching-in-rails

http://stackoverflow.com/questions/3744090/rails-fresh-when-stale-usage

ruby-china 源码里有很多例子

http://api.rubyonrails.org/classes/ActionController/ConditionalGet/ClassMethods.html

https://github.com/ruby-china/ruby-china/blob/master/app/controllers/application_controller.rb#L7-L10

http://stackoverflow.com/questions/824152/what-takes-precedence-the-etag-or-last-modified-http-header

fresh_when 传进去的是数组的话 就没有last-modified 只有etag, 如果传进去的是object的话就会有etag和last-modified

```bash
vagrant@precise64:~/data/ruby-china$ curl -I http://localhost:3000/posts/1
HTTP/1.1 200 OK 
X-Frame-Options: SAMEORIGIN
X-Xss-Protection: 1; mode=block
X-Content-Type-Options: nosniff
Etag: "8971c3ad3d341d4a702395429af9f1ca"
Content-Type: text/html; charset=utf-8
Cache-Control: max-age=0, private, must-revalidate
X-Request-Id: ba4f1d1b-cc91-42b1-990d-b3bd703074a1
X-Runtime: 0.416065
Server: WEBrick/1.3.1 (Ruby/2.2.3/2015-08-18)
Date: Sun, 17 Jul 2016 06:49:57 GMT
Content-Length: 0
Connection: Keep-Alive
Set-Cookie: _dirty_session=ZzF2bUQvNGE4NDlXL0dlZVdkc1ZWUElkUExqMWhaNkR0NzhLd3Z4dmhQL2ljdnBNZ3NCMitKMmhqRHRIRlpWL1N2NzBpMFBqVXI1Q1BobEJEVTlydC9QMnZ5bWNLa2NhN0NUQjhhclpTRTZubm5DVU1vKzBkakVQZ0JwMitqUDRTemo0ZU0xaUdHNit6WkExQ1dBcS9RPT0tLWZvc2pmdmExQU1jcDBYbXNoTXFaa1E9PQ%3D%3D--70ba10f3ec4ea22406657cff731ac69a70d90649; path=/; HttpOnly

vagrant@precise64:~/data/ruby-china$ curl -I http://localhost:3000/posts/1
HTTP/1.1 200 OK 
X-Frame-Options: SAMEORIGIN
X-Xss-Protection: 1; mode=block
X-Content-Type-Options: nosniff
Etag: "0f7e00167e1fc658e5c40635e5fbfd3f"
Last-Modified: Sun, 17 Jul 2016 04:39:29 GMT
Content-Type: text/html; charset=utf-8
Cache-Control: max-age=0, private, must-revalidate
X-Request-Id: 2c53f950-7418-4138-a0e5-6a596e6ce9dd
X-Runtime: 1.389973
Server: WEBrick/1.3.1 (Ruby/2.2.3/2015-08-18)
Date: Sun, 17 Jul 2016 06:50:27 GMT
Content-Length: 0
Connection: Keep-Alive
Set-Cookie: _dirty_session=ZUZLZlBhSDRoTDhRV3lrSmw3bmN0THBDbDIwRHJsbXpmbVZTRmdYVjQwSlNZbmluVTIwYlpoZXN6N2NsL2Yyem16alh0bzRTeEQwSUFEbnViRWpFWUFjWmpLRkhDaTgwWWdHNC8zZ21GK3RxVkVtV3dkVnQwRkVnb1RJWkNZNTYyQWZHMDdDM3RlbHFOLy9aYW43RDlRPT0tLTVwVkNHOHovZlVpdVdIT3dkNXkrY0E9PQ%3D%3D--c58910d04ef58c51f06c7d48f3045d985e8b25ac; path=/; HttpOnly
```

https://github.com/rails/rails/blob/3-2-stable/actionpack/lib/action_controller/metal/conditional_get.rb#L39-L53

last-modified取得是updated_at

```bash
2.2.3 :001 > a = Post.first
  Post Load (3.1ms)  SELECT  "posts".* FROM "posts"  ORDER BY "posts"."id" ASC LIMIT 1
 => #<Post id: 1, title: "lalala", body: "just a test", created_at: "2016-07-17 04:39:29", updated_at: "2016-07-17 04:39:29"> 
2.2.3 :002 > [a,a].try(:updated_at)
 => nil 
```
WRF > wrf_io.oのビルド失敗 > netcdf.incへのパスが通っていない

関連 http://qiita.com/7of9/items/cd769c0ccebf9e17f260

WPSのビルド時に以下のエラーが出ていた。

```
/usr/bin/ld: cannot find -lwrfio_int
```

WRFの(compile em_real実行時の)ビルドメッセージを見ると以下のエラーが出ていた。

```
wrf_io.f:373: Error: Can't open included file 'netcdf.inc'
make[3]: [wrf_io.o] Error 1 (ignored)
/lib/cpp -P -P -traditional -I../ioapi_share field_routines.F90 > field_routines.f
gfortran   -O2 -ftree-vectorize -funroll-loops -w -ffree-form -ffree-line-length-none -fconvert=big-endian -fre
cord-marker=4  -o field_routines.o  -I/usr/include -I../ioapi_share -c field_routines.f
field_routines.f:41: Error: Can't open included file 'netcdf.inc'
make[3]: [field_routines.o] Error 1 (ignored)
/bin/rm -f libwrfio_nf.a
if [ "ar" != "lib.exe" ] ; then \
                          ar cr libwrfio_nf.a wrf_io.o field_routines.o module_wrfsi_static.o ; \
                        else \
                          ar /out:libwrfio_nf.a wrf_io.o field_routines.o module_wrfsi_static.o ; \
                        fi
ar: wrf_io.o: No such file or directory
make[3]: [libwrfio_nf.a] Error 1 (ignored)
ranlib libwrfio_nf.a
ranlib: 'libwrfio_nf.a': No such file
make[3]: [libwrfio_nf.a] Error 1 (ignored)
```

netcdf.incのパスが通っていないようだ。

こちらの環境では`netcdf.incは/usr/include/netcdf-3/netcdf.inc`に見つかっている。

WRFのconfigure.wrfのINCLUDE_MODULESの定義の以下を変更してみた。

```
#                      -I$(NETCDFPATH)/include \
                      -I$(NETCDFPATH)/include/netcdf-3 \
```

ビルドしたところ、やはりnetcdf.incが見つからないというエラーになる。

configure.wrfファイルだけでなく、external/io_netcdf/のmakefileにも以下の定義があるためのようだ。

```
FFLAGS  =  $(FCFLAGS) -I$(NETCDFPATH)/include -I../ioapi_share
```

$(NETCDFPATH)/include以下にnetcdf.incがあるようになっていないとエラーが出る。
Brackets - インストール済エクステンション

1. Ant Theme
1. Brackets Builder Extended
1. Brackets Outline List
1. Brackets TypeScript
1. Console
1. Inline Gradient Editor
1. JSXHint
1. LESS AutoCompile
1. Markdown Preview
1. Minifier
1. PHP SmartHints
1. QuickDocsPHP
1. React (.jsx) language mode for Brackets
1. React.JS (.jsx) Language
1. ReactJs JSX Transformer
1. Run Script
1. SVG Preview
1. [beautify](https://github.com/brackets-beautify/brackets-beautify):コードを読みやすく整形

これから入れる

1. Shizimily Multiencoding for Brackets
1. Sidebar Plus
[iOS]Push通知が上手くいかない時のチェックするべきポイント

この前Push通知で苦しんだことがあったので、今後苦しまないためのチェックポイントをおさえておきます。

## iOS Developerの設定チェックした？
iOS Developerにて、Push通知を行うアプリに対して、Push通知を行う設定をしてあげる必要があります。設定後、もう一度証明書を発行し、プロジェクトに設定しなおさないといけないので注意。

## Push通知用サーバに証明書（.p12）登録した？
 基本的なところですが、登録しないとPush通知が配信できません。
必ずチェックしておきましょう。
 あと証明書にパスワードをかけると配信できないサーバ（mbaasとか）もあるので注意

## プロジェクト設定でPush通知許可した？
プロジェクト設定でPush NotificationをONにしないとサーバでいくら配信しても、アプリ側で通知を受け取れないので、お気をつけください。
これを知らないと小１時間苦しむことになります。（経験談）
![](https://qiita-image-store.s3.amazonaws.com/0/103047/8b7d656d-467d-e570-df36-b2dfd06089d1.png)

自分が苦しんでたポイントはざっとこんなところです。
もしかしたら抜けてるところがあるかもしれないので、

ここヘンだぞ！
そんなことしなくてもこういうやり方があるよ！

と思った方は、コメントにてご意見いただけると幸いです。
在 pod install 碰到無法轉換成 CFTypeRef

今天在用 [CocoaPods](https://cocoapods.org) 在裝東西，

它安裝的過程中，碰到這樣子的錯誤之後，就中斷了：

```
TypeError - Unable to convert Ruby value `"AFNetworking"' into a CFTypeRef.
```

循著線摸到這個 issue - [CocoaPods/CocoaPods #5200](https://github.com/CocoaPods/CocoaPods/issues/5200) 的這一則 [回覆](https://github.com/CocoaPods/CocoaPods/issues/5200#issuecomment-214541543)

看來只要把 ruby 版本更新到 2.2.3 以上就好了，

看了一下我自己電腦上目前的版本

```
$ ruby -v
ruby 2.2.0p0 (2014-12-25 revision 49005) [x86_64-darwin14]
```

發現是舊的，
於是就先用 rvm 安裝和更新使用版本到 2.2.3 ，

在執行一次 `pod install` ，問題就解決了 :laughing: :tada: 

```
Generating Pods project
Integrating client project
...
...
Sending stats
Pod installation complete! There are 17 dependencies from the Podfile and 20 total pods installed.
```
PHPStorm 2016.x で利用メモリを大きくする方法

新しい情報を Google 先生が教えてくれないので、書いておきます。

環境は Mac で、PHPStorm のバージョンは 2016.1 とか 2016.

PHPStorem 2016.x では、VM の設定ファイルの雛形は

> /Applications/PhpStorm.app/Contents/bin/phpstorm.vmoptions

にあります。このファイルをまず次の場所にコピーします。

> ~/Library/Preferences/PhpStorm2016.2

(例は 2016.2 の場合、バージョンに合わせてください)

内容を編集します。

~~~
-Xms1024m
-Xmx2048m
-XX:ReservedCodeCacheSize=240m
-XX:+UseCompressedOops
~~~

以上です。

## 追記

メニューの Help > Edit Custom VM Options を選択すると、
PHPStorm のエディタで修正できます。
このほうが簡単ですね。
Validationをモデル以外に書く簡易方法

# 動機
- モデルの中にバリデーションを書く方法は、開発が進むとFatとなるため避けたい。
- 特に『validate :private_method』を使うと、モデル内の記載箇所が、通常のvalidates定義は上、private_methodは下となり、見苦しい
- でも『validate :private_method』も許したい
- 一つのファイルに書きたい

# 準備
1. app/validatorsディレクトリ作成

# Validator作成
1. モデル毎のValidator作成

```app/validators/user_validator.rb
# クラス名は 『モデル名Validator』としておく
class UserValidator < ActiveModel::Validator
  def initialize(options)
    # Validatorはアプリで1回しかインスタンス化されない
    options[:class].class_eval do
      # 通常のアトリビュート毎のvalidationの定義を書く
    end
  end

  def validate(user)
    @user = user

    # アプリケーションに特化したvalidationを書く
    # * わざわざ専用のValidatorを作るほどでもないやつ
    # * アトリビュート間の関係でアプリケーションに特化したやつ
  end
end
```

2. モデルで使う

```app/models/user.rb
class User < ActiveRecord::Base
  validates_with UserValidator
end
```

# 例
```app/validators/user_validator.rb
class UserValidator < ActiveModel::Validator
  def initialize(options)
    options[:class].class_eval do
      #★★ アトリビュート毎のバリデーション
      validates :name, uniqueness: true
      validates :name, length: {in: 3..8, too_short: '3文字以上で設定', too_long:  '8文字以下で設定'}

      validates :age, numericality: { only_integer: true, message: "数字のみ"}
      validates :age, inclusion: {in: 0..120, message: "0から120の範囲"}

      validates :password, confirmation: true

      #★★ 自作済みも普通にここで記述
      validates_with NotSameValidator, {attributes: [:name, :password], 
                                        message: '%{value} 名前とパスワードが同じ'}
    end
  end

  def validate(user)
    @user = user

    #★★ 自作するほどじゃない場合。
    name_must_not_by_single_character('そんな名前はダメ')
  end


  private
    def name_must_not_by_single_character(message)
      if @user.name.chars[1..-1].all?{|c| c == @user.name[0]}
        @user.errors.add(:name, message)
      end
    end
end
```

# どうなの？
- 『Validatorを集約したValidator』を定義するイメージ
- モデルの記述がFatにならない
- モデルとValidatorが1対1なので「どこに書いてあるの？」とならない
- それぞれのValidatorと自分で書くものが一箇所に集まるため管理が楽(?)
    - 少なくともモデルの中で 『validate :private_method』 とするよりは良いか
- モジュールにしてincludeする方法も考えたが、モデル中の記述が『include XXX』よりは『validate_with XXX』の方が分かりやすい(?)
 
# ダメでしょ
- 一般的な『Validator』の責務を逸脱している。UserValidationCollectionとでもすべきか。
- options[:class].class_eval の部分は行儀が悪く、Railsの実装が変わったら使えない(?)
- 手抜き。きれいな解決策じゃない。