יום ראשון, 8 בספטמבר 2019

פרסור Json המכיל keys כפולים (python)

Json With Duplicate Keys

לאחרונה הייתי צריך לקרוא קובץ json שמסיבה כלשהי היו בו כמה מפתחות כפולים.

לדוגמה:
{
    "field-A": {
        "title""example title",
        "some-array": ["GML""XML"],
        "duplic-dict": {"A""4""A""5""B"2"C""3""B""11""B"300},
        "empty-dict": {},
        "more": {
            "title""S",
            "field-AA": {
                "duplic-field-AB": {
                    "ID""1234",
                    "ID""56",
                    "SortAs""Text"
                }
            }
        }
    }
}



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


import json

def parse_duplicable_object_pairs(pairs):
    """Scan json as usual, but where there are duplicate keys convert them to array.
    Example:
        From: {'dd': {'A': '4', 'A': '5', 'B': 2, 'C': '3', 'B': '11', 'B': '50'}} 
        To:   {'dd': {'A': ['4', '5'], 'C': '3', 'B': [2, '11', '50']}}

    """
    keys = [key for key, value in pairs]
    # If there are no duplic keys, return regular dict
    if len(keys) == len(set(keys)):
        return {key: value for key, value in pairs}
    else:
        mixed_dict = {}
        for key, value in pairs:
            if key not in mixed_dict:
                mixed_dict[key] = value
            else:
                if not isinstance(mixed_dict[key], list):
                    mixed_dict[key] = [mixed_dict[key], value]
                else:
                    mixed_dict[key].append(value)
        return mixed_dict

jp = r"C:\Users\noamn\Desktop\BadJson.json" 
with open(jp, "r"as json_file:
    json_data = json.load(json_file, object_pairs_hook=parse_duplicable_object_pairs)
    print (json_data)

התוצאה במקרה הזה תהיה:

{
    "field-A": {
        "title""example title",
        "some-array": ["GML""XML"],
        "duplic-dict": {"A"["4""5"]"B"[2"11", 300]"C""3"},
        "empty-dict": {},
        "more": {
            "title""S",
            "field-AA": {
                "duplic-field-AB": {
                    "ID"["1234""56"],
                    "SortAs""Text"
                }
            }
        }
    }
}



וזה הכל בעצם.


יום שישי, 28 ביוני 2019

זהירות! רקורסיה הדדית בין מחלקות (Java)

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

class A {
    final static B b;
    static {
        System.out.println("In A static block");    
        b = new B();
    }

    A() {
        if (b != null) {
            System.out.println("B is: " + b);
        } else {
            System.out.println("the static block was not completed, "
                    + "inspite of we are in the constructor!!!");
        }
    }
}

class B {
    final static A a;
    static {
        System.out.println("In B static block");   
        a = new A();
    }

    B() {
    }

    @Override
    public String toString() {
        return "I am B";
    }
}

יום חמישי, 9 במאי 2019

רוני: איזה כלים אנחנו צריכים כדי להיות מפתחים


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

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

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

// TODO Post about git repository

שכבת הDATA
לשכבת הDATA אנחנו צריכים שרת SQL
אנחנו נשתמש בשרת SQL שאתם מכירים כלומר בSQLServer של מיקרוסופט או בקיצור נקרא לו MSS
למה דווקא מיקרוסופט? כי הם נותנים לנו את השרת בצורה ויזואלית ( זה לא אומר שלא נכתוב סקריפטים של SQL כמו ילדים טובים )

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

Eclipse

יום שלישי, 7 במאי 2019

רוני: שכבות ומודולריות בפרויקטים

 

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

מהו פרויקט מודולרי?

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

מה היה בעבר?
בעבר כל הקוד היה נכתב בקובץ אחד ובתהליך אחד וגם היה רץ על שרת אחד שנותן את כל המענה למשתמש.
יכלו להיות  גם כמה שרתים שעבדו במקביל כדי שיוכלו לתת מענה ליותר ויותר משתמשים אבל עדיין כל שרת הכיל את כל הקוד וכל הקוד היה נרשם בשכבה אחת

מה היה לנו רע בשיטה הזאת? 

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


מה אם התמונה הייתה פזל?

יום ראשון, 21 באפריל 2019

תמיד רציתם לשתף תיקייה בקלות בין כל המכשירים בבית?

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

לפייתון יש כלי נוח מאוד למטרה:
https://www.shellhacks.com/share-directory-content-http-python/

וכדי להפוך את זה לעוד יותר פשוט הכנסתי אותו לקובץ bat שמשתף בלחיצה את התיקייה בה הוא כרגע נמצא:
https://drive.google.com/open?id=1iOvIu5G2SaMvVCnc_BZ2Q0Etq4axd-Vr


אין לכם פייתון 3 במחשב? להורדה
פשוט שימו את הסקריפט בתיקייה שברצונכם לשתף, ותריצו אותו.
תוכלו לגשת לקבצים ולתת-התיקיות שבתיקייה מכל מחשב ברשת, בכתובת: http://your_ip_address:8000.
שימו לב לא להפעיל את הסקריפט יותר מפעם אחת במקביל באותו מחשב.

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




הקוד של קובץ ה-bat:


@echo off REM Print folder path SET myPath=%~dp0 SET myPathWithoutFinalBackslash=%mypath:~0,-1% echo %myPathWithoutFinalBackslash% REM Get myIP for /f "delims=[] tokens=2" %%a in ('ping -4 -n 1 %ComputerName% ^| findstr [') do set myIP=%%a REM Print the server address echo Address: http://%myIP%:8000 echo Press CTRL+C to stop echo. REM Run the server python.exe -m http.server PAUSE




יום שלישי, 16 באפריל 2019

רוני: פרויקט גמר הנדסאי

עוד רגע ומגיעים לפרויקטים

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


קצת על הפרויקט שלי 

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

ומה הלאה?

מעבר לכך אני מתחיל לכתוב את הפרויקט מחדש בצורה נכונה, קריאה, טסטבילית, וכל מה שיש בפרויקט רציני.
בפרויקט החדש יהיה שימוש בשרת אפליקציה של PLAY, בשרת לקוח NPM, ושרת SQL שיהיה ככל הנראה של מיקרוסופט אבל יכול להיות שאני אחליף אותו לאורקל.

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

שיהיה לנו בהצלחה

קישורים 

כדי לעשות clone לפרוייקט (רק דרך ssh) 
git@gitlab.com:RoniLevy/strategooldproj.git

אם עדיין אין לכם גיט או אם עדיין לא ג'ינרטתם לעצמכם מפתח אז תכתבו בתגובות.


לכל בעיה שתתפתח במהלך הדרך אתם מוזמנים לשלוח הודעה

רוני 

יום שישי, 4 בינואר 2019

קצת על סיבוכיות

כשסיבוכיות באה לידי מעשה

נתבונן בשאלה הבאה אשר ממחישה בצורה טובה איך ניתן לייעל אלגוריתם.

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


ובפשטות, ממשו את הפונקציה findMissingNumber:
    public static void main(String[] args) {
        // N is 6
        int[] array = new int[] {0, 1, 2, 6, 4, 3};
        
        int missingNumber = findMissingNumber(array);
        System.out.println("The missing number is: " + missingNumber); // 5
    }







יום שלישי, 4 בדצמבר 2018

Immutable Class in Java

Immutable Class


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

בדוגמה הבאה לא ניתן לשנות את התוכן של s1 בשום אופן:
String s1 = "ABC";


השורה הבאה לא משנה את התוכן שהיה באובייקט עליו הצביע s1, אלא יוצרת אובייקט חדש ואומרת ל-s1 להצביע כעת עליו:
s1 = s1 + "D";


יהיה אשר יהיה הקוד בפונקציה ()f, ההדפסה בלי ספק תהיה "abcde":
String s2 = "abcde";
f(s2);
System.out.println(s2);




יום חמישי, 8 בנובמבר 2018

מצגת: ראיית מכונה בזמן אמת

בבסמ"ח במוקדם או במאוחר מגיע תורו של חניך להגיש "סקירה טכנולוגית" בנושא כלשהו שיבחר.
כעת הגיע תורי.

ראיית מכונה בזמן אמת




יום שישי, 3 באוגוסט 2018

סיכום טירונות 02

טירונות 02 - המלצות

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





משך הטירונות

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



מיקום

צריפין. (Google Maps)


יום ראשון, 1 ביולי 2018

יצירת בוט בטלגרם (Java)


Telegram Bot with Java

משתמשי טלגרם וודאי מכירים את אחת התכונות הכי מגניבות בטלגרם: בוטים.

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

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

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


את הבוט כתבתי ב-Java, תוך שימוש בספרייה Rubenlagus' library for Java שניהלה את התקשורת עם ה-API של טלגרם.
קוד המקור של הבוט שלי: [צפייה חסר], [הורדה חסר]


................................












התחלה: יצירת בוט במסד של טלגרם

יום רביעי, 27 ביוני 2018

ביצוע "מיון מיזוג" על מערך דו ממדי

Merge Sort על מערך דו ממדי


"Merge Sort" הוא אחד מהאלגוריתמים המפורסמים למיון מערכים.
תוכלו לקרוא עליו בהרחבה באתר של GeeksforGeeks.

נדגים עיקרון חשוב בעניין מערכים דו-ממדיים:
"מערך דו ממדי מתנהג ונשמר בזיכרון בדיוק כמו מערך חד ממדי."


לדוגמה, המערך:
[15],[22],[33]
[20],[80],[17]

נשמר בזיכרון כך:
[20],[80],[17],[15],[22],[33]

למעשה אם מערך חד ממדי לא שונה מ"מצביע", אז מערך דו ממדי לא שונה מ"מצביע למצביע".





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

הקוד:
(הקוד זמין גם כאן)

יום ראשון, 24 ביוני 2018

עוד על מבוכים, הפעם עם JavaFX

יצירה קלה של מבוכים חדשים עם ממשק משתמש גרפי


פוסט זה ממשיך בנושא פתרון מבוכים.

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

הורדת קובץ הרצה
הורדת קוד מקור




סרטון הסבר:


יום רביעי, 20 ביוני 2018

מציאת הפתרון המהיר ביותר למבוך

הפתרון המהיר ביותר למבוך

הקוד הבא הוא למעשה חידה מפורסמת. נתקלתי בו בבלוג של Symbol/Skyance, ועם שינויים מסוימים אני מביא אותו לכם.



נתון מבוך שמיוצג ע"י מטריצה NxM כאשר תמיד תחילת המבוך בקואורדינטות (0,0) והסיום בקואורדינטות (N-1,M-1).
ערך של 1- באיבר במטריצה מייצג קיר שאי אפשר לעבור וערך של 0 מייצג דרך שאפשר לעבור בה.
לשם הפשטות מותר ללכת במבוך רק בקוים ישרים.

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





יום שלישי, 19 ביוני 2018

קורס מבוא לתכנות של הבסמ"ח

קורס מבוא לתכנות של Basmach!

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

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






ייצוא הפרויקט לקובץ EXE (‏Java)

ייצוא קובץ EXE באמצעות Launch4j

אז כתבתם פרויקט ב-NetBeans וכעת אתם רוצים לשתף אותו עם העולם,
לשם כך אתם רוצים לייצא אותו אל קובץ EXE.



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


יצירת קובץ JAR הניתן להרצה:
ייצאו את הקוד שלכם אל קובץ JAR, אותו למעשה ניתן להריץ אף מבלי שתמשיכו ותעטפו אותו כקובץ EXE.
עשו זאת על ידי לחיצה ימינית על הפרויקט ואז בחירה באפשרות "Clean and Build".
קובץ ה-JAR ייווצר בתיקייה dist של הפרויקט.

יום שני, 18 ביוני 2018

יצירת קובץ EXE עם כל הספריות dll הדרושות (#C)

קבצי dll ב-Visual Studio

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

- כל הספריות בפרויקט שלנו שמורות תחת References.
- רק אחרי שנוסיף את הספרייה לפרויקט נוכל לקרוא לה על ידי using.




הוספת ספרייה לפרויקט:
דרך 1: להוריד את ה-dll ולהוסיף אותו ידנית.
דרך 2: אם מדובר בספרייה מוכרת, יתכן שניתן בעזרת NuGet להגיע אליה ישירות באמצעות חיפוש אונליין בויזואל סטודיו.
אפשר להגיע אל NuGet כך: TOOLS->Library Package Manager->Manage NuGet Packages for Solution.
או כפי שמתואר כאן.










יצירת קובץ EXE שמכיל את כל הספריות שעשינו בהן שימוש:

יום שישי, 1 ביוני 2018

אודות המבחן האחרון ("מעבדה") ב-SQL ו-Access

פרויקט Access


ביום רביעי ה-30/05/2018 היה יום הלימודים האחרון של יד' תוכנה - הגשת פרויקטים שנתיים לבוחנים של משרד החינוך.
על הפרויקט הגדול ב-Java עוד נכתוב בהמשך, אבל כמה מילים על הפרויקט ב-Access:


מה ציפינו:
ציפינו להציג את מסדי הנתונים שבנינו ב-Access, אשר מלווים בשלל טפסים ודוחות, עמודי נחיתה מעוצבים וכפתורים נוחים לכל פעולה על המסד.



מה קיבלנו:
הבוחנים לא התעניינו ב-Access, יתכן שזו הייתה אי הבנה, הם ביקשו לראות את קשרי הגומלין בין הטבלאות, ואז נתנו לנו כרבע שעה לבצע משימה כלשהי.









משימות לדוגמה:

יום שלישי, 15 במאי 2018

מדריכים לתחילת עבודה עם JavaFX

ממשק גרפי עם JavaFX


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

אחת היכולות החשובות של JavaFX היא האפשרות לחלק את הקוד על פי מודל MVC הנוח.
להרחבה על המודל: Derek Banas, Traversy Media, HandsonERP

כבר בהתחלה, כמובן אחרי שהתקנתם את NetBeans, מומלץ להוריד את התוכנה SceneBuilder לעיצוב חלונות התוכנה בקבצי FXML.
להורדה: כאן.








מדריכים ל-JavaFX:

סדרת מדריכים מומלצת מאת ProgrammingKnowledge

יום שלישי, 8 במאי 2018

חידה: קוד שמדפיס את עצמו

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



נסו זאת בעצמכם! זה אפשרי.