איך להפיץ פרויקט ASP.NET CORE 2 אל שרת לינוקס CentOs 7 – מדריך צעד אחר צעד

לאחרונה, עברתי לתכנת ב-C#. השפה מוכיחה את עצמה כבחירה מעולה, ואילולא הייתה האפשרות להריץ את התוכנות על לינוקס, לא הייתי מבצע את הבחירה הזו.

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

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

linux photo

הנחות יסוד :

  • ידע בסיסי בלינוקס
  • ידע איך להתקין חבילות ( yum \ apt-get )
  • הרכיבים שלא קשורים ל dot net core – מותקנים כבר ( למשל רכיב ה Database, כמו MySql \ MariaDB ).
  • אני מניח ששרת apache מותקן כבר .
  • שרת ה-Web הוא Apache ( ולא ngnix ) .
  • יש לכם הרשאה מספיקה להריץ פקודות בתור מנהל – כלומר sudo
  • יש לכם אפליקציית dot net core כלשהיא להפצה (בדוגמא אני משתמש ב-MVC , אבל אפשר כל דבר…)
  • אינטלגנציה בסיסית

הסבר תיאורטי

מה שמסבירים במדריך הזה, הוא ששרת ה-Apache עובד בתוך Proxy Server אל שרת פנימי של ה- DotNetCore שנקרא kestrel.

כלומר, אנחנו נגדיר למעשה Virtual Host של Apache, שמנתב את כל קריאות ה-Http אל האפליקציה שהפעלנו ב-DotNetCore .

בנוסף – נגדיר שירות, ש"עוטף" את הפעלת ה-dot net core בתור damon – כלומר "שירות", ואחת מההגדרות, תהיה שבמקרה של תקלה, אז התפקיד של המעטפת, יהיה להפעיל מחדש את אפליקציית ה-dot net core שלנו.

הערה חשובה : קיימת אפשרות להפיץ אפליקציות dot net core יחד עם RunTime מובנה – המדריך הזה לא מדבר על האפשרות הזו.

צעדים מעשים – איך להתקין אפליקציית asp.net core על לינוקס cent os 7

שלב 1 – להתקין את ה-sdk ה-dot net core על השרת

  sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc

 sudo sh -c 'echo -e "[packages-microsoft-com-prod]\nname=packages-microsoft-com-prod \nbaseurl=https://packages.microsoft.com/yumrepos/microsoft-rhel7.3-prod\nenabled=1\ngpgcheck=1\ngpgkey=https://packages.microsoft.com/keys/microsoft.asc" > /etc/yum.repos.d/dotnetdev.repo'
  sudo yum update
 sudo yum install libunwind libicu
 sudo yum install dotnet-sdk-2.0.0

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

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

הפקודה השלישית מעדכנת את רשימת  החבילות של yum.

הפקודות הרביעית והחמישית מתקינות את סביבת dot net core.

שלב 2 – קימפול + אריזה של אפליקצית ה dot net core עם כל הספריות שלה

עכשיו, בסביבת הפיתוח (=המחשב שלכם ?) \ או בסביבת ה-build   נשתמש בפקודה דרך ה-Command Line כדי ליצור ספריה שמכילה את ה-dll של התוכנה שלנו, יחד עם כל קבצי ה-dll ועוד.

  • פתחו cmd
  • תגיעו לתיקיה של הפרויקט (לא ה- solution, אלא הפרוייקט ! )
  • תריצו את הפקודה הבאה  : dotnet publish -c Release
    המשמעות של publish היא ליצור "אריזה" מוכנה להפצה של התוכנה שלנו.
    המשמעות של Release היא לקמפל באופן מייטבי – כזה שהוא יותר יעיל מאשר קימפול שמיועד עבור מצב debug.
  • ההרצה יכולה לארוך בין שניות לדקות, ובסופה תקבלו
    • כל מיני הערות warning של הקומפיילר ( בצבע צהוב ) – אפשר להתעלם
    • הודעה על מיקום תיקית ה-publish
    • הודעה על מיקום נפרד של ה-dll שמכיל את התוכנה מקומפלת.
  • צריך לזכור שבפועל, גם בתוך תיקיית ה-publish יש העתק של ה-dll של התוכנה
    ובהמשך – אנחנו נשתמש דווקא בהעתק של ה-dll שנוצר בתוך תיקיית publish.

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

כעת, תעבירו את הקבצים לשרת (בכל צורה שנוחה לכם, ftp, git ….)

המקום הטבעי – הוא תיקיה בתוך ה-www  ( או html וכדומה).

 

שלב 4 – להגדיר את apache בתור reverse proxy

כעת, ניצור Virtual Host באפצ'ה

שמפנה את כל התעבורה – ישירות לאפליקציית ה-dot net

כלומר ה-אפצ'ה  יאזין לתקשורת HTTP על פורט 80 או 443, ויעביר את כל התעבורה לאפליקציית הדוט נט, שבדוגמא שלנו תשב על תאזין על פורט 5000.

לצורך כך, ניצור קובץ בתיקייה  הבאה ( עם nano \ vim \ מה שנוח לכם )  :

/etc/httpd/conf.d/

ובתוך הקובץ נרשום את ההגדרות של אפצה לוירטואל הוסט

<VirtualHost *:80>
 ProxyPreserveHost On
 ProxyPass / http://127.0.0.1:5000/
 ProxyPassReverse / http://127.0.0.1:5000/
 ErrorLog /var/log/httpd/hellomvc-error.log
 CustomLog /var/log/httpd/hellomvc-access.log common
 </VirtualHost>

שימו לב להגדרת ה-errorLog וגם ה- customLog

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

עכשיו – כדי לבדוק את ההגדרות, נקליד את הפקודה הבאה :

    sudo service httpd configtest

אם קיבלתם את ההודעה Syntax OK  – אז הוירטואל הוסט תקין, לפחות מבחינת צורת הכתיבה (ה- Syntax ).

כדי שההגדרות יכנסו לתוקף – נעשה ריסט לשירות האפצה.

 sudo systemctl restart httpd 
sudo systemctl enable httpd

שלב 5 – להגדיר את השרת של דוט נט בתור שירות (שרת kestrel )

סיכום ביניים :  כעת, האפצה משמש בתור reverse proxy ומפנה את התעבורה אל פורט 5000. עכשיו מה שנשאר הוא להפעיל את אפליקציית ה-dot net core כדי שתאזין לפורט 5000.

כאשר כתבתי לפני כן שאפליקציית הדוט נט מאזינה על פורט 5000 בדוגמא שלנו, אז היא עושה זאת באמצעות שרת שנקרא kestrel.

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

בדוגמא של מיקרוסופט, הם יוצרים שירות בשם kestrel-hellomvc.service , אני אצמד לדוגמא הזו – אבל בפרודקשיין, כמובן, תשנו את שם הקובץ=שירות לשם משמעותי, שרלוונטי למקרה שלכם.

  •  ראשית ניצור קובץ הגדרות לשירות :
sudo nano /etc/systemd/system/kestrel-hellomvc.service
  • שנית — בתוך הקובץ נכתוב את התוכן הבא :
[Unit]

Description=Example .NET Web API Application running on CentOS 7


[Service]

WorkingDirectory=/var/aspnetcore/hellomvc

ExecStart=/usr/local/bin/dotnet /var/aspnetcore/hellomvc/hellomvc.dll

Restart=always

# Restart service after 10 seconds if dotnet service crashes

RestartSec=10

SyslogIdentifier=dotnet-example

User=apache

Environment=ASPNETCORE_ENVIRONMENT=Production 


[Install]

WantedBy=multi-user.target

שימו לב – הקובץ רגיש לרווחים בתחילת שורה, אז צריך להקפיד לא לשים רווחים בתחילת שורה, ולא תווים מיותרים.

כמובן  – תתאימו את התוכן לאפליקציה שלכם.

  • עכשיו – שמרו את הקובץ, וצאו מ- nano.
  • וסוף סוף נפעיל את השירות :
systemctl enable kestrel-hellomvc.service

systemctl start kestrel-hellomvc.service
  • וכדי לבדוק שהשירות עובד כמו שצריך – נקליד :
systemctl status kestrel-hellomvc.service
  • אם קיבלתם הודעה עם המילה Active (בצבע ירוק – תלוי במערכת)
    אז הכל תקין – ואפשר סוף סוף לגלוש מהדפדפן ולראות שזה עובד.

 

מה נותר ?

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

מקורות :

שלב 1 – מדריך להתקנת sdk של dot net core

שלב 2 ואילך – במדריך לאירוח של asp.net core עם apache

 

 

 

איך לאפשר שמות טבלאות עם אותיות גדולות ב- MySql / MariaDB ?

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

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

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

ראשית נמצא את קובץ ההגדרות, הוא יכול להיקרא my.cnf או my.ini

הוא יכול להימצא בהרבה מקומות, ראו כאן, בחלק שעוסק ב- Windows,

אני מצאתי אותו תחת C:\Program Files\MariaDB 10.2\data\my.ini

נערוך את הקובץ – ונכניס בתוכו את השורה הבאה

[mysqld]

lower_case_table_names=2

חשוב לשים לב שהשורה יושבת תחת כותרת [mysqld] , ואם אין כזו – אז צריך להוסיף אותה.

לאחר מכן – צריך לעשות restart ל- service הרלוונטי ( דרך Services של Windows ) .

בהצלחה.

מקורות :

https://mariadb.com/kb/en/the-mariadb-library/identifier-case-sensitivity/

https://mariadb.com/kb/en/the-mariadb-library/configuring-mariadb-with-mycnf/

דיסיריליזציה של XML מקוננים באמצעות XmlReader + XmlSerialization ב- C#

האתגר  – דיסיריליזציה מאוד מהירה של XML בכל גודל שהוא – בלי צריכת משאבים גבוהה.

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

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

בנוסף, קריאת XML עם מחלקת XmlReader היא הרבה יותר מהירה מאשר מחלקת XmlDocument

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

הפתרון – שימוש ב – XmlReader + XmlSerialization

נחלק את ההסבר ל-2 חלקים, חלק 1 יעסוק ב-Reader , וחלק שני בדיסיריליזציה.

חלק 1 – Xml.Reader

החלק של ה-Reader הולך כך : ניצור אוביקט Reader בתחילת הפעולה, ונשחרר את המשאבים בסוף הפעולה.

 /** Init XML reader */
 XmlReader reader = XmlReader.Create(fileName);


... Your code here
...
...

/** Close **/ 
 reader.Dispose();
  • הערה לגבי .net core : עדיף להשתמש במתודה Dispose ולא במתודה Close
    כי רק Dispose קיימת ב- .net core.

 

  • אם יש לנו בלוקים גדולים, אפשר ומומלץ ליצור אוביקט Reader נפרד עבורם – שמכיל רק את השורות של הבלוק הגדול שלנו, ולא מכיל את שאר השורות בקובץ

הנה דוגמא מלאה :

 // Position the reader on the second book node
 reader.ReadToFollowing("MyBigElement");
 
 // Create another reader that contains just the second book node.
 XmlReader readerMyBigElement = reader.ReadSubtree();

 // init new xmlSerlizer - To new instance of class MyWantedClass
 // Be Aware - MyWantedClass is the class that will get into 
 // the values from MyBigElement in the XML.
 XmlSerializer xmlSerlizer = new XmlSerializer(typeof(MyWantedClass));
 
 MyWantedClass myWantedClass;
 // Deserialize
 myWantedClass = (MyWantedClass)xmlSerlizer.Deserialize(readerMyBigElement);

 readerKoteretKovetz.Dispose();

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

חלק 2 – דיסירליזציה

כאשר צריך להשתמש ב-Attributes  ( תיעוד על שימוש ב-attributes הספציפיים  – בקישור הזה ).

אני מתמצת כאן נקודות חשובות :

  • אם שם האלמנט בתוך ה-XML הוא בדיוק כמו שם המשתנה – אין צורך להשתמש ב-Attribute
  • בכל מקרה אחר – נשתמש ב-Attribute
  • דוגמא פשוטה ל- String
[XmlElement(ElementName = "My-Xml-Element-Name", IsNullable = true)]
public string myVariable;
  • משתנים במחלקה שלא קשורים לקובץ ה-XML, נסמן אותם ב- Attribute של XmlIgnore

 

  • טיפול ב-Null   :   בכל אלמנט שלא ידוע לנו אם הוא יגיע בוודאות, או שיגיע ללא ערך , או שיגיע null \ nil
    אז נוסיף את ההגדרה

    IsNullable = true
  • טיפול ב-Null עבור ערכים מספריים :  – אם המשתנה שצריך לקבל ערך הוא מסוג int \ decimal , אז עבור המקרים שבהם הערך יהיה ריק , צריך להגדיר אותם עם סימן שאלה בסוף, כדי שיוכלו לקבל ערך null
    לדוגמא
public int myVar
  • טיפול ב-Null עבור אובייקטים – לייצר את האובייקט מראש בזמן ההגדרה :
    MyObject myObject = new() myObject();
  • טיפול ב- Null עבור ערכי תאריך  – במקרה של תאריך, נצטרך לשים getter\setter מתאימים.
    בפירוט : נניח שהתאריך מגיע כ ddmmyyyy
    אז ניצור

    • משתנה מסוג string שמקבל את הערך המקורי
    • משתנה מסוג date עם getter + setter
    • ה-setter – בודק אם הערך המקורי הוא null ורק אם לא, אז הוא עושה לו Parse
    • ה-getter – מחזיר את התאריך.
[XmlIgnore]
 public DateTime dtRealDate { get; set; }

 
 [XmlElement(ElementName = "MyDateInXml", IsNullable = true)]
 public string MyDateBlaBla
 {
 get
 {
 return this.dtRealDate.ToString();
 }
 set
 {
 if (value != null)
 {
 this.dtRealDate = DateTime.ParseExact(value, "yyyyMMdd", System.Globalization.CultureInfo.InvariantCulture);
 }
 }
 }
  • קינון :
    • נניח שיש לנו כמה בלוקים של XML בתוך הקובץ, כל בלוק עוסק בישות אחרת.
    • אז כל בלוק – הוא מחלקה נפרדת.
    • זאת אומרת שבתוך המחלקה של הבלוק הראשי, יהיו משתנים מסוג אוביקט הבלוק הרלוונטי 
    • ואז – כדי להתמודד עם Null , כמו שכבר כתבתי למעלה , ניצור כבר new instance בזמן הגדרת המשתנה.
      כך שבכל מקרה שהבלוק הזה יגיע ריק או null, לא נקבל Exception
    • אפשר גם לקנן לתוך List !!! וזה עובד היטב.
 [XmlElement(ElementName = "ElementThatArriveMultipleTimes", IsNullable=true)]
 public List<Product>productsList = new List<Product>();

 

כלים נחמדים לטיפול ב-XML וליצירת המחלקות

 

  • מיקרוסופט מציעה למי שמוריד את Windows SDK , כלי קטן שנקרא xsd.exe
    ובמידה ויש לכם קובץ xsd שמתאר את ה-XML שלכם, אז הכלי הזה יכול לייצר אוטומטית את המחלקות.
    אני לא מצאתי שהוא שימושי, כי הוא מייצר הרבה קוד זבל, ואין לי שליטה על כל המאפיינים שלו, אבל אולי למישהו אחר זה יכול לעזור ( שוב…בהנחה שיש לכם קובץ XSD שמתאר את ה-XML).
  • כדי לקרוא XML גדולים מאוד בצורה נוחה
    לא צריך עורך טקסט או IDE \ דפדפן – שמן הסתם יקרסו באמצע.
    אפשר להשתמש בכלי XML Explorer  שעובד ממש יפה , וגם מאפשר שאילתות XPATH בקלות.
    זה כלי אחד לדוגמא, ובטוח יש עוד כאלו https://xmlexplorer.codeplex.com/ 

בהצלחה!

 

מעבר מ-PHP ל – C# , ומ-Laravel אל ASP.NET MVC – רשמים ראשונים

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

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

ועכשיו לתכלס – ההבדלים העיקרים בין PHP ל- C# .

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

ה-Framework של C# מבית מיקרוסופט, נקרא ASP.NET MVC, וקיימת גם גירסה שונה שלו שמיועדת עבור API ונקראת WebAPI ( ניתנים לשילוב, אך בעיקרון – 2 מוצרים שונים).

והמקבילה בעולם ה-PHP שאיתה עבדתי בעיקר, הייתה ה-Framework המוביל כיום ב-PHP, שנקרא Laravel , גם אצלו קיימת גירסה ל-API שנקראת Lumen.

הבדלים ברמת מחיר :

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

הבדלים ברמת השפה – בין PHP ל- C# .

אז ההבדל העיקרי ביותר – הוא ש-C# מחייבת להצהיר על סוגי המשתנים, בניגוד ל-PHP.

מבחינת Syntax, השפות מאוד מאוד דומות, וכמעט אין הבדלים משמעותיים . נציין כמה הבדלים קטנים :

  • בהכרזה של namespace, ב-C# ,  צריך להכניס  את כל ה- קלאס תחתיו גם כן בתוך סוגרים מסולסלות { } .
  • המילה use מתחלפת במילה using.
  • אין triats ב-C#
  • יש  ב-C# משתנה מסוג List שעובד די יעיל ולא קיים ב-PHP ( יותר נכון, קיים, אך רק דרך תוספות)
  • יש מתודות מובנות ב- C# למחרוזות, מערכים , ועוד ( בסגנון של JS – שכל משתנה הוא אוביקט … רק הרבה יותר מתודות מובנות ) .
  • מימוש של Interface נעשה ב-C# עם נקודותיים, לעומת implements ב-php
  • במקום final עבור מתודות \ קלאסים שלא יורשים מהם, משתמשים ב-seald ב-c# .
  • קיים מבנה של Enum ב-C# שלא קיים ב-PHP ( למרות שקל מאוד לממש – מפתחים רבים פותחים מחלקה שמכילה Consts בלבד , והיא משמשת בתור enum )
  • שתי השפות יכולות לרוץ על כל מערכת הפעלה
    כן כן, גם למיקרוסופט יש גירסה ל-dot net שנקרא dot net core ורצה היטב על Linux .
  • ב-c# לפני הרצה צריך לבצע תהליך Build (קומפלייר)
    מה שנחסך מאיתנו כשעובדים ב-PHP
    זה יכול לקחת זמן לפעמים….וזה קטע מעצבן.

הבדלים מבחינת Enviroment  בין PHP ל- C# :

  • מנהל החבילות המוכר ב-PHP נקרא composer , בסביבת .Net קיים מנהל חבילות שנקרא NuGet
  • "על הנייר" נראה שיש פחות חבילות ל-C# , אבל זו השוואה ממש לא רלוונטית, כיוון שהרבה מאוד ספריות, מובנות כבר בתור השפה, ואין שום צורך בחבילה חיצונית.
    • דוגמא פשוטה לכך : ב-PHP נפוץ מאוד השימוש בספריה Carbon לצורך מניפולציות על תאריכים, לעומת זאת ב-C# , הספריה של DateTime כבר מובנה בשפה, ואין צורך לייבא אותה.
      נכון אומנם שגם ב-PHP יש ספרית DateTime, אך מהניסיון שלי, היא פחות נוחה לעבודה, וכיוון שכך – משתמשים ב-Carbon.
  • בסביבת מיקרוסופט, קיים IDE חזק, ללא תשלום, שנקרא Visual Studio , בא נגיד שאם מקבילים את זה לסביבת ה-PHP, אז זה כמו לקבל בחינם IDE ברמה של PHP Storm ( ואולי יותר מזה )
    • חיסרון מעצבן שלו  בכל זאת – זה שאין לו באופן מובנה ctrl+d לשכפול שורה, אך למרבה המזל, בגיגול פשוט, מוצאים תוספים שעושים זאת.
  • שרת Web – ב-PHP נהוג לעבוד עם Apache או Ngnix , לעומת סביבת dot net , שבה עובדים עם IIS.
  • אפליקציות Mobile – כאן יש יתרון עצום לסביבת מיקרוסופט, עם כלי שנקרא xamarin, ומאפשר לפתח אפליקציות שמתקפלות ל-Native , באותה שפה ( C# ) שבה אתה מפתח כרגיל.
    זה חוסך שימוש בפתרונות כמו PhoneGap \ Cordova וכדומה.
    והביצועים – בשמים.
  • כלי Debug :  ב-PHP נפוץ מאוד השימוש ב-xdebug , שההתקנה שלו עשויה להיות לפעמים סיזיפית ( חפשו ב-Youtube ותראו את כמות המדריכים בנושא ) .
    ה-Xdebug הוא תוספת ל-PHP שמאיטה מאוד את ההרצה.
    ב-C#, כלי ה-Debug מובנה בתוך Visual Studio, גם מאט מעט את ההרצה, אך פחות לעומת Xdbeug בתחושה האישית שלי.
  • הבדלים בתיעוד : 
    • מיקרוסופט מנצחת בגדול, הכל מתועד עד לפרטי פרטים,
      יחד עם זאת, קיים חיסרון של "יותר מדי מידע" ולפעמים קשה להבין איפה נמצא כל דבר בתור הררי התיעוד של מיקרוסופט.
    • לנקודה הזו יש יתרון מסויים נוסף מה קורה כאשר יש משהו לא ברור בתיעוד הרשמי ? – התיעוד של Laravel הוא מעולה בעיני, אך יש קטעים מסויימים בהם הוא כתוב גרו ( למשל ההסברים על IOC וקונספטים אחרים ) ובמקרה כזה – אין הרבה אפשרויות חוץ מלהתחיל לחפש בפורומים – שזה חיסרון .
      במיקרוסופט – בגלל עודף המקורות הרשמיים, אין הרבה צורך בפורומים. כי כמעט כל מה שתחפש כתוב בתיעוד הרשמי.

הבדלים ברמת ה- Framework  בין Laravel אל- ASP.NET MVC:

  • במבט ראשון, יש המון דברים מקבילים בין ASP.NET MVC ל- C#
  • זה מעלה מחשבות קלות של "מי העתיק ממי" אם כי, אני נוטה להניח שמיקרוסופט היו ראשונים, ו-Taylor היוצר של Laravel פשוט מימש את הדברים ב-Laravel כמו שהוא הכיר אותם לפני כן בסביבת מיקרוסופט.
  • לשתיהם יש ORM חזק, המקבילה של Eloquent ב-Laravel נקראת Entity ב-.Net
  • למרות שקיבלתי רושם שמפתחים רבים מסתייגים משימוש ב-Entity, לאחר מחקר קטן, זה כנראה חסר בסיס ( אולי בעבר היא הייתה נחותה מבחינת ביצועים, אך כיום ממש לא כך). מבחינת ביצועים – היא בסדר גמור לכל השאילתות הרגילות והפשוטות, כך שבשיקול עלות-תועלת של מהירות פיתוח מול ביצועים – זה בהחלט אופציה טובה.
  • גודל ההשקעה בפרוייקט – Laravel היא בסופו של דבר יציר כפיו של אדם אחד, עם מעט שותפים. קיימת כמובן קהילת Open Source גדולה וכו', אבל הוא ה-PO שלה חד משמעית (טיילור).
    ב-ASP.NET MVC זה מוצר של חברת ענק, ולפחות מבחינתי האישית זה היווה שיקול משמעותי בהחלטה לעבור, היות ואני לא נסמך על אדם אחד, עם קהילת קוד פתוח ( גדולה, ופעילה ככל שתהיה, כל עוד אין אינטרס כספי, לדעתי האישית, זה סיכון מסוים שצריך להילקח בחשבון).

הבדלים ברמת ביצועים בין C# ל- PHP :

  • אין כלל ספק ש-C# עולה בכמה רמות על PHP מבחינת ביצועים.
  • זה מורגש מעט בקטעי קוד שמבצעים עיבודים רציניים.
  • שפת C# היא שפה חצי-מתקמפלת , זה משליך על הביצועים משמעותית לטובה לעומת PHP.
  • עוד דברים שמשפיעים על ביצועים :
    • ב–C# התוכנה "נשארת" במצב ריצה כל הזמן, לעומת PHP שבה כל Request הוא מופע עצמאי שמתחיל מחדש.
    • החיבור ל-DB הוא קבוע ב-C#, לעומת PHP שבה החיבור נוצר בכל Request מחדש (לפי הצורך כמובן ) .
  • בקטעי קוד קטנים, אין הבדל מורגש בכלל בין השפות.
  • אומנם ב-PHP יש פתרונות לעבודה במקביל, אבל הם לא פשוטים ליישום כמו ב-C#  ( מספר תהליכים יחד).

 

סיכום – PHP לעומת C#

עניינים של בחירת שפה הפכו להיות נושאים "דתיים" לפעמים, אבל תכלס, כשבאים לבחון איזה כלי יותר טוב, בלי לערב שיקולים "כאילו-אידיאולוגים" של קוד פתוח וכו' – אז נראה שמיקרוסופט נותנת יותר ב-C# +ASP.NET MVC  לעומת PHP עם Laravel

יחד עם זאת, חייבים להודות שאם מישהו מחפש ללמוד במהירות שפת Web – אז PHP עדיפה משמעותית ..פשוט פותחים עמוד html, כותבים תגית php וזה רץ….

לדעתי, עקומת הלמידה לא כל כך משמעותית כדי להצדיק להתחיל עם PHP, בוא נגיד שאילו הייתי היום חוזר לאחור, אז הייתי מתחיל מראש עם c# , אבל כדי ללמד את הילדים בבית תיכנות הייתי בוחר ב-PHP .

המנצחת בעיני היא C# .

בהצלחה.

 

 

 

 

 

דרושים מפקחי דת (פוסט ביקורת)

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

*הערת הגדול והנורא: למען הסר ספק. זו מודעה שפירסמה רעייתי , הסוברת כל הזמן שכוחי אינו במותני מפאת גילי.
למאמיני היקרים – אם אתם באמת ובתמים מאמינים שאני החזק מכל, אז השאירו לי את השיפוט ודירוג האנשים. זו העבודה שלי. ואך ורק שלי.
שלכם באהבה❤
אלוקים.

באגים ב-PHP בטיפול ב-XML באמצעות DomDocument \ SimpleXml

אני לא שותף למלחמות דת על "שפת התיכנות הטובה ביותר"

לרוב, מלחמות כאלו חסרות משמעות.

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

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

והסתבר לי עם הזמן שלספריות ש-PHP מציעה כדי לפענח XML, יש חסרונות עצומים.

  • אם הקובץ לא מגיע בקידוד המצופה ( למשל, הקובץ מוצהר כ-UTF-8 אבל בפועל הוא UTF-16LE )
    אז צריך לאתר זאת מראש, כי הפקודות שטוענות את הקובץ ומפרשות את ה-XML, לא יודעות לפענח את הקידוד השונה בעצמן.
  • שאילתות XPATH, לעיתים לא עובדות – מאוד תלוי "במצב הרוח" של הספריה.
    לדוגמא – DomDocument מסוגלת לבצע שאילתות XPATH בצורה טובה, ואז בלי סיבה מיוחדת – לא לעבוד.
  • לעיתים, ספריה אחרת יודעת לפרש את ה-XML, והספריה השניה לא מצליחה להתמודד איתו, ומחזירה false.

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

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

המצב הזה הוא ממש גרוע. ולצערי במקרה הזה – כל קובץ שהייתי צריך לבצע מניפולציות עליו ב-PHP, כאשר ניסיתי לפרש אותו עם VB , בספריה עתיקה ביותר של מיקרוסופט (MSXML 6 )  – זה הצליח תמיד , הרבה יותר מהיר, וללא שום בעיות.

במקרה הזה, יש לי רק מחמאות למיקרוסופט, הספריה העתיקה שלהם, עובדת מעולה.

מצבים כאלו, יוצרים תיסכול, כיוון שאילו זו הייתה ספריה אחת מתוך כמה – אז הייתי משתמש באחרות. אבל ב-PHP, נוצר מצב ש-2 הספריות העיקריות לא עושות את העבודה. ברוב הקבצים – ברור ששתיהן עובדות כמו שצריך.  אבל כשמגיעים קבצים עם קידוד בעייתי ועוד…כל ספריה מתנהגת בצורה בלתי צפויה בפקודות שלה.

מה המסקנה ?

אז אומנם php היא שפה מאוד כייפית לפיתוח, ומכילה כמות עצומה של פקודות וספריות, קהילה תומכת וכו' וכו'

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

חבל …אבל זה מה יש.

אם יש לכם קבצי xml שאתם הייצרנים שלהם , ו- php היא שפת הפיתוח שלכם, אז תישארו איתה. אבל כשיש קבצי xml שאתם לא שולטים במקור שלהם, ויש סיכוי לקבצים עם בעיות …תבחרו שפה אחרת כדי לקרוא אותם. זו ההמלצה שלי.

העברת DB מ- Access על Sql Server באמצעות SSMA

בפוסט הזה אני מציין מספר נקודות מעניינות לגבי העברה של DB מסביבת Access אל Sql Server ( במקרה שלי גירסת Exrpress )

1- מיקרוסופט הסירו מאקסס את האפשרות  לייצא ישירות ל- SQL SERVER

הם ממליצים להשתמש בכלי שלהם שנקרא Sql Server Migration Assitant

יש גירסאות שלו עבור כמה סוגי DB נפוצים ( MySQL ועוד )

 

2- הכלי עובד יפה, אם כי לא אינטואיטיבי כל כך – ועל כך הפוסט הזה.

דברים שצריך לשים לב אליהם :

שלב 1  – יצוא הטבלאות מ- Access אל Sql Server

 

  • עוד לפני שמפעילים את הכלי – צריך להיות מודעים להתאים גירסת האופיס לגירסת הכלי ( ה=SSMA)
    אם ה-Access הוא בגירסת 32 ביט, צריך להפעיל את ה-SSMA 32 Bit  ( כי ה-Default הוא 64  ביט )
    שימו לב שההתקנה הרגילה מתקינה אצלכם ברשימת התוכניות – 2 גירסאות (32+64 )
    אם לא מפעילים את הגירסה שתואמת ל-Office שמותקן על המכונה, מקבלים בהמשך הודעת שגיאה שה-DB שניסיתם לטעון בלתי ניתן לקריאה…מה שכמובן לא נכון.
  • יצירת DB – לפני שמפעילים את הכלי, יש לייצור DB ב-SQL Server  שיקבל את הטבלאות שנייצא.
  • יצירת USER עבור ה-DB – שרת ה-Sql server מציע 2 צורות של אוטנטיקציה.
    אם משתמשים ב-Windows Auth… על אותה מכונה, לרוב לא תהיה בעיה.
    אם זה תחת שרתים אירגוניים, צריך לוודא שליוזרים יש הרשאות ל-DB,
    חשוב  לתת ליוזרים הרשאות , גם תחת "Security" של ה-Sql Server (=הכללי בעץ)
    וגם תחת Security של ה-DB הספציפי.
    אפשרות קצת פשוטה יותר -היא שימוש ב-Sql Auth, וגם שם צריך לוודא שהיוזר שיצרתם, מורשה הן לגישה ל-Server והן ל-DB הספציפי.
  • כאשר סף סוף מפעילים את הכלי – עדיף לא להשתמש ב-wizard שקופץ בכניסה – הוא אומנם מוביל שלב אחרי שלב, אך מדלג  על חלק מהשלבים, ולכן לא כל כך עוזר…
  • הגדרה שכדאי, ואפילו חובה לבצע עוד בהתחלה, היא להיכנס למקום שבו מוגדר לאיזה סוג שדה הופך כל אחד מהשדות ( למשל :  שדה TEXT של Access הופך ל- nvarchar של Sql Server וכדומה )
    זה נעשה תחת Tools < Default Project Settings > Type Mapping
    כל ההגדרות תקינות …חוץ מאשר….Date של Access  – שמועבר בצורה שגויה אל Datetime(2) של Sql Server , הבעיה היא, שכאשר נסיים את תהליך העברת הטבלאות, ונקשור את הטבלאות בחזרה אל פרוייקט ה-Access שלנו, תהיה לנו בעיה – ש-Access לא יודע לקרוא את סוג השדה הזה , ולכן ממיר אותו אל Text …וזה כבר יוצר שגיאות וולידציה, ובעיות בקוד ה-VBA שמצפה ל- Datetime.
    הפתרון הוא להגדיר את השדות כ- Datetime רגיל ( בלי ה-2 )
    במקרה זה – ההמרה עוברת תקין.
  • השלב הראשון, הוא "יצירת פרוייקט" (דרך התפריט או דרך כפתור למעלה)
    חשוב לשים לב – לבחור במסך יצירת הפרוייקט את גירסת ה- Sql Server שלכם
    ה-DropDown הוא כמעט מוסתר, וברירת המחדל היא Azure….מה שלא בטוח שהתכוונתם.

    • נקודה נוספת באותו עניין – יש אפשרות להגדיר את זה תחת Tools > Defailt project settings  (גם כאן ה-Dropdown נסתר מהעין)
  • לאחר שמוסיפים את ה-DB של Access באמצעות Add Databases , יש לבצע שמירה של הפרויקט – השמירה גורמת ל-SSMA לטעון את ה-Metadata של הטבלאות.
    למה…ככה (מיקרוסופט ? )
  • השלב הבא הוא חיבור ל-SQL SERVER,  אם לא בחרתם מראש בגירסת ה-SQL SERVER הנכונה, אזי לא תוכלו להתחבר ל-SQL שלכם.
  • בסוף אחרי שהכל מוגדר , כדי לגרום לכפתור ה- Convert-Load_AND-MIGRATE לעבוד , חייבים ללחוץ ללחוץ על ה-Access DB הרלוונטי – ורק אז הכפתור הופך ל-Enabled
  • לאחר לחיצה על כפתור המרה ( Convert..load..and migrate )
    הכלי עובד די מהר וחלק, טוען את כל הטבלאות , ובונה אותן, כולל את המפתחות הזרים והאינדקסים.  אפשר לומר שזה החלק הטוב בכלי הזה, שבסופו של דבר הוא באמת מבצע את העבודה.

שלב 2 – חיבור של קובץ ה-Access אל הטבלאות ב-Sql Server

זה תהליך די מוכר לכל מתכנת Access, ואכתוב אותו בקצרה :

  • מוחקים ( בלי לפחד 🙂 ) את הטבלאות המקוריות ( בין אם הם מקושרות, ובין אם מאוחסנות בקובץ הזה )
  • תחת "נתונים חיצוניים" > יבוא וקישור >  מסד נתונים של ODBC > ניצור Connection חדש או בקובץ, או של מערכת ההפעלה  ולאחר יצירת ה-Connection נבחר בו כדי לקשור את הטבלאות.
    • בשלב יצירת ה-Connection יש לבחור בדרייבר של Sql Server , או Sql Server ODBC Driver
    • באחד ממסכי יצירת ה-Connection יש לשים לב לאפשרות של בחירת ה-Default Database – ולהפעיל אותה רק על ה-DB הרלוונטי ב-SQL Server
  • לאחר שנבחר ב-Connection שיצרנו – נסמן את הטבלאות לקישור, יש לשים לב לא לסמן גם את טבלאות המערכת של Sql server , אלא רק את הטבלאות המקוריות ששיכות לפרויקט שלנו ( זה לא משנה, אבל חבל סתם להעמיס טבלאות מקושרות שלא נחוצות על הפרוייקט)
  • אם אתם לא רוצים לשגע את היוזרים – כדאי לסמן את האפשרות לשמור את הסיסמה ( ואז ללחוץ על אישור בנפרד לכל אחת מהטבלאות….מיקרוסופט …!!!! )
  • זה עוד לא נגמר …בשלב זה, כיוון שהטבלאות ב-Sql Server מתחילות תחת "איזור" שנקרא לרוב dbo. אז בקישור ל-Access, פתאום מתווסף לכל הטבלאות בתחילת השם, הביטוי dbo_ , צריך לעבור טבלה-טבלה, ולשנות את השם בחזרה לשם המקורי. (או לכתוב\למצוא סקריפט שעושה זאת …)
    אחרת – אם לא נעשה זאת, השאילתות שלנו לא יעבדו.
  • וכאן הגיע הזמן לבדוק שהכל תקין.

בהצלחה.

 

נקודה אחרונה, אך ממש לא קשורה – למי שמפתח Web על אותה מכונה שעליה מותקן ה-Sql Server.

אחד ה-Services שמופעלים בהתקנת ה-Sql Server, נקרא Sql Server Reporting Service

ולמרבה הפלא …הוא תופס את Port 80  ….

כך שאם רוצים להמשיך לעבוד , צריך : או להשבית אותו ( services.msc וכו' )  או להמשיך לעבוד בפורט אחר עבור ה-localhost על המכונה.

פתרון לבעית – לא רואים עברית בעורך ה-VBA

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

אבל יש לזה יתרון אחד – המהירות העצומה של זמן הפיתוח ( בוא נגיד, שלפתח דבר כזה בכל שפת תכנות היה אורך פי 10-15 זמן לפחות )

על כל פנים, במסגרת זו השתמשתי בשרתים ב-Azure ובעוד סביבות, ופעמים רבות ה-VBA לא מציג עברית.

הנחת יסוד : התקנתם לכל הפחות תמיכה עברית ב-Windows

הפתרון לזה פשוט מאוד :

נלחץ על הגדרות השפה  ( דרך השפה לייד השעון, או דרך Lang…Pref. )

נבחר ב-Location

נבחר ב-Administrative

ובאפשרות Lang for non-unicode נבחר באפשרות Hebrew

 

וזהו.

התמודדות עם התקנת קובץ MSI על Windows Server שמחזירה הודעת שגיאה

בהתקנה רגילה על Windows Server של קובץ MSI תקין לגמרי, קיבלתי את ההודעה הבאה :

The System Administrator Has Set Policies to Prevent This Installation

חיפוש בהגדרות ה-Policy, לא עזר, לא הייתה שום מגבלה והרצתי את זה בתור Admin.

בסופו של דבר הפתרון הוא כזה :

להפעיל CMD בתור Admin

לנווט אל התיקיה הרלוונטית

להפעיל את הקובץ כך msiexec /i install.msi

זה עובד…

מקור: http://serverfault.com/questions/580972/why-is-this-preventing-me-installing-an-msi-the-system-administrator-has-set-po 

איך לכבות את Explorer enhanced security על Windows Server

שלום,

 

כשמקבלים VPS של Windows Server

אחד הדברים המעצבנים הוא ה- enhanced security שמופעל על אקספלורר.

כדי לכבות אותו יש לעשות כך :

מפעילים את Server Manager

לוחצים בצד שמאל על Local Server

במסך שמופיע מחפשים את הביטוי Explorer enhanced security

ולוחצים על ה-On ומגדירים את זה כ-Off (לכולם )

 

יש פה מדריך בתמונות למתקשים.