OmniAICreator/Qiita-1.07M huggingface dataset:
MathJax サンプル


## MathJaxとは

数式をウェブブラウザ上で表示するためのJavascriptライブラリ



## Vimで使うには


`~/.vim/bundle/previm/preview/index.html` の `<head>` に以下のタグを追加する。

```
<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
```


`~/.vim/bundle/previm/preview/js/previm.js` の `loadPreview` 関数を次のように変更する

前

```
if (needReload && (typeof getContent === 'function') && (typeof getFileType === 'function')) {
    _doc.getElementById('preview').innerHTML = transform(getFileType(), getContent());
    autoScroll('body');
}
```

後

```
if (needReload && (typeof getContent === 'function') && (typeof getFileType === 'function')) {
    _doc.getElementById('preview').innerHTML = transform(getFileType(), getContent());
    (+) MathJax.Hub.Config({ tex2jax: { inlineMath: [['$','$'], ["\\(","\\)"]] } });
    (+) MathJax.Hub.Queue(["Typeset",MathJax.Hub]);
    autoScroll('body');
}
```

## Qiitaで使うには

`math`コードブロックを作り、その中に数式を書いていく。

```
```math
数式1
数式2
```


## サンプル

### 上付き、下付き文字

```
x^2
```

```math
x^2
```

```
x_2
```

```math
x_2
```

### 分数

```
\frac{1}{x}
```

```math
\frac{1}{x}
```

### 指数

```
x^2
```

```math
x^2
```

### 平方根(ルート)

```
\sqrt{x}
```

```math
\sqrt{x}
```

### 円周率

```
\pi
```

```math
\pi
```

### ベクトル

```
\vec{a} = (a_1, a_2, \cdots, a_n)
```

```math
\vec{a} = (a_1, a_2, \cdots, a_n)
```

### 行列

```
A = \left(
    \begin{array}{ccc}
      1 & 2 & 3 \\
      4 & 5 & 6 \\
      7 & 8 & 9
    \end{array}
  \right)\\
A^T
```

```math
A = \left(
    \begin{array}{ccc}
      1 & 2 & 3 \\
      4 & 5 & 6 \\
      7 & 8 & 9
    \end{array}
  \right)\\
A^T
```

### シグマ

```
\sum_{n=1}^{100} x^2 \\
\sum_{n=1}^\infty\frac{1}{n^2}=\frac1{1^2}+\frac1{2^2}+\frac1{3^2}+\frac1{4^2}+\frac1{5^2}+\cdots
```

```math
\sum_{n=1}^{100} x^2 \\
\sum_{n=1}^\infty\frac{1}{n^2}=\frac1{1^2}+\frac1{2^2}+\frac1{3^2}+\frac1{4^2}+\frac1{5^2}+\cdots
```

### 微分

```
\frac{dy}{dx}　\\
\frac{(d^2y)}{dx^2}
```

```math
\frac{dy}{dx} \\
\frac{(d^2y)}{dx^2}
```

### 積分

```
\int f(x)dx \\
\int_1^\infty \frac{1}{x^2}dx
```

```math
\int f(x)dx \\
\int_1^\infty \frac{1}{x^2}dx
```

### 極限

```
\lim_{x \to \infty} f(x)
```

```math
\lim_{x \to \infty} f(x)
```

### 角度

```
180^\circ
```

```math
180^\circ
```

### 対数

```
log_e(x)
```

```math
log_e(x)
```

### 不等式

```
x\neq 0 \\
1 < x \\
1 \leq x \\
100 > x \\
100 \ge x \\
\alpha \sim 1 \\
\beta \simeq 0 \\
\gamma \approx 10
```

```math
x\neq 0 \\
1 < x \\
1 \leq x \\
100 > x \\
100 \ge x \\
\alpha \sim 1 \\
\beta \simeq 0 \\
\gamma \approx 10
```

### その他

オイラーの公式

```
e^{i\theta}=\cos\theta+i\sin\theta
```

```math
e^{i\theta}=\cos\theta+i\sin\theta
```

## 参考サイト

[Vim で Markdown を使って数学の板書を取ってフル単する](http://sekai013.hatenablog.com/entry/2014/10/03/005553)
[QiitaでTeX記法が使えることをご存知ですか？](http://blog.qiita.com/post/76297476951/beautiful-formula-with-tex)
[LaTeXコマンド集](http://www.latex-cmd.com/)
[WEB数式 MathJax](http://www.yamamo10.jp/yamamoto/comp/WEB/MathJax/index.php)
改行っぽいものすべてにマッチする正規表現

こんな改行コードがばらばらなテキストがあったとき、

```ruby
str = "A\r\nB\rC\nD"
```

いままで次のようにがんばってマッチさせていましたが、

```ruby
str.gsub(/\r\n|\r|\n/, "<br/>")     # => "A<br/>B<br/>C<br/>D"
```

`\R` だけでよかったと知りました。

```ruby
str.gsub(/\R/, "<br/>")             # => "A<br/>B<br/>C<br/>D"
```

`\R` は、広い範囲で、改行になる文字すべてにマッチしてくれるので、`<br/>` に変換したい場合などはなおさら `\R` でいいように思いました。

# 参照

正規表現
http://docs.ruby-lang.org/ja/2.1.0/doc/spec=2fregexp.html
よく使うCSS小技まとめ(IE8〜)

個人的によく使うので備忘録。
随時更新予定！

# 画像系
## 画像を中央に表示

```html
<div class="wrap">
  <img src="http://placekitten.com/g/500/600" alt="">
</div>
```

```css
html,body{
  width: 100%;
  height: 100%;
  margin: 0;
}
.wrap{
  position: relative;
  width: 100%;
  height: 100%;
}
.wrap img{
  position:absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  margin: auto;
}
```

[DEMO](http://jsfiddle.net/ymmt89/7pv3da24/)

# clearfix系
## `:after`でclearfix
`overflow:hidden;`が使えないときに便利。

```css
.fl_wrap:after{
  content: "";
  clear: both;
  display: block;
}
```

[DEMO](http://jsfiddle.net/ymmt89/fn8zx2ew/)

# レスポンシブ系
## レスポンシブっぽく要素を横並びさせたい
※`margin`が効かないので`padding`で調整する必要がある。

```html
<div class="wrap">
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
</div>
```

```css
.wrap{
  width: 100%;
  display: table;
}
.wrap .item{
  display: table-cell;
}
```

[DEMO](http://jsfiddle.net/ymmt89/tz0obb6r/)
EC-CUBE3をインストールしてみよう(windows+xampp編)

ついにリリースされた[EC-CUBE3](http://www.ec-cube.net/product/info_3.php)
Windows環境にxamppを使ってインストールしてみました。

_※ご注意：xamppはシステム要件の対象ではないので、動作確認用途でご利用下さいませ。_

# 環境構築

## Xamppのダウンロード
 
version 5.6.8を使います。以下からダウンロードできます。

http://sourceforge.net/projects/xampp/files/XAMPP%20Windows/5.6.8/xampp-win32-5.6.8-0-VC11.zip/download


ダウンロードが完了したら、解凍し、Cドライブ直下に設置します。
`c:\xampp`となるように設置してください。

## phpの設定

php.iniを編集し、必要な設定を行います。

php.iniは`C:\xampp\php\php.ini`を編集します。

### timezone

timezoneをAsia/Tokyoに変更します。

```
;date.timezone = Europe/Berlin
date.timezone = Asia/Tokyo
```

### 拡張モジュール

コメントアウトされている、以下の拡張を有効にします。

```
extension=php_fileinfo.dll
extension=php_pdo_pgsql.dll
extension=php_pgsql.dll
extension=php_openssl.dll
```

編集が完了したら保存しましょう。

## xamppの起動確認

`C:\xampp\xampp-control.exe`を実行し、起動します、

ApacheとMySQLのStartボタンを押し、グリーンに変われば成功です。

http://localhost/xampp/

にアクセスすると、ウェルカムページが表示されます。
言語は日本語を選んで下さい。

# EC-CUBE3のインストール

## データベースの準備

事前にデータベースの作成が必要なので、phpMyAdminで作成します。
http://localhost/phpmyadmin/ でアクセスできます。

以下内容で作成します。

```
データベース名：eccube3_db
ユーザ名：eccube3_db_user
パスワード:password
```

* データベースの作成

```
データベース名：eccube3_db
照合順序：utf8_general_ci
```

* ユーザの作成

```
ログイン情報
  User name：eccube3_db_user
  Host:127.0.0.1 
  パスワード:password
グローバル特権
  すべてチェックする
```

## EC-CUBE3のダウンロード、設置

EC-CUBE公式サイトから、パッケージをダウンロードしてください。

[EC-CUBEダウンロード](http://www.ec-cube.net/download/#dl_anchor)

`zip形式`のものをダウンロードします。

ダウンロードしたら、解凍して以下に設置します。

`C:\xampp\htdocs\eccube-3.0.0`

## EC-CUBE3のインストール

これで準備は完了。
以下にアクセスすると、EC-CUBEのインストール画面が表示されます。

http://localhost/eccube-3.0.0/html/admin/install.php

必要な情報を入力し、インストールを進めましょう。
最後まで完了したら、EC-CUBE3を動かせます！


## 最後に

EC-CUBE3はGitHubで開発を行っています。
不具合のご報告や開発のご協力など、ぜひぜひお待ちしています！

https://github.com/EC-CUBE/ec-cube
ActiveAdmin で大きなデータを扱うときは has_many <=> belongs_to に注意しよう

今回は [ActiveAdmin](https://github.com/activeadmin/activeadmin) である程度大きなデータを扱う際に気をつけるべきことと、その対策について書いてみたいと思います。

## ステージング環境では快適に動いているのに本番環境では動かない・・・！？

ActiveAdmin がステージング環境では快適に動いているのに本番環境では重すぎて使い物にならない・・・なんてことに遭遇したことはありませんか？これは ActiveAdmin の性質上、割りと発生しがちな問題だったりします。

## 原因は ActiveAdmin が has_many <=> belongs_to の関係を解決しようとするから

ActiveAdmin は自動的に検索条件を付けてくれるのですが、そこでモデル同士のリレーションやカーディナリティを解決しようとします。その結果、たとえば利用者のブックマークを扱うようなシステム（user : boomark ＝ 1 : 多）があった場合、ブックマークの管理画面を開く時に users テーブルが全件検索されています。

それによって、ステージング環境では 100 人前後のユーザーしか登録されていないので特にパフォーマンス的な問題は発生しないが、本番環境では 10 万人とか 100 万人とかの利用者がいて、それに対して全件検索が走ることによって重すぎて途端に使い物にならなくなってしまう、という事象が発生してしまうのです。


### たとえば

こんな感じのテーブル構造になっていて

```rb:app/models/user.rb
class User < ActiveRecord::Base
  has_many :bookmarks
end
```
```rb:app/models/bookmark.rb
class Bookmark < ActiveRecord::Base
  belongs_to :user
end
```

| users |    | bookmarks |
|:-----:|:--:|:---------:|
| id    |    | id        |
| :     |    | user_id   |
| :     |    | :         |


ブックマークの管理画面を開くと検索条件に全ユーザーのセレクトボックスが登場。この裏では **`SELECT * FROM users`** という恐ろしいクエリが走っているのです。。。

![activeadmin_対処前.png](https://qiita-image-store.s3.amazonaws.com/0/39929/6c585e52-dcc3-b376-a459-258ec141675e.png)

## 解決策は？

前述のような全ユーザーのセレクトボックスが配置されても、10 万人や 100 万人の中から該当のユーザーを探し出すなんてことはできないので、(1) いっそのことそれを検索条件から省いてしまうか、(2) もしくは代替として id を指定して検索できるようにしてしまいましょう。

#### (1) 検索条件から省く

必要な項目のみ `filter` で定義してしまえば終了です。

```rb:app/admin/bookmarks.rb
ActiveAdmin.register Bookmark do
  filter :created_at
  filter :updated_at
end
```

![activeadmin_対処(1).png](https://qiita-image-store.s3.amazonaws.com/0/39929/413b6439-0023-315c-60f0-7e41e1dcbc9c.png)


#### (2) id を指定して検索できるようにする

検索条件として `user_id` を指定できるようにして、ActiveAdmin がモデルに探しにいく `user_id_contains` というメソッドを定義すれば終了です。

```rb:app/admin/bookmarks.rb
ActiveAdmin.register Bookmark do
  filter :user_id, as: :string, label: 'user id'
  filter :created_at
  filter :updated_at
end
```

```rb:app/models/bookmark.rb
class Bookmark < ActiveRecord::Base
  use_active_admin_contains_search(:user_id)
end
```

```rb:config/initializers/active_admin.rb
class ActiveRecord::Base
  def self.use_active_admin_contains_search(attr_name)
    scope "#{attr_name}_contains", ->(id_list) { where("#{attr_name} IN (?)", id_list.split(',').map(&:strip)) }
    search_methods "#{attr_name}_contains"
  end
end
```

![activeadmin_対処(2).png](https://qiita-image-store.s3.amazonaws.com/0/39929/da21662d-0726-42ed-f51f-612ca58622b2.png)

ここでは、その都度モデル側で `scope 〜 search_methods` を定義しなくていいように、それをひとまとめにした `use_active_admin_contains_search` というメソッドを定義、モデル側ではこれにカラムを指定してもらうだけにしました。また、id はカンマ区切りで複数指定できるように、かつカンマ周辺のスペースは取り除いて検索条件とするようにしました。


## まとめ

ActiveAdmin は色んなことを手早く実現させてくれて非常に便利なのですが、ある程度大きなデータを扱う際には注意が必要です。なんだか ActiveAdmin が重たいなと思ったときは `filter` を疑ってみましょう。
UIKit類似Frameworkを自作してみる

## iOS13以後

- Userにソース公開しない部分
アプリにマルチウィンド機能が追加されたのでApplicationはメンバにsceneDelegateを持つようになった。そいつを初期化するためのSceneDelegate.swiftファイルがプロジェクトに追加された。

```swift:main.swift
protocol ApplicationDelegate {                                                  
  func didFinishLaunchingWithOptions(a: Application) -> Bool
}
protocol SceneDelegate {                                                  
  func willConnectTo(ｓ: UIScene) -> Bool
}

class Application {
// ここで、プロトコルに従うクラスのインスタンスを用意する。
  var s: UIWindowScene?
  var delegate: ApplicationDelegate!
  var sceneDelegate: UIWindowSceneDelegate!

    func start() -> String {
      s = UIWindowScene()
      delegate.didFinishLaunchingWithOptions(self)
      sceneDelegate.willConnectTo(s)
    return "OK"
    }
    func statusBarHidden() -> Void {
      print("Hidden done")
    }
    func statusBarOrientation() -> Void {
      print("Rotation done")
    }
}

let application = Application()
application.delegate = AppDelegate() //entry point & run loop, この辺りはStoryboardが行う。
application.sceneDelegate = SceneDelegate()
application.start()
// applicationが自分のstatusBarHiddenその他メソッドを実行するチャンスを、
// AppDelegateのインスタンスへ与える
```
- Userが実装する部分

```swift:AppDelegate.swift
class AppDelegate: ApplicationDelegate {
  func didFinishLaunchingWithOptions(application: Application) -> Bool {
    application.statusBarOrientation()
    return true
  }
}
```
- 以下が追加、window変数がAppDelegate.swiftから移動

```swift:SceneDelegate.swift
class SceneDelegate: WindowSceneDelegate {
  var window: UIWindow?  // ここに移動                                      
  func willConnectTo(s: UIScene) -> Bool {
    // some window initialize procedure
    s.windows.insert(window, at: windows.startIndex)
    s.someMethod()
    return true
  }
}
```


## iOS12以前(iOS12含む)

- Userにソース公開しない部分

```swift:main.swift
protocol ApplicationDelegate {                                                  
  func didFinishLaunchingWithOptions(a: Application) -> Bool
}

class Application {
// ここで、プロトコルに従うクラスのインスタンスを用意する。
  var delegate: ApplicationDelegate!
    func start() -> String {
      delegate.didFinishLaunchingWithOptions(self)
    return "OK"
    }
    func statusBarHidden() -> Void {
      print("Hidden done")
    }
    func statusBarOrientation() -> Void {
      print("Rotation done")
    }
}

let application = Application()
application.delegate = AppDelegate()
application.start()
// applicationが自分のstatusBarHiddenその他メソッドを実行するチャンスを、
// AppDelegateのインスタンスへ与える
```

- Userが実装する部分

```swift:AppDelegate.swift
class AppDelegate: ApplicationDelegate {
  var window: UIWindow?                                        
  func didFinishLaunchingWithOptions(application: Application) -> Bool {
    application.statusBarOrientation()
    return true
  }
}
```
- コンパイル＆実行方法
【swiftcコマンドの引数に与えるソースの順番が重要！main.swiftは最後の引数にする。】

swiftc AppDelegate.swift main.swift
./main

*参考:*[プロトコルとデリゲートのとても簡単なサンプルについて](http://qiita.com/mochizukikotaro/items/a5bc60d92aa2d6fe52ca)

*編集履歴:*[2015/07/01 1st Manuscript]
*編集履歴:*[2020/04/27 revised for iOS13]
Redisのunixsocketperm

Redisの設定ファイルにある、ソケットのパーミッションの設定。
unixsocketperm 060
にしておくと、幸せになれると思います。

Redis用のグループ(例えばredis)を作っておいて、
redis-serverを、
chgrp redis redis-server
chmod g+sx redis-server
しておくと、redis-serverが、root:redisで動作するので、
redis.sockの所有者も、root:redisに。
※親フォルダのアクセス権も、適切に設定しましょう。
(さらっと書いていますが、かなり重要。)
※dump(AOF、rdb)、ログなども、root:redisになるので、
注意が必要です。

ーーーきりとりせんーーー
確認項目:　(uidも変えた場合は特に。)
設定ファイル、pid、sock、dump(AOF、rdb)、ログなど。
sockは、グループのアクセス権が重要。
他は、ユーザのアクセス権が重要。
起動まではroot:root、起動中はroot:redisなので、
親フォルダのアクセス権を設定する場合は要注意。
※AOFなどに書き込めない場合は、データ保護のため、
　redis-serverが終了できなくなります。
ーーーきりとりせんーーー

ここで登場するのが、unixsocketperm 。
redis.sockが、 ----rw---- root redis になるので、
/etc/groupの設定で、Nginxのグループ(例えばnginx)が、
redisグループにアクセスできるようにしておくと、
Redisがソケットを使っていても、
OpenRestyの、redis:connect()などで
Nginxからアクセスできるようになります。

以上、アクセス権を絞る方向で使うなら、
setGIDしてもいいよね・・という話題でした。


777でのsocket共有をなくそう。
ぼくがかんがえたさいきょうのスクロール追従メニュー


```jade:jade
.fixed
  p.pagetop
    a(href='#top')
      img(src='pagetop.gif', alt='トップへ戻る')
```

```coffeescript:coffee
$ ->
  wantToShow = 85

  $(window).scroll(()->
    percentage = $(this).scrollTop() / ($(document).height() - $(this).height()) * 100

    if percentage > wantToShow
      $('.fixed').addClass('is-active')
    else
      $('.fixed').removeClass('is-active')
  )
```

```scss:scss
$mouseover:.15s;

.fixed {
	@include transition(opacity, $mouseover, linear);
	@include opacity(0);
	position: fixed;
	right: 18px;
	bottom: 200px;
	z-index: -1;

	&.is-active {
		@include opacity(1);
		z-index: 1;
	}
}
```
Isomorphic ReactJS component

This component allows you to render isomorphically!.
The trick is in `defaultProps` and `componentDidMount` methods.

- On the server, it fetches initial data as default props.
- On client, it does nothing, but in `componentDidMount` method, it fetches the same data as the server side.

And you get isomorphic React component for free here!.


```
import React from 'react';
import AppState from '../stores/app-state'
class PostsList extends React.Component {
  constructor(props){
    super(props)
    this.state = {data: props.data}
  }
  componentDidMount(){
    AppState("/lists", (data) => {
      this.setState({data: data})
    })
  }
  render(){
    let y = this.state.data.map((x) => <div>{x.title}</div>)
    return (
      <div>
        <p>Posts List </p>
        {y}
      </div>
    )
  }
}
 
PostsList.contextTypes = {
  router: React.PropTypes.func.isRequired
}
PostsList.propTypes = {
  data: React.PropTypes.array.isRequired
}
if (typeof window === 'undefined'){
  AppState("/lists", (data) => {
      PostsList.defaultProps = {data: data}
  })
} else {
  PostsList.defaultProps = {data: []}
}
 
 
export default PostsList;
```

You can checkout full book [here](https://www.gitbook.com/book/checkraiser/frp-on-node-js/details)
Nginxのビルド時の、LuaJIT有効化の設定

export LUAJIT_LIB=/path/to/lib
export LUAJIT_INC=/path/to/include

この設定が入っていないと、LuaJITが有効にならないようです。
--with-cc-optの-Iオプションや、--with-ld-optの-Lオプションで指定したから大丈夫と油断していたら・・

ちなみに、LuaJITが有効になっていない時の症状は、こんな感じです。
(openresty相当のモジュールを併用しています。)

・LuaJIT: 読めない
luajit -b src.lua dst.luac　として、
content_by_lua_file dst.luac;　とすると、
nginxのerror.logに、bad byte-code header・・・と表示されます。

・Lua: 読める
luac -o dst.luac src.lua　とすると、
正常に表示されます。


逆に、LuaJITが有効になっている場合。
・LuaJIT: 読める
・Lua: 読めない(・・はず。JITの方が読めたので、試してません。)


ちなみに、LuaJITが有効の場合と無効の場合を比較してみると、
処理速度が(ものすごく、ざっくりですが)倍くらいになるので、
遅い設定になっていないか、試してみるとよいかもしれません。


exportした変数での情報共有をやめよう　　と、ものすごく書きたい衝動が。
[Rails 4.x] migration時に、TypeError: superclass mismatch for class User が発生した

# 環境

- rails: 4.2.0
- rake: 10.4.2
- ruby: 2.2.1

# 症状

ふとmigrationしたら、こんなエラーが出現。

```rb
$ rake db:migrate --trace
** Invoke db:migrate:reset (first_time)
** Invoke db:drop (first_time)
** Invoke db:load_config (first_time)
** Execute db:load_config
** Execute db:drop
** Invoke db:create (first_time)
** Invoke db:load_config 
** Execute db:create
** Invoke db:migrate (first_time)
** Invoke environment (first_time)
** Execute environment
** Invoke db:load_config 
** Execute db:migrate
rake aborted!
TypeError: superclass mismatch for class User
/Users/hoge/db/migrate/20150111111111_user.rb:1:in `<top (required)>'
```

# 問題点

Migrationのクラス名が他のクラス名と被っている？
今回の場合はモデル名。

# 対応

Migrationのクラス名を変更。
今回の場合は、何故か db/migrate/20150111111111_user.rb になっているので、userのところをcreate_userにして、中のクラス名も変更。

```rb
class User < ActiveRecord::Migration
↓↓
class CreateUser < ActiveRecord::Migration
```

以上で通るようになりました。

# 反省

- 命名やmigrationファイル作成に関するヒューマンエラーは、規則を徹底しておいた方が良さそうです。
- なぜ急にエラーが起きたのかわからない。。。rake のバージョンが上がったのか？
- 同様の問題に直面した他の方の記事ではproduction環境のみで起きたとかありましたが、今回は全環境でおきた。なぜ？

なぜこれまでエラーが吐かれなかったかは、わからないですが、そもそもエラーをなくすための処置をちゃんととっていけば問題ないですね。

# Refereces

- http://u16suzu.hatenablog.com/entry/2013/06/27/015356
動画からアニメーションGIFを高品質に素早く生成する

何年も悩んでいたけど最終的にこれに落ち着いた。

``` bash
ffmpeg -i input.mp4 -r 10 -f image2pipe -vcodec ppm - \
  | convert -layers Optimize - gif:- \
  | gifsicle -O3 --multifile - > output.gif
```
https://github.com/uiureo/videotogif
ffmpeg, imagemagick, gifsicleが必要。

ffmpegだけでもgif生成できるけどノイズがひどいので、imagemagickを使って減色処理をして、できたGIFをgifsicleを使って圧縮してファイル容量を削減している。

pipeしているので中間ファイルができなくて変なことを考える必要がない。

## 参考
https://gist.github.com/dergachev/4627207
MongodbでTTLを設定する

## 初めに
MongoDBで追加したRecordにTTLを設定したい場合には、[expireAfterSeconds](http://docs.mongodb.org/manual/core/index-ttl/)のOptionでIndexを作ってあげると良いのですが、nodeからmongoを操作する時に(一部ハマったのと)ずばり参考になるCodeが無かったので、ご参考までにCodeをチラシの裏しておきます。

* nodeからMongoDBへのアクセスは、`mongodb`を使っています(`mongoose`では無いです)
* node上でSchedule jobを動かすのに[node-schedule](https://github.com/tejasmanohar/node-schedule/wiki)を使っています。`npm install node-schedule --save-dev`とかで入れておいて下さい

## Node Sample Code
Sample codeのnodeの処理内容は、以下の2つです。1分毎にmongoに追加されるRecordのTTLは90秒なので、2分後には消えている事が確認できます。

* mongoのRecordに90秒のTTLを持つ様に設定する
* nodeのschedule jobで、mongoに対して1分毎に`新しいRecordを1件追加`と`過去の5件のRecordを表示`を行う

補足事項

* coffeescriptで書いています、javascript版は[javascript/coffee converter](http://js2.coffee/)とかで変換してください
* `dbName`, `collectionName`, `mongoURL`はお使いの環境に合わせて下さい
* ` expireAfterSeconds: 90`で、`ttl_date`の日付から90秒経つと、recordが削除される設定をしています
* `schedule.scheduleJob('*/1 * * * *',`で1分毎にjobを走らせています、表記方法はcronと同様です。
* jobの内容は、 
  - `objectToRegister`というrecordを1分毎にcollectionにincertする
  - `query_date: -1`でsortした最新5件のrecordを表示する
* 微妙にcallback hellしていますが、promise等で適宜refactorして下さい
* 以下fileをjs変換して、`app.js`等で`schedulejob = require('./routes/schedule')`と読み込んであげると、1分毎にjobが走ります

```coffeescript:routes/schedule.coffee
express = require('express')
schedule = require('node-schedule')
mongodb = require('mongodb')
router = express.Router()

dbName = 'DB_Name'
collectionName = 'Collection_Name'

mongoURL = process.env.MONGO_HOST or 'localhost:27017'
mongodb.MongoClient.connect 'mongodb://' + mongoURL + '/' + dbName, (error, database) ->
  collection = database.collection(collectionName)
  collection.createIndex { 'ttl_date': 1 }, { expireAfterSeconds: 90 }, (error, items) ->
    if error
      console.log error

## execute job every 1 minutes
j = schedule.scheduleJob('*/1 * * * *', ->
  mongodb.MongoClient.connect 'mongodb://' + mongoURL + '/' + dbName, (error, database) ->
    collection = database.collection(collectionName)

    dateString = getDateString(new Date)
    objectToRegister = {"query_date": dateString, "ttl_date": new Date, "query_key": "hoge" + dateString}
    console.log "Incert object : " + JSON.stringify(objectToRegister)

    collection.insert objectToRegister, (error, item) ->
      if error
        console.log error
      else
        collection.find().sort(query_date: -1).limit(5).toArray (error, items) ->
          if error
            console.log error
          else
            console.log "=== Last 5 items ==="
            for item in items
              console.log JSON.stringify(item)
)

getDateString = (dateInfo) ->
  year = String(dateInfo.getFullYear())
  month = dateInfo.getMonth() + 1
  if (month < 10)
    month = '0' + month
  day =  dateInfo.getDate()
  if (day < 10)
    day = '0' + day
  hour =  dateInfo.getHours()
  if (hour < 10)
    hour = '0' + hour
  min =  dateInfo.getMinutes()
  if (min < 10)
    min = '0' + min

  return [year, month, day, hour, min].join('-')

module.exports = router
```
Rubyで標準入力をチェックする


標準入力で入力された値をチェックしたい場合は、こう書くとできます。

```check.rb
def is_num
  loop do
    print ">> "
    i = $stdin.gets.chomp
    return i if i =~ /^\d+$/
    puts "数字で入力してください"
  end
end

puts is_num + "が入力されました"
```

この例で言うと数字チェックですが、`/^\d+$/`となっている正規表現の部分を変更することで、いろいろなチェックが可能になります。

コツとしては入力をloopで待ち受けることと、chompで入力された値の改行を取り除いておくことでしょうか。
SourceTreeでbranchを切るときの便利機能



# 概要
SourceTreeでbranch切った時に便利な機能を発見したので紹介する。

# 操作
たとえばbranch名が

make_sql_server_to_mysql_server_batch
というbranchを切ろうと思った時に普通にbranchを切ると「_」を6回も入力しなくてはならない。つまり、Shiftを押しながら＼を6回押す必要があるわけだ。

めんどくさい。

SourceTreeでは画像通りにスペースが自動で_に変換される。


![branch.JPG](https://qiita-image-store.s3.amazonaws.com/0/57634/b53de3ce-a9c3-80e1-b6f6-16fc89d2a254.jpeg)
超便利。
ちゃんとスペースが_になってbranchが作成されていることがわかる。
![right.JPG](https://qiita-image-store.s3.amazonaws.com/0/57634/67935717-3929-bc49-e0a7-4ab4f7dec2b1.jpeg)


## タグでもできる
![tag.JPG](https://qiita-image-store.s3.amazonaws.com/0/57634/0b8da228-08a6-0251-2b87-c2f38f6320c4.jpeg)
![tag2.JPG](https://qiita-image-store.s3.amazonaws.com/0/57634/d70e9a91-1c96-690a-254c-bba725cdd00a.jpeg)

@7of9 さん情報ありがとうございます。
# まとめ
Source Treeではブランチ名/タグにわざわざ_を入力する必要がなくスペースが勝手に置換してくれる
vimで文字化けした時の対応

##文字が文字化けした場合

・vimの文字コードを確認
```:set enc?```
・ファイルの文字コードを確認
```:set fenc?```
・エンコードを指定して保存し直す
```:set fenc=文字コード```

##設定ファイルを変更

毎回文字コードを変更するのは大変なので
vimの設定ファイルに保存しておく。

```
# vi ~/.vimrc
---- vi追記 ----
set encoding=utf-8
set fileencodings=iso-2022-jp,euc-jp,sjis,utf-8
set fileformats=unix,dos,mac
```
保存したら、設定反映
```# source ~/.vimrc```
RedisのHashに混入したゴミデータを一括で削除する

開発中、Redisに入れてるHashデータにゴミが混入して厄介だったので、消すスクリプトを作った。

参考
http://qiita.com/aki77/items/57bfd7f18c54ba60c0aa

```bash:del_hkey.sh 
#!/bin/sh

for keyspec in keyspecs to search ; do
	keys=`redis-cli KEYS "$keyspec*"`
	for hkeyspec in `echo $keys`; do
		echo 'key: ' $hkeyspec
		redis-cli HDEL "$hkeyspec" to_delete
	done
done
```

keyspecs to search: 検索したいキーPREFIXを列挙
to_delete: 消す対象のHASH内キー
Swift メンバ変数になるべく let を使う方法 

Swift でクラスを書いていく上でメンバ変数に `let` をなるべく使いたいが、複数行書かないと変数に代入できないケースがあると思います。そういう場合には即時関数を使えば解決します。

```swift
class Sample {
    let member: String = {
        let str1 = "1"
        let str2 = "2"
        return str1 + str2
    }()
}

let sample = Sample()
println(sample.member) // => 12
```


また `Unwrap` されたメンバ変数 (String!) もこれを使えば回避することができると思います。
コンストラクタでの初期化もスッキリして一石二鳥。
今日からQiita始めます！！！

みなさんはじめまして。
meibutuoyaji22(名物おやじ２２）です。
僕は現在学生で、来年の４月からAWSの会社で働くことが決まっています。
とはいっても、全くの初心者でわからないことばかりなので、
「お前　そんなことも知らないのか？？」ということもどんどん書いていこうと思いますので
ご指導のほどお願いします。
◎宣言
今日（２０１５年　７月１日）からQiitaで毎日更新していきたいと思います。

目的は２つです。
１つはOUTPUTして、その日にINPUTした知識を定着を図ること。
２つ目は周りの方からコメントやアドバイスをいただいて
勉強できればなーーーと思います。

早速今日はAWSのことを勉強していきたいと思い、
かの有名な「ドットインストール」を使いました。

しかし、トラブルばかりで、AWSよりもUNIXのコマンドの知識が必要だと分かり、
UNIXを勉強することに！！！


が、　ログインで早速わからない＾＾

 ssh 　ユーザー名＠サーバー名　でログインできると思うのですが、
自分のサーバー名がわかりません。

また、サーバー名を探す方法をいろいろ調べたのですが、これといって解決できず。

みなさん、助けてください。

また、その状況を伝えようとして、スクリーンショットをとったのですが、ピクチャのところに
スクリーンショットが保存されていないという事態””！！！なぜ？？？

初日からわからないことばかりですが、少し休憩してまた再開します。

コメント、アドバイスよろしくお願いします。 :smile:
Nginx とunicornとRails を使った環境でのタイムアウト挙動確認

## 目的

+ めっさ重い処理をRails で書いたらめっさ怒られた
+ **めっさ重い処理** って感覚的には分かるけどサーバーの設定等からちゃんと **めっさ重い処理** とはなんなのかを定義したい
+ あわよくばRails にテストを追加したい

## 環境

Rails 4.2
Nginx 1.6.2
unicorn 4.8.3

## 設定

+ unicorn.rb
 
```
〜略〜
num_unicorn_workers = ENV['UNICORN_WORKERS'].to_i
worker_processes((num_unicorn_workers > 0 ? num_unicorn_workers : nil) || (ENV['RAILS_ENV'] == 'production' ? 4 : 2))
timeout           30
〜略〜
```

+ /etc/nignx/conf.d/gessy0129.conf

```
〜略〜
proxy_connect_timeout 300; # unicorn 接続を待つことが出来る時間
proxy_send_timeout    300; # unicorn へのリクエスト送信を待つことが出来る時間
proxy_read_timeout    300; # unicorn からの応答を待つことが出来る時間
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_pass http://gessy0129;
〜略〜
```

## 動作確認

### Rails での重い処理を書く

+ 502 Bad Gateway

### unicorn のタイムアウト > nginx のタイムアウト 

+ proxy_read_timeout 以外を 3にする
    + 200 OK
+ proxy_read_timeout を 3にする
    + 504 Gateway Timeout
+ unicorn を落とす
    + 502 Bad Gateway

## Rails側でテストを書くなら・・

+ nignx.conf のproxy_read_timeout に設定した秒数以内にレスポンスが返せるか？
+ unicorn.rb に設定した秒数以内にレスポンスが返せるか？

### 適当なテスト概要

1. File.existsして、
2. File読み込んで、
3. timeout とかproxy_read_timeout の値を取得して、
4. rspec で意図的にタイムアウト起こし、
5. エラーページが表示されるのを確認する

### このテストの懸念

+ Jenkins でどうやるんだ・・
+ 真面目にtimeout を待っていたらその部分のテストがめっちゃ遅くなって効率悪くなるので適当に値を編集してあげないと
【bash】ダブルコーテーション内で特殊文字が文字列として扱われる

わかれば当たり前だけどはまったのでメモ。
ダブルコーテーション内では特殊文字(チルダなど)は文字列扱われる。

sshの鍵認証でrsyncしようとして、sshの鍵のパスをチルダで書いてしまったため、鍵がないというエラーが出た。
ダブルコーテーションの件に気付かず、ずっとrsyncの仕様を調べてはまった。

```bash:間違った例
rsync -r  -e "ssh -i ~/.ssh/keyfile" /path/to/dir  username@example.com:/path/to/foo/

=>Warning: Identity file ~/.ssh/keyfile not accessible: No such file or directory.
```

```bash:正しい例
#ダブルコーテーションなのでフルパスで書きましょう。
rsync -r  -e "ssh -i /home/foo/.ssh/keyfile" /path/to/dir  username@example.com:/path/to/foo/
```

参考：[rsync + sshで鍵ファイル認証でリモートサーバに転送する方法](http://dqn.sakusakutto.jp/2011/03/rsync-ssh.html)
Unicorn の起動と停止

[こちらの記事](http://qiita.com/Salinger/items/5350b23f8b4e0dcdbe23#unicorn-の設定)では Rakefile に追記していたが、 *lib/tasks* に入れた方がまとまりが良いと思ってやってみた覚書。

# 新しい task を作成

```bash
bundle exec rails generate task unicornctl
```

# ファイルを編集

*lib/tasks/unicornctl.rb* というファイルができるので内容を以下のようにする。

```ruby:unicornctl.rb
namespace :unicornctl do
  desc "Start unicorn for development env."
  task start: :environment do
    config = File.expand_path('config/unicorn.rb', Rails.root)
    sh "bundle exec unicorn_rails -c #{config} -E development -D"
  end

  desc "Stop unicorn"
  task stop: :environment do
    unicorn_signal :QUIT
  end

  desc "Restart unicorn with USR2"
  task restart: :environment do
    unicorn_signal :USR2
  end

  desc "Increment number of worker processes"
  task increment: :environmen do
    unicorn_signal :TTIN
  end

  desc "Decrement number of worker processes"
  task decrement: :environment do
    unicorn_signal :TTOU
  end

  desc "Unicorn pstree (depends on pstree command)"
  task pstree: :environment do
    sh "pstree '#{unicorn_pid}'"
  end

  def unicorn_signal signal
    Process.kill signal, unicorn_pid
  end

  def unicorn_pid
    begin
      File.read(File.expand_path('tmp/pids/unicorn.pid', Rails.root)).to_i
    rescue Errno::ENOENT
      raise "Unicorn doesn't seem to be running"
    end
  end
end
```

# タスクの確認

編集が完了したらタスクを確認する。

```bash
$ ./bin/bundle exec rake -vT unicornctl
rake unicornctl:decrement  # Decrement number of worker processes
rake unicornctl:increment  # Increment number of worker processes
rake unicornctl:pstree     # Unicorn pstree (depends on pstree command)
rake unicornctl:restart    # Restart unicorn with USR2
rake unicornctl:start      # Start unicorn for development env
rake unicornctl:stop       # Stop unicorn
```

# 起動・停止

起動・停止は[こちらの記事](http://qiita.com/Salinger/items/5350b23f8b4e0dcdbe23#unicorn-の設定)と同じ。

```bash
bundle exec rake unicornctl:start # 起動
bundle exec rake unicornctl:stop  # 停止
```
Android BLE 切断コールバックが呼ばれない

```lang:切断処理
//切断したい時
gatt.disconnect();
gatt.close();
```

と一気にやってしまうと切断コールバックが呼ばれなくなる場合があるみたい。
以下のようにしたら解決したように見える

```lang:切断処理
//切断したい時
gatt.disconnect();

//BluetoothGattCallback
public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
    if (newState == BluetoothProfile.STATE_DISCONNECTED) {
        gatt.close();    //disconnect()の結果のコールバック来てからclose
    }
}
```

disconnect＝切断　を確認してからclose＝閉じる　のは当然といえば当然かもしれない・・・

//AndroidBLEのコールバック地獄めちゃくちゃキツくないですか
bottle 版 openblas が homebrew-versions の gcc5 に依存してるでござるの巻

homembrew-science の bottle 版 openblas を使って何かをビルド中に 「`/usr/local/lib/gcc/5/libgfortran.3.dylib` が無いよ」と言われたら、それは homebrew-versions の gcc5 を `--with-fortran` オプション付きでインストールしろというサインです。
現在のPCの時刻をdateコマンド用に出力するhtml

* [【うるう秒】あなたのサーバは大丈夫？ | 自宅ラック友の会 ポータル](http://www.rack.sh/linux-leap-second/)によると

> CPU100% な現象が発生してしまったら‥ – 解決・対応方法
> 現象発生後、date コマンドを利用して、システム時刻を設定し直すと、事象は解消する

とのことなので

`sudo date -s "07/01 08:42:20 2015"`
みたいなのを表示させるの用意した。
あとはCPU100%な現象が起こったサーバで実行すれば治るかも。
↑
【追記9:23】問題が起きなかったので未確認。


```html:now.html
<div id="date"></div>
<script>
var myVar=setInterval(function () {myTimer()}, 1000);

function myTimer() {
    var d = new Date();
    var mm = fillzero(d.getMonth() + 1);
    var dd = fillzero(d.getDate());
    var hh = fillzero(d.getHours());
    var min = fillzero(d.getMinutes());
    var yy = d.getFullYear();
    var ss = fillzero(d.getSeconds());
    var now = 'sudo date -s "' + mm + '/' + dd +' '+ hh + ':' + min +':'+ ss + ' ' + yy + '"';
    document.getElementById("date").innerHTML = now;
}
function fillzero(i) {
    if (i<10) {
        i = "0" + i;
    }
    return i;
}
</script>
```
XenServer6.5でxenbrのRX droppedが増え続ける場合の対処方法

XenServer6.5のインストール後にifconfigしてみるとRX droppedがカウントされ続けていました。

```shell-session
# ifconfig
xenbr0    Link encap:Ethernet  HWaddr <my macaddress>  
          UP BROADCAST RUNNING  MTU:1500  Metric:1
          RX packets:171 errors:0 dropped:171 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:17121 (16.7 KiB)  TX bytes:0 (0.0 b)

xenbr1    Link encap:Ethernet  HWaddr <macaddress>  
          inet addr:<my inet addr>  Bcast:<my Bcast>  Mask:<my Mask>
          UP BROADCAST RUNNING  MTU:1500  Metric:1
          RX packets:2678 errors:0 dropped:181 overruns:0 frame:0
          TX packets:3807 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:223114 (217.8 KiB)  TX bytes:10707630 (10.2 MiB)
```

ethtoolでnicのオフロード関係をOFFにしてもダメでしたが、デフォルトのopenvswitchをlinuxbridgeに変更する事でとりあえず解決しました。

```shell-session
# xe-switch-network-backend bridge
```

変更後は再起動が必要

```shell-session
# reboot
```

----
※使ってるスイッチの確認

```shell-session
more /etc/xensource/network.conf
```

----
※元のopenvswitchに戻す場合は以下を実行

```shell-session
# xe-switch-network-backend openvswitch
```

----


Open vSwitchを使いたいのですが、根本的な解決がされるまではOpenFlowのテストは控えます。


コマンド参考：http://support.citrix.com/article/CTX138335
background-imageを使っている画像を、%指定のCSSのみでいい感じに表示する


#スマートフォンで画像をうまい具合に縦横比を維持して表示したい時ってありますよね

あります。
今までは、CSSのみでやるのは難しいなーって思ってたのですが、先日上手い方法を知ったので、ここにメモっておきます。
自分のブログにも謎の文字羅列を書いたのですが、記録として残しておかないと僕が忘れるので、書きます。

#HTML

```html
    <html>
        <head>
            <link rel="stylesheet" href="sample.css">
        </head>
        <body>
            <div class="wrapper">
                <a class="image" href="#" style="background-image:url(sample.png)">dummytext</a>
            </div>
        </body>
    </html>
```


#CSS

```css
    .wrapper {
      width: 100%;
      height: 70%;
      padding-top: 70%;
      position: relative;
      display:block;
   }
   a.image {
       width: 100%;
       height: 100%;
       position: absolute;
       top: 0;
       left: 0;
       display: inline-block;
       text-indent:-9999px;
   }
```

#何が嬉しいの？
heightを%で指定できるので、画面を回転させた時とかに破綻せずに表示出来るってのが嬉しいんです。
今まで、高さに大体○○pxとか指定して誤魔化していたのですが、この方法を使う事で比率を計算して表示できるので、大変ありがたいですね。
px単位で指定する方式はかっちり決まるので、ちゃんとデザインやってる人には相変わらず良い方法だと思いますが、僕のようにてきとーにやってきた人からすると、比率で大まかな表示をコントロールできるこの方法は眼から鱗が落ちる感じでした。

#簡単な解説
wrapperのheightに70%を指定していますが、これは**横幅を100%として、それに対する70%として解釈してくれます**。
しかし、そのままですとwrapperの高さは0pxです。これに**擬似的に高さを出すためにpadding-topに同じ%を指定します**。
このままですと、padding-topを指定しただけですので、子Nodeのaタグは表示されない位置になるので、**positionで調整する事でいい感じに画像を表示出来ます**。
あと、分かる人には分かりますが、aタグの高さと幅はwrapperの高さと幅になるので、100%指定する事でぴっちり表示されます。
wrapperのサイズを変更すればaタグのサイズも自ずとサイズ変更されるのが非常に嬉しいですね。

#応用編
例えば、wrapperのwidthを50%にして、displayをinline-blockにして、2つ以上Nodeを並べるとタイル上に表示出来たりします。色々応用出来る技術だと思いますので、参考にしてください。


#実際に動いてるの
[http://jsdo.it/Arc_Cosine/uJhw](http://jsdo.it/Arc_Cosine/uJhw)
技術英語 > [Could you excuse us] for a while?


以下のフレーズがあったのをふと思い出した。

Could you excuse us for a while?
「しばらくの間、我々だけにしてくれますか?」

Aさん、Bさん、Cさんがいた時、AさんとBさんがCさんにこのフレーズを言ってきたらCさんはその場を離れるように依頼されている。

<hr>
http://ameblo.jp/mongolianchopper/entry-10312470202.html

> 皆で会食やら会議などをしていて、どうしても途中で出なければいけないときなどで使えるとても丁寧なフレーズ。「途中で失礼します。すみません」って表現。

こちらの例では、その場に残るのはフレーズを言った人「以外」で、上記の意味（その場に残るのはフレーズを言った人）と反対になるようだ。

<hr>
上の例で「部屋に我々だけ残りたい」という意図をきちんというには、

Could you excuse us for a while? We would like to talk just between two of us.

のように言うのがいいかもしれない。
nw.js：require()したモジュールにDOMを使わせる

## はじめに

nw.jsにおいて、require()したモジュールにDOMを使わせる方法。

※どうしても`require()`でDOMを使わせたいというこだわりがなければ、素直にHTML上で`<script>`タグで読み込ませるほうが簡単である。そうすればWindowコンテキストで動作するのでDOM前提のモジュールはきちんと動作する。普通はそうするよね。。

## やり方

`require()`する前にglobalオブジェクトにDOMオブジェクトと同名のプロパティを作り、そこにDOMプロパティを代入する。
※起動時はWindowコンテキストで動作していることが前提。
[Differences of JavaScript contexts · nwjs/nw.js Wiki](https://github.com/nwjs/nw.js/wiki/Differences-of-JavaScript-contexts)

```js:

global.document = window.document;
global.navigator = window.navigator;
// DOMを使うモジュールのロード
var ko = require('knockout');
var jquery = require('jquery');

```

## なぜこんなことをしないといけないか

例えばknockoutだとモジュールの実装が下記となっている。

```js:knockout.jsの冒頭
(function(){
var DEBUG=true;
(function(undefined){
    // (0, eval)('this') is a robust way of getting a reference to the global object
    // For details, see http://stackoverflow.com/questions/14119988/return-this-0-evalthis/14120023#14120023
    var window = this || (0, eval)('this'),
        document = window['document'],
        navigator = window['navigator'],
        jQueryInstance = window["jQuery"],
        JSON = window["JSON"];
       .
       .
       .
```

もうひとつ。jqueryでの実装。

```js:jquery.js
(function( global, factory ) {

	if ( typeof module === "object" && typeof module.exports === "object" ) {
		// For CommonJS and CommonJS-like environments where a proper `window`
		// is present, execute the factory and get jQuery.
		// For environments that do not have a `window` with a `document`
		// (such as Node.js), expose a factory as module.exports.
		// This accentuates the need for the creation of a real `window`.
		// e.g. var jQuery = require("jquery")(window);
		// See ticket #14549 for more info.
		module.exports = global.document ?
			factory( global, true ) :
			function( w ) {
				if ( !w.document ) {
					throw new Error( "jQuery requires a window with a document" );
				}
				return factory( w );
			};
	} else {
		factory( global );
	}

// Pass this if window is not defined yet
}(typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
 .
 .
```

nw.jsの場合`require()`したときはNodeコンテキストで動作するのでグローバルオブジェクトはglobalである。そのため上の`this`にはglobalオブジェクトが入り、うまく動作しない。事前にglobalオブジェクトにDOMプロパティを入れておくことでNodeコンテキストでもうまく動かすことができるようになる。
jqueryの場合は`global.window = window`としても動作するね。そのほうがいいかもしれない。

## さいごに

この方法は十分に検証したわけではなく、自分が使いたいモジュールがたまたまこの方法で動いているだけかもしれないので気をつけること。万能かどうかはわかりません。。
MeteorのORM,gravitonを使ってみる。

meteorでちょっと困ることがあるんです。hasMany,belongsTo。Railsから流れ着いた者としては、その辺をしっかり組んでからプログラミング開始したいと常々思ってました。

これまではhasMany,BelongsToを実現するためにtransformを使ってきました。まぁぶっちゃけ、transformさえあれは大抵のリレーションはサクッと作れちゃうんですがw

今回はMeteorのORMライブラリ、gravitonを使ってそれらを実現したいと思います。
https://github.com/emmerge/graviton/

まずは環境構築

```terminal.osx
meteor create gravition-example
cd g*
rm *
touch model.js
atom .
```

## hasManyを定義
###投稿は、複数のコメントを持つ

```model.js
Posts = Graviton.define('posts', {
  hasMany: {
    comments: {
      collection: 'comments',
      foreignKey: 'postId'
    }
  }
})

Comments = new Meteor.Collection('comments')
```

```js
//browser console
post = Posts.findOne();
comment = Comments.build();
comment.set({author:'たかし', body:'あのですね・・'})
post.comments.add(comment);

post.comments.all()
// ポストが持つ、すべてのコメントを返します。
```

#belongsToを定義
##コメントは、一つの投稿を持つ

```model.js
Posts = Graviton.define('posts', {
  hasMany: {
    comments: {
      collection: 'comments',
      foreignKey: 'postId'
    }
  }
});

Comments = Graviton.define('comments', {
  belongsTo: {
    post: {
      collection: 'posts',
      field: 'postId'
    }
  }
})

```

```js

//browser console
post = Posts.findOne();
comment = Comments.build();
comment.set({author:'たかし', body:'またですか；'})

comment.post()
// ポストオブジェクトを返します。
console.log('同じ_idになるでしょう :',post._id,comment.post()._id)
```



#お知らせ
日本人Meteor開発者のためのチャットルームを作りました。よかったら参加してください。ちなみにgravitonの情報も、このチャットルームで知りました
![スクリーンショット 2015-07-01 4.56.49.png](https://qiita-image-store.s3.amazonaws.com/0/36652/adaa01d3-aff0-bd48-5fe2-cc92b6a38f45.png)

https://gitter.im/endows/meteor-jp
TwitterSDKのFabricで指定したユーザーのデータを取得する

TwitterAPIでユーザーのデータを取りたい場合、[/1.1/users/show.json](https://dev.twitter.com/rest/reference/get/users/show)にGETリクエストを飛ばしてユーザーオブジェクトを取得する形になります。

[Fabric](https://get.fabric.io/)にはこの部分のAPIが用意されていないので、独自にApiClientを拡張して実装する必要があります。

# 1. Serviceの作成
FabricのAPIは[Retrofit](http://square.github.io/retrofit/)ベースで作られているのですが、基本はApiClientクラスを経由して `StatusesService` や `AccountService` といったサービスクラスを呼び出してAPIを叩くという使い方になっています。

`/users` のように対応していないAPIを用意する場合は、 `UserService` のようなサービスクラスを作ってAPIをまとめておこうという話です。

```java
public interface UserService {
    @GET("/1.1/users/show.json")
    void show(@Query("user_id") Long userId,
        @Query("screen_name") String screenName,
        @Query("include_entities") Boolean includeEntities,
        Callback<User> cb);
}
```


# 2. TwitterApiClientの拡張
TwitterApiClientを継承して独自のクライアントクラスを作ります。

```java
public class CustomTwitterApiClient extends TwitterApiClient {
    public CustomTwitterApiClient(TwitterSession session) {
        super(session);
    }

    public UserService getUserService() {
        return getService(UserService.class);
    }
}
```


# 3. APIを叩く
準備は完了したので、いよいよAPIを叩きます。
Twitterログインをして、TwitterSessionがActiveな状態が前提です。
ログインについてはこちら ⇒ [Log in with Twitter](https://dev.twitter.com/twitter-kit/android/twitter-login)


```java
// ログインしていればsessionが取得できる
TwitterSession session = Twitter.getSessionManager().getActiveSession();
UserService userService = new CustomTwitterApiClient(session).getUserService();

userService.show(userId, null, true, new Callback<User>() {
    @Override
    public void success(Result<User> result) {
        User user = result.data;
        // user.name
    }

    @Override 
    public void failure(TwitterException e) {
        Log.e(TAG, e.getMessage());
    }
});
```

以上です。


参考: [Access Twitter's REST API](https://dev.twitter.com/twitter-kit/android/api)
emergeの実行job数を常にCPUコア数+1にする

普段は1コアでケチケチ運用しているクラウドサーバーで「よし！emergeするぞ！」と思ってせっかくCPUコア数を増やした...でもjob数の設定が1コアのときのままだった。
そんな悲しい思いをしない方法。

----

`make.conf`には`MAKEOPTS`を書かない。

```shell-session
[root@localhost] # grep -c MAKEOPTS /etc/portage/make.conf
0
```

そして`/etc/profile.d/`の下に適当な名前で :arrow_double_down: のようなスクリプトを書く。

```shell-session
[root@localhost] # cat /etc/profile.d/makeopts.sh
#!/bin/bash
export MAKEOPTS="-j$(($(nproc)+1))"
```

そうすると`emerge`する際のjob数がコア数+1になる。
4コアのインスタンスならjob数が5に！

```shell-session
[root@localhost] # nproc
4
[root@localhost] # emerge --info | grep MAKEOPTS
MAKEOPTS="-j5"
```

8コアのインスタンスならjob数が9に！

```shell-session
[root@localhost] # nproc
8
[root@localhost] # emerge --info | grep MAKEOPTS
MAKEOPTS="-j9"
```

これでたくさんemergeできますね！

ちなみに`genkernel`でカーネルをビルドする際はこんな感じで。

```shell-session
[root@localhost] # genkernel --makeopts="-j$(($(nproc)+1))" all
* Gentoo Linux Genkernel; Version 3.4.49.2
* Running with options: --makeopts=-j5 all

* Using genkernel.conf from /etc/genkernel.conf
* Sourcing arch-specific config.sh from /usr/share/genkernel/arch/x86_64/config.sh ..
* Sourcing arch-specific modules_load from /usr/share/genkernel/arch/x86_64/modules_load ..

* Linux Kernel 4.0.5-gentoo for x86_64...
* .. with config file /etc/kernels/kernel-config-x86_64-4.0.5-gentoo
* kernel: Using config from /etc/kernels/kernel-config-x86_64-4.0.5-gentoo
*         Previous config backed up to .config--2015-07-01--03-59-09.bak
* kernel: >> Running mrproper...
...(snip)
```
同じ型でもオーバーロードしたい

type aliasは型に別名を与えるもので、新たな型を定義するものではない。
なので、type aliasをした型で関数のオーバーロードを行うことはできない。

```d
alias Dollar = int;
alias Euro = int;
alias Yen = int;

// type aliasでは全てint型として扱われるのでオーバーロードできない
Yen exchange(Dollar money) {
  Yen yen;
  yen = 120 * money;
  return yen;
}
Yen exchange(Euro money) {
  Yen yen;
  yen = 140 * money;
  return yen;
}
```

新しく型を定義するには`struct`か`class`を使う。Dでは委譲を簡単に行うためのalias thisというものが用意されている。この機能を使うと、委譲先の型に暗黙に変換できるようになるため、同じように扱うことができる。

```d
struct Dollar {
  int delegater;
  alias delegater this;
}
struct Euro {
  int delegater;
  alias delegater this;
}
struct Yen {
  int delegater;
  alias delegater this;
}

// structで異なる型を定義しているのでオーバーロードできる
Yen exchange(Dollar money) {
  Yen yen;
  yen = 120 * money; // alias thisでint型と同様に扱うことができる
  return yen;
}
Yen exchange(Euro money) {
  Yen yen;
  yen = 140 * money;
  return yen;
}
```

もちろん、templateを使うことでコードの重複を排除できる。

```d
struct Another(T) {
  T delegater;
  alias delegater this;
}
// Another!intで定義した新たな型に別名を与えているのでオーバーロード可能
alias Dollar = Another!int;
alias Euro = Another!int;
alias Yen = Another!int;
...
```

しかし、alias thisにはよくわからない点がある。次のコードはコンパイルが通らない。

```
struct myint {
  int x;
  alias x this;
}

// 初期化
myint hoge = 100;

myint foo() {
  return 42;  // 関数の戻り値
}
```

コンストラクタ構文（であってるのか？）やキャストで明示的に指定すればできる。[Classes - D Programming Language](http://dlang.org/class.html#alias-this)によるとalias thisで委譲した型は委譲先の型に暗黙に変換することができるとあり、委譲先の型から暗黙に変換できるとは書いていないので、こういう動作でも別に良いのだが……。

それならそれで、変数宣言と代入を分けて書くとコンパイルが通るのは不思議である。構文的には初期化子のExpInitializerはAssignExpressionと等しいので、初期化子に書くのと変数宣言と代入を分けて書くのに違いがでるとは思えない。また関数の戻り値は構文的にはExpressionであり、式は関数の戻り値の型に暗黙に変換されると書かれている。


ソースコードを読めばいいのか……まあ、暇ができたら……
cpp_rational - small rational with operators


|cpp_libraries|article|
|:--|:--|
|cpp_binarysearch|http://qiita.com/cielavenir/items/852e2458cd327ca73613|
|cpp_inspect|http://qiita.com/cielavenir/items/95615185b5ca47d9111d|
|cpp_range|http://qiita.com/cielavenir/items/94c9abbb7767bd57607b|
|cpp_rational|http://qiita.com/cielavenir/items/2171327462d2afd98b65|

## Download

https://github.com/cielavenir/cpp_libraries/tree/master/rational

## What's this?

- You can handle rational numbers even without boost.

## Example

- Chemist's Math
- http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=1300
- http://judge.u-aizu.ac.jp/onlinejudge/review.jsp?rid=1424826
PBOXと他社サービスとの比較


#　pbox 比較表

pboxを他のサービスと比較してみた表を公開します。まだ一部内容に誤りがあるかもしれませんが、随時更新していきます。

機能的な違いはほとんどありません。大きな違いは価格設定になります。
多くのユーザで利用する場合、PBOXは圧倒的なコストパフォーマンスを発揮します！

他者との価格比較も近く更新していきます！

|	| PBOX | Dr社| Go社 | Ow社 |
|:-----------|:-------|:-------------|:------|:-----|
| タイプ	| 同期型	| 同期型	| 同期型	| 同期型|
| 提供	| MNU	| ドロップボックス	| グーグル	| ownCloud| 
| 有料プラン	| 容量| ユーザ数|ユーザ数| ユーザー数| 
| セキュリティー	| ○	| ○	| ○	| ○| 
| バージョニング	| ◎復元可能	| ◎復元可能	| ○閲覧のみ	| ◎復元可能| 
| データの管理方法	| シングルテナント	| マルチテナント	| マルチテナント	| シングルテナント| 
| 利用ｽﾄﾚｰｼﾞ	| Objectstrage（IBM SoftLayer)	| S3	| S3	| Objectstrage（IBM SoftLayer)他| 
| 大容量データの制限	| ５GB制限なし	| ５GB制限	| ５GB制限	| ５GB制限| 
| 保存ファイルの暗号化（ロードマップ）	| ○| ○ | ○ | ○| 
| 対応デバイス| Linux Win MAC	| Linux Win MAC	| Linux Win MAC	| Linux Win MAC| 
| スマホ対応	| 予定	| ○	| ○	| ○| 
| 通信経路の暗号化| 	SSL	| SSL	| SSL	| SSL| 
| その他のセキュリティー対策	| 自由	| －	| －	| 自由| 
| singlesign-on	| 予定	| ○| 	○| 	○| 
| アクセス権限管理| 	ある| 	ある	| ある	| ある| 
| 競合ファイルノ扱い	| ○	| ○	| ○ | ○| 
| プレビュー（ロードマップ）	| 予定あり| ○| ○	| ○| 
| サムネイル（ロードマップ）	| 予定あり| ○| ○	| ○|
「JSX」って名前のものが色々あって混乱する


からまとめてみた。

どれもJavaScriptに関係する。

#1. Reactの「JSX」

https://facebook.github.io/jsx/

 * JavaScriptの独自拡張構文
 * Facebook社
 * Facebook社製フレームワーク、[React](http://facebook.github.io/react/)で使われている構文
 * [E4X](https://developer.mozilla.org/ja/docs/E4X)みたいにJavaScriptの構文中にXML風のものをそのまま書く記法

```js:公式のサンプルより
// Using JSX to express UI components.
var dropdown =
  <Dropdown>
    A dropdown list
    <Menu>
      <MenuItem>Do Something</MenuItem>
      <MenuItem>Do Something Fun!</MenuItem>
      <MenuItem>Do Something Else</MenuItem>
    </Menu>
  </Dropdown>;

render(dropdown);
```

 * 最近よく見かけるようになった
 * 各種LintやBabel,TypeScriptが対応（予定）らしい

##検索方法

`React JSX` : [Google検索](https://www.google.co.jp/#q=React%20JSX)

#2. AltJSの「JSX」

https://jsx.github.io/

 * AltJSの一つ、JavaScriptに似た言語
 * DeNA社
 * DeNA社製のAltJS言語
 * ES4やAS3に似た文法をもち、コンパイル後はJavaScriptになる

```jsx:公式のサンプルより
class _Main {
    static function main(args : string[]) : void {
        log "Hello, world!";
    }
}
```
## 検索方法

`DeNA JSX -React` : [Google検索](https://www.google.co.jp/#q=DeNA+JSX+-React)
 * `-React`を入れないとややノイズが載る
 * `AltJS JSX`だとReactの方が混じるのでダメ

#3. Adobeの「JSX」

http://www.adobe.com/jp/devnet/scripting.html

http://www.adobe.com/jp/devnet/photoshop/scripting.html
http://www.adobe.com/jp/devnet/illustrator/scripting.html
https://helpx.adobe.com/jp/after-effects/using/scripts.html
https://helpx.adobe.com/indesign/using/scripting.html

 * Adobe社製ソフトのJavaScriptマクロ
 * Adobe社
 * Photoshop,Illustrator,InDesign,AfterEffectsなどのAdobe製品を弄る事のできるJavaScript
 * ブラウザやnode.jsなどとはAPIが全然別もの
	 * なので [photoshop.d.ts](https://www.npmjs.com/package/photoshop.d.ts) などの型定義ファイルがあったりする
 * さらに製品によっても微妙に差異がある
 * 拡張子が`.jsx`
 * ExtendScriptという呼び方も

## 検索方法

`Adobe JSX` : [Google検索](https://www.google.co.jp/#q=Adobe+JSX)

ただし、`(製品名) JavaScript`の方が確実
Sqale での Rails アプリのログ出力先

「Sqale Rails ログ 場所」とか安易なキーワードでググるとアプリケーションのログファイルは

```
/var/log/app/stderr.log
/var/log/app/stdout.log
```

って出てくる．Sqale のサポートページもここを見ろって言ってくる．
ただプログラムがどこで止まってるのかとか書いてなくて，
「あれ？俺は単に heroku logs 的なのが見たいんだが」ってなる．
そういうときはこっちを見る．

```
current/log/production.log
```

灯台下暗し．
めっちゃ基本的なことだとは思うんですが初心者過ぎてつまずいたのでメモっときます．
サイコロの回転をシミュレート(AOJ ITP1_11_A)

[AOJ ITP1_11_A](http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ITP1_11_A)をやっていて結構困ったので備忘録的に書いておく。
問題はページに飛んで各自で見ていただきたい。
#できるようにすべきこと
・方角を与えてサイコロを回転させる
・上面の数値を返す
##実現に向けて最初にやろうとしたこと
・各面の数値をメンバ配列に入れておく
・上面になっている面の番号を変数に記録しておく(最初は`1`)
(各面には数字とは別に一意な番号が振ってある)

###いざ回転
回転させる際は、現在の上面の番号と移動の方角から次の上面の番号を求める。

⇒だめでした
回転の仕方によって番号の推移が違うことが判明。
S方向に転がしていって6を上面にしたときと、E方向に転がしていって6を上面にしたときでは番号の配置(ひいては面の配置)が違う。
動き方によって処理を変えないといけない？
#ブレークスルー
「上の面が何番かを記録しておく」のではなく、「回転するたびに数字を全部回転に合わせて実際に動かす」。
(最初に考えた方法よりもむしろプリミティブ。でもこっちの方が正しい)
コードも載せておく。
*2015/07/12 他の記事を書くにあたり少し修正。
(`operator[]()`の追加、`top()`の削除)*

```cpp
class dice{
public:
    explicit dice(int in[6]){
        for(int i=0;i<6;i++){
            v[i]=in[i];
        }
    }
    void mov(const char c){
        int buf;
        switch(c){
            case 'N':{
                buf = v[0];
                v[0] = v[1];
                v[1] = v[5];
                v[5] = v[4];
                v[4] = buf;
                break;
            }
            case 'E':{
                buf = v[0];
                v[0] = v[3];
                v[3] = v[5];
                v[5] = v[2];
                v[2] = buf;
                break;
            }
            case 'W':{
                buf = v[0];
                v[0] = v[2];
                v[2] = v[5];
                v[5] = v[3];
                v[3] = buf;
                break;
            }
            case 'S':{
                buf = v[0];
                v[0] = v[4];
                v[4] = v[5];
                v[5] = v[1];
                v[1] = buf;
                break;
            }
        }
    }
    int operator[](size_t i){return v[i];}
private:
    int v[6];
};
```

上面の数字を得るには`dice`オブジェクト`d`について、`d[0]`を呼べばよい。

#課題
・方角ごとに処理を書くのはめんどい。
(何かのコンテナで解決できないだろうか)

#続編
[サイコロの配置に関する問題を乱数を使って解く(AOJ ITP1_11_B/C)](http://qiita.com/EqualL2/items/3345227a4b45651faf15)
正規表現を使わないString#split

今日（もう昨日）Apache Commonsのない環境で
文字列を文字列で分割（正規表現使わない）するのてどうやるんだっけ？って思い出せなくて、
やったことなかったことに気が付いたので記事書きます。

（Apache Commons使うならStringUtils#splitByWholeSeparatorでしたっけ。）

```java
		{
			String s = "A,B,C";
			String d = ",";
			System.out.println(s + "を" + d + "でsplit");
			System.out.println(Arrays.toString(s.split(d, -1)));
			System.out.println(Arrays.toString(s.split(Pattern.quote(d), -1)));
		}

		{
			String s = "A.B.C";
			String d = ".";
			System.out.println(s + "を" + d + "でsplit");
			System.out.println(Arrays.toString(s.split(d, -1)));
			System.out.println(Arrays.toString(s.split(Pattern.quote(d), -1)));
		}
```

結果
>A,B,Cを,でsplit
[A, B, C]
[A, B, C]
A.B.Cを.でsplit
[, , , , , ]
[A, B, C]

Pattern#quote使うだけって話。
[ひしだまさん](http://www.ne.jp/asahi/hishidama/home/tech/java/regexp.html#Pattern.quote)も言ってます。