DCSIMG
January 2008 - Posts - שחר.נט

שחר.נט

בלוגים שאני קורא

ספרים מומלצים

January 2008 - Posts

How-To: Use ClickOnce to deploy your Applications

Part 1 - What is ClickOnce?

CickeOnce, is a technology for deploying smart-client applications. When we talk about smart-client application that deployed with ClickOnce, we want that the application will:

  • Provide automatic installation in one click.
  • Install updated automatically
  • Can be installed from local file, or from the WEB.

ClickeOnce, give us this options out of the box, and all we need to do is to write two XML manifest files (one for the application, and one for the ClickOnce engine). If you use Visual Studio, you have a wizzard for this.
In this post, I'll show how to work with ClickOnce from Visual Studio, and from your code too.

Part 2 - How to use ClickOnce in your application?

First of all, ClickOnce supports deployment of Windows Applications from all types (Console image Applications, Windows Forms Applications, WPF Applications).
So, in this example I created a new empty Windows Forms Application. to edit the ClickOnce settings, you should go to the project properties page (by right click on the project name in the solution explorer, see pic. #1).

In the Property page go the the "Publish" tab. In this tab, you can change the ClickOnce settings for this Project. First of all, in the first textbox, you have to enter where VS will create the installation files. It can be in the local file system, web site imageand FTP.

If you'll click on the Application Files button, you can edit the files that will include in your  project.
You can add new files that are currently in your solution, and choose if they will be in the package.

 

 

image

 

In the Prerequisites screen, you can choose package that muse be installed in the computer before your project will deploy.

For example, the .NET version you use, SQL Server etc.

 

image

 

It's recommended to click on the Update button, and turn on the update feature.
By default, it's turned off. This feature give you the option to create new versions and the clients will automatically update.

By default, the updates should be in the same directory like the publish directory.
But, you can specify a special directory for the updates, if you want so. Note that the updater will check if there is a newer version in the server. the version defuned in the main screen, in the Publish tab in the Project properties. If the V in "Automatically increment revision with each publish" checked, then any publish will increase the version.

image

After you configure the Updates, click on the Options button in the main screen and configure the general details.

 

After you finish, go close this Dialog and click on the Publish button:

image

Now, Visual Studio will build your project and will publish it. After anything will done, a new IE window will open (by default, unless you change it in the Options screen.) with the product auto-generated page.image

The page that automatically generated, include the prerequisites, and if everything is already installed you can click in the "launch" link. After clicking, if you are verified publisher, the application will start automatically, and later can be started from the Start Menu shortcut.

 

 

 

Part 3 - How the updater works?

The current project includes only an empty form. Now, let's say it's version 1.0.0.1.
Now, I changed the back color of the form , and I want it to be version 2.0.0.0.

image image

I'll go to the Publish tab in the project properties and edit the version:

image

Now, I'll click the publish now button. It will publish the new version to the location I chose (in the web).
Next time I'll launch the application, as I set in the Update properties, the application will update and show this message:

image

If you click OK, then the new version will download and run.

Part 4 - ClickOnce with code

Until now, we worked with wizards and GUI to manage the ClickOnce deployment, but we can do it from our code too. First of all, we should add using statement to System.Deployment.Application:

using System.Deployment.Application;
.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }

Now, we can use the ApplicationDeployment class to manage our application deployment information. This code, for example, check for updates and shows a MessageBox with the version of the newest version for the current deployment. Note, that this code can replace the built-in message of new versions. you can cancel in the Update screen in the Publish tab the auto-check for updates, and do it manually from your code:

   1:  ApplicationDeployment deploy =   ApplicationDeployment.CurrentDeployment;
   2:  UpdateCheckInfo update = deploy.CheckForDetailedUpdate();
   3:  MessageBox.Show("You can update to version: " + update.AvailableVersion.ToString());
.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }

image

Note that this code will cause an exception if no update available, because then update.AvailableVersion.ToString() will be null. So, if you want to use this code, make sure that it's in if...else statement that show the message only if update doesn't equal to null.

We can fix this code a little, so the application will update after the message show:

ApplicationDeployment deploy = ApplicationDeployment.CurrentDeployment;
UpdateCheckInfo update = deploy.CheckForDetailedUpdate();
 if (deploy.CheckForUpdate())
{
     MessageBox.Show("You can update to version: " + update.AvailableVersion.ToString());
     deploy.Update();
     Application.Restart();
}

This code will work always. If an update is available, it will inform the user, download the update synchronously and restart the application. Otherwise, this code do nothing.

Put this code in the form load event, and then when you release a new version, the user will informed about and the application will update. you can use this code instead the built-in message, to make this progress more friendly.

Shahar Gvirtz.

.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }

שימוש ביכולות של C# 3 מ C#2

כתבתי בבלוג החדש שלי פוסט שמדגים כל מיני חידושים של C# 3 כמו מילת המפתח var, שימוש במאתחלי אובייקטים מתקדמים, שימוש ב auto-properties וב anonymous types - ואיך אפשר להשתמש בדיוק באותם פיצ'רים, שמוכרים לנו כפיצ'רים של C# 3 ב C# 2 כשמפתחים תחת Visual Studio 2008.

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

Step-Into לקוד של .NET

וכל מילה נוספת מיותרת.

פאשלת הכספים של DreamHost

בשנה האחרונה, התאכסנתי ב DreamHost. האכסון שלי אמור להיגמר ב 21/02/2008, ושנה שעברה שילמתי במסגרת מבצע עשרים ומשהו דולר עבורו במקום ה 120$ בערך שהוא עולה. את האכסון אני לא התכוונתי לחדש לעוד שנה, פשוט בגלל שמצאתי חברה יותר טובה, שנותנת לי יותר תמורה למחיר.

אתמול, קיבלתי מהם אימייל בזה הלשון (לחצו להגדלה):

image

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

הבלוג של ביבי

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

טלפונים סלולריים עם רמקולים - מפגע סביבתי

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

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

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

WebCast - LINQ to SQL #2

מצאתי היום את הזמן להקליט עוד פרק קצר בנושא LINQ to SQL. מדובר בעיקר בפרק שמשלים נושאים שנידונו בפרק הקודם.
בין הנושאים שעליהם מדובר ב WebCast הזה מדובר על הוספת פעילויות מותאמות אישית מול הDB כחלק משכבת ה LINQ to SQL, הרצת משפטי SQL ישירות מול הDB, שימוש ב partial methods, התערבות במנגנון ההוספה/מחיקה/עדכון של נתונים לפני הביצוע עצמו.

אתם מוזמנים לצפות ולהגיב.

שחר.

מזל טוב! עכשיו "מורשת" מצנזרת גם את הבלוג שלי

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

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

האמת, לא אכפת לי. גולשי מורשת שירצו יוכלו להוסיף אותי ל white list שלהם. ואחרים יוכלו הסתפק בבלוגים אחרים שיש פה. אבל עכשיו גם אני מצטרף לכל אותה קבוצת אתרים מכובדת שנחסמת על מורשת. בהחלט, אפשר להזכיר אותי באותה נשימה עם פייסבוק, יוטיוב, אתר NRG (שכמובן, מוקצה מחמת מיאוס בעוד שYNET וערוץ 7, למשל, פתוחים), אתר וואלה! (לא הפסד גדול) וכו'.

הומור של מורים למתמטיקה

בספר מיקוד של אנקורי, החליטו כנראה שחייבים לעשות כמה שאלות הומוריסטיות, הנה שתיים מהם מתחום ההסתברות.

הסתברות
במחקר פרסומי על מורים למתמטיקה התברר שמתוך כל 10 מורים למתמטיקה, 9 מורים הם שרוטים (למי שלא מבין שיסתכל על המורה למתמטיקה שמלמד אותו). בחרו 6 מורים למתמטיקה. חשב את ההסתברות:

  1. שאין מורים למתמטיקה שרוטים בקבוצה
  2. שלפחות 4 מורים למתמטיקה הם שרוטים
  3. שלפחות מורה אחד למתמטיקה שרוט
  4. שרוב המורים למתמטיקה יהיו שרוטים, אם ידוע שלא כל המורים שנבחרו היו שרוטים.

חשיבה הסתברותית
בפקולטה למדעי הגראס לומדים 100 טרנסקסואלים ו 100 לסביות. סרסור ביה"ס היה מוטרד מריבוי ההיעדרויות של תלמידי הפקולטה (זה רע לעסקים) כי על פי הדו"ח שקיבל 25% מכלל התלמידים הרבו להיעדר ובקרב הטרנסקסואלים זה הגיע עד ל 30%.
הססרסור חושב שנטיות התלמיד הוא הגורם המשפיע על ריבוי ההיעדויות.
לעומתו, חברו הטוב גיב רילה, חושב שהסיבה לריבוי ההיעדרויות היא רמת ההצלחה של התלמיד בלימודים, עי על פי אותו דוח למחצית מכלל התלמידים ציון ממוצע היה גבוע [הטעות במקור. ש.ג] מציון הממוצע הכללי של השכבה וגם 30% מתוכם הרבו להיעדר. עוד טוען גיב רילה שאם ננטרל את גורם של ההצלחה בלימודים, ניווכח שלמעשה אין קשר בין נטייה לבין היעדרויות.
מי מבין השניים צודק, אם ידוע בנוסף של-60% מהטרנסקסואלים ציון ההמוצע היה גבוה מציון הממוצע הכללי ולמחצית הלסביות שהרבו להיעדר ציון הממוצע היה גבוע [הטעות במקור] מציון הממוצע הכללי.
נמק את תשובתך בעזרת טבלאות שכיחויות מתאימות.

------------------------------------------

אכן, תמונות קשות. כאן שחר גבירץ מסיים ומחזיר את השידור לאולפן (והולך להסניף ולהזריק תוך המשך פיתרון התרגילים).

קצת על SQL Types

בעקבות שאלה שנשאלה בפורום תכנות .net, חשבתי להביא סקירה קצרה על ה types של SQL שכולנו משתמשים בהם יום יום, מה ההבדלים שלהם ומהי צורת ההתנהגות שלהם.
char ו-varchar, אלה שני ה types הבסיסיים. char, יכיל תמיד את האורך שלו, משמע, שאם אני אשתמש ב char ואגדיר לו לקבל 10 תווים, ואכניס shahar, מה שיאוכסן בפועל זה shahar ובנוסף לכך 4 תווים ריקים. כשמשתמשים ב type הזה, נהוג להשתמש במתודה String.Trim לפני העבודה עם הערכים, כדי לקבל את הערך שהוכנס נטו, ולסלק רווחים מיותרים מהצד.

varchar, למעשה, מכיל את הערך נטו שהוכנס. כלומר, אם הגדרתי varchar באורך 10 תווים, ואני אכתוב shahar, מה שיאוכסן בפועל זה רק shahar, בלי תוספות.
מבחינת שימוש, אני אשתמש ב char בשביל לאכסן מחרוזת כלשהי שאני יודע שהיא חייבת להיות באורך שאני קובע. מספר תעודת זהות, תמיד יהיה 9 ספרות - אין סיכון שמישהו יכניס פחות (אלא אם כן הוא מרמה, ועל זה הוואלידציה אמורה לעלות), לכן רצוי שאני אשתמש ב char. כשאני עושה שדה שם, רצוי שהוא יהיה varchar, כי אמנם שם מצוי לא יעבור את ה 80 תווים, אבל הוא יכול להיות כל מקום בין 2 ל 80, ואני מעדיף לשלם את העלות הקטנה של שימוש ב varchar (תוספת של 2 bytes לערך), אבל שיהיה לי בדיוק את הכמות תווים שאני רוצה, ולא שיהיה לי אורך כפול בגלל רווחים שהתווספו.

type אפשרי נוסף, הוא text - כשאנחנו מדברים על text, אנו מדברים על משהו קצת יותר מורכב מבחינת אכסון, בשל הגודל העצום שלו, הערכים של text ושל ntext לא ממש מאוכסנים בDB עצמו, ברשומה עצמה, אלא יש הפנייה לערך עצמו שמאוכסן בנפרד. בשל כך, ובשל הגודל שלו, העבודה עם text קצת יותר מוגבלת, והוא לא תומך בכל מיני פונקציות ומשפטי SQL, למשל Group.

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

בהצלחה.

MediaPlayer - ASP.NET 3.5 Extension

חלק מה controls החדשים שמגיעים במסגרת חבילת ASP.NET 3.5 Extension, יש control בשם MediaPlayer. המטרה שלו, לספק פיתרון לבעייה שדי מציקה למפתחי WEB - איך להציג וידאו ומדיה באתר שלהם.
מצד אחד, יש את אלה שפשוט משתמשים ב COM של Windows Media Player, מה שישר מונע מכל מי שלא משתמש ב windows ושאין לו תמיכה ב ActiveX "לאכול אותה". אמנם יש כל מיני פתרונות, אבל זה לא לעניין לשלוח את המשתמשים להתקין כל מיני תוספים שאמורים, איכשהו, לספק תאימות לCOM הזה.

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

MediaPlayer control, למעשה מבוסס silverlight, כך שהוא אמור להצליח לעבוד גם על פלטפורמות אחרות. השימוש בו מאד פשוט, ולא דורש עבודה רבה. כל מה שצריך לעשות זה לוודא שיש לך בדף ScriptManager, ואז לשים פשוט את ה control של ה media player ולהגדיר לו את ה MediaSource
שימו לב שבגרסא של ASP.NET 3.5 Extensions, יש למעשה עדכונים לרכיבי ה AJAX השונים מגרסאת 3.5.0.0 לגרסאת 3.6.0.0, כך שבמידה וזה לא מותקן על השרת שמשמש אתכם (אולם על השרת בכל זאת רץ .NET 2.5), פשוט שימו את ה dll-ים ב bin.

ניסיתי לבדוק האם ניתן להריץ את ה extensions על שרת שיש לו רק .net framework 2 (בלי Microsoft AJAX בכלל), ולא ממש הצלחתי. אם מישהו הצליח, בבקשה שישתף איך עשה זאת.