OmniAICreator/Qiita-1.07M huggingface dataset:
複数台でクラスターを構成する方法

ROMAクラスターを複数台のserverで構成する方法です。

# 条件
server: <font color='red'><b>2</b></font>台
storage type : memory
ruby version : v2.1
ROMA version : v1.2.0
Installation type : rubygems

# 手順
## 1. install ROMA
```
gem install roma
```

## 2. make instance(Cluster)
- single serverの時はrouting情報を'localhost_${port No.}'で作成していましたが、今回はip address、もしくはhost名に変更します
- 今回はip address(192.168.33.11, 192.168.33.12)で作成します
- `--replication_in_host`オプションはsingle serverで構築する際のデバッグオプションなので、今回は外します

```192.168.33.11にて
mkroute 192.168.33.11_10001 192.168.33.12_10001
ls -l
  -rw-r--r-- 1 root root 35693 Dec  2 05:35 192.168.33.11_10001.route
  -rw-r--r-- 1 root root 35693 Dec  2 05:35 192.168.33.12_10001.route
```

- 192.168.33.12_10001.routeの方を192.168.33.12サーバへ移します
- 今回はscpコマンドで移します(ユーザ名やディクレトリは適宜変更してください)

```192.168.33.11にて
scp 192.168.33.12_10001.route vagrant@192.168.33.12:/home/roma/
```
<font color='red'><b>mkrouteコマンドはどれか一つのserverでのみ実行して、それをコピーしてください</b></font>

- データの分散先をSHA1で作成しています。それぞれのサーバでmkrouteを行うと内容が違うものになってしまいます

## 3. booting ROMA
```:192.168.33.11にて
romad 192.168.33.11 -p 10001 -d
```
```:192.168.33.12にて
romad 192.168.33.12 -p 10001 -d
```

# ステータス確認
```
telnet 192.168.33.11 10001
> stat node
  stats.run_receive_a_vnode {}
  routing.nodes.length 2
  routing.nodes ["192.168.33.11_10001", "192.168.33.12_10001"]
  .
  .
  .
  routing.version_of_nodes {"192.168.33.11_10001"=>66048, "192.168.33.12_10001"=>66048}
  END

> stat repetition
  stats.enabled_repetition_host_in_routing false
  END
```

- `stats.enabled_repetition_host_in_routing`は同host内でのデータコピー(冗長)を許可するかどうかを表します。今回は`--replication_in_host`オプションを外したので`false`になっています。

# 一応データの確認も・・・

```:192.168.33.11にて
> set foo 0 0 3
> bar
  STORED
```
```:192.168.33.12にて
> get foo
  VALUE foo 0 3
  bar
  END
```

ちゃんとreplicationされているのが確認できます


# 参照URL
ROMA Install ROMA Unit : http://roma-kvs.org/learn/main_unit.htmll
ログオン時にPowerShellでHerokuを起こす

とうとうHerokuが新プランへ移行し、フリーで使っているHubotがsleepしだしました。

起きている時間帯は[hubot-heroku-keepalive]の更新で期間指定できるようになったのですが、sleepから起きることはできません。

当初はSlackで発言したら発言チェックの送信でHerokuが起きるかと思いましたが、そうでもない様子。
世間では`heroku scheduler`の利用が一般的なようですが、クレジットカードを登録していないのでアドオンも使えない…

ということで、毎回手動でブラウザからHerokuのアプリケーションアドレスに接続して起こしていたのですが、いい加減面倒なので、`PowerShell`に。

`PowerShell`にせずとも`sh`の`cron`とかでもいいのですが、業務時間に動いていればいいだけなので、今回はログオンをトリガーにしました。


```ps1

Invoke-WebRequest -Uri "起こしたいアプリケーションアドレス" -Method Get -TimeoutSec 1

```

Hubotの場合は`Cannot GET / `かタイムアウトかでエラーになりますが、結果は重要ではなく、アプリにアクセスがあったことで起動します。
(なのでTimeout 1に)
あとは[hubot-heroku-keepalive]がデフォルト5分間隔で自身にpingを打ち起きっぱなしにしてくれます。

ログオン時の起動設定はこちら
[ログオン・ログオフ時にPowerShellを起動しSlackへ通知する【Windows7】 - Qiita]

[hubot-heroku-keepalive]:https://github.com/hubot-scripts/hubot-heroku-keepalive

[ログオン・ログオフ時にPowerShellを起動しSlackへ通知する【Windows7】 - Qiita]:http://qiita.com/khsk/items/d04c059bb43328be1246
[ ruby ] each_with_index のサンプル

## each_with_indexでarrayを加工する

```rb
array = []
sample = %w(a b c d e)
sample.each_with_index { |item, index| array[index] = "#{index}:#{item}" }
p array
=> ["0:a","1:b","2:c","3:d","4:e"]
```
アウトソーシング嫌いのベンチャーが2ヶ月間でオフショア開発でサービスをローンチしてみた ~PJマネジメント編~

# はじめに
某渋谷のベンチャーでCTO(ちょっと、たのしい、おじさん)をしています。
過去の開発をアウトソーシングする試みは、ほぼ全戦全敗。開発案件をアウトソースすることにアンチな方々が多い中、なぜオフショア開発を選択したのか、実際に行ってみてどうだったのかなどの知見をお話する場がありました。

当日は、お酒飲みながらのLTという事で、自分でも何を話していたのか
若干記憶がないのですがネットにも公開したいと思います。

LTでは言わなかったのですが、プロダクトサービスをオフショア開発で回した場合(オフショア限らずアウトソースした場合)には
保守・運用含め、社内にプロジェクトを戻す等が難しい部分もあります。

今回は約1月半のベトナム滞在でしたが
オフショア開発中に彼らの優秀さに度肝を抜かれ、なんと現地の人を4人も採用してきてしまいました。

エンジニアにとって、開発言語という共通言語が既にあるので
英語が拙かろうが、日本語が拙かろうが、影響軽微だと心から感じます。

理由なき、オフショア開発アンチの方も世の中には多いので
少しでも、経験値シェアさせて頂き、皆様の一歩踏み出すきっかけになればと思います。

ちなみに作ったサービスはこれ
[コンバージョン率自動アップサービス ヒキアゲール](https://info.conversion-up.net/pr/)

## 発表内容
今回はPJマネジメント編として
オフショア開発先を選定した後のプロジェクトマネジメントスタイルの確定結果や、判断基準、継続したオフショア開発を行うために取り組んでいる事などをご紹介しております。

[![プロジェクトマネジメント](https://qiita-image-store.s3.amazonaws.com/0/74153/184ddc1f-a2b7-e2bf-5b08-9a650a6d9d30.png "スライドの表紙")](http://www.slideshare.net/nakanonoriyuki1/2pj)

12/02公開 [アウトソーシング嫌いのベンチャーが2ヶ月間でオフショア開発でサービスをローンチしてみた(PJマネジメント編)](https://www.slideshare.net/nakanonoriyuki1/2pj)

## その他
その他公開資料としては、開発リーダー編、CTO編、システム編と公開していきます。

11/30公開 [アウトソーシング嫌いのベンチャーが2ヶ月でオフショア開発でサービスをローンチしてみた ~開発リーダー編~)](http://qiita.com/dirty_hero/items/8df6860da862a886d70b)
CTOに無茶ぶりされた開発リーダーの心境を紹介

12/03公開 [アウトソーシング嫌いのベンチャーが2ヶ月間でオフショア開発でサービスをローンチしてみた(CTO編)](http://qiita.com/devopsCoordinator/items/a656d2e40a95b3796401)
オフショア開発する際にしたPJマネジメントの取捨選択紹介

12/07公開予定 [アウトソーシング嫌いのベンチャーが2ヶ月間でオフショア開発でサービスをローンチしてみた(システム編)]
時間が無い中、開発を完了させるために工夫したこと。
fields_forで2階層以上の関連性のあるモデルを編集しバリデーションエラー発生の場合、errors.full_messagesのローカライズに失敗する対策

#はじめに
has_manyやbelongs_toで関連性を持たせた子（親）モデルの値ををひとつのフォームで編集する場合、fields_forを使いますが、これが２階層の入れ子になった場合、object.errorsのkeyが 「:"user.blog_user.posts.title"」のように、config/locals/modelsで引けない値となってしまい、バリデーションエラーの際に「User Blog user Posts Title タイトルは入力されていません」といったエラーメッセージになり、ローカライズ失敗するところを対応するメソッドを書きました。

```ruby:error_helper.rb
def error_messages(object)
  object.errors.keys.each do |key|
    if key.to_s.index(".").present?
      part = key.to_s.split(".")
      new_key = "#{part[-2].singularize}.#{part[-1]}"
      o.errors[key].each do |val|
        o.errors.add(new_key.to_sym, val)
      end
      o.errors.delete(key)
    end
  end
  return  o.errors.full_messages.join('<br />')
end
```
C++11になぜmake_uniqueがないのか

この記事は[C++ Advent Calendar 2015](http://www.adventar.org/calendars/926)の6日目の記事の予定でしたが、急遽別の記事を書くことになったので単発ネタとして投稿しておきます。

---

C++14はC++11のマイナーチェンジと言われてはいますが、C++14にあってC++11にない重要な機能があります。

それは[std::make_unique](http://en.cppreference.com/w/cpp/memory/unique_ptr/make_unique)です！
私はstd::make_uniqueを使うためだけにC++14を使っているといっても過言ではありません！

で、こういうことを言うと、そもそもなんでC++11にmake_uniqueが入らなかったったんですかね？」と聞かれます。
私も風のウワサでは聞いてたのですが、せっかくなのでちゃんと調べました。

そしたら、[stackoverflow](http://stackoverflow.com/a/9657991/1235010)にちょうどその答えが載ってました。
[Herb Sutter](https://en.wikipedia.org/wiki/Herb_Sutter)（C++標準委員会のリーダー的存在でC++AMPとか作った人）いわく「**C++11にmake_uniqueがないのは、忘れてたんだ（てへぺろ☆**」（超訳）だそうです。
正確には、"That C++11 doesn’t include make_unique is *partly* an oversight"らしく(c.f. [GotWの問102](http://herbsutter.com/gotw/_102/))、それだけが原因というわけではないようですが・・・[^1]。
まぁ、そういうこともあるんですね。

軽く検索した限り、この辺の事情に関する日本語の情報がなかったので、しょーもない小ネタでした。
飲み会のネタにでもなれば幸いです。

[^1]: それ以外の事情をご存じの方はぜひ教えて下さい
あのSmalltalkerが帰ってくる

Squeak-jaのメーリングリストに面白い投稿があったのでこちらにも告知しておきます。

http://forum.world.st/Squeak-ja-4742-83-Smalltalk-td4864652.html

```
VPRI, CDG SAP Labsの大島芳樹さんが来日されるのに際して、急遽、Smalltalk勉強会を開催します。

日時: 2015/12/4(金) 19:30-21:00 (1時間30分)
場所: 青山学院大学 青山キャンパス 総研ビル(14号館) 6階14602教室
詳しくは下記をどうぞ。
http://www.aoyama.ac.jp/outline/campus/access.html#anchor_01
http://www.aoyama.ac.jp/outline/campus/aoyama.html

大島さんには、現在研究されているプログラミング言語「GP」について、お話しいただこうと思っています。
GPは、Scratchのようなブロック言語とテキスト言語をシームレスに結合し、独立性の高いモジュールを導入することで、より汎用的なアプリケーション開発を可能にする野心的な言語です。Scratchを開発したJohn
Maloneyさん、Snap!(BYOB)のJens
Mönigさん、そして、大島さんが、アラン・ケイさんの研究所で開発していることで、世界的にも注目を集めています。

A Module System for a General-Purpose Blocks Language
Yoshiki Ohshima, Jens Mönig, John Maloney

Our team is developing GP, a new blocks language that aims to be
beginner-friendly, like Scratch, yet capable of scaling up to support
larger applications. We hope to allow a worldwide community of users
to share projects, sprites, and code libraries and to create new ones
using a mash-up development style. To support such easy sharing and
reuse, GP incorporates a strong notion of modularity. Modularity
allows components created by different users at different times to
interoperate without worrying about conflicts. However, we do not want
modularity to add to the burden of the beginning programmer; we’d like
GP’s module features to stay out of the way until they are needed. In
this paper, we present the key ideas around the GP module system. A
module in GP is a unit of encapsulated code and data. It exports a
selected set of classes, functions, and variables, provides a
namespace for the code inside, and may include private helper classes,
functions, and variables. A module can also extend system classes with
additional methods. Such extensions can be used freely within the
module but are not visible outside it. Modules can be saved and
re-loaded, allowing modules to store user-created projects, sprites,
and code libraries.
http://www.vpri.org/pdf/tr2015003_modsys.pdf

事前申し込みは不要ですが、部屋の定員が24人のため、もしそれ以上になる場合は、立ち見の可能性があります。
直前のご案内で申し訳ありませんが、よろしくお願いします。

````
NSSM: The Non-Sucking Service Manager - Backup

<font color="red">**Windows**</font> で **Node.js** や **nginx** を扱っている人向けの投稿です。

<font color="red">**NSSM**</font> というのは、**Windows** で exe でも bat(バッチ)スクリプトでも、なんでもサービス化できる簡単で便利なツールです。

結構便利なので使っているんです。
nginx や node のプロセスを Windows サービスで常駐化したり。

ところが http://nssm.cc で公開されている nssm のGitソースへのリンクが切れていました。

しかたがないので2015/12/02 git pullしてあったソースのgitリポジトリを以下にpushしました。
https://github.com/LightSpeedWorks/nssm
NSSM: The Non-Sucking Service Manager
Version 2.24, 2014-08-31

コピー元は2015/12/02時点のgitリポジトリ。
http://git.nssm.cc/nssm/nssm.git

以下、2015/11/30時点のGoogleキャッシュより。
http://webcache.googleusercontent.com/search?q=cache:Du4uf8fQeSIJ:https://nssm.cc/+&cd=1&hl=ja&ct=clnk&gl=jp

# NSSM - the Non-Sucking Service Manager

nssm is a service helper which doesn't suck. srvany and other service helper programs suck because they don't handle failure of the application running as a service. If you use such a program you may see a service listed as started when in fact the application has died. nssm monitors the running service and will restart it if it dies. With nssm you know that if a service says it's running, it really is. Alternatively, if your application is well-behaved you can configure nssm to absolve all responsibility for restarting it and let Windows take care of recovery actions.

nssm logs its progress to the system Event Log so you can get some idea of why an application isn't behaving as it should.

nssm also features a graphical service installation and removal facility. Prior to version 2.19 it did suck. Now it's quite a bit better.

※2016/01/21: サイトは復活してるけどgitは復活していない。
※2015/12/03: サイトが復活したら消す。
組み込みアプリエンジニアからWebエンジニアへの転身について

❤️ち→む⭐️びずり→みん❤️ Advent Calendar 2015 の記事です。
http://qiita.com/advent-calendar/2015/team_bizreamin

# 概要

私自身が2015/05に組み込みアプリケーションエンジニア(据え付けカーナビゲーション)から、Webアプリケーションエンジニアに転身した経験を基に、

* 組み込みエンジニアとWebエンジニアのスキルセットの違い
* 組み込みエンジニアからWebエンジニアへの転身は難しいか
* Webエンジニアへ転身したい人がやっておいたほうがいいこと

について、書きたいと思います。
あわよくば、組み込みエンジニアからWebエンジニアへ転身したい！と考えている方の参考になれば幸いです。

# 組み込みエンジニアとWebエンジニアのスキルセットの違い

QCDの観点で見ると、組み込みエンジニアが作るプロダクトは「品質(Quality)がズバ抜けて重要」な場面が多いと思います。
Webエンジニアの作るプロダクトは「速さ(Delivery)が最も重要」なことが多いと思います。
そのため、持っているスキルセットも基本的にその傾向の違いが出てきます。

### 組み込みエンジニアのスキルセット

* ソフトウェア開発工学の知識(UML、各開発工程の深い理解とプロセス化)
* マルチプロセス、マルチスレッドプログラミング
* 低レベル層の知識(アセンブラ、メモリ管理、排他制御、描画制御)
* ソフトウェア品質保証の知識(テスト技法、なぜなぜ分析など再発防止手法、etc...)
* ウォーターフォール
* ハードウェアを含めた製品独自のUIの知識
* C、C++
* 「原理を知っていて、自分でフレームワークごと作れる」ことが求められる

### Webエンジニアのスキルセット

* データベースに関する知識
* HTTP,TCP/IP等の通信プロトコルの知識
* インフラに関する知識
* 自動テスト技法(XUnit、Selenium、etc...)
* アジャイル
* HTML/CSSを用いたUIの知識
* Java,ruby,PHP,etc...
* 「便利に使えるライブラリ、ツールを知っていて使える」ことが求められる

# 組み込みエンジニアからWebエンジニアへの転身は難しいか

組み込みエンジニアからWebエンジニアへの転身について、転職市場では一般的に「キャリアチェンジ」と捉えられることが多いようです。

しかし、個人的な感覚では**キャリアチェンジと言うほどではなく、多少の努力で十分に可能**だと思います。

理由は、組込み開発は基本的に「最も過剰な開発」であるため、Webに置き換えた場合もそのまま流用できる部分が多いためです。
Web開発をするときは**組み込み開発でやっていたプロセスから、不要と思うものを除いてスピードを上げる**という感覚で開発ができます。

また、ソフトウェア品質保証の知識などはWebの世界でもほぼそのまま使えますし、開発要件の特徴から組み込みエンジニアのほうが深い知見を備えている場合が多いです。
(もちろん、Webエンジニアの中にも深い知見を備えた人は多数います)

一方で、Web独特の知識を身に付けることにハードルがありますが、感覚的には「組み込み開発において、ハードウェアやOSが変わり新たなソフトウェアプラットフォームで開発に臨む時」と同じなので、未体験のレベルではないはずですし、乗り越えられない壁ではないと思います。

# Webエンジニアへ転身したい人がやっておいたほうがいいこと

Webエンジニアになりたい！と思ったら、まず小さいWebアプリケーションを一つ作ってみるのが良いと思います。
なるべく網羅的にWebアプリケーションの知識が手に入る本を選んで、手を動かしてみるのが一番です。(狭く深くよりは、広く浅く、がポイントです)

Webアプリケーションの世界は、組み込みの世界と比べて「知識量」がモノを言うので、とにかくinputを増やすのが大切です。
「少しの量を100%完璧に理解する」よりも「6割でいいからたくさん識る」というスタンスで臨むといいと思います。
Web開発は、とにかく「完璧よりも速さ」です。

# おわりに

業界的に、組み込みの業界はソフトウェアが主役ではないことも多く、ソフトウェアエンジニアを真剣にやりたい人にとっては、恵まれない環境であることが多いです。
しかし、不満を抱えていながらも組み込みエンジニアからWebエンジニアに転身する人は少なくて、理由を聞くと「全くの畑違いでやっていける自信がない」という話をよくされます。

でも、組み込みエンジニアで培ったスキルは確実に役に立ちますし、そんなに難しくないし、なにより楽しいですよ！
特に若い人はまだまだチャンスがあると思うので、悩んでいる人がいたらぜひチャレンジしてほしいなと願いつつ、本記事を締めくくりたいと思います。
vba

フォーマット
Format(Date, "yyyymmdd")
Time = Format(Time, "hhmmss")

ファイル操作
コピー
FileCopy a,b

ファイルのリネーム
Name a As b

ファイルの削除
Kill cstrFilePath3

件数
If rsThoge.RecordCount = 0 Then
End If

マウスを砂時計にする
DoCmd.Hourglass True

データセットの整列
Set rsThoge = db.OpenRecordset("Thoge", dbOpenDynaset)
rsThoge.Sort = "フィールド1,フィールド2,フィールド3"
Set rsThoge = rsThoge.OpenRecordset()
Windows 上で GStreamer と戯れる環境を作る


はじめに
--------

最近 [VisualGDB](http://visualgdb.com/) という素晴らしいものがMSからリリースされたにも関わらず、msys2 を使って GStreamer と戯れる方法を書きます。ｺﾞﾒﾝﾅｻｲ...

そして、いまだかつて Visual Studio Community Edition? で GStreamer と戯れたことがないので、アドベントカレンダー期間中に戯れることができたらいいな...と思ってます。

とはいっても、多くの人は `gst-launch` を bash などが動く環境で触れたほうがだよね？ってことで :bow: 

msys2 をインストール
--------------------

- msys2: https://msys2.github.io/


pacman を使って gstreamer をインストール
----------------------------------------

以下、コピペでいけるはず

```shell-session
$ pacman -S \
mingw-w64-x86_64-gstreamer \
mingw-w64-x86_64-gst-libav \
mingw-w64-x86_64-gst-plugins-bad \
mingw-w64-x86_64-gst-plugins-base \
mingw-w64-x86_64-gst-plugins-good \
mingw-w64-x86_64-gst-plugins-ugly
```

`-Qs` オプションを使って `dpkg -l` みたいなことをして確認

```shell-session:インストールできているかを確認
$ pacman -Qs | grep gst
local/mingw-w64-x86_64-gst-libav 1.6.1-1
local/mingw-w64-x86_64-gst-plugins-bad 1.6.1-2
local/mingw-w64-x86_64-gst-plugins-base 1.6.1-1
local/mingw-w64-x86_64-gst-plugins-good 1.6.1-1
local/mingw-w64-x86_64-gst-plugins-ugly 1.6.1-1
local/mingw-w64-x86_64-gstreamer 1.6.1-1
```

しかし、この時点ではみんな大好き`gst-launch`が使えません :(

PATH を通す
-----------

```shell-session:PATHに/mingw64/binを追加
$ gst-launch-1.0.exe --help
bash: gst-launch-1.0.exe: command not found

$ echo 'PATH=/mingw64/bin:$PATH' >> .bashrc
$ bash
$ gst-launch-1.0.exe --help
Usage:
  gst-launch-1.0 [OPTION...] PIPELINE-DESCRIPTION

Help Options:
  -h, --help                        Show help options
  --help-all                        Show all help options
  --help-gst                        Show GStreamer Options

Application Options:
  -t, --tags                        Output tags (also known as metadata)
  -c, --toc                         Output TOC (chapters and editions)
  -v, --verbose                     Output status information and property notifications
  -q, --quiet                       Do not print any progress information
  -m, --messages                    Output messages
  -X, --exclude=PROPERTY-NAME       Do not output status information for the specified property if verbose output is enabled (can be used multiple times)
  -f, --no-fault                    Do not install a fault handler
  -e, --eos-on-shutdown             Force EOS on sources before shutting the pipeline down
  --version                         Print version information and exit
```

イケましたね！ :)


おわり
------

ちなみに、pacman でインストールした gstreamer では、↓これらが使えます。

```text
gst-device-monitor-1.0      gst-launch-1.0
gst-discoverer-1.0          gst-play-1.0
gst-inspect-1.0             gst-typefind-1.0
```

windows では `v4l-utils` とかが使えないので、`gst-device-monitor`が重宝します。

最後にノートPCを使っている私のような人のために Pipeline を1つだけ...

```shell-session
$ gst-launch-1.0 ksvideosrc device-index=0 ! decodebin ! autovideosink
```

`gst-device-monitor` を使って、複数カメラが認識されてることを確認したうえで、`device-index` の値を 1 や 2 にすると、使用するカメラを切り替えることができますのでお試しあれ！
IISのアーキテクチャ基礎（後編）

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

全然書けてない！あとでまとめなおすので…

# 物理構造（カーネル(HTTP.sys)とサービスとワーカープロセス）

![processes.png](https://qiita-image-store.s3.amazonaws.com/0/2079/e800f6fb-cec9-a0f3-d406-e61903aaaf95.png)

IISが動いているWindowsが受け取ったHTTP/HTTPS要求は、HTTPカーネルモードドライバ(Http.sys)が受け取ってワーカープロセスにルーティングされます。

## 動作

HTTP.sysはHTTP要求ヘッダを見ますが、ルーティング先のアプリケーションがまだ登録されていない場合はWWW発行サービス(W3SVC)に問い合わせます。

W3SVCはどの要求がどのアプリケーションおよびアプリケーションプールに対応づけられているか調べます。アプリケーションをホストするワーカープロセスが起動されていなかった場合はWindowsプロセスアクティブ化サービス(WAS)を通じて起動した上で、ルーティング先の情報をHTTP.sysに渡します。

HTTP.sysは受け取ったルーティング情報を自身に登録し、アプリケーションに対応するリクエストキューを生成します。

HTTP.sysは、ルーティング先に対応するリクエストキューが一杯でなければそこに要求を入れ、ワーカープロセスに通知します(IO完了ポートが使われます）。

ワーカープロセスのIOスレッドはリクエストキューから要求を取り出して、アプリケーションが動作します。アプリケーションの動作モデルは前回の記事を見てください。

## HTTP.sys余談

HTTP.sysはルーティングとリクエストキュー以外にも、カーネルモードTLSやレスポンスキャッシュ、ロギング、帯域幅制御などの機能を持っています。

ちなみにHTTP.sysはIISと密結合しているものではありません。Windowsは[HTTP Server API](https://msdn.microsoft.com/en-us/library/windows/desktop/aa364510.aspx)というWebサーバー作成用のAPIを持っていて、それを利用することで独自のアプリケーションでもHTTP.sysを利用できます。そのようにして作られたWebサーバーに、[Rack(Ruby)用Webサーバー Ennou](http://www.artonx.org/data/nougakudo/jman.html)があります。

## アプリケーションプールとマルチワーカープロセス(Webガーデン機能)

アプリケーションプールに対応するワーカープロセスは、1つだけではなく複数起動して、負荷を分散させることができます。この機能をWebガーデンと呼びます。

Webガーデンでは、要求をどのワーカープロセスが処理するかは制御できません。特定の要求を特定のワーカープロセスに振り分ける、プロセスアフィニティみたいな機能は用意されていないので注意してください。

# 物理構造（キューとスレッドプール）

HTTP.sysのリクエストキューとアプリケーションのスレッドプールと
書くから！クリスマスまでに書くから！

# 非同期モデルとかの話をすこし
書くから！クリスマスまでに書くから！

# さいごに

ワーカープロセスのところは結構複雑な仕組みで動いているのですが、ぶっちゃけ、ASP.NETアプリケーションのような、ワーカープロセス内でWebアプリケーションを動かすとき以外はあまり関係ない世界かもしれません。FastCGIやHttpPlatformHandlerを通じて、ワーカープロセス外のWebアプリケーションがリクエストを処置する時は、その外部プロセスの実装次第ですし、あるいは、WindowsであってもフロントWebサーバーはNginxを使いたいなどで、そもそもIISを使わないかもしれないですしね。

とはいえ、AzureのApp Serviceを使うときなど、IISの仕組みを知っておくと良いと思います。

# 参考リンク

* http://www.atmarkit.co.jp/ait/articles/0711/14/news137.html
* http://blogs.technet.com/b/jpiis/archive/2014/12/15/iis.aspx
* http://www.buildinsider.net/web/iis8/08
* https://fullsocrates.wordpress.com/2013/02/28/asp-net-threadstuning-thread-parameters-12-2/
* http://blogs.msdn.com/b/david.wang/archive/2006/03/14/thoughts-on-application-pools-running-out-of-threads.aspx
* http://blog.leansentry.com/all-about-iis-asp-net-request-queues/
* http://www.codeproject.com/Articles/38501/Multi-Threading-in-ASP-NET
[python]関数オブジェクト(？)の値

# まとめ
pythonで関数オブジェクト（っていうのかわかりませんが...）の値はTrueです．
2.7で確認しました．

# 例
```py
def func():
    return False

if func:
    print('true')
else:
    print('false')

# true

if func():
    print('true')
else:
    print('false')

# false
```


# ハマったパターン
```py
class Test(object):
    def __init__(self):
        self._flag = False

    # ここで@propertyを付けたつもりが付け忘れていた
    def flag(self):
        print('test flag')
        return self._flag
    
# ---

if __name__ == '__main__':
    test = Test()

    # propertyにしてると思い込んでるからカッコ無しで呼び出す
    if test.flag:
        print('true')
    else:
        print('false')

# 'test flag'はprintされず，
# 'true'だけがprintされる
```

しょーもないミスですが，あるんじゃないでしょうか？
いや，自分がショボすぎるだけか...
SystemVerilogって正規分布関数ないんだってよ

# はじめに
大変ご無沙汰しております。@mizutomo と申します。本当に久しぶりに文を書いています。どれぐらい久しぶりかというと、Qiitaに記事を書くときに、右側にプレビューがon the flyで出てきているのに、びっくりした、というレベルです。

ところで、ランダム検証ってされていますか? 僕は、論理屋じゃないので、使ったこともないです。でも、たまに乱数は使いたくなるんですよね。それで、SystemVerilogで正規分布を生成する関数は。。。。とググったら、「えっ、ないやん><」。

うそ〜ん。ランダム検証とか言ってるぐらいだから、乱数周りに関しては、めちゃくちゃ充実していると思ってた。。。

# 「安心して下さい。使えます。」
はい。単純にDPI-Cを使えばいいんですね。ないものは、自分で作って組み込め、というのが、SystemVerilogの精神のようです(本当?)。

DPI-Cに関しては、この本を参照して下さい。[SystemVerilog設計スタートアップ](http://www.amazon.co.jp/dp/4789836193) DPI-Cに関しては、@Vengineer 先生が丁寧に書かれています。

# 正規分布の生成
さて、乱数を生成する関数は、[C言語による乱数生成](http://www.sat.t.u-tokyo.ac.jp/~omi/random_variables_generation.html) こちらのサイトから借用させて頂きます。Mersenne-Twister法を解説されていたりして、非常に助かります。

```c:gauss.c
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <svdpi.h>

double uniform() {
  return ((double)rand() + 1.0)/((double)RAND_MAX + 2.0);
}

double rand_normal(double mu, double sigma) {
  double z = sqrt(-2.0 * log(uniform())) * sin(2.0*M_PI*uniform());
  return mu + sigma*z;
}
```

ここでは、乱数の生成にCのrand()関数を使っています。先ほどのサイトや、Numerical Recipesに解説があるように、Cのrand()関数は、周期性を持った乱数列なので、実用には適しません。実用としては、メルセーヌ-ツイスター法がいいんでしょうかね。

で、実際にSystemVerilogと絡むところって、**#include \<svdpi.h\>**を置いたぐらいですよね。

# 正規分布を呼ぶ側
次は、先ほどのCのコードを呼ぶSystemVerilogのコードです。

```sv:gauss.sv
`timescale 1ns/1ns

import "DPI-C" pure function real rand_normal(real mu, real sigma);

module test();
  real rand_val;
  int i;

  initial begin
    for (i = 0; i < 10; i++) begin
      rand_val = rand_normal(0, 1);
      $monitor("%d: %g", i, rand_val);
      #10;
    end
    $finish;
  end
endmodule
```

おっふ、めちゃくちゃ簡単じゃないですか。実質、Cコードを呼ぶためにやったことは、**import "DPI-C"**としたことぐらいです。

あとは、シミュレータ側で勝手にCのコードをコンパイルして、実行ファイルを作ってくれます。
(昨日、とあるシミュレータで実行したら、稀に共有ライブラリが作成されないことが。そのようなときは、手動で共有ライブラリを作ればよいです。@ginnyu_tei さんの[記事](http://qiita.com/ginnyu_tei/items/c6095df17bcbbcec8541)が参考になります。)

# 何に使うの? 
私の場合は、デバイス雑音などの効果をデジタルシミュレーションに入れ込むときに、このような方法を使っています。例えば、Kundert先生がVerilog-AMSでモデリングしている[VCOの位相雑音のモデル](http://www.designers-guide.org/analysis/PLLnoise+jitter.pdf)をVerilogで使用する場合ですね。Verilog-AMSには、*$rdist_normal*というシステムタスクが用意されているので、何も考えずに、正規分布が使えちゃうのですが、それと同じことをVerilogでやろうとすると、、、自分で作らないといけないようです。

何で、Verilog-AMSでできているものを、Verilogシミュレータでやる必要があるの?というと、やっぱり、Verilogシミュレータは高速なんですよね。AMSシミュレータに比べると。でも、HDLシミュレータは、Δ遅延があるので、**嫌い**です。

ところで、DPI-Cは本当に便利ですね。これだけでも、Verilog HDLを捨てて、SystemVerilogに切り替えるというメリットが有るんじゃないかと思います。みんなが大好き**Python**とつなぐのも簡単ですよね〜。ということで、そのうち、誰かがSystemVerilogとPythonをつなぐ記事を書いてくれると期待しています。自分は書きません。

# 余談
昨日、とあるシミュレータにポーティングしていたのですが、SVには、$absもなかったんですね。かなりびっくりしました。
コンテンツキャッシュとVaryヘッダとnginx

この記事は[nginx Advent Calendar 2015](http://qiita.com/advent-calendar/2015/nginx)の3日目の記事です。

# コンテンツキャッシュ

HTTP通信時にクライアント／サーバ間にキャッシュサーバが存在する場合、キャッシュサーバは特定のヘッダの内容ごとにキャッシュを分けるといった工夫が必要になることがあります。

```
クライアント <-> キャッシュサーバ <-> サーバ
```

例えばクライアントが`Accept-Encoding: gzip, deflate`付きのリクエストを送ってきた場合、サーバはgzip圧縮したコンテンツを返すことができます。さらに前段のキャッシュサーバはそのレスポンスをキャッシュすることができます。

しかし、すべてのクライアントが`Accept-Encoding: xxx`付きのリクエストを送ってくるとは限りません。この場合、サーバは素のコンテンツをレスポンスとして返します。また、前段のキャッシュサーバはこのレスポンスもキャッシュすることができます。

さて、ここで問題が生じます。キャッシュサーバは圧縮済みのコンテンツをキャッシュすべきでしょうか？それとも圧縮していないコンテンツをキャッシュすべきでしょうか？

この問題はVaryヘッダを利用することで解決できます。

# Varyヘッダ

Varyヘッダは前段のキャッシュサーバに対して、指定したヘッダの内容ごとにキャッシュを分ける必要があることを伝えるためのものです。例えばサーバが`Vary: Accept-Encoding`をレスポンスヘッダに付加しておくと、キャッシュサーバはAccept-Encodingヘッダの内容に応じたキャッシュを保持します。

```http
Vary: Accept-Encoding
```

こうすることでクライアントのAccept-Encodingヘッダの内容に応じたキャッシュデータをキャッシュサーバは返すことができるというわけです。

## nginxにおけるgzip圧縮とVaryヘッダ

さて、本題です。上記のような事情からかApacheの[mod_deflate](https://httpd.apache.org/docs/2.4/mod/mod_deflate.html#proxies)や[h2o](https://h2o.examp1e.net/configure/gzip_directives.html)なんかはコンテンツのgzip圧縮を有効にすると、自動的に`Vary: Accept-Encoding`をレスポンスヘッダに付加します。一方我らがnginxは**設定ファイルに`gzip_vary on;`と書かないと`Vary: Accept-Encoding`をレスポンスヘッダに付加しません**。

<blockquote class="twitter-tweet" lang="en"><p lang="ja" dir="ltr">えるしってるか、Apacheのmod_deflateはレスポンスヘッダに「Vary: Accept-Encoding」をデフォルトで付ける。しかしnginxは「gzip_vary on;」の一行を追加しない限り何もしない。</p>&mdash; bokko (@cubicdaiya) <a href="https://twitter.com/cubicdaiya/status/665419460686254080">November 14, 2015</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

非常に重要なことなのでもう一度言うと、**nginxは設定ファイルに`gzip_vary on;`と書かないと`Vary: Accept-Encoding`をレスポンスヘッダに付加しません**。

```nginx
gzip_vary on;
```

nginxの前段にキャッシュサーバやCDNが配置されている際はこの事実を頭に入れておくとよいでしょう。

### (おまけ)nginxとViaヘッダ

ヘッダの内容ごとにキャッシュを分ける件はこれでよいとして、nginxの前段にキャッシュサーバやCDNがあるともうひとつめんどくさいのがあります。Viaヘッダです。


Viaヘッダはクライアント／サーバ間にあるキャッシュサーバやCDNが、「自分のサーバをプロキシとして経由したよー」と明示するために付けるヘッダです。例えばCloudfrontなんかを通るとこのヘッダが付いてきます。そして**nginxは受け取ったリクエストにViaヘッダが含まれていると設定ファイルに`gzip on;`と書いてもレスポンスをgzip圧縮しません**。

<blockquote class="twitter-tweet" lang="en"><p lang="ja" dir="ltr">えるしってるか、リクエストヘッダにViaヘッダが付いてるとnginxは「gzip on;」って書いてもレスポンスをgzip圧縮しない。</p>&mdash; bokko (@cubicdaiya) <a href="https://twitter.com/cubicdaiya/status/665417562235273217">November 14, 2015</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

非常に重要なことなのでもう一度言うと、**nginxは受け取ったリクエストにViaヘッダが含まれていると設定ファイルに`gzip on;`と書いてもレスポンスをgzip圧縮しません**。

Viaヘッダが付いててもレスポンスをgzip圧縮したい場合は[`gzip_proxied`ディレクティブ](http://nginx.org/en/docs/http/ngx_http_gzip_module.html#gzip_proxied)を利用します。

```nginx
gzip_proxied any;
```

これでViaヘッダ付きのリクエストに対してもgzip圧縮したレスポンスを返すことができます。めでたしめでたし。
繰り返しフィールドについて書いてみる


[FileMaker Advent Calendar 2015](http://www.adventar.org/calendars/865)の3日目

# 繰り返しフィールドについて書いてみる
最近「使わない方がいい」とか「なにそれ？」みたいに冷遇されがちな**繰り返しフィールド**

## 繰り返しフィールドの定義
[ホーム > データベースのデザインと作成 > データベースの作成 > フィールドのオプションの設定 > 繰り返しフィールドの定義](http://www.filemaker.com/help/13/fmp/ja/html/create_db.8.26.html)
> テキスト、数字、日付、時刻、オブジェクト、計算、またはグローバルの各フィールドを繰り返しフィールドに設定すると、１つのフィールドに複数のデータを保存することができます。
たとえば、各商品の色を保存する「色」という１つのテキストフィールドを作成します。この「色」フィールドを繰り返しフィールドに設定すると、各商品のすべての色を「色」フィールドに入力することができます。

![151203-01.png](https://qiita-image-store.s3.amazonaws.com/0/89027/1b3aae7c-330b-aa40-e464-ca25b442dd58.png)

フィールドのタイプで[4]となっているものが繰り返しフィールドです
[]内の数値分の繰り返しフィールドが定義されている

ひとつのフィールドに複数の値を持つことができる、他のデータベースではあまりない機能です

## レイアウトに繰り返しフィールドを置いてみる
![151203-02.png](https://qiita-image-store.s3.amazonaws.com/0/89027/ca187b46-ce4b-dd06-a8ef-24074d697313.png)
レイアウト上にフィールドを置いて、インスペクタの[データ]タブで[繰り返しを表示]で設定するだけ
![151203-03.png](https://qiita-image-store.s3.amazonaws.com/0/89027/261711f9-ed26-20b5-d409-d5d29b724092.png)

## csv形式で書き出してみる
csvに書き出してみるとどういう風にデータを格納しているかわかるかもしれない
![151203-04.png](https://qiita-image-store.s3.amazonaws.com/0/89027/dee6676d-5ff3-6f8c-6077-bab3f7132a7b.png)

## Excel形式で書き出してみる
![151203-05.png](https://qiita-image-store.s3.amazonaws.com/0/89027/4680677c-512b-5634-65f7-ebe1e2982b95.png)

## こんな使い方もできるんです
こうして
![151203-06.png](https://qiita-image-store.s3.amazonaws.com/0/89027/f4aabf69-fef9-2aaf-6b86-701d93e09eb1.png)
こうすると
![151203-07.png](https://qiita-image-store.s3.amazonaws.com/0/89027/8d69ca0e-19cd-132c-1d32-ce20419056df.png)
こうなります
![151203-08.png](https://qiita-image-store.s3.amazonaws.com/0/89027/75cb2e80-bd9b-3067-7123-617cc2367987.png)
python > アクセスモードを変更する > import os / from stat import * / os.chmod('aaa.txt', S_IWUSR | S_IRUSR | S_IRGRP | S_IWOTH | S_IROTH)

```txt:動作確認
RaspberryPi2 + raspbian
```

起動時に実行するpythonスクリプトがroot権限で作成されてしまい、他のユーザ(piなど)から削除できない。そのため、アクセスモードを変更する。

参考
[PythonRecipe](http://lightson.dip.jp/zope/ZWiki/141_e3_83_95_e3_82_a1_e3_82_a4_e3_83_ab_e3_81_ae_e5_b1_9e_e6_80_a7_e3_82_92_e5_a4_89_e6_9b_b4_e3_81_99_e3_82_8b)

```151203a.py
import os
from stat import *

os.chmod('aaa.txt', S_IWUSR | S_IRUSR | S_IRGRP | S_IWOTH | S_IROTH)
```

```txt:実行前
$ ls -l aaa.txt
-rw-r--r-- 1 root root 0 Dec  3 06:51 aaa.txt
```

```txt:実行後　
$ ls -l aaa.txt
-rw-r--rw- 1 root root 0 Dec  3 06:51 aaa.txt
```
技術英語 > They see that this is [inevitable]. > sparce data sets are [unavoidable] / [circumventing] the 10 day search limit

@ LOE > July 13, 2012

http://loe.org/shows/shows.html?programID=12-P13-00028
>  They see that this is <font color=red>inevitable</font>

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

unavoidable

https://github.com/azinazadi/TripNet
> Having biological data, it is common to have 3 incomparable species, so sparse data sets are <font color=red>unavoidable</font>.

<hr>

関連して思い出したのは

circumvent

https://github.com/remy/snapbird
> A Twitter API based search app, <font color=red>circumventing</font> the 10 day search limit
トラックパッドの触覚フィードバックを利用する


これは[Cocoa Advent Calendar 2015](http://qiita.com/advent-calendar/2015/cocoa)の3日目です。

## はじめに

Macにおける2015年の大きなトピックの一つにForce Touchトラックパッドの登場がありました。Force Touchの最大の特徴である[クリックの強弱をCocoaから扱う方法については以前書いた](http://qiita.com/takebayashi/items/6990013dd8291e7ac04e)ので、今回はもう一つの特徴である触覚フィードバックをCocoaから扱う方法について紹介します。

## 触覚フィードバックとは

触覚フィードバック(haptic feedback)は、Force Touchトラックパッドに搭載されている機能の一つで、トラックパッドに小さな振動を発生させることでこれに触れているユーザの指に対して物理的なフィードバックを与えることができるのが特徴です。トラックパッドを押し込むとクリック感を得ることができますが、Force Touchトラックパッドではこのクリック感は触覚フィードバックによって実現されています。この触覚フィードバックはクリック時以外にも利用することができ、実際に一部のApple製のアプリケーションで活用されています。

## NSHapticFeedbackPerformer

触覚フィードバックを利用するためのメソッドはEl Capitanで新しく導入された`NSHapticFeedbackPerformer`プロトコルにまとめられています。`NSHapticFeedbackManager.defaultParameter()`を呼び出すことで、このプロトコルの実装を取得することができます。

このプロトコルで定義されているメソッドは次の一つだけです。

```swift
func performFeedbackPattern(_ pattern: NSHapticFeedbackPattern, performanceTime performanceTime: NSHapticFeedbackPerformanceTime)
```

このメソッドを呼び出すことで、トラックパッドを振動させて触覚フィードバックを行うことができます。

### NSHapticFeedbackPatterns

`NSHapticFeedbackPatterns`は触覚フィードバックの種類を指定するもので、次のいずれかの値をとります。

- `.LevelChange`
- `.Alignment`
- `.Generic`

`.LevelChange`は、ユーザがトラックパッドを押す強さが変わった場合に、それをフィードバックするために使用します。例えば、2段階の強さを受け付けるボタンがあった場合、1段階目から2段階目に切り替わる際にそれをユーザにフィードバックする必要がありますが、そういった場合にこれを指定します。

`.Alignment`は、ユーザがオブジェクトを移動させたりリサイズさせたりする際にそのガイドを行うために使用します。例えば、XcodeのxibエディタをForce Touchトラックパッドで操作しているとコントロールの操作を行っている際にグリッドに吸い付くような触覚フィードバックを得ることができますが、それと同様のものをアプリケーションで実装する場合にはこれを指定するようにします。

`.Generic`は上記の例に当てはまらないような場合に指定します。

### NSHapticFeedbackPerformanceTime

`NSHapticFeedbackPerformanceTime`は触覚フィードバックを行うタイミングを指定します。`.Now`を指定すると呼び出しと同時にフィードバックを行いますが、`.DrawCompleted`を指定するとこれを描画完了まで遅らせることがでるため、ビューの特性に応じて使い分けることができます。

## サンプルコード

Swift Playgroundで下記のコードを入力することで、Cocoaにおける触覚フィードバックを試すことができます。トラックパッドに指を置いていると、1秒おきに振動するのを確認することができます（当然ながらForce Touchトラックバック以外では確認できません）。

```swift
import Cocoa

let performer = NSHapticFeedbackManager.defaultPerformer()

for _ in 0..<10 {
    performer.performFeedbackPattern(.Alignment, performanceTime: .Now)
    sleep(1)
    performer.performFeedbackPattern(.LevelChange, performanceTime: .Now)
    sleep(1)
    performer.performFeedbackPattern(.Generic, performanceTime: .Now)
    sleep(1)
}
```

## おわりに

強いクリックについては使いどころが難しいといわれていますが、触覚フィードバックはグリッドガイドのようにわかりやすい利用例があるため、そういった場面ではこのAPIを積極的に活用できるとよいでしょう。
僕がパソコンに「Dynabook Satellite」をおすすめする理由

こんにちは。中学生プログラマーの荒テックです。
今、僕は開発用パソコンに「Dynabook Satellite」を使用しています。
東芝のビジネス用ノートパソコン。企業や学校に導入されている事が多いです。
実際父の会社も、学校のPC室も、「Dynabook Satellite」です。
ビジネス用PCとはいえ、Amazonで普通に購入できます。
では、何故Dynabook Satelliteが良いのでしょうか。

![51rg60PeJqL._AA160_.jpg](https://qiita-image-store.s3.amazonaws.com/0/100507/d9cab317-0f48-5cf8-6d50-ec0f86bfa59d.jpeg)

#ホームユースでは十分な性能
現在売られているのは、「Dynabook Satellite B35」です。
AmazonではCeleronモデルとCore i3モデルが売られており、4～6万円です。
[CeleronのDynabook Satellite B35](http://www.amazon.co.jp/%E6%9D%B1%E8%8A%9D-Dynabook-Satellite-PB35RNAD483ADA1-Windows8-1/dp/B0135FO42G/)
[Core i3のDynabook Satellite B35](http://www.amazon.co.jp/Dynabook%E3%82%B5%E3%83%86%E3%83%A9%E3%82%A4%E3%83%88B35-PB35RFAD4R7AD71-Core-i3-5005U-Bluetooth4-0-%E3%80%90Windows10%E7%84%A1%E6%96%99%E3%82%A2%E3%83%83%E3%83%97%E3%82%B0%E3%83%AC%E3%83%BC%E3%83%89%E5%AF%BE%E8%B1%A1%E3%80%91/dp/B015FIW8N8/)
Celeronモデルでは「Celeron-3205U (1.5GHz)」Core i3モデルでは「Core i3-5005U (2GHz)」が使われています。メモリは4GB、HDDは500GBで統一してあります。
ネット利用やOfficeには十分な性能ですし、軽いゲームやプログラミングにも耐えます。
ちなみに、僕が使っているのはひとつ前の「Dynabook Satellite B554」Core i3-4100M(2.5GHz)モデル。MineCraftやAndroid Studioも余裕で動きます。

#余計なソフトが付かない
家電量販店用のPCは、初心者用に年賀状作成ソフト、操作学習ソフト、その他便利なソフトが付いていますが、必要ない物も多いです。
(類似のフリーソフトは多いし、体験版・機能制限版も入っている)
それらを省くことで、シンプル軽量、安くなっています。

#海外メーカーに匹敵する値段
安いPCといえば、Lenovo、ASUS等の中国・台湾の企業が多いです。
でも、同じ値段なら日本メーカーの方がサポート等で安心感があります。
(ただし、Dynabook Satellite自体は中国製です)

#ビジネスノートパソコンなのに薄い
過去のモデルに比べ、「B35」は約半分の薄さ。
通常のDynabookとほぼ同じ薄さです。

まあ、こんな感じでしょうか。
非常に使いやすいパソコンなので、是非新PCを検討中の方は
検討リストに入れてみて下さい。
簡単にandroid studio 1.5 にアップデートする方法

Android Studio 1.5 Available

なんてダイアログが出て来た。
そのままリンクを辿って行くとandroid studioのサイトのダウンロードページに飛んでいく。
ここでzipファイルを落とさにゃならんらしい。

それはめんどくさい。


実はちゃんと楽にアップデートできるようになってます。

android studioを起動してすぐの画面、
「Welcome to AndroidStudio」
の画面で
「Configure」をクリック
「Check for Update」をクリック
「Update and Restart」をクリック

これで勝手にインストールしてくれます。
Retinaディスプレイを分岐するmixin


```scss
@mixin media-retina() {
  @media only screen and (min-device-pixel-ratio: 1.5), only screen and (-o-min-device-pixel-ratio: 3/2), only screen and (-webkit-min-device-pixel-ratio: 1.5), only screen and (min-device-pixel-ratio: 1.5) {
    @content;
  }
}
```

```scss
// 使い方
.aaaa {
  @include media-retina {
    background-image: url(aaaa@2x.png);
  }
}
```

device-pixel-ratioで分岐するMedia Queryを内包しているだけですが、
コードを短くできます。
font-size指定にremを使うmixin


remを簡単に扱うためのmixin。IE8以下の環境へはpx指定する。「$base: 16」の意味は後述。[^1]


```scss
@mixin font-size($size, $base: 16) {
  font-size: $size + px;
  font-size: ($size / $base) + rem;
}
```


```scss
// 使用方法
p {
  @include font-size(12);
}
```

## remとは

CSS3でサポートされたfont-sizeの単位で、由来は **root + em**。
親要素からの相対指定するemに対して、
ルート (html要素) 基準にした相対指定が可能なので、
コードを読みやすい。サイト全体の文字サイズのコントロールが簡単。

例: [Font Size Idea: px at the Root, rem for Components, em for Text Elements | CSS-Tricks](https://css-tricks.com/rems-ems/)


[^1]: 現在普及しているブラウザはすべてfont-sizeの初期値が16pxである
研究室でコーヒー飲んだ回数をSlackのコマンドで記録する

## <img src="https://qiita-image-store.s3.amazonaws.com/0/32636/91895234-f75a-c334-9153-0565738af789.png" width="24px" style="margin:0 8px;transform: translateY(6px);"><span style="font-family:serif;"> 研究室のコーヒーマシン</span>

私の研究室では１杯５０円でコーヒーを飲むことができます。（ラボリーダーに感謝。）
その都度、５０円払ってもいいのですが、各自責任を持って飲んだ回数を覚えておくことで後でまとめて精算できたら楽ですね。

![8CD45721-56A5-44EE-91A9-39475F9349D7.png](https://qiita-image-store.s3.amazonaws.com/0/32636/b14040ac-9b33-972a-9637-da015c284ae3.png "8CD45721-56A5-44EE-91A9-39475F9349D7.png")


## <img src="https://slack.global.ssl.fastly.net/66f9/img/icons/favicon-32.png" width="24px" style="margin:0 8px 0 4px;transform: translateY(6px);"><span style="font-family:serif;"> 記録手段としての</span><span class="slack"> Slack</span>

研究室ではSlackを使っていたので、Slackの`Outgoing WebHooks`を使うことにしました。記録先としては`Google Spreadsheet`に記録します。`username`の欄と各ユーザネームに対応した数字を記録する欄を作っておきます。

### <span style="font-family:serif;">コマンド</span>

```
g coffee add
```
とSlackで入力することで入力したユーザーに対応する数字の欄の数字を１つ増やすことにします。（いつ飲んだかなどの情報は後から一切わからない仕様です汗）

## <img src="https://www.gstatic.com/images/icons/material/product/2x/apps_script_64dp.png" width="24px" style="margin:0 8px 0 4px;transform: translateY(6px);"><span style="font-family:serif;"> Google Apps Script (GAS) の</span> <span class="gas">doPost(e)</span> <span style="font-family:serif;">関数</span>


GASでは`doGet`関数や`doPost`関数を定義することでウェブアプリとして公開することができます。且つ、`Google Spreadsheet`を操作する[クラス](https://developers.google.com/apps-script/reference/spreadsheet/)などが使えるため、`Google Drive`上のファイルを操作するBotなどを作るには非常に便利です。


Slackの`Outgoing WebHooks`のポスト先としてGASで公開したアプリのURLを指定し、`doPost`関数内で`Google Spreadsheet`を操作することで上記のコマンドを実装しました。

(追記 12/4)
今は`Execution API`というのがあるのですね。。


### <span style="font-family:serif;">パラメータ</span>

Slackで`Outgoing WebHooks`を設定する時のトークンを使うことでSlack以外からのアクセスを無視できます。

```
function doPost(e) {
  if(e.parameter.token != SLACK_OUTGOING_TOKEN) return null;
  
  var username = e.parameters.user_name[0];
  var channel = e.parameters.channel_name[0];
  var command = e.parameters.text[0].split(" ");
  
  if (command[0] != "g") return null;
  
  switch(command[1]) {
  
    case "coffee":
      /*
       * spreadsheet上の username の飲んだ回数を１増やす
       */
      break;
  }
}
```

GASの`Google Spreadsheet`の操作に関しては

* [GoogleAppsScript - GASでSpreadsheetを操作する自分的ベストプラクティス - Qiita](http://qiita.com/ryan5500/items/e72eb205fbe006c2eb6f)

など色々あります。

## :eyes: おまけ

`g coffee all`コマンドでみんなの飲んだ回数を棒グラフで返してくれる機能も実装しました。

![AA78AA74-6CE4-4618-BA1E-7FA0EF2FAD04.png](https://qiita-image-store.s3.amazonaws.com/0/32636/586d0d69-e4d5-498b-d66b-348e97228679.png "AA78AA74-6CE4-4618-BA1E-7FA0EF2FAD04.png")


## :construction_worker: 参考

以下の記事を非常に参考にさせていただきました <(_ _)>

* [GoogleAppsScript - Slack BotをGASでいい感じで書くためのライブラリを作った - Qiita](http://qiita.com/soundTricker/items/43267609a870fc9c7453)
Perl6 Cookbook Webページの取得

こんばんは :whale2: 
[Perl 6 Advent Calendar 2015](http://qiita.com/advent-calendar/2015/perl6)の3日目です[^title]

Perl5の名著 「[Perl Cookbook](http://docstore.mik.ua/orelly/perl/cookbook/index.htm)」 のコードをPerl6で書いたらどんな感じになるのかなぁという企画で、今回は[20.1. Fetching a URL from a Perl Script](http://docstore.mik.ua/orelly/perl/cookbook/ch20_02.htm) (Perlスクリプトで、あるURLの内容を取得する) です。[^curry]
※ Perl6のソースコードQiitaに貼る時は`rb`(Ruby)を指定しています。[^ruby]

# Perl5版

とあるURLのデータを取ってきて表示します。
前述の[20.1. Fetching a URL from a Perl Script](http://docstore.mik.ua/orelly/perl/cookbook/ch20_02.htm)のコードを少しだけ変えたものです。

```pl
use v5.18;
use strict;
use LWP::Simple;
say $LWP::Simple::VERSION; #=> 6.00

my $URL = 'http://www3.nhk.or.jp/rss/news/cat2.xml';

my $content;
unless ( defined ( $content = get $URL )){
  die "could not get $URL\n";
}

say $content;
```

# Perl6版

Perl6版のLWP::Simpleモジュールを使います。( まだモジュールのバージョン番号が若いですね )

```rb
use v6;
use LWP::Simple;

$LWP::Simple::VERSION.say; #=> 0.090

my $URL = 'http://www3.nhk.or.jp/rss/news/cat2.xml';

my $content = LWP::Simple.get( $URL ) or die "could not get $URL\n";

if $content ~~ Buf {
  $*OUT.write($content);
}
elsif $content ~~ Str {
  $content.say;
}
```

`Buf`(Blob)でデータが返ってくると扱いづらい気がするので、`Str`に変換するようにしてみます。

```rb
use v6;
use LWP::Simple;

my constant @urls = <
  http://www3.nhk.or.jp/rss/news/cat2.xml
  http://www.jma-net.go.jp/rss/jma.rss
  http://headlines.yahoo.co.jp/rss/zdn_mkt-dom.xml
>;

for @urls -> $url {
  $url.say;

  # 返ってくるのが Buf だったら、decodeメソッドで Str に変換する。
  if ( my $content = LWP::Simple.get( $url ) ) ~~ Buf {
    $content .= decode;
  }

  # $content の型を確認
  # $content.WHAT.say; #=> (Str)

  # $content の中に「description」という文字列はあるかな？
  # $content.match(/:i description/).say;

  # 取得したHTMLを出力
  $content.say;
}
```

おわりです。

### その他
- [Perl6 Cookbook 一時変数を使用しないで変数の値を交換する - Qiita](http://qiita.com/B73W56H84/items/c9ecb19a39ef0afd4506)
- [Perl6 Cookbook 数値に位取りのcommaを挿入する - Qiita](http://qiita.com/B73W56H84/items/8967c3dfa75117868025)

# 参考や注釈

* [Perl 6 Modules](http://modules.perl6.org/)
* [Perl6 LWP::Simple](https://github.com/cosimo/perl6-lwp-simple)

* [class IO::Handle - Perl 6 Documentation](http://doc.perl6.org/type/IO::Handle#method_write)
* [role Buf - Perl 6 Documentation](http://doc.perl6.org/type/Buf)
* [Regexes - Perl 6 Documentation](http://doc.perl6.org/language/regexes#Regex_Adverbs)

* [Perl6導入とHello, world! - Qiita](http://qiita.com/B73W56H84/items/2153e6211ed617b4605d)


[^title]: `Perl6 Cookbook的な内容！`から改題しました。
[^curry]: 本当は『`Inline::Perl5`モジュールがあればPerl6からPerl5のモジュールが使えて便利』みたいな内容を書こうと思ったのですが、手元の環境で依存モジュールのインストールに失敗して解消にちょっとかかりそうだったので別の内容にしました。
[^ruby]: [QiitaのシンタックスハイライトがまだPerl6に対応してないみたいどうしよう - Qiita](http://qiita.com/B73W56H84/items/633b0c5fda663e313b59)
Raspberry piにvncserver入れて外部からGUIで動かす

## やりたかったこと

- raspberry piに外部から接続したい。
- 仕事中、頻繁に家族からクレームが来るのでブラウザで自宅内の無線アクセスポイントを再起動するために繋ぎたかった。
 - APについては以前ルータとして使用していたものをAPモードに変更して中継機にしている。


## 環境

ログイン元：Mac OSX 10.10.5 Yosemite
ログイン先：Raspberry Pi 1 model B Linux raspberrypi 3.2.27

## 準備とインストール

### vncサーバーを入れましょう

```
$ sudo apt-get update
$ sudo apt-get install tightvncserver 
```

この時リモートからログイン中で、
apt-getがSetting locale faildを吐いた場合は、
ログイン元から環境変数を送っている可能性があるので、
こちらを参照ください。
http://qiita.com/komacchi/items/9aee06fe50d3114fde31


vncserver起動

```
$ tightvncserver

New 'X' desktop is raspberrypi:1

Starting applications specified in /home/pi/.vnc/xstartup
Log file is /home/pi/.vnc/raspberrypi:1.log
```

起動すると、初回はパスワードを聞かれるので入力し、
ログファイルも書き出されるのでここでportの確認をします。

```
$ cat /home/pi/.vnc/raspberrypi:1.log
.
.
.
25/11/15 05:58:07 Listening for VNC connections on TCP port 5901
.
.
.
```

ここ。TCP port 5901

5900番台を使用するので、

```
New 'X' desktop is raspberrypi:1
```

これの:1を追加したものがポート番号になります。
つまり、:1なら5901、:2なら5902です。


ちなみに、上記だとログインのたびにサーバー起動のコマンドが必要になりますが、
ラズパイの起動時にvncserverをサービスとして動作させておきたい場合はまた別の設定があります。/etc/rc.localにゴニョゴニョ書きますが、今回は常に起動させておきたくないので省略。


### ポートフォワーディング

外部から接続する必要があるので、ルーターのポートを開放します。
ルーターの設定については割愛します。
今回の場合で言うと、TCP 5901をラズパイのIPアドレスに向けます。
mydnsなどのDDNSサービスを使用しているとしたらアドレスとしては
`
hoge.mydns.jp:5901
`
のような感じになります。


### VNCクライアント

Windowsであれば[RealVNC](http://www.realvnc.com/)などが良いでしょう。
今回はOSXなので、クライアントは不要です。Finderから接続できます。

Finderから、メニュー→移動→サーバーへ接続　もしくは
command + Kでサーバーへ接続画面が出ます。

ここでアドレス欄に

```
vnc://hoge.mydns.jp:5901
```

で接続します。
パスワードを聞かれたら、初回起動で設定したパスワードを入力します。


接続ができたら、すでにvncserverは起動させているのでこのような画面になります。

<img width="1280" alt="スクリーンショット 2015-11-30 2.43.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/30278/f8782e0d-eece-59a4-3bff-d7978384fdaa.png">


### chromium browserを入れる

Raspbian標準のブラウザはまったくもって使えないのでChromiumを入れます。


```
$ sudo apt-get install chromium-browser
```

そしてこんな感じになります。

![画面共有 ピクチャ 2015年12月3日 3.31.37 JST.png](https://qiita-image-store.s3.amazonaws.com/0/30278/c65ac965-0f57-c8b5-fdaf-65134a138c4b.png)


これでブラウザ上から今回の目的であるAP設定画面に入れます。
実際のところ、ラズパイ上でGUI動作させようとすると重たすぎるので目的があれば、という感じでしょうか。

目的が達成できたら、vncserverを終了します。

```
tightvncserver -kill :1
```

とコマンド入力し、下記ログが出たら終了です。

```
Killing Xtightvnc process ID xxxx
```

おつかれさまでした。
Photoshopのアセット書き出し機能の設定


Photoshopの[**Generator機能**](https://helpx.adobe.com/jp/photoshop/how-to/export-image-web.html)を使って、コーディング用のスライス画像を書き出す方法のコツ。

1. レイヤー名、またはグループ名を書き出したいファイル名 (+拡張子) にする。
2. 矩形領域を指定したいときはベクトルマスクをセットしておく。
3. ファイル > 生成 > 画像アセット を **ON** にする。

## 2x画像のサポート

Retinaサイズ (2x) でつくったデザインデータから、実寸と半分のサイズの画像の両方を同時に書き出したい時は、psd内にオプション指定用の空のレイヤーをつくって、レイヤー名を 
`default 2x/ + 50% 1x/`
にすると、実寸の画像を2xフォルダに、50%に縮小した画像を1xフォルダに保存できる。

## 3x画像のサポート

さらに同時に3xの画像を書き出したい時は、上記オプションレイヤーを、
`default 2x/ + 50% 1x/ + 150% 3x/`
にする。
ベクターデータや高解像度のデータを内包したスマートオブジェクトは、劣化せずに拡大される。

その他、ファイル名のプリフィックス / サフィックスの指定や、レイヤー毎の細かな設定については、[Photoshop ヘルプ | レイヤーからの画像アセットの生成 | アセットの初期設定の指定](https://helpx.adobe.com/jp/photoshop/using/generate-assets-layers.html#default_settings) を参照。
Nightmare.jsでQiitaのコントリビューション数をスクレイピング


岩手県立大学アドベントカレンダー3日目です。 @otukutun が書いてくれてないのでサクッと。

[Nightmareがv2(Electronベース)になり、使いやすく感動したのでLIGブログのPV/UUデータ取得を自動化してみた。](http://qiita.com/n0bisuke/items/8a7a52321380e5cf0379)に書いたんですけど、Nightmareでスクレイピングするのが楽しくなっています。

## Qiitaのアカウントのコントリビューション数を取りたい。

QiitaのAPIにユーザーのcontributionを取るAPIってなさそう...?
https://qiita.com/api/v2/docs#ユーザ

そんな気がしたのでスクレイピングしてみました。

## Nightmareでスクレイピングしてみよう。

>ES6(2015)ですがNode.jsではimport文がまだ実装されてないみたいなので`require`部分だけ気持ち悪いかもです。

![](https://i.gyazo.com/1e8e2e86f0d2e8ed187414b110c06372.png)

こんな感じでDevToolで確認すると`.userPage_contributionCount`というセレクタの中身が目当ての数字みたいですね。

```qiita.js
'use strict'

const Nightmare = require('nightmare');
const vo = require('vo');
const URL = 'http://qiita.com/'+process.argv[2];
const MY_SELECTOR = '.userPage_contributionCount';

//Qiitaの情報取得
function getInfo(nightmare){
  return nightmare
    .goto(URL)
    .wait(MY_SELECTOR)
    .evaluate((selector) => {
      return document.querySelector(selector).innerText;
    }, MY_SELECTOR);
}

//メインのフロー
vo(function* () {
  let nightmare = Nightmare({ show: true });
  let contribution = yield getInfo(nightmare); //qiitaのコントリビューション数
  yield nightmare.end();
  return contribution;
})((err, result) => {
  if (err) return console.log(err);
  console.log(result);
});

```

コントリビューション数を調べたいユーザー名を実行時の引数にすればOKです。

```bash
$ node qiita.js n0bisuke
2779
```

めちゃ簡単...!

node-cronとか使って定期実行させつつストック数遷移とかグラフ化したら面白そうですよね。
メンバーのコントリビューション数も取ってランキングとか作れそうですね笑

色々と楽しいことできそうです。


4日目は@otukutunのハズ...!
カーネル再構築簡単メモメモ

#### カーネル構築簡単メモメモ
いろいろカーネルのソースコードを色々試していたら知識の整理したくなったので自分用にめもしてみる。

##### カーネルソースコードのありか
カーネルソースコードの種類は２種類あって

* kernel.org版(xzとかで圧縮されてる)

* kernel.orgにパッチをあてたディストリビューション版(ソースパッケージとして提供されてる。拡張子はredhat系とかだとsrc.rpmとか)

##### どっち使うのか
* 最新版使いたいーとかだとkernel.org
  - ディストリビューション上でカーネルを最新版にする場合、現在のディストリビューションのカーネル設定ファイル(/boot/.confing-カーネルバージョン)をcpすればよし。そしてmake oldconfig(設定変えない場合)or make menuconfigすればよし。
* ディストリビューションのカーネルをデバッグしてみたーい時に現在のディストリビューションと同じカーネルソースが欲しい場合とかだと各ディストリビューションのソースパッケージを使う。
  - rpmbuildコマンド
     + バッチが適用されたソースコード＆適用していないバニラカーネルソースコードも作ってくれる。!
     + ビルドすればrpmパッケージつくってくれる。
     + そのrpmに対してrpm -ivh で作成したカーネルをインストールできるみたい(試したことなし)
     + ソースコードのルートディレクトリで普通にmake && make && module_install && make installしてもインストールされるみたい。(やってみた)
composerパッケージのファイル構成

# ディレクトリ構成

Packagistに登録されているパッケージはある程度標準的なファイル／ディレクトリ構成がありますが、作者や依存するフレームワークなどによって微妙に違います。

標準的でCI用の設定が整ったパッケージ構成とは？という点で検討した現在の構成を紹介します。（Auraフレームワークが採用している構成に近いもので[BEAR.Sunday](http://bearsunday.github.io/)で採用しているものです）

<img width="191" alt="スクリーンショット 2015-12-03 1.48.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/3940/b1d1e9e2-64b2-6221-b87c-7a1f7c475256.png">

## パッケージフォルダ名

.(ドット）区切りで{ベンダー名}.{パッケージ名}にしています。Auraと同じです。

## bin
(あれば）PHP実行ファイルを格納します。

## src
`libs`, `lib`などもありますが`src`が一般的です。srcのクラスファイルは例外やアノテーションなどを除いてサブディレクトリを作らずにフラットに設置します。traitはセッターインジェクションのコードを除いて原則使いません。

## tests
`bootstrap.php`ファイルは`tests`フォルダに入れています。`phpunit.xml.dist`をプロジェクトのルートページにおいておくと`phpunit`とパラメーターなしでテストが実行できます。

namespaceは対応するsrcと同じにします。そうすると`use`でインポートする必要がありません。MockやStubは全部Fakeというプリフィックスをつけて`tests/Fake`フォルダに格納します。

## docs

`docs/demo`にデモコードを設置しています。他にドキュメントとなるようなものがあればこのフォルダに置きます。

## LICENSE

MITが多いようです。ファイル名は`LICENSE`で拡張子はありません。


## CI / QA 設定ファイル

```xml:phpunit.xml.dis
<phpunit bootstrap="tests/bootstrap.php">
    <testsuites>
        <testsuite>
            <directory suffix="Test.php">tests</directory>
        </testsuite>
    </testsuites>

    <logging>
        <log type="coverage-html" target="build/coverage"/>
        <log type="coverage-clover" target="build/logs/clover.xml"/>
        <log type="junit" target="build/logs/junit.xml" logIncompleteSkipped="false"/>
    </logging>

    <filter>
        <whitelist>
            <directory suffix=".php">src</directory>
        </whitelist>
    </filter>
</phpunit>
```

```yaml:.scrutinizer.yml
filter:
    paths: ["src/*"]
tools:
    external_code_coverage: true
    php_code_coverage:
        timeout: 1200
    php_sim: true
    php_mess_detector: true
    php_pdepend: true
    php_analyzer: true
    php_cpd: true
    php_mess_detector:
        enabled: true
        config:
            ruleset: ./phpmd.xml
    php_code_sniffer:
        enabled: true
        config:
            ruleset: ./phpcs.xml
```

```yaml:.travis.yml
language: php

php:
  - 5.5
  - 5.6
  - hhvm
  - 7

install: travis_retry composer install --no-interaction --prefer-source

script:
 - if [ "$TRAVIS_PHP_VERSION" == "hhvm" ]; then phpunit; fi
 - if [ "$TRAVIS_PHP_VERSION" != "hhvm" ]; then phpunit --coverage-text --coverage-clover=coverage.clover; fi

after_script:
 - wget https://scrutinizer-ci.com/ocular.phar
 - if [ "$TRAVIS_PHP_VERSION" != "hhvm" ]; then php ocular.phar code-coverage:upload --format=php-clover coverage.clover; fi
```

 * `hhvm`はカバレッジの値が不安定で`TRAVIS_PHP_VERSION`を見て外しています。
 * scrutinizerのスコアは`10.0`、テストカバレッジ`100%`を標準と考えています。

他に以下のファイルを置いています。

 * .php_cs
 * build.xml
 * phpcs.xml
 * phpmd.xml
 
## 参考

* [composer testでQAツールの実行] (http://qiita.com/koriym/items/036dc0ceda5606be473b)のphpmd.xml / phpcs.xml
SwiftBond v4系でアニメーションせずにUITableViewの更新ができるようになりました！


ViewBindingで有名な[SwiftBond](https://github.com/SwiftBond/Bond)ですが、つい3時間前にアニメーションせずにUITableViewとUICollectionViewの更新ができるようになりました。

実はこれ、v3系ではできていたんですが、Swift2.0にアップデートすると上げざるをえないv4系ではできなくなっていたんですね。。。

それが今日できるようになりました。よかった。

## v4.3.0

Support for non-animatable collection/table view updates.

![スクリーンショット 2015-12-03 02.41.05.png](https://qiita-image-store.s3.amazonaws.com/0/24041/7a039165-6f1a-30c1-8ba9-8158fa887d4f.png "スクリーンショット 2015-12-03 02.41.05.png")

## 具体的なコードはこちら（要点のみ）

いつも通りtableViewにdataSourceをバインドして、、でも、今回は、proxyDataSourceを指定します。proxyDataSourceは`BNDTableViewProxyDelegate`に準拠している必要があります。

```
dataSource.bindTo(tableView, proxyDataSource: self) { (indexPath, dataSource, tableView) -> UITableViewCell in
    let string = dataSource[indexPath.section][indexPath.row]
    ...
    return cell
}
```

そして、`BNDTableViewProxyDelegate`のこちらのメソッドを実装します。

```
func shouldReloadInsteadOfUpdateTableView(tableView: UITableView) -> Bool {
    return true
}
```

「UITableViewのUpdateじゃなくて、Reloadを行う」って意味のメソッドです。これだけ！やった！

## プルリク送りました

実はこれ僕がpull request送りました。ただ、議論の末にマージされた時点ではだいぶ形が変わりましたが、実現したいことは作者と同じでブレていなかったので最終的にマージされました〜。よかった！

- [Add tableView reload option in BNDTableViewProxyDataSource by morizotter · Pull Request #211 · SwiftBond/Bond](https://github.com/SwiftBond/Bond/pull/211)

v4系に上げてうまく動かないと苦しんでいる誰かのお役に立てれば！

## SwiftBond

[SwiftBond/Bond](https://github.com/SwiftBond/Bond)
Hacker Newsのすすめ

**「Hackerはクソコードの上にクソコードを造らずクソコードの下にクソコードを造らず」**

つまりクソコードはクソコードであり続けるということです。多分。

それはさて置き、僕はHackerNewsが好きです。毎日HackerWeb[^HackerWeb]経由でチェックしています。

なぜ好きなのか。正直なんで毎日見てるのかは僕もよくわからないのですが、とりあえず僕がHackerNewsを好きな理由を挙げてみます。

## ネタの渦中の人がよく湧いている
HackerNewsは外国では非常に有名らしいY Combinator[^ycombinator]という会社がやっているニュース投稿サイトです。そのせいか話題の渦中の人がなんか降って湧いてたりします。

```
Disclaimer: I'm xxx enginner working for XXX
```

みたいな文が投稿の頭やお尻にあると、「あ、これ降臨召されてますわ」とダイレクトな情報に触れているという興奮を味わうことができます。

## なんか深い記事が多い（気がする）
日本語でも技術ネタで深い記事を書かれている人はいらっしゃると思いますが、やはり話者の数は圧倒的に英語の方が多いので、その結果深い記事も多いのではないかと思います。

僕が最近HackerNewsで見かけた深い記事は、色々ありすぎて紹介しきれないのですが、次の2つとかどうでしょうか。

[new Fn(...) vs. Object.create(P)](http://mrale.ph/blog/2014/07/30/constructor-vs-objectcreate.html)
概要: V8（Googleが作っているJavascript実行エンジンです）だと`new Fn()`を使った方が`Object.create()`より効率的だよ、というのを図解で説明してくれている記事

[The secret message hidden in every HTTP/2 connection](http://blog.jgc.org/2015/11/the-secret-message-hidden-in-every.html)
概要: HTTP2のコネクションの序文でクライアントが送る文字列には`PRISM`が隠されているという記事（某NSAさんの監視プログラムへのオマージュだと思います）

面白いですよね！こういう海外の深い・面白い系の記事はたまーにPOSTD[^postd]とかInfoQ[^infoq]とかが和訳してくれているイメージがありますが、やはり元のオリジナルである英語記事に触れておくのが一番いいと思います。

## 飾らないインターフェース
Hacker News[^HackerNews]のサイトを見るとクッソシンプルなデザインであることがわかります。色合いもシンプルで最高ですね。でも一応レンスポンシブっぽい感じになっていて、必要な部分は抑えている気がします。僕はそういうデザインが好きです。

## 投稿量が多い
朝見て夜見たら大体投稿が入れ替わっています。なんで飽きがこないです。逆に言うとある程度張り付いてないと面白い投稿を見逃す可能性が高いです。

# まとめ
この記事は深夜2時に書かれたものであり、僕は今日も仕事があります。ご了承ください。

**こんな記事で大丈夫か**

[![LGTM](http://lgtm.in/p/wyfWgngOp)](http://lgtm.in/i/wyfWgngOp)

[^HackerWeb]: https://cheeaun.github.io/hackerweb/
[^ycombinator]: https://www.ycombinator.com
[^postd]: http://postd.cc
[^infoq]: http://www.infoq.com/jp/
[^HackerNews]: https://news.ycombinator.com