-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path7954.rss
358 lines (300 loc) · 37.2 KB
/
7954.rss
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<title>שבוע 10 – יום 1: בונים את wit</title>
<link>https://forums.pythonic.guru/t/10-1-wit/7954</link>
<description># שבוע 10: המוצר wit
## הקדמה
אהלן לכולם וברוכים הבאים לשבוע 10. ברכות על הגעתכם עד לכאן – זה השלב שבו הכיף האמיתי מתחיל :slight_smile:
במהלך השבועות הקרובים, מעכשיו ועד סוף הקורס, פייתון תרד קצת (אבל באמת, רק קצת) מהפוקוס, ונתחיל להתקדם לקראת יצירת מוצרים משלנו.
בשבוע הקרוב נבנה פרויקט פייתון קטן משלנו, ונלמד על כלים לניהול הקוד שלנו, שיאפשרו לנו לשמור גרסאות שונות של הקוד שכתבנו ולעבוד במשותף עם אנשים אחרים.
אני מזכיר שהדינמיקה שארצה ליצור בחלק הזה של הקורס היא קצת שונה.
השתתפו בפורומים, שאלו שאלות מעניינות, עזרו אחד לשני ושתפו פיצ’רים ושימושים מגניבים שמצאתם לחומר שנלמד.
ביחד ניצור קבוצת למידה שבה לכל אחד מכם יש מקום לתרום ולקבל ערך בחזרה.
**אולי יעניין אתכם:** בסוף יחידת הלימוד הזו, אתחיל לאסוף אלי אנשים שהוכיחו את עצמם בתרגולים ומעוניינים להתחיל לתרגל, לבנות פרויקטים ולהשתתף בקבוצות תכנות. היוזמה תיפתח לפי כמות ההיענות, ופרטים לגביה יפורסמו בתום ההרשמה ויגובשו לפי כמות הנרשמים.
### תיאור מוצר
כולנו חווינו מצב, בפעם כזו או אחרת, שבו ערכנו מסמך בצורה לא נכונה או מחקנו קובץ – וממש רצינו להחזירו את הגלגל, לשחזר את המצב הקודם.
היה נפלא לו הייתה לנו תוכנה לניהול ומעקב אחרי גרסאות של התיקייה הזו.
בפקודה אחת היינו יכולים "לקחת תמונה" של המצב הנוכחי של תיקיית העבודה שלנו, וכשעשינו טעות – לשחזר את המצב לקדמותו בלחיצת כפתור.
הפרקים הקרובים יהיו מורכבים מתרגילים, בהם אנחנו הולכים לבנות תוכנה שמאפשרת לנו ליצור "אלבום תמונות" שכזה. כשתסיימו לבנות את התוכנה, תוכלו בעזרת פקודה פשוטה לגבות את התוכן של תיקיות, לעקוב בקלות אחרי השינויים שביצעתם בתיקייה מגרסה לגרסה ולהחזיר את המצב לקדמותו אם עשיתם טעות.
זו תהיה דרך ממש נוחה לגבות את הקוד שלכם, נניח, או להסתכל על התפתחות הפרויקט שלכם מגרסה לגרסה.
## קצת כלים לפני
כאמור, עד סוף היום הנוכחי אנחנו נכתוב תוכנה קצרה, שתהיה הבסיס לתוכנה המורכבת לניהול הנתונים בעזרת wit.
התוכנה תקבל כקלט נתיב של תיקייה קיימת במחשב שלנו, ותיצור שם תיקייה בשם `.wit` (נקודה wit), בה נאחסן "תמונות" שיצרנו (גיבויים של התיקייה).
על הדרך, נכיר את שורת הפקודה שלכם ונלמד כיצד להריץ דרכה פרויקטים שכתבתם בפייתון.
### היכרות עם שורת הפקודה
בתור התחלה, צרו קובץ בשם `hello.py` שמדפיס "Hello World". שמרו אותו במקום נוח במחשב.
כעת נלמד להריץ את הקובץ הזה בעזרת שורת הפקודה במחשב שלכם.
מתכנתים מנוסים משתמשים בסביבה של שורת הפקודה לעיתים קרובות, וזה זמן טוב לעשות איתה היכרות ראשונית.
1. [פתחו את שורת הפקודה](https://www.howtogeek.com/235101/10-ways-to-open-the-command-prompt-in-windows-10/), ובדקו באיזו תיקייה במחשב אתם נמצאים. בתמונה שמופיעה תחת המשפט הזה, נתיב העבודה העכשווי הוא `C:\WINDOWS\system32` (בעגה המקצועית: present working directory או current working directory).
2. נווטו לתיקייה בה נמצא קובץ הפייתון שברצונכם להפעיל. תוכלו לעשות את זה על־ידי הפקודה `cd PATH`, כאשר במקום `PATH` כתבו את התיקייה שאליה אתם רוצים לעבור. `cd` הוא קיצור של change directory. לדוגמה: `cd C:\Users\Yam` יעבור לתיקייה Yam, שנמצאת תחת התיקייה Users, שנמצאת תחת הכונן C.
3. טריק: `cd ..` יעביר אתכם לתיקייה מעל, `cd Yam` יעביר אתכם לתיקייה Yam שנמצאת בתוך נתיב העבודה העכשווי שאתם נמצאים בו.
4. הריצו את קובץ הפייתון שנמצא בתיקייה בעזרת הפקודה `python FILENAME.py`, כאשר במקום `FILENAME.py` כתבו את שם הקובץ [כולל הסיומת שלו](https://www.howtohaven.com/system/show-file-extensions-in-windows-explorer.shtml) (שהיא, כנראה, py). כדי לראות אילו קבצים נמצאים בתיקייה, הקלידו `dir` בחלונות או `ls` ב־Mac/Linux.

**שימו לב**! (חשוב)
אם נרצה להריץ קובץ פייתון שלא נמצא בתיקיית העבודה הנוכחית שלנו (לא עשינו `cd` עד לתיקייה שלו), נצטרך לציין את הנתיב המלא אליו.
תוכלו לעשות את זה באחת משתי דרכים:
1. כתבו ב־cmd את הפקודה `python`, אחריה רווח, ואז תגררו את הקובץ ל־cmd. לחצו <kbd>ENTER</kbd> כדי להריץ.
2. כתבו ב־cmd את הפקודה `python` ואחריה רווח. לכו לקובץ שאתם רוצים להריץ, החזיקו את ה־<kbd>SHIFT</kbd> במקלדת ולחצו עליו בכפתור העכבר הימני. לחצו על "העתק כנתיב" (Copy as path), והדביקו בשורת הפקודה.
### קבלת פרמטרים בתוכנה דרך שורת הפקודה
מסתבר שבעזרת שורת הפקודה נוכל להעביר לתוכנית שלנו קלט.
עד עכשיו, התרגלנו לקבל מהמשתמש קלט באמצעות `input()`, שעוצר את התוכנה וממתין לקלט של המשתמש.
מסתבר ששיטה זו אינה פופולרית במיוחד, כיוון שהמצב שבו התוכנה ממתינה לקלט מהמשתמש מקשה על תוכנות אחרות להתממשק איתה.
לכן הסטנדרט בעולם התוכנות הוא שכמעט לעולם לא מחכים לקלט מהמשתמש – אלא הוא פשוט מעביר אותו בשלב שבו הוא מנסה להריץ את הפקודה.
לדוגמה, הפקודה `ping` שתוכלו להריץ אצלכם בשורת הפקודה, מתקשרת עם כתובת אינטרנט כלשהי ומצפה לקבל תשובה (pong). משתמשים בה הרבה כדי לראות האם יש תקשורת בינינו לבין שירות אחר כלשהו, עם Google לדוגמה.
אם הקלט של הפקודה `ping` היה ממומש בעזרת `input()`, היינו צריכים לכתוב ping, ללחוץ אנטר, ואז לחכות לדיאלוג ששואל אותנו לאיזו כתובת אנחנו רוצים לעשות ping, להקליד אותו, ללחוץ שוב אנטר ולחכות לתשובה.
במקום השיטה הטרחנית הזו, הפקודה `ping` פשוט מקבלת כפרמטר את הכתובת שאליה אנחנו רוצים לשלוח ping. תוכלו לכתוב: `ping www.google.com`, ללחוץ אנטר ולקבל מיד את תוצאות הפקודה.
נממש תוכנה פשוטה שמקבלת כקלט 2 מספרים ומדפיסה את הסכום שלהם:
```python
number1 = int(input())
number2 = int(input())
print(number1 + number2)
```
ועכשיו, נממש את אותה תוכנה, רק שהפעם נקבל את הפרמטרים דרך שורת הפקודה:
```python
import sys
number1 = int(sys.argv[1])
number2 = int(sys.argv[2])
print(number1 + number2)
```
נריץ בעזרת `python FILENAME.py 1 2`: שם התוכנה שאנחנו רוצים להריץ (`python`), שם הקובץ שאנחנו רוצים להריץ (`FILENAME.py`) ואז הקלט שנעביר לתוכנית (הפרמטרים; 1 ו־2).
למסך יודפס המספר 3 והתוכנית תסתיים, בלי צורך באינטרקציה מהמשתמש.
לצורך התוכנה הזו השתמשנו ב־[sys.argv](https://docs.python.org/3/library/sys.html#sys.argv), רשימה שמכילה את כל הפרמטרים שהועברו בפקודת ההרצה של התוכנית. `sys.argv[0]` תמיד יהיה הנתיב שכתבתם אחרי `python` (במקרה של הדוגמה: `FILENAME.py`), ואחריו יבואו שאר הפרמטרים שהוכנסו – במקום 1, 2 וכן הלאה.
#### תרגיל ביניים: זוהר argv
כתבו תוכנה שמחשבת סכום מספרים.
אם לא הועברו לפחות 2 מספרים כפרמטרים, הדפיסו:
> `Usage: python <filename> <param1> <param2> [...]`
אם הועברו לפחות 2 מספרים כפרמטרים, הדפיסו את סכומם.
לדוגמה, עבור: `python calc.py 1 2 3 4 6` הדפיסו 16.
-----
## בונים את התוכנה
### הכנת הסביבה
פיווו, זו הייתה הקדמה ארוכה! הגיע הזמן להתחיל בכתיבת הפרויקט.
נזכיר: במסגרת השיעור היום אנחנו הולכים לבנות תוכנה, שתאפשר לנו "לקחת תמונה" (snapshot) של תיקייה מסוימת כל זמן שנרצה. התוכנה שלנו תנהל את אותן "תמונות" שלקחנו, ותאפשר לנו לחזור למצבים קודמים שבהם הייתה התיקייה.
#### נדגים כיצד התוכנה מצופה לעבוד.
נניח שבתיקייה בשם dir היו הקבצים foo.py ו־bar.py בקובץ foo.py נכתב `print(2 ** 5)` ובקובץ bar.py נכתב `print("Bye!!")`,
"לקחנו תמונה" של התיקייה dir, וקראנו לתמונה הזו בשם השרירותי `initial_save`.
לאט לאט התיקייה השתנתה. בקובץ foo.py כתוב `prink(2 ** 5)` ובקובץ bar.py כתוב `bye!!('print')`.
לקחנו תמונה נוספת של התיקייה dir, והפעם קראנו לתמונה `save_after_changes`.
כעבור זמן, גילינו שהקוד החדש מכיל באגים נוראיים, משל נכתב על ידי מישהו שנרדם על המקלדת.
במקרה כזה, נוכל לבקש מ־`wit` לחזור לגרסה `initial_save`.
אם יום אחד יעלו בנו רגשות נוסטלגיים לתצורה השבורה שבה אנחנו נמצאים, נוכל לבקש לחזור לגרסה `save_after_changes`.
---
באופן כללי, השימוש ב־wit יתבצע ב־3 שלבים:
1. נריץ פקודה שאומרת ל־wit, מערכת ניהול הגרסאות שלנו, שאנחנו רוצים לנהל את גרסאות התיקייה הנוכחית באמצעות wit. נקרא לפקודה הזו `init`.
2. נגיד ל־wit לאילו קבצים אנחנו רוצים שהיא תתייח�� בתוך התיקייה (כדי להמנע מהוספה אוטומטית של קבצים רגישים עם סיסמאות או מידע פרטי, שאנחנו לא בטוח רוצים לגבות). נקרא לפקודה הזו `add`.
3. נבצע את הפעולה של השמירה ("לקחת תמונה"). נקרא לפקודה הזו `commit`.
---
#### נתחיל לממש.
צרו במקום נוח במחשב שלכם את הקובץ `wit.py`.
הוא יהיה הקובץ שבו נרשום את הקוד של הפרויקט שלנו.
בשביל לפשט עניינים, כל הפרויקט שנכתוב ירוכז תחת הקובץ היחיד הזה, אבל אם תרגישו שנכון לפצל אותו אחר כך לקבצים – תרגישו בנוח.
צרו תיקייה נוספת, במקום אחר (על שולחן העבודה, נניח) – כזו שלא יהיה אכפת לכם לאבד את התוכן שלה במסגרת הניסויים שלנו. תוכלו, לדוגמה, להשתמש בתיקיית [שבוע 1](https://github.com/PythonFreeCourse/downloads/blob/master/week1.zip) של הקורס.
זו התיקייה שאותה ננסה לגבות במסגרת הניסויים שלנו.
טיפ: צרו לה גיבוי באופן ידני, בינתיים.
##### תרגיל 2: הפקודה init
פתחו את `wit.py` שיצרתם, והתחילו ביצירת הפונקציה שנקראת `init`. הפקודה הזו תשפיע על [תיקיית העבודה הנוכחית](https://docs.python.org/3/library/os.html#os.getcwd) ותיצור בה את התיקייה `.wit` (עם נקודה בהתחלה).
- בתוך תיקיית `.wit` צרו את התיקייה `images`, שתכיל בעתיד את כל השמירות שהתבצעו.
- בתוך `.wit` צרו גם תיקייה בשם `staging_area`, שתכיל את כל הקבצים שהמשתמש ביקש במפורש לגבות. כרגע התיקייה הזו תהיה ריקה.
דאגו שאם אנחנו רושמים: `python path/to/wit.py init` (כאשר `path/to/wit.py` זה הנתיב ל־`wit.py`), תופעל הפונקציה `init` על [תיקיית העבודה הנוכחית](https://docs.python.org/3/library/os.html#os.getcwd).
##### תרגיל 3: הפקודה add
הפונקציה `add` תקבל פרמטר – שם של קובץ או של תיקייה, ותוסיף לתיקייה `staging_area` את הקובץ, או את כל הקבצים שנמצאים תחת התיקייה שהתקבלה כפרמטר.
נראה כמה דוגמאות עבור התיקייה `Etztrubal`, שתכולתה משורטטת לפנינו כעץ:
```
| Etztrubal
├── .wit
│ ├── images
│ └── staging_area
├── dev_requirements.txt
├── Dockerfile
├── LICENSE
├── lms
│ ├── app.py
│ ├── extractors
│ │ ├── base.py
│ │ ├── __init__.py
│ │ ├── notebook.py
│ │ ├── pyfile.py
│ │ └── ziparchive.py
│ ├── __init__.py
│ ├── lmsdb
│ │ ├── bootstrap.py
│ │ ├── database_config.py
│ │ ├── __init__.py
└── └── └── models.py
```
1. אם, בעודנו נמצאים בתיקייה Etztrubal, אנחנו נעשה add ל־`dev_requirements.txt` – לתיקייה staging_area יתווסף הקובץ `dev_requirements.txt`.
2. אם, בעודנו נמצאים בתיקייה Etztrubal, אנחנו נעשה add ל־`lms/lmsdb` – בתיקייה staging_area תווצר התיקייה lms, תחתיה התיקייה lmsdb, והקבצים `bootstrap.py`, `database_config.py`, `__init__.py` ו־`models.py` יועתקו אליה.
3. אם, בעודנו נמצאים בתיקייה `lms` אנחנו נעשה add ל־`extractors`, תחת `Etztrubal/.wit/staging_area/lms` תצורף התיקייה `extractors`, ובה יופיעו הקבצים `base.py`, `__init__.py`, `notebook.py`, `pyfile.py` ו־`ziparchive.py`.
בקצרה: כל פעם שנבצע את פעולת add על קובץ, נחפש את תיקיית העל הקרובה ביותר בה יש קובץ `.wit`, וממנה נגזור את הנתיב היחסי לקובץ שעליו התבצעה הפקודה `add`. בתוך תיקיית `staging_area` ניצור שכפול של התיקייה המקורית עבור כל הקבצים שעליהם עשינו add.
אם עשינו add על תיקייה, נצרף ל־`.wit` על כל הקבצים שבתיקייה, ועל כל הקבצים שבתתי התיקיות וכן הלאה.
אם אין תיקיית `.wit` באף תיקיית־על, זרקו שגיאה מתאימה.
דאגו שאם אנחנו רושמים: `python path/to/wit.py add path2` (כאשר `path/to/wit.py` זה הנתיב ל־`wit.py`), תופעל הפונקציה `add` על ה־`path2`, כשאתם מתייחסים לנתיב ביחס ל[תיקיית העבודה הנוכחית](https://docs.python.org/3/library/os.html#os.getcwd).
**עדכון חשוב לתרגיל wit add**: בעקבות הרבה בלבול בהגשות, עיינו בבקשה בביאור לגבי איך wit add אמור לעבוד – https://forums.pythonic.guru/t/add/8023
-------------
המשך יבוא ביום 2 :slight_smile:
יכולים לדמיין מה הולכות להיות הפקודות הבאות שתממשו?
-------------
אני מודע שיש במחברת הזו הרבה מאוד חומר חדש ולא טריוויאלי.
תרגישו בנוח לפתוח אשכולות ולהתייעץ על איך דברים אמורים לעבוד, אשמח לראות דיונים על החומר!</description>
<language>he</language>
<lastBuildDate>Sun, 30 Aug 2020 15:48:46 +0000</lastBuildDate>
<category>אשכולות הנהלה</category>
<atom:link href="https://forums.pythonic.guru/t/10-1-wit/7954.rss" rel="self" type="application/rss+xml" />
<item>
<title>שבוע 10 – יום 1: בונים את wit</title>
<dc:creator><![CDATA[Yam]]></dc:creator>
<description><![CDATA[
<h1>שבוע 10: המוצר wit</h1>
<h2>הקדמה</h2>
<p>אהלן לכולם וברוכים הבאים לשבוע 10. ברכות על הגעתכם עד לכאן – זה השלב שבו הכיף האמיתי מתחיל <img src="https://forums.pythonic.guru/images/emoji/twitter/slight_smile.png?v=9" title=":slight_smile:" class="emoji" alt=":slight_smile:"><br>
במהלך השבועות הקרובים, מעכשיו ועד סוף הקורס, פייתון תרד קצת (אבל באמת, רק קצת) מהפוקוס, ונתחיל להתקדם לקראת יצירת מוצרים משלנו.</p>
<p>בשבוע הקרוב נבנה פרויקט פייתון קטן משלנו, ונלמד על כלים לניהול הקוד שלנו, שיאפשרו לנו לשמור גרסאות שונות של הקוד שכתבנו ולעבוד במשותף עם אנשים אחרים.</p>
<p>אני מזכיר שהדינמיקה שארצה ליצור בחלק הזה של הקורס היא קצת שונה.<br>
השתתפו בפורומים, שאלו שאלות מעניינות, עזרו אחד לשני ושתפו פיצ’רים ושימושים מגניבים שמצאתם לחומר שנלמד.<br>
ביחד ניצור קבוצת למידה שבה לכל אחד מכם יש מקום לתרום ולקבל ערך בחזרה.</p>
<p><strong>אולי יעניין אתכם:</strong> בסוף יחידת הלימוד הזו, אתחיל לאסוף אלי אנשים שהוכיחו את עצמם בתרגולים ומעוניינים להתחיל לתרגל, לבנות פרויקטים ולהשתתף בקבוצות תכנות. היוזמה תיפתח לפי כמות ההיענות, ופרטים לגביה יפורסמו בתום ההרשמה ויגובשו לפי כמות הנרשמים.</p>
<h3>תיאור מוצר</h3>
<p>כולנו חווינו מצב, בפעם כזו או אחרת, שבו ערכנו מסמך בצורה לא נכונה או מחקנו קובץ – וממש רצינו להחזירו את הגלגל, לשחזר את המצב הקודם.<br>
היה נפלא לו הייתה לנו תוכנה לניהול ומעקב אחרי גרסאות של התיקייה הזו.<br>
בפקודה אחת ה��ינו יכולים “לקחת תמונה” של המצב הנוכחי של תיקיית העבודה שלנו, וכשעשינו טעות – לשחזר את המצב לקדמותו בלחיצת כפתור.</p>
<p>הפרקים הקרובים יהיו מורכבים מתרגילים, בהם אנחנו הולכים לבנות תוכנה שמאפשרת לנו ליצור “אלבום תמונות” שכזה. כשתסיימו לבנות את התוכנה, תוכלו בעזרת פקודה פשוטה לגבות את התוכן של תיקיות, לעקוב בקלות אחרי השינויים שביצעתם בתיקייה מגרסה לגרסה ולהחזיר את המצב לקדמותו אם עשיתם טעות.<br>
זו תהיה דרך ממש נוחה לגבות את הקוד שלכם, נניח, או להסתכל על התפתחות הפרויקט שלכם מגרסה לגרסה.</p>
<h2>קצת כלים לפני</h2>
<p>כאמור, עד סוף היום הנוכחי אנחנו נכתוב תוכנה קצרה, שתהיה הבסיס לתוכנה המורכבת לניהול הנתונים בעזרת wit.<br>
התוכנה תקבל כקלט נתיב של תיקייה קיימת במחשב שלנו, ותיצור שם תיקייה בשם <code>.wit</code> (נקודה wit), בה נאחסן “תמונות” שיצרנו (גיבויים של התיקייה).<br>
על הדרך, נכיר את שורת הפקודה שלכם ונלמד כיצד להריץ דרכה פרויקטים שכתבתם בפייתון.</p>
<h3>היכרות עם שורת הפקודה</h3>
<p>בתור התחלה, צרו קובץ בשם <code>hello.py</code> שמדפיס “Hello World”. שמרו אותו במקום נוח במחשב.</p>
<p>כעת נלמד להריץ את הקובץ הזה בעזרת שורת הפקודה במחשב שלכם.<br>
מתכנתים מנוסים משתמשים בסביבה של שורת הפקודה לעיתים קרובות, וזה זמן טוב לעשות איתה היכרות ראשונית.</p>
<ol>
<li>
<a href="https://www.howtogeek.com/235101/10-ways-to-open-the-command-prompt-in-windows-10/">פתחו את שורת הפקודה</a>, ובדקו באיזו תיקייה במחשב אתם נמצאים. בתמונה שמופיעה תחת המשפט הזה, נתיב העבודה העכשווי הוא <code>C:\WINDOWS\system32</code> (בעגה המקצועית: present working directory או current working directory).</li>
<li>נווטו לתיקייה בה נמצא קובץ הפייתון שברצונכם להפעיל. תוכלו לעשות את זה על־ידי הפקודה <code>cd PATH</code>, כאשר במקום <code>PATH</code> כתבו את התיקייה שאליה אתם רוצים לעבור. <code>cd</code> הוא קיצור של change directory. לדוגמה: <code>cd C:\Users\Yam</code> יעבור לתיקייה Yam, שנמצאת תחת התיקייה Users, שנמצאת תחת הכונן C.</li>
<li>טריק: <code>cd ..</code> יעביר אתכם לתיקייה מעל, <code>cd Yam</code> יעביר אתכם לתיקייה Yam שנמצאת בתוך נתיב העבודה העכשווי שאתם נמצאים בו.</li>
<li>הריצו את קובץ הפייתון שנמצא בתיקייה בעזרת הפקודה <code>python FILENAME.py</code>, כאשר במקום <code>FILENAME.py</code> כתבו את שם הקובץ <a href="https://www.howtohaven.com/system/show-file-extensions-in-windows-explorer.shtml">כולל הסיומת שלו</a> (שהיא, כנראה, py). כדי לראות אילו קבצים ��מצאים בתיקייה, הקלידו <code>dir</code> בחלונות או <code>ls</code> ב־Mac/Linux.</li>
</ol>
<p><img src="https://forums.pythonic.guru/uploads/default/original/2X/9/9f717102e65a2745e2e9d9330daef49d87ff12c1.png" alt="image" data-base62-sha1="mKuXPpHq6JTAajs302rxRX5blW9" width="484" height="213"></p>
<p><strong>שימו לב</strong>! (חשוב)<br>
אם נרצה להריץ קובץ פייתון שלא נמצא בתיקיית העבודה הנוכחית שלנו (לא עשינו <code>cd</code> עד לתיקייה שלו), נצטרך לציין את הנתיב המלא אליו.<br>
תוכלו לעשות את זה באחת משתי דרכים:</p>
<ol>
<li>כתבו ב־cmd את הפקודה <code>python</code>, אחריה רווח, ואז תגררו את הקובץ ל־cmd. לחצו <kbd>ENTER</kbd> כדי להריץ.</li>
<li>כתבו ב־cmd את הפקודה <code>python</code> ואחריה רווח. לכו לקובץ שאתם רוצים להריץ, החזיקו את ה־<kbd>SHIFT</kbd> במקלדת ולחצו עליו בכפתור העכבר הימני. לחצו על “העתק כנתיב” (Copy as path), והדביקו בשורת הפקודה.</li>
</ol>
<h3>קבלת פרמטרים בתוכנה דרך שורת הפקודה</h3>
<p>מסתבר שבעזרת שורת הפקודה נוכל להעביר לתוכנית שלנו קלט.</p>
<p>עד עכשיו, התרגלנו לקבל מהמשתמש קלט באמצעות <code>input()</code>, שעוצר את התוכנה וממתין לקלט של המשתמש.<br>
מסתבר ששיטה זו אינה פופולרית במיוחד, כיוון שהמצב שבו התוכנה ממתינה לקלט מהמשתמש מקשה על תוכנות אחרות להתממשק איתה.<br>
לכן הסטנדרט בעולם התוכנות הוא שכמעט לעולם לא מחכים לקלט מהמשתמש – אלא הוא פשוט מעביר אותו בשלב שבו הוא מנסה להריץ את הפקודה.</p>
<p>לדוגמה, הפקודה <code>ping</code> שתוכלו להריץ אצלכם בשורת הפקודה, מתקשרת עם כתובת אינטרנט כלשהי ומצפה לקבל תשובה (pong). משתמשים בה הרבה כדי לראות האם יש תקשורת בינינו לבין שירות אחר כלשהו, עם Google לדוגמה.<br>
אם הקלט של הפקודה <code>ping</code> היה ממומש בעזרת <code>input()</code>, היינו צריכים לכתוב ping, ללחוץ אנטר, ואז לחכות לדיאלוג ששואל אותנו לאיזו כתובת אנחנו רוצים לעשות ping, להקליד אותו, ללחוץ שוב אנטר ולחכות לתשובה.<br>
במקום השיטה הטרחנית הזו, הפקודה <code>ping</code> פשוט מקבלת כפרמטר את הכתובת שאליה אנחנו רוצים לשלוח ping. תוכלו לכתוב: <code>ping www.google.com</code>, ללחוץ אנטר ולקבל מיד את תוצאות הפקודה.</p>
<p>נממש תוכנה פשוטה שמקבלת כקלט 2 מספרים ומדפיסה את הסכום שלהם:</p>
<pre><code class="lang-python">number1 = int(input())
number2 = int(input())
print(number1 + number2)
</code></pre>
<p>ועכשיו, נממש את אותה תוכנה, רק שהפעם נקבל את הפרמטרים דרך שורת הפקודה:</p>
<pre><code class="lang-python">import sys
number1 = int(sys.argv[1])
number2 = int(sys.argv[2])
print(number1 + number2)
</code></pre>
<p>נריץ בעזרת <code>python FILENAME.py 1 2</code>: שם התוכנה שאנחנו רוצים להריץ (<code>python</code>), שם הקובץ שאנחנו רוצים להריץ (<code>FILENAME.py</code>) ואז הקלט שנעביר לתוכנית (הפרמטרים; 1 ו־2).<br>
למסך יודפס המספר 3 והתוכנית תסתיים, בלי צורך באינטרקציה מהמשתמש.<br>
לצורך התוכנה הזו השתמשנו ב־<a href="https://docs.python.org/3/library/sys.html#sys.argv">sys.argv</a>, רשימה שמכילה את כל הפרמטרים שהועברו בפקודת ההרצה של התוכנית. <code>sys.argv[0]</code> תמיד יהיה הנתיב שכתבתם אחרי <code>python</code> (במקרה של הדוגמה: <code>FILENAME.py</code>), ואחריו יבואו שאר הפרמטרים שהוכנסו – במקום 1, 2 וכן הלאה.</p>
<h4>תרגיל ביניים: זוהר argv</h4>
<p>כתבו תוכנה שמחשבת סכום מספרים.<br>
אם לא הועברו לפחות 2 מספרים כפרמטרים, הדפיסו:</p>
<blockquote>
<p><code>Usage: python <filename> <param1> <param2> [...]</code></p>
</blockquote>
<p>אם הועברו לפחות 2 מספרים כפרמטרים, הדפיסו את סכומם.<br>
לדוגמה, עבור: <code>python calc.py 1 2 3 4 6</code> הדפיסו 16.</p>
<hr>
<h2>בונים את התוכנה</h2>
<h3>הכנת הסביבה</h3>
<p>פיווו, זו הייתה הקדמה ארוכה! הגיע הזמן להתחיל בכתיבת הפרויקט.<br>
נזכיר: במסגרת השיעור היום אנחנו הולכים לבנות תוכנה, שתאפשר לנו “לקחת תמונה” (snapshot) של תיקייה מסוימת כל זמן שנרצה. התוכנה שלנו תנהל את אותן “תמונות” שלקחנו, ותאפשר לנו לחזור למצבים קודמים שבהם הייתה התיקייה.</p>
<h4>נדגים כיצד התוכנה מצופה לעבוד.</h4>
<p>נניח שבתיקייה בשם dir היו הקבצים foo.py ו־bar.py בקובץ foo.py נכתב <code>print(2 ** 5)</code> ובקובץ bar.py נכתב <code>print("Bye!!")</code>,<br>
“לקחנו תמונה” של התיקייה dir, וקראנו לתמונה הזו בשם השרירותי <code>initial_save</code>.<br>
לאט לאט התיקייה השתנתה. בקובץ foo.py כתוב <code>prink(2 ** 5)</code> ובקובץ bar.py כתוב <code>bye!!('print')</code>.<br>
לקחנו תמונה נוספת של התיקייה dir, והפעם קראנו לתמונה <code>save_after_changes</code>.</p>
<p>כעבור זמן, גילינו שהקוד החדש מכיל באגים נוראיים, משל נכתב על ידי מישהו שנרדם על המקלדת.<br>
במקרה כזה, נוכל לבקש מ־<code>wit</code> לחזור לגרסה <code>initial_save</code>.<br>
אם יום אחד יעלו בנו רגשות נוסטלגיים לתצורה השבורה שבה אנחנו נמצאים, נוכל לבקש לחזור לגרסה <code>save_after_changes</code>.</p>
<hr>
<p>באופן כללי, השימוש ב־wit ית��צע ב־3 שלבים:</p>
<ol>
<li>נריץ פקודה שאומרת ל־wit, מערכת ניהול הגרסאות שלנו, שאנחנו רוצים לנהל את גרסאות התיקייה הנוכחית באמצעות wit. נקרא לפקודה הזו <code>init</code>.</li>
<li>נגיד ל־wit לאילו קבצים אנחנו רוצים שהיא תתייחס בתוך התיקייה (כדי להמנע מהוספה אוטומטית של קבצים רגישים עם סיסמאות או מידע פרטי, שאנחנו לא בטוח רוצים לגבות). נקרא לפקודה הזו <code>add</code>.</li>
<li>נבצע את הפעולה של השמירה (“לקחת תמונה”). נקרא לפקודה הזו <code>commit</code>.</li>
</ol>
<hr>
<h4>נתחיל לממש.</h4>
<p>צרו במקום נוח במחשב שלכם את הקובץ <code>wit.py</code>.<br>
הוא יהיה הקובץ שבו נרשום את הקוד של הפרויקט שלנו.<br>
בשביל לפשט עניינים, כל הפרויקט שנכתוב ירוכז תחת הקובץ היחיד הזה, אבל אם תרגישו שנכון לפצל אותו אחר כך לקבצים – תרגישו בנוח.</p>
<p>צרו תיקייה נוספת, במקום אחר (על שולחן העבודה, נניח) – כזו שלא יהיה אכפת לכם לאבד את התוכן שלה במסגרת הניסויים שלנו. תוכלו, לדוגמה, להשתמש בתיקיית <a href="https://github.com/PythonFreeCourse/downloads/blob/master/week1.zip">שבוע 1</a> של הקורס.<br>
זו התיקייה שאותה ננסה לגבות במסגרת הניסויים שלנו.<br>
טיפ: צרו לה גיבוי באופן ידני, בינתיים.</p>
<h5>תרגיל 2: הפקודה init</h5>
<p>פתחו את <code>wit.py</code> שיצרתם, והתחילו ביצירת הפונקציה שנקראת <code>init</code>. הפקודה הזו תשפיע על <a href="https://docs.python.org/3/library/os.html#os.getcwd">תיקיית העבודה הנוכחית</a> ותיצור בה את התיקייה <code>.wit</code> (עם נקודה בהתחלה).</p>
<ul>
<li>בתוך תיקיית <code>.wit</code> צרו את התיקייה <code>images</code>, שתכיל בעתיד את כל השמירות שהתבצעו.</li>
<li>בתוך <code>.wit</code> צרו גם תיקייה בשם <code>staging_area</code>, שתכיל את כל הקבצים שהמשתמש ביקש במפורש לגבות. כרגע התיקייה הזו תהיה ריקה.</li>
</ul>
<p>דאגו שאם אנחנו רושמים: <code>python path/to/wit.py init</code> (כאשר <code>path/to/wit.py</code> זה הנתיב ל־<code>wit.py</code>), תופעל הפונקציה <code>init</code> על <a href="https://docs.python.org/3/library/os.html#os.getcwd">תיקיית העבודה הנוכחית</a>.</p>
<h5>תרגיל 3: הפקודה add</h5>
<p>הפונקציה <code>add</code> תקבל פרמטר – שם של קובץ או של תיקייה, ותוסיף לתיקייה <code>staging_area</code> את הקובץ, או את כל הקבצים שנמצאים תחת התיקייה שהתקבלה כפרמטר.</p>
<p>נראה כמה דוגמאות עבור התיקייה <code>Etztrubal</code>, שתכולתה משורטטת לפנינו כעץ:</p>
<pre><code class="lang-auto">| Etztrubal
├── .wit
│ ├── images
│ └── staging_area
├── dev_requirements.txt
├── Dockerfile
├── LICENSE
├── lms
│ ├── app.py
│ ├── extractors
│ │ ├── base.py
│ │ ├── __init__.py
│ │ ├── notebook.py
│ │ ├── pyfile.py
│ │ └── ziparchive.py
│ ├── __init__.py
│ ├── lmsdb
│ │ ├── bootstrap.py
│ │ ├── database_config.py
│ │ ├── __init__.py
└── └── └── models.py
</code></pre>
<ol>
<li>אם, בעודנו נמצאים בתיקייה Etztrubal, אנחנו נעשה add ל־<code>dev_requirements.txt</code> – לתיקייה staging_area יתווסף הקובץ <code>dev_requirements.txt</code>.</li>
<li>אם, בעודנו נמצאים בתיקייה Etztrubal, אנחנו נעשה add ל־<code>lms/lmsdb</code> – בתיקייה staging_area תווצר התיקייה lms, תחתיה התיקייה lmsdb, והקבצים <code>bootstrap.py</code>, <code>database_config.py</code>, <code>__init__.py</code> ו־<code>models.py</code> יועתקו אליה.</li>
<li>אם, בעודנו נמצאים בתיקייה <code>lms</code> אנחנו נעשה add ל־<code>extractors</code>, תחת <code>Etztrubal/.wit/staging_area/lms</code> תצורף התיקייה <code>extractors</code>, ובה יופיעו הקבצים <code>base.py</code>, <code>__init__.py</code>, <code>notebook.py</code>, <code>pyfile.py</code> ו־<code>ziparchive.py</code>.</li>
</ol>
<p>בקצרה: כל פעם שנבצע את פעולת add על קובץ, נחפש את תיקיית העל הקרובה ביותר בה יש קובץ <code>.wit</code>, וממנה נגזור את הנתיב היחסי לקובץ שעליו התבצעה הפקודה <code>add</code>. בתוך תיקיית <code>staging_area</code> ניצור שכפול של התיקייה המקורית עבור כל הקבצים שעליהם עשינו add.<br>
אם עשינו add על תיקייה, נצרף ל־<code>.wit</code> על כל הקבצים שבתיקייה, ועל כל הקבצים שבתתי התיקיות וכן הלאה.</p>
<p>אם אין תיקיית <code>.wit</code> באף תיקיית־על, זרקו שגיאה מתאימה.</p>
<p>דאגו שאם אנחנו רושמים: <code>python path/to/wit.py add path2</code> (כאשר <code>path/to/wit.py</code> זה הנתיב ל־<code>wit.py</code>), תופעל הפונקציה <code>add</code> על ה־<code>path2</code>, כשאתם מתייחסים לנתיב ביחס ל<a href="https://docs.python.org/3/library/os.html#os.getcwd">תיקיית העבודה הנוכחית</a>.</p>
<p><strong>עדכון חשוב לתרגיל wit add</strong>: בעקבות הרבה בלבול בהגשות, עיינו בבקשה בביאור לגבי איך wit add אמור לעבוד – <a href="https://forums.pythonic.guru/t/add/8023" class="inline-onebox">הבהרת התרגיל: פקודת add</a></p>
<hr>
<p>המשך יבוא ביום 2 <img src="https://forums.pythonic.guru/images/emoji/twitter/slight_smile.png?v=9" title=":slight_smile:" class="emoji" alt=":slight_smile:"><br>
יכולים לדמיין מה הולכות להיות הפקודות הבאות שתממשו?</p>
<hr>
<p>אני מודע שיש במחברת הזו הרבה מאוד חומר חדש ולא טריוויאלי.<br>
תרגישו בנוח לפתוח אשכולות ולהתייעץ על איך דברים אמורים לעבוד, אשמח לראות דיונים על החומר!</p>
<p><a href="https://forums.pythonic.guru/t/10-1-wit/7954/1">קריאת הנושא במלואו</a></p>
]]></description>
<link>https://forums.pythonic.guru/t/10-1-wit/7954/1</link>
<pubDate>Mon, 24 Aug 2020 03:00:35 +0000</pubDate>
<guid isPermaLink="false">forums.pythonic.guru-post-7954-1</guid>
<source url="https://forums.pythonic.guru/t/10-1-wit/7954.rss">שבוע 10 – יום 1: בונים את wit</source>
</item>
</channel>
</rss>