MEMO
□dokanでLinuxサーバーのフォルダをマウント
by admin on 1月.11, 2012, under MEMO
dokanでLinuxサーバーのフォルダをWindowsでネットワークドライブとしてマウントしてみたらさっくり出来た。
現在GVC(Grobal Versatile Controller)の開発を続けているが、そろそろデーモンソースをサーバーにコピペしてあれこれするのが苦しくなってきた。
最初からLinuxでEmacsででも作っていればいいんだろうけど、あれこれするのにWindowsの方がよかったりするので、いままでPHP Editorを使っていた。
で、どうせならマウントすればいいか、と思ったけどSambaをリモートでするのにはちょっと抵抗があったのと、そこまで大げさにする必要なしなので、WinSCPで都度コピればいいかなぁとも思っていたけど、dokanというソフトがあるという事で、試してみたら意外と便利なのでおすすめかも。
インストール方法などはぐぐればいっぱい出てくるのでここでは割愛します。:-)
□LinuxでUstream(ffmpegで高解像度配信!?完結編)
by admin on 11月.02, 2011, under MEMO
LinuxでffmpegをFlash Media Encoder代わりにしてUstreamで長時間ストリーミングしたい…だれもが思うことですが、ぐぐって見れば、みんな数分でffmpegが落ちてしまって挫折しています。
…そうです、かくいう自分もそんな一人でした。
justin.tvでなんら問題なくストリーミングできていたので、まぁいいかぁとか思っていたんですが、なんとなく思い出して(そもそもはffmpegをコンパイルしたから)もう一度トライしました。
そして…たまたま、偶然にも、いや実際にはぐぐりながらカットアンドトライを何十回と繰り返していたのですが、本当に偶然にも解決しました。判ってしまえば何のことはなかったんです。
『なんだよFMLEって、Flash Media EncoderはFMEじゃんか』
答えはこうでした。(さんざんトライした人には判りますよね)
>… flashver=FME/3.0…
Σ(゚Д゚;エーッ! これだけかい!! (゚Д゚)ゴルァ!! ( ゚∀゚)アハハ八八ノヽノヽノヽノ \ / \/ \…ヤラレタ
> frame= 4529 fps= 10 q=5.6 Lsize= 44151kB time=00:07:32.80 bitrate= 798.8kbits/s
何人もの人がため息をついた2~3分をぶっちぎっているこの数値を見てください。
以上!!
※デモはhttp://livecam.pgw.jp/でやってます。:-)
※こちらに重大なヒントがありました!!気がつかせてくれてありがとう!!
□PHPでフォーム入力時の画像認証(CAPTCHA認証)を導入
by admin on 11月.01, 2011, under MEMO
登録、投稿、コメントなど、とにかくフォームを設置するとあらゆる方法で
機械的に登録してくる輩がいる。そもそも登録してもお前らには意味がない
のだといっても全く聞く耳を持っていない。そりゃそうだ、自動処理をして
いるのだから。
そこでその自動処理を防ぐために(DBその他に無駄な処理をさせないために)
フォーム入力時の画像認証(CAPTCHA認証)を導入したいのだけど、どれも懲り
すぎていたりするのであんまり気に入らない…ので自分で作りました。
スクリプトは二つ。
一つは「POST」で渡された文字列をPNG画像で表示するスクリプト。(keydata.php)
もう一つは、keydata.phpに対してどのように文字を渡し、どのように結果
の画像を表示するかのスクリプト。
前者は表示するだけのスクリプトだけど、POSTで渡さないといけないところ
がミソ。だってGETで渡すようにしたら簡単に機械処理されてしまうからね。
ここでは5文字を想定していますので、もっと長いほうがよかったり短い方
がよかったり、画像を合成したいとかさらに見難くしたいという場合には、
GDの処理をいろいろ調べてあれこれ加工して下さい。
後者は実際に普段の処理側のこと。生で送られてくるPNGデータをどうしたら
PHP処理内で表示できるのがあれこれ見てみたら、こんな方法がありました。
目からうろこでした。
ただ、IE6までは×(FFやChromeとかOperaならぜんぜんOK)というのと、携帯系
は全然使えませんのであしからず。(スマフォはいけました、Androidレグザで)
こちらは画像を表示する(出力する)スクリプト。
<?
// ------------------------------------------------------------
// POSTで送信された文字(または数字)をJPEGで返すスクリプト(画像側)
// 2011.11.01 T.Kabu/Future Versatile Group
//
// ・GDライブラリが組み込まれたPHPでないと動きません
// ・このスクリプトに対してkeydataという変数に文字を入れてPOSTして下さい
// ・読めば判るレベルですが、とりあえず5文字を想定しています
// ・フォントはあえて読みにくい文字にするといいと思います
// ここではYAKITORIフォントを使っています。
// http://www.forest.impress.co.jp/docs/review/20110117_420882.html
// ------------------------------------------------------------
?>
<?
// ------------------------------
// 初期処理
// ------------------------------
// 画像サイズ設定
$P_W = 128;
$P_H = 36;
// フォントサイズ設定
$F_S = 28;
// ------------------------------
// データ取得
// ------------------------------
// ポストデータでない場合には
if (!isset($_POST['keydata']))
{
$KEYDATA = 'ERROR';
}
// ポストデータ
elseif(strlen($_POST['keydata']) == 0)
{
$KEYDATA = 'NONE';
}
elseif(strlen($_POST['keydata']) < 3)
{
$KEYDATA = 'SHORT';
}
else
{
$KEYDATA = $_POST['keydata'];
}
// 画像パレットを生成
$IMG_P = imagecreatetruecolor($P_W, $P_H);
// 白色の背景、オレンジのテキストとして設定
$background_color = imagecolorallocate($IMG_P, 240, 240, 240);
$text_color = imagecolorallocate($IMG_P, 255, 137, 0);
// 背景を赤にします
imagefilledrectangle($IMG_P, 0, 0, $P_W - 1 , $P_H - 1, $background_color);
// ttf フォントファイルへのパスを設定します
//$font_file = '/usr/share/fonts/TrueType-vlgothic/VL-PGothic-Regular.ttf';
$font_file = './Yakitori.otf';
// フォントサイズ 13 で 'PHP Manual' というテキストを描画します
imagefttext($IMG_P, $F_S, 0, 3, $P_H - 3, $text_color, $font_file, $KEYDATA);
// ヘッダ出力(単独で呼び出された時などに上記メッセージの画像を出すため
header('Content-Type: image/jpeg');
// 画像データ出力(劣化させるとますます機械認識は厳しい…かな?
imagejpeg($IMG_P, NULL, 25);
// 画像データ破棄
imagedestroy($IMG_P);
?>
こちらは呼び出すほうのスクリプト。
<?
// ------------------------------------------------------------
// POSTで任意の文字を渡して帰ってきたJPEGデータをbase64エンコードで表示するスクリプト(呼び出し側)
// 2011.11.01 T.Kabu/Future Versatile Group
//
// ・ポストする方法はあちこちにあるけど、今回はこちらを参考にしました
// http://www.programming-magic.com/20080226023511/
// ・で、画像を表示するには…なるほど、こんな方法あったのねー、です。
// http://kaworu.jpn.org/kaworu/2008-04-06-1.php
// ------------------------------------------------------------
?>
<?
// 表示したいデータを生成
$KEYDATA = sprintf("%05d", rand(100,99999));
// 表示するデータのクリプトデータを生成
$CRYPTKEY = crypt($KEYDATA, 'HOGEHOGE');
// フルパスで「POSTで送信された文字(または数字)をJPEGで返すスクリプト(画像側)」を指定
$KEYDATA_URL = 'http://hogehoge.comm/keydata.php';
// 画像生成用のキーデータを設定
$REQUEST_PARAM = array('keydata' => $KEYDATA);
// リクエストを生成
$REQUEST_DATA = array('http' => array(
'method' => 'POST',
'content' => http_build_query($REQUEST_PARAM),
));
// 画像データをリクエストして帰ってきたデータをBASE64でエンコード
$BASE64_IMG = base64_encode(file_get_contents($KEYDATA_URL, false, stream_context_create($REQUEST_DATA)));
?>
<img src="data:image/jpeg;base64,<? print $BASE64_IMG; ?>">
<BR>
<BR>
<FORM action="./" method="post">
<INPUT type="hidden" name="CRYPTKEY" value="<? print $CRYPTKEY; ?>">
<INPUT type="text" name="CHECKKEY" value="" size="10" maxlength="5">
<INPUT type="submit" name="SUBMIT" value="CHECK">
</FORM>
<?
// クリプトキーとチェックキーがあるなら…チェックをする
if (isset($_POST['CRYPTKEY']) && isset($_POST['CHECKKEY']))
{
// クリプトチェックがOKなら
if (crypt($_POST['CHECKKEY'], $_POST['CRYPTKEY']) == $_POST['CRYPTKEY'])
{
print "チェックOKです!!<BR>\n";
}
else
{
print "違うみたいです!?<BR>\n";
}
}
?>
あとは必要に応じていろいろいじって下さい。
追記:2011/11.01 -1-
yum -y install php-gd
…忘れずに。(肝心のターゲットシステムに入ってなかった)
□メッセージキューの使い方(CとPHPでプロセス間通信)
by admin on 10月.20, 2011, under MEMO
C言語で作ったプロセス同士はもちろん、C言語で作ったプロセスとPHPで作ったスクリプト間でもメッセージキューであれこれやり取りしたい。手順としては、とりあえずC言語側でもPHPでも同じ。
http://www.fireproject.jp/feature/c-language/ipc/message-queue.html
より、メッセージキューの実験
semmainで作ったセマフォをsemotherでロック、すると別のsemotherを起動すると先に起動したsemotherが終わるまで後からのは待つ
cat > sendque.c
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
// バッファサイズBUFSIZは8192バイトもあるのでもったいないから1024にする。
#define BUFFSIZE 1024
/* メッセージキューで送受信するメッセージ
msgsnd,msgrcvの*msgpにはこの構造体へのポインタをいれる */
struct msgbuf{
/* メッセージの先頭はかならずlong int型でなければならない */
long int type;
char data[BUFFSIZE];
};
int main(int argc, char *argv[])
{
/* メッセージキューのID */
int msqid;
/* メッセージ */
struct msgbuf message;
/* パラメータチェック */
if(argc != 3){
fprintf(stderr,"Usage: %s type string\n",argv[0]);
exit(EXIT_FAILURE);
}else{
/* messageのtypeは正でなければならない */
if((message.type = atol(argv[1])) <= 0){
fprintf(stderr,"type value is invalid\n");
exit(EXIT_FAILURE);
}
strncpy(message.data,argv[2],BUFFSIZE);
}
printf("BUFFSIZEEは%0dバイトです\n",BUFFSIZE);
/* メッセージキューの作成,取得 */
errno = 0;
if((msqid = msgget((key_t)1111, 0666 | IPC_CREAT)) == -1){
perror("msgget failure");
exit(EXIT_FAILURE);
}
/* メッセージを送信 */
errno = 0;
if(msgsnd(msqid, &message, BUFFSIZE, 0) == -1){
perror("msgsnd failure");
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
}
gcc -O2 sendque.c -o sendque
cat > rcvque.c
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
// バッファサイズBUFSIZは8192バイトもあるのでもったいないから1024にする。
#define BUFFSIZE 1024
/* メッセージキューで送受信するメッセージ
msgsnd,msgrcvの*msgpにはこの構造体へのポインタをいれる */
struct msgbuf{
/* メッセージの先頭はかならずlong int型でなければならない */
long int type;
char data[BUFFSIZE];
};
int main(int argc, char *argv[])
{
/* メッセージキューのID */
int msqid;
/* メッセージ */
struct msgbuf message;
long int read_type;
/* パラメータチェック */
if(argc != 2){
fprintf(stderr,"Usage: %s type\n",argv[0]);
exit(EXIT_FAILURE);
}else{
/* 受信タイプの設定 */
read_type = atol(argv[1]);
}
/* メッセージキューの作成,取得 */
errno = 0;
if((msqid = msgget((key_t)1111, 0666 | IPC_CREAT)) == -1){
perror("msgget failure");
exit(EXIT_FAILURE);
}
while(1){
/* メッセージの受信 */
errno = 0;
if(msgrcv(msqid, &message, BUFFSIZE, read_type, 0) == -1){
perror("msgrcv failure");
break;
}else{
fprintf(stdout,"received message:\t%s\n",message.data);
}
/* "exit"を受信すると終了する */
if(strcmp(message.data, "exit") == 0){
break;
}
}
/* メッセージキューの削除 */
errno = 0;
if(msgctl(msqid, IPC_RMID, NULL) == -1){
perror("msgctl failure");
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
}
gcc -O2 rcvque.c -o rcvque
できたら、
./sendque 111 aaaaa
./sendque 333 ccccc
./sendque 222 bbbbb
./sendque 444 ddddd
./sendque 555 exit
と送ってみて、別プロセスで
./rcvque 333
とかすると該当するtype(ID)のメッセージを取ってこれる
これをPHPで受けるとすると、上記のサンプルソースではキューのキーが「1111」なので、以下のようなスクリプトで存在を確認できる。
<?php
$QKEY = 1111;
if (msg_queue_exists($QKEY))
{
print $QKEY."はあります\n";
}
else
{
print $QKEY."がありません!?\n";
}
?>
このキューに実際にアクセスするには msg_get_queue() で一度リソースを取得する必要がある。
<?php
$QKEY = 1111;
$QUEUE = msg_get_queue($QKEY, 0666);
if (msg_queue_exists($QKEY))
{
// var_dump(msg_stat_queue($QUEUE));
// キューの先頭からの
if (msg_receive($QUEUE, 0, $MSGTYPE, 4096, $MSGDATA, FALSE, MSG_IPC_NOWAIT | MSG_NOERROR, $ERRCODE) == TRUE)
{
print "TYPE:".$MSGTYPE." MSG:".$MSGDATA."\n";
}
else
{
if ($ERRCODE & MSG_NOERROR)
{
print "キューにデータがありませんでした!?\n";
}
else
{
print "キューから取得できませんでした!?\n";
}
}
}
else
{
print "キューがありません!?\n";
}
?>
□Emacsでお気に入りのインデント
by admin on 10月.18, 2011, under MEMO
http://search.luky.org/vine-users.6/msg08634.html
これこれ!!まさにこれですよー。
( setq c-mode-hook
‘( lambda ()
( c-set-style “stroustrup” )
(setq indent-tabs-mode nil)
( setq c-basic-offset 4 )
))
スペースにしたかったのでこうしてみました。
http://q.hatena.ne.jp/1189586222
void main()
{
if ()
{
hogehoge = 0;
}
}
こういうインデントにしたかったのですよっ!! ヽ(´ー`)ノ