OmniAICreator/Qiita-1.07M huggingface dataset:
VsVimの宣伝！

# はじめに
こちらは[Vim Advent Calendar 2015](http://qiita.com/advent-calendar/2015/vim)の12日目の記事です。

# VsVimとは
Visual Studio用のVimプラグインです。
既にご利用になっている方も多いのではないでしょうか？
* 参考 : https://github.com/jaredpar/VsVim/wiki/faq

## ぶっちゃけ何番煎じだよ
という話もありますが、ステマは多いほうがいいということでご容赦をいただきたく・・・。
* [VsVimのC-\[を使えるようにする](http://qiita.com/ssashir06/items/f0e333719ee4fc12b2c6)
* [Microsoft Visual Studio Community 2013でVimキーバインド(VsVim)を使ってみた](http://qiita.com/akase244/items/a80c08d4dafe13c290b6)
* [VsVim用のvimrcを作成する](http://qiita.com/zimathon/items/d02e587466dbdc90c9d3)

# 導入手順
## VisualStudioのインストール
ここは流石に割愛

## VsVimのインストール
「拡張機能と更新プログラム」でVsVimをインストール
* ツール - 拡張機能と更新プログラム(U)... を選択
![5fb3abdbb165020badf1fdf2919c4652.png](https://qiita-image-store.s3.amazonaws.com/0/47699/e3f3de22-509f-15b4-6166-c4ff26376f0c.png)
* オンラインを選択し、VsVimを検索
![215f52292b11f6b72ad1bb9c668cb6d0.png](https://qiita-image-store.s3.amazonaws.com/0/47699/f03105dd-5a22-fcd4-db01-10ea55f328b0.png)
* ダウンロードボタンを押し、画面の指示に従う

## VsVimのキー設定
* エディタを開くと、メッセージが出ているので configure を押す
![788db4a76f346f66a368b4db83ae6590.png](https://qiita-image-store.s3.amazonaws.com/0/47699/b3cb112d-e980-4914-4d51-cd03d8d47b7b.png)
* キーバインドがほとんどVisualStudio準拠になっているので、お好みの設定をする
![0059730bf2c322d214c3f536a7bfd3e0.png](https://qiita-image-store.s3.amazonaws.com/0/47699/ea14f43b-e818-7d9c-d957-820fac8b708e.png)
    * 面倒なら Handle all with VsVim で全部Vim準拠になります
        * それでもCtrl+Aなど一部は手動で設定を変えなければいけない模様です
* しかし、Ctrl+[が効かない！
    * 先人の知恵を拝借します
        * [VsVimのC-\[を使えるようにする](http://qiita.com/ssashir06/items/f0e333719ee4fc12b2c6)

## _vsvimrcの設定
* 参考
    * [How can I verify my vimrc is loading?](https://github.com/jaredpar/VsVim/wiki/faq#how-can-i-verify-my-vimrc-is-loading)
    * [VsVim用のvimrcを作成する](http://qiita.com/zimathon/items/d02e587466dbdc90c9d3)
* %HOME%/_vsvimrcという名前で設定ファイルを保存しましょう。
    * 記述方法は通常の.vimrcと同じ模様
    * .vsvimrcでもいいようだが、Windowsとdotfileは相性が悪いので・・・。
    * 一応、読み込むrcファイルは指定できる模様
        * [How can I disable autoload of my vimrc?](https://github.com/jaredpar/VsVim/wiki/faq#how-can-i-disable-autoload-of-my-vimrc)
* \<C-e\>とかが設定できないよ！
    * VisualStudioで設定されているキーバインドが優先されるため、そちらを解除しましょう。
    * オプション - キーボード にてショートカットキーの欄にて該当のキー(例の場合はCtrl+E)を押すと、  
    そのキーバインドを使用している機能が出るので、その設定まで移動し1つずつ削除していく。
    ![d7b27ac2fcda295394c9f8918e213d67.png](https://qiita-image-store.s3.amazonaws.com/0/47699/4ae8a1f7-71b8-2ba9-8d39-162743482721.png)
    ![2576486c6cbf7673188362b1848543cf.png](https://qiita-image-store.s3.amazonaws.com/0/47699/17777efc-d81c-4931-4609-6799261d78a6.png)
    ![d0dc90b7ea7072302ef7088272392433.png](https://qiita-image-store.s3.amazonaws.com/0/47699/f2431bca-2105-c6ca-9072-61a470c23300.png)

## クリップボードを使いたい！
* _vsvimrcに`set clipboard=unnamed`と記載すればヤンクした際にクリップボードに送られる。
    * しかし、+レジスタに送られるせいで、インサートモードで\<C-r>0をしてもペーストができないという事態に！
        * ノーマルモードのpコマンドは問題ない
    * 私は`inoremap <C-r>0 <C-r>+`で逃げました。
        * 解決方法ご存知の方情報をください・・・

# まとめ
VisualStudioとVimが両方そなわり最強に見える
Visual Studio 2015でpythonを実行するときコマンドプロンプトを非表示にする方法

個人的メモ
#pythonを実行した時にコマンドプロンプトを非表示にする方法
* "ツール"->"オプション"->"Python Tools"->"Debugging"を選択
* 以下の2つの項目のチェックを外す
  * Wait for input when process exits abnomally
  * Wait for input when process exits nomally

#結果
コマンドプロンプとは一瞬表示されるが、Visual Studioの出力部分に結果が表示される

#追記
他に良い方法があればご教示お願いします。
ESP8266 > 動かない > FT232からの供給は不十分 / 80mAから最大360mA


https://github.com/esp8266/Arduino/issues/770
> Hi guys! I was having the same problem: 
warning: espcomm_sync failed
error: espcomm_open failed
>
For me, that was solved with an external 3.3v. My FT232 USB hasn't enough power to provide to ESP8266.

FT232からの3.3V供給ではダメという情報

<hr>

[macbusさんの記事](https://macsbug.wordpress.com/2015/08/13/esp8266-%E3%81%AE%E6%B6%88%E8%B2%BB%E9%9B%BB%E6%B5%81%E3%81%A8-arduino-%E3%81%AE-3-3v-%E5%87%BA%E5%8A%9B%E9%9B%BB%E6%B5%81%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/)

> 結論：ESP8266の消費電流は、通常80mAで最大360mA程度。Arduino 3.3V出力はLDOで異なる。
＿　　Arduino 3.3VでESP8266が動作可能かは、Arduinoの種類によって異なる。
＿　　下の表の 300mA か500mA 以上のArduinoを使用する。
＿　　Capacitorを追加し、瞬間的な電流を補うのも１つの方法である。

<hr>

最初はCR-123A (実測: 3.1V程度)で電源供給しようとしたが動かず.
USBシリアルからの3.3V供給もあやしい。

リチウムバッテリーを使わない方針の場合、やはり三端子レギュレータを用意することになりそう。
ESP8266 > 回路図3 > PROGボタン / RESETボタン / BME280 接続 / OLED接続

ESP8266の回路図を別途見つけた。

https://macsbug.wordpress.com/2015/11/14/esp8266bme280oled/

この人の記事は他のESP8266も含めて非常に詳しく参考になる。
Erlang/OTP 18, 17, R16 が一緒に入った Docker イメージあります

今年（2015年）の夏ごろ、必要に駆かられて以下の Docker イメージを作成しました。その後も、OTP のマイナーリリースが出るごとに、地道にアップデートしてます。

Erlang/OTP アプリケーションのリリースの作成などに活用できます。

Docker イメージ タグ  | Linux ディストリビューション | ベースイメージ | OTP リリース （2015年12月現在）
:-------------------|:------------|:------------|:---------------
centos7-multi-otp   | CentOS 7    | [centos](https://hub.docker.com/_/centos/):centos7 | 18.1.5, 17.5.6.6, R16B03-1
centos6-multi-otp   | CentOS 6    | [centos](https://hub.docker.com/_/centos/):contos6 | 18.1.5, 17.5.6.6, R16B03-1
archlinux-multi-otp | Arch Linux  | [quay.io/tatsuya6502/archlinux-x86_64](https://quay.io/repository/tatsuya6502/archlinux-x86_64):latest | 18.1.5, 17.5.6.6, R16B03-1

**イメージリポジトリー**

- https://quay.io/repository/tatsuya6502/erlang

quay は kíː と発音します。埠頭の意味。


## 使いかた

```shell-session
$ docker pull quay.io/tatsuya6502/erlang:<タグ>
$ docker run -it --rm quay.io/tatsuya6502/erlang:<タグ> /bin/bash

（リリースをアクティベートする）
# source /usr/local/erlang/18.1.5_hipe/activate
```


## 実行例

```shell-session
$ docker pull quay.io/tatsuya6502/erlang:centos6-multi-otp
$ docker run -it --rm quay.io/tatsuya6502/erlang:centos6-multi-otp /bin/bash

[root@7a0afd51e424 /]# kerl status
Available builds:
There are no builds available
----------
Available installations:
r16b03-1_hipe /usr/local/erlang/r16b03-1_hipe
17.5.6.6_hipe /usr/local/erlang/17.5.6.6_hipe
18.1.5_hipe /usr/local/erlang/18.1.5_hipe
----------
No Erlang/OTP kerl installation is currently active

[root@7a0afd51e424 /]# source /usr/local/erlang/18.1.5_hipe/activate
[root@7a0afd51e424 /]# erl
Erlang/OTP 18 [erts-7.1] [source] [64-bit] [smp:2:2] [async-threads:10] [hipe] [kernel-poll:false]

Eshell V7.1  (abort with ^G)
1>  (Ctrl+G)
User switch command
 --> q

[root@7a0afd51e424 /]# source /usr/local/erlang/17.5.6.6_hipe/activate
[root@7a0afd51e424 /]# erl
Erlang/OTP 17 [erts-6.4.1.5] [source] [64-bit] [async-threads:10] [hipe] [kernel-poll:false]

Eshell V6.4.1.5  (abort with ^G)
1>
```


## Dockerflie

Dockerflie はここにあります。

- https://github.com/tatsuya6502/docker-erlang

Docker イメージのタグに対応するブランチを切ってますので、Dockerfile や .kerlrc を見たいときは、まず、ブランチを切り替えてください。


## 要望などあれば

イメージについて要望などあれば、この投稿へのコメントなどでお知らせください。GitHub への pull request も歓迎します。Quay.io の自動ビルドを使っていますので、イメージの種類（タグ）を増やすことは簡単にできます。

例：

- Linux ディストリビューションを追加してほしい
- 単一の OTP リリースだけを含んだイメージを追加してほしい
- kerl のビルドオプションを変更したイメージを追加してほしい
- Elixir も入ったイメージを追加してほしい

などなど。

なお、Erlang のビルドツール（Rebar など）は何種類かあるため、イメージに入れていません。ぜひ、このイメージをベースに、皆さんご自身の目的に合うツールを追加したイメージを作ってください。
CS-CartをInnoDB化してトランザクションもやる

CS-Cartをいじっているがアーキテクチャが古いせいか、MySQLのテーブルエンジンがMyISAMであり、したがってトランザクションは使っていない。トランザクションなしで複数のテーブルを同時更新しているわけだが、ショッピングカートのプロダクトとしていいのだろうか？

せめて自分が作ったアドオンではトランザクションを使いたいので、InnoDB化したときどうやってトランザクションするかを説明したい。

# Pre/Post Controllerを使ってBEGINとCOMMITを挟むようにする

Pre/Post ControllerはCS-Cartのコアのコントローラの前後に何か処理を実行する仕組みだ。詳細は、[Pre- and Post- コントローラー · CS-Cart開発者ドキュメント](http://docs.cs-cart.jp/docs/pre-and-post-controllers)を見ていただければと思う。

前後ということは、これを利用するとコアの処理をBEGINとCOMMITで挟むことができる。

```php:app/addons/mymod/controllers/backend/premoderation.pre.php
if ($_SERVER['REQUEST_METHOD'] === 'POST' and $mode === 'products_approval') {
    db_query('BEGIN');
}
```

```php:app/addons/mymod/controllers/backend/premoderation.post.php
if ($_SERVER['REQUEST_METHOD'] === 'POST' and $mode === 'products_approval') {
    // テーブルを更新する処理など
    db_query('COMMIT');
}
```

一応、CS-Cartは更新が失敗すると例外を投げるので、PostコントローラのCOMMITには到達しない。

# PHPフックを使って、BEGIN/COMMITで挟む

PHPフックが提供されているルーチンなら幸いだ。それを使うことができるし、呼び出される順番も指定できるので、ほぼ確実にCOMMITを全フックの最後にすることができる。

```php:app/addons/mymod/init.php
fn_register_hooks(
    ['update_product_pre', '1'],
    ['update_product_post', '9999999']
);
```

この1や9999999は呼び出される優先度で、詳しくは[CS-Cart: PHPフックで呼び出される優先度を指定する - Qiita](http://qiita.com/suin/items/7b251c65928489a277d3)を参照。

```php:app/addons/mymod/func.php
function fn_mymod_update_product_pre($product_data, $product_id, $lang_code, $can_update) {
    db_query('BEGIN');
}

function fn_mymod_update_product_post($product_data, $product_id, $lang_code, $create) {
    // テーブルを更新する処理など
    db_query('COMMIT');
}
```

こうしたやり方は明らかにHackだが、コアにはできるだけ触れたくない場合はこうするしかない。
動的に作成したcheckboxをクリックするとリンクを飛ばす


## 手始めにHTMLにチェックボックスを配置してリンクを飛ばす

```html
<input type='checkbox' class='chk'>
<input type='checkbox' class='chk'>
```

```js
$(function() {
	$('.chk').change(function() {
		location.href = "http://qiita.com";
	});
});
```

内容的には，chkクラスがクリックされたらQiitaに飛ぶというものです
例のように複数あっても問題無いです．

## PHPで動的に作って属性からリンクを取ってリンクを飛ばす

### フォーム側

```php
<?php
for ($i = 0 ; $i < 3 ; $i++) {
	echo "<input type='checkbox' class='chk' data-id='" . $i . "'>";
}
?>
```

#### 表示されるもの

<input type='checkbox' class='chk' data-id='0'>
<input type='checkbox' class='chk' data-id='1'>
<input type='checkbox' class='chk' data-id='2'>

#### HTMLソース

```html
<input type='checkbox' class='chk' data-id='0'>
<input type='checkbox' class='chk' data-id='1'>
<input type='checkbox' class='chk' data-id='2'>
```

`data-id`になっているものがデータベースに格納されているIDを想定

```js
$(function() {
	$('.chk').change(function() {
		link = $(this).attr('data-id');
		location.href = "search.php?id=" + link;
	)};
)};
```

チェックボックスが押されたら検知をして，`$(this)`に押されたチェックボックスをものとして持っているので`data-id`の要素を引っ張ってくる

### 受け取り側

```php
<?php
$id = $_GET['id'];
?>
```

URLのパラメータ名はGETメソッドなのでできる技ですね
CS-Cartでタイムスタンプを日付フォーマットにして表示する方法

CS-Cartの「基本設定」の「日付フォーマット」「時刻フォーマット」の設定値を使って、タイムスタンプをフォーマットする方法。

```smarty
{$timestamp|date_format:"`$settings.Appearance.date_format`, `$settings.Appearance.time_format`"}
```
Akkaによるbatch request作り方

# Background

以前投稿した[akka-pusher](http://qiita.com/dtaniwaki/items/2c671f7b96fadeaf75dd)ではeventを１つずつ投げていたので、API Call数でプランが変わる[pusher](https://pusher.com/pricing)では結構致命的です。

そこで、batch requestに対応しました。

対応PR: https://github.com/dtaniwaki/akka-pusher/pull/22

# How to make the batch request

Akka Actorのschedulerを使いました。
まずSchedule Taskを`Actor`で受け取るための`case class`を作成します。

```scala
case class BatchTriggerTick()
```

そして、schedulerを使って`BatchTriggerTick`を自分自身に一定間隔で投げます。

```scala
class PusherActor(config: Config = ConfigFactory.load()) extends Actor {
  // ...

  system.scheduler.schedule(
    1000 milliseconds,
    1000 milliseconds,
    self,
    BatchTriggerTick()))

  // ...
}
```

本来はbatch modeでない時にメッセージを送るための`TriggerMessage`をbatch modeでも使い回したかったのですが、pusher側で複数指定できる`channels`ではなく個別指定の`channel`を使わなければならないという制限があるため、別途`BatchTriggerMessage`を使用します。

そして、`BatchTriggerMessage`を受け取った時は送信せずにキューに貯め、`BatchTriggerTick`を受け取った時にキューにあるメッセージをまとめてpusherに投げるようにしました。

```scala
class PusherActor(config: Config = ConfigFactory.load()) extends Actor {
  // ...

  protected val batchTriggerQueue = Queue[BatchTriggerMessage]()

  override def receive: Receive = {
    case trigger: BatchTriggerMessage =>
      batchTriggerQueue.enqueue(trigger)
      true
    case BatchTriggerTick() =>
      val triggers = batchTriggerQueue.dequeueAll { _ => true }
      triggers.grouped(batchNumber) foreach { triggers =>
        pusher.trigger(triggers.map(BatchTriggerMessage.unapply(_).get)).map {
          case Success(_) => // Do Nothing
          case Failure(e) => logger.warn(e.getMessage)
        }
      }
      triggers.length
  }

  // ...
}
```

pusherの受け付けるevent数が最大100なので、100ずつに区切っています。

実際に動くものをheroku上に作ってみました。

https://akka-pusher-play-app.herokuapp.com/pusher_actor

これを使ってチャットアプリのバックエンドが簡単に作れるようになりました。
Laravel5.1をHerokuのPHP7でとりあえず動かす

HerokuでPHP7が使えるようになったらしいので動かしてみました
<blockquote class="twitter-tweet" lang="ja"><p lang="en" dir="ltr">Ready when you are: <a href="https://twitter.com/hashtag/PHP7?src=hash">#PHP7</a> is now available on Heroku and just your next push away - <a href="https://t.co/edGKyijFJy">https://t.co/edGKyijFJy</a> <a href="https://t.co/xs5LxUHmiN">pic.twitter.com/xs5LxUHmiN</a></p>&mdash; Heroku (@heroku) <a href="https://twitter.com/heroku/status/675137840183959554">2015, 12月 11</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

# 前提
git, composer, herokuの各コマンドが使える状態からスタートします。


# ローカルでインストール

```bash
$ composer create-project laravel/laravel --prefer-dist
$ cd laravel
$ php artisan serve
#=> Laravel development server started on http://localhost:8000/
```
http://localhost:8000 で動作します。

# gitの初期化

```bash
# apache用のProcfileを作成
echo 'web: vendor/bin/heroku-php-apache2 public' > Procfile

# gitします
$ git init
$ git add .
$ git commit -m "first commit for heroku"
```


# heroku アプリを作ってデプロイ

```bash
# アプリ作成 特に指定しなければPHP7になるようですが、この時Cedar-14と表示されないとPHP7で動かせません
# @see https://devcenter.heroku.com/articles/php-support#supported-versions
$ heroku create

# herokuにPHPだと認識させる
# composer.jsonとpackage.jsonが共存しているのでそのままだとnode.jsアプリとして認識されてしまう
$ heroku buildpacks:set heroku/php

# herokuの環境変数APP_KEYをセットします
$ heroku config:set APP_KEY=$(php artisan key:generate --show)


# デプロイ!
$ git push heroku master

#remote: -----> Using set buildpack heroku/php
#remote: -----> PHP app detected
#remote: -----> Bootstrapping...
#remote: -----> Installing system packages...
#remote:        - php (7.0.0)
#remote:        - Apache (2.4.16)
#（略）

# 確認します(ブラウザでアプリが開きます)
$ heroku open
```

Laravel5と大きく表示されていれば成功です。
レスポンスヘッダでも確認してみましょう。

```bash
# 作成されたURLに置換してください
$ curl -I https://xxxxx-xxx-xxx.herokuapp.com

HTTP/1.1 200 OK
Connection: keep-alive
Date: Sat, 12 Dec 2015 10:28:50 GMT
Server: Apache/2.4.16 (Unix) OpenSSL/1.0.1f
X-Powered-By: PHP/7.0.0
```

それっぽい感じで動いているようです。
一行も直さずに動かせるのは素晴らしいですね。
[JavaScript] Ajaxでファイルをアップロード【jQuery使用】

**jQuery の ajax() を用いたファイルのアップロード方法です。**
⇒ <a href="http://qiita.com/yasumodev/items/516de8445d254ab12cbf" target="_blank">jQuery を使わない方法はこちら</a>

# ![](//goo.gl/78mjX8) HTML

```html:HTML
<form id="my_form">
	<input type="file" name="file_1">
	<button type="button" onclick="file_upload()">アップロード</button>
</form>
```

【注意点】
ボタンに `type="button"` が無い場合は submit と見なされ、ボタン押下時に<font color="red">ブラウザーが勝手にアップロード</font>してしまいます(現画面を再更新)。そのため、下記 JavaScript によるアップロード処理中には意図しない status が返ってくるため、成功したり失敗したり、不可解な動きとなります。

# ![](//goo.gl/78mjX8) JavaScript

```js:JavaScript
function file_upload()
{
	// フォームデータを取得
	var formdata = new FormData($('#my_form').get(0));

	// POSTでアップロード
	$.ajax({
		url  : "http://your_site.com/upload.php",
		type : "POST",
		data : formdata,
		cache       : false,
		contentType : false,
		processData : false,
		dataType    : "html"
	})
	.done(function(data, textStatus, jqXHR){
		alert(data);
	})
	.fail(function(jqXHR, textStatus, errorThrown){
		alert("fail");
	});
}
```

# ![](//goo.gl/78mjX8) PHP

```php:PHP
<?php
// 一時アップロード先ファイルパス
$file_tmp  = $_FILES["file_1"]["tmp_name"];

// 正式保存先ファイルパス
$file_save = "/var/www/html/save/" . $_FILES["file_1"]["name"];

// ファイル移動
$result = @move_uploaded_file($file_tmp, $file_save);
if ( $result === true ) {
	echo "UPLOAD OK";
} else {
	echo "UPLOAD NG";
}
?>
```

(･o･ゞ いじょー。

# ![](//goo.gl/78mjX8) 参考URL

- <a href="http://hakuhin.jp/js/upload.html" target="_blank">ファイルをアップロードする｜JavaScriptプログラミング講座</a>
- <a href="http://qiita.com/BRS_matsuoka/items/ba79a2f500a10ddc0923" target="_blank">ajaxでファイルをアップロードする方法（メモ）</a>
Kintone チェックボックスをボタンとして使う

#チェックボックスをボタンとして使う目的
kintone 編集画面で、DOM操作で追加したボタンをクリックして、JavaScript の処理結果をkintone 編集画面に反映することは出来ません。
編集画面に反映するには、JavaScript API(イベント)処理で行う必要があります。
kintoneの部品にボタンがあればいいのですが、無いのでチェックボックスをボタンとして使おうというアイデアです。

※新デザイン版を追加しました。

#新デザイン版

![2016-12-28_10h30_15.png](https://qiita-image-store.s3.amazonaws.com/0/100572/13caf232-f95d-605e-54f6-5cfc2ad6015b.png)


文字の長さによって、 padding: 6px 40px 3px 30px !IMPORTANT; /* 文字位置 */　を調整してください。

```
.input-checkbox-item-cybozu label,
.input-checkbox-item-cybozu input:checked+label:after,
.input-checkbox-item-cybozu label:before {
    box-shadow: initial;
    margin-left: 0;
}
.input-checkbox-cybozu input{
    border: initial !IMPORTANT;
    padding: initial !IMPORTANT;
    width: 0px;
}
.input-checkbox-item-cybozu label {
    padding: 6px 40px 3px 30px !IMPORTANT; /* 文字位置 */
    margin-top: 3px;
    display: block;
    width: 40px;
    height: 24px;
    text-align:center;
    font-weight: bold;
    color: #fff;
    background: #3498db;
    -webkit-border-radius:4px;
    -mozborder-radius:4px;
    border-radius:4px;
    cursor:pointer;
}
.input-checkbox-item-cybozu:hover label {
    color: #fff;
    background-color: #1d6fa5;
}
div.input-checkbox-cybozu,
span.input-checkbox-item-cybozu {
    padding: 0 !IMPORTANT;
    height: 40px;
}
.input-checkbox-cybozu {
    /*color: #3498db;*/
    border: initial !IMPORTANT;
}
.input-checkbox-item-cybozu.focused {
    border: initial !IMPORTANT;
}
```


#旧デザイン版

![図11a.png](https://qiita-image-store.s3.amazonaws.com/0/100572/9d312a46-bb7e-1453-ba80-3c8940d2edc5.png)


「追加」、「クリア」ボタンが元々チェックボックスですが、CSSでボタンのように見せています。
チェックボックスをクリックするとフィールド値変更時イベントが発生します。
これで、JavaScript API(イベント)処理でサブテーブルにデータを反映することが出来ます。

#チェックボックスをボタンに見せるCSS 例
```lang:sample.css
span.input-checkbox-item-cybozu input[type=checkbox] {
    position: absolute;
    left: -9999px;
}
span.input-checkbox-item-cybozu label {
    display: block;
    width:100px;
    text-align:center;
    font-weight: bold;
    color: #fff;
    background: #0033FF;
    border:1px solid #003399;
    -webkit-border-radius:4px;
    -mozborder-radius:4px;
    border-radius:4px;
    padding: 5px;
    cursor:pointer
}
```
RubyMineでGitHubのpullするまで

チラシの裏程度に

pullしたいbranchにcheckoutする

command+shift+aでコンソール

git pullでpullウィンドウをだす

GitRoot:pullしてくるフォルダというかそんな感じのアレ。プロジェクト
CurrentBranch:現在のブランチ表示
Remote:リモートブランチの場所
BranchToMerge:pull元になるブランチを選ぶ。なんでかデフォルトだとCurrentBranchとおなじになってる。
Strategy:マージの方法とか決めるっぽい。細かいことはJetBrainが書いてる英語のヘルプを読んでくれー
後のは特に設定しなかったから割愛

注意
pull元とおんなじ場所を変更してる時はマージの衝突が起きてうまくいかない
エラーを読むとなんかstashがどうのとか書いてあったのでcommand+shift+aでコンソールだしてgit stashする。
んでもってなんかウィンドウが出てくるけどあんまり気にしないでCreateStashボタン押した。
そしたらpullできるようになってたよ。

gitについてよく知らないから何やってるかさっぱりだけどpull出来たので脳みそを猿以下にすることで気にならなくなった。

BranchToMergeの項目に関してはpullとかbranchをよく分かってないから不思議に思ってるだけかもしれない
apt-get update 時にHash Sum mismatch エラーが出力される場合の対処

# 履歴
2016/03/16: @noromanba さんの編集リクエストより、sed で書き換える例を追加

# エラーの事象 
apt-get update 時に次のようなエラーが出力されることがあります。


```text:HushSummismatchエラーの内容
Hit http://security.ubuntu.com vivid-security/multiverse Translation-en
Hit http://security.ubuntu.com vivid-security/restricted Translation-en        
Hit http://security.ubuntu.com vivid-security/universe Translation-en          
Fetched 525 kB in 6s (81.6 kB/s)                                               
W: Failed to fetch http://jp.archive.ubuntu.com/ubuntu/dists/vivid-updates/main/binary-amd64/Packages  Hash Sum mismatch

W: Failed to fetch http://jp.archive.ubuntu.com/ubuntu/dists/vivid-updates/main/binary-i386/Packages  Hash Sum mismatch

E: Some index files failed to download. They have been ignored, or old ones used instead.

```


# 解決法1: 参照しているリポジトリを変更してみる 
apt-get が参照しているリポジトリを別のものに変更することで解決する場合があります。
例えば、あなたのUbuntu がJP を参照しているのならば、それをUS に変更してみる手順は次の通りです。


```text:参照先リポジトリの変更
$ cd /etc/apt/
$ sudo cp sources.list /root
```

以下のコマンドを実行し、向き先をUS に変更します。

```sh:vimで開いて...
$ sudo vi sources.list
```

```vim:...vim内で一括置換・保存
" ex-command
:%s;http://jp.archive.ubuntu.com;http://us.archive.ubuntu.com;g
:wq " or ノーマルモードで ZZ
```

もしくは `sed` でバックアップと置換を一気に行います。

```sh:sed
# セパレータ ;  バックアップ sources.list.bak
$ sudo sed -i.bak -e 's;http://jp.archive.ubuntu.com;http://us.archive.ubuntu.com;g' /etc/apt/sources.list
```

リポジトリの向き先を変更したら、apt-get update コマンドを実行して、エラーが出ないことを確認します。


```text:apt-getupdateコマンドの実行
$ sudo apt-get update
```


# 解決法2: /var/lib/apt/lists ディレクトリ配下のファイルを一旦削除する 
apt-get update コマンドを実行した時にパッケージのリストが保存されるディレクトリ/var/lib/apt/lists 配下のファイルを一旦削除することで解消されるケースもあるようです。


```text:/var/lib/apt/lists配下の削除
$ sudo rm -rf /var/lib/apt/lists/*
```


削除したら、apt-get update コマンドを実行します。


```text:apt-getupdate
$ sudo apt-get update
```


# 参考 
<!-- FYI
- [UbuntuのHash Sum mismatch問題](http://d.hatena.ne.jp/ytooyama/20150512/1431440734)
- [Trouble downloading packages list due to a “Hash sum mismatch” error](http://askubuntu.com/questions/41605/trouble-downloading-packages-list-due-to-a-hash-sum-mismatch-error)
-->

<dl>
  <dt> UbuntuのHash Sum mismatch問題</dt>
  <dd> http://d.hatena.ne.jp/ytooyama/20150512/1431440734</dd>
</dl>

<dl>
  <dt> Trouble downloading packages list due to a “Hash sum mismatch” error</dt>
  <dd> http://askubuntu.com/questions/41605/trouble-downloading-packages-list-due-to-a-hash-sum-mismatch-error</dd>
</dl>
すべてがfになる〜整数型のない世界

:::note warn
2022年時点での追記
ES2020でJavaScriptに`bigint`という、整数専用の型が加わっています。
ただし、既存コードに影響を与えないような後付拡張として実装されたので、`bigint`は`bigint`どうしでしか演算不可、`bigint`と`number`（従来の数値型）の変換は`BigInt()`や`Number()`の変換関数を利用しなければならない、`Math`にある関数の引数や返り値も従来どおり`number`オンリー、というように、「できるだけ`bigint`と`number`が混ざらないような実装」となっています。

「整数型がない」という事情は変化しましたが、演算における`number`の性質は`bigint`登場後も全く変化していませんので、記事はそのまま残しておきます。
:::

多くの言語では、数値を入れる型として、整数と浮動小数点数など、いくつかの型が存在します。しかし、JavaScriptはそうではありません。

# 5 / 2 = ？
C言語を使っていると時々引っかかる話ですが、「整数型同士の演算は整数型になる」ということになっています。そのため、`5 / 2`を計算すると、切り捨てられて`2`になります。この挙動は、RubyやJavaでも共通します。そういうわけで、リテラルを書く時点で`5.0 / 2`のようにしておくなどの対策法が存在します。

一方で、PHPでは、整数同士の除算でも浮動小数点数を返しうるということになっています。`5 / 2`は2.5です。

JavaScriptでも、`5 / 2`は2.5になるのですが、これはそもそも意味が違います。JavaScriptの世界には**整数型がない**[^1]ので、浮動小数点数の5を、同じく浮動小数点数の2で割ったという意味になって、答えは2.5です。

# ビット演算は…？
もちろん普通の演算ならば、整数でも浮動小数点数でも計算はできます。ただ、JavaScriptの演算子の中には、ビット演算やシフトなど、明らかに整数であることを前提としたものもいくつか存在しています。いったい、どうなっているのでしょうか。

実は、これらの演算子は、概念的には

0. オペランドを整数に変換する
1. 整数同士でビット演算やシフトを行う
2. 得られた値を浮動小数点数として書き戻す

という流れになっています[^2]。JavaScriptの数値型は、IEEE 754の64ビット浮動小数点数なので、精度は53ビットあります。ビット演算やシフト演算は32ビット整数として行いますので、値に誤差が出る心配なく格納できます。

あとで触れますが、この「ビット演算は整数として行う」ことを利用して、`x | 0`や`x >>> 0`で整数化してしまう、という手法があります。

# 整数化する方法
ということで、JavaScriptで整数を作りたい場合、意図的に変換をくわえて整数にする必要があります。なお、整数でない数の最大値は $2^{52}-0.5 = 4503599627370495.5$ で、これより大きな数はすべて整数となります。

まずは、ある意味「正攻法」にあたる、`Math`のメソッド群を見てみます。

* `Math.ceil(x)`…`x`以上で、最も小さな整数（すでに整数ならもちろんそのまま）。いわゆる「+∞への丸め」。
* `Math.floor(x)`…`x`以下で、最も大きな整数（すでに整数ならもちろんそのまま）。いわゆる「-∞への丸め」。
* `Math.round(x)`…`x`に最も近い整数（整数以下がちょうど0.5のときは切り上げ）。いわゆる「四捨五入」。

そして、先ほど書いたように、ビット単位の演算やシフト演算を行う場合、32ビットまで丸められますが、ルールが2つあります。

ビット反転（`~`）、ビット演算子（`&`、`|`、`^`）、符号付きシフト（`<<`、`>>`）の場合は、値は**符号付き**32ビットの値に丸められます。ルールは、以下のようになっています（規格書通りではなく、分かりやすさを優先した表現としています）。

0. ±∞やNaNのような特殊な値だった場合には+0として終了。
1. 絶対値が小さくなるように整数へ丸める
2. 値が-2<sup>31</sup>〜+2<sup>31</sup>-1の範囲内に収まらない場合は、2<sup>32</sup>の倍数だけ足し引きして、この範囲内に収める

ということで、`a|0`のようにして整数にすると、「0への丸めになる」ことと、「32ビット整数からはみ出した値の場合、わかりづらい挙動になる」ことに注意する必要があります。

なお、符号なしシフトの`>>>`については、**符号なし**32ビットへの丸めとなります。処理内容としては、上の符号付き32ビットの丸めと同じで、最後に「負の数なら2<sup>32</sup>を足して正にする」というような感じです。

# まとめ
複雑なので、表にまとめてみました。

|x | `Math.ceil(x)` | `Math.floor(x)` | `Math.round(x)` | `~~x`[^3] | `x >>> 0` |
|---|---|---|---|---|---|
|-2147483649.5| -2147483649 | -2147483650 | -2147483649 | 2147483647 | 2147483647 |
|-2147483648.5| -2147483648 | -2147483649 | -2147483648| -2147483648 | 2147483648 | 
| -1.5| -1 | -2 | -1 | -1 | 4294967295|
| -0.3| -0 | -1 | -0 | 0 | 0|
| 0.3 | 1 | 0 | 0 | 0 | 0|
| 0.5 | 1 | 0 | 1 | 0 | 0|
| 1.5 | 2 | 1 | 2 | 1 | 1|
|2147483647.5| 2147483648 | 2147483647 | 2147483648| 2147483647 | 2147483647 | 
|2147483648.5| 2147483649 | 2147483648 | 2147483649| -2147483648 | 2147483648 | 

ご覧のように、時たま-0が出現したり、正負逆転したりと、かなり複雑です。

[^1]: `TypedArray`という、バッファーを型付きでアクセスできるような仕組みはありますが、スカラーとしての整数型はありません。
[^2]: もちろん、実装によっては、内部的にそのまま整数で保管するなどの最適化を行なっていることはありえますが、それはプログラマー側からは見えません。
[^3]: 表組みのMarkdownの都合上、`x|0`と書けないのでこれにしてあります。`x|0`でも`x ^ 0`でも`x << 0`でも本質的に同じです。
AltSpaceVRにおける音声の扱いについて

AltSpaceVR（以降AltVRと呼びます）のエヴァンジェリストを自称するサメジ部長でございます。

今回のAltspaceVR Advent Calendar 2015の12日回ではAltVRにおける音声の取り扱いについて、やってて気づいたことをつらつらと書いていきたいと思います。

（投稿はここで終わっている、残りは今日中に来るだろう）
[paiza]C#のテストを楽に行う方法


### 超概要

Conditional属性と、Console.SetInを利用してテスト環境を作る。


### 解決したい問題

[paiza](https://paiza.jp/)の回答を送信する前にローカルで動作テストを行いたい。

が、テストを行うたびにサンプルの入力値をコンソールに打ち込むのは面倒。手入力はしたくないし、サンプルコードが複数あるとコピペも面倒。*楽したい。*

というわけで、サンプルの入力値をファイルから読み込むようにしてみました。
提出時とテスト時でコードを書き換えないで済むので「んほぉデバッグコード消し忘れたのぉおおおおお」という事故を減らすことができます。


### 開発環境

一部IDEの機能を使うので、開発環境を記します。
適当にいじれば、ほとんどの環境で同等の環境を構築できるはずです。

・Microsoft Visual Studio Community 2015

いじょ。


### 環境構築手順

1. プロジェクトにテキストファイルを追加する(sampleInput.txtとする)
    * プロジェクトを右クリック > 追加 > 新しい項目 > テキストファイル
2.  追加したテキストファイルのプロパティを編集する
    * 「出力ディレクトリにコピー」の値を「常にコピーする」or「新しい場合はコピーする」にする
3.  ビルド設定の「条件付きコンパイルシンボル」に「LOCAL_DEBUG」を追加する
    * プロジェクトを右クリック > プロパティ > ビルドタブ > 全般

sampleInput.txtには、paizaで公開されているサンプル入力値をコピペしておいてください。

んで、次のようなコードを利用することで、ローカルで実行するときは入力をファイルから受け取り、提出時は普通に？入力値を受け取ることができます。提出時にコードを書き換えないで済むのがオシャレ。

```csharp
namespace PaizaChallenge
{
  class Program
  {
    static void Main()
    {
      ChangeLocalDebugInput();
      
      // your code
      // ...
    }

    [System.Diagnostics.Conditional("LOCAL_DEBUG")]
    static void ChangeLocalDebugInput()
    {
      Console.SetIn(new System.IO.StreamReader("sampleInput.txt"));
    }
  }
}

```

サンプル入力セットが複数ある場合でも、ファイルを追加するだけでサクッとテストすることができます。

以上です。快適なpaizaライフを。

### 参考

> 17.4.2 Conditional 属性 (C#)
https://msdn.microsoft.com/ja-jp/library/aa664622(v=vs.71).aspx

> Console.SetIn メソッド (TextReader) (System)
https://msdn.microsoft.com/ja-jp/library/system.console.setin(v=vs.110).aspx


> 【C#】paizaの煩わしいテスト（入力処理）を自動化したい | Black Everyday Company
http://kuroeveryday.blogspot.jp/2014/11/paiza-TDD.html


### 疑問

入力に使ったStreamReaderはDisposeしなくても良いのでしょうか？

MSDNのサンプルコードを見てみると、特に開放処理はしていないようなのですが。。。

> Console.SetIn メソッド (TextReader) (System)
https://msdn.microsoft.com/ja-jp/library/system.console.setin(v=vs.110).aspx
> 
> > ```csharp
Console.SetIn(new StreamReader(args[0]));
```
最速を求めて

皆さまこんにちは！！

株式会社Gizumoで見習いエンジニアとしてお世話になっている長野です。
まだまだひよっこな僕からはこの業界で感じた大切だなと思うこと、意識していることを少しでも伝えられたらいいなと思います。

いきなりですが、「世の中って何でできているの？」からはじめようかなと思います。
これは主観なので、正解ではありませんが、僕は「信用」でできていると思います。よく「金」だとか「愛」だとか言う人がいますが、どれも還元すれば信用です。皆のことを理解し信用できれば世の中ラブ＆ピース、国境も無くなる事でしょう！
ですが、信用は掴むのは難しく、失うのは簡単なのですごく難しいです。信用を得るには価値を生み出さなければダメです。

**僕は普段から「速いは強い」と考えています。**

ビジネスでも先にコンテンツを提供した所が第一人者として、以後似たようなサービスが出てもスポットを当て続けられる、好きな人が出来たら誰よりも先に告白しないと他の人の所へ行ってしまう。麻雀では誰よりも先にテンパイして即リーチ！が基本(だいぶ信用とは関係ないな…)、何でも基本は「誰よりも速く先に」が重要です。「信用」を掴むひとつの手段として速さは結構大事だと思います。
そんなこと言うと、「資金があれば後出しの権利があるよね～」、「イケメンだったら関係ないよね～」とか反対意見が出てきそうですが、そのようなお問い合わせはNGでお願いします。

前置きが長くなりましたが、それではGizumoエンジニア Advent Calendar 2015、12日目スタートします！！

#目標を定める
よく聞く言葉ですが、すごく重要だと思います。これを意識していると意識していないとでは結果が全然違います。朝仕事前に「今日はこれくらいやろう」では駄目です、業務中も時々思い出すようにするともう最高です。僕の場合は「昨日の1.1倍消化する」、「昨日より10分早く終わらせる」を毎日目標に業務に取り組んでいます。実現不可能でない少しキツイ位の目標を具体的に持つと良いと思います。

##常に危機感を持つ
これはかなり大事です。僕もそうですが、テスト直前にならないと勉強しない、まだ企画始まったばかりだしのんびりいこうなど危機感が足りないと感じています。**最初から飛ばして後々楽をする**、僕自身これを意識して仕事のスピードが上がったと感じています。ただ、焦るのと危機感を持つのは別物ですので注意して下さい。焦ると最高のパフォーマンスが出来ず、どんどんどつぼに嵌ってしまいます。あくまで**意識的に危機感を持つ**これが大事です。

###ひたすら考える
とにかく考えましょう。どうしたら作業スピードが上がるか、どうしたら皆が仕事をやりやすくなるか、どうしたら皆が喜んでくれるかなどたくさん考えましょう。考えるのはタダです、しかも楽しいです！
現場が違うので共通した時短方法を提供できなくて申し訳ないのですが、**エレベーターは閉めてから回数を選ぶ**これをやるだけで0.5秒時間を短縮できます！これはくだらないですが些細なことも大事です。塵も積もれば山となるですね。

他には**憧れの人を見つけて、その人を真似る**とか、**しっかり話を聞く**などがあります。当たり前の事を偉そうにダラダラと述べさせて頂きました。

最後に僕からひとつアドバイスがあります。仕事は結果が大事です。結果を出すため(信用を得るため)に僕は「速さ」を重視し、それについて今まで書いてきましたが、普段は**結果より過程**を大切にすると良いです。結果主義は楽しくないです。**もっとそれまでの長旅を楽しみましょう！！**

以上となります。お付き合い頂き、ありがとうございました！！
BitVisorにVMMCALLを追加する


# はじめに
BitVisor にVMMCALLを追加する方法を説明します．
本日はオーストリアよりBitVisor 情報をお届けなので，ソースコードの動作確認などできてません．
それなのに関数名を手で直したりしてるので，多分どこか動かない部分があると思います．
でもまぁ，だいたいの感じはつかんでもらえるかと思います．

# VMMCALL って 何?
VMMCALL というのは，ゲストOSからVMMに機能を呼び出す機構です．
ゲストOSは`vmmcall` というCPU命令を発行することでVMMの機能を呼び出せます．
構造としては，アプリケーションレイヤからシステムコールを呼び出すのに似ています．

ゲストOSからVMM内の情報を取得したり，何か指示を出すのに有用な機能です．
BitVisor では，dbgsh(デバッグ用のシェル)などが，VMMCALLを用いて実現されています．

# VMMCALL を追加する方法

`core/vmmcall_hello.c` ってな感じのファイルを追加しましょう．
中身は以下のような感じで．

``` c:core/vmmcall_hello.c
static void
hello(void)
{
  ulong rbx;
  ulong ret = 10;

  /*引数の受け取り*/
  current->vmctl.read_general_reg (GENERAL_REG_RBX, &rbx);

  printf("Hello BitVisor!, arg1 = %d\n", rbx);

  /*戻り値の格納*/
  current->vmctl.write_general_reg (GENERAL_REG_RAX, (ulong)ret);
}

/* 関数の登録 */

static void
vmmcall_hello_init(void)
{
  vmmcall_register("hello", hello);
}
INITFUNC ("vmmcal0", vmmcall_hello_init);
```




# VMMCALL を呼び出す方法．

Makefile やらなんやら必要で，一から全部書くのは面倒なので，BitVisor 内ですでに定義しているVMMCALLをコピペして中を変えて，新しいVMMCALLを足してみましょう．
というわけで，VMMCALL をつかっているdbgshを拝借しましょう．

以下の準備はゲストOS上で行います．

まず，tools/dbgsh をコピー

```
cd ~/bitvisor/tool/
cp -r dbgsh hello
```

ファイル名の変更

```
cd hello
mv dbgsh.c hello.c
```

Makefile の変更
Makefile 内のdbgshをhelloに置換(sedとかM-%とかで)


windows 用のバイナリが不要な場合は以下を削除(この作業は要らないかも)
先頭3行
all: 行の my_vmmcall.exe
my_vmmcall.exe : の行とその次の行すべて



呼び出し側のコードのプログラムを以下のように書き換えます．

``` c:tools/hello/hello.c
static void
vmmcall_hello (int arg)
{
call_vmm_function_t f; /*vmm call に関する情報を格納*/
call_vmm_arg_t a; /*vmm call に渡す引数を格納*/
call_vmm_ret_t r; /*vmm call の戻り値を格納*/

CALL_VMM_GET_FUNCTION ("hello", &f); /*vmm call の名前から関数に関する情報を取得*/
/*エラー処理*/
if (!call_vmm_function_callable (&f)) {
	fprintf (stderr, "vmmcall \"hello\" failed\n");
	exit (1);
}
a.rbx = (long)c;                     /*引数を設定*/
call_vmm_call_function (&f, &a, &r); /*vmm call 呼び出し*/
return (int)r.rax;                   /*戻り値の取得*/
```

で，ビルドして動かしてみましょう．

```
$ make
```

BitVisor が動いてる状態で

```
$ ./hello
```

ってやれば動く(はず(はず))
RubyMineでbranchをmergeする

メモ書き程度に
いまいちマージについてよく分かってないのでチラシの裏ぐらいで読んでね

command+shift+aでコンソール起動

git branches入力

remotbranchesからmergeしたいbranchをcheckout as new localbranchでとってくる

取ってきたbranchにcheckoutされているのでlocalbranchesからmerge元のbranchを選択

サブメニューからmergeを選べばマージされるはず

マージが完了したらpushするのを忘れずに
私もTurnipのセットアップにはまったので、うまく行った方法をまとめました。


結構はまって、英語のドキュメントとか色々読んだのでまとめました。


# Gemfileにturnipを入れる
```ruby
group :test do
 gem 'turnip'
end
```

記述したら、

```bundle install```

# turnip_helper.rbを作る
turnip_helperとは、spec_helperみたいなものです。turnipがturnip_helperを自動で読み込んでくれるみたいです。

```shell-session
$ touch spec/turnip_helper.rb
```

ファイルを作成後turnip_helper.rbに以下のコードを書きます。

```ruby
require 'rails_helper'
# 後に作る_steps.rbというテストファイルを読みこむためのコード
Dir.glob("spec/steps/**/*steps.rb") { |f| load f, true }
```

# .rspecにturnipのためのオプションを追加
.rspecとは、rspecを実行するときにデフォルトでつけるオプションを定義して置ける場所です。
.rspecが無くても、手動でオプションをつけて実行すれば同じ結果が得られます。


.rspec

```
-r turnip/rspec
```

を追加。

※.rspecファイルがトップディレクトリになければ、 ```rails g rspec:install``` で作って下さい。
これで環境構築は終わったはずです。次から実際にテストを書いていきましょう。

# featuresディレクトリに、.featureファイルを作成
.featureファイルとは、テストシナリオを自然言語で記述するためのDSLです。
[gherkin](https://github.com/cucumber/gherkin)というライブラリを拡張したものらしいです。

```shell-session
$ touch spec/features/battle.feature
```

battle.feature

```feature
Feature: 戦闘
 Scenario: 柔い敵と戦闘
 Given "スライム" が現れた!
 When 勇者の攻撃!
 Then モンスターを倒した

 Scenario: 固い敵と戦闘
 Given "はぐれメタル" が現れた!
 When 勇者の攻撃!
 Then モンスターを倒せなかった
```

分かりやすいので、この例を使いました。

# bundle exec rspec

![スクリーンショット 2015-12-12 18.16.34.png](https://qiita-image-store.s3.amazonaws.com/0/71616/b919e14d-9750-5d13-825e-060885014589.png "スクリーンショット 2015-12-12 18.16.34.png")

現段階だとこんな感じでpendingのテストケースが出てくるはずです。
No such step と書かれているので、次に実際にシナリオに対応したstepを記述します。

# stepsディレクトリに、_step.rbファイル作成

```shell-session
$ touch spec/steps/battle_step.rb
```

battle_step.rb

```ruby
# coding: utf-8

MONSTERS = [
 ['スライム', 2],
 ['はぐれメタル', 500]
]

step ":monster が現れた!" do |name|
 @defence = MONSTERS.assoc(name).last
end

step "勇者の攻撃!" do
 @defence -= 3
end

step "モンスターを倒した" do
 expect(@defence).to be <= 0
end

step "モンスターを倒せなかった" do
 expect(@defence).to be > 0
end
```

できました。実は :monsterが、featureの"スライム"、"はぐれメタル"に対応しています。

# bundle exec rspec
![Kobito.5SOgYV.png](https://qiita-image-store.s3.amazonaws.com/0/71616/34b19fb6-2298-f568-01ff-5ea549318a34.png "Kobito.5SOgYV.png")

こんな感じででてきたら完了です。
次からは、turnipの文法と、capyaraを組み合わせて受け入れテストの自動化を進めていきましょう。
【備忘録】Pythonでの親ディレクトにあるファイルのimport

親ディレクトリに置かれているスクリプトファイルをimportしたい場合には、次のようにすると可能になります。この例では、親ディレクトに置かれているtools.pyファイルをimportしています。

```
>>> import sys,os
>>> sys.path.append(os.pardir)
>>> import tools
```

* os.pardirは、親ディレクトリを表す文字列定数となっています。
* sys.pathは、importするファイルを検索するパスを示す文字列のリストです。PYTHONPATH 環境変数と、インストール先でのデフォルトパスで初期化されます。ですので、sys.pathにimportしたいファイルのディレクトリを含めれば、適当なディレクトリに置かれているスクリプトファイルをimport出来ます。
当然、パーミッションの設定によっては、出来ない場合もあると思いますが。
Qlik Senseのブラウザキャッシュを消す（エクステンションが更新されない時の対策）

Desktop版で、Extensionを配置してから内容を更新しても反映されない場合があります。
そのようなときは、Qlik Senseのプロセスを終了した状態で、次のフォルダを消します。

C:\Users\<USERNAME>\AppData\Local\Temp\QlikSenseBrowserCache
[JavaScript] Ajaxでファイルをアップロード【jQuery不使用】

**JavaScript の XMLHttpRequest を用いたファイルのアップロード方法です。jQuery は使いません。**
⇒ <a href="http://qiita.com/yasumodev/items/cffb735f46ffd489a4db" target="_blank">jQuery を使う方法はこちら</a>

# ![](//goo.gl/78mjX8) HTML

```html:HTML
<form id="my_form">
	<input type="file" name="file_1">
	<button type="button" onclick="file_upload()">アップロード</button>
</form>
```

【注意】
ボタンに `type="button"` が無い場合は submit と見なされ、ボタン押下時に<font color="red">ブラウザーが勝手にアップロード</font>してしまいます(現画面を再更新)。そのため、下記 JavaScript によるアップロード処理中には意図しない status が返ってくるため、成功したり失敗したり、不可解な動きとなります。

# ![](//goo.gl/78mjX8) JavaScript

```js:JavaScript
function file_upload()
{
	// フォームデータを取得
	var formdata = new FormData(document.getElementById("my_form"));

	// XMLHttpRequestによるアップロード処理
	var xhttpreq = new XMLHttpRequest();
	xhttpreq.onreadystatechange = function() {
		if (xhttpreq.readyState == 4 && xhttpreq.status == 200) {
		    alert(xhttpreq.responseText);
		}
	};
	xhttpreq.open("POST", "http://your_site.com/upload.php", true);
	xhttpreq.send(formdata);
}
```

【補足】
`xhttpreq.onreadystatechange = function(){ };`
の部分は、

`xhttpreq.onload = function(e){ };`

または、

```
xhttpreq.upload.addEventListener("progress", function(e){ }, false);
xhttpreq.upload.addEventListener("load", function(e){ }, false);
xhttpreq.upload.addEventListener("error", function(e){ }, false);
xhttpreq.upload.addEventListener("abort", function(e){ }, false);
```

という書き方も出来ます。

# ![](//goo.gl/78mjX8) PHP

```php:PHP
<?php
// 一時アップロード先ファイルパス
$file_tmp  = $_FILES["file_1"]["tmp_name"];

// 正式保存先ファイルパス
$file_save = "/var/www/html/save/" . $_FILES["file_1"]["name"];

// ファイル移動
$result = @move_uploaded_file($file_tmp, $file_save);
if ( $result === true ) {
	echo "UPLOAD OK";
} else {
	echo "UPLOAD NG";
}
?>
```

(･o･ゞ いじょー。

# ![](//goo.gl/78mjX8) 参考URL

- <a href="http://hakuhin.jp/js/upload.html" target="_blank">ファイルをアップロードする｜JavaScriptプログラミング講座</a>
- <a href="https://developer.mozilla.org/ja/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest" target="_blank">XMLHttpRequest の利用｜MDN</a>
- <a href="https://developer.mozilla.org/ja/docs/XMLHttpRequest/Synchronous_and_Asynchronous_Requests" target="_blank">同期および非同期リクエスト｜MDN</a>
品質保証グループの「掟」

#はじめに
![c.jpg](https://qiita-image-store.s3.amazonaws.com/0/60913/0876475e-2f8d-ef30-e964-5d51fe968326.jpeg)

本記事は[アプレッソ Advent Calendar 2015](http://qiita.com/advent-calendar/2015/appresso "アプレッソ Advent Calendar 2015")の13日目の記事です。

アプレッソでは、DataSpider Servista などのパッケージ製品を開発しています。
開発部が開発を行っていますが、開発部とは別の部署に QA(品質保証)を専門に行うグループが存在します。

品質保証グループについては、[2014 年のAdvent Calender](http://qiita.com/advent-calendar/2014/packagesoftdev "パッケージソフトウェア開発 Advent Calendar 2014")の[15日目](http://dstn.appresso.com/developer/detail/?id=753 "QAチームって何ぞや？")の記事などで紹介していますので、よろしければご参照ください。

本記事では、そんな品質保証グループに存在する「掟」について、ご紹介します。

#掟とは
![nankin3.jpg](https://qiita-image-store.s3.amazonaws.com/0/60913/96394d74-fded-628e-023b-deb363582134.jpeg)


ユーザーが製品を選ぶうえでもっとも重要な要素の一つに「品質」が挙げられます。

そのため、品質保証グループでは「ユーザー目線」を大切にし、製品を触る第一ユーザーであるという意識をもって品質向上に取り組んでいます。

そんな品質保証グループが、今まで積み重ねてきた様々なナレッジを品質の向上につなげるため、明文化したものが「掟」です。

その掟の中から5つほど挙げさせていただきます。

##掟その一
![tanto.jpg](https://qiita-image-store.s3.amazonaws.com/0/60913/58b8e375-51cc-901d-a709-91449f728de0.jpeg)

<b>「『自分の仕事ではありません』と言ってはいけない。」</b>

一人一人が臨機応変に対応し「私の仕事」だと肝に銘じて仕事をした方がチームとしての推進力も向上し、何より自分のレベルアップにつながります。

また、一人一人が決められた範囲のタスクしかしないというスタンスだと、間にあるタスクがすっぽりと抜けてしまうリスクがあります。

全員でフォロー・協力しあうことで視野を広く持ち、多くのユーザーのニーズに応えられる製品を提供できるようにしています。

##掟その二
![ball.jpg](https://qiita-image-store.s3.amazonaws.com/0/60913/d036eaa1-3533-8f23-90b3-f20f8e6d7a9d.jpeg)

<b>「テストオーナーは、テスト内容について『知りません』とは言ってはならない。」</b>

テストセットとして、「ユニットテスト」「互換性テスト」「チェックリストテスト」など、様々なテストセットがあり、それぞれ担当者をアサインしています。

また、DataSpider Servista では多様な接続先があるため、接続先毎(アダプタ毎)に担当者が存在します。

担当を変更することで属人化の防止や業務効率化につながるため、定期的にアサインを変更しますが
アサインされたばかりでは、内容を完璧に把握することは難しいです。

そのような場合でも、質問を受けた際にはプロの意識をもって真摯に対応すべきです。
それが、真に自分のものとする近道です。

##掟その三
![eibun.jpg](https://qiita-image-store.s3.amazonaws.com/0/60913/803867b2-b895-9d75-c869-528939ce8515.jpeg)

<b>「外部公開するドキュメントは作成者が文書校正ソフトでチェックすべし」</b>

文書校正ソフトを導入しており、作成した文書については必ずチェックを行うようにしています。
文書は人力で確認するには限界があるため、機械的に確認できる手段を取っています。

独自に作成した辞書を登録することもでき、業務毎に特化した校正を行うことができ、一定の品質を保てるためオススメです。

当然、この記事も文書校正ソフトでチェックしています。

##掟その四
![two.jpg](https://qiita-image-store.s3.amazonaws.com/0/60913/5a945abf-3393-e097-ef5b-39d516502ff0.jpeg)

<b>「テストは実施者とプランナー/レビュアーの2人1組体制とすべし」</b>

品質保証グループでは、必ず2人1組の体制でテスト作業にあたっています。
一人で作業を行うと視野が狭くなってしまい、テスト範囲を見誤るリスクがあります。

テスト作業以外、たとえばリリース作業でディレクトリにファイルを配置する作業にも、立会人を用意しています。

一人では気づけないことも、二人三人では気づけることもあるはずです。

様々なユーザーに対応するためにも、一人より二人、二人より三人でカバーしあうことで、より良いものを提供できます。

##掟その五
![siryo.jpg](https://qiita-image-store.s3.amazonaws.com/0/60913/b4c47c88-da4b-a573-4f60-e1506f01f76a.jpeg)

<b>「実施がつらいと感じるテストは設計を見直すべし」</b>

テストとは、存在しないかもしれない不具合を探す地道な作業であり、仮にテストがすべて完了したとしても、単に見つからなかっただけかもしれません。

肉体的精神的にもつらい作業になることもあることでしょう。

とはいえ、明らかに負荷が高かったり不合理だと感じた場合は、元々のテスト設計に問題があり見直す必要があるかもしれません。

目の前に用意されているテストを着実にこなすことは重要です。しかしそれ以上に必要なのは、今のやり方がベストかどうか検討し、改善していこうとする取り組みが非常に大切です。

#最後に
![pen.jpg](https://qiita-image-store.s3.amazonaws.com/0/60913/7f436b82-74dc-416d-2a31-e115b32337e0.jpeg)


本記事では、一部の掟を紹介させていただきました。

掟というとなんだか厳しい印象を受けるかもしれませんが、ご覧いただいた通り仕事の取組み方や具体的な作業に関連する内容などであり、特殊な内容ではありません。

今まで培ってきた経験や手法を全員が共有し、経験の浅いメンバーでも質の高い作業を行うためには先人の知恵を明文化することが助けになります。

特定の人の知識や経験に依存している場合は、「掟」という形ではなくても明文化するという作業をしてみてはいかがでしょうか。
esp-open-rtosのススメ

皆さん、[ESP-WROOM-02](https://www.switch-science.com/catalog/2346/) をお使いでしょうか。ESP-WROOM-02 を使う場合、[Arduino IDEを使う](http://ehbtj.com/electronics/esp8266-as-arduino)のが、簡単かとおもいます。簡単なのは良いのですが、色々と開発を行う面で不都合がでてきます。

この記事では、esp-open-rtos というリアルタイムOSをオススメする理由を書きたいと思います。

# リアルタイムOSの必要性

[リアルタイムOS](https://ja.wikipedia.org/wiki/%E3%83%AA%E3%82%A2%E3%83%AB%E3%82%BF%E3%82%A4%E3%83%A0%E3%82%AA%E3%83%9A%E3%83%AC%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0)というのは、リアルタイム性のある組み込みOSです。が、ここではそのリアルタイム性には特に注目しません。
Arduino の開発をしていて不便なのは、、色々とありますが、スレッドが無いことでは無いでしょうか。それは、MPUの制限なので、どうしようもないのですが、複雑なことをすると、コードの管理が難しくなる場合が有ります。
例えば、LEDを点滅するとします。
１つだと、、

```one-led-blink.ino
void loop() {
  digitalWrite(13, 1);
  delay(500);
  digitalWrite(13, 0);
  delay(500);
}
```

まぁ、OKなのですが、２つを別の周期で点灯させると？？

```two-led-blink.ino
void loop() {
  digitalWrite(13, 1);
  digitalWrite(11, 1);
  delay(250);
  digitalWrite(11, 0);
  delay(250);
  digitalWrite(11, 1);
  digitalWrite(13, 0);
  delay(250);
  digitalWrite(11, 0);
  delay(250);
}
```

などとなり、訳分からなくなります。もちろん、うまく書く方法もありますが、まぁ、こういった複雑性は、いつか問題になります。

いっぽう、esp-open-rtos を使うと

```two-led-blink.c
#include "espressif/esp_common.h"
#include "FreeRTOS.h"
#include "task.h"
#include "esp8266.h"

void blinkenTask1(void *pvParameters)
{
    gpio_enable(gpio, GPIO_OUTPUT);
    while(1) {
        gpio_write(13, 1);
        vTaskDelay(500 / portTICK_RATE_MS);
        gpio_write(13, 0);
        vTaskDelay(500 / portTICK_RATE_MS);
    }
}

void blinkenTask2(void *pvParameters)
{
    gpio_enable(gpio, GPIO_OUTPUT);
    while(1) {
        gpio_write(11, 1);
        vTaskDelay(250 / portTICK_RATE_MS);
        gpio_write(11, 0);
        vTaskDelay(250 / portTICK_RATE_MS);
    }
}

void user_init(void)
{
    xTaskCreate(blinkenTask1, (signed char *)"blinkenTask1", 256, NULL, 2, NULL);
    xTaskCreate(blinkenTask2, (signed char *)"blinkenTask2", 256, NULL, 2, NULL);
}
```

と分けて書くことができます。

# 通常の GNU C 環境である事

Arduino IDEは、導入は簡単ですが、Make など、ビルドスクリプトを使う事が出来ません。そのため、一部のライブラリの導入のハードルは高くなっています。
一方、esp-open-rtos は、一般的な、Gnu C / Make のビルド環境で開発できます。そのため、既存のCのライブラリの取り込みが簡単です。
esp-open-rtos のソースを見ていると、移植の仕方も見当が付くかと思います。
特に、 [mbedtls](https://github.com/SuperHouse/esp-open-rtos/tree/master/extras/mbedtls)の部分が分かりやすいです。
terraformのresource aws_ebs_volumeでattachしたいEC2 Instanceと同じAZに作成する方法

俺です。

resource `aws_instance` で作成したEC2へAttachするEBSを作りたい場合、

EBSはEC2と同じAZに作る必要があります。

どうするのが楽かというと、 `aws_instance` リソースのプロパティを指定するとよいです。

相変わらずGHEの俺俺リポジトリから抜粋ですが、こんな感じになります。

- EC2作成

```
resource "aws_instance" "prd-manage-1a" {
  ami = "${lookup(var.manage_ami, var.region)}"
  instance_type = "${lookup(var.manage_instance_type,"prd")}"
  key_name = "mykey-${var.region}"
  iam_instance_profile = "${lookup(var.manage_iam_instance_profile, "prd")}"
  source_dest_check = true
  ebs_optimized = "${lookup(var.manage_ebs_optimized, "prd")}"
  availability_zone = "${var.region}a"
  security_groups = ["${aws_security_group.prd-manage-1a.name}","${aws_security_group.common.name}"]
  root_block_device {
      volume_type = "gp2"
      volume_size = 64
  }
  count = "${lookup(var.manage_ec2_count, "prd")}"
  tags {
    Name  = "prd-manage${count.index + 1}-${var.az_1}"
    Role = "manage"
    Backup-Generation = "2"
    Environment = "prd"
    Service = "manage-demo"
    Attach_elb = "${lookup(var.manage_elb, "prd")}"
  }
}
```

- EBS作成
 
```
resource "aws_ebs_volume" "prd-manage-1a" {
  availability_zone = "${aws_instance.prd-manage-1a.availability_zone}"
  type = "${lookup(var.manage_extend_ebs_volume_type,"prd")}"
  size = "${lookup(var.manage_extend_ebs_volume_size,"prd")}"
  encrypted = "${lookup(var.manage_extend_ebs_volume_encrypted,"prd")}"
  count = "${lookup(var.manage_extend_ebs_count, "prd")}"
  tags {
    Name = "${lookup(var.manage_tag_Name, "prd")}"
    Environment = "prd"
    Role = "manage"
  }
}
```

後は必要に応じてattachリソース書けばよいですね。
[nrf52]NFCでURIの代わりにAndroidアプリを立ち上げる

nRF52の[NFC URIサンプル](https://github.com/NordicSemiconductor/nrf52-gtt-demos/tree/master/04a_nfc_url)をちょっと変更して、Androidアプリを起動させるようにしてみる。

アプリがインストールされていれば起動するし、なければGoogle Playの該当サイトに飛ぶ(勝手にインストールはされない)。

\#if 0したところが既存で、\#else側が書き換えたソースだ。
自分のアプリにするのは何かいやらしいので、Nordicの["nRF Master Control Panel"](https://play.google.com/store/apps/details?id=no.nordicsemi.android.mcp&hl=ja)にした。

    #if 0
        /* Create NFC message */
        nfc_uri_id_t id_www = NFC_URI_HTTP_WWW;         /* Choose protocol for the URL */
    
        err_code = nfc_uri_msg_create(id_www,
                                      (uint8_t *) url,
                                      sizeof(url),
                                      &p_nfc_msg,
                                      &nfc_msg_len);
        APP_ERROR_CHECK(err_code);
    #else
        /* AAR */
        uint8_t ndef[256];
        uint8_t *p = ndef;
        const char PACKAGE_NAME[] = "no.nordicsemi.android.mcp";
        const char EXTERNAL_TYPE[] = "android.com:pkg";
        
        *p++ = 0xd4;     //MB=ME=1, TNF=External
        *p++ = 15;       //"android.com:pkg"
        *p++ = (uint8_t)(sizeof(PACKAGE_NAME) - 1);
        memcpy(p, EXTERNAL_TYPE, sizeof(EXTERNAL_TYPE) - 1);
        p += sizeof(EXTERNAL_TYPE) - 1;
        memcpy(p, PACKAGE_NAME, sizeof(PACKAGE_NAME) - 1);
        p += sizeof(PACKAGE_NAME) - 1;
        nfc_msg_len = (uint16_t)(p - ndef);
        p_nfc_msg = ndef;
    #endif
JPAで%(ワイルドカード)を含んだlike句をsetParameterする

JPAで%(ワイルドカード)を含んだlike句をsetParameter()する時に少し困りました。 

---
#### **困った事**

こんなSQLを実行したい場合。

```sql:SQL
select * from user where user.name like '%keyword%';
```

JPQLで書くとこんな感じになりそうですが・・・

```java:JPQL
TypedQuery<User> query = entityManager.createQuery("SELECT u FROM User u WHERE u.name LIKE %:keyword%");
query.setParameter("keyword", keyword);
```

もしくは、シグルクォートで囲ってこんな感じ。

```java:JPQL
TypedQuery<User> query = entityManager.createQuery("SELECT u FROM User u WHERE u.name LIKE '%:keyword%'");
query.setParameter("keyword", keyword);
```


どちらも実行すると下記のようなエラーが出てしまいます :cold_sweat: 

```
ERROR o.h.hql.internal.ast.ErrorCounter - line 1:109: unexpected token: % 
antlr.NoViableAltException: unexpected token: %
```

  
#### **解決策**

こんな時はこうやるとうまくいきます.

```java:JPQL
TypedQuery<User> query = entityManager.createQuery("SELECT u FROM User u WHERE u.name LIKE :keyword");
query.setParameter("keyword", "%" + keyword + "%");
```

さらに英語の大文字・小文字の違いも吸収したい場合は、こうします。

```java:JPQL
TypedQuery<User> query = entityManager.createQuery("SELECT u FROM User u WHERE UPPER(u.name) LIKE UPPER(:keyword)");
query.setParameter("keyword", "%" + keyword + "%");
```
HEROKU APIをjQuery.ajaxで叩く

# はじめに
herokuのweb apiであるplatform apiを、jQuery.ajaxから実行する方法についてまとめました。

# 前提条件
* herokuのアカウントを持っている
* herokuの管理画面からAPI KEYを控える

# 実際のコード
```js
/**
 * herokuアプリを再起動する
 *
 * @param{String} apiKey APIキー
 * @param{String} appName heorkuアプリ名
 */
function restartHeroku(apiKey, appName) {
    $.ajax('https://api.heroku.com/apps/'+appName+'/dynos',{
        headers:{
            Accept: 'application/vnd.heroku+json; version=3',
            Authorization: 'Bearer '+apiKey
        },
        global:false,
        method: 'DELETE'
    }).then(function(){
        console.log('success');
    }).fail(function(){
        console.log('error');
    });
}
```

実行したAPIの仕様はこちら
https://devcenter.heroku.com/articles/platform-api-reference#dyno-restart-all

# 作ってみたアプリについて
上記コードは趣味で作ったheroku再起動アプリのものです。cordovaを使って作ってます。よろしければ、参考にしてあげてください。

https://github.com/kaidouji85/heroku-switch
研究室wikiを作った話

# やったこと
研究室で用いるwikiの作成

# 要件
リアルタイムにプレビューが見れる
理系の研究室ということで数式が入れられる
投稿がslackに通知される

# 使ったもの
rails
angularjs
markedjs
MathJaxjs
slackAPI

#やったこと
railsは基本的にユーザー認証やAPIの提供に従事
AngularでSPAの作成

Anggularのwatchとデータバインドによって簡単にリアルタイムプレビューが実現可能

```haml:form.haml
.editor
  %textarea#editor-area{'data-ng-model'=>'markdown.content', 'ng-change'=>'markdown_change()'}
.preview
  #preview-area.markdown-body{'ng-bind-html'=>"pre"}
```

```coffeescript:form.coffee
angular.module('RSLWikiApp').controller 'CreateWikiCtrl', ($scope, $state, marked) ->
  $scope.markdown =
    content: ''

$scope.markdown_change = () ->
  $scope.pre = marked($scope.markdown.content)
  previewElement = document.getElementById("preview-area")
  MathJax.Hub.Typeset(previewElement)
```

設計についてのツッコミはご勘弁を。。。
これくらいのコードの少なさで実現できるということをご理解いただければ

markedやmathJaxの使い方は以下を参照してください
http://qiita.com/amay077/items/704d48130e5cf17e8654
http://qiita.com/DUxCA/items/27b7b865a0ab28b5d530

これによってこんな感じに！
![!alt](https://i.gyazo.com/0610fc625ad348d178c030038cd8cc08.png)

## slack連携

gemにslack-notifierを追加
```rb:Gemfile
gem 'slack-notifier'
```

SLACK通知のモジュールを作成

```rb:model/concerns/lib.rb
module Notification
  extend ActiveSupport::Concern

  def slack_notify(text, channel)
    require 'slack-notifier'
    notifier = Slack::Notifier.new( ENV["SLACK_INCOMING_URL"],
                                    username: "Wiki bot",
                                    icon_url: "https://www.eff.org/files/FPG_icon_Wikileaks.png")
    notifier.channel = channel
    notifier.ping text, unfurl_links: true
  end
end
```

```rb:model
require lib
include Notification
.
.
after_create :notify_new_document
.
.

def notify_new_document
    message = <<"EOS"
#{user.name} wrote new wiki
Look at #{url}
EOS
    slack_notify(message, '#notify_channel')
  end

  def url
    "http://hogehoge.huga/#/wiki/#{id}"
  end
```

これによって記事が書かれるとこーんな通知が出ます
![04b1bf69398a0034d84fbfccd246a7c8.png](https://qiita-image-store.s3.amazonaws.com/0/37766/5b2aae68-92db-795e-fabe-6e9fbb25c4ed.png)


わ～楽しい
時間なくてまともに書けずすいません