PHP
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にレスポンスが返り、完成。
Ubuntu14.04 でphpでメール受信とか
## install postfix
“`
sudo apt-get install postfix postfix-dev sasl2-bin
sudo apt-get install dovecot-core dovecot-dev dovecot-pop3d dovecot-imapd dovecot-gssapt
“`
## Settings
“`
sudo cp /usr/lib/postfix/main.cf /etc/postfix/main.cf
sudo emacs -nw /etc/postfix/main.cf
“`
### 参考
– http://www.server-world.info/query?os=Ubuntu_14.04&p=mail
– http://www.server-world.info/query?os=Ubuntu_14.04&p=mail&f=2
### gmailに転送する設定に変更
relayhostにgmailを指定
パスワードの設定とかね。
## phpでメールを受信出来るよう設定
メールサーバ受信DNS設定とか面倒だからやめた。
phpinfoを見ると案の定imap入ってませんでしたので、php5.5系の落としてきてimapのディレクトリ移動してphpize
### configureで失敗する
configureしたらutf8_mime2text()がうんたらと出てきた。
ググると、どうもphpにimapとかメール関係入れる時にライブラリが足りないと出るエラーのようだ。
sudo apt-cache search libc-client
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でいろいろ学習してから他の言語のものを使うようにするといいのかもしれない。
新しく開発環境作成中
Ubuntu14(64bit)のVM作成
-
イメージからVMWareFusionに作成
-
ホームディレクトリ以下のディレクトリ群が日本語なので英語名に変更
-
ターミナルから LANG=C xdg-user-dirs-gtk-update を実行 LANG=C xdg-user-dirs-gtk-update
-
設定画面が出てくるので、そのままOK
-
-
VMWare toolsをインストール
- VMWareのメニューバーからインストールってやると仮想CDがマウントされるのでデスクトップあたりに展開
- 展開したディレクトリの中に入ってインストール実行
-
aptのアップデートとアップグレード sudo apt-get update
sudo apt-get upgrade -
Dropboxクライアントのインストール
- FirefoxでDropbox検索してログイン→クライアントツールをダウンロードしてインストール
- Dropboxを入れる理由は次のEmacsの設定ファイルをDropboxで共有しているから
-
Emacsのインストール sudo apt-get install emacs24
- Dropboxにある設定ファイル群(emacs.d)のシンボリックリンクを作成
- 作成したシンボリックリンクの名前変更 ※ダイレクトに.emacs.dのリンクを作成だとうまく行かなかった
ln -s ~/Dropbox/emacs.d ~/emacs.d
mv ~/emacs.d ~/.emacs.d
-
バージョン管理のインストール sudo apt-get install git
sudo apt-get install mercurial
PHPのファイルアップロードについて
PHPで大きなファイルアップロードを作成する
・Webサーバー側でBody Max Lengthの指定で大きなサイズを指定しておきましょう。
・formのhtmlでenc-typeの指定はもちろん、hiddenでMaxFileSizeの値の指定、その後にinput file
・phpの設定でmax_file_size,post_max_size,タイムアウト、memory_limitなどの設定が必要
・Apacheのバージョンが古いと2だか4GBが上限。という噂。
・サーバーが32bitだとメモリを3.7GB?くらいまでしか扱えないらしいから5GBクラスの巨大ファイルはアップロード無理だと思われる。
PHPあべし!
最近PHP触ってて「あべし!」ってなった事。
PHP5.5でempty()の仕様が若干変わっているから注意。他人がPHP5.5で作成したものが自分の開発環境のPHP5.4だとエラーになるから調べてたら。php.netに書いてあった。ついでにPHP5.5で追加された関数とか増えてるの気づいた。
愚痴、FuelPHPのファイルとクラスの命名規則の関係はどうにかならないものか。
最近やったいろいろ
最近やったいろいろな作業。こまかく書くのめんどいから一つにまとめちゃった。
◆PostgreSQLのSQLダンプ
・sqlダンプコマンドして移行先で復旧コマンドで取り込み。楽ちん!
◆残念VBSバッチスクリプト
・サーバーのローカルでEscキーを送信するバッチ処理作ったけど、リモート等で開いてないと正常に動作しない
・windowsのコマンドでディレクトリ削除するコマンド
◆謎!IISの設定
・IISのRewrite設定
直接変更すると適用されない場合がある?わかりにくいGUIからRewrite設定
・DefaultWebSiteは外部からの通信を遮断して、仮想サイトだけが外部からのリクエストを受付け、
DefaultWebSiteにリダイレクトするやり方がある。
・IISの接続数制限はユーザー単位ではなく、リクエスト単位なので1ブラウザ6リクエスト位使うため、6の倍数で設定しないと、意図した制御に出来ない
◆Win8.1
・スタートパネルの左下にひっそりとアプリ一覧に移動するアイコンが。
・デスクトップやスタートパネルからwin+fで検索してもアプリ出てこない。
・win8でSQLServer2012のodbc設定がうまくいかない
解決していない。接続先サーバーが選択できない。何か設定が足りてないのかも
◆PHP
・古いやり方のPHP(PEAR使ってる)のinclude設定。ホントめんどい。
・PHPで頼りになるのはやはりPHP.net
・問い合せフォームやるとバランスよく覚える気がする(Javascript、css、php)。
確認レイアウトを制御phpが適宜incudeするやり方はスマートかもしれない。
※セッション制御が楽かも
・メール送信は確実なのはqdmail&qdsmtpなんだけど、遅い。
・メール送信はPHP5.3以降でiconvモジュールが無効になっていないならZendでいいやろ
※まさかのiconvモジュールが無効になっていると関連ライブラリでエラー出てZendMail使えない
・php5.4以降はセーフモード使えない
・システムレベルの操作を行う関数に影響が出るのでcgiで動かしましょう。
・ファイルのオーナーとかに気をつけましょう
◆Apacheの設定
・SSLのヴァーチャルホスト設定する時には証明書のパスを書く
・ReWriteEngineの書き方、.htaccessにリダイレクトの設定書こうとしたけど、うまくいかなくて
vhost.confの方に書いた
◆SSH
・SSHで認証鍵ファイルを使う場合の設定方法
ローカルで認証鍵を作成して、公開鍵をサーバーのSSHログインアカウントの~/.ssh/に放り込む
・~/.ssh/に設定ファイルを置いておくと楽
◆ポートフォワーディング
・1つ目のsshがリモートサーバーに対して22ポートで接続するが別のサーバーに任意のポートを転送する設定、
転送するポートは22じゃなくても良いので、3389転送してRDPとか出来る。
◆忘れちゃうからメモ(Linuxコマンド)
・scp
scp sourcefile remotehost target
◆emacs
・ssh→sudo or su root する方法
パスカルのなんとか
今回は、パスカルの三角定理?みたいなやつ
PHPでは、
Perlでは、
Pythonでは、
Rubyでは、
Rubyはもっとシンプルな書き方があるのかもしれない。
コーディングリハビリ06
リハビリその3
今回は、バブルソート
PHPでは、
Perlでは、
Pythonでは、
Rubyでは、
習熟度が低いのでPerlとPHPが同じ内容になる。
pythonが好みだけど毎回2つリストを生成してmapしてるのでコスト高そう。
すんなり1つのリストだけでできないものか……
コーディングリハビリ04
今回は与えられた文字列が全てユニークな文字の構成かどうか調べる。
そういう問題を出されてスマートに答えられなかったので、調べた。
1,回答した内容を修正したもの
2,PHPのリファレンス見てて思いついた方法
3,文字列のままチェック
4,PHPの関数とか出てこなくて回答できなかった、頭の中にあったロジックを具現化したもの
配列に変換してshiftしながらチェックする方法
どうも実行してみると2や3が早いようだ。1文字でもユニークでなければFalseにする3が内容によっては最速
やはり何回も配列を操作するとコストが高くなりますね。模範解答が欲しい。