דרכון קנדי ב20 דקות, או : VPN לכל שרת

אחד המשחקים המצופים של השנה – Dragon age: Origins – יצא לפני אתמול, ואחרי שראיתי את הציונים והביקורות שהוא קיבל החלטתי לקנות אותו.

חיש מהר קניתי אותו בSteam, חנות המשחקים שלValve.
בזמן שקניתי אותו היה נראה כאילו אני מבצע הזמנה לפני שהמשחק יצא (Pre order), אבל מה שקורה בדרך כלל זה שאפשר להוריד את המשחק מראש, וברגע שהוא משתחרר (מה שהיה אמור להיות אתמול) קבצי המשחק המוצפנים עוברים תהליך של פענוח ואז אפשר לשחק.
אבל מה? מסתבר שבארצנו הקטנטונת – וגם באירופה, המשחק ישוחרר רק ביום שישי או שבת.
סתם כדי להתעצבן, בדקתי באתר הטורנטים הקרוב לביתי, ואכן – המשחק כבר שם.
שלחתי אימייל לתמיכה של Valve, בו מחיתי על כך שהם מסרו מידע שגוי שגרם לי ולאחרים לקנות את המשחק ולהצטער.
אז המשחק כבר אצלי, מוצפן – ושילמתי עליו, אבל מסיבות עלומות ומציקות אני לא מורשה לשחק בו למרות ששחקנים אחרים בעולם כן.
מעצבן מספיק כדי לפעול.
משתמשים בפורום של Steam כתבו שהם הצליחו לשחק אחרי שהתחברו לSteam תוך שימוש בVPN שמחובר לארצות הברית.
חיפשתי קצת, ולא מצאתי משהו שלא ביקש ממני כרטיס אשראי בשביל לנסות, אז חשבתי לעצמי:
השרת שמריץ את הבלוג נמצא בקנדה, רוב הסיכויים שהמשחק שוחרר בקנדה באותו תאריך כמו בארצות הברית.
החלטתי להרים שרת VPN על השרת בעזרת ההוראות פה.
ההוראות פשוטות למדי, אבל במקום לאתחל את השרת כמו שהם הציעו אחרי ההגדרות הפעלתי מחדש את pptpd:
[code]
/etc/init.d/pptpd restart
[/code]

כדי להפעיל את קידום הפקטות בקרנל בלי לאתחל, הרצתי את:
[code]
echo 1 > /proc/sys/net/ipv4/ip_forward
[/code]

פתחתי חור TCP בפיירוואל בשרת בפורט 1723, שהוא הפורט הסטנדרטי של העניין הזה, וכמובן בחרתי סיסמא חזקה עם gpw שמייצר סיסמאות שאפשר להגות (Generate pronounceable passwords), ניסיתי להתחבר דרך מכונת המשחקים שלי שמריצה חלונות 7 (מערכת מומלצת), והעסק התחבר בלי בעיה.
בדקתי את כתובת הIP שלי בwhatismyip.com ולשמחתי ראיתי שהיא הכתובת של השרת.
הפעלתי מחדש את Steam, נכנסתי מקנדה – והפלא ופלא, בתור קנדי הצלחתי להפעיל את המשחק.

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

Java singleton – the next generation

סינגלטון הוא אחד התבניות הנפוצות בתוכנה.
בגדול, סינגלטון הוא אובייקט יחיד מסוג מסויים במערכת, שכולל פונקציה סטטית שמאפשרת גישה נוחה לאובייקט מכל מקום במערכת.
למשל, אם יש אובייקט שמטפל בשליחת אימיילים, סביר שהוא יהיה סינגלטון כי אין ברוב התוכנות משמעות לכמה אובייקטים שיטפלו בשליחת אימיילים.
בדרך כלל כותבים סינגלטון ככה:
[code lang="java"]
public class EmailSender
{
private static EmailSender s_instance;

private EmailSender(){} // private constructor

public static synchronized EmailSender getInstance()
{
if (s_instance == null)
s_instance = new EmailSender();
return s_instance;
}

public void sendEmail(String recepient, String subject, String text)
{
// …
}
}
[/code]
כדי להשתמש בסינגלטון ככה:
[code lang="java"]
EmailSender.getInstance().sendEmail(…);
[/code]
כמה דברים לשים אליהם לב:
* יש בנאי פרטי, כדי למנוע מכל מני גורמים "לא מוסמכים" לאתחל עותק משל עצמם של הסינגלטון.
* הפונקציה getInstance צריכה להיות מסונכרנת כדי למנוע מצב שבו שני ת'רדים שונים ניגשים במקביל לפונקציה וגורמים לאיתחול של שני אובייקטים במקום אחד.

עד כאן, טרויאלי לכל מי שכתב תוכנה בג'אווה.
הפוסט הזה הוא על דרך אלטרנטיבית לכתיבת סינגלטון, והרי היא:
[code lang="java"]
public enum EmailSender
{
instance;

public void sendEmail(String recepient, String subject, String text)
{
// …
}
}
[/code]
אפשר להשתמש בenum עם קבוע בודד, ולמרבה ההפתעה אפשר להכניס פונקציות ומשתנים בהגדרה של הenum.
מותר גם (אבל לא חייבים) להגדיר בנאי פרטי.
השפה מונעת את בעיית הגישה מכמה ת'רדים, וכן אין בכלל קונספט של איתחול יזום של enum.
כדי להשתמש בסינגלטון ככה:
[code lang="java"]
EmailSender.instance.sendEmail(…);
[/code]
אלגנטי, לא?

projects.firefang.net

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

אגב, הלוגו החביב בחסות creatr.

כרגע יש בו שני פרוייקטים:
1. Zync : משלב בין rsync וzfs, כדי לגבות שרתים מרוחקים.
2. MySQL Monk : מנטר את מצב הרפליקציה של שרתי MySQL ושולח אימייל אם הם מתחילים לזייף (הסלייב נשרך יותר מדי מאחורי המאסטר, או שאחד השרתים למטה).

שני הפרוייקטים הנ"ל מתבססים על Swush כשפת הקונפיגורציה שלהם.
הAPI של Swush כבר מספיק עשיר ויציב, וממש כיף לי להשתמש בו.

אופן סולאריס: תצורה, שיתוף קבצים וגיבויים

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

תצורת דיסקים ומערכת הקבצים

זו התצורה הנוכחית של הZFS באיירון:
[code lang="bash"]
omry@iron:~/dev/zync$ zpool status
pool: rpool
state: ONLINE
scrub: none requested
config:

NAME STATE READ WRITE CKSUM
rpool ONLINE 0 0 0
mirror ONLINE 0 0 0
c8d0s0 ONLINE 0 0 0
c9d0s0 ONLINE 0 0 0

errors: No known data errors

pool: storage
state: ONLINE
scrub: none requested
config:

NAME STATE READ WRITE CKSUM
storage ONLINE 0 0 0
mirror ONLINE 0 0 0
c8d0p2 ONLINE 0 0 0
c9d0p2 ONLINE 0 0 0
mirror ONLINE 0 0 0
c9d1 ONLINE 0 0 0
c8d1 ONLINE 0 0 0

errors: No known data errors
omry@iron:~$ zfs list
NAME USED AVAIL REFER MOUNTPOINT
rpool 7.46G 31.7G 81K /rpool
storage 1.54T 672G 1.53T /storage
storage/backup 9.35G 672G 9.35G /storage/backup

[/code]

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

שאר המקום בשני הדיסקים הראשונים, וכל המקום בשני הדיסקים השניים הוקצה למערכת הקבצים storage, שמשמשת לאכסון, לגיבוי של מחשבים אחרים וכנראה גם כמערכת קבצים מרכזית של ספריית הבית שלי.
בהתחלה שקלתי ללכת על תצורת RAIDZ כדי לנצל כמה שיותר מקום.
הבעיה הגדולה מבחינתי עם RAIDZ היא שהדיסקים שמרכיבים את הpool צריכים להיות באותו גודל (אחרת מפסידים את המקום העודף בדיסקים הגדולים יותר).
מהסיבה הזו הלכתי על RAID10, עם שני זוגות של מירורים בנפח כולל של כ2.5 טרה בייט.
ביום שיהיה לי שם צפוף, אני אוכל לזרוק עוד צמד דיסקים פנימה ולקבל מקום נוסף מיד (בלי להזיז נתונים, להגדיל מערכות קבצים או דברים מעצבנים אחרים).

שיתוף קבצים בין מחשבים

יש לי עוד שני מחשבים, אחד מריץ רק לינוקס, ואחד מריץ לינוקס וחלונות (במכונה וירטואלית בשביל iTunes ימח שמו), ובדואל בוט בשביל משחקים.
כדי לשתף קבצים עם הלינוקסים, הגדרתי שיתוף בNFS.
את NFS פיתחו בסאן, והמימוש שלהם הוא המימוש הטוב ביותר של NFS, הבעיה היא שהמימוש של לינוקס הוא לא ממש לפי התקן, לפחות אם נאמין לשמועה הרווחת.
בזמן העברת קבצים מלינוקס לאופן-סולריס על גבי NFS נתקלתי בבעיות, ההעתקה הופסקה מעצמה בהעתקת קבצים גדולים עם שגיאה קלט/פלט סטנדרטית : די מטריד.
אחרי שווידאתי שהבעיה היא בNFS (העתקתי את הקובץ הגדול באמצעות SCP ווידאתי שהוא תקין עם md5sum) התחלתי לשחק בפרמטרים של NFS בצד הלינוקס, באיזה פרוטוקול הוא מתחבר (NFS4? NFS3? אולי אפילו NFS2 השם ישמור?), באיזה תעבורה? UDP או TCP.
בסוף גיליתי את התצורה שעובדת וגם נותנת ביצועים טובים:
NFS3 עם TCP, ועם חוצצי קבלה ושליחה בגודל 32K (בשביל הביצועים, לא היה להם השפעה על השגיאה).
השורה הרלוונטית /etc/fstab בלינוקס נראית ככה:

[code lang="bash"]
iron:/storage   /storage        nfs     rw,soft,timeo=3,rsize=32768,wsize=32768,proto=tcp 0     0
[/code]

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

גיבוייים של מכונות לינוקס

אין ספק שאיירון היא המכונה הכי עמידה שיש לי בכל מה שקשור לאכסון קבצים ועמידות לקריסת דיסקים (דיסקים קורסים, זו עובדת חיים).
מכיוון שכך, זה רק טבעי שאני ארצה לגבות של מכונות הלינוקס שלי אל איירון.
בעבר תיארתי את אסטרגיית הגיבוי שלי של מכונות לינוקס.
בגדול הרעיון הוא לבצע rsync של הקבצים הרלוונטיים, ולשלב את זה עם רוטציה של ספריות סנאפשוט בזמנים שונים. כדי למנוע בזבוז מיותר של מקום – משתמשים בhard links כך שקובץ שלא שונה מהגיבוי האחרון תופס מקום פעם אחת בלבד.
זה נחמד, אבל די מסורבל : צריך להעתיק את העץ מחדש כל פעם, ולמחוק עצים מיותרים, ובנוסף השיטה של החיסכון במקום לא מושלמת – כי קובץ ששונה רק בביט אחד יתפוס את כל המקום של הקובץ מחדש.
עם הסנאפשוטים של ZFS אפשר לעשות משהו הרבה יותר פשוט ואלגנטי, שגם יותר חסכוני במקום והרבה יותר מהיר.
הרעיון הוא פשוט לסנכרן את הספריה או הספריות הרלוונטיות מהשרת (או השרתים) אל ספריית היעד, ולקחת סנטפשוט של ZFS. כדי למנוע התפוצצות סנטפשוטים, אפשר פשוט למחוק סנאפשוטים ישנים.
כתבתי תוכנה פשוטה בשם zync שמממשת את הרעיון הזה.
כתובה בג'אווה, וקובץ ההגדרות שלה כתוב בswush, אז הוא קריא ונחמד.
הנה קובץ הגדרות לדוגמא:
[code lang="java"]
@swush 1.0

zync
{
backup
{
host : root@10.0.0.2
directory : /

# Exclude files or dirs
exclude
{
/cdrom
/mnt
/dev
/media
/proc
/sys
/tmp
/var/cache
/var/log
/var/lib/mysql
}
}

rsync
{
command : /usr/bin/rsync
destination : "/storage/backup/${host}"
options
{
-a
–force
–delete-excluded
–delete
}
}

zfs
{
backup_file_system : storage/backup
snapshot
{
delete_older : 30d
}
}
}
[/code]

zync כבר די מוכנה לדעתי, ואני מתחיל לגבות איתה את מכונות הלינוקס שלי, כולל את השרת שמריץ את הבלוג.

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

יסוריו של המשדרג בהמשכים

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

אז התוכנית היתה לקחת את לוח האם והמעבד של אותה מפלצת זוללת ביטים בדימוס ולהשמיש אותם לטובת מכונת האכסון שאני מתכנן.
כבר יש לוח אם ומעבד, אז הזמנתי מפנדה מארז Antec Titan Server, שהוא מארז נחמד לשרת ביתי, עם מקום לשש הרדיסקים (2.5") וארבע סידירומים (5.25", מי צריך ארבע סידירומים?)

חוץ מזה הזמנתי 4 גיגה זכרון פשוט ככל האפשר של G.Skill,   וספק כוח 400 וואט של Corsair.
כל הרדיסק צורך כ10 וואט, ואם ניקח שש הרדיסקים ונשמור נניח 100 ואט למעבד הגענו בקושי ל160 וואט, אבל אין ממש ספקים טובים בהספק נמוך מזה.
הדבר האחרון בהזמנה הוא צמד הרדיסקים של סיגייט, בנפח 1.5 טרה כ"א.

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

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

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

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

התחלתי לטחון את האינטרנט בחיפוש אחרי לוח אם, רצוי של אסוס – עם שש חיבורי SATA שגם נתמך טוב בOpenSolaris.
לבסוף הלכתי על ASUS P5Q-SE2, שעונה על הדרישות.
לקחתי גם את הקור2דואו הכי זול שמצאתי, E5200 במהירות 2.5 ג'יגהרץ.
סבב שני עלה כ1000 שקל (מישלוחה אינקלודד)

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

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

נו טוב, יש התקדמות.
עם כל הצרות, החלטתי שכדאי לבדוק את הזכרון בכל זאת, רק כדי להיות בטוח שהוא תקין.
הפעלתי את ממטסט, ותוך שבע שניות מרגע שהוא התחיל לעבוד המחשב עשה בוט ספונטני.
נסיון שני, אותו דבר. שלישי – שוב.
אולי הזכרון דפוק בכל זאת?
שוב התחלתי בריקוד הרגיל, רק הצ'יפ הראשון, רק השני, משחקים עם הערוצים של הזכרון… שום דבר לא עזר.
בעליה של memtest, ברירת המחדל היא גרסא 3.5, אבל יש אפשרות לבחור את הגרסא הקודמת – 3.4.
ניסיתי עם 3.4, והפלא ופלא – לא התפוצץ.
גיגול קצר הראה שזו שאנשים נתקלו בבעיה עם 3.5, לא נורא – המשכתי בבדיקה עם 3.4.
אחרי כמה שעות בלי איתחולים ובלי שגיאות, הפסקתי את הבדיקה והחלטתי שהגיע הזמן להתקין.
ההתקנה עברה באופן חלק, התקנתי את אופן סולאריס על מחיצה של 40GB בדיסק הראשון (קצת הרבה , אבל לא נורא – זה דיסק של טרה וחצי).
העלתי את המערכת, הגדרתי את העסק כך שמחיצת השורש תהיה על MIRROR (זה לא טריוואלי כי ההתקנה לא תומכת בתצורה הזו, אני אספר על ההגדרות של OpenSolaris בפוסט אחר).
אפילו בדקתי שהמערכת עולה אם אני מנתק את הדיסק הראשון – וכן – היא עלתה כראוי.
OpenSolaris זיהתה את כל החומרה הרלוונטית לי, שספציפית במקרה הזה זה הדיסקים (דרך בקר הSATA) וכרטיס הרשת.

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

מוסר ההשכל?
אין, אבל אני נשבע שאני אגרום למניאק הזה לעבוד!

נ.ב:
למישהו יש כרטיס מסך מיותר בחיבור PCIE? 🙂

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

מכונת אחסון ביתית על אופן-סולאריס

כזכור לקוראים הוותיקים, אני משדרג די סדרתי.
לפני כשלוש שנים שדרגתי את מחשבי למפלצת זוללת ביטים שהתיישנה קשות מאז, פנטיום D, עם 2 ג'יגה זכרון, לוח אם פיצוצי של אסוס וכל זה.
הזמן עבר, ובשדרוג סיבובי טיפוסי שדרגתי את המחשב לפנטיום קור-דואו, והעברתי את הפנטיום D לסלון, וראיתי כי טוב.
עוד זמן עבר, והפנטיום D התחיל לגמגם בטיפול בוידאו ברזולוציה של 1080p, בהתחלה נסיתי להוציא ממנו עוד קצת חיים בשימוש בקודקים מתוחכמים, אבל בשלב מסויים ירדתי מהעניין וקניתי פנטיום i7 לחדר, ואת הקור-דואו שמתי בסלון. הפעם כבר לא היה לי שימוש למפלצת שזללה ביטים בימיה הטובים, ושמתי את לוח האם, המעבד והזכרון שעדיין עבד בקופסא, בתקווה למצוא לחומרה שימוש מתישהו.

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

מה עוד?
לא צריך להסתבכך עם מחיצות, מערכות קבצים, פירמוטים, RAID וכל העניינים האלו.
ZFS תומכת בהכל, עם שתי פקודות אינטואיטיביות – zpool וzfs. היא תומכת גם בNFS (שיתוף קבצים פשוט ברשת).
אני לא אכנס לעובי הקורה בפוסט הזה, אולי בפוסט אחר, אבל מספיק שאומר שמערכת הקבצים הזו לבדה היא סיבה מספיק טובה לעבור מלינוקס לאופן-סולאריס (למרבה הצער, הרשיון בה משוחררת ZFS לא תואם את GPL, ולכן אין ZFS בלינוקס – ולא, אני לא מחשיב פתרון ZFS מבוסס FUSE כפתרון אמיתי).

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

אז איך נהנים משני העולמות?
תוכנות לינוקס, איכסון באופן סולאריס?
האופציה המתבקשת היא לארגן מכונה נוספת שתריץ אופן סולאריס, ותשמש כמכונת אחסון בלבד.
הגישה תתבצע דרך NFS או דרך CIFS למחשבי חלונות (אני עדיין משחק על חלונות!).
וזה מתקשר לאגדה המקדימה על המכונה זוללת הביטים, שהיום זוללת בעיקר אבק.
התוכנית היא לקנות לה עוד קצת זכרון (ג'יגה אחד התקלקל וארבע ג'יגה היום עולה כל כך זול שזה פשע לקנות שני ג'יגה), לקחת איזה הרדיסק או שניים או שלוש מהמחשב בסלון, לקנות עוד איזה הרדיסק או שניים, ולקנפג שם אופן סולאריס עם ZFS בתצורת RAIDZ (תצורה יותר טובה מתצורת RAID5 שנותנת עמידות נתונים זהה אבל גם עם דיסקים זולים ובביצועים יותר טובים ברוב המקרים).
ככה המכונה תזכה לעדנה מחודשת, ולי יצא להנות מהתכונות של ZFS. אולי אני אפילו אשים את ספריית הבית שלי על המכונה הזו. עם חיבור ג'יגה ביט, זה כנראה יהיה יותר מהיר מעבודה מקומית על דיסק בודד כי אני אקבל את הביצועים של עבודה על כמה דיסקים במקביל.

בקיצור, אני מתחיל להזמין חומרה.
אני מניח שיהיו פוסטי המשך.. בהמשך.

Joomla Extentions Directory and GPL

קיבלתי את האימייל הבא מהצוות שמנהל את אתר ההרחבות של ג'ומלה, שאומר בקצרה שמ 1.7.2009 רק חבילות ברשיון GPL יכללו במאגר ההרחבות של ג'ומלה.
הוספתי את פיירסטטס למאגר ההרחבות לפני שנתיים וחצי, והמערכת קיבלה יופי של תגובות ממשתמשי ג'ומלה.
מכיוון שפיירסטטס לא משוחררת תחת GPL, היא כבר לא מופיעה במאגר.
בבדיקה מול גוגל-קש, מספר ההרחבות במאגר ירד מ4554 ל2990, ירידה של 33%.
לדעתי זו חוצפה ובריונות של של ג'ומלה לדרוש ממפתחי ההרחבות לשנות את הרשיון, וויתרתי על שרותי אתר ההרחבות של ג'ומלה (שזה די חבל, כי הוא הכיל 21 ביקורות על פיירסטטס, רובן המכריע מאוד חיוביות).

האימייל, תגובתי למטה:

Dear "Omry Yadan",

We at the Joomla Extensions Directory want to remind you that, as announced 6 months ago, on 1 July are going to change the directory policy to list GPL Extensions only. As always, commercial and non commercial extensions are welcome on JED as long as they use the GPL license.

The deadline for changing licenses without being unpublished is http://www.timeanddate.com/worldclock/fixedtime.html?month=7&day=2&year=2009&hour=00&min=55&sec=0&p1=103.

This change is intended for to bring it into line with the overall mission of the Joomla Project. After careful thought and reflection, the Joomla! Project determined that the Joomla! Extensions Directory should be a community resource that fully embodies the project's values, especially freedom as exemplified by the GPL license.

Policy changes
We have implemented some policy changes to
– Enhance support of GPL developers
– Address concerns about relicensing.
We think that the best place to get an extension is from the original developer of that extension. Therefore we will not link to collections of GPL extensions that are not submitted by the original developers. These are not requirements of the GPL license but rather fall in line with our "forking" guidelines.

Forked projects

Non-GPL extensions
In order for you as developer to keep a non-GPL extension listed you need to relicense it to GPL.
You do it through to add two elements to each source file of your program:
– a copyright notice
– statement of copying permission, saying that the program is distributed under the terms of the GNU General Public License –
http://www.fsf.org/licensing/licenses/gpl-howto.html
– adding a <license> tag to the header of the extension XML file
– including a copy of the GPL license in your distribution. This does not need to be copied to the user's server on install, but must be included in the distribution.

Note for GPL extensions:

– You need to state on your website that the extensions are distributed with the GPL license
– You can't add any conditions that restricts or contradicts the GPL license.

We thank you for your patience during these transitions. We will  extend any assistance possible to making the transition as painless as possible for everyone involved. The project is committed to providing the information and help that developers need in order to relicense (or to license for the first time, if there is no current license).

The JED editors and members of the Core Team and Open Source Matters board are ready to advise or assist any developer who would like this help. If you have any questions about licensing or want help, then you can contact OSM with the following email address license@opensourcematters.org or the JED editors
team@extensions.joomla.org

Some frequently asked questions

What if I have some GPL and some non-GPL extensions?

This policy refers only to those extensions listed in the JED. Your GPL extensions are permitted to be listed on the JED but your non-GPL extensions are not.

Where can I get information about how to license my product using the GNU GPL?

Every copy of Joomla includes a copy of the GNU GPL with instructions for licensing in the license.php file. Instructions are also available from the Free Software Foundation.

All you need to do is add two elements to each source file of your program: a copyright notice (such as “Copyright 1999 Terry Jones”), and a statement of copying permission, saying that the program is distributed under the terms of the GNU General Public License. (Free Software Foundation)


Can I use GPL v3 to license my extension?

Yes. In particular, you may need to use GPLv3 if you rely on certain third party libraries or APIs for your extension.

Can I use libraries in my GPL extension that are GPL compatible?

Yes.

What GPL version is Joomla! licensed under?

Joomla! is licensed under GPL version 2 or later.

Why are only GNU GPL licensed extensions being listed?

The simple answer is, making the JED a GPL only resource is the easiest and most practical solution. It frees the JED team from having to investigate or worry about licensing issues. It frees OSM from having to create and maintain a list of one or more acceptable licenses. When you break it down, other licenses were created because they opposed one or more parts of the GPL. The only license that truly embodies the spirit of the GPL is the GPL. Throughout the Open Source world, there is plenty of disagreement over what that spirit is and there is even more disagreement over what licenses are compatible and incompatible. In the end, our list of compatible licenses might be very different from yours. Our list of licenses that share the spirit of the GPL will most certainly be different than yours. So, we could waste months of time researching a list and debating which licenses should be included and excluded or we can make it simple and easy to understand for the community, the developers, and the JED team so that we can use those precious months to focus on the real point of this project: making great software.

Can I use a GPL compatible license?

The JED will only list extensions licensed using the GNU GPL.

What if I think my extension doesn't violate the Joomla! license?

This is a policy in favor of software freedom and the mission, vision and values of the Joomla! Project, not one about technical issues in licensing.

What does this mean for enforcement of the Joomla! license more generally?

Enforcement of the Joomla! license is a separate issue from the policies of the JED.
If you have relicensed in recent days, thank you for your cooperation.

תגובתי:

First of all, I am both a user and a developer of several open source projects (some of which are using GPL, although I generally prefer BSD now because it puts less constraints on the end user).

the way I see it, you are trying to FORCE me to change my license, and I find this unacceptable.

FireStats is not a Joomla plugin, it's a full fledged application that happen to support Joomla (and many other systems).

If I will dance to the tunes coming from WordPress, Jooma,Drupal or any other supported app, I will never get anywhere.

I am sorry, but I have no intention of changing my license.

feel free to remove FireStats from the Joomla extentions directory.

if I decide to re-license it under GPL I will list it again.

it is a pity because FireStats got great feedback from the Joomla community, but I am not going to step over my principles because of this.

the license under which I decide to release my software if my own decision, my mine alone.

Omry Yadan,

FireStats developer.

תפוח בגריז

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

אפל עושה הכל כדי שמשתמשי לינוקס לא יכולו להשתמש באייפון ובאייפוד טאץ' בלי לעשות שמיניות באוויר (עיין ערך : להתקין חלונות במכונה וירטואלית).
הפרוטוקול שמעביר את הנתונים לאייפון/איי-טאץ' מוצפן בSSL, וניחה זה (על זה עוד התגברו) – המכשיר מכיל אלגוריתם hash סודי שמונע מתוכנות שאינן iTunes (ימח שמה) להעלות קבצי מוסיקה.

אפל מנצלת את הכוח שלה בתור שומר הסף של האפליקציות שמורשות לעלות על האייפון/איי-טאץ כדי למנוע מכל מי שמאיים לכאורה על ההגמוניה שלה בצורה זו או אחרת.
דוגמאות אחרונות:

    • אפל מנעה מאמולטור קומודור 64 (ברשיון!) להכנס לחנות התוכנות בטענה שהוא מריץ קוד בר הרצה, בניגוד לתנאי השימוש. מעניין שסגה קיבלה פטור – כי משחקי האייפון שלה עובדים בצורה דומה.
      למה? אפל, בפארנויה האין סופית שלה, חוששת שמשתמשים יקנו את המשחקים שלהם ממקום אחר או חלילה ישיגו אותם בחינם.
    • במגוון דוגמאות, אפל חיסלה תוכנות שהתחרו בתוכנות שלה, למשל תוכנה שמסנכרנת פודקסטים ישירות על האייפון ולא עוברת דרך iTunes (ימח שמה).

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

    Google Wave

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

    וויב

    • אפשרות לפצל שיחה לכמה קווי שיחה בקלות (Threads)
    • צ'אט חי, כמו בימי הבבסים (רואים מה האדם השני מקליד בזמן שהוא מקליד).
    • אפשרות לחבר אדם נוסף לשיחה בדיעבד על ידי הוספה שלו למשתתפים, הוא יוכל לראות את השיחה מההתחלה, כולל באמצעות מצב ניגון שמנגן את השיחה בשבילו צעד אחר צעד כאילו הוא השתתף בה מההתחלה.
    • אפשרות להגביל גישה להודעות למשתתפים מסויימים (מסרים פרטיים)
    • תמיכה בגרור וזרוק כדי להצמיד תמונות (וקבצים באופן כללי) להודעות, נכון לכרגע זה דורש גוגל gears, אבל הכוונה היא לדחוף את היכולת הזו בהצעה לHTML 5.
    • אפשרות לשתול שיחה בקלות בתוך בלוג (Embed), מכיוון שהשיחה מאוכסנת בשרת מרכזי זה לא משנה אם מגיבים מהבלוג אם מתוך Wave, היא תשאר שיחה אחת.
    • כל שיחה יכול להיות בעצם מסמך משותף שכל המשתתפים תורמים לו, בדומה לוויקי, כולל פיצול ואיחוד של גרסאות (Branch and merge), כולל עריכה חיה (כמו הצ'אט החי) על ידי כמה משתתפים במקביל.

    הרחבות

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

    פרוטוקול

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

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

    מחכה בקוצר רוח שהדבר הזה יבשיל, יהיה טעים.

    שימוש חכם בזכרון כדי להאיץ גישה לנתונים

    קחו את המצב הבא:
    יש שתי טבלאות עם כחצי מילארד רשומות בכל אחת.
    באופן חד פעמי – אתם צריכים לעבד את טבלא א' בבלוקים של כמה אלפים בכל פעם.
    עבור כל בלוק, אתם צריכים לגשת לטבלא ב' ולהשלים משם נתונים.
    אתם צריכים לגשת רק לחלק מהעמודות בטבלא ב', אבל הביצועים חרבנה.
    שליפה של כמה אלפי רשומות מטבלא ב' במכה עובד בקצב של כמה מאות בשניה:
    [code lang="sql"]
    SELECT a,b,c FROM table WHERE id IN (….)
    [/code]

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

    הרעיון הבא שלי היה לשמור את הנתונים המעניינים על הדיסק בצורה בינרית, ממויינים לפי שדה הid, כאשר הפורמט הוא פשוט רשומה אחרי רשומה.
    ברגע שכל הנתונים בקובץ, אפשר לטעון אותו לזכרון פעם אחת, ולבצע עליו חיפוש בינארי זריז כדי למצוא כל רשומה.
    רעיון פשוט, אבל המימוש נתקל בכמה קשיים:
    נפח הנתונים המעניינים במקרה שלי הוא כ14.4 ג'יגה בייטים, כל רשומה שוקלת 24 בתים, ויש 600 מליון רשומות כאלו.
    אין הרבה מחשבים שמסוגלים להעלות כזו כמות של מידע לזכרון, בהתחלה חשבתי שנתונים ישקלו "רק" 12 ג'יגה, ולכן היה ישים לטעון את כולם לזכרון של שרת עם 16GB זכרון, אבל 14.4 ג'יגה זה כבר גבולי מדי.
    בעיה נוספת היא שג'אווה, השפה בה אני מממש את העניין – לא תומכת במערכים גדולים מכ2 מילארד איברים (גם לא בJVM של 64 ביט), ולכן מערך הבייטים הגדול ביותר שאני יכול ליצור לא מספיק גדול בשביל להחזיק את הקובץ בזכרון.

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

    בבדיקה ביצועים ראשונית יצרתי קובץ מ26 מיליון רשומות, וחיפשתי בתוכו 2 מיליון רשומות. הקצב היה קרוב למיליון רשומות בשניה, מה שאומר שהבעיה נפתרה.

    ניצחון.