FreeNAS

נפתח בדיסקליימר הרגיל:
כן, לא כתבתי מליון שנה, מה תעשו לי?

ב2009 בניתי מכונת אכסון ביתית מבוססת ZFS שהריצה את OpenSolaris.
התצורה של המערכת היא משהו דמוי RAID10:
שלושה זוגות דיסקים, כל זוג הוא מירור, וכולם ביחד מחוברים בRAID 0 ליחידה לוגית אחת.
מכיוון שקניתי דיסקים פשוטים ומעפנים, ציפיתי לאבד כמה במשך השנים וכך היה.
קונפיגורציה כזו יכולה לאבד עד שלושה דיסקים מתוך השישה, אבל רק לא מאבדים שני דיסקים מאותו זוג.
כל פעם שאבד דיסק, קניתי זוג חלופי וניצלתי את ההזדמנות כדי להגדיל את שטח האכסון.

חוץ מזה, מערכת ההפעלה התיישנה: Sun נרכשה על ידי אורקל (ימ"ש), שהפסיקה לפתח את OpenSolaris. הקהילה ניסתה להמשיך ושחררה את OpenIndiana, אבל מתישהו הם ויתרו.
חוץ מזה, אף פעם לא ממש הרגשתי בבית בסולאריס, כל דבר הוא קשה ומעצבן (חוץ מZFS).

לפני חודש חודשיים שמתי לב במקרה ששרת הקבצים מתלונן על בעיות באחד הדיסקים, ושהPOOL עבר לרמה של DEGRADED.
נו טוב, קורה.
קניתי זוג דיסקים בנוהל, 2TB כל אחד, של HGST – חברה שלא שמעתי את שמה עד היום, אבל שחברה הוסטינג שחררה מידע סטטיסטי שמראה שהם הכי אמינים.
הדיסקים עלו כ$65 כל אחד, שזה מחיר מצחיק למדי בשביל 2TB, אבל אני בטח לא מעודכן.

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

בקיצור, אם כבר אני הולך לאבד נתונים, הגיע הזמן להפטר מהענתיקה ולהחליף את הOpenSolaris במשהו יותר מודרני.
בימים שבהם שמעתי פודקסטים (עברתי לספרי שמע זה מכבר), שמעתי בFLOSS WEEKLY על FreeNAS.
FreeNAS היא מערכת מבוססת FreeBSD, שנבנתה ממש מסביב לשימוש שאני עושה בZFS:
התלבטתי אם לנסות לינוקס, שהיום כבר תומך בצורה זו או אחרת בZFS, או לנסות את FreeNAS, שהוא בעצם ZFS למפגרים.
בחרתי בFreeNAS, ואני לא מצטער.

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

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

capture

 

הדבר היחיד שהיה קשה קצת היה לגרום לZync לעבוד שם.
עקרונית הוא לא באמת נחוץ כי אפשר להגדיר את מה שהוא עושה דרך ממשק המשתמש. אבל זה יהיה די מסורבל במיוחד אם רוצים לגבות כמה שרתים, לקחת סנפשוטים של הגיבוי מתי שבוודאות הRsync כבר לא רץ, ולהגדיר ערמה של ספריות שלא יגובו עבור כל שרת שמגובה.
החבר'ה בפורומים של FreeNAS לא ממש עזרו, ואלו בIRC היו אפילו עויינים לרעיון שאני מעדיף להשתמש במשהו לשורת פקודה במקום בממשק המשתמש בשביל זה.
בסוף הסתדרתי, האיך בדיוק שווה פוסט שלם אם זה מעניין מישהו.

בשורה התחתונה אני מרוצה, FreeBSD הוא בערך פי מליון יותר ידידותי מSolaris, ואני שמח שנפטרתי מעונשו של זה.

עד הפעם הבאה.

על מקרנים, קירות גבס ועליות גג.

הבטחתי פוסט מקרן. למעשה, רק בימים האחרונים סיימתי להתקין את הכל.
המקרן הוא Epson Powerlite 5020 UBE שקיבל ביקורות טובות בProjector central.
כשקיבלתי את המקרן, כמובן שלא תליתי אותו או משהו לפני שהפעלתי אותו בחדר המחשב כדי לבדוק אותו.
לא לגמרי רואים את זה בתמונה, אבל למעשה המקרן פה מחובר רק לחשמל. התמונה עוברת בפרוטוקול אלחוטי – שזה אחד הפיצ'רים שאהבתי במקרן הזה. כמובן שזה אופציונאלי ויש גם חיבורים רגילים של HDMI וכו'.

2012-12-25 13.20.54
במקביל קניתי מסך קבוע (לא נגלל כמו מה שהיה לי בארץ) לאחר עבודת מחקר קטנה על מסכים למקרנים (Projector central שוב הוכיח את עצמו כמקור מידע שימושי). המסך שקניתי הוא מסך 100" של דלייט (DALITE 95559) שמותאם במיוחד לקולנוע ביתי.
התוכנית המקורית שלי היתה כמה שיותר רכיבים אלחוטיים כדי לחסוף חוטים בסלון, ולכן קניתי סמסונג HT-E5500W HTIB 5.1 שכולל רמקולים אחוריים אלחוטים ומגבר Yamaha RX-V473 5.1-Channel Network AV Receiver.
כשפתחתי את הסט קולנוע ביתי גיליתי שהרמקולים האחוריים חייבים להתחבר לנגן הבלו-ריי, מה שמתנגש לי עם התוכנית הראשית שבה נגן הבלו ריי הוא לא חלק מרכזי בבמערכת הקולנוע הביתי שלי (וכמובן הוא מייתר את המגבר).
זה הזמן לומר שאמזון בארצות הברית נותנים חווית קנית פשוט מדהימה, במיוחד עם אמזון פריים. במקרה הספציפי הזה ביקשתי החזרה מאמזון, שילמתי קצת על המשלוח חזרה והם אפילו שלחו שליח לכתובת שלי כדי לאסוף את החבילה. מאז שהתחלתי לקנות באמזון פה החזרתי כמה וכמה חבילות מכל מני סיבות ובכל המקרים חווית ההחזרה היתה טובה וחלקה.
ההחזרה של הרמקולים השאירה אותי בלי רמקולים, ולאחר התלבטויות קניתי סט 5.1 של הרמן קרדון, משהו שיותר מתאים לרמה של הרסיבר שקניתי מאשר הרמקולים המקוריים שקניתי בסט של סמסונג – שלמען האמת לא היו מרשימים במיוחד.
כששכרתי את דירה ציינתי כמובן שאני מתכוון לקנות מקרן ומסך. בעל הדירה לא התנגד אבל ביקש שאני אביא איש מקצוע.
ניסיתי למצוא כזה במשך שבוע או שבועיים, ועד שמצאתי מישהו מבוטח הוא ביקש $640. התייעצתי קצת עם חברים פה והם שיכנעו אותי לעשות את זה בעצמי.
כשניגשים לבנות חדר קולנוע ביתי עם מקרן, הדבר הראשון שצריך לעשות הוא כמובן לתלות את המקרן. אין הרבה הגיון בלתלות מסך ולסדר רמקולים רק כדי לגלות שהמקום הרצוי לתליית המקרן לא מתאים מסיבה כלשהי.
כשתליתי את המקרן בארץ, העניין הסתכם בלקדוח ארבע חורים בתקרה, להכניס דיבלים ולקבע את המתלה לתקרה, ואחר כך כמובן לחבר את המקרן למתלה. זה לא לגמרי טריויאלי כי צריך דיוק בקידוח החורים כי הם צריכים להתאים לחורים שיש במתלה – אבל חוץ מזה העניין די פשוט.
בארצות הברית לא מקובל לבנות בבטון:
הקירות הם בעצם שלד עץ עם עמודים כל 40 ס"מ. על השלד הזה מקבעים לוחות גבס (פחות או יותר) בעובי סנטימטר- מה שנקרא Drywall. זה אומר שהקירות הם בעצם חלולים למדי, וגם מאוד חלשים. בעיטה בקיר יכולה בקלות לשבור את הגבס.
המצב בתקרה דומה, יש קורות בתקרה במרחקים קבועים, ומתחת להם מוצמד לוח גבס. על הלוח הזה מניחים שכבת בידוד שנראית בדרך כלל כמו מילוי של פוך וכל העסק הזה נמצא בעליית הגג, מתחת לרעפים. לא קשה לנחש ששכבת גבס בעובי סנטימטר לא תוכל להחזיק משקל גדול – ובטח לא עשרה קילוגרם של מקרן שעולה בסביבות ה$3000.
מה עושים אם כך? הפתרון הוא לקדוח לתוך קורת עץ שלדית בתקרה ולקבע את המקרן אליה. הקורות האלו מונחות בתיקרה על הצד, כך שהן בעצם עומדות עם הצד הצר שלהן כלפי מטה והצד הרחב שלהם הצידה. העובי שלהן במבט מלמטה הוא כארבעה ס"מ והגובה שלהן הוא בסביבות ה13 ס"מ.נוסיף את הסנטימטר של התקרה, מה שאומר שצריך לעבור בקו ישר דרך כ14 ס"מ בדיוק באמצע הקורה – בלי לראות אותה. הטריק הוא כלי שנקרא Stud finder, שהוא מכשיר שמסוגל להרגיש איפה בקיר יש קורה. הוא לא מאוד מדוייק אבל עם לוקחים ממוצע של כמה קריאות מקבלים תמונה די טובה של איפה הקורה – אז הזמנתי לי כזה מאמזון.
הדבר הבא שצריך זה מקדחה. בארץ היו לי כמה מקדחות חזקות שמתחברות לשקע (לא על סוללה). אבל מסתבר שכאן אפשר לגמרי להסתדר עם מה שנקרא Impact driver, שהוא בעצם מברגה רב שימושית, שעובדת על סוללה. אפשר לחבר אליו ראשים שונים ומשונים, כולל ראש שמתאים למקדחים ומאפשר לקדוח. חבר אמריקאי נתן לי מקדח של מקיטה במתנה. יש לו כמה והוא כבר לא צריך את זה.
בתור מי שרגיל למקדחים אמתייים של 600 וואט, מקדח על סוללה נטענת נשמע לי כמו בדיחה. אבל ניסיתי ולהפתעתי גיליתי שלדבר הזה יש הרבה מאוד כוח. ומכיוון שחומרי הבניה פה הם כל כך רכים הוא לגמרי מספיק לכל דבר שתרצו.
קניתי לי מקדח של איזה 30 סנטימטרים (מקדח סטנדרטי קצר מדי למשימה),  מתאם שיאפשר לי לחבר אותו למקיטה ושני ברגים ארוכים ברוחב של כ8 מילימטר. לפני שהתחלתי בתליה עליתי לעליית הגג עם כמה לוחות עץ כדי לעשות את דרכי עד הקורה המיועדת וכדי להבין מה קורה למעלה. גיליתי שקר וחשוך שם, ושכמעט ואין גישה לקורה הרלוונטית כי היא קרובה לקיר ובאיזור הזה גג הרעפים כבר נמוך מאוד.
חזרתי למטה וקדחתי את החור הראשון, עליתי שוב כדי לוודא שעברתי ישר דרך הקורה וכדי לחבר אום לקדח (מהצד השני עזרו לי סוניה והשכן). חזרתי וקדחתי בהצלחה גם את החור השני, עליתי חזרה למעלה וחיזקנו את האומים משני הצדדים. ברגע שקיבעתי לתקרה את המתלה, לחבר אליו את המקרן זה כבר היה קל למדי.
וככה זה נראה:
mounting-projector
ומקרוב:
2013-01-26 23.38.26

הצעד הבא היה לתלות את המסך. עכשיו שהמקרן תלוי אפשר לשחק עם ההגדרות שלו כדי להחליט איפה תהיה התמונה המוקרנת בדיוק, ושם צריך לתלות את המסך.
בגדול צריך לקדוח כמה ברגים לתוך הקורות כדי לקבע שני פסי מתכת לקיר ועל הפסים האלו תולים את המסך.
עשיתי כמה טעויות קטנות בדרך, אבל בסוף הצלחתי (תוך שאני עושה קצת יותר חורים בקיר ממה שהייתי חייב).
המסך:
2013-01-16 23.31.58
הקרנה בחדר מואר:
2013-01-16 23.34.40
הקרנה בחדר מוחשך:
2013-01-16 23.34.59

עכשיו הגיע תורם של הרמקולים. שצריכים להיות במקומות מדוייקים למדי ולא תמיד יש קורה במקום הרצוי. למרבה המזל הרמקולים שוקלים בערך קילו אז גם קיר גבס יכול להחזיק אותם. הבעיה פה הוא שאין לקיר גבס מספיק התנגדות כדי להחזיק בורג – אז צריך להשתמש בדיבלים מיוחדים שמותאמים לDrywall:
2013-01-27 00.56.23

אחרי שתליתי את הרמקולים (וגם קיבלתי עוד מהריהוט שקניתי), ככה זה נראה:
2013-01-26 23.37.49

2013-01-26 23.36.24

הפינה המבולגנת עוד תשתפר כשאני אקבל שידה שהזמנתי במיוחד לפי המידות של המחשבים ושאר הציוד שם:
desk-spec.jpg

עד כאן.

גוגל תמונות כמנוע ליצירת רקעים לשולחן העבודה

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

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

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

מכונה לגריסת ביטים

ניצלתי את המעבר לארצות הברית כדי לשדרג כל מיני דברים, כשהראשון הוא כמובן המחשב.
את המחשב שהיה בסלון נתתי לאמא, בתוספת המסך (24" – שידרוג מאוד משמעותי ממה שהיה לה שם).
את המחשב הראשי הפכתי למחשב סלון (טורנטים, צפיית סרטים וכו'), הוא שירת אותי טוב למדי בשנים האחרונות (למרות מסכים כחולים בחצי השנה האחרונה – מה שהסתבר כנגרם בגלל באג בדריברים של הSSD שלו).
במכונת האיכסון Iron, שמריצה עדיין OpenSolaris – לא נגעתי.
את שני המחשבים, זה של הסלון וזה של האכסון שלחתי במשלוח לפה, ואת המשלוח קיבלתי רק בשבוע שעבר, מה שאומר שנזקקתי למחשב בחודשיים האחרונים, ולכן כמובן קניתי אחד – וכאמור, ניצלתי את האירוע הנדיר שבו אני קונה מחשב חדש בלי שום חומרה קודמת כדי לבצע מה שנקרא שידרוג עצבני.
לא ממש חסכתי במחשב הזה, תקראו לזה פיצוי מוגדל אם תרצו, או בדיקה של גבולות גזרה.
אז מה בעצם קניתי?

מסך

בחרתי בDell UltraSharp U3011, זה מסך 30" שנותן יחס מחיר טוב.
הוא עלה $1200, מחיר דומה למדי ל4000 השקלים ששילמתי בזמנו על המסך 24" שהיה לי בארץ (ועבר כאמור לאמי).
מסך הוא אחר הדברים במחשב שמחזיקים שמשודרגים לעיתים מאוד רחוקות, ולכן אני חושב ששווה להשקיע כדי לקבל מסך שכיף להשתמש בו לאורך זמן.
אחד הגורמים שבגללם בחרתי במסך 30" הוא שזה גודל המסך שיש לי בפייסבוק, והרגשתי שיהיה מבעס משהו שהמסך בעבודה יהיה טוב יותר מהמסך בבית :).
הרזולוציה הטבעית של התפלץ היא 2560X1600, רזולוציה שמגמדת את הרזולוציה של 1080.

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

כרטיס מסך

קניתי EVGA GeForce GTX 680, והוא עושה את העבודה, ובגדול.
את רוב המשחקים הוא סוחב יפה מאוד ברזולציה הטבעית של המסך וברמת פירוט מקסימלית.
לפעמים יש משחק כבד במיוחד שדורש ממני לוותר קצת על רמת הפירוט כדי לרוץ ברזולוציה הזו (הדוגמא האחרונה היא Far Cry 3), אבל בגדול אני מאוד מרוצה מהכרטיס הזה.
במידת הצורך, תמיד אפשר לקנות עוד אחד או אפילו עוד 2 כאלו ולהריץ אותם בתצורת SLI (או SLI תלת כיווני).

כונן קשיח

כבר במחשב הקודם עברתי לSSD, ולכן זו כלל לא שאלה. אני לא בקטע של שידעוך אלא של שדרוג.
קניתי דיסק 480GB של סמסונג, SanDisk Extreme SDSSDX-480G-G25 2.5" 480GB – אין יותר מדי מה להגיד, הוא מהיר מאוד ויש בו הרבה מקום יחסית לרוב הSSD האחרים שפופולריים היום.

לוח אם

לוח האם בעצם מכתיב את המעבד, את מהירות הזכרון ובאופן כללי את הרמה של כל המחשב.
הלכתי על Asus Maximus V extreme, שהוא ספינת הדגל של אסוס למחשבי גיימרים וסתם מטורפי אובר-קלוקינג.
פה יש לי סיפור קטן, כשבניתי את המחשב – שבמעבדים החדשים של אינטל הפינים לא נמצאים על המעבד אלא על הלוח.המעבד עצמו מגיע עם מגעים בלבד.
זה מעביר את הרגישות של הפינים אל לוח האם.
הלוח מגיע עם חתיכת פלסטיק שמגינה על הסוקט על המעבד, ובזמן שצפיתי בסרטון שמספר על ההתקנה של הלוח, הם הדגישו כמה חשוב להחזיר את חתיכת הפלסטיק במקרה ששולחים את הלוח לתיקון.
בשלב הזה כבר הורדתי את חתיכת הפלסטיק, ורק רציתי לבדוק איך אני מחזיר אותה למקרה שאני אצטרך לשלוח את הלוח.
אז ניסיתי להחזיר, וניסיתי, וניסיתי והיא לא התאימה.
בסוף הבנתי שניסיתי להחזיר אותה בצורה לא נכונה, ושאולי גרמתי נזק לפינים של הסוקט. זה היה רגע מבעס במיוחד.
המשכתי לבנות את המחשב: מעבד, ספק, זכרון, כרטיס מסף וכמובן שהוא לא עלה:
נראה שהצלחתי לדפוק את הלוח. לפעמים עדיף לא להסתכל בסרטוני הדגמה כדי לא לקבל רעיונות מטופשים.
עכשיו, האופציה שעמדה בפני היתה לשלוח את הלוח לניואג, לטעון שהוא דפוק ("אבל ככה קיבלתי אותו!") ולקוות שישלחו לי אחר במקום.
דיברתי איתם והבנתי שאם הם חושדים בנזק פיזי, הם יחזירו את אותו לוח ואותי ישלחו לעזאזל.
הפיתרון החלופי היה לשלוח את הלוח לאסוס ולתקן אותו (בטח לא בחינם אם עיקמתי את הפינים של הסוקט), ולחכות ללוח המתוקן. הבעיה עם הפתרון הזה היא שלא התחשק לי לחכות שבועיים. רציתי מחשב ויפה שעה אחת קודם.
הפתרון שבחרתי היה להזמין עוד לוח כזה, ולשלוח לאסוס את הלוח לתיקון, ואחר כך למכור אותו.
משיחה עם אסוס בטלפון הבנתי שאם הם חושבים שקילקלתי את הפינים הם יגבו $120, אבל לוח שעולה $360 עדיין משתלם לתקן ולמכור.
שלחתי את הלוח לאסוס, וקיבלתי בחזרה אחרי שבועיים לוח אחר עם מדבקה של RMA RETURN על הקופסא. למרבה הפלא אסוס לא ביקשו ממני את ה$120, מה שאומר שאולי הם חשבו שהבעיה היתה אחרת או שהם טפשים.
את הלוח מכרתי דרך קרייגס ליסט ב$275, תוך שאני מספר לקונה את הסיפור המלא כדי שלא יהיו טענות שמכרתי לו משהו לא חדש.
סך הכל יצאתי בסדר מכל הסיפור, אבל זה לא היה נעים.
נחזור לעניינו:
כשהגיע הלוח החלופי אחרי כמה ימים (משלוח הכי מהיר שהיה לניואג) התקנתי אותו, הפעם המחשב עבד לשמחתי.
הלוח הזה כולל פיצ'רים די מטורפים כולל כאלו שאני לא אנסה בחיים כמו להלחים אליו פוטנציומטר לשליטה פיזית על הוולטג' של הלוח (אני רציני).
האמת היא שאפילו לא התחלתי לנסות אובר-קלוקינג עדיין, אבל שמועות אומרות שאני אמור להיות יכול להגיע ל4.7GHZ יציב עם התצורה שלי די בקלות.

 מעבד

קניתי לי את Intel Core i7-3770K , שהוא המעבד המתאים ביותר לאובר קלוקינג, והוא סתם מהיר במיוחד באופן כללי.
כאמור עדיין לא שיחקתי ברצינות עם הOC, אבל זה יגיע.

זכרון

זכרון זה טוב, הרבה זכרון זה הרבה טוב.
קניתי G.SKILL Trident X Series 32GB במהירות 2400Mhz, לא כי אני צריך כל כך הרבה אלא כי המחיר היה כל כך אטרקטיבי שזה היה פשוט פשע לקנות פחות (פשע!).

רמקולים

הפעם האחרונה שבה קניתי רמקולים למחשב היתה מתישהו בסביבות שנת 2000, והם שירתו אותי נאמנה עד המעבר לארצות הברית.
אם מסך הוא השקעה לטווח ארוך, אז רמקולים הם השקעה לעידנים.
קניתי לי את הרמקולים הכי טובים שיש כרגע ללוג'יטק (אם להאמין לביקורות ולמחיר), Logitech Z906 500W 5.1 Speakers.
שומעים טוב, והם אפילו יכולים להתאים לקולנוע ביתי (אבל קולנוע ביתי הוא סיפור לפוסט אחר).

שאר ירקות

מארז, צורב בלו ריי, ספק כוח ידה ידה ידה.

כל העסק עלה מעל $4000, וזה בלי להתייחס לכל הסיפור של לוח האם.
מסקרן אותי כמה כזו מערכת תעלה בארץ, אבל לא מספיק כדי להתחיל לבדוק.

 

פוסט אמיתי!

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

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

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

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

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

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

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

הלאה, קניתי מחשב חדש, ולא בסתם מחשב עסקינן, אלא בתת תפלצת מסוג מפלצתי במיוחד, מספיק לומר שהוא עלה 4300 – ולא, מדובר בדולרים ולא בשקלים.
נושא רביעי:
4. תפלץ? כמה זכרון? יש לך SSD? איזה גודל המסך?! כמה גיגה הרץ המעבד ואיזה מקלדת יש לך? (וכו').

הלאה נמשיכה:
כדי להגיע לפייסבוק צריך אוטו, אז קניתי. הוא מגניב במיוחד, ועולה בארץ פי שתיים לפחות כמובן. אני ארמוז שמדובר בB.M.W סדרה 1 עם גג נפתח, אבל אני לא אפרט מעבר לזה בינתיים.
אז הנושא הבא :
5. אוטו מגניב? תראה תמונה! באיזה מהירות הוא נוסע? יש לו גלגל ספייר??

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

6. יש לך עוד דברים מגניבים לספר על סטארקפט? אתה משחק בליגה של פייסבוק בטורניר AHGL?

טוב, לנושא הבא:
מחשבים זה מגניב, אבל הבן אדם צריך גם מקרן כדי להרגיש שלם עם עצמו. עדיין אין לי מקרן, וגם לא טלוויזיה. אבל אני זומם לקנות מקרן איכות בקרוב.
נכון לכרגע אני חושב על המקרן 5020UBe של אפסון שנשמע ממש טוב על הנייר.
7. מקרן? למה לא טלווזיה? איך המקרן החדש?

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

Skyrim

לפני חמש וחצי שנים (ואו) כתבתי פוסט משוויץ על שדרוג שביצעתי כדי לשחק בOblivion.
מאז ביטים רבים זרמו בריישת, וממש עכשיו אני מתחיל את הPre-load של Skyrim בסטים.
סקיירים הוא המשחק הבא בסדרה של The elder's scrolls, ולפי כל הסימנים הוא יהיה מדהים.

המשחק ישוחרר בעוד יום וחצי, יאי!

AWS

מסיבות היסטוריות, תמיד העדפתי את החומרה שלי אמיתית ולא וירטואלית.
בחודש האחרון יצא לי להתנסות בעבודה עם AWS – הלו הוא שרותי הווב של אמזון (Amazon Web Services) שכולל בין היתר את:

  • EC2 – הענן האלסטי של אמזון, שמאפשר להקצות מכונות וירטואליות על פי דרישה, שמריצות מה שבא לכם.
  • S3 – שרות אחסון הנתונים הוותיק של אמזון
  • RDS – שרותי בסיס נתונים, למעשה מכונת MySQL בניהול של אמזון, שכולל גם שרותי גיבוי, Read replica, סנאפ-שוטים של הנתונים ועוד.

מכונה וירטואלית בEC2 כוללת שטח אכסון מקומי (הרדיסקים לצורך העניין).
בעבר – מערכת הקבצים של המכונה ישבה על הדיסקים האלו. הImage של מערכות בשיטה הזו נקרא Instance store image, ואוכסנו בS3 – שרות איכסון הנתונים של אמזון.

אחת התכונות של הדיסקים המקומיים היא שכשהמכונה מוקצה מקבלים דיסקים ריקים, וכשהמכונה משוחררת (Terminated) המידע על הדיסקים האלו אובד לתמיד.
הדבר הזה גרם לקשיים אמיתיים להריץ בסיס נתונים על EC2, עד שאמזון פיתחו את הEBS (Elastic block store):
הEBS דומה במהות שלו למערכת איכסון מרכזית שמקצה דיסקים למכונות קצה, ולכן ביצועי הקריאה/כתיבה שלו תלויים בעומס עליו. במילים אחרות – אתם עשויים לסבול מביצועי קריאה/כתיבה ירודים כי משתמשים אחרים מתפרעים.
אם חשובים לכם ביצועי הIO, ואתם מוכנים לספוג אובדן של הנתונים אם המכונה משוחררת, שווה לההשתמש בדיסקים המקומיים, תקבלו ביצועיי IO צפויים יותר ובנוסף לא יהיה לכם תשלום לפי נפח הIO שאתם מבצעים (בניגוד לשימוש בEBS).
אפשר כמובן להגדיר אותם בתצורת  RAID-0 כדי לשפר את הביצועים

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

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

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

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

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

כל המכונות הוירטואליות שלי מבוססות על אותו IMAGE, למרות שהן מסוגים שונים ומשונים, יש לי שם:

  • מכונות DNS
  • מכונות Memcached
  • מכונות WEB
  • מכונות Gearman
  • מכונת HAProxy
  • ועוד

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

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

פתרון אלטרנטיבי הוא להשתמש במערכת Marionette collective:
קונספטואלית, mcollective  היא נטולת שרת מרכזי.
יש שרת הודעות כללי (Message queue) מסוג ActiveMQ שמשמש לתקשורת בין המכונות. פלאגינים מיוחדים בשם Agents רצים על המכונות, ומאפשרים ביצוע פעולות שונות ומשונות עליהם.
הפעולות יכולות להיות מסוננות לפי "עובדות" שהמכונות יודעות על עצמן, במילים אחרות – מכונת WEB, שיודעת היא מכונת WEB, לא תבצע פעולה שמיועדת למכונת Gearman.
ההתקנה של MCollective היא לא מאוד מסובכת, ומה שיפה זה שהActiveMQ עובד, כל מכונה שעולה אוטומטית זמינה דרך הMCollective (כמובן – היא צריכה להריץ את השרת של MCollective, אבל כל זה חלק מהIMAGE הבסיסי.
שווה מאוד לראות את הסרטונים באתר של Mcollective כדי להבין במה מדובר.

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

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

אינטרנט ללא הגבלה – לחצי יום בחודש

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

@ גלישה ללא הגבלת זמן במהירות של עד 15.00 מס"ש קצב הורדה ו- 800 קס"ש קצב העלאה בהיקף העברת נתונים(הורדה והעלאה) של עד 65 ג'יגה בייט (GB) בחודש שירות ("מסגרת החבילה").

העברת נתונים של עד 65 ג'יגה בייט לחודש. בואו נחשב רגע, 15 מגה-ביט זה 1.875 מגה בייט לשניה, או 6.7 ג'גה לשעה – או 162 ג'יגה בייט ליום.
במילים אחרות, בזק מקציבים לי הורדה רציפה של בערך חצי יום במהירות מקסימלית, ואז אני יכול לסגור את המחשב וללכת לים עד סוף החודש.
חשבתי לתומי שזו טעות, הרי זו הגבלה מטופשת בעליל – והתקשרתי אליהם.
הנציגה המסכנה לא ידעה מאיפה נפלתי לה, "אין שום הגבלה" היא חזרה ואמרה והקריאה לי את תנאי החוזה (המהירות, המחיר וההתחייבות)
אם אין הגבלה, הקשתי – למה כתוב שיש באימייל הרשמי ששלחת לי שמותר לי להוריד רצוף חצי יום בחודש?
"אני אשלח לך אימייל חדש שבו לא יהיה כתוב", אמרה הנציגה.
הסכמתי בשימחה, וכשהגיע האימייל החדש כמובן זה עדיין היה שם.
שלחתי לה אותו חזרה, והיא הלכה לבדוק את זה מול הבכירים במשמרת.
היא חזרה ובשורה בפיה : "לא אוכפים את זה".
"אם לא אוכפים את זה, למה זה כתוב?", שאלתי,
אה, זו הנחיה מלמעלה.
טוב, כמובן שמציגת שרות לקוחות לא ציפיתי ליותר מדי, הרי היא לא באמת יכולה לשנות דברים כאלו.

פניתי לפניות הציבור של בזק Pniot@bezeqint.co.il (אל תטרחו עם הפורם באתר שלהם, הוא מגביל אתכם לשבע תווים לפניה).
קיבלתי תגובה, פרשתי את הטענה שלי – ואז כלום.
אחרי כמה שבועות, שלחתי עוד אימייל, ותהיתי אם הם מתעלמים.
אחרי כמה שבועות, עוד אימייל.
לבסוף חזרו אלי, טלפונית, ואחרי שיחה די מתישה שלא הגיעה לשום מקום מיוחד וכללה רמזים שהם שקלו לבטל את ההגבלה, קיבלתי את זה באימייל הסיכום:

  • בהתייחס לטענתך בדבר מסגרת תעבורת הנתונים בחבילה נבקש לציין, כי בזק בינלאומי, שהינה ספקית האינטרנט המובילה בישראל והאחרונה מבין כל הספקיות האינטרנט בארץ לבצע מהלך זה, בפועל טרם אכפה את המגבלה על השימוש בשירותים המצוינת במכתב ההצטרפות.
  • יצוין, מטרתה של מגבלה זו, הינה לאפשר לבזק בינלאומי לשמור על אפשרות לשלוט בחריגות קיצוניות בנפחי התעבורה ובכך ליישם מדיניות שימוש הוגן בשירותיה (fair usage policy), כמקובל בארץ ובעולם.
  • על אף האמור לעיל וכפי שסוכם בשיחתנו הטלפונית, לפנים משורת הדין ולמען שביעות רצונך, ככל שמסגרת תעבורת הנתונים תוחל בעניינך, תינתן לך האפשרות לבטל את שירותי הגלישה המסופקים לך על ידי בזק בינלאומי ללא תשלום יתרת חודשי ההתחייבות הנותרים בחבילה וזאת בתוך 30 יום מיום תחילת אכיפת המסגרת.
    יובהר, כי האמור בסעיף 4 לעיל תקף אך ורק ביחס לחבילה המוזכרת בסעיף 1 לעיל.
    ככל שיעלה הצורך לנצל את האמור בסעיף 4 לעיל, עליך לציין בפני נציגי החברה כי הנך זכאי למחווה שירותית זו בהתאם למספר פניה X.

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

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

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

החלפת דיסק תקול בZFS

מכונת הOpenSolaris שלי, מכילה שישה דיסקים:
שני דיסקים של 1TB, שניים של 1.5TB ושניים של 2TB.
מאגר האחסון (pool) העיקרי בנוי בעצם משלושה זוגות של דיסקים (או חלקי דיסקים), כך שאם אחד מהם מתקלקל המערכת יכולה להמשיך לתפקד.
החסרונות של הגישה הזו הם שאני מאבד חצי מהנפח, ושאם שני דיסקים מאותו יחידת ראי נופלים איבדתי הכל.
היתרונות הם ביצועי קריאה כפולים, וגמישות בשינויי תצורה. קל להוסיף דיסקים או לשדרג דיסקים קיימים לגדולים יותר.

ההסתברות לכשלון של דיסק מסויים גדלה ביחס ישיר למספר הדיסקים, במהלך השנתיים בערך שיש לי את המערכת הזו, שלושה דיסקים כשלו (!) ובכל זאת עד היום לא איבדתי מידע.
בכשלון האחרון הבחנתי לפני כמספר שבועות : לא הרגשתי בעיות, אבל ראיתי במקרה שZFS מדווח על שגיאה בדיסק, מה שהביא את המאגר כולו למצב degraded, שהוא בהחלט לא מצב שתרצו להשאר בו יותר זמן ממה שחייבים (כי דיסק נוסף שכושל עלול לדפוק את כל הנתונים).
אז נאלצתי להחליף את הדיסק.
הקטע הכי קשה הוא להבין איזה מהדיסקים הפיזיים צריך לנתק.
בפעם האחרונה דאגתי לסמן את הדיסקים במדבקות עם השם שלהם במערכת ההפעלה (למשל c8d0 עבור דיסק 1 בקונטרולר 8) אבל משום מה המדבקות היו קצת לא מדוייקות.
בכל מקרה, אחרי קצת ניסוי וטעיה, מצאתי איזה מהדיסקים הוא c8d1 (הדיסק שדווח כלא תקין).
הרצתי את הפקודה הבאה כדי להוציא אותו מהמאגר, וניתקתי אותו פיזית.
[code]
zpool detach storage c8d1
[/code]
חיברתי למחשב אחר כדי לבדוק עם SpinRite (אין לי מסך מחובר לשרת הOpenSolaris).
SpinRite לא הצליח לתקן אבל ראיתי שSMART מדווח שיש לו המון שגיאות חיפוש (seek) וקריאה.

שלחתי למעבדה וקיבלתי דיסק אחר תוך כמה שבועות.
התקנתי את הדיסק במחשב, והרצתי את הפקודה הבאה כדי לחבר אותו חזרה:
[code]
zpool attach storage c9d1 c8d1
[/code]
הפקודה די הפוכה לפקודת הניתוק הקודמת, רק שהיא מציינת לאיזה דיסק קיים להוסיף את החדש.
אחרי שהוספתי, זה המצב של המאגר storage :
אפשר לראות שמתבצעת פעולת resilver, שבעצם דואגת לסנכרן הנתונים של הדיסק החדש עם הדיסק הוותיק באותה יחידת ראי.

root@iron:~# zpool status storage
pool: storage
state: ONLINE
status: One or more devices is currently being resilvered. The pool will
continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
scrub: resilver in progress for 0h14m, 0.60% done, 38h34m to go
config:

NAME STATE READ WRITE CKSUM
storage ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
c8d0p2 ONLINE 0 0 0
c9d0p2 ONLINE 0 0 0
mirror-1 ONLINE 0 0 0
c9d1 ONLINE 0 0 0
c8d1 ONLINE 0 0 0 6.70G resilvered
mirror-2 ONLINE 0 0 0
c11d0 ONLINE 0 0 0
c10d0 ONLINE 0 0 0

errors: No known data errors

סקלה

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

  1. הבא מהAPI של יוטיוב פיד RSS רלוונטי
  2. חלץ ממנו URLים של סרטונים
  3. הורד את הסרטונים עצמם מיוטיוב עם youtube-dl
  4. קודד את הסרטונים לפורמט של אייפד עם HandBreak
  5. צור פיד RSS שמאפשר להוריד את הקבצים המקודדים

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

לאחרונה שמעתי יותר ויותר על סקלה, סקלה היא שפה יחסית חדשה (הופיעה ב2003).
אז מה התכונות של סקלה?

  • שפה סטטית, הקומפיילר יגיד לכם כשיש לכם שגיאות טיפוס (בניגוד לשפות דינמיות כמו PHP, פייתון וכו')
  • מבוססת על הJVM, סקלה מתקמפלת לבייט-קוד
  • מאפשרת גישה מלאה ונוחה לתשתיות וספריות של ג'אווה. אם יש לכם קוד ג'אווה תוכלו להשתמש בו בקלות מסקלה
  • הקוד בסקלה הוא הרבה יותר קומפקטי מג'אווה
  • תומכת בתכנות פונקציונלי, פונקציות הן אזרחיות מהשורה הראשונה, אפשר להעביר פונקציות כפרמטר וליצור פונקציות אנונימות בצורה מאוד אלגנטית.
  • תומכת במודל הActors, שהוא מודל שבו "שחקנים" שונים מתקשרים אחד עם השני על ידי שליחת הודעות, ולא חולקים שום State. המודל הזה חוסך לא מעט בעיות שנובעות ממיקבול גבוה
  • תמיכה בסקריפטים, אפשר להריץ קוד כסקריפט בלי לקמפל אותו מראש (למרות שכמובן אפשר לקמפל).

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

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


object YoutubeRSS
{
val downloader = new Downloader
def main(args: Array[String])
{
deleteOldFiles
regenerateFeeds
Source.fromFile("channels").getLines.foreach(x =>; process(x trim) )
downloader ! Stop
}
//...
}

התוכנית מפעילה כמה פונקציות ואז קוראת שורות מקובץ,  ועל כל שורה מפעילה את הפונקציה process.
לבסוף היא שולחת הודעת Stop לActor של הDownloader.
אפשר לשים מיד לב לכמה דברים:

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

הנה עוד קצת מהתוכנית:


object Conf
{
val YOUTUBE_CHANNEL_URL = "http://gdata.youtube.com/feeds/api/users/%s/uploads"
val YOUTUBE_PROFILE_URL = "http://gdata.youtube.com/feeds/api/users/%s"
val BIN_DIR = "/home/omry/youtube-rss-2/bin"
val DOWNLOAD_DIR = "/home/omry/youtube-rss-2/download"
val RSS_WEB_DIR="/home/omry/www/youtube-rss.firefang.net"
val RSS_BASE_URL="http://youtube-rss.firefang.net"
val DELETE_OLDER=14
}

object YoutubeRSS
{
//...
def process(channel : String)
{
println("Processing channel " + channel)
updateFeed(channel)
val url = Conf.YOUTUBE_CHANNEL_URL.format(channel)
val rss = Source.fromURL(url).mkString
val xml = XML.loadString(rss)
val entries = xml\"entry";
entries foreach(download(_,channel))
println("Done processing " + channel)
}
}

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

val entries = xml\"entry";

מחזירה רשימה של entries מתוך הXML (שהוא פיד רסס).

עוד קצת קוד מהפונקציה שמכינה את קובץ הRSS הסופי:


new File(dir).listFiles.
sortBy(_.lastModified).reverse.
filter(_.getName().endsWith(".mp4")).
map(file => file.substring(dir.length + 1)).
foreach(file =>
{
val f = new File(dir,file)
val entry = new SyndEntryImpl()
//..

הקוד פה מקבל (עם API של ג'אווה) את רשימת הקבצים בספריה, ממיין אותן לפי תאריך שינוי, הופך את הסדר, מפעיל פילטר שמשאיר רק קבצי mp4, מפעיל פוקציית map שמורידה את הספריה משם הקובץ ולבסוף מפעיל קוד כל סטרינג.

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

// Run process
"ls -l"!
// Run process and get output into string:
val output = "ls -l"!!
// Run process from a list of arguments
val fname = List("youtube-dl", "--get-filename","-o","download/"+channel+"/%(uploader)s-%(stitle)s.%(ext)s",link.toString)!!

הרבה יותר נחמד מבג'אווה.

אפשר להוריד את הכל מפה.

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