• בלוג
  • ניוזלטר ופוסט באותו היום! בואו נראה מתי עוד זה קורה.

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

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

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

1. כלי עבודה

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

$ ncal
    November 2016
Mo     7 14 21 28
Tu  1  8 15 22 29
We  2  9 16 23 30
Th  3 10 17 24
Fr  4 11 18 25
Sa  5 12 19 26
Su  6 13 20 27

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

$ seq 12 | xargs -IN ncal N 2016
    January 2016
Mo     4 11 18 25
Tu     5 12 19 26
We     6 13 20 27
Th     7 14 21 28
Fr  1  8 15 22 29
Sa  2  9 16 23 30
Su  3 10 17 24 31
    February 2016
Mo  1  8 15 22 29
Tu  2  9 16 23
We  3 10 17 24
Th  4 11 18 25
Fr  5 12 19 26
Sa  6 13 20 27
Su  7 14 21 28
...

2. הנה בא awk

לקחת מהרשימה הזו רק את השורות שמייצגות שני או חמישי שהוא גם ראשון לחודש זה לא בעיה, למשל עם ה grep הבא:

$ seq 12 | xargs -IN ncal N 2016 | grep -E '(Mo|Th).*\<1\>'
Mo  1  8 15 22 29
Mo  1  8 15 22 29
Th  1  8 15 22 29
Th  1  8 15 22 29

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

$ seq 12 | xargs -IN ncal N 2016 |awk '/2016/ { month = $1 } /^(Mo|Th).*\<1\>/ { printf("%s [%s]\n", month, $1) }'
February [Mo]
August [Mo]
September [Th]
December [Th]

בשביל הסדר הטוב אפשר לשמור את השורה כפונקציה ב bash או כ alias ב csh. ב bash הקוד הבא יוצר פונקציה, והוספה שלו ל bashrc תאפשר לכם להשתמש בפונקציה זו גם בעתיד:

 function bnparty() { seq 12 | xargs -IN ncal N $1 |awk '/'$1'/ { month = $1 } /^(Mo|Th).*\<1\>/ { printf("%s [%s]\n", month, $1) }'; }

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

$ bnparty 2017
May [Mo]
June [Th]

$ bnparty 2018
January [Mo]
February [Th]
March [Th]
October [Mo]
November [Th]

3. קבוצת ביקורת ברובי

עם כל האהבה ל awk, נראה לי שלא תזיק תוכנית ביקורת לראות שהצלחנו לבחור את התאריכים הנכונים, ואולי זו גם הזדמנות טובה לראות קצת קוד רובי:

require 'date'

year = (ARGV.shift).to_i || 2016

1.upto(12) do |month|
  d = Date.new(year, month, 1)
  if d.monday? || d.thursday?
    puts d.strftime("%b [%a]")
  end
end

קצת יותר שורות אבל גם הרבה יותר קריא. בכל מקרה התוצאה זהה אז כנראה שאנחנו בכיוון. התנגשות הבאה ב-1 במאי אז שווה לחכות.