OmniAICreator/Qiita-1.07M huggingface dataset:
perlで外部コマンドを実行する方法

perlでシステム系コマンドの取り方
バックグランドで動かすforkやexecはほぼ却下系？
http://blog.livedoor.jp/sasata299/archives/51069647.html
http://d.hatena.ne.jp/mas-inagaki/20100107/1262847507

普通に実行するときは以下。（標準出力などは出てしまう）

```pl:perl
system($command);
```

プログラムの中で出力をコネコネしたい時は以下。（実行したプログラムの標準出力には出ない）

```pl:perl
open my $rs, "$command 2>&1 |";
my @rlist = <$rs>;
close $rs;
my $result = join '', @rlist;
```

以下の形だと実行した標準出力に出てしまうので、あんまりいけてない。
というか値（コマンド結果の標準出力）が取れないことがある。

```pl:perl
my $result = `$command 2>&1`;
```
ApacheでBasic認証の設定

Basic認証の設定。
何となく毎回、調べることになるのでメモ。

```bash:command
$ vi .htaccess
```

で、中身が以下。

```text:text
order allow,deny
allow from all
Authname "Secret site"
Authtype Basic
AuthUserFile /var/www/html/www.サイト名/.htpasswd
require valid-user
```

# ユーザの新規作成

```bash:command
htpasswd -c /var/www/html/www.サイト名/.htpasswd ユーザ名
```

#ユーザの追加作成

```bash:command
htpasswd /var/www/html/www.サイト名/.htpasswd ユーザ名
```
シェルでのUNIXTIME（エポック秒）の取り方

シェルの中でファイルの作成時間などを比べたい時。
コマンド的には以下でUNIXTIMEを取ることができる。

```bash:command
ls -l --time-style='+%s' ファイル名
```

以下のようにすればファイルの時間だけの取得も可能。

```bash:command
ls -l --time-style='+%s' test.m4a | tr -s " " | cut -d" " -f 6
```


数個のファイルの比較なら上記の時刻を取り込んで差分を取ればチェックなどは可能。
ただ、パイプを繰り返すとあまり効率が良くないので、速度を求める時などはきちんとプログラムで書いた方が吉。

ちなみにエポック秒というらしい。
GitHub Flow 図解

# GitHub Flow 図解

## 概要
Git・GitHubを利用したシンプルで強力なワークフローであるGitHub Flowを図にまとめました。
GitLabでも利用可能なFlowです。GitLabの場合は Pull Request を Merge Request に読み替えてください。

## 前提
実際にGitHub Flowを実践したことはありません。（2014/06/12時点）
これからチームで導入予定で、メンバーとワークフローを共有するために図を作成しました。
ワークフローの誤りなどご指摘いただけると幸いです。

アクティビティ図をベースに作成してありますが、厳密な記法よりも
相手に伝わればいいかな、という点を重視しています。

## 基本原則

* masterブランチは **常時デプロイ可能** である
* 機能追加、バグフィックスなどは **説明的な名前のブランチ** をmasterから作成する

      * 機能追加の例： add_user_notice (ユーザーの通知機能追加)
      * バグフィックスの例： fix_user_login_validation_error (ユーザーのログイン認証のVlidation修正)

* 作成したブランチでローカル開発。小さい単位でこまめにコミットし、リモートにもこまめにPush
* フィードバックや助言が欲しい時、ブランチをマージしてもよいと思ったときは、 Pull Request を作成する
    
    * フィードバックや助言が欲しい時に作成する Pull Request を **WIP Pull Request** という
    * WIP = Work In Progress
    * WIP Pull Request を行う場合は、Pull Request 名の頭に **[WIP]** をつけるのが慣習

* レビューOKになったら、masterへマージ
* masterへpushしたら、即デプロイをする

## 図解 ( astah* community 版)

![github_flow.png](https://qiita-image-store.s3.amazonaws.com/0/43480/230ca377-0de3-9c03-71bc-4f3834265366.png)

## 図解 ( Gviz 版)

[Ruby | Gviz gem で GitHub Flow の図を書いてみる](http://qiita.com/tbpgr/items/2d61b1d3b874789e52b4)

上記記事で、Gviz の練習がてら、astah* で作成した図と同じものを Gviz で作成してみました。
※ Gviz は Graphviz を便利に使うための Ruby のラッパー gem です。

![github_flow_gviz.png](https://qiita-image-store.s3.amazonaws.com/0/43480/9920eae9-5115-1f09-aed4-457e0ebc2402.png)

## 補足

アクティビティ図は無償UMLモデリングツールの astah* community で作成しました。  
アクティビティ図の元データである github_flow.asta は  
GitHubに公開してありますので、Pull Requestなども受け入れます。  
Forkしていただいて、自分のチーム向けにカスタマイズしていただいても構いません。  

https://github.com/tbpgr/github_flow_for_ja
Travis CI | Travis WebLint を利用して .travis.yml をチェック

# Travis CI | Travis WebLint を利用して .travis.yml をチェック

## 概要

.travis.ymlファイルの設定を試行錯誤して、GitHubのコミットログが汚れてしまう、  
などの経験がある方は少なからずいらっしゃると思います。  
そこで、TravisWeb Lint を利用して .travis.yml をチェックします  

## Travis WebLintとは？

WebのUIから .travis.yml ファイルをチェックするツール。  
URLは以下です。  

http://lint.travis-ci.org/

下記の2形式をサポートしています。  

* GitHub Repositoryを指定
* テキストエリアに直接入力する形式が利用可能。

![travis_lint1.png](https://qiita-image-store.s3.amazonaws.com/0/43480/c70f9857-bbe5-27dc-0517-4208ec9372bd.png)

## GitHub Repositoryを指定してみる

私が公開している kosi gem を指定してみます。  

https://github.com/tbpgr/kosi

Enter your GitHub Repository に `tbpgr/kosi` と入力。  
Validate ボタンを押下。  

![travis_lint2.png](https://qiita-image-store.s3.amazonaws.com/0/43480/122b90c1-e81c-cbe4-8e7b-19193e5963d3.png)

Validationに成功しました。  

## テキストエリアに直接入力してみる（わざと失敗する）

https://github.com/tbpgr/kosi で利用している .travis.yml の内容を元に  
言語名をわざと typo したものをテキストエリアに入力します。  

ruby  
=> rubi  

~~~ruby
language: rubi
before_install:
  - gem update --system 2.1.11
  - gem --version
rvm:
  - 1.9.3
  - 2.0.0
  - 2.1
~~~

![travis_lint3.png](https://qiita-image-store.s3.amazonaws.com/0/43480/d3aa4401-a851-4572-0a28-6a7f52ca7009.png)

「in language section: illegal value rubi, defaulting to ruby」  
というエラーメッセージが表示されました。  

## 関連
http://lint.travis-ci.org/
https://github.com/travis-ci/travis-weblint
EclipseにおけるJavaScriptタブポリシーの変更


## Eclipseとaptanaって相性悪いのか？？
今まで、Eclipse(Kepler)にaptanaプラグインをインストールして、javascriptの開発をしていたのだけれど、apatanaをインストールすると、原因不明でEclispeが終了しなくなる（ゾンビ状態に近い）問題が出てしまった。  

そうすると、Mac自身を終了しようとしても、Eclipseが生きているとかなんとかというメッセージがでて、Eclipseを毎回Eclipseを強制終了せざるを得なくなってしまった。

## なので仕方なしに
Eclipseの標準でインストールされてているjavascriptのエディタを利用する事にした。  

しかし普段は、タブはスペースに置き換えて開発しているという事もあって、その設定を変えようとしたのだが、その設定箇所を見つけるまでに、手間取ってしまったので、備忘録として記録する。

## タブポリシーの設定変更手順
1. Eclipse -> 環境設定
2. JavaScript -> コード・スタイル -> フォーマッター
3. 「編集」ボタン選択
4. プロファイル名を任意の名前に変更する。
5. タブ・ポリシーの設定を「タブのみ」->「スペースのみ」に変更
6. 「OK」ボタン選択

## 最後に。。。
Eclipseにaptanaプラグインをインストールすると、終了しなくなる問題はどうにかならんかなぁ。。。。
Update properties from subclass

Swiftでの継承で気をつけること

## initializerはデフォルトでは継承されない

サブクラスのを呼び出すときにスーパークラスのinitializerはデフォルトでは見えないので
サブクラスの型で実装してあげる必要がある。ここはObjective-Cと少し違うところらしい。

```objc
class SuperClass {
    var value: Int
    init(v: Int) {
        value = v
    }
    func description() -> String {
        return "The values is \(value)"
    }
}

class SubClass: SuperClass {
    init() {
        super.init(v: 3)
        println("This is SubClass's initializer")
    }
}

let c: SubClass = SubClass(v: 4) // ここでエラーになる
c.description()


```
 
## サブクラスからは`var`のみ変更できる
サブクラスからはどの変数も参照できる(`public`とか`private`とかアクセス修飾子みたいなものなさそう)が、変更はvarに対してのみ。constant propertyに対しては変更が効かない。

```objc
class SuperClass {
    let value: Int  // letにするとSubClassのvalue = 2でエラーになる
    init(v: Int) {
        value = v
    }
    func description() -> String {
        return "The values is \(value)"
    }
}

class SubClass: SuperClass {
    init() {
        super.init()
        value = 2
    }
}
```
Rails4+turbolinks+jQueryをproduction環境で利用する場合の注意点

タイトルの組み合わせでjavascriptの機能を実装するまで一苦労だったので、方法をここで共有します。

###.jsと.js.coffeeの記述場所に注意

javascriptを記述したい場合はapplication.js、jQueryはそれ以外の.js.coffeeに記述する必要があります。
.jsと.js.coffeeがそれぞれ複数存在している場合は、devepop環境では動作するのですが、production環境では動作しませんでした。

####成功する場合

````
app
 |-assetshttp://stackoverflow.com/questions/18770517/rails-4-how-to-use-document-ready-with-turbo-links
   |-javascripts
     |-application.js   // jsファイルはapplication.jsだけにして
                        // 生のjavascriptコードはここに記述します
     |-user.js.coffee
     |-store.js.coffee
     |- ** .js.coffee
````


####失敗する場合


````
app
 |-assets
   |-javascripts
     |-application.js
     |-user.js
     |-store.js.coffee
     |- ** .js.coffee   // .jsと.coffeeが複数存在すると
     |- ** .js          //  productionでjQueryが動作しませんでした
````


###ページロード時のトリガー(`$ ->`)に注意

#####turbolinksの仕組み

Rails4からturbolinksが標準でインストールされていますが、jsが再利用される仕組み上、何も工夫していない場合はページロード時のトリガーが発火しません。

````
       ページロード
title  load
css    reuse
js     reuse  //reuseされるのでload時のトリガーが発火しません
body   load
````

#### gemを追加しても良い場合：jquery-turbolinksを利用
下記の追加によって、`$->`が発火するようになります。

````none:Gemfile
gem 'jquery-turbolinks'
````

````application.js
  //= rewuire jquery
  //= rewuire jquery_ujs
+ //= require jquery.turbolinks  //jqueryの後
                                 //turbolinksの前に記述します
  //= require turbolinks
````

#### gemを追加したくない場合：turbolinksのトリガーを利用
トリガーの記述を変更します。

```` **.js.coffee
- $ ->
+ action ->
    alert 'page was loaded'

+ $(document).ready(action)
+ $(document).on('page:load', action)
+ $(document).on('page:change' ,action)
````

以上、誰かのお役に立てれば幸いです。
間違いがありましたら、指摘していただけると嬉しいです。

#####参考
http://kray.jp/blog/must-know-about-turbolinks/
http://stackoverflow.com/questions/18770517/rails-4-how-to-use-document-ready-with-turbo-links
rails4 + bootstrapでajaxのvalidation結果をフォームに反映

サーバーサイドでのvalidation結果をajaxのフォームに反映させたい時ありますよね。

htmlをエラーメッセージ表示部分を固定で準備しておきます。エラーが起こったら表示するために、最初はhideを指定して表示されなくします。

```html
<div class="alert alert-danger hide" id="image-new-error-message">
  データの登録に失敗しました。
  <div id="errors"><ul/></div>
</div>
```

フォームはremoteを指定してajaxで動作するようにします。

```erb
<%= form_for Image.new, :html => {:multipart => true, :id => "image-new-form"}, :remote => true do |f| %>
<%= f.file_field :image %>
<%= f.text_field :title %>
<%= f.form_group do %>
 <%= f.submit "新規登録する" %>
<% end %>
```

コントローラー側の処理は保存に成功したら何も返さない。エラーが発生したらjsonでメッセージをそのまま返します。

```rb
  def create
    @image = Image.new(params.require(:image).permit([:image, :title]))
    if @image.save
      render nothing: true, status: 200
    else
      render json: {errors: @image.errors.messages}, status: 422
    end
  end
```

エラー時にはこんな感じでjsonが帰ってきます。

```json
{"errors":{"image":["写真を入力してください。"],"title":["タイトルは64文字以内で入力してください。"]}}
```

javascriptでは、エラーだったらjsonをパースして\<ul/\>になっている箇所にエラーメッセージを追加。エラーが起こったフィールドから、親のform-groupを特定してhas-errorを追加します。

ポストする前と、成功した時でエラーの表示を取り除きます。

```js
 $("#image-new-form").on("ajax:error", function(event, xhr) {
   $("#image-new-error-message").removeClass('hide').show();
   var errors = JSON.parse(xhr.responseText).errors;
   $.each(errors, (function(k, v){
     $("#errors ul").append("<li>" + v + "</li>");
     $("#image_" + k).closest(".form-group").addClass("has-error")
   }));
 }).on("ajax:success", function() {
   $("#image-new-error-message").hide();
   $("#errors ul").empty();
   $("#image-new-form" ).find(".form-group").removeClass("has-error")
 }).on("ajax:before", function() {
   $("#image-new-error-message").hide();
   $("#errors ul").empty();
   $("#image-new-form" ).find(".form-group").removeClass("has-error")
 });
```

これでajaxのフォームにvalidationのメッセージがそのまま反映されます。
この実装ではhelp-blockに触れていません。
画像テキストをまとめて生成

最近ではCSSのブラウザ対応も良くなり、プレーンなテキストでも十分な表現力を持ったから、Webコンテンツでテキストを画像化しないほうが良いと思っています。

けど、案件によってはデータベースで管理しているようなテキスト情報もすべて画像にしたいという要望を避けられないこともありますよね。

Adobe製品でチクチクとひとつひとつ処理しても良いんですが、
すぐに工数オーバするし、色やサイズ変更が後から発生すると気を失いそうになるのでコマンドラインツールをつくりました。

https://github.com/koji0330/imageTextGenerator

JSONファイルで文字サイズやフォントを指定してImageMagickのコマンド呼び出しているだけですが、ImageMagickとても便利ですね。
JSONファイルの読み込みやコマンド実行はpythonを使っていますが、単純な処理なので言語は何でも良いと思います。


```js
{
    "sets": [
        {
            "font": "/Library/Fonts/ヒラギノ明朝 Pro W6.otf",
            "size": "23",
            "color": "#000",
            "convert": [
                {
                    "label": "タイトル画像1",
                    "imgpath": "img/txt_title1.png"
                }, {
                    "label": "タイトル画像2",
                    "imgpath": "img/txt_title2.png"
                }
            ]
        }, {
            "size": "29",
            "font": "/Library/Fonts/ヒラギノ角ゴ Pro W6.otf",
            "color": "#EA5304",
            "convert": [
                {
                    "label": "0123456789",
                    "imgpath": "img/num_0123456789.png"
                }, {
                    "label": "9876543210",
                    "imgpath": "img/num_9876543210.png",
                    "color": "#f33"
                }
            ]
        }
    ]
}
```

```py
#!/usr/bin/python
# -*- encoding: utf-8 -*-

import json, argparse, commands

parser = argparse.ArgumentParser(
	description='Generate image text from json file.'
)
parser.add_argument(
	'conf_file',
	nargs='?',
	default='config.json',
	help='config file'
)

args = parser.parse_args()

# Load config file
f = open(args.conf_file, "rU")
loaded = json.load(f)
f.close()

for set in loaded['sets']:
	font = set.get('font', '');
	size = set.get('size', '30');
	label = set.get('label', 'undefined');
	background = set.get('background', 'None');
	color = set.get('color', '#000');
	imgpath = set.get('imgpath', 'undefined.png');
	for convert in set['convert']:
		font = convert.get('font', font);
		size = convert.get('size', size);
		label = convert.get('label', label);
		background = convert.get('background', background);
		color = convert.get('color', color);
		imgpath = convert.get('imgpath', imgpath);
		conv_cmd = u'convert -background %s -fill "%s" -font "%s" -pointsize %s label:"%s" %s' % (background, color, font, size, label, imgpath)
		print conv_cmd
		out = commands.getoutput(conv_cmd.encode('utf_8'))
		print out
print
```

画像化の要件があまりにも多い場合は同一サーバ内に画像化APIを構築しても良いかもしれないです。
Perspectiveで簡単WPF3Dモデリング！

WPF3Dという3D描画用のフレームワークがあるのですが、あまり使い勝手がよくなく、例えば球体を描画するだけでも一苦労します。
僕は3D描画のプログラムを一度も書いたことがなかったのですが、[Perspective](http://perspective.codeplex.com/)というライブラリを使って簡単に球体などの3D描画がWPF3Dで出来ましたので、メモしていきます。コードが長くなるので、複数回に分けてメモしたいと思います。

（WPF3Dに慣れている方は、[Perspective作者様のWebサイト](http://www.odewit.net/ArticleContent.aspx?id=Wpf3DIntro&format=html&lang=en)を参照された方が良いです）

1. まずは、[Perspective](http://perspective.codeplex.com/)というMS-PL Licenseのライブラリをダウンロードします。
2. ダウンロードしてきたライブラリを解凍し、perspective-dn4.0.slnを起動し、ビルドします。
3. ビルドされたdllを自分のプロジェクトで参照して利用します。

WPFではCanvasやGridがよく使われますが、WPF3DではViewport3Dというコントロールがよく使われます。
Viewport3D上には3Dのオブジェクトを描画することができ、それに対して照明（AmbientLight, DirectionalLightクラスなど）で光を当て、カメラ（PerspectiveCameraなど）で見る（2Dに写像する）というのがWPF3Dの基本的な構成です。
Perspectiveでは球体や円筒を簡単に描画するクラスなどが用意されているのですが、これらは全てViewport3D上に描画することができます。

WPF3Dの基本も兼ねて、x,y,zの三軸を描画するサンプルコードを載せます。実行結果は次のようになります。

![axis.PNG](https://qiita-image-store.s3.amazonaws.com/0/36752/bc0ef797-58a0-6bd6-b2c2-e5c96df684e4.png)


MainWindow.xaml.cs
--

```csharp
using Perspective.Wpf3D.Shapes;
using System.Windows.Controls;
namespace Wpf3DSample
{
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            axis3DViewport.Children.Add(new XyzAxis3D() { Length = 4, Radius = 0.03 });
        }
    }
}

```

MainWindow.xaml
--

``` csharp
<Window x:Class="Wpf3DSample.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow"
        Width="525"
        Height="500">
    <Grid>
        <Viewport3D Name="axis3DViewport">
            <!--  Add a camera.  -->
            <Viewport3D.Camera>
                <PerspectiveCamera FieldOfView="60"
                                   LookDirection="-1,-1,-1"
                                   Position="5,5,5"
                                   UpDirection="0,1,0" />
            </Viewport3D.Camera>

            <!--  Add models.  -->
            <Viewport3D.Children>
                <ModelVisual3D>
                    <ModelVisual3D.Content>
                        <Model3DGroup>
                            <Model3DGroup.Children>
                                <!--  Lights, MeshGeometry3D and DiffuseMaterial objects are added to the ModelVisual3D.  -->
                                <DirectionalLight Direction="-1,-1,-1" Color="#FFFFFFFF" />
                            </Model3DGroup.Children>
                        </Model3DGroup>
                    </ModelVisual3D.Content>
                </ModelVisual3D>

            </Viewport3D.Children>
        </Viewport3D>
    </Grid>
</Window>

```

カメラの種類を変えたり、照明を変えたりするだけでも結構面白いです。
カメラの位置がずれて、描画しているはずの3Dオブジェクトが消える（消えたように見える）ことがよくありますが、基本的にカメラのいるPositionに対して、LookDirectionが原点を向くようにしてあげれば、問題を早く特定することができます。（例えば、Position (5,5,5)に対して、LookDirection (-1,-1,-1)とする）
Redmineでコメントを削除する方法

削除したいコメントの右上の編集アイコンをクリックし、すでにあるコメントを編集するフォームを出す。

そこで、 **コメントをすべて削除し、** 送信ボタンをクリックする。

その後のコメントの番号はスキップされず、削除されていることがわかる。
Ubuntu 12.04 でUnityを無効にする

あらまし
=======

Ubuntu 12.04 のUnityは不便が多く、正直なところ使いづらい。
Xubuntuなどの派生ディストリビューションを使いたいが、サポート期間が短い、プロキシ設定など便利なツールを欠いているという問題がある。

そこで、Unityだけを無効にし、プレーンなgnomeを使うようにする。

`gnome-panel`のインストール
=========================

まず、`gnome-panel`をインストールする。

```console
$ sudo apt-get install gnome-panel
```

セッションの切り替え
=================

一旦ログアウトし、起動後のログインスクリーンでパスワード入力ボックス右上のUbuntuロゴをクリックし、
GNOME Classic または GNOME Classic (No effects) を選択する。

![Ubuntu 12.4 64bit.png](https://qiita-image-store.s3.amazonaws.com/0/37442/1e28a087-c8ce-9bf9-460c-21afed2aac48.png)

![Ubuntu 12.4 64bit 2.png](https://qiita-image-store.s3.amazonaws.com/0/37442/94045bce-7622-edf3-fb79-574418182323.png)



その後、パスワードを入力してログインするとプレーンなGNOME環境が使えるようになる。

参考
====

http://kronus9.sblo.jp/article/60175944.html

余談
====

`xubuntu-desktop`パッケージを入れると、セッションの切り替えでデスクトップをXubuntuのそれとUbuntuのそれを切り替えられる。
派生ディストリを味見したいときはお試しあれ。
Gmailに大量にメールを送ったら送受信が遅延するようになった

## はじめに

やんごとなき事情で、管理下のサーバから2万通ぐらいのメールが一斉にGmailに送付された。その後、Gmailでのメールの送受信が急激に遅延するようになった。このときに行った調査や改善方法（？）をメモする。

なお、利用しているサービスはビジネス向け（App）等ではない、一般のGmailサービスである。

## 経緯

ある日の夕方、管理下のサーバから総計約2万通ぐらいのメールがGmailアカウントに送信されることとなった。

同日24時ぐらいまでは、受信BOXの未読カウント数が常に上昇しつつも、Gmailのメールの送受信が正常に行われているのを確認した。

しかしながら翌朝、届いているはずの通常のメールが届いていなかったことから、異常が察知された。

異常の外観は、

1. Gmailからメールを送ろうとしても、相手先に届かない
2. 相手先からのメールは受信できないように見えるが、1時間に1通ぐらい届く
3. どちらの場合も、送信側にエラーメールは届いていない

という形であった。

これらのことから、メールの送受信処理は行われているものの、どこかの経路で送受信が遅延していると仮定した。

## やったこと

### 事例の調査

ググったら一発でそれっぽいヘルプフォーラムの記事や事例が引っかかった。

- [メールの受信が半日ほど遅れます。](https://productforums.google.com/forum/#!topic/gmail-ja/ijNm-IhIWA4)
- [Gmailが大量にメールを受信したら450-4.2.1エラーになってメール受信が遅延した](http://blog.fkoji.com/2013/03212118.html)

### 回復にむけた作業

ひとまず、サーバ側がさらにメールを送ってしまう可能性を排除するため、メールキューを処理した（といっても送付後だったのでもう貯まっていなかった）。

次に、事例の通りに[Gmailのトラブルシューティング]([https://support.google.com/mail/troubleshooter/2935079?rd=1])を実行した。チェック項目は次のとおり。

- 受信メールが遅れて届いた
- アドレスの末尾が「@gmail.com」です。
- 自分の Gmail アドレス宛です。
- はい。異なるドメインの複数の送信者からのメールが遅れて届きます。

ここまで選択すると「メールヘッダを解析してね」という指示が出る。遅延して届いていたメール一通の全文をコピーして、指示のあった[Message header](https://toolbox.googleapps.com/apps/messageheader/)ツールに食わせてみた。

> ![image01.jpg](https://qiita-image-store.s3.amazonaws.com/0/8064/c07f0a5a-f6a4-3792-ee38-9013751ea96f.jpeg)
> （上図はGoogleのMessage headerの実行結果から引用）

Google内部のメール転送で時間（4h）がかかっていることが分かる。（このあたりに2万件の未処理のキューがたまっているような気がする）

これを元にトラブルシューティングに戻り、

- Gmail にメールが届いてから自分に配信されるまでの間。

を選択すると「フォームで問題を報告してね」と指示があるので報告を行った。

### 突然の回復

数時間後、突然、未読件数が再び増え始め、送受信できていなかった通常メールの送受信が行われた。その後も送受信は従前どおり行われ、遅延は見らないことから、問題が回復したと思われる。

**問題を報告したから改善してもらえたのか、自然と回復したのかは断定できない** が、見られていた異常が一斉に解決したので、何らかの回復のきっかけがあったと予想している。

## おわりに

### まとめ

- Gmailの利用で送受信の遅延が発生している？と思ったら、Message headerでヘッダを解析する。
- Gmail側で遅延がおこっていれば、フォームで問題を報告する。
- まだ2万通メールの残りが飛んでくるので非常に申し訳ない気持ちになっている。

### 重要なこと

- **そもそも他社様のサービスに異常な件数のメールを送るような事態は避ける**。
openframeworksでPlayStation Eyeを使う Mac OS10.9

はまったのでメモとして残しておきます。
MacでPlayStation Eyeはそのまま使えないので、まずはドライバを手に入れます。

#1.ドライバを手に入れる
下記のURLからダウンロードしてください。
http://webcam-osx.sourceforge.net/downloads.html

zipファイルを解凍し、「macam.component」を”Macintosh HD/ライブラリ/QuickTime/”の中に入れてください。

#2.アドオン「ofxMacamPs3Eye」を落とす
githubからアドオンを取得します。
https://github.com/paulobarcelos/ofxMacamPs3Eye

#3.プロジェクトを作る。
後は、いつも通りプロジェクトで使えるのですが、カメラからのインプットのサイズは「640x480」でないと画像が取り込めないようです。

```cpp:ofApp.cpp
camera.setDesiredFrameRate(30); // カメラのフレームレート設定
camera.initGrabber(640, 480); // キャプチャサイズは640x480で!!!
```
Gruntでsprite画像を生成する

## grunt-spritesmithとは？

Gruntでsprite画像を生成するGrunt taskイエーイ！
https://www.npmjs.org/package/grunt-spritesmith
https://github.com/Ensighten/grunt-spritesmith

## インストール

```
$ npm install grunt-spritesmith --save-dev
```

## Gruntfile.jsへの記述

### 基本的には以下の記述でできます

```
sprite: {
　main:{
　　// spriteにする画像のpath
　　src: 'img/sprite/main/*.png',

　　// 生成されたsprite画像path
　　destImg: 'dist/main.png',

　　// sprite画像に関するmixinが出力されたファイル
　　destCSS: 'sass/_main.scss',

　　// 画像生成のアルゴリズム binary-treeを使うのがいいっぽい
　　// でも事情があるなら他のを使うといいとのこと
　　algorithm: 'binary-tree',

　　// 画像間のpadding
　　padding: 5,

　　// scssにかきだされる画像のpathがデフォルトだと相対なのでお好みで
　　imgPath: '/img/sprite.png',
　}
}
```

### 複数のsprite画像を指定したい場合

```
sprite: {
　main:{
　　src: 'img/sprite/main/*.png',
　　destImg: 'dist/main.png',
　　destCSS: 'sass/_main.scss',
　　algorithm: 'binary-tree',
　　padding: 5,
　　imgPath: '/dist/sprite-main.png',

　　// scssにかきだされる各種変数名を変える
　　// 複数sprite画像を作る場合に変数名がかぶる可能性があるのでprefixをつける
　　cssVarMap: function(sprite){
　　　sprite.name = 'main-' + sprite.name;
　　},

　　// 下で指定するテンプレートへ変数をセットできる
　　// {{ options.prefixMixin }} こんな感じで取得できる
　　cssOpts: {
　　　prefixMixin: 'main'
　　},

　　// 出力するテンプレートを指定
　　cssTemplate: 'template path'
　}, 
　sub:{
　　src: 'img/sprite/sub/*.png',
　　destImg: 'dist/sub.png',
　　destCSS: 'sass/_sub.scss',
　　algorithm: 'binary-tree',
　　padding: 5,
　　imgPath: '/img/sprite-sub.png',

　　cssVarMap: function(sprite){
　　　sprite.name = 'sub-' + sprite.name;
　　},
　　cssOpts: {
　　　prefixMixin: 'sub'
　　},
　　cssTemplate: 'template path'
　}
}
```

template側では下記のように指定すると参照できる

```
@mixin {{options.prefixMixin}}($sprite) {
```
AndroidのブラウザでDisplay:noneしたやつのclickが呼べない


ファイルアップロードフォームをかっこ良く実装しようとして、以下のページを参考に作った
http://duckranger.com/2012/06/pretty-file-input-field-in-bootstrap/

これを、TextFieldをタップした際にファイル選択、ボタンを推した際にアップロードというふうに変更して実装した。

しかし、PC、iOS上では問題ないもののAndroidでは、TextFieldをタップした際に、文字入力になってしまい上手く動作しなかった。

display:noneの代わりに"opacity:0;position: absolute;"にすることで一応対応できた。

```html
  <input id="lefile" type="file" style="opacity:0; position: absolute;"></input>
    <div class="input-append">
      <input id="photoCover" class="input-large" type="text" onclick="$('input[id=lefile]').click();"></input>
      <button class="btn">アップロード</button>
    </div>

<script type="text/javascript">
$('input[id=lefile]').change(function() {
    $('#photoCover').val($(this).val());
    });
</script>
```
集計はRDBばかりに頑張らせるのをやめると幸せになれる。

# はじめに
各種のDB中の集計作業を行うにあたって、以下のようなデータをどうしても扱わなければならない場合は、SQLのみで完結させないことを検討しなければ、サーバリソースを大量に消費した挙句、何時まで経っても作業が完了しないということが有ります。

# SQL操作だけに頼らないことを検討したい集計例
explainすることで大体の傾向はわかりますが、おおよそ以下のような要素を含む集計が対象となります。

* 対象のレコード数が巨大である（数百万レコード以上）
* DBの余剰リソースにもともと余裕が無い
* indexのふられていない項目で集計/joinしなければならない
* join対象の項目がやけに多い
* not in 
* 巨大なサブクエリ
* is null
* group by
* like
* etc...

# ではどうするか？
集計対象のレコードを一旦ファイルに吐き出した上で、ファイルベースの処理をしてしまいましょう。

# 実践例1
table1, table2, table3のレコード数がそれぞれ数百万レコード~数千万レコードでの規模での以下の集計を考えてみましょう。

```sql
SELECT count(id)
 FROM table1 JOIN table2 Using(id)
WHERE table1.col1 = 'hoge'
  AND table2.col2 is not null
  AND id NOT IN (SELECT id FROM table3 WHERE table3.col3 like '%fuga%');
```

これをそのまま走らせると数十分から数時間、下手したらDBのメモリリソースを使い果たした上でテンポラリテーブルが作られて、ファイルソートが始まって、、となるのですが、上記の作業は以下の操作と等価になります。

まず、集計対象のレコードをファイルに抽出します。

```bash
mysql -u *** -p -q -N -e "SELECT id FROM table1 JOIN table2 Using(id) WHERE table1.col1 = 'hoge' AND table2.col2 is not null" > id1.txt
mysql -u *** -p -q -N -e "SELECT id FROM table3 WHERE table3.col3 like '%fuga%'" > id2.txt
```

※上記2つの操作は完全に別のテーブルに対するSelectなので、DBのcpuコア数などに余裕があればscreenコマンドなどで並行で出力しても大丈夫です。
※ -qオプションを指定することで実行結果が巨大であるかどうかに関係なく、随時出力をするようになりますので、操作中のサーバのメモリリソースの使用を抑える事ができます。
※ -Nオプションでカラム名を表示させないようにしています。

次に、あとでcommコマンドを利用するためにそれぞれのファイルをソートしておきます。

```bash
sort id1.txt > id1.sort.txt
sort id2.txt | uniq > id2.sort.txt
```

※ソートや、ユニークを取る操作に関しても、SQLで行うより、unixコマンドでのファイルベースですと比較的少ないリソース使用量で高速に行うことが出来るケースが多いです。

最後に、id_1.sort.txt に含まれているが、id_2.sort.txtに含まれていないidの抽出をし、カウントします。

```bash
comm -23 id_1.sort.txt id_2.sort.txt > id1_not_in_id2.txt
wc -l id1_not_in_id2.txt
```

※ commコマンドは、ソートされた2つのファイルA/Bの ファイルAにのみ含まれる行 共通行 ファイルBにのみ含まれる行　をそれぞれ出力するコマンドです。 -23をつけることで、共通行およびファイルBにのみ含まれる行の出力を抑制します。

# 追記 
joinコマンドを利用すると、単独のカラム同士でなくても結合できますので、RDBにおけるテーブルのjoinと同様の事がファイルベースで高速にできます。
[JOINコマンドを使う際の注意](http://qiita.com/taruhachi/items/04ccca5e3bc20ad01791)
Mac でファイル一括置換

完全に受け売りですが、こんな感じで GNU sed を使う。

http://blog.akagi.jp/archives/2661.html

この作業は

https://github.com/skinny-framework/skinny-framework.github.io/commit/00c446fd4d98c70fe797fc51245b461272d3dac8

```bash 
find . -name '*.md*' | xargs sed -i 's/\/develop\//\/1.1.x\//g'
```

な感じで。

・・と master もなくなっていたのを忘れていて、再 commit（ダサい..）

https://github.com/skinny-framework/skinny-framework.github.io/commit/fdad547c5a362a90162ad39696fc0817f1cf8b7d

```bash 
find . -name '*.md*' | xargs sed -i 's/\/master\//\/1.1.x\//g'
```
NSViewでSpriteAnimationする

iOSのときは、UIKitにUIImageViewというものがあり、UIImageView.imagesにarrayを指定したらSprite Animationいわゆるコマアニメーションが簡単にできた。

OS XでもNSImageViewというものがある。だが、こいつはimagesというプロパティはない。では動的にコマアニメーションを実現するにはどうすればよいか？

CoreAnimationを使う。CAKeyframeAnimationを使ってください。
以下にコードだけ書いておくから、適当にパクってくれたらいい。

```objc:aho.m`
- (void)runAnimation {
    [CATransaction begin];
    [self.topImageView setWantsLayer:YES]; //ビューにレイヤを付ける。OS Xでは指定が必要。

    CALayer* animationLayer = [CALayer layer];//レイヤを作る
    animationLayer.frame = self.topImageView.bounds;
    [self.topImageView.layer addSublayer:animationLayer];//乗っける
    CAKeyframeAnimation *keyAnimation = [CAKeyframeAnimation animationWithKeyPath:@"contents"];//contentsをKVOで監視する。今回のコマアニメーションは、CGImageRefの配列で、CALayer.contentsに代入される。そのタイミングでKVOするようになるようにbindしないとダメ。
    
    NSMutableArray *array = [NSMutableArray array];
    CGImageRef maskRef;
    for (METile *tile in buildingGameParts.tiles) {
        NSImage *someImage = [tile image];//なんか動的にNSImageを作る
        CGImageSourceRef source;
        source = CGImageSourceCreateWithData((__bridge CFDataRef) [someImage TIFFRepresentation], NULL);
        maskRef = CGImageSourceCreateImageAtIndex(source, 0, NULL);
        [array addObject:(__bridge id) (maskRef)];
    }
    
    NSLog(@"array:%@",array);
    keyAnimation.values = (NSArray*)array;
    keyAnimation.duration = 3;//全体のアニメーションの時間
    keyAnimation.repeatCount = HUGE_VALF;//無限ループ
    [keyAnimation setCalculationMode: kCAAnimationDiscrete];//フェードイン・フェードアウトしない

    [animationLayer addAnimation:keyAnimation forKey:@"aho"];/
    [CATransaction commit];
}

```
途中の__bridgeというのは、Toll-free bridgeで、CとObj-Cのオブジェクトの互換性を持たせるためのキャスト。以下を参照。
http://news.mynavi.jp/column/objc/038/
AWSのEC2 (Amazon Linux) に mongoDBをインストールするメモ

`yum install mongoDB` で落ちてこない。

このページを参照する。
[Amazon EC2 へMongoDBをインストール(公式・英語)](http://docs.mongodb.org/ecosystem/platforms/amazon-ec2/)

日本語じゃないと・・・という人へメモ

#### yumリポジトリを追加

```bash:mondodb.repoを新規作成
echo "[MongoDB]
name=MongoDB Repository
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64
gpgcheck=0
enabled=1" | sudo tee -a /etc/yum.repos.d/mongodb.repo
```

#### インストール可能になるmongo一覧

```bash:yumのlist
yum list | grep mongo
```

```mongo-10gen.x86_64                   2.4.10-mongodb_1               MongoDB
mongo-10gen-server.x86_64            2.4.10-mongodb_1               MongoDB
mongo-10gen-unstable.x86_64          2.5.2-mongodb_1                MongoDB
mongo-10gen-unstable-mongos.x86_64   2.5.2-mongodb_1                MongoDB
mongo-10gen-unstable-server.x86_64   2.5.2-mongodb_1                MongoDB
mongo-10gen-unstable-shell.x86_64    2.5.2-mongodb_1                MongoDB
mongo-10gen-unstable-tools.x86_64    2.5.2-mongodb_1                MongoDB
mongo18-10gen.x86_64                 1.8.5-mongodb_1                MongoDB
mongo18-10gen-server.x86_64          1.8.5-mongodb_1                MongoDB
mongo20-10gen.x86_64                 2.0.8-mongodb_1                MongoDB
mongo20-10gen-server.x86_64          2.0.8-mongodb_1                MongoDB
mongodb-org.x86_64                   2.6.1-2                        MongoDB
mongodb-org-mongos.x86_64            2.6.1-2                        MongoDB
mongodb-org-server.x86_64            2.6.1-2                        MongoDB
mongodb-org-shell.x86_64             2.6.1-2                        MongoDB
mongodb-org-tools.x86_64             2.6.1-2                        MongoDB
mongodb-org-unstable.x86_64          2.7.1-1                        MongoDB
mongodb-org-unstable-mongos.x86_64   2.7.1-1                        MongoDB
mongodb-org-unstable-server.x86_64   2.7.1-1                        MongoDB
mongodb-org-unstable-shell.x86_64    2.7.1-1                        MongoDB
mongodb-org-unstable-tools.x86_64    2.7.1-1                        MongoDB
```

#### インストール

mongodb-orgが一番新しいので、これを使います。
10genはmongodbを開発している会社の旧名ですね。

```bash:install
yum install mongodb-org
```

### 備考

なんかEC2用のイメージが有るっぽい。Aws MarketPlaceのイメージからインスタンスを作れるらしい。

```bash:AMIからインスタンス作成
ec2-run-instances ami-05355a6c -t m1.large -g [SECURITY-GROUP] -k [KEY-PAIR] -b "/dev/xvdf=:200:false:io1:1000" -b "/dev/xvdg=:25:false:io1:250" -b "/dev/xvdh=:10:false:io1:100" --ebs-optimized true

ec2-describe-instances [INSTANCE-ID]
```

インスタンス作った後に気づいた(´・ω:;.:...
libcallの使い方まとめ

libcall (or libcallnr) は、動的ライブラリの関数を呼び出すことができる。
ここでは以下について述べる。

1. vim scriptからlibcallで動的ライブラリを呼び出す方法
1. libcallで呼ぶことのできる動的ライブラリの作成方法


vim scriptからlibcallで動的ライブラリを呼び出す
----------------------------------------------------------------------------------------------------
libcallから呼び出すことのできる動的ライブラリ内の関数シグニチャは、

* {char\*,int} cdecl hoge({char\*,int})

でなければならない。
libcallを実際に使う際には、

```vim:
" char* cdecl some_func(char*)を呼び出す場合
" *nix系の場合 => 拡張子まで含めたファイルパスを指定
echo libcall('path/to/shared-object.so', 'some_func', 'string to be passed')
" windowsの場合 => 拡張子を含めないファイルパスを指定
echo libcall('path/to/dynamic-link-library', 'some_func', 'string to be passed')
```

とする。
libcallの第一引数には動的ライブラリのファイルパスを指定、第二引数には呼び出す関数名を指定する。
第三引数には、文字列か整数を渡す必要がある。

libcallとlibcallnrの使い分けとしては、呼び出す関数の返り値がchar\*かintかで分ける。


libcallで呼ぶことのできる動的ライブラリの作成方法
----------------------------------------------------------------------------------------------------
関数宣言時の注意点は以下。

1. 呼び出し規約はcdeclを使用する
1. 引数は厳密に1つのみ、以下の型で受け取る
    * char\*
    * int
1. 返り値は以下の型のみ使用できる
    * char\*
    * int

返り値としてchar\*を使用する場合、vim側でfreeは行われないため、動的ライブラリ側でfreeする必要がある。
また通常の動的ライブラリと同様、動的ライブラリ内でデータを保持することができる。
ただし動的ライブラリ側でdlopen()し、自分自身をロードしなければならない。これについては次節で。

shared objectの場合は、コンパイルオプションに-fPICを指定する必要がある。
dynamic link libraryの場合は、\_\_declspec(dllexport)する必要がある。

動的ライブラリ内でデータを保持する方法
----------------------------------------------------------------------------------------------------
動的ライブラリ内でデータを保持する場合、

* \*nix系

    dlopen()で自身をロードし、終了時にdlclose()する必要がある。

* windows系

    LoadLibrary()で自身をロードし、終了時にFreeLibraryする必要がある。

このように、自身をロードしておかないと、libcall()での呼び出しごとに動的ライブラリの初期化と破棄を
繰り返すことになる。
[Android] ListView を使ってリスト表示をする方法

Androidの勉強を初めて数日。
Javaの経験はあるのになんでAndroidってこんなわけわかんないの!?って毎日を送ってます。

とりあえず、レイアウトを決めてる xml と、その動作を決めてる Activity をいじります。

# ゴール

![Screen Shot 2014-06-12 at 17.10.56.png](https://qiita-image-store.s3.amazonaws.com/0/18705/fdb29aad-0d5a-72d4-9168-bec240368b02.png)

# layout/activity_main.xml

```xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <ListView
        android:id="@+id/listView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >
    </ListView>

</LinearLayout>
```

# src/com.hoge.hoge.lvtest/MainActivity.java

```java
package com.example.lvtest;

・
・
・

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
        //ListViewのセット
		ListView listView = new ListView(this);
		setContentView(listView);
		
        //データの追加
		ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1);
		adapter.add("a");
		adapter.add("b");
		adapter.add("c");
		
		listView.setAdapter(adapter);
    }

　　・
　　・
　　・	

}

```

# その他

まだタップした後の動作などは指定していないので、これからします。
HomebrewでインストールしたGitを使用する


* ターミナルで現在のGitのバージョンを確認する

```
$ git version
git version 1.8.0 (Apple Git-○○)

```

* (Apple Git-○○)と出る場合は、Xcodeで利用するGitをターミナルで使用する設定になっています。
* 今回はこれをHomebrewでインストールしたGitに変更することが目的です。

-----
### etc/pathsを書き換えよう！

 1. 現在のパスの内容を確認

  ```
  $ cat /etc/paths
  /usr/bin
  /bin
  /usr/sbin
  /sbin
  /usr/local/bin  # brewでインストールしたものはここにリンクがある
  ```


 1. pathsの内容を変更する


  ```
  $ sudo vi /etc/paths
  /usr/local/bin   # この行を一番上にする
  /usr/bin
  /bin
  /usr/sbin
  /sbin
  ```
 
 1. バージョン確認をすると、brewでインストールしたものGitのバージョンに変わっている

  ```
  $ git version
  git version 2.0.0

  ```
vagrant-kvm プロバイダを使おうとしてはまった点

Ubuntu 14.04上でKVM + Vagrantの構成で動かそうとしたときにはまったポイントを残しておきます。

**注意** : 新しいバージョンでは解決しているか、違う手法に代わっている場合があります。適用前に、記載事項と状況が合致しているか確認してからお試しください。

# 前提条件

- 利用しているソフトウェアのバージョンは併記の通り
- 起動するBoxはCentOS 6.5 (x86_64)
   - VirtualBox用のディスクイメージ
   - 初期インストールパッケージはcoreグループのみ
   - その上にchef-soloが実行できる環境が入っている
- ホスト上でKVMのセットアップは完了している
- ホストはNFSサーバがインストールされている

# ディスクイメージの変換

vagrant-mutateを使うと楽に変換できる。

```bash
$ vagrant plugin install vagrant-mutate
$ vagrant box add [Box名] [ファイルパス or URL]
$ vagrant mutate [Box名] kvm
$ vagrant box list
[Box名] (kvm, 0)
[Box名] (virtualbox, 0)
```

最後にリストアップできれいれば無事完了。ぱちぱち。

# VMが起動しない

Ubunutだと、AppArmorの影響でBoxファイルを参照できない(permission denied)問題が発生し、VMが起動しないことがあります。これは、vagrant-kvmのREADMEに回避方法が記載されています。

以下、回避方法を一部引用＋追加したコマンドを記載します。

```bash
$ sudo apt-get install apparmor-profiles apparmor-utils
$ sudo aa-complain /usr/lib/libvirt/virt-aa-helper
```

これで、boxファイルが参照できるようになり、VMが起動します。ぱちぱち。

# NFSマウントできない

ゲスト上のCentOS 6.5から、ホスト側のNFSサーバのディレクトリをマウントできないエラーが出る場合があります。

```bash
mount -o 'vers=3,udp' 192.168.123.1:'/home/yourname/work/vagrant/centos6' /vagrant (sudo=true)
mount.nfs: rpc.statd is not running but is required for remote locking.
(以下略)
```

これは、Vagrant本体でnfsクライアントのパッケージをインストールしているものの、rpcbindを起動していないばかりに正常にマウントできない症状が発生することがあります。

こちらは、ワークアラウンドの対処として、rpcbindを起動するよう、Vagrantのプログラムを書き換えます。

```rb:/opt/vagrant/embedded/gems/gems/vagrant-1.5.4/plugins/guests/redhat/cap/nfs_client.rb
         def self.nfs_client_install(machine)
           machine.communicate.tap do |comm|
             comm.sudo("yum -y install nfs-utils nfs-utils-lib")
+            comm.sudo("service rpcbind start")
           end
         end
```

これで、NFSマウントが正常に完了します。ぱちぱち。

(これ、僕だけじゃなかったらPRした方がいいかな。)

# Jenkins で走らない

Jenkinsを実行しているユーザ"例:jenkins"を、libvirtdグループに追加して下さい。

追加後、適用のためにJenkinsの再起動をお忘れなく。

# VMが起動しなくなった

これまで問題なくVMが起動していたのに、ある日起動しなくなったことがありました。例えば、以下のメッセージから進まない場合です。

```
==> default: Destroying VM and associated drives...
Bringing machine 'default' up with 'kvm' provider...
==> default: Importing base box 'centos6_hb-agent'...
==> default: Assigning a new mac address to the VM.
==> default: Preparing network interfaces based on configuration...
(ここから先に進まない)
```

これは、libvirtdを再起動すると回復する場合があります。

```bash
$ sudo service virtualbox stop
$ sudo service libvirt-bin restart
$ sudo service virtualbox start
```

私はCIでデイリービルドができなくなったことでハマりました。

# おまけ: KVM を使った vagrant up

VirtualBoxに強く依存した設定でなければ、Vagrantfileは特に書き換えずに次のコマンドで起動する事ができます。

```
vagrant up --provider=kvm
```

# 参考文献

- [Plamo Linux 5.1 で vagrant は vagrant-kvm の方が楽だった - TenForwardの日記](http://d.hatena.ne.jp/defiant/20130822/1377165814)
    - そもそもの環境構築方法はここが参考になります
- https://github.com/mitchellh/vagrant    
- https://github.com/adrahon/vagrant-kvm
    - [https://github.com/adrahon/vagrant-kvm/issues/163](Permission denied (Libvirt::Error) on the disk image · Issue #163)
- https://github.com/sciurus/vagrant-mutate
FuelPHPのアプリをPlack上で動作させる


# 概要

PHPのビルトインサーバを使っていたが、環境変数を外から設定することができない。
FUEL_ENVを設定してモードを切り替えが気軽にできないので不便だった。

ビルトインサーバを書き換えるのは難易度が高そうだったので、
Plack上で動かすことで環境変数を設定できるようにした。

# Plackで動かすためのスクリプト

スクリプトは以下のようになる。

```perl:app.psgi
use Plack::App::CGIBin;
use Plack::App::PHPCGI;
use Plack::Builder;
use File::Zglob;

my $DOCROOT = 'public';
my $php_cgi = '';

$php_cgi ||= `which php-cgi`;
chomp($php_cgi);

my $static = Plack::App::File->new(root => $DOCROOT)->to_app;

my @php;
for my $php ( zglob("$DOCROOT/*.php") ) {
    my $mount = $php;
    $mount =~ s!^$DOCROOT!!;
    my $app = Plack::App::PHPCGI->new(
        script  => $php,
        php_cgi => $php_cgi,
    )->to_app;
    push @php, [$mount,$app];
}

builder {
    enable 'ReverseProxy';
    enable sub {
        my $app = shift;
        sub {
            my $env = shift;
            $env->{REMOTE_USER} = 'php';
            $env->{PATH_INFO} = '/' . 'index.php/' .  $1
                if $env->{PATH_INFO} =~ m|^/([^\.]+)*$|;
            $env->{FUEL_ENV} = $ENV{FUEL_ENV} || 'development';
            $app->($env);
        };
    };
    for my $php ( @php ) {
        mount $php->[0], $php->[1];
    }
    mount '/' => $static,
};
```

サーバの起動は以下のように行う。

```shell
$ plackup app.psgi # developmentモード
$ FUEL_ENV=production plackup app.psgi # productionモード
```

コマンド上で変数を設定することによって、モードが切り替えられるようになった。
内部的にはphp-cgiを使っているので、CGIモードで動いているのと同等になっている。

このスクリプトを動かすためのcpanfileは、以下のようになっている。


```perl:cpanfile
requires 'Plack';
requires 'Plack::App::CGIBin';
requires 'Plack::App::PHPCGI';
requires 'File::Zglob';
requires 'CGI::Compile';
requires 'Plack::Middleware::ReverseProxy';
```




# 参考

Plack上でPHP(php-cgi)を動かす
http://blog.nomadscafe.jp/2012/12/plackphpphp-cgi.html
Mac で何度アップデートしても、アップデートが消えない問題


解決した方法

## 解決方法

Spotlight のインデックスをリビルドする

* Spotlight をenable & reindex

TimeMachineのNAS(QNAP)へのバックアップが遅くなるバグ?対応のため、Spotlightをオフにしていたため、enableしてから、reindexする。

```
sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.metadata.mds.plist
sudo mdutil -E /
```

再度Spotlightを無効にするには以下

```
sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.metadata.mds.plist
```


ちなみに、スクリーンショット付きのシステム環境設定から、インデックスのリビルドする方法は、以下のとおり。

[Rebuilding Spotlight's Database - The Mac Observer](http://www.macobserver.com/tmo/article/Rebuilding_Spotlights_Database/ "Rebuilding Spotlight's Database - The Mac Observer")


## 手がかり

以下、後で試してみる。

Mac App Store updates repeating: Apple Support Communities
https://discussions.apple.com/thread/2720420?start=30&


## 現象

* 同じアプリが何度もアップデートアラートを出してくる
* 何度インストールしても出てくる
* 履歴には何度もインストールしたことになっている

## 環境

* MacBook Air
* Mac OS X 10.9.3


## やったけどダメだったこと

* /Library/Updates 以下の削除
* ダウンロードが完了していない項目があるか確認　をクリック
* アプリのアンインストール後、再インストール


## 検索用語

* MacBook Pro Air
* Mac OS X
* App Store
* アップデート update
Go で euc-jp や sjis の csv ファイルを読み込むには変換用のリーダーを1つかませるだけでよかった


# 概要
csvファイルがutf8で書かれてなかったのでgoだけで出来ないか調べてみたメモ．
＃ iconvとかで元ファイルを前処理してから読めばそれでいい気もします・・・．

関連：

* [Go でファイルを1行ずつ読み込む（csv ファイルも）](http://qiita.com/ikawaha/items/28186d965780fab5533d)

# 準備
以下のパッケージを利用しました．利用方法などは[こちら](http://godoc.org/code.google.com/p/go.text/encoding)を参照ください．

```
"code.google.com/p/go.text/encoding/japanese"
"code.google.com/p/go.text/transform"
```

# サンプルコード

文字コードがeuc-jpの場合のサンプルです．sjisの場合は★のところを
`japanese.ShiftJIS.NewDecoder()`に変更すれば対応できます．

文字コード変換をかませるだけなので，別にcsvの読み込みじゃなくても汎用的に利用できそうです．

```
package main

import (
        "code.google.com/p/go.text/encoding/japanese"
        "code.google.com/p/go.text/transform"
        "encoding/csv"
        "fmt"
        "io"
        "os"
)

func main() {

        var fp *os.File
        if len(os.Args) < 2 {
                fp = os.Stdin
        } else {
                var err error
                fp, err = os.Open(os.Args[1])
                if err != nil {
                        panic(err)
                }
                defer fp.Close()
        }

        reader := csv.NewReader(transform.NewReader(fp, japanese.EUCJP.NewDecoder())) // ←★
        for {
                record, err := reader.Read()
                if err == io.EOF {
                        break
                } else if err != nil {
                        panic(err)
                }
                fmt.Println(record)
        }
}
```
Rakeタスクで普通の引数っぽい処理を書く


`rake`でタスクを書こうとすると、引数を受け取りたい場合があります。用意されている方法は、大きく分けて2種類。しかし、どちらも正直イマイチだなと。

### 環境変数を使う
~~~ruby
task :hello do
  puts "Hello, #{ENV['WORD']}!"
end
~~~

~~~
rake hello WORD=world
#=> Hello, world!
~~~

### タスク引数を使う

~~~ruby
task :hello, :word do |task, args|
  puts "Hello, #{args[:word]}!"
end
~~~

~~~
rake "hello[world]"
#=> Hello, world!
~~~

どちらも、呼び出し方がダサい。何とかならんかと、ちょっと無理矢理に普通の引数っぽい指定を出来るようにしてみる。

### 普通の引数っぽく使う

~~~ruby
task :hello do
  puts "Hello, #{ARGV.last}!"
  ARGV.slice(1,ARGV.size).each{|v| task v.to_sym do; end}
end
~~~

~~~
rake hello world
#=> Hello, world!
~~~

つまり、タスクの最後にある`ARGV.slice(1,ARGV.size).each{|v| task v.to_sym do; end}`を入れることで、引数名の空タスクを作ってエラーを握りつぶそうという話です。あとは`ARGV`を自由に使えば良い。

個人的な感覚では、大分幸せになりました。

ただ、見ての通り強引なやり方なので、幾つか注意点が。

* `rake -vT`とかで見た時に引数が要ることが分からないので、`desc`でしっかり書いておくように。
* 引数で既存のrakeタスクと同じものが指定されると、それが実行されてしまう。

自分は`rake`コマンドを複数同時に実行するような使い方はしないですし、引数も全くの自由ではなく決められたリストから選ばせる形なのでOK。しかし使いどころは場面次第で。
AWS SQS + Node.js 送信サンプル


キューにメッセージを送信するサンプル

```coffeescript

AWS = require "aws-sdk"
AWS.config.loadFromPath "aws.json"

url = "ここにキューのURL"

sqs = new AWS.SQS().client

params =
  MessageBody: "あああ"
  QueueUrl: url
  DelaySeconds: 0

sqs.sendMessage params, (err, data) =>
  console.log "### ERROR!", err if err
  console.log "data", data if data

```
見慣れないif文


```python:見慣れないif文
print 'a' if False else 'b'
print 'A' if True else 'B'
```

```bash:出力結果
b
A
```

なにこの後出し感。。。

***
###追記
これpythonの三項演算子だって
教えてくださった@zetamattaさんに感謝

コメント欄で@tadsanさんに詳しく解説いただいてます。
macのつらい日本語ホームディレクトリを英語にする

![スクリーンショット 2014-06-12 15.55.45.png](https://qiita-image-store.s3.amazonaws.com/0/1172/2f64da2d-5277-681a-48b4-fab024c5831c.png)

このつらいやつをやめたい

```
rm ~/Applications/.localized \
~/Desktop/.localized \
~/Documents/.localized \
~/Downloads/.localized \
~/Movies/.localized \
~/Music/.localized \
~/Pictures/.localized \
~/Public/.localized

```

## 戻す

```
touch ~/Applications/.localized \
~/Desktop/.localized \
~/Documents/.localized \
~/Downloads/.localized \
~/Library/.localized \
~/Movies/.localized \
~/Music/.localized \
~/Pictures/.localized \
~/Public/.localized
```
Mbox形式の電子メールからコマンドラインで添付ファイルを復元する方法


## 概要

電子メールの添付ファイルはBase64エンコードされているので，
該当部分を探し出してデコードすると元のファイルを復元できる．


## 方法

今回使用した環境は以下の通りである．

- Mac OSX 10.7.5 (Lion)
- OpenSSL 1.0.1h 5 (Base64 デコーダーとして使用)

対象は，Thunderbirdが作成したINBOXファイルとする．

### 1. Mbox形式のファイルから，取り出したい添付ファイルを探して別ファイルへ保存

INBOXを適当なテキストエディタで開く．
ここではvimを使用する．

```
vim INBOX
```

日本語のエンコードは，ISO-2022-JPであると考えられるので，必要であれば以下を実行する(vim)．

```vim
:e ++enc=iso-2022-jp
```

該当するメールエントリを探す．
見つかったらエントリ中の以下の様な内容の行を探す．
filenname=""の中身が取り出したい添付ファイルであることを確認する．

```
Content-Disposition: attachment; filename="hogefuga"
Content-Transfer-Encoding: base64
```

一行空行の後，Base64エンコードされた添付ファイルの内容が固定幅(76?，最終行はこの限りではない)で続いているので，
その部分を別ファイル(例えば，hogefuga.b64)にコピーする．
その際，余計な改行コード(^Mなど)は取り除くこと．

### 2. opensslコマンドでファイルをデコード

コマンドラインで以下を実行すれば，元ファイルが復元できる．

```
openssl base64 -d -in hogefuga.b64 -out hogafuga
```

## 参考文献
- [ターミナルからファイルをBase64でエンコード／デコード - YKMbPP](http://d.hatena.ne.jp/ykmbpp/20090308/1236518887)
Windows版ChromeでWebStore外の拡張機能を読み込む(のを試みて失敗したので回避策)

|シリーズ化予定(うまくいけば。)|試行錯誤中。|
|:--|:--|
|発端|http://qiita.com/cielavenir/items/89f193ddcb72fb78f43b|
|Tampermonkey|http://qiita.com/cielavenir/items/bbeb314d3a4abbd9bd24|
|RealDownloaderについて検証中|http://qiita.com/cielavenir/items/38880812f28abe948e74|

### 発端
以前からChromeでは、Web Store外から機能拡張をインストールするためには機能拡張一覧のウィンドウ(chrome://extensions)を出してそこに.crxや.user.jsをドロップする必要がありました。しかし、更新は自動でやってくれるので、面倒なのは最初の1回だけでした。
ところが、先日からWindows版Chrome stable/betaチャンネルで、それらの、Web Store外からロードされた機能拡張がブロックされるようになったようです。
しかもたちの悪いことに、一度無効になると再度有効にする方法がありません。
私はOSXユーザーだったので気づかなかったのですが、フォロワーさんのツイートで知りました。

###方法
何とかするには次のような方法があるようです。

- Chrome以外のブラウザを使う
  - 拙作cTouch拡張で正式にサポートしているブラウザは(Chrome/Safari以外に)Chromium/Iron/ComodoDragon/Operaになります。
  - この4つのどれかに移行することは可能だと思います。
- Chromeをdev-mにアップグレードする
  - 以前は私もdev-mを使っていましたが、最近はJSエンジンがクラッシュするなどかなり不安定なのでbeta-mに切り替えた経緯があります。なのでお薦めしません。
- Chromeを再起動するたびに拡張をインストールし直す
  - どうやらこの方法でもChromeを終了するまでは使えるらしい。勿論アンインストール時に設定は消えますが。
- .crxではなく、デベロッパーモードの「パッケージ化されていない拡張機能を読み込む」を使う
  - https://support.google.com/chrome/a/answer/2714278?hl=ja

4番目が一番よいかと思ったので、.user.jsを機能拡張に変換するRubyスクリプトを作りました。
https://github.com/cielavenir/userjs-chromize

しかし、4番目の方法も完全ではありませんでした。毎回、起動時に、「デベロッパーモードの拡張機能を無効にする」旨の警告が表示されるのです。
しかも消す方法はないと…。
上のRubyスクリプト、Ocra(Windows版exe)化しようと思ったのですが、やめちゃうことにしました。

### 結論
- .user.jsについてはTamperMonkeyを使いましょう。
  - https://chrome.google.com/webstore/detail/tampermonkey/dhdgffkkebhmkfjojejmpbldmpobfkfo
- .crx形式でないとホストできないような拡張には、別のブラウザを使いましょう。はい。。
  - http://areweplayingyet.org/ によると、HTML5でAACが再生できないようです(Iron/ComodoDragon/Operaとも)。仕様ということで諦めてください。ffmpegのライセンスとか絡んで面倒になるので。でもOperaで不可というのは面白い事実ですね。

### 最後に
期待しながら書き始めた文章も途中でいろいろと破綻。駄文ですみません。読んで下さりありがとうございました。
railsでフォームのフィールドをjQueryでコピーして追加する

fields_forでhas_manyなフィールドを作って、それをどんどんページ内で追加して行きたい場合ありますよね。そんな時はモデルに、

accepts_nested_attributes_for
http://apidock.com/rails/ActiveRecord/NestedAttributes/ClassMethods/accepts_nested_attributes_for

を指定してgemで

nested_form
https://github.com/ryanb/nested_form

を使うと簡単にできます。できるはずなんですが、自分の環境でform-builderをもろもろ拡張している関係か、link_to_addがどうもちゃんと動かなかったのでjQueryでさっくり最後のフィールドをコピーして末尾に追加する仕組みを作りました。

```js
  $.fn.nestedResource = function(options) {
    
    var result = {
      update: function(fields) {
        $(fields).find("input").each(function(index, field) {
          $(field).attr("id", $(field).attr("id").replace(/\_[0-9]+\_/,"_" + count + "_"));
          $(field).attr("name", $(field).attr("name").replace(/\[[0-9]+\]/,"[" + count + "]"));
        });
      },
      append: function() {
        this.update(templateDom);
        count++;
        $(tailSelector).before($(templateDom).clone(false));
      },
    };
    var count = 0;
    var selector = options["selector"];
    var tailSelector = options["tail-selector"];

    $(selector).each(function(index, fields) {
      result.update(fields);
      count++;
    });

    var templateDom = $(selector).last().clone(false);
    return result;
  };
```

.clone(false)とfalseを指定しないと、イベントも一緒にコピーされてしまいます。

tail-selectorで指定した箇所にコピーしたDOMを入れます。

```js
var nestedResource = $(document).nestedResource({
  "selector": "#schedules .fields",
  "tail-selector": "#schedules_tail"
});
```

フィールドの追加はこんな感じで呼び出します。

```erb
<%= link_to "フィールドを追加", "javascript:void(0)", :onclick=> "nestedResource.append(); return false;" %>
```

これで分かりやすくフィールドがコピーされて増えます。
The Swift Programming Language - Nested Types（ネストされた型）をまとめる


[The Swift Programming Language をまとめるトップ](http://qiita.com/kiyotaman/items/052f82e9f93590b79c64)

## Nested Types（ネストされた型）
列挙型はクラスと構造体の機能の補足として利用する
列挙型やクラスや構造体のブレス```{}```の中に定義することができる
使いこなせたら結構強力


### Nested Types in Action（ネスト型の使い方）
BlackjackCardという構造体を定義する

```swift
struct BlackjackCard {
    // ネストされたSuit列挙型
    enum Suit: Character {
    case Spades = "♠", Hearts = "♡", Diamonds = "♢", Clubs = "♣"
    }
    // ネストされたRank列挙型
    enum Rank: Int {
    case Two = 2, Three, Four, Five, Six, Seven, Eight, Nine, Ten
    case Jack, Queen, King, Ace
        struct Values {
            let first: Int, second: Int?
        }
        var values: Values {
            switch self {
            case .Ace:
                return Values(first: 1, second: 11)
            case .Jack, .Queen, .King:
                return Values(first: 10, second: nil)
            default:
                return Values(first: self.toRaw(), second: nil)
            }
        }
    }
    // BlackjackCard のプロパティとメッソド
    let rank: Rank, suit: Suit
    var description: String {
        var output = "マークは \(suit.toRaw()),"
        output += " 値は \(rank.values.first)"
        if let second = rank.values.second {
            output += " か \(second)"
        }
        return output
    }
}
```

Suit列挙型ではカードのマークの文字値をシンボルとして定義
Rank列挙型では13のカードのランクの実数値を定義

Rankの中では更に "Values" という構造体をネストしている
Ace以外のカードは1つの値しかもっていないが、Aceだけ2つの値をもっている
その構造体のプロパティの値は2種類で

    first は Int型
    second は オプショナルのInt型

また、Rank内ではValuesという算出プロパティも定義してる
これはValues構造体のインスタスを返す

description でオプショナル型のsecondの値を一時的に保持し評価する"Optional Binding"を使う
そして、値があれば表示させるようにしている
BlackjackCardではカスタムイニシャライザーを定義していないので、自動的に meberwise initializer が作動している

以下の様に初期化する

```swift
let theAceOfSpades = BlackjackCard(rank: .Ace, suit: .Spades)
println("theAceOfSpades: \(theAceOfSpades.description)")
// prints "theAceOfSpades: マーク ♠, 値は 1 か 11"
```

RankとSuitはBlackjackCardにネストされているが、コンテキストから型を推論できるので、インスタンスの初期化の時に個別のメンバー名（.Aceと.Spades）だけを指定することによってBlackjackCard内の列挙型を参照することができる

### Referring to Nested Types（ネストされた型の参照）
ネストされた型の値には以下の様にして参照できる

```swift
let heartsSymbol = BlackjackCard.Suit.Hearts.toRaw()
// heartsSymbol は "♡"
```
えぇ、このソース GoSub なんてあるのかい！？

VB6 の GoSub は、VB.Net に移植する際はクロージャーで書き直すのが一番てっとり早いんではなかろうか

```VB6
Sub Foo()
    '変数宣言もろもろ
    '処理もろもろ
    GoSug Hoge

Hoge:


    Return
End Sub
```

```vbnet
Sub Foo()
   '変数宣言もろもろ
   Dim Hoge As Action = 
       Sub()

       End Sub
   '処理もろもろ
   Hoge.Invoke()

End Sub
```

ただ、これを入れたら入れたで、

```
'On Error GoTo' ステートメントを含むメソッドに、ラムダを生成する式を含めることはできません。
```

というエラーになるので、On Error GoTo を Try～Catch に書き直す作業が発生するが、これは仕方がないよね。
UITableViewの編集モードで複数選択とセルのスワイプによる削除を同時に有効にする方法


```
self.tableView.allowsMultipleSelectionDuringEditing = YES;
```

上記のようにUITableViewの、allowsMultipleSelectionDuringEditingプロパティをYESにすることでTableViewの複数選択が可能であるが、StoryboardやviewDidLoadなどで静的に設定すると、スワイプによる削除動作が動作しないようです。

```
- (void)setEditing:(BOOL)editing animated:(BOOL)animated
{
    [super setEditing:editing animated:animated];
    
	//この行です
	self.tableView.allowsMultipleSelectionDuringEditing = editing;
    
    [self.tableView setEditing:editing animated:animated];
}
```

-setEditing:animated:メソッド内で切り替えて設定できるようにすることにより、複数選択とセルの単数削除が共存できるようになります。