gaggitのブログ

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

Perl File::ReadBackwards を使用してみた

 PerlでFile::ReadBackwardsモジュールを使用してみました。このモジュールは、ファイルを逆から読み込むので、ファイルの最後付近にある文字列を抽出したい場合に役立ちます。

使用しているPerlWindows版なので、このモジュールのレコードセパレータは\r\nなりますが、読み込むファイルはWindows版のcurlの-oオプションの出力ファイルなのに、なぜかレコードセパレータは\nでした。

幸い、このモジュールには、レコードセパレータを変更できるようにnewメソッドの第2引数で指定できます。

 

修正前:

my $bw = File::ReadBackwards->new($html_file);

 

修正後:

my $bw = File::ReadBackwards->new($html_file,"\n");

 

\nは、ダブルクォーテーションで囲ってください。シングルクォーテーションでは、\とnの文字列を改行として認識して、意図した動作をしません。

Perl readline() on closed filehandle

 普段は、あるディレクトリの下にファイルを作成していますが、今回、少しでも高速にしようと、RAMディスクのEドライブ直下に書き込みを行っていました。一度目は、ファイルのオープンからクローズまで正常に終了するのですが、再度、実行すると、再オープンに失敗し、タイトルのエラーとなりました。

修正前:

open(FD, "< E:text.log");

 

修正後:

open(FD, "< E:\\text.log");

 

PerlWindows版なので、ディレクトリの区切りには\を2度、重ねることは知っていましたが、ドライブとファイル名の間にも必要でした。

 

p.s.

また、しょうもないことで時間を食ってしまいました。orz

 

 

 

 

Perl Undefined subroutineが出たら、やってみたいこと

Perlのモジュールの中のサブルーチンを使用していますが、Perlを実行すると、「Undefined subroutine &main::サブルーチン名」と表示され、エラーとなる場合があります。

その時には、以下のようにソースを修正するとうまくいきます。

修正前:

use モジュール名;

修正後:

use モジュール名 qw(サブルーチン名);

または、

use モジュール名 qw(:ALL);

 

PerlでFusionTablesへのquery接続に成功

Google API ExplorerのRequestを参照して、query後にkey(api_key)を使用して、FusionTablesへweb接続すると、「401 Login Required」(Webでのリプライ)、「401 Unauthorized」(Perlでのリプライ)で失敗します。

webで接続する場合には、key(api_key)ではなくaccess_tokenを使用してください。

 

失敗

ttps://www.googleapis.com/fusiontables/v2/query?sql=select+*+from+FusiontableのId&key={YOUR_API_KEY}

 

成功

ttps://www.googleapis.com/fusiontables/v2/query?sql=select+*+from+FusiontableのId&access_token={access_token}

 

 

参照サイト:

Google APIs Explorer

Using OAuth 2.0 for Authorization to Fusion Tables in Web Applications  |  Fusion Tables REST API  |  Google Developers

 

 

Excelで図形を使用する時には

Excelで図形を使用する時には、「図形」と「図形の選択」を頻繁にクリックすることになるのですが、Excel画面の広さによっては、3,4クリックする羽目になり、大変非効率です。

例えば、ディスプレイ画面の半分の広さでExcel画面を表示させた状態で、「図形の選択」をクリックするには、「ホーム」「編集」「検索と選択」「図形の選択」と4クリック必要になります。

同様に、図形を選択する時にも「挿入」「図」「図形」「(図形)」と4クリックです。

そんな時には、「図形の選択」と「図形」コマンドを「クイック アクセス ツール バー」に設定すると、1クリックで済みます。

 

設定方法

1.「メニュー」で右クリックして、1行目の「クイック アクセス ツール バーのユーザー設定」をクリックします。

2.Excelオプション画面で、「図形」コマンドを選択し、「追加」をクリックします。

3.「コマンドの選択」で、「すべてのコマンド」を選択する。

4.下のリストから「図形の選択」コマンドを選択し、「追加」をクリックします。

5.「OK」ボタンをクリックします。

f:id:gaggit:20170918225415p:plain

設定後のExcel画面

f:id:gaggit:20170918230546p:plain

 

 

 

Perl Net::Google::DataAPI::Auth::OAuth2のインストール

前回、XML::LibXMLモジュールのインストールに成功したので、Net::Google::DataAPI::Auth::OAuth2のインストールを行ってみました。

cpanm Net::Google::DataAPI::Auth::OAuth2であっけなく、インストールできました。(一応、perldoc Net::Google::DataAPI::Auth::OAuth2でインストール確認)

Net::Google::DataAPI::Auth::OAuth2のSYNOPSISを再度、読み返すと、プロンプトから入力をたくしているので、どうやら認証コード(code)を自動で取得し、アクセストークンにできるわけではないようです。

 

 

参照サイト:

gaggit.hatenablog.com

Net::Google::DataAPI::Auth::OAuth2 - search.cpan.org

 

libxml2とXML::LibXMLのインストール

PerlのNet::Google::DataAPI::Auth::Auth2モジュールのインストールの前提条件として、XML::LibXMLモジュールが前提となってます。さらに、このモジュールの前提条件として、libxml2とXML::NamespaceSupport、XML::SAXモジュールのインストールが前提となっています。64bitで開発環境を整えているので、ここでは、libxml2の64bit版のインストールを紹介します。

XML::NamespaceSupport、XML::SAXモジュールのインストール

1.XML::NamespaceSupportとXML::SAXをインストールします。

cpanm XML::NamespaceSupport

cpanm XML::SAX

 

詳細は忘れてしまいましたが、--forceオプションで成功した気がします。

libxml2のインストール

1.下記の本家のサイトをクリックし、左側のRelated linksから「WIndows binaries」をクリックします。

http://www.xmlsoft.org/downloads.html

 

2.「Getting the Binaries」の章の1行目にある「download area」をクリックし、ftpサイトの「64bit」をクリックします。

 

3.拡張子が7zであるlivconv,libtool,libxml2,libxslt,mingwrt,openssl,xmlsec,zlibをダウンロードし、ファイルを解凍します。

 

4.64bit shared zipのファイルをダウンロードし、拡張子が7zであるlivconv,libtool,libxml2,libxslt,mingwrt,openssl,xmlsec,zlibを解凍します。

 (解凍には7-Zipを使用)

 

5.解凍して作成されたフォルダであるbin,include,lib,shareをD:\usrにコピーします。

 

6.D:\usr\include\libxml2\libxml配下にあるヘッダファイルを一段上のlibxml2フォルダにコピーします。

 

7.gettext-toolsの64bitのshared版をダウンロードします。

 下記のURLから「Downloading gettext」の最下行にある「precompiled binaries for Windows」をクリックします。

https://www.gnu.org/software/gettext/

 

8.解凍して作成されたbin,lib,shareをD:\usrフォルダにコピーします。

 

9.システム変数のPATHにD:\usr\binを追加します。

 

 

XML::LibXML2のインストール

1.下記のリンクをクリックし、XML-LibXMLのモジュールをダウンロードします。

http://search.cpan.org/CPAN/authors/id/S/SH/SHLOMIF/XML-LibXML-2.0129.tar.gz

2.ダウンロードしたファイルを解凍します。

3.コマンドプロンプトを開き、解凍したフォルダに移動します。

4.以下を実行します。

perl Makefile.PL INC="-ID:\usr\include\libxml2 -ID:\usr\include" LIBS="-LD:\usr\lib" DEBUG=1 2>D:\temp\make.log

DEBUG以降の行は記述しなくても大丈夫ですが、デバッグがやりやすくなります。

5.dmakeを実行します。(1回目、エラーが出力されて終了)

6.D:/usr/lib配下のlibxml2.aを_libxml2.aにリネームします。

7.項番4.を再度、実行します。

8.dmakeを実行します。

9.dmake testを実行します。

 All tests successful.

Result: PASSと表示されます。

 

10.dmake installを実行します。

11.perldoc XML::LibXMLを実行し、インストールが成功しているか、確認します。

 

 

参照サイト:

www.opswat.com

http://www.xmlsoft.org/downloads.html