スキップしてメイン コンテンツに移動

投稿

11月, 2018の投稿を表示しています

意外とめんどいPHPからshellとかexecをWindowsでする場合の話。

いや、意外とめんどい話でした。 たとえば、CMD(BAT)ファイルで以下を実行させてみます。 ●TEST.cmd● REM ------------------- start a.exe start b.exe REM ------------------- pause そう、a.exeもb.exeも実行され、終了を待つことなくpause入ります。 そう、じゃぁ、phpで、以下をやってみます。 shell_exec('TEST.cmd' ); あれこれ とか exec('TEST.cmd' ); あれこれ すると、どうでしょう。 このa.exeとb.exeが両方終わるまで、待たされてしまい、 【あれこれ】のとこに来てくれません。 やりっぱなし! ができないのです。 うぅーん。LinuxでPHPならforkとかできる(ハズな)んだけど。 どうなってんだろ。これ(>_<) ここ、トリッキーないかがわしいことやればできるのかもしれないけど (できないかもですが^^;) つきつめるとこじゃないので、 どうせ最後はC++にするつもりなので、Jobコントローラーの部分なので、 素直にC++で描いてしまおうかとも思ったけど、 いろいろ調べた結果、psexecでできそうな感じもしたんだけど、 やってみるとできない。うぅーーん。 できるかぎりPHP という方針、若干、無理があったかな^^; じゃぁ、ってことで、プロセスを立ち上げっぱなしで戻ってくるEXEを作ってみた結果、 CreateProcessだと戻ってこない ShellExecuteなら戻ってくる ということがわかったので、そういうEXEを経由し、 exec("redshell -proc:php.exe z.php"); exec("redshell -proc:php.exe z2.php"); って感じで連続実行させるテストをしてみます。 ●a.php <?php exec("redshell -proc:php.exe z.php"); exec("redshell -proc:php.exe z2.php"); for($...

USBカメラで撮影して、WebSocketで転送する

シナリオとして、USBカメラで静止画を連続撮影してそれを送り付けるように考えたときに、どのように実行されるかを考えます。 まぁ、この点、さすがにPHPで作成するわけではないので、 WindowsとRaspberyyPiと作り方は大分違うことになります。 Windowsでは、OpenCVを使うとラクなので、 ここらへん  あたりを参考に、画面表示なんかを取り除いてプログラムを作成します。 作成したのが、 これです。 そして1枚撮影して転送する場合と、 例えば1秒毎に撮影して転送しつづける場合を考えます。 今回は、プログラムを作りこむことに主眼を置いてないので、 撮影するプログラムと転送するプログラムを別に考えます。 そうすると、以下の通り、 1枚のときはシーケンシャルに処理を2つつづける 転送しつづける場合には、処理を並列に処理する。 な感じで考えてみます。 つづく

DHCPで割り振られた同志のIPを知るいかがわしい方法。

このProject、魔法のハコサーバを管理するために、 管理PCからPrivateIPで管理したい。 一般に考えれば、IPが何かもわからない人でも使えるようにするシステムが目標なので、 どうするか。 一番まっとうな方法は、管理側でブロードキャストのUDPでそれに応答させるって方法。 でもこの方法、管理PC側にプログラムが必要。 WIFI接続のプリンタとかね、家庭内NASとかね、、たぶん似たような方法で管理してると 思われます。 でも、管理のPCって、、ブラウザは必須でもよいけど、、 管理プログラムを作るとなると、、 少なくとも、Windows用、さらにMAC用、場合によってはスマフォ用が必要だし。。 だからこんなのブラウザ一発で済ませたい。作る方としては。 さぁどうする。 でもちょっと考えればわかる。 ブラウザである限り、セキュリティ的に無理がある。 プラグインなんてもったのほかだし。。 ってことで、絵を描いてみて気づいた。 そもそも、MHSはWebServerにつなぎにいくのだから、 管理PCもブラウザでWebServerに接続すればいい。 そして、MHSがWebServerにつなぎにいったときに、GlobalIPとLocalIPを送信して、 WebServer側に管理させる。 そして管理PCから、【同じGlobalIP】でアクセスすれば、MHSを見つけられるので、 そっからLocalIPをとってくればいいんじゃ? ってことで、やってみます。 絵に描くとこんなで。

魔法のハコ-JOB-Ticketについて

JOB Ticketというのは、元々の私の専門分野(DTPワークフロー)で使われてた言葉で、 まぁ作業票みたいなものと思ってくれればよい。 【こんな作業をする】 という票を読み取って、その通りに実行したり、途中のステータスを管理したり、 まぁそんな感じのものだ。 で、今回の魔法のハコProjectでは、なんらかの作業を実行させる際に、 Ticketを発行し、それを読み取って実行するプロセスが実行させたり、実行命令をかけたりするというものだ。 因みにI/Oだが、HotFolderというベタな方法をとる。 長年の経験則に基づき、 【HotFolder型は、エラー処理やステータス管理をキッチリやれば意外と最強】 ということなのだ。 特にメンテナンス、障害対応等が非常にやりやすく、テストもデバッグもやりやすく、開発効率も良く、 実装も簡単で、信頼性もそこそこあるのだ。 HotFolder型ががベタなファイルのI/Oというだけで信頼性をとやかく言う輩もいるけれども、 いくらたいそうなDBを使おうが、最終的にはファイルで管理してるわけなので、正しく扱えば信頼性は変わらない。 まぁ今時なので、ハンドリングのしやすさから、JSON形式とする。 たとえば、、 { "type":"execute" ,"pg":"camerashot.exe" ,"status":0 ,"args":{ "v":1 ,"interval":5 } ,"retvalue":{ "type":"stream" ,"mime":"image/jpeg" } ,"retstatus":0 } こんなTicketを受け取ったJOB-Ticket実行プロセスが、 camerashot.exe を引数v=1&interval=5 で実行させ、JPEGstreamを戻すみたいなものだ。

魔法のハコCLIENTに写真を撮らせて転送させる。

RaspberyyPiに写真を撮らせてスマフォで見るだけなら、家にサーバを立てれるなら簡単だが、 汎用性をもってレイヤ分けをして実行するとなると、段階がいくつ増えてちょっと面倒になる。 まず、写真を転送する後のフェーズから考察しよう。 魔法のハコCLIENT(以下、MHC)に実行命令が出て、写真を撮ったとする。メモリ上のtmpあたりに保存したとしよう。 そしてこれを、順番で言えば、魔法のハコSERVER(以下、MHS)に転送することになる。 ここは、MHC→MHSへ、WebSocket転送する。 まぁもちろんUDPという選択もあるにはあるけど、ここでもWebSocketにしておく。 ここでデータを受け取ったMHSが今度はWebServerに対してWebSocketする。 そして最後に、スマフォのブラウザにWebSocketするという流れとなる。 よって、 【MHC】→(WebSocket)→【MHS】→(WebSocket)→【WebServer】→(WebSocket)→【スマフォ】 という、WebSocketリレーになる。 さて、それぞれのWebSocketがいつ作られるかと言うことになる。 こんどは、逆に見ていこう。 ■1■ 【スマフォ】←→【WebServer】 スマフォからWebServerを経てHTMLが画面上に表示されるとともに、javascriptもLOADされ、 ここでWebSocketが生成される。 よって、実は、そのjavascriptはWebServerでなくて、localhostでも理論的には成り立つ。 javascriptの中からWebSocketするのだから。 よって、 スマフォ→WebServer にconnectionを張りに行く。 ■2■ 【WebServer】←→【MHS】 MHSの起動時に、WebServerに向かってConnectionを張る。 よって、 MHS→WebServer にconnectionを張りに行く。 ちょっと考えたらわかることであるが、 1も2も、WebServer側からスマフォにもMHSもConnectionを張ることは構造的に不可能なのだから、 当然このような方向となる。 ■3■ 【MHS】←→【MHC】 これはどちらが...

自分のIPを知る方法。いや、だからLOOPBACKとかじゃなくて。

自分のIPを知る方法。 開発は、基本的にWindows10上でやってます。 ただ、なるべく、 if (PHP_OS == "WIN32" || PHP_OS == "WINNT") とか書きたくないわけですね。 とはいえ、 $IP = getHostByName(getHostName()); なんて書いていたら、、LINUX系だと、 【127.0.0.1】が返ってきてしまいました。 Windows上のPHPだとちゃんとIPとってきてくれますが。 ということで、簡単にやる方法をさがしたのですが、 いくつかありました。 ひとつめ。 ちなみに、[1.1.1.1]と書いているものの、外へは出ていかないハズです。 別に、[8.8.8.8]とかでもいいわけですが。 $sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); socket_connect($sock, "1.1.1.1", 53);//APNIC socket_getsockname($sock,$name); $IP = $name; ただし、若干問題がありまして。 DHCPでつないだあとに、ケーブルを抜いても、 過去のIPが戻ってきたりしました。 うぅーん。どうしよ。 ふたつめ。 これは強引です。 ip addr show のコマンドをリダイレクトして読んでます。 shell_exec('ip addr show > a.txt'); $a = file_get_contents("a.txt"); if(preg_match("/(?!inet 127\\.0\\.0\\.1)inet [0-9]*[0-9]*[0-9]*\\.[0-9]*[0-9]*[0-9]*\\.[0-9]*[0-9]*[0-9]*\\.[0-9]*[0-9]*[0-9]*/",$a,$match)){ $IP = substr($match[0],5); } unlink("a.txt");