ITエンジニアの視界

35歳を超えてもエンジニアリング領域で生きるITエンジニアの見たもの感じたことを発信していきます。

プログラミング中。4つ目

方向転換したSelenide/SeleniumJavaプログラムの作成を続けています。これまでのプログラムから題材が複雑になったので時間はかかりますね。

進め方は二段階で考えています。自動操縦、情報取得の二段階です。

まずは自動操縦から。今はこれに取り組んでいます。 Seleinde/Seleniumを使って必要な画面遷移を一通り行えることが目標です。先日ログイン手前までは行けました。HTMLを解析してイベント発火を行います。HTMLの解析ではどのHTMLElementを操作するのかを把握するのが肝なのですが、これにはChromeの開発者ツールを使っています。XPathを取得できるからです。Selenide/SeleniumでもXPathによるHTMLElementの取得ができるので相性が良いです。

次に情報取得。画面遷移で目的の画面に飛べるようになったら、必要な情報をHTMLを解析して取得します。ここはHTMLElementの中から値を取得する処理を行っていきます。集計などを行えるようにデータ形式を変更したりしてJavaプログラム上で使いやすくしようと考えています。CSVもしくはデータベースに格納することを目標にしています。サイトのレイアウト変更等があることも考えられるので、例外処理で適切に把握できるようにするのも工夫するポイントだなと思っています。

プログラミング中。4つ目を方向転換

自分個人用に楽天証券から自分の資産状況を取得しようとSelenide/Selenium使ってやろうとしてました。 この計画を変更することにしました。ちょっとしたアイデアが思い浮かんだので。

pygmy.hatenablog.jp

楽天証券を始めたころから資産状況の取得はしたいと思っていました。でも今でもやっていない。これってやる気がなく、やっても大した効果がないってことを自分自身が思ってるからだということに気づいたんです。やってる人は既にやってるんですしね。そんな中で、ふとトリバゴが頭をよぎりました。トリバゴ的なことを他の情報に対してできたら面白いだろうなと。Amazonの価格情報と楽天価格.comの価格情報を一括で見れる的な。ちょっとそっち方面で面白くなるか取り組んでみることにします。

プログラムソースコードが販売サイトで売れた。

3月14日にエントリーした下記記事の、販売サイトに登録したプログラムソースコードが売れました。

pygmy.hatenablog.jp

自分で作ったプログラムソースコードが人生で初めて売れました。登録価格は200円。販売価格は220円。サイトの手数料を差っ引けば実入りは100円にも満たず、引き出し可能金額には到達していないと思うので実質利益はゼロです。けれども嬉しいです。

このプログラムソースコードは、リクエストに応える形で作り、よくあるサンプルで簡単に実現されているものとは少し違う変化球への対応したものでした。たった1本売れただけですが、その1本を買ってくれた人がいます。その人は何故私の書いたソースコードを買ってくれたのか知りたい。そしてより役に立つようなものを提供したい。そんな気持ちが沸き上がりました。久しぶりの感覚です。購入してくれた人に聞くことはかないません。自分の想像では「少し違う変化球への対応」が購入をしてくれた要因だったのではないかと思っています。

振り返ると何かにつけプログラムを作ってやるような癖がついています。自分がよくミスを犯す人間だから。そんな中で自分が失敗しないために変化球は投げてきました。また変化球が求められる状況を見つけたらチャレンジしてみようと思います。一方で気を付けないとなとも思っています。自分から変化球を投げても誰も反応してくれないだろうということです。CSVは一般的で目にしやすいリクエストでした。利用者も状態を良く知っています。利用者の抱える問題に注意して自分よがりにならないようにします。ただ、自分よがりな変換球も投げてはみます。かつての私はその変化球を使って作業をこなしたことがあるので。

今日は嬉しい日でした。

プログラミング中。4つ目

自分向けのプログラムを作成中。

楽天証券で株と投資信託をやっています。これの資産管理を全然していません。含み損が増え続けている下手くそ。毎回見るたびに現在の資産総額見ているだけなので少しは管理的なことをしないといけないなと思いました。 そこで作り始めたのが、楽天証券にログインした時に表示される資産合計を自動で取得するプログラムの作成です。JavaでSelenide/Seleniumを使ってやってみています。

Seleniumの存在は以前から知っていたのですが、ちょっと触ってそのままにしてしまいました。今回、Seleniumをテスト向けに使いやすくしたSelenideの存在を知ったので改めてチャレンジです。スクレイピングってやつですね。上手くいけばJavaプログラムをバッチプログラム化して勝手に情報収集するようできます。収集した結果をExcelでグラフにして傾向が見て取れるようになれば素敵だなと思って取り組んでいます。ドライバーはChromeを使ってます。導入とお試しは正常に動くところまでいきました。Chromeの開発者ツールを活用しつつXPathで攻めるスタイルです。開発者ツール便利。

最近ではスクレイピングするのにPython使うみたいですね。機械学習的なことを組み合わせてより有効に活用するのだろうなと思います。興味があるのですが勉強ですね。Pythonはちょっとかじって放置しちゃってますJava+Selenideが成功したら取り組んでみようと思います。

プログラムソースコードを販売サイトに登録した。3つめ。

csvファイル内の区切り文字を含むデータを区切らせないようにしたい」というリクエストに対応することを目的としたプログラムソースコードを販売サイトにアップしました。

www.piecex.com

CSVファイルはExcelから作ったり、何かのシステムからダウンロードして入手することが多いと思います。そのCSVファイルがただの文字列とか数値だけだったらいんですけど、稀にリクエストにあったようなケースって存在しますね。Excelで作るケースとしては、Excelでセルに区切り文字のカンマを入れたデータをCSVファイルで保存するというケースです。保存されたデータはダブルクォーテーションで囲まれた形で保存されます。こうすると「区切り文字を含むデータ」が発生するんですね。このデータを上手くプログラムで扱いたいという要望だと考え、プログラムを作成しました。

JavaCSVファイルを取り扱う時には、StringTokenizerあたりを活用することがよくあると思います。StringTokenizerは文字列を区切り文字で分割してくれるとても便利なクラスです。ただ、StringTokenizerは区切り文字で分割してしまいます。上手く処理するためには、文字列はダブルクォーテーションで囲まれた範囲であり、文字列に含まれる区切り文字はデータであって区切り文字ではないという処理を追加する必要があります。この実現には標準ライブラリを使わずに、文字列処理を行っていかなければなりません。今回作成したプログラムはその処理を行って、CSVファイルからStringを返却するようにしました。

動的なリストではなくStringの固定長二次元配列にしたのは、CSVは表のようなイメージをされていることが多く、行や列が可変長より固定長の方が迷わないケースが多かったからです。CSVはcomma-separated valuesでカンマで区切られいれば良く、行の列数がそろってないといけないなんてことはないのですけれど。

プログラミング中。3つ目

csvファイル内の区切り文字を含むデータを区切らせないようにしたい」というリクエストを題材にプログラミング中。 fukudaさんの2017年投稿のリクエスト。これまた古い。けど取り組んでみます。 要件は、Javaで「csvファイルで区切り以外でデータ内にカンマがあった場合にそこで別カラムとして分けないようにしたい」とのこと。 仕事中に似たようなことをやったことがあります。

そんなに時間かからないかな?と思っていたら地味に時間がかかり始めました。 csvJavaで処理しようとすると、StringTokenizerあたりを使用すると思うのですが、今回の要件ではそれは使えません。区切り文字で分けたなくない場合があるという要望なので。 csvの文字列にはダブルクォーテーションが付くのが一般的。このダブルクォーテーションの存在を意識してTokenizeしてあげないといけません。 このことを意識すると、ダブルクォーテーションで囲まれた範囲を文字列だと判定するロジックが必要になります。 このロジックでは文字列の中には改行が含まれる場合もあることに留意しないといけません。改行があってもそれがレコードの変更点とはならないからです。 ダブルクォーテーションに囲まれているならただの文字列の一部とする必要があります。

明日には形にしてソースコード販売サイトに登録したいと思います。

プログラムソースコードを販売サイトに登録した。2つめ。

「文章禁止文字があったらエラーになる」というリクエストに対応することを目的としたプログラムソースコードを販売サイトにアップしました。

www.piecex.com

禁止文字があったらエラーのところは経験したことを使ったのですが、今回GUIの部分は初めて形にしました。 Swingが出始めた頃に「これ素敵!」と思って書籍を3冊くらい買って挫折したことがあります。イベント処理とか難しくてわからなかったから。 今回は取り組んで形にできました。

躓いたのは2つ。 1つはメニュー。JMenuとJMenuitemの違いを知らずに「メニュー押しても動かない!」と思ったこと。EclipseのWindowBuilderの力を借りたことでちょっとハマりました。 1つはテキストの赤文字化。これは初めて知った知識でした。Googleでヒットしたいくつかのサンプルを見てもなんともイメージが付かず挫折しかけました。最後に見つけたサンプルに助けられました。

上手くいったことも1つありました。 赤文字化では、作った禁則文字を見つける仕組みと赤文字化の仕組みがマッチしたんです。苦労することなく実装できました。これは自分の仕組みが正解だったようで嬉しかったです。 昔出来なかったことが今できるようになっているのはうれしかったです。知らなかったこともできるようになったことも。 40歳としては他愛もないことかもしれません。お金にもならないことかもしれません。でも、ちょっとできるようになったのはやっぱうれしかった。

Javaで禁止文字の仕組みを作っても今の情勢では使われる機会は少ないと思えます。 PHP(Wordpress)とかRubyとかで同じ機能を実装したらどうなのだろうと、PHPRubyも知りませんが漠然とした次のビジョンが頭に生まれました。 新しく学ぶ意欲が生まれたのかもしれません。 また何かを見つけて作ろう思います。