はてなキーワード: MAPとは
マークアップに困ったときは、ちゃんとマークアップしてそうなサイトを参考にしているんだけど、(なんで今までやらなかったんだろう)初めてW3CのページのHTMLを見た。そしたら、タイトルの下のナビゲーション部分が下のようなマークアップになっていたんだけどさ(改行とインデントは僕がつけた)。
<map title="Introductory Links" id="introLinks" name="introLinks"> <div class="banner"> <span class="invisible"> <a href="#technologies" title="Skip introductory links and the mission statement" class="bannerLink"> Skip to Technologies </a> | </span> <a href="/Consortium/activities" accesskey="A" title="W3C Activities" class="bannerLink"> Activities </a> | <a href="/TR/" accesskey="T" title="Technical Reports and Recommendations" class="bannerLink"> Technical Reports </a> | <a href="/Consortium/siteindex" accesskey="S" title="Alphabetical Site Index" class="bannerLink"> Site Index </a> | <a href="/Consortium/new-to-w3c" accesskey="N" title="Help for new visitors" class="bannerLink"> New Visitors </a> | <a href="/Consortium/" accesskey="B" title="About W3C" class="bannerLink"> About W3C </a> | <a href="/Consortium/join" accesskey="J" title="Join W3C" class="bannerLink"> Join W3C </a> | <a href="/Consortium/contact" accesskey="C" title="Contact W3C" class="bannerLink"> Contact W3C </a> </div> </map>
…えっと、普通はっていうか、一般的には、ナビゲーションってul,li要素にしない?map要素ってなにこれ、なんでこんな場所で使われてんの?map要素ってイメージマップに使う要素じゃないの?
うごメモはてな - ゆうたさんの作品のスター/コメントを集計してみた。スターの方はentry.jsonを適当に処理して、コメントの方はHTMLを適当に処理した。
スクリプトはこんな感じ。
HTMLを正規表現でごにょごにょして['hoge', 'piyo', 'fuga', 'piyo']みたいな配列にして、でもこれだけだとコメントした回数がカウントできずに何回も同じユーザーが出てきてしまうから
a = ['hoge', 'piyo', 'fuga', 'piyo'] l = [] for i in a: l.append([i, a.count(i)]) l = list(set(map(lambda x: tuple(x), l))) l.sort(lambda x, y: cmp(y[1], x[1])) for i in l: print i[0], i[1]
とする。
import urllib, json h = urllib.urlopen('http://s.hatena.ne.jp/entry.json?uri=http%3A%2F%2Fugomemo.hatena.ne.jp%2F0B3D19604CE04B2F%40DSi%2Fmovie%2FE04B2F_08720FF94B42A_002') a = json.load(h) f=open('stars.txt', 'w') sys.stdout=f for i in a[u'entries'][0][u'stars']: print i[u'name'], i[u'count']
ところでなんだが、staxってとこがAmazonのEC2サービス上でTomcatを無料開放しているらしいのだ。
http://jp.techcrunch.com/archives/20081216stax-networks-launches-google-app-engine-for-java/
で置いた。
http://db-view.johannes.staxapps.net/
ソースはここ
http://code.assembla.com/dmcsystemservice/subversion/nodes/db-view/trunk
これ作ったころはGUIの閲覧ツールってAccessとかしかなくて、結構好評だったのだが、今はフリーのクライアントソフトがいっぱいでもう、俺の出番おわったわ。
まずJavaを入れる。
http://java.sun.com/javase/ja/6/download.html
で、eclipseを入れる。
http://www.eclipse.org/downloads/
で起動してみる。
が。。。。起動しない。
でggr。
となんかeclipse.iniがおかしいらしい。
http://ajiblog.sblo.jp/article/17157448.html
おっきした!!
でアカウントをとる。
http://code.assembla.com/dmcsystemservice/
http://www.atmarkit.co.jp/fjava/rensai3/eclipseplgn15/eclipseplgn15_1.html
subversiveも使ってみたいなぁと思ったが、ここでeclipseがバシバシ落ちる。
eclipse.iniのXMXオプションをいじるがOutOfMemoryやら、libeay32.dll 序数が見つかりません。とか
秩序ってなんだよ。英語でそのままいってくれ。余計わからん。
でなんか、負けた気がしたが、Javaを5に落とすことにした。
http://java.sun.com/j2se/1.5.0/ja/download.html
XMXを768Mにして起動すると、落ちなくなった。
が、相変わらず、秩序が見つからなくなる。秩序って何。膣女?
こっちのsvnプラグインのほうがいいのかも。。来年やろう。そのうちやろう。ゆっくりしていってね!!
http://server.seasar.org/manual/install_subclipse.html
http://d.hatena.ne.jp/yuroyoro/20081222/1229922781
楽勝だ。
で、また動かない。
で、動いた。が、履歴機能が動かない。
で、ソース修正。
ObjectInputStream、OutputStreamを使っていたのだがXMLEncoderとDecoderにした。
http://www.utj.co.jp/xml/dev/java/dxjava_7.html
ぉ。こんな便利なのが1.4からあったのか。
おもえば、これを最初に作った時は1.3だった。LinkedHashMapがなくてArrayList内包したMapを作っていた。
が、そんなのいらんので消した。で、履歴保持クラスもXMLEncoderからリフレクトできるようにガバガバにプロパティをさらした。
そしたら、動く。履歴機能が動く。
ぉぉ。では早速、svnにあげよう。
で、eclipseのsvnクライアント。相変わらず膣女が見つからないらしい。
去年だったかな、女の子にipodの音はどうやって大きくするの?と聞かれて、右にくるくる。と答えると、
あ、大きくなった。今度、のび太くんのもまわしてみよう。と言われた。
あれから右にくるくるされてない。泣きたい。あの娘は膣女だった。
そんなことを思いながら、エロサイトに誘導されて一回休み。eclipseを落とす。
http://pics.dmm.co.jp/digital/video/h_155tdjk00001/h_155tdjk00001pl.jpg
で、eclipse再起動。svnクライアント。相変わらず膣女が見つからないらしい。
おれくらい帰国子女になれば、英語のメニューのほうが調子がいい。
と思っていたが、svnクライアントだけ微妙に日本語化されている。
が、肝心なところが英語だ。よくわからん。CVSと一緒だろ。と思ってUpdateしたら、ソースが消えた。。。
LocalHistoryから復元しようと思ったのだが、まんどくさい。
staxにDeployしたやつを再度ダウンロードしたら元に戻った。
びっくりした。バックアップソフトでクラッシュする。そんなことも初心者には、おうおうにしてある。
だからバックアップのバックアップ(ryで無限ループにはまるシステムも少なくない。
あきらめが大事だ。ある程度であきらめないとキリがない。
で、再度svnクライアント。今度はCommitをちゃんと選ぶ。
が、明らかにUploadしていない。で、終わると、いくつかのファイルのアップロードはキャンセルされた。とかでる。
で、再度svnクライアント。またまたCommitをちゃんと選ぶ。
ぉ。今度はうまくいく。あきらかにさっきより時間がかかっている。WireShirkで見てないが、あきらかにsvnサーバーにソケットをはっている。
http://code.assembla.com/dmcsystemservice/subversion/nodes/db-view/trunk
ぉぉ。あがっている。
さてタグを設定して、ブランチを作ってみたいみたいが、壊れそうなので怖い。いつからか大人の恋に臆病だ。
XMLEncoderの入出力をBufferedにしようと思ったが、もういいや。
で、寄り道している間に、こんなのを今更発見した。
http://tuigwaa.sandbox.seasar.org/index.html
これだ。俺が欲しかったのはこれだ。
これぐらい楽勝じゃないと、プログラマはわりに合わない。
さっそく落とす。
が、動かない。誰のせい?それはあれだ。また奴だ。。。
もういい。まんどくさい。この金髪ブタヤロウ!!しね!しね!しね!と誰かにメールしたいが、やめておこう。
修正:いい加減&が変換されるのを何とかしてほしい
解説:Hatena::Bookmark::24H(http://hatebu24h.ashitano.in/)に、トップエントリの獲得したブックマーク数の推移のチャートを加えます。
// ==UserScript== // @name chart of Hatena::Bookmark::24H // @namespace http://anond.hatelabo.jp/ // @include http://hatebu24h.ashitano.in/* // ==/UserScript== var url = unescape("http://chart.apis.google.com/chart?chs=160x60%26cht=ls%26chd=t:"); url = url + $X("//div[@class='clocktxt']", Array).map(function(s){return s.firstChild.nodeValue}).join(","); //var id = $X("//h3/a/@href")[0].nodeValue; //url = url + $X("//div[@class='entrytitle' or @class='entrytitle2'][.//a[@href='"+id+"']]/../preceding-sibling::div[1]", Array).map(function(s){return s.textContent.match(/\d+/)}).join(","); var before = makeElements({ nodeName: "div", className: "sidebox", childNodes: [{ nodeName: "div", className: "sidetitle", innerHTML: "Recent top entry chart" },{ nodeName: "div", className: "sidetitle", childNodes: { nodeName: "img", src: url } }] }); var after = $X("//div[@class='sidebox']", Array)[0]; after.parentNode.insertBefore(before, after); // util // var 0.01 function makeElements(obj) { if (typeof obj != "object") return document.createTextNode(obj); if (obj instanceof Array) return obj.map(makeElements); var node = document.createElement(obj.nodeName); delete obj.nodeName; if (obj.childNodes) { [].concat(makeElements(obj.childNodes)).forEach(node.appendChild, node); delete obj.childNodes; } function extend(dst, src) { for (var i in src) { if (typeof src[i] == "object" && dst[i] && typeof dst[i] == "object") extend(dst[i], src[i]); else node[i]=obj[i]; } } extend(node, obj); return node; } // by http://lowreal.net/blog/2007/11/17/1 // $X(exp); // $X(exp, context); // $X(exp, type); // $X(exp, context, type); function $X (exp, context, type /* want type */) { if (typeof context == "function") { type = context; context = null; } if (!context) context = document; var exp = (context.ownerDocument || context).createExpression(exp, function (prefix) { var o = document.createNSResolver(context).lookupNamespaceURI(prefix); if (o) return o; return (document.contentType == "application/xhtml+xml") ? "http://www.w3.org/1999/xhtml" : ""; }); switch (type) { case String: return exp.evaluate( context, XPathResult.STRING_TYPE, null ).stringValue; case Number: return exp.evaluate( context, XPathResult.NUMBER_TYPE, null ).numberValue; case Boolean: return exp.evaluate( context, XPathResult.BOOLEAN_TYPE, null ).booleanValue; case Array: var result = exp.evaluate( context, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null ); var ret = []; for (var i = 0, len = result.snapshotLength; i < len; i++) { ret.push(result.snapshotItem(i)); } return ret; case undefined: var result = exp.evaluate(context, XPathResult.ANY_TYPE, null); switch (result.resultType) { case XPathResult.STRING_TYPE : return result.stringValue; case XPathResult.NUMBER_TYPE : return result.numberValue; case XPathResult.BOOLEAN_TYPE: return result.booleanValue; case XPathResult.UNORDERED_NODE_ITERATOR_TYPE: { // not ensure the order. var ret = []; var i = null; while (i = result.iterateNext()) { ret.push(i); } return ret; } } return null; default: throw(TypeError("$X: specified type is not valid type.")); } }
→処女の肉体を求める
→他の男を知ってる女だと、自分と比較されたら困る(ベンチマーク禁止厨)
→(浮気するのは男の甲斐性だが、)女は貞操を守るのが務めだ(悪しき伝統)
→男も女も等しく、結婚した相手とだけにしなさい(キリスト教原理主義的純潔主義)
→結婚前に数々の男と軽々しく寝るような女が、結婚したからといってすぐ性格が変わるわけないだろ(疑りと嫉妬)
→肉体の結びつきははかないが、魂と魂の結びつきは永遠だ(精神重視)
→処女だからって、否定すべき理由は特にないよ
→とりあえず、ふしだらな女よりいいんじゃない?(消去法)
→そもそも女に興味がない(女嫌い)
→むしろ、男の方がもっと興味がある(ホモ)
せっかくなので、ここ2年ほどのさくらインターネットiDC移転を中心に、わかる範囲ではてなサーバ変遷の歴史をまとめてみようと思う。
> 59.106.108.68: mobile.hatena.ne.jp.
> 59.106.108.69: f.hatena.ne.jp.
> 59.106.108.70: rimo.tv.
< 125.206.202.66: mgw.hatena.ne.jp. < 61.196.246.69: b.hatena.ne.jp. < 61.196.246.70: b.hatena.ne.jp.
> 59.106.108.71: mgw.hatena.ne.jp. > 59.106.108.72: b.hatena.ne.jp.
< 221.186.129.148: g.hatena.ne.jp.
> 59.106.108.73: g.hatena.ne.jp.
< 125.206.202.82: search.hatena.ne.jp. < 221.186.129.147: ring.hatena.ne.jp. < 221.186.146.28: a.hatena.ne.jp. < 61.196.246.68: r.hatena.ne.jp.
> 221.186.129.147: search.hatena.ne.jp. > 59.106.108.74: a.hatena.ne.jp. > 59.106.108.75: r.hatena.ne.jp. > 59.106.108.76: ring.hatena.ne.jp.
< 125.206.202.83: d.hatena.ne.jp. < 221.186.129.146: d.hatena.ne.jp. < 221.186.146.29: d.hatena.ne.jp. < 61.196.246.67: d.hatena.ne.jp.
> 59.106.108.77: d.hatena.ne.jp.
> 59.106.108.97: d.hatena.com. > 59.106.108.97: hatena.com. > 59.106.108.97: m.hatena.com. > 59.106.108.97: m.hatena.ne.jp. > 59.106.108.97: s.hatena.com. > 59.106.108.97: s.hatena.ne.jp.
> 59.106.108.80: d2.hatena.ne.jp.
d2.hatena.ne.jpで新しいコメント構造の実験を開始しました - はてなダイアリー日記
< 221.186.129.147: counter.hatena.ne.jp. < 221.186.129.147: search.hatena.ne.jp.
> 59.106.108.81: counter.hatena.ne.jp. > 59.106.108.82: search.hatena.ne.jp.
> 59.106.108.78: w.hatena.ne.jp. > 59.106.108.84: h.hatena.ne.jp. > 59.106.108.84: h.hatena.com. > 59.106.108.98: w.hatena.com.
< 221.186.146.27: www.hatena.ne.jp. < 61.196.246.68: screenshot.hatena.ne.jp. < 125.206.202.66: map.hatena.ne.jp. < 125.206.202.66: i.hatena.ne.jp. < 125.206.202.66: graph.hatena.ne.jp. < 125.206.202.66: q.hatena.ne.jp.
> 59.106.108.86: www.hatena.ne.jp. > 59.106.108.87: screenshot.hatena.ne.jp. > 59.106.108.88: map.hatena.ne.jp. > 59.106.108.89: i.hatena.ne.jp. > 59.106.108.92: graph.hatena.ne.jp. > 59.106.108.99: q.hatena.ne.jp.
< ???.???.???.???: auth.hatena.ne.jp.
> 59.106.108.90: auth.hatena.ne.jp.
長いので省略
> 59.106.108.93: rokuro.hatelabo.jp.
> 59.106.108.102: k.hatena.ne.jp.
> 59.106.108.103: favicon.hatena.ne.jp. > 59.106.108.105: img.b.hatena.ne.jp. > 59.106.108.106: bbeta.hatena.ne.jp.
> 59.106.108.93: bottle.hatelabo.jp. > 59.106.108.93: counting.hatelabo.jp. > 59.106.108.93: news.hatelabo.jp.
これでおしまいだよ
(require 'cl) ; for cl-seq (defvar sangels-movies-dir nil) (defvar sangels-player "c:/Program Files/GRETECH/GomPlayer/GOM.exe") (defvar sangels-sort-by 'sangels-sort-by-rate) (defvar sangels-rate-file "~/.emacs.d/.sangels/rate") (defvar sangels-buffer "*sangels*") (defvar sangels-thumbnail "00_thumbnail.jpg") (defvar sangels-m3u "00_movies.m3u") (defface sangels-name '((t (:family "fixed" :weight bold :height 3.0))) "") (defface sangels-rate '((t (:family "fixed" :weight bold :height 1.5))) "") (defvar sangels-mode-map (let ((map (make-sparse-keymap))) (define-key map "n" 'next-line) (define-key map "p" 'previous-line) (define-key map (kbd "RET") 'sangels-select) (define-key map (kbd "SPC") 'sangels-select) (define-key map "q" 'sangels-quit) (define-key map "+" 'sangels-rate-plus) (define-key map "-" 'sangels-rate-minus) map)) (defvar sangels-mode-hook nil) (defvar sangels-highlight-overlay nil) (defvar sangels-rate-alist nil) (defconst sangels-rate-max 6) (defun sangels-insert-movies () (save-excursion (let* ((inhibit-read-only t) (files (remove-if-not (lambda (x) (and (not (member (file-name-nondirectory x) '("." ".."))) (file-directory-p x) (member sangels-thumbnail (directory-files x)))) (directory-files sangels-movies-dir t))) (ids (mapcar 'file-name-nondirectory files))) (erase-buffer) (setq ids (sangels-sort-ids ids)) (dolist (id ids) (let ((file (expand-file-name id sangels-movies-dir)) (pos (point))) (insert-image-file (expand-file-name sangels-thumbnail file)) (end-of-line) (insert (propertize (format "%-15s " id) 'face 'sangels-name)) (sangels-insert-rate id) (insert "\n") (put-text-property pos (point) 'sangels-id id)))))) (defun sangels-sort-by-name (a b) (string< a b)) (defun sangels-sort-by-rate (a b) (or (> (sangels-rate a) (sangels-rate b)) (sangels-sort-by-name a b))) (defun sangels-sort-ids (ids) (sort ids (or sangels-sort-by 'sangels-sort-by-name))) (defun sangels-insert-rate (id) (let ((rate (sangels-rate id))) (insert (propertize (concat (make-string rate ?★) (make-string (- sangels-rate-max rate) ?☆)) 'sangels-rate t 'face 'sangels-rate)))) (defun sangels-current-id () (get-text-property (point) 'sangels-id)) (defun sangels-play-movie (movie) (let ((explicit-shell-file-name "cmdproxy") (shell-file-name "cmdproxy")) (apply 'call-process-shell-command "start" nil "*tmp*" nil (mapcar (lambda (x) (concat "\"" x "\"")) (list sangels-player (unix-to-dos-filename movie)))))) (defun sangels-select () (interactive) (let ((id (sangels-current-id))) (when id (sangels-play-movie (expand-file-name sangels-m3u (expand-file-name id sangels-movies-dir)))))) (defun sangels-quit () (interactive) (kill-buffer sangels-buffer)) (defun sangels-rate (id) (or (cdr (assoc id sangels-rate-alist)) (/ sangels-rate-max 2))) (defun sangels-rate-save () (interactive) (let ((dir (file-name-directory sangels-rate-file))) (unless (file-exists-p dir) (make-directory dir t))) (with-temp-file sangels-rate-file (insert (pp-to-string sangels-rate-alist)))) (defun sangels-rate-load () (interactive) (when (file-exists-p sangels-rate-file) (with-temp-buffer (insert-file-contents sangels-rate-file) (goto-char (point-min)) (setq sangels-rate-alist (read (current-buffer)))))) (defun sangels-rate-plus (&optional n) (interactive "p") (setq n (or n 1)) (let* ((id (sangels-current-id)) (cell (assoc id sangels-rate-alist))) (unless cell (setq cell (cons id (sangels-rate id))) (setq sangels-rate-alist (cons cell sangels-rate-alist))) (setcdr cell (+ (cdr cell) n)) (save-excursion (let ((inhibit-read-only t)) (beginning-of-line) (goto-char (next-single-property-change (point) 'sangels-rate)) (delete-region (point) (next-single-property-change (point) 'sangels-rate)) (sangels-insert-rate id))) (sangels-rate-save))) (defun sangels-rate-minus (&optional n) (interactive "p") (setq n (or n -1)) (sangels-rate-plus (- n))) (defun sangels-post-command-hook () (save-excursion (move-overlay sangels-highlight-overlay (progn (move-beginning-of-line 1) (point)) (progn (move-end-of-line 1) (forward-line) (point)) (current-buffer)))) (defun sangels-mode () (interactive) (kill-all-local-variables) (use-local-map sangels-mode-map) (setq sangels-highlight-overlay (make-overlay 0 0)) (overlay-put sangels-highlight-overlay 'face 'highlight) (overlay-put sangels-highlight-overlay 'evaporate t) (make-local-variable 'post-command-hook) (add-hook 'post-command-hook 'sangels-post-command-hook nil t) (setq major-mode 'sangels-mode) (setq mode-name "Sangels") (run-mode-hooks 'sangels-mode-hook) (set-buffer-modified-p nil) (setq buffer-read-only t)) (defun sangels (&optional arg) (interactive "P") (when (or arg (not sangels-movies-dir)) (setq sangels-movies-dir (read-directory-name "movies dir: "))) (sangels-rate-load) (switch-to-buffer (get-buffer-create sangels-buffer)) (sangels-insert-movies) (sangels-mode)) (provide 'sangels)
せっかく書いたから匿名でのせてみるよ
使い方は
必要なものを gem で取ってくるにはこうすればいいよ
長すぎてelispが消えたから続きがあるよ
@echo off setlocal set WD=%~dp0 cd /d %WD% ruby get_movies.rb ruby get_images.rb ruby create_m3u.rb
user: ユーザID password: パスワード ids_file: ids.txt done_file: ids_done.txt movies_dir: movies log4r_config: pre_config: global: INFO loggers: - name: app type: Log4r::Logger level: INFO outputters: - STDOUT - FILE outputters: - name: STDOUT type: Log4r::StdoutOutputter formatter: type: Log4r::PatternFormatter pattern: "%d [%l] %C - %M" date_pattern: "%H:%M:%S" - name: FILE type: Log4r::FileOutputter filename: "#{LOGDIR}/sangels.log" formatter: type: Log4r::PatternFormatter pattern: "%d [%l] %C - %M" date_pattern: "%Y-%m-%d %H:%M:%S"
require 'fileutils' require 'logger' require 'mechanize' BASEDIR = File.dirname($0) require "#{BASEDIR}/util" require "#{BASEDIR}/sangels" $config = load_config(BASEDIR) prepare_logger(BASEDIR) $log = new_logger("get_movies") WWW::Mechanize.log = new_logger("mechanize") WGet.log = $log class IDFile def initialize(file) @file = file unless File.exist?(@file) Fileutils.touch(@file) end end def ids(contains_comment = nil) File.open(@file) {|io| io.to_a.map {|x| x.chomp }.select {|x| if x.empty? nil elsif contains_comment true else not /^\s*\#/ =~ x end } } end def add(id) ids = ids(true) unless ids.any? {|x| x == id} write(ids + [id]) end end def delete(id) ids = ids(true) if ids.any? {|x| x == id} write(ids - [id]) end end def write(ids) File.open(@file, "w") {|io| ids.each {|x| io.puts x} } end end $log.info("BEGIN #{$0} ================") exit_code = 0 begin ids_file = IDFile.new($config.ids_file) done_file = IDFile.new($config.done_file) movies_dir = $config.movies_dir wget = WGet.new sangels = SAngels.new sangels.login($config.user, $config.password) ids_file.ids.each {|id| begin movies = sangels.movies(id) rescue SAngels::Movies::InvalidMoviesError $log.warn("invalid movie id: #{id}") next end dir = File.expand_path(id, movies_dir) movies.each {|link| wget.retrieve(link.href, dir) } expected = movies.movie_links.map{|x| File.basename(x.href)} actual = Dir.glob("#{dir}/*").map {|x| File.basename(x)} if (expected - actual).empty? done_file.add(id) ids_file.delete(id) end } rescue => e $log.error(e) exit_code = 1 end $log.info("END #{$0} (#{exit_code}) ================") exit exit_code
require 'fileutils' require 'logger' require 'mechanize' require 'ostruct' BASEDIR = File.dirname($0) require "#{BASEDIR}/util" require "#{BASEDIR}/sangels" $config = load_config(BASEDIR) prepare_logger(BASEDIR) $log = new_logger("get_images") WWW::Mechanize.log = new_logger("mechanize") WGet.log = $log $log.info("BEGIN #{$0} ================") exit_code = 0 begin movies_dir = $config.movies_dir sangels = SAngels.new sangels.login($config.user, $config.password) thumbnails = sangels.thumbnails Dir.glob("#{movies_dir}/*").each {|dir| next unless File.directory? dir id = File.basename(dir) url = thumbnails.url(id) unless url $log.warn("#{id} is not found") next end path = File.expand_path("00_thumbnail#{File.extname(url)}", dir) next if File.exist? path $log.info("retrieving #{url}") thumbnail = thumbnails.get_file(id) File.open(path, "wb") {|io| io.write(thumbnail)} } rescue => e $log.error(e) exit_code = 1 end $log.info("END #{$0} (#{exit_code}) ================") exit exit_code
BASEDIR = File.dirname($0) require "#{BASEDIR}/util" $config = load_config(BASEDIR) movies_dir = $config.movies_dir Dir.glob("#{movies_dir}/*") {|dir| next unless File.directory? dir name = File.basename(dir) files = Dir.glob("#{dir}/*.wmv").sort File.open("#{movies_dir}/#{name}.m3u", "w") {|io| files.each {|file| io.puts "#{name}/#{File.basename(file)}" } } File.open("#{dir}/00_movies.m3u", "w") {|io| files.each {|file| io.puts "#{File.basename(file)}" } } }
require 'mechanize' require 'hpricot' BASEDIR = File.dirname($0) require "#{BASEDIR}/util" class SAngels HOST = "real2.s-angels.com" LOGIN_URL = "http://#{HOST}/member/" INFO_URL = "http://#{HOST}/teigaku/item.php" THUMBNAILS_URL = "http://#{HOST}/teigaku/" THUMBNAIL_URL = "http://#{HOST}/images/default/thumb/" def initialize() @agent = WWW::Mechanize.new end def login(user, password) login_form = @agent.get(LOGIN_URL).forms.find {|form| form.fields.any? {|field| field.name == "frmLoginid"} } login_form.frmLoginid = user login_form.frmPw = password @agent.submit(login_form) end def movies(id, no_validate = nil) Movies.new(@agent, id, !no_validate) end def thumbnails Thumbnails.new(@agent) end class Thumbnails def initialize(agent) @agent = agent doc = Hpricot(@agent.get_file(THUMBNAILS_URL)) elems = doc.search("div[@class=realthum]/a") @links = Hash( elems.map {|elem| href = elem["href"] id = $1 if /ID=(.+)/ =~ href url = elem.search("img")[0]["src"] [id, url] }) end def get_file(id) @agent.get_file(url(id)) end def url(id) @links[id] end def exist?(id) url(id) end end class Movies class InvalidMoviesError < StandardError end def initialize(agent, id, no_validate) @agent = agent @id = id if !no_validate && !valid? raise InvalidMoviesError end end def info_page_url "#{INFO_URL}?ID=#{@id}" end def info_page @agent.get(info_page_url) end def movies_page @agent.click(info_page.links.find {|link| /P=10/ =~ link.href}) end def movie_links movies_page.links.select {|link| /wmv$/ =~ link.href }.sort {|a, b| File.basename(a.href) <=> File.basename(b.href) } end def valid? info_page.uri.to_s == info_page_url end def each(&block) orig_links = movie_links orig_links.each {|orig_link| link = movie_links.find {|l| File.basename(l.href) == File.basename(orig_link.href)} block.call(link) } end end end
require 'log4r' require 'log4r/yamlconfigurator' require 'singleton' require 'fileutils' require 'ostruct' def Hash(a) Hash[*a.flatten] end def load_config(basedir) OpenStruct.new(File.open("#{basedir}/config.yaml") {|io| YAML.load(io)}) end def new_logger(name) Log4r::Logger.new("app::#{name}") end def prepare_logger(basedir, logdir = nil) logdir ||= basedir Log4r::YamlConfigurator["LOGDIR"] = logdir Log4r::YamlConfigurator.load_yaml_file("#{basedir}/config.yaml") end class NullObject include Singleton def method_missing(message, *arg) NullObject.singleton end end class WGet class << self attr_accessor :log def initialize super @log = NullObject.singleton end end def log self.class.log end def retrieve(url, dir) FileUtils.mkdir_p(dir) file = File.expand_path(File.basename(url), dir) if File.exist?(file) log.info("already retrieved #{url}") return true end tmp = "#{file}.part" log.info("retrieving #{url}") ret = system("wget", "-c", "-O", tmp, url) if ret log.info("retrieving succeeded #{url}") File.rename(tmp, file) else if $? == 0x020000 # Ctrl-C exit($?) else log.error("retrieving failure #{url} (#{$?})") end end return ret end end
Table of Contents: ||||||
オープンソースソフトウェアとGIS | Open Source software and GIS | Open Source software and GIS | 1 (6) |
オープンソース概念 | Open Source concept | 1 (2) | |
オープンソースGISとしてのGRASS | GRASS as an Open Source GIS | 3 (2) | |
ノースカロライナサンプルデータセット | The North Carolina sample data set | 5 (1) | |
この本の読み方 | How to read this book | 5 (2) | |
GISの概念 | GIS concepts | GIS concepts | 7 (14) |
一般的なGISの原理 | General GIS principles | 7 (6) | |
地理空間データモデル | Geospatial data models | 7 (4) | |
GISデータとシステムの構成 | Organization of GIS data and system | 11 (2) | |
機能 | functionality | ||
地図投影法と座標系 | Map projections and coordinate systems | 13 (8) | |
地図投影原理 | Map projection principles | 13 (3) | |
一般的な座標系とdatums | Common coordinate systems and datums | 16 (5) | |
GRASSをはじめよう | Getting started with GRASS | Getting started with GRASS | 21 (32) |
第一歩 | First steps | 21 (16) | |
GRASSのダウンロードとインストール | Download and install GRASS | 21 (2) | |
データベースとコマンドの構造 | Database and command structure | 23 (3) | |
GRASS6のためのグラフィカルユーザインタフェイス: | Graphical User Interfaces for GRASS 6: | 26 (1) | |
QGISとgis.m | QGIS and gis.m | ||
ノースカロライナを用いてGRASSを開始 | Starting GRASS with the North Carolina | 27 (3) | |
データセット | data set | ||
GRASSデータ・ディスプレイと3D可視化 | GRASS data display and 3D visualization | 30 (4) | |
プロジェクトデータ管理 | Project data management | 34 (3) | |
新しいプロジェクトでGRASSを開始 | Starting GRASS with a new project | 37 (7) | |
aのための座標系の定義 | Defining the coordinate system for a | 40 (4) | |
新しいプロジェクト | new project | ||
空間投影されていないxy座標系 | Non-georeferenced xy coordinate system | 44 (1) | |
座標系の変換 | Coordinate system transformations | 44 (9) | |
座標系のリスト | Coordinate lists | 45 (2) | |
ラスタとベクトル地図の投影 | Projection of raster and vector maps | 47 (1) | |
GDAL/OGRツールで、再投影 | Reprojecting with GDAL/OGR tools | 48 (5) | |
GRASSデータモデルとデータの交換 | GRASS data models and data exchange | 53 (30) | |
ラスターデータ | Raster data | 54 (16) | |
GRASSの2Dの、3Dのラスターデータモデル | GRASS 2D and 3D raster data models | 54 (2) | |
領域の統合と境界 | Managing regions and boundaries | raster map resolution | |
ジオコードされたラスターデータのインポート | Import of georeferenced raster data | 58 (8) | |
スキャンされた歴史的地図のインポートとジオコーディング | Import and geocoding of a scanned | 66 (3) | |
ラスターデータエクスポート | Raster data export | 69 (1) | |
ベクトルデータ | Vector data | 70 (13) | |
GRASSベクトルデータモデル | GRASS vector data model | 70 (3) | |
ベクトルデータのインポート | Import of vector data | 73 (5) | |
xy CAD描画のための座標変換 | Coordinate transformation for xy CAD drawings | 78 (2) | |
ベクトルデータのエクスポート | Export of vector data | 80 (3) | |
ラスターデータを使う | Working with raster data | 83 (86) | |
ラスター地図を表示、管理 | Viewing and managing raster maps | 83 (22) | |
ラスターデータの表示と、カラーテーブルの割り当て | Displaying raster data and assigning a color table | 83 (3) | |
ラスター地図に関するメタデータを管理 | Managing metadata of raster maps | 86 (2) | |
ラスター地図のクエリとプロファイル | Raster map queries and profiles | 88 (2) | |
ラスター地図の統計 | Raster map statistics | 90 (1) | |
ラスター地図のズームと、部分集合の生成 | Zooming and generating subsets from | 91 (1) | |
簡単なラスター地図の生成 | Generating simple raster maps | 92 (2) | |
再分類と再スケーリング | Reclassification and rescaling of | 94 (3) | |
ラスター地図 | raster maps | ||
ラスター地図タイプの記録と値の置換 | Recoding of raster map types and value replacements | 97 (2) | |
カテゴリラベルの割り当て | Assigning category labels | 99 (4) | |
マスキングとノーデータ値の取り扱い | Masking and handling of no-data values | 103(2) | |
ラスター地図の計算 | Raster map algebra | 105(10) | |
整数と浮動小数点データ | Integer and floating point data | 107(1) | |
基本的な計算 | Basic calculations | 108(1) | |
“if"状態を使う | Working with ``if'' conditions | 109(1) | |
r.mapcalcのNULL値の取り扱い | Handling of NULL values in r.mapcalc | 110(1) | |
r.mapcalcでMASKを作成 | Creating a MASK with r.mapcalc | 111(1) | |
特別なグラフ演算子 | Special graph operators | 112(1) | |
相対的座標での近傍演算 | Neighborhood operations with relative coordinates | 113(2) | |
ラスタデータの変換と内挿 | Raster data transformation and interpolation | 115(11) | |
離散的ラスターデータの自動的ベクトル化 | Automated vectorization of discrete raster data | 115(3) | |
連続フィールドの等値線の描画を生成 | Generating isolines representing continuous fields | 118(1) | |
ラスタデータのリサンプリングと内挿 | Resampling and interpolation of raster data | 119(5) | |
ラスター地図のオーバーレイとマージ | Overlaying and merging raster maps | 124(2) | |
ラスターデータの空間分析 | Spatial analysis with raster data | 126(29) | |
近傍分析とクロスカテゴリー統計 | Neighborhood analysis and cross-category statistics | 126(7) | |
ラスタフィーチャのバッファリング | Buffering of raster features | 133(2) | |
コストサーフェイス | Cost surfaces | 135(5) | |
地勢と分水界分析 | Terrain and watershed analysis | 140(13) | |
ランドスケープ構造解析 | Landscape structure analysis | 153(2) | |
ランドスケーププロセスモデリング | Landscape process modeling | 155(11) | |
水文学的、地下水のモデル | Hydrologic and groundwater modeling | 155(3) | |
浸食と宣誓証言モデル | Erosion and deposition modeling | 158(8) | |
ラスタベースのモデルと解析に関するまとめ | Final note on raster-based modeling and analysis | 166(1) | |
ボクセルデータを使う | Working with voxel data | 166(3) | |
ベクトルデータを使う | Working with vector data | 169(94) | |
地図の表示とメタデータ管理 | Map viewing and metadata management | 169(4) | |
ベクトル地図を表示 | Displaying vector maps | 169(3) | |
ベクトル地図メタデータ維持 | Vector map metadata maintenance | 172(1) | |
ベクトル地図属性管理とSQLのサポート | Vector map attribute management and SQL support | 173(14) | |
GRASS6でのSQLサポート | SQL support in GRASS 6 | 174(7) | |
サンプルSQLクエリと属性変更 | Sample SQL queries and attribute modifications | 181(4) | |
地図再分類 | Map reclassification | 185(1) | |
複数の属性があるベクトル地図 | Vector map with multiple attribute tables: layers | 186(1) | |
ベクトルデータをデジタル化 | Digitizing vector data | 187(5) | |
位相的データのデジタル化の一般原理 | General principles for digitizing topological data | 187(2) | |
GRASSでの対話的なデジタイジング | Interactive digitizing in GRASS | 189(3) | |
ベクトル地図クエリと統計 | Vector map queries and statistics | 192(4) | |
地図のクエリ | Map queries | 192(2) | |
ベクトルオブジェクトに基づくラスター地図統計 | Raster map statistics based on vector objects | 194(2) | |
ポイントベクトル地図統計 | Point vector map statistics | 196(1) | |
幾何学操作 | Geometry operations | 196(20) | |
位相的な操作 | Topological operations | 197(6) | |
バッファリング | Buffering | 203(1) | |
フィーチャの抽出と境界のディゾルブ | Feature extraction and boundary dissolving | 204(1) | |
ベクトル地図を修理 | Patching vector maps | 205(1) | |
ベクトル地図のインターセクディングとクリッピング | Intersecting and clipping vector maps | 206(3) | |
ベクトルの幾何の変換と3Dベクトルの作成 | Transforming vector geometry and creating 3D vectors | 209(2) | |
点からのコンベックスハルとトライアンギュレーション | Convex hull and triangulation from points | 211(1) | |
同じ位置の掘り出し物の複数のポイント | Find multiple points in same location | 212(2) | |
一般的な多角形境界の長さ | Length of common polygon boundaries | 214(2) | |
ベクトルネットワーク分析 | Vector network analysis | 216(11) | |
ネットワーク分析 | Network analysis | 216(5) | |
直線的な参照システム(LRS) | Linear reference system (LRS) | 221(6) | |
ラスタへのベクトルデータ変化 | Vector data transformations to raster | 227(3) | |
空間的な内挿と近似 | Spatial interpolation and approximation | 230(19) | |
内挿方法を選択 | Selecting an interpolation method | 230(5) | |
RSTによる内挿と近似 | Interpolation and approximation with RST | 235(2) | |
RSTパラメタの調整: テンションとスムージング | Tuning the RST parameters: tension and smoothing | 237(4) | |
RSTの精度を評価 | Estimating RST accuracy | 241(3) | |
セグメント化処理 | Segmented processing | 244(3) | |
RSTとのトポグラフィー分析 | Topographic analysis with RST | 247(2) | |
ライダーポイントのクラウドデータを使う | Working with lidar point cloud data | 249(8) | |
ボリュームに基づくは内挿 | Volume based interpolation | 257(6) | |
3番目の変数の追加: 高度のある降水量 | Adding third variable: precipitation with elevation | 258(3) | |
ボリュームとボリューム-時間内挿 | Volume and volume-temporal interpolation | 261(1) | |
地球統計学とスプライン | Geostatistics and splines | 262(1) |
「これまで人間関係でいい思いをしてこなかったので、恋愛で一発逆転を狙いたいよ派」「白馬の王子(王女)を待つよ、特に努力とかはしないけど派」「恋に恋する未経験者」って印象。
MAPの中では、
が比較的近いけど、モテ文化に対する対抗意識が薄いから違うしなあ。
長々と書いているわりには、そんなにこじれてなくて普通の人(ちょっと理屈ぽいとか、過去の経験に囚われてるとかあるけど、そういうの誰にでもあるもんだし)なので、非モテMAPの対象外なのかもと思った。あれはもっとこじれた人用で、恋愛至上主義とかモテ文化とか対象となる異性や世間への偏見とか憎悪とか、とにかくなんかもっと極端なところがないと入らないんじゃない?ネタっぽさが足りないというか。
しかし、
この辺りって、ネタとして目を引かないだけで一番多数派のような気もする。つまり、君は1人じゃない。
http://scarecrowbone.crz.jp/etc/himotemap/himoteMap.html
おれはどこにいるんだろう。
まず非モテであることは間違いない。なにせ年齢=彼女いない歴であり甘酸っぱい経験など皆無なのである。そのくせ嫌経験値だけ異様に高く対人関係に適度な距離を求めてしまうのが積極的行動を取れない原因かと思われるわけだが。ぶっちゃけ人間不信寸前。他人を信じる自分を信じろ的屁理屈によってギリギリのところで踏み止まっているが、これって生命力だけで踏み止まっているようなもんだから非常に危うい状態。実際折れることもあるしな。けっこう折れやすいのかもしれない、と最近思っている。
うっわ、こりゃあ非モテなワケだ。なにこの中二病。自意識過剰も大概にしろと。
話を続けよう。ここで落ち込んでいたらしょうがない。でもおれは彼女が欲しいわけだ。おれが「彼女が欲しい」と思っているのは前述の嫌経験値を相殺できる経験を求めているからだと思う。このままだと過去に囚われてろくな未来へ進めないことは明白。具体的には孤独死が待ち受けている。おれに他人を信じさせてくれ。だから「彼女」というのは概念に過ぎず「友達」でも良いはずだが、そこはそれ、やはり男の子、彼女が欲しい。おれは女の子が好きなんだ! と、ここで性欲肯定思考停止はたやすいが、もうちょっと踏み込んでみよう。だいたいそれほど切羽詰まった性的欲望は持ち合わせていない。だったら「友達」で満たされるはずだ。どうして「彼女」なのか。
「友達」と「彼女」はどのように違うのかといえば、なにより「関係性」が違うだろう。
「友達」は趣味嗜好など自分自身以外の要素で結びつくことが可能である。それに対し「彼女」は自分自身に魅力なくして結ばれることは不可能な関係性である。つまり自分自身を受け入れて欲しいという願望が「彼女が欲しい」には現れているのではかろうか。あるいは「相手(彼女)の自分自身」を自分に預けて欲しいという「信頼」を求めているという可能性も考えられる。いずれにせよキーワードは「自分自身」だ。この推論に自分の状況を照らし合わせてみると、どっちにも当てはまる気がする。そりゃあ当然「自分自身」を受け入れて欲しいし他人に頼られるのも、めんどくさいけど、なんだかんだで引き受けてしまう性格だ。
となると嫌経験値の相殺とは「自分自身」と「相手(彼女)の自分自身」に対する信用回復を求めていると解釈できる。だから趣味嗜好で結ばれることのできる「友達」では足りなくて自分自身で結ばれる「彼女」が欲しい。ままならない状況でうまく立ち回ることのできない「自分」や自分を苦しめるような「相手(彼女)」ばかりとは限らず、「自分」も「他人(彼女)」も、もっと信じるに足るものだという確証を求めているということではなかろうか。って、おれって結局人間不信なんじゃねえか、どこが人間不信寸前だ。とっくのとうに立派な人間不信患者じゃねーか。踏み止まることができていない。折れてる。ちょっとヘコんだ。
自分が「他人を信じたい」のはわかっていたけど、まさかここまでとは。「友達」じゃなくて「彼女」が欲しいのは相当重症のようだ。せめて「親友」がいれば違ったのかもしれない。けれどもそこまで親しい友達はいない。おれが距離を作っているせいもあるけど。たとえ同性相手だろうとも、おれは滅多に心を許さない。どこかしら予防線を張ってしまっている。もしも「自分自身」が受け入れられなかったり「相手の自分自身」を預けてくれるような信頼を得られなくても傷付かないように「他人を信じる自分を信じろ」なんて言って本当は信じていなかったんだ。
だけど、まだ人間を信じたい。
だから「彼女が欲しい」と思っている。
おっかなびっくり人間を信じたいと思っている日陰者。
いまはまだだれそれが好きというわけじゃなくて漠然と「彼女が欲しい」と思っているけど、いつかだれかを心の底から信じたいと思ったとき、そのときおれは相手(彼女)に惚れるのだろうか。そのときおれは積極的な行動に出ることができるのだろうか。というか、そもそもこんなテキストを書いたのは「非モテMAP」のどこに自分が当てはまるか考えてみようというのがことのきっかけだったのだが、なんだかどこにも当てはまらないようで、ちょっとだけ寂しいです。こんなところでもひとりぼっちなんて! だれかー!
--------------------------------------------------------------------------------
うわー。
なんか勢いに任せて書いたので書き足りないと思って修正していたらいつのまにかトラックバックが沢山付いている! どうやって返せばいいのかわからないので、とりあえず追記で。すみません。
・追い詰められているのかな。ぶっちゃけ薬服用してますが。
・承認欲求をすべて「彼女」に求める気はないです。嫌経験を払拭できる「きっかけ」が欲しいだけなのです。たぶん。
・女友達はいるけどそういう雰囲気になることがないんです……
・「彼女」は「友達」の延長線上にあるという考え方はアリだと思います。だけどその延長線上にどうやってステップアップするのでしょうか。
・ハムスターを飼っていたのですが死んでしまいました。超泣きました。
当て逃げされた。
http://anond.hatelabo.jp/20080930094309
続き。
ネット上でこういうコトを書くのは少しためらいがあったが、
方々から背中を押されるカタチで、私の知っている加害者情報を書き込もうかと思う。
【事故の起こった場所】
http://map.yahoo.co.jp/pl?type=scroll&lat=35.39275299&lon=139.44639152&sc=2&mode=map&pointer=on
【事故の起こった日時】
9月28日 日曜日
【事故の状況】
一旦車両を降りて話し合いを始めるが、名前を聞こうとしたら逃走。
六地蔵方面に逃げる。
【加害者の概要】
50代後半??60代前半の痩せ型の男性。
165cmくらい。
【加害者の車種】
http://images.google.co.jp/images?q=Vitz+1F8
・931
(登録陸運局、分類番号、平仮名は不明)
で、このナンバーなんですが、事故発生から時間が経っており目で見て記憶しただけなので100%確実とは言い切れないですが、
この番号に近い感じのヴィッツを見かけたら、目撃場所をお教えください。
容疑車両を見つけたからといって、決して無理なさらずに・・・
なんてったって“逃げる”ような人ですから、アウトローなのは間違いないです。
情報提供よろです。
http://d.hatena.ne.jp/kumakuma1967/20080913/p1
> ほとんどの地域では私道や私有地からの撮影が目立ちますが、札幌市では5km×5km程度の範囲で
> Google mapのストリートビューを見たとき、簡単に私道や私有地であるとわかる画像がみつかりませんでした。
http://b.hatena.ne.jp/HiromitsuTakagi/20080913#bookmark-10004311
> 5km四方内で私道・私有地で撮影していないケースを探すことの方が難しいらしい。
教科書的には、その回答で合ってると思う。Java屋じゃないんで詳しいことはしらないが。
教科書レベルではなく、現場レベルでは、違うと思うので、ようはポインタとしかとらえていない。
そもそもなぜVector,List,Map などの複数のデータ保存形式があるか?
といえば、データの種別や、それの検索方法、取り扱い方法により、保存方法を変えた方が効率的だ。
という側面から来ている。
そういった、異なるデータには、異なる方式のデータ構造という構造を取っておきながら、
アルゴリズムは共通です。というのにどれだけ意義があろうか?という事。
たとえば、Vectorであれば、コピーならばmemcpyなどの専用命令でDMA転送を期待するが
Listやmapであれば、一つ一つforを回してコピーする必要性がある。
たとえば、1KB単位のブロックのVectorをソートする場合、スワップの手間がバカにならないので、スワップをなるべくさせないアルゴリズムでソートする。
逆にListであれば、個別の要素が、以下に大きくても、スワップの手間は高々ポインタ1つ分なので、スワップを気にせず最適なアルゴリズムでソートする。
データ構造が違うと言う段階で、同じアルゴリズムを使うことは少ない。だから、そもそもイテレータにアルゴリズムの吸収を期待しない。
つーこと。
もっとも、一般的には、簡単なプログラムであればアルゴリズムを使った方が簡単にできるので、使った方がよいが・・・。
それこそ、DB使った方が早くない?とか、Perlでよくね?とかいろいろな議論が出てくるのだが
俺javaとかさっぱわかんないペーペーですけど
ポインタのあるC++でもSTLではIteratorを使うわけで、
とりあえず、ベテランよりも俺の方が優秀という事が言いたいのだろうが・・・。
いや。うん、2年目って感じで初々しいね。
>Interfaceって何のためにあるんですか?
それはね、Javaには関数ポインタがないからなんだよ。実装としてはvtableだから、関数ポインタなんだよ。知ってる? まぁ、一部言語ではhashTableだが。
>ListやMapをループで回して値を取る時Iterator使うのは何故?
>staticなメソッドを作るときはどんな時?
いや、そもそもnon staticだって、データへのポインタがある、関数コールという意味ではstaticと大差ないジャン
# Interfaceって何のためにあるんですか?
# ListやMapをループで回して値を取る時Iterator使うのは何故?
# staticなメソッドを作るときはどんな時?
はてな界隈では、Javaって、あんま人気無いみたいだけど、ちょっと書かせてよ。
SIerでお仕事してると、派遣とか常駐とか言う形で、色んな会社に行って、違う会社の人とお仕事するんだけど、「経験年数n年(n>3)です」っていう人達が、恐ろしく使えなくてびっくりすることがしばしば。
特に、Java 5以降の機能
辺りを全く知らなかったり。 って言うか、Javaの極々基本的な知識である
が全く出来ないんだよね…。
そういうのを知らなくても(出来なくても)業務をこなせちゃう(?)のが、Javaの言語特性だとは思わないけど、こういう人達だらけなんだよね…。 PMが新しい人を採用しようとして、ここら辺の知識を割りと厳し目にテストしたら、候補が10人居たのに全滅で、プロジェクトのスタートが遅れてしまったりして、もう大変。
かな。
ほんとにもう最高。
楽したい人間+ハマり性な人間には、こーゆーカスタマイズがしがし出来るツールが最高なのよ。
エディタならvim。emacsでもいいけど、あんまり詳しくない。
他のツールはカスタマイズ性で見劣りする。
こだわりのない人間にはどんなツールでもオッケーなんだろうね。
オレはこだわるところはこだわる。
ちょっとした不便に気づかないか気づいても甘受してしまうような人間と、今はクリアできなくともなんとか今後の課題にしたいと考える人間。
そこの違いだね。
どっちが得かというのはわからんけどね。
優劣とか損得の問題じゃなく、ただオレはそういう人種だってこと。
追記
vimperatorrcねえ。特筆すべき点はないけど、あえて一部抜粋すれば、こんな感じ。
inoremap <C-1> <Esc>1gt inoremap <C-2> <Esc>2gt inoremap <C-3> <Esc>3gt inoremap <C-4> <Esc>4gt inoremap <C-5> <Esc>5gt inoremap <C-6> <Esc>6gt inoremap <C-7> <Esc>7gt inoremap <C-8> <Esc>8gt inoremap <C-9> <Esc>9gt noremap <BS> H noremap <S-BS> L noremap ,b <Esc>:bmarks -tags= noremap u :o<Space> " ldrc+ldrでoで:open出来ない問題を解決
" wildoptions=auto時に一瞬補完が表示されてウザいmapがある - Dis Communication - 符号無し " http://unsigned.g.hatena.ne.jp/Trapezoid/20080620/1213961754 javascript <<EOM [ [',a',':dialog addbookmark'], [',c',':viewSBMComments -t h'], [',C',':viewSBMComments -t hdl'], [',d',':pindownload'], [',ld',':set ldrc'], [',p',':mb clear-pin'], [',q',':toggleldrc'], [',R',':so ~/_vimperatorrc'], [',r',':res'], [',v',':!vim ~/_vimperatorrc'], ['\\s',':scrapbook'], ['\\S',':scrap'], ['\\f',':firebug'], ['\\d',':dialog downloads'], ['\\p',':tabopen chrome://browser/content/places/places.xul'], ['!',':set invum'], ['B',':ls!'], ['\\a',':addons'], ['\\e',':errorconsole'], ['\\F',':firebugwindow'], ['\\d',':dialog downloads'], ['\\g',':oepnGMpanel'], ['\\G',':toggleGM'], ['e',':note'], ['<F11>',':fullscreen'], ['\\P',':placesnewwin'], ['\\H',':historynewwin'], ['<C-j>',':togglebookmarksidebar'], ['<C-k>',':togglehistorysidebar'], ['<C-l>',':addtoldr'], ['<C-S-Right>',':removerighttabs'], ['<C-S-Tab>',':previousfirebugtab'], [',o',':openselectedlinks'], [',3',':copy titleAndURL'], [',ig',':imageGet'], [',io',':imageOpen'], ['w',':submit'], [',lo',':logout'], // nicontroller.js [',ni',':nicoinfo'], [',np',':nicopause'], [',nm',':nicomute'], [',nv',':nicommentvisible'], [',nz',':nicosize'], [',ns',':nicoseek'], ].forEach(function([key,command]){ liberator.mappings.addUserMap([liberator.modes.NORMAL], [key], "User defined mapping", function () { liberator.execute(command); }, {rhs: key, noremap: true}); }); EOM javascript <<EOM [ ['<C-j>',':togglebookmarksidebar'], ['<C-k>',':togglehistorysidebar'], ].forEach(function([key,command]){ liberator.mappings.addUserMap([liberator.modes.INSERT], [key], "User defined mapping", function () { liberator.execute(command); }, {rhs: key, noremap: true}); }); EOM
javascript <<EOM // nicontroller.js plugin // [N]- // N 秒前にシークする。 // 指定なしの場合 10 秒前。 liberator.mappings.addUserMap( [liberator.modes.NORMAL], ['-'], 'seek by count backward', function(count) { if(count === -1) count = 10; liberator.execute(':nicoseek! ' + '-' + count); }, { flags: liberator.Mappings.flags.COUNT } ); // [N]+ // N 秒後にシークする。 // 指定なしの場合 10 秒後。 liberator.mappings.addUserMap( [liberator.modes.NORMAL], ['+'], 'seek by count forward', function(count) { if(count === -1) count = 10; liberator.execute(':nicoseek! ' + count); }, { flags: liberator.Mappings.flags.COUNT } ); EOM
Vimperatorで;bでリンクを新しいバックグラウンドのタブに開くようにする。
http://anond.hatelabo.jp/20080709195527
も俺の仕業なんだけど、これvimperator本体に実装してくれないかな。
気になる点・これからの課題
窓の杜 - 【NEWS】Firefox 3のスマートロケーションバーに対応した「XUL/Migemo」
http://www.forest.impress.co.jp/article/2008/07/07/xulmigemo0105.html
余談
Index of /
http://vimperator.driftaway.org/
に上がるのはたいてい朝の07:30になっているので、いつからかチェックするのが朝の習慣になった。
これかい?
それそれ、ありがとう。
結構面白く読んでたんだけど、自分を当てはめてみると「左側のいろいろだね」みたいな感じでちっとも分類できなかったw