OmniAICreator/Qiita-1.07M huggingface dataset:
「オフラインリアルタイムどう書く第11回(ビットあみだくじ)」の問題を解いてみた


[横浜へなちょこプログラミング勉強会](https://yhpg.doorkeeper.jp/)にて過去に出題された[ビットあみだくじ](http://nabetani.sakura.ne.jp/hena/ord11bitamida/)を解いてみた。
回答にかかった時間は30分。

```ruby
class BitAmida
  def initialize input
    @routes = input.split("-").map{|hex|
      lines = []
      ("%08b" % hex.hex).scan(/(1+)/){
        lines << [$~.begin(0), $~.begin(0) + $~[1].size]
      }
      lines
    }
  end

  def start
    9.times.each_with_object(Array.new(9)){|n, r|
      r[
        @routes.each_with_object([n]){|lines, route|
          if line = lines.find{|(p1, p2)| p1 == route.last or p2 == route.last}
            route << (line[0] == route.last ? line[1] : line[0])
          end
        }.last
      ] = n
    }.join
  end
end

test = <<_TEST
/*0*/ test( "d6-7b-e1-9e", "740631825" );
/*1*/ test( "83-4c-20-10", "123805476" );
/*2*/ test( "fb-f7-7e-df", "274056813" );
/*3*/ test( "55-33-0f-ff", "123456780" );
/*4*/ test( "00-00-00-00", "012345678" );
/*5*/ test( "00-00-00-55", "021436587" );
/*6*/ test( "40-10-04-01", "021436587" );
/*7*/ test( "00-00-aa-00", "103254768" );
/*8*/ test( "80-20-08-02", "103254768" );
/*9*/ test( "ff-7e-3c-18", "876543210" );
/*10*/ test( "aa-55-aa-55", "351708264" );
/*11*/ test( "55-aa-aa-55", "012345678" );
/*12*/ test( "db-24-db-e7", "812543670" );
/*13*/ test( "00-01-00-40", "021345687" );
/*14*/ test( "00-00-80-00", "102345678" );
/*15*/ test( "01-40-00-00", "021345687" );
/*16*/ test( "00-00-00-02", "012345768" );
/*17*/ test( "00-00-02-00", "012345768" );
/*18*/ test( "00-14-00-00", "012436578" );
/*19*/ test( "00-00-01-40", "021345687" );
/*20*/ test( "00-80-01-00", "102345687" );
/*21*/ test( "c8-00-00-81", "120354687" );
/*22*/ test( "05-48-08-14", "021435687" );
/*23*/ test( "24-05-00-f0", "413205687" );
/*24*/ test( "40-08-14-01", "021536487" );
/*25*/ test( "18-c8-80-80", "210534678" );
/*26*/ test( "1c-88-52-00", "120564738" );
/*27*/ test( "ec-dc-67-62", "213468705" );
/*28*/ test( "0a-b6-60-e9", "035162784" );
/*29*/ test( "52-d6-c6-c2", "120345678" );
/*30*/ test( "47-e7-b0-36", "231047658" );
/*31*/ test( "0f-85-91-aa", "108263754" );
/*32*/ test( "76-b6-ed-f3", "601435782" );
/*33*/ test( "f5-5e-f7-3d", "025847163" );
/*34*/ test( "dd-e7-fb-f9", "610247538" );
/*35*/ test( "8f-f4-af-fd", "583246017" );
/*36*/ test( "bf-fb-cb-f7", "105382674" );
/*37*/ test( "e5-fd-ff-ff", "512046378" );
/*38*/ test( "ef-df-ef-fe", "713205648" );
/*39*/ test( "bf-7f-fd-d7", "826437105" );
/*40*/ test( "36-ff-df-de", "814527603" );
/*41*/ test( "6f-dd-ff-ff", "230685147" );
_TEST

require 'minitest/autorun'

describe 'HoneyComb' do
  test.split("\n").each do |line|
    t, n, input, expect = line.match(/^\/\*(\d+)\*\/\s*test\(\s*"([^"]+)",\s*"([^"]+)"\s*\);$/).to_a
    amida = BitAmida.new input
    it input do
      assert_equal expect, amida.start
    end
  end
end
```
端末のキャリアコード(PLMN)を取得する[Android,iOS]


# Android

## Ref

https://developer.android.com/reference/android/telephony/TelephonyManager.html

## How to

TelephonyManagerを使用する

``` Java
TelephonyManager tm = (TelephonyManager)Context.getSystemService(Context.TELEPHONY_SERVICE);
String carrierCode = tm.getSimOperator();
```

# iOS

## Ref

https://developer.apple.com/reference/coretelephony/cttelephonynetworkinfo
https://developer.apple.com/reference/coretelephony/ctcarrier

## How to

``` Objective-C
CTTelephonyNetworkInfo *networkInfo = [[CTTelephonyNetworkInfo alloc] init];
CTCarrier *carrier = [networkInfo subscriberCellularProvider];
NSString *networkCode = [carrier mobileNetworkCode];
NSString *contryCode = [carrier mobileCountryCode];
NSString *carrierCode = [contryCode stringByAppendingString:networkCode];
```

# About PLMN

## Ref

http://www.gadget-and-radio.com/plmn-list/

## List

- 44010(ドコモ)
- 44020(ソフトバンク)
- 44050(au)
プラットフォーム別パフォーマンス可視化

モバイルプラットフォーム最適化に向けたツール、使用方法再確認用記事。
※随時更新


##Tools
iOS：Instruments
Android：VTune, Snapdragon Profiler
Unity Editor：タイムライン
5.3以降：Memory Profiler


##Unity
【Unity】CPUプロファイラでパフォーマンスを改善する 前編
http://tsubakit1.hateblo.jp/entry/2016/05/09/073000

【Unity】CPUプロファイラでパフォーマンスを改善する 後編
http://tsubakit1.hateblo.jp/entry/2016/06/20/222612


CPU 使用率エリア
https://docs.unity3d.com/ja/current/Manual/ProfilerCPU.html


##iOS Instruments

Instrumentsを使ってiOSデバイスのログ（電力消費、GPSのオンオフ、etc...）を確認する
http://qiita.com/nomadmonad/items/423ad5f72a0618d11c14

ゾンビオブジェクトを検出する (Instruments編)Add Star
http://d.hatena.ne.jp/Kazzz/20120110/p1


##Android

Androidアプリのメモリリークを調査する
http://eikatou.net/blog/2012/02/853/

メモリリークを発見！Androidアプリのメモリ解析手法
http://andbrowser.com/development/knowhow/65/eclipse-android-memory-leak-mat/


Android TraceView 基本編
http://www.taosoftware.co.jp/blog/2009/11/android_traceview.html
Gulpコマンド一覧

MacOSのGulpコマンド一覧です。手順ごとに並んでいるので、Gulp以外のコマンドもあります。

#インストール
##Node.jsを公式サイトからインストール
https://nodejs.org/en/

##Node.jsがインストールされているか確認(バージョンの表示)
```
node -v
```

##Gulpをグローバルにインストール(どの場所にいてもgulpコマンドが使えるように)
```
sudo npm install -g gulp-cli
```

##Gulpがインストールされているか確認(バージョンの表示)
```
gulp -v
```

#プロジェクトごとにやること
##プロジェクトのフォルダまで移動
```
cd プロジェクトのフォルダのパス
```

##package.jsonファイルの作成
```
npm init
```

*途中で、プロジェクト名や著作権の設定をどうするかというダイアログが表示されるが、設定が不要ならば全てYes(Enterキー)でよい*

##必要なプラグインのインストール
```
sudo npm install --save-dev (プラグイン名)
```

**––save-devという指定をすることで、インストールしたプラグインのバージョンが、自動的にpackage.jsonファイルに追記される*

##Gulp本体をローカル環境に（プロジェクトフォルダー以下で使えるように）インストール
*ローカル環境にもインストールする必要がある*

```
sudo npm install --save-dev gulp
```
EMRのpysparkでPython３系を使う


# EMRでのpython3系の使い方

EMRでpysparkを使おうとするとデフォルトでは2系が使われてしまいます。3系をどうせなら使いたいので使い方を調べてみました。

現時点で最新のEMRのバージョンは 5.0.0でSparkは2.0.0が入っています。またPythonのバージョンは2.7.10が使われています。

```
$ pyspark
Python 2.7.10 (default, Jul 20 2016, 20:53:27)
[GCC 4.8.3 20140911 (Red Hat 4.8.3-9)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel).
16/09/15 02:15:05 WARN Client: Neither spark.yarn.jars nor spark.yarn.archive is set, falling back to uploading libraries under SPARK_HOME.
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /__ / .__/\_,_/_/ /_/\_\   version 2.0.0
      /_/

Using Python version 2.7.10 (default, Jul 20 2016 20:53:27)
SparkSession available as 'spark'.
```

Python3系を使うには以下のようなパラメータをわたしてEMRを起動する必要があります。

![スクリーンショット 2016-09-15 11.14.26.png](https://qiita-image-store.s3.amazonaws.com/0/10236/d3e03a77-0e33-02f9-443c-a681955586cf.png)



```
[
    {
        "Classification": "spark-env",
        "Properties": {},
        "Configurations": [
            {
                "Classification": "export",
                "Properties": {
                    "PYSPARK_PYTHON": "python34"
                },
                "Configurations": []
            }
        ]
    }
]
```

```
$ pyspark
Python 3.4.3 (default, Jul 20 2016, 21:31:36)
[GCC 4.8.3 20140911 (Red Hat 4.8.3-9)] on linux
Type "help", "copyright", "credits" or "license" for more information.
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel).
16/09/15 02:19:11 WARN Client: Neither spark.yarn.jars nor spark.yarn.archive is set, falling back to uploading libraries under SPARK_HOME.
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /__ / .__/\_,_/_/ /_/\_\   version 2.0.0
      /_/

Using Python version 3.4.3 (default, Jul 20 2016 21:31:36)
SparkSession available as 'spark'.
```

これでPython3.4を使うことができるようになりました。

## PYTHONHASHESEEDの設定

Python2系を使っている時には問題ないのですが3系でgroupbyを行おうとしたところ以下のエラーが発生しました。
http://stackoverflow.com/questions/36798833/what-does-exception-randomness-of-hash-of-string-should-be-disabled-via-pythonh

これを回避するにはPYTHONHASHSEEDの環境変数をセットしてあげれば良いのですが、EMRの場合は`/usr/lib/spark/conf/spark-defaults.conf`に以下のように追記することでセットできます。

```
spark.executorEnv.PYTHONHASHSEED  0
```

# 参考

https://blogs.aws.amazon.com/bigdata/post/Tx2SEE3WKIQ8GNX/Using-Python-3-4-on-EMR-Spark-Applications
リモートリポジトリ名が変わったら新しいURLを設定しよう

## はじめに

GitHubのリポジトリ名を変えた場合、`git push origin branch1`などのコマンドを実行したときに次のようなメッセージが表示されます。

```
remote: This repository moved. Please use the new location:
```

このメッセージに従い、`origin`に新しいURLを設定すればメッセージが表示されなくなります。

`origin`に新しいURLを設定する方法を紹介します。

## やること

まず、現在の`origin`に何が設定されているか確認します。

```
git remote -v
```

次に、`origin`に新しいURL(`git@github.com:t-mochizuki/abc.git`)を設定します。
(新しいURLのところは適宜読み替えていただければ幸いです)

```
git remote set-url origin git@github.com:t-mochizuki/abc.git
```

そして、新しいURL(`git@github.com:t-mochizuki/abc.git`)が設定されていることを確認します。

```
git remote -v
```

## まとめ

`origin`に新しいURLを設定する方法を紹介しました。

ローカルリポジトリを新規に作成して、`set-url`ができるかどうかを確認したところできませんでした。

そういう場合は、次のようなコマンドでリモートリポジトリを追加することができます。

```
git remote add -f origin git@github.com:t-mochizuki/abc.git
```

しかし、これは`git clone`と同じ結果になりますので、必要になることは少ないと思います。

## 参照URL

- [git - Error with renamed repo in github, "remote: This repository moved. Please use the new location" - Stack Overflow](http://stackoverflow.com/questions/30443333/error-with-renamed-repo-in-github-remote-this-repository-moved-please-use-th)
GitHubでタスク管理ができる新機能「Project」超入門

本日（2016/09/15）発表されたGitHubの新機能の中で、目玉となるのが「Project」機能です。Projectでは、**GitHubのリポジトリ上でさまざまな作業を管理できます**。


<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">本日発表されたGitHubの新機能「Project」にて、タスクリストを作成してみました。楽しい。<a href="https://twitter.com/hashtag/GitHub?src=hash">#GitHub</a> <a href="https://twitter.com/hashtag/Project?src=hash">#Project</a> <a href="https://t.co/3IO0d8c3Dl">pic.twitter.com/3IO0d8c3Dl</a></p>&mdash; 鹿野壮@Lynda.com授業公開 (@tonkotsuboy_com) <a href="https://twitter.com/tonkotsuboy_com/status/776232542424870912">2016年9月15日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

本エントリでは、タスクリストの作成例を通して、Projectの具体的な設定方法について紹介します。完成版のタスクリストは下記URLで確認できます。

- [完成したタスクリスト](https://github.com/ics-kano/160915_project/projects/3)

# Step1. プロジェクトの作成
GitHub上にて、[Project]→[Create a project]をクリックします。

![](https://qiita-image-store.s3.amazonaws.com/0/67884/d860148e-e6d2-3eb7-53b1-968cfebb9ae8.png)

プロジェクト設定画面が開かれるので、プロジェクト名と説明文を入力します。

![](https://qiita-image-store.s3.amazonaws.com/0/67884/efa8366c-1ee3-9057-a535-c50f002edcf1.png)

新規プロジェクトが作成されました。

![](https://qiita-image-store.s3.amazonaws.com/0/67884/adae5021-06c5-4839-fec7-c780474289ee.png)

# Step2. カラムの作成

タスクリストを作る場合、各タスクは「残タスク」「作業中」「確認待ち」「作業完了」といった、カテゴリーに分けられます。このカテゴリーに当たるのは「カラム(column)」です。[Add column]をクリックし、カラム名を入力します。

![](https://qiita-image-store.s3.amazonaws.com/0/67884/456c2806-3dfd-8e38-d0d8-ffef3cdfc390.png)

同様にして、任意の数だけカラムを追加できます。

![](https://qiita-image-store.s3.amazonaws.com/0/67884/0fcbf482-afe3-9530-71e5-7479cc230d48.png)

# Step3. ノートの作成

具体的なタスクは「ノート(note)」にて管理します。ノートを追加したいカラムにて、[＋]をクリックし、ノートの内容を追加します。

![](https://qiita-image-store.s3.amazonaws.com/0/67884/bd671b7d-5f43-81c0-e3cd-6dc60e79a655.png)

ノートが作成されました。

![](https://qiita-image-store.s3.amazonaws.com/0/67884/5daeccef-3236-140d-c7b5-138a15463294.png)

# Step4. ノートの管理
タスクリストでは、残タスク状態から作業中状態へ、作業中状態から確認待ち状態へと、タスクのステータスがアップデートされます。GitHubのプロジェクトでは、ドラッグアンドドロップでカラム間のノート移動ができます。

![](https://qiita-image-store.s3.amazonaws.com/0/67884/e4a20a59-bb08-8b23-387b-cace6d49eb76.png)

このタスクリストを運用している様子が下記です。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">本日発表されたGitHubの新機能「Project」にて、タスクリストを作成してみました。楽しい。<a href="https://twitter.com/hashtag/GitHub?src=hash">#GitHub</a> <a href="https://twitter.com/hashtag/Project?src=hash">#Project</a> <a href="https://t.co/3IO0d8c3Dl">pic.twitter.com/3IO0d8c3Dl</a></p>&mdash; 鹿野壮@Lynda.com授業公開 (@tonkotsuboy_com) <a href="https://twitter.com/tonkotsuboy_com/status/776232542424870912">2016年9月15日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>


# GitHub上での作業管理は嬉しい
筆者は作業管理としてBacklog等を使ってきましたが、GitHub上で直接作業管理ができるのはありがたいです。 Projectは本日から使えるので是非試してみてください。
Install influxdb(v1.0) on Aws Linux

influxdbのv1.0が出たので、さっそくインストール

## setting 
```
cat <<EOF | sudo tee /etc/yum.repos.d/influxdb.repo
[influxdb]
name = InfluxDB Repository - RHEL \$releasever
baseurl = https://repos.influxdata.com/rhel/7/\$basearch/stable
enabled = 1
gpgcheck = 1
gpgkey = https://repos.influxdata.com/influxdb.key
EOF
```

influxdbに掲載されている設定(9/15)で行うと
https://repos.influxdata.com/rhel/latest/x86_64/stable/repodata/repomd.xml
がない(404)と言われてしまう

## install
`sudo yum install influxdb`

でだめだった、
rpmを直接ダウンロードして、
https://repos.influxdata.com/rhel/7/x86_64/stable/influxdb-1.0.0.x86_64.rpm

`sudo yum install influxdb-1.0.0.x86_64.rpm`

## service start
`sudo service influxdb start`
GitHub 新機能の雑まとめ

GitHub にいろいろ機能が追加されたみたいなので、雑に書いてみる。

[A whole new Universe](https://github.com/universe-2016)
[A whole new GitHub Universe: announcing new tools, forums, and features](https://github.com/blog/2256-a-whole-new-github-universe-announcing-new-tools-forums-and-features)

## Review

- コメントにレビューという概念が現れた
- レビューをまとめて submit できるようなった
  - レビューのサマリが書ける
  - 一つ一つのレビューは書いても pending されて submit するときに公開される
- replay 機能がついてコメントがスレッド化できるようになった
- ただのコメントなのか、同意の意味(LGTM的な)なのか、変更の要求なのかを選べるようになった
  - それらを自然言語だけでなくて、機能として表現できる。
- レビューが完了しないとマージできない設定ができるようになった

##　Projects

- カンバン機能が追加された 
- 一つのリポジトリに複数の Project が作成可能
- カラムは自由にカスタマイズ可能
- Card と呼ばれる単位で扱う
- Card は　Note, Issue, Pull Request の三種類扱える
- Note というラフな情報を扱うもの機能が増えた
- Note は Issue に変換できる
githubのmarkdownをプレビューする一つの方法

適当なリポジトリ（なんでもいい）で「Create new file」をクリック。

![スクリーンショット 2016-09-15 10.49.50.png](https://qiita-image-store.s3.amazonaws.com/0/79394/ebb87d63-505a-542e-24f6-709077ecee0a.png)

拡張子`.md`でファイル名を入れて、markdownを入力して「Preview」タブをクリック。

![スクリーンショット 2016-09-15 10.51.22.png](https://qiita-image-store.s3.amazonaws.com/0/79394/9cdb4a27-21df-1be4-ca18-740bccda003f.png)

プレビューできた。

![スクリーンショット 2016-09-15 10.52.14.png](https://qiita-image-store.s3.amazonaws.com/0/79394/170ca339-dd69-c865-99a9-a8ad2334a8ec.png)


# もう一つの方法 - grip

Gripというツールを使う方法がある。
`grip`コマンドでローカルにWebサーバを立ち上げ、ブラウザでプレビューするというもの。もちろんcssなどの見た目もgithubそっくりにしてくれる。


[Grip - コミットする前にMarkdownの表示をチェック MOONGIFT](http://www.moongift.jp/2016/09/grip-%e3%82%b3%e3%83%9f%e3%83%83%e3%83%88%e3%81%99%e3%82%8b%e5%89%8d%e3%81%abmarkdown%e3%81%ae%e8%a1%a8%e7%a4%ba%e3%82%92%e3%83%81%e3%82%a7%e3%83%83%e3%82%af/)
SublimeLinter が機能したりしなかったりするバグの修正方法

```command:alert
SublimeLinter could not determine your shell PATH.
It is unlikely that any linters will work.
Please see the troubleshooting guide for info on how to debug PATH problems.
```

☝️のアラート出る場合は__shell_timeout__値を増やす方法を試してみましょう。
https://github.com/SublimeLinter/SublimeLinter3/issues/253

デフォルトでは__10（秒）__となっているが、
イシュー・スレッドで、__「それだと短かすぎる」____「100にしている」__などのコメントがあったので
とりあえず__60__と設定したら治りました。


> SublimeLinter.sublime-settings
> （メニュー・バー / Sublime Text / Preferences / Package Settings / SublimeLinter / Settings - User）



```javascript:SublimeLinter.sublime-settings
{
    "user": {
        ...
        "linters": {
            ...
            }
        },
        ...
        "shell_timeout": 60,
        ...
    }
}
```
AWSに手軽に複数アカウントログイン

#AWSに手軽に複数アカウントログイン

AWSで複数アカウント使ってると切り替えが面倒です。
Chromeだとシークレットモードにしたり、Chromeのアカウント自体を切り替えたりって方法で対処してるようですが、それもやっぱり面倒です。

というわけでSeleniumとwebdriverを使ってブラウザ立ち上げてもらって、ついでにログイン操作をしてもらうことにしました。
* seleniumやwebdriverの準備は別の記事を参考にしてください。
* 人によってログインの仕方違うかもしれないのですが、その場合は自分のやり方に合わせてソース変えてください。

まず以下のソースを login.py とかで保存してください。
EmailやPasswordは自分のに書き換えてください。

```py
#! /usr/bin/env python
#-*- coding: utf-8 -*-

from selenium import webdriver

email = 'EMAIL'
password = 'PASSWORD'

d = webdriver.Chrome("./chromedriver")
d.get('https://www.amazon.com/ap/signin?openid.assoc_handle=aws&openid.return_to=https%3A%2F%2Fsignin.aws.amazon.com%2Foauth%3Fresponse_type%3Dcode%26client_id%3Darn%253Aaws%253Aiam%253A%253A015428540659%253Auser%252Fhomepage%26redirect_uri%3Dhttps%253A%252F%252Fconsole.aws.amazon.com%252Fconsole%252Fhome%253Fstate%253DhashArgs%252523%2526isauthcode%253Dtrue%26noAuthCookie%3Dtrue&openid.mode=checkid_setup&openid.ns=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0&openid.identity=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0%2Fidentifier_select&openid.claimed_id=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0%2Fidentifier_select&action=&disableCorpSignUp=&clientContext=&marketPlaceId=&poolName=&authCookies=&pageId=aws.ssop&siteState=pre-register%2Cja&accountStatusPolicy=P1&sso=&openid.pape.preferred_auth_policies=MultifactorPhysical&openid.pape.max_auth_age=120&openid.ns.pape=http%3A%2F%2Fspecs.openid.net%2Fextensions%2Fpape%2F1.0&server=%2Fap%2Fsignin%3Fie%3DUTF8&accountPoolAlias=&forceMobileApp=0&language=ja&forceMobileLayout=0')

inputEmail = d.find_element_by_id('ap_email')
inputEmail.send_keys(email)
inputPassword = d.find_element_by_id('ap_password')
inputPassword.send_keys(password)
signInBtn = d.find_element_by_id('signInSubmit-input')
signInBtn.click()

d.maximize_window()
```

で、macだったら同じ階層にlogin.commandみたいな感じでバッチを作成。

```text
cd `dirname $0`
./login.py
exit
```

あとは ⌘+Spaceでspotlightを呼び出して、login.command呼び出せばブラウザ開いてログインしてくれます。
アカウント毎に上記のファイルを用意すればいい感じです。

だいぶ雑ですが、他にいい方法あれば教えてください。
ZenHubからGitHub Projectsに移行することを検討してみる

社内での議論内容を一部公開します。

## 経緯
https://github.com/universe-2016

## 移行における懸念点
ZenHub並みに高機能ではない。

### リポジトリをまたげない問題
ZenHubのときは、1つのBoardさえ見てれば良かったが、GitHub Projectだと複数見にいかないといけない。
![repository_merge.png](https://qiita-image-store.s3.amazonaws.com/0/42729/ae3aac2f-9cb4-ef61-ae41-953aa68fd761.png)



#### 対策
今のところなし。

### Add cardsが面倒問題
PRにしろ、issueにしろ、いちいちProjectの画面にいってAdd cardsするのが面倒。
ZenHubのときは、Boardの画面からissue作れたし、issue書きながらPipelineに追加できた。


![Add_cards_mendoi.png](https://qiita-image-store.s3.amazonaws.com/0/42729/d9c9015d-f453-b7a7-0735-e569954e27bd.png)



うちは、ZenHubでの運用において「issueは最初に必ず作成する」というルールを設けているのだが、その運用を移行後も踏襲した場合、Add cardsにするときに `is:issue is:open` みたいに絞りこまないといけないから大変だ。

![Add_cards_mendoi2.png](https://qiita-image-store.s3.amazonaws.com/0/42729/82f27eb2-cb2a-0d8c-b07c-dc652a35e4b3.png)

「issueは必ず作成する」というルールを設けたのは、たしか「issueをつくるとZenHubが検知して自動で『New Issues』エリアに追加してくれる」からだった気がする。
GitHub Projectにそういう機能はない。自分で毎回Add cardsしないといけない。

#### 対策
>ZenHubのときは、Boardの画面からissue作れたし、issue書きながらPipelineに追加できた。

これについては特に対策は無く、機能がリッチになるのを待つしか無い。

>うちは、ZenHubでの運用において「issueは最初に必ず作成する」というルールを設けているのだが、その運用を移行後も踏襲した場合、Add cardsにするときに `is:issue is:open` みたいに絞りこまないといけないから大変だ。

これについては、GitHub Projectを使いたい場合は、「最初にissueを作る」ルールを強制せず、「issueでもPRでも、とにかく作ったらBoardにAdd cardsする」ルールにする運用でよさそう。同じタイトルのissueとPRがあるの、結構冗長だったし個人的には「issueでもPRでも、とにかく作ったらBoardにAdd cardsする」ルールのほうが好きかも。

### Estimateが無い問題
ZenHubではポイントを付けてタスクを見積もってたので、これが無いと大変かもしれない。
![estimate_nai.png](https://qiita-image-store.s3.amazonaws.com/0/42729/fbef51e1-9270-4cf4-7f53-b4f3e13394c8.png)


#### 対策
今のところなし。
ちなみに数字書いたラベルは付けたくない。

### Epicが無い問題
ZenHubでちょっとだけ使ってる。

#### 対策
そんなに活用できてないので別に問題ではないかもしれない。

### 通知が無い問題
こういうのが無い。

![notification_nai.png](https://qiita-image-store.s3.amazonaws.com/0/42729/d357712e-ee3b-5397-f1d4-905f61ee2c61.png)



#### 対策
私はあまり見れてないので、無くなっても問題ないのかもしれない。

## 所感
見た目的に、完全にZenHubを意識して作られてるのでそのうち機能追加で改善されそうな気がする。
別件だがZenHub側もIntegrateできる拡張を作っているようだ。

* [Dispatches from GitHub Universe: Integrating with Projects](https://www.zenhub.com/blog/dispatches-from-github-universe/)

~~純正厨ではないけど、まあ移行してみてもいいのでは。~~

>純正厨ではないけど、まあ移行してみてもいいのでは。

[追記] こんなこと言ったけど、やっぱり使ってみたらAdd Cardsが面倒で嫌になってきた...

## 結論
チームメンバーとの相談の結果、純正がもう少しリッチになってから移行しようという結論になりました。
Python＋pexpectでssh-copy-idを連続実行する


pexpectはいつも使い方を忘れてしまうので、メモすることにした。

以下は、対象のホストに対して、連続でsshkeyをコピーするサンプルです。

主な動作は、
- `password:`が表示されたら、事前に入力したパスワードをspawnする
- `Are you sure you want to continue connecting (yes/no)?` が表示されたら、自動的に`yes`をspawnする
の二つ。

コード全体

```py:copy-id.py

import pexpect
import sys
import getpass

ssh_newkey = "Are you sure you want to continue connecting"

def login(child, passwd):

    while True:

        ret = child.expect( [ssh_newkey, "password:", pexpect.EOF, pexpect.TIMEOUT] )

        if ret == 0:
            child.sendline("yes")
            child.readline(),

        if ret == 1:
            child.sendline(passwd)
            child.readline(),
            break

        if ret == 2:
            print "**** fail"
            print child.before
            break

        if ret == 3:
            print "**** Timeout"
            print "**** ret code: %s" % ret
            break

def start(host, passwd):

    cmd = pexpect.spawn("ssh-copy-id %s" % host, timeout=3)
    login(cmd, passwd)


if __name__ == "__main__":

    for host in sys.argv[1:]:
        print host

    passwd = getpass.getpass()

    for host in sys.argv[1:]:
        print "--- START : %s ---" % host
        start(host, passwd)
        print "--- END ---"
        print
    pass
```
Webフレームワーク品評会イベントの提案

Webフレームワーク品評会というイベントを開きたい。（提案）

## 告知（2017/04/23 追記) 
少し想定よりも遅くなりましたが、2017年の5月か6月あたりにイベントを開くことにしました。現在登壇者募集中です。よろしくお願い致します。

- [Webフレームワーク品評会を開きます。登壇者募集中。 - Qiita](http://qiita.com/kobake@github/items/9394b66430de1951fbcc)

## イベント概要
Rails, CakePHP, Laravel, Django, Express, Play, ASP.NET MVC 等等、世の中にはいろんな Web フレームワークがあるが、皆さんどれだけの種類を触ったことがあり、どれだけのメリットデメリットを（相対的に他フレームワークと比べて）理解した上で享受しているのだろうか。

各フレームワークを横断的に比較する機会を提供したい。
誰かが開催してくれるのが好ましいが、なんとなく自分が開催することになると思う。

## 品評会イベントの形式
- あらかじめ決められた（場合によってはその場で生じた）各種テーマに沿って話を進める（テーマは後記）
- 各フレームワークをある程度分かってる数人が、パネルセッション的な感じに各テーマに沿った話をしていく。

## 話の進め方
統計情報や現状の語りについてはプレゼン的な形になるのはしかたない。が、しばしば小奇麗なプレゼンは恣意的な印象を植え付ける一因になりかねない。
技術的な面については時間はかかるが主にライブコーディング（実演）に重点を置きたい。リアルを共有できるのが好ましい。

## 各テーマ
- 導入
  - 現在利用中フレームワークに至った経緯（プレゼン。宗教戦争に繋がらない程度に）
  - 導入のしやすさ（実演またはプレゼン）
  - 習得の難易度（実演またはプレゼン）
- 広がり
  - 利用実績、およびオープンソースプロダクトの紹介（プレゼン）
  - 情報入手のしやすさ、コミュニティの有無・成熟度（プレゼン）
  - 拡張（プラグイン）の量・質（プレゼン）

(休憩）

- 実演
  - 作業環境紹介（実演）
  - プロジェクト作成（実演）
  - データベース作成（実演）
  - 実行（実演）
  - デバッグ手法（実演）
  - ハマりどころ（プレゼン）

（休憩）

- 実演２
  - ルーティング設定（実演）
  - モデル実装（実演）
  - コントローラ実装（実演）
  - ビュー実装（実演）
  - ヘルパ実装（実演）

（休憩）

- 保守
  - 自動テスト、CI（できれば実演）
- 運用
  - デプロイ、マイグレーション（実演）
　- 監視ツール（実演）
- コスト
  - 開発コスト、運用コスト（プレゼン）
  - ソフトウェア・ハードウェアのコスト、およびライセンス（プレゼン）
  - 人材採用コスト、教育コスト（プレゼン）
- 可能性
  - 例えばプログラム未経験の学生に何を触らせるべきか（プレゼン）
  - この先生きのこるためには（プレゼン）

## 時期・時間
やるとしたら12月頃。
休日に1日がかりでやりたい。

## 個人的な目的
LL 系の方々と Microsoft 技術系の方々との間には、いまだに壁を感じる。そもそも LL 界隈は割と横の繋がりがうまくできている気がするが、Microsoft 技術系だとあまりそういう傾向にない。Java 系はまた LL のそれとは異なる異世界的な横の繋がりを感じなくもない。

LL 系の方々は割と職を転々としやすい（良い意味で）イメージがあるが、Microsoft, Java 技術系だとあんまりそういうイメージがない。そういう現状想定が事実だとすると、ベンチャー界隈に Microsoft, Java 技術が入るこむ機会が相当少ないことになり、（僕の個人的な感情として）それはとても悲しい。なんとかしたい。

## ご賛同・ご意見いただける方はコメントください
Qiitaコメントでもブコメでも。
需要があるのであればちゃんと真面目に練りこんでいきたい。
GitHubリポジトリで毎回UsernameとPasswordを求められる時の対処法

# 原因
.git/configのリポジトリURLがhttps経由になっているのが原因です。

# 対処法
```
[remote "origin"]
    url = https://github.com/project/hogehoge.git 
```

- https:// を git@ に変更
- github.com/projectの間の / を : に変更

```
[remote "origin"]
    url = git@github.com:project/hogehoge.git 
```

- うまくいかないときは、以下のコマンドを実行すると現在のログインしているユーザーを確認できます。[username]が意図している名前になっているか確認してみて下さい。

```
ssh -T git@github.com
> Hi [username]! You've successfully authenticated, but GitHub does not provide shell access.
```

# UserNameの変更方法
特定リポジトリ内のみでuserとemailを変える方法
--globalオプションではなく、 --localオプションで可能です

```
$ git config --local user.name 名前
$ git config --local user.email "メールアドレス"
```

書き換わったら以下で適用されているか確認します。

```
git config --local --list
```
【MDM】社用のiPhone / iPadにMDMを導入する話

## そもそもMDMって？

### MobileDeviceManagement

MDMは、携帯電話を管理するサービス及びソフトウェアの総称です。
一概に"管理"と言っても、どういう事ができるのか？

MDMにも、様々な種類がありますが
どのMDMでもできる事をピックアップしてみます。


### ①携帯電話の状態を取得
携帯の使用状況
ソフトウェアバージョン
SIMの状態（SIMが挿入されていれば番号の表示など）
Jailbreak/root化の状態
インストールされているアプリケーション一覧
インストールされているプロファイル一覧
位置情報（モノによっては移動履歴）


### ②遠隔ロック・遠隔消去
リモート操作でロック・ロック解除・消去が可能です。


### ③その他
Android/iOSによって違いはありますが、
・プロファイルの配信・削除
・アプリケーション配信・削除
・パスワードポリシーの設定
などなど、様々な機能が標準で実装されている事が多いです。




様々な機能が盛り込まれています。

## MDMを導入するケースの想定

MDMの導入を検討している担当者及び会社としては
「スマートフォンの管理が手動では行き届かない」
というシーンが多いのではないでしょうか。

例えば、社員が200名以上・所有台数300台近くになると
それらの状況を人の手で管理するのは非常に煩雑です。

そこで、MDMを導入しリアルタイムに携帯電話の状況を把握し
・携帯電話が実際に使われているのか
・紛失時にデータが流出したらどうしよう
・スマートフォンの資産管理が煩雑だな
などの様々な問題を解決してくれることでしょう。


## その他にも利点があります
### AppStoreを開放できるかもしれない
現在社用のスマートフォンを所有している会社の大半が
不要なアプリケーションのインストールを防ぐために
AppStore自体を非表示にするなどの対策をしているかと思います。

これは、ある意味不要なアプリケーションをインストールされる事態を防ぐだけでなく
使用者の意図しないデータの流出やアカウント情報の流出を防ぐ事にも役立っていると思います。

しかし、業務上必要なアプリケーションが後々増えてしまったり
部署別にインストールしなければいけないアプリケーションがあったり
個別にインストールをしなければいけない場合だったりと
手動管理においてとんでもない工数の雑用タスクが舞い込んでくる場合もあります。

そういった場合でも、MDMを導入している事により
支給した端末に何がインストールされているのかを閲覧できる・制御できる
といった意味では、AppStoreを開放しても良いというポリシーの会社もあるかもしれません。

1ライセンス（1台）月額300円などで利用できるサービスもあるので
情シスのアナタも是非MDMを検討しては如何でしょうか。
Androidで簡易的なxmlのデータを配列として扱う


とてつもなく久々Androidを触ったので、色々メモしていきます。
eclipseからandroid studioの進化具合にびっくり。。

#### 試した環境
> Android Studio 2.1.3
Mac OS X 10.11.6



### 下記のようなxmlデータを用意

```xml:strings.xml

<resources>
    <string name="app_name">hogeApp</string>
    <string name="action_settings">Settings</string>
    <string name="section_format">Hello World from section: %1$d</string>

    <string-array name="my_array">
        <item>Aタブ</item>
        <item>Bタブ</item>
        <item>Cタブ</item>
    </string-array>

〜省略〜

```


### xmlからデータを読み込む

```java:MainActiviy.java

//〜省略〜

private String[] mArrTitles;

//〜省略〜

mArrTitles = getResources().getStringArray(R.array.my_array);

// あとはStringの配列と使えます。
// Log.d("hoge", Arrays.toString(mArrTitles));

```

### Fragmentのタイトルとしてつかったり


```java:MainActivity.java

//〜省略〜

        int index = 0;
        for (String title : mArrTitles) {
            adapter.addFrag(MyFragment.newInstance(index++), title);
        }
//〜省略〜
```
Python 文字リスト（配列）の操作

#文字リストの結合と分割

### 文字リストの要素結合
```
    a=["And","I","love","her"]
    b=" ".join(a)
    print b
```
実行結果：
`'And I love her'`

###要素分割
```
    import numpy as np
    np.core.defchararray.split(np.array(b))
```

実行結果:
`array(['And,', 'I', 'love', 'her'], dtype=object)`

### 文字リスト間の結合

ここでは、tag=`['svd3' 'svd3' 'svd3' 'svd3' 'svd5' 'svd5' 'svd5' 'svd3' 'svd3' 'svd3'
 'svd3']`というndarrayの要素それぞれの末尾に`"iseg"`という語を追加したい

```
    import numpy as np
    num=len(tag)
    iseg= np.array(["iseg"]*num)
    tag=np.core.defchararray.add(tag,iseg)
    print tag
```
実行結果：

```
['svd3iseg' 'svd3iseg' 'svd3iseg' 'svd3iseg' 'svd5iseg' 'svd5iseg'
 'svd5iseg' 'svd3iseg' 'svd3iseg' 'svd3iseg' 'svd3iseg']
```

###文字リストへの変換

####文字リストから数値リストへ
```
    a=["1.0","2","4.e-3"]
    map(float,a)
```

result:
`[1.0, 2.0, 0.004]`

####数値リストから文字リストへ

```
    b=[1.0, 2.0, 0.004]
    map(str,a)
```

result:
`['1.0', '2', '4.e-3']`


### 数値型に変換できる文字かどうか判定したい(整数の場合)
`val. isdigit()`

### 数値型に変換できる文字かどうか判定したい
floatの場合は厄介である

`val.replace(".","",1).isdigit()`

詳しくはhttp://d.hatena.ne.jp/artgear/20120217/1329493335などを参照
JavaScriptで配列の重複している項目の数をカウントする

配列で重複している要素数をカウントしたい、と思って調べていると、PHPには`array_count_values`という関数があるそうで便利だな、と思いました。

[PHP: array_count_values - Manual](http://php.net/manual/ja/function.array-count-values.php)

ただ、自分はJavaScriptでほしいと思っていたので、調べると、ドンピシャのstack overflowの記事がヒットしたので共有しておきます。

[php - array_count_values for JavaScript instead - Stack Overflow](http://stackoverflow.com/questions/5217136/array-count-values-for-javascript-instead)

```js
var myCurrentArray = new Array("apple","banana","apple","orange","banana","apple");

var counts = {};

for(var i=0;i< myCurrentArray.length;i++)
{
  var key = myCurrentArray[i];
  counts[key] = (counts[key])? counts[key] + 1 : 1 ;

}

alert(counts['apple']);
alert(counts['banana']);
```

非常に分かりやすいですね。自分もこういうのすぐ思いつけるようになりたいです。

**追記**
npmのパッケージを調べると`count-array-values`というのが見つかったので使い勝手優先するならこっちで良さそうです。

[count-array-values](https://www.npmjs.com/package/count-array-values)
learning Redux from todo[4]


刚才说到了 [Store ](http://qiita.com/xiangzhuyuan/items/9ce23a8c9f3b26c48838)

接下来说 **数据流**

Redux 使用**单向数据流**

这就意味着在 app 里所有的数据都会经过同样 的生命周期模式. 让你的程序逻辑更加可以预测和容易理解.对于数据的处理同样要优化精华. 而不是让你死在多份同样的数据, 你手里的数据同样能够被他人来修改. 都不知道自己怎么死的.

如果还是没有被说服,建议读一下 [1](http://redux.js.org/docs/introduction/Motivation.html) [2](https://medium.com/@dan_abramov/the-case-for-flux-379b7d1982c6) 同时建议读一下[ Redux 不简单是 Flux 的变种](http://redux.js.org/docs/introduction/PriorArt.html)它同样说明了一些为什么要单向数据流的好处.

Redux 应用里的数据大致会走4步:

1. 当你调用` store.dispatch(action). 触发了一个动作.

一个动作就是一个简单的对象,说明了会发生什么.

```

 { type: 'LIKE_ARTICLE', articleId: 42 }
 { type: 'FETCH_USER_SUCCESS', response: { id: 3, name: 'Mary' } }
 { type: 'ADD_TODO', text: 'Read the Redux docs.' }
```

描述了一个动作, 已经一些参数用来指明动作作用的对象.
好比这样说: 一个动作就是'某某喜欢找个文章', 看 redux 的文章`等等.

**你可以在 redux app 的任何地方使用` store.dispatch(action), 包括组件或者 XHR 的回调, 甚至是一个循环调用.**

2. Redux store 调用你给它的 reducer 函数

**store 是会传递两个参数给` reducer` 的. 第一个是当前的状态, 第二个是 action, 然后返回 action 作用之后的最新状态.** 再来看个例子:

```
 let previousState = { // 当前的状态
   visibleTodoFilter: 'SHOW_ALL',  //要显示什么类型
   todos: [  //所有的 todo
     {
       text: 'Read the docs.',
       complete: false
     }
   ]
 }

 // 这是一个添加 todo 的动作
 let action = {
   type: 'ADD_TODO',
   text: 'Understand the flow.'
 }

 // 获取最新的状态
 let nextState = todoApp(previousState, action)


```

一定要保证` reducer` 都是 **pure** 的函数,也就是说每次给同样的参数返回结果都是一样的.
 
 3. **根 reducer** 可以组合多个 reducer 到一个单独的状态树里.

如何组织*根 reducer *完全是个人喜好, Redux 提供一个` combineReducers()` 函数用来帮助组织分散的 Reducer. 下面再看看他们是如何被组织起来的:


```
 function todos(state = [], action) {
   // Somehow calculate it...
   return nextState
 }

 function visibleTodoFilter(state = 'SHOW_ALL', action) {
   // Somehow calculate it...
   return nextState
 }

 let todoApp = combineReducers({
   todos,
   visibleTodoFilter
 })
```

当你触发一个动作, 然后 todoAPP 就会调用由`combineReducers`返回的对应的 reducer:


```
let nextTodos = todos(state.todos, action)
let nextVisibleTodoFilter = visibleTodoFilter(state.visibleTodoFilter, action)
```

其实上面的情况就是返回

```
 return {
   todos: nextTodos,
   visibleTodoFilter: nextVisibleTodoFilter
 }

```

4. **Redux Store** 会把所有的 **reducer** 返回的 state 写会单独完整的 state 里.

 
至此,算是我们已经完成的 backend 逻辑, 接下来我们会学习如何结合` react` 完全 UI 部分.



---


index

learning Redux from todo

- [learning Redux from todo[1]](http://qiita.com/xiangzhuyuan/items/a26e97c6cac476369e37)
- [learning Redux from todo[2]](http://qiita.com/xiangzhuyuan/items/86c5c6508e8481c2dd3a)
- [learning Redux from todo[3]](http://qiita.com/xiangzhuyuan/items/9ce23a8c9f3b26c48838)
- [learning Redux from todo[4]](http://qiita.com/xiangzhuyuan/items/c082e97c3b863602fccf)
- [learning Redux from todo[5]](http://qiita.com/xiangzhuyuan/items/4e6f61a27c068b4f33e7)
Github projectsを使ってみた

# Github projectsとは

- 2016/9/15にGithubが開催した[annual Universe conference](https://github.com/universe-2016)にて幾つかの新機能が発表された（既にリリースされている）
  - 詳細 : [A whole new GitHub Universe: announcing new tools, forums, and features](https://github.com/blog/2256-a-whole-new-github-universe-announcing-new-tools-forums-and-features)
- なかでもアジャイル開発や、プロジェクトマネジメントという視点での目玉機能がカンバン式のタスク管理を可能にする機能『**projects**』である。

## projects詳細

1. repositoryのリストに**project**が追加された<img width="895" alt="貼り付けた画像_2016_09_15_9_07.png" src="https://qiita-image-store.s3.amazonaws.com/0/83135/5ae443d0-cb39-4342-1965-2efa1b8149aa.png">
2. projectsの中には自由にカラムを作り、カラムの中には既存のissueとPR、そしてnoteをcardとして入れることができる。<img width="1277" alt="貼り付けた画像_2016_09_15_9_12.png" src="https://qiita-image-store.s3.amazonaws.com/0/83135/515cfade-bcb1-0221-cb50-2c52b902671d.png">
3. ドラッグ&ドロップでcardは移動可能
4. noteは `Convert to issue` でいつでもissueに変換できる![44629a3e-79ab-11e6-8ce9-9ad5f07a135d.gif](https://qiita-image-store.s3.amazonaws.com/0/83135/03f1b4b6-aa0b-aeac-e533-8fa5ac88c395.gif)

# 実際使ってみた所感

- Githubにこれまで欠けていたカンバン機能がこのprojectにあたる。
- projectはrepoあたり複数個作成可能
- これまで「開発以外のタスク管理についてはカンバン機能が無いためにTrelloやJIRAで行っていた」というチームも多いと思うが、そういったタスク管理もGithubに集約できる可能性が生まれた。projectは真の意味でチーム全体のコミュニケーション加速に一役買うと思う。
- ただし、noteという概念はissueやPRとは別のものであり、他のnote, issue, PRとrelationが付けられない。その点でnoteが必要なのか？実用性があるのか？というのは疑問。自分が使う場合は必ずissueにconversionして使うだろう。

## 改善希望ポイント
- projectページ内でissueを作成することができないことも率直に不便を感じた :thought_balloon: 
- issueをcloseしたり、PRがmergeされたら自動でclosedのカラムへ移動してほしい。
- 「自分の担当issueのみ進捗管理したい」などのニーズは容易に想定できるので、projects内のフィルタリング機能がほしい
- このあたりはzenhubのboard機能と比較すると見劣りするが、それでも追加課金を必要とせずカンバン機能が使えるという点で非常にポジティブだと思う :smile: 
- 追ってzenhubのboardとの比較もしてみたい :raising_hand:
Deployerを使ってデプロイしてみたら想像以上に楽だった


### 1. Deployerのインストール

[公式](http://deployer.org/)を見ると書いてありますが、インストールは3種類用意されてます。

* ダウンロード
* compoer
* ソースからビルド

今回は直接ＤＬしてきて使ってみます。

```
$ wget http://deployer.org/deployer.phar
$ mv deployer.phar /usr/local/bin/dep
$ chmod +x /usr/local/bin/dep
```


### 2. タスクを書いてみる

[Tasks](http://deployer.org/docs/tasks)に書いてあるとおり、
Deployerで行うタスクは、`deploy.php`に記載出来ます。

試しに1つ作ってみます。

```
<?php

task('my_task', function() {
});
```

タスクを実行するには、`dep [task name]`でOKです。

```
$ dep my_task
✔ Executing task my_task
```

#### group

1つのコマンドで、複数のタスクを実行する`group`というのも使えるみたいです。

```
task('deploy', [
    'deploy:prepare',
    'deploy:update_code',
    'deploy:vendors',
    'deploy:symlink',
    'cleanup'
]);
```

多分これ使う事が多いです。
で、実際のデプロイは、`dep deploy production`とか。

### beforeとafter

タスクの前後にタスクを実行することも可能です。

```
<?php

task('deploy', function() {
})->desc('doin my stuff');

// デプロイ前のタスク
task('deploy:before', function() {
    write('Deploy start');
});

// デプロイ後のタスク
task('deploy:done', function() {
    write('Deploy done!');
});

// deployの前後に実行するタスクを設定しておく
before('deploy', 'deploy:before');
after('deploy', 'deploy:done');
```

```
$ dep deploy
➤ Executing task deploy:before
Deploy start✔ Ok
✔ Executing task deploy
➤ Executing task deploy:done
Deploy done!✔ Ok
```

#### Only On

特定の環境だけで行いたいようなタスクがある場合、onlyOnを使うと実現出来るそうです

```
<?php

task('test', function() {
})->onlyOn('test_server');

// 複数のサーバで実行することも可能
task('test2', function() {
})->onlyOn(['pre1_server', 'pre2_server']);
```

## 3. deploy先のサーバ情報を設定する

公式を参考にするとこのような感じになってます。

```
server('prod_1', 'domain.com')
    ->user('user')
    ->password('pass')
    ->env('deploy_path', '/home/www')
    ->stage('production');

server('prod_2', 'domain.com')
    ->user('user')
    ->password('pass')
    ->env('deploy_path', '/home/www')
    ->env('extra_stuff', '...')
    ->stage('production');
```

#### ポイント

* 複数の対象サーバを設定することができる　
* 公開鍵認証でもパスワード認証でもどっちでも可
* 実はサーバ用の設定を書いたyamlファイルを書いて、それを読み込むだけでもOK

```deploy.php
<?php

serverList('app/config/servers.yml');
```

```app/config/servers.yml
dev:
    host:          your-host.com
    user:          release
    identity_file:
        public_key: "~/.ssh/id_release.pub"
        private_key: "~/.ssh/id_release"
        password: "key-password"
    stage:         dev
    deploy_path:   "/var/www"
    branch:        dev

```

こんな感じですね。

#### デプロイ前に必ずやっとくこと

* デプロイするサーバから、デプロイ先のサーバにsshで接続するようのユーザを作る
* 公開鍵認証にするなら公開鍵を、デプロイ先サーバの`.ssh/authorized_keys`に追加しとく
* デプロイ時に必要なコマンドにsudo権限が必要な場合は、デプロイユーザにパスワードナシのsudo権限を与えておく必要があります
	* 下記を参照

```
# visudo
```
下記を追記

```
deploy-user ALL=NOPASSWD: ALL
```
※ ただ、これだとパスワードナシですべてのコマンドが実行可能になるため、乗っ取られた時のリスクが高いです

特定のコマンドだけにsudo権限を与えるには下記のように書きます

```
`deploy-user    ALL=NOPASSWD: [コマンドのパス]`
`deploy-user    ALL=NOPASSWD: [コマンドのパス]`
```


## いざデプロイ！

```
$ dep deploy production
```

これで完了です。
超カンタンで、capistranoより楽な印象です。
Laravelのartisanコマンドまとめ


* 自分がよく使うものをメモしておきます。

## 事前設定

### Laravelインストーラーのダウンロード

* インストーラーダウンロード

	```
	composer global require "laravel/installer"
	```

* PATHの設定

	```
	echo 'export COMPOSER_HOME=${HOME}/.composer'          >> ~/.bash_profile
	echo 'export PATH=${PATH}:${COMPOSER_HOME}/vendor/bin' >> ~/.bash_profile
	source ~/.bash_profile
	```


## プロジェクト関連

### Laravelプロジェクトを作成する

* composerでインストール

	```
	composer create-project --prefer-dist laravel/laravel your-project-name
	```

* または、laravelコマンドでインストール
	
	```
	laravel new your-project-name
	```

	* laravelコマンドの方法はあまり良くないらしい。
	* composerでの方法がおすすめ。


### Laravelのバージョンを確認する

```
php artisan --version
```

### ローカルwebサーバを起動する

* ローカルwebサーバを起動すると、ブラウザから[http://localhost:8000/](http://localhost:8000/)でアクスできるようになる

	```
	php artisan serve
	```



## console系

### バッチ処理定義を作成する

```
php artisan make:console YourConsoleCommand --command="your:console:command"
```

### バッチを実行する

```
APP_ENV=(environment) php artisan your:console:command
```


## migration系

### migration定義を作成する

```
php artisan make:migration create_your_table_name
```

### migrationを実行する

* migrationを実行してテーブルを作成する

	``` console
	APP_ENV=(environment) php artisan migrate
	```

* すべてのテーブルを再作成するには

	``` console
	APP_ENV=(environment) php artisan migrate:refresh
	```
Laravel 5.3でセッション管理にredisを使用する方法



## 参照
* 公式マニュアル
	* [Laravel 5.3 Redis](https://readouble.com/laravel/5.3/ja/redis.html)
	* [Laravel 5.3 セッション](https://readouble.com/laravel/5.3/ja/session.html)

## 設定方法

### predis/predisパッケージをインストール

* コンソールで下記を実行

	``` console
	cd /your/project/path
	composer require predis/predis
	```


### redisサーバの設定を追加

* config/database.phpの「Redis Databases」の情報を変更。
* 実際には下記のようになっているので、.env.xxxxxファイルを変更。

	``` config/database.php
		/*
		|--------------------------------------------------------------------------
		| Redis Databases
		|--------------------------------------------------------------------------
		|
		| Redis is an open source, fast, and advanced key-value store that also
		| provides a richer set of commands than a typical key-value systems
		| such as APC or Memcached. Laravel makes it easy to dig right in.
		|
		*/
	
		'redis'       => [
	
			'cluster' => false,
	
			'default' => [
				'host'     => env('REDIS_HOST', 'localhost'),
				'password' => env('REDIS_PASSWORD', null),
				'port'     => env('REDIS_PORT', 6379),
				'database' => 0,
			],
	
		],
	```

* .env.xxxxxを編集。

	``` .env.xxxxx
	REDIS_HOST=(your_redis_host)
	REDIS_PASSWORD=(your_redis_password)
	REDIS_PORT=6379
	```


### セッションドライバーの変更
* config/sessions.phpの「Default Session Driver」を変更
* 実際には下記のようになっているので、.envファイルを変更。

	``` config/sessions.php
		/*
		|--------------------------------------------------------------------------
		| Default Session Driver
		|--------------------------------------------------------------------------
		|
		| This option controls the default session "driver" that will be used on
		| requests. By default, we will use the lightweight native driver but
		| you may specify any of the other wonderful drivers provided here.
		|
		| Supported: "file", "cookie", "database", "apc",
		|            "memcached", "redis", "array"
		|
		*/
	
		'driver'          => env('SESSION_DRIVER', 'file'),
	
	```
	
* .env.xxxxxを編集。

	``` .env.xxxxx
	SESSION_DRIVER=redis
	```

	
## 余談
* AP<->DB構成の場合、[こんなこと](http://qiita.com/LowSE01/items/328cd598c0b7d8f325b2)でハマってしまった…。
プロジェクト内のnpm cliモジュールをササッと呼び出す

この記事は古いです。
2018年の今なら`npx webpack`や`yarn webpack`などのコマンドで同様のことができます。

---

npmでcli対応モジュールをインストールすると、`node_modules/.bin`にcliのエントリが設置されます。
しかしこれを呼び出すには、若干長いパスを記述しないといけないので割りと面倒くさくなってきます。

```bash:webpackを呼び出すとき…
$ ./node_modules/.bin/webpack
```

これをササっと呼び出したいので、PATHの通っているところにこんなスクリプトを書きました

```bash:nb
package=$1
shift
eval "$(npm bin)/${package} $@"
```

あとはnode_modulesのあるプロジェクト内で以下の様なコマンドを叩けばササっとモジュールを呼び出せます。

```bash
nb webpack
```
PackerでCentOS6のVagrant Boxを作って無料でAtlasで公開する

# PackerでCentOS6のVagrant Boxを作って無料でAtlasで公開する

以前からVirtualBox+Vagrant用のCentOSのBoxを自分で手作業で作って使っていたのですが、作成をPackerで自動化してAtlasで公開してみました。

## 環境

- Windows 10
- VirtualBox 5.0.26
- Packer 0.10.1
- CentOS 6.8

## 準備

VirtualBoxは現時点での最新版は5.1.6ですが、安定性重視で5.0.26を使いました。以下からインストーラをダウンロードできます。

- https://www.virtualbox.org/wiki/Download_Old_Builds_5_0

Packerは以下からダウンロードします。.zip形式なので展開して実行ファイルにPATHを通しておきます。

- https://www.packer.io/downloads.html

CentOS 6.8のインストールCDイメージファイルをダウンロードします。今回は以下のページから「CentOS-6.8-x86_64-netinstall.iso」をダウンロードします。

- http://ftp.riken.jp/Linux/centos/6.8/isos/x86_64/

## Packerテンプレート作成

下記を参考にさせていただきました。

- https://github.com/boxcutter/centos

作成するファイルは主に以下の3種類になります。

- テンプレートJSONファイル
- キックスタートファイル
- 初期設定用スクリプトファイル

作成したものは以下に公開しています。

- https://github.com/sadapon2008/packer-templates

テンプレートJSONファイルは「centos68.json」になります。

キックスタートファイルは「http/ks_centos6.cfg」になります。

初期設定用スクリプトファイルは「scripts/centos6_setup1.sh」と「scripts/centos6_setup2.sh」になります。

## PackerでVagrantのBox作成

作成したPackerテンプレートをダウンロードして展開します。

- https://github.com/sadapon2008/packer-templates/archive/master.zip

あらかじめダウンロードした「CentOS-6.8-x86_64-netinstall.iso」を「iso」ディレクトリ下に移動させます。

コマンドプロンプトまたはターミナルから「centos68.json」があるディレクトリにcdしてからPackerを実行します。

```
> packer build centos68.json
```

Windowsの場合はWindowsファイアウォールの警告が出る場合があります。その場合は許可します。

成功すると「centos68.box」が作成されます。

## Atlasで無料で公開する

Atlasはpublicで公開する限りは無料で利用できます。下記のページからアカウントを登録します。

- https://atlas.hashicorp.com/account/new

登録完了したらログインして左上のプルダウンから「Vagrant Enterprise」を選択してVagrantの画面に移動します。

Boxを公開するには「New Box」をクリックして、公開するBox名を入力して「Create Box」をクリックします。

次にバージョンを入力する画面になりますが、ひとまず「1.0.0」と入力して、「Create Version」をクリックします。

次に「Create new provieder」をクリックして、「virtualbox」を選択して「upload」を選択し「Cotinue to upload」をクリックするとファイルをアップロードする画面になるので作成した「centos68.box」をアップロードします。アップロードが完了したら「Finish」をクリックします。

最後に左のサイドメニューから「Versions」をクリックしてバージョンの画面に移動すると「This version is unreleased.」と出ているので、バージョンの「Edit」をクリックして「Release version」をクリックすると公開されます。

## Vagrantから利用する

以下のように「Atlasのアカウント名/Box名」を指定すると利用できます。

```
> vagrant init sadapon2008/centos68
```
Juliaの最新版のインストール（ubuntu）

apt searchで確認したjuliaと公式サイトにある最新版とでバージョンが違う。古すぎるわけではないけど、最新があるのに使わないのは損している気がする。ということで、最新版を入れる方法を調べた。ppaがちゃんとあるのでそれを使ったらいいようです。

```
sudo add-apt-repository ppa:staticfloat/juliareleases
sudo add-apt-repository ppa:staticfloat/julia-deps
sudo apt-get update
sudo apt-get install julia
```

以上。

#【追記 2017年7月9日（juliaの最新バージョン0.6）】
上記でversion0.5.2が入るものの0.6が試したいと思ったので、Nightly buildsの方を使う方法を試しました。
Nightly buildsを利用したい場合は、次を実行。

```
sudo add-apt-repository ppa:staticfloat/julianightlies
```

それでも古い気がする・・・
気に食わない方はjuliaのgithubのダウンロードページからバイナリーを拾ってきてください・・・
anyenvでインストールできたらいいんだけどなーちらー
CocoaPodsにSwift3対応の自作ライブラリを登録する

Xcode8がリリースされたので、[自作ライブラリ](https://github.com/kentya6/KYCircularProgress)をSwift3に対応しようとした際に少しハマったのでメモ。

というのも、`pod lib lint`した時にSwift2.3でコンパイルされていて、`pod trunk push`ができなかった。

解決策は、`.podspec`ファイルがあるディレクトリで`echo "3.0" > .swift-version`を実行し、`.swift-version`ファイルを作成することだった。

CocoaPodsはこのファイルを参照してSwiftのバージョンを決定しているのだとか。

これで`pod truck push`の際のバリデーションがSwift3で動作し、Swift3に対応したバージョンをCocoaPodsに登録できた。

[参考](https://github.com/CocoaPods/CocoaPods/issues/5864)
Quantum Chemistry - Dirac Notation

関連 http://qiita.com/7of9/items/d3a1799928734375f34f

CG分野で使われるSpherical Harmonics。自分の数値シミュレーション計算に用いたいと思い調べると、量子化学の講義にたどり着く。

短く分かりやすそうな159本のビデオを少しずつ消化中。

Quantum Chemistry - Dirac Notation
https://www.youtube.com/watch?v=QCiWuNpIjmE&list=PLm8ZSArAXicL3jKr_0nHHs5TwfhdkMFhh&index=31


- ディラック表記について
  - https://en.wikipedia.org/wiki/Bra%E2%80%93ket_notation
  - The notation was introduced in 1939 by Paul Dirac.
- 緑と紫
  - "ket"の定義
      - `|n>` = プサイn(x)
  - "bra"の定義
      - `<m|` = プサイ*m(x)
          - プサイm(x)の複素共役
              - v=a+biの複素共役はv*=a-bi
- ピンクの式
  - "bra-ket"
  - 積分範囲 マイナス無限大からプラス無限大で積分
  - これまでのビデオで見てきた積分をbra-ketを使うと<font color=red>表記が簡単になる</font>
     - (補足) 式変形において詳細にとらわれず変形がしやすそう
- 黄色の式
  - オペレータAにbra-ketを作用させた式
  - それは式の右側の積分に対応する
  - 黄色の式は "matrix element" integralと呼ばれる
- 右上の水色の式
  - プサイn*とプサイnの積の積分をbra-ket表記したもの
  - プサイnがnormalized(規格化されたもの)であれば`<n|n>`は1になる
      - 全空間における粒子の存在確率=100%
- オレンジの式
  - オペレータAに対してnのbraとnのketを作用させた
  - この値はexpectation value integralと呼ぶ
     - 期待値(あるいはaverage value of A)を求める時に使う積分
- 紫の式
  - Aの期待値(あるいはaverage value of A)の計算式のbra-ket表記
  - 積分の式で表記するとsubscript(m)など含めて詳細が見えすぎるが、bra-ket表記だとこのように簡単に書ける
      - managing complexity @ Code Complete
      - information hidingに通じる???
- 白の式
  - Hermitian Operatorの場合、この式が成り立つ
     - [このビデオ](https://www.youtube.com/watch?v=0Q_KmTOy07E&index=30&list=PLm8ZSArAXicL3jKr_0nHHs5TwfhdkMFhh)の右下の水色の式をbra-ket表記したもの
技術英語 > Safety counters are not a [cure-all]. / panacea

@ Code Complete (12632 / 36077)

> Safety counters are not a <font color=red>cure-all</font>.

http://ejje.weblio.jp/content/cure-all

> 万能薬、万病薬

<hr>
関連して思い出したのは

http://ejje.weblio.jp/content/%E4%B8%87%E8%83%BD%E8%96%AC

> panacea
> 万能薬
Matplotlibのグラフの色を同系色で揃える（カラーマップ）

# デモ
|カラーマップなし|カラーマップあり|
|:-:|:-:|
|![colorful.png](https://qiita-image-store.s3.amazonaws.com/0/40987/2643430f-4baa-fa90-c9ad-3eb4a04ae97b.png)|![Blues.png](https://qiita-image-store.s3.amazonaws.com/0/40987/9b9a884f-ca5a-47de-31b5-bb8b8d06494e.png)|

# 方法
連続的なデータを扱うなら、カラーマップを利用することで美しいグラフを作成することができます。

カラーマップは`plt.get_cmap()`で取得します。取得したカラーマップに数値（0.0 ~ 1.0）を渡すことで、そのカラーマップ内の色を使うことができます。

```py:demo.py
import numpy as np
import matplotlib.pyplot as plt

N = 16

x = np.arange(0, 4, 0.01)
y = [i * np.sin(x)**2 for i in xrange(N)]
cmap = plt.get_cmap("Blues")

for i in xrange(len(y)):
    plt.plot(x, y[i], c=cmap(float(i)/N))
    
plt.show()
```
## サンプル（一部）
|Reds|Greens|Blues|binary|
|:-:|:-:|:-:|:-:|
|![Reds.png](https://qiita-image-store.s3.amazonaws.com/0/40987/c892a4c4-f095-7015-e3fe-c406c2f50b41.png)|![Greens.png](https://qiita-image-store.s3.amazonaws.com/0/40987/ec4e5792-7ac0-3065-cb4f-ba949b2486ca.png)|![Blues.png](https://qiita-image-store.s3.amazonaws.com/0/40987/a927a32f-9b5a-4404-1d88-77dfe59887e2.png)|![binary.png](https://qiita-image-store.s3.amazonaws.com/0/40987/40777228-9ddb-ebfc-bb66-e81434e97011.png)|

|spring|summer|autumn|winter|
|:-:|:-:|:-:|:-:|
|![spring.png](https://qiita-image-store.s3.amazonaws.com/0/40987/62a95fb0-ff67-af6b-18bf-5f1439a3ccf8.png)|![summer.png](https://qiita-image-store.s3.amazonaws.com/0/40987/4eaaf870-9f91-d2dd-e672-a585f5e09ffa.png)|![autumn.png](https://qiita-image-store.s3.amazonaws.com/0/40987/ade8479c-105f-2bff-a831-38eaa5682243.png)|![winter.png](https://qiita-image-store.s3.amazonaws.com/0/40987/3bb04115-881e-3ac5-8a45-35a8e65e9198.png)|

その他のカラーマップは[こちら](http://matplotlib.org/examples/color/colormaps_reference.html)

# 参考
matplotlib：自動で色分け - Qiita
http://qiita.com/konnyakmannan/items/ab297d53afd9dc94e0e8

color example code: colormaps_reference.py — Matplotlib 1.5.3 documentation
http://matplotlib.org/examples/color/colormaps_reference.html

現在のカラーマップの表示と設定 - MATLAB colormap - MathWorks 日本
http://jp.mathworks.com/help/matlab/ref/colormap.html
Bash のプロンプトに Git のブランチ名を表示する

![Bash のプロンプトに Git のブランチ名を表示する状態でリポジトリの作成からいくつかのファイル操作やコミットやスタッシュを実行した Terminal のスクリーンショット](https://qiita-image-store.s3.amazonaws.com/0/67627/241a718e-992c-3862-02c4-458830f5d21c.png)

OS X で環境構築するときに忘れないように Bash のプロンプトに Git のブランチ名を表示する設定をメモっとく。[Bash で Git のコマンドをオートコンプリートする](http://qiita.com/takuya0301/items/0da10393cd12e7f570a2)の続き。

前提として Homebrew で bash-completion がインストールされていることとする。インストールの詳細は[Bash で Git のコマンドをオートコンプリートする](http://qiita.com/takuya0301/items/0da10393cd12e7f570a2)を参照のこと。

# Bash のプロンプトに Git のブランチ名を表示する #

## Git を Homebrew でインストールしている場合

Homebrew で Git をインストールすると git-prompt.sh が /usr/local/etc/bash_completion.d/ にインストールされる。その場合は設定を .bash_profile に追加するだけでいい。

## Git を Homebrew でインストールしていない場合

Homebrew で Git をインストールしていない場合は手動で git-prompt.sh を /usr/local/etc/bash_completion.d/ にインストールする必要がある。下記のコマンドで git-prompt.sh をダウンロードしてくることで Apple Git でも Bash のプロンプトに Git のブランチ名を表示することができる。

```shell-session
$ curl -o "/usr/local/etc/bash_completion.d/git-prompt.sh" https://raw.githubusercontent.com/git/git/master/contrib/completion/git-prompt.sh
```

## .bash_profile で設定する

あとは下記のように .bash_profile を設定する。

```shell-session
$ cat <<EOF >> ~/.bash_profile
> if type __git_ps1 > /dev/null 2>&1 ; then
>	PROMPT_COMMAND="__git_ps1 '\h:\W \u' '\\\$ '; $PROMPT_COMMAND"
>	GIT_PS1_SHOWDIRTYSTATE=true
>	GIT_PS1_SHOWSTASHSTATE=true
>	GIT_PS1_SHOWUNTRACKEDFILES=true
>	GIT_PS1_SHOWUPSTREAM="auto"
>	GIT_PS1_SHOWCOLORHINTS=true
> fi
> EOF
```

PROMPT_COMMAND は OS X 標準の PS1 設定における $ 記号の直前に Git のブランチ名を表示するように設定している。好みの表示になるように PROMPT_COMMAND は適宜変更してほしい。なお各設定項目の概要は下記のとおり。

* ファイル変更の有無 (GIT_PS1_SHOWDIRTYSTATE)
* スタッシュの有無 (GIT_PS1_SHOWSTASHSTATE)
* 新規ファイルの有無 (GIT_PS1_SHOWUNTRACKEDFILES)
* HEAD とそのアップストリームの違い (GIT_PS1_SHOWUPSTREAM)
* 表示内容のカラー化 (GIT_PS1_SHOWCOLORHINTS)

# 参考文献 #

https://github.com/git/git/blob/master/contrib/completion/git-prompt.sh
Bash で Git のコマンドをオートコンプリートする

OS X で環境構築するときに忘れないように Bash で Git のコマンドをオートコンプリートするための設定をメモっとく。[Git でグローバルな .gitignore を作成する](http://qiita.com/takuya0301/items/29187aa088d04cf92659)の続き。

# Homebrew で Bash のためのオートコンプリート機能をインストールする #

Bash でオートコンプリートするなら入れておこう。なお Homebrew から様々なコマンドのオートコンプリート機能をインストールできるので `brew search completion` してみることをオススメする。

```shell-session
$ brew install bash-completion
$ cat <<EOF >> ~/.bash_profile
> [ -f /usr/local/etc/bash_completion ] && . /usr/local/etc/bash_completion
> EOF
```

# Homebrew で Git と共に Git のオートコンプリート機能をインストールする #

Homebrew で Git をインストールすると git-completion.bash が /usr/local/etc/bash_completion.d/ にインストールされる。Homebrew で管理できるので Apple Git を使用するこだわりがなければオススメの方法。

```shell-session
$ brew install git
```

# Git のオートコンプリート機能だけ個別にインストールする #

手動で git-completion.bash を /usr/local/etc/bash_completion.d/ にインストールする方法。Apple Git でもオートコンプリート機能をインストールできる。

```shell-session
$ curl -o "/usr/local/etc/bash_completion.d/git-completion.bash" https://raw.githubusercontent.com/git/git/master/contrib/completion/git-completion.bash
```

# 参考文献 #

https://github.com/git/git/blob/master/contrib/completion/git-completion.bash