2011年9月20日 星期二

2011年8月15日 星期一

[FreeBSD] Pure-FTPd + MySQL架設


安裝Pure-FTPd
cd /usr/ports/ftp/pure-ftpd
make install clean(選MYSQLUTF-8)

cd /usr/local/etc
cp pure-ftpd.conf.sample pure-ftpd.conf


設定Pure-FTPd
vim pure-ftpd.conf

更改pure-ftpd.conf設定,我列出我所用到的設定:

# Cage in every user in his home directory
ChrootEveryone             yes  # 限制每個用戶到自己的根目錄

# List dot-files even when the client doesn't send "-a".
DisplayDotFiles            no #是否顯示.XXX記錄檔(隱藏系統檔)

# Disallow anonymous connections. Only allow authenticated users.
NoAnonymous             yes  # 不允許匿名用戶

# MySQL configuration file (see README.MySQL)
MySQLConfigFile             /usr/local/etc/pureftpd-mysql.conf  #設定使用MySQL管理虛擬帳戶

# File creation mask. <umask for files>:<umask for dirs> .
# 177:077 if you feel paranoid.
Umask                      133 :022  #文件權限:目錄,777-133=644:777-022=755

# Allow FXP transfers for authenticated users.
AllowUserFXP                yes  #允許使用者使用FTP傳輸軟體

# Automatically create home directories if they are missing
CreateHomeDir               yes  #當使用者第一次存取FTP空間時,會依據帳號自動創資料夾


以上設定好後,儲存離開。

建立MySQL設定檔
vim pureftpd-mysql.conf

# If you want to use the Socket connect methode comment out the
# Lines with MMYSQLServer and MYSQLPort.
# If you want to use the Port methode comment out the MYSQLSocket line
#MYSQLSocket     /var/lib/mysql/mysql.sock
MYSQLServer     localhost
MYSQLPort       3306
MYSQLUser       ftp  #MySQL使用者 最好是設定非root
MYSQLPassword   ftpuser  #密碼
MYSQLDatabase   pureftpd
MYSQLCrypt      cleartext
MYSQLGetPW      SELECT Password FROM ftpd WHERE User="\L" AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")
MYSQLGetUID     SELECT Uid FROM ftpd WHERE User="\L" AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")
MYSQLGetGID     SELECT Gid FROM ftpd WHERE User="\L"AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")
MYSQLGetDir     SELECT Dir FROM ftpd WHERE User="\L"AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")
MySQLGetBandwidthUL SELECT ULBandwidth FROM ftpd WHERE User="\L"AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")
MySQLGetBandwidthDL SELECT DLBandwidth FROM ftpd WHERE User="\L"AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")
MySQLGetQTASZ   SELECT QuotaSize FROM ftpd WHERE User="\L"AND status="1"
MySQLGetQTAFS   SELECT QuotaFiles FROM ftpd WHERE User="\L"AND status="1"


這樣Pure-FTPd就都設定好了,接著新建一個存放Pure-FTPd使用者帳號的pureftpd資料庫。
DROP TABLE IF EXISTS ftpd;
CREATE TABLE ftpd (
User varchar(16) NOT NULL default '',
status enum('0','1') NOT NULL default '0',
Password varchar(64) NOT NULL default '',
Uid varchar(11) NOT NULL default '-1',
Gid varchar(11) NOT NULL default '-1',
Dir varchar(128) NOT NULL default '',
ULBandwidth smallint(5) NOT NULL default '0',
DLBandwidth smallint(5) NOT NULL default '0',
comment tinytext NOT NULL,
ipaccess varchar(15) NOT NULL default '*',
QuotaSize smallint(5) NOT NULL default '0',
QuotaFiles int(11) NOT NULL default 0,
PRIMARY KEY (User),
UNIQUE KEY User (User)
) TYPE=MyISAM;


設定開機自動啟動
vim /etc/rc.conf
加入pureftpd_enable="YES"


啟用ftp
/usr/local/etc/rc.d/pure-ftpd start


資料庫欄位意義:
User: 使用者名稱
status: 使用者狀態,1為可登入,0為不可登入
Password: 密碼
UID: 系統的 UID,要大於100以上(Uid,Gid會影響上傳下載權限,基本上是都設一樣)
GID: 系統的 GID,要大於100以上
Dir: 登入系統的使用者目錄
ULBandwidth: 上傳頻寬,單位 KB/s
DLBandwidth: 下載頻寬,單位 KB/s
comment: 使用者身份簡介說明
ipaccess: 連線來源 IP限制,* 為不限制
QuotaSize:家目錄的大小限制,單位 MB,0為不限制
QuotaFiles: 檔案數量限制,0為不限制


後記:關於使用FTP傳輸軟體以外的方式上傳中文檔名會變成亂碼,目前還未找到解決方法,但是使用FTP傳輸軟體就無此問題。

[Blogger] 撰寫程式碼文章 google-code-prettify

方便Blogger使用的方法:
在設計,修改HTML裡的</head>之前貼上下面這兩句,<link href=...的css連結可以更換樣式。
<link href="http://google-code-prettify.googlecode.com/svn/trunk/src/prettify.css" rel="stylesheet" type="text/css"></link>
<script src="http://google-code-prettify.googlecode.com/svn/trunk/src/prettify.js" type="text/javascript">
</script>

然後在網頁載入時啟動
<body onload='prettyprint()'>

使用時,用<pre class="prettyprint"></pre>框住程式碼就可以了。

可以與SyntaxHighlighter共用,只是class內容不同。
個人比較偏向使用SyntaxHighlighter,因為在測試google-code-prettify的時候,會有些程式碼跑不出來。

[Blogger] 撰寫程式碼文章 SyntaxHighlighter

使用SyntaxHighlighter 提供的免費API,首先選取Blogger的設定 > 修改HTML,在</head>前貼上以下程式碼。


<!--SYNTAX HIGHLIGHTER BEGINS-->
<link href='http://alexgorbatchev.com/pub/sh/current/styles/shCore.css' rel='stylesheet' type='text/css'/>
<link href='http://alexgorbatchev.com/pub/sh/current/styles/shThemeDefault.css' rel='stylesheet' type='text/css'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCpp.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCSharp.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCss.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJava.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJScript.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPhp.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPython.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushRuby.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushSql.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushVb.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushXml.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPerl.js' type='text/javascript'/>
<script language='javascript'>
SyntaxHighlighter.config.bloggerMode = true;
SyntaxHighlighter.config.clipboardSwf = &#39;http://alexgorbatchev.com/pub/sh/current/scripts/clipboard.swf&#39;;
SyntaxHighlighter.all();
</script>
<!--SYNTAX HIGHLIGHTER ENDS-->


接著在撰寫程式碼文章時,切換到"修改HTML",在程式碼開頭及結束加上以下這兩行。
<pre class="brush: c#">
print "aaa";
</pre>

[PHP] Notice: Undefined index: 找不到該變數的值 解決方法

到apache找php資料夾的php.ini檔案,貼上這句關掉錯誤警告的設定
error_reporting(E_ALL ^ E_NOTICE);


上面的方法應該就可以解決錯誤訊息,如果想在程式碼中判斷變數是否存在也可以使用以下方法:
<?php
    //判斷該變數是否存在,ture or false
    isset()

    //判斷$變數中是否存在id索引鍵值
    array_key_exists(id,$變數) 
?>

2011年7月28日 星期四

[C#] 更新、新增、刪除MySQL資料庫資料語法

//引用MySQL套件參考
using MySql.Data.MySqlClient;

//資料庫位址
MySqlConnection myConnection = new MySqlConnection("server=資料庫IP;user id=資料庫使用者帳號; password=帳號的密碼; database=資料庫名稱; CharSet=utf8");

//開啟資料庫
myConnection.Open();

/*更新*/
string update = string.Format("update 資料表 set 欄位1='{0}', 欄位2='{1}'", 值1,值2);
MySqlCommand updateCmd = new MySqlCommand(update, myConnection);
updateCmd.Connection = myConnection;
//執行更新
updateCmd.ExecuteNonQuery();

/*新增*/
string AddNew = string.Format("INSERT INTO 資料表(欄位1, 欄位2) VALUES('{0}','{1}')", 值1, 值2);
MySqlCommand AddNewCmd = new MySqlCommand(AddNew, myConnection);
AddNewCmd.Connection = myConnection;
//執行新增
AddNewCmd.ExecuteNonQuery();

/*刪除*/
string Del = string.Format("DELETE FROM 資料表 WHERE 欄位 = '{0}'", 值);
MySqlCommand DelCmd = new MySqlCommand(Del, myConnection);
DelCmd.Connection = myConnection;
//執行刪除
DelCmd.ExecuteNonQuery();


//關閉資料庫
myConnection.Close();

2011年7月3日 星期日

[C#] 儲存.ini檔

IniFile ini = new IniFile("C:\\檔名.ini");
ini.IniWriteValue("Info", "Key1", "Value");

[C#] 關閉執行中的程式

using System.Diagnostics;

//關閉執行中程式
Process[] list = Process.GetProcessesByName("IExplore");//關閉"IExplore",也可以關閉火狐"firefox" 
foreach (Process p in list)
{
    p.Kill();
}

[C#] 命令提示字元指令

//關機
System.Diagnostics.Process.Start("C:\\WINDOWS\\system32\\shutdown.exe", "-f -s -t 0");

//登出
System.Diagnostics.Process.Start("C:\\WINDOWS\\system32\\shutdown.exe", "-l");

//休眠
System.Diagnostics.Process.Start("C:\\WINDOWS\\system32\\rundll32.exe","powrprof.dll,SetSuspendState");

//重新開機
System.Diagnostics.Process.Start("C:\\WINDOWS\\system32\\shutdown.exe", "-f -r -t 0");

[C#] 倒數計時

private void Form1_Load(object sender, EventArgs e)
{
     timer1.Start();
}

private void timer1_Tick(object sender, EventArgs e)
{
    //要倒數的時間,也可以倒數5秒,例:DateTime MyEndDate = DateTime.Now.AddSeconds(5);
    DateTime MyEndDate = new DateTime(YY,MM,DD,hh,mm, 0);
    //取得電腦現在時間
    DateTime MyStartDate = DateTime.Now;
    //執行倒數
    TimeSpan MySpan = MyEndDate.Subtract(MyStartDate);
    string diffDay = Convert.ToString(MySpan.Days);
    string diffHour = Convert.ToString(MySpan.Hours);
    string diffMin = Convert.ToString(MySpan.Minutes);
    string diffSec = Convert.ToString(MySpan.Seconds);
    //顯示秒數
    label1.Text = diffDay + "天" + diffHour + "時" + diffMin + "分" + diffSec + "秒";
}

[C#] 列印

列印元件 printDocument
預覽列印 printPreviewDialog

private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
    //列印圖片
    e.Graphics.DrawImage(pictureBox1.Image, 160, 20, 250, 100);
    //列印文字
    e.Graphics.DrawString(textBox1.Text, textBox1.Font, new SolidBrush(Color.Black), new Point(50, 50));
}
也可以設定列印參數
//設定印A4的一半 直式
printDocument1.DefaultPageSettings.Landscape = true;
printDocument1.DefaultPageSettings.PaperSize = new System.Drawing.Printing.PaperSize("pag",this.printDocument1.DefaultPageSettings.PaperSize.Width,this.printDocument1.DefaultPageSettings.PaperSize.Height / 2);

//列印字體設定
textBox1.Font = new System.Drawing.Font("新細明體", 12F, System.Drawing.FontStyle.Regular,System.Drawing.GraphicsUnit.Point, ((byte)(136)));
執行列印
//預覽列印
printPreviewDialog1.ShowDialog();
//直接列印
printDocument1.Print();

[C#] DataGridView新增按鈕欄位

創建按鈕欄
using System.Windows.Forms;

DataGridViewButtonColumn column3 = new DataGridViewButtonColumn();
column3.Name = "欄位名稱";
column3.UseColumnTextForButtonValue = true;
column3.Text = "按鈕名稱";
column3.Width = 30;
DataGridView1.Rows.Add(column3);
新增按鈕跟資料
int Count = DataGridView1.Rows.Count - 2;
DataGridView1.Rows[Count].Cells[1].Value = "值";

[C#] 點選DataGridView欄位取得欄位值

private void DataGridView1_CellContentClick_1(object sender, DataGridViewCellEventArgs e)
{
    //取得欄位值
    string value = DataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex + 1].Value.ToString();
}

[C#] 顯示其他程式介面

在From1的程式區宣告From2視窗並呼叫顯示
//宣告From2視窗
From2 From2 = new From2();
From2.FM1 = this;

//呼叫顯示From2視窗
From2.ShowDialog();

在From2程式區宣告
//宣告From1
public Form1 FM1 = null;

如果要把From1的資料傳到From2的物件,From2物件的 Modifiers 屬性(表示物件的可視性層級)要改成 Internal

[C#] 改變解析度

using System.Runtime.InteropServices;

        //改變解析度引用
        [DllImport("user32.dll")]
        private static extern bool SetWindowPos(int hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);
        [DllImport("user32.dll")]
        public static extern int GetSystemMetrics(int screensize);
        public const int SM_CXSCREEN = 0;
        public const int SM_CYSCREEN = 1;
        private static IntPtr HWND_TOP = IntPtr.Zero;
        private const int SWP_SHOWWINDOW = 64;

[C#] 連結MySQL語法-DadataGridView顯示

using MySql.Data.MySqlClient;//安裝MySql.Data.msi套件,再引用參考
 
//資料庫位址,帳號,密碼,資料庫名稱,存取編碼
MySqlConnection myConnection = new MySqlConnection("server=localhost;user id=root; password=sa123; database=mer; CharSet=utf8");
 
MySqlDataReader sqlDataReader;
MySqlCommand sqlCmd;
 
myConnection.Open();
 
DataTable data;
MySqlDataAdapter da;
MySqlCommandBuilder cb;
data = new DataTable();

da = new MySqlDataAdapter(string.Format("SELECT * FROM ABC"), myConnection);
cb = new MySqlCommandBuilder(da);
da.Fill(data);

//放到DataGrid顯示
dataGridView1.DataSource = data;

//關閉資料庫
myConnection.Close();

[C#] 連結MySQL語法

using MySql.Data.MySqlClient;//安裝MySql.Data.msi套件,再引用參考

//資料庫位址,帳號,密碼,資料庫名稱,存取編碼
MySqlConnection myConnection = new MySqlConnection("server=localhost;user id=root; password=sa123; database=mer; CharSet=utf8");

MySqlDataReader sqlDataReader;
MySqlCommand sqlCmd;

myConnection.Open();

string sql = string.Format("SELECT * FROM health_care where Account_number ='{0}' and Password = '{1}'",id_textBox.Text,pass_textBox.Text);
sqlCmd = new MySqlCommand(sql, myConnection);
sqlDataReader = sqlCmd.ExecuteReader();

if (sqlDataReader.Read())
{
   string 變數 = MaxCodeSqlData["資料表名稱"].ToString();
}
sqlDataReader.Close();
myConnection.Close();

[MySQL] 資料庫存取權限開啟語法

GRANT ALL PRIVILEGES ON *.* TO 'root' @'%' IDENTIFIED BY 'sa123' WITH GRANT OPTION;