XPathのメモ
XPathのメモ
XPathのメモです。XPathの説明はありません。このメモでは、HTMLとJavascriptとXPathなどを使います。
HTMLのサンプル
このHTMLをサンプルとして使います。
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>XPath sample</title> <link rel="stylesheet" type="text/css" href="style.css"> </head> <body> <div id="page"> <div id="main"> <h1>headder</h1> <p> fugafuga. </p> <p class="code"> hogehoge.fugafuga.piyopiyo. </p> </div> <div id="side"> <ul> <li><span class="red" id="fuga">hoge</span></li> <li><span class="red">piyo(<a href="http://twitter.com/komiy">link</a>)</span></li> <li><span class="red" id="fuga">hoge</span></li> </ul> </div> <div id="header"> <span>test</span> </div> <div id="footer"> <span><a href="http://kicsysytem.blog70.fc2.com/blog-entry-197.html">go back</a></span> </div> </div> </body> </html>
XPathの例
h1タグのテキストを取得
//h1/text()
idが"fuga"のテキストノードを取得
//*[@id='fuga']/text()
//span[@id='fuga']/text()
//div[@id='side']//span[@id='fuga']/text()
class属性が"red"でid属性が"fuga"のテキストノードを取得
//*[@id='fuga' and @class='red']/text()
http://twitter.com/komiyへのリンクのアンカーテキストを取得
//a[@href='http://twitter.com/komiy']/text()
JavaScriptでXPath
document.evaluate()を使います。全部のブラウザには対応していないので、使いたい場合は便利なJavaScriptライブラリを探しましょう。document.evaluate()の第一引数にXPathを指定するとよいです。
以下はサンプルコードです。これをコピーして、先ほどのHTMLのサンプルで実行してみます。実行するには、ブラウザのURL欄に貼り付けてたたけばOKです。
javascript:javascript:var xpath = "//*[@id='fuga']/text()";alert(document.evaluate(xpath,document,null,XPathResult.STRING_TYPE, null).stringValue);
改行除去スクリプト(ブックマークレット用)
以下のテキストエリアに改行などを除去したいコードを入力して、「おす」を押下すれば変換されたりします。
説明
ブックマークレットを作成したい時に、改行や行頭のスペースを除去してくれます。 firefoxなどで動きます。
新しいパソコンを作りました。 2008年09月28日(日)
▼構成
【M/B】ASUS P5QL-EM
【CPU】Core2Quad Q9550 E0 定格 @1.024V
【Mem】UMAX Pulsar DDR2-800 2GB x2
【HDD1】Barracuda 7200.11 ST3320613AS
【HDD2】Barracuda 7200.11 ST3640323AS
【HDD3】Barracuda 7200.10 ST3320620A
【電源】KRPW-J400W
【光学】AD-7170A
【VGA, 音】オンボード
【FAN】12cm*6,8cm*1
【OS】 Windows Vista Business 64bit
【CASE】MiniP180
以上。
GAE/Jで作るTwitterMobileClient
GAE/Jでもばついったーみたいなのを作ります。
群馬県のバス路線検索サービス
マッピングぐんま
群馬県が提供するWebサービス「マッピングぐんま」というWebサイトから、バス路線などが調べれます。 大変便利ですね!!!
バス路線がどこに走ってるのか?バス停がどこにあるのか?といった情報を調べようとしても、 今までは、調べたいバス路線の走る各市町村のWebサイトへ行って公共交通機関について調べなくてはなりませんでした。 しかも、バス路線やバス停について正確に載ってないこともあり、大変困りました。
マッピングぐんまは以下のページからつかえます。
→マッピングぐんま
LED電球、白熱電球、電球型蛍光灯の累計費用比較
LED照明は長期間使用すれば元がとれる。
LED照明というものが、そこそこの値段で出回ってきたのでLED電球、白熱電球、電球型蛍光灯の3つを累計費用の観点から比較した。
今回、比較に使用した電球の型番などは以下の通り。
| LED電球 | 白熱灯 | 電球型蛍光灯 | |
| 名前 | スタンサードモデル 600シリーズ | シリカ電球 60形 | パルックボールプレミア |
| 型名 | DL-L601L | LW100V54 | EFA15EL/10H |
| 寿命(h) | 40000 | 1000 | 10000 |
| 消費電力(w) | 7.5 | 54 | 10 |
| 点滅性能(回) | - | - | 30000 |
| 値段(円) | 3480 | 130 | 1472 |
点滅性能について
電球型蛍光灯には点滅性能というものがあり、電球をON/OFF繰り返すと寿命が減る。そのため、トイレなどの1回の点灯時間が短くON/OFFの回数が多いところでは、累計点灯時間が寿命(h)に達さなくとも壊れてしまう場合がある
比較は以下の3ケースで行う。
1日10回ON/OFF、合計30分点灯
ケース1は、1日の合計点灯時間が短く、比較的ON/OFFの回数の多いところでのケースである。
| LED電球 | 白熱灯 | 電球型蛍光灯 | |
| 年間電気代(円) | 28.74 | 106.96 | 38.33 |
| 年間点滅回数(回) | - | - | 3650 |
| 耐久年数(年) | 219.18 | 5.48 | 8.22 |
| 購入準備金(円) | 15.88 | 23.72 | 179.09 |
このケースでは、電球型蛍光灯の累計点灯時間が寿命(h)に達する前に、ON/OFFの回数が点滅性能に達する。そのため、耐用年数は8.22年とした。ちなみに、点滅性能を無視した場合は50年超の年数となる。
ケース1 各年毎の累計費用
1日5回ON/OFF、合計3時間点灯
ケース2は、1日の合計点等時間が比較的長いところでのケースである。
| LED電球 | 白熱灯 | 電球型蛍光灯 | |
| 年間電気代(円) | 172.46 | 1241.73 | 229.95 |
| 年間点滅回数(回) | - | - | 1825 |
| 耐久年数(年) | 36.53 | 0.91 | 9.13 |
| 購入準備金(円) | 95.27 | 142.35 | 161.18 |
1日1回ON/OFF、合計8時間点灯
ケース3は、1日の合計の点灯時間が長く、ON/OFFの回数が少ないところでのケースである。
| LED電球 | 白熱灯 | 電球型蛍光灯 | |
| 年間電気代(円) | 459.9 | 3311.28 | 613.2 |
| 年間点滅回数(回) | 365 | ||
| 耐用年数(年) | 13.7 | 0.34 | 3.42 |
| 購入準備金(円) | 254.04 | 379.6 | 429.82 |
表の説明
年間電気代・・・1kwhあたり21円で計算した。
購入準備金・・・この金額を毎年積み立てると、耐用年数で電球が切れたときに新しい電球が購入できる金額
ケース1 各年毎の累計費用
このような場所での、電球型蛍光灯の使用は避けたい。
ケース2 各年毎の累計費用
ケース3 各年毎の累計費用
表の説明
縦の列は、1列目から年数、LEDの累計費用、白熱灯の累計費用、電球型蛍光灯の費用
累計費用のうち、赤で示してあるものは該当年次において累計費用が最悪のもの、青が該当年次において累計費用が最善のもの。
まとめ
今回の3つのケースでは、どれもLEDの累計費用が最終的にもっとも安くなる。 しかしケース1では、LEDの累計費用が最安になるのが40年目からであり、今後のLED照明の値下がりなどを考慮すると現時点でのLED導入は見送りたい。ケース2でのLED導入も同様である。
ケース3についても、LEDの累計費用が最安になるのが7年目からであり、この7年間は微妙なところである。
LED照明は長期間使用すれば元がとれるが、現状は様子見をしたい
FreeHALbot@Twitter
FreeHAL@homeのWU供給状況をお知らせしてくれるbot(komi_riesel)を作りました。
基本機能
FreeHAL@homeのサーバーステータスを定期的に取得し、
- WU供給状態から、WU枯渇状態、サーバ落ち、になった場合にお知らせします。
- WU枯渇状態から、WU供給状態、サーバ落ち、になった場合にお知らせします。
- サーバ落ちから、WU供給状態、WU枯渇状態、になった場合にお知らせします。
更新履歴
2009/8/5 Ver0.1
FreeHAL@Homeのサーバーステータスを取得し、Twitterにpostできるようになりました。
2009/8/10 Ver0.2
制限付きで任意のプロジェクトを登録できるようになりました。
2009/8/11 Ver0.3
ログ出力できるようになりました。
一定時間ごとに現在のサーバステータスを報告する機能を停止しました。
2009/8/11 Ver0.31
ログ出力関連でフリーズする問題を修正
2009/8/12 Ver0.32
TwitterへのPost失敗時に、リトライしないバグが見つかったので修正しました。
2009/10/29 Ver0.40
Twitterの重複つぶやき制限に対応しました。(duplicate text - duplicate text - Twittpedia)
24時間以内に同じ内容をpostする場合は、末尾に"*重複回数"をつけます。
例:[milkyway]WUが枯渇したようです。 *2
重複回数は、24時間以内にpostされた重複つぶやきの件数を表すものではありません。
Redmineチケット発行機
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Diagnostics; namespace ticket { public partial class Form1 : Form { public Form1() { InitializeComponent(); toolStripProgressBar1.Visible = false; } int PostCount = 0; private void button1_Click(object sender, EventArgs e) { Stopwatch sw = new Stopwatch(); toolStripProgressBar1.Visible = true; toolStripProgressBar1.Maximum = (int)maisu.Value ; toolStripProgressBar1.Minimum = 0; long sumTime = 0; long aveTime = 0; int i = 0; sw.Start(); for (i = 0; i < maisu.Value; i++) { statusLabel.Text = "チケット発行中" + (i + 1) + "/" + maisu.Value; try { ticket(); PostCount++; } catch (Exception) { statusLabel.Text = "エラー"; return; } toolStripProgressBar1.Value = (i + 1); sw.Stop(); sumTime += sw.ElapsedMilliseconds; aveTime = sumTime / (i + 1); textBox1.Text = (sw.ElapsedMilliseconds).ToString(); textBox2.Text = aveTime.ToString(); textBox3.Text = (((maisu.Value - (i + 1)) * aveTime) / 1000).ToString(); sw.Reset(); sw.Start(); this.Refresh(); } statusLabel.Text = "待機中"; toolStripProgressBar1.Visible = false; sw.Stop(); sw.Reset(); } private void ticket() { string url = "http://virus-test:3000/projects/ticket/issues/new"; System.Net.WebClient wc = new System.Net.WebClient(); System.Collections.Specialized.NameValueCollection ps = new System.Collections.Specialized.NameValueCollection(); try { postCheck(); } catch(Exception) { MessageBox.Show("チケットの入力内容に不足があります。"); return; } ps.Add("issue[tracker_id]", "1"); // トラックID ps.Add("issue[subject]", title.Text + "-" + PostCount); // タイトル ps.Add("issue[description]", discription.Text); // 内容 ps.Add("issue[status_id]", "1"); // ステータス ps.Add("issue[priority_id]", "4"); // 優先度 ps.Add("issue[start_date]", start.Text); // 開始日 ps.Add("issue[due_date]", end.Text); // 終了日 if (checkBox1.Checked) { wc.UploadValuesAsync(new Uri(url), ps); System.Threading.Thread.Sleep(30); } else { wc.UploadValues(url, ps); } wc.Dispose(); } private void postCheck() { if (title.Text == string.Empty) { throw new Exception(); } if (discription.Text == string.Empty) { throw new Exception(); } } } }

