2010年 2月

XCOPY でメモリーが足りません

バックアップを取る時、世の中にはいっぱいバックアップソフトがあるですが、いろいろインストールするのもめんどくさいので、私はXCOPYを使っています。

xcopy /E/C/R/D/Y コピー元のフォルダ コピー先のフォルダ

といった具合に、ファイルのタイムスタンプを見て、自動的にコピーをしてくれます。

1998年からズーットこの方法でやってきたのですが、先日ふと見てみるとバックアップ先にバックアップ元にあるべきデータがないではないですか。
「どうして???」

調べてみると、コピー元ファイルに255バイトを超えるパスがあると「メモリーが足りません」なるらしい。

そういえば、最近はやたら長い日本語のフォルダー名やファイル名を付けることが多い。そう思っていろいろパス長を短くする努力を行って、なんとか最後までバックアップは完了した。

XCOPYなんて、MSDOS時代の過去の遺物を使用し続けられるのも、そろそろ終わりなのかな。

次は、対策を練らなくてはと思う。

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);