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)