OmniAICreator/Qiita-1.07M huggingface dataset:
Redshiftは破壊と再生を繰り返した方がいいよ


最近、Redshiftを検討するため調べたメモです.
RedshiftはInsertやUpdate、さらにはカラム型なので１行単位のSelectが遅いらしいです. PostgreSQLと互換があると言っても同じように使えません.
同じ感じに使うと遅くて辛い目にあいます.

DBとして役たたない感じに聞こえますが集計等が得意なので、
それ以外は割り切った使い方をした方が良い感じです.

この記事で書かれている内容は以下のスライドで **アトミック洗い替え** を検証したものになります.

- [Amazon Redshiftによるリアルタイム分析サービスの構築](http://www.slideshare.net/mineroaoki/at-aws-summit-tokyo-2014)



## データ作成と集計を分離する

検証するためにテーブル`sample1`を作成します.
このテーブルは集計用で更新系のクエリは発行しません.

```sql
BEGIN;
CREATE TABLE sample1 (c1  BIGINT NOT NULL);
INSERT INTO sample1 VALUES (1), (2);
SELECT * FROM sample1;
COMMIT;
```

次にテーブル`sample1_new`を作成します.
このテーブルは更新系で具体的にはInsert若しくはCopyでS3等からデータを投入するようにします.

```sql
BEGIN;
CREATE TABLE sample1_new (c1  BIGINT NOT NULL);
INSERT INTO sample1_new VALUES (11), (12);
SELECT * FROM sample1_new;
COMMIT;
```

次に`sample1`と`sample1_new`を入れ替えてロールバックしてみます.
トランザクション内では`sample1`の内容が変わっていることが確認できました.

```sql
BEGIN;
ALTER TABLE sample1 RENAME TO sample1_old;
ALTER TABLE sample1_new RENAME TO sample1;
SELECT * FROM sample1; -- 11, 12
ROLLBACK;
```

ではロールバックは正しくできているか確認してみます.

```sql
BEGIN;
SELECT * FROM sample1; -- 1, 2
COMMIT;
```

今度は入れ替えをコミットします.

```sql
BEGIN;
ALTER TABLE sample1 RENAME TO sample1_old;
ALTER TABLE sample1_new RENAME TO sample1;
COMMIT;
```

Selectした結果が入れ替わっているか確認してみます.

```sql
BEGIN;
SELECT * FROM sample1; -- 11, 12
COMMIT;
```

この様な感じでアトミックにデータ更新ができました.
長所と短所を把握して設計してあげれば実用に使えます.

ちなみに、トランザクション中、他のトランザクションの開始を確認したところ、先に開始したトランザクションが終了するまで待たされます.
OpenSSLのversion up


Check current status

```bash
rpm -q --changelog openssl | less
```

![スクリーンショット 2016-06-29 17.38.29.png](https://qiita-image-store.s3.amazonaws.com/0/39073/25ec2c7c-73b7-665e-5c8d-05d8625b93c6.png "スクリーンショット 2016-06-29 17.38.29.png")

OpenSSLのupdate

```bash
sudo yum update openssl
```

You can check it again.

```bash
rpm -q --changelog openssl | less
```

![スクリーンショット 2016-06-29 17.34.28.png](https://qiita-image-store.s3.amazonaws.com/0/39073/85b732cc-c0a5-1bbc-adc0-d47f019db24c.png "スクリーンショット 2016-06-29 17.34.28.png")
aws-sdk for Ruby 複数バージョン(v1, v2)の共存

※　2017/01/19更新
paperclipの5系がリリースされ、aws-sdkのv2が正式にサポートされました。（同時にv1のサポートはなくなりました）
詳細はこちらに記載されています。
https://github.com/thoughtbot/paperclip/releases/tag/v5.0.0.beta1

なので、この記事はpaperclipの4系を使っている人、もしくは何らかの理由でaws-sdkのv1とv2を共存させる必要がある人が読んでください。

新しくPaperclipの5系をインストールすると以下のメッセージが出るので、これに沿って対応してください。

```
Post-install message from paperclip:
##################################################
#  NOTE FOR UPGRADING FROM 4.3.0 OR EARLIER       #
##################################################

Paperclip is now compatible with aws-sdk >= 2.0.0.

If you are using S3 storage, aws-sdk >= 2.0.0 requires you to make a few small
changes:

* You must set the `s3_region`
* If you are explicitly setting permissions anywhere, such as in an initializer,
  note that the format of the permissions changed from using an underscore to
  using a hyphen. For example, `:public_read` needs to be changed to
  `public-read`.

For a walkthrough of upgrading from 4 to 5 and aws-sdk >= 2.0 you can watch
http://rubythursday.com/episodes/ruby-snack-27-upgrade-paperclip-and-aws-sdk-in-prep-for-rails-5
```

# 背景
Railsでアプリを書いていてaws-sdkからECSを操作したくなったのですが、Rails内で画像操作用gemのpaperclipのバージョン4系を使ってS3に画像を保存していて問題にあたったのでメモ。

* paperclipはaws-sdkのv2では使えない（バグが有る）
* ECS用のapiはaws-sdkのv2にしか存在しない

# paperclipのバグ
aws-sdkはv2で後方互換を切られてしまっているので、v2の上でpaperclipを使うと以下の様なエラーが出ます。

```
uninitialized constant Paperclip::Storage::S3::AWS
```

公式のIssueには挙げられていて、一度対応されたようですが結局他に問題が出るようでRollbackされています。

* [AWS Version 2 support - uninitialized constant Paperclip::Storage::S3::AWS #1764](https://github.com/thoughtbot/paperclip/issues/1764)
* [Roll back aws-sdk gem to < 2.0, 2.0 is not compatible with paperclip #91](https://github.com/ForeverFamilyFoundaton/forever-family-foundation/pull/91)

さらに、paperclipのバージョン4の間は対応しないと明記されています。

* [Does Paperclip 4.3.1 support aws-sdk-v2? #2021](https://github.com/thoughtbot/paperclip/issues/2021)

![Does Paperclip 4.3.1 support aws sdk v2  · Issue  2021 · thoughtbot paperclip.png](https://qiita-image-store.s3.amazonaws.com/0/39236/33fbd08e-b0b1-5c54-8991-7d9ec362a7f8.png)

# aws-sdk複数バージョンの共存
aws側も後方互換を切ってしまっている認識はあるらしく、トップレベルの名前空間を変えてくれているので両方のバージョンを共存させることができ、問題を解決できました。
v1のトップレベルはAWS、v2のトップレベルはAws（Aだけ大文字）になっています。

また、Gemも別名で切り出してくれているのでGemfileを

```ruby:Gemfile
gem 'aws-sdk-v1'
gem 'aws-sdk', '~> 2.x.x'
gem 'paperclip'
```
とすればOKです。

今回の問題以外でも複数バージョンを共存させて順次バージョンアップに対応させることが出来るので知っておいて損はないかと思います。

# Reference
[AWS SDK for Ruby V2 - Qiita](http://qiita.com/ryo0301/items/08a2a0451ab8d568b8b0)
感觉Qiita不错

感觉Qiita不错，试试写作。
![屏幕快照 2016-06-03 下午4.25.28.png](https://qiita-image-store.s3.amazonaws.com/0/131609/6fc9d61c-6253-3564-3fd6-0ec698ccd365.png)


oo  markdown
OwinにおいてCookieを使った認証処理で使われているソースへのリンク集

# microsoft.owin.security

- AuthenticationManager<br>
https://katanaproject.codeplex.com/SourceControl/latest#src/Microsoft.Owin/Security/AuthenticationManager.cs


# micorsoft.owin.security.cookie

- IAppBuilderへの拡張メソッド UseCookieAuthentication<br>
https://katanaproject.codeplex.com/SourceControl/latest#src/Microsoft.Owin.Security.Cookies/CookieAuthenticationExtensions.cs
- CookieAuthenticationOptions.CookieManagerのデフォルト値<br>
https://katanaproject.codeplex.com/SourceControl/latest#src/Microsoft.Owin/Infrastructure/ChunkingCookieManager.cs
- UseCookieAuthenticationで設定されるミドルウェア<br>
https://katanaproject.codeplex.com/SourceControl/latest#src/Microsoft.Owin.Security.Cookies/CookieAuthenticationMiddleware.cs
- リクエストとレスポンスのハンドラ<br>
https://katanaproject.codeplex.com/SourceControl/latest#src/Microsoft.Owin.Security.Cookies/CookieAuthenticationHandler.cs
google geoLocation API をWifi特化で利用する

# 背景
GPSの実地精度を測定したところ
主とする雑居ビルの立ち並ぶ街中で非常に精度が低かった。
iOSにおけるWifiのみでの位置情報測定での最小誤差65mで返ってくることもしばしば発生した

測定に使ったアプリのソースはこちらで公開
https://github.com/maunamoana/gosasoku

そのため、wifiでの位置情報測定が実際はどの程度の精度を保証してくれるかを調査することにした。


# API コール
https://developers.google.com/maps/documentation/geolocation/intro

googleのアカウントを登録し、keyを発行する。

取得したキーを YOUR_API_KEYの部分に置き換え、jsonをpostする
https://www.googleapis.com/geolocation/v1/geolocate?key=YOUR_API_KEY

```bash:qiita.bash
JSON='{
  "macAddress": "01:23:45:67:89:AB",
  "signalStrength": -65,
  "age": 0,
  "channel": 11,
  "signalToNoiseRatio": 40
}'
```

signalStrengthにはデシベル値を指定
AndroidアプリならWifiManagerで取得可能
macAddress以外は必須ではない模様


```bash:qiita.bash
curl -H 'Content-type:application/json' -d "$JSON" https://www.googleapis.com/geolocation/v1/geolocate?YOUR_API_KEY
```

レスポンス

```json:qiita.json
{
 "location": {
  "lat": 35.442457100000006,
  "lng": 139.64011829999998
 },
 "accuracy": 2861.0
}
```

# その他の叩き方

今回の目的はiOSでの利用予定のため、SignalStrengthが取得できない恐れがあるため
複数のmacアドレスでコールする。

```json:qiita.json
{
"wifiAccessPoints": [
  {
   "macAddress": "00:xx:xx:xx:xx:xx",
   "age": 0
  },
  {
   "macAddress": "01:xx:xx:xx:xx:xx",
   "age": 0
  },
// 中略
  {
   "macAddress": "09:xx:xx:xx:xx:xx",
   "age": 0
  }
 ]
}
```

このように実際に取得したMacアドレスを5件ほど指定すると
シグナルの強度を指定しなくても比較的よい実行精度が取れた。

# 実地調査
ビルの谷間の駐車場にて数回Wifiアナライザーで取得した結果のXMLをJSONに変換してコールした。
一か所につき、40以上のアクセスポイントが上がってくる。
特にSSIDでモバイルwifiを除去することなしにコール
signalStrengthを入力しない場合はレスポンスのaccracyは150
signalStrengthをを指定すると、accuracyは60m以内に収束する
結果自体はどちらも本来の位置とはブレており、signalStrengthを指定したほうが建物の中に入り込む結果もでたが双方ともに概ね10m程度の誤差に収まる結果が出た

比較として横浜みなとみらいの広大に開けたエリアでも測定すると
路地に比べると大きく誤差が出た
特に、signalStrengthを指定しない場合は全く異なる場所を指すほどに誤差が大きくなる
accuracyの値は路地裏と同じく強度を指定しない場合は150から200は超えてない
逆に、このような解放エリアではGPSの精度はよく、実測精度でも5m-10m程度に収まるため
WifiとGPSでの位置測定は補完関係にあることが分かった
gitlab.com上でgitlab-ciを動かし、GitLabRegistryにdocker build & pushする

# 概要

gitlab.comではプライベートなリポジトリが作れる上に、プライベートなDocker Registryも立てられるということで、
github + DockerHubを連携させるような感じで、プライベートな、仲間内で使いまわすようなコンテナを管理したい。

社内にプライベートなDocker Registryを立てようとするも、証明書がオレオレ証明書なのは・・・と躊躇したり、
DockerHubに公開するのも（何らかの事情で）難しい場合には良いと思う。

1か月ぐらい前にチャレンジしたときは動かせなかったのに、今日やったらうまくできた記念。

# 使うもの

すべて、[GitLab](https://gitlab.com/)さんが提供してくれるものを使う。ローカルリソースは常に枯渇しておるのです。

|もの|説明|
|:--|--:|
|GitLab|Dockerfileなどの資材を管理する|
|Gitlab-CI|docker buildやdocker pushを行う。標準で使えるSharedRunnnerを使う|
|Registry|Gitlabさんが提供してくれるDockerRegistry|

# 前提

gitレポジトリには、以下のファイルを置いておきます。

- Dockerfile 
- .gitlab-ci.yml (ビルドスクリプト）
- その他Dockerfile内で使用される各種資材


# pushのたびにbuildする例

[Using the GitLab Container Registry](http://docs.gitlab.com/ce/ci/docker/using_docker_build.html#using-the-gitlab-container-registry)に記載のあるサンプルをもとに作成する。

**registry.example.comをregistry.gitlab.comに変えればOK！！！**

`https://gitlab.com/(ユーザ名かグループ名)/(プロジェクト名)/container_registry `にアクセスし、表示されている内容をメモっておく。

ユーザ名：hoge
プロジェクト名：bar

とした場合は、こんな感じになる。

```yaml

image: docker:latest
services:
   - docker:dind

before_script:
  - docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN registry.gitlab.com

build:
   stage: build
   script:
     - docker build -t registry.gitlab.com/hoge/bar:latest .
     - docker push registry.gitlab.com/hoge/bar:latest
   tags:
     - docker

```

# タグがついたらタグをつけて登録する例

[GitLab Documentation](http://docs.gitlab.com/ce/ci/variables/README.html)に使える変数の一覧があって、
そこにタグを示す値が**$CI_BUILD_TAG**とあるので、これを使う。

onlyにtagsを設定しておくことで、通常のpushではビルドせず、タグが打たれたらビルドされるようにしておく。

```yaml

image: docker:latest
services:
   - docker:dind

before_script:
  - docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN registry.gitlab.com

tag-build:
   stage: build
   only:
     - tags
     - triggers
   script:
     - docker build -t registry.gitlab.com/hoge/bar:$CI_BUILD_TAG .
     - docker push registry.gitlab.com/hoge/bar:$CI_BUILD_TAG
   tags:
     - docker

```

# 確認

ビルドできるDockerfileをpushしたり、タグを打ってみたりして、ビルドされることを確認する。

![GitLab.png](https://qiita-image-store.s3.amazonaws.com/0/111676/eccdc9ed-6a0a-569f-4959-0012424d955e.png)


# 感想

gitlab + gitlab-ci + gitlab registryで完結しておくと、.gitlab-ci.yml(ビルドスクリプト)もすっきり。

$CI_BUILD_TOKENと書くことで、認証情報をスクリプトや設定ファイル内に平文で書かなくて良いのもすてき。
SeleniumでCapybaraってみるテスト（という名の備忘録）


Selenium Grid環境が出来たので、Webテストをしてみる。

## 用意するもの
ruby
Capybara
RSpec
テストサイト

## テストコード

ちなみにテストサイトもdockerで作ればいいｗ
ログイン画面を作って、ログイン出来たら「Hello World」と画面に出るサイトがあるとして、以下のコードを実行してみる。

※先週ぐらいからruby始めたので、書き方おかしいかもしれないｗ

```ruby:hoge.rb
require 'capybara/rspec'
require 'selenium-webdriver'

hub = 'http://192.168.99.100:32768/wd/hub'
id = 'hoge'
password = 'hogehoge'
site = 'http://192.168.99.100:32780'

Capybara.register_driver :remote_browser do |app|
  Capybara::Selenium::Driver.new(
    app,
    :browser => :remote,
    :url => hub,
    :desired_capabilities => :firefox
  )
end
Capybara.default_driver = :remote_browser
Capybara.javascript_driver = :remote_browser
Capybara.app_host = site

feature '[まずやってみよう]' do
    scenario '#1 ログインできるかな？' do
      visit '/'
      fill_in 'ユーザーID', :with => id
      fill_in 'パスワード', :with => password
      click_button 'ログイン'
      expect(page).to have_content('Hello World')
    end
end
```
## 実行
こんな感じで動くはず。

```
$ rspec hoge.rb
```
SVNクライアントをyumで簡単インストール

1. 必要なパッケージをインストール
`# yum install -y neon neon-devel`
`# yum -y install openssl openssl-devel`

2. WANDiscoリポジトリ導入
`# vi /etc/yum.repos.d/wandisco.repo`
`[wandisco]
name=WANDisco Repository - svn-1.8 centos6
baseurl=http://opensource.wandisco.com/centos/6/svn-1.8/RPMS/$basearch/
enabled=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-WANdisco`
`# rpm --import http://opensource.wandisco.com/RPM-GPG-KEY-WANdisco`

3. svnインストール
`yum install -y --enablerepo=wandisco --disablerepo=base,updates subversion`

4. 確認
`# svn --version --quiet
1.8.15`

終わり
AndroidStudioリファクタリング操作Tips

#はじめに
AndroidStudio(intellij)は豊富なリファクタリング機能があるのでうまく利用して快適なリファクタリング生活を送りましょう。
環境はMacでkeymapは Mac OS X10.5+です 

#リネーム
リネームは地味ですがよく使います。
メソッド名でもファイル名でも変更できます。

```
shift + F6
またはctrl + tのRefactor ThisメニューからRenameを選択
```

#ファイル移動

```
ファイル上でF6
またはctrl + tのメニューからMoveを選択
```
Moveダイアログがでてくるので移動先指定で移動来ます。
が、普通にプロジェクトビュー上で

```
ファイルを選択状態で
cmd + x
移動先で
cmd + v
```
のほうが直感的かもしれないです。


#ローカル変数→インスタンス変数変数
ローカル変数をクラス全体で使いたい時に勝手にお引越ししてくれるので便利です。

```
変数名の上にカーソルがある状態で
cmd + alt + f
またはctrl + tのメニューからFieldを選択
```
#定数化
ローカル変数などをpublic static finalのクラス変数に簡単にすることができます。

```
定数に変数上にカーソルがある状態で
cmd + alt + c
またはctrl + tのメニューからConstantを選択
```

#コード整形
下記の２つはmacroに設定して一括でできるようにしとくと良いかもしれません。
##インデントなどの整形
ファイル内のインデントやスペースを揃えてくれます

```
alt + cmd + l
またはメニューのCodeからReformat code
```

##import修正
ファイル内の不要なimportを消してくれます

```
ctrl + alt + o
またはメニューのCodeからOptimize imports
```

##複数のファイルへのimport修正やコード整形の実行
対象フォルダ下のファイルを一括でコード整形してくれます。

```
プロジェクトビューの対象フォルダの選択状態で
alt + cmd + l
または右クリックかグローバルメニューのCodeからReformat code
```
ダイアログでimport修正など処理の追加や対象をフィルタリングして実行できます。

#使ってないresouceの判定

```
プロジェクトビューのフォルダを選択した状態で
右クリック → Analyze → Inspect Code
```
Android > Lint > Performance → Unused resource内に使用していないresource一覧がでます。

#メソッド宣言のリファクタ
メソッド名や引数の順番入れ替えやreturnの型、引数の型や名前など簡単に変更できます。

```
メソッド名上で
cmd + F6
またはctrl + tのメニューからChange Signatureを選択
```
ダイアログがでるのでそこで色々変更できます。

#メソッド抽出
メソッドを外部クラスで抽出することができます。同じ処理がコード内にあると、それもまとめるかの選択がでてきます。

```
メソッドで抽出したい範囲を選択中に
cmd + alt + m
またはctrl + tのメニューからMethodを選択
```
また、ctrl + tのメニューのMethod　Objectを選択すると別クラスを作ってその中のメソッドとして抜き出すこともできます。

#safe delete
リソースファイルや変数など、使っている場所を確認して削除することができます。

```
右クリック → Refactor → safe delete
または普通に削除するときのダイアログでsafe deleteにチェックをいれて実行
```
ダイアログのView usagesボタンで使用している箇所の一覧がでます。

#終わりに

内容被ってるところがありますがこちらも
→[AndroidStudioのショートカット・便利機能・設定などいろいろ](http://qiita.com/hymmr/items/5da53f56bcc24d30e7e3)
laravel初心者メモ

[追記]
- Homestead使用時のお話です。
- 当時なのでLaravelのバージョンが古いです。ご注意ください。

debug環境などを整えるのに毎回調べるのが面倒なので```composer.json```ごとメモしてしまいます。

```
composer create-project laravel/laravel --prefer-dist projectName
cd projectName
```

```composer.json
{
    "name": "laravel/laravel",
    "description": "The Laravel Framework.",
    "keywords": ["framework", "laravel"],
    "license": "MIT",
    "type": "project",
    "require": {
        "php": ">=5.5.9",
        "laravel/framework": "5.2.*"
    },
    "require-dev": {
        "fzaninotto/faker": "~1.4",
        "mockery/mockery": "0.9.*",
        "phpunit/phpunit": "~4.0",
        "symfony/css-selector": "2.8.*|3.0.*",
        "symfony/dom-crawler": "2.8.*|3.0.*",
        "laravel/homestead": "^3.0",
        "barryvdh/laravel-ide-helper": "^2.2",
        "barryvdh/laravel-debugbar": "^2.2"
    },
    "autoload": {
        "classmap": [
            "database"
        ],
        "psr-4": {
            "App\\": "app/"
        }
    },
    "autoload-dev": {
        "classmap": [
            "tests/TestCase.php"
        ]
    },
    "scripts": {
        "post-root-package-install": [
            "php -r \"copy('.env.example', '.env');\""
        ],
        "post-create-project-cmd": [
            "php artisan key:generate"
        ],
        "post-install-cmd": [
            "Illuminate\\Foundation\\ComposerScripts::postInstall",
            "php artisan optimize"
        ],
        "post-update-cmd": [
            "Illuminate\\Foundation\\ComposerScripts::postUpdate",
            "php artisan optimize"
        ]
    },
    "config": {
        "preferred-install": "dist"
    }
}
```

このあと

```
composer update

vendor/bin/homestead make
```

homestead installed!

homestead.ymlを編集します。これは僕だけだと思います。

```
ip: "192.168.33.33"

...

memory: 1024
```


そして

```config/app.php
'debug' => env('APP_DEBUG', true),

// ....


"providers" =>[
        // ....
\Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider::class,
\Barryvdh\Debugbar\ServiceProvider::class,    
        // ....
],

'aliases' => [
		// ....
'Debugbar' => \Barryvdh\Debugbar\Facade::class,
		// ....
```

```php artisan ide-helper:generate```

```vagrant up```

let's laravel
PowerShellを使ってExcelファイル作成して文字入力、背景色変更、列の自動幅調整

# 環境
Windows PowerShell 2.0 (Windows 7)
Microsoft Excel 2010

# コード

```ps1:test.ps1
# 実行中のパス取得/移動
$path = Split-Path -Parent $MyInvocation.MyCommand.Path
Set-Location $path

# エクセルファイル作成
$excel = New-Object -ComObject Excel.Application
$excel.Visible = $False

# ワークブック作成
$book = $excel.Workbooks.Add()
$sheet = $excel.Worksheets.Item(1)

# 書きこみ
$sheet.Cells.Item( 3, 2) = "あいうえお"
$sheet.Cells.Item( 3, 3) = "かきくけこ"
$sheet.Cells.Item( 3, 4) = "さしすせそたちつてと"

# セルの背景色変更
$sheet.Cells.Item( 3, 2).Interior.ColorIndex = 3
$sheet.Cells.Item( 3, 3).Interior.ColorIndex = 4

# 列を自動幅調整
$null = $sheet.Columns.AutoFit()

# 日時に応じて名前をつけて保存
$date = Get-Date
$book.SaveAs($path + "\" + $date.ToString("yyyyMMdd_HHmmss_") + "test.xlsx")
$excel.Quit()
$excel = $null
[GC] ::Collect()

```

# 出力
test.ps1 と同じディレクトリにエクセルファイルができていて、
下記のような内容になっているはず。
（カラーインデックスの設定値によっては背景色が違うかも）

![excel_exec.png](https://qiita-image-store.s3.amazonaws.com/0/119600/4eaa9f2a-ba9b-a130-7954-40b734165a25.png)
複数のpackage.jsonをワンライナーでnpm installする


タイトルの通り。

こういったディレクトリ構成だったとして、

```
.
├── README.md
├── _meta
│   ├── resources
│   │   └── s-resources-cf-hoge-apnortheast1.json
│   └── variables
│       ├── s-variables-common.json
│       ├── s-variables-hoge-apnortheast1.json
│       └── s-variables-hoge.json
├── functions
│   ├── hoge
│   │   ├── event.json
│   │   ├── handler.js
│   │   ├── package.json
│   │   └── s-function.json
│   ├── s-templates.json
│   └── piyo
│        ├── event.json
│        ├── handler.js
│        └── s-function.json
├── package.json
├── s-project.json
├── s-resources-cf.json
└── s-templates.json
```

rootディレクトリのpackage.json と
functions/hoge/package.json をnpm installしたい。

```
npm install && cd functions/hoge && npm install
```

とかでもいいけれど、カレントディレクトリが変わるし、package.json が増えた場合に面倒くさいのでワンライナーで行う。

```
find . -type d \( -name "node_modules" \) -prune -o -type f -name "package.json" | grep -v "node_modules" | xargs -I{} bash -c 'path={}; npm install -prefix ${path%package.json}'
```

bashの変数に格納した後、${変数名%パターン} の形式で記述してやることで、
後方一致でマッチ部分を最短マッチで削除できる。
EC2インスタンスにENIを使用して複数IPアドレスを設定する

訳あって一つのインスタンスにつっこんでいる複数のWebサイトをあるルールに則っていくつかのIPアドレスに分ける必要が出てきました。取り急ぎポコポコとインスタンスを作って対応しました。管理者からインスタンスのコンソール画面から複数のIPアドレスが設定できるらしいよと、ぼんやりとしたアドバイスを頼りにしらべると、**Elastic Network Interface** という単語にたどり着きました。あー、仮想でNICを追加できるのね。アドバイスとしては不適切な内容だと思いました。

# Elastic Network Interface
* 仮想NICに近しいものです。ENIはセキュリティグループやIPアドレスを属性にもつ仮想のネットワークインターフェースとなります。[ENIの定義](http://docs.aws.amazon.com/ja_jp/AmazonVPC/latest/UserGuide/VPC_ElasticNetworkInterfaces.html)
* 一つのインスタンスに対して使用できるENI、一つのENIに設定できるIPアドレスの上限はインスタンスタイプによって変わってきます。[EC2のヘルプ](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/using-eni.html#AvailableIpPerENI)

# つまり…。
* インスタンス作成時にENIはかならず一つ設定されています。このENI指定されてるIPアドレスをプライマリプライベートIPと呼びます。
* 追加で作成したENIのIPアドレスはセカンダリプライベートIPと呼びます。3つめは追加したことがないので判りません。

# インスタンスにIPアドレスを追加する方法
ここではENIにIPアドレスを追加するのではなく、ENIを新たに作成してインスタンスに追加する方法をとります。

## セキュリティグループの作成

セキュリティグループを作成することによりENIを作成します(セキュリティグループ=ENI) 

1. EC2コンソール画面 -> ネットワーク & セキュリティ -> セキュリティグループ 画面を開きます。
1. 「セキュリティグループの作成」をクリックし、適当な情報を入力します。

## パブリックIPとの紐付け
目的としては公開しているインスタンスに複数のIPアドレスを追加したい、ということなのでパブリックIPと紐付ける必要があります。

1. EC2コンソール画面 -> ネットワーク & セキュリティ -> Elastic IP 画面を開きます。
1. 「新しいアドレスの割り当て」をクリックし、Elastic IPを作成します。
1. 作成したElastic IPを選択し、アクションから「アドレスの関連づけ」を選択します。
1. ネットワークインターフェースに先ほど作成したセキュリティグループを指定します。

## インスタンスへのENIのアタッチ

1. EC2コンソール画面 -> インスタンス -> インスタンス 画面を開きます。
1. ENIを追加するインスタンスを選択し、アクションから「ネットワーキング」->「ネットワークのアタッチ」を選択します。
1. ネットワークインターフェースに先ほど作成したネットワークインターフェースを指定します。
1. 該当インスタンスの説明画面にネットワークインターフェースが追加されたことを確認します。

## OSへの反映
ここまでは仮想NICをインスタンスに追加しただけですので、OSにて認識させます。メモ書き程度にLinuxでの方法を記載します。

1. eth-configxxの作成します。xxは環境により違うと思いますので、適宜ご自身の環境に合わせて下さい。 
	 
	```:/etc/sysconfig/network-scripts/ifcfg-ethxx
	DEVICE=ethxx
	BOOTPROTO=static
	BROADCAST=xxx.xxx.xxx.xxx
	IPADDR=xxx.xxx.xxx.xxx
	NETMASK=255.255.255.0
	NETWORK=xxx.xxx.xxx.xxx
	ONBOOT=yes
	```

1. ネットワークの再起動を実施します。
1. コンソール上から、またはEC2のコンソールからIPアドレスが追加されたことを確認します。

# まとめ
ENIをつかうということがわかれば難しいことではありませんでした。ただ、アドバイスが不適切だと目的に近づくのに時間がかかるということが判りました。人にアドバイスを与える場合はある程度理解してから実施しようと思います。
EC-CUBE3 URLを変える （index.php 非表示）

2016/06/29筆記

# 目的

ECーCUBE３で構築したサイトのURLを

```
http://ホスト名/html/index.php
http://ドメイン名/html/index.php
```

ではなく

```
http://ホスト名/
http://ドメイン名/
```

で表示する。

# 筆者環境

EC-CUBE : 3.0.9
OS : ubuntu14.04
Apache : 2.4.7
クラウドサーバ : さくら

# 操作

主な操作は
1. VirtualHostの変更
2. htaccessの設定
3. EC-CUBEのpath.yml変更
4. mod_rewriteの有効

## VirtualHostの変更

1. DocumentRootを **/html**　まで記載
2. AllowOverrideをAllに設定
3. DirectoryIndexにindex.phpを設定

```
<VirtualHost *:80>
        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/html/eccube-3.0.9/html

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

        <Directory /var/www/html/eccube-3.0.9/html >
                Options Indexes FollowSymLinks
                AllowOverride All
                Require all granted
                DirectoryIndex index.php
        </Directory>
</VirtualHost>
```

## .htaccessの設定

.htaccessの配置場所
**eccube-3.0.9/html/.htaccess**

1. mod_rewriteの設定

```
order deny,allow
allow from all
<IfModule mod_rewrite.c>
   RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !^(.*)\.(gif|png|jpg|css|ico|js)$ [NC]
    RewriteRule ^(.*)$ index.php [QSA,L]
</IfModule>
```


## EC-CUBEのpath.yml変更

path.ymlの配置場所
**eccube-3.0.9/app/config/eccube/path.yml**
基本的に **/html**の部分を消しこんでいく
変更したところだけ変更後を記載

```
# duplicated
root: / # root_urlpath
# admin_dir:は変更しない
tpl: /user_data/packages/default/ # front_urlpath
admin_tpl: /user_data/packages/admin/ # admin_urlpath
image_path: /upload/save_image/ # image_save_urlpath
```

```
# base valiables
root_urlpath: / # root_urlpathのみ変更
```

```
# urlpath
admin_urlpath: /template/admin
front_urlpath: /template/default
image_save_urlpath: /upload/save_image
image_temp_urlpath: /upload/temp_image
user_data_urlpath: /user_data
```

## mod_rewriteの有効

mod_rewriteが有効になっていれば不要

```
a2enmod rewrite
```

を実行して、 **Module rewrite already enabled** と出れば多分大丈夫。

```
Enabling module rewrite.
To activate the new configuration, you need to run:
  service apache2 restart
```

こんなメッセージが出たらApacheを再起動して完了。

以上。


# 参考ページ
Ubuntu版Apache2でmod_rewriteを有効にする
http://qiita.com/u-akihiro/items/c7a5bb38c34858d00c2a
phpファイル内でのhtmlとJavaScriptの書き方

久しぶりにphp触ったらちょっと迷ったのでメモ

・PHP部分は`<?php` と `?>`で挟む
・HTMLは上記のPHPタグ外に書く
・逆にHTMLタグ中にPHPを書くことはできる。例：`<p></php echo $hoge; ?><p>`
・JavaScriptはHTMLの`<head>`タグの間に`<script type="text/javascript">`と`</script>`で挟んで書く。
※JavaScript非対応ブラウザ（i-modeなど?詳細は確認お願いします）の場合、JavaScriptがそのまま表示されるので、`<!--`と`-->`（HTMLのコメントアウト）で挟んで隠れるようにする。

まとめると

```html+php
<?php 
// PHP部分
// 実際にはPOSTされた値を取得したりするなどご自由に
$title = '文字列分割';
$data = 'hoge,huga';
$separator = ',';
?>
<!-- HTMLはPHPタグ外に書く -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title><?php echo $title; ?></title>
<!-- JavaScriptはscriptタグで囲む -->
<script type="text/javascript">
<!-- JacaScript未対応ブラウザ対策
// 実際には入力チェックなどする
var today = new Date();
var month = today.getMonth() + 1;
var day = today.getDate();
document.write("今日は" + month + "月"+ day + "日です。");
// JacaScript未対応ブラウザ対策　-->
</script>
</head>
<body>

<noscript>
<!-- JavaScriptが利用できない環境の場合表示される -->
<p>あなたのブラウザはJavaScriptが利用できません</p>
</noscript>

<h1><?php echo $title; ?></h1>
<p>対象の文字列：<?php echo $data; ?></p>
<p>区切り文字：<?php echo $separator; ?></p>
<p>分割結果：<?php print_r(explode($separator, $data));?></p>
</body>
</html>
```

追記：
コメントによりよい例文が上がっているので、そちらも参照ください！！
SQLServerからOracle(11g)にリンクサーバを設定し、SELECT文で取得する

#最初に

備忘録として記述してあるので、一部端折っている部分があります。

#やりたい事

SQL ServerからOracle(11g)にリンクサーバーを設定し、SQLServerへのSELECT文実行でSQL ServerのテーブルとOracleのテーブルをJOINした結果を取得する。

#前提条件

* SQL Server導入済み
* SQL Server Management Studio導入済み
* Oracle導入済み

# 作業順序

1. SQL ServerがOracleに接続出来るようにする
2. リンクサーバーの設定をする
3. SELECT文を実行する


## SQL ServerがOracleに接続出来るようにする

OracleのページからOracle Clientのインストーラを取得して、実行。実行は当たり前だが、SQL Serverが起動している端末で行う。インストールコンポーネントの選択で`Oracle Provider for OLE DB`がインストールされる様にする。
インストール完了後、端末を再起動をする。

## リンクサーバーの設定をする

SQL Server Management Studioからの設定方法。
1. SQL Serverに接続して、サーバーオブジェクト->リンクサーバー->プロバイダーを開く
2. OraOLEDB.Oracleをダブルクリック
3. `InProcess許可`にチェックを付けてOKとする
4. `リンクサーバー`で右クリックして、新しいリンクサーバーを作成
5. 以下の様に設定してOKとする

| ページ | 項目 | 設定値 |
|-----------|------------|------------|
| 全般 | リンクサーバー | 任意 |
|  | サーバーの種類 | その他のデータソース |
|  | プロバイダー | Oracle Provider for OLE DB |
|  | 製品名 | Oracle |
|  | データソース | _サーバ(IP等)_:_ポート番号_/_サービス_ (例:192.168.11.1:1521/oradb) |
|  | プロバイダー文字列 | 空 |
| セキュリティ | ローカルサーバーのログインとリモートサーバーのログインのマッピング | なし |
|  | 上記一覧で定義されないログインの接続方法 | このセキュリティコンテキストを使用する |
|  | リモートログイン | Oracle接続時のユーザー名 |
|  | パスワード | Oracle接続時のパスワード |

## Select文を実行する

```sql:SelectFromLinkServer(Oracle)
SELECT * from リンクサーバー名..スキーマ名.テーブル名
```

SQL Server Management Studio上では`リンクサーバー名->default->スキーマ名.テーブル名`のツリーで見える為、以下の様なSELECT文を想像するが、`default`は不要。

```sql:NGSelectFromLinkServer(Oracle)
--エラーSELECT文。メッセージ7312となる
SELECT * from リンクサーバー名.default.スキーマ名.テーブル名
```
NativeScript開発でハマった時の対応まとめ


## 概要

現在、NativeScriptでハイブリッドアプリの開発をしている。

[以前にも書いた](http://blog.mmmcorp.co.jp/blog/2016/04/08/hybrid-app/)が、NativeScriptが他のハイブリッドアプリフレームワークと異なる点は、WebViewを使わずにネイティブのAPIを使えるところにある。初物というのもあるが、NativeScript自体が絶賛開発中なので、いろいろとハマる時は多い。そんなときにどのような対応をしているかをまとめてみる。

## 使用している技術

NativeScriptは、Angular 2・TypeScriptと親和性が高く、公式でもがっつりドキュメントが準備されていたりする。弊社では、Angular 2とTypeScriptのどちらも取り入れている。

## 対処法

### ドキュメントを見る

易しい説明を見たい時にはドキュメントを見る。NativeScriptの使い始めにはざっと最初に読むといいと思う。ただし、詳細な使い方というよりは、概要や、なんとなくの完成像をイメージしたい時にみることがおおい。

- [NativeScript Doc](https://docs.nativescript.org/)

### GitHub issueやStack Overflowを一通り見る

何かエラーが出たら、GitHub issueやStack Overflowを一通りみている。適切な検索ワードをいれれば、まだissueがそこまで多くはないため、Google検索よりもほしい情報がすぐ手に入ったりする。また、NativeScriptコミッターの対応も早いので、issueがない時は自分で作成、質問するのも良い方法だと思う(自分も何度かissueを作成した)。

- [Issues · NativeScript/NativeScript](https://github.com/NativeScript/nativescript/issues)
- [Issues · NativeScript/nativescript-angular](https://github.com/NativeScript/nativescript-angular/issues/)
- [Issues · NativeScript/nativescript-cli](https://github.com/NativeScript/nativescript-cli/issues)

### 型定義ファイルを見る

TypeScriptの優位を活かし、型定義([.d.ts](https://github.com/NativeScript/NativeScript/tree/master/tns-core-modules))を確認する。公式のドキュメントだと、最新のコミットを反映していなかったりするので、型定義を先にみるとスムーズになることもある。例えば、サポートしているStyleなどは、[こちらの型定義](https://github.com/NativeScript/NativeScript/blob/master/tns-core-modules/ui/styling/style.d.ts)をみると確認できるが、[ドキュメントの方](https://docs.nativescript.org/ui/styling)にはのっていないプロパティもいくつかあったりする。その上で型をみて使い方を読み取る具合。こちらはもっと活用して効率を上げてゆきたい・・・。

### APIリファレンスを見る

Classなどの詳細な使い方を見たい時は、APIリファレンスを見たりもしている。例えば、[UI Image](http://docs.nativescript.org/api-reference/classes/_ui_image_.image.html#stretch)のstretchプロパティにはどんな値が入るか、というのがわからなかった時に、stretchで検索すると[こちらのページ](http://docs.nativescript.org/api-reference/modules/_ui_enums_.stretch.html)がでてきたりする。知らないメソッドやプロパティを調べるのには良い手段である。

- [NativeScript API Reference](http://docs.nativescript.org/api-reference/)

### ハマったことのドキュメント化

JSで書けるとはいえ、通常のブラウザ開発とはかなり違ってくるので、環境構築などでハマることは多い。そういった点は、チームでドキュメントを作りまとめている。とにかく小さいこと、原因がわからないことでも共有されていることが大事なので、弊社では、esaでひとつのポストを作り、ハマった点をみなが書きなぐる形式をとっている。indexをチラミセすると以下の様な感じである。これによって、チーム内で同じことで消耗することを極力避けている。

<img width="265" alt="ns.png" src="https://qiita-image-store.s3.amazonaws.com/0/22875/f43c92c7-0f62-0f31-36fa-609d5a518879.png">



### 書籍を読む

これはNativeScriptというよりもAngular 2とTypeScriptのためが大きいが、書籍は以下のものを各自読むこととしている。

- [Learning Typescript](https://www.amazon.co.jp/Learning-Typescript-Remo-H-Jansen/dp/1783985542?ie=UTF8&*Version*=1&*entries*=0)
- [Switching to Angular 2](https://www.packtpub.com/web-development/switching-angular-2)
- [Getting Started with NativeScript](https://www.packtpub.com/web-development/getting-started-nativescript)

## まとめ

以上、NativeScript開発でハマった時の対応でした！
Android Studio Debugger のアタッチ方法いろいろ

# デバッグ実行

![image](https://qiita-image-store.s3.amazonaws.com/0/51949/73e1444b-2aab-85ee-43ee-dd93a46b0a0e.png)

左から2つめの虫のアイコンです．
いわずもがな，デバッグ状態でアプリを実行します．

# プロセスにアタッチ

実行中のアプリに途中からアタッチすることもできます．

![image](https://qiita-image-store.s3.amazonaws.com/0/51949/58ac2a55-d9c4-2e7d-079d-b159233ad3dc.png)

このアイコン群の右端を押すと

![image](https://qiita-image-store.s3.amazonaws.com/0/51949/5390da6e-c15a-3938-96a4-6ef6d19902ff.png)

とアタッチ可能なプロセス一覧が表示されるので，アタッチしたいプロセスを選択します．

# 任意の場所で確実にアタッチしたい

デバッグ実行はアプリケーション開始から行われるし，プロセスへのアタッチもタイミングが確実じゃないので，ちょっと使いにくい時．

## ユースケース

ユースケースは…あまり無いかもしれないけど，たとえば

- zipの展開処理のような重い処理
    - デバッガをアタッチし続けていると重くてzip展開が遅くなる
- 展開処理終了直後の行でブレークさせたい
    - 展開処理が95%くらいになったらアタッチ…？
    - タイミングミスったらハジメカラ

とか，

- アプリケーション再起動後のonCreateでシングルトンインスタンスを確認したい
    - デバッグ実行するとプロセスそのものが再起動されてシングルトンインスタンスがクリアされる
    - アタッチするにもonCreate()ではアタッチ操作間に合わない

できれば，ブレークさせたい直前で確実にデバッガをアタッチしたい…

## できます :muscle: 

`Debug.waitForDebugger()` （`Debug.waitingForDebugger()`ではない） をブレークしたい行の上において実行すると，デバッガが接続されるまでこの行で止まってくれます．
デバッガが接続されると処理が進み，ブレークポイントで止まるはずです．
(`debuggable true` が必要かもしれません)

ほかにも何か方法があれば教えてください :dog:
PowerShellでタブ区切りのcsvファイルを読み込む

# 前提
ps1ファイルはtest.csvと同じディレクトリにあり、
csvファイルは以下のような内容と想定。
先頭の1行はヘッダ、区切り文字はタブ。
文字コードは**UTF8**

```test.csv
No ユーザー名 銀行残高 最終取引日時
1 hoge1 10000 2016/06/01 12:00:00
2 hoge2 100 2016/05/02 00:00:00
3 hoge3 9999999 2010/01/01 23:59:59
```

# 読み込み
変数 $csv にデータを保存する。

```ps1:test.ps1
$csv = Import-Csv .\test.csv -Delimiter "`t"
```

"`t" は水平タブを表す特殊文字。`(バッククォート)と1文字で表現される。
他には以下のような種類がある。

| 文字 | 意味                     |
|:----:|:-----------------------:|
| `$   | ドルマーク  　　　　　　　|
| `a   | 警告 　　　　　　　　　　 |
| `b   | バックスペース  　　　　　|
| `n   | 改行  　　　　　　　　　　|
| `r   | キャリッジリターン  　　　|
| `t   | 水平タブ  　　　　　　　　|
| `'   | シングルクォーテーション  |
| `"   | ダブルクォーテーション  　|
| ``   | バッククォート  　　　　　|
| `v   | 垂直タブ  　　　　　　　　|

## エンコード

```ps1
Import-Csv .\test.csv -Delimiter "`t" -Encoding Default
```
上記のようにすると、csvファイルがsjisでも文字化けせずに読める。
ただし、PowerShell 3.0 以上でないと -Encoding の指定が対応していない。
https://technet.microsoft.com/ja-jp/library/hh849891.aspx

## 条件をつけて読み込み

```ps1
# 日付
$date = "2016/06/01 00:00:00"
# フィルター
$csv_filter =
{
    $baseDate = Get-Date $date -Format "yyyy/MM/dd"
    $csvDate  = Get-Date $_."最終取引日時" -Format "yyyy/MM/dd"
    return ($_."銀行残高" -ge 10000) -and ($csvDate -ge $baseDate)
}
# 読み込み
$csv = (Import-Csv .\test.csv -Delimiter "`t" | Where-Object $csv_filter)
```

のようにすると、$csvにはNo.1のデータのみ格納される。

# 要素の参照
読み込んだ変数の内容を参照する。
変数."ヘッダ名" で参照できる。
英数字のみであれば " は必要ない。

```ps1
$csv[0].No
$csv[1]."ユーザー名"
$csv[2]."銀行残高"

出力
1
hoge2
9999999
```
Arukas.io を使って Factorio Server をたてる

# Arukas.io を使って Factorio Server をたてる

Factorio 楽しいですよね Factorio。
巷で話題の工場作成ゲームです。

このゲーム、マルチプレイもできてサーバーも立てれるんですがかなり軽いので普通のVPSとかでも余裕で動くのですが
最近 Sakura がベータで Docker ホスティングサービスを初めていたのでこちらを使いたいと思います。

https://arukas.io

# Factorio イメージを作成する

[Docker と Alpine Linux で Factorio server を動かす](http://qiita.com/munisystem/items/583930ae5ba805e19d95)

こちらで公開されていた Dockerfile を使用しました。
Factorio の新バージョンが出ていたので適当に更新してイメージを作成。

[周回遅れのDocker 4: Docker Hub によるイメージの配布と利用](http://qiita.com/kumatch/items/c125894cd8d12437a960)

あとは Docker Hub に push すれば準備完了です。

# Arukas.io で起動させる

利用にはベータ登録が必要なので適当に済ませます。

https://arukas.io

ログインできたらアプリケーションを作成します。

- AppName は適当に
- Image に Docker hub に追加した名前を (ex. yamionp:factorio:0.12.34)
- 1台立てれば十分なので Instances は 1
- Memory は 512M
- Port で 34197 の UDP を指定

あとは アプリケーションを作成 を押して完了です。

イメージのダウンロードが終わればすぐ起動してくると思うので Apps から詳細を出し Port を確認します。

内部のポートと外部のポートが入れ替わるので

```
~~~~~.jp-tokyo-01.arukascloud.io:1234 (port: 34197)
```

みたいな感じになると思います。

この場合であれば Port 1234 が外側のポートになるので、あとは Factorio を起動して ~~~~~.jp-tokyo-01.arukascloud.io:1234 に接続すれば複数人でゲームができます。


# 今後

今のままだと本格的にゲームするには不便なのでいろいろ拡張したいですね。
今考えているのはこんなところ。

- 0.13 対応
- マップ作成の調整
- セーブデータの回収
- 開始セーブデータを外部から投入
- 定期的に Map を出力

0.13 で普通のクライアントではサーバーモードの時に標準入力から内部の lua コマンドが呼べる様になっているっぽいのでいろいろやりたい。
AWS CLIとjqコマンドを使ってec2インスタンス名・インスタンスタイプを列挙する方法

結果がparseし易い形で出るので便利。

```shell-session
 % aws ec2 describe-instances --filters "Name=tag:Name,Values=momokuri-dev*" | jq ".Reservations[].Instances[] | [(.Tags | from_entries | .Name), .InstanceType]" | jq -c --slurp "sort | .[]"
["momokuri-dev-admin01","t2.medium"]
["momokuri-dev-admin02","t2.medium"]
["momokuri-dev-api01","t2.medium"]
["momokuri-dev-api02","t2.medium"]
["momokuri-dev-db-arbiter","t2.small"]
["momokuri-dev-db-primary","r3.large"]
["momokuri-dev-db-secondary","r3.large"]
["momokuri-dev-factory01","t2.medium"]
["momokuri-dev-search01","m4.large"]
["momokuri-dev-search02","m4.large"]
["momokuri-dev-search03","m4.large"]
```
コンパイル条件によって機能が異なる変数を作る


## はじめに

FILE*をfdbuf(iostreamのバッファ)に変換する方法は標準化されていない。そのため、環境に応じて変換する方法を変える必要がある。まずGCC(g++ -DSTREAM_GCC)、次にBOOST(-DSTREAM_BOOST)、どちらもなければ独自実装(拾い物)としている(-DSTREAM_PORTABLE)。
問題は、fdbufはコピー出来ないことにある。そのため、 **関数の返し値にすることが難しい。ムーブセマンティクスも無力である。**
しかたなく、defineで変数を定義していた。

```cpp
#if defined(STREAM_GCC)
#define streambuf_fromfile_in(name,f) __gnu_cxx::stdio_filebuf<char> name(f,std::ios_base::in)
#endif

streambuf_fromfile_out(bout,fout);
```

しかし、これはかなり悔しい。

## 方法

いろいろ考えたところ、 **当該クラスの派生クラスにすれば良い** ことに気がついた。

```cpp
#if defined(STREAM_GCC)
class streambuf_fromfile_out: public __gnu_cxx::stdio_filebuf<char>{
	public:
	streambuf_fromfile_out(FILE *f): __gnu_cxx::stdio_filebuf<char>(
		fileno(f),std::ios_base::out
	){}
};
#endif

streambuf_fromfile_out bout(fout);
```

完全な差分は https://github.com/cielavenir/procon/commit/8b9e645fb27656d481c979a7b455de4f7761c8c4 にある。

## 終わりに

わかってしまえばごくごく基本的なことなのでなおのこと辛くなった´ω｀
なんで **２年間** も気づかなかったのか´ω｀

ちなみに、内容が自分にとってショックなのでタイトルは少し盛りました(一応、機能が異なる変数、は本文中だとboutにあたります)。

## 170315追記

gcc5.1/clang3.2以降では普通にfdbufを返し値にできるようです…この記事の意味とは。
Carbonで日付を比較する

日付比較を表にまとめました
どの関数がどの不等号に対応しているかが、パッとわからず毎回チェックするので表を作りました

全般的な使い方は
本家 ： http://carbon.nesbot.com/docs/  （英語）
Qiita ： http://qiita.com/yudsuzuk/items/ff894bd0b76d4657741d  (日本語)
この辺りで

### 前提

```php
$old = new Carbon('2016-06-01');
$latest = new Carbon('2016-07-01');
$middle = new Carbon('2016-06-15');
```

### 結果


| 意味 | code | 不等号 | 結果 |
|---|---|---| --- |
| 等しい | `$old->eq($latest)` | `$old == $latest`| false
| より大きい | `$old->gt($latest)` | `$old > $latest`| false
| 以上 | `$old->gte($latest)` | `$old >= $latest`| false
| 未満 | `$old->lt($latest)` | `$old < $latest`| true
| 以下 | `$old->lte($latest)` | `$old <= $latest`| true
| 間にあるか | `$middle->between($old, $latest)` | `$old <= $middle <= $latest`| true


### 覚え方


```
$old->gt($latest):  関数使うオブジェクト greater than 引数のオブジェクト
$old->lte($latest): 関数使うオブジェクト less than equal 引数のオブジェクト
```
ディレクトリやファイルの更新を検知して自動でrsyncする仕組みを作る

sftp(鍵認証)でサーバにソースをアップロードした際もしくはサーバ内の特定ディレクトリ(quotaを使わない容量制限有)以下のファイルを更新した際に自動で更新を検知してアプリケーションサーバにrsyncする仕組みを作ってみた。
OSはAmazon Linux、更新の検知はinotifyで行う。
***

※下記参考にpsshは事前にインストール
[pssh-2.3.1をCentOS6.5にインストール](http://qiita.com/a-killer-bee/items/af92bf898625159b17f5)

1. sftp専用ユーザー作成
`# useradd sftptest`
`# groupadd staff`
`# gpasswd -a sftptest staff`
`Adding user sftptest to group staff`
`# id sftptest`

2. sftp接続するクライアントのSSH公開鍵を登録する
`# su - sftptest`
`$ echo "xxxxx鍵文字列xxxxx" >>.ssh/authorized_keys`
`$ chmod 600 .ssh/authorized_keys`

3. 容量制限(5GB)のあるファイルシステム作成
`# mv /home/sftptest /home/sftptest_bk`
`# dd if=/dev/zero of=/home/sftptest.fs bs=1M count=5120`
`# mke2fs -t ext4 /home/sftptest.fs`
`# chown sftptest.sftptest /home/sftptest`
`# mount -o loop -t ext4 /home/sftptest.fs /home/sftptest`
`# df -h`
`Filesystem      Size  Used Avail Use% Mounted on`
`/dev/xvda1       30G   13G   17G  43% /`
`devtmpfs        490M   92K  490M   1% /dev`
`tmpfs           499M     0  499M   0% /dev/shm`
`/dev/xvdf        30G  161M   28G   1% /data2`
`/dev/loop0      4.8G   10M  4.6G   1% /home/sftptest`
`# vi /etc/fstab`
`/home/sftptest.fs /home/sftptest ext4 defaults,loop 0 0`
`# cp -rp /home/sftptest_bk/*.* /home/sftptest/`

4. sftp専用ユーザーでsshログインできないようにする
`# usermod -s /sbin/nologin sftptest`
`# vi /etc/ssh/sshd_config`
`# override default of no subsystems`
`Subsystem sftp /usr/libexec/openssh/sftp-server`
`Match user sftptest`
`  ChrootDirectory /home/%u@`
`  ForceCommand internal-sftp`

5. sshdの再起動
`# service sshd restart`

6. アプリケーションサーバにもユーザー「sftptest」を作成
`# useradd sftptest`
`# chmod 755 /home/sftptest`

7. rootのssh公開鍵をアプリケーションサーバに登録
`割愛`

8. inotifyインストール
`# yum --enablerepo=epel -y install inotify-tools`

9. デーモン化起動スクリプト作成
[(参考) inotifywaitによる更新除外ファイルの更新通知について試作してみました](http://labs.crooz.co.jp/archives/62)
`# vi /etc/rc.d/init.d/inotifywait`
「/usr/bin/Mail -s」のあたりで下記を実行する等
`/usr/local/pssh/bin/prsync -x --delete -h /root/pssh/nodelist/web -a /home/sftptest/ /home/sftptest/ > /dev/null 2>&1`
`# chmod 755 /etc/rc.d/init.d/inotifywait`
`# chkconfig --add inotifywait`
`# chkconfig inotifywait on`
`# chkconfig inotifywait --list`
`inotifywait     0:off   1:off   2:on    3:on    4:on    5:on    6:off `

10. inotifywait起動
`# service inotifywait start`

終わり
[C++]C++でもIntellisense候補をEnterで確定したい！！

# どゆこと？
**＊この記事はVisualStudio 2015をベースとしています**
Visual StudioでIntellisenseを使用したとき、C#での挙動はデフォルトで
Enter/Tabで確定が出来るんです、
要は最初から候補が選択された状態なんですね
![select_A.png](https://qiita-image-store.s3.amazonaws.com/0/131480/2fb0e7c8-f6e0-c7b4-1299-48307564f1d1.png)

しかし！C++を使った場合ではデフォルトでは
選択された状態じゃありません、半分ぐらい選択されてます（半分・・・？）
![select_B.png](https://qiita-image-store.s3.amazonaws.com/0/131480/2d0f7edb-7ed1-fbf7-4dbe-1d87324b82c2.png)

この調子でC#感覚でEnterを押してしまうと・・・
![select_C.png](https://qiita-image-store.s3.amazonaws.com/0/131480/91749625-9141-ea4b-5bfb-ad2c82334b03.png)

![img_0.jpg](https://qiita-image-store.s3.amazonaws.com/0/131480/4aeb53a9-531c-cd9d-ebf9-2eb5f423a8b5.jpeg)

* * *

まぁ別にC++の方でも↑↓を入力して確定させてもいいですし、
そもそもTabキーで確定できるわけなので問題は無いんです

# 違う、そうじゃない
私はC++でもC#っぽくEnterで確定したいですし、そもそもなんかC++のほうの半分選択された感じは見た目的にヤです

# 普通に設定できました
![20160629_031354.png](https://qiita-image-store.s3.amazonaws.com/0/131480/2ec10018-0f13-6f6e-75d2-ead60e4a19a7.png)
`ツール→オプション→テキストエディター→C/C++→詳細設定`
内の
`メンバー一覧のコミットアグレッシブ`
というものを`True`にすることでC++でもC#と同じ挙動になりました

**やったぜ**
Docker for mac と Kitematic でGUIから環境構築

####【Docker導入の経緯】
これまで社内の開発環境についてはmac＋rails＋RVM(またはrbenv)＋powderで各々ローカルに構築していました。
プロビジョニングはOpsWorksに任せていたのですが、この構成だと時々、各々のローカル環境特有の問題が発生することがありました。
原因は導入しているアプリの問題だったりするのですが…ちょっと手間ですよね。
と言うことで、今更ながら開発環境にDockerを導入してオーケストレーション方法を刷新しようと言う話になりました。

今回はその序章。
Dockerをmacに導入していきます。

Dockerが何か？については他の良記事にお任せします。
僕が参考にしたのは[こちら](http://www.atmarkit.co.jp/ait/articles/1405/16/news032.html)です。
<hr>
####【準備するもの】
[DockerForMac](https://www.docker.com/products/docker#/mac)ダウンロード
※現在はパブリックベータ版です。(2016/06/29現在)
[Kitematic](https://kitematic.com/)ダウンロード
※KitematicはDocker Toolboxに取り込まれたようです。(2016/06/29現在)

<hr>
####【DokerForMac】
![スクリーンショット 2016-06-29 14.42.30.png](https://qiita-image-store.s3.amazonaws.com/0/63777/772f9197-3148-8bd7-5026-5773a83b7b62.png)
上のダウンロードサイトにアクセスしてファイルを取得して下さい。
<img width="320" alt="1be699e18bd6b15b58136f8288f4558d-640x346.png" src="https://qiita-image-store.s3.amazonaws.com/0/63777/a5d38f48-514f-1fe7-afed-9f844c00836d.png">
そして、インストール…これだけです。

<hr>
####【Kitematic】
![スクリーンショット 2016-06-29 14.37.33.png](https://qiita-image-store.s3.amazonaws.com/0/63777/ec54794d-0ead-8cbf-62d8-356ab26b6dd4.png)
こちらもダウンロードサイトから取得して下さい。
上にも書きましたがToolboxに取り込まれたようです。
<hr>
![スクリーンショット 2016-06-29 14.39.44.png](https://qiita-image-store.s3.amazonaws.com/0/63777/78e86328-0a98-1e06-ae00-34d092d1db03.png)
指示に従ってインストールを続けて下さい。
<hr>
![スクリーンショット 2016-06-29 14.41.10.png](https://qiita-image-store.s3.amazonaws.com/0/63777/229e5764-3fff-48fb-bc4f-a073b38bef2b.png)
インストールが完了したので、Kitematicを立ち上げます。
<hr>
![スクリーンショット 2016-06-29 14.47.54.png](https://qiita-image-store.s3.amazonaws.com/0/63777/9ecf663f-c59c-3efd-5b29-93a59892ca99.png)
DockerHubとも連携出来ます。
今回は、ひとまずスキップしました。
<hr>
![スクリーンショット 2016-06-29 14.48.12.png](https://qiita-image-store.s3.amazonaws.com/0/63777/b2d167c1-371b-4376-a3a4-665d963e6896.png)
すごい…本当にGUIでコンテナを導入できるようです。
今回はテストでnginxを立ち上げます。
<hr>
![スクリーンショット 2016-06-29 14.49.22.png](https://qiita-image-store.s3.amazonaws.com/0/63777/16ded76c-557c-7e7b-f309-e34ba794721e.png)
アクセスすると立ち上がっています…すごいですねー。
ここまで黒い画面は1度も必要ありませんでした。

<hr>
関連記事
[KitematicでホストとDockerのディレクトリを共有する](http://qiita.com/tak74/items/5d5a6b4c321811d10a01)
Windows Server + php5.6環境にXdebugを導入

#環境

* Windows Server 2012 R2
* PHP 5.6.12

#Xdebugを選ぶ

ダウンロードページからphpのバージョンに合ったdllをダウンロード
(今回はXdebug 2.4.0を使用する)
https://xdebug.org/download.php

が、どれを使えばいいんだ...
![SnapCrab_NoName_2016-6-29_14-18-22_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/79414/27727ee6-77ab-06bc-87c5-61c1a3eddc92.png)

##Xdebugのページ[Tailored Installation Instructions]で確認
* 使用する環境のphpinfo()を確認
* phpinfo()の結果ページのhtmlソースをコピー
* https://xdebug.org/wizard.php のフォームにコピーしたソースをペースト
* 「Analyse my phpinfo() output」をクリック
* 結果ページが表示される

以下、結果ページの「Instructions」の例
このように、ダウンロードするdll名とphp.iniに記述する内容が示される。

```
Instructions

1. Download php_xdebug-2.4.0-5.6-vc11.dll
2. Move the downloaded file to C:\Program Files (x86)\PHP\ext
3. Edit C:\Program Files (x86)\Apache2\conf\php.ini and add the line
zend_extension = C:\Program Files (x86)\PHP\ext\php_xdebug-2.4.0-5.6-vc11.dll
4. Restart the webserver
```

#インストール

上記「Instructions」の内容通りにファイル配置、php.ini編集の後、Apacheの再起動を行えばおｋ

#参考

zend_extensionとzend_extension_tsの違いではまった...
http://www.php-seed.net/blog/archives/95
[C#]管理者権限でファイルを開くツール

# 動機
最近ASP.NET開発をして思ったのです、
「毎回Visual Studioを右クリックして管理者として立ち上げた後にファイル開くの面倒だな？」
「C:\inetpub\以下に配置したweb.configをメモ帳などで開いても権限無いからそのまま上書きできないの面倒だな？」と
加えてマークダウン記法とやら使ってみたかったので初投稿も兼ねて投稿

>Visual Studio 2013：タスクバーから管理者権限でIDEを起動するには？
>http://www.atmarkit.co.jp/ait/articles/1408/26/news115.html

こちらから似たようなことができるみたいですが物によってはレジストリいじらないとだめだったり
開発者であるなら作っちゃおう

# 作ってみる
## プロジェクトの作成、コーディング
今回使用するのは

- Visual Studio 2015
- C#
- .NET4.6(.NET2.0以降で作れるはずです)

空のプロジェクトを作成し、コンソールアプリケーションからWindowsアプリケーションでコンパイルするように設定し、下記のコードを書く

```csharp:Program.cs

    class Program
    {
        public static void Main(string[] Args)
        {
            foreach (var item in Args)
            {
                ProcessStartInfo psi = new ProcessStartInfo(item);
                var prs = Process.Start(psi);
            }
        }
    }
```

とっても簡素に書きました（（（
何か色々指定したい人は変数`psi`の中身でもいじってくださいな

## マニフェストファイルで管理者に昇格するように変更
プロジェクトを右クリックして、追加→新しい項目→マニフェストファイルを追加
自動生成される文の中の
`<requestedExecutionLevel level="asInvoker" uiAccess="false" />`
`asInvoker`から`requireAdministrator`に変更
これでアプリケーション自体が常に管理者権限で起動されます（もちろんUACを有効にしている場合は確認画面が出ます）

## コンパイル
後は普通にコンパイルするだけで、そのアプリケーションに渡したファイルが管理者で開くようになります

## 送るメニューへの追加
`Windowsキー + R`を押して、`shell:sendto`と入力して送るメニューのフォルダを開いたら
そこに先ほど作ったソフトのショートカットを作成し、適当に
`管理者権限で開く`と名前を変えましょう

# 使ってみる
![sendmenu.png](https://qiita-image-store.s3.amazonaws.com/0/131480/22b18e8e-bf94-8293-365a-e4eb80fa4a05.png)
実際に管理者で開きたいファイルを右クリックし、送るメニューから
先ほど追加したアプリケーションを選択することで、該当のファイルやアプリケーションを管理者権限で開いたり立ち上げたりすることが可能になりました
administratorじゃないと編集や保存ができないファイルの編集や、
IISと連携させたプロジェクトファイルをファイルから直接開く際に便利ですね！やった！

# 注釈
間違ってたりする部分があると思います（というかあります）が生暖かい目で見てやってください
尚今回の記事を参考に作成して問題が発生しても知りません（）
TensorFlowをインストールし、MNIST for Beginnersまでを試す

CentOSにて、とりあえずTensorFlowの動作を確認出来る所までを記載します。

#前提
- CentOS7
- Anaconda

#手順
## Anaconda環境準備
[CentOS7にAnacondaの環境構築](http://qiita.com/iamdaisuke/items/3671032a18f5c4bf37d1)の手順でAnacondaまでをインストールします。

## TensorFlow用仮想環境準備
```
conda create -n tensorflow python=3.5
source activate tensorflow
```

## TensorFlowインストール
```
export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.9.0rc0-cp35-cp35m-linux_x86_64.whl
```
なお、使っている環境によってtensorflowの種類は書き換えましょう。[TensorFlow](https://www.tensorflow.org/versions/r0.9/get_started/os_setup.html#anaconda-installation)参照

```
easy_install --upgrade six
pip install --upgrade $TF_BINARY_URL
```
[TensorFlow](https://www.tensorflow.org/versions/r0.9/get_started/os_setup.html#anaconda-installation)にはPython3.5の場合はpip3を使うようになっていますが、今回のインストール方法ではpipで良いです。

**Successfullyが出た事を確認しましょう**

## テストドライブ
```
$ python
...
>>> import tensorflow as tf
>>> hello = tf.constant('Hello, TensorFlow!')
>>> sess = tf.Session()
>>> print(sess.run(hello))
Hello, TensorFlow!
>>> a = tf.constant(10)
>>> b = tf.constant(32)
>>> print(sess.run(a + b))
42
>>>
```
[テストドライブ参考](https://www.tensorflow.org/versions/r0.9/get_started/os_setup.html#test-the-tensorflow-installation)

## GitHubからClone
```
cd /usr/local/src/
mkdir ./tensorflow
git clone --recurse-submodules https://github.com/tensorflow/tensorflow ./tensorflow
cd ./tensorflow/
vi ./tensorflow/examples/tutorials/mnist/fully_connected_feed.py
```
```fully_connected_feed.py
# from tensorflow.examples.tutorials.mnist import input_data
# from tensorflow.examples.tutorials.mnist import mnist
import input_data
import mnist
```

## fully_connected_feed.pyを実行
```
source activate tensorflow
python ./tensorflow/examples/tutorials/mnist/fully_connected_feed.py
```
実行結果に

```
Training Data Eval:
  Num examples: 55000  Num correct: 49327  Precision @ 1: 0.8969
Validation Data Eval:
  Num examples: 5000  Num correct: 4531  Precision @ 1: 0.9062
Test Data Eval:
  Num examples: 10000  Num correct: 9035  Precision @ 1: 0.9035
```
みたいに表示される。

## TensorBoard起動
```
tensorboard --logdir=/usr/local/src/tensorflow/data
```
実行結果

```
Starting TensorBoard  on port 6006
(You can navigate to http://0.0.0.0:6006)
```

## TensorBoardにて結果確認
ブラウザで http://IPaddress:6006 にアクセス
クロスエントロピーやニューラルネットワークを見る事が出来れば、とりあえず動作完了です。


# 備考

- TensorFlowを使わない時

```
source deactivate
```

- TensorFlowを使う時

```
source activate tensorflow
```
WebGL(2D) - 入門編 - 3日目: 円を描く

# 目標

円を描く

![image.png](https://qiita-image-store.s3.amazonaws.com/0/80502/d7890461-df2c-73fd-fe5b-e15483b48bf6.png)



# 円の設定

![image2.png](https://qiita-image-store.s3.amazonaws.com/0/80502/b9a27149-6b3a-cd13-b1af-dea35b9d83ba.png)


```js:study.js
var x = 200; // 中心x座標
var y = 200; // 中心y座標
var r = 80; // 半径
```

# WebGL開始。

```js:study.js
var w = 400; // 幅
var h = 400; // 高さ
var canvas = document.getElementById("canvas");
canvas.width = w;
canvas.height = h;
var gl = canvas.getContext("webgl");
```

# 初期化

```js:study.js
gl.clearColor(1.0, 1.0, 1.0, 1.0);
gl.clear(gl.COLOR_BUFFER_BIT);
```


# 空のバッファオブジェクトを生成

```js:study.js
var buffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
```

# バーテックス(頂点)シェーダー

```js:study.js
var vSource = [
    "precision mediump float;",
    "attribute vec2 vertex;",
    "void main(void) {",
        "gl_Position = vec4(vertex, 0.0, 1.0);",
    "}"
].join("\n");

var vShader = gl.createShader(gl.VERTEX_SHADER);
gl.shaderSource(vShader, vSource);
gl.compileShader(vShader);
gl.getShaderParameter(vShader, gl.COMPILE_STATUS);
```

# フラグメントシェーダー

中心座標と半径に設定した座標にだけ色を塗る。

* 参考サイト
[yoyaのメモ](http://d.hatena.ne.jp/yoya/20150223/webgl)

![image3.png](https://qiita-image-store.s3.amazonaws.com/0/80502/0bcfae96-b153-a4a2-d142-00a3ecda3e00.png)


```js:study.js
var rgba = [0.0, 0.0, 0.0, 1.0]; // Red, Green, Blue, Alpha
var fSource = [
    "precision mediump float;",
    "void main(void) {",
        "vec3 p = vec3("+ x +", "+ (h - y) +", "+ r +");",
        "float x = gl_FragCoord.x - p[0];",
        "float y = gl_FragCoord.y - p[1];",
        "if (sqrt(x * x + y * y) < p[2]) {",
            "gl_FragColor = vec4("+ rgba.join(",") +");",
        "} else {",
            "discard;",
        "}",
    "}"
].join("\n");

var fShader = gl.createShader(gl.FRAGMENT_SHADER);
gl.shaderSource(fShader, fSource);
gl.compileShader(fShader);
gl.getShaderParameter(fShader, gl.COMPILE_STATUS);
```

# プログラムオブジェクトの生成

```js:study.js
var program = gl.createProgram();
gl.attachShader(program, vShader);
gl.attachShader(program, fShader);
gl.linkProgram(program);
gl.getProgramParameter(program, gl.LINK_STATUS);
gl.useProgram(program);
```

# シェーダー側の変数をjs側で受け受け取る

```js:study.js
var vertex = gl.getAttribLocation(program, "vertex");
gl.enableVertexAttribArray(vertex);
gl.vertexAttribPointer(vertex, 2, gl.FLOAT, false, 0, 0);
```

# 4点の座標をセット

![image4.png](https://qiita-image-store.s3.amazonaws.com/0/80502/ffb76efa-b775-4345-0b15-04035ff50899.png)


```js:study.js
var x1 = x - r;
var y1 = y - r;

var x2 = x + r;
var y2 = y - r;

var x3 = x - r;
var y3 = y + r;

var x4 = x + r;
var y4 = y + r;

var vertices = [
    (x1-(w/2))/(w/2), -(y1-(h/2))/(h/2),
    (x2-(w/2))/(w/2), -(y2-(h/2))/(h/2),
    (x3-(w/2))/(w/2), -(y3-(h/2))/(h/2),
    (x4-(w/2))/(w/2), -(y4-(h/2))/(h/2)
];
```



# 描画

```js:study.js
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.DYNAMIC_DRAW);
gl.drawArrays(gl.TRIANGLE_STRIP, 0, vertices.length/2);
```


# 備忘録

[WebGLStudy](https://github.com/ienaga/WebGLStudy)