OmniAICreator/Qiita-1.07M huggingface dataset:
pandasでread_csv時にUnicodeDecodeErrorが起きた時の対処 (pd.read_table())


pandasでCSVファイルを読み込む場合は`read_csv`するだけなので非常に便利です。

```python
import pandas as pd
pd.read_csv("file/to/path")
```

通常は上記で問題無いのですが、CSVの中にダメな文字があると以下のようなエラーを吐かれてしまいます。

```python
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x83 in position 0: invalid start byte
```

「デコード出来ねーぞ」ってお怒りの模様。

Excel作成のCSVは文字コードが「shift-jis」なので、一応読み込みの`encoding`でを指定してみますが、

```python
import pandas as import pd
pd.read_csv("file/to/path", encoding="shift-jis")

```

やっぱりエラー。ですよね。

```python
UnicodeDecodeError: 'shift_jis' codec can't decode byte 0x87 in position 0: illegal multibyte sequence
```

解決策としては、`codecs.open`で`ignore`を指定のうえエラーを無視して開いて、`pd.read_table`すると読み込めるみたい。

```python
with codecs.open("file/to/path", "r", "Shift-JIS", "ignore") as file:
    df = pd.read_table(file, delimiter=",")
    print(df)
```

`file.read()`とせずにそのままStreamReaderWriter objectのまま渡して良いみたいですね。

チョットハマって右往左往したのでメモまで。
NewRelicのmysqlプラグインが起動しない

## 問題
``` 
# ./npi list com.newrelic.plugins.mysql.instance
- com.newrelic.plugins.mysql.instance:
  - State:
      Downloaded   [x]
      Prepared     [x]
      Installed    [x]
      Running      [ ]

# ./npi start com.newrelic.plugins.mysql.instance
[19:40:23] [DEBUG] npi - Params: ["com.newrelic.plugins.mysql.instance"]
[19:40:23] [DEBUG] npi - Flags: {"_":["com.newrelic.plugins.mysql.instance"]}
[19:40:23] [INFO] operations - Starting plugin 'com.newrelic.plugins.mysql.instance' in background...
[19:40:23] [INFO] operations - Please visit https://rpm.newrelic.com to verify that the plugin is successfully reporting to your account. It may take a few minutes to become visible.
[19:40:23] [INFO] platform_helpers - Attempting to start service for 'com.newrelic.plugins.mysql.instance'...
Starting newrelic_plugin_com.newrelic.plugins.mysql.instance
```

## 解決方法
javaが入っていなかったのでインストールした。

## 結果
```
# ./npi list com.newrelic.plugins.mysql.instance
[22:10:55] [DEBUG] npi - Params: ["com.newrelic.plugins.mysql.instance"]
[22:10:55] [DEBUG] npi - Flags: {"_":["com.newrelic.plugins.mysql.instance"]}
- com.newrelic.plugins.mysql.instance:
  - State:
      Downloaded   [x]
      Prepared     [x]
      Installed    [x]
      Running      [x]
```
AtomとPlantUMLで爆速UMLモデリング


PlantUMLは、DSL(ドメイン特化言語)をコーディングすることでUMLが描ける、Java製のツールです。

今回はAtomとPlantUML Viewerパッケージを使い、ライブプレビューを見ながらUMLをモデリングする環境を作ってみました。

イメージ図↓
![GIF.gif](https://qiita-image-store.s3.amazonaws.com/0/64812/32569cb9-4d4e-1793-0607-6ae9359811d8.gif)

## 編集履歴
 * 2016/03/22: 中華フォント対策を更新

## 環境
 * Windows 10 Pro 64bit
 * Atom Version 1.0.10
 * Chocolatey v0.9.9.8（セットアップで使用）

※ この記事ではWindowsでのセットアップですが、MacやLinuxでもほとんど同様に実行可能かと思います。

## セットアップ

### ライブラリインストール
PlantUMLを使用するには、動作環境であるJavaとレンダリングライブラリのGraphvizのインストールが必要です。

Windows 10にしてから、そういえばJavaも入れてませんでした。。Chocolateyで入れてみます。

```
cinst jdk8 -y
cinst graphviz -y
```

PlantUML Viewerパッケージは、AtomでPlantUMLのプレビューするためのパッケージです。エディタのハイライト表示のためのPlantUML languageも一緒に入れます。（apmはAtomのパッケージ管理用CLIツールです）

```
apm install plantuml-viewer
apm install language-plantuml
```

### 文字化け対策

私の環境の場合、この状態で日本語を入力すると文字化けしました orz

文字化けは、PlantUML ViewerパッケージのSettingsにCharsetという項目があるので、ここに`UTF-8`を設定することで解消します。（Macだと文字化けしないのかな？）

![charset.png](https://qiita-image-store.s3.amazonaws.com/0/64812/4f8e6875-139e-414a-57c4-49e6225e1a6d.png)

これで文字化けは解消するのですが…

![china.png](https://qiita-image-store.s3.amazonaws.com/0/64812/76158b62-5018-ed6c-ff50-f89ad9857589.png)

**惜しい！ フォントが中華な雰囲気w**

デフォルトの<del>文字化けする要素の</del>フォント名を以下の様に指定しちゃえば、きちんと和風フォントになります。
私はエディタのフォントに[Ricty Dimished](https://github.com/yascentur/RictyDiminished)を使っているので、これを指定しました。

```
/' デフォルトのフォントをRicty Dimishedに設定 '/
skinparam defaultFontName Ricty Diminished
```

※初出では文字化けする要素種別ごとにいちいちフォント名を指定してたのですが、@asmさんから正しい対処方法を教えていただきました。

**もうこれで、爆速でUML描けます！**

PlantUMLのDSLに関しては、[PlantUML Cheat Sheet - Qiita](http://qiita.com/ogomr/items/0b5c4de7f38fd1482a48) がわかりやすくておすすめです。

ビートルズの"Hello, Goodbye"をシーケンス図にしてみました↓
![hello.png](https://qiita-image-store.s3.amazonaws.com/0/64812/ebe3357b-dc5e-4fa3-3c63-2d076a3e3c96.png)

※ 中華フォント現象はプレビューウィンドウのみで起きる現象で、プレビューウィンドウを右クリック＞Save As...でUML画像を保存して確認すると、中華フォントになりません。なので、気にならない方はそのまま使っちゃってもいいかもしれません。

## 参考資料
 * [PlantUML](http://plantuml.com/) : 公式サイト
 * [PlantUML Cheat Sheet - Qiita](http://qiita.com/ogomr/items/0b5c4de7f38fd1482a48) : チートシート。簡潔にまとまっていて見やすい。
 * [gulpを用いてplantUMLの生成自動化 - Qiita](http://qiita.com/maxmellon/items/08c8162f3769ce71dbd3) : 自動化手順。
 * [PlantUMLを自動変換してLiveプレビューしてくれるAtom拡張 PlantUML-Viewer がイイ！ - pierre3のブログ](http://pierre3.hatenablog.com/entry/2015/08/23/220217) : この記事よりいい感じに先に紹介されてました(^ ^;
コアサーバーの「転送先URL」の注意点『節子、それ301リダイレクトやない…302や！』

<h2>コアサーバーで独自ドメイン運用とURL正規化</h2>
サーバーを「コアサーバー（CORESERVER.JP）」に移転しました。
引き続き、独自ドメイン運用したかったので、<a href="https://www.value-domain.com/userguide/manual/domainwebcs/" target="_blank">公式ユーザーガイド</a>を参考に、[ドメインウェブ]の設定をおこないました。

<a href="http://www.get-hack.info/blog/wp/wp-content/uploads/2015/09/coreserver_02.png" target="_blank"><img src="http://www.get-hack.info/blog/wp/wp-content/uploads/2015/09/coreserver_02.png" alt="「ドメイン名」と「転送先URL」を入力" class="alignnone size-full wp-image-679" /></a>

「ドメイン名」を入力することで、同名のディレクトリが作成され、そのURLを叩いてのアクセスが可能になります。
「転送先URL」を設定することで、wwwあり・なしのURL正規化も可能（※）なので、「ドメイン名」に正規化前のURL、「転送先URL」に正規化後のURLを設定しました（今回はwwwありでURLを統一）。

※<a href="https://www.value-domain.com/userguide/manual/domainwebcs/" target="_blank">公式ユーザーガイド</a>「【設定例2】www付きドメインを設定する」参照

[ドメインウェブ]の設定後、<a href="http://ohotuku.jp/redirect_checker/" target="_blank">リダイレクトチェックツール</a>でwwwなしURLを入力して、リダイレクト動作を確認したところ…

<h2>「節子、それ301リダイレクトやない…302や！」</h2>

302リダイレクトされていると表示されました。

<a href="https://support.google.com/webmasters/answer/93633?hl=ja" target="_blank">Googleは、URL正規化には「301リダイレクトをおこなう」と紹介</a>していますので、302リダイレクトをおこなうより301リダイレクトをおこなった方が、SEO的に無難でしょう。

※なお、301リダイレクトも302リダイレクトも、「対象のURLにアクセスすると指定のURLに自動遷移させる」という動作そのものは同じですが、301は恒久的なサイト移転、302は一時的なサイト移転の意味を持ちます。


<h2>結局.htaccessファイルで301リダイレクト</h2>
というわけで、コアサーバーの[ドメインウェブ]での転送はおこなわず、wwwなしディレクトリの作成のみをおこなうことにします。
転送については、wwwなしディレクトリ内に.htaccessファイルを設置することで301リダイレクトをおこないます。

<a href="http://www.get-hack.info/blog/wp/wp-content/uploads/2015/09/coreserver_03.png" target="_blank"><img src="http://www.get-hack.info/blog/wp/wp-content/uploads/2015/09/coreserver_03.png" alt="wwwなしドメインの「転送先URL」は空に変更" class="size-full wp-image-666" /></a>
wwwなしドメインの「転送先URL」は空に変更

.htaccessファイル
<code>RewriteEngine on
RewriteCond %{HTTP_HOST} ^sig-lab.info
RewriteRule ^(.*)$ http://www.sig-lab.info/$1 [R=301,L]</code>

<code>RewriteEngine on
RewriteCond %{THE_REQUEST} ^.*/index.html
RewriteRule ^(.*)index.html$ http://www.sig-lab.info/$1 [R=301,L]</code>

2つめの/index.htmlのリダイレクト設定も書いておくことにより、/index.htmlあり・なしのURL正規化もおこなえます（今回はindex.htmlなしで統一）。

これで、

<a href="http://www.sig-lab.info/index.html" target="_blank">http://www.sig-lab.info/index.html</a>
<a href="http://sig-lab.info/index.html" target="_blank">http://sig-lab.info/index.html</a>
<a href="http://sig-lab.info" target="_blank">http://sig-lab.info</a>

いずれのURLでアクセスしても、

<a href="http://www.sig-lab.info" target="_blank">http://www.sig-lab.info</a>

に301リダイレクトされるようになりました。
自分なりのシステム設計時の考え方

最初にお断りしておきますが、テクニカルな話ではありません。自分はこう考えてるな、というメモ的な内容です。

1. 大まかなユースケース図で全体像を書く。
ユースケース上では、誰かが情報を登録し、誰かが照会し、どこぞかのシステムに外部連携する、といった情報を盛り込む。できれば、大まかにユースケース上でスコープに含まれるもの、含まれないものが表現されると嬉しい。規模の大きなシステムの場合は、スコープは別のドキュメントに定義を書く。

1. ユースケース図では、時間軸に沿って情報が流れている様子が表現できないので、ユースケース図と同じ粒度で業務フローを書く。書き方は1つに定まってないけど、多くの場合はアクティビティ図を使っています。
2.  アクティビティ図から、代表的なユースケースに絞って、画面フローを書く。場合によっては、画面設計も書いてしまう。画面設計といってもワイヤーフレーム的に表示要素の配置を考えるのではなくて、入力項目やボタンを並べるだけのもの。
3.  画面フローの中で、サーバー側の処理が読み取れないというか、画面フローだけでは開発できない部分に絞って、フローチャートかシーケンス図で補う。
4.  この段階で、ER図とシーケンス図と画面設計を行ったり来たりして、整合性を高める。ER図頭で画面設計を眺めることで、画面とデータ構造の整合性の誤りを正すことができるし、画面設計頭でER図を眺めると、正規化しすぎて処理速度が考慮されてないとか、ER図の細かなチューニングができる。
5.  場合によっては、APIの洗い出しをして、シーケンス図、画面設計、ER図の間を行ったり来たりして整合性を高める。
5.  出揃ったところで、データベース設計書やら、APIのI/O定義書を清書して、物理名を決める。
6.  このときもまた、DB的な物理名とAPI名を行ったり来たりして命名の整合性を高める。

一番大事にしていることは、ドキュメントというのは思考のツールでありコミュニケーションのツールであるということ。
思考ツールとして有効活用できるように、ダイアグラムを書く工程で、検討課題を抽出して、ディスカッションのアジェンダをチームに投げて意思決定したり、ダイアグラムとダイアグラムを突き合わせて整合性のチェックをしたり、したい。
読むのが誰かということを想定して、書いた文書は全て、読み手の目線で読みなおして、文書構成や言葉の訂正を入れることを怠らないようにしたい。
デザイン経験ゼロだけどGimpでアイコンをつくったので手順を抽象化して応用できるようにする


今回作ったのはこれ。レイヤー10枚くらい重ねた。
おれ用メモなので一読でわかったら天才。詳細知りたければ参考サイトをどうぞ。
![gimptrain.png](https://qiita-image-store.s3.amazonaws.com/0/1630/b0f8e006-e417-bcce-00bb-5815150fdae3.png "gimptrain.png")


##参考にしたサイト
[AppleのiCloudアイコンの作り方。リアルな立体感や金属の光沢を表現する。](http://gimp2-how-to-use.blogspot.jp/2012/02/appleicloud.html)

#よく使う技

1.レイヤーの非透明部分の選択
2.モーションぼかし

#手順

##1.基本の図形をつくる

これは適当でいい。
この図でいうと、楕円+真円+小さい円の単純な組み合わせ

##2.図形の外側と内側のレイヤーを作成して溝を表現する

非透明部分の選択をつかい基本図形を選択した状態にしてから、別レイヤーを作成し、選択の拡大をして選択図形よりも外側の領域を選択したレイヤーをつくる。

##3.アイコンの外側にも同様に溝を表現する
グラデーションをする

##4.ガウスぼかしのもやを下に入れる
レイヤー追加していれる

##5.溝に影をいれる
2の外側の図に対して選択の反転をして別レイヤーを追加して溝の影をつくる

##6.2の内側にベベルを重ねて追加する
2の基本図の内側にベベルを重ねる

##7.6に基づいてベベルに基づいて放射状の光源のレイヤーをいれる
新しくレイヤを追加する
オーバーレイで不透明度60

##8.特殊効果を入れる
ブレンドで変な図を重ねてモーションぼかしを回転して入れる。

金属光沢は、円錐形のピカピカのグラデーションを回転モーションぼかし。
ひっかき傷は、RGBノイズを回転モーションぼかし。


##まとめ
1-7は基本。
8はgimpに入ってるフィルタとかブレンドの機能を舐めていきつつ色んなアイコンを見ていったら色々アイディアが浮かびそう。
shellスクリプト変数をawkに渡す

ググったらいろいろやり方でてきたけどこれが一番使いやすかった

#やりかた
変数を使用する箇所で、シングルクォートを使ってawk文を分割すればよい

# 例
```lang:shell
hoge=100
cat ~/tmp.txt |awk '{if ('${hoge}'  <= $1) {print $0}}'
```

# 参考
[shellスクリプトから呼ぶawkでシェル変数を使う](http://whiteanthrax.pkf.jp/%E6%9C%AA%E5%88%86%E9%A1%9E/9/)
git commit 前に cpplint を走らせる

C++ の lint ツールとして cpplint がよさそう。

https://google-styleguide.googlecode.com/svn/trunk/cpplint/cpplint.py

キレイなコードを書くためにこれを強制したいんだけど、 editor の設定やなんかだと使ってるものによって方法が違うので逆にめんどくさくなってしまう。
じゃあ必ず通るパスはどこだということで git commit は絶対やるわけだからそこで cpplint をかけてしまおうという流れ。
cpplint に通らないと commit できなくする。

こういうときは pre-commit hooks を使うらしい。

https://www.kernel.org/pub/software/scm/git/docs/githooks.html

というわけで設定を作ってみた。

cpplint を使うリポジトリーの直下に tools ディレクトリーを作ってその下に cpplint.py を置く。
で、次のファイルを .git/hooks/ の下におくと git commit 時に勝手に cpplint が走ってくれる。

```sh:pre-commit
#!/bin/sh
#
# An example hook script to verify what is about to be committed.
# Called by "git commit" with no arguments.  The hook should
# exit with non-zero status after issuing an appropriate message if
# it wants to stop the commit.
#
# To enable this hook, rename this file to "pre-commit".

if git rev-parse --verify HEAD >/dev/null 2>&1
then
	against=HEAD
else
	# Initial commit: diff against an empty tree object
	against=4b825dc642cb6eb9a060e54bf8d69288fbee4904
fi

# Redirect output to stderr.
exec 1>&2

cpplint=$(git rev-parse --show-toplevel)/tools/cpplint.py
filters='-whitespace/line_length,-readability/todo,-runtime/reference'
sum=0

# for cpp
for file in $(git diff-index --name-status $against -- | grep -E '\.[ch](pp)?$' | awk '{print $2}'); do
    $cpplint --filter=$filters $file
    sum=$(expr ${sum} + $?)
done

if [ ${sum} -eq 0 ]; then
    exit 0
else
    exit 1
fi
```

ファイルの位置を変えたいときや cpplint で見てほしい設定を変えたい場合は次の行をいじればいい。

<code>cpplint=$(git rev-parse --show-toplevel)/tools/cpplint.py</code>
<code>filters='-whitespace/line_length,-readability/todo,-runtime/reference'</code>
How to use findbugs in Apache Hadoop project


This blog post is for Hadoop developers. It may be as a reference for you if you are not a Hadoop developer.

## Detect findbugs warnings

```
$ mvn clean
$ mvn install -DskipTests
$ mvn findbugs:findbugs
```

You can see the following message if there are some findbugs warnings

```
[INFO] ------------------------------------------------------------------------
[INFO] Building Apache Hadoop Data Join 3.0.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- findbugs-maven-plugin:3.0.0:findbugs (default-cli) @ hadoop-datajoin ---
[INFO] Fork Value is true
     [java] Picked up _JAVA_OPTIONS: -Dfile.encoding=UTF-8
     [java] Warnings generated: 2
[INFO] Done FindBugs Analysis....
```

## View the warnings via GUI

If there are findbugs warnings in hadoop-datajoin module, do the following:

```
$ cd hadoop-tools/hadoop-datajoin
$ mvn findbugs:gui
```

![Screen Shot 2015-09-03 at 20.34.40.png](https://qiita-image-store.s3.amazonaws.com/0/32443/d93ffc27-4c47-21bb-4da7-8777090550f2.png "Screen Shot 2015-09-03 at 20.34.40.png")

Open a window as the above screenshot. You can easily detect the code which causes findbugs warnings.

## Output HTML

When `findbugs:findbugs` is executed, the output is XML. It is difficult to know what the warnings are by reading the XML file. Nothing to worry about, we can easily convert the XML file to HTML so that we can know what the warnings are. Unlike gui, we can attach the file in JIRA to share the problem.

Prequisites: findbugs is installed and `$FINDBUGS_HOME` is set appropriately.

```
$ $FINDBUGS_HOME/bin/convertXmlToText -html target/findbugsXml.xml target/findbugsHtml.html
```

## Summary

`findbugs:gui` is very useful.
POH6 漫画版: 女子高生プログラマーの大バトル！〜コボール文明の逆襲〜 六村リオ

[六村リオ](http://qiita.com/rana_kualu/items/cbd237a865125b4cd9bf) / [霧島京子](http://qiita.com/rana_kualu/items/e6467151c88d69670fbb) / [緑川つばめ](http://qiita.com/rana_kualu/items/535144055c73f5694153) / [島根ルミ](http://qiita.com/rana_kualu/items/cc79813f9555e01330a2) / [島根ルミ149](http://qiita.com/items/0e9b48b4361ee567c7e6/) / [島根ルミ121](http://qiita.com/items/9de54445c2ed7c444d99/) / [共通解](http://qiita.com/items/04721cdd925166156aab/)


https://paiza.jp/poh/joshibato
色々混ざりすぎだろ。

[コーヒーの濃さを求める問題](https://paiza.jp/poh/joshibato/rio)。

```php
<?php
	// インプット
	$f = file('php://stdin', FILE_IGNORE_NEW_LINES|FILE_SKIP_EMPTY_LINES);
	// 1行目は不要
	unset($f[0]);
	
	// 初期化
	$oyu = $coffee = 0;
	
	// くるくる
	foreach($f as $v){
		$v=explode(' ', $v, 2);
		if($v[0]==="1"){ // お湯
			$oyu += $v[1];
		}elseif($v[0]==="2"){ // コーヒー
			$coffee += $v[1];
		}else{ // 飲んだ
			$oyu -= ($v[1]*$oyu) / ($oyu+$coffee);
			$coffee -= ($v[1]*$coffee) / ($oyu+$coffee);
		}
	}
	
	// 濃度
	echo intval(100*$coffee/($oyu+$coffee));
```

https://paiza.jp/poh/joshibato/rio/result/a0b8757d
どう見ても合ってるはずなんだが、何故かテストケース5が誤答になる。
なんで？？
誤差か？誤差のせいなのか？

```php
<?php
	// インプット
	$f = file('php://stdin', FILE_IGNORE_NEW_LINES|FILE_SKIP_EMPTY_LINES);
	// 1行目は不要
	unset($f[0]);
	
	// 初期化
	$oyu = $cof = "0";
	bcscale(64);
	
	// くるくる
	foreach($f as $v){
		$v=explode(' ', $v, 2);
		if(!$v[1]){continue;}
		
		if($v[0]==="1"){ // お湯
			$oyu = bcadd($oyu, $v[1]);
		}elseif($v[0]==="2"){ // コーヒー
			$cof = bcadd($cof, $v[1]);
		}else{ // 飲んだ
			$oyu = bcsub($oyu, bcdiv(bcmul($v[1], $oyu), bcadd($oyu, $cof)));
			$cof = bcsub($cof, bcdiv(bcmul($v[1], $cof), bcadd($oyu, $cof)));
		}
	}
	
	// 濃度
	echo (int)bcdiv(bcmul($cof, "100"), bcadd($oyu, $cof));
```

https://paiza.jp/poh/joshibato/rio/result/540f6b4c
やはり駄目だった。
どうも誤差のせいではないようだ。
なおGMP関数は使えなかった。

と、ここまで書いたところでようやく大ポカに気付く。

```php
<?php
	// インプット
	$f = file('php://stdin', FILE_IGNORE_NEW_LINES|FILE_SKIP_EMPTY_LINES);
	// 1行目は不要
	unset($f[0]);
	
	// 初期化
	$oyu = $coffee = 0;
	
	// くるくる
	foreach($f as $v){
		$v=explode(' ', $v, 2);
		if($v[0]==="1"){ // お湯
			$oyu += $v[1];
		}elseif($v[0]==="2"){ // コーヒー
			$coffee += $v[1];
		}else{ // 飲んだ
			$tmp = $oyu - ($v[1]*$oyu) / ($oyu+$coffee);
			$coffee -= ($v[1]*$coffee) / ($oyu+$coffee);
			$oyu = $tmp;
		}
	}
	
	// 濃度
	echo intval(100*$coffee/($oyu+$coffee));
```

https://paiza.jp/poh/joshibato/rio/result/80a1508f
飲んだ時に`$oyu`を上書きしてしまったため、`$coffee`の計算がおかしくなっていただけだった。
これは恥ずかしい。

PHPでは複数の計算を副作用なしに同時に行う術はないはずなので、一時変数を使って回避。
`list($a, $b) = ($a+$b, $a-$b);`
`UPDATE table SET 主キー = CASE WHEN 主キー=1 THEN 2 WHEN 主キー=2 THEN 1 ELSE 主キー END;`
みたいな芸当ができないのが悲しいところ。

これでようやく100点が取れました。

なお気付いた経緯は、入力サンプルとして
1 10
2 10
3 10
を突っ込んでみたから。
[AndroidStudioとGitHubの連携]作業した後のBranchの切り方

※作業した後でのBranchの切り方です

##AndroidStudio

1.new Branchの作成
VCS->Git->Branches->+new Branch->名前を入力
（今がmasterだったら次はdevelopを作ります）

2.pushする
app右クリック->Git->Commit Directory->pushにオンマウス->commit and push
->Branchの名前を確認->わかりやすくメモを書く->Push
（VCS->Git->Pushでは反映されません）

##GitHub

確認して終了
Rails: ActiveAdmin.register_page でのアクションの作り方とはまりどころ。

ActiveAdmin の register_page (モデルに関連付けない書き方) でほんとに苦労したのでメモ。

# ポイント
 - アクションの追加は `page_action` でおこなう。`page_action` を書かないとルーティングさえ追加されない！（でもなぜか、index アクションだけは定義しなくても最初からある） 
 - ActiveAdmin.register では `index do` にあたる部分が、register_profile では `content do` になっている！　（わかりづらい）
 - たとえば `index do` の中で `@text = 'ABCD'` って書いても、`content do` の中ではそのまま使えない！ text っていう普通の変数になっている。
 - レイアウトの変更は `controller do` の直下に書く！ `def index` とかの中には書かない。
 - `def index` と `content do` が対応している。 ではたとえば `def edit` に対応するものは何なのか？ たぶん page_action :edit do だ。（未確定）
 

```rb
ActiveAdmin.register_page "AuthorPage" do
  content do
    panel 'メニュー' do
      link_to '新規作成', admin_authorpage_new_path
    end
    table_for authors do
      column "名前", :name
      column "性別", :gender
      column ("name_changed"){ |author| author.name_changed }
      column ("編集"){ |author| link_to('編集する', admin_authorpage_edit_path(id: author.id)) }
    end
  end

  page_action :new, method: :get
  page_action :create, method: :post
  page_action :update, method: :post

  page_action :edit, method: :get do
  end

  controller do
    layout 'active_admin', only: [:edit, :new]

    def index
      @authors = Author.all
    end

    def new
    end

    def create
      Author.create(params.require(:author).permit(:name, :gender))
      flash[:notice] = '作成しました。'
      redirect_to admin_authorpage_path
    end

    def update
      flash[:notice] = '編集しました。'
      author = Author.find(params[:author][:id])
      author.update(params.require(:author).permit(:name, :gender))
      redirect_to admin_authorpage_edit_path(id: params[:author][:id])
    end

    def edit
      @author = Author.find(params[:id])
    end
  end
end
```



<!-- Update From Qiita API -->

# チャットメンバー募集


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

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


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
Yahoo! 知恵袋（q12149830757）

「Yahoo! 知恵袋」の以下の質問を解いてみました。

http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q12149830757

# はじめに

入力された文字列を標準出力に出力するだけのバッチファイルを用意します。

```bat:q12149830757.bat
@echo off

setlocal
  echo 文字列を入力してください。
  set /p s="> "
  
  echo.
  echo 入力した文字列は %s% です。
endlocal
```

バッチファイルを実行すると、文字列の入力を求められます。

```
C:\>q12149830757.bat
文字列を入力してください。
> _
```

文字列を入力すると、入力した文字列が画面上に表示されます。

```
C:\>q12149830757.bat
文字列を入力してください。
> 0

入力した文字列は 0 です。
```

# ファイルとリダイレクトを利用した場合

入力する文字列をあらかじめファイルに書き出しておきます。

```
C:\>(echo 1) > q12149830757.txt
```

標準入力からファイルを読み込みつつバッチファイルを実行すると、入力した文字列が画面上に表示されます。

```
C:\>q12149830757.bat < q12149830757.txt
文字列を入力してください。
>
入力した文字列は 1 です。
```

# コマンドとパイプを利用した場合

`echo` コマンドとパイプを利用して標準入力から文字列を受け取りつつバッチを実行すると…

```
C:\>(echo 2) | q12149830757.bat
文字列を入力してください。
>
入力した文字列は 2  です。
```

入力した文字列は画面上に表示されますが、末尾に余分な半角空白が出力されてしまいます。

そこで `set` コマンドでも試してみたのですが…

```
C:\>(< NUL set /p t=2) | q12149830757.bat
文字列を入力してください。
>
入力した文字列は 2   です。
```

半角空白がもう一つ増えてしまいました。

このあたりちょっともやもやしますが、とりあえず `echo` コマンドとパイプの間に半角空白を含めないようにすれば問題なさそうです。

```
C:\>echo 2| q12149830757.bat
文字列を入力してください。
>
入力した文字列は 2 です。
```

# おわりに

バッチファイルでまじめに解くとしたら、以下を参考にする必要がありそうですね。

[標準入力の受け取り（どーでもえぐぜ）](http://doudemoexe.com/Batch/0005.jsp)
フライ曲線が楕円曲線である説明

#はじめに
前回，フェルマーの最終定理が成り立たないときの自然数 $a,b$ が互いに素であることを示し，フライ曲線が楕円曲線になることを示した。。。と思っていた。実は，動画を投稿した後「楕円曲線の定義とマッチしていない」というコメントをいただいた（[動画はこちら](http://www.nicovideo.jp/watch/sm27074475)）。そこで，今回はフライ曲線が楕円曲線になることを，定義にマッチする形で説明する。

(9月8日)注意： 楕円曲線の定義を変更したので，以下の議論の必要は無くなった。しかし，戻す場合もあるので残しておく。

#定義やら定理やら
##フェルマーの最終定理
>自然数 $n≥3$ に対して

>```math
a^n+b^n=c^n
```
を満たす自然数 $a,b,c$ は存在しない

##フライ曲線
>フェルマーの最終定理が成り立たないと仮定すると，(1)を満たす $a,b,c$ が存在する。このとき曲線

>```math
y^2=x(x-a^n)(x+b^n)
```
をフライ曲線と呼ぶ。

##楕円曲線
>曲線が楕円曲線であるとは，$y^2=x^3+Ax+B$ と表され，(右辺)=0が重根を持たない。

#前回の記事での不十分な点
[1]フライ曲線は $x^2$ の項がある
[2] $x^2$ の項をなくした場合に重根をもたないことを示していない

#フライ曲線が楕円曲線である説明
##[1] x^2 の項を消す。
フライ曲線の右辺を展開し，3乗でまとめると

```math
y^2=x^3+(b^n-a^n)x^2-a^n b^nx\quad\quad\quad\quad\quad\quad\quad\quad\ \\
\quad\quad\quad\quad\quad=\left(x+\frac{b^n-a^n}{3}\right)^3-3\left(\frac{b^n-a^n}{3}\right)^2x-\left(\frac{b^n-a^n}{3}\right)^3-a^nb^nx
```
となる。ここで $X=x+\frac{b^n-a^n}{3}$ と置くと, ($x=X-\frac{b^n-a^n}{3}$より)$y^2=X^3+AX+B$ の形に表せる。
##[2]重根をもたない
$x(x-a^n)(x+b^n)=0$ の解 $$0,a^n,-b^n$$ は$a,b$ が自然数であることから重根とならない。このとき，$X=x+\frac{b^n-a^n}{3}$ より$$\frac{b^n-a^n}{3},a^n+\frac{b^n-a^n}{3},-b^n+\frac{b^n-a^n}{3}$$ は $X^3+AX+B=0$ の解であり重根とならない。

[1],[2] よりフライ曲線は楕円曲線となる。

#関連記事
前回の記事：[フェルマーの最終定理と互いに素](http://qiita.com/simanezumi1989/items/62921a55cc54904005ca)
wordpress条件分岐まとめ

wordpressで使われる条件分岐のまとめをここに書いていこうと思う。
発見したときに都度都度追記していこうと思うので、初めのうちは少なめです。

#記事に本文があるかどうか

```lang:php
<?php if(empty($post->post_content)): //本文がある場合?>

<?php endif; ?>
```

https://ja.forums.wordpress.org/topic/6291
git 期間中の変更ファイル一覧を出す

git bashにて以下を実行
```
$ git diff --stat --name-only <コミットID１> <コミットID２>
```

diff : 差分を出す
--stat：diffオプション、ファイル名、差分の統計情報（）を出す(sample1参照)
--name-only：オプション、ファイル名のみ出す(sample2参照)


```git.sample1
$ git diff --stat --name-only <コミットID１> <コミットID２>
fileA
fileB
fileC
...
...
...
```

```git.sample2
$ git diff --stat <コミットID１> <コミットID２>
fileA      |56 ++++++-
fileB      |5  +++
fileC      |66 -
...        |
...        |
...        |
```
未pushのコミットがある追跡ブランチをマージした上で削除しようとすると怒られる

# 概要

トピックブランチでの作業が終わり、masterにマージしたので削除しようとすると怒られて「あれ？マージしたのに？」と思うことがある。実はマージ忘れで削除しようとした場合と、push忘れで削除しようとした場合で怒られ方が違う。いつも忘れていて、文句を言われる度に思い出すので覚書。以下、`ci = commit -a`、`co = checkout`にaliasしてあるので注意。

# マージ忘れ削除

マージを忘れたままブランチを削除してみる。
まずは適当なリポジトリを作る。

```shell-session
$ git init test
$ cd test
$ echo Hello > test.txt
$ git add test.txt
$ git ci -m "Initial commit" # 適当なファイル追加してコミット
```

この状態でトピックブランチtopicを作り、なんかコミットしておく。

```shell-session
$ git co -b topic
Switched to a new branch 'topic'

$ echo Hello2 >> test.txt
$ git ci -m "modifies test.txt" 
[topic 0f90d8e] modifies test.txt
 1 file changed, 1 insertion(+)
```

で、masterに戻ってtopicを削除しようとするとerrorが出て「マージしてないよ！」怒られる。

```shell-session
$ git co master
$ git branch -d topic
error: The branch 'topic' is not fully merged.
If you are sure you want to delete it, run 'git branch -D topic'.
```

この場合、出るのはエラー。

# push忘れ削除

リモートにpushを忘れたままブランチを削除してみる。

適当なリポジトリとベアリポジトリを作って、originとしてリモートに追加しておく(さっきのtestリポジトリは削除しておいた)。

```shell-session
$ git init --bare test.git
$ git init test 
$ cd test
$ echo Hello > test.txt
$ git add test.txt
$ git ci -m "Initial commit" # 適当なファイル追加してコミット
$ git remote add origin ../test.git    # リモート追加
$ git push --set-upstream origin master # リモートにプッシュ
```

同様にtopicブランチを作って、まず何もせずにプッシュする。

```shell-session
$ git co -b topic
Switched to a new branch 'topic'

$ git push --set-upstream origin topic  
Total 0 (delta 0), reused 0 (delta 0)
To ../test.git
 * [new branch]      topic -> topic
Branch topic set up to track remote branch topic from origin.
```

その後、何か修正してコミット、

```shell-session
$ echo Hello2 >> test.txt
$ git ci -m "modifies test.txt" 
[topic 950ee33] modifies test.txt
 1 file changed, 1 insertion(+)
```

masterにマージしてから削除しようとすると怒られる。

```shell-session
$ git co master
$ git merge topic
Updating e32d81f..950ee33
Fast-forward
 test.txt | 1 +
 1 file changed, 1 insertion(+)

$ git branch -d topic  
warning: not deleting branch 'topic' that is not yet merged to
         'refs/remotes/origin/topic', even though it is merged to HEAD.
error: The branch 'topic' is not fully merged.
If you are sure you want to delete it, run 'git branch -D topic'.
```

マージ忘れコミットではerrorが出たが、今度はwarning。「ブランチ'topic'は、HEADにはマージされているけど、リモートの'origin/topic'にマージされて無いよ」という内容。

ちゃんとpushした後は削除できる。

```shell-session
$  git co topic 
Your branch is ahead of 'origin/topic' by 1 commit.
  (use "git push" to publish your local commits)

$ git push 
Counting objects: 3, done.
Writing objects: 100% (3/3), 264 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To ../test.git
   e32d81f..950ee33  topic -> topic

$ git co master
Switched to branch 'master'
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)
 
$ git branch -d topic
Deleted branch topic (was 950ee33).  # 無事に削除される。
```

# まとめ

トピックブランチが追跡ブランチになっている場合、別のブランチにマージした後でも、リモートにpushを忘れたまま削除しようとすると警告がでる。ちゃんと警告の内容を読まないとマージ忘れのエラーと間違えて「あれ？マージしたのに」としばらく悩むかも。
Flask + jQueryでファイルアップロード

Python自体ちゃんと勉強してませんのでコードがアレかも。

### 環境

* Python 2.7.10
* Flask 0.10.1

### コード

以下のコードで`run.py`を走らせて、ファイルをアップロードすると`run.py`と同じ階層にアップロードしたファイルが置かれる。

```python:run.py
from flask import Flask, request
app = Flask(__name__)

@app.route('/upload', methods=['POST'])
def upload():
    the_file = request.files['the_file']
    the_file.save("./" + the_file.filename)
    print request.form['other_data']    # 999
    return ""

if __name__ == '__main__':
    app.run()
```

```html:index.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>Flask Upload Test</title>
</head>
<body>
<button>Upload File</button>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
<script>
    (function () {
        'use strict';

        var onClickButton = function () {
            var html =
                    '<form id="uploadForm" class="upload-form" style="display: none;">' +
                    '<input id="theFile" name="the_file" type="file">' +
                    '</form>';
            $('body').append(html);
            $('#theFile').on('change', uploadFile).click();
        };

        var uploadFile = function () {
            var formData = new FormData($('#uploadForm')[0]);
            formData.append('other_data', 999);
            $.ajax({
                url: '/upload',
                type: 'post',
                data: formData,
                processData: false,
                contentType: false,
                timeout: 10000
            }).done(function () {
                console.log('done');
            }).fail(function () {
                console.log('fail');
            }).then(function () {
                $('#uploadForm').remove();
            });

        };

        $('button').on('click', onClickButton);
    })();
</script>
</body>
</html>
```
bundle install よくあるエラーと対策

よくあるエラーと対策をまとめてみました。
全部自分がはまったものですが、ちょっと情報が古いかもしれません。気が向いたら最新版つくるかも。

## 環境

- CentOS6.6
- ruby 2.0.0


## command not found

bundleが入っていない・・・
<pre>
$ gem install bundler
</pre>

## リポジトリに繋がらない

ネットワークやDNS、プロキシの設定を見直す。
→/etc/resolv.conf, /etc/sysconfig/network, /etc/sysconfig/network-scripts/ifcfg-eth0等 

## qmakeが無いと怒られる

qtをインストールする。

レポジトリ追加。
<pre>
# Place this in a file in your /etc/yum.repos.d/ directory with a .repo extension

[epel-qt48]
name=Software Collection for Qt 4.8
baseurl=http://repos.fedorapeople.org/repos/sic/qt48/epel-$releasever/$basearch/
enabled=1
skip_if_unavailable=1
gpgcheck=0

[epel-qt48-source]
name=Software Collection for Qt 4.8 - Source
baseurl=http://repos.fedorapeople.org/repos/sic/qt48/epel-$releasever/SRPMS
enabled=0
skip_if_unavailable=1
gpgcheck=0

</pre>

インストール。

<pre>
$sudo yum install qt48-qt-webkit-devel
</pre>

シンボリックリンク設定、コマンド有効化、パス設定。

<pre>
$ sudo ln -s /opt/rh/qt48/root/usr/include/QtCore/qconfig-64.h  /opt/rh/qt48/root/usr/include/QtCore/qconfig-x86_64.h
$ source /opt/rh/qt48/enable
$ export PATH=/opt/rh/qt48/root/usr/lib64/qt4/bin/${PATH:+:${PATH}}
</pre>

最後に、bundle install。suで行わないように注意！



参考サイト：
https://github.com/thoughtbot/capybara-webkit/wiki/Installing-Qt-and-compiling-capybara-webkit

## pgのインストールでエラー

bundle installの過程でインストールされるgemに引数を渡す。"参考サイト":http://stackoverflow.com/questions/9234960/gem-install-pg-with-pg-config-works-bundle-fails
<pre>
$ bundle config build.pg --with-pg-config=/usr/pgsql-9.1/bin/pg_config
</pre>

## sqlite3が入らない

yum で入れる。
<pre>
$ sudo yum install sqlite-devel
</pre>

## libxml2が無いと怒られる

yum で入れる。
<pre>
$ sudo yum install libxml2-devel
$ sudo yum install libxslt-devel
</pre>

## rmagickが無いと怒られる

yumでImageMagickを入れる
<pre>
yum -y install ImageMagick ImageMagick-devel
</pre>

## SSLエラーが起きる

Gemfileを修正しダウンロード先を変更する(まずは暫定対策として・・・）。
<pre>
#source 'https://rubygems.org'
source 'http://rubygems.org'
</pre>


## rubygemが無い（古いバージョンのrubyを削除した場合等）

<pre>
$ ruby -e 'require "rubygems"'
</pre>
DB移行・移植のチェックポイントまとめ

自分用です。おもらし多いので・・・

#定義
##テーブル
- キー
- NOT NULL
- デフォルト値

##一時テーブル
###SQL Server
プロシージャ内でCREATEする。
- ローカル一時：#○○
- グローバル一時：##○○

###Oracle
事前に作成する
- CREATE GLOBAL TEMPORARY TABLE文

##インデックス
##シーケンス
##ビュー
##パッケージ
##プロシージャ
##ファンクション
##トリガー

#データ
MySQL5.6でGTIDを使ったレプリケーション設定

#  環境
|項目||
|-----|---|
| OS | Red Hat Enterprise Linux Server release 6.5 |
| DB | MySQL  5.6.25                               |



# 記載の背景

* GTIDを利用したレプリケーション設定について公式サイトを見たがよくわからなかった。
* GTIDを利用したレプリケーション設定についてググっみたが情報が錯綜しているように感じた。
* とりあえず動くようにするための最低限の設定がわかれば嬉しい人もいるはず。

# 想定

* MySQL5.6のインストールされたVMが1台ある。GTIDの設定はしていない。
* VMをクローンしてslave用のVMを作成した。IPアドレスなど基本的な設定は完了済み。
* master、slaveともに初期状態ではMySQLは停止している。


# 手順

##  masterとslaveのmy.cnfに以下を記載

以下を[mysqld]のセクションに追記する

````
server-id = 1
gtid-mode=ON
enforce-gtid-consistency
log-bin=mysql-bin
log-slave-updates
````

server-idはユニークにすること。
masterは1,slaveは2とか。

##  masterでdumpする

````
 mysqldump -u<USER> -p<PASSWORD> --all-databases --single-transaction --master-data=2 >master_dump.sql

````

### オプションの解説

* --single-transaction
>ダンプする際に先頭にBEGINをつけるため、ダンプ時のデータのトランザクションの一貫性を保つことができます。ただしInnoDBなどのトランザクションが有効なストレージエンジンではないと意味がないです。

* --master-data
> CHANGE MASTER TOコマンドをダンプの先頭に付加します。--master-data=2を指定するとCHANGE MASTER TOがコメントアウトされた状態になります。--maser-data=1と指定するとコメントアウトされずにダンプされます。

引用元:http://oinume.hatenablog.com/entry/wp/292

##  slaveでmysqlを起動

````
service mysql start
mysql -u<USER> -p<PASSWORD> < master_dump.sql
````

##  chenge masterコマンド

````
mysql> change master to
    -> master_host = '<MASTER HOST>',
    -> master_port=3306,
    -> master_user='<USER>',
    -> master_password='<PASSWORD>',
    -> master_auto_position=1;

````

##  start slaveコマンド

````
mysql> start slave;
````


##  slaveが動いているか確認


###  masterにて

````
mysql> show master status\G
             File: mysql-bin.000001
         Position: 231003
     Binlog_Do_DB:
 Binlog_Ignore_DB:
Executed_Gtid_Set: 22acmsdt4-3b50-11e5-904c-005056ba46c2:1-32
````

###  slaveにて

以下を確認

````
mysql> show slave status\G
          Slave_IO_Running: Yes       <----Yesになっていること
          Slave_SQL_Running: Yes      <----Yesになっていること
          Master_Log_File: mysql-bin.000001      <---masterと同じになっていること
          Read_Master_Log_Pos: 231003               <---masterと同じになっていること
          Executed_Gtid_Set: 22acmsdt4-3b50-11e5-904c-005056ba46c2:1-32     <---masterと同じになっていること
````
UIButtonのhighlighted時に背景色を変更できる拡張クラス


```Swift
class UIButtonExt: UIButton {
	var defaultBackgroundColor: UIColor = UIColor.whiteColor()

	var highlightedBackgroundColor: UIColor = UIColor.whiteColor()
	
	override var highlighted: Bool {
		didSet {
			if (highlighted) {
				defaultBackgroundColor = backgroundColor!
				backgroundColor = highlightedBackgroundColor
			} else {
				backgroundColor = defaultBackgroundColor
			}
		}
	}
}
```

`highlighted`の変更を検知して、背景色を変更します。

「storyboardで色を適用させたい」という要望があれば、L4に`@IBInspectable`を付けておけば実現可能ですね

あとは好みによっては`extension`で適用させてもいいかもしれませんね
【phpMyAdmin】インストールと設定


##1. Apache(web server)の作業
1) DocumentRootに指定するディレクトリを作成する
2) バーチャルホストの設定をする
3) 再起動する（apachectl restart）

##2. hostsの設定を編集
1) /etc/hostsを開く
2) 127.0.0.0.1にバーチャルホストで指定したドメイン名を紐づける

```注意)
※syntaxエラーが発生するとうまいことサーバーに接続できない
sudo apachectl configtest　アパッチの状態を調べる←これ重要
php -S localhost:8000
vim /etc/hosts
vim /etc/apache2/extra/httpd-vhosts.conf
```

##3. 動作の確認
1) index.html（中身は適当）をバーチャルホストに指定したディレクトリに配置する
2) ブラウザで、ドメインにアクセスし、↑の画面がでたらOK

##4.phpmyadminのインストール
1) php5.5 /mysql5.6 にあったphpmyadminをダウンロードして、ドキュメントルート以下に展開 ※ 多分、最新で大丈夫。
2) ブラウザで、ドメインにアクセスし表示を確認
3) configを編集する。最低限、dbの接続情報(ホスト:localhost / db:carry_dokuritsu_db / password:??)
4) アクセスを確認。


##トラブル編
- PCをシャットダウンしたら、phpMyAdminにログインできなくなった！
###状態（コマンドラインで確認したら以下のエラーが）
```
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (38)
```

①'/tmp/mysql.sock'アパッチの権限を変更してみた→意味ない
②mysql.server startでサーバーを再起動したら、こんなエラーが。

```
ERROR! The server quit without updating PID file
```

どうやら、サーバーをシャットダウンするときにPIDファイルとやらがうまく更新されていないようだ。

→tmpでmysqlのファイルを作っていたので、消してmysql.server restart
→成功⚪︎

コメント）
正直、killコマンドで　kill -9 PIDナンバー　ってな感じでやってたけど、kill: 501: No such processとか言われ続け、結局なんにも消えなくて、いたちごっこになるので要注意。
NoneとOption(null)の違いはなんなのか

自分の疑問点を整理するためのメモです。

### Noneとはなにか？

`None`は`Option[Nothing]`を継承したobjectである。Scalaのコード上で`None`がでてきた場合、それは`None`のシングルトンオブジェクトである（本当か？）。

http://www.scala-lang.org/files/archive/nightly/docs/library/index.html#scala.None$

以下はscala/Option.scalaからの抜粋。`Option(null)`すると`None`が返る。

```scala
  /** An Option factory which creates Some(x) if the argument is not null,
   *  and None if it is null.
   *
   *  @param  x the value
   *  @return   Some(value) if value != null, None if value == null
   */
  def apply[A](x: A): Option[A] = if (x == null) None else Some(x)
```

### Nullとはなにか？

`scala.Nothing`と同様で全ての型のサブタイプで、型階層の一番下にくる。

http://www.scala-lang.org/files/archive/nightly/docs/library/index.html#scala.Null

### nullとはなにか？

`null`は`Null`クラスのシングルトンインスタンスである。`Null`クラスは`AnyRef`クラスのサブクラスであるので、`AnyVal`のサブクラスである`Int`型の変数には代入できない。ひらたく言うとJavaと同じということ。

### 疑問点

#### `Option[Null] = None`とはなんなのか？

```
scala> Option(null)
res67: Option[Null] = None
```

REPLで`Option(null)`とすると`Option(None)`型の値として`None`が返る、という理解はあっているのかな？

```
scala> None
res76: None.type = None

scala> None == Option(null)
res77: Boolean = true
```

`None`と`Option(null)`が等価であるというのはどうやって定義されているんだろう？


### 参照URL

* [Scalaのnull/Nothing/Nil/Noneはやりすぎなのか？ - ぐるぐる～](http://bleis-tift.hatenablog.com/entry/scala-null-none-nothing-nil)
* [scala.Nothingは何のためにあるのか - kmizuの日記](http://kmizu.hatenablog.com/entry/20091130/1259557761)
Dispatcher.BeginInvokeでラムダ式を用いる

#背景 

Taskを始めとする別スレッド内でUI Threadに関わる処理を行っているとき、DispatcherObjectの BeginInvoke メソッドを多用します。たとえば、Task内でプログレスバーを更新する場合は、

```csharp

var pb = new ProgressBar();
pb.Maximum = 5;
var window = new Window() { Content = pb };

// ダメな例：Task内でUIに関わる処理を行うと例外が発生します
Task.Factory.StartNew(()=>{
    pb.Value++;
});

// 正しい例：UI にかかわるオブジェクトはDipatcherObjectを継承しているため、Invokeします
Task.Factory.StartNew(() =>
{
    pb.Dispatcher.BeginInvoke((Action)(()=> pb.Value++));
}
```

と記述します。一行で書けるとはいえ、コードが長くなりがちです。

###　ラムダ式は直接指定できない

InvokeやBeginInvokeの引数はDelegate型のため、Action (Delegateの中の一つ)にキャストせず、ラムダ式を直接指定すると、

```csharp
// ダメな例：ラムダ式はキャストしなければならない
Task.Factory.StartNew(() =>
{
    // ラムダ式 はデリゲート型ではないため、型 'System.Delegate' に変換できません
    pb.Dispatcher.BeginInvoke(()=> pb.Value++);
}

```

というエラーが発生します。そのため、簡単な処理を記述するたびに pb.Dispatcher.BeginInvoke((Action)(()=> {}))　と長いコードを書かなければなりませんでした。

### 拡張メソッド & Actionを引数にした関数

そこで、僕は以下の拡張メソッドを定義し、

```csharp

// 拡張メソッドはinternalの方が汚染がなくていいと思います
internal static DispatcherOperation DisBegInv(this DispatcherObject dispatcherObject, Action action)
{
    return dispatcherObject.Dispatcher.BeginInvoke(action);
}
```

```csharp

// 腕にやさしいコード
Task.Factory.StartNew(() =>
{
    pb.DisBegInv(()=> pb.Value++));
}

```

とラムダ式を直接用いるようにしています。これで皆さんの腕が少しでも疲れないようになれば幸いです。
bash の prompt に色をつける

http://www.tldp.org/HOWTO/Bash-Prompt-HOWTO/x329.html

にやり方がある。私は

```
$PS1="\[\033[36m\][\u@\h:\w]$\[\033[37m\] "
```

としている。`\[\033[36m\]` で色を cyan にし、 `\[\033[37m\]` で色を white に戻している。この部分、可読性が低いのでどうにかしたい。

-> http://stackoverflow.com/questions/689765/how-can-i-change-the-color-of-my-prompt-in-zsh-different-from-normal-text zsh だとどうにかできるようだ。
SDWebImageを使って表示画像をキャッシュし、ネットワークから取得する場合はProgressを表示する

インスタっぽい画像表示をつくりたいと思って実装。
CircleProgressView(https://github.com/CardinalNow/iOS-CircleProgressView)とお馴染みSDWebImage(https://github.com/rs/SDWebImage)を使用。


```
        //メンバ変数をnilにしておく
        self.entriesImage.image = nil;
        SDWebImageManager *imageManager = [SDWebImageManager sharedManager];
        [imageManager.imageCache queryDiskCacheForKey:self.entryModel.image_url done:^(UIImage *image, SDImageCacheType cacheType)
        {
            if (image) {
                NSLog(@"キャッシュがある");
                self.circleProgressView.hidden = YES;
                //取得したimageをメンバ変数へ代入
                self.entriesImage.image = image; 
            } else {
                //キャッシュがないのでネットワークから読み出すなどの処理をする
                [[SDWebImageDownloader sharedDownloader] downloadImageWithURL:[NSURL URLWithString:self.entryModel.image_url]
                                                                      options:0
                                                                     progress:
                 ^(NSInteger receivedSize, NSInteger expectedSize) {
                     self.circleProgressView.hidden = NO;
                     float progress = [@(receivedSize) floatValue]/[@(expectedSize) floatValue];

                     self.circleProgressView.progress = progress;
                 } completed:^(UIImage *image, NSData *data, NSError *error, BOOL finished) {
                     if( error ){
                         return;
                     }
                     
                     if (finished){
                         SDImageCache *imageCache = [[SDWebImageManager sharedManager]imageCache];
                         [imageCache storeImage:image forKey:self.entryModel.image_url];
                         
                         self.circleProgressView.hidden = YES;
                         self.entriesImage.image = image;
                     }
                     
                 }];
            }
        }];

```

◼︎参考
http://hack.aipo.com/archives/9983/
http://blogios.stack3.net/archives/288
https://xn--t8j4aa4npge9cynpab8kvj.jp/
http://blog.waft.me/ios-http-cache/
https://www.xn--t8j4c7dcf6169bud5f.jp/
std::accumulateをつかって、{"A","B","C"}な配列を指定文字で結合するサンプル

```cpp:Implementation

#include <vector>
#include <numeric>
#include <algorithm>

std::string Joint(std::vector<std::string>& container, const std::string& delim)
{
	return std::accumulate(
		  container.begin() + 1
		, container.end()
		, container[0]
		, [&delim](const std::string& a, const std::string& b) {
			if (b.empty())
				return a;
			return a + delim + b;
		});
}

```

```cpp:Usage
const std::vector<std::string> abc = { "A", "B", "C" };

const std::vector<std::string> param = {
	"hoge=1",
	"",
	"fuga=2",
	"",
	"foo=3",
};

Joint(abc, std::string("&"); // "A&B&C"

Joint(param, std::string("-"); // "hoge=1&fuga=2&foo=3"
```

- 空文字はスキップさせたかった
- Web APIのパラメータ部分をさくっと作りたかった
dmdのフロントエンドのD言語化とD foundation


## [D-Day for DMD is today!](http://forum.dlang.org/thread/mrbl1d$qhs$1@digitalmars.com)

8月の話ですが，D言語の公式コンパイラであるdmdのフロントエンドがC++からD言語に置き換わりました．以下がそのPRです．

[[DDMD] Switch to D source and delete C++ source #4923](https://github.com/D-Programming-Language/dmd/pull/4923)

元々Danielがやっていたddmdというプロジェクトがあり，それをマージした形になります．機械的に変換したコードがベースなのでまだまだ最適化されてるわけではありませんが，2.069までには改善され正式にリリースされる予定です(次のリリースはC++ベースの2.068)．

D言語になったので，D言語のパーサ関係をライブラリから使えるようになるかなと思っています(ddmdではその用途も考慮している)．バックエンドのコード生成部分とかはまだC++だったりしますが，後々変換するとWalterが言及しているので，いずれこれらもD言語になるでしょう．

これでD言語もbootstrapな処理系の仲間入りで．GDC/LDCの開発陣も追従する旨を書いてるので，コミュニティ全体としてガンガン改善が進みそうです．数年前からずっと要望されていたことなので，一つ大きなマイルストーンをクリアしたな，と感慨深いです．

## [Moving forward with work on the D language and foundation](http://forum.dlang.org/thread/xsqrdgwnzehdmfmvcznn@forum.dlang.org)

あと上の話題で見過ごしていたのですが，AndreiがFacebookを辞めてD言語に更に注力するとのことで，D foundationを立ち上げるっぽいです．経過はフォーラムで報告していくとのこと．

Andreiはいなくなっちゃいますが，FacebookはまだD言語を使い続けているとのことなので(DConfでFacebookのエンジニアが発表してたりしますし)，今後もDConfとかはFacebookで行われる可能性が高そうです．

8月にデカいニュースが重なったなぁ…
RSpec内でPryを使ったときの長すぎるプロンプトを省略する

Rubyコードのデバッグ時に便利な[Pry](https://github.com/pry/pry)ですが、これをRSpec内から呼び出した場合、プロンプトが非常に長くなってしまい、不便なときがあります。

例えば以下のようなexample内でPryを呼び出すと、

```rb
module Gemologist
  class Gemfile
    describe Dependency do
      describe '#version_specifiers' do
        context 'when multiple specifiers are passed' do
          it 'replaces the existing specifier with the passed specifiers' do
            binding.pry
          end
        end
      end
    end
  end
end
```

Pryのプロンプトに呼び出し元での`self`のクラス名が表示され、こんな感じになってしまいます。

```
[1] pry(#<RSpec::ExampleGroups::GemologistGemfileDependency::VersionSpecifiers_2::WhenMultipleSpecifiersArePassed>)> 
```

これは、RSpecが各example groupクラスを動的に生成し、その際に`describe`や`context`に渡した説明文からクラス名を自動生成しているためです[^1]。この機能自体はデバッグ時に助かることもありますが、上記のようにPryのプロンプトとの相性は悪いですね。

そこで、この長すぎるプロンプトを省略することにします。Pryのプロンプトは`~/.pryrc`に設定を記述することでカスタマイズできるため、Pryを呼び出したコンテキストでの`self`が`RSpec::Core::ExampleGroup`のサブクラスのインスタンスだった場合は、`RSpec::Core::ExampleGroup`と表示するように変更します。

* [Customization and configuration · pry/pry Wiki](https://github.com/pry/pry/wiki/Customization-and-configuration#the-prompt)

```rb:~/.pryrc
Pry.config.prompt = Pry.config.prompt.map do |default_proc|
  proc do |target_self, nest_level, pry|
    # Use RSpec::Core::ExampleGroup instead of auto-generated long example group class name.
    if defined?(RSpec::Core::ExampleGroup) && target_self.is_a?(RSpec::Core::ExampleGroup)
      target_self = RSpec::Core::ExampleGroup
    end

    default_proc.call(target_self, nest_level, pry)
  end
end
```

`Pry.config.prompt`には`Proc`インスタンスが2つ含まれた配列をセットする必要があります。今回の場合、カスタマイズしたい挙動以外に関してはデフォルトのプロンプトを引き継ぎたかったため、元々の`Pry.config.prompt`の配列の要素をそれぞれラップする形でカスタマイズを行いました。

上記のように`~/.pryrc`を編集後、RSpec内で再度Pryを呼び出すと、プロンプトは以下のようになります。

```
[1] pry(RSpec::Core::ExampleGroup)>                                                                                                                                                                         
```

[^1]: 説明文からのクラス名自動生成はRSpec 3.0.0から。それ以前は`RSpec::Core::ExampleGroup::Nested_2`のように連番で名前を生成していた。
モデルと対応するspecファイルを行き来するだけのelisp

Rails用のモードが高性能すぎて使いこなせなくて、気づいたら使わなくなっていた人向けの、モデルとspecファイルを行き来するだけの機能です。私はこれだけあれば十分でした。

```el
(defun rails-file-switch ()
  "app以下のファイルと対応するspecファイルを行き来する"
  (interactive)
  (cond
   ((string-match "/app/" (buffer-file-name))
    (find-file (replace-regexp-in-string "/app/\\(.*\\)\\.rb" "/spec/\\1_spec.rb" (buffer-file-name))))
   ((string-match "/spec/.*_spec\\.rb" (buffer-file-name))
    (find-file (replace-regexp-in-string "/spec/\\(.*\\)_spec\\.rb" "/app/\\1.rb" (buffer-file-name))))))

(global-set-key [C-return] 'rails-file-switch)
```
Qiita に投稿する内容に関する注意点

## Qiita の名前と Qiita のタグを使い、ノウハウじゃない内容を投稿するとスタッフにより限定共有化されます

![CN9V901UsAEgp5r.png](https://qiita-image-store.s3.amazonaws.com/0/30241/b07a7ae0-5258-9489-2b4c-faa5dc0d07f1.png)

全然ノウハウじゃないのがダメだとしたら
箱のAAを表示する Ruby の書き方という内容にしておけば問題なかったかもしれませんし、ダメかもしれません

```ruby:hako.rb

puts <<-EOS
　     ＿＿_＿＿
　 ／ 　 ／　／|"
　|￣￣￣￣|   |
　|　　　　| ／
　 ￣￣￣￣
EOS
```

```bash:実行方法

ruby hako.rb
```

### ちなみに [利用規約](http://qiita.com/terms) を見たところ

```
第8条(禁止事項) 

2. ユーザーは、本サービスを利用するに際し、以下のような社会的に不適切な行為を行ってはなりません。
(5)自分以外の個人や会社、団体を名乗ったり、権限なく特定の会社や団体の名称を使用したり、架空の個人や会社、団体を名乗ったり、事実がないにも関わらず他の人物や会社、団体と業務提携や協力関係があると偽ったりする行為

6. ユーザーは、以上の各項の他、当社が不適切であると判断する行為を行ってはなりません。
```

2 - (5) の `権限なく特定の会社や団体の名称を使用` の適用かな？
どれに該当したのかを明記されていないのでなんとも言えませんが...


## さいごに

BAN された記事についたコメント面白かったです
書いてくれた方どうもありがとう
Qiita のスタッフさんお仕事お疲れ様です
今後は出来る限り役に立ちそうなものを書きたいと思います

---

## 追記

> makietanさま
> 
> Qiitaへご投稿いただき誠にありがとうございます。
> 
> ご投稿いただいた"はるばる Qiita ぜ"でございますが、
> テスト投稿と判断し、限定公開とさせていただきました。
> ※限定公開とは、投稿者本人及びURLを知っているユーザーのみ
>    アクセスすることができる状態です。
> 
> Qiitaでの投稿について不便な点やご要望等がございましたら、
> ぜひsupport@qiita.comまでご連絡ください:)
> 
> Qiitaは「プログラマの誰もが楽しくプログラムを書いて、
> いろんなモノを生み出すことができる世界」
> を実現するために、プログラマ一人一人の知識を共有するサービスです。
> 次はぜひmakietanさまがお持ちの
> プログラミングに関する知識をご投稿ください :)
> 
> —
> Qiita
> お問い合わせ: support@qiita.com

なにやらメールが来てました
テスト投稿すると限定公開してくれるそうです
あれがテスト投稿でない場合はどうなっていたのでしょうかね
ちなみに不便な点で言えば書いてくれたコメントが限定公開になった途端消えたことですかね
【メモ】ShellScriptでコマンドを実行したとき終了コードが0以外でも強制終了しないように終了コードを判定する

#概要

```bash:test.sh
perl ExitCode1.pl
if [ 0 == $? ] ; then
    echo "error"
else
    echo "succeeded"
fi
```

実行結果
> 何も表示されない.

#なんかperlを実行したとき終了コードが0以外だとshell scriptが即終了する
set -e つけてないのになぁ...
とはいえここは本記事の主題ではないのでどうでもいい。

#終了しないように終了コードを判定する

```bash:test.sh
if ! perl ExitCode1.pl > /dev/null ; then
    echo "error"
else
    echo "succeeded"
fi
```

実行結果
> error

#追記
dev/nullへ飛ばすコードはいらないっぽい。

```bash:test.sh
if ! perl ExitCode1.pl ; then
    echo "error"
else
    echo "succeeded"
fi
```

#追記の追記
set -e が入ってないと思ってたら入ってた。
SetFile

# **名前**
**/usr/bin/SetFile** -- ファイルやフォルダの属性を設定する (DEPRECATED)

# **書式**

```shell-session
/usr/bin/SetFile [-P] [-a attributes] [-c creator] [-d date] [-m date] [-t type] file ...
```

# **概要**
Xcode 6で非推奨[^1]となった**/usr/bin/SetFile**を含むCarbon開発をサポートするツール[^2]。

**/usr/bin/SetFile**はHFS+上のファイルやディレクトリのファイル属性を設定するツール。

[^1]: OS X El Capitanでも動作する。
[^2]: XcodeのCommand Line Toolsに含まれる。

# **説明**
## **-P**
シンボリックリンクを解決したファイルではなく、シンボリックファイル自身に作用する。

## **-a** *attributes*
属性が大文字小文字を区別する文字であるファイルの属性ビットを設定する。各々の文字はファイルの属性に対応する。大文字は属性ビットを(1)に設定、小文字は属性ビットを(0)に設定する。**注意:** 指定しない属性は変更されない。

    A | a    Alias file
    B | b    Has bundle
    C | c    Custom icon (allowed on folders)
    D | d    Located on the desktop (allowed on folders)
    E | e    Extension is hidden (allowed on folders)
    I | i    Inited - Finder is aware of this file and has
             given it a location in a window. (allowed on
             folders)
    L | l    Locked
    M | m    Shared (can run multiple times)
    N | n    File has no INIT resource
    S | s    System file (name locked)
    T | t    "Stationery Pad" file
    V | v    Invisible (allowed on folders)
    Z | z    Busy (allowed on folders)

## **-c** *creater*
ファイルクリエータを指定する。*creater*は4つのMacRoman文字列、nullクリエータを指定する空文字、または標準的な表記の2進数、10進数、8進数、16進数。

## **-d** *date*
作成日を指定する。*date*は"mm/dd/[yy]yy [hh:mm:[:ss] [AM | PM]]"形式の文字列。

## **-m** *date*
修正日を指定する。*date*は**-d**形式の文字列。

## **-t** *type*
ファイルタイプを指定する。*type*は4つのMacRoman文字列、nullクリエータを指定する空文字、または標準的な表記の2進数、10進数、8進数、16進数。

# **戻り値**
**0**&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;属性は設定
**1**&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;構文エラー
**2**&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;その他のエラー

# **例**
このコマンドラインは"myFile"の修正日を設定する。

```shell-session
$ SetFile -m "8/4/2001 16:13" myFile
```

このコマンドラインは"myFolder"シンボリックリンクを不可視に設定する。

```shell-session
$ SetFile -P -a V myFolder
```
指定した年度の月の一覧を取得する


[date_helper](https://github.com/pay4bugs/date_helper)は、months_between関数が追加される。指定した月の間のDateオブジェクトを返す。

# Gemfileに追加

```Gemfile
gem 'date_helper'
```

```
$ bundle install
```

# サンプルコード
```
year = 2015
result = Date.months_between(
	Date.new(year, 4).beginning_of_month,
	Date.new(year + 1, 3).end_of_month
)
result.each{|v| puts v.strftime("%Y-%m")}
```

出力結果

```
2015-04
2015-05
2015-06
2015-07
2015-08
2015-09
2015-10
2015-11
2015-12
2016-01
2016-02
2016-03
```
AWS LambdaでS3に配置されたファイルをgzipする

大量のファイルをgzipしたものをS3に配置したいニーズがあって、非力な手元のマシンで一旦gzipしてから転送するよりはLambdaにやらせたらいいのではないか？ということでやってみました。

- 以下のようなLambda functionを設置
  - 大きなファイル(数十MB以上)を扱う場合はtimeoutをデフォルトの3秒から伸ばす。メモリも128MBでは足りないことがあるので512MBなど
- S3の読み書き権限があるIAM Roleを設定
- S3のイベント通知でLambda functionをkick

`aws s3 sync` で大量のファイルを同期してもアップロードが終わったファイルから順番に処理が走るので、同期が終わった数秒後にはgzipされたファイルが生成されている状態になります。

```js
var aws = require('aws-sdk');
var zlib = require('zlib');

exports.handler = function(event, context) {
    var bucket = event.Records[0].s3.bucket.name;
    var key = event.Records[0].s3.object.key;
    if ( key.match(/\.gz$/) ) {
        context.succeed(key + ' already gzipped');
        return;
    }
    console.log('starting gzip ' + bucket + '/' + key);
    var s3 = new aws.S3();
    var gzStream = s3.getObject({ Bucket: bucket, Key: key }).
        createReadStream().pipe(zlib.createGzip());

    var s3obj = new aws.S3({ params: { Bucket: bucket, Key: 'gz/' + key + '.gz' }});
    s3obj.upload({Body: gzStream}).
        send(function(err, data) {
            context.done(err, data);
        });
};
```

streamを使うと、一旦テンポラリファイルに保存して変換してアップロードしなくても、S3からダウンロードしながらgzipしつつアップロードに回せて便利ぽい。
Hiveで未予約語を使うとき


ref: http://docs.treasuredata.com/articles/faq#hiversquos-reserved-keywords-why-do-i-get-a-warning-about-reserved-keywords

上記リンクでは、TreasureDataにおける予約語と未予約語の一覧がある。
未予約語はある特定の文脈で特別な意味を持ち、その他の文脈では識別子として利用することができる。

`VIEW`というワードはTreasureData(≒ Hive?)では、未予約語になっており、

`SELECT * FROM table WHERE view="start"`

とかだと

```
FAILED: ParseException line 1:25 cannot recognize input near 'view' '=' '"start"' in expression specification
```

こういうエラーが発生する。

なので、

```
"SELECT * FROM weak where \`view\`='start'"
```

でリクエストを送ることが出来た。

めでたしめでたし:ok_woman: