OmniAICreator/Qiita-1.07M huggingface dataset:
.editorconfigでエディタ、IDEのコーディングルールを一貫させる

一人で作業する分には特に気にしないけれど、誰かと共同作業するときはスペース2つだったり、4つだったり`tab`だったり`tab`とスペースが混在してたり、結構カオスな事になる。

これは由々しき問題でなんでここにスペースあんねん。ケツに無駄なtab入ってるやん。ってことになりかねない。

普段`tab`で書いてるのに支給されたhtmlやsassファイルがスペース2つだったりする時もあるので、その度にエディタの設定を変更するのは面倒なのでEditorConfig使ってみた。(今更感)


##EditorConfig
対応エディタは公式で確認してみて下さい。
[http://editorconfig.org/](http://editorconfig.org/)

Sublime,Eclipse,Atom,VS code,Vimなんかの主要？(個人的見解)なエディタ,IDEにはプラグインを入れることで対応させることができる。

`.editorconfig`ファイルを作成してそこに設定ファイルを書いていく

```properties:.editorconfig

// falseにすると.editorconfigと同階層にあるものに適用させる
root = true


[*]
// タブかスペースか
indent_style = tab

// 改行コードの指定
end_of_line = lf

// 文字コードの指定
charset = utf-8

// 行末も空白を削除するか
trim_trailing_whitespace = true

// ファイルの最後の行に空白行を入れるか
insert_final_newline = false

// インデントのサイズは半角スペース何個分か
indent_size = 4

// markdownに適用される設定

[*.md]
trim_trailing_whitespace = false

// .jsonに適用される設定

[*.json]
indent_style = space
indent_size = 2

```

自分は半角スペースでインデントするメリットが見当たらないので、ハードtabに設定して、半角スペース4つ分の大きさにしています。
(半角スペースだと階層がわからなくなってくる)

最近のエディタなら一括で置換出来るし、統一してあれば問題なくね？って思ってます。
個人的にはtabの方がやりやすいってだけで。

htmlやらcssやらjsなんかは最近はminifyされちゃうしね。
Realm Mobile Platformを最速で試してみた（チュートリアル）

# はじめに
この記事はあくまで公式のチュートリアルをやってみようというものであって、既存のアプリにRealm Mobile Platformを導入する手順を示したものではないことをご了承ください。

完成コードは[コチラ](https://github.com/touyou/RealmTasksTutorial)です。
またこちらはmacOS Sierraでの流れですので他のOSで多少の差異があるかもしれないことはあらかじめご了承ください。

# 準備
まず始めに、RealmBrowser、RealmMobilePlatform、最新のRealmなどが入ったファイルをダウンロードします。

- [Getting Started](https://realm.io/docs/realm-mobile-platform/get-started/)

このページからダウンロード＆解凍しましょう。

# 触ってみる
## ① Realmのオンラインデータベースを起動する
チュートリアルではRealmのオンラインデータベースをローカルで立ち上げてそこにアクセスすることで進めていきます。

ターミナルを開いたら

```
$ cd 解凍したフォルダ
$ ./start-object-server.command
```

とコマンドを打ちましょう。するとRealmのサーバーが立ち上がり自動的にWebブラウザで管理画面にアクセスされます。初回起動時にはメールアドレスやパスワードを入力して登録してください（以降はそのアカウント情報を用いてアクセスすることになります。）

## ②　公式のサンプルを見てみる＆Realm Browserを使ってみる
チュートリアルでつくるアプリのデザインに凝ったサンプルが解凍したフォルダの中には入っています。`realm-mobile-platform>demo>RealmTasks`の中に入っているので`RealmTasks.xcworkspace`を開いて立ち上げてみましょう。

アプリのUIは少しわかりにくいですが下にスワイプするとタスクを追加することができます。

次にこれがしっかりサーバー側にも登録されていることを確認するためにRealm Browserを用います。解凍したフォルダにRealm Mobile Platformに対応したRealm Browserが入っているので立ち上げてください。するとメニュー画面が現れるので一番下の`Connect to Object Server`をクリックしましょう。するとどのサーバーにアクセスするかの設定画面が現れます。

サーバーURLにはなにもいじってなければ`realm://127.0.0.1:9080`を入力します。そしてAdmin Access Tokenに関してはさきほどコマンドを実行したターミナルを遡ると`Your admin access token is:`の後に長ったらしい英数字列があると思うのでそれを`==`までコピーしてはりつけます。
入力し終えたあとすすめると見慣れたRealm Browserの画面が開きます。少しいじってみるとしっかりとリアルタイムでRealm Browserで見ているデータとアプリのデータが同期していることが確認出来ると思います。

## ③ チュートリアルで手を動かしてみる
ここまでできたらサンプルと同じようなアプリを、自分の手でつくれるチュートリアルがあるのでそちらを進めましょう。

- [Tutorial: Build iOS App from Scratch](https://realm.io/docs/realm-mobile-platform/example-app/cocoa/)

デモに関してはAndroidもあるようですが残念ながらチュートリアルはiOS(Swift3/Xcode8)のみでした。
手順などはもちろん公式のものをよんでもらうとして少しはまったところをあげておきます。
### usernameとpasswordは一番最初に登録したもので
途中コードにusernameとpasswordを入力するところがあるのですが、それは必ずさきほどデモを見ているときに登録したものにしましょう。ブラウザからあとで追加したユーザーでやってみたのですがデータがうまく反映されませんでした。
### 時々文章の中に入力すべきことが書かれている
これは英語母国話者なら問題ないのでしょうが、途中で文章中の中だけでどこそこにどれを書くといったことが指示されていることがあるので気をつけましょう笑

# 所感
まずチュートリアルに関してはこれはかなり有用で、Realm社の中で培われたSwift3の洗練された書き方を学ぶことが出来、Realm Mobile Platformを使う気がないとしてもこれをしっかり手で入力していくことはいい勉強になると思いました。

そして肝心の使い心地という点では、競合となるFirebaseやNifty Cloudと比較してみると五分五分といったところです。まず、一見これらのサービスは似ているように思えますがRealm Mobile PlatformはあくまでSQLiteの代替というポジションなのでサーバーに関しては自分で立てる必要があります（今までの流れで十分気付いているとは思いますが...）
ですので完全無料というのもサーバー費を差し引くとそこまで魅力となるものではないかもしれません。

一方で使い勝手としてはかなりいいです。特に今までRealmを使ってきていた人にとってはとても導入が簡単です。チュートリアルを見ればわかりますがネットワークの設定はログインのところのみであとは普通にローカルのRealmを触るのと同じように書いていれば勝手にサーバーにアップ＆管理してくれます。これは紹介文でもかなり推されていたポイントですが、実際書いてみても確かに沿う感じました。

結論今回のリリースはいままでローカルはRealmで、オンラインは自作データベースでとやってた人たちに一番嬉しいものかもしれません。もし興味があれば是非試してみましょう！
Prevents the zoom of the viewport by successive tap of the button in iOS 10 Safari.

iOS 10 から `<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no">` が機能しなくなりました。

具体的には `initial-scale=1`, `minimum-scale=1`, `maximum-scale=1`, `user-scalable=no` の解釈が変更になり、特に `user-scalable=no` は iOS Safari において完全に無視されるようになりました。 (WKWebKitでは抑止可能です、後述しています)

ブラウザゲームなどでは、ユーザが意図せずボタンや画面を連打するケースが多く `user-scalable=no` が **意図しないダブルタップにおける画面のズームを抑止する** 目的において素晴しい働きを見せていましたが、 iOS 10 からは代替手段を模索する必要がありそうです。

# 解法その1
## ページズームそのものを抑止することはできないが、ボタンの連打におけるズームは防げる

ページズームをそのものを抑止することはどうやら不可能なようです。

個人的にページはズームできたほうが良いとも考えており、 問題のポイントは**ユーザが意図しないタイミングにおけるズーム**にあると考えました。

### DEMO

こちらのシンプルな [デモ](http://uupaa.github.io/WebKitChangeLog/test/iOS10/user-scalable/index.html)([Source](https://github.com/uupaa/WebKitChangeLog/blob/master/docs/test/iOS10/user-scalable/index.html)) では、ボタンを連打しても画面はズームしません。

- ズームを抑止したい要素に対して `class="prevent-zoom"` を付与する
- 読み込み完了のタイミング(デモでは_attchEvent関数)で `prevent-zoom` を持つ要素を検索し、ズームを抑止するためのイベントハンドラを設定する
- イベントハンドラの中では `event.preventDefault()` と `event.stopPropagation()` を行いイベントのバブリングを抑止する

といった事を行っています。

### SPA ではどうするか

SPAなど、画面の構成要素が動的に頻繁に入れ替わる場合はこのようなシンプルな方法では抑止できません。
バブルアップしてくるイベントを捉えるか、キャプチャーフェーズでイベントを補足し、`prevent-zoom` を持っている要素に対して `event.preventDefault(); event.stopPropagation()` を行う必要があります。
ただ、**既に長い運用の歴史があり、魔窟と化しているコードにおいては、最新の注意を払って実施しないと思わぬ副作用** があるでしょう。


# 解法その2

模索中… 分かったら追記します。

# Safari 改変の歴史

Safari はこれまでにも、色々とボディブローのような改変が行われています。

- コンテンツ領域を広く見せようとして、アドレスバーを隠すスクリプトを沢山の人達が導入していたところ、iOS 7 で突然無効化されてしまった
  
    ```js
    // ページロード直後にスクロールバーを隠す
    window.addEventListener("load", function() {
        setTimeout(scrollBy, 100, 0, 1); // 100ms後に scrollBy(0, 1) を行う
    }, false);
    ```

- iOS 7 で横持ちしている時にフルスクリーン表示ができなくなってしまった(アドレスバーが表示されてしまう)
    - http://www.mobilexweb.com/blog/safari-ios7-html5-problems-apis-review
- iOS 7.1 で `minimal-ui` を一瞬導入するも、すぐに無かった事にされてしまう

    ```html
    <meta name="viewport" content="width=device-width,minimal-ui">
    ```

- iOS 8 でブラウザのスタイルが刷新され、アドレスバーが小さくなったが、アドレスバーが出ているかどうかを判別不能になってしまった
- iPhone 6s iOS 9 から 3D touch が導入されたが、機能を抑止する方法がセットになっていないため、[ユーザがエキサイトすると長押しで誤爆してしまう](http://uupaa.hatenablog.com/entry/2015/10/06/112352) という問題がある

などなど、一部の開発者にとっては嬉しくない改変が続いています。
禊(みそぎ)のようなものと捉え、これからも頑張って追従していけたら良いですね ><

# WKWebView における対応方法

iOS 10 の WKWebView では設定が追加され、WebView におけるポリシーの設定が可能になりました。  

> WKWebView now defaults to respecting user-scalable=no from a viewport. Clients of WKWebView can improve accessibility and allow users to pinch-to-zoom on all pages by setting the WKWebViewConfiguration property ignoresViewportScaleLimits to YES.
> via https://developer.apple.com/library/prerelease/content/releasenotes/General/RN-iOSSDK-10.0/

- [Swift](https://developer.apple.com/reference/webkit/wkwebviewconfiguration/2274633-ignoresviewportscalelimits)
    - `var ignoresViewportScaleLimits: Bool { get set }`

- [Objective-C](https://developer.apple.com/reference/webkit/wkwebviewconfiguration/2274633-ignoresviewportscalelimits?language=objc)
    - `@property(nonatomic) BOOL ignoresViewportScaleLimits;`


参考になさってください。
【Bash】現在の日付・時刻を含む形でファイルを作成する

- 年月日まで

```bash
touch hoge_`date '+%Y%m%d'`.txt
# => hoge_20161006.txt
```

- 年月日時分まで

```bash
touch hoge_`date '+%Y%m%d%H%M'`.txt
# => hoge_201610061028.txt
```

- 年月日時分秒まで

```bash
touch hoge_`date '+%Y%m%d%H%M%S'`.txt
# => hoge_20161006103017.txt
```
rubygems plugin

https://github.com/rvm/gem-empty

https://github.com/rubygems/rubygems/blob/master/lib/rubygems/commands/uninstall_command.rb

https://github.com/rubygems/rubygems/tree/master/lib/rubygems/commands

http://www.brianstorti.com/creating-a-rubygems-plugin/

http://ieftimov.com/your-first-rubygems-plugin

http://franck.verrot.fr/blog/2015/04/21/hijacking-gem-commands/

http://tagaholic.me/2009/04/23/how-to-write-a-rubygem-command-plugin.html

build new lala

# /lib/rubygems_plugin.rb

```rb
require 'rubygems/command'
require 'rubygems/command_manager'
require 'rubygems/version_option'
require 'pry'

class LalaCommand < Gem::Command

  include Gem::VersionOption


  add_common_option('-k','--kickass lala','kickass') do |value, options|
    binding.pry
  end

  #Gem::Command.common_options 列出当前所有的common options

  #common option每个命令都会有 比如gem help list

  def initialize
    super "lala", "just a testlalallaa"

    add_option('-a', '--[no-]all',
      'Uninstall all matching versions'
      ) do |value, options|
      binding.pry
      options[:all] = value
    end

    add_option('-i','--install-dir DIR','Directory to uninstall gem from') do |value, options|
      binding.pry
      options[:install_dir] = value
    end

    #还可以把选项分成一组一组的
    add_option(:fuck, '-d','--default haha',
               'hahahha') do |value,options|
      binding.pry
    end

    add_version_option
    add_platform_option

    remove_option("--version") #貌似只能清除自己定义的，像common options就不行了
    remove_option("-d")

  end

  def arguments # :nodoc:
    "empty        remove all gems from current GEM_HOME."
  end

  def usage # :nodoc:
    # "#{program_name}"
    "mother fucker"
  end

  def defaults_str # :nodoc:
    "lalallala"
  end

  def description # :nodoc:
    "Remove all gems from current 'GEM_HOME'."
  end

  def execute(opts = {})
    binding.pry
    puts "fuck you #{opts}"

    # get_all_gem_names 会把命令传进来的gem名字得到为数组 比如gem lala pry rails => ['pry','rails']
    #具体看unpack_command.rb
    #其他配套命令是　get_all_gem_names_and_versions　get_one_gem_name

  end
end

Gem::CommandManager.instance.register_command :lala


```

add_option分两种一种是true和false的,另一种是输入值的，

--[no-]all　这种是true和false的

--install-dir DIR这种是字符串的

program_name是命令的名字　这里是lala


    add_version_option　add_platform_option依赖Gem::VersionOption
WordPressのカテゴリページで、現在のカテゴリーの子カテゴリー一覧を表示


カテゴリページへ来たときに、
ページ上部に子カテゴリを表示し、記事数も出したいとき。

以下関数を使用。

[single_cat_title()](https://wpdocs.osdn.jp/%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%BF%E3%82%B0/single_cat_title)

[wp_list_categories()](https://wpdocs.osdn.jp/%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%BF%E3%82%B0/wp_list_categories)


```
<?php
$category_name = single_cat_title('',false); // 現在のカテゴリ名を取得（表示はしないのでfalse）
$category_id = get_cat_ID($category_name); // カテゴリ名から現在のカテゴリIDを取得

$args = array(
  'orderby'            => 'count', // 投稿数順
  'show_count'         => 1, // 投稿数を表示
  'child_of'           => $category_id, // 現在のカテゴリの子カテゴリーを表示
  'title_li'           => '', // タイトル出さない
  'show_option_none'   => '',
  'current_category'   => 0,
  'pad_counts'         => 0,
  'taxonomy'           => 'category', // 投稿のカテゴリを指定
  'walker'             => null
);
?>
<!-- カテゴリ一覧 -->
<ul><?php wp_list_categories( $args ); ?></ul>
```
Access で存在しないテーブルに対して SELECT INTO するときの挙動

# ことのはじまり

以下のような処理に直面しました。

なんかテーブルを DROP してる。

```sql
DROP TABLE A_TABLE
```

わかる。

その後、DROP したばかりのテーブルに対して SELECT INTO してる。

```sql
SELECT B.COL INTO A_TABLE FROM B_TABLE B 
```

意味がわからない。

# SELECT INTO は存在しないテーブルに対して有効なのか？

結論から言うと有効です。

ひとまずAccess上で検証してみる。
a テーブルに a カラムを作成しておき、'test'という値を放り込み、存在しない b テーブルに対して SELECT INTO してみる。

```sql
SELECT a.a INTO b FROM [テーブル1] a
```

すると、以下のような警告が表示されて、「はい」を押すと b テーブルが作られた。

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/126264/ee5903e5-8e40-6b54-79f8-7068f6121851.png)

中の値もしっかり入っている。

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/126264/aca10f3d-de92-467b-ddfb-6af1108d5f23.png)

ちなみに存在しないテーブルに対して INSERT INTO はもちろん不可能です。

以上。
Visual Studio Codeことはじめ


前職では、Windows + .NET + C# + VisualStudioという構成で開発していたこともあり、簡単な開発では見慣れたUIを使えると良いな、ということでVisualStudioCode（以下、VSCode）を利用しています。

よく使う操作と設定手順をまとめておきます。

[公式サイト](https://www.visualstudio.com/ja-jp/products/code-vs.aspx)

## 目的

* VScodeの操作や設定をまとめる

## 対象読者

* VSCodeを使っている人/使おうと思っている人

## 環境

* OS X EI Capitan 10.11.6

注：windowsの場合は、commandをctrlに読み替えてもらえれば大丈夫だと思います。

## やる/やら

やる

* 初期設定
* Tipsの紹介

やらない

* インストール

## 操作系

### コマンドパレット

コマンドベースでVScodeを操作できます。

* command + shift + p

### シェルを呼び出す

v1.2から統合されました。

* ctrl + `

注：commandではない点注意。いつも間違える。

### 既存設定の確認

* command + shift + o

### sidebarの出し入れ

邪魔なときに

* command + b 

### エディタの分割と移動

* command + \　（移動）
* command + 1　とか 2 とか

ただ、すぐに忘れてしまうのでコマンドパレットベースでやることが多いです。

* コマンドパレットを呼び出して、splitと入力しましょう。（split editorを選択）

### 検索系

* command + shift + f （プロジェクト内検索）
* command + f　（ファイル内検索）

### dashを呼び出す

dashというローカルドキュメントツールを検索しに行きます。
別途、dash本体と(dashplugin)[http://]のインストールが必要です。

* ctrl + h

### その他

このあたりはどのエディタも同じですね。

|操作|ショートカット|備考|
|--:|:--|:--:|
|ファイル作成|command + n | |
|フォルダを開く|command + o|フォルダ = VisualStudioのプロジェクトと思ってもらえてOKです。|
|タブを閉じる| command + w | |

## 設定系

### shellを任意のシェルに変更する。

デフォルトではbashになっているので、zshに変更します。

1. command + , setting.jsonを開く
2. 下記を追加する。

```json:settings.json
// 既定の設定を上書きするには、このファイル内に設定を挿入します
{
     "terminal.integrated.shell.osx": "/usr/local/bin/zsh"
}
```


### shellからvisual studio codeを呼び出せるようにする

shellから、codeと入力することで、VScodeを呼び出すことができます。

1. command + shift + p
1. コマンドパレット上で、shellと入力する
1. shell command: install 'code' command in PATH を選択する

## プラグイン系

下記手順でpluginのインストール画面を開き、所定のプラグインをインストールします。

1. command + shift + p
1. コマンドパレット上で、installと入力、Extensions install を選択

### アイコン

sidebarのファイルにiconをつけてくれます。見やすくなるので重宝します。

* [vscode-icons](https://marketplace.visualstudio.com/items?itemName=robertohuertasm.vscode-icons)

### dash

ローカルドキュメントのdashを呼び出すプラグインです。

### HTML Preview

vscode上で、HTMLプレビューを可能にするプラグインです。Markdownはデフォルトでプレビューできますが、HTMLはできないので。

## 終わりに

公式ドキュメントを読むなり、ググるなり、ご自由に。
好みのエディタに育てましょう。
Sheetsu APIでの複数行(rows)POSTの実装

Google spreadsheetsをAPI化するラッパーサービスのSheetsuに、`$.ajax()`を使って複数行(rows)POSTしてみる。

公式ドキュメント：https://sheetsu.com/docs/beta#post

見たとおり、`{ 'rows': [ {}, {}, {}, ... ] } `と言う形のjsonをぶち込めばイケる。よって例にある通り;

```bash
curl -X POST -H "Content-Type: application/json" https://sheetsu.com/apis/v1.0/ENDPOINT -d '{ "rows": [{"TimeStamp":"2016/9/27 1:23","undefined":"fuga"}, {"TimeStamp":"2016/9/28 2:34","undefined":"moga"}] }'
```

こんな感じでいける。そこで`$.ajax()`を使って`POST`してみる。

# `$.ajax`オプションで`Content-Type`を指定し、渡すデータオブジェクトは`JSON.stringify()`する

謎だが、そうしないと`400`ないしは`500`エラーになる。とりあえずこの方法でうまくいく。

```js
var request = {
  rows: [
    {}, {}, {}, ...
  ]
};
```


```js
$.ajax({
  type : 'POST',
  url : '//sheetsu.com/apis/v1.0/ENDPOINT',
  dataType: 'json',
  contentType: 'application/json',
  data : JSON.stringify(request)
})
```

余談だけど、Sheetsu、便利なんだけど間違ったクエリぶち込むと`500 Internal Server error`で帰ってくるなど、何が悪いのかサッパリでデバッグしずらかった。


## 送りつけるjsonの`{"id":"key"}`は、日本語でおｋ

問題なく通る

## 送りつけるjsonの`{"id":"key"}`は、必ず`id`が必要

id省略して、右から順にcolsをぶち込んでくれればいいのに、してくれないので、Spreadsheetsの１行目にid名を記入し、`id`を確定させてから、`id`のある連想配列としてぶち込む必要がある。

よって、可変長ではなくターゲットとなるGoogle spreadsheetsの１行目の値に依存した固定長のオブジェクトであることになる。

## カラムid: 'undefined' を作ったほうが無用なエラーが返ってこない

送信するオブジェクトが`while`などで自動生成したやつをSheetsuにぶち込むとき、id名が`undefined`だったりすると、そんなカラムはないと`404`ないしは`500`/`503`エラーのレスポンスが帰ってくる時がある。

冗談みたいだけど、これを避けるために`undefined`カラムを用意しておくと、とりあえずそこにvalueが収まってエラーが出ず安定である。

![スクリーンショット 2016-09-28 11.07.36.png](https://qiita-image-store.s3.amazonaws.com/0/97659/ada4859b-97c6-7d62-64b9-1770223ac4e4.png)


## レスポンスが帰ってくるまでのTimeoutに気をつける

膨大なrowsが入ったオブジェクトをぶち込むと普通に食べてくれるが、ターゲットとなるGoogle spreadsheetsに反映されるまで１０秒以上かかる。

それと、SheetsuはおそらくGoogle spreadsheetsのレスポンスを待ってさらにレスポンスをリクエスト基に返すので、余計に時間がかかり、`$.ajax()`がレスポンス帰ってくるのを待ちきれずに`timeout`し、deferredが`.fail()`する。

この現象をなるべく避けるために、`timeout`オプションの指定や、細切れにしてリクエストするなどしたほうが良いと思う。
システムに負荷を与えるためにGatlingを使ってみた（Windows環境）

#はじめに
システム開発において、負荷試験は付き物です。
Gatlingを使うと、統計レポートのグラフを作る手間が省けるのでオススメです。

#Gatlingとは
負荷試験ツールの一種です。他にもたくさん負荷試験ツールは存在すると思いますが、Gatlingの良い点を紹介します。

Gatlingで出来ること
・GUI操作が可能
・上記操作をプログラム(scala)に落とし込める
・HTML表示が可能
・などなど

また、他の負荷試験ツールと決定的に違う点は、出力されるレポートが見やすい点にあります。
アクティブユーザ数の設定や、レスポンスタイムの設定など、細かく指定も出来ます。
あるサイトでは、JMeterよりも使い勝手が良いと言われています。（http://mislead.jp/1993.html）
懸念点としては、まだ日本語の資料が充実していない点とありましたが、システムテスト初心者の私でも、簡単に動かすことが出来たので、全然気にせず大丈夫でしょう。

#Gatlingの使い方
とりあえず、下記URLからzipファイルをダウンロードしましょう。
http://gatling.io/#/resources/download

私は、2.2.2をダウンロードしました。

次に、webページのプロキシを設定します。
下記URLを参考に設定してください。
Chrome(https://www.waseda.jp/navi/network/doc/proxy_chrome.pdf) 
Firefox(https://www.waseda.jp/navi/network/doc/proxy_ff.pdf) 
IE(https://www.st.ryukoku.ac.jp/connect/setup/ie-proxy.html) 

次に、Gatlingを起動します。
windowsの場合は、recoder.batファイルを実行します。
例（C:\gatling\gatling-charts\bin\recoder.bat）

![qiita1.PNG](https://qiita-image-store.s3.amazonaws.com/0/139203/112e14c5-5f8d-85ee-0201-acb9cd48ea6b.png)

上記のようなGUIが出てきます。
そこで、上部Network欄のlocalhost HTTP/HTTPSを先ほどプロキシ設定で指定したPort番号に書き変えます。
もしくは、もう一度プロキシ設定欄でPort番号を8000番にしても大丈夫です。

設定できたら、下部のStart!ボタンをクリックしましょう。Gatling側でサーバが立ち上がるはずです。

![qiita2.PNG](https://qiita-image-store.s3.amazonaws.com/0/139203/6ca2e20c-fd04-63ba-40d0-5b03ef811a2b.png)

上記画面が出てくればOKです。

あとは、負荷をかけたいシステムもしくはwebを起動して、ボタン操作などを行うと、
Executed Events欄にlogが記載されていきます。

そしたら、
C:\gatling\gatling-charts\user-files\simulations上に、
RecordedSimulation.scalaファイルが出現しているはずです。


scalaファイルが存在することを確認できたら、
gatling.batファイルを実行します。
例（C:\gatling\gatling-charts\bin\gatling.bat)

![qiita3.PNG](https://qiita-image-store.s3.amazonaws.com/0/139203/a78999fb-51dd-6d32-36f1-4cbbc02df600.png)

上記文章が出てくるはずです。
そしたら、0を押しましょう。（先ほど作られたscalaファイルになります。）
後は、その後の文章に従って、進みましょう。
デフォルトで良いのなら、Enterキーを押すだけで良いはずです。

完了したら、
C:\gatling\gatling-charts\results上にフォルダが作成されているはずです。
中にあるHTMLファイルを開くと、

![qiita4.PNG](https://qiita-image-store.s3.amazonaws.com/0/139203/db183432-c41f-94ac-c2e4-912a94bceece.png)

![qiita5.PNG](https://qiita-image-store.s3.amazonaws.com/0/139203/1c41aa2d-1ee1-8fa3-d46b-dd28aaddcb05.png)

上記のようなグラフがありますよね。
そんなに手間が掛からずにここまでのグラフが簡単に作成できる点が、
Gatlingの優れている点ですね。


#終わりに
scalaファイルをいじることで、動作を変えることも出来ますが、ここでは、説明しません。
次回以降、scalaファイルについては説明していきますので、乞うご期待。

テストツールも日に日に新しい技術が出てくるので、目が離せません。
NewRelicを導入してみた（CentOS・PHP編）

##NewRelicとは
http://newrelic.com/
>iOSやAndroid、サーバ、Webアプリのパフォーマンスを、サービス別、オペレーティングシステム別など、アプリのさまざまな稼働条件/環境別にリアルタイムで調べる。
デベロッパはNew Relicにログインし、アプリの対話的なアクションを調べるためのさまざまなオプションを指定する。またアプリのパフォーマンスをブラウザ上とサーバ上の両方でモニタできる機能もある。

基本機能はLiteプラン(無料)で使うことができます。

##NewRelicアカウント作成
https://newrelic.com/signup
上記URLからお願いします！

##CentOS7サーバに導入
###1.「SERVERS」のタブをクリック
アカウント作成後、画面上の「SERVERS」のタブをクリックします。
今回は、CentOS7に導入するので「Red Hat or CentOS」をクリックします。![名称未設定 ３.png](https://qiita-image-store.s3.amazonaws.com/0/60055/6d88bd99-42e9-6cd8-2168-8d25b7b1790f.png "名称未設定 ３.png")


###2.NewRelicのリポジトリを入れる
![スクリーンショット 2016-09-20 17.47.57.png](https://qiita-image-store.s3.amazonaws.com/0/60055/8ba43de4-d301-7205-1ec7-4c38737c77e0.png "スクリーンショット 2016-09-20 17.47.57.png")

```
rpm -Uvh https://download.newrelic.com/pub/newrelic/el5/i386/newrelic-repo-5-3.noarch.rpm
```

###3.NewRelicのインストール![スクリーンショット 2016-09-20 17.48.01.png](https://qiita-image-store.s3.amazonaws.com/0/60055/22d0355b-6670-81cc-d5d1-8d05f19a14a3.png "スクリーンショット 2016-09-20 17.48.01.png")
```
yum install newrelic-sysmond
```

###4.ライセンスキーと自動起動設定
![スクリーンショット 2016-09-20 17.48.06.png](https://qiita-image-store.s3.amazonaws.com/0/60055/c6f4c1c1-bda2-98ab-1e60-419fbdbe534b.png "スクリーンショット 2016-09-20 17.48.06.png")

```
nrsysmond-config --set license_key=xxxxxxxxxxxxxxxxxxxxx
/etc/init.d/newrelic-sysmond start
```

###5.動作確認
ボタンを押して、確認しましょう！
![スクリーンショット 2016-09-20 17.48.19.png](https://qiita-image-store.s3.amazonaws.com/0/60055/547cf6f4-6ddc-ce7b-4bca-9f1a22de96bd.png "スクリーンショット 2016-09-20 17.48.19.png")



##PHPアプリに導入
###1. PHPアプリを選択
![スクリーンショット 2016-09-20 18.04.41.png](https://qiita-image-store.s3.amazonaws.com/0/60055/8e886f09-04ae-1d8e-62d9-e5632d32b7cd.png "スクリーンショット 2016-09-20 18.04.41.png")
###2.RPM-Basedを選択
![スクリーンショット 2016-09-20 18.05.17.png](https://qiita-image-store.s3.amazonaws.com/0/60055/425dcd3d-df8b-830f-5fce-14bc4f87a644.png "スクリーンショット 2016-09-20 18.05.17.png")
###3.PHP用NewRelicのインストール
![スクリーンショット 2016-09-20 18.05.34.png](https://qiita-image-store.s3.amazonaws.com/0/60055/356f6b85-800d-86f9-6d16-89722d963dc4.png "スクリーンショット 2016-09-20 18.05.34.png")

```64bit
sudo rpm -Uvh http://yum.newrelic.com/pub/newrelic/el5/x86_64/newrelic-repo-5-3.noarch.rpm
```

```install
sudo yum install newrelic-php5
sudo newrelic-install install
```
###4.ライセンスキーの設定
php.iniにライセンスキーを追加し、アプリケーションを再起動
![スクリーンショット 2016-09-20 18.05.50.png](https://qiita-image-store.s3.amazonaws.com/0/60055/ebda413b-dd09-a224-9ddb-b8a14389b3c9.png "スクリーンショット 2016-09-20 18.05.50.png")

###5. 動作確認
データが送られてきたら、OK
![スクリーンショット 2016-09-28 10.27.11.png](https://qiita-image-store.s3.amazonaws.com/0/60055/fa6c680a-cc83-2c10-a53e-4282913c6c95.png "スクリーンショット 2016-09-28 10.27.11.png")
pytest + webtest + pyramid

pyramidで開発したアプリを、WebTestで機能テストする方法は[ここ](http://docs.pylonsproject.org/projects/pyramid/en/latest/quick_tutorial/functional_testing.html)に書いてあります。
このテストを、pytestで実行しようとしてもうまくいきません。元のドキュメントに書いてある通りです。`pytest may not include your tests.`

また、pytestのドキュメント読んでいると、どうも`unittest`を使うとうまくいかないような気持ちになって来ます。例えば、せっかくのparametrized testも、テストクラスをunittestのサブクラスにしていると[動作しません](http://stackoverflow.com/questions/18182251/does-pytest-parametrized-test-work-with-unittest-class-based-tests)。

そんなわけで、pyramidアプリをpytest+webtestでテストする構成はこんな感じにしました。

```conftest.py
import pytest

def pytest_report_header(config):
    return "sample: functional tests"

@pytest.fixture
def app():
    """ prepare test target app """
    from app import main
    main_app = main({})
    from webtest import TestApp
    return TestApp(main_app)
```

```tests.py
import pytest

@pytest.mark.usefixtures("app")
def test_not_found(app):
    res = app.get('/', status=404)
以下省略
```

ようやく、pytestでテストが書けそうな気分になって来ました。parametrized testは最高に便利だと思います。

参考
- http://akirachiku.com/2014/04/14/django-pytest-webtest.html
Mac on Windows keyboard as Windows Keyboard

# 概要
あんまりいないと思いますがWindowsのキーボードをWindowsのキーボードのまま、Macで使いたい人向けの記事です。Ctrl＋Cでコピーペーストができるようになります。

# やり方
Seil（旧PCKeyBoardHack）をインストールします。
再起動は必要ありません。
Other Keys->Change Control_Lの59を55に変更してチェックを入れる。

続いてKarabinarをインストール。
こちらも再起動は必要ありません。
For Japanese->Back QuoteのKANA/EISUU(toggle)にチェック
For Japanese->Use Command_R as KANA/EISUU(toggle)にチェック


※動作環境
0S X 10.11

#参考文献
http://www.airpucci.com/2013/10/post-3987/
Bash/Zshで、個人的に有用だと思っているエイリアス

記事にするのがはばかられるくらい小ネタだが、前から設定しておけば良かったと思ったので

列の合計値

```bash
alias sum="awk '{a+=\$1}END{print a}'"

# 使い方
% seq 1 10
1
2
3
4
5
6
7
8
9
10

% seq 1 10 | sum
55
```

平均があれば合計も欲しいよね

```bash
alias ave="awk '{a+=\$1}END{print a/NR}'"
# 使い方

% seq 1 10 | ave
5.5
```

クリップボード

```bash
alias cl='xsel -ib'
alias clp='xsel -ob'
```

Windows用の苦肉の策

```bash
to_dos(){
    iconv -f utf8 -t sjis | perl -pe 's/\n/\r\n/' < /dev/stdin
}

# 使い方
% echo あ | to_dos              
Ƃ͉
```

その他

```bash
alias now='date +%Y%m%d_%H%M%S'
alias glook='cd $(ghq root)/$(ghq list | peco)'
alias ycal='cal `date +%Y`'
```
Swift開発における開発ルール

## 概要
Swiftアプリ開発における個人的な開発ルールです。
追加があったら付け足していきます。

『自分はこんなルールでやってるよ！』とコメントしてくれると喜びます。

## フォルダ分け

|project||||
|:--|:--|:--|:--|
||UI||Storyboadを置く|
||VC||ViewControllerを置く<br>Storyboadに対して複数ある場合は階層を増やす|
|||Common|BaseViewControllerなどのBaseクラスを置く|
||Model||Viewと分離したModelクラス|
||Common||共通系のクラスを置く（比較的自由）|
|||Const.swift|定数のみをまとめるクラス|
||Library||外部ライブラリを置く|
||Supporting Files||画像やInfo.plistなどを置く|

ViewController、Storyboad、NotificationNameなどはConstで管理する

## クラス内リージョン規約

```
// MARK: IBOoutlet
// MARK: 変数
// MARK: 定数
// MARK: View Lifecycle
// MARK: プロパティ
// MARK: 内部メソッド
// MARK: 公開メソッド
// MARK: IBActions
// MARK: UITableViewDelegate
```

上記の順番で記述していく（ショートカット：control+6）
書き方については以下の記事を参照。見やすいように工夫する。
[Swiftでクラスのアウトライン表示\(区切り線やTODO\) \- Qiita](http://qiita.com/ohkawa/items/74abb92f4f5cf39b1dbd)

## コーディング規約

### コーディング
下記を遵守
[Swiftコーディング規約@Wantedly \- Qiita](http://qiita.com/susieyy/items/f71435cc962e70d81b37)

### 変数名命名規則
IBOoutletやIBActionについて

```objectc
// connectを貼ったパーツ名を最後に付ける
@IBOutlet weak var testLabel: UILabel!

// Actionについても何のアクションか最後に付ける
@IBAction func testButtonAction(sender: AnyObject) {
}
```

## ドキュメンテーションコメント
[VVDocumenter\-Xcode](https://github.com/onevcat/VVDocumenter-Xcode)を利用
Lifecycleやdelegateメソッドについては記述するかは任意だが、自作したメソッドには必ず使用する

## StoryboadとViewControllerの関係
Storyboadで記述できるところは全てStoryboadで設定する
Storyboadは長くなりすぎず、機能単位で依存する関係のみを１ファイルにまとめる

```php:Main.storyboad
Top - StoreList - StoreDetail 
    - SettingTop - SettingEdit
```

このようなStoryboadがあった場合は

```php:Top.storyboad
Top
```

```php:Store.storyboad
StoreList - StoreDetail
```

```php:Setting.storyboad
SettingTop - SettingEdit
```

のように３つに分ける

## UITableViewとUITableViewCell(Navigation)

一つのViewController内でTableViewを作成し、カスタムセルクラスを作った時はそのViewController内の上部に書く

またNavigationControllerのクラスは起点となるViewContollerファイルの上部に記述する

```objectc:TestViewController.swift
import UIKit

class TestNavigationController: UINavigationController {
    
}

class TestTableViewCell: UITableViewCell {
    @IBOutlet weak var testLabel: UILabel!
}

class TestViewController: BaseViewController, UITableViewDataSource, UITableViewDelegate {
    
    // MARK: IBOoutlet
    @IBOutlet weak var testTableView: UITableView!
```
Twitter4JのExtendedMediaEntity廃止について

# 概要

Twitter4Jの```ExtendedMediaEntity```とは、```extended_entities.media```を表現するオブジェクトで、これが2016年9月現在、Twitterの度重なる仕様変更でいろんな面で問題になっているので、問題点を整理し、解決策をまとめておく。


# 問題点

TwitterのGIF動画・複数画像対応時に Tweet の JSON (Twitter4JのStatusオブジェクト) に ```extended_entities.media``` が追加された際に、新たに ```EntendedMediaEntity``` を追加した([Multiple image support by takke · Pull Request #156 · yusuke/twitter4j](https://github.com/yusuke/twitter4j/pull/156))。

その後のTwitterの仕様変更により、この構成が破綻しつつある。

1. [2016年3月] DirectMessageの動画対応時に(```extended_entities.media``` ではなく)```entities.media``` に ```video_info``` が追加された
2. [2016年9月] 140文字拡張対応で、Streamingの140文字超ツイートに ```extended_tweet``` が追加されたが、GIF動画・動画・複数画像は (```extended_tweet.extended_entities``` ではなく) ```extended_tweet.entities``` に載るようになった

以下、それぞれ詳しくみていく。


## 問題点1. DMの動画対応時に ```entities.media``` に ```video_info``` が追加された

```video_info``` は現時点で ```ExtendedMediaEntity``` がパースする実装になっているため DM の動画対応ができない。

そこで、[support "video_info" for direct messages by takke · Pull Request #234 · yusuke/twitter4j](https://github.com/yusuke/twitter4j/pull/234) のPRで video_info があれば ExtendedMediaEntity オブジェクトを作成するようにしているが、これはいささか奇妙な実装で、アプリ側で動画を判定する際に ```instanceof ExtendedMediaEntity``` をチェックする必要があるなど、非常に使いづらい。


## 問題点2. Streamingの140文字超ツイートに ```extended_tweet.extended_entities``` が含まれない

Streamingの140文字超ツイートには互換性を考慮して ```extended_tweet``` が追加されたが、GIF動画・動画・複数画像は ```extended_tweet.extended_entities``` ではなく ```extended_tweet.entities``` に載るようになった。

互換性の観点から [Support extended tweets by takke · Pull Request #247 · yusuke/twitter4j](https://github.com/yusuke/twitter4j/pull/247) の PR では ```extended_tweet.full_text``` や ```extended_tweet.entities``` は ```Status.text``` などにマージする形にしたが、media については ```MediaEntity``` としてマージされるようになった。

従って、下記2点の問題が生まれた。

- (A) これまでアプリ側では画像や動画が必要な際に、```Status.getExtendedMediaEntities()```があればそれを、なければ```Status.getMediaEntities()``` を使っていたが、「Streamingの際は ```Status.getMediaEntities()``` を優先する」必要があるようになった。
    - JSON例：[画像4枚添付した場合のextended tweetを含むClassic Tweetの例(Streaming)](https://gist.github.com/takke/990e5c511f60a5bf01c5770d20f1192d)
- (B) さらに、GIF画像や動画の場合、```extended_tweet.entities.media``` に ```video_info``` が載るので DM と同様に動画対応できない。
    - JSON例：[GIF動画を添付した場合のextended tweetを含むClassic Tweetの例(Streaming)](https://gist.github.com/takke/230f1a293071676083b2db90554b9a91)



# 解決策

2つの PR に分けて行う。

現状、[support "video_info" for direct messages by takke · Pull Request #234 · yusuke/twitter4j](https://github.com/yusuke/twitter4j/pull/234) のPRで DirectMessage の ```video_info``` 対応を行っていますが、これを破棄し、下記の2段階で修正を行う。

1. ```MediaEntity``` を ```ExtendedMediaEntity``` 相当にする
    - これで [PR #234](https://github.com/yusuke/twitter4j/pull/234) は不要になる
    - 問題点1 と 問題点2(B) が解決する
    - ```ExtendedMediaEntity``` の実装を ```MediaEntity``` に移すだけなので [```extended_tweet``` 対応のPR](https://github.com/yusuke/twitter4j/pull/247) で修正した。具体的にはコレ⇒ https://github.com/yusuke/twitter4j/pull/247/commits/0f37a6ab371bad40c3b984ebc252f168c1755b94
2. ```ExtendedMediaEntity``` を廃止する
    - ```extended_entities.media``` は ```entities.media``` すなわち ```MediaEntity``` に merge する
    - 問題点2(A) が解決する
    - [PR #250](https://github.com/yusuke/twitter4j/pull/250) で修正した。
workspace and project


http://stackoverflow.com/questions/21631313/xcode-project-vs-xcode-workspace-differences

I think there are many guys confuse these terms, especially after they lunch and open `XCode` IDE.


- https://developer.apple.com/library/content/featuredarticles/XcodeConcepts/Concept-Projects.html
- https://developer.apple.com/library/content/featuredarticles/XcodeConcepts/Concept-Workspace.html


#Xcode Workspace

A workspace is an Xcode document that **groups projects and other documents** so you can work on them together. A workspace can contain any number of Xcode projects, plus any other files you want to include. In addition to organizing all the files in each Xcode project, a workspace provides implicit and explicit relationships among the included projects and their targets.




#Xcode Project

An Xcode project is **a repository for all the files, resources, and information required to build one or more software products.** A project contains all the elements used to build your products and maintains the relationships between those elements. It contains one or more targets, which specify how to build products. A project defines default build settings for all the targets in the project (each target can also specify its own build settings, which override the project build settings).
WordPressの固定ページで、サイドバーとかに小階層の記事一覧を表示


固定ページは管理画面で階層が付けられるが、
サイドバー（サイドカラム）に、親ページタイトルとその小階層ページ一覧を
ナビゲーションとして出したいときに。

![スクリーンショット 2016-09-28 10.07.23.png](https://qiita-image-store.s3.amazonaws.com/0/40940/117771e4-ae08-429e-659f-9d49bc26c4d0.png "スクリーンショット 2016-09-28 10.07.23.png")


[wp_list_pages()](https://wpdocs.osdn.jp/%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%BF%E3%82%B0/wp_list_pages)を使います。



  ```sidebar.php
  <div class="plist">
	<ul>
		<?php
		// 固定ページのみ表示
		if ( is_page() ) {

			// 現在のページのIDを$pageに入れておく
			global $post;
			$page = $post->ID;

			// もし現在の固定ページに親ページがあれば
			if ( $post->post_parent ) {
				// 親ページのIDを$pageに入れなおす
				$page = $post->post_parent;
			}
			// 親のタイトルを取得
			$title = get_the_title( $page );

			$args = array(
				'authors' => '',
				'child_of' => $page, // 先ほど入れたID。親ページを指定
				'date_format' => get_option('date_format'),
				'depth' => 0,
				'echo' => 1,
				'exclude' => '',
				'include' => '',
				'link_after' => '',
				'link_before' => '',
				'post_type' => 'page', // 固定ページを指定
				'post_status' => 'publish', // 公開済のものを指定
				'show_date' => '',
				'sort_column' => 'menu_order, post_title',
				'sort_order' => '',
				'title_li' => '<h2>' . esc_html( $title ) . '</h2>', // タイトル表示
				'walker' => new Walker_Page
			);
			// 小階層のページを取得
			wp_list_pages( $args );
		}
		?>
	</ul>
</div>
  ```
PostgreSql コマンドの覚え書き

$ exit   <- rootへ戻ります
$ psql dbtest   <- rootの状態でデータベースへ接続をすると。。。
psql: FATAL:  user "root" does not exist 
 <- というようにデータベースにrootユーザは存在しないと怒られます。(^^;
 そこで -U を利用してpostgresを指定すると
$ psql -U postgres -q -d dbtest -f ファイル名
Realm Mobile Platformのデモアプリを動かしてみる

**Realm Mobile Platform**が気になったので、デモアプリを動かしてみました(^O^)／
※詳細は、[こちら](https://realm.io/jp/news/introducing-realm-mobile-platform/)

こんな感じに別の端末から入力された値が、他の端末にも同期されました！

![タイトルなし.gif](https://qiita-image-store.s3.amazonaws.com/0/53996/2ec06c70-b36c-d7d0-70cf-4c3453463544.gif)

# デモアプリの動かし方

## ① ダウンロード
ここから必要なファイルをダウンロードします。
https://realm.io/docs/#getting-started

macとlinuxの２つあります。

![スクリーンショット 2016-09-28 8.16.22.png](https://qiita-image-store.s3.amazonaws.com/0/53996/756d4890-8dc1-0c07-7699-273bfc3dd16c.png)

今回は**mac**を選びました。

![スクリーンショット 2016-09-28 8.16.32.png](https://qiita-image-store.s3.amazonaws.com/0/53996/0a4e5ff9-596f-9637-71e6-57bbde1f0e97.png)

## ②　サーバ起動

`start-object-server.command`をダブルクリックして、サーバを起動します。

![スクリーンショット 2016-09-28 8.17.10.png](https://qiita-image-store.s3.amazonaws.com/0/53996/386e6862-a713-0f37-f253-ecd19fcec7c2.png)

ブラウザが開いて、このような登録画面がでるはずです。
メアドやパスワードを入力します。

![screencapture-localhost-9080-1475018258749.png](https://qiita-image-store.s3.amazonaws.com/0/53996/92c5b817-e95d-5d51-ead3-f3a5170bc92b.png)

登録完了したら、先ほどのアカウントでログインします。

![スクリーンショット 2016-09-28 8.19.04.png](https://qiita-image-store.s3.amazonaws.com/0/53996/c371b48f-85ea-ccdc-e9ad-1de52a9c931b.png)

そしたら、こんな管理画面がでるはずです。

![CtX5Rg4UkAAveaB.jpg](https://qiita-image-store.s3.amazonaws.com/0/53996/9bdce106-03dc-ca9f-30bd-a715f3398ecb.jpeg)

## ③　クライアント

demo/RealmTasksにiOSやAndroidのデモアプリがあるので、お好きなやつを選んで、実行します(^_^)

![スクリーンショット 2016-09-28 8.19.37.png](https://qiita-image-store.s3.amazonaws.com/0/53996/9342b0de-2504-93c2-55f8-a74a6da2c355.png)

あとは、いろいろ試します！

## ④　データベースを見る

サーバ側のデータベースを見るには、`Realm Browser`を使います。

![スクリーンショット 2016-09-28 9.32.40.png](https://qiita-image-store.s3.amazonaws.com/0/53996/90c26823-1e9b-569d-c96b-d0dd6b238ffa.png)

`Connect to Object Server`を選択。

![スクリーンショット 2016-09-28 9.33.28.png](https://qiita-image-store.s3.amazonaws.com/0/53996/0989f7c3-6934-8562-3b6a-647772d3b847.png)

urlとtokenを入力します。
tokenは、ターミナルに`Your admin access token is`と表示されているので、それをコピペ。
urlは、`realm://127.0.0.1:9080`のような形で入れます。
そして、最後に`Connect`を選択！

![スクリーンショット 2016-09-28 8.36.46.png](https://qiita-image-store.s3.amazonaws.com/0/53996/6bd27bd5-6b42-66f8-837e-b4de37491365.png)

うまくいくと、こんな感じにみえます！

![CtX9QFwVMAAiVWp.jpg](https://qiita-image-store.s3.amazonaws.com/0/53996/51e04bc8-4407-7313-7b71-2760ce3d1716.jpeg)
Twigで変数・配列を定義・使用する際のちょっとしたメモ

## その1：for文の中で定義した変数・配列はfor文の外では使えない


公式ドキュメントの以下URLページ最下部に記載があります。
http://twig.sensiolabs.org/doc/tags/set.html
以下引用。

```twig:ダメな例
{% for item in list %}
    {% set foo = item %}
{% endfor %}

{# foo is NOT available for文の外でfooを呼び出すとエラーになる#}
```

```twig:正しい例
{% set foo = "" %}
{% for item in list %}
    {% set foo = item %}
{% endfor %}

{# foo is available for文の前でfooを定義してあげるとfor文の外でも使える#}
```

## その2：for文の中で配列を追加していく場合は「merge()」を使う

```twig:ダメな例
{% set foo = [] %} {# 配列を定義する場合は「""」ではなく「[]」 #}
{% for item in list %}
    {% set foo = [item] %}
{% endfor %}


{# これだと上書きになっちゃいます。 #}
```

```twig:正しい例
{% set foo = [] %}
{% for item in list %}
    {% set foo = foo|merge([item]) %}
{% endfor %}


{# merge()で追加していく#}
```

## その3：dump()を使おう

twig上で変数・配列の中身を確認したい場合はdump()を使う

## まとめ

そもそもテンプレート上で配列をセットするのってどうなのよ？という声もありつつ、
データベースからのデータ取得形式やパフォーマンスに応じて適宜活用していければと思います。
【Swift3】現在時刻の取得とDataFormatterでの文字列化


また備忘メモで恐縮です・・
この辺りがググっても古いコードが出てくる状況です。xcodeもここまで修正はしてくれません。

# こんなかんじで

```swift
    func getNowClockString() -> String {
        let formatter = DateFormatter()
        formatter.dateFormat = "yyyy-MM-dd' 'HH:mm:ss"
        let now = Date()
        return formatter.string(from: now)
    }
```

とやると

```swift
2016-09-28 09:02:37
```

とか出ますので、これで時計系のアプリとかログとかに使えるかと思います。
Eigenで巨大なSparseMatrix(疎行列)を作る方法

[Eigen](http://eigen.tuxfamily.org/index.php?title=Main_Page)は、C++で行列計算をとても簡単に行える便利なテンプレートライブラリです。

要素に零が多い場合は、メモリ節約のためにSparseMatrixを使います。
特に巨大なスパースマトリックスを作る場合は、以下のようにしてテンプレートにIndexの型を指定する必要がありました。

```c++
SparseMatrix<float, Eigen::RowMajor, int64_t> smat(max_term_id, max_doc_id);
```

これを指定しないと``int``の上限値でMatrixの構築に失敗します。

```
limit: eigen-3.3-rc1/Eigen/src/SparseCore/SparseMatrix.h:387: Eigen::SparseMatrix<_Scalar, _Flags, _StorageIndex>::Scalar& Eigen::SparseMatrix<_Scalar, _Flags, _StorageIndex>::insertBackByOuterInner(Eigen::Index, Eigen::Index) [with _Scalar = float; int _Options = 1; _Index = int; Eigen::SparseMatrix<_Scalar, _Flags, _StorageIndex>::Scalar = float; Eigen::Index = long int]: Assertion `Index(m_outerIndex[outer+1]) == m_data.size() && "Invalid ordered insertion (invalid outer index)"' failed.
```

データの投入は``startVec``と``insertBack``、``finalize``を使うことにより高速に行うことができます。

```c++
#include <iostream>

#include <Eigen/Core>
#include <Eigen/Sparse>

using namespace Eigen;

int main() {

  size_t max_doc_id = 15000000;
  size_t max_term_id = 600000;
  size_t n_non_zero_values = max_doc_id * max_term_id / 10;

  SparseMatrix<float, Eigen::RowMajor, int64_t> smat(max_term_id, max_doc_id);
  smat.reserve(n_non_zero_values);
  for (size_t i = 0; i < max_term_id; i++){
    smat.startVec(i);
    std::cout << i << std::endl;
    for (size_t j = 0; j < max_doc_id; j += 10){
      smat.insertBack(i, j) = 0.1;
    }
  }
  smat.finalize();
}
```
SmartWatch3にインストールしたアプリを削除する


## はじめに

最近になり健康のためにアクティビティを記録するようになって、ようやくSmartWatch3を買ってよかったと思っているところ。

何の気なしに端末のメニューをみていたら、だいぶ昔に自分で開発したアプリが放置されてることに気づいた。使わないものを取っておいてもしょうがないので消そうとおもったら、「消す方法がないじゃん！」となりまして...

## インストールしたアプリのパッケージ名がわかっている場合

USBでSmartWatch3とMacBookを繋いでターミナルから`adb uninstall [package name]`コマンドを使う。

```
 $ adb uninstall com.example.myapplication
```

## SmartWatch3にインストールされているアプリを調べるには

パッケージ名を覚えてない場合は、下記コマンドでインストール済みのアプリ（パッケージ）の一覧を取得することができる。

```
 # インストール済みパッケージ一覧を取得
 $ adb shell 'pm list packages -f'

 # パッケージ名を指定してアンインストール
 $ adb uninstall com.example.myapplication
 
```

## ちなみにadbコマンドの場所

MacでAndroid Studioをインストールしている場合は、`~/Library/Android/sdk/platform-tools/adb`
Bootstrap4-alpha4を自分用に使いやすく設定

# Bootstrap4-alpha4を自分用に使いやすく設定しました
https://github.com/akiraizutsu/Bootstrap4-alpha4

## ファイル構成

``` bash
Bootstrap4-alpha4
└── dev
    └── scss
        ├── _bootstrap.scss（bowerのbootstrapを読み込み）
        ├── _bootstrap-variables.scss（bootstrapの変数を変更）
        └── style.scss（各scssファイルを読み込み、../css/にコンパイルします）
```

Bootstrap自体はBowerで読み込ませて、作業ディレクトリ内の/scss/に

- Bootstrap読み込み用scss
- variables変更用scss

を設置しています。

### FlexBoxグリッドを利用できるようにしています

_variables.scssの42行目辺りにある「Options」の$enable-flexを初期値のfalseからtrueに変えるとFlexBoxグリッドが利用できるようになります。

例に習って/dev/scss/の_bootstrap-variables.scssを変更しています。
iruby (jupyter) でrubyのバージョンを切り替える手順

iRuby(Jupyter上で動くruby)を利用する際にRubyのバージョンを切り替える手順について

# 動作環境

MacOS ElCapitan
IRuby 0.2.9

# 手順

jupyterにkernelとして登録されているirubyはjupyterにはフルパスで登録されるので、rbenvなどでrubyを切り替えても追従しない。
jupyterに新しいバージョンのrubyを登録する必要がある。

```shell-session
rbenv local 2.3.1   # 新しいバージョンのrubyへの切り替え。このバージョンでirubyはすでにインストール済みとする
```

![image](https://qiita-image-store.s3.amazonaws.com/0/28792/a414a732-97a6-7ecc-5efa-8f3e31b6f1f4.png)
この状態ではkernelに登録されているRubyのバージョンは変わっていない。

```shell-session
iruby register --force   # 新しいバージョンへ切り替わる
jupyter kernelspec install ~/.ipython/kernels/ruby
iruby notebook           # jupyterを起動
```

![image](https://qiita-image-store.s3.amazonaws.com/0/28792/ce98c206-ac17-f913-5f44-0dcc8032b7af.png)


ちなみに初めて `iruby notebook` を起動する時に、その時点のRubyがkernelとして登録される。

# 何が起きているか？

irubyのソースを読んでみる。
`iruby`コマンドを実行した際の処理のコードは以下の場所にある。

https://github.com/SciRuby/iruby/blob/v0.2.9/lib/iruby/command.rb#L116

`register_kernel`メソッド内でRubyのパスを書いたjsonファイルを作成し、`~/.ipython/kernels/ruby/kernel.json`に保存している。

jupyterはkernelの情報を`jupyter --path`で表示されるパスから読んでいる。
2016年9月現在、jupyter 4.1.1ではkernelの情報を "~/.ipython" 以下ではなく "~/Library/Jupyter"から読む。
おそらくiruby 0.2.9は昔のjupyterの仕様を想定しているため、kernel情報を"~/.ipython"以下に書き出すのだが、最新のjupyterではそのパスは認識されない。
そのため、`jupyter kernelspec`コマンドで"~/.ipython"のパスをkernelとして登録している。
javascriptでtextboxをbodyにしてメーラ起動する

# htmlのtextboxの内容を、javascriptでメーラ起動する

システムからメールを送るのではなく、ユーザのメーラで送るようにするためにやってみた。
hrefのリンクだとtarget _blankつければいいけど、javascriptなので、window.openにする。



```html
<script type="text/javascript">
  function logsend()
  {
    mail = "メールアドレス"
    title = "メール件名"
    text = document.getElementById('id_textbox').value
    window.open().location.href = "mailto:" + mail + "?subject=" + title + "&body=" + text;
   }
</script>
```

```html
<input type="text" id="id_textbox">
```
linux > link > 6万ミリ秒でできるLinuxパフォーマンス分析 / Linux Performance Analysis in 60,000 Milliseconds

以下を見つけた。

6万ミリ秒でできるLinuxパフォーマンス分析
https://yakst.com/ja/posts/3601

元記事は
http://techblog.netflix.com/2015/11/linux-performance-analysis-in-60s.html
破損したSQLiteのファイルを修復する

#概要

- Adobe AIR製のWindowsアプリのデータ保存にSQLiteを使用していたら、データ容量が異様に肥大化している事案が発生（通常の10倍くらいに！）
- SQLite Browser（ http://sqlitebrowser.org/ ）で開くとデータが表示できない。
- PupSQLite（ http://www.vector.co.jp/soft/winnt/business/se449564.html ）で開くといくつかのテーブルで「database disk image is malformed」エラー
- どうやら、データが破損しているらしい！

#データ修復
SQLite本家からコマンドラインツールを取得
http://www.sqlite.org/download.html
いろいろあるが、Windowsなら「sqlite-tools-win32-x86-3140200.zip」をダウンロードする。
※記事作成時点の最新ファイル名なので、そのときの最新版を入手してください。

ファイルを展開し、コマンドプロンプト（またはPowerShell）で該当フォルダ―までたどり着き、以下コマンドを実行

```
sqlite3 mydata.db .dump | sqlite3 mydata_new.db
```

上記で　無事データ修復できました。
必ず修復できるわけではないと思いますが、どなたかの参考となれば。


##参考
http://q.hatena.ne.jp/1258638989
http://taichino.com/engineer-life/database/4123
技術英語 > a programmer might [balance] the evil of the goto [against] the headache of duplicate-code maintenance ... / strike a good balance between work and play

@ Code Complete (No. 13305 / 36077)

> a programmer might <font color=red>balance</font> the evil of the goto <font color=red>against</font> the headache of duplicate-code maintenance ...

<hr>
関連して思い出したのは

> strike a good balance between work and play

http://qiita.com/7of9/items/48e6b471d49810439ff6

最近は「遊ぶの定義」が「小さなプロジェクトを遂行して将来のトラブル回避の対策をする」、になっているのでworkとplayの領域があいまいだ。
laravelでUser.phpの格納先を移動したら認証機能でエラーが発生した時の対処(エラー対処の勉強にもなった)

■背景
・デフォルトのUser.phpの格納場所をapp/DataAccess/Eloquent/User.phpに変更
(書籍に沿ってこうした)
・laravelで認証機能を実装
・会員登録が上手くいくところまで確認
・会員登録後の画面を作っておらず、会員登録後も「会員登録」ボタンが表示されたままに
・「会員登録」ボタンをクリックして/registerにアクセスするとエラーが発生
（おそらく裏で、認証済みの場合はTOPページにリダイレクトする処理が走っていたが、途中でエラーが発生したらしい）

■エラー内容
・EloquentUserProvider.phpでApp\Userモデルが見つからない！という内容

■原因
・明らかにUser.phpを移動したこと

■対処
・どこかでApp\UserをApp\DataAccess\Eloquent\Userに書き換えるが、どこを書き換えればいいかわからない

■やってみたこと
・まずroute.phpからEloquentUserProvider.phpまでどうつながっているか目視で見ていった
　（数時間かかった）
・途中でファイルを検索する際にlaravel.logの存在に気づく
・laravel.logを見ればどういう経緯でEloquentUserProvider.phpまできたかソッコーわかった
・logを見るのって大事だと思った
・logを見てやはりcreateModelメソッドでApp\Userが読み込まれていることが原因だとわかったが、
 どこを変えればいいかわからない
・cloud9のFind in FilesでApp\Userで検索したら4件ヒット
・全部変更したらエラー解消

■まとめ
・機能の流れを見るためにもlaravel.logはからなず見ること
・デフォルトファイルのフォルダを移動した際は関連するところはすべて変更するその時Find in Filesを使うと便利
OpenCVとPythonで画像の自動補間（Fast Marching Method, Navier-Stokes）

# はじめに
　スキャンされた写真からごみや傷を除去したり，静止画や動画から不要な物体を削除したりするというのをOpenCVとPythonを使ってプログラムでやってみます。

今回は、電線を消してみます。

**◎ 入力画像**
![img.jpg](https://qiita-image-store.s3.amazonaws.com/0/107056/fb7164e5-a681-6ff5-aa67-c8e3b11a4bf3.jpeg)

**◎ マスク**
![mask.jpg](https://qiita-image-store.s3.amazonaws.com/0/107056/3cf3a9df-1225-0042-ddd8-8a5b204bb0bb.jpeg)

**◎ 結果**
![result.jpg](https://qiita-image-store.s3.amazonaws.com/0/107056/a942b74a-be6b-bf25-02c6-3493a870d15a.jpeg)


# cv2.inpaint
`inpaint(src, inpaintMask, inpaintRadius, flags[, dst]) -> dst`

入力画像にマスクを適用し、マスク部分をマスク境界周囲の画像をもとに内側に向かって補間してくれます。

+ **src** - 入力画像．8ビット，1あるいは3チャンネル．
+ **inpaintMask** - マスク．8ビット，1チャンネルの修復マスク．非0のピクセルが，修復が必要な領域を表します．
+ **inpaintRadius** - 修復される各点を中心とする近傍円形領域の半径．この領域が，アルゴリズムに考慮されます．
+ **flags** - 修復手法．以下のいずれかです：
    - **INPAINT_NS** - ナビエ・ストークス（Navier-Stokes）ベースの手法．
    - **INPAINT_TELEA** - Alexandru Telea による手法.

# プログラム

```inpaint.py
# -*- coding: utf-8 -*-

import cv2

# オリジナル画像
img = cv2.imread('img.jpg')
# マスク
mask = cv2.imread('mask.png',0)

# 画像補正
dst = cv2.inpaint(img, mask, 3, cv2.INPAINT_TELEA)
#dst = cv2.inpaint(img, mask, 3, cv2.INPAINT_NS)

# 表示
cv2.imshow('dst',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

# 保存
cv2.imwrite('result.jpg', dst)
```

OpenCV : 3.1.0
Python : 3.5.2

OpenCVとPython環境の構築は、こちらを参考にしてください。（[リンク](http://qiita.com/olympic2020/items/d5d475a446ec9c73261e)）

# おわりに
　マスクの周囲のピクセルからマスク内の画素を補間していくため、マスクの周囲が比較的フラットな感じの画像だとうまくいきます。逆に、周囲が複雑なパターンだと、うまくいきません。
　マスクは、消したい部分をマスクしきれていないと、ノイズが現れます。また、マスクの形状に問題があると、マスク部分がすかしのように現れてしまうことがありました。

　PhotoShopでも同じような画像操作が可能ですが、手動で行うことになります。OpenCVを使えば、プログラムの中で行うことができるため、動画への適用も可能になってきます。プライバシー保護のため、動画内の人を自動的に抽出し、その部分を今回の方法で自動的に補完するようなことも使えそうです。
MongoDB 3.4でcollation（照合順序）を試してみた

MongoDB 3.4[^1]からcollation（照合順序）機能が追加された。
[^1]: 正確には開発版である3.3から。MongoDBのバージョンは、小数点以下第一位が奇数が開発版、偶数が安定板の扱い。

collationというのは、文字列を比較したりソートしたりするときに、言語特有のルールにしたがって比べられるようにするためのもの。MySQLやSQL Serverにも似たような機能がある。
### 日本語サポートは？
対応済み。
https://docs.mongodb.com/master/reference/collation-locales-defaults/#collation-languages-locales

内部でICU4Cを使っており、ICU 57.1で対応されているすべてのcollationに対応済みということらしい。

https://jira.mongodb.org/browse/SERVER-26072
> We now support all collations that are supported by ICU
57.1, except for aliases. See the SERVER ticket for a list
of the new locales. The exact ICU data files which we now
package into MongoDB is given by COLLATION_SOURCE in ICU
57.1's colfiles.mk.

### デフォルト
デフォルトは無指定（localeすら何も指定が無い状態）、すなわちsimple binary collationとなる。以前のバージョンと同じ。

### 設定タイミング
collection作成時、index作成時、さらに、find()など各CRUD系メソッド、aggregateなどに対して設定可能。
https://docs.mongodb.com/master/reference/collation/#operations-that-support-collation

collectionに対して設定しておくと、indexや各メソッドでは、別途指定がない限り、collectionでの設定がそのまま適用される。

### Collation Document（設定パラメータ）
collationは、単にlocaleを指定できるだけではなく、以下の8つのパラメータを使うことができる。このまとまりをCollation Documentという。localeだけが必須で、他は任意。

```
{
   locale: <string>,
   caseLevel: <boolean>,
   caseFirst: <string>,
   strength: <int>,
   numericOrdering: <boolean>,
   alternate: <string>,
   maxVariable: <string>,
   backwards: <boolean>
}
```

#### strength (Comparison Level)
比較のレベル。アクセントのありなしまで考慮して比べるか、大文字小文字の区別までするか、など。デフォルトは3（文字の違い、アクセントありなし、大文字小文字まで区別）
https://docs.mongodb.com/manual/release-notes/3.3-dev-series-collation/#collation-option
http://userguide.icu-project.org/collation/concepts#TOC-Comparison-Levels

##### strength 4
日本語の場合4が重要のようで、ひらがな＜カタカナとするためには4を指定する必要がありそうなことが書いてある。
http://userguide.icu-project.org/collation/concepts#TOC-Comparison-Levels
> Hiragana symbols are given smaller values than Katakana symbols on quaternary level, thus causing Hiragana sequences to sort before corresponding Katakana sequences.

### 'ハハ'='パパ' 問題
ぱっと見うまくいってそうだったけどログ取ってないので後で書く。
MySQLのutf8_unicode_ciでの問題はlevel 1までしか実装していないことが原因らしいので、Mongoが全レベル実装できているとすれば問題ないはずと期待したい。

### 寿司ビール問題
これも後で。

ひとまず。
BEMについてのメモ

調べればいくらでも記事は出てくるが自分用に整理する。
間違ったこと書いてたら遠慮なく突っ込んで下さい。

## BEMについて  
BEMは、Yandexという会社のフロントエンドチームが考えた開発手法で
- Block
- Element
- Modifier
の頭文字を取ったもの。

### Block要素
BEMはこのBlockを基点にして命名される

### Element
Blockを構成する要素。
Blockに対するElementってことで `__`でつなぐ。

### Modifier
BlockまたはElementのバリエーション違い、状態変化的なもの。
Modifierの関係にある場合は `--`でつなぐ。
`active`とかを付与するときは`_`でつなぐ。
`element`や`modifier`が2つ以上の単語で構成されるときは、`-`でつなぐ。

以下例

```html:html
<div class="block">
	<div class="block__element"></div>
	<div class="block__element block__element--modifier"></div>
</div>
<div class="block block--modifier">
	<div class="block--modifier__element"></div>
</div>
```

```css:css

.block{
	width: 100px;
}

.block__element{
	background: #fff;
}

.block__element--modifier{
	background: #ddd;
}

.block--modifier{
	width: 150px;
}

.block--modifier__element{
	background: #f2f2f2;
}

```
のような感じになる。

## BEMのデメリット

- 先程書いたhtmlやcssを見ると、class名が長くなってしまう  
- 記述の仕方が独特なので、初見は気持ち悪さでいっぱいになる。 
(アンスコ2つでつないだり、ハイフン2つでつないだり、ハイフン1つだったり何やねん....)

1点目に関しては、`block`の名前を分かりやすく、かつ簡潔に書くことで解決できるかと。
(省略のしすぎは良くない。)
2点目に関しては、慣れ。

## BEMのメリット
- 再利用性が高い
- 拡張性が高い
- メンテナンス性が高い


### 再利用性が高い
`block`は独立した存在であり、スタイリングの基点になるので、コンテキスト(親要素のhtmlエレメントなど)に依存しない。
なのでページのどこに置いても基本的にはその機能を保つことができる。(他のcssに汚染されない)

### 拡張性が高い
開発が終了し、運用フェーズの段階で新たに色を変更する、幅を変更する必要が出てきた場合に`modifier`を付与することでバリエーションを増やすことが可能。

### メンテナンス性が高い
これは1つめのものと被るかもしれないが、`block`は独立しているものなので使い回すことが可能。
また、後からプロジェクトに参加した人でもhtmlのclass名を見るだけで、スタイルが予測しやすい。
最初に`block`を作成してしまえば、あとは`block`の組み合わせだけで新しいページを作成することも可能になる。
大規模なサイトになればなるほど、このメリットは大きくなると思う。

## BEMを楽に書く
class名が長くなるのがデメリットだけれども、`Emmet`や`Sass`,`Stylus`を使えば、そこまで苦にならないはず。
`Emmet`のBEMフィルタなんかは若干癖があるので全部をカバーはできないかもしれないが

```html:html(emmet)

.block>._element+._element--modifier|bem
.block.block--modifier>.block--modifier__element

```
htmlはこんな感じで展開すれば先に記述したhtmlと同一のものになる。
(もっと簡潔に書けるかもしれないが、bemフィルターが思い通りの出力をしてくれなかったので断念 orz)  

先程のcssはsassを使用すると

```scss:scss
.block{
	width: 100px;

	&__element{
		background: #fff;

		&--modifier{
			background: #ddd;
		}
	}

	&--modifier{
		width: 150px;

		&__element{
			background: #f2f2f2;
		}
	}

}
```

のような感じで、特に`@extend`とかを使用せずともスタイルを継承出来るので楽になる。
BEMとSassは相性イイネ。
厳密にBEMの命名規則にこだわる必要はないとは思うけれども、命名規則の参考になるのではないかと。

## 課題
`Bootstrap`の命名規則はBEMではなくOOCSSを基準にしているので命名規則をBEMとした場合、htmlのclassにBEMとOOCSSの命名規則が混在することになるのでちょっと気持ち悪くなる。これのベストな解決策はまだ模索中。

とは言いつつ、bootstrapは`col-xs`などのグリッド関係のclassや、`container`、`form`系のclassしか使わないので、
逆に命名規則が違うことで見分けがついて良いのかなーと思っている。そこまで気にしていない。
前は`btn`や`nav`なども頻繁に使用していたが、最近はこの辺もゴリゴリカスタマイズするようなデザインが多いので、
逆に`bootstrap`側のスタイリングを殺すのが大変なので自分で書いてしまっている。

また、`element_active`のようなものも、別に`active`だけで使用してもsassで入れ子で書くなり、&でつなげて書くなりすれば
他の部分を汚染するようなこともないと思います。むしろ、jsとかでいじるclassに`js-hogehoge`とか`is-active`みたいなclassを付けたほうがhtml側で判断がつくので、それはそれでいいのかなーなんて思っています。
Haskell 2010 予約語一覧

# Haskell 2010 予約語一覧

- case
- class
- data
- default
- deriving
- do
- else
- foreign
- if
- import
- in
- infix
- infixl
- infixr
- instance
- let
- module
- newtype
- of
- then
- type
- where
- _

[参考](https://www.haskell.org/onlinereport/haskell2010/haskellch2.html#TBL-4)