ב-17 ביוני 1940 פלשו הסובייטים לאסטוניה וכבשו אותה תוך זמן קצר. ליידונר הודח מתפקידו באופן רשמי ב-22 ביוני. הוא ופטס הוגלו לרוסיה ומתו בגולאגים סובייטיים. הסובייטים הקימו צבא אסטוני חדש שנודע בשם "צבא העם האסטוני", ובפועל היה חלק מהצבא האדום. גוסטב יונסון מונה למפקד הצבא עד 3 בספטמבר אז אוחד הצבא האסטוני באופן רשמי לתוך הצבא האדום. ביוני 1941 סולקו כל הקצינים האסטונים מהצבא האדום, ויונסון עצמו הוצא להורג במוסקבה.
ב-18 בספטמבר 1944 נסוגו כוחות הוורמאכט מאסטוניה (לאחר שכבשו אותה במסגרת מבצע ברברוסה), ולזמן קצר נראה היה כי ישנו סיכוי לעצמאות אסטונית מחודשת. אוטו טיף כינס ממשלה בטאלין, ומינה את יאן מיידה למפקד הצבא האסטוני. תוך מספר שבועות כבשו הסובייטים את אסטוניה מחדש ופיזרו את הצבא האסטוני. אסטוניה נותרה חלק מברית המועצות עד 1991, וב-1993 הוקם הצבא האסטוני מחדש.
מרטין הרם
מרטין הרם (באסטונית: Martin Herem; נולד ב-17 בדצמבר 1973) הוא לוטננט גנרל אסטוני המשמש כמפקד (מקביל לרמטכ"ל) של כוחות ההגנה של אסטוניה.
ביוגרפיה.
הרם נולד בטאלין ב-17 בדצמבר 1973. ב-1992 הוא התגייס לצבא אסטוניה, והחל ללמוד במכללה האסטונית להגנה לאומית. הוא סיים את לימודיו ב-1996, ולאחר מכן שרת בגדודים שונים עד2002 אז נקרא לשמש כמדריך במכללת ההגנה. ב-2003 הוא מונה לראש מחלקת הטקטיקה במכללה. ב-2006 הוא נשלח להשתתף במלחמת עיראק. ב-2008 מונה למפקד פיקוד צפון-מזרח. ב-2012 מונה לסגן מפקד מכללת ההגנה. ב-2013 מונה למפקד המכללה. ב-2016 מונה לראש המטה הכללי של הצבא האסטוני. ב-5 בדצמבר 2018 הוא מונה למפקד הצבא האסטוני (מקביל לרמטכ"ל).
פורמט מחרוזת printf
פורמט מחרוזת printf היא פרמטר בקרה המשמש מחלקה של פונקציות בספריות הקלט/פלט של C ושפות תכנות רבות אחרות. המחרוזת כתובה בשפת תבנית פשוטה: תווים בדרך כלל מועתקים כמות שהם לתוך הפלט של הפונקציה, אך מפרטי פורמט, שמתחילים בתו %, מציינים את המיקום והשיטה לתרגום נתון (כגון מספר) לתווים.
"printf" הוא השם של אחת מפונקציות הפלט העיקריות של C, והוא קיצור של "print formatted". מחרוזות בפורמט printf משלימות מחרוזות בפורמט scanf, המספקות קלט מעוצב. בשני המקרים הפונקציות מספקות פונקציונליות פשוטה ופורמט קבוע בהשוואה למעבדי תבניות מתוחכמים וגמישים יותר או מנתחים, אך מספיקים למטרות רבות.
שפות רבות מלבד C מעתיקות את תחביר המחרוזת בפורמט printf, בקירוב או בדיוק, בפונקציות קלט/פלט משלהן.
חוסר התאמה בין מפרטי הפורמט וסוג הנתונים עלול לגרום לקריסות ולפגיעויות אחרות. מחרוזת הפורמט עצמה היא לעיתים קרובות מאוד מחרוזת מילולית, המאפשרת ניתוח סטטי של קריאת הפונקציה. עם זאת, זה יכול להיות גם ערך של משתנה, מה שמאפשר פורמט דינמי אך גם פגיעות אבטחה המכונה ניצול מחרוזת פורמט בלתי מבוקר .
היסטוריה.
שפות תכנות מוקדמות כמו Fortran השתמשו בהצהרות מיוחדות עם תחביר שונה לחלוטין מחישובים אחרים כדי לבנות תיאורי פורמט. בדוגמה זו, הפורמט מצוין בשורה 601, והפקודה WRITE מתייחסת אליו לפי מספר שורה:
WRITE OUTPUT TAPE 6, 601, IA, IB, IC, AREA
601 FORMAT (4H A= ,I5,5H B= ,I5,5H C= ,I5,
&amp; 8H AREA= ,F10.2, 13H SQUARE UNITS)
ל-ALGOL 68 היה ממשק API יותר דמוי פונקציה, אבל עדיין השתמש בתחביר מיוחד (מפרידי מקיפים תחביר פורמט מיוחד):
printf(($"Color "g", number1 "6d,", number2 "4zd,", hex "16r2d,", float "-d.2d,", unsigned value"-3d"."l$,
"red", 123456, 89, BIN 255, 3.14, 250));
אבל השימוש בקריאות הפונקציות ובסוגי הנתונים הרגילים מפשט את השפה והקומפיילר, ומאפשר לכתוב את המימוש של הקלט/פלט באותה שפה. יתרונות אלו עולים על החסרונות (כגון חוסר מוחלט של בטיחות טיפוס במקרים רבים) וברוב השפות החדשות יותר קלט/פלט אינו חלק מהתחביר.
מקורו של של C בפונקציית של BCPL (1966). בהשוואה ל- ו- , הוא רצף מילוט בשפת BCPL המייצג תו שורה חדשה (שעבורו C משתמש ברצף המילוט ) והסדר של שדה הרוחב ושדה הטיפוס הפוכים ב-writef:
WRITEF("%I2-QUEENS PROBLEM HAS %I5 SOLUTIONS*N", NUMQUEENS, COUNT)
ככל הנראה ההעתקה הראשונה של התחביר מחוץ לשפת C הייתה פקודת ה-Unix shell, שהופיעה לראשונה בגרסה 4, כחלק מההיסב ל-C.
מפרט פורמט שומרי המקום.
יצירת הפורמט מתבצעת באמצעות שומרי מקום בתוך מחרוזת הפורמט. לדוגמה, אם תוכנית אמורה להדפיס את גילו של אדם, היא יכולה להציג את הפלט על ידי הקדמת "הגיל שלך הוא ", ושימוש בתו המציין מספר עשרוני שלם - כדי לציין שאנו רוצים שהמספר השלם של הגיל יוצג מיד לאחר הודעה זו, אנו עשויים להשתמש במחרוזת הפורמט:
printf("Your age is %d", age);
תחביר.
התחביר עבור שומר מקום של פורמט הוא
שדה פרמטר.
זוהי הרחבה של POSIX ולא כלולה בתקן C99 של שפת C. השימוש בשדה הוא על ידי הוספת פרמטר מספרי ולאחריו התו $ בין התו המיוחד % ובין התו שמסמן את הטיפוס, למשל %2$d מסמן שימוש בערך השני מבין הערכים שלאחר מחרוזת הבקרה. ניתן להשמיט את השדה, בתנאי שאף אחד משומרי המקום האחרים לא עושה בו שימוש.
תכונה זו בשימוש בעיקר בלוקליזציה, שבה סדר הופעתם של פרמטרים משתנה בהתאם לקונבנציה התלויה בשפה.
במערכת ההפעלה Microsoft Windows, התמיכה בתכונה זו ממומשת בפונקציה נפרדת, printf_p.
שדה דגלים.
שדה הדגלים יכול להיות אפס או יותר (בכל סדר) מהתווים הבאים:
שדה רוחב.
שדה הרוחב מציין מספר מינימלי של תווים לפלט, והוא משמש בדרך כלל לרפד שדות ברוחב קבוע בפלט עבור טבלאות, שם העמודות יהיו צרות יותר אילולי הריפוד. השדה אינו גורם לקיצוץ של שדות גדולים מרוחב השדה שצוין.
ניתן להשמיט את שדה הרוחב, או לספק בו ערך מספרי שלם, או ערך דינמי אשר מועבר כארגומנט נוסף, כאשר מסומן באמצעות כוכבית. לדוגמה, יביא להדפסה של codice_1, ברוחב כולל של 5 תווים.
אף על פי שאינו חלק משדה הרוחב, אפס מוביל מתפרש כדגל ריפוד האפס שהוזכר לעיל, וערך שלילי מטופל כערך החיובי יחד עם היישור לשמאל שהוזכר גם כן למעלה.
שדה דיוק.
שדה הדיוק מציין בדרך כלל מגבלת מקסימום על הפלט, בהתאם לטיפוס המסוים. עבור טיפוסים מסוג נקודה צפה, הוא מציין את מספר הספרות מימין לנקודה העשרונית אליו יש לעגל. עבור טיפוס המחרוזת, הוא מגביל את מספר התווים שיש להדפיס, ולאחר מכן המחרוזת נחתכת.
ניתן להשמיט את שדה הדיוק, או להזין ערך מספרי שלם, או ערך דינמי אשר מועבר כארגומנט נוסף כאשר מסומן באמצעות כוכבית. לדוגמה, יודפס כ- .
שדה אורך.
ניתן להשמיט את שדה האורך או להזין אחד מהערכים הבאים:
בנוסף, התקיימו מספר אפשרויות אורך ספציפיות לפלטפורמה לפני השימוש הנרחב בתוספי ISO C99:
בתקן ISO C99 נכלל קובץ הדר inttypes.h שכולל מספר מאקרואים לשימוש ב-printf באופן שאינו תלוי במערכת ההפעלה.
שדה טיפוס.
שדה הטיפוס יכול להיות אחד מהבאים:
שומרי מקום בפורמט מותאם אישית.
יש כמה מימושים של פונקציות דמויות המאפשרות הרחבות למיני-שפה המבוססת על תו מילוט, ובכך מאפשרות למתכנת פונקציית פירמוט ספציפית עבור טיפוסים שאינם מובנים בשפה. אחד המוכרים ביותר הוא של glibc (שהוצא משימוש). עם זאת, הוא משמש לעיתים רחוקות בשל העובדה שהוא מתנגש עם בדיקה סטטית של מחרוזות פורמט. מימוש נוסף הוא Vstr, המאפשר הוספת שמות פורמטים מרובי תווים.
יישומים מסוימים (כמו Apache HTTP Server) כוללים פונקציה משלהם דמוית , ומטמיעים בתוכו הרחבות. עם זאת, לכל אלה נוטות להיות אותן בעיות שיש ל- .
פונקציית Linux kernel, codice_2 תומכת במספר דרכים להצגת מבני ליבה באמצעות המפרט הגנרי , על ידי הוספת תווי פורמט נוספים. לדוגמה, מדפיס כתובת IPv4 בצורה מנוקדת-עשרונית. זה מאפשר בדיקה סטטית של מחרוזת פורמט (של החלק ) על חשבון תאימות מלאה עם printf רגיל.
רוב השפות שיש להן פונקציה דמוית עוקפות את היעדר תכונה זו על ידי שימוש בפורמט והמרת האובייקט לייצוג מחרוזת.
פגיעויות.
מפרטי המרה לא חוקיים.
אם יש מעט מדי ארגומנטים שסופקו לספק ערכים עבור כל מפרטי ההמרה במחרוזת התבנית, או אם הארגומנטים אינם מהסוגים הנכונים, התוצאות אינן מוגדרות, ועלולות להקריס את התוכנית. המימושים אינם עקביים לגבי האם שגיאות תחביר במחרוזת צורכות ארגומנט ואיזה סוג ארגומנט הם צורכים. ארגומנטים עודפים הם חסרי השפעה. במספר מקרים, ההתנהגות הלא מוגדרת הובילה לפרצות אבטחה של "מתקפת מחרוזת פורמט". ברוב מוסכמות הקריאה של C או C++ ניתן להעביר ארגומנטים על המחסנית, מה שאומר שבמקרה של מעט מדי ארגומנטים printf יקרא מעבר לסוף מסגרת המחסנית הנוכחית, ובכך יאפשר לתוקף לקרוא את המחסנית.
כמה מהדרים, כמו GNU Compiler Collection, יבדקו באופן סטטי את מחרוזות הפורמט של פונקציות דמויות printf ויזהירו על בעיות (בעת שימוש בדגלים או ). GCC גם יזהיר על פונקציות בסגנון printf המוגדרות על ידי המשתמש אם ה"פורמט" הלא סטנדרטי מוחל על הפונקציה.
רוחב שדה לעומת תוחמים מפורשים בפלט טבלאי.
שימוש רק ברוחב שדות כדי לספק טבלאות, כמו בפורמט כמו עבור שלושה מספרים שלמים בשלוש עמודות של 8 תווים, לא יבטיח שהפרדת השדות תישמר אם יופיעו מספרים גדולים בנתונים:
1234567 1234567 1234567
123 123 123
123 12345678123