OmniAICreator/Qiita-1.07M huggingface dataset:
GoogleAppEngine/pyでLINE bot作る。シンプル全裸バージョン

LINEbotって1on1ですよね。よくあるボットみたいにグループに加えるって出来ないですかね？

さて、LINE botですがSSLなサーバが必要なところがハードル上げています。
ここはhttpsレディーなGAEでさくっと作っちゃいましょう。
問題は、meg send時にIPを固定する方法ですがここは泥臭くやります。後ほど記述します。


# Pythonのライブラリ
flask使いますので、プロジェクトフォルダー内にlib掘ってpipしちゃいましょう

```:sh
$ pip install -t lib flask
```

# GAEソース

```:python 

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import logging
import urllib
import json
from google.appengine.ext import vendor
vendor.add('lib')
from google.appengine.api import urlfetch

from flask import Flask
from flask import request

app = Flask(__name__)

@app.route('/')
def index():
  return 'hello my line bot'

@app.route('/callback', methods=["POST"])
def linebot():
  args = json.loads(request.get_data().decode('utf-8'))
  logging.debug('kick from line server,\n %s'%(args['result']))
  for msg in args['result']:
    kickBot( msg["content"]["from"], msg["eventType"], msg["content"]["text"] )
  return "{}"

def kickBot(tgt_id, event_type, msg_data):
  url = "https://trialbot-api.line.me/v1/events"
  form_fields = {
      "to": [str(tgt_id)],
      "toChannel": 1383378250,
      "eventType": 138311608800106203,
      "content":{
        "contentType":1,
        "toType":1,
        "text":u"全裸で %s !"%(msg_data)
        }
      }
  logging.debug(form_fields)
  form_data = urllib.urlencode(form_fields)
  result = urlfetch.fetch(
    url=url,
    payload=json.dumps(form_fields,ensure_ascii=False),
    method=urlfetch.POST,
    headers={
                'Content-type':'application/json; charset=UTF-8',
                'X-Line-ChannelID':'<YOUR-ID>',
                'X-Line-ChannelSecret':'<YOUR-SECRET>',
                'X-Line-Trusted-User-With-ACL':'<YOUR-ACL>?',
            }
    )
  if result.status_code == 200:
    logging.debug(result.content)
  else:
    logging.debug(result.content)

```

```:yaml
application: <YOUR-GAE-NAME>
version: 1
runtime: python27
api_version: 1
threadsafe: yes

handlers:
- url: /favicon\.ico
  static_files: favicon.ico
  upload: favicon\.ico

- url: .*
  script: main.app
```

# LINE botの設定

## CallBackの設定

`/callback` にLINEサーバメッセージを送ってもらうようにします。
`https://developers.line.me/channels/<YOUR-CHANNEL-ID>` 
LINEのDevコンソールでCallback URLに登録しておきます。

`https://your-gae.appspot.com:443/callback`


## Whitelist IPの登録方法

上記GAEアプリをリリースして、botにつぶやいてみましょう。
この時点では返信が来ません。LINEbotサーバに、IPを登録してないからです。
GAEで、公開したアプリ名に紐付いているIPと、urlfetchが実行されるサーバのIPは
同一じゃないため、実際にGAEからLINEbotを叩いてIPを調査する必要があります。

GCPのLoggingコンソールに、`そんなIPしらんがな！` みたいなエラーが出ていると思います。こんなやつです。

```
{"statusCode":"427","statusMessage":"Your ip address [今回のアドレス] is not allowed to access this API."}
```

この `今回のアドレス` に出ているIPを、LINEのDevコンソールのWhiteListに登録しちゃいます。何回かやったらいくつか違うのが出るかもしれません。都度登録してください。
私の場合３つほど登録したところで、それ以上増えませんでした。（GAEのバージョン変えたり、デプロイもしています）

これで、botから返事が来るようになります。

<img width="297" alt="スクショ.png" src="https://qiita-image-store.s3.amazonaws.com/0/4036/b865f59e-02d4-d26f-309a-1363c1778002.png">


# 注意

この実装はあくまでチェック用の実装です。
シンプルなテキストのみなので、ビデオだったり画像だったりtypeを変えてみてどうなるか？チェックする程度にしてください。理由は、ある程度のトラフィックさえ捌けないためです。 [詳細はコチラをチェック](http://qiita.com/yoichiro@github/items/6d4c7309210af20a5c8f)

今後TQ使って非同期に受け流すバージョンを作成する予定です。
CentOSでZabbixシスログ監視

#Zabbixマネージャが既にいて、Linuxエージェント追加の話ね。

やあ、ぼくだよ！
(注：本書は余計な言い回しが多いので不快に思われる方は見ないほうが懸命ですのん）

「新しいLinux仮想サーバ入ったんでシスログ監視いれといてね！わかるっしょ？
VPN接続とアカウントだけ渡すからさ、サクッとね。」

足元見透かされたような無茶振りをさらっと言われたことは無いですか？
なんちゃってSEの僕は、パワハラだ！嫌がらせだ！。。って思う瞬間です。



#さあ検証はじめましょう
とりあえず、体調悪い振りして早く帰って自宅で検証予習したよね。
●パブリッククラウドの環境ですが、NW疎通ができるんであればオンプレとか環境差異はございませんの。
●Zabbixマネージャーは既設のものであることご注意ください。（以下マネージャーについてはエージェント登録に関する設定のおはなしです）
●Agentインストールして登録させるよね。自動登録があるのなんかわからない初心者は手動でやったよね。（自動登録できる場合はすっ飛ばせる内容があります）
●監視対象/var/log/messageの重要なエラーを示すキーワードを検知させるよね。（まあ一般的な検知の設定です）

➡︎引っ越しました。よかったらこちらのリンクよりご覧下さい。
http://amachan007.techblog.jp/archives/7933834.html
Swiftのドキュメンテーションコメントをjazzyで出力

Swiftのフレームワークを作っていて、コメントからドキュメントを吐き出す必要に迫られたので、いろいろ調べていましたが、Rubyライブラリのjazzyというgemを使えばよさそうだなというところまで辿りつきました。

### Ruby環境の構築
まずは、Rubyの環境を整えるところから。rbenvを入れるところからです。

```shell-session:
$ brew update
$ brew install rbenv ruby-build
 
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
 
$ source ~/.bash_profile
$ rbenv --version
```

続いて、Rubyのインストール。ここでは2.3.0をインストールしています。インストールは5～10分くらいかかる感じです。

```shell-session:
$ rbenv install --list
$ rbenv install 2.3.0
```

で、インストールしたバージョンの選択。

```shell-session:
$ rbenv global 2.3.0
```

### jazzyのインストール

jazzyのインストールは、gemで一発です。

```shell-session:
$ sudo gem install jazzy
```

### 実際にjazzyでドキュメントを吐き出してみる

```shell-session:
jazzy --min-acl public --skip-undocumented -o jazzy_doc --swift-version 2.1.1
```

今回はフレームワークの出力なので、出力レベル(--min-acl)はpublicです。これを指定すると、internalやprivateのメソッドは出力されません。あと、--skip-undocumentedで、ドキュメントのないソースは無視するっぽいです。-oで出力先を指定します。

ここで落とし穴

* 実行するパスは *.xcodeprojのあるディレクトリでないといけない
* Xcodeが最新バージョンでない場合、swiftのバージョンを指定する必要がある。


現場からは以上です。

### 参考
http://dev.classmethod.jp/server-side/language/build-ruby-environment-by-rbenv/
http://grandbig.github.io/blog/2016/01/12/jazzy/
プログラマの考え方が○○本より(Python)

先日の投稿にコメントいただけたので早速反省を生かして
参考書の続き頑張ってみます（ググりながら(´Д` )）

<h1>正方形の半分を表示する</h1>
>textcout << "#"と cout << "\n"の２つの出力文だけを使い、
ハッシュ記号(#)で5 x 5の正方形を
半分にした形（直角三角形）を作るプログラムを書いてみよう

<h3>解答</h3>
```
>>> str = '#####'
>>> for i in range(5,0,-1):
...     slice = str[:i]
...     print(slice)
... 
#####
####
###
##
#
>>> 

```

ちなみにfor文いまいちわかっていませんが、前回コメントをコピペで動かしながら
調整してみました。

while文だと

```
>>> str = '#####'
>>> i = 5
>>> while i > 0:
...     slice = str[:i]
...     print(slice)
...     i -= 1
... 
#####
####
###
##
#
```

いかがでしょうか？
次回も続けてみます。
【Spring】pom.xmlファイルの初期設定の方法

#pom.xmlに追加するコード
以下のコードをpom.xmlに追加
**【注】こちらのコードは自分用のメモとして記載するものです。必要なものは適宜追加してください。**

```pom.xml
<!-- urlタグの下を以下のコードに修正(コピー＆ペースト) -->
<!-- ここから貼り付け -->
  
  <!-- 基本 -->
  <parent>
  	<groupId>org.springframework.boot</groupId> 
  	<artifactId>spring-boot-starter-parent</artifactId>
  	<version>1.2.3.RELEASE</version>
  </parent>
  
  <dependencies>
  
	  <!-- web -->
	    <dependency>
			<groupId>org.springframework.boot</groupId> 
			<artifactId>spring-boot-starter-web</artifactId>
	    </dependency>
	    
	  <!-- test -->
	    <dependency>
			<groupId>org.springframework.boot</groupId> 
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
	    </dependency>
	    
	  <!-- jsp -->	    
	    <dependency>
        	<groupId>org.apache.tomcat.embed</groupId>
        	<artifactId>tomcat-embed-jasper</artifactId>
        	<scope>provided</scope>
		</dependency>

	  <!-- jstl -->
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>jstl</artifactId>
		</dependency>

	  <!-- lombok -->		
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<version>1.14.0</version>
			<scope>provided</scope>
		</dependency>
		
	  <!-- JDBC -->		
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-jdbc</artifactId>
		</dependency>

	  <!-- PostgreSQL -->		
		<dependency>
			<groupId>org.postgresql</groupId>
			<artifactId>postgresql</artifactId>
			<version>9.4.1207</version>
		</dependency>
		
  </dependencies>
  
  <!-- maven plugin -->
  <build>
  	<plugins>
  		<plugin>
			<groupId>org.springframework.boot</groupId> 
			<artifactId>spring-boot-maven-plugin</artifactId>  			
  		</plugin>
  	</plugins>
  </build>
  
  <properties>
  	<!-- java version -->
  	<java.version>1.8</java.version>
  </properties>
</project>
```
Vim | 行頭への移動は ^  行末への移動は $

表題の通り。
正規表現と同じなので覚えやすい。

# 環境

- version 7.3  



<!-- Update From Qiita API -->

# チャットメンバー募集


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

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


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
Carthage 0.16でリリース用アーカイブがOther Itemsに表示される問題

***

※追記(4/13 10:13)
v0.16.1で問題が解決されたようです。
v0.16を使用している方は下記のようにアップデートをおすすめします。

```bash
%brew update
%brew upgrade
```

# 問題
Carthage v0.16を利用していたプロジェクトでAppStore申請用ビルドをすると、なぜかOther Itemsという項目にパッケージが表示されるので色々試行錯誤してみたのですが、Carthage v0.16のバグのようでした。

# 現象
Carthageをセットアップする際、xcodeのBuild Phasesで`/usr/local/bin/carthage copy-frameworks`を有効にしていると思いますが、この状態でArchive作成するとオーガナイザのOther Itemsという項目に表示されます。
![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/5699/e73754ce-5b67-9df3-e5fd-4807217c393c.jpeg)

`carthage copy-framework`を外すと正常にビルドできていたのでこの辺が怪しい。。。

# 原因
> v0.16: Archiving an iOS App lists the app unter "Other Items"
https://github.com/Carthage/Carthage/issues/1259

# 対応方法
すでにCarthageで[対応](https://github.com/Carthage/Carthage/pull/1261)されているようですが、新しいバージョンがリリースされるまでとりあえずの回避策としてcarthageのバージョンを落とします。

```bash
%brew info carthage
arthage: stable 0.16 (bottled), HEAD
Decentralized dependency manager for Cocoa
https://github.com/Carthage/Carthage
/usr/local/Cellar/carthage/0.15.1 (37 files, 11.9M)
  Poured from bottle
/usr/local/Cellar/carthage/0.15.2 (37 files, 11.9M)
  Poured from bottle
/usr/local/Cellar/carthage/0.16 (44 files, 11.6M) *
  Poured from bottle
From: https://github.com/Homebrew/homebrew-core/blob/master/Formula/carthage.rb
```
ということなので0.15.2に変更します。

```bash
%brew switch carthage 0.15.2
Cleaning /usr/local/Cellar/carthage/0.15.1
Cleaning /usr/local/Cellar/carthage/0.15.2
Cleaning /usr/local/Cellar/carthage/0.16
5 links created for /usr/local/Cellar/carthage/0.15.2
```

とりあえずはこれで申請用ビルドができるようになると思います。
Railsエンジニア向けCMS「Scrivito」を試してみた。

この一週間、[Scrivito](http://scrivito.com)を使ってみて思ったことをまとめてみました。
Scrivitoに興味を持っている人の参考になれば幸いです😆

#Scrivito

##全体の構造
- チームでの利用を重視しており、一つ一つの機能が独立している
    - コラボレーション：二人が同時にページをeditしていても、リアルタイムに変更点の共有が可能。
    ![1.png](https://qiita-image-store.s3.amazonaws.com/0/1857/7a40343f-28e4-ff35-0091-86f01293a25b.png)
    - ブランチ：ページを変更するときにコピーを作り、変更した部分だけをmerge/publishする。
    ![2.png](https://qiita-image-store.s3.amazonaws.com/0/1857/80119867-c6f1-aa9a-b4f7-caeb6f95f205.png)
    - オプション：ユーザーの総合的な管理を追加できる。例えば誰でも変更はできるがアドミンの承認が必要やWiki並の自由さでも可能。
- クラスという機能で、どのページにもフォームや自作オブジェクトをadd-onみたいに追加できる。
    - ウェジェット：レイアウト変更のためにテキストボックスやカラムなどを選択して配置する。
    ![3.png](https://qiita-image-store.s3.amazonaws.com/0/1857/6e684fb5-6145-674d-89a5-d1b3fce33513.png)


    - オブジェクト：ブログやフォームなど特殊なページを追加する。
    ![4.png](https://qiita-image-store.s3.amazonaws.com/0/1857/d27ab64d-51de-dcd9-6ce5-992634a19ae0.png)

    - カスタム：gemや自作のオブジェクトを追加できる機能。


##使用感
コンテンツとシステムがしっかりと別れており、誰でもコンテンツを自由自在に変更できるようになっている。使用感としては、Wikipediaにレイアウト変更機能がついた感じになっていると思う。
コンテンツとシステムを今まで一緒に変更してきた人には、とても違和感があると思う。ここまで、切り離すことができるのか、っとビックリした。

## Scrivitoに関する参考情報 
- :page_facing_up: 公式サイト: https://scrivito.com/ 
- :dash: Getting Started: https://scrivito.com/getting-started 
- :books: Documentation: https://scrivito.com/documentation 
- :octocat: [Scrivito/example_app](https://github.com/Scrivito/example_app)
aws ec2, g2-2xlarge, ubuntu14.04にtensorflowを導入する。


基本的には以下ブログのどれかあたりを踏襲する。
https://gist.github.com/erikbern/78ba519b97b440e10640
http://qiita.com/haruoaoki/items/294262d98e1223008252

以下変更点

git checkout tags/0.1.0
は
git checkout tags/0.1.4
へ変更。でないと以下のページによればうまくいかない
参考：https://github.com/tensorflow/tensorflow/issues/927

さらに
bazel ./compileでjava-1.8.0-openjdk-amd64がないとうまくいかないので、
openjavaのバージョンを1.8へ変更
参考：https://howtos.gattaz.net/2015/09/14/install-java-and-eclipse-on-ubuntu-14-04/
　　　http://note.kurodigi.com/ubuntu1404-openjava8/

既出だがCuda compute capabilityうんぬんの問題があるので
TF_UNOFFICIAL_SETTING=1 ./configure
実行時にはCuda compute capabilityを3.0に指定する。

また最後の
sudo pip install /tmp/tensorflow_pkg/tensorflow-0.5.0-cp27-none-linux_x86_64.whl
も基本tensorflowのバージョンが古いのでインストールしたバージョンを選びなおしてインストール
「戻る」ボタンを作るときは<button type="button" >で。

## 枕
なんとか更新を続けられている。脱三日坊主を目指します。
## 本題
下記のようなボタンを作った時のこと

```html
<button onclick="history.back()">戻る</button>
<button type="submit" id="submit">登録</button>
```
「登録」ボタンで次画面に遷移するのはいいのですが、なぜか「戻る」ボタンを押してもsubmit判定されて次画面に遷移しまいました。

この理由は	[MDNによるbutton 要素に使える属性の解説](https://developer.mozilla.org/ja/docs/Web/HTML/Element/button#Attributes)に書いてありました。
>**type**
submit: 自身が属するフォームのデータをサーバーに送信するボタンとなります。これは type 属性が指定されていない場合、もしくは属性値が動的に空にされたり不正な値にされた場合のデフォルトの動作です。

なるほど。button要素にtype属性を指定しないと、type="submit"の扱いになるHTMLの仕様なんですね。
リセットボタンとかを作る時も同様の注意が必要ですな。
というわけで、

```html
<button type="button" onclick="history.back()">戻る</button>
<button type="submit" id="submit">登録</button>
```
と修正してきちんと動くようになりました。
分かってしまえば非常に単純ですが、つい見落としてしまいました。
### 所感
読んでくださりありがとうございました。（このくらいのさくっと30分以内に執筆出来る記事を増やしていきたいです）
GitHub の Octocat にしゃべらせる

# 概要

![original.jpg](https://qiita-image-store.s3.amazonaws.com/0/41416/2467bd93-b419-9f8b-e43b-1256c1407c38.jpeg)

しゃべらせる

# しゃべらせ方

[octokit](https://github.com/octokit/octokit.rb) を入れる

```
gem install octokit
```

しゃべらせる

```rb
require 'octokit'

client = Octokit::Client.new

puts client.say('Hello Octokit')
```

しゃべった

```

               MMM.           .MMM
               MMMMMMMMMMMMMMMMMMM
               MMMMMMMMMMMMMMMMMMM      _______________
              MMMMMMMMMMMMMMMMMMMMM    |               |
             MMMMMMMMMMMMMMMMMMMMMMM   | Hello Octokit |
            MMMMMMMMMMMMMMMMMMMMMMMM   |_   ___________|
            MMMM::- -:::::::- -::MMMM    |/
             MM~:~ 00~:::::~ 00~:~MM
        .. MMMMM::.00:::+:::.00::MMMMM ..
              .MM::::: ._. :::::MM.
                 MMMM;:::::;MMMM
          -MM        MMMMMMM
          ^  M+     MMMMMMMMM
              MMMMMMM MM MM MM
                   MM MM MM MM
                   MM MM MM MM
                .~~MM~MM~MM~MM~~.
             ~~~~MM:~MM~~~MM~:MM~~~~
            ~~~~~~==~==~~~==~==~~~~~~
             ~~~~~~==~==~==~==~~~~~~
                 :~==~==~==~==~~
```

しゃべった、しゃべった
Rubocop にひどいバグを見つけた話

## 2016/09/14追記
ファイルを開く時のモードに関するバグは拙い英語力+機械翻訳で頑張って[issue](https://github.com/bbatsov/rubocop/issues/3401)登録した結果
[修正されました](https://github.com/bbatsov/rubocop/commit/3f7b48e715f111b592dea33ae3e741eeeed338d5)

.rubocop.ymlの文字コード問題についても
[多分修正されてます](https://github.com/bbatsov/rubocop/commit/b35167a8d103ea1e5e07b86b9a4f5b80995e15a2)

# 短気向けまとめ
Windows でこそ必要な改行コードのLF強制がWindows環境で無効化される
原因は、テキストモード

```diff:processed_source.rb.diff
--- a/lib/rubocop/processed_source.rb	Fri Mar 25 11:24:05 2016
+++ b/lib/rubocop/processed_source.rb	Tue Apr 12 10:57:16 2016
@@ -14,7 +14,7 @@
                 :parser_error, :raw_source, :ruby_version
 
     def self.from_file(path, ruby_version)
-      file = File.read(path)
+      file = File.read(path, mode:'rb')
       new(file, ruby_version, path)
     rescue Errno::ENOENT
       raise RuboCop::Error, "No such file or directory: #{path}"

```

# きっかけ
いつの間にか、改行コードがCRLF/LF入り混じったソースが混じってて
「あれ？ Rubocopで検査してるはずなのに、こんなの通しちゃうの？」
と思って調べたら Style/EndOfLine で検査してる事が判明する。
.rubocop.yml でEnabled: true にしてみても通過してしまう。

# 調査

```shell-session
rubocop -rpry -C false <<crlf.rb>>
```

で pryを挿入して rubocopのソースの中に適宜 binding.pry を挿入してみると
あれ、\r が消えてる。

# 原因
十中八九テキストモードで
他にありうるケースとして入力文字列を自分で合成してたんだろ。
とアタリをつけて、おもむろに caller でコールスタック出して遡った結果
冒頭に書いた場所を書き換えると、

```shell-session
crlf.rb:1:1: C: Carriage return character detected.
```

警告きた！

## コマンドラインからだと直ったけど
私は、Atom で編集して保存時に自動的にRubocop掛けてるのですが
このパッチ適用後でも\rを検知してくれませんでした。

そこで今度はソースを$stdin で検索して

```diff:options.diff
--- A/lib/rubocop/options.rb	Fri Mar 25 11:24:05 2016
+++ B/lib/rubocop/options.rb	Tue Apr 12 11:26:55 2016
@@ -131,7 +131,7 @@
 
       option(opts, '-v', '--version')
       option(opts, '-V', '--verbose-version')
-      option(opts, '-s', '--stdin') { @options[:stdin] = $stdin.read }
+      option(opts, '-s', '--stdin') { $stdin.binmode; @options[:stdin] = $stdin.read }
     end
 
     def add_list_options(opts)
```

# Rubocop on Windows の他のバグ
他にも、ほぼWindows特有のバグとして
.rubocop.ymlの文字コードがデフォルトエンコーディングに依存するというものがある。

つまり、.rubocop.yml内にコメントを日本語で書くと
特別な設定なしの場合

- 非windowsの場合: utf-8
- windowsの場合: cp932

にしないといけない


以上２つのバグは私の英語力/RSpec力超えてて報告できないので
とりあえずQiitaに晒しときます。
Semantic Versioning の範囲指定の備忘録

node の package.json とかで `~` とか `^` を見た時にどういう意味だかよく忘れるので備忘録がてら

ドキュメントは[公式で詳しくまとまっているので](https://docs.npmjs.com/misc/semver)見に行ってみると良いと思う。

# Semantic Versioning (semver) のおさらい
Semantic versioning はバージョン管理の命名規則を標準化する事で、依存関係の定義や互換性の判断を簡単、正確に行えるようにしようという取り組み。

バージョンを３つのセクションで区切り、以下の意味付けをしている。

- Major: 後方互換性を保証しないバージョンアップ
- Minor: 後方互換性を保証した機能追加などのバージョンアップ
- Patch: 後方互換性を保証したバグの修正によるバージョンアップ

# semver の範囲指定
npm では semver を使って依存関係を指定していて、そこで特殊な記号である特定の範囲を表してる。

## `~`: ~~Patch Range~~ [Tilda Ranges](https://docs.npmjs.com/misc/semver#tilde-ranges-123-12-1)
~~Major, Minor のバージョンは一致している必要があり、 Patch バージョンは指定したものよりも上であればOK~~

基本は Patch レベルでの互換性があればアップデートを許可するための書式として覚えればいい。
んだけど、続くバージョンの書き方で挙動が変わる難儀なやつ。
具体的には「Minor バージョン以下も記載している」ときと「Major バージョンのみを記載している」ときで変わる。

#### Minor バージョン以下も記載しているとき

Major, Minor のバージョンは一致している必要があり、 Patch バージョンは指定したものよりも上であればOK

Patch バージョンが省略されている場合は `0` とみなされるので、基本どんな Patch バージョンでも良くなる

#### Major バージョンのみを記載しているとき

Major バージョンのみを記載しているときはMinor バージョンも任意のバージョンにマッチするようになる。
つまりは Major のみ固定とみなされる。


## `^`: ~~Major Range~~ [Caret Ranges](https://docs.npmjs.com/misc/semver#caret-ranges-123-025-004) 

> Allows changes that do not modify the left-most non-zero digit in the [major, minor, patch] tuple.

一番最初の **ゼロでないバージョンを固定する**
Major バージョンが 0 でない場合は確かに Major バージョンを固定するが、0 だった場合は Minor バージョンを固定。さらに Minor バージョンも 0 だった場合、Patch バージョンが固定される。

Major バージョンから固定していこうとする意味では間違っていないが、 0 の時に特殊な挙動になるので注意。

~~Major のバージョンは一致している必要があり、 Minor のバージョンは指定したものよりも上であればOK~~
~~Minor レベルでのアップデートであれば許可するための書式~~
自分の理解していたような挙動じゃなかった時があったので確認してみたら、若干違った。。。


# 記号覚えるの辛い

~~ので、自分の中で名前を付けてあげると結構覚えやすくなるんじゃないかな。~~
自分で名前つけて覚えようとしてたけど、期待してたよりもトリッキーな挙動する←
いい線いってるとおもったんだけどなぁ〜

### 記号の場所で覚える

[他の記事](https://qiita.com/takayukioda/items/cb55d3f433af611295a5)で書いたけど、
`^` は上にあるので Major バージョン関係
`~` は真ん中にあるので Minor バージョン関係
覚えるのは結構良いかもしれない。ざっくりだけど、案外これで覚えてたりする。
Bundler.require でのエラーが変わった

（この記事でもともと書いていた解決法はよく考えたらトンデモナイので，「追記：よりマシな解決法（2017-01-21）」をご参照ください）

Ruby のプログラムで gem を読み込むとき，Bundler を使えば gem のバージョンが管理しやすくて便利なのだけど。
ライブラリーの中に `require` でエラーを出すものがあった場合の挙動が，Bundler 1.10 → 1.11 で変わったようなので報告する。

# 経緯

## gtk2 を require するときのエラーを無視したい

gtk2 という gem に含まれる機能を使いたいのだが，gtk2 は本来 GUI 環境で何かするものなので， X Window などの GUI 環境が無いシステムで

```rb
require 'gtk2'
```

とすると，

```
Cannot open display:   (Gtk::InitError)
```

という例外が発生する。いまの場合，このエラーは単純に無視してもかまわないので，

```rb
 begin
   require 'gtk2'
 rescue RuntimeError
 end
```

にすればいい。

## Bundler を使うときはどうするか

Bundler を使うときは，Gemfile に

```rb:Gemfile
gem 'gtk2'
```

と書くわけだが，実際の `require` は

```rb
Bundler.require
```

で行う。

さて，Bundler 1.10.2 の頃は，`Bundler.require` したときに `Gtk::InitError` が出ていたので，ちょっと乱暴だけれども

```rb
begin
  Bundler.require
rescue RuntimeError
end
```

と書いていれば用は足りていた。（`Gtk::InitError` は `RuntimeError` の下位クラス）

## ある日突然死んだ

ところが，ある日突然，プログラムが動かなくなった。その前後でプログラムに変更は加えていないはず。

いろいろな可能性を探っていたところ，Bundler のバージョンが 1.10.5 から 1.11.2 に上がったことが怪しいと思われた。

# 原因と対策

原因は，Bundler 1.11 で，`Bundler.require` 時に gem が出した例外の扱い方が変わったことだった。

Bundler 1.11 では，gtk2 が `Gtk::InitError` を出してもそのままにせず，

```
There was an error while trying to load the gem 'gtk2'. (Bundler::GemRequireError)
```

を出してくれるようになったらしい。

この `Bundler::GemRequireError` は `RuntimeError` の下位クラスではないので，前述の `rescue` では拾ってくれなかったんである。

そこで，

```rb
begin
  Bundler.require
rescue StandardError
end
```

に変えてみたところ，従来通りの動作になった。（`Bundler::GemRequireError` は `StandardError` の下位クラス）

# 感想

焦った～

Bundler を使うと `require` する gem のバージョンが合理的に制御できていいんだけども，`bundler` gem 自体は Gemfile には書かず，バージョンを管理しない（していなかった）。落とし穴だったなあ。

# 追記：よりマシな解決法（2017-01-21）

よく考えたら，bundler の仕様についての記述は問題ないと思うが，問題の解決法としては良くないと思ったので，ここで訂正したい。

まず，Bundler の仕様変更前に使っていた解決法は，

```rb
begin
  Bundler.require
rescue RuntimeError
end
```

だったわけだけど，これだと `atk2` が引き起こすエラー以外も全部無視することになって，他の gem の require で問題が起きていても気づかない。

実際に発生していた例外は `Gtk::InitError` なわけだから，

```rb
rescue RuntimeError
```

でなく

```rb
rescue Gtk::InitError
```

にしておけばマシだったと思う。

Bundler の仕様変更後に対応する解決法でも，

```rb
rescue StandardError
```

ではなく，

```rb
rescue Bundler::GemRequireError
```

とすべきだった。ただ，これでも広すぎる。ほかの gem が同じような例外を出しても `Bundler::GemRequireError` になっちゃうので。

それから，書くのを忘れていたけど，`Bundler.require` での例外を無視するこのような解決法を取る場合，

```rb
gem 'atk2'
```

は Gemfile の一番最後に書かないといけない。
でないと，`atk2` の require で例外が発生したあと，それ以降の gem の require が行われないからだ。

これは実際ハマったんだけど，記事に入れるのを忘れていた。

結局，いまのところ，一番マシな解決法は，`atk2` の require を Bundler にはさせないということだと考えている。

つまり，Gemfile では

```rb:Gemfile
gem 'gtk2', require: false
```

としておいて，自動 require をやめさせる（`Bundler.require` では require されない）

そして，

```rb
Bundler.require
```

したあとに

```rb
begin
  require 'gtk2'
rescue Gtk::InitError
end
```

とする。

これならば `gtk2` による `Gtk::InitError` だけを無視することになって問題が少ない。
また，`Gemfile` 中で `gem 'atk2'` を書く位置が自由になる。
C > coding rule > charの扱い > char:文字の格納に利用 / signed charとunsigned char: 符号の有無に依存する処理に利用

[【改訂版】組込みソフトウェア開発向けコーディング作法ガイド[C言語版] Ver.2.0　[PDF版］](https://www.ipa.go.jp/files/000045164.pdf)

page 132
> P1.3.1 単なる（符号指定のない）char型は、文字の値の格納（処理）にだけ使用し、符号の有無（処理系定義）に依存する処理が必要な場合は、符号を明記したunsigned charまたはsigned charを利用する。

```c
char c = 'a'; /* 文字の格納に利用 */
int8_t i8 = -1; /* 8bitのデータとして利用したい場合は、例えばtypedefした型を使用する */
```



関連: https://www.ipa.go.jp/sec/reports/20150410.html
関連: [charの符号 by SaitoAtsushiさん](http://qiita.com/SaitoAtsushi/items/555b3851017b120c85b7)
Twilio使って、入力した電話番号をチェックする方法 

ユーザー認証行う際に、電話番号を入力してもらうケースが多いですよね？ユーザーが入力した電話番号、正しい（存在しているかどうか）電話番号なのか、チェックしていますか？
チェックしていなかったら、それはアプリケーションやサービスの大きいセキュリティ穴の一つになります。。。

下記は、Golangで書いた例なんですけど、他の言語で書いてもロジックは同じです。

```
const (
	twilioAuth = "Basic {base64}" // https://www.twilio.com/docs/quickstart/php/lookups
)

// doTwilioCheck returns true if exists
func doTwilioCheck(number string) (exists bool, err error) {
	url := fmt.Sprintf("https://lookups.twilio.com/v1/PhoneNumbers/%s", number)
	
	req, err := http.NewRequest("GET", url, nil)
	if err != nil {
		return false, err
	}
	
	req.Header.Add("authorization", twilioAuth)
	res, err := http.DefaultClient.Do(req)
	if err != nil {
		return false, err
	}
	defer res.Body.Close()
	
	body, err := ioutil.ReadAll(res.Body)
	if err != nil {
		return false, err
	}

	var parsed map[string]interface{}
	err = json.Unmarshal(body, &parsed)
	if err != nil {
		return false, err
	}

	return parsed["status"] == nil, nil
}
```

Twilio Lookupについて： https://www.twilio.com/lookup
Optimus搭載機でハイパフォーマンスGPUを自動的に使用するアプリの作り方

# 概要

[Optimus](http://www.nvidia.co.jp/object/optimus_technology_jp.html) 搭載機ではユーザーが NVIDIA コントロールパネルから手作業でアプリのカスタム動作を追加定義しなければ一般的なグローバル設定から統合型グラフィックス（intel HD Graphics）でアプリが実行される。

Optimus 搭載機でハイパフォーマンスGPU（NVIDIA GeForce）をデフォールトで使用したいアプリではどうすればよいか日本語の情報を掲載する。

# ハイパフォーマンスGPUを強制する方法

エントリーポイント（≈ `main` 関数）を含む実行ファイルのソースに次のようなソースを1つ追加する。

- optimus.cxx 

```cpp
#ifdef _WIN32
  #include <windows.h>
#endif

#include <cstdint>

extern "C"
{
#ifdef _WIN32
  __declspec( dllexport )
  DWORD
#else
  std::uint32_t
#endif
  NvOptimusEnablement = 0x00000001;
}
```

なお、`_WIN32` 以外の環境向けのコードはプログラム内での定義の互換性のために記してあるだけなので、明らかに Windows でしか使わないソースの場合は `#ifdef` などは特にコードする必要はない。

## シンボルの確認

TDM-GCC(mingw) 処理系でビルドしたアプリの `nm` を確認するとグローバルに `NvOptimusEnablement` データシンボルを確認できる。

```
$ nm bin/my_app.exe | grep NvOp
00000000007f2210 D NvOptimusEnablement
```

これを Optimus 搭載機で実行すると、NVIDIA コントロールパネルで手作業の設定追加が行われいない状態でもグローバル設定により統合型グラフィックスが使われる事なくハイパフォーマンスGPUが使われるようになる。

もちろん、単なるグローバルなデータシンボルのエントリーが実行ファイルに追加されるだけなので、Optimus搭載機ではない環境で特に困った副作用が発生する事はない。

# Reference

- http://docs.nvidia.com/gameworks/content/technologies/desktop/optimus.htm
- https://gcc.gnu.org/wiki/Visibility
cygwin/x で Windows を X 端末として使う

(2018/04/16)追記
現在は本家の下記手順のみで動作するようです。
https://x.cygwin.com/docs/ug/using-remote-apps.html
追記終わり

Windows 7 pro に cygwin/x をインストールして、Linux の GUI アプリを Windows 上で使えるようにします。
今回利用した Windows7 は 64bit 版です。

# セットアップ #

1. まずは cygwin をダウンロードします。    
下記 URL から setup-x86_64.exe をダウンロードします。    
https://www.cygwin.com/    
今回ダウンロードした cygwin DLL のバージョンは 2.5.0 でした。
2. setup-x86_64 を実行します。
最低限必要なパッケージは以下です。
    - xorg-server
    - xinit
    - openssh

3. インストール直後の状態だとうまく動かないので、以下を編集します。
    - XWin Server のショートカットのリンク先    
(変更後)    
C:¥cygwin64¥bin¥run.exe --quote /usr/bin/bash.exe -l -c "cd; /usr/bin/Xwin.exe :0 -multiwindow -listen tcp"
    - 環境変数 DISPLAY の設定    

        ```lang:/etc/skel/.bashrc
if [ -n "{$DISPLAY}" ]; then    
        export DISPLAY='localhost:0.0    
fi
```

以上でセットアップは完了です。

# 使用方法 #

1. XWin Server と Cygwin64 Terminal を起動します。

2. Cygwin64 Terminal で Linux サーバへ ssh 接続します。
X 転送に -Y オプションを使用します。
例) $ ssh -Y user@host

３． X アプリを起動します。
例) [user@host~]$ gimp

アプリが起動すれば OK です。
WebStormで起動タスクを設定する方法

WebStormにはプロジェクト起動時のタスクを設定する機能があります。
ひとまず例として、次のような「hello」と表示するnpm scriptをプロジェクトを開いた時に実行するようにする設定方法を書きます。

```package.json
{
  "name": "webstorm_test",
  "version": "0.1.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "hello" : "echo 'hello'"
  },
  "author": "nyamogera",
  "license": "MIT"
}
```

1. 設定用のダイアログを開く。
  - Windowsの場合メニューの[File]→[Settings]で[Settings]ダイアログを開く
  - OS Xの場合 - メニューの[WebStorm]→[Preferences]で[Preferences]パネルを開く

2. [Tools]→[Startup Tasks]から[+]ボタンを押し、[Add New Configration]を選択する。
3. 一番下の[npm]を選択し、[Run/Debug Configration]ダイアログを開きます。

4. [Run/Debug Configration]ダイアログの設定
    - [Name]に適当な名前を入れる。
    - [Scripts]でドロップダウンの[▼]ボタンからnpm script名を選択します。ここでは「hello」です。

5. 設定が完了したら、[Apply]ボタンを押し、[OK]ボタンを押してダイアログを閉じます。

これで、現在のプロジェクトを開いているWebStormを一度終了して再度プロジェクトを開きなおすと、「hello」スクリプトが実行されます。

# まとめ
今回は単純に「hello」と表示されるだけのものを実行してみました。実際は毎回初めに実行するような「watch」タスクなどの設定するといよいでしょう。
また、実際に手順を実行した人はわかると思いますが、「Grunt」「Gulp」「Mocha」他、npm scripts以外の起動タスクも設定できます！
WebStormを使って快適にWeb開発を行って行きましょう。

他にもわりと高頻度で使う便利なWebStormの使い方を記事にまとめました。こちらも参照していただけたら幸いです。

- [Web開発にはWebStormを使おう！ 知っておくべき便利な17の使い方 - ICS MEDIA](https://ics.media/entry/11642)


# 参考にした記事

- [Running NPM Scripts - WebStorm 2016.1 Help](https://www.jetbrains.com/help/webstorm/2016.1/running-npm-scripts.html
)
vagrantコマンド

#packageの作成
vagrant package

#packageをboxとして登録する
vagrant box add なまえ ./package.box

#snapshotの作成やら
```lang:スナップショット作成※1世代のみ
vagrant snapshot push
```

```lang:スナップショット復元※1世代のみ
vagrant snapshot pop
```

```lang:スナップショット作成※複数世代可能
vagrant snapshot save <スナップショット名>
```

```lang:スナップショット復元※複数世代可能
vagrant snapshot restore <スナップショット名>
```

```lang:スナップショット一覧
vagrant snapshot list
```
Scalaを使っていてふ～んと思ったこと。

#記事の内容
最近Scalaを触り始めていて、
Javaと微妙に違うな～と思ったことを思いつきベースでメモに残しています。

便利とか便利じゃないとかそういった感想は特になく、
単純にコードを読んでいて「おっと」と一瞬固まった部分です。

#Scalaの特徴的な記法

##全体的な特徴
- ブロックの最後の値が自動で返る

```
val infoValue = if (value != null) {
    "OK"
} else {
    null
}
```
上記例では、info Value には`"OK"`か`null`のどちらかが入る。

##map

###文法

```
array.map(c => c + 1))
```

###用途
配列の各要素に定義した関数を適用する。
Rubyとかはありますよね、確か。
上記の場合は以下に射影した配列が返る。
`[1,2,3,4] →　[2,3,4,5]`

4.リストと関数

* * *

##match

###文法

```
result match {
    case "YAMADA" => "YAMADAだよ"
    case "SAITOH" => "SAITOHだよ"
}
```

###用途
switch～case文と同等

* * *

##Either

###文法

```
def throwsExceptionFunction(): Either[Throwable, String] = {
    ～～～～～
}
```

###用途
例外処理に利用する。
Eitherクラスを利用すると、例外が発生する可能性のあるクラスをラップすることが出来る。
Javaの `Class A throws Exception`に近い気がする。

呼び出し側の例外処理で、以下のように利用する。

```
throwsExceptionFunction match {
    case Left(e) => //例外処理
    case Right(v) => //正常処理
}
```

try～catchみたいに長ったらしく書かなくて済むみたい？

* * *

## for (～) yield 式

###文法

```
val checkResult = for (i <- 1 to 5) yield i 
```

###用途

for文は通常値を返さないが、yieldを用いることで繰り返された本体の結果を返すことが出来る。
この場合checkResultには`Vector(1, 2, 3, 4, 5)`が入っている。



まだまだこれから増えていきそうな予感。
【Java】CSVダウンロード機能の実装

#[例]DBに登録されている全ての顧客情報を取得し、CSVで出力したい

##JSP
```sample.jsp
<button type="button" onclick="location.href='${pageContext.request.contextPath}/csvDownload'">
　　　　　ユーザー情報一括ダウンロード(csv)</button>
```

##Controller
```Controller.java
    /**
	 * ユーザー情報csv形式でダウンロードする
	 */
	@RequestMapping("csvDownload")
	public void csvDownload(HttpServletResponse response) {
		
		//文字コードと出力するCSVファイル名を設定
		response.setContentType(MimeTypeUtils.APPLICATION_OCTET_STREAM_VALUE + ";charset=utf-8");
		response.setHeader("Content-Disposition", "attachment; filename=\"test.csv\"");
		
		//try-with-resources文を使うことでclose処理を自動化
		try (PrintWriter pw = response.getWriter()) {
			List<User> all_users = service.findAll();
			for (int i = 0; i < all_users.size(); i++) {
				long id = all_users.get(i).getId();
				String name = all_users.get(i).getName();
				String email = all_users.get(i).getEmail();
				String password = all_users.get(i).getPassword();
				String address = all_users.get(i).getAddress();
				String telephone = all_users.get(i).getTelephone();
				
				//CSVファイル内部に記載する形式で文字列を設定
				String outputString = id + "," + name + "," + email + "," + password + "," + address + "," + telephone
						 + "\r\n";
				
				//CSVファイルに書き込み
				pw.print(outputString);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
```
Ubuntu15.10でTensorflowを動かすまでにやった事

# はじめに
　機械学習を勉強したくて環境構築した時にたくさんの時間が持っていかれた。
また自分にこのようなことが起こらないために備忘録として残す。

#作業環境
　作業は以下の環境で行った。
1.Ubuntu15.10
2.Nvidiaのビデオカードドライバ導入済み
3.pythonの環境はAnacondaを用いて用意済み

#作業目的
　今回の作業目的はTensorflowをGPUを有効にした状態で使用できるようにすること。
これができればおそらくChainerでもGPUが使える...はず。

#作業手順

1.cuda toolkitの導入
　cudaは公式に示されているやり方で導入した。今回はcuda toolkit 7.5を用いた。
コマンドラインで以下のように打つ
```
$ sudo dpkg -i cuda-repo-ubuntu1404_7.5-18_amd64.deb
$ sudo apt-get update
$ sudo apt-get install cuda
```
debパッケージは自分のバージョンにあったものをダウンロードして用意する。

次に環境変数を設定する。
./bashrcに以下の文言を記入

export CUDA_HOME=/usr/local/cuda 
export LD_LIBRARY_PATH=\${CUDA_HOME}/lib64 
PATH=\${CUDA_HOME}/bin:${PATH} 
export PATH

記入はgeditをsudoで実行して直に記入した。
```
$ sudo gedit ./bashrc
```
これでcudaの導入が終わる。(サンプルは動かしてない)

2.cudnnの導入
　これはGPU計算用のライブラリらしい。nvidia developerに登録してダウンロードするらしい。ということで登録してダウンロードした。今回はcudnn v4を用いた。
ダウンロードしたらコマンドラインで以下のように打つ。
```
$ tar xvzf cudnn-7.5-linux-x64-v4.tgz
$ sudo cp cudnn-7.5-linux-x64-v4/cudnn.h /usr/local/cuda/include
$ sudo cp cudnn-7.5-linux-x64-v4/libcudnn* /usr/local/cuda/lib64
```

やってることはファイルをcudaのところに入れるだけ。

3.Tensorflowのインストール
　ようやく本命のインストール。インストールする環境はAnacondaで作った仮想環境。pythonのバージョンは3.4、Anacondaにプリインストールされているパッケージも入れておく。
公式とそこらのサイトを見ながら以下のように記述した。
```
$ pip install --upgrade https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow-0.7.1-cp34-none-linux_x86_64.whl --ignore-installed
```

最初は、最後に書いてある--ignore-installedを入れずにやってたためインストールができていなかった。海外だかの質問サイトを見たらこうしたらええんでない、と書いてあったため実際にやってみたところインストールに成功。
実際にimportして確かめてみたところ...
![20160411_161029.jpg](https://qiita-image-store.s3.amazonaws.com/0/104310/7a4469e2-eccb-463b-f116-ab57bd5c45a8.jpeg)

successfully と出てるためインストール成功と判断。

#まとめ
　日本語のサイトをぐるぐる回ってもインストールできなかったが、海外の質問サイト見てどうにかなった。言語の壁が欲しい情報を手に入れにくくしてることもあるため、積極的に他言語の情報を読む必要があると感じた。よくわかんなかったら翻訳サイトに任せるなど使える手はどんどん使うべき。
windows10を買って(アップグレード)してすぐやること。やったこと。

#ドライバの確認
アップグレードし31日以上経過後に気づいたが、ディスクとVGAのドライバがそれぞれ「IDEコントローラ」と「基本ディスプレイアダプター」になっていて動作が重い。
これらのドライバは最適なドライバでは無い。そして自環境では**ドライバは後から変更出来ず、**手遅れだったので泣く泣くWin10をクリーンインストールすることで正しいドライバの当て込みを行った。

アップグレード直後はドライバを確認し**見慣れないドライバが無いかよく確認すること。**そして正しいドライバで動作してない場合、元のOSに回復させた方がよい。

#システムフォントを変更
びっくりするくらい糞汚いフォントを変更。
[Meiryo UIも大っきらい!!](http://tatsu.life.coocan.jp/MySoft/index.html#noMeiryoUI)を使用する。
実行時に「右クリックで管理者として実行」で起動すること。

遊ゴシックからメイリオにするもアンチエイリアス掛けてもやっぱり汚いのでMS ゴシック 10ptにする。

#メニューのピンを全部消す
Winキーでメニューを出して1つずつ右クリックしピンを外す。

`PCが5台ぐらいあるとすごい苦行。一括外しとか無いのかね。MS君。`

#cortanaを停止
不要です(断言)
Winキーでメニューを出して「cortana」と打つとcortanaの設定と出てくるのでEntart
OFF/ONのトグルがあるのでOFFにする。

#googleIMEの再インストール
MS IMEに勝手に変わるので再インストールをする。

辞書を登録している人はバックアップを忘れずに。

#Windosupateの自動再起動を無効化（自動更新の無効化）
デフォだと編集中のメモ帳があろうが強制再起動を掛ける鬼なWIN10君。

###注意
この設定を行っても、手動でインストールするとインストール後、_勝手に再起動_ 行われます。
インストール後勝手に再起動を止めるすべはありません。
ここで設定するのはあくまでも**自動更新の停止**です。

##WinPROはポリシー変更
Win+R → gpedit.msc
管理用テンプレート → Windowsコンポーネント → WINDOWS UPDATE

| 項目 | 設定値 |
|:--|:------:|
|スケジュールされた時刻に常に自動的に再起動する | 無効 |
|スケジュールされた自動更新のインストールで、ログオンしているユーザーがいる場合には自動的に再起動しない | 有効 |
|自動更新を構成する | 有効（3） |

自動更新を構成するの設定値はお好み
詳しい設定内容は説明があるので省く

##WinHOMEはレジストリを直接変更
CTRL+R → regedit
HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU

| 項目 | 値(10進) |
|:--|:------:|
|AlwaysAutoRebootAtScheduledTime | 0 |
|AUOptions | 3 |
|AutomaticMaintenanceEnabled | 1 |
|NoAutoRebootWithLoggedOnUsers | 1 |
|NoAutoUpdate | 0 |
|ScheduledInstallDay | 0 |
|ScheduledInstallTime | 5 |

設定内容は上のPROはポリシー変更と同じ内容

#etc

##電源管理
再現性が無かったのだが、設定がリセットされる場合があったので適時変更の確認が必要。
#ほか
Windowsupdateの強制再起動は特に設定しないとほんとヤバイ。
Win7で再起動を強制しないよう変更しててもWin10へアップデートすると初期化されるようで、まんまと殺られた。
カラム名からカラム番号を取得するサンプル。Google Apps Script

```js
/*
対象のカラムを取得する
*/
function getCol(string) {
  
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  var lastCol = sheet.getLastColumn();  
  var range = sheet.getRange(1, 1, 1, lastCol)  
  var values = range.getValues()[0];  

  for (i=0; i<lastCol; i++) {
    if (values[i] == string) {
      return i + 1; // カラム番号を返す
    }
  }
  return false; // 存在しなければfalse
}
```
Excelファイルを C# など外部からちゃんと取り扱う方法はない

# 言いたかった事
**完璧な方法は存在しないと客に言える雰囲気を作っていきたい。**

**無理すれば何とか実現するやり方は見つかるが、大体の場合完璧ではないので、そのようなリスクがある事をちゃんと共有していく。**

**何でもかんでも Excel で取り扱ってデータを作ればいいや、で解決した気になるのは悪である**という空気を作りたい。

## Excel のデータを外部と連携させるためには
- 非 Office アプリケーションから xls/xlsx を取り扱うという発想をまず捨てる
- ちゃんと設計する。どの部分のデータをエクスポートしたいのか、それとも書式込みでエクスポートしたいのか
- Workbook/Worksheet などの操作は基本的に Office あるいは VBA(マクロ) に任せる。あるいはマクロからファイル出力させる。
- 最終的には CSV 最強。
    - すべてのシートの内容をマクロで値のみコピー＆ペーストした上で CSV 出力するとか、そういう中間処理を挟む

## Excel は UI であり、そのデータをプログラムが利用する場合はまた別コストの作業になる
- UI としての Excel はかなり強いので、そこは生かしていきたい。
- できる事とできない事、得意なところと不得意なところがあると認識する。全部これでできるわけではないと客に理解してもらう。

## でも仕事だからやらないと！ どうする？

### ファイルをできる限り生で扱いたい

#### xls などの旧形式をサポートする必要がある場合
- 基本的に修羅の道です。もう時代遅れの形式だし。
- サーバサイドで作成・編集する場合は基本的に外部のライブラリを使うことになります。COMを使って操作するのはサポートされません。実際に、ユーザアカウントでなくSYSTEMアカウントでOfficeを起動させて失敗した経験があります。
- (例えばApache POIなどの)外部ライブラリが全ての要素に対して読み書きできる保証はありません。事前にそれがどれくらいのことが可能であるのか、実際に動かして調査しましょう。作成したファイルが開けないとか内容が壊れているとか十分にありえます。
- クライアントサイドで作成・編集する場合、できればExcelからマクロ(VBA)を使いましょう。そのための機能です。外部からCOMでやる場合は、VBSで操作するのがオススメです。

#### xlsx 限定でOKな場合
- Office Open XMLは標準化されているので、将来に向けてOffice無しで読み書きのできる環境が整っていく可能性が高いです。少なくとも過去のOfficeドキュメントよりは。
- xlsと同じく、外部ライブラリが全ての要素に対して読み書きできる保証はありません。事前にそれがどれくらいのことが可能であるのか調査しましょう。しかし、標準化された仕様があるため、それが正しくない物を出力する可能性は xls より低くなっているはずですし、ライブラリの作成者へフィードバックすれば将来的に直っていく可能性が高いです。
- と言うわけで、有償無償色々な物を試すと良いです。

### とにかくデータ連係ができればよい 
- マクロを利用して連携したい部分のデータを個別に出力しましょう
- CSV 保存をしてテキスト化しちゃいましょう
- 完全な自動化は難しいので、操作コストを下げていく方向で考える

## まとめ
**「ネットで探したら見つかったから」** **「他のプロジェクトでやってたから」** などと安易に考えず、それで何をしたいのか要件を出し、それを満たせるか基礎研究を行い、実現可能であるか検証する時間を取りましょう。どんな値を扱うのか、装飾をするのか、等々、お客様へのヒアリングを丁寧に……。
Windows8.1(64bit)に Vagrant + Ubuntu 15.04 の環境を構築する

自分用のメモです。

## 概要

Windows8.1(64bit)マシンに、[Vagrant](https://www.vagrantup.com/) を使って Ubuntu 15.04(amd64 server) の仮想環境を構築します。
各ソフトウェアのバージョンは、2016/4/11時点での最新。

## Virtual Box(5.0.16) インストール
[Download VirtualBox](https://www.virtualbox.org/wiki/Downloads)
VirtualBox 5.0.16 for Windows hosts  x86/amd64  
をダウンロードし、インストール実行。
※OS再起動が要ります。

## Vagrant(1.8.1) インストール
[Download Vagrant](https://www.vagrantup.com/downloads.html)
Windows Universal (32 and 64-bit)    
をダウンロードし、インストール実行。


## Vagrant 設定
### BOXの追加
まず、BOX（仮想マシンのテンプレート）を準備します。
コマンドプロンプトで以下を実行。

```
> vagrant box add ubuntu15.04 https://github.com/kraksoft/vagrant-box-ubuntu/releases/download/15.04/ubuntu-15.04-amd64.box
```

※OSイメージをダウンロードするため、結構時間がかかります。
※ダウンロード元は、[こちら](http://www.vagrantbox.es/)を参照。

### 仮想マシンの定義ファイル作成
仮想マシン用のディレクトリを作成し、 そちらに仮想マシンの定義ファイルを作成します。

```
> mkdir C:\vm\ubuntu15.04 #仮想マシンのディレクトリ作成（任意のディレクトリ）
> cd C:\vm\ubuntu15.04
> vagrant init ubuntu15.04
```

ディレクトリにvagrantfileという設定ファイルが生成されます。
vagrantfileはruby構文で書かれており、NICやポートの設定もこのファイルを編集して行います。

### 仮想マシンの起動

```
> vagrant up
```

これで仮想マシンが作成・起動できました。非常に簡単ですね。
あとは適当なSSHクライアント（TeraTerm,  RLogin...）で煮るなり焼くなり好きにしましょう。  

## Vagrant 補足

### 仮想マシンのシャットダウン

```
> vagrant halt
```
でシャットダウンできます。

### 起動時にマウントが失敗する場合

vagrant upコマンドで仮想マシンを起動中、以下のエラーメッセージが出る場合は、共有フォルダのマウントに失敗しています。

```
==> node1: Mounting shared folders...
    node1: /vagrant => C:/vm/ubuntu15.04
Failed to mount folders in Linux guest. This is usually because
the "vboxsf" file system is not available. Please verify that
the guest additions are properly installed in the guest and
can work properly. The command attempted was:

mount -t vboxsf -o uid=`id -u vagrant`,gid=`getent group vagrant | cut -d: -f3`
vagrant /vagrant
mount -t vboxsf -o uid=`id -u vagrant`,gid=`id -g vagrant` vagrant /vagrant

The error output from the last command was:

stdin: is not a tty
mount: unknown filesystem type 'vboxsf'
```

どうやら、ゲストOSのboxにVirtualBox Guest Additionsがインストールされていないのが原因のようです。
（この問題については、こちらのブログがわかり易かったです。ありがとうございます。）
[vagrant up時に「mount: unknown filesystem type 'vboxsf'」が発生する](http://berukann.hatenablog.jp/entry/2016/01/24/163124)

ゲストOSに VirtualBox Guest Additions をインストールします。
Vagrant に Guest Additions を自動インストール/自動更新してくれる [vagrant-vbguest](https://github.com/dotless-de/vagrant-vbguest) というプラグインがあるので、そちらを利用します。

```
> vagrant plugin install vagrant-vbguest
```

プラグインがインストールされたら、

```
> vagrant reload
```

で仮想マシンを再起動すれば、Guest Additions がインストールされ、マウントのエラーが発生しなくなります。

## 参考
[Vagrant Command-Line Interface](https://www.vagrantup.com/docs/cli/) (Vagrantコマンド一覧)
[Vagrantbox.es](http://www.vagrantbox.es/) (Vagrant Box一覧)
[Vagrantfile](https://www.vagrantup.com/docs/vagrantfile/) (Vagrantfileについて)
Knockout.jsのHelloWorld


[Knockout](http://knockoutjs.com/)を使って画面に要素を表示します。

# スクリーンショット

![スクリーンショット 2016-04-12 10.01.21.png](https://qiita-image-store.s3.amazonaws.com/0/15964/efbb0ef8-41bc-5f4b-6fd0-6cc2b5dd63a7.png "スクリーンショット 2016-04-12 10.01.21.png")

`hello wrold!`を表示します。



# ソースコード
```html:index.html
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.0/knockout-debug.js"></script>

<body>
    <span data-bind="text: message"></span>
    <script>
        ko.applyBindings({
            message: 'hello wrold!'
        });
    </script>
</body>
```

## CDN
環境の準備を簡単にするため、KnockoutはCDN経由で取得します。

```html
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.0/knockout-debug.js"></script>
```

## binding
```html
<span data-bind="text: message"></span>
```

htmlにViewModelのプロパティをバインドします。
`data-bind`属性で、バインド先の属性名とバインドするプロパティ名を指定します。

## ViewModelを適用
```js
ko.applyBindings({
    message: 'hello wrold!'
});
```

`ko.applyBindings`関数にViewModelを渡します。
ViewModelはオブジェクトで構いません。

ViewModelにバインドするプロパティ`message`を定義します。


# 感想
ここまでだとhtmlの属性で書く、変わった記法のテンプレートエンジンに見えます。

# 関連記事
[Knockoutでイベントハンドラーをバインドする](http://qiita.com/ledsun/items/9bb7a2ca0b4b6b442e48)

# リンク
割と日本語のドキュメントが多いのに助かります。

- [ドキュメント | Knockout.js 日本語ドキュメント](http://kojs.sukobuto.com/docs/introduction) 
- [Knockout : Home](http://knockoutjs.com/index.html)
【jQuery】オートコンプリート機能の実装


###①jQueryファイルのインポートとJavaScriptの記述
```sample.jsp
<head>
<script src="https://code.jquery.com/jquery-2.1.0.min.js"></script>
<script>
	$(function() {
		$.getJSON("${pageContext.request.contextPath}/autoComplete",
				function(data) {
					$('#autocomplete').autocomplete({
						source : data,
						minLength : 1
					});
				});
	});
</script>
</head>
<body>
```
###②対象となる検索ボックスへIDの指定
```sample.jsp
<!-- formタグのaction属性は検索キーワードを送信したときに使用される -->
<form:form role="search" modelAttribute="keywordForm"
	action="${pageContext.request.contextPath}/execute_search">
	<input type="text" id="autocomplete" name="keyword" placeholder="検索キーワード">
	<button type="submit">検索</button>
</form:form>
```
###③ControllerとRepositoryの実装
```Controller.java
@Controller
public class Controller {
	/**
	 * 商品検索フォームのオートコンプリート
	 */
	@RequestMapping(value = "autoComplete", method = RequestMethod.GET)
	@ResponseBody
	public List<String> autoCompleteList() {
		 List<String> allNames = repository.getAllNames();
         return allNames;
	}
}
```

```Repository.java
@Repository
private static final RowMapper<String> NAME_ROW_MAPPER = (rs, i) -> {
        String name = rs.getString("name");
        return name;
    };

@Autowired
private NamedParameterJdbcTemplate jdbcTemplate;

public List<String> getAllNames() {
        List<String> allNames = jdbcTemplate.query("SELECT name FROM items", NAME_ROW_MAPPER);
        return allNames;
    }
```
Dockerでswift repl起動時にerrorになった場合の対処法

Dockerコンテナ上でSwiftを試してみようとREPLを起動してみたら
```
error: failed to launch REPL process: process launch failed: 'A' packet returned an error: 8
```
というerrorを吐いたので、その対策。

docker　run時に ```--privileged``` オプションをつけると良いらしい。
```
docker run --privileged -it foo/bar
```

```--privileged``` を調べてみると、いろいろと機能が開放されるオプションらしい。
https://docs.docker.com/engine/reference/commandline/run/#full-container-capabilities-privileged

参考
https://github.com/swiftdocker/docker-swift/issues/9
1年目エンジニアには「学生気分でいるんじゃねえ」と伝えたい

昨年度1年間OJTをしている中で、1年目エンジニア（とくにエンジニアリング初心者の方）に伝えたいことがいろいろと浮かんできたので、ここにまとめてみます。

## どの立場で言うのか
+ 社会人7年目のエンジニアです
+ エンジニア歴＝社会人歴です
+ 仕事は自社開発のアプリ作ったりしてます
+ 転職はしたことないです

## 誰に対する記事か
+ 入社1年目のエンジニアの方
+ 文系出身でプログラミング初心者ですって方
+ （もしかしたら）これからOJT等で新入社員を指導する立場の方

## 本題
というわけで本題です。

### 「どうすれば良いですか？」って聞かれても困っちゃう件
よく質問で「これ、どうすれば良いですか？」とか「この処理、どうやって書けば良いですか？」って聞かれるのですが、そう聞かれたときの答えはほぼ例外なく「分からん」です。これは後輩に対する意地悪とかではなくて、本当にそれだけの情報では判断できないので「分からん」なのです。
この仕事をしていてよく思うのですが、たとえ些細なことでも絶対的な正解なんてのは存在しないです。あるのはその時に選べる選択肢と、その選択肢を選んだときのメリット/デメリットです。さらに言えば、そのメリットとデメリットも状況によって大きく変わりますし、正確に予測することは先輩社員でも困難です。

例えば、

```
String name = person.getName();
```

って書いてある行でNullPointerExceptionが出てるから直しておいてね。
というタスクがあった場合、

```
String name = null;
if (person != null) {
    name = person.getName();
}
```

「このように直せば良いですか？」と後輩に聞かれてもやっぱり「分からん」です。

+ nameの初期値はnullで良いのか、なぜ空文字ではなくnullなのか。
+ personがnullだった場合、name変数は何もセットされずに処理を続けてしまって良いのか。
+ そもそもpersonオブジェクトがnullになる状況にしちゃいけないのではないか。

等々、簡単なnullチェック一つをとっても、システムの仕様や要件によって修正方法は全く変わります。もしかしたら本当にif文を入れるだけで良いかもしれませんし、もしかしたらPersonデータを登録する部分を変えなければならないかもしれません。

ということを考えていると、「この場合はこうしておけば良い」という場合分けで覚えて仕事をすることは、ちょっとした状況の変化に耐えられなくなり危険だと思っています。

今目の前にある課題、その周辺にある条件、こう解決するとこうなる、別の解決方法ならこんなメリットがある、というところを常に考え、結果一番現状を踏まえて最善だと思う手を模索することを身につけると、一気に応用力が上がるはずです。応用力があると、いろんなポジションでいろんな仕事ができるようになって楽しいです。


### 勉強は自分一人でやってほしい件
やる気のある新人だと、「まだ業務ではやったことのないサーバ開発について教えてください」と言って時間を確保されることがあります。この姿勢は別に悪いことではないのですが、「教えてもらう」ではなく「自分で調べる」姿勢も1年目のうちに一緒覚えてほしいと思います。

上にも書いた通り、仕事にも開発にも正解なんてありません。そうなると、学校の勉強のように「正解を教える」ということは先輩社員にもできないのです。できるのは「以前はこうだったよ」という経験を伝えることと、「自分はこう思うよ」という考え方を伝えることくらいです。
さらに言えば、先輩社員だってシステムや技術について全てを知っているわけではありません。というより、一人が全てを知るのは不可能なほどIT技術というのは幅広く底も深いです。

そうなると、一方的に教えるよりも、まずは自分でググって調べて自分で考え、「こう考えたんですけどどう思いますか？」、「この部分がどうしてもググっても出てこないんですけど何か知りませんか？」といった聞き方をしたほうが確実に効果的です。特にサーバ開発のようなごく一般的な内容であれば、僕よりはるかに知識も経験もある方がネット上にはいくらでもいます。

さらに、「授業を受ける」という受け身の姿勢ではなく「自分で調べる」という姿勢で臨んでいる分身につくのも早いです。


※ ただし、ググっても絶対出てこない問題（社内特有のルールやシステムなど）についての質問は大歓迎です。調べても時間の無駄になることはわかっているので、これは社内特有のものだと判断したらすぐに聞いてください。特有なのかどうかが判断できない場合もやっぱり聞いてください。一般的な内容だった場合は「ググってね」で終わるだけなので。


### 学校の勉強方法は忘れてください
ここまで書いた通り、学校の勉強と会社の勉強は

 + 正解がない
 + 先生がいない

という点で全く別のものだと考えた方が良いです。ネットや本を見ろと書きましたが、それすらも「正解」ではなく単なる選択肢の一つに過ぎません。

日々、少しでも多くの情報を頭に入れ、それを自分の頭で解釈し、実験し、失敗し、試行錯誤をしながら、仕事をする上での最適な判断を下す力を鍛えるのが良いと思っています。「この場合はこれが正解」ではなく、「こんな状況でこういう前提があって今こちらにはこんなカードがあるから、今とるべき行動はこれだろう、そうするとこんな結果が予測できるので、そうなったら今度はこうしよう」という考え方です。

おそらくこの考え方は机に向かって生真面目に本を読んで内容を覚えるだけでは身につきません。仕事やブログ等で考えを伝えて議論することで、他の人の思考回路を盗んでくる努力も必要です。

## まとめ
いろいろと偉そうなことを書きましたが、要は僕（先輩社員）も日々試行錯誤しているし、その中でよりよい思考回路を作る努力をしているんだよ、ということを伝えたい次第です。
先輩だろうが上司だろうが、誰が正しいということは無いのが開発のお仕事ですので、常に自分で考え、考えたことを自信をもって発信することが自然にできるようになると、開発も仕事も楽しくなると思います。

というわけで、タイトルの意図は「学生の時の勉強方法なんて忘れてエンジニアの勉強方法を身につけてね」ということでした。

長々と読んでくださってありがとうございます。
arduinoでusb host その７

#概要
arduino unoにusb hostつないで、androidつないで、Lチカしてみた。
androidは、HT-03Aでandroid 1.6です。
#写真
![MVC-005S.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/f4eccee8-564d-b361-fb57-d985647c9c90.jpeg)

#サンプルコード
```
#include <SPI.h>
#include "Adb.h"

Connection * connection;
void handler(Connection * connection, adb_eventType event, uint16_t length, uint8_t * data)
{
	if (event == ADB_CONNECTION_RECEIVE)
	{
		if (data[0] == 1)
		{
			digitalWrite(2, HIGH);
		}
		if (data[0] == 2)
		{
			digitalWrite(2, LOW);
		}
	}
}
void setup()
{
	Serial.begin(115200);
	pinMode(2, OUTPUT);
	digitalWrite(2, HIGH);
	ADB::init();
	connection = ADB::addConnection("tcp:4567", true, handler);
}
void loop()
{
	ADB::poll();
}

```
#サンプルコード
```
package com.ohisamallc.ohiapp123;

import java.io.IOException;
import org.microbridge.server.AbstractServerListener;
import org.microbridge.server.Server;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class ohiapp123 extends Activity
{
	Server server = null;
	Handler mHandler = new Handler();
	private Button mButton;
	private EditText mText1;
	private TextView mTextView2;
	@Override public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		mButton = (Button) findViewById(R.id.Button01);
		mButton.setText(" send ");
		mButton.setTextSize(50);
		mText1 = (EditText) findViewById(R.id.editText1);
		mText1.setText("2345");
		mText1.setTextSize(30);
		mText1.setHeight(50);
		mTextView2 = (TextView) findViewById(R.id.TextView02);
		mTextView2.setText("ok");
		mTextView2.setTextSize(30);
		mTextView2.setHeight(50);
		try
		{
			server = new Server(4567);
			server.start();
		}
		catch (IOException e)
		{
			System.exit(-1);
		}
		mButton.setOnClickListener(new OnClickListener()
		{
			@Override public void onClick(View v)
			{
				String command = mText1.getText().toString();
				sendCommand(command);
			}
		});
		server.addListener(new AbstractServerListener()
		{
			@Override public void onReceive(org.microbridge.server.Client client, byte[] data)
			{
				if (data.length > 0)
				{
					final String message = new String(data);
					mHandler.post(new Runnable()
					{
						@Override public void run()
						{
							mTextView2.setText(message);
						}
					});
				}
			};
		});
	}
	private void sendCommand(String command)
	{
		int n = Integer.parseInt(command);
		if (n < 1) return;
		byte[] b = new byte[4];
		b[0] = (byte) (n >>> 0);
		b[1] = (byte) (n >>> 8);
		b[2] = (byte) (n >>> 16);
		b[3] = (byte) (n >>> 24);
		try
		{
			server.send(b);
			mTextView2.setText("");
		}
		catch (IOException e)
		{
		}
	}
	@Override protected void onDestroy()
	{
		if (server.isRunning())
		{
			server.stop();
		}
		super.onDestroy();
	}
}

```
Ubuntuの/var/log/messagesを設定する

# 構成

Ubuntu 15.04

# 設定方法

+ logの設定

```text:/etc/rsyslog.d/50-default.conf
L.38 ~

- #*.=info;*.=notice;*.=warn;\
- #       auth,authpriv.none;\
- #       cron,daemon.none;\
- #       mail,news.none          -/var/log/messages
+  *.=info;*.=notice;*.=warn;\
+         auth,authpriv.none;\
+         cron,daemon.none;\
+         mail,news.none          -/var/log/messages
```

+ 設定の反映

```text:cmd
# /etc/init.d/rsyslog restart
```


# Playbookを晒す

上記だけだと寂しいので、AnsibleのPlaybookでも置いておきます。

```text:version
$ ansible --version
ansible 1.9.3
```

```text:playbook
roles/common/
├── handlers
│   └── main.yml
├── tasks
│   └── main.yml
└── templates
    └── 50-default.conf.j2
```

```text:roles/common/handlers/main.yml 
- name: restart rsyslog
  service: name=rsyslog state=restarted
```

```text:roles/common/tasks/main.yml 
- name: replace rsyslog.conf
  copy: >
    src=roles/common/templates/50-default.conf.j2
    dest=/etc/rsyslog.d/50-default.conf 
  notify: restart rsyslog
```

```text:roles/common/templates/50-default.conf.j2 
#  Default rules for rsyslog.
#
#			For more information see rsyslog.conf(5) and /etc/rsyslog.conf

#
# First some standard log files.  Log by facility.
#
auth,authpriv.*			/var/log/auth.log
*.*;auth,authpriv.none		-/var/log/syslog
#cron.*				/var/log/cron.log
#daemon.*			-/var/log/daemon.log
kern.*				-/var/log/kern.log
#lpr.*				-/var/log/lpr.log
mail.*				-/var/log/mail.log
#user.*				-/var/log/user.log

#
# Logging for the mail system.  Split it up so that
# it is easy to write scripts to parse these files.
#
#mail.info			-/var/log/mail.info
#mail.warn			-/var/log/mail.warn
mail.err			/var/log/mail.err

#
# Logging for INN news system.
#
news.crit			/var/log/news/news.crit
news.err			/var/log/news/news.err
news.notice			-/var/log/news/news.notice

#
# Some "catch-all" log files.
#
#*.=debug;\
#	auth,authpriv.none;\
#	news.none;mail.none	-/var/log/debug
*.=info;*.=notice;*.=warn;\
	auth,authpriv.none;\
	cron,daemon.none;\
	mail,news.none		-/var/log/messages

#
# Emergencies are sent to everybody logged in.
#
*.emerg                                :omusrmsg:*

#
# I like to have messages displayed on the console, but only on a virtual
# console I usually leave idle.
#
#daemon,mail.*;\
#	news.=crit;news.=err;news.=notice;\
#	*.=debug;*.=info;\
#	*.=notice;*.=warn	/dev/tty8

# The named pipe /dev/xconsole is for the `xconsole' utility.  To use it,
# you must invoke `xconsole' with the `-file' option:
# 
#    $ xconsole -file /dev/xconsole [...]
#
# NOTE: adjust the list below, or you'll go crazy if you have a reasonably
#      busy site..
#
daemon.*;mail.*;\
	news.err;\
	*.=debug;*.=info;\
	*.=notice;*.=warn	|/dev/xconsole
```

# 追記

過去のバージョンでも設定ファイルは変わらなさそうです。
[Ubuntu12.04で/var/log/messagesを生成する](http://chee-s.net/ubuntu12-04%E3%81%A7varlogmessages%E3%82%92%E7%94%9F%E6%88%90%E3%81%99%E3%82%8B)