Hatena::Groupstudyroom

OpenIDを勉強するコミットメント

|

2008-01-27

OPENIDを勉強するよ!

| 22:57 |  OPENIDを勉強するよ! - OpenIDを勉強するコミットメント を含むブックマーク はてなブックマーク -  OPENIDを勉強するよ! - OpenIDを勉強するコミットメント

するよ!

トラックバック - http://studyroom.g.hatena.ne.jp/tomyhero/20080127

2007-11-27神奈川県に引っ越してきました。

register

| 22:09 |  register - OpenIDを勉強するコミットメント を含むブックマーク はてなブックマーク -  register - OpenIDを勉強するコミットメント

http://d.hatena.ne.jp/bonar/20070415/1176651778

上記で説明されているregisterを試した。初めて知ったわ。

トラックバック - http://studyroom.g.hatena.ne.jp/tomyhero/20071127

2007-11-20

buffer

| 21:27 |  buffer - OpenIDを勉強するコミットメント を含むブックマーク はてなブックマーク -  buffer - OpenIDを勉強するコミットメント

バッファーーー!!!閉じたように見えて、メモリに残ってるあれですね。この辺読んだ。知ってたのに、使ってないのは馬鹿すぎる。いつも、Ctrl + C で fg してるけど、ブッファーを使うようにしないと。

ls,buffer n,sbuffer n, ball ,sball , bdeleteぐらい使いこなせればいいかんな。


*Q_bu*          Buffer list commands

|:buffers|      :buffers  or  :files    list all known buffer and file names

|:ball|         :ball     or  :sball    edit all args/buffers
|:unhide|       :unhide   or  :sunhide  edit all loaded buffers

|:badd|         :badd {fname}           add file name {fname} to the list
|:bunload|      :bunload[!] [N]         unload buffer [N] from memory
|:bdelete|      :bdelete[!] [N]         unload buffer [N] and delete it from
                                           the buffer list

              in current window   in new window ~
|:buffer|     :[N]buffer [N]      :[N]sbuffer [N]     to arg/buf N
|:bnext|      :[N]bnext [N]       :[N]sbnext [N]      to Nth next arg/buf
|:bNext|      :[N]bNext [N]       :[N]sbNext [N]      to Nth previous arg/buf
|:bprevious|  :[N]bprevious [N]   :[N]sbprevious [N]  to Nth previous arg/buf
|:bfirst|     :bfirst             :sbfirst            to first arg/buf
|:blast|      :blast              :sblast             to last arg/buf
|:bmodified|  :[N]bmod [N]        :[N]sbmod [N]       to Nth modified buf
トラックバック - http://studyroom.g.hatena.ne.jp/tomyhero/20071120

2007-11-17 このエントリーを含むブックマーク

[vim] ^Mを消したい

^Mを消したい人が、#vimチャンネルにいたので、返事をした。

これは、良い勉強だろう!!!

equuelus がチャットルームに参加しました。

[00:34] equuelus: how do i remove all occurences of ^M's?

[00:39] tomyhero: :%s/(ctrl + v + M )/g ???

[00:39] tomyhero: %s/(ctrl + v + M )//g

[00:40] Xenguy: equuelus: right, or you can just press the 'Enter' key in place of ^M

トラックバック - http://studyroom.g.hatena.ne.jp/tomyhero/20071117

2007-11-16もう金曜か。

2.2 Axes

| 11:25 | 2.2 Axes - OpenIDを勉強するコミットメント を含むブックマーク はてなブックマーク - 2.2 Axes - OpenIDを勉強するコミットメント

task:1:1

  1. child - 子供
  2. descendant - 孫。アトリビュートとネームパスは持たない。
  3. parent - 親
  4. ancestor - 先祖
  5. following-sibling - 弟
  6. preceding-sibling - 兄
  7. following - 弟全員
  8. preceding - 兄全員
  9. attribute - アトリビュート
  10. namespace - ネームスペース
  11. self - 自分自身
  12. descendant-or-self - 孫と自分自身
  13. ancestor-or-self - 先祖と自分自身

計13個か。

2.3 Node Tests

| 12:51 |  2.3 Node Tests - OpenIDを勉強するコミットメント を含むブックマーク はてなブックマーク -  2.3 Node Tests - OpenIDを勉強するコミットメント

task:1:1

Every axis has a principal node type.

すべてのaxisノードタイプをもってます。

  • For the attribute axis, the principal node type is attribute.
  • For the namespace axis, the principal node type is namespace.
  • For other axes, the principal node type is element.

A node test that is a QName is true if and only if the type of the node (see [5 Data Model]) is the principal node type and has an expanded-name equal to the expanded-name specified by the QName.

言いたいのは、見つからんかったら、カラでかえすってことやろ。

まぁ、そんなカンジや。

2.4 Predicates

| 12:59 | 2.4 Predicates - OpenIDを勉強するコミットメント を含むブックマーク はてなブックマーク - 2.4 Predicates - OpenIDを勉強するコミットメント

task:1:1

まぁ、そういうこと。え!

2.5 Abbreviated Syntax

| 12:59 | 2.5 Abbreviated Syntax - OpenIDを勉強するコミットメント を含むブックマーク はてなブックマーク - 2.5 Abbreviated Syntax - OpenIDを勉強するコミットメント

task:1:1

省略ができまっせってこと。

The most important abbreviation is that child:: can be omitted from a location step. In effect, child is the default axis. For example, a location path div/para is short for child::div/child::para.

childは省略できる!!!!!

There is also an abbreviation for attributes: attribute:: can be abbreviated to @. For example, a location path para[@type="warning"] is short for child::para[attribute::type="warning"] and so selects para children with a type attribute with value equal to warning.

attribute::は @ で表せる!!!

// is short for /descendant-or-self::node()/. For example, //para is short for /descendant-or-self::node()/child::para and so will select any para element in the document (even a para element that is a document element will be selected by //para since the document element node is a child of the root node); div//para is short for div/descendant-or-self::node()/child::para and so will select all para descendants of div children.

// = /descendant-or-self::node()/

A location step of . is short for self::node().

. = self::node()

おっけええええぇえええ

3 Expressions

| 13:29 |  3 Expressions  - OpenIDを勉強するコミットメント を含むブックマーク はてなブックマーク -  3 Expressions  - OpenIDを勉強するコミットメント

task:1:1

何となくわかってきたので、適当になってるけど気にしない!!

3.1 Basics

A VariableReference evaluates to the value to which the variable name is bound in the set of variable bindings in the context. It is an error if the variable name is not bound to any value in the set of variable bindings in the expression context.

いいたいんは、みつからんかったらエラーになるってことやろ。ふーん。

3.2 Function Calls

関数も使えまっせーってことやろ。作ることは多分できないかな。

3.3 Node-sets

A location path can be used as an expression.

location pass もexpressionとして使われまっせってことやな。

3.4 Booleans

An object of type boolean can have one of two values, true and false.

booleans are always true or false!!! Don't tell me that!!

3.5 Numbers

Number is number!!!!詳細はいらん!!

3.6 Strings

文字列!!!

3.7 Lexical Structure

  • If there is a preceding token and the preceding token is not one of @, ::, (, [, , or an Operator, then a * must be recognized as a MultiplyOperator and an NCName must be recognized as an OperatorName.

* = multiplay operator!!!!

NCName = operator name!!!

  • If the character following an NCName (possibly after intervening ExprWhitespace) is (, then the token must be recognized as a NodeType or a FunctionName.

()がついたら関数!!!!!!!!!!か、ノードタイプ!!

    • If the two characters following an NCName (possibly after intervening ExprWhitespace) are ::, then the token must be recognized as an AxisName.

:: が後ろについたら Axis!!!

  • Otherwise, the token must not be recognized as a MultiplyOperator, an OperatorName, a NodeType, a FunctionName, or an AxisName.

それ以外はそうと認識しない!!!

4 Core Function Library

| 13:54 |  4 Core Function Library - OpenIDを勉強するコミットメント を含むブックマーク はてなブックマーク -  4 Core Function Library - OpenIDを勉強するコミットメント

task:1:1

やべ、マジ飽きてきた。がんばれオレ。

4.1 Node Set Functions

  • last() - context size 数を取得できるみた
  • position() = context position 数が取れるみたい
  • count(node-set) = ノード数がとれる
  • id(object) = idのnode-setを返す。例 :id("foo")/child::para
  • local-name(node-set?) ローカル名を文字列で取得っす
  • namespace-uri(node-set?) ネームスペースを文字列で取得っす
  • name(node-set?) ナマエをとるよ!local-nameと似てて、違いはelment node and attribute node.

4.2 String Functions

4.3 Boolean Functions

  • boolean(object) オブジェクトをbooleanにするよ!
  • not(boolean) 逆にする。
  • true() ...
  • false() ....
  • lang(string) langが同じ指定かしらべる

4.4 Number Functions

  • number(object?) numberにキャストじゃ
  • floor(number) 引数より小さい、一番大きい数字とる。切り捨てか。
  • ceiling(number) 指定した引数より大きい、一番小さい数字。切り上げか。
  • round(number) まぁ、丸めますわ。

他の人が読むと多分意味が分からない、まさに自習っぽい!!

5 Data Model

14:22 |  5 Data Model - OpenIDを勉強するコミットメント を含むブックマーク はてなブックマーク -  5 Data Model - OpenIDを勉強するコミットメント

task:1:1

よっしゃ!この章で、最後やで!やったるで! back music = Evanecense

7種類あるで!

  1. root nodes
  2. element nodes
  3. text nodes
  4. attribute nodes
  5. namespace nodes
  6. processing instruction nodes
  7. comment nodes

5.1 Root Node

The root node is the root of the tree.

そのままやんけええええええ!

5.2 Element Nodes

There is an element node for every element in the document.

そのままやんけー <element></element>

5.2.1 Unique IDs

An element node may have a unique identifier (ID).

とりあえずTwitterスクリーン名をとってみる。

| 15:19 | とりあえずTwitterスクリーン名をとってみる。 - OpenIDを勉強するコミットメント を含むブックマーク はてなブックマーク - とりあえずTwitterスクリーン名をとってみる。 - OpenIDを勉強するコミットメント

タスクはこれね。 task:1:3

# 省略なしの絶対パス
//child::html//child::body//child::div[attribute::id="container"][attribute::class="subpage"]/child::div[attribute::id="content"]/child::div[attribute::class="wrapper"]/child::h2[attribute::class="thumb"]
# 省略ありの絶対パス
//html//body/div[@id="container"][@class="subpage"]/div[@id="content"]/div[@class="wrapper"]/h2[@class="thumb"]

これで取れる。超簡単。勉強する必要ないっす。TODO Test::Baseで実装して色々ためすか。


Web::Scraperでスクリーンネームをとる

| 16:37 |  Web::Scraperでスクリーンネームをとる - OpenIDを勉強するコミットメント を含むブックマーク はてなブックマーク -  Web::Scraperでスクリーンネームをとる - OpenIDを勉強するコミットメント

task:1:3

いくつかためしたんやけど、id(),preceding-siblingとかは実装されてなさげ。

use warnings;
use Web::Scraper;
use URI;
use Data::Dumper;
use Test::Base;
plan tests => 1 * blocks;


run {
    my $block = shift;
    my $uri = 'http://twitter.com/tomyhero';
    my $scraper = scraper {
        process $block->xpath,
        description => 'TEXT',
    };

    my $res = $scraper->scrape( URI->new($uri) );
    $res->{description} =~ s/ //g;
    is( $res->{description} , $block->expected , $block->name );
}


__END__
=== スクリーン名を絶対パスから
--- xpath 
/child::html/child::body/child::div[attribute::id="container"][attribute::class="subpage"]/child::div[attribute::id="content"]/child::div[attribute::class="wrapper"]/child::h2[attribute::class="thumb"]
--- expected chomp
tomyhero
=== スクリーン名を絶対パスからの省略形
--- xpath
/html/body/div[@id="container"][@class="subpage"]/div[@id="content"]/div[@class="wrapper"]/h2[@class="thumb"]
--- expected chomp
tomyhero
=== スクリーン名をdescendant(子孫)をつかって
--- xpath
/descendant::div[@id="content"]/div[@class="wrapper"]/h2[@class="thumb"]
--- expected chomp
tomyhero
=== スクリーン名をdescendant(子孫)をつかって(省略)
--- xpath
//div[@id="content"]/div[@class="wrapper"]/h2[@class="thumb"]
--- expected chomp
tomyhero
=== スクリーン名をid()関数を使って(これエラーになる..)
--- SKIP
--- xpath
id("content")/div[@class="wrapper"]/h2[@class="thumb"]
--- expected chomp
tomyhero
=== スクリーン名をpreceding-sibling使ってとる。(実装されてないんやて)
--- xpath
--- SKIP
//preceding-sibling::div[@id="footer"][position()=1]
--- expected chomp
tomyhero

Test::Base++


Twitter++

| 19:33 |  Twitter++ - OpenIDを勉強するコミットメント を含むブックマーク はてなブックマーク -  Twitter++ - OpenIDを勉強するコミットメント

API利用せずにできるかxpathつかって試す。とりあえず、データ取得はこんなかんじ。

use warnings;
use WWW::Mechanize;
use Data::Dumper;
use HTML::Form;
use Web::Scraper;

my $mech = WWW::Mechanize->new();
my $url = "http://twitter.com/";

$mech->get( $url );
$mech->submit_form(
    form_number => 1,
    fields => {
        username_or_email => 'tomyhero',
        password =>'*****'
    }
);


my $timelines = scraper {
    process '//strong',
        screen_name => 'TEXT';
    process '//span[@class="entry-title entry-content"]',
        entry => 'HTML';
    process '//span[@class="meta entry-meta"]/a',
        bookmark => '@href';
    process '//img',
        image => '@src';
    process '//span[@class="meta entry-meta"]/a/abbr[@class="published"]',
        published => '@title';
    result 'screen_name', 'entry','bookmark','image','published';
};

my $sc = scraper {
    process '//span[@id="friend_count"]',
        friend_count => 'TEXT';
    process '//span[@id="follower_count"]',
        follower_count => 'TEXT';
    process '//span[@id="favourite_count"]',
        favourite_count_count  => 'TEXT';
    process '//span[@id="message_count"]',
        message_count  => 'TEXT';
    process '//span[@id="update_count"]',
        update_count => 'TEXT';
    process '//table[@id="timeline"]/tr',
        'timelines[]' => $timelines,
};


warn Dumper $sc->scrape( $mech->content );

レベル1

| 20:44 |  レベル1 - OpenIDを勉強するコミットメント を含むブックマーク はてなブックマーク -  レベル1 - OpenIDを勉強するコミットメント

XPathはレベル1ぐらいの理解はできたので、これで自習終わっとく。

トラックバック - http://studyroom.g.hatena.ne.jp/tomyhero/20071116