ארכיון יומי: 22 מרץ, 2010

מרתף היין

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

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

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

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

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

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

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

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

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

עידו

Singing xmlrpc with Ruby and Sinatra

I was fighting Sinatra in order to make it an xmlrpc server. The big problem is that the xmlrpc library that arrive with Ruby -> well it sucks big time.

The client actually really nice, but the server really sucks. So, I started fighting the XMLRPC, and Sinatra did not like some of my work, and did not want to go to stage to perform, and I needed to talk with it's manager 🙂

At the end I found out why Sinatra and XMLRPC server does not like each other, and I was able to make Sinatra work with XMLRPC server at the end. The problem of course is the XMLRPC, and Sinatra actually a fine singer (so take off the Mafia from me now ok ?).

So how we can make Sinatra find dity and perform with XMLRPC as a server ?

Here is a Proof of concept for working with the two of them (writing it without testing the PoC):

#!/usr/bin/env ruby
require 'rubygems'
require 'sinatra'
require 'uri'
require 'xmlrpc/server'
require 'xmlrpc/marshal'
require 'xmlrpc/parser'
require 'xmlrpc/create'
require 'xmlrpc/config'
require 'xmlrpc/utils'

module MyModule
  class Application < Sinatra::Base
    def initialize(app=nil)
      super                        # we are inheriting stuff from older constructor
      ...                          # fill in the missing stuff you need for your app
      @rpc = XMLRPC::CGIServer.new # We are using general server rather then actual server
      # The line bellow is a MUST for make it work properly, add some dummy call
      # or if we have only one call, it will also work for us
      @rpc.set_default_handler do | dummy |
        dummy
      end # @rpc.set_default_handler do | dummy |

      # <?xml version="1.0"?>
      # <methodCall>
      #   <methodName>ngx1.call_init</methodName>
      #   <params>
      #     <param>
      #       <value>
      #          <struct>
      #             <member>
      #               <name>x</name>
      #               <value><int>10</int></value>
      #             </member>
      #             <member>
      #               <name>y</name>
      #               <value><int>10</int></value>
      #             </member>
      #          </struct>
      #       </value>
      #     </param>
      #   </params>
      # </methodCall>
      @rpc.add_handler('sum') do | x, y | # names of params must be equal to the rpc names
         x + y   # sending the result as xmlrpc
      end # @rpc.add_handler('sum')

    end # initialize(app=nil)

    get '/' do
      throw :halt, [400, 'XML-RPC server accepts POST requests only.']
    end # get '/' do

     post '/' do
       throw :halt, [400, 'bad request type'] unless request.content_type =~ %r|text/xml|
       headers 'Content-Type' => 'text/xml'
       begin
         @responce = @rpc.process(request.body.read) # lets read the content from the client and proccess it
       rescue RuntimeError
         header 'Content-Type' => 'text/plain'
         throw :halt, [400, 'bad request type']
       end # rescue
     end # post '/' do

   end # Application < Sinatra::Base
end # MyModule

And now Sinatra can sing again "New York New York" -> "If i can make it there, I'll make it anywhere"