2012年11月16日金曜日

【EffectiveJava輪講】5.ジェネリックス

※社内の輪講用メモ。まだ途中。

翻訳が、「ジェネリクス」ではなく、「ジェネリックス」なので、表記を合わせています。

p.n表記は、EffectiveJavaのページ番号です。

前史(ジェネリックス以前)


コレクションから読みだしたすべてのオブジェクトをキャストしていた。(挿入する型を間違えるとキャスト失敗)

現在(ジェネリックス時代)


個々のコレクションに許される型をコンパイラに伝え、コンパイラは自動的にキャストを挿入。誤った型を挿入しようとすると、コンパイル時に判明。

ジェネリックスを理解するために。変性の話。


(この辺参考URLから)























変位意味Javaでの例
共変広い型から狭い型へA<P>はA<C>のスーパータイプ
反変狭い型から広い型へ A<P>はA<C>のサブタイプ
非変型を変換できないことA<P>とA<C>の型に関係はない

Javaではすべてのジェネリック型は非変(ジェネリック型変数の変位指定はできない)。

不変であるということは、List<Object>のパラメータに、List<String>を渡すことができない。

 

No. 23 新たなコードで原型を使用しない


Javaのジェネリック対応は、過去バージョンとの互換性の維持が前提となっているため、犠牲にしている部分がある。

  • 原型(Raw Type)が使用できること

  • 変位指定ができない


要素型が不明な場合、原型を使用すると下記のように書いてしまうのはよくない(p.110)

[java]
static int numElementsInCommon(Set s1, Set s2) {
int result = 0;
for (Object o1 : s1)
if (s2.contains(o1))
result++;
return result;
}
[/java]

非境界ワイルドカード型で書きなおすと(p.111)

[java]
static int numElementsInCommon(Set s1, Set s2) {
int result = 0;
for (Object o1 : s1)
if (s2.contains(o1))
result++;
return result;
}
[/java]

  • 非境界とは?


    • 上限や下限がないこと。



原型を使用しない、の例外2つ

クラスリテラルでは原型を使用しないといけない(非境界ワイルドカード型だったらOK)

instanceofつかうとき
[java]
if ( o instanceof Set ) {
Set m = (Set) o; //Setでキャストする必要がある
}
[/java]

No. 24 無検査警告を取り除く


省略

No. 25 配列よりリストを選ぶ


なぜ配列よりリストを選ぶべきなのか?
配列は実行時の型安全は提供するが、コンパイル時の型安全は提供しない


  • 配列の特徴


    • 共変である

    • 具象化されている




配列よりリストを選ぶ例(p.119)
[java]
import java.net.InterfaceAddress;
import java.util.ArrayList;
import java.util.List;


public class sample01 {

//元のコード
static E reduce(List list, Function f, E initVal) {
E[] snapshot = (E[]) list.toArray(); //警告
E result = initVal;
for(E e : snapshot)
result = f.apply(result, e);
return result;
}

//安全にする
static E reduce2(List list, Function f, E initVal) {
List snapshot;
synchronized(list) {
snapshot = new ArrayList(list);
}
E result = initVal;
for (E e : snapshot)
result = f.apply(result, e);
return result;
}

interface Function {
T apply (T arg1, T arg2);
}

}
[/java]

以下次回に持ち越し

No. 26 ジェネリック型を使用する


No. 27 ジェネリックメソッドを使用する


No. 28 APIの柔軟性向上のために、境界ワイルドカードを使用する


No. 29 型安全な異種コンテナを使用する






参考資料


2012年10月24日水曜日

memcached-toolが無いときに

memcachedを使うときに、

$ telnet hoge-host 11211
stats
...

quit
とかして、確認することはポピュラーだと思います。

シェルスクリプトとかで操作したい時は、memcached-toolが入っていると楽ですね。
ただ、memcachedがinstallされていない鯖だと、memcached-toolも入っていないことが多いので、そういうときに使えるワンライナー
$ echo -e 'stats\nquit' | curl -s -T - telnet://hoge-hos:11211
curlかわいいよ、curl

2012年9月20日木曜日

eclipse新規設定備忘録

環境は、MacOSX Lion,Eclipse 3.7 Java EE

plugin


  • vrapper

  • Maven Integration for WTP(m2e)

  • Eclipse Color Theme

  • Properties Editor

  • FreeMarker Editor

    • ref. http://ameblo.jp/kochablo/entry-11059888121.html

prefarence


  • 文字コード(UTF-8に)
    • Preferences -> General -> Workspace
    • Text file encoding -> utf-8

  • 行番号の表示させる
    • Preference -> General -> Editors -> Text Editors
    • "Show line numbers" にチェック

  • コードフォーマッタの適用
    • Preferences -> Java -> Code Style -> Formatter
    • importしてapplyしてOK

  • カーソル位置の変数のハイライトがうまくいってなかったら
    • Preferences -> Java -> Editor -> Mark Occurences
      • Mark occurrences of the selected element in the current fileにチェックしてapplyしてOK

2012年9月14日金曜日

sqlite3のコマンド少々

個人的なメモでござる。
オフィシャルなコマンドリファレンスはココ
http://www.sqlite.org/sqlite.html

環境



  • Mac OS X Lion


MySQLでいうところの¥Gしたいとき


垂直表示をしたい時は
[bash]
sqlite> .mode line
[/bash]

MySQLでいうところの、show tables


[bash]
sqlite> select * from sqlite_master where type='table';
[/bash]

MySQLでいうところの、show create tableてきな


[bash]
sqlite> select sql from sqlite_master where type='table' and name='調べたいtable名';
[/bash]

ま、FireFoxのcookieが見たかっただけなんですが...(いつからか、Firefoxのcookieはsqlite3に格納されるようになっています)。

2012年8月18日土曜日

Mac OS X Lionでのhostsの変更を即時反映する

T/O

どうでもいいけど、Macってこんなんなのね。
[bash]
$ ls -la /etc
lrwxr-xr-x@ 1 root wheel 11 4 13 19:58 /etc -> private/etc
[/bash]

実際の変更はこんな感じ
[bash]
$ sudo vim /etc/hosts
$
$ sudo killall -HUP mDNSResponder
[/bash]
こうすればリゾルバキャッシュがフラッシュされるらしいよー。

2012年7月7日土曜日

5分で立てるweb proxy

恒久的に使うのであればきちんとセキュリティを考慮しましょう。。。

とエクスキューズしつつ、5分で立てるsquidによるhttp proxyです。

目的はとりあえずhttpが通らない環境から通したいってだけです。当たり前だけど、ホストAとホストB間はルーティングされているものとします。

環境

  • OS
    • CentOS 6.2

  • HOST
    • A:インターネットに出れる子:192.168.0.1
    • B:インターネッツに出れない子:192.168.100.x

流れ

squid入れる
$sudo yum install squid

/etc/squid/squid.conf を以下の用に

#使うポートの設定と、許可するネットワークの設定を環境に合わせる。
http_port 8888
acl hogenet src 192.168.100.0/255.255.255.0
http_access allow hogenet
http_access deny all
(他省略。あとは、環境に応じてキャッシュだったり、セキュリティの設定だったり。)

すきっど起動
/etc/init.d/squid start


んで、クライアント側に串を通して、確認。
$ export http_proxy="http://192.168.1.0:8888"
$ wget www.example.com

おしまい。(∩´∀`)∩ワーイ

2012年6月27日水曜日

python2.6でUnicodeEncodeErrorが発生した

環境



  • CentOS 5.4

  • python2.6(野良パッケージ)


現象


手元の環境で、tomahawk 0.5.2を使おうと思ったら、下記のようなエラーが
UnicodeEncodeError: 'ascii' codec can't encode characters in position 20-22: ordinal not in range(128)

対応


pythonのディレクトリに、site-packagesというディレクトリがあるかと思うので、その直下に、sitecustomize.py ってのをつくり以下の様な記述をします。
[python]
import sys
sys.setdefaultencoding('utf-8')
[/python]

これでOK。(∩´∀`)∩ワーイ

参考にさせていただきました



おまけ


tomahawk動かすのに、下記のパッケージをぼくの環境では追加導入が必要でした。(直接インターネットに出れない環境だったので大変だった。。。)

  • argparse-1.2.1

  • pexpect-u-2.5.1

  • setuptools-0.6c11