投稿者の投稿

REDHAT EL5 でPPTPサーバの設定

  1. pppのインストール たいていはすでに入っている
    yum install ppp
  2. pptpdのパッケージの取得
    pptpdにはpoptopを使用するのでパッケージの取得
    wget http://poptop.sourceforge.net/yum/stable/rhel5/x86_64/pptpd-1.3.4-1.rhel5.1.x86_64.rpm
  3. poptopのインストール
    rpm -ivh pptpd-1.3.4-1.rhel5.1.x86_64.rpm
  4. /etc/pptpd.conf の設定localip    192.168.123.10    <- ローカルIP
    remoteip   192.168.100-150   <- クライアントに割り付けるIPアドレス

  5. 接続オプションの設定(DNSやWINS等)
    /etc/ppp/options.pptpd を編集する
    ms-dns 208.67.222.222
    ms-dns 208.67.220.220

  6. 接続ユーザIDとパスワードの設定
    /etc/ppp/chap-secrets を編集する
    # Secrets for authentication using CHAP
    # client server secret IP addresses
    username pptpd password *
    username2 pptpd password2 *
  7. ルーティングの設定
    このサーバ以外にアクセスする場合はルーティングの設定が必要
    echo 1 > /proc/sys/net/ipv4/ip_forward
    その他ファイアウォールはiptablesで行う
  8. クライアントからの接続を受けるため、このサーバは以下のプロトコルを受け付けなければならないので要注意
    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年もやっていると、それなりに経験も積んできて自暴自棄にはならない、
ソフトウェアを作るということは、長ーいバグのいるトンネルに入っていくことと覚悟ができる。

ソースコード自動作成ツールが作ったソース

ソースコード自動作成ツールが作ったソースです。

 
<?php
require_once ‘html_util/BaseSmarty.php’;
require_once ‘db_access/db_class_商品統合管理.php’;
//require_once ‘user_info_util/session_info.php’;

HTME::form_trim_all();
//HTME::https_needs();
//session_info::login_needs();
form_load();

/**
 * 画面からの入力処理を行う
 */
function form_load()
{
//  $user_info = session_info::is_login();
    $o_smarty = new BaseSmarty();
    HTME::form_post_set($o_smarty);
    switch($_POST[“form_name”])
    {
        case    ‘商品統合管理_list.html’:
            switch($_POST[‘action_cmd’])
            {
                case ‘search’:
                    $_POST[‘page_no’] = page_no(1,0);
                    search_list($o_smarty);
                    break;
                case ‘next’:
                    $_POST[‘page_no’] = page_no($_POST[‘page_no’],1);
                    search_list($o_smarty);
                    break;
                case ‘jump’:
                    $_POST[‘page_no’] = page_no($_POST[‘page_no’],0);
                    search_list($o_smarty);
                    break;
                case ‘prior’:
                    $_POST[‘page_no’] = page_no($_POST[‘page_no’],-1);
                    search_list($o_smarty);
                    break;
                case ‘sort’:
                    $_POST[‘page_no’] = page_no($_POST[‘page_no’],0);
                    search_list($o_smarty);
                    break;
                case ‘clear’:
                    form_clear($o_smarty);
                    break;
            }
            $o_smarty->display(“商品統合管理_list.html”);
            break;
        default:
            HTME::form_get_set($o_smarty);
            form_init($o_smarty);
            $o_smarty->display(“商品統合管理_list.html”);
            break;
    }
}

/**
 * 最初の画面を表示する
 * @param $o_smarty     SMARTYのインスタンスを渡す
 * @param $action_cmd   画面のアクションコマンド
 * @return なし
 */
function form_init($o_smarty)
{
    $_POST[‘sort_key’] = ‘商品コード’; /* 初回のソートキーを入れる*/
    $_POST[‘sort_order’] = ‘asc’;
    search_list($o_smarty);
}

/**
 * フィールドをクリアする
 * @param $o_smarty     SMARTYのインスタンスを渡す
 * @return なし
 */
function form_clear($o_smarty)
{
    $o_smarty->txtput(‘_商品コード’,”);
}

/**
 * 検索する
 * @param $o_smarty     SMARTYのインスタンスを渡す
 * @param $action_cmd   画面のアクションコマンド
 * @return なし
 */
function search_list($o_smarty)
{
    $sort_key       = sort_key($o_smarty);
    $class          = new db_class_商品統合管理();
    $class->_商品コード = $_POST[‘_商品コード’];
    $line_len       =   line_len($_POST[‘line_len’]);
    $page_no        =   $_POST[‘page_no’];
    $max_page_no    =   0;
    $record_count   =   0;
    $list_data = db_class_商品統合管理::db_select_list($class,$line_len,$sort_key,$page_no,$max_page_no,$record_count);
    $o_smarty->txtput(‘line_len’,$line_len);
    $o_smarty->txtput(‘page_no’,$page_no);
    $o_smarty->txtput(‘max_page_no’,$max_page_no);
    $o_smarty->txtput(‘record_count’,$record_count);
    $o_smarty->htmput(‘list_data’,$list_data);
}

/**
 * ソート順番を求める
 * @param $o_smarty     SMARTYのインスタンスを渡す
 * @return ソート順を格納した配列を返す
 */
function sort_key($o_smarty)
{
    $sort_key = ”; /* この配列にソートキーとソートオーダーを入れる*/
    if(!$_POST[‘sort_key’] && !$_POST[‘sort_key_old’]) return null;
    $key =      $_POST[‘sort_key’];
    if(!$key) $key = $_POST[‘sort_key_old’];
    if($_POST[‘sort_key’]==$_POST[‘sort_key_old’])
    {
        if($_POST[‘sort_order’]==’desc’)
        {
            $sort_key[$key] = ‘asc’;
        }
        else
        {
            $sort_key[$key] = ‘desc’;
        }
    }
    else
    {
        if($_POST[‘sort_key’])
        {
            $sort_key[$key] = ‘asc’;
        }
        else
        {
            if($_POST[‘sort_order’]==’asc’)
            {
                $sort_key[$key] = ‘asc’;
            }
            else
            {
                $sort_key[$key] = ‘desc’;
            }
        }
    }
    $o_smarty->txtput(‘sort_key_old’,$key);
    $o_smarty->txtput(‘sort_order’,$sort_key[$key]);
    return $sort_key;
}

/**
 * ページ番号を加算減算する
 * @param $page_no  現在のページ番号
 * @param $add      加算減算する値
 * @return 結果のページを返す
 */
function page_no($page_no,$add)
{
    if(!is_numeric($page_no)) $page_no=0;
    if(!is_numeric($add)) $add=0;
    $page_no = intval($page_no) + intval($add);
    if($page_no<1) $page_no=1;
    return $page_no;
}

/**
 * 表示行数を求める
 * @param $line_len 表示行数
 * @return 表示行数を返す
 */
function line_len($line_len)
{
    if(!is_numeric($line_len)) $line_len=10;
    if($line_len<1) $line_len = 10;
    $line_len = intval($line_len);
    return $line_len;
}
?>