├── .gitignore ├── CC-BY-4.0-LICENSE.txt ├── CONTRIBUTING.md ├── MIT-LICENSE.txt ├── README.md ├── assignments ├── a1 │ ├── a1.md │ └── grade_a1.sh ├── a2 │ ├── a2.md │ └── grade_a2.py ├── a3 │ ├── a3.md │ ├── ar.png │ ├── at.png │ ├── geckodriver │ ├── grade_a3.py │ └── is.png └── a4 │ ├── a4.md │ ├── cappones.png.b64 │ ├── cappones.y4m │ ├── grade_a4.js │ ├── index.html │ ├── open_site.js │ ├── package-lock.json │ ├── package.json │ ├── receipt_cropping_method.png │ ├── receipt_vid.png.b64 │ ├── receipt_vid.y4m │ ├── roles.png │ ├── setup.mp4 │ └── spec.png ├── course ├── cal.md ├── description.md └── grading.md ├── grading ├── README.md ├── download_js_a3.js ├── mossum │ ├── LICENSE │ ├── MANIFEST.in │ ├── README.md │ ├── bin │ │ └── mossum │ ├── mossum │ │ ├── __init__.py │ │ └── mossum.py │ └── setup.py └── package.json ├── images ├── CT_logo1.png └── cornell-logo.png ├── lectures ├── section_a │ ├── lecture-01.md │ ├── lecture-01.pdf │ ├── lecture-02.md │ ├── lecture-02.pdf │ ├── lecture-03.md │ └── lecture-03.pdf └── section_b │ ├── lecture_1.pdf │ ├── lecture_2.md │ ├── lecture_2.pdf │ ├── lecture_3.md │ └── lecture_3.pdf └── people ├── Tanuj-Ahuja.md ├── adam-fleming.md ├── advika-nigam.md ├── akshayj.md ├── aleo-mok.md ├── an-le.md ├── andi-mitre.md ├── ang-li.md ├── anmol-seth.md ├── arpit-sheth.md ├── bradley-wise.md ├── brett-leibowitz.md ├── cameron-boroumand.md ├── cameron-westbury.md ├── chang-wei.md ├── chengsi-wu.md ├── chenkai-wang.md ├── chenyang-wang.md ├── christopher-caulfield.md ├── christy-cui.md ├── daniel-kim.md ├── daraxu.md ├── daren-liu.md ├── darya-moldavskaya.md ├── david-hachuel.md ├── debarun-dhar.md ├── derek-netto.md ├── devon-bain.md ├── disheng-zheng.md ├── elena-zhizhimontova.md ├── emily-tseng.md ├── ephraim-montag.md ├── eric-nguyen.md ├── ethan-green.md ├── eva-stern-rodriguez.md ├── evan-kaplan.md ├── eyvind-niklasson.md ├── fani-maksakuli.md ├── feston-kastrati.md ├── fuyuzhen-peng.md ├── gaurav-chaturvedi.md ├── han-jing.md ├── han-nie.md ├── hanyu-zhang.md ├── hao-zheng.md ├── hathaitorn-rojnirun.md ├── howard-xing.md ├── huafeng-dai.md ├── huajun-bai.md ├── i-huang.md ├── jacob-lee.md ├── jake-magid.md ├── jamie-yu.md ├── jared-wong.md ├── jessie-gao.md ├── jialiang-wang.md ├── joe-abi-sleiman.md ├── jonathan-cutler.md ├── junhsiang-liao.md ├── kirollos-morkos.md ├── kripa-agarwal.md ├── kriti-singh.md ├── lingfeng-huang.md ├── linglong-wei.md ├── liran-sharir.md ├── lixuan-mao.md ├── luke-ahn.md ├── luna-yang ├── marco-berlot.md ├── marco-white.md ├── marika-cusick.md ├── matthew-hsu.md ├── max-shatkhin.md ├── mikaela-brown.md ├── mohit-chawla.md ├── neel-parekh.md ├── noshin-anjum-nisa.md ├── peihsuan-tsai.md ├── photos ├── adam-fleming.png ├── advika-nigam.jpg ├── akshayj.png ├── aleo-mok.jpg ├── an-le.png ├── andi-mitre.png ├── ang-li.jpg ├── anmol-seth.jpg ├── arpit-sheth.jpg ├── bradley-wise.jpg ├── brett-leibowitz.jpg ├── cameron-boroumand.jpg ├── cameron-westbury.jpg ├── chang-wei.jpg ├── chengsi-wu.jpg ├── chenkai-wang.jpg ├── chenyang-wang.jpg ├── christopher-caulfield.png ├── christy-cui.jpg ├── daniel-kim.jpg ├── dara.jpg ├── daren-liu.jpg ├── darya-moldavskaya.png ├── david-hachuel.jpg ├── debarun-dhar.jpg ├── derek-netto.jpg ├── devon-bain.jpg ├── disheng-zheng.jpg ├── elena-zhizhimontova.jpg ├── emily-tseng.jpg ├── ephraim-montag.jpg ├── eric-nguyen.png ├── ethan-green.png ├── eva-stern-rodriguez.jpg ├── evan-kaplan.PNG ├── fani-maksakuli.jpg ├── feston-kastrati.jpg ├── fuyuzhen-peng.jpg ├── gaurav-chaturvedi.jpg ├── han-jing.jpg ├── han-nie.png ├── hanyu-zhang.jpg ├── hao-zheng.JPG ├── hathaitorn-rojnirun.jpg ├── huafeng-dai.jpg ├── huajun-bai.JPG ├── i-huang.JPG ├── jacob-lee.jpg ├── jake-magid.png ├── jamie-yu.jpg ├── jared-wong.jpg ├── jessie-gao.jpg ├── jialiang-wang.jpg ├── joe-abi-sleiman.jpg ├── jonathan-cutler.png ├── junhsiang-liao.jpg ├── kirollos-morkos.jpg ├── kripa-agarwal.jpg ├── kriti-singh.jpg ├── lingfeng-huang.JPG ├── linglong-wei.jpeg ├── liran-sharir.jpg ├── lixuan-mao.jpeg ├── luke-ahn.jpg ├── luna-yang.jpg ├── marco-berlot.png ├── marco-white.png ├── matthew-hsu.jpg ├── max-shatkhin.png ├── mikaela-brown.jpg ├── mohit-chawla.jpg ├── neel-parekh.jpg ├── noshin-anjum-nisa.jpg ├── peihsuan-tsai.jpg ├── poyen-tseng.jpg ├── rahul-chatterjee.jpg ├── rainie-sun.JPG ├── raviteja-arikati.jpg ├── ray-su.jpg ├── renee-zacharowicz.jpg ├── robert-wolfe.JPG ├── rohun-tripathi.png ├── rom-cohen.jpg ├── romoli-bakshi.png ├── rongxin-zhang.png ├── ruihao-zhu.jpg ├── ryan-ramphal.jpg ├── saliou-diallo.png ├── samantha-yip.jpg ├── sarah-le-cam.jpg ├── saran-krish.jpg ├── seye-bankole.JPG ├── spark-shen.jpg ├── stephen-bongner.jpg ├── steve-lee.jpg ├── steven-jaroslawski.jpg ├── subhangi-agarwala.jpg ├── svava-kristinsdottir.JPG ├── tanuj-ahuja.jpg ├── tao-yuan.jpg ├── vicente-rotman-hinzpeter.jpg ├── vijay-pillai.jpg ├── vincent-kuo.png ├── vinson-wang.jpg ├── weisi-zhang.jpeg ├── will-davis.png ├── xiaohang-lu.jpg ├── xu-han.jpg ├── xu-wang.jpg ├── yian-mo.jpg ├── yingxiang-lu.jpg ├── yixin-ye.JPG ├── yiyuan-feng.jpg ├── young-sang-choi.jpg ├── yuan-chang.jpg ├── yuan-xuan.png ├── yuan-zhou.JPG ├── yuchen-shi.jpg ├── yuhui-dai.jpg ├── yunie-mao.jpg ├── yuxiang-zhu.jpeg ├── yuxue-mei.jpg ├── zen-yui.jpg ├── zhan-zhang.png ├── zhanif.jpg ├── zheyuan-gu.jpg ├── zhiyuan-jia.jpg ├── zihan-ni.jpg └── zongcheng-yang.jpg ├── poyen-tseng.md ├── rahul-chatterjee.md ├── rainie-sun.md ├── raviteja-arikati.md ├── ray-su.md ├── renee-zacharowicz.md ├── robert-wolfe.md ├── rohun-tripathi.md ├── rom-cohen.md ├── romoli-bakshi.md ├── rongxin-zhang.md ├── ruihao-zhu.md ├── ryan-ramphal.md ├── saliou-diallo.md ├── samantha-yip.md ├── sarah-le-cam.md ├── saran-krish.md ├── seye-bankole.md ├── spark-shen.md ├── stephen-bongner.md ├── steve-lee.md ├── steven-jaroslawski.md ├── subhangi-agarwala.md ├── svava-kristinsdottir.md ├── tao-yuan.md ├── thomas-matecki.md ├── travis-allen.md ├── vicente-rotman-hinzpeter.md ├── vijay-pillai.md ├── vincent-kuo.md ├── vinson-wang.md ├── weisi-zhang.md ├── will-davis.md ├── xiaohang-lu.md ├── xu-han.md ├── xu-wang.md ├── yian-mo.md ├── yingxiang-lu.md ├── yixin-ye.md ├── yiyuan-feng.md ├── young-sang-choi.md ├── yuan-chang.md ├── yuan-xuan.md ├── yuan-zhou.md ├── yuchen-shi.md ├── yuhui-dai.md ├── yunie-mao.md ├── yuxiang-zhu.md ├── yuxue-mei.md ├── zeeshan-hanif.md ├── zen-yui.md ├── zhan-zhang.md ├── zheyuan-gu.md ├── zhiyuan-jia.md ├── zihan-ni.md └── zongcheng-yang.md /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | projects/ 3 | .idea/ 4 | old/ 5 | sol/ 6 | *~ 7 | __pycache__/ 8 | geckodriver.log 9 | grading/ 10 | node_modules/ 11 | access.log -------------------------------------------------------------------------------- /CC-BY-4.0-LICENSE.txt: -------------------------------------------------------------------------------- 1 | Attribution 4.0 International 2 | 3 | ======================================================================= 4 | 5 | Creative Commons Corporation ("Creative Commons") is not a law firm and 6 | does not provide legal services or legal advice. Distribution of 7 | Creative Commons public licenses does not create a lawyer-client or 8 | other relationship. Creative Commons makes its licenses and related 9 | information available on an "as-is" basis. Creative Commons gives no 10 | warranties regarding its licenses, any material licensed under their 11 | terms and conditions, or any related information. Creative Commons 12 | disclaims all liability for damages resulting from their use to the 13 | fullest extent possible. 14 | 15 | Using Creative Commons Public Licenses 16 | 17 | Creative Commons public licenses provide a standard set of terms and 18 | conditions that creators and other rights holders may use to share 19 | original works of authorship and other material subject to copyright 20 | and certain other rights specified in the public license below. The 21 | following considerations are for informational purposes only, are not 22 | exhaustive, and do not form part of our licenses. 23 | 24 | Considerations for licensors: Our public licenses are 25 | intended for use by those authorized to give the public 26 | permission to use material in ways otherwise restricted by 27 | copyright and certain other rights. Our licenses are 28 | irrevocable. Licensors should read and understand the terms 29 | and conditions of the license they choose before applying it. 30 | Licensors should also secure all rights necessary before 31 | applying our licenses so that the public can reuse the 32 | material as expected. Licensors should clearly mark any 33 | material not subject to the license. This includes other CC- 34 | licensed material, or material used under an exception or 35 | limitation to copyright. More considerations for licensors: 36 | wiki.creativecommons.org/Considerations_for_licensors 37 | 38 | Considerations for the public: By using one of our public 39 | licenses, a licensor grants the public permission to use the 40 | licensed material under specified terms and conditions. If 41 | the licensor's permission is not necessary for any reason--for 42 | example, because of any applicable exception or limitation to 43 | copyright--then that use is not regulated by the license. Our 44 | licenses grant only permissions under copyright and certain 45 | other rights that a licensor has authority to grant. Use of 46 | the licensed material may still be restricted for other 47 | reasons, including because others have copyright or other 48 | rights in the material. A licensor may make special requests, 49 | such as asking that all changes be marked or described. 50 | Although not required by our licenses, you are encouraged to 51 | respect those requests where reasonable. More_considerations 52 | for the public: 53 | wiki.creativecommons.org/Considerations_for_licensees 54 | 55 | ======================================================================= 56 | 57 | Creative Commons Attribution 4.0 International Public License 58 | 59 | By exercising the Licensed Rights (defined below), You accept and agree 60 | to be bound by the terms and conditions of this Creative Commons 61 | Attribution 4.0 International Public License ("Public License"). To the 62 | extent this Public License may be interpreted as a contract, You are 63 | granted the Licensed Rights in consideration of Your acceptance of 64 | these terms and conditions, and the Licensor grants You such rights in 65 | consideration of benefits the Licensor receives from making the 66 | Licensed Material available under these terms and conditions. 67 | 68 | 69 | Section 1 -- Definitions. 70 | 71 | a. Adapted Material means material subject to Copyright and Similar 72 | Rights that is derived from or based upon the Licensed Material 73 | and in which the Licensed Material is translated, altered, 74 | arranged, transformed, or otherwise modified in a manner requiring 75 | permission under the Copyright and Similar Rights held by the 76 | Licensor. For purposes of this Public License, where the Licensed 77 | Material is a musical work, performance, or sound recording, 78 | Adapted Material is always produced where the Licensed Material is 79 | synched in timed relation with a moving image. 80 | 81 | b. Adapter's License means the license You apply to Your Copyright 82 | and Similar Rights in Your contributions to Adapted Material in 83 | accordance with the terms and conditions of this Public License. 84 | 85 | c. Copyright and Similar Rights means copyright and/or similar rights 86 | closely related to copyright including, without limitation, 87 | performance, broadcast, sound recording, and Sui Generis Database 88 | Rights, without regard to how the rights are labeled or 89 | categorized. For purposes of this Public License, the rights 90 | specified in Section 2(b)(1)-(2) are not Copyright and Similar 91 | Rights. 92 | 93 | d. Effective Technological Measures means those measures that, in the 94 | absence of proper authority, may not be circumvented under laws 95 | fulfilling obligations under Article 11 of the WIPO Copyright 96 | Treaty adopted on December 20, 1996, and/or similar international 97 | agreements. 98 | 99 | e. Exceptions and Limitations means fair use, fair dealing, and/or 100 | any other exception or limitation to Copyright and Similar Rights 101 | that applies to Your use of the Licensed Material. 102 | 103 | f. Licensed Material means the artistic or literary work, database, 104 | or other material to which the Licensor applied this Public 105 | License. 106 | 107 | g. Licensed Rights means the rights granted to You subject to the 108 | terms and conditions of this Public License, which are limited to 109 | all Copyright and Similar Rights that apply to Your use of the 110 | Licensed Material and that the Licensor has authority to license. 111 | 112 | h. Licensor means the individual(s) or entity(ies) granting rights 113 | under this Public License. 114 | 115 | i. Share means to provide material to the public by any means or 116 | process that requires permission under the Licensed Rights, such 117 | as reproduction, public display, public performance, distribution, 118 | dissemination, communication, or importation, and to make material 119 | available to the public including in ways that members of the 120 | public may access the material from a place and at a time 121 | individually chosen by them. 122 | 123 | j. Sui Generis Database Rights means rights other than copyright 124 | resulting from Directive 96/9/EC of the European Parliament and of 125 | the Council of 11 March 1996 on the legal protection of databases, 126 | as amended and/or succeeded, as well as other essentially 127 | equivalent rights anywhere in the world. 128 | 129 | k. You means the individual or entity exercising the Licensed Rights 130 | under this Public License. Your has a corresponding meaning. 131 | 132 | 133 | Section 2 -- Scope. 134 | 135 | a. License grant. 136 | 137 | 1. Subject to the terms and conditions of this Public License, 138 | the Licensor hereby grants You a worldwide, royalty-free, 139 | non-sublicensable, non-exclusive, irrevocable license to 140 | exercise the Licensed Rights in the Licensed Material to: 141 | 142 | a. reproduce and Share the Licensed Material, in whole or 143 | in part; and 144 | 145 | b. produce, reproduce, and Share Adapted Material. 146 | 147 | 2. Exceptions and Limitations. For the avoidance of doubt, where 148 | Exceptions and Limitations apply to Your use, this Public 149 | License does not apply, and You do not need to comply with 150 | its terms and conditions. 151 | 152 | 3. Term. The term of this Public License is specified in Section 153 | 6(a). 154 | 155 | 4. Media and formats; technical modifications allowed. The 156 | Licensor authorizes You to exercise the Licensed Rights in 157 | all media and formats whether now known or hereafter created, 158 | and to make technical modifications necessary to do so. The 159 | Licensor waives and/or agrees not to assert any right or 160 | authority to forbid You from making technical modifications 161 | necessary to exercise the Licensed Rights, including 162 | technical modifications necessary to circumvent Effective 163 | Technological Measures. For purposes of this Public License, 164 | simply making modifications authorized by this Section 2(a) 165 | (4) never produces Adapted Material. 166 | 167 | 5. Downstream recipients. 168 | 169 | a. Offer from the Licensor -- Licensed Material. Every 170 | recipient of the Licensed Material automatically 171 | receives an offer from the Licensor to exercise the 172 | Licensed Rights under the terms and conditions of this 173 | Public License. 174 | 175 | b. No downstream restrictions. You may not offer or impose 176 | any additional or different terms or conditions on, or 177 | apply any Effective Technological Measures to, the 178 | Licensed Material if doing so restricts exercise of the 179 | Licensed Rights by any recipient of the Licensed 180 | Material. 181 | 182 | 6. No endorsement. Nothing in this Public License constitutes or 183 | may be construed as permission to assert or imply that You 184 | are, or that Your use of the Licensed Material is, connected 185 | with, or sponsored, endorsed, or granted official status by, 186 | the Licensor or others designated to receive attribution as 187 | provided in Section 3(a)(1)(A)(i). 188 | 189 | b. Other rights. 190 | 191 | 1. Moral rights, such as the right of integrity, are not 192 | licensed under this Public License, nor are publicity, 193 | privacy, and/or other similar personality rights; however, to 194 | the extent possible, the Licensor waives and/or agrees not to 195 | assert any such rights held by the Licensor to the limited 196 | extent necessary to allow You to exercise the Licensed 197 | Rights, but not otherwise. 198 | 199 | 2. Patent and trademark rights are not licensed under this 200 | Public License. 201 | 202 | 3. To the extent possible, the Licensor waives any right to 203 | collect royalties from You for the exercise of the Licensed 204 | Rights, whether directly or through a collecting society 205 | under any voluntary or waivable statutory or compulsory 206 | licensing scheme. In all other cases the Licensor expressly 207 | reserves any right to collect such royalties. 208 | 209 | 210 | Section 3 -- License Conditions. 211 | 212 | Your exercise of the Licensed Rights is expressly made subject to the 213 | following conditions. 214 | 215 | a. Attribution. 216 | 217 | 1. If You Share the Licensed Material (including in modified 218 | form), You must: 219 | 220 | a. retain the following if it is supplied by the Licensor 221 | with the Licensed Material: 222 | 223 | i. identification of the creator(s) of the Licensed 224 | Material and any others designated to receive 225 | attribution, in any reasonable manner requested by 226 | the Licensor (including by pseudonym if 227 | designated); 228 | 229 | ii. a copyright notice; 230 | 231 | iii. a notice that refers to this Public License; 232 | 233 | iv. a notice that refers to the disclaimer of 234 | warranties; 235 | 236 | v. a URI or hyperlink to the Licensed Material to the 237 | extent reasonably practicable; 238 | 239 | b. indicate if You modified the Licensed Material and 240 | retain an indication of any previous modifications; and 241 | 242 | c. indicate the Licensed Material is licensed under this 243 | Public License, and include the text of, or the URI or 244 | hyperlink to, this Public License. 245 | 246 | 2. You may satisfy the conditions in Section 3(a)(1) in any 247 | reasonable manner based on the medium, means, and context in 248 | which You Share the Licensed Material. For example, it may be 249 | reasonable to satisfy the conditions by providing a URI or 250 | hyperlink to a resource that includes the required 251 | information. 252 | 253 | 3. If requested by the Licensor, You must remove any of the 254 | information required by Section 3(a)(1)(A) to the extent 255 | reasonably practicable. 256 | 257 | 4. If You Share Adapted Material You produce, the Adapter's 258 | License You apply must not prevent recipients of the Adapted 259 | Material from complying with this Public License. 260 | 261 | 262 | Section 4 -- Sui Generis Database Rights. 263 | 264 | Where the Licensed Rights include Sui Generis Database Rights that 265 | apply to Your use of the Licensed Material: 266 | 267 | a. for the avoidance of doubt, Section 2(a)(1) grants You the right 268 | to extract, reuse, reproduce, and Share all or a substantial 269 | portion of the contents of the database; 270 | 271 | b. if You include all or a substantial portion of the database 272 | contents in a database in which You have Sui Generis Database 273 | Rights, then the database in which You have Sui Generis Database 274 | Rights (but not its individual contents) is Adapted Material; and 275 | 276 | c. You must comply with the conditions in Section 3(a) if You Share 277 | all or a substantial portion of the contents of the database. 278 | 279 | For the avoidance of doubt, this Section 4 supplements and does not 280 | replace Your obligations under this Public License where the Licensed 281 | Rights include other Copyright and Similar Rights. 282 | 283 | 284 | Section 5 -- Disclaimer of Warranties and Limitation of Liability. 285 | 286 | a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE 287 | EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS 288 | AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF 289 | ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, 290 | IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, 291 | WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR 292 | PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, 293 | ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT 294 | KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT 295 | ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. 296 | 297 | b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE 298 | TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, 299 | NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, 300 | INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, 301 | COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR 302 | USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN 303 | ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR 304 | DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR 305 | IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. 306 | 307 | c. The disclaimer of warranties and limitation of liability provided 308 | above shall be interpreted in a manner that, to the extent 309 | possible, most closely approximates an absolute disclaimer and 310 | waiver of all liability. 311 | 312 | 313 | Section 6 -- Term and Termination. 314 | 315 | a. This Public License applies for the term of the Copyright and 316 | Similar Rights licensed here. However, if You fail to comply with 317 | this Public License, then Your rights under this Public License 318 | terminate automatically. 319 | 320 | b. Where Your right to use the Licensed Material has terminated under 321 | Section 6(a), it reinstates: 322 | 323 | 1. automatically as of the date the violation is cured, provided 324 | it is cured within 30 days of Your discovery of the 325 | violation; or 326 | 327 | 2. upon express reinstatement by the Licensor. 328 | 329 | For the avoidance of doubt, this Section 6(b) does not affect any 330 | right the Licensor may have to seek remedies for Your violations 331 | of this Public License. 332 | 333 | c. For the avoidance of doubt, the Licensor may also offer the 334 | Licensed Material under separate terms or conditions or stop 335 | distributing the Licensed Material at any time; however, doing so 336 | will not terminate this Public License. 337 | 338 | d. Sections 1, 5, 6, 7, and 8 survive termination of this Public 339 | License. 340 | 341 | 342 | Section 7 -- Other Terms and Conditions. 343 | 344 | a. The Licensor shall not be bound by any additional or different 345 | terms or conditions communicated by You unless expressly agreed. 346 | 347 | b. Any arrangements, understandings, or agreements regarding the 348 | Licensed Material not stated herein are separate from and 349 | independent of the terms and conditions of this Public License. 350 | 351 | 352 | Section 8 -- Interpretation. 353 | 354 | a. For the avoidance of doubt, this Public License does not, and 355 | shall not be interpreted to, reduce, limit, restrict, or impose 356 | conditions on any use of the Licensed Material that could lawfully 357 | be made without permission under this Public License. 358 | 359 | b. To the extent possible, if any provision of this Public License is 360 | deemed unenforceable, it shall be automatically reformed to the 361 | minimum extent necessary to make it enforceable. If the provision 362 | cannot be reformed, it shall be severed from this Public License 363 | without affecting the enforceability of the remaining terms and 364 | conditions. 365 | 366 | c. No term or condition of this Public License will be waived and no 367 | failure to comply consented to unless expressly agreed to by the 368 | Licensor. 369 | 370 | d. Nothing in this Public License constitutes or may be interpreted 371 | as a limitation upon, or waiver of, any privileges and immunities 372 | that apply to the Licensor or You, including from the legal 373 | processes of any jurisdiction or authority. 374 | 375 | 376 | ======================================================================= 377 | 378 | Creative Commons is not a party to its public licenses. 379 | Notwithstanding, Creative Commons may elect to apply one of its public 380 | licenses to material it publishes and in those instances will be 381 | considered the "Licensor." Except for the limited purpose of indicating 382 | that material is shared under a Creative Commons public license or as 383 | otherwise permitted by the Creative Commons policies published at 384 | creativecommons.org/policies, Creative Commons does not authorize the 385 | use of the trademark "Creative Commons" or any other trademark or logo 386 | of Creative Commons without its prior written consent including, 387 | without limitation, in connection with any unauthorized modifications 388 | to any of its public licenses or any other arrangements, 389 | understandings, or agreements concerning use of licensed material. For 390 | the avoidance of doubt, this paragraph does not form part of the public 391 | licenses. 392 | 393 | Creative Commons may be contacted at creativecommons.org. 394 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing 2 | 3 | This project is work of [many contributors](https://github.com/CT-CS5356-Fall2017/cs5356/graphs/contributors). 4 | You're encouraged to submit [pull requests](https://github.com/CT-CS5356Fall2017/cs5356/pulls), 5 | [propose features and discuss issues](https://github.com/CT-CS5356-Fall2017/cs5356/issues). 6 | 7 | In the examples below, substitute your Github username for `contributor` in URLs. 8 | 9 | ## Fork the Project 10 | 11 | Fork the [project on Github](https://github.com/CT-CS5356-Fall2017/cs5356) and check out your copy. 12 | 13 | ``` 14 | git clone https://github.com//cs5356.git 15 | cd cs5356 16 | git remote add upstream https://github.com/CT-CS5356-Fall2017/cs5356.git 17 | ``` 18 | 19 | ## Create a Topic Branch 20 | 21 | Make sure your fork is up-to-date and create a topic branch for your feature or bug fix. 22 | 23 | ``` 24 | git checkout master 25 | git pull upstream master 26 | git checkout -b my-feature-branch 27 | ``` 28 | 29 | ## Contribute 30 | 31 | Add your document, or make changes. 32 | 33 | ## Commit Changes 34 | 35 | Make sure git knows your name and email address: 36 | 37 | ``` 38 | git config --global user.name "Your Name" 39 | git config --global user.email "contributor@example.com" 40 | ``` 41 | 42 | Writing good commit logs is important. A commit log should describe what changed and why. 43 | 44 | ``` 45 | git add ... 46 | git commit 47 | ``` 48 | 49 | ## Push 50 | 51 | ``` 52 | git push origin my-feature-branch 53 | ``` 54 | 55 | ## Make a Pull Request 56 | 57 | Go to https://github.com/``/cs5356 and select your feature branch. 58 | Click the 'Pull Request' button and fill out the form. Pull requests are usually reviewed within a day or two. 59 | 60 | ## Rebase 61 | 62 | If you've been working on a change for a while, rebase with upstream/master. 63 | 64 | ``` 65 | git fetch upstream 66 | git rebase upstream/master 67 | git push origin my-feature-branch -f 68 | ``` 69 | 70 | ## Be Patient 71 | 72 | It's likely that your change will not be merged and that the nitpicky maintainers will ask you to do more, or fix seemingly benign problems. Hang on there! 73 | 74 | ## Thank You 75 | 76 | Please do know that we really appreciate and value your time and work. We love you, really. 77 | -------------------------------------------------------------------------------- /MIT-LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright (c) 2015 Cornell Tech, All Rights Reserved 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining 4 | a copy of this software and associated documentation files (the 5 | "Software"), to deal in the Software without restriction, including 6 | without limitation the rights to use, copy, modify, merge, publish, 7 | distribute, sublicense, and/or sell copies of the Software, and to 8 | permit persons to whom the Software is furnished to do so, subject to 9 | the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be 12 | included in all copies or substantial portions of the Software. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 15 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 16 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 17 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 18 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 19 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 20 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | CS 5356: Building Startup Systems (Fall 2017) 2 | =============================================== 3 | 4 | ![Cornell Tech](images/CT_logo1.png) 5 | 6 | Essentials 7 | ---------- 8 | 9 | * [Course Description](course/description.md) 10 | * [Grading](course/grading.md) 11 | * [Course Slack](https://ct-cs5356-fall2017.slack.com) 12 | * [Final Exam](./course/cal.md) 13 | 14 | Lectures 15 | -------- 16 | 17 | 1. 18-Oct: [GCP + Cloud Architecture](lectures/section_b/lecture_1.pdf) 18 | 2. 25-Oct: *No Class* 19 | 3. 01-Nov: [React Native](lectures/section_b/lecture_2.md) 20 | 4. 08-Nov: [Python + MongoDb](lectures/section_b/lecture_3.md) 21 | 5. 15-Nov: Orchestration + Mid-Course Checkpoint 22 | 6. 22-Nov: *No Class* 23 | 7. 07-Dec: [Project Grading](course/cal.md) 24 | 25 | Office Hours 26 | -------- 27 | 28 | * [Adam](/people/adam-fleming.md): Weds after class 'till no questions left 29 | * [Rahul](/people/rahul-chatterjee.md): Ping me on slack to schedule a meeting 30 | 31 | Course Project 32 | -------- 33 | 34 | We will be building a mobile app that connects "Man-in-Van" drivers with customers 35 | 36 | People 37 | ------ 38 | 39 | #### Instructor 40 | 41 | * [Adam Fleming](people/adam-fleming.md) 42 | 43 | 44 | #### Teaching Assistants 45 | 46 | * [Rahul Chatterjee](people/rahul-chatterjee.md) 47 | 48 | 49 | 50 | #### Teams 51 | * sugah_daddeez: 52 | * [Zen Yui](people/zen-yui.md) - jzy6 53 | * [Max Shatkhin](people/max-shatkhin.md) - ms3448 54 | * [Thomas Matecki](people/thomas-matecki.md) - tpm93 55 | 56 | * Ghost Robots: 57 | * [Devon Bain](people/devon-bain.md) - dwb264 58 | * [Zeeshan Hanif](people/zeeshan-hanif.md) - zh278 59 | * [Subhangi Agarwala](people/subhangi-agarwala.md) - sa2265 60 | 61 | * R2DC 62 | * [Christy Cui](people/christy-cui.md) 63 | * [Daniel Kim](people/daniel-kim.md) 64 | * [Ryan Ramphal](people/ryan-ramphal.md) 65 | 66 | * The Munchies 67 | * [Marco Berlot](people/marco-berlot.md) 68 | * [Jake Magid](people/jake-magid.md) 69 | * [Vicente Rotman Hinzpeter](people/vicente-rotman-hinzpeter.md) 70 | 71 | * tyche: 72 | * [Kripa Agarwal](people/kripa-agarwal.md) - ka467 73 | * [Kriti Singh](people/kriti-singh.md) - ks2259 74 | * [Mohit Chawla](people/mohit-chawla.md) - mc2683 75 | 76 | * this_team_is_on_fiyahhh 77 | * [Yuhui Dai](people/yuihui-dai.md) 78 | * [Matthew Hsu](people/matthew-hsu.md) 79 | * [Aleo Mok](people/aleo-mok.md) 80 | 81 | * Marshmallow on fire 82 | * [Kelly Wang](people/chenyang-wang.md) 83 | * [Yian Mo](people/yian-mo.md) 84 | * [Vinson Wang](people/vinson-wang.md) 85 | 86 | * Despacitos 87 | * [David Hachuel](people/david-hachuel.md) 88 | * [Rom Cohen](people/rom-cohen.md) 89 | * [Liran Sharir](people/liran-sharir.md) 90 | 91 | * afroTruckers 92 | * [Oluseye Bankole](people/seye-bankole.md) 93 | * [Saliou Diallo](people/saliou-diallo.md) 94 | 95 | * Keep Calm and Nothing Else 96 | * [Emily Tseng](people/emily-tseng.md) 97 | * [Marco White](people/marco-white.md) 98 | * [Luke Ahn](people/luke-ahn.md) 99 | 100 | * KVD 101 | * [Kirollos Morkos](people/kirollos-morkos.md) - krm257 102 | * [Vijay Pillai](people/vijay-pillai.md) - vp296 103 | * [Derek Netto](people/derek-netto.md) - dfn22 104 | 105 | * Lit 106 | * [Han Jing](people/han-jing.md) 107 | * [Noshin Nisa](people/noshin-anjum-nisa.md) 108 | * [Jamie Yu](people/jamie-yu.md) 109 | 110 | * romadoe 111 | * [Romoli Bakshi](people/romoli-bakshi.md) - rb636 112 | * [Advika Nigam](people/advika-nigam.md) - an556 113 | * [Junhsiang (Joe) Liao](people/junhsiang-liao.md) - jl3744 114 | 115 | * Menace to Sobriety 116 | * [Stephen Bongner](people/stephen-bongner.md) - sb2483 117 | * [Brett Leibowitz](people/brett-leibowitz.md) - bal246 118 | * [Rongxin Zhang](people/rongxin-zhang.md) - rz345 119 | 120 | * The Eigenfaces 121 | * [Sarah Le Cam](people/sarah-le-cam.md) - sdl83 122 | * [Eyvind Niklasson](people/eyvind-niklasson.md) - een7 123 | * [Jared Wong](people/jared-wong.md) - jmw535 124 | 125 | * Mr. Lonely 126 | * [Travis Allen](people/travis-allen.md) - twa24 127 | 128 | * Impromptu 129 | * [Anmol Seth](people/anmol-seth.md) - as3664 130 | * [Vincent Wang](people/jialiang-wang.md) - jw2476 131 | * [Luna Yang](people/luna-yang.md) - ly354 132 | 133 | * The Greate Fire Wall 134 | * [Weisi Zhang](people/weisi-zhang.md) - wz337 135 | * [Evan Kaplan](people/evan-kaplan.md) - emk269 136 | * [Ang Li](people/ang-li.md) - al2386 137 | 138 | * GOAT 139 | * [Joe Abi Sleiman](people/joe-abi-sleiman.md) - jba68 140 | * [Andi Mitre](people/andi-mitre.md) - am2886 141 | * [Feston Kastrati](people/feston-kastrati.md) - fk257 142 | 143 | * I Love Computer Science 144 | * [Cameron Boroumand](people/cameron-boroumand.md) - cb596 145 | * [Steven Jaroslawski](people/steven-jaroslawksi.md) - sj393 146 | 147 | Copyright & License 148 | ------------------- 149 | (c) 2017 [Cornell Tech](http://www.cs.cornell.edu), All Rights Reserved. 150 | All source code is licensed under the [MIT License](MIT-LICENSE.txt). 151 | All content is licensed under the [Creative Commons Attribution 4.0 International License](CC-BY-4.0-LICENSE.txt). 152 | 153 | ![](https://i.creativecommons.org/l/by/4.0/88x31.png) 154 | -------------------------------------------------------------------------------- /assignments/a1/a1.md: -------------------------------------------------------------------------------- 1 | *Important! No Pull Requests submitted after 11:59 on Tuesday Aug 29 will be considered. 2 | If you submit a PR at 11:59 and your PR needs work, the PR will be rejected and you 3 | will not be able to re-submit* 4 | 5 | Assignment 1 (10 Points) 6 | ------------ 7 | 8 | This is the first assignment of the course! 9 | There are two parts of this assignment. 10 | 11 | 1. First create a static website hosted in Amazon using S3. You 12 | can look at [the 13 | tutorial](http://docs.aws.amazon.com/AmazonS3/latest/dev/website-hosting-custom-domain-walkthrough.html) 14 | to get started with Amazon Web Services (AWS) and S3 in particular. 15 | 16 | Your website should serve a file called `grading.html`. Assuming your domain is `http://ec2-yourdomain-someip.com/`, 17 | the url `http://ec2-yourdomain-someip.com/grading.html` should be available. The file should only contain your 18 | netid ONLY, no html tags whatsoever. 19 | 20 | Checkout [this](https://typtop.info/grading.html) for an example. 21 | 22 | 23 | 2. Add your name, netid, and the url for your `grading.html` page to the course Github repo. Do this by editing the page 24 | README.md and submitting a pull request. Add your name in the appropriate place (please keep names in alpha order 25 | by last name) and using this formatting exactly: 26 | 27 | ```text 28 | [Your Name](people/your-name.md) - yn444 - [https://ec2-yourdomain-someip.com/grading.html](https://ec2-yourdomain-someip.com/grading.html) 29 | ``` 30 | 31 | Make sure the names are in alphabetical order. (It's a good exercise to get conflict and resolving it.) 32 | 33 | This is the [grading script](grade_a1.sh) that will be used to grade the assignment. You can run it yourself to verify you will receive credit for the assignment: 34 | 35 | ```bash 36 | $ bash grade_a1.sh 37 | ``` 38 | ### Things that may go wrong. 39 | * Your pull request might conflict with others. So, either make sure your branch is uptodate 40 | with [`CT-CS5356-Fall2017/cs5356`](https://github.com/CT-CS5356-Fall2017/cs5356/), or fix the conflict on GitHub. 41 | Please don't delete changes made by someone else in the process of merging, or your pull request (PR) will surely 42 | be rejected. 43 | 44 | * The script is returning error while your url in browser runs fine. Ping us in Slack. 45 | 46 | 47 | -------------------------------------------------------------------------------- /assignments/a1/grade_a1.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | USAGE="A cute little grading script for Assignment 1.\n\ 3 | Call the script like, \n\n\ 4 | $ bash $0 \n\n\ 5 | If the output is ' Success', then you are good!\n" 6 | set -e 7 | if [ $# -lt 1 ]; then 8 | echo -e $USAGE 9 | exit -1 10 | fi 11 | 12 | giturl='https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/master/README.md' 13 | function get_url() { 14 | # curl --silent $giturl | grep "$1" | awk -F' - ' '{print $2, $3}' | sed 's/\(\w*\)*\s\+\[.*\](\(.*\))/\1 \2/g' 15 | curl --silent $giturl | grep "$1" | awk -F' - ' '{print $2, $3}' | perl -pe 's/(\w+) \[.*\]\((.*)\)/\1 \2/g' 16 | } 17 | 18 | r=$(get_url $1) 19 | netid=$(echo $r | cut -d' ' -f1) 20 | url=$(echo $r | cut -d' ' -f2) 21 | echo "URL found form GitHub: $url" 22 | 23 | 24 | function connection_check() { 25 | url=$1 26 | if curl --silent --fail -r 0-10 "$url"; then 27 | echo "Connection Succeeded" >&2 28 | else 29 | echo "Could not reach: $url" >&2 30 | exit -1 31 | fi 32 | } 33 | 34 | 35 | ret=$(connection_check $url) 36 | if [ "$ret" == "$netid" ]; then 37 | echo "Congrats! Everything works fine." 38 | else 39 | echo "The netid in the server ($ret) and in the github ($netid) does not match" 40 | exit -1 41 | fi 42 | set +e 43 | -------------------------------------------------------------------------------- /assignments/a2/a2.md: -------------------------------------------------------------------------------- 1 | Assignment 2: Deploy a RESTful Back-end (40 Points) 2 | --- 3 | *Due Tuesday Sep 5th at midnight* (Late submission are allowed, but there will be a penality of -10 points.) 4 | 5 | This assignment is the first step towards building a functional backend for 6 | the final project - building a receipt storage and indexing service. The goal of this assignment 7 | is to familiarize you with REST architecture, the CircleCI Continuous Integration tool, and 8 | the mechanism by which one can deploy software to the cloud. 9 | 10 | We will not worry about session management and access control---an user can read / write any receipt. 11 | We will not worry about setting up an external database - we will use H2 (which 12 | supports the MySQL SQL Dialect). 13 | 14 | To complete the assignment you must complete the following: 15 | 1. Configure CircleCI to run on the `master` branch in your repo 16 | 2. Add a CircleCI build-status badge to README.md 17 | 3. Build a RESTful API that supports operations on `receipts` and `tags` 18 | 4. Deploy the API to AWS 19 | 5. Submit 20 | 21 | ## 1. Configuring CircleCI 22 | [CircleCI](http://circleci.com/) is a cloud-based tool for building software. CircleCI seamlessly integrates with 23 | GitHub to detect when a change is made, at which point CircleCI will execute a series of build-steps that are 24 | defined in the file `.circleci/config.yml` which must be added to your GitHub repository. 25 | 26 | When you initially log into CircleCI you should see a [Dashboard](https://circleci.com/dashboard) showing recent builds. 27 | A **Projects** menu-option on the left-hand side will help you configure your repo. Choose 28 | **Add Project**, select the repository you want to setup by clicking **Setup Project** next to your repository name, and 29 | finally select the OS (linux), Platform (2.0) and Language (Gradle/Java). 30 | 31 | Circle will reward your efforts here by preparing a sample `config.yml` along with detailed instructions you should 32 | follow carefully to get your CI system setup. The sample `config.yml` will work without modification, however you 33 | should not be afraid to dive into the excellent [CircleCI Docs](https://circleci.com/docs/2.0/) to add custom 34 | build steps such as building a docker-image. 35 | 36 | Once CircleCI is setup, every time you push changes to GitHub CircleCI will detect the change and will follow the steps 37 | defined in `config.yml`. By should always include *checking out the new code* and *running the tests*. `build.gradle` 38 | in the `skeleton` repo is already setup to run any tests that are annotated with `@Test`. You can check this yourself 39 | by running the `test` target e.g. `./gradlew test`. 40 | 41 | ## 2. Setting up a CircleCI build status badge 42 | **Important** - adding your build status badge to `README.md` in the class GitHub is the *only* way to get credit for 43 | setting up CircleCI. You can get the code for *your badge* by copying it from the **Status Badges** section of the 44 | **Settings** page for your project in CircleCI. 45 | 46 | To get credit for the assignment you must add the badge as a suffix to your line in the **Students** section 47 | of the `README.md`, you must write at least one non-trivial test, and CircleCI must run the test + pass. 48 | 49 | A working test is available in the `skeleton` project at `src/test/java/api/CreateReceiptRequestTest.java` 50 | 51 | ## 3. Build a RESTful API 52 | The API we are building is relatively simple, and only supports operations on two 53 | resources: `receipts` and `tags`. The basic idea is that one should be able to create new 54 | receipts, *categorize* them by using user-defined *tags*, and retrieve receipts *by-tag*. 55 | 56 | Endpoints required to support this functionality with inputs and outputs are summarized below. All endpoints must 57 | return `200/OK` if the operation completed successfully. 58 | 59 | ### POST /receipts 60 | **Effect:** Create a new receipt. Every receipt should have an `UNSIGNED INT` primary key which 61 | is returned by this endpoint. No duplicate detection or uniqueness constraints are required. New 62 | receipts are un-tagged. 63 | 64 | **Request Body:** 65 | ```javascript 66 | { 67 | "merchant": "foo", /* required! */ 68 | "amount": 22.45 /* optional, must be valid decimal if provided */ 69 | } 70 | ``` 71 | **Response:** 72 | ``` 73 | 33 /* <-- this is the id of the newly-created un-tagged receipt */ 74 | ``` 75 | 76 | ### GET /receipts 77 | **Effect:** Return a list of all receipts in the system. 78 | 79 | **Request Body:** 80 | *None* 81 | 82 | **Response:** 83 | ```json 84 | [ 85 | { 86 | "id": 5, 87 | "merchant": "Gerry's Ice Cream", 88 | "amount": 22.50 89 | }, 90 | { 91 | "id": 3, 92 | "merchant": "Starbux" 93 | } 94 | ] 95 | ``` 96 | 97 | ### PUT /tags/{tag} 98 | **Effect:** Categorize a receipt by tagging it. Tags are simple short character strings that are user-defined, 99 | (not pre-defined). To associate a receipt with two tags, this endpoint would need to be executed twice - once for each tag. If a receipt is *already* tagged with a specific tag (say "t1"), the effect of hitting this endpoint (for "t1") will be to un-tag the receipt for the specific tag, but no other tags will be affected. 100 | 101 | **Request Body** 102 | ```json 103 | 35 /* <-- this is the id of the receipt to tag / untag */ 104 | ``` 105 | 106 | **Response** 107 | *None* / no response is required from the server beyond a 200/OK HTTP Response code. To do this using 108 | the `JAX-RS` framework, simply declare your endpoint function to return `void`. e.g. 109 | 110 | ```java 111 | @PUT 112 | @Path("/tags/{tag}") 113 | public void toggleTag(@PathParam("tag") String tagName) { 114 | // 173 | ``` 174 | Here, `` should be your server url (without the angle brackets), e.g., 175 | `python grade_a2.py http://localhost:8080`. 176 | You might need to install a Python library called `requests` used for making http requests very easily. 177 | Installing library in python is simple. You can use `pip`, a Python package manager, do install `request` library. 178 | `pip install requests`. You can install `pip` from https://pip.pypa.io/en/stable/installing/. 179 | 180 | 181 | **UPDATE** 182 | Added support to check CircleCI badge directly from the Github. Once your PR is approved, you can 183 | run `python grade_a2.py -github `. It will fetch the submitted URL, and the circle CI 184 | badge and perform the tests that we will check during grading. 185 | 186 | 187 | 188 | -------------------------------------------------------------------------------- /assignments/a2/grade_a2.py: -------------------------------------------------------------------------------- 1 | from __future__ import print_function 2 | import random 3 | import string 4 | import json, sys 5 | import re 6 | try: 7 | import requests 8 | except ImportError: 9 | print("It seems like you don't have 'requests' library.\n" 10 | "Install it using pip (https://pip.pypa.io/en/stable/installing/).\n" 11 | "$ pip install requests\n\n" 12 | "And then rerun this file. $ python grade_a2.py ") 13 | exit(-1) 14 | 15 | URL = None 16 | 17 | def random_tag(n=4): 18 | return ''.join(random.choice(string.ascii_uppercase + string.digits) 19 | for _ in range(4)) 20 | 21 | 22 | def get_receipts(): 23 | url = URL + '/receipts' 24 | r = requests.get(url) 25 | if not r.ok: 26 | print("ERROR: Failed while GETting {}".format(url)) 27 | return -1 28 | return r.json() 29 | 30 | def post_receipts(num=1): 31 | url = URL + '/receipts' 32 | d = {'merchant': 'M' + str(num), "amount": num} 33 | r = requests.post(url, json=d) 34 | if not r.ok: 35 | print("ERROR: Failed while POSTing {} with json={!r}".format(url, d)) 36 | return -1 37 | rid = r.text 38 | return rid 39 | 40 | 41 | def put_tags(rid, tag): 42 | url = URL + "/tags/{}".format(tag) 43 | d = rid 44 | r = requests.put(url, json=d) 45 | if not r.ok: 46 | print("Failed while PUTting {} with json={!r}".format(url, d)) 47 | return -1 48 | return 0 49 | 50 | 51 | def get_receipts_by_tag(tag): 52 | url = URL + "/tags/{}".format(tag) 53 | r = requests.get(url) 54 | if not r.ok: 55 | print("ERROR: Failed while GETting {}".format(url)) 56 | return -1 57 | return r.json() 58 | 59 | 60 | def test_netid(netid): 61 | url = URL + "/netid" 62 | print("-"*80) 63 | print(">>> Testing: 'GET /netid'") 64 | try: 65 | r = requests.get(url) 66 | except requests.exceptions.ConnectionError: 67 | print("ERROR: It seems the server down. Check in your browser if the\n" 68 | "url ({}) is working".format(url)) 69 | exit(-1) 70 | if not r.ok: 71 | print("ERROR: Failed while GETting {}".format(url)) 72 | return -1 73 | if not netid: 74 | print("NetId found: {} (unverified)".format(r.text)) 75 | else: 76 | if netid in r.text: 77 | print("Netid ({}) matched from the url={}!".format(netid, url)) 78 | else: 79 | print("Your supplied netid={!r} not found at url={}".format(netid, url)) 80 | return -1 81 | return 0 82 | 83 | 84 | 85 | def test_tag_association(): 86 | print("-"*80) 87 | print(">>> Testing: Tag_Association (post + put + get)") 88 | # Post three receipts 89 | rids = [int(post_receipts()) for i in range(3)] 90 | test_get_receipts() 91 | 92 | # Randomly generate two tags 93 | tags = [random_tag() for i in range(2)] 94 | 95 | a = list(range(3)) 96 | random.shuffle(a) 97 | tag_assoc = { 98 | # add one tag to two of the receipts 99 | tags[0]: [rids[a[0]], rids[a[1]]], 100 | 101 | # add another tag to remaining receipt 102 | tags[1]: [rids[a[2]]] 103 | } 104 | 105 | # PUT the tags accordingly 106 | for t, _rids in tag_assoc.items(): 107 | for _rid in _rids: 108 | put_tags(_rid, t) 109 | 110 | # Fetch the receitps based on each tag, and verify the association 111 | for t, _rids in tag_assoc.items(): 112 | _rids.sort() 113 | r = get_receipts_by_tag(t) 114 | if r == -1: 115 | print("ERROR: Get receipts for tag ({}) failed. Stopping!" 116 | "Probably there are other erros above.".format(t)) 117 | return -1 118 | rid_tag = sorted([int(t['id']) for t in r]) 119 | if rid_tag != _rids: 120 | print("ERROR: Returned receipts for tag={} is incorrect.\n" 121 | "Expected: {}\n" 122 | "Found: {}".format(t, _rids, rid_tag)) 123 | return -1 124 | print("Test: Tag_Association passed successfully.") 125 | print("Testing tag deletion") 126 | for t, _rids in tag_assoc.items(): 127 | put_tags(_rids[0], t) 128 | 129 | for t, _rids in tag_assoc.items(): 130 | r = get_receipts_by_tag(t) 131 | rid_tag = [int(t['id']) for t in r] 132 | if _rids[0] in rid_tag: 133 | print("ERROR: Returned receipts for tag={} is incorrect.\n" 134 | "Expected: {}\n" 135 | "Found: {}".format(t, _rids[1:], rid_tag)) 136 | return -1 137 | print("Test: Tag deletion also worked!! Hurray!") 138 | 139 | return 0 140 | 141 | 142 | def test_get_receipts(): 143 | print("-"*80) 144 | print(">>> Testing: GET /receipts") 145 | r = get_receipts() 146 | json.dump(r, sys.stderr, indent=2, sort_keys=True) 147 | 148 | 149 | def extract_netid_and_url(line): 150 | regex = r'\* \[.*\]\(.*\) - (?P\w+) \- \[.+\]\((?Phttp.+)\)\s*\[\!\[CircleCI\]\((?P.*)\)\]\(.*\)\s*' 151 | m = re.match(regex, line) 152 | if not m: 153 | print(line) 154 | exit(-1) 155 | return m.group('netid', 'url', 'circleurl') 156 | 157 | 158 | def test_circleCI(url): 159 | r = requests.get(url) 160 | assert r.ok 161 | if 'PASSED' in r.text: 162 | print("CircleCI passed!") 163 | return 0 164 | else: 165 | print("CircleCI failed.") 166 | return -1 167 | 168 | 169 | def get_github_student_url(netid): 170 | """ 171 | Obtain the student list from the github page. 172 | """ 173 | url = 'https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/master/README.md' 174 | r = requests.get(url) 175 | assert r.ok 176 | text = r.text 177 | for l in text.split('\n'): 178 | if netid in l: 179 | return extract_netid_and_url(l) 180 | return None, None, None 181 | 182 | 183 | if __name__ == "__main__": 184 | USAGE = """ 185 | $ python {0} -github # To test the final submission 186 | or 187 | $ python {0} # For just testing the url you created is working or not. 188 | """.format(sys.argv[0]) 189 | netid=None 190 | r = 0 191 | if len(sys.argv)<2: 192 | print(USAGE) 193 | exit(-1) 194 | if len(sys.argv)>2 and sys.argv[1] == '-github': 195 | netid, URL, circleurl = get_github_student_url(sys.argv[2]) 196 | if not circleurl: 197 | print("Could not find circleurl={!r}".format(circleurl)) 198 | else: 199 | r += test_circleCI(circleurl) 200 | else: 201 | URL = sys.argv[1] 202 | URL = URL.rstrip('/') 203 | print("The url found: {}".format(URL)) 204 | if not URL.startswith('http'): 205 | print("The url does not look like one (should start with http..).\n" 206 | "May be you meant 'python {} -github {}".format(*sys.argv)) 207 | exit(-1) 208 | r += test_netid(netid) 209 | if r==0: 210 | r = test_tag_association() 211 | if r==0: 212 | print("\nGreat everything worked!") 213 | else: 214 | print("Something is not right. See above") 215 | -------------------------------------------------------------------------------- /assignments/a3/a3.md: -------------------------------------------------------------------------------- 1 | Assignment 3: Build a Single Page Application (20 Points) 2 | --- 3 | *Due Sep 19 (Tuesday) at 11:58pm* 4 | 5 | This assignment is the first step towards building a functional application for receipt 6 | tracking and cataloging service. The goal of this assignment 7 | is to build a working HTML, CSS + Java Script single-page application that uses the 8 | REST server you built in the last homework. 9 | 10 | You will need to write and test the application, and ultimately deploy the application 11 | to the cloud. 12 | 13 | **No additional PR's are necessary unless you change your server url.** 14 | 15 | To complete the assignment you must complete the following: 16 | 1. Build a SPA (Single Page Application) that conforms to the UI Spec 17 | 2. Integrate your SPA into your Server 18 | 3. Deploy the API to AWS 19 | 20 | Do **NOT** use page auto-reload(e.g., using `location.reload()`) to refresh the changes. 21 | You are supposed to update the DOM elements on the fly using Javascript. 22 | 23 | 24 | *Important: Modern browser security restricts scripts running on particular 25 | domains to that domain only. If you are developing and encounter errors 26 | regarding Mixed Media or Same-origin policy, you can cautiously consider 27 | disabling security in your browser for development purposes. To do this on OSX, 28 | you must quit Chrome completely and then start Chrome from the command-line with special flags:* 29 | ``` 30 | /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --allow-running-insecure-content --args --disable-web-security --user-data-dir 31 | ``` 32 | 33 | If you have Firefox, you can use 34 | [CORS](https://addons.mozilla.org/en-US/firefox/addon/cors-everywhere/) plugin, 35 | that will allow to evade the browser security checks. Once installed you have to 36 | activate it by clicking the small plugin icon on the status bar (top right, 37 | probably). Remember to disable it when you are not testing your app---the 38 | security checks in the browser are there for good reason and disabling them 39 | with this plugin might be problematic. So use it carefully. 40 | 41 | 42 | 43 | ## 1. Building the SPA 44 | Your assignment is to create a Single-Page Application that uses the API you 45 | created in Assignment A2 to store and retrieve receipts, and add and delete tags. 46 | 47 | To make the assignment to be *auto-grade-able*, you must follow specific conventions outlined 48 | in this document with respect to the structure of your HTML and the use of class and id attributes 49 | in specific locations. 50 | 51 | Beyond these simple constraints, you are free to style and compose your application as you see fit: 52 | 53 | #### Initial Sate 54 | ![](is.png) 55 | 56 | When your application opens, your application should query and display all receipts in the database. 57 | Fields for Time, Merchant, Amount and tags are required. 58 | 59 | 0. All receipts should be under a `DIV` with the id `receiptList`. E.g., `
` node. 60 | 1. Every receipt must be represented by a single element of the form `
...
`. The receipt element may have any internal structure you desire. 62 | Receipts must be selectable using `$('.receipt')`. 63 | 64 | 2. Every receipt must have the following fields available: `merchant`, `amount` and `tags`. 65 | * The merchant must be selectable using the following JQuery selector: `$('.merchant', $('.receipt')[0]).text()`. 66 | * The amount must be selectable using the following JQuery selector: `$('.amount', $('.receipt')[0]).text()`. Don't add any '$' or white spaces around the amounts in the column. 67 | * The tags must be selectable using the following JQuery selector: `$('.tags', $('.receipt')[0]).text()`. 68 | 69 | #### Add New Receipt 70 | ![](ar.png) 71 | 72 | Clicking on the ‘add receipt’ button should add a receipt-entry node to the DOM that allows the user to enter a new receipt with merchant (required) and amount (optional) values. Hitting ‘save’ will POST to the `/receipts` endpoint of your API. Hitting `cancel` will close the form and discard any values entered. Errors from the server should appear somewhere in the receipt-entry node so the user can understand and correct any problems. 73 | 74 | 1. The add button for receipts MUST have id `add-receipt` and be selectable via `$('#add-receipt')`. A `click` event 75 | fired on the element should show the add-receipt dialogue box. 76 | 77 | 2. You must use `INPUT` elements for the ‘merchant’ and ‘amount’ entry, and the `INPUT` elements must have id's `#merchant` and `#amount`. 78 | 79 | 3. The save and cancel button must have ids `save-receipt` and `cancel-receipt` and respond to `click` events. 80 | 81 | 82 | #### Add Tags to Existing Receipts 83 | ![](at.png) 84 | 85 | The application supports the tagging of receipts with arbitrary user-defined tags. 86 | 87 | * Every receipt row must have a button with class `add-tag` that responds to `click` events. When clicked, an `INPUT` element with class `tag_input` must be added to the DOM **as a child of the receipt row upon which add-tag was clicked** and should be selectable by JQuery using `$('INPUT.tag_input', receiptNode)`. The input element should execute a `PUT` request against your `PUT /tags/{tag}` API when the user strikes the `Enter` key in the `INPUT` element. 88 | 89 | * The result of a successful `PUT` operation is the removal of the `tag_input` element from the DOM, and the addition of an element displaying the name of the tag now associated with the receipt. 90 | 91 | * Tag elements must have a `tagValue` class attribute, and the value of the tags for a particular 92 | receipt must be selectable via e.g. `$('.tagValue', receiptNode)` 93 | 94 | * Tag elements must respond to `click` events which execute a `PUT` request against your API to 95 | dissociate the receipt from the tag that was clicked. 96 | 97 | 98 | ## 2. Integrate the SPA into your Server 99 | Adam will provide a snippet of code to support you in this regard. Update your [Skeleton](https://github.com/amfleming/skeleton) code from Adam's repo, and look at [this commit](https://github.com/amfleming/skeleton/commit/9a8925afa9756cad50a21d1cbf42f8d8deb66d4f). 100 | 101 | ## 3. Deploy to AWS 102 | Exactly the same as we did in Assignment 02. 103 | 104 | ## 4. [Auto-grader](grade_a3.py) 105 | Testing UI requires some extra maneuvers! We will use `Selenium` with `Firefox` browser to automate the testing. 106 | For this you have to do two things. 107 | 1. install Python `selenium` library (`pip install selenium`), 108 | 2. download Firefox web driver from https://github.com/mozilla/geckodriver/releases, extract it, and copy the binary to your `PATH`. 109 | For Linux/OSX move that binary to `/usr/local/bin/'. For windows follow the detailed instruction given in http://selenium-python.readthedocs.io/installation.html. 110 | 111 | After this, run the [auto-grader script](grade_a3.py) as, 112 | ```bash 113 | $ python grade_a3.py 114 | ``` 115 | 116 | E.g., `python grade_a3.py http://localhost:8080` 117 | 118 | Let me know if you find issues in the code. 119 | Make sure your server is running! I used Python 3.6 to test the script in my machine. 120 | 121 | 122 | -------------------------------------------------------------------------------- /assignments/a3/ar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/assignments/a3/ar.png -------------------------------------------------------------------------------- /assignments/a3/at.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/assignments/a3/at.png -------------------------------------------------------------------------------- /assignments/a3/geckodriver: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/assignments/a3/geckodriver -------------------------------------------------------------------------------- /assignments/a3/grade_a3.py: -------------------------------------------------------------------------------- 1 | import sys 2 | import requests 3 | import random 4 | import string 5 | import re 6 | import time 7 | 8 | try: 9 | from selenium import webdriver 10 | from selenium.webdriver.common.keys import Keys 11 | except ImportError: 12 | print(""" 13 | Install selenium for python. `pip install -U selenium`. You also have to download 14 | Selenium Gecko Webdirver binary from https://github.com/mozilla/geckodriver/releases. 15 | 16 | How to install this driver can be found https://selenium-python.readthedocs.io/installation.html#drivers.\n 17 | For Linux and Mac, you can just unzip and copy the driver into /usr/local/bin/. 18 | For Windows, you can follow the instructions in the page. 19 | """) 20 | exit(-1) 21 | 22 | DEBUG = 1 23 | def random_tag(n=4): 24 | return ''.join(random.choice(string.ascii_uppercase + string.digits) 25 | for _ in range(n)) 26 | 27 | 28 | def get_tags(receipt_e): 29 | return [ 30 | t.text 31 | for t in receipt_e.find_elements_by_class_name('tagValue') 32 | ] 33 | 34 | 35 | def get_all_receipts(driver): 36 | """ 37 | Parse all the receipts in a page 38 | $($('#receiptList')[0], '.receipt') 39 | """ 40 | for rs in driver.find_elements_by_css_selector('#receiptList .receipt'): 41 | m = rs.find_element_by_class_name('merchant').text 42 | a = rs.find_element_by_class_name('amount').text 43 | tags = get_tags(rs) 44 | # created = rs.find_element_by_class_name('created').text 45 | yield { 46 | 'merchant': m, 47 | 'amount': a, 48 | 'tags': tags, 49 | # 'created': created 50 | } 51 | 52 | 53 | def add_receipts(driver): 54 | e = driver.find_element_by_id('add-receipt') 55 | e.click() 56 | m = 'M__' + random_tag(3) 57 | a = int(random.random() * 10000)/100 58 | driver.find_element_by_id('merchant').send_keys(str(m)) 59 | driver.find_element_by_id('amount').send_keys(str(a)) 60 | driver.find_element_by_id('save-receipt').click() 61 | return m, a 62 | 63 | 64 | def add_tag(e): 65 | """ Adds a random tag to te element e """ 66 | tag = random_tag(8) 67 | e.find_element_by_class_name('add-tag').click() 68 | 69 | e.find_element_by_class_name('tag_input')\ 70 | .send_keys(tag) 71 | e.find_element_by_class_name('tag_input')\ 72 | .send_keys(Keys.ENTER) 73 | # driver.find_elements_by_class_name('save-tag').click() 74 | return tag 75 | 76 | def set_up(url): 77 | driver = webdriver.Firefox() 78 | driver.implicitly_wait(1) 79 | driver.get(url) 80 | return driver 81 | 82 | def test_add_receipts(driver): 83 | """ 84 | Adds a receipt and checks if the receipt is available in the page 85 | or not. 86 | """ 87 | print("-"*80) 88 | print("Test: Adding a receipt") 89 | print("-"*80) 90 | 91 | driver = driver 92 | time.sleep(1) 93 | old_receipts = list(get_all_receipts(driver)) 94 | m, a = add_receipts(driver) 95 | 96 | if DEBUG>=2: 97 | driver.refresh() 98 | time.sleep(1) 99 | new_receipts = list(get_all_receipts(driver)) 100 | if len(old_receipts) + 1 != len(new_receipts): 101 | print("old_receipts={}\n>> new_receipts={}" 102 | .format(old_receipts, new_receipts)) 103 | return -1 104 | found = False 105 | if DEBUG: 106 | print("#receipts-old: {}, #receipts-new: {}" 107 | .format(len(old_receipts), len(new_receipts))) 108 | for i, rs in enumerate(new_receipts): 109 | if str(rs['merchant']) == str(m) and str(rs['amount']) == str(a): 110 | found = True 111 | break 112 | elif DEBUG: 113 | print("{}. Found (but not testing): {}".format(i, rs)) 114 | 115 | if not found: 116 | print( 117 | "ERROR: I don't see the receipt I just inserted with \n" 118 | "merchant={!r} and amount={!r}".format(m, a) 119 | ) 120 | return -1 121 | print("Success!!!") 122 | print('<>'*40 + '\n') 123 | return 0 124 | 125 | def test_add_tag(driver): 126 | """ 127 | Adds tag to a randomly chosen receipts, and test if the tag appears in 128 | the page. 129 | """ 130 | print("-"*80) 131 | print("Test: Adding a tag") 132 | print("-"*80) 133 | 134 | time.sleep(1) 135 | # Get all receipts 136 | receipts = driver.find_elements_by_class_name('receipt') 137 | 138 | # Choose a receipt randomly to add tag 139 | i = random.randint(0, len(receipts)-1) 140 | e = receipts[i] 141 | 142 | # Click on the add-tag element 143 | old_tags = get_tags(e) 144 | tag = add_tag(e) 145 | if DEBUG>=2: 146 | driver.refresh() # Probably don't require 147 | 148 | time.sleep(4) 149 | # Fetch the new receipts again 150 | receipts = driver.find_elements_by_class_name('receipt') 151 | e = receipts[i] 152 | 153 | new_tags = get_tags(e) 154 | added_tags_ = list(set(new_tags) - set(old_tags)) 155 | if len(added_tags_) != 1 or tag not in added_tags_[0]: 156 | print(""" 157 | ERROR: The number of newly added tags did not match. 158 | Expected: {!r}, Found: {!r}""".format([tag], added_tags_)) 159 | return -1 160 | print("Success!!!") 161 | print('<>'*40 + '\n') 162 | return 0 163 | 164 | 165 | def test_del_tag(driver): 166 | """ 167 | Selects a random receipt and delets its one of the tag. 168 | """ 169 | print("-"*80) 170 | print("Test: Deleting a tag") 171 | print("-"*80) 172 | # Select a random receipt 173 | receipts = driver.find_elements_by_class_name('receipt') 174 | index_of_random_receipt = random.randint(0, len(receipts)-1) 175 | e = receipts[index_of_random_receipt] 176 | 177 | # Click on the add-tag element 178 | tags = get_tags(e) 179 | if not tags: 180 | add_tag(e) 181 | receipts = driver.find_elements_by_class_name('receipt') 182 | e = receipts[index_of_random_receipt] 183 | tags = get_tags(e) 184 | 185 | time.sleep(1) 186 | e_tag = random.choice(e.find_elements_by_class_name('tagValue')) 187 | tag = e_tag.text 188 | e_tag.click(); time.sleep(1) 189 | 190 | # Receipts DOM might have been deleted or re-drawn, pull it again 191 | receipts = driver.find_elements_by_class_name('receipt') 192 | e = receipts[index_of_random_receipt] 193 | new_tags = get_tags(e) 194 | removed_tag_ = list(set(tags) - set(new_tags)) 195 | if len(removed_tag_) != 1 or removed_tag_[0] != tag: 196 | print(""" Removed tags: {} (Should be only [{}])" 197 | """.format(removed_tag_, tag)) 198 | print("""This error might not be your fault. Either my code or the Selenium driver is 199 | buggy. Report this problem to us. We will fix it, but in the mean time make 200 | sure the deletion works on UI, and no more errors are reported before this line. 201 | """) 202 | return -1 203 | else: 204 | print("Success!!!") 205 | print('<>'*40 + '\n') 206 | return 0 207 | 208 | def test_no_duplicate_tag(driver): 209 | """ 210 | Tests that no duplicate tags are present in any of the receipt rows. 211 | """ 212 | print("-"*80) 213 | print("Test: Duplicate tag in any receipt") 214 | print("-"*80) 215 | 216 | for i,rs in enumerate(driver.find_elements_by_class_name('receipt')): 217 | l = list(get_tags(rs)) 218 | if len(l) != len(set(l)): 219 | print("There are duplicate tags in the {}-th receipt line"\ 220 | .format(i)) 221 | print("Found tag: {!r}".format(l)) 222 | return -1 223 | print("Success!!!") 224 | print('<>'*40 + '\n') 225 | return 0 226 | 227 | def tearDown(driver): 228 | driver.quit() 229 | 230 | def extract_netid_and_url(line): 231 | regex = r'\* \[.*\]\(.*\) - (?P\w+) \- \[.+\]\((?Phttp.+)\)\s*\[\!\[CircleCI\]\((?P.*)\)\]\(.*\)\s*' 232 | m = re.match(regex, line) 233 | if not m: 234 | print(line) 235 | exit(-1) 236 | return m.group('netid', 'url', 'circleurl') 237 | 238 | def get_github_student_url(netid): 239 | """ 240 | Obtain the student list from the github page. 241 | """ 242 | url = 'https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/master/README.md' 243 | r = requests.get(url) 244 | assert r.ok 245 | text = r.text 246 | for l in text.split('\n'): 247 | if netid in l: 248 | return extract_netid_and_url(l) 249 | return None, None, None 250 | 251 | 252 | if __name__ == "__main__": 253 | # Parse commandline 254 | USAGE = """ 255 | $ python {0} -github # To test the final submission 256 | or 257 | $ python {0} # For just testing the url you created is working or not. 258 | """.format(sys.argv[0]) 259 | url = None 260 | netid=None 261 | r = 0 262 | if len(sys.argv)<2: 263 | print(USAGE) 264 | exit(-1) 265 | if len(sys.argv)>2 and sys.argv[1] == '-github': 266 | netid, url, circleurl = get_github_student_url(sys.argv[2]) 267 | else: 268 | url = sys.argv[1] 269 | driver = set_up(url) 270 | r = 0 271 | try: 272 | r += 1 + test_add_receipts(driver) 273 | if (r>=0): 274 | r += 1 + test_add_tag(driver) 275 | if (r>0): 276 | r += 1 + test_del_tag(driver) 277 | if (r>0): 278 | r += 1 + test_no_duplicate_tag(driver) 279 | except (AssertionError, ImportError) as e: 280 | print("=======") 281 | print("Error:", e) 282 | print("=======\n") 283 | print("Something went wrong. Test the each of the tests manually and make sure it\n" 284 | "is working. If yes, check the IDs and class names in your html\n" 285 | "file matches what is dictated in the README file.\n\n" 286 | "Meaning of some of the common errors. \n") 287 | print("\"Element not visible\": Your server might be too slow. Find the line\n" 288 | "'implicitly_wait' in the auto-grader and change the wait time from\n" 289 | " 5 sec to something more like 15 or 20.") 290 | 291 | finally: 292 | tearDown(driver) 293 | -------------------------------------------------------------------------------- /assignments/a3/is.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/assignments/a3/is.png -------------------------------------------------------------------------------- /assignments/a4/a4.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # Assignment 4: Connect to Google Vision API (30 Points) 4 | 5 | This is the last assignment for the course. We will finish our work of building a 6 | receipt storing service by extending the functionality with Optical Character 7 | Recognition (OCR) using [Google Cloud Vision 8 | API](https://cloud.google.com/vision/). The purpose of the OCR integration is to 9 | speed the entry of receipts. The output of successful OCR is suggestions for 10 | new receipt creation, specifically `Merchant` and `Amount`. 11 | 12 | **TL;DR** 13 | The goal is to add a button to capture image of a receipt, process the image to 14 | extract the merchant and the total amount, and prompt the user to add the 15 | receipt with suggested merchant and amount from OCR. 16 | 17 | ## 0. Setup Google Vision API 18 | Here is a video of the steps required to create a service account, download 19 | the api key file, and enable the Google Vision API: 20 | [Setup Video](./setup.mp4). **Restrict Access of your service key.** While 21 | creating the service key, click on the dropdown `Role`, and select `Roles` > 22 | `Role Viewer`. 23 | ![How to set roles?](./roles.png). 24 | The service account key, by default, has lot more permission than you want 25 | them to have. Restricting the role will ensure that the key is not misused. 26 | 27 | 29 | 31 | Fetch the updated [`Skeleton`](https://github.com/amfleming/skeleton) code, which is 32 | already updated with a controller for querying Vision API. You have to update 33 | it with correct `gc_api_file.json` that you downloaded form setup step above. 34 | Set the environment variable `GOOGLE_APPLICATION_CREDENTIALS=./gc_api_file.json`. 35 | In Linux, MAC, Windows Cygwin shell org Git Bash, this can be done by running `export 36 | GOOGLE_APPLICATION_CREDENTIALS=./gc_api_file.json`, just before calling `gradle run`. 37 | 38 | 39 | ## 1. Extracting merchant name and total price 40 | Google OCR will return the text recovered from the captured image. From the 41 | returned text you have to extract the merchant name and the total price. We 42 | will use two simple heuristic to extract these information. Get the extracted 43 | text sorted vertically from top to bottom. Assume the top-most non-numerical 44 | text is the `merchant`, and the last decimal text (of the format `23.45`, or 45 | `43.00`) is the `total`. 46 | 47 | You must create the following endpoint, which accepts as input a `Base64` 48 | encoded string representing a PNG image, and returns a JSON object of the 49 | form `{"merchantName": ..., "amount": ...}`. 50 | 51 | 52 | Assuming you are running your server locally and you have a file containing a 53 | base-64-encoded PNG in `receipt_img.png.b64`, the following CURL request should 54 | succeed: 55 | ``` 56 | curl -H 'Content-Type: text/plain' --data "@./receipt_img.png.b64" localhost:8080/images 57 | ``` 58 | 59 | ## 2. Capturing a photo of a receipt 60 | You should have a button your page (preferably beside the current add button 61 | for receipts) for starting the camera. The button should be selectable by 62 | the selector `$('#start-camera')`. Clicking the button should start the 63 | camera. There should be a button selectable by `$('#take-pic')`, clicking 64 | which will capture the photo. Also, once the `#take-pic` is clicked it should 65 | trigger a call to the backend to run OCR on the taken image using Google 66 | Vision API. Finally, you must destroy the `video` DOM element and transfer 67 | the suggestions from OCR into two user-editable inputs that show the results 68 | of the OCR parsing. If the user is happy with the results, they should be 69 | able to add the new receipt with the suggestions (or modify the suggestions, 70 | or cancel). It is reasonable to re-use your 'Add Receipt' form from A3 here. 71 | 72 | There should be a cancel button that should close the video and should cancel 73 | the process of adding a receipt. The id of that button should be 74 | `take-pic-cancel`. 75 | 76 | The UX for this assignment should follow ![this spec](./spec.png) 77 | 78 | Code we wrote in class is [in this plnkr](https://plnkr.co/edit/yhAOTeADsTYeRcgqJ3hr?p=preview) 79 | 80 | 88 | 89 | ## 3. Deploy in AWS 90 | Finally deploy your updated code in AWS. Update the 91 | [`README.md`](../../README.md) **if and only if** your URL changed. We will 92 | grade your assignment using that URL you attached in the 93 | [`README.md`](../../README.md) file. 94 | 95 | ## 4. Testing + Auto grader 96 | - Chrome only allows access to devices (the camera) in Secure Contexts. That means SSL-enabled websites, and when 97 | developing using `localhost`. If you want to test your site once it is deployed, you will need to set a special 98 | flag unless you have configured SSL in order to get access to the camera 99 | ``` 100 | /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --unsafely-treat-insecure-origin-as-secure="http://your-site-url-here" --user-data-dir=/tmp 101 | ``` 102 | 103 | - To test using a specific receipt (OSX), you can set some special flags that feed a pre-defined 104 | video as the video device as below. 105 | (Sample receipts iinclude [receipt_vid.y4m](./receipt_vid.y4m) which should produce `{"merchantName":"Main","amount":29.01}` and 106 | [cappones.y4m](./cappones.y4m) which should produce `{"merchantName":"Cappones","amount":28.86}`) 107 | ```bash 108 | /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --use-fake-device-for-media-stream --use-file-for-fake-video-capture=receipt_vid.y4m --use-fake-ui-for-media-stream --user-data-dir=/tmp 109 | ``` 110 | - R.I.P. Autograder. We'll be grading this assignment by-hand. To get full credit you should make sure that the following things are true: 111 | - Receipts can be added by-hand per A3 (no regressions!) 112 | - Tags can be added + removed per A3 (no regresions!) 113 | - It is possible, per the UX for this assignment, click a button that opens the camera 114 | - You can take a snapshot of whatever image is visible in the Video element 115 | - The image data is sent to the server 116 | - An algorithm satisfying this assignment is executed on the results of GV's OCR 117 | - The results of the algorithm are fed into the manual-entry form, which works per A3 118 | 119 | ## 5. Retain old functionalities. 120 | Please make sure that your server have all the functionalities specified in A2 and A3, especially `/netid` endpoint. 121 | 122 | 123 | # Extra Credit 124 | Two forms of extra credit are possible on this assignment. 125 | 126 | ## EC1. Custom Domain (+3 pts) 127 | Purchase a custom domain for your application and setup DNS. [[Tutorial](http://docs.aws.amazon.com/Route53/latest/DeveloperGuide/routing-to-ec2-instance.html)] 128 | Your DNS configuriation should create an `A Record` that points to your ECS instance. 129 | 130 | ... Unless of course you choose to setup SSL! In which case: 131 | 132 | ## EC2. Setup SSL (+5 pts) 133 | Setup a load balancer for your application (ALB or ELB). Use Amazon 134 | [AWS Certificate Manager](https://aws.amazon.com/blogs/aws/new-aws-certificate-manager-deploy-ssltls-based-apps-on-aws/) 135 | to generate an SSL Certificate. Apply the certificate to the 136 | load balancer. To get credit for this, Chrome must display a 137 | Green Lock when your site is loaded: 138 | 139 | ![](https://media.amazonwebservices.com/blog/2016/ssl_tls_indicator_on_amazon_site_1.png) 140 | 141 | To get credit for SSL, **you must also setup a custom domain** 142 | You cannot get credit for SSL without setting up a custom domain. 143 | 144 | ## EC3. Thumbnails (+12 pts) 145 | For receipts created via image capture, crop the image used for OCR 146 | and display it in your app as a thumbnail. 147 | 148 | To determine the cropping dimensions, you must compute the *Minimum Bounding Rectangle* that 149 | includes all the OCR-recognized text. Crop to the *MBR* and display the cropped image 150 | in your application. Visually the method for determining appropriate crop is below: 151 | 152 | ![](receipt_cropping_method.png) 153 | -------------------------------------------------------------------------------- /assignments/a4/cappones.y4m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/assignments/a4/cappones.y4m -------------------------------------------------------------------------------- /assignments/a4/grade_a4.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | 4 | const puppeteer = require('puppeteer'); 5 | const _ = require('lodash'); 6 | const crypto = require('crypto'); 7 | const path = require('path'); 8 | 9 | // For Server 10 | const express = require('express'); 11 | const morgan = require('morgan'); 12 | const fs = require('fs'); 13 | 14 | const video_url = [ 15 | 'receipt_vid.y4m', 16 | 'cappones.y4m' 17 | ]; 18 | 19 | const receipt_matchers = [ 20 | rcpt_json => /"Main/.test(rcpt_json) && /29\.01/.test(rcpt_json), 21 | rcpt_json => /"Cappones/.test(rcpt_json) && /28\.86/.test(rcpt_json) 22 | ] 23 | const video_idx = Math.floor(Math.random() * 2); 24 | 25 | function rand_string(n) { 26 | var text = ""; 27 | var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; 28 | 29 | for (var i = 0; i < n; i++) 30 | text += possible.charAt(Math.floor(Math.random() * possible.length)); 31 | return text; 32 | } 33 | 34 | async function add_receipt(page) { 35 | var rcpt = { 36 | merchant: 'M_' + rand_string(4), 37 | amount: (Math.floor(Math.random() * 10000)/100.0).toString(), 38 | tags: [] 39 | } 40 | await page.click('#add-receipt'); 41 | // Enter merchant 42 | await page.click('#merchant'); 43 | await page.type(rcpt.merchant); 44 | 45 | // Enter amount 46 | await page.click('#amount'); 47 | await page.type(rcpt.amount); 48 | 49 | await page.click('#save-receipt'); 50 | return rcpt; 51 | } 52 | 53 | function add_tag(i, tag) { 54 | var sel = '#receiptList .receipt'; 55 | var rcpt_elem = $(sel)[i]; 56 | // alert(rcpt_elem + ' --> ' + sel + ' --> ' + i); 57 | var e_up = jQuery.Event("keyup", {which: 13, keyCode: 13}); 58 | var e_press = jQuery.Event("keypress", {which: 13, keyCode: 13}); 59 | $('.add-tag', rcpt_elem).click(); 60 | $('.tag_input', rcpt_elem).val(tag).trigger(e_up).trigger(e_press); 61 | console.log($('.tagValue', rcpt_elem).text()); 62 | } 63 | 64 | function del_tag(i) { 65 | const sel = '#receiptList .receipt'; 66 | const rcpt_elem = $(sel)[i]; 67 | // alert(rcpt_elem + ' --> ' + sel + ' --> ' + i); 68 | const e_up = jQuery.Event("keyup", {which: 13, keyCode: 13}); 69 | const e_press = jQuery.Event("keypress", {which: 13, keyCode: 13}); 70 | const tags = $('.tagValue', rcpt_elem); 71 | const j = Math.floor(Math.random() * tags.length); 72 | const tag_val = $(tags[j]).text().trim(); 73 | $(tags[j]).click(); 74 | return tag_val; 75 | } 76 | 77 | 78 | /* Tests if the additional element is in the updated_list */ 79 | function test_addition(original_list, updated_list, expected, thing='', ret_log={}) { 80 | // Compute the set of 'diffs' (those in the updated list, but not in original list) 81 | let diffs = _.map(updated_list, JSON.stringify); 82 | original_list.forEach(orig => { 83 | let idx = _.indexOf(diffs, JSON.stringify(orig)); 84 | _.pullAt(diffs, idx); 85 | }); 86 | 87 | if (diffs.length !== 1) { 88 | ret_log['msg'] += `Expected 1 ${thing} to be added. Got ${diffs.length} additions`; 89 | ret_log['failed'] = 1; 90 | return ret_log; 91 | } 92 | 93 | let matches = function(comparable, expected) { 94 | if(_.isFunction(expected)) 95 | return expected(comparable); 96 | return _.trim(comparable) == _.trim(JSON.stringify(expected)); 97 | } 98 | 99 | if(matches(diffs[0], expected)) { 100 | ret_log['msg'] = "Test passed!!"; 101 | ret_log['failed'] = 0; 102 | } else { 103 | ret_log['msg'] += "Could not find the " + thing + " just added." 104 | ret_log['msg'] += `\nexpected: ${JSON.stringify(expected)}\n got: ${diffs[0]}`; 105 | ret_log['failed'] = 1; 106 | } 107 | 108 | return ret_log; 109 | } 110 | 111 | 112 | async function test_add_receipt(page) { 113 | const curr_rcpts = await page.evaluate(get_receipts); 114 | const added_rcpt = await add_receipt(page); 115 | const new_rcpts = await page.evaluate(get_receipts); 116 | var ret_log = { 117 | test : "<--- Running add_receipt test --->", 118 | msg : '', 119 | action: { 120 | 'added_receipt': added_rcpt 121 | } 122 | } 123 | ret_log = test_addition(curr_rcpts, new_rcpts, added_rcpt, 'receipt', ret_log); 124 | return ret_log; 125 | } 126 | 127 | function get_tags(i) { 128 | const rcpt_elem = document.querySelectorAll('#receiptList .receipt')[i]; 129 | const anchors = Array.from(rcpt_elem.querySelectorAll('.tags .tagValue')); 130 | return anchors.map(anchor => anchor.textContent.trim()); 131 | } 132 | 133 | async function test_del_tag(page) { 134 | var rcpts = await page.$$('.receipt'); 135 | if (rcpts.length == 0) { 136 | return { 137 | test : "<--- Running del_tag test --->", 138 | msg : 'There is no receipt to add tag. Please add a receipt first.', 139 | failed: 1 140 | } 141 | } 142 | var i = Math.floor(Math.random() * rcpts.length); 143 | var new_tags = await page.evaluate(get_tags, i); 144 | var t = 0; 145 | while (new_tags.length == 0) { 146 | t += 1; 147 | await page.evaluate(add_tag, i, 't_' + rand_string(4)); 148 | 149 | new_tags = await page.evaluate(get_tags, i); 150 | console.log("Tags before deletion:", new_tags); 151 | if (t>5) { 152 | console.log( "Could not add tag. Del tag will fail."); 153 | break; 154 | } 155 | } 156 | // Delete tag experiment 157 | var deleted_tag = await page.evaluate(del_tag, i); 158 | var tags_after_deletion = await page.evaluate(get_tags, i); 159 | var ret_log = { 160 | test : "<--- Running del_tag test --->", 161 | msg : '', 162 | action: { 163 | 'deleted_tag': deleted_tag 164 | } 165 | } 166 | 167 | return test_addition(tags_after_deletion, new_tags, deleted_tag, 'tag', ret_log) 168 | } 169 | 170 | async function test_add_tag(page) { 171 | var tag = {tag: 't_' + rand_string(4)}; 172 | // Sample a random receipt 173 | var rcpts = await page.$$('.receipt'); 174 | var i = Math.floor(Math.random() * rcpts.length); 175 | 176 | var ret_log = { 177 | test : "<--- Running add_tag test --->", 178 | msg : '', 179 | action: { 180 | 'add_tag_at_receipt': [tag.tag, i] 181 | } 182 | } 183 | // Add tag experiment 184 | console.log("Adding tag", i) 185 | const old_tags = await page.evaluate(get_tags, i); 186 | await page.evaluate(add_tag, i, tag.tag); 187 | const new_tags = await page.evaluate(get_tags, i); 188 | // var x_mark = ' x'; 189 | // if (!new_tags[0].endsWith(' x')) 190 | // x_mark = ''; 191 | ret_log = test_addition( 192 | old_tags, new_tags, tag.tag, // TODO: Add a regex here. 193 | 'tag', ret_log 194 | ) 195 | 196 | return ret_log; 197 | } 198 | 199 | async function test_snap(page) { 200 | const receipt_matcher = receipt_matchers[video_idx]; 201 | var ret_log = { 202 | test : "<--- Running snap_receipt test --->", 203 | msg : '', 204 | action: { 205 | 'snap_receipt_from_video': video_url[video_idx], 206 | 'expected_receipt': receipt_matcher 207 | } 208 | } 209 | const original_receipts = await page.evaluate(get_receipts); 210 | await page.click('#start-camera') 211 | console.log("Camera started and waiting for server to respond"); 212 | await page.click('#take-pic'); 213 | try { 214 | await page.waitForFunction('$("#merchant").val() != ""', {timeout: 10000}) 215 | } catch (e) { 216 | ret_log['msg'] = "Clicking on 'take-pic' never exposed a non-empty 'merchant' input box. " + 217 | "Common cause is using `takePhoto()` - use `grabFrame()` instead"; 218 | ret_log['failed'] = 1; 219 | return ret_log; 220 | } 221 | 222 | await page.waitForSelector('#save-receipt', {visible: true}).then( 223 | () => page.click('#save-receipt') 224 | ); 225 | 226 | const new_rcpts = await page.evaluate(get_receipts); 227 | ret_log = test_addition( original_receipts, new_rcpts, receipt_matcher, 'receipt', ret_log); 228 | return ret_log; 229 | } 230 | 231 | 232 | function get_receipts() { 233 | function get_tags(rcpt_elem) { 234 | const anchors = Array.from(rcpt_elem.querySelectorAll('.tags .tagValue')); 235 | return anchors.map(anchor => anchor.textContent); 236 | } 237 | 238 | const anchors = Array.from(document.querySelectorAll('#receiptList .receipt')); 239 | return anchors.map(function(anchor) { 240 | return { 241 | merchant: anchor.querySelector('.merchant').textContent, 242 | amount: anchor.querySelector('.amount').textContent, 243 | tags: get_tags(anchor) 244 | } 245 | }); 246 | } 247 | 248 | var test_func_list = { 249 | add_receipt: test_add_receipt, 250 | add_tag: test_add_tag, 251 | del_tag: test_del_tag, 252 | add_receipt_by_snap: test_snap 253 | } 254 | 255 | async function runTest(url, tests=[], headless=true) { 256 | // const url_hash = crypto.createHash('md5').update('asdfasdf') 257 | // .digest('hex').substring(0, 8); 258 | // console.log(path.join('/tmp/', url_hash)); 259 | const browser = await puppeteer.launch({ 260 | headless: headless, 261 | slowMo: 100, 262 | userDataDir: path.join('/tmp/test/'), 263 | args: [ 264 | '--use-fake-device-for-media-stream', 265 | '--use-fake-ui-for-media-stream', 266 | '--unsafely-treat-insecure-origin-as-secure='+url, 267 | '--use-file-for-fake-video-capture=' + video_url[video_idx], 268 | ] 269 | }); 270 | try { 271 | browser.version().then(msg => console.log(msg)); 272 | 273 | const page = await browser.newPage(); 274 | await page.goto(url, {waitUntil: 'networkidle'}); 275 | var console_logs = []; 276 | page.on('console', msg => console_logs.push(msg)); 277 | 278 | await page.waitForSelector('#add-receipt'); 279 | var ret_log = {}; 280 | for(var i=0; i { 333 | var json_ret = JSON.stringify(ret, null, 4); 334 | res.send(req.query.url + '
' + json_ret + '
') 335 | }); 336 | } 337 | }) 338 | 339 | app.get('/', function(req, res) { 340 | res.sendFile(path.join(__dirname, 'index.html')); 341 | }); 342 | 343 | 344 | const commandLineArgs = require('command-line-args') 345 | 346 | const optionDefinitions = [ 347 | { name: 'server', alias: 'v', type: Boolean }, 348 | { name: 'tests', type: String, multiple: true, defaultValue: Object.keys(test_func_list)}, 349 | { name: 'url', alias: 't', type: String, defaultOption: true }, 350 | { name: 'headless', alias: 'h', type: Boolean, defaultValue: false}, 351 | ] 352 | 353 | function main () { 354 | const options = commandLineArgs(optionDefinitions) 355 | if (options.server) { 356 | // Start the server 357 | app.listen(5000, function () { 358 | console.log('Server listening on port 5000!') 359 | }); 360 | } else { 361 | if (!options.url) { 362 | console.log("A url is required"); 363 | console.log("$ node grade_a4.js --url --tests", Object.keys(test_func_list).join(' ')); 364 | } else { 365 | runTest(options.url, options.tests, options.headless).then( 366 | ret => console.dir(ret) 367 | ); 368 | } 369 | } 370 | } 371 | 372 | main(); 373 | -------------------------------------------------------------------------------- /assignments/a4/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | Assignment 4 Auto-grader 12 | 17 | 18 | 19 | 20 |
21 |

Auto-grader for Assignment 4

22 |
23 | Enter your URL and press submit. It will run the following tests. 24 |
    25 |
  • Add receipt by entering the merchant name and amount.
  • 26 |
  • Add receipt by takingthe receipt video.
  • 27 |
  • Add a tag to a receipt.
  • 28 |
  • Delete a tag froma a receipt.
  • 29 |
30 | If you get all 'failed': 0 , you are good. 31 |
32 |
33 |
34 |
35 | Enter your server URL
36 | 37 | 40 | 43 | 46 | 49 |
50 | 51 |
52 |
53 |
54 | 55 | -------------------------------------------------------------------------------- /assignments/a4/open_site.js: -------------------------------------------------------------------------------- 1 | #!/usr/local/bin/node 2 | 3 | const rp = require('request-promise'); 4 | const _ = require('lodash'); 5 | 6 | function die(msg) { 7 | console.log(msg); 8 | process.exit(1); 9 | } 10 | 11 | if(process.argv.length !== 3) 12 | die('wrong args'); 13 | 14 | let netid = process.argv[2]; 15 | if(!/[a-z]+[0-9]+/.test(netid)) 16 | die(`"${netid}" not a netid`); 17 | 18 | rp.get('https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/master/README.md') 19 | .then(html => { 20 | console.log(`searching site for ${netid}`); 21 | let re = new RegExp(`^.+${netid}.+$`); 22 | let matches = _.filter(html.split('\n'), line => line.match(re)); 23 | 24 | if(matches.length === 0) 25 | die('no results found'); 26 | 27 | if(matches.length > 1) 28 | die('too many results found'); 29 | 30 | let line = matches[0]; 31 | matches = line.match(/http[^\]]+/); 32 | if(matches.length !== 1) 33 | die('could not extract url'); 34 | 35 | var url = matches[0]; 36 | console.log(`spawning chromium with ${url}`); 37 | let cp = require('child_process').spawn( 38 | './node_modules/puppeteer/.local-chromium/mac-499413/chrome-mac/Chromium.app/Contents/MacOS/Chromium', 39 | [ 40 | `--unsafely-treat-insecure-origin-as-secure=${url}`, 41 | `--use-file-for-fake-video-capture=cappones.y4m`, 42 | `--use-fake-ui-for-media-stream`, 43 | `--use-fake-device-for-media-stream`, 44 | `--user-data-dir=/tmp/bzz`, 45 | `${url}` 46 | ], 47 | { 48 | detach: true, 49 | stdio: 'ignore' 50 | } 51 | ); 52 | cp.unref(); 53 | }); 54 | -------------------------------------------------------------------------------- /assignments/a4/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "grading", 3 | "version": "1.0.0", 4 | "description": "Grading CS5356 - Fall2017", 5 | "main": "index.js", 6 | "dependencies": { 7 | "command-line-args": "^4.0.7", 8 | "express": "^4.16.1", 9 | "lodash": "^4.17.4", 10 | "morgan": "^1.9.0", 11 | "nodemon": "^1.12.1", 12 | "npm": "^5.4.2", 13 | "puppeteer": "^0.11.0", 14 | "request": "^2.83.0", 15 | "request-promise": "^4.2.2" 16 | }, 17 | "devDependencies": {}, 18 | "scripts": { 19 | "test": "echo \"Error: no test specified\" && exit 1" 20 | }, 21 | "repository": { 22 | "type": "git", 23 | "url": "git+https://github.com/rchatterjee/cs5356-grading.git" 24 | }, 25 | "keywords": [], 26 | "author": "", 27 | "license": "ISC", 28 | "bugs": { 29 | "url": "https://github.com/rchatterjee/cs5356-grading/issues" 30 | }, 31 | "homepage": "https://github.com/rchatterjee/cs5356-grading#readme" 32 | } 33 | -------------------------------------------------------------------------------- /assignments/a4/receipt_cropping_method.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/assignments/a4/receipt_cropping_method.png -------------------------------------------------------------------------------- /assignments/a4/receipt_vid.y4m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/assignments/a4/receipt_vid.y4m -------------------------------------------------------------------------------- /assignments/a4/roles.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/assignments/a4/roles.png -------------------------------------------------------------------------------- /assignments/a4/setup.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/assignments/a4/setup.mp4 -------------------------------------------------------------------------------- /assignments/a4/spec.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/assignments/a4/spec.png -------------------------------------------------------------------------------- /course/cal.md: -------------------------------------------------------------------------------- 1 | # Final Project Grading Schedule 2 | The final grading of CS5356 (Advanced Startup Systems) will be done on **Dec 7, 2017** from 10:00 am till 4:30 pm EST. 3 | Here is the schedule. 4 | * Each team will get total **15 minutes** - 10 minutes to present all 5 | the functionalities and 5 minutes for Q&A. 6 | * You will graded on [these points](./grading.md); so prepare your live demo to show all the functionalities that fetches you 7 | the maximum points. 8 | * All team members must be present and participate in the final demo and Q&A. 9 | 10 | 11 | ## Grading date: Dec 7, 2017 (Thursday) 12 | ## Location: Bloomberg 178, Cornell Tech 13 | 14 | 15 | ## First half (10:00 to 13:00) 16 | | # | Team name | Members | Slot | 17 | |---|-------| --------| -----| 18 | |1 | `sugah_daddeez`| jzy6, ms3448, tpm93 | 10:00 - 10:15 | 19 | |2 | `Ghost Robots` | dwb264, zh278, sa2265 | 10:15 - 10:30| 20 | |3 | `R2DC` | hc935, rdr233, dk768 | 10:30 - 10:45 | 21 | |4 | `The Munchies` | mb2589, jm2644, vr328 | 10:45 - 11:00 | 22 | |5 | `romadoe` | rb636, an556, jl3744 | 11:00 - 11:15| 23 | |-- | *Break* | -- | *11:15 - 11:30* | 24 | |6 | `this_team_is_on_fiyahhh`| yd229, mdh267, anm232 | 11:30 - 11:45| 25 | |7 | `Menace to Sobriety` | sb2483, bal246, rz345 |11:45 - 12:00| 26 | |8 | `Mr. Lonely ` | twa24 | 12:00 - 12:15| 27 | |9 | `afroTruckers` | ob97, sdd65 | 12:15 - 12:30 | 28 | |10 | `Keep Calm and Nothing Else`| et397, mt279, la393 | 12:30 - 12:45| 29 | |11 | `KVD` | krm257,vp296,dfn22 | 12:45 - 13:00| 30 | 31 | 32 | ## Second half (14:00 - 16:30) 33 | | # | Team name | members | slot | 34 | |---|-------| --------| -----| 35 | |12 | `The Eigenfaces` | sdl83, een7, jmw535 | 14:00 - 14:15| 36 | |13 | Available | N/A | 14:15 - 14:30 | 37 | |14 | Avaliable | N/A | 14:30 - 14:45| 38 | |15 | Available | N/A | 14:45 - 15:00| 39 | |16 | `Despacitos` | dh649, rc783, ls873 | 15:00 - 15:15| 40 | |-- | Available | N/A | *15:15 - 15:30* | 41 | |17 | `Impromptu` | as3664, jw2476, ly354 | 15:30 - 15:45| 42 | |18 | `The Greate Fire Wall` | wz337, emk269, al2386 | 15:45 - 16:00| 43 | |19 | `GOAT` | jba68, am2886, fk257 | 16:00 - 16:15 | 44 | |20 | `I Love Computer Science` | cb596, sj393 | 16:15 - 16:30 | 45 | |21 | `Lit` | hj378, nan42, jky32 | 16:30 - 16:45| 46 | |22 | `tyche` |ka467, ks2259, mc2683 | 16:45 - 17:00| 47 | |23 | `Marshmallow on fire` | ym443, cw823, xw466 | 17:00 - 17:15 | 48 | 49 | -------------------------------------------------------------------------------- /course/description.md: -------------------------------------------------------------------------------- 1 | Logistics 2 | --------- 3 | 4 | * Bloomberg Center 131 at Cornell Tech, 2 W Loop Rd, New York, NY 10044. 5 | * Class is on Wednesdays 3:10pm - 5:50pm. 6 | * First class is on October 18, last class is on November 22. 7 | 8 | ### Attendance 9 | 10 | This class does not record attendance, there's no need to inform anyone if you must miss a class. 11 | 12 | ### Description 13 | 14 | The digital age is making it easier, faster and cheaper to develop new products and services that directly address 15 | societal, commercial needs. Cornell Tech Studio classes give our students tools to imagine and design such products and 16 | services. Cornell Tech technical classes give our students the depth to come up with innovative solutions to make such 17 | products and services real. 18 | 19 | The goal of the "Building Startup Systems" class is to give our students a concrete experience of designing, 20 | implementing and deploying a workable system that can be demo-ed and/or used by early users. 21 | The "Building Startup Systems" class is a 1-credit course, 3 hours per week for 5 weeks. The class will run 22 | October 18-November 22. 23 | 24 | The class will be anchored around the design, implementation and deployment of a typical webapp. 25 | The topics will be presented in the context of a project that all students will have to work on. 26 | The class will also bring together some software engineering best practices. Students will work on the project in pairs 27 | (note: each student will be paired twice for the duration of the class). 28 | 29 | 30 | 31 | ### Prerequisites 32 | 33 | * Comfortable managing systems, processes, and editing files using only unix shell 34 | * Experience with at least one well-typed or compiled language (Scala, Java, C++, etc.) 35 | * Experience with at least one scripted language (JavaScript, Ruby, PHP, node.js, Python, etc.) 36 | * Experience with HTML and CSS. 37 | 38 | -------------------------------------------------------------------------------- /course/grading.md: -------------------------------------------------------------------------------- 1 | ### Grading 2 | 3 | Course grading is based only completion and sophistication of the course project. 4 | 5 | Points are earned through building the systems required to support the class project. You will work as a team, however the points you earn as an individual are determined by the product of the *points for the work* x *your understanding of the work*. Points for the work and your understanding for the work will be judged in an in-person interview taking ~20 mins during finals week, by class staff. 6 | 7 | There are 4 buckets you can earn points in, based on the *sophistication*, *quality* and *your understanding* of the work. 8 | 9 | The buckets are: 10 | 11 | 1. *Mobile Client* 12 | 2. *API* 13 | 3. *Database* 14 | 4. *DevOps* 15 | 16 | You can earn a number of points per bucket per project based on your accomplishments 17 | in that domain. 18 | 19 | 20 | #### Mobile Client 21 | 22 | * +1 point for having a mobile app than makes API calls 23 | * +1 point for a realistic worklflow that encompases all reasonable app features 24 | * +1 point for stunning UX with animated transitions or fantastic mapping features 25 | * +1 point for completion of BOTH driver and hailer sides of app (these can be one app with a bifurcated UX based on user-type) 26 | 27 | #### API 28 | * +1 point for running server application 29 | * +1 point for database logic 30 | * +1 point for Swagger.io (or similar) self-generating API docs 31 | * +1 point for 3rd party API integration (e.g. sending SMS messages or Push Notifications) 32 | 33 | #### Database 34 | * +1 point for having a database with a reasonable schema 35 | * +1 point for 2 or more collections or tables 36 | * +1 point for driver / user selfie images, captured on device + stored in the cloud 37 | 38 | #### DevOps 39 | * +1 point for material tests and working CI 40 | * +1 point for automated deployment by the CI tool if tests pass 41 | 42 | 43 | ## Grading 44 | ``` 45 | 13 pts - A+ 46 | 9-12 pts - A 47 | 7-8 pts - A- 48 | 6 pts - B+ 49 | 5 pts - B 50 | 4 pts - B- 51 | 3 pts - C 52 | 1-2 pts - D 53 | ``` 54 | -------------------------------------------------------------------------------- /grading/README.md: -------------------------------------------------------------------------------- 1 | 1. node download_a3.js 2 | this will gather js, and put it into `output/` 3 | 4 | 2. ./moss.perl -l javascript output/*.js 5 | 6 | 7 | 3. `cd mossum && python mossum/mossum.py` 8 | -------------------------------------------------------------------------------- /grading/download_js_a3.js: -------------------------------------------------------------------------------- 1 | const rp = require('request-promise'); 2 | const fs = require("fs"); 3 | const cheerio = require('cheerio'); 4 | 5 | var lines = fs.readFileSync('../README.md').toString().split('\n'); 6 | var re = /([a-z]{2,3}[0-9]{2,4}) ?- ?\[(htt[^\]]*)\]/; 7 | 8 | 9 | var x = 0; 10 | lines.forEach(line => { 11 | //if(x == 10) 12 | // return; 13 | 14 | //console.log(lines[i]); 15 | var matches = re.exec(line); 16 | if(matches && !matches[2].endsWith('grading.html')) { 17 | console.log(`${matches[1]} \t ${matches[2]}`); 18 | var netid = matches[1]; 19 | var url = matches[2]; 20 | 21 | //if(netid != 'rs2468') 22 | // return; 23 | 24 | var options = { 25 | uri: url, 26 | headers: { 27 | 'Accept': 'text/html' 28 | }, 29 | transform: function (body) { 30 | return cheerio.load(body); 31 | } 32 | }; 33 | 34 | rp(options).then($ => { 35 | //console.log($.html()); 36 | //console.log(`---------- ${netid} -----------`); 37 | // check out the script tags 38 | var rv = ''; 39 | $('script').each((i, script) => { 40 | var src = $(script).attr('src'); 41 | var contents = $(script).contents() ? $(script).contents().text() : ''; 42 | 43 | //console.log(script); 44 | 45 | if(!src) { 46 | if(script.type !== 'script' || contents.trim()[0] === '<') 47 | return true; 48 | 49 | rv += '\n' + $(script).contents().text(); 50 | return true; 51 | } else if(!/react|min\.js|notify|jquery/.test(src)) { 52 | console.log('DOWNLOADING: '+ url+'/'+src); 53 | rv = rp(url+'/'+src); 54 | return false; 55 | } 56 | }); 57 | 58 | return rv; 59 | }) 60 | .then(script => { 61 | if(script === '') 62 | console.log(`${netid} got nothing`); 63 | else { 64 | console.log(`${netid} Got a script`); 65 | fs.writeFile(`./output/${netid}.js`, script); 66 | } 67 | }) 68 | .catch(function(xhr){ 69 | if(xhr.statusCode) 70 | console.log(`${netid} failed with ${xhr.statusCode}`); 71 | else if(xhr.name === 'RequestError') { 72 | console.log(`${netid} got ${xhr.name}`); 73 | } else { 74 | console.log(`${netid} failed `); 75 | console.log(xhr); 76 | }; 77 | }); 78 | 79 | x++; 80 | } 81 | 82 | }); 83 | -------------------------------------------------------------------------------- /grading/mossum/LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2014 Hjalti Magnússon 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /grading/mossum/MANIFEST.in: -------------------------------------------------------------------------------- 1 | include LICENSE 2 | include README.md 3 | -------------------------------------------------------------------------------- /grading/mossum/README.md: -------------------------------------------------------------------------------- 1 | Mossum 2 | ====== 3 | 4 | What is it? 5 | ----------- 6 | 7 | Mossum is a tool for summarizing results from Stanford's 8 | [Moss](http://theory.stanford.edu/~aiken/moss/). The tool generates a graph for 9 | (multiple) results from Moss, which can help in identifying groups of students 10 | that have shared solutions. 11 | 12 | The tool can also generate a report, which shows which solutions are similar 13 | between all pairs of students. When submitting multiple parts of an assignment 14 | to Moss, this can help in identifying which students have multiple similar 15 | solutions. 16 | 17 | 18 | Installation 19 | ------------ 20 | 21 | The script can be installed via `pip`: 22 | 23 | ``` 24 | pip install --allow-all-external --process-dependency-links git+https://github.com/hjalti/mossum@master 25 | ``` 26 | 27 | (The `--process-dependency-links` will be deprecated in pip 1.6, but hopefully 28 | pydot will have support for Python 3 in PyPI by then) 29 | 30 | Basic usage 31 | ----------- 32 | 33 | After installation, the script can be called as follows 34 | 35 | ``` 36 | mossum MossURL1 MossURL2 ... MossURLn 37 | ``` 38 | 39 | If no URLs are specified as parameters, the URLs are read from the 40 | standard input. In this example, mossum generates *n* PNG images, that 41 | show the relationship between the submissions in each result page. The name of 42 | each image is obtained from the comment used when submitting to Moss (the `-c` 43 | flag). 44 | 45 | By default mossum only shows a link between two submissions if the match Moss 46 | finds 47 | * accounts for more than 90% of either submission, and 48 | * accounts for more than one line of either submission. 49 | 50 | The percentage and number of lines can be changed using the `--min-percent` 51 | (`-p`) option and `--min-lines` (`-l`) option, respectively. 52 | 53 | For example, when called with 54 | 55 | ``` 56 | mossum -p 95 -l 30 MossURL1 MossURL2 ... MossURLn 57 | ``` 58 | 59 | mossum only shows a link between submission if either match accounts for more 60 | than 95% of the submission or more than 30 lines are matched. 61 | 62 | More options 63 | ------------ 64 | 65 | ### Transformation 66 | 67 | When submitting to Moss, the whole path of all files is shown. When 68 | summarizing, we can extract relevant information from the path. This can also 69 | be useful if assignments are submitted in multiple files. In which case, we can 70 | extract relevant information from the path (e.g., student ID), when 71 | summarizing. 72 | 73 | The transformation option takes a regular expression as a parameter. If the 74 | regular expression contains groups, the transformed submission names are formed 75 | from the strings matched inside all groups, joined by an underscore. If the 76 | regular expression contains no groups, only the part of path that matches the 77 | regular expression is used as the transformed name. 78 | 79 | For example, if the submissions are stored in the following directory structure 80 | 81 | ``` 82 | /// 83 | ``` 84 | 85 | for example, 86 | 87 | ``` 88 | assignment1/1337/fred24/a1_part1.cpp 89 | assignment1/1337/fred24/a1_part2.cpp 90 | assignment1/1337/fred24/a1_part3.cpp 91 | assignment1/1337/sarah37/a1_p1.cpp 92 | assignment1/1337/sarah37/a1_part2.cpp 93 | assignment1/1337/sarah37/a13.cpp 94 | ``` 95 | 96 | the student ID can be extracted using the regular expression `*./(.+)/.*` and 97 | if we want the name to contain the assignment name and the student ID, we can 98 | use the regular expression `(.*)/.*/(.*)/.*`. 99 | 100 | ### Anonymize 101 | 102 | The summarization can be anonymized using the `--anonymize` or `-a` flag. When 103 | using this, all names are substituted with a random word. This is useful for 104 | frightening students. 105 | 106 | ### Report 107 | 108 | When assignments are split into parts and each part is submitted to Moss 109 | separately, it can be hard to get an overview of which students have many 110 | submissions in common. If the `--report` or `-r` flag is specified, mossum 111 | generates a *report*. The report generated shows which matches each pair of 112 | students have in common. The report is sorted, such that the pair of students 113 | with the most matches in common come first. 114 | 115 | Calling 116 | 117 | ``` 118 | mossum -r -t "*./(.+)/.*" MossURL1 MossURL2 ... MossURLn 119 | ``` 120 | 121 | would yield a report with entries similar to 122 | 123 | ``` 124 | fred24 and sarah37: 125 | part1: http://moss.stanford.edu/results/???/match??.html 126 | part2: http://moss.stanford.edu/results/???/match??.html 127 | part3: http://moss.stanford.edu/results/???/match??.html 128 | ``` 129 | 130 | The reports are stored in `.txt`, where `` is either 131 | specified by the `--output` or `-o` flag or obtained from the name of the 132 | assignments (extracted from the Moss pages). 133 | 134 | ### Format 135 | 136 | The format of the image generated by mossum can be changed using the `--format` 137 | or `-f` option. Mossum uses Graphviz to generate graphs. All output formats 138 | supported by Graphviz are therefore supported by mossum. See [Graphviz output 139 | formats](http://www.graphviz.org/doc/info/output.html). 140 | 141 | 142 | ### Links 143 | 144 | The `--show-links` or `-s` option can be used to add hyperlinks, to the Moss 145 | page of the match, which is represented by the edges in the graph, generated by 146 | mossum. 147 | 148 | Note that the hyperlinks only work if the specified format is `svg` or `xlib`. 149 | 150 | For example, calling 151 | 152 | ``` 153 | mossum -s -f svg -t "*./(.+)/.*" -o assignment MossURL1 MossURL2 ... MossURLn 154 | ``` 155 | 156 | will generate a SVG image file. If this file is opened in a browser, the 157 | matches found by Moss, which represent each edge, can be opened by clicking the 158 | `M` displayed on each edge. 159 | 160 | If you are using X, you can specify the format `xlib`. In this case mossum 161 | displays the graph in an Xlib window, and the graph is therefore not saved to 162 | a file. 163 | 164 | ### Filters 165 | 166 | It is possible to to add or remove a name from the collection of assignments 167 | using filters. There are four filter options, all of which take a list of names 168 | as arguments. The following filters are available. 169 | 170 | * `--filter N1 N2 ... Nn`: Only show connections between the specified names. 171 | No other connections are shown. 172 | 173 | * `--filteri N1 N2 ... Nn`: Only show connections including at least one of 174 | specified names. No other connections are shown. 175 | 176 | * `--filterx N1 N2 ... Nn`: Do not show connections between the specified 177 | names. All other connections are shown. 178 | 179 | * `--filterxi N1 N2 ... Nn`: Do not show connections where one of the specified 180 | names is involved. All other connections are shown. 181 | -------------------------------------------------------------------------------- /grading/mossum/bin/mossum: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | 4 | import os 5 | import sys 6 | from mossum import mossum 7 | 8 | if __name__ == "__main__": 9 | mossum.main() 10 | -------------------------------------------------------------------------------- /grading/mossum/mossum/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/grading/mossum/mossum/__init__.py -------------------------------------------------------------------------------- /grading/mossum/mossum/mossum.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | 4 | """ 5 | Mossum is a tool for summarizing results from Stanford's Moss. The tool 6 | generates a graph for (multiple) results from Moss, which can help in 7 | identifying groups of students that have shared solutions. 8 | 9 | The tool can also generate a report, which shows which solutions are similar 10 | between all pairs of students. When submitting multiple parts of an assignment 11 | to Moss, this can help in identifying which students have multiple similar 12 | solutions. 13 | """ 14 | 15 | import re 16 | import sys 17 | import os 18 | import datetime 19 | import pydot 20 | import argparse 21 | import requests as r 22 | 23 | from bs4 import BeautifulSoup 24 | from collections import defaultdict 25 | 26 | parser = argparse.ArgumentParser(description=__doc__) 27 | parser.add_argument('urls', metavar='URL', nargs='*', 28 | help='URLs to Moss result pages.') 29 | parser.add_argument('--min-percent', '-p', dest='min_percent', metavar='P', type=int, default=90, 30 | help='All matches where less than P%% of both files are matched are ignored. (Default: 90)') 31 | parser.add_argument('--min-lines', '-l', dest='min_lines', metavar='L', type=int, default=1, 32 | help='All matches where fewer than L lines are matched are ignored. (Default: 1)') 33 | parser.add_argument('--format', '-f', default='png', help='Format of output files. See Graphviz documentation.') 34 | parser.add_argument('--transformer', '-t', default='.*', 35 | help='A regular expression that is used to transform the name of them matched files.') 36 | parser.add_argument('--anonymize', '-a', default=False, action='store_true', 37 | help='Substitute names of matched files for random names') 38 | parser.add_argument('--merge', '-m', default=False, action='store_true', 39 | help='Merge all reports into one image') 40 | parser.add_argument('--report', '-r', default=False, action='store_true', 41 | help='Generates a report showing how many submissions each pair has in common.') 42 | parser.add_argument('--show-links', '-s', default=False, dest='show_links', action='store_true', 43 | help='Add hyperlinks to graph edges to Moss results. Only works for the formats svg and xlib.') 44 | parser.add_argument('--output', '-o', default=None, 45 | help='Name of output file.') 46 | parser.add_argument('--filter', metavar='N', nargs='+', default=None, 47 | help='Include only matches between these names.') 48 | parser.add_argument('--filteri', metavar='N', nargs='+', default=None, 49 | help='Include only matches involving these names.') 50 | parser.add_argument('--filterx', metavar='N', nargs='+', default=None, 51 | help='Exclude matches between these names.') 52 | parser.add_argument('--filterxi', metavar='N', nargs='+', default=None, 53 | help='Exclude matches involving any of these names.') 54 | args = None 55 | 56 | 57 | class Results: 58 | def __init__(self, name, matches): 59 | self.name = name 60 | self.matches = matches 61 | 62 | 63 | class Match: 64 | def __init__(self, first, second, lines, url): 65 | self.first = first 66 | self.second = second 67 | self.lines = lines 68 | self.url = url 69 | 70 | 71 | class File: 72 | def __init__(self, name, percent): 73 | self.name = name 74 | self.percent = percent 75 | 76 | 77 | class Filter: 78 | def __init__(self): 79 | filters = ['filter', 'filteri', 'filterx', 'filterxi'] 80 | for f in filters: 81 | setattr(self, f, None) 82 | 83 | for f in filters: 84 | if getattr(args, f) != None: 85 | setattr(self, f, set(getattr(args, f))) 86 | 87 | def include(self, match): 88 | first = match.first.name 89 | second = match.second.name 90 | if (self.filter is not None and (first not in self.filter or second not 91 | in self.filter)): 92 | return False 93 | if (self.filteri is not None and (first not in self.filteri and second 94 | not in self.filteri)): 95 | return False 96 | if (self.filterx is not None and (first in self.filterx and second in 97 | self.filterx)): 98 | return False 99 | if (self.filterxi is not None and (first in self.filterxi or second in 100 | self.filterxi)): 101 | return False 102 | return match.lines > args.min_lines and (match.first.percent > args.min_percent or 103 | match.second.percent > args.min_percent) 104 | 105 | 106 | def date_str(): 107 | return datetime.datetime.today().strftime('%d-%m-%Y_%H%M%S') 108 | 109 | 110 | def parse_col(col): 111 | name, per = col.split() 112 | m = re.match(args.transformer, name) 113 | if m: 114 | if m.groups(): 115 | name = '_'.join(m.groups()) 116 | else: 117 | name = m.group() 118 | per = int(re.search(r'\d+',per).group()) 119 | return File(name, per) 120 | 121 | 122 | def generate_report(results): 123 | pairs = defaultdict(list) 124 | for res in results: 125 | for match in res.matches: 126 | pairs[(match.first.name, match.second.name)].append( (res.name, match) ) 127 | 128 | if args.output: 129 | base = args.output 130 | else: 131 | base = '+'.join(map(lambda x:x.name, results)) 132 | filename = '%s.txt' % base 133 | 134 | with open(filename, 'w') as f: 135 | for pair, matches in sorted(pairs.items(), 136 | key=lambda x: (len(x[1]), sorted(map(lambda x: x[0], x[1]))), reverse=True): 137 | f.write('Pair: %s and %s\n' % pair) 138 | for name, match in sorted(matches): 139 | f.write('%s: %s\n' % (name, match.url)) 140 | 141 | f.write('\n\n') 142 | 143 | 144 | def merge_results(results): 145 | name = '+'.join(map(lambda x:x.name, results)) 146 | matches = sum(map(lambda x:x.matches, results), []) 147 | return Results(name, matches) 148 | 149 | 150 | def get_results(moss_url): 151 | resp = r.get(moss_url) 152 | soup = BeautifulSoup(resp.content.decode('utf-8'), 'html5lib') 153 | 154 | ps = soup('p') 155 | name = None 156 | if len(ps) >= 2: 157 | name = ps[2].text.strip() 158 | if not name: 159 | name = 'moss_%s' % date_str() 160 | 161 | matches = [] 162 | 163 | for row in soup.table('tr')[1:]: 164 | first, second, lines = map(lambda x:x.text, row('td')) 165 | first = parse_col(first) 166 | second = parse_col(second) 167 | lines = int(lines) 168 | url = row.a['href'] 169 | matches.append(Match(first, second, lines, url)) 170 | 171 | fil = Filter() 172 | matches = list(filter(fil.include,matches)) 173 | 174 | return Results(name, matches) 175 | 176 | 177 | def image(results): 178 | graph = pydot.Dot(graph_type='graph') 179 | 180 | print('Generating image for %s' % results.name) 181 | for m in results.matches: 182 | extra_opts = {} 183 | if args.show_links: 184 | extra_opts = {'label': 'M', 185 | 'labelURL': m.url, 186 | 'URL': m.url} 187 | graph.add_edge(pydot.Edge(m.first.name, m.second.name, **extra_opts)) 188 | 189 | if args.output: 190 | name = args.output 191 | else: 192 | name = results.name 193 | filename = '%s.%s' % (name, args.format) 194 | 195 | if os.path.exists(filename): 196 | os.remove(filename) 197 | 198 | graph.write(filename, format=args.format) 199 | if args.format == 'xlib': 200 | os.remove(filename) 201 | print('DONE') 202 | 203 | 204 | def main(): 205 | global args 206 | args = parser.parse_args() 207 | 208 | urls = args.urls 209 | if not urls: 210 | urls = sys.stdin.read().splitlines() 211 | 212 | all_res = [] 213 | for x in urls: 214 | res = get_results(x) 215 | all_res.append(res) 216 | 217 | 218 | if args.merge: 219 | merged = merge_results(all_res) 220 | image(merged) 221 | else: 222 | for res in all_res: 223 | image(res) 224 | 225 | if args.report: 226 | generate_report(all_res) 227 | 228 | 229 | if __name__ == '__main__': 230 | main() 231 | -------------------------------------------------------------------------------- /grading/mossum/setup.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | 4 | from distutils.core import setup 5 | 6 | setup( 7 | name='mossum', 8 | version='0.1.1', 9 | author='Hjalti Magnússon', 10 | author_email='hjaltmann@gmail.com', 11 | packages=['mossum'], 12 | scripts=['bin/mossum'], 13 | url='https://github.com/hjalti/mossum', 14 | license='LICENSE', 15 | description='', 16 | long_description='', 17 | install_requires=[ 18 | "beautifulsoup4>=4.3.2", 19 | "fake-factory>=0.4.2", 20 | "html5lib>=0.999", 21 | "ipython>=2.3.0", 22 | "pydot>=1.0.29", 23 | "pyparsing>=2.0.2", 24 | "requests>=2.4.3", 25 | "six>=1.8.0", 26 | ], 27 | dependency_links = [ 28 | "git+https://github.com/nlhepler/pydot/#egg=pydot-1.0.29" 29 | ], 30 | ) 31 | 32 | -------------------------------------------------------------------------------- /grading/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "grading", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "download_js_a3.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "", 10 | "license": "ISC", 11 | "dependencies": { 12 | "cheerio": "^1.0.0-rc.2", 13 | "request": "^2.82.0", 14 | "request-promise": "^4.2.1" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /images/CT_logo1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/images/CT_logo1.png -------------------------------------------------------------------------------- /images/cornell-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/images/cornell-logo.png -------------------------------------------------------------------------------- /lectures/section_a/lecture-01.md: -------------------------------------------------------------------------------- 1 | [Slides](lecture-01.pdf) are available for the first lecture 2 | 3 | We covered 4 | * Course overview 5 | * Installed software 6 | * `git` and github.com 7 | * HTTP basics and RESTful design 8 | * Cloned [skeleton](https://github.com/amfleming/skeleton) java server 9 | * Brief walkthrough of JAX-RS annotations in java 10 | -------------------------------------------------------------------------------- /lectures/section_a/lecture-01.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/lectures/section_a/lecture-01.pdf -------------------------------------------------------------------------------- /lectures/section_a/lecture-02.md: -------------------------------------------------------------------------------- 1 | [Slides](lecture-02.pdf) from class are available. 2 | 3 | [Video](https://cornell.mediasite.com/Mediasite/Catalog/catalogs/cs5356) of the class is also available. 4 | 5 | [Assignment 2](/assignments/a2/a2.md) Released + due on Tuesday 9/5. 6 | 7 | **FYI Class cancelled on Sep 13; Section extended by 1wk** 8 | 9 | We Covered 10 | ---- 11 | * Review of Git Homework 12 | * RESTful Architecture 13 | * Concepts of DAO, API Object, Controller 14 | * CircleCI 15 | * Walkthrough the creation of an endpoint 16 | * Refresher on JAX-RS / how to map HTTP requests to code 17 | * Introduced the H2 Database 18 | * Introduced JooQ a tool for writing SQL-like logic in Java 19 | * Writing the controller function + DAO + API Object 20 | * API Object Validation 21 | * Docker, Dockerfiles, Docker Repo 22 | * Brief AWS EC2-Container Service walkthrough 23 | 24 | Class Prep 25 | ---- 26 | 27 | **CIRCLE CI** 28 | * Sign up for CircleCI at https://circleci.com/ 29 | * Connect CircleCI to your GitHub account 30 | 31 | **DOCKER** 32 | * Ensure Docker is installed on your machine. https://docs.docker.com/engine/installation/#supported-platforms 33 | * Confirm docker working by running `docker run busybox ls` on your machine 34 | * Sign up for Docker at https://hub.docker.com/ 35 | * Successfully `docker login` on your machine using your credentials 36 | 37 | **APP CODE** 38 | * Pull the latest from https://github.com/amfleming/skeleton 39 | 40 | **IDE** 41 | 42 | *we’ll be writing code using IntelliJ Idea together + I’ll show you a bunch of tricks* 43 | -------------------------------------------------------------------------------- /lectures/section_a/lecture-02.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/lectures/section_a/lecture-02.pdf -------------------------------------------------------------------------------- /lectures/section_a/lecture-03.md: -------------------------------------------------------------------------------- 1 | [Slides](lecture-03.pdf) from class are available. 2 | 3 | [Video](https://cornell.mediasite.com/Mediasite/Catalog/catalogs/cs5356) of the class is also available. 4 | 5 | [Assignment 3](/assignments/a3/a3.md) is due on Tuesday 9/19. 6 | 7 | **FYI Class cancelled on Sep 13; Section extended by 1wk** 8 | 9 | We Covered 10 | ---- 11 | * Review of HW 02 12 | * Browser structure 13 | * HTML + the DOM 14 | * CSS 15 | * JavaScript 16 | * JQuery and [Live Coding](https://plnkr.co/edit/BJhK2jPQUIaZsdP8LV5V?p=preview) towards HW 03 17 | 18 | *IMPORTANT - the Live Coding exercise will only work if security features are disabled in your browser. See [Assignment 3](/assignments/a3/a3.md) for instructions how to do this and getting the plnkr.co link above working for you* 19 | -------------------------------------------------------------------------------- /lectures/section_a/lecture-03.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/lectures/section_a/lecture-03.pdf -------------------------------------------------------------------------------- /lectures/section_b/lecture_1.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/lectures/section_b/lecture_1.pdf -------------------------------------------------------------------------------- /lectures/section_b/lecture_2.md: -------------------------------------------------------------------------------- 1 | [Slides](lecture_2.pdf) from class are available. 2 | 3 | **FYI No class on Nov 22 ☠️🦃** 4 | 5 | We Covered 6 | ---- 7 | * React Native 8 | * We extended the a [default App](https://github.com/amfleming/test-app) and made a box blink red + green 9 | * We explored a [slightly more complex](https://github.com/amfleming/android-app) app with a Map Component and some state modifications 10 | 11 | -------------------------------------------------------------------------------- /lectures/section_b/lecture_2.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/lectures/section_b/lecture_2.pdf -------------------------------------------------------------------------------- /lectures/section_b/lecture_3.md: -------------------------------------------------------------------------------- 1 | [Slides](lecture_3.pdf) from class are available. 2 | 3 | We Covered 4 | ---- 5 | * Python + Flask 6 | * MongoDb 7 | -------------------------------------------------------------------------------- /lectures/section_b/lecture_3.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/lectures/section_b/lecture_3.pdf -------------------------------------------------------------------------------- /people/Tanuj-Ahuja.md: -------------------------------------------------------------------------------- 1 | Tanuj Ahuja 2 | ------------ 3 | 4 | ![](photos/tanuj-ahuja.jpg) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/tanuj-ahuja-b54ba193/) 7 | * [Github](https://github.com/tanuj1234) 8 | -------------------------------------------------------------------------------- /people/adam-fleming.md: -------------------------------------------------------------------------------- 1 | Adam Fleming 2 | ------------ 3 | 4 | ![](photos/adam-fleming.png) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/theadamfleming) 7 | * [Github](https://github.com/amfleming) 8 | -------------------------------------------------------------------------------- /people/advika-nigam.md: -------------------------------------------------------------------------------- 1 | Advika Nigam 2 | ------------ 3 | 4 | ![](photos/advika-nigam.jpg) 5 | 6 | * [Github](https://github.com/advikanigam) 7 | 8 | -------------------------------------------------------------------------------- /people/akshayj.md: -------------------------------------------------------------------------------- 1 | Akshay Jha 2 | ------------ 3 | 4 | ![](photos/akshayj.png) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/akshay-jha-488974ba) 7 | * [Github](https://github.com/Akshay666) 8 | -------------------------------------------------------------------------------- /people/aleo-mok.md: -------------------------------------------------------------------------------- 1 | Aleo Mok 2 | ------------ 3 | 4 | ![](photos/aleo-mok.jpg) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/aleo-mok-1576bb22/) 7 | * [Github](https://github.com/aleotheoreo) 8 | -------------------------------------------------------------------------------- /people/an-le.md: -------------------------------------------------------------------------------- 1 | An Le 2 | ------------ 3 | 4 | ![](photos/an-le.png) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/anle1991/) 7 | * [Github](https://github.com/anle1991) 8 | * [Website](https://anle1991.github.io/) 9 | -------------------------------------------------------------------------------- /people/andi-mitre.md: -------------------------------------------------------------------------------- 1 | Andi Mitre 2 | ----------- 3 | 4 | ![](photos/andi-mitre.png) 5 | 6 | * [GitHub](https://www.github.com/andimitre) 7 | * [LinkedIn](https://www.linkedin.com/in/andi-mitre-a953ab137/) 8 | -------------------------------------------------------------------------------- /people/ang-li.md: -------------------------------------------------------------------------------- 1 | Ang Li 2 | ------------ 3 | 4 | ![](photos/ang-li.jpg) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/ang-li20/) 7 | * [Github](https://github.com/leonmz) 8 | 9 | -------------------------------------------------------------------------------- /people/anmol-seth.md: -------------------------------------------------------------------------------- 1 | Anmol Seth 2 | ------------ 3 | 4 | ![](photos/anmol-seth.jpg) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/anmol-seth-a224839b/) 7 | * [Github](https://github.com/anmolseth02) 8 | -------------------------------------------------------------------------------- /people/arpit-sheth.md: -------------------------------------------------------------------------------- 1 | Arpit Sheth 2 | ------------ 3 | 4 | ![](photos/arpit-sheth.jpg) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/shetharp/)) 7 | * [Github](https://github.com/shetharp) 8 | -------------------------------------------------------------------------------- /people/bradley-wise.md: -------------------------------------------------------------------------------- 1 | Bradley Wise 2 | ------------ 3 | 4 | ![](photos/bradley-wise.jpg) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/bradley-wise-b8962529/) 7 | * [Github](https://github.com/bmwise14) 8 | -------------------------------------------------------------------------------- /people/brett-leibowitz.md: -------------------------------------------------------------------------------- 1 | Brett Leibowitz 2 | ------------ 3 | 4 | ![](photos/brett-leibowitz.jpg) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/brettleibowitz/) 7 | * [Github](https://github.com/TonOfPrince) 8 | -------------------------------------------------------------------------------- /people/cameron-boroumand.md: -------------------------------------------------------------------------------- 1 | Cameron Boroumand 2 | ------------ 3 | 4 | ![](photos/cameron-boroumand.jpg) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/cameron-boroumand) 7 | * [Github](https://github.com/cameron16) 8 | 9 | -------------------------------------------------------------------------------- /people/cameron-westbury.md: -------------------------------------------------------------------------------- 1 | Cameron westbury 2 | ----- 3 | 4 | ![](photos/cameron-westbury.jpg) 5 | 6 | -------------------------------------------------------------------------------- /people/chang-wei.md: -------------------------------------------------------------------------------- 1 | Chang Wei 2 | ------------ 3 | 4 | ![](photos/chang-wei.jpg) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/chang-wei-89b0b3127/) 7 | * [Github](https://github.com/Pod5GS) -------------------------------------------------------------------------------- /people/chengsi-wu.md: -------------------------------------------------------------------------------- 1 | chengsi wu 2 | ------------ 3 | 4 | ![](photos/chengsi-wu.jpg) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/chengsi-wu-a0b48993/) 7 | * [Github](https://github.com/Alanlovecoding) 8 | -------------------------------------------------------------------------------- /people/chenkai-wang.md: -------------------------------------------------------------------------------- 1 | Chenkai Wang 2 | ------------ 3 | 4 | ![](photos/chenkai-wang.jpg) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/chenkai-wang-0321213a/) 7 | 8 | * [Github](https://github.com/kaa1el) 9 | -------------------------------------------------------------------------------- /people/chenyang-wang.md: -------------------------------------------------------------------------------- 1 | Chenyang Wang 2 | ------------ 3 | 4 | ![](photos/chenyang-wang.jpg) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/kellycwang/) 7 | 8 | -------------------------------------------------------------------------------- /people/christopher-caulfield.md: -------------------------------------------------------------------------------- 1 | Christopher Caulfield 2 | ------------ 3 | 4 | ![](photos/christopher-caulfield.png) 5 | 6 | * [Github](https://github.com/ctcaulfield) 7 | * [LinkedIn](https://www.linkedin.com/in/ctcaulfield) 8 | * [Website](https://www.caulfield.io) 9 | -------------------------------------------------------------------------------- /people/christy-cui.md: -------------------------------------------------------------------------------- 1 | Christy Cui 2 | ------------ 3 | 4 | ![](photos/christy-cui.jpg) 5 | 6 | * [Github](https://github.com/christycui) 7 | -------------------------------------------------------------------------------- /people/daniel-kim.md: -------------------------------------------------------------------------------- 1 | Daniel Kim 2 | ----- 3 | 4 | ![](photos/daniel-kim.jpg) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/dankdkim) 7 | * [Github](https://github.com/dkijc) 8 | -------------------------------------------------------------------------------- /people/daraxu.md: -------------------------------------------------------------------------------- 1 | Dara Xu 2 | ------------ 3 | 4 | ![](photos/dara.jpg) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/daraxu) 7 | * [Github](https://github.com/Daraxuxuxu) 8 | -------------------------------------------------------------------------------- /people/daren-liu.md: -------------------------------------------------------------------------------- 1 | Daren Liu 2 | ------------ 3 | 4 | ![](photos/daren-liu.jpg) 5 | 6 | * [Github](https://github.com/darenl) 7 | -------------------------------------------------------------------------------- /people/darya-moldavskaya.md: -------------------------------------------------------------------------------- 1 | Darya Moldavskaya 2 | ------------ 3 | 4 | ![](photos/darya-moldavskaya.png) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/darya-moldavskaya/) 7 | -------------------------------------------------------------------------------- /people/david-hachuel.md: -------------------------------------------------------------------------------- 1 | David Hachuel 2 | ------------ 3 | 4 | --- 5 | 6 | ![](photos/david-hachuel.jpg) 7 | 8 | * [LinkedIn](https://www.linkedin.com/in/david-hachuel/) 9 | * [Github](https://github.com/dhachuel) 10 | 11 | -------------------------------------------------------------------------------- /people/debarun-dhar.md: -------------------------------------------------------------------------------- 1 | Debarun Dhar 2 | ------------ 3 | 4 | ![](photos/debarun-dhar.jpg) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/debarundhar5/) 7 | * [Github](https://github.com/debarundhar) -------------------------------------------------------------------------------- /people/derek-netto.md: -------------------------------------------------------------------------------- 1 | Derek Netto 2 | ------------ 3 | 4 | ![](photos/derek-netto.jpg) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/dereknetto) 7 | * [Github](https://github.com/Derek316x) 8 | -------------------------------------------------------------------------------- /people/devon-bain.md: -------------------------------------------------------------------------------- 1 | Devon Bain 2 | ------------ 3 | 4 | ![](photos/devon-bain.jpg) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/devon-bain/) 7 | * [Github](https://github.com/dwb264) -------------------------------------------------------------------------------- /people/disheng-zheng.md: -------------------------------------------------------------------------------- 1 | Disheng Zheng 2 | ------------ 3 | 4 | ![](photos/disheng-zheng.jpg) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/disheng-zheng-8612369b/) 7 | * [Github](https://github.com/dszheng92) -------------------------------------------------------------------------------- /people/elena-zhizhimontova.md: -------------------------------------------------------------------------------- 1 | Elena Zhizhimontova 2 | ------------ 3 | 4 | ![](photos/elena-zhizhimontova.jpg) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/elena-zhizhimontova/) 7 | * [Github](https://github.com/sunsshadow) 8 | -------------------------------------------------------------------------------- /people/emily-tseng.md: -------------------------------------------------------------------------------- 1 | Emily Tseng 2 | ----------- 3 | 4 | ![](photos/emily-tseng.jpg) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/emily-tseng-56aa2a52/) 7 | * [Github](https://github.com/emtseng) 8 | -------------------------------------------------------------------------------- /people/ephraim-montag.md: -------------------------------------------------------------------------------- 1 | Ephraim Montag 2 | 3 | 4 | ![](photos/ephraim-montag.jpg) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/ephraim-montag-b48500122) 7 | * [Github](https://github.com/emontag) 8 | -------------------------------------------------------------------------------- /people/eric-nguyen.md: -------------------------------------------------------------------------------- 1 | Eric Nguyen 2 | ------------ 3 | 4 | ![](photos/eric-nguyen.png) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/eric-nguyen-61090b11/) 7 | * [Github](https://github.com/exnx) 8 | -------------------------------------------------------------------------------- /people/ethan-green.md: -------------------------------------------------------------------------------- 1 | Ethan Green 2 | ------------ 3 | 4 | ![](photos/ethan-green.png) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/ethanrgreen) 7 | * [Github](https://github.com/ergreen) 8 | -------------------------------------------------------------------------------- /people/eva-stern-rodriguez.md: -------------------------------------------------------------------------------- 1 | Eva Stern-Rodriguez 2 | ------------ 3 | 4 | ![](photos/eva-stern-rodriguez.jpg) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/evasr) -------------------------------------------------------------------------------- /people/evan-kaplan.md: -------------------------------------------------------------------------------- 1 | Evan Kaplan 2 | ------------ 3 | 4 | ![](photos/evan-kaplan.PNG) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/ekaplan6/) 7 | * [Github](https://github.com/ekaplan6) 8 | -------------------------------------------------------------------------------- /people/eyvind-niklasson.md: -------------------------------------------------------------------------------- 1 | Eyvind Niklasson 2 | 3 | [GitHub](http://github.com/eyvindn) 4 | -------------------------------------------------------------------------------- /people/fani-maksakuli.md: -------------------------------------------------------------------------------- 1 | ![Fani's Picture](photos/fani-maksakuli.jpg) 2 | 3 | * [Github] (https://github.com/FaniNM) 4 | * [LinkedIn] (https://www.linkedin.com/in/fani-maksakuli-86a90619/) 5 | 6 | -------------------------------------------------------------------------------- /people/feston-kastrati.md: -------------------------------------------------------------------------------- 1 | Feston Kastrati 2 | ------------ 3 | 4 | ![](photos/feston-kastrati.jpg) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/feston-kastrati-047919137/) 7 | * [Github](https://github.com/fk257) 8 | -------------------------------------------------------------------------------- /people/fuyuzhen-peng.md: -------------------------------------------------------------------------------- 1 | Fuyuzhen Peng 2 | ------------ 3 | 4 | ![](photos/fuyuzhen-peng.jpg) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/pengfuyuzhen/) 7 | * [Github](https://github.com/pengfuyuzhen) 8 | -------------------------------------------------------------------------------- /people/gaurav-chaturvedi.md: -------------------------------------------------------------------------------- 1 | Gaurav Chaturvedi 2 | ------------ 3 | 4 | ![](photos/gaurav-chaturvedi.jpg) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/gaurav-chaturvedi-6265643a) 7 | * [Github](https://github.com/gauravchaturvedi) -------------------------------------------------------------------------------- /people/han-jing.md: -------------------------------------------------------------------------------- 1 | Han Jing 2 | ---------------- 3 | 4 | ![](photos/han-jing.jpg) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/hjing/) 7 | * [Github](https://github.com/hanjing5) 8 | -------------------------------------------------------------------------------- /people/han-nie.md: -------------------------------------------------------------------------------- 1 | Han Nie 2 | ------------ 3 | 4 | ![](photos/han-nie.png) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/han-nie-06756287/) 7 | * [Github](https://github.com/flyingcow1) 8 | -------------------------------------------------------------------------------- /people/hanyu-zhang.md: -------------------------------------------------------------------------------- 1 | Hanyu Zhang 2 | ------------ 3 | 4 | ![](photos/hanyu-zhang.jpg) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/hanyu-zhang-9327a047/) 7 | * [Github] (https://github.com/PGhzhang) 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /people/hao-zheng.md: -------------------------------------------------------------------------------- 1 | Hao Zheng 2 | ------------ 3 | 4 | ![](photos/hao-zheng.JPG) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/zhenghao/) 7 | * [Github](https://github.com/hz2287) 8 | -------------------------------------------------------------------------------- /people/hathaitorn-rojnirun.md: -------------------------------------------------------------------------------- 1 | Hathatitorn Rojnirun 2 | -------------------- 3 | 4 | ![](photos/hathaitorn-rojnirun.jpg) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/hrojnirun/) 7 | * [Github](https://github.com/hathaitornr) 8 | -------------------------------------------------------------------------------- /people/howard-xing.md: -------------------------------------------------------------------------------- 1 | Howard Xing 2 | ------------ 3 | 4 | ![](https://cornelltech.hxing.me/cs5356/hw01/profile.png?-user=github_CT_CS5356_Fall2017) 5 | 6 | * [Github](https://github.com/hxing9974) 7 | * [iOS App: Groceries Snapped](https://itunes.apple.com/us/app/groceries-snapped/id1148393805) 8 | * [LinkedIn](https://www.linkedin.com/in/howardxing/) 9 | -------------------------------------------------------------------------------- /people/huafeng-dai.md: -------------------------------------------------------------------------------- 1 | Huafeng Dai 2 | ------------ 3 | 4 | ![](photos/huafeng-dai.jpg) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/huafeng-dai-25a7a6131/) 7 | * [Github](https://github.com/dqlsll123) 8 | * [Website](http://dqlsll123.github.io) 9 | -------------------------------------------------------------------------------- /people/huajun-bai.md: -------------------------------------------------------------------------------- 1 | Huajun Bai 2 | ------------- 3 | 4 | ![](photos/huajun-bai.JPG) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/huajun-bai-041274a2) 7 | * [Github](https://github.com/baihuajun24) 8 | -------------------------------------------------------------------------------- /people/i-huang.md: -------------------------------------------------------------------------------- 1 | I Huang 2 | ------------ 3 | 4 | ![](photos/i-huang.JPG) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/i-huang-5a0365a9/) 7 | * [Github](https://github.com/mikemike07) 8 | -------------------------------------------------------------------------------- /people/jacob-lee.md: -------------------------------------------------------------------------------- 1 | Jacob Lee 2 | ------------ 3 | 4 | ![](photos/jacob-lee.jpg) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/jacob-lee-06581592/) 7 | * [Github](https://github.com/hyunjacoblee) 8 | -------------------------------------------------------------------------------- /people/jake-magid.md: -------------------------------------------------------------------------------- 1 | Jake Magid 2 | ------------ 3 | 4 | ![](photos/jake-magid.png) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/jake-magid/) 7 | * [Github](https://github.com/jmagid15) 8 | -------------------------------------------------------------------------------- /people/jamie-yu.md: -------------------------------------------------------------------------------- 1 | Jamie Yu 2 | ------------ 3 | 4 | ![](photos/jamie-yu.jpg) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/jamie-yu-3348434b/) 7 | * [Github](https://github.com/jamiekimyu) 8 | -------------------------------------------------------------------------------- /people/jared-wong.md: -------------------------------------------------------------------------------- 1 | Jared Wong 2 | ---------------- 3 | 4 | ![](photos/jared-wong.jpg) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/jaredmwong/) 7 | * [Github](https://github.com/techlover10) 8 | -------------------------------------------------------------------------------- /people/jessie-gao.md: -------------------------------------------------------------------------------- 1 | Jessie(Jingxu) Gao 2 | ------------ 3 | 4 | ![](photos/jessie-gao.jpg) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/jessie-gao/) 7 | * [Github](https://github.com/JessieJingxuGao) 8 | -------------------------------------------------------------------------------- /people/jialiang-wang.md: -------------------------------------------------------------------------------- 1 | Jialiang Wang 2 | ------------ 3 | 4 | ![](photos/jialiang-wang.jpg) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/vincent1993) 7 | * [Github](https://github.com/wangvincentt) 8 | -------------------------------------------------------------------------------- /people/joe-abi-sleiman.md: -------------------------------------------------------------------------------- 1 | Joe Abi Sleiman 2 | ------------ 3 | 4 | ![](photos/joe-abi-sleiman.jpg) 5 | 6 | * [Github](https://github.com/joeabisleiman) 7 | * [LinkedIn](https://www.linkedin.com/in/joeabisleiman/) 8 | 9 | -------------------------------------------------------------------------------- /people/jonathan-cutler.md: -------------------------------------------------------------------------------- 1 | Jonathan Cutler 2 | ------------ 3 | 4 | ![](photos/jonathan-cutler.png) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/jonathan-cutler-ba623437) 7 | * [Github](https://github.com/jonleecutler) 8 | -------------------------------------------------------------------------------- /people/junhsiang-liao.md: -------------------------------------------------------------------------------- 1 | Junhsiang Liao 2 | ------------ 3 | 4 | ![](photos/jun-hsiang-liao.jpg) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/junhsiangliao/) 7 | * [Github](https://github.com/joe83830) 8 | -------------------------------------------------------------------------------- /people/kirollos-morkos.md: -------------------------------------------------------------------------------- 1 | Kirollos Morkos 2 | --------------- 3 | 4 | ![](photos/kirollos-morkos.jpg) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/kirollos-morkos-3a0a198a) 7 | * [Github](https://github.com/kman2121) 8 | -------------------------------------------------------------------------------- /people/kripa-agarwal.md: -------------------------------------------------------------------------------- 1 | Kripa Agarwal 2 | ------------ 3 | 4 | ![](photos/kripa-agarwal.jpg) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/kripaagarwal/) 7 | * [Github](https://github.com/coderKr) 8 | -------------------------------------------------------------------------------- /people/kriti-singh.md: -------------------------------------------------------------------------------- 1 | Kriti Singh 2 | ---------------- 3 | 4 | ![](photos/kriti-singh.jpg) 5 | 6 | * [Github](https://github.com/kriticism) 7 | * [LinkedIn](http://linkedin.com/in/kriti96singh/) 8 | -------------------------------------------------------------------------------- /people/lingfeng-huang.md: -------------------------------------------------------------------------------- 1 | Lingfeng Huang 2 | ------------ 3 | 4 | ![](photos/lingfeng-huang.JPG) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/lingfengatuw/) 7 | * [Github](https://github.com/lhuang58) 8 | -------------------------------------------------------------------------------- /people/linglong-wei.md: -------------------------------------------------------------------------------- 1 | Linglong Wei 2 | ----------- 3 | 4 | ![](photos/linglong-wei.jpeg) 5 | 6 | * [Github](https://github.com/laurawei/) 7 | 8 | -------------------------------------------------------------------------------- /people/liran-sharir.md: -------------------------------------------------------------------------------- 1 | Liran Sharir 2 | ------------ 3 | 4 | ![](photos/liran-sharir.png) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/lsharir) 7 | * [Github](https://github.com/lsharir) 8 | -------------------------------------------------------------------------------- /people/lixuan-mao.md: -------------------------------------------------------------------------------- 1 | Lixuan Mao 2 | ---------------- 3 | 4 | ![](photos/lixuan-mao.jpeg) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/lixuanmao/) 7 | * [Github](https://github.com/thumlx12) 8 | -------------------------------------------------------------------------------- /people/luke-ahn.md: -------------------------------------------------------------------------------- 1 | Luke Ahn 2 | ------------ 3 | 4 | ![](photos/luke-ahn.jpg) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/luke-ahn-32b00089/) 7 | * [Github](https://github.com/lukeahn) 8 | -------------------------------------------------------------------------------- /people/luna-yang: -------------------------------------------------------------------------------- 1 | Luna Yang 2 | ------------ 3 | 4 | ![](photos/luna-yang.jpg) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/yl89757jj) 7 | * [Github](https://github.com/yl89757jj) 8 | -------------------------------------------------------------------------------- /people/marco-berlot.md: -------------------------------------------------------------------------------- 1 | Marco Berlot 2 | ------------ 3 | 4 | ![](photos/marco-berlot.png) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/marco-berlot-1a9385117/?ppe=1) 7 | * [Github](https://github.com/MarcoBerlot) 8 | -------------------------------------------------------------------------------- /people/marco-white.md: -------------------------------------------------------------------------------- 1 | Marco White 2 | ----------- 3 | 4 | ![](photos/marco-white.png) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/marco-white-535a20126) 7 | * [GitHub](https://www.github.com/mwhite494) 8 | -------------------------------------------------------------------------------- /people/marika-cusick.md: -------------------------------------------------------------------------------- 1 | ![img_6104](https://user-images.githubusercontent.com/31290531/29699140-6381d6fe-8928-11e7-803d-0af8d645111a.jpg) 2 | 3 | [GitHub](https://github.com/marikacusick) 4 | 5 | [LinkedIn](https://www.linkedin.com/in/marika-cusick-252421102/) 6 | -------------------------------------------------------------------------------- /people/matthew-hsu.md: -------------------------------------------------------------------------------- 1 | Matthew Hsu 2 | ------------ 3 | 4 | ![](photos/matthew-hsu.jpg) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/matthew-hsu-82aa1078/) 7 | * [Github](https://github.com/mahsu) 8 | -------------------------------------------------------------------------------- /people/max-shatkhin.md: -------------------------------------------------------------------------------- 1 | Max Shatkhin 2 | ------------ 3 | 4 | ![](photos/max-shatkhin.png) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/maksimilian-shatkhin-5225a087) 7 | * [Github](https://github.com/mshatkhin23) 8 | -------------------------------------------------------------------------------- /people/mikaela-brown.md: -------------------------------------------------------------------------------- 1 | Mikaela Brown 2 | ------------ 3 | 4 | ![](photos/mikaela-brown.jpg) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/mikaelabrown/) 7 | * [Github](https://github.com/mikabro) 8 | -------------------------------------------------------------------------------- /people/mohit-chawla.md: -------------------------------------------------------------------------------- 1 | Mohit Chawla 2 | ------------ 3 | 4 | ![](photos/mohit-chawla.jpg) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/mohshia23) 7 | * [Github](https://github.com/mohit-chawla) 8 | -------------------------------------------------------------------------------- /people/neel-parekh.md: -------------------------------------------------------------------------------- 1 | Neel Parekh 2 | ------------ 3 | 4 | ![](photos/neel-parekh.jpg) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/parekhneel/) 7 | * [Github](https://github.com/neelparekh) -------------------------------------------------------------------------------- /people/noshin-anjum-nisa.md: -------------------------------------------------------------------------------- 1 | Noshin Anjum Nisa 2 | ------------ 3 | 4 | ![](photos/noshin-anjum-nisa.jpg) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/nisanoshin/) 7 | * [Github](https://github.com/nnisa) 8 | * [Portfolio](https://medium.com/noshin-anjum-nisa) -------------------------------------------------------------------------------- /people/peihsuan-tsai.md: -------------------------------------------------------------------------------- 1 | Pei-Hsuan Tsai 2 | ------------ 3 | 4 | ![](photos/peihsuan-tsai.jpg) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/iketsai) 7 | * [Github](https://github.com/ike35) 8 | -------------------------------------------------------------------------------- /people/photos/adam-fleming.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/adam-fleming.png -------------------------------------------------------------------------------- /people/photos/advika-nigam.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/advika-nigam.jpg -------------------------------------------------------------------------------- /people/photos/akshayj.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/akshayj.png -------------------------------------------------------------------------------- /people/photos/aleo-mok.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/aleo-mok.jpg -------------------------------------------------------------------------------- /people/photos/an-le.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/an-le.png -------------------------------------------------------------------------------- /people/photos/andi-mitre.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/andi-mitre.png -------------------------------------------------------------------------------- /people/photos/ang-li.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/ang-li.jpg -------------------------------------------------------------------------------- /people/photos/anmol-seth.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/anmol-seth.jpg -------------------------------------------------------------------------------- /people/photos/arpit-sheth.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/arpit-sheth.jpg -------------------------------------------------------------------------------- /people/photos/bradley-wise.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/bradley-wise.jpg -------------------------------------------------------------------------------- /people/photos/brett-leibowitz.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/brett-leibowitz.jpg -------------------------------------------------------------------------------- /people/photos/cameron-boroumand.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/cameron-boroumand.jpg -------------------------------------------------------------------------------- /people/photos/cameron-westbury.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/cameron-westbury.jpg -------------------------------------------------------------------------------- /people/photos/chang-wei.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/chang-wei.jpg -------------------------------------------------------------------------------- /people/photos/chengsi-wu.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/chengsi-wu.jpg -------------------------------------------------------------------------------- /people/photos/chenkai-wang.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/chenkai-wang.jpg -------------------------------------------------------------------------------- /people/photos/chenyang-wang.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/chenyang-wang.jpg -------------------------------------------------------------------------------- /people/photos/christopher-caulfield.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/christopher-caulfield.png -------------------------------------------------------------------------------- /people/photos/christy-cui.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/christy-cui.jpg -------------------------------------------------------------------------------- /people/photos/daniel-kim.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/daniel-kim.jpg -------------------------------------------------------------------------------- /people/photos/dara.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/dara.jpg -------------------------------------------------------------------------------- /people/photos/daren-liu.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/daren-liu.jpg -------------------------------------------------------------------------------- /people/photos/darya-moldavskaya.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/darya-moldavskaya.png -------------------------------------------------------------------------------- /people/photos/david-hachuel.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/david-hachuel.jpg -------------------------------------------------------------------------------- /people/photos/debarun-dhar.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/debarun-dhar.jpg -------------------------------------------------------------------------------- /people/photos/derek-netto.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/derek-netto.jpg -------------------------------------------------------------------------------- /people/photos/devon-bain.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/devon-bain.jpg -------------------------------------------------------------------------------- /people/photos/disheng-zheng.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/disheng-zheng.jpg -------------------------------------------------------------------------------- /people/photos/elena-zhizhimontova.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/elena-zhizhimontova.jpg -------------------------------------------------------------------------------- /people/photos/emily-tseng.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/emily-tseng.jpg -------------------------------------------------------------------------------- /people/photos/ephraim-montag.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/ephraim-montag.jpg -------------------------------------------------------------------------------- /people/photos/eric-nguyen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/eric-nguyen.png -------------------------------------------------------------------------------- /people/photos/ethan-green.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/ethan-green.png -------------------------------------------------------------------------------- /people/photos/eva-stern-rodriguez.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/eva-stern-rodriguez.jpg -------------------------------------------------------------------------------- /people/photos/evan-kaplan.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/evan-kaplan.PNG -------------------------------------------------------------------------------- /people/photos/fani-maksakuli.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/fani-maksakuli.jpg -------------------------------------------------------------------------------- /people/photos/feston-kastrati.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/feston-kastrati.jpg -------------------------------------------------------------------------------- /people/photos/fuyuzhen-peng.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/fuyuzhen-peng.jpg -------------------------------------------------------------------------------- /people/photos/gaurav-chaturvedi.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/gaurav-chaturvedi.jpg -------------------------------------------------------------------------------- /people/photos/han-jing.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/han-jing.jpg -------------------------------------------------------------------------------- /people/photos/han-nie.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/han-nie.png -------------------------------------------------------------------------------- /people/photos/hanyu-zhang.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/hanyu-zhang.jpg -------------------------------------------------------------------------------- /people/photos/hao-zheng.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/hao-zheng.JPG -------------------------------------------------------------------------------- /people/photos/hathaitorn-rojnirun.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/hathaitorn-rojnirun.jpg -------------------------------------------------------------------------------- /people/photos/huafeng-dai.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/huafeng-dai.jpg -------------------------------------------------------------------------------- /people/photos/huajun-bai.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/huajun-bai.JPG -------------------------------------------------------------------------------- /people/photos/i-huang.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/i-huang.JPG -------------------------------------------------------------------------------- /people/photos/jacob-lee.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/jacob-lee.jpg -------------------------------------------------------------------------------- /people/photos/jake-magid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/jake-magid.png -------------------------------------------------------------------------------- /people/photos/jamie-yu.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/jamie-yu.jpg -------------------------------------------------------------------------------- /people/photos/jared-wong.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/jared-wong.jpg -------------------------------------------------------------------------------- /people/photos/jessie-gao.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/jessie-gao.jpg -------------------------------------------------------------------------------- /people/photos/jialiang-wang.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/jialiang-wang.jpg -------------------------------------------------------------------------------- /people/photos/joe-abi-sleiman.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/joe-abi-sleiman.jpg -------------------------------------------------------------------------------- /people/photos/jonathan-cutler.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/jonathan-cutler.png -------------------------------------------------------------------------------- /people/photos/junhsiang-liao.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/junhsiang-liao.jpg -------------------------------------------------------------------------------- /people/photos/kirollos-morkos.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/kirollos-morkos.jpg -------------------------------------------------------------------------------- /people/photos/kripa-agarwal.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/kripa-agarwal.jpg -------------------------------------------------------------------------------- /people/photos/kriti-singh.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/kriti-singh.jpg -------------------------------------------------------------------------------- /people/photos/lingfeng-huang.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/lingfeng-huang.JPG -------------------------------------------------------------------------------- /people/photos/linglong-wei.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/linglong-wei.jpeg -------------------------------------------------------------------------------- /people/photos/liran-sharir.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/liran-sharir.jpg -------------------------------------------------------------------------------- /people/photos/lixuan-mao.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/lixuan-mao.jpeg -------------------------------------------------------------------------------- /people/photos/luke-ahn.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/luke-ahn.jpg -------------------------------------------------------------------------------- /people/photos/luna-yang.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/luna-yang.jpg -------------------------------------------------------------------------------- /people/photos/marco-berlot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/marco-berlot.png -------------------------------------------------------------------------------- /people/photos/marco-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/marco-white.png -------------------------------------------------------------------------------- /people/photos/matthew-hsu.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/matthew-hsu.jpg -------------------------------------------------------------------------------- /people/photos/max-shatkhin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/max-shatkhin.png -------------------------------------------------------------------------------- /people/photos/mikaela-brown.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/mikaela-brown.jpg -------------------------------------------------------------------------------- /people/photos/mohit-chawla.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/mohit-chawla.jpg -------------------------------------------------------------------------------- /people/photos/neel-parekh.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/neel-parekh.jpg -------------------------------------------------------------------------------- /people/photos/noshin-anjum-nisa.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/noshin-anjum-nisa.jpg -------------------------------------------------------------------------------- /people/photos/peihsuan-tsai.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/peihsuan-tsai.jpg -------------------------------------------------------------------------------- /people/photos/poyen-tseng.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/poyen-tseng.jpg -------------------------------------------------------------------------------- /people/photos/rahul-chatterjee.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/rahul-chatterjee.jpg -------------------------------------------------------------------------------- /people/photos/rainie-sun.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/rainie-sun.JPG -------------------------------------------------------------------------------- /people/photos/raviteja-arikati.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/raviteja-arikati.jpg -------------------------------------------------------------------------------- /people/photos/ray-su.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/ray-su.jpg -------------------------------------------------------------------------------- /people/photos/renee-zacharowicz.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/renee-zacharowicz.jpg -------------------------------------------------------------------------------- /people/photos/robert-wolfe.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/robert-wolfe.JPG -------------------------------------------------------------------------------- /people/photos/rohun-tripathi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/rohun-tripathi.png -------------------------------------------------------------------------------- /people/photos/rom-cohen.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/rom-cohen.jpg -------------------------------------------------------------------------------- /people/photos/romoli-bakshi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/romoli-bakshi.png -------------------------------------------------------------------------------- /people/photos/rongxin-zhang.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/rongxin-zhang.png -------------------------------------------------------------------------------- /people/photos/ruihao-zhu.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/ruihao-zhu.jpg -------------------------------------------------------------------------------- /people/photos/ryan-ramphal.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/ryan-ramphal.jpg -------------------------------------------------------------------------------- /people/photos/saliou-diallo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/saliou-diallo.png -------------------------------------------------------------------------------- /people/photos/samantha-yip.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/samantha-yip.jpg -------------------------------------------------------------------------------- /people/photos/sarah-le-cam.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/sarah-le-cam.jpg -------------------------------------------------------------------------------- /people/photos/saran-krish.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/saran-krish.jpg -------------------------------------------------------------------------------- /people/photos/seye-bankole.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/seye-bankole.JPG -------------------------------------------------------------------------------- /people/photos/spark-shen.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/spark-shen.jpg -------------------------------------------------------------------------------- /people/photos/stephen-bongner.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/stephen-bongner.jpg -------------------------------------------------------------------------------- /people/photos/steve-lee.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/steve-lee.jpg -------------------------------------------------------------------------------- /people/photos/steven-jaroslawski.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/steven-jaroslawski.jpg -------------------------------------------------------------------------------- /people/photos/subhangi-agarwala.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/subhangi-agarwala.jpg -------------------------------------------------------------------------------- /people/photos/svava-kristinsdottir.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/svava-kristinsdottir.JPG -------------------------------------------------------------------------------- /people/photos/tanuj-ahuja.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/tanuj-ahuja.jpg -------------------------------------------------------------------------------- /people/photos/tao-yuan.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/tao-yuan.jpg -------------------------------------------------------------------------------- /people/photos/vicente-rotman-hinzpeter.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/vicente-rotman-hinzpeter.jpg -------------------------------------------------------------------------------- /people/photos/vijay-pillai.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/vijay-pillai.jpg -------------------------------------------------------------------------------- /people/photos/vincent-kuo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/vincent-kuo.png -------------------------------------------------------------------------------- /people/photos/vinson-wang.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/vinson-wang.jpg -------------------------------------------------------------------------------- /people/photos/weisi-zhang.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/weisi-zhang.jpeg -------------------------------------------------------------------------------- /people/photos/will-davis.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/will-davis.png -------------------------------------------------------------------------------- /people/photos/xiaohang-lu.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/xiaohang-lu.jpg -------------------------------------------------------------------------------- /people/photos/xu-han.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/xu-han.jpg -------------------------------------------------------------------------------- /people/photos/xu-wang.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/xu-wang.jpg -------------------------------------------------------------------------------- /people/photos/yian-mo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/yian-mo.jpg -------------------------------------------------------------------------------- /people/photos/yingxiang-lu.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/yingxiang-lu.jpg -------------------------------------------------------------------------------- /people/photos/yixin-ye.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/yixin-ye.JPG -------------------------------------------------------------------------------- /people/photos/yiyuan-feng.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/yiyuan-feng.jpg -------------------------------------------------------------------------------- /people/photos/young-sang-choi.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/young-sang-choi.jpg -------------------------------------------------------------------------------- /people/photos/yuan-chang.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/yuan-chang.jpg -------------------------------------------------------------------------------- /people/photos/yuan-xuan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/yuan-xuan.png -------------------------------------------------------------------------------- /people/photos/yuan-zhou.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/yuan-zhou.JPG -------------------------------------------------------------------------------- /people/photos/yuchen-shi.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/yuchen-shi.jpg -------------------------------------------------------------------------------- /people/photos/yuhui-dai.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/yuhui-dai.jpg -------------------------------------------------------------------------------- /people/photos/yunie-mao.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/yunie-mao.jpg -------------------------------------------------------------------------------- /people/photos/yuxiang-zhu.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/yuxiang-zhu.jpeg -------------------------------------------------------------------------------- /people/photos/yuxue-mei.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/yuxue-mei.jpg -------------------------------------------------------------------------------- /people/photos/zen-yui.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/zen-yui.jpg -------------------------------------------------------------------------------- /people/photos/zhan-zhang.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/zhan-zhang.png -------------------------------------------------------------------------------- /people/photos/zhanif.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/zhanif.jpg -------------------------------------------------------------------------------- /people/photos/zheyuan-gu.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/zheyuan-gu.jpg -------------------------------------------------------------------------------- /people/photos/zhiyuan-jia.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/zhiyuan-jia.jpg -------------------------------------------------------------------------------- /people/photos/zihan-ni.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/zihan-ni.jpg -------------------------------------------------------------------------------- /people/photos/zongcheng-yang.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CT-CS5356-Fall2017/cs5356/570403fb1321de97710c90c961ac040f7ad51c16/people/photos/zongcheng-yang.jpg -------------------------------------------------------------------------------- /people/poyen-tseng.md: -------------------------------------------------------------------------------- 1 | Po Yen Tseng 2 | ------------ 3 | 4 | ![](photos/poyen-tseng.jpg) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/po-yen-tseng-6509b5a0/) 7 | * [Github](https://github.com/pytseng) 8 | * [Website](http://pytseng.com) -------------------------------------------------------------------------------- /people/rahul-chatterjee.md: -------------------------------------------------------------------------------- 1 | Rahul Chatterjee 2 | ---------------- 3 | 4 | ![](photos/rahul-chatterjee.jpg) 5 | 6 | * [Github](https://github.com/rchatterjee) 7 | -------------------------------------------------------------------------------- /people/rainie-sun.md: -------------------------------------------------------------------------------- 1 | Rainie Sun 2 | ------------ 3 | 4 | ![](photos/rainie-sun.jpg) 5 | 6 | * [Github](https://github.com/JossSun) 7 | -------------------------------------------------------------------------------- /people/raviteja-arikati.md: -------------------------------------------------------------------------------- 1 | Raviteja Arikati 2 | ------------ 3 | 4 | ![](photos/raviteja-arikati.jpg) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/tejkati/) 7 | * [Github](https://github.com/tejkati) 8 | -------------------------------------------------------------------------------- /people/ray-su.md: -------------------------------------------------------------------------------- 1 | Ray Su 2 | ------------ 3 | 4 | ![](photos/ray-su.jpg) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/ziruisu/) 7 | * [Github](https://github.com/suziray) 8 | -------------------------------------------------------------------------------- /people/renee-zacharowicz.md: -------------------------------------------------------------------------------- 1 | Renee Zacharowicz 2 | ------------ 3 | 4 | ![](photos/renee-zacharowicz.jpg) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/renee-zacharowicz/) 7 | * [Github](https://github.com/Estheray/) 8 | 9 | -------------------------------------------------------------------------------- /people/robert-wolfe.md: -------------------------------------------------------------------------------- 1 | Robert Wolfe 2 | ------------ 3 | 4 | ![](photos/robert-wolfe.JPG) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/robert-wolfe-92796a148) 7 | * [Github](https://github.com/rjw253) 8 | -------------------------------------------------------------------------------- /people/rohun-tripathi.md: -------------------------------------------------------------------------------- 1 | Rohun Tripathi 2 | ------------ 3 | 4 | ![](photos/rohun-tripathi.png) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/rohun-tripathi/) 7 | * [Github](https://github.com/rohun-tripati) -------------------------------------------------------------------------------- /people/rom-cohen.md: -------------------------------------------------------------------------------- 1 | Rom Cohen 2 | ------------ 3 | 4 | ![](photos/rom-cohen.jpg) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/rom-cohen-8a8700137/) 7 | * [Github](https://github.com/romCohen) 8 | -------------------------------------------------------------------------------- /people/romoli-bakshi.md: -------------------------------------------------------------------------------- 1 | Romoli Bakshi 2 | ------------ 3 | 4 | ![](photos/romoli-bakshi.png) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/romoli-bakshi-9647ba57/) 7 | * [Github](https://github.com/RomoliBakshi/) 8 | -------------------------------------------------------------------------------- /people/rongxin-zhang.md: -------------------------------------------------------------------------------- 1 | Rongxin Zhang 2 | ------------ 3 | 4 | ![](photos/rongxin-zhang.png) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/rongxin-zhang-941a3550/) 7 | * [Github](https://github.com/RongxinZhang) 8 | -------------------------------------------------------------------------------- /people/ruihao-zhu.md: -------------------------------------------------------------------------------- 1 | Ruihao Zhu 2 | ------------ 3 | 4 | ![](photos/ruihao-zhu.jpg) 5 | 6 | * [Github](https://github.com/rzhu9) -------------------------------------------------------------------------------- /people/ryan-ramphal.md: -------------------------------------------------------------------------------- 1 | Ryan Ramphal 2 | ------------ 3 | 4 | ![](photos/ryan-ramphal.jpg) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/ryanramphal/) 7 | * [Github](https://github.com/rramphal100) 8 | -------------------------------------------------------------------------------- /people/saliou-diallo.md: -------------------------------------------------------------------------------- 1 | Saliou Diallo 2 | ------------- 3 | 4 | ![](photos/saliou-diallo.png) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/sddioulde) 7 | * [Github](https://github.com/sddioulde) 8 | -------------------------------------------------------------------------------- /people/samantha-yip.md: -------------------------------------------------------------------------------- 1 | samantha yip 2 | ------------ 3 | 4 | ![](photos/samantha-yip.jpg) 5 | 6 | * [LinkedIn](www.linkedin.com/in/samantha-yip) 7 | * [Github](https://github.com/samanthayip) 8 | -------------------------------------------------------------------------------- /people/sarah-le-cam.md: -------------------------------------------------------------------------------- 1 | Sarah Le Cam 2 | ------------ 3 | 4 | ![](photos/sarah-le-cam.jpg) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/sarah-le-cam-31937490/) 7 | * [Github](https://github.com/sdl83) 8 | * [SoundCloud](https://soundcloud.com/sarah-le-cam) 9 | -------------------------------------------------------------------------------- /people/saran-krish.md: -------------------------------------------------------------------------------- 1 | Saran Kumar Krishnasamy 2 | ----------------------- 3 | 4 | ![](photos/saran-krish.jpg) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/sarankrishnasamy/) -------------------------------------------------------------------------------- /people/seye-bankole.md: -------------------------------------------------------------------------------- 1 | Seye Bankole 2 | ---------------- 3 | 4 | ![](photos/seye-bankole.JPG) 5 | 6 | * [Github](https://github.com/obanko01) 7 | -------------------------------------------------------------------------------- /people/spark-shen.md: -------------------------------------------------------------------------------- 1 | Spark Shen 2 | ------------ 3 | 4 | ![](photos/spark-shen.jpg) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/sparkshen) 7 | * [Github](https://github.com/Spark-Xl) 8 | * [Website](http://spark-xl.github.io/website) -------------------------------------------------------------------------------- /people/stephen-bongner.md: -------------------------------------------------------------------------------- 1 | Stephen Bongner 2 | ------------ 3 | 4 | ![](photos/stephen-bongner.jpg) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/stephen-bongner-01298993/) 7 | * [Github](https://github.com/sb2483) 8 | -------------------------------------------------------------------------------- /people/steve-lee.md: -------------------------------------------------------------------------------- 1 | Steve Lee 2 | ------------ 3 | 4 | ![](photos/steve-lee.jpg) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/stevelee/) 7 | * [Github](https://www.github.com/steveleee) 8 | -------------------------------------------------------------------------------- /people/steven-jaroslawski.md: -------------------------------------------------------------------------------- 1 | Steven Jaroslawski 2 | ------------ 3 | 4 | ![](photos/steven-jaroslawski.jpg) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/steven-jaroslawski-b41b30117/) 7 | * [Github](https://github.com/sjaroslawski) 8 | -------------------------------------------------------------------------------- /people/subhangi-agarwala.md: -------------------------------------------------------------------------------- 1 | Subhangi Agarwala 2 | ------------ 3 | 4 | ![](photos/subhangi-agarwala.jpg) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/subhangi-agarwala-57954710a) 7 | 8 | -------------------------------------------------------------------------------- /people/svava-kristinsdottir.md: -------------------------------------------------------------------------------- 1 | svava kristinsdottir 2 | ------------ 3 | 4 | ![](photos/svava-kristinsdottir.jpg) 5 | 6 | * [Github](https://github.com/kristinsdottir) 7 | -------------------------------------------------------------------------------- /people/tao-yuan.md: -------------------------------------------------------------------------------- 1 | Tao Yuan 2 | ------------ 3 | 4 | ![](photos/tao-yuan.jpg) 5 | 6 | * [Github](https://github.com/bayernstar) 7 | -------------------------------------------------------------------------------- /people/thomas-matecki.md: -------------------------------------------------------------------------------- 1 | [linkedin](https://www.linkedin.com/in/thomas-matecki-6908b112/) 2 | [github](https://github.com/thomasmatecki) 3 | [stackoverflow](https://stackoverflow.com/users/4238173/thomas-matecki) 4 | -------------------------------------------------------------------------------- /people/travis-allen.md: -------------------------------------------------------------------------------- 1 | Travis Allen 2 | ------------ 3 | * [Github](https://github.com/trallen91) -------------------------------------------------------------------------------- /people/vicente-rotman-hinzpeter.md: -------------------------------------------------------------------------------- 1 | Vicente Rotman Hinzpeter 2 | ------------ 3 | 4 | ![](photos/vicente-rotman-hinzpeter.jpg) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/vicente-rotman-h-0379233a) 7 | * [Github](https://github.com/vrotmanh) 8 | -------------------------------------------------------------------------------- /people/vijay-pillai.md: -------------------------------------------------------------------------------- 1 | Vijay Pillai 2 | ------------ 3 | 4 | ![](photos/vijay-pillai.jpg) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/vijay-pillai-3b9680108/) 7 | * [Github](https://github.com/Vijay-P) 8 | -------------------------------------------------------------------------------- /people/vincent-kuo.md: -------------------------------------------------------------------------------- 1 | Vincent Kuo 2 | ------------ 3 | 4 | ![](photos/vincent-kuo.png) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/ching-chen-vincent-kuo-77111a61/) 7 | * [Github](https://github.com/chingchenkuo) -------------------------------------------------------------------------------- /people/vinson-wang.md: -------------------------------------------------------------------------------- 1 | Vinson Wang 2 | ----------- 3 | 4 | ![](photos/vinson-wang.jpg) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/xiyivinsonwang/) 7 | * [Github](https://github.com/vinsonwxy) 8 | -------------------------------------------------------------------------------- /people/weisi-zhang.md: -------------------------------------------------------------------------------- 1 | Weisi Zhang 2 | ----------- 3 | 4 | ![](photos/weisi-zhang.jpeg) 5 | 6 | * [Github](https://github.com/wz337) 7 | 8 | -------------------------------------------------------------------------------- /people/will-davis.md: -------------------------------------------------------------------------------- 1 | Will Davis 2 | ------------ 3 | 4 | ![](photos/will-davis.png) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/will-davis-6758b364/) 7 | * [Github](https://github.com/twd38) 8 | -------------------------------------------------------------------------------- /people/xiaohang-lu.md: -------------------------------------------------------------------------------- 1 | Xiaohang Lu 2 | ------------ 3 | 4 | ![](photos/xiaohang-lu.jpg) 5 | 6 | * [Github](https://github.com/LuXiaohang) 7 | -------------------------------------------------------------------------------- /people/xu-han.md: -------------------------------------------------------------------------------- 1 | Xu Han 2 | ------------ 3 | 4 | ![](photos/xu-han.jpg) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/xu-han-31337359/) 7 | * [Github](https://github.com/leohunt) 8 | -------------------------------------------------------------------------------- /people/xu-wang.md: -------------------------------------------------------------------------------- 1 | Xu Wang 2 | ------------ 3 | 4 | ![](photos/xu-wang.jpg) 5 | 6 | * [Github](https://github.com/xuwanggr) 7 | -------------------------------------------------------------------------------- /people/yian-mo.md: -------------------------------------------------------------------------------- 1 | Yian Mo 2 | ------------ 3 | 4 | ![](photos/yian-mo.jpg) 5 | 6 | * [LinkedIn](www.linkedin.com/in/yianmo) 7 | * [Github](https://github.com/moyk) 8 | -------------------------------------------------------------------------------- /people/yingxiang-lu.md: -------------------------------------------------------------------------------- 1 | Yingxiang Lu 2 | ------------ 3 | 4 | ![](photos/yingxiang-lu.jpg) 5 | 6 | * [Github](https://github.com/yl4bg) 7 | -------------------------------------------------------------------------------- /people/yixin-ye.md: -------------------------------------------------------------------------------- 1 | Yixin Ye 2 | ----------- 3 | 4 | ![](photos/yixin-ye.JPG) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/eli-ye/) 7 | * [Github](https://github.com/yeyixin1993) 8 | -------------------------------------------------------------------------------- /people/yiyuan-feng.md: -------------------------------------------------------------------------------- 1 | Yiyuan Feng 2 | ------------ 3 | 4 | ![](photos/yiyuan-feng.jpg) 5 | 6 | * [Github](https://github.com/Yiyuan7) 7 | -------------------------------------------------------------------------------- /people/young-sang-choi.md: -------------------------------------------------------------------------------- 1 | Young Sang Choi 2 | ------------ 3 | 4 | ![](photos/young-sang-choi.jpg) 5 | 6 | * [Github](https://github.com/ysc321) 7 | -------------------------------------------------------------------------------- /people/yuan-chang.md: -------------------------------------------------------------------------------- 1 | Yuan Chang 2 | ------------ 3 | 4 | ![](photos/yuan-chang.jpg) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/jennie-yuanchang/) 7 | * [Github](https://github.com/JennieYuanChang/) 8 | -------------------------------------------------------------------------------- /people/yuan-xuan.md: -------------------------------------------------------------------------------- 1 | Yuan Xuan 2 | --------- 3 | 4 | ![](photos/yuan-xuan.png) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/yuan-xuan-397a38113/) 7 | * [Github](https://github.com/Yuan-T-Xuan) 8 | 9 | -------------------------------------------------------------------------------- /people/yuan-zhou.md: -------------------------------------------------------------------------------- 1 | Yuan Zhou 2 | ------------ 3 | 4 | ![](photos/yuan-zhou.JPG) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/fred-zhou-336847b1) 7 | * [Github](https://github.com/fredzhou93) 8 | -------------------------------------------------------------------------------- /people/yuchen-shi.md: -------------------------------------------------------------------------------- 1 | Yuchen Shi 2 | ---------------- 3 | 4 | ![](photos/yuchen-shi.jpg) 5 | 6 | * [Github](https://github.com/ys838) -------------------------------------------------------------------------------- /people/yuhui-dai.md: -------------------------------------------------------------------------------- 1 | Yuhui Dai 2 | ------------ 3 | 4 | ![](photos/yuhui-dai.jpg) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/yuhui-dai-78439185/) 7 | * [Github](https://github.com/YuhuiDai) 8 | * [Website](https://yuhuidai.github.io/) 9 | -------------------------------------------------------------------------------- /people/yunie-mao.md: -------------------------------------------------------------------------------- 1 | Yunie Mao 2 | ------------ 3 | 4 | ![](photos/yunie-mao.jpg) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/yuniem) 7 | * [Github](https://github.com/ym224) 8 | -------------------------------------------------------------------------------- /people/yuxiang-zhu.md: -------------------------------------------------------------------------------- 1 | Yuxiang Zhu 2 | ------------ 3 | 4 | ![](photos/yuxiang-zhu.jpeg) 5 | 6 | * [Github](https://github.com/jimzhu1993) 7 | -------------------------------------------------------------------------------- /people/yuxue-mei.md: -------------------------------------------------------------------------------- 1 | Yuxue Mei 2 | ------------ 3 | 4 | ![](photos/yuxue-mei.jpg) 5 | 6 | * [Github](https://github.com/Detective2016) 7 | -------------------------------------------------------------------------------- /people/zeeshan-hanif.md: -------------------------------------------------------------------------------- 1 | Zeeshan Hanif 2 | ------------ 3 | 4 | ![](photos/zhanif.jpg) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/zhanif1/) 7 | * [Github](https://github.com/zeeshanh) -------------------------------------------------------------------------------- /people/zen-yui.md: -------------------------------------------------------------------------------- 1 | Zen Yui 2 | ----------- 3 | 4 | ![](photos/zen-yui.jpg) 5 | 6 | * [Github](https://github.com/zenyui) 7 | * [LinkedIn](https://linkedin.com/in/zenyui) 8 | -------------------------------------------------------------------------------- /people/zhan-zhang.md: -------------------------------------------------------------------------------- 1 | Zhan Zhang 2 | ------------ 3 | 4 | ![](photos/zhan-zhang.png) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/zhang-zhan-0b371080/) 7 | * [Github](https://github.com/Ricardo-Zhang) 8 | -------------------------------------------------------------------------------- /people/zheyuan-gu.md: -------------------------------------------------------------------------------- 1 | Zheyuan Gu 2 | ------------ 3 | 4 | ![](photos/zheyuan-gu.jpg) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/david-gu-825b1a91/) 7 | * [Github](https://github.com/GoodGucciGu) 8 | -------------------------------------------------------------------------------- /people/zhiyuan-jia.md: -------------------------------------------------------------------------------- 1 | Zhiyuan Jia 2 | ----------- 3 | 4 | ![](photos/zhiyuan-jia.jpg) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/zhiyuan-jia-42a961148/?trk=uno-choose-ge-no-intent&dl=no) 7 | * [Github](https://github.com/ZivJia) 8 | -------------------------------------------------------------------------------- /people/zihan-ni.md: -------------------------------------------------------------------------------- 1 | Zihan Ni 2 | ------------ 3 | 4 | ![](photos/zihan-ni.jpg) 5 | 6 | * [LinkedIn](https://www.linkedin.com/in/zihan-ni-87655458/) 7 | * [Github](https://github.com/zn8ae) 8 | -------------------------------------------------------------------------------- /people/zongcheng-yang.md: -------------------------------------------------------------------------------- 1 | ![](photos/zongcheng-yang.jpg) 2 | 3 | * [LinkedIn](https://www.linkedin.com/in/zongcheng-yang-74798a8b/) 4 | * [Github](https://github.com/zongchengyang) 5 | --------------------------------------------------------------------------------