OmniAICreator/Qiita-1.07M huggingface dataset:
arduino pro mini cloneでスピードメーター。

#概要
スピードメーター作ってみた。
3.3Vなので、oledと相性が良い。
調子に乗って、勝手に、0-100m、0-200mを計時する機能を付けた。
#写真

![MVC-007S.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/e50c0755-9be1-3b90-437d-10f363eb6f25.jpeg)

#オシロ
　クルマは、２００１年のルノー・クリオ・RSです。
計算すると、1回転に１０パルスとなります。
![MVC-002S.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/5c1e8b62-5e1f-fce4-d07f-fe5988012491.jpeg)

#回路図

![zero2.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/8238dfad-3682-7493-31c3-6d2c57178388.jpeg)

#サンプルコード

```
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define OLED_RESET 			4
Adafruit_SSD1306 display(OLED_RESET);
volatile unsigned long now0 = 0;
volatile unsigned long now1 = 0;
volatile unsigned long dis = 0;
volatile unsigned long dis0 = 0;
volatile unsigned long dis1 = 0;
volatile unsigned long dis2 = 0;
volatile int state = 0;
int cnt = 0;

void isr()
{
	now1 = now0;
	now0 = micros();
	if (state == 1)
	{
		dis = 181;
		dis0 = now0;
		dis1 = 0;
		dis2 = 0;
		state = 2;
	}
	else if (state == 2)
	{
		dis += 181;
		if (dis > 100000)
		{
			dis1 = now0;
			state = 3;
		}
	}
	else if (state == 3)
	{
		dis += 181;
		if (dis > 200000)
		{
			dis2 = now0;
			state = 0;
		}
	}
}
void setup()
{
	Serial.begin(115200);
	Serial.println("start");
	display.begin(SSD1306_SWITCHCAPVCC, 0x3c);
	display.clearDisplay();
	display.setTextSize(2);
	display.setTextColor(WHITE);
	display.setCursor(0, 0);
	display.display();
	attachInterrupt(0, isr, FALLING);
}
void loop()
{
	unsigned long now2 = now0;
	unsigned long now3 = now1;
	int gap = 0;
	int ds = 0;
	int speed = 0;
	int s = 0;
	gap = now2 - now3;
	ds = gap / 100;
	if (ds < 30)
	{
		speed = 0;
		cnt++;
		if (cnt > 8) state = 1;
	}
	else
	{
		speed = 6516 / ds;
		cnt = 0;
	}
	display.clearDisplay();
	display.setCursor(0, 0);
	display.print(speed);
	display.print("km/h");
	switch (state)
	{
	case 1:
		display.setCursor(0, 20);
		display.print("ready!");
	break;
	case 2:
		display.setCursor(0, 20);
		display.print("go go!!");
	break;
	case 3:
		s = (dis1 - dis0) / 100000;
		display.setCursor(0, 20);
		display.print("100m ");
		display.print(s);
	break;
	default :
		s = (dis1 - dis0) / 100000;
		display.setCursor(0, 20);
		display.print("100m ");
		display.print(s);
		s = (dis2 - dis0) / 100000;
		display.setCursor(0, 40);
		display.print("200m ");
		display.print(s);
	break;
	}
	display.display();
	delay(300);
}
```
Railsにマークダウンのリアルタイムプレビューを実装する

サンプルコードのclassはBootstrapのclassです。

## Vue.jsとmarked.jsを読み込む

```html:application.html.erb
<!-- Realtime preview -->
<script src='https://cdnjs.cloudflare.com/ajax/libs/vue/1.0.10/vue.js'></script>  
<script src='https://cdnjs.cloudflare.com/ajax/libs/marked/0.3.5/marked.js'></script>  
```

## formを編集

```erb:_form.html.erb

  <%= form_for @post, :url => {:action => :create} do |f| %>
    <div class="form-group">
      <%= f.text_field :title , class: 'form-control', placeholder: 'タイトルを入力してください'%>
    </div>
    <div class="form-group">
      <div id='editor'>
        <textarea name="post[content]" class="form-control" rows="20" v-model='input' debounce='50'></textarea>
        <div v-html='input | marked'></div>
      </div>
    </div>
  <% end %>


```


## _form.html.erbにscript追加

```erb:_form.html.erb
<script type="text/javascript">
  window.onload = function() {
    new Vue({
      el: '#editor',
      data: {
        input: '<%== j @post.content %>',
      },
      filters: {
        marked: marked,
      },
    });
  };
</script>
```

```input: '<%== j @post.content %>'```はeditの時にpost.contentをフォームに入れるためです。

## デザイン
CSSでうまくやってください

## まとめ
これだけでtextareaに入れた文字がリアルタイムで表示されます

＼**CDNじゃなくてGemで入れろよ！**／

すみません。いつか更新します。。。

たぶんこれです
[adambutler/vuejs-rails](https://github.com/adambutler/vuejs-rails)

＼**scriptじゃなくてapp/assets/javascript配下に書けよ！**／

すみません。いつか更新します。。。
ODPi(Open Data Platform Initiavies) 2.0リリース

# Open Data Platform Initiavies(ODPi)が12月14日（水）、ODPi 2.0をリリースしました。

おもにApache Hadoopを用いたアプリケーションの開発者に対して
アプリケーション管理ツールの一貫性を提供する動作仕様書の初版を発行しました。

   https://www.odpi.org/

ODPi2.0のリリース概要：
  - ODPi Operation Specifictionのリリース
    相互運用が可能な本アプリケーションのインストールと管理の仕様書はISVやサービス開発者がHadoopアプリケーションをパッケージング化する際の必要事項をカバーすることで保障するものです。アプリケーションはさらに特定のHadoop管理ツールを実装することによる機能を用いることも可能です。現仕様書はApache Ambariによって提供される拡張機能のみをかばーしますが、将来的にはその他の管理ツールもカバーしていきます。それらのツールはすべて実行環境としては、ODPi Runtime Specificationに準拠していることが必要です。

     参考URL:
     https://github.com/odpi/specs/blob/master/ODPi-Operations.md

  - ODPi Runtime Specification2.0のリリース
    Apache HadoopとApache Hiveに基づくプラットフォームについての仕様をカバーします。
    プラットフォーム上で動作するアプリケーションの互換性のガイドラインについて示します。

    ・Apache Hadoop 2.7 （メンテナンスリリースも含みます。）
    ・Apache Hadoop® 2.7, compatible filesystems (HCFS)
    ・Apache Hive

    利用のメリット
    エンドユーザ： 利用するアプリケーションやプラットフォームすべてで実行できます。
    ソフトウェアベンダー：互換性のガイドラインに従うことで、開発したアプリケーションがいかなるプラットフォーム上でも互換性があり動作します。
    プラットフォームベンダー： 互換性のガイドラインに従うことで、自身のプラットフォーム上で互換性のあるアプリケーションが実行可能となります。

     参考URL:
        https://github.com/odpi/specs/blob/master/ODPi-Operations.md
Go言語でJSON等のデータ形式にデフォルト値を用意する方法

###JSONのデフォルト値
JSONを構造体に読み込ませる場合に、常にすべての値を設定することはないと思います。
そういった値の中でももし設定がなかった場合に特定の値を設定したいということが、頻繁ではありませんがあると思います。
その場合は単にUnmarshal対象の構造体にあらかじめ設定しておけば、
JSON内でその値がない限り上書きされずにそのデータが残ります。

```go
package main
import (
    "fmt"
    "encoding/json"
)
type Gopher struct{
	Name string
	Price int
}

func main(){
	data := []byte(`{"price":1000}`)
	one := Gopher{"unnamed"}
	json.Unmarshal(data,&one)
	fmt.Println(one.Name)//==unnamed
}
```

###複雑なJSON形式
ちょっとしたものあればこれで問題ありませんが
これだけでは構造体のスライスなど、子のデータ構造には対応できません。
構造体のスライスなどに対してもデフォルト値を設定したい場合は
デフォルト値付きでパースする構造体として再定義しましょう。


```go
package main

import (
    "encoding/json"
    "fmt"
)

type World struct {
    Units []GopherWithDefault
}
type Gopher struct {
    Name  string
    Price int
}

type GopherWithDefault struct{ Gopher }//Gopherが持つ関数を必要としないのであれば、埋め込みでなくただの再定義でも問題なし

func (wdef *GopherWithDefault) UnmarshalJSON(b []byte) error {
    //もしGopherWithDefaultをポインタ型で持つのであれば、nilチェックをする必要がある
    *wdef = GopherWithDefault{Gopher{"unnamed", -1}}
    return json.Unmarshal(b, &wdef.Gopher)
}

func main() {
    data := []byte(`{"units":[{"price":1000}]}`)
    w := World{}
    json.Unmarshal(data, &w)
    fmt.Println(w.Units[0].Name) //==unnamed
}
```

埋め込み（もしくは再定義）なので引数に渡す際に元構造体を呼び出すかキャストしないといけないのでやや手間はありますが
どうしてもゼロ値と初期値を混在させたくない場合もありますし、
ゼロ値を初期値として扱わせるために変数の意味を改変するのは好ましくありません。（例えばIsDeadフラグをデフォルトでtrueにしたいからといってIsAliveにするなど。これくらいなら問題ありませんがHasWeaponとかになると名前付けが回りくどくなっていきますし、そういった実装のために仕様をずらすやり方は後半になればなるほど難しくなるのでそういった癖はつけないように気を付けましょう。）

ただ単にゼロ値と初期値を混在させたくないだけであればポインタで持つのもありです。
実際に持たせたい初期値がある場合にどうぞ。
型もデフォルトの状態が存在することを明示できるので可読性も上がると思います。

もちろんJSONに限らずUnmarshalを使用するようなデータ形式すべてに適用可能です。
今年Vueにお世話になったお話

メリークリスマス。
Vue.js Advent Clendar の24日目です。

本来ならVueでDnDを作ってネタにしようと考えていたのですが、
心が折れたのでプロジェクトでVueにお世話になった話をしたいとも思います。

特に具体的なプラクティスがあるわけでもなく、つらつらと思い出したことを書いていきます。
御免なさい。

# きっかけ

今年は仕事でプログラマとして初めて一つのパッケージを１から作る、というチャレンジがありました。
その中で、一部複雑なステートの管理やインターフェースを必要とする機能があり、JSのフレームワークを導入しよう！と決めました。

# 技術選定

もともと一人でスタートしたプロジェクトですが、のちのち、人が増えたり
自分が抜けてしまうことも考えられたので引き継ぎできるか？という観点を重視しました。

周りにフロントを主戦場とするのが自分一人しかいなかったため

* ビルドツールを使わない
* 検索で使える情報が引っかかる

を考えなければいけませんでした。

Npm周りのエコシスタム、GulpやWebpackみたいなものは本当に便利です、便利ですが、
頻繁なバージョンアップやベストプラクティスの変化などの理由から、
アンテナを常に張っておかなければプロジェクトのアキレス腱になる可能性が高いです。
なのでこれらのツールの使用を前提にしているようなものはNGとしました。

React は別にCDNファイルからライブラ入りを読み込んでJSXも使わずに書けばいいのですが、
コミュニティやネットに転がっている情報は明らかにそれらを前提にしていたのでパスしました。

結果として候補としたのは下の二つです。

* Vue
* knockout.js

どちらもメジャーバージョンが出てそれなりにAPIが固まっており、
何より、しっかりとしたドキュメントが用意されていて、それを入ればOKというのが魅力的でした。

特にVueは日本語ドキュメントがあるのが嬉しいですね。（結局原文を読みにいったりもしましたが）

またどちらも学習コストが少なめで、サンプルコードを見て30分程度でそれっぽいものを書き出すことができます。
１枚のHTMLとJavaScriptでライトに書かれているサンプルコードもネットにいっぱい転がっているため、学習自体もやりやすい、という印象でした。

今のいわゆる「流行り」からは大きくかけ離れた技術選定を行ったと思います。
自分でも思うことはたくさんあるのですが、チームの中でビジネスが回る方がはるかに重要でした。

## プロトタイピング

実際に二つのFWから一つ選ぶにあたりプロトタイプを繰り返しました。
書いた感じとしてはVueの方が後発なだけあり、書きやすい印象があったのですが、
knockout.jsは枯れていると感じたので二つをちゃんと検証することにしました。

また、

ドラッグ&ドロップ
（パレットからアイテムをドラッグして特定のエリアにドロップしてクローンみたいなややこしいことをやる）

を実装しなければならなかっため、それを実現するライブラリとセットで検証しました。
ドラッグ&ドロップを実現するライブラリとして

* jQueryUI
* Sortable.js

がメジャーどころかなと思います。非常に機能が豊富で困ることはないと思います。

いったん、

* knockout.js + jQueryUI

に決まりかけたのですが、jQueryUIにはMac Safariで座標計算がバグるという致命的な問題を抱えており、オジャンとなってしまいました。

結局あーだーこーだを繰り返して

* Vue + Sortable.js ( [vue-sortable](https://github.com/sagalbot/vue-sortable) )

に決まりました。
（結局この組み合わせでも不具合があり、vue-sortableには手を入れる羽目になりました）

ちなみに、一時期フルスクラッチでドラッグアンドドラッグを頑張りましたが、
データのやり取りが整理しきれずに挫折しました。ｼｸｼｸ

# 実装してみて

データバインディング楽しい！

が一番の感想ですね。2016年に何言ってんだって話ですけど。
jQueryで頑張ってた頃には戻れません。

複雑なデータのやり取りも、とりあえずFluxぽくrootのコンポーネントに処理を集めるようにすれば問題ありません。
大規模アプリケーション向けに [vuex](https://github.com/vuejs/vuex) というものもあるそうですが、
SPAにこだわらなければ必要ないのでは？と思いました。

またバリデーションで使った [vue-validator](https://github.com/kazupon/vue-validator) もドキュメントが非常に整っていて助かりました。

Vueの1.X系はDOMの管理をそこまできっちりやってないため、所々雑にjQueryを入れてっても問題なしです。

使ったvue-sortableもほぼsortable.jsの初期化くらいしかやってないので
ソースコードも [こんだけ](https://github.com/sagalbot/vue-sortable/blob/master/vue-sortable.js) です.

# 他案件での利用

学習コストｶﾞｰ、学習コストｶﾞｰと言って思い切って入れて見たVueですが、それを実証するために
新人のAくん（フロント経験なし）に他案件で使ってもらうことにしました。

見積もり計算用のインフェース実装で、選択肢によって動的に
見積もり金額が変わるというコンポーネントを作ってもらいました。

結果として０スタートで２〜3日で無事に完成しました。
ドキュメントが手厚かったので良かったのかな。

__Vueは学習コストが低い__ をちゃんと実証できて安心です。

# 今後

Vueに散々お世話になっておいてアレですが、来年からはReactをがっつりやって行きたいと思っています。
しばらくVueを触ることはないと思いますが、

* 導入障壁の低さ
* 小規模開発スピード

については他フレーワークから抜きん出て優れていると思います。

2がリリースされてVirtual DOMが導入されたりとどんどん進化しているみたいです。
いつか出戻りでお世話になることがあるかも、なんて思っています。
レスポンシブにも対応・CSSでフルスクリーンレイアウト

最近綺麗な画像を活用したフルスクリーンレイアウトのwebサイトが増えていますね！
私も最近、フルスクリーンレイアウトを実装することがあったのでその話をします。
今回は背景画像が全画面に表示され、コンテンツが縦横中央に配置されるだけのシンプルなレイアウトです。

Demo：
https://codepen.io/omaemi/full/rWgBGW/


".box" が画面フルサイズの要素で、".box" 直下の要素を縦横中央に配置します。  

```
<div class="page">
  <div class="box"> // 画面フルサイズの要素 
    
    // 中央寄せされるコンテンツ
    <p>
      LOREM IPSUM DOLOR SIT AMET,... 
    <p>

  </div>
  <div class="box"> 
  </div>
  .
  .
```


手順は以下の３つです。

1. 画面サイズいっぱいの要素 ".box" を作る
2. ".box" に背景画像を指定する
3. コンテンツの中身を縦横中央に配置する


# 1. 画面サイズいっぱいの要素 ".box" を作る
ここで使うのがvw(viewport width), vh(viewport height)という単位です。
これを使えばviewportをもとにサイズを指定でき、
画面サイズの幅=100vw
画面サイズの高さ=100vh
が指定できます。画面サイズ半分の高さなら50vh。


vw, vhのブラウザ対応状況
・Can I Use 
http://caniuse.com/#search=vw


これを知らない時はjsでウィンドウの高さをとってたなあ(遠い目)

ということで ".box" に100vh, 100vwを指定します。  

```
.box {
  width: 100vw;
  height: 100vh;
}
```

デザインによってはこれでも良いのですが、スマホなど小さいウィンドウで見た時に100vhをはみ出てしまうことがある場合は```min-height: 100vh;```とします。  

```  
.box {
  width: 100vw;
  height: auto;
  min-height: 100vh;
}
```

# 2. ".box" に背景画像を指定する

".box" のサイズいっぱいに背景画像を表示させるため

```
background-size: cover;
```
を指定します。(縦横どちらかはみ出た方が切り取られる)

また、画像の中央を表示させます。

```
background-position: center;
```
<br>

```
.box {
  background-size: cover;
  background-position: center;
  background-image: url('http://placeimg.com/850/530/animals');
}
```


# 3. コンテンツの中身を縦横中央に配置する

縦横中央に配置するために使うのがflexboxです。
画面サイズの要素 ".box" に対して、以下のプロパティを書くだけで、要素 ".box" 直下のコンテンツが縦横中央寄せされます。

```
.box {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  
  /* 左右中央寄せ */
  -webkit-box-pack: center;
  -ms-flex-pack: center;
  justify-content: center;
  
  /* 上下中央寄せ */
  -webkit-box-align: center;
  -ms-flex-align: center;
  align-items: center;
```

ちなみに左右は

````
justify-content: flex-start; // 左寄せ
justify-content: center; // 中央寄せ
justify-content: flex-end; // 右寄せ
```

上下は

````
align-items: flex-start; // 上寄せ
align-item: center; // 中央寄せ
align-item: flex-end; // した寄せ
````
で調整できます。

```position: absolute;```などで上下中央寄せするより直感的だし、absoluteだとコンテンツの量が多いと親要素からはみ出てしまうことがあるので、flexboxを使うことをオススメします！


flexboxのブラウザ対応状況
・Can I Use 
http://caniuse.com/#search=flexbox



あとはスマホで見た時、コンテンツが多い時にもギチギチになってしまわないように、paddingをしっかりとって終わりです！

```
.box {
  padding: 30px;
  box-sizing: border-box;
}
```

あと、どうやらiOSでiframeのスクロールが効かない問題があるらしく、".box" の親要素 ".page"に

```
.page {
  height: 100vh;
  overflow: scroll;
}
```
を指定していますが、iframeで埋め込まない場合はおそらくこれはなくてOKです！

ソースコード：
https://codepen.io/omaemi/pen/rWgBGW/


遅れてしまってすいませんでした。
メリークリスマスイブ☆
#ziplibを使ってC#からパスワード付きのzipファイルを扱ってみる

#はじめに

C#で#ziplib(sharp zip lib)を使ってパスワード付きのzipファイルを解凍したり圧縮してみたりするだけの記事です。
初投稿かつC#初心者かつ圧倒的な知識量の少なさゆえ、誤りなどがあるかもしれませんが、もし見つけたら指摘してくださるとありがたいです...
# #ziplibのダウンロード
http://www.icsharpcode.net/OpenSource/SharpZipLib/Download.aspx
こちらからダウンロードしてください。
ライセンスはGPLです。
#ファイルをパスワードを指定して圧縮する
パスワードを指定してファイルを圧縮するには以下のようにします。

```C#:password.cs
string password="password";
string zipfile="zipファイルのパス";
string directory="圧縮するフォルダのパス";

ICSharpCode.SharpZipLib.Zip.FastZip Zip =new ICSharpCode.SharpZipLib.Zip.FastZip();
Zip.Password=password;
Zip.CreateZip(zipfile,directory,true,null,null);
```

これだけで、ファイルを圧縮することができます。
任意のパスワードにしたい場合はpassword変数を任意の文字列に変更してください。

#zipファイルをパスワードを指定して解凍する。
パスワードを指定してzipファイルを解凍するには以下のようにします。

```C#:password.cs
string password="password";
string zipfile="zipファイルのパス";
string directory="解凍したファイルを置くフォルダのパス";
string filter="";

ICSharpCode.SharpZipLib.Zip.FastZip Zip =new ICSharpCode.SharpZipLib.Zip.FastZip();
Zip.Password=password;
Zip.ExtractZip(zipfile,directory,filter);
```

こちらもこれだけでファイルを解凍することができます。
圧縮する場合と同じようにpassword変数を変更すれば違うパスワードで解凍することができます。

#まとめ
CreateZipメソッドおよび、ExtractZipメソッドを利用すれば手軽にzipファイルの圧縮および解凍ができました。
SourceTreeに怒られたときの対処方法

# こんな人が対象
- [これだけは押さえておきたいGitの仕組み](http://qiita.com/nejiko96/items/5cc10af6d706fabd0c5c)を読んでも、  
SourceTreeにすぐ怒られる

# SourceTreeに怒られる原因はさまざま

- 自分がよく見るエラーの原因と対処方法をまとめました
- 自分の経験値の範囲内で書いているので、  
  あてはまらないケースもあるかも知れません

# チェックアウトできない

```
error: Your local changes to the following files would be overwritten by checkout:
	ファイル名
Please commit your changes or stash them before you can switch branches.
```

- 原因：作業コピーに変更がある状態で別のブランチをチェックアウトしようとしている
    - 対処その１：現在のブランチに変更をコミットする
    - 対処その２：新しくブランチを作って変更をコミットする
    - 対処その３：スタッシュに変更を一時退避させる
    - 対処その４：変更を破棄する（確認ダイアログの「クリーン(全ての変更を破棄)」をチェック）

# ブランチが削除できない

```
error: Cannot delete branch 'ブランチ名' checked out at 'ローカルリポジトリ'
```

- 原因：作業中のブランチを削除しようとしている
    - 対処：別のブランチに切替えてから削除する

```
error: The branch 'ブランチ名' is not fully merged.
If you are sure you want to delete it, run 'git branch -D ブランチ名'.
```

- 原因：どこにもマージされていないブランチを削除しようとしている
    - 対処その１：マージが終わってから削除する
    - 対処その２：強制的に削除(確認ダイアログの「削除を強行」をチェック)

# プッシュできない

```
error: failed to push some refs to 'リモートリポジトリ'
```

- 原因その１：リモートブランチに先に誰かの変更が入っている
    - 対処その１：プルをするとローカルにリモートの変更がマージされるので、
      プッシュできるようになる  
      しかし、該当のブランチが直接コミット禁止で必ずプルリクエストをマージする運用ルールだったら、  
      そもそもコミットしてはいけない
    - 対処その２：運用ルールに沿って変更を反映するには、以下の手順で仕切り直す
        1. フェッチ->SoureTereeでローカルブランチとリモートブランチが枝分かれした状態が見えるようになる
        2. ローカルブランチから作業用ブランチを作成
        3. ローカルブランチをチェックアウト
        4. ローカルブランチを枝分かれする前のコミットまで巻き戻す
        5. プル->枝分かれが解消
        6. 作業用ブランチをチェックアウト
        7. 作業用ブランチをプッシュ->プルリクエスト

- 原因その２：一度プッシュしたコミットを上書きコミットで変更した
    - 対処その１：一度プッシュしたコミットは変更してはいけない  
      ※他の人のコミットグラフが崩れてしまうため  
      変更してしまったのをなんとかするにはその２〜３を参照
    - 対処その２：自分しか見ていないブランチなら、
      こっそりリモートブランチを削除してプッシュし直してもけっこう平気
    - 対処その３：ブランチを誰かが見ているかもしれない場合は、以下の手順で仕切り直す
        1. SourceTreeで見るとローカルブランチとリモートブランチが枝分かれした状態になっている
        2. ローカルブランチを枝分かれする前のコミットまでまで巻き戻す
        3. プル->枝分かれが解消
        4. 変更を追加コミット->プッシュ
エロ案件

[「フリーランス残酷物語 Advent Calendar 2016」](http://qiita.com/advent-calendar/2016/free_zankoku)の21日目が空いていたのでポエムを置いておきますね。ちな、さすがに手持ちのネタはもうブラック過ぎて書けないのでありますが、２２日にまだ穴が空いています。残酷なネタをお持ちなフリーランスが現れる事を願います。

それはさておき、フリーランスをしていると変わったお仕事の相談がやってくる事があります。エロ案件もその一つだと思われます。ランサーさんの趣向によっては絶対受けないと決めているかたもいるかと思いまが、僕の場合は特にやらない理由もないので受けたりします。その時に感じた大変なところを書いておきます。

#背中を取られるな

フリーランスであればスターバックスに Mac を持ち込んで、ドヤッと仕事をする事が多いと思いますが、エロ案件の場合は席取りを気をつけなければなりません。

サーバーサイドを実装している場合は卑猥な日本語がコンソールに表示されるだけかもしれませんが、フロントエンドを実装している場合は１８禁画像が Mac に表示されてしまいます。

もしその画面を他のお客様に見られてしまった場合、通報されることも覚悟しなければなりません。通報されて警察に事情を説明するというのは作業効率を優先したいフリーランスとしては回避したい問題です。

そこで、まず絶対に守らなければいけないことは壁を背にすることです。できれは角の席がベストです。背後に回られたら抹殺される（社会的に）という気持ちで行動してください。

#家族との愛

仕事の話をどのように家族に伝えるかはエロ案件作業員としては難しいとこです。私の場合は妻がエロに偏見がないので伝えたうえで作業を行っていました。しかし、一緒に作業をしていた方は妻から「近づくな」と言われたそうです。

「近づくな」

つらいですね。

また「パパのお仕事ってなーに？」なんて聞かれでもしたら何て答えたらよいでしょうか。

家庭が崩壊しないためにも、家族への説明は事前によく考えておくことをお勧めします。

#そんな情報いらん

エロ案件はエロ企業との取引となりますので、エロ企業との打ち合わせ内容がこちらにも伝えられます。実装の内容だけ聞けるとよいのですが、やはり人間ですので会議中にエロ雑談も含まれ、それがこちらまで伝われる事もあります。

「打ち合わせに行ったら社内で撮影してた」

ふむ。

そんな日もあるのでしょうね。

#おわりに

エロ案件はデメリットがいくつかあります。これ以外だと同僚だった多摩美卒のゲームデザイナーさんが転職してAVのモザイク入れ作業をしたのですが勃たなくなったそうです。凄腕デザイナーだっただけに悲しい話です。

エロとハサミは使いようと言われるように扱いがちょっと難しいのがエロ案件です。フリーランスの方々には参考にしていただき今日もハッスルしていただければと思います。

それでは良いお年を
ChromeでRiot.jsを実行した時、Javascriptコンソールに「Fetching scripts with an invalid type/language attributes is deprecated...」と表示される場合の対処法

## 症状

Riot.jsを使用する際、次のような感じでHTMLに記載すると思います。

```html
<script src="tags/autocomplete/ac.tag.html" type="riot/tag"></script>
```

しかし、これをChromeでテストすると、次のような警告がJavascriptコンソールに表示されます。


「Fetching scripts with an invalid type/language attributes is deprecated and will be removed in M56, around January 2017. See https://www.chromestatus.com/features/5760718284521472 for more details.」

![エラー表示](https://qiita-image-store.s3.amazonaws.com/0/10290/fa692214-c971-4e2c-2c02-a021e7f9c6b5.png)


## 原因

Chromeの仕様変更により、`type="riot/tag"`で指定されたソースの、ブラウザの機構を使った事前取得が拒否されるようになるためです。Riot.jsは、別途、Ajaxを使って参照先のソースを取得していますので、このメッセージを放置していたとしても、将来アプリが動かなくなる！ということはありません。

詳細な経緯は、以下のIssueを参照してください。
https://github.com/riot/riot/issues/2132

## 対処

放置していても無問題ですが、警告が気になって仕方のない場合は、Riot.jsを3.0.3以降にバージョンアップしてから、srcを**data-src**に変更すれば、警告が表示されなくなります。

```html
<script data-src="tags/autocomplete/ac.tag.html" type="riot/tag"></script>
```

マニュアル：API · Compiler > riot.compile(callback)
http://riotjs.com/api/compiler/#a-namecompilea-riotcompilecallback

> Compile all tags defined with `<script type="riot/tag">` to JavaScript. These can be inlined script definitions or external resources that load scripts defined with src attribute (or data-src if you want to avoid the scripts prefetch in some browsers).
PySideでuiファイルが更新されたらpyファイルに自動変換する

QtDesignerを使って.uiファイルを作成していると、ファイルを更新するごとにpyside-uicでpyファイルに変換する必要があり、非常に面倒だ。

uiファイルが更新されたら、自動でpyside-uicで変換するスクリプトを書く。

## watchdogモジュールを使う

ファイルの更新監視はwatchdogモジュールを使う、非常に便利なモジュールである。
インストールはpipで簡単に行える。

```
pip install watchdog
```

次にuiファイルが存在するルートディレクトリにwatchdog_uic.pyというファイルを作る。

```python
#! usr/bin/python
# -*- coding: utf-8 -*-
from __future__ import unicode_literals, print_function, absolute_import
import os
import time
import subprocess
from watchdog.observers import Observer
from watchdog.events import PatternMatchingEventHandler

BASE_DIR = os.path.abspath(os.path.dirname(__file__))


class UicHandler(PatternMatchingEventHandler):
    def on_modified(self, event):
        ui_file = event.src_path
        output_file = os.path.splitext(ui_file)[0] + "_ui.py"
        cmd = " ".join([
            "pyside-uic",
            "-o " + output_file,
            ui_file
        ])
        print(cmd)
        subprocess.call(cmd, shell=True)


def main():
    while True:
        event_handler = UicHandler(["*.ui"])
        observer = Observer()
        observer.schedule(event_handler, BASE_DIR, recursive=True)
        observer.start()
        try:
            while True:
                time.sleep(1)
        except KeyboardInterrupt:
            observer.stop()
        observer.join()


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


上の例では.uiファイルを_ui.pyという命名規則に変更している。
命名規則のルールは各自実装してほしい。

```
python watchdog_uic.py
```

このスクリプトを起動しておくと、スクリプトファイル以下のディレクトリにuiファイルをすべて監視＆コンバートしてくれる。

半年ほど前からwatchdogで自動変換いるが、楽すぎてもう手動コンバートに戻れない。

# 追記 2017-01-06

[「最強のPySide/PyQt開発環境もPyCharmである」](http://qiita.com/pashango2/items/5d3c278f05ad151bfd5a)でPyCharm上で、自動変換する方法を書いた。
そちらも併せて参照されたい。
DistanceFieldスタイルをスプライトシートアニメに適用してみた2

![スクリーンショット 2016-12-24 11.54.38.png](https://qiita-image-store.s3.amazonaws.com/0/8302/10292fd0-dfa4-4b9f-088a-af1820f4629d.png)

こちらの記事の続きです。
http://qiita.com/harayoki/items/a8abbf48bac9d246787c

先の例ではまだ描画が汚かったのでやり直しました。

デモは同じくここに上がっています。(要FlashPlayerのためPCでしか見られません)
https://harayoki.github.io/StarlingDemoDistanceFieldStyle/demo1/index.html

上記最新デモを動画にしたものがここに上がっています。
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">先ほどのスムーズ拡大のやつ（DistanceFieldレンダリング）事前画像処理のやり方を変えたらものすごく滑らかになった。すごいな。<a href="https://t.co/RNGkftRAki">https://t.co/RNGkftRAki</a></p>&mdash; harayoki (@harayoki) <a href="https://twitter.com/harayoki/status/812228332552994816">2016年12月23日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

左のキャラクターが通常の描画方法で拡大したもの、右のキャラクターがDistance Fieldスタイル(シェーダー)を用いて拡大表示したものです。10倍程度拡大してもアウトラインがかなり滑らかです。
一方、目のように細いラインが出てくる部分に関しては荒れが出てしまっています。ここはパラメータをチューニングするか元画像であまり繊細なデザインを作らないなどの手段を取らなくてはいけなそうです。

#アウトラインが綺麗に表示される画像の作り方

前回の記事ではSpritesheet設定ファイルの座標設定を活かしたいため、等倍で画像変換をしたのですが、これがよくなかったようです。やり方を変えて４倍の大きさの連番画像をそれぞれ用意して、バッチ的に全てを変換、これを元にスプライトシートを生成しました。以下、具体的に説明します。

![スクリーンショット 2016-12-23 17.03.33_.png](https://qiita-image-store.s3.amazonaws.com/0/8302/3be06615-c35f-a5c1-c266-01a8643eb041.png)
AnimateCCで作ったアニメーションを連番画像を４倍の解像度にして書き出します。もっと大きくても良いかと思います。（スムージングは念のためoffにしました。）

今回の画像変換では４倍の画像を等倍に戻すので、スケール値は0.25倍を指定します。

```bash:
ruby field_agent.rb $file $outfile --scale 0.25
```

実際には連番画像に変換をかけないといけないので、１つ１つ手作業で実行しなくても良いように、下記のようなシェルスクリプトを用意して行いました。
カレントフォルダのpngファイル全てに対して接頭語として`df_`をつけた名前でDistance Field 形式の画像に変換をかけます。

```bash:makeDffImg.sh
for file in `\find . -maxdepth 1 -name '*.png'`; do
	outfile=`echo ${file/.\//.\/df_}`
	echo "$file -> $outfile"
	ruby field_agent.rb $file $outfile --scale 0.25
done
```

何度も実行すると変換後の画像に対してもさらに変換をかけようとするので注意です。シェルスクリプトなのでWindowsでは動きませんが、ここにおいてあります。必要あればカスタマイズして使ってください。
https://github.com/harayoki/StarlingDemoDistanceFieldStyle/blob/qiita161224/material/spritesheet/makeDffImg.sh

真横に変換スクリプト本体のfield_agent.rbが配置されている必要があります。
field_agent.rbはStarlingリポジトリで入手できます。
https://github.com/Gamua/Starling-Framework/tree/master/util/field_agent

![スクリーンショット 2016-12-23 17.38.15_.png](https://qiita-image-store.s3.amazonaws.com/0/8302/88ab826a-5b52-da78-f19d-c4e65ec175eb.png)
出来上がった Distance Field 画像は左のように白くてぼやけて小さいものになりますが、これでOKです。

![スクリーンショット 2016-12-23 17.46.45_.png](https://qiita-image-store.s3.amazonaws.com/0/8302/e455b4a8-26f6-aea2-7225-6d5d05f88849.png)
バッチ処理したので、実際はこのようにたくさんの画像が生成されています。

![スクリーンショット 2016-12-24 12.48.08.png](https://qiita-image-store.s3.amazonaws.com/0/8302/0066d64a-9c32-506b-b112-aef864b34361.png)
出来上がった画像をスプライトシートに変換をかけます。ここではTexturePackerを使っていますが、別のソフトでも良いです。TexturePackerは定番の良いソフトですが有料なので。

以上で出来上がったスプライトシートファイルをStarlingに取り込んだ後は前回の記事と同じやり方になります。

デモのソースファイルはここにあります。
https://github.com/harayoki/StarlingDemoDistanceFieldStyle/tree/qiita161224

以上です。

Distance Field Styleにはアウトラインがスムースになる機能の他に装飾をする機能があるのでそちらは別途投稿する予定です。

<img width="241" alt="スクリーンショット 2016-12-24 13.18.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/8302/8493fea3-5cca-1af3-6ac4-95a761e7861d.png">
dplyrで書けるRedshiftSQL!

この記事は[リクルートライフスタイル Advent Calendar 2016](http://qiita.com/advent-calendar/2016/recruitlifestyle)の24日目の記事です。

データエンジニアリンググループ・ゆるふわAwesome機械学習エンジニアのtomomotoです。弊社はリア充が多く、24日だけカレンダーが空いている状態だったので、24日12時53分現在から数少ないリア充ではないエンジニアとしてQiita記事を書き始めています。

本記事では、JapanR2016で発表したLTネタのdplyrで書けるRedshiftSQLについて書きたいと思います。（新しいネタ考える時間なんてありません！）

# dplyrで書けるRedshiftSQL
dplyrとは、R言語のライブラリで、データ処理を簡単にパイプ（%/%）を使って書くことができる神ライブラリです。実はこの神ライブラリをつかって、SQLを書かなくても直接RedshiftにSQLを投げることができるのです！イメージは下記の感じです。<img width="760" alt="スクリーンショット 2016-12-24 12.56.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/141254/8aa0cc10-e6a7-65f9-0b71-afefaf78d56a.png">

## 使い方
コード書き方はこうです。ね、簡単でしょ？

```r:connect_rs.R
library(dplyr)
library(RPostgreSQL)
myRedshift <- src_postgres(
 dbname="hoge",
	host = "XXX.XXX.XXX.XXX",
	port = XXX,
	user = "hoge_hoge",
	password = "hoge_hoge_hoge",
	options="-c search_path=hoge_schema_name")

rs_table <- tbl(myRedshift, from ="hoge_table")

rs_table %>% dplyr::filter(hoge_column = "abcd")
```

## どんなSQLに変換されているのか？
では実際dplyrのコードがどのように変換されているのか調べてみましょう！

----

```r
rs_table
```

```sql
SELECT * FROM hoge_table
```

----

```r
rs_table %>% 
select(a)
```

```sql
SELECT a AS a FROM hoge_table
```

----

```r
rs_table %>%
select(starts_with("a"))
```

```sql
SELECT a AS a, a_1 AS a_1
FROM hoge_table
```

----

```r
rs_table %>%
filter(hoge_no="33")
```

```sql
SELECT * FROM hoge_table
WHERE (hoge_no = '33') 
```

----

```r
rs_table %>%
head(3)
```

```sql
SELECT * FROM hoge_table
LIMIT 3 
```

----

```r
rs_table %>%
select(a) %>%
head(3) 
```

```sql
SELECT * FROM
(SELECT a AS a FROM hoge_table) xauvngdbsq
LIMIT 3 
```

----

```r
rs_table %>%
  group_by(a) %>%
  summarise(cnt=length(a)) 
```

```sql
SELECT a, LENGTH(a) AS cnt
FROM hoge_table
GROUP BY a 
```

----

```r
rs_table %>%
  group_by(a) %>%
  summarise(cnt=length(a)) %>%
  arrange(desc(cnt)) 
```

```sql
SELECT * FROM
(SELECT a, LENGTH(a) AS cnt FROM hoge_table GROUP BY a)
hjvzhxrrld
ORDER BY cnt DESC
```

----

```r
innerjoin(rs_table, rs_table, by=a)
```

```sql
SELECT * FROM (SELECT a AS a, ..... FROM hoge_table) uqhggwfohi
INNER JOIN
SELECT * FROM (SELECT a AS a, ..... FROM hoge_table) npoulssyev
USING (a)
```

----

```r
rs_table %>%
mutate(row_number=row_number(desc(a)))
```

```sql
SELECT a, b, ...,
row_number() OVER (ORDER BY a DESC) AS row_number
FROM hoge_table
```

----

```r
rs_table %>%
group_by(b) %>%
mutate(row_number=row_number(desc(a)))
```

```sql
SELECT a, b, ...,
row_number() OVER (PARTITION BY b ORDER BY a DESC) AS row_number
FROM hoge_table
```

## まとめ
- dplyrやっぱり神！(記述量減る)
- データを減らす処理をなるべく手前に(サブクエリで分割してしまうので・・・、いけてないですね)
- 関数系はRedshiftならだいたい担保(してそう)
- Join処理のSQLは、結構雑。自分で書いた方がいいかもしれない。

# 最後に
現在13:11！意外と時間かからず書けるものですね。みなさんは事前に書いておいてください。明日は、私が前もって準備しておいた記事です。
Samba ファイルサーバーから .DS_Store, Thumbs.db 系のファイルを抹消する（安直編）

つらいですねーこういうの。

```
[root@phy3 samba]# file ./mac20160828/Documents/pjt/pg1x/mx1/var/www/postfixadmin/._config.local.php
./mac20160828/Documents/pjt/pg1x/mx1/var/www/postfixadmin/._config.local.php: AppleDouble encoded Macintosh file
[root@phy3 samba]# file ./win10/K/Dropbox/Documents/projects/aaa_bot/.git/._sourcetreeconfig
./win10/K/Dropbox/Documents/projects/aaa_bot/.git/._sourcetreeconfig: AppleDouble encoded Macintosh file
```

本当は `file` コマンド実行した結果を判別してから消すべきなんでしょうが、 `._*` で引っ掛けて消すタイプです。
`cron.daily` に仕込んで終わりにしました。

```bash:/etc/cron.daily/metadata-buster.sh
#!/bin/bash
find /var/samba/ -type f -name "._*" -exec rm -f {} \;
find /var/samba/ -type f -name ".DS_Store" -exec rm -f {} \;
find /var/samba/ -type f -name "Thumbs.db" -exec rm -f {} \;
```
mysqlのエラーがなかなかググっても治らなかった話。多分バージョンの問題・

## 背景

homebrew経由でmysqlをダウングレードしようとした時に、いろいろエラーにぶち当たった。「まぁ、mysqlのエラーなんてよくある話だし、すぐ治るっしょ！」って思ってたらなんだかんだ30分ハマった。

ちまたにある情報は、mysql5.5 -> 5.6にあげるときのエラーだから、割と最新情報がなかなか見つからなかったので、アップデート。

バージョンは以下のとおり。これで足りるかな？

```
mysql : 5.6.34
MaxOS : Sierra 10.12.2
Homebrew 1.1.5
```

## やった手順

どの手順で進めていってエラーにはまったか。

1. ```brew install mysql #mysql 5.7系が入る ```
2. ```brew uninstall mysql # 5.7じゃなくて5.6系がいい```
3. ``brew install mysql@5.6```
4. ```sudo mysql.server start # エラー出る```


## エラー原因

1. 前に使ってたDB情報が、```/usr/var/local/mysql```内に残っていた
2. 実行権限がおかしい
3. プロセスがやたら立ち上がる

### エラー1: 前の情報を消す

DBのデータをそのまま消しちゃう。復帰できなくなっちゃうと困るから一応残しておいたほうがいいので、コピーをとっておく。

```
$ brew uninstall mysql
# DBのデータをコピー
$ cp /usr/local/var/mysql /usr/local/var/ex_mysql
$ rm -rf /usr/local/var/mysql/

$ brew install mysql@5.6
```

これで消えて、その後ちゃんと正常に5.6系と接続されるDBのインストール完了

### エラー２： 実行権限

チェックしなきゃいけなかったのは２箇所。

1. ```/tmp/mysql.sock```
2. ```/usr/var/local/mysql```配下

ここで大いにはまったんだけど、homebrewのバージョンによってか、ユーザーの実行環境によってか、意見が２通りある。

意見１: 両者の所有者を_mysqlにする。```sudo chown -R _mysql:_mysql /path/to/dir```
意見２： 両者の所有者をlocal のユーザーネームにする。

どうやってmysqlコマンドの実行者を調べればいいかはわからなかったんだけど、**同じディレクトリにいる他のファイルと所有者を合わせておけば問題ない**ことはわかった。

もう一個やらなきゃいけないのは、以下のコマンド。これはおそらく必須。

```
sudo chmod -R o+rwx /usr/local/var/mysql
```

### エラー３： プロセスがなぜかたくさん立ち上がる。

迷わずkill 

```
ps -ef | grep mysql 
kill -9 ID
```
で全部kill。これで動いた。
バックオフィス業務で委託先とのコミュニケーションをメールからConfluenceに変えてみた

# はじめに

この記事は、[Atlassian User Group Tokyo Advent Calendar 2016](http://qiita.com/advent-calendar/2016/augtokyo) 24日目の記事です。
Atlassian製品はプロダクト開発でよく使われますがコミュニケーションのツールとして良くできているので、当社では業務委託先とのコミュニケーションに使っています。今回はConfluenceで行っているコミュニケーションの例を紹介します。

# バックオフィス業務
業務委託先とは以下のようなところです。そうどの会社にもある総務部や経営管理部といったバックオフィス業務を担当している部門がお世話になっているサムライ業の先生たち（以下、委託先）とのコミュニケーションに使っています。

- 監査法人
- 税理士法人
- 社労士事務所
- その他...

# 具体的にどうやっているの？

## まずはConfluence利用の許可をもらう
バックオフィス業務でお付き合いする先生の中には、Eメールは組織内のみ使用可能というガチガチにセキュリティを固めている委託先もあるので、そのような方とは対面で会うしかありません。しかしEメールで情報をやり取り可能な方には「コミュニケーションのやり方を変えてみませんか？」と提案してみます。

そうすると下の画像のようにConfluenceでコミュニケーションできる委託先が増えていきます。お付き合いする委託先ごとにConfluenceスペースを作成していきます。自社要員は全ての委託先スペースを参照できますが、委託先は自らに割り当てられたスペースしか参照できません。（当面使用しない）と書かれているのは一時的にお世話になった、もしくは過去お世話になったとことです。
![spacedir.JPG](https://qiita-image-store.s3.amazonaws.com/0/35907/b62a4e8a-bb33-bb5c-d653-9c36f9e5e008.jpeg)

## スペーストップは？
スペーストップは全ての委託先でほぼ同じで以下のようになっています。

- メインコンテンツにはミーティング議事録や受渡しファイルが並びます。
- プロジェクトメンバーにはこのスペースにアクセスできるメンバー一覧。
- 定例ミーティングには、開催基本ルールや連絡事項を書いておきます。

![spacetop.JPG](https://qiita-image-store.s3.amazonaws.com/0/35907/46baa4a0-fe16-002b-bd78-69397a782df5.jpeg)

## コンテンツは？
下図は会計業務で利用しているコンテンツです。当社からの提出状況や委託先でのチェック状況が見えます。不明点や解決すべき課題があればコメント機能で会話できます。誰が何の資料を見てどのように判断している／判断したのかが全て記録されるので非常に便利です。
![report.JPG](https://qiita-image-store.s3.amazonaws.com/0/35907/8a6abddb-3b21-3966-f417-1eb77fe61909.jpeg)


# まとめ
委託先とConfluenceによるコミュニケーションを最初に始めた時、うまく行くか？と心配しましたが、結果から言うと全く問題ありませんでした。対面打合せの15分を使ってConfluenceの使い方を伝えると、後は委託先の先生方はConfluenceの使い方をぐんぐん憶えていきます。特に私たちがConfluenceで議事録を取りながら会議を進めると、先生方はすぐに覚えてしまいます（お世辞でなく、先生方は本当に賢い）。

委託先の先生たちからの評判も上々でEメールには戻れない。他のクライアントにも使いたいと言われています。Confluenceがバックオフィス業務でも生産性向上に役立ち時間を有効活用できるからだと思います。

それでは、メリークリスマス！
露出を変えた2枚の写真でHDR

####写真を撮ったのです。
ところがコートが黒だったので、逆光で顔がつぶれてしまいました。

![Blue.jpg](https://qiita-image-store.s3.amazonaws.com/0/147863/34504502-b365-94a7-85d6-a375e30b3ce8.jpeg)


どこかのサービスで明るくした写真を作ったら、空が白くなって、東京タワーも朱色になってしまいました。

![white.jpg](https://qiita-image-store.s3.amazonaws.com/0/147863/a86e2f06-fe4a-cdaf-0b2d-2fe9772ca693.jpeg)

これはなさけない。

####HDR
デジタルカメラを使った写真では、High Dynamic Rangeといって、露出の異なる複数の写真を合成して、ダイナミックレンジの向上した写真を撮影できるようになっています。
ところが、このHDRはフリーのサービスがあまりないうえに、使う写真は3枚以上とかで、今回の条件、すなわち写真が2枚、しかも露出を変えて撮影したのではなくて、撮ったあとに露出を変えた写真があるだけ、というのでは、そもそもHDRを構成する要素を満たしていないようです。
そこで、それなら自前でやってみようと考えました。

####OriginalHDR
白飛びしている空の部分にはオリジナルを使い、それ以外の部分は、加工ずみの明るい写真を使います。
空飛びとは、RGBのうち、Rが200以上、Gが200以上、Bが215以上の色をいうようです。ざっくり。

```C#
		bool IsFirstPhoto = true;
		Bitmap FirstImage;
		private void HDR(string path) {
			//最初に暗い写真を読む。
			if (IsFirstPhoto) {
				FirstImage = new Bitmap(path);
				IsFirstPhoto = false;
				return;
			}

			Bitmap SecondImage = new Bitmap(path);
			Bitmap aftertheImage = new Bitmap(SecondImage, SecondImage.Width, SecondImage.Height);

			for (int Y = 0; Y < SecondImage.Height; Y++) {
				for (int X = 0; X < SecondImage.Width; X++) {
					int pixcelData = SecondImage.GetPixel(X, Y).ToArgb();
					Color pixcelARGB = Color.FromArgb(pixcelData);
					int red = pixcelARGB.R;
					int green = pixcelARGB.G;
					int blue = pixcelARGB.B;

					Color sky = Color.FromArgb(0, 200, 200, 215);
					if (sky.R < red &&
						sky.G < green &&
						sky.B < blue) {
						pixcelData = FirstImage.GetPixel(X, Y).ToArgb();
						pixcelARGB = Color.FromArgb(pixcelData);
					}
					aftertheImage.SetPixel(X, Y, pixcelARGB);
				}
			}
			string saveFolder = Path.GetDirectoryName(path);
			string savefileName = saveFolder + @"\" + DateTime.Now.ToString("yyyy_MMdd_HHmm_ss") + ".png";
			aftertheImage.Save(savefileName, System.Drawing.Imaging.ImageFormat.Png);
		}
```



![Change.jpg](https://qiita-image-store.s3.amazonaws.com/0/147863/ecff4327-33a0-ec04-712e-dfeea1e202cc.jpeg)
Three.jsとphina.jsをつかおうとしてハマったこと

投稿が遅くなり、申し訳ありませんでした。

# 背景

Three.jsで息子たちとカーレースものをつくろうとしていて、
これとPhina.jsを併せてゲームらしく出来ないかとおもい、始めたが。。


# 座標系がThree.jsと異なっている

去年のアドカレでPhinaとThree.jsを組み合わせることが
出来るのを知ったので、やってみたが、
Three.jsベースで作っていたものをPhinaのレイヤーに
組み込んだところ、どうも、カメラの指定と表示される場所が
異なっているようだった。

three.jsのみでつくっていた際は、
x,yを0,0で指定すれば、画面中央に表示されたが、
phina.jsのレイヤーに組み込んだところ、画面の
中央に表示されず、左上に表示されるようだった。


試行錯誤のすえ、

```js
const layer = phina.display.ThreeLayer({
      originX: 0.25,
      originY: 0.25,
      width: options.width*2,
      height: options.height*2,
    }).addChildTo(this);
```

という指定をThree.jsのレイヤー作成時に行うことで、
Retina環境でもいい感じに3Dオブジェクトがレンダリングされ、
かつThree.jsの座標系でオブジェクトの位置指定が
行えた。

- [オプション付きでThree.jsレイヤーを使用した例](http://runstant.com/kjunichi/projects/53d9bf36)
 
# 終わりに

当初は、息子たちと作っているカーレースゲームを完成させて
これを元に記事にしたかったのですが、12月某日に担当している
システムのリニューアルがあり、このあと処理に追われる
日々を予想していたものの、なかなか時間が取れず、
来年こそは何か一つ完成した作品をつくってアドカレに
臨みたいところです。
SQLアンチパターン：ラウンディングエラー(丸め誤差)

[SQLアンチパターン](https://www.amazon.co.jp/dp/4873115892/)を読み始めたので、1つ１つ書いてのメモです

# 目的

- 目的:整数の代わりに小数値を使用する

# アンチパターン

- FLOAT データ型を使用する
  - 丸めが避けられない
  - 0.333.. のような循環少数がある
  - 有限精度となる

```sql
SELECT * FROM Accounts WHERE hourly_rate = 59.95;
-- 一致する行はない。59.95 は、59.950000762939 として格納されているから
```

浮動小数点数の誤差累積の影響は、和ではなく、積を計算する場合にさらに大きくなります

## 用いてもいいパターン

科学技術計算を行うアプリケーション

# 解決策

- NUMERIC 、DECIMAL データ型を使用する

```sql
ALTER TABLE Bugs ADD COLUMN hours NUMERIC(9,2); 
ALTER TABLE Accounts ADD COLUMN hourly_rate NUMERIC(9,2);
```

# まとめ

- 正確な 10 進数値が必要な場合は、NUMERIC を使う
- できる限り、FLOAT 型は使わないようにしましょう。

# 感想

- float 使ってた...

[![](https://images-na.ssl-images-amazon.com/images/I/41qHKrFZi0L._SX389_BO1,204,203,200_.jpg)](https://www.amazon.co.jp/dp/4873115892/)
ロボットにカレシ・カノジョはできるのか？



僕の、常識的なつまらない結論から、先に述べることにしましょう。

ロボットに、カレシ・カノジョはできるのかですって？　出来る出来ない以前に、ロボットには、カレシもカノジョも必要ないと思います。そもそも設問が愚問です。

つまんなそうな顔をしましたね。ところで、あなたは何故、彼氏・彼女を欲しがっているのでしょう？　もちろん、それをうまく語れないとしても、そのことは、実際に、あなたが恋することの障害にはなりません。ただ、「恋するロボット」を作るためには、その「感情」をキチンと説明できないといけません。

頑張れば、恋愛の「要件定義」出来るかもしれないって？　さすがAI好きのエンジニア。シンギュラリティ信じているんですね。シンギュラリティ越えるのに、ロボットに「恋愛」を教える必要ないと思うんだけど。　

じゃ、こんなロボット作ってみてください。

「あばたもエクボ機能を組み込んだ、恋は盲目ロボット」：　恋に目がくらみ、みなが、眉をひそめるのに、愚行を繰り返す、ロボット。
それがすんだら、「可愛さあまって憎さ百倍能力内蔵ロボット」：　オセロのように、愛する人を手にかけることも厭わない、嫉妬に狂うロボット。

そんなロボット、嫌だって？　それは、君の思い描く「恋愛モデル」が狭いだけだと思います。思い込みや幻想も、激情や嫉妬も、高揚感と幻滅と悔悟も、恋愛の不可欠のピースです。

現在のロボットは感情を持ちません。未来のロボットに、恋愛感情に限らず感情を導入することに意味があるかについては、僕は懐疑的です。「知的なロボット」は可能かもしれないし、役に立ちそうですが、「感情的なロボット」は、作るのが難しい上、試作品ができたとしても、その能力は、あまり魅力的なものになるとは思えません。

ただ、我々人間にとっては、感情は、我々個々人の多様性の源であると同時に、我々が相互にわかり合う「共感」を可能とする基礎でもあります。ですから、感情は、どんなに複雑で、時には支離滅裂で、矛盾に満ちていたとしても、我々人間には、なくてはならないものです。喜びや悲しみは、そして怒りでさえ、我々を豊かにします。それが奪われた時、その状態のもっともふさわしい形容は、「ロボットのような人間」だと思います。

そもそも、ロボットが、「カレシ・カノジョ」のような「性」を持つ必要があるのでしょうか？　

多くの動物は、「雌雄」の性の区別の上で、新しい個体の再生産として「生殖」を行います。もしも、未来のロボットが「生殖能力」を獲得するとしたら、そこでは、「雌雄」の性が必要になるでしょうか？ 多分、それは、必要ありません。ロボットが、自己複製の能力を持てばいいだけです。

生物の進化では、真核生物が登場して、核の中で減数分裂ができるようになったことが「性の起源」だと言われているようです。そこに行くまで、生命誕生から20億年くらいかかっています。その上で、はっきりした「有性生殖」が登場するまで、さらに10億年近い時間が必要でした。最近生まれたばかりのロボットが、有性生殖をする必要はありません。

有性生殖では、成熟したオスとメスが出会う必要があるのですが、それは、出会った半数とは交配できないことを意味します。全ての個体がメスである無性生殖と比べて、有性生殖では、繁殖効率は、半分になります。有性生殖は、コスト・パフォーマンスが悪いのです。それは、「性のコストの問題」と言われて、性をめぐる生物学的問題の一つの「謎」だそうです。もっとはっきり「オスのコストの問題」と言われることもあります。「オトコ必要なくない？」という疑問に、きちんと答えられていないということかもしれません。

ロボットが、自己複製能力を持ったとしたら、その進化したロボットは、生物学的なアナロジーでは、「女性」と呼んでいいはずです。オトコのロボット、必要ありません。

「ロボットにカレシ・カノジョはできるのか？」という問題に対する、「ロボットにカレシ・カノジョはできないし、その必要もない。」という僕の考えは、以上なのですが、もう一つ問題があるような気がします。

それは、「人間は、ロボットをカレシ・カノジョにできるのか？」という問題です。

有性生殖を行うほとんど全ての生物では、「生殖行為」と「性行為」は、一体のものです。生殖行為と区別して性行為を行う稀有な例外的な生物は、霊長類の一部、我ら人類とボノボだけだと言われています。ボノボの性行動については、ナショナルジオグラフィックの記事の「まとめ」である次の記事をご覧ください。「性の問題を力で解決するチンパンジーと力に関わる問題をセックスで解決するボノボ」http://bbs.jinruisi.net/blog/2013/06/1147.html　

この記事は、ボノボの社会的なコミュニケーションとしての性活動について肯定的に紹介しています。「私たちはどちらの系統に連なるのでしょう。平和を愛し、セックス好きで、雌が主導権をとる類人猿でしょうか、それとも好戦的で赤ん坊殺しも辞さない、雄優位の集団を作る類人猿でしょうか。」　Love & Peace ですね。それも、一つの見方です。

性行為の対象としてのロボットなりVRのシステムは、広がって行くと思います。

あっ、僕の話、今までつまんなそうに聞いていたのに、急に、興味出てきたみたいですね。

カレシ・カノジョできないエンジニアが沢山いるのなら、その一部は、そういう形で、ロボットをカレシ・カノジョにして行く可能性があります。その方が、現実的で手っ取り早く面倒も少ないと思う人が、増えて行くかもしれません。ただ、そうした傾向が何世代かに渡って続くなら、人類という種の存続にとっては、静かだが確実な脅威になりえます。

僕自身は、こうした「シンギュラリティ」は起きないだろうと感じています。だって、恋人は、ロボットより人間の方がいいに決まっていますから。

今年のクリスマス、カレシ・カノジョいなかったエンジニアの皆さん、来年こそは、カレシ・カノジョと過ごせるように頑張ってくださいね。
私は今年もみなさんに謝らないといけない

どうもカノジョできないエンジニアAdventCalendar2016の主催のたかぴーです。
まずはじめに、[昨年](http://qiita.com/shinichi-takahashi/items/07a0aee1548f1ef5a231)はすみませんでしたm(_ _)m


## 今年は...

そうなんです...またなんです...。
今年のタイミングは、このAdventCalendarを作った日でした。


## というわけで

私はお星様になってしまったので、直接あったタイミングで「書きたかったー」っていってくれた
地球の重力に魂を縛られた民代表として、代打 @localdisk に書いてもらいました。

[こちら](http://localdisk.hatenablog.com/entry/girlfriend-not-found)です。
ご査収ください。


## 謝辞
ホンマすんませんでした。。
ファイル名に含まれる文字列でファイルを分類する with バッチ

#【概要】
ファイル名にある特定の文字列を含むファイルをそれぞれディレクトリにコピーします。

今回はファイル名に「1」と「3」を含むファイルを分類しました。

#【プログラム】

```bat:ファイル分類.bat
@echo off

REM 遅延変数用
setlocal enabledelayedexpansion

REM ファイル名に含まれる対象文字
set targetName1=1
set targetName2=3

REM フォルダが既に存在する場合は削除する
for %%i in (%targetName1% %targetName2%) do (
  if exist %%i (
    rd /s /q %%i
  )
)

REM カレントディレクトリの中の全てのファイルについて分類する
for /r ./ %%i in (*) do (
  set fileDir=%%~dpi
  set file=%%~nxi
  if not "!file:%targetName1%=!" == "!file!" (
    call :copyFile !fileDir! !file! %targetName1%
  ) else if not "!file:%targetName2%=!" == "!file!" (
    call :copyFile !fileDir! !file! %targetName2%
  )
)
exit /b

REM ファイルをコピーする関数
:copyFile
set fileDir=%1
set file=%2
set targetName=%3
REM フォルダが既にあるかどうか
if exist %targetName% (
  REM ファイルが既にあるかどうか
  if exist !targetName!/!file! (
    cp !fileDir!!file! !targetName!/copy_!file!
  ) else (
    cp !fileDir!!file! !targetName!/!file!
  )
) else (
  md !targetName!
  cp !fileDir!!file! !targetName!/!file!
)
exit /b
```

#【実行結果】

実行前
<img width="426" alt="実行前.png" src="https://qiita-image-store.s3.amazonaws.com/0/121997/91728f32-5044-8aeb-8779-7e6d49d9770a.png">

実行後
<img width="426" alt="実行後.png" src="https://qiita-image-store.s3.amazonaws.com/0/121997/a59668ff-c9d4-01cb-7c41-e9494ae3e7cb.png">

圧縮しようとしたが、バッチではzip形式で圧縮できないみたい・・・。
**どうにかしてください！Microsoftさん！**
SketchUp > 立体分離の手順

```txt:動作環境
SketchUp Make v17.1.173
MacOS X El Capitan
```

http://qiita.com/7of9/items/806f287f032e600b2fcd
にて検討中の立方体の分離方法。

##　手順

以下で分離をすることができそうだ。

1. 分離したい部分をプッシュ・プルツールで前面に伸ばす
   - 接合部の長さ以上を伸ばす (例: 520mm for 500mmの接合部)
2. １の面の反対側からプッシュ・プルツールで押し出す (例: 520mm)
   - 平面一枚でつながった状態になる
3. ２つの立方体の結合平面を削除する
4. 分離面に長方形ツールで平面を足す
   - 内部が見えている状態なので
5. 分離した立方体を[選択 -> 接続するものすべて]で選択した後にグループ化
6. 分離した立方体を元の場所に戻す

Rubyスクリプトで組むとしたら、上記の内容を実装しないといけない。

## 半自動版

とりあえず以下で実装できた。
http://qiita.com/7of9/items/774a1d92184e9d9d7646

目的は果たせるので、自動版は追求しない。
PySideでお手軽にItemViewのインクリメンタルサーチを実装する

あまり知られていないが、Qtには標準でItemViewに対してインクリメンタルサーチする機構が備わっている。

```
QAbstractItemView::keyboardSearch
```

この機能があるので、何もしなくてもItemView上でキーボードを押すごとにアイテム選択が切り替わる。
しかしながら、現在の検索ワードが非表示でわかりにくい上に、IMEには対応しておらず日本語のアイテム検索は不可である。

従来の検索バーのようにQLineEditなどを作成し、適切なスロットを繋げてやればよい。

```python
line_edit = QLineEdit()
tree_view = QTreeView()

def _search(search):
    tree_view.keyboardSearch("")        # search clear
    tree_view.keyboardSearch(search)

line_edit.textChanged.connect(_search)
line_edit.returnPressed.connect(lambda:_search(line_edit.text()))
```

keyboardSearchを空文字で設定するのは、検索バッファをリセットするため。
もちろん日本語の検索も可能である。

# デメリット
お手軽ではあるがやはりデメリットはある。

QTreeViewでcollapse(折りたたまれた状態）されているアイテムは検索できない。
これはQtの仕様なので、あらかじめexpandAll()を呼んでおく。
Emacs org-mode チートシート

## Title - 見出し
```
* 見出し
** 子見出し
*** 孫見出し
```

### 見出しの編集
| キー | アクション |
|:--|:--|
| TAB | 見出しを隠す/見出しを展開 |
| M-RET | 新しい見出しを追加 |
| M-↑ | 見出しを前に移動 |
| M-↓ | 見出しを後に移動 |
| M-→ | 見出しのレベルを増やす |
| M-← | 見出しのレベルを減らす |
| M-S-→ | 子も含めて見出しのレベルを増やす |
| M-S-← | 子も含めて見出しのレベルを減らす |
| C-u C-u C-u TAB | すべてを展開して表示 |

## List - 項目

### 項目
```
- 項目1
  - 子項目1
  - 子項目2
- 項目2
```

### 番号付き
```
1. 最初の項目
2. 二番目の項目
```

### 名前付き
```
- 名前1 :: 内容1
- 名前2 :: 内容2
```

### 項目の編集
| キー | アクション |
|:--|:--|
| TAB | 項目以下を隠す/一段展開/すべて展開 |
| M-RET | 同一レベルで新しい項目の行を挿入する |
| M-↑ | 項目を上に移動 |
| M-↓ | 項目を下に移動 |
| M-→ | 子孫も含めて項目のレベルを増やす |
| M-← | 子孫も含めて項目のレベルを減らす |
| C-c C-c | 番号付き項目リストの番号を付け直す |
| M-q | 長い文章を整形(fill-paragraph) |

## チェックリスト
```
- [ ] チェック項目1
- [ ] チェック項目2
```

## 表

```
| 見出し1 | 見出し2 |
| 要素1 | 要素2 |
```

* TABをタイプすると整形される
* 横線の入力には「|-」を入力してTABをタイプする

### 表の編集

| キー | アクション |
|:--|:--|
| C-c - | 現在の行の下に横線を引く |
| M-↑ | 行を上に移動 |
| M-↓ | 行を下に移動 |
| M-→ | 列を右に移動 |
| M-← | 列を左に移動 |
| M-S-↑ | 行を削除 |
| M-S-↓ | 行を挿入 |
| M-S-← | 列を削除 |
| M-S-→ | 列を挿入 |
| M-RET | 入力欄を分割|


## オプション

| キー | アクション |
|:--|:--|
| #+TITLE: | タイトル | 
| #+AUTHOR: | 著者 | 
| #+EMAIL: | 著者のemail | 
| #+LANGUAGE: | HTMLの言語 | 
| #+TEXT: | ファイルの説明 (複数行も可) | 
| #+OPTIONS: | エクスポート処理の設定 | 
| H:2 | エクスポートする見出しのレベル数 | 
| num:t | 見出し番号の有無 | 
| toc:t | 目次の有無 |
Webサービスの改修って何やんの？

# はじめに
どーも！
KIT Developer Advent Calendarに参加させていただきます！

実際エンジニアってどんな働き方するの？って思ってる学生も多いと勝手に思い、
僕が経験したWeb改修を主にエンジニアとしての企画開発でのあれこれを話します。

ある程度まとめましたが、文章量多くなるかもしれないので
気になった点などを掻い摘んで読みましょう！（推奨）


現在進行形で運営されている大規模（？）サービスの開発にあたってどのような考えで何をやっていたかも参考になれば幸いです！

ただ、残念ながら僕の判断だけでは実際に開発したソースコードやデザイン改良部分は今回お見せできません...
もう企業のものだからね、仕方ない。
なのでCoffeeScriptに関してはおまけ程度で話そうかなと。

# CoffeeScriptとは

今回の経験した内容で使用した言語の一つです。
僕自身、これを深く学ぶのは初めてでした。

この言語仕様の全てを話すと長々しくなるし、他の記事もたくさんあるので自分が注目した部分を話す感じにします。
詳しく知りたいって方は[公式サイト](http://coffeescript.org/)で。

ものすごく簡単に言うと、JavaScriptを簡潔かつ安全に書けるように意識されたものです。

# どんな開発したの？

改修と言う名の通り、上司やデザイナーと企画しつつ、サービスの向上を目指しつつ開発していました！

まぁ実際行ったのはフロントエンドでの改修がほとんどですかね。なのでHTMLやCSSを書くことも多かった日々。



自分の技術欲求を満たしたい！って人からするとやりがいはあまり感じられない内容もあるとは思いますが、
個人的には**今あるサービスをどんな工夫をすればよりよくなるか**を考えていたので純粋に企画や開発が楽しかったですね。

順序としては
1. サービスを利用し、気になる点を探す。
2. 気になる点から改善案を幾つか企画して提案する。
3. 企画した内容の開発
4. 開発したもののテストを行い、本番環境へリリースする
5. 1へ戻る。

といった感じです。

企業によってエンジニアがどこまでの裁量を持っているかは変わりますが、うちだと割と大きめな裁量だと思ってます。
**サービスの企画から開発してそれを本番リリースする**までなかなかやらせてもらえないような。
個人的にはインターンだと開発からリリースまでだったり、企画から開発までできても本番リリースはあまりできてなかった感じはあります。



あと実はこれ、かなり簡潔にまとめてますが、実際はもっと多くの手順がありました。
幾つか焦点に当てて話しますね。

> 2.気になる点から改善案を幾つか企画して提案する。

単純に「これ気にくわねぇからこうしたいです。」と言った何の脈絡もない企画はNG。
どこがどういう理由で良くなくてこの改善案を出したのか、その改善案を出した理由はそもそも何か？とかも具体的に説明しないと説得力に欠けますし、何より改修前サービスを理解できていない証拠。
建設的に企画の提案をしなければ相手にとっても理解しにくいので結構時間をかけたポイントでした。

改善案を出した理由の例としては、
* 今現状でこの画面から次の画面までの遷移率が比較的少なかったため。
* ユーザがサイト内で最もクリックしたのが※※※だからこの表示を改修する。

わかりにくいかもしれませんが、このような提案をしてました。
数値とかで出てくるユーザ数を使うとより具体性を増すので意識するといいと思います。

> 4.開発したもののテストを行い、本番環境へリリースする

* テスト...開発したプログラムのバグ発見には必要な作業項目。


今まで業務系のインターンをあまりしてこなかったのもありますが、テストでの手順はかなり多く感じました。~~腑抜けた性格がよく分かる~~

純粋に企業としてサービスを運営するって大変なんだな、と体感できました。


まずチェック項目を事前に洗い出しましょう。
**漏れなく重複もなくテスト項目を洗い出す**、これ重要。
と言うのも意識して慣れておかないと大変と感じる人も多いのかもしれませんので、普段の開発で意識するといいと思います。
いうのは簡単ですが、実際漏れなくやるって意外と難しい。俺だけか？？

その後はテスト環境で各ブラウザ、各端末（android,ios）ごと入念に確認作業します。

##　改修としてのまとめ

今回は何個か焦点に当てて話してみました。

コンセプトとしては開発するにあたって大事なのは**根本的な企画内容とテスト。**
どうせ開発するならいいもの作りたいし、変なバグ残したくないよね。
KITの方なら仲間内でやっている人も多いのですが、意識して本当に仲間が改修する意味など理解しているか聞いてもいいのでは？

書けてない内容もたくさんあるのでまた機会があればお話しします。

# CoffeeScriptを使ってみて

* 簡潔に書けることが多いため、総合的な記述量が減った。

と言うか、これに尽きる。
RailsがデフォルトでサポートしているだけあってRubyっぽく簡潔に書ける部分があったのが最初の印象。
Python直伝インデントによるブロックもかなり読みやすくまとまるのも好印象。

JSよりも構成がシンプルになってるので読み易くて記述量が減ったというのがまとめです。

他の点は正直良いとは言えたものではないかな、と。
単純にJSとCoffeeScript双方を理解していないといけない、当たり前のことですが。
最初は別にCoffeeScriptじゃなくてもいいんじゃね？ということも思ったり思わなかったり。

学習コストがネックな部分な気がします。読みやすくなるし、書きやすくもなるのですが、果たしてそれに見合った恩恵があるのか、個人的には微妙なライン。

今後CoffeeScriptを学ぶのなら他言語にない、革新的に読みやすくなる機能とかが増えない限り学習するのに推奨しにくい、というのが総合的な評価です。

# まとめ

ということで今回はWeb改修（企画部分、テスト部分）を少し話してCoffeeScriptの評価をした記事でした。
この記事で少しでもWebサービスの改修をするというエンジニアの一つの仕事に対して理解ができたらなぁと思ってます。

そして今日はクリスマス・イヴです。KITの皆さんなら予定の1つや2つはありますよね！？
それでは楽しいクリスマスを〜
Ruby > ズンドコキヨシ by Ruby入門者

Rubyの文法を入門するには、**今ブームの**ズンドコキヨシしかないかと思われる。　

### v0.1 (間違いあり: doko表示抜け)

ideoneで実装してみました。
http://ideone.com/oV6zKW

```rb
zncnt = 0

for idx in 1..100
  elem = [*1..10].sample
  mdl = elem.modulo(2)
#  print(idx, ",", elem, ",", mdl, "\n")
  if mdl == 0 then
  	zncnt = zncnt + 1
  	print("zun,")
  else
    if zncnt == 4 then
    	print("doko,KIYOSHI!\n")
    	break
    else 
    	zncnt = 0
    end
  end
end
```

```txt:結果
Success	time: 0.02 memory: 9792 signal:0
zun
zun,zun,zun,zun,zun,zun,zun,zun,zun,zun,zun,zun,zun,zun,zun,zun,zun,zun,zun,zun,doko,KIYOSHI!
```

学習内容

- for文
- sampleによる乱数の取り方
- 剰余の取り方
- if文
- print文
- break文

参考　http://qiita.com/Konboi@github/items/e53296e99e297f83cfd1
参考　http://ref.xaio.jp/ruby/classes/array
参考　http://www.rubylife.jp/ini/numeric_class/index6.html
参考　http://www.rubylife.jp/ini/for/index9.html
参考　http://www.task-notes.com/entry/20141109/1415520719
参考　http://www.task-notes.com/entry/20141117/1416153598

### v0.2 doko表示追加

@mattnさんに指摘いただいた間違いを修正いたしました。
情報感謝です。

http://ideone.com/BolJ96

```rb
=begin
v0.2 2016/12/24
  - fix bug: did not show 'doko,' when the condition is not right
v0.1 2016/12/24
  - first code to print zundoko
=end

zncnt = 0

for idx in 1..100
  elem = [*1..10].sample
  mdl = elem.modulo(2)
#  print(idx, ",", elem, ",", mdl, "\n")
  if mdl == 0 then
  	zncnt = zncnt + 1
  	print("zun,")
  else
    if zncnt == 4 then
    	print("doko,KIYOSHI!\n")
    	break
    else 
    	print("doko,")
    	zncnt = 0
    end
  end
end
```

```txt:結果
doko,zun,doko,zun,zun,doko,zun,zun,zun,doko,doko,doko,doko,doko,zun,zun,zun,zun,doko,KIYOSHI!
```

上記ではバージョンコメントを追加しました。
コメントの書き方は以下を参考にし、`=begin`を使いました。
http://qiita.com/Mocacamo/items/318b193ded19fd37ffd6
SketchUp / Ruby > 立方体を分離したい / .mm > sketchup.rbにて定義されているのだろう

```txt:動作環境
SketchUp Make v17.1.173
MacOS X El Capitan
```

SketchUpでlaundry rackをデザインしている。　
NIC directでアルミフレームを購入して組み立てると、別の用途に使いまわしもできるかもと期待している。
今後20年の中の試行錯誤に役立つかもしれない。

以下のデザインでは、一体ものになっているが、矢印の部分を分離したい。
しかしその方法がよく分からない。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/e5de9b01-c6d2-cb1c-41a5-a3399254bc5a.png)

Ruby スクリプトを組めば分離できるのだろうか。
~~Rubyはまだ入門していない。~~
(追記: http://qiita.com/7of9/items/f0e22eeb584dbe144e31 にて入門してました)

Rubyスクリプトの例。
http://monge.tec.fukuoka-u.ac.jp/Ruby19x/skp_sample_01-5.html

```
pts1 = [700.mm, 0.mm, 0.mm]    # 頂点の座標
```

`.mm`という表記が面白いと思った。　
ideoneで実装したらエラーとなった。
http://ideone.com/zOcUPr
> prog.rb:1:in `<main>': undefined method `mm' for 100:Fixnum (NoMethodError)


`require 'sketchup.rb'   # ライブラリを読み込む`
にて読み込んでいるライブラリのようだ。

http://ruby.sketchup.com/Numeric.html

先が長そうだ。
分離の方法をもう少しgoogle検索するほうが早い気がした。
MACでPIXEL by raspbian起動用USBメモリを作って起動する

古いmac bookを再利用する為に「Raspberry Pi」のデスクトップ環境「PIXEL」をMACで起動してみます。

# ダウンロード
PIXELのイメージファイルをダウンロード。

```bash
$ curl -O http://downloads.raspberrypi.org/pixel_x86/images/pixel_x86-2016-12-13/2016-12-13-pixel-x86-jessie.iso
```


# iso → dmg 変換 
```bash
$ hdiutil convert -format UDRW -o pixel 2016-12-13-pixel-x86-jessie.iso
Master Boot Record（MBR: 0）を読み込み中…
Debian jessie 20161213-13:58    （Apple_ISO: 1）を読み込み中…
（Windows_NTFS_Hidden: 2）を読み込み中…
.................................................................................................................
経過時間: 10.546s
速度: 125.4Mバイト/秒
節約率: 0.0%
created: /Users/junya108/Downloads/pixel.dmg
```

# USBドライブ確認

```bash
$ diskutil list
```

# 書き込み

```bash
$ diskutil unmountDisk /dev/disk2
Unmount of all volumes on disk2 was successful
$ sudo dd if=pixel.dmg of=/dev/disk2 bs=32m
41+1 records in
41+1 records out
1387069440 bytes transferred in 254.778545 secs (5444216 bytes/sec)
$ diskutil eject /dev/disk2
```

# 起動
ALTキーを押しながらMacを起動してドライブを選択

![スクリーンショット 2016-12-24 9.32.15.png](https://qiita-image-store.s3.amazonaws.com/0/71312/95669b2e-70c4-66a5-22c2-953d59c24496.png)

![スクリーンショット 2016-12-24 9.32.32.png](https://qiita-image-store.s3.amazonaws.com/0/71312/b5f2d24d-03f9-912d-8bab-08d0f4a6db57.png)

![スクリーンショット 2016-12-24 9.33.56.png](https://qiita-image-store.s3.amazonaws.com/0/71312/9f613e46-295e-e39e-612f-d66e7cf0e6ff.png)
英語が出来ない、プログラミング用語が発音できない、発音できないから話せない、なんとならないか

<font color=red><b>結論：次のサイトなどを利用 → [読み方｜YOMIKATA](http://yomikata.org/)</b></font>

# はじめに
自分は英語が全然ダメです。
プログラミング用語なども発音がわからないことが多々あります。
コードレビューなり、人と話していてソースコードを読み上げるときなど、発音があやふやだと、ごにゅごにょっとごまかしつつ赤面したりなど。

ありませんか？

あるときだったか次のサイトが目に留まり、たびたび利用しています。
ただ、ネタ要素もあり、信じすぎない方がいいことも多々あるかと思いますので、ご注意を。
[読み方｜YOMIKATA](http://yomikata.org/)

以降は、雑記です。無視していただいて結構ですが、あるあるって思っていただければと思います。

# 雑記
## 結局何が正しいか
コミュニケーションは通じればいい派です。
が、技術者としてはそれではまずいケースもあるかと思います。
特に技術者同士で会話した場合に値踏みされてしまうなど。
出来れば、もっとも正しいとするようにしたいのですが、こだわりすぎると周りが白けたりも。
結局ケースバイケースなのでしょうか。

## null
読み方はやっぱり「ヌル」ですよね。
ネイティブスピーカー的には「ナル」なのでしょうけど、ものによってはネイティブな発音の方を覚えておいた方がいいような気もしますが、null はやっぱり「ヌル」がいいですよね。

## <kbd>Alt</kbd> キー
「オルト」ですよね。
Alt は Alternate の略だそうで、ネイティブスピーカーをカタカナにすると「オルタネイト」とのこと。
こうしたケースではネイティブに従ったほうがいい気がします。
しかしながら、「アルト」と発音される方が多い気がします。そうした時は、こまけぇことはいいんだよの精神で気に留めないようにしています。
だって自分も自然に読むと「アルト」ですし結構ずっとそのように発音していましたから。

## false
false のように「フォルス」か「ファルス」か。「フォルス」がいいようですが、どういうわけか記憶できず、いつも迷ってしまいます。
左右がわからなくなってしまったり、電気のスイッチがどちらがどちらかわからなくなる感覚です。
こういったケースもありますね。

# できたらいいな
## 読み方のみや強調巣にペットなどが簡単に表示できたらいいのに
ふと思ったのですが、Markdownでカーソルを合わせた際にポップアップ表示出す方法ってないんでしたっけ。
例えば次のようなイメージです。

```
ふと思ったのですが、{Markdown:マークダウン]で、特定の文字列にカーソルを合わせた際にポップアップ表示出す方法ってないんでしたっけ。
```

また、いっそのこと{}とか何かで囲うだけで、Googleでの[検索結果での強調スニペット](https://support.google.com/webmasters/answer/6229325?hl=ja-JP)がポップアップされるとか。
【イメージ】
***
![理想のイメージ](https://cdn-ak.f.st-hatena.com/images/fotolife/r/rrryutaro/20161224/20161224095816.png)
***

ついでに発音ボタンもついてきて、発音を読み上げてくれるとかあるといいのにと思った次第です。
自分でつくればいいのかな？


とりあえずは以上です。