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

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

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

סגור לתגובות

CUPCake: Testing the memory board – MCU

My Farnell order arrived with the XMEGA MCUs and I picked up a couple of USBASP programmers off eBay. I needed two; one to use a a hacked-up PDI programmer (instructions here and 3V3 conversion here if necessary) and the other to flash the PDI-supporting firmware to the first programmer.

I wrote some initial code to test out the MCU's connection to the RAM module. It turns out that there is a board issue (impossible to spot from the schematic) where I mistakenly had connected pins 12 and 13 of the XMEGA both to A10 of the memory chip, leaving A11 totally unconnected. Not wanting to loose a bit off the address bus (and limit myself to 32k) or reprint the boards, I sliced the track between pins 12 & 13. This landed up leaving pin 12 not connected and pin 13 connected to A10. I jumpered pin 12 to A11. As A10 and A11 are now switched, I need to compensate for this with a dirty code hack in the XMEGA ram_write() fcn to make sure the addressing works correctly.

addr = (addr & 0xf3ff) | (addr & 0x0800) >> 1 | (addr & 0x0400) << 1;  

Problematic MCU pins 12, 13 connected to A10

In order to test the setup, I wrote a pattern to the internal XMEGA flash which is loaded into RAM on power-on. The MicroPython test script has been extended to check this pattern. Test passed.

I currently have no EEPROM on the board. The XMEGA has 2KB of internal flash memory which I can use for some test code. It's also more than enough for a bootloader if I decide to load the OS off external storage. I could in the future allow the CPU to access the XMEGA and hence the EEPROM and/or external flash through some sort of MEMIO interface but this is not currently planned.

סגור לתגובות

Displaying Google Adsense in MediaWiki

This post shows how to insert code that displays ads in MediaWiki. The proposed methods use hooks instead of modifying the skin. This has two advantages:

  1. No need to modify each skin separately. This allows users to change skins and ads will be presented to them in the same logical place.
  2. It makes upgrades simpler. Hooks reside in LocalSettings.php which isn’t modified by MediaWiki version upgrades, unlike skins.

The examples below show how to insert ads into the header, footer and sidebar of each page. I’ve used the Google Adsense ad-serving code, but it could be easily replaced by the ad-serving code of any other ad network.

Header

We use the SiteNoticeAfter hook to place our ad code directly below the site-notice and above the article header.
header_ad
The following snippet should be added to your LocalSettings.php. You should modify the ad-code between the EOT lines to match yours. A 728x90px leader board fits well and usually has large number of available ads in AdSense.

$wgHooks['SiteNoticeAfter'][] = function(&$siteNotice, $skin) {
        $siteNotice .= <<< EOT
<script async src="http://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<ins class="adsbygoogle"
    style="display:inline-block;width:728px;height:90x"
    data-ad-client="ca-pub-xxxxxxxxxxxxxxxx"
    data-ad-slot="6440411535"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script>
EOT;
        return true;
};

Footer

The SkinAfterContent hook. allows us to display a banner right after the article content.
footer_ad
Most horizontal ads would fit nicely for this location. As before, the ad code goes between the EOT lines. This time, however, we need to wrap it in a <div> to center-align the ad.

$wgHooks['SkinAfterContent'][] = function(&$data, $skin) {
        global $myAdCode;
        $data .= '<div style="text-align:center;">';
        $data .= <<< EOT
<script async src="http://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<ins class="adsbygoogle"
    style="display:inline-block;width:728px;height:90x"
    data-ad-client="ca-pub-xxxxxxxxxxxxxxxx"
    data-ad-slot="6440411535"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script>
EOT;
 
        $data .= '</div>';
        return true;
};

Sidebar

sidebar_ad
Placing an ad in the sidebar, turns out to be a little trickier than the header and the footer. The SkinBuildSidebar allows us to insert ads between the Navigation portal and the ToolBox portal in the sidebar. However there are few caveats:

The first one, is that in the default Vector skin, the portals are collapsible. This may be a nice feature, but I’m not sure having an option to hide ads is such a good idea. Hence we add a little JavaScript snippet that makes the ad portal permanent.

Secondly, each portal in the sidebar has a title. The title of the portal containing the ads will be “Ads”. If your wiki is non-english, you’ll probably want to translate it. To do so, you simply need to create the page MediaWiki:Ads in your wiki and write the translation there.

Thirdly, the sidebar is a too narrow for 160x600px vertical skyscraper, which is the narrowest recommended vertical placement size. You could either use narrower ad size, which as Google AdSense warns have significantly less stock, or increase a bit the size of the sidebar. Increasing the size of the sidebar should be done per skin. For the default vector skin, the can be done by editing the MediaWiki:Vector.css page (creating it if necessary) and adding the following lines:

/* increase Vector sidebar width to accommodate ads */
div#mw-panel { width: 12em; }
div#footer, #mw-head-base, div#content { margin-left: 12em; }
#left-navigation { margin-left: 12em; }

If your wiki is in RTL language, you need to use a modified snippet:

/* increase Vector sidebar width to accommodate ads */
div#mw-panel { width: 12em; }
div#footer, #mw-head-base, div#content { margin-right: 12em; }
#left-navigation { margin-right: 12em; }

Below is the code that needs to be placed in LocalSettings.php. Again, you should replace the ad code between the EOT lines.

$wgHooks['SkinBuildSidebar'][] = function($skin, &$bar) {
        $out = <<< EOT
<script async src="http://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<ins class="adsbygoogle"
    style="display:inline-block;width:160px;height:600x"
    data-ad-client="ca-pub-xxxxxxxxxxxxxxxx"
    data-ad-slot="6440411535"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script>
EOT;
        $out .= "<script>$('#p-Ads').addClass('persistent');</script>";
        $bar['Ads'] = $out;
        return true;
};

The three types of ads can be previewed in this wiki.

סגור לתגובות

סינטרה מודולרית

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

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

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

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

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

אנחנו משתמשים בRack בעצם, היות וכמעט וכל הframeworks עבור בניית מערכות web ברובי משתמשים בו, אנו זקוקים לקובץ קבוע בשם config.ru.

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

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

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

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

למערכת שיצרתי ישנם שני מצבים – מערכת לדיבוג REST, ומערכת "בדיקות" אשר עליה אפשר לבדוק שדברים עובדים, והיא בעיקר על תקן "echo" כלשהו.

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

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

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

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

במקרה הזה, הגדרתי כי במצב של ‎:development משתמשים ב Sinatra::Reloader, אשר מגיע עם Sinatra-Contrib – תת פרוייקט המספק הרבה כלי עזר לדברים שונים.
הסיבה לשימוש ב Reloader הוא לא לאתחל את השרת בכל שינוי שעושים למחלקה של סינטרה, כאשר Reloader מגלה כי התוכן של הקובץ השתנה, הוא גורם ל rack לטעון אותו שוב, וככה אנחנו לא זקוקים לטעינה מחודשת של השרת עצמו.

המערכת שכתבתי, משתמשת ב template בשם haml, למעשה פעם ראשונה אשר אני משתמש בה מרצון. תוכלו למצוא את ה layout.haml שהוא המסגרת הרגילה וכן כרגע קובץ בשם index.haml תחת ספריית view.
ועבור העיצוב, אני משתמש ב Foundation 5, אשר אני אוהב אותה יותר מאשר bootstrap.
עבור Javascript יש גם את jQuery וגם את knockout.js, כאשר אני נעזר גם ב lodash.js למספר דברים פשוטים, והיא מספקת בעצם גרסה שעברה אופטימיזציה ל underscore.

את הקבצים של Foundation, וכל ה Javascript ניתן למצוא תחת public.

דבר אחרון שנשאר לספר עליו הוא שאני משתמש במשהו אשר נקרא puma.
מה זה ?
puma הוא משהו שלוקח את rack וגורם לו להיות שרת לכל דבר ועניין, אשר ניתן לבצע עליו חיבור לשרתי HTTP שונים, כדוגמץ apache או nginx.
החיבור נעשה על ידי הגדרת proxy בשרתים.

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

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


תויק תחת:Ruby, ui, unix, אינטרנט, טיפים וטריקים, טכנולוגיה, לינוקס, פיתוח, קוד פתוח, רשתות, שרתים, תוכנה, תכנות, תקשורת
קטגוריות: Ruby, ui, unix, אינטרנט, טיפים וטריקים, טכנולוגיה, לינוקס, פיתוח, קוד פתוח, רשתות, שרתים, תוכנה, תכנות, תקשורת | סגור לתגובות

Kindle Paperwhite "Unable to Open Item"

Recently, I tried transfering some new ebook to my Kindle Paperwhite (first generation), the books were listed properly. However, when I tried to open them I got
“Unable to Open Item” error, suggesting I re-download the books from Amazon. I tried transferring the files again and again, but it didnt’ help. Some of the books were mobi files while others were “AZW` (which I got from אינדיבוק) and all of them opened fine on my computer.

Finally, I followed an advice from a comment in the KindledFans blog, and converted the files to AZW3 (the original comment suggested mobi but AZW3 works better with Hebrew). After converting, I moved the files to my Kindle and they opened just fine.

סגור לתגובות

Docker – חלק חמישי

בפרק הקודם הדגמתי הרצת שתי פקודות במיכל (באמצעות הפקודה docker run): האחת איפשרה גישה אינטרקטיבית לעבודה עם המיכל ובשניה הרצנו Daemon שסיפק שירות.

כרגע אתמקד בעבודה עם docker client. עבודה עם docker client מאוד פשוטה (באמצעות דגלים וארגומנטים ניתן לשלוט בהוראות ל- Docker Client):

Usage:  [sudo] docker [command] [flags] [arguments] ..

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

$ sudo docker version
[sudo] password FOR ilan:
Client version: 1.3.2
Client API version: 1.15
Go version (client): go1.3.3
Git commit (client): 39fa2fa
OS/Arch (client): linux/amd64
Server version: 1.3.2
Server API version: 1.15
Go version (server): go1.3.3
Git commit (server): 39fa2fa



כדי לקבל עזרה על פקודה מסויימת (נניח attach) נוסיף את הדגל help:

$ sudo docker attach –help

Usage: docker attach [OPTIONS] CONTAINER

Attach TO a running container

  –no-stdin=false    Do not attach STDIN
  –sig-proxy=true    Proxy all received signals to the process (even in non-TTY mode). SIGCHLD, SIGKILL, and SIGSTOP are not proxied.

הערה: כדי לצפות בכל באפשרויות שהפקודה docker תומכת יש להריץ את הפקודה docker בלבד.

הרצת אפליקציית רשת באמצעות docker:

$ sudo docker run -d -P training/webapp python app.py
Unable TO find image 'training/webapp' locally
Pulling repository training/webapp
31fa814ba25a: Download complete
511136ea3c5a: Download complete
f10ebce2c0e1: Download complete
82cdea7ab5b5: Download complete
5dbd9cb5a02f: Download complete
74fe38d11401: Download complete
64523f641a05: Download complete
0e2afc9aad6e: Download complete
e8fc7643ceb1: Download complete
733b0e3dbcee: Download complete
a1feb043c441: Download complete
e12923494f6a: Download complete
a15f98c46748: Download complete
STATUS: Downloaded newer image FOR training/webapp:latest
52d212d850c52cf8553f729ecc0850647d1bb50f274f6ef9316ea19b3d3b7fe5
  • הדגל d- מוכר: האפליקציה במיכל תורץ ברקע ותספק את השירות
  • הדגל p- מציין שיש למפות כל פורט נדרש במיכל ולשייך אותו למיכל הנוכחי
  • מאחר שהמיכל 'training/webapp' לא נמצא במאגר המקומי, הוא הורד מהרשת (Docker Hub). המיכל מכיל סקריפט פייתון פשוט (app.py) שמיישם אפליקצית רשת.



נריץ שוב את הפקודה docker ps (הפעם עם הדגל l- בו נבקש לקבל מידע נוסף על זמן הרצת הסקריפט)

$ sudo docker ps -l
CONTAINER ID  IMAGE  COMMAND  CREATED  STATUS   PORTS NAMES 2d212d850c5  training/webapp:latest  "python app.py"  11 minutes ago   Up 11 minutes  0.0.0.0:49153->5000/tcp  clever_lumiere

הערה: הפורט 49153 בצד הלקוח מופה לפורט 5000 בצד השרת.

נגלוש לכתובת זאת ונקבל את המסך הבא:

webapp1



כדי לצפות בלוגים של השרת נריץ את הפקודה הבאה:

$ sudo docker logs -f clever_lumiere
 * Running ON http://0.0.0.0:5000/
172.17.42.1 - - [07/Dec/2014 03:49:33] "GET / HTTP/1.1" 200 -
172.17.42.1 - - [07/Dec/2014 03:49:34] "GET /favicon.ico HTTP/1.1" 404 -
172.17.42.1 - - [07/Dec/2014 03:50:04] "GET / HTTP/1.1" 200 -
172.17.42.1 - - [07/Dec/2014 03:50:04] "GET /favicon.ico HTTP/1.1" 404 -
172.17.42.1 - - [07/Dec/2014 03:50:04] "GET /favicon.ico HTTP/1.1" 404 -

הערה: הדגל f- גורם ל- docker להתנהג כמו הפקודה tail -f (כלומר להמשיך להאזין ללוגים ולא לצאת מהמשימה בסיום הרצת הפקודה).



כדי לצפות בתהליכים הרצים בתוך המיכל נריץ את הפקודה top:

$ sudo docker top clever_lumiere
UID  PID   PPID  C  STIME  TTY  TIME  CMD
root  23777  1774  0  05:33  ?  00:00:00  python app.py

ניתן להבחין שהפקודה python app.py היא הפקודה היחידה שרצה במיכל.



כדי לעצור את עבודת המיכל נריץ את הפקודה הבאה:

$ sudo docker stop clever_lumiere
clever_lumiere



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

~$ sudo docker start clever_lumiere
clever_lumiere



נריץ שוב את הפקודה pocker ps -l וניראה שהמיכל רץ כבר 41 דקות – כלומר חידשנו את פעולתו.

$ sudo docker ps -l
CONTAINER ID  IMAGE  COMMAND  CREATED  STATUS  PORTS  NAMES
52d212d850c5  training/webapp:latest  "python app.py"  41 minutes ago  Up 50 seconds  0.0.0.0:49154->5000/tcp  clever_lumiere



לעומת זאת הפקודה restart תגרום להפסקת פעולת המיכל וריצתו מחדש (מאפס):

$ sudo docker restart clever_lumiere


כפי שניתן להיווכח:

$ sudo docker ps -l
CONTAINER ID  IMAGE  COMMAND  CREATED  STATUS  PORTS  NAMES
52d212d850c5  training/webapp:latest  "python app.py"  44 minutes ago  Up 2 seconds  0.0.0.0:49155->5000/tcp  clever_lumiere



כדי להסיר את המיכל יש תחילה לעצור אותו (stop) ורק לאחר מכן נוכל להסיר אותו באמצעות בפקודה rm:

$ sudo docker rm clever_lumiere
Error response FROM daemon: You cannot remove a running container. Stop the container before attempting removal OR USE -f
2014/12/07 06:21:14 Error: failed TO remove one OR more containers
ilan@ilan-HP-ProBook-6450b:~$ sudo docker stop clever_lumiere
clever_lumiere
ilan@ilan-HP-ProBook-6450b:~$ sudo docker rm clever_lumiere
clever_lumiere



עד לנקודה זאת תמיד השתמשנו במיכלים מוכנים שהורדנו מ- Docker Hub. בפרק הבא נלמד להכין מיכלים בעצמנו

My Signature
סגור לתגובות

Orchestrator 1.2.9 GA released

Orchestrator 1.2.9 GA has been released. Noteworthy:

  • Added "ReadOnly" (true/false) configuration param. You can have orchestrator completely read-only
  • Added "AuthenticationMethod": "multi": works like BasicAuth (your normal HTTP user+password) only it also accepts the special user called "readonly", which, surprise, can only view and not modify
  • Centralized/serialized most backend database writes (with hundreds/thousands monitored servers it was possible or probable that high concurrency led to too-many-connections openned on the backend database).
  • Fixed evil evil bug that would skip some checks if binary logs were not enabled
  • Better hostname resolve (now also asking MySQL server to resolve hostname; resolving is cached)
  • Pseudo-GTID (read here, here, here) support now considered stable (apart from being tested it has already been put to practice multiple times in production at Outbrain, in different planned and unplanned crash scenarios)

I continue developing orchestrator as free and open source at my new employer, Booking.com.

 

 

סגור לתגובות

Dynamic DNS with CloudFlare

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

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

Get your token

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

You can find your token under your Account page

DNS Record ID

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

e.g

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

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

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

Edit/Update the DNS record

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

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

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

Automate the update process

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

#!/bin/bash

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

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


else
    echo "nothing to do"
    exit 0;
fi

 

סגור לתגובות

Drupal Performance Tip – “I’m too young to die” – know your DB engines

This entry is part 4 of 4 in the series Drupal Performance Tips

In the spirit of the computer video game Doom and its skill levels, we’ll review a few ways you can improve  your Drupal speed performance     and optimize for better results and server response time. These tips that we’ll cover may be at times specific to Drupal 6 versions, although     you can always learn the best practices from these examples and apply them on your own code base.

Doom

Doom skill levels: (easiest first)

1. I’m too young to die

2. Hey, not too rough

3. Hurt me plenty

4. Ultra-violence

5. Nightmare!

  This post is rated “I’m too young too die” difficulty level.

 

Drupal 6 shipped with all tables being MyISAM, and then Drupal 7 changed all that and shipped with all of its tables using the InnoDB database engine. Each one with its own strengths and weaknesses but it’s quite clear that InnoDB will probably perform better for your Drupal site (though it has quite a bit of fine tuning configuration to be tweaked on my.cnf).

Some modules, whether on Drupal 6, or those on Drupal 7 that simply upgraded but didn’t quite review all of their code, might ship with queries like SELECT COUNT() which if you have migrated your tables to InnoDB (or simply using Drupal 7) then this will hinder on database performance. That’s mainly because InnoDB and MyISAM work differently, and where-as this proved as quite a fast responding query being executed on a MyISAM database which uses the main index to store this information, for InnoDB the situation is different and will result in doing a full table scan for the count. Obviously, on an InnoDB configuration running such queries on large tables will result in very poor performance

drupal_perf-5

Note to ponder upon – what about the Views module which uses similar type of COUNT() queries to create the pagination for its views?

The post Drupal Performance Tip – “I’m too young to die” – know your DB engines appeared first on Liran Tal's Enginx.

סגור לתגובות

צריבה של ROM עבור Galaxy S1 i9000 מלינוקס

בפוסט קודם הסברתי על אודות מחיצות באנדרויד. "הקהילה" קוראת לאסופה של ה־images של המחיצות הללו בתור ROM. אין הרבה הסברים באינטרנט שמסבירים איך לצרוב מכשירי Galaxy S i9000 בעברית בלינוקס. אז – מעכשיו יש.

  1. תורידו את ה־ROM־ים המקוריים של החברה המתאימה לכם. אין בעייה גדולה לשים רום של חברה אחרת. אם זה לא עובד, אפשר לצרוב את המודם המתאים. באתר של iAndroid יש קישורים להורדה: http://iandroid.co.il/forum/viewtopic.php?f=42&t=18962
  2. הקבצים שתורידו הם self extracting exe לחלונות. אצלי wine עשה את מלאכתו נאמנה והקבצים שנוצרו וחתימות ה־MD5 הם (קבצי ה־exe הם ממש ישנים, ייתכן ועכשיו יש קבצים עם חתימה שונה, מה שחושב זה קבצי ה־tar שנוצרים מהם):
    82d5a5fffd1fea566aab7fe39522aa2c  I9000.Cellcom.JIJVG.exe
    0cb6ef26ce3076c5b3ffde7cb2ad2a1a  I9000.Partner.JHJVG.exe
    254ef10b0ddacfeabc44cf547082e856  I9000.Pelephone.JJJVB.exe
    eedb05d074db2026b38c8f00ca18f935  Cellcom.JIJVG.tar
    33535d9aff3e39d04b0cc504ac389b51  Pelephone.JJJVB.tar
    7d593eae36a2d5151e6a84454c739827  Partner.JHJVG.tar
  3. עכשיו צריך לפתוח את אחד הקבצים, בתוך ספרייה חדשה (לדוגמה):
     mkdir open-android-firmware
     cd open-android-firmware
     tar xf ../Cellcom.JIJVG.tar
  4. כדי לצרוב צריך גם קובץ pit שמגדיר את מבנה המחיצות. חיפוש ברשת אחר s1_odin_20100512.pit  תניב קובץ שהתחימה שלו היא 1d927b36d2fa807a22e64fc86b445130
  5. צריך גם קובץ שמגדיר dbdatafs, הוא נקרא גם PDA (אין לי שמץ של מושג מה זה). אותו אפשר להוריד מכאן: http://forum.xda-developers.com/showthread.php?t=2184403 החתימה של מה שהורדתי היא 868b81b9e28d30c82a00038d29e65d8c
  6. הצריבה תיעשה על ידי תוכנה heimdall. היא זמינה מהמאגרים החופשיים של דביאן. להתקנה:
     sudo apt install heimdall-flash
  7. אופציונאלי: אני לא אוהב להשתמש ב־root, ולכן הגדרתי חוק udev שהמכשיר יהיה ניתן לתכנות גם בעזרת המשתמש שלי. צריך רק לדאוג שהמשתמש יהיה תחת הקבוצה plugdev ואז החוק הבא יעבוד (זה גם טוב לעבודה מול adb בתור משתמש רגיל, ולכן מומלץ).השורה אחרונה מתאימה לגלקסי, האחרות לנקסוס וואללה, לא זוכר :)
    elcuco@pinky ~ $ cat  /etc/udev/rules.d/51-android.rules 
    SUBSYSTEM=="usb", ATTR{idVendor}=="0bb4", MODE="0666", GROUP="plugdev" 
    SUBSYSTEM=="usb", ATTR{idVendor}=="681c", MODE="0666", GROUP="plugdev" SUBSYSTEM=="usb", ATTR{idVendor}=="04e8", MODE="0666", GROUP="plugdev"
  8. בשלב זה נשים את המכשיר במצב download. תוציאו את המכסה האחורי,ואז תוציאו את הסוללה (פשוט לתת מכה והיא יוצאת). תכניסו מחדש את הסוללה ואז ללחוץ על השילוש הקדוש: מקש הבית, כפתור שמע תחתון וכפתור ההדלקה. על הצג יהיה אנדרויד צהוב.
    המלצה: לא לשים את המכסה אחורי. יהיה יותר קל להוציא את הסוללה ולהתחיל מההתחלה, ואני מבטיח שיהיה צורך בזה :)
  9. כעת פשוט מפעילים את הפקודה הבאה (אני שמרתי אותה בתסריט בשם flash-all.sh)
    heimdall flash --repartition  \
       --pit s1_odin_20100512.pit \
       --FACTORYFS factoryfs.rfs  \    
       --CACHE cache.rfs          \
       --DBDATAFS dbdata.rfs      \
       --IBL+PBL boot.bin         \
       --SBL Sbl.bin              \
       --PARAM param.lfs          \
       --KERNEL zImage            \   
       --MODEM modem.bin
  10. זהו. הצריבה לוקחת כמה דקות ואחרי המכשיר עולה כמו חדש.

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

המלצות נוספות:

  1. אל תנסו את זה בחלונות. צריך להשתמש בתוכנה odin שאין לי מושג מה היא עושה מי כתב אותה. זאת הדלפה של מישהו ואני לא סומך על קוד של מישהו אחר במחשב שלי. התוכנות שיש בלינוקס נבדקו והן קוד פתוח, אני סומך עליהן יותר.
  2. תוודאו את החתימות (md5 במיקרה של מה שאני נותן כאן).
  3. כמה שיותר מהר נסו לשים רום אלטרנטיבי. cyanogenmod הוא בסדר גמור. אני חושב ש־Replicant יהיה יותר טוב – אבל לא בדקתי אישית, והוא לא זמין לכל מכשיר.
  4. על מכשיר ישן זה, לא הייתי ממליץ על gapps כלל. אני השתמשתי ב־FDroid והשלמתי כמה תוכנות עם Aptoid. האחרון מפוקפק משהו… אבל זאת פשרה שאני נאלץ לחיות איתה.
  5. כדי להחליף מודם, יש לשים את המכשיר במצב download ולצרוב בעזרת הפקודה הבאה (את המודם צריך לקחת מהרום המתאים):
    heimdall flash --MODEM modem.bin
  6. אם דילגת על השלב של udev פשוט לשים sudo לפני כל פקודה.

שאלות שנותרו לי ללא מענה:

  1. מה התוכן של dbdata.rfs ומה המטרה של המחיצה הזאת.
  2. מה זה param.lfs.

תזכורת: מחיצות באנדרויד

סגור לתגובות

Perl Maven under 100,000 and above 200,000

Sounds contradicting? I am just celebrating a bit. A few days ago Google Analytics reported that the Perl Maven site started to go over the 200,000 visits/month limit, and two days ago Alexa stared to place the site within the 100,000 most frequently visited sites.

For the full article visit Perl Maven under 100,000 and above 200,000

סגור לתגובות

Tech Tip: Make Jamendo Playback Work in Firefox on Mageia Linux

If you’re having a problem playing Jamendo tracks after pressing the “Listen” button (such as on this page) on Firefox running on Linux, then try to install the packages «gstreamer0.10-plugins-bad gstreamer0.10-plugins-good gstreamer0.10-plugins-ugly gstreamer0.10-mpeg gstreamer0.10-ffmpeg» (relevant to Mageia; try their equivalent in other distributions), restart Firefox and try again. The problem is that Firefox needs extra gstreamer plugins to play proprietary formats in HTML audio and video elements. Cheers!

Licence

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

קטגוריות: firefox, linux, tech, tip | סגור לתגובות

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

לא בדקתי את שאר השירותים שמיקרוסופט מציעה. אני מאמין שתשתיות של חברה צריכות להיות עצמאיות. ז"א, שתשמר לה היכולת לעבור מספק תשתיות אחד לשני. ובנושא התאימות של שירותים בין עננים שונים, לא הייתי מהמר. נראה לי נכון לנהל את הסיפור באמצעות ממשק אחיד, open stack, לדוגמא. ושהוא כבר יעבוד מול ספק הענן. או cloudera manage (במקרה של big data) או אצל צד שלישי, כמו (redis labs – המספקים שירותי ענן על בסיס הנתונים redis, להיט גדול, אגב).

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

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

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

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

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

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

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

האקינג לראוטר, או איך להפוך ראוטר לקוד פתוח

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

מאז לא היו לי אתגרים באמת מעניינים בנושא ההאקינג של מכשירים, עד שרכשתי את WDR4300 של TP-Link והחלטתי שאני לא אוהב את הרעיון שאין לי שליטה על הראוטר שלי.

גיליתי שאני מוגבל, היות ובמדינת ישראל יש הגבלת תדרים על ידי משרד הביטחון (ולא משרד התקשורת) – WTF ?!
אז בגלל זה אני למשל לא הייתי יכול לעדכן את הראוטר לגרסה חדשה יותר של TP-Link, כי אין להם הורדה של גרסה "ישראלית" המגבילה תדרים (מצטער אבל זה הזוי).

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

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

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

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

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

הראוטר של בזק מנתק את ה wifi כל כמה זמן לכמה שניות. כלומר את המכשירים המחוברים אליו.
מדפסת הרשת שלי, משום מה לא עובדת כמו שצריך עם הראוטר הזה, אבל הכי גרוע זה ה TR-069 שיש בראוטר ואני לא יכול לבטל אותו, הוא סוג של back-door  לכל הראוטרים האלו, המאפשרים לבזק לבצע provision מרחוק, אבל מסכנים את הראוטר לחלוטין.

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

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

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

בכל מקרה, אני מאוד נהנה :)


תויק תחת:asterisk, freeswitch, kamailio, OpenMoko, Operating Systems, yate, חומרה, טכנולוגיה, טלפוניה, לינוקס, קוד פתוח, ראוטרים, רשתות, תוכנה Tagged: freeswitch, hardware hacking, kamailio, openwrt, tr-069, wdr4300, wrt, לינוקס, קוד פתוח, רשתות
קטגוריות: Asterisk, Operating Systems, freeswitch, hardware hacking, kamailio, openmoko, openwrt, tr-069, wdr4300, wrt, yate, טכנולוגיה, טלפוניה, לינוקס, קוד פתוח, ראוטרים, רשתות, תוכנה | תגים: | סגור לתגובות

מזלגות נעוצים

בתקופה האחרונה, נעשו מספר פעולות fork לפרויקטים מוכרים, בהם node.js ודביאן.
בנוסף, פרויקט docker מקבל מתחרה, לאחר שחברת CoreOS הודיעה כי לא מקובל עליה הכיון של docker.

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

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

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

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

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

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

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

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

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

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

החברה של CoreOS, רוצים container ומשהו שזו כל ההתמחות שלו, אבל docker מתחיל להיות stack שלם של דברים, והם ממש לא אוהבים את זה, כי בסופו של דבר,זו סוג של תחרות, לא ?

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

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


תויק תחת:Debian, docker, it, javascript, systemd, אירגונים וחברות, לינוקס, פיתוח, קוד פתוח, שרתים, תוכנה, תכנות Tagged: debian, docker, node.js
קטגוריות: Debian, docker, it, javascript, node.js, systemd, אירגונים וחברות, לינוקס, פיתוח, קוד פתוח, שרתים, תוכנה, תכנות | סגור לתגובות

Docker – חלק רביעי

מושג שחשוב להכיר בעבודה עם Docker הוא Docker Hub. מה זה Docker Hub ולמה הוא משמש?

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

ניתן לפתוח חשבון ב- Docker Hub בקישור הבא.

נמשיך כרגע בלימוד מספר פקודות נוספות (בהמשך נחזור ל- Docker Hub)

הרצת פקודות במיכל:

$ sudo docker run ubuntu:14.04 /bin/echo 'Hello world'

הפקודה docker run מריצה פקודה בתוך מיכל. במקרה הנ"ל היא מריצה את הפקודה:
'echo 'Hello World בתוך המיכל ubuntu:14.04. המנוע של Docker מחפש את המיכל במאגר המקומי. אם לא מוצא אותו שם הוא מוריד אותו מ- Docker Hub ומריץ בתוכו את הפקודה. לאחר הרצת הפקודה המיכל מסיים את עבודתו (המיכל פעיל כל עוד הפקודה רצה).

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

$ sudo docker run -t -i ubuntu:14.04 /bin/bash
root@b4698b35bf93:/#

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

 מיכל כמספק שירות (daemon):

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

$ sudo docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"

 d6a45af159c7d66537fb9a71911588153ac2f12f71dc722a683869f2791
$

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

בתגובה לא קיבלנו את המחרוזת Hello World אלא את ה- Container ID של המיכל (מחרוזת ארוכה המספקת מידע על זהות המיכל). מדובר במספר יחודי דרכו נוכל לתקשר עם המיכל.

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

$ sudo docker ps

CONTAINER ID  IMAGE COMMAND CREATED STATUS PORTS NAMES
d6a45af159c7 ubuntu:14.04 "/bin/sh -c 'while t 38 minutes ago Up 38 minutes clever_lalande

הפקודה הנ"ל מחזירה לנו מס' פרטים מעניינים על המיכל:
המספר d6a45af159c7 הוא ה- Container ID (בתצורתו הקצרה יותר). לאחר מכן מופיע שם המיכל שהוא ubuntu:14.04, איזה פקודה רצה, מתי המיכל נוצר, כמה זמן הוא רץ ושם זמני דרכו נתקשר עם המיכל (השם נופק באופן אוטומטי).

המיכל רץ, אך מה הוא בדיוק עושה? האם הוא מבצע את מה שביקשנו ממנו לבצע? כדי לדעת זאת נריץ את הפקודה הבאה:

$ sudo docker logs clever_lalande
hello world
hello world
hello world

הפקודה docker logs מתקשרת עם המיכל ומציגה לנו את ה- stdout שלו. במקרה הזה ההדפסות של hello world.
עתה נעצור את עבודת המיכל באמצעות הפקודה docker stop

$ sudo docker stop  clever_lalande
clever_lalande
$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

המיכל אכן הפסיק עבודתו.

המשך: בחלק הבא

My Signature
סגור לתגובות

1000 קילומטרים באופניים. סיכומים ומסקנות

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

קטגוריות: האח הגדול | סגור לתגובות

מחיצות באנדרואיד

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

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

  1. מחיצת boot. במערכת לינוקס ה־bootloader טוען את הקרנל, שמצידו הוא יעשה mount ל־rootfs ואז יפעיל את ‎/sbin/init . בשנים האחרונות בוני הפצות בונים אל תוך הקרנל initramfs – שהוא rootfs קטן, שממנו עושים pivot_root למערכת האמיתית.
    באנדוירד – ה־rootfs גם בנוי אל תוך הקרנל, אבל אין pivot_root והמערכת של הקרנל היא זאת שזמינה במכשיר. ה־partition הזה הוא למעשה RO, כיוון שב־boot הבא הקרנל יטען את כל המחיצה מחדש. הקרנל כולו יושב במחיצה הזאת. בזמן צריבה היא נקראת kernel, ולא boot, האחרון מכיל bootloader ויש הסברים בנושא בסוף הפוסט.
    דרך אגב – התמונה שאתם רואים באתחול של המכשיר? logo.gif. האניצמיה שאחריה, זה bootanim.
  2. מחיצת system. זאת המערכת של אנדורויד. השכבה הגרפית, וכו'. המחיצה הזאת מכילה גם את כל ה־user space drivers שאנרדרויד משתמשת. אין ממש מודולים, הכל בנוי אל תוך הקרנל. המחיצה הזאת mounted על ידי אחד מתסריטי האתחול אל /system/ בזמן האתחול, במצב RO. אם תשנו את ההרשאות, ותשנו שם קבצים הם ישארו ל־boot הבא, כיוון שהמחיצה הזאת ממופה אל התקן פיזי. במערכות סגורות, ייתכן וה-bootloader יגלה שיש שינוי בחתימה של המחיצה ויסרב לעלות את לינוקס.
  3. מחיצת data. זאת המחיצה שמכילה את ההגדרות של המשתמש, האפליקציות התקנו וכו'. המחיצה הזאת mounted במצב RW. יש ספרייה בעלת הרשאות למשתמש שמתחבר דרך adb במקום /data/local/tmp/.
    כשאתם עושים reset to factory defaults במכשיר, כל מה שעושים הוא לפרמט את המחיצה הזאת.
  4. מחיצת radio. במכשיר יש כמה מעבדים, אחד מהם הוא מעבד עצמאי שמדבר עם המודם. לכל ייצרן יש מודם שונה, אז כדי גוגל יצרו פרוטוקול ו"דרייבר" עבור המערכת הפעלה. היצרן של החומרה צריך לכתוב daemon שמאזין ב־local socket מול המערכת של אנדרואיד ומדבר עם החומרה (המעבד השני). הצד שמדבר מול אנדרואיד תקני ויציב, ומצד שני משתנה בהתאם לחומרה. מילות החיפוש שלכם בגוגל הם rild ו־rilj (המונח האחרון היה בשימוש יותר ב-4.2, עכשיו אני רואה אותו פחות).
    מערכת ההפעלה שמפעילה את המעבד שמדבר מול חומרת הרדיו נמצאת במחיצה הזאת, זאת ה"קושחה" של המודם. שוב, מדובר סה"כ על מערכת הפעלה למעבד armV5 ש"אנדרואיד" טוען בזמן האתחול על המעבד השני (תחשבו משהו בסגנון, grub שטוען את לינוקס).
  5. מחיצת persistent (לא זמינה בכל מכשיר). בעת ייצור של מכשיר צריך לכייל פרמטרים מסויימים יחודיים פר מכשיר. למשל ה־serial number או פרמטרים שיגרמו למודם הספציפי הזה לצריך פחות חשמל (יש הבדלים קטנים שנוצרים כתוצאה מאופן הייצור של המודמים). האתחולים הללו נעשים במפעל ומצריך ציוד מסוייים, וכאשר ניתן לעשות את הכיון בשטח – הוא לוקח זמן. יצרנים שומרים במחיצה זו פרמטרים שמיוצרים פעם אחת במחזור חיים של המכשיר כדי לייעל את זמן האתחול (מאתחלים פעם אחת, שומרים ערכים ופעם הבאה במקום לכייל פשוט כותבים לחומרה את הערכים מהפעם הקודמת).
    המחיצה הזאת mounted R/W אבל רק ל־root יש הרשאות כתיבה אליה. המחיצה הזאת לא מפורמטת בזמן איפוס המכשיר.
  6. מחיצת recovery. מי שהתקין רום של אנדרואיד שיחק עם תוכנה במכשיר שעולה "לפני אנדרואיד". אז זה לא בדיוק נכון… בסה"כ מדובר על קרנל אחר שב־initramfs שלו יש תוכנה שונה.
    בזמן העלייה של המכשיר, ה־boot loader בוחר איזה קרנל להפעיל בעזרת הכפתורים המוזרים שאתם לוחצים בשניות הראשונות של הפעלת המכשיר.
  7. מחיצת cache. הספרייה הזאת היא לשימוש פנימי של אנדוירד. פעם היא שימשה לשמירה של ה־dalvik cache. אני לא יודע בדיוק מה היא עושה בימינו (אני מניח ש־dart שומר שם את ה־binaries שהוא יוצר מהקוד dalvik שאנחנו מקמפלים באקליפס). כמו כן, בזמן האתחול המערכת בודקת האם קובץ מסויים קיים, ואם כן הוא מפעיל את מערכת ה־recovery (ראו סעיף קודם) כדי לעדכן את המערכת.
    אפשר לפרמט את המחיצה הזאת ללא בעייה, התוכן יתמלא באתחול הבא (האתחול יהיה איטי יותר, כיוון שהוא צריך ליצור את המטמון מחדש).
  8. lk (קיצור של little kernel, לא בדיוק מחיצה). במקביל למערכת ה־recovery ל"אנדרואיד" (במובן הרחב מאוד… בשלב זה אפילו לינוקס לא פועל) יש מערכת אחרת שמאפשרת "לצרוב" את המכשיר. זה האנדרואיד הצהוב הזה שאתם רואים שאתם רואים בזמן download mode. מערכת הפעלה זו היא רביעית שיושבת במכשיר (לינוקס ראשון זה ה־recovery, לינוקס שני זה "אנדרואיד" והמערכת שעובדת במודם). היא יודעת לדבר עם ה־USB וכאשר אתם עושים flash בעזרת heimdell זה כאילו שאתם במכשיר ועשים dd אל תוך מחיצה.
  9. pit – רשימת המחיצות. במחשב נורמאלי, רשימת המחיצות נשמרת בתחילת הדיסק, ואז כדי לשנות מחיצות פשוט מפעילים fdisk שקורא כמה סקטורים בתחילת הדיסק. היצרנים של מכשירי arm החליטו לעשות את זה מסובך. אז כדי לעשות את זה במכשירי Galaxy S i9000 משתמשים ב־heimdell כדי לשלוח אל המכשיר את רשימת המחיצות, הרשימה הזאת כתובה ב־pitt file. אפשר למשוך אותו מהמכשיר בעזרת הפקודה
    heimdall download-pit --output blabla.pit

    אפשר למצוא קבצי pit באינטרנט, חפשו את הקובץ s1_odin_20100512.pit ותוודאו שה־md5sum שלו הוא 1d927b36d2fa807a22e64fc86b445130.

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

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

ההבדל בין מכשירי סמסונג ו"שאר העולם" הוא השימוש בפרוטוקול לא תקני עבור הדברים הנמוכים הללו. בשאר המערכות משתמשים ב־fastboot (פרוקוטול דומה לזה של adb). הקוד זמין ב־lk. זה מה שיש בשימוש במכשירי נקסוס.

עריכה:
העירו לי שכותבים אנדרואיד ולא אנדרויד אז לטובת SEO אני תיקנתי את הפוסט הזה.

סגור לתגובות

Perl Maven – November 2014

For the full article visit Perl Maven - November 2014

סגור לתגובות

מצגת ההרצאה על החיים שלי עם tmux ו־vim

tmux עם tmuxinator ו־vim מהווים מרכיב עיקרי בתהליך העבודה שלי.

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

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

המצגת אודות tmux ו־vim במסגרת מפגש PyWeb-IL 40 זמינה בעמוד הרצאות ומצגות.

סגור לתגובות

ISP is blocking port forwarding

הסאגה שלי עם ספק האינטרנט 
אני : שלום אני מנוי שלכם לפני מספר חודשים שידרגתי ל  XX מסל"ש ומזה זמן מה אני רואה שport forwarding לא עובד.
ISP: השירות שרכשת אינו כולל אפשרות לביצוע port forwarding עליך לשלם תוספת תשלום של 35% למחיר החבילה שאתה משלם עבור השירות הזה.
אני: אבל לפני השדרוג ששילמתי פחות היתה לי אפשרות לביצוע pf/
ISP: זו היתה חבילה אחרת.
מספר דברים העציבו אותי בשיחה הזאת :

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

עובר לו חודש ועוד מספר ימים, אני מנצל את ממשק הניהול בשביל להחליף לחבילה ה"מקצועית" מנוי פרטי באינטרנט XX Mb - מקצועי.
מנסה שוב , ונאדה. אני מתקשר לתמיכה הטכנית בה נאמר לי שאני מקבל כתובת מאחורי NAT (כאשר הכתובת אינה נמצאת ב rfc 1918) - אני יודע שיש מחסור בכתובת ipv4 אבל זה כבר מפחיד כי קיימת האפשרות שאני באמת משתף את הכתובת וכל פעם שאישרתי בנתב חיבור מהכתובת הזאת פתחתי פתח לצרות (גילוי נאות חיבור לשרת בדר"כ מתבצע ע"גipsec  /openvpn מרשימת כתובת מותרת).

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

בתקופה זו ניסיתי את מספר פתרונות חלופיים -

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

revese tunnel ב ssh עובד ללא שום בעיה.

openvpn עובד ללא שום בעיה (דורש הגדרה מיוחדת בשביל לחבר רשת מאחורי לקוח לרשת בצד השרת).

עריכה: שאלו אותי בשביל מה כבר צריך p/f מופעל בבית - יש לי ownclowd שעובד מצויין ונותן לי פתרון שקוף לכל הכלים שאני צריך.


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

Drupal Performance Tip – replace views blocks with vanilla blocks

This entry is part 3 of 3 in the series Drupal Performance Tips

In the spirit of the computer video game Doom and its skill levels, we’ll review a few ways you can improve  your Drupal speed performance     and optimize for better results and server response time. These tips that we’ll cover may be at times specific to Drupal 6 versions, although     you can always learn the best practices from these examples and apply them on your own code base.

Doom

Doom skill levels: (easiest first)

1. I’m too young to die

2. Hey, not too rough

3. Hurt me plenty

4. Ultra-violence

5. Nightmare!

  This post is rated “I’m too young too die” difficulty level.

 

When we start out building Drupal websites, we gradually build functionality and a common use case is creating a view, then you might want to create some blocks, very much related to the view, so you create a block view using the Views module. Then you maybe combine it with Panels or Context, it doesn’t really matter, but essentially you’ve been using the UI tools which are for ease of use, and the overhead for that lies in quite a bit of abstraction layer which later may cost in performance. Replacing the quicklinks and help and support blocks that were used in our theme’s sidebar from being a view based block to a simple programmatiaclly created block implementation proved to reduce a sizzling amount of ~200ms to ~2ms of server time spent on doing the same operation. That accounted for about ~200ms of page load time redduction for each page load, as this item was featured in many pages consistently on our theme.


drupal_perf-3

The post Drupal Performance Tip – replace views blocks with vanilla blocks appeared first on Liran Tal's Enginx.

סגור לתגובות

yeoman

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

grunt ו gulp

Grunt ו Gulp הן תוכנות להפעלת מטלות עבור Node.js. בדומה ל GNU Make ו Gradle, הן מיועדיות לבצע מטלות כמו בניה, בדיקה, אריזה והפצה. בשונה מ Make, ובדומה ל Rake ו SCons, המטלות נכתבות באותה שפת תכנות כמו התוכנה הראשית.
סגור לתגובות

שלום btrfs, אולי שנה הבאה

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


 

לאחרונה אני מרגיש שהמחשב שלי ממש, ממש, ממש איטי. דברים כמו aptitude distupgrade לוקחים כמה דקות (משהו כמו 20!) והמחשב מרגיש ממש איטי.

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

http://www.youtube.com/watch?v=-0Xa4bHcJu8

סגור לתגובות

Setup Xdebug for remote debug over SSH

If you have PHP application you need to debug, and there is a firewall between you and the hosting server, One can use SSH to tunnel the traffic from the remote site to the local machine.

This is my notes about how to setup Netbeans with xdebug over ssh.

Setup Xdebug on the remote host

Make sure you have this lines in the xdebug.ini file

zend_extension=xdebug.so
xdebug.remote_enable=1
xdebug.remote_handler=dbgp
xdebug.remote_mode=req
xdebug.remote_host=127.0.0.1
xdebug.remote_port=9000

Usually on a default installation you’ll see only the first line.

Setup Netbeans for using Xdebug

Under the menu 

Tools > Options > PHP > Debugging
  change the default port if needed (e.g if port 9000 which the default is used by another application)

Netbeans-xdebug

Setup the SSH tunel to the remote host

Next we will run a tunnel to allow xdebug to connect back to the local Netbeans.

ssh user@remote-machine -R9000:127.0.0.1:9002

This tells ssh to redirect the remote port 9000 (which is the default port for xdebug) to my local machine into port 9002 (I had some other service running on my machine on port 9000).

The why it works is that Netbeans start a debug session and waits for connection (in my example on port 9002) from xdebug on the remote machines, the remote xdebug is configured to connected to IP 127.0.0.1 over port 9000, which our SSH tunnel will redirect to our local port  9002.

Xdebug Connection work flow

Xdebug Connection work flow Source: http://xdebug.org


Resources

סגור לתגובות

mocha ו superagent

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

Firebird 3.0

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

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

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

  • DSQL
  • ESQL
  • PSQL

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 – כלל השפות:

  • Merge Syntax
  • פונקציות window
  • תמיכה ב regex בביצוע SUBSTRING
  • נכנס סוג נתונים בשם Boolean
  • יכולת לשמור גרסאות עם RDB$RECORD_VERSION
  • cursor יציב

PSQL:

  • פונקציות SQL
  • פרוצדורות
  • טריגרים, פונקציות ופרוצדורות משפות חיצוניות
  • חבילות
  • חריגות עם פרמטרים
  • SQLSTAT במצב של WHEN
  • שימוש ב continue בתוך לולאות.
  • cursor יכול להחזיר התייחסות כמשתנה מסוג רשומה
  • cursor דו כיווני

DDL‏:

  • תמיכה במצב null של עמודה ו domain
  • היכולת לשנות קידוד ברירת המחדל של מסד הנתונים
  • הוספה של Identity Column – המקביל ל serial בPG ו Auto Increment של SQLITE ו MySQL
  • תחביר עבור RECREATE SEQUENCE/GENERATOR
  • טריגרים עבור DDL
  • תמיכה ב DATABASE LINGER

אבטחה:

  • תמיכה database encryption
  • תמיכה מורחבת יותר בהרשאות Object
  • הרשאות לעבודה עם DDL
  • הרשאות ברמת מסד הנתונים
  • תוספות לעבודה עם Roles

פיקוח:

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

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

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:

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

יתרונות:

  • אין צורך יותר ב bookkeeping
  • אין צורך במקום נוסף לשמירה
  • קל יחסית למימוש

החסרונות:

  • הוספה של רשומות יזכו לביקור (למרות ההתעלמות)
  • צריך לקרוא גרסאות ישנות של פעולות של שינוי ומחיקה
  • לא עובד עם SUSPEND הקיים ב PSQL

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:

  • DDL_EVENT – סוג האירוע בתוך ה DDL
  • OBJECT_NAME – שם המטאדאטא של אובייקט
  • SQL_TEXT – שאילתת ה SQL כטקסט שצריכה להתבצע

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

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, טכנולוגיה, מסדי נתונים, פיתוח, קהילה, קוד פתוח, תוכנה, תכנות
קטגוריות: firebird, טכנולוגיה, מסדי נתונים, פיתוח, קהילה, קוד פתוח, תוכנה, תכנות | סגור לתגובות

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.

סגור לתגובות

jshint ו jscs

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

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 &gt; /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
סגור לתגובות

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


תויק תחת:Free Software in Israel, gov.il
סגור לתגובות

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

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

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

לשרת את כל אתרי החדשות בארץ בעזרת… 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 באות לידי ביטוי במלואן. יכולת גדילה גבוהה עם דרישות תחזוקה מינימליות, אמינות גבוהה - האם אלה שמאפשרים לדאוג לצד העסקי בלי לחשוב על בעיות ביצועים אפשריות.

סגור לתגובות

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

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

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

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

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

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

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

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

סגור לתגובות

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...
סגור לתגובות

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...
סגור לתגובות

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...
סגור לתגובות

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...
סגור לתגובות

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...
סגור לתגובות

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...
סגור לתגובות

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...
סגור לתגובות

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...
סגור לתגובות

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...
סגור לתגובות

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...
סגור לתגובות

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

אחד הדברים שהכניס המושג 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
קטגוריות: agile development, programming, software development, unit tests, אירגונים וחברות, טכנולוגיה, פיתוח, קוד פתוח, תוכנה, תכנות | סגור לתגובות

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

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

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

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

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

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

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

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

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

מה שלא הולך בכוח, הולך ביותר כוח.

קטגוריות: האח הגדול | סגור לתגובות

‫ההיסטוריה של אפליקצית הקריאה הנפוצה בישראל‬

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

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

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

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

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

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

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

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

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

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

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

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

 

קטגוריות: ספרים דיגיטליים | סגור לתגובות

תם עידן. מיקרוסופט פותחת את טכנולוגיית dot.net

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

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

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

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

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

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

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

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

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

לינמגזין על הנושא

whatsup מסקרים

 

 

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