יום שלישי, 6 באוגוסט 2013

הוספת שדה לאובייקט מסוג JSON

נניח קיבלנו אובייקט מסוג JSON ונרצה להוסיף לו שדה נוסף, לפני שליחה שלו אל השרת.
 
var jsonObj = {
    user:
    {
                user1: "1",
                user2: "2",
                user3: "3"
      }
כך נוסיף שדה נוסף של משתנה בשם action עם הערך addUser:

jsonObj ["action"] = "addUser";

נוק אאוט עם Knockout.js

ספריה חמודה שמקצרת הרבה עבודה שחורה בחיבור בין הUI ל JS היא Knockout.js.

בשתי מילים מה היא עושה?
יש לנו בדף המון אלמנטים, במקום שכל פעם ניגש אליהם דרך getelementbyid פשוט נגדיר להם בתוך תגית HTML שם ע"י האלמנט data-bind, בטעינת הדף נטען את כל האלמנטים לתוך הDOM וככה נוכל בקלות לגשת, לשנות, לשלוח, למחוק.

בגדול, זה כמו מערך ששומר את כל הנתונים, אבל החוזק שאפשר לקבוע את היחס בין "המערך נתונים" לבין הדף:
ש"המערך" ישפיע על הHTML, אבל לא להיפך.
שהדף HTML ישפיע על "המערך", אבל לא להיפך.
קשר דו-כיווני, כל שינוי של אחד הצדדים, ישנה את הערך בצד השני.

היופי של Knockout.js שהיא מייעלת הרבה עבודה, לדו':
יש לנו טופס, שכל השדות שלו מוגדרים בdata-bind, הספרייה תוכל לעשות גם ולידציה של כל הנתונים בשורת קוד אחת (ע"י ספרייה נוספת בשם knockout.validation.min), וגם שליחה לשרת את כל הנתונים בשורה שנייה.
 
איך מתקדמים?
א. יש כמה פוסטים נהדרים של הרב דוטנט.
חשוב מאוד. זה לא מודגש בכל הפוסטים שלו (כי זה דבר מאוד הגיוני, אבל...) כשיוצרים את האובייקט שמכיל את כל האלמנטים בדף, צריך לצרף את האובייקט עצמו ע"י הפקודה  ko.applyBindings בעת טעינת הדף. ככה:
 

$(document).ready(function () {
    ko.applyBindings(viewModel);
});
 


ב. דוגמאות מגניבות באתר של Knockout.js

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



 

יום ראשון, 4 באוגוסט 2013

הוספת תמונה לחיפוש בגוגל

לשם הוספת תמונה בחיפוש בגוגל, צריך שני דברים:
א. חיבור מגוגל+ אל האתר:
      כניסה אל עריכת חשבון "ערוך את הפרופיל שלך" >  כניסה אל כותרת "קישורים" > "כותב גם באתרים" ושם הכנסה של כתובת הקישור.
      
ב. חיבור מהאתר אל גוגל+:
    הוספה לקוד של האתר (לא משנה היכן) את כתובת הגוגל+ בתוספת האלמנט rel="author"
 
<a href="https://plus.google.com/107150528670070620829" rel="author"></a>

במקום המספר שמופיע כאן, שנה למספר שלך.

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

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

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

יום ראשון, 21 ביולי 2013

הפיכת מסמכי PDF לתמונה

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

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

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

וישנו פתרון נוסף, ברמת השרת. הספרייה GHOSTSCRIPT עושה זאת בצורה יפה.
נייבא לפרוייקט את הספרייה, מופיע בNuGet , ונעשה בקוד עצמו הפניה לספרייה עצמה gsdll32.dll
גם בספרייה זו ישנם מספר מוטציות של אותו קוד,שכולם מסמתמכות על אותו כותב.
הקוד שלי הצליח נמצא כאן או דוגמא נוספת כאן

 

יום שלישי, 9 ביולי 2013

קבלת קורדינאטות של מיקום בGoogle Map

לאחר שפתחנו חשבון מפתחים ב"גוגל מפתחים", ניכנס לAPI CONSOLE
נרשמנו, לאחר כמה זמן נקבל אישור ונקבל מספר מפתח, ובקטגוריהAPI ACCESS
נבחר את המחרוזת הארוכה שיש ב API key.
עכשיו ניתן להוסיף באתר שלנו תיבת חיפוש של מפות (במידה ונעבור את 25,000 חיפושים ביום או חצי מיליון בכלל, נצרך לשלם ולקבל חשבון עיסקי. די לצרה בשעתה...)
 
נוסיף את הסקריפט הזה באתר שלנו (החליפו את ה$$$$ ב api key)

 
<script src="https://maps.googleapis.com/maps/api/js?key=$$$$&sensor=false"></script>


וכל פעם תקבלו משתנה  google.maps שהוא מנהל את כל ההתנהלות שלכם מול הAPI של המפות.
(תוכלו לראות שנוספו לכם המון קבצי JS, הידד!)
נ.ב. אלו המשתנים והפונקציות שאנחנו מקבלים בעת קבלת האובייקט אצלנו 
google.maps

לצורך העניין בנינו תיבה שבה המחפש רושם את המקום שלו, ואנחנו רוצים להמיר אותה לקורדינטות - כדי שבפעם הבאה נוכל להציג למשתמש מפה, מבלי לחפש. ככה נוכל לחסוך את החיבור לגוגל והרבה תעבורת רשת. אם רוצים לקבל מפה קבועה.
 
var adress_map = $.trim($("#sMap").val());
var point = new Array("jb", "kb");

point = getCodeAddress(adress_map);
 
function getCodeAddress(address) {
var geocoder = new google.maps.Geocoder();
geocoder.geocode({ 'address': address }, function (results, status) {
if (status == google.maps.GeocoderStatus.OK) {
  var point = new Array(results[0].geometry.location.jb, results[0].geometry.location.kb);
  return (point);
} else {
alert("אין אפשרות לקבל את הקודינאטות של המפה, תקלה: " + status)
}
});
}
 
 
 
 
 

 

 
 

יום ראשון, 30 ביוני 2013

גיבוי טבלאות וstored procedures בMSSQL

כמו כל דבר יש את שתי הדרכים, המגניבה שלא עוזרת, והמשעממת שעושה את העבודה.
אם אתם בעלי השרת: 
ניצור שני קבצים שהראשון מהווה פקודה בSQL, והשני יהיה פקודה שתריץ אותה מהמחשב האישי - ותעשה גיבוי בשרת עצמו.

נפתח את פנקס הרשימות ונכתב את הפקודה:
BACKUP DATABASE [שם מסד הנתונים] TO DISK = '\שם מסד הנתונים.bak' with init
 
 
נסגור את הקובץ ונשמור על שולחן העבודה, ונשמור זאת בסיומת SQL. ונקבל קובץ עם אייקון של SQL. לצורך העניין נקרא לו: backup.sql (כמה מפתיע...)
 
במידה ונריץ את הפקודה עצמה בSQL נקבל הודעה כזו:
 
Processed 472 pages for database 'שם מסד נתונים', file 'שם מסד נתונים_data' on file 1.
Processed 1 pages for database 'שם מסד נתונים', file 'שם מסד נתונים_log' on file 1.
BACKUP DATABASE successfully processed 473 pages in 0.061 seconds (60.578 MB/sec).

 
הקובץ גיבוי נשמר בשרת. עכשיו נושמים שנייה, ושוב נפתח את פנקס הכתובות ונכתוב קובץ נוסף, שיהווה את הפקודה שתריץ את הפקודה שכתבנו מקודם. נכתוב בקובץ עכשיו:
 
OSQL -U [שם משתמש] -P [סיסמא] -S [*המקום של השרת]  -i [מיקום הפקודה שמריצים**]
 
*80.80.800.180\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Backup\שם הטבלה
 
**C:\Users\sivan\Desktop\backup.sql
 
המיקום של הטבלה בשרת נכון על פי השרת שלי. איך גילתי?
אם ארצה לעשות את הפעולה גיבוי בשרת (שיכשל, כי אין לי הרשאות) קליק ימני על המסד נתונים ובחירת "משימות" (tasks) וגיבוי (back up) יראה לי היכן "אמור" הקובץ להישמר, וכך אני יודע היכן נמצא הטבלאות נתונים בשרת.
 
טוב, בכל אופן הקטע המגניב, נסגור את השורה ונשמור בקובץ בפרומט batch עם סיומת bat, בשם go.bat ונקבל אייקון של מערכת הפעלה. 
לחיצה על הקובץ ההפעלה תפעיל את הפקודה, ותבצע גיבוי של הנתונים שלי בשרת של החברה המארחת, שעוזר לי במקרה שהאתר קרס (ח"ו, טפו, טפו, טפו) לבקש מהם את הקובץ. כך בלחיצה אחת כל יום יש ראש שקט.
 
טוב, זה השיטה המגניבה, אבל לא ממש עוזרת אם אני רוצה אצלי את כל הנתונים.
לכן נבצע דרך הSQL שאילתה של גיבוי של הטבלאות יחד עם הנתונים שבתוכה, והכל יופיע בצורת פקודות הרצה.
 
איך?
שוב קליק ימני על מסד הנתונים, ובחירת "משימות", ובתוך משימות נבחר "יצירת סקריפים" ( Generate Scripts), נוכל לבחור מה לגבות:
טבלאות, סטור פרוסיג'יר, טבלאות משתמשים וכו'
 
במסך השני יש אפשרות לגבות הכל. אנו נבחר את האפשרות השנייה, לבחור בעצמנו מה לגבות ואז נבחר טבלאות (ישנה אפשרות לבחור רק חלק מהטבלאות).
 
ואז מגיע הקטע החשוב:
באופן דיפלוטיבי הSQL יוצר גיבוי של הסכמה של הנתונים, רק את הפקודות שיוצרות את הטבלאות, אבל אנחנו רוצים לגבות את הנתונים עצמם. בשביל כך נלחץ על כפתור Advanced (מתקדם), ותחת הקטגוריה   General באפשרות האחרונה Types of data to script נשנה ממצב של Sechema only למצב של Sechema and data.
 
מכאן NEXT יעשה את העבודה,  הוא ירוץ על כל הטבלאות ויהפוך אותן לפקודות של יצירת טבלה, ואת כל הנתונים הוא יכניס בצורה מסודרת בפקודת INSERT .
 
אם קרה משהו למסד נתונים (חס וחלילה, כנ"ל), פתיחת הקובץ טקסט הזה ולחיצת F5 יבנה לנו את הכל בחזרה.
 

יום חמישי, 27 ביוני 2013

הפנייה לדף אחר בJS ובJQ

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

page = www.exp.co.il;

window.location.href = page;
window.location.replace(page);
location.assign(page);



או בJQ:

  $(location).attr('href', page);