OmniAICreator/Qiita-1.07M huggingface dataset:
Rust入門でHello, World!を軽く読んでみた

Rustという言語がすごいらしいので、ちょっと入門してみました。
といっても Hello, World! しか触っていないのですが。  (^_^;A

multirustで入れたのだけれど、少し古いバージョンが入ってしまいました。(^_^;A

```
$ rustc --version
rustc 1.4.0 (8ab8581f6 2015-10-27)
```

`hello, World!` からちょっとずつ見ていきます。

```rust
fn main() {
    println!("Hello");
}
```

まずは `--pretty expanded` オプションつきで見てみます。

`$ rustc -Z unstable-options --pretty expanded hello.rs`

```rust
#![feature(no_std, prelude_import)]
#![no_std]
#[prelude_import]
use std::prelude::v1::*;
#[macro_use]
extern crate std as std;
fn main() {
    ::std::io::_print(::std::fmt::Arguments::new_v1({
                                                        static __STATIC_FMTSTR:
                                                               &'static [&'static str]
                                                               =
                                                            &["Hello\n"];
                                                        __STATIC_FMTSTR
                                                    },
                                                    &match () { () => [], }));
}
```

このタイミングでコンパイラプラグインを読み込んだりexportしているマクロを参照しているそうです。すでに `println` マクロは展開されていますね！

次に `--pretty expanded,identified` オプション付きでみてみます。

`$ rustc -Z unstable-options --pretty expanded,identified hello.rs`

```rust
#![feature(no_std, prelude_import)]
#![no_std]
#[prelude_import]
use std::prelude::v1::*; /* 2 */
#[macro_use]
extern crate std as std; /* 3 */
fn main() {
    ((::std::io::_print /* 9
         */)(((::std::fmt::Arguments::new_v1 /* 11
                  */)(({
                           static __STATIC_FMTSTR: &'static [&'static str] =
                               (&([("Hello\n" /* 24 */)] /* 23 */) /* 22 */);
                           /*
                           15
                           */
                           (__STATIC_FMTSTR /* 25 */)
                       } /* block 13 */ /* 12 */),
                      (&(match (() /* 28 */) {
                             () /* pat 29 */ => ([] /* 30 */),
                         } /* 27 */) /* 26 */)) /* 10 */)) /* 8 */);
} /* block 6 */ /* 4 */
```

`src/librustc/session/config.rs` を読むと、この数字はAST Nodeに割り当てられたIDを意味しているようです。

`libsyntax/ast_map` を読んでいくともっと理解できそうです。 o(^_^)o

なんだかあんまりに中身がない記事ですが、はじめたばかりなのでご容赦いただければと。。
RailsでのAjax

RailsではフォームのAjax化を機能として提供してくれるが、あえてそれを使わないパターンを試してみる


ポイントはcsrf対策向けの処理を自分で書かなければならないというところか

```ruby:user_controller.rb
  # POST /users
  # POST /users.json
  def create
    @user = User.new(user_params)

    respond_to do |format|
      if @user.save
        format.html { redirect_to @user, notice: 'User was successfully created.' }
        format.json { render :show, status: :created, location: @user }
      else
        format.html { render :new }
        format.json { render json: @user.errors, status: :unprocessable_entity }
      end
    end
  end

```


```html:user.html.erb
<form id="the-form" action="/users.json" method = "POST">
  <input type="text" name="user[name]" value="">
  <button>submit</button>
</form>
```

http://ginpen.com/2013/05/07/jquery-ajax-form/
を参考にAjaxの処理を追加。
CSRFトークンをページから読み取り追加してあげる。

```js:users.js

jQuery(function($) {
    $('#the-form').submit(function(event) {
        // HTMLでの送信をキャンセル
        event.preventDefault();

        // 操作対象のフォーム要素を取得
        var $form = $(this);

        // 送信ボタンを取得
        // （後で使う: 二重送信を防止する。）
        var $button = $form.find('button');

        $.ajaxPrefilter(function(options, originalOptions, jqXHR) {
            var token;
            if (!options.crossDomain) {
              token = $('meta[name="csrf-token"]').attr('content');
              if (token) {
                   return jqXHR.setRequestHeader('X-CSRF-Token', token);
               }
            }
        });

        // 送信
        $.ajax({
            url: $form.attr('action'),
            type: $form.attr('method'),
            data: $form.serialize(),
            timeout: 10000,  // 単位はミリ秒

            // 送信前
            beforeSend: function(xhr, settings) {
                // ボタンを無効化し、二重送信を防止
                $button.attr('disabled', true);
            },
            // 応答後
            complete: function(xhr, textStatus) {
                // ボタンを有効化し、再送信を許可
                $button.attr('disabled', false);
            },

            // 通信成功時の処理
            success: function(result, textStatus, xhr) {
                // 入力値を初期化
             $('tbody').append(result.name);
            },

            // 通信失敗時の処理
            error: function(xhr, textStatus, error) {}
        });
    });

});
angular入門


スコープ（$scope）とは、**テンプレート（HTML側、View側）**とJavaScript（angularのモジュール）によるモデルとを橋渡しするためのオブジェクト。AngularJSの世界では、テンプレートで利用する値や挙動*1*はスコープを介して引き渡すのが、まず基本です。

**コントローラー(JS)**とは、このスコープを準備するための仕組みです。例えばコントローラー（jsモジュール、angularモジュール）で準備したメッセージ（＝msgプロパティ）の値を、ページに反映させたりします。

JSPとrequest,sessionの関係に似ています。

データバインディングとは、JavaScriptのオブジェクト（モデル）をHTMLテンプレート（ビュー）に結び付けるための機能。双方向データバインディングと呼ばれます。いったん、ビュー／モデルをひも付けた後は、ビューの変更はモデルに反映され、モデルの変更もまたビューに反映されます。

ng-model(html側）に入力した値は、$scopeに格納され、controller(JS側、angularモジュール）に届けられます。angularモジュールで＄scopeの中の変数の値が変更されると、ＨＴＭＬに反映されます。要は双方向ということです。


<input>要素のテキストボックスにはデフォルト値は表示させるには
angular.module('myApp', [])
  .controller('myController', ['$scope', function($scope) {
    // テキストボックスにデフォルト値を与える
   $scope.name = '権兵衛';

データバインディングの別の方法
ng-bind

ng-cloak



双方向データバインディング

シンプルなルーティング機能
HTML ベースのテンプレート機能
非同期通信のサポート
数多くのビルトインディレクティブ
フィルタ機能
Dependency Injectionによるモジュール管理
セキュリティ対策
テスト


ng-bind属性によるデータバインディング
Mac ターミナルで始めるLisp

# SBCL(Steel Bank Common Lisp)インストール
まずはMacにSBCLを入れる
$ brew install sbcl

あとはコードを書いていく。
手始めに。

$ sbcl
This is SBCL 1.3.1, an implementation of ANSI Common Lisp.
More information about SBCL is available at <http://www.sbcl.org/>.

SBCL is free software, provided as is, with absolutely no warranty.
It is mostly in the public domain; some portions are provided under
BSD-style licenses.  See the CREDITS and COPYING files in the
distribution for more information.

Lisp 四則演算サンプル
![スクリーンショット 2016-02-08 20.37.39.png](https://qiita-image-store.s3.amazonaws.com/0/105887/c2ff4a8f-0842-7481-7da9-393de390b55c.png)

# サンプル

(1+ 10)

11

(+ 1 2 3)

6


(+(* 2 2)(- 5 2))

7

(1- 10)

9

空のリスト
()

NIL

# LispでHello, World
(format t "Hello, World\n")

NILHello, Worldn

# 関数サンプル
(flet ((f (n)
　　(+ n 5)))
　(f 5))
10

![スクリーンショット 2016-02-08 21.00.27.png](https://qiita-image-store.s3.amazonaws.com/0/105887/656738f7-093c-9f5a-776e-f3be6e3d9a67.png)

(flet ((関数名 (引数)
　　　　　　定義)
      　　(関数名 (引数)
　　　　　　定義))
   　　処理)
Revel を使って簡単な API を作成する

# [Revel](https://revel.github.io/)

爆速でフルスタック？フレームワークらしい。sinatra や flask のような軽量を謳うフレームワークは実装者の主観が表れやすいのでどうせならフレームワークに強制されるほうが良い。

## インストール
開発は Goclipse を使おうと思っていたのでとりあえずエクリプス上で Go プロジェクトを作成

<img width="300" alt="スクリーンショット 2016-02-08 20.22.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/6496/27add35d-81ba-200f-1d04-da370a1925e6.png">

名前を入れてエンター！

<img width="400" alt="スクリーンショット 2016-02-08 20.22.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/6496/d702244d-2de2-045a-b93b-189246d44dd0.png">

ファッ！？
どうやらエクリプスちゃんにパスを設定してあげないといけない。
eclipse → 環境設定 → Go → Preference で GOROOT を設定。

<img width="300" alt="スクリーンショット 2016-02-08 20.27.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/6496/45246ef1-c177-1dfb-f9ca-0f60ce6ded3f.png">


こんな感じで設定。↓
![スクリーンショット 2016-02-16 15.56.03.png](https://qiita-image-store.s3.amazonaws.com/0/6496/29f075a7-edb6-9438-20b8-42a254b99993.png)



これで Eclipse 上で Go の開発ができるように。


## Revel をのっける

と、ここまでさらっとやって気がついたが Goclise に Revel ってどうやって乗っけるの。。。

ということで残りは明日やる。


- 明日やること
 - Revel でアプリのベースを作る。
ヘッダーとフッターを固定する

##html
```qiita.html
<!-- ヘッダー -->
<div class="header_area">
    <div class="header_block">
        <div class="header_box">
            <h1>
                ヘッダー
            </h1>
        </div>
    </div>
</div>
<!-- /ヘッダー -->
 
<!-- コンテンツ -->
<div class="contents_wrap">
    <div class="contents_area">
        <div class="content_block">
            コンテンツ
        </div>
    </div>
</div>
<!-- /コンテンツ -->
 
<!-- フッター -->
<div class="footer_area">
    <div class="footer_block">
        <div class="footer_box">
            <p>
                フッター
            </p>
        </div>
    </div>
</div>
<!-- /フッター -->
```

##css
```qiita.css
body {
  margin: 0;
  padding: 0;
  background: #FBF7EC;
}

.header_area {
  position: fixed;
  top: 0;
  width: 100%;
}
 
.header_block {
  background: #FDDC80;
}
 
.header_box {
  width: 700px;
  margin: 0 auto;
}
 
.header_box h1 {
  margin: 0;
  padding: 20px 0;
  font-size: 34px;
  text-align: center;
}
 
/* コンテンツ */
.contents_area {
  width: 700px;
  overflow: auto; /* スクロールする範囲を制御 */
  margin: 0 auto;
  padding: 150px 0 150px; /* コンテンツ上下にスペース */
}
 
.content_block {
  padding: 300px 10px;
  border: 1px solid #CCC;
}
 
/* フッター */
.footer_area {
  position: fixed;
  bottom: 0;
  width: 100%;
}
 
.footer_block {
  background: #FDDC80;
}
 
.footer_box {
  width: 700px;
  margin: 0 auto;
}
 
.footer_box p {
  margin: 0;
  padding: 20px 0;
  font-size: 34px;
  text-align: center;
}
 
/* IE6 */
html,
body {
  _height: 100%;
  _overflow: hidden;
}
 
.header_area,
.footer_area {
  _position: absolute;
}
 
.header_block,
.footer_block {
  _margin-right: 17px; /* IE6スクロールバーの幅分 */
}
 
.contents_wrap {
  _width: 100%;
  _height: 100%;
  _overflow: auto;
}
```
【Android - Kotlin】"Some kotlin libraries attached to this project have unsupported format. Please update the libraries or the plugin"解決した

ある日、以下のようなエラーが出た。

```
Some kotlin libraries attached to this project have unsupported format. Please update the libraries or the plugin
```

アップデートしてくださいと言われても、Kotlinのバージョンは最新の1.0.0-rc-1036（2016/2/8時点）。。。
なんで？

とりあえず`build.gradle`を覗いてみると以下のような記述がある。

```kotlin:build.gradle
...

buildscript {
    ext.kotlin_version = '1.0.0-beta-3594'
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

...
```

あ、`ext.kotlin_version`が違う。。。
というわけで以下のように修正。

```
ext.kotlin_version = '1.0.0-rc-1036'
```

解決した。
MonoDevelopに文字を入力できなくなったときの対処法

Unityをバージョンアップしたところ、
突然MonoDevelopが入力を受け付けなくなる事態が発生したので、
その対処法をメモっておきます。

MonoDevelopの設定からAdd In Managerを選択し、
Version ControlのGit Support/Subversion supportをDisableに

どうもunder version controlじゃないからと編集をブロックされるようです。
USBコネクタ > Link > 1..5のピンアサイン

USBコネクタのピンアサインへのリンク
http://ktsite.ddo.jp/kikaku/usb/index.html?PHPSESSID=aebaedf74eee0cfadb4e9fb393447fb4

- 1ピン : +5V
- 5ピン : GND

Pi Zeroモック作成用に買っておいた microB型コネクタが SNS-MQ135 の電源として使えるかどうか。
BerkshelfをWindowsで使っている時、運が悪いと正しくVendorできなくなる

微妙な英語で[Issueに報告](https://github.com/berkshelf/berkshelf/issues/1508)しておいたけど、母語で共有。

Vendorのコマンドに含まれるコードについて、Windows環境下では、Dos形式の短縮パスを返却する関数と、そうではない関数が混ざっています。

悪いことに、それらの別々の関数で取得したパスA,Bについて、A->Bについての相対パスを計算して返すコードがあるため、その相対パスが想定（Dos形式を予測していない場合）と違う値を返すケースが存在しており、結果としてVendorディレクトリがとんでも無い間違った場所に作成されるというバグになります。

すでに現象として困っている人はQuickFixとして、file_syncer.rbの60行目あたり、source_filesの定義の前に<code>source = Dir.glob(source)[0]</code>という一行を入れてください。

ちなみに、この現象が起こっている場合、下みたいになります。

```
berks vendor cookbooks
parent : C:/Users/H4980~1.AYA/AppData/Local/Temp/vendor20160208-3844-1nh5hbi
source : C:/Users/h.ayabe/AppData/Local/Temp/vendor20160208-3844-1nh5hbi/td-agent/resources

return value of relative_path_for : ../../../../../h.ayabe/AppData/Local/Temp/vendor20160208-3844-1nh5hbi/td-agent/resources
vendor directory : cookbooks/../../../../../h.ayabe/AppData/Local/Temp/vendor20160208-3844-1nh5hbi/td-agent/resources
```
Go メモ3

- 今日やること
 - 有名なフレームワーク調べる
 - テストの仕方とか
 - 作法を調べる(スペースは2でいいのかしら？)
 - 簡単なアプリ(掲示板くらい)を作ってみる。

## フレームワーク
 
### REVEL
- 特徴
  - 爆速らしい。
  - Java の Play に似ている？
  - どうやらメジャー
Revel に決定

##　テスト
フレームワーク[ここ](http://golang-jp.org/doc/code.html#Testing)みると go test ってのがメジャーなのかな？

## 作法
[ここ](http://golang-jp.org/doc/effective_go.html)。読むの大変そう。。。[日本語にしてる方発見。ありがとうございます](http://go.shibu.jp/effective_go.html)

#


- 明日やること
 - 簡単なアプリを作ってみる
Atom 自分用メモ

Atomキーバインドチートシート
http://qiita.com/clngn/items/c04d827537cb51f72044

Atomを使う中でカスタマイズした項目などメモ。

随時追記していきます。

## ファイル検索でignoreのファイルもヒットするようにする
Settings -> Core Settings の
「Exclude VCS Ignored Paths」をオフにする

## ignore指定されているファイルもtree viewで表示する
Settings -> packagesで「tree-view」を検索
tree-viewパッケージ設定の項目に「Hide VCS Ignored Files」という項目があるのでこれをオフにする

## ファイル保存時に空白トリム処理をするデフォルト動作をオフにする
Settings -> packagesで「whitespace」を検索
whitespaceパッケージの「Remove Trailing Whitespace」をオフにする

## タブが開き過ぎないように
プレビュータブを有効化する。

Packagets -> Tabs -> Settings -> Use Preview Tabs
これをONに。

## ペイン移動のショートカットを変更
cmd-[]に割り当てた

keymap.csonに以下を記述

```
'atom-workspace atom-text-editor:not([mini])':
  'cmd-]': 'window:focus-next-pane'
  'cmd-[': 'window:focus-previous-pane'
```

## cmd-left(right)で単語単位カーソル移動ができるようキー入れ替え

cmd-right <-> alt-right
shift-cmd-right <-> alt-shift-right
cmd-left <-> alt-left
shift-cmd-left <-> alt-shift-left

```
'atom-text-editor':
  'cmd-right':   'editor:move-to-end-of-word'
  'alt-right': 'editor:move-to-end-of-screen-line'
  'shift-cmd-right': 'editor:select-to-end-of-word'
  'alt-shift-right': 'editor:select-to-end-of-line'
  'cmd-left': 'editor:move-to-beginning-of-word'
  'alt-left': 'editor:move-to-first-character-of-line'
  'shift-cmd-left': 'editor:select-to-beginning-of-word'  
  'alt-shift-left': 'editor:select-to-first-character-of-line'  
```

## gitの変更行を見やすくする

デフォルトで入っているgit-diffパッケージのsetting中の「Show Icons In Editor Gutter」 をオンにする

## 言語ごとにタブのwidthを切り替え
デフォルト...2
php...4 (language-phpパッケージのSettingsで指定)

## 単語選択に$等の記号が含まれないようにする
以下をconfig.csonに追加

```
".source.php":
  editor:
    nonWordCharacters: '/\\()"\':,.;<>~!@#%^&*|+=[]{}`?-$'
```
## インストールしたパッケージ
php-twig
atom-typescript
language-babel
language-scala
terminial-plus
linter
hyperclick
Ensime
docblockr <- 神
Raspberry Pi > GPIO > 何mA流せる? > 3.3V rail > 各:3mA程度 / 合計:51mA程度

入手した空気質センサ SNS-MQ135は5Vで800mW(160mA)程度のHeating consumptionという表記を知った。
[datasheet @ olimex](https://www.olimex.com/Products/Components/Sensors/SNS-MQ135/resources/SNS-MQ135.pdf)

ESP8266では3.3V電圧なので、同じ電源は使えない。

ふと、RPiの場合はGPIOでどれくらいの電流を流せるのか気になった。

以下を見つけた。
http://raspberrypi.stackexchange.com/questions/9298/what-is-the-maximum-current-the-gpio-pins-can-output

### SLaGさんの回答

- 5V rail : USB経路で直接流しているので、ボードの消費分をマイナスすればよさそう
- 3.3V rail : 最大50mA

### spuderさんの回答

50mAというのは17pins全体の割り当てで、各pinにすると 50mA / 17 = 3mA程度、とのことらしい。

### John Wardさんの回答

各ピンの最大は 16mA
合計の最大は 51mA


5V railについてははっきりと確認されたわけではなさそう。
[Swift] enumをキーにしてNSKeyedArchiverで保存する

## 目的
`NSKeyedArchiver` / `NSKeyedUnarchiver` でデータを保存する際のキーをenumで管理するため。
Protocolつけるだけで利用できるようにしたい。

## 使い方
```swift
// 保存先のパス指定
private let path = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] + "/foo.cache"

// enumの定義
enum Key: String, EnumKeyedArchivable {
    case Bar = "Bar"
}

// Archive
var dictionary: [Key: AnyObject] = [:]
dictionary[.Bar] = "This is Bar"
NSKeyedArchiver.archive(dictionary, toFile: path)

// Unarchive
let unarchivedDictionary = NSKeyedUnarchiver.unarchive(Key.self, file: path)
print(unarchivedDictionary)  // Optional([Key.Bar: This is Bar])

```

## 実装

```swift
protocol EnumKeyedArchivable: RawRepresentable {
    func keyValue() -> String
    init?(stringValue: String)
}

extension EnumKeyedArchivable where Self: RawRepresentable, Self.RawValue == String {
    func keyValue() -> String {
        return self.rawValue
    }
    init?(stringValue: String) {
        self.init(rawValue: stringValue)
    }
}

extension NSKeyedArchiver {
    class func archive<T: EnumKeyedArchivable>(dictionary: [T: AnyObject], toFile file: String) {
        var archivableDictionary: [String: AnyObject] = [:]
        for (key, value) in dictionary {
            archivableDictionary[key.keyValue()] = value
        }
        self.archiveRootObject(archivableDictionary, toFile: file)
    }
}

extension NSKeyedUnarchiver {
    class func unarchive<T: EnumKeyedArchivable>(key: T.Type, file: String) -> [T: AnyObject]? {
        guard let archivedDictionary = self.unarchiveObjectWithFile(file) as? [String: AnyObject] else {
            return nil
        }
        var dictonary: [T: AnyObject] = [:]
        for (key, value) in archivedDictionary {
            if let enumKey = T(stringValue: key) {
                dictonary[enumKey] = value
            }
        }
        return dictonary
    }
}
```
ESP8266 がアクセスポイントとなってSSID・パスワードの初期設定をする


良くあるユースケースとして、

1. デバイスを起動
2. そのデバイスがアクセスポイントになってるので、そこにまずは繋いで、ちゃんと繋ぎたいWiFiのSSIDとパスワードを入力
3. 繋がったら通常起動し、そのセットしたSSID/パスワードを利用する

が上げられる。割とちゃんと実装すると大変なんだけど、[WiFiManager](https://github.com/tzapu/WiFiManager) というライブラリを使うと簡単にできると言うことを [ESP8266 WI-FI SSID、パスワードのオンライン設定](http://takehikoshimojima.tumblr.com/post/138820924644/esp8266-wi-fi-ssid%E3%83%91%E3%82%B9%E3%83%AF%E3%83%BC%E3%83%89%E3%81%AE%E3%82%AA%E3%83%B3%E3%83%A9%E3%82%A4%E3%83%B3%E8%A8%AD%E5%AE%9A) より知った。

ライブラリを使える状態にすると

```cpp
#include <ESP8266WiFi.h>
#include <DNSServer.h>
#include <ESP8266WebServer.h>
#include <WiFiManager.h>

void setup() {
  WiFiManager wifiManager;
  wifiManager.autoConnect();
}

void loop() {
}
```

だけで上のユースケースが満たされて大変便利だ…。標準でWebUIもついてる。

これに[OTA アップデート](http://qiita.com/hotchpotch/items/1cab19b6d464672e3a4d)組み合わせると、めんどくさいけどやりたいことの大きな二つがサクッとやれる。

## SSID やパスワードをどこに保存してるか

で、セキュアなのかどうなのか、雑に考えるとEEPROMの上に保持していて物理的な読み出しがしやすくなってるんじゃ無いのかな、と思って WiFiManager のソースを読んだけど、SSIDとパスワードを保存しているコードが解らなくて、esp8266のArduinoのコードを読んでも解らなかった。

もうちょっと調べてみると、esp8266のSDKを通してFlashメモリのWiFi configの領域に書き込んでるみたい。

- https://github.com/esp8266/Arduino/blob/master/doc/filesystem.md


```
|--------------|-------|---------------|--|--|--|--|--|
^              ^       ^               ^     ^
Sketch    OTA update   File system   EEPROM  WiFi config (SDK)
```

ていうか File System としてそこそこ大きな領域扱えたんだ！知らなかった。
MeCabの分かち書き（-Owakati）を基本形で行う

#　★解決済み

記事にコメントをいただき、もっと簡単な方法を教えていただきました。

```
$ echo 私は荷物を持って家を出た。 | mecab -F"%f[6] " -U"%m " -E"\n"
私 は 荷物 を 持つ て 家 を 出る た 。
```
---

MeCabの分かち書きオプション(-Owakati)の出力は表層形になる。
###mecab -Owakati の出力形式
```out.txt
私 は 荷物 を 持っ て 家 を 出 た 。
```

# MeCabの分かち書きを基本形で
下記のように、分かち書き、かつ、基本形（辞書の見出語）の出力が欲しかった。mecabのオプションではできないらしい。

```out_lemma.txt
私 は 荷物 を 持つ て 家 を 出る た 。
```

http://kiyukuta.github.io/2013/09/04/mecab_wakati_lemma.html
↑こちらの記事でパッチを作ってる方がいるのだが、今回はパッチを当てないで処理したかったのでスクリプト書いた。mecabの未知語の品詞推定はOFFにしたいので、'unk-feature' => '未知語' を指定している。


```mecab_wakati_lemma.pl
#!/usr/bin/env perl

use strict;
use warnings;
use utf8;
use Text::MeCab;

# MeCabインスタンス
my $mecab = Text::MeCab->new( { 'unk-feature' => '未知語', } );  # 未知語に対して品詞推定を行わず"未知語"を出力

# 未知語用ラベル
my $unk_class = '未知語';
utf8::encode($unk_class);

while (<>) {
    my $n = $mecab->parse($_);

    while ($n) {
        if ( $n->feature
            =~ /^(.*?),(.*?),(.*?),(.*?),(.*?),(.*?),(.*?),(.*?),(.*?)$/ )
        {
            my $class_1 = $1;
            my $class_2 = $2;
            my $class_3 = $3;
            my $class_4 = $4;
            my $class_5 = $5;
            my $class_6 = $6;
            my $kihonkei  = $7;
            my $yomi_1  = $8;
            my $yomi_2  = $9;

            if ( $class_1 !~ /^BOS\/EOS/ ) {    # BOS/EOS 以外のとき
                print "$kihonkei" . " ";
            }
        }
        elsif ( $n->feature eq $unk_class ) {    # 未知語のとき
            my $unknown = $n->surface;
            print "$unknown" . " ";
        }
        $n = $n->next;
    }
    print "\n";
}
```

##処理
```
$ ./mecab_wakati_lemma.pl input.txt

私 は 荷物 を 持つ て 家 を 出る た 。
```
Railsで指定バージョンのmigrationだけやり直す

リリース前の開発中にmigrationファイルを作ったけど「あっやっぱりこのカラム必要だな」ってなったときに「新たにmigrationファイルを作ることもないな」って思ったときに便利。

```bash
$ rake db:migrate:redo VERSION=20160206130224
```

Rails 5からは下記

```bash
$ rails db:migrate:redo VERSION=20160206130224
```

downしてupされるため、テーブル作成のmigrationだったとしたらもちろんテーブルの中身は空になる。
Java Cookieのセット・取得、Secure属性

## はじめに
事前に準備する外部ライブラリ等はありません。

## 実装例
Cookieを管理するクラスを定義します。

```java:CookieTest.java
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 *
 * @author tool-taro.com
 */
public class CookieTest {

	public static String getCookie(HttpServletRequest request, String name) {
		String result = null;

		Cookie[] cookies = request.getCookies();
		if (cookies != null) {
			for (Cookie cookie : cookies) {
				if (name.equals(cookie.getName())) {
					result = cookie.getValue();
					break;
				}
			}
		}

		return result;
	}

	public static void setCookie(HttpServletRequest request, HttpServletResponse response, String path, String name, String value, int maxAge) {
		Cookie cookie = new Cookie(name, value);
		cookie.setMaxAge(maxAge);
		cookie.setPath(path);
		//httpsで稼働している環境であればCookieが暗号化されるようSecure属性をつける
		if ("https".equals(request.getScheme())) {
			cookie.setSecure(true);
		}
		response.addCookie(cookie);
	}
}
```
Cookie管理機構の準備が終わりました。
サンプルでは、動作確認しやすいようにjspで実装しています。

```jsp:cookie_test.jsp
<%-- 
    Author     : tool-taro.com
--%>

<%@page import="CookieTest"%>
<%@page contentType="text/html" pageEncoding="UTF-8" session="false" %>
<%
        //Cookieから"test_cookie_name"というKeyで登録された値(文字列)を取り出す
        String value = CookieTest.getCookie(request, "test_cookie_name");

        //valueがnullの場合のみCookieをセットする(期限は5分)
        if (value == null) {
                CookieTest.setCookie(request, response, "/", "test_cookie_name", "test_cookie_value", 5 * 60);
        }
%>
<!DOCTYPE html>
<html>
    <head>
        <title>tool-taro.com</title>
    </head>
    <body>
        取得した値="<%= value%>"<br>
    </body>
</html>
```
## 動作確認
cookie_test.jspの実行結果を見てみましょう。

```
取得した値="null"
```
想定通りの結果を得られました。
2回目のアクセスでは次のような結果となります。

```
取得した値="test_cookie_value"
```
想定通りの結果を得られました。

ブラウザでCookieが管理されている状況を確認します。
パスや有効期限が指定通り管理されています。
また、httpsでアクセスされた場合に限り"Secure"属性を指定していますので、
クライアント(ブラウザ)からのCookie送信の扱いについて違いが出ます。

http
<img width="581" alt="無題.png" src="https://qiita-image-store.s3.amazonaws.com/0/111947/03205823-67f3-3a2c-32b6-58ac3514e2fc.png">

https
<img width="517" alt="無題.png" src="https://qiita-image-store.s3.amazonaws.com/0/111947/48bdc0f6-c9fc-d4d6-015c-c2ebf62a49f6.png">
## 環境
- 開発
	- Windows 10 Pro
	- JDK 1.8.0_112
	- NetBeans IDE 8.2

- 動作検証
	- CentOS Linux release 7.2
	- JDK 1.8.0_112


Webツールも公開しています。
[Web便利ツール@ツールタロウ](http://tool-taro.com/)
ESP-WROOM-02 へネットワーク経由でのファームウェア書き込み


[ESP8266 core for Arduino](https://github.com/esp8266/Arduino) の 2.0 から OTA がサポートされたよな、ということで試してみたら簡単にできた。大本に入ったので、ライブラリも別に用意する必要も無い。

ESP-WROOM-02 は便利なんだけど、ファームウェアの書き込みがいささか面倒なので OTA でできると大変便利。

例によって cho45 先生が[先にやってる](http://lowreal.net/2015/12/23/2)ので、やってることをなぞるだけ。

- https://github.com/esp8266/Arduino/blob/master/libraries/ArduinoOTA/examples/BasicOTA/BasicOTA.ino

サンプルコードを実行して WiFi 接続がうまくいくと IP Address が表示される。

```
Ready
IP address: 192.168.24.159
```

PlatformIO 使ってるなら platform.ini の項目に ota 用の env を追加する。upload_port の項目を追加するだけで良い。

```
[env:esp-ota]
platform = espressif
framework = arduino
board = esp12e
targets = upload
upload_port = 192.168.24.159

[env:esp]
platform = espressif
framework = arduino
board = esp12e
targets = upload
upload_speed = 921600
```

```
$ platformio run -e esp-ota
...
17:49:50 [INFO]: Starting on 0.0.0.0:27101
17:49:50 [INFO]: Upload size: 225984
...
17:49:51 [INFO]: Waiting for device...
Uploading: [============================================================] 100% Done...
17:50:02 [INFO]: Waiting for result...
17:50:02 [INFO]: Result: OK
```

みたいな感じで割とサクッと終わる。なおesp8266側をシリアルコンソールに表示しておくと、そちらにも進捗表示がprintされる。

## mDNS での名前解決

IP をいちいち打ち込むのが面倒、と言う場合は mDNS での名前解決を行うこともできる。標準だと ```esp8266-[ChipID]``` の名前が使われるが、明示的に以下のように指定もできる。

```
ArduinoOTA.setHostname("myesp8266");
```

OSX から dns-sd コマンドで調べてみる。

```bash
$ dns-sd -B _arduino._tcp
Browsing for _arduino._tcp
DATE: ---Mon 08 Feb 2016---
17:55:24.666  ...STARTING...
Timestamp     A/R    Flags  if Domain               Service Type         Instance Name
17:55:24.667  Add        2   5 local.               _arduino._tcp.       esp8266-a2ebe8
```

IPを調べる。

```bash
$ dns-sd -G v4 esp8266-a2ebe8.local
DATE: ---Mon 08 Feb 2016---
17:56:13.100  ...STARTING...
Timestamp     A/R Flags if Hostname                               Address                                      TTL
17:56:13.101  Add     2  5 esp8266-a2ebe8.local.                  192.168.24.159                              120
```

実際はホスト名さえ解ってればOK。

```
upload_port = esp8266-a2ebe8.local
```

みたいに指定する。なおシリアルコンソール上で自動でセットされたホスト名を知りたい場合は

```cpp
  char hostname[15];
  sprintf(hostname, "esp8266-%06x", ESP.getChipId());
  Serial.print("Hostname: ");
  Serial.println(hostname);
```

と現状する必要がある。ArduinoOTAClass の _hostname 変数は private だし、getHostname() インターフェイス持ってないまじか〜。

<ins>追記・pull req 送ったので、 ArduinoCore 2.3.0 で ArduinoOTA::getHostname() インターフェイスが導入されました。</ins>

- http://esp8266.github.io/Arduino/versions/2.3.0/doc/changes.html

## 認証

平文でやりとりしてるのでセキュアでないが、一応認証もサンプルコードにあるとおりつけられる。```ArduinoOTA.setPassword()``` で指定し、アップロードのフラグで ```--auth=xxx``` を付ければOK。

PlatformIO では .ini で

```
upload_flags = --auth=xxx
```

で指定してやればおｋ。

特に今のところハマりどころも無く、サクッと OTA 書き込みできた。シリアルUSB経由でのファームウェア書き込みより転送速度も速いし、セキュリティのことを考慮しなくて良い環境では良さそう。
ESP-WROOM-02 の配線


最近 ESP-WROOM-02 弄るときはスイッチサイエンスの [ESP-WROOM-02開発ボード](https://www.switch-science.com/catalog/2500/) ばっかり使っていて楽していたら、素の ESP-WROOM-02 を弄ったとの配線でアレどうするんだっけ、となったのでメモ。

## 何を参考にすべきか

回路図読めるなら

- http://doc.switch-science.com/schematic/ESP-WROOM-02_devboad/ESP_WROOM_02_FTDI.pdf

見るのが一番すんなりと理解出来ると。

- 3V3
  - 直接 3.3V 電源へ。なおUSBシリアル変換チップ経由で 3.3V とると電流不足で WiFi 有効時に安定しないので注意。
- GND
  - GND へ
- EN
  - プルアップ用の10k抵抗はさんで3.3V電源へ
- IO2
  - プルアップ用の10k抵抗はさんで3.3V電源へ
- IO15
  - プルダウン用の10k抵抗はさんでGNDへ
- IO0
  - 通常起動(ファームウェア読み込んで立ち上げ)時はHIGH、ファームウェア書き込み時にLOWに
  - なので、通常はプルアップ用に10k抵抗はさんで3.3Vへ(HIGHに)、スイッチやジャンパピンで一時的にGNDに繋いでLOWにできる回路にする
- RST
  - Active Low構成
  - 通常はプルアップ用10k抵抗で3.3Vに繋ぎHIGHを保ち、リセット時にスイッチが押されGNDに繋がることでLOWになりリセットがかかる。
- TXとRX
  - RXとTXへ

## ファームウェア書き込み時だけ、書き込みモードでリセットをかけたい

面倒なのが、ファームウェア書き込み時に IO0 を LOW にしつつ RST でリセットが必要なことなんだけど、[ESP-WROOM-02開発ボード](https://www.switch-science.com/catalog/2500/)では、特に何も考えずファームウェア書き込み&そのファームウェアから起動ができる。

回路図を見るとRS232C側のDTRとRTSをうまく使い、ファームウェア書き込み時にIO0がLOWになった状態でRSTがLOWになりリセットがかかるようしている。

![230228a8-f28f-4035-94b7-544322c37567.png](https://qiita-image-store.s3.amazonaws.com/0/5330/bc3bf2ab-b4f9-d118-dde8-35bf2343354f.png "230228a8-f28f-4035-94b7-544322c37567.png")

ESP8266 へのファームウェア書き込みツールの一つ、esptool.py のコードを見ると

- https://github.com/themadinventor/esptool/blob/master/esptool.py#L156

```python
            # RTS = either CH_PD or nRESET (both active low = chip in reset)
            # DTR = GPIO0 (active low = boot to flasher)
            self._port.setDTR(False)
            self._port.setRTS(True)
            time.sleep(0.05)
            self._port.setDTR(True)
            self._port.setRTS(False)
            time.sleep(0.05)
            self._port.setDTR(False)
```

なので、最初に RTS が HIGH になり TR2 のエミッタ -> コミッタへ電流が流れ IO0 が LOW (DTRに流れる、たぶん…) になりファームウェア書き込みモードになる。その後 DTR が HIGH になりリセットがかかり、RTS も同時に LOW に戻す。

これでうまく動くんだけど、RTSが先にHIGHになりDTRを後でHIGHにしたときに、リセットのタイミングがうまくいくのかよくわかってない…。タイミングによってはIO0が先にHIGHに戻ってしまいそうな気もするんだけど、問題ないのは何故なのだろうか…。解る人居たら教えて下さい…＞＜！
Atomのlinter-ruby pluginでrbenv localのrubyを使う


rbenv使用時､ [linter-ruby]の`Settings -> Ruby executable Path`に`which ruby`の値を入れても`rbenv system`のrubyを使う模様｡

Atomの`init.coffee`に以下を追加してカレントディレクトリを変更する｡

```coffee-script:init.coffee
process.chdir(atom.project.getPaths()[0]) if atom.project.getPaths()[0]?
```

[linter-ruby]: https://github.com/AtomLinter/linter-ruby
wgetでページをhtml構成を保持したままダウンロードする方法


デザインの検証などに、使うために、見えているページをそのままDownloadしたいときもありますよね！



```
wget -pr -l 1 http://example.com -U=iPhone
```

オプションに関して解説

  
-r	再帰に
-l	階層の最大の深さを NUMBER に設定する (0 で無制限)
-p	HTML を表示するのに必要な全ての画像等も取得する
-U	ユーザagentの指定







補足するとbasic認証を抜けるオプションはこれ
--http-user	user名
--http-passwd	 password




```
wget -pr -l 1  --http-user="hogehogeuser" --http-passwd="hogehogepassword"  http://example.com -U=iPhone
```
Runtimeでnslookupする

## はじめに
Runtimeで外部アプリを叩いているだけじゃないか、というご指摘はごもっともです。

事前に準備する外部ライブラリ等はありません。

## 実装例
サンプルでは、動作確認しやすいようにmainメソッドで実行できるようにしてあります。
結果だけを確認したい場合は、この記事の一番下のリンク先で使えるようにしてありますのでご覧ください。

```java:NsLookup.java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;

/**
 *
 * @author tool-taro.com
 */
public class NsLookup {

	public static void main(String[] args) throws IOException, InterruptedException {

		//検索したいドメイン・IPアドレス
		String source = "tool-taro.com";
		//nslookupのパス
		String nslookupPath = "/usr/bin/nslookup";

		//nslookup処理
		String[] commandArray = new String[2];
		commandArray[0] = nslookupPath;
		commandArray[1] = source;
		Charset charset = StandardCharsets.UTF_8;

		Runtime runtime = Runtime.getRuntime();
		Process process = null;
		StringBuilder logBuilder = new StringBuilder();
		StringBuilder errorBuilder = new StringBuilder();
		int status = 0;

		try {
			process = runtime.exec(commandArray);
			final InputStream in = process.getInputStream();
			final InputStream ein = process.getErrorStream();

			Runnable inputStreamThread = () -> {
				BufferedReader reader = null;
				String line;
				try {
					reader = new BufferedReader(new InputStreamReader(in, charset));
					while (true) {
						line = reader.readLine();
						if (line == null) {
							break;
						}
						logBuilder.append(line).append("\n");
					}
				}
				catch (IOException e) {
				}
				finally {
					if (reader != null) {
						try {
							reader.close();
						}
						catch (IOException e) {
						}
					}
				}
			};
			Runnable errorStreamThread = () -> {
				BufferedReader reader = null;
				String line;
				try {
					reader = new BufferedReader(new InputStreamReader(ein, charset));
					while (true) {
						line = reader.readLine();
						if (line == null) {
							break;
						}
						errorBuilder.append(line).append("\n");
					}
				}
				catch (IOException e) {
				}
				finally {
					if (reader != null) {
						try {
							reader.close();
						}
						catch (IOException e) {
						}
					}
				}
			};

			Thread inThread = new Thread(inputStreamThread);
			Thread errorThread = new Thread(errorStreamThread);

			inThread.start();
			errorThread.start();

			status = process.waitFor();
			inThread.join();
			errorThread.join();
		}
		finally {
			if (process != null) {
				try {
					process.destroy();
				}
				catch (Exception e) {
				}
			}
		}
		//標準出力
		System.out.format("検索結果=%1$s", logBuilder.toString());
	}
}
```
## 動作確認

```
> javac NsLookup.java
> java NsLookup
> 検索結果=Server:         XXX.XXX.XXX.XXX
Address:        XXX.XXX.XXX.XXX#XX

Non-authoritative answer:
Name:   tool-taro.com
Address: XXX.XXX.XXX.XXX

```
## 環境
- 開発
	- Windows 10 Pro
	- JDK 1.8.0_112
	- NetBeans IDE 8.2

- 動作検証
	- CentOS Linux release 7.2
	- JDK 1.8.0_112

上記の実装をベースにWebツールも公開しています。
[Nslookup(ドメイン/IPアドレスサーチ)｜Web便利ツール@ツールタロウ](http://tool-taro.com/nslookup/)
Angular 2のルーティングで遅延処理を挟む方法

Angular 2の「ルーティング」。SPA (シングルページアプリケーション)でディープリンクを実装する機能がAngular2にも搭載されてます。

ルーティングでページ遷移時に非同期処理を挟むときの方法をまとめました。

## 動作デモ

http://plnkr.co/edit/SJy7RBzjQgyucQdEcJmH?p=preview


## 実装ポイント

### HTMLにルーターの参照を入れる (必須)

```html
<script src="node_modules/angular2/bundles/router.dev.js"></script>
```

### インターフェースを実装する (たぶん必須)

ルーティングの遷移時において、非同期処理を挟みたいクラスに、`OnActivate`と`OnDeactivate`インターフェースを指定。すると、`routerOnActivate()`メソッドと`routerOnDeactivate()`メソッドの実装が義務付けられます。これがルーティング時のライフサイクルイベントとなります。

```js
import {OnActivate} from "angular2/router";
import {OnDeactivate} from "angular2/router";
import {ComponentInstruction} from "angular2/router";

class ほげほげくらす implements OnActivate, OnDeactivate  {
  /** 遷移で入ってきたとき */
  routerOnActivate(nextInstruction:ComponentInstruction, prevInstruction:ComponentInstruction) {
    // ここに非同期処理
  }
  /** 遷移ででていくとき */
  routerOnDeactivate(nextInstruction:ComponentInstruction, prevInstruction:ComponentInstruction) {
    // ここに非同期処理
  }
}
```

### それぞれの関数に Promise で非同期処理を実装する (必須)

例えば次のような形で非同期処理を実装します。`setTimeout()`メソッドで適当に非同期処理をしていますが、`Promise`インスタンスを`return`で返してやればOK。

```js
/** 遷移で入ってきたとき */
routerOnActivate(nextInstruction:ComponentInstruction, prevInstruction:ComponentInstruction) {
  // ここに非同期処理
  return new Promise((res, rej) => {
    setTimeout(() => {
      // 非同期処理終了の通達をする
      res('用意ができたよ');
    }, 1000);
  }).then();
}
```


## 環境

- Angular 2 beta 3
- TypeScript 1.7

## 実戦投入の紹介

私のポートフォリオサイトをAngular2でリニューアルしたのですが、その中でルーティングを使っています。

ClockMaker Labs - Interaction Design × Web Technology
http://clockmaker.jp/labs/

![ClockMaker Labs](http://clockmaker.jp/labs/_labs/images/preview_160208.jpg)

ユーザーテストをしたところ、次のことがわかりがっかりしたのです :anguished:

- HTML5モード(PushState)を使って画面遷移をしている
- 当初は演出を入っておらずパッと画面が切り替わる
- URLもディレクトリを掘ったような形
- SPAではなく、別のHTMLページに飛んだものだと思われた
- 体感上、Angular 2を採用した意味が無い＼(^o^)／

そのため、ルーティングでの画面遷移時にフェード処理をいれました。フェード処理はCSS3 Transitionを使っています。 Angular2がトリガーとなり、CSSのクラスを`[ngClass]`記述で割り当てています。

そのおかげで、ユーザーテストするとSPAだと気づいてもらえました:blush:

## まとめ

Angular2のルーティング実装の際、非同期処理入れたいときに参考になれば幸いです。
PythonライブラリのmatplotlibとNetworkXの日本語文字化け解消

## pyenv-virtualenvで作った環境でmatplotlibとNetworkXが文字化け

[前回](http://qiita.com/grachro/items/d271d3de555ad118f4e5)、Macにpyenv-virtualenvを使ってPython環境を作りましたが、その時いれたmatplotlibとNetworkXで日本語文字が文字化けしている状態になっていました。

どちらも有名なライブラリなので、普通にインストールしていたら特にはまらない箇所だと思うのですが、手元の環境では文字化けします。解消方法を探してみました。


## matplotlibで日本語を表示する

サンプルコード

```py:matplotlib-utf8.py
import matplotlib.pyplot as plt
plt.text(0.2, 0.2, "日本語", fontsize=50)
plt.show()
```

このコードを実行すると

```bash
python matplotlib-utf8.py
```

![スクリーンショット 2016-02-08 18.24.33.png](https://qiita-image-store.s3.amazonaws.com/0/88743/4a8c02b1-5a7b-41dc-45db-b8671f963af4.png)
こんな感じで日本語部分が文字化けします。

これは、.matplotlib/matplotlibrcファイルに日本語フォントを指定すれば解消しました。

```bash:~/.matplotlib/matplotlibrc
font.family :Hiragino Kaku Gothic Pro
backend : TkAgg
```
*ヒラギノ角ゴを指定した例*

![スクリーンショット 2016-02-08 18.23.32.png](https://qiita-image-store.s3.amazonaws.com/0/88743/af705315-e9b8-ba85-ae90-5005db9d18cf.png)


## 一方NetworkXでは

NetworkXではdraw_networkx_labelsでノードにテキストを表示できますが、matplotlibにフォント指定しても文字化けしたままです。

![スクリーンショット 2016-02-08 18.13.08.png](https://qiita-image-store.s3.amazonaws.com/0/88743/d24ca3bf-1003-75e6-67e8-1270546183d4.png)


これは、draw_networkx_labelsのfont_familyパラメータに、ヒラギノ角ゴ等の日本語フォントを指定すると解消しました。

```py:networkx-label.py
import matplotlib.pyplot as plt
import networkx as nx

G=nx.Graph()
G.add_edge(0,1)
G.add_edge(1,2)
G.add_edge(2,0)
G.add_edge(0,3)

pos=nx.spring_layout(G)

nx.draw_networkx_edges(G,pos,width=1.0,alpha=0.5)

labels={0:"零",1:"初",2:"弐",3:"参"}
nx.draw_networkx_labels(G,pos,labels,font_size=16,font_family='Hiragino Kaku Gothic Pro')

plt.show()
```

実行するとNetworkXでも日本語で表示できました。

```bash
python networkx-label.py
```

![スクリーンショット 2016-02-08 18.10.21.png](https://qiita-image-store.s3.amazonaws.com/0/88743/55a8b632-7857-9d6a-c972-9631a2dbc807.png)

##追記
* 手元の別のMacだとfont_family='Hiragino Kaku Gothic Pro'だと文字化けしたままで、font_family='Osaka'だと日本語出力できました。
* 'Hiragino Kaku Gothic Pro'より'Hiragino Kaku Gothic ProN'の方がいいかも
s3fsで複数バケットをマウントする方法

はまった割に同じ事例を見つけられなかったので。

まず結論から先に書く。
s3fsで複数バケットにマウントしたい場合、
まず/etc/passwd-s3fsにバケット数分のパスワード情報を記述した上で、
マウント時のオプションにpasswd_file=/etc/passwd-s3fsを追記してやる必要がある。
以下詳細。

# 詳細手順
## /etc/passwd-s3fsの記述

（まずそもそも、パスワードファイルの格納先は別に/etc/passwd-s3fs固定ではないけれども、簡単のため、/etc/passwd-s3fsにファイルを置くという前提で話を進める）
このファイルに複数のバケットのパスワード情報を記述したい場合、

```
bucketName:accessKeyId:secretAccessKey
```

のようにバケット名を含むパスワード情報を記述する。これを、下記のようにバケット数分記述する。

```
bucketName1:accessKeyId1:secretAccessKey1
bucketName2:accessKeyId2:secretAccessKey2
```

書き終わったら、/etc/passwd-s3fsの権限を変更する。/etc/passwd-s3fsの場合は640でいいらしい。

```
sudo chmod 640 /etc/passwd-s3fs
```

ファイルの設定は以上。ここまでは[マニュアル](https://code.google.com/archive/p/s3fs/wikis/FuseOverAmazon.wiki)に明示されているので問題ないはず。

## マウントの方法について

ここではまった。はまり方としては、bucketName1をs3fsでマウント（これは成功）し、次いでbucketName2をマウントしようとすると、下記のようなエラーが発生した。

```
s3fs: could not establish security credentials, check documentation
```

manやwikiを読んで試行錯誤した結果、パスワードファイルを明示してやらなければいけなかったらしい。

```
(NG)s3fs bucketName2 /mnt/s3 -o allow_other,use_cache=/tmp,uid=497,gid=497
(OK)s3fs bucketName2 /mnt/s3 -o allow_other,use_cache=/tmp,uid=497,gid=497,passwd_file=/etc/passwd-s3fs
```

以上。
メモ - Spring - 入れ子になった @Transactional の内側でローバック対象の例外が発生してもローバックさせない方法

PlatformTransactionManager の globalRollbackOnParticipationFailure を false に設定すればよい(が、@Transactional が付いている単位で整合性のあるデータとしているともうので、このフラグをfalseにするということは、中途半端な状態でのコミットを許容するということに繋がる)

```java
@Configuration
public class TransactionConfiguration {
    @Autowired
    private DataSource dataSource;

    @Bean
    public PlatformTransactionManager transactionManager() {
        DataSourceTransactionManager transactionManager = new DataSourceTransactionManager(dataSource);
        transactionManager.setGlobalRollbackOnParticipationFailure(false);
        return transactionManager;
    }
}
```
たった3行で実現できるCSSの上下中央揃え（Flexbox）

この記事は大幅に加筆・修正して「[上下中央揃えのCSSまとめ。Flexboxがたった3行で最も手軽 \- ICS MEDIA](https://ics.media/entry/17522)」に引っ越しました。


[![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67884/d63ae331-34d1-44b2-6439-ccdb306288b3.png)](https://ics.media/entry/17522)

**10万PV、370いいねとフロントエンド界隈でご好評いただいた内容**です。ぜひご覧ください。

※ Google検索で辿り着いた方にリンク切れとなっては申し訳ないので、元の記事を残しています。ご了承ください。
ActiveRecordでSlowQueryを通知する方法

`ActiveRecord::Subscriber`を使って`logger`や[Bugsnag](https://bugsnag.com/)などで通知するコードを書いたのでメモ。

```rb:lib/ext/active_record/slow_query_subscriber.rb
module Ext::ActiveRecord
  class SlowQuerySubscriber < ActiveSupport::Subscriber
    class SlowQuery < StandardError
    end

    cattr_accessor :threshold

    def self.load!(threshold)
      self.threshold = threshold
      attach_to :active_record
    end

    def sql(event)
      if event.duration > self.threshold
        e = SlowQuery.new("Found slow query #{event.payload[:sql].inspect} : #{event.duration} msec > #{self.threshold} msec")
        e.set_backtrace caller
        ActiveRecord::Base.logger.warn(e.message)
        Bugsnag.notify_or_ignore(e, severity: "warning", grouping_hash: event.payload[:sql], payload: event.payload, duration: event.duration)
      end
    end
  end
end
```

使い方は以下

```rb:main.rb
# Detect slow query slower than 1000 msec
Ext::ActiveRecord::SlowQuerySubscriber.load!(1000)
```

[slack-notifier](https://github.com/stevenosloan/slack-notifier)など使えば応用してSlack通知もできると思います。
Ruby | 正規表現 | 末尾にマッチする「$」と「\Z」と「\z」の違い

## テキスト

たとえば次の通り、複数行のテキストがあるとする。 
( **2行目の最後にも改行がある状態**だ )

```
I am drinking
Everyday so much

```

ここでは確認用に、変数に収めておこう。

```rb
texts = "I am drinking" + "\n" + "Everyday so much" + "\n"
```

# $ でのマッチ

$ はテキストを1行ずつ見ていく。そして1行ずつ判定する。

なので1行目単独でもマッチするし。

```rb
texts.match(/drinking$/) # => <MatchData "drinking">
```

2行目単独でもマッチする。

```rb
texts.match(/much$/) # => <MatchData "much">
```

# \Z でのマッチ

\Z はテキスト全体を見る。

1行目は「テキスト全体の末尾」ではないので、以下はマッチしない。


```rb
texts.match(/drinking\Z/) # => nil
```

2行目は「テキスト全体の末尾」なので、以下はマッチする。

```rb
texts.match(/much\Z/) # => #<MatchData "much">
```

# \z でのマッチ

\z もテキスト全体を見る。最も厳密なパターン。

\Z と違うのは「テキスト最後の改行」の扱いだ。

もちろん1行目にはマッチしない。

```rb
texts.match(/drinking\z/) # => nil 
```

2行目にもマッチしない。
なぜなら**テキストの最後に改行が入っている**からだ。

```rb
texts.match(/much\z/) # => nil
```

正規表現で「末尾の改行」を明示すればマッチする。
この場合は「マッチの結果」に改行コードも含まれるようになる。

```rb
texts.match(/much\n\z/) # => <MatchData "much\n">
```

# 確認用スクリプト

```rb
texts = "I am drinking" + "\n" + "Everyday so much" + "\n"

p texts.match(/drinking$/) # => #<MatchData "drinking">
p texts.match(/much$/) # => #<MatchData "much">

puts

p texts.match(/drinking\Z/) # => nil
p texts.match(/much\Z/) # => #<MatchData "much">

puts

p texts.match(/drinking\z/) # => nil 
p texts.match(/much\z/) # => nil
p texts.match(/much\n\z/) # => <MatchData "much\n">
```

# 環境

- ruby 2.3.0

# 参考

- [正規表現 (Ruby 2.3.0)](http://docs.ruby-lang.org/ja/2.3.0/doc/spec=2fregexp.html)
- [正規表現によるバリデーションでは ^ と $ ではなく \A と \z を使おう](http://blog.tokumaru.org/2014/03/z.html)



<!-- Update From Qiita API -->

# チャットメンバー募集


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

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


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
Realmのスレッドチェックの例外がObjective-Cの@throwからC++のthrowに変わってて戸惑った話


# きっかけ

きっかけはRealmを`0.96.3`から`0.97.1`にあげた際、異常系の単体テストが通らなくなって気付きました。

```objectviec:だいたいこんな感じのテスト
Tweet *tweet = [Tweet objectForPrimaryKey:tweetID];
__weak Tweet *weakTweet = tweet;

XCTestExpectation *expectation = [self expectationWithDescription:[NSString stringWithFormat:@"%s", __func__]];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    XCTAssertNotNil(weakTweet);
       
    @try {
        NSLog(@"text: %@", weakTweet.text);
    }
    @catch (NSException *exception) {
        NSLog(@"%s; exception = %@;", __func__, exception);
        [expectation fulfill];
    }
    @finally {
    }
});
[self waitForExpectationsWithTimeout:5. handler:^(NSError *error) {
    XCTAssertNil(error, @"error: %@", error);
}];
```

このテストは@try内でメインスレッドで生成したtweetにアクセスしているので

	"Realm accessed from incorrect thread."
	
という例外が発生します。
なぜ例外が発生するかはRLMObjectはRLMObjectが参照する`realm`が生成されたスレッドとアクセスしたスレッドが同一であることが求められており、アクセス毎に内部でチェックされ異なる場合は例外を投げるようになっています。

# コード

`0.96.3`までは`@throw`されています。[realm-cocoa/Realm/RLMRealm_Private.hpp (38)](https://github.com/realm/realm-cocoa/blob/v0.96.3/Realm/RLMRealm_Private.hpp#L38)

```objectivec:realm-cocoa/Realm/RLMRealm_Private.hpp
// throw an exception if the realm is being used from the wrong thread
static inline void RLMCheckThread(__unsafe_unretained RLMRealm *const realm) {
    if (realm->_threadID != pthread_mach_thread_np(pthread_self())) {
        @throw RLMException(@"Realm accessed from incorrect thread");
    }
}
```

`0.97.0`ではC++の`throw`に変わっています。[realm-cocoa/Realm/ObjectStore/shared_realm.cpp (267)](https://github.com/realm/realm-cocoa/blob/v0.97.0/Realm/ObjectStore/shared_realm.cpp#L267)

```objectivec
void Realm::verify_thread() const
{
    if (m_thread_id != std::this_thread::get_id()) {
        throw IncorrectThreadException();
    }
}
```

# 問題

これは何が問題かというとC++の`throw`は64bit環境だと`@catch(id exception)`では例外を受け取ることできないからです。[Exceptions in 64-Bit Executables](https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/Exceptions/Articles/Exceptions64Bit.html)
ドキュメントには`@catch(...)`という引数を省略するという意味の`...`を利用すれば良いとのことです(初めて見ましたが`...`って可変引数以外でも使うんですね)。

```objectviec:修正したテスト
Tweet *tweet = [Tweet objectForPrimaryKey:tweetID];
__weak Tweet *weakTweet = tweet;

XCTestExpectation *expectation = [self expectationWithDescription:[NSString stringWithFormat:@"%s", __func__]];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    XCTAssertNotNil(weakTweet);
       
    @try {
        NSLog(@"text: %@", weakTweet.text);
    }
    @catch (...) {
        NSLog(@"%s, Error", __func__);
        [expectation fulfill];
    }
    @finally {
    }
});
[self waitForExpectationsWithTimeout:5. handler:^(NSError *error) {
    XCTAssertNil(error, @"error: %@", error);
}];
```

# まとめ

- Realmのスレッドチェックは`0.97.0`以降ではC++の`throw`が使われており、`@catch(...)`を使う必要がある。
- `0.97.0`以降でも`@throw`も残っているのでスレッドチェックだけ何らかの理由で変更されたようです。
GitLab8.0以降でhttpでpushできない問題の解決策


##はじめに
CentOSにGitLab8.1をリバースプロキシを設定導入しました。このGitLabサーバにhttpを使ってpushしてみるとアクセスできないエラーが出るので解決策をメモります。

##なぜエラーが出るか？
そもそもGitLab8.0以降からhttp・httpsからのpushの処理の方法が変わりました。具体的にはgitlab-git-http-serverにより処理するようになりました。
そのためpushするとき、[http://gitlab.exampel.com/yorumiru/test.git]()というようなURLを指定すると思うのですが、このURLへのアクセスをうまく処理できなくなっているみたいです。

##対処方法
そこで[http://gitlab.exampel.com/yorumiru/test.git]()というようなアクセスがあったら、gitlab-git-http-serverは8181ポートがデフォルトなのでそこに飛ばしてあげればいいので次のようにnginxの設定ファイルに追加します。タイムアウトとかは適当に...

```gitlab.conf
server {
	###省略###
	
    location ~ [-\/\w\.]+\.git\/ {

      proxy_read_timeout	300;
      proxy_connect_timeout	300;
      proxy_redirect		off;
      proxy_buffering		off;

      proxy_set_header    Host                $http_host;
      proxy_set_header    X-Real-IP           $remote_addr;
      proxy_set_header    X-Forwarded-For     $proxy_add_x_forwarded_for;
      proxy_set_header    X-Forwarded-Proto   $scheme;

      proxy_pass http://localhost:8181;
    }

}
```
以下のようにGitLabの設定ファイルを編集して、```gitlab-ctl reconfigure```で適用して完了です。

```gitlab.rb
##########################
# GitLab git http server #
##########################

gitlab_git_http_server['enable'] = true
gitlab_git_http_server['ha'] = false
gitlab_git_http_server['repo_root'] = "/var/opt/gitlab/git-data/repositories"
gitlab_git_http_server['listen_addr'] = "127.0.0.1:8181"
```
##最後に
以下のIssueを参考にしました。
[Cannot clone projects via HTTP](https://gitlab.com/gitlab-org/gitlab-ce/issues/2669#note_2181517)
unix socketを使った方法もあるので参考に。

##追記
GitLabのバージョンを8.1から8.2にアップデートした段階でgitlab-git-http-serverがgitlab-workhorseに変わったようです。
GitLab8.2.2で今回と同じエラーが出ました。そこで、本投稿の設定を行ったところ問題なくpushできました。gitlab-workhorseについてもう少し調べなくては...。
まだまだ未熟者です。ご指摘感謝します。
html5のdata属性にjsを使ってオブジェクトを代入する

##ソース
```js
var obj = {hoge: 'fuga'}
var $div = $('<div/>').attr('data-obj', JSON.stringify(obj));
$('body').append($div);
```

result

```html
<body>
<div data-obj='{"hoge": "fuga"}'></div>
</body>
```

##代入した情報を再度取得したい場合は・・・
```js
var getObj =  JSON.parse( $('div').attr('data-obj') );
console.log(getObj);
```

##補足##
* 同様のやり方で配列も代入可能です
* data属性にオブジェクトや配列を代入する際は、json形式でなければいけない為、JSON.stringify()を使ってjson型に変更する
* 上記を行わないとstringとして扱われ[object, object]となってしまう
* 取得をする際も同様で、JSON.parse()を使ってオブジェクト型にパースすること
* 情報が簡単に見えるようになってしまう為、セキュリティ的に問題のある情報は別の方法を使って管理しましょう
はじめてRuby gemを作った時のメモ

# Rubygemsに登録

なにはともあれ公開するなら[Rubygems](https://rubygems.org/)にアカウント（？）を作る

# ひな形作成

```bash
bundle gem hogehoge -t
```

-tでRSpecのテストがつく。TDDで作ります。

# gemspecを編集

summary/description/homepageあたりを入力する。`TODO`を残していると`rake/build`するとき怒られる。

`Prevent pushing this gem to...`の後段のセクションはコメントアウトする。これは間違って公開してはいけないgemを公開しないようになっているらしいです。

```
ERROR:  While executing gem ... (Gem::CommandLineError)
    Too many gem names (/Users/itochang/gems/hogefuga/pkg/hogefuga-0.1.0.gem, Set, to, http://mygemserver.com); please specify only one
```

コメントアウトしないとこのエラーメッセージが出て`rake/release`の時にgemをリリースできない。

via http://qiita.com/tossh/items/08e7165e730dbc1a0e2e

# gitリポジトリ作成

リリースするならリモートも追加しとかないとだめみたい。リモートはgithubに作りましたが、bitbucketとかでもできるのかな？

# rake/build

現在のバージョンのpkgを作成。

# rake/release

Rubygemsへリリース。リモートへの`push`も行う模様。

最初は確か、Rubygemsに登録したメールとパスワードを聞かれたような気がする。

ほとんどお膳立てされており、よくわからないことも多いが、とりあえずできた。
ちなみに、作成したのは[Rubyrubi](https://rubygems.org/gems/rubyrubi)という、テキストにルビタグを貼って返すgemです。[Rubyfuri](https://rubygems.org/gems/rubyfuri)というgemを参考にさせていただきました。

# おまけ

Guardを入れました。

```ruby
gem "guard"
gem "guard-rspec"
```

nodeで言うgruntとかgulpですかね。`guard`コマンドでファイル監視＆テストができます。
【Excel】重複するカテゴリ等項目を最初だけ表示させてすっきり見せたい書式設定

# やりたいこと
下記の図のA列のような、カテゴリのように項目が重複して表示される項目を、1行目だけ表示させて同じ項目名は伏せておくようなそんな書式にさせたい。

もちろん、セル結合して表示する方法もあるけど、それだとソートが各行に作用されないので1行毎に項目は入力しておきたい、そんな人のためのちょっとしたTipsです。

![WS000.JPG](https://qiita-image-store.s3.amazonaws.com/0/36476/854edc4b-75c7-0f70-8f1d-ccf187f9f6b6.jpeg)



# 条件付書式ルールで実現する

![WS004.JPG](https://qiita-image-store.s3.amazonaws.com/0/36476/e45c63a2-3489-188e-e685-a8271ca4a626.jpeg)

E列の橙色の部分を適用範囲として、E2を基点として以下のようなルールを設定します。

どのセルを基点にしても大丈夫なタイプです。セルをコピペしても書式ルールが汚くなりません。

```
=INDIRECT(ADDRESS(ROW(),COLUMN()))=INDIRECT(ADDRESS(ROW()-1,COLUMN()))
```

条件の意味は、「現在行が上の行と同じである」。上の図だと、E3,E4,E6～E9,E11～E13が該当します。

# 適用させる書式ルール

この時に適用する書式は以下のような感じ。
![WS005.JPG](https://qiita-image-store.s3.amazonaws.com/0/36476/b86dc492-8439-cd50-a221-9ef473f9fb25.jpeg)

適用させる書式は2点です。

- フォントの色は、背景色と同じにする（今回はわかりやすく背景色を橙色としているので、文字も橙色に設定する。大概は白色）
- 罫線は、上の部分だけ空白とする 

## フォント 

![図2.jpg](https://qiita-image-store.s3.amazonaws.com/0/36476/6fb8b9c6-eb96-7327-0328-a097dbe3e7dc.jpeg)

## 罫線
![図1.jpg](https://qiita-image-store.s3.amazonaws.com/0/36476/4fb43837-b45f-9e16-5107-b7007c50c630.jpeg)

# 注意事項

- A列の書式（特に罫線）の場合のみ、うまく作動します。
- 逆の、罫線なしから罫線追加する書式設定にしないのは、最下行がいまいちだからです。
C++コンテナ std::stack

#std::stack
C++コンテナのうちの一つ.データを積み重ねるイメージで末尾挿入、末尾削除を行うことができる.

##push()関数

```C++:push.cpp
stack<int> s;
s.push(0);
s.push(1);
```

トップに要素を挿入する.

##pop()関数

```C++:pop.cpp
stack<int> s;
s.push(10);
s.push(20);
cout << s.top() << endl;  //20
s.pop();
cout << s.top() << endl;  //10
```

トップ要素を削除する.

##empty()関数

```C++:empty.cpp
stack<int> s;
cout << s.empty() << endl;  //1
s.push(1);
cout << s.empty() << endl;  //0
```

空なら1,空でないなら0を返す.

##size()関数

```C++:size.cpp
stack<int> s;
cout << s.size() << endl;  //0
s.push(0);
s.push(1);
cout << s.size() << endl;  //2
```

格納されている要素の個数を返す.

##top()関数

```C++:top.cpp
stack<int> s;
s.push(10);
s.push(20);
cout << s.top() << endl;  //20

s.top -= 5;
cout << s.top() << endl;  //15
```

トップ要素にアクセスする.


[サンプルコード](https://github.com/nocotan/CTraining/blob/master/stack.cpp)