OmniAICreator/Qiita-1.07M huggingface dataset:
タスクボードやチャットやCIやスクラム開発や振り返りを自分のチームで使いたい時の決め台詞

#はじめに
私は今の案件で、Excelに囲まれた環境で仕事をしています。
設計書も外部との懸案管理も内部の懸案管理もチームのタスク管理も全てExcelブックです。時々連絡にメールを使います。

どんな成果物でもExcelで管理し、どんな状態でもExcelで表現する、
まさに**Excel方眼紙の安住の地・Excelの楽園**。

正直気が狂いそうなのですが、この現場は手遅れそうなので早く
この**Excel楽園**から[**楽園追放**](http://rakuen-tsuiho.com/)される3ヶ月後が来る事を日々祈りながら印刷時のレイアウトを確認しながらセルを結合しています。


そんな業務の合間に思いついた、 **現代的なツールを使うきっかけ** を作る一言をまとめました。


## Trello
タスク管理を単純に置き換えるだけで効果があり、プロジェクト管理層の人間にも理解されやすい。

| 使い方の周知の簡便さ | ツールの導入の気軽さ | ツール導入による現場の変革度合い |
|:-:|:-:|:-:|
| ★★★★★ | ★★★★☆ | ★★★★☆ |

### 決め台詞 

**チームリーダーが離席しててもタスクを完了に出来るんですよ!!**
*――リーダーが会議に行って更新されないタスク管理シートに一言。*

**タスクが終わるたびに、社内を往復30mしなくてもよくなり、時間の無駄が減ります!!**
*――タスク管理者と自分の席がテーブルの端と端まで離れている時の一言。*


## slack
slack特有のとっつきやすい感覚を維持し、効果的な使い方を考えてチームに周知しないといけないので見た目ほど導入は楽ではない。

| 使い方の周知の簡便さ | ツールの導入の気軽さ | ツール導入による現場の変革度合い |
|:-:|:-:|:-:|
| ★★★★☆ | ★★★☆☆ | ★★★☆☆ |

### 決め台詞 

**Excelを掴んでいる犯人探しで現場をうろうろするのはやめませんか?**
*――編集したいxlsxが編集中で仕事が進まずオフィスを徘徊する人を見て一言。*

**誰かに質問しにいくたびに、必要な表図を印刷する必要もなくなります。**
*――上司に何かを説明するために紙を印刷しようとする人に一言。*

**内々に連絡せず、チャットの `#general` に打っておけば、この勘違いに気づいた人もいたんです…**
*――大きな見落としでサブチームの作業が無に還った時の一言。*

**メールとチャット、文章的、精神的なオーバーヘッドの違いは圧倒的で、チーム内のやり取りを全員が知ることができます。**
*――メールがあると指摘された時の一言 (知られてはいけない事以外全ての連絡をオープンチャンネルに流すことで全員が全員の動きを把握でき、行動のバッティングなどに効果がある)*


## KPT
スクラム開発の振り返りでよく使われるKPTは、単体でもチームが抱える問題を可視化しチームの環境を改善する気概を生むことが期待できる。
ただし最適な効果を出すには単体でも2週間に1度、作業者全員が1~3時間拘束されるため導入も容易とは言えない。

| やり方の周知の簡便さ | ツールの導入の気軽さ | ツール導入による現場の変革度合い |
|:-:|:-:|:-:|
| ★★★★☆ | ★★☆☆☆ | ★★★★☆ |

### 決め台詞 

**チームの問題、全員で見えるようにしてみませんか。**
*――開発の問題に気づかず時間外稼働でゴリ押しするマネージャーに一言。*


## CI
Jenkinsなどの継続インテグレーションツールは、開発で繰り返す手順を自動化して効率を上げる。
あなたがJenkins介護士であるなら、おそらくそこまで導入は難しくない。
これを導入出来れば別のツールを導入する足がかりにできるかもしれない。

| やり方の周知の簡便さ | ツールの導入の気軽さ | ツール導入による現場の変革度合い |
|:-:|:-:|:-:|
| ★★★☆☆ | ★★☆☆☆ | ★★★★☆ |

### 決め台詞 

**　**
*――思いついたら書きます。*


## スクラム開発
スクラム開発はチームの自己組織化により変化する要求や必要事項をチームの能力を最大化することで対応する。
ステークホルダーがスクラム開発と合わない成果物を要求していても使うことは出来る。
上のツールと同時に導入するか、上のツールがある程度チームに受け入れられたら導入を考えよう。

| やり方の周知の簡便さ | ツールの導入の気軽さ | ツール導入による現場の変革度合い |
|:-:|:-:|:-:|
| ★★☆☆☆ | ★☆☆☆☆ | ★★★★★ |

### 決め台詞 

**開発の時代を10年…進めてみませんか?**
*――開発プロセスの変革に意欲を掻き立てたプロジェクトリーダーに一言。*


# 終わりに
**この記事は全てフィクションです。
決して自分の現場が10年遅れているなどという事は事実ではありません。**

後半はちょっと雑になってしまいましたが、いかがでしたでしょうか。
現代でも大変不思議な事に、Excelのシェイプ内文字列を検索出来ず、眼力で整合性を確認する苦行を受け入れるような現場があるようです。

全ての開発現場で戦う人に快適で本来の目的に集中出来る開発環境が訪れますように。
C++ のライブラリーBoostをインストールしterminalでコンパイルするまで(Mac)

http://www.boost.org/doc/libs/1_61_0/more/getting_started/unix-variants.html
Boostの説明は省きます。
Homebrewを用いてインストールできます。
`$ brew install boost`
```
Error: boost-1.58.0 already installed
To install this version, first `brew unlink boost`
```
もし上のようなエラーが出てきたら
`$ brew doctor boost`
でインストールされている場所を見ましょう。
```
/usr/local/Cellar/boost/1.58.0 (10,718 files, 462.2M) *
```
これをどこかにコピーしておき、コンパイル時に使います。
適当に好きなエディターでboostのテストを作ってみましょう。

```
#include <boost/ptr_container/ptr_list.hpp>
#include <iostream>

using namespace std;

class foo
{
private:
   int Num;
public:
  foo() : Num(0){}//default Constructor
  explicit foo(int a): Num(a){}
  ~foo(){cout << "Destructed" << endl;} // destructor
  void print() {cout << Num << endl;}
};

int main()
{
  boost::ptr_list<foo> ls;
  boost::ptr_list<foo>::iterator itls;

  ls.push_back(new foo());
  ls.push_back(new foo(1));
  ls.push_back(new foo(2));

  for (itls = ls.begin();
       itls != ls.end();
       itls++)
    {
      itls->print();
    }

  ls.clear(); // All pointers held in list are deleted.
}

```

こんな感じで適当にテストプログラムを書き
コンパイルはとりあえず今回はg++で
`$ g++ -I /usr/local/Cellar/boost/1.58.0 test1.cpp -o test1`
g++ -I /あなたのpath / プログラム名 -o コンパイル後のファイル名

こんな感じでboostが使えます。
Redmine のメール通知の「ウォッチまたは関係している事柄のみ」とは何か

# 環境

* Redmine 3.2.3

# 問題

メール通知の「ウォッチまたは関係している事柄のみ」の意味が分からない。
特に「関係している」のところ。

# ググって調査

http://redmine.jp/guide/RedmineAccounts/
> チェックボックスがOFFの場合でも、自分が（作成者または担当者として）関係しているチケットおよびウォッチしている事項（チケットやフォーラム）に関しては、メールで通知されます。

http://www.redmine.org/projects/redmine/wiki/RedmineAccounts
> If it's unchecked, you will only receive notifications about the issues you're involved in (author or assignee) and about things you watch (eg. issues, forums).

# ソースコードから調査

http://www.redmine.org/projects/redmine/repository/entry/tags/3.2.3/config/locales/ja.yml#L765

```yaml
  label_user_mail_option_only_my_events: "ウォッチまたは関係している事柄のみ"
```

http://www.redmine.org/projects/redmine/repository/entry/tags/3.2.3/app/models/user.rb#L70

```rb
    ['only_my_events', :label_user_mail_option_only_my_events],
```

http://www.redmine.org/projects/redmine/repository/entry/tags/3.2.3/app/models/user.rb#L711

```rb
        when 'selected', 'only_my_events'
          # user receives notifications for created/assigned issues on unselected projects
          object.author == self || is_or_belongs_to?(object.assigned_to) || is_or_belongs_to?(object.assigned_to_was)
```

# その他

公式 wiki の記述とその日本語訳の内容が古いように思われる。

http://www.redmine.org/projects/redmine/wiki/RedmineAccounts#Mail-notifications
> Mail notifications
> If Mail notifications is checked, you will receive notifications about any event that occurs on the projects you belong to (issue added or edited, new document,...).
> 
> If it's unchecked, you will only receive notifications about the issues you're involved in (author or assignee) and about things you watch (eg. issues, forums).

http://redmine.jp/guide/RedmineAccounts/
> メール通知
> メール通知 のチェックボックスにチェックを入れると、所属するプロジェクトでのイベント(チケットの追加・編集、新しい文書の追加)が行われるたびに、メールで通知されます。
> 
> チェックボックスがOFFの場合でも、自分が（作成者または担当者として）関係しているチケットおよびウォッチしている事項（チケットやフォーラム）に関しては、メールで通知されます。

チェックボックスについて説明している。
最近のバージョンだとメール通知のチェックボックスと言えば「自分自身による変更の通知は不要」と思われる。
このチェックボックスのことだとすると意味が通じない。

公式 wiki の更新履歴を見ると古い実装を説明した記述から更新されていないと思われる。
リビジョン 855 でチェックボックスから現在のセレクトメニューに変更している。

http://www.redmine.org/projects/redmine/repository/revisions/855
> More flexible mail notifications settings at user level. A user has now 3 options:
> * notification on any event on all his projects
> * notification on any event on selected projects only (if the user belongs to more than 1 project)
> * notification only for things that he watches or he is involded in (eg. issues that he watches or he is author or assignee)
pry include gem to debug

https://github.com/yukimotopress/gem-dev/blob/master/02__Make_your_own_gem.md

```rb
% irb -Ilib -rhola
irb(main):001:0> Hola.hi("english")
=> "hello world"
irb(main):002:0> Hola.hi("spanish")
=> "hola mundo"
```

-I指把lib目录加入load_path,-r表示require这个文件

```rb
vagrant@precise64:~/data$ pry -Iinclude -r1
[1] pry(main)> Hold.test
lala
=> nil
[2] pry(main)> exit
```

```bash
vagrant@precise64:~/data$ ls -al include/
total 13
drwxrwxrwx 1 vagrant vagrant     0 Jun 15 14:42 .
drwxrwxrwx 1 vagrant vagrant 12288 Jun 15 14:41 ..
-rwxrwxrwx 1 vagrant vagrant   106 Jun 15 14:43 1.rb
```


```rb
class Hold
	def self.test
		A.lala
	end
end

class Hold::A
	def self.lala
		puts "lala"
	end
end
```

https://github.com/thoughtbot/bitters/issues/215

```rb
rubygems/specification.rb:2158:in `method_missing': undefined method `this' for #<Gem::Specification
```

升级rubygems

gem update --system
Git2.9のキレイなdiffを出すためのconfig

*Git 2.9 has been released*
[https://github.com/blog/2188-git-2-9-has-been-released](https://github.com/blog/2188-git-2-9-has-been-released)

昨日キレイなDIFFが出せるgit2.9がリリースされました。
homebrewで `brew upgrade git` な感じでアップグレードすれば2.9は入るのですが、
このキレイなDIFFは標準では有効になってないので、記事にあるとおりに設定を行いましょう。
だいたい以下のような感じのコマンドうてばいいと思います。

## 下準備：diff-highlightにPATHを通す

まぁ通さずに直接読んでもいいんですが、通しておきましょう。
homebrewでいれるとdiff-highlightさんは↓あたりにいるのでPATHを通しておきましょう。

~~`export PATH=$PATH:/usr/local/Cellar/git/2.9.0/share/git-core/contrib/diff-highlight`~~
`export PATH=$PATH:/usr/local/share/git-core/contrib/diff-highlight`
修正: バージョン指定ではなく share を参照したほうがよいとのコメントいただきました。ありがとうございました。

## いい感じの色になるやつ

```
$ git config --global pager.log 'diff-highlight | less'
$ git config --global pager.show 'diff-highlight | less'
$ git config --global pager.diff 'diff-highlight | less'
```

追記: `git add -p` ( `git add --patch` ) も対応させるには以下

```
$ git config --global interactive.diffFilter 'diff-highlight'
```


## いい感じの差分になるやつ

```
$ git config --global diff.compactionHeuristic true
```


以上です。あとは普通に `git diff` すればキレイなDIFFが確認できて幸せやつ。
mod_rewriteの設定

rewrite ruleを設定してみる

参考:
http://oxynotes.com/?p=7392
http://qiita.com/s2maeda/items/21d9458e44f86597d1ae
https://teratail.com/questions/1239
http://phantom37383.blog.fc2.com/blog-entry-1551.html
https://www.gidblog.com/invalid-command-rewritelog/

以下を追加

```
vim /etc/apache2/apache2.conf
+LoadModule rewrite_module mod_rewrite.so                                                                                                                                                                                                                                  
+RewriteLog /var/log/httpd/rewrite.log                                                                                                                                                                                                                                     
+RewriteLogLevel 9
```
各種設定が足りなかったら追加

```
cd /var/log
mkdir httpd
chmod 777 httpd
ln -s /usr/lib/apache2/modules/mod_rewrite.so /etc/apache2/
```

apache restartでなんか出た

```
ubuntu@ip-172-31-28-173:/etc/apache2$ service apache2 restart
 * Restarting web server apache2                                                                                                                                                                                                                                       [fail] 
 * The apache2 configtest failed.
Output of config test was:
AH00526: Syntax error on line 224 of /etc/apache2/apache2.conf:
Invalid command 'RewriteLog', perhaps misspelled or defined by a module not included in the server configuration
Action 'configtest' failed.
The Apache error log may have more information.
```
ここ参考にした
http://blog.mor-maid.info/%E6%8A%80%E8%A1%93%E7%B3%BB/%E3%80%90apache%E3%80%91%20rewritelog%E3%81%AE%E8%A8%AD%E5%AE%9A

書き方が古かったようで、apache 2.4では
```
LogLevel alert rewrite:trace3
```
としか書けないよう。(ログファイルは選べないみたい)

そしてapacheのrestart
```sudo service apache2 restart
```

これによって
[:http_address]/contact
のようなアドレスもアクセスできるようになった
ストリーミング処理がたくさんあって困る話

雑記

近年、「オープンソース×ストリーミング処理」の実装が多くでてきているように思う。少し思いつくだけで以下があげられる。

- Storm
- Samza
- Spark Streaming
- Flink
- Apex
- Kafka Streams

この潮流の源泉はなにかと考えると、BigDataやIoTなどのコンテキストでのニーズの高まりだけでなく、Hadoopを筆頭とする分散処理基盤が成熟しつつあるというのもあるんじゃなかろうか。

これらのプロダクトの目指す方向性は、大体一緒で、以下のキーワードが付随することが多い。

- at least onceなセマンティクス
- 分散処理 (主にHadoop/YARN上で動作する)
- 耐障害性
- ステートフルな処理 (Window処理)
- （ある程度の）順序性の担保
- 機械学習

たくさん実装されていると比較したがるのが人の性というもので、探してみるとSamzaの公式ドキュメント（http://samza.apache.org/learn/documentation/0.10/comparisons/introduction.html） がマトモな軸でプロダクトの比較をしているように思われる。比較軸はDurability/Ordering/StateManagement/Parallelism/Bufferingなどが挙げられている。日本語のドキュメントでは、前日のKafka Meetup#1 で話されていた @kimutansk の資料がよくまとまっていているように感じた。 http://kafka-apache-jp.connpass.com/event/32293/presentation/

私が知る限り（というかSpark StreamingとKafka Streamsくらいしかまともに触っていないが・・）、大体以下のようなハードルがあるように感じる。

- プログラミングの前に抽象化された概念(KTable とかDStreamとか）を理解しなければいけない
- 基盤の特徴を理解したうえでの実装が必要(例: Idemponentにして exactly onceを実現する)
- 基盤側の都合もプログラムでケアしなければならない（チェックポイントとか）

日本のSI業界ではなかなかそんな人材いないよね、と純粋に思うわけである。身近にいたら重宝するレベル。まあSIベンダに期待しないで自社で人材を育てなさいってコトでよろしく。

たくさんあるプロダクトで一番おすすめはと考えてみると、大体こういうのは「後発で」、「データソースとの連携性が高く」、「安定した開発体制」を鑑みて

**Kafka Streams**

がいいんじゃないかなと判断した。おっと、LinkedIn はMicrosoftが買収したというニュースがあったなぁ。大丈夫かなぁ・・・とやっぱり心配になってきたｗ

そんなことを思う梅雨の夜
HubotのCoffeeScriptで外部クラスを読み込む方法

# はじめに
Hubotを使ってSlackのbotを作ろうと思って、
既存のクラスを使いまわしたいなーと思った時にハマったのでメモ

いろんなサイトを見ていると、`window.Hoge`のようにwindowオブジェクトのプロパティにしてしまえとか、`@Hoge`としてしまえという話が多かった。

だがしかし、Hubotには画面がないからwindowオブジェクトなんてないし、
@が使えるのも画面を管理するview側からだけ。

# 解決策
ひとことで言うと、呼ばれる側のクラス`class Hoge`の`module.exports = (robot)`の中で、`module.exports = Hoge`としてあげればいい。

そして呼び出す側は、`Hoge = require('./hoge')`としてあげれば自由に使うことができる。

# ソースコード
シンプルに書くと以下の様な感じ。

```coffeescript:hoge.coffee
class Hoge
  constructor: (@robot) ->
    
module.exports = (robot) ->
  hoge = new Hoge robot
  
  robot.hear /hogehoge/i, (msg) ->
    msg.send "hogehoge"
    
  module.exports = Hoge
```

で、呼び出す側では

```coffeescript:fuga.coffee
Hoge = require('./hoge')

module.exports = (robot) ->
  hoge = new Hoge robot
```

のようにする。

# ちなみに
`hoge.coffee`をjsに変換してみると以下のようになる。

```js:hoge.js
var Hoge;

Hoge = (function() {
  function Hoge(robot1) {
    this.robot = robot1;
  }

  return Hoge;

})();

module.exports = function(robot) {
  var hoge;
  hoge = new Hoge(robot);
  robot.hear(/hogehoge/i, function(msg) {
    return msg.send("hogehoge");
  });
  return module.exports = Hoge;
};
```
AnsibleでCisco IOSのコンフィグを標準機能だけで収集する

# 1. 方針
ios_templateというモジュールにはbackupオプションというものがあり、
実行時にバックアップ用にコンフィグをとってくれるようです。
https://docs.ansible.com/ansible/ios_template_module.html
>When this argument is configured true, the module will backup the running-config from the node prior to making any changes. The backup file will be written to backup_{{ hostname }} in the root of the playbook directory.

なのでこれを利用して、コンフィグの収集をしてみます。

※2016/10/08追記
ansibleのCHANGELOGによると、 ネットワークモジュールの
*_template モジュールの機能は、 *_config に統合され 2.4で削除されるようです。
https://github.com/ansible/ansible/blob/stable-2.2/CHANGELOG.md
>All functionality from *_template network modules have been combined into *_config module

# 2. 各ファイルの準備
ios_templateの本来の用途はテンプレートファイルを用意して、流し込みをする
なのですが、今回はコンフィグ変更はしてほしくないので、空のテンプレートファイル
を用意して、それをPlaybookから呼ぶことにします。

## 2.1. Playbookの作成

```yaml:getconfig.yml
- hosts: cisco   # イベントファイルで 192.168.1.1を定義済み。もちろん複数定義もOK。
  gather_facts: no
  connection: local

  tasks:
    - name: set
      ios_template:
        provider: "{{ cli }}"
        src: config.j2           # ★★別途定義するテンプレートファイル（今回は空）
        backup: true             # ★★バックアップを取得するオプション
        include_defaults: false  # これを指定しない場合「show run all」になります。
  vars:
    cli:   # 接続情報を辞書で定義（usernameとそれ以降はインベントリファイルから取得定義）
      host:     "{{ inventory_hostname }}"    # ホスト対象ホスト
      username: "{{ ansible_user }}"          # ログインユーザー
      password: "{{ ansible_password }}"      # ログインパスワード
      authorize: true                         # 特権モードに移行
      auth_pass: "{{ cisco_enable_secret }}"  # 特権パスワード
```

## 2.2. j2ファイルの作成
空のテンプレートファイルをPlaybookと同じディレクトリに配置します。
ここでは「config.j2」というファイル名にします。
空ファイルは避けたい場合は、`!hoge` などコンフィグに影響がない内容にしておきます。

# 3. Playbook実行
## 3.1. Playbook実行

バックアップコンフィグを書き出すときのパーミッションの関係で、sudoしてます。

```
user@ubuntu-vm:/etc/ansible$ sudo ansible-playbook getconfig.yml 

PLAY [cisco] *******************************************************************

TASK [set] *********************************************************************
ok: [192.168.1.1]

PLAY RECAP *********************************************************************
192.168.1.1               : ok=1    changed=0    unreachable=0    failed=0
```

## 3.2. 収集コンフィグの確認
backupディレクトリの下に、ホスト名と日時を含むファイル名でコンフィグが
保存されていることを確認します。

```
user@ubuntu-vm:/etc/ansible$ head -n 10 backup/192.168.1.1_config.2016-06-15@22\:17\:32
Building configuration...

Current configuration : 7375 bytes
!
! Last configuration change at 22:06:22 JST Wed Jun 15 2016 by user
! NVRAM config last updated at 21:21:22 JST Wed Jun 15 2016 by user
!
version 12.2
no service pad
service timestamps debug datetime msec
```
ありました。

# 4. 注意点
- 試した限り、もう一度実行すると古いバックアップは削除されます。

# 5. 参考情報
コンフィグファイルの名前を自分で決めたり、もっと柔軟にやりたい場合は
[【Ansible】AnsibleでCisco機器を制御してみる(サンプルコード1 config収集編)](http://qiita.com/onifinger/items/0a05faf175cc818fe447)
が参考になると思います。
MacOSでpyenvを使ってPythonの開発環境を構築


pyenvを使えば、pythonを複数バージョン共存させることができるため、非常に便利です。


#### pyenvのインストール
```
brew install pyenv-virtualenv pyenv
```

#### pyenvの設定
```~/.zshrc
# pyenv
export PYENV_ROOT="${HOME}/.pyenv"
export PATH=${PYENV_ROOT}/bin:$PATH
eval "$(pyenv init -)"
```

**source ~/.zshrc** で反映

#### pyenv-pip-rehashの導入
pyenv rehashの自動化ツールであるpyenv-pip-rehashを導入

```
git clone https://github.com/yyuu/pyenv-pip-rehash.git ~/.pyenv/plugins/pyenv-pip-rehash
```

#### pythonをインストール
```
# インストールできるバージョン一覧
pyenv install -l

# anacondaを使いたかったのでanacondaの最新バージョンをインストール
pyenv install anaconda3-4.0.0

# インストールされたバージョンの確認
pyenv versions

# 切り替え
pyenv global anaconda3-4.0.0

```

#### インストールしたanacondaが使えるか確認
```
# コマンドの場所
which python                                                   
/Users/yudsuzuk/.pyenv/shims/python

# バージョン確認
python --version                                                
Python 3.5.1 :: Anaconda 4.0.0 (x86_64)

ipython notebook
```

いけた
MacBook 12-inch, Early 2016 で rbenv のベンチマークしてみた

# 概要

MacBook 12-inch, Early 2016 を購入したので、手持ちの MacBook Air / MacBook Pro と比較のためにベンチマークとってみました。

# 環境

今回使用した環境は以下の通り。

* MacBook (Retina, 12-inch, Early 2016)
<img width="698" alt="macbook_retina.png" src="https://qiita-image-store.s3.amazonaws.com/0/28707/bfcba89f-335a-e5ec-3785-e6e44a22caf5.png">

* MacBook Air (11-inch, Mid 2011)
![macbook_air.png](https://qiita-image-store.s3.amazonaws.com/0/28707/afc3e497-c27f-6563-71d1-bb1898e31598.png)

* MacBook Pro (Retina, 15-inch, Late 2013)
<img width="698" alt="macbook_pro.png" src="https://qiita-image-store.s3.amazonaws.com/0/28707/29c20ab7-c3c2-ae38-89e7-64cb7febc09c.png">

# 検証方法

rbenv で Ruby 2.3.1 の build にかかった時間を測定するという簡単なテストで、各実行は 1回だけ、計測は time を使っただけです。

# 検証結果

| Hardware | time | ratio |
|:--|--:|--:|
|MacBook Pro|3:00|1.93|
|MacBook|4:00|1.45|
|MacBook Air|5:47|1.00|

というわけで、MacBook は CTO で Core m7 6Y75 1.2GHz にしているとはいえ、MacBook Air の Core i5 2467M 1.6GHz よりも 1.45倍速い模様。

# 感想

2015年モデルは遅い遅いと言われてきた MacBook ですが、2016年モデルで Core m7 だと自分の用途であれば十分実用的な速さでした。これなら大満足。
Excelで宇宙の中に星を描く with Python

#【概要】
　Excelのセルを大幅に黒く塗りつぶして、その中に白と赤と青の色を使って
　宇宙の中に星ができているように描画します。

#【環境】
　windows8.1
　Python2.7

#【プログラム】
```py:color.py
#-*- coding:utf-8 -*-

import xlwings as xw
import random
import time

wb = xw.Workbook()

xw.Range((1,1),(400,900)).color = (0, 0, 0)

xw.Range((1,1),(400,900)).column_width = 0.05
xw.Range((1,1),(400,900)).row_height = 0.5

for i in xrange(100):
    n1 = random.randint(1, 900)
    n2 = random.randint(1, 900)
    if i > 95:
        # 赤の星
        xw.Range((n1, n2)).color = (255, 0, 0)
    elif i > 90:
        # 青の星
        xw.Range((n1, n2)).color = (0, 0, 255)
    else:
        # 白の星
        xw.Range((n1, n2)).color = (255, 255, 255)
    time.sleep(0.1)
```

#【結果】
<blockquote class="twitter-video" data-lang="ja"><p lang="und" dir="ltr"><a href="https://t.co/2Uu6oS5Mci">pic.twitter.com/2Uu6oS5Mci</a></p>&mdash; nobu (@AlgebraNobu) <a href="https://twitter.com/AlgebraNobu/status/743064014595330048">2016年6月15日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

#【参考サイト】
　[xlwings](http://docs.xlwings.org/en/stable/index.html)
Gitでリモートレポジトリの登録、確認、更新、削除(git remote)

忘れちゃうのでメモ。

リモートリポジトリの登録
------------------------

``` sourceCode
$ git remote add <name> <url>
```

登録されているリモートリポジトリの確認
--------------------------------------

-v をつけると詳細情報

``` sourceCode
$ git remote
$ git remote -v
```

リモートリポジトリURLの編集
---------------------------

``` sourceCode
$ git remote set-url <name> <newurl>
```

リモートリポジトリ名の変更
--------------------------

``` sourceCode
$ git remote rename <old> <new>
```

リモートリポジトリの削除
------------------------

``` sourceCode
$ git remote rm <name>
```
【論文シリーズ】ボルツマンマシンにおける近似手法を学ぶ

## 原文
[DBMのための効率的学習手順 (An Efficient Learning Procedure for Deep Boltzmann Machines)](http://goo.gl/g4V8pd)
Ruslan Salakhutdinov (2012)




## 1. 要約／背景
* DBMの生成モデルを厳密に求めることは基本的に出来ない。そこで、パラメータの分布について、近似を置くことになる。しばしば使われる近似が、平均場近似、変分近似、MCMCによる近似である。
* 近似による効能は、アウトプットの精度というより、計算のスピードや効率性に当たる。DBMはまともにやると計算コストが指数関数的にかかり、モデルの実装が不可能になる。なので、近似が必要になる。


## 2. 骨子の理論
(1)平均場近似
複数の因子・パラメータが関わるとき、全体のパラメータ分布は、各パラメータ分布の連乗積に分解できる。(それぞれが事象として独立であるという仮定)

$$Q({\bf h};\mu) = \prod_{j=1}^{F}q(h_i)$$

(2)変分原理による近似
BMの生成モデル決定の中核を担う。入力データを条件としたパラメータの事後分布の対数尤度を2つの式に要素分解する。ひとつ目は「下界 (lower bound)」とよばれるもので、イェンゼンの不等式から導かれる。下界は同時分布とパラメータ分布の統合的な関係性を表したものになる。ふたつ目は、KLダイバージェンスである。

```math
\begin{align}
\log P({\bf v};\theta) &\geqq \sum_{{\bf h}}Q({\bf h}|{\bf v}; \mu)\log P({\bf v}, {\bf h};\theta) + H(Q) \\
&= \log P({\bf v};\theta) - KL[Q({\bf h}|{\bf v}; \mu)||P({\bf h}|{\bf v}; \theta)]
\end{align}
```
KLダイバージェンスが最小のとき、対応するパラメータの確率分布を最尤のパラメータとして採用する。

(3)MCMCによる近似
複数の事前変数が絡む条件付き確率の計算において、事前変数間の変数が独立で、直近の変数のみを考慮するという仮定。
なぜ、この近似を適用するかというと、繰り返しサンプリング操作をして、事後分布を推定するからである。
具体的な適用場面は、パラメータの更新フェーズである。例えば、時系列$t$において、$M$個サンプリングしたとする。

```math
X^t = {\tilde{\bf x}^{t,1},....,\tilde{\bf x}^{t,M}}
```
（チルダはサンプリングされた確率変数という意味）
時系列$t+1$の$\theta$（ボルツマンマシンにおける重みパラメータ）の更新するとき、MCMCにより、時系列$t$のM個のサンプリングから更新する。

```math
\theta^{t+1} = \theta^{t} + \alpha_t[\Phi(\tilde{\bf x})-\frac{1}{M}\sum_{m=1}^{M}\Phi(\tilde{\bf x}^{t+1,m})]
```




## 3. モデル適用例
MNISTによるパフォーマンス検証はなされた。
が、本論文の改善の重点が性能には置かれていない。
とはいえ、60000学習データを用いた時の正答率が99.5%を超えた。
NCA, kNN, AEのみと比較したが、トップの正答率だった。
【Python】slackのチャンネルにメッセージを投げる

#　なにこれ
何かバッチを走らせていて、終了時・異常発生時に通知をしたいってケース多いですよね。
最近、自分の中で流行っているのが、「通知にSlackを使う」というやり方。
何が嬉しいかって携帯でもパソコンでもすぐ確認できる事。
そして、Slackのチャンネルであれば関係者をすぐ巻き込める事。
特定サービスのオレオレ監視をすぐ作りたいという時につかってます。


# 必要なもの
* Slack用Token  (https://api.slack.com/)
* slackclient


# つかいかた
下記、スクリプトのtokenを各自のトークンに書き換えてください。
以下の例だと、#uhouho_channnelにtsukuneという名前のユーザーが
「ちっす」とつぶやきます。

## pip install
```bash
pip install slackclient
```

## コード例

```py
from slackclient import SlackClient

def post_slack(message):
    token = "xoxp-XXXXXXXXXX-XXXXXXXXXX-XXXXXXXXXX-XXXXXXXXXX"
    sc = SlackClient(token)
    sc.api_call("api.test")
    sc.api_call(
        "channels.info",
        channel="1234567890"
    )
    sc.api_call(
        "chat.postMessage",
        channel="#uhouho_channnel",
        text=message,
        username='tsukune',
        icon_emoji=':robot_face:'
    )

if __name__ == '__main__':
    post_slack('ちっす')

```
【読書】独習Java メモっぽいレポート　二枚目

メモっぽいレポート２枚目。

#第二章：クラスとメソッド

2.1 メソッドの構造

メソッドとは、プログラムステートメント（命令語）の塊である。

例として簡単なメソッドを書いてみる

```java
public void hoge(int num, float fnum){

}
```
メソッドの（）内に存在する ```num```や```fnum``` はパラメーターといい、
```int```や ```float```をパラメータの型という
メソッドを実行時に実行エラー（ランタイムエラー）が発生する場合がある
Javaには発生した問題を扱う例外処理というものが備わっている。
この例外とは実行エラーが発生したと一緒に生成されるオブジェクトの一つ。

```java
void hoge() throws IOException {
    me();
}
```

```throws　投げる例外の型``` という感じで指定することができる。
メソッドを呼ぶには```hoge(num); ``` のような形で書くと呼び出せる。

2.2 静的メソッドと静的変数の概要


静的なメンバはクラスそのものに定義されているのに対しインスタンスメンバはクラスのオブジェクトに定義されている。

静的なメソッドの呼び出し方は

```java
クラス名.メソッド名(hoge);
```
という形で呼び出す。

```java
abs(double d)
ads(float f)
ads(int i)
```
上記のようにメソッド名は一緒だが引数が違う物がある。
これはJavaの仕組みでメソッドのオーバーロードと言う。

静的変数とは関数やブロックの中で宣言されている変数である。
この変数は関数やブロック内での処理が終了しても値を保持し続けることができる。

この静的変数の使用方法は

```
クラス名.変数名
```
で使用することができる。
静的変数はクラスに定義されているオブジェクトのすべてで扱える定数。

2.3 インスタンスメソッドとインスタンス変数

インスタンスメソッドはオブジェクトに結び付けられている。
インスタンスメソッドは結び付けられているオブジェクトで動く。

```java
class Hoge{

   public static void main( String argv[] ){
      Hogehoge.hogeru();

   }
}

class HogeHoge{

   public void hogeru( ){
      System.out.println("ホゲェェェェ");

   }
}
```
hogeruをクラスHogeで使うにはクラスHogeに 

```java
HogeHoge hhge = new HogeHoge(); 
```
というHogeHogeのインスタンスを生成しなければ使えない。
（鋳型だけでは何もできないから鋳型を使い実体を作る）

2.4 Integerクラス

```
int num;
```
上記のintという方をカプセル化するのがIntegerオブジェクト。
Integerクラスに限らないが静的メソッドとインスタンスメソッドの両方を提供している。
（Float、Double、String　etc...）

2.5 new演算子

オブジェクトの生成にはnew演算子を使う。
2.3でやっているように

```java
HogeHoge hhge = new HogeHoge(); 
```
で、生成する。
newの隣にある ``` HogeHoge(); ``` はコンストラクタと言う。
コンストラクタとは```new```した時に自動的に実行されるメソッドである。

2.6　ガーベジコレクション

ガーベジコレクションというものは、オブジェクトで使われていたメモリリソースを
勝手に回収でしてくれるというものである。（Javaに組み込まれている仕組み）

どのタイミングでこのガーベジコレクションに行くかというと
どの変数からも参照されなくなったオブジェクトが対象。（なった時点ですぐに行われるとは限らないらしい）

Javaでは明示的にオブジェクトを削除することはない。
削除することがない理由はプログラミングエラーを回避するため。
変数から参照されなくなったオブジェクトを処理するスケジューリングはJVMに委ねられている。

2.7　その他のラップクラス

```java
boolean

char

byte

short

int

long

float

double
```
Javaでは上記の8つに個々にラップクラスが存在する
2.4でやったIntegerクラスと同じく静的メソッドとインスタンスメソッドの両方を提供している。


2.8　StringBuffer クラス

StringBufferとは　文字列をカプセル化するものである。

カプセル化すると文字列が変更できなくなるが、このクラスを使うことにより
文字列を追加・挿入することができる。

```java
//文字列を付け加える
strbff.append("ABCDEFG");
```

```java
StringBuffer strbff = new StringBuffer("ba");
//先頭に文字を入れる
strbff.insert(0, "c");
```
StringBufferは初期化時に16文字入る領域を持つ。
また、あらかじめ```StringBuffer strbff = new StringBuffer("ba");```のようにすると
入っている文字数＋16文字が入る領域を確保する。
StringBufferの領域は必要に応じて増えていく。

2.9  オブジェクトの配列

オブジェクトにも第一章の1.12であったように一次元配列がある。

```java
String array[] = new String[4];

array[0] = "GOLD"
array[1] = "Lincle"
array[3] = "SPADA"
```
上記は ```array[2]```だけ初期されていない状態。
この時```array[2]```の中身はnullである。
この状態は変数がどのオブジェクトも参照していないという状態なのでnullとなる。

2.10 コマンドライン引数

javaのプログラムにはmainという静的なメソッドが必ず存在する。

```java
main(args[])
```
mainメソッドは一つの引数を取りユーザーがコマンドライン上から入力した値を表す。

2.11 System クラス

Systemクラスには実行環境に関する属性の定義がされている。
よく使うSystem.out...この``` out ```というものにPrintStreamというオブジェクトへの参照が入っている。
他にも経過時間を表示するメソッド、入力を入出力できるメソッド```System.InputStream ```、
実行しているプログラムを終了させる``` System.exit``` といったメソッドが入っている。

今日はここまで。
jsdoでshadertoy sandbox その3

#概要
jsdoでshadertoyのコードを実行したい。
マウスも使いたい。
#成果物
http://jsdo.it/ohisama1/CUIY
#写真
![m.jpg](https://qiita-image-store.s3.amazonaws.com/0/18104/dd167461-7321-16e1-b39f-6843c8e149c9.jpeg)

#サンプルコード
```
precision mediump float;
uniform vec2 iResolution;
uniform vec4 iMouse;    
uniform float iGlobalTime;
uniform sampler2D iChannel0;
uniform sampler2D iChannel1;


void mainImage(out vec4 fragColor, in vec2 fragCoord)
{
	vec2 uv = fragCoord.xy / iResolution.xy;
    bool iMouseDown = !(iMouse.z < 0.);
    vec2 iMouseClick = iMouse.zw;
    if (iMouseClick.x < 0.) 
    {
        iMouseClick.x *= -1.;
    }
    if (iMouseClick.y < 0.) 
    {
        iMouseClick.y *= -1.;
    }    
    if (uv.x < 0.5) 
    {
        fragColor = vec4(iMouse.xy / iResolution.xy, 0., 0.);
    } 
    else 
    {
        fragColor = vec4(iMouseClick.xy / iResolution.xy, 0., 0.);
    }
    float distToScreenCenter = distance(fragCoord.xy, vec2(0.5, 0.5) * iResolution.xy);
    if (distToScreenCenter < 20. && distToScreenCenter > (iMouseDown ? 0. : 18.)) 
    {
    	fragColor = vec4(1., 1., 1., 0.);
    }
    float distToMouse = distance(fragCoord.xy, iMouse.xy);
    float distToMouseClick = distance(fragCoord.xy, iMouseClick.xy);
    if (distToMouse < 10. && distToMouse > 8.) 
    {
        fragColor = vec4(1.0, 1.0, 1.0, 0.);
    }
    if (distToMouseClick < 5.) 
    {
        fragColor = vec4(1.0, 1.0, 1.0, 0.);
    }    
}

void main() 
{
    vec4 color;
    mainImage(color, gl_FragCoord.xy);
    color.w = 1.0;
    gl_FragColor = color;
}   
```
#説明
iMouseを実装した。
マウスの位置、クリックをuniform4fvで流し込む。
docker-compose を試してみる

今更ながら[公式ドキュメント](https://docs.docker.com/compose/gettingstarted/)に従ってdocker-composeを試してみたのでメモ

## Prerequisites

まずはインストールから。
今回はdocker-machine(docker-toolbox)で行います

```
$docker-machine ssh
```

インストール手順に従ってインストール

```
$ sudo su
# curl -L https://github.com/docker/compose/releases/download/1.7.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
# chmod a+x /usr/local/bin/docker-compose
```

※わざわざrootになって実行したあとに気づいたのですが `sudo -i `使えばいいよって公式に書いてありましたね

確認

```
$ docker-compose --version
docker-compose version 1.7.1, build 0a9ab35
```

## Step 1: Setup

1. テスト用のディレクトリを作成

    ```
    $ mkdir composetest
    $ cd composetest
    ```

2. `app.py` を作成


    ```
    $ vi app.py
    ```
    ```python:app.py
    from flask import Flask
    from redis import Redis

    app = Flask(__name__)
    redis = Redis(host='redis', port=6379)

    @app.route('/')
    def hello():
       redis.incr('hits')
       return 'Hello World! I have been seen %s times.' % redis.get('hits')

    if __name__ == "__main__":
       app.run(host="0.0.0.0", debug=True)
    ```

    Flaskってなんだろって調べたらPython用の軽量なフレームワークみたいですね。
    参考：http://a2c.bitbucket.org/flask/  

    app.pyの中身はアクセスするたびに
    カウンターをインクリメントしていく,
    カウンターはredisで保持って感じかな・・・？



3. `requirements.txt`を作成

    pip install 用にrequirements.txtを作成します

    ```
    $ cat << EOF >  requirements.txt
    flask
    redis
    EOF
    ```

## Step 2: Create a Docker image

Docker imageの作成

1. Dockerfileの作成

    ```:Dockerfile
    FROM python:2.7
    ADD . /code
    WORKDIR /code
    RUN pip install -r requirements.txt
    CMD python app.py
    ```

2. ビルド

    ```
    $ docker build -t web .
    ```

     `-t`オプションで名前:タグ付け

## Step 3: Define services

いよいよ本命 `docker-compose.yml`!

```yaml
version: '2'
services:
  web:
    build: .
    ports:
     - "5000:5000"
    volumes:
     - .:/code
    depends_on:
     - redis
  redis:
    image: redis
```

- `build`: Dockerfileのビルド。Dockerfileのディレクトリを指定
- `ports`: ホストマシンとコンテナのポートマッピングを指定
- `volumes`: ホストマシンのディレクトリをコンテナにマウント。host:container
- `depends_on`:サービスの依存関係を指定。この場合 redis → web の順番で起動する
- `image`: コンテナイメージを指定

yamlでかけるので簡潔でいいですね～
わかりやすいです

## Step 4: Build and run your app with Compose

1. docker-compose.ymlで定義したサービス郡を起動

    ```
    $ docker-compose up
    ```

    おお～、特に問題なさそうです。
    ちゃんとredis → web の順番で起動してますね。

2. http://xxx:5000 にアクセス

   docker machine 上で実行したため、
   まずはdocker machine のipを調べます

   ```
   $ docker-machine ip
   192.168.99.100
   ```

   そしてブラウザでアクセスすると
![image](https://qiita-image-store.s3.amazonaws.com/0/55219/8e909820-c874-7bda-079b-4c43bd96bf7b.png)

  おお！！！！
ちゃんとアクセスするたびに増えているみたいです

Step5 では

```
docker-compose up -d
docker-compose run
```

などの説明がされていましたが今回は割愛


## 感想

複数コンテナを動かすときはかなり楽できそうです。
docker-compose.ymlがわかりやすいのですごくとっつきやすいですね。

色々と試す時の環境構築などにも使っていきたいと思います
EV3にPCからBluetoothでデータを送受信する

[EVで起動しているサーバープログラム](http://qiita.com/amapyon/items/e6ed3cf83dbaa3893726#%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E5%81%B4)に接続し、データを送受信します。
事前にEV3とこのプログラムを動かすPCをペアリングしておいてください。

[BlueCov](http://bluecove.org/)をビルドパスに追加してください。

動作確認環境

 * Surfece Pro 4
 * Windows 10 pro 64bit
 * bluecov-2.1.0.jar
 * EV3 lejos 0.9.1 beta

#クライアントプログラム
```BtPcClient.java
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import javax.microedition.io.Connection;
import javax.microedition.io.Connector;
import javax.microedition.io.InputConnection;
import javax.microedition.io.OutputConnection;


public class BtPcClient {

	public static void main(String[] args) throws Exception {
		int sendMessageNo = 2; // 送信する番号
		int recvMessageNo = 3; // 受信する番号
		
		// サーバー側EV3のBluetoothのMACアドレス、チャネル=1
		String connectionURL = "btspp://001653999999:1";

		System.out.println("Connecting...");

		// サーバー側のデバイスからコネクションを取得する
		Connection connection = Connector.open(connectionURL);
		if (connection == null) {
			System.out.println("Connect fail");
			System.exit(1);
		}
		System.out.println("Connected");


		// 読み、書きのストリームを取得する
		OutputStream os = ((OutputConnection)connection).openOutputStream();
		InputStream is = ((InputConnection)connection).openInputStream();
		
		// メッセージを送信する
		System.out.println("Sending...");
		send(os, sendMessageNo);
		
		// メッセージを受信する
		System.out.println("Receivng...");
		if (isReceived(is, recvMessageNo)) {
			System.out.println("Receive success");
		} else {
			System.out.println("Receive fail");
		}
		
		// 通信の切断を行う
		System.out.println("Closing...");
		try {
			if (null != connection) {
				os.close();
				is.close();
				connection.close();
			}
		} catch (Exception ioe) {
		}

		System.out.println("Finished");

	}
	
	// 送信する
	static void send(OutputStream os, int messageNo) {
		byte[] sendBuff = new byte[16];
		for (int i = 0; i < sendBuff.length; i++) {
			sendBuff[i] = (byte) messageNo;
		}
		try {
			os.write(sendBuff);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	// 指定したメッセージ番号を受信できているかを判定する
	static boolean isReceived(InputStream is, int messageNo) {
		byte[] recvBuff = receive(is);
		for (int i = 0; i < recvBuff.length; i++) {
			System.out.print(recvBuff[i]);
			if (recvBuff[i] != (byte) messageNo) {
				System.out.println();
				return false;
			}
		}
		System.out.println();
		return true;
	}
	
	// 受信する
	static byte[] receive(InputStream is) {
		byte[] recvBuff = new byte[16];
		try {
			is.read(recvBuff);
		} catch (IOException e) {
			e.printStackTrace();
		}
		return recvBuff;
	}

}

```
普段はDateTimeImmutableを使え、DateTimeはやめとけ


# まとめ

* 基本的には[DateTimeImmutable](http://php.net/manual/ja/class.datetimeimmutable.php)を使え
* [DatePeriod](http://php.net/manual/ja/class.dateperiod.php)で事足りる場合は多い。

# DateTimeを使わない例

## $todayとか$tomorrowとかには使わない（DateTimeImmutableを使え）
例えば、知らずに以下のようなコードを書くと、ハマります。

```php
<?php
// 例えば、2016-06-15 15:48
$tomorrow = new DateTime();
// ここで、2016-06-16 15:48になる。
$tomorrow->add(new DatetimeInterval('P1D')); 

// どこか知らな場所でこういうことをやると…
$dayAfterTomorrow = $tomorrow->add(new DatetimeInterval('P1D'));

// $tomorrow 変数が、tomorrowじゃなくなった！！！！
```

普通、「今日」とか「明後日」とか「9日後」などといった、**特定の日付を表す変数** には、[DateTimeImmutable](http://php.net/manual/ja/class.datetimeimmutable.php)を使います。

## 一方向（Unidirectional）のカーソルには使わない（DatePeriodで事足りる）

```php
<?php
function getGenerator(DateTime $first, DateTime $last){
    $cursor = $first;
    while($first <= $last) {
        yield $cursor;
        $first->add(new DateTimeInterval('P1D'));
    }
}
$today = new DateTimeImmutable();
$nextFriday = new DateTimeImmutable('next friday');
foreach(getGenerator($today, $nextFriday) as $datetime) {
    // なにか処理
}
```

上記のコードは、[DatePeriod](http://php.net/manual/ja/class.dateperiod.php)で事足ります。

```php
<?php
$today = new DateTimeImmutable();
$nextFriday = new DateTimeImmutable('next friday');
$interval = new DateInterval('P1D');
$iterator = new DatePeriod($today, $interval ,$nextFryday);
foreach($iterator as $datetime) {
    // 何か処理
}
```

以下のどっちかの場合は、DatePeriodで対応できます。

* 「開始日」と「終了日」と「繰り返す回数」で、ループする
* 「開始日」と「終了日」と「繰り返しごとの時間差」で、ループする


# DateTimeを使う例

## DatePeriodで対応できない、要素数たくさんなイテレータ
要素数が数百程度のイテレータなら、配列かなにかに詰め込んでおけばいいです。  
しかし、例えばデータベースにある1億件のデータに対しての処理で、条件分岐がたくさんあるときは、DateTime型でミュータブルなオブジェクトが役立ちます。

```php
<?php
function get() {
    $datetime = new DateTime();
    $counter = 0;
    do{
        $diffDaysString = "P{$counter}D";
        yield $datetime->add(new DateInterval($diffDaysString));
        $counter++;
    } while($counter < 1000 * 1000);
}

foreach(get() as $datetime) {
    // なんか処理
}
```
Google Cloud Storage | gsutil ls で任意のプロジェクトを指定する

`-p` でプロジェクトIDを指定すれば良い。

例:

```
$ gsutil ls -p [your_project_id]
````

# ちなみに

project_id は [Google Cloud Storage ホーム画面](https://console.cloud.google.com/home/) の「Select a project」から見られる。

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/87b3ae7e-ab19-f0b3-a81f-41ffaac69c6a.png)

# 環境

- gsutil version: 4.19


# 参考

- https://cloud.google.com/storage/docs/gsutil/commands/ls#options

> -p
>Specifies the project ID to use for listing buckets.









<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
canvasにローカル画像を表示

# 概要
html5を使ってローカルに有る画像ファイルを表示する簡単なhtmlを作ってみました。イメージの描画にcanvasを使用しています。
# 参考にさせて頂いたページ
http://qiita.com/junya/items/0f977ae7f8f620fd83e7
http://d.hatena.ne.jp/oovu70/20111122/p1
# ソースの説明
ファイルの読み込みに加え、イメージのロードも非同期になりますので、コールバックで処理をしないとcanvasへの描画は上手くいきません。
1. html要素として予め定義しているcanvasをセレクトしています。
2. getContext()メソッドで描画機能を有効にしています。jQueryのセレクタを使っていますのでcanvas[0]とします。
3. naturalHeight, naturalWidthでイメージのサイズを得ることが出来ます。縦横比を維持して表示サイズを変更しています。
4. canvasのサイズを画像に合わせて変更しています。方法として妥当かどうかは解りませんが、attrメソッドを使うとcanvasが初期化されるようで、連続して動作させた場合にゴミが残りません。width/heightメソッドだとゴミが残ります。
5. drawImageの引数指定でリザイズをさせています。

```index.html
<!DOCTYPE HTML>
<html lang="ja">
    <head>
        <meta charset="UTF-8">
        <script src="http://code.jquery.com/jquery-latest.js" type="text/javascript"></script>
        <title>画像ファイルをCANVASでプレビュー</title>
    </head>
    <body>
        <h1>画像を選択してください。</h1>
        <form id="my_form">
            <input id="ufile" name="ufile" type="file" accept="image/jpeg,image/png"><br>
        </form>
        <hr>
        <div>
            <h1>プレビュー</h1>
            <canvas id="cnvs"></canvas> <!-- canvas要素を配置 -->
        </div>

        <script>
         $(function(){

             // id="ufile"の変化でコールバック
             $("#ufile").change(function(){
                 // 選択ファイルの有無をチェック
                 if (!this.files.length) {
                     alert('ファイルが選択されていません');
                     return;
                 }

                 // Formからファイルを取得
                 var file = this.files[0];

                 // (1) HTMLのCanvas要素の取得
                 var canvas = $("#cnvs");

                 // (2) getContext()メソッドで描画機能を有効にする
                 var ctx = canvas[0].getContext('2d');

                 // 描画イメージインスタンス化
                 var image = new Image();

                 // File API FileReader Objectでローカルファイルにアクセス
                 var fr = new FileReader();

                 // ファイル読み込み読み込み完了後に実行 [非同期処理]
                 fr.onload = function(evt) {

                     // 画像がロードされた後にcanvasに描画を行う [非同期処理]
                     image.onload = function() {
                         // (3) プレビュー(Cnavas)のサイズを指定
                         var cnvsH = 240;
                         var cnvsW = image.naturalWidth*cnvsH/image.naturalHeight;
                         // (4) Cnavasにサイズアトリビュートを設定する
                         canvas.attr('width', cnvsW);
                         canvas.attr('height', cnvsH);
                         // (5) 描画
                         ctx.drawImage(image, 0, 0, cnvsW, cnvsH);
                     }
                     // 読み込んだ画像をimageのソースに設定
                     image.src = evt.target.result;
                 }

                 // fileを読み込む データはBase64エンコードされる
                 fr.readAsDataURL(file);
             })
        })
        </script>
    </body>
</html>
```
# 確認
Firefox 47.0
Chrome 51.0.2704.84m
Edge 25.10586.0.0
IE 11.306.10586.0
で確認しました。
Leaflet のポップアップのカスタマイズ

[Leaflet](http://leafletjs.com/) のポップアップは **A pretty CSS3 popup. Easily customizable.** とのことなので、実際に CSS でカスタマイズしてみます。

# 1. シナリオ

デフォルトのこれを

![image](https://qiita-image-store.s3.amazonaws.com/0/82494/027ce42e-b9f2-1426-7660-9c74c8131078.png)

こんなふうにしてみました

![image](https://qiita-image-store.s3.amazonaws.com/0/82494/3ea96752-e21c-1cd1-8407-0b543c4e476e.png)

# 2. ソース

<http://leafletjs.com/> のサンプルに対して CSS を数行追加すると完成です。



```index.html
<!DOCTYPE html>
<html>

<head>
  <meta charset="UTF-8">
  <title>Leaflet Popup CSS Hack</title>

  <link rel="stylesheet" href="http://cdn.leafletjs.com/leaflet/v0.7.7/leaflet.css" />
  <script src="http://cdn.leafletjs.com/leaflet/v0.7.7/leaflet.js"></script>
  <style>
    body {
      width: 100%;
      height: 100%;
      overflow: hidden;
    }

    #map {
      position: absolute;
      top: 0;
      left: 0;
      width: 100%;
      height: 100%;
      margin: 0;
      padding: 0;
    }

    .leaflet-popup-content-wrapper,
    .leaflet-popup-tip {
      background: black;
      border-color: orange;
    }

    .leaflet-popup-content,
    a.leaflet-popup-close-button {
      color: orange !important;
      font: bold 14pt monospace;
    }

    .leaflet-popup-content-wrapper {
      border-width: 3px;
      border-style: solid;
    }

    .leaflet-popup-tip-container {
      margin-top: -3px;
      height: 23px;
    }

    .leaflet-popup-tip {
      border-style: solid;
      border-width: 0 3px 3px 0;
    }
  </style>
</head>

<body>
  <div id="map"></div>
  <script>
    var map = L.map('map').setView([51.505, -0.09], 13);

    L.tileLayer('http://{s}.tile.osm.org/{z}/{x}/{y}.png', {
      attribution: '&copy; <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
    }).addTo(map);

    L.marker([51.5, -0.09]).addTo(map)
      .bindPopup('A pretty CSS3 popup.<br/> Easily customizable.')
      .openPopup();
  </script>
</body>

</html>

```

# 3. 解説

ポップアップ配下の DOM ツリーはだいたい以下のような構造になっているので、これをもとに CSS を追加定義していくだけです。

```
+ div.leaflet-popup
    + a.leaflet-popup-close-button
        + "x"
    + div.leaflet-popup-content-wrapper
        + div.leaflet-popup-content
            + "A pretty CSS3 popup..."
    + div.leaflet-popup-tip-container
        + div.leaflet-popup-tip
```


|element  |note  |
|--------------|---------------|
|div.leaflet-popup  | ルートコンテナ|
|a.leaflet-popup-close-button | 右上にある閉じるボタン|
|div.leaflet-popup-content-wrapper|ポップアップの本体|
|div.leaflet-popup-content|ポップアップの文字列のプレースホルダ|
|div.leaflet-popup-tip-container|ポップアップ下の三角形を保持するための領域|
|div.leaflet-popup-tip|ポップアップ下の三角形本体|

* ポップアップの背景色と枠線は div.leaflet-popup-content-wrapper と div.leaflet-popup-tip に対して指定
* 枠線をつけて膨らんだ分、div.leaflet-popup-tip-container のマージンを変更して調節
* フォントと文字色の変更は a.leaflet-popup-close-button と div.leaflet-popup-content に対して設定
* a.leaflet-popup-close-button はデフォルトでは灰色が指定されているので、**!important** をつけて上書き




# 4. メモ

Leaflet 0.7 系でも 1.0 系でもここの DOM 構造は共通しているので、問題なく動くはず。
rails auto_increment column

```rb
class ActiveRecord::ConnectionAdapters::SQLiteAdapter
	def set_auto_increment( table_name, value )
		execute( "update sqlite_sequence set seq=#{value} where name=#{table_name};" )
	end
end

class ActiveRecord::ConnectionAdapters::MysqlAdapter
	def set_auto_increment( table_name, value )
		execute( "alter table #{table_name} auto_increment=#{value};" )
	end
end

class ActiveRecord::Base
	def self.auto_increment=(value)
		value = value.to_i
		return if value <= 0
		connection.set_auto_increment( quoted_table_name, value )
	end
end
```

https://github.com/beyond/auto_increment/blob/master/init.rb
[awk] 自作関数の定義と利用

# 自作関数の定義
awkでユーザー定義関数である自作関数を導入するには次のように書きます。

```awk
awk 'function function_name(x, y, z, ...) {
    関数の中身
}'
```

これは、引数x, y, z, ...をとり、関数名はfunction_nameということを意味しています。

# 例

底が10のlog10()関数を定義してみます。（awkにはデフォルトで自然対数のlog()関数しか用意されていません。）

```awk
awk 'function log10(x) {
    return log(x)/log(10);
}
{
    print log10($1);
}' test.txt
```

入力されたtest.txtの１列目のデータに対して常用対数値を計算し出力します。

# 入力データ例

```
1
10
100
1000
10000
100000
```

# 出力結果

```
0
1
2
3
4
5
```
[Unity]DoTweenのEaseいろいろあってよくわかんない…な人へ[DoTween]

# はじめに

前の記事（[テキストアニメーションしてみた！](http://qiita.com/ryosebach/items/02ad21523c6c1346bd9f)）の最後にも触れてみたのですが、Easeingっていろいろあってよくわからなくなりがちなので、まとめて自分の備忘録としても使おうかなと。


# Easeingとは？

アニメーションを「__自然に見せるため__」に使われるものです。
例えば、何かものが倒れる時は、徐々に加速して倒れていきますよね？

CSSなど、アニメーションを取り入れる時にはいろいろなところで使われているものです。


# 一般的なEaseの種類。

とてもわかりやすいサイトがありました

[Easing function](http://easings.net/ja#)

# DoTweenでのEasing

中身を見てみると。

```
public enum Ease
{
	Unset,
	Linear,
	InSine,
	OutSine,
	InOutSine,
	InQuad,
	OutQuad,
	InOutQuad,
	InCubic,
	OutCubic,
	InOutCubic,
	InQuart,
	OutQuart,
	InOutQuart,
	InQuint,
	OutQuint,
	InOutQuint,
	InExpo,
	OutExpo,
	InOutExpo,
	InCirc,
	OutCirc,
	InOutCirc,
	InElastic,
	OutElastic,
	InOutElastic,
	InBack,
	OutBack,
	InOutBack,
	InBounce,
	OutBounce,
	InOutBounce,
	Flash,
	InFlash,
	OutFlash,
	InOutFlash,
	INTERNAL_Zero,
	INTERNAL_Custom
}
```

さすが、全部揃えてありますね！

## 数が多すぎる…？

まずは、InとOut。これはIn(始点側)、Out(終点側)のどちら側で、指定のEasingをするかというものなので、
わかっていなければいけないのは、そのEasingの種類だけです！

```
Unset,
Linear,
InSine,
InQuad,
InCubic,
InQuart,
InQuint,
InExpo,
InCirc,
InElastic,
InBack,
InBounce,
Flash,
INTERNAL_Zero,
```
この１４個であり、UnsetはEasingを指定しない、INTERNAL_Zeroは一瞬で移動(アニメーションしてない)ということを考えると、12個について理解すれば良いわけです！


# 実際に動いている様子。


- `Linear`,`InSine`,`InQuad`

![ani1.gif](https://qiita-image-store.s3.amazonaws.com/0/114344/7d4009dc-f2f6-2a71-ea8d-562d3ff1475e.gif)



- `InCubic`,`InQuart`,`InExpo`

![ani2.gif](https://qiita-image-store.s3.amazonaws.com/0/114344/ba303ade-6c19-eed9-20f6-ca1e9296d8c2.gif)

- `InQuint`,`InCirc`,`InElastic`

![ani3.gif](https://qiita-image-store.s3.amazonaws.com/0/114344/130fc32e-a5d0-2fb7-0d6b-69a88d7a8465.gif)

- `InBack`,`InBounce`,`Flash`

![ani4.gif](https://qiita-image-store.s3.amazonaws.com/0/114344/c3bf8b50-1dba-eeb1-c0b2-74d083cc1f1b.gif)


# おわりに

まとめてみることで、それぞれのEasingの種類、頭に残りますね！

忘れた時に備えて、備忘録とするということで、おわりにしようかなと。

ではではー


# 追記

記事にしてみると、gifが連続して貼られてると見にくいかもですね…こうすると見やすくなるかもという意見あったらぜひコメントお願いします！
ExUnitで特定のテストだけ実行・スキップする方法

[ブログ](http://joe-noh.hatenablog.com/entry/2016/06/15/172142)から転載。

---

## 特定のテストだけ実行する

### ファイル単位で指定して実行する

`mix test`に引数を渡すことで、そのファイルだけテストを実行できます。

```console
$ mix test ./test/my_test.exs
```

### 行番号を指定して実行する

ファイル単位の指定に加えて、`:5`のように行番号を指定できます。

```console
$ mix test ./test/my_test.exs:5
```

### タグ単位で指定して実行する

モジュール属性として`@tag :hoge`、または`@tag hoge: true`をつけ、`mix test`に`--only`オプションを渡すと、そのタグが付与されたテストだけを実行できます。`@moduletag`でも同様のことが可能です。

```elixir
defmodule FirstTest do
  use ExUnit.Case, async: true

  test "..." do
    ...
  end

  @tag :need_database
  test "..." do
    ...
  end
end
```

```elixir
defmodule SecondTest do
  use ExUnit.Case, async: true

  @moduletag :need_database

  ...
end
```

```console
$ mix test --only need_database
```

### 前回failしたテストだけ実行する

v1.3から入る機能ですが、`--stale`オプションをつけることで前回落ちたテストだけを再度実行することができます。

```console
$ mix test --stale
```

## 特定のテストだけスキップする

### モジュール単位でスキップする

`@moduletag :skip`、または`@moduletag skip: true`を書くと、それ以降の`test`が全てスキップされます。

```elixir
defmodule MyTest do
  use ExUnit.Case, async: true

  @moduletag :skip

  ...
end
```

### 個別にスキップする

`@tag :skip`、または`@tag skip: true`を書くと、その直後の`test`がスキップされます。

```elixir
defmodule MyTest do
  use ExUnit.Case, async: true

  @tag :skip
  test "hoge" do
    ...
  end

  test "fuga" do
    ...
  end
end
```

### タグ単位で指定してスキップする

`--exclude`オプションを付与することで、特定のタグが付いたテストをスキップすることができます。

```console
$ mix test --exclude need_database
```

## 自動で付与されるタグ

ExUnitによって付与されるタグがいくつか存在します。

  - `:case`
  - `:file`
  - `:line`
  - `:test`
  - `:async`
  - `:type`
  - `:registered`
  - `:describe `

以上のタグは、基本的に上書きしないほうがよい（上書きするメリットが思いつかない）ものです。逆に利用することで、便利な恩恵を受けられるタグも存在します。個別の詳細についてはまた別の機会に。

  - `:capture_log`
  - `:skip`
  - `:timeout`
  - `:report`

これらのタグも`--only`などで利用できます。

```console
$ mix test --only case:MyAppTest
```

余談ですが、実際には`--only`は`--include`と`--exclude`の合わせ技のためのショートカットのようなもので、以下の2つは等価です。`test`タグは全てのテストに付与されるので、それを除外した上で、`need_database`タグが付いたものをテストする、という意味です。

```console
$ mix test --only need_database
```

```console
$ mix test --include need_database --exclude test
```
bashでGoogleマップのURLから緯度と経度を正規表現で得る

Googleマップで検索した場所のURLからbashで緯度と経度を抽出したのでメモっときます。

## ブラウザに表示されているURL

https://www.google.co.jp/maps/place/%E3%82%AC%E3%83%B3%E3%83%80%E3%83%A0%E3%82%AB%E3%83%95%E3%82%A7/@35.6991395,139.7707838,17z/data=!3m1!4b1!4m5!3m4!1s0x60188ea7d9f2538f:0x11e8e2fa1205f80b!8m2!3d35.6991395!4d139.7729725

一番後ろの方のdata=以降の部分にいろいろな情報が入ってるみたいですがピンの立っているところの正確な緯度経度もここにあります

ちなみに`@35.6991395,139.7707838,17z`の部分は画面の中心とズームかな。ピンの場所ではない模様。

## コード

```sh
#!/bin/bash

GUNDAM_CAFE="https://www.google.co.jp/maps/place/%E3%82%AC%E3%83%B3%E3%83%80%E3%83%A0%E3%82%AB%E3%83%95%E3%82%A7/@35.6991395,139.7707838,17z/data=!3m1!4b1!4m5!3m4!1s0x60188ea7d9f2538f:0x11e8e2fa1205f80b!8m2!3d35.6991395!4d139.7729725"
[[ "$GUNDAM_CAFE" =~ !4d([0-9.]+)$ ]]
LONGITUDE=${BASH_REMATCH[1]}
[[ "$GUNDAM_CAFE" =~ !3d([0-9.]+)! ]]
LATITUDE=${BASH_REMATCH[1]}
echo $LONGITUDE
echo $LATITUDE
```

## 結果

```sh
$ sh ./googlemapexp.sh
139.7729725
35.6991395
```

## @35.6991395,139.7707838,17zの部分をマッチさせたいなら

```sh
[[ "$GUNDAM_CAFE" =~ \/@([0-9.]+),([0-9.]+),([0-9.]+z)\/ ]]
LONGITUDE=${BASH_REMATCH[2]}
LATITUDE=${BASH_REMATCH[1]}
echo $LONGITUDE
echo $LATITUDE
```
こんな感じか

```sh
$ sh ./googlemapexp.sh
139.7707838
35.6991395
```

### この記事は自分のBlogの転記です
[bashでGoogleマップのURLから緯度と経度を正規表現で得る](http://okisanjp.hatenablog.jp/entry/2016/06/15/190254 "bashでGoogleマップのURLから緯度と経度を正規表現で得る")
おそらくハマって困ってしまうであろうresqueの罠

[resque/resque: Resque is a Redis-backed Ruby library for creating background jobs, placing them on multiple queues, and processing them later.](https://github.com/resque/resque)

を使用している。ハマりまくっているので、メモである。


## ワーカーのエラー内容がわからない！！
`VVERBOSE=1 bundle exec rake environment resque:work`
のように`VVERBOSE`を指定するとエラーが表示される。


## オブジェクトの様子とか見たい！！
RubyMineのブレイクポイントが効かないので、オブジェクトの様子が見れない！！　こまった。　`pメソッド`ではコンソールに表示してくれない！！！

```rb
# config/initializers/resque.rb
Resque.logger = Logger.new(Rails.root.join('log', "#{Rails.env}_resque.log"))
```
を設定して、


```rb
Resque.logger.info('hoge')
```

のようにロガーでファイルに出すしかない。

## ワーカークラスへの変更が適応されてない！！！
クラスを書き換えたら都度、`Ctr + C`で一回止めて、
`VVERBOSE=1 bundle exec rake environment resque:work`
を入力！！　してもっかい起動(´・ω・`)

効率的な方法が知りたい

## 引数にHashを渡すとキーが`Symbol`ではなくて`String`になっている

### 通常のRubyの例

```rb
def bar(param_hash)
  puts param_hash.keys.first.class #=> Symbol
  puts param_hash[:hoge]           #=> 1
  puts param_hash['hoge']          #=> なにも表示されない
end

bar(hoge: 1)
```

### resqueの場合
```rb
class BarWorker
  @queue = :bar

  def self.perform(param_hash)
    Resque.logger.info('start')
    Resque.logger.info(param_hash.keys.first.class) #=> String
    Resque.logger.info(param_hash[:hoge])           #=> なにも表示されない
    Resque.logger.info(param_hash['hoge'])          #=> 1
    Resque.logger.info('end')
 end
end

Resque.enqueue(BarWorker, hoge: 1)
```
ワイ、Brackets 1.7にアップデートしたら起動後フリーズを再現して無事死亡（解決策あるかも）

取り急ぎだったので報告。

# 何が起こった

Windows版 Brackets 1.7 きとる！
↓
上書きインストール！
↓
Vやねん！Brackets
↓
【悲報】Brackets起動時にエディタ立ち上がらないままフリーズ、メニューも開けるけど押せず

## 調査

まあ、多分プラグインが足を引っ張ってるのかなと思いつつ、プラグインフォルダを開き、アレそうなプラグインを他のフォルダに移動。パスについては下記の中ほど参照。
https://codezine.jp/article/detail/6950

## 結果

当方の環境では、console plusが足を引っ張っていたことが判明。
https://github.com/sixertoy/brackets-console-plus

プラグインフォルダより、「malas34.brackets-console-plus」を外して起動確認。

# 2016-09-14 追記

最新版はクラッシュしなくなりました。やったね。