アーカイブ

‘develop’ タグのついている投稿

blogのジレンマ

2009 年 12 月 28 日 コメントはありません

たとえば…プログラミングでいいや.
今,俺が頻繁にコーディングしているもののうち,プロジェクトと呼べるようなもの(と言ってもComitterは1~3人だけど)は3つ.
個性を抽出しながら情報を収集するアグリゲータ,Railsで作ったiPhone向け家計簿,Web上で人工知能と対話しながら描けるマインドマップエディタ.
# 昨日,もう一個増えた.移行が容易な同窓会Webサービス.
ところが,これらについてblogを書くことはほとんどない.
書こうとするモチベーションがないわけじゃない.
書き始めたとしても,blogというメディアにそぐわなくて途中であきらめてしまう.
実際,他の人のblogを漁ってもある程度以上の規模になると急に少なくなる.
開発日記的blogですら,最初こそコードを載せていても途中で成果としての機能説明だけになって,その裏でどんなノウハウが培われているかは途端に見えにくくなる.
よく見かけるのは「#01 x分ではじめる!yyyy!これであなたもzzz!」のような連載スタイル.
一見良さげ.
ところが,連載ものでもIoCやテンプレートエンジンのような”構造”が意味をなす話に当てはめられると非常に読みにくい.
個人的にも最近はGlue言語での解決が好きだったりするので,ある程度の規模とその全体像が常に傍らにないと何も語れない.
一方でスニペットレベルの技術検証的なコードや小道具レベルのツールについては書きやすい.
たぶん,執筆コストと得られる見込み対価がちょうど良いんだろう.
続きを読む…

カテゴリー: Uncategorized タグ: , , , ,

辞書でOOP

2009 年 7 月 27 日 コメントはありません

 西尾さんのJythonプログラミング,第5章より.
読んでいてもいまいちピンとこなかったので,写経してみた.

# -*- coding:utf-8 -*-
#!/usr/bin/env python

#from __future__ import nested_scopes

# 初期化
def __init__(self, cartype):
    self["count"] = 0
    self["cartype"] = cartype

# EntryPoint(実質のテストメソッド)
def main():
    Counter = {"__init__": __init__, "push": push}
    counter = instanciate(Counter, "Ferrari")
    for i in range(10):
        get_attr(counter, "push")()

    RedCounter = extend([Counter], {"push": red_push})
    counter = instanciate(RedCounter, "Ferrari")
    for i in range(10):
        get_attr(counter, "push")()

# 実体化
def instanciate(class_, *args):
    ins = {}
    ins["__class__"] = class_
    #get_attr(ins, "__init__")(ins, *args)
    get_attr(ins, "__init__")(*args)
    return ins

# 継承
def extend(base_classes, new_attrs):
    new_class = {"__bases__": base_classes}
    new_class.update(new_attrs)
    return new_class

# クラス属性の検索
def get_attr_from_class(class_, name):
    if class_.has_key(name):
        return class_[name]
    elif class_.has_key("__bases__"):
        for base_class in class_["__bases__"]:
            try:
                value = get_attr_from_class(base_class, name)
                return value
            except:
                pass
    raise AttributeError("no attribute '%s'" % name)

# インスタンス属性の検索
def get_attr(ins, name):
    if ins.has_key(name):
        result = ins[name]
    else:
        #result = ins["__class__"][name]
        result = get_attr_from_class(ins["__class__"], name)

    if callable(result):
        def wrapped_method(*args):
            return result(ins, *args)
        return wrapped_method
    else:
        return result

# 適当なメソッド其の壱(ex. 計数機)
def push(self):
    self["count"] += 1
    print self["count"], self["cartype"]

# 適当なメソッド其の弐(ex. 3倍早い計数機)
def red_push(self):
    self["count"] += 3
    print "red", self["count"], self["cartype"]

if __name__ == '__main__':
    main()

ふむふむ.
複数の属性をまとめ上げることがオブジェクト指向の目的なのだとすれば,確かにClassは要らない.
今までJavascriptなどのプロトタイプ的継承が「気持ち悪いなぁ」と思っていたんだけど,
上記を写経してみて,腑に落ちた.
PythonやってるとPythonそのものより多言語の理解が進むことが多い.

下記も参考になった.

Python で自前の class を作るとき、メソッドの第一引数がそのクラスのインスタンスそれ自身 (一般に self と書かれる) であることの理由を説明することです。

他の言語ではメソッドを定義するときに第一引数をインスタンスにするという方法は取り入れておらず、 this などの予約語を使ってインスタンスを表すのが一般的です。 Python だけが、独自の流儀をとっています。 しかし、このことを説明したサイトは見当たりませんでした。 どのサイトもそれは決まりごとだで済ませてしまっています。 しかし、それではどうも Python のクラスシステムを理解した気になれないので、Python でクラスシステムが どのように実装しているか推測しながら、例の self について説明したいと思います。

via: Python のクラスシステム

カテゴリー: Uncategorized タグ: , ,

GP2Y0A21 + Arduino

2009 年 7 月 6 日 コメントはありません

Arduino Duemilanove 328を買ってみた.

手始めに秋月電子で400円の測距センサーGP2Y0A21を弄ってみる.
さんざん手垢のついた話だと思ったんだけど,ググってもあまり出てこなかったので,一応まとめとく.

なるべくベーシックにつなぐ.

GP2Y0A21

GP2Y0A21

ソースもベーシックに書く.

// for GP2Y0A21
// Author: bellonieta
#define R 0.0048828125
void setup() {
  Serial.begin(57600);
}
void loop() {
  unsigned int val = analogRead(2);
  double d = 28.966 * pow(val * R, -1.1744);
  Serial.print(val);
  Serial.print("\t: ");
  Serial.print(d);
  Serial.println(" cm");
  analogWrite(11, val / 4);
}

続きを読む…

カテゴリー: Uncategorized タグ: , , , ,

New Relic

2009 年 5 月 20 日 コメントはありません

自作家計簿New Relicを導入した.
New RelicはRailsのPerformance Managemerで,PhotoShareでも有名な増井氏のblogで知った.
# masuidrive on railsはRails以外にIKEA HACK的な記事などもあって,読み物としても非常に面白い.
ローカルで開発しているときは気にならなくても,海外VPSにデプロイしてから遅さを感じることが多々あって,それがネットワークに起因するものなのかリソース(と言うかコードの効率)に起因するものなのかを切り分けたかったから.

と言うことで,増井氏が記事にされたdevelopment環境でなく,production環境の測定をLite版で.
導入手法は動画で丁寧に解説されているので,簡単.
設定ファイル(= newrelic.yml)もほとんど弄らずに使用.
続きを読む…

カテゴリー: Uncategorized タグ: , , , , ,

before_filter :login_requiredでテスト失敗

2009 年 4 月 17 日 コメントはありません

市況の煽りもあって(?),個人的に家計簿サービスを作っていて,
まぁ,いわゆるCRUDサービスだし,Railsで良いかと思って,
かと言って,ただRailsしてもつまらんし,現在最新の2.3.2で行こうと.
以前,会社で資産管理システム作って以来だから,全然わからん.

で.基本的な入出金入力とか一覧はできて,
そろそろ自分でもソースが把握しきれなくなりそうだったので,
テストケースを導入.
ところが,Restful Authenticationで困ってしまった.

# GET /cash_flows/1
# GET /cash_flows/1.xml
def show
  @cash_flow = CashFlow.find_by_id_and_user_id(params[:id], current_user.id)
    unless @cash_flow
      flash[:notice] = "You don't have permission to show #" + params[:id] + "!"
      redirect_to cash_flows_url
      return false
    end

とかやっている場所で,全部エラー.
そりゃそうだ.
だって,

class CashFlowsController < ApplicationController
  before_filter :login_required
# 中略
end

ってやってるんだもんよ.
こういう時,どうすりゃいいんだろ.
ごり押しで解決できないことはないけど,そういうのRailsらしくない.
絶対,楽に解決できる方法があると思うんだよな.