From 236a5d27d8608b1de0a1dccc87ca0a07b1348c68 Mon Sep 17 00:00:00 2001 From: Jennifer Mankoff <jmankoff@cs.washington.edu> Date: Tue, 1 Sep 2020 15:41:35 -0700 Subject: [PATCH] Latest version of CSE340 21w website copied over clean fork --- _config.yml | 28 +-- _config_production.yml | 28 +-- assets/css/style.scss | 10 +- docs/index.md | 4 +- docs/java/JavaRefresher.zip | Bin 0 -> 22301 bytes docs/java/java-advanced.html | 219 +++++++++++++++++++ docs/java/java.html | 404 +++++++++++++++++++++++++++++++++++ index.md | 121 ++++++++++- 8 files changed, 778 insertions(+), 36 deletions(-) create mode 100644 docs/java/JavaRefresher.zip create mode 100644 docs/java/java-advanced.html create mode 100644 docs/java/java.html diff --git a/_config.yml b/_config.yml index 863e7af1..0801788b 100644 --- a/_config.yml +++ b/_config.yml @@ -7,26 +7,28 @@ title: Interaction Programming (CSE 340) description: Interactive Tech is changing society. Help invent the future! -baseurl: "/courses/csexxx/xxqq" +baseurl: "/courses/cse340/21wi" url: https://courses.cs.washington.edu # the base hostname & protocol for your site, e.g. http://example.com -twitter_username: username -git_username: username -git_url: https://gitlab.cs.washington.edu/jmankoff/class-website-core -git_branch: CSExxx-xxQQ -piazza: https://us.edstem.org/courses/xxx/discussion/ -canvas: https://canvas.uw.edu/courses/xxxxx -gitlab: https://gitlab.cs.washington.edu/students-group-for-assignments -gitgrade: https://gitgrade.cs.washington.edu/student/summary/xxxx +twitter_username: jcmankoff +git_username: jmankoff +git_url: https://gitlab.cs.washington.edu/cse340-21wi-tas +git_branch: CSE340-WI21 +piazza: https://us.edstem.org/courses/381/discussion/ +canvas: https://canvas.uw.edu/courses/1370612 +gitlab: https://gitlab.cs.washington.edu/cse340-21wi-students +gitgrade: https://gitgrade.cs.washington.edu/student/summary/8723 +hcibook: "No HCI Textbook, just readings" +androidbook: "No Android Textbook, just readings" paginate: 5 -quarter: "Quarter YYYY" +quarter: "Winter 2021" copydate: "3/30/20" status: draft author: - name: Name - url: "https://website" + name: Jennifer Mankoff + url: "https://make4all.org/jennifer-mankoff/" -email: "email@university.edu" # Your contact email +email: "jmankoff@uw.edu" # Your contact email # probably want to update this to be the class teaching staff mailing list # The Reveal theme diff --git a/_config_production.yml b/_config_production.yml index 863e7af1..0801788b 100644 --- a/_config_production.yml +++ b/_config_production.yml @@ -7,26 +7,28 @@ title: Interaction Programming (CSE 340) description: Interactive Tech is changing society. Help invent the future! -baseurl: "/courses/csexxx/xxqq" +baseurl: "/courses/cse340/21wi" url: https://courses.cs.washington.edu # the base hostname & protocol for your site, e.g. http://example.com -twitter_username: username -git_username: username -git_url: https://gitlab.cs.washington.edu/jmankoff/class-website-core -git_branch: CSExxx-xxQQ -piazza: https://us.edstem.org/courses/xxx/discussion/ -canvas: https://canvas.uw.edu/courses/xxxxx -gitlab: https://gitlab.cs.washington.edu/students-group-for-assignments -gitgrade: https://gitgrade.cs.washington.edu/student/summary/xxxx +twitter_username: jcmankoff +git_username: jmankoff +git_url: https://gitlab.cs.washington.edu/cse340-21wi-tas +git_branch: CSE340-WI21 +piazza: https://us.edstem.org/courses/381/discussion/ +canvas: https://canvas.uw.edu/courses/1370612 +gitlab: https://gitlab.cs.washington.edu/cse340-21wi-students +gitgrade: https://gitgrade.cs.washington.edu/student/summary/8723 +hcibook: "No HCI Textbook, just readings" +androidbook: "No Android Textbook, just readings" paginate: 5 -quarter: "Quarter YYYY" +quarter: "Winter 2021" copydate: "3/30/20" status: draft author: - name: Name - url: "https://website" + name: Jennifer Mankoff + url: "https://make4all.org/jennifer-mankoff/" -email: "email@university.edu" # Your contact email +email: "jmankoff@uw.edu" # Your contact email # probably want to update this to be the class teaching staff mailing list # The Reveal theme diff --git a/assets/css/style.scss b/assets/css/style.scss index d49312b1..22fcd4f1 100644 --- a/assets/css/style.scss +++ b/assets/css/style.scss @@ -1,10 +1,10 @@ --- # This is where the style colors for the website are set --- -$navbar-color: #003459; -$dark-color: #003459; -$gradient-dark: #004d85; -$gradient-light: #004d85; +$navbar-color: #3a1c6f; +$dark-color: #3a1c6f; +$gradient-dark: #3a1c6f; +$gradient-light: #006666; $lecture-background: #164756 ; $lab-background:#d8e6c9; $background: #d8e6c9; @@ -120,7 +120,7 @@ dl dt.lab { } .navbar { - background-color: $navbar-color; + background-color: $gradient-dark; } table.schedule { diff --git a/docs/index.md b/docs/index.md index bea510f6..ba11d1e5 100644 --- a/docs/index.md +++ b/docs/index.md @@ -21,4 +21,6 @@ slowly and will continue to be added to. - [Debugging]({{site.baseurl}}/docs/dev_mode) - [Android File Explorer]({{site.baseurl}}/docs/android_files) -- [Java 101]({{site.baseurl}}/docs/java.html) +- [Java 101]({{site.baseurl}}/docs/java/java.html) +- [Advanced Java]({{site.baseurl}}/docs/java/java-advanced.html) +- [Java example code]({{site.baseurl}}/docs/java/JavaRefresher.zip) diff --git a/docs/java/JavaRefresher.zip b/docs/java/JavaRefresher.zip new file mode 100644 index 0000000000000000000000000000000000000000..25f27c4c6f164f4fa2ad7b747dc793d0083ec75d GIT binary patch literal 22301 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 QSV2GUu|OCrG2qkx0j?ntvH$=8 literal 0 HcmV?d00001 diff --git a/docs/java/java-advanced.html b/docs/java/java-advanced.html new file mode 100644 index 00000000..2b1e57a5 --- /dev/null +++ b/docs/java/java-advanced.html @@ -0,0 +1,219 @@ +--- +layout: presentation +title: Advanced Java +description: Advanced Java Slides +class: middle, center, inverse +--- +name: inverse +layout: true +class: center, middle, inverse +--- + +# CSE 340 ({{site.quarter}}) +## Advanced Java + +--- +layout: false + +# Roadmap +- Inheritance +- Generics +- Anonymous Inner Classes +- Lambdas (and `::` notation) + +--- +# Inheritance + +.left-column50[ +Interfaces: a promise that you will implement these methods +- Interfaces can only implement other interfaces +- A class can implement many interfaces +- Examples: Comparable interface + +Regular class: fully defined behaviors that you want to add to +- All functions in the parent class have been implemented and are inherited +- Usually would use this to add more specific behavior by changing implementation or adding new methods +] +.right-column50[ +Abstract classes: like interfaces but has some fully implemented methods as well +- Can have abstract functions that are only defined in subclasses like interfaces +- Also allows you to define shared member variables and functions for all subclasses +- Examples: Pets all have a name (inherited member variable), are adopted the +same way (function defined in abstract class) but eat different foods (abstract function defined only in subclasses) + +.small.red[https://courses.cs.washington.edu/courses/cse331/20wi/lectures/lec12-subtyping.pdf] +] + +--- +# Inheritance common errors and tips +Be careful: +- Make sure not to redefine a variable you inherited from a parent class +- Check and make sure that you are using the same method signature (return types and parameter types) when overriding inherited methods, otherwise this is actually overloading +- These might lead to undefined and weird behaviors! :( + +Remember: +- You can only subclass one class, but you can implement as many interfaces as you want +- Subclasses are able to access and change public and protected member variables of parent +- You must implement interface methods and all abstract superclass methods + +--- +# Switch Statements + +A form of a conditional with different execution paths + +```java +public enum EssentialGeometry { INSIDE, ON_EDGE, OUTSIDE }; +... +EssentialGeometry where = EssentialGeometry.INSIDE; +switch (where) { + case ON_EDGE: // do the edgy things + break; // and skip everything after this + case INSIDE: // do the inside things but also fall through + // and do the OUTSIDE things because no break statement; + case OUTSIDE: // do the outside things + break; // and skip everything after this + default: // do default things + // automatically falls through +} +``` +--- +# Private class fields are often labelled with a lowercase “m†at the front + +This notation comes from AOSP<br> +(Android Open Source Project) [Code Style Guidelines for Contributors](http://source.android.com/source/code-style.html#follow-field-naming-conventions) + +Follow Field Naming Conventions +- Non-public, non-static field names start with ‘m’. +- Static field names start with ‘s’. +- Other fields start with a lower case letter. +- Public static final fields (constants) are `ALL_CAPS_WITH_UNDERSCORES`. + +For example: +- `private float mCircleRadius, mThumbRadius;` +- `private final Paint mPaintStart, mPaintEnd;` + + +--- +# Enums + +An enum type is a special data type that restricts a variable to be a set of predefined constant
s + +```java +public enum EssentialGeometry { INSIDE, OUTSIDE }; +... +EssentialGeometry where = EssentialGeometry.INSIDE; +``` +--- +# Generics + +Basically, abstraction over types +```java +Point<Integer>, Point<Double> + +// Type abstraction: abstract over element type +Interface List<E> { // Lets us use types such as: + Boolean add(E n); // List<Integer> + E get(int index); // List<String> +} // List<List<Double>> + +``` +--- +# Anonymous Inner Classes (1/3) + +In Java, Anonymous Inner Classes are inner classes (or a non-static class that’s nested inside another class) + +- Anonymous classes don’t have a name and are often used to make an instance of an object that has slightly different methods of another class or interface. +- This way, you don’t have to actually make a subclass of a class. +- You’re going to see this type of class in some of our homework when implementing something called “listeners†+ +--- +# Anonymous Inner Classes (2/3) + +```java +public class ExActivity extends AppCompatActivity { + private View.OnClickListener mClickListener = new View.OnClickListener() { + public void onClick(View v) { + if (mButton!=v) { + return; + } + } + }; // remember to end this statement with a semicolon +} + +``` +--- +# Anonymous Inner Classes (3/3) + +Digging deeper: Creating an anonymous inner class <br> +`private View.OnClickListener mClickListener = new View.OnClickListener() {` + +.left-column50[ + +`private` -- it's only available inside the class that contains it (e.g. `ExampleActivity`) + +`View.OnClickListener` -- the variable type ([Documentation](https://developer.android.com/reference/android/view/View.OnClickListener)), a nested class in `View` + +`mClickListener` is the variable name which is being set to... +] +.right-column50[ +a `new View.OnClickListener` which is an anonymous object from an abstract class +- For those of you who have not taken 331, that means there are methods that have not been implemented in the class +- The one method that you MUST implement (in order to create a new object of this type) is `onClick`, which overrides the abstract method +] +--- +# Lambdas + +What are Lambda expressions in Java? +- Block of code that can be passed around to execute +- Instances of functional interfaces +- Think of it as using code as data +- Useful for anonymous classes and functional interfaces, allows compact instances of one method classes +- This will come up later in the course when dealing with callbacks! +- Once instantiated, you can re-use it! Treat it is as a function + +--- +# Lambda Simple Example +.left-column50[ +An example functional interface +```java +interface FuncInter1 + { + int operation(int a, int b); + int multiplication(int a, int b); + } + +... + +// Implementing interface w/ lambda function +FuncInter1 add = (int x, int y) -> x + y; + + +``` +] +.right-column50[ + +You can reuse this now! +- `add.operation(2, 3)` returns 5 +- `add.multiplication(2, 3)` return 5 +] +--- +# Another Lambda Example using `::` operator + +`::` is a method reference, same as using lambda but even shorter and readable + +Syntax of `::` operator `<Class name>::<method name>` + +Lambda Example + +`numList.forEach(e -> System.out.print(e));` + +This does the same thing! + +`numList.forEach(System.out::print)` + +--- + + + + + diff --git a/docs/java/java.html b/docs/java/java.html new file mode 100644 index 00000000..eddb4323 --- /dev/null +++ b/docs/java/java.html @@ -0,0 +1,404 @@ +--- +layout: presentation +title: Java Refresher +description: Java Refresher Slides +class: middle, center, inverse +--- +name: inverse +layout: true +class: center, middle, inverse +--- + +# CSE 340 ({{site.quarter}}) +## Java Refresher + +--- +layout: false + +# What is Java? + +- Strongly, statically typed language + + - Every variable has a type + - This type is decided at compile time (mostly) + +-- + +- Compiled, class-based, Object-oriented + +-- + +- Platform agnostic + + - __Write once__, _run anywhere_ without recompilation + - Especially useful for Android + +--- + +## Java Basics: Primitive Types + +-- +.left-column50[ +- Boolean + +```java +boolean hasClassStarted = true; +boolean isClassOver = false; +``` +] +--- + +## Java Basics: Primitive Types + +.left-column50[ +- Boolean + +```java +boolean hasClassStarted = true; +boolean isClassOver = false; +``` + +- Integer + +```java +int numStudents = rand.nextInt(30); +``` +] +--- + +## Java Basics: Primitive Types + +.left-column50[ +- Boolean + +```java +boolean hasClassStarted = true; +boolean isClassOver = false; +``` + +- Integer + +```java +int numStudents = rand.nextInt(30); +``` +- Float + +```java +float gradePointAverage = 3.2f; +``` +] + +-- +.right-column50[ +- Double + - Higher precision than float + +```java +double examScore = 97.362; +``` +] +-- +.right-column50[ +- Byte, Short, etc. +] +--- +## Java Basics: Text + +-- +- Characters + +```java +char section = 'B'; +``` + +-- +- Strings + +```java +String instructor = "Jennifer Mankoff"; +``` + +-- +All non-primitives types inherit from `Object` class + - Including `String`; note the capitalization + +--- +## Java Basics: Visibility Modifiers + +```java +public final String COURSE = "CSE 340"; +... +private final String SSN = "123-45-6789"; +``` + +-- +.left-column50[ +- `package private` + - This is the default access if no modifier is specified + - Accessible by all classes in the same package. +] +--- +## Java Basics: Visibility Modifiers + +```java +public final String COURSE = "CSE 340"; +... +private final String SSN = "123-45-6789"; +``` + +.left-column50[ +- `package private` + - This is the default access if no modifier is specified + - Accessible by all classes in the same package. +- `private` + - Kept secret, can only be read/written by `self` + - Cannot be accessed by subclasses +] +-- +.right-column50[ +- `protected` + - Access restricted to `self`, subclasses, and package +] +--- +## Java Basics: Visibility Modifiers + +```java +public final String COURSE = "CSE 340"; +... +private final String SSN = "123-45-6789"; +``` + +.left-column50[ +- `package private` + - This is the default access if no modifier is specified + - Accessible by all classes in the same package. +- `private` + - Kept secret, can only be read/written by `self` + - Cannot be accessed by subclasses +] +.right-column50[ +- `protected` + - Access restricted to `self`, subclasses, and package +- `public` + - The world can read/write (fields) or call (methods) +] +--- +## Java Basics: Visibility Modifiers + +-- + - Generally, you want to be as restrictive as possible + - Usually, this means `private` + +-- + + - Create getter/setter methods to modify the member variables + +-- + + - .red[__Almost never use__ `public`] for fields + - Except for constants + +--- +## Java Basics: `final` + +-- +.left-column50[ +- Prevent value from changing after initialization + +```java +// local variable cannot be modified ever! +final double courseGrade = 95.0; +``` +] +--- +## Java Basics: `final` + +.left-column50[ +- Prevent value from changing after initialization + +```java +// local variable cannot be modified ever! +final double courseGrade = 95.0; +``` + +- Prevent subclassing + +```java + // can't subclass + // (for example to make a Student class) + public final class Person { + ... + } +``` +] +-- +.right-column50[ +- Prevent overriding + +```java + // can't override! + public final int getValue() { + return 0; + } +``` +] +--- +## Java Basics: `static` + +-- +- Use for constants or variables are shared by all instances of a particular class + +```java +final static double SALES_TAX_RATE = 0.07; // Class Constant (never changes) +static double mTotalAmount = 3.56; // Class variable can change +``` + +-- +- Methods that can be called without an class instance (instantiating an object) + +```java +static String toString(int i); +// For example Integer.toString(100) => "100"; +``` + +--- +# Naming Conventions + + - class names are PascalCased + - local variables and method names are camelCased + - class or instance variables begin with a 'm' (for member), such as mTotalAmount + - constants are UPPER_SNAKE_CASED + +--- +## Java Basics: Methods +- Methods in Java typically follow this format: + +```java +{visibility} [static] [final] returnType methodName(paramType paramName, ...) { + ... +} +``` + +-- +- `static` and `final` are optional, special modifiers +- `visibility` is one of `public`, `private`, `protected`, or empty for package private + +--- +## Java Basics: Method Example + +Summing two numbers and returning the answer as a string + +```java +public String getSumOfTwoNumbersAsString(int first, int second) { + int sum = first + second; + return Integer.toString(sum); // could also return "" + sum +} +``` + +--- +## Java Basics: Declaring a class + +```Java +{visibility} class ClassName { + // Field declarations + + // Method definitions +} +``` + +--- + +## Java Basics: Constructing a Class + +```java +public class Student { + // Class (static) variables - + public static final String STUDENT_KEY = "STUDENT"; + private static final String ID_PREFIX = "S"; + + // Instance Variables + private String mIdNumber; + private String mName; + + // Constructors - used to create an instance + Student(String name, String idNumber) { + this.name = mName; + this.idNumber = mIdNumber; + } + + // Methods + public String getPrefixedIdNumber() { + return ID_PREFIX + mIdNumber; + } +``` + +--- +## Java Basics: Constructing a Class cont. +```java + // Getter + public String getName() { + return mName; + } + + // Setter + public void setName(String newName) { + if (newName == null || newName == "") { + newName = "Unknown"; + } + + mName = newName; + } + + ... // etc. + +} +``` + +--- +# Enums + +An enum type is a special data type that enables for a variable to be a set of predefined constant + +```java +public enum EssentialGeometry { INSIDE, OUTSIDE }; + +... +EssentialGeometry where = EssentialGeometry.INSIDE; +``` +--- +# Switch Statements + +A form of a conditional with different execution paths + +```java +public enum EssentialGeometry { INSIDE, ON_EDGE, OUTSIDE }; +... +EssentialGeometry where = EssentialGeometry.INSIDE; +switch (where) { + case ON_EDGE: + // do the edgy things + break; + case INSIDE: + // do the inside things but also fall through + // and do the OUTSIDE things because no break statement; + case OUTSIDE: + // do the outside things + break; + default: + // do default things + // automatically falls through +} + +``` + + +--- +## More Java Resources + +- Java Documentation (https://docs.oracle.com/en/java/javase/13/docs/api/) + +- __Online Java Practice Problems__: + + - http://codingbat.com/java + + - https://practiceit.cs.washington.edu/problem/list diff --git a/index.md b/index.md index 6966318d..ab70b09d 100755 --- a/index.md +++ b/index.md @@ -15,8 +15,8 @@ For quick links to key things, check out the navigation bar above and the table See [Canvas]({{site.canvas}}) for all zoom meeting links -**Class Time:** \\ -**Lab Times:** +**Class Time:** M/W/F at 10:30am PDT \\ +**Lab Times:** 9:30am PDT (Section AA) and 10:30 am PDT (Section AB) # Course staff @@ -29,8 +29,8 @@ See [Canvas]({{site.canvas}}) for all zoom meeting links ## TAs :--: | :---------: | :-- | | :--: | :---------: | :-- - **Section AA** | {:class="ta-picture"} | Taylor Gotfrid (she/her) | | **Section AB** | | - **Infrastructure** | | | | | | + **Section AA** | {:class="ta-picture"} | Taylor Gotfrid (she/her) | | **Section AB** | | David Chen (he/him) + **Infrastructure** | {:class="ta-picture"} | Jeremy Zhang (he/him) | | | | # Should I take this class? @@ -326,3 +326,116 @@ Accommodations must be requested within the first two weeks of this course using [Religious Accommodations Request](https://registrar.washington.edu/students/religious-accommodations-request/) form on UW's site. +# Other relevant classes to know about + +There are a number of classes on campus that teach related concepts +which you may wish to consider in addition to this one. As of Spring 2020, +here are the ones we are aware of: + +- CSE 154: Web Programming: [Sp 20](https://courses.cs.washington.edu/courses/cse154/20sp/) + This course covers languages, tools, and techniques for developing interactive and dynamic web + pages. Topics include page styling, design, and layout; client and server side scripting; + web security; and interacting with data sources such as databases. +- [HCDE 310: Interactive Systems Design & + Technology](https://www.smunson.com/teaching/hcde310/a17/) This course is a + project based course that teaches how to prototype applications on the + web using Python that solve human problems or enable new + activities. Includes information about APIs and how people interact with them. It + differs from CSE 340 in its choice of platform. Additionally, it + doesn’t cover the theory of UI programming, nor issues such as + accessibility, undo, and so on. +- [INFO 343: Client side web + development](https://canvas.uw.edu/courses/1118282) This is a + programming course, and there will be significant overlap between the + courses, as INFO 343 also touches on event based programming, output, + and accessibility. [CSE 154: Web + Programming](https://courses.cs.washington.edu/courses/cse154/20sp/) + also covers some related + material. However, both are about programming on the web using + JavaScript instead of on Android, using Java. In addition, CSE 340 + covers more of the theory of UI programming and design, similar to + HCID 520. +- [CSE 440: Introduction to + HCI](http://courses.cs.washington.edu/courses/cse440/); [441: Advanced HCI](http://courses.cs.washington.edu/courses/cse441/) This is an advanced series of courses for undergraduate + seniors. The focus of 440 is less on programming and more broadly on + methods for designing, prototyping, and evaluating user interfaces to + computing applications, while 441 is an open ended capstone + course. These are excellent follow on courses to 340, for a student + who wants to go deeper into how to make usable, enjoyable effective + interfaces, and how to solve interesting problems with HCI. Related is + [CSE 510](http://courses.cs.washington.edu/courses/csep510/), the HCI + course for the professional masters program. +- HCID 520: User Interface Software + + Technology ([Wi 17](http://uwdata.github.io/hcid520/17wi/), [Wi 16](http://faculty.washington.edu/ajko/hcid520/) [Wi 19](https://canvas.uw.edu/courses/1256337)) + This course + teaches about user interfaces, including what they are, how they are + built, and some inventions in user interface software and + technology. There are many similarities between these classes. However HCID 520 + is only open to [MHCI+D students](https://mhcid.washington.edu/) Masters students. +- [HCID 521: Prototyping](https://canvas.uw.edu/courses/1128377/assignments/syllabus) + This class is for the [MHCI+D students](https://mhcid.washington.edu/) + only and focuses on prototyping techniques, not implementation. It + covers everything from paper prototyping to physical interfaces to 3D + printing. + +<!-- | head1 | head two | three | --> +<!-- |:-------------|:------------------|:------| --> +<!-- | OK | good swedish fish | nice | --> +<!-- | out of stock | good and plenty | nice | --> +<!-- | ok | good `oreos` | hmm | --> +<!-- | ok | good `zoute` drop | yumm | --> + +<!-- ### There's a horizontal rule below this. --> + +<!-- * * * --> + +<!-- ### Here is an unordered list: --> + +<!-- * Item foo --> +<!-- * Item bar --> +<!-- * Item baz --> +<!-- * Item zip --> + +<!-- ### And an ordered list: --> + +<!-- 1. Item one --> +<!-- 1. Item two --> +<!-- 1. Item three --> +<!-- 1. Item four --> + +<!-- ### And a nested list: --> + +<!-- - level 1 item --> +<!-- - level 2 item --> +<!-- - level 2 item --> +<!-- - level 3 item --> +<!-- - level 3 item --> +<!-- - level 1 item --> +<!-- - level 2 item --> +<!-- - level 2 item --> +<!-- - level 2 item --> +<!-- - level 1 item --> +<!-- - level 2 item --> +<!-- - level 2 item --> +<!-- - level 1 item --> + +<!-- ### Definition lists can be used with HTML syntax. --> + +<!-- <dl> --> +<!-- <dt>Name</dt> --> +<!-- <dd>Godzilla</dd> --> +<!-- <dt>Born</dt> --> +<!-- <dd>1952</dd> --> +<!-- <dt>Birthplace</dt> --> +<!-- <dd>Japan</dd> --> +<!-- <dt>Color</dt> --> +<!-- <dd>Green</dd> --> +<!-- </dl> --> + +<!-- ``` --> +<!-- Long, single-line code blocks should not wrap. They should horizontally scroll if they are too long. This line should be long enough to demonstrate this. --> +<!-- ``` --> + +<!-- ``` --> +<!-- The final element. --> +<!-- ``` --> -- GitLab