אני לא הבנתי בהתחלה על איזה מכה מדובר כי אני מקבל צינתוק לטלפון שלי (מספר כשר) בסביבות פעם בשבוע, אבל כעת פתחתי קו נוסף לבית וראיתי שיש כמה צינתוקים ביום.
אני תולה את זה שאני לא מקבל צינתוקים בכך שמזמן היה תקופה שכל צינתוק שקיבלתי חזרתי למספר חיפשתי אפשרות הסרה והסרתי וחלס, כך נהגתי לעשות ברוב הצינתוקים
כנראה שזה הסיבה לשקט.
לעצם הדבר של לענות ולצעוק על הטלפנית לדעתי לא עוזר כלום, הטלפניות מודרכות להסביר פנים ולהציע בעדינות שהם מסירים מרשימת התפוצה וזה בהחלט מה שהן עושות.
מנהלי קמפיין מקבלים דוח ביצוע והם לא מתחילים בכלל לבדוק כמה שיחות היו עם תלונות וכו' אלא כמה העלויות וכמה נכנס, כל עוד הרווח יותר מהפסד אין לו שום סיבה להפסיק.
ואגב לגבי תביעת ספאם אני לא בקי ומומחה אבל יש סעיף שמותר לבקש תרומות (ולאפשר לצאת מרשימת התפוצה), לכאורה קווי נייעס יותר חשופים לתביעות ספאם של צינתוק ללא משמעות.
חוקר
-
הצעה לפתרון למכת הצינתוקים -
התחברות לסיבים באמצעות נטפרי על גבי תשתית רימון@nigun @קינג-קומפיוטר אני מתנצל שלא הצבעתי
הנה מהבעיות הראשונות של אתרוג.. METHOD PUT לא עובד ולכן לא ניתן להצביע..
קבלו את התנצלותי..
בל"נ בהמשך ברשתות אחרות.. -
חומת האש באובונטו@yossiz אמר בחומת האש באובונטו:
@חוקר היה כדאי אולי לפתוח נושא חדש לזה... התשובה היא:
echo "deny x.x.x.x" | sudo tee /etc/nginx/blockips.conf > /dev/null
ההסבר אולי אני אכתוב בהזדמנות אחרת
הבעיה שזה דורס את הקובץ במקום להוסיף בסופו.
צריך פשוט להוסיף את הדגל של -aecho "deny x.x.x.x" | sudo tee -a /etc/nginx/blockips.conf > /dev/null
-
קישור לא תקין של פורום מקצועות@מוטי-אורן אמר בקישור לא תקין של פורום מקצועות:
זהו שירות לקיצור קישורים
בדר"כ כשמדובר בלינק קצר כמו כאן שמופנה ס"ה ללינק הראשי של https://מקצועות.com אין צורך לקצר אותו יותר..
וא"כ מסתבר שהמטרה כפי שכתבתי לספירת הקליקים על הלינק -
אימות עסק בפייסבוק/וואטסאפ APIברוך השם, בשעה טובה הצלחתי!
התקשרתי לחברת החשמל וביקשתי לשנות את השם שלי לשם העסק.
לאחר מכן ביצעתי תשלום של חשבונית פתוחה והקבלה הגיע עם שם העסק
שם מופיעים השם והכתובת.
בנוסף כבר החלפתי בעבר גם בסופרגז לשם העסק ושם מופיע גם מספר הטלפון.
מקודם צירפתי את הפרטים שוב, תעודת עוסק מורשה לשם העסק, וקבלה מחברת החשמל + העתק קבלה מסופר גז עבור הכתובת והטלפון, ולאר כשעה קיבלתי הודעה למייל שהאימות בוצע בהצלחה -
נורית חיווי שדולקת חלק במצב כבוילמען האמת אני חייב להודות באשמה שהייתי יכול לפתוח מיד ולבדוק את החיבורים, בלי להעלות את הנושא לפורום.
אלא שידעתי שזה לא יקרה כ"כ מהר.. (כבר כשלושת רבעי שנה בדירה וזה לא זז)
אך ידעתי שאם אכתוב ואשאל על כך, כבר אהיה מוכרח לסדר זאת על פי התשובות.
אני מתנצל אם זה הפריע למישהו.. -
נורית חיווי שדולקת חלק במצב כבויאכן פתחתי כעת וראיתי שהחוטים של הנורה לא היו מחוברים טוב.
השלילי היה מחובר אחורי המתג, והחיובי לפני המתג שזה אומר מחובר תמיד.
אני לא הכי מבין איך זה דלק חלש אם השלילי אמור להיות מנוטל כי הוא לאחר מתג, אבל תכלית את החיובי ג'כ העברתי למאחורי המתג וכעת הנורה דולקת רק כשהדוד פועל.
תודה לעוזרים -
לימוד Asteriskואני אומר שיש מספיק פרנסה לכולם, ואדרבה אני חושב שרוב הציבור כאן בפורום נותן משלו למתחרים שלו, ומאמין באמונה שכמו שלנר אין בעיה להדליק אחרים וזה לא מחסיר ממנו, כך להעביר מידע ורעיונות לא אמור להחסיר.
כמובן שאין הכוונה לכתוב בריש גלי את המחלקות וארגז הכלים האישי שצברת, אבל עזרה נקודתית והנחיה, כולנו כאן נותנים בשמחה. -
סביבת טסטים לשלוחת API בימות המשיחלינק לפוסט שפירסמתי בפורום ימות
סביבת בדיקה לשלוחת API שמשרשר את הבקשות בקלות.
היות ויש בינינו מתכנתים בימות שאינם מדפדפים הרבה בפורום ימות, לכן אני מעלה גם כאן את הלינק -
JS תיבת תפריט בחירת תאריך משולב עברי ולועזילמעשה שידרגתי קצת ועשיתי כלאים של שתי ספריות.
יש גם תפריט בחירת יום לועזי או עברי
וגם אפשרות של בחירת טווח תאריכים
ואגב, 37,153 זה מספר המבחנים שהיו ביום רביעי (י"ח טבת תש"פ) בישיבה על קברו -
שירות לקוחות ושדרוגים של מתכנת עצמאיהאמת נושא שלפעמים זה כאוב, ואני חושב שאולי יחד עם חברי הפרום ניתן להגיע ליותר תובנות בנושא ולשפר אותו.
מתכנת שעובד עצמאי, ויש לו ביקוש (או אפילו לאו דווקא) והוא מוצף בעבודה (או בלמידה), יש מצב, ונושא שירות הלקוחות מגיע לו בקושי.
המתכנת לא זמין בטלפון, לא מטפל בכל הבקשות, אמר שהוא מקווה שעד יום רביעי זה יהיה מוכן ובסוף נדחף לו פרוייקט אחר יותר מעניין לתוך סדר העדיפויות וכו'.
והלקוחות? יש כאלו שמיד ברגע הראשון אתה יודע שאיתם אתה תסתדר, הם ישלמו בזמן, הם לא ידרשו הרבה, וגם לא ישגעו אותך אם זה לא יהיה מוכן וכו'.
בדר"כ הזמנות של לקוחות כאלו עולים למעלה בסדר העדיפויות.
לעומת זאת, יש לקוחות שהתחילו עם הזמנה שנראית פשוטה ותמימה, אבל אח"כ אתה קולט שהם תיכננו שתבנה להם את מגדלי התהומים, רק שהם לא ניסחו את עצמם כראוי.
והם רודפים אחריך, וכמובן שאין להם לשלם בדיוק לפי הציפיות, ואם אתה לא מתייחס הם עושים את עצמם הכי מסכנים בעולם, ובגללך הם לא מרוויחים/הם מפסידים כסף, והנה כעת יש להם הזדמנות, אם רק תוסיף את הפיתוח הספיציפי הנוכחי למערכת (ומה זה כבר סך הכל?) אז יתחילו להרוויח מזה את המיליונים, והם מציעים שאולי כדאי לך להיות שותף פעיל, לקבל לפי האוחזים וכו' וכו'.
קשה להתחמק מהם, כי אתה מרגיש חסר לב, בן אדם נלחם על פת לחמו ובידך לעזור לו, ומצד שני אתה לא מחוייב להקריב את חייך עבורו, בזמן הזה תוכל להרוויח ביותר קלות ולהביא תועלת אחרת לעולם.
כמו כן יש לפעמים פרוייקטים שנקטעים בגלל סיבה טכנית, למשל זה דרש התחברות לAPI מול שרת חיצוני, ובסוף זה לא בא בקלות בגלל כשלים בחיבור וכדומה, ואז אפילו כשזה כן הסתדר אתה מרגיש שזה כבר לא ריווחי הפרוייקט וזה אוטומטי יורד מסדר העדיפויות, וכאשר הוא יצטרך שדרוג זה לא יבוא לו בקלות.
בקיצור לכל אחד יש את הסיפורים שלו, והנסיון שלו.
אני רוצה בפורום זה להעלות את הנושא ולשאול כך:
מהו המחוייבות של מתכנת שפיתח מערכת, והלקוח בא ומבקש שידרוגים והוספות, ובלשון המעטה זה לא מושך את המתכנת, כל אחד מסיבותיו שלו.
האם וכמה הוא כן מחוייב, או בכלל לא מחוייב.
מה הנוסח שכדאי להסדיר עם לקוחות לפני התחלת מתן שירות.
ומה עושים באמת עם לקוחות שמתקשים איתם?
וכן כל תובנה או שאלה אחרת בנושא.
מה דעתכם?
האם אני מדבר כאן לא לעניין? או שזה נושא (כאוב או אהוב) שכן כדאי לפתוח אותו.@dovid אשמח אם תאשר האם הנושא הזה מתאים לדיון.
-
תמחור פרוייקטהאמת, מאז שיצאתי מגדר מתכנת מתחיל (אם כבר יצאתי ), והתחלתי להתפרנס מתיכנות בשעות הפנאי, התלבטתי הרבה עם חלק מהשאלות כאן, ולפי הנראה יש כאן עוד שמתמודדים בזה ב"ה.
אולי עד תחילת הזמן אוכל לעשות קצת סדר בראש של כל השאלות, ולשאול דיין מומחה על כל הנושא, מצד דיני הונאה, וליצור קצת סדר בנושא.
אדרבה אם מישהו יקדמני, בשמחה.
אבל מזה אני עוד לא חוזר בי, שלא חייבים לתת מקום לרגש במחיר שלוקחים, כל עוד ואתה לא מרמה את הלקוח, אלא נותן לו את התמורה הנאותה למחיר אותו הוא משלם.
לא נתתי כאן שום פתח לבקש מחיר מופקע על ידי רמיית הלקוח, אבל כן לבקש מחיר הגון, והמקסימום שאתה יכול לבקש מהלקוח עבור התמורה שהוא מקבל, ואם לא מתאים לו, מותר לו ואף כדאי לו לחפש מישהו אחר.
ומנסיון, אם אתה מספק סחורה טובה, הלקוח יהיה מוכן לשלם כל מחיר.
היה לקוח שרק חיפשתי להתפטר ממנו, זה היה סוף זמן, היה לי לחץ של חזרה על הלימוד בכולל וכו', שרק חיפשתי דרך להוריד אותו ממני, אז אמרתי לו מחיר מאוד יקר (אבל עדיין בסופו של דבר מחיר סביר לתמורה שהוא מקבל, אם היה פונה למתכנת שלא מכיר את ימות המשיח) ושאני מוכן להתחיל את זה רק לאחר ראש חודש, והלקוח הסכים בלי שום וויכוח. (אציין, שבמקרה ההוא המערכת לא הצליחה כמו שאני אוהב, היות והיו תקלות טכניות בפיתוח, למרות שלא היו בגללי, אלא בגלל סוג התקשורת עם הלקוח, שרצה קריינות מקצועית וכו' שכל דבר עיכב עוד ועוד, והוא לא בדק מספיק את המוצר שהכל תקין, למרות בקשותי, וכן בגלל שהוא לא פירסם את זה מספיק ולא נרשמו מספיק אנשים וכו', אבל למעשה בסופו של דבר גם אני נהייתי עצלן בגלל הסחבת והמוכרבות, אז ביקשתי לו לבסוף רק מחצית מהסכום, כי אכן הרגשתי שלא נתתי תמורה הולמת,) אבל אם הכל היה הולך למישרים, אז למה לא לקבל את המקסימום שהלקוח מוכן לשלם? -
שאלות של מתחיל - מקצועי ב nodejs@חוקר אמר בשאלות של מתחיל - מקצועי ב nodejs:
תודה רבה לכל אלו שעזרו וסייעו
@david @יוסף-בן-שמעון @אהרן @magicode @clickone
מקוה שלא פיספסתי מישהו.
ב"ה הייתה התקדמות משמעותית היום, השלמתי בניית מערכת שעובדת בצורה חלקה, כמובן בעזרתכם.
עדיין לא גמרתי, אני לא למדתי עדיין מספיק את השפה, אבל כבר היה מספיק בסיסי כדי לעשות משהו שזז באמת..
במיוחד תודה ל @magicode על הדוגמה הראשונה שנתן, זה נתן לי פריצת דרך רצינית, וכן לימדה אותי פרק נוסף בנושא.
וכן ל @david שדחף אותי להיכנס לזה..
תודהנ.ב. אני מקוה שסיימתי לאשכול זה, הנושא הבא כבר יהיה באשכול חדש..
למי שעדיין לא שם לב, אכן דובר כאן הכל על צ'רידי, אבל יישמתי את זה בגדול דבר ראשון על קוזמאצ'..
*8002
חדי אוזן יכולים להשים לב למהירות התגובה של שלוחת שמיעת מצב הקמפיין ותרומות אונליין, לעומת מה שהיה בקמפיינים קודמים שלי עם צ'רידי שהיו באמצעות PHP.
בעזה"י בהמשך נשלים גם מול צ'רידי. (אולי עבור קמניץ?)
שוב תודה ענקית לכל אלו שיעצו ועזרו.
נ.ב. @david בהתחלה לא קלטתי את הרעיון של נוד, אבל לאחר הדוגמה הראשונה של @magicode וההסבר של @אהרן קלטתי מה התכוונת, ולכן נכנסתי לזה חזק.
כעת יהיה עלי לתכנן לפני כל מערכת באיזה שפה עדיף.. -
וויסות עומסים של שרתיםאולי חלק מנידון זה שייך לסעיף חומרה ולא לתכנות, אבל אני צריך את עזרת המתכנתים ולא כ"כ את הטכנאים...
אני משתמש בשרת לינוקס על AWS והתקנתי עליו LAMP.
אני מתכנת מערכות טלפוניות באמצעות API עם ימות המשיח.
רוב המערכות שלי בדר"כ זה PHP וMYSQL שמותקן על השרת והגישה עליו היא
ב localhost.
ב"ה בדר"כ לא חוויתי תקלות ואני מסתפק בשרת t3.small של 2 מעבדים ו 2 ראם.
בקמפיין של עטרת שלמה היה ב"ה עומס גדול, בפרט בערב, והתחלתי לחוש שהשרת שלי נושם עמוק מידי, לקח לו הרבה זמן תגובה.
מה שעשיתי למעשה, זה שהתחלתי לחלק את השלוחות לשרת אחר שהיה לי מוכן (שלוחת אידיש עבדה יותר מהר מי ששם לב, כי זה העברתי מיד על שרת נפרד, והתנועה בו הייתה דלילה יותר) ולאחר מכן הרמתי עוד שלושה העתקים של השרת ויצרתי שלוחה רנדומאלית בימות המשיח שתפנה כל פעם לשלוחה אחרת, שכל שלוחה מחוברת לשרת אחר.
למעשה שלוחת שמיעת מצב הקמפיין לא היה מחובר לד"ב, אלא חיבור ברגע אמת לשרתי צ'רידי לשליפות מצב הקמפיין. (ע"י file_get_contents)
בעת העומסים של הקמפיין הCPU היה בסך הכל בסביבות ה20 ,כאשר רובו הוא של httpd השרת אפאצ'י.
בדר"כ עיקר הCPU הוא מה SQL.
ובשרתים החדשים שהרמתי לקמפיין ג"כ הCPU נע בסביבות 10 רובו של httpd.
יש לי כמה נקודות שברצוני להבין.
א. נראה שהבעיה לא הייתה ביכולת המעבד כי כמו שכתבתי הCPU היה נמוך.
א"כ מה כן הבעיה?
ב. אם אני רוצה לאזן עומסין בין כמה שרתים, איך עושים את זה, והשאלה מורכבת בעיקר לגבי מערכות שכן צורכות SQL ואני צריך ד"ב אחיד, איך עושים בצורה שלא יאט את המהירות (האם יש מצב להגיע לאותו מהירות כמו בlocalhost כאדר הד"ב בשרת נפרד?)
ואיך זה מבחינת העלאת הקבצים לשרתים? איך יוצרים קבוצת שרתים שכולם מתעדכנים בקבצים חדשים? ואיך יוצרים IP שמחולק בצורה אוטומטית לפי עומסים, בין השרתים?
או אולי לבודד מראש כל מערכת לשרת/ים נפרד/ים, לפי העומס הצפוי להיות במערכת זו? א"כ מה לעשות לגבי המערכות הקבועות?
או להישאר עם שלוחה רנדומאלית בימות, שהיא תווסת את העומסים.כנראה יש עוד נקודות בנושא שעדיין לא בראש לשאול אותם.
אך בקיצור הייתי שמח לקצת הדרכה להתמודד עם עומסים ושרתים בצורה נכונה ומתוכננת מראש.בנוסף ישנם דברים שהייתי יכול לעשות ע"י SQL, לדוגמה, המערכת הייתה שולחת את מספר הטלפון לבדיקה מול צ'רידי האם קיים מתרים על מספר זה, וא"כ היה משמיע לו תפריט לשמיעת מצב התרומות שנתרמו על ידך, אחרת זה היה משמיע, לחיפוש מתרים ע"י הקשת המספר שלו הקש שתיים, וכו'.
כעת זה היה בנוי שהכל בוצע ישירות מול צ'רידי בכל שלב במערכת.
והאמת שהעדפתי להמנע מSQL כי חשוב לי מאוד שזה לא יקרוס.
השאלה היא האם כן היה עדיף לעשות אצלי בSQL טבלה של המתרימים, והמערכת הייתה בודקת אצלי האם קיים מתרים למספר הטלפון, ולהציע תפריט לפי זה.
ואז הייתי עושה סקריפט שפעם בעשר דקות / חצי שעה זה היה שולף את נתוני המתרימים מצ'רידי ומעדכן אותם בטבלה.
במקרה זה הייתי מעמיס יותר על הSQL ופחות על שליפת נתונים חיצוניים על ידי file_get_contents.
והאמת שניתן אפילו לעשות זאת לגבי התרומות עצמם, טבלת מצב הקמפיין שמתעדכן כל דקה, והמערכת תשלוף את הנתונים רק מהטבלה ולא מצ'רידי בכל שיחה.אשמח לחוות הדעת של המומחים כאן, איך ומה ניתן לעשות לגבי הנ"ל.
תודה -
אתגר: חישוב סדר אמירת תהילים בחודש אלול ועשי"תזה הקוד המלא ב JS
const Hebcal = require('hebcal'); const moment = require('moment'); let gematriya = require('gematriya'); let arr = [ '20220828', // א אלול תשפב יום ראשון '20250825', // א אלול תשפה יום שני '20240904', //א אלול תשפד יום רביעי '20260814', // א אלול תשפו יום שישי ]; let days = ['א', 'ב', 'ג', 'ד', 'ה', 'ו', 'ז']; for (let i in arr) { const data = arr[i]; let momentDate = moment(data); let HDate = new Hebcal.HDate(momentDate.toDate()); console.log('-------------------'); for(let i = 0; i < 40; i++) { console.log(getElulTehilimDay(momentDate, HDate), days[momentDate.day()], HDate.getMonth(), gematriya(HDate.getDate())); momentDate.add(1, 'days'); HDate = new Hebcal.HDate(momentDate.toDate()); } } function getElulTehilimDay(momentDate, HDate) { let weekDay = momentDate.day(); if (HDate.getMonth() === 6 || (HDate.getMonth() === 7 && HDate.getDate() <= 9)) { // הפונקציה אמורה להחזיר את מספר היום. הימים נספרים מתחילת חודש אלול 6 ועד יום כיפור שזה תאריך 10 בחודש 7. // ימי שישי ושבת אינם נספרים וכן ימי ראש השנה 1 ו 2 בתשרי, למעט יום 29 באלול שנספר גם אם הוא חל ביום שישי וכן ערב יום כיפור if ((weekDay === 5 && HDate.getDate() !== 29 && (!(HDate.getMonth() === 7 && HDate.getDate() === 9))) || weekDay === 6 || (HDate.getMonth() === 7 && (HDate.getDate() === 1 || HDate.getDate() === 2))) { return -1; } if (HDate.getMonth() === 6) { // חודש אלול //תחילת החודש אין שארית if (HDate.getDate() <= 7) { //כל עוד לא עברה שבת אין צורך למעט את שישי ושבת //ה weekDay מתחיל מ 0 ולכן יש להוסיף 1 if (weekDay + 1 >= HDate.getDate()) { return HDate.getDate(); } else { // אם התאריך גדול משבת יש להוריד 2 return HDate.getDate() - 2; // ר"ח אלול לא יכול לצאת בשבת ולכן תמיד יש להוריד 2 } } //הפרש הימים של השארית מחלוקה לשבועות, ההפרש נמדד ג"כ האם כבר עברה שבת בתוך ימי ההפרש או עוד לא let number = HDate.getDate() % 7; if (number > weekDay && number - weekDay > 2) { number -= 2; } // הרעיון הוא חלוקה לשבועות והכפלה עד 5 כי בכל שבוע יורדים 2 ימים ואז מוסיפים את השארית הנכונה return parseInt(HDate.getDate() / 7) * 5 + number; } else { //ערב יום כיפור if (HDate.getDate() === 9) { return 28; } else if (HDate.getDate() === 8 && weekDay === 4) { // בשנה שא' אלול ביום רביעי מפצלים את סדר 25 לשניים ואז אין 25 אלא רק 26 ו 27 return 27; } else if (HDate.getDate() === 7 && weekDay === 3) { return 26; } let RoshHashana = 2; // כשחל א אלול ביום רביעי ואז ראש השנה ביום חמישי if ((HDate.getDate() === 4 && weekDay === 0 ) || (HDate.getDate() === 5 && weekDay === 1) || (HDate.getDate() === 6 && weekDay === 2) || (HDate.getDate() === 7 && weekDay === 3) || (HDate.getDate() === 8 && weekDay === 4)) { RoshHashana = 1; } // כשחל א אלול ביום שישי, ראש השנה חל ביום ראשון if ((HDate.getDate() === 3 && weekDay === 1 ) || (HDate.getDate() === 4 && weekDay === 2) || (HDate.getDate() === 5 && weekDay === 3) || (HDate.getDate() === 6 && weekDay === 4)) { RoshHashana = 0; } // למעשה בחודש אלול יש תמיד 21 סדרים לא משנה באיזה קביעות שנים, וממילא תשרי מתחיל תמיד ב 22 if (HDate.getDate() <= 7) { if (weekDay >= HDate.getDate()) { return 21 + HDate.getDate() - RoshHashana; } else { return 21 + HDate.getDate() - 2 - RoshHashana; } } return (21 + parseInt(HDate.getDate() / 7) * 5 + (HDate.getDate() % 7)) - RoshHashana; } } // return -1; }
-
תכנות מהבית ומהמשרד, איך לשלב ביניהםאני עובד ככה:
בבית נייח עם IP קבוע, תיקיות העבודה, הן של קבצי הקוד (כולל node_module, מה אכפת לי, אני לא מתקין הרבה פעמים ספריות, ואפילו אם אני מתקין זה תוך כמה דקות מסתדר) והן של קבצים, שמע אקסלים וכו' של לקוחות נמצאים על הדרופבוקס.
יש לי מחשב נייד לעבודה מחוץ לבית, שם מותקנים לי כל התוכנות שלי (phpstorm וכו') כמו במחשב באותם נתיבים (כונן D)
בעיקרון אני משתמש עם RDP למחשב בבית כי הוא מעבד יותר חזק, אבל כשאין לי גלישה רציפה (בנסיעה מנס הרים וכדומה) אני פותח את התוכנות במחשב הנייד ועובד משם וזה מסתנכרן חזרה דרך הדרופבוקס מיד כשיש רשת, ואפילו תוך כדי נסיעה כשחוזר להיות קליטה יציבה אני חוזר לעבוד על המחשב הנייח באמצעות ה RDP.
אני מרוצה מזה
אציין שלפעמים חוויתי בעיה בהתקנת ספריות כאשר דרופבוקס פתוח, כי יש לו מנגנון של איתור מחיקות וכדומה שהיה מפריע למחוק תיקיות זמניות שנוצרו וכו'. התרגלתי להשבית את הדרופבוקס כשאני מתקין משהו, ומיד אח"כ מדליק שוב ונותן לשינויים להסתנכרן לגיבוי ולמחשב השני -
בסיס נתונים עם עמודות דינאמיות בדומה ל CRMיוצא לי לא אחת שאני צריך לתת ללקוח אפשרות של עמודות דינאמיות, דהיינו לכל לקוח שדות שונות באותה טבלה.
עד כה הייתי משתמש בטבלה עם עשר עמודות נוספות מעבר לבסיס הקבוע, והם נקראו בישראל "שדה נוסף 1" וכן הלאה.
אבל אני מחפש כעת להבין איך זה עובד בכל חברות ה CRM שכל לקוח יכול לשנות ולהוסיף עמודות וטבלאות לכאורה כאוות נפשו, הוא צריך אולי להגדיר את סוגי השדות אבל בתכלית ניתן להוסיף עמודות כצרכיו.
זה נוגע לי כעת שלקוח ביקש לי מערכת שתצטרך להיות לכאורה די דינאמית ומשתנה בין צורך לצורך.
כידוע MYSQL הינה שדה טיפוסית וחייבת הגדרה ברורה מראש של כל העמודות, ולכן הדרך היחידה העולה בפני לבצע זאת באמצעות MYSQL הינה לכאורה 3 טבלאות, אחת של שמות הטבלאות, והשניה של העמודות לכל טבלה, והשלישית של הנתונים עצמם משהו בסגנון של ( כמובן מזהה שורה A I), מזהה מנוי, מזהה טבלה, מזהה עמודה, והתוכן.
ובכל הצגת טבלה זה בעצם לעשות איזה שהוא סוג PIVOT לנתונים.
אבל נשמע לי די הזוי, די זולל משאבים ודי עבודה. (וייתכן מאוד שאני לא צודק, ואותו מנוע MYSQL שמטפל בהצגת טבלאות ועמודות רגילות יכול בקלות לעשות זאת מתוך הנ"ל באמצעות אינדקסים טובים).
למען האמת אני לא מכיר עדיין בסיסי נתונים אחרים.
אך יותר נשמע לי שהם משתמשים בבסיסי נתונים מסוגי אחרים, ששם אין צורך להגדיר מראש את השדות וזה נשמר יותר כמו אובייקטים בדומה ל JSON ואין צורך להגדיר כלום מראש, ואז יש רק טבלת נתונים וטבלת שדות (לצורך תצוגה, לתת ללקוח את המידע מראש של השדות הקיימים) והנתונים עצמם שמורים כל שורה כל העמודות כמו בטבלה מוגדרת מראש.
אשמח מי שיכול לשפוך קצת אור על העניין, ובעיקר איך ניתן לעשות זאת באמצעות הסביבה המוכרת שלי MYSQL..
תודה -
JS מחרוזת טקסט עברית הפוך עבור מדפסת קופה@yossiz כתב בJS מחרוזת טקסט עברית הפוך עבור מדפסת קופה:
@חוקר זה לא גופן שכל התווים ברוחב זהה? אם כן תוכל לדעת מראש איפה הוא יגלוש לשורה הבאה, ולחפש אחורה לרווח ושם לשבור שורה
בסוף הגענו לזה..
אכן במדפסת זו (80mm) ניתן להכניס בגופן הרגיל 48 תווים
לקחתי מכאן פונקציה לפיצול מילים
וב"ה זה התוצאהawait printer.text(typeof row.value === 'string' ? row.value.split('\n').map((line) => { return line.match(/\S.{1,48}(?=\s|$)/g).map(reverseRTLchars).join('\n'); }).join('\n') : row.value);
-
JS מחרוזת טקסט עברית הפוך עבור מדפסת קופה@yossiz כתב בJS מחרוזת טקסט עברית הפוך עבור מדפסת קופה:
@חוקר האם שמת לב לזה:
@yossiz כתב בJS מחרוזת טקסט עברית הפוך עבור מדפסת קופה:
אם יש טקסט שגולש לכמה שורות, צריך קודם לחלק לשורות, ואז להריץ בנפרד לכל שורה
צדיק אתה
לא שמתי לב
, אכן כעת זה תקין -
bootstrap-vue CSS יצירת משבצותתודה רבה לכל מי שעזר ולכל מי שרצה לעזור
זה המוצר הסופי
עשיתי את הdivים גובה לפי אחוזים.<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>תצוגה</title> <link type="text/css" rel="stylesheet" href="//unpkg.com/bootstrap@5.1.3/dist/css/bootstrap.min.css" /> <link type="text/css" rel="stylesheet" href="//unpkg.com/bootstrap-vue@2.21.2/dist/bootstrap-vue.css" /> <!-- Load polyfills to support older browsers --> <script src="https://polyfill.io/v3/polyfill.min.js?features=es2015%2CIntersectionObserver"></script> <!-- Required scripts --> <script src="//unpkg.com/vue@2.1.10/dist/vue.min.js"></script> <script src="//unpkg.com/bootstrap-vue@2.21.2/dist/bootstrap-vue.js"></script> <style> html, body { height: 100%; margin: 0; } body { background-image: url(image/background.png); background-repeat: no-repeat; background-size: cover; background-attachment: fixed; height: 100%; } .slot { background-color: rgba(0,0,255,.2); border: 3px solid #00f; min-width: 22%; height: 30%; } .card-header { background-color:white; color: #73496d; } .card-body { background-color:#73496d; border-radius: 0 0 0.25rem 0.25rem; color: white; } .my-row { height: 85%; } </style> </head> <body dir="rtl"> <div id="app" style="height: 100%"> <b-row class="my-row" no-gutters style="" > <b-col v-for="(val, key) in slotsA" cols="3" style="height: 30%" class="hidden-md-down"> <b-card class="text-center mb-4" style="height: 100%"> <b-card-header style="font-size: 4em;height: 50%" dir="ltr">{{val !== '' ? val.name : ''}}</b-card-header> <b-card-text style="font-size: 4em;height: 50%"><div style="height: 100%">{{ val !== '' && val.data ? 'חדר מספר ' + val.data : '' }}</div></b-card-text> </b-card> </b-col> </b-row> <div style="font-size: 7em;text-align: center">{{ time }} | {{ heDate }}</div> </div> <script> window.app = new Vue({ el: '#app', data: { slotsA: { 0: '', 1: '', 2: '', 3: '', 4: '', 5: '', 6: '', 7: '', 8: '', 9: '', 10: '', 11: '', }, time: '00:00', heDate: '', ProjectID: window.location.search.substring(1) || 1, List: [], }, created() { }, beforeDestroy() { }, computed: { }, mounted() { this.getData() this.nowClock() }, methods: { getData() { fetch('').then(response => response.json()).then(response => { console.log(response) if (response.heDate) { this.heDate = response.heDate } if (JSON.stringify(this.List) !== JSON.stringify(response.List)){ this.List = response.List; this.resetSlots() for (let i in response.List) { const element = response.List[i]; if (i === 12){ break; } this.slotsA[i] = {'name' : element.name, 'data': element.data} } } }).catch(error => { console.error(error); }); let this2 = this; setTimeout(() => { this2.getData()}, 5000) }, nowClock() { // this.timeClock = +' ' + new Date(Date.now()).toLocaleTimeString('en-US') const today = new Date() const h = today.getHours() const m = today.getMinutes() const s = today.getSeconds() // document.getElementById('Date').innerHTML = (('0' + today.getDate()).slice(-2)) + '/' + (('0' + (today.getMonth() + 1)).slice(-2)) + '/' + (today.getFullYear()) this.time = `${this.checkTime(h)}:${this.checkTime(m)}:${this.checkTime(s)}` if (!this.stopClock) setTimeout(this.nowClock, 1000) }, checkTime(i) { // eslint-disable-next-line no-param-reassign if (i < 10) { i = `0${i}` } // add zero in front of numbers < 10 return i }, resetSlots() { this.slotsA = { 0: '', 1: '', 2: '', 3: '', 4: '', 5: '', 6: '', 7: '', 8: '', 9: '', 10: '', 11: '', } }, } }); </script> </body> </html>