OmniAICreator/Qiita-1.07M huggingface dataset:
Cocos2d-xのお勉強（HelloWorld編）

今までSpriteKitで開発していましたが、Androidでもアプリをリリースしてみたく、Cocos2d-xを触ってみます。

## リファレンスなど

- [Cocos2d-x 公式サイト](http://jp.cocos2d-x.org/)
- [Cocos2d-x 公式リファレンス](http://www.cocos2d-x.org/reference/native-cpp/V3.5/index.html)

## 環境構築
### Windows  
- [ぎじゅつめも - Cocos2d-x開発環境の構築](http://wiki.xsqi.net/index.php?%A5%D7%A5%ED%A5%B0%A5%E9%A5%E0%2FCocos2d-x%2FCocos2d-x%B3%AB%C8%AF%B4%C4%B6%AD%A4%CE%B9%BD%C3%DB)

### Mac
- [MacでCocos2d-xを使ってiOS＆Androidアプリ開発をはじめるための環境構築メモ](http://unsolublesugar.com/20150122/153509/)  
- [【cocos2d-x 3.3】MacでAndroid版の環境構築](http://tech.sanwasystem.com/entry/2015/02/04/131311)

## Cocos2d-xプロジェクトの生成
Cocos2d-xのプロジェクトを作成するルートフォルダへ移動し、cocosコマンドからプロジェクトを生成します。

```
$ cd /cocos2d/
$ cocos new MyGame -p com.mycompany.mygame -l cpp
```

## HelloWorld

上記で作成したプロジェクトの中に、iOS用のプロジェクトが含まれているので、起動し、動作することを確認します。
![hello.png](https://qiita-image-store.s3.amazonaws.com/0/70446/e639b0a3-c0ea-99c4-9705-981b47f78c8a.png)
![HelloWorld.png](https://qiita-image-store.s3.amazonaws.com/0/70446/26bcbb7a-02b8-d7ec-91c9-cd87f54f65ca.png)

## シーンの仕組み

Cocos2d-xでは、タイトルシーンやゲームシーンなど、各シーンごとに画面（シーン）を用意し、その上にレイヤーを配置してスプライト（オブジェクト）を配置していきます。
HelloWorldプロジェクトには以下のようなコードが記述されており、クラスメソッドのcreate()を使用してオブジェクトを生成します。
このcreateメソッドを使用することで、autoreleaseされた状態でオブジェクトが生成されるようです。

```cpp:HelloWorldScene.cpp
Scene* HelloWorld::createScene()
{
    // 'scene' is an autorelease object
    auto scene = Scene::create();
    
    // 'layer' is an autorelease object
    auto layer = HelloWorld::create();

    // add layer as a child to scene
    scene->addChild(layer);

    // return the scene
    return scene;
}
```

## ワンポイント

- USING_NS_CC;  
namespaceとしてcocos2dを使うことを宣言するマクロで、以後"cocos2d::"を省略可能で、"using namespace cocos2d"と同等の意味を持つようです。

```cpp:AppDelegate.cpp
#include "HelloWorldScene.h"

// create a scene. it's an autorelease object
auto scene = HelloWorld::createScene();
```

## 背景と文字の表示

HelloWorldプロジェクトでは、下記Resourcesフォルダに資源が格納されています。
![resources.png](https://qiita-image-store.s3.amazonaws.com/0/70446/06be527d-4cc2-3945-5537-17de7728c7ad.png)

```cpp:HelloWorldScene.cpp
// add "HelloWorld" splash screen"
auto sprite = Sprite::create("HelloWorld.png");

// position the sprite on the center of the screen
sprite->setPosition(Vec2(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y));

// add the sprite as a child to this layer
this->addChild(sprite, 0);
```
Resources直下に配置されたHelloWorld.pngが参照されていることがわかります。ここでは、Vec2クラスを使用して背景画像の座標を設定しています。デフォルトでアンカーポイント（スプライトの中心座標）が(0.5,0.5)に設定されているため、画面サイズの半分の位置にくるよう設定されています。また、作成した背景画像を表示するため、this（HelloWorldシーン）にaddChildしています。

同様に下記コードにて、ラベルが追加されていることがわかります。

```cpp:HelloWorldScene.cpp
auto label = Label::createWithTTF("Hello World", "fonts/Marker Felt.ttf", 24);

// position the label on the center of the screen
label->setPosition(Vec2(origin.x + visibleSize.width/2,
                        origin.y + visibleSize.height - label->getContentSize().height));

// add the label as a child to this layer
this->addChild(label, 1);
```

ざっくりですが、HelloWorldの解析は終わりにします。
次回は、アニメーションさせたり、タッチイベントを取得したりして、アプリケーションを作ってみたいと思います。
mb_strpos関数に指定する引数

```
$s = "あいう";
echo mb_strpos($s, "い");
```
なぜかこれで「２」と表示されてしまいました。解決するには文字コードを指定すれば良いとのこと（じゃあわざわざmbつける意味ってあるんですか？）。
```
$s = "あいう";
echo mb_strpos($s, "い", 0, "UTF-8");
```
１・文字列内を検索
２・指定した文字が最初に出る場所
３・検索開始する場所
４・文字コード
PHP7調査(16)高速な引数パーサの導入

PHP7から、PHP関数の引数を処理する内部関数の高速版が作られました。従来の引数パーサが廃止されるわけではなく、今後も両方が併用されます。

これはC言語のレイヤの話題ですから、PHPプログラマに直接関係する内容ではありません。また、PHPエクステンション開発者であっても新APIを使う機会はないでしょう。従来通りの書き方のままで問題ないはずです（理由は後述）。

# 実装

新旧のインターフェースを実際のコードで見てみましょう。下記はPHP7の`is_a`関数の実装部分の抜粋です。

```c
#ifndef FAST_ZPP
        if (zend_parse_parameters(ZEND_NUM_ARGS(), "zS|b", &obj, &class_name, &allow_string) == FAILURE) {
                return;
        }
#else
        ZEND_PARSE_PARAMETERS_START(2, 3)
                Z_PARAM_ZVAL(obj)
                Z_PARAM_STR(class_name)
                Z_PARAM_OPTIONAL
                Z_PARAM_BOOL(allow_string)
        ZEND_PARSE_PARAMETERS_END();
#endif
```

PHP5で引数の処理を行う場合、このコードの前半部のように`zend_parse_parameters()`関数が用いられていました。PHP7からは`ZEND_PARSE_PARAMETERS_**`および`Z_PARAM_**`というマクロ関数が導入されています。これらは`zend_parse_parameters()`関数と同等の機能をマクロで実現しています。それぞれで必要な機能だけがベタ書きで展開されるので、速度的には有利になります。一方、バイナリサイズの観点では不利になります。

この新APIは速度が本当に重要な箇所でのみ使うべきだとされています。バイナリサイズを無意味に大きくしてキャッシュ効率を下げてしまうことを懸念しているのかもしれません。実際、PHP7のソースコード中で使われている場所は103箇所でした。PHP本体および標準エクステンションに含まれるPHP関数・メソッドの数は5000ほどですから、ごく一部にしか使われていないことがわかります。自作エクステンションで実装する関数は標準関数よりもずっと呼び出し頻度が低いはずですから、一般人が新APIを使う必要性はほとんど無いように思います。

# 速度改善

WordPressでベンチマークテストをしたところ、この新APIの導入により処理時間を2.5%ほど高速化できたそうです。

# 参照

* [PHP RFC: Fast Parameter Parsing API](https://wiki.php.net/rfc/fast_zpp)
.each、 $.eachの違い

#jQuery .each $.eachの違い

```js
//.each
//jQueryオブジェクトに対してのみ
$('ul > li').each(function(idx, el){
    console.log(idx,el,$(this));
});

//$.each
//配列やjQueryオブジェクトではないものも扱える

//配列
var arr = ['arr1', 'arr2', 'arr3'];
$.each(arr, function(i, val){
    console.log(i,val);
});

//オブジェクト
var obj = {1 : 'orange', 2 : 'apple', 3 : 'banana'};
$.each(obj, function(i, val){
    console.log(i,val);
});

//連想配列
var obj = {'user' : 'hoge', 'password' : 'xxx', 'msg' : 'fall in love'};
$.each(obj, function(i, val){
    console.log(i,val);
});
```
laravel-elixirの設定を確認したいとき

こんなタスクをgulpfile.jsに追加しておく。

```js:gulpfile.js
 elixir(function(mix) {
     mix.less('app.less')
         .phpUnit();
 });

// ここから下を追加
var gulp = require("gulp");

gulp.task("showconfig", function () {
    console.log(JSON.stringify(elixir.config, null, 2));
});

```

こんなのが出力されます。

```
$ gulp showconfig
[17:42:32] Starting 'showconfig'...
{
  "production": false,
  "srcDir": "app",
  "publicDir": "public",
  "assetsDir": "resources/assets/",
  "cssOutput": "public/css",
  "jsOutput": "public/js",
  "sourcemaps": true,
  "bowerDir": "vendor/bower_components",
  "tasks": [
    "less",
    "phpunit"
  ],
  "watchers": {
    "default": {
      "less": "resources/assets/less/**/*.less"
    },
    "tdd": {
      "phpunit": "tests/**/*Test.php"
    }
  },
  "duplicate": [],
  "concatenate": {
    "css": [],
    "js": []
  },
  "compile": {
    "less": [
      {
        "src": [
          "resources/assets/less/app.less"
        ],
        "options": {
          "compiler": "Less",
          "plugin": "less",
          "src": "app.less",
          "search": "**/*.less"
        }
      }
    ]
  }
}
```
Laravelのログにファイル名やメソッド名を出力する

Monologではログ出力にメッセージ以外に情報を付加する2つのフィールドがあります。

[1つ前の記事](http://qiita.com/iakio/items/86086e046f73826c9bef)を例に挙げると、

```
[2015-04-21 13:25:42] local.INFO: hello [] []
```

の最後の2つの`[]`です。1つはcontext、もう1つはextraと呼ばれます。

contextはログ出力時に引数で指定することができ、extraはLoggerに与えられたProcessorが呼び出されることによって付与されます。

例えば、このようにcontextに情報を与えれば：

```php
        \Log::info("hello", ['file' => __FILE__, 'line' => __LINE__]);
```

このように出力されます。

```
[2015-04-21 13:30:06] local.INFO: hello {"file":"C:\\path\\to\\app\\Http\\Controllers\\WelcomeController.php","line":39} []
```

このような情報をextraフィールドに自動的に追加するのが`Monolog\Processor\IntrospectionProcessor`です。LoggerにIntrospectionProcessorを追加します。

```php
        $monolog = Log::getMonolog();
        $ip = new \Monolog\Processor\IntrospectionProcessor();
        $monolog->pushProcessor($ip);
```

出力はこうなります。

```
[2015-04-21 13:34:17] local.INFO: hello [] {"file":"C:\\path\\to\\vendor\\laravel\\framework\\src\\Illuminate\\Log\\Writer.php","line":201,"class":"Illuminate\\Log\\Writer","function":"writeLog"}
```

確かに`Write::writeLog`からログ出力されてはいるのですが、これだとログとしては役に立ちません。IntrospectionProcessorではログ出力時のスタック上でスキップするクラスを指定することができます（デフォルトでは``Monolog\\``と前方一致するもののみスキップします）。

```php
        $monolog = Log::getMonolog();
        $ip = new \Monolog\Processor\IntrospectionProcessor(
            \Monolog\Logger::DEBUG,
            [
                'Monolog\\',
                'Illuminate\\',
            ]
        );
        $monolog->pushProcessor($ip);
```

出力はこうなります。

```
[2015-04-21 13:36:15] local.INFO: hello [] {"file":"C:\\path\\to\\app\\Http\\Controllers\\WelcomeController.php","line":39,"class":"App\\Http\\Controllers\\WelcomeController","function":"index"}
```
PHP7調査(15)PHP4スタイルのコンストラクタが非推奨になった

PHPではクラスのコンストラクタメソッドを`__construct()`という名前でつけるのが常識だと思いますが、PHP5では過去のPHPとの互換性のためにクラス名と同名のメソッドもコンストラクタメソッドとして動作していました。

```php:foo.php
<?php
class Foo {
    function foo() {}
}
$foo = new Foo();
```

このようなコードはPHP7でも動き続けますが、エラーレベルE_DEPRECATEDの警告が表示されるようになります。

```
PHP Deprecated:  Methods with the same name as their class will not be constructors in a future version of PHP; Foo has a deprecated constructor in /tmp/foo.php on line 3
```

PHP8からエラーになるらしいですが、個人的にはこのタイミングでバッサリ切ってくれても良かった気がします…。

# 参照

* [PHP RFC: Remove PHP 4 Constructors](https://wiki.php.net/rfc/remove_php4_constructors)
SSHトンネリングでRDP接続する

WindowsPCでTeratermのSSH転送機能を利用し、RDP接続する方法です。
借用PC等でTeratermやRDP履歴(レジストリ)に残したくないという方に。
というか主に自分向け。

## 前提
1. SSH接続出来るルータなりLinuxサーバなりが存在する
2. その機器からRDP接続が可能である
2. Teratermと下記2つのScriptを端末に準備出来る
	* TeraTermはDL、Scriptはここからコピペでちょっと編集して保存

## 使い方
1. SSH-Tunnel.batを実行
2. SSHサーバにログインする
3. RDPの認証情報を入力

## SSH-Tunnel.BATの処理内容
1. 指定したFQDNに対しTeraTermでSSH転送による接続し、TeraTermマクロを呼び出し

## SSH-Tunnel.TTLの処理内容
1. SSH接続先のプロンプト待ち受け
2. 接続完了時のプロンプトが表示されたら、MSTSCコマンドによるRDP接続
	* ここでMSTSCの終了を待つ
3. 一度空行を入力し、再度プロンプト待ち受け
4. プロンプトが表示されたらSSH切断
5. RDP接続履歴をレジストリから削除



```text:SSH-Tunnel.BAT
@ECHO OFF
SETLOCAL

START "" "C:\Program Files\teraterm\ttermpro.exe SSH接続先FQDN or IP:SSHサーバのポート /ssh 2 /ssh-Lループバックアドレス:待ち受けポート:転送先IPアドレス:待ち受けポート /V /M="SSH-Tunnel.TTLのFull Path"

ENDLOCAL
```


```text:SSH-Tunnel.TTL
show 0
timeout = 30
wait 'vyos@vyos:~$'
if result=0 goto :FIN
exec 'MSTSC /V ループバックアドレス /w 1364 /h 710 /admin' 'show' 1
sendln ''
wait 'vyos@vyos:~$'
sendln 'exit'
exec 'reg delete "HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Default" /v MRU0 /f' 'minimize' 1
exec 'reg delete "HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Servers\ループバックアドレス" /f' 'minimize' 1
:FIN
```
Google Apps Scriptにおける「プロジェクト」の関係

# 概要
* Google Apps Scriptにおける「プロジェクト」がわかりづらかったので、部下のS越さんに取りまとめてもらった。（S越さん、ありがとうございます）
* Google Apps Scriptのプロジェクトについて混乱している人もいると思うので、Qiitaにて共有する。突っ込み大歓迎です。

# 参考記事
* [Authorization for Google Services - Apps Script — Google Developers](https://developers.google.com/apps-script/guides/services/authorization)
* [GoogleAppsScript - Google Apps Scriptの開発手法まとめ - Qiita](http://qiita.com/soundTricker/items/4d04c97c499b22886dfd)
* [Google Apps Script の実行権限について - Google グループ](https://groups.google.com/forum/#!topic/google-apps-api-japan/vFI1eMODvh4)
* [GoogleAppsScript - Google Apps Scriptのプロジェクトのコードを外部からダウンロード/アップロード(アップロード編) - Qiita](http://qiita.com/soundTricker/items/e75ee1f2a7d89fa60a60)

# 解説
## はじめに
アカウントの概略図は次の通り。
![GASプロジェクト周り.png](https://qiita-image-store.s3.amazonaws.com/0/64819/fcff68ed-0752-66b0-651b-f55e04a4bdd5.png)

## Google Apps Script のプロジェクト
* GASプロジェクトには、「Standalone Script」（ドライブ上に単独で存在するもの）と、「Container Bound Script」（スプレッドシートに紐づくもの）が存在する。
* スプレッドシートから「スクリプトエディタ」を選択すると、自動的にContainer Bound Scriptプロジェクトが作成される。
* 各種承認（カレンダー等）はプロジェクト単位で必要となる。

#### ■Google Apps Scriptのエディタ画面
![image](https://qiita-image-store.s3.amazonaws.com/0/64819/7f5c2d0a-c8c6-db17-7d6c-6ec718079ab3.png)

## スプレッドシートとGoogle Apps Script の関係
* 一つのスプレッドシートに対して、複数のContainer Bound Scriptを作成することもできる。
* Container Bound Script 上で新規プロジェクトを作成すると、同一のスプレッドシート上に新しいContainer Bound Scriptが作成される。
* 「ファイル」> 「コピーを作成」も同様にContainer Bound Scriptが作成される。

#### ■Google Apps Scriptのエディタ画面で新規プロジェクトを作成
![image](https://qiita-image-store.s3.amazonaws.com/0/64819/a119781a-cce9-0be7-739d-1716c04098d4.png)

* 一つのスプレッドシートに対して複数のContainer Bound Scriptが存在する場合、スクリプトエディタ起動時にどのプロジェクトを選択するか促される。
* スプレッドシートからスクリプトを実行した場合、双方のプロジェクトが実行対象となる。
* 例えば、双方のプロジェクトでonOpenが定義されていた場合、スプレッドシートを開いた場合はそれぞれのonOpenが実行される。

#### ■プロジェクトの選択画面
![image](https://qiita-image-store.s3.amazonaws.com/0/64819/b2d0941f-0e1e-c4aa-c1c0-793745f0a5ff.png)

## Google Apps Script と Google Developer Consoleの関係
* Google Apps Script のプロジェクトとGoogle Developer Console のプロジェクトは別概念。
* GASは、Google Analytics API 等の承認をGoogle Developer Consoleのプロジェクトに委託している。
* GASプロジェクトが作成されると、自動的にそれに紐づくGDCプロジェクトが作成されるので、作成されたGDCプロジェクト上でAPIの利用をONにする必要がある。（GAS上でもONにする）
 * **GASから作成されたGDCプロジェクトは、通常のGDC管理画面から選択・編集できない。GAS経由で開く必要がある。名称はGASのプロジェクトと同一になる。**
* 既に存在するGDCプロジェクトをGASプロジェクトに紐付けることも可能。その場合自動で作成されたプロジェクトは削除されるので注意。（詳細は下記） ※自分がファイルのオーナーの場合のみらしい。
 * [Authorization for Google Services - Apps Script — Google Developers](https://developers.google.com/apps-script/guides/services/authorization#using_a_different_google_developers_console_project)

![image](https://qiita-image-store.s3.amazonaws.com/0/64819/f72c06f7-6c33-e156-fd0d-b2c4885a3996.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/64819/975ba18e-02dc-2640-f9d9-39c1b7287e8b.png)

## まとめ
* 誤ってGASプロジェクトをコピーした場合、スプレッドシートが参照するスクリプト内に同名の関数が存在することになるので、そのまま放置しておくのは危険と思われる。
 * コピーを削除してもオリジナルの動作に影響はない。
* GAS上で各種APIを利用している場合、他ユーザーに共有する際にGDCプロジェクトの権限も与える必要がある。（APIの認証を行うのはGDCのため）
Laravelのログを標準エラーに出力する

Laravelのログは通常`storage/logs`ディレクトリに出力されます。

遊び程度にしか使っていませんが、私は開発時は`artisan serve`したい派なので、ログは同じコンソールに出た方が嬉しい。なので標準エラーにログを出力するようにしてみます。

```php
        $monolog = Log::getMonolog();
        $monolog->pushHandler(new \Monolog\Handler\StreamHandler('php://stderr'));
```

こんなコードをどこかに書きます。どこが適切かはわかりませんが、一例としては`app/Providors/ConfigServiceProvider.php`の`register()`メソッドの中などでもよいでしょう。
5.1のドキュメントには、`bootstrap/app.php`の最後あたりで`$app->configureMonologUsing()`を呼べと書かれていました( http://laravel.com/docs/master/errors#configuration )。

```php:app/bootstrap.php
$app->configureMonologUsing(function ($monolog) {
    $monolog->pushHandler(new \Monolog\Handler\StreamHandler('php://stderr'));
});

return $app;
```

で、ログを出力します。

```php:WelcomeController.php
	public function index(Request $request)
	{
            \Log::info("hello");
...
```

こんな感じに出力されます。

```
$ artisan serve
Laravel development server started on http://localhost:8000/
[2015-04-21 13:25:42] local.INFO: hello [] []
```
さくらVPSの標準CentOS6.4にDockerを入れる

# したこと

さくらVPSの標準CentOS 6.4にDockerを入れて、マシンが起動したら自動的にDockerのサービスが入るようにした。

```
# yum install docker-io
# service docker start
# checkcfg docker on
# usermod -G docker nakata0705 
```

* ここで書いてあることをそのまま順番にやっていった。
(http://qiita.com/ftakebayashi/items/93f92797a13917ec9cc0)

## 追記

* CentOSでは/etc/init.d/xyz startではなくservice xyz startを使うのがよいとのこと。(http://d.hatena.ne.jp/amari3/20111223/1324656530)
* checkcfgはRedHat系特有のもので、Ubuntuでは違う方法を使うとのこと。(http://www.aboutlinux.info/2006/04/enabling-and-disabling-services-during_01.html)

# はまったこと

* 特になし

## 追記
* docker関連のコマンドを一般ユーザーが実行するためには、そのユーザーをdockerユーザーグループに入れなければいけない。いつもsu dockerをやるのも困りものなので設定しておいた。

```
# usermod -G docker USERNAME
```

## 追記2
* 上記コマンドでdockerグループにユーザーを追加すると、そのユーザーからはadmin権限がなくなるので、必ず以下のように設定すること。

```
# usermod -aG docker USERNAME
```

* 間違えて設定を変えてしまった時は、さくらVPSではルートユーザーになって以下のコマンドを入力すればよい。SUDO_GROUP_NAMEはwheel。UbuntuではShiftキーを押しながら起動し、リカバリーモードからfsckをしたあとルートプロンプトに入り、下のコマンドを入力すればよい。SUDO_GROUP_NAMEはsudo。

```
# usermod -G SUDO_GROUP_NAME USERNAME
```
さくらVPSの初期設定

#したこと
ここを見ながらiptablesやsshdの設定、sudoの設定をやった。総じて大きな問題はなかった。sshdが使うポートは21022にした。
https://help.sakura.ad.jp/app/answers/detail/a_id/2422/

#はまったこと
* WEBコントロールパネルから使えるHTML5ベースのVNCクライアントのキーボード設定を英語キーボードに変えても変更がきちんと反映されない。アンダースコアが打てないので困っている。(未解決だけれど、今後はSSHをメインで使うので多分大丈夫)
* rootユーザーの初期パスワードはコントロールパネルログイン用パスワードとは違って、仮登録メールで送られてくるのに気づかず困った。
* 公開鍵認証を使ったログインの設定部分の解説(https://help.sakura.ad.jp/app/answers/detail/a_id/2425)で、RSA認証を有効にする設定が書かれていなかった。
* チュートリアルにしたがってTeratermで作ったSSHログイン用秘密鍵はそのままではPuttyで使えないので、Puttygenを使ってPuttyで使える形式に変換しないといけなかった。
Unity4.6系+iOSで@try~catchにCannot use @try with Objective-C的なエラーが出た時の対処法

##Unity4.6系+iOSで@try~catchにCannot use @try with Objective-C的なエラーが出た時の対処法

Objective-Cのモジュール？をEnableにしないといけない。

```
xcode->Build Setting->Apple LLVM **(数字) -Language -Objective C
のEnable Objective-C Exceptions をYesにする
```

これだけ。
Apple LLVM **(数字) -Language -Objective CはBuild Settingの検索バーで[Objective-c]って検索すると出やすい
HTTP基礎知識

HTTPの基礎知識のおさらい兼備忘録

#TCP/IP
インターネットに関連するプロトコルの総称。
HTTPもこの中に含まれる。
（ex.）TCP, IP, FTP, HTTP, DNS, SNMP etc...

#HTTPの階層
HTTPには以下の4つの階層が存在する。

|        階層       |    概要     
|:------------------|:------------
| アプリケーション層 | アプリケーションで使用する通信の動きを決定する。TCP/IPもこの中に含まれる
| トランスポート層   | ネットワークで接続されているコンピュータ間のデータの流れを提供する。  TCPとUDPがある。
| ネットワーク層     | ネットワーク上のパケットの移動を担う層。ネットワークの経路もこの層で決める。
| リンク層           | ハードウェアに関連する設定情報を担う層。デバイスドライバとの接続やケーブルの接続など。


#通信順序
実際に通信を行う際には以下の形で情報を取り扱う。

送信時：

1. アプリケーション層で要求するWebページをHTTPリクエストで指定する。
2. トランスポート層でアプリケーション層から渡ってきたHTTPリクエストを細かく分け、通し番号とポート番号を付与する。
3. ネットワーク層で宛先のMACアドレスを追加する。
4. リンク層からHTTPリクエストが送信される。

受信時：

1. リンク層からHTTPリクエストを受信する。
2. ネットワーク層でMACアドレスの情報を取り外す。
3. トランスポート層で細かく分けたHTTPリクエストを、通し番号とポート番号を元に組み立てる。
4. アプリケーション層で指定されたWebページの情報を取得する。


#参考資料
学習にあたり以下の資料を参考にしました。

* [HTTPの教科書](http://www.amazon.co.jp/HTTP%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8-%E4%B8%8A%E9%87%8E-%E5%AE%A3/dp/479812625X)
Mavericksで2015-004をインストールしたらSSL証明書がおかしくなる件

```
VeriSign Class 3 Public Primary Certification Authority - G5
```

この証明書の適用範囲？が狂ってるせいで、twitterやappstoreに入れなくなります。
解決方法は、キーチェンアクセスでSSLの信頼を「常に信頼」に設定すれば直ります。

![スクリーンショット 2015-04-12 13.31.26.png](https://qiita-image-store.s3.amazonaws.com/0/10487/4d0a05e7-bfd8-0cad-1361-f1caf6378019.png)

証明書についての知識が足りないので、このやり方が一番安全である自信はない。
scalikejdbcで独自の型を扱う

TreasureDataをscalikejdbcで操作するときに、独自のカラム型に対応する方法を試す。

TreasureData(presto)には、Arrayのカラムが使えてvarcharやintを入れられる。

取得すると、`[1,2,3]`のようなjson形式の配列で返ってくる。

## 独自の型とテーブル

型とテーブルの構造は以下とする。

```scala
case class TDArray[A](values: Seq[A])
case class Foo(
  id: Int,
  arrStr: TDArray[String],
  arrInt: TDArray[Int],
  time: Long)

object Foo extends SQLSyntaxSupport[Foo] {
  override val tableName = "foo"
  override val columns = Seq("id", "arr_str", "arr_int", "time")
  def apply(rn: ResultName[Foo])(rs: WrappedResultSet): Foo = autoConstruct(rs, rn)
}
```

これをreadする。

```scala
object FooDao {
  val f = Foo.syntax("f")
  def read(id: Int)(implicit session: DBSession = AutoSession): Seq[Foo] = {
    withSQL {
      select
        .from(Foo as f)
    }
      .map(Foo(f.resultName))
      .list().apply()
  }
}
```

このままだと、TDArrayをどうしたらいいか分からないのでエラーになる。

結果セットから、値を取得するときにTypeBinderを経由して取得しているようなので、TypeBinderに独自の定義を追加すればいい。

型クラスになっているので、implicitで型を定義する。

```scala
object TDArray {
  val stringTypeBinder: TypeBinder[TDArray[String]] = {
    TypeBinder(_ getString _)(_ getString _).map { s =>
      if (s == null) TDArray(Seq[String]())
      else TDArray(s.init.tail.replace("\"", "").split(',').map(_.trim))
    }
  }

  implicit val tdString: TypeBinder[TDArray[String]] = stringTypeBinder
  implicit val tdInt: TypeBinder[TDArray[Int]] = stringTypeBinder.map { tda => TDArray(tda.values.map(_.toInt)) }
}
```

jsonのパースの所はてきとう。

これでreadできるようになった。

## もうちょっと説明

まずFooのapplyで使っているautoConstructのマクロで、[WrappedResultSetのget](https://github.com/scalikejdbc/scalikejdbc/blob/master/scalikejdbc-syntax-support-macro/src/main/scala/scalikejdbc/autoConstruct.scala#L14)を呼ぶコードを作っている。

[WrappedResultSetのget](https://github.com/scalikejdbc/scalikejdbc/blob/4fa10fca87e6f712074852726bf6691f4ecabcd4/scalikejdbc-core/src/main/scala/scalikejdbc/WrappedResultSet.scala#L457-L460)は、TypeBinderを取得してapplyしてる。構文が分からない場合は"scala 型クラス"でｸﾞｸﾞﾙとよろし。

なので、TypeBinderのimplicitを定義すればいいというわけだ。

おわり

追記

ちなみにWrappedResultSetのarrayは、TreasureDataのJDBCドライバがgetArrayをサポートしていないのでUnsopported..の例外になる。╭(°ㅂ°`)╮

（´-`）.｡oO（TreasureDataよく分からん...)
metaタグ出力のヘルパー関数

HTMLのmetaタグ、最近はviewportやらogpやらtwittercardsやらでいっぱい出力しないといけなくなった。
構文的に冗長で書くのが面倒なので、PHPで整理して、もう少し短く書けるようにしてみる。

```php
<?php
function meta($meta, $isXhtml=false, $charset=null)
{
    if (!is_array($meta) && !is_object($meta)) {
        throw new InvalidArgumentException('$meta should be Traversable or array. ' . gettype($meta). ' passed.');
    }
    $html = [];

    $TAGEND = $isXhtml ? ' />' : '>';
    $charset = (string)$charset ?: ini_get('default_charset') ?: 'UTF-8';

    foreach ($meta as $attr => $defs) {
        $attr = htmlspecialchars($attr, \ENT_COMPAT, $charset);

        if (is_array($defs) || is_object($defs)) {
            foreach ($defs as $label => $val) {
                $label = htmlspecialchars($label, \ENT_COMPAT, $charset);
                if (is_array($val) || is_object($val)) {
                    foreach ($val as $v) {
                        $v = htmlspecialchars($v, \ENT_COMPAT, $charset);
                        $html[] = '<meta ' . $attr . '="' . $label . '" content="' . $v . '"' . $TAGEND;
                    }
                } else {
                    $val = htmlspecialchars($val, \ENT_COMPAT, $charset);
                    $html[] = '<meta ' . $attr . '="' . $label . '" content="' . $val . '"' . $TAGEND;
                }
            }
        } else {
            $defs = htmlspecialchars($defs, \ENT_COMPAT, $charset);
            $html[] = '<meta ' . $attr . '="' . $defs . '"' . $TAGEND;
        }
    }

    return implode(PHP_EOL, $html);
}
```

## 使い方

連想配列かTraversableの定義を読み込ませると、metaタグの羅列になって返ってくる。
HTMLのエスケープは勝手に行うようにしてある。

```php
$meta = [
    'charset' => 'utf8',
    'http-equiv' => [
        'X-UA-Compatible' => 'IE=edge',
        'Content-Type' => 'text/html; charset=UTF-8',
    ],
    'name' => [
        'keyword' => 'hoge,fuga,muga',
        'description' => 'hogehoge',
        'twitter:card' => 'photo',
        'twitter:title' => 'Mountain sunset',
        'twitter:image' => 'http://example.com/hoge.jpg',
    ],
    'property' => [
        'og:site_name' => 'FOOOOO!',
        'og:title' => 'foooooo',
        'og:description' => 'hogehoge',
        'og:image' => [
            'http://hoge.com/hoge1.jpg',
            'http://hoge.com/hoge2.jpg',
        ],
    ],
];
echo meta($meta);
```

```html:出力イメージ
<meta charset="utf8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="keyword" content="hoge,fuga,muga">
<meta name="description" content="hogehoge">
<meta name="twitter:card" content="photo">
<meta name="twitter:title" content="Mountain sunset">
<meta name="twitter:image" content="http://example.com/hoge.jpg">
<meta property="og:site_name" content="FOOOOO!">
<meta property="og:title" content="foooooo">
<meta property="og:description" content="hogehoge">
<meta property="og:image" content="http://hoge.com/hoge1.jpg">
<meta property="og:image" content="http://hoge.com/hoge2.jpg">
```

og:imageを複数指定するような場合は、配列化しておくとその分だけ出力する。
なお、第二引数をtrueに指定すると、タグの末尾が `/>`になる。
PHP7調査(14)メンテされていないエクステンション・SAPIの整理

# 消えるエクステンション

以下のエクステンションがPHP7から削除されます。

* ereg
* mysql
* mssql
* sybase_ct

eregはPHP 5.3から非推奨でしたが、PHP7で本当に消えます。10年前に書いたコード大丈夫かなー、なんて心配になりますね。

mysqlエクステンションも消えます。つまり、mysql_から始まる関数群が全滅します。[mysqli](http://php.net/manual/ja/book.mysqli.php)か[pdo_mysql](http://php.net/manual/ja/ref.pdo-mysql.php)を使ってねという意図ですが、古いコードだと影響が大きそうですね。

mssqlとsybase_ctはそれぞれネイティブのドライバがPHP本体に同梱されなくなります。Windows+PHP+SQL Serverであれば[MS純正のドライバがある](https://msdn.microsoft.com/en-us/sqlserver/ff657782.aspx)ようですが、Linuxから使いたい場合はODBCで頑張れってことなんでしょうかね。もう一つの選択肢として[pdo_dblib](http://php.net/manual/ja/ref.pdo-dblib.php)が生き残るので、どちらの方がマシかということになりそうです。

# 消えるSAPI

以下のSAPIがPHP7から削除されます。

* aolserver
* apache
* apache2filter
* apache_hooks
* caudium
* continuity
* isapi
* milter
* phttpd
* pi3web
* roxen
* thttpd
* tux
* webjames

色々なくなりますが、正直なところ知らないものが多いですね…。

Apache1系のSAPIが削除されてしまいますが、いまどき誰も使っていないから大丈夫…ですよね？Apache2系はapache2handlerが残るので、ご安心を。

万一今回削除対象のWebサーバを使っている場合でも、fpmで動かせば移行は可能だろうと思います。

# 参照

* [PHP RFC: Removal of dead or not yet PHP7 ported SAPIs and extensions](https://wiki.php.net/rfc/removal_of_dead_sapis_and_exts)
* [PHP RFC: Remove deprecated functionality in PHP 7](https://wiki.php.net/rfc/remove_deprecated_functionality_in_php7)
【Rails】Helperタグのオプション内に条件式追加

簡単そうで知らなかったこと。かゆいところに手が届いた感じのtipです。

```<%= link_to ~~, class: "もし~~ならhoge_classここに追加したい"%>```
っていう場合どう書けばいいか知っていますか。

```<%= link_to ~~, class: <%= "hoge_class" if hoge %> %>```
とは書けない...。 <%= タグが途中の %>タグで閉じられちゃうからね。
じゃあ、もう

```
<% if hoge %>
  <%= link_to ~~, class: "hoge_class" %>
<% else %>
  <%= link_to ~~ %>
<% end %>
```
って書くしかない？長！かっこわる！繰り返し！
ってなるわけで。

じゃあどう書くか
```<%=link_to ~~, class: "#{'hoge_class' if hoge}"%>``` ドン！！！
```#{}```がstring内で式展開して、その中での返り値になるので、こう書けば万事解決です。

意外と忘れがちだった#{}の便利な使い方tipでした。
【Rails】API設計からpathとparamの役割分担を考える

## pathで表現するか、paramに持たせるか。  
### pathを広い意味を持ちすぎたものにすると、後でapiを細分化するときにこまる。
####(例)学校のある学年のあるクラスの生徒達の情報を持ってくるAPIを考える。
##### こんなpathはどうか?
path: ```/example_school```
param: ```year_id, class_id```
これは、ちょっとpathが目的に対して広い意味持ちすぎ。今後
```/example_school/years```でyear(学年)の候補とったり、
```/example_school/years/:year_id/classes```で、classの候補とったりというapiを作る可能性あることを考えると、いまそんなに広い意味を持ったpathを名付けるべきじゃない。よね。つまり、pathはある程度、目的を明示していて、他と被らないものにするべきってことですね。

#### じゃあどこまで細かくpathで指定するべきか？
```目安として `/resource/identifier/resource` 以上に URL を深くすべきでない```らしい。( http://d.hatena.ne.jp/cou929_la/20130121/1358776754 )  twitterのAPIとかも確かにそうなってる。
今回は、```/example_school/classes/:class_id``` でyear_idはparamで渡すのが他のapiたちとも被らずシンプルかね。
 
# paramとpathの概念
## そもそもparamとpathって？
```http://localhost/example_school/classes/:class_id?year_id=1``` ていうURLがあるとすると、```?```より手前部分がpathで、それ以降がparamsに該当する。
paramもpathもcontrollerに情報を渡して、その情報を元にcontrollerがactionを起こすという点では共通してる。じゃあ、 **どの情報をpathに書いて、どの情報をparamに書くの？**という疑問に答えていく。

  pathは、application側で特定のcontrollerアクションに振り分けるのに使用される。極端に言ってしまえば、使用するアクションが一つしかなくて、振り分けもする必要がないなら、```example_school/```とかだけにpathをして、残りの情報を全てparamで渡してaction側で同じ処理をすることは可能である。 **もしexample_schoolに関するactionが本当にそれ一つしかないのであれば。** でも実際には、「example_schoolのclasses一覧を取りたい〜」、とか、「example_schoolのyears一覧を取りたい〜」とか、他のactionも作りたいため、それらのactionと区別すべく、
  「example_schoolのclass一覧」```/example_school/classes```
  「example_schoolの特定のclass」```/example_school/classes/:class_id```
  「example_schoolのyears一覧」```/master_data/years```
  みたいに、pathでactionの目的をある程度細かいところまで指定させることにより、actionへの振り分けを直感的に可能にしてる。それで、さらに必要な情報は、paramで補っていくのである。
  ていう風に、pathもparamもcontrollerのactionに必要な情報を渡す点では共通しているが、 
  
#### pathには **使用されるactionを指定する際に必要な情報を盛り込み**、
#### paramには **action指定には使わないがactionを実行する上で必要な情報を盛り込む**
という風にpathとparamは区別できますね。
Scalaプログラムミング【インストール】

何かの本で見ていらい興味をもっていた言語を少し勉強しようと思いはじめました。
というのも、Javaと比較し、コード量が1/3～1/2程になるといわれています。
実装量が少ないといことは、[不具合が少なくなる]、[生産性あがる]と思ってます。

#言語の特徴
1.オブジェクト指向言語である。
　全てがオブジェクトのため、Javaのようなint等々のプリミティブな型は、ない。
2.Javaの豊富なライブラリが使える。
　というのも、コンパイルしたモジュールは、JVMで動きます。
3.関数型プログラミングができる。
　整数や文字列などと同じように、[関数]を引数や戻り値にできるそうです。

っとまぁそれ以外にいろいろ特徴はありますが、割愛(今後随時特徴をかければ、よいかなと。)

#インストール(Windows環境です。。)
※JDKが入っている前提なので、JDKをインストールしていない方は、そちらを先にインストールしてくださいね。
また、インストーラを使用してインストールしてます。zip回答からもできるっぽいです。

##1.ダウンロード
###1-1.以下にアクセスして、[Scala 2.11.6]をクリックしてダウンロード(scala-2.11.6.msi)。
http://www.scala-lang.org/download/

![1.png](https://qiita-image-store.s3.amazonaws.com/0/71455/52edcea1-2ccc-584c-35ec-d390e748a84f.png)


##2.インストール
ダウンロードしたmsiファイルをダブルクリックし、インストーラを実行する。
###2-1.Nextを押下する。
![2.png](https://qiita-image-store.s3.amazonaws.com/0/71455/32656ff9-2085-d682-4550-e70652e3edbc.png)

###2-2.チェックボックスをOnにし、Nextを押下する。
![3.png](https://qiita-image-store.s3.amazonaws.com/0/71455/7fee4063-3ecd-2e27-1efb-9858b7f07160.png)


###2-3.環境に合わせて、選択肢、Nextを押下する。(当方は、何もせず、デフォルトでインストしました。)
![4.png](https://qiita-image-store.s3.amazonaws.com/0/71455/69875b44-957e-14bf-1832-7eb19748aec8.png)


###2-4.Installをクリックし、実行
![5.png](https://qiita-image-store.s3.amazonaws.com/0/71455/3a873fa6-625e-03be-f447-8ebf96a01916.png)

###※インストール中は、こんな感じです
![6.png](https://qiita-image-store.s3.amazonaws.com/0/71455/fc69fb15-7ec0-a2db-dd9f-0135af28f975.png)

###2-5.インストールが完了すると、以下のようになるので、Finsihで終了します。
![7.png](https://qiita-image-store.s3.amazonaws.com/0/71455/cf4c82af-8c5f-ac92-21da-5051b70795f2.png)

###2-5.インストールが完了すると、以下のようになるので、Finsihで終了します。

##2.確認
###2-1.コマンドプロンプトを起動し、「scala -version」と入力し、バージョンが表示されることを確認できれば、インスト完了です。
![8.png](https://qiita-image-store.s3.amazonaws.com/0/71455/f3c301c2-cdd1-d89a-6793-82fa878daf50.png)

###※環境変数のPATHに「Scalaのインスト/bin」が追加されています(まぁだからコマンドプロンプトでバージョンが表示されるんですけどね。)。
![9.png](https://qiita-image-store.s3.amazonaws.com/0/71455/128e5419-b2a4-95de-a1cc-9591de864fe3.png)


インストールは、これにて終了です。
【MySQL】MySQLに接続


#mysql -u username -D DBname -ppasword
MySQLに接続する。
##option
`-u`
MySQLに接続するユーザー名。
「username@hostname」の形式で指定する。
localhostの場合に限ってホスト名は省略する事ができる。

`-D`
接続するデータベース名を指定する。

`-p`
パスワードを指定する。
-pとpasswordの間に空白を入れずに指定する。
この方法だとパスワードが表示されてしまう為、通常は-pか--passwordだけで実行する。
-pまたは--passwordのみで実行すると`Enter password:`と表示されるのでパスワードを入力。伏せ字となる為、パスワードを入力しても、画面上には何も表示されない。

##example
`mysql -u root -p`
Swift さくっと確認したい基礎文法 [Optional(オプショナル) その１]



今回はボリュームが多いので、２回に分けて書いていきます。
・その１：オプショナルの概要
・その２：「オプショナルバインディング」と「オプショナルチェインニング」

# Optional(オプショナル)

Swiftの定数、変数はnil(値なし。java等でいうnull)を代入できません。
これをOptional型でラップすることでnilを入れることができるようになります。

イメージが浮かばないと思うので
さっそく例を見ていきましょう。

通常はnilを代入できないため、下記の場合、エラーになります。

```swift:swift
var myName:String = "yuinchirn" // "yuinchirn"
myName = nil // エラー
```

nilを代入したい場合は、
`myName:Stirng?`のように型の後ろに?を付けます。

```swift:swift
var myName:String? = "yuinchirn" // Optional("yuinchirn")
myName = nil // OK
```

この?が何なのかというと、

**`Optinal<String>`という形でString型をOptional型という型でラッピングするということをやっています。**
つまり下記と同じ意味です。

```swift:swift
var myName:Optional<String> = "yuinchirn" // Optional("yuinchirn")
myName = nil
```


これによって`myName`はOptinal型、オプショナルバリューになります。
オプショナルバリューの状態では、元の型のメソッド操作や値の操作ができません。


```swift:swift
var myName:String? = "yuinchirn"
var newMyName = "new_" + myName // myNameがオプショナルバリューの状態なのでエラーになる。
```

これでは使い物にならないので、
元の型のメソッド操作や値の操作をしたい場合は、
一時的にオプショナルバリューをアンラップし元の型に戻してあげます。

その場合は変数名に`!`をつけます。
今回の場合は`"new_" + myName!`といった感じです。

```swift:swift
var myName:String? = "yuinchirn"
myName = nil
var newMyName = "new_" + myName! // OK
```

## オプショナルバリューがnilだった場合の初期値設定のやり方

オプショナルバリューがnilだった場合に
他の値を入れて後続の処理を行いたいというシチュエーションがあると思います。

その場合に使うのが、`??`です。

```swift:swift
var num:Int? // nil
let price = 500 * (num ?? 10) // numがnilなので10で計算される。
println(price) // 5000

```


上記のように`(［オプショナルバリュー］?? 値)`にすることで
[オプショナルバリュー]がnilの場合、[値]に設定された値が利用されます。
※但し、上記の場合には`num`に10は代入されません。


```swift:swift
var num:Int? // nil
num = 5
let price = 500 * (num ?? 10) // numが5なので5で計算される。
println(price) // 2500

```

もちろん上記のように、nilでなければその値が使われます。


オプショナルを使ったスマートなnilチェックの方法などを紹介した下記も合わせてご覧ください。
[Swift さくっと確認したい基礎文法 [Optional(オプショナル) その２]](http://qiita.com/yuinchirn/items/39e8b067d6c766b45971)
Using sqlacodegen

# Using [sqlacodegen](https://pypi.python.org/pypi/sqlacodegen) #

### Setup mysql, create user *ants* ###

```
shell> mysql -u root
mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('newpwd');
mysql> CREATE USER ‘ants'@'localhost' IDENTIFIED BY 'some_pass';
mysql> GRANT ALL PRIVILEGES ON angir.* TO 'ants'@'localhost' WITH GRANT OPTION;
```

### Import schema from a mwb file ###
Open the mwb file in MySQLWorkbench and export the schema as `angir.sql`.
Replace `default_schema` with `angir`.

```
shell> mysql -u ants
mysql> create database angir;
mysql> use angir;
mysql> source path/to/angir.sql;
```

### Install sqlacodegen, oursql###

```sh
pip install sqlacodegen
pip install oursql
```

### Make models code from the created schema ###

```sh
sqlacodegen mysql+oursql://ants:some_pass@localhost/angir > generated_models.py
```
CakePHPの環境をMac上にcomposerで作る（リンク中心）

ちょっと必要に迫られたので。
CakePHPは3系のほうがいいのだろうけれども。


# Composerでインストール

あまり詳しくないので下記などを感謝しつつつまみ読みしながら。
http://qiita.com/youukkari/items/806e506ad3925bd91881

composer.json はどうやらvendorディレクトリの指定などが必要そうだったので下記のようになった。また、バージョンをいくつか新しいものに変えた。
そうしないと途中で「あれ？Vendorってどれ？」みたいになる。他の情報を参照するとこう書いている人が多かったのでベストプラクティス的な何か？（詳しい人おしえて）

あとプラグインはとりあえず入れたけれどあとで調べてみようと思う。

```json
{
  "extra": {
    "installer-paths": {
      "app/Plugin/Migrations": ["cakedc/migrations"],
      "app/Plugin/Users": ["cakedc/users"],
      "app/Plugin/Search": ["cakedc/search"],
      "app/Plugin/Utils": ["cakedc/utils"],
      "app/Plugin/Datasources": ["cakephp/datasources"],
      "app/Plugin/DebugKit": ["cakephp/debug_kit"],
      "app/Plugin/BoostCake": ["slywalker/boost_cake"],
      "app/Plugin/aws-sdk-php": ["aws/aws-sdk-php"]
    }
  },
  "require" : {
    "php": ">=5.2",
    "ext-mcrypt": "*",
    "cakedc/migrations": "2.3.*",
    "cakedc/users": "2.0.*",
    "cakedc/search": "2.2.*",
    "cakedc/utils": "1.4.*",
    "cakephp/datasources": "2.3.x-dev",
    "cakephp/cakephp" : "2.6.*",
    "slywalker/boost_cake": "dev-master",
    "aws/aws-sdk-php": "2.*"
  },
  "config": {
        "vendor-dir": "Vendor/"
  },
  "require-dev": {
    "phpunit/phpunit": "4.6.*"
  }
}
```

# Migration は 下記のように真似してみたらあっさりできた。

http://www.sssg.org/blogs/hiro345/archives/15888.html
日本語WInodws ServerのISOイメージをBoot From Imageからマウント

 今日はISOイメージから仮想サーバーにOSをインストールというのを試してみました。OSはWindows 2008 R2 SP1です。実は内容はほとんど　"ShinobiLayer: CentOS7のLiveCDをBoot From ImageからISOマウント "
(http://qiita.com/testnin2/items/7db7e4d3726dccb4f8a3) 
と同じだったのですがポータルからISOをアップはできず、ツール(CloudBerry)でアップしたものはImage Menuで認識されずだったのでLinuxのcurlコマンドでISOイメージをアップしました。Ticketで確認したところアップするときにMINEタイプを指定しないといけないようです。ISOイメージの作成の仕方がちがうのでしょうか？そこのところはまだわかってませんが、とりあえずこちらでできました。手順は

-仮想サーバーをオーダー(CentOS 6.x minimal)
-Curlをインストール
-Windows ISOをダウンロード
-Object storageにアップロード
-イメージ管理メニューでアップロードしたイメージをImage TemplatesにImport
-仮想サーバーでISOイメージからOS reload

　なおライセンスはSOftLayerのWindowsライセンを使うことになります。

1.仮想サーバのオーダー
こちらを参考にオーダーしてください。
https://gg-web.jp/document/ConfigGuide/01002/index.html

なおスペックに関しては後ほどこのサーバーにWindows Serverを入れるのでちょっと高めにしました。
	CPU: 2Core, Memory: 4GB, HDD 100GB

2.Curlをインストール
今回WindowsのISOイメージをLinuxのサーバーからCurlを使ってダウンロードします。
　# yum –y install curl
ポータルからオブジェクトストレージの中を見るとファイルがアップされているのがわかります。

3.日本語WindowsにISOイメージ（評価版）をマイクロソフトからダウンロード
こちらのサイトからダウンロードしました。
http://www.microsoft.com/ja-jp/server-cloud/local/windows-server/2008/r2/trial-software.aspx

4.Object storageにアップロード
今回はこちらの資料を参考にしてファイルのアップロードを行いました。
http://www-06.ibm.com/ibm/jp/cloud/pdf/softlayer_handson_storage_guide.pdf
１７～１８ページを参考にコマンドをインストール、ファイルをアップロードしました。
# curl -s -X PUT -T 7601.17514.101119-1850_x64fre_server_eval_ja-jp-GRMSXEVAL_JA_DVD.iso -v -H "X-Auth-Token: AUTH_tk31015a431c6946ec83a254**********" https://tok02.objectstorage.softlayer.net/v1/AUTH_e0c52d9d-6294-4353-8e92-89**********/windows/7601.17514.101119-1850_x64fre_server_eval_ja-jp-GRMSXEVAL_JA_DVD.iso
 (上記コマンドは一行です)

5.イメージ管理メニューでアップロードしたイメージをImage TemplatesにImport
 ポータルから　Device – Manage – Image と選択しImage Templateのメニューを出してください。そして右上のImport imageをクリックしてください。
![image2.jpg](https://qiita-image-store.s3.amazonaws.com/0/59741/b0c99bda-4924-6563-adb3-e8fd166c446b.jpeg)
  次に先ほどのオブジェクトストレージのファイルを左側で指定してください。次に右側のImage Nameを入力（任意の名前で結構です）して、右下のImportをクリックしてください。
![image3.jpg](https://qiita-image-store.s3.amazonaws.com/0/59741/afb9f70b-afaa-c729-dc3f-487c52a085f1.jpeg)

 Image Templates一覧に先ほどアップしたISOファイルが表示されます。

5.	仮想サーバーでISOイメージからOS reload
 今回オーダーした仮想サーバーをDevice Listから選択し右側のActionからBoot From Imageを選択し先ほどImportしたimageの右側でBoot From This Imageをクリックしてください。

![boot.jpg](https://qiita-image-store.s3.amazonaws.com/0/59741/03564328-d72d-3dc2-3f4e-102eb8dc8a39.jpeg)

システムの準備が始まり終了すればリモートデスクトップ接続ができます。接続すれば以下のように日本語Windowsが立ち上がります。

![win-j.jpg](https://qiita-image-store.s3.amazonaws.com/0/59741/5904115b-d739-a9cb-9439-492e2d4f31cd.jpeg)
勝手に添削 - ガウシアンを一様乱数でモンテカルロ積分した際の一様乱数の幅依存性

@teramonagi さんのこういう話がある。

- [ガウシアンを一様乱数でモンテカルロ積分した際の一様乱数の幅依存](http://d.hatena.ne.jp/teramonagi/20150411/1428765541)

この結果、ちょっとわかりにくいのではないか。
こういうふうにした方がいいのでは？

```r:R
library(pforeach)
library(ggplot2)
library(dplyr)

f <- function(x){exp(-0.5*x^2)}
N <- 10^3
M <- 1000
L <- c(1:10, 20, 50, 100)

npforeach(len = L, .c=rbind)({
  replicate(M, {
    len/N*sum(f(runif(N, min=-0.5*len, max=0.5*len)))
  }) -> y
  data.frame(L=len, y=y)
}) -> result

ggplot(result, aes(x=factor(L), y=y)) + geom_boxplot()

result %>%
  group_by(L) %>% 
  summarize(mean=mean(y), sd=sd(y), rmse=sqrt(mean((y-sqrt(2*pi))^2)))
```

![Rplot.png](https://qiita-image-store.s3.amazonaws.com/0/2570/d619f815-ec54-b1de-3408-0dd3ac4ddd9b.png)

```:結果
     L      mean          sd       rmse
1    1 0.9598293 0.001132006 1.54679938
2    2 1.7110282 0.007528361 0.79563568
3    3 2.1709905 0.020769534 0.33627911
4    4 2.3929554 0.037069127 0.11955867
5    5 2.4734011 0.051708657 0.06144228
6    6 2.5005220 0.067216346 0.06745966
7    7 2.5044112 0.074807102 0.07480255
8    8 2.5105358 0.089681732 0.08972201
9    9 2.5071252 0.098861618 0.09881342
10  10 2.5027876 0.106616009 0.10663188
11  20 2.5079396 0.172491364 0.17241008
12  50 2.5071544 0.287071200 0.28692811
13 100 2.4927808 0.420251117 0.42026913
```

enjoy!
Swift をターミナルでざっとペロる #1 Hello World

![mainimage1.jpg](https://qiita-image-store.s3.amazonaws.com/0/9988/8be501d5-8f1e-9010-2ce5-30b3bbd87bbd.jpeg)



## 環境

* OS X Yosemite 10.10.3
* Swift 1.2
* iOS 8.3
* iTerm 2.0.0



## 前提

* App Store で XCode を 最新のものにアップデートしておく (2015年4月12日の時点では上記状態に)

![スクリーンショット 2015-04-12 9.02.00.png](https://qiita-image-store.s3.amazonaws.com/0/9988/35a2b391-befd-09c4-10b2-b266b8bc22e9.png)



## ターミナルから swift を呼び出してみる

```
$ swift
Welcome to Swift version 1.2. Type :help for assistance.
```

終了は :quit で行える

```
$ swift
Welcome to Swift version 1.2. Type :help for assistance.
  1> :quit

$
```



## Hello World

Vim などの エディタを開き、以下のように書くよ

```swift

println("Hello World!")
```

swift では 標準出力は println() で行けるようです。
ってことでこれを hello.swift などと言ったようなファイル名で保存するよ。次に、実行は "swift ファイル名" で行うよ

```
$ swift hello.swift

Hello World
```


僕の環境では .bash_profile などに PATH を通さなくても動いた。しかもいろいろなサイトを調べてみると、外部スクリプトの実行へは -i のオプションが必要だと書いてあるような記事もあったけど、僕の環境では "swift ファイル名" で実行できた。めでたし！



## 一応 swift の場所の確認をしておく

### まずは Xcode の場所

```
$ find /Applications -name "Xcode*app" -maxdepth 1

=> /Applications/Xcode.app
```


### この Xcode.app の場所をもとに swift を探す

```
$ find /Applications/Xcode.app/ -name swift | grep /bin/swift

=> /Applications/Xcode.app//Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift
```

### もし .bash_profile などに path を通す必要があったりするのならば、見つけた swift の PATH を元に

```bash:.bash_profile

export PATH=(/Applications/Xcode.app//Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/):$PATH
```

てな感じで。
iOSのDBは、何が良いか調べてみたリンクまとめφ(・・*)


前提として、今作ろうとしていたアプリは、基本はローカルで持てるものを考えていたので、
mBaaSについてもふれてますが、ローカルで完結するのをイメージして調べたものです。


## CoreData

#### **CoreData 日本語ドキュメント**
https://developer.apple.com/jp/documentation/CoreData.pdf

##### 他参考
サルでもわかる Core Data 入門【概念編】 - A Day In The Life
http://d.hatena.ne.jp/glass-_-onion/20111015/1318667971


## CoreData を簡単につかえるようにしたライブラリ

※Swiftのイベントで出会ったiOSの先輩エンジニアの方から、
応用するときに困ったりするかもと聞きました。


#### **Magical Record**
magicalpanda/MagicalRecord 
https://github.com/magicalpanda/MagicalRecord

##### 他参考
生産性ガチアゲなオープンソースiOSライブラリ（3）：iOSアプリのデータ操作はMagical Recordでマジ簡単！ (1/2) - ＠IT 
 http://www.atmarkit.co.jp/ait/articles/1307/10/news017.html


#### **ObjectiveRecord**
Rails風に使えるライブラリ
supermarin/ObjectiveRecord
https://github.com/supermarin/ObjectiveRecord


## Realm (レルム)

#### **Realm 公式**
amobile database that replaces Core Data & SQLite
モダン/ios+Android
動作が速い
新しいくてアップデートが頻繁
http://realm.io/jp/

##### 他参考
CoreDataはもう古い？新しいモバイルデバイス向けデータベース「Realm」を使ってみた (Swift/Objective-C) - Qiita http://qiita.com/caesar_cat/items/632d1e85a67f2c65a473


## FMDB

#### **fmdb /github**
SQLiteをobject-cで使えるようにしたもの
https://github.com/ccgus/fmdb


##### 他参考

CoreDataがダメならFMDBを使えばいいじゃない | 思い立ったが吉日
http://omokichi.sakura.ne.jp/blog/coredata

iOS SQLite データベースの実装 - NAVER まとめ
http://matome.naver.jp/odai/2140523049452281301


## MBaaS

#### **MBaaS(MobileBackend as a Service)とは、**
スマートフォン向けのWebアプリケーションが必要とするサーバ側の様々な機能を
インターネットを通じてサービスとして提供するクラウドサービスの一種。

#### 【開発】MBaaSについてまとめてみた(比較表あり) - NAVER まとめ
http://matome.naver.jp/odai/2138620499863058801

↓
中でも周りの人から良く聞くもの
#### **Parse**
https://parse.com/
周りの人から聞いたコメント
・少し遅いかも？
・Facebookが買収して盤石そう
・無料範囲で結構使える


##### Parse他参考
mBaaSを使ってみよう！超簡単にSwiftでTwitterライクなポスト機能を作る(Xcode6 beta5, Parse.com) - Qiita
http://qiita.com/kiiita/items/bc62293f6c4d479993c1



## 比較記事

CoreDataからRealmに移行してわかったメリット/デメリット - Qiita
http://qiita.com/yusuga/items/add6f9e290b92f42104a


## 結果、使おうと思ったもの

**Realm**が、総合的に、自分にはよさそうです。

CoreDataは、ややこしく感じてましたが、ぱっと見すんなり入ってきやすそうです。
また、ローカルで通信しない環境でサクサク使えるものを考えていたのと、
Swiftもくもく会で出会った、iOS先輩エンジニアの方もおすすめされてたので
これを使ってみようかなと思います。
ESP8266にNodeMCUをアップロードしてHello Worldする

[ESP8266](http://www.esp8266.com/)に[NodeMCU](http://www.nodemcu.com/index_en.html)のファームウェアを使うと数百円でWi-Fiが使えてLuaでプログラミング可能なマイコンを作ることができます。Node.jsからハードウェアを操作できるWi-Fiモジュールを搭載したマイコンに[Tessel](https://tessel.io/)や[Spark Core](https://www.spark.io/)などありますがまだまだ高価です。ArduinoからWi-Fiモジュールを操作してMQTT通信をするスケッチ作成に苦労しているのでLuaから制御ができるのはとても魅力的です。

## NodeMCUのアップロード

### nodemcu-firmware

[nodemcu-firmware](https://github.com/nodemcu/nodemcu-firmware)のリポジトリから最新ファームウェアの[nodemcu_latest.bin](https://github.com/nodemcu/nodemcu-firmware/raw/master/pre_build/latest/nodemcu_latest.bin)からダウンロードします。

### nodemcu-flasher

64bit版Windows用の[nodemcu-flasher](https://github.com/nodemcu/nodemcu-flasher)を使いNodeMCUファームウェアをESP8266にアップロードします。ファームウェアは0x000000に書き込みます。Windowsホストマシンとの接続は[前回](http://qiita.com/masato/items/edd7acce84c30b8e698e)を参考にします。ファームウェアを更新するときはESP8266のGPIO0はGNDに接続して、更新後は忘れず切断しておきます。

![nodemcu.png](https://qiita-image-store.s3.amazonaws.com/0/43745/b21e290f-5948-6a57-9b6c-64df78789d63.png)

## CoolTermからHello World

[NodeMCUのExamples](http://nodemcu.com/index_en.html)を参考にCoolTermから簡単なLuaスクリプトを書いてみます。

```lua
> print("Hello World")
Hello World
> 
```

![nodemcu-helloworld.png](https://qiita-image-store.s3.amazonaws.com/0/43745/4b4bc263-ea8e-fc3b-fd58-c8a879ee3af7.png)


### init.lua

init.luaファイルはNodeMCUが起動したとき最初に読み込まれます。CoolTermからLuaスクリプトを書いてinit.luaを作成してみます。

最初に`file.format()`を実行してファイルの初期化をします。アップロード済みのファイルは削除されます。

```lua
> file.format()
format done.
```

print関数を記述してファイルを閉じます。

```lua
> file.open("init.lua","w")
> file.writeline([[print("Hello World!")]])
> file.close()
```

`init.lua`ファイルを読み込み文字列が書き込まれたか確認します。

```lua
> file.open("init.lua", "r")
> print(file.readline())
print("Hello World!")
> file.close()
```

## Lua Loader

CoolTermだとNodeMCUのリスタートがわかりずらいのでLua Loaderをインストールして`init.lua`の動作を確認します。一度CoolTremからESP8266を切断しておきます。

[Lua Loader](http://benlo.com/esp8266/index.html#LuaLoader)は最新版の[LuaLoader.zip 0.87](http://benlo.com/esp8266/LuaLoader.zip)のzipファイルをダウンロードして解凍します。

LuaLoader.exeを管理者権限で実行します。

メニューの`Settings > Comm Port Setting`を開きESP8266を接続したCOMポートを選択します。コンソールに`node.restart()`を入力して実行するとすぐにNodeMCUがリスタートします。`init.lua`に書いたprint関数が実行されました。

```lua
> node.restart()

NodeMCU 0.9.5 build 20150214  powered by Lua 5.1.4
Hello World!
```
TypeScriptとbrowserifyを併用する


どちらもそれほどよくわかっていません。
とりあえず動くところまで持っていくのが大変でした。
sourcemapとかは全然考慮していません。
もっといい方法があれば教えてください。

# 方針

* TypeScriptでもnpm使いたい。
* TypeScriptのimport, exportの挙動が今ひとつしっくりこなかったし、babelに乗り換えるかもしれないのでES6 modulesを使う。
* 基本的にTypeScriptは型チェックだけをやっててほしい。
* いきなりtsifyを使ってハマるのは避けたく、まずはCLIから直で叩く。
* TypeScript 1.5 alpha前提

# やったこと

## reference pathとimportは両方書く

```ts
/// <reference path="./lib/student" />
/// <reference path="../typings/vue/vue.d.ts" />

import Student from "./lib/student";
import Vue = require("vue");
```

コンパイラのエラーを消すのに、reference pathは必須みたい。
requireするパッケージに関しては、dtsmを使ってd.tsを入れておく。

## classはexport default

こうしないとロードできなかった。
defaultじゃなくてもいい方法ないかなぁ。

```ts
export default class Student{
  //
}
```


## TypeScriptの出力は、browserifyに食わせやすい形で出す

例えば、tscのオプションは下記のように。

```sh
tsc src/main.ts --noImplicitAny --module commonjs --outDir build
```

`--module commonjs`しておくと、ES6のimport文をrequireの形に変換してくれる。
そうすれば、browserifyが解決してくれる。

また、`--outDir`を指定しているのは、ソースディレクトリを汚したくなかったのと、
browserifyに依存関係を解決させるため。
（tscにconcatさせる`--out`オプションも試したが、なぜか出力が空になってしまった。）



# リポジトリ

https://github.com/hashrock-sandbox/ts-browserify-example
Lightning Componentにおけるページ遷移

# はじめに
これまで、Lightning Component では複数ページを切り替えるような処理は自力で頑張るしかありませんでした。
4/8にあった Webinar 「 [Lightning Components で次世代のアプリケーション開発 Webinar ](https://www.youtube.com/watch?v=EBXZIpS92jg)」で複数ページを扱う方法が紹介されていたので試してみました。

# サンプル
以下はサンプルソースコードです。

```xml:navigateSampleView1.cmp
<aura:component implements='force:appHostable'>
  <ui:button aura:id="normal" label="Go to SampleView2" press="{!c.pressButton}"/>
</aura:component>
```

```js:navigateSampleView1Controller.js
({
  pressButton: function(component, event, helper) {
    var evt = $A.get("e.force:navigateToComponent");
    evt.setParams({
      componentDef: "c:navigateSampleView2",
      componentAttributes: { whom: "Lightning" }
    });
    evt.fire();
  }
})
```

```xml:navigateSampleView2.cmp
<aura:component>
  <aura:attribute name="whom" type="String" default="world"/>
  Hello {!v.whom}!
</aura:component>
```

# 解説
force:navigateToComponent イベントは Salesforce1 Mobile で動作するため、navigateSampleView1.cmp を表示する Lightning Component タブを作成して、ナビゲーションメニューに追加します。

最初に表示される navigateSampleView1.cmp ではボタンが1つだけ配置されたページになります。ボタンを押下すると、今回の検証対象である 
force:navigateToComponent イベントを発行します。

$A.get("e.force:navigateToComponent") でオブジェクトを取得しています。その後、setParams()でパラメータをJSON形式で指定するようになっており、切替先の Lightning Component の名称を componentDef に、切替先のLightning Component に渡すパラメータを componentAttributes に設定しています。

最後に、fire()メソッドを呼び出すことで表示している Lightning Component が切り替わります。

# 動作確認
実際に、navigateSampleView1.cmp を設定したLightning Component タブを開くと、下記の画面が表示されます。

![スクリーンショット 2015-04-12 2.29.16.png](https://qiita-image-store.s3.amazonaws.com/0/33258/bfc386fe-bfc7-b40d-c641-c41a8c5b4ddf.png)

navigateSampleView1.cmp のボタンを押下すると、下記の画面が表示されます。イベントで指定したパラメータを受け取って画面表示していることがわかります。

![スクリーンショット 2015-04-12 2.29.51.png](https://qiita-image-store.s3.amazonaws.com/0/33258/76974088-c04b-a4eb-97e0-637317cd2a12.png)

# まとめ
今回は、force:navigateToComponent イベントを使って、 Lightning Component を切り替えることでページ遷移を実現する方法を検証しました。
2015/4/12時点では、auradocs にも force:navigateToComponent イベントが載っていないので、まだWebinarで発表があっただけでUndocumentedな情報のようです。

# 今後の課題
force:navigateToComponent イベントは Salesforce1 でしか動作しません。これは独自に作成する Lightning Application に force:navigateToComponent イベントが実装されていないためです。どちらでも動作するようにしたい場合は、Lightning Application に実装してやる必要があると思われます。
RouterBoard OpenWRTへ書き換え(コンパイル)

***内容が古いです***
#概要
RouterBoardの450GをOpenWrtに書き換える方法をソースコンパイルからの手順を書きます。
必ずしもソースからOpenWRTを構築する必要はなく、
450G用のバイナリが[ココ](http://downloads.openwrt.org/attitude_adjustment/12.09/ar71xx/nand/openwrt-ar71xx-nand-vmlinux-lzma.elf)にありますのでダウンロードして[コチラ](http://www.slideshare.net/wakadannacom/pdfrouter-board-openwrt20140810ver3)で書かれている通りにすれば良いです。
何らかの理由でソースからビルドしたいならこの記事の内容を参考ください。

###環境構築
ソースを持って来て適当なところに解凍します。
ソースは例えば[こちら](http://git.openwrt.org/?p=12.09/openwrt.git;a=shortlog;h=refs/heads/master)など。

以下で必要なパッケージをインストールします。

```bash:centos
yum update
yum install gcc make gcc-c++ zlib-devel ncurses-devel openssl-devel unzip bzip2 patch wget git subversion asciidoc libgcj flex gtk2-devel intltool perl-ExtUtils-MakeMaker  binutils bzip2 gcc gcc-c++ gawk gettext flex ncurses-devel zlib-devel make patch unzip perl-ExtUtils-MakeMaker  glibc glibc-devel glibc-static quilt ncurses-lib sed sdcc intltool sharutils bison wget git-core opensll-devel xz file
```

```bash:ubuntu(12.04)
apt-get update
apt-get install g++ unzip subversion git-core build-essential libssl-dev subversion mercurial libncurses5-dev devscripts build-essential build-dep gawk wget

echo 'DSCVERIFY_KEYRINGS="/etc/apt/trusted.gpg:~/.gnupg/pubring.gpg"' >> ~/.devscripts
wget http://mirror.esc7.net/pub/Ubuntu/pool/main/g/gawk/gawk_4.0.1+dfsg-2.dsc
wget http://mirror.esc7.net/pub/Ubuntu/pool/main/g/gawk/gawk_4.0.1+dfsg-2.debian.tar.gz
dpkg-source gawk_4.0.1+dfsg-2.dsc
cd gawk-4.0.1+dfsg/
debuild -uc -us
cd ..
dpkg -i gawk_4.0.1+dfsg-2_amd64.deb
```

###カーネル設定ファイル
[こちら](http://downloads.openwrt.org/attitude_adjustment/12.09/ar71xx/nand/config.ar71xx_nand)からコンフィグファイルをダウンロードします。
ビルドディレクトリ直下に配置して名前をconfig.ar71xx_nand→.configに変更します。

ちょっとおまじないしてください。

```diff
vi include/prereq-build.mk
+# [ "$$(shell whoami)" != "root" ]   # 16行目をコメントアウト
```

そして以下を実行

```bash
make menuconfig
```

画面の色合いが変わってメニューが表示されるので
Target Imagesを選択 → ramdiskの箇所でスペースキー押下 → Exit → Exit。

###ビルド

```bash
make V=s -j 4
```

結構お時間掛かかります(2,3時間?)。
エラーなく終わったらビルドディレクトリの/bin/ar71xx配下に
openwrt-ar71xx-nand-vmlinux-initramfs-lzma.elf
が生成されているはずです。
これをブート用のサーバに移して
[こちら](http://www.slideshare.net/wakadannacom/pdfrouter-board-openwrt20140810ver3)で書かれている通りにすればインストールは上手く行くと思われます。

本題は**”OpwnWrtを入れて何をしたいのか”**だと思いますけど。。
とりあえず以上になります。
PHP7調査(13)ガベージコレクタがエクステンションからフック可能になる

PHP7からPHPの内部的なガベージコレクション関数gc_collect_cyclesが関数ポインタで実装されるようになり、PHPエクステンションからフック可能になります。

これはPHPプログラマに直接関係する内容ではありませんが、これを利用したエクステンションが出てくるようであれば間接的に関係してくるかもしれません。

# 背景

PHPのプロファイラはzend_executeやzend_execute_internalをフックして関数の実行時間などを測定しています。しかし、ガベージコレクションは非決定的なタイミングで走るため、こうしたプロファイラ類の測定を不正確にしてしまう可能性があります。

ガベージコレクタ自体をフックできるようになれば、こうしたプロファイラ類がガベージコレクションの時間も測定できるため、純粋な関数の実行時間を計算で求めることが可能になります。

また、ガベージコレクションにかかる時間を測定できるようになれば、ガベージコレクションを明示的に止めるべき場所がわかるようになるかもしれません。

# 実装

この変更は既にPHP7に含まれています（Zend/zend_gc.hあたりを参照）。また、この変更によるPHP自体のパフォーマンス低下は無いようです。

この変更をプロファイラ類が利用する可能性は十分あるでしょうが、2015/04/12時点で実装しているものは無さそうです。少なくともXdebugについて言えば、まだPHP7対応が終わっていないようなステータスです。

# 参照

* [Turn gc_collect_cycles into function pointer](https://wiki.php.net/rfc/gc_fn_pointer)