2008年12月23日火曜日

ノートPCの電池劣化

ずっと MacBook をAC 接続で使ってきたけど、
最近はあえてバッテリー駆動させている。

理由は、満充電で放置すると劣化するという情報があったため。

リチウムイオン電池を上手に使う方法 バッテリー-ベイサン

劣化の要因はサイクルの他に、ほぼ満充電状態での長期保存という条件が加わります。この保存は温度条件によっては大きな劣化をもたらします。

でも充放電のサイクルも劣化要因だから、
バッテリー駆動は満充電の放置と比べて悪化するかもしれない。

そこで、現在のバッテリーの劣化状態を調べたいのだが、
詳細情報を取得できるフリーソフトを見つけた。

Yuryu's Battery Information


今はこんな状態ってことがわかった。

電圧:11237 mv
設計:50200 mWh
フル:45290 mWh

満充電が 90% 程度になっているみたい。
1 年ぐらい使ってるのに予想よりも良い状態。

もしかして、AC 接続で使うほうが良いのかな。。。
しばらくバッテリー駆動で観察するか。

2008年12月14日日曜日

andlinuxインストール(一般ユーザ+8.04+日本語)

ちょっと流行は過ぎた感じだけど andlinux を試してみた。
感想としては、かなり使える。
便利。簡単。単に使うだけなら、インストーラだけで十分。
VMware も良いけど、手軽にここまで出来る andlinux に
少しびっくりした。

これでカーネルのバージョンアップが早ければ。。惜しい。

勉強用ってことで、いろいろ設定してみる。
少しネット上の情報が散らばっているので、
メモとして駆け足の手順を残しておく。

#よく考えると 8.04 にする必要はなかったけど。


1. andlinux インストール

http://www.andlinux.org/downloads.php

基本デフォルトのまま。
サービスで起動するので、起動後にすぐ使えるようになる。
普段使わなくてメモリが気になりだしたら、
サービスのスタートアップの種類を手動に変えることにする。
Windows File Access は COFS を選択。
#なんか 8.04 にすると問題があるらしいので。

2. ルートにパスワードを設定
# passwd

3. ユーザ追加
参考
---------- linux -----------
# useradd -m foo
# passwd foo
# apt-get install sudo
# vim /usr/bin/X11/startwindowsterminalsession
root を foo に変更
# vim /etc/sudoer
下記を最後に追記
foo ALL=(ALL) ALL
# vim /usr/local/sbin/launcher.pl
81 を 8081 に変更
# vim /etc/fstab
修正前:
/dev/cofs0 /mnt/win cofs defaults 0 0
修正後:
/dev/cofs0 /mnt/win cofs defaults,uid=1001,gid=100 0 0
# su foo
$ chsh
入力 ----> /bin/bash

---------- Windows -------------
下記を foo.reg として保存。ダブルクリック。

-- ここから
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\andLinux\Launcher]
"IP"="192.168.11.150"
"Port"=dword:00001f91
-- ここまで


$ sudo shutdown -r now

4. Ubuntu 8.04 にアップグレード
$ sudo apt-get install update-manager-core

proxy が必要なら
$ export http_proxy=http://user:password@my.proxy.server:port/
$ export ftp_proxy=http://user:password@my.proxy.server:port/

$ sudo do-release-upgrade
$ sudo vim /etc/rc.local
下記を追記 (exit 0 の前が良いかな?)
/usr/bin/X11/startwindowsterminalsession &

5. 日本語設定
$ sudo apt-get install language-pack-ja ttf-vlgothic scim scim-anthy scim-bridge-client-gtk scim-bridge-client-qt

$ sudo dpkg-reconfigure locales
$ sudo update-locale LANG=ja_JP.UTF-8
$ sudo dpkg-reconfigure tzdata
Asia -> Tokyo

$ sudo vim /etc/profile
下記を追記
export GTK_IM_MODULE=scim-bridge
export QT_IM_MODULE=scim-bridge

KDE 版なら追加で
$ sudo apt-get install language-pack-kde-ja

$ sudo shutdown -r now

注意:
Ctrl-Space で SCIM のパネルが出るが、タスクバーの下にある(見えない)。
タスクバーを横に置くか隠すかして、パネルを取り出す。

2008年11月20日木曜日

分布数え上げソート

BWT(またはブロックソーティング)の解説で、
分布数え上げソートを初体験。

バゲットソートと似ているが、要素の重複が OK なアルゴリズム。
ぱっと見では、なんでソートされるのか直感的に理解できなかったけど、
この絵である程度掴めた。

まだまだ知らないアルゴリズムがあるんだなぁ。。。

2008年8月26日火曜日

今日の.emacs(カスタマイズ重視風)



(ffap-bindings) ;find file at point
(global-set-key "\M-/" 'hippie-expand) ;補完を強力に

(require 'dired-x) ;dired を拡張
(autoload 'wdired-change-to-wdired-mode "wdired") ;dired で簡単リネーム
(define-key dired-mode-map "r" 'wdired-change-to-wdired-mode)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 検索強化
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;; F3 でカーソル下の単語を検索(vim のまね、F4 で逆向き検索)
(defvar my-search-key-forward [f3])
(defvar my-search-key-backward [f4])
(defvar my-isearch-repeated nil)

(defun my-isearch-symbol (&optional repeat backward)
(interactive "p")
(and (eq repeat 1)
(let ((wd (thing-at-point 'symbol)))
(when wd
(let ((rq_wd (regexp-quote wd)))
(isearch-update-ring
(concat (if (string= (substring rq_wd 0 1) "_")
"\\W" "\\<")
rq_wd
(if (string= (substring rq_wd -1) "_")
"\\W" "\\>"))
t)))))
(cond (backward
(setq my-isearch-repeated 'backward)
(isearch-backward t))
(t
(setq my-isearch-repeated 'forward)
(isearch-forward t)))
(setq my-isearch-repeated nil))

(defun my-force-repeat ()
(cond ((eq my-isearch-repeated 'forward)
(isearch-repeat-forward))
((eq my-isearch-repeated 'backward)
(isearch-repeat-backward))))

(add-hook 'isearch-mode-hook 'my-force-repeat)

(global-set-key my-search-key-forward 'my-isearch-symbol)
(global-set-key my-search-key-backward (lambda (&optional repeat)
(interactive "p") (my-isearch-symbol repeat t)))
(define-key isearch-mode-map my-search-key-forward
(lambda ()
(interactive)
(and (not isearch-forward) (isearch-repeat-forward))
(isearch-repeat-forward)))
(define-key isearch-mode-map my-search-key-backward
(lambda ()
(interactive)
(and isearch-forward (isearch-repeat-backward))
(isearch-repeat-backward)))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; フォント設定
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(defun my-set-assoc-data (list key value)
;; リストに既に同じキーがあれば上書き、無ければ新規追加
(let ((item (assoc key (symbol-value list))))
(if item
(setcdr item value)
(add-to-list list (cons key value)))))

(defun my-set-font (ascii-font jis-font size mul)
;; フォント設定
;; ascii フォント、和文フォント、サイズ、倍率の順に指定する。
(create-fontset-from-ascii-font
(concat "-*-" ascii-font "-normal-r-normal-normal-"
(int-to-string size) "-*-*-*-*-*-iso8859-1")
nil
(concat ascii-font (int-to-string size)))

(let* ((encoded (encode-coding-string jis-font 'emacs-mule))
(family (concat encoded "*"))
(fontset (concat "fontset-" ascii-font (int-to-string size))))

(set-fontset-font fontset 'japanese-jisx0208
(cons family "jisx0208-sjis"))
(set-fontset-font fontset 'katakana-jisx0201
(cons family "jisx0201-katakana"))

(my-set-assoc-data 'face-font-rescale-alist (concat ".*" encoded ".*") mul)
(my-set-assoc-data 'default-frame-alist 'font fontset)
(set-frame-font fontset)))

;; 倍率は全角と半角の比率を調整する。サイズによって最適値は異なる。
(my-set-font "Consolas" "メイリオ" 15 1.1)
;(my-set-font "Consolas" "メイリオ" 14 1.2)
;(my-set-font "Courier New" "MS ゴシック" 14 1.2)
;(my-set-font "MS ゴシック" "MS ゴシック" 14 1.0)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


(custom-set-variables
;; custom-set-variables was added by Custom.
;; If you edit it by hand, you could mess it up, so be careful.
;; Your init file should contain only one such instance.
;; If there is more than one, they won't work right.
'(c-default-style (quote ((c-mode . "linux") (java-mode . "java") (awk-mode . "awk") (other . "gnu"))))
'(column-number-mode t)
'(cua-mode t nil (cua-base))
'(cua-paste-pop-rotate-temporarily t)
'(current-language-environment "Japanese")
'(dired-recursive-copies (quote always))
'(dired-recursive-deletes (quote always))
'(grep-find-template "find . <X> -type f <F> -print0 | xargs -0 -s32000 grep -nH -e <R> ")
'(iswitchb-mode t)
'(mouse-wheel-scroll-amount (quote (1 ((shift) . 1) ((control)))))
'(partial-completion-mode t)
'(read-file-name-completion-ignore-case t)
'(recentf-mode t)
'(save-place t nil (saveplace))
'(show-paren-mode t)
'(tool-bar-mode nil)
'(view-read-only t)
'(viper-auto-indent t)
'(viper-buffer-search-char 103)
'(viper-case-fold-search t)
'(viper-ex-style-editing nil)
'(viper-keep-point-on-undo t)
'(viper-syntax-preference (quote extended))
'(viper-vi-style-in-minibuffer nil)
'(visible-bell t)
'(wdired-allow-to-change-permissions t))
(custom-set-faces
;; custom-set-faces was added by Custom.
;; If you edit it by hand, you could mess it up, so be careful.
;; Your init file should contain only one such instance.
;; If there is more than one, they won't work right.
)

(put 'dired-find-alternate-file 'disabled nil)
(put 'narrow-to-region 'disabled nil)

2008年8月24日日曜日

NTEmacs22 フォント設定(Consolas + メイリオ)

フォント関連が難しいので簡易設定関数を自作した。
以下を .emacs にでも追記する。


(defun my-set-assoc-data (list key value)
;; リストに既に同じキーがあれば上書き、無ければ新規追加
(let ((item (assoc key (symbol-value list))))
(if item
(setcdr item value)
(add-to-list list (cons key value)))))

(defun my-set-font (ascii-font jis-font size mul)
;; フォント設定
;; ascii フォント、和文フォント、サイズ、倍率の順に指定する。
(create-fontset-from-ascii-font
(concat "-*-" ascii-font "-normal-r-normal-normal-"
(int-to-string size) "-*-*-*-*-*-iso8859-1")
nil
(concat ascii-font (int-to-string size)))

(let* ((encoded (encode-coding-string jis-font 'emacs-mule))
(family (concat encoded "*"))
(fontset (concat "fontset-" ascii-font (int-to-string size))))

(set-fontset-font fontset 'japanese-jisx0208
(cons family "jisx0208-sjis"))
(set-fontset-font fontset 'katakana-jisx0201
(cons family "jisx0201-katakana"))

(my-set-assoc-data 'face-font-rescale-alist (concat ".*" encoded ".*") mul)
(my-set-assoc-data 'default-frame-alist 'font fontset)
(set-frame-font fontset)))

;; 倍率は全角と半角の比率を調整する。サイズによって最適値は異なる。
(my-set-font "Consolas" "メイリオ" 15 1.1)
;(my-set-font "Consolas" "メイリオ" 14 1.2)
;(my-set-font "Courier New" "MS ゴシック" 14 1.2)
;(my-set-font "MS ゴシック" "MS ゴシック" 14 1.0)

2008年7月22日火曜日

gvimrc - 最低限の設定


" 2008/09/29: フォントを Osaka に変更

set iminsert=0 " 初期挿入は IM-OFF
set imsearch=0 " 初期検索は IM-OFF
set linespace=0 " 行間 (point、Osaka 以外のフォントは 2 ぐらいを設定)
set visualbell " beep 音を止める(代わりに画面フラッシュ)
set guioptions-=m " メニューを消す
set guioptions-=T " ツールバーを消す
set guioptions+=a " マウス選択や、visual 選択でクリップボードにコピー
set columns=80 " 横幅文字数
set lines=50 " 行数
set guifont=Osaka-等幅:h12
" set guifont=MS_Mincho:h12:cSHIFTJIS
" set guifont=M+2VM+IPAG_circle:h12:cSHIFTJIS
" set guifont=BDF_UM+:h9

" colorscheme default " 配色設定
" set background=light

" 日本語入力のカーソル色
hi CursorIM guifg=black guibg=red

" gp でクリップボードを貼り付け
nnoremap gp "*gp

2008年4月13日日曜日

現在編集しているファイル名をクリップボードに

人に説明する際に、ファイル名や抜粋がクリップボードにコピーしたくなることがある。
以下を vimrc にでも追記すれば :FN や :FL で簡単にコピーできる。
# visual 選択中の :FL は抜粋になる


" 'ファイル名' をヤンク/クリップボードのバッファにコピー
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""
command! FN let @"=expand("%:p") | if has("gui_running") | let @*=@" | endif

" 'ファイル名 :L行番号' をヤンク/クリップボードのバッファにコピー
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
function! s:get_filename_with_line_number(s, e)
let result = expand("%:p")." :L".line(".")
if a:s == a:e
let @" = result
else
let result .= "\n===\n"
let result .= join(getline(a:s, a:e), "\n")
let @" = result."\n==="
endif

if has("gui_running")
let @* = @"
endif
endfunction
command! -range FL call s:get_filename_with_line_number(<line1>, <line2>)

2008年4月12日土曜日

SICP てきとー要約:1.1 The Elements of Programming

http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-10.html

強力なプログラム言語は、単なるコンピュータへの命令手段ではなく自分のアイデアをまとめるフレームワークでもある。そのため、プログラミングでは言語に用意されている単純なアイデアを複雑なアイデアに組み上げる仕組みについて意識すべきだ。強力といわれるあらゆる言語には 3 つの機構がある。
  • 最も単純な式
  • それを組み合わせる手段
  • また、それを抽象化する手段
プログラミングでは手続きとデータという 2 つの要素を扱い、強力なプログラム言語ではそれらを抽象化したり組み合わせたりできる。

この章では単純な数値データのルールについて説明する。

2008年4月7日月曜日

Redmineの工数詳細を100件に制限

工数登録が多くなると表示がかなり遅くなるので、
100 件で制限しておく。
全部表示したい場合は csv を指定すれば OK。

=====================================
app/controllers/timelog_controller.rb
=====================================

def details
sort_init 'spent_on', 'desc'
sort_update

####### 変更開始
#@entries = (@issue ? @issue : @project).time_entries.find(:all, :include => [:activity, :user, {:issue => [:tracker, :assigned_to, :priority]}], :order => sort_clause)
find_param = [:all, {:include => [:activity, :user, {:issue => [:tracker, :assigned_to, :priority]}], :order => sort_clause}]
if 'csv' != params[:export]
find_param[1][:limit] = 100
end
@entries = (@issue ? @issue : @project).time_entries.find(*find_param)
####### ここまで

@total_hours = @entries.inject(0) { |sum,entry| sum + entry.hours }
@owner_id = User.current.id

send_csv and return if 'csv' == params[:export]
render :action => 'details', :layout => false if request.xhr?
end

Redmineに工数確認機能を追加2

工数入力は同じ課題がしばらく続くことが多いので、
入力補助として履歴に最近入力した課題への工数入力のリンクを増やしてみた。

----------------------------------------
app/views/my/blocks/_hourhistories.rhtml
----------------------------------------
<h3>入力工数履歴</h3>

<ul>
<% sql =
"select user_id, spent_on, sum(hours) as day_hour" +
" from time_entries" +
" where user_id = #{user.id}" +
" group by spent_on" +
" order by spent_on desc" +
" limit 5"-%>
<% for entry in TimeEntry.find_by_sql(sql) %>
<li><%= "#{entry.spent_on}: #{entry.day_hour} h" %>
<% end %>
</ul>

<%= link_to "詳細", :controller => "man_hour" %>
<p>
<% sql =
"select distinct issue_id " +
" from time_entries" +
" where user_id = #{user.id}" +
" order by spent_on desc" +
" limit 10"-%>
<h3>最近工数入力した課題</h3>
<ul>
<% i = 0 %>
<% for entry in TimeEntry.find_by_sql(sql) %>
<% if entry.issue %>
<li>[<%= link_to '工数入力', :controller => 'timelog', :action => 'edit', :issue_id => entry.issue_id %>]
<%= link_to_issue entry.issue %> <%= entry.issue.subject %>
<% end %>
<% end %>
</ul>

2008年3月23日日曜日

SICP てきとー要約:Chapter 1 Building Abstractions with Procedures

英語読解能力がほぼ 0 な私が、はしょりながら SICP を読み解く第1弾。英語と Scheme とコンピュータを全て同時に学ぼうという無謀な挑戦。
(続くのか??)

http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-9.html

computational process は data と呼ばれる”もの”を program と呼ばれる規則に沿って処理する。魔法と同じように見えないし触れないけど、実際に銀行や工場で computational process は動作している。

program を勉強するのは魔法と違って安全だけど、bug と呼ばれる小さなミスが原因で飛行機やダムの破滅的な崩壊を招いたり、工場のロボットが自爆してしまう可能性だってある。

software 技術の master は意図的に動作するようにプログラムする能力があり、うまく構造化することで思いがけない問題が発生しても破滅的な事態にならず、その問題を修正することができるのだ。

Programming in Lisp

本書では、Lisp という programming language を使用する。Lisp は 2 番目に古い言語ながらその柔軟性によって最も近代的な program design を備えている。Lisp には方言が多くあるのだが、その中でも Scheme と呼ばれる方言を使用する。

Lisp は主要言語とは言えないかもしれない。しかし、Lisp は procedure と呼ばれる処理の記述を data としても扱える。これはとても重要な特徴で、受け身な data と活動的な process の境界を曖昧にする強力な技法である。この特徴によって Lisp は我々が design 技法を探し求めるのに最も使える言語の一つとなっている。しかも Lisp の programming はとても楽しいのだ!


2008年1月15日火曜日

Redmineに機能追加(終了済み Issue をカレンダーで取り消し線)


--------------------------------
app/views/common/_calendar.rhtml
--------------------------------
<%= h("#{i.project.name} -") unless @project && @project == i.project %>
<%= link_to_issue i %>: <!-- 元の処理 %= h(truncate(i.subject, 30)) % -->
<!-- 追加開始 -->
<%= '<del>' if i.closed? %><%= h(truncate(i.subject, 30)) %><%= '</del>' if i.closed? %>
<!-- ここまで -->
<span class="tip"><%= render_issue_tooltip i %></span>

2008年1月14日月曜日

Redmineに工数確認機能を追加

Redmine で工数を入力できるけど、
日々の合計値や一覧がないので少し使いにくい。

なので簡単に機能追加。
#かなり adhoc だけどローカル用だしね。

試したのは redmine-0.6.3。


(1) まずはコントローラを追加
ruby script/generate cotroller man_hour


(2) 各ファイルを追記したり作成したり修正したり。

--------------------------------------
app/controllers/man_hour_controller.rb
--------------------------------------
class ManHourController < ApplicationController
layout 'base'

def index
@time_entries = TimeEntry.find(:all,
:conditions => ['spent_on > ?',
Time.now - 14.day],
:order => 'user_id, issue_id, spent_on')

@time_entries = [] if !@time_entries

respond_to do |format|
format.html
end
end

end

-----------------------------
app/views/man_hour/index.html
-----------------------------
<h1>入力工数一覧</h1>

<% start_day = Time.now - 13.day -%>
<table class="list">
<tr>
<th>メンバ</th><th>課題</th>
<% 14.times do |n| -%>
<th>
<!-- %= (start_day + n.day).strftime("%m/%d") % -->
<% d = (start_day + n.day) -%>
<%= "#{d.month}/" if d.day == 1 %>
<%= d.day %>
</th>
<% end -%>
</tr>
<% max = @time_entries.length -%>
<% i = 0 -%>
<% while i < max -%>
<% entry = @time_entries[i] -%>
<tr class="<%=cycle('odd', 'even') %>">
<td><%= entry.user.name %></td>
<td>[<%= entry.project.name %>] <%= entry.issue.subject if entry.issue %></td>
<% issue_id = entry.issue_id -%>
<% 14.times do |n| -%>
<% if entry && (issue_id == entry.issue_id) && (entry.spent_on.day == (start_day + n.day).day) -%>
<td>
<!-- %= entry.hours % -->
<% if entry.user_id == User.current.id -%>
<%= link_to entry.hours, :controller => "timelog", :action => "edit", :id => entry.id %>
<% else -%>
<%= entry.hours %>
<% end -%>
</td>
<% i = i.next -%>
<% entry = @time_entries[i] -%>
<% else -%>
<td></td>
<% end -%>
<% end -%>
</tr>
<% end -%>
</table>

----------------
config/routes.rb
----------------
map.connect 'man_hour/', :controller => 'man_hour', :action => 'index' # 追記

--------------------------------
app/controllers/my_controller.rb
--------------------------------
BLOCKS = { 'issuesassignedtome' => :label_assigned_to_me_issues,
'issuesreportedbyme' => :label_reported_issues,
'issueswatched' => :label_watched_issues,
'news' => :label_news_latest,
'calendar' => :label_calendar,
'documents' => :label_document_plural,
'hourhistories' => '入力工数履歴' # UTF8 で追記
}.freeze

----------------------------------------
app/views/my/blocks/_hourhistories.rhtml
----------------------------------------
<h3>入力工数履歴</h3>

<ul>
<% sql =
"select user_id, spent_on, sum(hours) as day_hour" +
" from time_entries" +
" where user_id = #{user.id}" +
" group by spent_on" +
" order by spent_on desc" +
" limit 5"-%>
<% for entry in TimeEntry.find_by_sql(sql) %>
<li><%= "#{entry.spent_on}: #{entry.day_hour} h" %>
<% end %>
</ul>

<%= link_to "詳細", :controller => "man_hour" %>