מדריכים

22 נושאים 137 פוסטים
  • 7 הצבעות
    1 פוסטים
    414 צפיות
    אין תגובות
  • 14 הצבעות
    3 פוסטים
    556 צפיות

    בפוסטים הקודמים כתבתי רק על האזנה לאירועים של NodeBB בצד הלקוח.
    אלא שניתן גם ליזום אירועים, וכך ניתן לבצע פעולות בממשק בצורה נקיה, ללא צורך בדימוי לחיצות ושאר שטיקים מכוערים...
    לדוגמה אם אני רוצה לפתוח נושא חדש (זה רק דוגמה, ספציפית בזה יש את app.newTopic), אני לא צריך לדמות לחיצה על כפתור פתח נושא, ואז לדמות לחיצה על בורר הקטגוריות, וכן הלאה... 😣
    אני יכול פשוט לקרוא לאירוע action:composer.topic.new (מאיפה יש לי אותו? מהתיעוד הרשמי) עם הפרמטרים הנכונים,

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

    $(window).on('action:composer.topic.new', (event, data) => { console.log(data); });

    אם תאזינו כך להוק של פתיחת נושא, תוכלו לראות שהוא מקבל אובייקט שמכיל cid ומערך של tags, שבמקרה הזה הם ריקים:

    { "cid": 0, "tags": [] }

    וממילא ברגע שנקרא להוק בצורה הזאת:

    $(window).trigger('action:composer.topic.new', { cid: "9", tags: [ 'test', 'test2' ] });

    נראה שנפתח מייד חלון כתיבת נושא חדש, כאשר ב"קטגוריה" כבר נבחרה קטגוריה מספר 9 - בניה ושיפוצים, ובמקום המיועד כבר הוכנסו התגיות test וtest2:
    fb1681dd-ada4-4a4d-b197-9bba5e29f2a0-image.png
    ותן לחכם ויחכם עוד... 😊

  • טיפים לכתיבת שרת נוד ב TS

    4
    2 הצבעות
    4 פוסטים
    303 צפיות

    @צדיק-תמים אמר בטיפים לכתיבת שרת נוד ב TS:

    @יוסף-בן-שמעון למה לא לכתוב בtsconfig

    "outDir": "dist"

    וכך הקבצים ייווצרו מלכתחילה בתקיה ייעודית? 🤔

    תלוי בסביבה ובדרישות, לא מתאים בכל מצב, ובכל מקרה, גם את התיקיה הייעודית כדאי להסתיר

  • 10 הצבעות
    27 פוסטים
    1k צפיות
  • 7 הצבעות
    3 פוסטים
    414 צפיות

    @חוקר

    אם אתה משתמש ב credentials.installed; ולא ב credentials.web; אז הקוד יגיע לך כטקסט להעתקה.

    אם יש את זה:
    'https://www.googleapis.com/auth/drive'
    לא צריך את כל השאר.

    כדאי לזכור שלהרבה שימושים service-account גם מספיק, והרבה יותר קל מאשר כל התהליך של OAuth.

  • מדריך: כתיבת אפליקציות בGO

    5
    5 הצבעות
    5 פוסטים
    368 צפיות

    אתר חביב שמציג בצורה מסודרת ופשוטה את GO ואלו כלים היא מספקת
    https://gobyexample.com/

  • Bash Tips: על אנדרואיד ובאש

    2
    5 הצבעות
    2 פוסטים
    229 צפיות

    על אנדרואיד ובאש פרק ב

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

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

    למי שלא מכיר F-droid היא חנות אפליקציות המקבילה לגוגל פליי, מוכרת מאוד בעולם הקוד פתוח אבל לא רק, שמה הוא בעצם קיצור של FOSS Droid.

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

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

    באג בהשלמה אוטומטית
    למשתמשי מקלדת samsung יש בעיית התממשקות לTermux, ההשלמה האוטומטית משלימה דיי מה שמתחשק לה, הבעיה ידועה וניתנת לפתרון על ידי הורדת ההערה מהשורה הבאה בקובץ ההגדרות של Termux הלא הוא .termux/termux.properties

    enforce-char-based-input = true

    טעינה מחדש של ההגדרות על ידי termux-reload-settings, והסיפור סגור

    https://t.me/s/bash_tips

  • האנטומיה של שאילתת SQL

    1
    23 הצבעות
    1 פוסטים
    448 צפיות
    אין תגובות
  • 12 הצבעות
    31 פוסטים
    1k צפיות

    @nigun הסתדרתי
    (פיספסתי בדוקס את ה"יש לבחור סיסמא" 🙂

  • 23 הצבעות
    10 פוסטים
    2k צפיות

    הקדמה:
    כעת אני קורא את השיעור הקודם
    (למי שמעוניין יש בו את הקוד המלא של איפה שאנחנו אוחזים, מדובר באפליקצייה של דף בודד ותו לא),
    ואני רואה שלא ממש גמרנו, צריך גם להראות את הרשימה.
    לשם כך אני משנה את המקטע של if (req.url == '/') שזה מתייחס ל"דף הבית" שלנו, ככה:

    if (req.url == '/') { res.write('Hello To List Page!<br>' + list.join('<br>') + '<br><a href="/add-item">Add Item To List</a>') ; }

    זה משרשר כמה טקסטים, בתוכם יש קריאה לפונקציה join של מערך (הליסט שלנו), כשהמפריד הוא הbr שזה אלמנט קפיצת שורה בHTML. בסוף על הדרך שמתי לינק (אלמנט a בHTML) לדף הadd-item להוספת פריט חדש.

    כעת אפשר להריץ ולראות בהתחלה בדף הבית לינק להוספת פריט.
    כעוברים לדף add-item וכשמזינים את הטופס ושלחים מקבלים דף ריק, אם נחזור ידנית לדף הבית נראה את הפריט שהתווסף בהצלחה.

    שיעור 7 - שוב על POST וגם על REDIRECT.

    הסברתי בעבר שבשביל לשלוח את הטופס לשרת אני משתמש בPOST כי זה בדיוק התפקיד שלו.
    למה? זה גורם לפעולה בצד השרת, זה בקשת אינטרנט שיש לה השפעה ולא רק קבלת מידע.
    ומה הרווחנו שאנו פועלים לפי הכלל הזה? למשל את התנהגות הדפדפן שבעת ריענון של הדף אחרי השליחה זה יזהיר אותנו מפני פעולה כפולה. בGET זה יעשה את הפעולה שוב בלי אומר ודברים.
    בצד שרת אנחנו יכולים לזהות האם הבקשה היא POST וGET בדיוק כפי שאנו יכולים לבדוק מה הURL. אם כן אנו יכולים להעמיס על URL שכבר בשימוש לGET, כמו כאן שכניסה לadd-item מביאה את הטופס, פעולה נוספת במקרה של POST.
    השאלה היא מה קורה אחרי הPOST. אם נחזיר חזרה את הטופס בדיוק כפי שהיה, אז ללקוח יהיה תחושה שלא קרה כלום.
    מה שמקובל (כל עוד אנו לא בAJAX - לא להיבהל, יילמד בהמשך) זה או להחזיר את הלקוח לרשימה ואז הוא מבין (וגם רואה) שבקשתו בוצעה.
    בפשוטת יכולנו לעשות את זה פשוט - להחזיר בres.write את הרשימה, משהו כזה:

    else if (req.url == '/add-item') { if (req.method == "POST") { parsePostData(req, function (result) { list.push(result["the-name"]); //בשלב זה אנחנו יכולים לכתוב תשובה ללקוח בדיוק כמו שעשינו בדף הבית res.write('Hello To List Page!<br>' + list.join('<br>') + '<br><a href="/add-item">Add Item To List</a>') ; }); }

    זה לא טוב. למה? כי למשתמש כעת יהיה בשורת הכתובת כתוב add-item והדף בעצם כעת מכיל רשימה. זה גם מאוד "לא נכון" וגם מבלבל, הוא יכול להעתיק את הלינק הזה או לשמור אותו במועדפים מאוחר יותר בלי להתייחס למה כתוב בו, ולהניח שזה לינק לרשימה, שהרי זה מה שהוא רואה.
    אז אנחנו צריכים "לשנות את הכתובת בדפדפן" לדף הבית, ובכן זה בלתי אפשרי. מה שעושים זה גורמים לדפדפן לעבור לכתובת של דף הבית כאילו המשתמש לחץ על היפר קישור. עושים את זה ע"י תשובת Redirect.
    יש כמה סוגי תשובות REDIRECT, הם מצויינים בקודים 3xx (כלומר 300, 301 וכו'). הסוג שנדרש לנו הוא 303 - See Other. הוא סוג פשוט שאומר, הכל בסדר, כעת תעבור לX.
    המבנה של תשובת Redirect בבסיסה רק כותרת אחת ללא כל תוכן:

    HTTP/1.1 303 See Other Location: /

    אבל לא נוכל לעשות זאת מייד,
    א. כי בקוד שלנו לפני התנאי בכלל כבר שמנו כותרת בשם 'Content-Type', עם HTML, מה שלא מתאים מקרה הזה.
    ב. בקוד שלנו שמנו אחרי התנאי res.end שזה אומר לגמור את התשובה ולסגור את החיבור. הבעיה שבמקרה של הpost שלנו שאנו מוסיפים אלמנט לרשימה, הres.end קורה עוד לפני הוספת האלמנט שכן הוספת האלמנט נעשית כcallback למתודה האסינכרונית parsePostData (כזכור, המתודה parsePostData ניגשת לגוף הבקשה וגישה זו בנויה באופן אסינכרוני = "נודיע לך כזה יקרה", כי הטיפול בבקשה מתחיל עוד לפני שהיא סיימה להגיע).
    לשם כך נשנה את הקוד בכמה דברים:

    function handleAllRequest(req, res) { if (req.url == '/') { var page = 'Hello To List Page!<br>' + list.join('<br>') + '<br><a href="/add-item">Add Item To List</a>'; sendHtml(res, page) ; } else if (req.url == '/add-item') { if (req.method == "POST") { parsePostData(req, function (result) { list.push(result["the-name"]); res.writeHead(303, { Location: '/' }); res.end(); }); } else { sendHtml(res, `<form method="POST"> Enter the item value: <input type="text" name="the-name" > <br> <input type="submit" > </form>`); } } else { sendHtml(res, 'Opss... Not Found!'); } } function sendHtml(res, str){ res.setHeader('Content-Type', 'text/html'); res.end(str); }

    ראשית הסרנו את הres.setHeader והres.end שהיו לפני ואחרי התנאי, כי באחד המקרים של התנאי איננו רוצים את שניהם.
    שנית בנינו פונקציה קטנה לשלוח html בתשובה, כדי לחסוך לכתוב שוב ושוב שלושה שורות: res.setHeader, ואז rew.write ולבסוף res.end. בעצם דילגנו על res.write לגמרי גם בפונקציה כי הres.end מקבלת כפרמטר תוכן בדיוק בשביל לחסוך מקרים כאלה (הwrite עושי למקרה של כתיבות רבות לאותה תשובה, במקרה של בודדת אפשר להשתמש בקיצור הזה).
    שלישית, וזה הסיבה שעשינו את כל השינויים, הוספנו אחרי הוספת אלמנט (שורות 9-11) הפניה חזרה ל"דף הבית" כלומר לרשימה.

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

    יש לציין שההעברה לרשימה אמנם מקובלת אבל היא לא "100%" מבחינת חוויית משתמש, כיון שיש משתמשים שעד שלא יאמרו להם שזה הצליח, הם לא יהיו בטוחים אם המחשב עשה את מה שהם התכוונו.
    בשביל אלו אפשר לעשות העברה לדף אחר, בו כתוב "ההוספה הצליחה!", ומתחת לזה לינק "חזרה לרשימה". יש בזה אבל משהו מייגע עבור יתר המשתמשים. לכן יש כאלה שיעשו שהדף הזה יופיע לשלוש שניות - יהיה כתוב "מעביר אותך לרשימה...". זה בעצם REDIRECT שנעשה בצד הלקוח עם קוד עם השהיית זמן.
    יש סיטאוציות שהכי הגיוני זה להישאר באותו הדף של הטופס, למשל אם מטבע הדברים אמורים לשלוח טופס שוב ושוב רצוף (בדוגמה שלנו לשים כמה הפריטים ברשימה). במקרה כזה מחזירים את אותו דף של add-item אבל כותבים איזה חיווי בצד לקוח (למטה או בכותרת צפה זמנית) שהנתונים נשלחו בהצלחה.

  • 8 הצבעות
    8 פוסטים
    262 צפיות

    @dovid אמר בשדרוג מראה עורך ה-VBA לערכת נושא VS2019 Dark:

    https://github.com/rubberduck-vba/Rubberduck/

    אני משתמש כל הזמן ב RubberDuck וזה תוספת מבורכת, אבל לא ידוע לי שאפשר להכניס קוד .NET...

  • הגמילה מאקסס - סרניטי

    19
    13 הצבעות
    19 פוסטים
    1k צפיות

    @nigun אמר בהגמילה מאקסס - סרניטי:

    @משה1
    אתה צריך משהו עם מדריכים מפורטים בעברית או שאתה מסתדר גם עם אנגלית?

    אנגלית גם

  • אסטריסק: מדריך SIPp

    3
    4 הצבעות
    3 פוסטים
    251 צפיות

    תוך כדי פעולה,
    אתה יכול להעלות ולהוריד, ע"י לחיצה על + העלאה של שיחה אחת, - הורדה של שיחה אחת, * העלאה של 10 שיחות, / הורדה של 10 שיחות.

  • Regex - ביטויים רגולריים

    7
    18 הצבעות
    7 פוסטים
    2k צפיות

    @dovid אמר בRegex - ביטויים רגולריים:

    בפעם הבאה אני מקוה להתחיל להראות איך לעבוד ספציפית בJS.

    פה יש דוגמאות מעשיות
    https://reshetech.co.il/regex-in-javascript-tutorial
    https://shushan.co.il/הסבר-ולימוד-regex-regular-expression

  • מימוש עצמי של אירועים

    1
    6 הצבעות
    1 פוסטים
    126 צפיות
    אין תגובות
  • מדריך: בניית אתרים סטטיים

    2
    6 הצבעות
    2 פוסטים
    293 צפיות

    התקנת hugo (לינוקס)

    קודם נוריד את החבילה העדכנית

    curl -s https://api.github.com/repos/gohugoio/hugo/releases/latest \ | grep browser_download_url \ | grep Linux-64bit.deb \ | grep -v extended \ | cut -d '"' -f 4 \ | wget -i -

    ואז נתקין

    sudo dpkg -i hugo*_Linux-64bit.deb

    נבדוק שזה הותקן כראוי

    hugo --help

    ניצור תיקיה בשם hugo שתהיה הסביבת עבודה שלנו

    mkdir hugo cd hugo

    וניצור בתוכו את התיקיה שתכיל את האתר שלנו

    hugo new site my_site

    ונוריד תבנית לאתר (ניתן לבחור תבניות שונות כאן)

    git clone https://github.com/calintat/minimal.git my_site/themes/minimal cp -r themes/minimal/exampleSite/* .

    ועכשיו נפעיל את השרת (שימו לב שצריך להחליף את my-url לכתובת של האתר שלכם)

    hugo server -D -b=http://my-url --bind=0.0.0.0

    אם הכל נעשה נכון, עכשיו האתר זמין ב http://my-url:1313

    ובקיצור

    mkdir hugo cd hugo hugo new site my_site git clone https://github.com/calintat/minimal.git my_site/themes/minimal cp -r themes/minimal/exampleSite/* . hugo server -D -b=http://my-url --bind=0.0.0.0
  • נושא זה נמחק!

    1
    0 הצבעות
    1 פוסטים
    4 צפיות
    אין תגובות
  • פיתוח Nodejs - פרקטיקות מומלצות

    1
    5 הצבעות
    1 פוסטים
    243 צפיות
    אין תגובות
  • Debug ב NodeJS, עם Google Chrome

    1
    8 הצבעות
    1 פוסטים
    178 צפיות
    אין תגובות
  • נושא זה נמחק!

    3
    3 הצבעות
    3 פוסטים
    417 צפיות