Perl

2017.11.28 study-daily

Setup OTRS

OTRSをインストールしてみた

オープンソースのチケット管理システム的なもの主にサービス・サポート部署で使うようなもの

セットアップ

環境はUbuntu16.04

基本はダウンロードしてきて実行するだけ。 本体はWeb公開領域におけばいいかな?

つまったところ

  • anynevを使おうとして詰まった、anyenvをシステムワイドに使う場合は割り切ってrootで設定する
  • plenvをインストールすることはすんなりいくが、モジュールパスなどで使おうとすると詰まる
    • ->システムのperlを結局使うことに
  • cpanmでDBD::mysqlをインストールする場合、以下の事が必要
    • 先にMySQLがインストールされていること
    • Ubuntuの場合はlibmysqlclient-devがインストールされていること
  • というか/opt/otrs/bin/otrs.CheckModules.pl の実行で必要なモジュールが確認できる
  • モジュールが依存するライブラリも存在するので合わせて入れること

感想

domainやメールの設定がちゃんとできていれば特に躓くこと無くセットアップできそう。 最終調整?セットアップがGUIのため、Ansibleでセットアップとかは難しそう。

[Read More…]

fmxj.js のサーバーサイドをPHPじゃなくてPerl(Mojolicious)で試す

先日、SeedCodeの方がFileMakerのCustom Web Publishing の為のJavaScriptとServer side で使うPHPのサンプルをGithubで公開されてました。

https://github.com/seedcode/fmxj

概要としては、FileMaker Server の XML公開を使う。

Web公開エンジンにXML公開のためのリクエストをJavaScriptで生成してサーバーサイドスクリプト(SeedCodeのサンプルではPHP)にpostする。

◆ハマった事:サンプルPHPの内容

サンプルのPHPをよく読んでなかった。。。

JavaScriptからFileMakerのユーザーアカウントとパスワードをpost出来るようにキーバリューを元々のpostデータに加えている。それから本来のpostデータからおまけを除くための追加分のパラメータ文字数もpostに加えている。この辺りの仕様にもんりょりする。

-db=dbname&-lay=layname&-query=(q1)&-q1=Status&-q1.value=Vendor&-findquery みたいな通常のクエリデータに

u=undefined&p=undefined&l=コンテンツの文字数

ていうのがくっついてPHPにpostされてくる。

それをPHP側でphp://inputでリクエストのボディを取得して余計なパラメータを削ってpostデータを作り直してcurl使ってPOSTしてた。

そこに気づかずperlで再現しようとした時にpostデータを丸投げしてエラーになってしまっていた。

なんでpostデータをわざわざこねくり回してるんだろう?て思ってた。

サンプルって事でいろいろハードコーディングされてるけど、気にしない。

◆ハマった:Nginxの設定

欲をかいてPerlでサーバーサイド書くにあたって、FastCGIでさらっと書くじゃなくてMojolicious使うことにしたら

WebServer→Nginxでバーチャルホスト(hoge.sample.comみたいな)とmorboで127.0.0.1:3000で動くMojoliciousになって、何が起きたかって言うとクロスドメインの問題が発生してしまい、エラーになる。

これについてはNginxの設定でproxy_passでMojoliciousにリクエストがリバースプロキシされるようにして解決。

しかしNginx、デフォルトではContent-Typeの書き換えができず、JavaScriptにレスポンスされるデータがXMLになっていなくて、意図する結果に終わらない。既にあるヘッダーに値を追加する処理を行ってしまう。

※Nginxで add_header Content-Type ‘application/xml’してもmime-typeの設定ファイルに追記しても

 Content-Type text/html;charset=UTF-8に application/xmlの値が追記されるだけになる。

その結果、fmxj.jsがXMLHttpRequestのresponseXMLに値がセットされない。そしてresponseXMLがあるの前提になっているXMLをパースする処理のところで結果が空欄になって処理が終わってしまう。

最初fmxj.js内部を書き換えて(responseTextをXMLに変換して)みたんだけど、コアのライブラリを触るのはよくないので、Nginxでちゃんとヘッダを書き換えられる方法を調べる、nginx-extrasを追加でインストールするとmore-set-headerというのが使えるようになり、ヘッダーの書き換えができるようになるとの事だったのでインストール。

自分はUbuntuの環境なので、

sudo apt-get install nginx-extras

後はNginxの設定ファイルに(厳密に言うとリクエストを受け付けるLocationディレクティブで)

more_set_headers ‘Content-Type: application/xml; charset=UTF8’;

を追記、more…がヘッダーの追記ではなく書き換えなのでcharsetも忘れずに書く!

これでようやく、Sample.html → fmxj.jsを使ってServerにpostリクエスト → 受けたリクエストをNginxがMojoliciousを動かしてるmorboにリバースプロキシ → MojoliciousがPOSTリクエスト受け取りXML公開のクエリパラメータ付きURLを生成して(生成しなおして)cURLをラップしたライブラリからPOST送信 → JavaScriptにレスポンスが返り、完成。

[Read More…]

Ubuntu14.04 LTS でNginx FasCGI Perl

古いPerlのサンプルを参考に復習したくなって、やむなく自分の開発環境にFastCGI環境をセットアップ

最初、コードが間違っているのに気づかず3日ほどあれこれ調べまわっても解決せず時間を浪費した。

502 bad gatewayのエラーでて、ログを見ると Cannot execute script って出てて、調べても分からんし、権限は間違ってるはず無いしでずっとつまずいてた。

結局、

sudo apt-get install fcgiwrap

※もしかしたら libgcgi-perlも必要?でもなんか下記のfastcgi-wrapper.plを使う場合に必要なやつかも
/etc/init.d/fcgiwrap のFCGI_USERあたりを動かしたいユーザーやグループに変更。※お好みで

sudo sysv-rc-conf on fcgiwrap
sudo service fcgiwrap start

でFastCGIが動くようになる。
最初、fastcgi-wrapper.plを使う場合を参考にしてたけど、
参考:http://ubuntu.flowconsult.at/linux/nginx-perl-fastcgi-installation-ubuntu-linux-14-04/
これだとなんかPerlのみっぽかったしTCPだったので、Unixソケットで通信にしたかったのとpythonやRubyでも動かしたかったのでfcgiwrapを使うようにした。

Nginxの設定はlocationディレクティブだけ抜粋すると

#拡張子が.plで終わるリクエストの場合
location ~ \.pl$ {
    try_files $uri = 404;
    gzip off;
    #インストールしたfcgiwrapのソケットファイルのパス
    fastcgi_pass unix:/var/run/fcgiwrap.socket;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    #/etc/nginx/fastcgi_paramsの内容を読み込む。
    include fastcgi_params;
}

[Read More…]

2014.12.30 study-daily

2014年を振り返る サーバーサイドプログラミング

サーバーサイドプログラミング(Perl,PHP,Python,Ruby,etc…)について振り返る

まず、コンパイルする系の言語には全然手を出さなかったのでノーコメント。

Groovyはちょっとだけ久しぶりに触ったらバージョンが上がってて言語仕様変わってた箇所でトラブった。

Perl,Python,Rubyについては全然触れなくてフラストレーション。

PHPは少し触ってたけど、使用バージョンがPHP5.4→PHP5.5→PHP5.6といろいろ触ってその間の言語仕様の変更に惑わされたりした。

本当はテストコードがしっかり書けるようになりたかったけど、いろいろ自分が足りなくて駄目だった。

家にたまった古い書籍も含めて処分していきたいので2015年はバシバシコードを書捨てていきたい。

PHP7が来年だか再来年にリリースされることによって現場には相当バージョン違いのプロジェクトが出てしまうと思うので、できれば新規案件は

枯れたPerl5系かPython3系(サポートがだいぶ長引くことになった2系も場合によっては)でチャレンジしたい。

Rubyは…どうだろう。試しやプロトタイプにはいいのかも、ただしSinatra限定。ツールはRuby系が多いのでRubyでいろいろ学習してから他の言語のものを使うようにするといいのかもしれない。

[Read More…]

2013.12.22 study-daily

パスカルのなんとか

今回は、パスカルの三角定理?みたいなやつ

PHPでは、

Perlでは、

Pythonでは、

Rubyでは、

Rubyはもっとシンプルな書き方があるのかもしれない。

[Read More…]

2013.12.08 study-daily

コーディングリハビリ06

リハビリその3

今回は、バブルソート

PHPでは、

Perlでは、

Pythonでは、

Rubyでは、

習熟度が低いのでPerlとPHPが同じ内容になる。

pythonが好みだけど毎回2つリストを生成してmapしてるのでコスト高そう。

すんなり1つのリストだけでできないものか……

[Read More…]

2013.12.08 study-daily

コーディングリハビリ05

昨日の文字チェックをPHP以外で試す。

与えられた文字列が全てユニークな文字で構成されているかのチェック。

PHPは前回やっているので、今回は掲載無し。

Perlでは、

Pythonでは、

Rubyでは、

文字列のまま操作するなら指定の文字が同じ位置にあるのか先頭から検索と最後尾から検索でインデックスが同じか調べる。

配列で操作するなら、重複不可の配列を作って要素数が変わってないか調べる。

pythonが一番スッキリしているようだけど、やっぱりRubyかな

[Read More…]

2013.12.06 study-daily

コーディングリハビリ03

リハビリその3

今回は、バブルソート

PHPでは、

Perlでは、

Pythonでは、

Rubyでは、

Rubyが一番スマートかな

[Read More…]

2013.12.06 study-daily

コーディングリハビリ02

リハビリその2

今回は、ファイル読み込みとその時の簡単な例外処理

読み込むテキストファイルの内容は以下の通り、

PHPでは、

Perlでは、

Pythonでは、

Rubyでは、

うるう年の判定処理は適当。pythonが一番しっくりくるかな。

[Read More…]

2013.12.06 study-daily

コーディングリハビリ01

一定時間未満の習得状態だと、日々使ってないとすぐ書けなくなりますね。プログラミング言語というのは。

paizaなんかの超初級問題も関数のリファレンスとか見ながらじゃないと全く解けない。

という事でリハビリ。

今回は標準入力。

PHPでは、

Perlでは、

Pythonでは、

Rubyでは、

標準入力が「gets」だけで取れるRubyはダンディ。

[Read More…]