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

23 נובמבר, 2014

ik

Firebird 3.0

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

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

לFirebird יש מספר תחבירי SQL, וחשוב להבין אותם לפני הבנה של התכונות החדשות. סוג התחבירים הם:

DSQL – הם בעצם השאילתות שכותבים ומריצים בצורה דינאמית באמצעות API. המקדם D מייצג את המילה Dynamic.
ESQL – הם בעצם שאילתות עם preprocessor, כאלו שכותבים למשל דרך תוכנה שלנו. ההבדל בינה לבין DSQL היא שבשפה זו משתמשים בפקודה EXEC. הפירוש של המקדם E מייצג את המילה Embedded.
PSQL – השפה שבה כותבים stored procedure וטריגרים. המקדם של P מייצג את המילה Procedural.

בנוסף ישנה שפה בשם DDL – ‏Data Definition Language. זו השפה בה עושים פעולות כדוגמת create table או create database.

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

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

SQL – כלל השפות:

PSQL:

DDL‏:

אבטחה:

פיקוח:

אז מה זה כל הסעיפים האלו ?

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

MERGE INTO Users
   USING User
      ON Users.ID = User.ID

   WHEN MATCHED AND User.Deleted = TRUE THEN
     DELETE

   WHEN MATCHED THEN
      UPDATE SET username=User.username ...

   WHEN NOT MATCHED THEN
      INSERT (username, ...) VALUES (User.username, ...);

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

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

SELECT A, B, C,
       SUM(C) OVER() AS SUMA,
       SUM(C) OVER(ORDER BY A, B) AS SUMB,
       SUM(C) OVER(PARTITION BY A) AS SUMOVER1,
       SUM(C) OVER(PARTITON BY A ORDER BY B) AS SUMOVER2;
+-----+-----+-----+--------+--------+------------+------------+
|  A  |  B  |  C  |  SUMA  |  SUMB  |  SUMOVER1  |  SUMOVER2  |
+-----+-----+-----+--------+--------+------------+------------+
|  1  |  1  | 30  |  141   |   30   |     60     |     30     |
+-----+-----+-----+--------+--------+------------+------------+
|  1  |  1  | 20  |  141   |   50   |     60     |     50     |
+-----+-----+-----+--------+--------+------------+------------+
|  1  |  3  | 10  |  141   |   60   |     60     |     60     |
+-----+-----+-----+--------+--------+------------+------------+
|  2  |  1  | 25  |  141   |   85   |     40     |     25     |
+-----+-----+-----+--------+--------+------------+------------+
|  2  |  2  | 15  |  141   |  100   |     40     |     40     |
+-----+-----+-----+--------+--------+------------+------------+
|  3  |  1  | 41  |  141   |  141   |     41     |     41     |
+-----+-----+-----+--------+--------+------------+------------+

Cursor יציב:
פעם היו מספר בעיות:

1. הוספה אין סופית של רשומות:

insert into t
select * from t;

2. מחיקה של יותר שורות מאשר מה שנדרש:

delete from t
  where id in (select first 1 ID from t)

הסיבה לבעיות האלו היו בגלל הצורה ש DML עבד:
פעולות של insert/update/delete סומנו להתבצע לפני כל דבר אחר.
היתרון בזה הוא בכל שהרשומות יציבות מאוד ולא מושפעות בגלל כתיבת DML עצמו.
אבל יש לזה מספר חסרונות:

היתה לבעיה זו דרך מעקף באמצעות שימוש בSORT עם שאילתת PLAN, אשר יצרה cursor בלתי תלוי ויציב יותר.

דרך הפתרון של Firebird 3 היא על ידי יצירה של undo-log בשביל לראות האם רשומה שונתה על ידי ה cursor:

יתרונות:

החסרונות:

Global Temporary Table – GTT
אלו טבלאות זמניות הנמצאות בזיכרון במקום בדיסק. זה אומר כי גם אם מסד הנתונים הוא לקריאה בלבד, או שזו טרנזקציה לקריאה בלבד, עדיין ניתן לכתוב לטבלה שכזו.
כלומר זה עובד גם עם GT ON COMMIT PRESERVE ROWS וגם ב COMMIT DELETE ROWS כאשר האחרון עובד גם במצב של טרנזאקציה של קריאה בלבד בתוך מסד נתונים לקריאה בלבד.
זה גם מאפשר לבצע rollback מהיר יותר היות ולא צריך יותר לגבות את הרשומות בקריאה ל rollback.
בנוסף לכך, GC על GTT מתבצע מיידית ולא דורש לחכות לבקשות נוספות שיגרמו לו להתבצע.
בנוסף, כל היכולות האלו נכנסו גם לגרסה 2.5.1 של Firebird ולא ייחודיים יותר רק לגרסה 3.0.

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

הדגמה לפונקציה:

create function inc(x int) returns int
as
begin
  return x + 1;
end;

select inc(5) from RDB$DATABASE; -- 6

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

-- package header, declarations only
create or alter package users
as
begin
   procedure extract_user(id int) returns (u int); -- public procedure
end

-- package body - actual implementation
recreate package body users
as
begin
  function valid_user(id int) returns boolean; -- private function
  
   procedure extract_user(id int) returns (u int)
   as 
   begin
   -- ...
   end;

   function valud_user(id int) returns boolean
   as
   begin
    -- ...
   end;
end;

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

create exception ex_with_params 'Error @1 : @2'; -- create exception with two parameters
exception ex_with_params using (1, 'I''m sorry, Dave. I''m afraid I can''t do that.'); -- call the exception with two parameters

שימוש בCursor כמשתנה רשומה:
גרסה 3.0 מאפשרת לנו בעצם להחזיר cursor במצב PSQL:

--- ...
FOR SELECT A, B, C FROM ...
  AS CURSOR C1 -- no INTO clause
DO
BEGIN
   ...
   INSERT INTO ...
   VALUES (C1.A, C1.B, C1.C); -- cursor reference
END

שדה Identity:
בPg, SQLite ו MySQL/MariaDB יש הגדרת שדה שהוא auto increment. שדה שכזה נקרא ב SQL "טהור" שדה identity.
בFirebird, יוצרים עד לגרסה 3 טריגר ו Sequence ואז מחברים בניהם, ובכך יוצרים תמיכה לזה.
לאור ביקוש רב המון שנים, החליטו ליצור תמיכה לסוג ל identity אשר נתמך רק עם numeric ו int על סוגיו:

create table objects (
id integer generated by default as identity primary key,
name varchar(15)
);

insert into objects (name) values (‘Table’);
insert into objects (name) values (‘Book’);
insert into objects (id, name) values (10, ‘Computer’);

select * from objects;
ID           NAME
============ ===============
1             Table
2             Book
10            Computer

טריגר בזמן DDL:
עד גרסה 3.0, היה ניתן ליצור טריגרים רק על מידע. בגרסה החדשה, ניתן ליצור גם טריגרים על אלמנטים שנוצרים ומוגדים כחלק מה DDL.
המידע יושב בטבלה RDB$GET_CONTEXT ומכילה מספר משתנים לקריאה בלבד המוגדרים רק בתוך טריגר השייך ל DDL אשר קיבל את ה namespace של DDL_TRIGGER:

הדגמה לשימוש שכזה:

create exception ex_bad_sp_name 'Name of Procedures must start with ''@1'' : ''@2''';

create trigger trg_sp_create before create procedure
as
declare sp_name varchar(255);
begin
  sp_name = RDB$GET_CONTEXT('DDL_TRIGGER', 'OBJECT_NAME');
  
  if (sp_name not starting 'SP_') then
    exception ex_bad_sp_name using ('SP_', SP_NAME);
end;

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

בFb התמיכה בlinger היא בשניות ומתבצעת בצורה כזו:

alter database set linger to 30; -- will set linger interval to 30 seconds

ניתן לבטל את הגדרות ה linger בצורות הבאות:

-- 1.
alter database drop linger;       -- will make engine do not delay closing given database
-- 2.
alter database set linger to 0;   -- another way to clean linger settings

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

CREATE USER Vlad PASSWORD impaler INACTIVE;
ALTER USER Vlad ACTIVE;
ALTER USER Vlad SET TAGS (id = 1, x = 'abcd');
ALTER USER Vlad SET TAGS (x = 'xyz');
ALTER USER Vlad SET TAGS (DROP x);

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

CREATE TABLE SEC$USERS
(
SEC$USER_NAME    RDB$USER,
SEC$FIRST_NAME   SEC$NAME_PART,
SEC$MIDDLE_NAME  SEC$NAME_PART,
SEC$LAST_NAME    SEC$NAME_PART,
SEC$ACTIVE       RDB$BOOLEAN,
SEC$ADMIN        RDB$BOOLEAN,
SEC$DESCRIPTION  RDB$DESCRIPTION
);
CREATE TABLE SEC$USER_ATTRIBUTES
(
SEC$USER_NAME   RDB$USER,
SEC$KEY         SEC$KEY,
SEC$VALUE       SEC$VALUE
);

תויק תחת:firebird, טכנולוגיה, מסדי נתונים, פיתוח, קהילה, קוד פתוח, תוכנה, תכנות

23 נובמבר, 2014 08:58 AM

22 נובמבר, 2014

Guy Rutenberg

Enabling Compose-Key in GNOME 3.4

For some reason I couldn’t easily find how to enable the compose-key in Gnome 3.4. All the references I’ve found did not match the actual menus and dialogs that I saw on my system. That is including the official GNOME help pages. So I’ve decided to document it here for my future reference.

  1. Go to System Settings->Keyboard Layout.
  2. Select the Layouts tab and click Options.
  3. Under Compose key position, select the key you want to use as the compose-key.

Wikipedia has a nice table summarizing the compose-key sequences.

22 נובמבר, 2014 06:29 PM

Kobi Zamir

mocha ו superagent

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

הטקסט המלא

22 נובמבר, 2014 05:37 PM

jshint ו jscs

jshint ו jscs הן שתי תוכנות עזר ל Node.js. שתיהן עוזרות לזהות שגיאות לפני הפעלת הקוד. jshint נועדה לזהות שגיאות תחביר, שגיאות שיגרמו לקוד לא לרוץ כלל ולהתריע על ארועי שגיאה. jscs נועדה לזהות בעיות שלא יתריעו על שגיאות, אבל יכולות להצביע על שגיאות לוגיות.

הטקסט המלא

22 נובמבר, 2014 05:32 PM

21 נובמבר, 2014

Ilan Shavit

Docker – חלק שלישי

בחלק זה אציג כיצד להתקין את Docker Client במחשב שלי (Linux Mint 17). באתר התוכנה  קיים מדריך להתקנת התוכנה במגוון במרכות הפעלה. החלק הרלוונטי לגבי הוא התקנה לאובונטו 64bit‏ 14.04:

ניתן להתקין שתי גרסאות של Docker: גרסה ישנה (הנמצאת במאגרי אובונטו) או גרסה עדכנית. אני בחרתי להתקין את הגרסה העדכנית:

ב- Linux Mint 17 הקובץ usr/lib/apt/methods/https/ קיים (כלומר apt תומך ב- https url).

ולכן נותר להוסיף את המפתח הציבורי של מאגר docker:

‎‏sudo apt-KEY adv –keyserver hkp://keyserver.ubuntu.com:80 –recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9

 

עתה נוסיף להפצה את מאגר המקור של docker, נרענן את רשימת המקורות ונתקין את החבילות apparmor ו- lxc-docker:

sudo sh -c "echo deb https://get.docker.com/ubuntu docker main > /etc/apt/sources.list.d/docker.list"
sudo apt-get UPDATE
sudo apt-get install apparmor lxc-docker

בדיקת תקינות ההתקנה:

sudo docker -d

sudo docker run -i -t ubuntu /bin/bash
[sudo] password FOR ilan:
Unable TO find image 'ubuntu' locally
ubuntu:latest: The image you are pulling has been verified

511136ea3c5a: Pull complete
d497ad3926c8: Pull complete
ccb62158e970: Pull complete
e791be0477f2: Pull complete
3680052c0f5c: Pull complete
22093c35d77b: Pull complete
5506de2b643b: Pull complete
STATUS: Downloaded newer image FOR ubuntu:latest
root@4c4ff9500418:/#

הפקודה האחרונה לא מצאה את docker container של אובונטו בהתקנה המקומית ולכן יבאה את המרכיבים הדרושים ממאגר docker. ה- prompt שקיבלתי שייך ל- bash שרץ ב- container. ההתקנה בוצעה ועובדת כנדרש!

בפרק הבא: נעמיק את הידע בעבודה עם Docker

 

My Signature

21 נובמבר, 2014 11:00 AM

20 נובמבר, 2014

Ram on Agmon

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

הטקסט המלא

20 נובמבר, 2014 01:28 PM

Lior Kaplan

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

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

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

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

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

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

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


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

20 נובמבר, 2014 06:31 AM

18 נובמבר, 2014

sml

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

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

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

הטקסט המלא

18 נובמבר, 2014 07:27 PM

Artyom Beilis

שעון קיץ בישראל ומחשבים

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

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

בזיון. מרבית הפצות לינוקס לא הספיקו לעדכן את tzdata, למשל לא Debian ולא Ubuntu יציבות קיבלו איזורי זמן נכונים (גם בעדכונים אחרונים), העדכון האחרון של Red Hat גם הוא יצא ממש לא מזמן. כמובן גם Windows לא הספיקו להוציא עדכונים - כך שגם אשתי שלא משתמשת בלינוקס התעוררה עם שעון לא תקין במחשב שלה - והוא תמיד מעודכן אצלה עד לדקה האחרונה.

אני כמובן כבר לא מדבר על יישומים שמנהלים את IANA Time Zone Database בעצמם, יישומים זניחים כמו Java או ICU וכד.

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

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

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

הטקסט המלא

18 נובמבר, 2014 06:02 PM

לשרת את כל אתרי החדשות בארץ בעזרת... CppCMS

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

הפרויקט נקרא ליניקום.

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

מספר מילים על "ליניקום":

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

להלן כמה עובדות מעניינות:

  • ליניקום מבוססת על טכנולוגית CppCMS
  • המערכת משרתת כ־10,000,000 פניות המותאמות למשתמש ביום - קרי כ־115 פניות בשניה.
  • בשעות העמוסות הקצב מגיע לכ־160 פניות בשניה.
  • השרת מייצר תעבורה יוצאת ממוצעת של כ־11 מגאביט בשניה.
  • צריכת זיכרון הכוללת של המערכת (שרת וואב, בסיס נתונים, יישום, מערכת ההפעלה) הוא בסביבות 360MB
  • העומס הממוצע על המעבדים הוא כ-5%
  • השרת רץ על c1.medium instance בודד ב־Amazon EC2

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

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

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

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

הטקסט המלא

18 נובמבר, 2014 06:02 PM

Oz Nahum

Installing Oracle's JAVA on Debian

There are many solutions floating around to install Oracle's JAVA on Debian based systems. Most of them involve too many manual steps. Here is one that does not, and it simply works! ... continue reading...

18 נובמבר, 2014 06:00 PM

Revive and old Smartphone with Cyanogenmod!

I recently installed Cyanogenmod on an old Samsung Galaxy II and I just wanted to share my thoughts. ... continue reading...

18 נובמבר, 2014 06:00 PM

Quick Tip - Tiling Windows manager in Mate-Desktop

Here is how you can achieve Tiling windows management without leaving a full blown Desktop Environment such as Mate-Desktop using x-tile ... continue reading...

18 נובמבר, 2014 06:00 PM

Dell is not serious about Linux

How serious Dell is about Linux? I think it is not that serious, and it is using Ubuntu fans as free advertising platform ... continue reading...

18 נובמבר, 2014 06:00 PM

Git tip - git describe

Earlier I posted a tip how to count commits between tags, this post suggests a better way to do it ... continue reading...

18 נובמבר, 2014 06:00 PM

Git tip - Count commits between tags

Once every N commits I would like to release a new version of pwman3, so here is how to keep a track of this number between releases ... ... continue reading...

18 נובמבר, 2014 06:00 PM

Localizing applications with gettext

I was always interested in how I can add translations to pwman3 or to my little PyGTK tutorial, these are summerizing of my gettext experiences ... continue reading...

18 נובמבר, 2014 06:00 PM

PyGTK CD Ripper Tutorial - Part 7

Part 6 of this tutorial completed the Preferences dialog and introduced gtk.Frames and gtk.Expanders. This part of the tutorial will add some more polish to th UI, introducing icons and completing the About Dialog ... continue reading...

18 נובמבר, 2014 06:00 PM

salt quick tip - changing passwords on multiple clusters

Using salt stack to manage your own private cloud on clusters can ease your life. Here is how you can allow users to update their passwords on multiple Linux hosts. ... continue reading...

18 נובמבר, 2014 06:00 PM

PyGTK CD Ripper Tutorial - Part 6

Part 5 of this tutorial added a gtk.Notebook and other widgets to the Preferences dialog. This part of the tutorial introduces the gtk.Frame and gtk.Expander widgets and completes the Preferences dialog. ... continue reading...

18 נובמבר, 2014 06:00 PM

ik

יחידות בדיקה, כן, לא, אולי

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

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

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

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

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

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

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

יחידות בדיקה (מיד יצעקו הבודקים), לא נועדו לכך, ואני אומר להם כי הם טועים !

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

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

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

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

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

האם בדקת באמצעות ‎ /dev/full האם המערכת שלך יודעת להתמודד עם מצב בו אין מקום יותר לשמור מידע ?
רק השבוע סידרתי את MySQL שהרס טבלה כי מערכת הקבצים הגיעה ל 100% ולא היה מקום לרשום את הרשומה, אז הטבלה נהרסה.

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

יותר מזה, אתה בודק את הקוד שלך על 10,000 רשומות, הלקוח קצה שלך אבל משתמש ב10,500 רשומות, ואז יש איטיות (ב10,499 עדיין אין), איך לא ידעת להוסיף עוד רק 500 רשומות לבדיקה ? זה מה שמנהל מסוים יצעק עליך, לא ?

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

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

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

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

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

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

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

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

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

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

מוגש כחומר למחשבה.


תויק תחת:אירגונים וחברות, טכנולוגיה, פיתוח, קוד פתוח, תוכנה, תכנות Tagged: agile development, programming, software development, unit tests

18 נובמבר, 2014 10:30 AM