OmniAICreator/Qiita-1.07M huggingface dataset:
EBSボリュームのプレウォーミング(事前ウォーミング)が不要になってた


※ 完全に不要になったわけではないです。詳しくは下記。

EBSボリュームのプレウォーミングをやろうとして久しぶりにドキュメントみたら内容が変わってました。

Linux: http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ebs-initialize.html
Windows: http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/WindowsGuide/ebs-initialize.html

> 新しい EBS ボリュームは、利用可能になるとすぐに最大のパフォーマンスを発揮し、初期化 (以前は事前ウォーミングと呼ばれました) を必要としません。ただし、スナップショットから復元されたボリュームのストレージブロックは、アクセスするためには事前に初期化する必要があります (Amazon S3 からプルダウンしてボリュームに書き込みます)。この準備処理には時間がかかるため、初めて各ブロックにアクセスした場合に、I/O 操作のレイテンシーの著しい増加が発生する可能性があります。ほとんどのアプリケーションにとって、ボリュームの存続期間全体でこのコストを割り当てることは、許容範囲内です。一度データにアクセスされると、パフォーマンスは元に戻ります。
> 
> ボリュームを使用する前に、そのボリュームのすべてのブロックを対象に、読み取りを実行することで、本番環境におけるパフォーマンスの低下を回避することができます。このプロセスを「初期化」と呼びます。スナップショットから作成された新しいボリュームの場合は、ボリュームを使用する前に、データのあるすべてのブロックを読み取る必要があります。

つまり、新規でEC2インスタンスを作る場合はプレウォーミングが不要になったけど、スナップショット(EBSスナップショット、AMI)から復元したEBSボリュームは以前と変わらず初期化(プレウォーミングからネーミングが変わった)をする必要があるということですね。ちょろっと冒頭だけ読んで期待して損した！

今まではリードとライトの両方をddコマンドで実行する必要がありましたが、初期化はリードのみで良いのでddコマンドで以下のように実行すれば良いです。

before

```bash
$ sudo dd if=/dev/xvdf of=/dev/xvdf conv=notrunc bs=1M
```

after

```bash
$ sudo dd if=/dev/xvdf of=/dev/null bs=1M
```

いつからこのような仕様になったのかは不明。AWSから特にアナウンスが無かったと思います。
復元したEBSボリュームもプレウォーミングが不要になればもっと便利になるのに･･･
【Xamarin】新規プロジェクト作成



# 概要

Xamarin開発の勉強中なので、忘れないための投稿です。
今回はクロスプラットフォームアプリの新規ソリューション作成の手順を記載します。

# 環境

OS：Mac OSX(Yosemite 10.10.5)
ソフトウェア：Xamarin Studio(5.10)

# プロジェクトの作成

Xamarin.Formsを使う場合と、Xamarin.Formsを使わず両方をネイティブ実装する場合がありますが、ソリューションの作成手順は同じです。
　

**1. メニューから「ファイル > 新規 > ソリューション」を選択する**

![xamarin_forms_02.png](https://qiita-image-store.s3.amazonaws.com/0/87641/55fe6812-1d22-09fb-f0d8-9e59141b8652.png)　

**2. ウィザードの「Cross-platform」から作成したいタイプのソリューションを選択**

![xamarin_forms_01.png](https://qiita-image-store.s3.amazonaws.com/0/87641/b5d28585-ee54-c976-e99e-d945ccbe1496.png)

　
Xamarin.Formsを使用する場合は「Xamarin.Forms App」
ネイティブ開発の場合は「Single View App」を選択しましょう。
　

**3. ソリューション情報を入力する**

![xamarin_forms_03.png](https://qiita-image-store.s3.amazonaws.com/0/87641/37c3773c-6037-976b-97f2-22687f050405.png)


* AppName
 
	Android：Application Name
	iOS：Product Name

* Organization Identifier

	Android：Company Domain
	iOS：Organization Identifier
	
* Target Platforms

	作成対象のOS（クロスでやるなら両方にチェック）
	
* Shared Code

	共通コードの種類
	
	Portable Class LibraryとShared Libraryの違いは公式を参照して下さい。
	(http://www.xlsoft.com/jp/products/xamarin/portable_class_libraries.html)
	
> Shared Projects は、シングル ファイル セットを使用して、ソリューション内でコードを共有するシンプルな方法を提供し、一般的には、条件付きのコンパイラ ディレクティブを使用して、さまざまなプラットフォーム用のコード パスを指定します (詳細は、Shared Projects article と Setting up a Xamarin Cross-Platform Solution guide を参照してください)。
	
> PCL のプロジェクトは、既知の BCL クラス/機能のセットをサポートする特定のプロファイルをターゲットとします。ただし、PCL の弱点は、プロファイル独自のライブラリにプロファイル独自のコードを分けるために、アーキテクチャー上、余計な手間が掛かります。これら二つのアプローチに関する詳細は、Sharing Code Options guide を参照してください。

C#資産の具合で選ぶことになるかと思います。
　

**4. ソリューション情報を入力する２** 

![xamarin_forms_04.png](https://qiita-image-store.s3.amazonaws.com/0/87641/59963801-de11-2cfe-8656-8a118e7dffba.png)

特に説明する所はありません。
Gitを使う場合は「Use git for version control」にチェックを入れましょう。
Xamarin InsightsはXamarinのレポート機能等です、どちらでも大丈夫です。
　

**5. 作成完了**

![xamarin_forms_05.png](https://qiita-image-store.s3.amazonaws.com/0/87641/38eb0a39-bc95-8bc7-f0e7-dfc47b11509b.png)


作成完了したら上図のようになります。
一番上のTestAppが共通コードのプロジェクト、「.Droid」がAndroid用のプロジェクト、「.iOS」がiOS用のプロジェクトです。
ビルドする対象を切り替えたいときは、プロジェクトを右クリックして「スタートアップ プロジェクトとして設定」を選択して下さい。
　
以上でソリューションの新規作成は完了です。
ADX2LEでループ再生の2周目からノイズが乗る場合の回避方法

#<i class="fa fa-cube" style="font-size:1em;"></i> 解決方法
wav素材のエンコーディングタイプを**ADX以外**に変更してください。
HCA、HCA-MXにすれば解決します。

![スクリーンショット 2015-12-07 14.24.05.png](https://qiita-image-store.s3.amazonaws.com/0/96688/45a80d65-62e2-cbde-a3d5-296613497868.png)


----
#### <i class="fa fa-cube" style="font-size:1em;"></i> ポイント

デフォルトのエンコーディングタイプがADXなので陥りやすい罠だと思います。
容量的にも音質的にもHCAの方がメリットが大きいので
LEの次回更新時にデフォルトがHCAになるように祈りましょう。

有償版のADX2では上記問題は解決しているため、ADXでも綺麗なループになります。
しかしADXを選ぶメリットが少ないので（ちょっとだけ再生負荷が軽いくらい）、ほとんどの場合HCAで良いと思います。

----

<i class="fa fa-check-square-o" style="font-size:1em;"></i> **ADX2についてはこちら** → [<i class="fa fa-external-link" style="font-size:1em;"></i> 勝手にADX2情報まとめ](http://qiita.com/ksilogic/items/eb12af856b1ffc88a276)
Swiftでひらがなとカタカナのバリデーションをする

# Solution
- バリデーションライブラリとして、[SwiftCop](https://github.com/andresinaka/SwiftCop)を使用します。
- HogeTrialという独自のバリデーションクラスを作成し、trialメソッドでひらがなとカタカナのバリデーションを実装します。

```swift
import Foundation
import SwiftCop

// SwiftCop[https://github.com/andresinaka/SwiftCop]用のバリデーションクラス
public enum HogeTrial: TrialProtocol {
  case Required
  case Hiragana
  case Katakana
      
  public func trial() -> ((evidence: String) -> Bool){
    switch self {
    case .Hiragana:
      return { (evidence: String) -> Bool in
        // 全て全角ひらがなかどうか
        let hiraganaRegEx = "^[ぁ-ゞ]+$"
        let hiraganaTest = NSPredicate(format:"SELF MATCHES %@", hiraganaRegEx)
        return hiraganaTest.evaluateWithObject(evidence)
      }
    case .Katakana:
      return { (evidence: String) -> Bool in
        // 全て全角カタカナかどうか
        let hiraganaRegEx = "^[ァ-ヾ]+$"
        let hiraganaTest = NSPredicate(format:"SELF MATCHES %@", hiraganaRegEx)
        return hiraganaTest.evaluateWithObject(evidence)
      }
    default:
        return { (evidence: String) -> Bool in
            return false
        }
    }
  }
}
```

使用方法

```swift
class ViewController: UIViewController {
  @IBOutlet weak var nameHiraganaTextField: UITextField!
  @IBOutlet weak var nameKatakanaTextField: UITextField!

  // Let's create a cop!
  let swiftCop = SwiftCop()

  override func viewDidLoad() {
    super.viewDidLoad()

    swiftCop.addSuspect(Suspect(view: nameHiraganaTextField, sentence: "ひらがなを入力してください", trial: HogeTrial.Hiragana))
    swiftCop.addSuspect(Suspect(view: nameKatakanaTextField, sentence: "カタカナを入力してください", trial: HogeTrial.Katakana))
  }
}

```

# 参考

- [すべてひらがなかどうか調べる](http://pentan.info/php/reg/is_hira.html)
- [すべてカタカナかどうか調べる](http://pentan.info/php/reg/is_kana.html)
ページ内リンクのズレ解消

# 覚書：スニペット

```lang:HTML
<div id="header">
  ヘッダーがはいります
</div>
<div id="content">
  <a href="#link01">なんとか</a>
  <div name="link01" id="link01">かんとか</div>
</div>
```

## CSSで調整

```lang:CSS
#header {
  width: 100%;
  min-width: 960px;
  height: 100px;
  position: fixed;
  left:0;
  top:0;
  z-index: 10;
}
#content{
  padding-top: 100px;
}
#link01 {
  margin-top:-100px;
  padding-top:100px;
}
```

## Javascriptで調整
```lang:jQuery
$(function () {
  var headerHight = 100; //ヘッダの高さ
  $('a[href^=#]').click(function(){
    var href= $(this).attr("href");
    var target = $(href == "#" || href == "" ? 'html' : href);
    var position = target.offset().top-headerHight; //ヘッダの高さ分位置をずらす
    $("html, body").animate({scrollTop:position}, 550, "swing");
    return false;
  });
});
```

### 参考にしました
[position:fixedでヘッダ固定時のページ内リンクのずれを解消したい](http://www.tam-tam.co.jp/tipsnote/html_css/post4776.html)
コードパス上通過しない if 式内で初期化される変数のスコープについて

さっき自分で書いたコードを推敲していて気づいたことについて書きます。
特に結論も何もないので、正確な情報を知っている方はご教示いただけると幸いです。

---

以下のようなコードがあるとする。

```rb
if foo?
  bar = 'BAR'
end

p bar
```

`foo?` メソッドの返り値が truthy なときに、この結果が `"BAR"` になるのは問題ないと思う。
Ruby では `if` はスコープを作らないので、if の中で初期化された変数も問題なく見える。
(公式ドキュメント上の出典を見つけられなかったけど、なんかの本で読んだしこれは Ruby を書いている人の間では割と共有されている常識だと思う)

だけどもし `foo?` の返り値が falsy だったら `bar = 'BAR'` の行は通過されない、つまり `bar` は初期化されずにエラーになるのでは、と思って以下のようなコードを試してみた。

```rb
if false
  bar = 'BAR'
end

p bar
```

すると、結果は予想に反して `nil` だった。
仮に `if` とその中身を全部消してみると、当然 `undefined local variable or method` として `NameError` になる。

次にこういうのも試してみた。

```rb
if false
  def bar
    'BAR'
  end
end

p bar
```

この結果は `undefined local variable or method `bar' for main:Object (NameError)` となった。
個人的にはこのほうが自然に見えるが、変数の時にエラーにならないのと比べると食い違っているようにも思える。

静的言語であれば、通過していない変数がゼロ値で初期化されたとしても、わからなくはない。
初期化され得る変数の一覧は実行しなくてもコンパイル時に全てわかりそうだから。
でも Ruby に関しては超動的な言語なので、実行されていなにコードについては無いのも同様 (つまり `bar` の呼び出しはエラーになる) ぐらいが自然な気がする。
(もちろん、if の外で `bar = nil` とか書かなくて良いのは楽ではあるんだけど)

---

ちなみに PHP の挙動は直感通り、変数の初期化部分が実行されなかった場合は `Undefined variable: foo` としてエラーになりました。

```php
<?php
if (false) {
    $foo = 'bar';
}

var_dump($foo);
```
FWTK(Firewall Tool Kit)の代わりになるツール

1.はじめに。

Firewall用のアプリとしてFWTK(Firewall Tool Kit)という便利な物があります。proxyツール集です。

> http://www.fwtk.org/

こちらですが、FreeBSDの portsに入っていましたが、長らくメンテナンスが行なわれず廃止されてしまいました。

> http://www.freshports.org/security/fwtk

しばらくはメンテ廃止前のファイルを保存して自前でMakeしてたのですが、FreeBSDのパッケージ管理がpkg_add から pkgに更新されてしまって、コンパイルもファイルをたくさん修正する必要があり、簡単に出来なくなったので代わりのものを探してみました。

2.FWTKのどんな機能を使ってたのか?

FWTKのほとんどのproxy機能はDeleGateで代用できます。

> http://www.delegate.org/

一つだけ実現できなくて困ってた機能がありました。

FWTKは送信元アドレスによってproxyの挙動を変更できました。

たとえば許可の与えたＩＰではセキュリティがゆるいモードで動作する内部サーバに転送、それ以外のＩＰでは厳しいモードで動作する内部サーバに転送。

本作業は、外向けのサーバを二つ準備するのがもっとも簡単なのですが、面倒なので外向けは一つでしたい。

今回DeleGateのマニュアルをよくよんだら、DYCONFで送信元IPで挙動を切り替えることができることがわかりました。

> http://i-red.info/docs/Manual.htm?DYCONF

こんな感じで記述する事になると思います。XXはゆるい動作モードのサーバ、YYは厳しい動作モードのサーバという形になるかと思います。

```
/usr/local/sbin/delegated -P NUM \
    DYCONF="{from/192.0.2.0/24},arg:{SERVER=XX}" \
    DYCONF="{from/*},arg:{SERVER=YY}" ADMIN=あなたのメール
```

やった。FWTKを廃止できた！

3.蛇足(IPアクセス制限)
DeleGateのIPアクセス制限はRELIABLEで行ないます。

> http://i-red.info/docs/Manual.htm#RELIABLE

しかしDeleGateは引数が長くなり、可読性が悪いので、inetd起動の設定を行ないました。

inetd起動にする事により/etc/hosts.allowによる接続制御が可能になります。アクセス管理ファイルが一つに集約できるという利点があります。

> http://www.delegate.org/delegate/howto/startup/

inetd起動の場合は-Pオプションが不要です。またDeleGate固有の点として動作ユーザがnobodyになるので実行ユーザをrootと記載しない事に注意して下さい。

サービスEXAMPLEを起動するときの例を記載しておきます。

```
/etc/inetd.conf
---
example     stream  tcp     nowait  nobody  /usr/local/libexec/delegate/example.sh example.sh
---
```

```
/etc/hosts.allow
---
example.sh: 許可IPその1: allow
example.sh: 許可IPその2: allow
example.sh: ALL: deny
---
```

なお導入後は必ずアクセス拒否などが出来ている事を確認してください。
railsでgrape と RSpecでapiのTest

# はじめに
grapeで作成したapiをRSpecを用いてtestする方法の導入について書きます。
apiは実装済みを想定していて、今回は
```/api/v1/users```
で```User.all```を返すapiがあるとします。

なお、私が利用しているrspecのversionは3.4です。(version 3で書き方が変わったようです)

# rspec-railsのインストールとセットアップ
[本家github](https://github.com/rspec/rspec-rails)を見ればわかると思いますが、ここにも書きます。

- Gemfileに追記

```rb:Gemfile
group :development, :test do
  gem 'rspec-rails', '~> 3.0'
end
``` 

- ```$bundle install```
- ```$rails generate rspec:install```

これで、rpecのインストールとセットアップ完了です。
```$bundle exec rspec```でテストを実行できます。(今は0個ですが)

# api用のテストコード作成
セットアップした際にspecディレクトリが作成されます。
その下にapiディレクトリを作成し、さらにusers_spec.rb(名前は自由)を作成します。
あとはテストコードを書くだけです。
テストコードの書き方は下記を参照すると良さそうでした。

- http://qiita.com/jnchito/items/42193d066bd61c740612
- http://rspec.info/documentation/
 
今回はサンプルとして、```/api/v1/users```にアクセスすると下記の3つに関してテストするコードを記します。
User.allと同一であるとかのテストはめんどいのでしません。
返ってくるjsonの中のcreated_atとupdated_atを消さないとfind_byで見つけてくれませんでした。

1. status codeは200が返ってくる
2. 返ってくるjsonはArray型である
3. Arrayの中身はUserテーブル内にデータとして存在する

```rb:spec/api/users_spec.rb
require 'rails_helper'

describe "users api", :type => :request do
  it "returns users list" do
    User.create(name: "hoge", email: "hoge@examle.com")
    User.create(name: "piyo", email: "piyo@examle.com")
    User.create(name: "fuga", email: "fuga@examle.com")

    get "/api/v1/users"
    expect(response.status).to eq 200

    body = JSON.parse(response.body)
    expect(body).to be_an_instance_of Array
    body.each { |u|
      u.delete("created_at")
      u.delete("updated_at")
      expect(User.find_by(u)).to_not be_nil
      #expect(User.find_by(id: u["id"], name: u["name"], email: u["email"])).to_not be_nil
    }
  end
end
```

# 最後に
まだrailsもテスト駆動開発も始めたばかりなので、もっと調べないと。。。
[この辺](http://qiita.com/izumin5210/items/de614b5b5b2c44486e87)読んで勉強します。
Python+FalconでWebAPI

# PythonでちょっとしたWebAPIをやろうとしたら……
まさにちょうどいい記事が公開されてました。
[Python - Falconで光速のWeb APIサーバーを構築する - Qiita](http://qiita.com/icoxfog417/items/913bb815d8d419148c33)

[Falcon - The minimalist Python WSGI framework](http://falconframework.org/)
[falconry/falcon](https://github.com/falconry/falcon)

この記事では`simple_server`を使ったやり方で書かれていましたが、ここでは推奨のGunicornを使ってみます。
[Gunicorn - Python WSGI HTTP Server for UNIX](http://gunicorn.org/)
[benoitc/gunicorn](https://github.com/benoitc/gunicorn)

## インストール
全部まとめてpipで
```
pip install --upgrade cython falcon gunicorn
```

### サンプル
[Falcon Web Framework (http://falconframework.org)](https://gist.github.com/kgriffs/90837585fa4aca475229#file-sample-py)
を参考に

```py:sample.py
# -*- coding: utf-8 -*-
# sample.py
import falcon
import json

class ItemsResource:
    def on_get(self, req, resp):
        """Handles GET requests"""
        items = {
            'title': 'Python+FalconでWebAPI',
            'tags': [
                {
                    'name': 'Python','versions':[]
                },
                {
                    'name': 'Falcon','vresions':[]
                }
            ]
        }

        resp.body = json.dumps(items,ensure_ascii=False)

api = falcon.API()
api.add_route('/items', ItemsResource())
```

`wget http://localhost:8000/items`でアクセスすると

```json
{"tags": [{"name": "Python", "versions": []}, {"vresions": [], "name": "Falcon"}], "title": "Python+FalconでWebAPI"}
```
無事取得できましたとさ。めでたしめでたし。
pyenvでPythonがSystemバージョンから切り替わらない時の対処

pyenvでPythonバージョンを切り替えたはずなのに切り替わらない時の対処方法

```
$ which python
/usr/bin
```
となるときはpyenvがインストールされている/usr/localよりPythonがデフォルトでインストールされている/usr/binの優先度が高くなっているので、

```
$ vim /etc/paths

/usr/bin
/bin
/usr/local/bin
/usr/sbin
/sbin
/usr/local/sbin
```
を


```
/usr/local/bin
/usr/bin
/bin
/usr/local/sbin
/usr/sbin
/sbin
```
として/usr/local/~の優先度を上げる。

```
$ which python
/usr/local/bin/pyenv
```
となってくれるはず。

それでも切り替わらない場合は、
~/.bash_profileで設定したはずの

```
eval "$(pyenv init -)"
```
が実行されていないと思われるのでターミナルで直叩きしてみよう。
なぜかターミナルを開いた時に実行されないことがある。
（すまねえshell語はさっぱりなんだ）
→(追記)~/.bash_profileでコメントされてただけでちゃんと実行されます(プログラマの屑が！)
Raspberry Pi 2 (Raspbian: jessie) でIPアドレスを固定する

# 概要

Raspbian WheezyでIP固定化する方法は簡単に見つかったが、Jessieでは方法が異なっていたため、設定方法を記録しておくことにします。

# 設定内容

Wheezyでは /etc/network/interfaces を編集することで固定IP化できましたが、Jessieでは有効になりませんでした。

interfacesファイルをよく見ると、以下のようなコメントが記述されています

```
# Please note that this file is written to be used with dhcpcd
# For static IP, consult /etc/dhcpcd.conf and 'man dhcpcd.conf'
```

そこで、dhcpcd.confのmanを見てみる。以下のような記述が

```
     static value
             Configures a static value.  If you set ip_address then dhcpcd
             will not attempt to obtain a lease and just use the value for the
             address with an infinite lease time.

             Here is an example which configures a static address, routes and
             dns.
                   interface eth0
                   static ip_address=192.168.0.10/24
                   static routers=192.168.0.1
                   static domain_name_servers=192.168.0.1

             Here is an example for PPP which gives the destination a default
             route.  It uses the special destination keyword to insert the
             destination address into the value.
                   interface ppp0
                   static ip_address=
                   destination routers
```

そっくりそのまま使えそうなので、/etc/dhcpcd.confに以下のように追記して再起動。

```etc/dhcpcd.conf
interface eth0
static ip_address=192.168.0.15/24
static routers=192.168.0.1
static domain_name_servers=192.168.0.1
```

設定したIPアドレスに固定されました。
この例は有線LAN(eth0)を使った例なので、無線の場合は調べてみてください。
Rails | migration で t.timestamp が動かない？

timestamp (単数形) ではなくて timestamps (複数形) で書くこと。

単数形で書いても、特にエラーも出ないので注意。

```rb:db/create_example.rb
class CreateExample < ActiveRecord::Migration
  def change
    create_table :example do |t|
      t.string :requester
      - t.timestamp
      + t.timestamps
    end
  end
end
```

「created_at と updated_at の二個を作るので複数形」だと覚えれば良い。

# 環境

- Rails 4.0.13



<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
QtCreator3.6RC1を使ってみる

[QtAdventCalender](http://qiita.com/advent-calendar/2015/qt)7日目の記事です。

昨日はtaura_noさんの.uiファイルのレイアウトのわかりやすい説明でした。
http://taurano.hatenablog.com/entry/2015/12/06/223018
コードで書くよりお手軽だし、イベントなどのQtの仕組みとマッチしてて使いやすいですよね。

今回の私の記事ではまたQtCreatorについて書きます。
QtCreator3.5が自分の環境に合わず(なぜかカクつく)、修正が待てなかったので正式リリース前のQtCreator3.6RC1の紹介をしちゃいます。

# 1. 賢くなったコード解析
[公式ブログ](http://blog.qt.io/blog/2015/10/27/qt-creator-3-6-beta1-released/ "Qt Creator 3.6 Beta1 released")(3.6beta1の記事)によると、Clangによるコードモデルが改善されたことをメインに扱っているようです。

##用語解説
###Clangって何？
すごいコンパイラ。
詳しくは検索すると良い解説がある。
LLVMっていうものに含まれている。
最近はWindowsとも仲が良さそうで嬉しい。

###コードモデルって何？
実行のためのコンパイル結果ではなく、IDEがコードを解析するためにコンパイルしたもの。
ここが優れていると補間やリファクタリングが賢くなり、わかりやすい警告を吐くようになる。

##使い方

1.LLVMをインストールする。
[ダウンロードページ](http://llvm.org/releases/ "LLVM Download")
![2015-12-06_00h28_27.png](https://qiita-image-store.s3.amazonaws.com/0/22327/d71fa4e7-0291-7ae6-8e11-a5340acfe7e4.png)

2.環境変数LLVM_INSTALL_DIR にインストール先を指定する。

3.QtCreatorでプラグインを有効にする
メニューのヘルプ>プラグインについてから確認。
変更後はQtCreatorを再起動。
![2015-12-06_00h33_33.png](https://qiita-image-store.s3.amazonaws.com/0/22327/7a7ab678-45ee-2442-8ad2-c5a8ccdbddd0.png)

4.オプションからClangコードモデルを有効にする
![2015-12-06_00h37_42.png](https://qiita-image-store.s3.amazonaws.com/0/22327/ae6a0251-698b-c90b-ed05-2080d8462d23.png)


##結果
![2015-12-05_23h49_17.png](https://qiita-image-store.s3.amazonaws.com/0/22327/85612204-e3aa-c0d8-b809-d6c68b05641f.png)
こんな感じで修正提案も含めた親切な警告を出してくれるようです。

これは便利ですね！

 ~~私はQtCreatorが良く落ちるようになったので戻したけど！~~
先生……
![2015-12-17_12h15_57.png](https://qiita-image-store.s3.amazonaws.com/0/22327/dda5a0cf-e7ea-9cbe-7722-15428bae19d3.png)


# 2. モデルエディタ
![qtcreator-modeleditor.png](https://qiita-image-store.s3.amazonaws.com/0/22327/d2a250ba-cf97-3297-d418-d3f175716b43.png)
おお！？
なんか楽しげなのが増えてる。

これもプラグインなのでヘルプ>プラグインについてからModelEditorにチェックを入れてQtCreatorを再起動。

基本的な図を作るだけなら直感的で使いやすいです。
既存のコードから自動生成とかはさすがにないのかな。
今後に期待。

# 3. 設定ファイルを階層表示(個人的に重要)
![2015-12-06_00h57_35.png](https://qiita-image-store.s3.amazonaws.com/0/22327/f75bbe96-1c39-830e-f293-24ae8baa0d42.png)
priから別のpriをincludeすると今までフラットだったのが、ちゃんと階層になってました。
というかなんで今までできてなかったの…

# 4. その他
##QtQuickの何か
今のところ興味ないから読み飛ばしたけど、何か書いてあったような？
##警告やブレークポイントが見やすくなった
これは前からだったかも。
![2015-12-06_01h04_17.png](https://qiita-image-store.s3.amazonaws.com/0/22327/e36a48ec-d0d0-4e5c-023f-f22ff040dd34.png)

#まとめ
まとまりのない紹介になりましたが、以上がQtCreator3.6RC1使ってみつつ調べたことになります。
というか正式リリース後にちゃんとまとめるべきですよね。

AdventCalender次回はまたまたhermit4さんが頑張ってくれるそうです！



#参考
Qt Documentation 「Parsing C++ Files」
http://doc.qt.io/qtcreator/creator-clang-codemodel.html

Qt Blog 「Qt Creator and Clang」
http://blog.qt.io/blog/2011/10/19/qt-creator-and-clang/

Qt Documentation 「Modeling」
http://doc-snapshots.qt.io/qtcreator-3.6/creator-modeling.html
openSUSEのバージョン確認

以下のディストリビュージョンで確認。

# openSUSE 13.2

<pre>
# cat /etc/os-release
NAME=openSUSE
VERSION="13.2 (Harlequin)"
VERSION_ID="13.2"
PRETTY_NAME="openSUSE 13.2 (Harlequin) (x86_64)"
ID=opensuse
ANSI_COLOR="0;32"
CPE_NAME="cpe:/o:opensuse:opensuse:13.2"
BUG_REPORT_URL="https://bugs.opensuse.org"
HOME_URL="https://opensuse.org/"
ID_LIKE="suse"
</pre>

/etc/SuSE-releaseは、なくなる方向みたい・・・。

<pre>
# cat /etc/SuSE-release
openSUSE 13.2 (x86_64)
VERSION = 13.2
CODENAME = Harlequin
# /etc/SuSE-release is deprecated and will be removed in the future, use /etc/os-release instead
</pre>

# openSUSE 12.2

13.2で/etc/os-release無くなるならと思い、
12.2でも確認。

<pre>
# cat /etc/os-release
NAME=openSUSE
VERSION="12.2 (Mantis)"
VERSION_ID="12.2"
PRETTY_NAME="openSUSE 12.2 (Mantis) (x86_64)"
ID=opensuse
ANSI_COLOR="0;32"
CPE_NAME="cpe:/o:opensuse:opensuse:12.2"
</pre>

/etc/SuSE-releaseだと・・・

<pre>
# cat /etc/SuSE-release
openSUSE 12.2 (x86_64)
VERSION = 12.2
CODENAME = Mantis　
</pre>

/etc/os-releaseでいいみたい。

# openSUSE 11.1

<pre>
# cat /etc/SuSE-release
SUSE LINUX Enterprise Server 11 (X86-64)
VERSION = 11.1
</pre>

ちなみに、/etc/os-releaseは存在しない。
<pre>
# cat /etc/os-release
cat: /etc/os-release: No such file or directory
</pre>
DroiduxにReactの代わりはいるのだろうか


* [Droidux: ReduxをAndroidに持ち込んで状態管理から解放されよう！](http://qiita.com/izumin5210/items/549fd15d97e9fc3b1ef7)

@izumin5210さんがReduxのAndroid実装を作ってくれました。

私も最近、JSエンジニアに片足を突っ込み始めまして、React+Reduxを勉強し始めていたところだったので、本来の自分の土俵であるAndroid向けの実装を出していただけたおかげで、理解にかかる時間を削減できそうです。ありがたや。

私が今のところReact+Reduxについて良いと思っている点について、Droiduxだとどうなんだろうと思ったので、ちょっと備忘録として書き残しておきます。ほぼポエムです。

## React+Reduxの雑な良さ

1. データが更新されたら、見た目をそのデータ通りに変えたい
2. 見た目を変えるためにいちいち画面全体を書き換えてたらコストがかかりすぎてチラついたりするので、画面の中でも変更があった箇所だけ更新したい

これらは、クライアントサイドのアーキテクチャとしてはよくある考え方だと思います。

### MV*な場合

MV*なアーキテクチャでは、Modelが更新されたときに更新されたデータに関連するViewへデータが届くようにControllerやPresenterなどが交通整理を行い、状態の管理と描画コストのバランスをとっているイメージです。1も2も満たせていると思います。

ただし、この交通整理が曲者で、「このデータが変わったらViewのこの部分を更新する」という設定を頑張って書かないといけません。頭が悪いとつらいやつです。

### React+Reduxな場合

Reduxは、StoreからViewへデータを渡すときに、今回更新するべきデータはどれなのかなどは一切考えず、表示したいデータ全体を渡しています。普通なら、前述の2の通り、「見た目を変えるためにいちいち画面全体を書き換えて」しまう方法です。Reduxでも、Viewの作り方次第では実際に描画コストの問題が起こってしまうでしょう。

ところが、ReduxのViewをReactで実装する場合、その問題は起こりづらくなります。「画面全体を書き換え」る対象は仮想DOMであり、本物のDOMが書き換わるのはそれまでの画面状態との差分を取って変更があった箇所だけです（雑な理解）。プログラマー側としては雑に画面全体を書き換える操作をしているのに、描画側は最小限のコストで収まるのです。

@izumin5210さんが仰る「雑な扱いができるので頭悪くてもとりあえずいい感じに使えそう」という話は、React+Reduxな状況では、実際そうっぽいなーと私も思っています。（勉強し始めで経験浅いので今後手を動かしながら別の意見を持つかもしれませんが）

ReduxはReactに依存しないアーキテクチャなのは分かりますが、Reactと一緒に使ったときに最も威力を発揮するアーキテクチャであるはずなので、この記事ではReact+Reduxは一緒に使うべきという方向で話を続けます。

## DroiduxにとってのReactは誰？

さて、AndroidにはReactはいません。

前述のとおり、ReduxはStoreからViewに向かって雑にデータを投げつける形で画面更新を実現するため、Viewが描画コストを下げるための仕組みを持っていないと、見た目が悪くなってしまいかねません。

では、DroiduxにはReactはいるのでしょうか？

サンプルを眺めた限りでは、Adapterに可能性を感じました。

### AdapterView + BaseAdapter

AdapterView、つまりListViewやGridViewにおいては、Reactと似たようなことが起こっているように思います。[BaseAdapter#notifyDatasetChanged](http://developer.android.com/intl/ja/reference/android/widget/BaseAdapter.html#notifyDataSetChanged())が、React的な「雑な扱い」を持っているのではないかなと。

ListView+ArrayAdapterを例に挙げると、こんな流れになるでしょうか。

1. ArrayAdapterにリストデータへの参照を登録する
2. ListViewにArrayAdapterを登録する
3. いろいろあってリストデータを更新する
4. ArrayAdapterのnotifyDatasetChangedを呼ぶ
5. 最小限のコストでListViewが更新される

とりあえずデータを更新してnotifyDatasetChanged呼んどけばいいよね！みたいな雑さがあります。（本当にnotifyDatasetChangedのコストは低いのかと言われるとイマイチ自信がないですが）

サンプルで言うと[このへん](https://github.com/izumin5210/Droidux/blob/master/examples/todomvc/src/main/java/info/izumin/android/droidux/example/todomvc/TodoListAdapter.java#L28)かな。

```java
public TodoListAdapter(Context context) {
  super();
  this.inflater = LayoutInflater.from(context);
  this.store = ((App) context.getApplicationContext()).getStore();
  this.store.observeTodoList().subscribe(todoList -> notifyDataSetChanged());
}
```

### それ以外は？

ListViewではないレイアウトも世の中にはたくさんあります。React的に任意のレイアウトの描画コストを減らせる方法は、今のところ確立されていないように思います。

DataBindingってそれっぽい動きをしてくれないかしら・・・とは思いますが、未検証です。

## まとめ

AndroidでReactの立場に立てるものってあるのかしら、と思索してみました。

双方向データバインディングを知ったときも人類を甘やかしてんなーと思ったものでしたが、Reactは更にその上をいく甘やかしっぷりです。人間を駄目にするライブラリです。そして私は駄目になりたい。

魂が震える記事から1年経ってしまったので、JS界隈からは1周遅れといった感じですが、どうにかキャッチアップしていきたいですね。
Node.js 実践講座 〜基礎編〜 その2

# はじめに
この記事では、標準ライブラリの使用方法の解説の一部をご紹介します。標準ライブラリの使用方法では、下記のサンプルプログラムを作成します。

- fsとpathによるファイルIO
- urlとhttpによるHTTPリクエスト送信
- cryptoによるSHA-256ハッシュ計算
- eventsによるEventEmitterの使用

この記事では、fsとpathによるファイルIOのサンプルプログラムを作成します。

# ワークスペースの作成

下記コマンドでプログラムを格納するディレクトリを新たに作成します。

```
mkdir workspace/js/basic/02-standard-library
mkdir workspace/js/basic/02-standard-library/01-fs-and-path
touch workspace/js/basic/02-standard-library/01-fs-and-path/index.js

cd workspace/js/basic/02-standard-library/01-fs-and-path
```

# ファイルの読み込み
`index.js`を編集します、編集後の内容を下記に記載します。

```index.js(ver.1)
'use strict';

var fs = require('fs')
var path = require('path')

if (require.main === module) {
  main({ argv: process.argv })
}

function main(options) {
  var argv = options.argv
  var input = argv[2]

  var file = path.join(__dirname, input)
  var buffer = fs.readFileSync(file)
  var text = buffer.toString()

  console.log(file)
  console.log(buffer)
  console.log(text)
}

```

実行する前に下記の内容のテキストファイルを作成します。

```before.txt
Hello, world!
```

下記コマンドでプログラムを実行します。

```コマンド
node index.js before.txt
```

実行結果の例を下記に示します。

```実行結果
/Users/susukida/workspace/js/basic/02-standard-library/01-fs-and-path/before.txt
<Buffer 48 65 6c 6c 6f 2c 20 77 6f 72 6c 64 2e 0a>
Hello, world!
```

`path.join`はパスを良い感じに連結してくれる関数です。`__dirname`にはソースコードを格納するディレクトリが代入されます。`fs.readFileSync`は指定パスのファイルの内容を読み込み、`Buffer`というデータ型を戻り値とする関数です。`buffer`の`toString`メソッドを呼び出すことによってBuffer型から文字列型に変換することができます。

# 小文字を大文字に変換して表示
ソースコードの内容を下記の通り編集します。

```
'use strict';

var fs = require('fs')
var path = require('path')

if (require.main === module) {
  main({ argv: process.argv })
}

function main(options) {
  var argv = options.argv
  var input = argv[2]

  var file = path.join(__dirname, input)
  var buffer = fs.readFileSync(file)
  var text = buffer.toString()

  var result = text.toUpperCase()

  console.log(result)
}
```

実行コマンドは前回と同様です。

```コマンド
node index.js before.txt
```

実行結果は大文字で表示されます。

```実行結果
HELLO, WORLD!
```

文字列の`toUpperCase`メソッドを呼び出すことにより、文字列に含まれる全ての英字が大文字に変換されます。

# ファイルの書き込み
ソースコードを下記の通り編集します。

```
'use strict';

var fs = require('fs')
var path = require('path')

if (require.main === module) {
  main({ argv: process.argv })
}

function main(options) {
  var argv = options.argv
  var input = argv[2]
  var output = argv[3]

  var file = path.join(__dirname, input)
  var buffer = fs.readFileSync(file)
  var text = buffer.toString()

  var result = text.toUpperCase()

  fs.writeFileSync(output, result)
}

```

実行コマンドには出力先のファイルが追加されます。

```コマンド
node index.js before.txt after.txt
```

実行結果は`after.txt`に格納されます。

```after.txt
HELLO, WORLD!
```

`fs`の`writeFileSync`関数を呼び出すことにより、指定パスのファイルにデータを書き込むことができます。

# おわりに
次回は、urlとhttpによるHTTPリクエスト送信のサンプルプログラムを作成します。
[iOS]Realmがモデルクラスからどのようにしてスキーマを作成しているのか覗いてみる



この記事はRealm Advent Calendarの12月7日分です。iOSでのRealmが、どのようにしてモデルクラスからスキーマを作成してるのか、について調べてみました！

<hr>

Realmでは、下記の様に通常のクラスと同じようにモデルクラスを定義するだけでそれがスキーマとなり、データを格納したり永続化したりすることが出来ます。

```obj-c:dog.h
// Dogというモデルクラスを定義
@interface Dog : RLMObject
@property NSString *name;
@end

```


RLMObjectクラスを継承したモデルクラスを作るだけで、それがスキーマにもなり、モデルクラスにもなる、ということです。圧倒的なお手軽さ＆学習コストの低さ！


しかし、どうやってこの魔法の様な処理を行っているのか気になったので、今回はRealmの公開されているソースを覗いて調べてみました。（全ての実装を見たわけではないので、もしも間違ってる箇所や勘違いしている箇所あればご指摘いただければ嬉しいです！

なお、今回は案件でも普段使いしてるRealm Objective-Cについて調べてみました。

# 定義されたクラスの一覧を取得する
まず、RealmがどうやってRLMObjectを継承したクラスたちを取得しているのかを見てみます。コードを追っていくと`RLMSchema`というクラスの`sharedSchema`というメソッドに、プロジェクト内の全てのクラスを取得しているらしき箇所があります。

```objective-c:RLMSchema.mm
        unsigned int numClasses;
        std::unique_ptr<__unsafe_unretained Class[], decltype(&free)> classes(objc_copyClassList(&numClasses), &free);
        [self registerClasses:classes.get() count:numClasses];
```

`objc_copyClassList`というランタイム関数を呼び出している点に注目です。この`objc_copyClassList`は定義された全てのClassのClass型のポインタ(ややこしい）が格納されたlistを返すメソッドで、例えば下記の様な処理を書くとプロジェクトで利用されている全てのクラスの名前をNSLogに出力することが出来ます。

```obj-c
    unsigned int count;
    Class *classes = objc_copyClassList(&count);
    for(Class *cursor = classes; *cursor != nil; cursor++) {
        NSLog(@"%s", class_getName(*cursor));
    }
    free(classes);
```

# RLMObjectを継承したクラスを判別する
これで全てのクラスが取得できるわけですが、必要なのはRLMObjectを継承したクラスのみです。下記の様なUtil関数を利用して、無関係なクラスをフィルタしていることがわかります。

```obj-c:RLMUtil.mm
BOOL RLMIsObjectSubclass(Class klass) {
    return RLMIsSubclass(class_getSuperclass(klass), RLMObjectBase.class);
}
```

# クラスのプロパティ情報を取得する
次に、スキーマを作成するためにはRLMObjectのプロパティを解析する必要があります。これについてもどのように実現しているのか探してみたところ`RLMObjectSchema`というクラスの下記のメソッドにて、クラスのプロパティを取得する処理が実装されていました。

```obj-c:RLMObjectSchema.mm
 + (NSArray *)propertiesForClass:(Class)objectClass isSwift:(bool)isSwiftClass
```
 
 このメソッドでは、`class_copyPropertyList`というランタイム関数を呼び出し、プロパティの情報を取得しています。class_copyPropertyListの返り値はobjc_propertyというプロパティ情報が格納された構造体です。このclass_copyPropertyListを利用すれば、例えば下記の様に特定のクラスの全てのプロパティの名前を取得することが出来ます。
 
 ```obj-c:RLMObjectSchema.mm
    unsigned int count;
    objc_property_t *props = class_copyPropertyList([self class], &count);
    for (int i = 0; i < count; i++) {
        NSLog(@(property_getName(props[i])));
    }
 ```
 
`property_getName`でプロパティ名が取得できるのと同様に、`property_copyAttributeList`というランタイム関数を呼び出すことでプロパティの型などを含めた各種情報を取得を取得することが出来ます。

# まとめ
この様な操作でクラス名、プロパティ、その型と名前を取得し、Realmがスキーマを生成していることがわかります。Realmを導入する以前プロダクトでSQLLiteを利用していた時には、こうしたスキーマ情報をテーブル作成時に定義して、モデルクラスにも同様にプロパティを定義する、というある意味同じようなことを2重に行っていました。やはりモデルクラスを定義するだけでそこから自動的にスキーマ(テーブル)を作成してくれるRealmは便利だし、もう元には戻れないなー、という感じです。
 
また、このように普段お世話になっているライブラリの内部実装を見てみるのは、面白くもあるしお勉強にもなります。

普段の開発では基本的に上記で説明したようなランタイム機能を使うことはあまりなさそうですが、知っておくとデバッグのちょっとしたツールなどを使う時には便利かもしれません。


参考: [Objective-C Runtime Reference](https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ObjCRuntimeRef/#//apple_ref/c/func/objc_copyClassList)
イラレで作ったアイコンをアートボードごとにSVGで書き出す


## 経緯

過去の投稿、

- [スプライト画像とSVGを効率良く書き出し・コーディングするための考察 [書き出し編] - Qiita](http://qiita.com/soheikitada/items/1ef46137ce4e7fc298fb) 

と、

- [Compassを使ったSpriting最適化 [Retina+SVG編]](http://qiita.com/soheikitada/items/01c6c77bd29eff27adde)

を経て、一定の法則で書き出されたPNG, PNG(2x), SVGの3種類の画像を用意して、Compassでスマートにコーディングすることが出来ました。

最後に積み残し課題となっていた、

> **大量のアイコンデータをイラレで作成して、PNG、SVGで書き出し・素材管理したい場合のベストソリューションを知りたい。** → 自分でスクリプト書く?

についてです。

Illustrator用のプラグインがありました。

- [Smart Layer Export : Adobe Add-ons](https://creative.adobe.com/addons/products/2955)

$9.00ですが、さっそく試してみました。

## インストール

Adobeのサイトで購入して、AdobeのAddo-on配布の仕組みがわからず、自動的にインストールされるのかわからなかったので、[こちら](https://creative.adobe.com/addons/patches/23210/install)からzxpファイルをダウンロードして、Extention Manager経由でインストールしました。

Illustrator CC 2015だと正しくインストール出来なかったので、Illustrator CC 2014を使用しました。



## 使用

書き出したい素材毎にアートボードを用意して (座標に小数点が入らないように注意)、`ファイル > スクリプト > Smart Layer Export` を実行。

![Screen Shot 2015-12-06 at 8.59.36 PM.png](https://qiita-image-store.s3.amazonaws.com/0/20726/9580ffd0-a09f-ca91-7111-85e0fd26bec2.png "Screen Shot 2015-12-06 at 8.59.36 PM.png")


左のパネルで、

- `Export Artboard Images` にチェック
- 書き出したいアートボードを選択
- レイヤーは選択を外す
- `ignore layers out of artboard` にチェック

右のパネルで

- `Fonts -> Outlines` を選択
- `Trim Edges` のチェックを外す (PNGでも同様にチェック外す)
- 書き出し先を選ぶ
- Add FormatでPNGも書き出す。(50%とか200%サイズも指定可)


SVGの `More Options`では

![Screen Shot 2015-12-06 at 9.00.09 PM.png](https://qiita-image-store.s3.amazonaws.com/0/20726/9a188e1c-7f2b-9cb4-70c3-cc5cd467267c.png "Screen Shot 2015-12-06 at 9.00.09 PM.png")

- `Precisions -> 3` (小数点以下の桁数。Sketchで書き出すと7桁なので大きくても良い)
- `Document Encoding -> ASCII` (SketchはUTF-8なので、UTF-8でも良いかも)
- `DTD Version -> SVG 1.1` (初期値のまま)
- 以下も初期値のままで

Exportを実行すればアートボード名がSVGやPNGが書き出されます。

## aiファイルの四角形からアートボード変換のコツ

それと、aiファイル内でガイドになっている四角形をアートボードに変換する際は、 **「線の位置」** を **「内側」** にしてから実行すると、線幅の影響などを受けずに、整数値のアートボードサイズになると思います。

![Screen Shot 2015-12-06 at 11.03.26 PM.png](https://qiita-image-store.s3.amazonaws.com/0/20726/d2dd3aef-aff5-843d-c341-91ce60e02bbc.png "Screen Shot 2015-12-06 at 11.03.26 PM.png")
自分が本当に季節の変わり目に風邪をひくのかtweet履歴を追って調べてみた

風邪を引いています。扁桃腺炎で喉がツライです。季節の変わり目に風邪をひきやすいのかなと勝手に思い込んでいたのですが、調べてたことがなかったので調べてみました。

## 自分のツイートデータを取得する

ぼやきの多いTwitterアカウントを見れば、過去の風邪引いたログが手に入るので、これを月別の傾向を見ればいけそうです。

https://twitter.com/settings/your_twitter_data

ここから自分のTweetデータをCSVでダウンロードすることができます。少し時間がかかるんですが、ダウンロードの準備ができるとメールで知らせてくれます。

## データを加工する

今回はクオートの処理が面倒だったので、csvkitに入っている、csvcutを使いました。

```sh
cd /Users/saku/repos/homework/data/twitter
wget https://ton.twitter.com/i/ton/data/grailbird/56701826/2015/12/07/02/35/56701826_48d35c1de9aaa2585bdb728e2ebc34c2312e4146.zip
unzip 56701826_48d35c1de9aaa2585bdb728e2ebc34c2312e4146.zip
csvcut -c 4,6 tweets.csv | # 日付とツイートを取得
egrep '風邪|体調' | # 風邪・体調不良でgrep
awk 'BEGIN{FS=",";OFS="\t"}{print substr($1,1,4), substr($1,6,2), substr($1,9,2), $2}' # 年・月・日・ツイートをタブ区切りで取得
```

こんな感じの出力になります。

```
2015    12      04      ノドのイガイガから始まるあれ、完成に風邪だよね。忘年会で酒を飲まなかった僕えらいな。
2015    11      18      @usirogami1044 なんかねー体調わるいー
2015    10      08      体調悪っ。今日は早く帰ろう。
2015    04      09      @reeyooo_muu かなぁ。。でも今度は悪寒がすごい。風邪かな？一昨日の生牡蠣かな？それともさっき食べた何か。
2015    04      09      なんか変な感じで体調悪い。なんだこれ。若干の頭痛と気怠さ。
2015    02      17      体調が悪いでござる。
2014    10      24      体調不良&amp;寝不足&amp;出張
2014    05      19      体調わるぅ。
2014    02      20      結局風邪治らんかったな。
2014    01      31      今週は風邪なのに飲み会ふたつも入れて、よくがんばったと思う。まだ終わってないけどね。
```

リプライへの返答とかはダブルカウントになってしまうので、`@`が付くツイートは除外することにして、ファイルに書き出します。

```sh
csvcut -c 4,6 tweets.csv | egrep '風邪|体調' | grep -v '@' | awk 'BEGIN{FS=",";OFS="\t"}{print substr($1,1,4), substr($1,6,2), substr($1,9,2), $2}' > tmp.txt
```

## データを見る

<img width="627" alt="pivot-result.png" src="https://qiita-image-store.s3.amazonaws.com/0/32092/e3587e19-4609-addd-d2b5-750af3db29ce.png">

3月〜8月は発症が比較的少ないですね。

あれ、季節の変わり目じゃなくて、寒さに弱いって感じか？えっと、当たり前のことがわかった感じになっちゃいましたが、今年の冬は暖かくして対策してみるか。

あとは、ぼやきなので情報量が少なすぎるので、病状とかもツイートする必要がありそうですね。

あと、これ手作業で多少の目grepしてfilterのフラグを立てていますｗ

<img width="810" alt="data-sample.png" src="https://qiita-image-store.s3.amazonaws.com/0/32092/2cf0c231-ea3e-8d3b-199f-9cd3c0345b97.png">
External Node Classifiers について

Puppet advent calender 6日目です。昨日は@kijibatoさんによるHieraでの動的リソース定義でした。

http://qiita.com/kijibato/items/7f81d0fcc732fcbb7ca5

### External Node Classifiers の概要

[External Node Classifiers / ENC](https://docs.puppetlabs.com/guides/external_nodes.html) とは、 `node` 宣言をやめて、ホスト名などから適用すべきロールを導出するための仕組みです。

具体例を見るとわかりやすいでしょう。以下のようなRubyのスクリプトがあります。

```rb:enc.rb
#!/usr/bin/env ruby
require 'yaml'

certname = ARGV[0]
hostname = certname.split('.').first

role = case hostname
       when /^([-_a-z]+)$/, /^([-_a-z]+)\d{3}$/
         $1
       else
         raise("Invalid hostname %s" % hostname)
       end

puts YAML.dump({
  'classes' => ['base', role],
})
exit 0
```

これを

```bash
$ ./enc.rb web001.example.com
```

と実行すると、標準出力は以下となるでしょう。

```yaml
---
classes:
- base
- web
```

ENCとは、このように、引数にホスト名（cert name）をとり、標準出力に一定のフォーマットのyamlを吐き出すようなスクリプトを置くことで、動的に利用するクラスその他を指定できるような仕組みです。

ENCは、puppet masterで、以下のような設定を追加すれば使えるようになります。

```ini
node_terminus  = exec
# $vardir/data 配下にデプロイしているとして
external_nodes = $vardir/data/enc.rb
```

puppet をクライアント実行している場合でも、オプションが存在します。

```bash
puppet apply --test --module_path=/vagrant/modules \
  --node_terminus=exec \
  --external_nodes=/vagrant/enc.rb # Vagrantなら。
```

具体的な応用例は月曜の午後に......
Google Feed API代替のAPI＆ライブラリ作ってみた

Google Feed API が使えなくなって困っている人が多いので、代替のライブラリを作りました！

Access-Control-Allow-Originのヘッダを設定していないサーバー、クライアント側で処理するのに大きすぎるフィード等があるため、RSSフィードを直接ブラウザで読み込むのが不可能な場合があるので、バックエンドも用意しました。

レスポンスは、デフォルトでGoogleのAPIより純RSSに近い形式ですが、Google Feed API使っていた人のために、GoogleのAPIのレスポンスっぽい物にするヘルパー関数も用意しました。

### アカウント登録とAPIキー取得

まず[Sekando Web Toolkit](https://toolkit.sekando.com/register)でアカウントを作ってください。ログインすれば、ホストネームの登録が可能になります。「Hostname」の画面からウェブサイトのホストネームを登録してください。Sekando Web Toolkitは、開発環境で無料で使うことができます。**プロダクションで使う場合は月額1080円です。**

<img width="1291" alt="Screen Shot 2017-01-27 at 6.07.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/3768/4b5c7445-6d6d-ec1b-d853-a79313d2f765.png">

ホストネームの登録を完了すると、APIキーを取得できます。

<img width="1291" alt="Screen Shot 2017-01-27 at 6.07.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/3768/3fcb5402-a5c6-542a-d6fc-85897c46f294.png">

### フィードを読み込む

````
<script src="https://static.sekandocdn.net/static/feednami/feednami-client-v1.1.js"></script>
<script>
feednami.setPublicApiKey('3f698f4f37395ab3f1764efd691260209b98f5bd618fa44fa8db198ec0d398ab')
feednami.load('http://devblog.ricky.me/rss.xml')
  .then(feed => {
    for(const entry of feed.entries){
      console.log(entry.title)
    }
  })
</script>
````
    
### Google APIを使っていた人のために

`feednami.loadGoogleFormat`はできる限りGoogle APIに近いレスポンスを返す.例えば、記事の`content`が `<content>`、`<summary>`、`<description>`、いずれか一つの値になる。

````
<script>
  var url = 'http://devblog.ricky.me/rss.xml'
  feednami.loadGoogleFormat(url,function(result){
    if(result.error){
      console.log(result.error)
    }
    else{
      var entries = result.feed.entries
      for(var i = 0; i < entries.length; i++){
        var entry = entries[i]
        console.log(entry.title)
        console.log(entry.contentSnippet) 
        // the first 120 characters of the entry
      }
    }
  })
</script>
````

Website：<https://feednami.com>
中の人のTwitter：[@richardkazuo](https://twitter.com/richardkazuo)
Ghostでブログ環境構築したい男たち

# Start my blog

## NVM

node環境がある場合はGhostのインストールに進んでください。

```
$ sudo apt-get update
$ sudo apt-get install build-essential libssl-dev
$ curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.25.2/install.sh | bash
$ source ~/.bashrc
```

## install node.js & set default version
Ghostは0.10.30推奨(npm v1.4.21) http://docs.ghost.org/ja/installation/

```
$ nvm install 0.10.30
$ nvm alias default 0.10.30
```

確認してみる。

```
$ nvm use default
Now using node v0.10.30 (npm v1.4.21)
```

## Ghost
ソースコードを取得します。

```
$ cd ~
$ curl -L https://ghost.org/zip/ghost-latest.zip -o ghost.zip
```

適当なディレクトリに展開してインストールします。

```
$ unzip -uo ghost.zip -d ghost
$ cd ghost
$ npm install --production
```

## start Ghost(with development mode)
動作確認できたら、Ctrl+c で終了します。

```
$ npm start
```

## download init script
```
$ sudo curl https://raw.githubusercontent.com/TryGhost/Ghost-Config/master/init.d/ghost -o /etc/init.d/ghost
```
- `GHOST_ROOT`変数をGhostをインストールしたディレクトリに変更します。
- `DAEMON`変数が`which node`の実行結果と一致するようにします。

## create user & add permission

```
$ sudo useradd -r ghost -U
$ sudo chown -R ghost:ghost /path/to/ghost
$ sudo chmod 755 /etc/init.d/ghost
```

## add service

```
$ sudo update-rc.d ghost defaults
$ sudo update-rc.d ghost enable
```

## add group to login user
```
$ sudo adduser USERNAME ghost
```
selection.callはどういうときに使うのか

同じ設定を複数のセレクションに対して行いたいとき。
同じ設定を`function`にして呼び出せば使いまわせるので。

```js
// 同じ設定
function common(){
  this.attr(...)
  .on('click',function(d){...});
}

// idが違うだけで他は同じ設定
d3.select('body').append('div')
.attr('id','div1')
.call(common);

d3.select('body').append('div')
.attr('id','div2')
.call(common);

d3.select('body').append('div')
.attr('id','div3')
.call(common);

```
`selection.call`の使い道はほかにもあると思うが、使っているうちに「そうだ！！こういうときに使うんだ！！」という気づきがあり、うれしくて書き込んだ。

以上
OSXにphp7+xdebugをインストール

　⚠︎ 現在はliipのphpをインストールするとxdebugがインストールされ個別にインストールする必要はありません。
　⚠︎ 何かの理由でxdebugをソースインストールしたい場合のみ有用な記事です。

# php7のインストール

バイナリパッケージをインストール

```php
curl -s http://php-osx.liip.ch/install.sh | bash -s 7.0
```

# xdebugのインストール

```
git clone git@github.com:xdebug/xdebug.git
cd xdebug
/usr/local/php5/bin/phpize 
./configure
make
sudo make install
```
※ 現在のXdebug v2.4.0RC3-devはphpStormでの実行でまだ不安定です。

### 設定ファイル設置

```lang:/usr/local/php5/php.d/50-extension-xdebug.ini
zend_extension=xdebug.so
```

### 確認

#### PHP本体とxdebugのバージョン
```
$ php -v

PHP 7.0.0 (cli) (built: Dec  2 2015 13:35:31) ( NTS )
Copyright (c) 1997-2015 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2015 Zend Technologies
    with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2015, by Zend Technologies
    with Xdebug v2.4.0RC2, Copyright (c) 2002-2015, by Derick Rethans

```
#### インストールされている[モジュール](http://php.net/manual/ja/extensions.php)

```
$ php -m

[PHP Modules]
bcmath
bz2
calendar
Core
ctype
curl
date
dom
exif
fileinfo
filter
ftp
gd
gettext
gmp
hash
iconv
imap
intl
json
ldap
libxml
mbstring
mcrypt
mysqli
mysqlnd
openssl
pcntl
pcre
PDO
pdo_mysql
pdo_pgsql
pdo_sqlite
pgsql
Phar
posix
readline
Reflection
session
shmop
SimpleXML
soap
sockets
SPL
sqlite3
standard
sysvmsg
sysvsem
sysvshm
tidy
tokenizer
wddx
xdebug
xml
xmlreader
xmlrpc
xmlwriter
xsl
Zend OPcache
zip
zlib

[Zend Modules]
Xdebug
Zend OPcache
```

# ini編集

```lang:/usr/local/php5/php.d/99-liip-developer.ini
date.timezone = Asia/Tokyo
```

# 感謝

[xdebug](https://github.com/xdebug/xdebug)のパッケージを開発してメンテナンスしている[@derickr](https://twitter.com/derickr)さんに感謝。php7への対応はハードワークだったに違いありません。

 * [wish list](http://www.amazon.co.uk/registry/wishlist/SLCB276UZU8B)

# php5.6.16とphp7.0.0のモジュールのdiff

```
apc
apcu
ereg
http
igbinary
memcache
memcached
mhash
mongo
mssql
mysql
OAuth
pdo_dblib
propro
raphf
redis
solr
ssh2
xhprof
```
Windowsサービス基礎

この記事は[Windows & Microsoft技術 基礎 Advent Calendar 2015](http://qiita.com/advent-calendar/2015/ms)の8日目の記事です。

スタブです。クリスマスまでにはなんとかします。。。

Windowsサービスは、Windowsが管理する常駐プロセスです。常駐プロセスの起動・終了はユーザーの指示によって行うこと（手動）も、Windowsの起動・終了に合わせて行うこと（自動）もできます。LinuxなどのUnix系OSで言えば「デーモン」が近い存在です。

# 管理方法（登録、削除、起動、停止）
サービス制御マネージャ
sc.exe
PowerShellのコマンドレット(Microsoft.PowerShell.Management モジュール)
DSC Service Resource
WMI

# 作成方法
## アンマネージド
advapi32.libを参照、winsvc.hをインクルード
OpenSCManager関数、CreateService関数

## マネージド
ドトネト標準 `System.ServiceProcess` 名前空間 (InstallUtil.exeもあわせて説明)
TopShelf ( http://topshelf-project.com/ )( https://github.com/Topshelf/Topshelf )

# 特殊なサービス: svchost.exe

* タスクマネージャーで確認
* [Process Explorer](https://technet.microsoft.com/ja-jp/sysinternals/processexplorer.aspx)で確認

# サービスアカウント
## ビルトイン・アカウント
* SYSTEM
* LOCAL SERVICE
* NETWORK SERVICE

# セッション0分離
## セッションとは
## セッション0分離とは
Gladiator(GUI tool)で出来ること

# Gladiator
Rails製のROMAのGUI管理Tool
![image](https://qiita-image-store.s3.amazonaws.com/0/103558/da36000a-113d-645f-5c08-abb9de5db7ac.png)

# 紹介スライド
http://www.slideshare.net/rakutentech/gladiator-introduction-slideshare-2

# Github
https://github.com/roma/gladiator

# 機能
## Cluster Control機能
<table>
  <td>
<img src="https://qiita-image-store.s3.amazonaws.com/0/103558/52eeda8a-bfa3-0466-51e1-bd691bff3b56.png" width="400px">
  </td>
  <td>
<img src="https://qiita-image-store.s3.amazonaws.com/0/103558/a4db17ad-9de6-271c-ea9c-f29772c57c14.png" width="400px">
  </td>
</table>
- ROMAのクラスター情報を確認することが出来ます
- instanceの破棄(rbalse/shutdown_self)が可能です
- 担当vnodesの開放(release)が可能です
- エラー時に冗長度の復旧(recover)、進捗の確認が可能です

## status/configuration 確認・変更機能
<table>
  <td>
<img src="https://qiita-image-store.s3.amazonaws.com/0/103558/69d48b2f-9dda-f2d8-d1ad-6ab29159d78d.png" width="400px">
  </td>
  <td>
<img src="https://qiita-image-store.s3.amazonaws.com/0/103558/a03994b2-e487-a94d-a495-dd454f75a323.png" width="400px">
 </td>
</table>
- ROMAの各ステータスを確認することが出来ます
- 各ステータスを(ROMAを非停止で)変更することが可能です


## routing情報
<table>
  <td>
<img src="https://qiita-image-store.s3.amazonaws.com/0/103558/d7036a6a-6104-81e1-b72f-62afe5bb6321.png" width="400px">
  </td>
  <td>
<img src="https://qiita-image-store.s3.amazonaws.com/0/103558/344ade9c-e65f-a5e5-7445-10c17da4e448.png" width="400px">
  </td>
</table>
- routingの情報を取得することが出来ます
- instanceの追加や破棄の履歴を確認することが出来ます
- routing情報をダウンロードすることが出来ます(yaml, json形式)

## Log機能
<table>
  <td>
<img src="https://qiita-image-store.s3.amazonaws.com/0/103558/9334aecc-90a9-c5a8-d4d0-c9b2eb26a2cc.png" width="400px">
  </td>
  <td>
<img src="https://qiita-image-store.s3.amazonaws.com/0/103558/58b8658c-349f-2cde-4006-849d2309ea1a.png" width="400px">
  </td>
</table>
- 各インスタンスのログを取得することが出来ます
- filtering(ログレベル・Logの内容)やsort(日時)が可能です

## Connection Glaph
<table>
  <td>
<img src="https://qiita-image-store.s3.amazonaws.com/0/103558/5b9bcf45-cbae-ed45-dfc0-01b5dee7d22d.png" width="400px">
  </td>
  <td>
<img src="https://qiita-image-store.s3.amazonaws.com/0/103558/1cd1de32-e5c3-53a1-21b0-7b20067f687a.png" width="400px">
  </td>
</table>
- 各インスタンスのコネクション数を確認できます
- ROMA全体でのコネクションリソース(アクセス元)を確認できます

## Data Management機能
<table>
  <td>
<img src="https://qiita-image-store.s3.amazonaws.com/0/103558/8dd740f2-a3d9-0603-d158-332310cf195b.png" width="400px">
  </td>
  <td>
<img src="https://qiita-image-store.s3.amazonaws.com/0/103558/0dce7e00-79cd-edb2-5b06-92d7eaf4af37.png" width="400px">
  </td>
</table>
- dataのgetやsetを行えます
- snapshotコマンドを生成と、進捗の確認が可能です

# 参照URL
ROMA Gladiator User's Guide : http://roma-kvs.org/gladiator.html
R Markdownで定義リスト

## この記事の目的
私が大好きなRMarkdownについて、Tipsを集中的に連載しようという思いつきの企画です。あと自分の中で進めている別企画のメモという位置づけでもあります。なので**大した中身はありません**。

### R Markdownとは
Markdown記法をベースに、チャンクという形でRのコードを記述して評価・出力することができるものです。RStudioのクイックリファレンスでは以下のように説明してあります:

> R Markdown is an easy-to-write plain text format for creating dynamic documents and reports. 

## R Markdownで定義リスト

htmlには`<dl>`などを用いた定義リストというリストがあるのですが、Markdownでの使い方はあまりみかけません。またRStudioのクイックリファレンスにも記載がありません。ですが、R Markdownでも利用することが可能です[^1]。詳細は以下に記載してあります:

- [Pandoc Markdown](http://rmarkdown.rstudio.com/authoring_pandoc_markdown.html#lists)

[^1]: これはPandoc拡張を利用しています。詳細はリンク先の記事を見てください。

### 基本の使い方

以下のように記述すると、定義リストになります:

```
定義用語

:   定義文章の内容です。
```

つまり、定義用語(いわゆる`<dt>`要素)を記述し、一行開けて`:   `の後に定義文(いわゆる`<dd>`要素)を記述します。`:`の後の半角スペースは1〜2ですが、3でもいいです。

### ちょっとした応用

以下のようなパターンでもOKです:

```
用語その1

:   その1の定義内容。

用語その2 *イタリック体*もいれてみる

:   その2の定義内容

        { 用語その2の内容に関するコード部分 }

    その2の定義内容続き。
```

このように、(1)インラインマークアップもok、(2)複数段落にするなら、左に4つスペース入れれれば継承される、となります。定義リストをよく使う自分としては実に助かります。

Enjoy!
PayPal Webhookについて

PayPalには、定期支払い完了時や決済エラー時に指定したURLにデータをPOST送信してくれる
Instant Payment Notification (IPN)という機能があります。

**PayPal Instant Payment Notification**
https://developer.paypal.com/webapps/developer/docs/api/#notifications

これは、PayPalのアカウント管理画面での設定、およびClassic APIのパラメータなどで設定できます。

REST APIには、さらに、この設定自体をAPIで作成できるWebhookという機能があります。

**PayPal Webhook**
https://developer.paypal.com/docs/integration/direct/rest-webhooks-overview/

IPNで、例えば決済する画面ごとに通知先を変えたい場合は、IPNの通知先のURL自体をAPIや決済フォームのパラメータに渡さないとならないため、セキュリティ的に課題が残ったり、URLごとに通知するイベントをコントロールすることはできません。

Webhookの場合、通知の設定ごとにIDが振られ、そのIDを使って通知先の指定やどのイベントを送るか設定できるので、より細かい制御が可能になります。

Webhookで送られるイベントは以下です。

**Webhook Event Types**
https://developer.paypal.com/docs/integration/direct/rest-webhooks-overview/#event-types

PayPal Webhookも、[こちら](http://qiita.com/benzookapi/items/f26fd4b676e473008f0f)でのべたHATEOAS Linkと共に、REST APIの設計において、よく参考にされているモデルです。

ただし、IPNの通知はClassic API、PayPal提供フォーム、REST APIどの支払いについても、管理画面で有効にしている限り通知されますが、Webhookは、REST APIのアプリに紐づくため、そのアプリを使ったREST APIコールよるイベントしか通知されないことに注意が必要です。
スクリプト言語でtelnet使うときの落とし穴 (NetOpsCoding Advent Calendar 2015)

初めまして。[@s1061123](http://qiita.com/s1061123)と申します。

#はじめに
本記事は[NetOpsCoding Advent Calendar 2015](http://qiita.com/advent-calendar/2015/netopscoding)の8日目の記事となります。

昨日は[@niku4i](https://twitter.com/niku4i)さんの"Nagiosの監視変更作業をGitHubを使って楽にした話"でした。ネットワーク装置は今までサーバとは異なる(UI的にもそれ以外も)歴史だったので最近の流れでそれが少しでも解消してくれると嬉しいですね。

僕自身は仕事でたまにネットワーク装置をいじるのですが、その際にやはりスクリプト言語を使って操作の単純化だったり、半自動化だったりすることがあります。もちろん最新の機械だけ対象にする訳でもないのでNETCONF/YangとかRESTとか使えません。そんなインターフェイスは未来のモノです。森山未来です。イケメンですよ。もう。

イケメンではない僕は、未来に生きれない僕は、そして過去の遺物に生きる僕はそんなことはできません。Net::Telnet最強説の暗黒面とは良く言ったものですね。暗黒の、沼の中の経験をベースに本日は現実を直視する感じの泥臭い話として"スクリプト言語でtelnet使う時の落とし穴"について書いてみたいと思います。そんなにコアな話ではないので適当に読んで頂けると幸いです。

まぁ、ぶっちゃけて言ってしまうと"Telnetを話すライブラリを使うか、expect系を使うか？"という話です。スクリプトでTelnetを話す場合には主に2つのパターンがあると思います。一つはTelnetプロトコルを話すライブラリを使うパターンで、もう一つはexpect系のライブラリを使うパターンです。

#Telnetプロトコルを話すライブラリの場合
PerlだとNet::Telnet, Pythonだとtelnetlib, RubyではNet::Telnetのように主な言語ではTelnetプロトコルをライブラリとしてサポートしています。Telnetプロトコルは主にRFC854から861にかけて定義されています。このライブラリを使うことでネットワーク装置にログインして操作することが可能です。PerlのNet::Telnet等だとNet::Telnet::CiscoやNet::Telnet::Netscreen等各社のプロンプトと親和性を持たせた拡張ライブラリも存在します。

#expect系
もう一つはexpect系です。ベースとなっているのはスクリプト言語TclのライブラリであるExpectであり、スクリプトから指定したコマンドを実行し、入出力をスクリプト側でハンドルするライブラリです。PerlだとExpect.pm, Pythonだとpyexpect (python3だとpyexpect-u、後述)、Rubyだとexpectといった形でサポートされています。
ネットワーク装置を操作する場合、Unix等のOSに存在するtelnetコマンドをスクリプト言語から実行して、入出力をスクリプト側でハンドルすることで操作することが可能です。

もちろんどちらでも操作できるのはもちろんですが、いくつかの穴が存在する場合もあります。多くは基本的と言えば基本的なことなのですが、忘れやすいのでまとめてみました。
(もし他にも何か知っているかたがいらっしゃいましたらコメント頂けると幸いです)

#端末のエスケープシーケンスにまつわる問題
例えば一画面で捌けない行数のアウトプットを出す場合、装置側で"---More---"みたいな形でアウトプットを小分けに出すページャー(Pager)という機能があります。ANSIで規定されている端末のエスケープシーケンスを利用して実装している機能です。人が見る際には便利ですが、スクリプト等から呼ぶ場合には使いたくない機能の一つですね。通常装置側の設定やCLIのコマンドでページャーは無効化できます。ですが、いくつかの装置では長時間の処理を行なう際のプログレスバー等を表示する際に同様にエスケープシーケンスを利用して出力を行なう場合があります。
いくつかのTelnet実装では端末のエスケープシーケンスをフルに実装していない為、こういった出力を上手くハンドルできない可能性があるので、その装置の処理の際の出力をよく確認してライブラリを選ぶと幸せになれます。

#expectモジュールを使った場合のプロセスの切り忘れについて
expectモジュールを使った場合、telnet自身はscriptから呼ばれるtelnetコマンド
(/usr/bin/telnet)になります。通常は特段気にすることはありませんが、まれにtelnetコマンドがゾンビプロセスになったまま残る可能性が存在します。実験ではなく実際に使う場合には終了時にそれらの子プロセスが残っていないか確認するのを忘れないようにしましょう。

#Python2/Python3でpyexpectを使う場合
Pythonのexpectのモジュールであるpyexpectを使う場合、その中でもPython3系列でpyexpectを利用しようとすると、Python2とPython3の文字列実装(主にunicode周り)の違いで正常に動きません。もしPython3でexpect系ライブラリを使う場合、pyexpectを使わずにpyexpect-uを使うことで可能です。pyexpect-uはAPI的にはpypexpectと同じなので特に移植には問題はないと思われます。

#おわりに
ということで本日は"スクリプト言語でtelnet使うときの落とし穴"についてお話しました。

明日(12/9)は[@taijijiji](https://twitter.com/taijijiji)さんの"PeeringDB2.0 APIから情報を取得する"です。ISP等でルータ運用の方には必須のpeeringの情報をまとめる話でしょうか。楽しみです。
個人的には明後日(12/10)の[@pitan](https://twitter.com/pitan)さんの"まだexpectで消耗してるの？"が楽しみでなりません。上のような苦労をした人間にとっての天啓がきっと来るのだと思って楽しみにしてます。
Windows Explorerで日付の範囲指定でファイルを検索する方法

以下の様な指定ができますね。

```java:日付範囲指定(..)
更新日:2015/12/1..2015/12/7 *.xlsx
```

```java:日付範囲指定(..)
更新日時:2015/12/1 .. 2015/12/7 AND *.xlsx
```

```java:日付範囲指定(＜＝と＞＝)
更新日:>=2015/12/01 更新日:<=2015/12/07 *.xlsx
```

```java:日付範囲指定＜と＞
更新日時:>2015/11/30 AND 更新日時:<2015/12/08 AND *.xlsx
```