はてなキーワード: Openとは
うごメモはてな - ゆうたさんの作品のスター/コメントを集計してみた。スターの方は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']
SP用
javascript:(function(){var t={0:"No Play",1:"Failed",2:"Assist Clear",3:"Easy Clear",4:"Clear",5:"Hard Clear",6:"Full Combo"};var f={0:"f0",1:"f1",2:"f2",3:"f3",4:"f4",5:"f5",6:"f6"};var l={AAA:"aaa",AA:"aa",A:"a",B:"b",C:"c",D:"d",E:"e",F:"f"};new frames[0].Ajax.Request('../data/getMusicList.do?'+frames[0].Music.tags,{method:'get',onComplete:function(r){eval("var m="+r.responseText);new frames[0].Ajax.Request('../data/getMusicData.do?'+frames[0].MusicScore.tags,{method:'get',onComplete:function(r){eval("var s="+r.responseText);var h=window.open("about:blank");var d=h.document;d.open();d.write("<title>csv</title><pre>Ver,Title,Difficulty,NRank,NScore,NClear,HRank,HScore,HClear,ARank,AScore,AClear");var r=s.rivalsscore.score.sp;for(var i=0;i<r.length;i++){d.write(","+s.rivalsscore.name.sp[i]+",N/H/A,Score(Clear),,,");}d.write("\n");for(var i in m.music_list){var x=s.myscore[m.music_list[i].mid];d.write(m.version[m.music_list[i].version].name+",\""+m.music_list[i].name+"\",["+m.music_list[i].diff[0]+"|"+m.music_list[i].diff[1]+"|"+m.music_list[i].diff[2]+"],"+x.level[0]+","+x.score[0]+","+t[x.flag[0]]+","+x.level[1]+","+x.score[1]+","+t[x.flag[1]]+","+x.level[2]+","+x.score[2]+","+t[x.flag[2]]);for(var j=0;j<r.length;j++){var z=r[j][m.music_list[i].mid];if(!z){continue;}d.write(","+z.score[0]+","+t[z.flag[0]]+","+z.score[1]+","+t[z.flag[1]]+","+z.score[2]+","+t[z.flag[2]]);}d.write("\n");}d.write("</pre>");d.close();}});}});})();
(たぶん)DP用
javascript:(function(){var t={0:"No Play",1:"Failed",2:"Assist Clear",3:"Easy Clear",4:"Clear",5:"Hard Clear",6:"Full Combo"};var f={0:"f0",1:"f1",2:"f2",3:"f3",4:"f4",5:"f5",6:"f6"};var l={AAA:"aaa",AA:"aa",A:"a",B:"b",C:"c",D:"d",E:"e",F:"f"};new frames[0].Ajax.Request('../data/getMusicList.do?'+frames[0].Music.tags,{method:'get',onComplete:function(r){eval("var m="+r.responseText);new frames[0].Ajax.Request('../data/getMusicData.do?'+frames[0].MusicScore.tags,{method:'get',onComplete:function(r){eval("var s="+r.responseText);var h=window.open("about:blank");var d=h.document;d.open();d.write("<title>csv</title><pre>Ver,Title,Difficulty,NRank,NScore,NClear,HRank,HScore,HClear,ARank,AScore,AClear");var r=s.rivalsscore.score.dp;for(var i=0;i<r.length;i++){d.write(","+s.rivalsscore.name.dp[i]+",N/H/A,Score(Clear),,,");}d.write("\n");for(var i in m.music_list){var x=s.myscore[m.music_list[i].mid];d.write(m.version[m.music_list[i].version].name+",\""+m.music_list[i].name+"\",["+m.music_list[i].diff[3]+"|"+m.music_list[i].diff[4]+"|"+m.music_list[i].diff[5]+"],"+x.level[3]+","+x.score[3]+","+t[x.flag[3]]+","+x.level[4]+","+x.score[4]+","+t[x.flag[4]]+","+x.level[5]+","+x.score[5]+","+t[x.flag[5]]);for(var j=0;j<r.length;j++){var z=r[j][m.music_list[i].mid];if(!z){continue;}d.write(","+z.score[0]+","+t[z.flag[0]]+","+z.score[1]+","+t[z.flag[1]]+","+z.score[2]+","+t[z.flag[2]]);}d.write("\n");}d.write("</pre>");d.close();}});}});})();
javascript:(function(){x=document;y=window;if(x.selection){Q=x.selection.createRange().text;}else if(y.getSelection){Q=y.getSelection();}else if(x.getSelection){Q=x.getSelection();};m='https://mail.google.com/mail/?view=cm&fs=1&to='+encodeURIComponent(Q)+'';y.open(m,'addwindow');})();
javascript:(function(){x=document;y=window;if(x.selection){Q=x.selection.createRange().text;}else if(y.getSelection){Q=y.getSelection();}else if(x.getSelection){Q=x.getSelection();};m='https://mail.google.com/mail/?view=cm&fs=1&tf=1&to='+encodeURIComponent(Q)+'';y.open(m,'addwindow');})();
テスト用: masuda@example.com
タイトル | アーティスト | 再生回数 |
---|---|---|
ブラックアウト | 東京事変 | 566 |
アララト | WHITE-LIPS | 522 |
R.O.D. | やなぎなぎ | 490 |
強引niマイYeah〜 | 大槻ケンヂと絶望少女達 | 483 |
Nowhere | FictionJunction YUUKA | 448 |
空想ルンバ | 大槻ケンヂと絶望少女達 | 445 |
God knows... | 平野綾 | 387 |
メロスのように -LONELY WAY- | AIRMAIL from NAGASAKI | 376 |
だから涙をふいて… | 佐倉沙織 | 376 |
赤橙 | ACIDMAN | 368 |
未来への咆哮 | JAM Project featuring Kageyama Hironobu, Endoh Masaaki, Kitadani Hiroshi & Fukuyama Yoshiki | 332 |
明日へのBrilliant Road | Angela | 304 |
Do you feel loved? | KOTOKO | 296 |
Born On Judgment Day | Helloween | 292 |
鏡の中のアクトレス | 中原めいこ | 288 |
Days of promise | SHIHO | 283 |
PEARLS | Seatbelts | 271 |
metamorphose | 高橋洋子 | 268 |
STORM | JAM Project | 260 |
雪、無音、窓辺にて | 長門有希 | 260 |
El Alma feat. SHINJI TAKEDA | Dragon Ash | 252 |
まるい月 | fau. | 249 |
飛光 | ACIDMAN | 248 |
未完成協奏曲 (ロングヴァージョン) | 錦織健 | 247 |
パノラマ -Panorama- | 水樹奈々 | 246 |
この表を作る方法は以下のとおり。Macユーザならすぐ出来る。
1.まず、デフォルトのスマートプレイリストのTop25を表示する。そしてiTunesでの情報表示を、上のバーを右クリックしてタイトル、アーティスト、再生回数のみにチェックする。
2.全体を選択。iTunes.txtというファイル名で保存する。UTF-8で。
3.次のソースコードをコピペして、iTunes_list.rbという名前でiTunes.txtを保存したのと同じフォルダに保存する。
f = open("iTunes.txt") printf "|*タイトル|*アーティスト|*再生回数|\n" f.each{|str| str = str.gsub(/\t/, "|") str = str.chop printf "|"+str+"|\n" }
4.ターミナルを立ち上げ、cdと打ち込んだ後にスペースを空けて、iTunes.txtとiTunes_list.rbが入っているフォルダを、ターミナルのウインドウにドラッグアンドドロップする。その後returnキー。
5.ruby iTunes_list.rbと打つと、はてな記法で表組されたテキストが出てくるので、これをはてダにコピペすればおk。
もしアルバム名なども表示したかったら、まずiTunesで表示したいヤツを出して選択してiTunes.txtにコピペ。そして最初のprintfのところを適宜書き換えればいい。
WinユーザもRubyを動かせる環境がそろってる人なら、すぐに出来ると思う。
さあ、みんなも再生回数晒してみようぜ。
いまさらなんだけど。
javascript:t=document.title;l=location.href;c=prompt('make a memo:\n'+t+'\n'+l,' ');if(typeof c != 'object')window.open('http://anond.hatelabo.jp/<ここを自分のidにする>/edit?mode=confirm&title='+escape(l)+'&body=:'+escape(t)+':'+escape(c));undefined;
Science and Pseudo-Science (Stanford Encyclopedia of Philosophy)
http://plato.stanford.edu/entries/pseudo-science/
Meditating on consciousness : Article : Nature
http://www.nature.com/nature/journal/v456/n7219/abs/456170a.html
Dalai Lama gets go-ahead for meditation lecture : Nature
http://www.nature.com/nature/journal/v436/n7054/abs/4361071b.html
Science and religion in harmony : Nature
http://www.nature.com/nature/journal/v436/n7053/abs/436889a.html
Buddhism is no bar to an open mind. Is science? : Nature
http://www.nature.com/nature/journal/v436/n7053/abs/436912a.html
Religion and ScienceBuddhism on the brain : Article : Nature
http://www.nature.com/nature/journal/v432/n7018/abs/432670a.html
せっかく書いたから匿名でのせてみるよ
使い方は
必要なものを 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) |
http://kago.in/portal/index.php?url=<>
Warning: file_get_contents(http://api.pathtraq.com/pages?url=<>&m=popular) [function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.1 400 Bad Request in /virtual/kago/public_html/portal/index.php on line 25 Warning: file_get_contents(http://api.search.yahoo.co.jp/ImageSearchService/V1/imageSearch?appid=_DG85xqxg66_I.XOwI8HXsFIoVCrj7wuyv4HstVVzMq.Eq5NFShOxteUK6FlXyPB9BFCYw--&query=<>&results=50) [function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.1 400 Bad Request in /virtual/kago/public_html/portal/index.php on line 32 Warning: file_get_contents(http://www.2chsearch.net/api/list?q=<>&mode=html) [function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.1 500 Internal Server Error in /virtual/kago/public_html/portal/index.php on line 42
<kml xmlns="http://earth.google.com/kml/2.1"><Document><name>Jogging simulator</name><open>1</open><Style id="linestylered"><LineStyle><color>7f0000ff</color><width>4</width></LineStyle></Style><Placemark>
<styleUrl>#linestylered</styleUrl><LineString><extrude>1</extrude><tessellate>1</tessellate>
<dist_elev>
0,0
94,0
85,0
100,0
502,0
204,0
227,0
247,0
147,0
54,0
56,0
208,0
81,0
114,0
121,0
19,0
45,0
46,0
136,0
144,0
37,0
149,0
100,0
65,0
51,0
94,0
52,0
134,0
153,0
148,0
104,0
378,0
144,0
108,0
47,0
392,0
337,0
69,0
109,0
28,0
144,0
63,0
103,0
82,0
41,0
77,0
71,0
192,0
120,0
78,0
70,0
41,0
185,0
57,0
85,0
133,0
173,0
115,0
21,0
34,0
167,0
90,0
92,0
98,0
251,0
126,0
107,0
114,0
142,0
26,0
189,0
210,0
366,0
100,0
153,0
217,0
171,0
424,0
205,0
163,0
108,0
87,0
62,0
33,0
98,0
80,0
89,0
71,0
27,0
434,0
199,0
205,0
290,0
105,0
235,0
159,0
110,0
210,0
162,0
450,0
63,0
96,0
154,0
97,0
491,0
374,0
53,0
61,0
95,0
201,0
73,0
76,0
33,0
35,0
175,0
43,0
36,0
68,0
24,0
55,0
24,0
35,0
13,0
95,0
20,0
101,0
54,0
97,0
23,0
65,0
24,0
40,0
39,0
61,0
41,0
23,0
37,0
40,0
101,0
153,0
136,0
116,0
132,0
103,0
41,0
44,0
88,0
74,0
48,0
38,0
265,0
98,0
152,0
86,0
140,0
84,0
23,0
110,0
26,0
69,0
113,0
137,0
150,0
143,0
93,0
194,0
103,0
67,0
136,0
104,0
116,0
201,0
178,0
199,0
116,0
89,0
71,0
60,0
254,0
64,0
127,0
114,0
149,0
32,0
55,0
88,0
95,0
126,0
70,0
396,0
283,0
178,0
335,0
100,0
242,0
376,0
717,0
259,0
211,0
80,0
36,0
32,0
38,0
30,0
28,0
489,0
278,0
46,0
254,0
81,0
68,0
220,0
64,0
431,0
93,0
148,0
126,0
222,0
222,0
227,0
152,0
172,0
138,0
219,0
180,0
177,0
110,0
538,0
161,0
117,0
120,0
777,0
189,0
269,0
182,0
92,0
168,0
158,0
42,0
53,0
59,0
35,0
111,0
78,0
82,0
54,0
18,0
64,0
518,0
119,0
529,0
95,0
121,0
113,0
107,0
111,0
480,0
88,0
241,0
209,0
232,0
151,0
275,0
76,0
61,0
51,0
37,0
45,0
77,0
52,0
157,0
25,0
238,0
413,0
268,0
227,0,
63,0,
141,0,
</dist_elev>
<visited_place>
,,
,,
,,
</visited_place>
<coordinates>
139.63037252426147,35.18771434049862
139.6301257610321,35.186898880828714
139.6309196949005,35.18730222749469
139.63167071342468,35.18795985363517
139.63409543037415,35.19201071329039
139.63593006134033,35.19307161935013
139.63775396347046,35.194465681456606
139.64007139205933,35.19562299786218
139.64163780212402,35.19595440818654
139.64189529418945,35.19639277951902
139.64178800582886,35.196883752602936
139.64200258255005,35.198742409538866
139.64230298995972,35.199426244312825
139.6424102783203,35.20044321871356
139.6435260772705,35.201039370200796
139.64359045028687,35.20119717427379
139.64335441589355,35.20154784889382
139.64371919631958,35.201828387499695
139.64401960372925,35.203020665763816
139.64534997940063,35.20372199774286
139.64539289474487,35.20405512831116
139.6465301513672,35.205019445937246
139.6470022201538,35.20582595733999
139.64708805084229,35.20640453667283
139.64764595031738,35.20647466722091
139.6473240852356,35.20728116417065
139.6468734741211,35.20756168297117
139.645414352417,35.20742142369205
139.64423418045044,35.20840323355815
139.64389085769653,35.20970060695813
139.6442985534668,35.21057719887122
139.64728116989136,35.212943949762256
139.6478819847107,35.21413606482221
139.6479892730713,35.21510026272678
139.64771032333374,35.21545087730718
139.6439015865326,35.217091733388784
139.64099407196045,35.21896745775251
139.6406614780426,35.21952841362797
139.64028596878052,35.22045748826842
139.64056491851807,35.22056792472205
139.64037716388702,35.22185633906688
139.64052200317383,35.222408510381754
139.6403932571411,35.22332878755783
139.64070439338684,35.22401679748617
139.64039862155914,35.22428411187213
139.64077413082123,35.22490638129421
139.64128375053406,35.22538403557113
139.6426409482956,35.226707429981815
139.64331686496735,35.227636422435864
139.6432203054428,35.22832877781907
139.64323103427887,35.22895539816757
139.64289844036102,35.22920516856592
139.64419662952423,35.23048906391726
139.64443266391754,35.23096230349543
139.64511930942535,35.23147497658997
139.6465677022934,35.23165024869969
139.64845061302185,35.23140048582869
139.64967906475067,35.23116211492625
139.6494671702385,35.231225651354805
139.64964419603348,35.231497323798344
139.6512696146965,35.232189646234715
139.65178191661835,35.232881962762875
139.65204745531082,35.2336772431284
139.65270459651947,35.23437173778668
139.6551775932312,35.23337578241781
139.65656161308289,35.233314438527294
139.65765595436096,35.232972664573865
139.65810656547546,35.23392787534491
139.658203125,35.23519855113892
139.65833187103271,35.23540886797109
139.65907216072083,35.2369949898497
139.6603488922119,35.23857231786453
139.66199040412903,35.24157791910687
139.66269850730896,35.242261393057
139.66373920440674,35.243339167197576
139.66395378112793,35.24528438182719
139.6650266647339,35.246546117717116
139.66514468193054,35.25035749231099
139.66588497161865,35.25210102693307
139.66530561447144,35.25348531414836
139.66552019119263,35.254440283321436
139.66533780097961,35.25520775496638
139.66469943523407,35.25541363939197
139.66435611248016,35.25551439115435
139.6632832288742,35.25550124962722
139.66244101524353,35.25569837231032
139.6625965833664,35.25648685824873
139.66287553310394,35.25708697851668
139.66305255889893,35.25728409734326
139.65897023677826,35.25930344259883
139.65691030025482,35.25990792228293
139.65496838092804,35.2608365344634
139.65259194374084,35.262579843685224
139.65155124664307,35.262995954663744
139.6489655971527,35.263105457197696
139.64743673801422,35.26379750978935
139.64679837226868,35.2646384771354
139.64592933654785,35.266381704564445
139.64587569236755,35.26783494943115
139.64685201644897,35.271794230515624
139.64729189872742,35.27223219220043
139.6482789516449,35.27253000479355
139.6491265296936,35.27373000326553
139.64948058128357,35.27455334959795
139.65195894241333,35.27846850965091
139.65227007865906,35.281822959319406
139.6517014503479,35.281920174966054
139.65117037296295,35.28225736351309
139.65034425258636,35.28172749516593
139.64833796024323,35.28096552964672
139.64753329753876,35.280974287911825
139.64679300785065,35.281289584824215
139.64642822742462,35.281289584824215
139.64605808258057,35.28118886511065
139.64541971683502,35.282668994381474
139.64511394500732,35.28237559812567
139.6449476480484,35.282086579879035
139.644513130188,35.28159174321329
139.64425027370453,35.28159612231207
139.64376747608185,35.28130272216894
139.6435958147049,35.28146912835075
139.643252491951,35.28161801780251
139.64311838150024,35.281644292383234
139.64330077171326,35.28248507446485
139.6431827545166,35.28263396204861
139.64356362819672,35.28348392974092
139.6432739496231,35.2839108807827
139.64257925748825,35.28325184258908
139.64232712984085,35.28327373763183
139.6418336033821,35.283694121304364
139.64205890893936,35.28379921688149
139.64225471019745,35.28412545019985
139.64259535074234,35.28434220852351
139.6428018808365,35.284867680839
139.6426945924759,35.28522237272412
139.64259535074234,35.28541066531569
139.6425873041153,35.28574564989031
139.6428206562996,35.28604560222215
139.64264899492264,35.286938884335825
139.6430405974388,35.28827222092029
139.64410811662674,35.28913482763547
139.6445855498314,35.29010470187369
139.64542508125305,35.29107675378499
139.64553773403168,35.29199406233845
139.64569866657257,35.29233777670865
139.6456155180931,35.29272308535028
139.64639872312546,35.293193772395284
139.6465301513672,35.293845286365624
139.64622974395752,35.294195560500974
139.64582204818726,35.29424810149053
139.6429681777954,35.29374020382943
139.64189529418945,35.2938628001084
139.64028596878052,35.29423058783114
139.6393847465515,35.29447577871785
139.63788270950317,35.294178046830204
139.63728189468384,35.29360009356897
139.6370244026184,35.29360009356897
139.6359086036682,35.29398539620167
139.63569402694702,35.29382777261908
139.63526487350464,35.29331987232042
139.63402032852173,35.29340744156481
139.63268995285034,35.29398539620167
139.6315312385559,35.294948644758904
139.63088750839233,35.29612204114941
139.6307373046875,35.29694515980801
139.62977170944214,35.29850380837487
139.6297287940979,35.29943197809182
139.6290421485901,35.29965964073617
139.62880611419678,35.30086974447647
139.6297287940979,35.3014301337228
139.63011503219604,35.30241956151048
139.63161706924438,35.303750454142175
139.6329179406166,35.30494473650507
139.63504761457443,35.305380329980835
139.63613122701645,35.30592317685907
139.6368795633316,35.30643318693823
139.6370592713356,35.307057014637834
139.63687419891357,35.307574897464406
139.63496446609497,35.30923840383023
139.6350073814392,35.309816245404804
139.63571548461914,35.310796815600966
139.6355438232422,35.31181239363021
139.6360158920288,35.313090603025756
139.6363377571106,35.313213169988664
139.63650941848755,35.31368592653426
139.63706731796265,35.31433377360878
139.63760375976562,35.31506916129673
139.63820457458496,35.31608468568258
139.63822603225708,35.31671500474969
139.633891582489,35.31713521473183
139.63078022003174,35.317312052419815
139.6289563179016,35.31673426439491
139.62537288665771,35.31601640079532
139.62493300437927,35.31683931707012
139.62274432182312,35.318082430031566
139.6206521987915,35.32100104417254
139.62007820606232,35.32742617587357
139.62111622095108,35.329590384931535
139.6212449669838,35.33148319975148
139.62037861347198,35.331378166102226
139.6199843287468,35.3314175537367
139.61993604898453,35.33170420760937
139.61999773979187,35.33203900054002
139.61999505758286,35.33231252314687
139.61986631155014,35.33254446959218
139.61979389190674,35.336935134045376
139.62048053741455,35.33936821123701
139.6203088760376,35.33975329587599
139.61902141571045,35.34178371180497
139.61829721927643,35.34220204112146
139.61866199970245,35.342731513456684
139.61660206317902,35.34376419331703
139.61593687534332,35.343956725390434
139.61129128932953,35.344731224777654
139.61041688919067,35.345163540994
139.6093225479126,35.34614368252144
139.6084749698639,35.347036301065934
139.60789561271667,35.34897027407597
139.6069622039795,35.350816693787074
139.6068549156189,35.352855582153644
139.606693983078,35.35421189569119
139.6068549156189,35.35575194022067
139.60676908493042,35.356985704705835
139.60623264312744,35.358901939828456
139.6061897277832,35.36052064182823
139.60673689842224,35.362043067067724
139.60736989974976,35.362883013532
139.61206912994385,35.365822757339565
139.61312055587769,35.36698637635618
139.6134102344513,35.368009997262035
139.61307764053345,35.36904935292668
139.61015939712524,35.37561063259531
139.60919380187988,35.37711527753762
139.60623264312744,35.37704529467405
139.60445165634155,35.3762947246194
139.60386157035828,35.375621130188655
139.60379719734192,35.37411645738611
139.60410833358765,35.37271673656808
139.60407614707947,35.37234055745931
139.60367918014526,35.37199062183042
139.60302472114563,35.37200811864791
139.60278868675232,35.37226182207509
139.60188746452332,35.37158819398145
139.60111498832703,35.37127324904777
139.60028886795044,35.3709845484456
139.59980607032776,35.370704595360294
139.5996129512787,35.37065210404869
139.59943056106567,35.37120326111783
139.5940661430359,35.369628516649065
139.59286451339722,35.36919983088999
139.58793997764587,35.36666266447924
139.58701729774475,35.36625146103402
139.58571910858154,35.366015236830954
139.58447456359863,35.366050233052796
139.58334803581238,35.36633895130417
139.58226442337036,35.36680264815291
139.57830548286438,35.36965476264197
139.5775008201599,35.37009219460078
139.5751190185547,35.371054536565204
139.5730483531952,35.371885640845875
139.57077383995056,35.37283921310886
139.56947565078735,35.373687795464576
139.56740498542786,35.37548990983999
139.56669688224792,35.37513123979827
139.5662248134613,35.37473757572232
139.56590294837952,35.37436140603325
139.5657742023468,35.37404997117641
139.56576079130173,35.3736497406537
139.56597536802292,35.372978311220415
139.56588953733444,35.372516836937635
139.5649641752243,35.37132049084614
139.56483274698257,35.37112802400542
139.56393957138062,35.369119342724375
139.56031322479248,35.36687963909665
139.55790996551514,35.365479792771474
139.55679953098297,35.3636538316989
139.55610752105713,35.363592586482675
139.5546966791153,35.36306325089201
</coordinates>
<jogsiminfo>
18,139.5536881685257,35.36369407851664,1,1,0,0,1.4,0,0,0
</jogsiminfo>
</LineString></Placemark></Document></kml>
結局概要表示機能追加した。unsafeWindow使いまくり。大丈夫かいな。
// ==UserScript== // @name Hatena Bookmark Tree Expander // @namespace http://anond.hatelabo.jp/ // @include http://b.hatena.ne.jp/entry/* // ==/UserScript== // <div class="info"> // <ul id="similar_entries" class="bookmarklist"> // <li></li> // </ul> // </div> // <div class="info"> // <ul id="referred_entries" class="bookmarklist"> // <li id="referred-entry-\d+"></li> // </ul> // </div> // <div class="info"> // <ul id="relation_diary" class="bookmarklist"> // <li id="diary-{id}-\d+"></li> // </ul> // </div> (function() { function main() { loadBookmarkCommentViewer(); similar.prototype.rootAppend(); referred.prototype.rootAppend(); } function HBTM(target) { this.target = target; this.targetXPath = "//ul[@id='"+target+"']/li"; this.targetRegExp = new RegExp('<ul id="'+target+'"(.|\\s)*?</ul>'); } HBTM.prototype = { openIcon: '<img width="15" height="15" class="icon" style="opacity: 0.6" src="http://anond.hatelabo.jp/images/common/open.gif"/>', closeIcon: '<img width="15" height="15" class="icon" style="opacity: 0.6" src="http://anond.hatelabo.jp/images/common/close.gif"/>', loadingIcon: '<img width="13" height="13" class="icon" src="http://anond.hatelabo.jp/images/common/loading.gif"/>', commentIcon: function(url) { return '<img class="hatena-bcomment-view-icon" src="http://r.hatena.ne.jp/images/popup.gif" onclick="iconImageClickHandler(this, \''+url+'\', event);">' }, create: function() { this.comment = document.createElement("span"); this.comment.innerHTML = this.commentIcon($X("string(descendant::a/@href)", this.node).value()); this.open = document.createElement("a"); this.open.href = "javascript:void(0)"; this.open.innerHTML = this.openIcon; this.close = document.createElement("a"); this.close.href = "javascript:void(0)"; this.close.innerHTML = this.closeIcon; this.close.style.display = "none"; this.loading = document.createElement("span"); this.loading.innerHTML = this.loadingIcon; this.loading.style.display = "none"; this.node.appendChild(this.comment); this.node.appendChild(document.createTextNode(" ")); this.node.appendChild(this.open); this.node.appendChild(this.close); this.node.appendChild(this.loading); this.open.addEventListener("click", bind(this.openAct, this), false); this.close.addEventListener("click", bind(this.closeAct, this), false); }, openAct: function() { this.open.style.display = "none"; if (this.tree) { this.tree.style.display = "block"; this.close.style.display = "inline"; } else { this.loading.style.display = "inline"; this.load(); } }, closeAct: function() { if (this.tree) { this.tree.style.display = "none"; this.close.style.display = "none"; this.open.style.display = "inline"; } }, load: function() { var url = $X("string(descendant::a[starts-with(@href, '/entry/')]/@href)", this.node).value(); GM_xmlhttpRequest({ method: "GET", url: "http://b.hatena.ne.jp"+url, onload: bind(this.loadCallback, this) }); }, loadCallback: function(result) { var match = result.responseText.match(this.targetRegExp); if (match) { var sandbox = document.createElement("div"); sandbox.innerHTML = match[0].replace(this.target,""); this.tree = sandbox.firstChild; } else { this.tree = document.createElement("ul"); } this.append(); this.loading.style.display = "none"; this.close.style.display = "inline"; }, append: function() { this.tree.style.backgroundColor = "transparent"; this.tree.style.listStyleType = "circle"; this.node.appendChild(this.tree); $X("li", this.tree).each(function(n) { var a = $X("a",n).node(); var c = $X("count(//li/a[@href='"+a.href+"'])").value(); if (c > 1) n.parentNode.removeChild(n); }); $X("li", this.tree).each(bind(function(node){new this.constructor(node)}, this)); }, rootAppend: function() { $X(this.targetXPath).each(bind(function(node){new this.constructor(node)}, this)); } }; function similar(node) { this.node = node; this.create(); } similar.prototype = new HBTM("similar_entries"); similar.prototype.constructor = similar; function referred(node) { this.node = node; this.create(); } referred.prototype = new HBTM("referred_entries"); referred.prototype.constructor = referred; function loadBookmarkCommentViewer() { var head = document.getElementsByTagName("head")[0]; var script = document.createElement("script"); script.type = "text/javascript"; script.src = "http://b.hatena.ne.jp/js/BookmarkCommentViewerAllInOne.1.2.js"; head.appendChild(script); var css = document.createElement("link"); css.rel="stylesheet"; css.href="http://d.hatena.ne.jp/css/base.css"; css.type="text/css"; css.media="all"; head.insertBefore(css, head.firstChild); window.addEventListener("load",function(){ var BCV = unsafeWindow.BookmarkCommentViewer; BCV.options['screenshot'] = true; var asyncCommnetView = BCV.asyncCommnetView; BCV.asyncCommnetView = function(url, onCompleteCallback) { var div = asyncCommnetView(url, function(){ onCompleteCallback.apply(this, arguments); new unsafeWindow.Ten.XHR("http://b.hatena.ne.jp/entry/rss/"+url, {}, function(result) { if (! result.responseText.match(/<description>(.*?)<\/description>/)) return; if (! RegExp.$1) return; // var desc = document.createTextNode("desc: "+RegExp.$1); var desc = document.createElement("li"); desc.appendChild(document.createTextNode("desc: "+RegExp.$1)); div.lastChild.insertBefore(desc,div.lastChild.getElementsByTagName("li")[0]); }); }); return div; }; BCV.asyncCommnetView.origin = asyncCommnetView; }, false); } function bind(f,o) {return function() {return f.apply(o, arguments)}} function $X(xpath, context) { if (!(this instanceof $X)) return new $X(xpath, context); this.xpath = xpath; this.context = context || document; } $X.prototype = { evaluate: function() { var result = document.evaluate(this.xpath, this.context, null, this.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.FIRST_ORDERED_NODE_TYPE: return result.singleNodeValue; } return result; }, node: function() { this.type = XPathResult.FIRST_ORDERED_NODE_TYPE; return this.evaluate(); }, value: function() { this.type = XPathResult.ANY_TYPE; return this.evaluate(); }, each: function(func) { this.type = XPathResult.ORDERED_NODE_SNAPSHOT_TYPE; var result = this.evaluate(); for (var i=0; i<result.snapshotLength; i++) func(result.snapshotItem(i)); } }; main(); })();
ほんとにもう最高。
楽したい人間+ハマり性な人間には、こーゆーカスタマイズがしがし出来るツールが最高なのよ。
エディタなら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になっているので、いつからかチェックするのが朝の習慣になった。
サーバーサイドでマジメに作ったら逮捕されるんだろうか…?けーさつこわいから悪用とかしないでね><
ところで2chのどっかの板の名前欄って人名と地名がランダム表示されるけど、どうやってリストを作成してるんだろ?
<html><head><title>反抗予告ジェネレータ</title><script type="text/javascript"><!-- var safe_mode = 1; var date, place, object, action; date = get_date(); object = get_object(); action = get_action(); httpRequest("http://ja.wikipedia.org/wiki/%E6%97%A5%E6%9C%AC%E3%81%AE%E5%A4%A7%E5%AD%A6%E4%B8%80%E8%A6%A7"); function get_date() { var now = new Date(); now.setTime(now.getTime() + Math.floor(Math.random()*1000*60*60*24*30)); if (safe_mode != 0) { now.setTime(now.getTime() + 1000*60*60*24*(365*3+366)/4*100); } return now.getYear()+"年"+(now.getMonth()+1)+"月"+now.getDate()+"日"+now.getHours()+"時"+now.getMinutes()+"分"+now.getSeconds()+"秒"; } function get_object() { var b = ["小女子", "増田", "ひろゆき", "ぬこ"]; return b[Math.floor(Math.random()*b.length)]; } function get_action() { var b = ["投", "SATSUGAI", "なでなで", "もふもふ"]; return b[Math.floor(Math.random()*b.length)]; } function httpRequest(target_url) { try { if(window.XMLHttpRequest) { httpObj = new XMLHttpRequest(); } else if(window.ActiveXObject) { httpObj = new ActiveXObject("Microsoft.XMLHTTP"); } else { return; } } catch(e) { return; } httpObj.open("GET", target_url, true); httpObj.onreadystatechange = DataRead; httpObj.send(""); return; } function DataRead() { if (httpObj.readyState == 4 && httpObj.status == 200) { var res = httpObj.responseText; var b = new Array(); b = res.match(/>([亜-熙]+)大学/g); place = b[Math.floor(Math.random()*b.length-1)].replace(">",""); if (safe_mode != 0) { place = place.replace("大学", "○○"); } document.body.innerText = date+"に"+place+"あたりで"+object+"を"+action+"します…!"; } } // --></script></head><body style="color:red; background-color:black; font-size:30px; text-align:center;"></body></html>
ドグラ・マグラ http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/000096/card2093.html
瓶詰地獄 http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/000096/card2381.html
創作人物の名前について http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/000096/card2138.html
少女地獄 http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/000096/card935.html
江戸川乱歩氏に対する私の感想 http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/000096/card2128.html
懐中時計 http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/000096/card46823.html
探偵小説の真使命 http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/000096/card2135.html
黒死館殺人事件 http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/000125/card1317.html
科学者とあたま http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/000042/card2359.html
ジャーナリズム雑感 http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/000042/card2492.html
電車の混雑について http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/000042/card2449.html
科学上における権威の価値と弊害 http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/000042/card42693.html
量的と質的と統計的と http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/000042/card2350.html
アインシュタイン http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/000042/card43074.html
化け物の進化 http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/000042/card2346.html
アインシュタインの教育観 http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/000042/card43075.html
ニイチェに就いての雑感 http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/000067/card1766.html
純情小曲集 http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/000067/card1788.html
桜の樹の下には http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/000074/card427.html
檸檬 http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/000074/card46349.html
山月記 http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/000119/card624.html
悟浄歎異 http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/000119/card617.html
李陵 http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/000119/card1737.html
名人伝 http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/000119/card621.html
セロ弾きのゴーシュ http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/000081/card470.html
ツェねずみ http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/000081/card1949.html
やまなし http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/000081/card472.html
グスコーブドリの伝記 http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/000081/card1924.html
銀河鉄道の夜 http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/000081/card456.html
農民芸術概論綱要 http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/000081/card2386.html
注文の多い料理店 http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/000081/card43754.html
夢十夜 http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/000148/card799.html
こころ http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/000148/card773.html
草枕 http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/000148/card776.html
道楽と職業 http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/000148/card757.html
吾輩は猫である http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/000148/card789.html
私の個人主義 http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/000148/card772.html
田山花袋君に答う http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/000148/card2370.html
蟹工船 http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/000156/card1465.html
老妓抄 http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/000076/card447.html
狂童女の恋 http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/000076/card986.html
人間失格 http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/000035/card301.html
小説の面白さ http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/000035/card1604.html
如是我聞 http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/000035/card1084.html
トカトントン http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/000035/card2285.html
お伽草紙 http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/000035/card307.html
女生徒 http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/000035/card275.html
駈込み訴え http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/000035/card277.html
斜陽 http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/000035/card1565.html
グッド・バイ http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/000035/card258.html
葉 http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/000035/card2288.html
走れメロス http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/000035/card1567.html
侏儒の言葉 http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/000879/card158.html
河童 http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/000879/card69.html
藪の中 http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/000879/card179.html
文芸的な、余りに文芸的な http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/000879/card26.html
あばばばば http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/000879/card14.html
蜘蛛の糸 http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/000879/card92.html
夜長姫と耳男 http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/001095/card42614.html
堕落論 http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/001095/card42620.html
桜の森の満開の下 http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/001095/card42618.html
不良少年とキリスト http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/001095/card42840.html
推理小説論 http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/001095/card43189.html
教祖の文学 http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/001095/card42864.html
阿部定さんの印象 http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/001095/card42883.html
深夜は睡るに限ること http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/001095/card43159.html
青春論 http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/001095/card42624.html
風と光と二十の私と http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/001095/card42615.html
日本文化私観 http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/001095/card42625.html
勉強記 http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/001095/card42623.html
風博士 http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/001095/card42616.html
「いき」の構造 http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/000065/card393.html
少女病 http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/000214/card1098.html
蒲団 http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/000214/card1669.html
セメント樽の中の手紙 http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/000031/card228.html
支那人の食人肉風習 http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/000372/card4270.html
支那人間に於ける食人肉の風習 http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/000372/card42810.html
最終戦争論・戦争史大観 http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/000230/card1154.html
十八時の音楽浴 http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/000160/card865.html
音楽の反方法論序説 http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/000059/card374.html
手袋を買いに http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/000121/card637.html
あたらしい憲法のはなし http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/001128/card43037.html
尾崎放哉選句集 http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/000195/card974.html
僕の読書法 http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/000040/card46359.html
大阪の憂鬱 http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/000040/card46499.html
読書子に寄す http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/001119/card42753.html
小さなメディアの必要 http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/000117/card611.html
死者の書 http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/000933/card4398.html
平安朝時代の漢文学 http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/000284/card3340.html
公開書架(Open-shelf-system)につきて http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/001227/card46210.html
善の研究 http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/000182/card946.html
絶対矛盾的自己同一 http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/000182/card1755.html
一握の砂 http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/000153/card816.html
役人学三則 http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/000922/card43242.html
言語体の文章と浮雲 http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/000051/card1446.html
在りし日の歌 http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/000026/card219.html
ルバイヤート http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/000288/card1760.html
阿Q正伝 http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/001124/card42934.html
伽藍とバザール http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/000029/card227.html
あのときの王子くん http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/001265/card46817.html
まざあ・ぐうす http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/000000/card546.html
ラプンツェル http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/001091/card42309.html
アメリカ独立宣言 http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/001189/card45257.html
ガリバー旅行記 http://mgw.hatena.ne.jp/?url=http://www.aozora.gr.jp/cards/000912/card4673.html
http://d.hatena.ne.jp/barcode?str=http://anond.hatelabo.jp/20080708184613
答えはいらない。ただ、今は、僕が何かになれればいいのかな。だめだ。
I wish I was a neutron bomb, for once I could go off
I wish I was a sacrifice but somehow still lived on
I wish I was a sentimental ornament you hung onThe christmas tree,
I wish I was the star that went on top
I wish I was the evidence,
I wish I was the grounds For 50 million hands upraised and open toward the sky
I wish I was a sailor with someone who waited for me
I wish I was as fortunate, as fortunate as me
I wish I was a messenger and all the news was good
I wish I was the full moon shining off a camaros hood
I wish I was an alien at home behind the sun
I wish I was the souvenir you kept your house key on
I wish I was the pedal brake that you depended on
I wish I was the verb to trust and never let you down
http://www.dan.co.jp/~dankogai/ldr-hbc/ より
実行してみたら出力に変化がなかった。アルェー?
# tree -pugs | perl -e '@line=<>; $max=(sort {$b<=>$a} map {/^(.*?)\[/; length($1)} @line)[0]; map {s/^(.*?)\[/$1 . " "x($max-length($1))."\["/e} @line; print @line'
毎回正規表現考えるのも面倒かなーとかとか。
理想を語ると出力形式指定できれば最強だなーとか妄想してた。
この辺は、ファイルにして ~/bin に放りこんで、自分好みに育て上げる、ってのがエロゲ^H^H^Hギークの楽しみ方かと。
雛型的には↓かなぁ。どうだろ。弾・monger・コーガイ氏が登場したら……滅多切りさるかもw
#!/usr/bin/perl use strict; use warnings; use Getopt::Std; use vars qw($opt_t); # オプション処理 getopts('t'); # $opt_tがセットされていたらタブ処理、ということにする。 # コマンド起動 # 引数処理とかシグナルとか面倒なところは…… open TREE, "tree -pugs ".join(" ",@ARGV,"|") or die; my @line = <TREE>; # 富豪的にいく close TREE; # ここで子プロセスの処理だっけ? # それともwaitするんだっけ? # ツリー表示部分の最大長を求める。 my $max=(sort {$b<=>$a} map {/^(.*?)\[/; length($1)} @line)[0]; # 色々やる時はユーザ名とかグループ名とかファイル名とかの最大長がいるかも foreach (@line) { if ($opt_t) { # タブ(\t)で位置をそろえるとか…… } else { s/^(.*?)\[/$1 . " "x($max-length($1))."\["/e; } print; }
treeへのオプションの与え方とか、それによる出力の変化とか考えると、結構面倒だけど、自分用に決め打ちしとけば何とかなるでしょう。
あと、「[%p<>%u<>%g<>%s]」みたいなのはCPANに転がってたりしそうな気もするので、それを使うとか。
そんなところでなかろうか。
[追記]
http://search.cpan.org/~darren/String-Format-1.14/Format.pm というのがあった。
##はじめに
→OpenIDが仮に広まった未来には、サービス事業者がユーザの個人情報をどれだけ持つのが適正なのかを考えられるようになりたいよ
##OpenIDを利用したサービスは、将来オープンにOpenIDプロバイダを受け入れることができる?
OpenIDを受け入れる、ということは「特定ではないIDプロバイダによって認証」されたユーザをサービス事業者は受け入れるということになるよ。
※以下サービス事業者の例を、わかりやすくするために京都発のWebサービス提供会社、はてなさん(以下はてな)にするよ
ここでいう「特定ではないIDプロバイダによって認証」というカッコ書きについて整理しておくね。
これ、逆に言うとこれまでのサービスって、はてなも勿論そうだけど「特定されるIDプロバイダによって認証」が行われていたんだということになるよね。
例えば、はてなというサービスにエンドユーザの増田が、はてなのIDとパスワードでもってログインを行う場合は、
増田・はてなサービス・はてな会員管理システム(これもはてなの一部だけど)の3者関係で考えると、
増田がはてなのサービスを利用するためにログインすると、はてなサービスは、はてなの会員管理システムに僕が僕であるためのID・パスワードを問い合わせして
はてな側に僕だよ、っていうことを認証、そしてサービス利用の許可(認可)していたわけだよね。
これまでの
はてなのサービス→はてなの会員管理システムで認証する、というお決まりのやり方を
はてなのサービス→「特定ではないIDプロバイダによって認証」もOKにしちゃう!
っていうのがOpenIDの基本的な考えだと思ってるよ。
つまり、はてなに対してみんな大好きなmixi(渋谷区)のゆるふわIDパスワードでOpenID認証しちゃえ!ていう感じ。
OpenIDと呼ばれるもののコアなところって、この自分じゃない余所様でログインをさせるにあたっての
通信の決まり・振る舞い方についての仕組みとかのことなんだね。
認証機能の委譲、なんて難しい言葉で言われてもバカな僕にはわかんなかったから、とりあえずこんな感じで整理してみたよ。
でもね。増田自身がはてなの立場になって考えてみるとこう思うよきっと。
他所のプロバイダさんに認証をお願いしたら、、、
「コノ人確カニ○○○君!ザッツヒム!イッツOK!!」ていう怪しげな応答があったとしてもさ
「うちは京都のサービスさかいに、妙ちくりんな英語まじりのプロバイダさんの言うことなんか信用できまへんなー」
て自然と思ってしまうよきっと。これがひいてはOpenIDプロバイダの評判問題ってやつにつながる話だね。
あと、じゃあOpenIDプロバイダの認証結果は信じることにしたとしてでも今度は
「まーmixiさんところが認証OKてゆなら確実でっしゃろう?遠いところからよくきはりました。
どれ、アンタうちでもサービス使わせてやるさかい...あれれ?君、うちでいうところのid:誰くんでしたっけ?」
てなっちゃうねーやっぱり。。これが認証と認可(属性情報交換)に関わる問題てやつだよ。
うーん、ちょっと自分自身にとってもムツカシくなってきたなぁ。もう少しわかりやすく書くね。
上の話ははてな子ちゃんが自分の会員管理システムでログインさせない(外の会員管理システムでログインする)ことにより、
自社のサービス提供では当たり前にできていたことができない、という問題が2つ出てきたねーということだよね。
1. 「あなた(Openプロバイダ)の認証、あ、あたし。信じていいの?ゴクリ・・・」
という信頼関係について。
2. 「あなた(エンドユーザ)は彼(OpenIDプロバイダ)に認められた人だから、アタシも、が、がんばって信じる!…けど、○○○君(エンドユーザ)のことをもっと知る必要があるの。。。」
という(エンドユーザの)認可・(OpenIDプロバイダからの)属性情報の受入(交換)について。
うー、あれ?
はてなスターではこの2つの問題をどうしているの?って思う人は多いよね。
たぶんはてなスターがOpenID対応しているっていうのを聞いたことがあっても、実際にやったことある人は少数派じゃないかなまだ。。
じゃあこっからははてなスターを例にとって説明するよ!
詳しくは下のリンクの説明通りなんだけど、
http://www.hatena.ne.jp/info/openid
今回増田が問題としている2つについてはてなスターの機能はどーなってるの?ていうのを整理すると
1.「OpenIDプロバイダとの信頼関係について」=「フレンドプロバイダのみ認証OK!」(いわゆるホワイトリスト)
2.「(エンドユーザ)認可・(OPとの)属性情報交換」=OpenIDのユーザ名でスターがつく
という対応をしているみたい。
※ちなみにこの記事書くにあたって増田ははじめてOpenID経由ででスターつけてみたよ!!
つまり、
1.の信頼関係については、Livedoorなど数社のOpenIDプロバイダのみを受入OKにしているし、
2.の属性情報については、OpenID認証を行う際に必要なOpenIDプロバイダ側の「ユーザ名@OP名」でスターがつくだけ
→なので属性情報交換などはほぼゼロだよね、って感じだったよ。
1.は、
「なーんだ。Open何とか言っておきながら内輪でのID連携かよ。うちも一応OpenIDプロバイダたててんだよ?え?無理?うちみたいなチンケなプロバイダは無視ですかそーですか」
みたいな中小企業のボヤキが聞こえてくるくらい全然Openじゃなくすることで一方での
はてな子ちゃんにとっての問題=「あなた(Openプロバイダ)の認証、あ、あたし。信じていいの?ゴクリ・・・」問題を回避しているということになるよね。
2.についてははてなスターはほぼガン無視を決め込んでいるのが今回よくわかりました!
今回増田がためしにOpenID認証経由でスターをつけてみたんだけど、
あのー、、増田も一応こうして増田をやっているので一応はてな市民であって、「あいでぃー:xxx」みたいな立場ではあるじゃないですか。
なのに、LivedoorのIDでスターつけちゃったら「あいでぃー:xxx」でスターつけたことにならない><!(※)ので、
うーん、、ちょっとこれは深刻な機能不足だなーと思った次第ですー。いや?いいのかこれでOpenIDとしては。微妙だなぁ・・
(※)
だって、増田のidhttp://s.hatena.ne.jp/xxx/starsでスターが反映されない
あと<増田のLivedooeのアカウント名>@livedoor のスターのカウント(上のhatena/user/starsに相当するページね)はどこにいったのだろう??
でもさぁ、
はてな子ちゃんの立場はそれはそれでよくわかるのよね。
いまいまのOpenIDのセキュリティレベルでは、どこの馬の骨ともわからん奴にあなたのことについて
※ほんとは、はてなの「あいでぃー:xxx」とLivedoorのidがSocialに結びついてくれて、
自動的にhatenaのidでスターをAddしたことになればいいんだけどねー。でもそれじゃあはてなIDでログインしろってことと変わらんかー。
とも思うし難しいなぁこの辺。
こういう問題があるOpenID界隈では、でもこれらの問題について色々知恵を出し合って解決しようとしている
人もいるみたい。サイボウズのzigorouさんとか、他にもいっぱいいらっしゃるけど、皆さんすごいがんばってるみたい!すごい!
増田個人は、
1.については各OpenIDプロバイダとIDを利用するサービス側(Ryling Party)それぞれのホワイトリストが
Socialに連携/公開されてグラフになってエンドユーザが利用できる・できないの仕組みになるのがいいのかなー、
と思っていたりするよ。DNSみたいな公開されて相互利用できるよな仕組みがあればいいのかなー。
2.については属性情報の仕組みとしてはAXとかsregとかあるけど、要は使い方でリバティ・アライアンスの頃からしきりと言われているらしい
「串刺しにした」サービスの連携のためにどう属性情報を流通させるのか?SSO連携が肝だよねー。とか。
また属性情報流通させるにあたってのその情報粒度は?っていう話を詰めなきゃいけないんだろうなー、というレベルでぼんやり中です。
もう少し↑について知識・考えついてきたら、またまとめてみたいです。じゃあまたね!!
Total | 3601
demo
Lovd By Less - A Rails-Based Open Source Social Networking System
profiles, user following / friending,
messaging,
user blogs,
and Flickr and YouTube integration.
All of this checks in at an amazing 3,601 lines of code, including tests!
Convention over Configuration 設定より規約
Convention over configuration - Wikipedia, the free encyclopedia
Ruby on Rails 15分で Blog(ブログ) を作成する - Creating a Weblog in 15 minutes
Railsでブログを作ろう!(Creating a Weblog in 15 minutes) - hp12c Screencasts of Ruby on Rails
Ruby on Railsで一行掲示板を作成する (山本隆の開発日誌)
頭にタオルを巻いて、白い生地にワッペンがついた帽子を上から被って、あご髭がDQNでダンディーな彼氏は推定20歳。
一方妹は今年春に短大入学を迎える18歳。髪の毛は程よく額から天辺まで30センチ(推定)はあろうかという明るい茶色の巻き巻き頭。人工的に3センチ(推定)ほど延ばした睫毛と人工的に濠を巡らした卑小なお目目は、最早人のモノではない。
彼氏『こんちゃーっす。"妹"さんと仲良くさせてもらってますっ。』
顎を前に出して、帽子も脱がずに、お前より(おそらく)5年も長く生きているお兄様に向かって"こんちゃーっす"とは何事だ。おまえが俗にいうゆとり世代の日本代表か。横柄にもほどがある。
起きっぱなしのパジャマで食卓に座って朝ご飯のロールケーキを頬張っていた俺に母から怒号が飛ぶ。
母『あんた。働きもせんと、昼まで寝よってからに…。春の決算で不良債権処理されたなかったら、二人にお茶いれてあげるとか、なんもせーへんねやったら、二階の自分の部屋戻っとり!』
母よ、俺は何か、焦げ付いた債権か。もうちょっと暖かくなったら本気出すゆうてんのがわからんのか。
裾を引きずって階段を上る背後で、妹の楽しそうな声が聞こえる。フライパンの上で母が焼くベーコンのはじける音が聞こえる。二年前から壊れっぱなしの風呂場の外窓から風の抜ける音が聞こえる。二言目には"マヂッスか"と母の言うことに相づちを入れる彼氏の声が聞こえる。
妹よ、そんな彼氏の何処がいいのだ。
歳を取って疎遠になってきたが、今でもかわいい妹だ。このあいだも、郵便受けに入っていた俺宛のAmazonからの箱を勝手に開けて、中に入っていた限定版らきすたDVDを手に取って俺の目の前に差し出して、
妹『おい、秋葉系。こんなDVDに何千円も出して、アホちゃうか。絵の女にうつつぬかさんと、現実見んかい変態。』
と、かわいい声で俺を罵ってくれたじゃないか。
妹よ。ピンクでふりふりのついたあんなにかわいいパンツをもっている前が、ダイソー(推定)で買ったタオルを頭に巻いている男とつき合っているなんて…。
部屋で二度寝していると、妹とDQNな彼氏が俺の隣の妹の部屋に戻ってきた。笑い声の混じった、恋人然とした会話が聞こえてくる。
妹『"彼氏"君絶対…私そんなんゆーてへん……だから…』
彼氏『この前難波行った時…横の席でお前が寝ぼけとったから…』
しばらくすると、耳をそばだてていても聞こえにくいぐらいに二人の声が小さくなっていった。
妹『あかんって、そんなとこさわらんといて…。』
ぅぉぃ、妹。そんなとこってどんなとこやねん。あかんってなにがあかんねん。あと、開けたばっかりのティッシュの箱どこやねん。
妹『あっ…あっ…あっ…。"彼氏"君…やさしく…』
聞いた事の無いような妹の声が聞こえた。壁越しに、女の吐息が聞こえた。
興奮すると同時に、底知れない、胸を締め付けるような寂しさを感じた。
彼氏『かわいいやん。ご主人様、て素直なとこが。』
どうやら、コスプレの話しのようだ。妹が、巻き髪で、ツインテールで、男のナニをナニして如何して。けしからん。
興奮しすぎた俺は、盗み聞きの体制を整えるために足を一度組み替えようとした直後、壁にど頭をぶつけた。ゴン、と音がした。
彼氏『何今の?』
妹『わからへん…。気持ち悪いなぁ。でも、ここやと家族おるから落ち着かへんし、駅前のラブホ行かへん?』
俺の大失態で二人のラブゲームの第一セットは終了した。あぁ妹よ。おそらく、今の男の他にも何人にも抱かれている妹よ。お兄ちゃん、下着だけじゃ寂しいです。
そして昨日、友人宅で"徹夜でモンハンナイト!"の準備のために洗面所で身支度をしていた俺に母からまたもや怒号が。
母『"増田"!もう12時やから、"妹"おこして!』
Don't openと書かれた札を横目に、おもむろにドアを開けて、妹に"朝やぞ"と声を掛けようとしたら、ベッドの奥にある開いたままのクローゼットが目に飛び込んだ。真っ先に目についたのは、他の服から少し離れたところでハンガーにかかっている白のふりふりがついた、所謂メイドさんのコスチューム。
"お前その服…"と声を掛けようとした瞬間、茶色い髪をかき乱して妹が
妹『な、何勝手に入ってきてんねん。あ、そ、その服は、あ、あんたのために買ったんとちゃうんやから!か、感違いすんなアホ兄貴!!』
うーん、マンダム。
http://anond.hatelabo.jp/20080301083224
File.read("hoge.txt").display
は、OK。
しかし、
あのさあ。こういうコードまき散らすのやめないか?
初心者が勘違いするから、せめて、closeかブロック使えっての。
動くからいいとかいってんじゃねーよ。
だっておwwww
#AA記法使ったら化けた