OmniAICreator/Qiita-1.07M huggingface dataset:
Ajaxページをgoogle botへPhantomjsで静的ページを用意する。


Ajaxバリバリのページはクローラから見たらスカスカで価値がないページと判断される恐れがある

```html

<html>
    <head>
      <title>sukasuka</title>
    </head>
  <body>
    <div>{hogehoge}</div>
  </body>
</html>
```

そこで、phantom jsを使ってページをレンダリングして静的ページに変換する。
phantomjsがなんだか分からないけど、webkitをシミュレーションしてくれる。便利なツール

http://phantomjs.org/download.html

```javascript
var page = require('webpage').create();
page.open('http://target-ajax.page.com/index.html', function (status) {
    window.setTimeout(function () {
      if (status === 'success') {
        console.log(status);
        var html = page.evaluate(function () {
          return document.documentElement.outerHTML;
        });
        console.log(html);
      }
      phantom.exit();
    }, 200);
 });

```
クーロンは適当にこのように。


```crontab
0 * * * * /usr/bin/phantomjs  /home/hoge/make_static.js > /var/www/hogehoge/production/current/public/static.html

```

そして、nginxここでハマる。。
if分で、プロキシは設定できないらしい。。

```[root@host]# service nginx start
Restarting nginx: nginx: [emerg] "include" directive is not allowed here in /etc/nginx/sites-enabled/bar:21
nginx: configuration file /etc/nginx/nginx.conf test failed
````



```nginx.conf
if ($http_user_agent ~* "googlebot|yahoo|bingbotbaiduspider|yandex|yeti|yodaobot|gigabot|ia_archiver|facebookexternalhit|twitterbot|developers\.google\.com") {
  rewrite ^/$ http://target-ajax.page.com/static.html last;
}
```

Chromeでエージェントをgoogle-botに変えてテストしてみて、うまくstaticが見れればok
urlが変わってしまうので、効果のほどはいま様子を見てます。

参考サイト
http://havelog.ayumusato.com/develop/javascript/e526-make_static_html_using_phantomjs.html
WindowsのコマンドプロンプトからGithubのプライベートリポジトリをユーザ情報入力なしでcloneする

* プライベートリポジトリをユーザ情報の入力を省略してcloneしようとしたところはまったのでメモ
 * UNIXだと.ssh/configや.netrcで対応するやつ

## 対応
やり方は二通りある

### httpsでcloneする場合
http://mistymagich.wordpress.com/2011/11/08/basic_authentication_and_git_or_hg/

* %HOME%/_netrc を作って、必要な設定を記述すればOK
 * _netrcは環境変数HOMEがさすパスに必ず作られなくても良いように記事では書かれていたが、試した環境では環境変数HOMEを定義しその下にファイルを作る必要があった
* _netrc の内容

```
machine github.com
login ユーザ名
password パスワード
```

### sshでcloneする場合
http://qiita.com/ques0942/items/1a6c198c6d16ac297f2c

* msysgitのインストールパス/etc/ssh/ssh_config を作って、必要な設定を記述すればOK
 * .ssh/config ではなく ssh/ssh_config なので注意
* ssh_config の内容

```
Host github.com
  IdentityFile "C:¥Program Files (x86)¥Git¥etc¥ssh¥id_rsa"
```
* ssh_config(.ssh/config)の内容や鍵の作り方については割愛
 * jenkinsなどからgitを実行する場合には "StrictHostKeyChecking no" を設定しておくと良さそう
 * msysgitをインストールするとconnectコマンドも入るはずなので、プロキシを超えることもできる
grunt-contrib-connectで簡易サーバーを用意する

初めて使ったので。

## なにこれ

Gruntから起動し静的ファイルを返す簡易ウェブサーバーらしい。

* https://github.com/gruntjs/grunt-contrib-connect

## 導入

```bash
npm i --save grunt-contrib-connect
```

```js:Gruntfile
module.exports = function (grunt) {
	grunt.initConfig({
		connect: {
			local: {
				options: {
					keepalive: true,
					port: 1234
				}
			}
		}
	});
	grunt.loadNpmTasks('grunt-contrib-connect');
};
```

## 起動

```bash
grunt connect
```

## 質疑応答

### 起動したと思ったらすぐ終了する

`keepalive`の設定を。

あるいは`grunt connect:local:keepalive`で起動しても動き続けた。

### 起動したは良いけど止まらないんですが

`Ctrl+C`で終了。（⌘じゃないよ。）

### 起動したままだとコンソールが使えないんですが

もっとタブ開けば？

ある程度慣れてるなら、`&`付き起動とか`^Z`からの`bg`とか。

### 静的ファイルだけじゃなくてスクリプトを実行したい

出来ないと思う。

[node-express](http://expressjs.com/)でどうぞ。割と簡単。

### サーバーで表示するディレクトリーを指定したい

`options`で`base:'mydir'`を設定する。

`directory`との違いがよくわからない。

### "Fatal error: Port 8000 is already in use by another process." だって

指定のポートが他のアプリケーションで使われてる。`options`の`port`の値を適当に設定する。（省略時は`8000`になる。）

`useAvailablePort:true`も設定しておくと、使用済みのとき他のポートを勝手に選んでくれるみたい。選ばれたポートはコンソールの出力から判断。

### localhost以外から見たい

ネットワークの設定は各自頑張るとして、`options`の`hostname:'*'`らしい。

初期値`"0.0.0.0"`でも大丈夫な気がする。

### SSLなんですが

`options`に`protocol:'https'`を。

証明書はアレだけど自分の所だから気にしなくて良いはず。

### 実は他のサーバーを見に行きたい

こういうのもあるらしい（未使用）

* https://github.com/drewzboto/grunt-connect-proxy

### livereload使わせろ

がんばれ

* https://github.com/intesso/connect-livereload

## その他

色々教えてください。
TAP::Formatter::JUnitで、subtestに設定した日本語が16進数コードになる現象についての対応


TAP::Formatter::JUnitをなんとかすれば良さそうだけど、
難しそうなので、以下のスクリプトで変換することにした。

```shell
perl -i -ple 's/\[\\x([a-f0-9]{2})\]/pack("H*", $1)/egx' result.xml
```
YEOMAN、Grunt、Bower の既存ジェネレータやプライグイン、パッケージに何があるか眺める


### Yeoman

- [公式サイト](http://yeoman.io)配下の、
	- http://yeoman.io/official-generators.html
	- http://yeoman.io/community-generators.html

### Grunt

- [公式サイト](http://gruntjs.com)配下の、
	- http://gruntjs.com/plugins

### Bower

- [公式サイト](http://bower.io)配下の、
	- http://bower.io/search/


眺めていると、あ、これ使えそうやん！というのが結構あるので、一度みてみるといいかも。
Aggregateを使って、archiveのときだけrun scriptを実行する


### archiveのときだけ実行したい
* aggregateをtargetに追加する。(Editor > Add Target)
* 追加したaggregateのBuild Phasesにrun scriptを追加する
* schemaを変更してarchive時だけ、targetを実行する

![スクリーンショット 2014-04-14 11.23.03.png](https://qiita-image-store.s3.amazonaws.com/0/4585/a832edd2-8f2c-93c2-1717-0ae3b8074d4d.png "スクリーンショット 2014-04-14 11.23.03.png")

* もともと、crashlyitcsのrun scriptをarchiveのときだけ実行したかったので、上のようにaggregateを作成して実装したけど、ダメだった。。理由は、build settingを見てcrashlyitcsのrun scriptは実行されるから。
* buildsettingに関係なく実行するscriptで、archiveのときだけ実行したいならいいかもしれない

### configurationがReleaseの時だけ実行したい
* これでも毎回buildすることはなくなる

```
releaseConfig="Release"
if [ "$releaseConfig" = "${CONFIGURATION}" ]; then   
    echo "Running Crashlytics"
    ./Crashlytics.framework/run {your_api_key_here}
fi
```

### 参考
* http://stackoverflow.com/questions/5471396/running-script-only-for-an-archive-build-in-xcode-4
* http://stackoverflow.com/questions/6747499/when-and-how-to-use-aggregate-target-in-xcode-4
* http://support.crashlytics.com/knowledgebase/articles/118559-can-i-make-the-dsym-uploading-only-on-release-buil
* http://disanji.net/iOS_Doc/#documentation/DeveloperTools/Conceptual/XcodeBuildSystem/100-Targets/bs_targets.html
SourceTreeのちょっとした使い方

# 概要

* 最近は「TortoiseGit」,「EGit」よりも勢いがある
* 履歴がグラフィカルで見やすい
* リベース、チェリーピックがGUIで簡単にできる
* pullしなくてもGUI上でリモートに更新があったことがわかる！
 * 自動フェッチ機能
* git-flowにも対応！
* *ver1.4からWindowsも日本語対応！！*

# 導入

本体ダウンロード
http://www.sourcetreeapp.com/

* git.exeが見つからないといわれたので、前にインストールした場所を指定
 * もしなければ、同じウィンドウから導入可能
* Mercurial.exeが見つからないといわれたので、「使用しない」にした
* ネーム、Eメール(GitHubで使用しているもの)を入力
* チェックボックスは全部チェック
 * グローバル設定の変更を許す
 * 改行の自動処理
 * ライセンスに同意する

* OpenSSLを使うにチェック
 * GitHubで登録したSSHキーを選択
* GitHubのユーザー名、パスワード入力

# 使ってみた
## clone（GitHubからローカルPCへリポジトリのコピー）
1．「新規/クローンを作成する」を押す
2．URLにgithubでコピーしたURLを貼り付け
3. 保存先フォルダを指定
4.「クローン」ボタンを押して完了

* 既に作られたリポジトリのブックマーク追加
 * 左の欄にリポジトリフォルダをドラッグ＆ドロップでブックマーク作成完了

## pull(更新をローカルPCへ反映)
1. 左欄でリポジトリをダブルクリック
2. 任意のブランチを選択
3. 上部バーの「プル」ボタンに数字が更新された回数
4. 「プル」ボタンを押すとウィンドウが開くので各項目確認
 * プル元のリモートブランチがローカルと同じになっているか確認

5. オプションは「マージした変更を即座にコミット」のみ選択し、「OK」ボタンを押す

## commit(ローカルPCのリポジトリ更新)
1. ファイルを更新すると、「ファイルステータス」→「作業コピー」の下部にある
「作業ツリーのファイル」に更新されたファイル一覧が表示される

2. コミット対象のファイルを選択し、「↑」ボタンでインデックスに追加できる
 * インデックスの登録から外す時は「↓」ボタン。

3. インデックス欄に追加後、上部バーの「コミット」ボタンを押す
4. コミットウィンドウが表示されるので、コミットメッセージを記入
5. ファイルの差分など問題なければ、右下の「コミット」ボタンで完了
 * オプションは特に指定しない。

```tex

＜インデックスとは？＞
リポジトリにコミットするファイルを一時保存するための場所。
必要なファイルだけインデックスに登録することで、
不要なファイルをリポジトリにコミットしなくて済む。
```

## push(ローカルPCのリポジトリ更新をGitHubへアップロード)

1. コミットしたなら、上部バーの「プッシュ」ボタンに数字が表示される
 * GitHubとローカルPCの差分があるということ
2. 「プッシュ」ボタンを押すとプッシュウィンドウが表示される
3. プッシュ先リポジトリが「origin」(GitHubのURL)になっていること
4. プッシュ対象のブランチを選択する
5. 「OK」ボタンでプッシュ完了

## branch作成(作業ツリーの分割)
例) 本番と開発の作業を個別に行いたい → 開発用ブランチ(develop)の作成

1. 元となるブランチ(master)を選択
 * ブランチにチェックの絵がちゃんと表示されていること
2. 上部バーの「ブランチ」を押す
3. 新規ブランチに「develop」と入力
4. 「ブランチを作成」ボタンで完了
5. 自動的にチェックアウトしているが、されていなかったらダブルクリック

## merge(他ブランチの変更を現ブランチに反映)
例) developブランチの修正をmasterブランチに反映したい

1. masterブランチを選択
2. 上部バーの「マージ」を押す
3. マージウィンドウが開くので、対象のコミット(ブランチ)を選択
 * developの最新コミットをマージする場合、過去のコミットもマージされる
4. OKボタンで完了
5. 競合が発生した場合は、エディタで競合箇所を修正しコミットすること

# 総評
* ある程度Gitの知識があれば便利
* 自動フェッチしてくれるのでpullするものがあるか分かりやすい
* リポジトリ、ブランチの切り替えもクリックひとつでＯＫなのは楽
* 日本語対応している
* TortoiseGitはフォルダ上で作業するので、そっちの方がいい人もいるかも
Carrierwaveでアップロードした画像に新しいバージョンを追加する

[carrierwave](https://github.com/carrierwaveuploader/carrierwave)はシンプルで使いやすい画像アップロードgemで、ActiveRecordと良い感じに連携して動いてくれます。
デフォルトではfileに保存してファイル名をDBに持ちますが、クラウド(S3とか)にも対応しているようですね。

さて、carrierwaveの便利な機能の一つに、`version`がありますが、運用中のアプリケーションにバージョンを追加したくなったとき、どうすれば良いでしょうか。

```user.rb
class User < ActiveRecord::Base
  mount_uploader :avatar, ImageUploader
end
```
```image_uploader.rb
class ImageUploader < CarrierWave::Uploader::Base
  include CarrierWave::RMagick
  version :small do
    process resize_to_fill: [90, 60]
  end

  # 以下を追加
  version :medium do
    process resize_to_fill: [300, 200]
  end
end
```

`#recreate_versions!`というメソッドが用意されていて、こいつを叩けばキャッシュとストレージに保存されます。

```rb
pry> User.all.each { |user| user.avatar.recreate_versions! }
```

キャッシュは軽く中身見てみたらローカルファイルのようですね。
クラウドへの保存を想定して、キャッシュとしてファイルに保存しているようです。

https://github.com/carrierwaveuploader/carrierwave#recreating-versions
https://github.com/carrierwaveuploader/carrierwave/blob/master/lib/carrierwave/uploader/versions.rb#L211
ActiveRecord 単体にテーブル・カラムを用意してもらうメモ

とくに解説とかはしない。めも。

```yaml:db.yml
development:
  adapter: 'sqlite3'
  database: './list.db'
```

```ruby:db.rb
require 'active_record'
require 'yaml'

class List < ActiveRecord::Base
end

config = YAML.load_file('./config/db.yml')
p config
ActiveRecord::Base.establish_connection config['development']

ActiveRecord::Schema.define do
  unless ActiveRecord::Base.connection.tables.include? 'lists'
    create_table :lists do |table|
      table.column :user_name,    :string
      table.column :date_string,  :string
    end
  end
end
```

```ruby:main.rb
require_relative './db'

List.create(user_name: 'name', date_string: '2014-01-01')
List.find_by_user_name('name')
```

## Link
* [SQLite and ActiveRecord](http://www.integralist.co.uk/posts/sqlite-and-activerecord/#schema)
UbuntuサーバとTomcatをNewRelicで監視

# 初めに
New Relicを用いて、EC2上のUbuntuサーバとJava AP環境(tomcat7)を監視する。

# 想定環境
* OS: Ubuntu12.04 LTS　(AWS提供AMI)
* Java: Oracle JDK 1.7 (webupd8team)
* Ap:　Tomcat7 (OS標準レポジトリ)

# 公式資料

>Java agent manual installation
https://docs.newrelic.com/docs/java/java-agent-manual-installation


# New Relicインストール作業

## アプリ監視(Java)エージェント導入

### 管理画面でインストーラ作成

New Relic管理画面にログイン
http://newrelic.com/

左タブより「Applications」選択し、「Add more」よりエージェント生成画面(Get started with New Relic APM and New Relic Insights)を開く。

* Langage:　JAVA を指定
* License key: 自アカウントに発行されたキーである事を確認。
* ダウンロード: 任意の場所に保存　(2014/4時点:newrelic_agent3.5.1.zip)

### エージェント転送
ダウンロードしたエージェントファイル(zip)は、監視対象サーバ上に転送する。
(以下転送先は下記と仮定:/home/ubuntu/newrelic_agent3.5.1.zip)

### エージェント展開

```
cd /var/lib/tomcat7/webapps/
sudo unzip /home/ubuntu/newrelic_agent3.5.1.zip
sudo chown -R tomcat7:tomcat7 newrelic/
```

### エージェント設定
```
sudo vi newrelic/newrelic.yml
```

* app_name など


### エージェント起動設定

手動インストール手順を踏襲

> Java agent manual installation
https://docs.newrelic.com/docs/java/java-agent-manual-installation


```
sudo vi  /etc/default/tomcat7
```
CATALINA_OPTSの指定として

```
-javaagent:/var/lib/tomcat7/webapps/newrelic/newrelic.jar
```

を追記。


### Tomcat 再起動

```
sudo service tomcat7 restart
```


## サーバ監視設定

### サーバ監視エージェント導入 
```
echo deb http://apt.newrelic.com/debian/ newrelic non-free \
  | sudo tee -a /etc/apt/sources.list.d/newrelic.list
wget -O- https://download.newrelic.com/548C16BF.gpg | sudo apt-key add -
sudo apt-get update
sudo apt-get install newrelic-sysmond -y
```

### サーバ監視設定
ライセンスキー反映

```
sudo nrsysmond-config --set license_key=XXXXXXXXXXXXXXX
```


### サーバ監視エージェント 再起動

```
sudo service newrelic-sysmond restart
```
JScriptでExcel操作（その２）


## はじめに

私の職場では、Excelがテンプレートになっていて、
文章作成時はWordではなくExcelである事が多いです。

また、正式版として提出する場合は、PDFに変換するようにとも言われます。

どのバージョンからか忘れましたが、ExcelにPDF出力する機能が増え
ExcelのPDF変換は楽になったものの、大量のExcelがあると開いては出力という、手間がかかります。

そんな時に作った、ツールをサンプルコードとします。

## ExcelのPDF出力

以下で作った、jsにExcelファイルをドラッグ＆ドロップすると
Excelと同じフォルダに、ファイル名（拡張子含む）＋「.pdf」という
PDFファイルが作成されます。

ただし、Excelのページ設定がちゃんとされていないと、
文字が削れたりするので注意してください。

また、PDFの出力ファイルはダイアログなしで上書きされます。

```js:xls2pdf.js
// パラメータ取得
var args = WScript.arguments;
// 「FileSystemObject」オブジェクト生成
var fso = new ActiveXObject("Scripting.FileSystemObject");

// パラメータ存在チェック
if (args.length > 0) {
    // パラメータ数分ループ
    for (var i = 0; i < args.length; i++) {
        // パラメータ抽出（ドラッグ＆ドロップしたファイルパス）
        var file = args.item(i);
        // ファイル存在チェック
        if (fso.FileExists(file)) {
            // 拡張子取得
            var ext = fso.GetExtensionName(file).toLowerCase();
            // 拡張子チェック
            if (ext.indexOf("xls") == 0) {
                // ExcelをPDFへ変換
                xls2pdf(file, file + ".pdf");
            } else {
                // 拡張子が「xls*」でない場合
                //WScript.Echo("「" + file + "」はの拡張子がExcelではありません。");
            }
        } else {
            // ファイルが存在しない場合
            //WScript.Echo("「" + file + "」は存在しません。");
        }
    }
} else {
    // パラメータが無い場合
    WScript.Echo("Excelファイルをドラッグ＆ドロップしてください。");
}

// 終了
WScript.Quit(0);

function xls2pdf(infile, outfile) {
    var excel = null;
    try {
        // Excelオブジェクト生成
        excel = new ActiveXObject("Excel.Application");
        var book = null;
        try {
            // 読み取り専用で開く
            book = excel.Workbooks.Open(infile, 0, true);
            // PDF出力（xlTypePDF(0)、出力ファイル、xlQualityStandard(0)）
            book.ExportAsFixedFormat(0, outfile, 0);
        } catch (e) {
            // エラーの場合
            WScript.Echo("IN:" + infile + "\nOUT:" + outfile
                 + "\nError(" + (e.number & 0xFFFF) + "):" + e.message);
        } finally {
            // Workbookオブジェクト存在チェック
            if (book != null) {
                // Workbookを閉じる
                book.Close(false);
                book = null;
            }
        }
    } catch (e) {
        // エラーの場合
        WScript.Echo("IN:" + infile + "\nOUT:" + outfile
             + "\nError(" + (e.number & 0xFFFF) + "):" + e.message);
    } finally {
        if (excel != null) {
            excel.Quit();
            excel = null;
        }
    }
}
```

「Workbook」に対して`ExportAsFixedFormat`メソッドを呼ぶことで
「Workbook」全体をPDF化しています。

第一引数は、出力タイプでPDF(0)としています。
第二引数は、出力ファイル名です。
第三引数は、PDFの品質で普通(0)としています。
VirtualBoxでのUSBデバイス認識

VirtualBoxはとても便利なんですが、USBメモリなんかをゲストOSに認識させるのが割と苦手ですね。さくっと認識できないときの覚書を残しておきます。

ちなみに詳しいことはよくわかってないです。

ホスト側でドライバがないUSB機器でもゲスト側で認識させることがホントはできるので調整しましょう。
やることはチェックポイントは3つです。

- Extension Packをいれとけ！
- vboxusersグループに追加しておけ！(linux)
- USBデバイスフィルターに追加しておけ！


# 準備

Extension Packをインストールしておきましょう。
<https://www.virtualbox.org/wiki/Downloads>

USB2.0なんかが使えるようになるみたいです。

# LinuxでUSB機器の一覧がでない

USB機器の一覧がでないときは、virtualboxを起動するユーザがvboxusersグループに所属していないとダメです！！（なんと！）

`$ sudo gpasswd -a YOUR_USERNAME vboxusers`

で追加できます。再起動したほうがいいっぽい。


# USB機器が認識されない！

特にMacで起きるような気がします。なにか認識するための条件が厳しいようで、もう少し甘めのフィルターを作ってあげると認識してくれます。

ゲストOSをシャットダウンし、ゲストOSの設定からデバイスフィルターを調整します。

- ゲストOS設定 - ポート - USB
- USBコントローラを有効化→チェック
- USB2.0(EHCI)コントローラを有効化→チェック
- USB機器をホストマシンに接続する
- USBデバイスフィルターで+アイコンから対象のUSB機器らしきものを追加する（図でいうところJetFlashが目的のUSB機器）
![Ubuntu12.04Dev - ポート.jpg](https://qiita-image-store.s3.amazonaws.com/0/8221/77a0c7ae-81c8-8d56-ffcf-ed060cc44ca2.jpeg)
- 追加したフィルタをダブルクリックして編集
- ベンダーID、プロダクトID、リビジョンをそのまま残し、メーカー、製品名、シリアルNoを消す
![VirtualBox.jpg](https://qiita-image-store.s3.amazonaws.com/0/8221/4486b9e8-ada1-28f1-b494-fee701067925.jpeg)
- USB機器をホストマシンから外す
- ゲストOSを起動
- USB機器をホストマシンに再接続
- ＼ゲストOS上で認識／
散布度で分布の散らばりを表す

## 離散変数の散らばり

次の 2 表を考察してみましょう。

| 地方 | 人数 | 割合 |
|:--|:--|:--|
|埼玉| 40 | 33.3 |
|千葉| 40 | 33.3 |
|神奈川| 40 | 33.3 |

| 地方 | 人数 | 割合 |
|:--|:--|:--|
|埼玉| 100 | 83.3 |
|千葉| 15 | 12.5 |
|神奈川| 5 | 4.2 |

これは出身地を表す表です。合計人数はいずれも 120 人ですが、それぞれの県の人数には異なりがあります。前者は三県の出身者数がいずれも同じで、後者の表では 80% 以上が埼玉出身となります。

離散変数では前者の表のように各カテゴリーに数が散らばっているほうが散らばりが大きい、多様性に富むと考えます。こういった散らばりを表す統計量が **多様性指数 (index of deversity)** です。次の数式で示します。

```math
D = 1 - {\sum_{i=1}^K}p^2_i
```

このとき k はカテゴリーの数 p は i 番目のカテゴリーの比率です。

この式にあてはめて前者は 0.667 、後者は 0.288 となります。

多様性指数の最大値はカテゴリー数が多くなるほど上限が大きくなります。 **質的変動指数 (index of qualitative variation)** はこのような欠点を補います。

## 連続変数の散らばり

連続変数の散らばりを算出する際は分散と標準偏差を利用します。これは[以前に説明した](http://qiita.com/ynakayama/items/5a955c7e29c295292502)とおりです。

## 標準得点

連続変数において、ある変数の特定の値が分布のどこに位置するかを表す場合、平均値と標準偏差に基づく別の指標を用意します。

これを **標準得点 (standard score)** または z 得点と言い、次式で表します。

```math
z_i = \frac {Y_i - \overline{Y}} {s_Y}
```

z 得点に変換した値の分布は、どんなものでも平均 0 、標準偏差 1 となります。また平均値より高い値は正の値、平均値より低い値は負の値となります。

## 参考

社会統計学入門 (放送大学教材)
http://www.amazon.co.jp/dp/4595313705
C# VB.NET における暗黙型変換の実装

Scalaではおなじみの暗黙変換（implicit conversion）だが、C#/VB.NETにも同等の機能があります。

以下、[リファレンス](http://msdn.microsoft.com/ja-jp/library/z5z9kes2.aspx)より抜粋。

```csharp
class Digit
{
    public Digit(double d) { val = d; }
    public double val;
    // ...other members

    // User-defined conversion from Digit to double
    public static implicit operator double(Digit d)
    {
        return d.val;
    }
    //  User-defined conversion from double to Digit
    public static implicit operator Digit(double d)
    {
        return new Digit(d);
    }
}
```

これで`double num = new Digit(1);`というような等式が使えるようになる。
なお、暗黙ではなく明示的((hogeClass)variable というような変換)である、という場合は`explicit`を使う([リファレンス参照](http://msdn.microsoft.com/ja-jp/library/xhbhezf4.aspx))。

さて、VB.NETでは暗黙変換の演算子は[Widening](http://msdn.microsoft.com/ja-jp/library/hz3wbx3x.aspx)と[Narrowing](http://msdn.microsoft.com/ja-jp/library/4w127ed2.aspx)で区別される。

以下、[リファレンス](http://msdn.microsoft.com/ja-jp/library/yf7b9sy7.aspx)のコード。

```vbnet
Public Structure digit
  Private dig As Byte
  Public Sub New(ByVal b As Byte)
    If (b < 0 OrElse b > 9) Then Throw New System.ArgumentException("Argument outside range for Byte")
      Me.dig = b
  End Sub

  Public Shared Widening Operator CType(ByVal d As digit) As Byte
      Return d.dig
  End Operator
  Public Shared Narrowing Operator CType(ByVal b As Byte) As digit
      Return New digit(b)
  End Operator
End Structure
```

Single から Doubleのように精度が落ちず普通に変換できる場合は`Widening`、逆にLong から Integerなど精度が落ちる場合は`Narrowing`となり、それぞれに応じた処理を実装できる(特に精度が落ちる場合は使い出があるかも)。これと等価な機能はC#にはない・・・ように見える(Narrowingがexplicitに該当する？)。
GitLab で Project にアクセスすると 500 で落ちる

# はじめに

[GitLab.org / GitLab recipes | GitLab](https://gitlab.com/gitlab-org/gitlab-recipes/tree/master/install/centos) に従って新規にインストールした GitLab 6.7 でプロジェクトを作成した後、画面の指示に従って git clone や add, commit, そして push を行ってから、再度 GitLab にて Project にアクセスしたところ、500 Internal Server Error が発生しました。

エラーログでぐぐってみたところ、同じ問題で困っている人も数名いるようでした。日本語の情報は見つからなかったので、ここに記録しておきます。


## エラーログ

```
Started GET "/yu-umezawa/gitlabtest" for 202.225.5.123 at 2014-04-15 02:24:33 +0000
Processing by ProjectsController#show as HTML
  Parameters: {"id"=>"yu-umezawa/gitlabtest"}
  Rendered projects/_dropdown.html.haml (4.7ms)
  Rendered shared/_clone_panel.html.haml (0.7ms)
  Rendered projects/_home_panel.html.haml (27.5ms)
  Rendered events/_event_last_push.html.haml (6.6ms)
  Rendered shared/_event_filter.html.haml (3.0ms)
  Rendered projects/repositories/_download_archive.html.haml (4.2ms)
  Rendered projects/show.html.haml within layouts/projects (51.3ms)
Completed 500 Internal Server Error in 92ms

ActionView::Template::Error (undefined method `sha' for nil:NilClass):
    39:         = link_to project_compare_index_path(@project, from: @repository.root_ref, to: @ref || @repository.root_ref), class: 'btn btn-block' do
    40:           Compare code
    41:
    42:         - if @repository.readme
    43:           - readme = @repository.readme
    44:           = link_to project_blob_path(@project, tree_join(@repository.root_ref, readme.name)), class: 'btn btn-block' do
    45:             = readme.name
  app/models/repository.rb:183:in `tree'
  app/models/repository.rb:167:in `block in readme'
  app/models/repository.rb:166:in `readme'
  app/views/projects/show.html.haml:42:in `_app_views_projects_show_html_haml___3251137056208210433_70225973183040'
  app/controllers/projects_controller.rb:69:in `block (2 levels) in show'

    # Allow login via Twitter, Google, etc. using OmniAuth providers
    # see https://github.com/gitlabhq/gitlab-public-wiki/wiki/Working-custom-omniauth-provider-configurations
  app/controllers/projects_controller.rb:63:in `show'
  app/controllers/application_controller.rb:58:in `set_current_user_for_thread'
```

## 原因と解決方法

`config/gitlab.yml` で指定する git パスが間違っていることが原因でした。デフォルトでは `/usr/bin/git` が指定されていますが、[Install Git from Source (optional)](https://gitlab.com/gitlab-org/gitlab-recipes/tree/master/install/centos#install-git-from-source-optional) に従って最新をインストールしていたので、`/usr/local/bin/git` を指定しなければなりませんでした。

上記ドキュメント中では、わざわざ `make prefix=/usr/local install` しているのでハマる人は多そうです。[Contribute to GitLab recipes](https://gitlab.com/gitlab-org/gitlab-recipes/blob/master/CONTRIBUTING.md) に従ってプルリクエストを送ろうと思います。


## 参考

- [Server error 500 on new install when accessing Project - Google グループ](https://groups.google.com/forum/#!msg/gitlabhq/A5lFlfMJi3I/mfIhzvYSLXMJ)
- [I'm getting 500 error on gitlab 6.6.5 · Issue #6604 · gitlabhq/gitlabhq](https://github.com/gitlabhq/gitlabhq/issues/6604#issuecomment-39469261)
- [http 500 accessing project · Issue #6600 · gitlabhq/gitlabhq](https://github.com/gitlabhq/gitlabhq/issues/6600)
未ログインユーザーは拒否。ただし、特定のIPアドレスからのアクセスは許可する。

```php:functions.php
function mmsf_404_redirect() {
	$your_remote_addr = '00.0.000.00'; // アクセスを許可するIPアドレス
	if ( is_user_logged_in() || $_SERVER['REMOTE_ADDR'] === $your_remote_addr )
		return;
	wp_redirect( 'http://example.com', '404' ); // 任意のURL
}
add_action( 'init', 'mmsf_404_redirect' );
```

[gist](https://gist.github.com/mimosafa/9491410)
GoogleChromeでUserAgentの変更方法（ver 34.0.1847.116）


ちなみにバージョンは 34.0.1847.116 だった。

昔はDeveloperToolを開いて右から2つ目の歯車ぽいマークをクリックしたらOverridesって項目があってUAを変更することが出来た。

![スクリーンショット 2014-04-15 13.56.21.png](https://qiita-image-store.s3.amazonaws.com/0/1389/3bba5084-d391-7376-4990-633f554697c2.png "スクリーンショット 2014-04-15 13.56.21.png")

でも今見るとOverridesって項目自体がない！？
※昔はGeneralとWorkspaceの間くらいにあった・・。確か。


![スクリーンショット 2014-04-15 13.58.20.png](https://qiita-image-store.s3.amazonaws.com/0/1389/574a3066-ceac-73e0-1313-15f2ec7dba9b.png "スクリーンショット 2014-04-15 13.58.20.png")

結局こんなところで見つけました。
一枚目の画像のここをクリック。
![スクリーンショット 2014-04-15 14.00.23.png](https://qiita-image-store.s3.amazonaws.com/0/1389/c6e11683-1dd2-5e1e-627e-5a90b8fc7b2d.png "スクリーンショット 2014-04-15 14.00.23.png")

そしたらDevToolの下にこいつが出てくるので、そこのEmulationをクリック。
![スクリーンショット 2014-04-15 14.00.27.png](https://qiita-image-store.s3.amazonaws.com/0/1389/3029302b-88c5-a514-7b6d-35840f888c81.png "スクリーンショット 2014-04-15 14.00.27.png")

これで好きなUA設定して完了。
なんだけどいつからOverridesの項目自体なくなったんだろ・・・。
気付かなかったな。
UbuntuサーバへのOracle JDK導入

# 初めに
AWS公式AMIで起動したUbuntuサーバに、OS標準のOpenJDKではなく、Oracle JDKを導入する場合のメモ。

# インスタンス起動
* OS:Ubuntu 12.04.04 LTS
* AMI:ubuntu-precise-12.04-amd64-server-20140408 (ami-87c7b986)

# OS設定

##パッチ適用
```shell-session
sudo apt-get update
sudo apt-get upgrade
```


### NTP設定
時刻同期先はインターネットマルチフィード (MFEED)。

```shell-session
sudo apt-get install ntp -y

sudo cp /etc/ntp.conf /etc/ntp.conf.0

cat /etc/ntp.conf.0 \
  | sed 's/server 0.ubuntu.pool.ntp.org/server ntp1.jst.mfeed.ad.jp/g' \
  | sed 's/server 1.ubuntu.pool.ntp.org/server ntp2.jst.mfeed.ad.jp/g' \
  | sed 's/server 2.ubuntu.pool.ntp.org/server ntp3.jst.mfeed.ad.jp/g' \
  | sed 's/server 3.ubuntu.pool.ntp.org/# server 3.ubuntu.pool.ntp.org/g' \
  | sed 's/server ntp.ubuntu.com/# server ntp.ubuntu.com/g' \
  | sudo tee /etc/ntp.conf.new

diff  /etc/ntp.conf.0  /etc/ntp.conf.new
sudo cp -f /etc/ntp.conf.new /etc/ntp.conf
sudo rm -f /etc/ntp.conf.new
sudo /etc/init.d/ntp restart
```

稼働状態確認

```shell-session
ntpq -p
```


## IPv6無効化
副作用回避の為、v6アドレスは無効化する。

```shell-session
sudo cp /etc/sysctl.conf /etc/sysctl.conf.0
sudo cp /etc/sysctl.conf.0 /etc/sysctl.conf.new

echo '#
#IPv6 disable
net.ipv6.conf.all.disable_ipv6=1
net.ipv6.conf.default.disable_ipv6=1
' | sudo tee -a /etc/sysctl.conf.new

diff /etc/sysctl.conf /etc/sysctl.conf.new
sudo mv /etc/sysctl.conf.new /etc/sysctl.conf
```

OS再起動

```shell-session
sudo shutdown -r now
```

# JDK導入

WebUpd8のレポジトリを利用
> “WebUpd8” team
https://launchpad.net/~webupd8team/+archive/java


```shell-session
sudo add-apt-repository ppa:webupd8team/java -y
sudo apt-get update
```


JDKインストール、デフォルト設定反映

```shell-session
sudo apt-get install oracle-java7-installer -y
sudo apt-get install oracle-java7-set-default
```

自動更新対象からOracle JDKを除外
```
echo oracle-java7-installer hold | sudo dpkg --set-selections
echo oracle-java7-set-default hold | sudo dpkg --set-selections
```

JAVA_HOME

```shell-session
JAVA_HOME=/usr/lib/jvm/java-7-oracle/jre
```
smoothScatter()

`smoothScatter()` って便利な関数があるんですね。知らなかった。

```r
with(cars, smoothScatter(speed, dist, pch=4))
```

![Rplot.png](https://qiita-image-store.s3.amazonaws.com/0/2570/12e30734-9e07-8bf6-471a-f20edf4cfa01.png)
GlusterFSの「backupvolfile-server」オプション

#GlusterFSの「backupvolfile-server」オプションが効いてる感じがしないメモ
Glusterサーバ側もクライアント側もバージョン3.4.2
Nativeクライアントで使えるこのオプションですが、効いてる感じがしない。

#クライアントのセットアップ
下記パッケージをインストール
glusterfs-3.4.2
glusterfs-libs-3.4.2
glusterfs-fuse-3.4.2

インストール後fuseをロード
modprobe fuse
lsmod |grep fuse

マウントポイント用のディレクトリを作成

/etc/fstabに下記を追加
＜gluster-server＞:/＜volume名＞ ＜マウントポイント＞ glusterfs defaults,_netdev,backupvolfile-server=＜片系ノード＞ 0 0

mount -aでマウント
df -h
Filesystem          サイズ  使用  残り 使用% マウント位置
glusterfs#＜gluster-server＞:/＜volume名＞
                       62G  3.0G   56G   5% ＜マウントポイント＞


無事マウント出来ているがこれで良いのか。
バグなのか、認識間違いなのか。
「backupvolfile-server」オプションがある場合のない場合で挙動が変わらないように感じる。
引き続き調査。。。
PHPの定数について

古い知識をアップデートすべく、PHPを再勉強中。

知らない間に、define()以外にも定数定義の方法が追加されていた。

## PHPの定数定義は二種類の方法がある。

### 1. define() 関数を利用するもの

```php
define("FOO", 1);
```

### 2. const 構文を利用するもの

```php
const FOO = 1;
```

## define() と const の違い

const 構文は PHP5.3 で導入されたもの。それ以前のバージョンでは利用できない。
単なるシンタックスシュガーかと思ったら、いくつか違いがあるみたい。

### 1. クラス定数として利用できるか。

```php
class Hoge
{
    const FOO = "foo";     // <= OK
    define("BAR", "bar");  // <= ERROR!!
}
```

constを利用した場合、クラス内で定数を定義することができる。
（クラス内でdefine()を利用して定数を定義しようとするとエラーになる）
constを利用してクラス内で定義された定数はクラス定数となり、パブリックなアクセス権を持つ。（逆にいうとアクセス権を指定することはできない）
クラスの外部から参照する場合は「クラス名::定数名」とする。

### 2.名前空間の影響を受ける。

constで定義された定数は名前空間の影響を受ける。

```php:lib.php
<?php
namespace Lib;

const FOO = "foo";
define("BAR", "bar");
```

とした場合、定数FOOは名前空間 Lib の配下にあるが、定数BARは名前空間の影響を受けず常にグローバルとなる。（最近のPHPでは名前空間が使えるのか）

```php:test.php
<?php
require_once("lib.php");

echo BAR . PHP_EOL;         // <= OK
echo \Lib\FOO . PHP_EOL;    // <= OK
echo FOO . PHP_EOL;         // <= ERROR
```

### 3.定義時に式が使えない。(2014.4.21 追記)

コメント欄で教えていただきましたが、defineの場合、定数の値に式を使うことができるとのことです。

```php
const FOO = 1+2;      # <= ERROR
define('FOO1', 1+2);  # <= OK
```

ドキュメントには式が使えるとの記述を見つけることができなかったので気づきませんでした。

## どちらを使えば良いのか？

PHP5.3以降を利用するのであれば、constを使えば良い。ということで良いのかな？
ランタイムエラーチェック /RTC[cus1] の動作内容


実行中に異常を検出する機能を埋め込むためのオプション。

||動作|
|---:|:---|
|c|小さいデータ型に代入されて情報が失われるときにエラーを出す。intのcharへの代入など。キャストは無関係。ビットマスクされているものはエラーにならない。例：`char c = (char)(intVar0 & 0xff)`|
|u|初期化していない変数を使ったらエラーを出す。|
|s|スタックフレームの異常検出。スタックの初期値がゼロ以外の時の異常動作チェック、ローカル変数のオーバラン・アンダラン検出、スタックポインタの破壊の検出|
|1|suと同じ|
モック用のHTMLからテンプレートファイルを生成する

モックアップ修正するたびにソースをコピペするのが苦痛になったので。

テンプレートはSmartyでもAngularでも何でも良い。
今回はMT。

モックのHTMLを解析して JQuery ぽくテンプレートタグに置き換えて行けばかなり楽になるはず
標準の SimpleXML だと日本語でいろいろ問題なので php_simple_html_dom_parser を使わせてもらう。

```php:parser.php
<?php
/**
 * @see http://nplll.com/archives/2011/10/php_simple_html_dom_parser.php
 * @see http://simplehtmldom.sourceforge.net/
 */
require_once './lib/simple_html_dom.php';

/**
 * デフォルトオプションだと改行が消されるので
 */
function file_get_html_pretty($path)
{
    return file_get_html($path, false, null, -1, -1, true, true, DEFAULT_TARGET_CHARSET, false, DEFAULT_BR_TEXT);
}

$dom = file_get_html_pretty("/path/to/src/index.html");

// 変換ルールを書いてく
$dom->find('title', 0)->innertext    = '<$mt:BlogName encode_html="1"$>';
$dom->find('div.contents', 0)->innertext = <<<EOT
<mt:Entries>
<\$mt:Include identifier="entry_summary"\$>
</mt:Entries>
EOT;

file_put_contents("/path/to/tmpl/main_index.mtml", $dom);
```

適当に書いて

```html:index.html
<!doctype html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <div class="contents">
        <!-- 記事一覧とか -->
        <article>...</article>
        <article>...</article>
    </div>
</body>
</html>
```

のような html に実行すると

```html:main_index.mtml
<!doctype html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title><$mt:BlogName encode_html="1"$></title>
</head>
<body>
    <div class="contents"><mt:Entries>
<$mt:Include identifier="entry_summary"$>
</mt:Entries></div>
</body>
</html>
```

テンプレートを作成する。
Html構造変わったらソース修正必要だから、完全自動化はできないかも。
サービス名が不定のデーモンをChefのlazyで遅延処理する

<!-- permanent -->

先日JoyentのSmartOSで、困ったパッケージの配布をやられました。

- パッケージ名が一緒
- バージョンが一緒
- でもsvc上のサービスの名前が違うので、管理用に実行するコマンドが異なる

linux系で例えると、`service restart hogehoge` のhogehogeに指定する文字だけが違い、普通のパッケージ情報では分からんという状況です。


## lazyのサンプル

対象のサービスを、リソース収束の直前で、サーバの現状から調べてこなければならないと言うケースでは`lazy`による遅延処理が使用できます。

```Ruby:recipe.rb
##-本来はLibrariesに書く
module ::Helper
  def self.get_cron_service_name
    ## 本当は泥臭い判別処理を記述して、使用できる文字列を返す
    'cron'
  end
end


## サービス名を実行時に取得するリソース定義
service 'test' do
  service_name lazy { ::Helper.get_cron_service_name }
  # subscribes :restart, 'file[/tmp/hoge]', :immediately ## subscribesでもOK
end

file '/tmp/hoge' do
  content Time.now.to_s
  notifies :restart, 'service[test]', :immediately 
end
```

これで、リソースの名前は`service[test]`ですが、実際に発行されるコマンドではヘルパーが返してくれた文字列(この場合は`cron`)を使用します。


大体のケースでは`lazy`でなくとも大丈夫ですが、初回の実行などでパッケージのインストールが済んでない場合に、`lazy`しないとサービス名がわからないのですよね。


## chef-applyでお試し

```shell:chef-apply
# chef-apply test.rb 
Recipe: (chef-apply cookbook)::(chef-apply recipe)
  * service[test] action nothing (up to date)
  * file[/tmp/hoge] action create
    - update content in file /tmp/hoge from 2b795c to 04db98
        --- /tmp/hoge   2014-04-15 03:13:48.000000000 +0000
        +++ /tmp/.hoge20140415-4288-ulgn9f      2014-04-15 03:15:43.000000000 +0000
        @@ -1,2 +1,2 @@
        -2014-04-15 03:13:48 +0000
        +2014-04-15 03:15:43 +0000

  * service[test] action restart
    - restart service service[test]

```

予定通りCronがリスタートしました。

```
cron[4831]: (CRON) INFO (pidfile fd = 3)
cron[4832]: (CRON) STARTUP (fork ok)
```


## 追記

`lazy`でやると楽な事象は、なかなかのレアケースだと思います。
スレッドに関するメモ


## 変数

すべてのスレッドは同じアドレス空間で動く　ので	大域変数と静的変数は共有される。

スタックはスレッド個別に存在する　ので　ローカル変数は共有しない。


## 排他制御
`EnterCriticalSection()`
排他制御開始
同じスレッドであれば実行を妨げない。違うスレッドが排他中であれば解放まで待つ。
待ちたくない場合は`TryEnterCriticalSection()`を使う。

## tls

スレッド固有の静的変数をもつためのしくみ
kernel32.dllで実装されている

|||
|:--|:--|
|`TlsAlloc()`|確保してidを取得|
|`TlsSetValue(id,&data)`|データをセット|
|`TlsGetValue(id)`|データを取得|
|`TlsFree(id)`|領域を開放|
妄想: noscript属性

ただの妄想です。

XSSが熱い昨今ですが、実際のHTMLをコーディングする際、あちこちにスクリプトを書く事ってないですよね。なのでいっそ、書ける場所、書けない場所を制御出来たら安全になるんじゃないかなと思って、こんな妄想しました。

## noscript属性

### 概要

この属性が設定されると、その要素及び子孫要素においてスクリプトの定義が無視されるようになる。

noscript要素とは関係ない。

### 定義

```
<!ENTITY % secureattrs
 noscript    (noscript)     #IMPLIED  -- disallow any scripts in this context --
 >
```

グローバル属性。任意の要素に与えられる。値はなし（`noscript="noscript"`）。

無視されるのは以下。

* `<script>`要素
* [`on*`属性](http://www.w3.org/TR/html401/sgml/dtd.html#events)
* javascriptスキーム (`href="javascript:…"`)

## 利用例

### サーバーからもらったHTMLで

```html
<div id="notepad" noscript>
  <!-- この中への出力は安全 -->
</div>

<script>
$.ajax({
  dataType: 'text',
  url: 'partial.html',
  success: function(html) {
    // 取得したHTMLをそのまま出力
    // （きっと編集可能なリッチテキストなんだろう）
    $('#notepad').html(html);
  }
});
</script>
```

### テンプレートで

```html
<div id="post-body" noscript>
  {{body}}
</div>
```

### 割と広い範囲で

```html
<body>
  <div noscript>
    <h1>{{title}}</h1>
    <div id="post-body">{{body}}</div>
    <div id="post-comments">
      {{#each comments}}
        <div class="post-comment">
          {{body}}
          <p>By {{name}}</p>
        </div>
      {{/each}}
    </div>
  </div>
  <script src="libs.js"></script>
  <script src="andmore.js"></script>
  <script src="anyscript.js"></script>
</body>
```

## まあ

妄想ですけども。
Couchbaseでcacheをflush_allする

Couchbaseでcacheをflush_allしようとしたけど、エラーになった時にやったことメモです

```
curl -X POST -u Administrator:<PASSWORD> -d flushEnabled=1 -d ramQuotaMB=4096 http://localhost:8091/pools/default/buckets/<BUCKET>
```

```
couchbase-cli bucket-flush -c localhost:8091 --bucket=<BUCKET> -u Administrator -p <PASSWORD>
```
c3世代のEC2でUbuntu利用

# 初めに
Ivy Bridge世代のEC2インスタンス(c3、m3、i2、r3)は、旧世代(c1、m1)のインスタンスと比較して費用対効果に優れている。

新世代のインスタンスは、PV(Paravirtual:準仮想化)ではなく、HVM（Hardware-assited VM:完全仮想化)のAMIを必要とする。

OSとしてAmazon LinuxではなくUbuntuを採用する場合に必要となる、AMIなどについて記録する。

# 起動AMI
## AWSオフィシャル
2014/4/15時点、東京リージョン
### ubuntu 12.04 LTS
Ubuntu Server 12.04 LTS (HVM) - ami-f581f5f4
### ubuntu 13.10
Ubuntu Server 13.10 (HVM) - ami-23077222

## Ubuntu cloud images
Community AMIsとして利用可能。
最新14.04等も含まれるが、サポートの扱いは要注意。

>Ubuntu Cloud Images (RELEASED)
http://cloud-images.ubuntu.com/releases/

>Amazon EC2 AMI Locator
https://cloud-images.ubuntu.com/locator/ec2/


# EC2起動
AMI指定後は従来通り。
EBSブート時、c3世代インスタンスに付属のSSD領域は(/dev/xvdb)として認識する。OSシャットダウンでデータは失われるが、高速性を活かしSwapや作業領域としての利用を検討する。
等幅フォントがずれるときの対処


等幅フォントを指定しているのに
>00112233445566778899*
>０１２３４５６７８９*

のような文字列で*の位置がずれてしまう場合がある。

そういうときはフォントサイズをチェック。

フォントサイズが **奇数** だと半角２つが全角１つと同じ幅にならずレイアウトが崩れてしまう。

フォントサイズを **偶数** にすれば同じ幅になる。
GitlabとSourceTreeのつなげ方

■前提
・gitlabサーバー
・gitlabにプロジェクト作成済み（例：testprojectとする）
・sourcetreeインストール済み

■手順

１）gitlabのプロジェクトのGIT URLを取得、sourcetreeに新しいプロジェクトでクローンする
例)
GIT URL: git@192.168.1.xxx:gitlab_username/testproject.git

2) SSHキーをgitlabに貼り付ける
・SourceTreeメニューから Tools/Launch SSH Agentを選ぶ
・Pass Phraseを入力し、Generate Keyを選ぶ
・再生されたSSH KeyをGitlabのProfile Settings/SSH Keyに貼り付ける
・Launch SSH Agent画面のメニューからSSH KeyをExportする
・SourceTreeのTools/OptionsのGeneral/SSH Client Configurationから
SSH Keyをインポートする(SSH ClientをSSHにする）

3) SourceTreeからGitlabに最初のソースコード一式をあげる
・SourceTreeのRepository/Project SettingsからAddを押下する
・Remote NameをOriginにする
  URL/PathはGitlabのプロジェクトのURLを追加する( 1)を参考）
・Branchesからdevelop/masterなどから右クリックし、push to originでソースコードをアップする
perl の Net::SFTP::Foreign でファイルを同期する

サーバー間でファイルを双方向に同期する必要が生じたので、perl でスクリプトを書いてみました。

## SFTP とは
セキュアなファイル転送プロトコルとしては SFTP と FTPS があって紛らわしいのですが、FTP を SSL/TLS を通して安全に使えるようにしたものが FTPS で、SFTP は FTP とは無関係に、SSH プロトコルの一部（？）としてファイル転送を行えるようにしたもののようです。

<blockquote class="twitter-tweet" lang="ja"><p>scp と sftp と ftps の違いがよく分からん。scp は ssh 経由で cp コマンドを遠隔実行、sftp は ftp とは無関係で ssh 経由で独自のファイル転送プロトコルを実装したもの、ftps はいにしえの ftp を SSL 対応したもの、なのかな。</p>&mdash; Hoshi, Takanori (@hoshi_takanori) <a href="https://twitter.com/hoshi_takanori/statuses/451532048692285440">April 3, 2014</a></blockquote>

また、SFTP はスクリプト言語から制御できるので、単純なコピーではなく、双方向の同期にはぴったりだと思われます。

## Net::SFTP::Foreign
perl から SFTP を使うには <a href="http://search.cpan.org/perldoc?Net::SFTP::Foreign">`Net::SFTP::Foreign`</a> というモジュールを使えばいいようです。Debian には <a href="http://packages.debian.org/libnet-sftp-foreign-perl">`libnet-sftp-foreign-perl`</a> というパッケージがありました。

```shell-session
$ sudo apt-get install libnet-sftp-foreign-perl
```

### 接続
とりあえずこんな感じで接続します。かんたん。

```pl
use Net::SFTP::Foreign;
 
my $HOST = 'user@example.com';
my $PASS = '********';
my $MORE = [ -o => 'StrictHostKeyChecking no' ];
 
my $sftp = Net::SFTP::Foreign->new($HOST, password => $PASS, more => $MORE);
```

more にいろいろオプションを指定できるようなので、未知の鍵に関していちいち確認されないように <a href="http://d.hatena.ne.jp/atsumu-t2/20110630/1309415184">`StrictHostKeyChecking no`</a> を指定してみました。

### ファイル一覧
接続先のファイル一覧は `$sftp->ls($dir, ...)` で取得できます。ファイル名が . で始まらない通常ファイルのみをソートして取得してみます。

```pl
my $files = $sftp->ls($dir, ordered => 1, no_wanted => qr/^\./,
                            wanted => sub { S_ISREG($_[1]->{a}->perm) });
```

結果は配列のリファレンスで、その中身は

```pl
foreach my $file (@$files) {
    my $filename = $file->{filename};
    my $mtime = $file->{a}->mtime;
}
```

のようにアクセスできます。`$file->{a}` は stat の結果と似ています。

### ファイルの送受信
ファイルの送信は以下のようにします。

```pl
$sftp->put("$local_dir/$filename", "$remote_dir/$filename");
```

また、ファイルの受信は以下のようにします。

```pl
$sftp->get("$remote_dir/$filename", "$local_dir/$filename");
```

それから、接続先のファイルの削除は以下のようにします。

```pl
$sftp->remove("$remote_dir/$filename");
```

あとは、接続先とローカルのファイルの一覧を比較して、新しい方を送受信すればいいだけですね。削除に関しては、新しい方のファイルサイズが 0 なら削除ということにしてみました。

## できあがり
ってなわけで、できあがり。コードは gist にあります。
https://gist.github.com/hoshi-takanori/9948910
Windows7上でのImagination PowerVR Insider SDKのインストール


## ダウンロード
[Imagination Technologyの英語サイト]
(http://www.imgtec.com/powervr/insider/powervr-insider.asp)からInsider SDKのWindows版をダウンロードする。

2014年4月15日現在、バージョンは3.3でサイズは8294KBです。

ユーザ登録していない人は先にユーザ登録をしてください。

## インストール
ダウンロードした **PowerVRSDKSetup-3.3.exe** をクリックして実行する。

- 次のようなダイアログが現れるので **Next** をクリックします。
![kobito.1397529146.012038.png](https://qiita-image-store.s3.amazonaws.com/0/24820/41a006f4-ce81-d613-0f8d-85084ddc7645.png "kobito.1397529146.012038.png")

- 次次のようなダイアログが現れるのでライセンスを確認して **Yes** の方をチェックして **Next** をクリックします。
![kobito.1397529406.498240.png](https://qiita-image-store.s3.amazonaws.com/0/24820/bd515d09-3f87-fc8c-19c5-2615b6d46472.png "kobito.1397529406.498240.png")

- 次のようなダイアログが現れるのでデフォルトのまま(不要なものがあれば削除してください) **Next** をクリックする。
![kobito.1397529438.913065.png](https://qiita-image-store.s3.amazonaws.com/0/24820/3c7e3b03-f58d-7013-6023-b48d5e97d50d.png "kobito.1397529438.913065.png")

- 次のようなダイアログが現れるのでAndroidとWindowsにチェックをして(必要に応じて追加、削除してください) **Next** をクリックします。
![kobito.1397529493.204175.png](https://qiita-image-store.s3.amazonaws.com/0/24820/20435071-4a2b-596e-cf00-f2762d0093fe.png "kobito.1397529493.204175.png")

- 次のようなダイアログが現れるので **Add PVRVFrame to PATH** にチェックを入れ **Next** をクリックします。
![kobito.1397529660.577057.png](https://qiita-image-store.s3.amazonaws.com/0/24820/d2561675-4cb3-6cce-1c40-531f3ceea880.png "kobito.1397529660.577057.png")

- 次のようなダイアログが現れるので **Source Directory** を変更して **Next** をクリックします。
![kobito.1397529858.113656.png](https://qiita-image-store.s3.amazonaws.com/0/24820/ef92d2f4-9b5f-d4da-cd83-305f41a5a27a.png "kobito.1397529858.113656.png")

- ネット版の場合は、ネットワークからダウンロードとインストールが始まります。画面はスタンドアロン版です。
![kobito.1397530025.226858.png](https://qiita-image-store.s3.amazonaws.com/0/24820/f32777ed-731f-3014-bc50-5155d2d12c7f.png "kobito.1397530025.226858.png")


英語版のPhotoShopがあれば、プラグインがインストールされます。

- インストール完了です。 **Finish** で終了して下さい。
![kobito.1397530172.491594.png](https://qiita-image-store.s3.amazonaws.com/0/24820/5ab16236-5377-9747-6e91-c13267c7634a.png "kobito.1397530172.491594.png")

デフォルトですと、C:\Imagination\PowerVRファオルダの下に
- GraphicsSDK
- OpenRL SDK 1.3 R2
がインストールされます。
一歩先のiOS開発へ！SonyのレンズカメラQX10/100向けライブラリを作った。iPhoneと外部デバイス連携開発その１.

by @mixiappwchr


![QX10_mainvisual_index.jpg](https://qiita-image-store.s3.amazonaws.com/0/37731/9bc80fb7-389a-f517-9827-122a97287356.jpeg)


昨今ウェアラブルデバイスやらiBeaconやらスマホ以外のデバイスが盛り上がってきてますが、今後はより、スマホを起点とした外部デバイスとの連携サービスが益々重要なってくると思います。

そこで、これからスマホと外部デバイスの連携開発を調査できれば思います。

まずは、そのコンセプトの面白さから話題となったSonyのレンズカメラQX10/100との連携をさせてみたいと思います。

このデバイスはコンセプトも面白いですが、何と言ってもAPIが公開されているので夢が膨らみます。

そこでiOS向けのライブラリがなかったので作ってみました。

# SonyCameraRemoteAPI
https://github.com/nyankichi820/SonyCameraRemoteAPI

基本的にJSONRPCで扱えるので取り回しは楽なのですが、ちゃんとやるとSSDPでの機器検索やliveプレビューは、生パケットの処理があったりするのでその辺もカバーしました。

まだハンドリングが甘いので調整が必要ですが、例えばカメラから取得した画像をGPUImageで処理するなんてことが可能です

例：プレビュー画像に対してフィルタ処理をかける。

```objc
 self.client = [[SonyCameraRemoteAPIClient alloc] init];
    
    
     __weak __typeof(self)weakSelf = self;
    [self.client discoverDevices:^(NSDictionary * result, NSError *error) {
        weakSelf.shootButton.enabled = YES;
        weakSelf.statusLabel.hidden = YES;
        [weakSelf.client captureLiveview:[result objectForKey:@"liveviewstream"] captured:^(NSData *result, NSError *error) {
            UIImage *image = [UIImage imageWithData:result];
            if(!image){
                return;
            }
            dispatch_async(dispatch_get_main_queue(), ^{
                
                GPUImageSwirlFilter *filter = [[GPUImageSwirlFilter alloc] init];
                [filter setAngle:0.3];
                UIImage *filteredImage = [filter imageByFilteringImage:image];
                weakSelf.imageLayer.contents = (id)filteredImage.CGImage;
                
            });
        }];
        
        
    }];
```

その他、細かい制御もAPIで操作可能なのでぜひ面白いアプリを作ってみてください！

##### appwchr post
----
[iOSの開発をする上で絶対に使うべき！外せない！webサービス、開発ツール集]
(http://qiita.com/appwatcher/items/07a3babcb9b6cefb307e)

[iOSでこんなアプリ,こんな機能を作りたかったらこれを見ろ！作りたいアプリに対応するクラス、フレームワーク、ライブラリのまとめ！]
(http://qiita.com/appwatcher/items/b02255026a3ee6d95142)

[注目のiBeacomなどの波に乗り遅れないために！iOSのBluetooth開発を容易にするライブラリを書きました。]
(http://qiita.com/appwatcher/items/7491beffd7260b713542)

[まだまだあった！iOSの開発を劇的に改善する最新のwebサービス、開発ツール集１]
(http://qiita.com/appwatcher/items/f0024fe2ac34da345f04)

[さらに快適なアプリ開発を！iOSの開発をもっと劇的に改善する最新のwebサービス、開発ツール集2]
(http://qiita.com/appwatcher/items/c15d7311e71b4c2b77f1)

[スパゲッティから脱出！iOS開発における遷移の問題をすっきり解決する便利ルーティングライブラリをご紹介]
(http://qiita.com/appwatcher/items/259e8d13fff0547e90af)
このsubmodule httpで登録されてるんだけどsshにしたい。。。

メモ。

とりあえず`.gitmodules`に入ってる情報を

```
[submodule "deps/foo"]
        path = deps/foo
        url = git@github.com:foo-org/foo.git
```

などと編集しただけでは依然httpで、どうしたものかと思っていたら、


`$ git submodule init`は`.git/config`にも情報を書き込むんですね。

ということで
`$ git config -e`
などして

```
[submodule "deps/foo"]
        url = git@github.com:foo-org/foo.git
```
という感じに編集すればOKだった。

# 追記
@ngyuki さんにコメントいただきました！

`git submodule sync`
という便利なコマンドがあるようです！
ある画像フォルダとデプロイされた画像の差分を求めるメモ

assetsフォルダ以下にあるファイルとdeployのときに生成されるmanifest.ymlを比較して、差分があるかどうかを求めるプログラム

1. 色々画像が入ってるassetsフォルダが必要
2. manifest.ymlも必要
3. ダウンロードしてきた、ローカルのパスをfile_pathに設定して

```rb
files = []
Dir.glob('./assets/**/*').each do |f|
  scans = f.scan(%r{^\./assets/(([a-zA-Z0-9_]|/)+).+(\.[a-zA-Z]+)})
  file = ""
  unless scans.empty?
     file = scans[0][0] + scans[0][2]
     files << file
  end
end
files.uniq!

manifest = File.readlines("./manifest.yml")
manifest.delete_at(0)
deploy_files = []
manifest.each do |mani|
  splits = mani.split(":")
  deploy_files << splits[0]
end

diff = files - deploy_files

exist_file_path = []
diff.each do |p|
  file_path = "any/assets/#{p}"
  if File.exist? file_path
    exist_file_path << file_path
  end
end

puts exist_file_path
```
FuelPHP開発入門_06


前記事[(FuelPHP開発入門_05)](http://qiita.com/yumura_shiho/items/3999e66da8669ed5e0c2)では誤情報を掲載してしまい申し訳ありませんでした。
ついでに、&lt;s&gt;&lt;/s&gt;で打ち消し線を書いていたつもりがQiita側に反映されておらず…。
KobitoとQiitaで表示が違うことに気が付かないまま日をまたぐ失態(´@ω@｀;)

前回はController_Templateを使った実装を行いましたので、
今回はForm作成→からのpost取得をやります。

## フォームヘルパー

CakePHP同様、FuelPHPにもフォームヘルパーが用意されています。
PHPのソースをHTMLのために切ること無く、且つ

```php
<?php
	echo '<input type="text" name="hoge" />';
?>
```

なんていうソースを書かないで済む(※コーダー的美意識)便利なものです。
ビューファイルに直接記述します。HTMLに慣れていればそんなに抵抗なく読めるのではないかと
書き方は以下。

```view/hoge/hoge.php
<?php
	/*
	 * フォームを開始します。actionはコントローラー/アクションの形で記述します。
	 * (この場合はController_Hogeクラスのaction_hogeメソッド)
	 */
	echo Form::open(array('action'=>'hoge/hoge' ,'method'=>'post'));

	/* 
	 * <input type="text" name="hoge" class="default" />
	 * 基本的には第一引数がname、第二引数がvalue、第三引数がclassなど
	 */
	echo Form::input('hoge','',array('class'=>'default'));

	/*
	 * labelは引数の意味が違うので注意
	 * 第一引数が表示名、第二引数が関連付けするフィールドのID
	 */
	echo Form::label('説明','txtArea',array('class'=>'default-label'));
	echo Form::textarea('description','',array('id'=>'txtArea','rows'=>6));

	echo Form::checkbox('accept',false,array('id'=>'checkboxRequired'))

	// submit
	echo Form::input('send','送信',array('class'=>'btn','type'=>'submit'));

	//hidden
	echo Form::hidden('hid','secret',array());
?>
```

など。
ちなみにhiddenはForm::open()に記述することも可能で、

```php
<?php
	echo Form::open(
		array('action'=>'hoge/hoge' ,
		'method'=>'post' ,
		'class'=>'default'),
		array('hid'=>'secret'))
?>
```

open()の第四引数がhiddenのフィールドになっています。
これはSimpleAuthなどを利用するときの頻出となります。

フォーム部品について、詳しくは[FuelPHPの公式リファレンス](http://fuelphp.jp/docs/1.7/classes/form.html)を参照してください。
リンクはバージョン1.7です。

このpostを受け取るPHPの記述は以下

```controller/hoge.php
	public function action_hoge()
	{
		$post = Input::post();
		if(!empty($post)){
			// $post=array('hoge'=>'入力値','description'=>'入力値'...
			$hoge=$post['hoge'];
		}
		$this->template->title="画面タイトル";
		$this->template->content = View::forge('hoge/hoge');
	}
```

Input::post()に連想配列でデータが入っています。
ファイルがどうなっているのかはまだ確認取れていないので、後に。

次はこのデータをデータベースに登録しようと思います(´@ω@｀)
説明の順番がわからなくなってきました…難しい。
やってみよう分析！〜データサイエンティストもコーディング始めました〜 By Fringe81


# はじめに
1部に入る前に、シリーズ全体の目的と構成を簡単に説明します。
このシリーズの目的は、主に次のような知識や技術を提供することです。

- データ収集/加工/集計/可視化の技術(ツールインストールから利用方法まで)。
- 機械学習・統計などの知識・簡単な実用例(一部、数理的な説明もあります)。

これらの知識を実務での活用シーンを念頭に提供することで、ビジネスプロセス
の自動化、高速化、安定化、スケール拡大のヒントを提供できればと考えています。

また、できるだけ丁寧な説明を心がけ、実際に自分でツールや分析手法を
使えるようになることも狙いのうちの一つです。

このシリーズは下記目次(変更の可能性あり)のように
入門編、実践編、アドバンストピック(予定)から構成されます。

----

## 入門編
### 第1部  イントロダクション
- [第1章：分析技術の活用～ビジネス視点から](http://qiita.com/msano/items/2f39517b4cd65e14003e)
- [第2章：分析手法を眺めてみよう！](http://qiita.com/msano/items/bfdb3c04d59992c7ebcb)

### 第2部  エクセルで学ぶ分析入門
- [第3章：ExcelとMySQLの連携](http://qiita.com/msano/items/fdcc0cbb8e41b988ce2d)
- [第4章：ExcelとMySQLの連携2 csvデータのimport](http://qiita.com/msano/items/7dff8bc241799875b7e9)
- [第5章：Excelの分析ツールとソルバーの活用(回帰、最小2乗法)](http://qiita.com/msano/items/dc96da37ce8ddd4a7c1d)
- [第6章：Excelソルバーの応用(ポートフォリオ最適化)](http://qiita.com/msano/items/46d92aadbfcb1423e1ec)
- [おまけ2-1:Excel VBAで強化学習(Q-learning, ε-greedy / softmax 行動選択)](http://qiita.com/msano/items/e2df51f514b3ccb375ea)
- [おまけ2-2:Excel VBAでモンテカルロ・シミュレーション(メトロポリス法：2次元イジングモデルの例)](http://qiita.com/msano/items/e6d0f941ba038cc1a62c)

### 第3部  データ可視化（ビッグデータに限らない）
- [第7章：Google Charts Sankey Diagramを使ってデータ可視化](http://qiita.com/msano/items/6c3d9d10148a683c0d7b)

## 実践編
### 第4部  Python/Scalaで分析ことはじめ
- [第8章：PythonとEclipse(PyDev)で作る分析環境 for Windows](http://qiita.com/msano/items/e94a641274c5b7f6a75a)

### 第5部  数値計算ライブラリを使ってみよう
### 第6部  Hadoop (Streaming)を使ってみよう
### 第7部  ScalaのSpark/Sharkと戯れる
### 第8部  twitter APIをいじってみよう
### 第9部  Facebook APIをいじってみよう
### 第10部  最適化分析
### 第11部  時系列分析(自己相関分析、相互相関分析)
### 第12部  ネットワーク分析
### 第13部  機械学習　教師あり学習(クラスタリング)
### 第14部  機械学習　教師なし学習(強化学習)
### 第15部  モンテカルロシミュレーション

## アドバンストピック(仮)
### 第16部　金融工学と素粒子物理学(理論)
### 第17部　経済物理学(理論)

## Appendix
- [A-1：Windows 7 Professional + Visual Studio Express 2013にCUDA6.5をインストール](http://qiita.com/msano/items/a12c422ed4f6862306a0)

----


## これから
入門編では多くの方に馴染みがあると思われるエクセルの利用からはじめます。
分析ツールやソルバーの活用、MySQL連携と徐々にステップアップしていきます。

ツールの活用方法の説明の後、それらを使って分析手法を解説していきます。
入門編の最後では可視化ツールも紹介する予定です。入門編に続く実践編では、
スクリプト言語やAPIなどを活用して、より複雑なデータ処理に対処できる
分析技術を紹介します。

アドバンストピックは入門編、実践編とは趣が異なり、確率過程について
理論的側面を取り上げる予定です。これは世の中の時間とともに変化する
データは確率的な振る舞いを持っており、この概念の知見がビジネスシーン
でも参考になるのではないかと考えられるからです。

以上が、本シリーズの全体像です。

本シリーズの目的は具体的な分析スキルの紹介にありますが、
詳細に入る前に引き続く第1部残りの章で下記を簡単に説明します。

- ビジネスサイクルへの分析手法活用メリット。
- 様々な分析手法の概観。


第2部以降の記事では具体的に個々のツール活用方法や
個別の分析手法の解説に入ります。
マウスに画像を追随させると、イベント登録した要素をクリックできない

自分でもわかりにくいので図にしました
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/1642/e6b3115a-7912-e037-f2ff-451b4bd40a5a.png)
![無題2.png](https://qiita-image-store.s3.amazonaws.com/0/1642/ce961bd5-25fa-7d43-d3d3-afc7d241b737.png)
![無題3.png](https://qiita-image-store.s3.amazonaws.com/0/1642/979d52da-28a9-2615-f5e2-ca79496d2a0d.png)

# またハマった

ずいぶんと時間が経って、同じような問題でまたハマった。
解決策はずいぶん昔にコメントでいただいていた。


```css:css

#something {
   pointer-events: none;
}

```

これを、イベントを吸収する要素にバシバシ設定すればいい。
Linux(CSE)のCapsLockキーをCtrlにしたい

「せっかく家のwindowsもコントロールキーの場所入れ替えたのになんなんだよ！うらぎってんじゃねーよ！！！」って人へ

コントロールセンター→キーボード→タブ[配列]→レイアウトのオプション→
Ctrl key position→At left of 'A'
ChromeでSSL証明書失効確認を有効にする

# Chrome はデフォルトでは確認してくれない

最近は Heartbleed 問題で新規にSSL証明書を発行し、古い方は失効(revoke)させているところも多いようですが
実は Chrome はデフォルトではオンラインでのSSL証明書失効確認をしてくれないようです
これでは失効済みの不正な証明書が悪用されたWebサイトへ訪問しても判別できないことになりますね

## オンラインの証明書失効確認を有効にする

1. 設定画面を開く、もしくは `chrome://settings/` を URL に記述
2. 「詳細設定を表示...」から「サーバー証明書の取り消しを確認する」を有効にする

こんだけです

IE や FireFox や Opera　等はデフォルトでは確認するようになっているようです
Chrome は version up が激しいので、今後デフォルト値が変わるかもしれないですね
自分のスレッドの優先度を取得する方法


```C
DWORD id = GetCurrentThreadId();
HANDLE h = OpenThread(SYNCHRONIZE | THREAD_QUERY_INFORMATION,false,id);
int priority = GetThreadPriority(h);
CloseHandle(h);
```
　

**得られるプライオリティ値**

|`priority`|対応マクロ(WinBase.h)|メモ|
|:--|:--|:--|
|-2|THREAD_PRIORITY_LOWEST|
|-1|THREAD_PRIORITY_BELOW_NORMAL|
|0|THREAD_PRIORITY_NORMAL|
|1|THREAD_PRIORITY_ABOVE_NORMAL|
|2|THREAD_PRIORITY_HIGHEST|
|0x7fffffff|THREAD_PRIORITY_ERROR_RETURN|取得できなかった時
|15|THREAD_PRIORITY_TIME_CRITICAL|11以上の優先度ではOSの動作に影響する
|-15|THREAD_PRIORITY_IDLE|
perl で時刻計算 - Time::Piece編 - 指摘されたのを修正したバージョン

前回記事に指摘があったので、朝一のスタバで自分なりにやってみました。

```pl:love_and_piece.pl
#!/usr/bin/env perl

use strict;
use warnings;

use Time::Piece;
use Time::Seconds;

# Time::Pieceオブジェクトの取得
print "Time::Piece ",$Time::Piece::VERSION,"\n";
my $t;
# $t = "2014-01-29"; # 入力パラメータとかで渡ってきたとする。
if ($t) {
    $t = localtime( Time::Piece->strptime($t, '%Y-%m-%d') );
}
else {
    $t = localtime; # 渡ってこなければ現在時刻
}
# 日付や時刻の情報の表示
print $t->ymd,"\n";
# $t += ONE_MONTH; # 一ヶ月後
$t = $t->add_months(1);
print $t->ymd,"\n";
```

__結果__
>
Time::Piece 1.20_01
2014-04-15
2014-05-15

__入力パラメータのコメントアウトを外した場合__
>
Time::Piece 1.20_01
2014-01-29
2014-03-01

修正点：
strptime の箇所をlocaltime で囲んだ。
ONE_MONTHで計算すると正確に一カ月にならないので、add_monthsメソッドを使用した。


参考：
[Time::Piece とタイムゾーンの甘い罠](http://d.hatena.ne.jp/hirose31/20110210/1297341952)
[Time::Seconds::ONE_MONTH](http://blog.clouder.jp/archives/000409.html)


やべー現場に遅れそうだ。。。大手町のスタバありがとう(笑)