22.5.17

טיפים לטסט על אמבולנס במד"א


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

הרכב עצמו הוא אוטומט. מוט ההילוכים הוא בהגה ודרכו אפשר לעבור בין המצבים (Drive, Reverse etc).

ההמברקס הוא דוושת הרגל השמאלית.

טיפים

העצות בלשון זכר רק לצורך פשטות.

בתחילת הנסיעה:
אם אתה הראשון, תדליק אורות דרך.

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

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

בנסיעה:
סע לאט, אבל בטוח. 

ציית לתמרורים,

לא לשכוח לאותת,

שמור מרחק, 

אל תקפוץ על פסי האטה, 

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

סע בצד ימין ולא באמצע הכביש,

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

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

חשוב מאוד לראות אם יש תמרור "עצור" ואז חשוב לעצור בפס עצירה ואז לגלוש,

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

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

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

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

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

טסט בחולון

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

איך אמורים לנהוג במעגל תנועה:


דוגמאות לקשיים

- נסיעה אחורנית ברחוב

- פנייה ברחוב צר

- פנייה לכיוון לא נכון לרחוב חד סטרי


21.5.17

yarn fails on permission error


ERROR:

$ yarn

yarn install v0.23.4
[1/4] Resolving packages...
warning Integrity check: Patterns don't match
[2/4] Fetching packages...
error An unexpected error occurred: "EACCES: permission denied, mkdir '/DATA/ads_slave/.yarn-cache/v1/npm-hard-source-webpack-plugin-0.3.12-ba9bf1ce645e83146b4324c068909275997223b5'".

The workaround:

Run 'yarn' using sudo:

$ sudo yarn
[sudo] password for dev: 
yarn install v0.23.4
[1/4] Resolving packages...
warning Integrity check: Patterns don't match
[2/4] Fetching packages...
warning fsevents@1.1.1: The platform "linux" is incompatible with this module.
info "fsevents@1.1.1" is an optional dependency and failed compatibility check. Excluding it from installation.
[3/4] Linking dependencies...
...

15.5.17

Web Assembly - מה זה

מה זה?

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

הסיכום הנ"ל מבוסס על הרצאה בשם WebAssembly: the browser VM we were waiting for של Boyan Mihaylov.

מה זה יאפשר?

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

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

קצת היסטוריה

כדי להבין מה זה Web Assembly כדאי להסתכל קצת על ההיסטוריה של JavaScript.

השפה JavaScript הומצאה ב 10 ימים (!) בשנת 1995 כשפה שיריץ הדפדפן הראשון הרציני שנקרא אז Netscape.

  

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



עם התחזקות המחשבים, נעשה שימוש רב יותר ב JS בדפדפן.

לקראת סוף העשור הראשון של שנות האלפיים, השימוש ב JS התגבר מאוד. אפלקיציות שלמות רצו בעיקר בצד הדפדפן וביצעו קריאות לשרת רק כדי לקבל מידע ולא כדי לקבל דפי HTML שלמים (מה שנקרא AJAX או SPA -   single page applications). דוגמא לאפליקציות כאלה הן GMAIL ו Google Maps.





בהמשך, שפת JS "פלשה" לצד השרת. גוגל שחררה את מנוע ה JavaScript שלה כתוכנה שיכולה לרוץ בשרתים ולהריץ שרת שלם שכתוב ב JS. שם התוכנה - nodejs.



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


ועכשיו "להווה" - asm.js

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

בנוסף, נוצרו תוכנות שקימפלו שפות אחרות לשפת JavaScript! זה איפשר הרצת תוכנות שכבר כתובות בשפה אחרת, על הדפדפן!



asm.js
אז אם זה כבר המצב, למה לא שנקמפל תוכניות בשפת C ל JavaScript ואז נוכל להריץ תוכנות כבדות על הדפדפן. תוכנות כמו משחקים רציניים, תוכנות לעיבוד תמונות ועוד.



בעייה.

JS היא לא יעילה לכתיבת תוכנה עתירת חישובים. הנה רק כמה מהיכולות בשפה שגורמות לאיטיות: יש רק thread יחיד, יש כל הזמן בדיקות בזמן ריצה של סוגי הנתונים (הרי אין types ב JS), יש garbage collection, יש המרה אוטומטית של ערכים - box/unbox אוטומטיים ועוד.

הרעיון שלהם היה שימוש בחלק משפת JS שיוכל לרוץ מהר. כלומר, asm.js הוא קודם כל הוא קוד JS. ושנית כל הוא רק חלק מ JS.

הפתרון לבעית הביצועים בנוי משני חלקים - הכנסת types לשפת JS בצורה שלא פוגעת בתחביר של השפה (בעיקר integer ו float) ושימוש רק בחלקים מהשפה שאפשר לקמפל אותם להרצה מהירה: הורדת garbage collection, הורדת המרה אוטומטית של ערכים וכו.

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

ואכן, כאשר מימשו את כל הרעיונות פה, הצליחו להריץ משחקים "כבדים" על הדפדפן ! הגיעו לביצועים מרשימים. אומנם יותר איטיים מהתוכה המקורית אבל עדיין ברמה מאוד מאוד מרשימה. שם הקומפיילר שמקמפל C++ ל asm.js הוא Emscripten (קישור נוסף עליו)



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

Web Assembly


בקיצור - WASM.

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


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

 בייצוג הטקסטואלי, הקוד כבר מסודר בצורה שהיא קלה לפרסר לקרוא אותו. הנה דוגמא לקוד ב WASM לעומת קוד ב asm.js:



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




מה עוד יש ב wasm?


ב WASM יש דברים שחסרים ב JS כמו multithreaded ו garbage collection.

4.5.17

gnutls_handshake() failed: Access was denied



Error when running apt-get:

sudo apt-get update && sudo apt-get install yarn

gnutls_handshake() failed: Access was denied

The problem:

There is proxy configuration error of apt-get

The fix:

Define proxy for apt-get

1. sudo vim /etc/apt/apt.conf
2. Add line:
 Acquire::http::proxy "http://web-proxy.il.hpecorp.net:8080";

Error: Cannot find module 'enhanced-resolve/lib/NodeJsInputFileSystem'


This is error of webpack.

To solve:


sudo npm install enhanced-resolve

Cannot find module 'enhanced-resolve' [windows 10, yarn] · Issue #3406

7.2.17

Fail to run docker hello world


After docker installed, it is recommended to check it with below command:

sudo docker run hello-world

When it fails to run, it might be a missing proxy configuration. Docker has its own proxy configuration and it does not use http_proxy variable.


Define docker proxy:

Edit etc/systemd/system/docker.service.d/http-proxy.conf and add proxy under [Service] section:

[Service]

Environment="http_proxy=http://PROXY_MACHINE_REAL_NAME:8080" "https_proxy=http://PROXY_MACHINE_REAL_NAME:8080" "no_proxy=127.0.0.1,localhost,mydyumserver"

Docker installation error


When docker installed according https://docs.docker.com/engine/installation/linux/rhel/ there is below error (on some RHEL 7 machines)

Error

Loaded plugins: langpacks, product-id, search-disabled-repos, subscription-
              : manager
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.

You have enabled checking of packages via GPG keys. This is a good thing.
However, you do not have any GPG public keys installed. You need to download
the keys for packages you wish to install and install them.
You can do that by running the command:
    rpm --import public.gpg.key


Alternatively you can specify the url to the key you would like to use
for a repository in the 'gpgkey' option in a repository section and yum
will install it for you.

For more information contact your distribution or package provider.


Problem repository: packages.docker.com_1.12_yum_repo_main_centos_7


The problem

The repository that was added according installation documentation is bad.

Here is the bad command for documentation:

sudo yum-config-manager \ --add-repo \ https://docs.docker.com/engine/installation/linux/repo_files/centos/docker.repo

Solution

Remove the repository and try again.

Delete the description from /etc/yum.conf or the file from /etc/yum.repos.d/

27.12.16

Advanced SQL - Common Table Expression (CTE)



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

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

כולם מכירים את השאילתות "הרגילות".

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

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

הכלי שמאפשר שאילתא רקורסיבית נקרא Common Table Expression או בקיצור CTE. נתחיל מהסבר בסיסי של הכלי ונגיע לשימוש בו לביצוע רקורסיות.

מה זה CTE

בצורה בסיסית, אפשר להגדיר Table Expression לשאילתא בצורה הבאה:

WITH CTE1(Address, Name, Age) --Column names for CTE, which are optional
AS
(
SELECT Addr.Address, Emp.Name, Emp.Age
FROM Address Addr INNER JOIN EMP Emp
ON Emp.id = Addr.id
)
SELECT * FROM CTE1
WHERE CTE1.Age > 50
ORDER BY CTE1.NAME

מה ש SQL יעשה הוא מאוד דומה להגדרת view זמני שחי רק בזמן הרצת השאילתא. כמו בדוגמא הבאה:

CREATE VIEW v AS
(
SELECT Addr.Address, Emp.Name, Emp.Age
FROM Address Addr INNER JOIN EMP Emp
ON Emp.id = Addr.id
)

SELECT * 
FROM v
WHERE CTE1.Age > 50
ORDER BY CTE1.NAME

DROP VIEW v


זה גם מאוד דומה לשימוש בתת שאילתה –

SELECT
FROM
(
SELECT Addr.Address, Emp.Name, Emp.Age
FROM  Address Addr Inner join Employee Emp
ON Emp.id = Addr.id
) Temp
WHERE Temp.Age > 50
ORDER BY Temp.NAME

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

אפשר גם לגדיר מספר CTEs:

WITH CategoryAndNumberOfProducts (CategoryID, CategoryName, NumberOfProducts) AS
(
   SELECT
      CategoryID,
      CategoryName,
      (SELECT COUNT(1) FROM Products p
       WHERE p.CategoryID = c.CategoryID) as NumberOfProducts
   FROM Categories c
),

ProductsOverTenDollars (ProductID, CategoryID, ProductName, UnitPrice) AS
(
   SELECT
      ProductID,
      CategoryID,
      ProductName,
      UnitPrice
   FROM Products p
   WHERE UnitPrice > 10.0
)

SELECT c.CategoryName, c.NumberOfProducts,
      p.ProductName, p.UnitPrice
FROM ProductsOverTenDollars p
   INNER JOIN CategoryAndNumberOfProducts c ON
      p.CategoryID = c.CategoryID

ORDER BY ProductName

אפשר גם להשתמש ב CTE בתוך הגדרה של CTE אחר:

WITH x AS (SELECT * FROM MyTable),
y AS (SELECT * FROM x)
SELECT * 
FROM y


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

כדי לבצע רקורסיה, יש לכתוב שאילתא בצורה הבאה:

WITH DepartmentCTE(DeptId, Department, Parent, Lvl)
AS (
      SELECT id AS DeptId,Department,parent,0 AS Lvl
      FROM Departments
      WHERE parent IS NULL
           
      UNION
           
      SELECT d.id AS DeptId,d.Department,d.parent,DepartmentCTE.Lvl+1 AS Lvl
      FROM Departments d
      INNER JOIN DepartmentCTE ON DepartmentCTE.DeptId = d.parent
)
SELECT *
FROM DepartmentCTE
ORDER BY parent;

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



אז מה אפשר לעשות ברקורסיה

נתחיל מדברים אזוטרים – שימוש ב CTE לחישוב עצרת:

WITH fact as (
      SELECT 1 as fac, 1 as num   -- first line

      UNION

      SELECT fac*(num+1), num+1   -- while loop that work each time on last line
      FROM fact
      WHERE num<12 font="">
)
SELECT fac
FROM fact
WHERE num=5
שימוש ב CTE ליצירת סדרה של מספרים 1 עד 100:

WITH numbers(n) AS
(
SELECT 1 FROM dual
           
UNION
           
SELECT n + 1
FROM numbers
WHERE n < 100
)
SELECT * FROM numbers;

ונעבור לשימושים יותר רציניים - סריקה של עץ עובדים הנשמר בטבלת Employees. כל שורה מכילה מידע על עובד ומזהה של העובד שמנהל אותו.

WITH Employees_CTE AS (      SELECT EmployeeID, ContactID, LoginID, ManagerID, Title, BirthDate      FROM HumanResources.Employee      WHERE ManagerID IS NULL      UNION      SELECT e.EmployeeID, e.ContactID, e.LoginID, e.ManagerID, e.Title, e.BirthDate      FROM HumanResources.Employee e      INNER JOIN Employees_CTE ecte ON ecte.EmployeeID = e.ManagerID
)

SELECT *
FROM Employees_CTE


במאמר הבא יש שימוש ב CTE לפתרון בעייה קלאסית במדעי המחשב – בעיית הסוכן הנוסע : קישור.




20.10.16

elasticsearch - מבוא חלק 3 - חיפוש


איך מבצעים חיפוש ב ElasticSearch - מבוא בסיסי


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

Types

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


לדוגמא: נבנה אינדקס עבור מסעדה ונאנדקס בו תאור של כל המנות תחת type שנקרא dish, נאנדקס מידע על המלצרים תחת type שנקרא waiters ונאנדקס מידע על ספקים תחת type שנקרא supplier.

זה מה שמאפשר לנו אח"כ לחפש מידע מסוג מסויים. נוח!

הכנסת מסמך עם ציון הסוג שלו:

דוגמא:


ובמקרה שרוצים לתת ל ES לקבוע בעצמו את מזהה המסמך:

נחזור לחיפוש

לחיפוש יש שני API-ים שונים.. אחד פשוט ומהיר שמיועד בעיקר לאנשים שרוצים להריץ שאילתא. השני הוא מובנה ומיועד לתוכנית שפונה ל ES.  בשני המקרים צריך לציין איפה לחפש. זאת מציינים בשורת ה URL:

כדי לחפש באינדקס מסויים נרשום בשורת ה URL:
GET /indexName/_search

כדי לחפש בסוג מסויים באינדקס:
GET /indexName/typeName/_search

כדי לחפש בכל האינקסים שמתחילים בתוים מסויימים:
GET /indexPrefix*/_search

ויש עוד אפשרויות שונות.

חיפוש מהיר - query string

בחיפוש מהיר מתארים במחרוזת אחת את השאילתא, מחרוזת אחת כמו שיש למשל ב where של שאילתת SQL. אפשר לרשום את המחרוזת הזאת בשורת ה URL וזה ממש נוח כאשר אדם עובד מול ES ורוצה לבצע חיפושים:


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

הנה דוגמא לביצוע החיפוש המהיר שאינו דרך שורת ה URL וזאת דרך פקודת simple_query_string


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

דוגמא: התנאי name:john +tweet:mary+ אומר שיש למצוא מסמכים שבשדה name מופיעה המילה john ובשדה tweet מופיעה המילה mary. כדי לשים את הביטוי בשורת ה URL צריך לקודד אותו ל %2Bname%3Ajohn+%2Btweet%3Amary.



והנה שורת החיפוש (דוגמא לאתר שיעשה את זה בקלות - http://www.url-encode-decode.com/)


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

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

GET /_search?q=mary

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

דוגמא מורכבת יותר:



חיפוש "מלא" - DSL

שפת החיפוש הקלה שנקראית query-string search או query lite נוחה מאוד לחיפושים אנושיים על ה DB. תוכנית לעומת זו זקוקה ל API מסודר. וזה גם קיים ב ES. בשיטה הזו, משתמשים בפקודה _search ומעבירים בגוף הבקשה תאור של השאילתא דרך json. 

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

הסיבה שב ES בחרו להשתמש ב HTTP GET היא שזה יותר מתאים לפעולה, הרי היא לא משנה כלום בנתונים.

דוגמא לשאילתא:

ודוגמא יותר מורכבת:

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

מה מוזר ושונה בחיפוש

מי שרגיל לעבוד ב SQL אז הוא\היא יגלו שהחיפוש ב ES מתנהג אחרת.

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

דוגמא:




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

דוגמא:



שדה from הוא ה offset של התשובה מהתשובה הראשונה. שדה size מציין כמה מסמכים להביא.

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

דוגמא:



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




הערה: הסיכום מסתמך בעיקר על הספר Elasticsearch - The Definitive Guide

9.10.16

XSS התקפת

התקפת XSS על אפליקציות ווב

התקפת XSS מנצלת את העובדה שאפלקציית ווב משתמשת ב HTML ו JavaScript לרוץ על הדפדפן. 

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

ראשית, XSS הוא ראשי תיבות של Cross Site Scripting. במקומות מסויימים ההתקפה גם נקראית JavaScript injection.


איך זה עובד?

זה כל כך פשוט שזה מדהים. 

התוקף צריך להזריק קוד שלו לתוך דף שהנתקף עלול לגלוש אליו. ברגע שהנתקף ניגש לדף הזה, הקוד של התוקף ירוץ על הדפדפן שלו.

ואיך אפשר "להזריק" קוד? הרי זה נשמע בלתי אפשרי ...  

יותר קל להבין את השיטה דרך דוגמא.

דוגמא:

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

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

להלן דף להזנת הודעה חדשה:


ובדף אחר אפשר לראות את כל ההודעות:



עכשיו התוקף ייכנס לאתר ויזין לשדה הנושא או לשדה ההודעה מחרוזת שמריצה קוד JavaScript (יש להקיף אותו בתגית



מה שיקרה עכשיו הוא שכאשר מישהו ייכנס לדף שמראה את ההודעות, אזי הדפדפן שלו עלול להריץ את הקוד:

למה זה קורה ?

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

דוגמא:


<div>subject string 1</div>
<div>message string 1</div>
<div>subject string 2</div>
<div>message string 2</div>

זה יהפוך ל:



<div>General Discussion</div>
<div>Have something you ….</div>
<div><script src=attackersite ></script></div>
<div><script src=”javascript:Function(v)”></script> </div>


מה אפשר לעשות?
אסור לסמוך שהמשתמש הכניס מחרוזת שאינה מכילה קוד זדוני!

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

עד כמה לנקות?

ניקח לדוגמא את הקלט:

<p style="color:blue">
this is
<em onmouseover="this.textContent='ATTACK!'">click here</em>
attacker code
</p>

יש כמה אפשרויות:

מה עושים
מה יישאר
מה יקרה על המסך
אפשר להוריד כל תגית HTML (התגית והתוכן שלה)
this is attacher code
הטקסט יוצג בצבע ברירת המחדל
אפשר להוריד רק תגיות מסוכנות. זה מאפשר להציג שדה שיש לו עיצוב. דבר שמאוד שכיח בשדות טקסט של הודעה או תאור.
<p style="color:blue"> this is <em >click here</em> attacker code </p>
הטקסט יוצג בצבע שרשום ובעיצוב שרשום ללא onmouseover
אפשר לבצע פעולה שנקראית escaping והיא הופכת כל תו "<" או ">" לייצוג שלו ב HTML
&lt;p style=&quot;color:blue&quot;&gt; this is &lt;em onmouseover=&quot;this.textContent='ATTACK!'&quot;&gt;click here&lt;/em&gt; attacker code &lt;/p&gt;
הטקסט יוצג ממש כמחרוזת HTML אך ללא הפעלת הפעולות (שינוי צבע או פעולת עכבר)
אפשר לסמוך על הקלט (אם בטוחים שבסדר משום מה)
המקור
הטקסט יוצג בעיצוב הדרוש וכאשר לוחצים עם העכבר, יבוצע הקוד

יש לבחור את השיטה שדרושה. דרך אגב, באנגולר יש כבר תמיכה בכל אחת מהשיטות שהוזכרו (ng-bind, שרות $santize ושרות $sce)

וזה היה תאור קצר על התקפת XSS ואיך להתגונן בפניה.