OmniAICreator/Qiita-1.07M huggingface dataset:
vba グラフの作る方法

# 結論
テンプレに埋め込みグラフを作っておいて、適当なイベントで内容を更新する方が簡単だった

# 調べたこと
VBA でグラフを作る方法

# 経過
* マクロでグラフ作成手順を記録
* ActiveChart とかいう謎の変数にキレる
* 「chartAdd chartAdd2 違い」でググる
* chartObject.setSourceData が動かなくて一時的に死ぬ
* Axes オブジェクトのリンクが無くて迷子になる
* Qiita で愚痴る ← いまここ

# 結果

* いわゆるグラフは worksheet オブジェクトの chartObjects コレクションに格納されている
* グラフは chartObject オブジェクトと chart オブジェクトから構成される
* chartObject はグラフの大きさや位置の情報を持っている
* グラフのデータは chart オブジェクトが持っている。chartObject.chart で取得できる。
* shapes.chartAdd メソッドでもグラフを追加できるが、リファレンスが狂っているので見なかったことにする。

# VBA

```vbnet

Sub test()
    Dim source, position
    Set source = Range("A1") ' グラフのデータソースとなる表の左上のセル
    Set position = Range("E1") ' グラフを貼り付けたい位置

    Dim sheet
    Set sheet = ActiveSheet
    
    ' 既存の埋め込みグラフを全て消す（sheet.chartObjects.deleteが動かない？
    Dim o
    For Each o In sheet.ChartObjects
        o.Delete
    Next
    
    ' 埋め込みグラフは chartObjects コンテナに入っているので、
    ' 最初に chartObjects コンテナに新しいグラフを追加する
    ' chart_o で受け取っている戻り値は、埋め込みグラフを表す chartObject オブジェクト
    Dim chart_o
    Set chart_o = sheet.ChartObjects.Add(position.Left, position.Top, position.Width * 10, position.Height * 20)
    
    ' 埋め込みグラフは位置や大きさなどを定義している chartObject に
    ' 実際のグラフが格納される形になっているため
    ' chartObject から chart を取り出して値を設定していく
    Dim chart
    Set chart = chart_o.chart
    Call chart.SetSourceData(source.CurrentRegion)
    With chart
        .ChartType = xlXYScatterLinesNoMarkers ' 散布図
        .HasTitle = True
        .ChartTitle.Text = "hogehoge"
    End With
    
    ' 縦軸ラベルの設定
    With chart.Axes(xlValue)
        .HasTitle = True
        .AxisTitle.Text = "fuga"
        .MaximumScale = 100
        .AxisTitle.Orientation = xlHorizontal
    End With
    
    ' 横軸ラベルの設定（時系列の場合）
    With chart.Axes(xlCategory)
        .MaximumScale = 1
        .MajorUnit = 4.16666666666667E-02 ' ラベルの間隔が 1 時間ごとになるよう微調整している
        .TickLabels.Orientation = xlTickLabelOrientationUpward
        .HasTitle = True
        .AxisTitle.Text = "poge"
    End With

End Sub
```

# 参考

* [Worksheet.ChartObjects メソッド (Excel)](https://msdn.microsoft.com/JA-JP/library/office/ff195149.aspx)
* [ChartObjects.Add メソッド (Excel)](https://msdn.microsoft.com/JA-JP/library/office/ff197613.aspx)
* [ChartObjects.Delete メソッド (Excel)](https://msdn.microsoft.com/JA-JP/library/office/ff837370.aspx)
* [ChartObject.Chart プロパティ (Excel)](https://msdn.microsoft.com/JA-JP/library/office/ff836502.aspx)
* [Chart メンバー (Excel)](https://msdn.microsoft.com/JA-JP/library/office/ff837379.aspx)
* [Chart.Axes メソッド (Excel)](https://msdn.microsoft.com/JA-JP/library/office/ff839276.aspx)
* [Axis メンバー (Excel)](https://msdn.microsoft.com/JA-JP/library/office/ff195770.aspx)
* [TickLabels.Orientation プロパティ (Excel)](https://msdn.microsoft.com/JA-JP/library/office/ff836188.aspx)
* [AxisTitle メンバー (Excel)](https://msdn.microsoft.com/JA-JP/library/office/ff834993.aspx)
* [AxisTitle.Orientation プロパティ (Excel)](https://msdn.microsoft.com/JA-JP/library/office/ff840807.aspx)
mistake > case文が意図通りに動かない > swtich文でdefaultがdefualt:になっている。

引用: C++プログラミングの落とし穴 by Steve Oualline

以下のプログラムは意図通りに動かない。
何故か?

```c:primeNumber.c
#include <iostream>
using namespace std;

int main() {
	int i;
    for(i = 2; i < 10; ++i) {
		switch(i) {
		case 2:
		case 3:
        case 5:
        case 7:
            std::cout << i << "is prime number" << std::endl;
			break;
		defualt:
           std::cout << i << "is not prime number" << std::endl;
			break;
		}
	}	 
	return 0;
}
```

```実行結果
2is prime number
3is prime number
5is prime number
7is prime number
```

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

#答え
swtich文でdefaultがdefualt:になっている。
http://ideone.com/7fZ7fL
で実行した所、コンパイルも通る。

どうやらdefault:の代わりにdefualt:やthisIsTest:などにしてもコンパイルは通るようだ。
iOS 64 bit 対応していないアプリを提出すると、どの段階で Apple から怒られるのか

2015/6/1 より iOS 64 bit 対応が必須となりました。

[64-bit and iOS 8 Requirements for App Updates](https://developer.apple.com/news/?id=12172014b)

そこで、もし 64 bit 対応をしていない (32 bit のみ対応) のアプリを審査に出した場合、どの段階で怒られるのか調べてみました。
アプリをアップロードするタイミングなのか、審査でリジェクトなのか…

# 結果
アプリをアップロードするタイミングでエラーになります。

Xcode の Organizer ウィンドウの Archives から、"Submit to App Store..." でアップロードしようとした所、以下のエラーでアプリの提出が出来ませんでした。

- エラーウィンドウ画面
![Screen Shot 2015-06-20 at 7.38.50 PM.png](https://qiita-image-store.s3.amazonaws.com/0/1635/cf771dd7-357e-8557-5a13-545ecf3df05f.png)

- エラー内容 // 画像の内容をテキストにしました

    ```
    ERROR ITMS-90086: "Missing 64-bit support. Beginning on February 1, 2015 new iOS apps submitted to the App Store must include 64-bit support and be built with the iOS 8 SDK. Beginning June 1, 2015 app updates will also need to follow the same requirements. To enable 64-bit in your project, we recommended using the default Xcode build setting of "Standard architectures" to build a single binary with both 32-bit and 64-bit code.
    ```

もし、誤って 64 bit 対応していないアプリをアップロードしてしまっても、審査提出前にエラーになるので安心ですね。

# 検証環境
- ビルド
    - Xcode の Architectures を armv7 に設定
- アプリアップロード手順
    - Xcode で archive -> Organizer で　"Submit to App Store..."
[php]foreachで最後だけ例外処理

基本だが、良く忘れるのでメモ。
end()を使う。

例)最後だけ改行を出力しない

```php:index.php
$h = [];
$h['a'] = 'testa';
$h['b'] = 'testb';
$h['c'] = "testc";

foreach($h as $key => $value){
    echo $key.' '.$value.'\n';
    
    if($value !== end($h)){
        echo "\n";
    }
}
/* 実行結果
a testa
b testb
c testc
*/
```
[追記]
@mpyw,@ngyukiさんから、下にもありますがご指摘いただきました。

end()や、reset()は、本来このようには使われないそうです。(・△・)ﾎｫ..
という訳でcountで作り直してみました。

```php:index.php
$h = [];
$h['a'] = 'testa';
$h['b'] = 'testb';
$h['c'] = "testc";

$length = count($h);     // 追加
$no = 0;    // 追加

foreach($h as $key => $value){
    
    echo $key.' '.$value.'\n';
    $no++;　//　追加
    
    if($no !== $length){    // 変更
        echo "\n";
    }
}

/* 実行結果
a testa
b testb
c testc
*/
```

@mpyw　@ngyukiさん、ご指摘ありがとうございました！
ヒア文字列内の文字コードを変換する


文字化けしちゃって解読不能…そんな時とりあえず文字化けしている中身を見たいとき
mb_convert_encodingが使えます。

例)SJISと仮定して、UTF8で表示する。

```php:index.php
$output = <<< EOL

HTML

EOL;
// UTF-8をSJISに変換
echo mb_convert_encoding($output,"SJIS","UTF-8");
```
utf8で正解ならば、ブラウザで確認した際ちゃんと表示されます。

以上！
実際に文字化けを直したい方はこちらの記事をご参考下さい
[htmlが文字化けした時確認すること3つ](http://qiita.com/ay123/items/57f0dafaeb30c1d66d11)
[Linux(CUI)上でShift-JISのphpファイルをutf8に変換](http://qiita.com/ay123/items/1a70a919f9dcbe086f1b)
Rails Devise Ajax ログイン・登録

DeviseをAjaxに対応する。API利用のトークン認証のやり方とかを参考に、まずはAjax対応のみ。

- [deviseをAPIで利用しやすくする -Token Authenticationの追加-](http://qiita.com/k-shogo/items/6d687c38b0f7b3ade6f5)
- [How To Set Up Devise AJAX Authentication With Rails 4.0](http://blog.andrewray.me/how-to-set-up-devise-ajax-authentication-with-rails-4-0/)

#### config/application.rb

```
    config.to_prepare do
      DeviseController.respond_to :html, :json, :js
    end
```

#### config/initializers/devise.rb

flashメッセージを取得するために以下のコメントアウトを外す
メッセージを直接セットするなら不要

`config.navigational_formats = ['*/*', :html, :js]`

sessions#createでwardenのrecallを実行するのに必要

`config.http_authenticatable_on_xhr = false`

#### flashを削除する

メッセージを直接セットするなら不要

```
    after_action :flash_clear
    def flash_clear
      if params[:format] == 'js'
        flash.clear
      end
    end
```

#### Devise以外のコントローラでformなどを使う（参考）

```
module ContentHelper
  def resource_name
    :user
  end

  def resource
    @resource ||= User.new
  end

  def devise_mapping
    @devise_mapping ||= Devise.mappings[:user]
  end
end
```

#### confirmableを有効にする場合は事前にチェックする

- [Devise: determine unconfirmed, confirmed, or not signed in user](http://www.drewag.me/posts/devise-determine-unconfirmed-confirmed-or-not-signed-in-user)

```
class Users::SessionsController < Devise::SessionsController
  prepend_before_action :check_unconfirmed_user, if: -> { request.xhr? }
  skip_before_action :verify_authenticity_token, only: [:destroy, :create]

  def create
    if params[:format] == 'js'
      opts = auth_options
      opts[:recall] = "#{controller_path}#failure"
      self.resource = warden.authenticate!(opts)
      sign_in(resource_name, resource)
    else
      super
    end
  end

  def failure
    flash.now[:alert] = I18n.t('devise.failure.invalid')
    render partial: 'shared/js/notify'
  end

  private
    def check_unconfirmed_user
      puts params
      unless params[:user][:email].blank?
        user = User.find_by(email: params[:user][:email])
        if user && !user.confirmed?
          flash.now[:notice] = I18n.t('devise.failure.unconfirmed')
          render partial: 'shared/js/notify'
          return
        end
      end
    end

end

```

#### 登録

```
class Users::RegistrationsController < Devise::RegistrationsController

  def create
    if params[:format] == 'js'
      flash.now[:notice] = I18n.t('devise.registrations.signed_up_but_unconfirmed')
    end
    super
  end

end

```
80番ポートが何に使われているか調べる

そんな時はnetstatコマンド。
試しに、80番ポートを調べてみる。
(まあ特別設定してない限りwebサーバだろうけど)

```shell:shell
netstat -anp | grep 80
```
grepで80を指定すれば、80番のみ検索できます。
(指定しないとずらああああっと出てくる。)

ちなみに使っているオプションはこれ
>-a send,recv両方表示
-n アドレス、ホスト、ユーザを数値で表示
-p PIDとプログラムを表示

ようは詳細に表示してねと。


以上！
Gradleの実行環境をデーモン化して素早くビルドできるようにする


Androidアプリの開発中に`./gradlew clean`したところ、下記のような表示が出てきました。

```bash
$ ./gradlew clean
:sample-app:clean
:sdk:clean

BUILD SUCCESSFUL

Total time: 13.855 secs

This build could be faster, please consider using the Gradle Daemon: http://gradle.org/docs/2.4/userguide/gradle_daemon.html
```

意訳すると「早くなるからデーモン化も考えてみて。リンクはここ http://gradle.org/docs/2.4/userguide/gradle_daemon.html 」といったところでしょうか。

## デーモン化する

以下のコマンドを実行すればOKです。
単純に設定ファイルの作成とデーモン設定を追加するだけのようですね。

```bash
$ touch ~/.gradle/gradle.properties && echo "org.gradle.daemon=true" >> ~/.gradle/gradle.properties
```

### 実行してみる

上記設定をしたうえで、再度`./gradlew clean`してみます。

```bash
# 初回はデーモンが起動していないので遅いはず。
$ ./gradlew clean                                                                                                                                                            
:sample-app:clean
:sdk:clean

BUILD SUCCESSFUL

Total time: 4.386 secs


# デーモンが立ち上がったかどうか確認
# 立ち上がってるっぽい。
$ ps ax | grep gradle
  993 ??         1:35.33 /Library/Java/JavaVirtualMachines/jdk1.8.0_05.jdk/Contents/Home/bin/java -XX:MaxPermSize=256m -XX:+HeapDumpOnOutOfMemoryError -Xmx1024m -Dfile.encoding=UTF-8 -Duser.country=JP -Duser.language=ja -Duser.variant -cp /Applications/Android Studio.app/Contents/gradle/gradle-2.4/lib/gradle-launcher-2.4.jar org.gradle.launcher.daemon.bootstrap.GradleDaemon 2.4 /Users/shoma2da/.gradle /Users/shoma2da/.gradle/daemon 10800000 61b537cf-de75-4f78-abf7-a3ae0e750734 -XX:MaxPermSize=256m -XX:+HeapDumpOnOutOfMemoryError -Xmx1024m -Dfile.encoding=UTF-8 -Duser.country=JP -Duser.language=ja -Duser.variant
 1387 ttys001    0:00.00 grep gradle
 

# 再度実行してみる
$ time ./gradlew clean
:sample-app:clean UP-TO-DATE
:sdk:clean UP-TO-DATE

BUILD SUCCESSFUL

Total time: 1.864 secs
```

上記のように初回は4秒少々、デーモン起動後は2秒弱となり倍近くなりました！すごい！

## デーモンを使わない場合は

`./gradlew --no-daemon clean`です。`--no-daemon`オプションを付けます

## デーモンを停止するには

`--stop`オプションを使います。

```bash
# デーモンが起動している！
$ ps ax | grep gradle
  993   ??  S      1:51.81 /Library/Java/JavaVirtualMachines/jdk1.8.0_05.jdk/Contents/Home/bin/java -XX:MaxPermSize=256m -XX:+HeapDumpOnOutOfMemoryError -Xmx1024m -Dfile.encoding=UTF-8 -Duser.country=JP -Duser.language=ja -Duser.variant -cp /Applications/Android Studio.app/Contents/gradle/gradle-2.4/lib/gradle-launcher-2.4.jar org.gradle.launcher.daemon.bootstrap.GradleDaemon 2.4 /Users/shoma2da/.gradle /Users/shoma2da/.gradle/daemon 10800000 61b537cf-de75-4f78-abf7-a3ae0e750734 -XX:MaxPermSize=256m -XX:+HeapDumpOnOutOfMemoryError -Xmx1024m -Dfile.encoding=UTF-8 -Duser.country=JP -Duser.language=ja -Duser.variant
 1629 s001  R+     0:00.00 grep gradle

  
# デーモンを止める
$ ./gradlew --stop
Stopping daemon(s).
Gradle daemon stopped.


# 止まった！
$ ps ax | grep gradle
 1713 s001  S+     0:00.00 grep gradle
```
Linux(CUI)上でShift-JISのphpファイルをutf8に変換

teratermの設定(Setup>terminal)をSJISに変更しても文字化けが直らない…。
sjisでファイルをサーバに置いた人を恨みつつutf8に変換します(・ω・`)sjisｷﾗｲ…

# まずはファイルの文字コードを確認

```shell:shell
nkf –-guess file.php
```
実行結果がshift JISだったら次へ

# utf8に変換

```shell:shell
nkf -Sw file.php > file.php.utf8
```
file.php.utf8が文字コードutf8で生成されます。

ちなみに、オプションの意味は
>-S ファイルの文字コードがShiftJISだと仮定する
-w UTF-8に変換する

ちなみに、直接file.phpを上書きしたいってときは

```shell:shell
nkf -Sw --overwrite file.php
```
overwriteオプション使います。
直接上書きするとバックアップが取れないのでお勧めはしません…。

以上！
Xcodeの中にはjavaが入ってる

#Xcodeの中にはjavaが入ってる

...というかその中のApplication Loader.appの中にはjavaが入ってます。

+ Xcode.app のバージョン6.3.2
+ Application Loader.app のバージョン3.1

だと、下記のようになりました。

```shell-session
> /Applications/Xcode.app/Contents/Applications/Application\ Loader.app/Contents/itms/java/bin/java -version

openjdk version "1.7.0-internal"
OpenJDK Runtime Environment (build 1.7.0-internal-root_2015_01_13_21_57-b00)
OpenJDK 64-Bit Server VM (build 24.80-b07, mixed mode)
```

どこでjavaを使ってるんでしょうね？
Jenkins に入れておきたいプラグイン

# 入れておきたいプラグイン

まあ、n番煎じですが

## [Build Trigger Badge Plugin](https://wiki.jenkins-ci.org/display/JENKINS/Build+Trigger+Badge+Plugin) 

ビルドの理由がアイコンでわかってちょっとお茶目

## [Environment Injector Plugin](https://wiki.jenkins-ci.org/display/JENKINS/EnvInject+Plugin)

インストールすると名前が変わる。利用可能なプラグインのリストではEnvInjectだったような・・・
MSBuildでビルドするのに環境変数設定が必要な場合とかに有効
（というか、そういう用途で使いたいと思っている）

## [SonarQube Plugin](http://docs.sonarqube.org/display/PLUG/Jenkins+Plugin)

コーディングルールチェックに。FxCop/StyleCopを直接たたくより色々使い勝手が良いので

## [Doxygen Plug-in](http://wiki.jenkins-ci.org/display/JENKINS/Doxygen+Plugin)

C#でせっかく書いたXMLドキュメントを活用してみたい

Jenkinsの管理の中に「インストール済みDoxygen」ってあって、自動インストールとかあるけど、Doxygen.exeの自動インストールをしてくれるわけじゃないのね・・・
しかも、doxygenの実行はバッチで実行しないといけない。単にプロジェクトページにHTMLへのリンクをはってくれるだけのプラグインのようだ

## [CI Skip Plugin](https://wiki.jenkins-ci.org/display/JENKINS/Ci+Skip+Plugin)

忘れてた。これは入れてみたい。Ruby Runtimeに依存してるのでうまく動くのかわからないけど・・・
mistake > char str[] と extern char *str;

引用: C++プログラミングの落とし穴 by Steve Oualline

```c:sub.cpp
char str[] = "Hello World";
```

```c:main.cpp
#include <iostream>

extern char *str;

int main()
{
    std::cout << str << std::endl;
    return (0);
}
```

CentOS6.5で上記cppをコンパイル・実行すると「Segmentation fault(core dumped)」になる。

何故か？

strの定義がchar []とchar *で異なるからということらしい。
> プログラムmain()はstrが文字ポインタであると考え、アドレスを期待してその場所から最初の4バイトを読み取る。最初の４バイトは「Hell」であり、それはアドレスではないのでプログラムはクラッシュする。


<hr>
こういうミスもあるためか、コーディング規約では以下のようにしているものもある。
(引用: 組込みソフトウェアの開発向けコーディング作法ガイド C++言語版])

    R3.1.1 (1)配列のextern宣言では要素数を必ず指定する。

上記の場合は

    extern char str[12];
にするのだろう。

ただし、Hellow Worldという文字を変更した時、12というサイズを変更する必要があり、その変更忘れというミスを誘発するかもしれない。
任意のコマンドやスクリプトをComposerから実行


Composerはインストールなどのタイミングで任意のPHP処理を実行する事が出来るが、実はPHP関係なくシェルコマンドも実行できる。

ポータビリティを保つのは難しいかもしれないが、シェルスクリプトを同梱するよりは統一感がある。具体的にはcomposer.jsonの"scripts"に任意に名前とコマンドを定義する。

```json
{
    "scripts": {
        "test": "phpunit"
    }
}
```

phpunitとあるが、別にどんなコマンドでも良い。定義されたコマンドはcomposerのサブコマンドのように実行できる。


	composer test


手元では下記のようなコマンドでgettextの起動をショートカットしている。

```json
{
    "scripts": {
		"i18n-extract": "xgettext.pl -D src/ -D templates/ -D towers/ -o i18n/default.pot"
	}
}
```
  
この場合も次のようにしてコマンドを実行できる。オプションを覚えなくていいので便利。

	composer i18n-extract
AmazonMWSのAPIでの注文情報の変更履歴取得について

業務の開発でAmazonMWSの注文API（ListOrdersなど）にて
出店店舗への注文情報を取得しようと考えています。

指定日に注文が確定した注文のみを取得したいのですが、
その際に前日など過去の注文ステータス（OrderStatus）の値、
もしくは注文情報の変更履歴（いつ、どの項目が変更になったか？）などを
取得することは可能なのでしょうか？
こちら側で過去の注文情報を保存参照するのではなく、
容量の関係で出来ればAPIのみで取得したいと思っています。

ご存知の方がいらっしゃいましたら、ご教授いただけますと幸いです。

よろしくお願いいたします。
gdbのrunで出てくるpermission deniedの対処

解決策は**/media/のディレクトリから/home/に変えること**


## 経緯
/media/XXX/a.outの挙動を見ようとgdbを使った時に問題が起こりました。
gdbでbreakpointを作ってからrunさせたときに以下のようにエラー

```
% gdb run
Starting program: /media/XXX/a.out 
zsh:1: permission denied: /media/XXX/a.out
During startup program exited with code 126.
```

解決は簡単でした
/media/~が悪かったようです
/home/ではないとダメみたいです

`sudo gdb a.out`でも不可、また/media/でコンパイルしたものを
/home/に移動させてgdbにかけてもダメです。
これは気づくのに時間がかかりました
注意が必要のようです
Kivy + Python3 on OSX 環境整備

PythonでiOS/Androidアプリが書けると知り、早速環境整備しようとするも、以外と手間取ったのでメモ。[公式ドキュメントはこちら](http://kivy.org/docs/installation/installation.html)。

# 必要なパッケージインストール
## 各種ライブラリ

Kivyがpygameに依存しており、さらにそのpygameが依存しているSDLライブラリ群を事前にインストールする必要があり、さらにsdl_ttfが依存しているfreetypeをインストールする際に起きるエラーを回避するため、libpngを--universal付きでインストールする必要がある。ややこしい…。

```bash
brew reinstall libpng --universal
brew install sdl sdl_image sdl_mixer sdl_ttf portmidi
```

## ソースからインストール
### 普通にリポジトリをcloneしてからインストールする方法
ソースをゲットする。

```bash
git clone --depth 1 -b 1.9.0 --single-branch  https://github.com/kivy/kivy.git
git clone --depth 1 -b 0.21.2 --single-branch https://github.com/cython/cython.git
```

まずはCythonをビルドしてインストールする。

```bash
cd cython
python3 ./setup.py build
sudo python3 setup.py install
```

同様にKivyもビルドしてインストールする。

```bash
python3 setup.py build_ext --inplace -f
sudo python3 setup.py install
```

インストールできていることを確認。

```bash
pip3 list | grep -e Cython -e Kivy
Cython (0.21.2)
Kivy (1.9.0)
```

### pipにリポジトリを直接指定する方法
下記のようにすれば、いちいちgit cloneせず、直接リポジトリを指定してインストールできる。

```bash
sudo pip3 install git+https://github.com/kivy/kivy.git@1.9.0
sudo pip3 install git+https://github.com/cython/cython.git@0.21.2
```

# サンプルコード実行
[Kivy公式サイト](http://kivy.org/docs/tutorials/pong.html#getting-started)のサンプルコードを実行してみると、OSXのUIが表示された。これでやっとスタートラインに立つことができた。

```py3
#!/usr/bin/env python3
# -*- coding:utf-8 -*-

from kivy.app import App
from kivy.uix.widget import Widget

class PongGame(Widget):
    pass

class PongApp(App):
    def build(self):
        return PongGame()

if __name__ == "__main__":
    PongApp().run()
```

![スクリーンショット 2015-06-20 21.43.04.png](https://qiita-image-store.s3.amazonaws.com/0/27086/6ac82f55-be5f-2dcc-723d-dcdf6c4552a3.png)

# 参考資料

* [freetype failed to build on 10.10](https://github.com/Homebrew/homebrew/issues/38360)
* [Installing Pygame for Python 3 on OS X](http://florian-berger.de/en/articles/installing-pygame-for-python-3-on-os-x/)
VAIO type P + Xubuntu 14.04 初期設定メモ


## 目的

小型で無音、低電力なLXCホストを構築。

type PでVMを動かすのはつらいけど、LXCならわりといける。
作って増やせて壊せる環境って最高。

## OSインストールについて

- Xubuntu 14.04 ISOファイルをダウンロード
	- http://xubuntu.org/getxubuntu/
- UNetbootinでブータブルUSBを作成
	- http://unetbootin.sourceforge.net/
	- Macで作るとうまくブートしないことがあった
	- Linuxで作るといけた
- USBブートしインストール
	- BIOS(起動時F2)でUSBから起動できるように設定すること

## 初期設定

### 1. アップデート

初回ログイン時にアップデートの通知が表示される。指示に従いインストールする。
カーネルの更新も入るため、アップデート後は再起動する。


### 2. 日本語入力環境の構築

uimとuim-mozcをインストールする。
uimの選択理由は、xrdpでも難なく使えたから。
(ibus, fcitxではダメだった)

```bash:uim導入
$ sudo apt-get install uim uim-mozc
```

その後、メニューより「設定」→「言語サポート」を起動する。
「不完全な言語サポート」という画面が表示されるので、指示に従いインストールする。
「キーボード入力に使うIMシステム」から「uim」を選択する。

再起動する。


### 3. 有線ネットワークドライバの変更

デフォルトでsky2というドライバが導入され、有線ネットワークはそのままでも利用可能。
ただし、高負荷をかけると通信不可になる不具合がある。

sky2の使用を止め、Marvellのsk98linドライバを導入する。
公式版だとKernel 2.6.Xまでの対応なので、3.16.Xで使えるように修正して使用する。

修正版は下記に置いておく。導入方法も下記参照。無保証。
https://github.com/kinumi/sk98lin


### 4. SSHの導入

リモートメンテ用。

```bash:ssh導入
$ sudo apt-get install ssh
```

### 5. xrdpの導入

リモートメンテ用。

X11RDP-o-Maticで入れる。
https://github.com/scarygliders/X11RDP-o-Matic

Type Pだとビルドに半日以上かかるので、別マシンでビルドして入れるのが良い。
ビルド済バイナリを下記に置いておく。無保証。
https://drive.google.com/folderview?id=0BzkCNJJu2girdjZPMFVydm1DbFE&usp=sharing

```bash:ビルド済みxrdp導入
$ dpkg -i x11rdp_0.9.0-1_i386.deb xrdp_0.9.0-1_i386.deb
```


### 6. LXC, LXC-Web-Panelの導入

目的の品。LXC-Web-Panelはお手軽管理用に入れておく。

```bash:lxc導入
$ sudo apt-get install lxc
```

```bash:lwp導入
$ wget -O - http://claudyus.github.io/LXC-Web-Panel/claudyus.gpg.key | sudo apt-key add -
$ echo "deb http://claudyus.github.io/LXC-Web-Panel/ debian/" | sudo tee /etc/apt/sources.list.d/lwp.list
$ sudo apt-get update
$ sudo apt-get install lwp
$ sudo update-rc.d lwp defaults
```

### 7. IPアドレス変更

eth0、wlan0のIPアドレスをそれぞれ適切に変更する。

### 8. LXCのストレージバックエンドでbtrfsを使う

lxcのストレージバックエンドにbtrfsを使えるようにする。
btrfsにすることで、クローンやスナップショットが便利になる。

http://qiita.com/kinumi/items/8ebc4535998a8bcc0a59

### 9. cifs-utilsの導入、NASのマウント

NASでDropboxを同期させて、マウント。
コンテナからそこを参照できるようにする。

```bash:cifs-utils導入
$ sudo apt-get install cifs-utils
```

```bash:NASのマウント
$ sudo mkdir /mnt/Dropbox
$ sudo vi /etc/fstab #下記参照
$ sudo mount -a
```

```bash:fstabに追記する内容
//a.b.c.d/Dropbox     /mnt/Dropbox     cifs username=xxx,password=xxx,uid=xxx,gid=xxx,file_mode=0644,dir_mode=0755 0 0
//a.b.c.d/GoogleDrive /mnt/GoogleDrive cifs username=xxx,password=xxx,uid=xxx,gid=xxx,file_mode=0644,dir_mode=0755 0 0
//a.b.c.d/xxx         /mnt/dsm-xxx     cifs username=xxx,password=xxx,uid=xxx,gid=xxx,file_mode=0644,dir_mode=0755 0 0
//a.b.c.d/yyy         /mnt/dsm-yyy     cifs username=xxx,password=xxx,uid=xxx,gid=xxx,file_mode=0644,dir_mode=0755 0 0
```

### 10. セキュリティアップデートの自動適用設定

セキュリティアップデートが自動的に適用されるようにしておく
https://help.ubuntu.com/community/AutomaticSecurityUpdates

```bash:セキュリティアップデートの自動適用設定
$ sudo apt-get install unattended-upgrades
$ sudo dpkg-reconfigure -plow unattended-upgrades

```
エラトステネスの篩 （ Haskell, Data.Vector 版 ）

エラトステネスの篩のアルゴリズムを使って素数のリストを返す関数を作ってみました。

Ruby や Scheme の時と同じように配列をバリバリ使いたかったので、Data.Vector を利用しました。
「求める素数の上限を決めなくてはならない」という制限はありますが、一億以下の素数を 5 秒たらずで求められるので、高速な方だと思います。
　

```primeList.hs
import qualified Data.Vector.Unboxed         as U
import qualified Data.Vector.Unboxed.Mutable as UM
import Control.Monad.ST
import Control.Monad

--
-- エラトステネスの篩による素数リスト
--
-- * ex : primeList 20  =>  [2,3,5,7,11,13,17,19]
--
primeList :: Int -> [Int]
primeList n = 2 : (map indexToValue $ U.toList $ U.elemIndices True $ sieve)
  where
    indexToValue i = 2 * i + 3
    valueToIndex v = div (v - 3) 2
    lastIndex      = valueToIndex n

    sieve = runST $ do
      mVec <- UM.replicate (lastIndex + 1) True
      mapM_ (loop mVec) [0 .. valueToIndex (floor $ sqrt $ fromIntegral n)]
      U.unsafeFreeze mVec

    loop vec i = do
      v <- UM.unsafeRead vec i
      when v $ do
        let (s, d) = (2 * i * (i + 3) + 3, indexToValue i)
        mapM_ setFalse [s, s + d .. lastIndex]
          where setFalse i = UM.unsafeWrite vec i False




main :: IO ()
main = print $ last $ primeList 100000000
```

```
>primeList +RTS -sstderr
primeList +RTS -sstderr
99999989
   4,902,213,164 bytes allocated in the heap
         393,184 bytes copied during GC
      50,026,280 bytes maximum residency (3 sample(s))
         342,232 bytes maximum slop
              49 MB total memory in use (0 MB lost due to fragmentation)

                                    Tot time (elapsed)  Avg pause  Max pause
  Gen  0      9289 colls,     0 par    0.11s    0.07s     0.0000s    0.0021s
  Gen  1         3 colls,     0 par    0.00s    0.01s     0.0017s    0.0049s

  INIT    time    0.00s  (  0.00s elapsed)
  MUT     time    4.29s  (  4.86s elapsed)
  GC      time    0.11s  (  0.08s elapsed)
  EXIT    time    0.00s  (  0.01s elapsed)
  Total   time    4.40s  (  4.94s elapsed)

  %GC     time       2.5%  (1.6% elapsed)

  Alloc rate    1,142,699,706 bytes per MUT second

  Productivity  97.5% of total user, 86.8% of total elapsed
```

他の関数と一緒に [GitHub](https://github.com/little-schemer/MyModule) で公開しています。
MacでPostgreSQLをバックグラウンドで起動(デーモン化)する


PostgreSQLをBackGround起動(Daemon化)する。

## 前提条件

* PostgreSQLが通常起動すること

  ```
$ postgres -D /usr/local/var/postgres # パスは任意
```

* まだインストールしていない場合は入れる

  ```
$ brew install postgresql
$ initdb /usr/local/var/postgres # パスは任意
```

## 手順
### 起動
以下のどちらか

```
$ pg_ctl start -D /usr/local/var/postgres -l logfile
```

```
$ postgres -D /usr/local/var/postgres >logfile 2>&1 &
```


### 終了

```
$ pg_ctl stop -D /usr/local/var/postgres
```

## 参考
http://www.postgresql.org/docs/9.1/static/server-start.html
herokuでも自前のサーバでも動くhubotをdockerで作る

追記(2015/09/26):
herokuのdocker-compose対応に伴ってdocker:startコマンドが無くなりました。
hubotについては書いていませんが、最新のheroku+dockerの連携方法については[こちらの記事](http://qiita.com/mpppk/items/cab82ec97fad37867eba)を参照してください。
-- 追記ここまで

herokuの無料プランが１日18時間になって、どこでhubotを動かすか悩んでいる方も多いのではないでしょうか。
そこで、herokuがdockerに対応したことを利用し、herokuでもその辺のサーバでも動くhubot入りコンテナを準備したいと思います。

前提として、ローカル環境には、以下がインストールされているものとします。

* docker 
* hubot
* generator-hubot
* [heroku-toolbelt](https://toolbelt.heroku.com/)

参考:
[Slack で Hubot を使えるようにする](http://qiita.com/misopeso/items/1f418dd02e89234499b3)
[Docker + Yeoman + Hubot + Slack で簡単bot作成](http://blog.fenneclab.com/docker-yeoman-hubot-slack/)

まずは新しくhubotを作ります。

```
mkdir test-hubot && cd test-hubot
yo hubot
```

いろいろ聞かれるので、適宜答えてください。
処理が終わると、hubot関係のファイルが展開されているはずです。

今回はadapterをslackにするので、API Tokenを調べておきましょう.
参考:[SlackのHubot Integrationが知らぬ間にアップデートされてた](http://qiita.com/KeitaMoromizato/items/0ee11d795d18a49538d8)

.envというファイルを以下の内容で作成します。

```.env
HUBOT_SLACK_TOKEN=XXXX
```

XXXXは、さっき調べたAPI Tokenで置き換えてください。

次に、Dockerfileを準備します。
まずherokuのdockerプラグインを導入します。

```
heroku plugins:install heroku-docker
```

以下のコマンドでDockerfileが生成されます。

```
heroku docker:init
```

あとはdocker:startでhubotが動きます。

```
heroku docker:start
```

slackからpingと入力して動作確認してみましょう。
PONGと返って来れば、正しく動作しています。

これで、heroku-toolbeltとdockerがあればhubotがどこでも動くようになりました。
では、herokuにデプロイしてみましょう。

```
heroku create --app HOGEHOGE
heroku config:add --app HOGEHOGE HUBOT_SLACK_TOKEN=XXXX
heroku docker:release --app HOGEHOGE

```
もういちどslackからpingと入力してPONGと返って来れば、heroku上でhubotが動いています。
お手軽ですね。
herokuのnode.jsでagendaを使う

herokuで起動しているnode.js(hubot)で[agenda](https://github.com/rschmukler/agenda)を使う設定のメモ

### heroku

mongodbが必要なのでmongolab(無料枠)をaddonする  

```bash
heroku addons:create mongolab:sandbox
```

### node script

```coffeescript
Agenda = require('agenda')
agenda = new Agenda({db: { address: process.env.MONGOLAB_URI ? 'localhost:27017/agenda'}})

module.exports = (robot) ->
  agenda.define 'agenda:task1', (job, done) ->
    # tasks

  agenda.now('agenda:task1')
  agenda.start()
```
Fuelphp DBジェネレートコマンド一覧

##### 設定ファイル雛形

``` app/migration.php
return [
	'version' => [
		'app' => ['default' => 0],
		'module' => [],
		'package' => []
	],
	'folder' => 'migrations/',
	'table' => 'migration'
];
```

#### マイグレーションコマンド

```
$ php oil refine migrate
$ php oil refine migrate:current（あんまり使わない）
$ php oil refine migrate:up
$ php oil refine migrate:down
$ php oil refine migrate --version=10

$ php oil refine migrate -all

$ php oil refine migrate
$ php oil refine migrate --version=4
$ php oil refine migrate --version=5
$ php oil refine migrate:down
$ php oil refine migrate:up

php oil g model test int:int[11], big_int:INT[11], decimal:decimal[5,2], big_decimal:DECIMAL[5,2],  float:float[5,2] big_float:FLOAT[5,2] enum:enum['a','b','c'], big_enum:ENUM['a','b','c']

```

#### マイグレーションファイル生成

###### テーブル名の変更
```$ php oil generate migration rename_table_users_to_accounts```
###### テーブル作成
```$ php oil generate migration create_users name:text email:string[50] password:string[125]```
###### テーブルのの削除
```$ php oil generate migration drop_accounts```
###### カラムの追加
```$ php oil generate migration add_bio_to_accounts bio:text```
###### カラムの削除
```$ php oil generate migration delete_bio_from_accounts bio:text```
###### カラム名の変更
```$ php oil generate migration rename_field_name_to_username_in_accounts```

##### 便利なジェネレートコマンド例

```
$ php oil g controller posts action1 action2 action3
    
$ php oil g model post title:varchar[50] body:text user_id:int
    
$ php oil g model post title:varchar[50] body:text user_id:int --no-migration
 
$ php oil g model post title:varchar[50] body:text user_id:int created_at:datetime --crud
    
$ php oil g model post title:varchar[50] body:text user_id:int --no-timestamp

$ php oil g model post title:varchar[50] body:text user_id:int --mysql-timestamp --created-at=my_created

$ php oil g model post title:varchar[50] body:text user_id:int --soft-delete

$ php oil g model post title:varchar[50] body:text user_id:int --soft-delete --deleted-at=mydeleted

$ php oil g controller posts action1 action2 action3 --with-viewmodel

$ php oil g scaffold monkey name:string description:text

$ php oil g admin project_entry title:string abstract:text full_text:text project_id:int is_draft:int order:int -s

$ php oil g task newtask cmd1 cmd2
```
2015-06-20 win > ポートが開いているか確認する > PortQry2

Windows8.1からLinuxのポートの開放確認

PortQryというツールを使う
[参考](http://propg.ee-mall.info/it/%E7%9B%B8%E6%89%8B%E5%85%88%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%B8%E3%81%AE%E3%83%9D%E3%83%BC%E3%83%88%E3%81%8C%E9%96%8B%E3%81%84%E3%81%A6%E3%81%84%E3%82%8B%E3%81%8B%E3%82%92%E8%AA%BF%E3%81%B9/)

[ダウンロード @ Microsoft](http://www.microsoft.com/en-us/download/details.aspx?id=17148)

コマンドの例は以下

```
PortQry.exe -n 192.168.10.5 -r 2718:3141
```

以下のような結果が返ってくる

```
TCP port 2718 (unknown service): LISTENING
...
TCP port 3141 (unknown service): FILTERED
```
(PortQry Test Messageという文字列を送るようだ)。

FILTEREDは開放されていないポート


UDPの確認は以下のようにする [参考](http://www.infraeye.com/infra2-blog/skillnetwork/skillnetwork8.html)

```
PortQry.exe -n 192.168.10.5 -e 3141 -p UDP
```

実行結果がUDPの時はLISTENING or FILTEREDになるようだ
[参考](http://blogs.technet.com/b/askds/archive/2009/01/22/using-portqry-for-troubleshooting.aspx)
> If you get a LISTENING or FILTERED response, check and see whether we are checking TCP or UDP, most likely it was attempting to use UDP and this would be a normal response as UDP is connectionless. 

### 追記 2017/12/22

上記のUDP開通確認にて「FILTERED」が表示される場合は、iptablesなどでフィルタされているようだ。
linux > 空きポートの確認 (ホストmacとゲストCentOS)

```txt:動作環境
仮想ゲストOS: CentOS6.5
ホストOS: Mac OSX
```

CentOS6.5のポート開放をしているのだが、きちんと開くようになったか調べる必要があった。以下のようにした。

##CentOS6.5側
nc(netcat)をインストールしておく
1. iptablesを書き換える
2. /etc/init.d/iptables restart
3. nc -l 31415にてポート31415で待つ

##Mac OSX側
ターミナルで以下を実行する

    telnet 192.168.10.5 31415

3つめの数字がポート。

##Connection refused
CentOS側でncを実行していないとどうなるか。

    telnet: connect to address 192.168.10.5: Connection refused
と表示され、あたかもポート開放ができていないように勘違いする。

##参考
http://serverfault.com/questions/145614/iptables-allowed-port-refusing-connection

<hr>
(追記 2015/10/18)
Windowsからチェックする場合は PortQry2 というツールを使う。
http://qiita.com/7of9/items/1d2e123d592d22fd6c55
Intel Edisonで録音する


[Audioの再生はできたけど、録音ができなかったエントリ](http://qiita.com/sparkgene/items/758e6c745371893f745f)の続きです。

## 音量調整

`alsamixer`コマンドはGUIで音量の設定をできるものです。
コマンドを実行すると、こんな画面が表示されます。

![スクリーンショット 2015-06-20 10.49.21.png](https://qiita-image-store.s3.amazonaws.com/0/36184/84dba146-8046-87dd-19be-1d6b42142d4f.png "スクリーンショット 2015-06-20 10.49.21.png")
サウンドカードの選択は、`F6`キーで押すと、サウンドカード選択用のポップアップが表示されます。
![スクリーンショット 2015-06-20 10.49.35.png](https://qiita-image-store.s3.amazonaws.com/0/36184/9905f903-bf6c-f0c3-717b-12ed2d8172b3.png "スクリーンショット 2015-06-20 10.49.35.png")
カーソルキーで`2 C-Media USB Headphone Set`を選んでエンターキーを押します。

![スクリーンショット 2015-06-20 10.49.47.png](https://qiita-image-store.s3.amazonaws.com/0/36184/4421e7a0-8667-0f19-08f7-4ae84c04a463.png "スクリーンショット 2015-06-20 10.49.47.png")
ヘッドホン、マイクのボリューム調整画面に変わるので、カーソルキーで調整して`Esc`キーで抜けます。

## 録音

録音で利用できるデバイスを確認します。

```
root@sparkgene_edison:~# arecord -l
**** List of CAPTURE Hardware Devices ****
card 0: Loopback [Loopback], device 0: Loopback PCM [Loopback PCM]
  Subdevices: 8/8
  Subdevice #0: subdevice #0
  Subdevice #1: subdevice #1
  Subdevice #2: subdevice #2
  Subdevice #3: subdevice #3
  Subdevice #4: subdevice #4
  Subdevice #5: subdevice #5
  Subdevice #6: subdevice #6
  Subdevice #7: subdevice #7
card 0: Loopback [Loopback], device 1: Loopback PCM [Loopback PCM]
  Subdevices: 8/8
  Subdevice #0: subdevice #0
  Subdevice #1: subdevice #1
  Subdevice #2: subdevice #2
  Subdevice #3: subdevice #3
  Subdevice #4: subdevice #4
  Subdevice #5: subdevice #5
  Subdevice #6: subdevice #6
  Subdevice #7: subdevice #7
card 1: dummyaudio [dummy-audio], device 0: 14 []
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 1: dummyaudio [dummy-audio], device 1: ((null)) []
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 1: dummyaudio [dummy-audio], device 2: ((null)) []
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 2: Set [C-Media USB Headphone Set], device 0: USB Audio [USB Audio]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
```
再生と同じで、card 2, device 0でした。

マイクを繋いで録音を試してみます。

```
root@sparkgene_edison:~# arecord -D plughw:2,0 record.wav

Recording WAVE 'record.wav' : Unsigned 8 bit, Rate 8000 Hz, Mono
```

このコマンドだと、`Ctrl + C`で中断するまでずっと録音を続けるので、無駄にでかいファイルにならないように `-d 5`オプションを指定して5秒で録音を停止すると便利。

しかし、うまく録音されません。。

色々と調べてみても原因がわからず、使っているのが子供のおもちゃ用だからかなと思い。。。
![IMG_5443.jpg](https://qiita-image-store.s3.amazonaws.com/0/36184/1895c897-d9fa-0f24-5bf1-e9015246a561.jpeg "IMG_5443.jpg")


原理は同じなのでイアホンをマイクの所に挿し、録音を試すとわずかに雑音が！

あれ？と思い、MacにUSBのサウンドカードを挿して試してみると、おもちゃのマイクだと全く入力がないけど、イアホンを挿すと雑音だけど入力がある。。

よくよく見ると、マイクの方もコネクタがステレオ対応していそうな端子がついてて、それが悪さをしているのかと思い、浅く挿したら音を拾うようになったｗｗ
![IMG_5444.jpg](https://qiita-image-store.s3.amazonaws.com/0/36184/35c6cdad-2b82-7970-92f2-4c8b88ded967.jpeg "IMG_5444.jpg")

というわけで、Edisonのファームを2.1にアップデートすると、簡単にオーディオを扱えるようになりました。
PandocとPDFのレイアウトの話

私はだいたいMarkdownで書いてPandocでPDFを出力することが多いです(Pandocは内部でLaTeXに変換しています)。

この方法のメリットは、

- LaTeXを書くのはつらい。Markdownは読みやすく書きやすい
- PandocならリアルタイムにHTMLに変換しつつ確認できる
- Pandoc+Markdownで数式も注もテーブルも書ける
- Markdownの入力をサポートするツールもたくさんある

ただし、設定など結構くせがあるので普段使っているやり方を書いておきます。

おそらく日本語でLaTeXを書く人はpLaTeX2eを使っている人が多いように思います。ただ、Pandocはplatexには対応していません。
PandocでPDFを出力しようとすると、デフォルトはpdfTeXが使用されます。しかしこれは日本語に対応していませんので、日本語のPDFを出力するには以下のいずれかを使う必要があります。

- 1. Pandocが対応しているLuaLaTeXを使用する
- 2. 一度LaTeXに変換し、dvipdfmxなどを使用してDVIに変換してからPDFに変換する

この方法から移行するには2のやり方がなじみやすいでしょう。また論文などでレイアウトの指定がある場合は2の選択肢しかないかもしれません。


## 1. LuaLaTeXを使う
日本語でよく使われている文書クラスjsarticle、jarticleはLuaLateXでは使えないため、ltjarticle、ltjsarticleを使用します。
また、ltjsarticleはmicrotypeパッケージと相性が悪く、パッチをあててやる必要があります。
これについては[Pandocを使ってMarkdownからPDFを生成する](http://qiita.com/takeh1k0/items/ff84cb85bfffedc75066)に解説があります。


わたしはだいたい以下のようなコマンドで変換しています。パッチをあてたltjsarticleを指定し、geometryパッケージで余白を1インチに設定しています。`-N`は節に数字をふるオプション、`--toc`は目次をつけるオプションです。
デフォルト設定は余白が大きすぎるような気がするので何となく1インチにしてます。

```shell-session

$ pandoc -f markdown -o file.pdf -V documentclass=myltjsarticle --latex-engine=lualatex -V geometry:margin=1in -N --toc
```

これは以下のようなtexと等価です。

```latex

\documentclass{ltjsarticle}

\usepackage[margin=1in]{geometry}
```

## 2. dvipdfmxを使う
こっちは結構めんどくさいです。ただ、最初にテンプレートだけ用意してやればあとは使い回せると思います。

以下を変換します。

```myarticle.txt
# 今日の日記

今日のご飯。

ゴハン   メニュー
------ ---------
朝御飯  パン
昼御飯  カレー
夜御飯  焼き肉

```

```shell-session
$ pandoc -f markdown -t latex myarticle.txt -o myarticle.tex
```

以下のようなtexに変換されます。これは原稿のbodyの部分だけなので自分でドキュメントの外形を用意してやる必要があります。

```latex:myarticle.tex
\section{今日の日記}\label{ux4ecaux65e5ux306eux65e5ux8a18}

今日のご飯。

\begin{longtable}[c]{@{}lc@{}}
\toprule
ゴハン & メニュー\tabularnewline
\midrule
\endhead
朝御飯 & パン\tabularnewline
昼御飯 & カレー\tabularnewline
夜御飯 & 焼き肉\tabularnewline
\bottomrule
\end{longtable}

```

以下のようなガワを用意し、変換します。

```latex:article.tex
\documentclass[11pt,a4paper]{jarticle}
%
\usepackage{amsmath,amssymb}
\usepackage{bm}
\usepackage{booktabs}
\usepackage{graphicx}
\usepackage{longtable}

\title {今日のご飯}
\author {takada-at}

\begin {document}
\maketitle
\input {myarticle}
\end{document}
```

```shell-session
$ pandoc -f markdown -t latex myarticle.txt -o myarticle.tex
$ platex article.tex
$ dvipdfmx article.dvi 
```

無事PDFができました。こちらの場合レイアウトはガワで指定するので、LaTeX側で好きな設定を選ぶことができます。
気軽に glitch できるモジュールをつくったのですが entry_points から引数をわたせない

https://github.com/trsqxyz/glitch

```setup.py
entry_points={
		"console_scripts": [
			"glitch = glitch.glitch:main",
		]
	}
```
これで CLI として起動ができるのはわかったのですが引数がわたせない
`sys.argv` かなと思ったけどちがうし  
ちなみに渡したいのは `glitch -i lena.jpg` という感じです
`cliff` とか見てみたのですがモジュールで `docopt` つかってるのでなにがどうすればいいのかよくわからなくてだるくなってここに書いてます  
`python -m glitch -i lena.jpg maximum hard` とかは動く


# 2015/06/21
`main()` から `_main()` よぶという方法で実行可能に!!
`pip install glitch` でインストール可能になりました まだおかしいところあるけどとりあえずこれで  
@Lspeciosum アドバイス大変参考になりました ありがとうございました
CentOS 6.6にNagiosをインストールする

# 準備
```
$ sudo yum -y install httpd
```

# Nagiosをインストール
```
$ sudo rpm -ivh http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm
$ sudo yum -y install Nagios
```

# BACIS認証の設定
とりあえず設定ファイルのデフォルトユーザー`nagiosadmin`を使う。

```
$ sudo htpasswd -c /etc/nagios/htpasswd.users nagiosadmin
New password:
Re-type new password:
Adding password for user nagiosadmin
```

# サービス起動
```
$ sudo service nagios start
$ sudo service httpd start
```

# 動作確認
http://192.168.33.10/nagios/ (IPはサンプル)
mistake > return (i++);

引用: C++プログラミングの落とし穴 by Steve Oualline

```c
int second(void)
{
    static int i = 0;
    return (i++);
}
```

上記のsecond()を3回まわして、1,2,3が出るのを期待していた。結果は0,1,2だった。

何故か?

    return (i++);
はiの値を返してから++するから。

i++;は単独行で実行してから`return i`しましょう、とのこと。
RubyMineとRuboCopを連携させる

![image](https://qiita-image-store.s3.amazonaws.com/0/25818/f8d116f3-f4b4-6ded-85d3-2344754c1f34.png) **×** ![無題.jpg](https://qiita-image-store.s3.amazonaws.com/0/25818/3fee3d5a-1d73-d34e-2fe2-7e1d695fc2df.jpeg)


**※RubyMine2017.1からIDEでRuboCopがサポートされることになりました。**
[RubyMine公式ブログ](https://blog.jetbrains.com/ruby/2017/01/rubymine-2017-1-eap-2-creating-gemsets-rubocop-support/?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+jetbrains_rubymine+%28JetBrains+RubyMine+Blog%29)


## プラグインをインストール
RubyMineの`Preference > Plugins`から"RuboCop"を検索してインストールしましょう。
![image](https://qiita-image-store.s3.amazonaws.com/0/25818/7aabb161-f41d-54f4-5752-800553eef2d0.png)


RubyMineを再起動して、`Editor > Inspections`のRuby配下にRubocopが表示されていれば、インストール完了です。

![image](https://qiita-image-store.s3.amazonaws.com/0/25818/d038d001-0161-54ee-a862-92da28d17c6b.png)


## 各種設定

* `.rubocop.yml`をプロジェクトrootに配置する。(※ `rubocop.yml`じゃダメ)
* `bundler`を使用する場合は、`Gemfile`にrubocopをincludeする。

以上の設定が正しくできれば、IDEのエディタ上にコードの解析結果が表示されるようになります。

`Code > Inspect Code...`からもコード解析を実行できます。

## その他

`.rubocop.yml`の設定はこちらの記事を参考にさせていただきました。
サンプルファイルもダウンロードできます。（ありがたや）
[RuboCopを調教、規約よりも速度優先なrubocop.ymlを試してみよう](http://sideci.hatenablog.com/entry/2015/03/26/103000)

Vagrant上の環境などRemoteのSDKに対しては、現在未対応でissueがあがってます。
https://github.com/sirlantis/rubocop-for-rubymine/issues/11
c++ builder > LME288 (2015-06-20版) > Enable to perform link (リンクできません)の回避策

```txt:動作確認
C++ Builder XE4
```

何故か時々以下のエラーが出てビルドできない時がある。

```
[ilink32 Warning] Warning: unknown heap name   : 0x08000000 /
>> 0x08000000 
[ilink32 Warning] Warning: Error detected (LME288)
[ilink32 Error] Error: Unable to perform link
```

対応策としてやってみて有効になるのは以下のいずれか
1. Debug以下のフォルダを削除
2. C++ Builderを起動し直す
3. PCを再起動する

たいていは2までやれば回避できるが、時々3までやらないと回避できない時がある。

### 追記
(追記2017/08/01)

プロジェクトを変えても同じエラーが出るので、上記の手順１は意味がなさそうだ。
数値地図(行政区域)の入手方法


#ダウンロードサイト
- [国土数値情報]http://nlftp.mlit.go.jp/ksj/

#ダウンロード方法
- JPGIS2.1の行政区域を選択
- 全国以外を選択して次へ
- ここで各都道府県の最新のデータのみチェックしてダウンロードしたいのだが、面倒くさい
    
  #### ⇢なぜ、年度を選ぶUIがないのだろう？？
  
- 例えばchromeの場合、consoleで以下のスクリプトを打つと最新のデータのみをチェックできる。

``` javascript
var elements = $$("input[value*='140401']");
for(var index in elements){
  elements[index].checked='checked';
}
```

- 140401はその時の最新のデータの日付に合わせて変える。
- Chromeの場合、consoleでの改行は alt+Enter。
- forの中で $$ を使うと怒られた・・。ワンライナーで書けなかった。

# 後はダウンロードするだけだが・・

- ソースを見ればわかるが、wgetでダウンロードできそうだ・・・。

``` zsh
#!/bin/sh
for i in `seq -w 1 47`
do
  wget http://nlftp.mlit.go.jp/ksj/gml/data/N03/N03-14/N03-140401_${i}_GML.zip
done
```

#このデータで何をするのか？

- 例えば、北海道が経度何度〜何度、緯度何度から何度の四角の中に含まれるのか？といったことを調べるのに使う。
- 別途説明書くかも・・。
久々にnpm inistallの後gruntしたらエラーが出た


#発生した問題
- プロジェクトをgit cloneした後、npm installした。(usbメモリが飛んだので一からcloneした)
- grunt serveしたらエラーが出た。

> 発生したエラー
> TypeError: Cannot read property 'prototype' of undefined


# 原因

- `grunt --verbose` と打って見ると、grunt-connect-proxyに問題があることがわかる。
- 調べてみると、grunt-connect-proxyが依存している、eventemitter3に問題があるらしい。

> [drewzboto/grunt-connect-proxy issue #95](https://github.com/drewzboto/grunt-connect-proxy/issues/95)


# 解決方法

```sh
cd node_modules/grunt-connect-proxy/node_modules/http-proxy
npm install eventemitter3@0.1.6
```

- eventemitter3のバージョンを0.1.6にするといいらしい。
IntelliJでScalaのSparkアプリケーションの開発環境を作る


[How to kick-start Spark development on IntelliJ IDEA in 4 steps](https://medium.com/large-scale-data-processing/how-to-kick-start-spark-development-on-intellij-idea-in-4-steps-c7c8f5c2fe63)を参考に開発環境を作ったのでメモ

## おおまかな手順

1. sbt管理なプロジェクトを作る
2. [sbt-assembly](https://github.com/sbt/sbt-assembly)をインストール
3. sbtファイルにSparkの依存ライブラリを記述する

これだけで、SparkアプリケーションをSparkのlocalモードで走らせることができるようになる。このへん、Sparkがスケジューラ部分をちゃんとモジュール化してるから簡単にできるんだろうなぁという印象。コードは読んでないけど・・

## sbt管理なプロジェクトを作る
![New_Project.png](https://qiita-image-store.s3.amazonaws.com/0/10292/d28bc796-d63a-cd61-cfe7-737a36e97459.png "New_Project.png")


## [sbt-assembly](https://github.com/sbt/sbt-assembly)をインストール

分散環境上で動くSparkでは、`spark-submit`するときにアプリケーションのJARファイルを配る。このときに外部ファイルへの依存があると、各サーバーにそれらのファイルも配らなきゃいけなくなる。これを避けるために単独ファイルで起動可能なJARを作るためにsbt-assemblyを利用する。`spark-submit`にはファイルを配るオプションもあるが、管理やデプロイ、デバッグ等が複雑化するので、[Learning Spark](http://www.amazon.co.jp/gp/product/B00SW0TY8O/ref=as_li_qf_sp_asin_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=B00SW0TY8O&linkCode=as2&tag=imaifactory-22)でも単独JAR化するのを推奨されている。

方法は簡単。`${PROJECT_HOME}/project/plugins.sbt`に下記のように書けばOK。

```
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.13.0")
```

## sbtファイルにSparkの依存ライブラリを記述する

あとはこんな感じにsbtファイルを書く

```
name := "HelloSpark"

version := "1.0"

scalaVersion := "2.11.6"

libraryDependencies ++= Seq(
  "org.apache.spark" % "spark-core_2.11" % "1.4.0"
)

```

**同じライブラリの複数のバージョンへの依存が発生したときに、これを解決するおまじない的なもの（重複排除のストラテジー）をsbtファイルに書いてやる必要があった気がするが、手元の環境だとうまく動いているのと、メモを無くしてしまったので割愛・・・orz**


## サンプルアプリケーションを動かす

ここまでくればアプリケーションを動かせるようになっている。たとえば下記のようにコードを書いて・・

![Example_scala_-_HelloSpark_-____Playgrounds_HelloSpark_.png](https://qiita-image-store.s3.amazonaws.com/0/10292/79fd13a9-ea17-1caf-5b85-38335ea0371d.png "Example_scala_-_HelloSpark_-____Playgrounds_HelloSpark_.png")



実行環境の設定をしてやればOK

![Run_Debug_Configurations.png](https://qiita-image-store.s3.amazonaws.com/0/10292/439c8d5b-3076-5550-1b84-9b91af0cabc0.png "Run_Debug_Configurations.png")


# お約束

これはわたし個人のメモであり、わたしの雇用者を代表するものではりません。
React.js × Fluxで非同期処理を行う場合の初期化とデータ挿入


ReactをFluxで使う際、外部APIをキックしてデータを取得する非同期処理をどこに持たせるか。
ここの情報がドキュメントによって様々な為、悩んだ結果、以下のようにしました。

## 環境
React.js: 0.13.3

## 要望
- Storeに非同期処理を持たせたくない  
（Store自身が非同期にデータを取得する処理を行う、というのをやめたい）
- **API -> Action** ではなく、 **Action -> API** にしたい  
（非同期データの取得を待ち合わせ、Actionをコールしてデータを渡す、というのをやめたい）

## 実装
かなり簡略化してます。

```js:app.jsx
import React from "react/addons"
import App from "./App";

// エンドポイントはまずコンポーネントの描画
React.render(<App id={<何らかの値>}/>, document.getElementById("app"));
```

```js:App.jsx
// ~~ import処理 ~~

getState () {
  return {
    data: Store.getData()
  };
}

export default class App extends React.component {
  constructor () {
    this.state = getState();
  }

  componentWillMount () {
    // データ初期化処理をコール
    Action.init(this.props.id);
  }

  // ~~ Storeへのlisten ~~  
  
  _onChange () {
    this.setState(getState());
  }

  render () {
    // データ初期化前はfalseを返してリターン
    if (!this.state.data) {
      return false;
    }

    // ~~ render処理 ~~
  }
}
```

```js:Action.jsx
// ~~ import処理 ~~

export default class Action {
  // アクションのメソッドがAPIをコールする
  init (id) {
    API.get(id)
    .done(data => {
      // データの取得が終わったらStoreに通知
      Dispatcher.dispatch({
        type: Constants.INIT,
        data: data
      });
    });
  }
}
```

```js:Store.jsx
// ~~ import処理 ~~

var _data = null;
var Store = assign({}, EventEmitter.prototype, {
  getData () {
    return _data;
  },
  
  // ~~ emit、listener ~~
});

Dispatcher.register(action => {
  switch (action.type) {
    case Constants.INIT:
      _data = action.data;
      break;
  }
});

export default Store;
```

最初にコンポーネントをレンダリングし、コンポーネント内でデータの有無を判定してActionをコールしています。
（`componentWillMount`はサーバサイドでは動作しないため、クライアントサイド実装に限られますが…）

もっと良いやり方がある気がしますが、一応これで要望を満たす実装はできました。
snippet: jQuery

## 参考

* [jQueryを使わずjavascriptだけで書き直した際の記法メモ - Qiita](http://qiita.com/moriyaman/items/3b3f7878f8ecc2b76372)
* [十二章第五回　File API — JavaScript初級者から中級者になろう — uhyohyo.net](http://uhyohyo.net/javascript/12_5.html)

## IE6〜IE8対応のjQuery

* https://code.jquery.com/jquery-1.12.4.min.js

## jQuery <-> javascript

```js:例1
document.getElementById("imageFile").files[0];

$("#imageFile").prop("files")[0];

```

```js:例2
<div id="result"></div>

document.getElementById("result").innerHTML = "aa";

$("#result").text("aa");
```

## [jqueryで属性を変更させる方法](http://www.geekzshu.com/jquery/712)

* srcを変更

```js:
<img src="a.jpg">
```

```
$("img").attr("src","b.jpg");
```

* 値を変更

```js:classを変更
$("img").addClass("btn2");
```

```js:valueの変更
$("セレクタ").val("変更後の値");
```

## 値を取得

```js:値を取得
$("セレクタ").val();
```

## セレクタ

```
$("#d1 > .c1 > a:first")
```

## iPhoneから画像UPLOAD

```html:index.html
<!DOCTYPE html>
<meta name="viewport" content="width=device-width,user-scalable=0">
<script src="jquery-1.11.3.min.js"></script>
<script>
function upload() {
    var file = $("#imageFile").prop("files")[0];
    $("#result").text("uploading..");
    var reader = new FileReader();
    reader.onload = function() {
        $("#img").attr("src", reader.result);
        var file = $("#imageFile").prop("files")[0];
        $.ajax({
            type: 'post',
            url: 'upload.php',
            data: {file: reader.result}
        })
        .then(
            function(response){ $("#result").text("成功"); },
            function(){ $("#result").text("失敗"); }
        );

    }
    reader.readAsDataURL(file);
}

$(function() {
    if (!window.File){
        $("#result").text("File API 不可");
        return;
    }
}, true);

</script>
<form>
  <input type="file" accept="image/*" id="imageFile" onchange="upload();"/>
</form>
<div id="result">画像を選択してください</div>
<img id="img" style="max-width:300px; height:auto;" />
```

```php:upload.php(fixme)
<?php
$from_arr = array( " "
    ,"data:image/png;base64,"
    ,"data:image/jpg;base64,"
    ,"data:image/jpeg;base64,");
$to_arr   = array( "+" , "" , "" , "" , "" );
$photo    = base64_decode(str_replace($from_arr, $to_arr, $_POST['file']));
$filename = "output.jpg";
file_put_contents( $filename , $photo );
```
技術英語 > Properties / Options / Settings and Preferences / Configuration @ Visual Studio

日本語では「設定」と一つの言葉で表すソフト上の名前が、英語にするとき色々ある。

以下においてVisual Studioでの定義が紹介されている。
http://stackoverflow.com/questions/2074384/options-settings-properties-configuration-preferences-when-and-why

> Following an approximate lead from Visual Studio and other Microsoft products:
...
<font color=red>Properties</font> represent the characteristics of a single component or object in the application.
...
<font color=red>Options</font> alter global ways that the application works. Microsoft products use this to customise the UI toolbar, for example. There's an implication here that you can disable UI elements altogether (e.g. a "Simple" user interface or an "Advanced" user interface).
...
<font color=red>Settings and Preferences</font> change qualities of how the application works. The implication here is to change, not disable: for example, "Metric measurements" or "British Imperial measurements".
...
<font color=red>Configuration</font> is often where an application is customised for each user or group.
...
But there's no single rule.
...
In addition, <font color=red>Preferences</font> are probably not things that have as large of an impact as something labeled options or settings. Things such as a minor change in the display or something similar.

上記のリンクには他の意見もいくつかある。

どういう時にどれを使うか迷うが、大事なのは一貫性を持つことだと思う。


### 検索用キーワード
(追記 2018/05/14)

- setting
- option
- Preference
    - Preferences（複数形）の記事は「Preference」で見つからなかった (2018-12-04)
背景を透過色を意味する市松模様にするCSS


## 概要

画像編集ソフト等では、透過色をグレーと白の市松模様で表現します。
本投稿では、それを背景にするCSSコードを記載します。

## CSS

```css
body {
  background: url(data:image/gif;base64,R0lGODlhEAAQAPEBAAAAAL+/v////wAAACH5BAAAAAAALAAAAAAQABAAAAIfjG+iq4jM3IFLJipswNly/XkcBpIiVaInlLJr9FZWAQA7) fixed;
}
```

## 詳細

市松模様を構成する画像を、body要素の背景画像として設定しているだけです。

画像はdata URLで記述しています。これにより、画像をダウンロードする負荷をブラウザにかけずに市松模様を利用できます。
画像はGIFを利用し、更に[Gif Reducer](http://www.gifreducer.com/)で画像容量を縮小しています。

fixedを指定することで、スクロールしても画像を動かないようにしています。
[Redis] publish、subscribeを行う

node.js上でredisを使ってpublish、subscribeを行う方法を記載。

もろもろはいっている前提、

```
redis = {};
redis.pub  = function(){
    var sys        = require('sys');
    var redis      = require('redis');
    var subscriber = redis.createClient(6379, 'localhost');

    subscriber.subscribe('hoge channel');
    subscriber.on("message", function(channel, message) {
        sys.puts(channel + " :" + message);
    });

    publisher = redis.createClient(6379, 'localhost');
    publisher.publish("hoge channel", "test message");
};

redis.sub = function(){
    var sys        = require('sys');
    var redis      = require('redis');
    var subscriber = redis.createClient(6379, 'localhost');

     subscriber.subscribe('hoge channel');
     subscriber.on("message", function(channel, message) {
        sys.puts(channel + " :" + message);
     });
};
```

node.jsがpubの場合は、ターミナルで事前に以下のコマンドを叩いておくと、publishされた情報が表示されます。
```
redis-cli subscribe "hoge channel"
```

逆に、node.js側がsubscribeの場合は
ターミナルでpublishするとnode.js
側でメッセージが表示されます。
```
redis-cli publish "hoge channel" "Hello World"
```


以上
[Redis] node.js上でhashのset,get

Redisを使って、node.js上でhashのset,getする方法について記載。

```
var client = require('redis').createClient();
client.hset("hash key", "hashtest 1", "some value",function(){});
client.hget("hash key", "hashtest 1",function(err,val){
  console.log(val);
});
```

以上