Code page

This commit is contained in:
simon987 2019-08-21 19:34:49 -04:00
parent 86d5bdda54
commit fd40d645ff
35 changed files with 823 additions and 144 deletions

0
jenkins/deploy.sh Executable file → Normal file
View File

0
simon987/build/webpack.dev.conf.js Executable file → Normal file
View File

View File

@ -3,7 +3,7 @@
<head>
<meta charset="utf-8">
<meta content="width=device-width,initial-scale=1,minimal-ui" name="viewport">
<link rel="stylesheet" href="//fonts.googleapis.com/css?family=Roboto:400,500,700,400italic|Material+Icons">
<link rel="stylesheet" href="static/md-icons.css">
<title>simon987.net</title>
</head>

View File

@ -5552,9 +5552,9 @@
}
},
"lodash": {
"version": "4.17.11",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
"integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg=="
"version": "4.17.15",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
"integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A=="
},
"lodash.camelcase": {
"version": "4.3.0",
@ -5951,9 +5951,9 @@
}
},
"mixin-deep": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz",
"integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==",
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz",
"integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==",
"dev": true,
"requires": {
"for-in": "^1.0.2",
@ -9824,9 +9824,9 @@
"dev": true
},
"set-value": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz",
"integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==",
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz",
"integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==",
"dev": true,
"requires": {
"extend-shallow": "^2.0.1",
@ -10738,38 +10738,15 @@
}
},
"union-value": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz",
"integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=",
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz",
"integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==",
"dev": true,
"requires": {
"arr-union": "^3.1.0",
"get-value": "^2.0.6",
"is-extendable": "^0.1.1",
"set-value": "^0.4.3"
},
"dependencies": {
"extend-shallow": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
"integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
"dev": true,
"requires": {
"is-extendable": "^0.1.0"
}
},
"set-value": {
"version": "0.4.3",
"resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz",
"integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=",
"dev": true,
"requires": {
"extend-shallow": "^2.0.1",
"is-extendable": "^0.1.1",
"is-plain-object": "^2.0.1",
"to-object-path": "^0.3.0"
}
}
"set-value": "^2.0.1"
}
},
"uniq": {

View File

@ -1,7 +1,7 @@
{
"name": "simon987.net",
"version": "1.0.0",
"description": "A Vue.js project",
"version": "1.2.0",
"description": "My personal website",
"author": "simon987 <me@simon987.net>",
"private": true,
"scripts": {
@ -11,7 +11,7 @@
},
"dependencies": {
"d3": "^5.9.2",
"lodash": "^4.17.11",
"lodash": "^4.17.15",
"pixi.js": "^4.8.7",
"vue": "^2.6.10",
"vue-material": "^1.0.0-beta-11",

View File

@ -5,6 +5,9 @@
</template>
<script>
import 'vue-material/dist/vue-material.min.css'
import 'vue-material/dist/theme/default.css'
export default {
name: 'App'
}

View File

@ -1,11 +1,9 @@
import * as PIXI from 'pixi.js'
import * as _ from 'lodash'
function Grid(cellSize, tickLen, colScheme) {
function Grid(cellSize, tickLen, themes) {
this._c1 = colScheme.c1;
this._c2 = colScheme.c2;
this._c3 = colScheme.c3;
let lastTheme = -1;
this.seed = function () {
this._cells = new Uint8Array(this._cellCount).map(() => {
@ -19,7 +17,29 @@ function Grid(cellSize, tickLen, colScheme) {
});
};
this.getTheme = function () {
if (lastTheme === -1) {
lastTheme = 0;
return lastTheme;
} else {
let theme;
do {
theme = Math.floor(Math.random() * themes.length);
} while (theme === lastTheme);
lastTheme = theme;
return theme;
}
};
this.setRandomColorSchemes = function() {
let theme = themes[this.getTheme()];
this._c1 = theme.c1;
this._c2 = theme.c2;
this._c3 = theme.c3;
};
this.resize = function () {
this.setRandomColorSchemes();
this._pxWidth = window.innerWidth;
this._pxHeight = window.innerHeight;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.7 KiB

View File

@ -0,0 +1,225 @@
<template>
<div id="content" class="md-layout">
<md-card class="md-layout-item md-elevation-10">
<md-card-header>
<md-card-header-text>
<span class="md-title"><md-icon class="md-size-2x">code</md-icon> Code</span>
</md-card-header-text>
</md-card-header>
<md-card-content>
This is a partial list of my active programming projects
</md-card-content>
<Project
name="Much Assembly Required"
date="[2017-11]"
description="Multi-player 16-bit assembly programming game in your browser."
:techs="['Java', 'Pixi.js', 'Typescript', 'MongoDB', 'x86-16 ASM']"
:links="[{github: 'https://github.com/simon987/Much-Assembly-Required'}, {website:'https://muchassemblyrequired.com'}]"
media="/static/cubot.png"
/>
<!-- TODO: demo website -->
<Project
name="Simple Incremental Search Tool"
date="[2018-01]"
description="Simple web frontend to an elasticsearch database made for local files indexing.
Enables lightning-fast incremental (as you type) search in a modern Web UI."
:techs="['Elasticsearch', 'Python', 'Flask', 'Javascript', 'SQLite', 'Test-Driven']"
:links="[{github: 'https://github.com/simon987/Simple-Incremental-Search-Tool'}, {demo:'https://sist.simon987.net'}]"
media="/static/sist.png"
/>
<Project
name="Misc Web scraping"
date="[2018-02]"
description=""
:techs="['Python', 'SQLite']"
media="/static/python.png"
/>
<Project
name="OD-Database"
date="[2018-07]"
description="Distributed crawler, database and web frontend for public directories indexing."
:techs="['Elasticsearch', 'Python', 'Flask', 'PostgreSQL']"
:links="[{github: 'https://github.com/simon987/od-database'}, {website:'https://od-db.the-eye.eu'}]"
media="/static/oddb.png"
/>
<Project
name="task_tracker"
date="[2019-02]"
description="Fast task tracker (job queue) with authentication, statistics and web frontend"
:techs="['Go', 'PostgreSQL', 'Angular', 'Test-Driven']"
:links="[{github: 'https://github.com/simon987/task_tracker'}, {demo:'https://tt.simon987.net'}]"
media="/static/tt.png"
/>
<Project
name="task_tracker_drone"
date="[2019-03]"
description="General purpose 'set and forget' task runner and client library for task_tracker"
:techs="['Python']"
:links="[{github: 'https://github.com/simon987/task_tracker_drone'}]"
media="/static/worker.png"
/>
<Project
name="ws_bucket"
date="[2019-03]"
description="Simple websocket-based file upload service with token-based auth. Currently used to allow secure file upload for OD-Database workers."
:techs="['Go', 'Test-Driven']"
:links="[{github: 'https://github.com/simon987/ws_bucket'}]"
media="/static/go.png"
/>
<Project
name="Music graph (API & UI)"
date="[2019-04]"
description="Massive Web scraping project that attempts to aggregate raw information from
Musicbrainz, Last.fm, Spotify and Cover Art Archive to generate an interactive map of music-related data.
Uses a graph-database as its core and allows subsecond searching through tens of millions of relationships
with its mobile-friendly interface"
:techs="['D3.js', 'Graph Database', 'Vue.js', 'Python', 'Bash', 'Java']"
:links="[{'github (ui)': 'https://github.com/simon987/music-graph-ui'}, {'github (api)': 'https://github.com/simon987/music-graph-api'}, {website: 'https://mg.simon987.net'}]"
media="/static/mg.png"
/>
<Project
name="DataArchivist.net"
date="[2019-04]"
description="Personal data archival blog"
:techs="['HTML', 'Hugo']"
:links="[{'github': 'https://github.com/simon987/dataarchivist.net'}, {website: 'https://dataarchivist.net'}]"
media="/static/rss.png"
/>
<Project
name="simon987.net"
date="[2019-04]"
description="My personal website"
:techs="['Pixi.js', 'Vue.js']"
:links="[{'github': 'https://github.com/simon987/simon987.net'}, {website: 'https://simon987.net'}]"
media="/static/net.png"
/>
<Project
name="irarchives"
date="[2019-05]"
description="Large scale reverse image and video search for reddit.
This project is a massive rewrite & refactor of the now defunct i.rarchives.com website.
It uses a combination of real-time ingesting using reddit_feed and historical
archival from Pushshift. Several optimizations have been implemented to allow parametrised
image and video search possible among its large dataset (See pg_hamming)."
:techs="['Python', 'PostgreSQL', 'Javascript']"
:links="[{'github': 'https://github.com/simon987/irarchives'}]"
media="/static/irar.png"
/>
<Project
name="Architeuthis"
date="[2019-05]"
description="MITM HTTP(S) proxy with integrated load-balancing, rate-limiting and error handling.
This tool was implemented to de-couple the often repetitive
HTTP error handling & rate-limiting logic from many Web scraping jobs."
:techs="['Go']"
:links="[{'github': 'https://github.com/simon987/Architeuthis'}]"
media="/static/archi.png"
/>
<Project
name="pg_hamming"
date="[2019-07]"
description="Custom C-Level function for PostgreSQL to calculate hamming distance
for fixed-length BYTEA datatype. Was designed and optimized to drastically reduce
the query time of the irarchives project."
:techs="['C', 'PostgreSQL']"
:links="[{'github': 'https://github.com/simon987/pg_hamming'}]"
media="/static/hamming.png"
/>
<Project
name="beemer"
date="[2019-07]"
description="beemer is an utility tool that executes a custom command on files written in a watched
directory. It is mainly used to facilitate offloading of large datasets generated by
scraping jobs to cloud storage."
:techs="['Go']"
:links="[{'github': 'https://github.com/simon987/beemer'}]"
media="/static/go.png"
/>
<Project
name="phpBB request system"
date="[2019-07]"
description="Simple request system for phpBB3.2 built for an online community"
:techs="['PHP']"
:links="[{'github': 'https://github.com/simon987/phpBB-reqs'}]"
media="/static/phpbb.png"
/>
<Project
name="reddit_feed"
date="[2019-08]"
description="Fault-tolerant daemon that fetches comments and submissions from reddit.
Was built to de-couple, centralize and simplify reddit API calls for various other projects."
:techs="['Python', 'RabbitMQ']"
:links="[{'github': 'https://github.com/simon987/reddit_feed'}]"
media="/static/reddit_feed.png"
/>
<Project
name="chan_feed"
date="[2019-08]"
description="Daemon that fetches posts from compatible *chan image boards.
It keeps track of visited threads to minimize the number of HTTP requests."
:techs="['Python', 'RabbitMQ', 'SQLite']"
:links="[{'github': 'https://github.com/simon987/chan_feed'}]"
media="/static/chan_feed.png"
/>
<Project
name="telegram ingest"
date="[2019-08]"
description="Pushshift Telegram Ingest."
:techs="['Python', 'Elasticsearch', 'Javascript']"
:links="[{'github': 'https://github.com/pushshift/telegram'}]"
media="/static/telegram.png"
fork
/>
</md-card>
<router-link to="/">
<md-button class="md-fab md-fixed md-fab-top-left">
<md-icon>arrow_back</md-icon>
</md-button>
</router-link>
</div>
</template>
<script>
import Project from "./Project";
export default {
name: "Code",
components: {Project}
}
</script>
<style scoped>
.md-card {
background-color: white;
margin: 2em;
max-width: 1200px;
min-width: inherit;
}
.md-layout-item {
margin-left: auto;
margin-right: auto;
}
</style>

View File

@ -9,17 +9,48 @@
import Grid from '../Grid';
import Jumbotron from "./Jumbotron";
let lightTheme = {
c1: 0xf9989f,
c2: 0xfccb8f,
c3: 0xc5f8c8
};
let darkTheme = {
c1: 0x3a3b52,
c2: 0x33284b,
c3: 0x2c2332
};
let themes = [
{
c1: 0xf9989f,
c2: 0xfccb8f,
c3: 0xc5f8c8
},
{
c1: 0x3a3b52,
c2: 0x33284b,
c3: 0x2c2332
},
{
c1: 0x547d59,
c2: 0xa0b97b,
c3: 0xbdc17c
},
{
c1: 0xd9bf68,
c2: 0xe05b7c,
c3: 0x811143
},
{
c1: 0x70ce9a,
c2: 0xf2f1c7,
c3: 0xc15b41
},
{
c1: 0xEAEBD7,
c2: 0x74645F,
c3: 0xF3876A
},
{
c1: 0xADBCB9,
c2: 0xC184E9,
c3: 0xD8C5C3
},
{
c1: 0xFA520B,
c2: 0xFCB20C,
c3: 0xE5E113
},
];
const urlParams = new URLSearchParams(window.location.search);
const size = urlParams.get('size');
@ -34,8 +65,7 @@ export default {
let grid = new Grid(
size ? size : window.innerWidth < 1000 ? 15 : 25,
window.innerWidth < 1000 ? 80 : 40,
// darkTheme
lightTheme
themes
);
grid.setup();
grid.resize();

View File

@ -1,52 +1,33 @@
<template>
<div id="content" class="md-layout">
<md-card class="md-layout-item md-elevation-10 md-size-90">
<md-card class="md-layout-item md-elevation-10 main-card">
<md-card-header>
<span class="md-display-3 text-mono">simon987.net<span class="vim-caret">_</span></span>
<md-card-header-text>
<span class="md-display-3 text-mono">simon987.net<span class="vim-caret">_</span></span>
</md-card-header-text>
</md-card-header>
<md-card-content>
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Optio itaque ea, nostrum odio. Dolores, sed
accusantium quasi non.
<!-- - Software engineering student-->
<!-- - Open source zealot-->
<!-- - Data archival hobbyist-->
</md-card-content>
<div class="sections">
<md-empty-state
md-rounded
md-icon="code"
md-label="Code"
md-description="Placeholder text">
</md-empty-state>
<md-button to="/code" class="md-raised big-button">
<md-icon class="md-accent">code</md-icon> Code
<div class="desc">Projects portfolio</div>
</md-button>
<md-empty-state
md-rounded
md-icon="edit"
md-label="Blog"
md-description="Placeholder text">
</md-empty-state>
</div>
<md-button to="/" class="md-raised big-button">
<md-icon class="md-accent">edit</md-icon> Blog
<div class="desc">Placeholder text</div>
</md-button>
<div class="sections-small">
<md-card md-with-hover>
<md-ripple>
<md-card-header><span class="md-title"><md-icon>code</md-icon>Code</span></md-card-header>
<md-card-content>Placeholder text</md-card-content>
</md-ripple>
</md-card>
<md-card md-with-hover>
<md-ripple>
<md-card-header><span class="md-title"><md-icon>edit</md-icon>Blog</span></md-card-header>
<md-card-content>Placeholder text</md-card-content>
</md-ripple>
</md-card>
<md-card md-with-hover>
<md-ripple>
<md-card-header><span class="md-title"><md-icon>email</md-icon>Contact</span></md-card-header>
<md-card-content>Placeholder text</md-card-content>
</md-ripple>
</md-card>
<md-button to="/" class="md-raised big-button">
<md-icon class="md-accent">email</md-icon> Contact
<div class="desc">Placeholder text</div>
</md-button>
</div>
</md-card>
</div>
@ -64,10 +45,8 @@ export default {
margin: 2em;
max-width: 1200px;
min-width: inherit;
}
.md-card .md-ripple {
padding: 0 1em;
padding: 2rem;
}
.text-mono {
@ -135,21 +114,10 @@ export default {
}
}
.md-empty-state {
display: inline-block;
margin-left: 16px;
margin-top: 1em;
margin-bottom: 2em;
}
.sections {
text-align: center;
}
.sections-small .md-card {
background-color: rgba(58, 59, 82, 0.08);
}
.md-layout-item {
margin-left: auto;
margin-right: auto;
@ -159,40 +127,24 @@ export default {
font-weight: bold;
}
@media screen and (max-width: 972px) {
.md-display-3 {
font-size: 42px;
}
.sections {
display: none;
}
.sections-small {
display: inherit;
}
.main-card {
padding: 1rem 2rem 2rem 2rem;
}
@media screen and (min-width: 972px) {
.sections-small {
display: none;
}
.big-button {
height: 110px;
width: 100%;
}
.md-empty-state.md-theme-default.md-rounded {
background-color: rgba(58, 59, 82, 0.08);
.desc {
opacity: 0.8;
font-weight: normal;
text-transform: none;
}
.md-empty-state:hover {
cursor: pointer;
transition: 0.3s;
box-shadow: 0 6px 6px -3px rgba(0, 0, 0, .2), 0 10px 14px 1px rgba(0, 0, 0, .14), 0 4px 18px 3px rgba(0, 0, 0, .12);
}
</style>
<style>
.md-empty-state:hover .md-empty-state-icon {
color: #FF5252 !important;
transition: 0.1s;
.md-button {
margin-left: 0;
}
</style>

View File

@ -0,0 +1,101 @@
<template>
<md-card>
<md-card-header>
<md-card-header-text>
<div class="md-title">
<md-icon v-if="this.fork" md-src="/static/fork.svg"></md-icon>
{{this.name}}
<TechChip :name="tech" :key="tech" v-for="tech in this.techs"/>
</div>
<div class="md-subhead">
<span class="muted">{{this.date}}</span>
{{this.description}}
</div>
</md-card-header-text>
<md-card-media md-big>
<img :src="this.media" alt="media">
</md-card-media>
</md-card-header>
<md-card-expand>
<md-card-actions md-alignment="space-between">
<div>
<a v-for="link in this.links" :href="Object.values(link)[0]" target="_blank">
<md-button >{{Object.keys(link)[0]}}</md-button>
</a>
</div>
<md-card-expand-trigger>
<md-button class="md-icon-button">
<md-icon>keyboard_arrow_down</md-icon>
</md-button>
</md-card-expand-trigger>
</md-card-actions>
<md-card-expand-content>
<md-card-content>
Lorem ipsum dolor si2t amet, consectetur adipisicing elit. Optio itaque ea, nostrum odio. Dolores,
sed accusantium quasi non, voluptas eius illo quas, saepe voluptate pariatur in deleniti minus sint.
Excepturi.
</md-card-content>
</md-card-expand-content>
</md-card-expand>
</md-card>
</template>
<script>
import TechChip from "./TechChip";
import MdRouterLink from "vue-material/src/core/mixins/MdRouterLink/MdRouterLink";
export default {
name: "Project",
components: {MdRouterLink, TechChip},
props: {
name: String,
date: String,
description: String,
media: String,
techs: Array,
links: Array,
fork: {
default: false,
type: Boolean
}
}
}
</script>
<style scoped>
.md-card {
background-color: white;
margin: 2em;
}
.md-title .md-icon {
display: inline-block;
}
.muted {
color: #9e9e9e;
font-weight: bold;
}
.md-subhead {
margin-top: 0.4rem;
opacity: .8;
}
.md-card-header .md-card-media.md-big {
max-height: 160px;
height: 100%;
}
@media screen and (max-width: 600px) {
.md-card-media {
display: none;
}
}
</style>

View File

@ -0,0 +1,124 @@
<template>
<md-chip :class="this.name.toLowerCase().replace(/[. \-]/gi, '')">{{this.name}}</md-chip>
</template>
<script>
export default {
name: "TechChip",
props: ["name"],
}
</script>
<style scoped>
.python {
background: #3572A5;
color: white;
}
.go {
background: #00ADD8;
color: white;
}
.java {
background: #b07219;
color: white;
}
.typescript {
background: #2b7489;
color: white;
}
.mongodb {
background: #589636;
color: white;
}
.x86-16asm {
background: #6E4C13;
color: white;
}
.angular {
background: #b52e31;
color: white;
}
.postgresql {
background: #dad8d8;
}
.pixijs {
background: #E91E63;
color: white;
}
.vuejs {
background: #2c3e50;
color: white;
}
.c {
background: #555555;
color: white;
}
.d3js {
background: #F68945;
}
.javascript {
background: #f1e05a;
}
.bash {
background: #89e051;
}
.elasticsearch {
background: #0077CC;
color: white;
}
.flask {
background: black;
color: white;
}
.php {
background: #4F5D95;
color: white;
}
.rabbitmq {
background: #FF6600;
color: white;
}
.html {
background: #e34c26;
color: white;
}
.sqlite {
background: #5AB1E3;
color: white;
}
.testdriven {
background: #7BFF7B;
}
.hugo {
background: #FF4088;
color: white;
}
.graphdatabase {
background: #63B543;
color: white;
}
</style>

View File

@ -4,8 +4,6 @@ import router from './router'
//TODO: Import individual components
import VueMaterial from 'vue-material'
import 'vue-material/dist/vue-material.min.css'
import 'vue-material/dist/theme/default.css'
Vue.config.productionTip = false;
Vue.use(VueMaterial);

View File

@ -1,11 +1,12 @@
import Vue from 'vue'
import Router from 'vue-router'
import Grid from '../components/Grid'
import Jumbotron from "../components/Jumbotron";
import Code from "../components/Code";
Vue.use(Router);
export default new Router({
mode: 'history',
routes: [
{
path: '/',
@ -13,9 +14,9 @@ export default new Router({
component: Grid
},
{
path: '/j',
name: 'Jumbotron',
component: Jumbotron
path: '/code',
name: 'Code',
component: Code
}
]
})

BIN
simon987/static/archi.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

BIN
simon987/static/cubot.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

1
simon987/static/fork.svg Normal file
View File

@ -0,0 +1 @@
<svg viewBox="0 0 10 16" version="1.1" width="10" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M8 1a1.993 1.993 0 0 0-1 3.72V6L5 8 3 6V4.72A1.993 1.993 0 0 0 2 1a1.993 1.993 0 0 0-1 3.72V6.5l3 3v1.78A1.993 1.993 0 0 0 5 15a1.993 1.993 0 0 0 1-3.72V9.5l3-3V4.72A1.993 1.993 0 0 0 8 1zM2 4.2C1.34 4.2.8 3.65.8 3c0-.65.55-1.2 1.2-1.2.65 0 1.2.55 1.2 1.2 0 .65-.55 1.2-1.2 1.2zm3 10c-.66 0-1.2-.55-1.2-1.2 0-.65.55-1.2 1.2-1.2.65 0 1.2.55 1.2 1.2 0 .65-.55 1.2-1.2 1.2zm3-10c-.66 0-1.2-.55-1.2-1.2 0-.65.55-1.2 1.2-1.2.65 0 1.2.55 1.2 1.2 0 .65-.55 1.2-1.2 1.2z"></path></svg>

After

Width:  |  Height:  |  Size: 588 B

BIN
simon987/static/go.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

BIN
simon987/static/hamming.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

BIN
simon987/static/irar.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

View File

@ -0,0 +1,247 @@
/* fallback */
@font-face {
font-family: 'Material Icons';
font-style: normal;
font-weight: 400;
src: url(https://fonts.gstatic.com/s/materialicons/v48/flUhRq6tzZclQEJ-Vdg-IuiaDsNc.woff2) format('woff2');
}
/* cyrillic-ext */
@font-face {
font-family: 'Roboto';
font-style: italic;
font-weight: 400;
src: local('Roboto Italic'), local('Roboto-Italic'), url(https://fonts.gstatic.com/s/roboto/v20/KFOkCnqEu92Fr1Mu51xFIzIFKw.woff2) format('woff2');
unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
}
/* cyrillic */
@font-face {
font-family: 'Roboto';
font-style: italic;
font-weight: 400;
src: local('Roboto Italic'), local('Roboto-Italic'), url(https://fonts.gstatic.com/s/roboto/v20/KFOkCnqEu92Fr1Mu51xMIzIFKw.woff2) format('woff2');
unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
/* greek-ext */
@font-face {
font-family: 'Roboto';
font-style: italic;
font-weight: 400;
src: local('Roboto Italic'), local('Roboto-Italic'), url(https://fonts.gstatic.com/s/roboto/v20/KFOkCnqEu92Fr1Mu51xEIzIFKw.woff2) format('woff2');
unicode-range: U+1F00-1FFF;
}
/* greek */
@font-face {
font-family: 'Roboto';
font-style: italic;
font-weight: 400;
src: local('Roboto Italic'), local('Roboto-Italic'), url(https://fonts.gstatic.com/s/roboto/v20/KFOkCnqEu92Fr1Mu51xLIzIFKw.woff2) format('woff2');
unicode-range: U+0370-03FF;
}
/* vietnamese */
@font-face {
font-family: 'Roboto';
font-style: italic;
font-weight: 400;
src: local('Roboto Italic'), local('Roboto-Italic'), url(https://fonts.gstatic.com/s/roboto/v20/KFOkCnqEu92Fr1Mu51xHIzIFKw.woff2) format('woff2');
unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB;
}
/* latin-ext */
@font-face {
font-family: 'Roboto';
font-style: italic;
font-weight: 400;
src: local('Roboto Italic'), local('Roboto-Italic'), url(https://fonts.gstatic.com/s/roboto/v20/KFOkCnqEu92Fr1Mu51xGIzIFKw.woff2) format('woff2');
unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* latin */
@font-face {
font-family: 'Roboto';
font-style: italic;
font-weight: 400;
src: local('Roboto Italic'), local('Roboto-Italic'), url(https://fonts.gstatic.com/s/roboto/v20/KFOkCnqEu92Fr1Mu51xIIzI.woff2) format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* cyrillic-ext */
@font-face {
font-family: 'Roboto';
font-style: normal;
font-weight: 400;
src: local('Roboto'), local('Roboto-Regular'), url(https://fonts.gstatic.com/s/roboto/v20/KFOmCnqEu92Fr1Mu72xKOzY.woff2) format('woff2');
unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
}
/* cyrillic */
@font-face {
font-family: 'Roboto';
font-style: normal;
font-weight: 400;
src: local('Roboto'), local('Roboto-Regular'), url(https://fonts.gstatic.com/s/roboto/v20/KFOmCnqEu92Fr1Mu5mxKOzY.woff2) format('woff2');
unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
/* greek-ext */
@font-face {
font-family: 'Roboto';
font-style: normal;
font-weight: 400;
src: local('Roboto'), local('Roboto-Regular'), url(https://fonts.gstatic.com/s/roboto/v20/KFOmCnqEu92Fr1Mu7mxKOzY.woff2) format('woff2');
unicode-range: U+1F00-1FFF;
}
/* greek */
@font-face {
font-family: 'Roboto';
font-style: normal;
font-weight: 400;
src: local('Roboto'), local('Roboto-Regular'), url(https://fonts.gstatic.com/s/roboto/v20/KFOmCnqEu92Fr1Mu4WxKOzY.woff2) format('woff2');
unicode-range: U+0370-03FF;
}
/* vietnamese */
@font-face {
font-family: 'Roboto';
font-style: normal;
font-weight: 400;
src: local('Roboto'), local('Roboto-Regular'), url(https://fonts.gstatic.com/s/roboto/v20/KFOmCnqEu92Fr1Mu7WxKOzY.woff2) format('woff2');
unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB;
}
/* latin-ext */
@font-face {
font-family: 'Roboto';
font-style: normal;
font-weight: 400;
src: local('Roboto'), local('Roboto-Regular'), url(https://fonts.gstatic.com/s/roboto/v20/KFOmCnqEu92Fr1Mu7GxKOzY.woff2) format('woff2');
unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* latin */
@font-face {
font-family: 'Roboto';
font-style: normal;
font-weight: 400;
src: local('Roboto'), local('Roboto-Regular'), url(https://fonts.gstatic.com/s/roboto/v20/KFOmCnqEu92Fr1Mu4mxK.woff2) format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* cyrillic-ext */
@font-face {
font-family: 'Roboto';
font-style: normal;
font-weight: 500;
src: local('Roboto Medium'), local('Roboto-Medium'), url(https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmEU9fCRc4EsA.woff2) format('woff2');
unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
}
/* cyrillic */
@font-face {
font-family: 'Roboto';
font-style: normal;
font-weight: 500;
src: local('Roboto Medium'), local('Roboto-Medium'), url(https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmEU9fABc4EsA.woff2) format('woff2');
unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
/* greek-ext */
@font-face {
font-family: 'Roboto';
font-style: normal;
font-weight: 500;
src: local('Roboto Medium'), local('Roboto-Medium'), url(https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmEU9fCBc4EsA.woff2) format('woff2');
unicode-range: U+1F00-1FFF;
}
/* greek */
@font-face {
font-family: 'Roboto';
font-style: normal;
font-weight: 500;
src: local('Roboto Medium'), local('Roboto-Medium'), url(https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmEU9fBxc4EsA.woff2) format('woff2');
unicode-range: U+0370-03FF;
}
/* vietnamese */
@font-face {
font-family: 'Roboto';
font-style: normal;
font-weight: 500;
src: local('Roboto Medium'), local('Roboto-Medium'), url(https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmEU9fCxc4EsA.woff2) format('woff2');
unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB;
}
/* latin-ext */
@font-face {
font-family: 'Roboto';
font-style: normal;
font-weight: 500;
src: local('Roboto Medium'), local('Roboto-Medium'), url(https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmEU9fChc4EsA.woff2) format('woff2');
unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* latin */
@font-face {
font-family: 'Roboto';
font-style: normal;
font-weight: 500;
src: local('Roboto Medium'), local('Roboto-Medium'), url(https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmEU9fBBc4.woff2) format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* cyrillic-ext */
@font-face {
font-family: 'Roboto';
font-style: normal;
font-weight: 700;
src: local('Roboto Bold'), local('Roboto-Bold'), url(https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmWUlfCRc4EsA.woff2) format('woff2');
unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
}
/* cyrillic */
@font-face {
font-family: 'Roboto';
font-style: normal;
font-weight: 700;
src: local('Roboto Bold'), local('Roboto-Bold'), url(https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmWUlfABc4EsA.woff2) format('woff2');
unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
/* greek-ext */
@font-face {
font-family: 'Roboto';
font-style: normal;
font-weight: 700;
src: local('Roboto Bold'), local('Roboto-Bold'), url(https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmWUlfCBc4EsA.woff2) format('woff2');
unicode-range: U+1F00-1FFF;
}
/* greek */
@font-face {
font-family: 'Roboto';
font-style: normal;
font-weight: 700;
src: local('Roboto Bold'), local('Roboto-Bold'), url(https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmWUlfBxc4EsA.woff2) format('woff2');
unicode-range: U+0370-03FF;
}
/* vietnamese */
@font-face {
font-family: 'Roboto';
font-style: normal;
font-weight: 700;
src: local('Roboto Bold'), local('Roboto-Bold'), url(https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmWUlfCxc4EsA.woff2) format('woff2');
unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB;
}
/* latin-ext */
@font-face {
font-family: 'Roboto';
font-style: normal;
font-weight: 700;
src: local('Roboto Bold'), local('Roboto-Bold'), url(https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmWUlfChc4EsA.woff2) format('woff2');
unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* latin */
@font-face {
font-family: 'Roboto';
font-style: normal;
font-weight: 700;
src: local('Roboto Bold'), local('Roboto-Bold'), url(https://fonts.gstatic.com/s/roboto/v20/KFOlCnqEu92Fr1MmWUlfBBc4.woff2) format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
.material-icons {
font-family: 'Material Icons';
font-weight: normal;
font-style: normal;
font-size: 24px;
line-height: 1;
letter-spacing: normal;
text-transform: none;
display: inline-block;
white-space: nowrap;
word-wrap: normal;
direction: ltr;
-moz-font-feature-settings: 'liga';
-moz-osx-font-smoothing: grayscale;
}

BIN
simon987/static/mg.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

BIN
simon987/static/net.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

BIN
simon987/static/oddb.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

BIN
simon987/static/phpbb.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

BIN
simon987/static/python.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

BIN
simon987/static/rss.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

BIN
simon987/static/sist.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

BIN
simon987/static/tt.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

BIN
simon987/static/worker.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB