OmniAICreator/Qiita-1.07M huggingface dataset:
JIRAプラグイン開発方針のまとめ

この記事は[ブログ](http://mmorita44.hateblo.jp/entry/2017/05/23/153431)に投稿されたものの転載です。

---

業務上JIRAプラグイン開発をやっているので、その所感を開発方針という形でまとめてみました。

# 開発の課題と方針

Atlassianはプラグイン開発についてサポートしないし、公式のドキュメントも充実していない。おまけに、コミュニティも当てにならず、Stack Overflowでお目当てのソリューションを探すこともままならない。そのため、MarketPlaceに上がっているようなリッチなプラグインを開発しようと思えば、独自にフレームワークの解析を行う必要がありかなりの研究コストがかかってくる。おまけに、プラグイン開発で必須なコンポーネント及びモジュール群の機能についても知っておく必要があるので開発要員の学習コストもそれなりにかかる。

このように開発においてかなりの苦労が要求されますが、それでもなお自社の業務仕様に合わせてJIRAを拡張したいという需要はあります。そこで、プラグイン開発する新人向けに開発方針をまとめました。

## 方針1: リソース管理はREST APIを使う

JIRAのリソースと言ったらユーザ情報やプロジェクト・タスク情報。これらの管理はREST APIで十分です。主だったリソースはREST APIで取得・更新・削除できます。またJQL(JIRA Query Language)を利用すれば、条件に似合ったissue情報を好きなように取得することもできます。自社システムとの連携についてはこれで十分。あとマスタ管理であれば、JIRAのプラグインを作成するよりも別途システムを構築した方が製造及び拡張が容易です。

## 方針2: 主要なコンポーネント及びモジュールを押えておく

プラグイン開発のメリットは、JIRAのコンポーネントとモジュールを活用して自社の業務仕様に合わせJIRAの機能を拡張できる点です。中でも以下のコンポーネントとモジュールは使用頻度が高く、これらだけ覚えても有用なプラグインが作成できます。

#### ActiveObjects

独自のDBテーブルを生成します。他システムのマスタデータを取り込むときなどに使います。

#### EventListener

あらゆるイベントに対応する処理を付加します。

#### 各種Manager系

IssueManagerやUserManagerなどリソース管理を行うコンポーネントです。リソース管理だけならREST APIで十分ですが、他のコンポーネントやモジュール上からリソース管理を行うなら必須です。

#### REST Plugin

独自のREST APIを生成します。JIRAの画面はフレームワークの制約が大きく、画面上のイベントからサーバ処理を行うにはREST APIを通じた非同期通信しかありません。そういう意味ではプラグイン開発必須のモジュールです。よくActiveObjectsとセットで利用されます。

#### 各種Workflow系

JIRAの最大の利点といえば強力なWorkflowをおいて他にありません。WorkflowモジュールにはConditionとValidator及びPost Functionがあり、要望に応じて柔軟に拡張できます。

## 方針3: 画面作成は極力行わない

AtlassianにはAUIというフロントサイドフレームワークがあります。AUIにはAtlassianらしいデザインを作成するためのCSSと、Atlassianらしいモーションを実現ためのAJSが含まれます。AJSは単なるjQueryのラッパーではなく独自の関数やオブジェクトも含みます。使いこなせば有用なんですけど、ただでさえ学習コストの高いプラグイン開発のレベルを更に一段高くしてくれます。おまけに、フレームワークに従順するように開発する必要があるため、「あのページにコレ入れて」とか無闇に容認すると実現できずに失敗することになります。一見簡単そうに見えて複雑なのがフロントサイドです。

画面に対する要望は対応しないのがベストです。クライアントにはAtlassianの仕様についてよくよく理解してもらう必要があります（簡単そうなだけに）。それでも画面を作成するというなら、リスクを洗い出した上でその旨をクライアントを合意、後々もめないような手筈を整えておいてください。

# 最後に

開発できる仲間募集してます。
TensorFlowでGPUを使用した学習中にシステムが勝手に再起動する問題

TensorFlowをGPUで回すと落ちる原因として考えられるものは、以下の2点です。

1. nvidiaドライバの問題
1. PSU（電源ユニット）の出力不足

2については、最近のTensorFlowコミュニティ<sup>[2](https://github.com/tensorflow/tensorflow/issues/8858)</sup>で議論されていたことです。多くの場合はドライバ側に問題があることが多かったのですが、電源ユニットの出力不足で落ちるということもどうやらあるようです。

ドライバの更新は、多くの場合トラブルの温床となりやすいです。nvidia側も、ドライバのアップデートで生じた問題にはあまり対応がよくありません。（特に、ゲーマーが不利益を被る場合を除いた場合、ドライバの修正がすぐになされることは期待できません）

そのため、1よりも先に、2が原因であることを疑った方がいいかもしれません。

## 1. nvidiaドライバの問題

nvidiaドライバのバージョンにより、システムがクラッシュしてしまうことがあります。

nividaドライバを最新にしてください。

## 2. PSUの出力不足

電源の出力不足により、GPUに十分な電力が供給されずに、システムごとクラッシュしてしまうことがあります。

### 対応策1

PSUをより出力の高いものに替えましょう。

### 対応策2

`nvidia-smi`コマンドを用いて、GPU側で消費電力に上限を設定します。

例えば、本来250WであるTITAN Xにおいて、電力上限を150Wに制限したい場合は、以下のようなコマンドを実行します。

```
$ sudo nvidia-smi --power-limit=150
```

ただ、上限をどこに設定すれば正常に動作するかどうかは、機種によります。

また、電力上限を設けるということは、GPUの機能が制限され、本来のパフォーマンスを発揮することができないということになります。

基本的には、PSUをより高出力のものに替えることをおすすめします。

## 参考

<sup>1</sup> http://suprsonicjetboy.hatenablog.com/entry/2017/04/23/194959
<sup>2</sup> https://github.com/tensorflow/tensorflow/issues/8858
CentOS7でUnixBenchする方法（16コア以上対応）

##UnixBench
[https://github.com/kdlucas/byte-unixbench](https://github.com/kdlucas/byte-unixbench)
昔から使われているLinux系の定番ベンチマークツール。
VPSやクラウドのスペック比較には欠かせない。

##環境
CentOS 7.3.1611

##インストール

必要パッケージのインストール。
開発ツールがインストール済みの場合は不要

```
# yum install make gcc perl perl-Time-HiRes
```

UnixBenchのインストール。
Google Code Archiveからダウンロードできる。最終版は`UnixBench5.1.3.tgz`

```
# wget https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/byte-unixbench# /UnixBench5.1.3.tgz
# tar xfz UnixBench5.1.3.tgz
# cd UnixBench/
```

パッチの適用
そのままだと16コア以上は測定できないのでパッチが必要となる

```
# wget http://storage.googleapis.com/google-code-attachments/byte-unixbench/issue-4/comment-1/fix-limitation.patch
# patch Run fix-limitation.patch
```

##実行
これだけ
30分～1時間程度掛かる。

```
# ./Run
```

##結果の見方
`System Benchmarks Index Score`の値がベンチマーク結果。大きいほどよい。
`SPARCstation 20-61`というマシンを10.0とした場合の相対値らしい。

各項目はこのあたりを参照
[UnixBenchでベンチマーク - IDCF テックブログ](http://blog.idcf.jp/entry/cloud/unixbench/)
PHP7にしたら apc.php が動かない

格段に速くなるという噂のPHP7を導入したら、apc.phpが動いていない。

##エラー

```
No cache info available. APC does not appear to be running.
```

APCが動いてないよ！
なんて表示されていますが、`phpinfo()`を見る限り、APCuは有効になってる。

Google大先生にお伺いすると、バージョンが古いとのこと。

Githubから最新版をダウンロードしたところ、無事解決。

[https://raw.githubusercontent.com/krakjoe/apcu/master/apc.php](https://raw.githubusercontent.com/krakjoe/apcu/master/apc.php)

ちなみに、PHP7からは APC ではなく、Zend OPcache + APCu になった模様。
BackWPupでDropboxの古いファイルが削除されない

[BackWPup](https://ja.wordpress.org/plugins/backwpup/)でDropboxの古いファイルが削除されない

##自動削除がされない
BackWPupには、アーカイブが指定数を超えると自動削除する機能がある。
が、この機能が動作していない。

ネットで確認すると、私だけではないらしい
[【未解決】BackWPupでバックアップファイルが自動で削除されなくなった | ブログが書けたよ！](https://kaketayo.net/backwpup-cant-delete-files/)

プラグインのフォーラムを確認すると、そのまんまの質問が。
[Topic: Old Backups Files Not Deleting from Dropbox ≪ WordPress.org Forums](https://wordpress.org/support/topic/old-backups-files-not-deleting-from-dropbox/)

どうやら次のアップデートで修正され...アップデートが公開済みの模様

ダッシュボードから更新を選択し、アップデート。手動で実行して削除されていることを確認。
エラー対応「cs-cart SEO URLが動作しないため無効化されました。サーバーおよびURL書き換えエンジンの設定を確認してください。」

cs-cart で

下記のようなエラーが発生して、たまにハマります。

「SEO URLが動作しないため無効化されました。サーバーおよびURL書き換えエンジンの設定を確認してください。」

.htaccess
を設定してもうまく有効にならない場合。

/etc/hosts
で
127.0.1.1   www.***.jp
の設定を忘れていないかチェック！

チェックのため、自分自身に問い合わせに行くため。


毎回忘れるので、、、
TodoAppでVue.js入門(2)

# やりたいこと

[前回](http://qiita.com/lucidfrontier45/items/b4f6083d03feac602386)はvue-cliを使用してVue.jsのプロジェクトを作成し、Todoアプリを作成した。今回はtemplateをpug,styleをstylusで簡潔に書く[^stylus]と同時にVue.js用のUIフレームワーク[Element](http://element.eleme.io/)を導入して見た目も良くしたい。

成果物
https://github.com/lucidfrontier45/vue-todo-test/tree/0.2

# pugの導入

`pug`と`pug-loader`をインストールする。

```zsh
$ yarn add -D pug pug-loader
```

後はwebpackやvue-loaderがよろしくやってくれるので何も設定は必要ない。らくちん！
`.vue`ファイル内でtemplateタグで`lang="pug"`と指定するとpugで書ける。

例

```html
<template lang="pug">
  div
    img(src="../assets/logo.png")
    h2
      router-link(to="/todos") Watch Todos
</template>
```

筆者はPythonistaなのでインデントで構造を管理するのが大好きです。

[^stylus]: CSSなどのスタイルシートを使用したデザインはほぼ素人なので書き方自体はめちゃくちゃかもしれませんが。。。


# stylusの導入

こちらも必要なパッケージをインストールするだけで設定はいらない。(すでにwebpackのconfにstylus関連は書いてある)

```zsh
$ yarn add -D stylus stylus-loader
```

styleタグ内で`lang="stylus"`を指定すればOK。

```html
<style lang="stylus">
#app
  font-family: 'Avenir', Helvetica, Arial, sans-serif
  -webkit-font-smoothing: antialiased
  -moz-osx-font-smoothing: grayscale
  text-align: center
  color: #2c3e50
  
  .app-main
    margin-top 60px
</style>
```


# Elementの導入

[Element](http://element.eleme.io/)はBootstrapやSemantic UIなどのいわゆるUIフレームワークで、ボダンなどの様々なパーツを提供している。Elementがたと違うのはVue.js前提の設計になっている点である。

例えばヘッダーメニューを作る`el-menu`は`vue-router`と連携できるのでこのように簡単にページ上部にメニューヘッダーを作れる。

```html
<template lang="pug">
  #app
    .app-header
      el-menu(:default-active="$route.fullPath" @select="handleSelect" mode="horizontal" router)
        el-menu-item(index="/") Top
        el-menu-item(index="/todos") Todos
    .app-main
      router-view
</template>
```

Todo画面ではinput,button,selectなどを使用した。

```html
<template lang="pug">
  el-card.box-card.todo-app
    div(slot="header" class="clearfix")
      el-input.todo-input(type="text" v-model="input" placeholder="what to do?")
      el-button(@click="handleAdd" type="primary") Add
      br
      span Filter
      el-select(v-model="mode")
        el-option(label="All" value="all")
        el-option(label="Completed" value="completed")
        el-option(label="Incomplete" value="incomplete")

    ul
      li(v-for="todo in filteredTodos" :key="todo.id")
        el-button.toggle-btn(v-if="todo.completed" @click="() => handleToggle(todo.id)") restore
        el-button.toggle-btn(v-else type="success" icon="check" @click="() => handleToggle(todo.id)") done
        | {{todo.msg}}
</template>
```

その他に今回は使用していないが、テーブルの作り方が独特で面白い。`data`というattrに実際に表示させたいデータの配列をbindするという方法だ。

```html
<template>
  <el-table
    :data="tableData2"
    style="width: 100%"
    :row-class-name="tableRowClassName">
    <el-table-column
      prop="date"
      label="Date"
      width="180">
    </el-table-column>
    <el-table-column
      prop="name"
      label="Name"
      width="180">
    </el-table-column>
    <el-table-column
      prop="address"
      label="Address">
    </el-table-column>
  </el-table>
</template>
```

詳しくは[公式doc](http://element.eleme.io/#/en-US/component/table#table-with-status)を参照のこと。

# 小並感

Elementとpugを組み合わせるといい感じにページを簡単かつ簡潔に書けました。
次回はvuexを導入します。
[AWS] EC2でSSHへアクセス制限をかける

## 概要
AWSのEC2でSSHへアクセス制限をかける方法です。

## インスタンスを表示する
AWSにログインし、左メニューの「インスタンス」からアクセス制限をかけたいインスタンスをクリックする。
「説明」タブのセキュリティグループの右側にあるセキュリティをクリック

## セキュリティグループを表示する
適応されているセキュリティグループが表示されたら「インバウンド」タブをクリックし「編集」をクリックする。

## セキュリティグループを追加する
下記のように登録します。

|タイプ|プロトコル|ポート範囲|ソース|
|---|---|---|---|
|SSH|TCP|22|任意の番号|


## おそらく役立つ情報 
痒いところに手が届くかもしれない記事を書いています。
フォローしてくれるとやる気になります！

- Qiita　プログラミングに関する情報はこちら
http://qiita.com/nadonado


- Twitter　日々のつぶやきはこちら
https://twitter.com/hironado
【Go】RevelのControllerからURLを取得する

`routes.Controller.Method(aregs...)` とすることでアクセスパスを取得できる。
AccountsController内のMeのURLが知りたい場合は以下のように取得できる。

```go:例
func (c Accounts) Me() revel.Result {
	fmt.Println(routes.Accounts.Me()) // /api/accounts/login
	...
	return c.Render()
}
```

内部的には `route.go` が自動生成され、 `revel.MainRouter.Reverse` が叩かれているので、直接これを使用することでもURLを取得できそう

```go:route.go
func (_ tAccounts) Login() string {
	return revel.MainRouter.Reverse("Accounts.Login", args).URL
}
```
UnixNanoとJSTの相互変換をブックマークレットで

GoでUnixNanoを頻繁に使うためJSTとの相互変換をサクッとやりたくなったので。

`javascript:(function(){  var t = prompt('UnixNano or JST');  if (isFinite(t)) {    t =t/1e6;    prompt('JST',new Date(t).toLocaleString());  } else {    var ts = t.replace( /-/g, '/');    prompt('UnixNano', Date.parse(ts)*1e6);  }}());`

始めのプロンプトでUnixNano(`1481448774865635431`とか)か、日付(`2017/8/29 18:00:00`とか)を入れればもう片方に変換してくれます。

おしまい。
Selenium2はfancyBoxにも対応している！

tsuttieです(*'▽')
Seleniumを使って色々としましたので、まとめていければと思ってます。


#1. Selenium2を使ってみて
Webアプリのテスト自動化を目的としてSelenium2を使ったので詰まった点を数回に分けてまとめて行きたいと思います。
#2. 使用したSelenium
・Selenium IDE
・Selenium Webdriver (Java 3.5.0)
※導入方法についてはわかりやすくまとめていらっしゃる方が多くおりますので、そのあたりのお話は省きます。
#3. 【本題】fancyBoxで動作止まってしまう
　今回は第2回ということでjQueryのfancyBoxについてお話していきたいと思います。

　突然ですが、皆さんはfancyBoxはご存知でしょうか。私は知らぬ間に何度か使っていたようですが、今回Seleniumで引っかかるまで特に気にもしたことはありませんでした。

　知らない方はこのページを見ることもほぼないかと思われますが、念のため参考程度に・・・
　　[フォトギャラリー風にfancyboxを実装しよう！](http://y-plan.jp/1154)
(fancyBoxは↑リンクのように写真を拡大するときに使われていたりします。)

　前回書きました新規タブに対応する感じでいけるのではなかろうかと思い、ハンドルを制御しましたが、うまくいかず・・・(;^ω^)
　どうしようか悩みながらネットを徘徊していたところframeに対応しているとの記述を発見しました！！

結局解決方法としては、
**新しいタブにハンドルを移す！**
またこれだけでした。
ただし、今回はfancyBox対応の方法をとります。

```java:FancyBox.java
package ~;

import java.io.IOException;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.Select;

public class FancyBox {

	private WebDriver driver;

	@Before
	public void setUp() throws Exception {

		System.setProperty("webdriver.gecko.driver", "./driver/geckodriver.exe");
		driver = new FirefoxDriver();

	}

	@After
	public void tearDown() throws Exception {

		driver.quit();

	}

	@Test
	public void test() throws InterruptedException {

		try {


			//fancyBoxを開くリンクを踏む
			driver.findElement(By.id("LinkID")).click();
			
　　　　　　　//ハンドルをfancyBoxへと移す
			driver.switchTo().frame("fancybox-frame");


		}catch(IOException e){

			System.out.println(e);

		}

	}

}
```

`driver.switchTo().frame("fancybox-frame");`
正直これだけかい！！
といった感じですが、ここも対応できるとは思っていなかったので素直にすごいなといった感想でした。
#4. まとめ
今回もハンドル操作に関する内容になってしまいました・・・
ほぼほぼ書いている操作は変わりませんが、やはりページの作りによって対応方法も微妙に変わってきますよね・・・
Selenium、見た目にはわからない変化にも弱いのです( ;∀;)

短くなりましたが、今回はここまでです。
次回はダウンロードに関して記述します！！Σ(ﾟДﾟ)
F1期待値最大化

複数選択可の予測問題(Multi Label Classification[^2])で，どれを選ぶのが一番F1の期待値が高いのかという話です．

![image.png](https://qiita-image-store.s3.amazonaws.com/0/107399/f96562e9-bb86-1048-5e3e-b0efc4c0a24d.png)
図: 浴衣を着た動物のキャラクター[^9]

「この画像に何が写っていますか？」と問われたときに

| いぬ　| ねこ | うさぎ | ねずみ | くま | たぬき |
| :---: | :---: | :---: | :---: | :---: | :---: |
| ○　| ○　| ○　| -　| ○　| -　|

といった具合に複数のラベルを出力したい場合がある．その場合にラベルとして上げる項目が少なすぎても多すぎてもダメなので，ちょうどいいラベルの出力数をなんとか数学的に求められないかという要望があったりします．

## 問題

$n$個の商品があるとする．ユーザーは複数商品を選択可(選ばなくても良い)場合に，ユーザーが商品を選ぶ確率$p$が既知であるとする．
ユーザーがどの商品を選ぶと予測すればF1の期待値を最大化できるか？

### 例

A, B, Cという商品があって，ユーザーが選ぶ確率が$p = (0.45, 0.40, 0.35)^\mathrm{T}$とすると，
一個一個は5割未満だけど全部選ばないよりはどれか選んどいたほうが確率が高そうという話になります．

## 考え方

$2^n$の全てのパターンを試せば，F1の期待値が高い組み合わせがわかる．
ただProbability Ranking Principle[^7]より，確率の高い方から順に$k$個選べば良いという話になって
動的計画法を用いることで，$O(n^2)$で解けることが知られている．[^1]

### 実装

その論文[^1]の実装をFaron氏[^5]がやってくれてて，さらにCPMP氏[^6]がnumba[^8]で高速化してくれています．

## References

[^1]: Nan et al., [Optimizing F-measure: A Tale of Two Approaches](https://arxiv.org/abs/1206.4625), 2012.
[^2]: Jain, [Solving Multi-Label Classification problems (Case studies included)](https://www.analyticsvidhya.com/blog/2017/08/introduction-to-multi-label-classification/), 2017.
[^3]: Narasimhan et al., [Optimizing Non-decomposable Performance Measures: A Tale of Two Classes](http://proceedings.mlr.press/v37/narasimhana15.pdf), 2015.
[^4]: Faidi, [Expected F1 score to select products](https://www.kaggle.com/c/instacart-market-basket-analysis/discussion/36544)
[^5]: Faron, [Get Expected F1-Score in O(n²)](https://www.kaggle.com/c/instacart-market-basket-analysis/discussion/37221), (Faron氏の実装)
[^6]: CPMP, [F1-Score Expectation Maximization in O(n²)](https://www.kaggle.com/cpmpml/f1-score-expectation-maximization-in-o-n/code), (CPMP氏の実装, numbaで高速化)
[^7]: Suhara, [Notes on Probabilistic Information Retrieval—Probability Ranking Principle から BM25 まで—](http://sleepyheads.jp/docs/prob_ir.pdf), 2012.(Probability Ranking Principalについて記載)
[^8]: ANACONDA, [Numba](https://numba.pydata.org/), 
[^9]: みふねたかし, [いらすとや](http://www.irasutoya.com/)
【AWS】 EMRについて


立てて自動で動作させて、勝手に死んでほしい。
さて、そんなことをやる上で色々調べたので自分の備忘録のために書いておきます

# steps
起動コマンドの中でステップの追加をしておくとそのステップにそって処理をしてくれる。

```bash:steps
  --steps Type=CUSTOM_JAR,Name="S3DistCp step",ActionOnFailure=CONTINUE,Jar=command-runner.jar,Args=[s3-dist-cp,--s3Endpoint=s3-ap-northeast-1.amazonaws.com,--src=$S3_SRC,--dest=hdfs:///import_tbl] Type=Hive,Name="TABLE SET UP",ActionOnFailure=CONTINUE,Args=[-f,${pathtohivescript}] \
```

これでS3から元ネタを取ってきて、処理をさせるという2工程が走る。
ポイントは、1工程　2工程　みたいな感じに工程間はスペースで区切ることだった

# auto-terminate
コンソールから起動すると勝手には死なないけど、CLI経由で起動させる場合、このオプションを指定すると、全てのステップが完了した後に勝手にEMRが終了するようになる

# s3-dist-cp
S3とHDFS間でデータをやり取りできるツール
上記のstepの１工程目でやってるのは、S3から元データを取ってきてHDFSにぶっこんでいる処理

＃ サンプルスクリプト

```bash:サンプル
aws emr create-cluster --name '${clusterName}' \
    --release-label emr-5.7.0 \
    --log-uri '${s3LogUrl}' \
    --applications Name=Ganglia Name=Hadoop Name=Hive Name=Hue Name=Mahout Name=Pig Name=Tez \
    --ec2-attributes '{"KeyName":"${KeyName}","InstanceProfile":"EMR_EC2_DefaultRole","SubnetId":"${SubnetId}"}' \
    --instance-groups '[{"InstanceCount":${masterInstanceCount},"InstanceGroupType":"MASTER","InstanceType":"${masterInstanceType}","Name":"Master Instance Group"},{"InstanceCount":${coreInstanceCount},"InstanceGroupType":"CORE","InstanceType":"${coreInstanceType}","Name":"Core Instance Group"}]' \
    --service-role EMR_DefaultRole \
    --steps Type=CUSTOM_JAR,Name="S3DistCp step",ActionOnFailure=CONTINUE,Jar=command-runner.jar,Args=[s3-dist-cp,--s3Endpoint=s3-ap-northeast-1.amazonaws.com,--src=$S3_SRC,--dest=hdfs:///$HDFS_TBL] Type=Hive,Name="HIVE PG",ActionOnFailure=CONTINUE,Args=[-f,${pathtohivescript}] \
    --region ap-northeast-1 \
    --profile ${profile}
```

Hiveで動かすスクリプトはS3に上がっている必要があり、上記サンプル内ではその ```s3://``` でフルパスを指定している。
シェルスクリプトで連想配列からキーとバリューを参照する


## やりたいこと

bashのシェルスクリプトで連想配列を使って手間な作業を自動化しようとした時に、なかなか情報が見つからなかったので、メモしておく。
やりたいこととしては、連想配列を用意して、ループさせた時に、キーとバリューを参照してくるということ

> Mac用の手順です

## インストール

mac の場合はデフォルトのbashがver 3系なので、brew 経由でインストールを行う

```
// インストール
$ brew install bash

// bashが切り替わっているか確認
$ which bash
// 上記で/usr/local/bin/bashが返って来ればOK
```

## スクリプトを書く

Vimでシェルスクリプトを書く

```
$ vi script.sh
```


script.sh

```
#!/usr/local/bin/bash

# bashで連想配列を使えるようにする宣言$
# declare -A 配列名;
declare -A AREAS;

AREAS=(
  ["aichi"]="愛知県"
  ["akita"]="秋田県"
  ["aomori"]="青森県"
  ["chiba"]="千葉県"
  ["ehime"]="愛媛県"
  ["fukui"]="福井県"
  ["fukuoka"]="福岡県"
  ["fukushima"]="福島県"
  ["gifu"]="岐阜県"
  ["gunma"]="群馬県"
  ["hiroshima"]="広島県"
  ["hokkaido"]="北海道"
  ["hyogo"]="兵庫県"
  ["ibaraki"]="茨城県"
  ["ishikawa"]="石川県"
  ["iwate"]="岩手県"
  ["kagawa"]="香川県"
  ["kagoshima"]="鹿児島県"
  ["kanagawa"]="神奈川県"
  ["kochi"]="高知県"
  ["kumamoto"]="熊本県"
  ["kyoto"]="京都府"
  ["mie"]="三重県"
  ["miyagi"]="宮城県"
  ["miyazaki"]="宮崎県"
  ["nagano"]="長野県"
  ["nagasaki"]="長崎県"
  ["nara"]="奈良県"
  ["niigata"]="新潟県"
  ["oita"]="大分県"
  ["okayama"]="岡山県"
  ["okinawa"]="沖縄県"
  ["osaka"]="大阪府"
  ["saga"]="佐賀県"
  ["saitama"]="埼玉県"
  ["shiga"]="滋賀県"
  ["shimane"]="島根県"
  ["shizuoka"]="静岡県"
  ["tochigi"]="栃木県"
  ["tokushima"]="徳島県"
  ["tokyo"]="東京都"
  ["tottori"]="鳥取県"
  ["toyama"]="富山県"
  ["wakayama"]="和歌山県"
  ["yamagata"]="山形県"
  ["yamaguchi"]="山口県"
  ["yamanashi"]="山梨県"
)

# 連想配列のループ
for AREA in ${!AREAS[@]};
do
	# $AREAでキーが取得できる。
	# 上記のtokyoやtottoriなど
	echo $AREA
	
	# ${AREAS[$AREA]}でバリューが取得できる
	# 上記の東京や鳥取など
	echo ${AREAS[$AREA]}
done

```


シェルスクリプトで連想配列を扱う方法は以上です。
Zabbix 3.4をCentOS 7+PHP 7.1で動かすには

手順を確認したので書いておきます。

通常の標準パッケージ構成では、CentOS 7用のPHPとしてはphp-5.4.16までしか用意されていません。
しかし、PHP 7.1にすれば速くなると聞くとPHP 7.1にしたくなるものです。

そこで、remiのPHP 7.1を使ってZabbixサーバーを構築してみましょう。
この方法は、パッケージの依存関係を無視するので、yumを使っては環境を構築できませんのでご注意ください。

以下、手順となります。
Zabbix 3.4.1がリリースされた時点での確認なので、使用するバージョンに合わせて、適宜インストールするrpmは変更してください。

```shell-session
# yum install https://rpms.remirepo.net/enterprise/remi-release-7.rpm
# yum --enablerepo=remi-php71 install php php-gd php-bcmath php-mbstring php-xml php-ldap php-mysqlnd
# yum install http://repo.zabbix.com/zabbix/3.4/rhel/7/x86_64/zabbix-release-3.4-2.el7.noarch.rpm
# yum install zabbix-agent zabbix-server-mysql
# yum install dejavu-sans-fonts vlgothic-p-fonts
# wget http://repo.zabbix.com/zabbix/3.4/rhel/7/x86_64/zabbix-web-3.4.1-1.el7.noarch.rpm
# wget http://repo.zabbix.com/zabbix/3.4/rhel/7/x86_64/zabbix-web-mysql-3.4.1-1.el7.noarch.rpm
# wget http://repo.zabbix.com/zabbix/3.4/rhel/7/x86_64/zabbix-web-japanese-3.4.1-1.el7.noarch.rpm
# rpm -ivh --nodeps zabbix-web-3.4.1-1.el7.noarch.rpm zabbix-web-mysql-3.4.1-1.el7.noarch.rpm zabbix-web-japanese-3.4.1-1.el7.noarch.rpm
```

ファイル/etc/httpd/conf.d/zabbix.conf内のIfModuleの設定でPHP 7用の設定をPHP 5用の設定と同様に設定することが必要です。

/etc/httpd/conf.d/zabbix.conf

```
    <IfModule mod_php7.c>
        php_value max_execution_time 300
        php_value memory_limit 128M
        php_value post_max_size 16M
        php_value upload_max_filesize 2M
        php_value max_input_time 300
        php_value always_populate_raw_post_data -1
        php_value date.timezone Asia/Tokyo
    </IfModule>
```

ここまでできれば、あとは通常のインストールと同様に、mariadb-serverなどのDBMSをインストールして、初期データベースを構築してというように進めればOKです。
Python Kivy(macOS)のインストール・実行はPython3.4系が無難

Python3.6系でのKivyインストール、習作のためのKivyアプリケーション作成途中で頓挫したため、備忘録。

個々の環境依存がある可能性もあるので、Python3.6で動作するかもしれません。

[FAQ (https://kivy.org/docs/faq.html#does-kivy-support-python-3-x)](https://kivy.org/docs/faq.html#does-kivy-support-python-3-x) にも 3.3以上と記載されていたのでインストールしていた 3.6.0 でも大丈夫だと思っていました。

※2017/08/29 時点での情報です。



## 環境

以下の構成でKivyのインストールを実施。

* OS: macOS Sierra
* Kivy 1.10.0
* Homebrew
    + pyenv ( global 3.6.0 )

Kivy 導入手順は [https://kivy.org/docs/installation/installation-osx.html](https://kivy.org/docs/installation/installation-osx.html) の通りに実行。(Homebrew with pip で実施)

### が、正常に動作しなかった

* 例外スロー：`pygame - ModuleNotFoundError: No module named 'pygame'`
* pip install pygame を実行し pygame をインストールするも、描画が正常に機能しない（canvas・Image・Label・のレンダリング、BoxLayoutが機能しない等）
* ウインドウが正常にフォアグラウンドにならない
* ウインドウリサイズ後の再描画イベントが発生しない

## Python 3.4系をインストール

* Homebrew (全て削除し、1から入れ直した)
* pyenv install で Python 3.4.6 をインストール

再度、Kivy のインストールを実施

### 意図したとおりの動作結果となった

Homebrew自体をインストールし直したので改めて Python 3.6.0 + Kivy をインストールしたが、上記のエラーが発生し、やはり正常に動作しなかった。

[stackoverflow](https://stackoverflow.com/questions/42046085/error-installing-kivy-on-windows-w-python-3-5-or-3-6) にも類似のスレッドがあった。

Kivy 界隈では 3.4 系がデファクトなのかもしれないが、初見だったため自分のプログラムの方を何度も見直していたが、今回は実行環境のバージョンによるトラブルだった。
Cheapest Cloud Server for hosting the Database Service(Relational and Non-Relational databases)

Cloud is undeniably the future for competitive world. Different Services are being offered by the cloud Hosting like Infrastructure as a Service(IaaS), Database as a Service(DBaaS), Backup as a Service(BaaS), Block Storage as a Service(IaaS) and many more. 

Now, talking about DBaaS, it has become the next big thing in the world of IT-business. Using this service, User get access to required Database without any headache of hardware setup or software installation. It runs on provider’s physical infrastructure and totally managed by them. Data management is now more efficient and easy for users. Moreover, it is recommended to go for cloud-based Database as a Service than running and maintaining Database software manually on the server. 
Also, this DBaaS is cost-friendly, giving you more at less and the Cloud provider hosting this this service at the cheapest price is F(x) Data Cloud.

F(x) Data Cloud is the company providing Public Cloud Services based on OpenStack and it is known for its Most-Affordable prices(Cheapest) with high Uptime. So, If you have larger demand, you can definitely save up your large cost. The purpose behind recommendation are:

    1) They have the most Cost-Effective plans with 99.95% Uptime
    2) Multiple option for Database Management System (MySQL, MariaDB, Percona Server, MongoDB, PostgreSQL, CouchDB, Couchbase, Cassandra, Percona XtraDB Cluster)
    3) Multiple option for Operating System (Ubuntu, Fedora, OpenSUSE, Debian, CentOS, Windows)
    4) They provide both IaaS and DBaaS, so if you want pre-installed Database and configurations, then you can go for DBaaS or else you have an option for IaaS
    5) Scale Out & Scale Up feature for handling traffic
    6) Custom SSD Storage
    7) Great Technical Support
 
I have shared some of their DBaaS plans for some reference, Visit: https://fxdata.cloud for more details.
<img width="1680" alt="Screen Shot 2017-08-29 at 12.53.09 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/199516/c8fb7aae-64c5-ea0f-b707-0ceb79126608.png">
Linux でブラウザが開くまでの仕組み (未完)

とあるアプリに表示されているリンクを選択すると、標準のウェブブラウザが開いてリンク先を表示する。当たり前の動作だが、その時にすでに存在すれば既存のブラウザを利用するようになっている。

* ブラウザが開いていない場合: ブラウザを起動して URL を表示する。
* すでにブラウザが開いている場合: 既存のブラウザを前面に出して URL を表示する。

Ubuntu でこの仕組がどのように実現されているのか調べてみた。

まず、「ブラウザ以外のとある画面に表示されているリンクを選択すると、標準のウェブブラウザが開いてリンク先を表示する。」を実現するために Linux では xdg-open というコマンドラインツールがある。github を開くには次のようにする。

    $ xdg-open https://github.com

mime-type とデフォルトアプリの対応は /usr/share/applications/defaults.list に記述されている。ただどうやら[これは歴史の名残で、仕様では mimeapps.list を使うべき](https://lists.freedesktop.org/archives/xdg/2014-February/013181.html)らしい。

デフォルトアプリを問い合わせる `xdg-mime` コマンドで確認と登録削除が出来る。text/html のデフォルトアプリを調べてみる。

    $ xdg-mime query default text/html
    firefox.desktop

という事で、text/html は firefox.desktop に関連付けられている。このファイルは /usr/share/applications/firefox.desktop に存在していて、firefox が開く事が出来る mime type を宣言している。

firefox.desktop のセクション [Desktop Entry] に `Exec=firefox %u` という記述があるが、ここで [%u は URL を表す](https://specifications.freedesktop.org/desktop-entry-spec/latest/ar01s06.html)。結果的に `firefox https://github.com` が呼び出される。

/usr/bin/firefox はシェルスクリプトで、結果 /usr/lib/firefox/firefox を呼び出す。

結局 /usr/lib/firefox/firefox の中ですでにプロセスが立ち上がっていれば既存のプロセスに URL を渡しているようだ。プロセスをシングルトンにする方法は https://stackoverflow.com/questions/5339200/how-to-create-a-single-instance-application-in-c-or-c 等いくつか見つかったが、URL を渡す方法は良くわからなかった。

## 参考

* [xdg-open](https://wiki.archlinuxjp.org/index.php/Xdg-open)
* [デスクトップエントリ](https://wiki.archlinuxjp.org/index.php/%E3%83%87%E3%82%B9%E3%82%AF%E3%83%88%E3%83%83%E3%83%97%E3%82%A8%E3%83%B3%E3%83%88%E3%83%AA)
* [デフォルトアプリケーション](https://wiki.archlinuxjp.org/index.php/%E3%83%87%E3%83%95%E3%82%A9%E3%83%AB%E3%83%88%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3)
* [Association between MIME types and applications](https://specifications.freedesktop.org/mime-apps-spec/mime-apps-spec-1.0.html)
GoogleAppsScriptとサービス連携して便利になった例

皆さん表計算ソフトは何を使われていますか？
Excel+VBAもすごく便利ですが、今回はスプレッドシート+GoogleAppsScript(以降GAS)で各種サービスと連携して、すごく便利になった例を紹介したいと思います。

#VBAとGASの決定的な違い
決定的な違いは「スケジューラ機能」だと思います。
VBAでも特定の時間に処理を行うように設定することが出来ますが、あくまでLocal環境で動作する為、VBA処理が埋め込まれているExcelファイルが起動していないとスケジューラが発動しません。

それに対してGASはGoogleのサーバ内でスケジューラが動くので、
「○分おき、○時間おきに処理を実行」ということを確実に行うことが出来ます。

# 連携すると便利なサービス
・ GoogleAnalytics(以降GA)
・ re:dash
・ redmine

# 連携した例
## GAS + GA
単にこれだけの連携でも便利ですね。
普段GAを使わない営業職・総合職の人たちに、Analyticsの情報（例えばUU・CTR・CVR等）を確認してもらう際に重宝します。

## GAS + GA + re:dash
re:dashを使ってデータベースの内容を取得し、GASで受け取ることが出来ます。
例えばGAのカスタムフィールド等にテーブルのキー値を送信して紐付けることで、
GAでは取得できない情報をスプレッドシート内に埋め込むことが出来るので便利です。

## GAS + redmine
redmineのチケット情報をGASで受け取ることが出来ます。
チケットの内容やステータス、担当者やストーリーポイントを受け取ることが出来るので、
工数管理やステータス管理をスプレッドシートで行うことが可能となります。
エイチーム引越し侍ではこの組み合わせで、進捗管理表と工数管理表を運営しています。

## GAS + redmine + GA
GASからredmineに情報を送信して、チケットの情報を更新することも可能です。
GAからUUやイベントトラッキングの情報を取得し、LPO,EFOの進捗（CTR,CVR,改善率等）を開発チケットに書き込むことも可能です。

## まとめ
いかがでしたでしょうか？
GoogleAppsScriptのスケジューラ機能を使って、各種サービスと連携すると各サービスに散在している情報をひとまとめにして、一元管理することが出来ますので、一度試していただくと良いと思います！
※ それぞれの詳細事例についてはまた別途記事にしてリンクを張る予定です！

# 追伸
株式会社エイチーム引越し侍では、一緒にサイト改善をしてくれるWebエンジニアを募集しています。エイチームグループのエンジニアとして働きたい！という方は是非、以下のリンクから応募してください。
皆様からのご応募、お待ちしております！！

> [エイチームグループ採用サイト（Web開発エンジニア職）](http://hikkoshi.a-tm.co.jp/recruit/request.php?ea=kekiqiita_gaslinkmatome)
webpackerなしでherokuにRails5&yarnアプリをデプロイする

既存のRailsアプリを5.1系にアップデートしたものの、フロント系のライブラリの管理にyarnを使ってなかったので、yarnを使うように修正しました。そして、いざHerokuにデプロイしたら、`assets:precompile`でエラーが発生して落ちてしまいました。
原因は、JSのライブラリがないから。

最初からRails5.1+webpackerの組み合わせのアプリはHerokuにデプロイしたことがあって、そのときは特に何も考えなくても普通にデプロイできたのに、はて…。という感じで、原因がわからなかったのですが、Herokuの記事を見ると、webpackerがあることを検出すると、yarnのインストールを行い、フロント系のライブラリをインストールした後に`assets:precompile`が行われるようです。

[Heroku Dev Center: Ruby apps now get Yarn installed when the Webpacker gem is present](https://devcenter.heroku.com/changelog-items/1114)

しかし、webpackerは使っていないので、わざわざyarn installのためにgemを入れたくありません。
調べたら解決法がありましたので残しておきます。

# rake assets:precompileの前に処理を差し込む

rake taskは実行前、実行後に処理を差し込むことができます。

[HsbtDiary: Rakeで任意のタスクの前後に別のタスクを実行する](https://www.hsbt.org/diary/20120210.html)

ここでは、`assets:precompile`の前に、`yarn install`を行わせる処理を入れました。

```rb:lib/tasks/yarn.rake
task :js_deps_install do
  sh "yarn install"
end
```

```rb:Rakefile
require File.expand_path('../config/application', __FILE__)
Rails.application.load_tasks

# この1行を追加
Rake::Task["assets:precompile"].enhance [:js_deps_install]
```

# herokuのbuildpacksの順番を変更する

通常のRailsアプリであれば、buildpacksは`heroku/ruby`のみだと思います。
ここに、`heroku/nodejs`を追加するのですが、順番が重要です。

1. heroku/nodejs
2. heroku/ruby

にしなければなりません。

```bash
heroku buildpacks:add --index 1 heroku/nodejs
```

先頭がnodejsだと、最初にyarnのインストールが実行されるようになります。
2番目にすると、yarnのインストールが実行されないので注意してください。

# いざデプロイ！

あとはデプロイするだけです。

```bash
git push heroku master
```

これで、HerokuにRails5.1&yarn(webpackerなし)のアプリをデプロイできました。

## 参考ページ

- [Rails 5.1 with Yarn + Sprockets, without Webpacker](https://github.com/heroku/heroku-buildpack-ruby/issues/591)
Deis Workflow で git push が詰まるときの対策

何が根本原因が不明なのだが、備忘録。

## 構成

Azure Classic、CoreOS 1465.6.0 が動作する 2つのインスタンスがあり CloudServer のロードバランサで振っている。
Deis Workflow v2.16.0。

git push は Deis が動作している Kubernetes 上の Ubuntu インスタンス内から行った。

## 症状

```
git push deis master
```

で無応答になる。無事に繋がる場合もある。deis-builder のログを見ると、接続はしたものの、その後のネゴシエーションで固まっているように見える。

## 追跡

```
#!/bin/bash
ssh -vvv "$@"
```

なる `~/sshv.sh` に 755 設定の上、 `GIT_SSH=~/sshv.sh git push deis master` などしてみる。
ログをつらつらと眺めると、下記の通り `SSH2_MSG_KEY_ECDH_REPLY` のところで止まる。どうやら固まるときは再現性 100 %でここで固まる。

```
debug1: kex: server->client cipher: aes128-ctr MAC: hmac-sha2-256-etm@openssh.com compression: none
debug1: kex: client->server cipher: aes128-ctr MAC: hmac-sha2-256-etm@openssh.com compression: none
debug3: send packet: type 30
debug1: expecting SSH2_MSG_KEX_ECDH_REPLY
```

## 解決手段

```
echo 1 > /proc/sys/net/ipv4/tcp_mtu_probing 
```

なぜかこれで治った。結果から MTU が大きすぎたことが原因であることは解るのだが、どこで MTU が絞られているのかが解らない…。
IE11の開発者ツールが使えない場合の対処方法

#IE11で開発者ツールが使えない
プロジェクトで使用している開発マシンで、IE11の開発者ツールを使用したところ、真っ白になって何も表示されません。
DOMExplorerには以下のようなエラーが表示されます。

Diagnostic:
Exception in window.onload:Error:An error has occurredJSPlugin,3005

#累積Fixを適用することで解決
以下のFixを適用することで無事に解決しました。
[Windows 7 用 Internet Explorer 11 の累積的なセキュリティ更新プログラム (KB3008923)](https://www.microsoft.com/ja-jp/download/details.aspx?id=45134)

マシンをかえるごとに何回もインストールしなければならない、、、、
AWS CLIからS3オブジェクトをキー名の部分一致と最終更新日の範囲指定で抽出する

# やりたいこと

同じprefixを持つ100個くらいのS3オブジェクト群から、プレフィクスの完全一致、キー名の部分一致、最終更新日の範囲指定により抽出して一括で操作したい。

# こまったこと

- S3のマネージメントコンソールでは、プレフィクス指定抽出のみ可能。

# 解決策

- AWS CLIを使う。
    - aws cli s3api list-object の --prefix と --query で条件を指定して取得してパイプし、jq等でキー名を抽出する。
        - --query は[JMESPath](http://jmespath.org/)による表記で、条件結合、部分一致、ソートなどが可能。

## コマンド例

- AWS CLIとjqのセットアップ済み環境を想定。

```shell-session
$ aws s3api list-object --bucket my_bucket --prefix 'my_prefix' --query 'Contents[?contains(Key, `“部分一致させる文字列“`) && LastModified >= `2017-08-20`][Key]' | \
jq 'flatten | "s3://my_bucket/" + .[]' | \
xargs -I{} echo 'target: {}'
#=> target: s3://my_bucket/my_prefix/2017-08-20.log
#=> target: s3://my_bucket/my_prefix/2017-08-21.log
```

# 情報源

- コマンド例 → https://stackoverflow.com/a/27274997
- JMESPathのチュートリアル → http://jmespath.org/tutorial.html
- JMESPathの仕様（論理結合の書き方や関数一覧あり） → http://jmespath.org/specification.html
Bash > 複数の(空白あり)テキストに対するsed変換処理 > sed文字列の生成まで > 複数行のstring list処理

```txt:動作環境
ideone (bash 4.4.5)
```

### やろうとしていたこと

```
A B C
D E F
G    H I
```

上記の文字列(3種類)を持つ行に対して以下の処理を行う

- 行頭の空白を取る
- ###をつける (Markdown ヘッダ)

### code

sedコマンド文字列生成まで

https://ideone.com/PvQ9RE

```bash
#!/bin/bash

targets="A B C
D E F
G    H I"

while read -r line
do
   cmd="sed 's/ *$line/###$line/g'"
   echo "$cmd"
done <<< $targets
```

```txt:run
sed 's/ *A B C/###A B C/g'
sed 's/ *D E F/###D E F/g'
sed 's/ *G    H I/###G    H I/g'
```

### 参考

targetsを読みこむ処理に関しては、以下を参考にしました。
https://stackoverflow.com/questions/8880603/loop-through-an-array-of-strings-in-bash
の
answered Oct 16 '16 at 21:59
Jamie

ファイルを読む場合はこちらのコメントを参照。
[bash > 行を取り出す > headとtailの組合せ > コメントに改良案あり](http://qiita.com/7of9/items/6a19c036ada7af01078a)
virtualenvとりあえずこれだけ！


Pythonの仮想環境の作成で何度も躓いたので作成。

## 仮想環境作成の前に...
virtualenvをインストールする必要があるのでインストールする。

```
$ pip install virtualenv
```

## 仮想環境の作成

```
$ virtualenv <DIR>
```

## 仮想環境を起動

```
$ source <DIR>/bin/activate
```

仮想環境が起動すると以下のようにプロンプトの左側に仮想環境名が括弧つきで表示される。

```
(<DIR>) XXX:YYY UserName$ 
```

## 仮想環境を終了

```
$ deactivate
```

仮想環境を終了すると以下のようにプロンプト左側の仮想環境名の表示が消える。

```
XXX:YYY UserName$ 
```

### 参照
* [Pythonの仮想環境構築(2017年版) pyenvとpyenv-virtualenvとvirtualenvとvirtualenvwrapperとpyvenvとvenv](http://qiita.com/maskedw/items/aaa2fd7abfd493cf2820#virtualenv%E5%8D%98%E4%BD%93%E3%81%A7%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B)
* [Virtualenv > User Guide](https://virtualenv.pypa.io/en/stable/userguide/#user-guide)
Tables for Spring Session based on JDBC

```sql
CREATE TABLE SPRING_SESSION (
   SESSION_ID CHAR(36),
   CREATION_TIME BIGINT NOT NULL,
   LAST_ACCESS_TIME BIGINT NOT NULL,
   MAX_INACTIVE_INTERVAL INT NOT NULL,
   PRINCIPAL_NAME VARCHAR(100),
   CONSTRAINT SPRING_SESSION_PK PRIMARY KEY (SESSION_ID)
 );

CREATE INDEX SPRING_SESSION_IX1 ON SPRING_SESSION (LAST_ACCESS_TIME); 
CREATE TABLE SPRING_SESSION_ATTRIBUTES (
  SESSION_ID CHAR(36),
  ATTRIBUTE_NAME VARCHAR(200),
  ATTRIBUTE_BYTES VARBINARY(512),
  CONSTRAINT SPRING_SESSION_ATTRIBUTES_PK PRIMARY KEY (SESSION_ID, ATTRIBUTE_NAME),
  CONSTRAINT SPRING_SESSION_ATTRIBUTES_FK FOREIGN KEY (SESSION_ID) REFERENCES SPRING_SESSION(SESSION_ID) ON DELETE CASCADE
);

CREATE INDEX SPRING_SESSION_ATTRIBUTES_IX1 ON SPRING_SESSION_ATTRIBUTES (SESSION_ID);
```
co.jp のある hostname を正規表現で分解する

# 解決したい問題

あるhostnameから３つの部分を抽出したい：Domain, SubDomain, Top Level Domain
（Domainの構成について、[GoDaddyのYoutube](https://www.youtube.com/watch?v=Ae00NNuB8CE)の説明がおすすめです）

例えば、下記のhostnameなら、
www.facebook.com

Subdomain:(www)　特に意味ないから略にする
Domain:facebook
Top Level Domain:com

でも、日本でよくある co.jp みたいなやつ、（正確にいうと違うけど）ここでは**セットのTLD**で考えたい。
例えば、news.yahoo.co.jp なら、

Subdomain:news
Domain:yahoo
Top Level Domain:co.jp

という結果がほしいです。

ちなみに、日本以外も、こういうco.xx式を使ってる国もいます。
> Some of the countries using .co as a second-level domain include India (.in), Indonesia (.id), Israel (.il), the United Kingdom (.uk), South Africa (.za), Costa Rica (.cr), New Zealand (.nz), Japan (.jp), South Korea (.kr) and Cook Islands (.ck).

ref: [wikipedia](https://en.wikipedia.org/wiki/.co_(second-level_domain))

# Python3のコード


```python3
import re

p_tld = re.compile(r"\.(?P<tld>(?:\w{2}\.)?\w{2,5})$")

test =[
"amazon.co.jp",
"amazon.com",
"news.yahoo.co.jp",
"news.yahoo.jp",
"news.yahoo.com",
"google.jp",
"google.co.jp",
"google.com",
"www.microsoft.com"
]

for t in test:
    print(t)

    # wwwをなくす
    t = re.sub(r"^www\.", "", t)

    # TLDの部分を探す
    m = p_tld.search(t)
    if(m != None):
        print("tld:", m.group("tld"))
    
    # TLDの部分をカット
    t = p_tld.sub("",t)

    # 残る部分。もしsubdomainあれば、print。なければ、domainだけprint
    subdomain = t.split('.')
    if(len(subdomain) > 1):
        print("subdomain:", subdomain[0])
        print("domain:", subdomain[1])
    else:
        print("domain:", subdomain[0])
    print("--------")

```

# テスト結果

```
amazon.co.jp
tld: co.jp
domain: amazon
--------
amazon.com
tld: com
domain: amazon
--------
news.yahoo.co.jp
tld: co.jp
subdomain: news
domain: yahoo
--------
news.yahoo.jp
tld: jp
subdomain: news
domain: yahoo
--------
news.yahoo.com
tld: com
subdomain: news
domain: yahoo
--------
google.jp
tld: jp
domain: google
--------
google.co.jp
tld: co.jp
domain: google
--------
google.com
tld: com
domain: google
--------
www.microsoft.com
tld: com
domain: microsoft
--------
```
pdbにおいて変数名がデッバガコマンドと衝突しているとき

## !を使う
pdbにおいて変数名がデバッガコマンド(例えば、h(elp), w(here), n(ext)など)と同一であり、衝突している場合、デバッガは変数ではなくデバッガコマンドとして解釈してしまう。

そこで、`!`を表示したい変数名のプレフィックスとして入力すれば、変数として評価される。

変数`n`を表示したい場合は
`> !n`
とする。

## 参考
https://docs.python.org/3/library/pdb.html
フォームが多くなってVuexがだるくなる問題

[第9回ペパボテックカンファレンス ～ Vue.js 特集 ～](https://pepabo.connpass.com/event/63559/) @Joe_nohさんが「Vuex と入力フォーム」にて、「フォームが多くなると辛い（特にmutation）」と話したが、シンプルにフォームデータをcompのローカルstateに詰め込んで、発火するたびにローカルstate丸ごとstoreに投げればいいじゃないかっと思ってちょっとやってみた。

## ゴール
- mutationsを減らす
- get, setを減らす
- Vuex wayを守る
- vue-devtoolsを手放さない

[GitHub:vuex-form-approach](https://github.com/renowan/vuex-form-approach)
[Demo](https://renowan.github.io/vuex-form-approach/#/form1)

## ポイント1

compのdataを一つのObjectにしておく（profile）

```js
data () {
  return {
    profile: {
      name: '',
      age: 0,
      pet: []
    }
  }
}
```

## ポイント2
全体の発火をしっかりキャッチしてstoreへどん。`deep: true` が味噌

```js
watch: {
  'profile': {
    handler (val) {
      this.$store.commit('FORM1_UPDATE_PROFILE', cloneDeep(val))
    },
    deep: true
  }
}
```

## ポイント3
`profile.pet[0].name` が変更されても発火しないので子compを作って深い階層のデータ変更を親に伝えよう。（子compを作らないといけない時点で結局辛いよね？）

```js
onChangePet (val, index) {
  this.profile.pet[index] = val
  this.$store.commit('FORM1_UPDATE_PROFILE', cloneDeep(this.profile))
}
```

## 注意
Objectのままstoreに渡す（commit）と「直で変更するな」と怒られるので、immutableなものにしよう。ここではlodashの `cloneDeep` で解決。

## mutationsはこれだけで済む

```js
[FORM1_UPDATE_PROFILE] (state, data) {
  state.profile = data
}
```

## 最後に
実務では...そう簡単にはいかないので `action` に投げて加工してからcommitするんじゃないかな？
これで目的は達成したが、データ丸ごとstoreにってのはお行儀よくないし、入力した値がお互い影響し合うような複雑な業務システムだとバグ出やすいので、面倒だが丁寧に `get` `set` を書きたい。

他にいい方法があればぜひ教えてください！
バッチファイルでの「UNC パスはサポートされません」はエラーではない

#知ってました？？

ネットワークドライブ上にあるバッチファイルを実行すると、

>上記の現在のディレクトリで CMD.EXE を開始しました。
UNC パスはサポートされません。Windows ディレクトリを既定で使用します。

と表示されます(Windows 7の場合)。UNCパスというのは"\\\server\hoge"みたいなやつですね。私は今までこれを見て「あー、サーバ上でバッチファイルを実行しちゃダメなんだー」と思っていたんですが、実はこれはエラーではなく警告なので、バッチファイル自体はそのまま実行されます(知らなかった…)。

で、その場合に何が起こるのかというと、

**カレントディレクトが"C:\Windows"に変更されるだけ**

なんです。つまり、そのバッチファイルがどのディレクトリあっても正しく動くように作られていれば、ちゃんと動きます。

#ネットワークドライブ上でも使えるバッチファイル

ネットワークドライブ上でも問題なく使えるバッチファイルを作るには、

**ファイルをフルパスで指定する**

必要があります。というか、これだけ守ればOKです。例えば、バッチファイルのあるフォルダに何らかの結果を出力する場合は、こんな感じでバッチファイルが置かれたパスを取得します。

```bat:バッチファイル
@echo off
echo %~dp0
echo hoge> %~dp0hoge.txt
```
```:cmd.exe
'\\server\hoge'
上記の現在のディレクトリで CMD.EXE を開始しました。
UNC パスはサポートされません。Windows ディレクトリを既定で使用します。
\\server\hoge\
```
```:\\server\hoge\hoge.txt
hoge
```
見た目がちょっと不思議な構文なんですが、"%0"は実行ファイル名で、"~d"がドライブ名、"~p"がパス名。その組み合わせ"~dp"で実行ファイル名からパスを取り出すことができます(出力される文字列には終端に"\"が含まれる＆ダブルクォーテーションを含まない)。

これで、変更された先の"C:\Windows"ではなく、ちゃんとバッチファイルのあるサーバのUNCパスが取得できました。あとはファイル名なりサブフォルダ名を付加して実行ファイルを呼んだり、ログファイルやテンポラリファイルにももちろん付けて(C:\Windowsに書き出すのはさすがにまずいので)、いつも通りの処理を行いましょう。

#補足

なお、バッチファイルでのファイルパスに関する詳細の公式ドキュメントはここの"Using batch parameters"に書いてあります。残念ながら日本語版は見つからず。いろんな人が勝手翻訳してるので探してみてください。
https://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/batch.mspx
CocoaPodsのプライベートスペックを作成する

- 個人用のライブラリをCocoaPodsで管理したときのメモ

## 環境
- Cocoapods: 1.3.1
- Xcode: 8.3.3
- Swift: 3.1

## 作成方法
### 1. プライベートスペックの作成
- Bitbucket等にリモートレポジトリを作成 (公開範囲をプライベートにする)
- 作成したスペックレポジトリをCocoaPodsに追加: `pod repo add Spec [リモートレポジトリのURL]` (`Spec`は任意の名前)
- 確認方法: `pod repo lint ~/.cocoapods/repos/Spec`

### 2. ライブラリの作成
- ライブラリを作成 `pod lib create [ライブラリ名]`
- 各種質問に回答

```質問内容
- What language do you want to use?? [ Swift / ObjC ]
- Would you like to include a demo application with your library? [ Yes / No ]
- Which testing frameworks will you use? [ Quick / None ]
- Would you like to do view based testing? [ Yes / No ]
```
- podspecファイルの編集

```.podspec(例)
Pod::Spec.new do |s|
  s.name             = '[ライブラリ名]'
  s.version          = '0.1.0'
  s.summary          = '[ライブラリ概要]'
  s.description      = <<-DESC
[ライブラリ説明]
                       DESC
  s.homepage         = '[ライブラリURL]'
  s.license          = { :type => 'MIT', :file => 'LICENSE' }
  s.author           = { '[名前]' => '[メールアドレス]' }
  s.source           = { :git => '[リモートレポジトリのURL]', :tag => s.version.to_s }
  s.ios.deployment_target = '[対応OSバージョン]'
  s.source_files = '[ライブラリ名]/Classes/**/*'
end
```
- ライブラリの編集
- ライブラリのチェック: `pod lib lint [ライブラリ名].podspec --allow-warnings`（--allow-warningsでワーニングを無視できる）
- Bitbucket等にリモートレポジトリを作成
- タグを付けてリモートにプッシュ

### 3. ライブラリをプライベートスペックに追加
- ライブラリの追加: `pod repo push Spec [ライブラリ名].podspec --allow-warnings`
- 確認方法: `pod spec lint [ライブラリ名].podspec --allow-warnings`

## 使い方
- Podfileでsourceを指定する

```ruby:Podfile
source '[プライベートスペックのURL]' #1で作成したもの
source 'https://github.com/CocoaPods/Specs.git'

target '[プロジェクト名]' do
  use_frameworks!

  pod '[ライブラリ名]'

end

```


## 参考
- [nend SDKをCocoaPodsのPrivate Podsとして管理する](http://parakeety.github.io/2014/06/22/nend-cocoapods-private-pod/)
- [【Swift】CocoaPodsに自作ライブラリを登録](http://qiita.com/taji-taji/items/e23373f9b8124de728a2)
- [CocoaPods Private Specリポジトリの作成と利用方法](http://qiita.com/makoto_kw/items/701b1060a6809fd1bb60)
slackのchannel idを取得する方法

https://api.slack.com/methods/channels.list/test
を使えば良いらしいものの、privateなchannelだと取得できないぽい・・・

と思ったけど、ブラウザでIDが欲しいchannelを開けばすぐ分かりました。

https://{TEAM}.slack.com/messages/{CHANNEL_ID}/

灯台下暗し。

おしまい。
Atom スタイルの設定

Atom エディタで独自のスタイルを設定する方法です。
基本ですが、自作パッケージで済ませていたので真っ当な方法のメモです。

とりあえず、以下の画像のような見た目にしたい。

![スタイル.PNG](https://qiita-image-store.s3.amazonaws.com/0/194349/ffa841a6-e8a3-2c63-3832-1fd1b57d2678.png)

変更したい箇所のcssクラスをDeveloper toolsで調べる。

```html:html
<span class="syntax--markup syntax--heading syntax--heading-1 syntax--gfm">
  <span class="syntax--markup syntax--heading syntax--marker syntax--gfm">#</span>
  <span class="syntax--markup syntax--heading syntax--space syntax--gfm"> </span>
  見出し1
</span>
```

```html:html
<span class="syntax--comment syntax--line syntax--double-slash syntax--cpp">
  <span class="syntax--punctuation syntax--definition syntax--comment syntax--cpp">//</span>
  コメント
</span>
<span class="syntax--comment syntax--block syntax--c">
  <span class="syntax--punctuation syntax--definition syntax--comment syntax--begin syntax--c">/*</span>
  ブロックコメント
  <span class="syntax--punctuation syntax--definition syntax--comment syntax--end syntax--c">*/</span>
</span>
<span class="syntax--string syntax--quoted syntax--double syntax--c">
  <span class="syntax--punctuation syntax--definition syntax--string syntax--begin syntax--c">"</span>
  文字列リテラル
  <span class="syntax--punctuation syntax--definition syntax--string syntax--end syntax--c">"</span>
</span>
```

スタイルシートを開いて(File -> Stylesheet...)、以下のように書き込む。

```css:less
@import "ui-variables";

//atom-text-editorは、必須ではない
atom-text-editor {
  .syntax--gfm.syntax--heading-1 {
    background-color: hsla(0, 60%, 40%, 0.4);
  }

  .syntax--gfm.syntax--heading-2 {
    background-color: hsla(20, 60%, 40%, 0.4);
  }

  .syntax--gfm.syntax--heading-3 {
    background-color: hsla(40, 60%, 40%, 0.4);
  }

  .syntax--gfm.syntax--heading-4 {
    background-color: hsla(60, 60%, 40%, 0.4);
  }

  .syntax--gfm.syntax--heading-5 {
    background-color: hsla(80, 60%, 40%, 0.4);
  }

  .syntax--gfm.syntax--heading-6 {
    background-color: hsla(100, 60%, 40%, 0.4);
  }

  //これだけで良いと思うのだが、"//"などメタ文字自身の文字が変更されない
  .syntax--comment.syntax--line {
    background-color: hsla(120, 50%, 25%, 0.5);
    color: darken(@text-color, 10%);
    font-style: italic;
  }

  //コメントのメタ文字自身
  .syntax--comment.syntax--definition.syntax--punctuation {
    color: darken(@text-color, 10%);
    font-style: italic;
  }

  .syntax--comment.syntax--block {
    background-color: hsla(120, 50%, 25%, 0.5);
    color: darken(@text-color, 10%);
    font-style: italic;
  }

  .syntax--quoted {
    background-color: hsla(320, 30%, 50%, 0.2);
    font-style: italic;
  }
}
```
もっとも簡単なFlaskの作り方

もっとも簡単なFlaskアプリの作り方です。
Webブラウザで http://localhost:3000/hello にアクセスするとjsonファイル（内容は`{'result':'hello world!'}`）の保存ダイアログが表示されます。
※ とある方に「hello worldレベルの説明がほしい」と言われたので

```console:flaskのインストール
pip install flask
```

```python:hello.py
# -*- coding: utf-8 -*-
from flask import Flask, make_response, jsonify

# flask
app = Flask(__name__)

# rest api
@app.route('/hello', methods=['GET'])
def hello_world():
    return make_response(jsonify({'result':'hello world!'}))
    
# main
if __name__ == "__main__":
    app.run(host='localhost', port=3000)
```
Paper > CUDA > OpenMP-CUDA implementation of the moment method and multilevel fast multipole algorithm on multi-GPU computing systems by Jian Guan (2013)

CUDAを用いた電磁波散乱計算の高速化。
https://www.ideals.illinois.edu/handle/2142/44803

GPUを用いた正当進化の研究。

### 対象手法

- MoM: method of moments
    - CUDA版: OpenMP-CUDA-MoM
- MLFMA: multilevel fast multipole algorithm
    - CUDA版: OpenMP-CUDA-MLFMA

### 計算結果

- RCS: radar cross section

### 結果のハイライト

- Figure 4.3 (p25), Figure 4.5 (p26), and Figure 4.6 (p27)
    - CPU版とCUDA版の結果(RCS)の比較
        - 一致している
- Tables 4.1から4.6
    - CPU版とCUDA版の計算効率の比較 (MoM)
        - 30倍以上高速化している
    - EFIE: electric-field integral equation (Eq. 2.1)
    - MFIE: magnetic-field integral equation (Eq. 2.2)
    - CFIE: combined-field integral equation (Eq. 2.5)
- Figure 5.4 (p40), Figure 5.5 (p41), and Figure 5.6 (p42)
    - CPU版とCUDA版の結果(RCS)の比較
       - 一致している
- Figure 5.7 (p43)とFigure 5.8 (p44)
    - unknownsの数と効率化の関係
        - System Matrix Assembly
        - Calculation of Vs and Vf
        - BiCGstab Iterative Solver
- Tables 5.1から5.4 (p46とp47)
    - 以下の項目の計算効率の改善度
        - Calculation of Vs and Vf
        - Calculation of T
        - Assembly of Z_{near}
        - BiCGStab Solution
        - Total Computation
    - 20倍以上になっている
    

計算の中身を熟知している人によるGPU高速化のため、しっかり高速化している印象を受ける。
【メモ】コマンドでのBOMの追加・削除・確認


# BOMの確認
BOM(文字コードの確認)は `file` コマンドでできる

```
$ file hoge.txt
hoge.txt: ASCII text # ← BOMなしUTF8
$ file hoge.txt
hoge.txt: UTF-8 Unicode (with BOM) text # ← BOMありUTF8
```

# BOMの追加・削除

`nkf` でやるのが楽

```
$ nkf --overwrite --oc=UTF-8 hoge.txt # BOMの削除
# hoge.txt: ASCII text
$ nkf --overwrite --oc=UTF-8-BOM hoge.txt # BOMの追加
hoge.txt: UTF-8 Unicode (with BOM) text
```
ArduinoでScheduler

#概要
Arduinoでloop内でdelayを使いたくないので、milisを使う、ライブラリーのSchedulerを使ってみた。

#動画

https://www.youtube.com/watch?v=QHTnlvdoMNU

#サンプルコード


```
#include "Scheduler.h"

Scheduler scheduler = Scheduler();
void state0()
{
	scheduler.schedule(state1, 3000);
}
void state1()
{
	digitalWrite(9, HIGH);
	scheduler.schedule(state2, 4000);
}
void state2()
{
	digitalWrite(9, LOW);
	digitalWrite(11, HIGH);
	scheduler.schedule(state3, 500);
}
void state3()
{
	digitalWrite(11, LOW);
	digitalWrite(9, HIGH);
	scheduler.schedule(state4, 4000);
}
void state4()
{
	digitalWrite(9, LOW);
	digitalWrite(12, HIGH);
	scheduler.schedule(state5, 500);
}
void state5()
{
	digitalWrite(12, LOW);
	digitalWrite(9, HIGH);
	scheduler.schedule(state6, 4000);
}
void state6()
{
	digitalWrite(9, LOW);
}
void setup()
{
	pinMode(9, OUTPUT);
	pinMode(11, OUTPUT);
	pinMode(12, OUTPUT);
	digitalWrite(9, LOW);
	digitalWrite(11, LOW);
	digitalWrite(12, LOW);
	scheduler.schedule(state0, 100);
}
void loop()
{
}



```
【Git】でリポジトリを引き継ぐ方法

## 概要
sourcetreeを使ったGitでリポジトリを引き継ぐ方法です。
アカウントを譲渡してもらうと早いのかもしれませんが、読み取り権限で情報をもらった時に、それを引き継ぐ方法をについて説明します。

## 1.ローカルへデータをクローンする
Sourcetreeからクローンして、ローカルにデータを落とします。

## 2.リポジトリを作る
gitに新しくリポジトリを作ります。

## 3.リモートもパスを変更する
Sourcetreeの「設定」を開き「リモート」タブを開きます。
「追加」をクリックし、新しく作ったリポジトリの環境を入力します。

## 4.旧リモートのパスを削除する
以前からあるリモートのパスを削除します。

## 5.データをプッシュする
データを新リポジトリにプッシュします。

## まとめ
こんな感じでできました。
コマンド使えばもっと簡単だと思います。

## おそらく役立つ情報 
痒いところに手が届くかもしれない記事を書いています。
フォローしてくれるとやる気になります！

- Qiita　プログラミングに関する情報はこちら
http://qiita.com/nadonado


- Twitter　日々のつぶやきはこちら
https://twitter.com/hironado
スクリーンショットでOCR

手軽にOCRできるよう、スクリーンショットからテキスト化してみました。
APIへの実行コードは[Google Cloud Vision APIのOCR（画像認識）を検証する](http://qiita.com/keki/items/e5b82c6b4c28d3f00b72#サンプルプログラム)を利用させていただきました。ありがとうございます。

## 準備
サンプルファイルにAPIキーを設定後、下記コードの**実行ファイル**・**保存フォルダ**のパスをご自身の環境にあわせて書き換えてください。

実行するとキャプチャするアイコンになりますので（shift+command+4と同じ）、テキスト化したいエリアを選択してください。

保存フォルダにキャプチャしたpng画像とテキストファイルが保存されていると思います。

さて、このままスクリプトエディタで実行していては使い勝手がよくないですよね。
Automatorには**AppleScriptを実行**というコマンドが用意されていますのでこれでサービスつくりショートカットを割り当てましょう！



## コード
``` appleScript
on run
	my main()
end run

on main()
	--実行ファイル
	set OCR to quoted form of "/Users/9999/Desktop/GOCR/OCR.php"
	--保存フォルダ
	set saveFolder to "/Users/9999/Desktop/GOCR/"
	
	
	--pngファイル生成
	set {pngName, pngFile} to my capture(saveFolder)
	
	try
		(pngFile as POSIX file) as alias
	on error
		error number -128
	end try

	--テキストパス生成
	set ocrPath to my ocrTxtPath(saveFolder)
	
	--shellコマンド
	set cmd to "php " & OCR & space & quoted form of pngFile & " > " & quoted form of ocrPath
	
	--OCR実行
	set res to do shell script cmd
	
end main

on capture(saveFolder)
	set ssName to "ss_" & (do shell script "date +%Y%m%d_%H%M%S") & ".png"
	
	set savePath to saveFolder & ssName
	
	set cmd to "screencapture -r -x -t png -s -o " & quoted form of savePath
	do shell script cmd
	
	return {ssName, savePath}
	
end capture


on ocrTxtPath(saveFolder)
	tell application "Finder"
		set DateTime to do shell script "date +%Y%m%d_%H%M%S"
		set ocrPath to saveFolder & "OCR_" & DateTime & ".txt"
	end tell
	return ocrPath
end ocrTxtPath


on Delimiters(theText, serchStr, replaceStr)
	set OriginalDelimiters to AppleScript's text item delimiters
	set AppleScript's text item delimiters to serchStr
	set theText to text items of theText
	set AppleScript's text item delimiters to replaceStr
	set theText to theText as string
	set AppleScript's text item delimiters to OriginalDelimiters
	return theText
end Delimiters

```
hanamiを試してみた

# 概要

- [HanamiはRubyの救世主(メシア)となるか、愚かな星と散るのか](http://magazine.rubyist.net/?0056-hanami)
    - [DDD(Domain-driven design)](https://www.amazon.co.jp/dp/B00GRKD6XU)ベース
- http://hanamirb.org/
    - Hanami is a modern web framework for Ruby.
- [RubyKaigi 2017](http://rubykaigi.org/2017/)
    - http://rubykaigi.org/2017/presentations/anton_davydov.html
- [Getting Started](http://hanamirb.org/guides/getting-started/)を試してみました。

# 前提

- macOS Sierra 10.12.5
- Ruby 2.4.1

# hanamiインストール
```
$ mkdir sample_hanami
$ cd sample_hanami
$ bundle init
$ vim Gemfile
+ gem 'hanami'
$ bundle install --path vendor/bundle
```

# hanamiプロジェクト作成
```
$ bundle exec hanami new . --database=mysql
$ bundle install --path vendor/bundle
```

# hanamiサーバー起動
```
$ bundle exec hanami server
```

# ブラウザ起動
```
$ open http://localhost:2300
```

<img width="740" alt="スクリーンショット 2017-08-28 14.49.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/140713/9babc05c-c5f8-fc09-33e7-377129b71dfd.png">

# 続き

```
# Action生成
$ bundle exec hanami generate action web books#index
$ bundle exec hanami generate action web books#new
$ bundle exec hanami generate action web books#create

# Model生成
$ bundle exec hanami generate model book

# DB Migrate (migrationsファイルを編集し、必要なカラムを追加する)
$ bundle exec hanami db prepare
```

# サンプルソースコード

- https://github.com/mediba-moritake/sample-hanami