Silverlight

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

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

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

שרשור פעולות בלינוקס

הפילוסופיה של יוניקס (ושל לינוקס) היא שכל כלי יעשה פעולה אחת, ויעשה אותה כמו שצריך – והמשתמש יחבר את הכלים כדי להשיג את המטרה שלו.
הפילוסופיה הזו שונה מזו של מערכות הפעלה יותר "ידידותיות", שנותנות למשתמש כלים שעושים את מה שהמתכנתים חשבו שהמשתמש ירצה לעשות – לא פחות ולא יותר.
מצד אחד אותם משתמשים ישיגו את המטרה שלהם – אם המתכנתים חשבו שהיא מטרה ראויה – יותר בקלות, מצד שני, אם המתכנתים לא חשבו שהמטרה הזו מספיק חשובה או אם הם בכלל לא חשבו על הצורך המסויים המשתמש פשוט לא יוכל להשיג את המטרה בעזרת אותם כלים ידידותיים.
אז אחרי ההקדמה הזו, הנה דוגמא עם בעיה אמיתית:
לFireStats יש כרגע 16 תרגומים, והמתרגמים אחראים לעדכן עצמאית את התרגום שלהם ברגע שאני מודיע על הזמינות של גרסא חדשה במערכת הגרסאות של הקוד (Subversion).
לפעמים המתרגמים לוקחים את הזמן, ומעדכנים רק אחרי כמה שבועות, ובדרך כלל מודיעים לי שהם עדכנו, אבל לא תמיד.
עכשיו, איך אני יכול לדעת מי עדיין לא עדכן את התרגום?
אני יכול לתחזק רשימה, ולמחוק מהרשימה כל אחד שהודיע לי שהוא תרגם, אבל אני עצלן מדי ובטח אשכח לתחזק אותה, מה שיהפוך אותה ללא שימושית מהר מאוד.
דרך נוספת היא להסתכל בקבצי התרגום, ולחפש תרגומים שלא מכילים מילה כלשהי שמופיעה רק בגרסא החדשה, אבל איך עושים את זה?
כלים לחיפוש בקבצים בדרך כלל ימצאו קבצים שמכילים משהו, לא קבצים שלא מכילים.
יש הרבה דרכים להשיג את המטרה הזו, רובן מערבות מציאה של כלי יעודי לא ידוע או כתיבת תוכנית – אבל לאור ההקדמה – ברור שאני אספר איך ניתן לעשות את זה בלינוקס (אפשר בעוד צורות, ואני בטוח שחלקן יותר אלגנטיות).
כמעט כל תוכנית לא גרפית בלינוקס קוראת מהקלט הסטנדרטי וכותבת לפלט הסטנדרטי. בשימוש של פקודות שרשור (|) של המעטפת (bash במקרה שלי) ניתן לשרשר את הפלט של תוכנית אחת לקלט של תוכנית שניה.
אבל לפני שאנחנו רצים, צריך לגלות איך מוצאים אם קובץ מסויים לא מכיל מחרוזת.
הפקודה שקופצת לראש אוטומטית כשרוצים למצוא משהו היא grep. שמאפשרת מציאה של תבניות שבנויות כביטויים רגולריים, אבל grep לא בדיוק מתאימה כי היא עובדת ברמת שורה, ואנחנו רוצים לעבוד ברמת קובץ.
במילים אחרות, נוכל למצוא בעזרת grep שורות מסויימות שלא מכילות את המילה, אבל זה לא מה שאנחנו רוצים.
למרבה המזל, grep מחזירה ערך לbash, שניתן לפרש כאמת אם ורק אם הקובץ מכיל את המחרוזת.
אז כדי לבדוק אם קובץ מכיל מחרוזת נריץ את זה:
[code lang="bash"]
grep -q WORD file.txt || echo Not found
[/code]
הפרמטר -q נועד לבטל הדפסות של שורות שמתאימות למחרוזת (כי זה לא מה שאנחנו רוצים).
הפקודה || היא פקודה למעטפת שאומרת שאומרת "או".
זה אומר שהערך של הביטוי כולו הוא אמת אם לפחות אחד משני הביטויים משני צידי ה|| הם אמת. במקרה שgrep מוצא את המילה הוא יחזיר אמת, ולכן המעטפת לא תפעיל את הצד השני של ה|| כי היא כבר יודעת שהביטוי כולו הוא אמת. במקרה והקובץ לא מכיל את המחרוזת grep יחזיר שקר ואז המעטפת תריץ את הפקודה השניה שתדפיס לנו שלא מצאנו את הביטוי בקובץ.

עכשיו רק נשאר להריץ את הדבר הזה לכל קובץ, ולהדפיס עבור כל קובץ שלא מכיל את המחרוזת את השם שלו.
שוב, יש כמה דרכים, כולל שימוש בלולאה, אבל אני מעדיף את השימוש בxargs.
במצב הרגיל xargs מקבלת קלט ומפעילה פקודה כאשר הקלט הוא פרמטר של הפקודה. כאשר קוראים לxargs עם הפרמטר -i, הפקודה תקרא מספר פעמים, כמספר השורות בקלט, כאשר בכל פעם הסימן {} יוחלף בשורה הנוכחית.
לדוגמה, אם נפעיל את הפקודה ls -1, שמדפיסה כל קובץ בשורה נפרדת, על ספריה שמכילה קובץ a וקובץ b, ונשרשר לxargs -i נקבל:
[code lang="bash"]
$ ls -1 | xargs -i echo 123 {} 456
123 a 456
123 b 456
[/code]

xargs קוראת לecho פעם אחת עבור כל קובץ.
אם נרצה לעשות משהו טיפה יותר מחוכם, שכולל קריאות לכמה פקודות עבור כל קובץ, נוכל להפעיל bash עם פרמטר -c (פקודה), למשל:
[code lang="bash"]
$ ls -1 | xargs -i bash -c "echo content of {} is;cat {}"
content of a is
hello
content of b is
world
[/code]

אחרי כל זה אנחנו כבר יודעים מספיק בשביל להבין איך להשיג את המטרה, שהיא למצוא את כל הקבצים שלא מכילים משהו:
[code lang="bash"]
ls -1 | xargs -i bash -c "grep -q WORD {} || echo {}"
[/code]

פוסטים שלמים בRSS

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

שנה לFireStats

FireStats
ככה בלי שאני אשים לב, FireStats חגגה יום הולדת שנה בשבוע שעבר.
הנה ההכרזה על על השחרור של הגרסא הראשונה, 0.9-בטא.
אז מה היה בשנה הזו?
403,000 דפים נצפו באתר של FireStats, על ידי 96,700 מבקרים.
סך הכל כ31,000 הורדות שמתפרשות על פני כ30 גרסאות ששוחררו.
הגרסא שהורדה הכי הרבה פעמים היתה 1.1.5, עם כ7800 הורדות.
תמיכה ב16 שפות.
תמיכה ב8 פלטפורמות, וכן באתרי PHP וC# כלליים.
407 פניות באתר (דיווחי באגים, בקשות עזרה ובקשות שיפור), מתוכן 61 פתוחות כרגע, רובן המכריע בקשות שיפור.
1180 גרסאות במערכת ניהול הגרסאות בקוד (Subversion).
ושיא של לפחות 2518 אנשים שפתחו את FireStats ביום אחד, שנקבע אתמול (אני יודע לפי מספר הבקשות לבדיקת גרסא חדשה).

נקוה שהשנה השניה תהיה טובה לפחות כמו הראשונה :).

BioShock

זה לא קורה לעיתים תכופות במיוחד שמשחק משנה את התמונה.
BioShock הוא משחק כזה. BioShock מופץ דרך Steam – וValve (המפתחת של Steam, HalfLife 2 ועוד) הפיצו אותו בשיטה שנקראת Pre-load.
מה שזה אומר זה שאפשר היה לקנות את המשחק לפני שהוא יצא, הוא התחיל לרדת למחשב מיד בצורה מוצפנת, וברגע שהמשחק שוחרר רשמית ההצפנה הוסרה וניתן היה לשחק במשחק מיד.
קניתי את BioShock באופן אימפולסיבי למדי אחרי ששמעתי עליו דברים טובים, הציון הממוצע שלו באותו זמן עמד על 97 (נכון לכרגע 96).
BioShock הוא הבן הרוחני של SystemShock-2 הוותיק, אבל למעט מעט אלמנטים של משחקיות ואווירת האימה אין הרבה משותף.
המשחק מתרחש ב1960 בעיר תת ימית בשם ראפצ'ר (Rapture), שנבנתה על ידי אנדרו ריאן ב1946.
ראפצ'ר נבנתה כדי להיות עיר של חברה אידיאלית שתומכת בעצמה.
אחרי פתיחה קצרה ואניגמטית, המשחק מתחיל במים, דלק בוער על המים ואפשר לראות מטוס נוסעים שוקע למים.
המעבר מהפתיחה למשחק הוא כל כך חלק, והגרפיקה של המים כל כך טובה שהייתי די בטוח שאני עדיין בפתיחה, עד שהופיעה הודעה שאני אמור לזוז עם מקשי ה WASD.
המשחק מתחיל ליד מגדלור, ובתוכו מה שנראה כמו אולם תאטרון, עם מוסיקה של שנות השישים, שמוביל לצוללת קטנה שמורידה את השחקן לראפצ'ר.
העיר נראית הרוסה ונטושה, אבל מהר מאוד השחקן מותקף על ידי מטורף עם מפתח שוודי.
יש כמה סוגים של יצורים בראפצ'ר:
* Splicer: האוייבים הנפוצים ביותר, הספלייסרים (מאחי גנים), הם השוכנים המקוריים של ראפצ'ר, שעברו אי אלו מוטציות. יש כל מני סוגים – עם כל מני יכולות. חלקם ילכו על קירות ויזרקו סכינים, חלקם יזרקו רימונים או ירו עליהם, וחלקם יעלמו ויופיעו מאחוריכם, תוך שהם מטילים כדורי אש.

* אחיות קטנות: האחיות הקטנות היו ילדות קטנות פעם, אבל עכשיו הם הפכו לבית חרושת לדבר המבוקש ביותר בראפצ'ר – "אדם".
אדם מאפשר קניית שידרוגים ויכולות חדשות, ומבוקש על ידי כל שוכני ראפצ'ר. עוד על זה בהמשך.
האחיות הקטנות מסתובבות בראפצ'ר, כל אחת מוגנת על ידי Big daddy, שהולך איתה ותוקף כל מי שמנסה לפגוע בה.

* ביג דאדיז: הביג דאדיז נראים קצת כמו צוללן בחליפת אמודאים משוריינת, הם חזקים מאוד, משוריינים וזזים מהר מאוד. הם לא יתקפו אתכם, אלא אם תתקפו אותם או את האחות הקטנה שהם מלווים, אבל מכיוון שצריך להשיג את האדם מהאחיות הקטנות, אין ברירה אלא לתקוף אותם – מה שלא נגמר טוב בדרך כלל.

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

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

העלילה הראשית של המשחק לינארית, אבל השלבים גדולים מאוד ואפשר להסתובב בהם באופן חופשי בצורה לא לינארית.
האוייבים מהירים, וחזקים – ויש מחסור בכוח, תחמושת ובEve – האנרגיה הדרושה לשימוש בPlasmids. האווירה במשחק מדהימה, מעין ערבוב של שנות השישים, כולל מוסיקה ונשקים של שנות השישים עם אווירה עתידנית, הנדסה גנטית וכו'.

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

הסאונד והגרפיקה מדהימים, אבל המשחק כבד מאוד :על פנטיום D עם 2 ג'יגה זכרון וכרטיס מסך מסוג 7900GT – אני משחק על 1024×768 ברמת פירוט בינונית כדי לקבל ביצועים סבירים – והמשחק עדיין נראה מדהים.
סך הכל, אם יש לכם את הזמן, החומרה והקיבה למשחק שלא מנסה להיות עדין עם הנפש הרכה שלהם, אני ממליץ בחום על BioShock.

בתמונה, ביג דאדי ואחות קטנה (ושחקן נסתר).
BioShock

FireStats 1.3.6-stable

אחרי תקופת בטא ארוכה, FireStats 1.3 נחשב יציב, ואתמול שחררתי את FireStats 1.3.6-stable.
אין שינויים משמעותיים מ1.3.5, למעט מספר תיקוני באגים קטנים.
למשדרגים מגרסא 1.2, אפשר לראות את השינויים המרכזיים פה.

סקר סקר תרדוף

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

browsers.png

תודה לשושנה פורבס על הקישור.