├── README.md ├── scripts └── main.js ├── styles └── main.css └── index.html /README.md: -------------------------------------------------------------------------------- 1 | # pwl-kyiv 2 | Papers We Love @ Kyiv 3 | -------------------------------------------------------------------------------- /scripts/main.js: -------------------------------------------------------------------------------- 1 | (function(global, root) { 2 | 'use strict'; 3 | 4 | const PIXEL_RATIO = global.devicePixelRatio; 5 | 6 | const W_WIDTH = global.innerWidth; 7 | const W_HEIGHT = global.innerHeight; 8 | 9 | const WIDTH = W_WIDTH * PIXEL_RATIO; 10 | const HEIGHT = W_HEIGHT * PIXEL_RATIO; 11 | 12 | const BLACK = 0x000000; 13 | 14 | const NUM_OF_DOTS = Math.floor(W_WIDTH / (1280 / 4)); 15 | 16 | const MIN_R = 0.5; 17 | const MAX_R = 2.5; 18 | 19 | var canvas = root.querySelector('.background'); 20 | 21 | canvas.width = WIDTH; 22 | canvas.height = HEIGHT; 23 | canvas.style.transform = `scale(${1 / PIXEL_RATIO})`; 24 | 25 | var ctx = canvas.getContext('2d'); 26 | 27 | Array.apply(null, Array(NUM_OF_DOTS)) 28 | .forEach((r) => { 29 | drawDot( 30 | getRandomInt(0, WIDTH), 31 | getRandomInt(0, HEIGHT), 32 | getRandomInt(MIN_R, MAX_R), 33 | BLACK, 34 | ctx); 35 | }); 36 | 37 | if (W_WIDTH >= 800) { 38 | drawDirtStroke(0, 0, 0.5, 2, 300, HEIGHT); 39 | } 40 | 41 | function drawDirtStroke(x, y, min, max, w, h) { 42 | for (let i = 0; i < w; i += max * 26) { 43 | for (let j = 0; j < h; j += max * 8) { 44 | drawDot(x + i * Math.sin(i), y + j * Math.sin(i), getRandomInt(min, max), BLACK, ctx); 45 | } 46 | } 47 | } 48 | 49 | function drawDot(x, y, r, color, ctx) { 50 | ctx.fillColor = color; 51 | ctx.beginPath(); 52 | ctx.arc(x, y, r, Math.PI * 2, false); 53 | ctx.closePath(); 54 | ctx.fill(); 55 | } 56 | 57 | function getRandomInt(min, max) { 58 | return Math.floor(Math.random() * (max - min + 1)) + min; 59 | } 60 | })(window, document); 61 | -------------------------------------------------------------------------------- /styles/main.css: -------------------------------------------------------------------------------- 1 | body { 2 | margin: 0; 3 | font: normal 16px 'Crimson Text', 'Times New Roman', serif; 4 | color: #161616; 5 | } 6 | 7 | a { 8 | color: #161616; 9 | } 10 | 11 | p { 12 | margin: 10px 0; 13 | font-size: 16px; 14 | } 15 | 16 | h1 { 17 | font-weight: 400; 18 | font-size: 3em; 19 | margin: 10px 0; 20 | } 21 | 22 | h2 { 23 | font-size: 2.4em; 24 | } 25 | 26 | .register { 27 | font-size: 18px; 28 | text-transform: uppercase; 29 | } 30 | 31 | .page-header, 32 | .content, 33 | .page-footer { 34 | position: relative; 35 | z-index: 1; 36 | } 37 | 38 | .page-header { 39 | text-align: center; 40 | margin: 0 0 40px; 41 | } 42 | 43 | .content { 44 | padding: 0 10px 0 20px; 45 | } 46 | 47 | .intro, 48 | .speakers { 49 | max-width: 900px; 50 | margin: 120px auto; 51 | } 52 | 53 | .contents { 54 | text-align: left; 55 | max-width: 420px; 56 | margin: 0 auto; 57 | } 58 | 59 | .contents h2 { 60 | margin: 60px 0 20px; 61 | } 62 | 63 | .contents > .list { 64 | margin: 0; 65 | } 66 | 67 | .list { 68 | margin: 0 0 0 22px; 69 | padding: 0; 70 | counter-reset: item; 71 | } 72 | 73 | .list h3 { 74 | display: inline-block; 75 | margin: 2px 0; 76 | } 77 | 78 | .list li { 79 | font-size: 1.1em; 80 | margin: 6px 0; 81 | display: block; 82 | overflow-x: hidden; 83 | } 84 | 85 | .list li:before { 86 | content: counters(item, ".") " "; 87 | counter-increment: item; 88 | margin: 0 8px 0 0; 89 | } 90 | 91 | .list .chapter:before { 92 | font-weight: bold; 93 | font-size: 21px; 94 | margin: 0 8px 0 0; 95 | } 96 | 97 | .list .speaker:after { 98 | float: left; 99 | width: 0; 100 | position: relative; 101 | left: 40px; 102 | white-space: nowrap; 103 | content: 104 | ". . . . . . . . . . . . . . . . . . . . " 105 | ". . . . . . . . . . . . . . . . ."; 106 | } 107 | 108 | .list .speaker .name { 109 | padding: 0 8px 0 0; 110 | background: white; 111 | position: relative; 112 | z-index: 1; 113 | } 114 | 115 | .list time { 116 | float: right; 117 | padding: 0 0 0 8px; 118 | background: white; 119 | position: relative; 120 | z-index: 1; 121 | } 122 | 123 | .info { 124 | text-align: center; 125 | margin: 30px 0 0; 126 | } 127 | 128 | .page-footer { 129 | text-align: center; 130 | margin: 50px 0 0; 131 | } 132 | 133 | .background { 134 | position: absolute; 135 | top: 0; 136 | left: 0; 137 | z-index: 0; 138 | transform-origin: 0 0; 139 | } 140 | 141 | @media (max-width: 440px) { 142 | h1 { 143 | font-size: 2em; 144 | } 145 | 146 | h2 { 147 | font-size: 1.6em; 148 | } 149 | } 150 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Papers We Love @ Kyiv 6 | 7 | 8 | 9 | 10 | 11 | 12 | 17 | 18 |
19 | 20 |
21 |

Contents

22 |
    23 |
  1. 24 |

    Introduction

    25 |
  2. 26 |
  3. 27 |

    Schedule

    28 |
      29 |
    1. 30 | Alexey Raspopov 31 | 32 |
    2. 33 |
    3. 34 | Break 35 | 36 |
    4. 37 |
    5. 38 | Andrew Lelechenko 39 | 40 |
    6. 41 |
    7. 42 | Break 43 | 44 |
    8. 45 |
    9. 46 | Vladimir Kirilov 47 | 48 |
    10. 49 |
    11. 50 | Break 51 | 52 |
    12. 53 |
    13. 54 | Lightning Talks 55 | 56 |
    14. 57 |
    15. 58 | Afterparty 59 | – ... 60 |
    16. 61 |
    62 |
  4. 63 |
64 |
65 | 66 |
67 |

Introduction

68 |

Papers We Love (PWL) is a community built around reading, discussing and learning more about academic computer science papers. This part of CS-related topics are not covered well in Ukraine. PWL Kyiv is an attempt to solve this.

69 |
70 | 71 |
72 |

Schedule

73 | 87 |
88 | 89 |
90 | 91 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | --------------------------------------------------------------------------------