כל הפוסטים של admin

מעבר מ-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 (לכולם )

 

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

התקנת MongoDB על Windows + דרייבר ל-Php

שלום,

רן בר זיק כתב כאן שהתקנה על ווינדוס יכולה להיות סיפור ואכן הוא צודק.

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

אני מתעד פה, את התהליך בקצרה , תוך ציון מקורות רלוונטים :

נתחיל בהתקנת מנוע ה-MongoDB בעצמו.

  1. מורידים את הגירסה הרלוונטית מהאתר של MongoDB
  2. נכנסים לתיקיה שבה זה הותקן
    C:\Program Files\MongoDB\Server\3.2\bin
    שימו לב שאם התקנתם גירסת 32 ביט, אז התיקיה תתחיל ב-Program Files(x86
  3. במידה ואתם עובדים עם Win 7 או win server 2008 R2 אז צריך להתקין hotfix
    למי שעדין לא התקין hotfix אף פעם – זה תיקון של מיקרוסופט שצריך לבקש אותו בקישור הזה , נכנסים לקישור, מכניסים כתובת מייל, ומקבלים אימייל עם קישור להורדת ה-Hotfix
    ואז מחלצים אותו, ומפעילים את הקובץ שחולץ, ובסוף התהליך restart
  4. בתיקיה שבה הותקן MongoDB ( סעיף 2 )
    נפתח CMD ונכתוב פקודה שתיצור תיקיית ברירת מחדל עבור הדאטאבייסים
    md \data\db
  5. סוף סוף – נפעיל בתוך ה-CMD את ה-Listener של MongoDB באמצעות הפקודה mongod.exe
    ולא נסגור את החלון של ה-CMD
    למי שרוצה להתקין את Mongo כ-Service שרץ ברקע , אז יש הוראות בתחתית הדף הזה 
  6. כדי להריץ את ה-Console של MongoDB , צריך לפתוח CMD חדשנפרד , ולהיכנס לתיקיה של מונגו, ושם להפעיל את mongo.exe

עכשיו לחלק של התקנה על PHP שיושב על Windows

אני עובד עם EasyPHP שמריץ גירסה 5.6 / 7 עם כל ה-LAMP מלא וכו'.

  1. דבר ראשון נבדוק האם גירסת ה-PHP שלנו היא Theard Safe או Non Theard Safe
    לצורך כך צריך ליצור קובץ עם הפקודה phpinfo() ולהריץ בדפדפן ( או דרך ה-CMD )
    עכשיו נחפש בתוכן את הביטוי Theard  – אם השורה הזו מסומנת כ-enabled , זאת אומרת שאנחנו עובדים על גירסה TS ( Theard Safe, אחרת – NTS
  2. עכשיו צריך לאתר את תיקית ברירת המחדל שבה מאוחסנים קבצי ההרחבות של php. ההרחבות הן קבצי dll ובדרך כלל, הן "לייד" התיקיה שבה יושב php.exe , תחפשו קצת ( השלב הזה אינו חובה, כי ניתן אומנם לשים את קובץ ההרחבה בתיקיה שונה, אבל זה עדיף מבחינת הסדר הטוב שכל ההרחבות יהיו מרוכזות באותו מקום ) .
    תשמרו את התיקיה פתוחה בשביל השלב הבא.
  3. עכשיו נוריד את ההרחבה ( driver ) של MongoDB עבור PHP מהאתר של PECL בקישור הזה https://pecl.php.net/package/mongodb
    תלחצו על הגירסה האחרונה, ותורידו את הקובץ DLL עבור גירסת ה-PHP שאצלכם ( לפי מה שבדקתם בסעיף 1 )
  4. תאחסנו את הקובץ בתיקית ההרחבות של php
  5. תוסיפו הפניה להרחבה בקובץ php.ini
    אצלי זה נראה כך  extension=php_mongodb.dll
  6. תעשו Restart לשרת ה-Apache
    ותבדקו שהכל תקין באמצעות phpinfo או php -v
    אם הכל תקין, אתם אמורים לראות ב-phpinfo שורות חדשות שעוסקות ב-MongoDB
  7. אפשר לעבוד סוף סוף – רק לזכור לא לכבות את ה-CMD שמפעיל את ה-MongoDB Server כל עוד לא סיימתם ( לחלופין – אפשר פשוט להגדיר את מונגו כסרוויס ברקע)

בהצלחה

שאילתא שמוצאת רשומות שבהן המפתח הזר לא קיים בטבלת המקור

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

הצורה הכי פשוטה ( בעיני ) היא כך

SELECT * FROM doc_recive where dr_id not in (SELECT dr_id from doctors where doctors.dr_id=doc_recive.dr_id)

יש כל מיני טכניקות לעשות את השאילתות האלו יותר יעילות

אפשר להשתמש ב-Not Exists , או ב Is null

ולמי שרוצה להתעמק – יש בקישור הזה השוואה

 

להוציא את המשתמש אוטומטית לאחר זמן מה ללא פעילות ( jquery plugin inactivity )

באפליקציות אינטרנט שמצריכות כניסה – יש עניין שבצד השרת – מנוהל לרוב Session

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

כדי לתת מענה לכך – אז בפריימוורקים של צד שרת , בדרך כלל אפשר לזהות אם פג תוקף ה- Session ואז לעשות redirect למשתמש.

אבל במקרה של שימוש ב- Ajax או אפליקציה שבנויה עם פרייוורק JS, צריך פתרון גם ברמת צד הלקוח.

יש הרבה פתרונות JS

אני מצאתי שהתוסף הבא ל- Jquery הכי נוח.

קישור לתוסף ב- Githut

קוד להמחשה ( במצב פרודקשיין, אולי כדאי לעשות קריאת אגקס לשרת, לבדוק אם ה Session בתוקף, אבל הקוד יעבוד היטב גם בלי זה )

הערה : השורה הראשונה מושכת את הסקריפט, אני עובד עם Laravel בצד שרת, ולכן הפקודה asset – וסימני הסוגרים המסולסלים ( כנ"ל בשורה האחרונה ) .

<!-- jquery inactivity -->
<script src="{{ asset('js/jquery-inactivity/jquery.inactivity.min.js') }}">



</script>
<script>
    // https://github.com/afklondon/jquery.inactivity
    $(document).inactivity( {
        interval: 1800000, // the timeout until the inactivity event fire [default: 3000]
        mouse: true, // listen for mouse inactivity [default: true]
        keyboard: true, // listen for keyboard inactivity [default: true]
        touch: true, // listen for touch inactivity [default: true]
        customEvents: "", // listen for custom events [default: ""]
        triggerAll: false , // if set to false only the first "activity" event will be fired [default: false]
    });
    $(document).on("inactivity", function(){
        // function that fires on inactivity
        console.log('loged out beacuse of inactivity');
        window.location = "{{ route('logout') }}";
    });


</script>