‏הצגת רשומות עם תוויות C#. הצג את כל הרשומות
‏הצגת רשומות עם תוויות C#. הצג את כל הרשומות

יום חמישי, אוגוסט 20, 2015

בדיקות דרך קומפילציה

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

היום הרבה מידידי משתמשים בכלים מצויינים כמו ג'נקינס ו TFS (יש הרבה אחרים אבל הרעיון דומה), מאוד בגדול מדובר על מערכות שדוגמת גרסה מסויימת מריצה מספר בדיקות ונותנת את תוצאת הבדיקות (אצלי המצב טיפה שונה כי יש פתרון in-house) ומדווחת למתכנתים .

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


#include <iostream>
#include <gtest/gtest.h>

struct foo
{
  int random(){return 4;};//chosen by fair dice roll.
                          //guarnteed to be random :P
                          //by xkcd 221

};



TEST(foo, random) {
  foo f;
  EXPECT_EQ(0, f.random());
}



int main (int argc, char **argv)

{
  ::testing::InitGoogleTest(&argc, argv);
  return RUN_ALL_TESTS();
}

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

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

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

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

דוגמה קלאסית למטה דטה של מבנים (שתכשיל קומפילציה ) :



#include <iostream>
#include <cstddef>
#include <type_traits>

struct mytype_t
{
   //these are just example for some fields 
   int field1;
   int field2;

//   int non_declared_field_in_cmo_field_table_name;//this field had not been declared in cmo_field_table_name

   char y[3];
};

struct metadata_t
{
   size_t size;       
   size_t offset;     
   size_t allignment; 
   const char *  name;

} ;

//we have macro that fill metadata_t
//

static constexpr const struct metadata_t cmo_field_table_name[] = 
{
  {sizeof(mytype_t::field1),offsetof(mytype_t,field1) , std::alignment_of < decltype (mytype_t::field1 )> :: value,"1"},
  {sizeof(mytype_t::field2),offsetof(mytype_t,field2) , std::alignment_of < decltype (mytype_t::field2 )> :: value,"bla"},
  {sizeof(mytype_t::y),offsetof(mytype_t,y), std::alignment_of <decltype( mytype_t::y) > :: value,"2"},
};



//We declare a type that will fail compilation in case
template <bool>

struct check_struct_for_missing_field
{

};

template <>

struct check_struct_for_missing_field<true>
{
 //I named this field as field and not anything else so the compiler error will be more understandble 
 enum {field = 0};
};


//the magic start here 
//a recursive defintion that check on compile time if all the previous fields had been declared correctly
//in case of non declared fields this will fail compilation and will give us an error that will prevent a person commiting errosly like this mornign
//
//compile_type_check.cc: In instantiation of ‘struct check_if_all_fields_for_struct_correctly_declared_argument_is_field_number<((const metadata_t*)(& cmo_field_table_name)), 2>’:
//compile_type_check.cc:74:178:   required from here
//compile_type_check.cc:62:9: error: ‘field’ is not a member of ‘check_struct_for_missing_field<false>’
//    enum {check =  check_struct_for_missing_field < check_if_all_fields_for_struct_correctly_declared_argument_is_field_number < ptr,index_in_ptr - 1> :: value == ptr[index_in_ptr].offset  > ::field};
//             ^
//             compile_type_check.cc:74:1: error: static assertion failed: missing fields in tab
//              static_assert(check_if_all_fields_for_struct_correctly_declared_argument_is_field_number <cmo_field_table_name, sizeof(cmo_field_table_name)/sizeof(cmo_field_table_name[0]) -1 >::value == sizeof(mytype_t) , "missing fields in tab");
//
//
template < const struct metadata_t * ptr, int index_in_ptr>
struct check_if_all_fields_for_struct_correctly_declared_argument_is_field_number
{
  //incorrect declartion (type mismatchs) are found here
  //a correct offset of field N is  (alligment + size + offset ) for field N - 1
  enum {value =
        (
          ( ptr[index_in_ptr].allignment != ptr[index_in_ptr].size)?

            ptr[index_in_ptr].size + ptr[index_in_ptr].allignment
            :
            ptr[index_in_ptr].size)
            //this will iterate for the previous fields until the first declared in ptr
          + check_if_all_fields_for_struct_correctly_declared_argument_is_field_number<ptr,index_in_ptr-1>::value};
   //in case we have a missing field the next will fail compilation saying : 
   //
   enum {check =  check_struct_for_missing_field < check_if_all_fields_for_struct_correctly_declared_argument_is_field_number < ptr,index_in_ptr - 1> :: value == ptr[index_in_ptr].offset  > ::field};



};

//this is the final step of fields (the zero in the index

template <const struct metadata_t * ptr>

struct check_if_all_fields_for_struct_correctly_declared_argument_is_field_number <ptr,0>
{
 public:
   enum {value = //cmo_field_table_name[0].offset + 
        ( ptr[0].allignment != ptr[0].size)? ptr[0].size +   ptr[0].allignment :ptr[0].size
       };
};


static_assert(check_if_all_fields_for_struct_correctly_declared_argument_is_field_number <cmo_field_table_name, sizeof(cmo_field_table_name)/sizeof(cmo_field_table_name[0]) -1 >::value == sizeof(mytype_t) , "missing fields in tab");



int main(int argc, char *argv[])
{
  for (auto & r: cmo_field_table_name)
  {

    std::cout << "name:" << r.name<< " offset:" << r.offset << " allignment: " << r.allignment << " size:" << r.size << "total: " << r.size + r.allignment << std::endl;

  };

  return 0;

};

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

JAVA: כן אני זוכר את הנושא של המרה לobject ובעיית הstatic הנקודה היא שימוש בטיפוסי הנתונים כמשתנים.

C: יחי המקרו ! יאפ בנייה על בסיס מקרו.

FPC: אם משהו עדיין משתמש בזה - "

FPC 2.4.0 is neither complete nor practically usable yet. Until that is so, templates can be used." אבל אני די בטוח שיש פתרון אחר.

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

יום שישי, אפריל 16, 2010

לבחור מערכת הפעלה

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

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

האם מערכת שתרוץ על דביאן / גנטו בתחום התקשורת תהיה עדיפה על ריצה של מערכת שמריצה windows 7 ?למרות שהתשובה הראשונה שלי (מה לעשות אני איש דביאן) תהיה כן, אני נאלץ להגיד שבלי לדעת מה הן שאר הדרישות קשה לענות.
אם מדובר על מערכת שתעבוד כשרת בלבד שתספק תשתית web אז כן אבל יהיה שימוש בטכנולוגיות הטבעיות של המערכת: אם צריכים webservice או שצריכים יכולת עבור xmlrpc , אבל בכל מראה לא יהיה ניסיון לכתוב בC#.
אבל אם יש צורך לפתח בC# אז עדיף שלא, מצד שני לבחור שפה כי רק אותה המתכנתים מכירים זה בעייה של העסק.

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

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


יום שישי, אפריל 02, 2010

שיטת האפסנאי לכתיבת קוד

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

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

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

במהלך העבודה אתם רואים את האפסנאי כותב כל פעולה ביומן , הסיבה פשוטה אם הוא לא יתעד את פעולותו אנו מגיעים למצב שמחסן כזה או אחר ריק ואז אתה מגיע לקבל ציוד ומגלה שלמרות שאתה מצפה להגיע למחסן שמכיל את כל הציוד שאתה צריך המחסן ריק. טוב סליחה יש בו ארגז עץ גדול שמכיל דברים שאתה לא צריך. גם אנו ננסה את לשמור על הטכניקה הזאת - כמהנדסים אנו לומדים תמיד להסתקל על המצב הגרוע ביותר קודם כל, ורק אחר כך לבדוק מצב ביינים והמצב הטוב ביותר. על כן אנו חייבים לדאוג לתיעוד (כנראה שהתרגלתי יותר מדי לטופסולוגיה) כל פעולה מתעודת (וזה מקום לפוסט אחר על טכניקות תיעוד). כל עוד העבודה מתבצעת לא בתוך תוכנה סגורה אין לנו בעייה לדוגמא קריאות לsyslog על שגיאות או אזהרות וכן הלאה , הבעיה עולה כאשר מדובר במערכות סגורות לדוגמה כאשר אנו מנסים להגן על הקוד שלנו ומשתמשים בpacker כלשהוא , ב VM או רצים בתוך בסיס נתונים (ויאמר לזכותם של אורקל שבסיס הנתונים שלהם מתנהג כמו מערכת הפעלה מלאה) הבעיה שאנו לא יכולים לדאוג שהתיעוד יתבצע באמצעות syslog (וכך אנו מורידים את הIO ליחס יחסית נמוך) אנו נאלץ להוסיף עוד הרבה פעולות לבסיס הנתונים ואני נגרום לו לעבוד קשה הרבה יותר. מכיוון שניסיוני בסיסי נתונים לא טבלאים נמוך איני יכול להביע דעה על הפתרונות אולם עד כמה שאני יודע אין פתרון גנרי להוצאת התיעוד מחוץ לבסיס הנתונים (אם יש פתרון ספציפי לMicrosoft sql server 2XXX זה לא אומר שזה גנרי).

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

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

יש עוד דברים רבים אבל על אלו ה10 האגורות שלי לנושא (ביטלו כבר את ה5 אז אי אפשר לההשתמש בזה יותר).

יום שבת, ינואר 16, 2010

ולפעמים הניסיון בקוד פתוח הוא מגרעה

מי שמכיר אותי יודע שיש לי חסרון עיקרי - אני שונא להמציא את הגלגל מחדש. במספר שנות הפיתוח והשימוש שלי בלינוקס למדתי להשתמש בהמון כלים (מIT ועד פיתוח) ורובן עם לא כולם מגיעים עם רישיון GPL או MIT/X11.
אמנם כשעבדתי כמכתנת להשכרה או בחברות שבחרו להשתמש בכלים וסביבות חופשיות הדבר היה יתרון - אם יש כבר פתרון לבצע סינכרון קבצים מוצפן (פיתוח של שחר שמש נראה לי) או שיש כבר פתרון להצפנת הRTP וביצוע סטטיסטיקה עליו אז למה לממש מחדש?! כך עברו להם מספר שנים על מי מנוחות וחיים טובים. בנוסף צברתי ניסיון בתחומים כה רחוקים שלפעמים זה נותן יתרון (תתפלאו מה ניסיון בIT מימוש מערכות מעקב וVoIP יכול לתת).

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

כן אני באמת מאמין שrsync הוא פתרון נהדר (וחבל שהמימוש שלו בGPLv3 ולא lgpl או משהוא שלא ימנע ממני להשתמש בו במוצר קנייני). האמת חשבתי לממש אותו שוב פעם ולשחרר את MIT רק אחרי שבוע של כתיבה הבנתי שזה גוזל ממני יותר מדי זמן. כן אני מאמין שמספר מאוד גדול של תוכניות צריך להכתב בשפה דוגמת פרל (או רחמנה ליצלן בPHP) כאשר יש טיפול בטקסט. וכן הרבה תוכניות יכולות פשוט להכתב בפייתון מאשר בC++ ובזמן האחרון אני אפילו רואה שימוש בC# רק בשביל דברים טרויאלים כמו זה (וכן סטודנט-מתכנת-בשקל שזה מה שהוא למד באוניברסיטה). שפה היא רק כלי וצריכים לבחור בה בהתאם למטרה. ופעמים רבות אנשים נאחזים בטכנולוגיה גם כשאינה מתאימה לצרכיהם. וככה אני מוצא את עצמי מתווכך עם מזמין עבודה שהקוד הזה עדיף עם יכתב בפרל כי יש לי כבר כמה מודלים שעושים בדיוק את מה שאתה צריך (המרה מXLS ל XML) במקום לממש משהוא בC עקום ראיתי מספיק קוד בשביל להגיד שלפעמים הקוד עקום אם משתמשים באלגוריתמים לא נכונים.

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

האם ניתן לקחת קוד GPL ולממש מחדש תחת רישיון BSD ? האם אפשרי בכלל לייצר מימוש חדש בלי להיות מושפע (שלא יגידו שבגלל שאתה בתחום הVoIP אז אסור להשתמש בZRTP .

יום שלישי, יוני 09, 2009

האם תשתמש בC# ?

טוב מה לעשות גם אני לא ממש מתלהב מMono אבל מה שלי יותר מפריע זו השפה.
מי שזוכר ומכיר אותי יודע שכמעט תמיד אני מתרחק מהשפה הזאת בעוד לחלק מטכנולוגיות ה dotNet יש פתרונות חופשים (?) הבעיה פה זה השפה.

כשאני מסתקל על זה אני לא רואה שום סיבה למה עדיף להשתמש בשפה הזאת , חוץ מההרגל של מי שמשתמש בFramework מסויים.
הלא היא לא יכולה להתחרות ב C++ במהירות , לא יכולה להתחרות בperl ביכולת ההרחבה , לא יכולה להתחרות בפייתון בפורטביליות וקלות .
למעשה איך שאני רואה את זה , השפה היא לא יותר מהרחבת framework של חברה מסויימת.
האמת אני אעדיף לכתוב משהוא ב C++0x (שאותה לא למדתי עדיין) מאשר לפתח ב C#.

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

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

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

האם אם מחר ברירת המחדל בסביבה יהיה ook כולם ירוצו לתכנת בזה ?!
האם אני מפתח בתוכנה ? כשחייב אז כן (עבודה / לימודים וכו' .. ) כשאני יכול אני מעדיף שפות טובות יותר , זה כמו בדיון של עידו על בסיסי נתונים צריך לבחור מה הכי מתאים לך בזמן הזה ומשום מה לא היה פעם אחת אפילו שC# הובילה על שפות אחרות.

יום ראשון, אפריל 12, 2009

איזה כיף שיש עזרה מהקהילה

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

אז מצד אחד אני מוצא את עצמי קורא RFCים ורשימות תפוצה בנושאים מוזרים (מישהוא אמר IMAP/SIP/SSH אופן מוקו כל מני דברים שלא ממש קשורים אחד בשני) .
הבעיה היא שאני מבזבז על זה המון זמן (ולא לא הגעתי למסקנה הזאת לבד) , בת הזוג כועסת אני מתעקב בעבודה (כי החלטתי שאני לא כל כך בטוח איך TCP מתמודד עם פאקטים בצורת א-ב-ג) , ובכלל אנשים אומרים שאני מסתבך לחינם (אני סתם חופר ).
ובסוף עוד אנשים חושבים שאני יכול לעזור להם בLDAP (טוב נו אז קראתי כמה RFCים , כתבתי כמה שטויות ב פרל) .
אתמול התחלתי לעבור על פרוייקטים שאני צריך להגיש במסגרת האקדמיה וחשבתי "הממ יש פה איזה שיעורי בית משעמים אולי נוסיף קצת פלפל ? " והנה התוצאות.



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

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

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

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

אכשיו נשאלת השאלה מאיפה אני משיג מכונה תריץ את צד השרת (שלוש ארבע שדונים) שיתחברו לבסיס הנתונים (הרמתי בסיס נתונים בSF אבל פתרון אחר היה הרבה יותר טוב).
רגע ונשאלת השאלה מה הוא הקורס ? הקורס הוא Testing ... מעניין מה אני אכתוב כשאני אגיע לקורסי בינה מלאוכתית.