למה להמלט מהאיכון? מה אתה עבריין??
האיכון הוא לטובתך ולטובת הציבור, כדי שאם היית בקרבת חולה קורונה ונדבקת ח"ו לא תפיץ את זה הלאה..
וידועים דברי התוס' בב"ק שיותר יש לאדם ליזהר שלא יזיק, מאשר שלא יוזק..
למה להמלט מהאיכון? מה אתה עבריין??
האיכון הוא לטובתך ולטובת הציבור, כדי שאם היית בקרבת חולה קורונה ונדבקת ח"ו לא תפיץ את זה הלאה..
וידועים דברי התוס' בב"ק שיותר יש לאדם ליזהר שלא יזיק, מאשר שלא יוזק..
אז כמו שכתוב בכותרת C# גרסה 9 שוחררה באופן רשמי לפני כשבועיים.
זה חלק ממהלך יותר רחב של .net 5 שבעצם מאחד את 2 האפשרויות שהיו עד היום (core, framework) לבסיס אחד.
יש בה כמה חידושים מעניינים, נראה לי שאחד הרציניים והגדולים שבהם הוא ההכרזה על Record.
אפשר לקרוא על כך כאן, ותיכף אסביר בקצרה. אולם רק אקדים ואומר שבשביל זה צריך גם לעדכן את ויזואל סטודיו לגרסה 16.8 כדי שיתמוך בפיצ'רים החדשים.
אז מה זה בעצם רקורד? מאחורי הקלעים זוהי מחלקה (קלאס בלעז) רגילה לכל דבר וענין שהקומפיילר יוצר עבורנו, אבל מבחינתנו זה כעין סוג חדש של טיפוס נתונים - כעין 'מבנה' (struct, דהיינו כמו int וכדו').
אבאר את דברי:
כשאנו כותבים כך:
public record Person(string FirstName, string LastName);
אנחנו בעצם מקבלים מאחורי הקלעים קלאס עם המאפיינים של firstname וlastname, וגם קונסטרקטור שמאפשר לנו לתת את הערכים הללו והוא כבר ידאג להזין אותם למאפיינים, ועוד הרבה יכולות שתיכף נסקור.
רק חשוב להעיר, שrecord יוצר לנו קלאס שהוא Immutable דהיינו בלתי ניתן לשינוי. ובעיקר את הצורך הזה הוא בא לפתור.
אבל בואו נעשה סדר, ונתחיל מההתחלה.
רקורד כשמו כן הוא, רשומה.
הוא בא לפתור לנו את החסרון באובייקט רגיל שמכיל מאפיינים, שכדי להצהיר עליהם מיד לאחר השימוש היינו חייבים לעשות להם גטר וסטר ציבוריים, אחרת לא יכלנו מיד לאחר ההכרזה עליהם להזין להם ערכים.
לכן הוסיפו תמיכה בסטר חדש שנקרא init, כזה:
public class Person
{
public string? FirstName { get; init; }
public string? LastName { get; init; }
}
שמאפשר להזין ערך במשתנה רק דרך הקונסטרקטור, או מיד באופן הזה:
var person = new Person { FirstName = "Mads", LastName = "Nielsen" };
אולם לאחר מכן, כל ניסיון לגשת אליהם ולשנות להם את הערך נידון לכשלון!
הדבר הזה הוא נדרש הרבה פעמים כשמתשמשים בpattern של dto (data transfer object) כמו בגישה לדטהבייסים וכדו'.
בשביל זה לא צריך להשתמש בrecord, זה נתמך גם בclass רגיל. אולם הrecord מוסיף לנו עוד הרבה יכולות באופן מובנה.
with
למשל, מה נעשה כשאנו כן צריכים לשנות את הנתונים? בשביל זה אנו צריכים ליצור עותק של האובייקט הראשון, וכדי לחסוך לנו את העבודה אנו יכולים להשתמש ב with, ככה:
var person = new Person { FirstName = "Mads", LastName = "Nielsen" };
var otherPerson = person with { LastName = "Torgersen" };
זה ישכפל לנו את כל המאפיינים שיש באובייקט person חוץ ממה ששינינו עכשיו.
Equal
יתרון נוסף שאנו מקבלים בשימוש בrecord, הוא שמאחורי הקלעים יש לנו דריסה של הפונקציה Equal שלא הייתה שמישה באובייקטים, מכיוון שהיא משווה את הרפרפנס שלהם, ותמיד הם יהיו שונים מכיון שכל אובייקט מצביע למיקום אחר.וממילא לא יכלנו להשתמש בה כדי לבדוק האם האובייקטים מכילים את אותם ערכים למרות שהם שונים. עכשיו כשאנו משתמשים ברקורד, אנו יכולים להשתמש בפונקציה equal ואע"פ שהמצביעים הם שונים, אם הערכים שווים - התשובה תהיה חיובית. (מאחורי הקלעים יש כאן ovveride לפונקציה המקורית שיש לכל אובייקט בC#).
כמו כן, ניתן לכתוב כמו שכתבתי למעלה בשורה אחת, וזה חוסך לנו לכתוב קונסטרקטור שמקבל את הפרמטרים ומציב בפרופרטיס, וגם חוסך לנו לכתוב את הפרופרטיז הללו.
כמו כן הוא חוסך לנו לכתוב פונקציה שמקבל ערכים ומציבה בהם את הערכים הללו, ולכן אפשר עכשיו לכתוב ככה:
var (f, l) = person;
ונקבל במשתנה f את הערך שנמצא בfirstname וכן בl את הערך השני.
מה שנקרא deconstructor.
כל מה שכתבתי כאן מבוסס על הפוסט שהפניתי אליו, ואני ממש ממליץ לקרוא אותו למי שרוצה. כי נוספו שם עוד הרבה דברים מעניינים, ובקצרה רק אוסיף עוד 2 דברים מעניינים, שלא קשורים לrecord אבל נוספו לתמיכה של השפה:
not operator
נוסף גם האופרטור not שמאפשר לנו לכתוב ככה:
if(x is not null)
Target-typed new expressions
מה זה אומר? שאפשר לחסוך בהצהרה של שם המאפיין.
עד היום יכלנו לכתוב
var x = new Person();
ולא היינו צריכים לכתוב פעמיים person, עכשיו אפשר לכתוב באותה מידה:
Person x = new ();
והמהדר ידע לבד שהכוונה לPerson, כי זה מה שהצהרנו קודם. נחמד, אבל לא כזה מרגש, נכון? אבל עכשיו תראו איפה זה חוסך לנו הרבה כתיבה.
למשל אם אני רוצה להצהיר על ליסט של פרסון וגם לאתחל אותו עם הרבה ערכים. עד היום הייתי צריך לכתוב ככה:
var members = new List<Person>(){new Person("avi","cohen")}
;
וכן על זה הדרך.
היום מספיק לכתוב רק ככה:
var members = new List<Person>(){new ("avi","cohen"),new ("avi","cohen"),new ("avi","cohen")}
;
ותן לחכם ויחכם עוד, וכאן יש את הפירוט המלא של כל החידושים שנכנסו לשפה.
לא יודע אם זהו המקום,
אבל למרות שאני כבר כשלשה חודשים לומד תכנות וחיפשתי כל מיני מדריכים באינטרנט, הוא לא נזדמן לי עדיין.
והנה היום אינה ה' לידי ומצאתי את האתר הזה ובו מדריכים לשפות שונות:
ASP.NET JavaScript HTML5 CSS3 SQL PHP
אם זה יעזור למישהו - והיה זה שכרי.
(אני הסתכלתי בעיקר על הSQL ומצאתי שהוא מפורט ומסודר. לא יודע מה לגבי שאר השפות - אבל זה נראה שיש לו שם הרבה חומר!)
בהצלחה גדולה!
פורסם במקור בפורום CODE613 ב08/07/2015 23:49 (+03:00)
@odeddvir זה לא הבעיה, למרות שמה שהצעת אכן יפתור אותה.
הבעיה שהחבילה create-react-app לא מותקנת לה במחשב גלובלית, או לא מותקנת בכלל, ולכן הnpm לא מכיר אותה.
Npx זה דרך חדשה שנוספה בגרסאות אחרונות יותר של node שמאפשרת להשתמש בחבילה בלי להתקין אותה מקומית, ולכן התשובה שלך תעבוד והיא הדרך המומלצת.
לחילופין, אפשר להריץ את הפקודה
Npm i -g create-react-app
ואז זה יתקין את החבילה גלובלית, דבר שיאפשר להשתמש בה אחר כך מכל נתיב במחשב, אם כי זה פחות מומלץ, כדי להשתמש תמיד בגרסה האחרונה והעדכנית ביותר.
באוירת הימים הנוראים רציתי לשתף אתכם בפרוייקט שעליו אני עמל זה זמן מה, ומטרתו היא ליצור מאגר עדכני של כל המניינים בכל בתי הכנסת ברחבי הארץ.
המטרה כמובן היא לאפשר לכל מי שנמצא מחוץ לביתו ומחפש מנין לתפילה - למצוא בקלות את מבוקשו, בלא טרחה מרובה ובלא שיאלץ בסופו של דבר להתפלל יחיד באמצע הדרך.
השאיפה הסופית - אפליקציה שתוכל להתממשק עם WAZE על מנת לתכנן לאדם את מסלול נסיעתו מראש כך שיכלול בתוכו תפילת שחרית/מנחה/ערבית.
לדוגמא: אדם נוסע בבין הזמנים לצפון והוא יוצא בשעה 17:00 מירושלים הוא יכתוב בWAZE קרית שמונה, יבקש שהמסלול יכלול גם תפילת מנחה, והאפליקציה תדע לחשב לו האם הוא יוכל להתפלל מנחה בקרית שמונה, או שהוא יאלץ להתפלל באמצע הדרך, ואם כן היא תדע להכווין אותו לבית הכנסת הקרוב ביותר לנתיב הנסיעה שלו, כדי כמה שפחות להאריך לו את הדרך. (כמובן, שהוא יכול לבקש שזה ימצא לו מנין בנוסח חסידי או ליטאי וכדו', והיא תדע לשקלל את כל הנתונים).
אני חושב שזה דבר שחסר היום. כשאני נוסע לכל מיני מקומות שאינני מכיר, ואני צריך לחפש איפה יש בית כנסת באיזור ומתי יש בו מנחה או מעריב, הייתי שמח אם היה לי את המידע הזה בצורה יותר נגישה.
אני לא יודע אם זה פרוייקט רווחי כלכלית, אבל אני בטוח שהוא רווחי בעולם האמת, וזה הרי העיקר בחיים
לשם כך צריך להגדיר כמה שלבים:
שלב א - בניית מסד נתונים שכולל מידע על כל בתי הכנסת בישראל, שמם, מיקומם (כולל נ.צ. ע"מ לאפשר ניווט), נוסח התפילה בהם, פעילות (ימות חול, או רק בשבתות וחגים). וכן מידע על המניינים המתקיימים בהם - זמן, נוסח, וכו'.
כמובן, כדי שזה יהיה עדכני כמה שיותר, צריך להפיץ את זה כדי שאנשים המשוגעים לדבר יהיו מוכנים לעדכן את הפרטים על המניינים באיזור מגוריהם. וכן צריך לכתוב נוסחה שתדע לחשב את זמני התפילות העדכניות, (למשל מנחה 20 דק' לפני השקיעה, אז צריך לדעת מתי השקיעה ולעדכן את הזמן לכל יום. ואם זה 20 דק' לפני השקיעה אבל מתעגל כלפי מעלה או מטה וכו').
שלב ב' - לבנות אתר שידע לזהות את המיקום של המשתמש ולהציג לו את המניינים הנמצאים ברדיוס הקרוב אליו. וכן לאפשר לו לחפש בית כנסת כרצונו.
שלב ג' - לבנות אפליקציה או אתר שידע להתממשק עם WAZE לקבל ממנו את המידע על עומסי התנועה וכו', וע"פ זה הנתונים הללו ונתוני זמני התפילות ומיקומי בתי הכנסת - לבנות למשתמש מסלול נסיעה מתאים.
אני יודע ששלב ג' - הוא עוד רחוק.. אבל גם הוא יגיע..
העיקר זה קודם לבנות את מסד הנתונים. לשם כך צריך לבנות גם דטהבייס נכון, וגם ממשק משתמש שיאפשר לו להוסיף בתי כנסת.
הנה קישור לדף ראשוני שיודע להמיר את הכתובת שהמשתמש מזין לנ.צ. ע"מ לשמור במסד הנתונים את הLocation בלע"ז של בית הכנסת. לאחר שהמשתמש לוחץ על עדכן נ.צ. מוצגת לו מפה והוא מתבקש לאשר את המיקום וכך בית הכנסת נוסף לרשימה (זה עדיין לא עובד בקישור הנ"ל.. )
לגבי הדטה בייס, פתחתי פרויייקט נפרד שמספק API לנתוני בתי הכנסת והמניינים.
אני עובד בשיטת code-first והמודל שלי מכיל 2 מחלקות, הראשונה עבור בתי כנסת:
namespace SynagoguesAPI.Models
{
public class Synagogue
{
public int ID { get; set; }
[Display(Name = "שם בית הכנסת")]
public string Name { get; set; }
[Display(Name = "עיר")]
public string City { get; set; }
[Display(Name = "רחוב")]
public string Street { get; set; }
[Display(Name = "מספר בית")]
public string Number { get; set; }
[Display(Name = "מיקוד")]
public string ZipCode { get; set; }
[Display(Name = "נ.צ.")]
public DbGeography Location { get; set; }
[Display(Name = "נוסח")]
public nosachPrayer Nosach { get; set; } = nosachPrayer.All;
//תת נוסח מכיל מידע בשפה חופשית - כגון "ליטאי", "חסידי", "ירושלמי", "מרוקאי" וכו'
[Display(Name = "תת-נוסח")]
public string SubNosach { get; set; }
[Display(Name = "פעילות")]
public activity Activity { get; set; } = activity.AllDays;
public ICollection<Minyan> Minyanim { get; set; } = new List<Minyan>();
}
public enum activity
{
[Display(Name = "כל הזמן")]
AllDays,
[Display(Name = "שבתות וחגים")]
Saturdays
}
public enum nosachPrayer
{
[Display(Name = "לפי החזן")]
All,
[Display(Name = "אשכנזי")]
Ashkenazy,
[Display(Name = "ספרדי")]
Safaradi,
[Display(Name = "תימני")]
Teymani,
[Display(Name = "אתיופי")]
Etyopi
}
}
השנייה מכילה את הנתונים על המניינים:
public class Minyan
{
public int ID { get; set; }
/// <summary>
/// סוג התפילה (שחרית/מנחה/ערבית וכדו
/// </summary>
[Display(Name = "שם התפילה")]
public string Prayer { get; set; }
[Display(Name = "שעת התחלה")]
public string TimeStart { get; set; }
/// <summary>
/// קצב התפילה
/// </summary>
[Display(Name = "קצב התפילה")]
public rate Speed { get; set; }
}
public enum rate
{
[Display(Name = "רגיל")]
Normal,
[Display(Name = "מהיר")]
Fast,
[Display(Name = "איטי")]
Slow,
[Display(Name = "משתנה")]
Changing
}
אשמח לשמוע רעיונות, עצות, הערות והארות..
יישר כח לכל מי שקרא עד כאן :lol:
אברהם
פורסם במקור בפורום CODE613 ב05/10/2016 22:49 (+03:00)
@שוהם307
הפורום הזה בנוי מבוסס על NodeBB שזה פלטפורמה לפורום בקוד פתוח ובחינם.
הנה קוד המקור - https://github.com/NodeBB/NodeBB
הנה מדריכי התקנה: https://docs.nodebb.org/
מי שיש לו קצת חוש טכני והבנה בתכנות או בIT יכול להרים לך את זה יחסית בקלות
צריך לקחת שרת לינוקס (מומלץ אובונטו), להתקין עליו node שזה ממש שטויות, להתקין מונגוdb שזה הדטהבייס, ואז את הפורום.
(אם רוצים אפשר להוסיף גם Nginx, וגם זה לא מסובך למי שמבין קצת).
הנה מדריך לאובונטו - https://docs.nodebb.org/installing/os/ubuntu/
@שמואל4 נראה לי שהתכוונת ל phpBB שהוא ישן יותר, כי דווקא nodeBB הוא חדש יותר.
ואיש אבטחה לא צריך. מספיק מתכנת שיודע מה הוא עושה (אא"כ הפורום שלך נועד לצרכים סודיים..)
אחרי זה יש לפורום הזה כל מיני פלאגינים שמאפשרים לך להוסיף לו יכולות, אפשר לבנות עיצובים מותאמים אישיים וכדו', אבל זה ידרוש עוד יותר הבנה והיכרות עם הפלטפורמה.
כמובן, שאיש מקצוע יקח לך על זה כסף, אבל אם יש לך חוש וזמן - לך על זה בעצמך ותשחק עם זה קצת עד שתצליח.
לדעתי 150 לשעה זה לא מחיר זול.
לא יקר, אבל גם לא זול.
זול זה 50-80 לשעה ואז הגיוני שאתה לא יודע sql וכדו'.
אם אתה לוקח 150 זה אומר שאתה יודע ומכיר את השפה בה אתה עובד.
אני חושב שהחילוק הוא בין אי הכרת השפה, לבין אי הכרת ספריות.
למשל אם אתה לא יודע אנגולר, אתה לא תקח 150 ₪ כשאתה לומד אנגולר. אבל אם אני לא מכיר את ספריית מטריאל של אנגולר, אין בעיה לקחת את המחיר הנל.
לגבי תמחור לשעה, כשאני לוקח לפי שעה, אני אומר ללקוח שהמחיר הוא לפי שעת עבודה, אבל אני לא שכיר שלו.
זה אומר שאני לא עומד עם סטופר, ואני מודד את הזמן ביחידות של רבעי שעה וכדו', וזה בסה"כ הדרך שלי לתמחר לו את הפרוייקט.
דבר נוסף, מתכנת טוב זה לא רק האם הוא יודע איך לעשות שהקוד יעבוד, אלא כמה הקוד כתוב בצורה נכונה, עם יכולות תחזוק והרחבה. כמה הוא יודע להשתמש בדפוסי תכנות (design pattern), והאם הוא לא רק יודע מה לעשות כדי שהקוד יעבוד, אלא גם מבין מה הקוד עושה ואיך הוא עובד...
לאחרונה נחשפתי (במסגרת הפרוייקט שאני עובד עליו) לדטה בייס שלא הכרתי בשם PostgreSQL
דטה בייס רילציוני חזק מאד עם הרבה מאד יכולות עסקיות, והכל בקוד פתוח וברשיונות חופשיים לחלוטין!!
כמו כן, יש לו יכולת גם של NoDB, תמיכה מובנית בJSON וב- BSON (שזה json בינארי), ועוד ועוד.
הרצאה בעברית עליו:
יש גם דרייבר לדוטנט, כולל אנטיטי פריימוורק בספריה בשם npgsql הנמצאת בכתובת: http://www.npgsql.org/index.html
ולקינוח הרצאה בעברית ע"י המפתח הראשי של הדרייבר הזה:
נהניתי מאד לשמוע את ההתחלה, כמה איש לינוקס בכל אבריו מהלל ומשבח את מייקרוסופט על התפנית שעשו בשנים האחרונות. במיוחד בשעה ו14 דקות לערך הוא מסכם ואומר את דעתו האישית (כמי שעבד הרבה עם Java python perl ) שC# זו השפה הכי טובה היום!!! (כמובן למי שאוהב שפה סטטית :lol: )
**גילוי נאות:**היום אני עובד בעיקר עם JS ונהנה מאד מהחופש המוחלט שהיא נותנת, ועוזרת לך להתמקד בתכנות נטו ולא להצהיר כל הזמן על מחלקות ואינטרפייסים וכו'. אבל 2 צדדים למטבע
פורסם במקור בפורום CODE613 ב19/08/2017 21:44 (+03:00)
@שואף
הראשון זה 12.5 אינץ'
השני זה 14 אינץ'.
כלל זה יהא נקוט בידך: הסדרות של לנובו טינקפייד, המספר הראשון מציין גודל מסך, השני את הדור של המעבד.
למשל x230 שווה למסך 12.5 ומעבד מדור 3.
X270 אותו גודל מחשב, דהיינו 12.5 אינץ', אך מעבד מדור 7, ולכן זה אומר שהמחשב חדש ממנו ב4 שנים בערך ( מבחינת שנת ייצור).
וכן עם T400 או t460.
T X L זה מציין את הסדרה של המחשב, דהיינו איזה רמה עסקית זה
אצל hp זה שונה, הספרה הראשונה מציינת את הסדרה, דהיינו הרמה של הדגם, למשל 400 פרו פשוט 600 פרו יותר מתקדם, 700 ו800 זה הטופ..
השניה את גודל המסך למשל 820 זה 12.5 אינץ' ו840 זה 14. אם בסוף יש 5 למשל 825 זה אומר מעבד של amd ולא אינטל.
@nigun אמר בכניסה לעולם התיכנות:
(אני ממליץ לא להתעכב על כל ההסברים של מערכים, תעבור על זה מלמעלה להבין את הרעיון ותמשיך הלאה
ואחר כך תלמד את זה בעת הצורך)
אני חולק על הנקודה הזאת.
לדעתי חשוב קודם להבין את הבסיס בצורה טובה, אח"כ לא כ"כ משנה איזה שפה תבחר - אתה תדע להשתמש בה יחסית בקלות.
כי בסוף כל השפות משתמשות במשתנים פרימיטיביים ומורכבים, מערכים ואוספים למיניהם, לולאות פונקציות וכו'.
זה הבסיס של הבסיס של עולם התכנות, והבנה טובה של ההבדל בין משתנה פרימיטיבי למשתנה מורכב/אובייקט או איך שלא קוראים לזה - יכולה לחסוך לך אחכ הרבה באגים.. (למשל אם אתה לא מבין שאובייקט הוא בסהכ מצביע לתאים בזכרון, וכל עוד לא עשית העתקה עמוקה - אתה מחזיק את אותו רפרנס במקומות שונים - לא תבין למה פתאום המידע השתנה לך בלי שבכלל התכוונת לזה..)
אם יש לך את הספר של ברזיק על JS - לדעתי תתחיל איתו.
עברתי על חלק ממנו, הוא עשה עבודה טובה, הוא מסביר שם את כל הדברים הללו בצורה מאד ברורה, ואם תעשה את כל התרגילים שלו - יהיה לך את הבסיס של התכנות ומעבר לו - ומשם יהיה לך הרבה יותר קל להתקדם.
בהצלחה!
gcm זה היה התקן הישן של גוגל.
היום זה fcm כיון שזה עובד דרך פיירבייס (כל מה שנשלח לאנשים שגולשים בכרום).
PushNotification זה בעצם API שכל הדפדפנים תומכים בו, מאחורי הקלעים כל דפדפן מממש את זה אחרת.
גוגל משתמשים בfcm, פיירפוקס דרך משהו שלהם, וכנ"ל מיקרוסופט לאדג'.
כדי להרחיב על התקן של זה, אתה יכול לקרוא כאן באתר של MDN.
כמו כן, אתה יכול להרחיב עוד בנושא, אצל גוגל כאן.
מימשתי את זה בעבר בעצמי, וחשבתי לכתוב על זה מדריך, אבל אין לי זמן..
בקצרה, כדי להקפיץ הודעות פוש אתה צריך להשתמש בservice worker באתר שלך (דהיינו שירותים שפועלים גם כשהדפדפן סגור).
אחרי זה, אתה כותב קוד בקליינט שמקפיץ ללקוח הודעה לאשר הודעות פוש, כשהוא מאשר זה מחזיר לך אובייקט שמכיל את המזהה של הלקוח, את הURL שאליו אתה אמור לשלוח את הודעת הפוש, ועוד כמה מאפיינים של הצפנה.
אתה מקבל את זה ושולח לשרת שלך, ושומר את זה בדטה בייס תחת המזהה של הלקוח שלך (הכי טוב - תבנה לזה טבלה נפרדת).
כשאתה רוצה לשלוח הודעת פוש, אתה צריך לרוץ בלולאה על כל הלקוחות שאתה רוצה להקפיץ להם את זה, ולשלוח לכל אחד לURL שלו את ההודעה (יש לזה מבנה מסוים, תסתכל בתיעוד שהפניתי אותך אליו), כולל המאפיינים של ההצפנה. וזהו.
מכאן הדפדפן אמור לדעת להקפיץ למשתמש את ההודעה.
אם אתה רוצה, אתה יכול להשתמש בפיתרון מובנה של פיירביס לזה (ששולח לכל הדפדפנים, לא רק לכרום), יחסוך לך את הכאב ראש של הפיתוח. מאידך אתה צריך לקרוא את התיעוד שלהם, ולעבוד לפי הדרישות שלהם.
גיסון זה בסה"כ דרך מוסכמת להעביר מידע, כמו שיש XML כך יש תקן של ג'יסון, שזה אומר אובייקט שמכיל מפתחות וערכים, וכל מפתח יכול להכיל ערך של עוד מפתחות וערכים. זה בעצם ממש דומה לאובייקט JS מכאן השם JSON - Java script object notation.
בניגוד לXML הוא הרבה יותר קל, (קובץ גיסון שוקל הרבה פחות מקובץ XML. כמו כן, הוא הרבה יותר קריא וברור, וכיון שכל הקליינטים משתמשים בJS, ובJS מאד נח לעבוד איתו - הוא הפך להיות מאד מאד נפוץ בשימוש להעברת מידע בין משתמשים.
עד כאן להקדמה הקצרה.
מכאן נסיק שהשרת כלל לא משנה לו מה השם של האובייקט שאתה קורא לגיסון שלך, מה שמשנה זה המבנה של הגייסון.
למשל בדוגמא שהבאת אתה צריך לשלוח לAPI שלך שם משתמש וסיסמה, ואז אתה מקבל בחזרה תשובה במבנה של אובייקט, שמכיל כמה מפתחות (או מאפיינים):
הראשון הוא result שהוא מכיל את הערך SUCCESS במקרה של הצלחה, או משהו אחר אם זה נכשל.
השני message שמכיל את ההודעה וכן על זה הדרך.
אם מפתח מכיל ערך של אובייקט, אז הוא יכיל ערך שנפתח ונסגר בסוגריים מסולסלים {}, כמו שמתארים אובייקט בJS.
אם הוא מכיל מערך, אז הוא יכיל ערך שנפתח ונסגר בסוגריים מרובעים [] כמו שמתארים מערך בJS.
נקודה חשובה, גייסון תקני לא יכול להכיל הערות, וכן כל מאפיין חייב להיות מוקף בגרשיים.
מקוה שעזרתי
@nigun אמר בהאם V תהיה השפה הבאה?:
@yossiz
שמעתי רק על dart erlang scala
ואני לא מצאתי סיבה ללמוד אותם
דווקא אני כן מצאתי סיבה ללמוד את dart
היום גוגל דוחפים בכל הכוח את flutter שבנוי על דארט
זה בעצם אמור להחליף את JS ונועד לכתיבת אפליקציות קרוס פלטפורם, ועכשיו הוסיפו גם תמיכה לווב (אם כי עדיין לא מלאה..)
וממה שמעתי מחברים שעובדים איתה האפליקציות הרבה יותר מהירות, ויחסית קלה ללמידה (מזכירה JS או יותר נכון TS).
אז עדיין לא התחלתי ללמוד (רק להתקין סביבה..) אבל שמתי עליה עין..
ובכלל הייתי ממליץ לשים עין על הנושא של web assembly שאין לי עדיין מספיק מושג מה זה אומר, אבל אני שם לב שזה הולך ותופס תאוצה...
וזה התשובה של מייקרוסופט לזה Blazor...
שזה בעצם מאפשר לכתוב בC# (דוטנט קור) לדפדפן.
(כלומר, אם אני מבין נכון ווב אסמבלי בעצם אומר שאתה כותב קוד שמתקמפל לבינארי והדפדפן ידע להריץ אותו, וזה מתחיל לתפוס תאוצה, מה שבעצם יאפשר למפתחים לא להזדקק עוד לחסדי JS אלא לכתוב בשפות שהם אוהבים, והם יוכלו להשתמש בכל הקוד הקיים שלהם ולהשתמש בו גם לפיתוח קליינט).
@אהרן תודה על הברכות!
ריאקט מנהלת דום וירטואלי, כמו שאתה יכול לראות כאן. כלומר, בעצם כשאתה כותב בריאקט אינפוט, דיב וכדו', אתה בעצם מתייחס לאובייקט JS של ריאקט שמייצג אלמנט, אבל לא את האלמנט עצמו. לריאקט יש מנגנון פנימי שיודע לזהות כשנעשים שינויים, ולזהות היכן השתנה, וממילא לרנדר לדום רק את המקום בו התרחש השינוי. כמו כן, כשיש לך ליסט של אלפי איטמים, הוא יוצר על המסך רק את האיטמים הרלבנטים, ומה שלא מוצג - פשוט לא קיים.
הדבר הזה נותן לריאקט יכולות רינדור ועדכון מהירות מאד.
מצד שני, הקונספט של ריאקט של ערבוב הקוד והHTML יחד, הוא מאד נח לפיתוח, אבל לטעמי בטווח ארוך ככל שהאפליקציה גדלה - קשה יותר לתחזוקה ולהבנה.
באנגולר, המנגנון עובד בצורה שונה. אנגולר לא משתמשת בדום וירטואלי אלא בדום האמיתי, אלא שיש לה מנגנון פנימי שמאפשר לדעת היכן התרחש השינוי ולעדכן בהתאם.
מה שיוצר לך בעיה כשאתה מציג טבלה עם כמויות גדולות של מידע, כי הכל מתרנדר לדום ישירות (אע"פ שהוא לא מוצג כרגע בטבלה או בליסט או במה שלא יהיה..)
הפתרון לזה הוא גלילה וירטואלית, שבעצם יוצרת אלמנטי HTML רק למה שמוצג כרגע במסך, וכל השאר לא קיים. וכשהגלילה משתנה, בעצם אנו מרנדרים ומחליפים את הדום. (בדומה למה שריאקט עושה באופן מובנה).
בגירסה 7 של אנגולר, נוספה לזה תמיכה מובנית בספריה.
עיין כאן
וכאן דוגמה למימוש של זה בstackblitz
@ש-ב אני למדתי מהספר הזה , בגרסה יותר ישנה שלו.
בכל זאת, עברו מאז 6 שנים.
לטעמי הוא מספיק טוב, ובניגוד ל@OdedDvir אני כן ממליץ ללמוד אם אפשר בצורה מסודרת, ולהבין טוב מה אתה עושה. ולא רק ללמוד תוך כדי תנועה..
כשאתה מבין את התיאוריה מאחורי הדברים, זה עוזר לך לכתוב בצורה יותר נכונה ומהירה.
ולהבין את הבסיס של html ו css בשביל שימוש יומיומי, זה לא ככ מסובך.
לעניות דעתי, זו שאלה בסטטיסטיקה ולא במתמטיקה.
מתמטיקה זה מדע מוחלט, 1+1=2.
כאן אין תשובה נכונה ולא נכונה, כי גם אם ההסתברות שהדלת שהוא בחר זה 1/3 נכון, ולכן עדיף לו לשנות את הבחירה כדי שיהיה לו 2/3, עדיין יכול להיות שהשליש היה נכון ועכשיו הוא יפסיד ולו אין הזדמנויות נוספות..
לכן, אין כאן אמת מוחלטת, יש סיכויי הצלחה יותר גבוהים.
לדעתי זה בתחום מדעי ההסתברות, לא מתמטיקה טהורה.
איזה כיף! סוף סוף יש דיון מעניין
אין לי תשובה לשאלה שלך, אבל בתור אחד שבא מPHP (שרק עכשיו נחשפתי אליה בקוד של לקוח שלי..) אז מניח שיהיה לך הרבה יותר קל להגר לJS מאשר לC#.
JS יותר דומה לPHP מאשר לC#.
C# היא שפה עם טיפוסיות חזקה, כל דבר צריך להצהיר עליו לפני (מחלקות וכו') ואתה לא יכול פשוט לכתוב וזהו. אין דבר כזה.
(הערת אגב - דווקא היום נראה שיש אופנה חזקה בJS לאמץ את הצדדים הללו של C#. הרבה אנשים עוברים לאמץ את התכונות של הטיפוסיות החזקה מC#, ועוברים להשתמש בTS (טייפסקריפט בלע"ז). לאט לאט אני שומע על הרבה מתכנתים שכבר לא משתמשים בexpress בnode, אלא בnestjs שהוא כעין אנגולר לשרת נוד. (בסוף כשאתה כותב פרוייקט לטווח ארוך, גם אם הוא פרוייקט קטן - זה מצדיק את עצמו. הפרוייקט בנוי בצורה מסודרת, כל אחד יכול להבין מה הולך בפנים, מה אתה מצפה מעביר לפונקציה / מחזיר ממנה וכו').
לעצם הצורך שלך, אני בכלל לא מבין למה אתה לא יכול להמשיך להשתמש בקטע קוד שאתה מריץ אותו בcron? מה רע לך בזה? ודווקא ספציפית לזה לא בטוח שנוד הכי טוב..
נוד עובד על תהליך (פרוסס) אחד, והוא משתמש בצורה אסינכורנית כדי לענות לאלפי בקשות בו זמנית. אבל דווקא בדברים שצריך בהם הרבה גישה לקבצים וכדו' (I/O) מקובל לומר שזה לא הצד החזק שלו.. וכן אם אתה צריך הרבה חישובים בדרך - זה גם לא הצד החזק של נוד. (ואם הבנתי אותך נכון, אתה צריך סקריפט שפונה לדטה בייס, עושה חישובים ואז מבצע פעולות, וכלל אין צורך להחזיר תשובה ללקוח..)
נוד נועדה לאפליקציות מרובות בקשות בו זמנית, וזה אכן הצד החזק שלה. (למרות שהיום .net core לא פחות מהיר ואולי אפי' יותר, תעשה חיפוש בגוגל ותמצא מלא השוואות ביניהם).
אז כמו שדוד כתב - תוודא מה בדיוק הצרכים שלך (חישוביות / גישה להרבה קבצים או דטה בייס / החזרת תשובה ללקוח וכו'), ותעשה השוואה אחד מול השני מה יותר יעיל לך. שניהם אהובים טובים וברורים, ובשניהם יש עבודה ודרישה.
אם כי כמו שאמרתי בהתחלה, ללמוד JS בלי להבין יותר קל ומהר, מאשר ללמוד C#..
"מעולם לא זזה שכינה מהכותל המערבי"
"המטה המשותף למען הכותל" פתח בקמפיין מימון המונים לצורך סיוע במאבק נגד הרפורמים המנסים לחלל ולפגוע בקדושת הכותל.
המטה מארגן מדי ראש חודש - תפילות ושיעורים ברחבת הכותל הדרומי, כדי למנוע את חילול הקודש והמקדש שמנסות לעשות הרפורמיות מדי חודש בחודשו.
מימון ההסעות וההוצאות נקלע לקשיים, ועכשיו הם מבקשים את עזרת הציבור.
ניתן לתרום בקישור הזה: https://www.jgive.com/new/he/ils/donation-targets/24640
אני יודע שלאחרונה היו הרבה התרמות, וכבר לא נשאר לנו כ"כ מה לתרום. אבל בכל זאת, למען המטרה הנעלה הזאת, למען קדושת הכותל שאין לו יחצני"ם ואין לו עסקנים ואין מי שידאג עבורו - נעשה מאמץ קטן ונתרום כל אחד כפי מיסת ידו.
מוזמנים לתרום בהמוניכם למען קדושת הכותל, ויהי רצון שבזכות זה יתקיים בנו "ותחזינה עינינו בשובך לציון ברחמים", ונזכה לבנין בית המקדש בב"א.
התרומה מוכרת לסעיף 46 להחזרי מס
הפרסום באישור ההנהלה
בעבר צירפתי פה מחלקה לשליחת מיילים מגימייל דרך C#.
אתה יכול לצרף אותה לפרוייקט שלך.
והנה מימוש שלי לאפשר ללקוח שליחת מייל בפרוייקט WEB
(ASP.NET MVC)
הנה קוד הHTML (משתמש בrazor):
כמו כן אני משתמש בספריות: bootstrap3 - עבור העיצוב
select2 - לא חובה
CKEditor - כדי לתת למשתמש להזין טקסט בפורמט HTML
@model ContactApp.UI.ViewModel.MessageToContactVM
@{
ViewBag.Title = "כתיבת הודעה";
}
@Styles.Render("~/bundlesContent/datepicker")
<script src="~/Scripts/ckeditor/ckeditor.js"></script>
<script src="~/Scripts/ckeditor/config.js"></script>
<link href="~/Scripts/ckeditor/styles.js" rel="stylesheet" />
<div class="row col-lg-12">
<div class="panel panel-primary">
<div class="panel-heading">
<h3 class="panel-title">שליחת מייל</h3>
</div>
@using (Html.BeginForm("Create", "Email", FormMethod.Post))
{
<div class="panel-body">
@Html.AntiForgeryToken()
<div class="form-horizontal">
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
<legend>כתוב הודעה</legend>
<div class="row">
<div class="col-md-12">
<div class="form-group ">
@Html.LabelFor(model => model.AllContactsId, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.ListBoxFor(model => model.AllContactsId, new SelectList(ViewBag.AllContactsList, "Id", "FullName", null), new { @class = "form-control select2-general",id="allContactsList" })
@Html.HiddenFor(model => model.ToContactsId, new { id="toContactsId"})
@Html.ValidationMessageFor(model => model.AllContactsId, "", new { @class = "text-danger" })
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-md-12">
<div class="form-group ">
@Html.LabelFor(model => model.Title, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Title, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.Title, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group ">
@Html.LabelFor(model => model.Body, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.TextAreaFor(model => model.Body, new { @class = "form-control" ,id="editor1"} )
<script>
CKEDITOR.replace('editor1');
</script>
@Html.ValidationMessageFor(model => model.Body, "", new { @class = "text-danger" })
</div>
</div>
</div>
<div class="col-sm-6">
</div>
</div>
</div>
</div>
<div class="panel-footer">
<div class="row">
<div class="form-group">
<div class="col-md-12">
<a href="" class="btn btn-primary btn-small pull-left ">ביטול</a>
<input type="submit" value="שלח" class="btn btn-primary btn-small pull-left" />
</div>
</div>
</div>
</div>
}
</div>
@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
@Scripts.Render("~/bundles/datepicker")
<script>
$(".select2-general").select2({
language: "he",
dir: "rtl"
});
$('#allContactsList').on('select2:select select2:unselect', function (e) {
var items = $(this).val();
$('#toContactsId').val(items);
})
$('form').submit(function () {
//alert(CKEDITOR.instances.editor1.getData());
$("input[Body]").html(CKEDITOR.instances['editor1'].getData());
})
</script>
}
והנה הקוד בצד השרת ששולח את ההודעה:
[HttpPost, ValidateInput(false)]
public async Task<ActionResult> Create(MessageToContactVM message)
{
if (ModelState.IsValid)
{
//לשנות למזהה של בעל התוכנה
message.FromContact = 3;
message.DateSend = DateTime.Now;
message.Status = (int)StatusMessage.Send;
message.TypeSend = (int)TypeSendMessage.Email;
var gmailMssg = new MessageGmail()
{
Subject = message.Title,
//אני עוטף את התוכן שהמשתמש הזין בדיב חיצוני, כדי ליישר את המייל לימין
//כמו כן, אולי זה יכול לעזור גם לאבטחה???
Body = "<div style=\"direction:rtl\">" + message.Body + "</div>",
IsBodyHtml = true
};
//מאפשר שליחת אותה הודעה לנמענים מרובים
foreach (var item in message.AllContactsId)
{
var temp = await Repository.Get<ContactVM>(item) as ContactVM;
gmailMssg.ToList.Add(temp.FullName, temp.Email.Split(',')[0]);
}
try
{
var success = SendGMail.SendEMail(gmailMssg);
await MapObjToUI.CreateObjInDAL(message);
}
catch (Exception ex)
{
throw ex;
}
return RedirectToAction("Index");
}
await LoadParameterForViewBagCreateViewAsync();
return View();
}
וככה זה נראה:
זה ההתחלה, ואתה יכול לקחת את זה הלאה לאן שאתה רוצה.
אפשר גם לצרף קבצים על ידי שימוש במאפיין:
gmailMssg.ListFileAttachment.Add()
בהצלחה!
מקווה שקצת עזרתי.
פורסם במקור בפורום CODE613 ב06/06/2017 01:19 (+03:00)
לא יודע מה הסיבה.. אני עדיין לא מצליח, באמת חשבתי שזה בגלל הסינון, אבל לשרת אחר הצלחתי להתחבר ולהעלות אליו את הקבצים, כך שאין לי מושג מה הבעיה שם, ואין לי כח אליהם, אז נראה לי שאבטל שם את החשבון..
בכל מקרה מוזמנים לגלוש לכתובת ולתת לי רשמים על האתר, ועל התוכנה.
זו התוכנה שעבדתי עליה והתייעצתי בנוגע אליה
בכל אופן התוכנית הייתה יותר להשקיע בה, אבל כרגע אין לי זמן, ולכן החלטתי לשחרר את זה לציבור בחינם - לזכות את הרבים!
אז תודה לכולם על כל העצות והעזרה לאורך כל הדרך!! או כלשון הפסוק "מנעורי ועד היום הזה" :lol:
שהרי לולי המקום המדהים הזה, לא נראה לי שהייתי מצליח להתקדם בלימוד התכנות..
פורסם במקור בפורום CODE613 ב02/11/2016 20:25 (+02:00)