OmniAICreator/Qiita-1.07M huggingface dataset:
zendeskのフォームをサイトに設置する

zendeskを統合した印象はすごい簡単だった
必要以上の機能はだいたいそろっている

## アカウント準備

[zendesk](http://ja.zendesk.com/)アカウント作成（30日間トライアル有り）

## サポート(feedback)のフォームを作成

設定(左下の歯車) > チャネル > Feedbackタブ

* 一般設定 -> タブのタイトル、位置、色など
* 詳細なカスタマイズ -> [お困りの点を教えてください。]などの文言の変更

コードスニペットをプレビューして取得

以下のようなコードスニペットが出力される

```html:
<script type="text/javascript" src="//assets.zendesk.com/external/zenbox/v2.6/zenbox.js"></script>
<style type="text/css" media="screen, projection">
  @import url(//assets.zendesk.com/external/zenbox/v2.6/zenbox.css);
</style>
<script type="text/javascript">
  if (typeof(Zenbox) !== "undefined") {
    Zenbox.init({
      dropboxID:   "20123456",
      url:         "https://username.zendesk.com",
      tabTooltip:  "サポート",
      tabImageURL: "https://assets.zendesk.com/external/zenbox/images/tab_ja_support.png",
      tabColor:    "black",
      tabPosition: "Left"
    });
  }
</script>
```

変更の度にフォームを作成し直して`dropboxID`を差し替えるのが少し面倒
タブの画像、ツールチップの変更 -> `tabTooltip`, `tabImageURL`

bootstrapがあっても問題なく動いた

#### 注意点

デフォルトではrailsのturbolinksの2ページ目以降非対応

編集、更新はURL直接入力でうまくいったこともあったがあまりうまく読み込まれないので使えない
https://username.zendesk.com/account/dropboxes/9999999/edit (9999999はdropboxID)

### ログインユーザーのEメールアドレス、名前をフォームにセットする

```js:
    Zenbox.init({
      ...
      tabPosition: "Right",
      requester_email: "test@domain.com",
      requester_name: 'Test Test'
    });
```

Railsの場合(erb)

```js:
    Zenbox.init({
      ...
      tabPosition: "Right",
      requester_email: "<%= current_user && current_user.email %>",
      requester_name: "<%= current_user && current_user.full_name %>"
    });
```

[Pre-populate name, email, etc.](https://support.zendesk.com/entries/320589-Pre-populate-name-email-etc)

### タブの位置を調整する

以下のようなCSSを外部の（自分で管理している）cssなどで上書きする必要がある
（zendeskが出力するcssより後ろで読み込んで定義する）

```css:
#zenbox_tab {
  top: 80% !important;
}
```

スニペット内に追加するのも良い

```html:
<script type="text/javascript" src="//assets.zendesk.com/external/zenbox/v2.6/zenbox.js"></script>
<style type="text/css" media="screen, projection">
  @import url(//assets.zendesk.com/external/zenbox/v2.6/zenbox.css);
  #zenbox_tab {
    top: 80% !important;
  }
</style>
<script type="text/javascript">
  if (typeof(Zenbox) !== "undefined") {
    Zenbox.init({
  ...
```

#### 注意点

紛らわしかったのが、詳細なカスタマイズ > カスタムCSS
でタブの位置の変更できるかと思ったができない

ここではフォームの中のカスタマイズのみできる（おそらくiframe内のみ有効）

#### 参考

[Dropbox CSS override (position)](https://support.zendesk.com/entries/407095-Dropbox-CSS-override-position)
[タブの位置を調整する](https://support.zendesk.com/entries/21611167#topic_rph_utk_hf)
OpenCVをつかってiOSアプリで画像の二値化

#はじめにやること
- OpenCVのframeworkを導入
- .m -> .mm
- 画像を準備(srcImageに代入)

#コード

```objc
- (UIImage *)binarize:(UIImage *)srcImage{
    
    cv::Mat src_img = [self cvMatFromUIImage:srcImage];
    cv::Mat gray_img, bin_img;
    cv::cvtColor(src_img, gray_img, CV_RGB2GRAY);
    cv::threshold(gray_img, bin_img, 128, 255, CV_THRESH_BINARY);
    
    return [self UIImageFromCVMat:bin_img];
}
```

わーい二値化できたよ！
Node.jsアプリでのパッケージ更新確認


node.jsでは依存しているパッケージをpackage.jsonに書いておくと `npm install`で自動でインストールしてくれる。具体的にはこんな感じで記述。

```javascript
{
  "name": "myapp",
  "version": "0.0.1",
  "dependencies": {
     "request": "~2.27.0",
      "levelup": "~0.15.0",
      "async": "~0.2.9",
      "leveldown": "~0.8.3"
  },
  "devDependencies": {
    "coffee-script": "~1.6.2",
    "mocha": "~1.13.0",
    "chai": "~1.8.1",
    "nock": "~0.22.1"
  }
}
```

"モジュール名: バージョン"の並びでバージョンには"*"（任意のバージョン）も指定できるが通常はバージョン指定する。というか、モジュール導入時に

```
$ npm install <module_name> --save
```

あるいは

```
$ npm install <module_name> --save-dev
```
とすると自動でpackage.jsonの"dependencies"あるいは"devDependencies"に追加してくれる。もちろんバージョン番号付き。

で、最初の一発目は良いけど暫くたった後に「そういえば使っているモジュールのアップデート出てないかな？」と思った時に確認する方法が今日のお題。

`npm outdated` がそれっぽいん機能なのだが、なんだか期待していた結果が得られない。で、ちょっと探してみて見つけたのが [tjunnone/npm-check-updates](https://github.com/tjunnone/npm-check-updates) というモジュール。

インストールは至って簡単で、これだけ

```
$ npm install -g npm-check-updates
```
で、package.jsonのあるディレクトリで実行するだけ

```
$ npm-check-updates
```
結果としてこんなのが出てくる。

```
"levelup" can be updated from ~0.15.0 to ~0.17.0 (Installed: 0.15.0, Latest: 0.17.0)
"leveldown" can be updated from ~0.8.3 to ~0.9.2 (Installed: 0.8.3, Latest: 0.9.2)
"coffee-script" can be updated from ~1.6.2 to ~1.6.3 (Installed: 1.6.3, Latest: 1.6.3)
"mocha" can be updated from ~1.13.0 to ~1.14.0 (Installed: 1.13.0, Latest: 1.14.0)
"nock" can be updated from ~0.22.1 to ~0.23.0 (Installed: 0.22.1, Latest: 0.23.0)
```
そうそう、こういうのが欲しかった。これはアップデート可能なモジュールのリストを出してくれるだけだが、もし即にpackage.jsonに反映させたければ

```
$ npm-check-updates -u
```
これだけ。楽チンだ。
Virtual box 上の Ubuntu に接続する


いつも忘れるので、メモ

ubuntu 入れた後、Virtualbox のネットワークの設定で host only を作成するは、まぁ、いいでしょう。

Ubuntu 上で
$ sudo vim /etc/network/interfaces

```sh:interfaces
auto eth1
iface eth1 inet dhcp
```

を追記

$ sudo service network restart

で OK

固定 IP の場合は interfaces に正しく設定する


Mac の 10.9 は調子が悪いなぁ…
zsh-syntax-highlightingでコマンドをハイライトしてみる


コマンドをハイライトできるらしいので、
zsh-syntax-highlightingを入れてみた。

```
$ mkdir ~/.zsh
$ git clone git://github.com/zsh-users/zsh-syntax-highlighting.git ~/.zsh/zsh-syntax-highlighting
```

パスを追加

```.zshrc
if [ -f ~/.zsh/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh ]; then
    source ~/.zsh/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh
fi
```

最後に` exec $SHELL`でできあがり。

おおお、これはいいですね。
Mechanize#post はブロックを取らない

Mechanize を使っていてハマったのでメモ。
ちゃんと Doc 見てなかった自分が悪いんだけども。
参考：[Mechanize Document](http://mechanize.rubyforge.org/Mechanize.html)

### GETする場合、以下のようにブロックを使って書ける

```rb
@agent = Mechanize.new
@agent.get("http://example.com/") do |page|
  p page.body
end
```

### POSTする場合、以下のようにブロックを使って書け **ない**

```rb
@agent = Mechanize.new
@agent.post("http://example.com/", "post_data") do |page|
  p page.body
end
```

- POSTする場合、以下のように書くことになる

```rb
@agent = Mechanize.new
page = @agent.post("http://example.com/", "post_data")
p page.body
```

この違いはなんなんだろう・・・or2
Mojo::Baseをベースクラスとして使う


## 使い方

Mojo::Baseを継承すると、hasメソッドがインポートされ、アクセサを作成できるようになります。

```perl:MyModule.pm
package MyModule;
use Mojo::Base -base;

has 'username';
has 'password';

1;
```

他のモジュールを継承するときにもMojo::Baseが使えます。

```perl:Dog.pm
package Dog;
use Mojo::Base 'Animal'; # Animalクラスを継承する

1;
```

Mojo::Baseを継承すると、
「strict」「warnigs」「utf8」「feature '5.10'」プラグマが有効になります。

hasメソッドは、以下のように使用できます。

```perl:Sample.pm
# 単純に作成
has 'username';

# デフォルト文字列を設定
has 'username' => 'hoge';

# 文字列以外のデフォルト値を設定(関数リファレンスを使います)
has 'list' => sub { return [0, 1, 2, 3] };

```


newなどでインスタンスを作成しないPackageを定義するときは、以下のように記述できます。

```perl:MyModule.pm
package MyModule;
use Mojo::Base -strict;

1;
```

この場合、プラグマは有効になりますが、hasメソッドはインポートされません。

## Mojoliciousでの使われ方

Mojo::Baseは、Mojolicious内のすべてのクラスの親クラスとなっています。
例えばMojolicious::Controllerの中で、hasメソッドを使うことができます。

```perl:Sample.pm
package MyApp::Sample;
use Mojo::Base 'Mojolicious::Controller';
use Model::User;

has 'User' => sub { Model::User->new };

sub index {
    my $self = shift;

    $self->stash->{users} = $self->User->list();

     $self->render();
}

sub delete {
     my $self = shift;

     $self->Users->delete_by_id($self->param('id'));

     $self->redirect_to('user/list');
}

1;
```
[Unity]ARで表示されたオブジェクトには、遠くまでRayを撃て[覚書]


Unity + Vuforia でターゲット画像上に表示されたオブジェクトをタップした時に、何か動作をさせたいときがあると思う。
普通に、CameraのScreenPointToRay()メソッドを呼び出した後に、Physics.Raycastを呼び出せばいいわけだが、全然反応しなくて困った。

気づくまでにだいぶ時間はかかったが、わかると単純なことだった。
カメラからターゲット画像上に表示されたオブジェクトまでの距離が、だいぶ遠いのである。
普段は、

```csharp:
	if (Physics.Raycast(ray, out hit, 100)) {
		GameObject selectedGameObject = hit.collider.gameObject;
		// ...
	}
```

↑のように、オブジェクトまでの距離を１００〜２００までぐらいを指定しているのだが、それはカメラからの距離が一定のオブジェクトだからなんとかなってるのである。
ARで表示されたオブジェクトは、もっと遠い位置にある。

とりあえず、Physics.Raycast()に指定する距離を１０００ぐらいにしたらなんとかなった…というメモ。
Haxe 内包表記内で複数の式や文を使う書き方

HaxeではPythonとかHaskellみたいな感じで、配列内包表記が使えます。

そこんところ一時変数の束縛とかしたいなーとか思ったので以下みたいな感じに。
早い話が即時関数を作ってやれば良いかんじ。

```hx
class Main {

    public static function main() {
        var fizz_buzz =
                [for (_i in 0...100)
                    function(i) {
                        trace(i);
                        return
                            switch (i) {
                                case 0: '0';
                                case i if (i % 15 == 0): 'fizz buzz';
                                case i if (i % 3 == 0): 'fizz';
                                case i if (i % 15 == 0): 'buzz';
                                case i: Std.string(i);
                            }
                    }(_i)
                ];
        trace(fizz_buzz);
    }
}
```

fizzbuzzならいらないじゃんとか思って、無意味にtraceはさんでるアレ。
rubyで1行分だけ文字列を繰り返す

rubyのスクリプトで区切り線(水平線的)なことをしたい時、以下のコードで1行埋め尽くすことができます。

```rb:hr.rb
puts '#' * ENV['COLUMNS'].to_i
```

実行環境によって上記コードでは失敗することがあるようなので、そんな時は以下で対応できます(ただしOS依存)。

```rb:hr.rb
width = `stty size`.split[1].to_i

puts '#' * width
```
Java,ScalaでiOSアプリ開発

#概要
JavaとScalaで書かれたアプリをiOSに移植してみました。
移植したのは私が開発しているMikuMikuStudioというゲームエンジンを使って作った、MMD(MikuMikuDance)プレーヤーです。
http://sourceforge.jp/projects/mikumikustudio/
Javaの実行にはRoboVMを使用しています。
OpenGLなどのライブラリとして、libGDXをカスタマイズして使用しています。

ソースはgithubにあります。
https://github.com/chototsu/mikumikustudio-gdx

![qiita.jpg](https://qiita-image-store.s3.amazonaws.com/0/32280/29243fe4-5bae-e495-7ac5-3d2fa21c063a.jpeg)

#動画
http://www.nicovideo.jp/watch/sm22101434

#Javaをインストール
以下のURLからMac版のJavaをダウンロードします。
http://www.oracle.com/technetwork/java/javase/downloads/index.html
インストーラを起動し、インストールします。

#sbtをインストール
sbtのインストールはhomebrewを使うのが簡単です。
まずhomebrewをインストールします。

```
ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go)"
```

sbtをインストールします。

```
brew install sbt
```

#sbtの設定
そのままではコンパイル時にメモリー不足になるため、~/.sbtconfig に以下の設定を書きます。

```
SBT_OPTS="-Dfile.encoding=UTF-8 -Xmx1536M -Xss1M -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=384M"
```

#android sdkをインストールする
注意:Androidの開発をされない方はスキップしていただいて結構ですが、その場合も環境変数だけは設定して下さい。ANDROID_HOMEを設定しないとビルド時にエラーが出ます。

Android SDK を以下のURLからダウンロードします。
http://developer.android.com/sdk/index.html

環境変数を設定します。

```
export ANDROID_HOME=/Applications/android-sdk-macosx
```

#RoboVMをインストール
RoboVMをダウンロードします。現在はバージョン0.0.6を使用しています。
http://download.robovm.org/robovm-0.0.6.tar.gz
解凍します。

```
tar xvzf robovm-0.0.6.tar.gz
```

~/.robovm/homeにシンボリックリンクを張ります。

```
ln -s ~/robovm-0.0.6 ~/.robovm/home
```
シンボリックリンクを張るかわりに環境変数ROBOVM_HOMEに設定してもかまいません。

```
export ROBOVM_HOME=~/robovm-0.0.6/
```

#mikumikustudio-gdxをダウンロードする。

```
git clone https://github.com/chototsu/mikumikustudio-gdx.git
```

#起動
##Mac上で実行
```
sbt desktop/run
```
##iOSシミュレータで実行
```
sbt ios/iphone-sim
```
##実機で実行
```
sbt ios/device
```

#IntelliJ IDEAをインストール（オプション）
開発にはIntelliJ IDEAを入れると便利です。無料のCommunity editionでも十分使えます。

##インストール
以下のURLからダウンロードして下さい。
http://www.jetbrains.com/idea/
ダウンロードしたらインストーラを起動しインストールして下さい。

##プロジェクトの設定
プロジェクトのディレクトリで以下のコマンドを実行すると、プロジェクトをIntelliJ IDEAで開けるようになります。

```
sbt gen-idea
```

IntelliJ IDEAのプロジェクトファイルが作成されますので、IntelliJ IDEAでプロジェクトを開きます。

#まとめ
RoboVMはまだαバージョンですが十分実用に耐えうる性能と安定性がある事が分かりました。使ってみた印象では、AndroidのDalvikより速く、安定しています。皮肉な話ですがAndroidよりiOSの方がJavaの実行環境として優れていると言えるかもしれません。
RoboVMの登場で、Android,iOS,Windows,Mac,Linuxで動くアプリを同一ソースで書く事が出来るようになりました。
今後、iOSの開発言語としてJavaやScalaが有力な選択肢となるのではないでしょうか。
Vimの自動保存で読み込み専用や名前がない場合に警告が出ないようにする設定


Vimの自動保存、便利ですね。バージョン管理システムが普通になった時代ならではですね。

さて、通常の自動保存の設定は、みんな大好き[vim-users.jpにもある通り](http://vim-users.jp/2009/07/hack36/)、

```vim:.vimrc
set autowrite
set updatetime=500

autocmd CursorHold *  wall
autocmd CursorHoldI *  wall
```
ぐらいで事足りるんですが、読み込み専用やファイル名がない場合に警告が出てうざいです。

なので、関数でラップしてそのような場合は保存を呼び出さないようにしました。

```vim:.vimrc
set autowrite
set updatetime=500

function s:AutoWriteIfPossible()
  if &modified && !&readonly && bufname('%') !=# '' && &buftype ==# '' && expand("%") !=# ''
    write
  endif
endfunction

autocmd CursorHold * call s:AutoWriteIfPossible()
autocmd CursorHoldI * call s:AutoWriteIfPossible()
```
と、`.vimrc`に書いてください。

おしまい。
IEで互換モードが強制されるときにチェックすること

IE9以降で特定のサイトでのみ、互換モードが強制されるときは、<a href='http://ie9cvlist.ie.microsoft.com/ie9CompatViewList.xml' target='_blank'>Internet Explorer 9 CV 一覧</a>をチェックしてみる。

```xml
<domain docMode="EmulateIE7">example.com</domain>
```

X-UA-Compatibleメタタグが入っていない、またはhttpヘッダーに宣言されていないサイトで、このような記述されていたら対象のモードに強制されてしまう。

この場合、X-UA-Compatibleタグをつけて表示モードを強制・確認したあと、マイクロソフトに削除依頼をする。

```html
<meta http-equiv="X-UA-Compatible" content="IE=edge">
```

## こんなとき

認証や制限のかかっているステージング・サイトと、ライブ・サイトの挙動が違った場合などは原因が気づきにくいので要注意。


(追記) IE10のほうのCVListのリンク

<a href='https://iecvlist.microsoft.com/ie10/201206/iecompatviewlist.xml' target='_blank'>IE10 CVList</a>

## 参照リンク

<a href='http://msdn.microsoft.com/ja-jp/library/ie/gg622935(v=vs.85).aspx' target='_blank'>互換表示一覧の概要 (Windows)</a>
テーブル情報からModelを動的生成する方法 (ActiveRecordの単体利用時)

```rb
# [前提]
#   以下の様なデータを持つusersテーブルが作成されているとする。
#     | id | name   |
#     |  1 | taro   |
#     |  2 | hanako |

require 'active_record'

# ここは使用するDBにあわせる(この例ではSQLite3)
ActiveRecord::Base.establish_connection(
  "adapter"  => "sqlite3",
  "database" => "./hoge.sqlite3"
)

# 各テーブルのModelを動的に作成する
ActiveRecord::Base.connection.tables.each do |table_name|
  class_name = table_name.singularize.camelcase
  self.class.const_set class_name, Class.new(ActiveRecord::Base)
end

# 以降、いつもどおりにModelを扱える
User.all
# => [#<User id: 1, name: "taro">, #<User id: 2, name: "hanako">]
```
Zabbix 2.2.0 リリース

今年の前半にリリース予定だったというZabbix 2.2系がさっきリリースされた。

http://www.zabbix.com/rn2.2.0.php

まだdebian package等がない。これはそのうちリリースされると期待したいが、アナウンスがあるわけではないようだ。

2.1系やRCについてはすでに何度も出ており、試したというレポートもあるため、入れて全く使えないということはないと思われる。ただ、VMWare等で切実に必要としているということでなければもう少し待ったほうが良いと思う。既に明らかな利点を見出している人ならば、もう突入しているはずだ。

仮に本家からpackageが出ても、apt-get upgradeでセキュリティフィックスが当たるという状態にはならない。そういう意味でも、片手間ユーザなら待つのが正しい気がする。

ところで、安定版のディストロではそもそも1.8で止まっているケースもある。1.8から2.2への直接のアップデートパスは用意しないらしいから、この機に2.0に移せるものは移す方が良いのかもしれない。

2.2以降については、もしかすると段階的アップデートも用意してくれるかもしれない (1.8と2.0にはDB上にそれを分けるバージョン番号のようなものがないため、2.2はバージョンがない状態を2.0と仮定してしまう、という話を聞いた気がするが、ソース不明)

1.8ではほんのすこし触っただけでも快適な監視上不足しているアイテムがあり、難儀した覚えがある (memoryに対するpfreeはうるさすぎ、pavailableはデフォルトで存在しない)。2.0と2.2の間にはそういった明らかで強烈な利点はあるのだろうか。

地味なところで、loadable modules周りは熱心なユーザ層から良いライブラリが出てくる可能性を期待させるが、この期待は2.0.0で結実するのは速すぎるし、むしろそれこそyumやらapt-getで入れて省力化したいものじゃないだろうか。
OS Xでかな入力を英数入力したように変換する

`qiita`と入力したつもりが、かな入力になっていて`くぃいた`となることが時々あります。
でも大丈夫、deleteキーを連打する必要はないのです。
下線が引かれている状態で英数キーを2回ほどすばやく押してみましょう。英数入力したように`qiita`に変換されます。
Backbone.jsで、複数のModel間で変数を共有化したい場合

Collection の使い道がいまいち思いつかなかったのですが、ようやく使えそう。


まず、ModelBaseという共通クラスを定義して
それを継承するModelを複数個定義。

```coffeescript:test.model.coffee
class ModelBase extends Backbone.Model
	defaults: {
		var1: "",
		var2: "",
	}

	urlRoot: ->
		"/js_test"

class TestModelA extends ModelBase
	defaults: ->
		_.defaults {}, _.result ModelBase.prototype, "defaults"

	url: ->
		@urlRoot()

class TestModelB extends ModelBase
	defaults: ->
		_.defaults {}, _.result ModelBase.prototype, "defaults"

	url: ->
		@urlRoot()
```



Collectionを定義。

```coffeescript:test.collection.coffee
class TestCollection extends Backbone.Collection
```


Viewを定義。

```coffeescript:test.view.coffee
class TestView extends Backbone.View
	el: ".container"

	events: {
		"click #setParams": "setParams",
	}

	render: ->
		$("#result").empty()
		for model in @collection.models
			$("#template").tmpl(model.attributes).appendTo("#result")

	setParams: ->
		for model in @collection.models
			model.set {
				"var1":$("#var1").val(),
				"var2":$("#var2").val(),
			}
		@render()
```
目的は、this.setParams()でTestModelAとTestModelB間で変数を共有すること。
this.render()はおまけです。

Model, View, Collection のインスタンスを生成。

```coffeescript:test.default.coffee
mTestA = new TestModelA
mTestB = new TestModelB

cTest = new TestCollection
cTest.add mTestA
cTest.add mTestB

vTest = new TestView collection:cTest
```

もしレンダリングしたければ、html側で

```html:HTML
<input type="text" id="var1">
<input type="text" id="var2">
<button id="setParams">render</button>
```
みたいな感じです。


正直、こんな面倒なことをしなくても
\_.defaults()や\_.extend()をつかえばいいのかな…
Revealごとアーカイブしてリリース作業した時のエラー

みんな大好きReveal。そのままコンパイルするとValidateで下のようなエラーが

>Your app contains non-public API usage. Please review the errors, correct them, and resubmit your application.
>The app references non-public symbols in Payload/(アプリのアーカイブファイル名).app/(アプリのアーカイブファイル名) name: UICreateCGImageFromIOSurface
>If you think this message was sent in error and that you have only used Apple-published APIs in accordance with the guidelines, send the app’s nine-digit Apple ID, along with detailed information about why you believe the above APIs were incorrectly flagged, to appreview@apple.com. For further information, visit the Technical Support Information page at http://developer.apple.com/support/technical/.

リリース時だけ「Remove Reference」なりでプロジェクトから消してからリトライすればOK。
Zabbixあるある

(ヾﾉ･∀･`)ﾅｲﾅｲ

# Server 2.0を入れてAgentは認識したけどグラフが描画されない

その項目をzabbix_getしてみな。もしかするとZBX_NOTSUPPORTEDって返ってきてるかもよ。

# 他サーバからMySQLデータぶっこぬいて設定入れ替えたらサーバブートしてるけどデータが書き込まれないよ

2.2では改善してる？調べる。

NodeIDを使ってなかった？何の警告もなくDBに書き込まないから気をつけてね (2.0)

# "Zabbix Server" って項目が湧いてくるの。

AgentのどれかがActiveServerでそのZabbix Serverを指定していてでもHostNameをデフォのままにしてない？

# メールが送られないの

それはZabbixの話じゃない次。

(Media Typeを正しく設定し、Actionsを指定し、さらに関連するユーザのpermissionでアラート対象のホストをreadで見られる必要があるのは、Zabbixの話か……)

# 1.8から2.0にするときにデータを変換したら固まった

それ固まった違いますやん。

この1.8から2.0の変換は遅いです。長年のZabbixの勇者らしき人がOSCで言ってた。2.0から2.2はそうでもないそうですが。

# 何言っているか分からなかった

自分のメモですしおすし。

参考: https://mowa-net.jp/wiki/Zabbix
ターミナルからSVNリポジトリ配下にある特定の拡張子のファイルだけ削除する

エンジニアならSVNリポジトリ配下にある、特定の拡張子のファイルを一度に削除したくなることがあると思います。あるんです。
そういう時にFinderやNemoとか、その辺のファイルマネージャからちまちま消していくのは大変つらいです。なのでターミナルからサッと消しましょう、というメモです。

## コマンド

コマンドは大体、以下のようになるかと思います。試した環境がMac OS 10.6なのでコマンドはGNUのものでなくBSDのものです。とはいえ、Ubuntuなどでも大して変わらないかと。

```sh:Terminal
$ find (SVNリポジトリのパス) -type d -name '.svn' -prune -or -type f -iname '*.txt' -print0 | xargs -0 rm -f --
```

## 詳しい説明

SVNリポジトリにあるファイルを削除するのですが、探索する際に`.svn`ディレクトリが邪魔になります。これを無視するには以下のようにオプションを指定します。

```sh
-type d -name '.svn' -prune
```

`-type d`でディレクトリのみを、`-name '.svn'`でディレクトリ名を指定しています。
ディレクトリに対して`-prune`を付けると、そのディレクトリの配下を探索しないようになるので、これで`.svn`以下のファイルは検索しないことになります。

---

`.svn`ディレクトリを除外しつつ、ファイルを検索するために`-or`を指定します。

```sh
-or
```

---

特定の拡張子のファイルを検索するために、以下のように指定します。

```sh
-type f -iname '*.txt'
```

`-type f`でファイルのみを、`-iname '*.txt'`で拡張子が`.txt`のファイルを検索します。
ファイル名の指定では`-name`でなく`-iname`を指定しているので、大文字小文字を区別しません。
なので`.TXT`であっても対象になります。

---

```sh
-print0 | xargs -0
```

`-print0`で、ヌル文字を区切り文字として検索結果を出力します。これにより、半角スペースを含んだファイルでも正常に扱えるようになります。
パイプでつないでいるxargsの方にも`-0`を指定して、ヌル文字を区切り文字として扱うようにしています。

---

```sh
rm -f --
```

あとは渡された検索結果に対して`rm -f`を実行しているだけです。`--`は以降にはオプションは存在しないことを示すものなので、（確か）ファイル名の先頭が`-`で始まっているファイルでもオプションと認識されて削除に失敗する、といったことがなくなります。

---

というメモなのでした。
`find`の直後に`-E`を付加（拡張正規表現を使用、ただしBSDの場合）し、`-iname`でなく`-iregex '.*\.(txt|md)$'`などとすると複数の拡張子のファイルを同時に削除できて、もっと幸せになるかもしれません。
Mac OS X 10.9 Mavericks で brew install qt がコケる


Mac OS X 10.9 をクリーンインストールしたので環境を作っているとcapybara-webkit gemのインストールに失敗しました。

調べた結果、Qtをインストールしたら良いという情報が出てきたのでさっそく`brew install qt`でインストールを試みたらコケました。

```
==> make
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[3]: *** [../../../../../../lib/QtWebKit.framework/QtWebKit] Error 1
make[2]: *** [release] Error 2
make[1]: *** [sub-WebKit-qt-QtWebKit-pro-make_default-ordered] Error 2
make: *** [sub-webkit-make_default-ordered] Error 2
```

どうやら同じ問題があちらこちらで起きているようでhomebrewのリポジトリにissueがいくつか登録してありました。

https://github.com/mxcl/homebrew/issues/23480　
https://gist.github.com/americanyak/3419b87112cd646b98e2

そこで、第三者が作成したパッチを利用してインストールしました。

`brew install https://raw.github.com/cliffrowley/homebrew/patched_qt/Library/Formula/qt.rb --HEAD`

https://github.com/mxcl/homebrew/issues/21608#issuecomment-27321514

無事インストールでき、capybara-webkit gemのインストールにも成功しました。
Xcode 5 でCode sign error回避（特にセルフコードサイン）


Xcode 5になって、Self codesignなプロジェクトが色々とCode sign erroでビルドできなくなってしまった。
いろいろ調べてみたところ、

自分のコードサインを指定した一行下の
Code Sigining Resource Rules Pathに

` $(SDKROOT)/../../../ResourceRules.plist`

と記述しておけば良いらしい。

```
 $(SDKROOT)/ResourceRules.plist
```
だったのは、Xcode 5.0だけで、それ以降は上のように変わったようです
ターミナルの表示がおかしくなった時


たまにソースコードcatとかで見ようとして，間違ってバイナリをcatしてしまったときに表示が変になることがある．

![image](http://gyazo.com/795941de8265eb4c66a2ae1f3bf288cf.png)

こういう時はresetコマンド使うと治る．

```
% reset 
```
ブランチをまるっとsquashする

複数のコミットを積み上げていくうちにpull-requestが長大になっていって追いにくいという事があると思います。
gitにはせっかく歴史改変の機能があるので活用しましょう。
`git format-patch` でパッチファイルを作る際も1コミットにまとめて置くと1ファイルのみになって管理が楽です。

devブランチに対するpull-reqを作っていて、featというブランチを1コミットにまとめるという作業で例示します。
事前にrebase等を済ませて、devブランチの先端からfeatブランチが伸びて何コミットか積み重なっている状態を前提とします。

```shell-session
$ git branch -M feat tmp_squash # 何でもいい別の名前に変える
$ git checkout dev
$ git checkout -b feat # devブランチをベースに作リ直すのがポイント
$ git merge --squash tmp_squash # squashで1つの変更として取り込む
$ git commit -am'my new feature!!!'  # 好きなコミットメッセージ
$ git branch -D tmp_squash # 一時作成したブランチを消す
$ git push my_repo feat -f # remoteと食い違うので -f
```

pull-reqはブランチ名で追跡される(今回はfeatという名)ので同じブランチ名にする必要があります。
python-sphinxで表を書く時は csv-table を使った方が便利

```
.. csv-table::
   :header: A, B, A and B
   :widths: 5, 5, 5

   False, False, False
   True, False, False
   False, True, False
   True, True, True
```

http://sphinx-users.jp/doc10/rest.html#id6
で書かれてる方法だと、テーブルの要素の長さが変わる度に=====の数を調整しないといけなくて、つまりめんどくさい。以下書き方例

- OK

```
=====  =====  =======
A      B      A and B
=====  =====  =======
False  False  False
True   False  False
False  True   False
True   True   True
=====  =====  =======
```

- NG

```
=====  =====  =======
A      B      A and B
=====  =====  =======
False  False  Faaaaaaaaaalse
True   False  False
False  True   False
True   True   True
=====  =====  =======
```

結論：csv-table使った方が便利

## 参考

- [python-sphinx reStructuredText入門](http://sphinx-users.jp/doc10/rest.html)
- [csv-tableの使い方](http://docutils.sourceforge.net/docs/ref/rst/directives.html#csv-table)
ザ・インタビューズをテキストに変換するRubyスクリプト


#やりたいこと
[ザ・インタビューズをダウンロードするRubyスクリプト](http://qiita.com/hyuki/items/104fbdc7614b3db6683b)でダウンロードしたHTMLファイルを、[ファイル名を整えて](http://qiita.com/hyuki/items/e06cdceb6f5096f76bb2)から、テキストに変換します。その最後のHTML→テキストの部分。

#方法
Nokogiriを使って質問と回答部分だけを抜き出します。

# Nokogiriのインストール
```
$ gem install nokogiri
```

#コード


```totext.rb
require 'nokogiri'

("000".."128").each do |num|
  File.open("#{num}.html") do |file|
    doc = Nokogiri::HTML(file)
    doc.xpath('//div[@class = "title"]/h1 | //div[@class = "note"]').each do |node|
      if node['class'] != 'note'
        puts "\n# 質問\n"
      else
        puts "\n# 回答\n"
      end
      puts node.text.gsub(/\t/, "").squeeze("\n")
      if node['class'] == 'note'
        puts "\n---------------\n"
      end
    end
  end
end
```
#結果
およそ以下のようになります。

```
# 質問

バッハのどのようなところがお好きですか？

# 回答

心が整っていくところ。
2013-11-11 06:46:52

---------------

# 質問

空を見て、雲が何かの形に見えたことはありますか？　あれば、そのときの状況(時間、場所、気持ち、なにか行動をした後など)教えてください。

# 回答

雲の形に見えたことがあります。（冗談）
そういえば、あまりしげしげと雲見てないなあ。
2013-10-21 08:22:25
---------------
```

#メモ
* 上ではDOMを使ったけど、SAXを使う方が正しいような気がします。なぜなら、質問または回答を探しておいて、その後で質問かどうかをifで調べているからです。
* 上ではいったんファイルに落としたけれど、いきなりWebからテキストに変換することもできますね。

#参考
 
* http://www.engineyard.co.jp/blog/2012/getting-started-with-nokogiri/
ファイル名を一括置換するRubyスクリプト

#やりたいこと
カレントディレクトリにあるファイル名を置換します。
#方法
ファイル名をDir.globで得て、String#gsubで置き換えて、FileUtils.mvで変更します。

#例
以下では、カレントディレクトリにある1.html, 2.html, ... 10.html, ... 100.htmlのようなファイル名を、頭に0を付けて001.html, 002.html, ... 010.html, ..., 100.htmlに置換しています。

```rename.rb
require 'fileutils'

Dir.glob("*.html") do |filename|
  newname = filename.gsub(/^(\d+)/, sprintf("%03d", $1.to_i))
  FileUtils.mv(filename, newname)
end
```
ファイル名を一括置換するRubyスクリプト

#やりたいこと
カレントディレクトリにあるファイル名を適当に置換します。
#方法
ファイル名をDir.globで得て、String#gsubで置き換えて、FileUtils.mvで変更します。

#例
以下では、カレントディレクトリにある1.html, 2.html, ... 10.html, ... 100.htmlのようなファイル名を、頭に0を付けて001.html, 002.html, ... 010.html, ..., 100.htmlに置換しています。

```rename.rb
require 'fileutils'

Dir.glob("*.html") do |filename|
  newname = filename.gsub(/^(\d+)/, sprintf("%03d", $1.to_i))
  FileUtils.mv(filename, newname)
end
```
#python pythonの日本語のシンタックスエラー回避

pythonはじめました。

MacでpyChramを使っています。
環境構築の話などはまた別途。

今回、コードの中で日本語をあつかったら、早速SyntaxErrorにあたりました。

''SyntaxError: Non-ASCII character '\xa3' in file''

日本語を扱う場合は、

* 文字エンコーディングの宣言を頭でする。
* 日本語の前に「u」を記述する。

```py:test.py
# -*- coding: utf-8 -*-
__author__ = 'ashibuya'

queries=['Mozart', 'Beethoven','Haydn']
for q in queries:
    print q

queries=[u'モーツァルト', u'ベートーヴェン',u'ハイドン']
for q in queries:
    print q


参考サイト
http://stackoverflow.com/questions/10589620/syntaxerror-non-ascii-character-xa3-in-file-when-function-returns
モデルの基本

モデルはデータベースや外部サービスへのアクセス等
“データ”の管理、操作を担当するコンポーネントのこと。

Railsには標準でO/Rマッパー
Active Recordがついている。
（初学者はActive Recordをオススメ）

O/R mapperとは：
リレーショナルデータベースとオブジェクト指向言語の
橋渡しを受け持つライブラリの事です。

リレーショナルモデル＝データベース
オブジェクトモデル＝アプリケーション
この２つは全然違う

データベース接続の設定：
Active Record経由でデータベースに接続するには、
config/databse.ymlにて接続設定を定義する必要がある。

デフォルトの設定：
development : 開発環境用
.
.
.
test : テスト環境用
.
.
.
production : 本番環境用
.
.
.

database.ymlは（ヤムル）で記述
YAML = YAML ain't markup languageの略
↓
マークアップ言語ではなく、構造をインデントや記号で表現する。

複雑な構造を表現するには不向き
シンプルさはすごい

YAMLの基本パラメータ表示形式：
production 
  adapter:splite3

インデントはタブでなくスペース２つ！

目的に応じて環境を使い分ける
そうすることで、開発環境での操作が不用意に
本番に影響する事を妨げる。

モデルクラスの作成
データベースのテーブルにアクセスするための
モデルクラスを作成。

ここでもrails generate コマンドを利用

rails generate model name field:type [...] [options]

テーブルを作成：
例
isbn     string     ISBN code
title         "          書名
price     integer  価格
publish  string    出版社
published date   刊行日
cd         boolean CD・添付

モデル関連の命名規則→命名規則が重要！！

model class＝Capital, Singular : Book
model class(file)=small, singular : book.rb
table=small, plural : books
test script= small_test.rb, singular : book_test.rb
独自RPM Repositoryを作成するのが簡単すぎた件

```bash:
$ sudo yum -y install createrepo
```

```bash:
$ createrepo -v .
1/7 - facter-1.7.3-1.el5.x86_64.rpm
2/7 - ruby-shadow-1.4.1-8.el5.x86_64.rpm
3/7 - augeas-libs-0.10.0-4.el5.x86_64.rpm
4/7 - ruby-1.8.7.374-1.el5.x86_64.rpm
5/7 - ruby-libs-1.8.7.374-1.el5.x86_64.rpm
6/7 - puppet-2.6.14-1.el5.noarch.rpm
7/7 - ruby-augeas-0.4.1-2.el5.x86_64.rpm

Saving Primary metadata
Saving file lists metadata
Saving other metadata
$ find .
.
./repodata
./repodata/other.xml.gz
./repodata/filelists.xml.gz
./repodata/repomd.xml
./repodata/primary.xml.gz
./facter-1.7.3-1.el5.x86_64.rpm
./ruby-shadow-1.4.1-8.el5.x86_64.rpm
./augeas-libs-0.10.0-4.el5.x86_64.rpm
./ruby-1.8.7.374-1.el5.x86_64.rpm
./ruby-libs-1.8.7.374-1.el5.x86_64.rpm
./puppet-2.6.14-1.el5.noarch.rpm
./ruby-augeas-0.4.1-2.el5.x86_64.rpm
```

あとはこのディレクトリをWebに公開すればよい。

rpmの追加を繰り返すと`yum search パッケージ名`で引っかからない場合がある。その時は、

```bash:
$ sudo yum clean all
$ sudo yum search パッケージ名
```

をすればよい。
どこかで聞いたしゃべり方をするワンライナー


あまりに下らないので閲覧注意.

Python2とPython3の文字列の扱いが異なることが分かるくらい。
Python3はユニコード文字列⇔バイト文字列の変換がなくて気楽でいい。

```bash:python2
# 標準入出力はUTF-8前提

# Python2.7
$ python -c "import sys;print(u'\"'.join(unicode(sys.argv[1], 'utf-8')))" とおしてそこてかんはるんたよぉぉぉぉ
# と"お"し"て"そ"こ"て"か"ん"は"る"ん"た"よ"ぉ"ぉ"ぉ"ぉ

# Python3.3
$ python -c "import sys;print('\"'.join(sys.argv[1]))" とおしてそこてかんはるんたよぉぉぉぉ
# と"お"し"て"そ"こ"て"か"ん"は"る"ん"た"よ"ぉ"ぉ"ぉ"ぉ
```
botが同一内容のtweetを投稿しようとするのを簡易な回避策

はい。大事なことなので一度しか言わないように、bot運用でありがちな同一内容の投稿をしてしまおうとするアレの回避しようとしました。

[http://qiita.com/clarinet758/items/3e245a4388ef8a752ca3](http://qiita.com/clarinet758/items/3e245a4388ef8a752ca3)

```py:op.py
while i < 4:
#直近の4件の投稿まで新しい方から古い方へ見に行く。
    tl = tll[i].text
    otu=re.compile(u'お疲れ様でした')
    oha=re.compile(u'利用時間')

#特定の単語が含まれているかをチェックする
    if re.search(u'@xxx おやすみ', tl):
        jk = tll[i].created_at
        t = open('kanri.txt', 'w')
        t.write(str(jk))
        t.close()

        tane = '@xxx お疲れ様でした。ベッドインを%s時%s分くらいでセットしました。' % (str(jk.hour+9), str(jk.minute))
        m=i-1
#特定の単語が発見された時点から新しい方へ見に行き、botが返信に使っている単語がないか探す
#特定の単語があれば簡易な判定ですが動作済みとして終了させる。
#新着最新まで見てhitしなかったら未動作としてtweetを行う。
        while m>=0:
            if re.search(otu, tll[m].text):
                break
            else: m-=1
#       if m<=0:
        if m<0:
            oat.client.request('https://api.twitter.com/1.1/statuses/update.json', 'POST', urlencode({'status': tane}))
        i+=5
```

変数名とかあまりに汚いのを明日以降に微調整します。
個人使用で1桁件数程度しか遡ったりしないならログ保存とかする必要ないかな、と。ただfollw先など多いとTLに簡易判定の単語が紛れてきてしまう危険性が高くなるので状況によってアレです。
んー、ログ保存せずにその時ばったりで特定単語だけチェックするのが簡易かと思ってるけどどうなんだろ。

最後の判定のところをm<=0からm<0に条件を修正しました。<=だと最新の発言でhitしてbreakで抜けてきた場合にmが0なので重複発言を止めることが出来ておりませんでした。
operaのspeed dialでopera linkに頼らず端末間共有したかった

opera 12以降 opera linkがちっとも役に立たないのでちょっと考えてみた。
というかブックマークという考え方がなくなってspeed dial使えってなってるの知らなかったよ。それならそれで移行できる指示とか更新時に見たかったものです。まぁそうなってしまったものはしょうがないので対策してみる。operaファンだからしょうがないです。盲目です。

今回opera 17にあったspeed dialをopera Next 18に移します。
またそのファイルを他の端末と共有し更新があってもそれを見に行くようにします。

考え方は、
・speed dialのファイルをdropboxとか端末間を共有するところに置く
・本当はoperaが参照するファイルをシンボリックリンクで上のdropbox上のファイルに結びつける。
です。安易ですね。

1.operaのファイルをDropboxの特定のフォルダにコピーする
うちはmacなので以下のフォルダにありました。

```shell-session
/Users/username/Library/Application Support/com.operasoftware.Opera/favorites.db
/Users/username/Library/Application Support/com.operasoftware.Opera/favorites.db-journal
```

このふたつをどっかdropboxに配置する仮に

```shell-session
/Users/username/Dropbox/SHARE/Opera/speeddial/favorites.db
/Users/username/Dropbox/SHARE/Opera/speeddial/favorites.db-journal
```

とします

2. シンボリックリンクを貼る
コンソールから以下の感じで

```shell-session
#opera nextの階層に移動(元々あったファイルはリネームしてある)
cd /Users/username/Library/Application Support/com.operasoftware.OperaNext/
#シンボリックリンクを貼る
ln -s /Users/username/Dropbox/SHARE/Opera/speeddial/favorites.db favorites.db
ln -s /Users/username/Dropbox/SHARE/Opera/speeddial/favorites.db favorites.db
```

一応うまく動いてるっぽいすね。

Windows 7でもシンボリックリンク使えるみたいなのであす試してみたい。
<a href="http://blog.livedoor.jp/s_imai_jp/archives/51360129.html">http://blog.livedoor.jp/s_imai_jp/archives/51360129.html</a>
ちなみにwindowsのoperaは<pre>\Users\[ユーザ名]\AppData\Roaming\Opera Software\Opera (Stable|Next?|Developer?)</pre>とかにあるらしい。

実際に作業的にはoperaのディレクトリで作業 => Users\username\AppData\Roaming\Opera Software\Opera (Stable|Next?|Developer?) にて

```
mklink favorites.db C:\Users\username\Dropbox\SHARE\Opera\speeddial\favorites.db
mklink favorites.db-journal C:\Users\username\Dropbox\SHARE\Opera\speeddial\favorites.db-journal
```
という感じでコマンド打って、シンボリックリンクを読み取り専用にするという感じ。

---

※後日、シンボリックリンクがきれていて共有が切れてました。
※ためしにロックを掛けてみる。
旬な３大言語のヌルチェック

#スマホ開発で旬な三大言語のヌルチェックについてメモ

初心者レベルの話になるので当たり前体操なコンテンツですみません。。。

Android, iOS開発で使われるJava, C++, Objective-Cはどれもオブジェクト指向型言語。
そのヌルチェックについての違いをまとめてみた。

ここで各言語においてobjというインスタンスがあるとする。
それがisTrueという関数を持つとき、その関数は各言語で定められた真偽値を返すとする。
そこでisTrueが真に当たるほうの値を返すかどうかのif文を考える。
ちなみにobjはヌルかもしれないしヌルでないかも知れない。

Javaでは

```java
if(obj != null && obj.isTrue()) {
// 処理
}
```

&&を使って判定するときJavaではifの括弧内を手前から順番に実行する。falseを返した時点で括弧内の実行を抜けるためobjがヌルならばisTrue()を行なわないからヌルポにならなくてすむ。

ちなみに||の場合trueが確定しても最後まで実行されるので

```java
if(obj == null || !obj.isTrue()) {
} else {
// 処理
}
```
は安全ではない。


話を戻して、C++で安全に行なうには

```cpp
if(obj != NULL) if(obj.isTrue()) {
// 処理
}
```

としなければならない。
Javaと違い、&&でfalse確定でも最後までやりきってしまうからだ。

Javaのほうがここの記述がスマートにできていいなーと思っていたら
Objective-Cのほうがクールだった。

```objc
if([obj isTrue]) {
// 処理
}
```

万が一nil（Objective-Cのヌル）にメッセージを送っても問題ないらしい。
nilにメッセージを送るとnilか0を返すらしいから
多分この場合はNOになるのかな・・・（素人のため自信無し）

おかしなところがあったら修正してくださいな。。。
Javaで逆ポーランド記法（計算編）

AOJがJava1.7対応してないのしらなくて時間を無駄にしました。。。

今回は

#逆ポーランド記法で渡されたデータの計算

詳細は以下のリンクが分かりやすいです。
[Wikipedia：逆ポーランド記法](http://ja.wikipedia.org/wiki/%E9%80%86%E3%83%9D%E3%83%BC%E3%83%A9%E3%83%B3%E3%83%89%E8%A8%98%E6%B3%95)
※例もリンク先にあるので省略します。

1.6向けでStackを使っていますが、1.7以降はDequeの利用が推奨されています。

#解法
##Java1.6向け
```java
package aoj;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;

public class ReversePolishNotationOld {

	public static void main(String args[]) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String[] stringArray = br.readLine().split("\\s");

		// 後に入れたものを先に抜き出す（いわゆるLIFO）
		Stack<Integer> que = new Stack<Integer>();
		int a = 0;
		int b = 0;
		for (int i = 0; i < stringArray.length; i++) {
			if (stringArray[i].equals("+")) {
				a = que.pop();
				b = que.pop();
				que.add(b + a);
				continue;
			}
			if (stringArray[i].equals("-")) {
				a = que.pop();
				b = que.pop();
				que.add(b - a);
				continue;
			}
			if (stringArray[i].equals("*")) {
				a = que.pop();
				b = que.pop();
				que.add(b * a);
				continue;
			}
			if (stringArray[i].equals("/")) {
				a = que.pop();
				b = que.pop();
				que.add(b / a);
				continue;
			}
			// 演算子以外はstackに登録する
			que.push(Integer.parseInt(stringArray[i]));
		}
		System.out.println(que.pop());
	}
}

```

##Java1.7向け

```java
package aoj;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Deque;

public class ReversePolishNotationNew {
	public static void main(String args[]) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String[] stringArray = br.readLine().split("\\s");

		Deque<Integer> que = new ArrayDeque<>();
		int a = 0;
		int b = 0;
		for (int i = 0; i < stringArray.length; i++) {
			switch (stringArray[i]) {
			case "+":
				a = que.pollFirst();
				b = que.pollFirst();
				que.addFirst(b + a);
				break;
			case "-":
				a = que.pollFirst();
				b = que.pollFirst();
				que.addFirst(b - a);
				break;
			case "/":
				a = que.pollFirst();
				b = que.pollFirst();
				que.addFirst(b / a);
				break;
			case "*":
				a = que.pollFirst();
				b = que.pollFirst();
				que.addFirst(b * a);
				break;
			default:
				que.addFirst(Integer.parseInt(stringArray[i]));
			}
		}
		System.out.println(que.pop());
	}
}
```
~/.sh.dと~/.bash.dをつくる

私は自分の~/.profileや~/.bash_profile・~/.bashrcなどを~/.sh.dや~/.bash.dといったディレクトリに入れてgitで管理しています。

…ホームディレクトリ配下をgit（やhg）で管理したいという方は多いと思います。私も考えました…が、やめました。理由はいくつかあります。

1. ホームディレクトリ配下のドットファイルをgitで管理するには、ホームディレクトリのほとんどを~/.gitignoreに入れる必要があります。グローバルに無視したいファイルのリストを~/.gitignore_globalに書いて~/.gitconfigで指定する、などの別解もありますが、これは最近の私のモットー「デフォルトを大切に」に反します（くわしくは`man git-ignore`を参照）。
2. Linuxや（Mac ）OS Xでファイルを使い回すことを考えると、gitで共有する意味のあるファイルは案外少ないと考えています。たとえば~/.Xresourcesの中で`#include /Users/h12o`としてしまうと、Linuxでも使えるようにするためには`cd / && sudo ln -s home Users`とする必要があります。root権限があればいいのですが、なければ別の対応をするしかありません。

こういったことを考えながら整理していくと、本当にgitで管理したいと思うファイルは~/.bashrcなどシェルが読むファイル、それから~/.emacs.d配下のファイルくらいのものです。

であれば管理しやすいように~/.bashrcなどはサブディレクトリに入れてシンボリックリンクを張ることで対応し、「[github.com/h12o/.sh.d](https://github.com/h12o/.sh.d)」「[github.com/h12o/.bash.d](https://github.com/h12o/.bash.d)」「[github.com/h12o/.emacs.d](https://github.com/h12o/.emacs.d)」といった直感的なレポジトリとしてGithubで公開したいと考えました。つまり、自分のドットファイルを公開するにあたり「github.com/h12o/dot-emacs-d」のようなレポジトリ名には、したくなかったのです。ローカルのレポジトリ名とリモートのレポジトリ名を変えるのもそれはそれで混乱しますし、かといってどこかのdot-emacs-dディレクトリでファイルを変更するたびに`make install`とかするのも面倒です。

（私はWindowsではUnix由来のシェルを使いませんので、私の場合Windowsのことを考える必要はありません。もっとも、仮に使ったとしてもNTFSがシンボリックリンクに対応しているので根本的には問題ありません）

といったことを思案しながらできあがったのが、私の~/.sh.dと~/.bash.dです。

* [h12o/.sh.d](https://github.com/h12o/.sh.d)
  * なるべくbashismを排除したつもりですが（00setup.shに対しては`checkbashisms`(1)を使用してチェック済み）、Solarisなどいにしえの/bin/shが動作する環境を持ち合わせていないため、bashismが排除できていないかもしれません。
* [h12o/.bash.d](https://github.com/h12o/.bash.d)
  * 環境変数を指定する場所をなるべく1箇所にするため、h12o/.bash.dはh12o/.sh.dの存在を前提としています。

なお、~/.sh.dと従来の~/.profileなどとの互換性・~/.bash.dと従来の~/.bash{rc,_profile}などとの互換性を保つ仕組みはシンボリックリンクですが、どのようにシンボリックリンクを張っているのかは、それぞれのレポジトリをみていただくのがよいかと思います。

ちなみに、実は~/.sshや~/.gnupgなどをgitで管理しようかどうか、正直思案しています。もちろん、これらをGithubで公開することはありませんが…。
シェルプロンプトをユーザ・ホスト名毎に手っ取り早く色変更


## 何をしたいか

* タイトルの通り、ぱっと見解りやすく色付けたい。
* 割とネタ。

![prompt_color_setting.png](https://qiita-image-store.s3.amazonaws.com/0/11337/e8a2c286-ac4f-8124-e777-3ba9b20abcfa.png)

## 理由と動機

* **間違ってrootで入ってたあああああ**とか
* **間違って本番機入ってたあああああうおおおrm -rfとかしちまったあああああ**とかなくすため。

## 設定

* ログインするサーバリストやユーザリストに応じていちいちコード変更しなくてもいいようにしてみた。
* bashとzshそれぞれのシェルプロンプト設定を紹介。

---------

* .zshrcの設定

```zsh
#color mapping
#_color_map=(${_color_map[*]} 0)   # black
_color_map=(${_color_map[*]} 1)   # red
_color_map=(${_color_map[*]} 2)   # green
_color_map=(${_color_map[*]} 3)   # yellow
_color_map=(${_color_map[*]} 4)   # blue
_color_map=(${_color_map[*]} 5)   # magenta
_color_map=(${_color_map[*]} 6)   # cyan
_color_map=(${_color_map[*]} 7)   # white
 
# attribute mapping
_attr_map=(${_attr_map[*]} 0)     # normal
_attr_map=(${_attr_map[*]} 1)     # bold
_attr_map=(${_attr_map[*]} 4)     # under_score
#_attr_map=(${_attr_map[*]} 7)     # reverse
 
# Coloring hostname and username
_cl_host_index=$(/usr/bin/python -c 'print hash("'$HOSTNAME'") % '${#_color_map[*]}'')
_cl_user_index=$(/usr/bin/python -c 'print hash("'$USER'") % '${#_color_map[*]}'')
_attr_host_index=$(/usr/bin/python -c 'print hash("'$HOSTNAME'") % '${#_attr_map[*]}'')
_attr_user_index=$(/usr/bin/python -c 'print hash("'$USER'") % '${#_attr_map[*]}'')
 
_colored_host=$(echo -e "%{\e[${_attr_map[${_attr_host_index}]};3${_color_map[${_cl_host_index}]}m%}%m%{\e[m%}")
_colored_user=$(echo -e "%{\e[${_attr_map[${_attr_user_index}]};3${_color_map[${_cl_user_index}]}m%}%n%{\e[m%}")
 
# prompt setting
PROMPT="[${_colored_user}@${_colored_host} %~]%# "
```

* 最後のprompt settingの所はお好みに応じて。

------------

* bashの場合は、_colored_host以下を次の通りに。適当に.bashrcにでも追加。

```bash
_colored_host=$(echo -e "\e[${_attr_map[${_attr_host_index}]};3${_color_map[${_cl_host_index}]}m\h\e[m")
_colored_user=$(echo -e "\e[${_attr_map[${_attr_user_index}]};3${_color_map[${_cl_user_index}]}m\u\e[m")

# prompt setting
PS1="[${_colored_user}@${_colored_host} \w]\$ "
```

* 同じくPS1の設定は好みで。

## 説明

* ホスト名とユーザ名のハッシュコード値を使って、文字色と文字効果を組み合わせて特徴付けさせてます。
* 運が悪いと同じになりますがまぁ滅多にない程度の緩さ。

## カスタマイズ

_color_mapと_attr_mapの定義部分で、
好みじゃない文字色や文字効果をコメントアウトすればそいつは出てこなくなります。

## 注意

* **ピュアシェルじゃない。トテモカッコワルイ。**
* 今やどこにでも入ってるであろうpythonを使ってる。ない環境だったらスミマセン。
Jenkinsの起動オプションを細かく指定して起動

公式ドキュメント [Starting and Accessing Jenkins](https://wiki.jenkins-ci.org/display/JA/Starting+and+Accessing+Jenkins)

## 起動オプションで変更・調節する項目

* IPアドレス
* HTTPプロトコルのポート番号
* ログの設定
* メモリの設定

など

## Jenkins起動シェル

Macでbrewを使ってjenkinsをインストールした環境の手順を示す
デーモンは使用しない

通常は
起動 `launchctl load ~/Library/LaunchAgents/homebrew.mxcl.jenkins.plist`
停止 `launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.jenkins.plist`
でプロセス管理できるが、細かいカスタマイズをする場合はシェルの方が扱いやすい

```bash:jenkins-runner.sh
#!/bin/sh

DESC="Jenkins CI Server"
NAME=jenkins
PIDFILE=/var/run/jenkins.pid
JAR=/usr/local/opt/jenkins/libexec/jenkins.war
RUN_AS=user
HTTP_HOST=0.0.0.0
HTTP_PORT=8080
LOG_PATH=/Users/$RUN_AS/.jenkins/access.log

/usr/bin/java -Xms768m -Xmx768m -XX:PermSize=192m -XX:MaxPermSize=192m -jar $JAR --httpListenAddress=$HTTP_HOST --httpPort=$HTTP_PORT --accessLoggerClassName=winstone.accesslog.SimpleAccessLogger --simpleAccessLogger.format=combined --simpleAccessLogger.file=$LOG_PATH
```

もともとはJenkinsの動きがいまいちでしばしばフリーズしてたので、
改善するためにメモリの設定をチューニングする際に起動シェルを使いはじめた

Javaのパフォーマンスを見るのに[jconsole](http://docs.oracle.com/javase/jp/1.5.0/guide/management/jconsole.html)が使える
cpコマンド


MacOSXの場合

cp -r 再帰する。シンボリックリンクが実体化される
cp -R 再帰する。シンボリックリンクは実体化しない
cp -RP -Rと同じ
cp -RL 実体化しない
cp -RH コマンドラインで指定したディレクトリがシンボリックリンクの場合だけ実体化する
cp -p 所有権やタイムスタンプをそのままにする
cp -a -pPRと同じ（そのまま再現したいならこれで）
cp -i 確認する

iPhoto Libraryを`cp -r`でコピーしてハマった。`cp -R`が正解。
grunt-initでテンプレートをコンパイルしてファイルをコピーする

<a href='http://gruntjs.com/project-scaffolding' target='_blank'>grunt-init</a>の処理の中心である、rootディレクトリ内のファイルをプロンプトで取得したデータでコンパイルしてコピーするやり方。

## ざっくりコピー (init.copyAndProcess)

テンプレート・ディレクトリの内にあるrootディレクトリをざっくりとコピーする場合はinit.filesToCopyとcopyAndProcessを使う。

まずfilesToCopyで、rootディレクトリ内からrename.jsonの内容を反映したファイルリストを取得する。

rename.jsonでは、特定のファイルをコピーの対象から外したり、リネームさせるためのルールを記述する。

下記の設定ではrootディレクトリ内にある、src/js/main.jsを、取得した(または初期値 = init.processの第1引数)のデータのnameプロパティにリネームする設定と、dataディレクトリをコピーの対象から外している。

```json:rename.json
{
  "src/js/main.js": "src/js/{%= name %}.js",
  "data/**/*": false
}
```

次に、取得したファイル・リストとプロンプトで取得データを引数にいれて、init.copyAndProcessを実行する。

```js:template.js
exports.template = function(grunt, init, done) {
  init.process({
    "some" : "some property"
  }, [
    init.prompt('name')
  ], function(err, props) {
    var files = init.filesToCopy(props);
    init.copyAndProcess(files, props, {
      noProcess: ['my_templates/**/*','**/*.png','**/*.jpg','**/*.gif']
    });

    done();
  });
};
```

オプションのnoProcessに指定したファイルは、処理を通さずにコピーされる。上記の例だと、my_templatesディレクトリ内にあるファイルと、拡張子がpng、jpg、gifの画像ファイルが処理の対象外になる。バイナリファイルを処理してしまうと壊れてしまうので、noProcessに入れておく。また、テンプレートのままコピーしたい場合なども入れておく。


## 特定のテンプレートを元にコピー (grunt.template.processとgrunt.file.write)

特定のテンプレートをコピーする場合は、コピーしたいテンプレートを読みこんでコンパイルしたのちに、書き込み処理を行う。

具体的にはinit.srcpathをつかって、テンプレート・ディレクトリ内にあるrootディレクトリの中の対象のテンプレートのパスを取得して、grunt.file.readでファイルを読み込む。

その後にgrunt.template.processに読み込んだテンプレートとデータを渡してコンパイルする。
最後にgrunt.file.writeでコンパイルしたファイルを書き込む。

```js:template.js
exports.template = function(grunt, init, done) {
  init.process({
    "some" : "some property"
  }, [
    init.prompt('name')
  ], function(err, props) {
    var temp = grunt.file.read(init.srcpath('src/index.html'));
    var compile = grunt.template.process(temp, {data: props, delimiters: 'init'});
    grunt.file.write('test/test.html', compile);

    done();
  });
};
```

おしまい
Alfred: Custom Searches に Qiita と Stack Overflow を加える


Alfred から Qiita と Stack Overflow の検索をできるように設定する方法。
<!--more-->

<a href="http://www.d-wood.com/wpmt/wp-content/uploads/2013/10/alfred-2013-10-27-12-29-47.png"><img src="http://www.d-wood.com/wpmt/wp-content/uploads/2013/10/alfred-2013-10-27-12-29-47.png" alt="alfred 2013-10-27 12-29-47" width="400" height="104" class="alignnone size-full wp-image-4932" /></a>


## Qiita

<a href="http://www.d-wood.com/wpmt/wp-content/uploads/2013/10/alfred-2013-10-27-12-21-45.png"><img src="http://www.d-wood.com/wpmt/wp-content/uploads/2013/10/alfred-2013-10-27-12-21-45.png" alt="alfred 2013-10-27 12-21-45" width="400" height="242" class="alignnone size-medium wp-image-4930" /></a>

Search URL に以下を追加します。

```
http://qiita.com/search?q={query}
```

アイコンは favicon を登録するのが良いと思います。
[http://qiita.com/favicon.ico](http://qiita.com/favicon.ico)

### 絞り込み

`{query}` のあとに、`tag:` や `user:` で絞り込めることをさきほど知りました。

<a href="http://www.d-wood.com/wpmt/wp-content/uploads/2013/10/alfred-2013-10-27-12-26-30.png"><img src="http://www.d-wood.com/wpmt/wp-content/uploads/2013/10/alfred-2013-10-27-12-26-30.png" alt="alfred 2013-10-27 12-26-30" width="370" height="289" class="alignnone size-medium wp-image-4931" /></a>

こんな感じ。

```
http://qiita.com/search?q={query}+tag%3Aruby
```


## Stack Overflow

<a href="http://www.d-wood.com/wpmt/wp-content/uploads/2013/10/alfred-2013-10-27-12-21-17.png"><img src="http://www.d-wood.com/wpmt/wp-content/uploads/2013/10/alfred-2013-10-27-12-21-17.png" alt="alfred 2013-10-27 12-21-17" width="400" height="242" class="alignnone size-full wp-image-4929" /></a>

Search URL に以下を追加します。

```
http://stackoverflow.com/search?q={query}
```

アイコンは favicon を登録するのが良いと思います。
[http://cdn.sstatic.net/stackoverflow/img/favicon.ico](http://cdn.sstatic.net/stackoverflow/img/favicon.ico)
mutable修飾子

constメソッドの中でメンバ変数を更新してしまう場合がたまに（というかよくある？）あるが、例外的にconstメソッドの中で更新することを許可するために指定する修飾子がmutableである。
さっき初めて、この修飾子の存在を知ったので忘れないようにメモしておく。
Sassの繰り返し処理


marginだけのクラスを、
Sassの繰り返し処理を用いて作成してみます。


```scss:margin.scss

// 繰り返すものをリストとして登録しておく
$space: 5px, 10px, 15px, 20px, 25px, 30px;

// 上記のリスト分だけ繰り返す！！
@each $prefix in $space{

    /* margin-bottom */
    .mb#{$prefix} {
        margin-bottom: #{$prefix}px;
    }

}

```
　

アウトプットはこんな感じ。

```css:margin.css
.mb5 { margin-bottom: 5px; }
.mb10 { margin-bottom: 10px; }
.mb15 { margin-bottom: 15px; }
.mb20 { margin-bottom: 20px; }
.mb25 { margin-bottom: 25px; }
.mb30 { margin-bottom: 30px; }
```

　
---

参照
http://sass-lang.com/documentation/file.SASS_REFERENCE.html#each-directive
Theano on Anaconda 

AnacondaでTheanoを入れたときにハマったこと。
使っているOSはMacOSX Maverics。てっきりAnacondaにはTheanoが入っているものだと思ってAnacondaを入れて使おうと思ったら、エラーがでた。

```py
Python 2.7.5 |Anaconda 1.8.0 (x86_64)| (default, Oct 24 2013, 07:02:20) 
[GCC 4.0.1 (Apple Inc. build 5493)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import theano
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named theano
```

え！？とおもったけれどなんてことはない。

![theano2.png](https://qiita-image-store.s3.amazonaws.com/0/7129/040958f6-fee1-f656-5435-205c40a5abb9.png)

小さく`L`の文字。Linux版だけらしい。その証拠に持っていたUbuntuマシンでやったら動いた。
IE8でデバッグしようとするとIE7の互換表示モードで表示されてしまう罠の回避方法

なぜIE8なのに、ブラウザモードがIE7で既定されているのか、よくわかりません。
設定方法あるのかもしれませんが、IEをいじる気にはなりません。(・ω<)

```html:HTML
<!doctype html>
<html>
<head>
    <meta http-equiv="X-UA-Compatible" content="IE=8">
    ...
    <link media="all" href="https://netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css" rel="stylesheet">
</head>
```

meta要素の先頭に入れましょう。だそうです。
http://msdn.microsoft.com/ja-jp/library/cc817574.aspx

関係ないですけど
meta ってタイプすると十中八九で meat になっちゃいますよね～。
Ruby 2.0.0をsourceからインストール


### 1.はじめに

ソースからコンパイルしてruby 2.0.0-p247をインストールしようとしたら、いくつかつまづきポイントがありました。yumとかrvmとかrbenvとか使えるのであれば、手順が書いてあるBlogもありますし簡単ですが、今回は外部ネットワークに接続されていない環境でした。
調べても全然情報がなかったので手順をまとめておきます。

なお、インストール作業は[@pochi_black](https://twitter.com/pochi_black)さんに協力いただきました。
ありがとうございます。

　

### 2.ダウンロードしておくもの

以下のものを事前に準備しておきます

* [ruby-2.0.0-p247.tar.gz](https://www.ruby-lang.org/ja/downloads/)
* [openssl-1.0.1e.tar.gz](http://www.openssl.org/source/)
* [zlib-1.2.8.tar.gz](http://www.zlib.net/)

使いそうな[gem](http://rubygems.org/)も準備しておくと、zlibの動作確認ができます。
今回は[systemu](http://rubygems.org/downloads/systemu-2.5.2.gem)を利用して確認しています。



### 3.インストール手順

##### 1) openssl

ポイントは./configでsharedオプションを指定することです。
あとは普通のインストールと変わりません。

```
$ tar xzf openssl-1.0.1e.tar.gz
$ cd openssl-1.0.1e
$ ./config --prefix=/usr/local/openssl shared
$ make
$ make install
```

##### 2) zlib

普通にインストールするだけです。

```
$ tar xzf zlib-1.2.8.tar.gz
$ cd zlib-1.2.8
$ ./configure
$ make 
$ make install
```

##### 3) Ruby

こちらもconfigureで--with-opt-dirと--enable-sharedの二つのオプションを指定してあげる必要があります。--with-openssl-dirではないので注意です。これでopensslが使える状態でインストールできます。

```
$ tar xzf ruby-2.0.0-p247.tar.gz
$ cd ruby-2.0.0-p247
$ ./configure --with-opt-dir=/usr/local/openssl --enable-shared 
$ make
$ make install
```

複数バージョンのrubyを利用したい場合や特定のディレクトリにインストールしたい場合は、configureでprefixをつけてあげれば良いです。

```
# 必要な人だけ・・・
$ ./configure --prefix=/usr/local/ruby2.0.0 --with-opt-dir=/usr/local/openssl --enable-shared
```
prefixをつけてインストールするとbinのパスが通っていないので、make install後に./bashrcの中でPATHを追加するか、シンボリックリンクを作ると良いと思います。

```.bashrc
# 必要な人だけ・・・
PATH=$PATH:/usr/local/ruby2.0.0/bin
```

```
# 必要な人だけ・・・
$ ls /usr/local/bin | grep ruby
   #=> 既にrubyのリンクが作られていないことを確認する
$ ln -s /usr/local/ruby2.0.0/bin/* /usr/local/bin/
```


### 4.動作確認

インストールがうまくいっていることを確認します。

##### openssl

```
$ irb
2.0.0-p247 :001 > require 'openssl'
 => true
```
ここでエラーが発生したらextconf.rbを叩いてあげます。
extディレクトリはrubyのソースを解凍したフォルダ直下にあります。

```
$ cd ext/openssl
$ ruby extconf.rb --with-openssl-dir=/usr/local/openssl --enable-shared
```
これでもう一度irbでopensslがrequireしてみてうまくいけばOKです。

##### zlib

続いてgemがインストールできることを確認します。
まずはインストールしたいgemのディレクトリに移動しておきます。

```
$ ls systemu-2.5.2.gem
$ gem install systemu-2.5.2.gem --no-ri --no-rdoc
Successfully installed systemu-2.5.2
1 gem installed
```

zlibをインストールしていないとここでエラーになりますが、今回は先にインストールしているのでうまく行くはずです。
PHP - exec()のエラーハンドリングと標準エラー出力の関係をまとめる

phpからexec()でコマンド実行した場合のエラー処理まとめ。

## 出力を処理しない

```php
if ( !exec('command',$array)) {
    //command失敗を検知して処理したい
    echo "NG";
}
```

これだと、command実行時に標準エラー出力を吐いた場合、そのまま出力されてしまいます。

```shell-session
<commandのエラー出力>
NG
```

## 標準エラー出力も標準出力へ吐き出す（2>&1）

標準エラー出力も変数へ突っこんで処理したいなら、

```php
if ( !exec('command 2>&1',$array)) {
    //command失敗を検知して処理したい
    echo "NG";
}
var_dump($array);
```

```shell-session
array(1) {
  [0]=>
  string(77) "<commandのエラー出力>"
}
```

エラーメッセージが変数へ代入されます。
exec()の実行自体はエラーにならず、php側で拾えなくなるので注意。

## 標準エラー出力を捨てる(2>/dev/null)

今度はcommandのエラー出力を捨ててみます。

```php
if ( !exec('command 2>/dev/null',$array)) {
    //command失敗を検知して処理したい
    echo "NG";
}
```

実行結果

```shell-session
NG
```

command実行時のエラー出力は出力されず、
なおかつexec()の実行エラーはきちんと拾えたようです。

しかしなぜ2>&1だとexec()の実行エラーは拾えないのに、2>/dev/nullだと拾えるのか。。。
ちょっともやもやします。
LaTeXで箇条書きの記号を変える


LaTeXで箇条書きの記号を変えるには、\labelitemi, \labelitemii, \labelitemiii, \labelitemivを再定義します。

```itemize.tex
\documentclass[a5paper]{jsarticle}
\usepackage{lmodern}
\usepackage[T1]{fontenc}
\usepackage{textcomp}
\usepackage[utf8]{inputenc}
\usepackage{amsmath,amssymb}
\usepackage{inconsolata}
\usepackage{okumacro}
\begin{document}

\section*{デフォルト}

\begin{itemize}
\item あいうえお
\begin{itemize}
\item カキクケコ
\begin{itemize}
\item さしすせそ
\end{itemize}
\end{itemize}
\item あいうえお
\item あいうえお
\end{itemize}

\section*{記号を変える}

\renewcommand{\labelitemi}{$\star$}
\renewcommand{\labelitemii}{$\circ$}
\renewcommand{\labelitemiii}{$\triangleright$}
\renewcommand{\labelitemiv}{$\diamond$}

\begin{itemize}
\item あいうえお
\begin{itemize}
\item カキクケコ
\begin{itemize}
\item さしすせそ
\end{itemize}
\end{itemize}
\item あいうえお
\item あいうえお
\end{itemize}

\end{document}
```

```
$ platex itemize
$ dvipdfmx -p a5 itemize
```

結果は以下です。

![kobito.1384165306.201778.png](https://qiita-image-store.s3.amazonaws.com/0/12361/fdb956c3-bbbb-f5b3-6be2-7b6677518472.png "kobito.1384165306.201778.png")

![itemize.png](https://qiita-image-store.s3.amazonaws.com/0/12361/dce6cd31-63ac-420f-7cf9-f6c3019eaa94.png "itemize.png")