Eclipseでシーケンス図を描く
4 月 24, 2009
頭の中を整理したくて、シーケンス図でも描くかと思ってJUDEを使おうかと思ってたんだけど、会社で使うのはどうなんかなーと思って違う方法を探してました。
そしたら、Eclipse+Amaterasuでいけそうなのでそれで対応することに。
以下インストール手順です。
ですが、Eclipseのインストールをしてない人専用かも・・・。
1.Eclipseのダウンロード
- http://www.eclipse.org/downloads/へアクセス。
- Eclipse Modeling Tools (includes Incubating components) (313 MB)をDL。(313Mとかw)
- 展開して、自分の作業しやすい場所に移動。
- EclipseのインストールはこれでOK。日本語はいいよね・・・
2.Amaterasuのダウンロード
- インストールはここ(http://eclipsewiki.net/eclipse/index.php?EclipseHTMLEditor)を参考にしました。
- Amaterasuを利用するには、 GEF、JDTが必要ですが、先ほどインストールしたEclipseにすでに入ってますので、AmaterasuだけでOK。
- Amaterasuをダウンロード
- 解凍して、中身のjarファイルを↑でインストールしたEclipseのdropinsにコピー
- これでAmaterasuのインストールはOK
3.シーケンス図を描く。
- Eclipseを起動。わたくしの環境だと何回か起動でこけましたが、Eclipseを再起動したら大丈夫でした。
- 先にプロジェクトを適当に作成。中身は空でOK。シーケンス図だけでは作成できず、プロジェクトが必要なので。
- プロジェクトを開いて、右クリックで、新規→その他→Amaterasu シーケンス図を選ぶ
- プロジェクトを選んでOK
これだけです。そんな難しくないですね。
今回のこのために前のEclipseが残ってたらおかしくなるかとと思って、Eclipseは削除しました。
で、またインストールしました。
Amaterasuの使い心地ですが、まぁ必要な分は描けたので満足してます。
左側にある操作パネル?からエンティティなどを選んで設置していきます。
あとでお時間あったらSSでも載せます。
シーケンス図で困ったって人はお試しあれ。アンインストールも削除するだけなので楽チンです!
これから新社会人として頑張るために
3 月 30, 2009
なんとなく書いてみる。
ようやく俺もあと2日経つと社会人3年生が終わり、4年目に突入します。
いろいろあったなー。
大体半年くらい働くと、その人が信頼できるかどうかってのがわかる。早ければ1,2ヶ月で。
できる人とできない人との違いって大げさなほどなものじゃないけど、ここをこうすれば上司から「こいつ使えねぇ」とか思われることはないと思う点があるんだ。
そんなこと書いてみる。
ポイントは3つ。
メールの書き方、質問の仕方、遅刻はしない
の3点です。
遅刻はしない
とりあえず基本から。社会人で当然だし、当然っちゃ当然なんだけど、できない人は本当できない。
なんとかなおそうと思っても難しいもんだと思うけど、基本遅刻はしちゃだめ。
特に新卒ならなおさら。
何故かというと「いざってときまかせるのが不安」になる。
学生ではなく社会人になってお金もらう立場なのに「眠たいから遅刻しました」とかそんな理由感じをつけそうなやつに仕事をまかせることはできない。
私がエンジニアなので、ちょっと例を出すと・・・(結構極端な話です申し訳ない)
====
あなたが今日1時間遅刻したとします。
出社すると、アラートメールがきています。
どうやらあなたが作ったプログラムのようです。
修正しないといけません。
ですが、私はあなたの作ったプログラムを触ったことがありません。
どういう思想でプログラムを書いているのかもわからないので、原因を探るのに時間がかかりました。
また、私はそのプログラムを修正する必要があります。
あなたが遅刻している今、修正できるのは私しかいません。
結局私が1時間かけて修正しました。
====
何が言いたいかというと、もしあなたが出社していれば、プログラムを熟知しているので5分で直るかもしれないものを1時間かけて私が修正していることが問題です。
1時間あれば、私はほかの仕事もできましたし、システムが止まる時間も短くできます。
そうすれば全てにおいて会社にプラスなのです。(エラーがあるシステムを作ってしまったことを除いては)
上のはあくまでひとつの例ですが・・・こんな感じに
いざというときにその人がいるとわかっていればほかの人は安心して仕事できるんです。
人の信頼を得るなら誰よりも早く来て仕事するといいですよ。
あと、あまり大きな会社だとありえない状況かもしれないですけど、人のいないオフィスってすごい快適ですよ!
静かに仕事できるので、結構はかどったりします。
最後に・・・
みんな遅刻してるから大丈夫だろ!とか思ってたら逆に遅刻しないで出社しましょう。
ちゃんと真面目に出社しているところを見せるチャンスです!
メールの書き方
メールって以外とその人の性格がはっきり出る(ような気がする)
下手な人のメールって、話の意図が捉えられてなくて何言ってるのか、どこのことを言ってるのかよくわからなかったりします。
とりあえず、あなたのメールは50%くらいしか伝わってないと思っていいです(また極端な話になったな・・・。)
また例でも出しておこう。(社内→社内を想定してます)
====
○○さん
お疲れ様です。○○です。
さきほどはMTGありがとうございました。
MTGの内容をまとめて、添付いたしますので、ご確認ください。
よろしくお願い致します。
====
例が悪いとか言うなw
これをどうとるかは人によると思うんだけど、上司で、すっげー忙しい人だったとする。(さんつけでメールしないか・・・)
その場合、受け取った側は・・・
「MTG・・・どのMTGだ・・・」
「なんでわざわざ添付するの?なんで俺が添付資料を開ける手間をかけなきゃいけないの?」
などと思われてしまうかもしれません。
個人的にメールを送る注意点として
という点に注意してます。
変に丁寧ないいまわしよりも、代名詞を使わないようにしてわかりやすい表現にしたほうがよいかと思います。
あと、件名も超重要です。
ちょっと前に件名に[EOM]をつけるのが流行りましたね。
End of Messageの略で、「本文を見る必要ないよ!件名で内容終わりだよ!」ってことです。
これも「受信側に手間をかけない」のひとつです。
件名で「あーあの内容か」と判断してから本文を読めば、理解の早さも変わってきます。
あと受信側に手間をかけないという点では、「など」を使わないというのがあります。
たまにいるのが人に頼むときに「~~などもよろしくお願い致します」っていうの。
などって何?
そこまで余分にわざわざ調べてあなたに知らさないといけないの?
その余分は本当に必要なの?
って思うことがあります。(って思ったことがある)
曖昧な表現はなくしたほうがいいです。特に人にものを頼むときはなおさら。
まとめると
人にメールするときは、短文でいいので、なるべくわかりやすい表現で、曖昧な表現をなくしましょう。ってことです。
質問の仕方
これもやり方によって、できる人とできない人の差が出てくる。
仕事してれば、新しいこともやるだろうし、わかんないこともあって当然です。
そのときわからなかったら質問しなければなりません。
でも質問の仕方もちょっと変えると相手の受け取り方が変わるので、気をつけましょう。
例によって、例でも。
新人君にプログラムの修正依頼を出したとしよう。
====
「○○さん、すみません。ちょっとお時間よいですか?」
「はい」
「(プリント見せながら)この部分なのですが、わからないので教えていただたいのですが?」
「・・・」
====
「・・・」で、どう思いますか?
これだけみたら「あーこいつ何も調べてないのかなー」とかちょっと思います。
どう見てもいやなやつです。本当にありがとうございます。
とりあえず、わからなかったら自分なりに調べましょう。
調べれば少しでも何かがわかるはずです。それを伝えましょう。←ここ重要。
例えばさっきの例なら
「(プリント見せながら)この部分なのですが、わからないので教えていただたいのですが?」
↓
「(プリント見せながら)この部分なのですが、多分、ここ処理で無限ループになっているようなのですが、この処理の中身がよくわからないので教えていただたいのですが?」
書くと長いけど、こんな感じに質問するといいかもしれない。
そうすれば、答える側もどこまでわかってるかわかるし、説明もしやすいと思う。
もう小学生じゃないんだから「わかんない」みたいな、曖昧この上ない表現はやめましょうね。
でもここでひとつ注意点。
あまり調べるのには時間をかけすぎないこと。
3,4時間もかけて調べたけど、ちょっとしかわかんなくて聞きに行ったら
「え?あ、終わった報告じゃなくて?あぁまだやってのか」
とか思われるかも・・・。
どう見てもいやなやつです。本当にありがとうございます。
せっかくあなたを頼りにして仕事をふってくれたのだから、その期待に答えて少しでも理解しようと努力したよ!ってところを少しでも見せるといいよ!
個人的に感じてるのは上の3点です。
上ができていれば、「こいつつかえねー」と思われることはないはずです。
真面目に仕事をしてるという印象は持たれると思います。
さて・・・こんな記事初めて書いたので、わかりにくい箇所とか多々あるとおもいますが、気がついたらちょくちょく書き足したり、修正しますのでお許しください。
まーこれ読んで少しでも「あー確かに」って思ってくれればよいです><
例が悪いとか、文章が読みづらいとかいうのは勘弁してください・・・><
pythonの基本の基本。
3 月 2, 2009
いただいた本をすこーしづつ読みすすめてます。
今回はpythonの基本文法について。
基本文法を習得するにも時間がかかった\(^o^)/
慣れるまでにはもう少し時間かかりそうだなー。関数まわりの奥が深いよ。うん。
今日は文字列、リスト、タプル、辞書、for文あたりについて。
文字列
文字列は、”(ダブルクォーテーション)、’(シングルクォーテーション)で囲めばOK.ヒアドキュメントを使いたい場合は”"”(ダブルクォーテーション*3)、”’(シングルクォーテーション*3)でOK.
>>> l="Hello Python!" >>> print l Hello Python! >>> s='Hello Python' >>> print s Hello Python >>> print """abd ... edg ... eoo""" abd edg eoo >>> print '''aboel ... eowako ... voeo''' aboel eowako voeo
文字列はオブジェクト扱いになるので、そのまま配列につっこまれたような感じになる。
ので、
>>> s='Hello python!' >>> print s[1] e >>> print len(s) 13
添え字は0からね。
リスト
PHPでいうとこの配列と認識した。
[]で囲めばOK。
追加するのは、extendとappendがあるらしい。動作が微妙に違う。
多重配列の場合は[]の中に[]を書けばOK。
変更するときも、PHPと同じように上書きしてあげればよい。
>>> a=[1,2,3,4,5] >>> print a [1, 2, 3, 4, 5] >>> a.extend(["a","b","c"]) >>> print a [1, 2, 3, 4, 5, 'a', 'b', 'c'] >>> a.append(["a","b","c"]) >>> print a [1, 2, 3, 4, 5, 'a', 'b', 'c', ['a', 'b', 'c']] >>> print a[2] 3 >>> print a[8] ['a', 'b', 'c'] >>> print a[8][1] b >>> a[0]=6 >>> print a [6, 2, 3, 4, 5, 'a', 'b', 'c', ['a', 'b', 'c']]
タプル
タプルとリストの違いがよくわかんなかったんだけど、タプルはPHPでいうとこのdefineみたいな感じかな。
定義後は変更できなくなる。
()で囲めばOK。
リストではないので、追加のextendやappendはない。
追加するときは、タプル+タプルにしてあげる。
もちろんリストのように添え字指定しての変更もできない。
>>> b=(1,2,3) >>> b.extend(4,) Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'tuple' object has no attribute 'extend' >>> b.append(4,) Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'tuple' object has no attribute 'append' >>> b=b+(4,) >>> print b (1, 2, 3, 4) >>> b[0]=5 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'tuple' object does not support item assignment
辞書
PHPでいうとこのハッシュ配列。
{key:value}で定義。
変更追加はupdateで行う。
dictでもOK。
>>> d={"a":"b", "c":"d", "e":"f"} >>> print d {'a': 'b', 'c': 'd', 'e': 'f'} >>> d.update({"g":"h"}) >>> print d {'a': 'b', 'c': 'd', 'e': 'f', 'g': 'h'} >>> d.update({"a":1}) >>> print d {'a': 1, 'c': 'd', 'e': 'f', 'g': 'h'} >>> d2=dict(aaa="bbb",ccc="ddd") >>> print d2 {'aaa': 'bbb', 'ccc': 'ddd'}
for文
基本は for 添え字 in リストで。色々みたほうがわかりやすいかも。
PHPでいうとforeachに近い?
>>> for i in 1,2,3,4: ... print i ... 1 2 3 4 >>> s="hello!" >>> for i in s: ... print i ... h e l l o !
辞書だとこんな感じ。
PHPでいうとこれ→foreach($array as $key => $val)。
>>> a={1:"a", 2:"b", 3:"c"} >>> for k,v in a.items(): ... print '%s: %s' % (k,v,) ... 1: a 2: b 3: c
イントロスペクション
pythonの勉強がてらMy本棚見てたら、Web+DBPressのVol.46に「速習python」の記事があって、それも読み読み。
dir()のイントロスペクションというのが便利げだ。
そのオブジェクトで、どんな関数が使えるのか表示できる。
>>> d2=dict(aaa="bbb",ccc="ddd") >>> dir(d2) ['__class__', '__cmp__', '__contains__', '__delattr__', '__delitem__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'clear', 'copy', 'fromkeys', 'get', 'has_key', 'items', 'iteritems', 'iterkeys', 'itervalues', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values'] >>> t=(1,2,3) >>> dir(t) ['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__getslice__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'count', 'index'] >>> >>> >>> string="hello" >>> dir(string) ['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__getslice__', '__gt__', '__hash__', '__init__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '_formatter_field_name_split', '_formatter_parser', 'capitalize', 'center', 'count', 'decode', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'index', 'isalnum', 'isalpha', 'isdigit', 'islower', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill'] >>> a=[1,2,3] >>> dir(a) ['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__delslice__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getslice__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__setslice__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort'] >>> t=(1,2,3) >>> dir(t) ['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__getslice__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'count', 'index'] >>> d={1:"a", 2:"b"} >>> dir(d) ['__class__', '__cmp__', '__contains__', '__delattr__', '__delitem__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'clear', 'copy', 'fromkeys', 'get', 'has_key', 'items', 'iteritems', 'iterkeys', 'itervalues', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values']
という具合。ちょっと長いけど、困ったときとかはいいね!
今日これ書いてたら少しpythonになれてきた。
わかったことは、キーボードが日本語配列だと打ちづらい気がするんだぜ!
Djangoへの道はまだ遠いな・・・。
pythonerに俺はなる!
2 月 17, 2009
wassrから情報をキャッチして、著書である露木さんが「Django×Pythonをブログに書くぜ」というメールを送った方の中から本をプレゼント!ということで応募しましたら、なんと当選しました!><
露木さん本当にありがとうございます!
まだDjangoどころかPython(・ω・)?っていう感じな状態ですが、この機会にpythonやって、「pythonも書けますけどなにか」的な存在になろう!
言語は、これでJava,PHPに続き3言語目!楽しみであります!
先にJavaScript勉強したほうがいいんじゃないかとか聞こえない聞こえない。
layoutはbeforeRenderあたりで設定したほうがよい?
2 月 14, 2009
私は大体cakephp使って携帯サイトを作ることが多いのですが、
そのときにlayoutはdefault.ctpは使わず、別layoutを作成して指定していたのですが、
アクションのエラー時にはdefault.ctpが使われるので、レンダリング前に$this->layoutで指定したほうがよさげ?
あとは普通にapp_controller.phpでlayoutを指定しておいてbeforeRenderで
function beforeRender() { if($this->name === "CakeError") $this->layout = "mobile"; }
とかするのも微妙だよなーとか思ってて、こんなタイトルになった。
エラー周りについてはまた少し書くつもり。
とりあえずいまさらだけど、debugが0の場合はどのエラーの場合でもviews/errors/error404.ctpが使うことを知った!OTL
