伊藤清徳の垂直落下式ムーンサルトプレス

PerlとかPHPとかMySQLとか...がんばっても8割だ。

Category: perl

CentOS7+PleskOnyxな環境でのはまりごと

CentOS7 + PleskOnyxな環境をはじめて借りてハマったことをメモ

イニシャルではApacheモジュール版PHPがうごいていない

Pleskではすこし前のバージョンから

  • PHPの動作モード
  • PHPのバージョンを選択

できるようになっていますが、PleskOnyxでは、PHPの動作モードが

  • FAST CGI
  • FMP

のみになっており、あれ?Apacheモジュールは???となりました。
サーバーを借りたクララオンラインさんに、サポートをおねがいしたところ
http://faq.clara.jp/index.php?solution_id=1350
をご紹介くださいました。なーるほど。Pleskはもともといろーんなものがモジュール化していますが、
mod_php自体もモジュールなんですね。


CPANモジュールが共通ライブラリディレクトリにインストールできない

sshでログインした際に自動的に環境に

  • PERL5LIB=/ユーザーディレクトリ/perl5/lib/perl5:
  • PERL_MB_OPT=–install_base /ユーザーディレクトリ/perl5
  • PERL_LOCAL_LIB_ROOT=:/ユーザーディレクトリ/perl5
  • PERL_MM_OPT=INSTALL_BASE=/ユーザーディレクトリ/perl5

がセットされる。
これに気づかずに3時間なやんだ。とっとと
perl -V
してれば気づいたのに。。。

これら環境変数を削除した上で、CPANインストールすればよろし。


cgi-binディレクトリが有効になっていない

まぁPerl/CGIとかRuby/CGIとかやんなやって話ですが、昔の枯れた技術というのはとても有用でしてね…
で、イニシャル状態では、公開ディレクトリにcgi-binディレクトリがあって、
そっちが有効になっているんです。昔良くあった構成

/ユーザーディレクトリ/cgi-bin/
/ユーザーディレクトリ/httpdocs/

って言う構成がとれないわけです。
ので、ふるいサイトを移行するとちょっとめんどい。

/ユーザーディレクトリ/httpdocs/cgi-bin/

の中に格納すればいいわけですが。


1個1個はどうってことない話ですけど
勘がない環境だとハマりますね。って言うメモです。

WordCamp → ゆるPerl → WordCamp

今日はWordCampNagoyaの開催日
 
9時から名古屋におけるサイト解析第一人者である運営堂森野代表のセッションがあるということで、普段10時起床の私にとっては、かなりの早朝の7時起床でいってきました。

Google Analyticsに関してのセッションでした。
私が生業としているECの世界においても解析は重要なのですが、Google Analyticsは使ったことがありません。
慣れなのでしょうが、とっつきにくくて…。
と、思っていたら、その解析業務を助ける、GreaseMonkeyの存在を話されていて、これがあれば使える!と思いました。行ってよかった。
Wordpressに直接関係する内容ではないものの、WordpressをはじめCMS各種って、運営に焦点をあてたシステムにも関わらず、実は制作サイドの意識としてはサイト構築ツールまでで終わっていることが多いですよね。良くも悪くも。
解析の話を通して、運営面に少しでも目が向くのならと思いました。
 


その後、MightyWorksさんの「Wordpressとは」というセッション。
Wordopressを紹介するセッション。
かなーりWordpress愛を感じるセッションでした。
 


 
次、WordCampを抜け、ゆるPerlに向かう。
初期メンバーに名を連ねながら、初めての参加。
 
おーい。色々緩すぎるぞ!いつもはこれでいいけど、たまには、目的意識をもった会をやったほうがいいぞー。
 


 
またWordCampに戻る。起きてたのにバスを乗り過ごすという、荒業を成し遂げてしまいました。
 
LTセッションでは、お友達のマイペースクリエーターKさんが話をするということで、まじまじと見る。完全初心者向けのWordpressテンプレートを公開したということで、それについて発表しました。おぉ。なんか、みんな良い反応!
 
横浜のWordCampのUstで見てめちゃ面白かった、め組のメガネさんのセッションもありました、こちらもWordpress愛を深く感じ、なおかつ面白いセッションでした。め組さん。普段お世話になってます。
 


大体こんな感じ。その後懇親会→二次会。
 
全体通じて思ったのは、Wordpressって情報がいっぱいネット上には転がってるんだけど、やっぱりオープンソースゆえ隠れた情報も沢山ある。オープンソースの利用にあたっては、コミュニティに参加することが、情報を集める上で一番良い手段で、かつ、コミュニティに参加して恩返しをすることへの意識が必要なのではと思った。その辺がプロプライエタリとの大きな差かな。
 
私は、普段一般のWEB制作の世界とは違うところで、サイト制作を行っているので、必ずしも、Wordpressが最上位のパブリッシングプラットフォームだとは思っていない。(これは立場の問題なので、この部分を突っ込まれるとちょっと困るので、聞き流してくださいね)
それでも、これだけ沢山のユーザーがいて、これだけ沢山のコミュニティ参加者がいるWordpress。常に選択肢の中には入ってくるとは思う。
 
まぁ、そんなこんなで、WordCampお疲れ様でした。
最後に謝っておきます。若干立場的に微妙な人が参加しててごめんなさい。(分かる人が分かれば良い謝罪)
 


 
あ、ゆるPもまとめなきゃ。
 
参加者の初心者の方に少しだけレクチャーさせてもらったんだけど(WEBでの利用に関して)、PHPに最初に手を出しては理解をせずに、飛び込んで行けてしまうHTTP関連の仕組みや仕様とかを、Perlにおいては、理解を持ちながら勉強をする必要があるなと実感。
諸先輩方がプログラミング初心者がPHPでプログラミングを学ぶことへの批判はこのあたりにあるんだろうなと。
 


そんなこんなで一日終わり。疲れたぞ。

Windows7でPDK起動できない問題。

私はPerlで仕事を始めたので、扱っている言語の中では一番Perlが得意。
 
なので、スタンドアロンアプリはもとより、DLL(COM)もPerlで作る。
ActiveStateのPerlDevKitを使えば、こんなことができてしまうんだ!
 
先日、仕事のWin環境を7(64bit)に移行した。
もちろんPDKもインストール。
 
XPの感覚でショートカットでPDKの各ツールを起動しようとすると、、、、起動できない。

えー。自分でショートカット作っても動かない。
 
えー。どうしたもんかと、インストール時自動で作られた各ツールのショートカットのプロパティを覗いて、「リンク先」をコピーして、コマンドラインから起動したらうまくいった。
 
うわー。いちいちコマンドから起動せなあかんのか・・・。
 
ということで、私は、得意のなでしこからコマンド起動するアプリを作っておいて、それをランチャーとスタートメニューに登録することで解決。
コマンドランチャーに登録してもいいかもね。
 
ActiveStateの公式を読むと、ショートカットをVista互換モードで起動するといいよみたいなこと書いてあったけど、嘘っぱちでしたので注意。

PerlでCSVを扱う

PerlでCSVを読み込むメモ。

これまで私は、
こちらのサイトを参考に正規表現だけで処理していました。

速度が云々あるでしょうけれど、そもそもそんなに速度が気になるのならCSVじゃないデータを使うべきでしょう。ということで、これだけで十分です。

※なお、CSVデータは完全にアプリケーション依存のデータフォーマットで入出力するアプリケーションによって形式が異なります。この記事ではMS-AccessのCSVを前提に書きます。エクセルも問題ないと思います。それ以外のアプリケーションでの動作は考慮していませんので、必要に応じて書き換えて使ってください。


ですが、CPANのモジュールも活かさないとそれはそれでもったいないので、今回はそちらを使ったときのメモ。

いくつかのモジュールがあり、中には数々の文字コードのCSVの処理を考慮したものもありますが、エクセルでの出力で最も多いであろうShift-JISのデータを扱うには、Text::CSVをバイナリモードで使うのが一番トラブルが少ないようです。

じゃぁやってみよう!

use strict;
use Text::CSV;
use IO::File;


#CSVファイルを開きます。
my $file = "CSVのパス";
my $io = IO::File->new( $file, 'r' );

#解析をはじめましょう。 my $csv = Text::CSV->new({binary => 1});
while (not $io->eof and my $columns = $csv->getline($io)) {
#ここでデータを処理する。
#$columnsへ1レコード分のデータが配列への参照として渡されます。
#例:$columns->[0](1列目)
}
exit();

こんな感じ。意外にベタベタと書かないといけない。
Text::CSVは標準モジュールではないので、インストールが必要なことを忘れずに。


ちなみに、Text::CSV::Simpleというモジュールもありまして、こちらを使うと、全CSVのデータを一気に二次元配列として処理してくれます。さすがにこれはデータ量を考えないとアレですが、便利は便利です。合わせて覚えておきたいです。

Perl Date::Calcの基本メモ

とても面倒な日付・時刻計算をPerlで行うためのCPANライブラリ。
それがDate::Calc。

調べたら、なんだか直訳調っぽくて「何言ってんだか?」みたいなとこしかなかったので、
今回使った部分だけメモ。

use strict;
use Date::Calc qw(:all);   #UNIXタイムスタンプの取得
my $time = Mktime( 2009, 6, 5, 12, 42, 44);
print $time . "\n";
#今の時間を取得
my ($year,$month,$day, $hour,$min,$sec) = Today_and_Now();
print "$year年$month月$day日 $hour時$min分$sec秒\n";
#日付のみ取得 ($year,$month,$day) = Today();
#時刻のみ取得 ($hour,$min,$sec) = Now();   #2008年6月1の30日前の日付を計算
($year,$month,$day, $hour,$min,$sec) = Add_Delta_DHMS( 2008, 6, 1, 0, 0, 0, -30, 0, 0, 0);
print "$year年$month月$day日 $hour時$min分$sec秒\n";
#引数
#[0]:基準の年 [1]:基準の月 [2]:基準の日
#[3]:基準の時 [4]:基準の分 [5]:基準の秒
#[6]:何日後(前はマイナス指定)を計算するか
#[7]:何時間後(前はマイナス指定)を計算するか
#[8]:何分後(前はマイナス指定)を計算するか
#[9]:何秒後(前はマイナス指定)を計算するか
#今を基準にして10日後の3時間15分30秒前を計算
($year,$month,$day, $hour,$min,$sec) = Add_Delta_DHMS( Today_and_Now() , 10, -3, -15, -30);
print "$year年$month月$day日 $hour時$min分$sec秒\n";
#第6引数まではToday_and_Now()を使える。 #日付のみの計算 ($year,$month,$day) = Add_Delta_YM($year,$month,$day, $Dy,$Dm);
#時刻のみの計算 ($year,$month,$day) = Add_Delta_YMD($year,$month,$day, $Dy,$Dm,$Dd);
#日付のみの計算 ($year,$month,$day) = Add_Delta_YMD($year,$month,$day, $Dy,$Dm,$Dd); #時刻のみの計算 (
#日付として正しいか?(リターンは1または0)
#↓不正
print check_date( 2009, 13, 1 ) . "\n";
#↓正常
print check_date( 2009, 12, 31 ) . "\n";
#時刻として正しいか?(リターンは1または0)
#↓不正
print check_time( 26, 12, 62 ) . "\n";
#↓正常
print check_time( 23, 59, 59 ) . "\n";

よく使いそうなところはこんなもん?

【一応メモ】
競合する関数名の関数を自分で作っているときは、競合してしまうので、
use Date::Calc qw(:all);

use Date::Calc;
に変更して、関数にDate::Calc::をつけて関数実行。

【すみません】
誤りがありました。日付の増減計算はありましたが、時刻のみの増減計算はありませんでした。修正しました。

PerlでSwitch

個人的備忘録

Perlで複数分岐がif{}elsif{}else{}しかないのが不便だなー

Switch文使えないかなー

とか思ってたら、Switchというモジュールがあることを知った。

すげぇ。PerlでSwitch使えるじゃん!って思った。そしたら、5.8.0から標準モジュールだったんですね。

知らなかった。情けない(>_<)

ちなみにAcme::Commentモジュールを使うと、Cの/*—*/スタイルの複数行コメントが使えるよ。まぁ=pod — =cutスタイルで十分だけど。

Jcodeのハイフン?が文字化け

先日、クライアントさまより、UTFのとき全角ハイフンがおかしくなるよ!と連絡。

そ・・・そんなはずは(-_-;)、と思って調べたら本当でした。

その対策方法をメモメモ。

どうも、Jcode.pmのtrを使って

全角マイナス記号「-」(コードでは、\xE2\x88\x92)
(※見た目はよく似ているけど、ハイフンでもないし、ダッシュでもないので注意。)
を半角記号へ変換するときに、
半角チルダ「~」になっちゃったり、
\x3Fという通常の環境で見ることができないコードに変換されている模様。

ってことで、Jcodeでtrしたあと、これらを無理やり「-」(コード\x2D)に変換することで対応。
本当にチルダが来たときどうすんだ!?という感じ。

だったので、さらに調べたら、

http://d.hatena.ne.jp/littlebuddha/20081121/1227241729

こちらのサイトにまとめがありました。のでまぁこの通り設定。
全角の扱いって難しいですね。

何か調べたら同じハイフンでも、
「ハイフン」「ノンブレーキングハイフン」「ハイフネーションポイント」…などなどあるんですって。
文系出身ダメプログラマーな私にはグルグルする話です。。。

PHPのmb関数でも同様の問題がおきます。
ので、ハイフンに見える文字についての知識はUTFを扱うときは必ず身につけておく必要がありそうです。

StrawberryPerlが良さげ。

WindowsでPerlならActivePerlだよなと漠然と考えていたが、こんな情報が!


MOONGIFTのStrawBerryPerlの情報ページ

早速使ってみたけど、普通にPerlとして使えるし、
CPANモジュールインストールしてみたけど、
X系OSと変わらないインストールができる!!
しかもPPMも普通に使えるらしい!
今度からこっちをインストールすべきだ!!

個人的には、PDKとか使ってるので全面移行はできないけど。。。
PDKのPerlSvcとかは激しく便利。。。

Perl5.8.0でJcode.pm

長いタイトル・・・。

use Data::Dumper;
my $str = 'ABC';
my $jhan =
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
. "0123456789!\"#\$%&'*+,./:;<=>?\@[\\]^_`{|}~-";

my $jzen = “abcdefghijklmnopqrstuvwxyz”
. “ABCDEFGHIJKLMNOPQRSTUVWXYZ”
. “0123456789”
. “!”#$%&’*+,./:;<=>?@[¥]^_‘{|}~-”;

my $j = Jcode->new();
$j->set( $str , ‘euc’ );
my $convert = $j->tr( $jzen , $jhan );
とかして$convertをDumper()にかけると

素直に変換された文字列がdumper()されるわけじゃなく、

Jcodeにblessされたという内容が書き出される。

この値をファイルに保存したときにゃあ(>_<。)

スマートじゃないけど、

$convert = “” . $convert;

って書き加えたほうが良さげ。

PerlでCOMポート(Windows)

ActivePerl使うと、ファイルオープンな感覚でCOMポートから流れてくる文字を受け取れるらしい。

#!C:/Perl/bin/perl.exe -w  use strict;  open( my $port , "+>COM3" ) || die "Can't open COM3: $!"; while(){   my $serial = $port;   print $serial; }  __END__

こんな感じ。
マルチスレッドとかにして、ファイルハンドルをフックすれば使えるアプリができるかも??