2007-07-21
■[Life]自宅の鍵を忘れた
自宅の鍵を京田辺の研究室の机の中に入れたまま、忘れて帰ってきてしまった。。。
気付いたのは出町柳の自宅の前、、遅いって!気付け、俺!!
もー23時とかだし、レポートしなきゃいけないし、どうしようかなーと思っていたら、入居のときに安心サポートとかいうのに入っていたのを思い出した。
‥が、「ディンプルキーにサムターン回し防止カバーがしてあるものは開けられません」とな。意味ないなー。
ホテルの宿泊費を補償してくれるとは言ってくれたけど、どうせ朝には鍵取りに研究室行かないといけないので、結局研究室に戻ってレポートの続きしました。
2日連続泊まりとか、普通にしんどい。もう嫌だorz
これからは寒梅館のロッカーにスペアキー入れとこ。。。
2007-07-15
■[Development]Railsはproductionモードで運用するべき
あまり日本語で書かれた文献がなかったのでメモ。
Ruby on Railsはdevelopment、test、productionの3つのモードで動作します。
それぞれの名前の通り、developmentは開発モード、testはテストモード、productionは運用モードになります。
Railsを使っている皆さん、これらのモードはそれぞれデータベースを切り替えるだけだと思っていませんか??
実は違います。
それぞれのモードで、Webアプリケーションの挙動が異なります。
実は、あるWebアプリケーションを先日までdevelopmentモードで運用していました。
そしたら、サーバのメモリがどんどん減っていくんですよね。
そして、残り数十MBになったメモリの減少は止まるのですが、そのWebアプリケーションが起動しなくなりますw
理由は、developmentモードでは、HTTPリクエストがある度にサーバ側でControllerのインスタンスを生成するから。
開発時にはソースコードを頻繁に修正するわけで、その修正を即座にアプリケーションに反映させるためにはリクエストの度に新しいインスタンスを作らなければ無理、、ということで、こういう仕様になってます。
productionモードでは、サーバ起動時に生成したインスタンスオブジェクトを使い回すので、何度リクエストがきてもメモリは減りません。
その代わり、productionモードではソースコードを修正してもその変更はWebサーバを再起動するまで反映されません。
ということで、皆さん、Railsアプリケーションの運用時には必ずproductionモードを使いましょう。
僕みたいに横着すると、メモリがどれだけあっても足りずサーバが死にます。
たった2GB程度のメモリなんて、あっという間に食い尽くされてしまいますw
開発中はdevelopmentモードなので、開発用マシンの動作が段々と重くなっていきます。
そういうときは、そのPCを再起動してみるとリークしていた部分が開放されるので反応速度が元に戻ります。
ちなみに、developmentモードとproductionモードで一部メソッドの挙動が変化しますw
例えば、datetime Helperとか。。。
developmentモードの意味ないじゃんww
【関連情報】
2007-07-12
■[Development]Tracに新しいプロジェクトを追加するときのコマンド
うちの研究室ではプロジェクト管理 & バグトラッキングツールにTracを利用しています。
引継ぎのこともあるので、新しいプロジェクトを作成するときのコマンドをメモしておきます。
[project]とか[user]とか[password]とかは、その時々に応じて具体的に書き換えてください。
結構設定とか適当だったりするので(汗)、必要に応じて改変してください。
# svnadmin create --fs-type fsfs /srv/svn/[project]
Basic認証の場合 → # htpasswd -bcm /srv/svn/[project]/.htpasswd [user] [password]
Digest認証の場合 → # htdigest -c /srv/svn/[project]/.htdigest [relm] [user] → パスワード入力
# trac-admin /srv/trac/[project] initenv → プロジェクト情報を入力
# trac-admin /srv/trac/[project] permission remove anonymous BROWSER_VIEW CHANGESET_VIEW CONFIG_VIEW GANTT_VIEW FILE_VIEW LOG_VIEW MILESTONE_ADMIN MILESTONE_CREATE MILESTONE_DELETE MILESTONE_MODIFY MILESTONE_VIEW REPORT_ADMIN REPORT_CREATE REPORT_DELETE REPORT_MODIFY REPORT_SQL_VIEW REPORT_VIEW ROADMAP_ADMIN ROADMAP_VIEW SEARCH_VIEW TICKET_ADMIN TICKET_APPEND TICKET_CHGPROP TICKET_CREATE TICKET_MODIFY TICKET_VIEW TIMELINE_VIEW TRAC_ADMIN WIKI_ADMIN WIKI_CREATE WIKI_DELETE WIKI_MODIFY WIKI_VIEW
# trac-admin /srv/trac/[project] permission add authenticated BROWSER_VIEW CHANGESET_VIEW CONFIG_VIEW GANTT_VIEW FILE_VIEW LOG_VIEW MILESTONE_CREATE MILESTONE_DELETE MILESTONE_MODIFY MILESTONE_VIEW REPORT_CREATE REPORT_DELETE REPORT_MODIFY REPORT_SQL_VIEW REPORT_VIEW ROADMAP_VIEW SEARCH_VIEW TICKET_APPEND TICKET_CHGPROP TICKET_CREATE TICKET_MODIFY TICKET_VIEW TIMELINE_VIEW WIKI_CREATE WIKI_DELETE WIKI_MODIFY WIKI_VIEW
trac-admin /srv/trac/[project] permission add ynakamura GANTT_ADMIN MILESTONE_ADMIN REPORT_ADMIN ROADMAP_ADMIN TICKET_ADMIN TRAC_ADMIN WIKI_ADMIN
# vim /srv/trac/[project]/conf/trac.ini
# -*- coding: utf-8 -*- [account-manager] htdigest_realm = [project] password_file = /srv/svn/[project]/.htdigest password_store = HtDigestStore [attachment] max_size = 262144 render_unsafe_content = false [browser] downloadable_paths = /trunk, /branches/*, /tags/* hide_properties = svk:merge [changeset] max_diff_bytes = 10000000 max_diff_files = 0 wiki_format_messages = true [header_logo] alt = height = -1 link = http://example.org/ src = common/trac_banner.png width = -1 [logging] log_file = trac.log log_level = DEBUG log_type = file [mimeviewer] enscript_modes = text/x-dylan:dylan:4 enscript_path = enscript max_preview_size = 262144 mime_map = text/x-dylan:dylan,text/x-idl:ice,text/x-ada:ads:adb php_path = php silvercity_modes = tab_width = 8 [notification] always_notify_owner = false always_notify_reporter = false always_notify_updater = true mime_encoding = base64 smtp_always_bcc = smtp_always_cc = smtp_default_domain = smtp_enabled = false smtp_from = trac@localhost smtp_password = smtp_port = 25 smtp_replyto = trac@localhost smtp_server = localhost smtp_subject_prefix = __default__ smtp_user = use_public_cc = false use_short_addr = false use_tls = false [project] descr = [project] footer = Visit the Trac open source project at<br /><a href="http://trac.edgewall.org/">http://trac.edgewall.org/</a> icon = common/trac.ico name = [project] url = [server url] [search] min_query_length = 3 [ticket] default_component = default_milestone = default_priority = major default_type = defect default_version = restrict_owner = false [ticket-custom] dependencies = text dependencies.label = 依存タスクNo dependencies.value = due_assign = text due_assign.label = 開始予定日 due_assign.value = YYYY/MM/DD due_close = text due_close.label = 終了予定日 due_close.value = YYYY/MM/DD include_gantt = checkbox include_gantt.label = ガントチャートに載せるか否か include_gantt.value = [timeline] changeset_long_messages = false changeset_show_files = 0 default_daysback = 30 ticket_show_details = false [trac] authz_file = authz_module_name = base_url = check_auth_ip = true database = sqlite:db/trac.db default_charset = iso-8859-15 default_handler = WikiModule htdocs_location = ignore_auth_case = false mainnav = wiki,timeline,roadmap,browser,tickets,newticket,search metanav = login,logout,settings,help,about permission_store = DefaultPermissionStore repository_dir = /srv/svn/[project] repository_type = svn timeout = 20 [wiki] ignore_missing_pages = false split_page_names = false# vim /etc/httpd/conf.d/subversion.conf
LoadModule dav_svn_module modules/mod_dav_svn.so LoadModule authz_svn_module modules/mod_authz_svn.so [...] <Location /repos/[project]> DAV svn SVNPath /srv/svn/[project] AuthType Digest AuthName [project] AuthDigestProvider file AuthUserFile /srv/svn/[project]/.htdigest Require valid-user # Limit write permission to list of valid users. #<LimitExcept GET PROPFIND OPTIONS REPORT> # Require SSL connection for password protection. # SSLRequireSSL #</LimitExcept> </Location> [...]# service httpd restart
さて、来年のサーバ管理は誰が何台引き継ぐのか…w
【関連情報】