プログラミング: 2022年3月アーカイブ

JavaScript の中で、Shift_JIS で書かれたテキストファイルを読んであれこれしてるんだけど、ファイルを読み込んでくる function はこんな感じ。
XMLHttpRequest を使っている。

//@cc_on
function getTextFile (fname) {

    var text = "";
    var ajax = new XMLHttpRequest();

    with (ajax) {
    /*@if(1) onreadystatechange @else@*/ onload /*@end@*/ =
    function () { readyState == 4 && status == 200 && (text = responseText); };
        open('GET', fname, false);
        overrideMimeType('text/html;charset=Shift_JIS');
        send(null);
    };

    return text;

}

fname には、http://www.exsample.jp/data/hoge.txt のような URI を渡してやる。
ただ、この hoge.txt を更新したあとも、ひたすら古いキャッシュの内容を読み込んでくるので、更新した内容が取れないという不具合が・・・

さて、どうしたらキャッシュを読まないようにできるのか???

答えは、

setRequestHeader('Pragma', 'no-cache');
setRequestHeader('Cache-Control', 'no-cache');
setRequestHeader('If-Modified-Since', 'Thu, 01 Jun 1970 00:00:00 GMT');

こんな風にリクエストヘッダにキャッシュじゃなくて生データ送ってこいと指示するだけ。
昔はよくサーバの設定を確認したりするのに、telnet で 80番ポートに接続し、

GET / HTTP/1.1
Host: www.exsample.com
User-Agent: handPower
Pragma: no-cache
Cache-Control: no-cache
Accept: */*

とかやってたのに、パッと思いうかばないもんだな(^^;

というわけで、

//@cc_on
function getTextFile (fname) {

    var text = "";
    var ajax = new XMLHttpRequest();

    with (ajax) {
    /*@if(1) onreadystatechange @else@*/ onload /*@end@*/ =
    function () { readyState == 4 && status == 200 && (text = responseText); };
        open('GET', fname, false);
        overrideMimeType('text/html;charset=Shift_JIS');
        setRequestHeader('Pragma', 'no-cache');
        setRequestHeader('Cache-Control', 'no-cache');
        setRequestHeader('If-Modified-Since', 'Thu, 01 Jun 1970 00:00:00 GMT');
        send(null);
    };

    return text;

}

という具合に修正すればOK。
VB.NET で XML ファイルを読み込む方法の一例。
俺は繰り返されるブロック単位でノードとして読み込み処理するが、頭から一行ずつ読んで自分であれこれする方法もあるようだ。
というわけで、自分のやり方の備忘録。

処理するのはこんなXMLデータ。<支店請求>という支店別の大きなブロックの中に、<請求伝票>という伝票(請求書)単位のブロックがあり、その中に明細1行の情報をまとめた<明細>というブロックがある。
単価、個数は請求金額の属性としてもっている。

実際の請求データはもっと項目があるが、一番シンプルなこの形で処理を記録しておく。

<支店別請求>
    <支店情報>
        <支店ID>0001</支店ID>
        <支店名>あああ支店</支店名>
    </支店情報>
    <請求伝票>
        <請求ID>202203090001</請求ID>
        <請求合計金額>2300</請求合計金額>
        <明細>
            <明細行No>01</明細行No>
            <商品ID>A0001</商品ID>
            <商品名>あらら電池</商品名>
            <請求金額 単価="25" 個数="40">1000</請求金額>
        </明細>
        <明細>
            <明細行No>02</明細行No>
            <商品ID>A0981</商品ID>
            <商品名>小型クリーナー</商品名>
            <請求金額 単価="1300" 個数="1">1300</請求金額>
        </明細>
    </請求伝票>
    <請求伝票>
        <請求ID>202203090002</請求ID>
        <請求合計金額>10500</請求合計金額>
        <明細>
            <明細行No>01</明細行No>
            <商品ID>B0055</商品ID>
            <商品名>ふんどし型カツラ</商品名>
            <請求金額 単価="100" 個数="105">10500</請求金額>
        </明細>
    </請求伝票>
</支店別請求>
<支店別請求>
    <支店情報>
        <支店ID>0003</支店ID>
        <支店名>ううう支店</支店名>
    </支店情報>
    <請求伝票>
        <請求ID>202203090201</請求ID>
        <請求合計金額>10500</請求合計金額>
        <明細>
            <明細行No>01</明細行No>
            <商品ID>B0055</商品ID>
            <商品名>ふんどし型カツラ</商品名>
            <請求金額 単価="100" 個数="105">10500</請求金額>
        </明細>
    </請求伝票>
</支店別請求>

この XML データを処理し、下記内容でテーブルに突っ込む。

0001|あああ支店|202203090001|2300|01|A0001|あらら電池|25|40|1000
0001|あああ支店|202203090001|2300|02|A0981|小型クリーナー|1300|1|1300
0001|あああ支店|202203090002110500|01|B0055|ふんどし型カツラ|100|105|10500
0003|ううう支店|202203090201|10500|01|B0055|ふんどし型カツラ|100|105|10500

まず、XML ファイルを読み込む(Imports System.Xml は忘れずに)。

        Dim jd As New XmlDocument()

        Try
            jd.Load("受信ファイル.xml")
        Catch ex As Exception
            'エラー処理
        End Try

で、「ルート要素の取り出し」を。全てのデータの取り込みね。

        Dim xroot As XmlNode
        xroot = jd.DocumentElement

そして、親、子、孫のブロックを順次取り出しながら処理をしていく。
(値をセットしていくテーブルはすでに設定されているってことで。行データを格納するオブジェクトは newRow)

        Dim xlist1 As XmlNodeList   ' <支店別請求>のリスト
        Dim xlist2 As XmlNodeList   ' <請求伝票>のリスト
        Dim xlist3 As XmlNodeList   ' <明細>のリスト
        Dim xnode1 As XmlNode   ' <支店別請求>のリストの中のひとつの<支店別請求>
        Dim xnode2 As XmlNode   ' <請求伝票>のリストの中のひとつの<請求伝票>
        Dim xnode3 As XmlNode   ' <明細>のリストの中のひとつの<明細>

とりあえず親、子、孫の 3階層しかない入れ子なのでそれぞれオブジェクトを設定。もっと階層が深ければ配列にしてもええじゃろう。
また、NULL値とか変なデータは無い前提で。必要なら、
If(String.IsNullOrEmpty(xnode1.SelectSingleNode("支店情報/支店ID").InnerText), "", xnode1.SelectSingleNode("支店情報/支店ID").InnerText)
とかして。
また、全ての項目は必須項目で、必ず全てのタグが存在しているものとする。
        
        xlist1 = xroot.SelectNodes("//支店別請求")

        '<支店別請求>の 1ブロックを読み込む
        For Each xnode1 In xlist1

            w_支店ID = xnode1.SelectSingleNode("支店情報/支店ID").InnerText
            w_支店名 = xnode1.SelectSingleNode("支店情報/支店名").InnerText

            xlist2 = xnode1.SelectNodes("請求伝票")

            '<支店別請求>の中の<請求伝票>の 1ブロックを読み込む
            For Each xnode2 In xlist2

                w_請求ID = xnode2.SelectSingleNode("請求ID").InnerText
                w_請求合計金額 = xnode2.SelectSingleNode("請求合計金額").InnerText

                xlist3 = xnode2.SelectNodes("明細")

                '<請求伝票>の中の<明細>の 1ブロックを読み込む
                For Each xnode3 In xlist3

                    Dim newRow = Table1.NewRow

                    newRow("支店ID") = w_支店ID
                    newRow("支店名") = w_支店名
                    newRow("請求ID") = w_請求ID
                    newRow("請求合計金額") = w_請求合計金額

                    newRow("明細行No") = xnode3.SelectSingleNode("明細行No").InnerText
                    newRow("商品ID") = xnode3.SelectSingleNode("商品ID").InnerText
                    newRow("商品名") = xnode3.SelectSingleNode("商品名").InnerText

                    newRow("単価") = xnode3.SelectSingleNode("請求金額").Attributes(0).InnerText
                    newRow("個数") = xnode3.SelectSingleNode("請求金額").Attributes(1).InnerText
                    newRow("請求金額") = xnode3.SelectSingleNode("請求金額").InnerText

                    Table1.Rows.Add(newRow)

                Next

            Next

        Next

みたいな感じでいかがか?

ちなみに、ノードの属性値を「属性名」指定で引っ張れないかは調べてない。(Attributes(0)ではなく「単価」という名前で引けないか)
識者の方、ぜひご教授を。
以前 Perl で組んだシステム上からツイートをする必要が出てきたので、久しぶりにテスト用のボットを作ってみるか・・・と思って、Perl の Twitter API v2 対応のモジュールを探してみたけど・・・

無い・・・

@perl_api の過去ツイートで、2021/04/23 に「Twitter APIv2のサポートは進行中です。早期アクセスのために、GitHubのapi-v2ブランチから今すぐ使用できます。ディスカッションに参加して、Twitter::API(またはNet::Twitter/Lite)を使用するアプリのスムーズな移行を確実にしてください。」というのはあるが、試しに Twitter 関係の Perl モジュールをインストールして、Net/Twitter/API.pm の中を見てみたけど、v1.1に関する記述しかないみたい・・・

未だ GitHub に対応進行中ソースが存在するだけなのか?

Twitter 公式の「Developer Platform」ページを確認すると、「Community tools and libraries for v2」の一覧の中には、C#.NET、Go、Java、JavaScript (Node.JS) / TypeScript、Kotlin、PHP、PowerShell、Python、R、Ruby しかない・・・(v1.1にはちゃんと Perl もあるのに)

だいたい、Kotlin(コトリン)とか、何?(ああ、Android アプリ開発でメジャーな言語なのか(^^;)

仕方ない。Perl の既存アプリの中で編集だけして、その中から呼び出されるツイート投稿プログラムは Python で書こう。

まだ v1.1の API も使えるみたいだけど、いつ使えなくなるかわからんからなあ・・・

このアーカイブについて

このページには、2022年3月以降に書かれたブログ記事のうちプログラミングカテゴリに属しているものが含まれています。

前のアーカイブはプログラミング: 2021年12月です。

次のアーカイブはプログラミング: 2022年6月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。


月別 アーカイブ

電気ウナギ的○○ mobile ver.

携帯版「電気ウナギ的○○」はこちら