OmniAICreator/Qiita-1.07M huggingface dataset:
【Rails】【websocket】websocket-railsでsession開始時のheader情報を取る

[websocket-rails](https://github.com/websocket-rails/websocket-rails)でheaderを取る時のメモ。

# Controller

```
class SampleController < WebsocketRails::BaseController

  def initialize_session
    // request(ActionDispatch::Request)を使う
    content_type = request.headers["HTTP_CONNECTION"]
    cookie = request.headers["HTTP_COOKIE"]
  end

end
```

# Javascript
```
var dispatcher = new WebSocketRails("localhost:3000/websocket");

dispatcher.bind('test', function(data) {
  console.log('test');
}); // => bindしてはじめてinitialize_sessionが呼ばれる
```

javascript側でHeaderを変えれないのが難点
Herokuの再起動、ストップ

## Herokuの再起動
```bash
# herokuのソースを管理してるディレクトリで
$ heroku restart
```

## Herokuのストップ
どうもなさそうだった。ので、すべてのhttpプロセスを止めるらしい。

```bash
$ heroku ps:scale web=0
# 再びスタートするときは↓
$ heroku ps:scale web=1
```

参考リンク：
[How to stop an app on Heroku?](http://stackoverflow.com/questions/2811453/how-to-stop-an-app-on-heroku)
RAID構成の調べ方

今回は、MegaCliを使ったRAID構成の調べ方について紹介します。
MegaCliはディスクが壊れた場合の状態確認であったり、スロットのLEDを点灯など・・・**ディスクの状況**を確認する際によく利用するコマンドです。

以前、「ディスクI/Oが遅いから、RAID構成を確認してほしい」と依頼を受けた時、MegaCliの**実行結果**の読み方に困ったのでそのまとめです。


# MegaCliのインストール
* MegaCliがインストールされていなかったら、インストールしましょう。
  * MegaCLIの各OS向けの公式バイナリはLSI社(現在Avago Technologies)からダウンロードできます。
http://docs.avagotech.com/docs-and-downloads/raid-controllers/raid-controllers-common-files/8-07-14_MegaCLI.zip

今回は、OSがCentOSなのでCentOS版をインストールします。

```sh:MegaCliをインストール
$ sudo yum install -y https://ginernet.com/downloads/MegaCli-8.07.14-1.noarch.rpm
```

# 仮想ディスク情報の確認
* 以下のコマンドで、仮想ディスクの情報を確認します。

```sh:仮想ディスク情報を確認
$ sudo /opt/MegaRAID/MegaCli/MegaCli64 -LDInfo -LALL -aAll
```

```sh:実行結果
Adapter 0 -- Virtual Drive Information:
Virtual Disk: 0 (Target Id: 0)
Name:
RAID Level: Primary-5, Secondary-0, RAID Level Qualifier-3   ←大事
Size:556.929 GB
State: Optimal
Stripe Size: 64 KB
Number Of Drives:3
Span Depth:1　　　　　　　　　　　　　　　　　　　　　　　　　　　←大事
Default Cache Policy: WriteBack, ReadAheadNone, Direct, No Write Cache if Bad BBU
Current Cache Policy: WriteBack, ReadAheadNone, Direct, No Write Cache if Bad BBU
Access Policy: Read/Write
Disk Cache Policy: Disk's Default
Encryption Type: None
```

* この実行結果を確認する上で重要なのは、`RAID Level`だけでなく、`Span Depth`も判断材料となります。
  
# 実行結果の見方
* 各RAIDの関係と、対応する`RAID Level`・`Span Depth`の構成を以下の表にまとめてみました。

| RAIDの種類       | RAID Level |    Span Depth   |
|:----------------|:-----------|:---------------:|
| RAID 0          | Primary-0   |       -        |
| RAID 1          | Primary-1   |       1        |
| RAID 5          | Primary-5   |       -        |
| RAID 6          | Primary-6   |       -        |
| RAID 10         | Primary-1  |       2        |

この表を元に先ほどの実行結果を見ると、`RAID Level: Primary-5`となっているので、このマシンは **RAID 5** 構成だということがわかります。
特に、**RAID1とRAID10は `RAID Level` だけでなく、`Span Depth` を確認する必要がある**ので、気をつけましょう。

# まとめ
MegaCliコマンドを使ったRAID構成の見方についてまとめました。
RAIDを調べた時、「**こんなにI/O遅いけど、本当にRAID10なの？**」と依頼者から言われたのがきっかけでした。
今まで、日本語でまとまった記事もなく、`RAID Level`だけ見ていた方も多かったのではないでしょうか・・・（私もそうでした）
この記事を参考に、正しいRAID構成を把握しましょう！！
Python C/C++ 拡張: データの一部を np.array として Python に渡す (stride を設定)


C/C++ のデータを np.array として Python から見る。

```c
typedef struct Particle {
  float x[3], v[3];
} Particle;

const int np=10;
Particle* const p= calloc(sizeof(Particle), np);

for(int i=0; i<np; ++i) {
  p[i].x[0]= (float) i + 1;
}
```

これを np.array として Python に渡したい場合は `PyArray_SimpleNewFromData` 関数を使えば良い。[^1]

しかし、ここでは、データの一部、`x[3]` だけを np.array としてPythonに渡す方法を紹介する。データ構造が複数の型を含んでいて、全てをひとつの np.array にできない場合などもあるでしょう。

このようにデータがメモリに連続して存在しないけれど、一定間隔で並んでいる場合は `strides` を設定すればよい。[^2]

```c
PyObject* PyArray_New(PyTypeObject* subtype, int nd, npy_intp* dims, 
			           int type_num, npy_intp* strides, void* data, 
			           int itemsize, int flags, PyObject* obj);
```

`strides[]` とは `a` を np.array とするとき、`strides[0]` が `a[i,j]` と `a[i+1,j]` のバイト差、`strides[1]` が `a[i,j]` と `a[i,j+1]` のバイト差。


```c
static PyObject* py_as_nparray(PyObject *self, PyObject *args)
{
  const int nd=2;
  const int ncol= 3;
  npy_intp dims[]= {np, ncol};
  npy_intp strides[]= {sizeof(Particle), sizeof(float)};

  return PyArray_New(&PyArray_Type, nd, dims, NPY_FLOAT, strides, p->x, 0, 0, 0);
}
```

## Python から使った結果
```python
import numpy as np
import cext08

a = cext08.as_nparray()

[[  1.   0.   0.]
 [  2.   0.   0.]
 [  3.   0.   0.]
 [  4.   0.   0.]
 ...
```

＊ 実際に使うときは Particle* p のメモリは Python で使っている間は解放されず、解放する場合は C のほうでなんとかするとします。

## コード全体は github にあります

https://github.com/junkoda/python_c_ext/tree/master/08_nparray_stride




[^1]: http://qiita.com/junkoda/items/17df11d7a20dc9d50e7d

[^2]: Array API http://docs.scipy.org/doc/numpy-1.10.1/reference/c-api.array.html#array-structure-and-data-access
【論文シリーズ】焼きなまし遷移について

## 原文
[焼きなまし遷移を利用したマルコフ確率場における学習 (Learning in Markov random fields using tempered transitions)](http://goo.gl/Elhf56)
Ruslan Salakhutdinov (2009)


## 1. 要約／背景
* **焼きなまし遷移**(tempered transition)とは、ギブスサンプリングの遷移則を表す。
* 焼きなまし遷移の利用で、サンプル間の依存性を下げることができる。
* 結果として、サンプル間の独立性を前提としたMCMC近似を使いやすくなり、効果的な計算手法を得られる。


## 2. 骨子の理論
(1)焼きなまし遷移
2データ$x, x'$間のギブスサンプリングにおいて、次の関係が成り立つ。
$$p_s({\bf x})T_s({\bf x'}\leftarrow {\bf x}) = \tilde T_s({\bf x}\leftarrow {\bf x'})p_s({\bf x'}) $$ 


この遷移行列${\bf T}$を抜き出し、$N$個目のサンプリングで利用する。

(2)対数尤度の近似
一般に、ボルツマンマシンにおいて、対数尤度（勾配）は以下の式から導かれる。

```math
\frac{\partial \log p({\bf x}_0 ; \theta)}{\partial \theta} = \phi ({\bf x}_0) - {\bf E}_{p({\bf x}_0 ; \theta)}[\phi({\bf x})]
```

(1)により、サンプリングデータ間の依存性が小さくなると、下のように尤度を直積の形で近似計算することができる。

```math
P_{PL}({\bf x}_0 ; \theta) = \prod_{k=1}^{K}p(x_k | {\bf x}_{0,-k};\theta)
```
(PLはPseudo-Likelihoodの略)
$p(x_k|{\bf x}_k)≒p(x_k)$という近似が成り立つ。




## 3. モデル適用例
MNISTサンプルに対する対数尤度を比べる。
本手法での対数尤度が-87.12だったが、これは、従来の-85.91と近しい結果であり、本手法の有効性が示唆される結果となる。
struct-archiverを使って構造体をNSDataに変換する


# struct-archiverって何？

Swift向けの構造体とNSDataを相互変換するステキライブラリです。構造体を含む配列も容易に変換することができ、データの送受信や記録などに便利です。

- [SwiftでStructとNSDataを相互変換するライブラリを作りました](http://timers-tech.hatenablog.com/entry/2016/05/27/190439)


# 構造体の定義

`CustomArchivable` を継承？した構造体を定義する。

```swift
struct SomeStruct: CustomArchivable {
    var id: String
    var name: String

	// `restoreProcedure` を記述して構造体を返す必要がある
    public static var restoreProcedure: ArchiveRestoreProcedure {
        return {
            (dictionary: ArchivableDictionary) in

			// 復元時に辞書が渡ってくるので値を取得して構造体を返すように
            if let id = dictionary["id"] as? String, let name = dictionary["name"] as? String {
                return NearbyTelemetrySessionStruct(id: id, name: name)
            }
            return NearbyTelemetrySessionStruct(id: "", name: "")
        }
    }
}
```


# struct-archiverの初期化

`AppDelegate` 内で `SomeStruct` をstruct-archiverで取り扱えるようにする。

```swift
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject:AnyObject]?) -> Bool {
	StructArchiver.activateStandardArchivables(withCustomStructActivations: {
		// struct-archiverを使う構造体を列挙
		SomeStruct.activateArchive()
	})

	return true
}
```


# ArrayとNSDataの相互変換

## NSDataにする

```swift
let a = SomeStruct(id: "a", name: "a")
let b = SomeStruct(id: "b", name: "b")
let c = SomeStruct(id: "c", name: "c")

// 配列の場合は **Archivables型として扱う**
let array: Archivables = [a, b, c]

let data = array.archivedData
```


## Arrayにする

```swift
let array = StructArchiver.unarchive(data: data)
```
Kotlin + JUnit + Hamcrestの `is` が可愛くない

みなさん[Kotlin]使ってますか？
ことりん良いですよね、可愛いですよね。

最近、Androidアプリ開発で使っていて気に入っているのですが、一つ残念なことがあります。
[JUnit] + [Hamcrest]のassertが可愛くないのです。

```kotlin
assertThat(1 + 1, `is`(2))
```

isが予約語になっているせいで、``で括らないといけません。
これは酷い・・・。

[Hamcrest]を捨てて[AssertJ](https://joel-costigliola.github.io/assertj/)を使えば、可愛いことりんが帰ってきます。

```kotlin
assertThat(1 + 1).isEqualTo(2)
```

[Kotlin]云々を抜きにしても、[AssertJ]を使うとIDEの補完が効いてくれるので捗ります。

あと、[AssertJ]のSoftAssertionsを使うと、値の検証結果がNGでも他の検証を続行してくれるので便利です。
他にも色々と便利な機能がありますので、Javaな方々にもお勧めです。

```kotlin
SoftAssertions().apply {
    assertThat(1 + 1).isEqualTo(1)
    assertThat(1 + 1).isEqualTo(2)
    assertThat(1 + 1).isEqualTo(3)
}.assertAll()
```

[Kotlin]:https://kotlinlang.org/
[Hamcrest]:http://hamcrest.org/
[JUnit]:http://junit.org/junit4/
[AssertJ]:https://joel-costigliola.github.io/assertj/
自分用rubyメモ ブロック付きメソッドについて

# ブロック変数を渡してメソッドを実行

```rb:block_method.rb
def total(from, to)
  total = 0
  from.upto(to) do |i| # from ~ toの間処理を行う
    if block_given? # メソッドにブロックが付いるかどうか
      total += yield(i) # ブロックで処理した値を加算する
    else
      total += i # そのままnumを加算する。
    end
  end
  total
end

p total(1,10) # 1~10をそのまま加算
p total(1,10){|num| num ** 2} # 1~10の2乗を加算
```
```text:result
55
385
```
* ``yield()``は、通常のメソッドの様に複数の値を渡す事も出来る。
* その場合、以下の様な書き方になる。``|*num|``等も使用可能。

```rb:block_method.rb
# 省略
yield(a,b,c)
# 省略
p total(1,10){|numa,numb,numc| 省略}
```

## **yield**を使わない書き方としては以下がある

```rb:block_method2.rb
def total2(from, to, &block) # yieldじゃないやり方。&変数の事をProc引数と呼ぶ。引数の一番最後にしか記述できない。
  total = 0
  from.upto(to) do |num|
    if block
      total += block.call(num)  # callメソッドを使うとブロックを呼び出せる
    else
      total += num
    end
  end
  total
end

p total2(1,10){|num| num ** 2}

block = Proc.new do |num|
  num ** 2
end

p total2(1,10,&block) # ブロック変数を渡す事も可能！(使いまわせる！)
```

# まとめ
* RubyはとことんDRYな書き方が出来るようになっているんだなと感じた。
* どんどん使い回ししていこう。
Webmin 1.791でエラー「Wide character in syswrite at /usr/libexec/webmin/miniserv.pl line 3071.」を回避

webminのトップページを開くと、HTMLの出力途中でエラーが発生し
後続の表示がされなくなってしまった。

```html:トップページのエラー表示
    HTTP/1.0 500 Perl execution failed
Server: MiniServ/1.791
Date: Thu, 16 Jun 2016 10:41:17 GMT
Content-type: text/html; Charset=iso-8859-1
Connection: close

<h1>Error - Perl execution failed</h1>
<pre>Wide character in syswrite at /usr/libexec/webmin/miniserv.pl line 3071.
</pre>
```

該当箇所にエンコード処理を追加する事でとりあえず回避できた。

ファイルの最初の方でEncodeの使用を宣言しておいて、

```pl:miniserve.pl
use Encode;
```

syswriteする箇所を、utf8の場合のみエンコードする様に修正。

```pl:miniserve.pl
    if(utf8::is_utf8($str)) {
        syswrite(SOCK, encode('utf-8', $str), length(encode('utf-8', $str)));
    } else {
        syswrite(SOCK, $str, length($str));
    }
```

修正後にwebminを再起動して反映。

```bash:再起動
/etc/init.d/webmin restart
```

これでとりあえず動くようになった。

環境は
CentOS Linux 7.2.1511
Webmin 1.791

より新しいバージョンで直っているかどうかは未確認。
Cordova Android Crosswalk WebView Build Setting ハイブリッドアプリ

Crosswalk Pluginをインストールしたら、デフォルトのWebViewを使わず、crosswalk webview使うになる。

* 利点
 * ウェブ新機能を利用できる ...

* 欠点
 * より多いメモリ使用　30MB
 * APK　サイズ増える 20MB ...
 
## Install

```
cordova plugin add cordova-plugin-crosswalk-webview
```
## Build Setting

platform/android/build.gradle　編集

```
ext.cdvBuildMultipleApks = false // 40MB大きくなるけど、一つAPK生成できる。true　にすると、二つAPKになる
...

android {
    dexOptions {
        javaMaxHeapSize "4g"　　
    }
    ...
   defaultConfig {
     ...
     multiDexEnabled true
   }
   
   lintOptions {
      checkReleaseBuilds false // cdvBuildMultipleApks=trueの場合、release APK作成ため
      ...
   } 

dependencies {
    ...
    compile 'com.android.support:multidex:1.0.0'
}
```

platform/android/AndroidManifest.xml 編集

`<application android:hardwareAccelerated="true"...>
`タグに属性追加
`android:name="android.support.multidex.MultiDexApplication"`


## 参考
 - GitHub: https://github.com/crosswalk-project/cordova-plugin-crosswalk-webview
 - https://crosswalk-project.org/documentation/android.html
 - http://stackoverflow.com/questions/15209831/unable-to-execute-dex-method-id-not-in-0-0xffff-65536
 - https://developer.android.com/google/play/publishing/multiple-apks.html
 - http://stackoverflow.com/questions/30345879/error-when-running-cordova-build-release-android
 - http://stackoverflow.com/questions/32535551/building-combined-armv7-x86-apk-after-crosswalk-integration-in-an-ionic-project
Digdagでruby/python間で変数を渡す

TreasureDataの新しいOSSの[Digdag](https://github.com/treasure-data/digdag)が先日パブリックリポジトリになりました。

今度、[ゲームサーバ勉強会](http://eventdots.jp/event/590582)で初心者向けのデモとかをしようと思ったので、簡単なサンプルを紹介します。

DigdagはOperatorを利用することで様々な処理を簡単に呼べるようになっています。
http://www.digdag.io/operators.html

まだ、TreasureData向けのものがまだ多いのですが、このOperatorが増えると、分析エンジンとの連携が容易になるかと思います。作り方はそのうちドキュメント化されるのではないかと思います。

さて、今回の紹介では、CSVファイルをEmbulkでPostgreSQLにロードし、Rubyで集計し、その結果をPythonに渡して、Slack通知するというワークフローです。

![](https://i.gyazo.com/2c9be424da1229d46d5cf73d0a861269.png)

# ワークフローの内容

下記がワークフロー全体です。

`_export`ではワークフロー全体に対するパラメータを設定します。Rubyノスクリプトを使う場合にはここでrequireする必要があるみたいです。

`+~`の~の部分は任意の名前を付与できます。その下にオペレータとして、embulkやrubyやpythonを利用しています。

```mydag.dig
timezone: UTC

_export:
  rb:
    require: 'tasks/myworkflow'

+dataload:
  embulk>: demo/config.yml

+pg_calc:
  rb>: MyWorkflow.pg_calc

+slack:
  py>: tasks.MyWorkflow.slack
```

RubyではスクリプトではMyWorkflowというクラスにpg_calcというメソッドを定義しています。
またそこではローカルのPostgreSQLに対してクエリを投げて、その結果を`Digdag.env.store`に対して値を代入しています。
`Digdag.env.store`を利用することでDigdagのワークフロー全体に対して変数を受け渡すことができます。

```myworkflow.rb
class MyWorkflow
  require "pg"

  def pg_calc
    conn = PGconn.connect('localhost',5432,'','','postgres','takahashi','')
    q    = "select count(1) as cnt from test"
    begin
      result  = conn.exec(q)
      Digdag.env.store(query_result: result[0]['cnt'])
    ensure
      conn.finish
    end
  end
end
```

Pythonのスクリプトでは、slackというメソッドの引数にRubyで利用した`query_result`を引数として受け渡しています。
これにより、RubyからPythonに対して変数が渡されて、SlackにCOUNTした値が通知されます。

```__init__.py
class MyWorkflow(object):
    def __init__(self):
        pass

    def slack(self, session_time = None, query_result='0'):
        import requests
        import json
        requests.post('https://hooks.slack.com/services/XXXx/XXXX/XXXXX', data = json.dumps({
          'text': "レコード件数は{result}件です".format(result=query_result),
          'username': u'digdag',
          'icon_emoji': u':ghost:',
          'link_names': 1,
        }))

```

# ワークフローの実行

設定したワークフローを元に下記をを実行すると処理が開始され、最終的にはSlackに通知が行われます。

```
$digdag run mydag.dig
```

![](https://i.gyazo.com/86d97d8b0d71fc190c96813aeff0e5f2.png)

また、Digdagでは一度成功したタスクについては、digdag runを行っても処理はスキップされます（session_timeを設定している場合は異なる）。
そのため、再実行するときは、`digdag run mydag.dig --rerun`を行います。

簡単ですが、変数の受け渡し方法について説明しました。
詳細は下記を参照してみてください。
http://www.digdag.io/ruby_api.html
めざせNode.jsライブラリマスター （13）wifi-triangulate

#【ライブラリ説明】
　wifiを使って自分の位置がわかる

#【プログラム】
```js:wifi-triangulate.js
var triangulate = require('wifi-triangulate')

triangulate(function (err, location) {
  if (err) throw err
  console.log(location)
})
```

#【参考サイト】
　[npm](https://www.npmjs.com/package/wifi-triangulate)
　[github](https://github.com/watson/wifi-triangulate)
【WordPress】プラグインを自作（カスタム投稿タイプ作成）

#【WordPress】プラグインを自作（カスタム投稿タイプ作成）

***カスタム投稿タイプを作成するプラグインを自作してみる。***

・プラグインを作成する場合は、〜/wp-content/pluginsに、自作プラグイン用のディレクトリを作成する。
例：〜/wp-content/plugins/my_plugin/my_plugin.php
my_plugin.phpにフックを追加し、カスタム投稿タイプを作成する。

```lang:my_plugin.php
<?php
//ヘッダー：プラグインであることの宣言。以下を記述することでプラグインとして認識される。
/**
 * @package    WordPress
 * @subpackage my_plugin
 * @author     m_maruyama <m_maruyama@sample.jp>
 *
 *
 * Plugin Name: my_plugin
 * Plugin URI:  https://my_plugin
 * Text Domain: my_plugin
 * Description: 説明を書く
 * Author:      m_maruyama
 * Author URI:  http://m_maruyama
 * Version:     0.0.1
 * License:     GPLv3+
 */

//======================================================================
// カスタム投稿タイプを自作
//======================================================================
function self_made_post_type() {
	register_post_type( 'self_made',
		array(
			'label' => '自作', //表示名
			'public'        => true, //公開状態
			'exclude_from_search' => false, //検索対象に含めるか
			'show_ui' => true, //管理画面に表示するか
			'show_in_menu' => true, //管理画面のメニューに表示するか
			'menu_position' => 5, //管理メニューの表示位置を指定
			'hierarchical' => true, //階層構造を持たせるか
			'has_archive'   => true, //この投稿タイプのアーカイブを作成するか
			'supports' => array(
				'title',
				'editor',
				'comments',
				'excerpt',
				'thumbnail',
				'custom-fields',
				'post-formats',
				'page-attributes',
				'trackbacks',
				'revisions',
				'author'
			), //編集画面で使用するフィールド
		)
	);
}
add_action( 'init', 'self_made_post_type', 1 );
```
プラグインとして宣言しているヘッダーの詳しい内容は、[Codexのこちら](https://wpdocs.osdn.jp/%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3%E3%81%AE%E4%BD%9C%E6%88%90#.E3.83.95.E3.82.A1.E3.82.A4.E3.83.AB.E3.83.BB.E3.83.98.E3.83.83.E3.83.80.E3.83.BC)を参照してください。

・管理画面のプラグインメニューを見ると自作したプラグインmy_pluginが作成されています。
![my.png](https://qiita-image-store.s3.amazonaws.com/0/97158/4afbb94a-e23c-2dac-8457-fb00164a5aa8.png)
こちらのプラグインの有効化というリンクをクリックします。

・プラグインを有効化すると、
<img width="494" alt="after.png" src="https://qiita-image-store.s3.amazonaws.com/0/97158/bd4c3fde-98c1-6c1a-fb1c-b922e06b3df6.png">
管理メニューに「自作」というメニューが追加されています！


・自作投稿画面
![after_post (1).png](https://qiita-image-store.s3.amazonaws.com/0/97158/0eeba318-a082-4eb7-9bdb-fe6cf8a1d7cc.png)

「抜粋」や「カスタムフィールド」など、[register_post_type](http://wpdocs.m.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/register_post_type)の第二引数のキー、「supports」に設定したフィールドが表示されています。


といった感じでプラグインの自作ができました。
【Java】JUnitのテストを継承を使って共通化する

テストケースの継承、やってみたらできました。

これで、
* 前提条件を変えても同じテスト郡をパスする
* 実装は結構異なるけども同じテストをパスする
とかそういうのをコピペせずに書けます。

```java
import static org.assertj.core.api.Assertions.*;

import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.experimental.runners.Enclosed;
import org.junit.runner.RunWith;

@RunWith(Enclosed.class)
public class TestSample {

	@Ignore
	public static class Template {
		@BeforeClass
		public static void _beforeClass() {
			// 共通の前処理
		}

		@AfterClass
		public static void _afterClass() {
			// 共通の後処理
		}

		@Before
		public void _setup() {
			// 共通の前処理
		}

		@After
		public void tearDown() {
			// 共通の後処理
		}

		@Test
		public void test1() {
			assertThat(1).isEqualTo(1);
		}

		@Test
		public void test2() {
			assertThat(1).isEqualTo(1);
		}
	}

	public static class TestA extends Template {
		@Before
		public void setup() {
			// 固有の前処理
		}
	}

	public static class TestB extends Template {
		@Before
		public void setup() {
			// 固有の前処理
		}
		
		@Test
		public void test3() {
			// 特別なテストケース
		}
	}
}
```
CodeIQ「『マイナー・ゲーム』問題」に挑戦しました。

[CodeIQ「『マイナー・ゲーム』問題」](https://codeiq.jp/q/2837)の掲載期間が終わったということで、自分の提出コードを公開しておきます。なお詳しい問題の概要や解法は広大なWebの海にあると思うので、見つけ出してください~~(実はわたしも詳しい問題の中身を覚えていないというのは内緒)~~。またほかの方が公開されたコードが[Togetter](http://togetter.com/li/982368)にまとまられておりますので、そちらのほうもぜひ。

```py
# m個からn個を選ぶ組み合わせを返す
c_memo = {}
def C(m, n):
    if (m, n) in c_memo: return c_memo[(m, n)]

    c_memo[(m, n)] = 1 if m == n or n == 0 else C(m - 1, n - 1) + C(m - 1, n)
    return c_memo[(m, n)]

# 少数決によってx人からy人になる確率
# cf. x人からy人になる確率 = (2 * C(x, y)) / (2 ** x)
g_memo = {}
def G(x, y):
    if (x, y) in g_memo: return g_memo[(x, y)]

    if x == y:
        if x % 2 == 0: # ex. G(4, 4): 4人から4人になる確率 + 引き分ける確率
            g_memo[(x, y)] = (2 * C(x, y)) / (2 ** x) + (C(x, y // 2)) / (2 ** x)
        else:
            g_memo[(x, y)] = (2 * C(x, y)) / (2 ** x)
    else:
        if x - y <= y: # ex. G(4, 3): 4人から3人になることはない
            g_memo[(x, y)] = 0
        else:
            g_memo[(x, y)] = (2 * C(x, y)) / (2 ** x)

    return g_memo[(x, y)]

# 問題文中のF(n)
def F(n):
    exps = [-1, 0]
    game = 1

    pros = [0 for _ in range(n + 1)]
    pros[n] = 1

    while exps[-2] != exps[-1]: # 期待値の変化が見られなくなるまでループ
        new_pros = [0 for _ in range(n + 1)]
        for x in (*range(3, n // 2 + 1), n):
            for y in range(1, x + 1): new_pros[y] += pros[x] * G(x, y)

        exps.append(exps[-1] + game * (new_pros[1] + new_pros[2]))
        pros = new_pros
        game += 1

    return int(exps[-1] * (10 ** 6))


if __name__ == '__main__':
    n = int(input())
    print(F(n))

    """
    n = 7のとき、ゲームが進むにつれて、考えられる人数は次のように推移していく

    start  1回目   2回目  3回目
　　*****************************
     7人    1人     1人    1人
            2人     2人    2人
            3人     3人    3人
            7人     7人    7人
    """

```

たとえば7人で一連のゲームを始めるとします。まず1回目の少数決の結果、残る人数は1人・2人・3人・7人のどれかに決まります。1人と2人の場合、ルール上ゲームが終わってしまうので、2回目の少数決の対象になるのは3人もしくは7人の場合です。

3人で少数決を行うと、残る人数は1人もしくは3人です。7人の場合は言うまでもなく、1人・2人・3人・7人のどれかです。つまり7人で始めたゲームについて、2回の少数決を行ったとき、残る人数の組み合わせは1人・2人・3人・7人に決まります。

わたしの解法は以上のような手続き(?)を模したものといえます。___つまり少数決を1回1回進めながら、残った人数について確率を求め、それをもとに期待値を計算しているのです。___あるいは少数決の回数を重ねながら、期待値を正解に近づけていく解き方と言い換えることができるかもしれません。

この解法の問題は「終わりがない」ということ。少数決の回数はいくらでも増やすことができるので、どこかのタイミングでゲームを中断してやる必要があります。そこで今回は___期待値に変動がなくなった時点で、十分正解に近づいたと判断し、ゲームを中断することにしました。___

*** 

1. 疲れた身体で書いているせいか、解法の説明がポエムみたいになっています(´・ω・`)
2. これを解いていた当時は再帰に凝っていたらしく、コード全体が(メモ化)再帰まみれ(´・ω・`)
3. 社会人になって3か月も経ってないのに、もうつらい(´・ω・`)
[Java]リスト内のシャッフル

みなさんはいくつかある値をランダムにシャッフルしたいときにどのように行っていますか。

短いステップでシャッフルする方法があったので紹介致します。

***Collectionsクラスのshuffleメソッド***を使った方法です。

```Shuffle.java
import java.util.ArrayList;
import java.util.Collections;

public class Shuffle {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<String>();
        // リストに値を追加
        list.add("Red");
        list.add("Green");
        list.add("Blue");

        System.out.println("---シャッフル前---");
		
        for (String color : list) {
            System.out.println(color);
        }
	
        // リスト内の値をシャッフルする	
        Collections.shuffle(list);
		
        System.out.println("---シャッフル後---");
		
        for (String color : list) {
            System.out.println(color);
        }
		
    }

}
```


```実行結果
---シャッフル前---
Red
Green
Blue
---シャッフル後---
Blue
Red
Green
```

他にシャッフルする方法があればご意見頂けるとありがたいです。

以上です。
Pythonでシェルコマンドの実行結果をリストで渡す方法

# はじめに
Pythonでシェルコマンドを扱いたい場合には、一般的に`subprocess`モジュールを使う。モジュール内の`stdout.readlines()`を使うとリストとして結果を渡すことが可能であるが、実行するシェルコマンドが複数行に渡る場合、改行コード(ラインフィード)が一緒に渡ってしまう。そこで改行コード(ラインフィード)を取り除いた状態でリストを渡すには以下のように処理すればよい。

ここではシェルコマンドとして、`ls -l`をPythonから実行する例を使って解説する。

今回、以下の３通りに沿って3つスクリプトを作成した。

* シェルの実行結果と同じものを取得する場合(res_cmd.py)
* ラインフィードありのリストを取得する場合(res_cmd_lfeed.py)
* ラインフィードなしのリストを取得する場合(res_cmd_no_lfeed.py)

実際に、`ls -l`を実行した場合の結果サンプルは以下の通りであるとする。

```shell-session
$ ls -l
total 12
-rwxr-xr-x 1 root root 260 Jun 16 18:48 res_cmd_lfeed.py
-rwxr-xr-x 1 root root 378 Jun 16 18:49 res_cmd_no_lfeed.py
-rwxr-xr-x 1 root root 247 Jun 16 18:48 res_cmd.py
```

# シェルの実行結果と同じものを取得する場合
`communicate()`の1つ目の配列要素を取得すれば良い。

```python:res_cmd.py
#!/usr/bin/python

import subprocess

def res_cmd(cmd):
  return subprocess.Popen(
      cmd, stdout=subprocess.PIPE,
      shell=True).communicate()[0]

def main():
  cmd = ("ls -l")
  print(res_cmd(cmd))

if __name__ == '__main__':
  main()
```

以下の通り、スクリプトの実行結果は`ls -l`を実行した場合と同じである。

```shell-session
$ ./res_cmd.py
total 12
-rwxr-xr-x 1 root root 260 Jun 16 18:48 res_cmd_lfeed.py
-rwxr-xr-x 1 root root 378 Jun 16 18:49 res_cmd_no_lfeed.py
-rwxr-xr-x 1 root root 247 Jun 16 18:48 res_cmd.py
```

# ラインフィードありのリストを取得する場合
`stdout.readlines()`を使う。

```python:res_cmd_lfeed.py
#!/usr/bin/python

import subprocess

def res_cmd_lfeed(cmd):
  return subprocess.Popen(
      cmd, stdout=subprocess.PIPE,
      shell=True).stdout.readlines()

def main():
  cmd = ("ls -l")
  print(res_cmd_lfeed(cmd))

if __name__ == '__main__':
  main()
```

ラインフィードが含まれた結果のリストが取得できる。

```shell-session
$ ./res_cmd_lfeed.py
['total 12\n', '-rwxr-xr-x 1 root root 261 Jun 16 18:52 res_cmd_lfeed.py\n', '-rwxr-xr-x 1 root root 380 Jun 16 18:52 res_cmd_no_lfeed.py\n', '-rwxr-xr-x 1 root root 248 Jun 16 18:51 res_cmd.py\n']
```

# ラインフィードなしのリストを取得する場合
`stdout.readlines()`を使い、かつ、リスト内包表記で`rstrip("\n")`を使う。

```python:res_cmd_no_lfeed.py
#!/usr/bin/python

import subprocess

def res_cmd_lfeed(cmd):
  return subprocess.Popen(
      cmd, stdout=subprocess.PIPE,
      shell=True).stdout.readlines()

def res_cmd_no_lfeed(cmd):
  return [str(x).rstrip("\n") for x in res_cmd_lfeed(cmd)]

def main():
  cmd = ("ls -l")
  print(res_cmd_no_lfeed(cmd))

if __name__ == '__main__':
  main()
```

ラインフィードを除いた結果のリストが取得できる。

```shell-session
$ ./res_cmd_no_lfeed.py
['total 12', '-rwxr-xr-x 1 root root 261 Jun 16 18:52 res_cmd_lfeed.py', '-rwxr-xr-x 1 root root 380 Jun 16 18:52 res_cmd_no_lfeed.py', '-rwxr-xr-x 1 root root 248 Jun 16 18:51 res_cmd.py']
```
WebLogic起動時にユーザ名とパスワードを聞かれなくなる方法

WebLogic起動するたびにユーザ名とパスワードを聞いてきて煩わしかったので
回避したメモ。


1. securityフォルダを作成

    ```
    $ mkdir $DOMAIN_HOME/servers/AdminServer/security
    ```

2. boot.propertiesを作成

    ```boot.properties
    username=weblogic
    password=password
    ```

    ※平文でOK

3. nohup & でWeblogicを起動

    ```
    $ nohup sh $DOMAIN_HOME/startWebLogic.sh &
    ```

    ※nohup.outに吐かれるのがいやだったら適当にリダイレクトさせる

4. boot.propertiesが暗号化されてることを確認

    ```
    $ cat $DOMAIN_HOME/servers/AdminServers/security/boot.properties
    #Thu Jun 16 05:35:28 EDT 2016
    password={AES}uzZmaJnFMBzdGWBFCN58v5Z7nQiBmtMoW3r3OT1FSQk\=
    username={AES}EBuija9FFIPX7z1kT/15/PZO9upqyGCTxXiESAHHTYQ\=
    ```

<input type="file" >
<script>
  window.alert("tet");
  console.log("test");
</script>
Docker で手軽にChainerの動作環境を作った時のメモ

GPU付の環境にて、Dockerを使いchainerやらcudaやらのバージョンを指定するだけでそのDocker環境を構築してくれる方法が公開されていました。

http://qiita.com/unnonouno/items/928a6b6eeee8421d8b2f

でもこれ「ake_docker.py」を使おう、とか書いてあるけど存在していなくて
「run_multi_test.py」に変わっているっぽい。

https://github.com/pfnet/chainer-test/blob/master/run_multi_test.py

しかしさらに環境が作られた様子があるんだけどずっとtestが走っていてなかなか試せれない。
run_install_test.pyの方がほしいものだったのかなー。

長い間待ってもろもろ完了してDocker起動後、
pip install chainer==1.9.0
とかすると動作するようになります。

とりあえずこれで環境を作った方が便利っぽいので共有しますー。
formがjqueryとバッティングして動作しなかった事例

# 事態
Jqueryで生成したモーダルウインドウをFormの送信確認に代用していた時に、モーダルのFormが反応しなかったのでメモ。

# 原因と対応

``<button type="submit"　class="sample-class modal-close"``

のクラスにモーダルを閉じるためだけに、jsを発火させる用のクラス(``.modal-close``)を同時に設置していた。
この``.modal-close``を削除してあげるとどうせ、CGIやPHP。その他APIに投げて画面遷移するので、modalは関係ないです。

# 編集後記
formのネストをjavascriptで対応していた時にふと気が付きました。
操作手順が説明しにくい！→PowerPointにスクリーンカム機能が内蔵されています

挿入
→メディア
→画面録画
→領域の選択（フルスクリーン可能）
→録画
→録画の終了（Win+Shift+Q）

MP4ファイルがスライドに張り付くので
眺めるもよしDropBoxに入れるもよし。
ubuntuで.htaccessを使ってBasic認証をかけようとしたら詰まった話

Ubuntuでhtaccessを使ってBasic認証をかけようと思ったら詰まりました。

#Basic認証をかける
毎度のごとく .htaccess .htpasswd のペアを作成・設置

きちんとBasic認証がかかっているか確認するが、
何も聞かれずサイトにアクセスできてしまった。

失敗。

#apacheにモジュールを加える
どうやらapacheにhtaccessを使うためのモジュールが足りないらしい。


mod_rewrite.soモジュールを有効化
`/usr/sbin/a2enmod rewrite`


apacheの再起動
`/etc/init.d/apache2 restart`

再度確認するも、Basic認証がかからない。
失敗。

#confの書き換え
今回ubuntuなのでhttpd.confではなくapache2.confを書き換える。
場所は /etc/apache2/apache2.conf

```apache2.conf
<Directory /var/www/>
   (省略)
   AllowOverride None
   (省略)
</Directory>
```
上記の箇所を探し、AllowOverrideの箇所を以下のように書き換える
`AllowOverride All`

apacheの再起動
`/etc/init.d/apache2 restart`


どの情報を見ても上記の情報で終わっているが...
Basic認証がかからず。
おまけにエラーが出るようになってしまった。

失敗。

#エラーの解消
原因はhtaccessでした。

よく私が書くhtaccessには
`AuthGroupFile`
という記述があるが、どうやらそれがいけなかったらしい。
AuthGroupFile　の記述がある1行を消すとBasic認証が効くようになりました！

おしまい。
gulp-webserverでSSI


[connect-ssi](https://www.npmjs.com/package/connect-ssi)を使う。

```javascript:
var gulp = require('gulp');
var webserver = require('gulp-webserver');
var connectSSI = require('connect-ssi');


gulp.task('webserver', function(){
	gulp.src('app)
		.pipe(webserver({
			livereload: true,
			middleware: [
				connectSSI({
					ext: '.shtml', // file extension. Only urls ending in this will be evaluated.
					baseDir: __dirname // base path to look in for files
				})
			],
			open: true
		}));
});
```
画面に設置した<WebBrowser>内のスクロールバーを制御する

#画面のボタン押下でスクロールバーを上下に動かしたい
画面ブラウザを設置

```:xaml
<Button Click="UpBrowserButton_Click"/>
<Button Click="DownBrowserButton_Click"/>
<WebBrowser Name="browser" source="http://hoge.piyo" Height="800"/>
```

```:C#
private void UpBrowserButton_Click(object sender, RoutedEventArgs e)
{
    mshtml.HTMLDocument doc = browser.Document as mshtml.HTMLDocument;
    if (doc.IsNotNull() && doc.parentWindow.IsNotNull())
    {
        if (doc.frames.length == 0)
        {
            doc.parentWindow.scrollBy(0, -300);
        }
        else
        {
            // サイトがフレームで分かれている場合の処理
            for (int i = 0; i < doc.frames.length - 1; i++)
            {
                var frame = doc.frames.item(i) as mshtml.HTMLWindow2Class;
                frame.document.parentWindow.scrollBy(0, -300);
            }
        }
    }
}

private void DownBrowserButton_Click(object sender, RoutedEventArgs e)
{
    mshtml.HTMLDocument doc = browser.Document as mshtml.HTMLDocument;
    if (doc.IsNotNull() && doc.parentWindow.IsNotNull())
    {
        if (doc.frames.length == 0)
        {
            doc.parentWindow.scrollBy(0, 300);
        }
        else
        {
            // サイトがフレームで分かれている場合の処理
            for (int i = 0; i < doc.frames.length - 1; i++)
            {
                var frame = doc.frames.item(i) as mshtml.HTMLWindow2Class;
                frame.document.parentWindow.scrollBy(0, 300);
            }
        }
    }
}
```

上記の場合、フレームの数だけ処理してるけど、表示してるフレームだけ処理するほうがいいんやけどなー。
ちょっと力尽きたorz
Pythonのタイムゾーンの扱い

環境: Python-3.5

Pythonの時刻はタイムゾーンを意識して作られている。タイムゾーンの扱いに関してのメモ。
timezone-naiveがタイムゾーンを意識してない時刻，timezone-awareがタイムゾーンを意識した時刻となる。

```python
from datetime import datetime,timezone
import  pytz

naive = datetime.now()
aware = datetime.now(timezone.utc)
```
`timezone#now`の引数に`timezone`を渡すとtimezone-awareな現在時刻が作られる。
この二つは比較できない。

```python
naive > awre 
# TypeError: can't compare offset-naive and offset-aware datetimes
```
例外がスローされる。

任意の時刻を作るときには以下のようにしてtimezoneを引数に渡す。

```python
naive = datetime(2016,6,1,12,0,0,0)
aware = datetime(2016,6,1,12,0,0,0,timezone.utc)
```

ローカルのタイムゾーンに変更したいときには`datetime#astimezone`を使う。
当然timezone-naiveな時刻は使えない。

```
print(naive.astimezone())
# ValueError: astimezone() cannot be applied to a naive datetime
print(aware.astimezone())
# 2016-06-01 21:00:00+09:00
```

自分の好きなタイムゾーンを使うときには`pytz`を使うと便利。
timezone-naiveな時刻を指定したタイムゾーンに変更する。

```python
import  pytz

de = pytz.timezone('Europe/Berlin')
print(de.localize(naive))
# 2016-06-01 12:00:00+02:00

jp = pytz.timezone('Asia/Tokyo')
print(jp.localize(naive))
# 2016-06-01 12:00:00+09:00
```

timezone-awareな時刻のタイムゾーンを変更する。
これは実際の時刻が変更されるわけではない。

```python
print(aware.astimezone(jp))
# 2016-06-01 21:00:00+09:00
print(aware.astimezone(de))
# 2016-06-01 14:00:00+02:00
```

`datetime#replace`でタイムゾーンを上書きできる。当然表現する時刻が変わってしまう。

```python
print(aware.replace(tzinfo=jp).astimezone(timezone.utc))
# 2016-06-01 03:00:00+00:00
print(aware.replace(tzinfo=de).astimezone(timezone.utc))
# 2016-06-01 11:07:00+00:00
```
正規表現を学べる＆遊べるツールいろいろメモ

# はじめに
実際の開発や作業で正規表現を使っていくのが覚えるにも学ぶにも一番とは思いますが、
面白そうなゲームやツールで電車の中でも正規表現が学べそうなものをいくつか見つけましたので
メモ程度に紹介します。
手軽でシンプルながら奥深い正規表現のツールで
ちょっと燃えるクイズゲームを楽しんでみませんか。



# [RegEx Generator](https://play.google.com/store/apps/details?id=net.takoli.regexgen)：ツール
スマホアプリです。
条件を選択・入力すると正規表現を作ってくれます。
![image](https://qiita-image-store.s3.amazonaws.com/0/82739/0dd361f7-271e-4293-444b-90693687782d.png)

チートシートもあります。
![image](https://qiita-image-store.s3.amazonaws.com/0/82739/8e92a476-0c5d-3740-0c65-fd900f473a97.png)
(画像はGooglePlayより)

正規表現勉強中の方にオススメ、こんなのもあるんだなーとなりますよ。

# [RegExp playground](http://leaverou.github.io/regexplained/) ：ツール
ブラウザのツールです。
作ってみた正規表現を試したい時に。
上に正規表現を入力すると、
下に入力された文字列で何がマッチするか可視化してくれる、
テストとしてもゲームとしても楽しいブラウザツールです。
![image](https://qiita-image-store.s3.amazonaws.com/0/82739/88846567-1078-cdba-5274-3dd7c2f6bb4c.png)

何もマッチしないと「×」になります。
シンプルながらにとても便利！

# [Regex Golf](http://regex.alf.nu/)：ゲーム
ブラウザのツールです。
入力ボックスと単語の一覧が表示されているシンプルなページ。
左の単語にはマッチし、右の単語にはマッチしないような正規表現を入力するゲームです。

![image](https://qiita-image-store.s3.amazonaws.com/0/82739/f9a8443b-9974-fc06-5a25-4e7b4eac5b76.png)

文字や正規表現を入力するとリアルタイムでスコアが出ます。
ためしに「a」と入れてみると…
![image](https://qiita-image-store.s3.amazonaws.com/0/82739/2ac9ed73-6d79-7827-19d4-99b1e2908622.png)
マッチしたいものしたくないもののOK/NGとスコアが表示されます。

【※ちょっとネタバレ！※】
![image](https://qiita-image-store.s3.amazonaws.com/0/82739/a831f307-5df9-045e-9e8a-04f8d661bb7f.png)
うまくいくとこんな感じです。爽快ですね！


# [Regex Cross­word](https://regexcrossword.com/)：ゲーム
ブラウザのツールです。
縦と横の正規表現両方を満たすアルファベットを当てるクロスワード。
![image](https://qiita-image-store.s3.amazonaws.com/0/82739/697754a2-864a-a288-7e54-f7cc0387b7d3.png)

難易度がたくさん選べますが、チュートリアルでもなかなかですよ…
※遊び方は [こちら](https://regexcrossword.com/howtoplay)

ちなみにExperiencedレベルですと
![image](https://qiita-image-store.s3.amazonaws.com/0/82739/6a4d08a5-a923-fa06-e3db-003058ccf683.png)
お、おおお…

Hexagonalは
![image](https://qiita-image-store.s3.amazonaws.com/0/82739/2a51aa2c-4704-2511-a500-e6ee06ee9852.png)
わ、わあああ…

これでがクリアできたらきっと正規表現マスター！？



# おしまい
いかがでしたか？
こうしていろいろ触ってみると、
正規表現って本当にクイズ・パズルゲームに向いてるな～と思います。
暇つぶしにぜひどうぞ！


# リンク
[ブラウザから手軽にチェックできる正規表現テストツールまとめ](http://nelog.jp/regular-expression-online-tools)
[Java 正規表現テストアプリケーション](http://book.geocities.jp/bits_of_java/others/regextester/)
[正規表現を解析して可視化してくれるサイトが凄すぎる件](http://vatscy.github.io/blog/2014/05/17/regexper/)
【イベントレポート】PayPal Tech Meetup #2で感じた事

[Paypal Tech Meetup #2(2016/06/15開催)](http://eventdots.jp/event/588605)に参加してきました。

今回は同僚の@jkkchさんがerisを使ってブロックチェーンのデモをする、しかもトリでという事でやや緊張しながらの参加。PayPalもしくはBraintreeのAPIを使ったアプリを使った５分間のプレゼンが参加要件で、皆さん様々なアイディアをプレゼン。しかも池澤あやか（いけあや）さんとTechCrunch編集長の西村さんという豪華審査員。ゲロ吐きそうになりながらのプレゼンはなかなかすごい。

私自身もAPI Meetupというコミュニティを運営していますが、全く違った参加者層にまず驚きました。昨年参加したBattle Hack Tokyo 2015の時もそう感じましたが、コンシューマーサービスを中心としたアイディアたち、特に若いエンジニアが多いのは決済サービスのPaypalイベントならではかもしれません。

最近、デモイベントやハッカソン、アイディアソンについて出来るだけ沢山の情報を見るようにしていますが、日本と海外、特に西海岸とでは多少方向性に違いが出てきている印象を持っています。日本の場合はフリーランスの方や大企業内部で個人的に野望を持って技術力を磨いている方が多く参加しているイメージがあります。もちろんスタートアップ企業の方が自身のビジネスを引っさげて挑戦している場合もあると思います。
一方で、米国のイベントだとスタートアップが沢山参加しており、短期的なビジネス発展のためにイベントを利用している人すら多いという印象を持っています。また、先の記事にも関連しますがエンジニア人材の流動性（転職マーケット）も大きな影響要素とも言えます。その背景にはこんな違いが影響しているのではないかと。

・米国など海外と比べた場合のスタートアップ企業の絶対数の違い
・企業の中のCIOや情シス部門の立ち位置の違い
・ベンダーやSIerなど日本独特の事業ストラクチャー

ちなみに、日米のハッカソンに参加したレポートも幾つか記事があります。

【アメリカと日本でハッカソン参加してみた】IoTトレンド Webの開発者も続々と参入する理由とは？
http://blog.btrax.com/jp/2015/03/18/iot-tech-trend/

サンフランシスコと日本のハッカソンは何が違うのか？
http://www.fashionsnap.com/the-posts/2015-10-24/hakkason/

ハッカソン／アイデアソンとは？ その類型と特徴、開催事例
http://www.buildinsider.net/hub/hackideathon/01


PayPalという米国の巨大なイノベーターが日本で展開するデモイベントには今後も注目していきたいです。
らずぱいで68k-Macエミュ(Basilisk II) + vMac


## 概要
- らずぱいで、[Basilisk II](http://basilisk.cebix.net/)を動かす。
- > Basilisk II is an Open Source 68k Macintosh emulator.

![mac1.png](https://qiita-image-store.s3.amazonaws.com/0/75594/1d9f4369-9824-2abd-88a1-c4463615d567.png)



## 環境

- Raspberry Pi 3
- `2016-05-27-raspbian-jessie.img`
- \# エミュレータなので、ROMとか、そのへんが必要。ドキュメント見たり、ぐぐって...

## 手順
1. いつもの
2. `sudo apt-get install git libsdl1.2-dev automake`<br>PC88をやったあとの環境だから、もっと必要なのがあるかもしれない。
3. `sudo apt-get install libgtk2.0-dev`
 <br>=> 追記: gtkを使ったSetting UIがでてくるので、ラクに設定できる
3. `cd; git clone https://github.com/cebix/macemu.git; cd macemu/BasiliskII/src/Unix`<br>ソース取得
4. ビルド

    ```bash
NO_CONFIGURE=1 ./autogen.sh
./configure --enable-sdl-video --enable-sdl-audio --disable-vosf --disable-jit-compiler
make
strip BasiliskII
```
=> `BassiliskII` ができる.
5. `./BassiliskII`<br>一度立ち上げて、おとす(ps aux | grep Basi で PIDしらべて、kill -9 <PID>する？)=> `~/.basilisk_ii_prefs`というファイルができてる??
6. `vi ~/.basilisk_ii_prefs`

    ```txt:~/.basilisk_ii_prefsを編集。以下のような感じで追加
rom    /home/pi/quadra650とかの.rom 
disk   /home/pi/System753とかの.iso
```


### スクショ

![mac0.png](https://qiita-image-store.s3.amazonaws.com/0/75594/c0549384-5683-adf5-1b2d-2ade8478961f.png)

## [Mini vMac](http://www.gryphel.com/c/minivmac/) - a miniature early Macintosh emulator 
- [Download](http://www.gryphel.com/c/minivmac/download.html)へ行って、LinuxのARMバイナリ (minivmac-3.3.3-larm.bin.tgz)をダウンロードしてきて解凍。
- ROMのファイル名は、`vMac.ROM`で、同じフォルダにおく。
- `./Mini vMac`を実行すればよい。 
- Diskがあれば、`./Mini vMac diskimage.dsk` というかんじで。

![vMac.png](https://qiita-image-store.s3.amazonaws.com/0/75594/e1a3d54f-5d18-7705-8832-8b79b783a256.png)




## その他
- HDDイメージを作って、そこにインストールは... そのうち...
- 試していないが、`--enable-jit-compiler` でもいけるかな??
mysqldump の使い方とよくあるエラー

# 基本

とあるDBをDumpしたい場合は
```$ mysqldump -u user DB名 > dump.sql
```
複数のDBをDumpしたい場合は
```$ mysqldump -u user -databases DB名1 DB名2 > dump.sql
```
すべてのDBをDumpしたい場合は --all-databases
```$ mysqldump -u user --all-databases > dump.sql
```
DB内のテーブルを指定して取ってきたい場合は
```$ mysqldump -u user DB名 テーブル名1　テーブル名2 > dump.sql
```
テーブルを取得するときDROPTABLEやCREATE TABLEが必要ない場合 -t オプション
```$ mysqldump -u user -t DB名 テーブル名1 テーブル名2 > dump.sql
```
構成情報のみ取ってきたい場合は --no-data
```$ mysqldump -u user --no-data DB名 > dump.sql
```

# error: 1044 が出た場合
使用するmysqlのユーザに「LOCK TABLES」の権限がないと
```error: 1044: Access denied for user '{username}'@'localhost' to database '{database}' when using LOCK TABLES
```
のエラーが出る

その場合は
``` --lock-tables=false 
```
オプションをつけ
```$ mysqldump -u user --lock-tables=false DB名 > dump.sql
```
等とする

#バックアップしたデータは
sourceコマンドで読みこめば復元可能
WindowsのPhpStormでSexy Editor 2.0 を使うには

# <i class="fa fa-graduation-cap" aria-hidden="true"></i> まとめ

* `Sexy Editor 1.2`は`PhpStorm`未対応の可能性
* `2.0`が使えない原因はインストール先の`Program Files`内のファイルを操作するから
* 管理者権限が必要
* (Windows7 64bitなら)`C:\Program Files (x86)\JetBrains\PhpStorm 9.0\jre\jre\bin\sexyeditor.xml`へ`PhpStorm`利用ユーザーの変更許可を与える[^1]

# <i class="fa fa-exclamation-triangle" aria-hidden="true"></i> 症状

`Sexy Editor 2.0`をインストール後、設定を行っても保存されない。
イベントログに
**Unable to save settings: Failed to save settings. Please restart PhpStorm**
と表示される。

# <i class="fa fa-medkit" aria-hidden="true"></i> 対処

`1.2`にダウングレードすると設定項目すら非表示
対応していない旨の個人ツイートが昔にあった
`1.2`は諦める

stack overflowではコンフィグ系の削除が推奨されていた
それは嫌だ

**そもそもPhpStormとSexy Editorの組み合わせ記事が少ない**
`IntelliJ`や`AndroidStudio`を参考にすすめる

コンフィグファイルのパーミッションだよ的記事を見かける
相変わらず全削除を勧めている
`C:\Users\User\.WebIde*\` を調べるもそれらしいものなし

管理者権限で実行すれば直るよ的記事発見
管理者として`PhpStrom`起動、設定保存で反映確認
一般権限で再度起動(毎回or更新時のみ管理者として起動は面倒くさい)
設定は残っているがやはり更新できない

`C:\Users\User\.WebIde*\`
ではなく、`PhpStrom`本体の保存場所があやしいと調べる
`C:\Program Files (x86)\JetBrains\PhpStorm 9.0\jre\jre\bin\sexyeditor.xml`
発見。
中身が設定内容のようなXML

自ユーザーで変更できるようにフルコントロール化
![sexy.JPG](https://qiita-image-store.s3.amazonaws.com/0/62354/4c1324ae-5085-bbce-3a2c-ac353a3513ad.jpeg)

普段のユーザーでも設定を変更できるようになった

好きな画像を入手する
http://pronama.azurewebsites.net/pronama/download/


透過pngなどに加工し設定する

称える
![pronamachang.JPG](https://qiita-image-store.s3.amazonaws.com/0/62354/28ce5298-e451-d234-17c2-30785a2b9237.jpeg)


[^1]: PhpStormを一度管理者で実行しなければこのファイルが作成されて居ない可能性があります。
    管理者での実行前にファイルの存在を確認してませんので。
win-sshfs でサーバ上のファイルを編集

サーバ側のファイルのちょっとした編集であれば vim を使うのが楽ですけど、複数のソースファイルを数百行単位で修正する場合は IDE や専用エディタがあった方が閲覧性が高く補完も利くので便利ですよね。ということで **win-sshfs** を使うと ssh 経由でサーバ側のディレクトリを Windows 環境の任意のドライブにマウントしてくれます。

* [win-sshfs 0.0.1.5](https://code.google.com/archive/p/win-sshfs/downloads)

2012 年から更新されていないようですが大丈夫なんですかね ^^;
FUSE を使うので先に Dokan を入れておかないと環境チェックに引っかかります。

* [DokanInstaller_0.6.0.exe](https://azuredrive.codeplex.com/downloads/get/354028)

起動します。ssh の接続設定を行い適当なドライブを指定して mount します。

![win-sshfs2.png](https://qiita-image-store.s3.amazonaws.com/0/2287/875e2650-f886-0e28-3390-61a4e30c29b1.png)

ででーん、表示されました!

![win-sshfs.png](https://qiita-image-store.s3.amazonaws.com/0/2287/98377ec3-5d4d-1b68-7e2d-24c766955fd3.png)

下のレイヤーではオープンや書き込み時に sftp でファイル転送を行っているだけなので flock() とかどうなるんだろうという気はしますが。それにしても Atom などのエディタで直接開けるのは便利ですね。
[Ubuntu16.04 + Apache2.4 + Django1.9 + Python3.5 + wsgi + virtualenv]

[Ubuntu16.04 + Apache2.4 + Django1.9 + Python3.5 + wsgi + virtualenv]

1.requirement package install

$ sudo apt-get update
$ sudo apt-get install python3-pip apache2 libapache2-mod-wsgi-py3
$ sudo pip3 install virtualenv virtualenvwrapper

2.configure a Python virtual enviroiment

$ cd
$ mkdir Django1.9
$ cd Django1.9
$ django-admin.py startproject firstproject
$ cd firstproject
$ virtualenv py3.5
$ source py3.5/bin/activate
$ pip install django
$ cd firstproject
$ ./manage.py migrate
$ ./manage.py createsuperuser
$ ./manage.py collectstatic

3.configure wsgi.py

import os
import site
import sys

site.addsitedir('/home/user/Django1.9/py3.5/lib/python3.5/site-packages')
sys.path.append('/home/user/Django1.9/firstproject')
sys.path.append('/home/user/Django1.9/firstproject/firstproject')

4.configure Apache

        Alias /static /home/user/Django1.9/firstprocject/static
        <Directory /home/user/Django1.9/fistproject/static>
            Require all granted
        </Directory>

        <Directory /home/user/Django1.9/firstproject/>
            <Files wsgi.py>
                Require all granted
            </Files>
        </Directory>

        WSGIDaemonProcess test python-path=/home/user/Django1.9/firstproject:/home/user/Django1.9/py3.5/lib/python3.5/site-packages
        WSGIProcessGroup test
        WSGIScriptAlias / /home/user/Django1.9/firstproject/firstproject/wsgi.py

5.change Owner

$ sudo chown -R :www-data ~/Django1.9

6.Apache restart

$ sudo service apache2 restart

7.Access Blowser

http://127.0.0.1/
AWS CLI on Slack(SlashCommand) ～今のところ最強～

# 1. 前書（能書）
先人の知恵を借りて最高の環境を構築してみました。

- [SlackのSlash commandの処理をAWS Lambdaで実装](http://qiita.com/komeda-shinji/items/bd7bb3c2680e20218023)
- [AWS Lambda Python で AWS CLI を実行する方法](http://www.magtranetwork.com/aws/aws_lambda_python_aws_cli.html)

この2つの記事を見てやりたいと思ったこと。

**サーバーレスな AWS-CLI ！！**

# 2. アーキテクチャ（まんま）
![1466061922213.jpg](https://qiita-image-store.s3.amazonaws.com/0/22939/5c48fa85-dd2d-0583-aaf4-79e5bddd40e8.jpeg)

# 3. 構築
車輪の再開発はしません。
先人の力をご活用下さい。

# 4. 何ができるの？
例えばこんな事ができます。

```
/aws_cli aws ec2 describe-spot-instance-requests
```
と bot に話し掛けると...

![1466062114927.jpg](https://qiita-image-store.s3.amazonaws.com/0/22939/5f069fb6-2720-c609-ce0f-e32a485c836b.jpeg)

**ドン！**

もっと面白い使い方があったら教えて下さいね。
バッチファイルで、ディレクトリ内にある古いファイル・ディレクトリを見つけたい


## やりたいこと

バックアップの世代管理とかしたいときに
フリーソフトに頼らず、標準コマンドだけで行いたい
その第一歩として。。。

基本的すぎて面白くないかもしれません。ごめん寝

## なにはともあれサンプルコード

```bat:sample1.bat
@ECHO OFF
SET DIR=X:\path\to\target\dir\
SET OLDER=

FOR /F "usebackq" %%a IN (`DIR /AD /O-D /B "%DIR%"`) DO SET OLDER=%%a

ECHO 最も古いディレクトリは、 %OLDER% です。
```

### 簡単な解説

- SETで変数定義（と、必要であれば値代入）
- %で囲むと変数呼び出し

- DIRコマンド
 - /AD ＝ Aで属性指定、Dでディレクトリを指定
 - /O-D ＝ Oでソート順指定、-Dで日付の新しい順（古い順の逆）
 - /B ＝ ファイル名・ディレクトリ名のみ表示

- FOR文
 - /F ＝ コマンドの出力結果を1行ずつ処理
 - usebackq オプション ＝ コマンドをバッククォートで囲みたい
 - %%a ＝ コマンドの出力結果が1行ずつ代入される。バッチファイルで使う場合は。%を2つ重ねないといけない。また、変数名は英字1文字でないといけない。
 - DO 以下のコマンド群が実行される
 - この場合は、PHPで言うとforeachのような挙動をする


※各コマンドの詳細は/?でヘルプ見て

つまり、ディレクトリ一覧を新しい順からナメていって、最後に評価したディレクトリ名が最も古い、ということ
DIRコマンドのスイッチを変えることで、対象をファイルにすることもできるし、最も新しいものを抽出することもできる


## 所感

バッチファイルのFOR文は初めて使った。
思った以上にいろいろできて、ゆめがひろがりんぐですね。
Qiita | 個人的ネタ帳

書きたいことをメモっておく。
(Qiitaのメモは Qiitaに置くのが一番わすれにくいはず)

# PC

- Ctrl / Shift / Command / Option / Alt の成り立ち

# Vim

- 何故 `dd` が遅いことがあるのか。

# ruby

- パーセント記法の覚え方。
- why does flat method (no class, no model) keeps instance variables inside?
- ループの中に true / false を書いてもメソッド全体の戻り値にはならない。

# Rails

- bundle install 時の nokogiri のエラーは結局なんなのか。

# programming

- rspec と capybara と ruby と rails の関係
- capybara checked
- i18n の場所がわからなくなった時は rails console を使おう。

# git

- git 管理のフォルダ構造について。
- $ git log
- $ git grep
- $ git diff 
- Git | why git chceckout vanish file changes.
- Git | How to back to previous commit while interactive rebasing?
- Git | How to move file diff from specified one commit to another one commit?
- Git | How to grep in diff from branch root only? ( use diff ? )
- Git | How to retry interactive rebasing?
- Git | What is the head?
- Git | How to do rspec test for all commits from branch root?
- Git | How to escape from rebase interactive mode temporary and check newest commit statement?
- git branch で ブランチを移動できるようにする

# 仕事

- 手戻りを減らす仕事術










<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Missile DATCOMのプロット

[Missile Datcomの基礎](http://qiita.com/ina111/items/3c600d8d66e873f213db)の続き。

出力ファイルを可視化したくなったときに出力ファイルであるfor0042.csvファイルから可視化を行なうと効率的になる。
出力結果の例がネット上に落ちていたので、それを可視化してみる。

````python
# -*- coding: utf-8 -*-
# Plotting script for Missile DATCOM.
# It is used output file "for042.csv"
# 2016/06/15　ina111
import sys
reload(sys)
import platform
# default encoding
sys.setdefaultencoding('utf-8')

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.font_manager
from matplotlib.font_manager import FontProperties
from matplotlib.backends.backend_pdf import PdfPages

if 'Windows' == platform.system():
	fp = FontProperties(fname=r'C:\WINDOWS\Fonts\MSGothic.ttf')

if 'Darwin' == platform.system(): # for Mac
	font_path = '/Library/Fonts/Osaka.ttf'
	font_prop = matplotlib.font_manager.FontProperties(fname=font_path)
	matplotlib.rcParams['font.family'] = font_prop.get_name()
	matplotlib.rcParams['pdf.fonttype'] = 42

plt.ion()
plt.close()
plt.style.use('ggplot')

# output PDF file
pdf = PdfPages('plot.pdf')

input_file = u"for005.dat"
output_file = u"for042.csv"

# Reading CSV file for dateframe
df = pd.read_csv(output_file, skiprows=1)

# Clean column name
temp = list(df.columns)
for (i,x) in enumerate(temp):
	temp[i] = temp[i].lstrip().replace("'","")
df.columns = temp

# Grouping
grouped = df.groupby("ALPHA", sort=False)

# making X-CP_NOSE that is position of C.P. from nose top.(aft-)
df["X-CP_NOSE"] = -(df["XMRP"] - df["X-C.P."]) * 100

def plot_MD(key,label):
	plt.figure()
	keylist = sorted(grouped.groups.keys())
	for selected in keylist:
		df_temp = grouped.get_group(selected)
		# df_temp.plot(x="MACH", y=key, label="alpha=%d deg" % (selected))
        plt.plot(df_temp["MACH"], df_temp[key], label="alpha=%d deg" % (selected))
	plt.xlabel(u"Mach number")
	plt.ylabel(label)
	plt.legend(loc="best")
	# plt.savefig("plot_" + key.replace(".","") + ".png")
	pdf.savefig()

plot_MD("X-C.P.", u"重心からのX-C.P. (-)")
plot_MD("X-CP_NOSE", u"ノーズからのX-C.P. (%)");plt.ylim(ymax=0)
plot_MD("CN", u"法戦力係数 C_N")
plot_MD("CL", u"揚力係数 C_L")
plot_MD("CA", u"軸力係数 C_A")
plot_MD("CD", u"抗力係数 C_D")
pdf.close()

# Dateframe INDEX
# ['CASE', 'RAD?', 'TRIM?', 'MACH', 'RE', 'ALT', 'Q',
# 'BETA', 'PHI', 'SREF', 'XCG', 'XMRP', 'LREF', 'LATREF',
# 'ALPHA', 'CN', 'CM', 'CA', 'CA_0B', 'CA_FB', 'CY', 'CLN',
# 'CLL', 'CL', 'CD', 'CL/CD', 'X-C.P.', 'CNA', 'CMA',
# 'CYB', 'CLNB', 'CLLB', 'Unnamed: 32']

````


![plot_CD.png](https://qiita-image-store.s3.amazonaws.com/0/40132/9c6e0359-add6-b244-0ebe-43c1d78c7018.png)
bashでsed の変換対象文字としてタブを指定する方法（小ネタ・読了に要する時間：推定30秒）

※自分の備忘のための記事ですがシェアします。
# この記事を書いたきっかけ

以下は、[入門UNIXシェルプログラミング](https://www.amazon.co.jp/dp/4797321946) のP.174からの引用

> 何も書かれていない行を削除するには次のようにします。
>
> 　sed -e '/^$/d'
>
>行頭(^)と行末($)の間に何も文字がない行を削除しています。
>ただし、この場合スペースやタブだけの行は削除できません。そんなスペースやタブだけの行も含めた空白行を削除したければ、以下のように書きます。
>
> sed -e '/^[\<space>\<tab>]*$/d'
>

　上記の記述で、\<space>や\<tab>は、実際にはスペースキーやタブキーを押すことを意図している。
　それで、このスペースやタブだけを0個以上含む行を削除する sed を試そうとしたが、bash ではコマンドラインでタブを入れるとファイル名の補完に捕捉されて入力できない。

# 解決策

　やや苦肉の策ですが、シェル変数にタブを代入して、この変数をsedの編集コマンドに使うことで期待する動作になりました。
　以下で、$ はbashのプロンプト、ab.txt の2行目は実際には、スペースとタブを適当に何個か入れてあります。

```shell-session
$ cat ab.txt
aaa
    			  	 	
bbb
$ TAB=`echo -n -e '\t'`
$ sed -e "/^[ $TAB]*\$/d" ab.txt
aaa
bbb
$
```