base on # KAIST CS220: Programming Principles
## Logistics
- Instructor: [Jeehoon Kang](https://cp.kaist.ac.kr/jeehoon.kang)
- Time: Mon & Wed 14:30-15:45 (2024 Fall)
- Place
+ Rm. 1501, Bldg. E3-1. **YOUR PHYSICAL ATTENDANCE IS REQUIRED** unless announced otherwise.
+ [Zoom room](https://kaist.zoom.us/my/jeehoon.kang) (if remote participation is absolutely necessary).
Ask Jeehoon via email for the passcode.
- Websites: <https://github.com/kaist-cp/cs220>, <https://gg.kaist.ac.kr/course/20/>
- Announcements: in [issue tracker](https://github.com/kaist-cp/cs220/issues?q=is%3Aissue+is%3Aopen+label%3Aannouncement)
+ We assume you read each announcement within 24 hours.
+ We strongly recommend you to watch the repository.
- TA: [Janggun Lee](https://cp.kaist.ac.kr/janggun.lee) (head), [Sunho Park](https://cp.kaist.ac.kr/sunho.park), [Jaewoo Kim](https://cp.kaist.ac.kr/jaewoo.kim).
+ Office Hours: Fri 9:00-10:00, Rm. 4441, Bldg. E3-1.
If you want to attend, please email the TAs by the day before and arrive by 9:15.
See [below](https://github.com/kaist-cp/cs220#rules) for the office hour policy.
<!-- Fri 9:00am-12:00pm, [Zoom room](https://zoom.us/j/4842624821)(The passcode is same as the class). It is not required, but if you want to come, do so by 9:30am. See [below](#communication) for office hour policy. -->
- **IMPORTANT**: you should not expose your work to others. In particular, you should not fork
the [upstream](https://github.com/kaist-cp/cs220) and push there.
## Course description
This course will equip you with the programming concepts needed to effectively communicate your ideas to computers.
For a detailed overview, please refer to the introduction in the Google Slides presentation.
### Outline
- Part 1: CS101 Review using the Rust programming language
- Part 2: Type and Correctness
- Part 3: Reference and Ownership
- Part 4: Function and Iterator
- Part 5: Concurrency and Parallelism
### Textbook
- [Slides](https://docs.google.com/presentation/d/17G3SwkE_tq0H3lTt9N0ysIbHhqDZBfHkoWD5LwwAKSo/edit#slide=id.p)
- [The Rust Book](https://doc.rust-lang.org/book/)
### Prerequisites
- It is **strongly recommended** that students have completed courses in:
+ Mathematics (MAS101): proposition statement and proof
+ Programming (CS101): basic programming skills
A solid foundation in these areas is crucial for success in this course.
### Schedule
- Week 01: introduction
- Week 02: part 1 (CS101 review)
- Week 03: part 1 (CS101 review)
- Week 04: part 1 (CS101 review)
- Week 05: part 2 (type)
- Week 06: part 2 (correctness)
- Week 07: part 2 (type as automatic verification)
- Week 08: mid-term exam
- Week 09: part 3 (reference)
- Week 10: part 3 (ownership)
- Week 11: part 4 (function as a value)
- Week 12: part 4 (combinator)
- Week 13: part 5 (mutability)
- Week 14: part 5 (concurrency)
- Week 15: part 5 (parallelism)
- Week 16: final exam
### Tools
Ensure you are proficient with the following development tools:
- [Git](https://git-scm.com/): Essential for downloading homework templates and managing your development process.
If you're new to Git, please complete [this tutorial](https://www.atlassian.com/git/tutorials).
+ Follow these steps to set up your repository:
* Clone the upstream repository directly without forking it:
```bash
$ git clone --origin upstream https://github.com/kaist-cp/cs220.git
$ cd cs220
$ git remote -v
upstream https://github.com/kaist-cp/cs220.git (fetch)
upstream https://github.com/kaist-cp/cs220.git (push)
```
* To receive updates from the upstream, fetch and merge `upstream/main`:
```bash
$ git fetch upstream
$ git merge upstream/main
```
+ For managing your development on a Git server, create a private repository:
* Upgrade to a "PRO" GitHub account, available at no cost.
See the [documentation](https://education.github.com/students).
* Go to https://github.com and create a new private repository named `cs220`.
The repository should be initialized as empty.
* Configure your repository as a remote:
```bash
$ git remote add origin
[email protected]:<github-id>/cs220.git
$ git remote -v
origin
[email protected]:<github-id>/cs220.git (fetch)
origin
[email protected]:<github-id>/cs220.git (push)
upstream https://github.com/kaist-cp/cs220.git (fetch)
upstream https://github.com/kaist-cp/cs220.git (push)
```
* Push your work to your repository:
```bash
$ git push -u origin main
```
* If you're accessing your repository for the first time, git may display an error due to insufficient permissions.
* On a development server, copy the SSH public key mentioned in the error message and add it to your GitHub account.
* In your own environment, you may need to generate an SSH key using `ssh-keygen` and retrieve the public key from `~/.ssh/id_rsa.pub`. You should never share the private key located in `~/.ssh/id_rsa`.
* You can add SSH keys to your GitHub account [here](https://github.com/settings/keys).
- [Rust](https://www.rust-lang.org/): You will use Rust for homework.
We chose Rust because its ownership type system greatly simplifies the development of large-scale system software.
+ `cargo doc --open` on your local will show you the documentation for each homework.
- [ChatGPT](https://chat.openai.com/) or other Large Language Models (LLMs) (optional): Useful for completing your homework.
+ In an AI-driven era, learning to effectively utilize AI in programming is crucial.
Homework difficulty is adjusted assuming the use of ChatGPT 3.5 or an equivalent tool.
- [Visual Studio Code](https://code.visualstudio.com/) (optional): Recommended for developing your homework, although you may use any editor of your preference.
- [Single Sign On (SSO)](https://auth.fearless.systems/): Use the following SSO credentials to access [gg](https://gg.kaist.ac.kr) and the [development server](https://cloud.fearless.systems):
+ id: KAIST student id (8-digit number)
+ email: KAIST email address (@kaist.ac.kr)
+ password: Reset it here: <https://auth.fearless.systems/if/flow/default-recovery-flow/>
+ Log in to [gg](https://gg.kaist.ac.kr) using the "kaist-cp-class" option, and to the [development server](https://cloud.fearless.systems) using the "OpenID Connect" option.
- [Development Server](https://cloud.fearless.systems/):
+ **IMPORTANT: Do not attempt to hack or overload the server. Please use it responsibly.**
+ Create and connect to a workspace to use the terminal or VSCode (after installation).
+ We recommend using VSCode with the "Rust Analyzer" and "CodeLLDB" plugins.
## Grading & Honor code
### Cheating
**IMPORTANT: READ CAREFULLY. THIS IS A SERIOUS MATTER.**
- Sign the KAIST CS Honor Code for this semester.
Failure to do so may lead to expulsion from the course.
- We will employ sophisticated tools to detect code plagiarism.
+ Search for "code plagiarism detector" on Google Images to understand how these tools can identify advanced forms of plagiarism.
Do not attempt plagiarism in any form.
### Programming assignments (40%)
- All assignments will be announced at the start of the semester.
- Submit your solutions to <https://gg.kaist.ac.kr/course/20>.
- You are **permitted** to use ChatGPT or other LLMs.
- For the concepts that don't come out in prerequisite courses, we tried to comment on the relevant resources in the assignment code. Please read them carefully.
- **How to submit your assignment:**
- To submit your solution, you should run `submit.sh` in `scripts` directory. In other words, you should run the following command:
```bash
# Run this command at the root directory of this repository.
$ ./scripts/submit.sh
```
- After running the command above, in the `target` directory, you can find a `assignment<NUMBER>.zip` file (`assignment09.zip` for example). Submit this file to <https://gg.kaist.ac.kr/course/20>.
- Read the documentation at <https://kaist-cp.github.io/cs220/cs220/>.
- You can check your grade of each assignment by running the grading script.
- You can run the grading script with the following command:
```bash
$ ./scripts/grade.sh <assignment_number>
# E.g. To grade `assignment09`, run the following command:
$ ./scripts/grade.sh 9
```
### Midterm and final exams (60%)
- Dates & Times: Oct 23th (Wed), Dec 18th (Wed), 13:00-15:45 (or shorter, TBA)
- Location: (the same as usual)
- Physical attendance is required.
If necessary, online participation via Zoom will be accommodated.
- You are expected to bring your own laptop.
Laptops can also be borrowed from the School of Computing Administration Team.
- We will use [Safe Exam Browser](https://safeexambrowser.org/) to prevent cheatings.
- You should have your laptop configured with Safe Exam Browser before the exam.
- TBA: Details will be announced later.
### Attendance (?%)
- A quiz must be completed on the [Course Management](https://gg.kaist.ac.kr/course/20) website for each session (if any).
**Quizzes should be completed by the end of the day.**
- Failing to attend a significant number of sessions will result in an automatic grade of F.
## Communication
### Registration
- Ensure your ability to log into the [lab submission website](https://gg.kaist.ac.kr).
+ Use your `kaist-cp-class` account for login.
+ Your ID is your `@kaist.ac.kr` email address.
+ Reset your password here: [https://auth.fearless.systems/if/flow/default-recovery-flow/](https://auth.fearless.systems/if/flow/default-recovery-flow/)
+ Contact the instructor if login issues arise.
### Rules
- Course-related announcements and information will be posted on the [course website](https://github.com/kaist-cp/cs220) and the [GitHub issue tracker](https://github.com/kaist-cp/cs220/issues).
It is expected that you read all announcements within 24 hours of their posting.
Watching the repository is highly recommended for automatic email notifications of new announcements.
- Questions about course materials and assignments should be posted in [the course repository's issue tracker](https://github.com/kaist-cp/cs220/issues).
+ Avoid sending emails to the instructor or TAs regarding course materials and assignments.
+ Research your question using Google, Stack Overflow, and ChatGPT before posting.
+ Describe your question in detail, including:
* Environment (OS, Rust version, and other relevant program information).
* Used commands and their results, with logs formatted in code.
See [this guide](https://guides.github.com/features/mastering-markdown/).
* Any changes made to directories or files.
For solution files, describe the modified code sections.
* Your Google search results, including search terms and learned information.
+ Use a clear and descriptive title for your issue.
+ For further instructions, read [this section](https://github.com/kaist-cp/cs220#communication) on the course website.
+ The requirement to ask questions online first is twofold: It ensures clarity in your query and allows everyone to benefit from shared questions and answers.
- Email inquiries should be reserved for confidential or personal matters.
Questions not adhering to this guideline (e.g., course material queries via email) will not be addressed.
- Office hours will not cover *new* questions.
Check the issue tracker for similar questions before attending.
If your question is not listed, post it as a new issue for discussion.
Office hour discussions will focus on unresolved issues.
- Emails to the instructor or head TA should start with "CS220" in the subject line, followed by a brief description.
Include your name and student number in the email.
Emails lacking this information (e.g., those without a student number) will not receive a response.
- If attending remotely via Zoom (https://kaist.zoom.us/my/jeehoon.kang), set your Zoom name to `<your student number> <your name>` (e.g., `20071163 강지훈`).
Instructions for changing your Zoom name can be found [here](https://support.zoom.us/hc/en-us/articles/201363203-Customizing-your-profile).
- The course is conducted in English.
However, you may ask questions in Korean, which will be translated into English.
## Ignore
1830eaed90e5986c75320daaf131bd3730b8575e866c4e92935a690e7c2a0716
", Assign "at most 3 tags" to the expected json: {"id":"11666","tags":[]} "only from the tags list I provide: [{"id":77,"name":"3d"},{"id":89,"name":"agent"},{"id":17,"name":"ai"},{"id":54,"name":"algorithm"},{"id":24,"name":"api"},{"id":44,"name":"authentication"},{"id":3,"name":"aws"},{"id":27,"name":"backend"},{"id":60,"name":"benchmark"},{"id":72,"name":"best-practices"},{"id":39,"name":"bitcoin"},{"id":37,"name":"blockchain"},{"id":1,"name":"blog"},{"id":45,"name":"bundler"},{"id":58,"name":"cache"},{"id":21,"name":"chat"},{"id":49,"name":"cicd"},{"id":4,"name":"cli"},{"id":64,"name":"cloud-native"},{"id":48,"name":"cms"},{"id":61,"name":"compiler"},{"id":68,"name":"containerization"},{"id":92,"name":"crm"},{"id":34,"name":"data"},{"id":47,"name":"database"},{"id":8,"name":"declarative-gui "},{"id":9,"name":"deploy-tool"},{"id":53,"name":"desktop-app"},{"id":6,"name":"dev-exp-lib"},{"id":59,"name":"dev-tool"},{"id":13,"name":"ecommerce"},{"id":26,"name":"editor"},{"id":66,"name":"emulator"},{"id":62,"name":"filesystem"},{"id":80,"name":"finance"},{"id":15,"name":"firmware"},{"id":73,"name":"for-fun"},{"id":2,"name":"framework"},{"id":11,"name":"frontend"},{"id":22,"name":"game"},{"id":81,"name":"game-engine "},{"id":23,"name":"graphql"},{"id":84,"name":"gui"},{"id":91,"name":"http"},{"id":5,"name":"http-client"},{"id":51,"name":"iac"},{"id":30,"name":"ide"},{"id":78,"name":"iot"},{"id":40,"name":"json"},{"id":83,"name":"julian"},{"id":38,"name":"k8s"},{"id":31,"name":"language"},{"id":10,"name":"learning-resource"},{"id":33,"name":"lib"},{"id":41,"name":"linter"},{"id":28,"name":"lms"},{"id":16,"name":"logging"},{"id":76,"name":"low-code"},{"id":90,"name":"message-queue"},{"id":42,"name":"mobile-app"},{"id":18,"name":"monitoring"},{"id":36,"name":"networking"},{"id":7,"name":"node-version"},{"id":55,"name":"nosql"},{"id":57,"name":"observability"},{"id":46,"name":"orm"},{"id":52,"name":"os"},{"id":14,"name":"parser"},{"id":74,"name":"react"},{"id":82,"name":"real-time"},{"id":56,"name":"robot"},{"id":65,"name":"runtime"},{"id":32,"name":"sdk"},{"id":71,"name":"search"},{"id":63,"name":"secrets"},{"id":25,"name":"security"},{"id":85,"name":"server"},{"id":86,"name":"serverless"},{"id":70,"name":"storage"},{"id":75,"name":"system-design"},{"id":79,"name":"terminal"},{"id":29,"name":"testing"},{"id":12,"name":"ui"},{"id":50,"name":"ux"},{"id":88,"name":"video"},{"id":20,"name":"web-app"},{"id":35,"name":"web-server"},{"id":43,"name":"webassembly"},{"id":69,"name":"workflow"},{"id":87,"name":"yaml"}]" returns me the "expected json"