Compare commits

..

2 commits

Author SHA1 Message Date
redfast00 de81efe189
Remove year from planned events since it doesn't really make sense 2019-12-06 14:44:31 +01:00
redfast00 a570d649be
Add planned events category 2019-12-06 14:41:57 +01:00
360 changed files with 606 additions and 6897 deletions

View file

@ -1,3 +1,2 @@
---
BUNDLE_PATH: "vendor/bundle"
BUNDLE_WITH: "production"

View file

@ -12,7 +12,6 @@ engines:
enabled: true
rubocop:
enabled: true
channel: rubocop-0-79
markdownlint:
enabled: true

View file

@ -1,32 +0,0 @@
# This is a basic workflow to help you get started with Actions
name: CI
# Controls when the action will run.
on:
# Triggers the workflow on push or pull request events but only for the master branch
push:
branches: [ master ]
pull_request:
branches: [ master ]
schedule:
- cron: "00 06 * * *"
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
# This workflow contains a single job called "build"
build:
# The type of runner that the job will run on
runs-on: ubuntu-latest
# Steps represent a sequence of tasks that will be executed as part of the job
steps:
- uses: actions/checkout@v2
- uses: cachix/install-nix-action@v13
with:
nix_path: nixpkgs=channel:nixos-unstable
- run: "nix-shell --run 'nanoc --env=prod'"
- run: "nix-shell --run 'nanoc --env=prod check --deploy'"

2
.gitignore vendored
View file

@ -24,5 +24,3 @@ crash.log*
.author-information
.fb_token
/vendor/

View file

@ -1 +1 @@
3.0.0
2.6.5

View file

@ -1,2 +0,0 @@
nodejs 14.15.4
ruby 3.0.0

View file

@ -18,36 +18,34 @@ cache:
addons:
apt:
packages:
- texlive-generic-recommended
- texlive-latex-base
- texlive-math-extra
- texlive-xetex
- texlive-full
- lmodern
branches:
only:
- master
rvm:
- 2.6.5
notifications:
slack:
secure: tej68wbYns4DYg488iz+4ncU3/CHJvG/5c1qntGcEjti6vZp24atuH32BzNMY+gqa5ftZtcRfqIiJ0I0tkbiFWEDzjSk89bgjG4sgwXq1gMqi/Fj4bqEpjU5m7QLa786q4UfYyTF+srca1fHPLVS5REdGjRr2wxX+bcFnTRxreGCIrlNdWhoZPPJyS37R4RR9k+l5ZWZnqWgUN6bD448O8EzMRVRWoUSxQcJ6+u4QLpinEvem4iXe+WcHOyFfsNmavxGGMMpkOSed/tzA1l+gNpl224qOJl3yAk2qrGi4N6SOnSkeJFfUO5RzX56KDC/tcCL1oJpamhDmzDvRrbDNnCjSriv+g+PkXEjiwBF/tkZwIe7nMKyc9QF698Zvdgb6Ffbq21obsRnkkddkxijthdbUKMAIREPQuU7pXRL4ykPkBeB5GkNjPlErOooxvUHvQEVElJ8NMD4ychQqW6relaYJ0W0uy0QMvrtS+cHkpprZAOZzWLa3AdEOvD50kiS2hDhJway5JHJg/LMl3I6XVVMx6fNGdNWBcezeCqkDZM+nuMJqgAtQ+Tz8bwrHLCJgS5u0lQq/MbrDkYdpmmzvA5LXxn2SpjfOAlgiFKnSIwKSuuuwzW/zCEGdPo1pfBba2VfYAN4y1l863j5ph+eMtlHf7JG8mzIWTo3k+Jx8lQ=
before_install:
- wget https://github.com/jgm/pandoc/releases/download/2.10.1/pandoc-2.10.1-1-amd64.deb
- sudo dpkg -i pandoc-2.10.1-1-amd64.deb
- wget https://github.com/jgm/pandoc/releases/download/2.8/pandoc-2.8-1-amd64.deb
- sudo dpkg -i pandoc-2.8-1-amd64.deb
- openssl aes-256-cbc -K $encrypted_6059a4f451fd_key -iv $encrypted_6059a4f451fd_iv
-in id_rsa.enc -out deploy_key -d
- mv deploy_key ~/.ssh/id_rsa
- chmod 600 ~/.ssh/id_rsa
- echo -e "[zeus.ugent.be]:2222 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBC87/Q3H8f7ghmA+iCtKGaNyk0fx3Z36Xrn+eGv8a4pD7MXeu6Uwr0aN5HnkcbRWXFtMwnAU3ptoP90vH7qu99w=\n[herbert.ugent.be]:2222 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBGLnJMh2DgqpVnHxOmeV6KffvzZGEVfniq0NFHRGZoL4f7Uc8xeG9gn3cc7lCL02F9LwWZNwR4gSqhGt/RK2S54=\n[git.zeus.gent]:2222 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBGLnJMh2DgqpVnHxOmeV6KffvzZGEVfniq0NFHRGZoL4f7Uc8xeG9gn3cc7lCL02F9LwWZNwR4gSqhGt/RK2S54=\n" >> ~/.ssh/known_hosts
- git submodule update --init --recursive --remote
- git submodule update --init --recursive
# Repo for newer Node.js versions
- curl -sL https://deb.nodesource.com/setup_14.x | sudo -E bash -
# - curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash -
# Repo for Yarn
- sudo apt-key adv --keyserver keyserver.ubuntu.com --recv D101F7899D41F3C3
- echo "deb http://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
- sudo apt-get update -qq
- sudo apt-get install -y -qq yarn nodejs
- nodejs -v
# - sudo apt-key adv --keyserver pgp.mit.edu --recv D101F7899D41F3C3
# - echo "deb http://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
# - sudo apt-get update -qq
# - sudo apt-get install -y -qq yarn
- yarn
script:
- bundle exec nanoc --env=prod

11
Gemfile
View file

@ -5,10 +5,6 @@ gem 'nanoc'
gem 'icalendar' # ical files
gem 'kramdown'
# Kramdown math mode gems
gem 'kramdown-math-katex'
gem 'sassc'
gem 'typogruby'
@ -17,19 +13,18 @@ gem 'builder'
# Word counting gem (which takes special characters into account)
# for reading time
gem 'words_counted', git: 'https://github.com/werthen/words_counted'
gem 'words_counted'
group :development do
gem 'adsf'
# puma instead of thin, see https://github.com/nanoc/nanoc/issues/1499
gem 'puma'
gem 'highline'
gem 'terminal-notifier'
gem 'terminal-notifier-guard'
gem 'nanoc-live'
end
group :production do
# Faster css autoprefixing
gem 'mini_racer'
# Autoprefixing for class
gem 'autoprefixer-rails'
gem 'htmlcompressor'

View file

@ -1,43 +1,28 @@
GIT
remote: https://github.com/werthen/words_counted
revision: 735357e4d530c99d5c4c366d0c246ebffffd80de
specs:
words_counted (1.0.2)
GEM
remote: https://rubygems.org/
specs:
addressable (2.7.0)
public_suffix (>= 2.0.2, < 5.0)
adsf (1.4.5)
adsf (1.4.2)
rack (>= 1.0.0, < 3.0.0)
adsf-live (1.4.5)
adsf (~> 1.3)
em-websocket (~> 0.5)
eventmachine (~> 1.2)
listen (~> 3.0)
rack-livereload (~> 0.3)
autoprefixer-rails (10.2.4.0)
autoprefixer-rails (9.7.2)
execjs
builder (3.2.4)
coderay (1.1.3)
builder (3.2.3)
coderay (1.1.2)
colored (1.2)
concurrent-ruby (1.1.8)
cri (2.15.11)
concurrent-ruby (1.1.5)
cri (2.15.9)
ddmemoize (1.0.0)
ddmetrics (~> 1.0)
ref (~> 2.0)
ddmetrics (1.0.1)
ddplugin (1.0.3)
diff-lcs (1.4.4)
em-websocket (0.5.2)
eventmachine (>= 0.12.9)
http_parser.rb (~> 0.6.0)
eventmachine (1.2.7)
ddplugin (1.0.2)
diff-lcs (1.3)
equatable (0.6.1)
execjs (2.7.0)
ffi (1.15.0)
ffi (1.11.3)
formatador (0.2.5)
guard (2.16.2)
guard (2.16.1)
formatador (>= 0.2.4)
listen (>= 2.7, < 4.0)
lumberjack (>= 1.0.12, < 2.0)
@ -47,54 +32,43 @@ GEM
shellany (~> 0.0)
thor (>= 0.18.1)
guard-compat (1.2.1)
guard-nanoc (2.1.9)
guard-nanoc (2.1.7)
guard (~> 2.8)
guard-compat (~> 1.0)
nanoc-cli (~> 4.11, >= 4.11.14)
nanoc-core (~> 4.11, >= 4.11.14)
nanoc (>= 4.11.13, < 5.0)
hamster (3.0.0)
concurrent-ruby (~> 1.0)
highline (2.0.3)
htmlcompressor (0.4.0)
http_parser.rb (0.6.0)
icalendar (2.7.1)
icalendar (2.6.0)
ice_cube (~> 0.16)
ice_cube (0.16.3)
json (2.5.1)
json_schema (0.21.0)
katex (0.6.1)
execjs (~> 2.7)
kramdown (2.3.1)
rexml
kramdown-math-katex (1.0.1)
katex (~> 0.4)
kramdown (~> 2.0)
listen (3.5.1)
json (2.2.0)
json_schema (0.20.8)
kramdown (2.1.0)
libv8 (7.3.492.27.1)
listen (3.2.0)
rb-fsevent (~> 0.10, >= 0.10.3)
rb-inotify (~> 0.9, >= 0.9.10)
lumberjack (1.2.8)
method_source (1.0.0)
mini_portile2 (2.5.0)
nanoc (4.12.0)
lumberjack (1.0.13)
method_source (0.9.2)
mini_portile2 (2.4.0)
mini_racer (0.2.8)
libv8 (>= 6.9.411)
nanoc (4.11.14)
addressable (~> 2.5)
colored (~> 1.2)
nanoc-checking (~> 1.0)
nanoc-cli (= 4.12.0)
nanoc-core (= 4.12.0)
nanoc-deploying (~> 1.0)
nanoc-cli (= 4.11.14)
nanoc-core (= 4.11.14)
parallel (~> 1.12)
tty-command (~> 0.8)
tty-which (~> 0.4)
nanoc-checking (1.0.1)
nanoc-cli (~> 4.11, >= 4.11.15)
nanoc-core (~> 4.11, >= 4.11.15)
nanoc-cli (4.12.0)
nanoc-cli (4.11.14)
cri (~> 2.15)
diff-lcs (~> 1.3)
nanoc-core (= 4.12.0)
nanoc-core (= 4.11.14)
zeitwerk (~> 2.1)
nanoc-core (4.12.0)
concurrent-ruby (~> 1.1)
nanoc-core (4.11.14)
ddmemoize (~> 1.0)
ddmetrics (~> 1.0)
ddplugin (~> 1.0)
@ -104,67 +78,51 @@ GEM
tomlrb (~> 1.2)
tty-platform (~> 0.2)
zeitwerk (~> 2.1)
nanoc-deploying (1.0.1)
nanoc-checking (~> 1.0)
nanoc-cli (~> 4.11, >= 4.11.15)
nanoc-core (~> 4.11, >= 4.11.15)
nanoc-live (1.0.0)
adsf-live (~> 1.4)
listen (~> 3.0)
nanoc-cli (~> 4.11, >= 4.11.14)
nanoc-core (~> 4.11, >= 4.11.14)
nenv (0.3.0)
nio4r (2.5.7)
nokogiri (1.11.2)
mini_portile2 (~> 2.5.0)
racc (~> 1.4)
nokogiri (1.10.5)
mini_portile2 (~> 2.4.0)
notiffany (0.1.3)
nenv (~> 0.1)
shellany (~> 0.0)
pandoc-ruby (2.1.4)
parallel (1.20.1)
pastel (0.8.0)
pandoc-ruby (2.0.2)
parallel (1.19.1)
pastel (0.7.3)
equatable (~> 0.6)
tty-color (~> 0.5)
pry (0.14.0)
coderay (~> 1.1)
method_source (~> 1.0)
public_suffix (4.0.6)
puma (5.2.2)
nio4r (~> 2.0)
racc (1.5.2)
rack (2.2.3)
rack-livereload (0.3.17)
rack
pry (0.12.2)
coderay (~> 1.1.0)
method_source (~> 0.9.0)
public_suffix (4.0.1)
rack (2.0.7)
rainpress (1.0.1)
rb-fsevent (0.10.4)
rb-inotify (0.10.1)
rb-fsevent (0.10.3)
rb-inotify (0.10.0)
ffi (~> 1.0)
ref (2.0.0)
rexml (3.2.4)
rubypants (0.7.1)
sassc (2.4.0)
rubypants (0.7.0)
sassc (2.2.1)
ffi (~> 1.9)
shellany (0.0.1)
slow_enumerator_tools (1.1.0)
terminal-notifier (2.0.0)
terminal-notifier-guard (1.7.0)
thor (1.1.0)
tomlrb (1.3.0)
tty-color (0.6.0)
tty-command (0.10.1)
pastel (~> 0.8)
tty-platform (0.3.0)
tty-which (0.4.2)
thor (0.20.3)
tomlrb (1.2.9)
tty-color (0.5.0)
tty-command (0.9.0)
pastel (~> 0.7.0)
tty-platform (0.2.1)
tty-which (0.4.1)
typogruby (1.0.18)
rubypants
uglifier (4.2.0)
execjs (>= 0.3.0, < 3)
w3c_validators (1.3.6)
w3c_validators (1.3.4)
json (>= 1.8)
nokogiri (~> 1.6)
rexml (~> 3.2)
words_counted (1.0.2)
yui-compressor (0.12.0)
zeitwerk (2.4.2)
zeitwerk (2.2.1)
PLATFORMS
ruby
@ -178,11 +136,9 @@ DEPENDENCIES
htmlcompressor
icalendar
kramdown
kramdown-math-katex
mini_racer
nanoc
nanoc-live
pandoc-ruby
puma
rainpress
sassc
terminal-notifier
@ -190,8 +146,8 @@ DEPENDENCIES
typogruby
uglifier (>= 4.0.0)
w3c_validators
words_counted!
words_counted
yui-compressor
BUNDLED WITH
2.2.3
2.0.2

View file

@ -1,5 +1,5 @@
# zeus.ugent.be
[![Build Status](https://api.travis-ci.com/ZeusWPI/zeus.ugent.be.svg?branch=master)](https://travis-ci.com/github/ZeusWPI/zeus.ugent.be)
[![Build Status](https://travis-ci.org/ZeusWPI/zeus.ugent.be.svg?branch=master)](https://travis-ci.org/ZeusWPI/zeus.ugent.be)
[![Code Climate](https://codeclimate.com/github/ZeusWPI/zeus.ugent.be.png)](https://codeclimate.com/github/ZeusWPI/zeus.ugent.be)
[![PageSpeed](https://pagespeed-badges.herokuapp.com/?url=zeus.ugent.be&strat=desktop&showStratLabel=true)](https://developers.google.com/speed/pagespeed/insights/?url=https%3A%2F%2Fzeus.ugent.be&tab=desktop)
[![PageSpeed](https://pagespeed-badges.herokuapp.com/?url=zeus.ugent.be&strat=mobile&showStratLabel=true)](https://developers.google.com/speed/pagespeed/insights/?url=https%3A%2F%2Fzeus.ugent.be&tab=mobile)
@ -60,22 +60,11 @@ The latest and greatest builds on master get deployed automatically using [travi
For manual deployment, run
```bash
# Build the site for production
bundle exec nanoc --env=prod
# Run checks
bundle exec nanoc --env=prod check --deploy
# Deploy it to the server
bundle exec nanoc deploy --target public --env=prod
bundle exec nanoc deploy --target public
```
If you want to deploy this on your own system for whatever reason, just serve the files using a webserver like nginx or Apache.
## Uploading media files
Before using mediafiles on the site, upload them via https://zeus.ugent.be/zeuswpi/, our own custom [uploading service](https://github.com/ZeusWPI/ZeusWPI). You'll receive the server-filename which is available at the aforementioned url.
## Submitting a Pull Request
Once you've submitted a PR, it will automatically be deployed to (PR#).pr.zeus.gent, for easier reviewing.
@ -84,6 +73,17 @@ Once you've submitted a PR, it will automatically be deployed to (PR#).pr.zeus.g
Analytics are powered by [Fathom](https://usefathom.com) and are available on <https://stats.zeus.gent>. These are only available to administrators with proper rights. These analytics are self hosted and provide only simple statistics for our information, without breaching your privacy.
## Import event from Facebook
You can import events from Facebook with `bundle exec nanoc fetch #{event_id}`.
You will need to create a `.fb_token` file and request an API token to put in there, see [FB graph API](https://developers.facebook.com/tools/explorer/).
You will probably need to make a new app (see navbar, it's quite trivial), unless you already have a Zeus site app.
You need to create a User Token with `user_events` permission.
We currently request from v2.10, details about the code can be found in [./commands/fetch].
## Built With
* [nanoc](https://github.com/nanoc/nanoc), static site generator

43
Rules
View file

@ -3,9 +3,6 @@
require 'json'
require 'icalendar'
require 'kramdown'
require 'kramdown-math-katex'
# Important!!!
# First ignore the node_modules, we do not need any of it on the site directly.
@ -25,25 +22,15 @@ preprocess do
ignore_old_content('blog', 'events', 'about/verslagen') if development?
update_blog_attributes
convert_tags('Blog')
convert_tags('Events')
create_yearly_items('Blog')
create_yearly_items('Events')
create_tagly_items('Blog')
create_tagly_items('Events')
convert_event_time_to_timestamps
all_events.each do |event|
check_schema(:event, event)
end
all_privacy_items.each do |project|
check_schema(:privacy, project)
end
add_report_metadata
add_project_metadata
convert_locations
end
#
@ -83,7 +70,7 @@ end
compile '/events/*/*' do
filter :erb
filter :kramdown, {math_engine: :katex}
filter :kramdown
layout '/eventpost.*'
layout '/default.*'
@ -108,8 +95,8 @@ end
compile '/blog/*/*.md' do
filter :erb
layout '/blogpost.md'
filter :kramdown, {math_engine: :katex}
filter :typogruby_custom
filter :kramdown
filter :typogruby
layout '/blogpost.erb'
layout '/generic.*'
@ -148,24 +135,13 @@ compile '/**/*.ics' do
filter :erb
end
#
# PRIVACY
#
compile '/about/privacy/*' do
filter :kramdown
# Don't write out the privacy items themselves for now
nil
end
#
# REPORTS
#
# Note drive/verslagen is 'linked' as a data source to /about/verslagen/
compile '/about/verslagen/*/*.md', rep: :pdf do
filter :pandoc_pdf, args: { f: :markdown, 'pdf-engine': 'xelatex', template: 'templates/report.tex' } if production?
filter :pandoc_pdf, args: { f: :markdown, :'pdf-engine' => 'xelatex' } if production?
write ext: (production? ? 'pdf' : 'md')
end
@ -178,7 +154,7 @@ compile '/**/*.erb' do
# Apply typographic improvements if required by the page. Use this on text-heavy pages,
# such as the history page.
if @item[:typography]
filter :typogruby_custom
filter :typogruby
end
layout '/generic.*'
@ -202,13 +178,10 @@ compile '/assets/scripts/**/*.js' do
filter :uglify_js, harmony: true if production?
end
ignore '/assets/stylesheets/includes/**/*'
ignore '/data/**/*'
ignore '/assets/stylesheets/includes/**/*'
compile '/assets/stylesheets/**/*.scss' do
# This filter is necessary for the workaround present in main.scss and deals with out of date dependencies
filter :erb
sass_opts = {
syntax: :scss,
load_paths: ['content/assets/stylesheets']
@ -245,10 +218,6 @@ route '/**/*.{erb,html,md}' do
"#{item.identifier.without_ext}/index.html"
end
route %r[/well-known/(.+)] do |rest|
"/.well-known/" + rest[0]
end
# Let anything else simply pass through
passthrough '/**/*'

View file

@ -1,54 +0,0 @@
require 'highline/import'
require 'yaml'
usage 'event [options]'
aliases :e
summary 'Add a new event'
description 'Adds a new event, filling in and validating metadata.'
def bold_say(str)
say "<%= color %(#{str}), :bold %>"
end
def bold_ask(str, *args)
res = ask "<%= color %(#{str}), :bold %>", *args
puts
res
end
run do |_opts, _args, _cmd|
result_hash = {}
post_directory = 'content/events'
author_file = '.author-information'
bold_say "Let's make a new event, shall we?"
bold_say('-' * 20)
last_entry = "#{post_directory}/#{Dir.entries('content/events').last}"
result_hash['title'] = bold_ask 'What will the title be?'
result_hash['description'] = bold_ask 'Give a description of the event'
result_hash['author'] = if File.exist? author_file
File.read(author_file).chomp
else
bold_ask 'What is your name?'
end
result_hash['created_at'] = Date.today
result_hash['time'] = DateTime.parse(bold_ask('When will the event start? (Use a format Ruby understands)')).to_s
result_hash['end'] = DateTime.parse(bold_ask('When will the event end? (Use a format Ruby understands)')).to_s
result_hash['location'] = bold_ask 'Where will the event take place? (Textual description)'
result_hash['locationlink'] = bold_ask 'Where will the event take place? (Something OSM can find or $kelder, $s9 or $therminal)'
filename = result_hash['title'].downcase.tr(' ', '-').gsub(/[^0-9A-Za-z-]/, '')
File.open("#{last_entry}/#{filename}.md", 'w') do |file|
file.write(result_hash.to_yaml + '---')
end
end

30
commands/fetch.rb Normal file
View file

@ -0,0 +1,30 @@
# frozen_string_literal: true
require 'net/http'
require 'json'
usage 'fetch [facebook event id]'
aliases :f
summary 'Fetch an event from facebook'
description 'Fetch an event from facebook'
run do |_opts, args, _cmd|
fb_token = File.read('.fb_token')
event_id = args[0]
uri = URI("https://graph.facebook.com/v2.10/#{event_id}?fields=cover,name,description,start_time,place,end_time&access_token=#{fb_token}")
o = JSON.parse(Net::HTTP.get(uri))
puts <<~EOS
---
title: "#{o['name']}"
description: #Fill in
time: #{o['start_time']}
end: #{o['end_time']}
location: #{o['place']['name']}
banner: #{o['cover']['source']}
created_at: #Fill in
facebook: 'https://www.facebook.com/events/#{event_id}/'
---
#{o['description']}
EOS
end

View file

@ -1,12 +1,8 @@
---
narrow_page: true
subnavigation:
bar: about
identifier: about
name: Zeus WPI
order: 100
---
<%= render '/partials/_about_sub_navbar.*', selected: 'about' %>
<h1 class="title is-1 has-text-centered">About Zeus WPI</h1>
<div class="content">

View file

@ -1,13 +1,8 @@
---
narrow_page: true
typography: true
subnavigation:
bar: about
identifier: historiek
name: Historiek
order: 400
---
<%= render '/partials/_about_sub_navbar.*', selected: 'historiek' %>
<h1 class="title is-1 has-text-centered">Historiek</h1>
<div class="timeline">
@ -212,45 +207,4 @@ subnavigation:
Verder organiseren we ook voor het eerst HTTPizza in samenwerking met Ruben Verborgh en IDLab, en, omdat bij 25 jaar Zeus nog wel wat vernieuwing mag, schrijven we onszelf een nieuwe site.</p>
</div>
</div>
<header class="timeline-header">
<span class="tag is-primary is-medium">2017</span>
</header>
<div class="timeline-item">
<div class="timeline-marker"></div>
<div class="timeline-content content">
<h2>Het jaar 2017 2018</h2>
<p>Dit jaar slagen we er wél in om <abbr title="Directie Gebouwen en Facilitair Beheer">DGFB</abbr> te overtuigen dat de geleidelijke erosie van de keldervloer in de vorm van rood stof onze neus-, oor-, keel- én spuigaten uitkomt. In de lente van 2018 ruilt de kelder haar stoffig rood in voor blinkend grijs. Wie de volledige saga van de <em>vleor</em> wil kennen dat dat lezen in de <a href="/blog/17-18/vleor/">betreffende blogpost</a>.
<figure>
<img src="https://zeus.ugent.be/zeuswpi/trZFwU90.jpg" alt="Lege kelder met een grijze vloer">
<figcaption>
De nieuwe, grijze, blinkende vloer van de Zeuskelder.
</figcaption>
</figure>
<p>Dit jaar werd er opnieuw vleitig aan projecten gewerkt en werden de grondslagen gelegd voor een nieuw toekomstig legacy-project: <b>G2</b>. Ook aan events was er geen tekort. Zo organiseerden we in samenwerking met <a href="https://ceneka.be/">CenEka</a>, onze zuster-werkgroep uit de ingenieursfaculteit, een reeks <b>TECH Talkz</b>.
<p>Tot slot breidt Zeus haar digitaal vastgoed uit en leggen we onze territoriale claim op de domeinnaam <a href="https://zeus.gent">zeus.gent</a>.
</div>
</div>
<header class="timeline-header">
<span class="tag is-primary is-medium">2018</span>
</header>
<div class="timeline-item">
<div class="timeline-marker"></div>
<div class="timeline-content content">
<h2>Het jaar 2018 2019</h2>
<p>De tijd is gekomen om van chatplatform te wisselen. Vanaf nu is Zeus WPI te vinden op <a href="https://mattermost.zeus.gent/">https://mattermost.zeus.gent</a>. Voor de eerste keer organiseren we ook een esoterische codenight om zo veel mogelijk eerstejaars kennis te laten maken met de wondere wereld van het programmeren. In het tweede semester is er ook de eerste IHNGTWHSIPB (Ik Heb Nog Genoeg Tijd Want Het Semester Is Pas Begonnen) codenight. Een maand later organiseren we ook onze eigen CTF (Capture The Friday), gericht op beginnende l33t h4x0rs.</p>
<p>Qua projecten wordt het idee van vorig jaar genaamd G2 eindelijk een ding, er is meer animo voor en er begint dit keer ook effectief code uit voort te komen. Daarnaast wordt ook Cat (Cuddles And Bad Abbreviations) geschreven, onze kaart van wie knuffels gegeven heeft aan wie. Omdat we vinden dat de messages van de Cammie-site naar de kelder niet archaisch genoeg getoond worden besluiten we om een systeem te schrijven dat de berichten via een Raspberry Pi naar Hoek (de computer in de hoek van de kelder) stuurt, die deze toont met behulp van een puur x86-assembly programma dat van een floppy draait. Waarom? Waarom niet?!</p>
</div>
</div>
<header class="timeline-header">
<span class="tag is-primary is-medium">2019</span>
</header>
<div class="timeline-item">
<div class="timeline-marker"></div>
<div class="timeline-content content">
<h2>Het jaar 2019 2020</h2>
<p>Het jaar begon ook dit jaar met een esoterisch-getinte codenight. Dit jaar was onze spelletjesavond net iets anders, we werkten namelijk samen met <a href="https://nemesisgent.be/">de studentenvereniging Nemesis</a> die ons uitnodigden in hun clublokaal om samen gezellig spellejes te spelen. We doen ook dit jaar opnieuw een CTF gericht om al intro te dienen. In het tweede semester beginnen we aan het Durf Doen-project van de GSR (Gentse Studentenraad) te revampen dat dient om studenten te helpen om studentenverenigingen te vinden die bij hen passen. We bezoeken ook de jobavond van onze Leuvense vrienden ULYSSIS en organiseren samen met VVN, Prime en WiNA een paar dagen later (toevallig) onze eigen jobbeurs.</p>
<p>Wat er daarna gebeurde had niemand kunnen voorspellen, de COVID-19 infecties lopen op en ons land gaat in een nationale lockdown. Natuurlijk betekent dit ook dat wij met Zeus onze kelder moeten sluiten voor onbepaalde duur. Hoe spijtig dit ook moge zijn, Zeus laat zich niet doen en we organiseren een online LAN-party (een WAN-party eigenlijk) en een online-CTF. Ook onze verkiezingen moeten digitaal doorgaan en in de zomer hebben we een van de meest rare bestuursovergangen in de geschiedenis van onze vereniging. Niemand weet wat het volgend jaar gaat brengen, maar Zeus blijft doet er alles aan om er het beste van te maken.</p>
</div>
</div>
</div>

View file

@ -1,12 +1,9 @@
---
narrow_page: true
subnavigation:
bar: about
identifier: oud-bestuur
name: Oud-bestuur
order: 500
---
<%= render '/partials/_about_sub_navbar.*', selected: 'oud-bestuur' %>
<h1 class="title is-1 has-text-centered">Oud-bestuur</h1>
<div class="content">

View file

@ -1,268 +0,0 @@
---
title: Privacybeleid
narrow_page: true
typography: true
toc: true
subnavigation:
bar: about
identifier: privacy
name: Privacybeleid
order: 300
---
<h1 class="title is-1 has-text-centered" id="top">Privacybeleid</h1>
<div id="table-of-contents" class="menu column is-4">
<p class="menu-label">
Inhoudstabel
</p>
<ul class="toc-depth-1" id="markdown-toc">
<li><a href="#samenvatting" id="markdown-toc-samenvatting">Samenvatting</a></li>
<li><a href="#opbouw" id="markdown-toc-opbouw">Opbouw</a></li>
<li><a href="#wanneer" id="markdown-toc-wanneer">Wanneer en waar is dit privacybeleid van toepassing?</a></li>
<li><a href="#wie" id="markdown-toc-wie">Wie heeft toegang tot de verzamelde data?</a></li>
<li><a href="#welke" id="markdown-toc-welke">Welke data worden verzameld en waarvoor worden ze gebruikt?</a></li>
<li><a href="#contact" id="markdown-toc-contact">Hoe contacteert u ons en laat u uw rechten gelden?</a></li>
<li><a href="#projecten" id="markdown-toc-projecten">Overzicht der projecten</a></li>
<li><a href="#diensten" id="markdown-toc-diensten">Overzicht der diensten</a></li>
</ul>
</div>
<div class="content">
<p>Laatst bijgewerkt op <strong><time datetime="2021-01-07">7 januari 2021</time></strong>.
</p>
<p>Zeus WPI biedt een waaier aan diensten en projecten aan aan haar leden en het algemene publiek. Met dit privacybeleid wil ze aangeven hoe en waarvoor ze data verzamelt.</p>
<h2 class="title is-2" id="samenvatting">Samenvatting</h2>
<p>Zeus verzamelt vier grote categorieën van data:</p>
<ol>
<li>Administratieve informatie, zoals e-mailadressen en UGent-gebruikersnamen. Deze informatie heeft Zeus nodig om haar verplichtingen na te komen opgelegd door de statuten en om haar goede werking te verzekeren.</li>
<li>Technische informatie, zoals serverlogs. Deze data zijn noodzakelijk om de systemen van Zeus draaiende te houden. Buiten het opsporen en oplossen van problemen doet Zeus hier niets mee.</li>
<li>Projectdata. Hiermee worden alle gegevens bedoeld die gebruikt worden in projecten, zoals bestellingen in Haldis of transacties in Tab. Deze gegevens worden uiteraard gebruikt voor het doel van het project (bv. bestellingen opnemen bij Haldis). Uitzonderlijk kunnen ze ook gebruikt worden voor statistische of onderzoeksdoeleinden. In dat geval worden de data altijd geanonimiseerd.</li>
<li>Sommige projecten verzamelen ook gebruikersstatistieken (<em lang="en">analytics</em>) en/of foutrapporten. De <span lang="en">analytics</span> om een beter inzicht te krijgen in het gebruik van projecten en de foutrapporten om de fouten en bugs snel te kunnen oplossen.</li>
</ol>
<p>In de regel heeft enkel het bestuur toegang tot de data. Op individuele basis kunnen projectontwikkelaars ook toegang krijgen tot de data van een specifiek project, indien dit nodig zou blijken voor de verdere ontwikkeling en ontplooiing van het desbetreffende project.</p>
<h2 class="title is-2" id="opbouw">Opbouw</h2>
<p>Het privacybeleid begint met een uiteenzetting van het beleid dat van toepassing is op alle gegevensverzameling of -verwerking die Zeus doet. Dit eerste deel wordt het algemene deel genoemd. Vervolgens worden alle projecten opgesomd die bijkomende gegevens verzamelen, of waarbij bijkomende uitleg nuttig is. Sommige projecten hebben ook uitzonderingen op het algemene deel. Dit deel wordt aangeduid als het project-specifieke deel. Tot slot volgt een lijst van diensten die door meerdere projecten gebruikt worden, en waarnaar verwezen wordt in het project-specifieke deel.</p>
<h2 class="title is-2" id="wanneer">Wanneer en waar is dit privacybeleid van toepassing?</h2>
<p>Zeus stelt projecten beschikbaar aan haar leden en het publiek in het algemeen. Daarbovenop worden de diensten en projecten van Zeus ook door derden gebruikt. Onder de Algemene Verordening Gegevensbescherming (AVG / <em lang="en"><abbr title="General Data Protection Regulation">GDPR</abbr></em>) kan Zeus verschillende rollen vervullen. Meer informatie over deze termen vindt u o.a. <a href="https://ec.europa.eu/info/law/law-topic/data-protection/reform/rules-business-and-organisations/obligations/controller-processor/what-data-controller-or-data-processor_nl">hier</a>.</p>
<h3 class="title is-3" id="verantwoordelijke">Zeus als dataverantwoordelijke</h3>
<p>Voor het aanbieden van haar projecten verzamelt Zeus data. In dat geval is Zeus zelf de dataverantwoordelijke. Bij sommige projecten doet Zeus echter een beroep op derden, die namens Zeus gegevens verzamelen. Hierbij treedt Zeus op als "Verwerkingsverantwoordelijke".</p>
<div class="example">
Voorbeelden van projecten waarbij Zeus de dataverantwoordelijke is, zijn Haldis, Tab en Hydra.
</div>
<h3 class="title is-3" id="verwerker">Zeus als verwerker</h3>
<p>Zeus biedt ook diensten aan aan derden. In dat geval dient u zich te wenden tot het privacybeleid van de derde in wiens naam Zeus de data verwerkt. Zeus treedt dan op als "Verwerker".</p>
<div class="example">
Zeus kan de websites van andere verenigingen hosten op haar servers. Dan is niet het privacybeleid van Zeus van toepassing, maar dat van de vereniging wier website bij Zeus gehost wordt.
</div>
<p>Als Zeus optreedt als verwerker, zal Zeus in het algemeen slechts de absoluut noodzakelijke data verzamelen om de integriteit en goede werking van haar systemen in stand te houden: enkel technische informatie, zoals beschreven in paragraaf <em><a href="#technisch">Technische gegevens</a></em>.</p>
<h2 class="title is-2" id="wie">Wie heeft toegang tot de verzamelde data?</h2>
<p>In de eerste plaats heeft het bestuur van Zeus toegang tot de gegevens, en in het bijzonder hebben de systeemadministrators toegang tot de data. Het bestuur beperkt zijn inzage in de gegevens tot het strikt noodzakelijke om zijn mandaat te vervullen.</p>
<div class="example">
De systeemadministrators hebben toegang tot alle gegevens, daar zij toegang hebben tot alle infrastructuur van Zeus. Uiteraard houden zij zich niet bezig met het bekijken van de verzamelde data; dit gebeurt enkel indien nodig, zoals wanneer een server crasht.
</div>
<p>Ook kunnen ontwikkelaars van een bepaald project toegang krijgen tot de data van dat project, indien dit nodig zou blijken voor de ontwikkeling van het project. Het bestuur, en de systeemadministrators in het bijzonder, zien erop toe dat ontwikkelaars van projecten nooit méér toegang hebben dan nodig en dat de data niet misbruikt worden. </p>
<div class="example">
De ontwikkelaars van Hydra krijgen toegang de API-server en kunnen zo aan de serverlogs.
</div>
<h2 class="title is-2" id="welke">Welke data worden verzameld en waarvoor worden ze gebruikt?</h2>
Zeus verzamelt vier grote categorieën van data.
<h3 class="title is-3" id="administratie">Administratieve gegevens</h3>
<p>Zeus houdt een reeks administratieve gegevens bij over haar leden, zoals vereist door de statuten of om de goede werking van de vereniging te bewerkstelligen. Onder deze data valt onder meer:</p>
<ul>
<li>
<strong>Accountgegevens</strong>, zoals de gebruikersnaam, UGent-gebruikersnaam, enz. Dit is om de accountfunctionaliteit van de leden, zoals vereist in de statuten, mogelijk te maken.
</li>
<li>
<strong>E-mailadressen</strong>. Dit om de leden in te schrijven op de mailinglijsten, zoals vereist door de statuten.
</li>
</ul>
<p>Deze gegevens worden door u aan Zeus verstrekt op het moment dat u zich inschrijft.</p>
<p>Indien u gebruik maakt van het Google Formulier voor uw inschrijving, worden de gegevens die u daar invult, opgeslagen in <em lang="en">Google Drive</em>. Deze zijn onderhevig aan het privacybeleid van Google.</p>
<h3 class="title is-3" id="technisch">Technische gegevens</h3>
<p>Hieronder vallen de data die door de servers of projecten opgeslagen worden in logboeken, zoals <em lang="en">access logs</em>. Dit zijn logboeken van de verzoeken die gestuurd worden naar een van de servers of projecten van Zeus. In de logboeken zitten o.a. volgende data:</p>
<ul>
<li><strong>IP-adressen</strong>, van wie de verzoeken maakte</li>
<li><strong>Tijdstippen</strong>, wanneer de verzoeken gemaakt werden</li>
<li><strong>Doel</strong>, wat er precies opgevraagd werd</li>
<li>
<strong>Technische gegevens</strong>, zoals welk apparaat en software er gebruikt zijn voor het verzoek, welk protocol er gebruikt wordt en hoeveel bytes er verstuurd zijn.
</li>
</ul>
<p>Deze informatie wordt gebruikt om de toestand van de server in de gaten te houden, teneinde de dienstverlening van de server te garanderen. Zo kunnen we de belasting van de server in de gaten houden, misbruik detecteren en foute verzoeken (bv. ontbrekende webpagina's) verhelpen.</p>
<div class="example">Een typische gebeurtenis in het serverlogboek ziet er als volgt uit:<br>
<p>
<code>94.XXX.XXX.XXX - [11/Sep/2019:11:18:59 +0200] "GET /api/2.0/association/logo/js.png HTTP/1.1" 200 34464 "-" "okhttp/3.12.2"</code>
</p>
<p>Deze informatie zegt ons:</p>
<ul>
<li>Het IP-adres van de gebruiker (hier onherkenbaar gemaakt).</li>
<li>Het tijdstip waarop het verzoek naar de API gestuurd werd.</li>
<li>Technische informatie over het verzoek: wat is er opgevraagd, welk protocol is er gebruikt, hoeveel bytes zijn er verstuurd om aan het verzoek te voldoen.</li>
<li>De
<em lang="en"><a href="https://nl.wikipedia.org/wiki/Useragent">user agent</a></em> van het verzoek: welke webbrowser of softwarebibliotheek stuurde het verzoek. In dit voorbeeld gaat het bijvoorbeeld over de Android-app van Hydra.
</li>
</ul>
<p>Specifiek vraagt dit verzoek het logo van een studentenvereniging op, meer bepaald
<a href="https://hydra.ugent.be/api/2.0/association/logo/js.png">dit logo</a>.</p>
</div>
<p>Deze data worden niet automatisch verwerkt; ze dienen om manueel de oorzaken van problemen te vinden. Serverlogs worden onbeperkt bijgehouden.</p>
<h3 class="title is-3" id="project">Projectdata</h3>
<p>Veel projecten hebben data nodig om te kunnen functioneren, dus verzamelt Zeus die uiteraard ook. Vaak zijn dit gegevens die u zelf ingeeft of laat genereren door het project dat u gebruikt. Soms worden deze data ook benoemd als "door gebruikers gegenereerde gegevens".</p>
<div class="example">
Als u bijvoorbeeld gebruik maakt van Haldis, moet Zeus opslaan wat u besteld hebt, of Haldis zal niet werken. Bij Tab gaat het om de transacties.
</div>
<p>Afhankelijk van de applicatie is het niet altijd mogelijk om de gegevens te verwijderen of aan te passen zonder de integriteit of goede werking van het project op de helling te zetten. In dat geval probeert Zeus de data zoveel mogelijk te anonimiseren als u een verwijderverzoek stuurt of zoveel mogelijk data aan te passen als u een aanpassingsverzoek stuurt. Bij een verwijderingsverzoek probeert Zeus de relevante en verwijderbare data zo snel mogelijk te verwijderen. Het is mogelijk dat de data door back-upsystemen langer bewaard blijven.</p>
<div class="example">
Bij Tab kan u bijvoorbeeld geen transacties laten verwijderen, maar wel anonimiseren.
</div>
<p>Naast het gebruik van deze gegevens om het doel van het project te verwezenlijken, kunnen deze gegevens ook gebruikt worden voor statistisch of wetenschappelijk onderzoek, om zo inzicht te verwerven in het algemene doen en laten van de leden van de vereniging. Bij het gebruik hiervoor worden de data altijd geanonimiseerd. Kijk bijvoorbeeld bij de gedetailleerde uitleg over Haldis voor een voorbeeld.</p>
<h3 class="title is-3">Gebruiksstatistieken en foutrapporten</h3>
<p>Bij sommige projecten (vaak de projecten die aangeboden worden aan een breed publiek) worden ook statistieken over het gebruik van het project en eventuele foutrapporten verzameld. De gebruiksstatistieken (<em lang="en">analytics</em>) worden verzameld om inzicht te krijgen in het gebruik van een project, om zo de aandacht op de meest gebruikte onderdelen te kunnen vestigen. De foutrapporten zijn nuttig om bugs en andere fouten zo snel en goed mogelijk op te lossen.</p>
<p>Voor deze diensten doet Zeus vaak een beroep op diensten van derden. Zie het projectspecifieke deel voor meer informatie.</p>
<div class="example">
Als blijkt uit de <span lang="en">analytics</span> dat een bepaald deel van Hydra niet vaak gebruikt wordt, kan Zeus overwegen om dat onderdeel te schrappen, om zo meer aandacht te kunnen geven aan de delen die wel vaak gebruikt worden.
</div>
<h2 class="title is-2" id="contact">Hoe contacteert u ons en laat u uw rechten gelden?</h2>
<p>Om uw rechten te laten gelden of om vragen of opmerkingen over te maken, kan u Zeus contacteren via de <%= link_to "contactpagina", "/contact" %>.</p>
<p>Hieronder volgt een korte opsomming van uw rechten:</p>
<ul>
<li><strong>Recht op inzage.</strong> U mag weten of Zeus gegevens over u heeft, welke gegevens dat zijn en op welke manier en waarom Zeus ze gebruiken. Ook heeft u het recht een overzicht te krijgen wie uw gegevens verwerkt.</li>
<li><strong>Recht op rectificatie en aanvulling.</strong> U heeft het recht in voorkomend geval foute gegevens te laten corrigeren, bv. door een rechtzetting of aanvulling te vragen.</li>
<li><strong>Recht op vergetelheid.</strong> U kan verzoeken dat Zeus de gegevens die we over u hebben te wissen op grond van een aantal zaken.</li>
<li><strong>Recht op overdraagbaarheid.</strong> U hebt het recht om uw gegevens op te vragen en te ontvangen in een gestructureerd, door een machine leesbaar document.</li>
<li><strong>Recht op beperking van de verwerking.</strong> U heeft het recht om de verwerking van uw gegevens te beperken, bijvoorbeeld als er een juridische procedure loopt, een rechtzetting nog niet is doorgevoerd, of de gegevens onrechtmatig gebruikt worden.</li>
<li><strong>Recht op bezwaar.</strong> Indien u meent dat Zeus uw gegevens verwerken op onrechtmatige basis, kan u bezwaar aantekenen.</li>
</ul>
<h2 class="title is-2" id="projecten">Overzicht der projecten</h2>
<h3 class="title is-3" id="specifiek">Project-specifieke bepalingen</h3>
<p>Onder deze paragraaf volgt een lijst van alle projecten... </p>
<ol>
<li>... met uitzonderingen op het algemeen beleid, of</li>
<li>... waarvoor er bijkomende informatie is over het gebruik van data in het project.</li>
</ol>
<hr>
<% privacy_projects("additional").each do |project| %>
<%= render '/partials/_privacy.erb', project: project %>
<hr>
<% end %>
<h3 class="title is-3" id="specifiek">Projecten zonder specifieke bepalingen</h3>
<p>Deze projecten vallen integraal onder het algemene beleid.</p>
<ul>
<% privacy_projects("general").each do |project| %>
<%= render '/partials/_privacy_link.erb', project: project %>
<% end %>
</ul>
<h3 class="title is-3" id="in-ontwikkeling">Projecten in ontwikkeling</h3>
<p>Deze projecten zijn nog in ontwikkeling. U mag geen persoonlijke data aan deze projecten leveren. Doet u dit toch, dan is dit op eigen risico: noch de functionaliteit, noch de beveiliging van deze projecten staat op punt.</p>
<ul>
<% privacy_projects("development").each do |project| %>
<%= render '/partials/_privacy_link.erb', project: project %>
<% end %>
</ul>
<h3 class="title is-3" id="in-opdracht">Projecten in opdracht</h3>
<p>Deze projecten worden door Zeus in opdracht van derden aangeboden. Hierbij treedt Zeus op als verwerker, zoals uitgelegd in paragraaf <em><a href="#verwerker">Zeus als verwerker</a></em>. Dat komt er op neer dat Zeus enkel technische informatie verzamelt.</p>
<ul>
<% privacy_projects("processor").each do |project| %>
<%= render '/partials/_privacy_link.erb', project: project %>
<% end %>
</ul>
<h2 class="title is-2" id="diensten">Overzicht der diensten</h2>
<p>Verschillende projecten gebruiken dezelfde diensten van derden. In plaats van deze informatie meerdere keren in het beleid te plaatsen, wordt de informatie hier eenmaal vermeld. Vanuit de beschrijving van de projecten wordt er dan verwezen naar deze bijlagen.</p>
<h3 class="title is-3" id="google-analytics">Gebruik van <em lang="en">Google Analytics</em></h3>
<p>Uitgebreide informatie over hoe Google met uw gegevens omgaat, vindt u <a href="https://www.google.com/policies/privacy/partners/">hier</a>. Verdere details over het gebruik van <em lang="en">Google Analytics</em> door Zeus:</p>
<ul>
<li>Uw gegevens worden gedurende 14 maanden bewaard door <em lang="en">Google Analytics</em> na uw laatste bezoek.</li>
<li>Uw gegevens worden door Google niet gedeeld met derden.</li>
<li>Google verwerkt uw gegevens mogelijk buiten de <abbr title="Europese Economische Ruimte">EER</abbr>. Google is gecertificeerd in het kader van het <abbr title="Europese Unie">EU</abbr>-<abbr title="Verenigde Staten">VS</abbr>-privacyschild.</li>
<li>Er wordt geen informatie verzameld waarmee Zeus of Google u kunnen identificeren (zoals IP-adressen).</li>
<li>Indien u niet wenst dat Zeus uw gegevens verzamelen met Google Analytics, kan u o.a. deze <a href="https://tools.google.com/dlpage/gaoptout/?hl=nl">add-on</a> installeren.</li>
</ul>
<p>Enkele voorbeelden van de verzamelde gegevens:</p>
<ul>
<li><strong>Softwareversies.</strong> Welke browser u gebruikt en zijn versie, welk besturingssysteem, enz.</li>
<li><strong>Gebruiksdata.</strong> Hoe u de website gebruik, wat u bezoekt, hoe lang u die onderdelen bezoekt, enz.</li>
<li><strong>Hardware-informatie.</strong> De resolutie van uw scherm.</li>
</ul>
<p>Door deze informatie kan Zeus ervoor zorgen dat de website goed werkt in de browsers die de bezoekers gebruiken. Als het merendeel van de gebruikers bv. een mobiel toestel gebruikt, kan Zeus haar aandacht richten op het optimaliseren van de website voor mobiel gebruik.</p>
<h3 class="title is-3" id="cloudflare">Gebruik van <span lang="en">Cloudflare <abbr title="Content Delivery Network">CDN</abbr></span></h3>
<p>We gebruiken de <span lang="en">Cloudflare CDN</span> om softwarebibliotheken te laden. Zie <a href="https://www.cloudflare.com/privacypolicy/">hun privacybeleid</a> (Engels).</p>
<h3 class="title is-3" id="crashlytics">Foutrapporten met <span lang="en">Crashlytics</span> (Google)</h3>
<p>Voor het verzamelen van foutrapporten gebruiken sommige apps <span lang="en">Crashlytics</span> van <span lang="en">Firebase</span> (wat op zijn beurt van Google is). Uitgebreide informatie over hoe Google met uw gegevens omgaat, vindt u <a href="https://www.google.com/policies/privacy/partners/">hier</a>. Verdere details over het gebruik van <span lang="en">Crashlytics</span> door Zeus:</p>
<ul>
<li><span lang="en">Stacktraces</span> en bijhorende anonieme identificatienummers van crashes worden 90 dagen bewaard door Google.</li>
<li>Er wordt geen informatie verzameld waarmee we u kunnen identificeren (zoals IP-adressen).</li>
</ul>
</div>

View file

@ -1,4 +0,0 @@
---
status: processor
link: https://12urenloop.be/
---

View file

@ -1,8 +0,0 @@
---
status: additional
---
- <span lang="en">Google Analytics</span> wordt gebruikt, zie de paragraaf [*Gebruik van <span lang="en">Google Analytics</span>*](#google-analytics).
- De achtergrondkaart kan opgehaald worden van verschillende services:
- Mapbox, zie [hun privacybeleid](https://www.mapbox.com/legal/privacy/) (Engels).
- <abbr title="OpenStreetMap België">OSM-BE</abbr>-tegels, zie [hun website](https://tile.osm.be/)

View file

@ -1,3 +0,0 @@
---
status: general
---

View file

@ -1,3 +0,0 @@
---
status: development
---

View file

@ -1,3 +0,0 @@
---
status: general
---

View file

@ -1,3 +0,0 @@
---
status: general
---

View file

@ -1,8 +0,0 @@
---
status: additional
---
Het gebruik van <span lang="en">Fathom</span> moet in twee categorieën ingedeeld worden:
- Als gebruiker van een website met <span lang="en">Fathom</span> als <span lang="en">analytics</span>. In dit geval verzamelt <span lang="en">Fathom</span> geen persoonlijke data, zie het [databeleid](https://usefathom.com/data) (Engels).
- Als gebruiker van <span lang="en">Fathom</span> zelf. <span lang="en">Fathom</span> verzamelt geen bijkomende data in dat geval.

View file

@ -1,3 +0,0 @@
---
status: processor
---

View file

@ -1,3 +0,0 @@
---
status: development
---

View file

@ -1,7 +0,0 @@
---
status: additional
---
- De website gebruikt de <span lang="en">Google Charts</span>-API voor het tonen van grafieken. Hierop is het privacybeleid van <span lang="en">Google Charts</span> van toepassing, dat [hier](https://developers.google.com/chart/interactive/docs/security_privacy) beschikbaar is. Zoals ook vermeld op laatstgenoemde pagina, is het [algemene privacybeleid](https://policies.google.com/privacy) van Google van toepassing.
- De applicatie verzamelt automatisch data vanop GitHub, zoals <span lang="en">commits</span> en <span lang="en">issues</span>. Deze data worden verzameld van uit de <span lang="en">repositories</span> van Zeus WPI. Deze gegevens zijn uiteraard essentieel voor de werking van <span lang="en">Gamification</span>. Daar de gegevens op geautomatiseerde wijze van GitHub gehaald worden, zijn verwijder- of aanpasverzoeken niet mogelijk.
- Bij het bezoeken van Gamification worden avatars geladen van GitHub. Hierop is het [privacybeleid van GitHub](https://help.github.com/en/github/site-policy/github-privacy-statement) van toepassing.

View file

@ -1,3 +0,0 @@
---
status: processor
---

View file

@ -1,7 +0,0 @@
---
status: additional
---
Bij GitLab moet opgemerkt worden dat de code in de <span lang="en">repositories</span> niet onder persoonlijke gegevens valt zoals bedoeld in dit privacybeleid. Dit beleid is dan ook niet van toepassing op de inhoud van de <span lang="en">repositories</span>. Het is de verantwoordelijkheid van de gebruikers om geen persoonlijke informatie in de <span lang="en">repositories</span> te plaatsen.
Door technische beperkingen kunnen niet alle persoonlijke gegevens verwijderd of geanonimiseerd worden. Zo kunnen de commits bijvoorbeeld noch verwijderd, noch geanonimiseerd worden.

View file

@ -1,7 +0,0 @@
---
status: additional
---
De bestellingen op Haldis worden, naast het hoofddoel van u uw bestelling te laten ontvangen, ook gebruikt om statistieken op te stellen om inzichten te krijgen in de consumptiegewoonten van Zeus, zoals bijvoorbeeld [hier](https://zeus.ugent.be/blog/17-18/eet-en-drankgewoonten-in-zeus/). Bij het opstellen van de statistieken worden de data geanonimiseerd.
Door technische beperkingen is het niet mogelijk data van Haldis te verwijderen. Ze worden hoogstens geanonimiseerd.

View file

@ -1,3 +0,0 @@
---
status: processor
---

View file

@ -1,25 +0,0 @@
---
status: additional
---
##### Website
De [website van Hydra](https://hydra.ugent.be) maakt gebruik van <span lang="en">Google Analytics</span> (zie details in de paragraaf [_Gebruik van <span lang="en">Google Analytics</span>_](#google-analytics)) voor het verzamelen van bezoekersinformatie. Dit om te weten hoeveel gebruikers de website gebruiken, hoe deze gebruikers de website vinden en hoe lang ze er blijven.
##### Apps
Voor de apps wordt de verzamelde data opgedeeld in twee categorieën: analytics en foutrapportage:
- <span lang="en">**Analytics.**</span> Zeus wil graag weten hoe u de app gebruikt, welke onderdelen u het meest gebruikt, hoe lang u de app gebruikt, enzovoort. Dit om de apps optimaal te kunnen afstellen op de behoeften van de gebruikers. Zeus gebruikt deze data niet om gebruikers te identificeren. Voor <span lang="en">analytics</span> wordt <span lang="en">Google Analytics</span> (zie details in de paragraaf [_Gebruik van <span lang="en">Google Analytics</span>_](#google-analytics)) gebruikt.
- **Foutrapportage.** Zeus wil weten wat u deed toen de crash zich voordeed, alsook welk apparaat u gebruikt, welke software-versies u hebt, enz. Hiermee kan Zeus sneller de oorzaak van de fout opsporen en oplossen. Voor foutrapportage wordt <span lang="en">Crashlytics</span> gebruikt (zie paragraaf [_Foutrapporten met <span lang="en">Crashlytics</span>_](#crashlytics)).
Daarnaast gebruiken de apps andere diensten van derden. Indien u gebruik maakt van de betreffende functie in de app, kunnen bijkomende regelingen van toepassing zijn:
- **Urgent.fm.** Contacteer [Urgent.fm](http://urgent.fm/wie-zijn-wij) voor meer informatie.
- **Activiteiten van verenigingen.** Contacteer de [Dienst StudentenActiviteiten](https://dsa.ugent.be/contact/) voor meer informatie.
- **Kaart van de locaties van de resto's.** Hierbij wordt <span lang="en">Google Maps</span> gebruikt. Indien u toestemming geeft, zal uw locatie gebruikt worden om de kaart te centreren op uw locatie. <span lang="en">Google Maps</span> is onderhevig aan het [privacybeleid van Google](https://policies.google.com/privacy).
- **Informatie over bibliotheken.** Raadpleeg de [disclaimer](https://lib.ugent.be/nl/info/disclaimer).
##### API
Bij het gebruik van de API worden enkel technische data verzameld.

View file

@ -1,19 +0,0 @@
---
status: additional
---
KeRS is geschreven om Zeus bij te staan in het vervullen van haar verplichtingen omtrent het toelaten van studenten in de kelder, conform de coronamaatregelen.
Alle data die verzameld worden door deze applicatie zullen dan ook enkel voor dit doel gebruikt worden.
Concreet worden volgende gegevens verzameld:
- De applicatiegegevens zelf: voor welke evenementen een gebruiker zich heeft ingeschreven, voor welke evenementen een gebruiker aanwezig mag zijn, enzovoort.
- De UGent verplicht Zeus om een lijst door te geven van de studenten die aanwezig zullen zijn in de kelder.
Hiervoor moet Zeus de echte naam en het studentennummer van de gebruiker opslaan.
Deze gegevens worden enkel binnen KeRS opgeslagen en worden buiten het doorgeven aan de UGent niet gebruikt.
Tot slot wordt er in KeRS gebruik gemaakt van geautomatiseerde besluitvorming.
Indien er meer gebruikers ingeschreven zijn voor een evenement dan dat er aanwezigen kunnen zijn in de kelder, zal aan de hand van een metriek op geautomatiseerde wijze bepaald worden wie voorrang krijgen bij het inschrijven voor dat evenement.
Dit is noodzakelijk om elke gebruiker de kans te geven aanwezig te kunnen zijn in de kelder van Zeus.
De exacte metriek is te vinden in de broncode van de applicatie en ligt niet vast: deze kan gewijzigd worden om de eerlijkheid van de selectie te bevorderen.
Meer informatie en context vindt u in [deze blogpost](https://zeus.ugent.be/blog/20-21/wij-coden-voort/).

View file

@ -1,7 +0,0 @@
---
status: additional
---
De citaten verzameld in dit project worden voornamelijk gebruikt in de Mattermost-instantie van Zeus, al zijn de citaten publiekelijk zichtbaar.
Buiten de citaten worden geen gegevens verzameld.

View file

@ -1,11 +0,0 @@
---
status: additional
---
Bij Mattermost is het [standaardprivacybeleid](https://github.com/mattermost/mattermost-server/blob/master/build/PRIVACY_POLICY.md) van een zelf-gehoste Mattermost-applicatie van toepassing.
Op Mattermost kunnen berichten in twee categorieën ingedeeld worden: openbare berichten en private berichten. Onder private berichten worden alle berichten in private gesprekken of besloten kanalen verstaan. Berichten in openbare kanalen vallen onder openbare berichten.
Daar de private berichten mogelijk een gevoelig karakter hebben, worden deze berichten standaard na een termijn van 1 jaar gewist. U kunt een uitzondering verkrijgen op deze standaardtermijn door contact op te nemen met de systeemadministrators van Zeus.
Door het mogelijk gevoelige karakter van de berichten hebben projectontwikkelaars geen toegang tot deze data; enkel het bestuur heeft toegang.

View file

@ -1,9 +0,0 @@
---
status: additional
---
<span lang="en">MessageOS</span> bestaat uit meerdere subprojecten:
- [Cammiechat](https://git.zeus.gent/kelder/cammiechat/tree/master). Dit onderdeel valt integraal onder het algemene privacybeleid.
- [TAp](https://git.zeus.gent/ZeusWPI/TAp). Dit onderdeel valt integraal onder het algemene privacybeleid.
- <span lang="en">[MessageOS](https://git.zeus.gent/ZeusWPI/ass_messages)</span>. Dit onderdeel verzamelt geen data; berichten blijven getoond op het scherm in de kelder tot de server herstart wordt of de berichten door nieuwe berichten van het scherm gaan.

View file

@ -1,3 +0,0 @@
---
status: development
---

View file

@ -1,3 +0,0 @@
---
status: general
---

View file

@ -1,3 +0,0 @@
---
status: general
---

View file

@ -1,3 +0,0 @@
---
status: processor
---

View file

@ -1,19 +0,0 @@
---
status: additional
---
De website van Zeus verzamelt bijkomende data:
- De website laadt <span lang="en">Font Awesome</span> via een site van derden, <span lang="en">MaxCDN</span>. Zie [hun privacybeleid](https://www.bootstrapcdn.com/privacy-policy/) (Engels).
- Bezoekersstatistieken worden bijgehouden met <span lang="en">Fathom</span>, zie de paragraaf <span lang="en">[*Fathom*](#fathom)</span>.
- Sommige pagina's kunnen om bijkomende functionaliteit aan te bieden, aanvullende zaken laden via diensten van derden. Hieronder is een lijst te vinden van alle gebruikte diensten en wat ze laden:
- Gebruikersdata van <span lang="en">[*Gamification*](#gamification)</span>.
- Kaarten via OpenStreetMap. Zie [hun privacybeleid](https://wiki.osmfoundation.org/wiki/Privacy_Policy) (Engels).
- Softwarebibliotheken via <span lang="en">Stackpath</span>. Zie [hun privacybeleid](https://www.stackpath.com/legal/privacy-statement/) (Engels).
- Afbeeldingen via [jaspervdj.be](https://jaspervdj.be/images/) (Engels).
- Formulieren via <span lang="en">Google Forms</span> en <span lang="en">Google Spreadsheets</span>. Zie het [privacybeleid van Google](https://policies.google.com/privacy) (Engels).
- D3 via [d3js.org](https://d3js.org).
- Softwarebibliotheken via <span lang="en">Cloudflare</span>, zie de [gelijknamige paragraaf](#cloudflare).
- Video's via <span lang="en">Invidious</span>. Zie [hun privacybeleid](https://invidio.us/privacy) (Engels).
- Video's via Vimeo. Zie [hun privacybeleid](https://vimeo.com/privacy) (Engels).

View file

@ -1,10 +0,0 @@
---
status: additional
---
Merk op dat Zeus niet de bedoeling heeft haar leden financiële dienstverleningen aan te bieden via Tab. Het "geld" op Tab wordt best vergeleken met een systeem voor drankbonnetjes of virtueel geld in een computerspel. Meer technisch heeft Zeus de bedoeling om een wat de <abbr title="Europese Centrale Bank">ECB</abbr> <span lang="en">"virtual currency scheme with bidirectional flow"</span> (virtuele valuta met omzetting in twee richtingen) noemt aan te bieden. Aangezien het geld op Tab enkel gebruikt kan worden voor aankopen, is hier geen sprake van een financiële dienstverlening.
Niettemin kunnen de gegevens op Tab gevoelig zijn; derhalve heeft enkel het bestuur toegang tot deze gegevens. Projectontwikkelaars hebben geen toegang.
Door technische beperkingen is het niet mogelijk data van Tab te verwijderen. Ze worden hoogsten geanonimiseerd.

View file

@ -1,7 +0,0 @@
---
status: additional
---
De bestellingen op Tap worden, naast het laten werken van Tap en zo ervoor zorgen dat uw drank aangerekend wordt, ook gebruikt om statistieken op te stellen om inzichten te krijgen in de consumptiegewoonten van Zeus, zoals bijvoorbeeld [hier](https://zeus.ugent.be/blog/17-18/eet-en-drankgewoonten-in-zeus/). Bij het opstellen van de statistieken worden de data geanonimiseerd.
Door technische beperkingen is het niet mogelijk data van Tap te verwijderen. Ze worden hoogsten geanonimiseerd.

View file

@ -1,10 +0,0 @@
---
status: additional
---
Tappb verzamelt bijkomende data door het gebruik van <span lang="en">Firebase</span>. Het [het privacybeleid](https://firebase.google.com/support/privacy) (Engels) van <span lang="en">Firebase</span> verschaft uitgebreide informatie. Concreet gebruikt Tappb volgende diensten en gebruikt daarbij volgende data:
- **<span lang="en">Firebase Cloud Messaging</span>**. Dit wordt gebruikt om meldingen naar de applicatie te sturen. Hiervoor wordt het <span lang="en">"instance ID"</span> verzameld, om te identificeren naar welk toestel een melding gestuurd moet worden. Deze worden onbeperkt bijgehouden. Indien u dit ID wenst te verwijderen, zal <span lang="en">Firebase</span> het ID binnen de 180 dagen verwijderen.
- **<span lang="en">ML Kit for Firebase</span>**. Dit wordt gebruikt om de barcodes van producten te scannen. De afbeeldingen met barcodes worden tijdelijk bewaard op de servers van <span lang="en">Firebase</span> en worden gewoonlijk na enkele uren verwijderd. Meer informatie is tevens te vinden op [deze pagina](https://cloud.google.com/vision/docs/data-usage) (Engels). Ook hier worden <span lang="en">"instance ID"s</span> bijgehouden, volgens dezelfde voorwaarden als bij <span lang="en">Firebase Cloud Messaging</span>.
Ook gebruikt Tappb de diensten van [Tab](#tab) en [Tap](#tap).

View file

@ -1,3 +0,0 @@
---
status: development
---

View file

@ -1,5 +0,0 @@
---
status: additional
---
De wiki laadt bibliotheken via <span lang="en">Cloudflare</span> (zie de [gelijknamige paragraaf](#cloudflare)) en [mathjax.org](https://www.mathjax.org/).

View file

@ -1,3 +0,0 @@
---
status: development
---

View file

@ -1,3 +0,0 @@
---
status: development
---

View file

@ -1,3 +0,0 @@
---
status: general
---

View file

@ -1,61 +0,0 @@
---
narrow_page: true
subnavigation:
bar: about
identifier: sponsorende-leden
name: Sponsorende leden
order: 700
---
<h1 class='title is-1 has-text-centered'>Sponsorende leden</h1>
<div id='sponsoring-members' class="content">
<% if current_sponsoring_members.nil? %>
Nog geen sponsorende leden voor dit academiejaar. Interesse? Contacteer het bestuur.
<% else %>
<% current_sponsoring_members.shuffle.each do |member| %>
<div id="<%= member[:nickname] %>" class="box sponsoring-member">
<article class="columns is-mobile">
<div class="column is-gapless is-narrow logo-wrapper">
<% if member[:photo] %>
<img src="<%= member[:photo] %>" alt="<%= member[:name] %>">
<% else %>
<div class="logo-initial has-text-centered">
<%= member[:name].chars.first %>
</div>
<% end %>
<div class="name"><%= member[:name] %></div>
<div class="username">(<%= member[:nickname] %>)</div>
</div>
<div class="column">
<div>
<blockquote>
<%= to_HTML(member[:quote]) %>
</blockquote>
<p class="description">
<%= to_HTML(member[:description]) %>
</p>
</div>
<div class="links">
<% member[:links].each do |link| %>
<% if link[:icon] %>
<a class="social-icon" href="<%= link[:url] %>" target="_blank">
<span class="icon">
<%= fa link[:icon], {:size => "2x"} %>
</span>
</a>
<% else %>
<a class="social-icon" href="<%= link[:url] %>" target="_blank">
<span class="icon">
<%= fa :globe, {:size => "2x"} %>
</span>
</a>
<% end %>
<% end %>
</div>
</div>
</article>
</div>
<% end %>
<% end %>
</div>

View file

@ -1,12 +1,9 @@
---
narrow_page: true
subnavigation:
bar: about
identifier: statuten
name: Statuten
order: 200
---
<%= render '/partials/_about_sub_navbar.*', selected: 'statuten' %>
# Statuten
{:.title.is-1.has-text-centered}

View file

@ -1,12 +1,8 @@
---
narrow_page: true
subnavigation:
bar: about
identifier: verslagen
name: Verslagen
order: 600
---
<%= render '/partials/_about_sub_navbar.*', selected: 'verslagen' %>
<h1 class="title is-1 has-text-centered">Reports</h1>
<div class="content">

View file

@ -1,735 +0,0 @@
// Code below modified from https://github.com/arhs/iban.js
/*
The MIT License (MIT)
Copyright (c) 2013-2017 ARHS Developments SA
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
function electronicFormat(iban) {
return iban.replace(/[^a-zA-Z0-9]/g, '').toUpperCase();
}
// Code below modified from https://github.com/derhuerst/sepa-payment-qr-code
/*
Copyright (c) 2018, Jannis R
Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
const SERVICE_TAG = 'BCD'
const VERSION = '002'
const CHARACTER_SET = 1
const IDENTIFICATION_CODE = 'SCT'
const assertNonEmptyString = (val, name) => {
if ('string' !== typeof val || !val) {
throw new Error(name + ' must be a non-empty string.')
}
}
const defaults = {
currency: 'EUR'
}
var generateQrCode = data => {
if (!data) throw new Error('data must be an object.')
data = Object.assign(Object.create(null), defaults, data)
// disabled, we will check this ourselves
// if (isValidIBAN(data.payeeIBAN)) throw new Error('data.payeeIBAN must be a valid IBAN.')
assertNonEmptyString(data.name, 'data.name')
if ('bic' in data) assertNonEmptyString(data.bic, 'data.bic')
if ('number' !== typeof data.amount) throw new Error('data.amount must be a number.')
if (data.amount < 0.01 || data.amount > 999999999.99) {
throw new Error('data.amount must be >=0.01 and <=999999999.99.')
}
if ('purposeCode' in data) {
assertNonEmptyString(data.purposeCode, 'data.purposeCode')
}
if ('structuredReference' in data) {
assertNonEmptyString(data.structuredReference, 'data.structuredReference')
}
if ('unstructuredReference' in data) {
assertNonEmptyString(data.unstructuredReference, 'data.unstructuredReference')
// todo: validate <=140 chars
}
if (('structuredReference' in data) && ('unstructuredReference' in data)) {
throw new Error('Use either data.structuredReference or data.unstructuredReference.')
}
if ('information' in data) {
assertNonEmptyString(data.information, 'data.information')
}
return [
SERVICE_TAG,
VERSION,
CHARACTER_SET,
IDENTIFICATION_CODE,
data.bic, // todo: validate 8/11 chars
data.name, // todo: validate <=70 chars
electronicFormat(data.iban),
data.currency + data.amount.toFixed(2),
data.purposeCode || '',
data.structuredReference || '',
data.unstructuredReference || '',
data.information || ''
].join('\n')
}
// Code below copied from https://github.com/davidshimjs/qrcodejs
/*
The MIT License (MIT)
---------------------
Copyright (c) 2012 davidshimjs
Permission is hereby granted, free of charge,
to any person obtaining a copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction,
including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
/**
* @fileoverview
* - Using the 'QRCode for Javascript library'
* - Fixed dataset of 'QRCode for Javascript library' for support full-spec.
* - this library has no dependencies.
*
* @author davidshimjs
* @see <a href="http://www.d-project.com/" target="_blank">http://www.d-project.com/</a>
* @see <a href="http://jeromeetienne.github.com/jquery-qrcode/" target="_blank">http://jeromeetienne.github.com/jquery-qrcode/</a>
*/
var QRCode;
(function () {
//---------------------------------------------------------------------
// QRCode for JavaScript
//
// Copyright (c) 2009 Kazuhiko Arase
//
// URL: http://www.d-project.com/
//
// Licensed under the MIT license:
// http://www.opensource.org/licenses/mit-license.php
//
// The word "QR Code" is registered trademark of
// DENSO WAVE INCORPORATED
// http://www.denso-wave.com/qrcode/faqpatent-e.html
//
//---------------------------------------------------------------------
function QR8bitByte(data) {
this.mode = QRMode.MODE_8BIT_BYTE;
this.data = data;
this.parsedData = [];
// Added to support UTF-8 Characters
for (var i = 0, l = this.data.length; i < l; i++) {
var byteArray = [];
var code = this.data.charCodeAt(i);
if (code > 0x10000) {
byteArray[0] = 0xF0 | ((code & 0x1C0000) >>> 18);
byteArray[1] = 0x80 | ((code & 0x3F000) >>> 12);
byteArray[2] = 0x80 | ((code & 0xFC0) >>> 6);
byteArray[3] = 0x80 | (code & 0x3F);
} else if (code > 0x800) {
byteArray[0] = 0xE0 | ((code & 0xF000) >>> 12);
byteArray[1] = 0x80 | ((code & 0xFC0) >>> 6);
byteArray[2] = 0x80 | (code & 0x3F);
} else if (code > 0x80) {
byteArray[0] = 0xC0 | ((code & 0x7C0) >>> 6);
byteArray[1] = 0x80 | (code & 0x3F);
} else {
byteArray[0] = code;
}
this.parsedData.push(byteArray);
}
this.parsedData = Array.prototype.concat.apply([], this.parsedData);
if (this.parsedData.length != this.data.length) {
this.parsedData.unshift(191);
this.parsedData.unshift(187);
this.parsedData.unshift(239);
}
}
QR8bitByte.prototype = {
getLength: function (buffer) {
return this.parsedData.length;
},
write: function (buffer) {
for (var i = 0, l = this.parsedData.length; i < l; i++) {
buffer.put(this.parsedData[i], 8);
}
}
};
function QRCodeModel(typeNumber, errorCorrectLevel) {
this.typeNumber = typeNumber;
this.errorCorrectLevel = errorCorrectLevel;
this.modules = null;
this.moduleCount = 0;
this.dataCache = null;
this.dataList = [];
}
QRCodeModel.prototype={addData:function(data){var newData=new QR8bitByte(data);this.dataList.push(newData);this.dataCache=null;},isDark:function(row,col){if(row<0||this.moduleCount<=row||col<0||this.moduleCount<=col){throw new Error(row+","+col);}
return this.modules[row][col];},getModuleCount:function(){return this.moduleCount;},make:function(){this.makeImpl(false,this.getBestMaskPattern());},makeImpl:function(test,maskPattern){this.moduleCount=this.typeNumber*4+17;this.modules=new Array(this.moduleCount);for(var row=0;row<this.moduleCount;row++){this.modules[row]=new Array(this.moduleCount);for(var col=0;col<this.moduleCount;col++){this.modules[row][col]=null;}}
this.setupPositionProbePattern(0,0);this.setupPositionProbePattern(this.moduleCount-7,0);this.setupPositionProbePattern(0,this.moduleCount-7);this.setupPositionAdjustPattern();this.setupTimingPattern();this.setupTypeInfo(test,maskPattern);if(this.typeNumber>=7){this.setupTypeNumber(test);}
if(this.dataCache==null){this.dataCache=QRCodeModel.createData(this.typeNumber,this.errorCorrectLevel,this.dataList);}
this.mapData(this.dataCache,maskPattern);},setupPositionProbePattern:function(row,col){for(var r=-1;r<=7;r++){if(row+r<=-1||this.moduleCount<=row+r)continue;for(var c=-1;c<=7;c++){if(col+c<=-1||this.moduleCount<=col+c)continue;if((0<=r&&r<=6&&(c==0||c==6))||(0<=c&&c<=6&&(r==0||r==6))||(2<=r&&r<=4&&2<=c&&c<=4)){this.modules[row+r][col+c]=true;}else{this.modules[row+r][col+c]=false;}}}},getBestMaskPattern:function(){var minLostPoint=0;var pattern=0;for(var i=0;i<8;i++){this.makeImpl(true,i);var lostPoint=QRUtil.getLostPoint(this);if(i==0||minLostPoint>lostPoint){minLostPoint=lostPoint;pattern=i;}}
return pattern;},createMovieClip:function(target_mc,instance_name,depth){var qr_mc=target_mc.createEmptyMovieClip(instance_name,depth);var cs=1;this.make();for(var row=0;row<this.modules.length;row++){var y=row*cs;for(var col=0;col<this.modules[row].length;col++){var x=col*cs;var dark=this.modules[row][col];if(dark){qr_mc.beginFill(0,100);qr_mc.moveTo(x,y);qr_mc.lineTo(x+cs,y);qr_mc.lineTo(x+cs,y+cs);qr_mc.lineTo(x,y+cs);qr_mc.endFill();}}}
return qr_mc;},setupTimingPattern:function(){for(var r=8;r<this.moduleCount-8;r++){if(this.modules[r][6]!=null){continue;}
this.modules[r][6]=(r%2==0);}
for(var c=8;c<this.moduleCount-8;c++){if(this.modules[6][c]!=null){continue;}
this.modules[6][c]=(c%2==0);}},setupPositionAdjustPattern:function(){var pos=QRUtil.getPatternPosition(this.typeNumber);for(var i=0;i<pos.length;i++){for(var j=0;j<pos.length;j++){var row=pos[i];var col=pos[j];if(this.modules[row][col]!=null){continue;}
for(var r=-2;r<=2;r++){for(var c=-2;c<=2;c++){if(r==-2||r==2||c==-2||c==2||(r==0&&c==0)){this.modules[row+r][col+c]=true;}else{this.modules[row+r][col+c]=false;}}}}}},setupTypeNumber:function(test){var bits=QRUtil.getBCHTypeNumber(this.typeNumber);for(var i=0;i<18;i++){var mod=(!test&&((bits>>i)&1)==1);this.modules[Math.floor(i/3)][i%3+this.moduleCount-8-3]=mod;}
for(var i=0;i<18;i++){var mod=(!test&&((bits>>i)&1)==1);this.modules[i%3+this.moduleCount-8-3][Math.floor(i/3)]=mod;}},setupTypeInfo:function(test,maskPattern){var data=(this.errorCorrectLevel<<3)|maskPattern;var bits=QRUtil.getBCHTypeInfo(data);for(var i=0;i<15;i++){var mod=(!test&&((bits>>i)&1)==1);if(i<6){this.modules[i][8]=mod;}else if(i<8){this.modules[i+1][8]=mod;}else{this.modules[this.moduleCount-15+i][8]=mod;}}
for(var i=0;i<15;i++){var mod=(!test&&((bits>>i)&1)==1);if(i<8){this.modules[8][this.moduleCount-i-1]=mod;}else if(i<9){this.modules[8][15-i-1+1]=mod;}else{this.modules[8][15-i-1]=mod;}}
this.modules[this.moduleCount-8][8]=(!test);},mapData:function(data,maskPattern){var inc=-1;var row=this.moduleCount-1;var bitIndex=7;var byteIndex=0;for(var col=this.moduleCount-1;col>0;col-=2){if(col==6)col--;while(true){for(var c=0;c<2;c++){if(this.modules[row][col-c]==null){var dark=false;if(byteIndex<data.length){dark=(((data[byteIndex]>>>bitIndex)&1)==1);}
var mask=QRUtil.getMask(maskPattern,row,col-c);if(mask){dark=!dark;}
this.modules[row][col-c]=dark;bitIndex--;if(bitIndex==-1){byteIndex++;bitIndex=7;}}}
row+=inc;if(row<0||this.moduleCount<=row){row-=inc;inc=-inc;break;}}}}};QRCodeModel.PAD0=0xEC;QRCodeModel.PAD1=0x11;QRCodeModel.createData=function(typeNumber,errorCorrectLevel,dataList){var rsBlocks=QRRSBlock.getRSBlocks(typeNumber,errorCorrectLevel);var buffer=new QRBitBuffer();for(var i=0;i<dataList.length;i++){var data=dataList[i];buffer.put(data.mode,4);buffer.put(data.getLength(),QRUtil.getLengthInBits(data.mode,typeNumber));data.write(buffer);}
var totalDataCount=0;for(var i=0;i<rsBlocks.length;i++){totalDataCount+=rsBlocks[i].dataCount;}
if(buffer.getLengthInBits()>totalDataCount*8){throw new Error("code length overflow. ("
+buffer.getLengthInBits()
+">"
+totalDataCount*8
+")");}
if(buffer.getLengthInBits()+4<=totalDataCount*8){buffer.put(0,4);}
while(buffer.getLengthInBits()%8!=0){buffer.putBit(false);}
while(true){if(buffer.getLengthInBits()>=totalDataCount*8){break;}
buffer.put(QRCodeModel.PAD0,8);if(buffer.getLengthInBits()>=totalDataCount*8){break;}
buffer.put(QRCodeModel.PAD1,8);}
return QRCodeModel.createBytes(buffer,rsBlocks);};QRCodeModel.createBytes=function(buffer,rsBlocks){var offset=0;var maxDcCount=0;var maxEcCount=0;var dcdata=new Array(rsBlocks.length);var ecdata=new Array(rsBlocks.length);for(var r=0;r<rsBlocks.length;r++){var dcCount=rsBlocks[r].dataCount;var ecCount=rsBlocks[r].totalCount-dcCount;maxDcCount=Math.max(maxDcCount,dcCount);maxEcCount=Math.max(maxEcCount,ecCount);dcdata[r]=new Array(dcCount);for(var i=0;i<dcdata[r].length;i++){dcdata[r][i]=0xff&buffer.buffer[i+offset];}
offset+=dcCount;var rsPoly=QRUtil.getErrorCorrectPolynomial(ecCount);var rawPoly=new QRPolynomial(dcdata[r],rsPoly.getLength()-1);var modPoly=rawPoly.mod(rsPoly);ecdata[r]=new Array(rsPoly.getLength()-1);for(var i=0;i<ecdata[r].length;i++){var modIndex=i+modPoly.getLength()-ecdata[r].length;ecdata[r][i]=(modIndex>=0)?modPoly.get(modIndex):0;}}
var totalCodeCount=0;for(var i=0;i<rsBlocks.length;i++){totalCodeCount+=rsBlocks[i].totalCount;}
var data=new Array(totalCodeCount);var index=0;for(var i=0;i<maxDcCount;i++){for(var r=0;r<rsBlocks.length;r++){if(i<dcdata[r].length){data[index++]=dcdata[r][i];}}}
for(var i=0;i<maxEcCount;i++){for(var r=0;r<rsBlocks.length;r++){if(i<ecdata[r].length){data[index++]=ecdata[r][i];}}}
return data;};var QRMode={MODE_NUMBER:1<<0,MODE_ALPHA_NUM:1<<1,MODE_8BIT_BYTE:1<<2,MODE_KANJI:1<<3};var QRErrorCorrectLevel={L:1,M:0,Q:3,H:2};var QRMaskPattern={PATTERN000:0,PATTERN001:1,PATTERN010:2,PATTERN011:3,PATTERN100:4,PATTERN101:5,PATTERN110:6,PATTERN111:7};var QRUtil={PATTERN_POSITION_TABLE:[[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]],G15:(1<<10)|(1<<8)|(1<<5)|(1<<4)|(1<<2)|(1<<1)|(1<<0),G18:(1<<12)|(1<<11)|(1<<10)|(1<<9)|(1<<8)|(1<<5)|(1<<2)|(1<<0),G15_MASK:(1<<14)|(1<<12)|(1<<10)|(1<<4)|(1<<1),getBCHTypeInfo:function(data){var d=data<<10;while(QRUtil.getBCHDigit(d)-QRUtil.getBCHDigit(QRUtil.G15)>=0){d^=(QRUtil.G15<<(QRUtil.getBCHDigit(d)-QRUtil.getBCHDigit(QRUtil.G15)));}
return((data<<10)|d)^QRUtil.G15_MASK;},getBCHTypeNumber:function(data){var d=data<<12;while(QRUtil.getBCHDigit(d)-QRUtil.getBCHDigit(QRUtil.G18)>=0){d^=(QRUtil.G18<<(QRUtil.getBCHDigit(d)-QRUtil.getBCHDigit(QRUtil.G18)));}
return(data<<12)|d;},getBCHDigit:function(data){var digit=0;while(data!=0){digit++;data>>>=1;}
return digit;},getPatternPosition:function(typeNumber){return QRUtil.PATTERN_POSITION_TABLE[typeNumber-1];},getMask:function(maskPattern,i,j){switch(maskPattern){case QRMaskPattern.PATTERN000:return(i+j)%2==0;case QRMaskPattern.PATTERN001:return i%2==0;case QRMaskPattern.PATTERN010:return j%3==0;case QRMaskPattern.PATTERN011:return(i+j)%3==0;case QRMaskPattern.PATTERN100:return(Math.floor(i/2)+Math.floor(j/3))%2==0;case QRMaskPattern.PATTERN101:return(i*j)%2+(i*j)%3==0;case QRMaskPattern.PATTERN110:return((i*j)%2+(i*j)%3)%2==0;case QRMaskPattern.PATTERN111:return((i*j)%3+(i+j)%2)%2==0;default:throw new Error("bad maskPattern:"+maskPattern);}},getErrorCorrectPolynomial:function(errorCorrectLength){var a=new QRPolynomial([1],0);for(var i=0;i<errorCorrectLength;i++){a=a.multiply(new QRPolynomial([1,QRMath.gexp(i)],0));}
return a;},getLengthInBits:function(mode,type){if(1<=type&&type<10){switch(mode){case QRMode.MODE_NUMBER:return 10;case QRMode.MODE_ALPHA_NUM:return 9;case QRMode.MODE_8BIT_BYTE:return 8;case QRMode.MODE_KANJI:return 8;default:throw new Error("mode:"+mode);}}else if(type<27){switch(mode){case QRMode.MODE_NUMBER:return 12;case QRMode.MODE_ALPHA_NUM:return 11;case QRMode.MODE_8BIT_BYTE:return 16;case QRMode.MODE_KANJI:return 10;default:throw new Error("mode:"+mode);}}else if(type<41){switch(mode){case QRMode.MODE_NUMBER:return 14;case QRMode.MODE_ALPHA_NUM:return 13;case QRMode.MODE_8BIT_BYTE:return 16;case QRMode.MODE_KANJI:return 12;default:throw new Error("mode:"+mode);}}else{throw new Error("type:"+type);}},getLostPoint:function(qrCode){var moduleCount=qrCode.getModuleCount();var lostPoint=0;for(var row=0;row<moduleCount;row++){for(var col=0;col<moduleCount;col++){var sameCount=0;var dark=qrCode.isDark(row,col);for(var r=-1;r<=1;r++){if(row+r<0||moduleCount<=row+r){continue;}
for(var c=-1;c<=1;c++){if(col+c<0||moduleCount<=col+c){continue;}
if(r==0&&c==0){continue;}
if(dark==qrCode.isDark(row+r,col+c)){sameCount++;}}}
if(sameCount>5){lostPoint+=(3+sameCount-5);}}}
for(var row=0;row<moduleCount-1;row++){for(var col=0;col<moduleCount-1;col++){var count=0;if(qrCode.isDark(row,col))count++;if(qrCode.isDark(row+1,col))count++;if(qrCode.isDark(row,col+1))count++;if(qrCode.isDark(row+1,col+1))count++;if(count==0||count==4){lostPoint+=3;}}}
for(var row=0;row<moduleCount;row++){for(var col=0;col<moduleCount-6;col++){if(qrCode.isDark(row,col)&&!qrCode.isDark(row,col+1)&&qrCode.isDark(row,col+2)&&qrCode.isDark(row,col+3)&&qrCode.isDark(row,col+4)&&!qrCode.isDark(row,col+5)&&qrCode.isDark(row,col+6)){lostPoint+=40;}}}
for(var col=0;col<moduleCount;col++){for(var row=0;row<moduleCount-6;row++){if(qrCode.isDark(row,col)&&!qrCode.isDark(row+1,col)&&qrCode.isDark(row+2,col)&&qrCode.isDark(row+3,col)&&qrCode.isDark(row+4,col)&&!qrCode.isDark(row+5,col)&&qrCode.isDark(row+6,col)){lostPoint+=40;}}}
var darkCount=0;for(var col=0;col<moduleCount;col++){for(var row=0;row<moduleCount;row++){if(qrCode.isDark(row,col)){darkCount++;}}}
var ratio=Math.abs(100*darkCount/moduleCount/moduleCount-50)/5;lostPoint+=ratio*10;return lostPoint;}};var QRMath={glog:function(n){if(n<1){throw new Error("glog("+n+")");}
return QRMath.LOG_TABLE[n];},gexp:function(n){while(n<0){n+=255;}
while(n>=256){n-=255;}
return QRMath.EXP_TABLE[n];},EXP_TABLE:new Array(256),LOG_TABLE:new Array(256)};for(var i=0;i<8;i++){QRMath.EXP_TABLE[i]=1<<i;}
for(var i=8;i<256;i++){QRMath.EXP_TABLE[i]=QRMath.EXP_TABLE[i-4]^QRMath.EXP_TABLE[i-5]^QRMath.EXP_TABLE[i-6]^QRMath.EXP_TABLE[i-8];}
for(var i=0;i<255;i++){QRMath.LOG_TABLE[QRMath.EXP_TABLE[i]]=i;}
function QRPolynomial(num,shift){if(num.length==undefined){throw new Error(num.length+"/"+shift);}
var offset=0;while(offset<num.length&&num[offset]==0){offset++;}
this.num=new Array(num.length-offset+shift);for(var i=0;i<num.length-offset;i++){this.num[i]=num[i+offset];}}
QRPolynomial.prototype={get:function(index){return this.num[index];},getLength:function(){return this.num.length;},multiply:function(e){var num=new Array(this.getLength()+e.getLength()-1);for(var i=0;i<this.getLength();i++){for(var j=0;j<e.getLength();j++){num[i+j]^=QRMath.gexp(QRMath.glog(this.get(i))+QRMath.glog(e.get(j)));}}
return new QRPolynomial(num,0);},mod:function(e){if(this.getLength()-e.getLength()<0){return this;}
var ratio=QRMath.glog(this.get(0))-QRMath.glog(e.get(0));var num=new Array(this.getLength());for(var i=0;i<this.getLength();i++){num[i]=this.get(i);}
for(var i=0;i<e.getLength();i++){num[i]^=QRMath.gexp(QRMath.glog(e.get(i))+ratio);}
return new QRPolynomial(num,0).mod(e);}};function QRRSBlock(totalCount,dataCount){this.totalCount=totalCount;this.dataCount=dataCount;}
QRRSBlock.RS_BLOCK_TABLE=[[1,26,19],[1,26,16],[1,26,13],[1,26,9],[1,44,34],[1,44,28],[1,44,22],[1,44,16],[1,70,55],[1,70,44],[2,35,17],[2,35,13],[1,100,80],[2,50,32],[2,50,24],[4,25,9],[1,134,108],[2,67,43],[2,33,15,2,34,16],[2,33,11,2,34,12],[2,86,68],[4,43,27],[4,43,19],[4,43,15],[2,98,78],[4,49,31],[2,32,14,4,33,15],[4,39,13,1,40,14],[2,121,97],[2,60,38,2,61,39],[4,40,18,2,41,19],[4,40,14,2,41,15],[2,146,116],[3,58,36,2,59,37],[4,36,16,4,37,17],[4,36,12,4,37,13],[2,86,68,2,87,69],[4,69,43,1,70,44],[6,43,19,2,44,20],[6,43,15,2,44,16],[4,101,81],[1,80,50,4,81,51],[4,50,22,4,51,23],[3,36,12,8,37,13],[2,116,92,2,117,93],[6,58,36,2,59,37],[4,46,20,6,47,21],[7,42,14,4,43,15],[4,133,107],[8,59,37,1,60,38],[8,44,20,4,45,21],[12,33,11,4,34,12],[3,145,115,1,146,116],[4,64,40,5,65,41],[11,36,16,5,37,17],[11,36,12,5,37,13],[5,109,87,1,110,88],[5,65,41,5,66,42],[5,54,24,7,55,25],[11,36,12],[5,122,98,1,123,99],[7,73,45,3,74,46],[15,43,19,2,44,20],[3,45,15,13,46,16],[1,135,107,5,136,108],[10,74,46,1,75,47],[1,50,22,15,51,23],[2,42,14,17,43,15],[5,150,120,1,151,121],[9,69,43,4,70,44],[17,50,22,1,51,23],[2,42,14,19,43,15],[3,141,113,4,142,114],[3,70,44,11,71,45],[17,47,21,4,48,22],[9,39,13,16,40,14],[3,135,107,5,136,108],[3,67,41,13,68,42],[15,54,24,5,55,25],[15,43,15,10,44,16],[4,144,116,4,145,117],[17,68,42],[17,50,22,6,51,23],[19,46,16,6,47,17],[2,139,111,7,140,112],[17,74,46],[7,54,24,16,55,25],[34,37,13],[4,151,121,5,152,122],[4,75,47,14,76,48],[11,54,24,14,55,25],[16,45,15,14,46,16],[6,147,117,4,148,118],[6,73,45,14,74,46],[11,54,24,16,55,25],[30,46,16,2,47,17],[8,132,106,4,133,107],[8,75,47,13,76,48],[7,54,24,22,55,25],[22,45,15,13,46,16],[10,142,114,2,143,115],[19,74,46,4,75,47],[28,50,22,6,51,23],[33,46,16,4,47,17],[8,152,122,4,153,123],[22,73,45,3,74,46],[8,53,23,26,54,24],[12,45,15,28,46,16],[3,147,117,10,148,118],[3,73,45,23,74,46],[4,54,24,31,55,25],[11,45,15,31,46,16],[7,146,116,7,147,117],[21,73,45,7,74,46],[1,53,23,37,54,24],[19,45,15,26,46,16],[5,145,115,10,146,116],[19,75,47,10,76,48],[15,54,24,25,55,25],[23,45,15,25,46,16],[13,145,115,3,146,116],[2,74,46,29,75,47],[42,54,24,1,55,25],[23,45,15,28,46,16],[17,145,115],[10,74,46,23,75,47],[10,54,24,35,55,25],[19,45,15,35,46,16],[17,145,115,1,146,116],[14,74,46,21,75,47],[29,54,24,19,55,25],[11,45,15,46,46,16],[13,145,115,6,146,116],[14,74,46,23,75,47],[44,54,24,7,55,25],[59,46,16,1,47,17],[12,151,121,7,152,122],[12,75,47,26,76,48],[39,54,24,14,55,25],[22,45,15,41,46,16],[6,151,121,14,152,122],[6,75,47,34,76,48],[46,54,24,10,55,25],[2,45,15,64,46,16],[17,152,122,4,153,123],[29,74,46,14,75,47],[49,54,24,10,55,25],[24,45,15,46,46,16],[4,152,122,18,153,123],[13,74,46,32,75,47],[48,54,24,14,55,25],[42,45,15,32,46,16],[20,147,117,4,148,118],[40,75,47,7,76,48],[43,54,24,22,55,25],[10,45,15,67,46,16],[19,148,118,6,149,119],[18,75,47,31,76,48],[34,54,24,34,55,25],[20,45,15,61,46,16]];QRRSBlock.getRSBlocks=function(typeNumber,errorCorrectLevel){var rsBlock=QRRSBlock.getRsBlockTable(typeNumber,errorCorrectLevel);if(rsBlock==undefined){throw new Error("bad rs block @ typeNumber:"+typeNumber+"/errorCorrectLevel:"+errorCorrectLevel);}
var length=rsBlock.length/3;var list=[];for(var i=0;i<length;i++){var count=rsBlock[i*3+0];var totalCount=rsBlock[i*3+1];var dataCount=rsBlock[i*3+2];for(var j=0;j<count;j++){list.push(new QRRSBlock(totalCount,dataCount));}}
return list;};QRRSBlock.getRsBlockTable=function(typeNumber,errorCorrectLevel){switch(errorCorrectLevel){case QRErrorCorrectLevel.L:return QRRSBlock.RS_BLOCK_TABLE[(typeNumber-1)*4+0];case QRErrorCorrectLevel.M:return QRRSBlock.RS_BLOCK_TABLE[(typeNumber-1)*4+1];case QRErrorCorrectLevel.Q:return QRRSBlock.RS_BLOCK_TABLE[(typeNumber-1)*4+2];case QRErrorCorrectLevel.H:return QRRSBlock.RS_BLOCK_TABLE[(typeNumber-1)*4+3];default:return undefined;}};function QRBitBuffer(){this.buffer=[];this.length=0;}
QRBitBuffer.prototype={get:function(index){var bufIndex=Math.floor(index/8);return((this.buffer[bufIndex]>>>(7-index%8))&1)==1;},put:function(num,length){for(var i=0;i<length;i++){this.putBit(((num>>>(length-i-1))&1)==1);}},getLengthInBits:function(){return this.length;},putBit:function(bit){var bufIndex=Math.floor(this.length/8);if(this.buffer.length<=bufIndex){this.buffer.push(0);}
if(bit){this.buffer[bufIndex]|=(0x80>>>(this.length%8));}
this.length++;}};var QRCodeLimitLength=[[17,14,11,7],[32,26,20,14],[53,42,32,24],[78,62,46,34],[106,84,60,44],[134,106,74,58],[154,122,86,64],[192,152,108,84],[230,180,130,98],[271,213,151,119],[321,251,177,137],[367,287,203,155],[425,331,241,177],[458,362,258,194],[520,412,292,220],[586,450,322,250],[644,504,364,280],[718,560,394,310],[792,624,442,338],[858,666,482,382],[929,711,509,403],[1003,779,565,439],[1091,857,611,461],[1171,911,661,511],[1273,997,715,535],[1367,1059,751,593],[1465,1125,805,625],[1528,1190,868,658],[1628,1264,908,698],[1732,1370,982,742],[1840,1452,1030,790],[1952,1538,1112,842],[2068,1628,1168,898],[2188,1722,1228,958],[2303,1809,1283,983],[2431,1911,1351,1051],[2563,1989,1423,1093],[2699,2099,1499,1139],[2809,2213,1579,1219],[2953,2331,1663,1273]];
function _isSupportCanvas() {
return typeof CanvasRenderingContext2D != "undefined";
}
// android 2.x doesn't support Data-URI spec
function _getAndroid() {
var android = false;
var sAgent = navigator.userAgent;
if (/android/i.test(sAgent)) { // android
android = true;
var aMat = sAgent.toString().match(/android ([0-9]\.[0-9])/i);
if (aMat && aMat[1]) {
android = parseFloat(aMat[1]);
}
}
return android;
}
var svgDrawer = (function() {
var Drawing = function (el, htOption) {
this._el = el;
this._htOption = htOption;
};
Drawing.prototype.draw = function (oQRCode) {
var _htOption = this._htOption;
var _el = this._el;
var nCount = oQRCode.getModuleCount();
var nWidth = Math.floor(_htOption.width / nCount);
var nHeight = Math.floor(_htOption.height / nCount);
this.clear();
function makeSVG(tag, attrs) {
var el = document.createElementNS('http://www.w3.org/2000/svg', tag);
for (var k in attrs)
if (attrs.hasOwnProperty(k)) el.setAttribute(k, attrs[k]);
return el;
}
var svg = makeSVG("svg" , {'viewBox': '0 0 ' + String(nCount) + " " + String(nCount), 'width': '100%', 'height': '100%', 'fill': _htOption.colorLight});
svg.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:xlink", "http://www.w3.org/1999/xlink");
_el.appendChild(svg);
svg.appendChild(makeSVG("rect", {"fill": _htOption.colorLight, "width": "100%", "height": "100%"}));
svg.appendChild(makeSVG("rect", {"fill": _htOption.colorDark, "width": "1", "height": "1", "id": "template"}));
for (var row = 0; row < nCount; row++) {
for (var col = 0; col < nCount; col++) {
if (oQRCode.isDark(row, col)) {
var child = makeSVG("use", {"x": String(col), "y": String(row)});
child.setAttributeNS("http://www.w3.org/1999/xlink", "href", "#template")
svg.appendChild(child);
}
}
}
};
Drawing.prototype.clear = function () {
while (this._el.hasChildNodes())
this._el.removeChild(this._el.lastChild);
};
return Drawing;
})();
var useSVG = document.documentElement.tagName.toLowerCase() === "svg";
// Drawing in DOM by using Table tag
var Drawing = useSVG ? svgDrawer : !_isSupportCanvas() ? (function () {
var Drawing = function (el, htOption) {
this._el = el;
this._htOption = htOption;
};
/**
* Draw the QRCode
*
* @param {QRCode} oQRCode
*/
Drawing.prototype.draw = function (oQRCode) {
var _htOption = this._htOption;
var _el = this._el;
var nCount = oQRCode.getModuleCount();
var nWidth = Math.floor(_htOption.width / nCount);
var nHeight = Math.floor(_htOption.height / nCount);
var aHTML = ['<table style="border:0;border-collapse:collapse;">'];
for (var row = 0; row < nCount; row++) {
aHTML.push('<tr>');
for (var col = 0; col < nCount; col++) {
aHTML.push('<td style="border:0;border-collapse:collapse;padding:0;margin:0;width:' + nWidth + 'px;height:' + nHeight + 'px;background-color:' + (oQRCode.isDark(row, col) ? _htOption.colorDark : _htOption.colorLight) + ';"></td>');
}
aHTML.push('</tr>');
}
aHTML.push('</table>');
_el.innerHTML = aHTML.join('');
// Fix the margin values as real size.
var elTable = _el.childNodes[0];
var nLeftMarginTable = (_htOption.width - elTable.offsetWidth) / 2;
var nTopMarginTable = (_htOption.height - elTable.offsetHeight) / 2;
if (nLeftMarginTable > 0 && nTopMarginTable > 0) {
elTable.style.margin = nTopMarginTable + "px " + nLeftMarginTable + "px";
}
};
/**
* Clear the QRCode
*/
Drawing.prototype.clear = function () {
this._el.innerHTML = '';
};
return Drawing;
})() : (function () { // Drawing in Canvas
function _onMakeImage() {
this._elImage.src = this._elCanvas.toDataURL("image/png");
this._elImage.style.display = "block";
this._elCanvas.style.display = "none";
}
// Android 2.1 bug workaround
// http://code.google.com/p/android/issues/detail?id=5141
if (this._android && this._android <= 2.1) {
var factor = 1 / window.devicePixelRatio;
var drawImage = CanvasRenderingContext2D.prototype.drawImage;
CanvasRenderingContext2D.prototype.drawImage = function (image, sx, sy, sw, sh, dx, dy, dw, dh) {
if (("nodeName" in image) && /img/i.test(image.nodeName)) {
for (var i = arguments.length - 1; i >= 1; i--) {
arguments[i] = arguments[i] * factor;
}
} else if (typeof dw == "undefined") {
arguments[1] *= factor;
arguments[2] *= factor;
arguments[3] *= factor;
arguments[4] *= factor;
}
drawImage.apply(this, arguments);
};
}
/**
* Check whether the user's browser supports Data URI or not
*
* @private
* @param {Function} fSuccess Occurs if it supports Data URI
* @param {Function} fFail Occurs if it doesn't support Data URI
*/
function _safeSetDataURI(fSuccess, fFail) {
var self = this;
self._fFail = fFail;
self._fSuccess = fSuccess;
// Check it just once
if (self._bSupportDataURI === null) {
var el = document.createElement("img");
var fOnError = function() {
self._bSupportDataURI = false;
if (self._fFail) {
self._fFail.call(self);
}
};
var fOnSuccess = function() {
self._bSupportDataURI = true;
if (self._fSuccess) {
self._fSuccess.call(self);
}
};
el.onabort = fOnError;
el.onerror = fOnError;
el.onload = fOnSuccess;
el.src = "data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=="; // the Image contains 1px data.
return;
} else if (self._bSupportDataURI === true && self._fSuccess) {
self._fSuccess.call(self);
} else if (self._bSupportDataURI === false && self._fFail) {
self._fFail.call(self);
}
};
/**
* Drawing QRCode by using canvas
*
* @constructor
* @param {HTMLElement} el
* @param {Object} htOption QRCode Options
*/
var Drawing = function (el, htOption) {
this._bIsPainted = false;
this._android = _getAndroid();
this._htOption = htOption;
this._elCanvas = document.createElement("canvas");
this._elCanvas.width = htOption.width;
this._elCanvas.height = htOption.height;
el.appendChild(this._elCanvas);
this._el = el;
this._oContext = this._elCanvas.getContext("2d");
this._bIsPainted = false;
this._elImage = document.createElement("img");
this._elImage.alt = "Scan me!";
this._elImage.style.display = "none";
this._el.appendChild(this._elImage);
this._bSupportDataURI = null;
};
/**
* Draw the QRCode
*
* @param {QRCode} oQRCode
*/
Drawing.prototype.draw = function (oQRCode) {
var _elImage = this._elImage;
var _oContext = this._oContext;
var _htOption = this._htOption;
var nCount = oQRCode.getModuleCount();
var nWidth = _htOption.width / nCount;
var nHeight = _htOption.height / nCount;
var nRoundedWidth = Math.round(nWidth);
var nRoundedHeight = Math.round(nHeight);
_elImage.style.display = "none";
this.clear();
for (var row = 0; row < nCount; row++) {
for (var col = 0; col < nCount; col++) {
var bIsDark = oQRCode.isDark(row, col);
var nLeft = col * nWidth;
var nTop = row * nHeight;
_oContext.strokeStyle = bIsDark ? _htOption.colorDark : _htOption.colorLight;
_oContext.lineWidth = 1;
_oContext.fillStyle = bIsDark ? _htOption.colorDark : _htOption.colorLight;
_oContext.fillRect(nLeft, nTop, nWidth, nHeight);
// 안티 앨리어싱 방지 처리
_oContext.strokeRect(
Math.floor(nLeft) + 0.5,
Math.floor(nTop) + 0.5,
nRoundedWidth,
nRoundedHeight
);
_oContext.strokeRect(
Math.ceil(nLeft) - 0.5,
Math.ceil(nTop) - 0.5,
nRoundedWidth,
nRoundedHeight
);
}
}
this._bIsPainted = true;
};
/**
* Make the image from Canvas if the browser supports Data URI.
*/
Drawing.prototype.makeImage = function () {
if (this._bIsPainted) {
_safeSetDataURI.call(this, _onMakeImage);
}
};
/**
* Return whether the QRCode is painted or not
*
* @return {Boolean}
*/
Drawing.prototype.isPainted = function () {
return this._bIsPainted;
};
/**
* Clear the QRCode
*/
Drawing.prototype.clear = function () {
this._oContext.clearRect(0, 0, this._elCanvas.width, this._elCanvas.height);
this._bIsPainted = false;
};
/**
* @private
* @param {Number} nNumber
*/
Drawing.prototype.round = function (nNumber) {
if (!nNumber) {
return nNumber;
}
return Math.floor(nNumber * 1000) / 1000;
};
return Drawing;
})();
/**
* Get the type by string length
*
* @private
* @param {String} sText
* @param {Number} nCorrectLevel
* @return {Number} type
*/
function _getTypeNumber(sText, nCorrectLevel) {
var nType = 1;
var length = _getUTF8Length(sText);
for (var i = 0, len = QRCodeLimitLength.length; i <= len; i++) {
var nLimit = 0;
switch (nCorrectLevel) {
case QRErrorCorrectLevel.L :
nLimit = QRCodeLimitLength[i][0];
break;
case QRErrorCorrectLevel.M :
nLimit = QRCodeLimitLength[i][1];
break;
case QRErrorCorrectLevel.Q :
nLimit = QRCodeLimitLength[i][2];
break;
case QRErrorCorrectLevel.H :
nLimit = QRCodeLimitLength[i][3];
break;
}
if (length <= nLimit) {
break;
} else {
nType++;
}
}
if (nType > QRCodeLimitLength.length) {
throw new Error("Too long data");
}
return nType;
}
function _getUTF8Length(sText) {
var replacedText = encodeURI(sText).toString().replace(/\%[0-9a-fA-F]{2}/g, 'a');
return replacedText.length + (replacedText.length != sText ? 3 : 0);
}
/**
* @class QRCode
* @constructor
* @example
* new QRCode(document.getElementById("test"), "http://jindo.dev.naver.com/collie");
*
* @example
* var oQRCode = new QRCode("test", {
* text : "http://naver.com",
* width : 128,
* height : 128
* });
*
* oQRCode.clear(); // Clear the QRCode.
* oQRCode.makeCode("http://map.naver.com"); // Re-create the QRCode.
*
* @param {HTMLElement|String} el target element or 'id' attribute of element.
* @param {Object|String} vOption
* @param {String} vOption.text QRCode link data
* @param {Number} [vOption.width=256]
* @param {Number} [vOption.height=256]
* @param {String} [vOption.colorDark="#000000"]
* @param {String} [vOption.colorLight="#ffffff"]
* @param {QRCode.CorrectLevel} [vOption.correctLevel=QRCode.CorrectLevel.H] [L|M|Q|H]
*/
QRCode = function (el, vOption) {
this._htOption = {
width : 256,
height : 256,
typeNumber : 4,
colorDark : "#000000",
colorLight : "#ffffff",
correctLevel : QRErrorCorrectLevel.H
};
if (typeof vOption === 'string') {
vOption = {
text : vOption
};
}
// Overwrites options
if (vOption) {
for (var i in vOption) {
this._htOption[i] = vOption[i];
}
}
if (typeof el == "string") {
el = document.getElementById(el);
}
if (this._htOption.useSVG) {
Drawing = svgDrawer;
}
this._android = _getAndroid();
this._el = el;
this._oQRCode = null;
this._oDrawing = new Drawing(this._el, this._htOption);
if (this._htOption.text) {
this.makeCode(this._htOption.text);
}
};
/**
* Make the QRCode
*
* @param {String} sText link data
*/
QRCode.prototype.makeCode = function (sText) {
this._oQRCode = new QRCodeModel(_getTypeNumber(sText, this._htOption.correctLevel), this._htOption.correctLevel);
this._oQRCode.addData(sText);
this._oQRCode.make();
this._el.title = sText;
this._oDrawing.draw(this._oQRCode);
this.makeImage();
};
/**
* Make the Image from Canvas element
* - It occurs automatically
* - Android below 3 doesn't support Data-URI spec.
*
* @private
*/
QRCode.prototype.makeImage = function () {
if (typeof this._oDrawing.makeImage == "function" && (!this._android || this._android >= 3)) {
this._oDrawing.makeImage();
}
};
/**
* Clear the QRCode
*/
QRCode.prototype.clear = function () {
this._oDrawing.clear();
};
/**
* @name QRCode.CorrectLevel
*/
QRCode.CorrectLevel = QRErrorCorrectLevel;
})();

View file

@ -0,0 +1,7 @@
$(function() {
return $.getJSON('./quotes.json', function(data) {
var quote;
quote = data[Math.floor(Math.random() * data.length)];
return $('#quote').append("<h3>" + quote.title + "</h3><p>" + quote.description + "</p>");
});
});

View file

@ -1,78 +0,0 @@
function regenerateQR() {
let username_field = document.getElementById('tabtopup-username');
let amount_field = document.getElementById('tabtopup-amount');
let qr_container = document.getElementById("tabtopup-qrcode");
let amountUnparsed = amount_field.value;
let username = username_field.value;
username_field.classList.remove('is-danger');
amount_field.classList.remove('is-danger');
qr_container.textContent = '';
let message_container = document.getElementById('tabtopup-message');
if (username == '') {
message_container.textContent = 'Please fill in username.';
username_field.classList.add('is-danger');
return;
}
else if (!(/^[a-z0-9A-Z\-_.]+$/.test(username))) {
message_container.textContent = 'Are you sure that ' + username + ' is your username? Most usernames only contain letters and numbers. If you\'re not sure what your username is, feel free to contact the board.';
username_field.classList.add('is-danger');
return;
} else if (amountUnparsed == '') {
message_container.textContent = 'Please fill in amount.';
amount_field.classList.add('is-danger');
return;
} else {
message_container.textContent = '';
}
let amount = parseFloat(document.getElementById('tabtopup-amount').value.replace(',', '.'));
message_container.textContent = username + ' will top up for ' + amount.toFixed(2) + ' euro. It might take a couple of days before this arrives on your Tab.';
let message = 'TAB ' + username;
if (message.length >= 80) {
message_container.textContent = 'Username too long.';
username_field.classList.add('is-danger');
return;
}
if (amount <= 0) {
message_container.textContent = 'Amount should be at least 0.01 euro (but preferably more of course).';
amount_field.classList.add('is-danger');
return;
}
let qr_data = generateQrCode({
name: 'Zeus WPI',
iban: document.getElementById('banknumber').textContent,
amount: amount,
unstructuredReference: message,
information: 'Zeus WPI Tab',
});
new QRCode(qr_container, {
text: qr_data,
width: 256,
height: 256,
correctLevel: QRCode.CorrectLevel.M
});
return;
}
window.onload = function() {
document.getElementById('tab-qr-button').addEventListener('click', function(event) {
event.preventDefault();
let modal = document.querySelector('.modal');
let html = document.querySelector('html');
modal.classList.add('is-active');
html.classList.add('is-clipped');
modal.querySelector('.modal-background').addEventListener('click', function(e) {
e.preventDefault();
modal.classList.remove('is-active');
html.classList.remove('is-clipped');
});
});
document.getElementById('tabtopup-username').addEventListener('input', regenerateQR);
document.getElementById('tabtopup-amount').addEventListener('input', regenerateQR);
regenerateQR();
}

View file

@ -66,13 +66,17 @@ table.board-table {
}
#contact-icons {
display: flex;
justify-content: center;
align-items: center;
> .column {
max-width: 40vw;
max-width: 70vw;
}
.contact-circle-option {
//display: block;
//max-width: 200px;
display: block;
max-width: 200px;
.contact-circle-wrapper {
display: block;
@ -157,65 +161,3 @@ table.board-table {
border-color: $primary;
}
}
.sponsoring-member {
.name {
padding-top: 0.75rem;
font-size: 1.4rem;
font-weight: bold;
text-align: center;
}
.username {
font-weight: lighter;
font-size: 1.1rem;
}
.logo-wrapper {
display: flex;
flex-direction: column;
align-items: center;
width: 14rem;
padding: 0.75rem 0;
img {
max-width: 9rem;
max-height: 9rem;
}
}
.links {
margin-top: 1.5rem;
.social-icon {
margin-right: 0.6rem;
}
}
blockquote {
font-size: 1.2rem;
}
.description {
font-size: 1.1rem;
font-weight: normal;
}
.logo-initial {
background-color: #ff7f00;
width: 7rem;
height: 7rem;
}
@media screen and (max-width: 550px){
.logo-wrapper {
width: 10rem;
}
.name{
font-size: 1rem;
}
.username{
font-size: 0.9rem;
}
}
}

View file

@ -1,3 +1,36 @@
.blogpost {
position: relative;
#table-of-contents {
@include tablet {
position: absolute;
left: 100%;
}
@include mobile {
text-align: center;
}
#markdown-toc {
@extend .menu-list;
&, ul {
margin: 0;
list-style: none;
}
}
}
}
$sel: '';
@for $i from 1 through 9 {
$sel: if($i == 1, "ul", selector-nest($sel, "ul")) !global;
#markdown-toc.toc-depth-#{$i} #{$sel} {
display: none;
}
}
@keyframes lineAnimation {
to {
width: 80px;
@ -12,6 +45,7 @@
.titlewrap {
position: relative;
margin: auto;
min-width: 400px;
.title {
@include tablet {
@ -65,11 +99,21 @@
}
.blog-preview {
.blogpreview-extra {
color: #7a7a7a;
}
.blogpreview-tags {
color: #7a7a7a;
position: relative;
// Fadeout
&::after {
content: '';
position: absolute;
bottom: 20px;
left: 0;
/* Permalink - use to edit and share this gradient: http://colorzilla.com/gradient-editor/#ffffff+0,ffffff+100&0+0,1+100;White+to+Transparent */
background: -moz-linear-gradient(top, rgba(255,255,255,0) 0%, rgba(255,255,255,1) 100%); /* FF3.6-15 */
background: -webkit-linear-gradient(top, rgba(255,255,255,0) 0%,rgba(255,255,255,1) 100%); /* Chrome10-25,Safari5.1-6 */
background: linear-gradient(to bottom, rgba(255,255,255,0) 0%,rgba(255,255,255,1) 100%); /* W3C, IE10+, FF16+, Chrome26+, Opera12+, Safari7+ */
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#00ffffff', endColorstr='#ffffff',GradientType=0 ); /* IE6-9 */
height: 100px;
width: 100%;
}
}

View file

@ -24,7 +24,7 @@
padding: 20px;
&.light-background {
background-color: rgba(0, 0, 0, 0.75);
background-color: rgba(0, 0, 0, 0.5);
}
}

View file

@ -15,6 +15,7 @@ pre .line-numbers {
transition: all .15s ease;
box-shadow: 0 4px 6px rgba(50,50,93,.11), 0 1px 3px rgba(0,0,0,.08);
}
a.box:hover {
@ -222,11 +223,3 @@ footer.footer {
.has-small-caps {
font-variant: small-caps;
}
.underline--magical {
background-image: -webkit-linear-gradient(to right, $zeus-orange, #FFFFFF); /* Chrome 10-25, Safari 5.1-6 */
background-image: linear-gradient(to right, $zeus-orange, #FFFFFF); /* W3C, IE 10+/ Edge, Firefox 16+, Chrome 26+, Opera 12+, Safari 7+ */
background-repeat: no-repeat;
background-size: 100% 0.15em;
background-position: 0 99%;
}

View file

@ -3,7 +3,7 @@
margin-bottom: 10px;
z-index: 100;
#logo-link {
.logo-wrapper {
padding-bottom: 0;
position: relative;

View file

@ -1,7 +0,0 @@
.example {
@extend .box;
&:before {
content: "Voorbeeld. ";
font-weight: bold;
}
}

View file

@ -30,14 +30,6 @@ $top_coder_size: 80px;
margin-left: 10px;
margin-right: 10px;
>h2 {
margin-bottom: 0;
}
>hr {
margin: 0.4rem 0;
}
.event-time-loc {
margin-left: 10px;
margin-right: 10px;
@ -63,7 +55,7 @@ $top_coder_size: 80px;
.content {
color: white;
h1, h2, h3 {
h1, h2 {
color: inherit;
}
a, a:visited {
@ -138,7 +130,7 @@ $top_coder_size: 80px;
.content {
position: relative;
h1, h2, h3 {
h1, h2 {
color: white;
}

View file

@ -1,35 +0,0 @@
// CSS related to the TOC
#table-of-contents {
@include tablet {
position: absolute;
left: 100%;
}
@include mobile {
text-align: center;
}
#markdown-toc {
@extend .menu-list;
&, ul {
margin: 0;
list-style: none;
}
}
}
$sel: '';
@for $i from 1 through 9 {
$sel: if($i == 1, "ul", selector-nest($sel, "ul")) !global;
#markdown-toc.toc-depth-#{$i} #{$sel} {
display: none;
}
}
// Must be applied to the element containing the toc
.toc-container {
position: relative;
}

View file

@ -1,13 +1,15 @@
/* KEEP THIS VVVV */
/* HACK The following line of code does nothing. It only serves as a way for nanoc to recognize dependencies with all the sub scss files */
// <% @items.find_all('/assets/stylesheets/includes/*').each {|e| e.raw_content } %>
/* KEEP THIS ^^^^ */
@import "includes/variables";
@import "node_modules/bulma/bulma";
@import "node_modules/bulma-timeline/src/sass/index.sass";
@import "node_modules/bulma-divider/dist/css/bulma-divider";
@import "node_modules/bulma-timeline/dist/css/bulma-timeline";
// TODO: Remove this once FF64.0b2+ fixes this fustercluck
@-moz-document url-prefix() {
.tile {
min-height: auto;
}
}
// Sticky footer
body {
@ -38,5 +40,3 @@ body {
@import "includes/navbar";
@import "includes/search";
@import "includes/about";
@import "includes/privacy";
@import "includes/toc";

View file

@ -1,9 +0,0 @@
---
title: Java-bot project.
created_at: 29-03-2001
---
Alle leden en geinteresseerden mogen meewerken aan het in Java programmeren van een irc-bot. Mail junk@zeus.rug.ac.be".
_Noot van de archivaris: de datum van deze blogpost is een schatting._

View file

@ -1,9 +0,0 @@
---
title: Linuxlessen online.
created_at: 03-12-2000
---
De lessen kunnen nu ook [gedownload](http://web.archive.org/web/20010303211508/http://www.zeus.rug.ac.be/linuxles.shtml#download) worden.
_Noot van de archivaris: de datum van deze blogpost is een schatting._

View file

@ -1,8 +0,0 @@
---
title: Data Linuxlessen gekend!
created_at: 01-12-2000
---
Zeus WPI geeft terug Linuxlessen! Er zijn dit keer 4 lessen voorzien, met onder meer Linux-installatie en configuratie voor de beginnende gebruiker. Voor de gevorderde gebruiker hebben we enkele uiteenzettingen over firewalling, routing, samba, ... Om je in te schrijven volstaat een mailtje naar lessen@zeus.rug.ac.be met een vermelding van je naam, de les en het aantal aanwezige personen! Voor meer informatie ga je naar de [lessenpagina](http://web.archive.org/web/20001208193800/http://www.zeus.rug.ac.be:80/pub.shtml).
_Noot van de archivaris: de datum van deze blogpost is een schatting._

View file

@ -1,9 +0,0 @@
---
title: Nieuwe lessen in het verschiet.
created_at: 01-03-2001
---
Er worden terug lessen gegeven. Deze keer gaan ze over PHP, firewalling, ... Meer info volgt binnenkort.
_Noot van de archivaris: de datum van deze blogpost is een schatting._

View file

@ -1,9 +0,0 @@
---
title: Mirrors bijgewerkt tijdens de vakantie
created_at: 01-10-2000 10:00
---
De mirrors van Zeus WPI (ftp.zeus.rug.ac.be) werden in de vakantie goed onderhouden, en verschillende nieuwe zaken werden toegevoegd of ge-updated. Zo hebben we ondermeer Debian 2.2 staan en Tucows met de nieuwe layout. We proberen altijd de recenste versies van alles te vinden. Indien iets ontbreekt aarzel dan zeker niet om ons te contacteren, zodat we onze diensten altijd kunnen uitbreiden naar de wensen van onze gebruikers.
_Noot van de archivaris: de datum van deze blogpost is een schatting._

View file

@ -1,22 +0,0 @@
---
title: ZEUS WPI geeft PHP lessen.
created_at: 30-03-2001
---
Op 18, 25 april en 2, 9 mei geven we PHP lessen. Een niet te missen kans voor alle webmasters onder jullie. Meer info volgt binnenkort.
De Linux lessen kunnen nu ook [gedownload](http://web.archive.org/web/20010331094024/http://www.zeus.rug.ac.be:80/lessen/linuxles.shtml#download) worden.
_Update 01/05/2001_
Op 18, 25 april en 2, 9 mei geven we PHP lessen. Een niet te missen kans voor alle webmasters onder jullie. De lessenreeks is nu reeds halfweg. De teksten en de voorbeelden zijn beschikbaar via onderstaande link.
[Meer info, de teksten en de voorbeelden...](http://web.archive.org/web/20010429044958/http://www.zeus.rug.ac.be/lessen/phples.shtml)
_Update 19/05/2001_
De lessen van 2000-2001 zijn achter de rug. De lessenreeks over PHP oogste veel bijval. De lessen werden toegelicht met programmavoorbeelden en uitvoerige lesnota's. Je kan de lesnota's en de source-codes van de voorbeelden afhalen van de zeus-site.
[Meer info, de teksten en de voorbeelden...](http://web.archive.org/web/20010519194513/http://www.zeus.rug.ac.be:80/lessen/phples.shtml)
_Noot van de archivaris: de datum van deze blogpost en zijn updates is een schatting._

View file

@ -1,10 +0,0 @@
---
title: "ZEUS WPI's security pagina."
created_at: 31-03-2001
---
Er is gebleken dat er een grote nood is aan enkele webpagina's met uitleg over het hoe en waarom van security (of beveiliging voor de fanatiekelingen onder u). Vooral het hoe bleek een probleem te zijn.
Op de [security pagina](http://web.archive.org/web/20010331094024/http://www.zeus.rug.ac.be/security/) vindt u meer uitleg.
_Noot van de archivaris: de datum van deze blogpost is een schatting._

View file

@ -1,8 +0,0 @@
---
title: Nieuwe site Zeus WPI
created_at: 02-10-2000
---
Vanaf vandaag is de nieuwe site van Zeus WPI online. De layout is grondig veranderd, maar de inhoud is ongeveer gelijk gebleven (alles wat er vroeger was is nu ook nog terug te vinden), en enkele nieuwe zaken werden toegevoegd. Dit is een eerste stap in de richting waarin we dit jaar willen gaan. We kiezen voor vernieuwing, en naar aanleiding van het 10-jarig bestaan van Zeus zullen nog andere dingen volgen. Hou ons in de gaten!
_Noot van de archivaris: de datum van deze blogpost is een schatting._

View file

@ -1,9 +0,0 @@
---
title: De Zeus t-shirts.
created_at: 02-12-2000
---
Ben jij een grafisch genie? Kun je overweg met een tekenpakket? Voel je je geroepen om het Zeus t-shirt te ontwerpen? Aarzel dan niet en ontwerp voor ons een t-shirt met het gekende [Zeus-logo](http://www.zeus.rug.ac.be/logos/logozeus.jpg). Ontwerpen kun je mailen naar ons [keurteam](mailto:tshirts@zeus.rug.ac.be). Na overleg met het bestuur wordt de mooiste/origineelste uit gekozen.
_Noot van de archivaris: de datum van deze blogpost is een schatting._

View file

@ -1,10 +0,0 @@
---
title: Foto's van de verjaardag online!
created_at: 11-05-2001
---
Op 23 april vierde Zeus zijn 10-jarig bestaan met een korte receptie en een lange after-party in de BoomBoom. De foto's zijn te bezichtigen op onze site. Jammer genoeg zijn deze niet beschikbaar van buiten het RUGnet.
[Meer foto's...](http://web.archive.org/web/20031009082128/http://zeus.rug.ac.be/~jonas/)
_Noot van de archivaris: de datum van deze blogpost en zijn updates is een schatting._

View file

@ -1,13 +0,0 @@
---
title: Zeus dankt de lesgevers van de installatieles...
created_at: 28-11-2001
---
Hierbij willen we Bernard Grymonpon, Frank Louwers en Rudy Gevaert danken voor hun inzet voor de [installatieles](http://web.archive.org/web/20020802193359/http://www.zeus.rug.ac.be:80/pub.shtml). Alsook danken we de talrijke aanwezigen.
Als ook willen we onze verontschuldigingen aanbieden aan de aanwezigen, voor de ietwat hectische les. Dit kwam omdat Bernard de dag zelf past wist dat hij de les ging geven. Tom die de les normaal ging geven was geveld door de griep.
Na de les hebben we de X-server ook aan de praat gekregen (wat tijdens de les niet lukte), we gebruikten een verkeerde driver. Maw inspecteer uw hardware voor je begint te installeren.
_Noot van de archivaris: de datum van deze blogpost is een schatting._

View file

@ -1,9 +0,0 @@
---
title: Blok
created_at: 26-05-2002
---
De examens staan voor de deur, dus dit academiejaar houden we het, wat de lessen betreft, voor bekeken.
_Noot van de archivaris: de datum van deze blogpost is een schatting._

View file

@ -1,14 +0,0 @@
---
title: Latex les !
created_at: 01-03-2002
---
LaTeX is een taal waarmee men gemakkelijk documenten van hoge kwaliteit kan produceren. De kwaliteit slaat vooral op: het invoegen van wiskundige tekst op eenvoudige manier in een document, het maken van thesissen, het opstellen van brieven.
Kortom LaTeX is het vervangmiddel voor tekstverwerkingprogramma's als Word die doen wat je niet wilt, LaTex doet wat jij wilt.
De lessen gaan door op donderdag 07/03 en dinsdag 12/03, telkens op 18h30 in auditorium A0 in gebouw S9 van de campus Sterre.
Een gratis cursus tijdens de les ? Stuur een mailtje naar lessen@zeus.rug.ac.be.
_Noot van de archivaris: de aanmaakdatum van dit evenement is een schatting._

View file

@ -1,9 +0,0 @@
---
title: ZEUS WPI zoekt nieuwe leden
created_at: 01-10-2001
---
Ben je een nieuwe student, heb je interesse in de informatica? Word dan [lid](http://web.archive.org/web/20011127170659/http://www.zeus.rug.ac.be:80/newlid.shtml) van Zeus.
_Noot van de archivaris: de datum van deze blogpost is een schatting._

View file

@ -1,9 +0,0 @@
---
title: Zeus geeft linuxles.
created_at: 27-11-2001
---
Op dinsdag 20/11 en 27/11 geven we terug Linuxles. Meer info op de [lessen](http://web.archive.org/web/20020802193359/http://www.zeus.rug.ac.be:80/pub.shtml)pagina.
_Noot van de archivaris: de datum van deze blogpost is een schatting._

View file

@ -1,9 +0,0 @@
---
title: ZEUS WPI geeft PHP lessen
created_at: 13-03-2001
---
Op 15,18,22 en 25 april geeft ZeusWPI een lessenreeks over PHP.
_Noot van de archivaris: de datum van deze blogpost en zijn updates is een schatting._

View file

@ -1,8 +0,0 @@
---
title: Onze lang verwachte C-lessen
created_at: 10-02-2003
---
Vanaf woensdag 19/2 begint Geert Vernaeve aan zijn legendarische C-cursus. 4 inleidingslessen leiden je in in de wondere wereld van programmeren in C. Heb je altijd al willen helpen aan een van die Open Source (sorry.. Vrije) projecten, of wil je verder kijken dan je java-neus lang is, schrijf je dan in op lessen at zeus.ugent.be . Als je een gedrukte cursus wenst (meer info [hier](http://web.archive.org/web/20030321012833/http://www.zeus.rug.ac.be:80/c.shtml)), vergeet dat ook niet te vermelden in je mailtje.
_Noot van de archivaris: de datum van deze blogpost is een schatting._

View file

@ -1,24 +0,0 @@
---
title: Externe bereikbaarheid
created_at: 08-07-2003
author: Olivier Verhoogen
---
Hallo!
Zoals sommigen onder jullie wel al gehoord, gemerkt en/of op
bovennatuurlijke wijze aangevoeld hebben is Zeus vanaf heden ook van
buiten (R)UGnet bereikbaar. We gaan bovendien tijdens de zomermaanden
(hoezo 2e zit?) serieus aan onze setup sleutelen zodat we het komende
academiejaar kunnen starten zoals het een werkgroep informatica betaamt.
Het is uit veiligheidsoverwegingen voorlopig wel niet mogelijk nieuwe
connecties van op een zeus-machine naar buiten te starten.
Het zal nog even wachten zijn op koele dingen als CVS respositories, MySQL
databases en dergelijke meer. Het is ondertussen wel weer mogelijk om op
de conventionele manier PHP te gebruiken.
Enjoy!
Het admin team,
Het bestuur.

View file

@ -1,9 +0,0 @@
---
title: FreeBSD cvsup mirror
created_at: 02-02-2003
author: Kenneth
---
Op hermes.rug.ac.be is nu tevens een cvsup mirror te vinden van FreeBSD. Mensen die FreeBSD gebruiken kunnen hun sources dus syncen via hermes.rug.ac.be; via ftp zijn tevens de packages te vinden. Je kunt die dus beter via hermes downloaden ipv de mastersites nog extra te belasten.
_Noot van de archivaris: de datum van deze blogpost is een schatting._

View file

@ -1,8 +0,0 @@
---
title: Nieuw hardwareproject
created_at: 23-11-2002
---
Een netwerkje van oude computers ineenknutselen.
_Noot van de archivaris: de datum van deze blogpost is een schatting._

View file

@ -1,9 +0,0 @@
---
title: Kernel-les
created_at: 15-03-2003
---
Download [hier](http://web.archive.org/web/20030528113017/http://www.zeus.rug.ac.be:80/kernel_introductie.pdf) de les over de linux-kernel, gegeven door Bart De Schuymer.
Meer info op zijn [project-page](http://web.archive.org/web/20030801141805/http://zeus.rug.ac.be/~bdschuym/) (RUGnet intern).
_Noot van de archivaris: de datum van deze blogpost is een schatting._

View file

@ -1,8 +0,0 @@
---
title: Listserver
created_at: 22-11-2002
---
Ja die werkt terug!
_Noot van de archivaris: de datum van deze blogpost is een schatting._

View file

@ -1,9 +0,0 @@
---
title: Interessante mailinglists
created_at: 20-03-2003
---
Onlangs werden bij Zeus twee nieuwe mailinglists opgericht, nl. help@zeus.rug.ac.be en announce@zeus.rug.ac.be. Hoe u kan inschrijven leest u [hier](http://web.archive.org/web/20030502094002/http://www.zeus.rug.ac.be/mailinglists.shtml).
_Noot van de archivaris: de datum van deze blogpost is een schatting._

View file

@ -1,8 +0,0 @@
---
title: Zeus Mirror
created_at: 21-11-2002
---
Onze mirror is nu ook bereikbaar via rsync.
_Noot van de archivaris: de datum van deze blogpost is een schatting._

View file

@ -1,8 +0,0 @@
---
title: O'reilly reviews
created_at: 24-11-2002
---
O'reilly heeft ons een tijdje terug 4 boeken opgestuurd om te [reviewen](http://web.archive.org/web/20021124131950/http://www.zeus.rug.ac.be:80/reviews/). Dit is nu gebeurd. Bedankt aan O'reilly en de reviewers.
_Noot van de archivaris: de datum van deze blogpost is een schatting._

View file

@ -1,8 +0,0 @@
---
title: Zeus Projecten Pagina
created_at: 20-11-2002
---
De zeus projecten pagina is geactualiseerd naar 2002-2003, zie [Projecten](http://web.archive.org/web/20021207222624/http://www.zeus.rug.ac.be/projects.shtml).
_Noot van de archivaris: de datum van deze blogpost is een schatting._

View file

@ -1,8 +0,0 @@
---
title: Overleven op RUGnet
created_at: 30-09-2002
---
"Overleven op RUGnet" is nu ook [on-line](http://web.archive.org/web/20021004042945/http://www.zeus.rug.ac.be/overleven/) te raadplegen!
_Noot van de archivaris: de datum van deze blogpost is een schatting._

View file

@ -1,10 +0,0 @@
---
title: Zeus en voyeurisme
created_at: 17-03-2003
---
Is er momenteel iemand in de Zeuskelder? Ga ik er niet voor een gesloten deur staan? Zit je ook soms met die prangende vragen, vooraleer je naar de kelder komt, dan bestaat daar nu een handige oplossing voor. Er hangt nl. een webcam in de kelder, die om de paar seconden een beeldje doorstuurt, waarop je kan ziet wat er bij Zeus momenteel aan de hand is. De beelden kan je bekijken op [NaN's homepagina](http://www.zeus.rug.ac.be/~kris/zeus.jpg) (RUGnet intern).
En aan iedereen die van plan is de Zeuskelder leeg te komen halen: We're watching you!
_Noot van de archivaris: de datum van deze blogpost is een schatting._

View file

@ -1,8 +0,0 @@
---
title: Generieke gelukwensen
created_at: 24-12-2003
author: Olivier Verhoogen
---
Ik zou namens het bestuur en de admin alle leden (en de toevallige meekijkers ook wel) een vrolijk kerstfeest en een gelukkig nieuwjaar willen toewensen. Of vertaald naar de minder gelukkigen onder ons: een voorspoedige blok en een geslaagde eerste examenperiode!

View file

@ -1,9 +0,0 @@
---
title: LaTeX-lessen
created_at: 15-10-2003
author: Kenneth
---
Op maandag 27 oktober en maandag 3 november om 18u, geeft Gaspard 2 lessen over LaTeX. Dus als je meer wil weten over deze professionele typesetting-language, kom dan zeker af naar auditorium A0, S9, Campus De Sterre. Stuur vooraf wel even een mailtje naar lessen@zeus.UGent.be, met de vermelding of je een gedrukte cursus wil. Tot dan.
Update: De nieuwe cursus staat nu ook online. Je kan hem vinden onder publicaties.

View file

@ -1,9 +0,0 @@
---
title: PHP lessen
created_at: 01-04-2004
author: Rudy Gevaert
---
Zeus geeft nog es les.
De vier eerste maandagen na de paasvakantie, dat zijn 19 en 26 april en 3 en 10 mei, geeft Simkin 4 PHP-lessen, telkens om 18.00u. Wil je komen stuur dan een mailtje naar lessen @ zeus . ugent . be.

View file

@ -1,9 +0,0 @@
---
title: Les, les en nog eens les
created_at: 07-03-2004
author: Kenneth
---
Op 18 maart om 19.00 geeft Mattias Campe een introductie tot het IM-protocol **Jabber**.
In samenwerking met de Werkgroep Vrije Software van het VTK gaat er nog een les door over **Mandrake** op 22 maart, een **GNU/Linux**-introductieles op 25 maart, en een **LaTeX**-les op 22 april.
De vier eerste maandagen na de paasvakantie tenslotte, dat zijn 19 en 26 april en 3 en 10 mei, geeft Simkin 4 **PHP**-lessen, telkens om 18.00u.

View file

@ -1,11 +0,0 @@
---
title: Gent OntgroenD
created_at: 08-10-2003
author: Olivier Verhoogen
---
Op dit eigenste moment gaat er in zaal Kunstzicht in resto Overpoort een mega verenigingenshowofftoestand door. Natuurlijk is ook Zeus WPI vertegenwoordigd! Voor die arme mensen die hier al de fun moeten missen hebben we rap een webcampaginaatje in elkaar gefoefeld.
In zoverre Lieven zijn macje het niet nog eens begeeft kan je live meevolgen op ons [kassa IP](http://overes15.ugent.be/). NaN heeft ook een paar snapshots genomen met de digicam van zijn nonkel. Die zijn te bezichtigen op zijn (nieuwe) [site](http://web.archive.org/web/20031128075228/http://www.zeus.ugent.be/~kris/gallery/view_album.php?set_albumName=gentontgroend&page=1).
UPDATE (1650CEST): Het vat is af... dus we zijn voort.

View file

@ -1,25 +0,0 @@
---
title: Zeus T-shirts!
created_at: 01-09-2003
author: Olivier Verhoogen
---
Weledelgeboren leden van de Werkgroep Publieke Informatica,
Na veel (en af en toe ook wel wat minder) geduld staat het er eindelijk
toch van te komen: er worden opnieuw Zeus T-Shirts gedrukt!
Origineel als we zijn kiezen we voor een zwart shirt met langs voor een
klein Zeus logo en langs achter de reeds welbekende adminspotting tekst
(zo niet: zie www.adminspotting.org). De om en bij volledige gelijkenis
met de vorige editie shirts berust hierbij uiteraard geheel op toeval.
Zie je het wel zitten om je kleerkast aan te vullen met een (of meerdere)
shirts van je favoriete werkgroep? Schrijf dan snel per gewenst exemplaar
8 euro over op rekeningnummer 979-9937065-02. Vermeld in de mededeling
duidelijk je loginnaam, het gewenste aantal shirts alsook de gewenste
maten (M, L of XL).
Ik plaats de bestelling in de week van 22 september dus zie dat je
overschrijving uiterlijk tegen dan is voltrokken. Met een beetje geluk
krijg je dan je eigenste exempla(a)r(en) al op de eerste ledenvergadering.

View file

@ -1,10 +0,0 @@
---
title: Updates
created_at: 16-02-2004
author: Kenneth
---
Een nieuw semester, nieuwe gewoontes. De nieuwe openingstijden van de kelder vind je onder Kelderpermanenties.
Ook zijn er nieuwe versies beschikbaar van onze XHTML/CSS en LaTeX-lessen. Nog steeds te vinden onder Publicaties.

View file

@ -1,8 +0,0 @@
---
title: Webcam online
created_at: 30-10-2003
author: Kenneth
---
De webcam is terug online! Ons nerdzijn is hier te bewonderen. Het is de bedoeling de boel volledig streaming te maken als project.

Some files were not shown because too many files have changed in this diff Show more