Hello world !

2003 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2004 | 01 | 02 | 03 | 04 | 05 | 07 | 08 | 09 | 12 |
2005 | 02 | 05 |
2006 | 09 |
2007 | 05 | 08 |
2008 | 05 | 10 |
2009 | 07 |

2003-09-29 Hello pascal

[][]

 program hello;
 begin
   writeln ('Hello, world'); { Comment }
 end.
 $ gpc hello.pas
 $ ./a.out
 Hello, world

[][]

 #!/usr/bin/awk -f
 BEGIN {
   print "Hello, world"
 }

[] hello.txt

This code works in ruby, tcl, expect.

# Although expect is subset of tcl.

 $ cat > hello.txt
 puts "Hello, world" 
 ^D
 $ ruby hello.txt
 Hello, world
 $ tclsh hello.txt
 Hello, world
 $ except hello.txt
 Hello, world

common points

  • No need ( ... ) to call the function.
  • No need semi-colon

[] The Philosophy of Ruby

2003-09-11

[]

 ----------------------------------------------------------------
 ----------------------------------------------------------------
 ----------------------------------------------------------------
 -------7-------------------------------------0------------------
 ---3-7-------5---------3-------5-0---3-7------------------0-2---
 -5-------3-7-----1-1-5---7-3-7-----5-----3-7----1-1-1-1-3-----4-

2003-09-10 umm ...

[] How to make server program

  1. import SockServer
  2. class for request that extends BaseRequesthandler
  3. class for server that extend TCP/UDP Server
  4. If you needs, with Fork/Thread MixIn
 import SocketServer

 ECHO_PORT = 23456
 CRLF = '\r\n'
 
 class EchoRequestHandler(BaseRequestHandler):
   def setup(self):
     print "Client connected %s" % self.client_address

   def handle(self):
     while 1:
       text = self.request.recv(1024)

       if not text:
         print "Closed by client"
         break

       if text[0:2] == ':q':
         break

       data_length = self.request.send(text)
       print "recv : %s" % text.strip()
       print "send : %s [%d]" % (text.strip(), data_length)

   def finish(self):
     print "finish"


 class EchoServer(TCPServer):
   def __init__(self, address, port, request_handler):
     TCPServer.__init__(self, (address, port), request_handler)

 if __name__ == '__main__':
   echo = EchoServer("localhost", ECHO_PORT, EchoRequestHandler)
   echo.serve_forever()

[] How to use unittest

  1. import unittest
  2. define a class for test that extends TestCase
  3. override setUp, tearDown method
  4. implement test* methods for test cases
  5. run unittest.main()
 import unittest

 class Person:
   def __init__(self, name):
     self.name = name

   def getname(self):
     return self.name

 class TestPerson(unittest.TestCase)
   def setUp(self):
     self.obj = Person('Tea')

   def tearDown(self):
     del self.obj

   def testGetName(self):
     self.assertEquals(self.obj.getName(), 'Tea')
   

 if __name__ == '__main__':
   unittest.main()

2003-09-08

[]

Python, Ruby, Pike でDesignPatternのBridgeパターンを実装してみた。

C++にも挑戦してみるが、インターフェースの定義で行き詰まる(TODO)

[][] YatAnotherWayToDo ...

 from operator import mul
 
 def fact(num):
   if num < 1: raise ValueError
   return reduce(mul,range(1,num)) 

[] 時間を所得

 string date = ctime(time()) - "\n";

文字列A - 文字列B で、文字列Aの中から文字列Bを取り除ける。

文字列A / 文字列B で、文字列Aを文字列Bでsplitした配列を返す。

2003-09-07 Aspect / Python

[][][] Adapter/Adaptee pattern

pythiusプロジェクトのaop.pyも使ってみたが、

独自の実装でAdapterパターン with AOP

 from types import FunctionType
 from __future__ import nested_scopes
 import sys

 if sys.version_info[0:2] < (2,2):
   sys.exit(1)


 def AdapterTo(adaptee):
   def _implement_new_api(_adapter, adaptee):
     for name,value in _adapter.items():
       if type(value) is FunctionType:
         setattr(_adaptee, name, value)

   def _check_interface(_interface, _adapter):
     for name in _interface.keys():
       if not _adapter.has_key(name):
         raise NotImplementedError(name)

   class _Meta_Adapter(type):
     def __new__(cls, class_name, bases, class_dict):
       # クラス定義読み込み時にInterfaceをチェックする。
       # _check_iterface(bases[0].__dict__, class_dict)

       _implement_new_api(bases[0].__dict__, adaptee)
       _implement_new_api(class_dict, adaptee)

   return _Meta_Adapter


 class Screen:
   """This is Adaptee role class"""
   def outputToStdout(self, msg):
     print msg


 class Printer:
   """This is an interface"""
   def output(self, *args):
     raise NotImplementedError


 class PrinterScreenAdapter(Printer):
   __metaclass__ = AdapterTo(Screen)

   def output(self, msg):
     self.outputToStdout(msg)


 if __name__ == '__main__':
   screen = Screen()
   screen.output("Hello")

AdapterToが、adapteeクラスを引数に取って

Adapteeクラスを拡張するようなメタ・クラスを返す関数。

__new__は、クラス定義時のホック・メソッド。

このメタクラスを__metaclass__に持つクラスが''定義された時''に

__new__が呼び出される。インスタンス生成時に呼び出されるのは __init__

PrintScreenAdapterでは、クラス定義時にメソッドをScreenクラスに

追加している。(インスタンスは作成出来ない)


ここまで書いて疑問が浮かび上がってきた。

  • Adapteeを継承したAdapterを作り、そちらを使ってはいけないの?(デザインパターンではそうしてきた)
  • Python(や、他の動的スクリプト言語)では、メソッドに別名を与える事が出来る。(前の日記で示した通り)

[] C/C++言語ライクな関数

PeterNorvig氏のPython IAQより・・・

他にも EnumやStructの簡単な実装が書かれてあった。

enumは、僕が昨日日記に書いたのとは別の方法だった。

簡単な例では、red,green,blue=range(3)から、

他の例ではクラスを使ってクラスの__dict__に直接読み込む方法まで。

 class Enum:
   def __init__(self, *args, **keywords):
     self.__dict__(**keywords)

__dict__について調べていて解った事:

__dict__はクラスのメソッドに対応する名前と関数(FucntionType)

クラスを dir()して得られるのは、インスタンスメソッド(MethodType)

メソッドの方はオブジェクトを取り出しても、元のクラスのインスタンスを

作らないと呼び出せない。


 import sys

 class ostream:
   def __init__(self, file):
     self.file = file
   def __lshift__(self, obj):
     self.file.write(str(obj))
     return self

 cout = ostream(sys.stdout)
 cerr = ostream(sys.stderr)
 endl = '\n'

 def printf(format, *args):
   print str(format) % args,


 if __name__ == '__main__':
   cout << "Hello" << "World!" << endl
   printf("%d times\n", 10)

[]アキュームレータ

 # let accgen n = let m = ref n in fun x -> m := m!+x; !m;;

2003-09-06 Enum

[] Enum

Pythonで列挙体を生成するユーティリティ関数作ってみた。

コンパイル時に型チェックしない言語/環境では、

その恩恵を受けられないため軽視されがちだけど。

値の生成だけでも欲しくなった。ここでは名前のリストを渡して、

値が適当に重複しない値になっていれば充分。程度の需要なので。

# 動機)wxPythonで リソースID を列挙するのが面倒だった。

 from __future__ import nested_scopes # for python2.1
 from types import ListType

 def enum_factory(func, enum, start):
   if type(enum) is not ListType:
     raise TypeError
   else:
     map(func, enum, range(start, start+len(enum))) 
 
 def import_enum_with_prefix(package, prefix, enum, start=0):
   import_enum(package, map(lambda s:prefix+s, enum), start)

 def import_enum(package, enum, start=0):
   def set_enum(k, v): package[k] = v
   enum_factory(set_enum, enum, start)

 def create_enum_class(enum, start=0):
   class _Enum_Class: pass
   enum_factory(lambda k,v:setattr(_Enum_Class,k,v), enum, start)
   return _Enum_Class

 def create_enum_object(enum, start=0):
   return create_enum_class(enum, start)()


 if __name__ == '__main__':
     enum = ["NAME", "TREE"]
     import_enum_with_prefix(locals(), "ID_", enum, 1)
     print ID_MENU
     print ID_TREE

     obj = create_enum_object(enum, 1)
     print obj.MENU
     print obj.TREE

     class EnumClass(create_enum_class(enum, 1)):
       def menu(self): print self.MENU
       def tree(self): print self.TREE

     obj = EnumClass()
     obj.menu()
     obj.tree()
     

考察:

  • ID_MENU_FOO_BAR と、globals()もしくはlocals() に読み込んでしまうと、名前空間の汚染が心配。prefix付けてれば安全だけど、でもdir() したときにエントリがたくさん表れてしまうのは読みにくい。
  • 辞書を作る。ID["MENU_FOO_BAR"] は、打つのが面倒。[" "]
  • クラスに閉じ込める。ID.MENU_FOO_BARと表記。

2003-09-05 JavaScript

[]

Stringクラスにメソッドを追加する。

 String.prototype.toTwoDigit = function () {
  return (this.length) ? "0".concat(this) : this;
 }

Ruby等の動的なスプリプト言語なら大抵はサポートしてる機能。

Python でプリミティブ型のクラスの拡張どうやってやるのか知らないけど

(TODO 後で調べる。)、クラスに後からメソッドを追加するのは簡単。

Pythonでは、クラスのプロパティに直接代入する、setattr等。

Rubyでは、クラスを再定義するとそのままオーバーライドされるみたい。

JavaScriptでは、prototypeというプロパティを通じてメソッドを定義。

上の例では無名関数を使っているが、

function クラス名.prototype.メソッド名() { } でも定義出来るはず。

2003-09-03 Hello world! Nice

[][]

http://nice.sf.net/

 class Person {
  String : word;
  String : say();
 }

 say(p@Person) {
   return p.word;
 }

 void main(String[] args) {
   let p = new Person(word: "Hello, world");
   System.out.prinln(p.say());
 }

JAVAの拡張だけあって、JAVAで出来ることは殆どすべて出来る。(多分)

実際、niceのコンパイラが生成するのはjavaのclassファイル。

  • Niceのソースファイルの拡張子は .nice
  • main関数は、特定のクラスに属さ無くても良い。
  • class定義の外でクラスのメソッドを追加できる。(dispatch)
  • コンストラクタはない。代わりに名前付パラメータを引数にする。

コンパイルの仕方がちょっと特殊なのでメモしておく。

 # ソース・ディレクトリを作成。
 # 名前は何でも良いが、nice/langがコンパイル時に作られるので、
 # 纏めておくといいかもしれない。分けたい場合は他の名前にする。
 > mkdir -p nice/my/program

 # ソースの作成/保存
 vi ./nice/my/program/Person.nice

 # コンパイル
 > nicec --source-path=nice my.program

 # jarファイルの作成
 > nicec --source-path=nice -a program.jar my.program

 # 実行(javaと同じ)
 > java -jar program.jar

続きを読む

2003-09-02

[] types and subtypes

 type Hours24 is new Integer range 0 .. 23;
 type Hours is new Integer range 1 .. 12;

Hours24 and Hours are different types.

You can not assignment Hours's var to Hours24 variables.

 type Hours24 is new Integer range 0 .. 23;
 subtype Hours is Hours24 range 1 .. 12;

Hours is subtype of Hours24.

You can assignment those variables, overwise

Can not over the range.

 a : Hours24 := 13;
 b : Hours24 := 15;
 c : Hours := 5;
 a := c; -- OK
 b := a; -- OK
 c := a; -- Error, out of the range

----

I had for gotten to set 'umask 022' when I changed a shell.

All directories I made recentlly are allowed group user to write.

'find ./target_dir -type d -exec chmod g-w {} \;' to fix it.

overwise, I had mistook that was I had changged files permission.

Now I think about security policy of them.

I just fixed my cvs repository

chmod 0664

- CVSROOT/history

- CVSROOT/val-tag

That may have other problems.

2003-09-01 Hello world ! Ada / LOGO

[][]

hello.adb

 with Text_IO; use Text_IO;

 procedure Hello is
 begin
   Put_Line("Hello, world");
 end Hello;
 > gnatmake hello

前々からコードは読んでいたけど、コンパイルの仕方がわからなかった。

gnatmakeを使うと簡単に出来るらしい。ファイル名は拡張子 .adbで保存。

(Ada body)、Spec ファイルの拡張子は .ads(Cのヘッダの様なもの)。

言語はパスカル・ライクで覚えやすそう。

言語の系統を辿るとALGOLからの派生だから当然かな。

Adaで面白そうなところは、ファイル名に命名規則があったり、タスク、

平行処理と言った所かな。

後、型の情報がコンパイル時に決定されてチェックが厳格な事。

例えば、再帰関数で終了条件のない関数なんかは、

コンパイル時に警告される。

[][]

 print "Hello\ world
 label "Hello\ world

print だとコンソールに、labelだとキャンバスの方に文字を描写する。

aptのパッケージにあった、バークレイのLOGOを使ってみたんだけど、

ウィンドウ重ねると線が消えてしまうのはバグだろうか?それとも仕様?