\

Facebook


วันอังคารที่ 20 พฤษภาคม พ.ศ. 2557

[ SQL SERVER ] Prevent Saving Changes Recreated แค่แก้คอลลัมม์ จะให้ดรอปเทเบิลแล้วสร้างใหม่เฉย


ธรรมดาของ SQL SERVER 2008 R2 เวลาที่เราจะแก้ไขดาต้าไทป์ของคอลัมม์ให้เป็นประเภทอื่น เช่น แก้จาก int เป็น bigint หรือแก้ความยาวของ Varchar(20) ให้สั้นลงมาเหลือ Varchar(10) จะถูกตรวจสอบก่อนว่าจะส่งผลต่อข้อมูลเราไหม ซึ่งบางครั้งก็ไม่มีปัญหาแหละ เช่น แปลง int เป็น long เพราะ data type แบบใหม่ที่แปลงไปมีขนาดยาวกว่า แต่ในกรณีที่เกิด Error เช่นแปลง varchar เป็น int ซึ่งข้อมูลเดิมอาจเป็นอักษร ซึ่งแปลงไปไม่ได้ แต่ถ้าแปลงได้ก็ไม่ควรเกิดข้อผิดพลาด


ทีนี้ด้วยความฉลาด ( มากเกินไป ) ทาง SQL SERVER จะป้องกันการแก้ไขตารางให้เราโดยจะขึ้น error ว่า "Prevent Saving Changes Recreated" ชึ่งถ้าเรายืนยันนอนยันว่าจะแก้ไข ก็สามารถไปปิดได้ดังนี้



หลังจาก LogIn เข้าสู่ server แล้วไปที่ Tool > Option แล้วไปที่ tab Designers ติก Prevent saving changes that require table re-creation ออก

วันอาทิตย์ที่ 18 พฤษภาคม พ.ศ. 2557

Doodle Rubik ตัวใหม่ของ Google เล่นกันละยัง


วันนี้ 19/5 เข้าหน้ากูเกิ้ลแล้วเจอ Doodle ตัวใหม่ เป็นรูบิค 3x3 เข้าไปลองเล่นย้อนหลังได้ที่นี้เลยครับ


แอบเล่นไปนิดนึง มีการนับจำนวนครั้งที่หมุนรูบิคด้วย ว่าใช้ไปเเล้วเท่าไหร่ โดยเราจะเห็นได้เพียง 3 ด้านจากด้านหน้า ผมว่ายากนะ รูบิคธรรมดายังเล่นไม่ค่อยจะผ่าน ยังไงก็ลองไปเล่นกันครับ ใครที่สนใจ

เจอ Google ต้อนรับวันจันทร์ด้วยโจทย์รูบิค ฮ่าๆ ทุกทีจะเป็เกมส์ง่ายๆไม่ใช่หรือ ?

วันพฤหัสบดีที่ 8 พฤษภาคม พ.ศ. 2557

วิธีดู .NET Framework เครื่องตัวเองว่าเป็นเว่อร์ชั่นอะไร


Reference: http://msdn.microsoft.com/en-us/library/hh925568(v=vs.110).aspx

วิธีดูเวอร์ชั่นของ .Net Framework ว่ามีกี่เวอร์ชั่นที่ install ลงบนเครื่องของเรา สามารถเขียนโปรแกรมไว้ดูได้ง่ายๆเลยครับ โดยขั้นแรกต้องรู้จัก Registry ของ Microsoft ก่อน ซึ่งสามารถเข้าไปโดยเรียก Run ขึ้นมาแล้วพิมพ์ regedit.exeกด Enter แล้วเข้าไปที่
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP ซึ่งจะเห็นเรียงกันลงมาตามทั้งหมด


คราวนี้ถึงเวลาเขียนโปรแกรมอ่านค่า registry กันมั้ง โดยเราจะอ่านค่าทั้งหมดที่เห็นใน sub folder ของ NDP แล้วเลยเอาตัวที่ขึ้นต้นด้วย V เพื่อมาแสดงลงใน ListView ซึ่งใช้โค๊ดดังนี้

using (RegistryKey ndpKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine,
                RegistryView.Registry32).OpenSubKey(@"SOFTWARE\Microsoft\NET Framework Setup\NDP\"))
            {
                foreach (string versionKeyName in ndpKey.GetSubKeyNames())
                {
                    if (versionKeyName.StartsWith("v"))
                    {

                        RegistryKey versionKey = ndpKey.OpenSubKey(versionKeyName);
                        string name = (string)versionKey.GetValue("Version", "");
                        string sp = versionKey.GetValue("SP", "").ToString();
                        string install = versionKey.GetValue("Install", "").ToString();
                        if (install == "") //no install info, ust be later
                        {
                            ListViewItem item = new ListViewItem("  " + versionKeyName + "  " + name, GetImageVersion(versionKeyName));
                            listView1.Items.Add(item);
                            Console.WriteLine(versionKeyName + "  " + name);
                        }
                        else
                        {
                            if (sp != "" && install == "1")
                            {
                                ListViewItem item = new ListViewItem("  " + versionKeyName + "  " + name + "  SP" + sp, GetImageVersion(versionKeyName));
                                listView1.Items.Add(item);
                                Console.WriteLine(versionKeyName + "  " + name + "  SP" + sp);
                            }

                        }
                        if (name != "")
                        {
                            continue;
                        }
                        foreach (string subKeyName in versionKey.GetSubKeyNames())
                        {
                            RegistryKey subKey = versionKey.OpenSubKey(subKeyName);
                            name = (string)subKey.GetValue("Version", "");
                            if (name != "")
                                sp = subKey.GetValue("SP", "").ToString();
                            install = subKey.GetValue("Install", "").ToString();
                            if (install == "") //no install info, ust be later
                            {
                                ListViewItem item = new ListViewItem("  " + versionKeyName + "  " + name ,0);
                                listView1.Items.Add(item);
                                Console.WriteLine(versionKeyName + "  " + name);
                            }
                            else
                            {
                                if (sp != "" && install == "1")
                                {
                                    ListViewItem item = new ListViewItem("    " + subKeyName + "  " + name + "  SP" + sp, -1);
                                    listView1.Items.Add(item);
                                    Console.WriteLine("  " + subKeyName + "  " + name + "  SP" + sp);
                                }
                                else if (install == "1")
                                {
                                    ListViewItem item = new ListViewItem("    " + subKeyName + "  " + name , -1);
                                    listView1.Items.Add(item);
                                    Console.WriteLine("  " + subKeyName + "  " + name);
                                }

                            }

                        }

                    }
                }
            }
ตัวโปรแกรมสมบูรณ์ หาได้ที่นี้ครับ
Name : NetFrameworkWatcher
Version : 1.0
Type : Freeware
Dwonload :  ที่นี้


รับเขียนเว็บไซด์ เขียนระบบ .NET PHP ติดต่อ ชิน profrezz@gmail.com

วันอังคารที่ 6 พฤษภาคม พ.ศ. 2557

C# EventLog Viewer part II รู้หมด! ใครแอบมาใช้คอมเรา ภาคสอง


จากที่เคยแนะนำเรื่อง ดูการใช้งานล่าสุดใน EventLog ที่เราต้องเปิด Event Viewer ขึ้นมาเพื่อ เลือกดู log ย้อนหลัง เมื่อเราอยากรู้ว่าครั้งสุดท้ายที่เข้าใช้เป็นเวลากี่โมง เพื่อดักจับนั่นแหละว่าใครแอบมาใช้คอมเราไหม ตอนที่เราไม่ได้อยู่ ซึ่ง tool ที่ Microsoft คิดมานี้ ก็ละเอียดดีครับ แต่เป้าหมายเราคือดู Log สุดท้าย ไม่ได้ Log ทั้งหมด

เลยคิดเล่นๆว่าเขียนโปรแกรม แสดง Event Log สุดท้ายก่อนเมื่อวานนี้ก่อนที่เราจะ Shut down ดีกว่า จะได้รู้ว่าเวลาสุดท้ายที่เกิดการ Run Application นั้นเป็นเวลากี่โมง ซึ่งจะคิดเป็นวันต่อวันตามหลักการคนออฟฟิต นั่นคือ เริ่มงาน 8 โมง ถึงประมาณ 5 โมง หรืออาจถึง 4 ทุ่ม ซึ่งคิดเป็นวันต่อวันนั่นแหละ
นั่นหมายความว่าถ้าผม Shutdown เครื่องตอน 6 โมง แล้วกลับมาใช้คอมใหม่วันรุ่งขึ้น ผมจะสามารถอ่าน Event Log ล่าสุดของเมื่อวานได้ 6  โมงตรง ซึ่งเป็นเวลาที่ผม Shutdown เครื่องพอดิบพอดี ถ้า เวลาที่อ่านได้ มากไปกว่านี้ เช่น 1 ทุ่ม แสดงว่าผมลืม Shutdown หรือ อาจเพราะว่ามีคนเข้ามาใช้เครื่องคอมพิวเตอร์

หลักการก็ง่ายๆ ใน logic ของ โปรแกรม อธิบายสั้นๆคือ อ่าน Log มาจากระบบนั่นแหละ ซึ่งมีอยู่ด้วยกัน 3 ประเภทหลักๆ ได้แก่ Information, Warning, Error ซึ่งผมจะอ่านเอา Information เพราะเกิดจาก Service ต่างๆที่รันบนเครื่อง ตั้งแต่เปิดยันปิด ทำให้ได้ข้อมูลเวลาที่แม่นยำกว่า จากนั่นก็เรียงตามเวลาที่เกิดล่าสุดไป แล้วเทียบเวลาไปด้วย เมื่อไหร่ที่ Log อ่านพบว่ามีการขึ้นวันใหม่ จากค่าวันที่ที่อ่านได้แตกต่างกัน เช่น 17/7/2557 กับ 16/7/2557 แสดงว่าเป็นล็อกสุดท้ายที่เกิดในวันนั่น ผมก็เอามาแสดงที่ข้อความด้านขวา

เพิ่มเติม ผมตั้ง limit ไว้ 1000 เพราะคิดว่าใน 1 วันไม่น่าเกินจากนี้ ท่านสามารถ เพิ่มได้หรือลดได้ เพื่อประให้อ่านค่าได้ถูกต้อง เช่นเพิ่งเปิดเครื่องก็อาจเลือกที่ 100 ก็ได้ เพราะ 1000 บางทีค่าก็ทะลุไปวันที่สองที่สามที่ผ่านมา ซึ่งเอาเป็นว่าไว้ทำเว่อร์ชั่นถัดๆไปของโปรแกรมนี้ก็แล้วกัน

โค๊ดตัวอย่าง ดังนี้ครับ
private void getEventLog(object obj)
        {
            ClearText();
            listView1.Items.Clear();
            foreach (EventLog log in eventLog)
            {
                DateTime date = DateTime.Now;
                int count = int.Parse(this.txtCount.Text);
                int coun = 0;
                for (int i = log.Entries.Count - 1; i > log.Entries.Count - count ; i--)
                {
                    coun++;
                    if (i == -1) return;
                    var entry = log.Entries[i];
                    ListViewItem item;
                    item = new ListViewItem(coun.ToString());
                    item.SubItems.Add(entry.Source.ToString());
                    if (checkDate.Checked)
                    {
                        if (!dateTimePicker1.Value.Date.Equals(entry.TimeGenerated.Date))
                            continue;
                    }
                    else
                    {
                        if (date.Date > entry.TimeGenerated.Date)
                        {
                            date = entry.TimeGenerated.Date;
                            item = new ListViewItem(new string[] { entry.Source.ToString() }, "0", Color.Black, Color.Red, new Font(FontFamily.GenericSansSerif, (float)10.0));

                            txtName.Text = entry.Source.ToString();
                            txtTime.Text = entry.TimeGenerated.ToString();
                            txtType.Text = entry.EntryType.ToString();
                        }
                    }
                    if (checkType.Checked)
                    {
                        if (!entry.EntryType.ToString().Equals(comboType.SelectedItem.ToString()))
                            continue;
                    }

                    item.SubItems.Add(entry.EntryType.ToString());
                    item.SubItems.Add(entry.TimeGenerated.ToString());
                    item.SubItems.Add(entry.Message.ToString());
                    item.SubItems.Add(entry.MachineName.ToString());

                    listView1.Items.Add(item);
                    //Console.WriteLine(entry.TimeWritten);
                }
                Console.WriteLine("Count : " + coun);
                return;
            }

ดาว์นโหลดโปรแกรมได้ที่
Download EventLogViewerClick Here 

Name : EventLog Viewer
Type : Freeware v.1.00
Developer : Chin Chayut

วันจันทร์ที่ 5 พฤษภาคม พ.ศ. 2557

C# Threading เขียนโปรแกรมแบ่งเทรดยังไง



Thread คืออะไร ?
เทรดก็คือการแบ่งภาระงานประมวลผล ลองนึกภาพง่ายๆว่ามีโปรแกรมคำนวนการบวกเลขไปเรื่อยๆท้ะงหมด 4 ชุด แทนที่เราจะทำที่ละชุดคือ ทำชุดแรกก่อน เร็จค่อยไปชุดสอง เราสามารถแบ่งเทรด ให้มันคำนวนทีเดียวทุกชุดทั้ง 4 ตัวได้ โดยเวลาที่ใช้ไปจะประหยัดขึ้นมาก
แล้ว C# Thread เขียนยังไง มาดูกันครับ

อันดับแรกก็ต้องเพิ่มไลบราลี่ที่จำเป็นนั่นคือ using System.Threading;  โดยหลักๆ Thread ใน C# ที่ผมใช้บ่อยๆ จะแบ่งออกเป็น 2 ประเภท นั่นคือ “แบบเรียกฟังชั่นไม่มีตัวแปร” และ ”แบบเรียกฟังชั่นมีตัวแปร” เมื่อเขียนโค๊ด จะได้ลักษณะดังนี้ครับ

ตัวอย่าง ThreadStart สำหรับฟังชั่นไร้ตัวแปร ตัวอย่างนี้จะสร้างเทรดขึ้นมา 2 ตัว แล้วรันทุกตัวพร้อมกัน โดยเรียกฟังชั่นทั้งสองคือ โหลดข้อมูลจาก Text file และจาก Database ซึ่งทั้งสองตัวนี้จะแบ่งเทรดทำงานแยกกัน

// เริ่มสร้าง Thread
            Thread[] threadArray = new Thread[2];
            for (int i = 0; i < threadArray.Length; i++)
               {
                   if(i == 0 )
                      {
                    //ถ้า i เท่ากับ 1 จะทำฟังชั่นโหลดไฟล์
                    ThreadStart thread = new ThreadStart(loadTextFile);
                    threadArray[i] = new Thread(thread);
                    threadArray[i].Start();
                      }
                else if (i == 1)
                {
                    //ถ้า i เท่ากับ 1 จะทำฟังชั่นโหลดดาต้าเบส
                    ThreadStart thread = new ThreadStart(loadDB);
                    threadArray[i] = new Thread(loadDB);
                    threadArray[i].Start();
                }
               }

ตัวอย่าง ParameterizedThreadStart ตัวอย่างนี้เป็นการรันเทรดแบบมีตัวแปร นั่นคือผมจะรับค่า string ชื่อไฟล์เข้ามาด้วยเพื่อให้รู้ว่าต้องโหลดไฟล์ไหน

// เริ่มสร้าง Thread
Thread[] threadArray = new Thread[2];
            for (int i = 0; i < threadArray.Length; i++)
            {
                if (i == 0)
                {
                    // เริ่มสร้าง ParameterizedThreadStart.
                    ParameterizedThreadStart thread = new ParameterizedThreadStart(loadTextFile);
                    threadArray[i] = new Thread(thread);
                    threadArray[i].Start("config.txt");
                }
                else if (i == 1)
                {
                    // เริ่มสร้าง ParameterizedThreadStart.
                    ParameterizedThreadStart thread = new ParameterizedThreadStart(loadDB);
                    threadArray[i] = new Thread(thread);
                    threadArray[i].Start("USERDB");
                }
            }

สุดท้ายคือคำสั่งส่งเทรดไปพักผ่อน นั่นคืออนุญาติให้เทรดงีบหลับได้ตามเวลาที่กำหนด แล้วจึงกลับมาทำงานต่อ ใช้คำสั่ง Thread.Sleep(time) เมื่อ time คือเวลามีหน่วยเป็น มิลิวินาที (millisecond) เช่น
Thread.Sleep(2000);   หมายถึงให้เทรดพัก 2 วินาที แล้วจึงมาทำงานต่อบรรทัดถัดไป

วันพฤหัสบดีที่ 1 พฤษภาคม พ.ศ. 2557

[TortoiseSVN] icon overlay หายไปไหน! เรียกสเตตัสบน folder กลับคืนมา


นั่งเขียนโค๊ดอยู่ดีๆวันดีคืนดี icon แสดง status ของ TortoiseSVN ก็หายไปซะอย่างงั้น ไม่มีอีกแล้วสีเขียวที่แสดง lasted version กับสีแดงคือ modify version เนื่องจากงานยุ่งมากเลยไม่ได้ใส่ใจ คิดว่าถ้า restart เครื่องใหม่ก็น่าจะหาย วันนั้นทั้งวันเลยคอมมิตแบบนิมิตล้วนๆ เดาเอาว่าไฟล์ไหนเราแก้บ้าง เสียววูบ




หลังรีสตาทก็ยังไม่หายอีก แสดงว่า SVN น่าจะพังแล้วหล่ะ แล้ววันนี้ก็แก้หลายไฟล์ด้วย ด้วยคอมมิตแบบนิมิตอีกได้พังทั้งเซิฟแน่ เลยต้องนั่งหาทางแก้กันไปสรุปได้สั้นๆดังนี้

TortoiseSVN จะไปสร้างคีย์ใน shell icon overlay identifiers ให้เราอัตโนมัติ โดยมันก็มีลิมิตอยู่ว่าไม่เกินเท่าไหร่ แต่เมื่อโปรแกรมอื่นๆก็อยากสร้าง icon overlay ขึ้นมาเหมือนกันทำให้มันเกินลิมิตที่ Windows จะแบกรับไหวดังนั้นเราต้องเข้าไปลบตัวที่ไม่จำเป็นก็ใช้งานได้เหมือนกัน


เริ่มกันเลยไปที่ RUN แล้วใส่คำว่า "regedit"  เพื่อเปิดรีจิสเตอร์ขึ้นมาแก้ไข จากนั้นไปที่ HKEY_LOCAL_MACHINE > SOFTWARE > Microsoft > Windows > CurrentVersion > Explorer > ShellIconOverlayIdentifiers จะเห็นเรียงรายกันมาเป็นแถวๆเลยครับ ซึ่งเอสวีเอนก็จองไปละ 5-6 ตัว ให้ลบตัวที่เป็น TortoiseIgnore, TortoiseLocked พวกที่ไม่สำคัญที่คุณไม่ได้ใช้ จากนั้นให้ start task manager โดยการคลิกขวาที่ task bar > task manager แล้ว End task ตัว Explorer ซะแล้ว Restart มันขึ้นมาใหม่ หรือถ้ากลัวพัง ให้ restart เครื่อง 1 ครั้ง แล้ว SVN จะกลับมาเป็นไอคอนเขียว แดง เหมือนเดิม



ถ้ายังไม่หาย ลองคลิกขวาเลือก TortoiseSVN > Settings เลือกตามหาแทป Icon overlay แล้วติกเลือกตรงส่ง Network drives คลิก Apply แล้วกด OK เพียงแค่นี้ Folder ที่มี repository ก็จะเห็น icon แสดงเว่อร์ชั่นแล้วหล่ะครับ

ที่มา : http://www.sitepoint.com/missing-tortoisesvn-file-status-overlay-icons/

May be like this posts