OmniAICreator/Qiita-1.07M huggingface dataset:
Google Drive に保存した画像を直接呼び出せるURLの取得

## 2022.3.30 追記
問題がない。
いまもゆうこうのようだ。

しかし最近はGyazoばっかり使っている。

## 2021.3.31 追記
この方法は現在も有効です。

以下のチェックマーク画像はこの記事で解説している方法で、Google Drive にアップした画像を指定しています。

![](http://drive.google.com/uc?export=view&id=1N-e9qReHHg18NK6CUvTOyb1QQaf0NR6H)

また、公開範囲は「リンクを知っている全員」に設定している必要があります。

![4a6bf0a693c5b60745cd72ed000454e2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106866/e47100ca-a9ba-b451-6938-686b3568d015.png)

---

## 2019.10.10 追記
この方法は現在も有効です。

## 概要
個人的にパソコン内がすぐごちゃごちゃになるタイプなので、
その時しか使わないような、WEBスクリーンショットなどは、一時的にでもローカルに落としたくない。

個人的によく使うスクショ拡張機能などは、直接Google Driveにデータを渡せるものも多い。
なので、直接呼び出せると個人的には非常に便利だ。

~~GitHub~~ や Qiita に手軽に画像を載せたい時にも Google Drive を利用できる。
* GitHubには画像アップロード機能が有りますので、Markdown入力欄に画像ファイルをドロップすれば、
アップロード&貼り付け出来ます。

活用シーンはいろいろあると思いますので、覚えておいて損はない。


## 方法

そのままだと、URLはこのようになっています。

```
https://drive.google.com/open?id={ID}
https://drive.google.com/file/d/{ID}/view?usp=sharing
# {ID} 部分にはファイル個別の文字列が入る
```

これでは、<code>img</code>タグなどで表示されません。
しかし、以下のように書き換えると表示されます。

```
http://drive.google.com/uc?export=view&id={ID}
```



## 参考
~~Google Driveに入れた画像を直接表示するパスを取得する~~ リンク切れ


## さいごに
最後までお読み頂き有難うございました。
間違いや改善点などございましたら、遠慮無くご指摘頂けましたら幸いです。
ご質問やそれ以外のコメントも歓迎です。
一発でowncloudを設定する方法

下記のシェルを実行して下さい。

その後DB設定して# http://localhost/owncloud/
にアクセスすればおっけです

```
mysql -u root -p

CREATE DATABASE owncloud;
GRANT ALL ON owncloud.* to 'owncloud'@'localhost' IDENTIFIED BY 'owncloud';
```


```
#!/bin/bash


echo "＋------------------------------------------------------------------------------------------------------------＋";
echo "■setup start " ${0};
echo "＋------------------------------------------------------------------------------------------------------------＋";

echo ;
echo "□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□";
echo "【git-2.X.X インストール】";
echo "□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□";

# レポジトリ設定
cd /etc/yum.repos.d/

# php 5.3対策
yum install -y http://rpms.famillecollet.com/enterprise/remi-release-6.rpm

# owncloudレポジトリ 
sudo wget http://download.opensuse.org/repositories/isv:ownCloud:community/CentOS_CentOS-6/isv:ownCloud:community.repo


sudo yum install -y --enablerepo=isv_ownCloud_community,remi owncloud

sudo yum install -y mysql-server


sudo chkconfig httpd on
sudo chkconfig mysqld on


sudo service httpd start
sudo service mysqld start

# mysql -u root -p
# 
# CREATE DATABASE owncloud;
# GRANT ALL ON owncloud.* to 'owncloud'@'localhost' IDENTIFIED BY 'owncloud';
# 
# http://localhost/owncloud/
# http://127.0.0.1/owncloud/
# http://192.168.10.33/owncloud/
echo "＋------------------------------------------------------------------------------------------------------------＋";
echo "■setup end";
echo "＋------------------------------------------------------------------------------------------------------------＋";

```
[Python] unixコマンドを実行する(subprocess)

#設定
環境：
OSX Yosemite
Bash
Python3.5.0

Python上でUnixコマンドの出力を獲得したい．
※ShellScript等書いたほうが早いです．


# Unixコマンド
MacのOSXはUNIXがベースになっているのでそれ使います．(ls, touch, cat等)

#os.system
標準ライブラリ`os`
こちらでも，Unixコマンドは使えるのですが，返り値が文字列として得られないのです．（得られるかもしれないけど知らない）（Terminalに出力されるだけ）
普通に，touch等のコマンドのファイル操作系であれば、コチラだけで用が足りる．
cat，grep等のコマンドである場合，文字列として得られないのです．


#subprocess
参考にしたリンクはこちら
17.5. [subprocess](http://docs.python.jp/2.7/library/subprocess.html#module-subprocess) — サブプロセス管理
この中の`subprocess.check_output`を使います。
使い方としては、引数に文字列を入れるわけですが、二通りあって、まず、デフォルトで使う場合には、
`check_output(["cut", "-d", "test.txt"])`
とします。
もう一つは、引数に`shell=True`を使うことで、文字列を渡すと実行できるようになり、
`check_output("cut -d test.txt", shell=True)`
詳しくは参考にしたURLにこう書いてあります。
>Unix で shell=False の場合 (デフォルト): この場合、 Popen クラスは子プログラムを実行するのに os.execvp() を使います。 文字列が引数として与えられた場合、実行されるプログラムの名前かパスとして使われます；ただし、プログラムは引数無しの場合のみ動作します。

######
>Unix で shell=True の場合: args が文字列の場合、シェルを介して実行されるコマンドライン文字列を指定します。文字列は厳密にシェルプロンプトで打つ形式と一致しなければなりません。例えば、文字列の中にスペースを含むファイル名がある場合、はクォーティングかバックスラッシュエスケープが必要です。 args が文字列の場合には最初の要素はコマンド名を表わす文字列としてそして残りの要素は続く引数としてシェルに渡されます。これは、以下の Popen と等価ということです。

###簡単なサンプル
適当にファイル作って、2列目を獲得する(cut -d, -f2)サンプルです。
3系なのでbytesで値が帰ってきます。（str返してくれるオプション(キーワード引数)ありそうだけど）
３系の場合、返ってくるのがbytesなので、コードの最後にありますが、`universal_newlines=True`つけるとstrで返ってきます。

```subprocess_test.py
>>> open("test.txt", 'w').write('\n'.join(([repr([i, i+1, i+2]).replace(' ', '') for i in range(5)])))
39
>>> open("test.txt").read()
'[0,1,2]\n[1,2,3]\n[2,3,4]\n[3,4,5]\n[4,5,6]'
>>>
>>> import subprocess
>>> subprocess.check_output(["cut", "-d,", "-f2", "test.txt"])
b'1\n2\n3\n4\n5\n'
>>> subprocess.check_output("cut -d, -f2 test.txt", shell=True)
b'1\n2\n3\n4\n5\n'
>>> subprocess.check_output("cut -d, -f2 test.txt", shell=True, universal_newlines=True)
'1\n2\n3\n4\n5\n'
```

##まとめ
大体、ShellScript書いたほうが早いですが、参考までにPythonでUnixコマンドの実行方法を書きました。
Atomをstyle.lessの記述のみで光らせる

**Atomいいですね**
![スクリーンショット 2016-01-16 1.33.34.png](https://qiita-image-store.s3.amazonaws.com/0/100732/b3ccdff2-74b6-e710-39d3-6850497313d9.png)

何がいいって、エディタをCSS(less)でいろいろできるところがいいです。
冬なのにイルミネーションを見に行かなかったので、文字を光らせます。

# style.less のatom-text-editor{}内に以下を追加
```css:style.less
    text-shadow:
        0 0 0px #555555,
        0 0 0px #888800,
        0 0 0px #555555,
        0 0 10px rgba(135,135,135,1),
        0 0 10px,
        0 0 13px,
        0 0 15px;
```
数値はお好みで（自分も試行錯誤中）
文字の近くは灰色を指定
遠く４つ目の引数に色を指定しないことで
シンタックスハイライトの色のまま光ってるように見えるのがポイント


######参考にしました。
[TM Life](http://tmlife.net/web/css3/css3-text-shadow-emphasis-decoration.html)
[9ineBB](http://9-bb.com/text-shadow%E3%81%A7%E7%99%BA%E5%85%89%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%81%8B%E3%81%AE%E3%82%88%E3%81%86%E3%81%AA%E6%96%87%E5%AD%97%E3%82%92%E4%BD%9C%E3%82%8B%E6%96%B9%E6%B3%95-%E3%80%90css/)
Pythonについての質問(初心者)

最近プログラミングに興味を持ち本日から学習を始めました。code_academyという海外のサイトで実践練習に取り組んでいます。
そこで次のような計算式が出てきました。
10%2
これは単純な割り算として考えて宜しいのでしょうか。
私の認識としては、割り算は
10/2
のように表示されるのではと思うのですが？
ご教示頂けると幸いです。
Pythonでスクレイピング - Yahoo!ファイナンスから投資信託の基準価格を取得する

#この記事について
Pythonとlxmlを使って、webスクレイピングでYahoo!ファイナンスから投資信託の基準価格を取得する方法を解説します。

**[追記] Yahoo!ファイナンスからのデータスクレイピングは規約上禁止されているようなので、代わりの方法を利用ください。**
[Pythonでスクレイピング - 投信協会webから投資信託の基準価格を取得する](http://qiita.com/sawadybomb/items/c3f7f986f9dd133a94c1)

##環境
Windows10 x64
Python 2.7.11
lxml 3.5.0

##変更履歴
2016/1/16

- lxml.html.parse()にurlを直接渡すようにした。urllib2のimportを無くした。
- url生成の際に引数をdictに取ってからformat()で展開するようにした。
- forの回し方を変更
- ElementTreeからXPathで取得した要素に.encode('utf-8')する処理をあらかじめmap()でやっておくことにした

#手順
##取得したいデータの位置を確かめる
webスクレイピングではHTML/XML中の特定の位置にあるテキストを抽出するのが目的となるため、まず対象のデータ位置を確認します。この際、Chromeの検証機能が使いやすいです。（以下参照）

[Chromeデベロッパー・ツール（要素を検証）の基礎的な使い方](https://ferret-plus.com/1880)

ページを右クリックして「検証」を選択します。(Ctrl+Shift+Iでもよい)
すると画面右半分にHTML要素が現れ、タグを選択すると画面上の対応する部分が反転します。これを使って取得したいデータを特定できるところまで掘り下げていきます。

なおYahoo!ファイナンスの場合は以下の様な階層となっています。
`
<html>
 <body>
  <div id="wrapper">
   <div id="contents">
    <div id="contents-body">
     <div id="main">
      <div class="padT12 marB10 clearFix">
       <table class="boardFin yjSt marB6">
        <tbody>
	 <tr>
	  <td>
           ここに基準価格とか
`
##取得したいデータ位置をXPathで書く
XPathとはHTML/XML文書中の任意のコンテンツの位置を表すためのフォーマットです。Chromeでは右クリック -> Copy -> Copy Xpath 
でXPathが取得できます。（以下参照）

[Chromeだけで任意のノードのXPathを簡単に取得 たぶん革命](http://ptech.g.hatena.ne.jp/noromanba/20120528/1338307299)

今回はid=mainのdiv要素以下にあるテーブルのtd要素がすべてほしいので以下のようにしました。
`
//*[@id="main"]/div/table//td
`

##parser()でHTMLを取得し、XPathで必要な要素を抽出する
ここからはPythonで行います。urlをlxml.html.parser()に渡してHTML_Elementsを取得し、そこからXPathで指定した要素を抽出します。最後に型式を整えて[日付, 基準価格, 純資産総額]型式のリストで出力します。日付は最後にyyyymmdd型式の文字列としました。

```py:getNAV.py
# -*- coding: utf-8 -*-
# python 2.7
import lxml.html
import datetime

def getNAV(fundcode, sy, sm, sd, ey, em, ed):
    # 引数をdictに突っ込む
    d = dict(fundcode=fundcode, sy=sy, sm=sm, sd=sd, ey=ey, em=em, ed=ed)

    # dictをアンパックしてURL生成
    url = 'http://info.finance.yahoo.co.jp/history/?code={fundcode} \
        &sy={sy}&sm={sm}&sd={sd}&ey={ey}&em={em}&ed={ed}&tm=d'.format(**d)

    # ElementTreeを取得
    tree = lxml.html.parse(url)

    # 日付, 基準価額, 純資産の要素をすべて取得しつつ、mapを適用してutf-8化とカンマ除去
    contents = map(lambda html: html.text.encode('utf-8').replace(',',''), tree.xpath('//*[@id="main"]/div/table//td'))

    # ひとつのリストになっているので[[date, price, cap], [date, price, cap], ...]と分ける
    res = []
    for i in range(0, len(contents)-1, 3):
        date = datetime.datetime.strptime(contents[i], '%Y年%m月%d日').strftime('%Y%m%d')
        price = int(contents[i+1])
        cap = int(contents[i+2])
        res.append([date, price, cap])

    return res

if __name__ == '__main__':
    # dictにパラメータを突っ込む
    args = dict(fundcode='64311104', sy='2015', sm='12', sd='1', ey='2015', em='12', ed='20')
    # dictごと渡してアンパック
    print getNAV(**args)
```

# 参考にした記事
[lxml - Processing XML and HTML with Python](http://lxml.de/index.html)
[lxmlでスクレイピングするときのコツ](http://www.regentechlog.com/2014/08/06/lxml-scraping/)
[[Python] lxmlでスクレイピングのメモ](http://taichino.com/programming/python-programming/3153)
【Objective-C】RLM unicodeをiOSで表示したいが、日本語仕様の場合にハマる問題

### 現象
アプリを作っていてRLM unicode（以降RLM）を使用する機会があったが、RLMとLRM unicode（以降LRM）を混在させ、かつRLMが先頭の場合右から表示され、ハマったため自分用メモ。

※ RLM unicode : Right to Left mark
※ LRM unicode : Left to Right mark

Objective-Cに限ったことではないかもしれないが、たまたまObj-C書いていてハマったので。

## 結論
RLMを文字列の先頭に使用した場合、画面表示としては右から表示される。
iOS上では先頭文字がLRM or RLMを判定してどちらの方向から表示するか決めているようだ。

以下具体例。

```ViewController.m
        self.label = [[UILabel alloc] initWithFrame:CGRectMake(0,0,50,10)];
        NSString *RLMString = @"فلس";
        NSString *LRMString = @"AAA";
        NSString *disp      = [RLMString stringByAppendingString:@" → "];
        disp  = [disp stringByAppendingString:LRMString];
        self.label.text = disp;
        NSLog(@"disp : %@", disp);
        [self.view addSubview:self.label];
```

実行結果
　　　　　disp : فلس → AAA

コンソール上には上記が表示されるが、ディスプレイ上には
　　　　　AAA　→　فلس
と表示される。

### 対処方法
先頭文字にアラビア文字を使いたい、が左オリジンで表示させたい場合文字を素直にLRMで置き換えてあげる必要がある。
GoでhttpリクエストにHostを設定するにはreq.Headerではなくreq.Hostを使う

ちょっとハマったのでメモです。
GoでhttpリクエストにHostを設定するには [http.Request](https://golang.org/pkg/net/http/#Request) の `Host` フィールドを設定します。 

コード例はこんな感じです。

```go
    u := "http://127.0.0.1"
    req, err := http.NewRequest("GET", u, nil)
    if err != nil {
        return err
    }

    req.Host = "example.com"

    resp, err := client.Do(req)
    if err != nil {
        return err
    }
    defer resp.Body.Close()
```

`req.Host = "example.com"` のところを `req.Header.Set("Host", "example.com")` とか `req.Header.Add("Host", "example.com")` と書くと Host ヘッダーが設定されなくてハマりました。 

[Issue 7682 - go - net/http: Setting custom "Host" request header doesn't have effect - The Go Programming Language - Google Project Hosting](https://code.google.com/p/go/issues/detail?id=7682)というイシューがあって正しい書き方にたどりつけました。
GitLabにプッシュした内容が反映されない場合の対処


大体、sidekiqが問題になっているケースが多い。

## プッシュが反映されないよ><
### パターン１
#### sidekiqのプロセスが行方不明そう
	
* psで本当にプロセスがいないか確認する。

	```bash:~/gitlab/
	ps -ef | grep sidekiq
	```

* sidekiqの起動を行う。

	```bash:~/gitlab/
	bundle exec rake sidekiq:start RAILS_ENV=production
	```

* プロセスが上がったか確認する。

	```bash:~/gitlab/
	ps -ef | grep sidekiq
	
	# こんなん出ればOK
	git      28050     1  0 Jan13 ?        00:05:51 sidekiq 4.0.1 gitlab [0 of 5 busy]
	```


### パターン２
#### sidekiqはいるパターン。ただし、仕事しているとは言ってない

* プロセスは上がっているか確認する。

	```bash:~/gitlab/
	ps -ef | grep sidekiq
	
	# こんなん出ればNG
	git      28050     1  0 Jan13 ?        00:05:51 sidekiq 4.0.1 gitlab [5 of 5 busy]
	```

* GitLabをリロードする&Redisキャッシュのクリア

	```bash:~/gitlab
	# unicornのconfig読みなおし、sidekiq再起動
	/etc/init.d/gitlab reload
	# Redisキャッシュのクリア
	bundle exec rake cache:clear RAILS_ENV=production
	```

* プロセスが上がったか確認する。

	```bash:~/gitlab/
	ps -ef | grep sidekiq
	
	# こんなん出ればOK
	git      28050     1  0 Jan13 ?        00:05:51 sidekiq 4.0.1 gitlab [0 of 5 busy]
	```

## 確認
GitLab管理者画面の[Background jobs](http://localhost:8080/gitlab/admin/background_jobs)から`待機状態`がなくなればOK
Gruntで複数のJSONファイルを結合する

JSONファイルが長くなると管理が難しくなるので、個別のJSONファイルを更新して
Gruntで結合することにした。

## 結合前

```lang:file
project
　├ app
　├ json-src
　　├ book-1.json
　　├ book-2.json
　　└ option.json
```

book-1.json

```lang:json
{
  "title": "Title-1",
  "auther": "auther1",
  "description": "Title-1 description"
}
```

book-2.json

```lang:json
{
  "title": "Title-2",
  "auther": "auther2",
  "description": "Title-2 description"
}
```


option.json

```lang:json
{
  option:{
    info1: "...",  
    info2: "..."  
  }
}
```

## 結合後のイメージ
```lang:file
project
　├ app
　├ book-all.json ← コレ！
　├ json-src
　　├ book-1.json
　　├ book-2.json
　　└ option.json
```

book-all.json

```lang:json
{
  book:[
    {
      "title": "Title-1",
      "auther": "auther1",
      "description": "Title-1 description"
    },
    {
      "title": "Title-2",
      "auther": "auther2",
      "description": "Title-2 description"
    }
  ],
  option:{
    info1: "...",  
    info2: "..."  
  }
}
```
## grunt.js
```
var fs = require('fs');

grunt.task.registerTask( 'build-json' , '' , function(){

	console.log('\n\n\n- - - - JSON連結開始 - - - - -\n\n');

	// 結合用データ
	var resultObj = {
		book:[],
		option:{}
	};

	// 対象フォルダ「./app/json-src/」
	grunt.file.recurse('./app/json-src/', process );

	// 対象フォルダに対し、再帰的処理
	function process(abspath, rootdir, subdir, filename){

		// 処理対象はJSONファイルに限定
		// option.jsonは別処理したいのでここで除外
		if( filename.indexOf('book') > -1 && filename.indexOf('.json') > -1 ){
			// JSONの読み込み
			var bookObj = JSON.parse(fs.readFileSync( abspath , 'utf8'));
			resultObj.book.push( bookObj );
		}

	}

	// 残りのoption.jsonを統合
	var optionObj = JSON.parse(fs.readFileSync( './app/json-src/option.json' , 'utf8'));
	resultObj.option = resultObj;

	console.log('結果検証：', resultObj );

	// String化してファイルに書き込む
	// stringifyの第２,3引数をこういうふうに書くと整形されたJSONにしてくれる。すばらしい。
	grunt.file.write( './app/book-all.json' , JSON.stringify(resultObj,null,'    ') );

});
```

実行
```grunt build-js```
OrgモードのテーブルをMarkdown形式のテーブルに変換

## はじめに
Orgモードのテーブルは記述しやすいので頻繁に利用しています.
このOrgモードで記述したテーブルをMarkdown形式のテーブルに変換できることを知ったので, 情報をまとめようと思います.

## orgtbl-mode
テーブルの変換を行うには**orgtbl-mode**というマイナーモードを使用します.
メジャーモードがOrgモード以外のバッファで``M-x orgtbl-mode``を実行します.

## orgtbl-to-gfm
実際に変換を行うためには**orgtbl-to-gfm**という関数を定義する必要があります.
この関数は[Gist](https://gist.github.com/grafov/8244792)で公開されているので, Emacsの設定ファイル(init.elなど)にコピペしておきます.

## 使用例
使用例を以下に示します.
「sample」はテーブル名なので, 適宜変更を行ってください.
``#+ORGTBL: SEND sample orgtbl-to-gfm`` の次の行から ``-->`` の前の行までが, Orgモードで作成したテーブルです.

```
<!---
#+ORGTBL: SEND sample orgtbl-to-gfm
| Column 1 | Column 2 |
|----------+----------|
| Apple    |      100 |
| Orange   |      200 |
-->

<!-- BEGIN RECEIVE ORGTBL sample -->
<!-- END RECEIVE ORGTBL sample -->
```

``#+ORGTBL: SEND sample orgtbl-to-gfm`` の行から ``-->`` の前の行の間で``C-c C-c``を入力することで,
``<!-- BEGIN RECEIVE ORGTBL sample -->`` から ``<!-- END RECEIVE ORGTBL sample -->``の間にMarkdown形式のテーブルが出力されます.
出力例を下に示します.

```
<!---
#+ORGTBL: SEND sample orgtbl-to-gfm
| Column 1 | Column 2 |
|----------+----------|
| Apple    |      100 |
| Orange   |      200 |
-->

<!-- BEGIN RECEIVE ORGTBL sample -->
| Column 1 | Column 2 |
|---|--:|
| Apple | 100 |
| Orange | 200 |
<!-- END RECEIVE ORGTBL sample -->
```

## おわりに
Orgモードでさくっとテーブルを作成, その後変換ということが手軽に行えるので, Markdown形式のテーブルが素早く書けるようになりました.
Orgモードは奥が深いので, 少しずつ使いこなしていきたいです.
[JavaプログラマのためのHaskell]二日目・リストの話

[前回](http://qiita.com/noco/items/6e983c91edabe7716bd8)の続き.
前回出てきたリストリテラルを使って引き続きコードを書いてみます.
その前にまずは少し肩慣らしに命名規則から.
<h1>Haskellの命名規則その１</h1>
Haskellでは、ある要素とその要素のリストがあるとき、それぞれに束縛される変数名を単数形と複数形で対応させる.
例：　整数に束縛される変数n→整数のリストに束縛される変数ns
　　　文字に束縛される変数c→文字列に束縛される変数cs

<h1>head.hs</h1>
標準入力の最初の10行を出力.

```head.hs
main = do cs <- getContents
          putStr $ firstNLines 10 cs

firstNLines n cs = unlines $ take n $ lines cs
```
　　・引数の関数適用：　関数名 引数1 引数2 引数3 ...
　　・関数の定義：　関数名 仮引数1 仮引数2 ... = 本体
　　　　　　　　　　firstNLines関数は引数を2つ取る関数で、仮引数がnとcsである.
　　・unlines関数：　lines関数の逆で、行のリストを連結して文字列にする.
　　　　　　　　　　　その際、各行の末尾に改行文字を付加する.

```
unlines ["aaa", "bbb", "ccc"] = "aaa\nbbb\nccc\n"
unlines ["aaa"]               = "aaa\n"
unlines [""]                  = "\n"
unlines []                    = ""
unlines ["aaa\n"              = "aaa\n\n"
```
　　・take関数：　リスト先頭からn個の要素をとってリストで返す関数.
　　　　　　　　　リストの長さがnより短い時はリスト全体を返す.

```
take 3 [1, 2, 3, 4, 5] → [1, 2, 3]
take 3 [1]             → [1]
take 3 []              → []
take 3 "String"        → "Str"
take 0 [1, 2, 3]       → []
take (-1) [1, 2, 3]    → []
```

<h1>tails.hs</h1>
標準入力の最後の10行を出力.

```
main = do cs <- getContents
          putStr $ lastNLines 10 cs

lastNLines n cs = unlines $ takeLast n $ lines cs
takeLast n ss = reverse $ take n $ reverse ss
```
　　手順は、
　　1.行のリストを逆順にする.
　　2.先頭からn行を取る.
　　3.とった部分リストをまた逆順にする.

　　・reverse関数：　リストを逆順にする.

```
reverse [1, 2, 3]          → [3, 2, 1]
reverse []                 → []
reverse "String"           → "gnirtS"
reverse ["aa", "bb", "cc"] → ["cc", "bb", "aa"]
```

<h1>words関数</h1>
文字列を空白文字で区切ってリストに分割する.

```
words "This is a pen." → ["This", "is", "a", "pen."]
```

今回はここまで！
[第一回](http://qiita.com/noco/items/6e983c91edabe7716bd8)
[第三回](http://qiita.com/noco/items/77a5588601ba6f0a4f7b)


出典
青木峰郎.ふつうのHaskellプログラミング ふつうのプログラマのための関数型言語入門.ソフトバンク クリエイティブ株式会社,2006,372p.
どこでもクラスが参照できるふしぎなクラスローダー

みなさん、オートローディングしてますか！ 名前空間使ってますでしょうか！

便利でいろいろな箇所で使いたいのに長いクラス名をいちいち書いたりするのはめんどくさい… そんなことありますよね?!

```fuga.php
<?php
namespace Hoge\Fuga;

use Deep\Nested\Library\Module\Awesome\Miracle as AwesomeClass;

$obj = new AwesomeClass;
$obj->foo();
```

## 解決策

[BaguettePHP/AliasLoader](https://github.com/BaguettePHP/AliasLoader)ってライブラリ書きました。

インストールはちょうかんたん。

```sh
$ composer require zonuexe/aliasloader
```

実装も超かんたんだょ！

```bootstrap.php
<?php
require_once dirname(__DIR__) . '/vendor/autoload.php';

\Teto\AliasLoader::add('Deep\Nested\Library\Module\Awesome\Miracle', 'AwesomeClass');
```

```fuga.php
<?php
namespace Hoge\Fuga;

$obj = new AwesomeClass;
$obj->foo();
```

いぇい！

## 実用例

こんなふうに、よく利用するクラスを登録しておくとべんり。

```alias.php
<?php

\Teto\AliasLoader::add('Respect\Validation', 'v');
\Teto\AliasLoader::add('Teto\Functools', 'f');
```

で、`composer.json`に書いとく。

```json
{
    "autoload": {
        "files": ["src/alias.php"]
    }
}
```

べんり。

## 感想

オートローディングたのしい＞＜

そして、PhpStormは意外に賢くない…
スクリプト経由でAssetBundleNameを付加する方法


```csharp
// プロジェクトフォルダからの相対パス指定でないとダメっぽい
var assetPath = "Assets/Hogehoge.txt";
var importer = AssetImporter.GetAtPath( assetPath );
importer.assetBundleName = "bundleName";
importer.SaveAndReimport();
```

エディタスクリプトでアセット生成した直後にAssetBundleNameを設定しちゃいたいとか、複数のファイルに対して一括でAssetBundleNameを設定しちゃいたいときに使えると思います。
アセットに対するAssetBundle関連の設定はすべてAssetImporterからやるようです。
Blender 2.76 の Cycles で IBL の設定をする

　ふと IBL の設定をしたくなったのですが、古いバージョンでの設定方法しか見つからなくて迷ったので、2.76 での設定方法をメモ代わりに残しておきます。

# World のマテリアル設定をする
　IBL の設定は World のマテリアルとして行います。今回は入力のテクスチャに [sIBL Archive](http://www.hdrlabs.com/sibl/archive.html) から "Ueno Shrine" をダウンロードして使います。

1. Shader に "Background" を選択し、World Output に繋ぐ
2. Enironment Texture ノードを追加し、ダウンロードしたテクスチャ("03-Ueno-Shrine_3k.hdr")を選択する
3. Texture ノードの "Color" を Shader ノードの "Color" に繋ぐ

　最終的にノードは次のようになります。
　<img width="552" alt="World のノード" src="https://qiita-image-store.s3.amazonaws.com/0/13938/e888e3a2-1df7-0768-d8c6-38b02c78937f.png">

# 確認用のオブジェクトを追加
　きちんと設定が出来ているかをピカピカの球を置いて確認すると良いです。

1. "UV Sphere" メッシュを追加する
2. マテリアルを追加し Shader に "Glossy BSDF" を選択する
3. "Roughness" をゼロにする

これで表面がピカピカの状態になります。

　球のマテリアルのノードは次のようになります。
<img width="407" alt="確認用の球のマテリアルのノード" src="https://qiita-image-store.s3.amazonaws.com/0/13938/674c4985-6344-9c67-ded0-61bd67ac6a58.png">

# 確認する
　3D View のシェーディング方法を "Rendered" にして確認します。これで周囲を自然に反射していることを確認します。いろいろな方向から球を眺めて破綻がなければ正しく設定されているはずです。
<img width="377" alt="3D View での確認" src="https://qiita-image-store.s3.amazonaws.com/0/13938/3a190afd-ef96-86d4-53bb-341d2a3a26d0.png">
jUnit4+PowerMock+EasyMockでstaticメソッドをモック

情報はいろいろあるけど、なかなかうまくできなかったのでメモ。
## 環境

- Java8
- jUnit4.12
- PowerMock1.6.4
- EasyMock3.4

mavenなら以下を入れればOK

- powermock-module-junit4 1.6.4
- powermock-module-easymock 1.6.4
- easymock 3.4

## テスト対象コード

```java:Utils.java
import java.text.SimpleDateFormat;
import java.util.Calendar;

public class Utils {
	public static String getStringDate() {
		Calendar cal = Calendar.getInstance();
		return new SimpleDateFormat("yyyyMMdd").format(cal.getTime());
	}
}
```

「Calendar.getInstance()」をいつ実行しても同じ値を返すようにモック化したい。

## テストコード

```java:UtilsTest.java
import static org.junit.Assert.assertThat;
import static org.hamcrest.core.Is.is;

import java.util.Calendar;

import org.easymock.EasyMock;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.easymock.PowerMock;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

@RunWith(PowerMockRunner.class)
@PrepareForTest(Utils.class) // *1
public class UtilTest {

	@Test
	public void test() {
		Calendar cal = Calendar.getInstance();
		cal.set(2015, 3, 1);
		
		// *2
		PowerMock.mockStaticPartial(Calendar.class, "getInstance");
		EasyMock.expect(Calendar.getInstance()).andReturn(cal);
		PowerMock.replay(Calendar.class);

		String actual = Utils.getStringDate();
		assertThat(actual, is("20150401"));	
	}
}
```

*1の箇所ではテストするメソッドがあるクラスを指定。
*2の箇所ではモックしたいメソッドのあるクラス周りの設定。

staticメソッドを呼び出すクラスを指定しなければいけないところを勘違いしていて、つまづいていました。
【WebGoat】練習用脆弱性アプリケーション

# WebGoatとは
Webアプリケーションのセキュリティを学び、実践することが可能なWebアプリケーション

https://www.owasp.org/index.php/Category:OWASP_WebGoat_Project

# ダウンロード
```
wget https://s3.amazonaws.com/webgoat-war/webgoat-container-7.0-SNAPSHOT-war-exec.jar
```

# 実行してみる
```
java -jar webgoat-container-7.0-SNAPSHOT-war-exec.jar
```

#### ブラウザ(http://localhost:8080/WebGoat) にアクセス

![challenge10.jpg](https://qiita-image-store.s3.amazonaws.com/0/104731/5eef8a3e-8f27-523c-acac-eeab34e55773.jpeg)

これで準備完了！
中のコンテンツで、脆弱性も学べるようにもなってるみたい
JavaとGroovyの整数リテラルの違い

Javaで書いたユニットテストをSpock(Groovy)に書き直して整数リテラルの違いでテストが失敗したのでメモ。

```java:test.java
package example

import org.junit.Test;

import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertThat;

public class IntTest {
    @Test
    public void test() {
        assertThat(-1, is(0xffffffff));
    }
}
```

をSpockのテストにそのまま書き直すと

```Groovy:test.groovy
package example

import spock.lang.Specification

class IntSpec extends Specification {
    def "test"() {
        expect:
        -1 == 0xffffffff
    }
}
```

となるがこれは

```
Condition not satisfied:

-1 == 0xffffffff
   |
   false

Expected :4294967295

Actual   :-1
```

ということになってしまうのでちょっと書き直す。

```groovy:test.groovy
package example

import spock.lang.Specification

class IntSpec extends Specification {
    def "test"() {
        expect:
        -1 == (int) 0xffffffff
    }

}
```
(int)でキャストするのがポイント。
asanaでScrum board

# 概要
asanaでScrum boardを作る。

# 問題点
asanaはタスクをセクションで区切れるが、1project内で、Sprintの区切りとScrum boardを同時に表現する手段がない。
RedmineのBacklogsプラグインを入れたような状態にしたい。

# 解決方法
Sprintごとにprojectを作成する。

![sprint.png](https://qiita-image-store.s3.amazonaws.com/0/109450/1ff820f5-b4a8-1b0f-129b-454ac670c207.png)

# 作業の流れ
1. タスクをBacklogsのprojectに追加
![backlogs.png](https://qiita-image-store.s3.amazonaws.com/0/109450/95c6ab2e-5f71-ad96-db9e-c3840c169666.png)

2. BacklogsのprojectにあるタスクをSprintのタスクに移動させる。
![scrumboard.png](https://qiita-image-store.s3.amazonaws.com/0/109450/4009b316-a6a9-5644-38df-34439e78b1ea.png)

3. Sprintのprojectにあるタスクのセクションを移動させながら進捗を管理する。

# TODO
ユーザストーリー自体の管理はこれでできそうだが、ユーザーストーリーに紐づくタスクまでは管理できない。
細かいタスクの管理しやすい方法を考える。
Powershell / slack / vivado > Generate Block Design終了時slack通知 (v0.1) > 要改善

```txt:動作確認
Windows 8.1 pro (64bit)
Vivado 2015.4
```

VivadoにてGenerate Block Designが終了した時にslackへ通知しようとした。


### 関連ファイル

以下のファイルを用意しておく。

1. secret_slack_url.txt - slackのincoming webhookのURL (<font color=red>git ignore対象ファイル</font>)
2. target_dir.txt - Vivadoのhw/, SDK/ を含む作業フォルダ

```secret_slack_url.txt
https://hooks.slack.com/services/xxxxx/xxxxx/xxxx
```

上記URLは本来のIncoming Webhookのアドレスから改変している(security対策)

```target_dir.txt
C:\ZyboDev\zybo_160112_baseDesign
```

### コード (v0.1)

```main.ps1
#
## 前提 > 以下のファイルがそろった環境で実行する
# 1. secret_slack_url.txt - slackのURL (git ignore対象ファイル)
# 2. target_dir.txt - Vivadoのhw/, SDK/ を含むフォルダ
# 3. このスクリプトファイル

<#
v0.1 2016 Jan 15
    - add notifyToSlack()
    - add get_lastWriteTime_hwdef()
    - add find_hwdef()
    - add get_target_dir()
    - add get_slack_url()
    - add main()
#>


function get_slack_url() 
{
    $slkurl = ( Get-Content .\\secret_slack_url.txt )
    return $slkurl
}

function get_target_dir()
{
    $trgDir = ( Get-Content .\\target_dir.txt )
    return $trgDir
}

function find_hwdef($procDir)
{
    $hwdf = ( Get-ChildItem $procDir -Recurse "system.hwdef" )
    return $hwdf.Fullname
}

function get_lastDateTime($afile)
{
    if ( $afile.Length -eq 0 ) {
        return (Get-Date)
    }
    return (Get-ChildItem $afile).LastWriteTime
}

function notifyToSlack($msgToSlk, $slkurl) {
  $enc = [System.Text.Encoding]::GetEncoding('ISO-8859-1')
  $utf8Bytes = [System.Text.Encoding]::UTF8.GetBytes($msgToSlk)

  $notificationPayload = @{ 
    channel = "#zybo";
    username = "7of9";
    text = $enc.GetString($utf8Bytes);
  }

  Invoke-RestMethod -Uri $slkurl -Method Post -Body (ConvertTo-Json $notificationPayload)
}

function main() 
{
    $slackUrl = get_slack_url
    $targetDir = get_target_dir

<#
    if ( $TRUE ) { # for debug
        $targetDir = "dummy"
    } 
#>

    $hwdef = find_hwdef($targetDir)
    echo $hwdef
    $pretime = get_lastDateTime($hwdef)
    echo $pretime

    $msg = "Start"
    notifyToSlack $msg $slackUrl

    while ( 1 ) { 
        $curtime = (Get-ChildItem $hwdef).LastWriteTime
        echo $curtime
        if ( $curtime -gt $pretime) {
            echo "Generate Block Design"
            notifyToSlack "Generated Block Design" $slackUrl
            $pretime = $curtime            
        }

        sleep 5
    }

}

main
```

### 結果

system.hwdefファイルが作成された時点でslackへ通知が届くようになった。
以下は通知の画像。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/933d7925-c82d-edc3-21fb-c4c171737885.png)


しかしながら、system.hwdefファイル作成後も、Managing output filesなどのメッセージが出ていて処理が完全には終わっていない。

対象ファイルを別のものにするなど要改善。
2016-01-15 powershell > 関数の引数が複数ある場合の実行例 > notifySlack $var1 $var2 > notifySlack($var1, $var2)ではない

```txt:動作確認
Windows 8.1 pro (64bit)
```

Powershellにて関数の引数が複数ある場合の実行例は

```
notifySlack($var1, $var2)
```

ではなく

```
notifySlack $var1 $var
```
のようだ。

参考 http://capm-network.com/?tag=PowerShell%E9%96%A2%E6%95%B0
underscoreコードリーディング（findIndex）



underscoreに詳しくないので、勉強半分でソースコードを読む。



##利用するバージョン
[underscore.js(v1.8.3)](https://github.com/jashkenas/underscore/tree/1.8.3)


##findIndexとは


###[underscorejs.orgのfindIndex](http://underscorejs.org/#findIndex)

こんな説明。
>####_.findIndex(array, predicate, [context]) 
Similar to _.indexOf, returns the first index where the predicate truth test passes;
otherwise returns -1.

```javascript

_.findIndex([4, 6, 8, 12], isPrime);
=> -1 // not found
_.findIndex([4, 6, 7, 12], isPrime);
=> 2

```
------------- 
_.indexOfと似ている。predicateと一致する最初の箇所のindexを返却する。
もしない場合は-1を返す。


###[underscore.findIndex](https://github.com/jashkenas/underscore/blob/1.8.3/underscore.js#L626)
コード的にはこのあたり。

```javascript

 // Returns the first index on an array-like that passes a predicate test
  _.findIndex = createPredicateIndexFinder(1);
  
```

createPredicateIndexFinderに1を渡しているのみ


[createPredicateIndexFinder](https://github.com/jashkenas/underscore/blob/1.8.3/underscore.js#L613)は以下

```javascript
  // Generator function to create the findIndex and findLastIndex functions
  function createPredicateIndexFinder(dir) {
    return function(array, predicate, context) {
      predicate = cb(predicate, context);
      var length = getLength(array);
      var index = dir > 0 ? 0 : length - 1;
      for (; index >= 0 && index < length; index += dir) {
        if (predicate(array[index], index, array)) return index;
      }
      return -1;
    };
  }
```


dir=1なのでこうなる

```javascript

function(array, predicate, context) {
  predicate = cb(predicate, context);
  var length = getLength(array);
  var index =  0 ;
  for (; 0 < length; index++) {
    if (predicate(array[index], index, array)) return index;
  }
  return -1;
};

```

arrayのlength分だけforぶんを回す。
predicateに合致した場合はindexを返す。
for分を回しても返り値がなかった場合、-1を返す。
Groongaで学ぶ全文検索 2016-01-15


# 今日のお題「運用時のデータが壊れた場合の対策」

## 壊れるとは

1. ディスクが壊れるなどで物理的に壊れる
2. 書き込んでいた際に途中でサーバクラッシュなどで文字列が途中までしか保存できないなど論理的に壊れる

の2種類がある

## RDBMSの対策

1. レプリケーションなどでデータを複数台に保持する事で同時に壊れる確率を下げている。<br>
→サーバ費用などのコストがかかったり、帯域を消費するため多ければ良いというものではない。ちょうど良いところに調整が必要。<br>
→物理的に壊れない対策
2. トランザクションなどで中途半端なものは登録しない。<br>
→論理的には壊れない対策

## 全文検索エンジンの対策

トランザクションに対応していないものが多いので論理的に壊れる可能性がある。

### 対応方法

1. バックアップとっておいて問題が発生したら戻す<br>
→バックアップを取得してから障害が発生した際のデータが消失する可能性がある。
2. マスターデータを別に用意しておいて0から復旧する<br>
→時間がかかるがデータは全て復旧可能

## Groongaの対策

同様にトランザクションが無いので論理的に壊れる可能性がある。

### Groonga単体対応方法

マスターデータを用意する。

*  順次作るよりも0から作る際に早くなるモードがある
* 他のサービスよりも書き込みが早いのでこの方法をとる事が多い。
 
### GroongaはRDBMSのライブラリとして利用できるのでRDBMSを利用する際はRDBMSの仕組みを利用できる

1. MySQLの場合
 * InnoDBをマスター、MroongaをSlaveとすることでマスターからの復旧が行える。
 * Groongaではデータ+インデックスの両方を管理している
2. PostgresSQLの場合
 * Postgresのレプリケーションは物理的な更新位置を渡すような仕組みのためGroongaでデータが更新されたことを検知できないためGroongaにはインデックスだけを保持している。スレーブからREINDEXすることでデータを反映させる。

## その他メモ

* バックアップとしてスレーブを増やすと全台を運用で使いたくなるが
スレーブが落ちた際にサービスに影響が出る可能性があるので
全体だ動いている前提の設計はしない事。

* Groongaのポリシーは新しい情報程重要(書き込んでいても検索時にはロックをかけないので検索性能が落ちない)
* Mroongaを使うと参照性能を上げられる
 * Mroongaが死ぬとMySQLが落ちることがあるのでインスタンスを分けた方が良い
 * Mroongaのスレーブは、マスターからもスレーブのMroongaからのどちらからも作成できる。
 * Groongaのレプリケーション機能があるDroongaというプロダクトがある
Cygwin環境にvirtualenvを入れてみた

#### セットアップ前の状態
```bash
$ apt-cyg list python
python

$ python --version
Python 2.7.10
```

#### setuptoolsのインストール
```bash
$ apt-cyg install python-setuptools
```

#### virtualenvのインストール
```bash
$ easy_install-2.7 virtualenv
Searching for virtualenv
Reading https://pypi.python.org/simple/virtualenv/
Best match: virtualenv 13.1.2
Downloading https://pypi.python.org/packages/source/v/virtualenv/virtualenv-13.1.2.tar.gz#md5=b989598f068d64b32dead530eb25589a
Processing virtualenv-13.1.2.tar.gz
Writing /tmp/easy_install-dgIpjZ/virtualenv-13.1.2/setup.cfg
Running virtualenv-13.1.2/setup.py -q bdist_egg --dist-dir /tmp/easy_install-dgIpjZ/virtualenv-13.1.2/egg-dist-tmp-O1OxjH
warning: no previously-included files matching '*' found under directory 'docs/_templates'
warning: no previously-included files matching '*' found under directory 'docs/_build'
creating /usr/lib/python2.7/site-packages/virtualenv-13.1.2-py2.7.egg
Extracting virtualenv-13.1.2-py2.7.egg to /usr/lib/python2.7/site-packages
Adding virtualenv 13.1.2 to easy-install.pth file
Installing virtualenv script to /usr/bin
Installing virtualenv-2.7 script to /usr/bin

Installed /usr/lib/python2.7/site-packages/virtualenv-13.1.2-py2.7.egg
Processing dependencies for virtualenv
Finished processing dependencies for virtualenv
```

#### virtualenv環境の作成
```bash
kunst@DESKTOP-A0MF4ER ~
$ mkdir myproject

kunst@DESKTOP-A0MF4ER ~
$ cd myproject/

kunst@DESKTOP-A0MF4ER ~/myproject
$ virtualenv .
New python executable in ./bin/python
Installing setuptools, pip, wheel...done.

kunst@DESKTOP-A0MF4ER ~/myproject
$ ls -l
合計 4
drwxrwxr-x+ 1 kunst なし 0 1月  15 21:08 bin
drwxrwxr-x+ 1 kunst なし 0 1月  15 21:08 include
drwxrwxr-x+ 1 kunst なし 0 1月  15 21:08 lib
```

#### pip installしてみる
```bash
kunst@DESKTOP-A0MF4ER ~/myproject
$ source bin/activate
(myproject)
kunst@DESKTOP-A0MF4ER ~/myproject
$ pip install cherrypy
Collecting cherrypy
  Downloading CherryPy-4.0.0.tar.gz (434kB)
    100% |████████████████████████████████| 438kB 390kB/s
Building wheels for collected packages: cherrypy
  Running setup.py bdist_wheel for cherrypy
  Stored in directory: /cygdrive/c/usr/home/.cache/pip/wheels/0b/a1/e1/8e7e0f3a71dce9f4ef4bf8667efcd772c594af46fe3c8bef66
Successfully built cherrypy
Installing collected packages: cherrypy
Successfully installed cherrypy-4.0.0
(myproject)
```

#### virtualenv環境から出る
```bash
kunst@DESKTOP-A0MF4ER ~/myproject
$ deactivate

kunst@DESKTOP-A0MF4ER ~/myproject
$ pip
-bash: pip: コマンドが見つかりません
```
GVMを使って、Go言語をインストール for Mac


## 環境
OS X Yosemite 10.10.5

## gvmを選んだ経緯
Node.jsはnvm
Rubyはrvm
でバージョン管理していたのできっとGo言語にも似たのがあるだろうと探してみた。

あった。
 [Go Version Manager (GitHub)](https://github.com/moovweb/gvm)

またバージョン管理ツールを使うメリットとしては、
・各種プロジェクトで使うバージョンが違う時に対応できる。
・ユーザインストールの為、yumやapt-getが制限されている環境でも楽チン
などなど

## 早速gvmをインストール  
まずは以下を実行

```  
bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)
```

入りました。
![3d88bbe15f30f36eede7db3d44e8ac7a.png](https://qiita-image-store.s3.amazonaws.com/0/28820/a7e42226-fbd1-87e7-1dcd-5c9c9732534a.png)
※ikedaはホームディレクトリ名。理由は池田だから。

```
source ~/.gvm/scripts/gvm 
```

これを実行すれば使えるのですが、このままではターミナルを起動するたびに実行しなきゃいけないので
.bash_profileへ以下を追記

```bash
[[ -s ~/.gvm/scripts/gvm ]] && . ~/.gvm/scripts/gvm
```

ここまではnvmと同じですね。

とりあえずhelpを見てみる

```
gvm help 
```
![gazo.png](https://qiita-image-store.s3.amazonaws.com/0/28820/e45fe884-1ab2-7dff-a6de-33a27721adf9.png)

インストールできる一覧を確認。

```
gvm listall
```
![f636b4d307ab243360ee12d02d5bf489.png](https://qiita-image-store.s3.amazonaws.com/0/28820/fd78239b-d487-5742-0054-93b544d508ef.png)

## Goのインストール！！
今回は1.5.3をインストール

```
gvm install go1.5.3
```

そしたらなんか出た。
![3843df6026db9a455a8dcda6e534c68a.png](https://qiita-image-store.s3.amazonaws.com/0/28820/c6049776-dd60-5e41-e0c7-286dba41b1c0.png)

ログファイルの中身を確認してみると
![29779f465beeccb853b167962df181dd.png](https://qiita-image-store.s3.amazonaws.com/0/28820/47c6107d-2ac6-a383-7ac0-3e3d8a339851.png)

1.4?
ならば1.4を先にインストール

```
gvm install go1.4.3
```

![1ae0cae997f6519dd18329aaf2f1d880.png](https://qiita-image-store.s3.amazonaws.com/0/28820/813f0191-3e08-7f9e-d7d3-8e7419d78a4c.png)
完了。

1.4.3を利用するように設定。

```
gvm use go1.4.3
```

その後1.5.3をもう一度チャレンジ

```
gvm install go1.5.3
```
![e4f016dd3b0a74be9365a401d3051723.png](https://qiita-image-store.s3.amazonaws.com/0/28820/d32135a5-a5b0-f478-a9e3-70f0537b2f37.png)

今度は成功



完了したら使うバージョンを指定

```
gvm use go1.5.3 --default
```

「--default」をつけるとデフォルトでそのバージョンを使うようになる。
「nvm alias default」と同じですね。

## 確認
インストールされているバージョンを確認

```
gvm list
```
![1817ef8001dd0b78132fb248f2010c98.png](https://qiita-image-store.s3.amazonaws.com/0/28820/e8a477ed-7486-645c-3cbc-b8c4927dae65.png)

goの方も確認

![9108d30d3152e5dd2d1569688b7acf76.png](https://qiita-image-store.s3.amazonaws.com/0/28820/0d5606fc-3a53-9c6f-5111-a93aab194740.png)


完了！！


## おまけ
gvmって前にもインストールしたよなぁーって思って調べたら

Groovyもgvmでした...
[Groovy enVironment Manager](http://sdkman.io/)


同じ環境に入れてなくてよかった....
Squeelの列名を動的に指定する

Squeelを使うと、Rubyの枠内で複雑なクエリもすいすい書けるようになりますが、さらに凝ったことをしようとするとひと工夫が必要になります。

# Squeelって？
Railsでちょっと複雑なSQLのクエリを書こうとすれば、一部を文字列にするか、Arelを使うかということになりますが、どちらにも使いづらい点があります。

* 文字列で書いてしまうと、あとあとの再利用が不便になる
* Arelは内部向けのAPIであって、使いにくい＆仕様が安定していない

ここで登場するのが[Squeel](https://github.com/activerecord-hackery/squeel)です。SqueelはArelをラップして、Ruby的なDSLでSQLを書けるようにしてくれます。使い方については[他のQiita記事](http://qiita.com/yusuke-matsuda/items/d36c61f639aa96b80acf)や[タイムインターメディアさんの記事](http://labs.timedia.co.jp/2013/11/activerecord4sql-squeel.html)に詳しいです。

## 動作を考える
たとえば、「身長が160cm以上、体重が70kg以下」というような条件で検索をかけるとなると、こんな感じになります。

```rb:DSL
Person.where{(height >= 160) & (weight <= 70)}
```

さて、`height`や`weight`なんて定義した覚えはないのですが、いったいどうなっているのでしょうか。`where`の引数がブロックとなっていることからも予想できるかもしれませんが、じつはこのブロック全体が`instance_eval`で評価されます。そして、存在しない名前については`method_missing`が拾っていって、評価式を組み立てるためのオブジェクトに変換してしまう、という仕組みになっています。

# 動的に指定…できる？
さて、ちょっと凝ったことをしたくなったので、Squeelで条件とする列名をハードコードするのではなく、シンボルなどで外から与える必要が出てきました。ただ、呼ぶべきものは明示的なメソッドがあるわけではない、`method_missing`上の機能なので、一体どうすればいいのでしょうか。

と思って調べてみると、`send`でメソッドを呼んだ場合にも、当該メソッドがなければ`method_missing`に回ることが判明しました。ということで、DSL内部で`send`を使ってみることにしました。

```rb:失敗例
column = :height
Person.where{send(column) >= 160}
```

とりあえず実行時にエラーは起きなかったのですが、これでDBを参照してみるとSQL段階でエラーとなってしまいました。原因を調べるために`.to_sql`としてみると、`SELECT (中略) WHERE send(height) >= 160`というように、`send`がDB関数だと解釈されてしまっていました。

## 非常用メソッド
ということで、この環境では`send`すら削除されて`method_missing`に流れるようになってしまっていました。ただし、`send`にはもう1つの名前である`__send__`というのがあって、これは[`BasicObject`にすら用意されている](http://docs.ruby-lang.org/ja/2.1.0/class/BasicObject.html#I___SEND__)ものです。こちらでしてみると、どうなるでしょうか。

```rb:成功例
column = :height
Person.where{__send__(column) >= 160}
```

こうすることで、きちんと本来のメソッドまでコードが回るようになりました。
Rails4のMountable Engineで、link_toに:method => 'delete'を指定しても、Getアクセスになってしまう

##環境
- Ruby 2.2.3
- Rails 4.2.4

## 問題点
rails4のMountable Engineで、link_toに`:method => 'delete'`を設定しても、何故かGETアクセスになってしまう。

[Mountable Engineの設定手順はこちら]
http://qiita.com/Esfahan/items/7a0e9a3df28d68905a6e


## 解決策

Engine内にある、application.jsに下記を追記すればOKでした。

```lang:{engine_name}/app/assets/javascripts/{engine_name}/application.js
//= require jquery
//= require jquery_ujs
```

[参考]
http://stackoverflow.com/questions/18154916/rails-4-link-to-destroy-not-working-in-getting-started-tutorial
力の限り「バルス」をつぶやき続けるpythonコード

梢の金曜ロードショーは，恒例のバルス祭りということで，
バルスをツイートするpythonコードを作成しました．
twitterのAPIの制限は，１５分１８０回ということなので，
プログラムを実行すると，その制限の限り「バルス」とつぶやき続けます．
最後の１８０回めには，なんとムスカが叫びます〜！

それでは，天空の城ラピュタ楽しみましょう〜！

```lang:tweetBalse.py
# coding=utf-8
import time
import tweepy

consumer_key = '****'
consumer_secret = '****'
access_key = '****'
access_secret = '****'

comment = 'バルス'
last_comment = '目が、目がぁ～〜〜〜〜〜〜〜〜!！！！！！！ '
exclamation = '!'
counter = 179

auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
# set access token to OAuth handler
auth.set_access_token(access_key, access_secret)
# create API
api = tweepy.API(auth_handler=auth)

for var in range(counter):
	api.update_status(comment)
	if len(comment) >= 140:
		comment = 'バルス'
	comment+=exclamation
	print comment
	time.sleep(0.1)

api.update_status(last_comment)
print last_comment
```
powershell > 文字列の長さを調べる > ($strXXX).Length

```txt:動作確認
Windows 8.1 pro (64bit)
```

文字列の長さを取得したい

参考 [Operations Lab.](https://operationslab.wordpress.com/2013/03/12/powershell-%E3%81%A7%E8%A1%8C%E6%95%B0%E3%82%84%E6%96%87%E5%AD%97%E6%95%B0%E3%82%92%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%81%99%E3%82%8B/)

```main.ps1
$strXXX = "TEST"
echo $strXXX.Length
```

```txt:結果
4
```
for文内でHandler登録

for文内でclickHandlerを登録するには

```:example.cs
for (int i = 0; i < 10; i++) {
    _buttonList[i].OnClickHandler += () =>{
	Debug.Log(i.ToString ());
    }
}
```

としたいが、この場合どのボタンを押しても
9
が表示されてしまう。
これを解消するには

```:example.cs
for (int i = 0; i < 10; i++) {
　　int tmpIndex = i;
    _buttonList[i].OnClickHandler += () =>{
	Debug.Log(tmpIndex.ToString ());
    }
}
```
一旦格納してあげるとOK
powershell > if ( $TRUE ) { > 条件が成立した時の処理になる

```txt:動作確認
Windows 8.1 pro (64bit)
```

```sample.c
if ( ture ) {

}
```
と同様のことをPowershellで行いたい

参考 http://blog.itsnotfound.com/2014/01/truefalse-boolean-values-in-powershell/


```sample.ps1
function main()
{
    if ( $TRUE ) {
        echo "TRUE"
    } else {
        echo "FALSE"
    }
}

main
```

しかし、このあたり(if文)にはいくつか注意点があるようだ。
Windows10(64bit)のRubyでMeCabをつかう(Natto)

# 概要
Mecabをインストールして、RubyからNattoを用いて簡単に使えるようにします。
Windowsのローカル環境で実行する前提だと、MeCabをインストールするだけで直接コマンドを叩かせたほうが楽な気もしますが、他の環境で動かすことも考えると、そのあたりを隠蔽してくれる適当なgemを使ったほうがよいかな、と思いました。

# 環境
[Windows10(64bit) で Ruby 2.2.3 + Rails 4.2.5](http://qiita.com/sasanquaneuf/items/068ab4e5940a790327ba)で構築した環境です。

# やること
## 1. MeCabのインストール
mecab-0.996.exeを入手してインストールします。
https://drive.google.com/folderview?id=0B4y35FiV1wh7fjQ5SkJETEJEYzlqcUY4WUlpZmR4dDlJMWI5ZUlXN2xZN2s2b0pqT3hMbTQ&usp=drive_web
辞書の文字コードをutf-8にし、pathを通します。
これで、MeCabは単独で動くようになるのですが、32bitのdllだと64bit用ruby(MinGW)から呼ぶと動かないらしいので、実行ファイルを作り直します。
## 2. MeCabの実行ファイルを作り直す
https://github.com/buruzaemon/natto/wiki/64-Bit-Windows
の内容を参考にして実行ファイル(dll,exe)を作り直します。書いてある通りにやるとうまくいきました。

- ソースはGoogleDriveから取得します。
- Visual Studioをインストールするときは、c++をインストールする必要があるので注意します。

## 3. nattoのインストール
```
> gem install natto
```
nattoが入ります。

## 4. 動かす
`C:\temp\mecab`に適当なファイルを作って、試してみます。

```rb:mecab.rb
require 'natto'
 
text = '日本語を分解してしまいます。'
 
natto = Natto::MeCab.new
natto.parse(text) do |n|
  puts "#{n.surface}: #{n.feature}"
end
```
以下のコマンドを実行します。

```
> cd c:\temp\mecab
> ruby mecab.rb > temp.txt
```
ファイルの中身は次のとおりです。

```text:temp.txt
日本語: 名詞,一般,*,*,*,*,日本語,ニホンゴ,ニホンゴ
を: 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
分解: 名詞,サ変接続,*,*,*,*,分解,ブンカイ,ブンカイ
し: 動詞,自立,*,*,サ変・スル,連用形,する,シ,シ
て: 助詞,接続助詞,*,*,*,*,て,テ,テ
しまい: 動詞,非自立,*,*,五段・ワ行促音便,連用形,しまう,シマイ,シマイ
ます: 助動詞,*,*,*,特殊・マス,基本形,ます,マス,マス
。: 記号,句点,*,*,*,*,。,。,。
: BOS/EOS,*,*,*,*,*,*,*,*
```
ちなみに、MeCabを直接実行したときは次のようになります。

```
> mecab input.txt -o out.txt
```

```text:out.txt
日本語	名詞,一般,*,*,*,*,日本語,ニホンゴ,ニホンゴ
を	助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
分解	名詞,サ変接続,*,*,*,*,分解,ブンカイ,ブンカイ
し	動詞,自立,*,*,サ変・スル,連用形,する,シ,シ
て	助詞,接続助詞,*,*,*,*,て,テ,テ
しまい	動詞,非自立,*,*,五段・ワ行促音便,連用形,しまう,シマイ,シマイ
ます	助動詞,*,*,*,特殊・マス,基本形,ます,マス,マス
。	記号,句点,*,*,*,*,。,。,。
EOS
```
本質的には同じだと思います。

# おしまい
たのしめ！
glueコードを分離したjQueryのプラグイン作成方法

jQueryのプラグインを作ろうと思うと、jQueryにプラグインを登録するコードが思い出せなくて、いつもググってしまう。というのも、jQueryプラグインの作成には、お決まりのボイラープレートコードを何行か書かないといけない。

普通にjQueryプラグインを作ろうとすると、プラグインの実装はボイラープレートコードに埋もれてしまう。

```js:jquery.color.js
(function($) {
  $.fn.color = function(runtimeOption) {
    var defaultOption = {
      color: 'red'
    };
    var option = $.extend(defaultOption, runtimeOption);
    return this.each(function() {
      $(this).css('color', option.color);
    });
  };
})(jQuery);
```

だいたいこんな感じの実装になって、どこがjQueryとのglueコードで、どこがプラグインのロジックなのか分かりにくいし、こうしたコードだと数カ月後に新しいプラグインを作るときに、コピペしてどの部分を書き換えたらいいか考えないといけない。

jQueryに明示的なプラグイン登録APIが用意されていないため、こうした問題が起こる。

## glueコードを分離したjQueryのプラグイン実装

こうした問題を手っ取り早く解決するために、jQueryとのglueコードとプラグインの実装を分けてコーディングするようにする。下のコードは`addPlugin`関数がjQueryにプラグインを登録するための関数で、glueコードを隠蔽する。プラグインの実装は普通の関数にでき、`addPlugin`にその関数を渡してjQueryと結合することができる。

```js
// プラグインコード全体
(function($) {
  // jQueryとのglueコード
  function addPlugin(plugin) {
    $.fn[plugin.name] = function(runtimeOption) {
      var option = $.extend(plugin.option, runtimeOption);
      return this.each(function() { plugin.main.bind(this)(option); });
    };
  }

  addPlugin(/* プラグインの実装はここに書く */);
})(jQuery);
```

たとえば、文字色を変えるプラグインなら次のような感じのコードになる。

```js
(function($) {
  function addPlugin(plugin) {
    $.fn[plugin.name] = function(runtimeOption) {
      var option = $.extend(plugin.option, runtimeOption);
      return this.each(function() { plugin.main.bind(this)(option); });
    };
  }

  // プラグインの実装
  addPlugin({
    name: 'color', // プラグイン名
    option: {color: 'red'}, // デフォルトのオプション
    main: function(option) { $(this).css('color', option.color); } // プラグインの実装
  });
})(jQuery);
```

<a href="http://codepen.io/suin/pen/VeMagN?editors=101" target="_blank" class="btn btn-primary">このコードをCodePenで実行してみる</a>


ちなみに、当然ながらプラグインを使う側のコードは、普通のプラグイン実装方法との違いは意識しなくていい。

```js
// プラグインのクライアントコード
$('div:even').color();
$('div:odd').color({color: 'blue'}).css('background', 'pink'); // オプション指定したりメソッドチェーンも可
```
Groongaと運用

# Groongaと運用

Groongaで学ぶ全文検索 2016-01-15
2016-01-15（金）20:00 - 22:30

https://groonga.doorkeeper.jp/events/36432

## データの消失

データストア先の候補として以下のようなものがある。

* RDB(MySQL, PostgreSQL, SQLite)
* ファイル

壊れるには２種類がある。

* 物理的:
  ハードウェア的にデータが失われる。
* 論理的:
  データの書き込み途中にプロセスがクラッシュしてデータの不整合な状態が発生。たとえば、"Hello"と書き込んでHで終わるなど。

上記のうちRDBにはトランザクションの機能が用意されているものが多く、論理的に壊れにくい工夫がなされている。

一方、全文検索製品でトランザクションに対応している製品はたぶん少ない。
そのため、全文検索製品は論理的に壊れうる。

## 対応策
全文検索機能の消失に対する方法として以下の３種類が考えられる。

* マスターデータを死守
* バックアップ
* データの複製

### マスターデータを守る

マスターデータさえ死守すれば、全文検索機能を復旧することは可能。

* メリット
    * 空間効率が良い
    * Groongaには静的索引構築という素早くインデックスを作る仕組みがある

* デメリット
    * バックアップからの戻しに比べて復旧が遅い

### バックアップ

インデックスを含めてバックアップする。

* メリット
    * 復旧が速い（差分更新がなければファイルコピーのみ）

* デメリット
    * 空間効率が悪い

### データの複製

RDBにあるレプリケーションの機能を使ってデータを複製する。

* メリット
    * サービス継続性向上（１台死んでもしなない
* デメリット
    * コスト増
    * 運用スキルが必要
    * 複製の部分でうまくいかないとデータロストする可能性がある

#### 構成例
* Mroongaの場合

マスター：InnoDB <=> スレーブ：Mroonga

* PGroongaの場合

PostgreSQLのAPIの仕様上、データの同期しか行うことができないため、全文検索も更新も両方マスターとする構成をとるべき。

スレーブが無駄になるが、スレーブも検索に使えるような前提はあまりおすすめできない。

# 思いつき
最近では(たぶん)信頼できるデータストアとしてクラウドストレージAmazon S3などがある。

クラウドストレージにぶち込んだら自動的に全文検索ができるようなサービスがあったらどうか。
更新apiのイベントをキャッチできるような機能があったら作れそう。

こうすると物理的なマスターデータだけはある程度堅牢に守られるんじゃないだろうか。
powershell > "hello" > "hello"の表示 / echoは不要

```txt:動作確認
Windows 8.1 pro (64bit)
```

## try1

```main.ps1
function main() {
  "hello"
}

main
```

覚えたこと

1. "hello"という文字の表示。echoは不要
2. main関数 ([SO](http://stackoverflow.com/questions/21000989/how-can-i-create-a-powershell-main-function))


## try2
同様に変数に対してもechoなしでその中身を表示できるようだ。
ただ、echoを使わない書き方にはどうも違和感がある。

```main.ps1
function get_slack_url() 
{
    $slkurl = ( Get-Content .\\secret_slack_url.txt )
    return $slkurl
}

function main() 
{
    $slackUrl = get_slack_url
    $slackUrl
}

main
```

```txt:結果
https:slack/url/xxxx/xxxx
```
Ember.js 1.13 以降の @each と [] の意味の違いについて

Ember.jsで依存するキー指定を行う際に使う、 `@each` と `[]` は 1.13 以降は違う意味になります。

## `@each`

配列内の各プロパティの変更があった場合に再計算されます。

```
hoge: function() {
  // posts 配列中の各titleに変更があれば実行
}.property('posts.@each.title');
```

## `[]`

配列自体の変更、すなわち、追加や削除の場合に再計算されます。

```
fuga: function() {
  // posts 配列への追加や削除があれば実行
}.property('posts.[]');
```

## おわり
Ember.jsのバージョンを上げるときに勘違いで `@each` を全部 `[]` に書き換えてしまってあちこち動かなくしてしまったので、忘れないように記事をしたためました…

以下に書いてあることをよく読めばこんなことには…

http://emberjs.com/deprecations/v1.x/#toc_using-code-each-code-as-a-leaf-node-in-a-dependent-key
難読化とminifyの違いについて

個人的なメモ。

# 難読化とは
変数名をランダムな内容に変換してソースをトレース出来なくようにすること。
有料のサービスもあり、無駄な処理を入れてくれたりする

# minifyとは
人間用のコメントなどを消して無駄なことをなくしてくれること
Scalaの「クラス名.type」の意味


`scala.collection.immutable.List.type`の`List.type`はどういう文法なのかっていう話です


シングルトンオブジェクト`Original`を作ります

```scala
object Original
```

このオブジェクト`Original`の型が`Original.type`です！

つまり

```scala
val o = Original
```

を型を省略せずに書くと以下になります

```scala
val o: Original.type = Original
```



なので、タイトルは間違っていて「クラス名.type」ではなく「オブジェクト.type」が正確です
新年のうちに抑えておきたい、イマドキなイカした Android のオープンソースライブラリ集

以前の投稿（[イマドキなイカした Android のオープンソースライブラリ集](http://qiita.com/KeithYokoma/items/fb6872a72a75e9b6f2e6)）から一年以上経過し、様々なライブラリが継続して開発されている中、どんどん便利なものが増えてきていますので、改めてそれらを纏めて見てみたいと思います。

## プログラミング・パラダイムに関するもの

- [Dagger2](http://google.github.io/dagger/)

Google が公式に Square, Inc. の Dagger をフォークし、リフレクションを排してパフォーマンスを上げたもの。より静的に DI をする方向に持って行っています。

- [RxJava](https://github.com/ReactiveX/RxJava)

リアクティブプログラミングを Java に持ち込むためのライブラリ。

## デバッグ用途に使うもの

- [u2020](https://github.com/JakeWharton/u2020)

デバッグ時に便利な各種のパラメータを NavigationDrawer に詰め込んで、デバッグビルドのアプリで操作できるようにすることで、様々な環境下でのテストが簡単になります。通信周りは、強制的にエラーを発生させたり、遅延を発生させたりが簡単にできるので、例外のハンドリングがきちんと出来ているかが気楽にテストできます。

- [android classyshark](https://github.com/google/android-classyshark)

アプリに組み込むものではありませんが、apk をバラして中に何があるかをする必要がなく、AndroidManifest や各パッケージに含まれるプログラムをこのツール内でデコンパイル出来ます。

- [Process Phoenix](https://github.com/JakeWharton/ProcessPhoenix)

アプリケーションのプロセスを再起動するのに役立ちます。

- [AppCrashTracker](https://github.com/macroday/AppCrashTracker)

クラッシュを解析するために必要な情報をまとめて Json にしてくれます。

## 各種のバックポート

- [retrolambda](https://github.com/orfjackal/retrolambda)

ラムダ記法を古いジャバでも使えるようにするものです。勿論、Android でも使えます。

- [ThreeTenABP](https://github.com/JakeWharton/ThreeTenABP/tree/master/threetenabp)

日付 API の標準 JSR310 もまた、新しいジャバで導入されたものです。これをバックポートするライブラリが ThreeTenBP ですが、Android 向けに最適化されたものが ThreeTenABP です。

## View

いっぱいあります。本当に。

### アニメーション

- [ViewAnimator](https://github.com/florent37/ViewAnimator)

Fluent な API で、簡単にアニメーションの記述ができます。

- [LikeAnimation](https://github.com/frogermcs/LikeAnimation)

Twitter のいいねのようなアニメーションをあなたに。

### カスタムビュー

- [Android ago](https://github.com/curioustechizen/android-ago)

xx時間前、xx日前、のような表示を簡単に組み込むことが出来ます。

- [Material ScrollBar](https://github.com/krimin-killr21/MaterialScrollBar)

マテリアルデザインにおけるスクロールバーをバックポートしてくれます。

- [App Tour](https://github.com/vlonjatg/AppTour)

アプリの紹介をかっこ良く！

- [Bubble TextView](https://github.com/dupengtao/BubbleTextView)

吹き出しが作れます。

- [Android StepsView](https://github.com/anton46/Android-StepsView)

決まった数のワークフローがあるようなときに、今どの段階に来ているかを簡単に表示するためのViewです。

- [Android FlowLayout](https://github.com/LyndonChin/AndroidFlowLayout)

FlowLayout を Android でも！

- [Credit Card View](https://github.com/vinaygaba/CreditCardView)

リアルなクレジットカードをベースにした、クレジットカード情報の入力画面が簡単に作れます。

## ビルドに関するもの

- [build time tracker plugin](https://github.com/passy/build-time-tracker-plugin)

Gradle の各種タスクそれぞれでどのくらい時間が費やされたかを図ってくれます。これを元に、ビルド時間の改善をすべき箇所が特定できそうですね。
RailsでモデルのDateTIme型プロパティをformで良い感じに表示してみる

Datetime型のプロパティについて、フォームで良い感じに表示する方法に手間取ったので備忘録。

見た目はこんな感じ。
<img width="397" alt="スクリーンショット 2016-01-15 19.08.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/62612/026d9467-8d09-b5e4-63c9-b0edb8dc5637.png">

実行環境
`ruby 2.2.3p173`
`Rails 4.2.5`

```erb:form.html.erb
<%# 例えば article オブジェクトに start_at(Datetime型) というプロパティを持っている場合 %>

<%= form_for @article, url: hogehoge_path do |f| %>
  <%= f.label :start_at, '掲載開始日' %>
  <%= raw sprintf(
    f.datetime_select(
      :start_at,# プロパティ名
      {
        start_year:     Time.zone.now.prev_year.year,# 選択可能な開始年
        end_year:       Time.zone.now.next_year.year,# 選択可能な終了年
        default:        Time.zone.now,# デフォルトの年
        use_two_digit_numbers: true,# 月日を2桁の値で表示
        date_separator: '%s',# 年, 月
        datetime_separator: '%s',# 日
        time_separator: '%s'# 時
      },# オプション
      { class: 'date-select' }# htmlオプションを指定する場合は別で指定
    ),
    '年 ', '月 ', '日 ', '時 ') + '分'# 分 は最後につけ加えられる
  %>
<% end %>
```

separatorの情報って意外と少なくて苦労しました…。