OmniAICreator/Qiita-1.07M huggingface dataset:
Systemdを使ってさくっと自作コマンドをサービス化してみる

Systemdの仕組みをつかうと、自分で作ったコマンドを簡単にサービスとして登録することができます。

例として、hello worldを延々とファイルに書き込むコマンドをサービス化してみましょう。

# 1. コマンドを作る

/opt/hello.sh というスクリプトを用意します。


```
sudo nano /opt/hello.sh
```


```bash:/opt/hello.sh
#!/bin/bash
while true
do
   echo hello world >> /tmp/hello.log
   sleep 1
done
```

実行権限を与えます。

```
sudo chmod 0755 /opt/hello.sh
```


# 2. /etc/systemd/system/ の下にUnit定義ファイルを作る

```
sudo nano /etc/systemd/system/hello.service
```

中身はこんなんです。

```/etc/systemd/system/hello.service
[Unit]
Description = hello daemon

[Service]
ExecStart = /opt/hello.sh
Restart = always
Type = simple

[Install]
WantedBy = multi-user.target
```


ExecStartに実行したいコマンドを書きます。
Restart = always はプロセスやサーバが不意に落ちた時に自動再起動するモードです。

Unitファイルの詳しい書き方については下記記事を参考にしてください。
[Systemd入門(1) - Unitの概念を理解する - めもめも](http://enakai00.hatenablog.com/entry/20130914/1379146157)
[Systemd入門(4) - serviceタイプUnitの設定ファイル - めもめも](http://enakai00.hatenablog.com/entry/20130917/1379374797)


(Type = simpleはデフォルトでそうなってるので書く必要ないのですが、書いたほうがわかりやすい
ので明示的に書く方がよいでしょう)

# 3. UnitがServiceとして認識されたか確認する

`systemctl list-unit-files --type=service`の出力に現れればOKです。

```
$ sudo systemctl list-unit-files --type=service | grep hello
hello.service                              disabled
```

OK!

# 4. enableしてstartする

ここまでくれば、後はいつものように普通のサービスとして扱えます。

```
# 自動起動on
$ sudo systemctl enable hello
# 起動
$ sudo systemctl start hello
```

ステータス確認

```
$ sudo systemctl status hello

hello.service - hello daemon
   Loaded: loaded (/etc/systemd/system/hello.service; enabled)
   Active: active (running) since 金 2015-06-19 09:02:19 UTC; 2min 54s ago
 Main PID: 551 (hello.sh)
   CGroup: /system.slice/hello.service
           ├─ 551 /bin/bash /opt/hello.sh
           └─2062 sleep 1

 6月 19 09:02:19 localhost.localdomain systemd[1]: Started hello daemon.
```

ファイルへの書き込みが行われているか確認

```
[vagrant@localhost ~]$ tailf /tmp/hello.log
hello world
hello world
hello world
hello world
hello world
```

動いてました！

# 5. マシンを再起動して、サービスがちゃんと自動起動するか確認

```
$ sudo reboot
```

再起動後、マシン内でちゃんとhelloサービスが稼働していればOKです。

# supervisordの代わりにsystemdで代用できそう

従来はコマンドのサービス化をするツールとしてはsupervisordやdaemontoolsなどが代表的でしたが、今後はSystemdだけでいけるかもしれません。


> アプリケーションサービスなどもsystemd管理下へ
> init だとクラッシュした時の再起動がないので、よくアプリケーションサービスなどを supervisord や daemontools を使って別に起動させていた方も多いと思いますが、基本的には systemd がこれらも含めてすべて見るようにするのが理想的ということです。cgroupを使ってプロセスツリー全体のリソースも管理でき、ログ管理機能もあるのでsystemd管理下に置くほうがシステム全体として整合性も取れるような印象です。
> また従来はdaemonizeすることが多かったところsystemdではdaemontoolsのようにforegroundで実行するのが基本的なスタイルになるようです。Typeを変えればforkするデーモンにも対応可能です。

http://blog.yuryu.jp/2013/11/fedora-systemd.html


ぐぐってもあまり事例が出てこなかったのですが、すでに本番でsystemdによるサービス化をやってるよ、などがあればコメントで教えていただけると幸いです。
Rails ＋ AWS SDK for Ruby V2でSESが使いたい

aws-sdk v1の時は、[AWS::Rails](http://docs.aws.amazon.com/AWSRubySDK/latest/AWS/Rails.html)というモジュールがあって、ActionMailerでSESを使ってメールを送信することが簡単に出来ました。

しかし、aws-sdk v2にはこのモジュールがいません。
v2でSES使うときはAWS::SimpleEmailServiceをゴリゴリ書かなければならないのかと思っていたら、別のgemとして用意されていました。

https://ruby.awsblog.com/post/Tx18J68KPIUWMOX/Announcing-the-aws-sdk-rails-Gem

このgemを入れると、今までと同じようにActionMailerでの送信にSESを使うことが出来ます！

delivery_methodの指定が変わりました

```
config.action_mailer.delivery_method = :amazon_ses
↓
config.action_mailer.delivery_method = :aws_sdk
```

add_action_mailer_delivery_methodでの指定も同様に変わってます

```
AWS::Rails.add_action_mailer_delivery_method(:amazon_ses, { region: "us-east-1" })
↓
Aws::Rails.add_action_mailer_delivery_method(:aws_sdk, { region: "us-east-1" })
```
Qiita に書いた Rust の記事のコードブロックを rustdoc でテストする

**TL;DR:** これを実行する： `rustdoc --test <(curl -s ${記事URL}.md | sed 's|^|//! |')`

----

`rustdoc` は Markdown のコードブロック内の Rust コード片をテストできる。また Qiita の記事の Markdown は URL の末尾に `.md` を付けると取得できる。

とすると、 Qiita の記事中の Rust コード片を `rustdoc` でテストすることもできる。試してみよう。

```rust:test0
use std::char;
let a = char::from_u32(0x61);
assert_eq!(a, Some('a'));
```

```rust:test1
fn none() -> Option<()> { None }
assert_eq!(none(), None);
```

上にいくつか Rust のコードブロックを書いてみた。この記事中のコードをテストするには次のコマンドを実行する：

```bash
rustdoc --test <(curl -s https://qiita.com/uasi/items/bbfeaa4269a9de44e81e.md | sed 's|^|//! |')
```

すると以下の出力が得られる：

```text
running 2 tests
test _1 ... ok
test _0 ... ok

test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured
```

テストが通った :v:　どんどんテストして誤りのない記事を書こう。

## テストに対応した Markdown の書き方について

基本的には ```` ```rust ```` 〜 ```` ``` ```` でコードを囲むだけでいい。 Rust 以外の言語のコードブロックも含めるなら言語名を明示する。またコードブロックの前後には最低1行の空行が必要：

![テストに対応した Markdown の書き方について](https://qiita-image-store.s3.amazonaws.com/0/735/dc340562-dcc4-3636-60d1-b9c980509fd7.png)

↑サンプルの Markdown を直に書きたかったのだが問題があって画像で貼った。 ```` ``` ```` を文中に含む整形済みテキストを書くと `rustdoc` が誤認識するようだ。

.md つき URL が返す Markdown は先頭に記事タイトル行が追加されることに注意。もし本文の1行目からコードブロックを書くとタイトルとくっついてしまい、そのコードブロックは実行されなくなる。

## コマンドの解説

テストを実行するコマンドを解説する。

```bash
rustdoc --test <(curl -s https://qiita.com/uasi/items/bbfeaa4269a9de44e81e.md | sed 's|^|//! |')
```

`rustdoc --test` は引数にファイルパスを受け取り、拡張子からファイル形式を判断してテストを実行する。 rustdoc v1.0.0 では標準入力からファイルを読むことはできない：

```bash
cat foo.md | rustdoc --test -  # これはだめ
```

そこでプロセス置換記法 `<(command...)` を使う。コマンドの標準出力結果をファイル（のようなもの）として扱うことができる。

`curl -s https://...md` で Qiita の記事 の Markdown ソースを標準出力に流す。 `-s` オプションは `curl` のプログレスメータを非表示にするため。

`rustdoc` はファイルの拡張子からファイル形式を判断すると書いたが、プロセス置換でファイルを流し込むと拡張子は分からない。このとき `rustdoc` は入力が Rust のソースだと判断する。つまり直接 Markdown ソースを流し込むことはできない。

そこで Markdown ソースを `sed 's|^|//! |'` で処理し、ソースの各行に Rust のドキュメントコメントマーカー `//! ` を追加する。こうするとソースは Rust のコードとして正しいものになる。

まとめると、 `<(curl ... | sed ...)` で記事の Markdown ソースを取得し、 Rust ソースになるよう整形してファイルっぽく扱うということ。これを `rustdoc --test` の引数に渡すことでテストを実行できる。
Kernel#at_exit

`Kernel#at_exit()`を知ったのでメモ。

sensu-pluginでプラグインを書くと以下のような実行ファイルを作ることになる。

```ruby:my_check.rb

#!/usr/bin/env ruby
require 'sensu-plugin/check/cli'

class MyCheck < Sensu::Plugin::Check::CLI

  check_name 'my_awesome_check' # defaults to class name
  option :foo, :short => '-f' # Mixlib::CLI is included

  def run
    ok "All is well"
  end

end
```

こうやって実行する

```bash
$ ruby ./my_check.rb
All is well
```

さてここで感じる違和感。my_check.rbではMyCheckクラスを定義しただけで`#run`メソッド呼び出す記述してないのに実行されてる、なんで!? 

答え: `Kernel#at_exit()`。プログラムexit時に実行されるcallbackを登録できる。このcallback内でMyCheck.new.runしてました。 https://github.com/sensu-plugins/sensu-plugin/blob/master/lib/sensu-plugin/cli.rb#L53-L68
ACCESSにADO.NETでアクセスする場合のトランザクション制御 #6

#トランザクション制御に関する分かり難いエラーメッセージ

トランザクション制御を行なうプログラムを実行した際、次のようなエラーメッセージが出力されることがある。

>ExecuteNonQuery は、コマンドに割り当てられた接続が保留状態であるローカルのトランザクションにあるとき、トランザクション オブジェクトを持つコマンドが必要です。コマンドの Transaction プロパティがまだ初期化されていません。

(ExecuteNonQueryの部分が、ExecuteReaderとなっているメッセージもある。)

日本語の意味がよく分からない。
このエラーメッセージは、接続型でも非接続型でも出力される。接続型の場合は、プログラム中にExecuteNonQuery()メソッドを直接記述しているのでまだいいが、非接続型ではプログラム中にExecuteNonQuery()の記述がないので混乱してしまう。

メッセージ中の**コマンド**とはOleDbCommandのことで、**接続**とはOleDbConnectionのことである。

メッセージ中の**“コマンドに割り当てられた接続”**とは、次の接続型のプログラムの最後の行を見ると分かるが、OleDbCommandのConnectionプロパティに設定されたOleDbConnectionオブジェクトのことである。

```C#:コマンドのConnectionプロパティに接続が割り当てられている
OleDbConnection CONN = new OleDbConnection();
//　省　略
OleDbCommand CMD = new OleDbCommand();
CMD.Connection = CONN;    // <=== コマンドに割り当てられた接続
```
メッセージ中の**“保留状態”**とは、BeginTransaction()でトランザクションを開始したが、まだcommitもrollbackもされていない状態を指しているものと思われる。

***エラーメッセージの意訳***
コマンド（OleDbCommand）に割り当てられた接続（OleDbConnection）でトランザクション制御が行われているとき、コマンド(OleDbCommand)オブジェクトはTransactionオブジェクトを持たなければいけないので、Transactionプロパティに設定して下さい。


以下は、接続型と、非接続型のTransactionプロパティへのTransactionオブジェクトの設定の例。

```C#:接続型と、非接続型のコマンドへのTransactionオブジェクトの設定
OleDbTransaction TRN = CONN.BeginTransaction(IsolationLevel.ReadCommitted);

CMD.Transaction = TRN;    // 接続型の為の記述
DA.InsertCommand.Transaction = TRN;    // 非接続型の為の記述
DA.UpdateCommand.Transaction = TRN;    // 非接続型の為の記述
DA.DeleteCommand.Transaction = TRN;    // 非接続型の為の記述
```


・[ACCESSにADO.NETでアクセスする場合のトランザクション制御 #1](http://qiita.com/kakunodatenow/items/a882b9a5281175399c64)
・[非接続型のトランザクション制御](http://qiita.com/kakunodatenow/items/05648f618c2e4e201066)
・[接続型のトランザクション制御](http://qiita.com/kakunodatenow/items/bd958484c3bf692df80f)
・[複数のDataTableの変更を同時にDBに反映する際のトランザクション制御](http://qiita.com/kakunodatenow/items/2a44ac5492a77a59b758)
・[接続型、非接続型が混在した更新のトランザクション制御](http://qiita.com/kakunodatenow/items/79da9eeeadb7ad83c066)
・トランザクション制御に関する分かり難いエラーメッセージ
[Swift] クロージャを利用したコールバックの書き方メモ


> 手元の Swift のバージョン：`1.1`

例えば次のような適当な関数 `hogeMethod()` を定義する。第３引数は関数オブジェクト。

```swift:
// 第３引数でコールバックとして実行したい関数オブジェクトを受け取る
func hogeMethod(name: String, age: Int, callback: (String) -> Void) -> Void {

  // とりあえず例として第１引数(名前)と第２引数(年齢)からメッセージ文字列を作成
  let message = "\(name)さん\(age)歳ですね"

  // 処理が終わったら第３引数で受け取った関数を実行。今回はメッセージを渡す
  callback(message)  
}
```

この関数の呼び出しは次のような感じ。

```swift:
// 第３引数でコールバックが返されたら実行したい処理を書く
hogeMethod("山田", 34, { message in
  println(message) // => 山田さん34歳ですね      
})
```

もしくは次のように書いてもいい。（最後の引数が関数である場合の略記）

```swift:
hogeMethod("山田", 34) { message in
  println(message) // => 山田さん34歳ですね      
}
```

### この書き方の何が嬉しいか？

上記の `hogeMethod()` だと即座に結果が返されてしまうが、時間がかかる処理や非同期で実行したい処理を書きたい場合。
oozieのcoordinatorでworkflowのプロパティに日付を動的に渡す方法

本日の日付の場合はプロパティの値に以下をセット
`${coord:formatTime(coord:actualTime(), 'yyyy-MM-dd')}`

日付をずらしたい場合は以下のように(1日前の日付の例)
`${coord:formatTime(coord:dateOffset(coord:actualTime(), -1, 'DAY'), 'yyyy-MM-dd')}`

actualTimeはUTCの時間取ることに注意

時間を取る関数はactualTimeのほかにnominalTime()もある。
acutualTimeはいかなる時も実行する時間(UTC)が取れるが、nominalTime()にしておくと、実行が失敗した際に、後日再実行すると実行が失敗した時間が取得出来る。
20150619 rails tutorial

## お役立ち

https://www.ruby-toolbox.com/
https://www.ruby-toolbox.com/categories/pagination

## sublime 役に立ちそう

alternative completion
japanize
rails tutorial
trailing spaces
sass
ruby test


## follower

http://railstutorial.jp/chapters/following-users?version=4.0#top

Relationship

## microposts

http://railstutorial.jp/chapters/user-microposts?version=4.0#top

count,size,length で動作に違いがある。

time_ago_in_words なんてmethodあるんだ
http://qiita.com/bellx2/items/30906a7832ef4ff4c886
Twitter風の〜分前を実装する
便利だ。

SQL where 使用の際に適切にエスケープされる書き方をすること。


### Pagination

will_paginate
kaminari
どちらか

### Update user
http://railstutorial.jp/chapters/updating-showing-and-deleting-users?version=4.0#top

friendly forwarding
http://railstutorial.jp/chapters/updating-showing-and-deleting-users?version=4.0#sec-friendly_forwarding

index

サンプルのユーザー faker
http://railstutorial.jp/chapters/updating-showing-and-deleting-users?version=4.0#sec-sample_users
【随時更新】SQL Server,Transact-SQLの初心者メモ

## はじめに
今携わっているプロジェクトではRDBMSはSQL ServerでTransact-SQLを使いストアドプロシージャを作成しています。ストアドを作っていく中で、「あれ、これってどういう風に書いたらいいんだろう？」とか「デバッグの仕方わかんねー！」などあり、調べてわかったことがチョコチョコ出てきたので、ここにまとめようと思います。

あと、SQL Server, SQL Server Management Studioを触って気づいたこともメモっていこうと思います

## ストアドプロシージャ
### 基本構文系
#### カーソル使ってループをまわす
```sql
DECLARE <cursor name> CURSOR FOR
SELECT
    hoge
FROM
    HOGE_TABLE

OPEN <cursor name>
FETCH NEXT FROM <cursor name> into @hoge

WHILE @@FETCH_STATUS = 0
BEGIN
    ・・・ ↓がBEGIN～ENDの最終行
    FETCH NEXT FROM <cursor name> into @hoge
END

```
上記だと、HOGE_TABLEに入っているhogeを順番に取得して@hogeの中に詰め込むことができます。

ただ、下のような書き方だと上手くループしませんでした。(取得できる行数が1行としたときに、何故かループが2回まわる)　原因分かる方がいたら教えてください:scream_cat:

```sql
DECLARE <cursor name> CURSOR FOR
SELECT
    hoge
FROM
    HOGE_TABLE

OPEN <cursor name>


WHILE @@FETCH_STATUS = 0
BEGIN
    FETCH NEXT FROM <cursor name> into @hoge
    ・・・ ↑がBEGIN～ENDの最初の行
END

```

### デバッグ系
#### ストアド内で使っている一時テーブルの中身を見る
そういう時は、tempdbに突っ込んでおくと良さ気
見終わったら削除を忘れずに・・・

```sql:
SELECT * INTO tempdb.dbo.temp_table FROM #temp_talbe;
```

ちなみに、Management Studioを使っているなら普通にSELECT文を書けばコンソールに吐き出してくれます。なので、下記のようにするとエラーも見れます。
#### TRY・・・CATCH構文でキャッチしたエラーを見る

```sql:
・・・
BEGIN TRY
・・・
END TRY

BEGIN CATCH
  SELECT
    ERROR_NUMBER() AS ErrorNumber
    ,ERROR_SEVERITY() AS ErrorSeverity
    ,ERROR_STATE() AS ErrorState
    ,ERROR_PROCEDURE() AS ErrorProcedure
    ,ERROR_LINE() AS ErrorLine
    ,ERROR_MESSAGE() AS ErrorMessage;
END CATCH
```
cake2でデータを更新する方法


```

// 更新する内容を設定
$data = array('Hoge' => array('id' => 1, 'status' => 2));
 
// 更新する項目（フィールド指定）
$fields = array('status');
 
// 更新
$this->Hoge->save($data, false, $fields);

```
ドコモのOAuth SDK for iOSをSwiftで試してみた。その１

docomo Developper Supportから「OAuth SDK for iOS」というSDKが提供されています。
提供されているサンプルがObjective-Cなので勉強を兼ねてSwiftで書き直してみました。

docomo Developper Support
https://dev.smt.docomo.ne.jp/?p=index

今回試したのは「OAuth認証に必要なパラメータの設定」して「OAuth 認証を開始」するだけの単純なものです。

認証に必要なパラメータは下記の４つです。
１、クライアント ID
２、secret
３、scope
４、redirectUri

これを設定して認証を開始すると
成功した場合は、
・アクセストークン
・リフレッシュトークン
・トークンの有効期限
・トークンタイプ
・スコープ

失敗した場合は、
・エラーコード
・エラーメッセージ
・例外オブジェクト

が返ってきます。

```swift:ViewController.swift
import UIKit

class ViewController: UIViewController {
    
    let clientID = ""       //クライアント ID を設定
    let secret = ""         //クライアントシークレットを設定
    let scope = ""          //スコープを設定
    let redirectUri = ""    //リダイレクト URI を設定
    var oAuth: OAuth!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        oAuth = OAuth()
        //OAuth 認証に必要なパラメータの設定
        oAuth.setClientID(clientID)
        oAuth.setSecret(secret)
        oAuth.setScope(scope)
        oAuth.setRedirectUri(redirectUri)
    }
    
    @IBAction func oauthButton(sender: AnyObject) {
        
        //OAuth 認証を開始
        oAuth.startAuth(self, onComplete: { (token) -> Void in
            //アクセストークンの取得
            let access_token = token.accessToken
            //リフレッシュトークンの取得
            let refreshtoken = token.refreshToken
            //トークンの有効期限の取得
            let expires_in = token.expiresIn
            //トークンタイプの取得
            let token_type = token.tokenType
            //スコープの取得
            let scope = token.scope
            
            //取得情報出力
            println("認証成功！")
            println("access_token: \(access_token)")
            println("refreshtoken: \(refreshtoken)")
            println("expires_in: \(expires_in)")
            println("token_type: \(token_type)")
            println("scope: \(scope)")
            
            }) { (error) -> Void in
                //エラーコードの取得
                let error_code = error.code
                //エラーメッセージの取得
                let rror_message = error.localizedDescription
                //例外オブジェクトの取得
                let cause = error.cause
                
                //取得情報出力
                println("認証失敗!")
                println("error_code: \(error_code)")
                println("rror_message: \(rror_message)")
                println("cause: \(cause)")
        }
    }
}
```

docomo Developper Supportには、雑談対話やトレンド記事抽出など面白そうなAPIが幾つかあるので試してみようと思います。
ひとまずそれぞれのサンプルをSwiftで書き直してみることから始めようかと思っています。

文章やコードに読み難い箇所、間違っている箇所などあればご指摘いただけるとありがたいです。
Using transaction with saveMany() method in CakePHP

1. Introduction
2. Basic using Transaction
3. The problem with method saveMany()
4. Solution
5. References

# 1.Introduction

This is my first Tutorial, I would like to talk about using transaction with saveMany() method of Model Object in CakePHP.

# 2.Basic using Transaction 

With CakePHP, using transaction is easy with following simple lines:

``` php:Item
// Getting DataSouce
$dataSource = $this->getDataSource();

// Starting transaction
$dataSource->begin();

// do something and save data to talbe
......................
```

To commit transaction on success

```
dataSource->commit();
```

Or rollback transaction on failure

```
$dataSource->rollback();
```

It works well when is used with methods: save, saveAll.

# 3.The problem with method saveMany()

But may be you will spend much time to debug and find problem because transaction seem doesn't work with saveMany() method of Model Object


I was surprised and spent too much time to understand why transaction didn't work with following code block. Although I started transaction, but data is always written to database whether $successFlag  is true or false.


``` php:Item
// Getting DataSouce
$dataSource = $this->getDataSource();

// Starting transaction
$dataSource->begin();

// Perform some tasks
$items = array();

foreach ($postedData as $row) {
$items[] = array(
                    'name'     => $row['name'],
                    'quantity' => $row['quantity'],
                    // something else ...
                );
} // End foreach


$this->create();
$this->saveMany($items);

$successFlag = doSomething();

if ($successFlag) {
dataSource->commit();
} else {
$dataSource->rollback();
}
```
# 4.Solution

To resolve problem, we must change this line
```
$this->saveMany($items);
```
↓ 
```
$this->saveMany($items, array('atomic' => false));
```

# 5.References
To get more detail : http://book.cakephp.org/2.0/en/models/saving-your-data.html#model-savemany-array-data-null-array-options-array


Thank you for reading and happy coding day.
【初心者向け】エイリアスの設定方法


##エイリアスとは？
> エイリアス 【 alias 】
> 偽名、別名、通称などの意味を持つ英単語。 ITの分野では、ファイルなどの実体を **別の名前で参照するためのシンボル** といった意味で使われることが多い。

つまり、`bundle exec`と書かなければいけないものを、
`be`で済ませることができたら便利！
ってことですね。

**今回はこのエイリアスの設定方法を書いていきます。**


##エイリアスの設定の前に
ターミナルアプリを **iTerm** にすると幸せになれます。

iTermはホットキーが設定でき、`Ctrl + F`とか`Ctrl + W`とか素敵なキーバインドでターミナルを開けるようになるのでぜひとも導入しましょう。

iTermは **<a href="https://www.iterm2.com/" target="_blank">こちら</a>** のサイトからダウンロードできます。

（以下「ターミナル」はiTermを指します）

##エイリアス設定の流れ
###１．`.bashrc`にエイリアスを記述する

エイリアスは`.bashrc`というファイルに記述します。

ターミナルから`vi ~/.bashrc`と打って、`.bashrc`のファイルをvimで開きましょう。

vimで書き込みを行うときは、`i`を押します。
すると、一番下の行に`-- INSERT --`と出て、入力モードになります。

ここに以下の文法でエイリアスを記述します。

```bash
alias be='bundle exec' 
```

試しにこのエイリアスを設定してみましょう。
（ ※ =の左右にスペースを空けると後でエラーが起きます）

書き込みが済んだら、`esc`を押して入力モードを解除します。

この状態で、`:wq`と打つと保存してvimを終了してくれます。
（保存しないで終了したい場合は`:q`）

###２．`.bash_profile`で`.bashrc`を読み込む設定をする

エイリアスは`.bashrc`に書いただけでは設定が反映されません。

なので設定を反映させるために、`.bash_profile`に`.bashrc`を読んでもらう必要があります。

`.bash_profile`は **ターミナルが起動すると読み込まれる** ものなので、そのタイミングで`.bashrc`も読んでもらうというわけですね。

ターミナルから`vi ~/.bash_profile`と打って、`.bash_profile`をvimで開き、ファイルの一番下に以下のコマンドを記述しましょう。

```ruby
source ~/.bashrc
```

この変更自体も反映させなければいけないので、ターミナルから`source ~/.bash_profile`を実行しましょう。

（ターミナルの再起動でも`.bash_profile`が読み直されるのでそれでも大丈夫ですね）

**これでエイリアスの設定は完了です。**

##おすすめエイリアスの紹介
以下は自分が設定しているエイリアスです。
気になるものがあれば上で紹介した手順で実際に設定してみましょう！

```bash
# Linux Command
alias mk='touch'

# Open
alias os='open -a sublime\ text'
alias oc='open -a google\ chrome'
alias ox='open -a xcode'

# Rails Command
alias rs='rails s'
alias rs4='rails s -p 4000'
alias rc='rails c'
alias cre='rake db:create'
alias mig='rake db:migrate'
alias rol='rake db:rollback'
alias seed='rake db:seed'
alias drop='rake db:drop'
alias rr='rake routes'
alias be='bundle exec'
alias bi='bundle install'

# Shortcut
alias bp='open -a sublime\ text ~/.bash_profile'
alias br='open -a sublime\ text ~/.bashrc'
alias sbp='source ~/.bash_profile'
alias objc2swift='java -jar ~/ios-projects/libraries/objc2swift/build/libs/objc2swift-1.0.jar'

# Change Directory
alias de='cd ~/Desktop'

# Git
alias makepr='git commit --allow-empty -m "Make PR"'
```

他にもいいものがあったら是非教えてください。
Apacheの設定ファイル httpd.confの場所

Apacheの場所の確認方法。

1つのサーバの中に2つのApacheがインストールしてあるサーバがあったので（パッケージとソース）
稼働しているApacheの確認方法をメモ。

##httpd.confの場所

基本的には下記のディレクトリにある可能性がたかい。

| OSとインストール方法|ディレクトリ| 
|:-----------|:------------|
| CentOS,RHEL,Fedoraなど(パッケージ)|/etc/httpd/conf/|
| SUSE,Debian,MacOSなど(パッケージ)|/etc/apache2/|
| ソースインストール|/usr/local/apache2/conf/|


##どのhttpdが動いているか

$ ps aux | grep httpd
でプロセスを確認。

```
$ ps aux | grep httpd
root      3753  0.0  0.0 360324  8800 ?        Ss   14:34   0:01 /usr/local/apache2/bin/httpd
daemon   24098  1.2  0.1 367424 59964 ?        S    15:42   0:05 /usr/local/apache2/bin/httpd
daemon   25171  1.4  0.1 364604 48812 ?        S    15:45   0:03 /usr/local/apache2/bin/httpd
daemon   25638  0.6  0.0 366780 26112 ?        S    15:48   0:00 /usr/local/apache2/bin/httpd
daemon   25639  0.6  0.0 364752 30212 ?        S    15:48   0:00 /usr/local/apache2/bin/httpd
daemon   25640  0.3  0.0 362960 25860 ?        S    15:48   0:00 /usr/local/apache2/bin/httpd
```

/usr/local/apache2/以下が読み込まれているため、ソースインストールしたApacheが稼働していると判断。

$ httpd -V

なんかをしておくと各ディレクトリがわかってさらにいい感じ。
Vagrant - PHP開発環境

動く構成をメモ
## OS

Windows 8.1

## VirtualBox

Ver 4.3.28

## Vagrant

Ver 1.7.2

## Box

CentOS 6.6 x64 (Minimal, VirtualBox Guest Additions, Puppet 3.7.5 - see here for more infos)
https://github.com/tommy-muehle/puppet-vagrant-boxes/releases/download/1.0.0/centos-6.6-x86_64.box

## ミドル

* PHP 5.3
* Apache 2.2
* MySQL 5.5
CentOSにNode.jsをインストールする

探してもなかなかスマートな方法が見つからなかったのですが、yumだけでインストールできました。

とは言え標準のリポジトリには登録されていませんので、EPELリポジトリを追加します。

```
$ sudo yum install epel-release
```

Node.js/npmをインストールします。

```
$ sudo yum install nodejs npm
```

2015/06/19のインストール結果は以下のように、v.0.10.36がインストールされました。

```
$ node -v
v0.10.36
```
[Swift] iOS で画像の色を動的に変える


# 画像の色を動的に変えたい

ボタンなどの画像の色を、選択中/非選択中や有効/無効などで色を変えたいこと多いですよね。
状態に合わせた色を毎回用意するのって大変です、変更したいときとか特に。

# UIImageRenderingMode.AlwaysTemplate を使う

UIImage で指定できる UIImageRenderingMode.AlwaysTemplate は画像のα値だけで描画してくれます。
色は TintColor に従うので、 TintColor を変更することで色を変えることができます。

```swift
# UIImageView の場合
let imageView = UIImageView(image: UIImage(named: "HeaderLogo")?.imageWithRenderingMode(.AlwaysTemplate))
imageView.tintColor = UIColor.greenColor()

# UIButton の場合
let button = UIButton(frame: CGRectMake(0, 0, 100, 30))
let backImage = UIImage(named: "BackButton")?.imageWithRenderingMode(UIImageRenderingMode.AlwaysTemplate)
button.setImage(backImage, forState: UIControlState.Normal)
button.tintColor = UIColor.greenColor()
```

これを使えば画像を何種類も用意しなくて済むので便利です。
SublimeText3 にインストールしている・したことがあるパッケージ一覧

[利用しているのは？]
macでruby on railsでの開発を行ってます。
node.jsにも手を出そうかなと考えています。
**********************************************

###"All Autocomplete"
コード補完の強化。自分で定義した定数や関数も自動的に補完する。

###"BracketHighlighter"
括弧類をハイライトする。

###"Browser Refresh"

保存と同時にブラウザをリフレッシュ出来る。
[設定方法]
ctrl+sで保存とリフレッシュさせる。
preferences->package settings->Browser Reflesh->key bindings-userに以下を記載
(keysが他のショートカットと重複すると動かない)

```
[
  {
    "keys": ["ctrl+s"], "command": "browser_refresh", "args": {
      "auto_save": true,
      "delay": 1.5,
      "activate": false,
      "browsers" : ["chrome"]
    }
  },
]
```

###"Codecs33"
Shift-JISファイルに対応。

###"ConvertToUTF8"
Shift-JISが文字化けしないようにする。

###"Japanize"
[関連記事：日本語化](http://qiita.com/tak74/items/baa17a423c9969815c9f)

###"Package Control"
パッケージコントローラー。

###"RubyTest"
[関連記事：Rspecのテストがsublime上で出来る](http://qiita.com/tak74/items/5416943ab632a0deaa1c)

###"Smart Delete"
行末の改行を消すと、一緒に次の行の先頭の空白も削除してくれる。

###"TrailingSpaces"
半角空白・全角空白をハイライト。
[設定方法]
preferences->package settings->TrailingSpaces->settings-userに以下を記載

```
{
  "trailing_spaces_regexp": "　|[ \t]+" // 全角スペースを正規表現に追加
}
```

###"Mac Terminal"
control+command+tでitermが起動。
理想はsublimeと同じウィンドウ内で動作してくれるといいんだけど…
とは言え、一々アプリケーションを探す必要がなくなるので便利。

###マークダウン系
* OmniMarkup Previewer（リアルタイムプレビュー）
* Monokai Extended（シンタックスハイライト）
* Markdown Extended（挿入したコードのシンタックスハイライト）
* [関連記事：Sublime Text でマークダウン編集環境を作成する](http://qiita.com/tak74/items/a75d8901e50cb444723b)
C# メソッドの呼び出し元メソッド名を取得するおまじない


こねたです。

以下のようにするとログ出力のときに、呼び出し元メソッド名まで出力できます。
(と書いたけど、改めて[stackoverflow](http://stackoverflow.com/questions/3095696/how-do-i-get-the-calling-method-name-and-type-using-reflection)を見たら、.Net4.5からもっと簡単に取得できるみたいです。[CallerMemberNameAttribute Class](https://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.callermembernameattribute(v=vs.110).aspx))

※　リリースビルドでこれを利用するためには、PDBファイルを生成しておく必要があります。

```csharp

[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
private void log(LogLevel logLevel, String message, params Object[] objs)
{
    if (!isOutput(logLevel))
    {
        return;
    }
    const int callerFrameIndex = 2; // 2つ前の呼び出し元メソッド名.
    System.Diagnostics.StackFrame callerFrame = new System.Diagnostics.StackFrame(callerFrameIndex);
    System.Reflection.MethodBase callerMethod = callerFrame.GetMethod();
    this.writeLog(DateTime.Now, logLevel, callerMethod.Name, message, objs);
}

public void info(String message, params Object[] objs)
{
  log(LogLevel.Info, message, objs);
}

```



swiftで呼び出し元メソッド名を取得したいけど、StackFrameのようなものが取得できるのだろうか? => println(\__FUNCTION\__)

# 補足

コメントでリリースビルドでは例外が発生して動作しないと指摘を受けたので、ちょっと調べてみました。

[MSDNのSystem.Diagnostics.StackFrame](https://msdn.microsoft.com/ja-jp/library/system.diagnostics.stackframe(v=vs.110).aspx)を確認すると、既定ではリリースビルドにはシンボル情報がないため、ファイル、メソッド名、行番号が取得できないようです。

現在C#の環境が手元にないので確認できませんが、stackoverflowを確認すると、リリースビルドでも[PDBファイル](https://msdn.microsoft.com/ja-jp/library/aa292304(v=vs.71).aspx)を生成すると、シンボル情報を利用できるようです。http://stackoverflow.com/questions/628565/display-lines-number-in-stack-trace-for-net-assembly-in-release-mode/628590#628590


※ 上記stackoverflowにもありますが、リリースビルドの場合は最適化を抑止しないと、正しいメソッド名、行番号が取れない場合があります。
※※ 動作未確認ですが、MSDNにPDBについての記載がない点から、[System.Runtime.CompilerServices.CallerMemberNameAttribute](https://msdn.microsoft.com/ja-jp/library/system.runtime.compilerservices.callermembernameattribute(v=vs.110).aspx)を利用した方が良いかもしれません。
Submit to App Store...後にXcode(Organizer)がクラッシュする


Xcode 6.3.2 で確認。
Archive後にSubmit to App Storeで送信しようとしたら、アップロード中にクラッシュしてアップロードが完了しない。
OSを再起動しても変わらなくて困った。

## 回避方法

オーガナイザー以外のプロジェクトウィンドウを全て閉じておく。
その状態でなら送信してもクラッシュしない事を確認。

参考：
[Xcode crashes on submitting Archive (stackoverflow)](http://stackoverflow.com/questions/30898566/xcode-crashes-on-submitting-archive)
Windowsサーバーのログをfluentdへ転送するプログラムを書きました

#はじめに
fluentd+elasticsearch+kibanaでログの可視化システムを作ってWindowsサーバーのログの可視化を進めてたんですが、次第にいろいろと不満(というよりは不安)やつらい部分が見えてきて色々悩んだ結果、Flooderというデータ転送プログラムのC#実装を作成しました。

#Flooder
このFlooderちゃんは、上記のログ可視化システムにおいてどんな役割を持っているかというと

![WvqvCB2LOiW6WPr1428779667_1428779676.jpg](https://qiita-image-store.s3.amazonaws.com/1251/51666/1d0ed96f-36f4-18c5-fdb0-cd1512192811.jpeg)

(絵が超手抜きですいません)

Windows上で吐かれる様々なログを拾い集めてfluentdサーバーへ転送するのが主な役割(※)で、以下のデータを転送することが可能です。
・テキストファイル全般(JsonでもOK)
・IISログ
・イベントログ
・パフォーマンスカウンタ

※他にもハイパー秘密機能を搭載してますが詳細はまた今度

#で何が嬉しいか
Windowサーバー上のあらゆるログがKibanaちゃんによってリアルタイムで可視化され、さらにKibanaちゃんはグラフやチャートの作成機能が超絶充実してますので、データを集計して統計を出したりするなどして、スーパー可視化環境を構築できます。

#使い方
GitHubにまとめました。
https://github.com/yyoda/Flooder
【RoR】Aというアプリから、BというアプリのAPIを利用する方法



# ○目次
1. 流れ
2. Aのモデルメソッド作成
3. BのAPI作成

# ○流れ
今回は、Bのb_userというテーブルのレコードを取ってくるAPIを作ります。

Aのモデルから、URLを叩くメソッドを作成。
ただ、URLを叩いても何も起きないので、
BのAPIのディレクトリに、あるURLを叩くとレスポンスを返すAPIを作る。


# ○Aのモデルメソッド作成


```A/app/models/b_user.rb

module BUser 
 def self.get_user_data(id)
   @id = id # わかりやすく
   url = "#{b_user_api_host}"/api/#{version}/b_users"

   params = {
     user_id = @id
   }
   
   request(:get, url, params)
 end
end

```

これで、

```
BUser.get_user_data(1)
```

ってやったら、jsonで 

```json
{ 
  "BUser" : [
    "id" : 1
    "name" : 太郎くん 
  ]
}
```

っていうふうに帰ってくるようにしましょう。



# ○BのAPI作成

Aのモデル作ってURL叩いてももちろん何も帰ってきません。
URLの受け取りてのBにAPIを作らないとダメです。



```B/app/api/b_users.rb
class API < Grape::API 
  prefix "api" 
  # localhost3000:/api
  
  version 'v1', :using => :path
  # localhost3000:/api/v1  
  
  respurce "b_users" do 
  # localhost:3000/api/v1/b_users
  
  desc 'get b_user data'    
   
  params do
    requires :id, type: Integer
  end
    
  get ':id' do 
  # localhost:3000/api/v1/b_users/:id  
     
    BUser.find(id)
  end
end
``` 


これで、

```
BUser.get_user_data(1)

>

{ 
  "BUser" : [
    "id" : 1
    "name" : 太郎くん 
  ]
}

```
と返ってきます。
CakePHP+.htaccess、スマホを/sp/以下に転送

- スマホを `/sp/` 以下に external redirect で転送、`/foo` なら `/sp/foo` な具合に
- 画像、CSSファイルや JSファイルはそのまま
- 「PC版を表示」みたいなのにも対応（Cookie は別途制御必要）

```
<IfModule mod_rewrite.c>
    RewriteEngine On

    RewriteCond %{REQUEST_URI} !^/sp/
    RewriteCond %{REQUEST_URI} !(index\.php|\.bmp|\.jpe?g|\.gif|\.png|\.js|\.css)$
    RewriteCond %{HTTP_USER_AGENT} (iPod|iPhone|iPad|Android|Windows\ Phone)
    RewriteCond %{HTTP_COOKIE} !mode=pc
    RewriteRule ^(.*)$ /sp/$1 [R,L]

    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php [QSA,L]
</IfModule>
```
エミュレーターが移動できない時の対応

# 今日の課題
エミュレーターを動作させたい

# 記録
エミュレーターを動作させたかったけど、その前にウィンドウが大きすぎて困ったのでその記録。

## 問題
エミュレーターのウィンドウが大きすぎて移動できない

## 解決
ctrl+Alt+→

画面全体が回転するのでびっくりしますが、何回かぐるっと回すと上のバーが出てきます。

#感想
やりたい事を行うのに何個も問題が出てきて何してるのか分からなくなってきます...

# 追記　2015/07/28
解決方法らしい解決方法がわかったので追記します。

1.「Alt + Tab」を数回押し、画面からはみ出たウィンドウを選択。
2.「Alt + space」を押し、メニューから「移動」を選択。もし「移動」ができなければ「元のサイズに戻す」を選択してから「移動」を選択。
3.キーボードの矢印キーでボタンが押せる状態まで移動したら、ENTERで移動完了。
コードレビューで指摘して頂いた点

【HTML】
苦手意識を捨てて綺麗なHTMLを書くようにする
→見通しの悪いHTMLは、JavaScriptで制御しずらい。cssも当てずらい。

【変数】
一度しか使わない変数がたくさんあると混乱するからなくす

【メソッド】
・名前
メソッドの処理に合わせた名前をつける
（例：登録の処理に、Setは微妙。InsertやRegistがよい。）
（例：何か値を返す処理に、Setは微妙。Getがよい。）
（例：モデルに値を詰める処理に、Getは微妙。Setがよい。）

汎用的な名前をつける
→メソッド内の処理が増えた時に、メソッド名を変更しなくてはいけないような名前は不適切。
＜例：入力フォームの値チェック＞
public bool IsValidEmailNickName()
→メールアドレスとニックネームの重複チェックをしている。
重複チェックの項目が増えた場合、このメソッド名だと増えた項目をメソッド名に付け足す必要がある。
↓
public bool IsValidRegistItem()
→チェック項目が増えてもメソッド名を変える必要がない
（IsValidが正しいかどうかわからないけど・・・）

【DBアクセス】
・Nullチェック
データベースから何か取得してきたら、値が取得出来たかどうかチェックする
if(model　!=　null)
{
　処理
}
・SingleOrDefault
1つのデータを取得してくるときに.Singleは使わない。
→データがない場合そこで落ちる。

・Parse
DBのモデルにParseする前に、TryParseできちんと変換できるかチェックしてから値を代入する

【例外処理】
・try-catch
try-catchで捕まえるのは、"予期せぬ例外"
処理の結果（想定の範囲内）は、例外を投げずに対策コードを記述する。
（例:DBにアクセス出来ないなど、予期せぬ例外は例外でいい）


【その他】
・enum
enumを効果的に使おう。
（例：エラータイプによってエラーページの文言が変わる場合、
エラータイプの種類だけenum にエラータイプを用意しておく）
1つずつエラーを格納するモデルを用意する必要はない
↓
public enum ErrorType
{
Regist,
Delete,
MailAdress,
NickName,
None,
}

・using
最後にusingの整理をしよう
右クリック「usingの整理」→「未使用のusingの削除」

・文字列
＋での文字連結は避ける
→StringBuilderを使おう
goでwindowsでRS232C

##　インストール
   go get github.com/ohisama/serial
##　画像
![serial.PNG](https://qiita-image-store.s3.amazonaws.com/0/18104/c7cf4c44-33e8-4668-38f9-b5267730beb4.png)


## サンプルコード

```
package main
import (
	"bufio"
	"fmt"
	"github.com/ohisama/serial"
	"os"
)
func main() {
	device := "COM5"
	baud := 9600
	fmt.Println("open", device, "at", baud)
	port, err := serial.Open(device, baud)
	if err != nil {
		fmt.Println("open failed:", err)
		return
	}
	defer port.Close()
	fmt.Println("ready")
	scanner := bufio.NewScanner(os.Stdin)
	buf := make([]byte, 100)
	for scanner.Scan() {
		n, err := port.Write([]byte(scanner.Text() + "\r"))
		if err != nil {
			fmt.Println("serial write error:", err)
		}
		fmt.Println("Sent -> ", n)
		n, err = port.Read(buf)
		if err != nil {
			fmt.Println("serial read error:", err)
			break
		}
		fmt.Println(n, "-> read ", string(buf[:n]))
	}
}

```
Heroku configまとめて設定。

HerokuにあるTestAppというアプリケーションにDB設定をする

~~~
heroku config:set DB_CONNECTION=pgsql DB_HOST=ec2-11-111-11-111.compute-1.amazonaws.com DB_DATABASE=3333333333333 DB_USERNAME=44444444444444 DB_PASSWORD=55555555555555555555555555 DB_PORT=5432 --app TestApp
~~~
[Aurelia] 未来志向JavaScriptフレームワーク Aurelia 入門 5 Custom Element


[[Aurelia] 未来志向JavaScriptフレームワーク Aurelia 入門 4 httpクライアントを使ってflickr APIを叩く](http://qiita.com/tsumekoara/items/94638588b4eb512026e8)の続きです。

Custom Elementを使っていきます。

# 概要

1. Aureliaがcustom elementをloadする為にrequire elementを使用。
2. 対応するview-modelとviewを作成。

# Custom Elementの使い方

これまでのapp.html

```html:old
<template>
  <nav class="navbar navbar-default navbar-fixed-top" role="navigation">
    <div class="navbar-header">
      <a class="navbar-brand" href="#">
        <i class="fa fa-home"></i>
        <span>${router.title}</span>
      </a>
    </div>

    <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
      <ul class="nav navbar-nav">
        <li repeat.for="row of router.navigation" class="${row.isActive ? 'active' : ''}">
          <a href.bind="row.href">${row.title}</a>
        </li>
      </ul>

      <ul class="nav navbar-nav navbar-right">
        <li class="loader" if.bind="router.isNavigating">
          <i class="fa fa-spinner fa-spin fa-2x"></i>
        </li>
      </ul>
    </div>
  </nav>

  <div class="page-host">
    <router-view></router-view>
  </div>
</template>
```

このnav-barを別ファイルに置きます。

```html:src/app.html
<template>
  <require from='./nav-bar'></require>

  <nav-bar router.bind="router"></nav-bar>

  <div class="page-host">
    <router-view></router-view>
  </div>
</template>
```

これで ./nav-barからnav-bar要素を呼び出します。
そして、view-model: nav-bar.js, view: nav-bar.htmlを作ります。

```js:src/nav-bar-.js
import {bindable} from 'aurelia-framework';

export class NavBar {
  @bindable router = null;
}
```

Custom Elementを作るために、ClassをExportします。
ElementがHTMLで使えるようになると、ClassのどのpropertyがElementのAttributeとして現れるかフレームワークに伝える必要があります。
そのためにbindable decoratorを利用します。bindableはinjectと同様、AureliaにClassの情報を伝える一つの方法です。

```html:src/nav-bar.html
<template>
  <nav class="navbar navbar-default navbar-fixed-top" role="navigation">
    <div class="navbar-header">
      <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
        <span class="sr-only">Toggle Navigation</span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
      </button>
      <a class="navbar-brand" href="#">
        <i class="fa fa-home"></i>
        <span>${router.title}</span>
      </a>
    </div>

    <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
      <ul class="nav navbar-nav">
        <li repeat.for="row of router.navigation" class="${row.isActive ? 'active' : ''}">
          <a href.bind="row.href">${row.title}</a>
        </li>
      </ul>

      <ul class="nav navbar-nav navbar-right">
        <li class="loader" if.bind="router.isNavigating">
          <i class="fa fa-spinner fa-spin fa-2x"></i>
        </li>
      </ul>
    </div>
  </nav>
</template>
```

# 補足

- この方法でviewにrequireされたものはローカル扱いになるため、名前のconflictの心配はあまりない。
- Internal Renderingの為に、App ClassのRouterインスタンスと、NavBar elementの対応するpropertyを通じさせます。
- Custom Elementの名前は、@customElement('name')を使って決めれます。
- Custom Elementがviewを持たない場合は、@noView()を追記するとよい
- Shadow Domを使いたい場合は、@useShadowDOM()を追記するとよい
rails_configで値をブランクで上書きしたい


# 問題

```settings.yml
key: 適当な文字列
```

```settings.local.yml
key: ''
```

と書いてやると

```
Settings[:key]
```

はブランクであって欲しい。

でも、実際には

`適当な文字列`

が出てしまった。

# 解決策

https://github.com/railsconfig/rails_config/issues/13

に書いてあった。

`deep_merge` を入れれば良いらしいので

```Gemfile
gem 'deep_merge'
gem 'rails_config'
```

としておく。

`rails_config`の前に`deep_merge`をいれなito


```
warning: already initialized constant DeepMerge::DEFAULT_FIELD_KNOCKOUT_PREFIX
```

と出たので注意。
Evernoteって何するもの？

# デジタルアーカイブ

色々なデータを集約してアーカイブするものと思えばいいでしょう。（個人的にはそういう捉え方で使っています）

「[超簡単にEvernoteを活用するたった3つのルール](http://qiita.com/crossnode/items/3015fd85f5b326841ba3)」という記事でも書きましたが、整理しなくていいからとにかく放り込んでおいて、見たいときに検索して探せばいいという使い方でもOKなのも良いところです。ローカルで作業したり開く必要があるもの以外はEvernoteに保存してデバイスから削除してしまってもいいのです。

# 扱う主なデータ

Evernoteで扱える主なデータは下記が挙げられます。

## 1. メモ

- メモや議事録、アイデアなど書き物類はさっとノート作って書いておきましょう。
- ノート内に表を書いたり（表計算はできません）、チェックリストや箇条書きなど各種書式を使うこともできます。
- ミーティングやタスク、出かける予定など日時が決まっているものは「リマインダー」として日時を設定して通知を出すこともできます。[Sunrise](https://calendar.sunrise.am/)というアプリはアカウントを連携させればリマインダーをカレンダー上に表示してくれるので便利です。
- プレミアムユーザーなら、ノートの更新履歴を遡れるので、原稿などを書いている場合には以前の状態に戻す機能が役立つかもしれません。

## 2. ブックマーク

- ブラウザの拡張機能やスマホのブラウザからクリップ（保存）することができます。
- URLだけでなく画面も保存できるので、あとでキーワードで検索できるしページに飛ばなくても見返すこともできます。

## 3. 名刺

- スキャン画像を保存したりモバイルアプリで直接撮影したりしておけば、あとで画像内テキストを検索して探せます。
- プレミアムユーザーなら、モバイルアプリで撮影して名刺と認識すると名前や連絡先などをテキストにしてくれて連絡先に保存することもできます。

## 4. 写真

- 写真データや、モバイルアプリで撮影した写真を保存しておけます。
- バックアップやアーカイブとして保存しておいてデバイスからは削除して容量を空けられます。

## 5. 書類画像

- スキャン画像を保存したりモバイルアプリで直接撮影したりしておけば、あとで画像内テキストを検索して探せます。
- モバイルアプリで撮影して四角い輪郭を認識すると歪みとコントラストを補正して見やすい状態にして保存してくれます。

## 6. その他データ

- 1つのノートに無料ユーザーは25MBまで〜プレミアムユーザーは200MBまでファイルを貼り付けることができます。
- プレミアムユーザーなら、ExcelやWordなどOffice系ファイルの中のテキストまで対象にして検索できます。

# その他特徴

## プランによってできることが違う

上記でも何回かプレミアムユーザーでないと使えない機能が出てきたように、無料のベーシックとプラス($24.99/年)とプレミアム($45/年)では使える機能や容量の上限に違いがあります。（※料金は執筆現在）

ベーシックは月間アップロード容量が60MBまでですが、プレミアムだと無制限になります。これはあくまで「アップロード容量」なので、ローカルではいくらでもノートを増やすことができます。

詳しくは公式ページの比較表をご覧ください。
[私にはどの Evernote 製品が向いていますか？](https://evernote.com/intl/jp/contact/support/kb/#!/article/23258452)

## 各種プラットフォームに同期できる

同じアカウントでログインすればWEB、Windows、Windows Phone、Android、Mac、iPad、iPhone、iPod touch、Apple Watchで同じデータにアクセスできます。

## WEB版のみでも使える

PC/Mac版だといちいちサーバーにアクセスしなくてもデータを見られる代わりに、ローカルに全ファイルが保存されて容量を使います。余裕のあるコンピューターなら問題ないですが、容量が少ない場合は困るかもしれません。（モバイルアプリはノートの一覧だけ保存していて表示するときにサーバーへアクセスするので、ノートが多くても容量を圧迫しません。）

その場合はWEB版だけで使うという選択肢もありです。しかし、WEB版ではできないこと（ノートブック内の全選択やプレミアムのプレゼンテーションモードなど）もありますので色々使ってみて判断してください。
Apache で FallbackResource や ErrorDocument ですべてのリクエストをフロントコントローラーに渡す

とある同僚から「Apache 2.4 に FallbackResource というディレクティブがあって mod_rewrite 要らなくなるっぽい」と聞いたので、ちょっと試してみました。

- [FallbackResource](http://httpd.apache.org/docs/current/en/mod/mod_dir.html#FallbackResource)

## mod_rewrite

とりあえず Silex でサンプルを作ります。なお、CentOS 7 です。

Apache と PHP をインストールして、


```sh
yum -y install httpd php
```

Composer をインストールして、

```sh
curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer
```

ドキュメントルートで Silex を入れて（普通はこんな位置に入れない方がいい）、

```sh
cd /var/www/html
composer require "silex/silex:*"
```

index.php を作ります。

```sh
vim index.php
```

次のような内容です。

```php:index.php
<?php
require __DIR__ . '/vendor/autoload.php';

$app = new Silex\Application();

$app->get('/', function() {
    return "this is index page\n";
});

$app->get('/aaa', function() {
    return "this is aaa page\n";
});

$app->get('/bbb', function() {
    return "this is bbb page\n";
});

$app->run();
```

.htaccess に rewrite を書いて、存在しないファイルへのリクエストを index.php に向けます。

```sh
cat <<EOS> .htaccess
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
EOS
```

デフォ設定だと .htaccess が効かなかったので Apache の設定をちょっと弄ります。

```sh
cat <<EOS> /etc/httpd/conf.d/zz.conf
<Directory /var/www/html>
    AllowOverride All
</Directory>
EOS
```

Apache を起動します。

```sh
systemctl start httpd.service
```

期待した通りの結果が返ってくるはずです。

```sh
curl http://localhost/
curl http://localhost/aaa
curl http://localhost/bbb
```

## FallbackResource

.htaccess に FallbackResource を書いてみます。

```sh
cat <<EOS> .htaccess
DirectoryIndex index.php
FallbackResource /index.php
EOS
```

期待した通りの結果が返ってくるはずです。

```sh
curl http://localhost/
curl http://localhost/aaa
curl http://localhost/bbb
```

DirectoryIndex も書いておかないと http://localhost/ のときに良くわからないことになりました。

```sh
cat <<EOS> .htaccess
FallbackResource /index.php
EOS
curl -i http://localhost/
```

```text:Output
HTTP/1.1 200 OK
Date: Fri, 19 Jun 2015 03:23:16 GMT
Server: Apache/2.4.6 (CentOS) PHP/5.4.16
X-Powered-By: PHP/5.4.16
Cache-Control: no-cache
Transfer-Encoding: chunked
Content-Type: text/html; charset=UTF-8

this is index page
curl: (18) transfer closed with outstanding read data remaining
```

原因は不明です。

## ErrorDocument

FallbackResource って要するに、リクエストされたファイルが存在しなかったときに指定されたパスに内部リダイレクトする、ってことだと思うんですが、ん？ よく考えたらそれって `ErrorDocument 404` でもおんなじじゃない？ と思ったので試してみました。

```sh
cat <<EOS> .htaccess
DirectoryIndex index.php
ErrorDocument 404 /index.php
EOS
```

期待した通りの結果が返ってきました。

```sh
curl http://localhost/
curl http://localhost/aaa
curl http://localhost/bbb
```

この方法だとレスポンスのステータスコードが 404 になってしまうので、PHP 側で明示的に `http_response_code(200);` などとしてやる必要があります（Silex は Symfony の Response がそれに相当することを勝手にやっている）。
Python Tips (自分メモ)

## 注意点
* あくまで自分用です。ご参考になれば幸いです。
* 自分で追加したくなったら随時たします。
* もっといい方法あるよ！という場合は、アドバイスいただきたいです。
* 各項目に書かれているバージョンは、自分が動作確認したPythonのバージョンです。それ以外は、動作するかわかりません。

## ディレクトリ配下のファイルを扱う
* 2.7.10

「/path/to」配下のファイルをすべて読む場合。

```code
import glob

for file in glob.glob('/path/to/*'):

  f = open(file, 'r')
  
  for line in f.readlines():
    print line
    
  f.close()
```

## 今週の月曜と日曜のdatetimeを得る
* 2.6.6

```code
import datetime

today = datetime.datetime.today()

this_monday = today - datetime.timedelta(today.weekday())
this_sunday = today + datetime.timedelta(6 - today.weekday())

print 'Today: ' + today.ctime()
print 'Monay: ' + this_monday.ctime()
print 'Sunday: ' + this_sunday.ctime()
```

Result

```run
Today: Fri Jun 19 13:20:59 2015
Monay: Mon Jun 15 13:20:59 2015
Sunday: Sun Jun 21 13:20:59 2015
```

## 数値型を文字列型に返還する場合に０埋めする

* 2.6.6

例えば、１桁の数字を４桁の文字列に変換し左を０で埋める

```code
num = 1

('0' * 4 + str(num))[-4:]
```

Result

```result
'0001'
```

## ２つのリストから辞書/ディクショナリを作成
* 2.6.6


```code
>>> a = ['a', 'b', 'c']
>>> b = [1,2,3]
>>> dict(zip(a,b))
{'a': 1, 'c': 3, 'b': 2}
```

## jsonライブラリで辞書型からjsonへの変換時にキーでソートする
* 2.6.6

json.dumpに

```
sort_keys=True
```

を渡せばよい。


```code
>>> import json
>>>
>>> d = {'b':1, 'a':2, 'c':3}
>>>
>>> json.dumps(d)
'{"a": 2, "c": 3, "b": 1}'
>>>
>>> json.dumps(d, sort_keys=True)
'{"a": 2, "b": 1, "c": 3}'
>>>
```

## カンマ区切りの数字文字列を数値に変換
* 2.6.6

カンマをreplaceで除去する。

```code
>>> '5,007,167,488'.replace(',','')
'5007167488'
>>> int('5,007,167,488'.replace(',',''))
5007167488
```
Unityを使った おいしいお酒のつくり方

お酒（のモデル）をつくりたい。
![2015-06-20_171116.png](https://qiita-image-store.s3.amazonaws.com/0/59911/ded912d8-b0d5-07f9-6cb7-5fd95f9b85e8.png)


つくってみる。
![2015-06-19_114145.png](https://qiita-image-store.s3.amazonaws.com/0/59911/34a39962-02c9-9d74-f9cd-603ee08325d4.png)
待っているのはUV展開。たかが円柱にUV展開は面倒・・・。

そこでアセットを使ってみる。
![2015-06-19_130851.png](https://qiita-image-store.s3.amazonaws.com/0/59911/8d160276-32b1-6043-27fa-350f3d5b4602.png)

アニメーションカーブで形状を指定すると
![2015-06-19_124856.png](https://qiita-image-store.s3.amazonaws.com/0/59911/9dca75b4-b5ea-439e-a6dc-9d79bb0bab0b.png)

軸を中心とした円柱が出来上がる。
アニメーションカーブはセーブして再利用が可能。
テクスチャを用意して（例えばDiv2x2を指定したら４分割）、
![22.png](https://qiita-image-store.s3.amazonaws.com/0/59911/90c34bcd-e49f-50a6-04e0-7a1b3083d2bd.png)

はりつけるとできあがり。UV展開不要。これはオイシイ！
![2015-06-21_224302.png](https://qiita-image-store.s3.amazonaws.com/0/59911/72555b08-2f64-57b2-88cb-9295b3f60394.png)

UVは設定で位置とサイズをずらすことができる。
ID指定はDiv2x2なら左上0-3右下（Sprite-Multiple-Gridと同じ）。
![2015-06-21_225540.png](https://qiita-image-store.s3.amazonaws.com/0/59911/3e00a064-d9fc-dec8-927a-f3143b5eade6.png)

もうひとつオイシイお酒のできあがり。
アニメーションカーブはファイルにセーブ/ロード/再編集が可能。
何度でもオイシイお酒を作ることができます。
![2015-06-19_124656.png](https://qiita-image-store.s3.amazonaws.com/0/59911/ba4f2f3e-e2d8-e085-bc95-df5ee29b5448.png)

以上、アセットの宣伝でした！
よろしくお願いします！

**◆[ver.1.3]0-1の範囲を超えるアニメーションカーブの編集が可能になりました！**
**GameObjectのScale変更なしで等倍サイズのモデルを作成できます!!**
[CustomTubeEditor](https://www.assetstore.unity3d.com/jp/#!/content/36515)
![2015-06-19_130851.png](https://qiita-image-store.s3.amazonaws.com/0/59911/8d160276-32b1-6043-27fa-350f3d5b4602.png)
【RubyOnRails】Ajax通信でScaffoldingしたindexを書き換えたい時

大したことがしたいわけじゃないのに、かなり時間がかかりました。
よくわからないでscaffoldしてたからですね。

手順としては

1.viewにボタン配置
2.js.coffeeのonclickイベントでJqueryAjax
3.actionでrender
4.doneでhtml書き換え

って流れでしました。
というわけで１つずつ。
viewのCSSはsemantic-uiを使ってます。
http://semantic-ui.com/
あとHaml使ってます。

##1.viewにボタン配置
```haml:index.html.haml
#pageNm{"data-id" => "xxxxxx/index"}
#updateIndex.ui.icon.button.large
  %i.refresh.icon.green

:
省略
:

  %tbody#xxxxxx_list

```

semantic-uiだとこんな感じになります。
![image](https://qiita-image-store.s3.amazonaws.com/0/69919/4f3c5fa3-5ee5-bb98-0b13-a96af8258b3a.png)

tbodyにidをつけてます。render @xxxxxxで作ってるところを通信結果で書き換えるためです。
あと画面の識別ように戦闘に画面名をつけてます。#pageNmってとこです。

##2.js.coffeeのonclickイベントでJqueryAjax
coffeeスクリプトなんでインデントに注意。
なんでフォームサブミットのremote => trueでしてないかと言われれば、
Rails使う前からjquery.ajaxを使ってたから、ですかね。
あとはViewをあんまり弄りたくない。
本当は幾つかパラメータも渡してます。

windowsの関数にしてるのは、タイマーをセットして定期的にcallするためです。
コメントのreadyイベントって書いてるのは、特定の画面だけで動くようにreadyイベントの代わりにしてるよって意味です。
railsでアセットパイプライン使ってると全部のスクリプトを読み込むと思うので、タイマーが誤作動しないように。

```coffeescript:xxxxx.js.coffee
$ ->
  $('#updateIndex').on 'click', ->
    updateList()
  ##readyイベント  
  if $('#pageNm').data("id") == 'xxxxxx/index'
    setTimeout 'updateList()', 30000

window.updateList = ->
  if $('#pageNm').data("id") != 'xxxxxx/index'
    return
  
  jqXHR = $.ajax({
    async: true
    url: 'xxxxxx/reload'
    type: 'get'
    dataType: 'html'
    cache: false
  })
  jqXHR.done (data, stat, xhr) ->
    $("#xxxxxx_list").html(data)
    return
  
  jqXHR.fail (xhr, stat, err) ->
    return
  
  jqXHR.always (res1, stat, res2) ->
    setTimeout 'updateList()', 30000
```

ポイントはdataTypeがhtml。
actionでjsonを返すんじゃなくてhtmlを返すようにしてて、それを入れ替えるだけって感じにしてます。
最後の手順のdoneでhtml書き換えもこのソースでしてますね。


##3.actionでrender
Ajax関連のルーティングはメソッド単位で一つずつ定義してます。

```ruby:routes.rb
Rails.application.routes.draw do
  #Ajax関連ルーティング#
  get 'xxxxx/reload/' => "xxxxx#reload"
```

renderでhtmlを生成して返します。

```ruby:xxxxxx_controller.rb
  def reload
    @models = Model.all
    render @models
  end 
```

#よく見たリファレンス
renderの使い方　http://railsdoc.com/references/render


以上。
他にいい方法があれば教えて下さい。
エンジニアにSEO対策を求めるのは間違っているだろうか？

どうも、こんにちは。セプテーニ・テクノロジー（ベトナム・ハノイ）駐在の鎌田です。
タイトルはただのキャッチコピーなので気にしないでください。

セプテーニ・テクノロジーという会社は、ベトナムでオフショア開発する会社です。

私が最近どんな仕事をしてるかというと、もちろんプログラマとしてコードも書いているのですが、
最近はそれに加えて、日本人のお客様のご要件をまとめて、それを現地メンバーに伝えたり
お客様からの質問に答えるなどの、非エンジニア業務が多くなってきました。
プログラミングばっかりやってた頃に比べると、クライアントの目線でプロダクトで作る事の大事さに改めて気付かされます。

その中で特に最近よくクライアントから聞かれるのが、「SEO対策」です。
もちろんもっと昔からいろいろな企業が関心を寄せていた事なんですが、こういうのって結構というか案外というか、エンジニア視点では気づきにくい、苦手分野だったりします。

で、ちょっと一から体系を勉強しようと思い、とても解りやすい・読みやすい本に出会ったので紹介したいです。
![スクリーンショット 2015-06-18 18.08.08.png](https://qiita-image-store.s3.amazonaws.com/0/59759/5ffca375-5757-e66d-1b17-6f4d1c421088.png)

【10年つかえるSEOの基本】著：土居健太郎
http://www.amazon.co.jp/10%E5%B9%B4%E3%81%A4%E3%81%8B%E3%81%88%E3%82%8BSEO%E3%81%AE%E5%9F%BA%E6%9C%AC-%E5%9C%9F%E5%B1%85%E5%81%A5%E5%A4%AA%E9%83%8E-ebook/dp/B00WG2KY0Q/ref=dp_kinw_strp_1

「Google検索順位を上げるためにどうすればいいかを考えてサイトを作る」
のではなく、
「検索するユーザーが何を求めてるのかを考えてサイトを作る」（すると自然と検索順位の結果がついてくる）

というスタートの視点がいかに重要かを、非常にわかりやすくコミカルに、何度も説いてます。

本の中で何度か出てきますが、昨今のSEO関連の風潮を大学受験に例えると分かりやすいです。
大学受験合格という目先の目標をクリアするために、テストに出てきそうなヤマを張ったり、選択肢を絞るみたいな、いわゆる小手先の受験テクニックももちろん大事ですが、本当に大事なのは日頃から基礎を押さえて繰り返し勉強することです。

同じように、SEOテクニックで短期的な順位向上に腐心するのではなく、よりユーザーの求める良質なサイトコンテンツを日々模索する努力が、サイトオーナーには不可欠であって、検索順位というのはその結果にすぎない。

という視点で考えるのが、SEOを考える上での大前提だそうです。

ポイントとしては以下の点です。
1. そのサイトに情報を求めて検索するユーザーが、使いそうなキーワードを考える
2. そのサイトに来たユーザーが本当に求めている情報、そのサイトにしかない良質なコンテンツを盛り込む
3. そのサイトへの外部リンクを集める

# キーワードを考える
同じサイトの検索インデックスでも、キーワードを替えると検索順位やインデックス表示が変わる。
例：弊社グループの人気漫画サービス・GANMA!（ガンマ） http://ganma.jp

・「GANMA」をキーワードに検索するユーザーは、ほぼ間違いなくganma.jp内のコンテンツを求めてくるユーザー
・一方、「ガンマ」をキーワードに検索するユーザーの中には、GANMA!コンテンツを求めてくるユーザーの他にも、
レントゲンのガンマ線、数学のガンマ（γ）記号などに関連するコンテンツを求めている可能性もある

Google等の検索エンジンは、「キーワード」を読んで、統計的に、ユーザーが求めるコンテンツを判断して、検索インデックスの表示項目や並びをアレンジするらしい。
検索するユーザーの目線に立ち、ユーザーが一番使いやすそうな「キーワード」を考え、titleタグに入れたりすると、
検索エンジンから、「ユーザーが求めている情報を公開するサイト」であると判断されやすくなり、検索順位の向上に起因しやすいらしい。

# 良質なコンテンツを盛り込む
昨今のGoogle検索エンジンなどはとても頭がいいので、titleタグやbodyタグ内に特定の「キーワード」が含まれているかどうかだけでなく、「そのキーワードがコンテンツとして意味を成しているか」というような、踏み込みの深いソース解釈をする傾向にある。
逆に、ひと昔前のSEO対策などで、サイト下部にキーワードだけを羅列したような内容のないコンテンツだと、「ユーザーのニーズを解決できないサイト」だと解釈され、結果、検索順位が下がってしまう。

Googleなどは言語翻訳サービスなども手掛けてることからもわかるように、今後もさらに自然言語解釈の分野に注力していくと思うので、
コンテンツ内容の解釈アルゴリズムも、今よりさらに人間の感性に近づいていくことが期待されます。

# サイトへの外部リンクを集める
言うまでもないですが、サイトへの外部リンクが多いほど、そのリンクを辿ってサイトに人が訪れる可能性が高くなります。
外部リンクの種類はさまざまですが、最近だと特にFacebookやTwitterの書き込みなどが分かりやすいですね。
あとはプレスリリースサイトなどに紹介されたりとか。

「良質なコンテンツ」と同じお話なんですが、外部からのリンク数をただ闇雲に増やすのは逆効果。
検索エンジンがリンク元のサイトのコンテンツなども解釈し、リンク元とリンク先との整合性を判断している可能性もある。

このサイト間のリンク関係はFacebookのソーシャルグラフなどに例えられてます。
FacebookなどのSNSで、全く面識のない人に片っ端から友達申請して、一見友達数がすごく多いけど、実際その人の中身はどうなの？ていう感じに似てる。
逆に、内容のある・多くの人が見て共感できるメッセージ（コンテンツ）を日頃から発信している人・サイトは、
自分から特に申請しなくても、自然と周りから友達申請（リンク）が来たりしてますよね。
良質なリンク関係が、さらに多くの人を呼び寄せて、リンクも増える。この正のスパイラルを目指すことが大切。
スパイラルを作るために、最初にお金を使って広告打ったりなどは必要。
そのためには前項の「良質なコンテンツ」という土台が必要なのは明白ですね。

# まとめ
こうしてみるとどれも、当たり前のことなんですが、実際の現場だと、どうしてもSEOを考えるうえで、「どうしたら順位があがるか」というスタートから入る人がまだまだ多いみたいです。
実際、検索アルゴリズムが今に比べて雑だった一昔前は、メタタグやキーワードを入れるだけで、簡単に順位変動してた時もあったらしい（ブラックハットSEO）。
ただ、アルゴリズムの改良した昨今では、そのような裏技的な方法で順位を上げるコストも上がってきて、「そんなんに力入れるなら普通にいいコンテンツつくろうよ」ていうのが正解のようですね。

クライアントにSEO対策について質問された時、上記をいかに納得してもらえる形でお答えできるか、今後の課題。