投稿者の投稿
REDHAT EL5 でPPTPサーバの設定
- pppのインストール たいていはすでに入っている
yum install ppp - pptpdのパッケージの取得
pptpdにはpoptopを使用するのでパッケージの取得
wget http://poptop.sourceforge.net/yum/stable/rhel5/x86_64/pptpd-1.3.4-1.rhel5.1.x86_64.rpm
poptopのインストール
rpm -ivh pptpd-1.3.4-1.rhel5.1.x86_64.rpm
/etc/pptpd.conf の設定localip 192.168.123.10 <- ローカルIP
remoteip 192.168.100-150 <- クライアントに割り付けるIPアドレス接続オプションの設定(DNSやWINS等)
/etc/ppp/options.pptpd を編集する
ms-dns 208.67.222.222
ms-dns 208.67.220.220
接続ユーザIDとパスワードの設定
/etc/ppp/chap-secrets を編集する
# Secrets for authentication using CHAP
# client server secret IP addresses
username pptpd password *
username2 pptpd password2 *
ルーティングの設定
このサーバ以外にアクセスする場合はルーティングの設定が必要
echo 1 > /proc/sys/net/ipv4/ip_forward
その他ファイアウォールはiptablesで行う
クライアントからの接続を受けるため、このサーバは以下のプロトコルを受け付けなければならないので要注意
gre プロトコル番号 47 番
tcp 1723
Cygwin Xサーバでredhat5のデスクトップを表示する
Custom.confに以下の2行を設定するだけ!
[security]
AllowRemoteRoot=true
[xdmcp]
Enable=true
LINUX REDHAT5でのSAMBAの設定 ユーザ認証で誰でも使えるようにする
またまたいろんな仕事
Windowsサーバを使用せずにLINUXでファイル共有サーバを設定したいということで、SAMBAを設定する。
みんなが共有できるフォルダーが必要ということ。
ゴミ箱もあった方がよいのですが、SWATで設定できないため、smb.confを直接変更しました。
[global]
netbios name = KYOUYUSV
server string = Samba Server Version %v
map to guest = Bad User <——ここで、だれでもアクセスできるようにする
passdb backend = tdbsam
ldap ssl = no
cups options = raw
vfs objects = recycle <——ゴミ箱宣言
[homes]
comment = Home Directories
read only = No
browseable = No
[printers]
comment = All Printers
path = /var/spool/samba
printable = Yes
browseable = No
[みんなで共有]
path = /home/みんなで共有
read only = No
guest ok = Yes
recycle:repository = .recycle <——ゴミ箱のフォルダ名
recycle:keeptree = yes <——ディレクトリ構造を維持してごみ箱に移動するか否か
recycle:touch = yes <——ファイルがごみ箱に移されたときに、ファイルのアクセス日を変更するか否か
recycle:versions = yes <——同名のファイルがごみ箱にある場合、別名(「Copy #x of ファイル名」)で保存するか否か
recycle:maxsize = 0 <——ごみ箱に移動するファイルの上限をbyte数で指定
PHPからMySqlに接続するのにはまりまくり・・・socket の設定のずれ
TurboLinux 11 Server でjoomlaを動かそうと思ったら。
「Unable to connect to the database:Could not connect to MySQL」こんなメッセージ
どうちて?!?!?!?! コマンドでmysqlは動くのに~~~~~
ああでもない・・こうでもない・・ともがき苦しむこと3時間
わかったこと
/etc/my.cnf
では
socket=/var/lib/mysql/mysql.sock
こうなっているのに
php.iniはデフォルトのまま
phpinfoで調べてみると
MYSQL_SOCKET | /tmp/mysql.sock |
どうしてこうなるのォォォ
php.ini ファイルにこう書いて一件落着
mysql.default_socket = /var/lib/mysql/mysql.sock
こういうことって精神的にまいるのよね。どうにかしてねTurboLinuxさん。
CentOSだとこういうことはないよ。
C#で受信スレッドを使ったTCP/IP受信オブジェクト
久しぶりにC#でTCP/IPの通信オブジェクトを作成することになった。
クライアントから数値が飛んでくるので、それを受信したらイベントで渡すプログラム。
メインはWindowsフォームで、内部は2段スレッド処理。
イベントは別スレッドになるので、ちょっとてこずったがこんなもんかいという感じ。
もう少しいい方法があったら誰かおしえてちょ!
接続待ちスレッドクラス
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net.Sockets; using System.Net; using System.Threading; namespace TcpClass { public class TcpReceiveEventArgs : EventArgs { public TcpReceiveEventArgs(long Temperature) { this.Temperature = Temperature; } private long temperature; public long Temperature { get { return temperature; } set { temperature = value; } } } public delegate void TcpReceiveEventHandler(long temperature); public class TcpReceive { public event TcpReceiveEventHandler onTcpReceive; private int portNo; // スレッド停止命令用 private bool stop_flg = false; public TcpReceive(int portNo) { this.portNo = portNo; // 接続待ちのスレッドを開始 Thread thread = new Thread(new ThreadStart(ListenStart)); // スレッドをスタート thread.Start(); } public void Dispose() { stop_flg = true; GC.SuppressFinalize(this); } /** * 接続待ちスレッド本体 */ private void ListenStart() { // Listenerの生成 TcpListener listener = new TcpListener(IPAddress.Any, this.portNo); // 接続要求受け入れ開始 listener.Start(); while (!stop_flg) { // 接続待ちがあるか? if (listener.Pending() == true) { // 接続要求を受け入れる TcpClient tcp = listener.AcceptTcpClient(); TcpReceiveWorker rcv = new TcpReceiveWorker(tcp, this); Thread thread = new Thread(new ThreadStart(rcv.TCPClientProc)); // スレッドをスタート thread.Start(); } else { Thread.Sleep(0); } } // 接続待ち終了 listener.Stop(); } protected virtual void OnReceiveEvent(long temperature) { if (onTcpReceive != null) { onTcpReceive(temperature); } } internal void RiaseEvent(long temperature) { OnReceiveEvent(temperature); } } }
データ受信スレッドクラス
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net.Sockets; using System.Net; using System.Threading; using System.Collections; namespace TcpClass { class TcpReceiveWorker { private TcpClient tcp = null; TcpReceive rcv = null; public TcpReceiveWorker(TcpClient tcp,TcpReceive rcv) { this.tcp = tcp; this.rcv = rcv; } public void TCPClientProc() { NetworkStream st = tcp.GetStream(); ArrayList aryList = new ArrayList(); long count = 0; do { int nret = st.ReadByte(); if (nret < '0' || nret > '9') { break; } if (nret != -1) { aryList.Add((byte)nret); } count++; if (count > 8 ) break; } while (tcp.Connected == true); // ソケットを閉じる tcp.Close(); // 受信したものをbyte配列に変換 byte[] byt = new byte[aryList.Count]; for (int i = 0; i < aryList.Count; i++) { byt[i] = (byte)aryList[i]; } string strFromByte = Encoding.ASCII.GetString(byt); long ret = long.Parse(strFromByte); rcv.RiaseEvent(ret); } } }
データ送信クラス
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net; using System.Net.Sockets; namespace TcpClass { public class TcpSend { public string hostName; public int portNo; public TcpSend(string hostName,int portNo) { this.hostName = hostName; this.portNo = portNo; } public Boolean send(long value) { try { // クライアント用のソケットを作成する TcpClient cl = new TcpClient(); // サーバーへ接続する cl.Connect(hostName, portNo); // 接続したソケットからNetworkStreamを取得 NetworkStream stream = cl.GetStream(); Encoding encode = Encoding.Default; // 送信する文字列をバイト配列に変換 // この際に、エンコードも同時に行う。 string s = value.ToString(); byte[] bytData = encode.GetBytes(s); // 書き出しを行う。 stream.Write(bytData, 0, bytData.Length); // フラッシュ(強制書き出し) // これを行わないと、確実にネットワークに流れない。 stream.Flush(); // ソケットをクローズ cl.Close(); } catch (SocketException eSocket) { System.Diagnostics.Debug.Write(eSocket.Message); return false; } catch (Exception ex) { System.Diagnostics.Debug.Write(ex.Message); return false; } return true; } } }
イベントがクラスなのでフォームのデータを変更するときに注意が必要なんでこんな感じ
void c_onTcpReceive(object sender, TcpReceiveEventArgs eventCode) { CheckForIllegalCrossThreadCalls = false; /* 別スレッドでのアクセスを許可する */ this.textTemperature.Text += eventCode.Temperature; this.textTemperature.Text += "\n"; }
実はイベントを受け取るとき別スレッドで受け取るため下のやり方が正しい かなりややこしいが、昔ならウィンドウメッセージを使っていたから、この方が簡単化もしれない。でもややこしい!
private void button1_Click(object sender, EventArgs e) { c = new TcpReceive(10000); c.onTcpReceive += new TcpReceiveEventHandler(c_onTcpReceive); } void c_onTcpReceive(long temperature) { if (textTemperature.InvokeRequired) { Invoke(new delSetTemperature(setTemperature), new object[] { temperature }); } else { setTemperature(temperature); } } delegate void delSetTemperature(long temperature); void setTemperature(long temperature) { textTemperature.Text += temperature; textTemperature.Text += "\n"; }
PHPでExcelを生成できないかなぁ~なんて思っていたら
PHPでExcelを生成できないかなぁ~なんて思っていたら
なんとあるではないか
名前は、[PHPExcel] なんとべたな名前。
さっそく使ってみたら、こんな感じでできました。
$reader = PHPExcel_IOFactory::createReader(‘Excel2007’);
$xl = $reader->load(configure::$excel_folder . ‘/’ . ‘scg_base.xlsx’);
$xl->setActiveSheetIndex(0);
$sheet = $xl->getActiveSheet();
$sheet->setCellValue(‘B1’,$_POST[‘sel_table’]);
$i = 3;
foreach($array as $key => $value)
{
$sheet->setCellValue(‘A’ . $i,$value[‘fieldname’]);
$sheet->setCellValue(‘B’ . $i,$value[‘fieldtype’]);
$sheet->setCellValue(‘C’ . $i,$value[‘len’]);
$sheet->setCellValue(‘D’ . $i,$value[‘period’]);
$sheet->setCellValue(‘E’ . $i,$value[‘max_len’]);
$sheet->setCellValue(‘F’ . $i,$value[‘comment’]);
$sheet->setCellValue(‘G’ . $i,$value[‘type’]);
if($main_key[‘fieldname’] == $value[‘fieldname’])
{
$sheet->setCellValue(‘H’. $i,’○’);
}
else
{
$sheet->setCellValue(‘H’. $i,”);
}
if($value[‘field’]) $sheet->setCellValue(‘I’ . $i, ‘○’);
$sheet->setCellValue(‘J’ . $i,$value[‘ime_mode’]);
if($value[‘search’]) $sheet->setCellValue(‘K’ . $i,’○’);
if($value[‘necessary’]) $sheet->setCellValue(‘L’ . $i,’○’);
$i ++;
}
$writer = PHPExcel_IOFactory::createWriter($xl, ‘Excel5’);
$uniqid = uniqid(‘aa’,true);
$filename = configure::$excel_folder . ‘/’ . $uniqid .”.xls”;
$writer->save($filename);
久々の正規表現
PHPで日付チェック 時刻チェックをするのに久々に正規表現を使った。
相変わらず便利な機能だと思う。
最初に正規表現にあった時には、なんじゃこの暗号みたいなのは・・・・気持ちわりい!
と思ったのだが、今ではなくてはならないものになった。
ねっ! 気持ち悪いでしょ
// 日付が正しいかをチェックする。例 2008/12/2
static function IsYMD($text)
{
$array=null;
if(!preg_match(“/^([0-9]{4})\/([0-9]{1,2})\/([0-9]{1,2})$/”,$text,$array)) <-ここでチェックしている
{
return ”;
}
if(!checkdate($array[2],$array[3],$array[1]))
{
return ”;
}
return str_pad(intval($array[1]), 4, ‘0’, STR_PAD_LEFT) . str_pad(intval($array[2]), 2, ‘0’, STR_PAD_LEFT) . str_pad(intval($array[3]), 2, ‘0’, STR_PAD_LEFT);
}
// 時刻が正しいかをチェックする。例 17:12:13
static function IsHMS($text)
{
if(!preg_match(“/^([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2})$/”,$text,$array)) <-ここでチェックしている
{
return “”;
}
if(intval($array[1])<0 || intval($array[1])>23)
{
return ”;
}
if(intval($array[2])<0 || intval($array[2])>59)
{
return ”;
}
if(intval($array[3])<0 || intval($array[3])>59)
{
return ”;
}
return str_pad(intval($array[1]), 2, ‘0’, STR_PAD_LEFT) . str_pad(intval($array[2]), 2, ‘0’, STR_PAD_LEFT) . str_pad(intval($array[3]), 2, ‘0’, STR_PAD_LEFT);
}
ソースコード自動生成ツールV.097完成
ソースコード自動生成ツールがやっと使えるところまでできました。
自動生成のプログラムを動かす環境には、ちょっとローカルな環境が必要ですが、
現在使えるテンプレートは、PHP PostgreSQL SMARTY環境での自動生成です。
http://XXX.XXX.1.70/scg でアクセスできます。
XXX.XXXの部分は、・・・・・・
どんなものか、一度見てやってください。
一覧表示 登録 削除 照会 削除 プログラムが生成できます。
いろいろご意見お待ちしています。
テンプレートを追加すれば、JAVA VB.NET ASPでも作成可能です。
他のひな型があれば、いつでも相談に乗ります。
虫だらけの長ーいトンネル
ソースコード自動作成ツール
一覧画面の作成用のテンプレートがやっと完成した。
これで、8度目の完成した宣言です。
ソフトウェアというものは、恐ろしいものだ、できたと思っても変な所に バグ・
今度は完ぺきだと思ってもまた バグ
今度は完ぺきだと思ってもまた バグ
今度は完ぺきだと思ってもまた バグ
いつになったらバグが消えるのだろう・・
1度目2度目の言い訳は、「えっ!そうですか、わかりました」
3度目の言い訳は「あっりゃ! そうなんですか」
4度目の言い訳は「あっごめんなさい」
5度目の言い訳は「あっ!」
6度目の言い訳は「うっ!」
7度目の言い訳は「・・・・」
このころから変な自問自答がはじまり、「ぶつぶつぶつ・・・・」「この!!ぶたやろう!!」と自分を責め始める。
もう、10回を超えると、自分が信じられなる。
しかし、こんなことを20年もやっていると、それなりに経験も積んできて自暴自棄にはならない、
ソフトウェアを作るということは、長ーいバグのいるトンネルに入っていくことと覚悟ができる。