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

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
רפאלר

רפאל

@רפאל
אודות
פוסטים
186
נושאים
3
קבוצות
0
עוקבים
3
עוקב אחרי
0

פוסטים

פוסטים אחרונים הגבוה ביותר שנוי במחלוקת

  • API לקבלת מידע יהודי על תאריך
    רפאלר רפאל

    יש את Zmanim Project שנכתב במקור בשפת JAVA ע"י יהודי מלייקוד בשם אליהו הירשפלד, בשל הצלחתו הגדולה, הפרויקט הועתק לשפות רבות נוספות ביניהם PhpZmanim עבור PHP (הספרייה זמינה בנוסף עבור Net. ,Objective C, Ruby וPython) .

    בנוסף יש את הספריה Zman (קישור לתיעוד) החושפת מחלקה בשם Zman היורשת מהמחלקה הפופולרית Carbon שיורשת בתורה מDateTime.
     
     

    הספריה Zman חושפת מתודות כגון:
     

    • האם התאריך הוא יום טוב:
    Zman::now()->isYuntif();   
    
    • האם התאריך הוא צום:
    Zman::now()->isFastDay();  
    
    • האם התאריך הוא חול המועד:
    Zman::now()->isCholHamoed();  
    

  • פרומיסים לוקחים זמן?
    רפאלר רפאל

    Microtasks/Macrotasks

    Microtasks/Macrotasks הם משימות הזוכות ליחס שונה בJS, המשימות נכנסות לתור מיוחד וממתינות עד לאחר סיום ההרצה של המשימות בStack, רגע לפני הריצה הבאה של הEvent loop.

    דוגמאות לפעולות מסוג Micro-Macro)Tasks):

    • SetTimeOut
    • SetInterval
    • Promise
    • Mutation Observer API
      ועוד (ניתן לעיין בתרשים למטה)

    לסיכום: Promise (או Async function) אינן איטיות יותר, אלא משתייכות לרשימה מצומצמת של משימות מסוג Microtasks בעלי סדר קדימה נמוך יותר שיתבצעו רק בסיום הלופ הנוכחי)

    0_DZVAmBK6HlZTUov1.gif

    נ.ב. לקריאה על ההבדל בין Macrotasks וMicrotasks - ובקצרה: לפעולות מסוג Micro עדיפות גבוהה יותר.


  • כיצד ניתן לזהות התקן USB לפי הסיריאל שלו
    רפאלר רפאל

    @משתמש-מקצוען ניתן לעשות שימוש במחלקה ManagementEventWatcher על מנת להירשם לאירועים במערכת המתאימים לשאילתות מותאמות אישית.

    להלן מחלקה היפותטית לחלוטין אשר דוגמת את InstanceCreationEvent מדי 2 שניות על מנת לגלות ערכים חדשים מסוג Win32_DiskDrive (השימוש בWin32_DeviceChangeEvent אינו יתכן במקרה זה, משום שאינו מכיל כל מידע על המכשיר) במידה וערך חדש מסוג Win32_DiskDrive אכן נוצר, המתודה DeviceInsertedEvent שרשמנו כEvent handler תרוץ, במידה והמכשיר המסויים כבר התחבר בעבר, אנו נדפיס את הSerial Number לקונסול, במידה ולא, אנו נכניס אותו לרשימה של המכשירים המוכרים (familiarSerialNumbers), כך שהSerial Number יודפס בפעם הבאה שהמכשיר יחובר.

    class FamiliarDeviceDetection
    {
        private readonly string _query = "SELECT * FROM __InstanceCreationEvent WITHIN 2 WHERE TargetInstance ISA 'Win32_DiskDrive'";
        private readonly List<string> _familiarSerialNumbers = new();
    
        public FamiliarDeviceDetection()
        {
            var watcher = new ManagementEventWatcher();
            watcher.Query = new WqlEventQuery(_query);
            watcher.EventArrived += DeviceInsertedEvent;
            watcher.Start();
        }
    
        private void DeviceInsertedEvent(object sender, EventArrivedEventArgs e)
        {
            var device = (ManagementBaseObject)e.NewEvent["TargetInstance"];
    
            if (device["SerialNumber"].ToString() is var serialNumber && _familiarSerialNumbers.Contains(serialNumber))
            {
                Console.WriteLine(serialNumber);
            }
            else _familiarSerialNumbers.Add(serialNumber);
        }
    }
    

     
    דוגמא לשימוש במחלקה הנ"ל באפליקציית Console:

    public void Main()
    {
        new FamiliarDeviceDetection();
        Console.ReadLine();  // comment out unless in console application  
    }
    

    על מנת להשתמש בManagementEventWatcher יש להוסיף לפרויקט את הספרייה System.Management אשר הייתה בעבר חלק מהFramework, אולם הושמטה במעבר לCore עקב היותה מותאמת לסביבת ווינדוס בלבד (במטרה לטהר את הפלטפורמה ממחלקות אשר אינן מותאמות לריצה על לינוקס ו-MacOS) WMI עושה שימוש בDCOM (טכנולוגיה השייכת ופועלת ע"ג ווינדוס בלבד).

    ניתן להוסיף את הספרייה באמצעות הפקודה:

    dotnet add package System.Management
    

    לחלופין ע"י הוספת השורה הבאה לקובץ הפרויקט (csproj):

    <ItemGroup>
        <PackageReference Include="System.Management" Version="6.0.0" />
    </ItemGroup>
    

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


  • תאימות css בעיצוב לאפליקציה
    רפאלר רפאל

    תוסיף את התגית הבאה לhead:

    <meta name="viewport" content="width=device-width, initial-scale=1">
    

    מדוע הViewport אינו מוגדר כך כברירת מחדל?

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


  • קבלת טקסט של דף אינטרנט
    רפאלר רפאל

    @משה-כהן345 מכיוון שפרטי יצירת קשר מופיעים בגיידסטאר (אולם הם לא מופיעים בHTML עצמו) פעלתי להבין היכן המקור של הנתונים.
     

    Request

    המספר 580023356 מייצג את מזהה העמותה.

    POST /apexremote HTTP/1.1
    Host: www.guidestar.org.il
    Content-Type: application/json
    Referer: https://
    Content-Length: 248
    
    {
        "action": "GSTAR_Ctrl",
        "method": "getMalkarDetails",
        "data": [
            "580023356"
        ],
        "type": "rpc",
        "tid": 6,
        "ctx": {
            "csrf": "_",
            "vid": "_",
            "ns": "",
            "ver": 0
        }
    }
    

     

    Response

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

        {
            "statusCode": 200,
            "type": "rpc",
            "tid": 6,
            "ref": false,
            "action": "GSTAR_Ctrl",
            "method": "getMalkarDetails",
            "result": {
                "result": {
                    "addressHouseNum": "20",
                    "addressStreet": "הטורים",
                    "addressZipCode": "9466217",
                    "annualTakinYearsText": " (2021)",
                    "audience": [
                        "בני ישיבות ואברכים"
                    ],
                    "emailMalkar": "b9707575@gmail.com",
                    "employees": 1,
                    "govConnectionSum": 0,
                    "govSupportLastYear": 2020,
                    "govSupportSum": 505585,
                    "greenInfo": {
                        "description": "אחזקת כולל אברכים , תמיכה וסיוע מיוחדים במועדי ישראל",
                        "email": "b9707575@gmail.com",
                        "phoneNumbers": [
                            "029707575"
                        ],
                        "year": 2021
                    },
                    "hasMalkarPeople": true,
                    "hekdeshBelongingsCount": 0,
                    "hekdeshIsAcademic": false,
                    "hekdeshIsForPrivateAlso": false,
                    "hekdeshMoneyList": [],
                    "hekdeshRealEstateCount": 0,
                    "InactiveMenu": {
                        "documents": false,
                        "govsupport": false,
                        "donations": false,
                        "govservices": true,
                        "people": false,
                        "assets": true,
                        "trustees": true,
                        "places": false,
                        "services": false,
                        "finances": false,
                        "connections": false,
                        "estates": true,
                        "contact": false,
                        "volunteering": true
                    },
                    "IsExperiencePlace": false,
                    "isStatusActiveText": "עמותה רשומה",
                    "lastModifiedDate": 1636069135000,
                    "lat": 31.788751700000000,
                    "lng": 35.210483400000000,
                    "machoz": "[\"ירושלים\"]",
                    "malkarCities": [
                        {
                            "lat": 31.768319000000000,
                            "lng": 35.213710000000000
                        },
                        {
                            "cityName": "מקום פעילות אחר",
                            "lat": 31.768319000000000,
                            "lng": 35.213710000000000
                        },
                        {
                            "lat": 31.768319000000000,
                            "lng": 35.213710000000000
                        },
                        {
                            "lat": 31.768319000000000,
                            "lng": 35.213710000000000
                        }
                    ],
                    "mapGeometryLists": {
                        "info": [
                            "malkarCities"
                        ],
                        "volunteering": [
                            "volunteerCities"
                        ],
                        "places": [
                            "malkarCities"
                        ]
                    },
                    "members": 7,
                    "nationalInsuranceSum": 0,
                    "phoneNumbers": [
                        "029707575"
                    ],
                    "submittedPapers": false,
                    "targets": [
                        {
                            "Activity": "מתן מלגות ללומדים",
                            "Target": "אחזקת כולל אברכים"
                        }
                    ],
                    "tchumPeilut1": "ישיבה - כולל",
                    "tchumPeilutRasham": "ישיבה - כולל",
                    "volunteers": 6,
                    "approval46": true,
                    "cities": [
                        "ירושלים"
                    ],
                    "city": "ירושלים",
                    "cityNums": [
                        "3000"
                    ],
                    "greenCities": [
                        "ירושלים"
                    ],
                    "greenCityNums": [
                        "3000"
                    ],
                    "greenMalkarDistricts": [
                        "ירושלים",
                        "ארצי"
                    ],
                    "hasHekdeshEstates": false,
                    "hasProperManagement": true,
                    "hasProperManagement2Years": true,
                    "hasReports": true,
                    "hasSubmittedPapers": false,
                    "hekdeshIsNeedCheck": false,
                    "hekdeshIsReligious": false,
                    "hekdeshIsReligiousNeedCheck": false,
                    "Id": "a002400000ACLiYAAX",
                    "isAmuta": true,
                    "isDeleted": false,
                    "isHekdesh": false,
                    "isHeletz": false,
                    "isOttoman": false,
                    "lastAddDataYear": "2019",
                    "malkarDistricts": [
                        "ירושלים"
                    ],
                    "malkarLocationIsNational": false,
                    "malkarLocationIsNationalGreen": true,
                    "Name": "ישיבת בית הכרם (ע\"ר)",
                    "orgGoal": "להקים להחזיק ולנהל ישיבות",
                    "orgYearFounded": 1982,
                    "regNum": "580023356",
                    "showApproval46": true,
                    "showDonation": false,
                    "showProperManagement": true,
                    "showReports": true,
                    "showSubmittedPapers": false,
                    "sugHitagdut": "עמותה",
                    "sugHitagdutLabel": "עמותה",
                    "tchumPeilutMain": "חינוך, השכלה והכשרה מקצועית",
                    "tchumPeilutMainNum": "21",
                    "tchumPeilutSecondary": [
                        "ישיבה - כולל"
                    ],
                    "turnover": 1836211
                },
                "success": true
            }
        }
    

     

    Request באמצעות Fetch

    fetch("https://www.guidestar.org.il/apexremote", {
      "headers": {
        "content-type": "application/json",
      },
      "referrer": "_",
      "referrerPolicy": "origin-when-cross-origin",
      "body": "{\"action\":\"GSTAR_Ctrl\",\"method\":\"getMalkarDetails\",\"data\":[\"580033249\"],\"type\":\"rpc\",\"tid\":6,\"ctx\":{\"csrf\":\"VmpFPSxNakF5TVMweE1TMHdPRlF3TVRveE1qb3lPQzQ0TkRoYSw4Y2N5TWlWNl8zQ0RZejJ6WEQxNjVXLE9EaG1aV0ky\",\"vid\":\"06624000000VGgM\",\"ns\":\"\",\"ver\":43}}",
      "method": "POST",
    })
    .then(x => x.json())
    .then(console.log)
    

  • דרושים מפתחים
    רפאלר רפאל

    @clickone אכן זאת זכות גדולה כל כך שכדאי אולי לשקול לוותר על השכר 😊 .


  • בעקבות האשכול תבניות של API - איזה תחליף יש לnode.js ??
    רפאלר רפאל

    הוזכרו כאן Frameworks רבים אולם מקומה של ASP.NET נפקד, לכן לקחתי על עצמי בדחילו ורחימו את המשימה החשובה 😊 ( אני חייב לציין שזו דעתי האישית בלבד, ואני אשמח לשמוע את חוות דעתם של המומחים ממני כאן)

    ASP.NET מהירה בהרבה מNodeJs, ולמעשה היא נחשבת אחת מהWeb servers המהירים והיעילים ביותר כיום (משאירה הרחק מאחור את Java, Go, NodeJs).

    בניגוד לפיתוח בסביבת NodeJs בה אתה נתון לחסדיהם של ספריות שנכתבו ע"י חברות ואנשים שונים בתקווה שהכל יתחבר איך שהוא לאפליקציה אחת, בASP.NET הפיצרים החשובים והשימושים ביותר מובנים בFramework לדוגמא:

    • Dependency Injection
    • Logger
    • Localization
    • Template engine
    • WebSocket
    • ORM
    • Authentication/Authorization

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

    כחלק מהגדרות הBuild ניתן לבחור במצב Self-hosted, מה שאומר שבסיום התהליך, נקבל קובץ הרצה ללא תלויות (ניתן להרצה כיישום Portable על כל מחשב), לחלופין ניתן לפרוס את האפליקציה באמצעות תמונת Docker רשמית של Microsoft.

    מספר בקשות לשניה:
    בקשות לשניה

    לסיכום
    NodeJs איננה מציעה יתרונות כלשהם על פני ASP.NET ,למעשה אני סבור שהיא מציעה רק חסרונות שהמשמעותי שביניהם הוא היותה Single-Threaded, הטיב להגדיר זאת @dovid בשימוש באנלוגיה של טרקטור צעצוע שעבר הסבה לשימוש באתרי בנייה.
    ASP.NET לעומת זאת היא סביבה יציבה מאוד, בה יש דרך מוגדרת לבצע משימות, בה כולם מדברים באותה שפה ושבה אתה מקבל יכולות אדירות בתמורה למעט מאוד שורות קוד.

    אגב שווה להכיר את התחביר המינימלי החדש של ASP.NET שדומה באופן חשוד לExpress:

    var app = WebApplication.CreateBuilder(args).Build();
    
    app.MapGet("/", () => "Hello World!");
    
    app.Run();
    

    שרת HTTP בשלושה שורות בלבד.

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

    1. Implicit using directives: חסל סדר הרשימה הארוכה של Using בראש כל קובץ.
    2. Top level statements: ניתן לכתוב קוד בקובץ הראשי מחוץ למחלקה או למתודה,
    3. אין יותר צורך במחלקת Startup.

  • מגבלות מאגר ב-github - גודל מאגר מירבי, וגודל מירבי לכל קובץ בודד במאגר
    רפאלר רפאל

    @צדיק-תמים

    כלומר להעביר אליו את הריפו שלי?

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

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


  • אנגלית בשביל תכנות
    רפאלר רפאל

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


  • עזרה | תיקון קוד של kotlin
    רפאלר רפאל

    @mmmm אמר בעזרה | תיקון קוד של kotlin:

    זה גם באנדרואיד (לא מדויק...), מה צריך לייבא (import) בשביל זה?

    הנתיב המלא של המחלקה : android.text.TextUtils

    Java

    המתודה isNullOrEmpty איננה קיימת בJava והשימוש בstring.isEmpty עם Null יניב את השגיאה NullPointerException, אי לכך הוסיפו אנשי Android לTextUtils את המתודות הבאות:

    • isBlank
    • isEmpty
    • isNotBlank
    • isNotEmpty
       

    Kotlin

    כל המתודות הנ"ל בנוסף לשני המתודות הבאות [המיועדות עבור String?) Nullable Receiver)]:

    • isNullOrEmpty
    • isNullOrBlank

    מומשו בחבילה kotlin.text המהווה חלק מהStandard Library של Kotlin **, כך שאין סיבה להשתמש במחלקה TextUtils השייכת לAndroid SDK.
     

    @yossiz אמר בעזרה | תיקון קוד של kotlin:

    אבל עדיין צריך לי עיון במקרה של interop עם Java

    המתודה isEmpty מסומנת עם @InlineOnly מה שהופך אותה ללא זמינה עבור Java (המתודה מתורגמת לPrivate) אולם במקרים רבים אחרים הדבר אכן מהווה בעיה חמורה (בניגוד לKotlin, אף אחד לא מונע ממפתח בJava להעביר Null למתודות בKotlin המצפות לNon-Nulls), כדי למזער את נזקי את הבעיה, המהדר של Kotlin עבור JVM יוסיף בדיקה עבור Null לכל המתודות הציבוריות המצפות לNon-Nulls.

    ** אין צורך ליבא את החבילה kotlin.text על מנת לעשות שימוש במתודות הנ"ל, הדבר מתבצע באופן מרומז עבור כל החבילות המרכיבות את הStandard Library, בדומה לשפות רבות אחרות.


  • נעילת קטע קריטי בקוד אסינכרוני
    רפאלר רפאל

    דוגמא פשוטה של שימוש בSemaphoreSlim

    var ss = new SemaphoreSlim(1, 1);
    
    await ss.WaitAsync();
    try
    {
    	await DoSomeThingAsync();
    }
    finally
    {
    	ss.Release();
    }
    

    הסבר בקצרה:

    • הבנאי מקבל שני פרמטרים:
      1. המספר ההתחלתי של בקשות לסמפור שיאושרו במקביל
      2. המספר המקסימלי של בקשות שיאושרו במקביל
        בדוגמא למעלה מכיוון שהמספר מוגדר לאחד - רק בקשה אחת תאושר בכל פעם.
    • המתודה WaitAsync ממתינה בצורה אסינכרונית עד אשר הCounter הפנימי של SemaphoreSlim יירד למספר נמוך יותר מהמספר המקסימלי שהוגדר, בסיום ההמתנה הCoutner הפנימי יעלה באחד ושורות הקוד הבאות יתבצעו.
    • המתודה Release מפחיתה את הCounter באחד, מה שמפנה מקום לבקשות הממתינות (חשוב לקרוא לRelease בתוך הFinally כך שהשחרור יתבצע גם במקרה של כשלון הקוד המופיע בTry).

    מספר הערות:

    • חשוב שהאוביקט SemaphoreSlim יהיה משותף כך שלא יווצר מופע חדש בכל קריאה למתודה או יצירת מופע שמכיל אותו כשדה (כדאי לחשוב בכיוון שלSingleton או שדה סטטי).
    • עבור EntityFramework השימוש בSemaphoreSlim אינו דרוש תודות לConcurrency Tokens/Timestamp שנוצרו על מנת לטפל בבעיה זו, להלן מדריך לOptimistic Concurrency.

  • שאלה. איך לכתוב ביטוי רג'קס? ואיך למחוק ברג'קס מילים שלמות?
    רפאלר רפאל
    str.replace(/\S*\d\S*/g, '')
    

    התווים המשתתפים:

    • הביטוי עצמו עטוף בקו נטוי כדי לציין שמדובר באוביקט מסוג Regex
    • S\ תואם לכל תו אשר אינו Whitespace (לדוגמא שורה חדשה \ טאב \ רווח)
    • * תואם לתו הקודם 0 פעמים או יותר (התו מציין את כמות ההופעות הדרושה של התו הקודם)
    • d\ תואם לתווים 0-9
    • g לאחר סיום הביטוי מגיע תורם של ה"דגלים" כדי להחליט על האופן הרצוי בו יתבצע התהליך, לדוגמא במקרה זה אנו עושים שימוש בg\ כך שהתהליך יתבצע עבור כל המילים, ולא יושלם אחר מציאת ההתאמה הראשונה

    אופן הפעולה של הביטוי:

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


  • C# שימוש נכון בTasks
    רפאלר רפאל

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


  • התקנתי Visual Studio 2022 כאן המקום למי שיודע דברים חשובים על IDE בכלל - דברים ששינו לי את החיים
    רפאלר רפאל

    Sync Namespaces

    קרוב ל"דוגמאות ששינו שישנו לי את החיים" ניצבת הפקודה Sync Namespaces (נוספה בVisual Studio 2022) אשר מעדכנת את הNamespaces בSolution\Project כך שיתאימו למבנה הקבצים.
    ניתן לקבוע בוודאות שללא שימוש תדיר בפקודה, יהיו לכם טעויות בNamespaces בכל אחד מהפרויקטים שלכם.

    כיתוב בבעיות טעינה
     
     

    Subword Navigation

    ניווט בתוך חלקי המילה באמצעות Ctrl-Alt-Left ו Ctrl-Alt-Right

    לדוגמא:
    כיתוב בבעיות טעינה


  • שדרוג nginx שהסתבך
    רפאלר רפאל

    @davidnead שים לב, הבעיה שלך איננה ברורה (ניסית לתאר את הבעיה כפי תפיסתך, אולם כמו שכתבת אתה לא מתמצא בNginx), לכן אני מציע:

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

  • בעקבות האשכול תבניות של API - איזה תחליף יש לnode.js ??
    רפאלר רפאל

    @davidnead זה בדיוק מה שניסיתי להסביר, מנסיוני הצנוע הפיתוח בASP מהיר יותר מNode.
    הקמת אפליקציה הכוללת מסד נתונים, אימות, וHttp API היא משימה שמסתכמת בדקות ספורות עבור מפתחים בASP.
    ובכלל הפיתוח בASP, מלא אוטומציות, לדוגמה המחלקות שאתה בונה מתורגמות לטבלאות במסד הנתונים, אחרי שיש לך Entity שמייצגת טבלה, באפשרותך ליצור Controller שמכיל נקודות קצה (וכן Views המכילים קוד תצוגה) עבור כל הפעולות הבנאליות (CRUD) עבור אותו Entity בלחיצת כפתור.


  • מה חדש בNET 6 LINQ.
    רפאלר רפאל

    הגירסה החדשה של NET. תוכרז במהלך החודש הבא באירוע NET Conf 2021 היוקרתי של מיקרוסופט, היא תכלול שיפורים רבים במגוון מחלקות, אחת מהיותר מעניינות שבינהן היא Enumerable, מספר מתודות Linq חדשות התווספו למחלקה, לצד הוספת Overloads חדשים עבור מתודות קיימות.

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

    1. Chunking
      אם יצא לכם לעבוד עם מבני נתונים גדולים, ודאי נתקלתם בצורך לחלק אוסף גדול למספר אוספים קטנים, בדיוק בשביל זה נולדה המתודה Chunk, המתודה מקבלת כפרמטר את הגודל הרצוי ומחזירה IEnumrable של תתי מערכים:
    public static IEnumerable<TSource[]> Chunk<TSource>(this IEnumerable<TSource> source, int size);
    
    
    private record Person(int Age) 
    
    int chunkSize = 10; 
    
    IEnumerable<Person> largeCollecton = Enumerable.Range(0, 1_000).Select(age => new Person(age));
    
    IEnumerable<Person[]> chunks = largeCollecton.Chunk(chunkSize);
    
    foreach (var chunk in chunks) 
    {
        foreach (var person in chunk)
        {
            Console.WriteLine(person);
        }
    }
    
    1. MaxBy\MinBy
      המתודה מאפשרת לקבוע את האובייקט הגדול\הקטן באוסף ע"פ המאפיינים של האוביקטים, בשונה מMax\Min הוותיקים שמבצעים את ההשוואה מול האוביקטים עצמם.
      לדוגמא: אם נרצה לקבוע מיהו האדם המבוגר באוסף של מופעים מסוג Person, נבצע את המשימה כך: people.MaxBy(x => x.Age) , עד כמה שהדבר מוזר, האפשרות טרם הייתה קיימת עד כה, הדרך המקובלת הייתה השילוב הלא חביב דלהלן:
      ()people.OrderByDescending(x => x.Age).First.
      כמו כן נוספו: DistinctBy ,ExceptBy ,IntersectBy וUnionBy בעלי עיקרון דומה.

    2. תמיכה בRange
      מכירים את Range מC# 8? עד היום התמיכה הייתה בלעדית למערכים, מעתה התמיכה מתרחבת לLinq, לדוגמא: people.Take(6..10) יחזיר ארבעה אובייקטים, מהאובייקט במיקום השישי עד האובייקט במיקום העשירי (מקביל לpeople.Skip(6).Take(4)).

    3. ערך דיפולטיבי עבור SingleOrDefault ,LastOrDefault ,FirstOrDefault
      המתודות הנ"ל יקבלו Overload חדש התומך בערך ברירת מחדל.
      בדוגמא דלהלן אנו ננסה למצוא באוסף מסוג Person, אדם שגילו הוא חמישים, ונחזיר מופע חדש (המצייג אדם שגילו הוא 50) במידה וניכשל:

    people.FirstOrDefault(m => m.Age == 50, new(){ Age = 50 })
    
    1. Zip עבור שלושה Enumrables
      כיום התמיכה מוגבלת עבור שניים בלבד.

    2. TryGetNonEnumeratedCount
      המתודה תנסה לקבוע את מספר האוביקטים בEnumrable מבלי לבצע איטרציה (פעולה העשויה להיות יקרה), כחלק מהתהליך המתודה תבדוק האם הEnumerable מממש את ICollection (המכיל מאפיין בשם Count), או לחילופין האם הוא מערך (המכיל מאפיין בשם Length).

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


  • חישוב של דף היומי לפי תאריך
    רפאלר רפאל

    המעבר מדפוס סלאוויטה (12 דפים) לדפוס וילנא (21) התבצע החל מהסבב השמיני (בהתאם להכרעתו של מרן הגאון רבי משה פיינשטיין זצוק"ל שאין במיעוט הלימוד חשש של הפרת נדר)
    הפרש הדפים הוא 9 כפול 7 מחזורים (9 * 7 = 63)
    כפי שניתן לראות הספרייה הספרייה המדוברת מאת @צדיק-תמים לקחה את הדבר בחשבון.

    dapim_in_current_cycle = days_since % total_dapim + 63
    

    @הפצת-אנקי ע"ע הדף היומי


  • רג'קס - איך לזהות חזרה על אותו תו?
    רפאלר רפאל
    string.replace(/([A-Z])(\1{2})\1+/g,'$1$2')
    

    הסבר בקצרה:

    בחירה

    1. ([א-ת]) הכנס תו בטווח של א-ת לתוך קבוצה $1
    2. ({2}1\) הכנס תווים הזהים לתו מהקבוצה הראשונה לתוך קבוצה $2, אם מופיעים פעמיים נוספות
    3. +1\ בחר את שאר ההופעות של התו מהקבוצה הראשונה

    החלפה

    1. $1$2 החלף את המחרוזת שנבחרה עם הקבוצה הראשונה והשנייה

     
    להלן דוגמא של הביטוי הנ"ל בRegex101


  • scss ייבוא משתנים לקומפוננטים
    רפאלר רפאל

    @yossiz אמר בscss ייבוא משתנים לקומפוננטים:

    זה משהו של וובפאק

    אכן זהו פיצר של Webpack הנקרא resolve.alias המאפשר יצירת קיצורים עבור נתיבים הנמצאים בשימוש תכוף.
    בתבנית של Vue Webpack (ברירת המחדל של Vue-Cli) הסימן "@" מוגדר להחליף את הנתיב "src".

    @yossiz אמר בscss ייבוא משתנים לקומפוננטים:

    @chagold אתה בטוח ש-scss יודע לתרגם את ה-@?

    הLoader הראשון בתבנית של Vue Webpack עבור קבצי Styles הוא Css-Loader המתייחס לimport@ ו()url בדומה לimport/require בJS (דבר המאפשר שימוש בנתיבים יחסיים בהתאם למבנה הקבצים), לאחר מכן הLoader פותר את הנתיבים, ובסיום מחזיר מחרוזת טקסט (המכילה את תוכנם של כל קובצי הStyles) שתועבר בתורה לLoader הבא, ובמילים פשוטות התהליך מתבצע ללא קשר לתחביר של קובץ הStyle.

    @chagold אמר בscss ייבוא משתנים לקומפוננטים:

    @yossiz הוא ודאי קורא את הקובץ. ה-white$ הוא מתוך הקובץ שקראתי לו.

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

  • 1 / 1
  • התחברות

  • אין לך חשבון עדיין? הרשמה

  • התחברו או הירשמו כדי לחפש.
  • פוסט ראשון
    פוסט אחרון
0
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום