OmniAICreator/Qiita-1.07M huggingface dataset:
pythonのインスタンス生成処理はどこに書かれているのか？


pythonでインスタンスを初期化するときは、`__init__()`という特殊メソッドに記述することが多いですが、ここでインスタンスを生成しているわけではありません。その事実を確かめつつ、インスタンスを生成する処理はどこに書かれているのかを調べていきましょう。

**実行環境**

名前      | バージョン
------- | -----
python  | 3.4.3
ipython | 3.1.0

### __init__の前に__new__が実行される

```python
class Foo():
    def __init__(self):
        print('init')
        print('self = %s' % self)

Foo()
# => 
# init
# self = <__main__.Foo object at 0x10dacb9b0> 
```

Class()と書くとそのクラスの特殊メソッド`__init__`が呼ばれます。これはインスタンスメソッドです。理由は引数にself、つまりインスタンスを取るからです。selfという変数名が文法上で決まっているわけではないので他の名前でもいいですが、慣習的にselfと使われる場合が多いみたいです。

では、このインスタンスはどこで生成されているのか。まずは__init__()の前に実行される__new__について抑えましょう。

[公式ドキュメント](http://docs.python.jp/3.4/reference/datamodel.html?highlight=%E7%89%B9%E6%AE%8A%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89#specialnames)に、`__new__()`は新しいインスタンスを作るために呼び出されると書いてあります。そして、この`__new__()`は明記しなくてもクラス作成時に自動的に定義されます。

```python
class Foo():
    def __init__(self):
        pass

foo = Foo()
`__new__' in dir(foo)
# =>  True
```

この`__new__()`が`__init__()`より先に実行されることは公式ドキュメントでも確認できます。

> __new__() が cls のインスタンスを返した場合、 __init__(self[, ...]) のようにしてインスタンスの __init__() が呼び出されます。このとき、 self は新たに生成されたインスタンスで、残りの引数は __new__() に渡された引数と同じになります。  
> <cite><a href="http://docs.python.jp/3/reference/datamodel.html?highlight=__new__#object.__new__" target="_blank">3. データモデル — Python 3.4.3 ドキュメント</a></cite>

このことは、下記のソースコードで確認することができます。

```python
class Foo():
    def __new__(cls, var1):
        print('new')
        print('var1 = %s' % var1)
        return super().__new__(cls)

    def __init__(self, var1):
        print('init')
        print('self = %s' % self)
        print('var1 = %s' % var1)

Foo('my_value')
# => 
# new
# var1 = my_value
# init
# self = <test.Foo object at 0x103bd0208> 
# var1 = my_value ※ここまでがprint()での出力です。
#<test.Foo at 0x103bd0208> 
```

super()は親クラスを呼び出すものです。今回はインスタンスの生成は親クラスに任せています。`__new__()` をオーバーライドするので、自分で明示的にインスタンスを生成する処理を書くために`super().__new__(cls)`を使いました。

### 継承したメソッドはどこにあるのか？

`__new__()`をオーバーライドしない場合でも、親クラスの`__new__()`にインスタンスの生成を任せているなら、全ての親クラスであるobjectの`__new__()`に本当のインスタンス生成処理が書かれていることになります。もしくは、各クラスの`__new__()`にインスタンス生成処理は書かれているかもしれません。

まだ、どこにインスタンス生成処理が書かれているかはわかりませんでした。ですが、**Class( )で`__new__`を呼び出し**ていることはわかりました。

この`__new__()`の処理が書かれていることを確認するには、メソッド名に丸括弧()をつけずに実行すればわかります。

```python
class Super():
    @classmethod
    def hello(cls):
        print('super hello')

    @classmethod
    def say(cls):
        print('super say')

class Sub(Super):
    @classmethod
    def hello(cls):
        print('super hello')

# 自分で定義したメソッドと定義場所のクラスを確認
Super.hello
# => <bound method type.hello of <class 'test.Super'> > 
Sub.hello
# => <bound method type.hello of <class 'test.Sub'> > 

# オーバーライドしていない場合
Sub.say
# => <bound method type.say of <class 'test.Sub'> > 

Super.__new__
# => <function object.__new__> 
Super.__init__
# => <slot wrapper '__init__' of 'object' objects> 
Super.__le__
# => <slot wrapper '__le__' of 'object' objects> 
```

`__new__`だけでなく、他の特殊メソッド自体はobjectで定義されています。全てのオブジェクトはオーバーライドしない限り、objectにインスタンス生成を任せていることがわかりました。
pythonは特殊メソッドを継承するのか


**実行環境**

インタプリタ上で出力を確認しているため、print()は省いています。

名前      | バージョン
------- | -----
python  | 3.4.3
ipython | 3.1.0

### 何を継承するのかを確認

特殊メソッドである`__init__()`で確かめたところ、定義していないSubクラスでSuperクラスの`__init__()`が実行されていることを確認しました。念のため特殊メソッド以外でも継承を確認しています。

```python
class Super():
    super_class_var = 'super_class_value'

    def __init__(self):
        self.super_instance_var = 'super_instance_value'

    @classmethod
    def __super_class_method__(cls):
        print('__super_class_method__')

    def __super_instance_method__(self):
        print('__super_instance_method__')

class Sub(Super):
    pass

\# クラスフィールドの確認   
Sub.super_class_var
\# => 'super_class_value'

Sub.__super_class_method__
\# => <bound method type.__super_class_method__ of <class 'special_method.Sub'> > 
Sub.__super_class_method__()
\# => __super_class_method__

\# インスタンスフィールドの確認
sub = Sub()
sub.super_instance_var
\# => 'super_instance_value'

sub.__super_instance_method__
\# => <bound method Sub.__super_instance_method__ of <special_method.Sub object at 0x10dcf0da0> > 
sub.__super_instance_method__()
\# => __super_instance_method__
```

### 動的に親クラスの属性を変更した場合は、子クラスにも反映されるのか？

答えはYESです！

```python
\# クラスで確認
Super.new_var = 'new_var'
Sub.new_var
\# =>  'new_var'
'new_var' in dir(Sub)
\# => True

\# インスタンスで確認
sub = Sub()
sub.new_var
\# => 'new_var'
'new_var' in dir(sub)
\# => True
```

インタプリタ上で親クラスの属性を後から変更しても、子クラスでは認識されています。

### 継承した属性名はエイリアスである

子クラスは継承したメソッドを親クラスのものとは別に持っているのでしょうか？それを確認してみます。ソースコードは前回からの続きです。

```python
id(Super.__super_class_method__)
\# => 4381481672
id(Sub.__super_class_method__)
\# => 4381481672
id(sub.__super_class_method__)
\# => 4381481672

id(Super.__super_class_method__) ==\
id(Sub.__super_class_method__)   ==\
id(sub.__super_class_method__)
\# =>  True
```

全ての属性名が指しているメソッドのid（識別子）は同じでした。`__super_class_method__`というクラスメソッドのオブジェクトは1つしかないことがわかります。ここで注意したいのが、`__super_class_method__`という属性名が同じというわけではなくて、この属性名、つまりラベルが指しているオブジェクトのidが同じということです。このことをソースコードで確認してみます。

```python
foo = '1'
id(foo)
\# => 4361922800

bar = foo
id(bar)
\# => 4361922800

id(foo) == id(bar)
\# => True
```

### 継承した属性名の名前解決はどうなっているのか？

今回の実験で、親クラスの特殊メソッドも継承することを確認しました。自分で定義した`__method_name__`も継承しました。これも特殊メソッド名もただのラベルなので、属性名でみたら同じです。ただし、自分で定義したのは特殊メソッドとは言いません。特殊メソッドとは`method( )`と直接記述しなくても間接的に呼ばれるメソッドです。+,-,<=などの演算子を実行すると、それに対応した特殊メソッドが実行されます。このため特殊メソッドを書き換えることで演算子の動きを変えることもできます。詳しくは下記の公式ドキュメントでご確認ください。

[3. データモデル — Python 3.4.3 ドキュメント](http://docs.python.jp/3/reference/datamodel.html?highlight=%E7%89%B9%E6%AE%8A%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89#specialnames)

この実験で **「pythonは特殊メソッドを継承するのか」**という疑問は解決しました。しかし、また新たな疑問が出てきました。

* 子クラスにも継承した属性名を保持しているのか。

保持している場合だと、

* 属性名が親クラスの属性を直接挿しているのか
* ~~属性（メソッド）の場合は、`super().method_name()`のような無名関数を子クラスは保持しているのか~~  追記：親クラスのメソッドを保持していることを[こちらの実験](http://program-blog.net/python/275/#i)で確認しました。

保持しない場合だと、

* 子クラスで指定された属性名が存在しない場合は、親クラスまで探しにいくという名前解決を行っているのか。

分かる人がいたら教えてくださると助かります。
【Python】式(1,2)は丸括弧がタプルを作っているわけではない


タプルの型を調べようとしたら`TypeError: 'type' object is not subscriptable`というエラーが出ました。結論としてはタプルじゃないものに添字演算子を使っていことが原因でした。  
例：`my_tuple[0]`

※今回載せているソースはインタプリタ（ipython 3.1.0）上で実行したものです。そのためprint関数を使わなくても評価値が出力されます。

### エラーを確認

原因は一言で言い表せますが、ここからタプルというものを調べていくと興味深いことがわかりました。まずは今回起きたエラーを見てみましょう。

```python
foo = (object)
type(foo)
# => type

type(foo[0])
# => TypeError: 'type' object is not subscriptable

# 要素を2つにする
foo = (object, str)
foo[0]
# => object

type(foo)
# => tuple
```

数値でも試してみましたが、同じ結果が得られます。これはpythonがすべてはオブジェクトであるということから起きていると思います。

```python
bar = (0)
type(bar)
# => int

bar[0]
# => TypeError: 'int' object is not subscriptable

# 要素を2つにする
bar = (1,2)
bar[0]
# => 1

type(bar)
# =>tuple
```

タプルにはどの型も入れれることを念のため確認。

```python
foo = (object, 1)
type(foo)
# => tuple
```

### 要素が1つのタプルはどう定義する？

要素が1つのタプルはどう定義するのか？答えは公式ドキュメントにありました。

> 単要素のタプルにはカンマを使う: a, or (a,)  
> <cite><a href="http://docs.python.jp/3/library/stdtypes.html" target="_blank">4. 組み込み型 — Python 3.4.3 ドキュメント</a></cite>

さっそく試してみました。

```python
foo = (object,)
type(foo)
# => tuple

foo[0]
# => object
```

### タプルを作っているのはカンマである

カンマを付けるとタプルと認識されるのですね。**「なるほど！丸括弧( )とカンマ,の組み合わせでタプルは作られるのか！」と思ったら間違いです。**ここがひっかかりやすいです。ですが、公式ドキュメントにご丁寧な説明がありました。

> タプルは丸括弧で作成されるのではなく、カンマによって作成されることに注意してください。例外は空のタプルで、この場合には丸括弧が 必要です — 丸括弧のつかない “何も記述しない式 (nothing)” を使えるようにしてしまうと、文法があいまいなものになってしまい、よくあるタイプミスが検出されなくなってしまいます。  
> <cite><a href="http://docs.python.jp/3/reference/expressions.html" target="_blank">6. 式 (expression) — Python 3.4.3 ドキュメント</a></cite>

**「カンマによって作成される」**。これについて確かめていきましょう。  
※ もちろん空のタプルの時は、カンマではなく丸括弧で作られます。

```python
()
# => ()
type(())
# => tuple

1,2
# => (1, 2)
type(1,2)
# => TypeError: type() takes 1 or 3 arguments
type((1,2))
# => tuple

foo = 1,
foo
# => (1,)
type(foo)
# => tuple
```

なんと空のタプル以外では丸括弧は必要ありませんでした。ただし、関数の引数に渡す際にその場でタプルを生成しようとするときは丸括弧をつけないと複数の引数だと認識されてしまいます。上記の引数での丸括弧は、先にタプルを生成してから引数として渡すという、優先順位の高くするための演算子として使われています。

また、丸括弧なしで空のタプルが定義できてしまったら、空白（半角スペースではない）が作れないですね。空行とか末尾、そこらじゅうで空のタプルが量産されるかもしれません。

### 丸括弧の意味とは？

カンマがなかった時は何が返っていていたのでしょう？確認しみてましょう。

```python
foo = (object)
foo
# => object

bar = (1)
bar
# => 1

(object)
# => object

(1)
# => 1
```

引数がそのまま返ってきていました。これについても公式ドキュメントに書いてありました。

> 丸括弧で囲われた式のリストは、個々の式が表現するものになります: リスト内に少なくとも一つのカンマが入っていた場合、タプルになります; そうでない場合、式のリストを構成している**単一の式自体の値**になります。  
> <cite><a href="http://docs.python.jp/3/reference/expressions.html" target="_blank">6. 式 (expression) — Python 3.4.3 ドキュメント</a></cite>

そういえば算術演算を行う際に、+や-の優先順位を上げるために丸括弧を使いますが、あれも丸括弧内の式の評価値を返しているのですよね。

```python
1 + 3 * 2
# => 7

(1 + 3) * 2
# => 8
```

### pythonの関数呼び出しに使う丸括弧は演算子ではないのか？

[公式ドキュメントの字句解析のデリミタの一覧](http://docs.python.jp/3/reference/lexical_analysis.html)に丸括弧が載っていて、演算子は載っていませでした。pythonでは関数を呼び出す丸括弧は「関数呼び出し演算子」ではないのでしょうか？

[wikipediaのC言語](https://ja.wikipedia.org/wiki/C%E3%81%A8C%2B%2B%E3%81%AE%E6%BC%94%E7%AE%97%E5%AD%90)を見てみると、やはり丸括弧( )は「関数呼出し」という演算子となっています。誰か分かる人がいたら教えてください。
軽量Webブラウザ (dillo, epiphany, chromium + メモリ解放addin)

# Dillo3

## 参考

* [爆速ブラウザ Dillo 3 の日本語化 - Google グループ](https://groups.google.com/forum/#!topic/fj.net.www.browsers/KfocpiWAc34)

## 設定

* [サンプル](https://github.com/tukiyo/docker-xrdp/tree/master/files/dillo)

```bash:~/.dillo/dillorc
## see: http://www.dillo.org/dillorc

## 検索エンジン。設定しないと文字化ける   
search_url="Google http://www.google.com/search?ie=UTF-8&oe=UTF-8&gbv=1&q=%s"
filter_auto_requests=allow_all

## メニューバーのサイズ
panel_size=tiny

## フォント設定
font_serif="VL Gothic"
font_sans_serif="VL Gothic"
font_cursive="VL Gothic"
font_fantasy="VL Gothic"
font_monospace="VL Gothic"
 
## proxy                             
# http_proxy="http://127.0.0.1:8080/"
```

### Ricty for Powerlineに変更したい場合

```bash:~/.dillo/dillorc
# see: http://www.dillo.org/dillorc

# 検索エンジン。設定しないと文字化ける
search_url="Google http://www.google.co.jp/search?ie=UTF-8&oe=UTF-8&q=%s"

# メニューバーのサイズ
panel_size=tiny

# フォント設定
font_serif="Ricty for Powerline"
font_sans_serif="Ricty for Powerline"
font_cursive="Ricty for Powerline"
font_fantasy="Ricty for Powerline"
font_monospace="Ricty for Powerline"
```

----

# epiphany-browser (GNOME Web)

GNOMEのデフォルトWebブラウザとなったepiphany-browser使ってみた。

## 参考

* [GNOME Web - ArchWiki](https://wiki.archlinuxjp.org/index.php/GNOME_Web#Flash)
* [最新テクノロジーが導入されたRaspberry Pi用の新ブラウザ「Epiphany」](http://www.softantenna.com/wp/unix/epiphany/)
* [Web (ウェブブラウザ) - Wikipedia](https://ja.wikipedia.org/wiki/Web_%28%E3%82%A6%E3%82%A7%E3%83%96%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%29)

> 2011年9月28日 - Epiphany 3.2 リリース
> 2012年3月28日 - Web 3.4 リリース。このバージョン系統からWebに名称変更。

## インストール

```bash:
sudo apt-get install -y epiphany-browser
```

メモリ512Mの環境(380MBほどの空き)の場合、3つタブ開くのが限界。

## 設定

* 広告を許可しない設定可。
* カスタムCSS

----

# chromium

* [Chromeのメモリを解放する拡張機能はこの2つでOK！ | ブログのちから](http://www.empowerments.jp/chrome-extensions-to-release-memory/)
* [Tab Memory Purge](https://chrome.google.com/webstore/detail/tab-memory-purge/aclmceilickagfkaddbiedcnccdkfafa?utm_source=chrome-app-launcher)
* [One Tab](https://chrome.google.com/webstore/detail/onetab/chphlpgkkbolifaimnlloiipkdnihall?utm_source=chrome-app-launcher)

これでいいんじゃないかと思ってきた

```bash:
sudo apt-get install -y chromium-l10n
chromium
```
「機能する翻訳」を目指そう


[技術英語や翻訳 Advent Calendar 2015](http://qiita.com/advent-calendar/2015/english_translation)に参加してみました。Advent Calendarっておいしいの？

# 機能する翻訳へ

技術翻訳であって文芸翻訳であっても、翻訳について議論するとき「合ってる」「間違ってる」といった誤訳のあげつらい合戦に終始してばかりで、なかなかそこから先に進む人がいないのはかえすがえすも残念。

翻訳は合ってないよりは合っている方がよいに決まっている。用語のばらつきもない方がよいに決まっている。

しかし量が多ければどうしても何らかの間違いは混入するものであり、それを減らすことはできてもゼロにはできない。「3行以上のコードには必ずバグがある」のと同じ。

`お前は今まで自分が書いてきた文章を全部覚えているのか？`

なお幕末に翻訳された[解体新書](https://goo.gl/LZqj6h)はちょっとやそっとでは済まないほど誤訳だらけだったいう。翻訳とは違うけど、漢文で書かれた日本最初の正式な歴史書である「日本書紀」も、[ネイティブ中国人（おそらく留学生）の書いたちゃんとした漢文と、日本人が必死で書いた残念な漢文が入り混じっている](http://goo.gl/CbFuZi)のだそうだ。

自分が問題にしたいのはそこから先である「その訳文って機能するの？」という点。

## 自分の考える「機能する翻訳」とは

- その文を読んだ人が適切に行動できる。
- その文を読んだ人をとりこにする。
- その文を読んだ人の行動を変える。
- その文を読むときに邪魔な引っかかりがない。

要するに、読む人の行動に何ら影響しない、適切な行動を促せない文は、機能していないということ。

このように考えることで、ユーザーインターフェースの翻訳も、ヘルプドキュメントの翻訳も、マーケティング翻訳も、（極端に言えば文芸・詩の翻訳であっても）同じ観点で評価することができる。

そして訳文を自分で見なおして修正するときも、常にこの観点で評価することで評価軸がぶれないようにできる。

ついでに言えば、世の翻訳者の8割は文芸趣味に毒されすぎていて、こうした観点をほぼまったく持ち合わせていない。

ということを自分に言い聞かせているのでしたとさ。どっとはらい。

## 例: Ask forgiveness than permission

3M社の社是であるらしい上の言い回しがあちこちで「[許可より謝罪](https://goo.gl/Ft6mhW)」として流通し始めているけれど、「謝罪」という響きはあまりに重すぎるし、これを読んだ人がむしろ縮こまってしまう可能性の方が高い。「許可より謝罪」は、~~間違っていないということ以外に価値がなく~~英語で何と書いてあるのかを解読したに過ぎず、何よりイケてない。

これなら「**やりたいことがあったら勝手に始めてしまえ。後でゴメンで済ませろ。**」とする方がずっと気楽だし、「上の許可を取り付けるなんざ、時間の無駄無駄」という本来の意図が伝わると思う。もっと短くして「**ゴメンで済ませろ**」ならなおよい。

そんなカジュアルな表現では会社でおおっぴらに使えないとお悩みの方には「プロジェクト立ち上げの事後承諾を認める」とでもすればよい。

参考: http://d.hatena.ne.jp/hyoshiok/20110205/p1
DebianでMySQL使うときに日本語入力したい

Debian8.2(Jessie)でMySQL使おうと思いました.
個人的に今回は, pythonでwebから情報をスクレイピングして, テーブル名も日本語, データも日本語でインサートしていたんで, それを確認したかったんですね.


```
mysql -u root -p
```
でmysqlを実行, いざインサートしたデータを確認...とおもいきや,
日本語が入力できない.
Enter押した瞬間画面から入力した日本語が消えるんですけど...

<h2>MySQLの文字コード設定の可能性</h2>
まずMySQLの文字コード設定がUTF-8になってないんじゃないかと疑いました.
```
SHOW VARIABLES LIKE 'char%';
```

<img width="424" alt="スクリーンショット 2015-12-15 6.46.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/97883/319e2b01-50ba-8e78-f11e-cb5dec4c0a5d.png">

これダメだと日本語が文字化けするっぽいんだけど, 今回の問題点はどうもここではない...
※ちなみにこれだった方は, 参考の「MySQLの文字化けを解消する」っていうのが非常に参考になると思うので, そちらをぜひ.
<br>
[MySQLの文字化けを解消する](http://linuxserver.jp/%E3%82%B5%E3%83%BC%E3%83%90%E6%A7%8B%E7%AF%89/db/mysql/%E6%96%87%E5%AD%97%E5%8C%96%E3%81%91%E8%A7%A3%E6%B6%88)

<h2>.inputrc</h2>
これ見落としてました. 一回mysqlを終了して,
ホームディレクトリで.inputrcを確認してみてください.
無かったら作ってください.

```:.inputrc
set convert-meta off
set meta-flag on
set output-meta on

```
これはMySQL徹底入門とかに書いてあった気がする.
今回はこれで解決しました.







参考: [MySQLの文字化けを解消する](http://linuxserver.jp/%E3%82%B5%E3%83%BC%E3%83%90%E6%A7%8B%E7%AF%89/db/mysql/%E6%96%87%E5%AD%97%E5%8C%96%E3%81%91%E8%A7%A3%E6%B6%88)
技術英語 > You might think that [a gull is a gull is a gull]. > often interpreted as meaning "things are what they are"

LOE > August 3, 2012

http://loe.org/shows/shows.html?programID=12-P13-00031
> You might think that a gull is a gull is a gull.

「A lie is a lie is a lie」と同じ形のこのようなフレーズを聞くのは17年英語に関わってようやく２回めだ。これまできちんと意識してなかっただけなのかもしれないが、このフレーズの使用頻度や使用可能場面は不明。

関連 http://qiita.com/7of9/items/79b287a462cb79cfcbbf

ネイティブのうちの一部しか通じないのかもしれない。

<hr>
gullはあまり良い意味ではなさそう。

http://eow.alc.co.jp/search?q=gull
> 2. だまされやすい人

<hr>
元々は  Gertrude Stein という人（僕は知らない）の言葉らしい。Steinbeckの怒りの葡萄からではなかった。

https://en.wikipedia.org/wiki/Rose_is_a_rose_is_a_rose_is_a_rose
> often interpreted as meaning "things are what they are"

「A is A is A」で検索したら上記が見つかった。
さださがし

さだまさしアドベントカレンダー15日目です。まさかここまで続いているとは思いませんでした。しかも記事のレベルが高すぎてどうかと思います。記事を眺めていると言語処理系や統計系の話題がおおいようなので、今日はちょっと違った方面から。

私、本職は「認知心理学」という分野の研究者をやっております。認知心理学という学問では、人間を~~廃人~~機械と見立てて、入出力関係、つまり感覚器（視覚とかですね）と知覚や行為（〜を見るとか、手を動かすとかですね）の関係をモデル化します。知覚を入力と捉えるか出力と捉えるか、という問題は置いといてください。

このモデル化にはいろんなやり方があるんですが、実証的なデータを集めるためには「実験」を行います。認知心理学の実験では、人間を~~廃人~~機械と見立てて、ひたすら延々と同じ課題（斜め線が出現したかしなかったか、とか、〇〇はあったか、とか）を繰り返します。ひどいやつだと一万回以上繰り返します。

そうして集められたデータには、やった人の個性とか頑張りとかが反映されているわけですが、そういうものは「ノイズ」として切り捨てられます。最後には平均値（最近では区間とか分布もちゃんとしようとしてる）がモノを言う、そういう辛辣な世界です。

そこで、本日はさだまさしファンのみなさまに、少しでも認知心理学という分野を知ってもらうべく、ひとつ実験を用意しました。

「さださがし」 http://kohske.github.io/sandbox/sadasagashi/

ありがちです・・・。「難しくないバージョン」から始めることをお勧めします。

これは[視覚探索](https://ja.wikipedia.org/wiki/%E8%A6%96%E8%A6%9A%E6%8E%A2%E7%B4%A2)課題と言われるものの一種（というか亜種）です。「何かを探す」ということは、人間の極めて基本的な行為の一つです。視覚探索には山ほどモデルがあるわけですが、その詳細は置いといて、視覚探索では「ポップアウト」と呼ばれる現象があります。普通は邪魔する刺激（妨害刺激）が多いと、探すのに時間がかかるようになります。当たり前ですね。ですが、探そうとしなくても勝手に目立つような状況があります。それがポップアウトです。ポップアウトする刺激は、妨害刺激がいくつあろうが関係なく、一瞬で発見できます。目が勝手にそこに向かうわけです。

さて、問題はどういう刺激がポップアウトするかということです。もっともよく知られているの は、「特徴探索」と「結合探索」の違いです。邪魔するものと探すものが、一つの特徴（色、大きさ、形とか）によって区切られる場合、対象はポップアウトします。`ooooooxooooo`という状況ですね。`x`はポップアウトします。ですが、邪魔するものと探すものが、複数の特徴の組み合わせによって区切られる場合、探索は劇的に難しくなります。`oxoXoOoxxOxO`と言う状況で、大きい`X`を探すような場合です。この場合、大きさと形状の結合探索になっています。

さてさて、「さださがし」は果たして、特徴探索なのか、結合探索なのか。それは、あなたの頭の中で「さだまさし」がどう表現されているかに依存します。もしあなたが「さだまさし」と「非さだまさし」を境界とする世界にいきているなら、「さだまさし」はひとつのプリミティブな特徴であり、きっとポップアウトするでしょう。だから、「さださがし」難しいバージョンでも「さだまさし」はポップアウトして、探すのに時間はかからない。たぶんかからないと思う。かからないんじゃないかな。ま、ちょっと覚悟はしておけ・・・。一方、「さだまさし」がプリミティブな特徴ではなく、「人間」「歌手」「おっさん」等々の属性の結合としてあなたの頭の中で表現されているなら、ポップアウトしません。「さださがし」によって、あなたの頭の中のさだまさし表現形式をデコーディングできるということです[^1]。

[^1]: この段落の内容は、はっきり言えば「嘘」なので真に受けないでください。

こんな簡単な実験でも、入出力関係のモデル化によって頭の中の情報処理過程をある程度推定することができます。このような知見は、最新のDNNなどに活かされているようです。NIPS2015ではCNNに「注意」を実装する試みが発表されていたようですが[^2]、間違いなく「注意」はこのような実験の結果モデル化された概念と言えます。LTSMなどで動画を扱うようになれば、visionとauditionのモダリティ統合とかが必要になるわけですが、その手の概念も２〜３年したら出てくるでしょう（もしかしたらもうあるかもしれませんが）。その時にも、やはり人間の感覚統合モデルが参考になるに違いありません。このように、DNNの発展は、認知心理学系の知見を直接的に応用する舞台になるはずです。今後、DNNの開発と社会応用の中で認知心理学とか認知神経科学という分野はますます重要になってくるはずだし、そうならないといけないし、そうなるように頑張らないといけない。頑張ります。だれかDNN方面の人で、人間に興味があって、こういう話（ダイレクト脳系よりも、もうちょっと行動レベル）を一緒にやりたい人がいたら連絡ください。

[^2]: http://codinginparadise.org/ebooks/html/blog/ten_deep_learning_trends_at_nips_2015.html

HTML/JSはここに置いてあります。
https://github.com/kohske/kohske.github.com/tree/master/sandbox/sadasagashi
canvasが出てきて、ブラウザJSが超速になって、個人的にはHTML/JSは十分に普通の認知実験に耐えうるスペックになってると思います。しかもオンラインでできるのがいいですね。

Enjoy!!
Windows+GoでNFC/Felicaにアクセスしてみた

# 概要
Goでfelicalib.dllを使ってIDM/PMMを取得するサンプル。
ソース自体はDLLの呼び出しをしてるだけなので、どちらかと言えば覚書。
(felicalib.dllに対するパスがハードコーディングされてるので修正してください。)

https://github.com/mau4x/nfc-sample

# 必要なもの
* Golang 32bit版
    * felicalib.dllが64bit対応してないので32bit版で。次のバージョンで対応するとの書き込みからはや五年…
* PaSoRi
    * RC-S380でテスト
* NFC/Felicaポートソフトウェア(v5.4.3.4を利用)
    * http://www.sony.co.jp/Products/felica/consumer/download/felicaportsoftware.html?j-short=fsc_dl
* Felicalib.dll(v0.4.2を利用)
    * http://felicalib.tmurakam.org/

# サンプルコード

```go:nfc-sample.go
package main

import (
	"log"
	"syscall"
	"unsafe"
)

func main() {
	// ここにfelicalib.dllのパスを入力。
	var tPath = "D:/tools/felicalib-0.4.2/felicalib.dll"

	dll, err := syscall.LoadDLL(tPath)
	if err != nil {
		log.Fatal(err)
	}
	defer dll.Release()

	// define procedures
	pasori_open, err := dll.FindProc("pasori_open")
	if err != nil {
		log.Fatal(err)
	}
	pasori_close, err := dll.FindProc("pasori_close")
	if err != nil {
		log.Fatal(err)
	}
	pasori_init, err := dll.FindProc("pasori_init")
	if err != nil {
		log.Fatal(err)
	}
	felica_polling, err := dll.FindProc("felica_polling")
	if err != nil {
		log.Fatal(err)
	}
	felica_free, err := dll.FindProc("felica_free")
	if err != nil {
		log.Fatal(err)
	}
	felica_getidm, err := dll.FindProc("felica_getidm")
	if err != nil {
		log.Fatal(err)
	}
	felica_getpmm, err := dll.FindProc("felica_getpmm")
	if err != nil {
		log.Fatal(err)
	}
//	felica_read_without_encryption02, err := dll.FindProc("felica_read_without_encryption02")
//	if err != nil {
//		log.Fatal(err)
//	}

	// errorチェックは、第一返り値の結果を判定
	// 第三返り値(lastErr)はいつもsuccess
	// lastErr != nilでチェックすると、successのときも値が入っている。
	tPasori, _, _ := pasori_open.Call(0)
	println("open", tPasori)
	if(tPasori == uintptr(0)) {
		log.Fatal("多分、端末が接続されてない")
	}
	defer pasori_close.Call(tPasori)

	ret, _, _ := pasori_init.Call(tPasori)
	println("init", ret)
	if(ret != 0) {
		log.Fatal("エラー出ることあるの？")
	}

	// tFelicaは、C側で内部的にメモリ確保されてる。
	// 従って多分開放しないと駄目
	tFelica, _, _ := felica_polling.Call(tPasori, 0xFFFF, 0, 0)
	println("poll", tFelica)
	if(tFelica == uintptr(0)) {
		log.Fatal("NFCカードの読み込み失敗。")
	}
	defer felica_free.Call(tFelica)

	// tFelicaで確保されえいる領域の一部を取得する。
	// 従って、失敗することはまずない。
	tIdm := uint64(1) // make([]byte, 8) ほんとはbyte[8]で取りたいんだけど、ちょいやり方不明orz
	felica_getidm.Call(tFelica, uintptr(unsafe.Pointer(&tIdm)))
	println("gIdm", tIdm)

	tPmm := uint64(1)
	felica_getpmm.Call(tFelica, uintptr(unsafe.Pointer(&tPmm)))
	println("gPmm", tPmm)
}
```
FMC2Goスケジューラーにおけるユーザーに選択させるだけのレイアウト


[FileMaker Advent Calendar 2015](http://www.adventar.org/calendars/865)の15日目

# FMC2Goスケジューラーにおけるユーザーに選択させるだけのレイアウト
前回までの「[FMC2Goスケジューラーにおけるレスポンシブ・デザイン](http://qiita.com/or2/items/bf7dbf81716cfebc4560)」でグローバル変数を使って最適なレイアウトに切り替えているのはわかった

しかしユーザーがレイアウト選択する時のレイアウト名には

- iPhone
- iPad

は出ていない

![151215-01.png](https://qiita-image-store.s3.amazonaws.com/0/89027/2ea2735a-485f-9702-a0f8-713e47bf11c2.png)

もちろんこれらのレイアウトを選択すると正しいレイアウトに遷移する
今回はこのあたりを補足で見てみようと思う(1ネタゲッツ(笑

## レイアウトモードで見てみる
さっそくレイアウトモードに切り替えてみる
![151215-02.png](https://qiita-image-store.s3.amazonaws.com/0/89027/eccf3660-4efc-7465-fc2e-1d6fca17bfdd.png)

あれれ？ なにも無い！
でもなんか気になる
![151215-03.png](https://qiita-image-store.s3.amazonaws.com/0/89027/df49c5c6-3b54-53ca-ca76-3e7cd47eb3f9.png)

### レイアウト設定を見てみる
![151215-04.png](https://qiita-image-store.s3.amazonaws.com/0/89027/addcbf46-bac8-62da-2190-e330f8515570.png)

スクリプトトリガが設定されてます

### 「Navigation Redirect [OnLayoutEnter]」スクリプトを見てみる
![151215-05.png](https://qiita-image-store.s3.amazonaws.com/0/89027/6374ee6a-551e-c341-535c-a8a742bfa496.png)

ここでもグローバル変数「$$device」を見ているようですね
そしてここでは直接レイアウト名を指定しているようです

```
Case ( 
Get ( レイアウト名 ) = "Schedule List" ; "Schedule List iPhone" ;
Get ( レイアウト名 ) = "Schedule Detail" ; "Schedule Detail iPhone" ;

Get ( レイアウト名 ) = "Speaker List" ; "Speaker List iPhone" ;
Get ( レイアウト名 ) = "Speaker Detail" ; "Speaker Detail iPhone" ;

Get ( レイアウト名 ) = "Maps" ; "Maps iPhone" ;
Get ( レイアウト名 ) = "Information" ; "Information iPhone" ;

Get ( レイアウト名 ) = "Contacts" ; "Contact List iPhone" ;
Get ( レイアウト名 ) = "Eval" ; "Eval iPhone" ;

Get ( レイアウト名 ) = "Result List" ; "Result List iPhone" ;

"Error"
 )
```

飛ばした先でもスクリプトトリガが設定されてます
![151215-06.png](https://qiita-image-store.s3.amazonaws.com/0/89027/63b5fc61-4556-bd62-aaa6-5f81929f214e.png)

どこに居るか(居たか)をきっちり管理しているようです

見慣れないレイアウトパートがあるので補足

上部ナビゲーション
> 各画面の上に表示され、レイアウトのナビゲーションに使用するボタンまたはその他のコントロールを含むことができます。上部ナビゲーションパートはスクロールすることやズームイン/ズームアウトを行うことはできず、プレビューモードでは印刷および表示されません。上部ナビゲーションパートに追加したフィールドは、現在のレコードのデータを使用します。１つのレイアウトで使用できる上部ナビゲーションパートは１つだけです。

下部ナビゲーション
> 各画面の下に表示され、レイアウトのナビゲーションに使用するボタンまたはその他のコントロールを含むことができます。下部ナビゲーションパートはスクロールすることやズームイン/ズームアウトを行うことはできず、プレビューモードでは印刷および表示されません。下部ナビゲーションパートに追加したフィールドは、現在のレコードのデータを使用します。１つのレイアウトで使用できる下部ナビゲーションパートは１つだけです。

FileMaker14から導入された
- スクロールできない
- ズームイン/ズームアウトできない
- プレビューモードでは表示されない

レイアウトパートです
固定ヘッダとかフッタによい感じで使えそう

ちなみにFileMaker13で開いてみると
![151215-07.png](https://qiita-image-store.s3.amazonaws.com/0/89027/b0ae926e-b37d-bef8-27d2-889457620a79.png)
な感じ
ダメダメですね
virtualboxにあるcentos6にsquidをインストールしてみた


squidはプロキシサーバを立てるのに必要なものという認識しかありませんが、構築にチャレンジしてみます。下記のサイトを参考します。

[Squidによるプロキシサーバーの構築](http://linux.kororo.jp/cont/server/squid.php)

### CentOSのバージョンの確認

普段使わないので忘れがちファイルです。

```bash
# バージョンの確認
$ cat /etc/redhat-release
CentOS release 6.5 (Final)
```

### インストール

squidのパッケージを探し、yumでインストールします。インストール後にインストールできたかを確認します。

rpmのオプションqでパッケージ情報を表示します。

```bash
# squidのインストール
$ yum search squid
$ yum install squid.x86_64

$ rpm -q squid
squid-3.1.10-22.el6_5.x86_64
```

### インストール場所の確認

rpmのオプションlでパッケージ内のファイルの場所を全て表示します。

```
# 各ファイルの場所を確認
rpm -l squid

#####実行結果の抜粋#####
#コマンド
/usr/bin/squidclient
/usr/sbin/squid

\#設定ファイル
/etc/httpd/conf.d/squid.conf

\#ディレクトリ
/etc/squid/
/usr/lib64/squid/
/usr/share/doc/squid-3.1.10/
/usr/share/squid/errors/
/var/log/squid/
/var/spool/squid/
```

yumでインストールしたら`/usr/lib/`以下に入ると思っていましたが、`/usr/share/`にも入るのですね。

### 自動起動の確認

これも忘れがちなコマンドですので使ってみました。

```bash
# 各ファイルの場所を確認
$ chkconfig --level 35 squid on
$ chkconfig --list squid

squid          	0:off	1:off	2:off	3:on	4:off	5:on	6:off
```

ですが、サーバーとして利用しないのでoffに戻しました。起動が遅くなると嫌なので。

```bash
# 自動起動を解除する
$ chkconfig --level 35 squid off
$ chkconfig --list squid

squid          	0:off	1:off	2:off	3:off	4:off	5:off	6:off
```

ちなみにこの時点でsquidは起動はしていません。

```bash
$ service squid status

squid は停止しています
```

### ポート番号の慣例

> プロキシサーバーが使用するポートは通常、8080番や8008番などの数字に8がつく番号を使用するのが慣例となっています。
> <cite>via: <a href="”http://linux.kororo.jp/cont/server/squid.php”" target="”_blank”">Squidによるプロキシサーバーの構築</a></cite>

これは知らなかったです。webを扱うなら覚えておいて損は無いですね。8080を使うということは、apacheもプロキシサーバなのでしょうか。

とりあえず、squid.confに下記の一文を追加し、起動します。

```
# squid.conf
# プロキシサーバーへの接続を許可するネットワークの指定
acl localnet src 192.168.0.2/255.255.255.0
```

実際にデフォルトのポート番号が<span style="color: #000000;">3128番なのか確認してみます。</span>

```bash
# ポート番号を調べる
$ netstat -anp | grep 3128

#実行結果（ヘッダーは後付）
Proto RefCnt Flags       Type       State         I-Node PID/Program name    Path
tcp        0      0 :::3128                     :::*                        LISTEN      1412/(squid)
```

このままmacのプロキシを設定すると、googleの検索結果は表示されますが、そのリンク先は表示できません。

### プロキシサーバに接続できない

![squid_01_141015.jpg](https://qiita-image-store.s3.amazonaws.com/0/62881/dbe4a783-2daf-049a-367e-1974ade8f922.jpeg "squid_01_141015.jpg")


プロキシ自体に接続が出来ていないようです。sshでホストOS(mac)からゲストOS(centos）に繋げれるので、物理的には繋がっているはず！ **アクセスログは記録されていました**

squid.confを見てみると、定義したIPアドレスのグループからのアクセスを許可していませんでした。下記を追加します。

```
# squid.conf
http_access allow localnet
```

### 名前解決ができない！[![squid_02_141015](http://program-blog.net/wp-content/uploads/2014/10/squid_02_141015.jpg)](http://program-blog.net/wp-content/uploads/2014/10/squid_02_141015.jpg)

プロキシには繋がりましたが、今度は名前解決ができません！どうやらsquidはresolve.confに記載したDNSサーバではなく、独自の仕組みで名前解決を行っているらしいです。

そこで下記のファイルに設定追加。

```
# /etc/resolv.conf
order bind,hosts
```

詳しくは下記を見て下さい。

[order bind,hosts](http://blog.suz-lab.com/2008/08/etchostconf.html)

これでようやくページが表示されました。アクセスログも記録されています。ちなみに上記の設定をしても最初は上手くいきませんでしたが、一度centosを終了して起動したら何故かうまくいきました。
AWS LambdaのCPU能力は割り当てメモリ量に正比例する

[今年もやるよ！AWS Lambda縛り Advent Calendar 2015](http://qiita.com/advent-calendar/2015/lambda) の15日目の記事です。

先日、[AWS S3+SQS+Lambda で格安でセキュアなジャッジシステムを作ろうとして一ヶ月溶かした](http://qiita.com/hama_du/items/4dee725b72285afdc156) という記事を投稿したのですが、そのときついでに調査したことを発表します。

## 概要

Lambda関数には割り当てメモリ量を設定する項目があります。ドキュメントを読むと、このメモリ量と実行CPUの能力は連動していて、多くのメモリを割り当てるとより性能の良いCPUで走るよ、と書かれています。

メモリ量とCPU性能がどの程度連動しているのか気になったので調べてみました。

## 実験

実験に使ったコードは次のとおりです。10秒間、数値の和を計算し続け、その和をそのままCPU性能の評価値とします。安直すぎてパフォーマンス試験として妥当かは疑問ですが、今回知りたいのは性能比なのである程度の判断は付くかと。

```js
exports.handler = function(event, context) {
    var sum = 0;
    var timeout = Date.now() + 10 * 1000;
    while (Date.now() < timeout) {
        sum++;
    }
    console.log('sum:' + sum);
    context.done(null, 'Process complete!');
};
```

この関数をメモリ量を変えながら10回走らせ平均を取りました。その結果が以下です。

|メモリ量|sum|
|:--|:--|
|128MB |1,712,545|
|256MB |3,000,236|
|512MB |5,677,037|
|1024MB|12,587,434|
|1536MB|19,456,206|


## 結論

ほぼ、**割り当てメモリ量に比例した性能になる**ようです。ここまできれいな結果になるとは思いませんでした。

Lambda関数でCPUリソースをゴリゴリ使いたいケースはあまり思い浮かびませんが、頭の片隅においておくと役立つかもしれません。

## ちなみに

知りたいことが FAQ にそのまま書いてありました。

> Q: コンピューティングリソースはどのように AWS Lambda に割り当てられるのですか?
>
> AWS Lambda のリソースモデルでは、お客様が関数に必要なメモリ量を指定するとそれに比例した CPU パワーとその他のリソースが割り当てられます。たとえば、256 MB のメモリを指定すると約 2 倍の CPU パワーが Lambda 関数に割り当てられます。128 MB のメモリを指定した場合と比較すると CPU パワーは倍となり、512 MB のメモリを指定した場合と比較すると半分になります。メモリは 128 MB から 1.5 GB まで、64 MB ごとに増加できます。
> 
> [よくある質問 - AWS Lambda | AWS<i class="fa fa-external-link"></i>](https://aws.amazon.com/jp/lambda/faqs/)

無意味な調査でしたね・・・（絶望）
Wordpressのカスタマイズはフックを使えば簡単にできる事に感動した！


そろそろ記事の投稿フォーマットを使い分けたいと思っております。アサイドかステータスを使って、Twitterでいうつぶやきを管理したいのです。何故なら記事や本を読んでいる時にその都度アウトプットを140文字程度で行ったりして、週1でざっと読み返したいからです。

それでWordpressのカスタマイズについて調べることにしました。一番はダッシュボードを改造したいです。一括でカテゴリや投稿フォーマットの変更を出来るようにすれば、適当に記事を追加して見返した時に整理するという使い方ができるので。

そうしたらなんと！フックというWordpressには色々処理のイベントが定義されているらしく、この処理の時にこの自作関数を実行して！とfunction.phpに書いておけば簡単にカスタマイズ出来ることを知りました。下記の記事の内容を一度試してみました！

[WordPressカスタマイズの幅が劇的に広がる、フィルターフックとアクションフックの使い方 | 株式会社LIG](http://liginc.co.jp/web/wp/customize/92030)

以下、下記に記載するコードは紹介記事の引用になります。

### まずはタイトルにIDをつけてみる

```php
// 記事タイトルの前にIDを表示させる
function my_the_title($title, $id) { 
    return 'ID='.$id.$title; 
}
add_filter('the_title', 'my_the_title', 10, 2);
```

たった4行でなんと…

![wordpress_01_141014.jpg](https://qiita-image-store.s3.amazonaws.com/0/62881/ef934787-16b2-c5c4-cc18-638c79abe834.jpeg "wordpress_01_141014.jpg")

![wordpress_02_141014.jpg](https://qiita-image-store.s3.amazonaws.com/0/62881/09da9d5d-b197-d0b4-37dc-38c944197e1d.jpeg "wordpress_02_141014.jpg")


### フックの取り消し

どうやら今回のタイトルを追加時のフックは、サイトを表示中の時だけではなくWordpress上でのすべての処理が対象みたいです。範囲を限定するには、remove_filterを使ってadd_filterを取り消すようです。

```php
// フックの取り消し
<?php add_filter('the_title', 'my_the_title', 10, 2); ?>
<h2><?php the_title(); ?></h2>
<?php remove_filter ('the_title', 'my_the_title'); ?>
```

それか自作関数の中で分岐させるらしいです。

### プレースホルダーの変更もできる

まずプレースホルダーはなんぞやっていう人は下記の画像を見て下さい。テキスト入力エリアのガイドテキスト。灰色の薄い文字のことです。

```php
// 新規投稿の際のタイトルプレースホルダを変更する
function my_enter_title_here($title){
    return 'タイトルを入力して欲しいな♪';
}
add_filter('enter_title_here', 'my_enter_title_here', 10, 1);
```

![wordpress_03_141014.jpg](https://qiita-image-store.s3.amazonaws.com/0/62881/cb7fa133-c551-bab0-1aa0-37f29901337a.jpeg "wordpress_03_141014.jpg")

![wordpress_04_141014.jpg](https://qiita-image-store.s3.amazonaws.com/0/62881/82b2ec92-d96f-fcdf-7898-1e8d7a2afb1e.jpeg "wordpress_04_141014.jpg")

こんな遊び心のあるカスタマイズも簡単にできてしまうのです。複数人で管理している時に使いたいですね。

### カテゴリ一覧だけ10件の記事を表示

下記のコードが一番私は実用的に感じました。

```php
// メインクエリを変更する（pre_get_posts）
function change_posts_per_page($query) {
    if ( is_admin() || ! $query->is_main_query() )
        return;

    if($query->is_category()){
        $query->set( 'posts_per_page', '10' );//件数変更
        $query->set( 'orderby', 'post_date' );//ソート指定
        $query->set( 'order', 'DESC' );//ソート順番
    }
}
add_action( 'pre_get_posts', 'change_posts_per_page' );
```
【Three.js】アニメーションの速度がどんどん加速してしまう


物体を回転させるアニメーションを作っていたのですが、何か挙動がおかしいことに気が付きました。時間が経つごとに回転の速度が加速していき、そのうち動きがカクカクになってしまいます。おそらく、回転速度が速くなりすぎてカクカクになっているかと思います。

[【修正前】アニメーションの速度がどんどん加速してしまう - YouTube](https://www.youtube.com/watch?v=21JSueL6EuA)

### ソースの確認

```js
// 問題のあるソースコード
var scene, camera, renderer, controls;
var sphere;
init();
animate();
function init() {
	// 物体をシーンに追加
	// 球とトーラスは親子関係にしてあります
}

function animate() {
	requestAnimationFrame(animate);
	render();
	update();
}

// 情報の更新
function update() {
	controls.update();
	shpereUpdate();
}

// レンダリング
function render() {
	renderer.render(scene, camera);
}

function shpereUpdate() {
	sphere.rotation.x += 0.01;
	setTimeout(shpereUpdate, 100);
}
```

原因はsetTimeoutにありました。 実はrequestAnimationFrameは無限ループが行われてました。これはsetIntervalをアニメーション向けにしたようなものです。

### requestAnimationFrameがあればsetTimeoutは必要ない

requestAnimationFrameは描画が必要ない時は処理を行わないなどの機能があります。例えば、ブラウザで別タブを閲覧中は、無限ループが停止しています。FPSに関しては60fpsを再現しているようです。つまり、requestAnimationFrameを使っていれば、わざわざsetTimeoutは使う必要はありませんでした。

1秒間に約60回もanimateが呼び出されるということは、shereUpdateもその分呼び出され、結果としてsetTimeoutの無限ループの数が増殖してしまいます。つまり、回転させるループ処理は1つではなく、毎秒、約60個も増えていたのです。

### ソースの修正

```js
// 修正後
function animate() {
	requestAnimationFrame(animate);
	render();
	update();
}

function shpereUpdate() {
	sphere.rotation.x += 0.01;
}
```

setTimeoutを削除しました。それ以外のことは何もしていません。また、他の関数は省略しています。

[【修正後】アニメーションの速度がどんどん加速してしまう - YouTube](https://www.youtube.com/watch?v=vslo1d-qHB0)
【Three.js】ブラウザサイズに合わせたアスペクト比を間違えて画面が歪む


立方体や球を作成した時に、すごい違和感を感じました。なんか長さがおかしく感じるのですよ。下記に画像を載せておきます。

![threejs_01_141012.jpg](https://qiita-image-store.s3.amazonaws.com/0/62881/6e33e1a5-c5c4-20d9-6769-db4a8e64f402.jpeg "threejs_01_141012.jpg")

![threejs_02_141012.jpg](https://qiita-image-store.s3.amazonaws.com/0/62881/2a3b1fae-2835-2f47-7215-609b56d77da2.jpeg "threejs_02_141012.jpg")


### アスペクト比を間違えると画面が歪む

原因は画面のサイズとアスペクト比が合っていないことでした。私は現在、ブラウザウィンドウ最大のサイズで描写しています。なのに、下記のようにアスペクト比を定義していました。

```js
var aspect = 600 / 600;
```

実際のウィンドウは600 * 600を使用しているわけではありません。最大サイズの場合は、下記がお勧めです。

```js
var aspect = window.innerWidth / window.innerHeight;
```

これならウィンドウのサイズを変更されても対応できます。それではもう一度レンダリングしてみましょう。

![threejs_03_141012.jpg](https://qiita-image-store.s3.amazonaws.com/0/62881/0af32a01-b50e-8dba-5030-42264ab9972c.jpeg "threejs_03_141012.jpg")

![threejs_04_141012.jpg](https://qiita-image-store.s3.amazonaws.com/0/62881/bc9cc74b-b399-611c-fdef-12a6894ed503.jpeg "threejs_04_141012.jpg")

明らかに前と見栄えが違いますよね？あー、スッキリした♪
JavaScriptとJavaでは整数の割り算結果が違う


JavaScriptとJavaで整数の割り算の結果が異なることを知りました。てっきりJavaScriptでも小数未満切り捨てが行われるかと思っていました。

### 実験用ソースコード

```java
// Javaで整数の割り算
public class Test {
	public static void main(String[] args) {
		System.out.println(54 / 10);
	}
}
// => 5
```

```js
// JavaScriptで整数の割り算
console.log(54 / 10);
// => 5.4
```


### JavaScriptには整数型がない

Javaではlongやbyteやintなど様々な数値の型がありますが、JavaScriptでは数値の型<span style="color: #404040;">はnumberのみ。これは小数も扱うそうです。そのため、Javaでは整数型同士の割り算の結果は整数型に格納されるため切り捨てが行われていましたが、JavaScriptでは整数型というのがないため今回のような現象が起きました。</span>

Javaと同じような割り算を行いたいのならMath.floorを使います。

```js
console.log(Math.floor(54 / 10));
// => 5
```

切り捨てには、ビット演算を使う方法もあります。（通りすがりさん、ありがとうございます。）

```js
54 / 10 | 0
```
【Three.js】ライトを作成なくてもメッシュモデル（物体）が表示されてしまう


Three.jsはライトを追加しないと画面が真っ暗になってしまうと解説を読んだのですが、何故かライト（光源）を1つもsceneに追加していないのにメッシュモデルが表示されてしまう現象が起きました。原因はマテリアルにありました。

### 光の影響を受けないマテリアル

私が使っていたマテリアルは`MeshBasicMaterial`でした。これは光源の影響を受けないそうで、そのため色の変化がありません。つまり、ライト（光源）を追加しなくても目視できるのです。

光の影響を受けさせたいなら`MeshLambertMaterial`を使いましょう。
three.jsのメッシュのpositionとはどこを表すのか


[ソースコードはgithubで公開しています。](https://github.com/mitsuru793/Animation/blob/master/JavaScript/treejs/What_is_position.html)

three.jsで立方体を作る際に、幅・高さ・奥行きを決めるのですが、これらの数値はどこから測られるのか、よく分からなかったので確かめてみました。

### 座標をすべて0にして試してみる

10cmの立方体と、その立方体の高さを0にした床を用意。両方ともpositionはすべて0です。

```js
// 立体と床を作る
// キューブ
var cubeGeometry = new THREE.BoxGeometry(10, 10, 10);
var cubeMaterial = new THREE.MeshBasicMaterial({
	color : 0x660000,
	wireframe : true
});
var cubeMesh = new THREE.Mesh(cubeGeometry, cubeMaterial);
cubeMesh.position.set(0, 5, 0);
scene.add(cubeMesh);

// 床		
var floorGeometry = new THREE.BoxGeometry(10, 0, 10);
var floorMaterial = new THREE.MeshBasicMaterial({
	color : 0xffffff
});
var floorMesh = new THREE.Mesh(floorGeometry, floorMaterial);
floorMesh.position.set(0, 0, 0);
scene.add(floorMesh);
```

![threejs_01_141011.jpg](https://qiita-image-store.s3.amazonaws.com/0/62881/8fd85f10-43ff-fbb4-474b-5eba4adc10bb.jpeg "threejs_01_141011.jpg")


床にはBoxGeometryを使用していますが、高さを0でも描画されます。さて、上記の結果を見てみると、2つのメッシュ（立方体と床）の描画位置は同じなのに、床が立方体の中心に描画されていますね。**positionとは中心座標を表す**ことがわかりました。

### 床の上に立方体を置く

立方体の座標を、y方向に上げてみましょう。positionは中心座標なので立方体の高さの半分だけ上げます。

```js
// 立方体の中心座標の変更
cubeMesh.position.set(0, 5, 0);
```

![threejs_02_141011.jpg](https://qiita-image-store.s3.amazonaws.com/0/62881/1a5c12ec-1000-5c33-1170-e6c64a97f2ef.jpeg "threejs_02_141011.jpg")

これで立方体を床の上に置くことができました。
アクセサメソッドを書く手間が省けるDynaActionFormを使ってみた


Beanはただ値を格納するだけに利用する場合は、自動でアクションフォームを作成してもらいましょう。アクセサメソッドを書く手間が省けます。

### ファイル構成

action要素でvalidate属性をfalseにしないと何故かエラーになってしまいます。デフォルトはtrueみたいですね。

```xml
<!-- struts-config.xml -->
<?xml version="1.0" encoding="ISO-8859-1" ?>
<struts-config>
	<form-beans>
		<form-bean name="autoBean" type="org.apache.struts.validator.DynaValidatorActionForm">
			<form-property name="name1" type="java.lang.String"></form-property>
			<form-property name="name2" type="java.lang.String"></form-property>
			<form-property name="name3" type="java.lang.String"></form-property>
		</form-bean>
	</form-beans>
	<action-mappings>
		<action path="/Input" forward="/pages/Input.jsp">
		</action>
		<action path="/Output" type="HelloAction" name="autoBean" validate="false">
			<forward name="success" path="/pages/Output.jsp"></forward>
		</action>
	</action-mappings>
</struts-config>
```

```java
// アクションクラス
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.DynaActionForm;

public class HelloAction extends Action {
	public ActionForward execute(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) {
		DynaActionForm dynaForm = (DynaActionForm) form;

		String name1 = dynaForm.get("name1").toString();
		dynaForm.set("name1", "Mr." + name1);

		dynaForm.set("name3","名無し");

		return mapping.findForward("success");
	}
}
```

```jsp
<%-- 入力画面 --%>
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>

<html:html>
<html:base/>
<h1>&lt;%=request.getRequestURI()%&gt;</h1>
<html:form action="/Output.do">
	名前1：<html:text property="name1">
	名前2：<html:text property="name2">
	名前3：<html:text property="name3">
	<html:submit>
</html:submit></html:text></html:text></html:text></html:form>
</html:html>
```

```jsp
<%-- 出力画面 --%>
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html"%>
<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean"%>

<html:html>
<html:base/>
	<h1>&lt;%=request.getRequestURI()%&gt;</h1>
	<p>
		<bean:write name="autoBean" property="name1">さんと、
		<bean:write name="autoBean" property="name2">さんと、そして、
		<bean:write name="autoBean" property="name3">さん、おめでとうございます！
	</bean:write></bean:write></bean:write></p>
</html:html>
```

### 実験開始

入力画面では3つ目の値は空にしておいてもエラーにならないことを確かめます。

![struts_01_141010.jpg](https://qiita-image-store.s3.amazonaws.com/0/62881/c0d5d8fe-fe43-be63-27c7-97188243a5e3.jpeg "struts_01_141010.jpg")


アクションクラスで名前1に「Mr.」をつけて、名前3には「名無し」をセットします。

![struts_02_141010.jpg](https://qiita-image-store.s3.amazonaws.com/0/62881/d1988a48-4577-b65a-0ff2-67f0b785815c.jpeg "struts_02_141010.jpg")


DynaActionFormにて値の受け渡しができることが確認できました。今回は悪書フォームを自分で記述していないので、reset()でリクエストのエンコーディングを設定できません。そのためinputフィールドで日本語を使用すると文字化けします。しかし、アクションクラスでセットした値は大丈夫でした。jsp側のcharsetで対応出来るみたいです。
SQLのUPDATE文にVALUESは使えない


私はSQLが苦手です。毎回、insert文、update文を調べているので少し整理して覚えないといけません。今日は下記のようなミスをしていました。

name        | age    
----------- | -------
varchar(80) | integer

postgresでupdateを行おうとしていましたが、insertの文法と混ざってしまいvaluesを使っていました。大分、頭がごちゃごちゃしていたのでなかなか気が付きませんでした。

```psql
-- エラーが出る間違いの例
UPDATE
        test
    SET
        (
            name
            ,age
        )
    VALUES
        (
            'mario'
            ,13
        );
```

VALUESはinsertで使うのです。postgresでupdateを行うには2通りの書き方があります。下記のとおりです。

```psql
-- 順にセットしていく
UPDATE
        test
    SET
        name = 'mario'
        ,age = 13;
```

```psql
-- カラムと値を分ける
UPDATE
        test
    SET
        (
            name
            ,age
        ) = (
            'mario'
            ,13
        );
```

ちなみに2つ目の文法はMysqlでは使えないみたいです。1つ目を使うようにした方が良さそうです。
EclipseのTomcatプラグインで再起動をかけても修正箇所が反映されない


**作業環境**

MacOS         | 10.9.5(Mavericks)
------------- | -----------------
Eclipse       | Juno(4.2)        
Tomcat Plugin | 3.3.0            
Tomcat        | 7.0.54       

strutsで動的アクションフォームである、DynaActionFormをstruts-config.xmlで定義したのですが、一度定義すると修正時に反映されないという現象が発生しました。xmlファイルを変更した場合はいつもtomcat再起動をしていたのですが、今回はDynaActionFormを使っていることが原因なのかはわかりません。form-property要素のname属性も変えても反映されなかったり、されていてもゲッターメソッドがありませんとエラーになったりとJSPが表示されません。    

### relaunchをするとキャッシュが消える？

しかし、Eclipseを再起動すると何故か直ることが判明。けど、Eclipseは起動に時間がかかるのでこれじゃあイライラしてしまいます。何はいい方法はないかと探していたら、2つ目のtomcat再起動ボタンを発見しました。

![eclipse_tomcat_01_141009.jpg](https://qiita-image-store.s3.amazonaws.com/0/62881/38387e3b-1352-c5e8-fcc8-75264244c45f.jpeg "eclipse_tomcat_01_141009.jpg")

relaunchボタンです。このボタンを押すとどうやらキャッシュが削除されるようです。クラスファイルも完全に削除されるのでしょうか。tomcat再起動だけではhtmlフォームのinputフィールドの入力値に以前のものが残っていましたが、relaunchを行うと消えて初期値が空になっていましたので、キャッシュが削除されていると推測します。

こんなボタン1つで2時間近く無駄にしました。同じ所で困ってる人がいたら、この記事を教えてあげて！
global-forwardsとaction、どちらの子要素のfowardが優先されるのか調べてみた


すべてのURLでの共通のエラーページなど、デフォルトとして使用する遷移先を毎回指定するのは面倒ですよね。

```xml
<!-- struts-config.xml -->
<action-mappings>
	<action path="/A" type="MapAction">
		<forward name="common" path="/pages/Common.jsp"></forward>
	</action>
	<action path="/B" type="MapAction">
		<forward name="common" path="/pages/Common.jsp"></forward>
	</action>
	<action path="/C" type="MapAction">
		<forward name="common" path="/pages/Common.jsp"></forward>
	</action>
</action-mappings>
```

そんなときは、全てのaction要素で使用可能な遷移先をglobal-forwards要素で定義します。

```xml
<!-- struts-config.xml -->
<?xml version="1.0" encoding="ISO-8859-1" ?>
<struts-config>
	<global-forwards>
		<forward name="common" path="/pages/Common.jsp">
	</forward></global-forwards>
	<action-mappings>
		<action path="/A" type="MapAction">
		<action path="/B" type="MapAction">
		<action path="/C" type="MapAction">
			<forward name="common" path="/pages/C.jsp"></forward>
		</action>
	</action></action></action-mappings>
</struts-config>
```

### Strutsの流れをイメージする

今回はイメージとしてA,B,Cさんの案内役（action要素）がいるとします。この人達は共通の行動をします。（同じActionクラスを実行）

Actionクラスにはただ、Common.jspへ向かえと書いてあるだけです。

```jsp
<%-- Common.jsp --%>
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>

<html:html>

<html:base>

<h1>&lt;%=request.getRequestURI()%&gt;</h1>
<h3>global-forwardsで定義された、みんなのページです！</h3>

</html:base></html:html>
```

&nbsp;しかし、Cさんだけは呼び名は同じCommon.jspでも違う場所を知っています。

```jsp
<%-- C.jsp --%>
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>

<html:html>

<html:base>

<h1>&lt;%=request.getRequestURI()%&gt;</h1>
<h3>actionの子要素forwardで定義されたCさんだけのページです。</h3>

</html:base></html:html>
```

### 用意したURLにアクセスしてみる

「A.do」、「B.do」にアクセス、A,Bさんに案内役を頼むと下記のページに案内されました。  
![struts_07_141007.jpg](https://qiita-image-store.s3.amazonaws.com/0/62881/004b94ec-617f-6f83-74e6-5ef9e0a3feaa.jpeg "struts_07_141007.jpg")


ところが「C.do」、Cさんに案内してもらうと秘密のページを教えてくれます。  
![struts_08_141007.jpg](https://qiita-image-store.s3.amazonaws.com/0/62881/00eb638f-948e-797a-ddab-a33e18338450.jpeg "struts_08_141007.jpg")


このことから、global-forwardsよりactionの子要素で定義されたforwardが優先されることがわかりました。下記のソースで言うと、ハイライトされている部分です。

```xml
<!-- struts-config.xml -->
<struts-config>
	<global-forwards>
		<forward name="common" path="/pages/Common.jsp">
	</forward></global-forwards>
	<action-mappings>
		<action path="/C" type="MapAction">
			<forward name="common" path="/pages/C.jsp"></forward>
		</action>
	</action-mappings>
</struts-config>
```
PyMCでコインの確率推定

PyMCでコインの確率推定
===

前回の続き見たいなもの。
PyMC3で同じようなことをやってみる。

PyMC
--
PyMCとはPythonのMCMCライブラリの一種。他にはpystan,emceeなどがあるが、現在主流なのはpystanとPyMC。速度はpystan > PyMCだけど、PyMCは離散変数のモデルの計算ができ、Pythonicな方法でモデルを記述できるのでpythonに慣れた人からすれば学習コストは比較的低い。
PyMCには、PyMC2系列とPyMC3系列があり、両者の間にはモデルの記述法など若干の違いがあり、PyMC3の方が高速。

### 確率分布
使用できる確率分布は公式ドキュメントを参照 
https://pymc-devs.github.io/pymc/distributions.html

### サンプリング方法
`dir(pymc3.step_methods)`で確認
NormalProposal,HamiltonianMC,Metropolis,,NUTSなど、有名所は揃ってる

実行環境
--
実行環境はlinux mint 64bitにanacondaを入れたものを使用した。
anacondaのデフォルトではpymc2が入っているので、以下のコマンドによってpymc3をインストール

`pip install --process-dependency-links git+https://github.com/pymc-devs/pymc3`

プログラム概要
--
with pm.Model()内部にモデルを記述。
事前分布やら尤度、サンプリング方法を定義して、
sample関数でサンプリングスタート。
traceplotに使うと簡単に実行結果を描画できる。

``` python
#coding:utf-8
import pymc3 as pm
import matplotlib.pyplot as plt
import numpy as np

observed = [1, 0, 1, 1, 0, 1, 0, 1, 0, 0]
h = sum(observed)
n = len(observed)
alpha, beta = 1, 1
niter = 10 ** 6
with pm.Model() as model:
    # define priors
    p = pm.Beta('p', alpha=alpha, beta=beta)
    # define likelihood
    y = pm.Binomial('y', n=n, p=p, observed=h)
    # inference
    start = {'p': 0.5}
    step = pm.Metropolis()
    trace = pm.sample(niter, step, start)
pm.traceplot(trace)
plt.show()

N = 10000
p, bins = np.histogram(trace["p"], bins=N, density=True)
theta = np.linspace(np.min(bins), np.max(bins), N)
print "ML:" + str(h / float(n))
print "MCMC:" + str(np.dot(p, theta) / N)

```

実行結果
---
![figure_1.png](https://qiita-image-store.s3.amazonaws.com/0/92078/b2bde80c-1423-0bda-ff3b-3ed2465d0eb4.png)

事後分布の期待値は0.539。最尤推定による推定値は0.5であるのに対し、無視できない大きさ。
前回に推定したグラフと大体一致しているので、分布自体はそんなに間違っていないはず。
期待値の求め方間違っているような気がする。間違ってたら教えて下さい。

終わりに
--
ライブラリを使って、コインの表の出る確率を計算してみた。
次はもうちょっと複雑なデータとモデルを使って推定してみたい。

参考文献
==
岩波データサイエンス Vol 1
https://pymc-devs.github.io/pymc3/getting_started/
http://people.duke.edu/~ccc14/sta-663/PyMC3.html
Javaで文字列をシングルクォートで囲んだら、エラーになってしまった。


どうやら文字列は”（ダブルクオート）を使い、’（シングルクォート）は文字列リテラルというchar型の1文字の際に使うそうだ。Javaでこの使い分けが文法として定義されている。
Struts1.3.10のテンプレートstruts-blankでいきなりエラーが出てしまう


http://struts.apache.org/download.cgi#struts23163

上記からFull Distributionをダウンロードし、struts-1.3.10/apps/struts-blank-1.3.10.warをtomcat/webappsにコピーし、tomcatを起動・再起動すると、勝手にwarが展開されます。Eclipseのtomcatプラグインを使っているのなら、自動でweb.xmlにコンテキストパスを登録してもらえます。

しかし、アクセスしてみるとWelcome.jspでエラーが。
```xml
javax.servlet.ServletException: org.apache.jasper.JasperException: javax.servlet.ServletException: javax.servlet.jsp.JspException: キー "welcome.title" に対応するメッセージが見つかりません
	org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:286)
	org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
	org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:449)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:620)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
	org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

これはMessageResourcesのパスが違うということ。WEB-INF/lib/sturts-config.xmlを編集しましょう。

```

<!-- 編集前 -->

<message-resources parameter="MessageResources">

<!-- 編集後 -->
<message-resources parameter="" java.messageresources""="">
```

<p>&nbsp;パラメータに「java.」を追加するだけです。</p>
</message-resources></message-resources>
ERMasterでDBのテストデータを作成しようとするとエラーがでて画面が表示できない


**作業環境**

MacOS   | 10.9.5(Mavericks)
------- | -----------------
Eclipse | Juno(4.2)   

ERMaterで作図など基本操作に問題はなかったのですが、右クリック後にテストデータ作成をクリックした後、下記のエラーが表示されて画面が開けませんでした。


![ermasterのエラー画面](https://qiita-image-store.s3.amazonaws.com/0/62881/830675ff-c00e-757e-80dd-91f11b206f35.jpeg "ermaster_141005.jpg")



     


Javaのバグなのかと思いましたが、[ERMaterの公式ドキュメント](http://ermaster.sourceforge.net/index_ja.html)を見てみると、次のような一文が…。

> ERMasterは、現在 Eclipse 4.3(Kepler) で開発を行っています。

Keplerを入れてテストデータ作成を試してみると無事画面が開きました。どうやらEclipseのバージョンが古いと新しい機能が使えないみたいですね。
「どのスコープにもBean TestActionFrom がありません」はname属性が間違っていると発生


`<bean:write>`でアクションフォームの値を書きだそうしたら、下記のエラーが出てJSPが表示されないという現象が起きました。

```
javax.servlet.jsp.JspException: どのスコープにもBean TestActionFrom がありません
```

かなり時間を割いてしまったのですが、`<bean:write>`の`name`が間違っていました。`TestActionForm`が正解です。`Form`を`From`にしていました。このスペルミスは依然もやった記憶があります。エラー文から別のことが原因かと思い、見当違いのことを調べていました。
【Struts】アクションフォームの値を\<bean:write\>で書きだすと文字化けしてしまう


アクションフォームBeanはエンコード方式が指定されていても、それを確かめる前に値が格納されるため日本語を扱う場合は、文字化けが起こります。

アクションフォームクラスの中で、毎回エンコード処理を記述するのは面倒なので、フィルターという機能で解決しました。

参考記事：[Javaの道：アクション・フォームBean](http://www.javaroad.jp/opensource/js_struts10.htm)

tomcatのサンプルプロジェクトにあるSetCharacterEncodingFilter.javaを使います。これを自分のプロジェクトに入れた後に、web.xmlで設定します。下記を記述して下さい。

```xml
<!-- web.xml -->
<web-app>
	<filter>
		<!-- フィルタ名を記載します。 -->
		<filter-name>EncodeFilter</filter-name>
		<!-- フィルタ処理の際のクラスを指定します。 SetCharacterEncodingFilterクラスは filtersパッケージ内にあります。 -->
		<filter-class>filters.SetCharacterEncodingFilter</filter-class>
		<!-- パラメータ値にエンコード方式を指定します。 -->
		<init-param>
			<param-name>encoding</param-name>
			<param-value>UTF-8</param-value>
		</init-param>
	</filter>
	<!-- すべてのURLパターンでフィルタ処理が 行われるように指定します。 -->
	<filter-mapping>
		<filter-name>EncodeFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
</web-app>
```

今回はUTF-8を指定しています。アクションフォームの値の文字コードを設定しても、それを表示するjsp側にも文字コードをUTF-8と設定しないと文字化けは治りません。下記を記述しておきましょう。

```jsp
<%-- test.jsp --%>
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
```
EclipseのTomcatプロジェクト名を変更した際は、server.xmlも変更すること


EclipseのTomcatプラグインでtomcatが起動できなくなりました。ibatisとspringのjarを追加して、関連するプラグインを入れたりしていたのでそれが原因がかと思いましたがものすごい初歩的なことでした。

下記のエラー文は最初に記述されたものです。実際はいくつもエラーが出ていて縦に長いログになっていました。そのため、Eclipseのコンソールからはみ出ていた下記のエラー文に気が付かなかったです。ログをもっとしっかりと読まないといけないですね。

```
重大: 静的リソースの起動中のエラーです
java.lang.IllegalArgumentException: ドキュメントベース /Users/user_name/Downloads/apache-tomcat-7.0.54/webapps/TestStrut が存在しない、又は読めないディレクトリです
	at org.apache.naming.resources.FileDirContext.setDocBase(FileDirContext.java:136)
	at org.apache.catalina.core.StandardContext.resourcesStart(StandardContext.java:5089)
	at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5269)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at java.lang.Thread.run(Thread.java:745)
```

EclipseでTomcatプロジェクトを作成した際は、自動でtomcatのserver.xmlを書き換えてくれるのですが、プロジェクトを削除したり、プロジェクト名を変更した場合は自分でserver.xmlを書き換えなければいけないです。

上記の例でいうとTomcatプロジェクト名をTestStrutからTestStrutsと最後にsを付けるだけの変更した場合でもserver.xmlを書き換えます。server.xmlの一番下の方に下記のような記述がありますので、過去のプロジェクト名が書かれているところを現在のに直します。

```xml
<!-- server.xml -->
<Context
	path="/TestStrut" reloadable="true"
	docBase="/Users/uesr_name/Downloads/apache-tomcat-7.0.54/webapps/TestStrut"
	workDir="/Users/uesr_name/Downloads/apache-tomcat-7.0.54/webapps/TestStrut/work" />
```
path,docBase,workDir属性の末尾にプロジェクト名がありますね。今回はここにsを付け足すだけで、tomcatが無事起動するようになりました。