השדרוגים הם מהשטן

זוכרים שהזמנתי כונן קשיח נוסף וכונן DVD חלופי במקום זה ששבק?
שניהם היו כמובן בממשק SATA, והתסבר שהמחשב שאליו הם מיועדים סבל ממחסור חמור בערוצי SATA פנויים, כל שני הערוצים שעל לוח האם שלו היו תפוסים.
בינתיים התקנתי את הדיסק במחשב השני, והזמנתי כרטיס בקר SATA שמוסיף עוד ארבעה ערוצי SATA. אתמול הוא הגיע לשמחתי, וכשחזרתי מהעבודה התיישבתי להתקין את הבקר, את הכונן הקשיח ואת הכונן DVD.
בהתחלה פשוט התקנתי את הכל, הדלקתי את המחשב וקיוויתי לטוב – תקוות שהתבדו מהר מאוד: המחשב נתקע בBOOT, לפני שהתחיל להעלות את GRUB (טוען הBOOT של לינוקס). התחלתי לשחק קצת בחיבורים וגיליתי שהמחשב לא אוהב שאני מחבר את הDVD לבקר הSATA החדש, ולכן חיברתי אותו ישירות ללוח האם ואת אחד משני הכוננים הקשיחים הישנים חיברתי לבקר הSATA. אחרי שהמחשב הצליח להכנס לGRUB כאשר כל ארבעת הכוננים מחוברים (שני הרדיסקים ישנים, אחד חדש וכונן DVD חדש), הקרנל התחיל לעלות ונתקע כמובן כשחיפש את מערכת הקבצים במחיצת השורש (/)
חשבתי לעצמי, בטח הוא לא אוהב את השינויים, וניתקתי הכל כדי לוודא שהוא עובד במצב שבו הוא היה קודם.
במפתיע, הוא עדיין סרב לעלות כשלא מצא את מערכת הקבצים של /.
עכשיו כבר התחלתי לנסות להעריך כמה זמן יקח לי להתקין את הכל מחדש ולהביא את העסק למצב עובד (זה שרת הדואר שלי, ולא רציתי להשאיר אותו לא עובד), לא אהבתי את ההערכה.
החלטתי לנסות לעלות מדיסק של Knoppix 4.0 ישן שהיה לי, אבל הוא טען שהביוס שלי דפוק במיוחד וסירב לעלות. חשבתי לעצמי שאולי הדיסק KNOPPIX דפוק במיוחד וצרבתי את Knoppix 5.1, שהסכים עם הדיסק הקודם בדיאגנוזה וסרב גם הוא לעלות.
שלפתי מהמחסן את אחד מכונני הDVD הישנים שלי, שהתעטר בכיתוב "אולי דפוק, 22/2/2008", ניסיתי אותו ומשם דווקא Knoppix הסכים לעלות (לא שכחתי לסמן את הכונן בכיתוב "מספיק טוב בשביל קנופיקס, 14/4/2008") – בשיטוט במחשב מתוך הקנופיקס שמתי לב שהכונן החדש התיישב לו על SDA ודחף את הכונן הראשון שהיה בSDA אל SDC. זה גרם לי לחשוב שאולי זו הבעיה.
ביצעתי BOOT רגיל אל GRUB, ופתאום שמתי לב שהשורה של הקרנל נראית ככה:
[code]
kernel /boot/vmlinuz-2.6.24-1-686 root=/dev/hde1 ro
[/code]
שורה שאופיינית לטעינת הקרנל מדיסק ATA רגיל ולא מSATA (שמופיע תחת sdx ולא תחת hdx).
התחלתי לנחש ולנסות כל מני אפשרויות ובסוף הצלחתי לבצע BOOT כאשר השורש בsdb2, סוף סוף קצת התקדמות!
חיברתי את כל הכוננים, ניחשתי וניחשתי שוב עד שהצלחתי עם sdc2, ונכנסתי למערכת.
לא ממה התחשק לי לשנות את הfstab ואת קובץ התפריט של GRUB לתצורה החדשה, כי ידעתי שברגע שאני אשנה משהו בחומרה הכל ישבר שוב.
נכנסתי ל#debian@irc.freenode.net, ושאלתי איך מונעים מהקרנל לשנות את שמות הכוננים כל פעם שמשהו משתנה.
ענו לי שאפשר, אבל זה קשה, ועדיף בכלל לעגן מחיצות לפי הUUID, ולא לפי שם הכונן.
UUID למחיצה? לא ידעתי שיש!
מסתבר שזה פשוט במיוחד, החל מגרסא מסויימת של הקרנל, יש בdev ספריות חדשות:
[code]
/dev/disk/by-id/
/dev/disk/by-label/
/dev/disk/by-path/
/dev/disk/by-uuid/
[/code]

הספריה שמעניינת אותנו במקרה הזה היא /dev/disk/by-uuid/ שמכילה קבצים שנראים כך:
[code]
0427f3ec-17e1-4cd1-b195-7f5bdf861a28 -> ../../sdc3
3f7f2c77-88af-4e9a-a139-ba95900e0354 -> ../../sdb1
[/code]

אלו לינקים סימבוליים שנוצרים אוטומטית, ומאפשרים גישה אל המחיצה בצורה שאינה תלויה בשם של הכונן עליו היא יושבת.
המזהה היחודי (UUID) של המחיצה לא משתנה עד שלא יוצרים מחדש את המחיצה (או אולי מפרמטים אותה, אני לא בטוח).
כמובן שאפשר להשתמש בו גם מתוך קובץ התפריט של grub:
[code]
kernel /boot/vmlinuz-2.6.24-1-686 root=/dev/disk/by-uuid/8397dc08-be26-491d-9a06-c3fc93303d82 ro
[/code]

אחרי כל זה, הכל עובד שוב, הנה נשרף לו ערב שיכול היה לשמש אותי לדברים מועילים יותר, אבל למדתי כמה דברים.

אגב, לדעתי מה שגרם לכל הסיפור הזה היה קודם כל שדרוג שביצעתי לקרנל דרך apt-get לפני מספר שבועות, שקילקל את menu.lst של GRUB.
בגלל זה גם כשניתקתי את הכל וחזרתי למצב הראשוני עדיין לא הצלחתי לבצע BOOT.
המסקנה שלי היא שצריך לבדוק טוב טוב את menu.lst אחרי שדרוג של הקרנל (אם אני אגיד את זה בקול רם אולי אני אזכור את זה בפעם הבאה!).
בנוסף, כדאי להשתמש בUUID ולא בשם הדיסק כשמעגנים מחיצות.

לבסוף, אני גאה לציין שהמחשב הסלוני שלי, שמשמש אותי כשרת דואר וכמכונת ווידאו סלונית שודרג בהצלחה ועכשיו יש לו נפח איחסון של 200+200+500=900GB.
האח, הידד.

חבילת דביאן שימושית : apt-cacher

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

להתקנה, כמובן : apt-get install apt-cacher

בסיסי נתונים

האם הבניינים האלו מזכירים לכם משהו?

img_0745.jpg

יכול להיות שזה בסיסי נתונים?
database.gif

לא פלא, אלו הבניינים של אורקל.
img_0742.jpg

עוד משהו די משעשע זה השלט הבא:
img_0746.jpg

השלמה אוטומטית משופרת בbash

איך מפעילים השלמה אוטומטית משופרת בbash?
ההגדרות של ההשלמה האוטומטית נמצאים בדביאן (ואולי בעוד מערכות) בקובץ /etc/bash_completion, כדי להפעיל אותן כתבו:

[code]
source /etc/bash_completion
[/code]

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

[code]
echo "source /etc/bash_completion" >> ~/.bashrc
[/code]

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

[code]
ls –[TAB]
[/code]

ותקבלו את רשימת הפרמטרים של ls.

Sansa e280 וRockbox

כמו שאמרתי, קניתי נגן MP3 נייד, Sansa e280 עם 8 ג'יגה זכרון פלאש ותמיכה ברדיו.
התקנתי עליו את הנגן פתוח הקוד, Rockbox, ואני מרוצה.
רוקבוקס תומך בכל מה שאני צריך מבחינת שמישות, וגם בכמה דברים שאני לא ממש צריך, כמו משחק דום :).
יש לו סייר קבצים שמאפשר לעיין בקבצים בקלות, למחוק, להזיז וליצר רשימות ניגון.
בנוסף, הוא מגיע עם די הרבה פלאינים, תוכנות פשוטות (מטרונום למשל, שמאפשר לשמור על קצב הליכה קבוע) וערכות נושא.
במבט ראשון רוקבוקס נראה די מכוער, במיוחד אחרי שרואים את התוכנה המקורית שמגיעה עם הנגן, אבל אחרי שמשחקים קצת עם ערכות הנושא הוא נראה הרבה יותר טוב.
מה שבטוח זה שהוא נותן הרבה יותר פונקציונליות, ומאפשר – למי שבאמת רוצה – לשנות ולהרחיב את הנגן שלו. ההגבלה היחידה היא הדמיון.

מומלץ לגבות את הסנסה לפני שמתקינים עליו את רוקבוקס, אתם לא רוצים להתקע עם משקולת נייר יקרה ולא כבדה מספיק.
לפני שמחברים את הסנסה למחשב צריך לשנות את זיהוי הUSB שלו לMass storage class, או MSC. זה יאפשר למחשב לזהות אותו ככונן כמו כל כונן קשיח.
ללינוקסאים, כדי לגבת את כל הSansa, בהנחה שהוא הופיע בשם /dev/sdb
השתמשו בפקודה:
[code]
dd if=/dev/sdb of=~/sansa.full.img
gzip ~/sansa.full.img
[/code]
שתיצור עותק בינארי של כל הכונן (זה 8 ג'יגה, אז זה יקח זמן).
אפשר לגבות רק את המחיצה השניה (sdb2), שמכילה את התוכנה של הנגן, אבל אני חושב שליתר ביטחון עדיף לגבות את הכל.
בהנחה שהסנסה שלכם ריק, הgzip יתפוס כ100 מגה-בייט.

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

Sansa E280

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

הפילוסופיה של יוניקס (ושל לינוקס) היא שכל כלי יעשה פעולה אחת, ויעשה אותה כמו שצריך – והמשתמש יחבר את הכלים כדי להשיג את המטרה שלו.
הפילוסופיה הזו שונה מזו של מערכות הפעלה יותר "ידידותיות", שנותנות למשתמש כלים שעושים את מה שהמתכנתים חשבו שהמשתמש ירצה לעשות – לא פחות ולא יותר.
מצד אחד אותם משתמשים ישיגו את המטרה שלהם – אם המתכנתים חשבו שהיא מטרה ראויה – יותר בקלות, מצד שני, אם המתכנתים לא חשבו שהמטרה הזו מספיק חשובה או אם הם בכלל לא חשבו על הצורך המסויים המשתמש פשוט לא יוכל להשיג את המטרה בעזרת אותם כלים ידידותיים.
אז אחרי ההקדמה הזו, הנה דוגמא עם בעיה אמיתית:
ל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]

טיפ לינוקס: הפעלה של תוכנה גרפית דרך SSH

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

omry@home:~$ xeyes
Error: Can't open display:

הפתרון הוא פשוט, קובעים את משתנה הסביבה DISPLAY לפני הקריאה:

omry@home:~$ export DISPLAY=:0.0
omry@home:~$ xeyes

יש כמובן את המקרה האחר, שבו אתם רוצים שהחלון של התוכנה יפתח אצלכם.
זה מה שאני זוכר לגבי זה, אבל אולי משהו פרח מזכרוני:
המקרה הזו דורש התחברות באמצעות ssh -X, והפעלת שרת X מקומי (יש גם לחלונות, את זה של cygwin או של Hummingbird)
בנוסף, צריך להגדיר לשרת הSSH שאליו אתם מתחברים לאפשר קידום פרוטוקול X11 באמצעות השורה הבאה בקובץ /etc/ssh/sshd_config:

X11Forwarding yes

ואז להפעיל את התוכנה כרגיל (בלי לקבוע את DISPLAY קודם).

איחוד ופיצול קבצי MP3

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

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

עכשיו התחלתי את הספר הרביעי, Wizard and glass, והפעם החלטתי לאחד את הקבצים לקובץ אחד ענק לפני החילוק, מה שאיפשר לי לחלק לחתיכות של 35 דקות שמתאימות די טוב לזמן הנסיעה.
כדי לעשות את זה, אפשר להשתמש בmp3wrap ובmp3splt שניתנות להתקנה בקלות בדביאן (חפשו בחבילות).

כדי לאחד את הקבצים לקובץ אחד:
find *.mp3 -print0 | xargs -0 mp3wrap outfile.mp3

וכדי לפצל את הקובץ לחתיכות של 35 דקות (הפיצול מתבצע בנקודות שקט, אז התפר ממש בלתי מורגש) :
mp3splt -a -t 35.00 outfile.mp3

ובא שלום.

חבילת דביאן שימושית : mmv

דרך Debian package of the day:
לפעמים אנחנו רוצים לשנות את השמות של סדרת קבצים במכה, תוך שמירה על חוקיות מסויימת.
למשל, נניח שיש לכם ספריה עם הקבצים:

foo1.png
foo2.png
bar3.png

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

mmv "foo*.png" "bar#1.png"

ישנה את הקבצים ככה שהשמות שלהם יהיו:
bar1.png
bar2.png
bar3.png

mmv נמנע מלגרום נזק (מחיקה לא רצויה שנובעת מכך שכמה קבצי מקור ישונו לאותו שם).

כדאי לקרוא את המאמר המקורי כדי לקבל עוד כמה דוגמאות שימושיות.