‏הצגת רשומות עם תוויות xml-rpc. הצג את כל הרשומות
‏הצגת רשומות עם תוויות xml-rpc. הצג את כל הרשומות

יום שני, דצמבר 05, 2011

הצרות שלי עם SOAP

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

ישנם היום הרבה דרכים להשתמש ב RPC על גבי רשת (ידוע גם כ webservices) זה יכול REST הישן והטוב (פשוט תממשו url לכל בקשה).
זה יכול להיות XML-RPC המצויין לדעתי.
אבל לצערי המון פעמים רואים שימוש ב SOAP בלבד , ותמיכה בסוג אחד של סביבה נתמכת.

הסיבה לפחות בארץ היא שליטת אחת מסביבות הפיתוח בשוק (מישהוא אמר .NET ?) ושם כברירת מחדל מופיע בשימוש ב SOAP (אם מישהוא רוצה להעביר מידע הדרך הפשוטה בשבילו ביותר היא SOAP) , אם לפני שנים אנשים למדו והבינו עם מה עובדים היום יש כמות אדירה של פקידים שלא זזים מילמיטר מהמקום הבטוח שלהם שפשוט מושכים תפריטים.
לא פעם שמעתי תגובות מה איך אתה משתמש ב webservices מתוך C++ ואיך בכלל אתה משתמש ב telnet - זה בטח האקינג... 

והחלק הנורא ביותר - הwsdl שלך אי אפשר לעבוד איתו.
לקח לי שבועות להבין שהרבה פקידים פשוט לא מזיזים את התוכס שלהם בשביל לכתוב קוד נכון שידע לעבוד גם עם encoded וגם עם literal.
אתם חושבים שזה הכול ? 
מתברר שהרבה צועקים שאי אפשר להשתמש ב soap ולהחזיר תשובה כאשר זו לא נמצאת בתוך  בקונטיינר (יש אלמנט תשובה ובתוכו עוד כלל התשובות שלכם).
משום מה ברירת המחדל של יצרת complex type אומרת שכולם צריכים לעבוד לפי החליל של MS (מי שעובד ב Java מקלל במיוחד את יצור הwsdl ).
לאלה מאיתנו שכותבים קוד ב C++ קל יותר יש לנו מספר חבילות שדואגות לנושא (הממ .. gsoap + libxml) , ברגע שיש דרישה אנחנו פשוט משנים את הפורמט בלי יותר מדי כאב ראש.

על כן יש לי (ולהרבה אחרים) כלל - 
במהלך ההכנה לחוזה אנו כותבים כי כלל הממשקים חייבים להציג את כי פעולת התקשורת אפשרית באמצעות אפליקציה צד שלישי מוכרת (soapui/telnet).

זה נשמע לכם כמשהוא מוזר אבל לפעמים מגלים שצריך איזשהוא dll בשביל לבצע עוד תקשורת ועיבוד של המידע (הממ... crms המממ...). כן כן אבל ה webserivce שלי דורש NTLMv2 יגיד המתכנת (לדוגמה בdynamics) - למצב כזה אנחנו יכולים להתמודד שלauthntication נדאג אחרי זה (כי gsoap לדוגמה מאפשר זאת ) וחוץ מזה שכבר זונחים את NTLM ועוברים לkerberos.
בגלל זה עדיף לחלק את העבודה בין עבודה עם רק webservices לעובדה עם מכלול אפליקציות אחרות שצריך לתקשר איתם.

הרי בשביל מה יש ממשק וובי / webservices אם צריך עוד אפליקציה בשביל לעבוד זה (ראה ערך dynamics crm / owa בלי outlook שמותקן על המחשב המקומי).

אז מה קורה כאשר יש לנו חברה שלא ממש רוצה לעזור למתכנתים לעבוד עם ה CRM שלה ?
נכון אנחנו נתקעים מצד אחד עם קוד שהוא בעייתי לעבודה (אי אפשר להבין למה השרת) ומצד שני כאשר אנו כבר יוצרים קשר עם מישהוא הוא לא מסוגל לעזור בשביל לפתור את הבעייה.

(עדיין תקוע עם webservice בשביל לגרום לCRM לעבוד עם akonadi :-( )

יום שישי, אפריל 16, 2010

לבחור מערכת הפעלה

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

לדעתי (ולדעת אנשים רבים אחרים) מה שאנו רואים היום (שליטה של פרימוורק כזה או אחר בשוק) היא תוצאה של חינוך, של פרסום טוב והעובדה שאנשים התרגלו להשתמש במה שהם מכירים. האם לדעתי פיתוח של מערכת שתיהיה מבוססת על טכנולוגיה מסויימת צריכה להיות מושפעת מזה ? לדעתי לא.
בחירת טכנולוגיה לפיתוח צריכה להבצע לאחר שיחה עם צוות טכני שמכיר את שתי הטכנולוגיות:
להשתמש בunix באוניברסיטה או להתקין אובנטו ולהשתמש בה שלושה חודשים לא נחשב אפילו כהקרות ולתת להם לחוות דעה מקצועית טכנולוגית לאחר מכאן צריך לתת לאנשי הכלכלה לתת את הדעה.
כמות האנשים ש"מכירים" את השימוש במערכות לינוקס מדהימה אותי בין אם זה מישהוא שהתשתמש בלינוקס ב94 עד 97 (יצאה אמיתית), ובין אם זה כל מני מתרגלים / מפתחים שאולי ראו פעם אחת איך משתמשים בvim.

האם מערכת שתרוץ על דביאן / גנטו בתחום התקשורת תהיה עדיפה על ריצה של מערכת שמריצה windows 7 ?למרות שהתשובה הראשונה שלי (מה לעשות אני איש דביאן) תהיה כן, אני נאלץ להגיד שבלי לדעת מה הן שאר הדרישות קשה לענות.
אם מדובר על מערכת שתעבוד כשרת בלבד שתספק תשתית web אז כן אבל יהיה שימוש בטכנולוגיות הטבעיות של המערכת: אם צריכים webservice או שצריכים יכולת עבור xmlrpc , אבל בכל מראה לא יהיה ניסיון לכתוב בC#.
אבל אם יש צורך לפתח בC# אז עדיף שלא, מצד שני לבחור שפה כי רק אותה המתכנתים מכירים זה בעייה של העסק.

אם צריכים לעבוד עם בסיסי נתונים אז לא רק MySQL קיים יש עוד מספר מספיק טובים לבחור מהם.אם מדובר על מערכת שתעביר SIP או IAX אז תשובתי תהיה בוודאות מערכת מבוססת דביאן / סנטוס וכן הלאה :
מפני שכמות הפתרונות השונים והחופשיים לזה מאוד גדולה. כך אין צורך להשקיע בפיתוח נוסף עבור דבר שהוא טרוויאלי למערכת. יש יותר מפתרון אחד של פיתוח עבור נושאי תקשורת ובסיסי נתונים צריך רק להשקיע זמן בבחירה של זה. מפתיע בחירות עיסקיות על בסיס הכרות חפוזה עם טכנולוגיה.

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


יום ראשון, יולי 05, 2009

שיעורי בית ברישיון חופשי

כחלק מהלימודים שלי לקחתי עשיתי קורס טסטינג (הידוע יותר בשם QA) , בחרתי לעשות חלק מהפרוייקט בפרל (את צד השרת) בגלל שזו אחת השפות שאני אוהב והיא נתנה לי מענה מספיק טוב למה שייתי צריך.
הפרוייקט מורכב משלושה חלקים :
בסיס נתונים mysql
ממשק xml-rpc הכתוב בפרל
ממשק gui הכתוב בשפה האסורה (דרישות הפרוייקט).

הפרוייקט משוחרר תחת שני רישיונות הקוד תחת רישיון MIT , והתיעוד תחת CC-BY-SA .

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

לאחר מעבר על הפרוייקט (הבלה בלה הידוע יותר כתיעוד ) נוכחתי לדעת כי הקושי הגדול ביותר זה העיצוב כך שישאר זהה בכמה שיותר סביבות.
עבדתי עם קבצי ODT ו pdf אבל בדיעבד אני יכול להגיד לאנשים שהולכים לכתוב SRS ומסמכי בדיקות כל יותר לעבוד עם בסיס נתונים (והנה צופר לעידו) לא טבלאי ובכך לנצל קשרים טוב יותר (את האובייקטים).
הלא חלק גדול מהחומר שנמצא במסמכי ה STP הינם הרחבה מהSRS והSTD הוא פשוט בדיקה עבור כל אחד מהסעיפים.
הרעיון הוא לשפוח את בסיס הנתונים לטבלאות ולא לערוך טבלה טבלה.

מקווה שזה יעזור למישהוא בעתיד.


נ.ב.
לא היה לי זמן לעשות חבילות התקנה (deb ו exe) בתקווה שאעשה זאת בקרוב.


יום שישי, יוני 05, 2009

פרוייקט בTesting

בפרוייקט שלנו בTesting התבקשנו לפתח מערכת שרת לקוח בנקאית שמדברת עם מערכת של בסיסי נתונים.
מכיוון שאני איש קוד פתוח כמעט כל הטכנולוגיות יהיו תחת תחת רישיונות חופשים (פרט לקטעי קוד ב C# שאינני יודע מה הרישוי המתאים).

הכלים הנדרשים בשביל הפרוייקט -
לריצה :

מערכת דביאן התקנה בסיסית.
שרת mysql5.5
מפרש פייתון 2.5

לפיתוח:
אנו (אני ולאוניד) משתמשים במערכות kdevelop ו Visual Studio 2008 אולם אין שום השפעה לסביבת הפיתוח על הקוד.
הקוד משתמש בשני סוגים של Makefile אחד של cmake ואחד של VS2008.

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

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

עדיין לא למדתי איך להגן על ההודעות ה XML (אני חושב להעביר אותן בתוך tunnel של SSH) מפני בעיות.
בחרתי בסגנון הזה לאחר שהתייעצתי עם מפתח נוסף עידו קנר שהציע מספר פתרונות להעברת האובייקטים והמליץ על הסגנון הזה.

ולת'כלס:
על מנת להרים שרת xmlrpc פשוט אפשר להשתמש בקוד פייתון הבא :


#! /usr/bin/env python

import SocketServer
from SimpleXMLRPCServer import SimpleXMLRPCServer,SimpleXMLRPCRequestHandler

# Threaded mix-in
# Use it as asynchronic (Fire and forget)
class AsyncXMLRPCServer(SocketServer.ThreadingMixIn,SimpleXMLRPCServer): pass

# The object that will be used to publish the functions
class TestObject:
# Just some foo function
def foo(self, x, y):
s = str(x)
return "Fooish function with (" + str(x) + "," + str(y) + ")"


# Instantiate and bind to localhost:8080
server = AsyncXMLRPCServer(('', 8080), SimpleXMLRPCRequestHandler)

# Registar the listMethod function
server.register_introspection_functions()

# Register example object instance
server.register_instance(TestObject())

# run!
server.serve_forever()


לאחר מכאן נרצה להוסיף קצת התחברות של MySQL:


#! /usr/bin/env python

import SocketServer
import MySQLdb

from SimpleXMLRPCServer import SimpleXMLRPCServer,SimpleXMLRPCRequestHandler

# Threaded mix-in
# Use it as asynchronic (Fire and forget)
class AsyncXMLRPCServer(SocketServer.ThreadingMixIn,SimpleXMLRPCServer): pass

# The object that will be used to publish the functions
class TestObject:
# Just some foo function
def foo(self, x, y):
s = str(x)
return "Fooish function with (" + str(x) + "," + str(y) + ")"

# Make a connection for each query
def showTables(self):
Con = MySQLdb.Connect(host="127.0.0.1", port=3306, user="user", passwd="password")
Cursor = Con.cursor()
sql = "show databases;"
Cursor.execute(sql)
Results = Cursor.fetchall()
Con.close()
return Results


# Instantiate and bind to localhost:8080
server = AsyncXMLRPCServer(('', 8080), SimpleXMLRPCRequestHandler)

# Registar the listMethod function
server.register_introspection_functions()

# Register example object instance
server.register_instance(TestObject())

# run!
server.serve_forever()

בחרתי להשתמש בpass רק בשביל שיטת השגר ושקח (ואולי זה לא ממש נכון וצריך להשתמש באותו הconnection) הרעיון הכללי הוא לתת ל MySql לשבור את הראש בניהול החיבורים.
צריך לעבוד על זה עוד קצת בשביל להביא את זה למצב תקין וטוב.


לעצלני ה C# ניתן הקטע הבא (לקוח ) - אני בטוח שתסדרו מצויין (xmlrpc.net) :

using CookComputing.XmlRpc;

public struct SumAndDiffValue
{
public int sum;
public int difference;
}

[XmlRpcUrl("http://www.cookcomputing.com/sumAndDiff.rem")]
public interface ISumAndDiff : IXmlRpcProxy
{
[XmlRpcMethod]
SumAndDiffValue SumAndDifference(int x, int y);
}

איך מרימים מערכת ?
משתמשים בסביבת הוירטואליזציה החביבה עליכם אני אישית מעדיף את qemu אבל כל אחד יכול להשתמש במה שהוא הוא אוהב.
אז :


qemu-img create -f qcow foo.img 1GB
qemu -boot d -cdrom debian-501-i386-netinst.iso -hda foo.img

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

ה Testing עצמו :
יתבצע באמצעות TAP או cucumber או כל סביבה אחרת שהבודקים ירצו (רק שתיהיה חופשית).