\

Facebook


วันจันทร์ที่ 6 กรกฎาคม พ.ศ. 2558

[Note] Error บน ASPX และ IIS

บทความนี้เก็บโน๊ต error ทั้งหมดที่ผมเคยเจอพร้อมวิธีแก้ น่าจะมีประโยชน์ครับถ้าเจอคล้ายๆกันและเอาไปปรับใช้กับ IIS จอมงอแง แตะนิดแตะหน่อยติดเออเรอตลอด


1. ตัวแรก Interop.MSXML2 โหลดไม่สำเร็จให้ลอง check app pool ดูว่าเป็นเวอร์ชั่นไหน ถ้ายังคงเป็น 2.0 ให้ลองเเก้เป็น 4.0 เเล้วรีสตาร์ทอีกครั้ง

Configuration Error

Description: An error occurred during the processing of a configuration file required to service this request. Please review the specific error details below and modify your configuration file appropriately.


Parser Error Message: Could not load file or assembly 'Interop.MSXML2' or one of its dependencies. This assembly is built by a runtime newer than the currently loaded runtime and cannot be loaded.



2. เวลาสร้าง table หรือ store procedure ใหม่แล้วเรียกใช้งานผ่าน ASP.NET execute store แสดง error : sql server invalid object name อาจเกิดจากการบันทึก cache ของตัง SQL Manager เองให้ลอง refresh ฐานข้อมูลก่อนจนกระทั้งเห็น Object ที่สร้าง แล้วเลือกคำสั่ง

Edit -> IntelliSense -> Refresh Local Cache  หรือ Ctrl + Shift + R

ตามรูป





3. เวลาใส่อักษรพอเศษเข้าไปก่อน POST REQUEST  เช่น $&#*(@&$*(#@&$*(#&$*(#&$*(#@&$)#(@$)#@*$)#@($*)(@

Server Error in '/' Application.

A potentially dangerous Request.Form value was detected from the client (ctl00$cpContent$txtCampaignID="$&#*(@&$*(#@&$*(#&$*(...").

Description: ASP.NET has detected data in the request that is potentially dangerous because it might include HTML markup or script. The data might represent an attempt to compromise the security of your application, such as a cross-site scripting attack. If this type of input is appropriate in your application, you can include code in a web page to explicitly allow it. For more information, see http://go.microsoft.com/fwlink/?LinkID=212874.

Exception Details: System.Web.HttpRequestValidationException: A potentially dangerous Request.Form value was detected from the client (ctl00$cpContent$txtCampaignID="$&#*(@&$*(#@&$*(#&$*(...").

Source Error:


[No relevant source lines]

Source File: c:\Users\ITspare03\AppData\Local\Temp\Temporary ASP.NET Files\root\9b6fe0e4\13708e62\App_Web_cwkso5lr.2.cs    Line: 


วิธีแก้ ให้เข้าไปเพิ่มบรรทัดนี้ใน system.web อย่าลืมตั้ง target framework เป็น 4
  <system.web>
    <compilation debug="true" targetFramework="4.0" />
    <pages validateRequest="false" />
    <httpRuntime requestValidationMode="2.0" />
  </system.web>

วันเสาร์ที่ 2 พฤษภาคม พ.ศ. 2558

[ C# ] โปรแกรมคำนวน Keyword Density


อย่างที่รู้กันว่า Google จัดอันดับเว็บไซด์ด้วยความเกี่ยวข้องของเนื้อหาบทความและ keywords ที่ต้องการค้นหา ซึ่งก็มีหลายหลายเครื่องมืออยู่แล้วในท้องตลาดที่ช่วยคำนวนความถี่ของคีย์คิดเป็นเปอร์เซนต์ แต่วันนี้ผมอยากลองเขียนโปรแกรมคำนวนขึ้นมาใช้เองดูบ้างครับ

เริ่มจากการรับข้อความ string เข้ามานั้น ต้องเอาเข้าฟังชั่นตัดคำก่อน ซึ่งภาษาอังกฤษนั้นถูกสร้างขึ้นมาให้ผสมไปด้วยวรรคคำทำให้ง่ายต่อการแบ่งคำเป็นส่วนๆแตกต่างจากภาษาอื่นๆเช่นภาษาไทยที่ใช้การแบ่งคำด้วยคำในพจนานุกรมซึ่งโจทย์นั้นยากกว่ามาก จัดข้องความเข้า split() ด้วยอักษร “ ”(เว้นวรรค) เลยครับงานนี้หมูๆ

จากนั้นต้องลบคำที่ไม่เกี่ยวข้องในการคำนวนความถี่ซึ่งประกอบไปด้วย ตัวเลข อักขระพิเศษ เครื่องหมายและสัญลักษณ์ ซึ่งทั้งหมดนั้นผมวิเคราะห์โดยใช้ Case Sensitive นั้นคือการเริ่มคำด้วยอักษรตัวเล็กหรือตัวใหญ่นั้นให้ถือเป็นคนละคำ หลังจากที่เตรียมอักษรพร้อมแล้วขั้นตอนต่อไปก็คือการคิดเป็นเปร์เซนต์

จากสูตร (ความถี่ของคำ / จำนวนคำทั้งหมด) x 100 ก็จะได้ผลลัพท์ออกมาเป็นโปรแกรมคำนวน Keyword Density ตามโค๊ดตัวอย่างข้างล่างนี้

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace KeywordDensity
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            dataGridView.DataSource = GetResult(richTextBox.Text);
            dataGridView.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
            dataGridView.Update();
            textBox.Text = analyzeText.Count().ToString();
            textBoxMess.Text = countMess.ToString();
        }
        public string[] analyzeText;
        public int countMess = 0;
        private DataTable GetResult(string text)
        {
            string newText = prepareText(text);
            analyzeText = new string[] { };
            analyzeText = newText.Split(' ');
            double countWords = analyzeText.Count();
            List listResult = new List();

            foreach (string key in analyzeText)
            {
                if (key == " " || key == string.Empty || key.ToLower() == "a" ) continue;
                if (listResult.Where(it => it.key.Equals(key)).Any())
                {
                    
                    listResult.First(it => it.key.Equals(key)).freq++;
                    listResult.First(it => it.key.Equals(key)).percent = (listResult.First(it => it.key.Equals(key)).freq/countWords) * 100.0;
                    double a = listResult.First(it => it.key.Equals(key)).freq;
                }
                else
                {
                    listResult.Add(
                        new KeywordModel()
                        {
                            key = key,
                            freq = 1,
                            percent = (1.0 / countWords) * 100,
                        }
                        );
                }
            }
            DataTable dt = new DataTable();
            dt.Columns.Add("Keyword");
            dt.Columns.Add("Frequency");
            dt.Columns.Add("Percent");
            DataRow dr;
            foreach (var result in listResult.OrderByDescending(it => it.freq))
            {
                dr = dt.NewRow();
                dr[0] = result.key;
                dr[1] = result.freq;

                dr[2] = result.percent.ToString().Substring(0, result.percent.ToString().IndexOf('.') + 2) +"%";
                dt.Rows.Add(dr);
            }

            return dt;
        }
        private string prepareText(string originalText)
        {
            countMess = 0;
            string[] exceptWords = ("As ; as ; and ;And ; the ;The ;.; many ; much ;0;1;2;3;4;5;6;7;8;9;{;};(;);:;!;@;#;$;%;&;*;"
                                    +" you ;You ; of ;Of ; for ;For ; is ;Is ; are ;Are ; into ;Into ; it ;It ;"
                                    +" in ;In ; to ;To ; or ;Or ; if ;If ; with ;With ; that ;That ").Split(';');
            foreach (string c in exceptWords)
            {
                if (c != "")
                {
                    originalText = originalText.Replace(c, " ");
                    countMess++;
                }
            }
            return originalText;
        }

        public class KeywordModel
        {
            public string key { get; set; }
            public int freq { get; set; }
            public double percent { get; set; }
        }
    }
}

จากตัวอย่าง Windows Application ประกาศตัวแปร exceptWords เพื่อจัดเป็น array ของคำที่ต้องการตัดทิ้ง อย่าลืมแก้ไขกันก่อนด้วยถ้าอยากเพิ่มหรือลบคำใดเข้าไป

ปรับปรุงโค๊ดยังไง
1 เพิ่มส่วนของคำที่ไม่รวมเข้ากับการคำนวนเช่น  the, and, or
2 ปรับปรุงการ search คำแบบอื่นที่ไม่ใช่ for loop

วันจันทร์ที่ 20 เมษายน พ.ศ. 2558

วิธีแก้ Couldn't Mount File

สำหรับไฟล์ประเภท iso บน Windows 8.1 สามารถ mount หรือจำลอง disk ตัวนั้นได้เป็นไดฟ์ตัวใหม่ ทำให้ใช้งานไฟล์ข้างในได้โดยไม่ต้องเขียนลงแผ่นซีดีแบบเดิมๆ แต่ถ้าใครเจอปัญหาเดียวกันนี้


Sorry, there was a problem mounting the file.









แก้ไขง่ายๆด้วยการ copy ไฟล์ไปลงไดเรกเทอรี่อื่น เพียงเท่านี้ก็ใช้งานได้ตามปกติ เอิ้ก!! เมื่อวานผมก็นั่งงงตั้งนานสองนานว่าไฟล์เสียหรือเปล่า ทดลองเขียนลง USB ก็ปกติดี สามารถบูทได้ตามปกติ เพียงเเค่ไม่สามารถ mount ได้แต่พอ copy ไฟล์ไปไว้ที่อื่นเท่านั้นแหละดันใช้ได้ตามปกติ

วันจันทร์ที่ 23 มีนาคม พ.ศ. 2558

[Android] Stream เสียงจาก PC บน Network ด้วย SoundWire



ใครเคยมีประสบการณ์ จู่ๆลำโพง  Notebook ก็งอแง"เสียงแตก"ไปเฉยๆ ทำให้ต่อหาวิธีอื่นที่จะเปิดเสียงโดยไม่ใช่หูฟัง มาทางนี้ครับ Android สามารถรับ stream เสียงบน network "เพื่อเปิดออกลำโพงของมือถือ"


App ที่ว่านี้มีชื่อว่า SoundWire ครับผม ซึ่งวันนี้ ผมจะมารีวิวการใช้งานให้เพื่อนๆทดลองเล่นแอปตัวนี้ดู การใช้งานก็ไม่อยากครับ ท่านต้องมี app บนอุปกรณ์ Android ชื่อว่า SoundWire (free tial) สามารถค้นหาชื่อนี้จาก Google Play Store ได้เลยครับ ส่วนทางด้าน PC ก็ไปตาม link ด้านล่างนี้เลยครับ

Android Version : https://play.google.com/store/apps/details?id=com.georgie.SoundWireFree&hl=th
PC Version :  http://soundwire-server.en.uptodown.com/

ต่อไปคือส่วนที่สำคัญที่สุดนั้นคือต้องเชื่อมต่อ "เน็ตเวิร์ค" ตัวเดียวกัน เพื่อให้มือถือมองเห็น IP Address ของฝั่งคอมพิวเตอร์ เพราะตัวพีซีเองจะทำตัวเหมือนเป็น audio streaming ซึ่งอุปกรณ์ที่เชื่อมต่อเข้ากับไอพีนี้จะสามารถฟังเสียงได้นั้นเอง ซึ่งถ้าท่านไม่มี router เป็นของตัวเองแนะนำให้ต่อเข้ากับ TRUE Wifi ได้เลยครับ


ตัวโปรแกรมไม่ได้ซับซ้อนอะไรครับ เพียงเเค่รัน exe เเล้ว จะได้ IP ปัจจุบันมา ซึ่งต้องนำไอพีนี้ไปกรอกใน app android อีกทีนึง นอกจากนี้ก็มี option 
- input select : เลือก input 
- status : สถานะ ถ้า connected เเสดงว่าเชื่อต่อเเล้ว
- Audio output : ระดับ volyume
- Record flie : บันทึกไฟล์เสียง 

ทางฝั่ง Androd ให้กรอกไอพี เเล้วกดที่ logo ของแอป ที่เหลือก็เเค่เพียงเปิดลำโพงดังๆตามใจชอบเลยครับ ซึ่งข้อดีของแอปนี้คือ




1. สะดวกในการหาลำโพงเสริมความดังด้วยมือถือ
2. สามารถต่อมือถือได้หลายๆตัว เพียงแค่มีแอปตัวนี้
3. ใช้งานง่าย เเค่มี network

ข้อเสีย
1. เว่อร์ชั่น free มี limit ในการใช้งาน
2. เสียง delay อยู่นิดๆ ตามความเเรงสัญญาณ
3. ถ้า network สัญญาณอ่อนมากๆเช่นใช้งาน true wifi ตอนเย็นๆ เสียงจะ delay และขาดตอนมากๆ ควรมี router ส่วนตัวอยู่เเล้ว

สรุป ใช้งานง่ายครับ เอาไว้เเก้ขัดกรณีลำโพงเสีย รอซ่อม ให้ 9/10

วันอังคารที่ 24 กุมภาพันธ์ พ.ศ. 2558

[PHP] วิธีจับ Notice มาเป็น Exception ใน TryCatch


ในภาษาพีเฮชพี Notice กับ Warning ไม่ถือเป็น runtime error ครับ ทำให้เวลาเราครอบด้วย try catch มันก็จะไม่เด้งไปที่ส่วนของ Exception  ex เเต่จะขึ้นข้อความขึ้นมาเเจ้งเตือนแทน ซึ่งส่วนใหญ่ก็คุ้นกับการตั้งค่า error_report() ให้ซ่อนข้อความเหล่านั้นไป

เเต่ถ้าอยากตั้งกฎขึ้นมาใหม่ว่า Notice  ก็ถือเป็น Exception ตัวหนึ่ง(เช่น Undefined index เป็นต้น) ก็ต้องจัดการด้วยฟังชั่น set_error_handler() เองครับ

ซึ่งบทความนี้ ผมจะแนะนำการจัดการ error ด้วยฟังชั่นเราเอง เช่นผมจะนับว่าการไม่เจออินเด็กใน array ถึงว่าผิดพลาด ก็ให้สร้างฟังชั่นนี้ขึ้นมาครับ

function errorHandlerCatchUndefinedIndex($errno, $errstr, $errfile, $errline ) {
    // In case Undefined index
    if (substr($errstr, 0, 16) == 'Undefined index:') {
     throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
   } 
    return false;
}

เเล้วเรียกฟังชั่นด้วยคำสั่งนี้ ก่อนเข้า try

   // Set Notice return Error
   set_error_handler("errorHandlerCatchUndefinedIndex");

หลับจบ catch หรือ finally ใส่คำสั่งนี้เพื่อกลับคืนสู่การตั้งค่า error ปกติของระบบ

   // Restore Error
   restore_error_handler();

หน้าตาโค๊ดจะออกมาประมาณนี้

 set_error_handler("errorHandlerCatchUndefinedIndex");
try{
//do something!!
}catch(Exception $e){
restore_error_handler();
}
restore_error_handler();


อ้างอิง http://stackoverflow.com/questions/3261051/how-to-catch-an-undefined-index-e-notice-error-in-simpletest

[XAMPP] เร่งความเร็ว Apache ด้วย mod_log_config


 เคยไหมครับเวลาใช้งาน XAMPP เป็นเซิฟเว่อร์จำลอง แล้วเเต่ละ request ที่ส่งไปใช้เวลานานเหลือเกิน ตั้ง timeout ไว้ 30 วินาที บางครั้งยังไม่พอ แล้วหลังจาก Return ข้อผิดพลาดกลับดันเป็นแค่ Notice ธรรมดา จนบางคนแก้ปัญหาด้วยการ ประกาศปิด Notice กับ Error ไว้ที่หัวไฟล์ซะเลย

แต่พอระบบใหญ่ขึ้นมา เจอโจทย์แบบว่า "Notice เป็นแบบไหนต้องแก้ให้ได้ทั้งหมด" ซึ่งส่วนใหญ่มันจะเกิดจากสาเหตุที่ object ไม่มีอยู่จริง, อินเด็กที่เรียกไม่มีอยู่ หรือ Loop ไม่มีสมาชิกอยู่เลย(count=0)  วนๆกันอยู่ประมาณนี้แหละครับ

เวลาฝั่ง Server เจอข้อผิดพลาด จะทำการเก็บล็อกเอาไว้ ซึ่งวิธีที่จะเร่งความเร็วเพิ่มขึ้นวันนี้ก็คือการ เพิ่มความเร็วในการบันทึก Log นั่นเอง โดยใช้โมดูลที่มีชื่อว่า mod_log_config โดยหากใช้ XAMPP เวอชั่น WINDOWS ก็ทำตามนี้ครับ เปิด "httpd.conf" ขึ้นมาแล้วเพิ่มบรรทัดข้างล่างเข้าไป

<IfModule mod_log_config.c>
  LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"**%T/%D**" combined
  CustomLog logs/access.log combined
  <IfModule mod_deflate.c>
    DeflateFilterNote Input instream
    DeflateFilterNote Output outstream
    DeflateFilterNote Ratio ratio
    LogFormat '"%r" %{outstream}n/%{instream}n (%{ratio}n%%)' deflate
    CustomLog logs/deflate.log deflate
  </IfModule>
</IfModule>


มันคือการเพิ่ม format ของ Log นั่นเอง ซึ่ง %T คือเวลาที่ใช้ในหน่วย millisec เเทนที่จะเป็นแค่ sec ซึ่งจะออกมาหน้าตาประมาณนี้

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"**%T/%D**" combined

that is logging the time spent to serve the request but in microseconds (10-6) instead of seconds.(อ้างอิง)
 ที่มา: http://www.ducea.com/2008/02/06/apache-logs-how-long-does-it-take-to-serve-a-request/
ปล. ใช้ได้กับ apache version 2.0.x ขึ้นไป

ผมยังไม่ได้เทส จริงจังนะครับ ว่าไวขึ้นจริงๆไหม (ดันมาเจอบทความตอนโปรเจกค์ใกล้จบ) ใครเทสเเล้ว work หรือไวขึ้นจริงๆ post comment ไว้ด้วยนะครับ

วันจันทร์ที่ 23 กุมภาพันธ์ พ.ศ. 2558

PHP Simple HTML DOM Parser API

รวบรวม API ของ Simple HTML DOM เอาไว้ครับ สำหรับ link เต็มๆของหน้าหลักอยู่ที่นี้ คลาสตัวนี้เมื่อโหลดลงมาใช้มีประโยชน์ที่แปลงมาร์คอัพประเภท html ให้เป็น object DOM ทำง่ายต่อการค้นหา node ที่ต้องการไปใช้ต่อ บลาๆๆ ขี้เกียจอธิบาย จริงๆก็รู้กันอยู่เเล้ว แต่อยากรวบรวม ฟังชั่นที่ใช้บ่อยๆ+จำเป็น เอาไว้กันลืมครับ


อันนี้ Method >> ที่ผมใช้บ่อยๆ childNodes() , parentNode() เป็นต้นครับ การลบ element ของ DOM ทำไม่ได้ ต้องเลี่ยงมาใช้ removeAttribute() แทน เช่นลบ link ใน <iframe> เป็นต้น


Method Mapping
array
$e->getAllAttributes ()
array
$e->attr
string
$e->getAttribute ( $name )
string
$e->attribute
void
$e->setAttribute ( $name, $value )
void
$value = $e->attribute
bool
$e->hasAttribute ( $name )
bool
isset($e->attribute)
void
$e->removeAttribute ( $name )
void
$e->attribute = null
element
$e->getElementById ( $id )
mixed
$e->find ( "#$id", 0 )
mixed
$e->getElementsById ( $id [,$index] )
mixed
$e->find ( "#$id" [, int $index] )
element
$e->getElementByTagName ($name )
mixed
$e->find ( $name, 0 )
mixed
$e->getElementsByTagName ( $name [, $index] )
mixed
$e->find ( $name [, int $index] )
element
$e->parentNode ()
element
$e->parent ()
mixed
$e->childNodes ( [$index] )
mixed
$e->children ( [int $index] )
element
$e->firstChild ()
element
$e->first_child ()
element
$e->lastChild ()
element
$e->last_child ()
element
$e->nextSibling ()
element
$e->next_sibling ()
element
$e->previousSibling ()
element
$e->prev_sibling ()

ส่วนอันนี้ เป็น element ท่องไว้เลย ยังไงก็ได้ใช้



May be like this posts