2010年2月25日木曜日

C#でHTML解析をしよう!Serpsを解析して被リンク数を得る関数を作る

C#でHTML解析を


標準の関数で行う方法として有名な方法は



「WebBrowser」コントロールを使う方法が有名ですが

この方法を私はお勧めしません。



理由としては

  • 裏でIEが立ち上がるため、メモリコストが高い

  • 実際に解析を行う部分が、DocumentCompletedイベント内になるので

    同期がとりにくく、コードが汚くなる









では、どうすべきか


私のお勧めは

Html Agility Pack


というライブラリを使用する事です。


ライブラリのインストール部分などは

リンクを参照していただければ、問題ないと思いますので

割愛します。





実際の使用例です

public static int LinkCounter(string url)
{
string q = "link:" + url;
string qurl = getYSTGetQuery(q, 10);

HtmlWeb hw = new HtmlWeb();
HtmlNode n = doc.GetElementbyId("inf");
string inf = n.InnerText;


int infstart = inf.IndexOf("約");
int infEnd = inf.LastIndexOf("件");

int length = infEnd - infstart;
if (length <= 0)
{
//MessageBox.Show(inf);
return 0;
}
string LinkCnt = inf.Substring(infstart+1, length-1);
return int.Parse(LinkCnt.Replace(",", ""));
}



public static string getYSTGetQuery(string keyword, int num)
{
return "http://search.yahoo.co.jp/search?p=" + HttpBeans.UrlEncode(keyword) +
"&n=" + num.ToString() + "&yuragi=on&search.x=1&fr=top_ga1_sa&tid=top_ga1_sa&ei=UTF-8";
}







LinkCounter("http://kgbnblog.blogspot.com")

こんな感じで使えます。



(Serpsは変更されるので、月日が経つとそのままでは使えないかもしれないです。)

2010年2月22日月曜日

Bloggerでtopsyの「この記事についてつぶやくボタン」を強引に設置する方法

もっと良いやり方があるのか知りませんが


私の方法はかなり強引です。




テンプレートを必ずバックアップしておきましょう。



まず、topsyのボタンについてですが


私のブログの右上にあるやつです。

(え…君の右上にはないだって?wそれはトップページには設置してないからさw)




さて、まずボタンのスクリプトの出所ですが。






Topsy Retweet Button for Web Sites


この辺からGETしてください。




次にそこの中から適当な

スクリプトを選ぼう!


私の場合はこれを選びました。


<div style="float: right; margin-left: 1em"><script type="text/javascript">
var topsy_nick = "あなたのTwitterユーザID";
var topsy_style = "big";
</script>
<script type="text/javascript" src="http://cdn.topsy.com/button.js"></script></div>





次に一般的なやり方で


ガジェットの追加から


HTML+JavaScriptを選択
して




何の迷いも無く先ほどのスクリプトを




コピペしてください。



ウィジェットの名前は

「Twitterでこの記事についてつぶやく」

にしておきましょう。



位置を

ブログの投稿の上ぐらいに

配置してください。





ここからが
かなりな力技です。



まず、レイアウト->HTMLの編集から




先ほどの「Twitterでこの記事についてつぶやく」を探してください。


すると

<b:section class='main' id='main' showaddelement='no'>
<b:widget id='HTML2' locked='false' title='Twitterでこの記事についてつぶやく' type='HTML'/>

<b:widget id='Blog1' locked='true' title='ブログの投稿' type='Blog'/>
</b:section>



こんなコードが見つかって欲しい!!!


無ければ空気を読んでやってください。。。





そのコードを下記のように変更してください。



<b:if cond='data:blog.pageType == "item"'>

<b:section class='main' id='twitBlog' showaddelement='no'>
<b:widget id='HTML2' locked='false' title='Twitterでこの記事についてつぶやく' type='HTML'/>
</b:section>

</b:if>

<b:section class='main' id='main' showaddelement='no'>
<b:widget id='Blog1' locked='true' title='ブログの投稿' type='Blog'/>
</b:section>





これで、ほとんどミッションコンプリートです。



後は気に入らない方は

CSS等で調整してください。



今日は大作でした。

2010年2月20日土曜日

C# イベントハンドラに引数を渡す方法「クロージャのやり方」

今日はC#で「クロージャ」という、

「関数を戻り値とする関数」特殊な関数の作り方を書きます。



private void frmMain_Load(object sender, EventArgs e)
{
Button btnTEST = new Button();

btnTEST.Click += eventSet("btnTEST");
this.Controls.Add(btnTEST);
}


private EventHandler eventSet(String str)
{
return delegate(object sender2,EventArgs e2)
{
Button btnSend = sender2 as Button;
btnSend.Text = str + ":クリックされたよ";
};
}



delegateは匿名関数を宣言するときの

予約語です。


データソースを読み込んで、自動で

コントロールを大量に生成しなければならないときなどに

便利だと思います。


(また今日も小ネタですw)

2010年2月18日木曜日

C# スクロールバーの最下部を判定する。

今日も細々したティップスですw



スクロールバーの現在位置が最下部に達したかどうかを

判定するコードです。




private void Form1_Load(object sender, EventArgs e)
{
this.Scroll += new ScrollEventHandler(Form1_Scroll);
this.MouseWheel +=
new MouseEventHandler(Form1_MouseWheel);
}

void Form1_MouseWheel(object sender, MouseEventArgs e)
{
This_Scrolling();
}

void Form1_Scroll(object sender, ScrollEventArgs e)
{
This_Scrolling();
}

private void This_Scrolling()
{
if((this.VerticalScroll.Maximum -
this.VerticalScroll.LargeChange) -
this.VerticalScroll.Value < 0)
{
// 最下部だよ
}
}




this.VerticalScroll.Valueは現在のスクロール位置です。

C# XmlNodeから指定のタグ名の中身を取得する関数


private string
getElementByTagName(XmlNode node, string name)
{
foreach (XmlNode n in node.ChildNodes)
{
if (name.CompareTo(n.Name) == 0)
{
return n.InnerText;
}
}
return null;
}


こんな感じです。
簡単ですが便利です。

2010年2月15日月曜日

ITエンジニアは働かないことが明日の為になる!?

IT技術者は常に




「効率的なシステムによる省力化」を

目指して開発を行っていると思う。




でも、ふと思った



エンジニアがフレームワークを開発する



↓



エンジニアがフレームワークによって
効率的な作業環境を手にする。



↓



フレームワークによって
エンジニアの作業が短時間かつ簡単になる
(効率化が実現)



↓



今までの作業が少ない人数で可能になる
(省力化が実現)



↓





エンジニアの仕事が無くなる。







すごく極端な例だけど

可能性としてはありえる事だと思う。


だからこそ、

自分自身で新しい機会を見つけること


がエンジニアにとって重要になると思う。



IT技術者は

仕事をなくすための仕事をすると

僕は思ってます。


だからこそ、

新しいものに貪欲でなければ

自分の首を絞めるのだ


と自警するkgbnでした。

なんだこのブログ

PHPでHTMLの名前をコンテンツ内容から抽出する

面白いコードが出来たので投稿します。


Bloggerの機能でありますが

HTMLの内容から
適切なファイル名を抽出するコードです。


//タイトル
$title = $_POST["art_title"];
//bodyの中身
$html = $_POST["art_content"];

/// html保存名の決定
$striped_content = strip_tags($title." ".$html);
$striped_content = strtolower($striped_content);
$striped_content = str_replace(" ","",$striped_content);


$match = array();
$hit_cnt = preg_match_all('/[a-zA-Z]{3,10}/',$striped_content,$match);


$match[0] = array_merge(array_unique($match[0]));

$first_word = (isset($match[0][0])) ? $match[0][0] : "blog";
$second_word = (isset($match[0][1])) ? $match[0][1] : "article";
$art_id = date("ymdHis").mtime().rand(1,100);

$saveName = "$first_word-$second_word-$art_id.html";



こんな感じです。



形態素解析でやってるわけじゃないので

日本語には対応してません。



あくまで英語単語のみです。



テストを重ねたコードではないので

バグ等あればコメントください!


Bloggerは単語の関連性とかも見て

_(アンダーバー)と-(ハイフン)の使い分けもやってるみたいです。

(僕にはこれが限界ですw)

2010年2月13日土曜日

JSONでPHPからJavaScriptへデータを送る

PHP->JSへ

流行の「JSON」を使って

連想配列のデータを送るコードを紹介します。




なお、今回はjQueryを使っています。




[test.php]
$arr_data = array(
"apple"=>"りんご",
"grape"=>"ぶどう",
"book"=>"本",
"movie"=>"映画");

print json_encode($arr_data);
?>


[javascript]
$(document).ready(function(){
$.ajax({
type: "GET",
url: "./test.php",
success: function(msg)
{
var get_json = eval( "("+msg+")" );
alert(get_json["apple"]);
}
});
}



こんな感じです

SEO YSTとサブドメイン

今日、面白い検証が出来たので投稿します。



20件ほど

YSTの検索結果を1位~100位まで検証してみたところ



サブドメインを使用しているとも思われるサイト

が100位以内に入っている件数は平均

16.4件だった。



そのうち

20位以内に入っているものは

平均3件


この数字を皆さんはどう思うでしょうか?



「サブドメインを切っているサイトの方が少ないからでは?」

いやそんなことはないだろう。



たとえばBloggerやはてなブログなどのブログツール

を使ったブログサイトは

ほとんどサブドメインになる。



そう考えると

サブドメインのサイトが平均して

少ないとは一概にはいえないのではないだろうか…







とにかく確率として




YSTでサイトが100位以内の記事に入れる確率は
16%だということだ





ちなみに、この検証は

スペース区切りの複数ワードなどで検証していないので



特化した記事であれば

上位に入る可能性は高いと思う。

2010年2月12日金曜日

SEO ブログの更新情報をPingで送信してインデックスを増加させよう!

ブログのSEOを考える際に

「Pingを送る」という技があります。



その際にご紹介するのがこちらの



「BlogPingPing」です。





BlogPeople
から会員登録をし、ダウンロードしましょう



会員登録は無料です





次に
Pingの送信先を設定するのですが
沢山あって大変です。


そこで下記をコピーして




[Ping送信先]


[MySite]
URL=TargetURL
TITLE=TargetTitle
TopMost=0
[Ping1]
WBLOGUPDATES=http://www.blogpeople.net/servlet/weblogUpdates
URL=TargetURL
TITLE=TargetTitle
ENABLE=1
PINGDATED=1265906517
[Ping2]
WBLOGUPDATES=http://api.my.yahoo.co.jp/RPC2
URL=TargetURL
TITLE=TargetTitle
ENABLE=1
PINGDATED=1265906518
[Ping3]
WBLOGUPDATES=http://rpc.reader.livedoor.com/ping
URL=TargetURL
TITLE=TargetTitle
ENABLE=1
PINGDATED=1265906518
[Ping4]
WBLOGUPDATES=http://ping.rss.drecom.jp/
URL=TargetURL
TITLE=TargetTitle
ENABLE=1
PINGDATED=1263283782
[Ping5]
WBLOGUPDATES=http://ping.fc2.com
URL=TargetURL
TITLE=TargetTitle
ENABLE=1
PINGDATED=1265906519
[Ping6]
WBLOGUPDATES=http://ping.namaan.net/rpc/
URL=TargetURL
TITLE=TargetTitle
ENABLE=1
PINGDATED=1265906520
[Ping7]
WBLOGUPDATES=http://blog.goo.ne.jp/XMLRPC
URL=TargetURL
TITLE=TargetTitle
ENABLE=1
PINGDATED=1265906521
[Ping8]
WBLOGUPDATES=http://www.blogoole.com/ping/
URL=TargetURL
TITLE=TargetTitle
ENABLE=1
PINGDATED=1265906521
[Ping9]
WBLOGUPDATES=http://www.blogoon.net/ping/
URL=TargetURL
TITLE=TargetTitle
ENABLE=1
PINGDATED=1265906527
[Ping10]
WBLOGUPDATES=http://blog-search.net/up.php
URL=TargetURL
TITLE=TargetTitle
ENABLE=1
PINGDATED=1265906528
[Ping11]
WBLOGUPDATES=http://ping.bloggers.jp/rpc/
URL=TargetURL
TITLE=TargetTitle
ENABLE=1
PINGDATED=1265906528
[Ping12]
WBLOGUPDATES=http://rpc.weblogs.com/RPC2
URL=TargetURL
TITLE=TargetTitle
ENABLE=1
PINGDATED=1265906529
[Ping13]
WBLOGUPDATES=http://rpc.blogrolling.com/pinger/
URL=TargetURL
TITLE=TargetTitle
ENABLE=1
PINGDATED=1265906531
[Ping14]
WBLOGUPDATES=http://xmlrpc.blogg.de/
URL=TargetURL
TITLE=TargetTitle
ENABLE=1
PINGDATED=1265906536
[Ping15]
WBLOGUPDATES=http://rpc.pingomatic.com/
URL=TargetURL
TITLE=TargetTitle
ENABLE=1
PINGDATED=1265906539
[Ping16]
WBLOGUPDATES=http://ping.blo.gs/
URL=TargetURL
TITLE=TargetTitle
ENABLE=1
PINGDATED=1265906540
[Ping17]
WBLOGUPDATES=http://blogsearch.google.co.jp/ping/RPC2
URL=TargetURL
TITLE=TargetTitle
ENABLE=1
PINGDATED=1265906540




「Ping.ini」の中身に
貼り付けて




TargetURLをブログのURLに
TargetTitleをブログのタイトルに置換
して
使いましょう。

PHP HTMLをファイル出力する方法

今回はHTMLを「ファイル」として出力する方法を投稿します

define("RENDER_HTML_PATH","./test.html");

$xhtml_render = <<<XML
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja" lang="ja">
<head>
<meta name="Content-Language" content="japanese">
<meta equiv="Content-Type" content="text/html; charset=UTF-8">
<meta equiv="Content-Style-Type" content="text/css">
<meta equiv="Content-Script-Type" content="text/javascript">

<title>テストです</title>
</head>
<body>
<h1>テストだよ</h1>
</body>
</html>
XML;

$xhtml_render .= $xhtml_index_bottom;
if( !touch(RENDER_HTML_PATH) )
{
die("ファイル生成エラー");
}


if (!($filePointer = fopen (RENDER_HTML_PATH, "w"))) {
die ("ファイルが開けません。");
}

flock ($filePointer, LOCK_EX);
fputs ($filePointer, $xhtml_render);
flock ($filePointer, LOCK_UN);



SimpleXMLをつかったりDomDocumentを使ったり
いろいろ策はありますが
私はこれが一番お気に入りです。

ブログ始めました。

こんにちはkgbnです。


日頃研究しているWEBの技術を
備忘録的に投稿していく予定です。


これから宜しく御願い致します。