איך ניתן לקבוע האם המחרוזת היא עברית?

נוסף ב-28/07/2010 16:27 על ידי דניאל כץ

לפעמים כשאנחנו שולפים טקסט מהמסד נתונים אנו מוצאים את עצמינו מתלבטים האם להציג אותו בדף כltr או כrtl.

כמובן, ניתן לבדוק:

אבל כל זה עדיין לא ייתן מענה למחרוזות מעורבות כדוגמת אלו:

  • האות הראשונה בא"ב האנגלי היא 'a'.
  • 'a' היא האות הראשונה בא"ב האנגלי.
  • the first latter of the hebrew abc is 'א'.
  • 'א' is the first latter of the hebrew abc.

הפתרון שנראה לי אינטליגנטי יותר, מבוסס על רוב התווים ה"חזקים": אם הרוב הוא עברי אזי המחרוזת נחשבת עברית אם לא – לא. במקרה של תיקו, האלגוריתם יקבע ע"פ האות החזקה הראשונה.

הסיבוכיות של האלגוריתם קטנה מO(n) שכן, הוא מסתיים ברגע שניתן להוכיח רוב תווים לצד זה או אחר, לדוגמה במחרוזת "אבגab" התוים "ab" כלל לא ייבדקו כי גם אם הן לא עבריות המחרוזת כבר מוכחת כעברית.

המתודה:

 public  static  bool  IsHebrewString(this  string  value)
 {
     int  balance = 0;
     int  firstLetter = 0;
 
     for  (int  i = 0; i < value.Length; i++)
     {
         if  (char .IsLetter(value[i]))
         {
             if  ((value[i] >= (char )0x5D0) && (value[i] <= (char )0x5EA))
                 balance++;
             else 
                 balance--;
 
             if  (firstLetter == 0)
             {
                 firstLetter = balance > 0 ? 1 : -1;
             }
         }
 
         if  ((value.Length - (i + 1)) < Math .Abs(balance))
             break ;
     }
 
     if  (balance == 0)
         return  firstLetter > 0;
 
     return  balance > 0;
 }
 

הנה כמה דוגמאות ליעילות האלגוריתם:

 bool  test1 = "האות הראשונה בא\"ב האנגלי היא 'a'." .IsHebrewString(); // true 
 bool  test2 = "'a' היא האות הראשונה בא\"ב האנגלי." .IsHebrewString(); // true 
 bool  test3 = "the first latter in hebrew abc is 'א'." .IsHebrewString(); // false
 bool  test4 = "'א' is the first latter in hebrew abc." .IsHebrewString(); // false 
 bool  test5 = "אבגabc" .IsHebrewString(); // true 
 bool  test6 = "abcאבג" .IsHebrewString(); // false 
 bool  test7 = "()!^." .IsHebrewString(); // false 
 

Tags: , , , ,

.NET 4.0 | Tools | .NET

חישוב גודל התגיות ב"ענן תגיות"

נוסף ב-20/04/2010 10:51 על ידי דניאל כץ

מספר פעמים נתקלתי בשאלה הזו בפורומים השונים. איך מחשבים את גודלן של התגיות ב"ענן תגיות" כך שיהיה ניתן לשלוט על הגודל המינימאלי והמקסימאלי של הפונט?

מה שחסר כאן זה ניסוח מתמטי פשוט:

Untitled-2_1

  • score -  הוא ערך "הניקוד" של התגית
  • minScore – הוא הערך של הניקוד הקטן ביותר שקיים
  • maxScore - הוא הערך של הניקוד הגבוה ביותר שקיים
  • minSize – הוא הערך של הפונט הקטן ביותר שתרצה להציג (הוא יוצב לתגית בעלת הניקוד הנמוך ביותר)
  • maxSize - הוא הערך של הפונט הגדול ביותר שתרצה להציג (הוא יוצב לתגית בעלת הניקוד הגבוה ביותר)

ערך הניקוד יכול להיות כל דבר שתרצו: מספר צפיות, דירוג ממוצע, מספר אייטמים המקושרים לתגית וכדו', זה לא משנה למשוואה.

הקוד הבא הוא מימוש של המשוואה הזו בC# 4.0: (לVS2008 ראה בהמשך)

 public  static  double  CalculateTagSize(double  score, double  minScore, double  maxScore, double  minSize, double  maxSize)
 {
     Contract .Requires<ArgumentOutOfRangeException >(minScore < maxScore, 
         "minScore must be smaller than maxScore." );
     Contract .Requires<ArgumentOutOfRangeException >(minSize < maxSize, 
         "minSize must be smaller than maxSize." );
     Contract .Requires<ArgumentOutOfRangeException >(score > minScore && score < maxScore, 
         "score must be greater than minScore and smaller than maxScore." );
 
     return  minSize + ((maxSize - minSize) * (score - minScore)) / (maxScore - minScore);
 }

בVS2008 של ניתן לעשות את הבדיקות באמצעות הContracts אז נשתמש במשפטי if וזריקת חריגות:

 public  static  double  CalculateTagSize(double  score, double  minScore, double  maxScore, double  minSize, double  maxSize)
 {
     if  (!(minScore < maxScore))
         throw  new  ArgumentOutOfRangeException ("minScore must be smaller than maxScore." );
     if  (!(minSize < maxSize))
         throw  new  ArgumentOutOfRangeException ("minSize must be smaller than maxSize." );
     if  (score < minScore || score > maxScore)
         throw  new  ArgumentOutOfRangeException ("score must be greater than minScore and smaller than maxScore." );
 
     return  minSize + ((maxSize - minSize) * (score - minScore)) / (maxScore - minScore);
 }

תיוג נעים לכולכם…

Tags: ,

.NET | .NET 4.0

Covariance and Contravariance in C# 4.0

נוסף ב-16/04/2010 13:33 על ידי דניאל כץ

גם אני כשנתקלתי לראשונה במושגים covariance וcontravariance הייתי מבולבל למדי בעצמי. אבל, מסתבר שלאחר הסבר קצר אלו בסך הכל מונחים למושגים שכולנו מכירים טוב מאוד. מושגי הvariance שאולים במקור מהתפלגות סטטיסטית במתמטיקה, שם השונות המשותפת (variance) היא מדד לקשר בין שני משתנים מקריים. השונות המשותפת חיובית כאשר המשתנים נוטים לסטות באותו כיוון, מעל או מתחת לממוצע, ושלילית כאשר הם משתנים בכיוונים מנוגדים זה לזה. משם הושאל המינוח למדעי המחשב, וליתר דיוק למינוח האפיון של שפות תכנות.

נניח מערכת טיפוסים בה קיים הטיפוס Animal וטיפוס Elephant היורש ממנו:

 class  Program 
 {
     public  class  Animal  { }
     public  class  Elephant  : Animal  { }

}

במערכת טיפוסים זו המרה מטיפוס אחד למשנהו נחשבת:

  • covariant – כשממירים טיפוס כללי יותר לטיפוס מצומצם יותר לדוגמה: מAnimal לElephant.
  • contravariant – כשממירים טיפוס מצומצם יותר לטיפוס כללי יותר לדוגמה: מElephant לAnimal.
  • invariant – כשממירים בין שני טיפוסים שאינם קשורים לדוגמה: מProgram לAnimal. עוד...

Tags:

.NET 4.0

Named and Optional Arguments in C# 4.0

נוסף ב-15/04/2010 14:50 על ידי דניאל כץ

ארגומנטים אופציונאליים והצבת ארגומנטים לפי שם

בC# 4.0 נוספה אפשרות להעביר ערך לארגומנט של מתודה בשמו (arg: "value") ולאו דווקא בסדר מסוים. אפשרות זו חיונית כדי לאפשר אפשרות חדשה נוספת שהיא - ארגומנטים אופציונאליים. הקוד הבא ממחיש העברה של הערך 1 לארגומנט ,copies את הערך"COLOR" לארגומנט ColorMode, ואת הערך "readme.txt" לארגומנט DocumentName:

 Print(copies: 1, colorMode: "COLOR" , documentName: "readme.txt");
 static  void  Print(string  colorMode, string  documentName, int  copies) {...}

ארגומנטים אופציונאליים מוכרזים בC# על ידי ציון ערך ברירת המחדל עבור הארגומנט: עוד...

Tags: ,

.NET 4.0

מה חדש בNet Framework 4.0. וVisual Studio 2010?

נוסף ב-17/09/2009 12:27 על ידי דניאל כץ

בסדרת המאמרים הבאה אכתוב על החידושים שמחכים לנו בגרסא החדשה של Net Framework. וVisual Studio. המאמר הזה ישמש כמפתח לסדרה, וככל שאעלה מאמרים חדשים אעדכן את הלינקים במפתח.

בסדרה זו אשתדל להיכנס לסיבות שהביאו להוספת כל אחת מהאפשרויות וכן להביא דוגמאות קוד ותסריטי שימוש לאפשרויות החדשות.

NET Framework 4.0.

 

  • CLR
  • BCL
    • Parallel Extensions
    • BigInteger
    • Variance annotations
    • Tuples
    • SortedSet<T>
    • שיפורים בFile System Enumeration
    • MemoryMappedFiles
    • שיפורים בעבודה עם Registry
    • עדכון מידע לUnicode 5.1
    • שיפורים בResourceManager
    • שיפורים בCompression
    • Corrupted State Exceptions
    • מחלקות אוספים Thread-Safe
  • ADO.NET
    • Persistence Ignorant Objects (POCOs)
    • Deferred Loading of Related Objects
    • מתודות של LINQ to Entities Queries
    • התאמה אישית של יצירת Object Layer Code
    • Model-First Support
    • Complex Type Support
  • ASP.NET
    • שיפורים בליבה
    • אפשרות להציב תגיות meta
    • יותר שליטה בview state
    • תמיכה של ASP.NET routing עבור Web Forms
    • יותר שליטה ביצירת הID
    • תמיכה בסינון עבור פקדי data source
    • קבצי Web.Config נקיים
  • WPF
    • פקדים חדשים: DataGrid, Calendar, DatePicker
    • תמיכת Multi-touch
    • פונקציות Easing

Visual Studio 2010

 

  • C# 4.0
  • IDE
    • חלונית Call Hierarchy
    • חלונית Navigate To feature
    • הדגשת הפניות
    • יצירת קוד על ידי שימוש
    • תמיכה של צריכה קודם הכרזה על ידי הIntelliSense
    • התאמה של חלקי שורה וראשי תיבות ע"י הIntelliSense
    • תמיכה בריבוי צגים באמצעות ניתוק חלוניות
    • HTML / ASP.NET / JavaScript Code Snippets

Tags:

.NET 4.0

כלי העבודה שלי 2009

נוסף ב-11/08/2009 22:20 על ידי דניאל כץ

כתיבת קוד

  • Visual Studio 2008 SP1 – סביבת העבודה המרכזית שלי, כאן אני יכול לכתוב C#, Vb.Net, JavaScript, Xml, Html, Css ועוד, ולקבל פידבק בזמן אמת על איכות הקוד שלי. הSP1 משפר ביצועים ומאפשר חיבור לSql Server 2008.
  • Visual Studio 2010 Beta1 – איזהו חכם?  - הרואה את הנולד. (F#, IronPython הנה אני בא.. בלנ"ד אסכם את כל החידושים של VS2010 במאמר נפרד לקראת שחרור Beta2)
  • Sql Server 2008 Express [חינמי] – שרת הנתונים המצוין מבית מיקרוסופט. הManagement Studion מאפשר לי לבנות מסדי נתונים במהירות, וכן לראות תכניות ביצוע (execution plan) עבור השאילתות שאני כותב ולייצא/להעלות את הנתונים לשרתים חיצוניים.
  • RegexBuddy – פשוט גדול מהחיים! התוכנה הופכת את חוויית הכתיבה של הביטויים הרגולריים מיגון לשמחה ומאבל ליום טוב. כולל אפשרויות יצירת קוד לפעולות בסיסיות עם Regex במספר שפות, וכן מאפשר דיבוג ויזואלי למדי.

Debugging

  • ANTS Profiler – מכיל את כל הכלים לבחינת הביצועים של אפליקציה דוט-נטית. הדרך הקלה ביותר למציאת צווארי בקבוק (bottlenecks) ודליפות זכרון (memory leaks).
  • Fiddler2 [חינמי] – דיבאגר לפרוטוקול הHTTP. בגרסתו האחרונה תומך גם בFirefox, ע"י צירוף בין השניים מאפשר לראשונה לעשות דיבוג על השרת Cassini של Visual Studio ולא רק על הIIS!
  • Firebug [חופשי] – כלי הכל יכול מסדרת התוספים לFirefox. מצוין למניפולציות על CSS וקבלת התוצאות בזמן אמת.
  • AnfiniL's Sql Express Profiler [חופשי] – מאפשר "להקשיב" לכל השאילתות שמבוצעות על שרת Sql Server נתון. השימוש העיקרי הוא לראות את השאילתות המיוצרות ע"י ADO.NET וLinq to Sql.

שונות

  • NET Reflector. [חינמי] – מציג קוד המקור (במספר שפות לבחירה) עבור הרכבות (Assembly) דוט-נטיות ומאפשר להתבונן במימוש הפנימי של מחלקות בBCL או בכל ספריה אחרת שלא עברה Obfuscation.
  • FileZilla FTP Client [חופשי] – לקוח FTP מצוין מבית Mozilla.

באינטרנט

  • codeplex.com – במה פתוחה מאת מיקרוסופט המיועדת לשיתוף קוד, וניהול פרויקטים בקוד פתוח. כאן תמצאו מגוון קודים מועילים וטכנולוגיות מתפתחות ותוכלו להשתתף בהתהוותם. בcodeplex נולדו טכנולוגיות כמו: ASP.NET MVC, IronPyton, ASP.NET 4.0, ASP.NET AJAX ועוד.
  • code.google.com – פלטפורמה נוספת לניהול פרויקטים בקוד פתוח. האתר קליל ומהיר. ואני מצאתי אותו כנח ביותר לפתיחת פרויקטים משלי.
  • Google Code Search – כלי שימושי מאוד לחיפוש קודים מן המוכן. כמובן שצריך קודם לדעת מה אתה מחפש כדי למצוא.. אה כן, עוד שימוש מועיל הוא לדעת כל מה שמעצבן מתכנתים.
  • browsershots.org – אם עוד לא שמעתם את השאלה: "מה לא בדקת את האתר בMSIE 4.0?!" זה רק אומר שאתם מסתובבים בחברת אנשים נורמאליים ולא טומן בחובו שום הבטחות לעתיד. קיצר, באתר הזה תוכלו לראות צילומי מסך מהאתר שלכם במגוון דפדפנים ובמגוון מערכות הפעלה בחינם.
  • המרת קוד Vb.Net ל#C – בתחילת השנה עברתי מלכתוב בעיקר בvb.net לשימוש עיקרי ב#C, התהליך די פשוט, אבל מצאתי את עצמי תקוע עם מלא קוד שימושי שכתוב בvb.net וכדי להכניס אותו לתוך פרויקט חדש (ב#C) בלי ליצור מדי הרבה בלגן אני נדרש לתרגם אותו.. אז הנה כלי שעושה את העבודה (בשני הכיוונים) אוטומטית (ב99% מהמקרים)!
  • javascriptcompressor.com – מצמצם קוד JavaScript ע"י הסרה של מעברי שורה ורווחים מהקוד, מועיל במיוחד לדחיסת קוד סטטי.

Tags: ,

Tools

העברת נתונים בין אפליקציית Flash לASP.NET באמצעות LoadVars

נוסף ב-27/02/2009 04:17 על ידי דניאל כץ

מסתבר, שאחת הדרכים המוכרות והפשוטות ביותר לשליחת וקבלת מידע ע"י פלאש היא באמצעות המחלקה LoadVars של ActionScript. למעשה, המימוש של LoadVars דומה יותר לטעינת קובץ מקומי מאשר למימוש תקשורת על גבי פרוטוקול HTTP, כשהקשר היחיד ביניהם הוא אירוע onHTTPStatus, שמחזיר את קוד המצב של הHTTP כשזה משתנה.

המחלקה LoadVars מסוגלת לבצע שאילתות GET וPOST, ולקבל נתונים בפורמט application/x-www-form-urlencoded שזה בעצם אותו פורמט הנתונים שמשמש אותנו למסירת פרמטרים בURL, וכן להעברת תגיות הFORM על גבי פרוטוקול HTTP בשאילתות POST. המעלה הברורה כאן היא הפשטות, כשהחיסרון, הבולט לא פחות, הוא הצורך לקודד הכל ובכך להכפיל את כמות התעבורה ברשת. חיסרון נוסף הוא היעדר אפשרות מובנית לביטוי הירארכיה (כמו JSON או XML), אך זה ניתן לתיקון ע"י יצירת פורמט נתונים מותאם אישית. אך לא על זה באתי לדבר.

במאמר הזה באתי לתאר פתרון שכתבתי לצורך תקשורת יעילה בין אפליקציית Web בASP.NET לבין אפליקציית Flash באמצעות המחלקה LoadVars. עוד...

Tags: , ,

.NET | Flash | AspNetFlashExtensions

Validator עבור שדות תאריך לידה

נוסף ב-07/06/2008 01:45 על ידי דניאל כץ
(Birth date fields validator)

נשאלה השאלה, איך אני מאגד את שלשת השדות של תאריך הלידה (יום, חודש ושנה) לערך אחד עבור ואלידציה (Validation)?

במצב הקיים, צריך להשתמש בשלש ואלידאטורים (Validators) מסוג RequiredFieldValidator ועוד 3 מסוג RangeValidator עבור טווח הערכים (למשל ימי החודש הם מ1 עד 31), וכל זה עדיין לא יעזור אם נרצה לבדוק טווח עבור כל התאריך בשלמות ולא עבור כל חלק שלו בנפרד. לפתרון לבעיה זו כתבתי WebControl שיורש מ – BaseCompareValidator בשם DateFieldsValidator.

DateFieldsValidator פותר את כל הבעיות שהזכרתי,

  • מכיל מאפיינים עבור 3 שדות (גם TextBoxים וגם DropDownListים ובעצם, כל דבר שנתמך ע"י הואלידאטורים הסטנדרטיים) אחד עבור כל חלק בתאריך
  • מכיל מאפיינים MinimumValue וMaximumValue לבדיקת טווח עבור התאריך בשלמותו.
  • לא תלוי בCulture מסויים (CultureInvariant).
  • מבצע וולידציה הן בצד לקוח (ללא רענון הדף), והן בצד שרת (במקרה שJavaScript מבוטל או לא נתמך בלקוח).
  • וכן תומך גם בכל הפיצ'רים האחרים של פקדי הואלידאציה הסטנדרטיים בFramework. עוד...

Tags: ,

.NET

Linq בזמן ריצה (Runtime)

נוסף ב-25/12/2007 02:47 על ידי דניאל כץ

במאמר זה נסקור את המתודולוגיה החדשה הנקראת Linq to Sql ונענה על השאלות: איך Linq ממומש ברמת הCLR? מהם המרכיבים המרכזיים בטכנולוגיה? ואיך ניתן לממש תשאול דינאמי בזמן ריצה (Runtime)? כל זה מלווה בדוגמאות קוד עם הסברים.

מה זה Linq?

מתודולוגיית Linq נוספה לNet. בגרסתה ה3.5, ומהווה מקבץ ביטויים לתשאול טיפוסים דמויי מערכים, או בעברית פשוטה – Linq יכול לתשאל כל טיפוס שמממש את הממשק IEnumerable. בנוסף חשוב לציין שעיקר התועלת במתודולוגיית Linq היא צורת הביטויים (Syntax) שמאפשרת לנו פשוט לציין מה אנחנו רוצים לעשות במקום להתמקד בדרך להגיע אל התוצאה הרצויה, נביא דוגמה:

Dim arr As IEnumerable(Of Integer) = New Integer() {0, 1, 2, 3, 4, 99}

Function WithoutLinq() As IEnumerable(Of Integer)

    Dim out = New List(Of Integer)

    For Each itm In arr

        If itm > 2 And itm < 10 Then

            out.Add(itm)

        End If

    Next

    Return out

End Function

Function UsingLinq() As IEnumerable(Of Integer)

    Return (From p In arr Where p > 2 And p < 10)

End Function

בדוגמה שני פונקציות שמחזירות את כל המספרים שגדולים מ2 וקטנים מ10 מתוך המערך arr שמוכרז בתחילת הדוגמה. ההבדל היחיד ביניהם הוא בצורת הכתיבה. בפונקציה WithoutLinq אנו מבצעים את הסינון ללא שימוש בLinq ולכן נאלצים לכתוב הרבה קוד שלא מעניין אותנו בכלל, כמו לולאת For Each או לולאת מונה וכדומה. להבדיל, בפונקציה UsingLinq, אני מקבל את אותה התוצאה ע"י שאני פשוט כותב "תוציא את כל האיברים שמתקיים בהם התנאי X" וLinq דואג לכל השאר.

בנוסף, Linq מהווה יסוד למספר טכנולוגיות נוספות כגון Linq to Sql. עוד...

Tags: , ,

.NET 3.5

טעינה של Xhtml דרך XmlDocument

נוסף ב-07/09/2007 09:03 על ידי דניאל כץ

במאמר זה נביא מספר טיפים לשימוש במחלקות ממרחב שמות System.Xml מול תוכן Xhtml. וכן פתרונות לבעיות תאימות בין התקנים. הבעיות שנסקור כאן הם: איך לגרום לקורא Xml לא להתעלם מרווחים בין התגים, ואיך לקצר את זמן הטעינה על ידי דילוג על Validation מול www.w3.org.

דבר ראשון, נשים לב לבעיה קטנה שתצוץ בכל פעם שננסה לפתוח תוכן Xhtml ע"י מחלקות ממשפחת System.Xml, כל הרווחים שבין התגים ייעלמו לדוגמה השורה הבאה: עוד...

Tags: , ,

.NET