最初、2012年のまとめを書こうかと思っていたんですが、2012年は個人的に激動すぎて、ちょっと今の段階で振り返って、それをまとめることが難しいという結論になりました。
外部環境の動きによって、もたらされた自分の変化。
自分から能動的に動いた結果の自分の変化。
それぞれあるのですが、どれも今の段階でどうだったのか、評価を下すには早すぎると感じました。2〜3年して振り返った時に、2012年の評価ができるんじゃないかな、と思っています。
個別の事項についての、KPTはできるんですけどね。
というわけで、2013年の豊富を。
仕事の面で。
世の中の動きがどうなるかわかりませんが、Web系のエンジニアとしてやっていこうという気持ちに変わりはありません。今年選択した道を深化させて行きたいと思います。(Web以外のインターネット産業が勃興した場合はその限りではありませんw)
2011年の今頃は、モヤモヤしていたのですが、2012年は個人的な決断を行ったので、今は雑念も少なく、仕事に取り組むことができています。
多くの人にご迷惑をかけました。働くようになって、今年ほど自分の無力を感じたことはありませんでした。スキル的なところもそうですし、人間的なところもそうです。
スキル的なところは、一朝一夕にどうしようもないので、積み上げをしていくしかありません。そのスピードは上げていく必要がありますが。
人間的なところは逆にすぐできることも多くあります。同じ失敗だけはしないようにしたいと思います。今年はそこで、大きな失敗をしました。IT業界ではよくある話ですが、よくある話しとして済ませてはいけないと個人的には考えています。
抽象的なことばかり書いてもあれなので、1つだけ今年記憶に残ったエピソードを書きます。
弊社では、運用と開発に役割が分かれているわけではなく、エンジニア職は基本的に両方をこなします。
今年は3ヶ月ぐらい、実際のサービス運用から離れていた時期がありました。ニートしていたとかではなく、仕事で別のミッションがあったからなのですが。
その後、またとあるサービスの開発&運用をやることになったのですが、運用の感覚みたいなものが欠落していることに気が付きました。
具体的に言うと、リソースのモニタリングにおける気づき、であったり、何かのオペレーション時のリスク(事前察知?)に疎くなっていたり、等。
このあたり、日々の筋トレに近いものがあるのかもしれません。やらなくなると、徐々に衰える。
よくよく考えてみると、仕事って現場から離れると現場感覚が無くなんて、よく言われる話。ただ、それを如実に実感したのは初めてでした。
2013年1月1日火曜日
2012年11月30日金曜日
dateコマンドで現在時刻をミリ秒まで出力(UnixTimeで)
環境はLinuxで。
今どきのdateコマンドは%Nでナノ秒まで出るっぽい。
なのでそれを割ってやる。
--dateつけると任意の日時を出力できるよ。
今どきのdateコマンドは%Nでナノ秒まで出るっぽい。
なのでそれを割ってやる。
$ echo $(printf '%ld' $(expr `date +%s%N` / 1000000))追記
$ 1354169981849
--dateつけると任意の日時を出力できるよ。
$ echo $(printf '%ld' $(expr `date +%s%N --date "2000-11-11 12:00"` / 1000000))
2012年11月16日金曜日
【EffectiveJava輪講】5.ジェネリックス
※社内の輪講用メモ。まだ途中。
翻訳が、「ジェネリクス」ではなく、「ジェネリックス」なので、表記を合わせています。
p.n表記は、EffectiveJavaのページ番号です。
コレクションから読みだしたすべてのオブジェクトをキャストしていた。(挿入する型を間違えるとキャスト失敗)
個々のコレクションに許される型をコンパイラに伝え、コンパイラは自動的にキャストを挿入。誤った型を挿入しようとすると、コンパイル時に判明。
(この辺参考URLから)
Javaではすべてのジェネリック型は非変(ジェネリック型変数の変位指定はできない)。
不変であるということは、List<Object>のパラメータに、List<String>を渡すことができない。
Javaのジェネリック対応は、過去バージョンとの互換性の維持が前提となっているため、犠牲にしている部分がある。
要素型が不明な場合、原型を使用すると下記のように書いてしまうのはよくない(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]
省略
なぜ配列よりリストを選ぶべきなのか?
配列は実行時の型安全は提供するが、コンパイル時の型安全は提供しない
配列よりリストを選ぶ例(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]
以下次回に持ち越し
翻訳が、「ジェネリクス」ではなく、「ジェネリックス」なので、表記を合わせています。
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[] snapshot = (E[]) list.toArray(); //警告
E result = initVal;
for(E e : snapshot)
result = f.apply(result, e);
return result;
}
//安全にする
static
List
synchronized(list) {
snapshot = new ArrayList
}
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を使うときに、
シェルスクリプトとかで操作したい時は、memcached-toolが入っていると楽ですね。
ただ、memcachedがinstallされていない鯖だと、memcached-toolも入っていないことが多いので、そういうときに使えるワンライナー
$ telnet hoge-host 11211とかして、確認することはポピュラーだと思います。
stats
...
quit
シェルスクリプトとかで操作したい時は、memcached-toolが入っていると楽ですね。
ただ、memcachedがinstallされていない鯖だと、memcached-toolも入っていないことが多いので、そういうときに使えるワンライナー
$ echo -e 'stats\nquit' | curl -s -T - telnet://hoge-hos:11211curlかわいいよ、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
垂直表示をしたい時は
[bash]
sqlite> .mode line
[/bash]
[bash]
sqlite> select * from sqlite_master where type='table';
[/bash]
[bash]
sqlite> select sql from sqlite_master where type='table' and name='調べたいtable名';
[/bash]
ま、FireFoxのcookieが見たかっただけなんですが...(いつからか、Firefoxのcookieは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]
こうすればリゾルバキャッシュがフラッシュされるらしいよー。
どうでもいいけど、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]
こうすればリゾルバキャッシュがフラッシュされるらしいよー。
登録:
投稿 (Atom)