Sunday, April 20, 2008

The Joel Test

Компанийн болц, царааг хэмжих CMMI нэртэй модель байдаг. Нийт таван төвшинтэй ба эдгээр бүрт хатуу заасан босго, хэмжигдхүүнтэй. Судлая гэвэл нь нуршуу ном нэлээд хэдийг унших хэрэгтэй болно, үүний оронд J.Spolsky-ийн "The Joel Test"-ийг сонирхвол нь, ямарав? Орчуулан хүргэхийг зорьлоо ;)

SEMA гэж сонсож байсан уу? Софтвэрийн багийг хэр сайн бэ гэдгийг хэмжих нэг төрлийн систем юм л да. Жаахан азна анд минь, юу юугүй гүүглэдэж, үүний талаар судлах гээд хэрэггүй. Учир нь SEMA-г ойлгоход лавтай 6 жил зарцуулна. Үүний оронд миний зохиосон гайгүй далий тестийг сонирхвол... Гурван минут л хангалттай.

The Joel Test
  1. Та соорс контроль ашигладаг уу?
  2. Нэг алхмаар та бийлд хийж чаддаг уу?
  3. Танайх өдөр бүр бийлд хийдэг үү?
  4. Танайх алдаа бүртгэлийн баазтай юу?
  5. Алдаагаа засаж байж шинээр код бичдэг эсэх?
  6. Төслийн төлөвлөлт(schedule) тань яв тав шинэчилэгдэж байдаг уу?
  7. Танд спек байна уу?
  8. Програмчид тань нам чимээгүй орчинд ажилладаг уу?
  9. Боломжит бүх багаж хэрэгслийг та ер нь ашигладаг уу?
  10. Танайд тестерүүд бий юу?
  11. Ажил горилогчоор код бичүүлж шалгалт авдаг эсэх?
  12. Програмын ашигт үйлийн тест хийдэг үү?


Энэ сорилд тийм/үгүй гэсэн хариулт л хангалттай, дажгүй байгааз? Өдөрт хичнээн мөр код бичигдэв, нэг фаазад хэдэн алдаа бүртгэгдэв энэ тэр бузгай том тооцоо огтоос хэрэггүй. Ердөө л "Тийм" бүрт 1 оноо өг, тэгээд л гүйцээ.

12 оноо авсан бол төгс, 11 бол боломжийн, харин доошоогоо гэцүү. Үнэндээ, ихэнхи компаниуд 2, 3-ын төвшинд л туудаг, тиймдээ ч асуудал ихтэй байхад Microsoft мэт нь үргэлж 12-той намбалзаж байх жишээтэй.

Мэдээжээр, дээрх шалгуураар амжилт/уналтыг яв цав тодорхойлно гэж байхгүй. Хэрэв танд сайн баг байлаа гээд, хэнд ч хэрэггүй програм бичиж байгаа бол, гарсан бүтээлийг тань хэрэглэгчид худалдаж авах нь юу л бол. Нөгөөтэйгүүр эдгээрээс нэгийг ч хэрэгжүүлдэггүй боловч захын бачканууд дэлхийг донсолгосон мундаг програм бичээд тавьчихыг үгүй гэх газаргүй. Ер нь энэ бүхний голч, эдгээр 12 шалгуурыг зөв зохистой ашиглавал, танайх санасандаа сарвайдаг, сарвайснаа авдаг мундаг баг болно.


Орчуулга хийгдэж байна....
Үргэлжлүүлэн орчуулахгүй ч байж магад. Хүргэх хамгийн гол санаа дээрх саарал цонхонд байна л да, уул нь. Энэ тест бүхлээрээ J.Spolsky-ийн "Smart and Gets Things Done" нэртэй номонд бий. Ном нь сонирхолтой, мундаг егөөтэй.

Tuesday, April 15, 2008

Rails-ийг Oracle-тай холбох нь

Нэлээдгүй өндөр ачаалалд, яг таг ажиллах ёстой веб програм хийх хэрэгцээ гарсан тул богино хугацаанд, чанартайхан бүтээл гаргаж болохоор хөгжүүлэлтийн хөрс сонгох хэрэгтэй боллоо. RoR-ийн талаар өмнө сонирхож, номны ганц хоёр хуудас эргүүлснээс бус амьдралд хэрэглэгдсэн бодьтой зүйл хийж байсангүй. Ямартай ч мундаг динамик боломжтой Ruby хэлээр, convention over configuration паттерныг барьж хийсэн, сүүлийн үед хүчээ авч яваа хөгжүүлэлтийн суурь юмаа гэдгийг гадарлаж байгаам.

Үүссэн Rails програмыг Oracle баазтай холбох гээд хагас өдөр зарцуулчихсан тул эндээс мэдсэн зүйлээ хэрэгтэй хүнд нь хөтөч болгон бичиж үлдээх нь зүйтэй гэж үзлээ. Таныг аль хэдүйн баазаа тохируулж, rails програмынхаа скелетоныг үүсгэсэн гэж бодож байна. Бидний тохиолдолд баазыг өөр машинд суулгасан. Алдарт scott/tiger-ийн баазыг жишээгээр авлаа.

Шаардлагатай багцууд:
  1. ruby-oci8, Oracle баазтай холбогдох ruby интерфэйс
  2. activerecord-oracle-adapter
  3. Oracle instant client
Багцуудыг суулгах нь:
  1. ruby-oci8
    Виндовз хэрэглэгчид ruby-oci8-1.0.0-mswin32.rb файлыг татаж аваарай. Доорхи байдлаар хялбархан сууж байна:

    C:\>ruby ruby-oci8-1.0.0-mswin32.rb
    Copy OCI8.rb to c:/ruby/lib/ruby/site_ruby/1.8/DBD/OCI8
    Copy oci8.rb to c:/ruby/lib/ruby/site_ruby/1.8
    Copy oci8lib.so to c:/ruby/lib/ruby/site_ruby/1.8/i386-msvcrt
    OK?
    Enter Yes/No: yes
    Copying OCI8.rb to c:/ruby/lib/ruby/site_ruby/1.8/DBD/OCI8 ... done
    Copying oci8.rb to c:/ruby/lib/ruby/site_ruby/1.8 ... done
    Copying oci8lib.so to c:/ruby/lib/ruby/site_ruby/1.8/i386-msvcrt ... done
    OK
    C:\>

  2. activerecord-oracle-adapter
    Oracle адаптерийг gem ашиглан суулгах нь хялбар аж:

    C:\>gem install activerecord-oracle-adapter --source http://gems.rubyonrails.org
    Bulk updating Gem source index for: http://gems.rubyonrails.org/
    Bulk updating Gem source index for: http://gems.rubyonrails.org/
    Successfully installed activerecord-oracle-adapter-1.0.0.9216
    1 gem installed
    C:\>

  3. Oracle instant client
    Татсан програмаа хаа нэг эвтэйхэн газар задлаж орхи. Эндээс oci.dll, oraociei11.dll файлуудыг хайж олоод Windows\System хавтаст хуулна. Хамаг цагаа үүнийг мэдээгүйгээс барсан байгаам. За тэр болоод өнгөрч, одоо Ruby интерфэйс бэлэн болсон байх учиртай, шалгаж үзье:

    C:\>ruby -r oci8 -e "OCI8.new('scott', 'tiger','//<db-host-address>:1521/<sid>').exec('select * from emp') do |r| puts r.join(','); end"

    7369,SMITH,CLERK,7902,1980/12/17 00:00:00,800.0,,20
    7499,ALLEN,SALESMAN,7698,1981/02/20 00:00:00,1600.0,300.0,30
    7521,WARD,SALESMAN,7698,1981/02/22 00:00:00,1250.0,500.0,30
    7566,JONES,MANAGER,7839,1981/04/02 00:00:00,2975.0,,20
    7654,MARTIN,SALESMAN,7698,1981/09/28 00:00:00,1250.0,1400.0,30
    C:\>
    Yes!!!, хэвийн ажиллаж байна.


database.yml
Oracleтай холбогдох интерфэйсүүд бэлэн болсон тул, одоо веб програмынхаа баазын тохиргоог хийе. Дараахи байдлаар хийхэд хангалттай:
config/database.yml
# Oracleтай холбох нь.
development:
    adapter: oracle
    database: <db-host-address>/<sid>
    username: scott
    password: tiger

Одоо веб програмаа эхлүүлээд, браузерт нээвэл дараахи мэдээлэл гарч байх учиртай:


Бүх зүйл хэвийн, иймд emp нэртэй баазын модель үүсгэе:
ruby script\generate model emp
Rails баазад маань emps нэртэй хүснэгт байгаа гэж автоматаар ойлгоно. Гэтэл scott-ийн баазад emp нэртэй л хүснэгт байгаа шүү дэ? emp моделийг emps бус emp хүснэгттэй яаж уях вэ? Дараахи байдлаар хүснэгийн нэрийг дахин тодорхойлж болно:
app/model/emp.rb
class Emp < ActiveRecord::Base
    set_table_name "scott.emp"
end

Үүний дараагаар index хуудас(action) үзүүлэх scott нэртэй контроллёр үүсгэе:
ruby script\generate controller scott index

index хуудсанд emp хүснэгтийн мэдээллийг харуулъя. Ингэхийн тулд scott_controller-ийг дараахи байдлаар бичээд үз:
app/controllers/scott_controller.rb
class ScottController < ApplicationController
    def index
        @emps = Emp.find(:all)
    end
end

Одоо presentation layer буюу татсан мэдээллээ дэлгэцэнд байршуулах index файлыг боловсруулъя:
app/views/scott/index.rhtml
<h3>Ажилчид</h3>
<table border="1">
  <tr>
    <%names = Array.new;
      Emp.column_names.each{ |name| names << name;
    %>
      <%="<th>#{name}</th>"%>
    <%}%>
  </tr>
  <%for emp in @emps%>
  <tr>
    <%for name in names%>
      <td><%=eval("emp.#{name}")%> </td>
    <%end%>
  </tr>
  <%end%>
</table>

Одоо хийсэн ажлаа шалгая. Броузерт: http://127.0.0.1:3000/scott гэж бичээд үзнэ үү. Доорхитой ижил үр дүн гарч байна уу?

За ингээд бид зорьсондоо хүрлээ. Доорхи линкүүд танд хэрэг болж юу магад вэ, гүйлгээд харна биз:

Нэмэлт:
config/environment.rb файлд
ENV['NLS_LANG']='american_america.AL32UTF8'
мөрийг нэмж өгөөрэй. Одоо Oracle-аас монгол(UTF-8) текстүүд асуудалгүй татагдах болно.