「URI」を含む日記 RSS

はてなキーワード: URIとは

2008-12-01

糞FC2BLOGは氏ね

callback_FC2Blog([
<!--topentry-->{
	"title":"<%topentry_title>",
	"date":"<%topentry_year>-<%topentry_month>-<%topentry_day> <%topentry_hour>:<%topentry_minute>:<%topentry_second&gt;",
	"uri":"<%topentry_link>"
},<!--/topentry-->
]);
//<%ad> <%ad2>

っていうテンプレート書いてプレビューJSON出力ウッホホーイと思ったら何故かプレビューだとデフォテンプレが出てくる!

何考えてんだFC2BLOGは

2008-11-25

トップページなんかからリンクをたどったか、RSSリーダーから来たかで

URIが違うことってよくあるじゃない。

たとえばロイターの記事をブックマークするとして

http://jp.reuters.com/article/topNews/idJPJAPAN-35087520081125

http://jp.reuters.com/article/topNews/idJPJAPAN-35087520081125?feedType=RSS&feedName=topNews

この二つの記事って同じ記事なんだけど、そのままブックマークするとそれぞれ別のブクマなっちゃうんだよね。

コメントが分散しちゃうからはてな側で勝手マージしてくれるとうれしいんだけど。

2008-10-18

real street angels から mechanize を使って動画を取ってきてEmacsで見てみるよ

せっかく書いたから匿名でのせてみるよ

使い方は

  • 動画を取ってきたいよ
    • config.yamlユーザとかを設定するよ
    • ids.txt に取ってきたいIDを書くよ
    • sangels.bat を実行するよ
  • Emacs動画を見たいよ
    • sangels.el を load するよ
    • M-x sangels だよ

必要なものを gem で取ってくるにはこうすればいいよ

  • gem install -r log4r
  • gem install -r -v 0.6 hpricot
  • gem install -r mechanize

長すぎてelispが消えたから続きがあるよ

sangels.bat - 起動用バッチファイル

@echo off
setlocal
set WD=%~dp0
cd /d %WD%

ruby get_movies.rb
ruby get_images.rb
ruby create_m3u.rb

ruby

config.yaml - 設定ファイル
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"
get_movies.rb
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
get_images.rb
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
create_m3u.rb
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)}"
    }
  }
}
sangels.rb
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 &amp;&amp; !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(&amp;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
util.rb
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

2008-08-22

http://anond.hatelabo.jp/20080821224627

おー、使ってくれてる奇特な奴がいるとはうれしいねぇ。

感謝の気持ちを込めて実はアレから少しバージョンアップしてるのでそれを公開しますよ!

改善点は2点。

終了判定の変更

で、以前取得したことのある画像にぶつかるとそこでプログラム終了。

これを修正。これ微妙なんだよね。4u.pl動かしてる最中画像が投稿されるとページングしたときに既に取得した画像にぶつかってしまって止まっちゃうんだよねー。

なので、最後に取得した画像にぶつかったらプログラム終了するように変更した。

画像が無い場合の挙動

元のURL画像削除されてしまって取得できなかった場合に、今までは.plainとかいうダミーデータが保存されてしまっていたが、それを4Uの画像を取得するように変更。

これで元画像が消えてても一応4Uから取得できるので取りこぼしが無くてヤッターって感じだねー。

でわでわコードは以下。


#!/usr/local/bin/perl -w
use strict;
use warnings;

use Web::Scraper;
use URI;
use Perl6::Say;
use MIME::Type;
use LWP::UserAgent;
use Path::Class;
use Data::Dumper;sub p { print Data::Dumper::Dumper(@_) };

my $page = shift || 10000;
unless ( $page =~ /^\d+$/ ) {
    die 'perl 4u.pl [page as int]';
}

my @files = dir('./img/')->children;
my $cache = {};
my $end_file = { mtime => 0 , file => '' };
for my $file (@files) {
    if ( $file->basename =~ /^(.+)\.(.+)$/ ) {
        $cache->{$1} = $2;
    }
    if ( $end_file->{mtime} < $file->stat->mtime ) {
        $end_file->{mtime} = $file->stat->mtime;
        $end_file->{file} = $file;
    }
}

for my $i (1..$page) {
    
    my $url = sprintf 'http://4u.straightline.jp/?page=%s' , $i;
    
    say "request url>".$url;
    
    my $tmp = scraper {
        process 'ul.entry-list>li>div.entry-body>div.entry-photo>a', 'link[]' => '@href';
        process 'ul.entry-list>li>div.entry-footer>div.wrapper-entry-description>div.entry-description>p.entry-img-src', 'img[]' => 'TEXT';
        result 'link','img';
    }->scrape(URI->new($url));
    
    my $links = $tmp->{link};
    my $imgs  = $tmp->{img};
    
    if ( ref $links ne 'ARRAY' ) {
        say "end program.";
        exit;
    }
    
    for my $link (@$links) {
        $link =~ m{/([^/]+)$};
        my $sesid = $1;
        
        if ( $end_file->{file} &amp;&amp; $end_file->{file}->basename =~ /^$sesid\./ ) {
            say "file exsits end program >".$sesid;
            exit;
        }
        
        if ( $cache->{$sesid} ) {
            say "file exsits next >".$sesid;
            next;
        }
        
        sleep 1;
        
        my $image_url = shift @$imgs || next;
        $image_url = 'http://'.$image_url;
        
        say "get image url    >".$image_url;
        
        my $ua = LWP::UserAgent->new;
        my $req = HTTP::Request->new(GET => $image_url);
        my $res = $ua->request($req);
        my $content = $res->content;
        my $content_type = $res->headers->header('content-type');
        my $ext = MIME::Type->new( type => $content_type )->subType || 'bin';
        
        if ( $ext eq 'plain' ) {
            say "not found image  >".$image_url;
            # 本家画像が消えてたら4Uの奴を保存する。
            my $image_url = 'http://www.straightline.jp/html/found/static/upload/l/l_'.$sesid.'.jpg';
            say "get 4u image url >".$image_url;
            my $req = HTTP::Request->new(GET => $image_url);
            my $res = $ua->request($req);
            $content = $res->content;
            $ext = 'jpeg';
        }
        
        my $write_path = './img/'.$sesid.'.'.$ext;
        
        open my $FH, '>', $write_path;
        binmode $FH;
        print $FH $content;
        close $FH;
        
        say "write image      >".$write_path;
    }
}

言わずもかなコードカオスなのでよろしゅうたのんます。

2008-07-07

もん毛スター for firefox

動作未確認。すんげー冗談半分。

// Hatena Monge Star user script
// 2008-07-07
// by masda. (http://anond.hatelabo.jp/20080707043247)

// ==UserScript==
// @name           Hatena Monge Star
// @namespace      http://anond.hatelabo.jp/20080707043247
// @description    Hatena Monge Star
// @include        http://b.hatena.ne.jp/entry/*
// @version        0.3.1
// ==/UserScript==

// deriving from [http://d.hatena.ne.jp/Hamachiya2/20080707/HatenaBlackStar2] ver Firefox
//               [http://f.hatena.ne.jp/hatenacinnamon/20070109001332]
// Thx! and CUTE!


location.href = 'javascript:(' + function() { (function (w) {

	if (typeof(w.Ten) == 'undefined') {
		return;
	}

	HatenaBookmarkMongeStar = new Ten.Class({
		initialize: function(li, entryTitle) {
			var comment = '';
			var tags    = '';
			var commentSpans = Ten.DOM.getElementsByTagAndClassName('span', 'comment', li);
			if (commentSpans.length > 0) {
				comment = Ten.DOM.scrapeText(commentSpans[0]);
			}

	        var tagsSpans = Ten.DOM.getElementsByTagAndClassName('span', 'user-tag', li);
			if (tagsSpans.length > 0) {
				$A(tagsSpans[0].getElementsByTagName('a')).each(function(a) {
					tags += '[' + Ten.DOM.scrapeText(a)+ ']';
				});
			}

			var title = tags + comment;
			if (title.length == 0) {
				var name = Ten.DOM.scrapeText(li.getElementsByTagName('a')[1]);
				title = name + 'のブックマーク';
	        }

			// this.uri   = 'http://b.hatena.ne.jp/keyword/' + li.getElementsByTagName('a')[1].href;
			var u = li.getElementsByTagName('a')[1].href;

			if (u.indexOf('#') == -1) {
				this.uri = u + '#_HatenaMongeStar';
			} else {
				this.uri = u + '_HatenaMongeStar';
			}

			this.title = title + ' - ' + entryTitle;

			this.comment_container = Hatena.Star.EntryLoader.createCommentContainer();
			var target = commentSpans[0] || li;
			target.appendChild(this.comment_container);

			this.star_container = Hatena.Star.EntryLoader.createStarContainer();
			this.star_container.className = 'hatena-star-star-container MongeStarContainer';
			target.appendChild(this.star_container);
		}
	});


	var tryCount = 0;
	var tryMax = 300;
	function waitForHatenaStar() {
//		if (Hatena.Star.EntryLoader.loaded) {
//			Hatena.Star.EntryLoader.loaded = false;
		var s = document.getElementsByClassName('hatena-star-add-button');
		if (s.length) {

			Hatena.Star.EntryLoader.loaded = false;

			Hatena.Star.EntryLoader.loadEntries = function() {
				var entries = [];
				var title = Ten.DOM.scrapeText(Ten.DOM.getElementsByTagAndClassName('span', 'title', document.body)[0]);
				var ul = document.getElementById('bookmarked_user');
				if (ul) {
					$A(ul.getElementsByTagName('li')).each(function(li) {
						if (li.className != 'more') {
							entries.push(new HatenaBookmarkMongeStar(li, title));
						}
					});
				}
				return entries;
			}
			new Hatena.Star.EntryLoader();

		} else {
			if (++tryCount > tryMax) {
				setTimeout(waitForHatenaStar, 400);
			}
		}
	}

	setTimeout(waitForHatenaStar, 500);

})(window); }.toString() + ')()';



GM_addStyle(<><![CDATA[

	.MongeStarContainer {
		margin-left: 4px;
	}

	.MongeStarContainer .hatena-star-add-button {
		background-color: #fc6 ! important;
	}

	.MongeStarContainer a {
		text-decoration: none ! important;
		color: #f80 ! important;
		font-size: 10px;
		position: relative;
	}

	.MongeStarContainer a:before {
		content: '毛';
		font-size:small;
	}

	.MongeStarContainer a .hatena-star-star {
		filter: alpha(opacity=00);
		-moz-opacity:0.00;
		opacity:0.00;

		position: absolute;
		top: 0;
		left: 0;
	}

	.MongeStarContainer .hatena-star-inner-count {
		color: #f90 ! important;
	}

]]></>);

動いたらいいな-

2008-07-06

http://anond.hatelabo.jp/20080706032434

残念ながら対処方法は無い。

しいて言えば「なんか見つけたらすぐローカル保存」って習慣が身に付くくらいだ。

もっとも、はてブからたどっていったのなら、そのドキュメントはそのURIに無ければ意味が無い。

であれば、それがインターネットインターネットたるゆえんだ、としか言いようがないなあ。

2008-06-27

ほんとに「蟹工船」って読まれてるの?

いろんな報道で売り上げが5倍だとか何だとか言われてるんだが、その割に話題にしている人間を全く見かけないのはどういうわけだ?

というか、ワーキングプアと呼ばれる連中にあの手の文学作品を読む時間精神的余裕があるとは思えんのだが。

Wikpediaの項目によると、読売新聞5/2付の記事がもっとも古いらしく、その3ヶ月前の朝日新聞には、売れているという記述は無いものの作者の小林多喜二を取り上げた記事存在している。

そして5月中旬から今に至るまで、他の新聞社メディアもこれに追随するように「蟹工船が売れている=ワーキングプア格差社会」の論調が見られるようになっているわけだが、その根幹になる「若者蟹工船流行中」という事象がちっとも体感できないので、どうも違和感を感じざるを得ないんだよな。

もし誰か知っているのなら、格差の底辺に居るような人達が、上記の5月以前に蟹工船を絶賛しているようなURIを教えて欲しいんだが…。

まあ、そういう人達ネットにすら繋げられないのかも知れんけど。

■■追加■■

http://www.yomiuri.co.jp/book/news/20080502bk02.htm

プロレタリア文学を代表する小林多喜二(1903??1933)の「蟹工船(かにこうせん)・党生活者」(新潮文庫)が、今年に入って“古典”としては異例の2万7000部を増刷、例年の5倍の勢いで売れている。過酷な労働現場を描く昭和初期の名作が、「ワーキングプア」が社会問題となる平成若者を中心に読まれている。

2万7千部ねえ…。それって平成若者の何パーセントなんだろ…。

■■さらに追加■■

http://www.jcp.or.jp/akahata/aik07/2008-03-16/2008031614_02_0.html

青年トークで「蟹工船エッセーコンテストで大賞を受賞した山口さなえさん(26)は、不当解雇され労働組合も助けてくれなかった経験から「私たち世代が絶望にならざるを得ない構造を、現代の蟹工船として書きたかった」と発言。長く派遣で働いた同準大賞の狗又(いぬまた)ユミカさん(34)は「『蟹工船』に共感するプレカリアート(不安定労働者)を代表して言いたい。『私たちをもっといい船に乗せろ』」と叫びました。

まあ、自分の事をプレカリアートなんて名付けてる時点で色々と染まってる人だとは思うが。

赤旗Webサイトで「蟹工船」で検索をかけると、今年初頭(1??2月)頃に色々とプッシュしている様子が伺える(それ以前となると2005年2002年と散発的に取り上げられているだけ)。こんな記事があった。

http://www.jcp.or.jp/akahata/aik07/2008-02-27/2008022701_03_0.html

デビュー作「一九二八年三月十五日」などで「貧困を生み出す社会のしくみに目を向け、これを打破する闘争を主題にしたところに多喜二の最初の大きな飛躍があった」と不破さん。とくに「当時の非正規の臨時工を描いた『蟹工船』がいま若者に読まれ、たたかいの力になっていることに多喜二が喜ぶだろう」と話すと、「ホーッ」と感嘆の声ももれました。

少なくともこの時点で、不破の脳内では若者蟹工船を読んでいるという事になっていたらしい。赤旗以外のそっち系も調べてみるかな。

■■もっと追加■■

記事の発端は、5/2の読売の記事だと思われるわけで、

今年に入って“古典”としては異例の2万7000部を増刷、例年の5倍の勢いで売れている

これが本当に記事にするような事象なのかどうかを検証すべきなのかも知れんね。特に近代文学なんて元の販売スケールが大きくないんだから、ちょっとした事で数倍に跳ね上がったり数分の一に激減したりというのも珍しくないような気がするし。

2万7千部なんて、どこかの大手書店の営業がプッシュするとか、どこかの活動家講演会で取り上げたりする程度で軽く到達できそうな数字に見える。あるある大辞典納豆が売り場から瞬殺されるようなご時世だしな。

それに元の記事では「5倍のペースで売れている」としか書かれてないのに、いつの間にか購入者の大半が若者だという事になってしまっているのも気になる。購入者のプロファイルをどうやって知ったんだろ。中高年をメディアで煽ってちょっと騙くらかすだけでも数万部は軽くいけると思うんだが。赤旗日曜版だって100万部いってるんだし。

ekken氏からブコメもらったよ

ブックマークしたと、はてなダイアリーで書く人を鬱陶しく感じると書いた増田だけど、id:ekken氏からブックマークコメントもらったよ!

http://b.hatena.ne.jp/entry/http://anond.hatelabo.jp/20080626135910

コメントによると、http://ekken.blog1.fc2.com/blog-entry-836.htmlで、同じような感想を先に書かれている。

鬱陶しく感じるのは、自分だけじゃなかったんだ。

種明かしではないけど、自分のはてなブックマークを、自分のはてなダイアリー転載してる人って、そういうことができるWebサービスを使って、自動転載してるのだと思う。

あまり真似してほしくないから、URI出さないほうがいいとも思ったけど、MakeYourDayというもの。

http://worris3.sakura.ne.jp/makeyourday/

自分は使ってないので、どういう動作をしているかは分からないけど、twitterfotolifeログだけ転載するようにして、はてブログ転載しないようなオプションがあったらいいのに。そしてユーザーは、そのオプションを使ってほしいなあ。

2008-06-05

スラッシュドットモデレーションシステムはてなブックマークに応用することへの懸念

スラッシュドットのモデレートって、誰がやってんだろうね。システムは全然知らんけど。

モデレーションって、トピックスによっては、偏ってると思えるのね。俺には。

俺は、Winny金子氏は有罪だと思っているだけど、とあるスラッシュドットWinny関連トピックスを見た時点では、金子氏擁護には「素晴らしい洞察」、金子氏非難には「荒らし」という、実に分かりやすいモデレーションだったです(具体的なトピックスのURIは、今はもう分からないけど)。それを見て以来、モデレーションシステムに信頼を置いてないです。つか、スラッシュドットを見なくなった。所詮、ナードという偏った人たちのためのコミュニティだなと。

だから、新はてなブックマークに、スラッシュドットモデレーションシステムを導入すればいいじゃないというアイデアには懸念を表明したい。声の小さいほうの意見モデレーションシステムによって埋没されてしまうことを。

はてなブックマークによって、マスメディア以外の意見があることを発見することができたことが利点だと、はてなブックマーク開発者id:naoya氏が語っていたと思う。ascii.jpでのインタビューだったかな。

でも、モデレータの意図により、マスコミに対するカウンターとしてのネットメディアばかりの意見ばかりが目立つようにされ、それ以外の意見は埋もれるようなモデレーションがされるなら、むしろ意見の多様性は損なわれる。

それが俺は嫌だ。

俺は、はてなブックマークで、著作権関係タグを追っかけて見てるけど、ネット意見は、著作権強化に反対の意見ばかりですよ。著作権の権利によって使用に制限がかけられる消費者としては、著作権反対は分かる。

けど、そんなコメントばっかりというのもねえ。

実はもう、コメント一覧から読み取れる空気で、著作権強化反対に異を唱えるコメントを付けるのには気後れするですよ。

2008-04-23

4Uの画像が美しすぎてPerlプログラム組んでみた

4Uって知ってるかい?

http://4u.straightline.jp/

世界中の美女画像を皆でシェアするソーシャルイメージブックマークサービス

とのことさ。それはほんともう美しい画像が満載で毎日見てても飽きないわけさ。

そこでローカル画像を保存しようと思い、ちょっくら実装してみた。


#!/usr/local/bin/perl -w

use strict;
use warnings;
use Web::Scraper;
use LWP::UserAgent; 
use Perl6::Say;
use MIME::Type;
use URI;
use Data::Dumper; sub p { print Data::Dumper::Dumper(@_) };

my $page = shift || 1000;
unless ( $page =~ /^\d+$/ ) {
    die 'perl 4u.pl [page as int]';
}

for my $i (1..$page) {
    
    my $url = sprintf 'http://4u.straightline.jp/?page=%s' , $i;
    
    say "request url>".$url;
    
    my $tmp = scraper {
        process 'ul.entry-list>li>div.entry-body>div.entry-photo>a', 'link[]' => '@href';
        process 'ul.entry-list>li>div.entry-footer>div.wrapper-entry-description>div.entry-description>p.entry-img-src', 'img[]' => 'TEXT';
        result 'link','img';
    }->scrape( URI->new($url) );
    
    my $links = $tmp->{link};
    my $imgs  = $tmp->{img};
    
    if ( ref $links ne 'ARRAY' ) {
        say "end program.";
        exit;
    }
    
    for my $link (@$links) {
        $link =~ m{/([^/]+)$};
        my $sesid = $1;
        
        sleep 1;
        
        my $image_url = shift @$imgs || next;
        $image_url = 'http://'.$image_url;
        
        say "get image url >".$image_url;
        
        my $ua = LWP::UserAgent->new;
        my $req = HTTP::Request->new(GET => $image_url);
        my $res = $ua->request($req);
        my $content = $res->content;
        my $content_type = $res->headers->header('content-type');
        my $ext = MIME::Type->new( type => $content_type )->subType || 'bin';
        
        my $write_path = './img/'.$sesid.'.'.$ext;
        
        if ( -f $write_path ) {
            say "file exsits end program >".$write_path;
            exit;
        }
        
        open my $FH, '>', $write_path;
        binmode $FH;
        print $FH $content;
        close $FH;
        
        say "write image >".$write_path;
    }
}

それPlaggerでで・・・」モウココウハザン!ドスッ!

貴様、うるせーんだよ。

今回俺としてはWeb::Scraper使いたかったので自力実装してみますた

使い方を試しながらだったので製作時間2時間くらいかかたお。次からはもっと短縮できそうだ。

まーがーっと書いた後に整理してないからコード自体はかなり汚ねぇのでご了承を。ふへ。

とりあえず4u.plを叩くとカレントディレクトリのimgフォルダに取得した画像を次々書き込んでいく。

ちゃんと次のページにも遷移しながらどんどんがんがん書き込んでいくのさ。

で、以前取得したことのある画像にぶつかるとそこでプログラム終了。

ちゅーかなんつってもWeb::Scraperってばスゲエよな。俺のクリオアがびんびん反応するぜ。え?クオリアだって?うっせぇ野暮なこと言うなよ。

プログラ増田のあなぐら

2008-03-18

http://anond.hatelabo.jp/20080318123232

またクリックしたらはてなRSSがでてきた…。

もしかしてさ、channel要素のrdf:aboutにRSSURIを記述してるから?

ここらへんの取り扱い仕様グーグルさまの中で変わったんじゃね?

いま適当に他の大手みてみたけど、livedoorとか普通コンテンツURL書いてるし。

うほFC2フィードまでデザインしてるのか……。

2008-02-14

小学生鉛筆を使わせていた理由

anond:20080213204940

これは小学校勤務の長かった(現在は違う)友人から聞いたんだけど、鉛筆というのは、ペンタイプの道具を使う上で最初に学ぶものとして非常に合理的なんだそうな。

おおよそ、どの鉛筆もそのグリップの太さは一定で、長期的に「持ち方」を習得する上では優れている。コロコロと太さや形状が変わる可能性のあるシャープペンだと、基本的な持ち方へ手が慣れてくれない。

また、鉛筆を削ることによって筆の長短が変わるのも、様々な長さや重心に対応できる持ち方が習得できるので良い。それも急激な変化ではなく、基本は削った分だけだ。買い換えればいきなり長くなるのだけど。

そして、使ううちに黒鉛が削れ、太さや角度が変わっていくのも、ペン先への対応力に関わってくる。

このように、変化しないグリップベースに、変化する長さや重心や太さや角度に対応していく理想的な経験が、鉛筆では可能となる。

鉛筆削りの精神性を唱える人もいるようだが、彼によると、小学生鉛筆削りで精神的な刺激を受ける年齢ではない、という。

ただ、持ち方と鉛筆関係については研究データがあるわけでもなく、精神的な刺激を受容できない年齢であるというのも経験による主観のようだ。

しかし、とても興味深い話だったので記憶に残っている。

私個人はシャープペンシルが悪いと思わないが、若い人間の字が汚くなってきている、ということも感じているので、小学生への導入には疑問もある。

追記

おもわぬ数のブクマがついていて、人聞きの話だから申し訳なく思いつつ本ブログで書かなかったことを後悔。

id:yumizouさんが先行研究の有無について指摘してくださったので掲載しておきます。

「持ち方と鉛筆関係については研究データがあるわけでもなく」←これは違う。学生時代,筆記用具の形状と持ち方と書字の関係についてレポートを書いたけど,ちゃんと先行研究あった。

なるほど。研究はあるようです。ありがとうございました。

再追記

id:bsheepさんがブコメで以下のURIを提示しておられました。

押木 研究室 書写 文字 手書き 書くこと 書道 書 外部公開資料

ほとんど目を通してませんが、WEBで読める先行研究のまとめになっているようです。

2008-02-02

Friio - フリーオヤフオクで売ったんだが

違反申告大杉wwwwwwww

夜中でも容赦なくメールバンバンきてた。

それにしても、転売ヤーさんいっぱい居ますね。

今は第4弾出荷品がいっぱい出品されてるので、だいぶ相場は落ちてますが、それでもまだ倍になる。

とりあえず、私はもう売り抜けたので関係ありませんのでw、

誰が作ったか知らないけど違反申告の方が使えるページを紹介します。

http://jsn-home.net/~friio/search.php

Yahoo!ログインした状態で使ってください。ワンクリック違反申告できます。

夜中の3時くらいに使ってください。出品者のケータイメールアドレスメールが送れますw

PCには専用のアドレスから送られてくるので弾けるのですが、ケータイはなぜか落札通知などと同じアドレスからくるのでdenyできません。

なお、ドライバダウンロードする際には購入者のメールアドレスが必要なのですが、教えなくてもDLさせることができます。

とあります。

メールアドレスblogで検索して探す方法ですが、「フリーオ 買った」とかで検索すればいくつか見つかりますので。終わり。

簡単なスクリプトDLさせる方法は、以下のようなURIリダイレクトするようなスクリプトを書けばいいです。

http://mailaddress:friio@www.friio.com/download/secure/friio-latest.zip

向こう側の認証機構が単純なので、ユーザー名とパスワードURIに含めてリクエストさせればOKです。

zipでくれ!みたいに、Wgetを使い、Cronで毎日回して(blog検索で見つけたメールアドレスを使ってw)、

更新があれば保存しておき、ユーザーにはそれをDLさせるとかすればリクエストヘッダには何も情報出ませんし。

Yahoo!なら受け取り後決済を使うと個人情報は一切向こうに渡らないので、完全隠密行動が可能になります。

警察捜査入ったら一発で終わるとは思いますがw)

なお、フリーオを使った感想ですが、30分もののアニメなら、最短で放送終了から45分くらいでニコニコうpできます。

AviUtilに読ませるために変換するのに5分。エンコに30分ってとこです。後はニコニコエンコード待ち。

まぁ使いたい人はがんばって公式サイトから買いましょう。俺が言うのもおかしいですがw

2008-01-09

http://anond.hatelabo.jp/20080109131604

URIURLなので別に間違ってることかいてるわけではないと思うが

最近はてなURLURIって書く奴多くね?

ゆとり世代ってLとIの違いすらわからないんだなw

2008-01-03

これから半年ROMろうか

匿名ダイアリータイトルに自分のエントリーアドレスを、そして同時に別エントリートラックバックを打ってるように見えて、どっちも出し方が分かんなくてさっぱりワカンネと思ってた。

タイトル欄って自分のエントリへのリンクじゃないのな。タイトル欄にトラックバック先のURIを書いてただけなのか。わかりにく。

2007-12-29

ブログ映画やら音楽やらアニメやらのYouTubeニコニコURI張るやつってなんなの?

頭大丈夫なの?

2007-12-21

RE:はてブ登録画面が重い件

http://anond.hatelabo.jp/20070504055158

うちも重いです。

前に、はてなでも質問していたのですが、結局、

こちらもタグを減らすという結論に達しました。

Sleipnir2を使っているのですが、JavaScriptがかなり重くなるようです。

うちは、1000近くあるタグを、数か月かけて、なんとか400近くに減らしました。

それで、ブラウザが、固まる時間を5秒くらいになんとか抑えられました。

それでも、重いですね。

スレッドの人も言っておられましたが、

タグ一覧を切れが、速くなりますが、そうすると、オススメタグが表示されないという……。

おいおい

はてなの人は、Firefoxでしか動作確認してないんだろうと思います。

重さが原因で、他のブックマークサービスに移ろうとしたのですが、

ソフトで、バックアップとろうにも今度は、サーバーが重くて、断念 orz

ちなみに、mixiも重いので、URIアクションで、JavaScript切ってます。

日記開くだけで見るのに、5秒も固まってんじゃねー。

でも、JavaScript切ると、写真クリックして、拡大できないんだよね・・・

FireFoxは、レンダリングもっさりと、たびたびあるセッション吹っ飛びが、直れば

使えるかもしれないんだけどなー

2007-11-08

anond:20071108070657

レポートに「詳細はソースコードのN行目に……」とか書いて、ソース置いたディレクトリURI書いておいたら、レポートに書けよと怒られちゃったよ。

次のときは同じ過ちは繰り返すまいと、付録としてソース全部付したらソース部分の頁数の方が多くなっちゃって(レポート部分A4が2,3、ソース部分A4が10くらいだったと思う)、規定枚数オーバーしてると怒られちゃったよ(付録って書いておいたのに……)。

だから言う、レポートソースいらない子

個人的には、ソースコメントレポート書けばいいんじゃないかと思うわけですが。Javadocたくやればかなり有用な気がするし。

2007-10-31

生け垣オートマトン

ネーミングセンスが好きだ。

英語だと、hedge automataだ。

RELAX NGというXMLスキーマ数学的な基礎らしい。

通常のオートマトンが文字列を扱うのに対して、

生け垣オートマトンは生け垣を扱う。

ここで、生け垣は順序木の順序列のことだ。

すごい理論としておもしろいので勉強中だ。

これを勉強した後と前では、RSSSOAP等のXMLの応用に対する見方も変わるかもしれない。

みんなも、下記URIをぜひ読んでみよう。

参考URI

2007-10-24

XFrames

XFramesは従来のHTMLフレームに置き換わる概念らしい。

http://www.w3.org/TR/xframes/

なかなか、日本語情報が見つからない。

分かったのは、#frames(id1=uri1,id2=uri2,...)の形でframeを直接URIで指定することぐらいだ。

英語勉強しなきゃなあ。

実際に、応用するとしてどういうことが考えられるだろうか?

ログイン ユーザー登録
ようこそ ゲスト さん