gaggitのブログ

コーディング、ガジェット、TIPS関連、FX

法人インフォ エンドポイントが変更されていた

昨日、法人インフォのAPIがリニュアルされていました。

検索が高速化されているとのことですが、まずは、エンドポイントが変わっていることを伝えて欲しいです。

変更前

https://api.hojin-info.go.jp/sparql?default-graph-uri=&query=

変更後

https://api.hojin-info.go.jp/sparql?query=

 

あと、レスポンスフォーマット(format)がjsonのみとなっています。

 

修正変更の詳細は、サイトにあるAPI.pdfを参照してください。

上記の変更を行ったうえで、実行したところ、以前は、さくさく動作していたのにレスポンスが成功していたり、タイムアウトしていたりと、改悪されてます。orz

SPARQL LIKE演算子や列名の全出力のやり方

 会社情報を調査するバイトをしているのだが、当然、会社が倒産や破産をしていたらバイト代はでない。そこで、法人インフォのサイトで会社が閉鎖されていないか、あらかじめチェックを行っている。毎回、手動でチェックをするのも面倒くさいので3ヶ月ほど前にバッチ処理で洗い出している。

 最近、気が付いたのだが、ごくたまに資本金や設立日が出力されるのに気が付いた。で、ちょっと検索方法がカスタマイズできないか、調査してみた。

 まずは、簡単にSPARQL(スパークル)言語を説明すると、RDFクエリ言語の1つで、SQLのSELECT演算子みたいなものだと認識している。

SPARQLは、SELECT~FROM~WHEREと構文的にはSQLと一緒だが、変数の頭に?をつけるのとWHERE句の行の連結には末尾にピリオドをつけるような感じ。

 試したいのは、SQLでよくあるSELECT *、つまり列名の全項目ができるかとLIKE演算子相当なものがあるかということ。

LIKE演算子はそのまま使用できず、

FILTER regex(変数名,"抽出したい文字列")

と記述する。

f:id:gaggit:20190314163231p:plain

SPARQL1

一般的な正規表現と同様に検索したい文字列の文頭に'^'を付加すれば前方一致検索、末尾に'$'を付加すれば後方検索。

上記の画像は、法人インフォのサイトで、一度検索した後、最下段の「SPARQLクエリ」ボタンを押した画像で、クエリを編集できるようになっており、実行ボタンを押すと、クエリに従って再抽出できる。

また、検索したい文字列の囲みは、シングルクォートでもダブルクォートでも使用可能。

 列名の全出力は、SELECT *~のままだが、WHERE句で定義されている全変数という意味合いなので、定義されていない項目は残念ながら出力されない。

下記は、件名を神奈川県で絞ったうえで、SELECT *~。

f:id:gaggit:20190314172329p:plain

SPQRQL2

 

定義するのが、面倒くさいのでアスタリスクを使用したかったのですが、少し残念な結果でした。

調査にあたり、以下の「RDF用クエリ言語SPQRQL」の和訳サイトを参照しました。

 

参考リンク

RDF用クエリ言語SPARQL

Selenium で最近ハマった3つのエラー

 Seleniumを使用して、Webを3階層、再帰的にクローリングするプログラムを書いたのですが、3つぐらいハマった個所があったので、ブログに書きとめておきます。

 

現象1:ページを戻るとfind_elementしたelementがもうないよと言われる

エラーメッセージ:The element is no longer attached to the DOM.

原因:ページを戻ると、html内のinputタグのクラス名が動的に変わっていた。

対応方法:戻ったのち、変わったクラス名で新たにfind_element()を行う。

                   $driver->go->back()で戻ると、DOMが壊れるので新たに$driver->get_page_sourceから。。。

 

現象2:ページを戻って、send_keys()で文字を送信しても、inputタグのvalueの値が変更されない。

エラーメッセージ:なし

対応方法:$element->send_keys(文字列)で送信する前に該当のelementを

$element->clear()であらかじめ、クリアしておく。

 

現象3:3つの数字をsend_keys()で送信すると、2つの数字しか表示されず、ログに出力したget_value()では3つの数字が入っている

 エラーメッセージ:入力できない文字があります。

原因:ブラウザー内で入力した文字列のバリデーションチェックで数字3桁であるかどうかチェックしています。で、エラーとなっているのですが、原因は保存したキャラクター形式が間違っていました。

対応方法:正しいフォーマットで入力ファイルを修正した

正しいデータのフォーマットはUTF(BOMなし)形式

間違ってたデータのフォーマットはUTF(BOMあり)形式

 

最初は、タイミングかなと思っていたのですが、set_implicit_wait_timeoutを使用しているし、成功している入力ファイルがあるので、タイミングでないことに気が付きました。

 

idは変わらないので、idでfindしてみましたが、取得できませんでした。

言い訳になるかもしれないですが、クラス名が似たような文字列で50文字ぐらいあるんです。

 

 

Selenium 使い方 ヒント集

Selenium::Remote::Driverを使って、週末の土日にコーディング&デバッグをしていて、あるエラーで躓いたときに見つけたサイトです。

Sumasriさんというシニアテストエンジニアを職業とする人が記述したサイトです。

 

www.softwaretestingmaterial.com

 

Seleniumのメソッドの使い方やそれぞれのメソッドの違い、コードのサンプル等だけではなく、エラーの対処方法やXPathとは何?といったことまで、書いてあります。

現時点で、114個のQ&Aが英語で書かれています。英語と言っても、それほど難しい単語や文法で書かれていないので、すんなり読んでいけると思います。

また、リンクを追えば、かなり詳しい情報も記載されていて、大変便利なサイトです。

これから、Seleniumを使いたい方は、のぞいてみる価値があるサイトです。

 

p.s.

冒頭で述べていたエラーは、なんとか自力でクリアできました。

エラーは「The element is no longer attached to the DOM.」なんですが、tableタグを1つ見落としていました。普通、tableタグ内で、テーブルヘッダ(th)タグとテーブルデータ(dt)タグが書かれていると思うのですが、

それぞれ個々にtableタグで書かれていたため、elementがないよと、エラーになっていました。orz

 

参照サイト:

100+ Advanced Selenium Interview Questions (Updated 2018)

Selenium WebDriverServerを立ち上げてみた

Selenium WebDriverは、クローリングも含めていろいろブラウザからWebの操作ができるテストツールです。WebDriverのクライアント側で対応する言語もJava,C#,Ruby,Python,Java Scriptが公式サイトから、PerlSelenium::Remote::Driverとして、有志から発表されています。

対応するブラウザも、Firefox,Chrome,Edge,Opera,Safari,PhantomJSなどい様々なブラウザに対応しています。

今回、Selenium WebDriverを使用するのに先立ち、WebDriverServerを立ち上げてみた。

Selenium WebDriverServerのインストール&実行手順

1.Selenium Standalone Serverのダウンロード

参照サイトSelenium Stadalone Serverのこうもくからdownload versionのVer.3.13.0(リンク)をクリックしてjarファイルをダウンロードする。

 

2.GeckoDriverのダウンロード

 Firefox用のドライバであるGeckoDriverを参照サイトからダウンロードし、解凍する。

 次に、解凍したgeckodriver.exeを実行できるパスにコピーする。

 

3.ファイアウォールの設定

Seleniumは、ServerとWebDriver間ではデフォルトでTCPポート:4444番号を使用するので、あらかじめ穴をあけておきます。

4.Selenium Standalone Serverの起動方法

1.のダウンロードしたjarファイルをどこかにコピーします。

2.コマンドプロンプトから、以下のコマンドを実行して、まずはハブ機能として起動します。

java -jar c:\temp\selenium-server-standalone-3.13.0.jar -role hub &

3.もう一つコマンドプロンプトを開き、以下のコマンドを実行して、ノード機能を実行します。

java -jar c:\temp\selenium-server-standalone-3.13.0.jar -role node -hub http://localhost:4444/grid/register &

 実行すると、ハブ側の出力にRegistered a nodeと表示されます。

 

PerlSelenium::Remote::Driverモジュールを使用したプログラムを実行したところ、簡単にServerとやりとりができました。

自動的にFirefoxが立ち上げってきました。でも、起動が10秒ぐらいかかりました。

 

今回のServerの立ち上げにはあまり関係ありませんが、今、読んでいる本が、「実践 Selenium WebDriver」です。

技術的にはライトな部分が多く、とっつきやすい本だと思います。ページ数は少ないですが、知っておかないと、結構、罠に引っ掛かりそうです。

 

参照サイト:

https://www.seleniumhq.org/download/

Releases · mozilla/geckodriver · GitHub

 

参考文献:

f:id:gaggit:20180719183335p:plain

r

User32 イベントID:1074 調査してみた(暫定対策)

 前回の続きで、観点を変えて、WindowsUpdateLogから追ってみることにした。

WindowsUpdateLogはC:\Windows直下にWindowsUpdate.logがある。

ファイルを開くと、https://go.microsoft.com/fwlink/?LinkId=518345このサイトを訪れなさいと、書かれてた。

リンクをクリックすると、参照サイトにリダイレクトされた。

見出しの「WindowsUpdate.logを生成します。」のGetWindowsUpdateLogをクリックすると、

docs.microsoft.com

 

内容を読むと、WindowUpdateのトレースファイルから、単一の読みやすいようにログファイルを生成してくれるようだ。

手順は、以下

・「ファイル名を指定して実行」「PowerShell」と入力し、PowerShellを立ち上げる。

・Get-WindowsUpdateLogと入力し、実行する。

・デスクトップに「WindowsUpdate.log」が生成される。

 

ログをエディタで開き、リブートした直前の時刻のログを確認すると、

Received power state changing notification: Old: <unknown>; New: AC.

Power state change from <unknown> to AC.

 

結局、原因として、電源周りに行き着いたので、今度は、対策の観点から考えてみた。

先ずは、電源オプションの設定をHIgh Performance(ASUSは独自にPowerWizという4種類の電源設定が行える)からWindows標準のバランス設定に変更した。

もう一つは、デバイスマネージャから使用しているネットワークアダプタを右クリックして、「プロパティ」「電源の管理」を以下のように変更した。

「電力節約のために、コンピューターでこのデバイスの電源をオフにできるようにする」のチェックを外した。

 

p.s.

WindowsUpdateログを見ると、結構、頻繁にダウンロードマネージャが動いています。それとデスクトップPC側ではFailedが頻発されてた。orz

 

参照サイト:

https://support.microsoft.com/ja-jp/help/4035760/understanding-the-windowsupdate-log-file-for-advanced-users

Get-WindowsUpdateLog

User32 イベントID:1074 調査してみた

今日、午後2時過ぎに、突然ノートPCが再起動した。暑いし、熱暴走でもしたのかなーと、流そうとしていたのだけれども、気になったので原因を調べてみた。

イベントログを確認すると、システムログにタイトルのログが出力されていました。

全般タブには

次の理由で、プロセス c:\windows\system32\svchost.exe (ASUSU24E) は、ユーザー NT AUTHORITY\SYSTEM の代わりに、コンピューター ASUSU24E の 再起動 を始めました: オペレーティング システム: Service pack (計画済)
理由コード: 0x80020010

f:id:gaggit:20180715201348p:plain

 直前のシステムログとアプリケーションログを確認しましたが、特に原因となるようなイベントは、なし。ちなみにWindowsUpdate(月例パッチ)は3日ほど前に手動で適用済み。

 

 ネット上でイベントID 1074を検索しても、目ぼしい回答が見つからなかったので、観点を替えて、理由コード(0x80020010)で検索してみたところ、マイクロソフトのサイト(参照サイト)に理由コードのドキュメントがあったので、もう少し調査を進めてみた。

 

 理由コード:0x80020010は、これ一つで1つの意味を表しているわけではなく、コンビネーションで複数の意味合いを持たせていた。

 まずは、0x80000000 SHTDN_REASON_FLAG_PALNNED

Descriptionの記述を確認しても、英語で、シャットダウンは、計画済み。System State Data(SSD)ファイルにシステムの状態が書かれているとある。が、このファイルを生成するには、Windows Error Reportingの設定が必要とある。Windows Error Reporting(参照サイト)の設定には、レジストリを変更する必要があり、デフォルトは無効となっているようだ。

 次に、0x00020000 SHTDN_REASON_MAJOR_OPERATINGSYSTEM

Operating system issue.の1行のみ。OSの問題としか書かれていない。

 最後に、0x00000010 SHTDN_REASON_MINOR_SERVICEPACK

Sevice pack.の1行のみ。サービスパックの一言のみ。

 

結果として、電源供給のトラブルで再起動というところまでは判明しましたが、根本原因までは不明です。

User32 イベントID:1074 調査してみた(暫定対策) - gaggitのブログ

へ つづく

 

参照サイト:

System Shutdown Reason Codes | Microsoft Docs

Windows Error Reportを使ってプロセスがクラッシュした際のダンプファイルを取得できるようにする設定方法