2011年10月19日星期三

修改電腦名稱後SQL Server Replication失效解決方法

在公司中,我自己的電腦都會跟Production Server做Replication,當然Server會是Publication,而我是Subscriber。
上星期,我把自己的本機電腦名稱修改,到今天看看Replication Monitor,發現這段時間一直都是"Uninitialized subscription"狀態。
過了一段時間才驚醒自己修改了電腦名稱,故兩者的Connection當然是不同了。
我試過重建,但奈何多次都不成功。上網找答案,原來是SQL Server並沒有記著新的電腦名稱。
下圖中,可見其實SQL Server中,Name與Data Source可以是兩個不同的值。


因為我是選擇"Snapshot replication pull model",故以下一切Command都應該在本機Subscriber電腦做,請注意。
上網爬文,有人說去System Databases中的Master DB,再到System Views中的sys.servers修改記錄。但世事又怎會那麼簡單....
Edit後出現"Ad hoc updates to system catalogs are not allowed."


其實可以執行兩個System SP去做一下檢查:
sp_helpserver - 顯示SQL Server內,已知或已註冊做replication Server的資料。
select @@SERVERNAME - 執行該Query Command的Server名稱。

就以下圖為例,顯然兩者並不一致,所以就要作出修正。


在本地執行以下SQL,目的是把沒有用的Server記錄刪除,再新增正確的Server資料。
sp_dropserver @server='MING-WINDOWS-7'
GO
sp_addserver @server='MingCheung-PC', @local='LOCAL'
GO
執行後,應該就可以重建Replication了。

2011年10月10日星期一

Ruby on Rails取代PHP?

每種Dev Language都會有一批死忠者,有部份人總不想與競爭者並存。
在遠古時代,已經有:
"C# Kill VB" ,
"PHP Kill Perl",
"PHP Kill ASP.NET",
"Python kill Java" 等等...多得可以做一串Array...

每次一有這類話題,雙方都會爭議得面紅耳熱,但當中不乏一些論點具參考性,所以我一般看完主文後,文章的Comments才是主菜。

這段時間又有一篇"Ruby on Rails kill PHP" - PHP needs to die. What will replace it?
Java vs Ruby on Rails vs PHP

PHPer當然大反撃喇。

其實我個人認為PHP先不要急推PHP6,最需要變一下的是PHP Logo和官網。
我一直都認為PHP的Logo很80年代感覺的,官網亦欠缺時代感。

2011年10月7日星期五

del.icio.us RSS Feed失效原因

早前講過話"del.icio.us bookmark停在14 Sep 2011?",之後有幾日又回復正常,但到了26號之後,部份RSS Feed又突然停止。

到前日我終於知道是什麼問題。

如下圖中,ASP.NET是沒有問題,但C#和CSS等等卻停在9月27日,但當天已經是10月5日了。



之後我去Google Reader最右上角的閱讀器設定一看就知道是什麼原因了。
原來舊有的Feed連結 : http://del.icio.us/rss/tag/csharp 已經不能使用。
必須使用這個格式的連結 : http://feeds.delicious.com/v2/rss/tag/asp.net?count=15



其實del.icio.usavos收購後,感覺上真的變得更差。

到目前為止,我發現有幾個不方便的地方:

1. 不顯示bookmark的日期
2. Tag沒有auto-complete
3. Tag空格不再視為分隔字元,落Tag時個人覺得不方便

2011年10月6日星期四

WordPress PHP Script - 重新分類圖片至YYYY/MM

之前寫了一篇WordPress - 把圖片加入/重新連結Media Library

大致上是用WP-Plugin Add From Server把Server上的圖片匯入至WP的Media Library中,再利用小弟我的PHP Script 把沒關聯的圖片與Post/Page重新連結。

但今天再整理一下WordPress時,發現自己的WordPress已經長大了,有1178個Post,接近二千張圖片。
一直都想把圖片再整理,詳細因由可以看看之前的WordPress - 把圖片加入/重新連結Media Library

今天再次寫一個PHP Script,主要目的有兩個:

1. 把圖片重新加入至 "YYYY/MM/" 結構的資料夾
2. 找出沒有用過的孤兒圖片

完成後,自己測試過很多次,效果不錯。
現在本Blog 2005年-2009的圖片都齊齊整整有自己的家(資料夾)了。



大家有需要可以把Code Save至一個PHP檔案,上傳到Server執行。

另外每個Server設定不同,請更改$image_dir和$images_to_process變數,說明一下:
$image_dir = 你WP的上傳資料夾,必須"/"結尾,但絕對不要"/"開頭。
$images_to_process = 每個Server的PHP Config(php.ini)都不同,以我為例,max_execution_time = 30的話,一次最多300張就好了。
如果你好似我一樣,有兩千張圖片,可以人手分多次執行。執行直到你看到圖片已經搬遷完成就可以。
完成後,最好重新把Server的Images資料夾下載一次,對比一下圖片數量和File Size,讓自己安心一點。 :hoho:

但緊記緊記!!! Backup你的Database和Images資料夾才動手,因為我會寫入你DB中的wp_posts Table和移動檔案!!!
廢話少說,送上PHP Code。

<?php
require_once ('wp-config.php');
require_once ('wp-admin/includes/admin.php');
require_once ('wp-includes/functions.php');

$server = DB_HOST;
$username = DB_USER;
$password = DB_PASSWORD;
$dbname = DB_NAME;

//Change this line to your WordPress Images folder if need, End with '/', but DO NOT start with '/'.
$image_dir = "wp-content/uploads/images/";
$images_to_process = 500;
//

$process_cnt = 0;
$abs_dir = get_home_path() . '/' . $image_dir;

function dirImages($dir, $i) {
 $d = dir($dir);
 //Open Directory
 while (false !== ($file = $d -> read()))//Reads Directory
 {
  $extension = strtolower(substr($file, strrpos($file, '.')));
  // Gets the File Extension
  if ($extension == ".jpg" || $extension == ".jpeg" || $extension == ".gif" || $extension == ".png")// Extensions Allowed
   $images[$file] = $file;
  // Store in Array
 }
 $d -> close();
 // Close Directory
 echo 'Total ' . count($images) . ' files found.';

 asort($images);
 // Sorts the Array
 $part_images = array_slice($images, 0, $i);
 return $part_images;
}

$array = dirImages($abs_dir, $images_to_process);

mysql_connect($server, $username, $password) or die(mysql_error());
mysql_select_db($dbname) or die(mysql_error());

foreach ($array as $key => $image)// Display Images
{
 //find out all attachment records which is no parent post.
 $sql = "SELECT ID , post_date FROM `wp_posts` WHERE post_type IN ('nav_menu_item','page','post','revision','template') AND `post_content` LIKE '%/" . $image . "%' LIMIT 1";
 //echo $sql;
 $attachment_post = mysql_fetch_assoc(mysql_query($sql));

 if (!$attachment_post) {
  echo 'No post is found by filename : ' . $image . 'SQL : ' . $sql;
  continue;
 }

 $process_cnt++;
 $id = $attachment_post['ID'];
 $post_date = date_parse($attachment_post['post_date']);
 $post_year = $post_date['year'];
 $post_month = substr('0' . $post_date['month'], strlen('0' . $post_date['month']) - 2, 2);

 //echo $image.' : '.$post_year.'-'.$post_month;
 //echo $abs_dir.$post_year;

 //check [year]/[month] folder is exist or not.
 $yearfolder = $abs_dir . $post_year . '/';
 $monthfolder = $yearfolder . $post_month . '/';

 if (!is_dir($yearfolder)) {
  mkdir($yearfolder, 0777);
  chmod($yearfolder, 0777);
  echo 'Create folder : ' . $yearfolder;
 }
 if (!is_dir($monthfolder)) {
  mkdir($monthfolder, 0777);
  chmod($monthfolder, 0777);
  echo 'Create folder : ' . $monthfolder;
 }

 //Move the images to new folder.
 if (file_exists($monthfolder . $image)) {
  echo 'The file : ' . $monthfolder . $image . 'exists, skip.';
  continue;
 }
 if (!rename($abs_dir . $image, $monthfolder . $image)) {
  echo 'Move ' . $image . ' Fail.';
  continue;
 }

 //Update wp_post's [post_content] to rewrite the existing url.
 $sql = "UPDATE wp_posts SET post_content = replace(post_content, '" . $image_dir . $image . "' , '" . $image_dir . $post_year . '/' . $post_month . '/' . $image . "') WHERE post_type IN ('nav_menu_item','page','post','revision','template');";
 mysql_query($sql) or die(mysql_error());
}

echo $process_cnt . ' files is done!';
mysql_close();
?>