Posted by
talgiladi on
7/5/2010 2:30 PM |
Comments (0)
לאחרונה הייתי צריך להוציא את תיעוד הקוד לקבצי HTML, לא תהליך מסובך אבל בכל זאת צריך לעקוב אחר כמה צעדים כדי להימנע מעצבים מיותרים…
1. הורדת והתקנת HtmlWorkShop – התוכנה שמאפשרת לייצר קבצי עזרה מסוג chm (הגירסה האחרונה הייתה 4.74.8702.0)
http://download.microsoft.com/download/0/A/9/0A939EF6-E31C-430F-A3DF-DFAE7960D564/htmlhelp.exe
2. אפשרי ורצוי להוריד ולהתקין את ערכת הפיתוח של ויזו’אל סטודיו. אני עובד עם גירסת 2008
http://download.microsoft.com/download/c/2/0/c20073e0-c842-44a8-a4e9-7dd5d289eafe/VsSDK_sfx.exe
3. הורדת והתקנת SandCastle ממיקרוסופט (הגירסה האחרונה הייתה 2.4.10520)
http://www.microsoft.com/downloads/details.aspx?familyid=e82ea71d-da89-42ee-a715-696e3a4873b2&displaylang=en#Instructions
4. הורדת והתקנת הממשק של SandCastle (הגירסה האחרונה הייתה 1.8.0.3)
http://shfb.codeplex.com/
5. הרצת הממשק. יש לבחור בחלונית ProjectExplorer תחת Sources את קבצי הקוד. אפשר לבחור גם סולושן שלם.
לחיצה על Build תיצור את הקבצים. אם עדיין יש בעיה תנסו לתת לו את הערך HtmlHelp1xCompilerPath ידנית – שזה הנתיב לקבוץ HtmlWorkshop שהתקנתם בסעיף 1, שבברירת מחדל יהיה ..\..\Program Files\HTML Help Workshop\
Be the first to rate this post
- Currently 0/5 Stars.
- 1
- 2
- 3
- 4
- 5
הפעם נדבר על הצפנה אסימטרית. מה הכוונה? ובכן, החיסרון הכי גדול של הצפנה סימטרית הוא כיצד להעביר לצד השני את המפתח/סיסמא. הרי הסיבה העיקרית שרצינו להשתמש בהצפנה היא כי אנחנו לא בוטחים בדרך שהמידע עובר בה ובאנשים שיראו אותו בדרך, אז איך נעביר את המפתח באותו הדרך??אז יש פיתרון... הצפנה אסימטרית. הפעם אין מפתח אחד שיכול גם להצפין וגם לפתוח את ההצפנה, אלא יש מפתח אחד (מפתח פרטי) שיכול גם להצפין וגם לפענח את ההצפנה, ויש מפתח אחד (מפתח ציבורי) שיכול רק להצפין. אז מה יצא לנו מזה? ככה, אנחנו מפרסמים לכולם את המפתח הציבורי שלנו, אז הם יכולים כעת להצפין את המידע מאצלהם, ואז לשלוח אלינו, ורק אנחנו עם המפתח הפרטי יכולים לפענח את ההצפנה... נחמד...ואם אני רוצה לשלוח להם תשובה מוצפנת בחזרה? אז שוב, או שהצד השני ישלח לי מפתח ציבורי משלו, ואז לאחר שאצפין את התשובה עם המפתח שלו, אחזיר לו את המידע המוצפן והוא יפענח אותו עם המפתח הפרטי שלו, או, שבעזרת המפתח הציבורי ששלחתי לצד השני בהתחלה, הוא יצפין לי מפתח/סיסמא להצפנה סימטרית ואז פשוט נמשיך את השיחה שלנו בעזרת הצפנה סימטרית(שזו השיטה הסטנדרטית שבה עובד SSL) . למה שיטה זו עדיפה? ובכן, ההצפנה האסימטרית דורשת הרבה מאמץ מהמעבד והיא מאוד איטית ביחד לשיטה הסימטרית.ועכשיו לקצת קוד:
קודם ניצור זוג מפתחות , אם עדיין אין לנו:המחלקה ב C# שמשמשת להצפנה אסימטרית נקראת RSACryptoServiceProvider (שלוש אותיות ראשונות על שם בוני האלגוריתם...)
ניצור אובייקט חדש, והוא כבר ייצר עבורנו זוג מפתחות:
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider ();
את המפתח הפרטי (שלנו, שיכול לגם לפענח וגם להצפין) ניצור באמצעות הפונקציה ToXmlString עם פרמטר true להוספת המידע של מפתח פרטי בסטרינג שמתקבל:
string privateKey= rsa.ToXmlString(true);
את המפתח הציבורי ניצור באותה שיטה אך על ידי שליחת ערך false כדי שלא להוסיף את המידע על מפתח פרטי לה
string publicKey = rsa.ToXmlString(false);
כעת נפרסם את המפתח הציבורי שלנו, ומי שירצה להצפין לנו הודעה ישתמש בו בעת ההצפנה:
ניצור אובייקט הצפנה:
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider ();
נאתחל אותו עם המפתח הציבורי:
rsa.FromXmlString(publicKey);
נהפוך את המידע שאנו רוצים להצפין למערך בתים:
byte[] clearData=Encoding.UTF8.GetBytes(clearText);
נבצע את ההצפנה :
byte[] encryptedData = rsa.Encrypt(clearData, false);
ונהפוך חזרה לסטרינג שניתן לשליחה בתור טקסט באימייל או דף אינטרנט:
string encryptedString = Convert.ToBase64String(encryptedData);
כעת לאחר שהצד השני שלח לנו את הסטרינג המוצפן, נשתמש במפתח הפרטי לפענח את ההודעה :
ניצור אובייקט הצפנה חדש ונאתחל אותו עם המפתח הפרטי שלנו:
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider ();
rsa.FromXmlString(privateKey);
נהפוך את המידע המוצפן שקיבלנו למערך בתים:
byte[] encryptedData = Convert.FromBase64String(encryptedString);
נבצע את הפיענוח:
byte[] clearData = rsa.Decrypt(encryptedData, false);
ונהפוך לטקסט קריא:
string clearText = Encoding.UTF8.GetString(clearData);
זהו... די פשוט
להורדת קבצי מקור ופרוייקט
Be the first to rate this post
- Currently 0/5 Stars.
- 1
- 2
- 3
- 4
- 5
Posted by
talgiladi on
11/1/2009 12:28 PM |
Comments (0)
It starts with a random question, but continues with a well designed pattern...
static void Main(string[] args)
{
string source = null;
while (true)
{
if (source == null)
{
source = GetTheQuestionThatMostInterestsMeNow();
}
Console.WriteLine("Why " + source + "?");
var answer = Console.ReadLine();
var nextQuestion = ThinkDeeplyAboutTheAnswerAndGetTheNextQuestion(answer);
source = nextQuestion ?? source;
}
}
private static string GetTheQuestionThatMostInterestsMeNow()
{
return "are the birds singing";
}
private static string ThinkDeeplyAboutTheAnswerAndGetTheNextQuestion(string answer)
{
string result = null;
if (answer != null)
{
int index;
if ((index = answer.IndexOf("because", StringComparison.OrdinalIgnoreCase)) > -1)
{
answer = answer.Substring(index + "because".Length);
}
result = answer;
}
return result;
}
Be the first to rate this post
- Currently 0/5 Stars.
- 1
- 2
- 3
- 4
- 5
Posted by
talgiladi on
6/28/2009 12:07 PM |
Comments (0)
המטרה: ליצור שפה אחידה שמתארת את ההנחות והציפיות שלי כשאני משתמש באובייקט של מישהו אחר, או כשמישהו אחר משתמש
באובייקט שאני כתבתי. נשמע לא מובן, אך כולנו בעצם עושים את זה יומיום, השינוי היחיד הוא שאנו רוצים לעשות את זה בצורה אחידה.
היום כשאני מקבל ערך לאיזה מאפיין במחלקה שלי, אני בודק האם הערך תקין, האם הוא לא ריק וכו’, ואם הערכים לא מתאימים לי, אני זורק
הודעת שגיאה בדרך כלל:
private int _age;
public int Age
{
get
{
return _age;
}
set
{
if (value < 0)
{
throw new ArgumentException("Age must be a positive value");
}
_age = value;
}
}
ואיך נכתוב את זה באמצעות חוזה?
private int _age;
public int Age
{
get
{
return _age;
}
set
{
Contract.Requires(value > 0);
_age = value;
}
}
זהו…
הקוד עדיין בתהליכי פיתוח במייקרוסופט, אך הוא מופץ כבר משולב בתוך דוט נט גירסה 4, וניתן להורדה גם עבור ויז’ואל סטודיו 2008.
אז מה יש לנו שם עוד?
יש כמה דברים מעניינים, לדוגמה:
- בדיקה של הערכים שפונקציה יכולה להחזיר, לפני שהיא מחזירה אותם. בדיקה
- סטטית(compile time) של קריאות עם ערכים לא תקינים לפונקציה כך שאנו מקבלים אזהרה עוד לפני זמן הריצה (רק שבינתיים הם הוסיפו את האופציה הזאת רק עבור גירסה team suite…)
- הגדרת דרישות עבור ממשק, כך שכל מחלקה שמיישמת אותו תצטרך למלא את הדרישות האלו.
אבל הדברים העיקריים הם אלו:
- תנאי מקדים- שאנו מבטאים באמצעות הקוד שעכשיו כתבנו : Contract.Requires, שבעצם בודק שהכל תקין לפני שאני מתחיל את המתודה שלי.
- תנאי מאוחר – שבודק את התקינות לאחר שהקוד שלי רץ והמתודה עומדת להסתיים.
- תנאים לא תלויי אובייקט- אלו תנאים שתמיד אמורים להיות נכונים לגבי האובייקט שלי, לא משנה מה מצבו- גיל לא יכול להיות שלילי, גם אם הלקוח לא מילא את פרטי גילו, ולכן בכל מצב זה אמור להיות נכון, ולא רק לאחר שהכנסתי ערך לפרטי הגיל.
על מנת שהחוזים שאנו כותבים יכנסו אכן לקוד, ולא יושמטו על ידי הקומפלייר, יש להגדיר סימבול.
אם אתם משתמשים בויז’ואל סטודיו 2010 לכו למאפייני הפרוייקט ( לחצן ימני על שם הפרוייקט-> מאפיינים)
תוסיפו שם את המילה CONTRACTS_FULL
בויז’ואל סטודיו 2008 נדרשת התקנה של הקוד, ולאחר מכן יש להוסיף הפניה ל microsoft.contracts, אך לאחר ההתקנה יהיה לכם בהגדרות פרוייקט טאב מיוחד להגדרות של החוזים.
מידע נוסף ניתן למצוא באתר של מייקרוסופט, יש שם וידאו ומסמך pdf עם הסברים רחבים ודוגמאות.
Be the first to rate this post
- Currently 0/5 Stars.
- 1
- 2
- 3
- 4
- 5