OmniAICreator/Qiita-1.07M huggingface dataset:
Javaでスレッドセーフなコレクションクラスを作る


<del>つい最近までは、スレッドセーフなハッシュマップやリストはjava.util.concurrentのConcurrentHashMapなどで作るもんだと思っていたけど、</del>スレッドセーフなコレクションクラスをどのように定義すれば良いか調べていたら最新のバージョンではCollections.synchronized***で作るのが良いらしい。ということで、簡単すぎるけど、例を紹介して備忘録とする。もちろん、中身はLinkedListなどでも良く、必要なデータ型の特性に合わせて使い分けることができる。ちょっと便利になった気がする。同時にVectorがもはや後方互換のためだけに存在することを知って、愕然としている。学生時代とはずいぶんと変わったものだ。

```java
import java.util.Collections;

…

List<Integer> sampleList = Collections.synchronizedList(new ArrayList<Integer>());
Map<String, Integer> sampleMap = Collections.synchronizedMap(new HashMap<String, Integer>());
```

なお、同期制御をより効率的に行うためには、java.util.concurrentの中のクラスを使うと良いらしい。コメントで教えてもらったので、ここよりも詳細に解説しているurlも載せておく。

* http://etc9.hatenablog.com/entry/20091211/1260625174
<Rails4> と <Angular.js>で検索機能作る

参考になるサイト

http://tech.gmo-media.jp/post/70940891525/angularjs-on-rails

http://www.honeybadger.io/blog/2013/12/11/beginners-guide-to-angular-js-rails

http://asanderson.org/posts/2013/06/03/bootstrapping-angular-rails-part-1.html

RubyとRailsのバージョン

```
ruby '2.0.0'
rails', '4.0.1'
```

RailsとAngular.jsを使って検索機能作る。
#####ポイントは検索結果がリロードなしですぐに反映される事。

gemfileに下記を追加

```:Gemfile
gem 'angularjs-rails'
gem 'angularjs-rails-resource', '~> 0.2.3'
```

angularjs-rails-resourceはAngularJSのモジュールの中にあるngResourceを使うために導入。


フォルダとファイルを作る。

```
% > mkdir -p app/assets/javascripts/angular/controllers \
           app/assets/javascripts/angular/services

% > touch app/assets/javascripts/angular/controllers/article_ctrl.js \
                  app/assets/javascripts/angular/services/article.js \
                  app/assets/javascript/app.js
```

application.jsに下記を記入

```application.js

//= require jquery
//= require jquery_ujs
//= require turbolinks
//= require angular
//= require angular-resource
//= require app
//= require_tree

```

app.jsに下記を記入

```app.js
window.App = angular.module('Ahiru', ['ngResource']);
```

application.html.erbのhtml要素に下記のものを追加

```
<html>  ー＞　<html ng-app ="Ahiru">
```


article_ctrl.jsに下記を記入

```article_ctrl.js
var app = angular.module('Ahiru');


app.controller('ArticlesCtrl', [
  '$scope', 'Article', function($scope, Article) {
    return $scope.articles = Article.query();
  }
]);
```

article.jsに下記を記入

```article.js
var app = angular.module('Ahiru');
app.factory('Article', function($resource) {
  return $resource('/api/articles/:id', {id: '@id'});
});
```


コントローラーはTopCotrollerとArticleControllerの二つ
モデルはArticleのみ

route.rbに下記を記入

```route.rb
Ahiru::Application.routes.draw do
  root to: 'top#index'
  scope :api do
    get "/articles(.:format)" => "articles#index"
    get "/articles/:id(.:format)" => "articles#show"
  end

end
```
モデルを作る

```
% > rails g model article title:string content:text 

% > rake db:migrate
```

```top_controller.rb
class TopController < ApplicationController

  def index
  end

end
```

```articles_controller.rb
class ArticlesController < ApplicationController

  def index
    render json: Article.order("created_at DESC")
  end

  def show
    render json: Article.find(params[:id])
  end

end

```

app/views/top/index.html.erbを作成し下記を記入

```index.html.erb

<h2>記事検索</h2>
Search: <input ng-model="query">

  <div ng-controller="ArticlesCtrl">
    </ul>
    <ul>
      <li ng-repeat=" article in articles  | filter:query ">
        <h3>{{ article.title }}</h3>
        <p>({{ article.content }})</p>
      </li>
    </ul>
  </div>

```


seedファイルに下記のデータを投入

```seeds.rb
title_name = %w(perl ruby python php java) * 6

0.upto(30) do |idx|
Article.create(
  title: title_name[idx],
  content: "避暑地・鎌倉を訪れた大学生の「私」は、由比が浜で見かけた「先生」に興味を持ちます。\n
           言葉を交わすようになりましたが、「先生」の態度はそっけないものでした。回想の物語で \n
           ある本作を語る「語り手の私」は、「先生の亡くなった今日になって、はじめて」、先生は \n
           自分を嫌っていたわけではなかったとわかりはじめたと振り返ります。"
  )
end
```

```
% > rake db:seed
```

完成画像

![スクリーンショット 2013-12-22 13.47.19.png](https://qiita-image-store.s3.amazonaws.com/0/26003/c25a22e6-1a0b-57f4-f033-4996863cfb2c.png)


終了
chef roles のエラー

role を作成してknife solo cookを実行したときに発生したエラー。

```
================================================================================
Error expanding the run_list:
================================================================================


Unexpected Error:
-----------------
NoMethodError: undefined method `run_list_for' for #<Hash:0x000000027e24d8>
```

非常にわかりくいが、roles/xxxx.json に`"json_class": "Chef::Role"`が抜けていたため。

```json
{
  "name" : "xxxx",
  "json_class": "Chef::Role", 
  "run_list": [
   "...."
  ]
}
```
herokuでDJangoページを公開：準備編　myハマりポイント



https://github.com/herokaijp/devcenter/wiki/django
ここを参考にしてやってみて、ハマりました。が、

#### 現在は無事解決できました。 ####

くわしくは下のほうにあるコメントを参照してください。

以下は当時の内容を思い出として残してあるだけなので、あしからず。

-----------

問題なく進んだところについては完全に参考ページのまんまなので、ハショらせていただきます。

herokuにログインしvirtualenvに入り、まずおかしなことになったのはdjango-toolbeltのインストールだった。

```
pip install django-toolbelt
```

そしてエラー。

>Error: pg_config executable not found.

仕方がないのでこのコマンドがインストールしようとしていたDjango, psycopg2, gunicorn, dj-database-url, dj-static, staticで一つずつpip installを試してみることにすると、
##### どうやらpsycopg2がインストールできない模様。#####

ググってみると同じような事例が結構あったが、そのうちの多くは解決策が自分には意味が分からず実行するのが恐かった。そんなこんなで探しているうちに見つけたのがこのブログ。
http://spiri-tua-lism.com/?p=617
##### ここではpip installの代わりにeasy_installするという手法をとっているようだった。#####
考えてみたら自分はpipとeasyの違いを全然理解していないのだが、それでも一番イメージのできる解決策だったのでこれをそのまま真似させてもらった。
でその結果、おそらく正常にインストールされたものと思われる。pip freezeで確認すると、ちゃんとpsycopg2が追加されていた。

ということでそこからまた進めていくと、herokuはcreate、gitはpushまで問題なくクリア。
#### そして、今のハマりポイントに至った。 ####

```
heroku ps:scale web=1
```

このコマンドからの

>Scaling dynos... failed
 !    Resource not found

このエラー。なぜ？
とりあえず作ったページがちゃんとherokuに登録されているか確認。

```
heroku list
```

>=== My Apps
thawing-shelf-8495

自動的に作られた名前のままだがちゃんと表示される。
ググっても対処法が分からないのでとりあえず、

```
heroku restart
```

してみたが案の定変わらず。ログを確認してみるとこんな感じ。

```
heroku logs
```

>2013-12-21T15:32:35.111156+00:00 heroku[router]: at=error code=H14 desc="No web processes running" method=GET path=/favicon.ico host=thawing-shelf-8495.herokuapp.com fwd="220.1.64.3" dyno= connect= service= status=503 bytes=

dyno以降の項目が空になっているようだがこれは・・・・？
C++14: 関数からのreturn-typeを型推論する

C++14では関数の戻り値の型を推論できます。

```cpp
template<typename T, typename U>
auto add(const T& t, const U& u) { // -> decltype(t+u) は要らなくなった!
  return t + u;
}

int main() {
  cout << add(4, 10) << endl;
  cout << add(string("four"), "teen") << endl;
}
```

...ではコレは?

```cpp
// コンテナの0番目を返す
template<typename C>
auto zeroth(C& c) {
  return c[0];
}

int main() {
  vector<int> vi = { 0, 1, 2, 3 };
  ++zeroth(vi); // [*] 0番目をインクリメントする
  cout << vi[0] << endl; 
}
```

残念。auto は cv-qualifier や 参照 を引っぺがし、この例では int と推論されるので(左辺値を) ++ できません。
が、decltypeは"そのまんま"の型となります:

```cpp
vector<int> vi = { 0, 1, 2, 3 }
auto val = vi[0]; // int
decltype(vi[0]) ref = vi[0]; // int&
```

これを踏まえて、decltype(auto) が導入されます。やったね!

```cpp
// コンテナの0番目を**参照で**返す
template<typename C>
decltype(auto) zeroth(C& c) {
  return c[0];
}

int main() {
  vector<int> vi = { 0, 1, 2, 3 };
  ++zeroth(vi); // [*] 0番目をインクリメントする
  cout << vi[0] << endl; 
}
```
Mojoliciousを使っているサービスもしくは企業

Mojoliciousって実際のところ「どーなの？」って時に、どういうサービスやどこの企業が使っているか？を知れると判断基準になるかもしれませんね。MojoliciousのGitHubレポジトリのWikiページにまとめがあります。 **Projects and Companies Using Mojolicious** とズバリなページです。

- [Projects and Companies Using Mojolicious](https://github.com/kraih/mojo/wiki/Projects-and-Companies-Using-Mojolicious#companies)

Companiesのところに有名、無名、もしくは「俺が知らないだけ」なサイトや会社名が並んでおります。

> お、そこも使ってるの...？

と思う名前もありました。例えば

- IBM
- Opera
- YellowBot
- Logitech
- Linode

などです。Linodeは今年の6月にYAPC::NAへ行った際、中の人と話して

> もちろんPerl使っているぜ！

と聞いていたので納得いきますが、フレームワークがMojoliciousとはしらなんだー。といってもユーザーが触るフロントで使われているかはヘッダー覗いても分からなかったんですがね。まーそこそこ海外では実践で大きなところで使われているみたいっす。

で、よく見たら「Bokete」って文字がwww

これ誰が書いたんだろうとWikiページをgit cloneしてきて「git log -p」してみると分かった。

![スクリーンショット 2013-12-22 11.22.50.png](https://qiita-image-store.s3.amazonaws.com/0/22289/035a8f68-7dd2-096e-59b9-076149f70084.png)

当のメイン開発者のSRIが6月3日に追加しとるやないか！ってことはYAPC::NAの発表の影響ですねこれ。ってことでMojoliciousのサービス持っている人はSRIに追加されずとも自分で編集してみるのもいいかもしれませんよ！

** ちなみに今朝の飯写真です。本記事の内容との相関はございません **

![IMG_2586.JPG](https://qiita-image-store.s3.amazonaws.com/0/22289/f71ae344-182e-4809-c758-376c5dd722ab.jpeg)
JSファイルを解析してくれるgrunt-jsvalidateについて紹介するよ

# はじめに

この投稿はGrunt Plugins Advent Calendar 2013の22日目の記事です。
http://qiita.com/advent-calendar/2013/grunt-plugins/

# grunt-jsvalidateとは

EsprimaというJSで実装されたJS解析ライブラリのGruntラッパーです。

- https://github.com/ariya/grunt-jsvalidate
- https://github.com/ariya/esprima
- http://ariya.ofilabs.com/2011/12/introducing-esprima.html

実行速度がべらぼうに高速でThreeJSでも1~2秒で解析可能だそうな。

- https://groups.google.com/forum/#!topic/jshint/eT3dB8_s0ws
- http://www.nczonline.net/blog/2013/07/16/introducing-eslint/

先日発表されたESLintはこのEsprimaをベースに作られているそう。
[JSHntも昔はEsprimaを使おうとしてた](https://github.com/jshint/jshint-next/wiki/Design)っぽいけど今は違う風。

# JSHintと何が違うの

JSHintは文法的なエラーに加えてある程度カンマの位置だとかブレス省略等を注意して、
JavaScriptのGood Partsを提供しようとしますが、Esprimaは実行上不具合が出るものしか
チェックしないので、コードのスタイルを強制されません。
例えば、以下の様なJSを書いたとします。

```js
var foo = 10
  , bar = 20
```

これをデフォルトオプションのJSHintにかけると

```shell-session
[L2:C3] I001: Comma warnings can be turned off with 'laxcomma'.
  , bar = 20
[L1:C11] W014: Bad line breaking before ','.
var foo = 10
[L2:C13] W033: Missing semicolon.
  , bar = 20
```

と、セミコロンがねーよとか、カンマを先頭に書くんじゃねーよ等を言われます。
しかし、grunt-jsvalidate(Esprima)にかけると、`1 files are valid.`となります。
何故ならば、実行上は、`foo`も`bar`が適切に宣言されるからです。

作者は

> It is recommended to include the validation task in your default:

```js
grunt.registerTask('default', ['jsvalidate', 'jshint', 'nodeunit', 'concat', 'uglify']);
```

とデフォルトのタスクに組み込むことを推奨しています。

# 使い方

`package.json`があるプロジェクトルートに移動して、
`grunt-jsvalidate`をインストール。

```shell-session
$ cd ./path/to/your/project
$ npm install grunt-jsvalidate --save-dev
```

`gruntfile.js`は以下の様な感じで。

```js
module.exports = function (grunt) {
  grunt.initConfig({
    jsvalidate: {
      options: {
        globals: {},
        esprimaOptions: {},
        verbose: false
      },
      all: {
        files: {
          src: ['*.js']
        }
      }
    }
  });
  grunt.loadNpmTasks('grunt-jsvalidate');
  grunt.registerTask('default', 'jsvalidate');
};
```
C++17(か!?): resumable / await で 非同期処理を待ち合わせる (コンソールアプリ)

元ネタは:[VisualStudio2013NovCTP：C++17(予定)resumable/await紹介](http://blog.livedoor.jp/haruka_sao/archives/52056922.html)からいただきました。

```cpp
#include <iostream>
#include <thread>
#include <chrono>

// concurrency名前空間
#include <ppltasks.h>
// Nov2013CTP で新たに追加。resumable/await には必須
#include <pplawait.h> 

using namespace std;
using namespace concurrency;

task<void> consume_time(int millisec) __resumable {
    cout << "consume_time: " << millisec << "[ms] ほど眠らせていただきます...\n";
    chrono::milliseconds duration(millisec);
    std::this_thread::sleep_for(duration);
    cout << "consume_time: ...おはよーございますっ!\n";
}

task<void> async_proc(int millisec) __resumable {
    cout << "async_proc: 時間のかかるお仕事をさせ、終わるのを待ちます\n";
    __await consume_time(millisec);
    cout << "async_proc: 完了しました。\n";
}

int main() {
    cout << "main: はじめますよ\n";
    auto task = async_proc(1000);
    cout << "main: まだかなまだかなー\n";
    task.wait();
    cout << "main:: これでおしまい\n";
}

/* 実行結果:
main: はじめますよ
async_proc: 時間のかかるお仕事をさせ、終わるのを待ちます
consume_time: 1000[ms] ほど眠らせていただきます...
consume_time: ...おはよーございますっ!
main: まだかなまだかなー
async_proc: 完了しました。
main:: これでおしまい
*/
```

※ Visual C++ Compiler Compiler November 2013 CTP は http://aka.ms/Icp591 にあります。
ajax_render gemを使ってrailsのajaxを楽に実装する

# ajax_render gem
railsでajax実装するのちょっとめんどくさいなと思っていたので[ajax_render](https://github.com/tkkbn/ajax_render)というgemをつくりました。

## 普通のajax実装
```rb
# config/routes.rb
Dummy::Application.routes.draw do
  resource :test, only: [:index] do
    member do
      post :ajax
    end
  end
end
```

```rb
# app/controllers/tests_controller.rb
class TestsController < ApplicationController
  def index
  end

  def ajax
    @value = params[:id]
    respond_to do |format|
      format.js
    end
  end
end
```

```haml
-# app/views/tests/index.html.haml
.document
  %p some content
  .partial
    Loading ...
```

```haml
-# app/views/tests/ajax.js.haml
:plain
  $(".partial").html(
    "#{escape_javascript(render '/tests/partial', locals: { value: @value })}"
  );
```

```haml
-# app/views/tests/_partial.html.haml
partial content: #{value}
```

```coffeescript
# app/assets/javascripts/test.js.coffee
jQuery ($) ->
  id = 100
  $.post('/tests/ajax', {"id": id})
```

こうなりますね
![](http://gyazo.com/92981121e81b0119ad200ae960bb04f9.gif)

実装するのがこれだけならいいですが、たくさんajaxな処理を実装したい場合は結構大変です。

## ajax_renderを使う
そこで、ajax_render gemを使って`tests_controller.rb`と`ajax.js.haml`の実装を簡略化します。

```rb
# Gemfile
gem 'ajax_render'
```

```rb
# app/controllers/tests_controller.rb
class TestsController < ApplicationController
  def index
  end

  def ajax
    ajax_render '/test/partial', replace: '.partial', locals: { value: params[:id] }
  end
end
```

```haml
-# app/views/tests/ajax.js.haml
-# 不要！
```

ajax_renderが`ajax.js.haml`みたいなのをrenderしてくれるので`ajax.js.haml`は不要になります。
これで実装するのが楽になりました。是非ご活用ください。
localStorageにJSON化して Get & Set

```js:storage(key,val)
/**
 * localStorageにJSON化して Get & Set
 * keyにnull、valにkeyを設定すれば Remove
 */
function storage(key, val) {
  var v = JSON.parse(localStorage.getItem(
    (key === null) ? val : key
  ));
  if (key === null)
    localStorage.removeItem(val);
  else if (arguments.length >= 2)
    localStorage.setItem(key, JSON.stringify(val));
  return v;
}
```
Array#popは削除してなおかつ削除した値を返すので、これもそんな感じにしたかった。

SetするときもRemoveするときも必ず元の登録されていた値を返します。

```js
// Get & Set
storage('foo', 'bar'); // null
// Get
storage('foo'); // 'bar'
// Get & Remove
storage(null, 'foo'); // 'bar'
// Get
storage('foo'); // null
```
参考：[DOM Storage - DOM | MDN](https://developer.mozilla.org/ja/docs/DOM/Storage)、[localStorageを使いこなすための覚え書き | misc](http://www.misclog.com/tech/1021/)
VagrantのDocker provisionerでCentOSのイメージを使う

VagrantのDocker provisionerについては[Docker - Provisioning - Vagrant Documentation](http://docs.vagrantup.com/v2/provisioning/docker.html)に説明があります。

また、[ざっくり分かる Vagrant 1.4 / Docker Provisioner - Shin x blog](http://www.1x1.jp/blog/2013/12/new_features_of_vagrnt14.html)という記事もあります。

今回は、[VirtualBox用のCentOS base boxを作ってGitHub Releasesで共有する](http://qiita.com/hnakamur/items/66a1a1cc0f9b1eeb91f6)で作成したVirtualBox用CentOS 6.5 boxでDocker provisionerを試してみました。

## Vagrantfile

Vagrantfileは以下の通りです。

```
Vagrant.configure("2") do |config|
  config.vm.box = "centos6.5"
  config.vm.network :private_network, ip: "192.168.33.22"
  config.vm.provision "shell",
    inline: "yum install -y xz"
  config.vm.provision "docker" do |d|
    d.pull_images "centos"
    d.run "centos",
      cmd: "echo 'hello world' > /tmp/hello"
  end
end
```

予め以下のコマンドを実行してvagrantのboxを登録しておきます。

```shell-session
$ vagrant box add centos6.5 https://github.com/hnakamur/packer-templates/releases/download/v1.0.1/centos-6-5-x64-virtualbox.box
```

このbase boxは[shiguredo/packer-templates](https://github.com/shiguredo/packer-templates)のテンプレートファイルを使ってPackerで作成したものです。GitHub releaseの機能を使う都合上[hnakamur/packer-templates](https://github.com/hnakamur/packer-templates)にフォークしていますが内容は同じです。作成時のテンプレートファイルは[Release CentOS 6.5 x86_64 VM for VirtualBox 4.3.6 · hnakamur/packer-templates](https://github.com/hnakamur/packer-templates/releases/tag/v1.0.1)から取得可能です。

vagrantのdocker provisioner実行にはxzが必要です。上記のbase boxのCentOSはminimalな構成になっていてxzが入っていないので、[shell provisioner](http://docs.vagrantup.com/v2/provisioning/shell.html)でxzをインストールしています。

private_networkのアドレスは"192.168.33.xxx"で適宜設定するか、不要なら削除してください。

d.pull_imagesでは[Public docker images · dotcloud/docker Wiki](https://github.com/dotcloud/docker/wiki/Public-docker-images#centos-64-base-image)に書かれているオフィシャルのCentOSイメージを指定しています。

d.runのところは、適宜変更してください。ここではテストとして```echo 'hello world' > /tmp/hello```というコマンドを実行するようにしました。

あとはvagrant upするだけで、dockerをインストールして実行してくれます。便利！

```shell-session
$ vagrant up
```

## CentOS 6.5のdocker base imageを使う場合のVagrantfile

[docker用にCentOS 6.5のbase imageを自作する](http://qiita.com/hnakamur/items/8e3136488fcfe763802c)で作成したdocker base imageをhnakamur/centos:6.5として登録してありますので、それを使うようにしたVagrantfileは以下の通りです。

```
Vagrant.configure("2") do |config|
  config.vm.box = "centos6.5"
  config.vm.network :private_network, ip: "192.168.33.22"
  config.vm.provision "shell",
    inline: "yum install -y xz"
  config.vm.provision "docker" do |d|
    d.pull_images "hnakamur/centos:6.5"
    d.run "hnakamur/centos",
      cmd: "echo 'hello world' > /tmp/hello"
  end
end
```
いつのまにやら brew install zsh で良くなっていた話

Mac で zsh を入れる場合は `brew install zsh` ではダメで `brew install --disable-etcdir zsh` で入れるというのは常識でした

というのも `brew info zsh` をするとそのことが書いてあったからです

…というのは昔の話で，いつの間にやら変わっていたようです

[Minor confusion in zsh install warning · Issue #24538 · Homebrew/homebrew](https://github.com/Homebrew/homebrew/issues/24538)

初心者に優しくデフォルトでいい感じにしておこうというみたいです

というわけでこれからは堂々と `brew install zsh` でインストールしていきましょう（もちろん `brew info` で最新情報を確認することを忘れずに）
【作ってみた】カレンダーUI


日付ごとにデータを管理して表示するっていうことをしたくて
一般的なカレンダーのような表示をしたい…
ということで、自分で作ってみました。
きっとこれぐらいのものなら、ライブラリもいっぱい転がってるのでしょうけど、勉強がてら…

ある程度形になったので、いつもの様に？のっけてみる(笑)

----

# ANZCalendar

普通のカレンダー(月単位の)表示を実現。
[ソース](https://github.com/anzfactory/CommonSample/tree/master/CommonSample/Common/ANZCalendar)

* ANZCalendar.h
* ANZCalendarCell.h
* ANZCalendarDataObject.h
* ANZCalendarMenuBar.h
* ANZCalendarNavigator.h

![iOSシミュレータのスクリーンショット 2013.12.22 2.39.17.png](https://qiita-image-store.s3.amazonaws.com/0/33521/49f81553-475b-cd69-0cf5-1b88f7ee150c.png "iOSシミュレータのスクリーンショット 2013.12.22 2.39.17.png")

## できること
* 左右のスワイプで表示月更新
* 各種色の変更
* フォント系の変更
* delegateによる各種タイミングでの処理

## 使い方

```objectivec:呼び出し

ANZCalendar* calendar = [[ANZCalendar alloc] initWithDisplayDate:[NSDate date]];
calendar.delegate = self;
[calendar show];

```

デリゲートでの処理

```objectivec:表示月切り替え

- (void)willRenewCalendarWithNewDate:(NSDate *)newDate
{
	// newDateに切り替わった日付がくるので、
	// そこから何か処理をするとか…持ってるデータの切り替えとか
	NSLog(@"new date :%@", newDate);
}

```
```objectivec:日付を選択した場合

- (void)didSelectDay:(NSDateComponents *)dateComponents
{
	// 選択した日付が返ってくるので、
	// それに伴って処理を行う
	NSLog(@"select day:%@", dateComponents);
}

```

```objectivec:特定日を強調

// 特定の日付を強調して表示したい場合
// 例えば内部で保持しているデータと日付がマッチしてたら…とか
- (BOOL)isStrongDayWithDateComponents:(NSDateComponents *)dateComponents
{
	// YESをかえすと強調される
	// attributesStrong系のプロパティで表示は変更可
	
	// とりあえずの返し
	return ([dateComponents day] % 6 == 0);
}
- (UIView *)accentStrongDayWithDateComponents:(NSDateComponents *)dateComponents cellSize:(CGSize)size
{
	if ([dateComponents day] % 5 != 0) {
		return nil;
	}

	// 何か自分で作って表示したい場合
	// isStrongDayWithDateComponents:で対応できる感じでは物足りない場合？
	UILabel* accent = [[UILabel alloc] initWithFrame:CGRectMake(0, size.height - 20, size.width, 20)];
	accent.text = @"★";
	accent.font = [UIFont systemFontOfSize:12.f];
	accent.adjustsFontSizeToFitWidth = YES;
	accent.backgroundColor = [UIColor clearColor];
	accent.textColor = [UIColor purpleColor];
	accent.textAlignment = NSTextAlignmentRight;
	return accent;
}

```

## memo

collectionview使ってみたので、いい勉強になった。あまり触ったことなかったし。
(とはいってもカスタムレイアウトはつくってないのだけれど…
当初考えていたよりなんか大掛かりになっちゃった。5つクラスつくっちゃった…。

あとは上下スワイプで、年単位の切り替えとかつけるかも。
よくよく見てみたら…曜日表記(Sun/Mon...)がない。。すっかり忘れてた(汗)
zshでbundle execを補完する

# 準備

以下のコマンドで実行ファイルのインストール先を指定する。

```zsh:zsh
$ bundle install --path=vendor/bundler --binstubs=vendor/bin
```

# 設定

- `rake`のための補完関数を定義
- `bundle exec`を実行するための`be`コマンドを作成
- `bundle exec`(`be`)のための補完関数を定義

```zsh:.zshrc
_rake_refresh () {
    if [[ ! -f .rake_tasks ]]; then
        return 0;
    else
        return $([[ Rakefile -nt .rake_tasks ]])
    fi
}

_rake () {
    if [[ -f Rakefile ]]; then
        if _rake_refresh; then
            bundle exec rake --silent --all --tasks | cut -d " " -f 2 | sed 's/:/\\\:/g' | sed 's/\[/\\[/g' | sed 's/\]/\\]/g' > .rake_tasks
        fi
        _values "rake" $(<.rake_tasks)
    fi
}

be () {
    bundle exec $*
}

_be () {
    if [[ -d vendor/bin ]]; then
        _arguments '*: :->'
        if [[ $CURRENT == 2 ]]; then
            _values "bundle exec" `\ls -1 vendor/bin`
        elif [[ $CURRENT == 3 && $line[1] == "rake" ]]; then
            _rake
        else
            _files
        fi
    fi
}

compdef _be be
```

# 参考

[zshでbundle exec(とrake)を補完 - 12FF5B8](http://hico-horiuchi.hateblo.jp/entry/20131213/1386862270)
PHPの複数バージョン管理に php-nabe とかどう?


複数バージョンの PHP を入れようと思ったら有名な phpenv + php-build とか、phpbrew とかありますが、[php-nabe][] ってものもあるよってことでひとつ。

## php-nabe ってどこが良いの?

- PHP をビルドするのに PHP が不要
- RBENV_ なんちゃらみたいに ruby っぽいのがでてこない
- シンプル！

ただ、[php-nabe という名前の PHP version manager を作った « Ooharabucyou](http://www.bucyou.net/blog/804) に理由が書いてある通り、インストール可能な PHP のバージョンリストを内部で持ってないので、インストールする際には自分でバージョンを調べてインストールする必要があります。
この辺は自動で最新のバージョンリストを取得できるような仕組みがあれば本体に取り込まれるんじゃないかと思うので誰か詳しい人は pullreq でも送ればいいんじゃないかな！

## php-nabe のインストール

[php-nabe][] をダウンロードして PATH を通すだけ！ 簡単！

```bash
$ git clone https://github.com/kawahara/php-nabe.git $HOME/.php-nabe
$ $HOME/.php-nabe/php-nabe setup
$ export PATH=$HOME/.php-nabe/bin:$PATH
```

## php-nabe の使い方

### PHP のインストール

インストールは普通にバージョン番号渡すだけ。  
また、PHP の ./configure に渡したいオプションがあれば普通にオプション名渡せばそれがそのまま ./configure のオプションになります。

```bash
$ php-nabe install 5.5.7 --enable-fpm
$ php-nabe use 5.5.7
```

インストールして使用するバージョンの指定が終わったらちゃんとそのバージョンが使われるようになっているか確認してみましょう。

```bash
$ php -v
PHP 5.4.4-10 (cli) (built: Nov 24 2012 11:21:26)
Copyright (c) 1997-2012 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2012 Zend Technologies
```

### Extension のインストール

``php-nabe ext-install``で extension も簡単にインストールできます。

```bash
$ php-nabe ext-install mbstring

$ php -r "echo mb_strlen('あいうえお');"
15
```


### Composer のインストール

最近はこれがなきゃ始まらない [Composer][] も``php-nabe composer-install``で一発インストールできます。

```bash
$ php-nabe composer-install

$ composer --version
Composer version fb72d26def99d08ee32e5be7b553817f585f164e 2013-12-20 10:53:52
```

## zsh補完

[hamaco/php-nabe-zsh-completion][php-nabe-zsh-completion]

補完関数作ってあるので以下の様な感じでコマンドを実行するとコマンドの補完ができるようになります。

```bash
$ mkdir -p $HOME/.zsh/completion
$ cd $HOME/.zsh/completion
$ wget https://raw.github.com/hamaco/php-nabe-zsh-completion/master/_php-nabe
$ echo 'fpath=($HOME/.zsh/completion $fpath)' >> $HOME/.zshenv
$ echo 'autoload -Uz compinit && compinit -u' >> $HOME/.zshrc
$ exec zsh
```

既に補完の設定とかをやった事がある人は _php-nabe を落としてきて、``$FPATH`` が通っている所に置いて下さい。

## chef cookbook

[hamaco-cookbooks/php_nabe][php-nabe-cookbook]

最近話題の chef の cookbook も作ってあるので Vagrant 環境とかに入れてみたい時にちゃちゃっといけます。
ただ、ほぼ自分用になっちゃってるので使いにくい所とかあったら直して pullreq とか貰えると嬉しいです。
使い方とかは README とか見てください。

## Vagrant

[hamaco/vagrant-php-nabe][vagrant-php-nabe]

最近話題の Vagrant のファイルも作ってみたので Vagrant で簡単に試してみることができます。
github から clone してきて``vagrant up``すれば、PHP 5.3, 5.4, 5,5 がインストールされて、php-fpm が設定されてる状態を試せます。

## おわり

こんな感じで結構気軽に使えると思うので気になった人は是非 [php-nabe][] を使ってみて下さい。  


[php-nabe]: https://github.com/kawahara/php-nabe
[php-nabe-cookbook]: https://github.com/hamaco-cookbooks/php_nabe
[php-nabe-zsh-completion]: https://github.com/hamaco/php-nabe-zsh-completion
[vagrant-php-nabe]: https://github.com/hamaco/vagrant-php-nabe
[Composer]: http://getcomposer.org/
reduce に cannot modify ... with immutable members って怒られる

登録日は 12/22 ですが、22 == 0x16 なので 12/16 の記事ということにしましょう。

これがコンパイル通らない。

```d
struct M
{
	immutable int value;
}

auto f(M[] xs)
{
	import std.algorithm : reduce;
	return xs.reduce!((x, y) => M(x.value + y.value));
}
```

```
phobos\std\algorithm.d(763): Error: cannot modify struct result M with immutable members
phobos\std\algorithm.d(784): Error: template instance reduce.f.reduce!((x, y) => M(x.value + y.value)).reduce!(M, M[]) error instantiating
main.d(9):        instantiated from here: reduce!(M[])
main.d(9): Error: template instance reduce.f.reduce!((x, y) => M(x.value + y.value)).reduce!(M[]) error instantiating
```

いくつかの手段がありうると思う。以下、簡単のために reduce のパラメータとして関数は1個に限り、seed なし・empty チェックなし の例を示す。

まず、reduce を再帰に直す方法。

```d
auto reduce(alias f, R)(R xs)
{
	if (xs.length == 1)
		return xs[0];
	return f(reduce!f(xs[0..$-1]), xs[$-1]);
}
```

より range っぽさを残した再帰を行うには reduce の定義を f(x[0], f(x[1], f(x[2], ...))) に変更した方がいいかもしれないが、大した差ではないだろう。

しかし再帰が深くなりすぎて良くない気がする。たとえば f が結合的なものに限れば (この制限はいらない気がしているが、簡単のため残してある)、以下のようにして再帰深度を lg(n) にすることができる。

```d
auto reduce(alias f, R)(R xs)
{
	if (xs.length == 1)
		return xs[0];
	return f(reduce!f(xs[0..$/2]), reduce!f(xs[$/2..$]));
}
```

状態を保持してループを使い、かつ cannot modify with immutable members が出ないようにするには、例えば動的配列の唯一の要素とすればできるが、気持ち悪い。

```d
auto reduce(alias f, R)(R xs)
{
	auto res = [xs[0]];
	foreach (i, x; xs)
	{
		if (i == 0)
			continue;
		res = [f(res[0], x)];
	}
	return res[0];
}
```

どうしよう。いずれにせよ Phobos の実装は、f(x[0], x[1]), f(f(x[0], x[1]), x[2]), ... を同じ変数に入れているせいで immutable member modification が起きているので、改善されるべきではないかと思う。
FTPを使ってアップロードしたメディアをWordPressに認識させる

FTPを使って画像ファイルなどをWordPressのuploadsフォルダにアップロードすると、画像の情報がデータベースに登録されないので、メディアライブラリで見ることができなかったり、色々不具合がある。
しかし、既存サイトをWordPressに移植する時など、大量にアップロードする場合、できればFTPなどで一気にアップロードしたい。
また、バージョン3.4まであった、ファイルのアップロード先を選ぶ機能が無くなり、3.5以降、アップロードしたファイルは皆、uploadsにずらりと並ぶことになる。これはイケてない。
せめて、ブログページで使う画像と、固定ページで使う画像くらいは分けたいじゃないか。
そうなると、自分でuploads以下に適当なフォルダを作って、そこにFTP画像をアップロードすることになるが、やっぱりメディアライブラリで見れないなどの不具合が生じる。
そこで、FTPを使ってアップロードしたメディアをWordPressに認識させるプラグインなんかが無いかな・・・と探してみたら。

ありました。

[WordPress Flash Uploader](http://wordpress.org/plugins/wordpress-flash-uploader/)

ありがとう、Michaelさん。

プラグインをインストールして、設定をする。
英語なので心が折れそうだったけど、ほぼデフォルト設定で大丈夫なようだ。

![設定](http://cl.ly/image/292b2p020J30/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202013-12-22%201.27.08.png)

設定を保存して、試しにuploads＞img＞hoge　というフォルダに４枚ほど画像をFTPでアップロードしてから、管理画面で、メディア＞Sync Media Library　に入ると、Sychronize Media Library　というボタンがある。
ぽちっとするだけ。
メディアライブラリを見てみると、おお～、ちゃんと認識されている！
ところが、隠しファイル .DS_Store までシンクロしてる。設定でなんとかなりそうだが、よくわからないので、今日のところは勘弁してやる。
パンくずナビ





<!-- =================================================== -->
<!-- 01 content -->
<!-- =================================================== -->

    <div id="content">
    
    <div class="breadcrumbs">
    <?php if(function_exists('bcn_display'))
    {
        bcn_display();
    }?>
	</div>
 


<!-- =================================================== -->
<!-- 02 main -->
<!-- =================================================== -->
単一ブログ表示の仕方

	<div id="main">
			<?php 
				if (have_posts()) : 
					while(have_posts()) : 
						the_post();
			?>
            <div class="article">
                 <h2 class="article_title"><?php the_title(); ?></h2>
            		<div class="section">
                    	<?php the_content(); ?>
                 </div>
            </div>
            
            <?php
					endwhile;
				endif;
			?>

	</div>
ActiveLdap をようやく使ってみた。

ActiveLdap でメールサーバのアカウントを取得・表示してみる。

以前は OpenLDAP のライブラリが無いといけなかった気がするが、
改めて試してみたところ [net-ldap](http://rubygems.org/gems/net-ldap) が pure ruby 実装だったので
Windows でもちゃんと動いた！ 嬉しい…

```ruby:sample_activeldap.rb
# coding: utf-8
#
require 'active_ldap'

ActiveLdap::Base.setup_connection :host => 'ldap.example.co.jp', :base => 'o=Example Inc., c=JP'

class User < ActiveLdap::Base
  ldap_mapping :dn_attribute => "cn", :prefix => "ou=example.ad.jp"
end

account      = []
mailing_list = []

User.find(:all).each do |user|
  if user.mailalternateaddress && user.mailalternateaddress.include?(user.mail.sub(/@/, '-default@'))
    mailing_list << user
  else
    account << user
  end
end

puts "account: #{account.size}"
account.each do |value|
  puts "#{value.mail} / #{value.name} #{value.mailforwardingaddress ? '... => ' + [value.mailforwardingaddress].flatten.size.to_s : ''}"
end

puts "\nmailing_list: #{mailing_list.size}"
mailing_list.each do |value|
  puts "#{value.mail} / #{value.name}"
end

exit 0
```

ウチの会社のサーバ固有の attribute もあるのでアレですが、まぁ、参考までという事で。
ディレクトリ名に特定の文字が含まれるとCompassでエラーが出る

Compassで設定ファイル config.rb の内容が間違っている場合、以下のようなエラーが出る。

> Nothing to compile. If you're trying to start a new project, you have left off the directory argument.

ところが、設定ファイルが間違っていないにも関わらず、このエラーが発生した。
（普段使っている開発ファイル群をそのままコピーしただけ）

随分と悩んだが、どうやらプロジェクトを設置している一連のディレクトリに特定の文字が入っているとエラーが発生してしまうようだ。
私が遭遇したエラーは、`` [ ``（角括弧）という文字がディレクトリに含まれるためだ。

他の文字でもこのエラーは発生するのかもしれないが、詳細は不明。
原因について説明できる方がいれば、コメント頂きたい。
おれのさぶらいむてきすとのせってい

# おれのさぶらいむてきすとのせってい
『おれのさぶらいむてきすと Advent Calendar 2013』の22日目の投稿となります。  
昨日のエントリは[TalesofFox](#http://qiita.com/TalesofFox/items/657cb8e35071c15ad325)さんでした。 

今回の投稿、いい機会なのでSublimeText3を導入することにしたかったけど、  
いろいろ動かないパッケージとかあったんで一旦保留することに。  
ここではSublimeText2で導入した設定やテーマ,パッケージをまとめています。  

## テーマ
[Flatland Dark](https://github.com/thinkpixellab/flatland)を使っています。  
導入は、PackageControlから`Flatland`と入力して`Enter`で可能です。  

## インストールしているパッケージ
* AutoFileName
* ConvertToUTF8
* Compass
* Emmet
* LiveReload
* Markdown Extended
* Markdown Preview
* SideBarEnhancements
* Sass
* SassBuild
* Scss
* Tag

----
## Settings-User
以下、個人的に設定している項目です。  

	{
		//カラースキーム
		"color_scheme": "Packages/Monokai Extended/Monokai Extended Bright.tmTheme",
		//プラグインエラーの回避
		"detect_slow_plugins": false,
		//Emmet有効で日本語変換確定後に文字が消えるのを回避
		"disable_formatted_linebreak": true,
		//Emmet有効でHTMLでのphp展開を正しくする
		"disable_tab_abbreviations": true,
		//Emmet有効で日本語キーボードを使っている場合はfalse
		"enable_emmet_keymap": false,
		//空白スペースを可視化
		"draw_white_space": "all",
		//フォントの種類
		"font_face": "Ricty Discord Regular",
		//フォントサイズ
		"font_size": 14.0,
		//Tabのサイズ
		"tab_size": 4,
		//行間
		"line_padding_top": 2,
		//カーソル行をハイライト
		"highlight_line": true,
		//使用しないパッケージ
		"ignored_packages":
		[
			"Vintage"
		],
		//Line80にルーラ表示
		"rulers":
		[
			80
		],
		//テーマ
		"theme": "Flatland Dark.sublime-theme"
	}


## Key Bindings
`Key Bindings > User`は以下を設定。  

	[
		// Ctrl + Tabで、タブの順番に切り替わるようにする
		{ "keys": ["ctrl+tab"], "command": "next_view" },
		{ "keys": ["ctrl+shift+tab"], "command": "prev_view" },
		{ "keys": ["ctrl+pagedown"], "command": "next_view_in_stack" },
		{ "keys": ["ctrl+pageup"], "command": "prev_view_in_stack" },
	]

`Key Binding - Default`は以下をコメントアウト。  
### F7でビルドを無効
	// { "keys": ["f7"], "command": "build" },

### 日本語変換中にTabを押せるようにする
	// { "keys": ["tab"], "command": "insert_best_completion", "args": {"default": "\t", "exact": true} },
	// { "keys": ["tab"], "command": "insert_best_completion", "args": {"default": "\t", "exact": false},
	//   "context":
	//     [
	//       { "key": "setting.tab_completion", "operator": "equal", "operand": true }
	//     ]
	// },

ST3の場合、`Key Binding - Default`は初期状態だと編集できないので、自分で作る必要があります。  
`Aplication Support > Sublime Text 3 > Packages`内に`Default`フォルダを作り、  
`Default (OSX).sublime-keymap`を入れたら編集できるようになるはずです。  

以上、おれのさぶらいむてきすとのせっていはこんな感じです。
日本語検索について、私の環境では上記の通りにしていると特に問題なく検索できています。
一度試してみてはどうでしょー。

明日は[quattro_4](http://qiita.com/quattro_4)さんです！よろしくおねがいします！
Cygwinでoh-my-zshを入れてみる

## Windowsにおけるコマンドライン環境

何番茶煎じだよ。
Windowsでターミナルを使おうと思うなら、コマンドの豊富さとかそういうところを
考えてみてもやっぱりCygwinだと思うんですよ。
僕はMacメインなので、oh-my-zshをWindows、というかCygwinでもガリガリ使いたいなって
思ったんです。

## Cygwinを入れる
### 普通にCygwinを導入する
#### Cygwin公式ページ

http://cygwin.com/install.html

ダウンロードリンクをクリックして、ウィザード立ち上げて…
とりあえずgitとsvnを入れてみるといいでしょう。

http://www.crystal-creation.com/software/technical-information/tool/compatibility-layer/cygwin/setup/install.htm#apt-cyg

## パッケージツールをぶっこむ
### apt-cygを入れる

#### 公式
https://code.google.com/p/apt-cyg/

apt-cyg updateでエラる
http://qiita.com/DQNEO/items/f49d5a534eee6c3352a8

なお、公式にはこのように書いてあります。

```
If you find something that is not working or not compatible with a newer version of Cygwin, the easiest way to fix it is to fork the Github version: https://github.com/transcode-open/apt-cyg
```

### zshを入れる

```
$ apt-cyg install zsh
```

### zshを使えるようにする

(デフォルトがbashなので)
http://futurismo.biz/archives/1363

ここまで来たら、もうcloneするだけですね。

### oh-my-zshを入れる

https://github.com/robbyrussell/oh-my-zsh

### オマケ

http://d.hatena.ne.jp/hab_kun/20101121/1290312345
Elixir プロジェクトを Travis で CI する方法

:warning: ここに書いてある内容はすでに古い可能性があります。2015/02/07 現在で beta ですが、travis 側でも Elixir プロジェクトのサポートが入っていて、それに従うだけで Elixir プロジェクトを CI できます。詳しくは以下を見てください。

http://docs.travis-ci.com/user/languages/elixir/

___

やることは2つあります。

1. travis ci で対象プロジェクトを有効に設定
2. GitHub に`.travis.yml`を push

今回は後者の設定ファイルの書き方を扱うので、1. については参照先だけ載せて簡単に。

## travis ci で対象プロジェクトを有効に設定

Travis CI で対象となるプロジェクトを有効にしておきます。
http://mochizblog.heroku.com/21 こちらの記事などを参考にサインアップ、プロジェクトの設定をしてください。

## `.travis.yml` の書き方

色々と Elixir のプロジェクトにある`.travis.yml`を見てみましたが、比較的よく使われてそうなものを一例として紹介します。
これをプロジェクトのトップディレクトリに`.travis.yml`として保存して、git push して GitHub に反映することで、travis 側で CI してくれます。

```yaml:.travis.yml
language: erlang
otp_release:
  - 17.0
before_install:
  - wget http://s3.hex.pm/builds/elixir/master.zip
  - unzip -d elixir master.zip
before_script:
  - export PATH=`pwd`/elixir/bin:$PATH
  - mix local.hex --force
  - mix deps.get --only test
script:
  - mix test
```

やっていることは、以下の通り。

- 言語として Erlang を選択
- Erlang の OTP リリースバージョン指定
- Elixir のダウンロード、解凍、PATH 設定
- テスト対象プロジェクトの deps.get
- test の実行

### 余談

ちなみに最初に記事を書いたときは Elixir ダウンロード部分が以下のように Elixir を git clone して、コンパイルするスタイルにしてました。しかし最近書かれているライブラリを見ると、ほとんどがダウンロードして解凍するようになっています。実際に [ltsvex](https://github.com/ma2gedev/ltsvex) で試してみたところ、今まで 100 秒かかっていた Elixir のコンパイル処理がなくなり、1 秒かからないくらいで test 環境が整うようになりとても快適になりました。

```yaml
before_install:
  - git clone https://github.com/elixir-lang/elixir
  - cd elixir && make && cd ..
```

## 設定例

試しに ltsvex で設定してみましたので、ご参考にしていただければと。
https://github.com/ma2gedev/ltsvex/blob/master/.travis.yml

## おまけ

以下を README.md に記載しておくと、GitHub で見たときに Build Status バッジをつけれます。`ma2gedev/ltsvex` となっている箇所を自分のものに変更すれば設定できます。
`[![Build Status](https://travis-ci.org/ma2gedev/ltsvex.png?branch=master)](https://travis-ci.org/ma2gedev/ltsvex)`


## SEE ALSO

http://about.travis-ci.org/docs/user/languages/erlang/
https://github.com/myfreeweb/httpotion/blob/master/.travis.yml
https://github.com/ericmj/decimal/blob/master/.travis.yml
https://github.com/devinus/poison/blob/master/.travis.yml

----

この記事は Elixir Advent Calendar 2013 の 21 日目です。明日は @keithseahus さんです。
トップページに更新内容を表示



 <!--更新情報一覧を表示する-->

                                    <ul>
								<?php
                                    global $post;
                                    $args = array( 'posts_per_page' => 5 );
                                    $myposts = get_posts( $args );
                                    foreach( $myposts as $post ) {
                                        setup_postdata($post);
                                        ?>
                                        <li>
                                            <span class="date"><?php the_time('Y.m.d') ?></span>: <a href="<?php the_permalink() ?>"><?php the_title(); ?></a>
                                        </li>
                                        <?php
                                    }
                                    wp_reset_postdata();
                                    ?>
                                </ul>
                                <!--更新情報一覧終わり-->
$args = array( 'posts_per_page' => 5 );
→5件記事一覧を表示
APIドキュメントを書くのが楽になるツールまとめ


さいきんREST APIのドキュメントを書いていて、wiki使うのだるいし他に良い方法ないかな〜と調べてた時に見つけたツール群をまとめてみます。

追記: こちらも便利そうなので参考にどうぞ。
[REST APIドキュメント作成ツールはapiary.ioが決定版かもしれない - Qiita](http://qiita.com/horimislime/items/38327a3f4166b7b39eb5?utm_source=chrome-extention&utm_medium=browser-extention&utm_content=notifications)

## swagger

 [Swagger: A simple, open standard for describing REST APIs with JSON | Reverb for Developers](https://developers.helloreverb.com/swagger/)
デモ: [Swagger UI](http://swagger.wordnik.com/)

ソースコード中にAPIの概要を書いておくと、それを元にドキュメントを自動生成してくれる。wikiやmarkdownで書くのと決定的な違いは、↓のようにドキュメント上のformからAPIコールを試すことができる点。

![1387628508.png](https://qiita-image-store.s3.amazonaws.com/0/7325/ae2886e1-066b-eb3a-ee0f-7c748047d26b.png "1387628508.png")

様々な言語のWAFに対応したライブラリも開発されてる。
[Home · wordnik/swagger-core Wiki](https://github.com/wordnik/swagger-core/wiki)


- [Scalatra2.2+scalatra-swaggerでREST APIのリファレンスを生成する #1 ｜ Developers.IO](http://dev.classmethod.jp/server-side/scalatra-swagger01/)
- [Scalatra2.2+scalatra-swaggerでREST APIのリファレンスを生成する #2 ｜ Developers.IO](http://dev.classmethod.jp/server-side/scalatra-swagger02/)

## iodocs
[mashery/iodocs](https://github.com/mashery/iodocs)

node.jsで動作するドキュメントツール。API概要の定義はjsonで記述するようになっていて、こちらもswaggerと同様にページ上でAPIコールを試せるようになっている。iodocsに関しては最近postしたのでこちらもどうぞ。
[iodocsで便利なREST APIドキュメントを作成する - Qiita [キータ]](http://qiita.com/horimislime/items/ed13637c070b99dae959)

![iodocs-screen.png](https://qiita-image-store.s3.amazonaws.com/0/7325/b50d4c1d-198c-3529-e4c2-02d0f39a76d3.png "iodocs-screen.png")

## autodoc
[r7kamura/autodoc](https://github.com/r7kamura/autodoc)

APIのテストケースからドキュメントを自動生成してくれる。Markdownで出力してくれるので、別途Webサーバを起動する必要とかも無し。

- [Autodoc - r7kamura blog](http://r7kamura.github.io/2013/12/01/autodoc.html)
- [Rails でつくる API のドキュメントを自動生成してくれる autodoc がすごい - 彼女からは、おいちゃんと呼ばれています](http://blog.inouetakuya.info/entry/2013/10/20/132928)

## RESTdoclet
[RESTdoclet by IG-Group](http://ig-group.github.io/RESTdoclet/)

JavaでSpringMVCな環境で使うツール。Mavenプラグインとして提供されている。ドキュメント生成にはJavadocやSpringのRequestMapping等のアノテーションを利用するので、生成のために余計なアノテーション等をコードに書かなくていいのが特徴的。

- [IG GroupがRESTdocletをオープンソース化](http://www.infoq.com/jp/news/2012/08/RESTDocletOpenSource)

## carte
[devo-ps/carte](https://github.com/devo-ps/carte)
デモ: [Carte](http://devo.ps/carte/)

Markdownでドキュメント記述ができる。Jekyllベース。swaggerやiodocsと比較してシンプルな作りになっており、APIコールを試す機能は無い。

![1387628935.png](https://qiita-image-store.s3.amazonaws.com/0/7325/c6eca932-de9f-69ca-7f07-5861180b6023.png "1387628935.png")

## まとめ
この手の自動生成や効率化はやり方が沢山ある分、各ツールそれぞれのアプローチが見えて面白いなーと思いました。まだまだ開発途中のものもあり、ちょっと試してて不便に感じる所もあったのですが今後に期待。

wikiやGithub READMEを使い続けるのもいいですが、こうした支援ツールも一度検討してみてはどうでしょうか。
UnityでWindowsストアアプリ開発をしよう


#こんにちは

僕は、１年前にC#,とXAMLで数当てゲームの４ナンバーズと３ナンバーズをリリースしましたが、それ以来しばらくアプリをリリースしていませんでした。

理由は、iPhoneとAndroidのアプリを開発していたからです。どうしても、Windowsストアアプリの開発の優先順位は、３番目になってしまいます。

しかし、Unityというマルチプラットフォーム対応のゲームエンジンを利用してからは、iOS, Android, Windowsストア, WindowsPhone8の４つのApp Storeにゲームアプリをほぼ同時にリリースすることが可能になりました。

なので、Windowsストアアプリのゲームを開発、もしくは開発しようとしている方がいれば、Unityというゲームエンジンをおすすめします。

理由１）開発言語にC＃が使える

理由２）マルチプラットフォーム対応の開発環境として、 Unityが一番優れている。Windowsストアアプリ、WindowsPhoneアプリに書き出せます

理由３そして最大の理由）Unity自体、大変すばらしい開発環境、ゲームエンジンで、とにかく開発が楽しい。とりあえずは無料で開発ができて、簡単に、しかもプロトタイプであればあっという間にゲームがが作れます。

#Unityで作成したゲームをWindowsストアアプリとしてリリースする時のメモ

（このとき僕は、Unity4.2で開発したので、VisualStudio 2012を使用しました。今はUnity4.3がリリースされています。Unity4.3を使用する場合は、VS2013を使用して下さい。）

##Unity側
Screen resolution を320×480 からストア用の大画面 720×1280に変更。
Unity側でネイティブ プラグインを組み込む場合は、Plugins¥Metroの下にコードを置く。

あと、Publishingフォルダを作成し、3つのLogoを追加。(150×150,310×150,30×30)

Logo50x50, SplashScreen620x300も追加する。

##VisualStudio側
WindowsStoreアプリは、Snap viewに対応する必要がるので、App.xaml.csの修正をする。

多言語対応する：stringsフォルダを作り、en-usフォルダを作り、追加-新しい項目-リソースファイルを選択し、Resources.reswを追加する。ここにAppNameとしてアプリの名前を入力する。Copyして、ja-jpをつくる 。

そして、Package.appxmanifestの表示名を ms-resource:AppNameに変更する。

WSAppStoreでアプリ登録する。Korea, South Africa, Brazil, Taiwan, Russiaを抜く（RussiaはPEGIを登録したら追加）

[VS2012のストア-アプリケーションとストアを関連付ける]でアプリを関連付ける。アプリパッケージの作成で、パッケージの選択と構成でx86とARMを選択し(よくわからないが)、Windowsアプリ認定キットを起動する。

パッケージのアップロードを行う。（自分の場合はx86とARM）

Packageを作成し、Uploadしてスクショを追加しSubmitする。

Promotion imageのサイズは、846×468, 558×756, 414×468, 414×80

#Unityで作成したアプリの紹介
Unityで作成したアプリは、全部で５つですが、そのうちの１つをここで紹介します。（よかったらタブレットでプレイしてみてください、プレイ感が違います。）
このアプリは、＠ITの2013流行語アプリ選手権で入賞しました。


##Cube Bomber
http://apps.microsoft.com/windows/app/cube-bomber/9599aa9a-c3fa-4569-b88c-3ec9c7064916

以上、「UnityでWindowsストアアプリ開発をしよう」でした。

Unity 楽しい 最高だ!! by Twitter: @sadaki7
Railsのログにファイル名と行数を表示


ログ上にRails.logger.xxx(したと思われる)ファイル名と行数を表示させたら便利なのかと思いました。


## 方法

```config/enviroment.rb
class Logger
  class Formatter
    def call(severity, time, progname, msg)
      file_name, line_num = caller.map { |x| 
        [Pathname.new($1).relative_path_from(Rails.root).to_s, $2] if x =~ /(.*?):(\d+)/
      }.compact.find { |x|
        x[0] !~ /^(..)\//
      }

      file_name ||= ""
      line_num ||= ""

      format = "[%s #%d %s:%s] %5s -- %s: %s\n"
      format % ["#{time.strftime('%g-%m-%d %H:%M:%S.%3N')}",
                  $$, file_name, line_num, severity, progname, msg2str(msg)]
    end
  end
end
```

```config/enviroment/development.rb
config.logger = Logger.new("log/development.log", 'daily')
config.logger.formatter = Logger::Formatter.new 
```

callerからスタックトレースを取得し、Rails.root配下にあるファイルを発見したらそいつをログに表示します。
スタックトレースを漁るのは重い感じがするけれど、どちらにしろディスクIOの方が遅いから大丈夫。きっと。



## 結果
こんな感じに出ます。

```
[13-12-21 23:15:00.705 #5266 app/controllers/hoge_controller.rb:3]  INFO -- : ルイズ！ルイズ！ルイズ！ルイズぅぅうううわぁああああああああああああああああああああああん！！！
[13-12-21 23:15:00.705 #5266 app/controllers/piyopiyo_controller.rb:3]  INFO -- : あぁああああ…ああ…あっあっー！あぁああああああ！！！ルイズルイズルイズぅううぁわぁああああ！！！ 
```


## 参考
[10Logger!!! （ログにタイムスタンプを追加する方法）](http://rubyist.g.hatena.ne.jp/rochefort/20100310)
[Ruby]  ancestorsが返すもの

Rubyのバージョンごとに`Object`、`Class`、`Array`の`ancestors`を確認してみる。

### 1.8.7

```shell-session
$ ruby -e "p Class.ancestors"
# => [Class, Module, Object, Kernel]
$ ruby -e "p Object.ancestors"
# => [Object, Kernel]
$ ruby -e "p Array.ancestors"
# => [Array, Enumerable, Object, Kernel]
```

### 1.9.2

```shell-session
$ ruby -e "p Class.ancestors"
# => [Class, Module, Object, Kernel, BasicObject]
$ ruby -e "p Object.ancestors"
# => [Object, Kernel, BasicObject]
$ ruby -e "p Array.ancestors"
# => [Array, Enumerable, Object, Kernel, BasicObject]
```

### 1.9.3

```shell-session
$ ruby -e "p Class.ancestors"
# => [Class, Module, Object, Kernel, BasicObject]
$ ruby -e "p Object.ancestors"
# => [Object, Kernel, BasicObject]
$ ruby -e "p Array.ancestors"
# => [Array, Enumerable, Object, Kernel, BasicObject]
```

### 2.0.0

```shell-session
$ ruby -e "p Class.ancestors"
# => [Class, Module, Object, Kernel, BasicObject]
$ ruby -e "p Object.ancestors"
# => [Object, Kernel, BasicObject]
$ ruby -e "p Array.ancestors"
# => [Array, Enumerable, Object, Kernel, BasicObject]
```

1.9.2のときに`BasicObject`が追加されて以降は変更はないようだ。
Sencha app watchについて


※ [Sencha Advent Calendar 2013](http://www.adventar.org/calendars/137) の21日目の記事です。

## 前置き

[前回の記事](http://qiita.com/Tkashiro/items/0c05a03e34296180b1b1) でsencha touchのアプリケーションの更新を関しして、自動ビルド&ブラウザリフレッシュできたらなぁーと [Yeoman](http://yeoman.io/)を使ったテンプレートを作成、記事にしました。

が、その後sencha関連の記事で下記のようなものを見つけました。

[Using the New App Watch Command in Sencha Cmd 4](http://www.sencha.com/blog/using-the-new-app-watch-command-in-sencha-cmd-4/)

まさか、公式にwatchがあるのに、車輪の再発明しちゃったかと焦ったので、そのsencha commandのwatch機能について少々まとめます。

## コマンド

```shell
sencha app watch
```

## 監視対象

* app フォルダ
* sass フォルダ
* resources フォルダ
* touch/src フォルダ (Ext本体)
* touch/sass フォルダ(Ext本体)
* touch/resources フォルダ
* その他theme等(app.js/package.json等に記述)

## 実行内容

* 基本的には`sencha app build`と同じタスクが実行
* 実行後すぐwatch状態に戻る
* watchの詳細な実行内容は `.sencha/app/watch-impl.xml`の中に記載（なかで `build.xml`を読み込んでいる為、基本的に `sencha app build`と同じ動きする）
* もちろん`build.xml`を書き換えれば、好きなようにカスタマイズ可能

## [generator-senchatouch](https://npmjs.org/package/generator-senchatouch)との違い

sencha commnadのwatchはビルドプロセスをするためのものらしいので、起動後はbuild配下に
sassやjsのコンパイル後のファイルが生成されます。

開発中はjsのコンパイルまでは不要なので、sassのみのコンパイルで良いかと思います。
jsはExt.Loaderが必要なソースを依存解決して取得してくれるので。

[generator-senchatouch](https://npmjs.org/package/generator-senchatouch)はsassコンパイルのみで
ブラウザがリロードするので、sencha commandより少々早いかと思います。

また、gruntの他のtaskとも組み合わせれられるので、ビルド時に画像圧縮等も含められるので、
[generator-senchatouch](https://npmjs.org/package/generator-senchatouch)の方がいいのではないかと思ってきました。

ということで、まだビルド部分が未完成な[generator-senchatouch](https://npmjs.org/package/generator-senchatouch)をもうチョット整理してつかって行こうと思います。
laravel4+redis pub/sub 

今回は、laravel4とredisの機能であるpub/subを組み合わせた実装方法を紹介します。

laravel4というか、どちらかというとredis寄りのものですが・・。

**php(Laravel)でのsubscribe受信方法は別で紹介しています。そちらも合わせてご覧下さい** 
[Laravel webscoket(push & pubsub) 後編](http://qiita.com/ytake/items/0a0be973552b7cd055a1)

##pub/sub
redisはmemcache以上の働きをするので、
session, cache以外にnosqlとして重宝してる方も多いのではないでしょうか？
自分も個人の開発で多用したり、会社でも好んで使ったりしています。

websocketと言えばデータストアはredis！といっても良いくらいなんですが、
それにはレスポンスが早いなどももちろんですが、
複数台のwebsocketサーバからmysqlなどのデータベースにつないだ場合、
サーバ01がinsertした後に取得はできますが、
サーバ02はinsertされた事を知る術がありません。
実際にはinsertしたよ！という情報を01から02へサーバ間でsocketでつないで、
通知して云々という方法でしょうか？

**厄介！**

そこで、redisのpub/subという機能を使用します。
この機能は何かと言いますと、publisherとsubscriberの関係をredisで管理でき、
早い話、redisに接続してる他のものに対して通知ができます。
いちいち情報を取得しにいかなくても送ってくれるというありがたい機能です。

そんな機能をlaravel4で使ってみます。
といっても実装自体はものすごく簡単です。

まず必要なものをインストールします。

といってもlaravel4でも使っているpredisのasyncというものを使います。
##hiredis
[hiredes](https://github.com/redis/hiredis)
Cのredisクライアントで、predis-asyncがラッパーしてるそうな

```bash
git clone git://github.com/redis/hiredis.git
cd hiredis
make && make install
```

##predis-async
[predis-async](https://github.com/nrk/predis-async)
composerでいつも通りです。

##では、実装！

```php:app/commands/RedisAsyncCommand.php
use Illuminate\Console\Command;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Input\InputArgument;

class RedisAsyncCommand extends Command {

    /**
     * @var string
     */
    protected $name = 'redis:async';

    /**
     * @var string
     */
    protected $description = "redis async start";

    /**
     * @return void
     */
    public function fire()
    {
		// 接続先
		$client = new Predis\Async\Client('tcp://127.0.0.1:6379');


		$client->connect(function ($client) {
			echo "redis async start!\n";

			$logger = new Predis\Async\Client('tcp://127.0.0.1:6379', $client->getEventLoop());
			// subscriber チャンネルに登録します
			$client->pubsub('subscriber', function ($event) use ($logger) {
				// 受信したメッセージをlistにpush
				$logger->rpush("{$event->channel}", $event->payload, function () use ($event) {
					echo "Stored message `{$event->payload}` from {$event->channel}.\n";
				});
			});
		});
        $this->info('connected!');
        $client->getEventLoop()->run();
    }
}

```

実際にはasync用にfacadeを作って実装した方が綺麗でしょう！
[facadeの作り方](http://qiita.com/ytake/items/266275287f54c31d8525)
predis-asyncのサンプルまんまですね！
redisの subscriberというチャンネルに登録させます(チャンネル名は適当にどうぞ)
受信したデータはredisに保存される訳ではないので、
とりあえずlistに突っ込んでます。

**artisanに登録を忘れずに**

```php:app/start/artisan.php
Artisan::add(new RedisAsyncCommand);
```

artisanで待機状態にさせます

```bash:artisanコマンド
php artisan redis:async
connected!
redis async start!
```

これで待機状態になりました。
では試しにredisからsubscriberチャンネルに大して通知してみます。

```bash:redis-cli
> publish subscriber 'Hello!'
(integer) 1
```

成功したようです。
起動させた待機状態のphpは・・・

```bash
Stored message `Hello!` from subscriber.
```

しっかりと通知を受信する事ができました。
これを元にwebsocketを使用したアプリケーションを作っていけば面白いものができると思います。
pushの実装方法も紹介しましたので、
両方組み合わせて開発をするとモテるかもしれません

新しい技術にも難なく対応できるlaravel4のポテンシャルの高さは凄まじい！(fuelでも同じ事できますが)

明日は@kurikazu さんの簡単デプロイの話 です