OmniAICreator/Qiita-1.07M huggingface dataset:
sublimeText2でJSHINT入れる手順メモ

Mac10.6.8でインストールしたので、手順をメモ。
必要なもの

- ターミナル
- sublimeText2


#ターミナルで
##（nodeとHomebrewがあったらとばす）Homebrewのインストール

```
ruby <(curl -fsSkL raw.github.com/mxcl/homebrew/go)
```

##（node入ってたらとばす）nodeをインストール

```
brew install node
```

##JSHintをインストール

```
sudo npm install -g jshint
```

#sublimeText2で

##（sublimeText2入ってたらとばす）sumlimeText2をインストール
http://www.sublimetext.com/

##（Package Control入っていたらとばす）Package Controlを入れる
View > Show Console
か
Ctrl + `

```
import urllib2,os; pf='Package Control.sublime-package'; ipp = sublime.installed_packages_path(); os.makedirs( ipp ) if not os.path.exists(ipp) else None; urllib2.install_opener( urllib2.build_opener( urllib2.ProxyHandler( ))); open( os.path.join( ipp, pf), 'wb' ).write( urllib2.urlopen( 'http://sublime.wbond.net/' +pf.replace( ' ','%20' )).read()); print( 'Please restart Sublime Text to finish installation') 
```

##JSHINTを入れる
Cmd+Shift+p＞install＞JSHINT

##適当なJSを開いて、動くか確認
ファイルの上で右クリック＞JSHINT
もしくは
Ctrl+J

##リアルタイムにエラーチェックするにはSublimeLinterがいいらしい
Cmd+Shift+p＞install＞SublimeLinter

##エラーチェックの設定
よくわからないので、ひとまずバシャログの設定をコピペ。
これで、jQueryのエラー出なくなる。
Preferences＞Package Settings＞SublimeLinter＞Settings - User
http://c-brains.jp/blog/wsg/13/02/27-225904.php

でもこれだとJSHINTと違う箇所にもエラーが・・・
どうなってるのかよくわからないので、あとで調べる
Rails で schema_format を :sql にしたときに AUTO_INCREMENT を含まないようにする


lib/tasks/dump.rake

```
namespace :db do
  namespace :structure do
    task :dump do
      path = Rails.root.join('db', 'structure.sql')
      cont = File.open(path).read.gsub(/ AUTO_INCREMENT=\d*/, '')
      File.open(path, 'wb') {|f| f.puts cont }
    end
  end
end
```

正規表現で消してるだけです。

これで出来上がった structure.sql は `rake db:reset` とか `rake db:schema:load` とかで使われますが、特に大きな理由が無い限り `rake db:migrate` 使う方がいいとは思っています。
(migration を全て実行することと schema.rb や structure.sql をロードすることはイコールではないので)
MySQL の同時接続数 (max_connections) の変更


同時接続数を 500 に変更

稼働中のサーバで変更。

```
> set global max_connections=500;
> show global variables like '%connection%';
+--------------------------+-----------------+
| Variable_name            | Value           |
+--------------------------+-----------------+
| character_set_connection | utf8            |
| collation_connection     | utf8_general_ci |
| max_connections          | 500             |
| max_user_connections     | 0               |
+--------------------------+-----------------+
4 rows in set (0.00 sec)
```

my.cnf にはこんな感じで。

```
[mysqld]
max_connections = 500
```
MySQL の wait_timeout を変更。


接続維持時間をデフォルトの 8 時間から 1 分に変更。
この設定、接続のアイドル状態が一定時間続くと MySQL 側から自動的に接続を切る設定らしい。

うかつに低く設定すると、バッチ処理とかのときに考慮が必要になりそう。

稼働中のサーバで変更。

```
> set global wait_timeout=60;
> show global variables like '%wait%';
+---------------------------------------------------+----------+
| Variable_name                                     | Value    |
+---------------------------------------------------+----------+
| innodb_lock_wait_timeout                          | 120      |
| innodb_spin_wait_delay                            | 6        |
| lock_wait_timeout                                 | 31536000 |
| performance_schema_events_waits_history_long_size | 10000    |
| performance_schema_events_waits_history_size      | 10       |
| wait_timeout                                      | 60       |
+---------------------------------------------------+----------+
6 rows in set (0.00 sec)
```

my.cnf に書く場合こんな感じ。

```
[mysqld]
wait_timeout = 60
```
jQueryでテキストファイルを読み込んで改行コード区切りで配列に保存する方法

データの体としては、XMLやJSONであるべきなんだろうけど、テキストデータに保存するのもまだまだあるので、
こちらもメモメモ。

【test.txt】

```text
1行目のデータ
2行目のデータ
3行目のデータ
```

【JS】

```js
$(function () {
  $.ajax({
    url:'test.txt',
    success: function(data){
      var data_array = data.split(/\r\n|\r|\n/);  // 改行コードで分割
      var len = data_array.length;

      for (var i = 0; i < len; i++){
        console.log(data_array[i]);
      }
    }
  });
});
```
正規表現

#書き方

```
/正規表現内容/
```
「/」で正規表現の始まりと終わりを示す。

#メタ文字

```
.　改行を除く任意の1文字
*　0回以上の連続する文字
+　1回以上の連続する文字
?　0または1回だけの文字
^　文字列の先頭
$　文字列の末尾
\　エスケープ文字
|　OR
()　パターングループ
[]　文字クラス
{}　量指定子
\n　改行
\r　キャリッジリターン
\t　タブ
\d　数字 [0-9]
\D　数字以外 [^0-9]
\w　英数字 [_a-zA-Z0-9]
\W　英数字以外 [^_a-zA-Z0-9]
\s　空白 [ \t \r\f]
\S　空白以外 [^ \t\n\r\f]
```

#量指定子

```
*　0回以上の連続する文字
+　1回以上の連続する文字
?　0または1回だけの文字
{n}　n回の連続する文字
{n,}　n回以上の連続する文字
{n, m}　n回以上、m回以下の連続する文字
```

#文字クラス

```
-　範囲
^　先頭に置くと以外にマッチ
a-z　小文字の半角英文字
A-Z　大文字の半角英文字
0-9　数字
^0-9　数字以外
```

#例

```
/\A\d{3}-\d{4}\z/
```

「\d」は数字のみで、「\A」はそれが先頭から始まっていること。
「{3}」でさっきの「\d」（数字のみ）が３桁あること。
「-」で間にハイフンが入っていること。
同じように、「\d{4}」で数字が４桁あること。
最後の「\z」で、最後尾の終わりを示す。
「\A」と「\z」で囲むことで、先頭と最後尾に余計な空白などの文が入っていないかがチェックできる。
「XY-Sort」をErlangで(横へな7参考)

「[XY-Sort](http://nabetani.sakura.ne.jp/hena/ord7xysort/)」をErlangでやってみました。他の実装は [オフラインリアルタイムどう書く第7回の参考問題](http://qiita.com/Nabetani/items/7b08b0eb9ef84d7cfe49) から辿れます。

```erlang:xysort.erl
-module(xysort).
-compile(export_all).

table() -> [
  [4, 1, 4, 2, 1, 3], [7, 3, 2, 0, 5, 0], [2, 3, 6, 0, 6, 7],
  [6, 4, 5, 7, 5, 1], [3, 1, 6, 6, 2, 4], [6, 0, 5, 5, 5, 1]].

solve(Data) -> [X + $0 || X <- hd(lists:foldl(fun(C, Tbl) ->
  sort(C, Tbl) end, table(), Data))].

sort(C, Tbl) when ($u =< C) and (C =< $z) -> sortidx(C - $u + 1, Tbl);
sort(C, Tbl) -> transpose(sortidx(C - $A + 1, transpose(Tbl, [])), []).

sortidx(Idx, Tbl) -> lists:foldl(fun(X, Acc) -> Acc ++
  lists:filter(fun(L) -> lists:nth(Idx, L) =:= X end, Tbl) end,
  [], lists:seq(0, 7)).

transpose([[] | _], Acc) -> Acc;
transpose(Tbl, Acc) ->
  transpose([tl(L) || L <- Tbl], Acc ++ [[hd(L) || L <- Tbl]]).

test(Data, Expected) -> test(Data, solve(Data), Expected).
test(Data, Result, Expected) -> io:fwrite("~s: ~s -> ~s~n",
  [case Result =:= Expected of true -> ok; false -> ng end,
    Data, Result]).

tests() ->
  test("AvEx", "305027"), %0
  test("A", "112344"), %1
  test("C", "241413"), %2
  test("F", "134214"), %3
  test("u", "236067"), %4
  test("w", "732050"), %5
  test("y", "414213"), %6
  test("yx", "732050"), %7
  test("ux", "236067"), %8
  test("EF", "131424"), %9
  test("DF", "134124"), %10
  test("Au", "055165"), %11
  test("uA", "023667"), %12
  test("By", "234114"), %13
  test("yB", "114342"), %14
  test("yBy", "357020"), %15
  test("yByB", "350072"), %16
  test("AuBvCw", "131244"), %17
  test("FAuFBvFCw", "300527"), %18
  test("AuBv", "112344"), %19
  test("CwDx", "515056"), %20
  test("FzyE", "324114"), %21
  test("uAwDyB", "114324"), %22
  test("zExCvF", "073520"), %23
  test("uFxEv", "002357"), %24
  test("DyCwB", "076362"). %25
```

この問題の直前にやった[「境界線分」をErlangで(横へな16)](http://qiita.com/pazworld/items/90f060fb465ff44a7caf)で開眼した「引数以外の変数は使わない」方式でコンパクトに書けました。自分的にかなり満足度が高いコードです。
パーフェクトRuby勉強会 12/17 6章

# まえがき
+ 今日のために書いたコードは[こちら](https://github.com/kamatama41/perfect-ruby-study)

- - - 

# 6章 Rubyのクラスオブジェクト
## 6-1 ClassクラスからClassを作る
RubyのClassはClassオブジェクトのインスタンスなので、以下の方法でも作れる。
class定義式との違いはスコープ
(定義式外の変数も参照できる)

```rb
name = 'kamatama'

# クラス定義の書き方。ブロック内でメソッドを定義することが可能
MyClass = Class.new do |klass|
  @name = name
  def self.hello
    p 'hello! ' + @name
  end
end

MyClass.hello
```

## 6-2 クラスオブジェクト
TODO まだ書いていない

- - - 
# 課題
TODO まだ書いてない
Docker で レプリケーションつきの MySQL を立ち上げる 

Docker を使って、Master-Slave のレプリケーションを行うMySQLサーバをセットアップするサンプルスクリプトです。

* https://github.com/essa/docker-mysql-repl

## 概略

* 一連のスクリプトを順番に実行するだけで、Master-SlaveのMySQLサーバが動きます
* MySQLサーバは、Dockerのコンテナの中で動きます
* DBの実体は、Host側に持ち、それをコンテナがマウントして使います

私は、MySQLもDockerも勉強中で、あまり詳しくありません。本格的な運用に耐えるものではありませんが、gitlabやredmineのような、開発者用のWebアプリを自動バックアップ付きでサクっと立ち上げる時には参考になるかもしれません。

実際に使用する際は、必ずご自分で各スクリプトの内容を確認して、パスワード等を変更してお使いください。

下記のスクリプトを参考にして作成しました。

* https://github.com/paulczar/docker-wordpress

## 準備

*  Dockerをインストールしたサーバを二台用意してください
* 両方にmysql-client をインストールしてください
* Slave から Master の ポート 3306 に接続できるようにしてください

## 使い方

Master用ホストで以下のコマンドを実行します。

```bash
$ git clone https://github.com/essa/docker-mysql-repl.git
$ cd docker-mysql-repl
$ sudo docker build -t essa/mysql-repl .
$ sudo ./create_repl.sh
$ ./copy_replica.sh SLAVE_HOST
```

これで、以下のものができます。

1. MySQLが動くDocker イメージ
2. 初期化されたMasterのDB ( data/mysql )
3. レプリケーション用ユーザの設定
4. Master と同期した Slave のDB ( replica/ 以下 )
5. 確認用の repltest という DBと test というテーブル

次に replica/ 以下のファイルを Slave用ホストに転送します。

Master から Slave にssh できれば、以下のスクリプトで転送できます。

```bash
$ ./copy_replica.sh SLAVE_HOST
```

次にMasterでMySQLを起動します。

```bash
$ sudo ./start_master.sh 
$ mysql -uroot -proot -h 127.0.0.1 -AN  repltest
```

Slave側でも、転送した replica/ ディレクトリで、Dockerイメージを作成してから、MySQLを起動します。

```bash
$ cd replica
$ sudo docker build -t essa/mysql-repl .
$ sudo ./start_slave.sh MASTER_HOST
$ mysql -uroot -proot -h 127.0.0.1 -AN repltest
```

この状態で、Master側のmysql からデータを追加、変更すると、その結果を Slave側で見ることができます。

(Master側で)
```mysql
INSERT INTO test values(12345, "test");
```

(Slave側で)
```mysql
SELECT * from test;
```

マスター側のMySQLサーバのポートは、start_master.shの中の以下のオプションでコントロールされます。

```
-p 0.0.0.0:3306:3306
```

これは、コンテナ内の3306ポートを、ホストの全てのインターフェースで同じ3306でオープンするという意味です。誰でも接続できますので、インターネット上のサーバで運用する場合は、必ず、ファイアーウォールでSlaveホスト以外からはアクセスできないように設定してください。

Masterホスト内の他のコンテナでアプリケーションを起動して、接続先をホストのDocker用ネットワークのアドレスにすれば、このMySQLを使うことができます。
転送コマンド　scp

ファイルをリモートからローカルへ転送するとき
---
ローカル上で
`scp 'hogehoge'@'burabura':ファイル名 . `  
    
Permission Errorで転送できないとき
----
例: リモート上のファイル ➡ ローカルへ  
リモート上でのカレントディレクトリにコピーしてからローカルへ転送すればいよい. 
転送が終わったら, コピーしたファイルを削除する.
  
ディレクトリごと転送
---
オプション -r  

複数ファイル(ログ等)の指定方法
---
hoge-bin.0000{01,02,03,...,49,50}
ログの移動はこんな感じでしているが正直面倒くさい・・・


scpはftpよりもセキュリティ面もそうだし、ディレクトリごと送れるという利点がある
Jenkinsおじさんに出来るビルド結果をEmailで送る事

出来る事、というより、出来ると思って出来なかった事があったので書きます。

■出来なかった事
　ジョブ全ての結果を一括で設定
よくよく考えたらこれしたらとんでもない量のメールが来る。


■出来た事
　バグらせた人にこっそりメールを送る。
プロジェクトごとにも設定できますが、バグを作ったコミットした人に
個人的にメールが送れます。
Packer で ansible-local を使うときの始めの一歩

[Packer](http://www.packer.io/) は Vagrant の作者 Mitchell Hashimoto さん作成の様々な仮想マシン向けの pre-baked image (プロビジョニングが事前になされたイメージ) を簡単に作成するツールで、バージョン 0.3.10 から Provisioner として Ansible がサポートされました。

公式ドキュメントが [こちら](http://www.packer.io/docs/provisioners/ansible-local.html) なのですが、ちょっとサラっとしすぎているので、始めの一歩的なものを記しておきます。

まず、この Provisioner は Ansible を通常のリモート実行ではなく、サーバ側に playbook を転送してローカルで実行する形式になっているので、事前に対象のサーバに Ansible がインストールされている必要があります。Vagrant にせよ Amazon AMI などにせよ、Ansible が既にインストールされているような環境はまだ稀かとおもいますので、まずは Ansible を先にインストールする必要があります。

その為に利用出来るのが [Shell Provisioner](http://www.packer.io/docs/provisioners/shell.html) です。以下のように対象のプラットフォームにあわせる形で Ansible をインストールします。(yum でのパッケージインストールは環境にあわせて適宜読み替えてください。以下は Amazon Linux での例です。)

```json
        {
            "type": "shell",
            "inline": [
                "sudo yum install gcc python-devel python-crypto python-pip -y",
                "sudo pip install ansible"
            ]
        }
```

次に Ansible の playbook の転送をしますが、推奨のディレクトリ構成を取っている場合、必要な role のディレクトリもあわせて転送する必要があり、こちらは Ansible の設定内の role_paths に指定できます。

ただ、その他に例えばプロジェクト独自のモジュールを作成していたり、group_vars や host_vars といったディレクトリにデフォルトの変数をまとめたりしている場合はこちらも転送する必要があり、その為に利用できるのが [File Provisioner](http://www.packer.io/docs/provisioners/file.html) です。こちら、事前にアップロード先のディレクトリを作成する必要がありますので、流れとしては以下のようになります。

* 先の Ansible インストール時に Ansible 用の実行ディレクトリ ( staging_directory ) を作成
* File Provisioner で必要なモジュールなどを staging_directory にアップロード
* Ansible Provisioner では staging_directory に最初に指定したディレクトリを指定

Provisioner の全体設定はこんな感じ。staging_directory は /tmp/ansible-local としています。File Provisioner の src の指定の仕方は rsync スタイルにのっとっているので、ディレクトリの場合に末尾にスラッシュをつけるか否かで挙動が変わる点に注意です。

```json
    "provisioners": [
        {
            "type": "shell",
            "inline": [
                "sudo yum install gcc python-devel python-crypto python-pip -y",
                "sudo pip install ansible",
                "mkdir -p /tmp/ansible-local"
            ]
        },
        {
            "type": "file",
            "source": "ansible/library",
            "destination": "/tmp/ansible-local"
        },
        {
            "type": "ansible-local",
            "playbook_file": "ansible/playbook.yml",
            "role_paths": [
                "ansible/roles/app"
            ],
            "staging_directory": "/tmp/ansible-local"
        }
    ]
```

まとめると、

* Shell Provisioner で Ansible をインストール
* File Provisioner で必要なファイルやディレクトリを転送

の組み合わせで使うのが Packer+Ansible 始めの一歩です。

ツールの基本設計による所もあると思いますが、素直に Ansible をリモート実行したい気もしますね。

# Packer 0.8 以降の注意事項

0.8 では ssh 接続時にデフォルトでは PTY を利用しなくなりました([CHANGELOG](https://github.com/mitchellh/packer/blob/master/CHANGELOG.md#080-june-23-2015))。そのため、shell provisioner での最初の ansible のインストールが

> sudo: sorry, you must have a tty to run sudo

といったエラーで失敗するようになります。これを避けるためには builder 側の設定で以下のように ssh_pty を true に設定する必要があります。([ssh_pty の設定](https://packer.io/docs/templates/communicator.html#ssh_pty))

```
    "builders": [{
        "type": "amazon-ebs",
        "ssh_pty": true,
        :
```
PEAR MDB2の使い方

## 環境
* 実行した環境はCentOS6.4 64bit

## インストール
* mysql以外にも各種データベースに対応しているがここではmysqlのみ紹介する

```
# pearが入っていない場合は以下を実行する
$ (sudo) yum -y install php-pear

# プロキシ環境下でインストールするときは以下を設定する
$ pear config-set http_proxy http://PROXY:PORT
# 以下を実行してHTTP Proxy Server Addressに設定したプロキシが入っているか確認
$ pear config-show

# MDB2#mysqlのインストール
$ pear install MDB2_Driver_mysql
```

## PHPファイルの書き方

```php
require 'MDb2.php';  # MDB2を使うための宣言

# DNSは(使用するDB名)://(ユーザ名):(パスワード)@(接続ホスト名)/(DB名)
$dns = 'mysql://testuser:testpassword@localhost/browser';
$db = MDB2::conncet($dns);  # DBへの接続
if(PEAR::isError($db)) { die("接続失敗" . $db->getMessage()); }  # DBの接続に失敗した時の処理

$query = 'SELECT version FROM firefox';
$q = $db->query($query);  # SQLを実行する
while($row = $q->fetchRow()) {  # 実行結果を表示する
  echo $row[0];
}
```

### DNSに使用可能なDB名

|指定する文字列|DB名|
|:-----------|:-----------|
|dbase|dBase|
| fbsql|FrontBase|
|ibase|InterBase|
|ifx|Informix|
|msql|Mini SQL|
|mssql|Microsoft SQL Server|
|mysql|MySQL (Version 4.0以前)|
|mysqli|MySQL (Version 4.1.2以降)|
|oci8|Oracle (Version 7/8/9)|
|odbc|ODBC|
|pgsql|PostgreSQL|
|sqlite|SQLite|
|sybase|Sybase|

# ～ただの宣伝～
* [全国のSeleniumer必読](http://qiita.com/oh_rusty_nail/items/b8ba525d31ea7c522856)
* Seleniumerといっていますが、Selenium, SauceLabs, Travis, Jenkinsに関するノウハウ書いているのでよかったら参考にしてみてください
markdownの文字数を、セクションごとに数えてくれるコマンドつくった


ひさしぶりにコマンドラインツールをつくりました。名前は **mdwc**。文字数を数える``wc``のmarkdown最適化版、という感じです。

 - [fnobi/mdwc](http://github.com/fnobi/mdwc)

## なんのためのコマンドか

このごろ、markdownでけっこう長めの、しかも文字数をちゃんとチェックしなくちゃいけない文章を書いていて、
 **「かぞえるのめんどくさい!!」** となってつくったコマンドです。

最初は、マルチバイト文字(日本語)がちゃんと数えられて、よしなに余計な文字を無視してくれるくらいでいいかなーと思ってたんですが、
つくってるうちに、
**「markdownなんだったら、見出しのフォーマットがはっきりしてるから、セクションごとの文字数とかも出せるじゃん!」**
と気づいて、そのへんに特化したコマンドに調整しました。

## インストール

node.js製ですので、npmつかってくださいませ。

```
npm -g install mdwc
```

## つかいかた

例えば、こんな ``sample.md``というmarkdownファイルがあったとします。

```markdown:sample.md
# もげもげ
> 引用部分なので
> このあたりはカウントしない
## 最初の項目
### 最初の項目１
ほげほげ
### 最初の項目２
ほげほげ
### 最初の項目３
ほげほげ
## 第２の項目
もげもげもげ
## 第３の項目
foo bar
```

これの文字数を数えたい! というときは、``mdwc sample.md`` と叩いてください。こんなかんじの結果が出ます。

```markdown:出力結果
 - root (24)
   - もげもげ (24)
     - 最初の項目 (12)
       - 最初の項目１ (4)
       - 最初の項目２ (4)
       - 最初の項目３ (4)
     - 第２の項目 (6)
     - 第３の項目 (6)
```

markdown中に含まれる見出しの一覧と、
その見出しに対応している範囲(セクション)の文字数(マルチバイト文字も1文字とカウント)が出ます。わーい。

階層構造をちゃんと把握して数えているので、
「最初の項目」の文字数は、ちゃんと「最初の項目１」「最初の項目２」「最初の項目３」の文字数の合計になっているのが分かるかと思います。
したがって、単純な全体の文字数も、最初の ```root``` という行の数字を見れば分かりますよー。

あとこの出力自体も、なんとなくmarkdownっぽくなってるので、そのまま目次として使うのもありですかね。

## カウントしない行・文字

また、これはいま書いている文章の都合で付けた仕様なんですが、 **>からはじまる行(引用)は文字数にカウントに入れません**。
同様に、見出しの中身・リストの```-```・半角空白などもカウントしないようになっています。
ちゃんと自分で書いた本文の文字数をカウントするって感じですね。

各行がそれぞれ何文字でカウントされているかを確認したい場合は、``mdwc -l sample.md``と叩いてみてください。すると出力形式が変わります。

```markdown:出力結果
(0)	"# もげもげ"
(0)	"> 引用部分なので"
(0)	"> このあたりはカウントしない"
(0)	"## 最初の項目"
(0)	"### 最初の項目１"
(4)	"ほげほげ"
(0)	"### 最初の項目２"
(4)	"ほげほげ"
(0)	"### 最初の項目３"
(4)	"ほげほげ"
(0)	"## 第２の項目"
(6)	"もげもげもげ"
(0)	"## 第３の項目"
(6)	"foo bar"
(0)	""
```

こんな感じで、今度は行ごとの文字数がでてきます。そして見出しの行や、
引用部分の行が「0文字」ということになっているのがわかると思います。

無視する文字種とかにご意見・ご要望ある場合は、[githubのissues](https://github.com/fnobi/mdwc/issues)あたりで突っ込んで頂けると幸いです。
コードブロックとかもカウントしない部分に含めたいなぁ。

## まとめ
 - こまかく文字数が決まっている文章を書くときにも、markdownが使えるようになってうれしい。
 - 出力形式凝るとたのしい。
 - Kobito・Qiitaとの相性もばっちりですよ! ぜひご利用くださいー。
GASを使って自分の予定をメールで通知

初めてこういうのを書くのでお手柔らかにお願いします。。

#何がしたかったか…
業務利用のアカウントが社外(個人携帯)からアクセスできない
→カレンダー(少なくとも今日の予定を朝知りたい！！)
→毎朝自動で携帯にメールで送ってしまおう！

こんな感じです。
社外からでも会社のアカウントにアクセスできる人はいらない機能ですが、
ちょっと便利になるかもということで書いてみます！

#届くメールはこんな感じ。
’------------------------------
1件目：XXX打ち合わせ
時間：09:00～10:00
場所：
'------------------------------
2件目：YY様来社
時間：11:00～12:30
場所：
'------------------------------

#手順
1.スクリプトエディタを開く
2.ソースを書く
3.トリガーを設定する
これだけです！

#【1.スクリプトエディタを開く】
↓にアクセス
https://script.google.com/

#【2.ソースを書く】サンプルコード
```gas:eventsend.gs
function getEventsAndEmailSend(){
  var address = 'XXXXX@yourdomain.co.jp';//カレンダーのアドレス・送信先アドレス
  var cal = CalendarApp.getCalendarById(address);//対象のカレンダーを取得
  var opt = new Object();
  opt.name = "今日の予定";//メールの送信名・・・特になくてもいい
  opt.cc = "XXX@i.softbank.jp";//CCの宛先(ここで携帯に送ってます）
  var events = CalendarApp.getEventsForDay(new Date());//処理当日の予定をeventsに格納
  var eventsText = '今日の予定は以下の通りです。'+'<br />'+"------------------------------"+'<br />';//本文TOP
  for(var i=0; i < events.length; i++){       //ループ処理　予定リストがなくなるまで
    var stime = Utilities.formatDate(events[i].getStartTime(), "Asia/Tokyo", "HH:mm");//予定開始時間
    var etime = Utilities.formatDate(events[i].getEndTime(), "Asia/Tokyo", "HH:mm");//予定終了時間
    eventsText += i+1+'件目：'+events[i].getTitle()+ '<br />' +" 時間："+ stime +"～"+etime+'<br />'+" 場所："+ events[i].getLocation()+'<br />'+"------------------------------"+'<br />';//本文
  }
  opt.htmlBody = eventsText;//optに本文を格納
  //メール送信
  MailApp.sendEmail(address,//送信先アドレス
                                '今日のあなたの予定です',//件名
                                '',//本文は空
                                opt//送信オプション
       );  
}
```
ここまでできたら一回テスト起動をしてみてください。
※認証画面が表示されるのでそこは「承認」を！

問題なさそうなら↓へ

#【3.トリガーを設定する】
自分の場合は毎日出勤中の電車でメールが届くように
毎日7時～8時に該当の処理が送られるようにセットしています。

#まとめ
今回の内容では、メールの送信・カレンダーの予定の取得という大きく二つの
Googleのサービスを使えました。

まだまだGAS初心者ですが、自分の業務効率アップ用のツールを作ろうと思うと、
積極的に知識を得ようと思えるかもです。（私だけかもしれませんが。。）
rbenv環境でのCould not verify the SSL certificateというエラーの対処方法

railsのプロジェクトでbundle installをしようとしたら、下記のエラーに出会いました。

```
[hatone@MAC]~/hogehoge% bundle install
Fetching source index from https://rubygems.org/
Could not verify the SSL certificate for https://rubygems.org/.
There is a chance you are experiencing a man-in-the-middle attack, but most likely your system doesn't have the CA certificates needed for verification. For information about OpenSSL certificates, see bit.ly/ruby-ssl. To connect without using SSL, edit your Gemfile
sources and change 'https' to 'http'.
```

rvmでの対処方法はこちら [bundle install する時、証明書エラーが出る。](http://qiita.com/Dominion525/items/fd4569bcf1306acb86a4)にありました。
↓で対処が出来ました。

```
[hatone@MAC]~/hogehoge% ruby -ropenssl -e 'p OpenSSL::X509::DEFAULT_CERT_FILE'
[hatone@MAC]~/hogehoge% cp /usr/local/Cellar/curl-ca-bundle/1.87/share/ca-bundle.crt /usr/local/etc/openssl/cert.pem
```
[Groovy]シグマ（Σ・数列の和）を実装

内容は凄くシンプル。


```groovy
def sigma(Integer from, Integer to, Closure clj = null){
    (from..to).inject(0){a,b -> a + (clj? clj(b):b)}
}

// http://www24.atpages.jp/venvenkazuya/mathB/progression9.php
// 上記ページの「それではこの調子でいくつか解いてみましょう。」以降の問題を解いてみる。

// ak, k=2から6まで
assert 20 == sigma(2,6)

// ak=2k-1, k=1から5まで
assert 25 == sigma(1,5){ k -> (2 * k) - 1 }

// ak=3*2^(k-1), k=1から6まで
assert 189 == sigma(1,6){ k -> 3 * (Math.pow(2,k-1)) }

// ak=2k^2, k=3から5まで
assert 100 == sigma(3,5){ k -> 2 * (Math.pow(k,2)) }
```

シグマ云々よりも、実は今話題の以下のような記事に触発されて。
http://jp.techcrunch.com/2013/12/16/20131214code-literacy/

例えば今回のようにシグマという記号がある場合、どうやって計算したら良いのかを丸暗記してテスト（学校の）で何度も何度も手で計算するより、一回今回のようにコードを書いておけば、「なんでその答えになるの？」という疑問は自分で書いたコードを読み返せば一目瞭然。
自分の記憶をたどると、問題を解いてもその答えあわせが非常に面倒くさかった記憶がある。
この問題もコードを書いておけば解決する。
自分の考えていた解答が間違っているのでれば、値を変えて再実行すればまた一瞬で答えあわせが出来る。
このスピーディーな流れは勉強に非常に重要だと思う。
もう一度面倒くさい計算を手作業でやりなしてもまた間違えるかも・・・というネガティブな気持ちが起き辛くなるし、そうすることでエジソンの言っていた「失敗したんじゃない。この方法では上手くいかないという発見をしたのだ。」をリアルに体感できるはず。

さらに、これは直接は関係ないけど、「学校で勉強する事とか大人になってから使わないし！」って言うのは誰もが一度は感じたことだと思う。自分もそうだった。
でも、「使わない」んじゃなくて、「使えない」んだよね。知らないと。
さらに言うと「何に使えるんだろう？」を考えたり、全く関係なさそうな問題を解決するときにそういった知識が利用できるという事を発見するというのが凄く楽しい。プログラミングはお金だけじゃなくて、そういったプライスレスなとっても大切なことを自分に教えてくれたと思う。
だから、別に難しいことを考えずに、みんな楽しみながらプログラミングを学べば良いんじゃないだろうか。

ブログでやれっていう内容だけどQiitaがあまりにも使いやすいので・・・
Ceylon でのJsonパース

最近では他のサービスのAPIを叩いてjsonで受け取ってマッシュアップサービスを作ったり
API側でJSONデータで受け渡したりと
JSONを利用する機会が増えてきました。

と、言うことでceylonにも標準でjsonモジュールが用意されています。

今回はそんなJsonモジュールを使ってみます。

#モジュール登録

いつものようにさくっとモジュール登録

> import ceylon.json "1.0.1";

#JSONパース

```ceylon

void jsonParse() {
	// { "x":"1" }
	value data = parse("{\"x\":\"hello json\"}");
	
	print(data.get("x")); // hello json
	
}

```

シンプルですね。
配列を取得するときはgetArrayメソッドで取得することが出来ます。

そしてこれくらいしか機能がない・・・。

#まとめ

気軽に使うには先に行った回のceylon.netモジュールと組み合わせて
APIに対してリクエストして結果をパースして利用出来るかもしれません。

ただ、実践で使うにはクラスのプロパティとのマッピング機能みたいなものが欲しいところです・・・。

動的言語であれば存在するか分からないプロパティも書くことが出来て
jsonやxmlのデータをそのまま変数のようにアクセス出来るんですけどね。。

C#もdynamicキーワードもありますし、、。

でも、そんな妥協はJava好きな人たちは要らないと思います！
と言うことでクラスマッパーは自分で作るぜ！って人が使ってしまえばいいかなと思います。
CocoaPods で template file を使う

プロジェクト開始時 前回のプロジェクトから Podfile をコピーして使う場合があると思います. しかし, ~/.cocoapods/template にテンプレートファイルをおいておくことで pod init する際にこのテンプレートをもとに Podfileを作成してくれます.

## 手順

### 1. 以下の場所にPodfile.default と Podfile.test を用意します.

```
$ pwd
/Users/u16suzu/.cocoapods/templates

$ ls
Podfile.default Podfile.test
```

Podfile.default

```
platform :ios, '6.0'
pod 'AFNetworking'
pod 'UAModalPanel'
pod 'MBProgressHUD'
pod 'BlocksKit'
pod 'Underscore.m'
pod 'MagicalRecord'
```

Podfile.test

```
pod 'Kiwi'
pod 'KIF', '~> 2.0'
```

### 2. コマンドを実行します.

```
$ pod init
```

### 3. 以下のような Podfile が生成されます.

```
# Uncomment this line to define a global platform for your project
# platform :ios, "6.0"

target "podTemplateSpike" do
  platform :ios, '6.0'

  pod 'AFNetworking'

  pod 'UAModalPanel'

  pod 'MBProgressHUD'

  pod 'BlocksKit'

  pod 'Underscore.m'

  pod 'MagicalRecord'
end

target "podTemplateSpikeTests" do
  pod 'Kiwi'

  pod 'KIF', '~> 2.0'
end
```

### 注意点

~/ にPodfile があると pod init に失敗しますのでご注意ください.

```
$ pod init
[in /Users/u16suzu]
[!] Existing Podfile found in directory
```
[Groovy]本物のカレンダーのように1ヶ月35日分のカレンダーを生成する。

こんなのとか

```
              2013/12              
 Sun  Mon  Tue  Wed  Thu  Fri  Sat 
 01   02   03   04   05   06   07  
 08   09   10   11   12   13   14  
 15   16   17   18   19   20   21  
 22   23   24   25   26   27   28  
 29   30   31   01   02   03   04 
```

こんな感じの。

```
              2013/12              
 Mon  Tue  Wed  Thu  Fri  Sat  Sun 
 25   26   27   28   29   30   01  
 02   03   04   05   06   07   08  
 09   10   11   12   13   14   15  
 16   17   18   19   20   21   22  
 23   24   25   26   27   28   29  
 30   31   01   02   03   04   05 
```
実際のソースは以下。

```groovy
class OneMonthCalendar {
 
    def beginningOfWeek = "Sun"
    def year = new Date().year + 1900
    def month = new Date().month + 1
    def weekSequence = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]
 
    def List<Date> getCalendar() {
 
        // Javaは日曜日を0として6までの数値を返してくる。
        // それに対応する週の項目
        def week = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]
 
        // 表示する週の順番の指定。
        weekSequence = week.drop(week.indexOf(beginningOfWeek)) + week.take(week.indexOf(beginningOfWeek))
 
        // 基本となる年月
        def baseDate = new Date("$year/$month/1")
        // Dateオブジェクトから末日を求める
        def getLastDay = {Date date -> date.toCalendar().getActualMaximum(Calendar.DATE)}
 
        def thisMonth= (1..getLastDay(baseDate)).step(1).collect{new Date("$year/$month/$it")}
        def daysRequiredLastMonth = weekSequence.indexOf(week[thisMonth.head().day])
        def lastMonth = (0 ..< daysRequiredLastMonth).collect{ thisMonth.head() - (it+1) }.reverse()
 
        // 既に一ヶ月のカレンダーとしてフルの場合
        if((lastMonth + thisMonth).size() % 7 == 0) {
            lastMonth + thisMonth
        } else {
            def daysRequiredNextMonth = 7 - ((lastMonth + thisMonth).size() % 7)
            def nextMonth = (0 ..< daysRequiredNextMonth).collect{ thisMonth.last() + (it+1) }
            lastMonth + thisMonth + nextMonth
        }
    }
}
 
// インスタンスの生成
def calendar = new OneMonthCalendar(year:2013, month:2, beginningOfWeek:"Sun")
// カレンダーを生成&取得！
def result = calendar.getCalendar()
 
 
/**********************************************************
 * 以降は表示する際にどうするかなので、ケースバイケースでそれなりに。
 *********************************************************/
 
// Listの中身はDateオブジェクトなので適当にほしい値に変換
perfectOne = result.collect{"${(it.date).toString().padLeft(2,'0')}"}
 
// とりあえず週の情報を表示してみる
println "${calendar.year}/${calendar.month}".center(35)
calendar.weekSequence.each{print it.center(5, " ")}
println ""
 
// list(1か月分のDateオブジェクト（カレンダー）)を1週間ごとに分けるクロージャ
// 本当は末尾再帰を最適化するようにtrampolineを使って方が良いけど、
// 今回は5回だけの再帰と分かりきっているのでとりあえず無視
def spliter = { List list ->
    !list ? [] : [list.take(7)] + call(list.drop(7))
}
 
// 用意したクロージャで一週間ごとに分けられたlistを表示。
spliter(perfectOne).each{ weeks ->
    weeks.each{ week ->
        print week.center(5, " ")
    }
    println ""
}
```
[Solr]全てのドキュメントをインデックスから削除する

参考ドキュメント : http://wiki.apache.org/solr/FAQ#How_can_I_delete_all_documents_from_my_index.3F

以下の2つのURLに順番にアクセスすればOK

```
http://localhost:8983/solr/update?stream.body=<delete><query>*:*</query></delete>
http://localhost:8983/solr/update?stream.body=<commit/>
```
【Android】カメラのライブラリを作ってみた

Androidでカメラをカスタムで書こうとすると、 **機種依存** という敵と真っ向から戦うハメになります。
主な原因は、各ベンダーが好き勝手にオレオレカメラを載せてくるせい。
ハードウェアスペックに依存して、サポートされるサイズやパラメータが異なってきます。

いい加減きれいにまとめてしまいたい！ということで、Fragmentにまとめることにしました。

##機能

今現在
・プレビュー表示
・撮影　保存
・フロントカメラ切り替え

フラッシュ撮影など今後対応していく予定。

##ソース

ソースはこちら。
https://github.com/satoshinew/CameraFragment

CameraFragmentのライブラリプロジェクトと、それを使ったサンプルプロジェクト（CameraSample）に分かれています。

##使い方

ライブラリプロジェクトをライブラリ参照するか、jarにしてプロジェクトのlibsに入れて下さい。（ [ここ](https://github.com/satoshinew/CameraFragment/tree/master/CameraSample/libs) からかっぱらっても良し）
CameraFragmentを表示させたいViewにaddすると、カメラのプレビューが表示されます。

簡単だね！…と言いたいのですが、諸々と設定は必要になってしまいました。

主な原因は、カメラのpreviewSizeの設定。
例えば、画面サイズ一杯にプレビューを表示したいとしても、
画面サイズと同じサイズのpreviewSizeがサポートされてるとは限らないからです。
無理に表示すると、アスペクト比がずれてプレビューが歪みます。

Fragmentをaddする際の諸々の設定は、CameraSampleにある [CameraSampleActivity](https://github.com/satoshinew/CameraFragment/blob/master/CameraSample/src/jp/ogwork/camerasample/CameraSampleActivity.java "CameraSampleActivity") を参考にしてください。 

###1. カメラのプレビューを表示する
```java:CameraSampleActivity.java
fl_camera = (FrameLayout) findViewById(R.id.fl_camera);
fl_camera.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {

    @SuppressWarnings("deprecation")
    @Override
    public void onGlobalLayout() {
            fl_camera.getViewTreeObserver().removeGlobalOnLayoutListener(this);
            addCameraFragment(fl_camera.getWidth(), fl_camera.getHeight());
    }
});
```

CameraFragment を入れる対象の View のサイズを取得して、addCameraFragment() を叩きます。
View の width / height に wrapContent / matchParent に指定されている場合、
実際の width / height 値が決まるのを待つ必要があります。
もし、予めサイズが決まっているようであれば、OnGlobalLayoutListener()を使うは必要ありません。
そのままサイズを投げてしまってください。

addCameraFragment() の中身に関しては、プレビュー・保存サイズを **よしなに** 設定してほしい方は
丸コピで問題ありません。

###2. 撮影、保存

```Java:CameraSampleActivity.java
cameraFragment.takePicture(true, new OnTakePictureListener() {

        @Override
        public void onShutter() {

        }

        @Override
        public void onPictureTaken(Bitmap bitmap, Camera camera) {
                String path = Environment.getExternalStorageDirectory().toString() + "/";
                cameraFragment.setSavePictureDir(path);
                cameraFragment.saveBitmap(bitmap);
        }
});
```

takePicture()を叩くと、シャッターが降りてコールバックが返ってきます。
bitmapを返すので、保存、加工したい方は onPictureTaken() 内で受け取ってください。
申し訳程度に保存するユーティリティも用意してあります。

###3. その他

バック・フロントカメラの切り替えくらいまではできます。（setCameraDirection()を叩いてください）
他にもフラッシュ関連の怪しいメソッドが用意してありますが、絶賛開発中のため、
まともに保障できるのは現段階では上記機能くらいです。


##最後に

必要な機能は今後取り入れていく予定です。
もともと外部に公開する気が毛頭もなかったので、コメントが少なかったり、
命名がナンセンスだったりしますが、追々修正していきます。

カメラの内部処理も公開しているので、参考などになれば幸いです。
Ceylon でのRDB連携

今アプリを作るならDB連携は当然使いますよね？
ということで、今回はDBのアクセスしてみようと思います。

#DBアクセスモジュールの追加

いつものようにmodule.ceylonファイルに追記します。
今回追加するモジュールはこれ。

> import ceylon.dbc "1.0.0";


#DBアクセスクラス

ceylon.dbcでは
Sqlクラスが用意されていて
DBにアクセスすることが出来ます！

しかし・・・
Sqlクラスのコンストラクタには
javax.sql.DataSourceの名前が・・・。

Java連携が必須のようです。。

#DB周りの設定

DBと合わせてjavaのDataSourceも必要なので
今回はこちらのDBを使おうと思います。
http://www.h2database.com/html/main.html
オンメモリなDBも使うことも出来て手軽に使えます。

ここでダウンロードしてきたzipを解凍して出てきたjarファイルを
[前回](http://qiita.com/newta/items/25abfd0e43781c2a1b45) のようにjarファイルを登録します。

> ceylon import-jar org/h2 h2-1.3.174.jar 

そしてmodule.ceylonファイルにもモジュールを追記します。

> import java.base "7";
 import org.hsqldb.hsqldb "2.3.1"; 

これで準備OKです。
それではコードに行ってみましょう。

#コード

```ceylon

import ceylon.dbc { Sql }
import org.hsqldb.jdbc { JDBCPool }

void dbAccess() {
	value ds = JDBCPool();
	ds.url = "jdbc:hsqldb:mem:db";
	ds.user = "sa";
	ds.setPassword("sa");

	value sql = Sql(ds);
	sql.execute("create table messages (id integer, text varchar(20))");
	
	value count = sql.queryForInteger("SELECT count(*) FROM messages");
	print(count);
	
	sql.transaction(() { 
		sql.execute("insert into messages (id, text) values (?, ?)", 
		0, "hello world"); 
		sql.execute("insert into messages (id, text) values (?, ?)", 
		1, "goodbye world"); 
		return true; 
	}); 
	
	value count2 = sql.queryForInteger("SELECT count(*) FROM messages");
	print(count2);
	
	sql.eachRow { 
		sql = "select id, text from messages"; 
		void body(Map<String,Object> row) {
			print("{");
			for (key->item in row) {
				print("\t``key``: ``item``");
			}
			print("}");
		} 
	}; 
}

````

Sqlクラスを生成するためにDataSourceを生成します。
オンメモリでDBを立ち上げ、テーブルを作って
クエリ実行、インサートなどをしています。

見ただけで何となく分かりますよね。
トランザクションやパラメータ置き換えも良さげです。

Javaのデータソースが必須なのを除けば。。。
実際の業務ロジックでは
基盤部分のみが参照で隠蔽出来る部分かもしれないですけどね。

#まとめ

残念ながら現状ではJava連携必須。
しばらくしたらCeylonモジュールだけで動かせるようになるのかなぁ。
iOS7  blur image[磨りガラスっぽい表現を実現する]

#概要
iOS7 いろんなところで磨りガラス風なviewを使っている。実は実装は結構簡単で、SDKには提供されていないのだが、WWDC 2013のサンプルコードにUIImage+ ImageEffects のcategoryが提供されていて、method呼ぶだけでその効果が実現できます。
#実現
https://developer.apple.com/downloads/index.action?name=WWDC%202013 下のiOS_UIImageEffects プロジェクトをダウンロード、UIImage+ImageEffects.hとUIImage+ImageEffects.ｍを自分のプロジェクトにコッピー.
あとはmethodを呼ぶだけ.

```objc
switch (self.imageIndex)
    {
        case 0:
           //普通
            effectImage = self.image;
            break;
        case 1:
           //ガラス風
            effectImage = [self.image applyLightEffect]; 
            break;
        case 2:
            // applyLightEffectより透明度が下がる
            effectImage = [self.image applyExtraLightEffect];
            break;
        case 3:
            //黒いガラス風
            effectImage = [self.image applyDarkEffect];
            break;
        case 4:
           //色指定
            effectImage = [self.image applyTintEffectWithColor:[UIColor blueColor]]; 
            break;
    }
    self.imageView.image = effectImage;
```
#参考
-  iOS_UIImageEffects sample project
-  Implementing Engaging UI on iOS    session 226  
  https://developer.apple.com/wwdc/videos/
入力の受け取り方次第でTLEが怖いことになるようだった


はい。
codeforces
[http://codeforces.com/contest/373/problem/C](http://codeforces.com/contest/373/problem/C)

ネタ元ツイート
[https://twitter.com/cocodrips/statuses/412848727175331840](https://twitter.com/cocodrips/statuses/412848727175331840)
公開してらしたGist
[https://gist.github.com/cocodrips/8001370](https://gist.github.com/cocodrips/8001370)


元々のコードの全文は上記公開先を参照くださいませ。

```python:元々
if __name__ == "__main__":
    num = map(int, raw_input().split())
    num=num[0]
    data = []
    for _ in range(num):
        next=map(int, raw_input().split())
        data.append(next[0])
    solve(data)
```

```python:私の提案
if __name__ == "__main__":
    num = int(raw_input())
    data = []
    for x in range(num):
        data.append(int(raw_input()))
    solve(data)
```

テストデータはサンプルケースをてきとーにコピーして1行＋20万行のデータを用意。1行目が与えられる予定の行数で、以降の20万行がテキトーにコピーしたデータです。

いちおウチのCPUとメモリ
Processor  2.5 GHz Intel Core i5
Memory  16 GB 1333 MHz DDR3

時間計測は

```python:time
import=time
start=time.clock()
##他実行部分
end=time.clock()
t=end-start
```

```python:コメントで頂いた方法
if __name__ == "__main__":
    num = int(raw_input())
    data = (int(raw_input()) for _ in xrange(num))
    solve(data)
```

3回実行して真ん中の値を以下の表に記載


その1：元々のデータ
その2： num = int(raw_input())　の一行目の受け取り方だけ変更
その3：forで回しながらのdata.append(int(raw_input()))受け取り方だけ変更
その4：両方とも変更
その5：コメントで頂いた方法


| パターン| 処理時間 | 
|:-----------|------------:|
| その1 | 0.990795秒 | 
| その2 | 0.995793秒 | 
| その3 | 0.661866秒 | 
|その４|0.677707秒|
|その５|0.647318秒|


時間差が今回有意であったぽいのは2行目以降の受け取り方で、、、、

1行目のウチでのテストケースは200000、出題の前提条件上で最大値のTLEになってた500000とでは1行6桁の数字を受け取るだけで時間差は感じられませんでした。


その3、4とその5では一見それほど違わないようで0.65秒を切れるかどうかで早さに違いありといって良さそうでした。

オマケで試したものとして
```data.append(input())```
でintでキャストするのを外したところ数倍の時間がかかるように成ったのではずさない方が良さそうです。
Xamarin で Windows Azure モバイルサービスを使う(その2:認証編)


[前回](http://qiita.com/amay077/items/40bd5918284fd40d0edc) は、Microsoft の BaaS である Azureモバイルサービスをとりあえず使ってみる所まで紹介しました。

今回は、OAuth による認証、Twitter や Facebook でログインする機能について触れてみます。

前回用意したサンプルの続きとして進めます。

認証を組み込むためのチュートリアルはこちら

* [Get started with authentication (Xamarin iOS) | Mobile Dev Center](http://www.windowsazure.com/en-us/develop/mobile/tutorials/get-started-with-users-xamarin-ios/)

英語版だからと謝罪してくれるのは Microsoft だけですね。

## 1. モバイルサービスに認証を設定する

> Register your app for authentication and configure Mobile Services

のところです。

まずは https://manage.windowsazure.com にアクセスし、モバイル サービス から、前回作った名前をクリックします。

![](http://blog.amay077.net/assets/images/posts/using_azure_mobile_service_by_xamarin_2_01.png)

次に上部メニューからダッシュボードを選択します。表示されるページの左下の方にある「モバイルサービスURL」の値をコピーしておきます。

![](http://blog.amay077.net/assets/images/posts/using_azure_mobile_service_by_xamarin_2_02.png)

次に、どのサービスの認証を利用するかを決めます（Microsoft, Facebook, Twitter, Google）。この説明では Twitter を使うことにします。

Twitter での操作方法は下を開きます。

* [モバイル サービスでの Twitter ログイン用のアプリケーションの登録](http://www.windowsazure.com/ja-jp/develop/mobile/how-to-guides/register-for-twitter-authentication/)

説明が充実してるので上記に従ってください。要は「コンシューマ キー」と「コンシューマー シークレット」が得られれば OK です。

ではマネージメントポータルの説明に戻ります。

> 4. Back in the Management Portal

です。

上部メニューの ID をクリック、その後、「twitter 設定」に先ほど取得した コンシューマ キー とコンシューマ シークレット を貼り付けて、一番下にある「保存」をクリックします。

![](http://blog.amay077.net/assets/images/posts/using_azure_mobile_service_by_xamarin_2_03.png)

続いて、テーブルに権限を与えます

> Restrict permissions to authenticated users

のところ。

まず上部メニューの データ → TodoItem をクリックします。

![](http://blog.amay077.net/assets/images/posts/using_azure_mobile_service_by_xamarin_2_04.png)

次に、アクセス許可 をクリックし、全ての項目で「認証されたユーザーのみ」を選択します。その後「保存」します。

![](http://blog.amay077.net/assets/images/posts/using_azure_mobile_service_by_xamarin_2_05.png)

マネージメントポータル側の設定は以上です。
Twitter での認証設定を追加し、またテーブルには、認証されたユーザーでしかアクセスできない権限を設定しました。

結果、前回動かしたサンプルプログラムはこの設定を行う事で動作しなくなります。(401エラー)

次に Xamarin Studio でコードを変更していきます。

## 2. アプリケーションに認証を追加する

> Add authentication to the app

のところです。

1. 〜 7. まであります。流れは説明通りですが、クラス名や大文字小文字が微妙に違うので注意が必要です。(``TodoService`` は ``QSTodoService`` と読み替える必要があるなど)

これらを修正したソース２つ ``QSTodoService.cs`` と ``QSTodoListViewController.cs`` を gist に貼り付けました。

* [gist - QSTodoListViewController.cs and QSTodoService.cs](https://gist.github.com/amay077/7960424)

修正前との差分が見たい方は [Revisions](https://gist.github.com/amay077/7960424/revisions) で見られます。

あ、今回は Twitter なので、
``MobileServiceAuthenticationProvider.MicrosoftAccount`` を忘れずに 
``MobileServiceAuthenticationProvider.Twitter`` に置き換えてくださいね。

これでコードの修正は終わりです。

3. 動かしてみる

さて、iOS シミュレータ で動かしてみましょう。

![](http://blog.amay077.net/assets/images/posts/using_azure_mobile_service_by_xamarin_2_06.gif)

こんな感じで、Twitter による認証機能をアプリに組み込むことができました。

今日は以上です。次回は Push 通知を行ってみます。
Ceylon モジュール管理されていないjarの追加

Javaで作られたjarを追加して連携したい場合があると思います。

今回はその方法。

#コマンド実行

ceylon import-jar com/hoge hoge-1.0.jar

ceylon import-jar [登録するモジュール名] [追加したいjar]
で実行します。

するとmodulesフォルダが作られます。

このモジュールのフォルダをプロジェクトの下に作られる
modulesフォルダに追加すれば参照出来るようになります。

そして
modules.ceylonファイルに
    import com.hoge "1.0";
と言った感じで追加してあげれば
あとは利用することが出来ます。
 
まずは既存のJava部分はそのままに
Javaモジュールと連携してCeylon書いてみませんか？

import-jarの他のオプションなどは公式のこちらでどうぞ(英語)
http://web.mit.edu/ceylon_v1.0.0/ceylon-1.0.0/doc/en/toolset/ceylon-import-jar.html
日本語ユーザー名でUnityを使う

最新版のUnity(4系列)には、Windowsのユーザー名が日本語だと"Error Loading Page Couldn't read a file:// file "というダイアログが出て初回起動に失敗するというバグがあります。Windows8の仕様により日本語ユーザー名でアカウントが作成されてしまう現象と合わさって、このバグは致命的なものとなっています。
ググると「日本語でない名前のユーザーアカウントを作成する」や「このバグが発生しない古いバージョンのUnityを使う」などの解決策が出てきますが、いずれもデメリットが大きいものです。デメリットのないバグの解決方法を自分用のメモも兼ねて書いておきます。
***
まずPCをインターネットから切断し、その状態でUnityを起動します。こうすると初回起動時に行われる自動オンラインアクティベーションに失敗しマニュアルアクティベーションを求められるので、出てきたダイアログの"Save License"ボタンを押してファイルを適当な場所に保存します。
続いて、インターネットに接続し https://license.unity3d.com/manual にアクセスします。すると先ほど保存したファイルを求められるので選択して次に進みます。その後のプランの選択やアカウント作成は適当に。最後にライセンスファイルがダウンロードできるのでそれを適当な場所に保存します。
そして再びインターネットから接続してUnityを起動し、マニュアルアクティベーションのダイアログの"Load License"ボタンを押して、ダウンロードしたライセンスファイルを指定してやれば完了です。
一度この手順が完了すれば後は安定して動作するようです。
Riakで値が衝突したらどうなるのか

例えば2台で構成されたRiakクラスタがあったとして、ちょうどLANケーブルが引きぬかれたタイミングで、それぞれのノードにkeyが同じでvalueが異なる値がコミットされたとする。
その後LANケーブルをさしてクラスタが復旧し、アプリケーションが問い合わせを行うとどうなるのか　みたいな話。

## 同じkeyを入れたらどうなるのか
「ここに書き込んでおけば安心確実」というMasterという名のシングルポイントは、Riakには無い。
とりえあえず全部入れといて、衝突が起きた時はその値をまるっと返す。
これでアプリケーションは衝突が発生したことが分かるので、ある処理で衝突を解決することができる。
それはVector Clocksという、Riak内部での論理的な時計による時間によるものだ。
（実時間を用いたCentral Clock Systemは、同じRiakクラスタ内に属する独立したHWの物理時計がそれぞれ完全に同期していれば、有効だったのかもしれない。）
[去年のAdvent Calendar](http://kuenishi.hatenadiary.jp/entry/2012/12/05/233000)にわかりやすい記事が載っているので参照してほしい。

とりあえずこの記事に沿って手を動かしてみる。
同じbucketsで同じkeyに、異なる値を２つ入れる。
これは冒頭にある、分断されたタイミングで２つのノードに別の値がコミットされ、その後復旧した直後を想定している。

```
➜  riak git:(a12d5a2)  curl -XPUT http://localhost:8098/buckets/mybucket/keys/mykey -d "data1"
➜  riak git:(a12d5a2)  curl -XPUT http://localhost:8098/buckets/mybucket/keys/mykey -d "data2"
➜  riak git:(a12d5a2)  curl http://localhost:8098/buckets/mybucket/keys/mykey
Siblings:
6Nq2S4gV70XThAnmRyJ8Tj
nLA0G7skzElvkydPZblK
```
問い合わせを行って返って来たのは、vtagという値だ。
衝突が発生している。
vtagは値そのものではない。
値を取得するためには、RESTの場合はvtagをパラメータとしてGETする。

```
➜  riak git:(a12d5a2)  curl http://localhost:8098/buckets/mybucket/keys/mykey?vtag=nLA0G7skzElvkydPZblK
data1

➜  riak git:(a12d5a2)  curl http://localhost:8098/buckets/mybucket/keys/mykey?vtag=6Nq2S4gV70XThAnmRyJ8Tj
data2
```
これでデータを引き出すことができるので、アプリケーションで解決をして完了だ。

ちなみに、シブリングが発生した状態でGETすると、VClockの値を見ることができる。

```
➜  riak git:(a12d5a2)  curl -v http://localhost:8098/buckets/mybucket/keys/mykey
(中略)
< X-Riak-Vclock: a85hYGBgzGDKBVIcypz/fgat3VuWwZTIlMfKMP+kyhm+LAA=
(後略)
```
アプリケーションによる衝突解決で一つに確定した値で上書きし、その他のデータを消すには、Vclockの値を使う。

```
➜  riak git:(a12d5a2)  curl -X PUT  http://localhost:8098/buckets/mybucket/keys/mykey \
> -H 'X-Riak-Vclock: a85hYGBgzGDKBVIcypz/fgat3VuWwZTIlMfKMP+kyhm+LAA=' -d 'resolved!'
➜  riak git:(a12d5a2)  curl http://localhost:8098/buckets/mybucket/keys/mykey
resolved!
```
こうして、Riak内は平和に保たれた。

## CRDT
Riak2.0では、より強力な衝突解決の機能が導入される予定だ。
CRDTというアルゴリズムに基づくRiakの新機能は、Bucketのデータ型を予め指定しておくとPUTしただけで最新の値に更新される、という画期的なものらしい。
アプリケーションを書くのが更に楽になる。
とても便利！

## まとめ
データが「分散している」というのは、RDBのようにはイメージを持ちにくいかもしれない。
アプリケーションの作成には、Riakの特徴を理解したロジックが必要になるかもしれない。
それに必要な概念やコンセプトも、RiakドキュメントやBasho公式ブログには沢山載っている。
時間があれば、良く読んでみたいところだ。

## その他参考文献

* http://basho.co.jp/tag/riak-data-types/
* http://www.slideshare.net/shino/riak-meetup-3-20131106-riak-meetup3riak20pre5
* https://gist.github.com/shino/a8da9791926976122b8a
bash で 0埋めされた数値文字列の不要な0を削除する（または0で始まる文字列を10進数として扱う）

## 悩み

たとえば `0010` という文字列を `10` という文字列にしたい。または、 10 という数値として処理したい。

もちろん、`0000` の場合は `0` が適切である。

簡単にいけるかと思ったが、数値文字列を数値として扱う場合、0で始まる文字列を 8進数として扱う仕様があり、悩まされた。なお、sed などの万能ツールは使わない。

```
$ STR="0010"
$ echo ${STR##*0} #=> 空文字列になってしまう
```

そもそも最初はパラメータ展開でいけると思ってたんだけど、普通に失敗。

```
$ expr “$STR” “+” “0”  #=> 10になるけど負けた気がする
$ expr "$STR" #=> 10 になる。というか1引数でいけたのか expr
$ echo $(( $STR + 0 )) #=> 8 になってしまう
$ echo $(( $STR  )) #=> 8 になってしまう。
$ printf "%d" $STR #=> 8 になってしまう
```

整数型の変数にしてみても、

```
$ declare -i B="0010"
$ echo $B #=> 8 になってしまう
```

一緒なわけだ。

これは、そもそも「0010」という文字列を数値に変換する際に 8進数として変換されてしまうからだ。変数の型の問題ではない。

expr がうまく機能するのは、 expr に引数が文字列として渡されているからだ。bash 上で文字列を数値に変換する処理が走ってしまうと失敗する。だから、似たような処理をしてても `$(( ))` による展開だとうまくいかない。値がその場で型変換されて、bash の文字列-数値の変換ルールに従って8進数扱いされてしまう。

## “[base]#n” の意味

bash の man を見るとARITHMETIC のセクションに、以下のような記述がある。

```
Otherwise,  numbers  take  the form [base#]n, where the optional base is a decimal number between 2 and  64 representing  the  arithmetic base, and n is a number in that base.
```

で、最初ここの意味がわからなかった。というかいくつか試してみて「あれ、動かなくね？」と悩んだ。

算術処理をする際、10進数で強制的に扱いたいなら文字列の頭に “10#” とつけちゃえばいいって話なんだけど、bash で算術処理が走るケースでなければ意味はない。文字列として変数がプロセスに渡された後ではこのルールは有効ではない。

実のところ、何も考えずに出力したとき「10」が「8」として出力されてしまう、つまりそのように扱われてしまうケースにおいて意味があるということである。

だから、

```
$ echo $(( 10#${STR} )) #=> 10 になる
$ printf "%d" $(( 10#${STR} )) #=> 10 になる
$ declare -i C=10#$STR
$ echo $C #=> 10になる
```

完璧。

なんだけど、引数を文字列として扱ってる場所ではうまくいかない。

expr はこうなる。

```
$ expr 10#$STR "+" 0

expr: not a decimal number: '10#0010'
```

もちろん、普通に echo しても

```
$ echo 10#$STR
10#0010
```

こうなる。

printf も同様である。

```
$ printf "%d" 10#$STR
-bash: printf: 10#0010: 無効な数字です
10
```

あくまでも、bash そのものが値を文字列から数値に変換する場合の仕様であることを理解すればそれほどややこしい話ではない。ルーク、bash の気持ちになるんだ。
里々とは

この記事は[マイナー言語 Advent Calendar 2013](http://qiita.com/advent-calendar/2013/minor-language) の17日目です。

# 里々とは
[伺か(ukagaka)](https://www.google.co.jp/search?q=伺か)というデスクトップマスコットの実行環境があります。このデスクトップマスコットのことを伺かではゴーストといい、このゴーストのAIを担当するプログラムのことを[SHIORI](http://usada.sakura.vg/contents/specification2.html#shiori)（栞）とよびます。
[里々(satori)](http://ms.shillest.net/satoriya.xhtml)はその栞の一種で、とにかく簡単にゴーストのプログラミングができるため、もっとも人気な栞のひとつです。

さて、今回は例として艦隊これくしょんのキャラクターのセリフを書いてみましょう。

# トーク
キャラクターのおしゃべりをこんな風に書けます。

```
＊OnBoot
：英国で産まれた帰国子女の金剛デース！
ヨロシクオネガイシマース！
```

簡単ですね。

「＊ラベル名」でトークを定義できます。
「OnBoot」はその名のとおりのシステムイベントです。伺かはイベント駆動です。

```
＊出撃
：連装砲ちゃん、一緒に行くよ
：[＞ヮ＜]
：しまかぜ、出撃しまーす！
```

トーク行頭についている「：」は、たとえば島風と連装砲ちゃんといった二人で一組のキャラクターを会話させるのに使う機能なのですが、艦これではキャラクター同士の会話がほとんどないため、今回はほとんどつかいません。

# ジャンプ

```
＊OnMouseDoubleClick
＞母港/詳細閲覧

＊母港/詳細閲覧
：紅茶が飲みたいネー

＊母港/詳細閲覧
：HI!今日もイイ天気ネー！

＊母港/詳細閲覧
：HEY！提督ぅー。触ってもイイけどサー、時間と場所をわきまえなヨー！
```

「＞ラベル名」で他のトークへジャンプできます。
おなじラベル名のトークが複数あると、ランダムに選ばれます。

# 条件ジャンプ
条件ジャンプも使えるので時報トークも簡単につくれます。

```
＊OnMinuteChange
＞０分【タブ】（現在分）＝＝０
＃条件ジャンプ

＊０分
＞（現在時）時
＃ジャンプ先のラベル名を動的に決められるのでこんなこともできる

＊０時
：午前零時justデース！

＊１時
：午前一時。提督は働き者デース
```

「【タブ】」はタブキーです。全角スペースも半角スペースもダメです。
行頭「＃」はコメントアウトです。行頭以外ではコメントアウトになりません。
「（変数名）」で変数を参照できます。「（現在時）」と「（現在時）」は環境変数です。

# 変数

トーク内ではジャンプの他、変数宣言もできます。
金剛の放置ボイスを作ってみましょう。

```
＊OnSatoriBoot
＄放置時間【タブ】０

＊OnMouseClick
＄放置時間＝０

＊OnMinuteChange
＄放置時間＝（放置時間）＋１
＞放置時【タブ】（放置時間）＞５

＊放置時
＄放置時間＝０
：目を離さないでって言ったのにー
提督ぅー。何してるデース！
```

「＄変数名【タブ】式」で変数代入できます。型は基本的に文字列しかないです。
「＄変数名＝式」で代入すると、式である文字列が計算可能であれば計算してから代入されます。計算できなければそのまま文字列が代入されます。特にエラーとか吐きません。

# 単語群
単語群を使うことで語彙を広げることもできます。

```
＊遠征選択時
：Wow！（つづきのセリフ）！

＠つづきのセリフ
Congratulations
提督にプレゼンツネー
```

「＠ラベル名」で単語群を定義できます。
「（単語群名）」で単語群を呼ぶと、単語群の中からランダムに単語が選ばれます。
これを使うと[コピペジェネレータ・ジェネレータ](http://tanakh.jp/tools/copipe-gen-gen.html)みたいなトークを簡単に作ることができます。

艦これのキャラクターのセリフは全て上記の機能だけで記述することができます。

# 関数
「（関数名、引数）」というように括弧に引数をつけることで内部関数を呼び出すこともできます。

```
＊OnMouseClick
：（call、足し算、1、1）

＊足し算
：（A0）＋（A1）は（call、add、（A0）、（A1））だよー。

＠add
（calc、（A0）＋（A1））
```

callという内部関数はトークや単語群を引数付きで呼び出す関数です。
またcalcは式を計算式としてパースして結果を返す関数です。

さて、この関数を使うことでLispのようなプログラム（見た目だけ）をかけるようになるのですが、詳しくはこちらで。
- [レゴキチ/里々自作関数まとめ](http://emily.shillest.net/specwiki/index.php?%E3%83%AC%E3%82%B4%E3%82%AD%E3%83%81%2F%E9%87%8C%E3%80%85%E8%87%AA%E4%BD%9C%E9%96%A2%E6%95%B0%E3%81%BE%E3%81%A8%E3%82%81)
- [うかべん 資料 - リリカル☆Lisp開発日記](http://blog.bugyo.tk/lyrical/archives/181)

----------------------
興味をもたれたらこちら
- [里々wiki](http://soliton.sub.jp/satori/)
Amazon Linux にログインしたお友だちをびっくりさせちゃおう！

お友だちの Amazon Linux にこんなスクリプトを実行権限付きで置いちゃおう！

```bash:/etc/update-motd.d/40-surprise
#!/bin/sh
today=$(date +%m/%d)
if [ $today == "12/24" -o $today == "12/25" ]; then
cat <<EOF
 ・　☆ .　・　. ・ . ・　. ・ .　　・.　　　　　・ .
　・ ** .　　・ 〇 ・　Merry Christmas!!　・ .
 ・ ***N . ・ ｏ　　　・ .　　.　・　　　　　　　　　　・
 . *i**** ・ . o ・　　　　・　　　　　　・ 　　　・
　X***J*** 　 　 　　＿П　／＼／＼　・　　　　　・
　**X*****o*　　／＼ Ц＼・　／＼　＼　 ・Д.
******%*****／　仝　＼____＼ 　／＼　＼　(´｀) ・
++++ || ++++| П | 田 |++++ ||.| +++　　 ( ： )・
EOF
```

きっとびっくりするよ！

# 参考

 * [A Sense Of Identity: changing motd on amazon EC2 linux](http://blog.arnaudlacour.com/2012/11/changing-motd-on-amazon-ec2-linux.html)
 * [Lee : MOTDs on Amazon AMIs](https://coderwall.com/p/hr_9pw)
2Dアニメーションのメソッド呼び出しが凄く便利


4.3から追加された2Dのアニメーションエディタではアニメーションの好きなタイミングでアタッチしてるスクリプトのメソッド呼べるので超絶便利です。
![Edit Animation Event](http://gyazo.com/5f62da17130baff5e858d935476bf0b3.png)

ただ、これはメソッドしか呼べないのでデリゲートとか使って汎用的に使おうとした場合、下記のような感じのスクリプトをアタッチしておくと楽そうです。

```csharp
public class AnimationObserver : MonoBehaviour {
	public Action animationEndNotify;

	public void Notify()
	{
		if(animationEndNotify != null)animationEndNotify();
	}
}
```
実際のロジックを書いてるクラスから `animationEndNotify` を設定するイメージ。
通知するだけなので新規にイベントハンドラ定義しなくてもActionで済みそう。
親を再帰的に上っていく

下記例はRigidbody(剛体)を親を含むご先祖様が持っているか再起的に調べています。

```java
using UnityEngine;
using System.Collections;

public class Test : MonoBehaviour {

	void Start () {
		Rigidbody rb = findInParents<Rigidbody>(transform.parent);
		
		if (rb !=null){
			Debug.Log (rb.mass);
		}else{
			Debug.Log (rb);
		}
	}

	private T findInParents<T> (Transform trans) where T : Component{
		/* 指定トランスフォーム(=引数)から親トランスフォームを再帰的に上り
		 * 指定のコンポーネント(=T)をもっているか調べて
		 * 持っている場合は、そのコンポーネントを
		 * 持っていない場合は、Nullを戻す
		 */

		// 指定トランスフォームの指定コンポーネントを取得
		object comp = trans.GetComponent<T>();

		// 指定トランスフォームが指定コンポーネントを持っていない場合
		if (comp == null){
			// 親トランスフォームを取得
			Transform t = trans.parent;

			// 親があり且つ、親が指定コンポーネントを持っていない場合
			while (t != null && comp == null){
				comp = t.gameObject.GetComponent<T>();
				t = t.parent;
			}
		}
	
		return (T)comp;
	}
}
```
UnityでUnitTest

ちょっと前からこんなの公開してますｗ
https://github.com/gree/UniUnitTest

でも、直後本家からも出た！
https://www.assetstore.unity3d.com/#/content/13802

まあ、目の付け所は良かったということで・・・・



ここってこういうこと書く場なのかな・・・？
あんまりこういうのかかないから解らない
PythonとPHPで文字列分割をして配列の最後の要素を取得


#たまにやる処理

https://qiita.com/n0bisuke/items
といったURLから最後の部分を抜き出したい
##PHP
```PHP:split.php
$url = "https://qiita.com/n0bisuke/items";
$tmp = explode("/", $url);
$end_word = end($tmp);
```

##Python
```Python:split.py
url = "https://qiita.com/n0bisuke/items"
tmp = url.split('/')
end_word = tmp[-1]
```

Pythonの場合は[-1]を指定することで最後尾から数えることが出来るってのがPHPには無い特徴かも．[-2]を指定すれば最後尾から二番目を取得することができる