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

13 October, 2019

Omer Zak

Get DisplayLink to work on Lenovo Y700 after upgrade to Debian Buster


Graphics cards (in my system, they are configured to work in hybrid mode):
Docking station with DisplayLink support:

Using the NVIDIA graphics card

The following point is probably irrelevant to DisplayLink usage and problems. However it is part of my environment and I mention it for completeness sake.

The laptop is configured, as instructed by https://wiki.debian.org/Bumblebee, to work with the Intel graphics card. The NVIDIA card is used by applications running under optirun. I had to modify /etc/bumblebee/bumblebee.conf to use KernelDriver=nvidia-current rather than KernelDriver=nvidia.

Connecting two additional displays to the laptop

To install the appropriate driver:

When everything works properly, three displays are identified by xrandr -q | egrep axis as follows:

Note that those displays could have different identifiers (such as DP1 or eDP1) in your system.

After starting the X-Window, configure the displays using:

  1. xrandr –output HDMI-1 –primary
  2. xrandr –output eDP-1 –mode 1360×768 –right-of HDMI-1
  3. sleep 1     # without it, the following display was not properly configured.
  4. xrandr –output DVI-I-1-1 –left-of HDMI-1

You probably want to add those commands to your ~/.xinitrc.
I chose the 1360×768 mode to have the same DPI in all attached displays.

Problems when upgrading from Debian 9 (Stretch) to Debian 10 (Buster)

The above setup worked under Debian 9 (Stretch).
However, after upgrade to Debian 10 (Buster) following the instructions in Release Notes for Debian 10 (buster), 64-bit PC, chapter 4, either the X-Window server did not work or the display connected via the docking station exhibited misconfiguration.

I got it to work as follows:

  1. git pull
  2. If the latest commit did not work for you, try:
    git checkout fcb6ce5bc36c774af2d7f792842bcd2ede9c7483
    as this commit worked for me after performing the following steps.
  3. Reinstall the driver by running displaylink-debian.sh and following the instructions in README.md.
  4. Finally, replace the contents of the file /etc/X11/xorg.conf.d/20-displaylink.conf, installed by the above instructions by the following:
    Section "ServerLayout"
        Identifier "layout"
        Screen 0 "Intel Graphics"
        Inactive "nvidia"
    Section "Device"
        Identifier "intel"
        Driver "modesetting"
        Option "PageFlip" "false"
        Option "AccelMethod" "None"
    Section "Screen"
        Identifier "intel"
        Device "intel"
    Section "Device"
        Identifier "nvidia"
        Driver "nvidia"
        Option "ConstrainCursor" "off"
    Section "Screen"
        Identifier "nvidia"
        Device "nvidia"
        Option "AllowEmptyInitialConfiguration" "on"
        Option "IgnoreDisplayDevices" "CRT"
    Section "Device"
        Identifier "Intel Graphics"
        Driver "modesetting"
        Option "VSync" "false"
    Section "Screen"
        Identifier "Intel Graphics"
        Device "Intel Graphics"
  5. You need to restart the X-Server (I restarted the entire laptop to be on the safe side).

See GitHub issue: AdnanHodzic/displaylink-debian, Debian buster #308 for a similar bug report.


I wish to thank Boris Shtrasman for reviewing a draft of this post and providing a lot of feedback. Of course, any remaining inaccuracies in this post are my sole responsibility.

13 October, 2019 04:12 PM

Guy Rutenberg

Compiling lensfun-0.3.95 on Debian Buster

Lensfun provides lens distoration correction for Darktable and other raw processing applications. Version 0.3.95 provides ability to use the Adobe Camera Model, and hence use Adobe lens profiles (lcp files). However, lensfun 0.3.95 is not packaged for Debian Buster. Also Darktable won’t compile against the latest git version of Lensfun, so you must compile and install specifically version 0.3.95 to get ACM support.

We begin by downloading and extracting Lensfun 0.3.95. Lensfun 0.3.95 is not tagged in git, so we have to download the release directly from SourceForge. The release is not available from the GitHub repository.

$ wget https://sourceforge.net/projects/lensfun/files/0.3.95/lensfun-0.3.95.tar.gz
$ tar -xvf lensfun-0.3.95.tar.gz
$ cd lensfun-0.3.95/

Lensfun uses CMake for building and has also has CPack enabled. We can use it to build a deb package and install it. This allows easier integration and uninstallation in the future.

$ mkdir build
$ cd build
$ make -j`nproc` && make package
$ sudo apt install ./liblensfun2_0.3.95.0_amd64.deb

13 October, 2019 07:03 AM

08 October, 2019

Guy Rutenberg

libGL error: unable to load driver: radeonsi_dri.so

After playing with installing and removing the amdgpu and amdgpu-pro drivers, my system could not load the radeonsi. glxinfo returned the following error:

$ DRI_PRIME=1 glxinfo | grep OpenGL
libGL error: unable to load driver: radeonsi_dri.so
libGL error: driver pointer missing
libGL error: failed to load driver: radeonsi

It was solved by cleaning up leftover symlinks and reinstalling libgl-mesa-dri

$ sudo find /usr/lib/ -lname "/opt/amdgpu/*" -print -delete

$ sudo apt install --reinstall libgl1-mesa-dri

08 October, 2019 12:33 PM

23 September, 2019

Itzik Kotler

Demystifying Criminal Hackers

As I write these pieces for Forbes Tech Council, I’ve tried to chip away at the Hollywood reputation that hackers have been given over the years. That reputation often keeps people from making good decisions about how to protect their networks and data, keeps people focused on the wrong security priorities, and causes people to give up before the game is over.

It’s important to keep in mind, however, that while criminal hackers may be smart and devious, they are also, in a sense, entrepreneurs who are in the game to make a quick buck. As such, they realize that hacking costs money and so they will do what they can to keep their operating costs low. Why, then, would you expect a criminal hacker to expend time and money developing specialized tools when there are easier ways to get to what they want?

Read the full article at Forbes here

Full text

23 September, 2019 11:38 PM

21 September, 2019

Boris Shtrasman

משלוח התראות של פיקוד העורף ב KDE ו Gnome

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

צריך להוריד את סמליל פיקוד העורף ולשים אותו ב

כשיש התראה קופץ חלון התראה גרפי:

בשביל חיבור ממשק טקסט (משל ssh) יש גם התראת טקסט :
Broadcast message from user@pi (pts/4):         

Oref : [{
"title" : "התרעות פיקוד העורף ",
"data" : ["מבקיעים"]

הקוד עצמו  :
#License : MIT
#Copyright (c) 2019 Boris Shtrasman

#Permission is hereby granted, free of charge, to any person obtaining a copy
#of this software and associated documentation files (the "Software"), to deal
#in the Software without restriction, including without limitation the rights
#to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
#copies of the Software, and to permit persons to whom the Software is
#furnished to do so, subject to the following conditions:

#The above copyright notice and this permission notice shall be included in all
#copies or substantial portions of the Software.


if [ $# -ne 1 ]; then
echo "$0 expect alert url"
echo "example:"
echo "$0 http://www.oref.org.il/WarningMessages/Alert/alerts.json";
exit 1
#send a notification for each user that has X session, and accept notif
function notify_user()
users=($(who | sed -nr "s/([a-z]*)[ \t]*.*\((:[^)]+)\).*/\1,\2/p" | sort|uniq))
for i in "${users[@]}"
user=$(echo $i | cut -d',' -f1)
screen=$(echo $i|cut -d',' -f2)
id=$(id -u $user)
#I use screen to avoid blocking the process for other connected users, I'm obligated to use sudo as notify-send need to be run under the same user which own the session.
#This unfurtunatly will take over fullscreen Firefox or flash video
screen -Dm sudo -u $user /bin/bash -c "DISPLAY=$screen DBUS_SESSION_BUS_ADDRESS=$DBUS_SESSION_BUS_ADDRESS /usr/bin/notify-send -t 15000 -i /usr/share/oref/240px-Pakar.svg.png -u critical \"$summary\" \"$text\""


result=$( wget --header="Referer: https://www.oref.org.il/" \
--header="X-Requested-With: XMLHttpRequest" --header="User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0" --header="Accept: application/json, text/javascript, */*; q=0.01" -qO- $1)

if [ -e "$result" ]; then
echo "empty"
exit 0

if [ ${#result} -lt 1 ]; then
exit 0

#Send alert over all shells on the system.
wall "Oref : [$result]"
#Send alert for each UI session that support notify-send
title=$(echo $result|jq -s -r '.[].title')
amount_of_alerts=$(echo $result |jq -s '.[].data | length')
#if there had been no data members we can not iterate over it
if [ ! -z "$amount_of_alerts" ]; then
for (( alert_index = 0 ; alert_index < $amount_of_alerts; alert_index++))
area=$(echo $result|jq -r -s ".[].data| .[$alert_index]")
notify_user "Oref $title $date" "$area"

exit 0

בדיוק כמו בפעם הקודמת צריך להשתמש בשעון עצר של systemd (פורסם בלינק הקודם).

עריכה :

הקוד הזה דורש ש notify-send , jq ו wget יהיו מותקנים במערכת.

הקוד הזה מיועד ל X , אין לי wayland מותקן,  ואין לי דרך לדעת איך wayland עובד עם notify-send או אם notify_user()  תעבוד שם.

יש להפעיל את התסריט הזה מטיימר  או שורת cron, בשביל למשוך התראות חדשות 

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

21 September, 2019 08:10 PM

08 September, 2019

Diego Iastrubni

המסע אל אנדרויד 12 – MotoX 2014 – הסוף – לא?

לאחר שהמכשיר האחרון שלי נשבר לו המסך (פעמיים… לא היה חודש טוב) והסוללה לא עבדה, עברתי אל מכשיר חדש: MotoX 2014 victara.

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

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

אבל לא על זה אני רוצה לספר – אלא על משהו שלא צפיתי. המתחזק של ה־ROM הזה ב־Lineage פרש, אז המכשיר הפסיק להיות מכשיר “רשמי”. ואז גם TWRP הפסיקו לתחזק את ה-Recovery… זה אומר שהקהילה של המכשיר נעלמה. ואז… באמת אתה מרגיש בודד.

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

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

https://wiki.lineageos.org/devices/victara  https://download.lineageos.org/victara

הטקסט המלא

08 September, 2019 08:11 AM

03 September, 2019

Gilad Ben-Yossef

הנחיות לבריחה מהמטריקס

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

"עשה מה שליבך חפץ"

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

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

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

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

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

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

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

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

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

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

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

בתמונה: מכשיר נוקיה 208 טיפש

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

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

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

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

והיום, במקרה, מצאתי פתרון גם לזה. מסתבר שנוקיה, או לפחות החברה שקנתה את המותג של נוקיה לטלפונים סלולריים, הוציאה לפני שנה בערך טלפון חדש ישן – הנוקיה 8110 4G. זה טלפון טיפש (מאוד) ולא מאוד נוח אבל כן יש לו יכולות אינטרנט מוגבלות ובין השאר לפני כמה חודשים יצאה בשבילו אפליקציית וואטסאפ רשמית. הלכתי וקניתי אחד (340 ש"ח) ואחרי קצת משחקים יש לי בדיוק מה שאני רוצה: טלפון טיפש שלא יפתה אותי אבל שיש לו את היכולת המוגבלת לקבל הודעות וואטסאפ ואם ממש צריך לענות עליהן (במקלדת T9 של טלפון נוקיה ישן כמובן) ועכשיו אני ממש מרוצה.

בתמונה: נוקיה 8110 4G הטיפש אבל קצת פחות

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

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

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

דרך אגב, למישהו יש משקפי שמש סטייל "המטריקס" להשלמת הלוק שלי כניאו? 🙂

בתמונה: ניאו עם המשקפיים המגניבות שלו

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

03 September, 2019 01:08 PM

27 August, 2019

Boris Shtrasman

Munigrabber לאתרים שמשתמשים בערכת העיצוב Mivzakiim

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

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

munigrabber.pl https://www.sheker-kolshehu.co.il

את הקובץ שנוצר שמים במקום שקורא ה RSS שלנו יכול לקרוא ממנו - למשל איפה שApache לוקח קבצים ממנו .


use strict;
use warnings;

use LWP 5.64; # Loads all important LWP classes, and makes
use HTTP::Cookies; # Allow work with cookies
use XML::RSS;
use XML::Simple;
use Encode qw(decode encode);
use Data::Dumper;
use DateTime::Format::Strptime qw(strftime );

#The message content is located in a remote page, we fetch it's content to show in our RSS feed.
sub get_display_item
my $url = shift;
my $browser = shift;
my $response = $browser->get( $url );
my @lines = $response->content =~ /<div.*id="WebPartWPQ3"(.*)<\/div>/g;
$lines[0] = '


$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";
my $response = $browser->get( $url );
print "Workding on " . $url . "\n";

if ($response->{'_rc'} != 200 ) { die "Error for $url $response->{'_content'}"; }
#for each cookie we got, add it to the current jar
$browser->cookie_jar->extract_cookies( $response );

$response = $browser->get( "$basepath/Pages/Mivzakiim.aspx" );

my $rss = XML::RSS->new( version => '2.0');
title => "Municipal feed for $basepath",
link => "$basepath",
description => "MivzakiimAll RSS feed");

my @lines = $response->content =~ /MivzakiimAll generalFilter">(.*)<\/div><\/div>/g;
unless ($#lines >= 0) { print Dumper (@lines) ; die "$url does not have MivzakiimAll content, you need to adjust the script"; }

my $xml_obj = XMLin(@lines);

my $formater = DateTime::Format::Strptime->new(
pattern => '%d/%m/%Y',
time_zone => 'local',
on_error => 'croak',

foreach my $tr (@{$xml_obj->{tbody}->{tr}})
foreach my $td ($tr->{td})
my $date_in_webpage= $td->[0]->{'div'}->{'content'};
my $dt = $formater->parse_datetime($date_in_webpage);
my $title = $td->[1]->{'a'}->{'content'};
my $link = $td->[1]->{'a'}->{'href'};

my $description = get_display_item ( $basepath . $link , $browser);

$rss->add_item( title => $title, link => $basepath . $link,pubDate=>$dt ,guid=>$basepath . $link , description=>$description);
#Use the basepath for the generated filename , strip http/https from it for readbility
my $filename="$url.rss";
$filename =~ s/https:\/\///g;
$filename =~ s/http:\/\///g;



=head1 NAME

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


Create an RSS 2.0 file based on the embeeded messages page.


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


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
Jonathan Eisenzopf
Wojciech Zwiefka
Chris Nandor
Shlomi Fish

=head1 SEE ALSO

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


27 August, 2019 12:41 PM

24 August, 2019

Itzik Kotler

Defending Against Hacking's Long Game: It Ain't Over Till It's Over

In the third quarter of Super Bowl LI, the New England Patriots trailed the Atlanta Falcons by a score of 28-3. History was against the Patriots’ chances of rallying for a comeback win. No team had ever overcome such a large deficit — especially so late in the game — to capture the NFL championship. And yet, against the odds, the Patriots stormed back to earn an improbable victory and their fifth Lombardi Trophy. Their win was the embodiment of Yogi Berra’s famous saying, “it ain’t over ‘til it’s over.” It also stands as an example for organizations fighting the good fight against hackers.

You see, hackers are persistent and patient. They know they’ll lose more often than they win, but the payoff when they do win — predicted to reach $6 trillion annually by 2021 — keeps them going. Unfortunately, we are too often blinded by short-term perspective when it comes to cyberdefense. We think that if a hacker succeeds in getting past our perimeter, we’re done for and we go into damage control mode. When we understand the way our opponent operates, however, we can shift our strategy to the long game because, as we’ve learned, there are numerous steps involved in a successful attack, and each gives us an opportunity to stop the hacker’s progress and win the game.

Read the full article at Forbes here

Full text

24 August, 2019 12:16 AM

17 August, 2019

Ilan Shavit

מנסה לעשות קצת סדר: GPT, MBR, UEFI, Legacy Bios

בתקופה הקרובה אני מתכוון לכתוב סדרת מדריכים בנוגע להתקנת Arch Linux. בהסברים אתייחס להתקנות במצבים השונים: התקנה בסכימת מחיצות MBR או GPT והתקנה תחת Legacy Bios או UEFI, אז כדי שההסברים העתידיים יהיו ברורים אקדים ואסביר אה המונחים הללו (שאצל רבים לא ממש ברורים)

אתחיל בהסבר על GPT ו- MBR:
מדובר בשתי דרכים שונות להגדיר את מנהל האתחול ואת טבלת המחיצות (Partitions) בדיסק הקשיח. ה- MBR-Master Boot Record היא השיטה הישנה והמסורתית בה הביוס פונה לאזור שבתחילת הדיסק הקשיח, קורא את מנהל האתחול (446 בתים ראשונים בדיסק), קורא את טבלת המחיצות שמוגדרת אח"כ (64 בתים), ואז טוען את מערכת ההפעלה (באמצעות מנהל האתחול) מהמחיצה המסומנת כ- Active. בשיטה זאת ניתן להגדיר עד 4 מחיצות ראשיות (Primary Partition). במידה ומעוניינים בעוד מחיצות, ניתן, על חשבון מחיצת Primary Partition אחת, להגדיר עוד 23 מחיצות לוגיות (באזור שנקרא Extended Partiton). לפיכך MBR תומך בעד 26 מחיצות – כמספר האותיות האנגליות. שימוש ב- MBR, מעבר להגדרה המוזרה של המחיצות, מגביל אותנו להשתמש בדיסקים בגודל של עד 2 טרה בייט, אין לו שרידות של טבלת המחיצות ולא מתבצעת בדיקת של שלמות ונכונות הנתונים שלה (משמש מצע טוב ונוח להידבקות בוירוסים).

טכנולוגיית GPT נותנת מענה לחסרונות של MBR: היא תומכת בדיסקים הגדולים מ- 2TB (תמיכה בעד 9.4 מיליארד טרהבייט), היא לא מוגבלת (תאורטית) בכמות המחיצות ואין בה הפרדה ל- Extended Partition ו- Logical Devices. טכנולוגיית GPT שומרת 2 העתקים של טבלת המחיצות ומבצעת עליהם בדיקת CRC, ובמידה וטבלת מחיצות אחת משתבשת היא משחזרת אותה מהגיבוי. GPT מהווה שדרוג של ממש ל- MBR ואני לא מוצא שום היגיון להשתמש כיום ב- MBR בהתקנה של מערכת הפעלה חדשה.

אמשיך בהסבר על Legacy Bios ו- UEFI bios. אז כמו שכתבתי: שניהם מהווים את הביוס של המחשב. מדובר באותו רכיב קושחתי שמתווך בין מערכת ההפעלה לחומרת המחשב. כשמדליקים את המחשב הרכיב הראשוני שנטען זה הביוס. הוא זה שמבצע את בדיקת ה- POST, מאפשר להיכנס ולערוך את ההגדרות שלו, לבדוק את זיהוי החומרה ולשנות ערכים שונים (נניח לשנות את קצב השעון עבור ביצוע over clocking, לשנות את המתח שמזינים את זכרונות ה- RAM ועוד…). לאחר הבדיקות העצמיות של החומרה, הביוס ניגש לדיסק הקשיח ומעביר למנהל האתחול את המשימה של טעינת מערכת ההפעלה. אבל כאן לא נגמרת פעילותו. כשמערכת ההפעלה עובדת והיא, למשל, צריכה לכתוב מידע לדיסק הקשיח, היא תעביר את הבקשה (דרך הקרנל של מערכת ההפעלה) לביוס והוא זה שיפנה בפועל את הבקשה לבקר שבדיסק הקשיח. אז במחשב, כפי שניתן להבין, הכל עובר ועובד דרך הביוס!

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

מערכת הפעלה חלונות תומכת בסכימת מחיצות GPT רק אם משתמשים ב- UEFI. בלינוקס אין מגבלה כזאת: היא תומכת בסכימת מחיצות GPT גם ב- Legacy וגם ב- UEFI

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

17 August, 2019 05:11 PM

15 August, 2019


לאן נעלמתי

קיבלתי מספר שאלות בפרטי לאן נעלמתי ולמה אני לא כותב יותר.

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

התשובה הארוכה, ובכן הנה היא:

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

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

אני מקווה כי וורדפרס (או חברת automatic) ישפרו את החוויה, ואז אחזור לכתוב גם כאן, בנתיים תוכלו להנות מדברים שלי שם 🙂

15 August, 2019 05:30 AM

06 August, 2019


עמותת המקור מגייסת מנכ"ל/ית!

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

תחומי האחריות של המנכ"ל/ית:

דרישות התפקיד:

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

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

*המשרה פונה לנשים וגברים כאחד

06 August, 2019 01:33 PM

26 July, 2019

Ilan Shavit

Arch Linux

מי שעוקב אחרי הבלוג שלי יודע שעברתי להשתמש ב- Arch Linux . אז נכון: Arch זאת הפצת Bleeding Edge (רחוקה מאוד ממודל ה- LTS השמרני של Ubuntu לא כל שכן מדביאן היציבה). מסיבות שונות נמנעתי בעבר מלהשתמש בה, אך עם פיתוח כלים נוחים לביצוע Snapshot (כגון Timeshift, CYA או אפילו Snapshot ברמת LVM), כבר לא צריך להיות קיים החשש של "מה יקרה אם…" (במקרה הכי גרוע מבטלים את העדכון האחרון וממשיכים הלאה).

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

אחד היתרונות הגדולים של Arch הן אפשרויות הבחירה: לא בוחרים עבורך את שולחן העבודה או את האפליקציות איתן תעבוד. אתה צריך לבחור הכל, ובכך אתה בונה לעצמך את שולחן העבודה האולטימטיבי. ב- Arch כמעט ולא עושים החלטות עבורך: בחרת Gnome תקבל Gnome טהור – ללא שום קוסטומיזציה של ההפצה (כנ"ל בכל שולחן עבודה אחר שתבחר). אתה צריך להפשיל שרוולים ולייפות בעצמך את שולחן העבודה: לבחור פונטים יפים, לבחור בערכת נושא ואייקונים הקולעים לטעמך, אך גם אם תעשה את כל הפעולות הללו, עדיין תצטרך לטפל בבעיות "פינתיות" (למשל שאפליקציות QT לא יראו טבעיים בשולחנות עבודה מבוססים GTK). בהתחלה יהיו לך כמשתמש לא מעט נושאים לטפל בהם אבל פה היתרון הגדול: אפשרויות הלימוד שלך כמשתמש הן עצומות. ל- Arch יש WIKI נפלא, בעיני הטוב ביותר מכל הפצות הלינוקס, ודרכו אתה יכול ללמוד המון על לינוקס ועל Arch. ההפצה מאפשרת לך כמשתמש להינות מחבילות התוכנה העדכניות ביותר (ועדיין מאפשרת לשמרנים מבינינו לבחור בקרנל LTS וב- OpenOffice  LibreOffice Still). כיום Arch די יציבה. אני נוהג לעדכן את ההפצה אחת לשבוע (sudo pacman -Syu). לא הייתי ממליץ לעדכן את ההפצה באופן יומי וגם לא לעדכן אותה אחת לפרק זמן ארוך מידי… בכל יום שישי אני מבצע Snapshot ואז מעדכן אותה. בינתיים Arch לא "נשברה" לי אפילו פעם אחת, אבל גם אם כן אוכל לתקן זאת בקלות.

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

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

שולחן העבודה שלי: Gnome Shell בהפצת Arch Linux


26 July, 2019 06:48 AM

23 July, 2019

Hetz Ben Hemo

רעיון כחומר מחשבה לגבי צילום

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

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

להלן 2 סיטואציות שונות שמתרחשות לעיתים:

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

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

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

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

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

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

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

הטקסט המלא

23 July, 2019 08:36 AM

20 July, 2019

Gabor Szabo

Ideas to increase the attendees/registered user ratio at free Meetups

For the full article visit Ideas to increase the attendees/registered user ratio at free Meetups

20 July, 2019 11:07 AM

17 July, 2019

Hetz Ben Hemo

שימוש ב-NVME SSD RAID לעריכת וידאו מקצועי

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

בחלק מהמקרים, אצל עורכים יותר מקצועיים, קיים מכשיר DAS המחובר דרך SFF-8087 או דרך Thunderbolt למחשב. המכשיר מכיל מספר דיסקים מכניים והעריכה נעשית ישירות מול אותו מכשיר בסטודיו של העורך. היתרון בשיטה זו – אין צורך בערימת SSD חיצוניים פר צילום/פרויקט, מספיק אחד כדי להעביר את הוידאו מהשטח (אם צלם חיצוני או חברת צילום חיצונית מצלמת והעורך הוא מישהו אחר שיושב במקום אחר) אל מכשיר ה-DAS.

הבעיה הגדולה כיום היא שקבצי וידאו הולכים וגדלים גם במצלמות סמי מקצועיות. מצלמות כמו GH5 או Sony A7 R4 ומצלמות מקצועיות כמו Canon C300, או RED או ARRI למיניהן – מקליטות וידאו באיכות יותר ויותר גבוהה וכל שניה של וידאו תופסת יותר ויותר שטח, ואנחנו מדברים רק על וידאו, לא אודיו, לא Assets, לא אפקטים ושום דבר אחר, כך שמגיע מצב שגם SSD חיצוני טוב מתחיל להיות איטי – והמצב לא הולך להשתפר (נכון, קיים קידוד H.265 HEVC, אבל לא מומלץ להקליט איתו וידאו כי קידוד כזה יותר מתאים ל-Delivery מאשר לעריכה). הבעיה מתגלית בחומרתה לא רק בזמן ה"טיול" ב-Timeline, אלא במיוחד בקידוד הוידאו – ה-Encoder יסיים את הקידוד אך יקח עוד דקות ארוכות עד שהתהליך יסתיים מכיוון שצריך להעתיק את הנתונים מהמחשב המקומי ל-DAS (כן, גם אם בחרת לקודד ישירות ל-DAS, המחשב קודם מבצע את הפעילות בדיסק המקומי).

אחד הפתרונות הטובים הקיימים לבעיה כזו הוא שימוש ב-RAID NVME. זהו כרטיס ריק שלתוכו אנחנו מכניסים מקלות SSD NVME בחיבור M.2. עד 4 כרטיסים כאשר כל כרטיס מגיע עד גודל 2 טרהבייט. את הכרטיס נגדיר כ-RAID-0.

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

היתרון בשיטה זו הוא עצום. לא חשוב איזה חיבור יש לך לאחסון חיצוני גדול (סטורג', DAS) – ה-RAID המדובר נותן ביצועי מהירות של עד 15 ג'יגהבייט לשניה. סתם לשם השווה: אם יש לך DAS של 4 דיסקים, תקבל אולי מהירות של 800 מגהבייט לשניה, כך שההבדל התיאורתי במהירות הוא כמעט פי 20.

ה-RAID שאני מתאר יכול להיות עד גודל 8 טרהבייט, אבל כל מי שקנה פעם SSD NVME M.2 יוכל לאמר לכם שמחירי המקלות לא זולים. התשובה לכך פשוטה: לא חייבים ישר לרוץ ולרכוש את המקלות של 2 טרהבייט פר מקל. אפשר לדוגמא להתחיל עם מקלות SSD של סמסונג מסידרה 970 Evo Plus בגודל חצי טרהבייט. כל מקל כזה עולה 600 שקלים ב-KSP/IVORY, והכרטיס לעיל עולה 250 שקלים כולל משלוח מאמזון. ההרכבה וההגדרות די פשוטות, אולם צריך מחשב נייח די עדכני ודי חזק עם לפחות 2 כניסות PCIe 3 X16 ותמיכה ב-BIOS ב-PCI bifurcation. אם המחשב הנייח שלך הוא בן שנתיים-שלוש ויש לו 6-8 ליבות, סביר להניח שתוכל להטמיע פתרון כזה. אני מקווה בשבועות הקרובים להעלות וידאו כיצד להגדיר זאת.

פתרון זה, כמו שציינתי, הוא למחשב נייח/תחנת עבודה. מה עם מחשבים ניידים? לצערי חיבור Thunderbolt 3 לא מספק מספיק רוחב פס לעשות את הטריק הזה. (ה-RAID הזה משתמש בכל רוחב הפס של PCIe 3.0 X16).

משהו חשוב: ה-RAID הזה לא מחליף אחסון מקומי למערכת הפעלה (אלא אם יש לכם מחשב נייח עם מעבדי Skylake X או מעבדי Threadripper), כך שאם יש לכם מעבד 6-8 ליבות מהדור השביעי ומעלה, עדיין תצטרכו את הדיסק הקשיח המקומי או SSD המקומי שיש לכם במחשב על מנת לעבוד עם מערכת ההפעלה והאפליקציות.

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

הטקסט המלא

17 July, 2019 08:28 PM

14 July, 2019


הזמנת מרצים זרים בתשלום לכנס


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

ולמי שכן מעוניין בפרטים

השנה סייעה עמותת המקור לקיומו של כנס Core C++‎, ובפעם הראשונה התמודדנו עם נושא הזמנת מרצים זרים בתשלום לכנס. גילינו שזה אפשרי ואפילו לא מסובך יותר מדי, אבל גם עשינו שגיאות שעלו לנו בהרבה לחץ מיותר. אנחנו רוצים לחלוק את מה שלמדנו, כדי שארגונים שמוצאים את עצמם במצב דומה יוכלו לעבור את התהליך יותר בקלות. דיסקליימרים:

קודם כל, כדאי להבהיר מה הם „ארגונים במצב דומה”. עמותת המקור קיימת כבר הרבה שנים, יש לה אישור ניהול תקין ואישורי מס הכנסה, אבל בכל השנים הללו מעולם לא היו לה עובדים בשכר. הכנס היה אירוע של ארבעה ימים: סדנאות ביום שלישי 14.5, הרצאות בימים רביעי וחמישי, וסדנאות נוספות, של חצי יום, ביום ששי 17.5. ביום שלישי הועברו ארבע סדנאות; אחת מהן על ידי מרצה ישראלי, והאחרות על ידי מרצים זרים. והכוונה היתה שאותם מרצים (גם הישראלי וגם הזרים) יקבלו שכר הולם על ההדרכה.

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

נוהל אחד, שני מסלולים

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

הנוהל מכיר בשני סוגים של גופים שיכולים להגיש את הבקשה: „חברה מקומית” (ולצורך העניין, עמותה היא חברה, וכנראה שגם עוסק מורשה הוא חברה), או „חברה זרה”. בתור „חברה מקומית”, הגוף המגיש הוא המעסיק הישיר של המומחה, על כל המשתמע מכך — יחסי עובד־מעביד, ניכוי מס במקור, ביטוח לאומי, וכו׳. לארגון שכבר יש לו עובדים שכירים, כל זה מן הסתם פתיר בקלות. לעמותה כמו שלנו, שאין לה, זה נראה מסובך, יקר ומפחיד. שאלנו את המרצים שלנו, והם אמרו שהם יכולים להוציא לנו חשבוניות בתור עצמאים; שאלנו את מחלקת מומחים (יש להם שעות ספציפיות בהן הם עונים לטלפונים; קשה לתפוס אותם, אבל אפשר), והם הסבירו לנו שאנחנו יכולים להתייחס ל„עצמאי זר” כאל „חברה זרה”. אז לשם הלכנו.

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

הנוהל אומר שבמקרה של בקשה ע״י חברה זרה עשוי מדור מומחים לדרוש בקשה מקבילה של החברה המקומית – ולא ביקשו; הנוהל מדבר על תשובה תוך 6 ימי עסקים, וקיבלנו אישורים תוך יומיים־שלושה. הידד! הודענו למרצים שיש אישור, וחיכינו שהם יגיעו לארץ כדי לבצע את החלק האחרון בנוהל — להפוך את ההיתרים שקיבלנו במייל, לויזות עבודה של ממש.

השגיאות והבעיות

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

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

הבעיה המהותית ביותר, עם זאת, נבעה מהניסוח של הטופס שהיגשנו. אחת השאלות הראשונות המופיעות בו היא „תקופה ההעסקה המבוקשת”. אין בעיה, חשבנו כשמילאנו, הם באים לעבוד רק יום אחד. תקופת העסקה: מ־14.5 עד 14.5. אבל מבחינת רשות האוכלוסין, „תקופת ההעסקה” היא התקופה שעבורה הויזה אמורה להיות בתוקף; מבחינתם, אין הבדל בין תקופת ההעסקה לתקופת השהייה. מרצים שלנו הגיעו מארה״ב, ובשביל נסיעה כזו, הם כבר צירפו בנות זוג ועשו טיול של שבועיים בארץ הקודש — ורק כשהם כבר היו בארץ, הבנו שההיתר שקיבלנו לא מתאים.

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

בעיה נוספת שנתקלנו בה היתה קשורה לזה שלא עברנו בזמן על כל הנהלים (שיעור ראשון לעיל). אחד הנספחים לנוהל הטיפול המהיר הוא טופס החלפת סוג הויזה (מויזת תייר, ב/2, לויזת עבודה, ב/1). הינחנו מראש שאחרי שהעברנו את כל המסמוך, הטופס הזה אמור להיות טריויאלי. מה רבתה אכזבתנו, כשעברנו עליו בפעם הראשונה בשעה מאוחרת בערב של ה־13.5, לאחר שמתנדב התרוצץ כדי לאסוף מהזרים את הדרכונים וייפויי הכח המקוריים, וגילינו רק אז שהטופס דורש, מחד, תמונות פספורט, ומאידך, פרטים איזוטריים כמו שם הנעורים של האם ופחות איזוטריים כמו מספר ויזת התייר. הצלחנו להשיג הכל, שוב, תוך לחץ ומתח; תמונות הפספורט צולמו ע״י אנשי צוות הכנס בטלפון שלהם, הועברו במייל לצלם תמונות־פספורט שליד לשכת משרד הפנים, וכך הודפסו וצורפו.

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

הפתעות אחרונות

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

האגרות האלה, מסתבר, תלויות במשך התוקף של האשרה, בארץ המוצא, ומה שגילינו רק ברגע האחרון, בשאלה אם הויזה תאפשר לבעליה לצאת מהארץ ולחזור אליה בתקופה שהיא בתוקף. מאחר ולא ביררנו עם המומחים שלנו מראש אם בשבועיים־טיול שלהם הם מתכננים לקפוץ גם לירדן או לסיני, וההבדל היה רק 175 ₪, אז כבר שידרגנו לויזה של כניסות מרובות; ואז התברר שעל כניסות מרובות צריך לשלם אם אתה אמריקאי, אבל לא אם אתה בריטי (זה לא typo; בריטים מועדפים על אמריקאים). בסוף שילמנו 512 ₪ על בריטי לשבוע, ו־927 ₪ על אמריקאי לשבועיים (פעמיים, כי היו שני אמריקאים).


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

התהליך, מבחינת הזרים

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

התהליך, מבחינת הארגון המזמין

דגש אחד אחרון

כדי שמוזמן ייחשב מומחה, המשכורת שלו, על בסיס חודש עבודה, צריכה להיות לפחות 20 אלף ₪. כשאתם חושבים על העבודה שלו כעל יום או יומיים בלבד, זה כמעט טריויאלי — אתם הרי לא תדברו ברצינות על תשלום למרצה זר בכנס טכנולוגי, כשזה פחות מ־1000 ₪ ליום. אבל כשלוקחים בחשבון את כל זמן השהייה, זה יכול להגיע לגבול; עם שהיה של שבועיים, למשל, התשלום צריך להגיע בערך ל־10,000 ₪, אחרת הוא לא נחשב מומחה ואי אפשר להפעיל נוהל מזורז. צריך לקחת את זה בחשבון מראש, ואם זה מתקרב לגבול, להעלות את זה מול המרצים כחלק מתכנון הנסיעה שלהם.

לפרטים נוספים, אפשר לפנות לועד עמותת המקור בכתובת board@hamakor.org.il.

14 July, 2019 09:12 PM

10 July, 2019

Diego Iastrubni


E: Some index files failed to download. They have been ignored, or old ones used instead.
root@chrx:~# apt update 
Get:1 http://mirror.isoc.org.il/pub/debian testing InRelease [117 kB]
E: Repository 'http://mirror.isoc.org.il/pub/debian testing InRelease' changed its 'Codename' value from 'buster' to 'bullseye'
N: This must be accepted explicitly before updates for this repository can be applied. See apt-secure(8) manpage for details.
Do you want to accept these changes and continue updating from this repository? [y/N] y
Hit:2 http://packages.microsoft.com/repos/vscode stable InRelease

הטקסט המלא

10 July, 2019 07:57 PM

01 July, 2019

Kaplan Open Source Consulting

חדשות ועדכונים, יולי 2019

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

חוגגים שנתיים לפעילות שלנו

מוזמנים לחגוג איתנו במפגש קהילתי ב-10.7 (פרטים בהמשך)

באמצע יוני התקיים כנס GIS בקוד פתוח 2019 אליו הגיעו 130 משתתפים. אם בכנס של שנה שעברה עוד רחפה באוויר השאלה "האם להשתמש בקוד פתוח בעולם ה-GIS" המסר העיקרי של הכנס השנה הוא "כיצד להשתמש בקוד פתוח בעולם ה-GIS" – שינוי מחשבתי משמעותי מאוד. שמענו מגופי ממשלה ומהמגזר הפרטי כיצד הם עושים זאת.

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

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

מה חדש אצלנו?

פורום תשתיות קוד פתוח בענן

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

המפגש הראשון שלנו יהיה ב-30 ביולי (הרשמה), עד אז מוזמנים לקבוצת הפייסבוק שלנו – Open Source Israel שמיועדת לשיתוף ידע בתחום. רוצים להעביר הרצאות במפגשים? צרו קשר.

סדנאות QGIS

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

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

גאוגרף להשכיר

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

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

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

מימון המונים לפיתוח QGIS

באמצע חודש מאי התחלנו בקמפיין גיוס כספים מהקהילה לטובת שיפור QGIS. היעד הראשון שנבחר הוא באג 3239 המדווח על חוסר תמיכה ביישור לימין במקרא המפה – "Text alignment in Print Composer Legend" – כיום כל האלמנטים מיושרים לשמאל והטקסט הוא תמיד בכיווניות של LTR.

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

למרות זאת, החלטתי לקחת אחריות על המהלך ולממן כרגע את הפיתוח בעלות של כ-7,000 ש"ח, מתוך תקווה כי הקהילה תצטרף לכיסוי העלויות, גם אם באיחור (טופס תרומה). לאור זאת, השבוע, סגרנו התקשרות כדי להוסיף את התמיכה בעברית על ידי מפתחי QGIS לפרויקט. התיקון מיועד להופיע בגרסה 3.10, ובמידת האפשר גם יבוצע backport עבור גרסה 3.4 לטובת משתמשי ה-LTR.

מידע פתוח

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

גרסה חדשה של דביאן

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

מבחינתנו זהו גם ארוע התנעה וגיוס מתנדבים לקראת ארגון מפגש המפתחים של דביאן (DebConf) שיתקיים בחיפה ביולי 2020. בכנס צפויים להשתתף כ-300 אנשי דביאן וקוד פתוח מחו"ל.

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

מפגשי קהילה וירטואליים בפייסבוק

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

01 July, 2019 05:39 AM

26 June, 2019

Gilad Ben-Yossef

חתול פפנצ'ה*

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

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

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

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

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

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

* פפנצ'ה: בפאלי, השפה הקדומה שבה נשתמרו דבריו של הבודהא: מחשבות חוזרות וטורדניות.

בתמונה: חתול פפנצ'ה

26 June, 2019 07:57 AM

17 June, 2019

Oz Nahum

Visualize almost anything with Grafana and Python

This is a short tutorial on how to build a data source for Grafana using Python Bottle micro-framework. Eventually, you can use this code to connect to any database (including SQLite). continue reading...

17 June, 2019 08:01 AM

31 May, 2019

Kaplan Open Source Consulting

כנס GIS בקוד פתוח, יוני 2019

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

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

את לוח הזמנים של הכנס אפשר לראות בעמוד: https://kaplanopensource.co.il/conferences/open-source-gis/

31 May, 2019 09:01 PM

25 May, 2019

Amir Aharoni

Happy Africa Day: Keyboards for All African Wikipedia Languages

Happy Africa Day!

To celebrate this, I am happy to make a little announcement: It is now possible to write in all the Wikipedias of all the languages of Africa, with all the special letters that are difficult to find on common keyboards. You can do it on any computer, without buying any new equipment, installing any software, or changing operating system preferences. Please see the full list of languages and instructions.

This release completes a pet project that I began a year ago: to make it easy to write in all the languages of Africa in which there is a Wikipedia or an active Wikipedia Incubator.

Most of these languages are written in the Latin alphabet, but with addition of many special letters such as Ŋ, Ɛ, Ɣ, and Ɔ, or letters with accents such as Ũ or Ẹ̀. These letters are hard to type on common keyboards, and in my meetings with African people who would write in Wikipedia in their language this is very often brought up as a barrier to writing confidently.

Some of these languages have keyboard layouts that are built into modern operating systems, but my experience showed me that to enable them one has to dig deep in the operating system preferences, which is difficult for many people, and even after enabling the right thing in the preferences, some keyboards are still wrong and hard to use. I hope that this will be built into future operating system releases in a more convenient way, just as it is for languages such as French or Russian, but in the mean time I provide this shortcut.

The new software released this week to all Wikimedia sites and to translatewiki.net makes it possible to type these special characters without installing any software or pressing any combining keys such as Ctrl or Alt. In most cases you simply need to press the tilde character (~) followed by the letter that is similar to the one you want to type. For example:

Some of these languages are written in their own unique writing systems. N’Ko and Vai keyboards were made by myself, mostly based on ideas from freely licensed keyboard layouts by Keyman. (A keyboard for the Amharic language, also written with its own script, has had keyboards made by User:Elfalem for a while. I am mentioning it here for completeness.)

This release addresses only laptop and desktop computers. On mobile phones and tablets most of these languages can be typed using apps such as Gboard (also in iPhone), SwiftKey (also on iPhone), or African Keyboard. If you aren’t doing this already, try these apps on your phone, and start exchanging messages with your friends and family in your language, and writing in Wikipedia in your language on your phone! If you are having difficulties doing this, please contact me and I’ll do my best to help.

The technology used to make this is the MediaWiki ULS extension and the jquery.ime package.

I would like to thank all the people who helped:

This is quite a big release or code. While I made quite a lot of effort to test everything, code may always have bugs: missing languages, wrong or missing letters, mistakes in documentation, and so on. I’ll be happy to hear any feedback and to fix the bugs.

And now it’s all up to you! I hope that these keyboard layouts make it easier for all of you, African Wikimedians, to write in your languages, to write and translate articles, and share more knowledge!

Again, happy Africa day!

The full list of languages for which there is now a keyboard in ULS and jquery.ime:

25 May, 2019 07:03 AM

18 May, 2019

Ilya Sher

On Information Loss in Software

“Information Loss” is a way to look at the world. The topic is very broad. This blog post will focus on information loss during development and operation of computer software.

This post discusses why Information Loss is bad and gives some examples.

My hope is that after reading this post, you will be able to spot information loss more easily. This should help you avoiding information loss, eliminating the need for costly information recovery phase. Some examples include specific recommendations how to avoid that particular case of information loss.

Information Loss Definition

Information Loss for the purposes of this blog is the situation where information I is available and is easily accessible at point in time t1 but later, when it’s needed at point in time t2, it is either not available or not easily accessible.

The post will present various categories of information loss with examples. The list is not exhaustive; it’s not meant to be. The intention is to give some examples to help you get the feel and start looking at things from the information loss perspective.

Why Information Loss is Bad?

In many cases of Information Loss, the missing information can be recovered but that requires resources to be thrown at the issue (time and/or money). That is the situation I would like to help you to avoid.

Between the Head and the Code

When working on software, the first place the information loss occurs is when the programmer translates thoughts into code. Information loss at this stage will manifest itself as increased WTF-per-minute during code review or just code reading. Each time the code is read, there will be additional cognitive load while the reader reconstructs the programmer’s idea behind the code.

I have identified two main causes for information loss at the head-to-code stage:

Information Loss due to Programmer’s Fault

The more a programmer is experienced, the less likely is the occurrence of information loss at this stage.

Misnamed Variable

In programmers head: number of servers running the ETL task. Name of the variable in the code: n. WTFs at code review – guaranteed.

Misnamed Function

I’m pretty sure getUser() should not update say last name of the user in database. Such naming is criminal but unfortunately I’ve seen code similar to that.

Use of Magic Numbers

if (result == 126) .... The person who wrote 126 knew what that number means. The person reading the code will need to spend time checking what that number means. One should use constants or enums instead: if (result == NOT_EXECUTABLE) ....

Missing Comments in Code

Most important comments are about why something is being done as opposed to how. If ones code is in a high-level language and of a good quality, it’s a rare occasion one needs to comment about what or how something is being done. On the other hand comments like “Working around API bug: it returns false instead of empty array” are very valuable.

Incorrect Usage of Data Types

A list of people, for example, is not just a list. It has semantic meaning. It’s much easier to understand a program when correct types are used for the data. Java has generics to convey such information, for example List<Person>. Some other languages have type systems that are powerful enough to convey such information too.

Programming Language Imposed Information Loss

Limitations of programming languages lead to less expressive code because the idea in programmer’s head can not be expressed in a straightforward manner. The readers of the code will struggle more (read waste time) to understand the code.

Unnamed Function Parameters

bash and perl5 (not sure about perl5 anymore, there was something experimental) do not have the syntax for specifying function parameter names. This makes the code less expressive. Sometimes programmers will do “the right thing”:

myfunc() {
    local target_file=$1

… but when they don’t, you finish with unnamed parameter, wondering what it could mean:

myfunc() {
    if [[ -f $1 ]];then

Is that a file to generate or a source file? You don’t know, you have to read on in myfunc hoping for the answer.

Recommendation: even if your language does not support named parameters, emulate them.

Expansion of Strings into Several Arguments (bash)

rm $x

Does that remove one file or several? What the programmer meant? You simply don’t know. It depends on the contents of x, which is typically split into arguments by spaces. You are lucky if you can deduce from the variable name whether it’s one or several files.

From today’s perspective this is just bad design. Back at the day I guess it was the most practical way to implement arrays.

Recommendation: use one of the two alternatives blow and do not use rm $x form.

Side note: this “feature” caused so much pain over the years when x would contain a spaces by accident. Even when x is meant to be used as an array, elements of that array can also contain spaces by accident.

Error Handling

In languages that do not support exceptions (bash, C, Go), the programmer is forced into one of two situations:

In NGS, since typical use case is scripting, I wanted to have the option for the code to be concise. That rules out returning status code along with the result because the caller is then forced to check it. It does make more sense for NGS to have exceptions and for scripts to decide whether to catch them or let the whole script terminate with error because of an uncaught exception.

Unordered Hash/Map/dict Data Structure

Hash data structure is implemented in a non-order-preserving manner in some languages. That means that the programmer can not express the intention freely in situations where the order of key/value pairs is important. That pushes towards less readable code as the programmer fights the language by implementing his/her own ordered dictionary.

Information loss in this case is again losing the sight of programmer’s intention.

Fortunately many modern languages solved the issue by now:

Recommendation: check whether your language has the data structure you really want to use, either built-in or in a library.

Limited Data Structures (bash)

Working with data structures in bash results more or less convoluted code, depending on the data structures one need to work with. This is direct consequence of bash supporting exactly three data structures:

These data structures can not be nested.

The result is much less readable code where the original intent of the author is harder to recover as opposed to data manipulation in other popular languages (Python, Ruby, etc).

Recommendation: consider using other languages besides bash for heavy data manipulation code.

Absence of non-nullable Types

In some languages there is no straightforward way to specify non-nullable parameters. The programmers are then required to check whether each passed parameter is null. That results more boilerplate code. Let’s look at the following bit of Java code from the popular Apache Flink project:

// flink/flink-java/src/main/java/org/apache/flink/api/java/DataSet.java

protected DataSet(ExecutionEnvironment context, TypeInformation<T&gt; typeInfo) {
    if (context == null) {
        throw new NullPointerException("context is null");
    if (typeInfo == null) {
        throw new NullPointerException("typeInfo is null");

    this.context = context;
    this.type = typeInfo;

Asynchronous Computing Model (JavaScript)

In JavaScript for example, progressively more readable code uses:

Again, information loss occurs when programmer’s intention is lost in the code because the code looks like a big struggle against asynchronicity and the language.

Recommendation: prefer async/await over Promises and prefer Promises over callbacks.

Loss of semantic information (JavaScript)

console.log() vs debug('my-module')('my message') in JavaScript. When a programmer chooses to use log() instead of debug(), loss of semantic information occurs. In this case it means more effort in finding the needed information in the output as opposed to simpler turning on and off the relevant debug sections.

Recommendation: use the debug module.

Information Loss at Runtime

Information loss at runtime will manifest as harder debugging.

Empty Catch Clause

This is borderline criminal. Except for very few cases when empty catch clause is really appropriate, by placing empty catch clause in the code, you are setting up a bomb for your colleagues. They will pay with their time, tears and mental health, not to mention they will be hating you. Where is the information loss? At the time the exception is generated, there is useful information about what happened. Empty catch clause loses that information. Result: hard to find exceptions and their causes.

In NGS, there are clear ways to express that you didn’t just forgot to handle the exception (try ... catch(e) { }) but you actually don’t care (or know exactly) what happened:

Writing to stdout Instead of stderr

stdout has semantic meaning (result of the computation) and stderr also has semantic meaning (errors description). It will make harder for any wrapper script to deal with a program that outputs errors to stdout or outputs the result to stderr. The semantic information about the text is lost and then needs to be recovered by the caller if the two outputs are mixed.

Wrong exit codes reporting

This one really hinders automation.

if ... then {
    error("error occurred")
    exit(0) # incorrect error code reported

Since it’s easy to forget about exit code, and the common case is that exit() means abnormal termination of the program, in NGS exit() that does not provide an exit code defaults to exit code 1.

Wrong exit codes handling

if [ -e MY_FILE ] ...

This is all over bash scripts… and it’s wrong. Which exit codes [ program/built-in returns? Zero for “yes”, one for “no”, and two for “An error occurred”. Guess what. You can’t handle three distinct cases with two if branches; “An error occurred” is causing the “false” branch of the if to be taken. If you are lucky, you will spot error message on stderr. If you are not lucky, your script will just work incorrectly in some circumstances.

At this point the tradeoff in NGS was made in favor of correctness, not simplicity. if $(test -e MY_FILE) ... in NGS can go three ways: “yes” branch, “no” branch and an exception. After any external process is finished, NGS checks the exit code. For unknown process, non-zero exit code cases an exception. For test and a few others, zero and one are not causing an exception. The exit code checking facility is extensible and one can easily “teach” NGS about new programs.

Broaden your Horizon – Extras

I’ll mention here non-strictly software development related information loss cases.

Untagged Cloud Resources (AWS)

Have you just created an EC2 instance and named it Server or maybe you haven’t tagged it at all? Congratulations, semantic information has just been lost. You colleagues will strugle to understand what is the role of instance.

Recommendation: rigorously tag the resources, have alerts for untagged or improperly tagged resources. In AWS you can also know who created the resource by looking at CloudTrail.

Side note: In Azure, any resource must belong to a “Resource Group” which makes it much easier to track the resources.


You just performed operation in GUI. The information of what happened was just lost the minute you performed the operation. Good luck reproducing or documenting it.

The plan to combat this in NGS is to have textual representation for each operation that is performed via GUI.

String Concatenation

Every time two strings are concatenated into one, there is some information loss.

Recommendation: instead of parsing unstructured text (result of concatenation) later, consider using structured data format when producing the output. (Example: JSON).

Hope that helps. Have fun!

18 May, 2019 05:35 PM

19 April, 2019

Gabor Szabo

Use Technical Meetups to help recruitment

Meetup can have any format and content, but we are focusing on Technical events. In this article I'll discuss some ways to use Meetups to help the recruitment. I'll discuss several options, the pros and cons of each.

For the full article visit Use Technical Meetups to help recruitment

19 April, 2019 05:55 AM

19 March, 2019

Meir Kriheli

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

לאחר הפסקה לא קצרה עקב שחיקה, חזרתי לתרגם את Django עם שחרור 2.2 RC1. נכון ליום שלישי ה־19 במרץ התרגום עומד על 100% עבור:

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

19 March, 2019 04:56 PM

05 March, 2019

Shlomi Noach

Un-split brain MySQL via gh-mysql-rewind

We are pleased to release gh-mysql-rewind, a tool that allows us to move MySQL back in time, automatically identify and rewind split brain changes, restoring a split brain server into a healthy replication chain.

I recently had the pleasure of presenting gh-mysql-rewind at FOSDEM. Video and slides are available. Consider following along with the video.


Consider a split brain scenario: a "standard" MySQL replication topology suffered network isolation, and one of the replicas was promoted as new master. Meanwhile, the old master was still receiving writes from co-located apps.

Once the network isolation is over, we have a new master and an old master, and a split-brain situation: some writes only took place on one master; others only took place on the other. What if we wanted to converge the two? What paths do we have to, say, restore the old, demoted master, as a replica of the newly promoted master?

The old master is unlikely to agree to replicate from the new master. Changes have been made. AUTO_INCREMENT values have been taken. UNIQUE constraints will fail.

A few months ago, we at GitHub had exactly this scenario. An entire data center went network isolated. Automation failed over to a 2nd DC. Masters in the isolated DC meanwhile kept receiving writes. At the end of the failover we ended up with a split brain scenario - which we expected. However, an additional, unexpected constraint forced us to fail back to the original DC.

We had to make a choice: we've already operated for a long time in the 2nd DC and took many writes, that we were unwilling to lose. We were OK to lose (after auditing) the few seconds of writes on the isolated DC. But, how do we converge the data?

Backups are the trivial way out, but they incur long recovery time. Shipping backup data over the network for dozens of servers takes time. Restore time, catching up with changes since backup took place, warming up the servers so that they can handle production traffic, all take time.

Could we have reduces the time for recovery?

There are multiple ways to do that: local backups, local delayed replicas, snapshots... We have embarked on several. In this post I wish to outline gh-mysql-rewind, which programmatically identifies the rogue (aka "bad") transactions on the network isolated master, rewinds/reverts them, applies some bookkeeping and restores the demoted master as a healthy replica under the newly promoted master, thereby prepared to be promoted if needed.

General overview

gh-mysql-rewind is a shell script. It utilizes multiple technologies, some of which do not speak to each other, to be able to do the magic. It assumes and utilizes the following:

Some breakdown follows.


MySQL GTIDs keep track of all transactions executed on a given server. GTIDs indicate which server (UUID) originated a write, and ranges of transaction sequences. In a clean state, only one writer will generate GTIDs, and on all the replicas we would see the same GTID set, originated with the writer's UUID.

In a split brain scenario, we would see divergence. It is possible to use GTID_SUBTRACT(old_master-GTIDs, new-master-GTIDs) to identify the exact set of transactions executed on the old, demoted master, right after the failover. This is the essence of the split brain.

For example, assume that just before the network partition, GTID on the master was 00020192-1111-1111-1111-111111111111:1-5000. Assume after the network partition the new master has UUID of 00020193-2222-2222-2222-222222222222. It began to take writes, and after some time its GTID set showed 00020192-1111-1111-1111-111111111111:1-5000,00020193-2222-2222-2222-222222222222:1-200.

On the demoted master, other writes took place, leading to the GTID set 00020192-1111-1111-1111-111111111111:1-5042.

We will run...


> '00020192-1111-1111-1111-111111111111:5001-5042'

...to identify the exact set of "bad transactions" on the demoted master.

Row Based Replication

With row based replication, and with FULL image format, each DML (INSERT, UPDATE, DELETE) writes to the binary log the complete row data before and after the operation. This means the binary log has enough information for us to revert the operation.


Developed by Alibaba, flashback has been incorporated in MariaDB. MariaDB's mysqlbinlog utility supports a --flashback flag, which interprets the binary log in a special way. Instead of printing out the events in the binary log in order, it prints the inverted operations in reverse order.

To illustrate, let's assume this pseudo-code sequence of events in the binary log:

insert(1, 'a')
insert(2, 'b')
insert(3, 'c')
update(2, 'b')->(2, 'second')
update(3, 'c')->(3, 'third')
insert(4, 'd')
delete(1, 'a')

A --flashback of this binary log would produce:

insert(1, 'a')
delete(4, 'd')
update(3, 'third')->(3, 'c')
update(2, 'second')->(2, 'b')
delete(3, 'c')
delete(2, 'b')
delete(1, 'a')

Alas, MariaDB and flashback do not speak MySQL GTID language. GTIDs are one of the major points where MySQL and MariaDB have diverged beyond compatibility.

The output of MariaDB's mysqlbinlog --flashback has neither any mention of GTIDs, nor does the tool take notice of GTIDs in the binary logs in the first place.


This is where we step in. GTIDs provide the information about what went wrong. flashback has the mechanism to generate the reverse sequence of statements. gh-mysql-rewind:

This last part is worth elaborating. We have created a time machine. We have the mechanics to make it work. But as any Sci-Fi fan knows, one of the most important parts of time travel is knowing ahead where (when) you are going to land. Are you back in the Renaissance? Or are you suddenly to appear on board the French Revolution? Better dress accordingly.

In our scenario it is not enough to move MySQL back in time to some consistent state. We want to know at what time we landed, so that we can instruct the rewinded server to join the replication chain as a healthy replica. In MySQL terms, we need to make MySQL "forget" everything that ever happened after the split brain: not only in terms of data (which we already did), but in terms of GTID history.

gh-mysql-rewind will do the math to project, ahead of time, at what "time" (i.e. GTID set) our time machine arrived. It will issue a `RESET MASTER; SET GLOBAL gtid_purged='gtid-of-the-landing-time'" to make our re-winded MySQL consistent not only with some past dataset, but also with its own perception of the point in time where that dataset existed.


Some limitations are due to MariaDB's incompatibility with MySQL, some are due to MySQL DDL nature, some due to the fact gh-mysql-rewind is a shell script.


There's lot of moving parts to this mechanism. A mixture of technologies that don't normally speak to each other, injection of data, prediction of ETA... How reliable is all this?

We run continuous gh-mysql-rewind testing in production to consistently prove that it works as expected. Our testing uses a non-production, dedicated, functional replica. It contaminates the data on the replica. It lets gh-mysql-rewind automatically move it back in time, it joins the replica back into the healthy chain.

That's not enough. We actually create a scenario where we can predict, ahead of testing, what the time-of-arrival will be. We checksum the data on that replica at that time. After contaminating and effectively breaking replication, we expect gh-mysql-rewind to revert the changes back to our predicted point in time. We checksum the data again. We expect 100% match.

See the video or slides for more detail on our testing setup.


At this time the tool in one of several solutions we hope to never need to employ. It is stable and tested. We are looking forward to a promising MySQL development that will provide GTID-revert capabilities using standard commands, such as SELECT undo_transaction('00020192-1111-1111-1111-111111111111:5042').

We have released gh-mysql-rewind as open source, under the MIT license. The public release is a stripped down version of our own script, which has some GitHub-specific integration. We have general ideas in incorporating this functionality into higher level tools.

gh-mysql-rewind is developed by the database-infrastructure team at GitHub.

05 March, 2019 02:04 PM

09 February, 2019

Oz Nahum

Fooling around with JavaScript and OpenPGP

Fooling around with JavaScript and OpenPGP, as the title says. I needed to create a page in which I can encrypt files with OpenPGP. Doing this with JavaScript turned out to be possible. These are the results of my experiment. continue reading...

09 February, 2019 01:34 PM

22 January, 2019

Omer Zak

Anonymizing datasets for machine learning


All of us are familiar with the idea of anonymizing datasets to get rid of personally-identifiable information, in order to enable data mining while preserving (as much as possible) the privacy of the people whose data was collected. The basic idea is to modify names, ID numbers (Social Security Number in USA), home addresses, birthdays, IP addresses and similar information. Sometimes, one needs to get rid also of information about age/gender/nationality/ethnicity.

This method was subjected to a lot of research and it is easy to find, with the help of search engines, relevant papers and articles. See Bibliography for examples.

However, there is also another transformation of datasets. Unlike anonymization, as described above, this transformation is not about privacy preservation. It is about hiding the nature of the data being processed. Lacking a better term, we’ll use the term anonymization also for this transformation.

One possible application for this kind of anonymization is when one develops a revolutionary model for predicting the future behavior of the stock exchanges of the world by following various economic indicators and other publicly available time-dependent data sources.

In such an endeavor, the developer typically has gathered a lot of data, and wants to use it to train his revolutionary machine learning model. Since he cannot afford to build his own data center, he rents a lot of computing power in one of the cloud providers.

However, he does not want to take the risk of an unscrupulous employee of the cloud provider stealing his secret data or model and using it for his own benefit. He also wants to reduce the damage if a black hat hacker breaks into his rented computers.

Some users might want to process information, which interests governments such as the Chinese government. Those governments have the resources to break into cloud computers.

The classical way to mitigate such risks is to encrypt/recode/scramble (henceforth, I’ll refer to all those operations as encryption) the data being uploaded to the cloud. However, this encryption must be done in such a way that the data is still suitable for training the model. In addition, when running the model for making a prediction, the raw model’s results need to be generated in an encrypted form, for decryption in the developer’s on-premises computer/s (to which I will refer as a workstation henceforth). From this point on, we’ll use the terms anonymization and encryption interchangeably.

When looking for relevant research on the second kind of anonymization, I did not easily find relevant information. It motivated me to write this article.


The following symbols are described in order of their appearance in text.

Architecture of machine learning systems

A machine learning system is used to approximate a function M, which makes a prediction (or classification or whatever) P, given the n-tuple A which packs together several argument values:

\displaystyle{}P = M(A)


\displaystyle{}A = (a_1, a_2, \ldots, a_m)

is the argument, and

\displaystyle{}P = (p_1, p_2, \ldots, p_n)

is the prediction.

The values a_j of the argument and p_k of the prediction can be of any data type and they are not limited to scalars. This is why a n-tuple notation is used rather than a vector notation.

Examples of machine learning system applications:

Machine learning systems are sometimes implemented using neural networks. Neural networks have the property that a sufficiently large neural network can be trained to approximate any function, which meets certain reasonable conditions.

A machine learning system is trained to implement a good approximation of the function M by processing several 2-tuples of (A_i, P_i), which associate each prediction – the desired value of the function (which is usually a n-tuple) – with the corresponding argument value (which is usually a n-tuple).

The training process is very computationally intensive, so people often resort to cloud computing facilities, as said above.

Architecture of anonymized machine learning systems

When an user does not want to let the cloud provider know what he is doing, one possible approach is to train the model using encrypted data streams, so that the model’s outputs are encrypted as well. The data streams are encrypted on the user’s workstation. The workstation is used also to decrypt the model’s predictions.

The whole system can be described using the following formulae.

Original system:

\displaystyle{}P = M(A)

We add identity functions before and after M:

\displaystyle{}P = I \circ M \circ I(A) = I(M(I(A)))

The next step is to decompose the identity functions into pairs of a function and its inverse. The functions being used perform encryption and decryption.

\displaystyle{}P = (D_p \circ D_p^{-1}) \circ M \circ (E_a^{-1} \circ E_a(A))

where E_a(A) encrypts the argument A and D_p(P') decrypts the prediction P'.

Now we rearrange parentheses as follows:

\displaystyle{}P = D_p \circ (D_p^{-1} \circ M \circ E_a^{-1}) \circ E_a(A)

Now the system can be decomposed into three parts, which perform the following operations:

  1. Encrypt the argument A: \displaystyle{}A' = E_a(A)
  2. Actual encrypted machine learning system: \displaystyle{}P' = D_p^{-1} \circ M \circ E_a^{-1}(A') = M'(A')
  3. Decrypt the encrypted prediction P': \displaystyle{}P = D_p(P')

where A' and P' are the encrypted argument and prediction respectively.

The functions E_a(A) and D_p(P') need to be invertible, as their inverses are part of the function being approximated by the learning machine model M', which is the second part of the system, and is the one actually run on the cloud provider’s computers.

The first and third parts are implemented on the user’s workstation. The typical implementation relies upon keys and scrambling formulae.

Two more requirements are:

Types of data

When dealing with anonymization of data, one has to consider separately each of the following data types.

Variable names

Variable names are used for naming the various variables which are part of the argument and prediction of the machine learning model. They are used for inspecting the argument’s data streams and for retrieving relevant parts of the model’s prediction.

Of course, the cloud provider should not be exposed to the true names of the variables.

Variable names can be converted into meaningless strings. For example, by using standard password scrambling algorithms, such as salt+md5sum.

The user’s workstation would have tables for mapping among the true variable names and the names used by the model and databases in the cloud.

Numerical variables

Numerical variables can be transformed using invertible functions.

Also, if the argument A has several numerical elements (including time based elements), one could treat them as a single vector and transform it using an invertible matrix.

Mathematically, it could look as follows:

\vec {A_v'} = E_{av}(\vec {A_v}) = E_{matrix} \vec {A_v}


Invertible scalar functions could be applied to A_v‘s elements before and after the matrix transformation.

If the argument has also an element, which is a categorical variable, one could use a different transformation for each value of the categorical variable.

Ordinal variables

The values of the ordinal variables could be permuted. The learning model will implicitly embed the inverse permutation.

Categorical variables

Shuffling categories is not enough, because categories could be identified by their frequencies (like application of Zipf’s law to decrypting substitution ciphers).

The following approach is probably not universally applicable.

Categories could be anonymized by splitting a frequently occurring category into several subcategories. The learning model will give a different prediction for each subcategory. The different predictions will have to be somehow combined in the user’s workstation.

This approach also requires the model to be formulated in such a way that the final prediction can be derived by combining the predictions corresponding to the subcategories of split categories.

Time based variables

When anonymizing time based variables, one needs to transform the argument to hide any dependence it has upon weekly, monthly, seasonal or yearly cycles. One needs also to hide dependencies upon well-known events, such as volcano eruptions or rising CO_2 concentration in air.

Otherwise, it would be possible to identify dates by looking for correlations with well-known timings.

One possible way to hide those dependencies is to apply an ARIMA forecasting model to the argument.


The following articles are about getting rid of personally-identifiable information in order to preserve privacy.

      1. https://en.wikipedia.org/wiki/Data_anonymization
        • Generalization.
        • Perturbation.
      2. http://blog.datasift.com/2015/04/09/techniques-to-anonymize-human-data/
        The methods proposed by this article could interfere with machine learning, except for sufficiently small perturbations.
      3. https://www.elastic.co/blog/anonymize-it-the-general-purpose-tool-for-data-privacy-used-by-the-elastic-machine-learning-team
        • Suppression of fields.
        • Generation of semantically valid artificial data (such as strings). There is a Python module – Faker – which is good for faking names, addresses and random (lorem ipsum) text.
        • The methods, mentioned in this article, cannot anonymize numeric data.
      4. https://docs.splunk.com/Documentation/Splunk/7.2.3/Troubleshooting/AnonymizedatasamplestosendtoSupport
        Anonymization of data such as usernames, IP addresses, domain names.
      5. https://www.oreilly.com/ideas/anonymize-data-limits
        Human data cannot really be anonymized.
      6. https://www.intel.co.kr/content/dam/www/public/us/en/documents/best-practices/enhancing-cloud-security-using-data-anonymization.pdf
        Several methods for anonymizing data such as identifying information of humans, IP addresses, etc:

        • Hiding
        • Hashing
        • Permutation
        • Shift
        • Enumeration
        • Truncation
        • Prefix-preserving
      7. https://ieeexplore.ieee.org/abstract/document/6470603
        Usage of MapReduce to anonymize data.


      After finishing the first draft of this post, I was informed of the following.


      I wish to thank Boris Shtrasman for reviewing a draft of this post and providing a lot of feedback. Of course, any remaining inaccuracies in this post are my sole responsibility.

22 January, 2019 08:37 PM

Amir Aharoni

Amir Aharoni’s Quasi-Pro Tips for Translating the Software That Powers Wikipedia

As you probably already know, Wikipedia is a website. A website has content—the articles; and it has user interface—the menus around the articles and the various screens that let editors edit the articles and communicate to each other.

Another thing that you probably already know is that Wikipedia is massively multilingual, so both the content and the user interface must be translated.

Translation of articles is a topic for another post. This post is about getting all of the user interface translated to your language, as quickly and efficiently as possible.

The most important piece of software that powers Wikipedia and its sister projects is called MediaWiki. As of today, there are 3,335 messages to translate in MediaWiki, and the number grows frequently. “Messages” in the MediaWiki jargon are strings that are shown in the user interface, and that can be translated. In addition to core MediaWiki, Wikipedia also has dozens of MediaWiki extensions installed, some of them very important—extensions for displaying citations and mathematical formulas, uploading files, receiving notifications, mobile browsing, different editing environments, etc. There are around 3,500 messages to translate in the main extensions, and over 10,000 messages to translate if you want to have all the extensions translated. There are also the Wikipedia mobile apps and additional tools for making automated edits (bots) and monitoring vandalism, with several hundreds of messages each.

Translating all of it probably sounds like an enormous job, and yes, it takes time, but it’s doable.

In February 2011 or so—sorry, I don’t remember the exact date—I completed the translation into Hebrew of all of the messages that are needed for Wikipedia and projects related to it. All. The total, complete, no-excuses, premium Wikipedia experience, in Hebrew. Every single part of the MediaWiki software, extensions and additional tools was translated to Hebrew, and if you were a Hebrew speaker, you didn’t need to know a single English word to use it.

I wasn’t the only one who did this of course. There were plenty of other people who did this before I joined the effort, and plenty of others who helped along the way: Rotem Dan, Ofra Hod, Yaron Shahrabani, Rotem Liss, Or Shapiro, Shani Evenshtein, Inkbug (whose real name I don’t know), and many others. But back then in 2011 it was I who made a conscious effort to get to 100%. It took me quite a few weeks, but I made it.

Of course, the software that powers Wikipedia changes every single day. So the day after the translations statistics got to 100%, they went down to 99%, because new messages to translate were added. But there were just a few of them, and it took me a few minutes to translate them and get back to 100%.

I’ve been doing this almost every day since then, keeping Hebrew at 100%. Sometimes it slips because I am traveling or I am ill. It slipped for quite a few months because in late 2014 I became a father, and a lot of new messages happened to be added at the same time, but Hebrew is back at 100% now. And I keep doing this.

With the sincere hope that this will be useful for translating the software behind Wikipedia to your language, let me tell you how.


First, let’s do some work to set you up.

Priorities, part 1

The translatewiki.net website hosts many projects to translate beyond stuff related to Wikipedia. It hosts such respectable Free Software projects as OpenStreetMap, Etherpad, MathJax, Blockly, and others. Also, not all the MediaWiki extensions are used on Wikimedia projects; there are plenty of extensions, with thousands of translatable messages, that are not used by Wikimedia, but only on other sites, but they use translatewiki.net as the platform for translation of their user interface.

It would be nice to translate all of it, but because I don’t have time for that, I have to prioritize.

On my translatewiki.net user page I have a list of direct links to the translation interface of the projects that are the most important:

I usually don’t work on translating other projects unless all of the above projects are 100% translated to Hebrew. I occasionally make an exception for OpenStreetMap or Etherpad, but only if there’s little to translate there and the untranslated MediaWiki-related projects are not very important.

Priorities, part 2

So how can you know what is important among more than 15,000 messages from the Wikimedia universe?

Start from MediaWiki most important messages. If your language is not at 100% in this list, it absolutely must be. This list is automatically created periodically by counting which 600 or so messages are actually shown most frequently to Wikipedia users. This list includes messages from MediaWiki core and a bunch of extensions, so when you’re done with it, you’ll see that the statistics for several groups improved by themselves.

Now, if the translation of MediaWiki core to your language is not yet at 18%, get it there. Why 18%? Because that’s the threshold for exporting your language to the source code. This is essential for making it possible to use your language in your Wikipedia (or Incubator). It will be quite easy to find short and simple messages to translate (of course, you still have to do it carefully and correctly).

Getting Things Done, One by One

Once you have the most important MediaWiki messages 100% and at least 18% of MediaWiki core is translated to your language, where do you go next?

I have surprising advice.

You need to get everything to 100% eventually. There are several ways to get there. Your mileage may vary, but I’m going to suggest the way that worked for me: Complete the easiest piece that will get your language closer to 100%! For me this is an easy way to strike an item off my list and feel that I accomplished something.

But still, there are so many items at which you could start looking! So here’s my selection of components that are more user-visible and less technical, sorted not by importance, but by the number of messages to translate:

I put MediaWiki core last intentionally. It’s a very large message group, with over 3000 messages. It’s hard to get it completed quickly, and to be honest, some of its features are not seen very frequently by users who aren’t site administrators or very advanced editors. By all means, do complete it, try to do it as early as possible, and get your friends to help you, but it’s also OK if it takes some time.

Getting All Things Done

OK, so if you translate all the items above, you’ll make Wikipedia in your language mostly usable for most readers and editors.

But let’s go further.

Let’s go further not just for the sake of seeing pure 100% in the statistics everywhere. There’s more.

As I wrote above, the software changes every single day. So do the translatable messages. You need to get your language to 100% not just once; you need to keep doing it continuously.

Once you make the effort of getting to 100%, it will be much easier to keep it there. This means translating some things that are used rarely (but used nevertheless; otherwise they’d be removed). This means investing a few more days or weeks into translating-translating-translating.

You’ll be able to congratulate yourself not only upon the big accomplishment of getting everything to 100%, but also upon the accomplishments along the way.

One strategy to accomplish this is translating extension by extension. This means, going to your translatewiki.net language statistics: here’s an example with Albanian, but choose your own language. Click “expand” on MediaWiki, then again “expand” on “MediaWiki Extensions”, then on “Extensions used by Wikimedia” and finally, on “Extensions used by Wikimedia – Main”. Similarly to what I described above, find the smaller extensions first and translate them. Once you’re done with all the Main extensions, do all the extensions used by Wikimedia. (Going to all extensions, beyond Extensions used by Wikimedia, helps users of these extensions, but doesn’t help Wikipedia very much.) This strategy can work well if you have several people translating to your language, because it’s easy to divide work by topic.

Another strategy is quiet and friendly competition with other languages. Open the statistics for Extensions Used by Wikimedia – Main and sort the table by the “Completion” column. Find your language. Now translate as many messages as needed to pass the language above you in the list. Then translate as many messages as needed to pass the next language above you in the list. Repeat until you get to 100%.

For example, here’s an excerpt from the statistics for today:

MediaWiki translation stats example

Let’s say that you are translating to Malay. You only need to translate eight messages to go up a notch (901 – 894 + 1). Then six messages more to go up another notch (894 – 888). And so on.

Once you’re done, you will have translated over 3,400 messages, but it’s much easier to do it in small steps.

Once you get to 100% in the main extensions, do the same with all the Extensions Used by Wikimedia. It’s over 10,000 messages, but the same strategies work.

Good Stuff to Do Along the Way

Never assume that the English message is perfect. Never. Do what you can to improve the English messages.

Developers are people just like you are. They may know their code very well, but they may not be the most brilliant writers. And though some messages are written by professional user experience designers, many are written by the developers themselves. Developers are developers; they are not necessarily very good writers or designers, and the messages that they write in English may not be perfect. Keep in mind that many, many MediaWiki developers are not native English speakers; a lot of them are from Russia, Netherlands, India, Spain, Germany, Norway, China, France and many other countries, and English is foreign to them, and they may make mistakes.

So report problems with the English messages to the translatewiki Support page. (Use the opportunity to help other translators who are asking questions there, if you can.)

Another good thing is to do your best to try running the software that you are translating. If there are thousands of messages that are not translated to your language, then chances are that it’s already deployed in Wikipedia and you can try it. Actually trying to use it will help you translate it better.

Whenever relevant, fix the documentation displayed near the translation area. Strange as it may sound, it is possible that you understand the message better than the developer who wrote it!

Before translating a component, review the messages that were already translated. To do this, click the “All” tab at the top of the translation area. It’s useful for learning the current terminology, and you can also improve them and make them more consistent.

After you gain some experience, create a localization guide in your language. There are very few of them at the moment, and there should be more. Here’s the localization guide for French, for example. Create your own with the title “Localisation guidelines/xyz” where “xyz” is your language code.

As in Wikipedia, Be Bold.

OK, So I Got to 100%, What Now?

Well done and congratulations.

Now check the statistics for your language every day. I can’t emphasize how important it is to do this every day.

The way I do this is having a list of links on my translatewiki.net user page. I click them every day, and if there’s anything new to translate, I immediately translate it. Usually there is just a small number of new messages to translate; I didn’t measure precisely, but usually it’s less than 20. Quite often you won’t have to translate from scratch, but to update the translation of a message that changed in English, which is usually even faster.

But what if you suddenly see 200 new messages to translate? It happens occasionally. Maybe several times a year, when a major new feature is added or an existing feature is changed.

Basically, handle it the same way you got to 100% before: step by step, part by part, day by day, week by week, notch by notch, and get back to 100%.

But you can also try to anticipate it. Follow the discussions about new features, check out new extensions that appear before they are added to the Extensions Used by Wikimedia group, consider translating them when you have a few spare minutes. At the worst case, they will never be used by Wikimedia, but they may be used by somebody else who speaks your language, and your translations will definitely feed the translation memory database that helps you and other people translate more efficiently and easily.

Consider also translating other useful projects: OpenStreetMap, Etherpad, Blockly, Encyclopedia of Life, etc. Up to you. The same techniques apply everywhere.

What Do I Get for Doing All This Work?

The knowledge that thanks to you people who read in your language can use Wikipedia without having to learn English. Awesome, isn’t it? Some people call it “Good karma”.

Oh, and enormous experience with software localization, which is a rather useful job skill these days.

Is There Any Other Way in Which I Can Help?


If you find this post useful, please translate it to other languages and publish it in your blog. No copyright restrictions, public domain (but it would be nice if you credit me and send me a link to your translation). Make any adaptations you need for your language. It took me years of experience to learn all of this, and it took me about four hours to write it. Translating it will take you much less than four hours, and it will help people be more efficient translators.

Versions of this post were already published in the following languages:

I’m deeply grateful to all the people who made these translations; keep them coming!

22 January, 2019 12:45 PM

27 December, 2018


5 דברים טכניים שלמדתי השנה

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

1. אני עדיין צריך ללמוד יותר VIM

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

אחד הדברים שלמדתי מחדש השנה הוא Text Object. היכולת של vim לזהות דברים למשל פסקאות, שאתה בין סוגריים, מרכאות, מילים וכיוב'.
בעוד שיש בברירת המחדל תמיכה די טובה. יש הרבה תוספים שמוסיפים לזה עוד יכולות, או רוכבים על הקיים ומוסיפים לזה תכונות.
למשל היכולת להבין "מתודה" כפסקה, או class ככזו. ויצא לי בעצם ללמוד מחדש את כל השימוש בה, שדי הדחקתי. אם עד השנה הזו הייתי משתמש המון ב visual mode, השה הזו ירדתי בכמות השימוש במצב זה, בזכות ה Text Objects.

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

2. אני יודע מה מפריע לי כל כך בלכתוב טסטים

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

אתחיל מכך שאני כן חושב שבדיקות הן חשובות, אבל לא בגישה העיקרית ששולטת בשוק.
למשל אם תלכו לחבילת go שיצרתי לאחרונה בשם gostrutils, תגלו כי יש לי שם בד"כ קרוב ל100% cover לפונקציות שם.
זה מאוד חשוב לי שיהיה 100%. עד כמה שזה נשמע מוזר, אבל מה זה אומר בעצם 100%?!

אז דבר ראשון מערך הבדיקות מתחלק למספר חלקים:

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

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

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

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

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

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

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

3. אין לי אהבה לקוד

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

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

הניסיון לכתוב את הדבר היפה ביותר בצורה הטובה ביותר עם O(log(n)) במקרה הכי אופטימי, ו O(n) הכי פסימי פשוט לא רלוונטית הרבה פעמים.

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

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

4. לא כל המפתחים חושבים זהה

יצא לי להביט על קוד אשר הבנתי אותו, אבל לא מה ניסו לפתור בו.
השתמשו ב hash map אשר מחזיק 3 דברים בתוכו בסה"כ ומוזן בזמן עליה, והבעיה היא ששינוי התוכן התבצע מתוך מספר טרדים, ואז קיבלנו race condition רנדומאליים וקריסות.

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

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

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

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

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

5. מבחנים לא נכונים

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

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

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

27 December, 2018 09:04 AM

21 October, 2018

Lev Meirovitch

Linux new Code of Conduct

Collection of links to emails, articles and posts about Linux Kernel CoC situation arranged by date.

21 October, 2018 05:26 AM

20 October, 2018

Lev Meirovitch

How not to protect your app

Examples of several wrong ways to make your app secure

20 October, 2018 01:51 PM

02 October, 2018

Guy Sheffer

RealtimePi – out of the box real-time RaspberryPi Raspbian

RealtimePi logo

RealtimePi logo

Hey all,
So it started as a curiosity, and it looks like its working. I made a Raspbian-based distro that ships with a realtime kernel called RealtimePi. You can download the latest here.  It’s open source, sources are here.

A realtime system means its deterministic, it means you should know how long things take to run. They way to do is is to apply a patch to the linux kernel that makes it non-preemptible. To explain – Preemption is the act of temporarily interrupting a task being carried out by a computer system, without requiring its cooperation, and with the intention of resuming the task later.

This is useful for building hardware and robotics, low latency audio and other gpio because there are no surprises when it comes to timing. It seems like something good to try out with the RaspberryPi, because of the GPIO and IOT capabilities.

Bundled with CustomPiOS you can build your customized realtime-kernel device.


Steps to install

  1. Download the image here
  2. Unzip and flash it to an SD card (small enough to fit a 2GB card)
  3. Open newly flashed image and edit two files, one for the wifi, and one for the bot token:
  4. Put in realtimepi-wpa-supplicant.txt your wifi address (skip if using Ethernet cable). Here is how it should look:

You can test the realtime kernel is enabled, by running in the commandline

uname -a

You should see something like this, note PREEMPT RT which indicates its realtime:

 Linux realtimepi 4.9.52-rt37 #1 PREEMPT RT Fri Oct 6 22:29:28 UTC 2017 armv6l GNU/Linux

The line should  look a little different for armv7

I am not an expert with actually building realtime systems, so input on how it preforms, and examples would be appreciated!


Full text

02 October, 2018 12:33 PM

01 October, 2018

Guy Sheffer

How to build a telegram-controlled sous vide using CraftBeerPiOS

Sous vide pot with tempreture sensor

Sous vide pot with temperature sensor

Hey all,
So I’ve been cooking sous vide a few months now, with a sous vide I built myself. Its connected to a RaspberryPi and can be controlled via the web or telegram.

No soldering required!

Flash a ready made image to the Pi!

Bill of materials

  1. Slow cooker (crockpot) with a ‘high’ option. You can get them second hand, they are pretty cheap. Make sure it has no digital control.
  2. Raspberry Pi, even version 1 should work – also an SD card and power supply for the Pi.
  3. Pi Plate prototype board. Make sure you get one that matches your Raspberry Pi footprint if you are re-using an old Pi.
  4. Solid state relay that can handle mains
  5. Power cables
  6. Data cable to connect the relay to the Pi
  7. Power socket and power connector for your country – get locally so it fits your country standard.
  8. Water resistant temperature sensor DS1820 x2 – Get a spare one so you can measure the temperature difference and make sure your sous vide is uniformly heated.
  9. Important – 3D printed enclosure for raspberrypi (Raspberry Pi 1) and enclosure for the relay – you are mixing water and electricity in a kitchen, don’t be an idiot.


  1. Build the following construction from the relay. You need phase to go via the relay, and in to the sous vide. Please look at this chart to understand what cable is equivalent in your country.

    Relay assemply

    Relay assembly – brown writes is phase

  2. Close up the relay in its box, and attach the power plugs

    Relay in its case and power sockets in place

    Relay in its case and power sockets in place, transparent sticky tape protects case

  3. Wire the temperature sensor DS1820 to GPIO pin 4 (you can use one on the screw terminal and another on the jumper slot, the second one is only to make sure you have a working sous vide.
  4. Connect SSR – terminal to ground, and + terminal to GPIO 17 (you can pick other GPIOs if you want).

    Raspberypi wiring . Two temp sensors on GPIO 4, one Solid state relay (SSR) on GPIO 17

    Raspberypi wiring . Two temp sensors on GPIO 4, one Solid state relay (SSR) on GPIO 17

  5. plug the relay in the your power supply and plug your slow cocker to it. DANGER: Make sure your connections are right with a multimeter before. If you are unsure don’t do this. Mains power can kill!
  6. That’s it!
Rasepberrypi and relay in cases

Rasepberrypi and relay in cases

Sous vide pot with tempreture sensor

Sous vide pot with temperature sensor


I have built a distro called CraftBeerPiOS based on CraftBeerPi 2.2. Why 2.2 and not 3? Because there is an issue with the license. I would have picked something else, but Manuel the developer clearly writes in the README that CraftBeerPi is open source. Its dodge I know, I would welcome someone rewriting something like this. I would help build a distribution.

Why telegram? (which is optional)

I found that telegram was much faster and handy while I am in the kitchen, or if I want to turn the sous vide on before I come home. So I warmly recommend it over CraftBeerPi’s interface. I will mark all its step as optimal in case you don’t want it.


  1. All you got to do is just flash the img to the Pi. Which can be downloaded here. It has both CraftBeerPi and a telegram bot pre-install. The bot is written by me and is open source.
  2. [optional telegram] Create a telegram bot using the botfather here is an explanation how to do this. Its really easy – basically you text a bot the command /newbot, you are asked a few questions and get an API token, you place this token in the file /boot/config.ini where its asked for.

    Setting a new bot

    Setting a new bot

  3. Open the sdcard /boot partition, you can do this on windows. And edit the file /boot/craftbeerpios-wpa-supplicant.txt

    Set wifi setting you need to change

    Set wifi setting you need to change

  4. [optional telegram] Add your telegram token

    config.ini setting

    config.ini, Telegram token goes here

  5. Pop the SD card in the Pi and boot it
  6. You might want to attach a screen on first boot and make sure everything went well. If it did, you should have on your network a service on http://craftbeerpi.local:5000 .If you can’t find the hostname try the Raspberrypi’s IP address. Depending on your network router it might not work.
  7. Follow on that link the wizard to set up your temperature, relay, and kettle.
    CraftBeerPi all set up with a thermometer and relay

    CraftBeerPi all set up with a thermometer and relay

    Hardware setting in craftbeerpi

    Hardware setting in craftbeerpi


    How the kettle configuration looks

  8. [optional telegram] Text your new telegram bot the command /start this should make your telegram user appear in the telegram control panel located at http://craftbeerpi.local:5001.
  9. Login default user is admin, password 1234
  10. [optional telegram] Set yourself as an admin, otherwise you can’t control your sous vide. This is for security reasons.

    CraftbeerPiBot access control

    CraftbeerPiBot access control

  11. [optional telegram] Send /help to the bot to see the available commands. You can set the sous vide temperature, turn it on and off.

    Sous vide bot list of commands

    Sous vide bot list of commands

Thats it, enjoy! Share recipes!

Sous vide pork belly cooked in maple and liquid smoke and rosemary for 18 hours at 72C

Sous vide pork belly cooked in maple and liquid smoke and rosemary for 18 hours at 72C

Full text

01 October, 2018 06:07 PM

15 September, 2018

Ilya Sher

AWS CloudFormation became a programming language

… kind of.

Declarative has its advantages which are hyped all over the internet so I’ll skip that part. The painful downside of declarative approach is often the expressivity. Sample proofs:

Now you can have Python embedded in your CloudFormation file. That is part of the CloudFormation Macros which were introduced on 2018-09-06.

Happy coding, everyone!


15 September, 2018 05:07 AM

31 July, 2018

Lior Kaplan

Debconf18 – יום ראשון

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

לצערי הכנסים של דביאן נפתחים מאוד בעצלתיים מבחינת תוכן – יש הרצאת/טקס פתיחת ואחרי אין ישר רצף גדול של הרצאות אלא טפטוף קטן של נושאים והרצאות. קצת מאכזב מבחינתי. ומצד שני, אפשר לי להתחיל לעבוד על החבילות של עברית בדביאן בלי לדאוג לפספס תוכן כלשהו. אבל לפני שאפשר לעבוד על החבילות, צריך לייצר סביבה מתאימה. לקח לי זמן להוריד חלודה לגבי מה צריך, ואיך לייצר משהו שיודע לבנות בתוך chroot (גם כדי שהבניה תהיה נקייה, וגם כי אני משתמש ב-testing בעוד שהבניה נעשית ב-unstable). בעזרת כמה תזכורות מ-Bálint הכל הסתדר, ויש סביבה עובדת עם sbuild.

השלב השני היה להתחיל להמיר את ההיסטוריה של הצוות מ-SVN ל-GIT ואז לדחוף את זה לשרת ה-GitLab החדש של דביאן. עשיתי את זה בנפרד עבור כל חבילה, כאשר הראשונה בתור היא Hspell כי צפריר הספיק להכין את הרוב מראש. ואחר כך עבדתי על המרת Culmus כי לא הייתי רוצה שהגרסה הבאה תצא בלי פונטים בעברית (על הדרך כבר הועלתה גרסה 0.132). כל המאגרים זמינים תחת Debian Hebrew Packagers בכתובת https://salsa.debian.org/hebrew-team . למי שצריך לעשות משהו דומה, הכלי להמרה היא git svn clone ואפשר להשתמש בהוראות שיש באתר git-scm.com בכתובת https://git-scm.com/book/en/v2/Git-and-Other-Systems-Migrating-to-Git . על בסיס הפקודות שלהם עוד עשיתי כמה שינויים קלים, אבל החלקים החשובים נמצאים שם.

בין לבין שמעתי את הדיווח השנתי של Chris Lamb במסגרת תפקידו כ-Debian Project Leader. בין השאר גיליתי שם כי דביאן תחגוג השנה יום הולדת 25 באמצע אוגוסט, וישר החלטתי לפתוח event כדי לחגוג עם עוד אנשים. נתראה שם בקרוב (: בנוסף, גיליתי כי המעבר של דביאן ל-GitLab נובע בין השאר גם מהשינוי שלהם בנושא ה-Content License Agreement ושינוי ל-Developer Certificate of Origin מה שמאפשר ליותר אנשים לתרום קוד בלי לוותר על הזכויות שלהם או לקרוא מסמך משפטי כבד. שאפו ל-GitLab, ואיזה כיף לעבור לעבוד במערכת מתקדמת.

31 July, 2018 02:40 PM

29 July, 2018

Lior Kaplan

Debconf18 – קדם כנס

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

היום הפתוח התנהל בחלקו בסינית, כך שאפילו לא ניסיתי ללכת להרצאות (גם לבודדות שהיו באנגלית), ובמקום זה התמקדתי בקצת שיחות עם אנשים (למרות העייפות). הספקתי לדבר עם Bálint Réczey שעובד עבור Canonical בצוות Ubuntu Foundation שאחראי על הסנכרון עם דביאן והתרומה של שינויים לקהילה. גם ניצלתי את ההזדמנות כדי לשמוע באיזה כלים הם משתמשים בפעילות, כדי לתזכר את עצמי. אחרי כמעט שנה שלא נגעתי בחבילות, אני בהחלט חלוד (וגם צריך לסדר את סביבת העבודה על המחשב). אגב, קנוניקל מחפשים אנשים עובדים, אם מישהו מתעניין, צרו קשר בפרטי (יש אפשרות לעבוד מרחוק, ואוכל לעזור בסידורים הנדרשים).

בהמשך הערב ישבתי על באג שדיווח לקוח על פיצ'ר של PHP שלא עובד לו מול OpenSSL. תפסתי את Kurt Roeckx שאחראי על החבילה בדביאן וגם עושה עבודת upstream בכמה שנים האחרונות כדי לבדוק את הנושא. אחרי קצת שאלות מולו ובדיקות שלי הסתבר שהבעיה היא לא ב-OpenSSL אלא ב-PHP, ואחרי מספיק חיטוטים בקוד נפתח באג #76676.

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

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

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

מי שרוצה לעקוב אחרי הכנס מרחוק, אז הלוח זמנים נמצא בכתובת https://debconf18.debconf.org/schedule, רק לא לשכוח שהכנס מתקיים באזור זמן +8, כלומר 5 שעות לפני ישראל (ריאלית, אפשר לצפות בהרצאות של אחרי ארוחת הצהריים כאן, שזה 9 בבוקר בישראל).

29 July, 2018 04:17 PM

10 July, 2018

Rabin Yasharzadeh

Overwrite the default GTK theme per application

I love using a dark theme on my system, currently I’m running the Adapta theme. But not all applications looks great in dark themes, some need tweaking, this is a quick hack to overwrite the default theme used for a specific application.

In this example I’ll be overwriting the theme for virt-manager.

First we’ll copy the default launcher/desktop file to the local dir, and then we will change that file,

sudo cp /usr/share/applications/virt-manager.desktop /usr/local/share/applications/virt-manager.desktop
sudo vim /usr/local/share/applications/virt-manager.desktop

And do this small change, prefix the application Exec command with

env GTK_THEME=theme_name

--- /usr/share/applications/virt-manager.desktop 2018-02-28 22:48:50.000000000 +0200
+++ /usr/local/share/applications/virt-manager.desktop 2018-07-09 11:00:40.000000000 +0300
@@ -55,7 +55,7 @@
Comment[sv]=Hantera virtuella maskiner
Comment[uk]=Керування віртуальними машинами
+Exec=env GTK_THEME=Adapta virt-manager

10 July, 2018 12:24 PM

03 June, 2018

Rabin Yasharzadeh

Convert certificate format with OpenSSL

Convert a PEM file to DER (crt etc)

$ openssl x509 -outform der -in certificate.pem -out certificate.crt

Convert a PKCS#12 file (.pfx .p12) containing a private key and certificates to PEM

$ openssl pkcs12 -in keyStore.pfx -out keyStore.pem -nodes

Convert a PEM certificate file and a private key to PKCS#12 (.pfx .p12)

$ openssl pkcs12 -export -out certificate.pfx -inkey privateKey.key -in certificate.crt -certfile CACert.crt


03 June, 2018 09:25 AM

22 May, 2018

Shlomi Noach

MySQL master discovery methods, part 5: Service discovery & Proxy

This is the fifth in a series of posts reviewing methods for MySQL master discovery: the means by which an application connects to the master of a replication tree. Moreover, the means by which, upon master failover, it identifies and connects to the newly promoted master.

These posts are not concerned with the manner by which the replication failure detection and recovery take place. I will share orchestrator specific configuration/advice, and point out where cross DC orchestrator/raft setup plays part in discovery itself, but for the most part any recovery tool such as MHA, replication-manager, severalnines or other, is applicable.

We discuss asynchronous (or semi-synchronous) replication, a classic single-master-multiple-replicas setup. A later post will briefly discuss synchronous replication (Galera/XtraDB Cluster/InnoDB Cluster).

Master discovery via Service discovery and Proxy

Part 4 presented with an anti-pattern setup, where a proxy would infer the identify of the master by drawing conclusions from backend server checks. This led to split brains and undesired scenarios. The problem was the loss of context.

We re-introduce a service discovery component (illustrated in part 3), such that:

In a failover/service discovery/proxy setup, there is clear ownership of duties:

Depending on the technologies used, we can further achieve:

We explain the setup using the following assumptions and scenarios:

A non planned failover illustration #1

Master M has died, the box had a power failure. R gets promoted in its place. Our recovery tool:

The proxy:

The app:

A non planned failover illustration #2

Master M gets network isolated for 10 seconds, during which time we failover. R gets promoted.

Everything is as before.

If the proxy kills existing connections to M, then the fact M is back alive turns meaningless. No one gets through to M. Clients were never aware of its identity anyhow, just as they are unaware of R's identity.

Planned failover illustration

We wish to replace the master, for maintenance reasons. We successfully and gracefully promote R.


This is a setup we use at GitHub in production. Our components are:

As mentioned earlier, the apps need not change anything. They connect to a name that is always resolved to proxy boxes. There is never a DNS change.

At the time of failover, the service discovery component must be up and available, to catch the change. Otherwise we do not strictly require it to be up at all times.

For high availability we will have multiple proxies. Each of whom must listen on changes to K/V. Ideally the name (cluster1-writer.example.net in our example) resolves to any available proxy box.

See also:

Sample orchestrator configuration

An orchestrator configuration would look like this:

  "ApplyMySQLPromotionAfterMasterFailover": true,
  "KVClusterMasterPrefix": "mysql/master",
  "ConsulAddress": "",
  "ZkAddress": "srv-a,srv-b:12181,srv-c",
  "PostMasterFailoverProcesses": [
    “/just/let/me/know about failover on {failureCluster}“,

In the above:

See orchestrator configuration documentation.

All posts in this series

22 May, 2018 08:45 AM

07 May, 2018

Meir Kriheli

מצגת ההרצאה NoORM

למרות כותרת ההרצאה הפרובוקטיבית, ההרצאה שלי ב־PyWeb-IL 75 עוסקת במקרים בהם עלינו לעזוב את מחוזות ה-ORM/ODM.

מצגת ההרצאה NoORM זמינה בעמוד הרצאות ומצגות.

07 May, 2018 09:26 PM

25 April, 2018

Arie Skliarouk

GRUB-based multiple iso booting flash drive

With huge USB flash drives of today it is sad that one can't easily put several bootable ISO images on it and have nice on-boot selection menu.

GRUB to the rescue!

Historically GRUB is being used for hard disks and syslinux for floppies and flash drives. But nothing prevents using GRUB for flash drives as well. Here are instructions for creating bootable GRUB-based USB flash drive (disk on key):

  1. Create vfat partition. For big drives you must use fat32 format.
  2. Unpack the http://skliarie.meshanet.com/skliarie_blog/boot.tar.gz onto it. It will create single directory boot on the drive.
  3. Customize boot/grub/grub.cfg file, put iso images accordingly
  4. On linux box, put bootable MBR onto the DOK (for example on /dev/sdf):
    1. mount /dev/sdf /mnt/dok
    2. grub-install --force --no-floppy --root-directory=/mnt/dok /dev/sdf
    3. umount /mnt/dok 


    The ISO image must support GRUB-based booting. Specifically it must be smart enough to locate ISO image on the DOK using parameters specified in grub.cfg file.

    Latest Ubuntu and Debian based ISO images are known to work.

    Thanks to Jonathan Vollebregt there is a way to boot knoppix as well. You will need custom initrd, with your flash drive specific tuning. I built one for mine: knoppix_minirt.gz, you are free to take and modify it according to your DOK and filesystem parameters. Important commands here are:
    1. Unpack the initrd
      gzip -dc /mnt/dok/boot/knoppix/minirt_ska.gz | cpio -i
    2. Modify the init file (put sector numbers that are correct for your DOK)
    3. Compress back the initrd
      find ./ | cpio -H newc -o | gzip -9 -c > /mnt/dok/boot/knoppix/minirt_ska.gz
    Please send me GRUB stanzas for other ISO images and I will put them into the grub.cfg file.

    25 April, 2018 08:21 AM

    adaptec CLI management tool

    Recently I had to install adaptec CLI management tool on an ubuntu 8.10 amd64 server. Despite the fact that aacraid driver is present in kernel, it took me a lot of time to find the management tools that allow to see the RAID status and manipulate it from command line. There are several names for the tools: afacli, aaccli, afaapps, afa-apps-snmp, arcconf, hrconf... oh my!
    After I found the necessary tools (64bit arch), I packaged them into a tiny deb package adaptec-utils_0.0.1_amd64.deb, which can be downloaded from here: DELETED_AS_REDISTRIBUTION OF BINARIES_IS_PROHIBITED_BY_ADAPTEC

    Also, I wrote a simple monitoring script (included in the deb package) that checks the state of the Adaptec RAID system and sends out an email if any of the published indicators is wrong (battery, failed disks, etc). The script can be downloaded from here:

    Note that the script requires proprietary binary files to be installed. See the beginning of the script for the details.

    25 April, 2018 08:20 AM

    19 March, 2018

    Tom Bigelajzen

    Font Progress Update

    The Ubuntu Font Hebrew v0.8 Design PrototypeThere was some progress made this week, especially with fine tuning the letters and revising those letters I’m not so sure about.
    The one letter I’m struggling with is Aleph (א), I can’t seem to find the right balance.

    I got a lot of feedback and many good tips, thank you everybody 🙂
    I’m doing my best to take them all into account.

    I was trying to add some Hebrew glyphs to a font file, but the free font creation programs I tried (FontForge and the Demo of TypeTool) are not so friendly, it will take some more time to do.

    Links to v0.8:
    PDF file
    Illustrator CS4 File

    19 March, 2018 08:15 AM

    Ubuntu Font Hebrew Subset now has an issue on Launchpad

    The Ubuntu Font Hebrew v0.8 Design PrototypeI opened an issue on launchpad and it was added to the Ubuntu Font Family Wishlist queue.

    As an added bonus Mark Shuttleworth himself gave his blessing to this design effort (!)
    It was a fun mail to start the day with 🙂

    I want to quote one thing he wrote:

    It *would* be useful if you could start building up a Hebrew community that can provide early and accurate feedback to DM when they start the Hebrew design process.

    And later, Paul Sladen wrote:

    developing a typeface takes a very long-time (months and months), and although
    work on Hebrew won’t be incorporated until the Ubuntu 11.04 development cycle,
    it is very useful to start working on it now!

    So, I really want to start working on it seriously (too bad I didn’t start this before August Penguin…)
    This week I guess I’ll finish the initial design with the good tips I got from Paul Sladen and from Maxim Ioresh, but this is only the beginning:

    A real OpenType font must be created and refined, people need to test it, to find where it breaks.
    And there are more variants –  we have to do the Bold font, the Italic and Bold Italic, and by the time these will be finished there most likely be some Condensed variants too… so I need designers, typographers and testers to pitch in, we have a bit more than 6 months, it’s enough, but not a lot of time for a community project.

    Original post: http://tombigel.com/2010/08/26/hebrew-for-the-ubuntu-font/

    This is fun! I love Open Source.

    19 March, 2018 08:15 AM

    05 March, 2018

    Lior Kaplan

    Running for OSI board

    After serving in the board of a few technological Israeli associations, I decided to run as an individual candidate in the OSI board elections which starts today. Hoping to add representation outside of North America and Europe. While my main interest is the licensing work, another goal I wish to achieve is to make OSI more relevant for Open Source people on a daily basis, making it more central for communities.

    This year there are 12 candidates from 2 individual seats and 5 candidate for 2 affiliate seats (full list at OSI elections wiki page). Wish me luck (:

    Full text

    05 March, 2018 09:37 AM

    25 February, 2018

    Ira Abramov

    עוד פרויקט שלא אגיע אליו: עוזר חכם ובית חכם

    האם אתם רוצים מערכת כזו? התשובה מורכבת.

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

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

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

    1. יש מיקרופון והמחשב שמאזין לו, מנסה לבטל רעשי רקע ולהתמקד במה שעלול להיות דיבור.
    2. אח"כ תוכנה אחרת שבודקת אם זה אכן דיבור ומתרגמת אותו לטקסט. זה אולי הרכיב הכי מתוחכם במערכת ונחמד שיש אופציה או שתיים ברישיון חופשי (אבל כרגע אני די בטוח שזה עובד רק באנגלית, ולא יעבוד בעברית בקרוב. מקווה שלא תהיה בעיה עם זיהוי מבטא לא ילידי :)
    3. אחרי שיש לנו טקסט אפשר לפענח ממנו את הפקודה גם אם לא נאמרה בצורה תקנית אחת. כלומר "התראה עוד שעה" או "בבקשה כוון לי תזכורת בעוד שעה מעכשיו, תודה" הם שני משפטים שונים למדי אבל המחשב צריך לזהות את שניהם. הרכיב הזה והרכיב הקודם הם הרכיבים שקורים בענן של גוגל או אמאזון או מיקרוסופט שאותם אני רוצה להביא אל תוך הבית.
    4. בשלב הזה אפשר להפעיל מיני תוכנות וסקריפטים (מייקרופט למשל קוראים לזה "כשרונות" והקהילה פיתחה כבר כ-140 כאלו), כאן מגיעה ההתממשקות עם MQTT ורכיבי חומרת Sonoff השונים, או גישה לרשת כדי לדבר עם חשבון הגוגל שלכן כדי לבדוק איש קשר או לדחוף ארוע ליומן, וכיוצא באלו.
    5. לבסוף לאשר או להחזיר משוב למשתמש בצורת רכיב אחר שהופך תשובת טקסט לדיבור, מסנטזים כאלו יש הרבה בשוק – היה לי אפילו על אפפל ][ עם 64K זכרון, לצערי האיכות התפתחה מעט מאוד מאז בתוכנה פתוחה. מקווה שישתפר בעתיד.

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

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

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

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

    25 February, 2018 03:50 PM

    16 January, 2018

    Artyom Beilis

    CppCMS עובר מ-LGPLv3 ל-MIT

    היום עדכנתי רישיון של CppCMS ל-MIT. הגרסה הקרובה 1.2 תשוחרר עם רישיון מעודכן

    ההחלטה נובעת ממספר סיבות:

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

    הטקסט המלא

    16 January, 2018 09:47 AM

    04 January, 2018

    Levi Shahar

    איך לא להגן על הרשת אלחוטית שלכם

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

    Full text

    04 January, 2018 09:25 AM

    28 November, 2017

    Lior Kaplan

    AGPL enforced: The Israeli ICT authority releases code

    Data.gov.il was created in 2011 after the Israeli social justice protests as part of the the public participation initiative and started to offer data held by the government. Back then the website was based on Drupal. In 2016 it was changed to CKAN, a designated system for releasing data. This system is licensed under the AGPLv3 requiring source code availability for anyone who can access the the system over a network, de facto for every user.

    Since the change to CKAN, open source people asked the state to release the code according to the license but didn’t get a clear answer. All this time when it’s clear it’s violation.  This led Gai Zomer to file a formal complaint in March 2017 with the Israeli State Comptroller. Absurdly, that same month the ICT authority mentioned a policy to release source code it owns, while failing to release code it has taken from others and adapted.

    With the end of the summer break and Jew holidays, and after I wasn’t able to get the source, I decided to switch to legal channels, and with the help of Jonathan Klinger and my company, Kaplan Open Source Consulting, we notified they should provide the source code or we’ll address the court.

    Well, it worked. In 3 days time the CKAN extensions where available on the website, but in a problematic way, so users weren’t able to download easily. This is why we decided not to publish this code release and let them fix it first. In addition we made it clear all the source code should be available, not only the extensions. Further more, if they already release it’s recommended to use git format instead of just “dumping” a tarball. So we told them if they aren’t going to make a git repository we’ll do that ourselves, but in any case, would prefer them to do that .

    While this issue is still pending, the ICT authority had a conference called “the citizen 360” about e-gov and open government in which they reaffirmed their open source plans.

    A slide about open source from the Israeli ICT authority presentation

    A slide about open source from the Israeli ICT authority presentation

    Now, a month later, after our second letter to them, the about page in data.gov.il was updated with links to the ICT authority GitHub account which has the sources for the website and the extensions. A big improvement, and an important mark point as the commit to the repository was done by an official (gov.il) email address.

    Beyond congratulating the Israeli ICT authority for their steps forward and the satisfaction of our insisting on them became fruitful, we would like to see the repository get updated on a regular basis, the code being given back to the various CKAN extensions (e.g. Hebrew translation). In general, we hope they would to get inspired by how the how data.gov.uk is doing technical transparency. If we allow ourselves to dream, we would like to see Israel becoming a dominate member in the CKAN community and among the other governments who use it.

    We’re happy to be the catalyst for open source in the Israeli government, and we promise to keep insisted where needed. We know that due to other requests and notifications more organizations are on their way to release code.

    (This post is a translation from Hebrew of a post in Kaplan Open Source Consulting at https://kaplanopensource.co.il/2017/11/20/data-gov-il-code-release/)

    Full text

    28 November, 2017 09:07 AM

    28 October, 2017

    Levi Shahar

    השורה הראשונה בסקריפט שלכם

    הפוסט הבא נכתב כתשובה למישהו שאמר לי “הטרמינל קורא את השורה הראשונה בקובץ (*sh), ומחליט כיצד להריץ אותו”. והאמת היא שזה לא נכון, כי הקרנל בכבודו ובעצמו מטפל בזה.

    Full text

    28 October, 2017 09:25 AM

    18 October, 2017

    Ram on Agmon

    אובנטו 1710 – גירסה ששווה להתקין

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

    הטקסט המלא

    18 October, 2017 05:06 PM

    31 July, 2017

    Ira Abramov

    כפתור פראנויה לכל כיס

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

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

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

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

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

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

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

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

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


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

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

    אני בונה היום אתר, להשקיע באימות כזה למשתמשים שלי?
    גם TOTP-2FA וגם U2F – לדעתי כן, במיוחד אם האתר שומר פרטים אישיים של כרטיסי אשראי, בריאות מטופלים ועוד כיוצא באלו. יש ספריות חופשיות שקל לשלב, ולמערכות כמו וורדפרס, דג'נגו, ג'ומלה, רובי-או-ריילז ואחרות יש כבר מודולים מוכנים לקטיפה מהעץ, אז חבל להתעצל!

    למה יוביקי 4 ולא גרסת הנאו?
    טעם אישי. היוביקי 4 תומך במפתחות טיפה יותר גדולים, הוא טיפה יותר זול, קוד ה-PGP שלו פתוח בגיטהאב. לרוב האנשים גם הנאו יהיה מצוין, והיתרון הגדול שלו הוא NFC שעובד עם אנדרואידים שיש להם רכיב תקשורת תואם. אם רוצים להשתמש ביוביקי 4 (ללא NFC) על אנדרואיד, אפשר בעזרת כבל OTG, או לטלפונים חדשים, חיבור ישיר USB-C בדקם יוביקי החדש).

    יש מתחרים ראויים?
    יש כמה. חלקם יתנו U2F בלבד בפחות מ$10-$20, חלקם יקרים מאוד אבל עושים דברים נוספים כמו לשמש כארנק קריפטומטבעות (למשל Trezor ואחרים) ויש גם אופציות "האקריות" פתוחות כגון OnlyKey שמוסיף שכבות הגנה כמו סיסמא, פיצ'רים כמו השמדה עצמית וכדומה. יש מצב שאקנה כזה בעתיד, למרות שהוא נראה פחות עמיד מכנית לשבירה ושפשופים.

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

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

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

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

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

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

    31 July, 2017 04:51 PM

    12 July, 2017

    Artyom Beilis

    אחרי תקופה ארוכה שוחררה בטא של CppCMS 1.1.0

    אחרי תקופה ארוכה של המתנה שוחררה גרסת בטא 1.1.0 של CppCMS. גרסה זו מכילה המון שיפורים ושיוניים. ביניהם:

    • תכנון מחדש של application pool לתיקון מספר בעיות מובנות שהיו קיימות בו עד כה
    • API חדש של פעולות non-blocking לשיפור משמעותי בביצועי אפליקציות אסינכרוניות
    • סיכון ועיבוד בזמן העלאה של התוכן (למשל עיבוד או בדיקה של קבצים תוך כדי העלאה)
    • תמיכה משופרת ב-RESTful API
    • מערכת לניהול plugin ושיפורים מערכת תבניות (templates) בהם.
    • אפשרות ניהול session ללא עוגיות (למקרה והמשתמש ממש צריך)
    • שילוב ניהול ה-session מול טכנולוגיות אחרות כולל מימוש עבור PHP, Java Servlet, ASP.Net ו-Python Django
    • שיפורי ביצועים רבים
    • ועוד...

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

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

    • ל-1.4 תמיכה מלאה ב-HTTP/1.1, ב-HTTPS ומימוש של websockets
    • ל-2.0 להעביר CppCMS ל-C++11 תוך ניקוי חלק מה-API שילקח מספריה סטנדרטית כמו std::shared_ptr

    אתם מוזמנים להתנסות בגרסת בטא האחרונה!

    הטקסט המלא

    12 July, 2017 09:01 AM

    18 June, 2017

    Amir Aharoni


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

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

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

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

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

    אני מרוצה מהשינוי של „תכנה” ו„יזמה” ל„תוכנה” ו„יוזמה”. אני גם מרוצה למדי מהשינוי של מילות היחס „אתי, אתך” ל„איתי, איתך”, ושל „עתים” ל„עיתים”, אבל מוזר לי ביותר שלא נוספה בהזדמנות הזאת האות יו״ד למילים כמו „אִגרוף” ו„מִחזור”, כדי לא להתבלבל עם „אֶגרוף” ו„מַחזור”. זה היה יכול להיות כלל פשוט ושימושי, והוא ממש לא היה אמור להיות שנוי במחלוקת. חבל שזה התפספס.

    עוד משעשעים אותי ה„אישורים” שנינתו למילה „אומנם” וליו״ד בצורת הגוף הראשון בזמן עתיד בבניין נפעל, למשל „איכנס” במקום „אכנס”. אני תמיד כתבתי אותם בכתיב מלא. את „אומנם” כתבתי בווי״ו כי גם „אֻמנם” הוא ניקוד תקני ולא רק „אָמנם”, וצליל u תמיד אמור להיכתב בווי״ו (אם כי עכשיו גיליתי לראשונה שהניקוד „אֻמנם” מיועד לשאלות, לפחות לפי אבן־שושן). ובבניין נפעל כתבתי תמיד „איכנס”, „איזהר”, וכו׳, כי הניקוד בחיריק תקין כמו בניקוד בסגול (ר׳ למשל גזניוס 51p).

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

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

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

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

    18 June, 2017 11:03 AM

    13 January, 2017

    Ram on Agmon

    סיכום שנה שנת 2016 + מצבה של התוכנה החופשית

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

    הטקסט המלא

    13 January, 2017 12:10 PM

    18 October, 2016

    PyCon Israel

    Pycon Israel 2016 wrap up

    A little less than six months ago, we held the first PyCon in Israel. To our dismay, it took us this long to post all the videos from the event, but now they’re finally up, and you can finally catch up on The Track Not Taken.

    We’d like to take this opportunity to clear the 2016 table and summarize the conference, to give it some closure.

    The conference was a lot of work and fun to organize, and truly wonderful to witness. We’ve had:

    Over and beyond the hard data, there was a great feeling of a community coming together.

    There’s a few points we want to discuss in more details:


    We made a conscious effort to make the conference more welcoming to diverse populations. This included a well-defined Code of Conduct, as well as reaching out to specific communities, which are usually underrepresented in technical conferences. This included, of course, the cooperation with Django Girls Tel Aviv, who were invited to the conference; we did not collect the statistics of visitor gender, but we have reason to believe it was significantly more balanced than usual. We also reached out to some other groups who were less clearly visible. By all the feedback we got, everybody felt very welcome.

    To our regret, we could not show the same level of diversity among the speakers. Only 3 of the 32 accepted talks were presented by women, and none of these were Israeli. Further, we did not have a travel-support plan for speakers, and partly as a result of that, we did not have any speaker from the less-privileged parts of the world. We still have some way to go there.

    We intend to keep pursuing diversity in future editions of PyCon Israel.


    In the spirit of Open Source and transparency, we’re happy to share a summary of our budget (all numbers are thousands of Shekels).


    Sponsorship: 246

    Ticket sales: 54

    Total: 300


    Venue (incl. food): 134

    Conf. party (food+movie): 41

    Keynote speakers travel: 30

    Speaker’s dinner: 13

    Video recording & editing: 20

    T-shirts & other swag: 28

    Wireless internet: 5

    Various other: 3

    Total: 274

    As you can see, we ended with a positive balance of close to 26K ILS. This is more than we intended, a miss we attribute to over-cautiousness and inexperience. A small part of this surplus will go to support Hamakor, the Israeli F/OSS association which helped make the conference happen, and the rest will go into the budget of the next PyCon Israel.

    Community organizations

    We’d like to call out three special groups which could use your help — participation as well as sponsorship; groups whose ongoing work enabled this conference and will hopefully enable others like it in the future:


    Since so long has passed, we can also add a look to the future: Preparations for PyCon Israel 2017 have already started! You can join the organizing team, or just keep track of our progress via our different channels -

    Blog: https://medium.com/@pyconil

    Twitter: @pyconil, #pyconil

    YouTube channel: https://www.youtube.com/channel/UC8ApA9ibgkf0XK7lgTVZgEQ

    Facebook: https://www.facebook.com/pyconisrael/

    Google group: https://groups.google.com/forum/#!forum/pycon-israel (requires registration)

    Website: http://il.pycon.org/

    Final words

    Watching the months of preparations come to full fruition made our hearts burst with joy. We’d like to thank everyone involved — all CFP submission authors, the invited and accepted speakers, the sponsors (and in particular the Diamond sponsors, Red Hat & Cymmetria), the vendors (and in particular the helpful staff of our wonderful venue at Yes Planet), the Israeli Python community in general for making such an event possible, and you, the attendees, for making it a reality.

    See you in 2017,

    The PyCon Israel organizing team

    18 October, 2016 07:45 PM

    23 September, 2016

    Yosef Or Boczko

    GNOME 3.22 שוחרר !

    צהריים טובים.

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

    GNOME 3.22 Hebrew

    גרסה זו מכילה 22980 שינויים שנרשמו ב־Git על ידי 775 תורמים, בהשוואה ל־28933 שינויים על ידי 837 תורמים ב־3.20.

    אחוז התרגום עומד על 80% (36912 מחרוזות מתורגמות, 3682 מעורפלות ו־49874 שאינן מתורגמות), בהשוואה ל־80% (36069 מחרוזות מתורגמות, 3702 מעורפלות ו־4937 שאינן מתורגמות) ב־3.20 ו־82% (37120 מחרוזות מתורגמות, 3326 מעורפלות ו־4675 שאינן מתורגמות) ב־3.18.

    על התרגום בעיקר אני אחראי, ולאחרונה הצטרף ניב באר ותרגם את חלק מהתיעוד למשתמש „צעדים חדשים ב־GNOME” (נקרא ‏gnome-getting-started-docs) ואפילו החל לתרגם ליישומים (טרם מצאתי זמן להכניס את התרגומים האחרונים שלו).

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

    כרגיל, אוסיף כאן שיר. שיר יפה, שפשוט נהניתי לנגן על הפסנתר.


    יוסף אור

    23 September, 2016 02:47 PM

    14 August, 2016

    Yosef Or Boczko

    מצב תרגום GNOME – לקראת 3.22

    ערב טוב.

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

    אחוז התרגום עומד על 80% (36915 מחרוזות מתורגמות, 3727 מעורפלות ו־4987 שאינן מתורגמות), בהשוואה ל־80% (36069 מחרוזות מתורגמות, 3702 מעורפלות ו־4937 שאינן מתורגמות) ב־3.20 ו־82% (37120 מחרוזות מתורגמות, 3326 מעורפלות ו־4675 שאינן מתורגמות) ב־3.18.

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

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

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

    ערב טוב,

    יוסף אור


    14 August, 2016 04:05 PM