Hatena::Groupstudyroom

何か作りながら書くメモ (tily)

2010-01-02

[][]RSpec、describe のネスト 21:13 RSpec、describe のネスト - 何か作りながら書くメモ (tily) を含むブックマーク

[]Array#compact, Array#compact! 18:52 Array#compact, Array#compact! - 何か作りながら書くメモ (tily) を含むブックマーク

値が nil の要素を取り除く

2010-01-01

[]可変長引数 01:17 可変長引数 - 何か作りながら書くメモ (tily) を含むブックマーク

def param_test(must, *rest)
  p rest
end

param_test(1)
param_test(1, 2)
param_Test(1, 2, 3)

結果:

[]
[2]
[2, 3]

2009-12-31

[]いろいろ 01:47 いろいろ - 何か作りながら書くメモ (tily) を含むブックマーク

  • ^ - 行頭に移動
  • $ - 行末に移動
  • Ctrl-R リドゥ
  • I - 行頭に入力
  • m[A-Z0-9] マーク設定
  • `[A-Z0-9] マークに移動
  • :marks - マーク一覧
  • % - 対応する括弧
  • gg - 最初の行へ(=1G)

[]選択範囲に外部コマンド適用 01:46 選択範囲に外部コマンド適用 - 何か作りながら書くメモ (tily) を含むブックマーク

vで範囲を選択して、

:'<,'>!perl -pe "#処理"

ファイル全体に適用したい場合は、

%!perl -pe "#処理"

[]バージョン間の違いで結構動かない 22:10 バージョン間の違いで結構動かない - 何か作りながら書くメモ (tily) を含むブックマーク

開発に使っている MacBook (Ruby v 1.8.6) で作ったものを自宅サーバ (Ruby v 1.8.7) に持って行って動かそうとしたり、

その逆をやったりすると結構動かなかったりする。

移植性をもたせながら作るのは大事だけどいろいろ考慮しなきゃならないのは面倒くさいな。

2009-12-29

[]はてなダイアリー AtomPub API 10:38 はてなダイアリー AtomPub API - 何か作りながら書くメモ (tily) を含むブックマーク

これ見ながら Ruby で試しに日記を書き込もうとしているんだけどうまくいかない、401 エラーが返ってくる。認証に失敗してるっぽいんだけど、何が悪いのかいまいちよく分からない。

上記ページに載ってる Ruby 用のサンプルコードだとうまく動かなくて、get_service とかやってるところを代わりに手動で collection_uri を作るようにしたらうまく動いた。

require 'rubygems'
require 'atomutil'

username = 'はてなID'
password = 'hatena_password'
auth = Atompub::Auth::Wsse.new :username => username, :password => password
client = Atompub::Client.new :auth => auth
collection_uri = 'http://d.hatena.ne.jp/%s/atom/blog' % username

entry = Atom::Entry.new(
  :title => 'My Entry Title',
  :updated => Time.now
)

entry.content = <<EOF
エントリー本文だよ
EOF

puts client.create_entry collection_uri, entry

下書き投稿とかする場合には HatenaClient クラスを定義する必要があるっぽいけど、今のところ自分は必要としていないので試していない。

あと削除も atomutil - RubyでAtomPubを操作するパッケージをリリースしました - Codin’ In The Free World を見ながらやったらできた。

追記:今試してみたら、はてなダイアリーAtomPubとはに載ってる get_service を使ってるサンプルでも動いた。よく分からない。

2009-12-28

[][]testing test 17:08 testing test - 何か作りながら書くメモ (tily) を含むブックマーク

cucumber の spec 面白そう、一通り目を通す。

2009-12-27

[]do while 23:16 do while - 何か作りながら書くメモ (tily) を含むブックマーク

begin
  foo
end while condition

使い方覚えたいもの 21:55 使い方覚えたいもの - 何か作りながら書くメモ (tily) を含むブックマーク

[]Macmecab-ruby ライブラリ文字化け (?) する 17:37 Mac の mecab-ruby ライブラリで文字化け (?) する - 何か作りながら書くメモ (tily) を含むブックマーク

なんかよく分からないんだけど、/opt/local/etc/mecabrc を読めていないらしく、左記のファイルに指定した辞書を読みに行っていないっぽい。

require 'MeCab'
m = MeCab::Tagger.new
n = m.parseToNode(STDIN.read)
while n
  puts n.surface
  n = n.next
end
~# ruby test.rb             
動く犬
^D
###
   #########
            #

/opt/local/etc/mecabrc を $HOME/.mecabrc にコピーしたらうまく動いた。

~# ruby test.rb            
動く犬
^D
動く
犬

[]プログラム 設計 メモ 17:32 プログラム 設計 メモ - 何か作りながら書くメモ (tily) を含むブックマーク

全然基礎がなっていないので何かを作ろうとするときにいつもどういう設計にすればいいか分からなくて困るんだけれど、そうしている中でも最近作りながら考えたり意識していること。

  • 手続き型で作るかオブジェクト指向で作るか
    • 書き捨てのプログラムは上から下にダラダラ書いて済ませてしまいがちだけど、その書き捨てがいつもっと大きなものに発展していくか分からないので、機能を付け足したり後から別のプラットフォームで動かしたりするために極力オブジェクト指向で作る
      • プロダクディブ・プログラマにも似たようなこと書いてあった
  • クラス設計をどうするか
    • クラス名が「名詞」になるように作る
      • 動詞っぽい名詞もあんまり良くない、Parser とか Generator とか Extractor とか
      • 動詞はメソッドに持たせる
    • 「魔法」っぽく見えるように作る
      • 内側の低レベルな汚い処理は奥のほうに隠しておいて、インタフェースではもっとレベルが高い問題を扱うようにする
    • 抽象度を合わせる
      • 「魔法っぽく〜」とも関連すると思うんだけど、顧客操作なのにいきなり SQLStatement クラスが出てきたりとかカッコわるい
      • 抽象度を合わせるためなら、一行メソッドを定義してもよい (プロダクティブ・プログラマ)
    • 組み込みクラスを拡張するように作る
      • Array Hash String とか (特に Hash) で済ませてしまいがちのところを、もっとそのデータに独自の振る舞いを持ってほしくないか考える
    • デザインパターンを採用する
    • 条件文や繰り返し文を減らす
      • 手続き型っぽく作ってるとどうしても条件文とか繰り返し文が増えてきて考慮しなければならない状態が増えてきて頭がこんがらがる
      • 状態を切り分けてオブジェクトとして表現できないか考える

2009-12-20

[]カジュアルな冗長モード欲しい 08:27 カジュアルな冗長モード欲しい - 何か作りながら書くメモ (tily) を含むブックマーク

もうあるのかもしれないけど、RSpec の出力結果が ....FFF... みたいな感じでシンプルすぎてわかりづらいので、テストに成功したときもカジュアルなメッセージが出力できるようにしたら自分としては「テスト書いてからコーディングする」のが定着するかもしれない。

# spec some_class.spec
1. SomeClass#some_method は fuga を代入したら hoge を返したから OK
2. SomeClass#some_method は naha を代入したら piyo を返したから OK

2009-12-01

[]サブクラス 動的生成 22:10 サブクラス 動的生成 - 何か作りながら書くメモ (tily) を含むブックマーク

>> p klass = Class.new(Array)
#<Class:0x1124444>
=> nil
>> Object.const_set('MyArray', klass)
=> MyArray
>> MyArray.new.class
=> MyArray

2009-11-24

[][]Cucumber 実行 オプション 23:34 Cucumber 実行 オプション - 何か作りながら書くメモ (tily) を含むブックマーク

cucumber -h を実行すればだいたい分かるんだけれどもメモ。

cucumber -l ja
  • 1 フィーチャだけテストしたいとき
    • フィーチャへのパスを指定して実行する
cucumber -l ja features/some_messy.feature
  • 特定のシナリオだけテストしたいとき
    • -n の後に文字列を指定すると、その文字列を名前に含むシナリオだけ実行される
cucumber -l ja -n 文字列
  • タグをつけたシナリオをまとめてテストしたいとき
    • -t のあとにタグ名を指定して実行する
cucumber -l ja -t @some_tag

2009-07-01

[]cgi ライブラリCGI#params で取得される Hash のそれぞれの value には配列が入っている 13:57 cgi ライブラリの CGI#params で取得される Hash のそれぞれの value には配列が入っている - 何か作りながら書くメモ (tily) を含むブックマーク

2009-06-30

[]screen commands 22:53 screen commands - 何か作りながら書くメモ (tily) を含むブックマーク

  • :help
  • :number
    • 現在アクティブになっているウィンドウの順番を変える

2009-06-29

[]Sequel プライマリキーの create / update / delete できない制約を解除 15:04 Sequel プライマリキーの create / update / delete できない制約を解除 - 何か作りながら書くメモ (tily) を含むブックマーク

2009-06-23

[]svn st で差分があったファイルだけ別のディレクトリにコピーする 12:51 svn st で差分があったファイルだけ別のディレクトリにコピーする - 何か作りながら書くメモ (tily) を含むブックマーク

svn st  | cut -c8- | xargs -i cp {} ~/test

[] 09:25 2009-06-23 - 何か作りながら書くメモ (tily) を含むブックマーク

  • du -sh [path]

2009-06-17

[]クラスメソッド 10:32 クラスメソッド - 何か作りながら書くメモ (tily) を含むブックマーク

2009-06-13

[]Rails っぽくないデータベースActiveRecord で扱う 13:36 Rails っぽくないデータベースを ActiveRecord で扱う - 何か作りながら書くメモ (tily) を含むブックマーク

[]文字列からクラスを生成する 13:31 文字列からクラスを生成する - 何か作りながら書くメモ (tily) を含むブックマーク

require 'activesupport'
p 'Array'.constantize.class

[]gem 自身のアップデート 13:13 gem 自身のアップデート - 何か作りながら書くメモ (tily) を含むブックマーク

gem update --system

2009-06-11

[] 19:35 2009-06-11 - 何か作りながら書くメモ (tily) を含むブックマーク

  • locate コマンド

YAML 18:44 YAML - 何か作りながら書くメモ (tily) を含むブックマーク

  • コメントは #

2009-06-09

なじまないものメモ 20:51 なじまないものメモ - 何か作りながら書くメモ (tily) を含むブックマーク

  • Emacs / screen の画面分割
    • 空間把握能力が低いせいなのかもしれないけど、今見ている分割された画面と裏側にあるバッファ / ウィンドウの対応関係がよくわからなくなってきてダメ
    • もう少し使い続ければ使いこなせるようになるのかなぁ…
    • ちなみに vim の画面分割機能は使いこなせてる、裏側にバッファとかウィンドウみたいな概念がないから
    • 逆にブラウザの画面を分割したいと思うことはたまにある
  • screen のスクロールバックモード
    • 自分の場合ターミナルでコピーするときって、だいたい Windows とか Macクリップボードに入れたい場合がほとんどなんだけど、screen のスクロールバックはターミナルソフトのスクロールバーでさかのぼれないし、コピーしてもクリップボードに入らないから、使い勝手が良くない
    • screen 起動しているときはターミナルのスクロールバーが効かないから、hardcopy -h tmp.txt とかして、いったんデタッチして cat tmp.txt してターミナルのスクロールバーでさかのぼって、選択してコピーするとかになっちゃう
    • あきらかに効率わるい、どうにかしたい
    • Mac で pbcopy と連携するやつは使いやすそう、あとで試してみる

[] 15:13 2009-06-09 - 何か作りながら書くメモ (tily) を含むブックマーク

  • サービスの削除
    • sc delete [サービス名]

2009-06-08

[]ファイル ワイルドカードで検索 11:37 ファイル ワイルドカードで検索 - 何か作りながら書くメモ (tily) を含むブックマーク

  • Dir::glob("/Program Files/*/*.exe") # => Array

2009-06-05

[]screen commands 10:31 screen commands - 何か作りながら書くメモ (tily) を含むブックマーク

  • :title
    • ウィンドウのタイトルを変える
  • :sessionname
  • ^D
    • デタッチ

2009-06-02

[] 10:08 2009-06-02 - 何か作りながら書くメモ (tily) を含むブックマーク

  • svn diff の出力は context 形式
    • 他に side-by-side, unified 形式がある
    • GNU diff でも -c|--context オプションで context 表示で出力可能

2009-05-27

[]fsck -y 17:52 fsck -y - 何か作りながら書くメモ (tily) を含むブックマーク

  • fsck -y
    • fsck の過程で聞かれるすべての質問に y で答える

2009-05-26

yum.conf に書く base とか update とかの URL 18:44 yum.conf に書く base とか update とかの URL - 何か作りながら書くメモ (tily) を含むブックマーク

ftp://ftp.riken.jp/pub/Linux/fedoralegacy/fedora/3/os/i386/repodata/repomd.xml

を読み込もうとしているので、

ftp://ftp.riken.jp/pub/Linux/fedoralegacy/fedora/3/os/i386/

の部分までを書く。

[base]
name=Fedora Core $releasever base
baseurl=ftp://ftp.riken.jp/pub/Linux/fedoralegacy/fedora/$releasever/os/$basearch/

[] 10:48 2009-05-26 - 何か作りながら書くメモ (tily) を含むブックマーク

gem install mongrel_service
mongrel_rails service::install -N "Service Name" -c c:\path\to\railsdir -p 3000 -e production

w3m キーバインド 10:47 w3m キーバインド - 何か作りながら書くメモ (tily) を含むブックマーク

2009-05-24

XPath 07:45 XPath - 何か作りながら書くメモ (tily) を含むブックマーク

[]screen commands 07:32 screen commands - 何か作りながら書くメモ (tily) を含むブックマーク

  • :detach
  • :quit
  • :hardcopy

2009-05-18

[] 20:52 2009-05-18 - 何か作りながら書くメモ (tily) を含むブックマーク

  • Object#toSource (Not implemented in IE)

2009-05-14

[] 01:45 2009-05-14 - 何か作りながら書くメモ (tily) を含むブックマーク

  • File::ftype
  • Dir::mkdir
  • File.exist?

2009-05-11

[] 18:28 2009-05-11 - 何か作りながら書くメモ (tily) を含むブックマーク

8.times { print (rand(94)+32).chr }

2009-05-05

[] 21:59 2009-05-05 - 何か作りながら書くメモ (tily) を含むブックマーク

  • Integer#step
  • feed-normalizer

2009-05-02

[]export / import 16:38 export / import - 何か作りながら書くメモ (tily) を含むブックマーク

アカウントでつけてた勉強用のメモ日記をつけてたんだけど、そういえばこの日記もあったなと思って、こっちにインポートしてみた。ほんとにただのメモで全然まとまってなくてすみません。

あとなんかタイトルにリンクを貼ったエントリーがうまくインポートできてないみたいだけどまあいいや。

2009-05-01

[]親クラス、先祖クラス群の取得 00:33 親クラス、先祖クラス群の取得 - 何か作りながら書くメモ (tily) を含むブックマーク

  • Class#superclass, Module#ancestors

15:39 2009-05-01 - 何か作りながら書くメモ (tily) を含むブックマーク

  • スパムアート
  • ログレベルについて
    • Apacheのログを活用しよう(1/2) <http://www.atmarkit.co.jp/flinux/rensai/apache13/apache13a.html>

[] 15:25 2009-05-01 - 何か作りながら書くメモ (tily) を含むブックマーク

  • hosts ファイルの場所

2009-04-28

[]macros 14:19 macros - 何か作りながら書くメモ (tily) を含むブックマーク

  • qx, q, @x

2009-04-27

[]正規表現配列、WWW::Mechanize、JSON 15:26 正規表現、配列、WWW::Mechanize、JSON - 何か作りながら書くメモ (tily) を含むブックマーク

  • 正規表現
    • String#scan で正規表現でグローバルマッチ。Perl の g オプション
    • Array#transpose、何に使うのかと思ってたけど、以下のように scan でグローバルにマッチさせた配列から特定の部分だけ取り出すときに使える
url_regex = /((https?|ftp)(:\/\/[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+))/
urls = html.scan(url_regex).transpose[0] 

2009-04-21

[]show processlist; 23:07 show processlist; - 何か作りながら書くメモ (tily) を含むブックマーク

[] 22:46 2009-04-21 - 何か作りながら書くメモ (tily) を含むブックマーク

  • いつも Object#nil? で判定してるのスマートじゃない気がする、他のやり方ないのか

2009-04-20

[] 23:30 2009-04-20 - 何か作りながら書くメモ (tily) を含むブックマーク

[] 14:16 2009-04-20 - 何か作りながら書くメモ (tily) を含むブックマーク

  • HOMEDIR=/home/`date +%Y%m%d`;mkdir $HOMEDIR;cd $HOMEDIR とかを起動スクリプトに書いておくといいかも

2009-04-16

[] 17:01 2009-04-16 - 何か作りながら書くメモ (tily) を含むブックマーク

auto_link (ActionView::Helpers::TextHelper) べんり

2009-04-15

[] 10:07 2009-04-15 - 何か作りながら書くメモ (tily) を含むブックマーク

  • rake db:migrate VERSION=20090415100755
  • ActiveRecord::Base#delete
  • イテレーション開発するときは最初に :null => false とかあんまりテーブルのカラムに制約をつけないほうがいいっぽい

2009-04-14

[]migration 14:40 migration - 何か作りながら書くメモ (tily) を含むブックマーク

  • remove_column, add_column

2009-04-13

[] 06:58 2009-04-13 - 何か作りながら書くメモ (tily) を含むブックマーク

2009-04-12

[]ブロックから抜けるのは next 14:40 ブロックから抜けるのは next - 何か作りながら書くメモ (tily) を含むブックマーク

[]1.2.6 (MacOS X) から 2.2.2 (WIndows XP) へのアップグレード 12:19 1.2.6 (MacOS X) から 2.2.2 (WIndows XP) へのアップグレード - 何か作りながら書くメモ (tily) を含むブックマーク

  config.action_controller.session = {
    :session_key => '_railsapp_session',
    :secret => 'thegreatmanagerknowseverythingsoftheproject'
  }

[]変数nil かどうか判定する、Object#nil? 09:43 変数が nil かどうか判定する、Object#nil? - 何か作りながら書くメモ (tily) を含むブックマーク

2009-04-11

[] 12:40 2009-04-11 - 何か作りながら書くメモ (tily) を含むブックマーク

2009-04-07

20:26 2009-04-07 - 何か作りながら書くメモ (tily) を含むブックマーク

2009-04-06

[] 22:38 2009-04-06 - 何か作りながら書くメモ (tily) を含むブックマーク

  • params[:id] (VIEW)
  • @map = Map.find(params[:map_id] (CONTROLLER)
  • foreign_key (MODEL)

2009-04-05

[] 08:04 2009-04-05 - 何か作りながら書くメモ (tily) を含むブックマーク

2009-04-02

[] 21:27 2009-04-02 - 何か作りながら書くメモ (tily) を含むブックマーク

* ディレクトリの存在確認

* ls -d /path/to/directory | wc -l

2009-03-31

22:47 2009-03-31 - 何か作りながら書くメモ (tily) を含むブックマーク

CREATE TABLE SERVERS (
  id INTEGER PRIMARY KEY,
  name STRING,
  ip STRING,
  owner_id INTEGER
);
CREATE TABLE ROUTINGS (
  id          INTEGER,
  from        INTEGER,
  to          INTEGER,
  port        INTEGER,
  description TEXT,
  map_id      INTEGER,
  owner_id    INTEGER
);
CREATE TABLE MAPS (
  id          INTEGER,
  title       TEXT,
  description TEXT
);
CREATE TABLE USERS (
  id        INTEGER,
  name      STRING,
  password  STRING
);
CREATE TABLE PORTS (
  id          INTEGER,
  port        INTEGER,
  description TEXT
);

2009-03-30

00:03 2009-03-30 - 何か作りながら書くメモ (tily) を含むブックマーク

女性の名前判定器

2009-03-28

17:04 2009-03-28 - 何か作りながら書くメモ (tily) を含むブックマーク

  • MySQL の xargs って何

[]MySQL レプリケーション障害の回復 14:56 MySQL レプリケーション障害の回復 - 何か作りながら書くメモ (tily) を含むブックマーク

[]最近よいと思ったもの 14:52 最近よいと思ったもの - 何か作りながら書くメモ (tily) を含むブックマーク

  • TracWiki 記法
    • WikiName よりむしろ、ticket:999 とか attachment:wiki:WikiName とか、Wiki 以外のいろいろなインターフェイスを気軽にリンクできるのが楽しい
  • MacSpotlight
    • Unixシェルとかでもこういうのがあればいいんだけどな
    • むしろ Input Method のほうでどうこうする問題だろうか

2009-03-23

メモ 17:24 メモ - 何か作りながら書くメモ (tily) を含むブックマーク

2009-03-17

[][]LISTEN になっているかどうかの確認 00:54 LISTEN になっているかどうかの確認 - 何か作りながら書くメモ (tily) を含むブックマーク

  • netstat -nl で確認する

[]Debian、言語の設定 00:53 Debian、言語の設定 - 何か作りながら書くメモ (tily) を含むブックマーク

  • 一時的なら export LANG=C みたいにして言語の設定を変えることができる
  • LANG=C は英語

2009-03-15

[]DebianUSB のマウント 21:19 Debian、USB のマウント - 何か作りながら書くメモ (tily) を含むブックマーク

[]debian、コンソールログインの設定 11:49 debian、コンソールログインの設定 - 何か作りながら書くメモ (tily) を含むブックマーク

2009-03-07

[]nc コマンドについて 15:48 nc コマンドについて - 何か作りながら書くメモ (tily) を含むブックマーク

  • nc コマンド、Mac だと nc -l 3000 で OK
  • CentOS も nc -l 3000 で OK、RedHat 系は nc -l -p 3000 と指定しないと LISTEN にならない

[] 14:48 2009-03-07 - 何か作りながら書くメモ (tily) を含むブックマーク

  • docomo 端末では XHTML でなければスタイルシートを使えない
  • docomo 端末では style が使えるのはタグの属性としてのみ。ただし a タグの疑似クラス(a:hover とか)のみはインラインの style タグに指定できる
  • docomo 端末で XHTML を表示させるためには、HTTP レスポンスヘッダの Content-Type と、HTML ヘッダの Content-Type の両方に "application/xhtml+xml" を指定する必要がある
  • Apache で application/xhtml+xmlHTTP レスポンスヘッダに指定するには、.htaccess の AddType でやるか拡張子を .xhtml にすればよい
  • SoftBank 端末ではリダイレクトに制限がある。C 型は 2 回まで、それ以外は 3 回まで
  • AU の端末は textarea に 1024 文字までしか入力できない

2009-02-23

Singleton パターンは DB へのコネクションを 1 つに絞る際などに使う 05:12 Singleton パターンは DB へのコネクションを 1 つに絞る際などに使う - 何か作りながら書くメモ (tily) を含むブックマーク

[]今作ろうとしているアウトラインエディタオブジェクト指向を当てはめるならどうなるんだろう 04:57 今作ろうとしているアウトラインエディタにオブジェクト指向を当てはめるならどうなるんだろう - 何か作りながら書くメモ (tily) を含むブックマーク

  • カーソルのある li 要素のインスタンス CurrentListItem をクラスメソッドで取得
    • CurrentListItem.shallow とか CurrentListItem.deep とかしたい
  • それらをキーバインド用のクラスに登録していく感じか

2009-02-18

[JAVASCRIPT]階層、回想、実装 13:49  [JAVASCRIPT]階層、回想、実装 - 何か作りながら書くメモ (tily) を含むブックマーク

階層を深くする場合(1)

BEFORE
<ul>
  <li>パン</li>
  <li></li>
  <li>カレーライス</li> <!-- この要素の階層を深くする -->
  <li>パスタ</li>
</ul>
AFTER
<ul>
  <li>パン</li>
  <li><ul>
      <li>カレーライス</li>
    </ul>
  </li>
  <li>パスタ</li>
</ul>
<!-- 現在の <li>カレーライス</li> を削除 -->
<!-- 新しく li 要素を 1 つのみ持つ ul 要素を作って直前の li 要素に挿入 -->

階層を深くする場合(2)

BEFORE
<ul>
  <li>パン</li>
  <li><ul>
      <li>カレーライス</li>
      <li>牛丼</li>
      <li>雑炊</li>
    </ul>
  </li>
  <li>リゾット</li>
  <li>パスタ</li>
</ul>
AFTER
<ul>
  <li>パン</li>
  <li><ul>
      <li>カレーライス</li>
      <li>牛丼</li>
      <li>雑炊</li>
      <li>リゾット</li>
    </ul>
  </li>
  <li>パスタ</li>
</ul>

階層を深くする場合(自分より深い階層を持っている場合)

BEFORE
<ul>
  <li>パン</li>
  <li><ul>
      <li>カレーライス</li>
      <li>グリーンカレー <!-- 階層を深くしたい -->
        <ul>
          <li>レッドカレー</li>
          <li>キーマカレー</li>
          <li>カツカレー</li>
        </ul>
      </li>
      <li>牛丼</li>
      <li>雑炊</li>
      <li>リゾット</li>
    </ul>
  </li>
  <li>パスタ</li>
</ul>
AFTER
<ul>
  <li>パン</li>
  <li><ul>
      <li>カレーライス
        <ul>
          <li>グリーンカレー</li>
          <li>レッドカレー</li>
          <li>キーマカレー</li>
          <li>カツカレー</li>
        </ul>
      </li>
      <li>牛丼</li>
      <li>雑炊</li>
      <li>リゾット</li>
    </ul>
  </li>
  <li>パスタ</li>
</ul>

階層を深くできない場合

<ul>
  <li>パン</li><!-- リストの 1 番目の要素の場合 -->
  <li><ul>
      <li>カレーライス</li><!-- リストの 1 番目の要素の場合 -->
      <li>牛丼</li>
      <li>雑炊</li>
      <li>リゾット</li>
    </ul>
  </li>
  <li>パスタ</li>
</ul>

階層を浅くする場合(要素の一番前)

BEFORE
<ul>
  <li>パン</li>
  <li><ul>
      <li>タロイモ</li><!-- 浅くしたい -->
      <li>カレーライス</li>
      <li>牛丼</li>
      <li>雑炊</li>
      <li>リゾット</li>
    </ul>
  </li>
  <li>パスタ</li>
</ul>
AFTER
<ul>
  <li>パン</li>
  <li>タロイモ</li>
  <li><ul>
      <li>カレーライス</li>
      <li>牛丼</li>
      <li>雑炊</li>
      <li>リゾット</li>
    </ul>
  </li>
  <li>パスタ</li>
</ul>

階層を浅くする場合(要素の中間)

BEFORE
<ul>
  <li>パン</li>
  <li>タロイモ</li>
  <li><ul>
      <li>カレーライス</li>
      <li>牛丼</li>
      <li>雑炊</li>
      <li>リゾット</li>
      <li>パスタ</li><!-- 階層を浅くしたい -->
      <li>ナポリタン</li>
      <li>カルボナーラ</li>
    </ul>
  </li>
</ul>
AFTER
<ul>
  <li>パン</li>
  <li>タロイモ</li>
  <li><ul>
      <li>カレーライス</li>
      <li>牛丼</li>
      <li>雑炊</li>
      <li>リゾット</li>
    </ul>
  <li>パスタ
    <ul>
      <li>ナポリタン</li>
      <li>カルボナーラ</li>
    </ul>
  </li>
</ul>

階層を浅くする場合(要素の末尾)

BEFORE
<ul>
  <li>パン</li>
  <li>タロイモ</li>
  <li><ul>
      <li>カレーライス</li>
      <li>牛丼</li>
      <li>雑炊</li>
      <li>リゾット</li>
      <li>パスタ</li><!-- 階層を浅くしたい -->
    </ul>
  </li>
  <li>お好み焼き</li>
</ul>

先頭・中間・末尾での場合分けの他に、子要素を持っているかどうかで場合分けする必要がある

  • 深くする
    • 先頭/末尾
      • 親要素の最初の子である場合、
      • 親要素の最後の子である場合、
    • 子要素の有無
      • 子要素がある場合、
      • 子要素がない場合、
    • 無効な場合
  • 浅くする
    • 先頭/中間/末尾
      • 親要素の最初の子である場合、
      • 親要素の中で previousSibling と nextSibling がいる場合、
      • 親要素の最後の子である場合、
    • 子要素の有無
      • 子要素がある場合、
      • 子要素がない場合、
    • 無効な場合

2009-02-15

service just for someone like people I love 09:53 service just for someone like people I love - 何か作りながら書くメモ (tily) を含むブックマーク

自分が欲しいもので、アイデアとして面白いものを作る。ちょっとしたアイデアなんだけど、はっとさせられるものを作る。

大きなサービスは誰もが必要とするものを提供するけど、少なくとも自分の身近な人は面白いと言ってくれるような、

あるいは毎日使ってくれるような小さなサービスを作る。自分の身近な人と似ている、自分の知らない人も使ってくれるようなサービスを作る。

あまり特化しすぎずに、かと言ってあまり大きすぎるものも目指さずに。

2009-02-14

[] 15:35 2009-02-14 - 何か作りながら書くメモ (tily) を含むブックマーク

<ul>
  <li>パン</li>
  <li>ごはん</li>
  <li>パスタ</li>
</ul>
  • 複数ノードを指定して階層を深くする機能も欲しい
  • たまに 2 番目以降の li タグなのに previous sibling が null になっていることがある
  • リストの挿入でこうなることがある

f:id:linwttaa:20090215090145p:image

    • Enter キーイベントをキャッチして、なんか処理をラップする必要がある

2009-02-11

OpenOffice + Mac、日本語がファイル名に入ったファイルを読み込もうとするとクラッシュする 16:59 OpenOffice + Mac、日本語がファイル名に入ったファイルを読み込もうとするとクラッシュする - 何か作りながら書くメモ (tily) を含むブックマーク

Trac ショートカットキー よさげ 16:38 Trac ショートカットキー よさげ - 何か作りながら書くメモ (tily) を含むブックマーク

[]Arguments.callee とか 16:22 Arguments.callee とか - 何か作りながら書くメモ (tily) を含むブックマーク

2009-02-10

firefox, LDR とかで v でバックグラウンドでタブを開く設定 browser.tabs.loadDivertedInBackground 00:34 firefox, LDR とかで v でバックグラウンドでタブを開く設定 browser.tabs.loadDivertedInBackground - 何か作りながら書くメモ (tily) を含むブックマーク

2009-02-08

[] 22:30 2009-02-08 - 何か作りながら書くメモ (tily) を含むブックマーク

2009-02-07

[]リッチテキストエディタの実装を調べる 11:33 リッチテキストエディタの実装を調べる - 何か作りながら書くメモ (tily) を含むブックマーク

アウトライナ独自のキーバインドの実装

  • タブキーでフォーカスが次の要素に移らないようにする
    • Tab で階層を深くする
    • Shift + Tab で階層を浅くする
  • Delete キーと BackSpace が押されたタイミングで現在のカーソルの位置を取得して、リストタグが消されないように制御する
    • 頻繁に使いそうだから、現在のカーソルの位置を取得する関数を定義する
  • 範囲を指定して削除
    • 選択範囲が行をまたがった場合に、リストアイテム単位で選択されるようにする
  • 右クリックメニューからカット/コピー/ペースト/削除が選択された場合の制御
    • 制御できるのかな
  • リンク機能
  • Emacs / Shell の C-k と C-y (kill-line と yank-line) を実装したい
    • ビジュアル単位じゃなくて、アイテム単位でカット & ペースト
  • 結局、サーバーサイドで正しい階層になっているかを判定するような機構がないとばんばん XML valid じゃない文字列が保存できてしまいそう
  • MarkDown とか PukiWiki 記法のリストで出力できる機能
  • OPML で出力できる機能
  • テキストが削除されたときに発生するイベント
    • = onChange イベント時に差分をとって、文字数が減っていた場合?
  • 高度な機能としては、リストのサブアイテムを開閉する機能
    • DOM で childNodes を指定して display:none にするみたいなのでいけるかも(?)
  • MultipleSelection よさそう
  • execCommand : indent, outdent, insertHTML
  • Javascript Outliner

京都観光を終えて - mala‐ニコニコ動画(ββ) 08:22 [http://www.nicovideo.jp/watch/sm5377545:title=京都観光を終えて - mala‐ニコニコ動画(ββ)] - 何か作りながら書くメモ (tily) を含むブックマーク

2009-02-05

[]LDR で記事に含まれる画像だけ表示する GreaseMonkey スクリプト 23:18 LDR で記事に含まれる画像だけ表示する GreaseMonkey スクリプト - 何か作りながら書くメモ (tily) を含むブックマーク

// ==UserScript==
// @name           LDR Only Images
// @namespace      http://d.hatena.ne.jp/linwttaa
// @include        http://reader.livedoor.com/reader/
// ==/UserScript==
(function(){
    var w = unsafeWindow;
    w.register_hook("before_printfeed", function(feed) {
        feed.items.forEach(function(item) {
            urls = item.body.match(/"https?:\/\/.+?(jpg|png|gif)"/g);
            if(urls == null) { return; }
            item.body = '';
            for(i=0;i<urls.length;i++){
                item.body = item.body + '<img src=' + urls[i] + ' /><br />';
            }
        });
    });
})();

[]shell-mode で履歴を移動する 22:12 shell-mode で履歴を移動する - 何か作りながら書くメモ (tily) を含むブックマーク

[]ファイルの内容を一気読みする 21:32 ファイルの内容を一気読みする - 何か作りながら書くメモ (tily) を含むブックマーク

  • all = File.read(filename)

2009-02-04

RSS, content:encoded 23:17 RSS, content:encoded - 何か作りながら書くメモ (tily) を含むブックマーク

青空文庫の長い文章の最初の文と最後の文だけ抜き出して読んだ気になる 19:13 青空文庫の長い文章の最初の文と最後の文だけ抜き出して読んだ気になる - 何か作りながら書くメモ (tily) を含むブックマーク

  • brutal summarization

「昔はネットワークプロトコルみたいな感じで人間もコミュニケーションをしていたものなんだよ」 18:44 「昔はネットワーク・プロトコルみたいな感じで人間もコミュニケーションをしていたものなんだよ」 - 何か作りながら書くメモ (tily) を含むブックマーク

[]フィードOPML を作るサンプルコード 18:42 フィード用 OPML を作るサンプルコード - 何か作りながら書くメモ (tily) を含むブックマーク

require 'rexml/document'

xml = REXML::Document.new
xml << REXML::XMLDecl.new('1.0', 'UTF-8')

opml = xml.add_element('opml', {'version' => '1.0'})
head = opml.add_element('head')
body = opml.add_element('body')
outlines = body.add_element('outline', {'text' => 'Subscriptions'})

1.upto 10 do |i| 
  outlines.add_element('outline', {
    'title'   => i,
    'htmlUrl' => i,
    'text'    => i,
    'type'    => 'rss',
    'xmlUrl'  => i,
  })  
end

xml.write STDOUT

出力

<?xml version='1.0' encoding='UTF-8'?><opml version='1.0'><head/><body><outline text='Subscriptions'><outline title='1' text='1' xmlUrl='1' type='rss' htmlUrl='1'/><outline title='2' text='2' xmlUrl='2' type='rss' htmlUrl='2'/><outline title='3' text='3' xmlUrl='3' type='rss' htmlUrl='3'/><outline title='4' text='4' xmlUrl='4' type='rss' htmlUrl='4'/><outline title='5' text='5' xmlUrl='5' type='rss' htmlUrl='5'/><outline title='6' text='6' xmlUrl='6' type='rss' htmlUrl='6'/><outline title='7' text='7' xmlUrl='7' type='rss' htmlUrl='7'/><outline title='8' text='8' xmlUrl='8' type='rss' htmlUrl='8'/><outline title='9' text='9' xmlUrl='9' type='rss' htmlUrl='9'/><outline title='10' text='10' xmlUrl='10' type='rss' htmlUrl='10'/></outline></body></opml>

[]Twitter で自分が follow してるユーザーの RSSOPML で取得 18:01 Twitter で自分が follow してるユーザーの RSS を OPML で取得 - 何か作りながら書くメモ (tily) を含むブックマーク

require 'rubygems'
require 'mechanize'
require 'Logger'
require 'rexml/document'

username = ARGV[0]
password = ARGV[1]
log = Logger.new(STDOUT)

log.info("logging in")
agent = WWW::Mechanize.new
agent.get('http://twitter.com/')
agent.page.form_with(:action => 'https://twitter.com/sessions') {|f|
  f.field_with(:name => 'session[username_or_email]').value = username
  f.field_with(:name => 'session[password]').value          = password
  f.click_button
}

users = [] 
page = 1
while 1
  log.info("processing page #{page}")
  agent.get("http://twitter.com/friends?page=#{page}")
  break if agent.page.search('table.doing tr').empty?
  agent.page.search('table.doing tr').each {|user|
    next if(not user.search('img.lock').empty?)
    users.push(
      :name => user.search('td strong a').text,
      :twitter_id   => user.get_attribute('id').sub(/person_(\d+)/, '\\1')
    )
  }
  page = page + 1
end

xml = REXML::Document.new
xml << REXML::XMLDecl.new('1.0', 'UTF-8')
opml = xml.add_element('opml', {'version' => '1.0'})
head = opml.add_element('head')
body = opml.add_element('body')
outlines = body.add_element('outline', {'text' => 'Subscriptions'})

users.each do |user|
  outlines.add_element('outline', {
    'title'   => "Twitter / #{user[:name]}",
    'htmlUrl' => "http://twitter.com/#{user[:name]}",
    'text'    => "Twitter / #{user[:name]}",
    'type'    => 'rss',
    'xmlUrl'  => "http://twitter.com/statuses/user_timeline/#{user[:twitter_id]}.rss",
  })
end

xml.write STDOUT

[]<< って何だっけ文字列連結? 16:51 << って何だっけ文字列連結? - 何か作りながら書くメモ (tily) を含むブックマーク

[]特定のポートが利用できるか調べる方法 16:43 特定のポートが利用できるか調べる方法 - 何か作りながら書くメモ (tily) を含むブックマーク

2009-02-03

[]Twitter で自分が follow してるユーザーの RSSOPML で取得 00:58 Twitter で自分が follow してるユーザーの RSS を OPML で取得 - 何か作りながら書くメモ (tily) を含むブックマーク

  • WWW::Mechanize の search メソッドって Hpricot じゃなくて Nokogiri を使っているんだ
  • Nokogiri では search で返ってきた値に対して empty? メソッドを使って空かどうかを判定できる
  • なんか agent.page.search('//table[@class="doing"]/tbody').empty? がページ数が増え続けても true にならないな、と思っていたら tbody は Firebug が付加したやつだった。直で HTML のソース読むようにしなきゃだめだな
  • とりあえず id を取得するところまで書いた。あと少し
username = ARGV[0]
password = ARGV[1]
ids = [] 
log = Logger.new(STDOUT)

log.info("logging in")
agent = WWW::Mechanize.new
agent.get('http://twitter.com/')
agent.page.form_with(:action => 'https://twitter.com/sessions') {|f|
  f.field_with(:name => 'session[username_or_email]').value = username
  f.field_with(:name => 'session[password]').value          = password
  f.click_button
}

page = 1
while 1
  log.info("processing page #{page}")
  agent.get("http://twitter.com/#{username}/friends?page=#{page}")
  break if agent.page.search('//table[@class="doing"]/tr').empty?
  agent.page.links.each {|l|
    if(l.href.match('/direct_messages/create/(\d+)'))
      ids.push($1)
    end
  }
  page = page + 1
end

ids.each do |id|
  p id
end

get_twitter_id_by_name.rb 13:52 get_twitter_id_by_name.rb - 何か作りながら書くメモ (tily) を含むブックマーク

require 'rubygems'
require 'mechanize'
agent = WWW::Mechanize.new
agent.get "http://twitter.com/#{ARGV[0]}"
agent.page.links.each do |l|
  if l.href.match('/statuses/user_timeline/(\d+?).rss')
    puts $1
  end
end

[]generator list 09:25 generator list - 何か作りながら書くメモ (tily) を含むブックマーク

  • C:/Program Files/ruby-1.8/lib/ruby/gems/1.8/gems/rails-2.2.2/lib/rails_generator/generators
    • controller
    • integration_test
    • mailer
    • migration
    • model
    • observer
    • performance_test
    • plugin
    • resource
    • scaffold
    • session_migration

2009-02-02

fragments 23:49 fragments - 何か作りながら書くメモ (tily) を含むブックマーク

[]net stop beep 23:32 net stop beep - 何か作りながら書くメモ (tily) を含むブックマーク

2009-01-31

Yahoo! Pipes 22:37 Yahoo! Pipes - 何か作りながら書くメモ (tily) を含むブックマーク

使ってみたモジュール

今なんとなく頭の中にある文脈に応じてその都度必要なツールと場所を開く、っていうやり方をアプリケーションに当てはめられないか 21:44 今なんとなく頭の中にある文脈に応じてその都度必要なツールと場所を開く、っていうやり方をアプリケーションに当てはめられないか - 何か作りながら書くメモ (tily) を含むブックマーク

  • ボタン一発で作業環境が出来上がって、余分なものは後景化される
  • あんまり関係ないかもしれないけど、「Yahoo! で東京の明日の天気を見る」っていうタスクだけのために検索したりブックマークから選んでページを開いたりしたくない
  • 簡単な情報は一発で見たい
  • ツールバーRSS フィードがタイトルだけじゃなくて全文表示になればいいんだけど
  • RSS の 1 つ 1 つの記事のサイズを知りたいわけだ
  • MiniFeeds っていうのはどうだ、140 bytes しか入っていないっていう前提のフィード
  • ブックマークコメントとか Twitter とか天気とか交通情報とか

[]この日記のスタイルシート 21:32 この日記のスタイルシート - 何か作りながら書くメモ (tily) を含むブックマーク

ベース:nimbus

ヘッダ

<div class="main">
<hatena name="sectioncategory" template="hatena-module">

フッタ

(なし)

スタイルシート

.main .calendar {
margin:0 0 0 10px;
}
.main .day {
margin:0 0 3em 0;
}
.hatena-sectioncategory li{
 float: left;          
 display: inline;
 margin: 0px;
 border-right: 1px solid #303030;
 padding-left: 5px;
 padding-top: 0px;
 padding-right: 5px;
 padding-bottom: 0px;
}
h1{
 padding: 30px 10%;
 background-color: #303030;
 border-bottom: 0;
 background: #303030 url(20061206213959.gif) repeat-x scroll left 75px
}
.hatena-modulebody {
 background: none;
 background-color: #303030;
}
ul.hatena-sectioncategory {
 height: 3.0em;
}
.hatena-moduletitle {
 display: none;
 border-bottom: 0px;
}
#simple-header {
 background-color: #303030;
 color: #303030;
}
#logo-hatena, #logo-diary {
 display: none;
}
#simple-header ul li a {
 color:#303030;
 text-decoration:none;
}
#simple-header ul li a:hover {
 color:#F0F0F0;
 text-decoration:none;
}
input[name='submit'] {
 display: none;
}
#simple-header input.search-button {
 color: #0485CD;
}

21:01 2009-01-31 - 何か作りながら書くメモ (tily) を含むブックマーク

[]括弧の対応関係 20:52 括弧の対応関係 - 何か作りながら書くメモ (tily) を含むブックマーク

  • % を押すと対応する括弧に移動
  • set :showmatch (set: sm)

プロジェクトのスケーラビリティについて 20:48 プロジェクトのスケーラビリティについて - 何か作りながら書くメモ (tily) を含むブックマーク

  • ウェブアプリケーションを構築したり、Wiki を導入したりするより、共有フォルダ + エクセルですませたほうがいいこともある
  • というよりそういうことのほうがほとんどなんじゃないかな。特に IT 業界以外の場合(ウェブアプリ構築には多大なスキル習得のコストが必要になるし、Wiki もそこまでじゃないけど記法や使い方の習得にコストがかかる)
  • だから当然、軽い感じのプロジェクトは軽い感じの身近なツールですませるべきなんだけど、そこからプロジェクトが大規模になったときに、Excel だとバージョン管理がめんどくさかったり、必要な機能がそろってない、みたいなことになるだろう
  • そういうときに、ウェブアプリケーション構築や Wiki に乗り換えるための、移行作業にもコストがかかるわけで、そういうのも見越してプロジェクトにどんなコミュニケーションツールを使うか考えるべきだろう

[] 20:21 2009-01-31 - 何か作りながら書くメモ (tily) を含むブックマーク

2009-01-30

[][]1 章 サーバインフラ構築入門 - サーバインフラを支える技術 05:45 1 章 サーバ/インフラ構築入門 - サーバ/インフラを支える技術 - 何か作りながら書くメモ (tily) を含むブックマーク

  • 冗長化 (Redundancy)
  • コールドスタンバイはルーターとかの機器については現実的なオプション(データの同期が必要ないから)、しかしウェブサーバーの場合、ハードではなくて、持っているデータの内容まで同期しておかなければならないから、ホットスタンバイにしておく必要がある
  • フェイルオーバー
  • ICMP (Internet Control Message Protocol) 監視用のエコープロトコル

[]iTerm タブにわかりやすい名前をつける 02:39 iTerm タブにわかりやすい名前をつける - 何か作りながら書くメモ (tily) を含むブックマーク

[][]pylori*style wiki - RailsでWikiクローンを作る 11:59 [http://tam.qmix.org/wiki/Minki00.html:title=pylori*style wiki - RailsでWikiクローンを作る] - 何か作りながら書くメモ (tily) を含むブックマーク

2009-01-29

[]タイトルにはってあるリンクの内容について必ずしも語っているというわけではなくて、リンク先を読みながらいろいろ勉強した記録 21:36 タイトルにはってあるリンクの内容について必ずしも語っているというわけではなくて、リンク先を読みながらいろいろ勉強した記録 - 何か作りながら書くメモ (tily) を含むブックマーク

[]Rubyist Magazine - RubyOnRails を使ってみる 【第 3 回】 ActiveRecord 21:06 [http://jp.rubyist.net/magazine/?0006-RubyOnRails:title=Rubyist Magazine - RubyOnRails を使ってみる 【第 3 回】 ActiveRecord] - 何か作りながら書くメモ (tily) を含むブックマーク

  • ActiveRecord::Base.establish_connection(:adapter => 'sqlite3', :dbfile => 'test.db')
    • class User < ActiveRecord::Base end
    • user = User.new; user.name = 'John'; user.occupation = 'Musician'
    • user.save
    • User.find(:all)
  • Class#methods
  • ActiveRecord, find_all とか find_first とかなくなって、ActiveRecord#all とか ActiveRecord#first とかになったのか
  • find のプレースホルダー、? の代わりに名前付きのパラメータを渡すこともできる
  • ActiveRecordMacBook だと /usr/lib/ruby/user-gems/1.8/gems/ にあった
  • よくわからない -「self.append_features(base) は include 時に呼ばれるのでしたね。そして module ClassMethods は base.extend されているので、ここで定義されたメソッドは base (= ActiveRecord::Base) のクラスメソッドとして扱われます。ライブラリを分割する手法として非常に参考になります。」
  • Rails の config/database.yml は establish_connection メソッドに渡すためのデータを定義してたんだ
  • establish_connection で確立した DB 接続は、以降 ActiveRecord::Base.connection で参照できる
  • Test::Unit
  • テーブルが複数形で、それに対応するクラスが単数形
  • :has_many とか :belongs_to とか試す
  • 後半はとりあえずざっと目を通す感じで読んだ

[]twitter scheme 18:11 twitter scheme - 何か作りながら書くメモ (tily) を含むブックマーク

CREATE TABLE statuses(
  id      INTEGER PRIMARY KEY,
  user_id INTEGER,
  status  TEXT,
  hash    TEXT,
  link    TEXT,
  client  TEXT
);

CREATE TABLE users(
  id      INTEGER,
  name    TEXT
);

2009-01-28

[]Twitter を使っていろいろやりたい 23:33 Twitter を使っていろいろやりたい - 何か作りながら書くメモ (tily) を含むブックマーク

2009-01-25

[]Ubuntu をノート PC にインストール 11:27 Ubuntu をノート PC にインストール - 何か作りながら書くメモ (tily) を含むブックマーク

  • "buffer I/O error" というのが出てエラーになる
  • でもそもそも、MacBook で焼いたときにディスクユーティリティで書き込みエラーが出ていたみたい
  • emobile の回線が何回か切れたせいで ISO イメージが壊れているのかもしれない
    • 漫画喫茶とかで落として焼いたほうがいいか

2009-01-24

[]コンピュータ名を変更 04:20 コンピュータ名を変更 - 何か作りながら書くメモ (tily) を含むブックマーク

  • システム環境設定 → 共有

[]Windows 用に外付けハードディスクをフォーマット 02:35 Windows 用に外付けハードディスクをフォーマット - 何か作りながら書くメモ (tily) を含むブックマーク

[] 16:20 2009-01-24 - 何か作りながら書くメモ (tily) を含むブックマーク

[]BookBoard に登録している ASIN のリストを取得して MediaMarker に登録する Ruby プログラム 12:48 BookBoard に登録している ASIN のリストを取得して MediaMarker に登録する Ruby プログラム - 何か作りながら書くメモ (tily) を含むブックマーク

bb2mm.rb

#!/usr/local/bin/ruby
require 'Bookboard.rb'
require 'MediaMarker.rb'

# get Bookboard username/password
print 'input your Bookboard username:'
uname = $stdin.gets.chop
print 'password:'
system 'stty -echo'
pass = $stdin.gets.chop
system 'stty echo'
print "\n"

asin_list = Array.new
bb = Bookboard.new(uname, pass)
bb.login
0.upto(3) do |num|
  asin_list.concat bb.asin_list_by_cat(num)
end

# get MediaMarker username/password
print 'input your MediaMarker username:'
uname = $stdin.gets.chop
print 'password:'
system 'stty -echo'
pass = $stdin.gets.chop

mm = MediaMarker.new(uname, pass)
mm.login
asin_list.each do |asin|
  mm.register(asin)
end

Bookboard.rb

require 'rubygems'
require 'mechanize'
require 'logger'

class Bookboard
  @uname
  @pass
  @agent
  @log

  def initialize(uname, pass)
    @uname = uname
    @pass  = pass
    @agent = WWW::Mechanize.new
    @log   = Logger.new(STDOUT)
  end

  # log in
  def login
    @log.info("logging in")
    @agent.get('http://www.bookboard.jp/index.php')
    @agent.page.form_with(:method => 'POST') {|f|
      f.field_with('username').value = @uname
      f.field_with('password').value = @pass
      f.click_button
    }
  end

  # get asin list by category
  def asin_list_by_cat(num)
    @log.info('getting asin list by category number');
    asin_list = Array.new
    @agent.get("http://www.bookboard.jp/index.php?categori=#{num}")
    @agent.page.links_with(:href => /asin=/).each do |link|
      asin_list.push link.href.match(/asin=([0-9A-Z]+)/)[1]
    end
    return asin_list
  end
end

MediaMarker.rb

require 'rubygems'
require 'mechanize'
require 'logger'

class MediaMarker
  @agent
  @uname
  @pass
  @log

  def initialize(uname, pass)
    @agent = WWW::Mechanize.new
    @uname = uname
    @pass  = pass
    @log   = Logger.new(STDOUT)
  end

  # log in
  def login
    @log.info('logging in')
    @agent.get('http://mediamarker.net/login')
    @agent.page.form_with(:name => 'login'){|f|
      f.field_with(:name => 'uname').value = @uname
      f.field_with(:name => 'pass').value = @pass
      f.click_button
    }
    # todo: login failure process
  end
  
  # register asin
  def register(asin)
    @log.info("registering asin: #{asin}")
    @agent.get("http://mediamarker.net/reg?cat=1&asin=#{asin}")
    @agent.page.form_with(:name => 'reg'){|f| 
      f.click_button
    }
  end
end

2009-01-23

[].bashrc 14:44 .bashrc - 何か作りながら書くメモ (tily) を含むブックマーク

  • HISTSIZE=100000
  • HISTFILESIZE=100000

[] 10:48 2009-01-23 - 何か作りながら書くメモ (tily) を含むブックマーク

  • :%s/hoge/fuga/g 一括置換。% は全文という意味
  • dWdw の違い

[] 09:15 2009-01-23 - 何か作りながら書くメモ (tily) を含むブックマーク

  • /Library/StartupItems/ が OS 起動時に実行されるもの?

2009-01-22

[]REDLIGHT 23:04 REDLIGHT - 何か作りながら書くメモ (tily) を含むブックマーク

[]Agile Development with Rails 21:16 Agile Development with Rails - 何か作りながら書くメモ (tily) を含むブックマーク

[]Max OS X LeopardでAMP環境を構築しよう - Apache, MySQL, PHP, Perlで作る開発環境 - futomi’s CGI Cafe 20:28 [http://www.futomi.com/lecture/macosx/index.html:title] - 何か作りながら書くメモ (tily) を含むブックマーク

  • sudo cpan DBI だけじゃだめで sudo cpan YAML もしてから sudo cpan DBD::mysql した
    • いや、sudo cpan YAML は関係なくて force install DBD::mysql したら入る
  • dbtest.cgi、"Premature end of script headers" エラー出て動かない
    • なんか perl が 2 つ入っちゃってて、/opt/local/bin/perl と /usr/bin/perl がある
    • /opt/local/bin/perl には上記 3 つの cpan ライブラリが入ってるんだけど /usr/bin/perl のほうには入ってない
  • /tmp/mysql.sock

2009-01-21

[]MacBookTracインストール 00:59 MacBook に Trac のインストール - 何か作りながら書くメモ (tily) を含むブックマーク

[]MYSQL ユーザーの追加・削除 23:23 MYSQL ユーザーの追加・削除 - 何か作りながら書くメモ (tily) を含むブックマーク

  • 追加
    • GRANT ALL PRIVILEGES ON table_name.* TO username@hostname IDENTIFIED BY 'password';
  • 削除
    • SHOW PRIVILEGES;
    • REVOKE GRANT OPTION ON table_name.* FROM username@hostname;
    • DROP USER username@hostname;

参考

[]E-MOBILE + iptables - m o t d . 22:06 [http://d.hatena.ne.jp/nack-jin/20071226/1198646400:title] - 何か作りながら書くメモ (tily) を含むブックマーク

[]Max OS X LeopardでAMP環境を構築しよう - Apache, MySQL, PHP, Perlで作る開発環境 - futomi’s CGI Cafe 21:40 [http://www.futomi.com/lecture/macosx/index.html:title] - 何か作りながら書くメモ (tily) を含むブックマーク

  • ~/Sites/ の設定は /private/etc/users/username.conf でする
  • てか /etc/apache2/users/username.conf と同じだった
  • AddHandler cgi-script .cgi
  • Options All
  • AllowOverride All
  • tail -f
  • show columns from table;

[]port にパスを通す 21:15 port にパスを通す - 何か作りながら書くメモ (tily) を含むブックマーク

  • export /opt/local/bin:/opt/local/sbin:$PATH

[] 20:51 2009-01-21 - 何か作りながら書くメモ (tily) を含むブックマーク

  • C-x r k 矩形選択領域を切り取り

[][] echoサービスのクライアント 20:45 [http://www.coins.tsukuba.ac.jp/~yas/coins/syspro-2000/2000-05-08/tcpip-client-echo.html:title] - 何か作りながら書くメモ (tily) を含むブックマーク

  • hostname
  • telnet hostname 7
  • $Header: hogehoge Exp $ みたいなやつ

[]TODO 15:42 TODO - 何か作りながら書くメモ (tily) を含むブックマーク

[]unix commands 14:15 unix commands - 何か作りながら書くメモ (tily) を含むブックマーク

  • /usr/local/apache2/bin/httpd -S
  • finger
  • smbclient
  • tail -f # リアルタイムでログを監視

[] 14:12 2009-01-21 - 何か作りながら書くメモ (tily) を含むブックマーク

<html>
<head></head>
<body>

<h2>1</h2>
<p id="p1" onclick="click()">click</p>

<h2>2</h2>
<p id="p2">click</p>

<script type="text/javascript">
var flag = 0;
function click() {
  if(flag == 1) { return; }
  flag = 1;
}

p1 = document.getElementById('p1');

p1.appendChild(document.createTextNode('hoge'));
var myForm = document.createElement('form');
myForm.innerHTML = '<textarea></textarea><input type="submit" />';
console.log(myForm.innerHTML);
p1.appendChild(myForm);

</script>
</body>
</html>

[] 09:57 2009-01-21 - 何か作りながら書くメモ (tily) を含むブックマーク

[]Apache ディレクティブ 09:18 Apache ディレクティブ - 何か作りながら書くメモ (tily) を含むブックマーク

  • VirtualHost
  • Location
  • ScriptAlias
  • Alias

2009-01-20

[]sqlite shell 00:25 sqlite shell - 何か作りながら書くメモ (tily) を含むブックマーク

SQLite .q で終了

[] 00:07 2009-01-20 - 何か作りながら書くメモ (tily) を含むブックマーク

とりあえずの方針として RubyRails を勉強する

[]プログラミング Ruby - 第 22 章 Ruby の文法 22:47 プログラミング Ruby - 第 22 章 Ruby の文法 - 何か作りながら書くメモ (tily) を含むブックマーク

[]zsh 22:00 zsh - 何か作りながら書くメモ (tily) を含むブックマーク

  • cd - で pushd した候補を表示

[]KeyRemap4MacBook を修正・ビルドしてインストール 21:49 KeyRemap4MacBook を修正・ビルドしてインストール - 何か作りながら書くメモ (tily) を含むブックマーク

[]MacBookTracインストール 21:31 MacBook に Trac をインストール - 何か作りながら書くメモ (tily) を含むブックマーク

[]勉強したいこと 21:01 勉強したいこと - 何か作りながら書くメモ (tily) を含むブックマーク

  • UNIX のユーザー(www とか)
  • setuid

[]File System 20:58 File System - 何か作りながら書くメモ (tily) を含むブックマーク

[]vim 20:53 vim - 何か作りながら書くメモ (tily) を含むブックマーク

  • :new
  • :vnew
  • :e
  • :set noic 大文字小文字の区別をなくして検索
  • :ls
  • :bp
  • :bn
  • :b
  • 画面分割後の操作 C-w jkhl / C-w
  • C-r Redo
  • V (ビジュアルモード)で範囲指定、y でコピー

[]UNIX commands 20:48 UNIX commands - 何か作りながら書くメモ (tily) を含むブックマーク

[]一覧と詳細の中間 20:44 一覧と詳細の中間 - 何か作りながら書くメモ (tily) を含むブックマーク

一覧表示だといちいち個別のアイテムをリンクして見るのがめんどくさいし、詳細表示だと 1 画面に表示される情報量が少なすぎて物足りない。ぼくは一覧と詳細の中間のようなインターフェイスが欲しい。

ここまで考えて、「それって 2 ペイン構成にすれば解決するじゃん」とも思った(実際 Bloglines / Livedoor Readerキーボードショートカットと 2 ペインの組み合わせによる読むためのインターフェイスは魅力的)。

でもそれは違って、RSS リーダーのように単純に最新のものから順に表示するときには 2 ペイン + キーボードショートカットでもうまく行くんだけど、もっと複雑な情報、リゾーム状の情報だとか深く階層化された情報(たとえば 1 つの Wiki にあるページ群)をアプリケーションインターフェイスで表示するときは、そううまくはいかない。

自分の知ってる限り(かなり限りがある)では、TiddlyWikihowm ぐらいかな(AutoPagerize も近いか)。まだまだいっぱいあるんだろうけど、「これが決め手」っていう感じのものはまだ出ていないように思う。

2009-01-19

subversion commands 15:26 subversion commands - 何か作りながら書くメモ (tily) を含むブックマーク

最初の作業

mkdir repos
svnadmin create repos
mkdir work
echo 'hello' > work/test.txt
cd work
svn import file:///path/to/repos -m 'initial import'

[]vim のファイル文字コード変換 15:25 vim のファイル文字コード変換 - 何か作りながら書くメモ (tily) を含むブックマーク

[]magic_quote = addslashes 06:44 magic_quote = addslashes - 何か作りながら書くメモ (tily) を含むブックマーク

[]高木浩光@自宅の日記 - 駄目な技術文書の見分け方 その1 06:16 [http://takagi-hiromitsu.jp/diary/20061104.html:title] - 何か作りながら書くメモ (tily) を含むブックマーク

  • セカンドオーダー SQL インジェクション
  • 引用「セカンドオーダー云々なんてどうでもいいの。普通の開発者は覚えなくてよい用語。これは攻撃手法の用語であって、間違った方向性の対策がされているときにのみ意味のある話で、はじめから正しい対策を理解すればよいだけの話。 」
  • 引用「マスコミの記事でよく見かける表現に、「完全に○○ないわけではない」というものがあるが、これは断定できないことを言うときの逃げ口上だってことを知っておいたほうがよい。マスコミには許されるが、技術文書には許されない。技術文書なら、前提を明らかにした上でその前提の上で何が言えるかを書くのであって、例外があるなら例外を書くようにする。」

2009-01-18

高木浩光@自宅の日記 - プログラミング解説書籍の脆弱性をどうするか, 「サニタイズ言うなキャンペーン」とは何か, ASPとかJSPとかPHPとかERBとか、逆だ.. 05:46 [http://takagi-hiromitsu.jp/diary/20051227.html#p02:title] - 何か作りながら書くメモ (tily) を含むブックマーク

  • id や postdate はエスケープの必要がないけど、「問題を局所的にとどめる」という観点から htmlspecialchars に通すべき。無駄な処理かもしれないけど、前述の観点を優先して富豪的プログラミングする
  • HTML文字列を出力するときは、エスケープ用の関数を使うのがデフォルトという考え方。セキュリティ云々の話ではなくて、「問題を局所的にとどめる」という考えから。これを守っていればセキュリティの問題もそもそも起こらない
  • 引用「とりあえず「サニタイズ」も「エスケープ」も口にしないようにしてみたらよい。」
  • magic_quote_gpc はデフォルトで OFF にしておくべき
  • stripslashes

2009-01-17

「サニタイズ言うなキャンペーン」私の解釈 18:07 [http://kmaebashi.com/zakki/zakki0042.html:title] - 何か作りながら書くメモ (tily) を含むブックマーク

  • prepared statement/パラメタライズドSQL ← どこかに標準みたいのがあるんだろうか
  • 引用「だからこそ、入力の段階でシングルクォートをエスケープしてしまうPHPのmagic quoteや、 HTMLでエスケープしなければならない文字を(デフォルトでは) 入力の段階で弾いてしまうASP.NETは、そもそもその発想からして間違っている、と私は思う※1。」
  • 引用「プログラミングにおいてたいていの問題は「層を積み重ねる」ことで解決されてきた。」
  • 引用「セキュリティ云々を考えなくても、通常のアプリケーション設計の発想で「できるだけきれいな世界にいられるように」書いていけば、自然に達成できるはずのことである。 」
  • magic_quote について調べる

2009-01-16

[][]Mecabを使って日本語に対応したsayコマンドを作った - hitode909のダイアリー 04:38 [http://d.hatena.ne.jp/hitode909/20080124/1201144244:title] - 何か作りながら書くメモ (tily) を含むブックマーク

PHPの等号についてまとめる 04:15 PHPの等号についてまとめる - 何か作りながら書くメモ (tily) を含むブックマーク

プログラミング作法」を読む 04:14 「プログラミング作法」を読む - 何か作りながら書くメモ (tily) を含むブックマーク

01:17 2009-01-16 - 何か作りながら書くメモ (tily) を含むブックマーク

[][Studying HTTP] Message Bodyを読む 00:56 [http://www.studyinghttp.net/body:title]を読む - 何か作りながら書くメモ (tily) を含むブックマーク

2009-01-15

[]ステータスコードについて理解を深めるために[Studying HTTP] HTTP Status Codeを読む 21:54 ステータスコードについて理解を深めるために[http://www.studyinghttp.net/status_code:title]を読む - 何か作りながら書くメモ (tily) を含むブックマーク

2009-01-13

[]いろいろ いろいろ - 何か作りながら書くメモ (tily) を含むブックマーク

  • howm-menu を呼び出して他のウィンドウを消す関数書きたい

[]COMMANDS COMMANDS - 何か作りながら書くメモ (tily) を含むブックマーク

  • describe-bindings
  • goto-line
    • 行移動
  • delete-window
    • 現在のウィンドウを消す(C-x 0)
  • delete-other-windows
    • 現在のウィンドウ以外を消す(C-x 1)

[] 2009-01-13 - 何か作りながら書くメモ (tily) を含むブックマーク

勉強用のブログ。書くのは主に以下のこと

  • ちょっと調べてまとまった文章を書くモード
  • 雑多な知識の断片を書き連ねるモード

2007-12-18

[][]Debian SargeにMeCabとText::MeCab(Perlモジュール)をインストール 20:47 Debian SargeにMeCabとText::MeCab(Perlモジュール)をインストール - 何か作りながら書くメモ (tily) を含むブックマーク

apt-get install mecab
apt-get install libmecab-dev
cpan install Text::MeCab

apt-getでmecabインストールしたあとに、cpanシェルでText::MeCabインストールしようとすると、mecab-configというコマンドが見つからなくて中止になってしまう。

いろいろ調べたんだけど、Debianの場合MeCabパッケージ本体にはmecab-configが含まれておらず、libmecab-devに入っているようだ(参照: [SpamAssassin-JP 336] Re: Debian Package => SpamAssassin-3.1.4日本語対応パッチ(案、その5) )。

apt-getでlibmecab-devを入れたら無事にmecab-configコマンドがインストールされた。

そのあとcpanシェルでinstall Text::MeCabしたら無事にインストール終了。

MeCabの辞書をUTF8エンコーディングにしたい 20:52 MeCabの辞書をUTF8エンコーディングにしたい - 何か作りながら書くメモ (tily) を含むブックマーク

[][]MeCabを使ってみる 21:06 MeCabを使ってみる - 何か作りながら書くメモ (tily) を含むブックマーク

[を] Text::MeCabは導入が楽に出ているプログラムのテキストを変えて動かしてみただけ。

リスト:

#! /usr/bin/perl
use Text::MeCab;
my $m = Text::MeCab->new();
my $str_euc = "何の幸せの人格についてなら11回分だろう、君は冷凍庫のトラックは既に文章の犬。";
my $n = $m->parse($str_euc);
while ($n = $n->next) {
    printf("%s\t%s\t%d\n",
           $n->surface,
           $n->feature,
           $n->cost
           );
}

出力結果:

何の    連体詞,*,*,*,何の,なんの,代表表記:何の  4108
幸せ    形容詞,*,ナ形容詞,語幹,幸せだ,しあわせ,代表表記:幸せだ  11380
の      助詞,接続助詞,*,*,の,の,*       18649
人格    名詞,普通名詞,*,*,人格,じんかく,代表表記:人格   23766
に      助詞,格助詞,*,*,に,に,* 27984
ついて  動詞,*,子音動詞カ行,タ系連用テ形,つく,ついて,代表表記:就く      32369
なら    助詞,接続助詞,*,*,なら,なら,*   36676
11      名詞,数詞,*,*,*,*,*     49399
回      接尾辞,名詞性名詞助数辞,*,*,回,かい,*   51748
分      接尾辞,名詞性名詞助数辞,*,*,分,ふん,*   56084
だろう  判定詞,*,判定詞,ダ列基本推量形,だ,だろう,*      62377
、      特殊,読点,*,*,、,、,*   56835
君      名詞,普通名詞,*,*,君,きみ,漢字読み:訓 代表表記:君       64844
は      助詞,副助詞,*,*,は,は,* 66819
冷凍    名詞,サ変名詞,*,*,冷凍,れいとう,代表表記:冷凍   73760
庫      名詞,普通名詞,*,*,庫,こ,漢字読み:音 代表表記:庫 80307
の      助詞,接続助詞,*,*,の,の,*       83274
トラック        名詞,普通名詞,*,*,トラック,とらっく,代表表記:トラック   89267
は      助詞,副助詞,*,*,は,は,* 91242
既に    副詞,*,*,*,既に,すでに,代表表記:既に    96904
文章    名詞,普通名詞,*,*,文章,ぶんしょう,代表表記:文章 104661
の      助詞,接続助詞,*,*,の,の,*       107628
犬      名詞,普通名詞,*,*,犬,いぬ,漢字読み:訓 代表表記:犬       112763
。      特殊,句点,*,*,。,。,*   109395
        BOS/EOS,*,*,*,*,*,*     109179

2007-12-17

Favotterから直接FavするグリモンをAutoPagerize対応にしようとしてるんだけどうまくいかない 22:26 Favotterから直接FavするグリモンをAutoPagerize対応にしようとしてるんだけどうまくいかない - 何か作りながら書くメモ (tily) を含むブックマーク

[][]Windows VistaでPerl+MeCabを使う 22:05 Windows VistaでPerl+MeCabを使う - 何か作りながら書くメモ (tily) を含むブックマーク

Mecab本体のインストール

Text-Mecabのインストール

人工無脳を作るのに参考になりそうな書籍・サイト 22:24 人工無脳を作るのに参考になりそうな書籍・サイト - 何か作りながら書くメモ (tily) を含むブックマーク

2007-12-01

Favotterに直接favするボタンをつけるGreaseMonkeyスクリプト 13:42 Favotterに直接favするボタンをつけるGreaseMonkeyスクリプト - 何か作りながら書くメモ (tily) を含むブックマーク

<追記>

os0xさんがMinibuffer用のTwitter Post & Favコマンドを作られたので、そっちのほうを使ったほうがいいです。

http://d.hatena.ne.jp/os0x/20071201/1196460723

以下のスクリプトはあくまで勉強用に作ったものなので、信頼性が低いです。

</追記>

<追記2>

ふぁぼったーの仕様変更で動かなくなっていたのですが、jt_noSkeさんが修正して動くようにしてくれました。ここに載せている「インストール」リンクと、ソースコードにも反映しておきました。Tnx!

</追記2>

かなり動作がもっさりしてるんだけど、一応作ってみた。

FavotterでFavってない発言があると、日時表示の右に「Favに追加」という文字が出る。

「Favに追加」という文字をクリックすると、自分のFavに追加するリクエストが始まる。

追加が終了すると、「Fav済」という文字に変わる。

ダメっぽいところ:

  • 正規表現使ってるところが多くてソースが汚い
  • document.evaluateを2回使ってるんだけど1回に減らせるのだろうか
  • AutoPagerize非対応

どんどんダメ出しお願いします。

インストール

// ==UserScript==
// @name          Favotter Direct Fav
// @namespace     http://studyroom.g.hatena.ne.jp/tily/
// @include       http://favotter.matope.com/*
// ==/UserScript==
(function (){
    var attr_links = document.evaluate("//div[@class='info meta entry-meta']", document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
    for(var i = 0; i < attr_links.snapshotLength; i++) {
        var l = attr_links.snapshotItem(i);
        l.innerHTML.match(/<a title="[^"]*" href="([^"]*)">/);
        var status_url = RegExp.$1;
        l.innerHTML.match(/<a class="taggedlink" href="status\.php.*?(\d.+)">/);
        var status_id = RegExp.$1;
        status_url = status_url + "/statuses/" + status_id;

        make_link(status_url, status_id, i);
    }
    function make_link(status_url, status_id, num){
        GM_xmlhttpRequest({ // confirm whether already faved or not
            method: 'GET',
            url: status_url,
            onload: function(res){
                if(res.responseText.match(/icon_star_full/)){
                }else if(res.responseText.match(/icon_star_empty/)){
                    _make_link(status_id, num);
                }else{ // Not Logged in to Twitter
                }
            }
        });
    }
    function _make_link(status_id, num){
        var attr_links = document.evaluate("//span[@class='xfolkentry']", document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
        var l = attr_links.snapshotItem(num);
        l.innerHTML = l.innerHTML.replace(/(\d+ fav by)/, '<span id="add_' + status_id + '_to_fav">Favに追加する</span> ' + RegExp.$1);
        var span = document.getElementById('add_' + status_id + '_to_fav');
        span.addEventListener(
            'click',
            function(){create_fav(status_id)},
            false
        );
    }
    function create_fav(status_id){
        GM_xmlhttpRequest({
            method: 'GET',
            url: 'http://twitter.com/favourings/create/' + status_id,
            onload: function(){
                span = document.getElementById('add_' + status_id + '_to_fav');
                span.innerHTML = "fav済";
            }
        });
    }
})();

jt_noSkejt_noSke2007/12/10 17:04ふぁぼったー仕様変更により動かなくなっていたので直しましたよ。
たぶんこれで動くと思います。

function make_link までのところを以下のコードに置き換え

(function (){
{
var attr_links = document.evaluate("//div[@class='info meta entry-meta']", document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
for(var i = 0; i < attr_links.snapshotLength; i++) {
var l = attr_links.snapshotItem(i);
l.innerHTML.match(/<a title="[^"]*" href="([^"]*)">/);
var status_url = RegExp.$1;
l.innerHTML.match(/<a class="taggedlink" href="status\.php.*?(\d.+)">/);
var status_id = RegExp.$1;
status_url = status_url + "/statuses/" + status_id;

make_link(status_url, status_id, i);
}

2007-11-23

学習のしかたについて 17:46 学習のしかたについて - 何か作りながら書くメモ (tily) を含むブックマーク

最初は人のコードを読んだり参考にしたりしながら、じょじょに自分のコードを書けるようになっていく、というのは結構あるっぽい。

あと「読んだり参考にしたり」とはちょっと違うけど、自分の目的にとって本質的ではないコードについては「コピペ」するのもあり。

もちろん、最初はただコピペした内容でも、あとからちゃんと読んで理解することが必要だ。

[][]JavaScriptでの形態素解析についてメモ 18:13 JavaScriptでの形態素解析についてメモ - 何か作りながら書くメモ (tily) を含むブックマーク

  • munotterでは、外部の形態素解析エンジンを使用せずに「漢字・ひらがな・カタカナ・アルファベット・全角アルファベット・アスキー文字記号・全角記号・スペース」を単語の区切りとしている(L116-125)。
       GamMo.prototype.pattern = {
         "kanji": "([一-龠々〆ヵヶ]+)",
         "hiragana": "([ぁ-ん]+)",
         "katakana": "([ァ-ヴー]+)",
         "word": "([a-zA-Z0-9_]+)",
         "zenkaku": "([a-zA-Z0-9]+)",
         "ascii": "([!-~]+)",
         "kigoh": "([、。!?()「」『』’”!-\/:-@\[-\^`\{-~])",
         "space": "([ \\s\\n]+)"
         };

一番てっとり早い日本語形態素解析の方法ではあるけど、たとえば「わたしはかなしい」のような文が一つの形態素として解釈されてしまったり、逆に「冷やし中華」が「冷」と「やし」と「中華」の3つの形態素に分解されてしまう。

  • GreaseMonkeyでは、GM_XMLHttpRequestからYahoo!形態素解析APIを利用することができる。
  • HTML+JavaScriptでは、XMLHttpRequestに制限があるためできない。Yahoo!形態素解析APIがJSONPに対応したとしても、JSONPにはPOSTが無いからダメ(参考:Javascriptでdiffる ( with 形態素解析 ) (nakatani @ cybozu labs))。

とりあえずGreaseMonkey + Yahoo!形態素解析APIを試してみようかな。

korn_freakkorn_freak2008/04/26 10:56こんなのありますよ
http://chasen.org/~taku/software/TinySegmenter/
すごい

2007-11-22

[]Twitter Text Cutupを書いたあとのまとめ 11:35 Twitter Text Cutupを書いたあとのまとめ - 何か作りながら書くメモ (tily) を含むブックマーク

Twitterの発言をカットアップするGreaseMonkeyスクリプト - 何か作りながら書くメモ (tily) - はてな自習室

[]5分でどれだけ多くのHTML要素を挙げられるか 11:54 5分でどれだけ多くのHTML要素を挙げられるか - 何か作りながら書くメモ (tily) を含むブックマーク

43 elements remain

Named so far:

A, B, BLOCKQUOTE, BODY, BR, CITE, CODE, DD, DEL, DIV, DL, DT, EM, FIELDSET, FONT, FORM, H1, H2, H3, H4, H5, H6, HEAD, HTML, I, INPUT, LEGEND, LI, LINK, META, OL, P, PRE, Q, S, SCRIPT, SPAN, STRIKE, STRONG, STYLE, TABLE, TBODY, TD, THEAD, TITLE, TR, U, UL,

You forgot:

ABBR, ACRONYM, ADDRESS, APPLET, AREA, BASE, BASEFONT, BDO, BIG, BUTTON, CAPTION, CENTER, COL, COLGROUP, DFN, DIR, FRAME, FRAMESET, HR, IFRAME, IMG, INS, ISINDEX, KBD, LABEL, MAP, MENU, NOFRAMES, NOSCRIPT, OBJECT, OPTGROUP, OPTION, PARAM, SAMP, SELECT, SMALL, SUB, SUP, TEXTAREA, TFOOT, TH, TT, VAR,

もくもく会 22:54 もくもく会 - 何か作りながら書くメモ (tily) を含むブックマーク

最初タバコ吸う人たちの集まりかと思った。

知らないことが多すぎて恥ずかしい 22:54 知らないことが多すぎて恥ずかしい - 何か作りながら書くメモ (tily) を含むブックマーク

2007-11-21

[]Twitter Append To-iu LifeHack ver.2 06:10 Twitter Append To-iu LifeHack ver.2 - 何か作りながら書くメモ (tily) を含むブックマーク

Twitter Append dead word from shigo.comのソースを見ながら、発言をsubmitするときにも「というライフハック」をつけるようにした。

勉強になったのは下記の3点:

  • 既存のsubmitボタンにグリモンから新しいアクションを追加するやり方
  • window / unsafeWindow判定の定型文
  • unsafeWindowでgetElementByTagName()

インストール

// ==UserScript==
// @name          Twitter Append To-iu LifeHack
// @namespace     http://studyroom.g.hatena.ne.jp/tily/
// @include       http://twitter.com/*
// ==/UserScript==
(function() {
    var append_word ="というライフハック";
    statuses = document.evaluate("//span[@class='entry-title entry-content']", document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
    for(var i = 0; i < statuses.snapshotLength; i++) {
        s = statuses.snapshotItem(i);
	s.innerHTML += append_word;
    }
    var onclick_orig;
    var w = (typeof unsafeWindow == 'undefined') ? window : unsafeWindow;
    var submit = w.document.getElementsByClassName('update-button')[0];
    var onclick = function() {
        document.getElementById('status').value += append_word;
	submit.onclick = onclick_orig;
	submit.click();
	submit.onclick = onclick;
	return false;
    }
    onclick_orig = submit.onclick;
    submit.onclick = onclick;
})();

SEE ALSO:

ちょっとした更新にチェックしてもRSS Feedには反映されてしまうのね 06:47 ちょっとした更新にチェックしてもRSS Feedには反映されてしまうのね - 何か作りながら書くメモ (tily) を含むブックマーク

[]「まるごとJavaScript」の「ものぐさなGreaseMonkeyの飼い方」を読んでいる 06:50 「まるごとJavaScript」の「ものぐさなGreaseMonkeyの飼い方」を読んでいる - 何か作りながら書くメモ (tily) を含むブックマーク

[]Twitterの発言をカットアップするGreaseMonkeyスクリプト 01:01 Twitterの発言をカットアップするGreaseMonkeyスクリプト - 何か作りながら書くメモ (tily) を含むブックマーク

すでにタイムラインにのっているすべての発言をカットアップ。

カットアップ前:

しょぼいスクリプトでも人に使ってもらってるの見るとうれしい!というライフハック カセット!!!

Twitter / tily

カットアップ後:

リプトでもライフハック人に使ってもらょぼいスクセという カ見る とうれしい! し ット!!! ってるの

インストール

// ==UserScript==
// @name          Twitter Text Cutup
// @namespace     http://studyroom.g.hatena.ne.jp/tily/
// @include       http://twitter.com/*
// ==/UserScript==
(function() {
    var split_char_max = 7; // lucky seven
    var statuses = document.evaluate("//span[@class='entry-title entry-content']", document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
    for(var i = 0; i < statuses.snapshotLength; i++){
        s = statuses.snapshotItem(i);
	s.innerHTML = s.innerHTML.replace(/<a.*?>(.*?)<\/a>/g, "$1");
	s.innerHTML = cutup_text(s.innerHTML);
    }
    function cutup_text(text){
        var array = [];
        while(text.length > 0){
	    var randnum = Math.floor(Math.random() * split_char_max + 1);
	    var fragment = text.substr(0, randnum);
	    array.push(fragment);
	    text = text.substr(randnum, text.length);
	}
	shuffle(array);
        return array.join("");
    }
    function shuffle(list) {
        var i = list.length;
        while (--i) {
            var j = Math.floor(Math.random() * (i + 1));
            if (i == j) continue;
            var k = list[i];
            list[i] = list[j];
            list[j] = k;
        }

    return list;
    }
})();

fubaさんのPerlスクリプトが面白いと思ったので、似たようなことをGreaseMonkeyでやってみた。

fubaさんみたいにMeCabで形態素解析とかはしてなくて、

  1. ランダムに1文字から7文字の間で分ける
  2. 配列にする
  3. shuffleする
  4. joinする

という流れ。GANTZの宇宙人がしゃべる言葉みたいになる。

ゆくゆくはYahoo!形態素解析APIを使って形態素に分けてfubaさんのやっているようなアルゴリズムも試してみたい。

あと、LDRize SITEINFO Wikiの情報を流用して、Twitterだけじゃなく主だったサイトをカットアップとかも勉強用に試す。

SEE ALSO:

2007-11-20

[]わかったこと 14:22 わかったこと - 何か作りながら書くメモ (tily) を含むブックマーク

  • (function(){...}());は他のスクリプトと名前空間がかぶらないように使う
  • XPathをどんな風につかうのかなんとなくつかんだ
  • ASCII文字以外の文字列をハードコードする場合、UTF8を使わないと文字化けする

[]疑問 14:22 疑問 - 何か作りながら書くメモ (tily) を含むブックマーク

  • document.evaluate()の引数にとらせるものがよくわかってない(XPath自体を少し勉強しなければ)
  • ORDERED_NODE_SNAPSHOT_TYPE以外のXPathResultのプロパティはどういうときに使うのか

[]やりたいこと 14:22 やりたいこと - 何か作りながら書くメモ (tily) を含むブックマーク

  • Twitter Append To-iu LifeHackに、発言をsubmitしたときに自動で語尾に「というライフハック」をつける機能も追加してみる
  • Twitter Append To-iu LifeHackに、元の発言に「というライフハック」が入ってたら何もしない、という条件判定を追加する
  • もうありそうだけど、Twitterの自分のfavをTumblrにQuoteするグリモン
  • 前にQuoteしたTwitterのstatus IDを覚えておいて、重複してQuoteしないようにする
  • Quoteずみの発言は灰色にするとか
  • Twitterのstatusにチェックボックスをつけて、Quoteしたい発言を選べるようにする
  • やっぱりLingr + MMLで音を使ってチャットできるグリモンを書いてみたいなぁ

2007-11-19

[]プログラミング作法を読む 10:36 プログラミング作法を読む - 何か作りながら書くメモ (tily) を含むブックマーク

プログラミング作法」を読んでいるんだけど、いちいち納得するのに頭からすり抜けていく感じがするので、メモ。

とりあえず重要なところを抜粋するという感じだけど、あとで自分なりの言葉で説明を入れるかも。

本のコード例がC/C++/Javaなので、Perl/Ruby/JavaScriptに書き換えるのも面白そう。

[]スタイルについて(1) 名前 08:58 スタイルについて(1) 名前 - 何か作りながら書くメモ (tily) を含むブックマーク

グローバルにはわかりやすい名前を、ローカルには短い名前をつける

統一する

関数には能動的な名前をつける

基本的にはgetTime()のように能動的な「動詞+名詞」の名前をつける。

真偽値を返す関数にはisOctal()みたいにisで始まる名前を付ける。

的確に名前をつける

[]スタイルについて(2) 式と文 10:36 スタイルについて(2) 式と文 - 何か作りながら書くメモ (tily) を含むブックマーク

構造がわかるようにインデントする

自然な形の式を使う

かっこを使ってあいまいさを解消する

複雑な式は分割する

明快に書く

副作用に注意する

[]スタイルについて(3) 一貫性と慣用句 10:36 スタイルについて(3) 一貫性と慣用句 - 何か作りながら書くメモ (tily) を含むブックマーク

インデントとブレースのスタイルを統一する

慣用句によって一貫性を確保する

多分岐の判定にelse-ifを使う

[]スタイルについて(4) 関数マクロ 10:36 スタイルについて(4) 関数マクロ - 何か作りながら書くメモ (tily) を含むブックマーク

関数マクロはLLには無い(よね?)のでとりあえず読み飛ばしてもいいかな。

関数マクロはなるべく使わない

マクロの本体と引数はかっこに入れる

[]スタイルについて(5) マジックナンバー 10:36 スタイルについて(5) マジックナンバー - 何か作りながら書くメモ (tily) を含むブックマーク

マジックナンバーには名前をつける

数値はマクロではなく定数として定義する

整数ではなく文字定数を使う

オブジェクトサイズは言語に計算させる

[]スタイルについて(6) コメント 10:36 スタイルについて(6) コメント - 何か作りながら書くメモ (tily) を含むブックマーク

当たり前のことはいちいち書かない

関数とグローバルデータにコメントする

悪いコードにコメントをつけない。書き直す

コードと矛盾させない

混乱を招かないようにあくまでも明快に書く

プログラミング作法

プログラミング作法

The Practice of Programming (Addison-Wesley Professional Computing Series)

The Practice of Programming (Addison-Wesley Professional Computing Series)

[]編集画面を開いたら自動で「ちょっとした更新」にチェックするGreaseMonkey 10:58 編集画面を開いたら自動で「ちょっとした更新」にチェックするGreaseMonkey - 何か作りながら書くメモ (tily) を含むブックマーク

// ==UserScript==
// @name          Check Trivial
// @namespace     http://studyroom.g.hatena.ne.jp/tily/
// @description   Automatically check "trivial update" checkbox
// @include       http://d.hatena.ne.jp/*
// @include       http://*.g.hatena.ne.jp/*
// ==/UserScript==
document.getElementById("trivial").checked = true;

[]Twitterのすべての発言に「というライフハック」をつけるグリモン 03:54 Twitterのすべての発言に「というライフハック」をつけるグリモン - 何か作りながら書くメモ (tily) を含むブックマーク

発言の最後に「というライフハック」と付けるグリモン作った。

Twitter / eigokun

おれも作ってみた。XPathはじめて使った。

インストール

// ==UserScript==
// @name          Twitter Append To-iu LifeHack
// @namespace     http://studyroom.g.hatena.ne.jp/tily/
// @include       http://twitter.com/*
// ==/UserScript==
(function() {
    statuses = document.evaluate("//span[@class='entry-title entry-content']", document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
    for(var i = 0; i < statuses.snapshotLength; i++){
        s = statuses.snapshotItem(i);
	s.innerHTML = s.innerHTML + "というライフハック";
    }
})();

うざくなってすぐ消した。

SEE ALSO: 4.6. Doing something for every element with a certain attribute [Dive Into Greasemonkey]

2007-11-18

作ってみたいもの 15:09 作ってみたいもの - 何か作りながら書くメモ (tily) を含むブックマーク

勉強していつか作りたいと思うもの

とりあえず作ってみようと思っているもの

道具と言語 15:33 道具と言語 - 何か作りながら書くメモ (tily) を含むブックマーク

今使っている道具や言語をもっと使いこなせるようになりたい。

道具

言語

[]Hello, World 15:40 Hello, World - 何か作りながら書くメモ (tily) を含むブックマーク

// ==UserScript==
// @name          Hello World
// @namespace     http://studyroom.g.hatena.ne.jp/tily/
// @description   alert "Hello world!" on every page
// @include       *
// ==/UserScript==
alert('Hello World');

2007-11-15

Wikiみたいに常に書き換えながら使っていきたいと思っている 15:05 Wikiみたいに常に書き換えながら使っていきたいと思っている - 何か作りながら書くメモ (tily) を含むブックマーク

Wikiみたいに常に書き換えながら使っていきたいと思っているんだけど、グループのトップページに上がりまくって迷惑になってしまうだろうか。

[]「twitterの@hogeにリンクを復活」を読んだ 15:05 「twitterの@hogeにリンクを復活」を読んだ - 何か作りながら書くメモ (tily) を含むブックマーク

GreaseMonkeyでXPathの使った例の1つとして記憶した。

phapha2007/11/18 23:38>wikiみたいに
別にいいと思いますよ。僕もそんな風に使ってますし。あと、「ちょっとした更新」にチェックを入れて更新すると上がらないようにもできます。

tilytily2007/11/18 23:51どうも、これ!って感じで固定した記事にまとめるのが苦手なんですよね。試行錯誤してます。
>「ちょっとした更新」
目についてたけど使ってなかった。試してみます、ありがとう。