summaryrefslogtreecommitdiff
path: root/blog
diff options
context:
space:
mode:
authorGravatar Chris Xiong <chirs241097@gmail.com> 2019-02-10 11:16:07 +0800
committerGravatar Chris Xiong <chirs241097@gmail.com> 2019-02-10 11:16:07 +0800
commit9d3c8c0e6e1a7ba43bf3dc19350d1dca68b657a3 (patch)
tree339de0698c13e1763d3361d70fb1266621025c91 /blog
downloadweb-9d3c8c0e6e1a7ba43bf3dc19350d1dca68b657a3.tar.xz
Initial commit.
Diffstat (limited to 'blog')
-rw-r--r--blog/.htaccess5
-rw-r--r--blog/aes-js.js802
-rw-r--r--blog/blogext.css65
-rw-r--r--blog/content/.htaccess2
-rw-r--r--blog/content/util/indexer.cpp48
-rw-r--r--blog/data/applefan.json526
-rw-r--r--blog/data/poll.js171
-rw-r--r--blog/decryptor.js84
-rw-r--r--blog/footnoter.js24
-rw-r--r--blog/list/.htaccess1
-rw-r--r--blog/list/0.html123
-rw-r--r--blog/list/1.html123
-rw-r--r--blog/list/2.html123
-rw-r--r--blog/list/3.html123
-rw-r--r--blog/list/4.html123
-rw-r--r--blog/list/5.html123
-rw-r--r--blog/list/6.html123
-rw-r--r--blog/list/7.html123
-rw-r--r--blog/list/8.html103
-rw-r--r--blog/list/acmicpc/0.html118
l---------blog/list/acmicpc/index.html1
-rw-r--r--blog/list/c++/0.html103
l---------blog/list/c++/index.html1
-rw-r--r--blog/list/computer-repairing/0.html103
l---------blog/list/computer-repairing/index.html1
-rw-r--r--blog/list/contest/0.html113
l---------blog/list/contest/index.html1
-rw-r--r--blog/list/daily-life/0.html123
-rw-r--r--blog/list/daily-life/1.html103
l---------blog/list/daily-life/index.html1
-rw-r--r--blog/list/design/0.html103
l---------blog/list/design/index.html1
-rw-r--r--blog/list/devel/0.html123
-rw-r--r--blog/list/devel/1.html123
l---------blog/list/devel/index.html1
-rw-r--r--blog/list/device-review/0.html123
l---------blog/list/device-review/index.html1
-rw-r--r--blog/list/garbage/0.html123
-rw-r--r--blog/list/garbage/1.html123
-rw-r--r--blog/list/garbage/2.html123
-rw-r--r--blog/list/garbage/3.html108
l---------blog/list/garbage/index.html1
-rw-r--r--blog/list/hands-on/0.html108
l---------blog/list/hands-on/index.html1
l---------blog/list/index.html1
-rw-r--r--blog/list/interactive/0.html103
l---------blog/list/interactive/index.html1
-rw-r--r--blog/list/js/0.html108
l---------blog/list/js/index.html1
-rw-r--r--blog/list/linux/0.html103
l---------blog/list/linux/index.html1
-rw-r--r--blog/list/midi/0.html103
l---------blog/list/midi/index.html1
-rw-r--r--blog/list/music/0.html103
l---------blog/list/music/index.html1
-rw-r--r--blog/list/opengl/0.html103
l---------blog/list/opengl/index.html1
-rw-r--r--blog/list/qmidiplayer/0.html123
l---------blog/list/qmidiplayer/index.html1
-rw-r--r--blog/list/qt/0.html103
l---------blog/list/qt/index.html1
-rw-r--r--blog/list/random-xp/0.html113
l---------blog/list/random-xp/index.html1
-rw-r--r--blog/list/sophistry/0.html123
-rw-r--r--blog/list/sophistry/1.html103
l---------blog/list/sophistry/index.html1
-rw-r--r--blog/list/web/0.html113
l---------blog/list/web/index.html1
-rw-r--r--blog/list/webgl/0.html103
l---------blog/list/webgl/index.html1
-rw-r--r--blog/post/.htaccess1
-rw-r--r--blog/post/2015-10-29.html130
-rw-r--r--blog/post/2015-10-30.html198
-rw-r--r--blog/post/2015-10-31.html172
-rw-r--r--blog/post/2015-11-01.html165
-rw-r--r--blog/post/2015-11-22.html176
-rw-r--r--blog/post/2015-12-20.html136
-rw-r--r--blog/post/2015-12-23.html127
-rw-r--r--blog/post/2015-12-27.html127
-rw-r--r--blog/post/2016-01-03.html147
-rw-r--r--blog/post/2016-01-16.html139
-rw-r--r--blog/post/2016-01-25.html194
-rw-r--r--blog/post/2016-02-14.html126
-rw-r--r--blog/post/2016-02-18.html143
-rw-r--r--blog/post/2016-03-26.html151
-rw-r--r--blog/post/2016-04-09.html186
-rw-r--r--blog/post/2016-05-12.html406
-rw-r--r--blog/post/2016-06-21.html703
-rw-r--r--blog/post/2016-09-24.html230
-rw-r--r--blog/post/2017-01-09.html243
-rw-r--r--blog/post/2017-01-18.html509
-rw-r--r--blog/post/2017-02-13.html649
-rw-r--r--blog/post/2017-04-11.html161
-rw-r--r--blog/post/2017-05-08.html407
-rw-r--r--blog/post/2017-06-09.html254
-rw-r--r--blog/post/2017-06-29.html698
-rw-r--r--blog/post/2017-11-25.html208
-rw-r--r--blog/post/2017-12-21.html995
-rw-r--r--blog/post/2018-01-05.html184
-rw-r--r--blog/post/2018-01-07.html444
-rw-r--r--blog/post/2018-02-05.html265
-rw-r--r--blog/post/2018-03-17.html172
-rw-r--r--blog/post/2018-04-17.html214
-rw-r--r--blog/post/2018-04-22.html188
-rw-r--r--blog/post/2018-05-03.html184
-rw-r--r--blog/post/2018-05-08.html331
-rw-r--r--blog/post/2018-05-18.html337
-rw-r--r--blog/post/2018-06-05.html216
-rw-r--r--blog/post/2018-06-07.html260
-rw-r--r--blog/post/2018-10-11.html134
-rw-r--r--blog/post/2018-12-06.html166
-rw-r--r--blog/post/TOP.html253
-rw-r--r--blog/sbs_1/bloglist.php77
-rw-r--r--blog/sbs_1/bloglista.php202
-rw-r--r--blog/sbs_1/blogreader.php90
-rw-r--r--blog/sbs_1/blossom.pngbin0 -> 140486 bytes
-rw-r--r--blog/sbs_1/dbloglist.php75
-rw-r--r--blog/sbs_1/dblogreader.php90
-rw-r--r--blog/sbs_1/decryptor.js73
-rw-r--r--blog/sbs_1/extras.css50
-rw-r--r--blog/sbs_1/footnoter.js24
-rw-r--r--blog/sbs_1/simple_html_dom.php975
-rw-r--r--blog/sbs_2/blogext.css65
-rw-r--r--blog/sbs_2/bloglist.js216
-rw-r--r--blog/sbs_2/blogpost.js103
-rw-r--r--blog/sbs_2/cgi-bin/.htaccess3
l---------blog/sbs_2/cgi-bin/get-archive-list.cgi1
l---------blog/sbs_2/cgi-bin/get-post-content.cgi1
-rw-r--r--blog/sbs_2/cgi-src/cgiutils.hpp245
-rwxr-xr-xblog/sbs_2/cgi-src/get-archive-listbin0 -> 515680 bytes
-rw-r--r--blog/sbs_2/cgi-src/get-archive-list.cpp200
-rwxr-xr-xblog/sbs_2/cgi-src/get-post-contentbin0 -> 39024 bytes
-rw-r--r--blog/sbs_2/cgi-src/get-post-content.cpp83
-rw-r--r--blog/sbs_2/decryptor.js73
-rw-r--r--blog/sbs_2/footnoter.js24
-rw-r--r--blog/sbs_2/index.html1
-rw-r--r--blog/sbs_2/list94
-rw-r--r--blog/sbs_2/post108
-rw-r--r--blog/scrypt.js452
-rw-r--r--blog/sha256.js172
140 files changed, 20588 insertions, 0 deletions
diff --git a/blog/.htaccess b/blog/.htaccess
new file mode 100644
index 0000000..704db67
--- /dev/null
+++ b/blog/.htaccess
@@ -0,0 +1,5 @@
+#RewriteRule ^/?list/(.*)$ ./list [PT]
+#RewriteRule ^/?post/(.*)$ ./post [PT]
+Options -Indexes
+RedirectMatch "^/blog(/*)$" "/blog/list"
+RedirectMatch "^/blog/post(/*)$" "/blog/list"
diff --git a/blog/aes-js.js b/blog/aes-js.js
new file mode 100644
index 0000000..ec49bc5
--- /dev/null
+++ b/blog/aes-js.js
@@ -0,0 +1,802 @@
+(function(root) {
+ "use strict";
+
+ function checkInt(value) {
+ return (parseInt(value) === value);
+ }
+
+ function checkInts(arrayish) {
+ if (!checkInt(arrayish.length)) { return false; }
+
+ for (var i = 0; i < arrayish.length; i++) {
+ if (!checkInt(arrayish[i]) || arrayish[i] < 0 || arrayish[i] > 255) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ function coerceArray(arg, copy) {
+
+ // ArrayBuffer view
+ if (arg.buffer && ArrayBuffer.isView(arg) && arg.name === 'Uint8Array') {
+
+ if (copy) {
+ if (arg.slice) {
+ arg = arg.slice();
+ } else {
+ arg = Array.prototype.slice.call(arg);
+ }
+ }
+
+ return arg;
+ }
+
+ // It's an array; check it is a valid representation of a byte
+ if (Array.isArray(arg)) {
+ if (!checkInts(arg)) {
+ throw new Error('Array contains invalid value: ' + arg);
+ }
+
+ return new Uint8Array(arg);
+ }
+
+ // Something else, but behaves like an array (maybe a Buffer? Arguments?)
+ if (checkInt(arg.length) && checkInts(arg)) {
+ return new Uint8Array(arg);
+ }
+
+ throw new Error('unsupported array-like object');
+ }
+
+ function createArray(length) {
+ return new Uint8Array(length);
+ }
+
+ function copyArray(sourceArray, targetArray, targetStart, sourceStart, sourceEnd) {
+ if (sourceStart != null || sourceEnd != null) {
+ if (sourceArray.slice) {
+ sourceArray = sourceArray.slice(sourceStart, sourceEnd);
+ } else {
+ sourceArray = Array.prototype.slice.call(sourceArray, sourceStart, sourceEnd);
+ }
+ }
+ targetArray.set(sourceArray, targetStart);
+ }
+
+
+
+ var convertUtf8 = (function() {
+ function toBytes(text) {
+ var result = [], i = 0;
+ text = encodeURI(text);
+ while (i < text.length) {
+ var c = text.charCodeAt(i++);
+
+ // if it is a % sign, encode the following 2 bytes as a hex value
+ if (c === 37) {
+ result.push(parseInt(text.substr(i, 2), 16))
+ i += 2;
+
+ // otherwise, just the actual byte
+ } else {
+ result.push(c)
+ }
+ }
+
+ return coerceArray(result);
+ }
+
+ function fromBytes(bytes) {
+ var result = [], i = 0;
+
+ while (i < bytes.length) {
+ var c = bytes[i];
+
+ if (c < 128) {
+ result.push(String.fromCharCode(c));
+ i++;
+ } else if (c > 191 && c < 224) {
+ result.push(String.fromCharCode(((c & 0x1f) << 6) | (bytes[i + 1] & 0x3f)));
+ i += 2;
+ } else {
+ result.push(String.fromCharCode(((c & 0x0f) << 12) | ((bytes[i + 1] & 0x3f) << 6) | (bytes[i + 2] & 0x3f)));
+ i += 3;
+ }
+ }
+
+ return result.join('');
+ }
+
+ return {
+ toBytes: toBytes,
+ fromBytes: fromBytes,
+ }
+ })();
+
+ var convertHex = (function() {
+ function toBytes(text) {
+ var result = [];
+ for (var i = 0; i < text.length; i += 2) {
+ result.push(parseInt(text.substr(i, 2), 16));
+ }
+
+ return result;
+ }
+
+ // http://ixti.net/development/javascript/2011/11/11/base64-encodedecode-of-utf8-in-browser-with-js.html
+ var Hex = '0123456789abcdef';
+
+ function fromBytes(bytes) {
+ var result = [];
+ for (var i = 0; i < bytes.length; i++) {
+ var v = bytes[i];
+ result.push(Hex[(v & 0xf0) >> 4] + Hex[v & 0x0f]);
+ }
+ return result.join('');
+ }
+
+ return {
+ toBytes: toBytes,
+ fromBytes: fromBytes,
+ }
+ })();
+
+
+ // Number of rounds by keysize
+ var numberOfRounds = {16: 10, 24: 12, 32: 14}
+
+ // Round constant words
+ var rcon = [0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91];
+
+ // S-box and Inverse S-box (S is for Substitution)
+ var S = [0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16];
+ var Si =[0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d];
+
+ // Transformations for encryption
+ var T1 = [0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d, 0xfff2f20d, 0xd66b6bbd, 0xde6f6fb1, 0x91c5c554, 0x60303050, 0x02010103, 0xce6767a9, 0x562b2b7d, 0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a, 0x8fcaca45, 0x1f82829d, 0x89c9c940, 0xfa7d7d87, 0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b, 0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea, 0x239c9cbf, 0x53a4a4f7, 0xe4727296, 0x9bc0c05b, 0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a, 0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f, 0x6834345c, 0x51a5a5f4, 0xd1e5e534, 0xf9f1f108, 0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f, 0x0804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e, 0x30181828, 0x379696a1, 0x0a05050f, 0x2f9a9ab5, 0x0e070709, 0x24121236, 0x1b80809b, 0xdfe2e23d, 0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f, 0x1209091b, 0x1d83839e, 0x582c2c74, 0x341a1a2e, 0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb, 0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce, 0x5229297b, 0xdde3e33e, 0x5e2f2f71, 0x13848497, 0xa65353f5, 0xb9d1d168, 0x00000000, 0xc1eded2c, 0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed, 0xd46a6abe, 0x8dcbcb46, 0x67bebed9, 0x7239394b, 0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a, 0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16, 0x864343c5, 0x9a4d4dd7, 0x66333355, 0x11858594, 0x8a4545cf, 0xe9f9f910, 0x04020206, 0xfe7f7f81, 0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3, 0xa25151f3, 0x5da3a3fe, 0x804040c0, 0x058f8f8a, 0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504, 0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163, 0x20101030, 0xe5ffff1a, 0xfdf3f30e, 0xbfd2d26d, 0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f, 0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739, 0x93c4c457, 0x55a7a7f2, 0xfc7e7e82, 0x7a3d3d47, 0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395, 0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f, 0x44222266, 0x542a2a7e, 0x3b9090ab, 0x0b888883, 0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c, 0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76, 0xdbe0e03b, 0x64323256, 0x743a3a4e, 0x140a0a1e, 0x924949db, 0x0c06060a, 0x4824246c, 0xb85c5ce4, 0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6, 0x399191a8, 0x319595a4, 0xd3e4e437, 0xf279798b, 0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7, 0x018d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0, 0xd86c6cb4, 0xac5656fa, 0xf3f4f407, 0xcfeaea25, 0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818, 0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72, 0x381c1c24, 0x57a6a6f1, 0x73b4b4c7, 0x97c6c651, 0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21, 0x964b4bdd, 0x61bdbddc, 0x0d8b8b86, 0x0f8a8a85, 0xe0707090, 0x7c3e3e42, 0x71b5b5c4, 0xcc6666aa, 0x904848d8, 0x06030305, 0xf7f6f601, 0x1c0e0e12, 0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0, 0x17868691, 0x99c1c158, 0x3a1d1d27, 0x279e9eb9, 0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133, 0xd26969bb, 0xa9d9d970, 0x078e8e89, 0x339494a7, 0x2d9b9bb6, 0x3c1e1e22, 0x15878792, 0xc9e9e920, 0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a, 0x038c8c8f, 0x59a1a1f8, 0x09898980, 0x1a0d0d17, 0x65bfbfda, 0xd7e6e631, 0x844242c6, 0xd06868b8, 0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11, 0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a];
+ var T2 = [0xa5c66363, 0x84f87c7c, 0x99ee7777, 0x8df67b7b, 0x0dfff2f2, 0xbdd66b6b, 0xb1de6f6f, 0x5491c5c5, 0x50603030, 0x03020101, 0xa9ce6767, 0x7d562b2b, 0x19e7fefe, 0x62b5d7d7, 0xe64dabab, 0x9aec7676, 0x458fcaca, 0x9d1f8282, 0x4089c9c9, 0x87fa7d7d, 0x15effafa, 0xebb25959, 0xc98e4747, 0x0bfbf0f0, 0xec41adad, 0x67b3d4d4, 0xfd5fa2a2, 0xea45afaf, 0xbf239c9c, 0xf753a4a4, 0x96e47272, 0x5b9bc0c0, 0xc275b7b7, 0x1ce1fdfd, 0xae3d9393, 0x6a4c2626, 0x5a6c3636, 0x417e3f3f, 0x02f5f7f7, 0x4f83cccc, 0x5c683434, 0xf451a5a5, 0x34d1e5e5, 0x08f9f1f1, 0x93e27171, 0x73abd8d8, 0x53623131, 0x3f2a1515, 0x0c080404, 0x5295c7c7, 0x65462323, 0x5e9dc3c3, 0x28301818, 0xa1379696, 0x0f0a0505, 0xb52f9a9a, 0x090e0707, 0x36241212, 0x9b1b8080, 0x3ddfe2e2, 0x26cdebeb, 0x694e2727, 0xcd7fb2b2, 0x9fea7575, 0x1b120909, 0x9e1d8383, 0x74582c2c, 0x2e341a1a, 0x2d361b1b, 0xb2dc6e6e, 0xeeb45a5a, 0xfb5ba0a0, 0xf6a45252, 0x4d763b3b, 0x61b7d6d6, 0xce7db3b3, 0x7b522929, 0x3edde3e3, 0x715e2f2f, 0x97138484, 0xf5a65353, 0x68b9d1d1, 0x00000000, 0x2cc1eded, 0x60402020, 0x1fe3fcfc, 0xc879b1b1, 0xedb65b5b, 0xbed46a6a, 0x468dcbcb, 0xd967bebe, 0x4b723939, 0xde944a4a, 0xd4984c4c, 0xe8b05858, 0x4a85cfcf, 0x6bbbd0d0, 0x2ac5efef, 0xe54faaaa, 0x16edfbfb, 0xc5864343, 0xd79a4d4d, 0x55663333, 0x94118585, 0xcf8a4545, 0x10e9f9f9, 0x06040202, 0x81fe7f7f, 0xf0a05050, 0x44783c3c, 0xba259f9f, 0xe34ba8a8, 0xf3a25151, 0xfe5da3a3, 0xc0804040, 0x8a058f8f, 0xad3f9292, 0xbc219d9d, 0x48703838, 0x04f1f5f5, 0xdf63bcbc, 0xc177b6b6, 0x75afdada, 0x63422121, 0x30201010, 0x1ae5ffff, 0x0efdf3f3, 0x6dbfd2d2, 0x4c81cdcd, 0x14180c0c, 0x35261313, 0x2fc3ecec, 0xe1be5f5f, 0xa2359797, 0xcc884444, 0x392e1717, 0x5793c4c4, 0xf255a7a7, 0x82fc7e7e, 0x477a3d3d, 0xacc86464, 0xe7ba5d5d, 0x2b321919, 0x95e67373, 0xa0c06060, 0x98198181, 0xd19e4f4f, 0x7fa3dcdc, 0x66442222, 0x7e542a2a, 0xab3b9090, 0x830b8888, 0xca8c4646, 0x29c7eeee, 0xd36bb8b8, 0x3c281414, 0x79a7dede, 0xe2bc5e5e, 0x1d160b0b, 0x76addbdb, 0x3bdbe0e0, 0x56643232, 0x4e743a3a, 0x1e140a0a, 0xdb924949, 0x0a0c0606, 0x6c482424, 0xe4b85c5c, 0x5d9fc2c2, 0x6ebdd3d3, 0xef43acac, 0xa6c46262, 0xa8399191, 0xa4319595, 0x37d3e4e4, 0x8bf27979, 0x32d5e7e7, 0x438bc8c8, 0x596e3737, 0xb7da6d6d, 0x8c018d8d, 0x64b1d5d5, 0xd29c4e4e, 0xe049a9a9, 0xb4d86c6c, 0xfaac5656, 0x07f3f4f4, 0x25cfeaea, 0xafca6565, 0x8ef47a7a, 0xe947aeae, 0x18100808, 0xd56fbaba, 0x88f07878, 0x6f4a2525, 0x725c2e2e, 0x24381c1c, 0xf157a6a6, 0xc773b4b4, 0x5197c6c6, 0x23cbe8e8, 0x7ca1dddd, 0x9ce87474, 0x213e1f1f, 0xdd964b4b, 0xdc61bdbd, 0x860d8b8b, 0x850f8a8a, 0x90e07070, 0x427c3e3e, 0xc471b5b5, 0xaacc6666, 0xd8904848, 0x05060303, 0x01f7f6f6, 0x121c0e0e, 0xa3c26161, 0x5f6a3535, 0xf9ae5757, 0xd069b9b9, 0x91178686, 0x5899c1c1, 0x273a1d1d, 0xb9279e9e, 0x38d9e1e1, 0x13ebf8f8, 0xb32b9898, 0x33221111, 0xbbd26969, 0x70a9d9d9, 0x89078e8e, 0xa7339494, 0xb62d9b9b, 0x223c1e1e, 0x92158787, 0x20c9e9e9, 0x4987cece, 0xffaa5555, 0x78502828, 0x7aa5dfdf, 0x8f038c8c, 0xf859a1a1, 0x80098989, 0x171a0d0d, 0xda65bfbf, 0x31d7e6e6, 0xc6844242, 0xb8d06868, 0xc3824141, 0xb0299999, 0x775a2d2d, 0x111e0f0f, 0xcb7bb0b0, 0xfca85454, 0xd66dbbbb, 0x3a2c1616];
+ var T3 = [0x63a5c663, 0x7c84f87c, 0x7799ee77, 0x7b8df67b, 0xf20dfff2, 0x6bbdd66b, 0x6fb1de6f, 0xc55491c5, 0x30506030, 0x01030201, 0x67a9ce67, 0x2b7d562b, 0xfe19e7fe, 0xd762b5d7, 0xabe64dab, 0x769aec76, 0xca458fca, 0x829d1f82, 0xc94089c9, 0x7d87fa7d, 0xfa15effa, 0x59ebb259, 0x47c98e47, 0xf00bfbf0, 0xadec41ad, 0xd467b3d4, 0xa2fd5fa2, 0xafea45af, 0x9cbf239c, 0xa4f753a4, 0x7296e472, 0xc05b9bc0, 0xb7c275b7, 0xfd1ce1fd, 0x93ae3d93, 0x266a4c26, 0x365a6c36, 0x3f417e3f, 0xf702f5f7, 0xcc4f83cc, 0x345c6834, 0xa5f451a5, 0xe534d1e5, 0xf108f9f1, 0x7193e271, 0xd873abd8, 0x31536231, 0x153f2a15, 0x040c0804, 0xc75295c7, 0x23654623, 0xc35e9dc3, 0x18283018, 0x96a13796, 0x050f0a05, 0x9ab52f9a, 0x07090e07, 0x12362412, 0x809b1b80, 0xe23ddfe2, 0xeb26cdeb, 0x27694e27, 0xb2cd7fb2, 0x759fea75, 0x091b1209, 0x839e1d83, 0x2c74582c, 0x1a2e341a, 0x1b2d361b, 0x6eb2dc6e, 0x5aeeb45a, 0xa0fb5ba0, 0x52f6a452, 0x3b4d763b, 0xd661b7d6, 0xb3ce7db3, 0x297b5229, 0xe33edde3, 0x2f715e2f, 0x84971384, 0x53f5a653, 0xd168b9d1, 0x00000000, 0xed2cc1ed, 0x20604020, 0xfc1fe3fc, 0xb1c879b1, 0x5bedb65b, 0x6abed46a, 0xcb468dcb, 0xbed967be, 0x394b7239, 0x4ade944a, 0x4cd4984c, 0x58e8b058, 0xcf4a85cf, 0xd06bbbd0, 0xef2ac5ef, 0xaae54faa, 0xfb16edfb, 0x43c58643, 0x4dd79a4d, 0x33556633, 0x85941185, 0x45cf8a45, 0xf910e9f9, 0x02060402, 0x7f81fe7f, 0x50f0a050, 0x3c44783c, 0x9fba259f, 0xa8e34ba8, 0x51f3a251, 0xa3fe5da3, 0x40c08040, 0x8f8a058f, 0x92ad3f92, 0x9dbc219d, 0x38487038, 0xf504f1f5, 0xbcdf63bc, 0xb6c177b6, 0xda75afda, 0x21634221, 0x10302010, 0xff1ae5ff, 0xf30efdf3, 0xd26dbfd2, 0xcd4c81cd, 0x0c14180c, 0x13352613, 0xec2fc3ec, 0x5fe1be5f, 0x97a23597, 0x44cc8844, 0x17392e17, 0xc45793c4, 0xa7f255a7, 0x7e82fc7e, 0x3d477a3d, 0x64acc864, 0x5de7ba5d, 0x192b3219, 0x7395e673, 0x60a0c060, 0x81981981, 0x4fd19e4f, 0xdc7fa3dc, 0x22664422, 0x2a7e542a, 0x90ab3b90, 0x88830b88, 0x46ca8c46, 0xee29c7ee, 0xb8d36bb8, 0x143c2814, 0xde79a7de, 0x5ee2bc5e, 0x0b1d160b, 0xdb76addb, 0xe03bdbe0, 0x32566432, 0x3a4e743a, 0x0a1e140a, 0x49db9249, 0x060a0c06, 0x246c4824, 0x5ce4b85c, 0xc25d9fc2, 0xd36ebdd3, 0xacef43ac, 0x62a6c462, 0x91a83991, 0x95a43195, 0xe437d3e4, 0x798bf279, 0xe732d5e7, 0xc8438bc8, 0x37596e37, 0x6db7da6d, 0x8d8c018d, 0xd564b1d5, 0x4ed29c4e, 0xa9e049a9, 0x6cb4d86c, 0x56faac56, 0xf407f3f4, 0xea25cfea, 0x65afca65, 0x7a8ef47a, 0xaee947ae, 0x08181008, 0xbad56fba, 0x7888f078, 0x256f4a25, 0x2e725c2e, 0x1c24381c, 0xa6f157a6, 0xb4c773b4, 0xc65197c6, 0xe823cbe8, 0xdd7ca1dd, 0x749ce874, 0x1f213e1f, 0x4bdd964b, 0xbddc61bd, 0x8b860d8b, 0x8a850f8a, 0x7090e070, 0x3e427c3e, 0xb5c471b5, 0x66aacc66, 0x48d89048, 0x03050603, 0xf601f7f6, 0x0e121c0e, 0x61a3c261, 0x355f6a35, 0x57f9ae57, 0xb9d069b9, 0x86911786, 0xc15899c1, 0x1d273a1d, 0x9eb9279e, 0xe138d9e1, 0xf813ebf8, 0x98b32b98, 0x11332211, 0x69bbd269, 0xd970a9d9, 0x8e89078e, 0x94a73394, 0x9bb62d9b, 0x1e223c1e, 0x87921587, 0xe920c9e9, 0xce4987ce, 0x55ffaa55, 0x28785028, 0xdf7aa5df, 0x8c8f038c, 0xa1f859a1, 0x89800989, 0x0d171a0d, 0xbfda65bf, 0xe631d7e6, 0x42c68442, 0x68b8d068, 0x41c38241, 0x99b02999, 0x2d775a2d, 0x0f111e0f, 0xb0cb7bb0, 0x54fca854, 0xbbd66dbb, 0x163a2c16];
+ var T4 = [0x6363a5c6, 0x7c7c84f8, 0x777799ee, 0x7b7b8df6, 0xf2f20dff, 0x6b6bbdd6, 0x6f6fb1de, 0xc5c55491, 0x30305060, 0x01010302, 0x6767a9ce, 0x2b2b7d56, 0xfefe19e7, 0xd7d762b5, 0xababe64d, 0x76769aec, 0xcaca458f, 0x82829d1f, 0xc9c94089, 0x7d7d87fa, 0xfafa15ef, 0x5959ebb2, 0x4747c98e, 0xf0f00bfb, 0xadadec41, 0xd4d467b3, 0xa2a2fd5f, 0xafafea45, 0x9c9cbf23, 0xa4a4f753, 0x727296e4, 0xc0c05b9b, 0xb7b7c275, 0xfdfd1ce1, 0x9393ae3d, 0x26266a4c, 0x36365a6c, 0x3f3f417e, 0xf7f702f5, 0xcccc4f83, 0x34345c68, 0xa5a5f451, 0xe5e534d1, 0xf1f108f9, 0x717193e2, 0xd8d873ab, 0x31315362, 0x15153f2a, 0x04040c08, 0xc7c75295, 0x23236546, 0xc3c35e9d, 0x18182830, 0x9696a137, 0x05050f0a, 0x9a9ab52f, 0x0707090e, 0x12123624, 0x80809b1b, 0xe2e23ddf, 0xebeb26cd, 0x2727694e, 0xb2b2cd7f, 0x75759fea, 0x09091b12, 0x83839e1d, 0x2c2c7458, 0x1a1a2e34, 0x1b1b2d36, 0x6e6eb2dc, 0x5a5aeeb4, 0xa0a0fb5b, 0x5252f6a4, 0x3b3b4d76, 0xd6d661b7, 0xb3b3ce7d, 0x29297b52, 0xe3e33edd, 0x2f2f715e, 0x84849713, 0x5353f5a6, 0xd1d168b9, 0x00000000, 0xeded2cc1, 0x20206040, 0xfcfc1fe3, 0xb1b1c879, 0x5b5bedb6, 0x6a6abed4, 0xcbcb468d, 0xbebed967, 0x39394b72, 0x4a4ade94, 0x4c4cd498, 0x5858e8b0, 0xcfcf4a85, 0xd0d06bbb, 0xefef2ac5, 0xaaaae54f, 0xfbfb16ed, 0x4343c586, 0x4d4dd79a, 0x33335566, 0x85859411, 0x4545cf8a, 0xf9f910e9, 0x02020604, 0x7f7f81fe, 0x5050f0a0, 0x3c3c4478, 0x9f9fba25, 0xa8a8e34b, 0x5151f3a2, 0xa3a3fe5d, 0x4040c080, 0x8f8f8a05, 0x9292ad3f, 0x9d9dbc21, 0x38384870, 0xf5f504f1, 0xbcbcdf63, 0xb6b6c177, 0xdada75af, 0x21216342, 0x10103020, 0xffff1ae5, 0xf3f30efd, 0xd2d26dbf, 0xcdcd4c81, 0x0c0c1418, 0x13133526, 0xecec2fc3, 0x5f5fe1be, 0x9797a235, 0x4444cc88, 0x1717392e, 0xc4c45793, 0xa7a7f255, 0x7e7e82fc, 0x3d3d477a, 0x6464acc8, 0x5d5de7ba, 0x19192b32, 0x737395e6, 0x6060a0c0, 0x81819819, 0x4f4fd19e, 0xdcdc7fa3, 0x22226644, 0x2a2a7e54, 0x9090ab3b, 0x8888830b, 0x4646ca8c, 0xeeee29c7, 0xb8b8d36b, 0x14143c28, 0xdede79a7, 0x5e5ee2bc, 0x0b0b1d16, 0xdbdb76ad, 0xe0e03bdb, 0x32325664, 0x3a3a4e74, 0x0a0a1e14, 0x4949db92, 0x06060a0c, 0x24246c48, 0x5c5ce4b8, 0xc2c25d9f, 0xd3d36ebd, 0xacacef43, 0x6262a6c4, 0x9191a839, 0x9595a431, 0xe4e437d3, 0x79798bf2, 0xe7e732d5, 0xc8c8438b, 0x3737596e, 0x6d6db7da, 0x8d8d8c01, 0xd5d564b1, 0x4e4ed29c, 0xa9a9e049, 0x6c6cb4d8, 0x5656faac, 0xf4f407f3, 0xeaea25cf, 0x6565afca, 0x7a7a8ef4, 0xaeaee947, 0x08081810, 0xbabad56f, 0x787888f0, 0x25256f4a, 0x2e2e725c, 0x1c1c2438, 0xa6a6f157, 0xb4b4c773, 0xc6c65197, 0xe8e823cb, 0xdddd7ca1, 0x74749ce8, 0x1f1f213e, 0x4b4bdd96, 0xbdbddc61, 0x8b8b860d, 0x8a8a850f, 0x707090e0, 0x3e3e427c, 0xb5b5c471, 0x6666aacc, 0x4848d890, 0x03030506, 0xf6f601f7, 0x0e0e121c, 0x6161a3c2, 0x35355f6a, 0x5757f9ae, 0xb9b9d069, 0x86869117, 0xc1c15899, 0x1d1d273a, 0x9e9eb927, 0xe1e138d9, 0xf8f813eb, 0x9898b32b, 0x11113322, 0x6969bbd2, 0xd9d970a9, 0x8e8e8907, 0x9494a733, 0x9b9bb62d, 0x1e1e223c, 0x87879215, 0xe9e920c9, 0xcece4987, 0x5555ffaa, 0x28287850, 0xdfdf7aa5, 0x8c8c8f03, 0xa1a1f859, 0x89898009, 0x0d0d171a, 0xbfbfda65, 0xe6e631d7, 0x4242c684, 0x6868b8d0, 0x4141c382, 0x9999b029, 0x2d2d775a, 0x0f0f111e, 0xb0b0cb7b, 0x5454fca8, 0xbbbbd66d, 0x16163a2c];
+
+ // Transformations for decryption
+ var T5 = [0x51f4a750, 0x7e416553, 0x1a17a4c3, 0x3a275e96, 0x3bab6bcb, 0x1f9d45f1, 0xacfa58ab, 0x4be30393, 0x2030fa55, 0xad766df6, 0x88cc7691, 0xf5024c25, 0x4fe5d7fc, 0xc52acbd7, 0x26354480, 0xb562a38f, 0xdeb15a49, 0x25ba1b67, 0x45ea0e98, 0x5dfec0e1, 0xc32f7502, 0x814cf012, 0x8d4697a3, 0x6bd3f9c6, 0x038f5fe7, 0x15929c95, 0xbf6d7aeb, 0x955259da, 0xd4be832d, 0x587421d3, 0x49e06929, 0x8ec9c844, 0x75c2896a, 0xf48e7978, 0x99583e6b, 0x27b971dd, 0xbee14fb6, 0xf088ad17, 0xc920ac66, 0x7dce3ab4, 0x63df4a18, 0xe51a3182, 0x97513360, 0x62537f45, 0xb16477e0, 0xbb6bae84, 0xfe81a01c, 0xf9082b94, 0x70486858, 0x8f45fd19, 0x94de6c87, 0x527bf8b7, 0xab73d323, 0x724b02e2, 0xe31f8f57, 0x6655ab2a, 0xb2eb2807, 0x2fb5c203, 0x86c57b9a, 0xd33708a5, 0x302887f2, 0x23bfa5b2, 0x02036aba, 0xed16825c, 0x8acf1c2b, 0xa779b492, 0xf307f2f0, 0x4e69e2a1, 0x65daf4cd, 0x0605bed5, 0xd134621f, 0xc4a6fe8a, 0x342e539d, 0xa2f355a0, 0x058ae132, 0xa4f6eb75, 0x0b83ec39, 0x4060efaa, 0x5e719f06, 0xbd6e1051, 0x3e218af9, 0x96dd063d, 0xdd3e05ae, 0x4de6bd46, 0x91548db5, 0x71c45d05, 0x0406d46f, 0x605015ff, 0x1998fb24, 0xd6bde997, 0x894043cc, 0x67d99e77, 0xb0e842bd, 0x07898b88, 0xe7195b38, 0x79c8eedb, 0xa17c0a47, 0x7c420fe9, 0xf8841ec9, 0x00000000, 0x09808683, 0x322bed48, 0x1e1170ac, 0x6c5a724e, 0xfd0efffb, 0x0f853856, 0x3daed51e, 0x362d3927, 0x0a0fd964, 0x685ca621, 0x9b5b54d1, 0x24362e3a, 0x0c0a67b1, 0x9357e70f, 0xb4ee96d2, 0x1b9b919e, 0x80c0c54f, 0x61dc20a2, 0x5a774b69, 0x1c121a16, 0xe293ba0a, 0xc0a02ae5, 0x3c22e043, 0x121b171d, 0x0e090d0b, 0xf28bc7ad, 0x2db6a8b9, 0x141ea9c8, 0x57f11985, 0xaf75074c, 0xee99ddbb, 0xa37f60fd, 0xf701269f, 0x5c72f5bc, 0x44663bc5, 0x5bfb7e34, 0x8b432976, 0xcb23c6dc, 0xb6edfc68, 0xb8e4f163, 0xd731dcca, 0x42638510, 0x13972240, 0x84c61120, 0x854a247d, 0xd2bb3df8, 0xaef93211, 0xc729a16d, 0x1d9e2f4b, 0xdcb230f3, 0x0d8652ec, 0x77c1e3d0, 0x2bb3166c, 0xa970b999, 0x119448fa, 0x47e96422, 0xa8fc8cc4, 0xa0f03f1a, 0x567d2cd8, 0x223390ef, 0x87494ec7, 0xd938d1c1, 0x8ccaa2fe, 0x98d40b36, 0xa6f581cf, 0xa57ade28, 0xdab78e26, 0x3fadbfa4, 0x2c3a9de4, 0x5078920d, 0x6a5fcc9b, 0x547e4662, 0xf68d13c2, 0x90d8b8e8, 0x2e39f75e, 0x82c3aff5, 0x9f5d80be, 0x69d0937c, 0x6fd52da9, 0xcf2512b3, 0xc8ac993b, 0x10187da7, 0xe89c636e, 0xdb3bbb7b, 0xcd267809, 0x6e5918f4, 0xec9ab701, 0x834f9aa8, 0xe6956e65, 0xaaffe67e, 0x21bccf08, 0xef15e8e6, 0xbae79bd9, 0x4a6f36ce, 0xea9f09d4, 0x29b07cd6, 0x31a4b2af, 0x2a3f2331, 0xc6a59430, 0x35a266c0, 0x744ebc37, 0xfc82caa6, 0xe090d0b0, 0x33a7d815, 0xf104984a, 0x41ecdaf7, 0x7fcd500e, 0x1791f62f, 0x764dd68d, 0x43efb04d, 0xccaa4d54, 0xe49604df, 0x9ed1b5e3, 0x4c6a881b, 0xc12c1fb8, 0x4665517f, 0x9d5eea04, 0x018c355d, 0xfa877473, 0xfb0b412e, 0xb3671d5a, 0x92dbd252, 0xe9105633, 0x6dd64713, 0x9ad7618c, 0x37a10c7a, 0x59f8148e, 0xeb133c89, 0xcea927ee, 0xb761c935, 0xe11ce5ed, 0x7a47b13c, 0x9cd2df59, 0x55f2733f, 0x1814ce79, 0x73c737bf, 0x53f7cdea, 0x5ffdaa5b, 0xdf3d6f14, 0x7844db86, 0xcaaff381, 0xb968c43e, 0x3824342c, 0xc2a3405f, 0x161dc372, 0xbce2250c, 0x283c498b, 0xff0d9541, 0x39a80171, 0x080cb3de, 0xd8b4e49c, 0x6456c190, 0x7bcb8461, 0xd532b670, 0x486c5c74, 0xd0b85742];
+ var T6 = [0x5051f4a7, 0x537e4165, 0xc31a17a4, 0x963a275e, 0xcb3bab6b, 0xf11f9d45, 0xabacfa58, 0x934be303, 0x552030fa, 0xf6ad766d, 0x9188cc76, 0x25f5024c, 0xfc4fe5d7, 0xd7c52acb, 0x80263544, 0x8fb562a3, 0x49deb15a, 0x6725ba1b, 0x9845ea0e, 0xe15dfec0, 0x02c32f75, 0x12814cf0, 0xa38d4697, 0xc66bd3f9, 0xe7038f5f, 0x9515929c, 0xebbf6d7a, 0xda955259, 0x2dd4be83, 0xd3587421, 0x2949e069, 0x448ec9c8, 0x6a75c289, 0x78f48e79, 0x6b99583e, 0xdd27b971, 0xb6bee14f, 0x17f088ad, 0x66c920ac, 0xb47dce3a, 0x1863df4a, 0x82e51a31, 0x60975133, 0x4562537f, 0xe0b16477, 0x84bb6bae, 0x1cfe81a0, 0x94f9082b, 0x58704868, 0x198f45fd, 0x8794de6c, 0xb7527bf8, 0x23ab73d3, 0xe2724b02, 0x57e31f8f, 0x2a6655ab, 0x07b2eb28, 0x032fb5c2, 0x9a86c57b, 0xa5d33708, 0xf2302887, 0xb223bfa5, 0xba02036a, 0x5ced1682, 0x2b8acf1c, 0x92a779b4, 0xf0f307f2, 0xa14e69e2, 0xcd65daf4, 0xd50605be, 0x1fd13462, 0x8ac4a6fe, 0x9d342e53, 0xa0a2f355, 0x32058ae1, 0x75a4f6eb, 0x390b83ec, 0xaa4060ef, 0x065e719f, 0x51bd6e10, 0xf93e218a, 0x3d96dd06, 0xaedd3e05, 0x464de6bd, 0xb591548d, 0x0571c45d, 0x6f0406d4, 0xff605015, 0x241998fb, 0x97d6bde9, 0xcc894043, 0x7767d99e, 0xbdb0e842, 0x8807898b, 0x38e7195b, 0xdb79c8ee, 0x47a17c0a, 0xe97c420f, 0xc9f8841e, 0x00000000, 0x83098086, 0x48322bed, 0xac1e1170, 0x4e6c5a72, 0xfbfd0eff, 0x560f8538, 0x1e3daed5, 0x27362d39, 0x640a0fd9, 0x21685ca6, 0xd19b5b54, 0x3a24362e, 0xb10c0a67, 0x0f9357e7, 0xd2b4ee96, 0x9e1b9b91, 0x4f80c0c5, 0xa261dc20, 0x695a774b, 0x161c121a, 0x0ae293ba, 0xe5c0a02a, 0x433c22e0, 0x1d121b17, 0x0b0e090d, 0xadf28bc7, 0xb92db6a8, 0xc8141ea9, 0x8557f119, 0x4caf7507, 0xbbee99dd, 0xfda37f60, 0x9ff70126, 0xbc5c72f5, 0xc544663b, 0x345bfb7e, 0x768b4329, 0xdccb23c6, 0x68b6edfc, 0x63b8e4f1, 0xcad731dc, 0x10426385, 0x40139722, 0x2084c611, 0x7d854a24, 0xf8d2bb3d, 0x11aef932, 0x6dc729a1, 0x4b1d9e2f, 0xf3dcb230, 0xec0d8652, 0xd077c1e3, 0x6c2bb316, 0x99a970b9, 0xfa119448, 0x2247e964, 0xc4a8fc8c, 0x1aa0f03f, 0xd8567d2c, 0xef223390, 0xc787494e, 0xc1d938d1, 0xfe8ccaa2, 0x3698d40b, 0xcfa6f581, 0x28a57ade, 0x26dab78e, 0xa43fadbf, 0xe42c3a9d, 0x0d507892, 0x9b6a5fcc, 0x62547e46, 0xc2f68d13, 0xe890d8b8, 0x5e2e39f7, 0xf582c3af, 0xbe9f5d80, 0x7c69d093, 0xa96fd52d, 0xb3cf2512, 0x3bc8ac99, 0xa710187d, 0x6ee89c63, 0x7bdb3bbb, 0x09cd2678, 0xf46e5918, 0x01ec9ab7, 0xa8834f9a, 0x65e6956e, 0x7eaaffe6, 0x0821bccf, 0xe6ef15e8, 0xd9bae79b, 0xce4a6f36, 0xd4ea9f09, 0xd629b07c, 0xaf31a4b2, 0x312a3f23, 0x30c6a594, 0xc035a266, 0x37744ebc, 0xa6fc82ca, 0xb0e090d0, 0x1533a7d8, 0x4af10498, 0xf741ecda, 0x0e7fcd50, 0x2f1791f6, 0x8d764dd6, 0x4d43efb0, 0x54ccaa4d, 0xdfe49604, 0xe39ed1b5, 0x1b4c6a88, 0xb8c12c1f, 0x7f466551, 0x049d5eea, 0x5d018c35, 0x73fa8774, 0x2efb0b41, 0x5ab3671d, 0x5292dbd2, 0x33e91056, 0x136dd647, 0x8c9ad761, 0x7a37a10c, 0x8e59f814, 0x89eb133c, 0xeecea927, 0x35b761c9, 0xede11ce5, 0x3c7a47b1, 0x599cd2df, 0x3f55f273, 0x791814ce, 0xbf73c737, 0xea53f7cd, 0x5b5ffdaa, 0x14df3d6f, 0x867844db, 0x81caaff3, 0x3eb968c4, 0x2c382434, 0x5fc2a340, 0x72161dc3, 0x0cbce225, 0x8b283c49, 0x41ff0d95, 0x7139a801, 0xde080cb3, 0x9cd8b4e4, 0x906456c1, 0x617bcb84, 0x70d532b6, 0x74486c5c, 0x42d0b857];
+ var T7 = [0xa75051f4, 0x65537e41, 0xa4c31a17, 0x5e963a27, 0x6bcb3bab, 0x45f11f9d, 0x58abacfa, 0x03934be3, 0xfa552030, 0x6df6ad76, 0x769188cc, 0x4c25f502, 0xd7fc4fe5, 0xcbd7c52a, 0x44802635, 0xa38fb562, 0x5a49deb1, 0x1b6725ba, 0x0e9845ea, 0xc0e15dfe, 0x7502c32f, 0xf012814c, 0x97a38d46, 0xf9c66bd3, 0x5fe7038f, 0x9c951592, 0x7aebbf6d, 0x59da9552, 0x832dd4be, 0x21d35874, 0x692949e0, 0xc8448ec9, 0x896a75c2, 0x7978f48e, 0x3e6b9958, 0x71dd27b9, 0x4fb6bee1, 0xad17f088, 0xac66c920, 0x3ab47dce, 0x4a1863df, 0x3182e51a, 0x33609751, 0x7f456253, 0x77e0b164, 0xae84bb6b, 0xa01cfe81, 0x2b94f908, 0x68587048, 0xfd198f45, 0x6c8794de, 0xf8b7527b, 0xd323ab73, 0x02e2724b, 0x8f57e31f, 0xab2a6655, 0x2807b2eb, 0xc2032fb5, 0x7b9a86c5, 0x08a5d337, 0x87f23028, 0xa5b223bf, 0x6aba0203, 0x825ced16, 0x1c2b8acf, 0xb492a779, 0xf2f0f307, 0xe2a14e69, 0xf4cd65da, 0xbed50605, 0x621fd134, 0xfe8ac4a6, 0x539d342e, 0x55a0a2f3, 0xe132058a, 0xeb75a4f6, 0xec390b83, 0xefaa4060, 0x9f065e71, 0x1051bd6e, 0x8af93e21, 0x063d96dd, 0x05aedd3e, 0xbd464de6, 0x8db59154, 0x5d0571c4, 0xd46f0406, 0x15ff6050, 0xfb241998, 0xe997d6bd, 0x43cc8940, 0x9e7767d9, 0x42bdb0e8, 0x8b880789, 0x5b38e719, 0xeedb79c8, 0x0a47a17c, 0x0fe97c42, 0x1ec9f884, 0x00000000, 0x86830980, 0xed48322b, 0x70ac1e11, 0x724e6c5a, 0xfffbfd0e, 0x38560f85, 0xd51e3dae, 0x3927362d, 0xd9640a0f, 0xa621685c, 0x54d19b5b, 0x2e3a2436, 0x67b10c0a, 0xe70f9357, 0x96d2b4ee, 0x919e1b9b, 0xc54f80c0, 0x20a261dc, 0x4b695a77, 0x1a161c12, 0xba0ae293, 0x2ae5c0a0, 0xe0433c22, 0x171d121b, 0x0d0b0e09, 0xc7adf28b, 0xa8b92db6, 0xa9c8141e, 0x198557f1, 0x074caf75, 0xddbbee99, 0x60fda37f, 0x269ff701, 0xf5bc5c72, 0x3bc54466, 0x7e345bfb, 0x29768b43, 0xc6dccb23, 0xfc68b6ed, 0xf163b8e4, 0xdccad731, 0x85104263, 0x22401397, 0x112084c6, 0x247d854a, 0x3df8d2bb, 0x3211aef9, 0xa16dc729, 0x2f4b1d9e, 0x30f3dcb2, 0x52ec0d86, 0xe3d077c1, 0x166c2bb3, 0xb999a970, 0x48fa1194, 0x642247e9, 0x8cc4a8fc, 0x3f1aa0f0, 0x2cd8567d, 0x90ef2233, 0x4ec78749, 0xd1c1d938, 0xa2fe8cca, 0x0b3698d4, 0x81cfa6f5, 0xde28a57a, 0x8e26dab7, 0xbfa43fad, 0x9de42c3a, 0x920d5078, 0xcc9b6a5f, 0x4662547e, 0x13c2f68d, 0xb8e890d8, 0xf75e2e39, 0xaff582c3, 0x80be9f5d, 0x937c69d0, 0x2da96fd5, 0x12b3cf25, 0x993bc8ac, 0x7da71018, 0x636ee89c, 0xbb7bdb3b, 0x7809cd26, 0x18f46e59, 0xb701ec9a, 0x9aa8834f, 0x6e65e695, 0xe67eaaff, 0xcf0821bc, 0xe8e6ef15, 0x9bd9bae7, 0x36ce4a6f, 0x09d4ea9f, 0x7cd629b0, 0xb2af31a4, 0x23312a3f, 0x9430c6a5, 0x66c035a2, 0xbc37744e, 0xcaa6fc82, 0xd0b0e090, 0xd81533a7, 0x984af104, 0xdaf741ec, 0x500e7fcd, 0xf62f1791, 0xd68d764d, 0xb04d43ef, 0x4d54ccaa, 0x04dfe496, 0xb5e39ed1, 0x881b4c6a, 0x1fb8c12c, 0x517f4665, 0xea049d5e, 0x355d018c, 0x7473fa87, 0x412efb0b, 0x1d5ab367, 0xd25292db, 0x5633e910, 0x47136dd6, 0x618c9ad7, 0x0c7a37a1, 0x148e59f8, 0x3c89eb13, 0x27eecea9, 0xc935b761, 0xe5ede11c, 0xb13c7a47, 0xdf599cd2, 0x733f55f2, 0xce791814, 0x37bf73c7, 0xcdea53f7, 0xaa5b5ffd, 0x6f14df3d, 0xdb867844, 0xf381caaf, 0xc43eb968, 0x342c3824, 0x405fc2a3, 0xc372161d, 0x250cbce2, 0x498b283c, 0x9541ff0d, 0x017139a8, 0xb3de080c, 0xe49cd8b4, 0xc1906456, 0x84617bcb, 0xb670d532, 0x5c74486c, 0x5742d0b8];
+ var T8 = [0xf4a75051, 0x4165537e, 0x17a4c31a, 0x275e963a, 0xab6bcb3b, 0x9d45f11f, 0xfa58abac, 0xe303934b, 0x30fa5520, 0x766df6ad, 0xcc769188, 0x024c25f5, 0xe5d7fc4f, 0x2acbd7c5, 0x35448026, 0x62a38fb5, 0xb15a49de, 0xba1b6725, 0xea0e9845, 0xfec0e15d, 0x2f7502c3, 0x4cf01281, 0x4697a38d, 0xd3f9c66b, 0x8f5fe703, 0x929c9515, 0x6d7aebbf, 0x5259da95, 0xbe832dd4, 0x7421d358, 0xe0692949, 0xc9c8448e, 0xc2896a75, 0x8e7978f4, 0x583e6b99, 0xb971dd27, 0xe14fb6be, 0x88ad17f0, 0x20ac66c9, 0xce3ab47d, 0xdf4a1863, 0x1a3182e5, 0x51336097, 0x537f4562, 0x6477e0b1, 0x6bae84bb, 0x81a01cfe, 0x082b94f9, 0x48685870, 0x45fd198f, 0xde6c8794, 0x7bf8b752, 0x73d323ab, 0x4b02e272, 0x1f8f57e3, 0x55ab2a66, 0xeb2807b2, 0xb5c2032f, 0xc57b9a86, 0x3708a5d3, 0x2887f230, 0xbfa5b223, 0x036aba02, 0x16825ced, 0xcf1c2b8a, 0x79b492a7, 0x07f2f0f3, 0x69e2a14e, 0xdaf4cd65, 0x05bed506, 0x34621fd1, 0xa6fe8ac4, 0x2e539d34, 0xf355a0a2, 0x8ae13205, 0xf6eb75a4, 0x83ec390b, 0x60efaa40, 0x719f065e, 0x6e1051bd, 0x218af93e, 0xdd063d96, 0x3e05aedd, 0xe6bd464d, 0x548db591, 0xc45d0571, 0x06d46f04, 0x5015ff60, 0x98fb2419, 0xbde997d6, 0x4043cc89, 0xd99e7767, 0xe842bdb0, 0x898b8807, 0x195b38e7, 0xc8eedb79, 0x7c0a47a1, 0x420fe97c, 0x841ec9f8, 0x00000000, 0x80868309, 0x2bed4832, 0x1170ac1e, 0x5a724e6c, 0x0efffbfd, 0x8538560f, 0xaed51e3d, 0x2d392736, 0x0fd9640a, 0x5ca62168, 0x5b54d19b, 0x362e3a24, 0x0a67b10c, 0x57e70f93, 0xee96d2b4, 0x9b919e1b, 0xc0c54f80, 0xdc20a261, 0x774b695a, 0x121a161c, 0x93ba0ae2, 0xa02ae5c0, 0x22e0433c, 0x1b171d12, 0x090d0b0e, 0x8bc7adf2, 0xb6a8b92d, 0x1ea9c814, 0xf1198557, 0x75074caf, 0x99ddbbee, 0x7f60fda3, 0x01269ff7, 0x72f5bc5c, 0x663bc544, 0xfb7e345b, 0x4329768b, 0x23c6dccb, 0xedfc68b6, 0xe4f163b8, 0x31dccad7, 0x63851042, 0x97224013, 0xc6112084, 0x4a247d85, 0xbb3df8d2, 0xf93211ae, 0x29a16dc7, 0x9e2f4b1d, 0xb230f3dc, 0x8652ec0d, 0xc1e3d077, 0xb3166c2b, 0x70b999a9, 0x9448fa11, 0xe9642247, 0xfc8cc4a8, 0xf03f1aa0, 0x7d2cd856, 0x3390ef22, 0x494ec787, 0x38d1c1d9, 0xcaa2fe8c, 0xd40b3698, 0xf581cfa6, 0x7ade28a5, 0xb78e26da, 0xadbfa43f, 0x3a9de42c, 0x78920d50, 0x5fcc9b6a, 0x7e466254, 0x8d13c2f6, 0xd8b8e890, 0x39f75e2e, 0xc3aff582, 0x5d80be9f, 0xd0937c69, 0xd52da96f, 0x2512b3cf, 0xac993bc8, 0x187da710, 0x9c636ee8, 0x3bbb7bdb, 0x267809cd, 0x5918f46e, 0x9ab701ec, 0x4f9aa883, 0x956e65e6, 0xffe67eaa, 0xbccf0821, 0x15e8e6ef, 0xe79bd9ba, 0x6f36ce4a, 0x9f09d4ea, 0xb07cd629, 0xa4b2af31, 0x3f23312a, 0xa59430c6, 0xa266c035, 0x4ebc3774, 0x82caa6fc, 0x90d0b0e0, 0xa7d81533, 0x04984af1, 0xecdaf741, 0xcd500e7f, 0x91f62f17, 0x4dd68d76, 0xefb04d43, 0xaa4d54cc, 0x9604dfe4, 0xd1b5e39e, 0x6a881b4c, 0x2c1fb8c1, 0x65517f46, 0x5eea049d, 0x8c355d01, 0x877473fa, 0x0b412efb, 0x671d5ab3, 0xdbd25292, 0x105633e9, 0xd647136d, 0xd7618c9a, 0xa10c7a37, 0xf8148e59, 0x133c89eb, 0xa927eece, 0x61c935b7, 0x1ce5ede1, 0x47b13c7a, 0xd2df599c, 0xf2733f55, 0x14ce7918, 0xc737bf73, 0xf7cdea53, 0xfdaa5b5f, 0x3d6f14df, 0x44db8678, 0xaff381ca, 0x68c43eb9, 0x24342c38, 0xa3405fc2, 0x1dc37216, 0xe2250cbc, 0x3c498b28, 0x0d9541ff, 0xa8017139, 0x0cb3de08, 0xb4e49cd8, 0x56c19064, 0xcb84617b, 0x32b670d5, 0x6c5c7448, 0xb85742d0];
+
+ // Transformations for decryption key expansion
+ var U1 = [0x00000000, 0x0e090d0b, 0x1c121a16, 0x121b171d, 0x3824342c, 0x362d3927, 0x24362e3a, 0x2a3f2331, 0x70486858, 0x7e416553, 0x6c5a724e, 0x62537f45, 0x486c5c74, 0x4665517f, 0x547e4662, 0x5a774b69, 0xe090d0b0, 0xee99ddbb, 0xfc82caa6, 0xf28bc7ad, 0xd8b4e49c, 0xd6bde997, 0xc4a6fe8a, 0xcaaff381, 0x90d8b8e8, 0x9ed1b5e3, 0x8ccaa2fe, 0x82c3aff5, 0xa8fc8cc4, 0xa6f581cf, 0xb4ee96d2, 0xbae79bd9, 0xdb3bbb7b, 0xd532b670, 0xc729a16d, 0xc920ac66, 0xe31f8f57, 0xed16825c, 0xff0d9541, 0xf104984a, 0xab73d323, 0xa57ade28, 0xb761c935, 0xb968c43e, 0x9357e70f, 0x9d5eea04, 0x8f45fd19, 0x814cf012, 0x3bab6bcb, 0x35a266c0, 0x27b971dd, 0x29b07cd6, 0x038f5fe7, 0x0d8652ec, 0x1f9d45f1, 0x119448fa, 0x4be30393, 0x45ea0e98, 0x57f11985, 0x59f8148e, 0x73c737bf, 0x7dce3ab4, 0x6fd52da9, 0x61dc20a2, 0xad766df6, 0xa37f60fd, 0xb16477e0, 0xbf6d7aeb, 0x955259da, 0x9b5b54d1, 0x894043cc, 0x87494ec7, 0xdd3e05ae, 0xd33708a5, 0xc12c1fb8, 0xcf2512b3, 0xe51a3182, 0xeb133c89, 0xf9082b94, 0xf701269f, 0x4de6bd46, 0x43efb04d, 0x51f4a750, 0x5ffdaa5b, 0x75c2896a, 0x7bcb8461, 0x69d0937c, 0x67d99e77, 0x3daed51e, 0x33a7d815, 0x21bccf08, 0x2fb5c203, 0x058ae132, 0x0b83ec39, 0x1998fb24, 0x1791f62f, 0x764dd68d, 0x7844db86, 0x6a5fcc9b, 0x6456c190, 0x4e69e2a1, 0x4060efaa, 0x527bf8b7, 0x5c72f5bc, 0x0605bed5, 0x080cb3de, 0x1a17a4c3, 0x141ea9c8, 0x3e218af9, 0x302887f2, 0x223390ef, 0x2c3a9de4, 0x96dd063d, 0x98d40b36, 0x8acf1c2b, 0x84c61120, 0xaef93211, 0xa0f03f1a, 0xb2eb2807, 0xbce2250c, 0xe6956e65, 0xe89c636e, 0xfa877473, 0xf48e7978, 0xdeb15a49, 0xd0b85742, 0xc2a3405f, 0xccaa4d54, 0x41ecdaf7, 0x4fe5d7fc, 0x5dfec0e1, 0x53f7cdea, 0x79c8eedb, 0x77c1e3d0, 0x65daf4cd, 0x6bd3f9c6, 0x31a4b2af, 0x3fadbfa4, 0x2db6a8b9, 0x23bfa5b2, 0x09808683, 0x07898b88, 0x15929c95, 0x1b9b919e, 0xa17c0a47, 0xaf75074c, 0xbd6e1051, 0xb3671d5a, 0x99583e6b, 0x97513360, 0x854a247d, 0x8b432976, 0xd134621f, 0xdf3d6f14, 0xcd267809, 0xc32f7502, 0xe9105633, 0xe7195b38, 0xf5024c25, 0xfb0b412e, 0x9ad7618c, 0x94de6c87, 0x86c57b9a, 0x88cc7691, 0xa2f355a0, 0xacfa58ab, 0xbee14fb6, 0xb0e842bd, 0xea9f09d4, 0xe49604df, 0xf68d13c2, 0xf8841ec9, 0xd2bb3df8, 0xdcb230f3, 0xcea927ee, 0xc0a02ae5, 0x7a47b13c, 0x744ebc37, 0x6655ab2a, 0x685ca621, 0x42638510, 0x4c6a881b, 0x5e719f06, 0x5078920d, 0x0a0fd964, 0x0406d46f, 0x161dc372, 0x1814ce79, 0x322bed48, 0x3c22e043, 0x2e39f75e, 0x2030fa55, 0xec9ab701, 0xe293ba0a, 0xf088ad17, 0xfe81a01c, 0xd4be832d, 0xdab78e26, 0xc8ac993b, 0xc6a59430, 0x9cd2df59, 0x92dbd252, 0x80c0c54f, 0x8ec9c844, 0xa4f6eb75, 0xaaffe67e, 0xb8e4f163, 0xb6edfc68, 0x0c0a67b1, 0x02036aba, 0x10187da7, 0x1e1170ac, 0x342e539d, 0x3a275e96, 0x283c498b, 0x26354480, 0x7c420fe9, 0x724b02e2, 0x605015ff, 0x6e5918f4, 0x44663bc5, 0x4a6f36ce, 0x587421d3, 0x567d2cd8, 0x37a10c7a, 0x39a80171, 0x2bb3166c, 0x25ba1b67, 0x0f853856, 0x018c355d, 0x13972240, 0x1d9e2f4b, 0x47e96422, 0x49e06929, 0x5bfb7e34, 0x55f2733f, 0x7fcd500e, 0x71c45d05, 0x63df4a18, 0x6dd64713, 0xd731dcca, 0xd938d1c1, 0xcb23c6dc, 0xc52acbd7, 0xef15e8e6, 0xe11ce5ed, 0xf307f2f0, 0xfd0efffb, 0xa779b492, 0xa970b999, 0xbb6bae84, 0xb562a38f, 0x9f5d80be, 0x91548db5, 0x834f9aa8, 0x8d4697a3];
+ var U2 = [0x00000000, 0x0b0e090d, 0x161c121a, 0x1d121b17, 0x2c382434, 0x27362d39, 0x3a24362e, 0x312a3f23, 0x58704868, 0x537e4165, 0x4e6c5a72, 0x4562537f, 0x74486c5c, 0x7f466551, 0x62547e46, 0x695a774b, 0xb0e090d0, 0xbbee99dd, 0xa6fc82ca, 0xadf28bc7, 0x9cd8b4e4, 0x97d6bde9, 0x8ac4a6fe, 0x81caaff3, 0xe890d8b8, 0xe39ed1b5, 0xfe8ccaa2, 0xf582c3af, 0xc4a8fc8c, 0xcfa6f581, 0xd2b4ee96, 0xd9bae79b, 0x7bdb3bbb, 0x70d532b6, 0x6dc729a1, 0x66c920ac, 0x57e31f8f, 0x5ced1682, 0x41ff0d95, 0x4af10498, 0x23ab73d3, 0x28a57ade, 0x35b761c9, 0x3eb968c4, 0x0f9357e7, 0x049d5eea, 0x198f45fd, 0x12814cf0, 0xcb3bab6b, 0xc035a266, 0xdd27b971, 0xd629b07c, 0xe7038f5f, 0xec0d8652, 0xf11f9d45, 0xfa119448, 0x934be303, 0x9845ea0e, 0x8557f119, 0x8e59f814, 0xbf73c737, 0xb47dce3a, 0xa96fd52d, 0xa261dc20, 0xf6ad766d, 0xfda37f60, 0xe0b16477, 0xebbf6d7a, 0xda955259, 0xd19b5b54, 0xcc894043, 0xc787494e, 0xaedd3e05, 0xa5d33708, 0xb8c12c1f, 0xb3cf2512, 0x82e51a31, 0x89eb133c, 0x94f9082b, 0x9ff70126, 0x464de6bd, 0x4d43efb0, 0x5051f4a7, 0x5b5ffdaa, 0x6a75c289, 0x617bcb84, 0x7c69d093, 0x7767d99e, 0x1e3daed5, 0x1533a7d8, 0x0821bccf, 0x032fb5c2, 0x32058ae1, 0x390b83ec, 0x241998fb, 0x2f1791f6, 0x8d764dd6, 0x867844db, 0x9b6a5fcc, 0x906456c1, 0xa14e69e2, 0xaa4060ef, 0xb7527bf8, 0xbc5c72f5, 0xd50605be, 0xde080cb3, 0xc31a17a4, 0xc8141ea9, 0xf93e218a, 0xf2302887, 0xef223390, 0xe42c3a9d, 0x3d96dd06, 0x3698d40b, 0x2b8acf1c, 0x2084c611, 0x11aef932, 0x1aa0f03f, 0x07b2eb28, 0x0cbce225, 0x65e6956e, 0x6ee89c63, 0x73fa8774, 0x78f48e79, 0x49deb15a, 0x42d0b857, 0x5fc2a340, 0x54ccaa4d, 0xf741ecda, 0xfc4fe5d7, 0xe15dfec0, 0xea53f7cd, 0xdb79c8ee, 0xd077c1e3, 0xcd65daf4, 0xc66bd3f9, 0xaf31a4b2, 0xa43fadbf, 0xb92db6a8, 0xb223bfa5, 0x83098086, 0x8807898b, 0x9515929c, 0x9e1b9b91, 0x47a17c0a, 0x4caf7507, 0x51bd6e10, 0x5ab3671d, 0x6b99583e, 0x60975133, 0x7d854a24, 0x768b4329, 0x1fd13462, 0x14df3d6f, 0x09cd2678, 0x02c32f75, 0x33e91056, 0x38e7195b, 0x25f5024c, 0x2efb0b41, 0x8c9ad761, 0x8794de6c, 0x9a86c57b, 0x9188cc76, 0xa0a2f355, 0xabacfa58, 0xb6bee14f, 0xbdb0e842, 0xd4ea9f09, 0xdfe49604, 0xc2f68d13, 0xc9f8841e, 0xf8d2bb3d, 0xf3dcb230, 0xeecea927, 0xe5c0a02a, 0x3c7a47b1, 0x37744ebc, 0x2a6655ab, 0x21685ca6, 0x10426385, 0x1b4c6a88, 0x065e719f, 0x0d507892, 0x640a0fd9, 0x6f0406d4, 0x72161dc3, 0x791814ce, 0x48322bed, 0x433c22e0, 0x5e2e39f7, 0x552030fa, 0x01ec9ab7, 0x0ae293ba, 0x17f088ad, 0x1cfe81a0, 0x2dd4be83, 0x26dab78e, 0x3bc8ac99, 0x30c6a594, 0x599cd2df, 0x5292dbd2, 0x4f80c0c5, 0x448ec9c8, 0x75a4f6eb, 0x7eaaffe6, 0x63b8e4f1, 0x68b6edfc, 0xb10c0a67, 0xba02036a, 0xa710187d, 0xac1e1170, 0x9d342e53, 0x963a275e, 0x8b283c49, 0x80263544, 0xe97c420f, 0xe2724b02, 0xff605015, 0xf46e5918, 0xc544663b, 0xce4a6f36, 0xd3587421, 0xd8567d2c, 0x7a37a10c, 0x7139a801, 0x6c2bb316, 0x6725ba1b, 0x560f8538, 0x5d018c35, 0x40139722, 0x4b1d9e2f, 0x2247e964, 0x2949e069, 0x345bfb7e, 0x3f55f273, 0x0e7fcd50, 0x0571c45d, 0x1863df4a, 0x136dd647, 0xcad731dc, 0xc1d938d1, 0xdccb23c6, 0xd7c52acb, 0xe6ef15e8, 0xede11ce5, 0xf0f307f2, 0xfbfd0eff, 0x92a779b4, 0x99a970b9, 0x84bb6bae, 0x8fb562a3, 0xbe9f5d80, 0xb591548d, 0xa8834f9a, 0xa38d4697];
+ var U3 = [0x00000000, 0x0d0b0e09, 0x1a161c12, 0x171d121b, 0x342c3824, 0x3927362d, 0x2e3a2436, 0x23312a3f, 0x68587048, 0x65537e41, 0x724e6c5a, 0x7f456253, 0x5c74486c, 0x517f4665, 0x4662547e, 0x4b695a77, 0xd0b0e090, 0xddbbee99, 0xcaa6fc82, 0xc7adf28b, 0xe49cd8b4, 0xe997d6bd, 0xfe8ac4a6, 0xf381caaf, 0xb8e890d8, 0xb5e39ed1, 0xa2fe8cca, 0xaff582c3, 0x8cc4a8fc, 0x81cfa6f5, 0x96d2b4ee, 0x9bd9bae7, 0xbb7bdb3b, 0xb670d532, 0xa16dc729, 0xac66c920, 0x8f57e31f, 0x825ced16, 0x9541ff0d, 0x984af104, 0xd323ab73, 0xde28a57a, 0xc935b761, 0xc43eb968, 0xe70f9357, 0xea049d5e, 0xfd198f45, 0xf012814c, 0x6bcb3bab, 0x66c035a2, 0x71dd27b9, 0x7cd629b0, 0x5fe7038f, 0x52ec0d86, 0x45f11f9d, 0x48fa1194, 0x03934be3, 0x0e9845ea, 0x198557f1, 0x148e59f8, 0x37bf73c7, 0x3ab47dce, 0x2da96fd5, 0x20a261dc, 0x6df6ad76, 0x60fda37f, 0x77e0b164, 0x7aebbf6d, 0x59da9552, 0x54d19b5b, 0x43cc8940, 0x4ec78749, 0x05aedd3e, 0x08a5d337, 0x1fb8c12c, 0x12b3cf25, 0x3182e51a, 0x3c89eb13, 0x2b94f908, 0x269ff701, 0xbd464de6, 0xb04d43ef, 0xa75051f4, 0xaa5b5ffd, 0x896a75c2, 0x84617bcb, 0x937c69d0, 0x9e7767d9, 0xd51e3dae, 0xd81533a7, 0xcf0821bc, 0xc2032fb5, 0xe132058a, 0xec390b83, 0xfb241998, 0xf62f1791, 0xd68d764d, 0xdb867844, 0xcc9b6a5f, 0xc1906456, 0xe2a14e69, 0xefaa4060, 0xf8b7527b, 0xf5bc5c72, 0xbed50605, 0xb3de080c, 0xa4c31a17, 0xa9c8141e, 0x8af93e21, 0x87f23028, 0x90ef2233, 0x9de42c3a, 0x063d96dd, 0x0b3698d4, 0x1c2b8acf, 0x112084c6, 0x3211aef9, 0x3f1aa0f0, 0x2807b2eb, 0x250cbce2, 0x6e65e695, 0x636ee89c, 0x7473fa87, 0x7978f48e, 0x5a49deb1, 0x5742d0b8, 0x405fc2a3, 0x4d54ccaa, 0xdaf741ec, 0xd7fc4fe5, 0xc0e15dfe, 0xcdea53f7, 0xeedb79c8, 0xe3d077c1, 0xf4cd65da, 0xf9c66bd3, 0xb2af31a4, 0xbfa43fad, 0xa8b92db6, 0xa5b223bf, 0x86830980, 0x8b880789, 0x9c951592, 0x919e1b9b, 0x0a47a17c, 0x074caf75, 0x1051bd6e, 0x1d5ab367, 0x3e6b9958, 0x33609751, 0x247d854a, 0x29768b43, 0x621fd134, 0x6f14df3d, 0x7809cd26, 0x7502c32f, 0x5633e910, 0x5b38e719, 0x4c25f502, 0x412efb0b, 0x618c9ad7, 0x6c8794de, 0x7b9a86c5, 0x769188cc, 0x55a0a2f3, 0x58abacfa, 0x4fb6bee1, 0x42bdb0e8, 0x09d4ea9f, 0x04dfe496, 0x13c2f68d, 0x1ec9f884, 0x3df8d2bb, 0x30f3dcb2, 0x27eecea9, 0x2ae5c0a0, 0xb13c7a47, 0xbc37744e, 0xab2a6655, 0xa621685c, 0x85104263, 0x881b4c6a, 0x9f065e71, 0x920d5078, 0xd9640a0f, 0xd46f0406, 0xc372161d, 0xce791814, 0xed48322b, 0xe0433c22, 0xf75e2e39, 0xfa552030, 0xb701ec9a, 0xba0ae293, 0xad17f088, 0xa01cfe81, 0x832dd4be, 0x8e26dab7, 0x993bc8ac, 0x9430c6a5, 0xdf599cd2, 0xd25292db, 0xc54f80c0, 0xc8448ec9, 0xeb75a4f6, 0xe67eaaff, 0xf163b8e4, 0xfc68b6ed, 0x67b10c0a, 0x6aba0203, 0x7da71018, 0x70ac1e11, 0x539d342e, 0x5e963a27, 0x498b283c, 0x44802635, 0x0fe97c42, 0x02e2724b, 0x15ff6050, 0x18f46e59, 0x3bc54466, 0x36ce4a6f, 0x21d35874, 0x2cd8567d, 0x0c7a37a1, 0x017139a8, 0x166c2bb3, 0x1b6725ba, 0x38560f85, 0x355d018c, 0x22401397, 0x2f4b1d9e, 0x642247e9, 0x692949e0, 0x7e345bfb, 0x733f55f2, 0x500e7fcd, 0x5d0571c4, 0x4a1863df, 0x47136dd6, 0xdccad731, 0xd1c1d938, 0xc6dccb23, 0xcbd7c52a, 0xe8e6ef15, 0xe5ede11c, 0xf2f0f307, 0xfffbfd0e, 0xb492a779, 0xb999a970, 0xae84bb6b, 0xa38fb562, 0x80be9f5d, 0x8db59154, 0x9aa8834f, 0x97a38d46];
+ var U4 = [0x00000000, 0x090d0b0e, 0x121a161c, 0x1b171d12, 0x24342c38, 0x2d392736, 0x362e3a24, 0x3f23312a, 0x48685870, 0x4165537e, 0x5a724e6c, 0x537f4562, 0x6c5c7448, 0x65517f46, 0x7e466254, 0x774b695a, 0x90d0b0e0, 0x99ddbbee, 0x82caa6fc, 0x8bc7adf2, 0xb4e49cd8, 0xbde997d6, 0xa6fe8ac4, 0xaff381ca, 0xd8b8e890, 0xd1b5e39e, 0xcaa2fe8c, 0xc3aff582, 0xfc8cc4a8, 0xf581cfa6, 0xee96d2b4, 0xe79bd9ba, 0x3bbb7bdb, 0x32b670d5, 0x29a16dc7, 0x20ac66c9, 0x1f8f57e3, 0x16825ced, 0x0d9541ff, 0x04984af1, 0x73d323ab, 0x7ade28a5, 0x61c935b7, 0x68c43eb9, 0x57e70f93, 0x5eea049d, 0x45fd198f, 0x4cf01281, 0xab6bcb3b, 0xa266c035, 0xb971dd27, 0xb07cd629, 0x8f5fe703, 0x8652ec0d, 0x9d45f11f, 0x9448fa11, 0xe303934b, 0xea0e9845, 0xf1198557, 0xf8148e59, 0xc737bf73, 0xce3ab47d, 0xd52da96f, 0xdc20a261, 0x766df6ad, 0x7f60fda3, 0x6477e0b1, 0x6d7aebbf, 0x5259da95, 0x5b54d19b, 0x4043cc89, 0x494ec787, 0x3e05aedd, 0x3708a5d3, 0x2c1fb8c1, 0x2512b3cf, 0x1a3182e5, 0x133c89eb, 0x082b94f9, 0x01269ff7, 0xe6bd464d, 0xefb04d43, 0xf4a75051, 0xfdaa5b5f, 0xc2896a75, 0xcb84617b, 0xd0937c69, 0xd99e7767, 0xaed51e3d, 0xa7d81533, 0xbccf0821, 0xb5c2032f, 0x8ae13205, 0x83ec390b, 0x98fb2419, 0x91f62f17, 0x4dd68d76, 0x44db8678, 0x5fcc9b6a, 0x56c19064, 0x69e2a14e, 0x60efaa40, 0x7bf8b752, 0x72f5bc5c, 0x05bed506, 0x0cb3de08, 0x17a4c31a, 0x1ea9c814, 0x218af93e, 0x2887f230, 0x3390ef22, 0x3a9de42c, 0xdd063d96, 0xd40b3698, 0xcf1c2b8a, 0xc6112084, 0xf93211ae, 0xf03f1aa0, 0xeb2807b2, 0xe2250cbc, 0x956e65e6, 0x9c636ee8, 0x877473fa, 0x8e7978f4, 0xb15a49de, 0xb85742d0, 0xa3405fc2, 0xaa4d54cc, 0xecdaf741, 0xe5d7fc4f, 0xfec0e15d, 0xf7cdea53, 0xc8eedb79, 0xc1e3d077, 0xdaf4cd65, 0xd3f9c66b, 0xa4b2af31, 0xadbfa43f, 0xb6a8b92d, 0xbfa5b223, 0x80868309, 0x898b8807, 0x929c9515, 0x9b919e1b, 0x7c0a47a1, 0x75074caf, 0x6e1051bd, 0x671d5ab3, 0x583e6b99, 0x51336097, 0x4a247d85, 0x4329768b, 0x34621fd1, 0x3d6f14df, 0x267809cd, 0x2f7502c3, 0x105633e9, 0x195b38e7, 0x024c25f5, 0x0b412efb, 0xd7618c9a, 0xde6c8794, 0xc57b9a86, 0xcc769188, 0xf355a0a2, 0xfa58abac, 0xe14fb6be, 0xe842bdb0, 0x9f09d4ea, 0x9604dfe4, 0x8d13c2f6, 0x841ec9f8, 0xbb3df8d2, 0xb230f3dc, 0xa927eece, 0xa02ae5c0, 0x47b13c7a, 0x4ebc3774, 0x55ab2a66, 0x5ca62168, 0x63851042, 0x6a881b4c, 0x719f065e, 0x78920d50, 0x0fd9640a, 0x06d46f04, 0x1dc37216, 0x14ce7918, 0x2bed4832, 0x22e0433c, 0x39f75e2e, 0x30fa5520, 0x9ab701ec, 0x93ba0ae2, 0x88ad17f0, 0x81a01cfe, 0xbe832dd4, 0xb78e26da, 0xac993bc8, 0xa59430c6, 0xd2df599c, 0xdbd25292, 0xc0c54f80, 0xc9c8448e, 0xf6eb75a4, 0xffe67eaa, 0xe4f163b8, 0xedfc68b6, 0x0a67b10c, 0x036aba02, 0x187da710, 0x1170ac1e, 0x2e539d34, 0x275e963a, 0x3c498b28, 0x35448026, 0x420fe97c, 0x4b02e272, 0x5015ff60, 0x5918f46e, 0x663bc544, 0x6f36ce4a, 0x7421d358, 0x7d2cd856, 0xa10c7a37, 0xa8017139, 0xb3166c2b, 0xba1b6725, 0x8538560f, 0x8c355d01, 0x97224013, 0x9e2f4b1d, 0xe9642247, 0xe0692949, 0xfb7e345b, 0xf2733f55, 0xcd500e7f, 0xc45d0571, 0xdf4a1863, 0xd647136d, 0x31dccad7, 0x38d1c1d9, 0x23c6dccb, 0x2acbd7c5, 0x15e8e6ef, 0x1ce5ede1, 0x07f2f0f3, 0x0efffbfd, 0x79b492a7, 0x70b999a9, 0x6bae84bb, 0x62a38fb5, 0x5d80be9f, 0x548db591, 0x4f9aa883, 0x4697a38d];
+
+ function convertToInt32(bytes) {
+ var result = [];
+ for (var i = 0; i < bytes.length; i += 4) {
+ result.push(
+ (bytes[i ] << 24) |
+ (bytes[i + 1] << 16) |
+ (bytes[i + 2] << 8) |
+ bytes[i + 3]
+ );
+ }
+ return result;
+ }
+
+ var AES = function(key) {
+ if (!(this instanceof AES)) {
+ throw Error('AES must be instanitated with `new`');
+ }
+
+ Object.defineProperty(this, 'key', {
+ value: coerceArray(key, true)
+ });
+
+ this._prepare();
+ }
+
+
+ AES.prototype._prepare = function() {
+
+ var rounds = numberOfRounds[this.key.length];
+ if (rounds == null) {
+ throw new Error('invalid key size (must be 16, 24 or 32 bytes)');
+ }
+
+ // encryption round keys
+ this._Ke = [];
+
+ // decryption round keys
+ this._Kd = [];
+
+ for (var i = 0; i <= rounds; i++) {
+ this._Ke.push([0, 0, 0, 0]);
+ this._Kd.push([0, 0, 0, 0]);
+ }
+
+ var roundKeyCount = (rounds + 1) * 4;
+ var KC = this.key.length / 4;
+
+ // convert the key into ints
+ var tk = convertToInt32(this.key);
+
+ // copy values into round key arrays
+ var index;
+ for (var i = 0; i < KC; i++) {
+ index = i >> 2;
+ this._Ke[index][i % 4] = tk[i];
+ this._Kd[rounds - index][i % 4] = tk[i];
+ }
+
+ // key expansion (fips-197 section 5.2)
+ var rconpointer = 0;
+ var t = KC, tt;
+ while (t < roundKeyCount) {
+ tt = tk[KC - 1];
+ tk[0] ^= ((S[(tt >> 16) & 0xFF] << 24) ^
+ (S[(tt >> 8) & 0xFF] << 16) ^
+ (S[ tt & 0xFF] << 8) ^
+ S[(tt >> 24) & 0xFF] ^
+ (rcon[rconpointer] << 24));
+ rconpointer += 1;
+
+ // key expansion (for non-256 bit)
+ if (KC != 8) {
+ for (var i = 1; i < KC; i++) {
+ tk[i] ^= tk[i - 1];
+ }
+
+ // key expansion for 256-bit keys is "slightly different" (fips-197)
+ } else {
+ for (var i = 1; i < (KC / 2); i++) {
+ tk[i] ^= tk[i - 1];
+ }
+ tt = tk[(KC / 2) - 1];
+
+ tk[KC / 2] ^= (S[ tt & 0xFF] ^
+ (S[(tt >> 8) & 0xFF] << 8) ^
+ (S[(tt >> 16) & 0xFF] << 16) ^
+ (S[(tt >> 24) & 0xFF] << 24));
+
+ for (var i = (KC / 2) + 1; i < KC; i++) {
+ tk[i] ^= tk[i - 1];
+ }
+ }
+
+ // copy values into round key arrays
+ var i = 0, r, c;
+ while (i < KC && t < roundKeyCount) {
+ r = t >> 2;
+ c = t % 4;
+ this._Ke[r][c] = tk[i];
+ this._Kd[rounds - r][c] = tk[i++];
+ t++;
+ }
+ }
+
+ // inverse-cipher-ify the decryption round key (fips-197 section 5.3)
+ for (var r = 1; r < rounds; r++) {
+ for (var c = 0; c < 4; c++) {
+ tt = this._Kd[r][c];
+ this._Kd[r][c] = (U1[(tt >> 24) & 0xFF] ^
+ U2[(tt >> 16) & 0xFF] ^
+ U3[(tt >> 8) & 0xFF] ^
+ U4[ tt & 0xFF]);
+ }
+ }
+ }
+
+ AES.prototype.encrypt = function(plaintext) {
+ if (plaintext.length != 16) {
+ throw new Error('invalid plaintext size (must be 16 bytes)');
+ }
+
+ var rounds = this._Ke.length - 1;
+ var a = [0, 0, 0, 0];
+
+ // convert plaintext to (ints ^ key)
+ var t = convertToInt32(plaintext);
+ for (var i = 0; i < 4; i++) {
+ t[i] ^= this._Ke[0][i];
+ }
+
+ // apply round transforms
+ for (var r = 1; r < rounds; r++) {
+ for (var i = 0; i < 4; i++) {
+ a[i] = (T1[(t[ i ] >> 24) & 0xff] ^
+ T2[(t[(i + 1) % 4] >> 16) & 0xff] ^
+ T3[(t[(i + 2) % 4] >> 8) & 0xff] ^
+ T4[ t[(i + 3) % 4] & 0xff] ^
+ this._Ke[r][i]);
+ }
+ t = a.slice();
+ }
+
+ // the last round is special
+ var result = createArray(16), tt;
+ for (var i = 0; i < 4; i++) {
+ tt = this._Ke[rounds][i];
+ result[4 * i ] = (S[(t[ i ] >> 24) & 0xff] ^ (tt >> 24)) & 0xff;
+ result[4 * i + 1] = (S[(t[(i + 1) % 4] >> 16) & 0xff] ^ (tt >> 16)) & 0xff;
+ result[4 * i + 2] = (S[(t[(i + 2) % 4] >> 8) & 0xff] ^ (tt >> 8)) & 0xff;
+ result[4 * i + 3] = (S[ t[(i + 3) % 4] & 0xff] ^ tt ) & 0xff;
+ }
+
+ return result;
+ }
+
+ AES.prototype.decrypt = function(ciphertext) {
+ if (ciphertext.length != 16) {
+ throw new Error('invalid ciphertext size (must be 16 bytes)');
+ }
+
+ var rounds = this._Kd.length - 1;
+ var a = [0, 0, 0, 0];
+
+ // convert plaintext to (ints ^ key)
+ var t = convertToInt32(ciphertext);
+ for (var i = 0; i < 4; i++) {
+ t[i] ^= this._Kd[0][i];
+ }
+
+ // apply round transforms
+ for (var r = 1; r < rounds; r++) {
+ for (var i = 0; i < 4; i++) {
+ a[i] = (T5[(t[ i ] >> 24) & 0xff] ^
+ T6[(t[(i + 3) % 4] >> 16) & 0xff] ^
+ T7[(t[(i + 2) % 4] >> 8) & 0xff] ^
+ T8[ t[(i + 1) % 4] & 0xff] ^
+ this._Kd[r][i]);
+ }
+ t = a.slice();
+ }
+
+ // the last round is special
+ var result = createArray(16), tt;
+ for (var i = 0; i < 4; i++) {
+ tt = this._Kd[rounds][i];
+ result[4 * i ] = (Si[(t[ i ] >> 24) & 0xff] ^ (tt >> 24)) & 0xff;
+ result[4 * i + 1] = (Si[(t[(i + 3) % 4] >> 16) & 0xff] ^ (tt >> 16)) & 0xff;
+ result[4 * i + 2] = (Si[(t[(i + 2) % 4] >> 8) & 0xff] ^ (tt >> 8)) & 0xff;
+ result[4 * i + 3] = (Si[ t[(i + 1) % 4] & 0xff] ^ tt ) & 0xff;
+ }
+
+ return result;
+ }
+
+
+ /**
+ * Mode Of Operation - Electonic Codebook (ECB)
+ */
+ var ModeOfOperationECB = function(key) {
+ if (!(this instanceof ModeOfOperationECB)) {
+ throw Error('AES must be instanitated with `new`');
+ }
+
+ this.description = "Electronic Code Block";
+ this.name = "ecb";
+
+ this._aes = new AES(key);
+ }
+
+ ModeOfOperationECB.prototype.encrypt = function(plaintext) {
+ plaintext = coerceArray(plaintext);
+
+ if ((plaintext.length % 16) !== 0) {
+ throw new Error('invalid plaintext size (must be multiple of 16 bytes)');
+ }
+
+ var ciphertext = createArray(plaintext.length);
+ var block = createArray(16);
+
+ for (var i = 0; i < plaintext.length; i += 16) {
+ copyArray(plaintext, block, 0, i, i + 16);
+ block = this._aes.encrypt(block);
+ copyArray(block, ciphertext, i);
+ }
+
+ return ciphertext;
+ }
+
+ ModeOfOperationECB.prototype.decrypt = function(ciphertext) {
+ ciphertext = coerceArray(ciphertext);
+
+ if ((ciphertext.length % 16) !== 0) {
+ throw new Error('invalid ciphertext size (must be multiple of 16 bytes)');
+ }
+
+ var plaintext = createArray(ciphertext.length);
+ var block = createArray(16);
+
+ for (var i = 0; i < ciphertext.length; i += 16) {
+ copyArray(ciphertext, block, 0, i, i + 16);
+ block = this._aes.decrypt(block);
+ copyArray(block, plaintext, i);
+ }
+
+ return plaintext;
+ }
+
+
+ /**
+ * Mode Of Operation - Cipher Block Chaining (CBC)
+ */
+ var ModeOfOperationCBC = function(key, iv) {
+ if (!(this instanceof ModeOfOperationCBC)) {
+ throw Error('AES must be instanitated with `new`');
+ }
+
+ this.description = "Cipher Block Chaining";
+ this.name = "cbc";
+
+ if (!iv) {
+ iv = createArray(16);
+
+ } else if (iv.length != 16) {
+ throw new Error('invalid initialation vector size (must be 16 bytes)');
+ }
+
+ this._lastCipherblock = coerceArray(iv, true);
+
+ this._aes = new AES(key);
+ }
+
+ ModeOfOperationCBC.prototype.encrypt = function(plaintext) {
+ plaintext = coerceArray(plaintext);
+
+ if ((plaintext.length % 16) !== 0) {
+ throw new Error('invalid plaintext size (must be multiple of 16 bytes)');
+ }
+
+ var ciphertext = createArray(plaintext.length);
+ var block = createArray(16);
+
+ for (var i = 0; i < plaintext.length; i += 16) {
+ copyArray(plaintext, block, 0, i, i + 16);
+
+ for (var j = 0; j < 16; j++) {
+ block[j] ^= this._lastCipherblock[j];
+ }
+
+ this._lastCipherblock = this._aes.encrypt(block);
+ copyArray(this._lastCipherblock, ciphertext, i);
+ }
+
+ return ciphertext;
+ }
+
+ ModeOfOperationCBC.prototype.decrypt = function(ciphertext) {
+ ciphertext = coerceArray(ciphertext);
+
+ if ((ciphertext.length % 16) !== 0) {
+ throw new Error('invalid ciphertext size (must be multiple of 16 bytes)');
+ }
+
+ var plaintext = createArray(ciphertext.length);
+ var block = createArray(16);
+
+ for (var i = 0; i < ciphertext.length; i += 16) {
+ copyArray(ciphertext, block, 0, i, i + 16);
+ block = this._aes.decrypt(block);
+
+ for (var j = 0; j < 16; j++) {
+ plaintext[i + j] = block[j] ^ this._lastCipherblock[j];
+ }
+
+ copyArray(ciphertext, this._lastCipherblock, 0, i, i + 16);
+ }
+
+ return plaintext;
+ }
+
+
+ /**
+ * Mode Of Operation - Cipher Feedback (CFB)
+ */
+ var ModeOfOperationCFB = function(key, iv, segmentSize) {
+ if (!(this instanceof ModeOfOperationCFB)) {
+ throw Error('AES must be instanitated with `new`');
+ }
+
+ this.description = "Cipher Feedback";
+ this.name = "cfb";
+
+ if (!iv) {
+ iv = createArray(16);
+
+ } else if (iv.length != 16) {
+ throw new Error('invalid initialation vector size (must be 16 size)');
+ }
+
+ if (!segmentSize) { segmentSize = 1; }
+
+ this.segmentSize = segmentSize;
+
+ this._shiftRegister = coerceArray(iv, true);
+
+ this._aes = new AES(key);
+ }
+
+ ModeOfOperationCFB.prototype.encrypt = function(plaintext) {
+ if ((plaintext.length % this.segmentSize) != 0) {
+ throw new Error('invalid plaintext size (must be segmentSize bytes)');
+ }
+
+ var encrypted = coerceArray(plaintext, true);
+
+ var xorSegment;
+ for (var i = 0; i < encrypted.length; i += this.segmentSize) {
+ xorSegment = this._aes.encrypt(this._shiftRegister);
+ for (var j = 0; j < this.segmentSize; j++) {
+ encrypted[i + j] ^= xorSegment[j];
+ }
+
+ // Shift the register
+ copyArray(this._shiftRegister, this._shiftRegister, 0, this.segmentSize);
+ copyArray(encrypted, this._shiftRegister, 16 - this.segmentSize, i, i + this.segmentSize);
+ }
+
+ return encrypted;
+ }
+
+ ModeOfOperationCFB.prototype.decrypt = function(ciphertext) {
+ if ((ciphertext.length % this.segmentSize) != 0) {
+ throw new Error('invalid ciphertext size (must be segmentSize bytes)');
+ }
+
+ var plaintext = coerceArray(ciphertext, true);
+
+ var xorSegment;
+ for (var i = 0; i < plaintext.length; i += this.segmentSize) {
+ xorSegment = this._aes.encrypt(this._shiftRegister);
+
+ for (var j = 0; j < this.segmentSize; j++) {
+ plaintext[i + j] ^= xorSegment[j];
+ }
+
+ // Shift the register
+ copyArray(this._shiftRegister, this._shiftRegister, 0, this.segmentSize);
+ copyArray(ciphertext, this._shiftRegister, 16 - this.segmentSize, i, i + this.segmentSize);
+ }
+
+ return plaintext;
+ }
+
+ /**
+ * Mode Of Operation - Output Feedback (OFB)
+ */
+ var ModeOfOperationOFB = function(key, iv) {
+ if (!(this instanceof ModeOfOperationOFB)) {
+ throw Error('AES must be instanitated with `new`');
+ }
+
+ this.description = "Output Feedback";
+ this.name = "ofb";
+
+ if (!iv) {
+ iv = createArray(16);
+
+ } else if (iv.length != 16) {
+ throw new Error('invalid initialation vector size (must be 16 bytes)');
+ }
+
+ this._lastPrecipher = coerceArray(iv, true);
+ this._lastPrecipherIndex = 16;
+
+ this._aes = new AES(key);
+ }
+
+ ModeOfOperationOFB.prototype.encrypt = function(plaintext) {
+ var encrypted = coerceArray(plaintext, true);
+
+ for (var i = 0; i < encrypted.length; i++) {
+ if (this._lastPrecipherIndex === 16) {
+ this._lastPrecipher = this._aes.encrypt(this._lastPrecipher);
+ this._lastPrecipherIndex = 0;
+ }
+ encrypted[i] ^= this._lastPrecipher[this._lastPrecipherIndex++];
+ }
+
+ return encrypted;
+ }
+
+ // Decryption is symetric
+ ModeOfOperationOFB.prototype.decrypt = ModeOfOperationOFB.prototype.encrypt;
+
+
+ /**
+ * Counter object for CTR common mode of operation
+ */
+ var Counter = function(initialValue) {
+ if (!(this instanceof Counter)) {
+ throw Error('Counter must be instanitated with `new`');
+ }
+
+ // We allow 0, but anything false-ish uses the default 1
+ if (initialValue !== 0 && !initialValue) { initialValue = 1; }
+
+ if (typeof(initialValue) === 'number') {
+ this._counter = createArray(16);
+ this.setValue(initialValue);
+
+ } else {
+ this.setBytes(initialValue);
+ }
+ }
+
+ Counter.prototype.setValue = function(value) {
+ if (typeof(value) !== 'number' || parseInt(value) != value) {
+ throw new Error('invalid counter value (must be an integer)');
+ }
+
+ // We cannot safely handle numbers beyond the safe range for integers
+ if (value > Number.MAX_SAFE_INTEGER) {
+ throw new Error('integer value out of safe range');
+ }
+
+ for (var index = 15; index >= 0; --index) {
+ this._counter[index] = value % 256;
+ value = parseInt(value / 256);
+ }
+ }
+
+ Counter.prototype.setBytes = function(bytes) {
+ bytes = coerceArray(bytes, true);
+
+ if (bytes.length != 16) {
+ throw new Error('invalid counter bytes size (must be 16 bytes)');
+ }
+
+ this._counter = bytes;
+ };
+
+ Counter.prototype.increment = function() {
+ for (var i = 15; i >= 0; i--) {
+ if (this._counter[i] === 255) {
+ this._counter[i] = 0;
+ } else {
+ this._counter[i]++;
+ break;
+ }
+ }
+ }
+
+
+ /**
+ * Mode Of Operation - Counter (CTR)
+ */
+ var ModeOfOperationCTR = function(key, counter) {
+ if (!(this instanceof ModeOfOperationCTR)) {
+ throw Error('AES must be instanitated with `new`');
+ }
+
+ this.description = "Counter";
+ this.name = "ctr";
+
+ if (!(counter instanceof Counter)) {
+ counter = new Counter(counter)
+ }
+
+ this._counter = counter;
+
+ this._remainingCounter = null;
+ this._remainingCounterIndex = 16;
+
+ this._aes = new AES(key);
+ }
+
+ ModeOfOperationCTR.prototype.encrypt = function(plaintext) {
+ var encrypted = coerceArray(plaintext, true);
+
+ for (var i = 0; i < encrypted.length; i++) {
+ if (this._remainingCounterIndex === 16) {
+ this._remainingCounter = this._aes.encrypt(this._counter._counter);
+ this._remainingCounterIndex = 0;
+ this._counter.increment();
+ }
+ encrypted[i] ^= this._remainingCounter[this._remainingCounterIndex++];
+ }
+
+ return encrypted;
+ }
+
+ // Decryption is symetric
+ ModeOfOperationCTR.prototype.decrypt = ModeOfOperationCTR.prototype.encrypt;
+
+
+ ///////////////////////
+ // Padding
+
+ // See:https://tools.ietf.org/html/rfc2315
+ function pkcs7pad(data) {
+ data = coerceArray(data, true);
+ var padder = 16 - (data.length % 16);
+ var result = createArray(data.length + padder);
+ copyArray(data, result);
+ for (var i = data.length; i < result.length; i++) {
+ result[i] = padder;
+ }
+ return result;
+ }
+
+ function pkcs7strip(data) {
+ data = coerceArray(data, true);
+ if (data.length < 16) { throw new Error('PKCS#7 invalid length'); }
+
+ var padder = data[data.length - 1];
+ if (padder > 16) { throw new Error('PKCS#7 padding byte out of range'); }
+
+ var length = data.length - padder;
+ for (var i = 0; i < padder; i++) {
+ if (data[length + i] !== padder) {
+ throw new Error('PKCS#7 invalid padding byte');
+ }
+ }
+
+ var result = createArray(length);
+ copyArray(data, result, 0, 0, length);
+ return result;
+ }
+
+ ///////////////////////
+ // Exporting
+
+
+ // The block cipher
+ var aesjs = {
+ AES: AES,
+ Counter: Counter,
+
+ ModeOfOperation: {
+ ecb: ModeOfOperationECB,
+ cbc: ModeOfOperationCBC,
+ cfb: ModeOfOperationCFB,
+ ofb: ModeOfOperationOFB,
+ ctr: ModeOfOperationCTR
+ },
+
+ utils: {
+ hex: convertHex,
+ utf8: convertUtf8
+ },
+
+ padding: {
+ pkcs7: {
+ pad: pkcs7pad,
+ strip: pkcs7strip
+ }
+ },
+
+ _arrayTest: {
+ coerceArray: coerceArray,
+ createArray: createArray,
+ copyArray: copyArray,
+ }
+ };
+
+
+ // node.js
+ if (typeof exports !== 'undefined') {
+ module.exports = aesjs
+
+ // RequireJS/AMD
+ // http://www.requirejs.org/docs/api.html
+ // https://github.com/amdjs/amdjs-api/wiki/AMD
+ } else if (typeof(define) === 'function' && define.amd) {
+ define(aesjs);
+
+ // Web Browsers
+ } else {
+
+ // If there was an existing library at "aesjs" make sure it's still available
+ if (root.aesjs) {
+ aesjs._aesjs = root.aesjs;
+ }
+
+ root.aesjs = aesjs;
+ }
+
+
+})(this);
diff --git a/blog/blogext.css b/blog/blogext.css
new file mode 100644
index 0000000..7b6916c
--- /dev/null
+++ b/blog/blogext.css
@@ -0,0 +1,65 @@
+span.right{
+ display:table-cell;
+ text-align:right;
+ white-space:nowrap;
+ min-width:12em;
+}
+a.toctarg{
+ margin-left:-160px;
+ padding-left:160px !important;
+}
+ul#tagslist{
+ list-style-type:none;
+ padding-left:0;
+}
+ul#tocroot{
+ list-style-type:none;
+ padding-left:24px;
+}
+ul.tocnode{
+ list-style-type:none;
+ padding-left:16px;
+}
+span.left{
+ display:table-cell;
+ text-align:left;
+ text-overflow:ellipsis;
+ overflow:hidden;
+ white-space:nowrap;
+}
+div h3{
+ margin: 0.5em 0;
+}
+#content .block{
+ margin: 1em 0;
+}
+p{
+ text-indent:2em;
+}
+.noindent{
+ text-indent:0 !important;
+}
+note, .note {
+ vertical-align: super;
+ font-size: 60%;
+}
+reduced, .reduced {
+ font-size: 75%;
+}
+enlarged, .enlarged {
+ font-size: 125%;
+}
+blockquote {
+ padding: 1em;
+ margin-left:4em;margin-right:4em;
+}
+.rightaligned {
+ text-align: right;
+}
+.nospace{font-size:0;}
+.nospace>span{font-size:16px;}
+#decryptdlg{max-width:30%;}
+@media (max-width:768px)
+{
+ #decryptdlg{max-width:90%;}
+}
diff --git a/blog/content/.htaccess b/blog/content/.htaccess
new file mode 100644
index 0000000..93169e4
--- /dev/null
+++ b/blog/content/.htaccess
@@ -0,0 +1,2 @@
+Order deny,allow
+Deny from all
diff --git a/blog/content/util/indexer.cpp b/blog/content/util/indexer.cpp
new file mode 100644
index 0000000..b072633
--- /dev/null
+++ b/blog/content/util/indexer.cpp
@@ -0,0 +1,48 @@
+//filename title date tags
+#include <dirent.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <cstdio>
+#include <cstring>
+#include <algorithm>
+#include <functional>
+#include <string>
+#include <vector>
+#define stripr(s) s[strlen(s)-1]=='\n'?s[strlen(s)-1]=0:0
+std::vector<std::string> fn;
+char buf1[65536],buf2[65536],buf3[65536];
+int main()
+{
+ struct dirent* pd;DIR* pdir;
+ pdir=opendir("/var/www/html/blog/content");
+ while((pd=readdir(pdir))!=NULL)
+ {
+ std::string s(pd->d_name);
+ if(s.length()<4)continue;
+ if(s.substr(s.length()-4)==".txt")
+ fn.push_back(s.substr(0,s.length()-4));
+ }
+ closedir(pdir);
+ std::sort(fn.begin(),fn.end(),std::greater<std::string>());
+ FILE *f,*rf;
+ f=fopen("/var/www/html/blog/content/pindex","w");
+ for(size_t i=0;i<fn.size();++i)
+ {
+ puts(("/var/www/html/blog/content/"+fn[i]+".txt").c_str());
+ struct stat st;struct tm* mt;
+ stat(("/var/www/html/blog/content/"+fn[i]+".txt").c_str(),&st);
+ mt=localtime(&st.st_mtime);
+ rf=fopen(("/var/www/html/blog/content/"+fn[i]+".txt").c_str(),"r");
+ fgets(buf1,65536,rf);stripr(buf1);
+ fgets(buf2,65536,rf);stripr(buf2);
+ fgets(buf3,65536,rf);stripr(buf3);
+ if(strstr(buf2,"WIP")){puts(" SKIPPED");continue;}
+ fprintf(f,"%s\t",fn[i].c_str());
+ fprintf(f,"%s\t",buf1);
+ fprintf(f,"%s/%d-%02d-%02d\t",buf2,mt->tm_year+1900,mt->tm_mon+1,mt->tm_mday);
+ fprintf(f,"%s\n",buf3);
+ fclose(rf);
+ }
+ fclose(f);
+}
diff --git a/blog/data/applefan.json b/blog/data/applefan.json
new file mode 100644
index 0000000..e8e09f9
--- /dev/null
+++ b/blog/data/applefan.json
@@ -0,0 +1,526 @@
+{
+ "title":"Are you an Apple fanboy/fangirl?",
+ "question":[
+ {
+ "initialization":[
+ {
+ "c":"",
+ "s":"have_ios = + 0"
+ },
+ {
+ "c":"",
+ "s":"have_iph = + 0"
+ },
+ {
+ "c":"",
+ "s":"airpods_sane = + 0"
+ }
+ ],
+ "precond":"",
+ "type":"multi",
+ "caption":"I have an/a...",
+ "choice":[
+ {
+ "caption":"iPod (original/Photo/Classic)/iPod mini/iPod Nano (1G~5G)/iPod Shuffle",
+ "setp":[
+ {
+ "c":"",
+ "s":"score = + score + 1"
+ }
+ ],
+ "setn":[]
+ },
+ {
+ "caption":"iPod Nano (6G, 7G)/iPod touch",
+ "setp":[
+ {
+ "c":"",
+ "s":"score = + score + 1.5"
+ }
+ ],
+ "setn":[]
+ },
+ {
+ "caption":"iPhone",
+ "setp":[
+ {
+ "c":"",
+ "s":"score = + score + 1.5"
+ },
+ {
+ "c":"",
+ "s":"have_ios = + 1"
+ },
+ {
+ "c":"",
+ "s":"have_iph = + 1"
+ }
+ ],
+ "setn":[]
+ },
+ {
+ "caption":"iPhone X",
+ "setp":[
+ {
+ "c":"| have_iph gt 0",
+ "s":"score = + score + 2"
+ },
+ {
+ "c":"| have_iph lt 1",
+ "s":"score = + score + 3.5"
+ },
+ {
+ "c":"",
+ "s":"have_ios = + 1"
+ }
+ ],
+ "setn":[]
+ },
+ {
+ "caption":"iPad original/Mini/Air",
+ "setp":[
+ {
+ "c":"",
+ "s":"score = + score + 2"
+ },
+ {
+ "c":"",
+ "s":"have_ios = + 1"
+ }
+ ],
+ "setn":[]
+ },
+ {
+ "caption":"iPad Pro",
+ "setp":[
+ {
+ "c":"",
+ "s":"score = + score + 2.5"
+ },
+ {
+ "c":"",
+ "s":"have_ios = + 1"
+ }
+ ],
+ "setn":[]
+ },
+ {
+ "caption":"Apple Watch",
+ "setp":[
+ {
+ "c":"| have_ios gt 0",
+ "s":"score = + score + 5"
+ },
+ {
+ "c":"| have_ios lt 1",
+ "s":"score = + score + 105"
+ },
+ {
+ "c":"",
+ "s":"airpods_sane = + 1"
+ }
+ ],
+ "setn":[]
+ },
+ {
+ "caption":"Macintosh before 1998",
+ "setp":[
+ {
+ "c":"",
+ "s":"score = + score - 2"
+ }
+ ],
+ "setn":[]
+ },
+ {
+ "caption":"PowerBook or Power Mac",
+ "setp":[
+ {
+ "c":"",
+ "s":"score = + score + 0"
+ }
+ ],
+ "setn":[]
+ },
+ {
+ "caption":"MacBook",
+ "setp":[
+ {
+ "c":"",
+ "s":"score = + score + 2"
+ },
+ {
+ "c":"",
+ "s":"airpods_sane = + 1"
+ }
+ ],
+ "setn":[]
+ },
+ {
+ "caption":"MacBook Air/Pro",
+ "setp":[
+ {
+ "c":"",
+ "s":"score = + score + 1.5"
+ },
+ {
+ "c":"",
+ "s":"airpods_sane = + 1"
+ }
+ ],
+ "setn":[]
+ },
+ {
+ "caption":"iMac",
+ "setp":[
+ {
+ "c":"",
+ "s":"score = + score + 2"
+ },
+ {
+ "c":"",
+ "s":"airpods_sane = + 1"
+ }
+ ],
+ "setn":[]
+ },
+ {
+ "caption":"Mac Pro",
+ "setp":[
+ {
+ "c":"",
+ "s":"score = + score + 2.5"
+ },
+ {
+ "c":"",
+ "s":"airpods_sane = + 1"
+ }
+ ],
+ "setn":[]
+ },
+ {
+ "caption":"Air Pods",
+ "setp":[
+ {
+ "c":"| airpods_sane gt 0",
+ "s":"score = + score + 10"
+ },
+ {
+ "c":"| airpods_sane lt 1",
+ "s":"score = + score + 110"
+ }
+ ],
+ "setn":[]
+ },
+ {
+ "caption":"HomePod",
+ "setp":[
+ {
+ "c":"| have_ios gt 0",
+ "s":"score = + score + 7"
+ },
+ {
+ "c":"| have_ios lt 1",
+ "s":"score = + score + 107"
+ }
+ ],
+ "setn":[]
+ }
+ ]
+ },
+ {
+ "initialization":[],
+ "precond":"",
+ "type":"single",
+ "caption":"I use Apple products because I am so dumb that I don't know how to use products from other vendors",
+ "choice":[
+ {
+ "caption":"yes",
+ "setp":[
+ {
+ "c":"",
+ "s":"score = + score - 10"
+ }
+ ],
+ "setn":[]
+ },
+ {
+ "caption":"no",
+ "setp":[
+ {
+ "c":"",
+ "s":"score = + score + 0"
+ }
+ ],
+ "setn":[]
+ }
+ ]
+ },
+ {
+ "initialization":[],
+ "precond":"",
+ "type":"single",
+ "caption":"I use Apple products because they are far more superior than any other vendors' products",
+ "choice":[
+ {
+ "caption":"yes",
+ "setp":[
+ {
+ "c":"",
+ "s":"score = + score + 8"
+ }
+ ],
+ "setn":[]
+ },
+ {
+ "caption":"no",
+ "setp":[
+ {
+ "c":"",
+ "s":"score = + score + 0"
+ }
+ ],
+ "setn":[]
+ }
+ ]
+ },
+ {
+ "initialization":[],
+ "precond":"",
+ "type":"single",
+ "caption":"I think Apple's products are worth all that money",
+ "choice":[
+ {
+ "caption":"yes",
+ "setp":[
+ {
+ "c":"",
+ "s":"score = + score + 5"
+ }
+ ],
+ "setn":[]
+ },
+ {
+ "caption":"no",
+ "setp":[
+ {
+ "c":"",
+ "s":"score = + score - 1"
+ }
+ ],
+ "setn":[]
+ }
+ ]
+ },
+ {
+ "initialization":[],
+ "precond":"",
+ "type":"single",
+ "caption":"Apple products suck, I have to use them for my work however",
+ "choice":[
+ {
+ "caption":"yes",
+ "setp":[
+ {
+ "c":"",
+ "s":"score = + score - 7.5"
+ }
+ ],
+ "setn":[]
+ },
+ {
+ "caption":"no",
+ "setp":[
+ {
+ "c":"",
+ "s":"score = + score + 0"
+ }
+ ],
+ "setn":[]
+ }
+ ]
+ },
+ {
+ "initialization":[],
+ "precond":"",
+ "type":"single",
+ "caption":"I think Apple respects my freedom and privacy",
+ "choice":[
+ {
+ "caption":"yes",
+ "setp":[
+ {
+ "c":"",
+ "s":"score = + score + 10"
+ }
+ ],
+ "setn":[]
+ },
+ {
+ "caption":"no",
+ "setp":[
+ {
+ "c":"",
+ "s":"score = + score - 2"
+ }
+ ],
+ "setn":[]
+ }
+ ]
+ },
+ {
+ "initialization":[],
+ "precond":"",
+ "type":"single",
+ "caption":"I bought refurbished Apple products because...",
+ "choice":[
+ {
+ "caption":"I can't afford a normal Apple product but I really want one",
+ "setp":[
+ {
+ "c":"",
+ "s":"score = + score + 2"
+ }
+ ],
+ "setn":[]
+ },
+ {
+ "caption":"Finally there's an Apple product that falls into my affordable range. I took it into consideration.",
+ "setp":[
+ {
+ "c":"",
+ "s":"score = + score - 2"
+ }
+ ],
+ "setn":[]
+ },
+ {
+ "caption":"I do not.",
+ "setp":[
+ {
+ "c":"",
+ "s":"score = + score + 0"
+ }
+ ],
+ "setn":[]
+ }
+ ]
+ },
+ {
+ "initialization":[],
+ "precond":"",
+ "type":"single",
+ "caption":"Keyboard on a MacBook (late 2016 and onward) is reliable and satisfying",
+ "choice":[
+ {
+ "caption":"yes",
+ "setp":[
+ {
+ "c":"",
+ "s":"score = + score + 1"
+ }
+ ],
+ "setn":[]
+ },
+ {
+ "caption":"no",
+ "setp":[
+ {
+ "c":"",
+ "s":"score = + score - 1"
+ }
+ ],
+ "setn":[]
+ },
+ {
+ "caption":"I've never tried that",
+ "setp":[
+ {
+ "c":"",
+ "s":"score = + score + 0"
+ }
+ ],
+ "setn":[]
+ }
+ ]
+ },
+ {
+ "initialization":[],
+ "precond":"",
+ "type":"single",
+ "caption":"I think that Apple products are more secure and resistant to malware attacks.",
+ "choice":[
+ {
+ "caption":"yes",
+ "setp":[
+ {
+ "c":"",
+ "s":"score = + score + 2"
+ }
+ ],
+ "setn":[]
+ },
+ {
+ "caption":"no",
+ "setp":[
+ {
+ "c":"",
+ "s":"score = + score - 2"
+ }
+ ],
+ "setn":[]
+ }
+ ]
+ },
+ {
+ "initialization":[],
+ "precond":"",
+ "type":"single",
+ "caption":"I am an Apple fanboy/fangirl.",
+ "choice":[
+ {
+ "caption":"yes",
+ "setp":[
+ {
+ "c":"",
+ "s":"score = + score + 1"
+ }
+ ],
+ "setn":[]
+ },
+ {
+ "caption":"no",
+ "setp":[
+ {
+ "c":"",
+ "s":"score = + score - 1"
+ }
+ ],
+ "setn":[]
+ }
+ ]
+ }
+ ],
+ "verdict":[
+ {
+ "caption":"<h2>Apple Hater.</h2><p>This world needs more sanity like you.</p>",
+ "precond":"| score lt -4"
+ },
+ {
+ "caption":"<h2>What Apple?</h2><p>Just stay this way.</p>",
+ "precond":"| score geq -4 & score lt 4"
+ },
+ {
+ "caption":"<h2>Apple Adorer.</h2><p>No.</p>",
+ "precond":"| score geq 4 & score lt 7"
+ },
+ {
+ "caption":"<h2>Apple Fan.</h2><p>Stop it. Get some help.</p><p><a href=\"https://youtu.be/fkkDvKGcNSo?t=1081\">https://youtu.be/fkkDvKGcNSo?t=1081</a></p>",
+ "precond":"| score geq 7 & score lt 20"
+ },
+ {
+ "caption":"<h2>Incurable Apple Fan.</h2><p>Fuck off. Nothing will help.</p>",
+ "precond":"| score geq 20"
+ }
+ ]
+}
diff --git a/blog/data/poll.js b/blog/data/poll.js
new file mode 100644
index 0000000..55b4e22
--- /dev/null
+++ b/blog/data/poll.js
@@ -0,0 +1,171 @@
+//By Chris Xiong, 2018
+//License: Expat
+let p=null;
+let Caption;
+let Choices;
+let Score;
+let Next;
+let values=[];
+let curq;
+function evalexpr(e)
+{
+ let ret=0;
+ let op=function(a,o,b){
+ switch(o){
+ case '+':return a+b;
+ case '-':return a-b;
+ case '*':return a*b;
+ case '/':return a/b;
+ }
+ };
+ for(let p=e.match(/[+\-*\/]/);p;p=e.match(/[+\-*\/]/))
+ {
+ let vp=e.match(/[A-Za-z]\w*/);
+ if(vp)
+ {
+ const v=vp[0];
+ if(values[v]===undefined)throw 'shit';
+ ret=op(ret,p[0],values[v]);
+ e=e.substr(vp.index+vp[0].length);
+ }
+ else
+ {
+ let np=e.match(/\d+(.\d*)?/);
+ if(np)
+ {
+ const n=Number(np[0]);
+ ret=op(ret,p[0],n);
+ e=e.substr(np.index+np[0].length);
+ }else throw 'shit';
+ }
+ }
+ return ret;
+}
+function evalsetexpr(e)
+{
+ const s=e.split('=');
+ if(s.length<2)throw 'shit';
+ values[s[0].trim()]=evalexpr(s[1]);
+}
+function evaltestexpr(e)
+{
+ const m=e.match(/([A-Za-z]\w*)\s*(leq|geq|lt|gt)\s*([A-Za-z0-9.]*)/);
+ if(!m)throw 'shit';
+ const v=m[1],op=m[2],vr=m[3];
+ const vv=values[v];
+ const vvr=isNaN(Number(vr))?values[vr]:Number(vr);
+ if(vv===undefined||vvr===undefined)throw 'shit';
+ switch(op.trim())
+ {
+ case 'leq':return vv<=vvr;
+ case 'geq':return vv>=vvr;
+ case 'lt':return vv<vvr;
+ case 'gt':return vv>vvr;
+ }
+ throw 'shit';
+}
+function evalcondexpr(e)
+{
+ if(!e.trim().length)return true;
+ let ret=false;
+ let op=function(a,o,b){
+ switch(o){
+ case '|':return a||b;
+ case '&':return a&&b;
+ }
+ };
+ for(let p=e.search(/[|&]/);p!=-1;p=e.search(/[|&]/))
+ {
+ let np=e.substr(p+1).search(/[|&]/);
+ let n=e.substr(p+1,np!=-1?np-1:undefined);
+ ret=op(ret,e[p],evaltestexpr(n.trim()));
+ e=np?e.substr(np):"";
+ }
+ return ret;
+}
+function initq()
+{
+ const q=p.question[curq];
+ for(let i=0;i<q.initialization.length;++i)
+ {
+ if(evalcondexpr(q.initialization[i].c))
+ evalsetexpr(q.initialization[i].s);
+ }
+ if(!evalcondexpr(q.precond)){++curq;if(curq<p.question.length)initq();else finalize();}
+}
+function evalq()
+{
+ if(curq>=p.question.length)return;
+ const q=p.question[curq];
+ let seln=0;
+ for(let i=0;i<q.choice.length;++i)
+ {
+ const e=document.getElementById(`choice${i}`);
+ if(e.checked)++seln;
+ if(e.checked)
+ {
+ for(let j=0;j<q.choice[i].setp.length;++j)
+ if(evalcondexpr(q.choice[i].setp[j].c))
+ evalsetexpr(q.choice[i].setp[j].s);
+ }
+ else
+ {
+ for(let j=0;j<q.choice[i].setn.length;++j)
+ if(evalcondexpr(q.choice[i].setn[j].c))
+ evalsetexpr(q.choice[i].setn[j].s);
+ }
+ }
+ if(!seln&&q.type=='single'){alert('Wanna cheat?...');return;}
+ ++curq;
+ if(curq==p.question.length)finalize();else{showq();initq();}
+}
+function showq()
+{
+ const q=p.question[curq];
+ Caption.innerHTML=q.caption;
+ while(Choices.firstChild)Choices.removeChild(Choices.firstChild);
+ for(let i=0;i<q.choice.length;++i)
+ {
+ const d=document.createElement('div');
+ const e=document.createElement('input');
+ e.type=q.type=='multi'?'checkbox':'radio';
+ e.innerHTML=q.choice[i].caption;
+ e.qid=i;e.id=`choice${i}`;
+ e.setAttribute('name','choice');
+ e.classList.add('check');
+ const l=document.createElement('label');
+ l.innerHTML=q.choice[i].caption;
+ l.setAttribute('for',e.id);
+ d.appendChild(e);
+ d.appendChild(l);
+ Choices.appendChild(d);
+ }
+ Score.innerHTML=`${values['score']}, Question ${curq+1}/${p.question.length}`;
+}
+function _init()
+{
+ Caption=document.getElementById('qcaption');
+ Choices=document.getElementById('qchoices');
+ Score=document.getElementById('score');
+ Next=document.getElementById('nextbtn');
+ curq=0;values['score']=0;
+ initq();showq();
+}
+async function init()
+{
+ const resp=await fetch(new Request('/blog/data/applefan.json'));
+ r=await resp.text();
+ p=JSON.parse(r);
+ _init();
+}
+function finalize()
+{
+ Next.style.color='#888';
+ Score.innerHTML=`${values['score']}, Question ${p.question.length}/${p.question.length}`;
+ Caption.innerHTML='';
+ Choices.innerHTML='';
+ for(let i=0;i<p.verdict.length;++i)
+ if(evalcondexpr(p.verdict[i].precond))
+ Caption.innerHTML+=p.verdict[i].caption;
+}
+init();
diff --git a/blog/decryptor.js b/blog/decryptor.js
new file mode 100644
index 0000000..c37aa42
--- /dev/null
+++ b/blog/decryptor.js
@@ -0,0 +1,84 @@
+//License: Expat(MIT)
+//Chrisoft Xiong 2017-2018
+var decid;
+function decryptui(id)
+{
+ document.getElementById("decryptui").style.display="block";
+ document.getElementById("keyinp").focus();
+ setTimeout(function(){document.getElementById("decryptui").style.opacity="1";},20);
+ decid=id;
+ document.getElementById("keyhint").innerHTML="Hint: "+document.querySelector(`encrypted[enid="${id}"]`).getAttribute("hint");
+ document.getElementById("keyinp").onkeypress=function(e){if(e.keyCode==13)document.getElementById('btndecrypt').click();}
+}
+function hidedecryptui()
+{
+ document.getElementById("decryptui").style.opacity="0";
+ setTimeout(function(){
+ document.getElementById("decryptui").style.display="none";
+ document.getElementById("keyinp").value="";
+ },500);
+}
+function _decrypt(id,ctr)
+{
+ const aes=aesjs,sha256=Sha256;
+ const e=document.querySelector(`encrypted[enid="${id}"]`);
+ const cont=e.getAttribute("encont");
+ const bc=atob(cont);
+ const b=new Array(bc.length);
+ for(var i=0;i<bc.length;++i)b[i]=bc.charCodeAt(i);
+ const deccont=ctr.decrypt(b);
+ const hash=sha256.hash(aes.utils.hex.fromBytes(deccont),{msgFormat:'hex-bytes'})
+ if(hash!=e.getAttribute("hash"))return false;
+ e.innerHTML=aes.utils.utf8.fromBytes(deccont);
+ e.removeAttribute("encont");
+ return true;
+}
+function _memokey(id,enk)
+{
+ try
+ {
+ const os=localStorage.getItem(`blogkeys${window.location.pathname}`);
+ const o=os&&os.length?JSON.parse(os):[];
+ o[Number(id)]=enk;
+ localStorage.setItem(`blogkeys${window.location.pathname}`,JSON.stringify(o));
+ }catch(e){console.warn(`local storage failed: ${e}`);}
+}
+async function decryptor(id,key)
+{
+ const aes=aesjs,sha256=Sha256;
+ const keyu8=aes.utils.utf8.toBytes(document.getElementById("keyinp").value);
+ const saltu8=aes.utils.utf8.toBytes('hellwhymustiaddsalttothiscrap');
+ const enckey=await new Promise(
+ (resolv,rej)=>
+ {scrypt(keyu8,saltu8,1024,16,2,32,(e,p,k)=>{e?rej(e):k?resolv(k):undefined;});}
+ );
+ const ctr=new aes.ModeOfOperation.ctr(enckey);
+ if(!_decrypt(id,ctr))
+ {
+ alert("The decryption key you have entered could be wrong, please try again.");
+ return;
+ }
+ _memokey(id,enckey);
+ for(let i of document.querySelectorAll('encrypted[encont]'))
+ if(_decrypt(i.getAttribute('enid'),ctr))_memokey(i.getAttribute('enid'),enckey);
+ footnoter();document.getElementById('purgep').style.display='';
+ hidedecryptui();
+}
+function _purgep()
+{
+ try{localStorage.removeItem(`blogkeys${window.location.pathname}`);}
+ catch(e){}
+ location.reload(true);
+}
+function _decryptonload()
+{
+ let o;
+ try
+ {
+ const os=localStorage.getItem(`blogkeys${window.location.pathname}`);
+ o=os&&os.length?JSON.parse(os):[];
+ }catch(e){console.warn(`local storage failed: ${e}`);}
+ for(let i of o.entries())
+ if(i[1]&&i[1].length)_decrypt(Number(i[0]).toString(),new aesjs.ModeOfOperation.ctr(i[1]));
+ if(o.length){footnoter();document.getElementById('purgep').style.display='';}
+}
diff --git a/blog/footnoter.js b/blog/footnoter.js
new file mode 100644
index 0000000..a1b2d8b
--- /dev/null
+++ b/blog/footnoter.js
@@ -0,0 +1,24 @@
+//License: MIT
+//Chrisoft Xiong 2017
+var starting=0;
+function footnoter()
+{
+ var footnotes=document.body.getElementsByTagName("footnote");
+ for(var i=0;i<footnotes.length;++i)
+ {
+ var s=footnotes[i].innerHTML;
+ footnotes[i].innerHTML="";//IE is stupid
+ var a=document.createElement("a");
+ a.setAttribute("id","n"+(starting+i+1));
+ a.setAttribute("href","#note"+(starting+i+1));
+ a.setAttribute("class","note");
+ a.innerHTML="["+(starting+i+1)+"]";
+ footnotes[i].parentNode.insertBefore(a,footnotes[i]);
+ var span=document.createElement("span");
+ span.setAttribute("class","TText");
+ span.innerHTML="<a id=\"note"+(starting+i+1)+"\" href=\"#n"+(starting+i+1)+"\">["+(starting+i+1)+"]</a>: "+s+"<br>";
+ document.getElementById("notediv").appendChild(span);
+ }
+ starting+=footnotes.length;
+ while(footnotes.length)footnotes[0].remove();
+}
diff --git a/blog/list/.htaccess b/blog/list/.htaccess
new file mode 100644
index 0000000..2651228
--- /dev/null
+++ b/blog/list/.htaccess
@@ -0,0 +1 @@
+Header set Cache-Control no-cache
diff --git a/blog/list/0.html b/blog/list/0.html
new file mode 100644
index 0000000..695bd93
--- /dev/null
+++ b/blog/list/0.html
@@ -0,0 +1,123 @@
+<html><head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<meta name="theme-color" content="#000000">
+<title>Chrisoft::Blog</title>
+<script type="text/javascript" src="/panel.js"></script>
+<link rel="stylesheet" type="text/css" href="/common.css">
+<link rel="stylesheet" type="text/css" href="/panel.css">
+<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
+<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
+<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
+<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
+<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
+<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
+<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
+<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
+<link rel="stylesheet" type="text/css" href="/blog/blogext.css">
+<script>
+function ol()
+{
+ window.onresize=function()
+ {
+ if(window.innerWidth<768)
+ setupevents();
+ else unsetevents();
+ }
+ window.onresize();
+}
+function loadTheme(){
+ var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
+ if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
+ var ent="";
+ var d=new Date();
+ if(thm[0]=='z')
+ {
+ var m=d.getMonth()+1;
+ if(m>=3&&m<6)thm='0'+thm[1];
+ else if(m>=6&&m<9)thm='1'+thm[1];
+ else if(m>=9&&m<12)thm='2'+thm[1];
+ else thm='3'+thm[1];
+ }
+ if(thm[1]=='z')
+ {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
+ ent=`theme${thm}`;
+ var R=new RegExp('theme[0-4][ab]');
+ for(var i=0;i<document.styleSheets.length;++i)
+ {
+ if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
+ document.styleSheets[i].disabled=true;
+ else document.styleSheets[i].disabled=false;
+ }
+ var thmcolor="";
+ switch(thm[0])
+ {
+ case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break;
+ case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break;
+ case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break;
+ case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break;
+ }
+ document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor);
+}
+loadTheme();
+</script>
+</head>
+<body onload="ol()" style="overflow-x:hidden;">
+ <div id="panel" class="TText">
+ <ul id="panellist">
+ <li><a href="/"><h1>Chrisoft</h1></a></li>
+ <li><a href="/blog"><h2>Blog</h2></a></li>
+ <li><span>Tags filter</span>
+ <ul id="tagslist">
+
+
+ <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul>
+ </li>
+ </ul>
+ </div>
+ <div id="content">
+ <div id="postslist">
+
+ <div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/TOP.html">Readme_en</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#garbage</span>
+ <span class="right" id="">2016-02-13/2018-10-11</span></div>
+ </div><div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2018-12-06.html">小米 MIX 3 上手体验</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#device-review #hands-on</span>
+ <span class="right" id="">2018-12-06/2018-12-12</span></div>
+ </div><div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2018-10-11.html">The stupid blogging system evolved!</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#web #devel #js</span>
+ <span class="right" id="">2018-10-11/2018-10-11</span></div>
+ </div><div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2018-06-07.html">Should this site still be alive by 2035...</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#sophistry #garbage</span>
+ <span class="right" id="">2018-06-07/2018-10-11</span></div>
+ </div><div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2018-06-05.html">Software Project Management in the Free Software World</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#sophistry</span>
+ <span class="right" id="">2018-06-05/2018-10-16</span></div>
+ </div></div>
+ <div id="insanch" style="height:5em;"></div>
+ <div id="footer">
+ <div id="pagesw" class="TText" style="display:table;width:100%;padding:1em 0;">
+ <span style="display:table-cell;"><a id="prepage" href="#">&lt;&lt;</a></span>
+ <span style="text-align:center;display:table-cell;" id="page">1/9</span>
+ <span style="text-align:right;display:table-cell;"><a id="nexpage" href="/blog/list/1.html">&gt;&gt;</a></span>
+ </div>
+ <div style="text-align:center;" class="TText">
+ Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5
+ <br>
+ Content licensed under CC BY-SA 4.0.
+ </div>
+ </div>
+ </div>
+
+
+</body></html> \ No newline at end of file
diff --git a/blog/list/1.html b/blog/list/1.html
new file mode 100644
index 0000000..0a85605
--- /dev/null
+++ b/blog/list/1.html
@@ -0,0 +1,123 @@
+<html><head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<meta name="theme-color" content="#000000">
+<title>Chrisoft::Blog</title>
+<script type="text/javascript" src="/panel.js"></script>
+<link rel="stylesheet" type="text/css" href="/common.css">
+<link rel="stylesheet" type="text/css" href="/panel.css">
+<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
+<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
+<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
+<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
+<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
+<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
+<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
+<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
+<link rel="stylesheet" type="text/css" href="/blog/blogext.css">
+<script>
+function ol()
+{
+ window.onresize=function()
+ {
+ if(window.innerWidth<768)
+ setupevents();
+ else unsetevents();
+ }
+ window.onresize();
+}
+function loadTheme(){
+ var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
+ if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
+ var ent="";
+ var d=new Date();
+ if(thm[0]=='z')
+ {
+ var m=d.getMonth()+1;
+ if(m>=3&&m<6)thm='0'+thm[1];
+ else if(m>=6&&m<9)thm='1'+thm[1];
+ else if(m>=9&&m<12)thm='2'+thm[1];
+ else thm='3'+thm[1];
+ }
+ if(thm[1]=='z')
+ {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
+ ent=`theme${thm}`;
+ var R=new RegExp('theme[0-4][ab]');
+ for(var i=0;i<document.styleSheets.length;++i)
+ {
+ if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
+ document.styleSheets[i].disabled=true;
+ else document.styleSheets[i].disabled=false;
+ }
+ var thmcolor="";
+ switch(thm[0])
+ {
+ case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break;
+ case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break;
+ case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break;
+ case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break;
+ }
+ document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor);
+}
+loadTheme();
+</script>
+</head>
+<body onload="ol()" style="overflow-x:hidden;">
+ <div id="panel" class="TText">
+ <ul id="panellist">
+ <li><a href="/"><h1>Chrisoft</h1></a></li>
+ <li><a href="/blog"><h2>Blog</h2></a></li>
+ <li><span>Tags filter</span>
+ <ul id="tagslist">
+
+
+ <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul>
+ </li>
+ </ul>
+ </div>
+ <div id="content">
+ <div id="postslist">
+
+ <div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2018-05-18.html">Ideology vs Pragmatism &amp;c.</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#sophistry #garbage</span>
+ <span class="right" id="">2018-05-18/2018-10-11</span></div>
+ </div><div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2018-05-08.html">Respecting your job</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#sophistry #garbage #acmicpc</span>
+ <span class="right" id="">2018-05-08/2018-10-11</span></div>
+ </div><div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2018-05-03.html">Are you an Apple fanboy/fangirl?</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#garbage #interactive</span>
+ <span class="right" id="">2018-05-03/2019-02-10</span></div>
+ </div><div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2018-04-22.html">ICPC类比赛中计算几何问题之「乱象」</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#garbage #acmicpc</span>
+ <span class="right" id="">2018-04-22/2018-10-11</span></div>
+ </div><div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2018-04-17.html">The "Deepin is spyware" problem</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#linux #garbage #sophistry</span>
+ <span class="right" id="">2018-04-17/2018-10-11</span></div>
+ </div></div>
+ <div id="insanch" style="height:5em;"></div>
+ <div id="footer">
+ <div id="pagesw" class="TText" style="display:table;width:100%;padding:1em 0;">
+ <span style="display:table-cell;"><a id="prepage" href="/blog/list/0.html">&lt;&lt;</a></span>
+ <span style="text-align:center;display:table-cell;" id="page">2/9</span>
+ <span style="text-align:right;display:table-cell;"><a id="nexpage" href="/blog/list/2.html">&gt;&gt;</a></span>
+ </div>
+ <div style="text-align:center;" class="TText">
+ Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5
+ <br>
+ Content licensed under CC BY-SA 4.0.
+ </div>
+ </div>
+ </div>
+
+
+</body></html> \ No newline at end of file
diff --git a/blog/list/2.html b/blog/list/2.html
new file mode 100644
index 0000000..2fff79c
--- /dev/null
+++ b/blog/list/2.html
@@ -0,0 +1,123 @@
+<html><head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<meta name="theme-color" content="#000000">
+<title>Chrisoft::Blog</title>
+<script type="text/javascript" src="/panel.js"></script>
+<link rel="stylesheet" type="text/css" href="/common.css">
+<link rel="stylesheet" type="text/css" href="/panel.css">
+<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
+<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
+<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
+<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
+<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
+<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
+<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
+<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
+<link rel="stylesheet" type="text/css" href="/blog/blogext.css">
+<script>
+function ol()
+{
+ window.onresize=function()
+ {
+ if(window.innerWidth<768)
+ setupevents();
+ else unsetevents();
+ }
+ window.onresize();
+}
+function loadTheme(){
+ var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
+ if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
+ var ent="";
+ var d=new Date();
+ if(thm[0]=='z')
+ {
+ var m=d.getMonth()+1;
+ if(m>=3&&m<6)thm='0'+thm[1];
+ else if(m>=6&&m<9)thm='1'+thm[1];
+ else if(m>=9&&m<12)thm='2'+thm[1];
+ else thm='3'+thm[1];
+ }
+ if(thm[1]=='z')
+ {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
+ ent=`theme${thm}`;
+ var R=new RegExp('theme[0-4][ab]');
+ for(var i=0;i<document.styleSheets.length;++i)
+ {
+ if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
+ document.styleSheets[i].disabled=true;
+ else document.styleSheets[i].disabled=false;
+ }
+ var thmcolor="";
+ switch(thm[0])
+ {
+ case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break;
+ case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break;
+ case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break;
+ case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break;
+ }
+ document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor);
+}
+loadTheme();
+</script>
+</head>
+<body onload="ol()" style="overflow-x:hidden;">
+ <div id="panel" class="TText">
+ <ul id="panellist">
+ <li><a href="/"><h1>Chrisoft</h1></a></li>
+ <li><a href="/blog"><h2>Blog</h2></a></li>
+ <li><span>Tags filter</span>
+ <ul id="tagslist">
+
+
+ <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul>
+ </li>
+ </ul>
+ </div>
+ <div id="content">
+ <div id="postslist">
+
+ <div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2018-03-17.html">Some rants on SMELT, QMidiPlayer and Virtools</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#devel #qmidiplayer #opengl</span>
+ <span class="right" id="">2018-03-17/2018-10-11</span></div>
+ </div><div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2018-02-05.html">Does gaming make me merrier &amp; more relaxed or the opposite?</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#garbage</span>
+ <span class="right" id="">2018-02-05/2018-10-11</span></div>
+ </div><div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2018-01-07.html">Trash dump for the fifth semester</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#garbage #daily-life</span>
+ <span class="right" id="">2018-01-07/2018-10-30</span></div>
+ </div><div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2018-01-05.html">Now using reverse proxy to deliver content</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#web #random-xp</span>
+ <span class="right" id="">2018-01-05/2018-10-11</span></div>
+ </div><div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2017-12-21.html">为什么我<i>就是不</i>使用Mac</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#garbage #device-review</span>
+ <span class="right" id="">2017-12-21/2018-10-11</span></div>
+ </div></div>
+ <div id="insanch" style="height:5em;"></div>
+ <div id="footer">
+ <div id="pagesw" class="TText" style="display:table;width:100%;padding:1em 0;">
+ <span style="display:table-cell;"><a id="prepage" href="/blog/list/1.html">&lt;&lt;</a></span>
+ <span style="text-align:center;display:table-cell;" id="page">3/9</span>
+ <span style="text-align:right;display:table-cell;"><a id="nexpage" href="/blog/list/3.html">&gt;&gt;</a></span>
+ </div>
+ <div style="text-align:center;" class="TText">
+ Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5
+ <br>
+ Content licensed under CC BY-SA 4.0.
+ </div>
+ </div>
+ </div>
+
+
+</body></html> \ No newline at end of file
diff --git a/blog/list/3.html b/blog/list/3.html
new file mode 100644
index 0000000..0332836
--- /dev/null
+++ b/blog/list/3.html
@@ -0,0 +1,123 @@
+<html><head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<meta name="theme-color" content="#000000">
+<title>Chrisoft::Blog</title>
+<script type="text/javascript" src="/panel.js"></script>
+<link rel="stylesheet" type="text/css" href="/common.css">
+<link rel="stylesheet" type="text/css" href="/panel.css">
+<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
+<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
+<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
+<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
+<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
+<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
+<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
+<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
+<link rel="stylesheet" type="text/css" href="/blog/blogext.css">
+<script>
+function ol()
+{
+ window.onresize=function()
+ {
+ if(window.innerWidth<768)
+ setupevents();
+ else unsetevents();
+ }
+ window.onresize();
+}
+function loadTheme(){
+ var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
+ if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
+ var ent="";
+ var d=new Date();
+ if(thm[0]=='z')
+ {
+ var m=d.getMonth()+1;
+ if(m>=3&&m<6)thm='0'+thm[1];
+ else if(m>=6&&m<9)thm='1'+thm[1];
+ else if(m>=9&&m<12)thm='2'+thm[1];
+ else thm='3'+thm[1];
+ }
+ if(thm[1]=='z')
+ {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
+ ent=`theme${thm}`;
+ var R=new RegExp('theme[0-4][ab]');
+ for(var i=0;i<document.styleSheets.length;++i)
+ {
+ if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
+ document.styleSheets[i].disabled=true;
+ else document.styleSheets[i].disabled=false;
+ }
+ var thmcolor="";
+ switch(thm[0])
+ {
+ case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break;
+ case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break;
+ case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break;
+ case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break;
+ }
+ document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor);
+}
+loadTheme();
+</script>
+</head>
+<body onload="ol()" style="overflow-x:hidden;">
+ <div id="panel" class="TText">
+ <ul id="panellist">
+ <li><a href="/"><h1>Chrisoft</h1></a></li>
+ <li><a href="/blog"><h2>Blog</h2></a></li>
+ <li><span>Tags filter</span>
+ <ul id="tagslist">
+
+
+ <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul>
+ </li>
+ </ul>
+ </div>
+ <div id="content">
+ <div id="postslist">
+
+ <div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2017-11-25.html">A short post on Cakewalk's death and my music production</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#music #garbage</span>
+ <span class="right" id="">2017-11-25/2018-10-11</span></div>
+ </div><div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2017-06-29.html">Trash dump for the fourth semester</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#garbage #daily-life</span>
+ <span class="right" id="">2017-06-29/2018-10-11</span></div>
+ </div><div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2017-06-09.html">Fuck Windows et cetera</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#daily-life</span>
+ <span class="right" id="">2017-06-08/2018-10-11</span></div>
+ </div><div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2017-05-08.html">2017省赛流水帐</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#contest #acmicpc</span>
+ <span class="right" id="">2017-05-08/2018-10-11</span></div>
+ </div><div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2017-04-11.html">SBS 2.0 is now the default blog browser</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#devel #web</span>
+ <span class="right" id="">2017-04-11/2018-10-11</span></div>
+ </div></div>
+ <div id="insanch" style="height:5em;"></div>
+ <div id="footer">
+ <div id="pagesw" class="TText" style="display:table;width:100%;padding:1em 0;">
+ <span style="display:table-cell;"><a id="prepage" href="/blog/list/2.html">&lt;&lt;</a></span>
+ <span style="text-align:center;display:table-cell;" id="page">4/9</span>
+ <span style="text-align:right;display:table-cell;"><a id="nexpage" href="/blog/list/4.html">&gt;&gt;</a></span>
+ </div>
+ <div style="text-align:center;" class="TText">
+ Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5
+ <br>
+ Content licensed under CC BY-SA 4.0.
+ </div>
+ </div>
+ </div>
+
+
+</body></html> \ No newline at end of file
diff --git a/blog/list/4.html b/blog/list/4.html
new file mode 100644
index 0000000..4841408
--- /dev/null
+++ b/blog/list/4.html
@@ -0,0 +1,123 @@
+<html><head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<meta name="theme-color" content="#000000">
+<title>Chrisoft::Blog</title>
+<script type="text/javascript" src="/panel.js"></script>
+<link rel="stylesheet" type="text/css" href="/common.css">
+<link rel="stylesheet" type="text/css" href="/panel.css">
+<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
+<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
+<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
+<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
+<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
+<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
+<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
+<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
+<link rel="stylesheet" type="text/css" href="/blog/blogext.css">
+<script>
+function ol()
+{
+ window.onresize=function()
+ {
+ if(window.innerWidth<768)
+ setupevents();
+ else unsetevents();
+ }
+ window.onresize();
+}
+function loadTheme(){
+ var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
+ if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
+ var ent="";
+ var d=new Date();
+ if(thm[0]=='z')
+ {
+ var m=d.getMonth()+1;
+ if(m>=3&&m<6)thm='0'+thm[1];
+ else if(m>=6&&m<9)thm='1'+thm[1];
+ else if(m>=9&&m<12)thm='2'+thm[1];
+ else thm='3'+thm[1];
+ }
+ if(thm[1]=='z')
+ {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
+ ent=`theme${thm}`;
+ var R=new RegExp('theme[0-4][ab]');
+ for(var i=0;i<document.styleSheets.length;++i)
+ {
+ if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
+ document.styleSheets[i].disabled=true;
+ else document.styleSheets[i].disabled=false;
+ }
+ var thmcolor="";
+ switch(thm[0])
+ {
+ case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break;
+ case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break;
+ case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break;
+ case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break;
+ }
+ document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor);
+}
+loadTheme();
+</script>
+</head>
+<body onload="ol()" style="overflow-x:hidden;">
+ <div id="panel" class="TText">
+ <ul id="panellist">
+ <li><a href="/"><h1>Chrisoft</h1></a></li>
+ <li><a href="/blog"><h2>Blog</h2></a></li>
+ <li><span>Tags filter</span>
+ <ul id="tagslist">
+
+
+ <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul>
+ </li>
+ </ul>
+ </div>
+ <div id="content">
+ <div id="postslist">
+
+ <div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2017-02-13.html">[多大图警告]ls /dev</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#device-review</span>
+ <span class="right" id="">2017-02-13/2018-12-09</span></div>
+ </div><div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2017-01-18.html">Trash dump for the third semester</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#garbage #daily-life</span>
+ <span class="right" id="">2017-01-09/2018-10-11</span></div>
+ </div><div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2017-01-09.html">[多大图警告]终究还是改不了修电脑的命</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#computer-repairing #garbage</span>
+ <span class="right" id="">2017-01-09/2018-10-11</span></div>
+ </div><div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2016-09-24.html">2-in-1</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#devel #qmidiplayer #c++ #qt</span>
+ <span class="right" id="">2016-09-24/2018-10-11</span></div>
+ </div><div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2016-06-21.html">Trash dump for the first academic year</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#garbage #daily-life</span>
+ <span class="right" id="">2016-06-21/2018-10-11</span></div>
+ </div></div>
+ <div id="insanch" style="height:5em;"></div>
+ <div id="footer">
+ <div id="pagesw" class="TText" style="display:table;width:100%;padding:1em 0;">
+ <span style="display:table-cell;"><a id="prepage" href="/blog/list/3.html">&lt;&lt;</a></span>
+ <span style="text-align:center;display:table-cell;" id="page">5/9</span>
+ <span style="text-align:right;display:table-cell;"><a id="nexpage" href="/blog/list/5.html">&gt;&gt;</a></span>
+ </div>
+ <div style="text-align:center;" class="TText">
+ Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5
+ <br>
+ Content licensed under CC BY-SA 4.0.
+ </div>
+ </div>
+ </div>
+
+
+</body></html> \ No newline at end of file
diff --git a/blog/list/5.html b/blog/list/5.html
new file mode 100644
index 0000000..ef9e015
--- /dev/null
+++ b/blog/list/5.html
@@ -0,0 +1,123 @@
+<html><head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<meta name="theme-color" content="#000000">
+<title>Chrisoft::Blog</title>
+<script type="text/javascript" src="/panel.js"></script>
+<link rel="stylesheet" type="text/css" href="/common.css">
+<link rel="stylesheet" type="text/css" href="/panel.css">
+<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
+<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
+<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
+<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
+<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
+<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
+<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
+<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
+<link rel="stylesheet" type="text/css" href="/blog/blogext.css">
+<script>
+function ol()
+{
+ window.onresize=function()
+ {
+ if(window.innerWidth<768)
+ setupevents();
+ else unsetevents();
+ }
+ window.onresize();
+}
+function loadTheme(){
+ var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
+ if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
+ var ent="";
+ var d=new Date();
+ if(thm[0]=='z')
+ {
+ var m=d.getMonth()+1;
+ if(m>=3&&m<6)thm='0'+thm[1];
+ else if(m>=6&&m<9)thm='1'+thm[1];
+ else if(m>=9&&m<12)thm='2'+thm[1];
+ else thm='3'+thm[1];
+ }
+ if(thm[1]=='z')
+ {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
+ ent=`theme${thm}`;
+ var R=new RegExp('theme[0-4][ab]');
+ for(var i=0;i<document.styleSheets.length;++i)
+ {
+ if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
+ document.styleSheets[i].disabled=true;
+ else document.styleSheets[i].disabled=false;
+ }
+ var thmcolor="";
+ switch(thm[0])
+ {
+ case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break;
+ case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break;
+ case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break;
+ case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break;
+ }
+ document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor);
+}
+loadTheme();
+</script>
+</head>
+<body onload="ol()" style="overflow-x:hidden;">
+ <div id="panel" class="TText">
+ <ul id="panellist">
+ <li><a href="/"><h1>Chrisoft</h1></a></li>
+ <li><a href="/blog"><h2>Blog</h2></a></li>
+ <li><span>Tags filter</span>
+ <ul id="tagslist">
+
+
+ <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul>
+ </li>
+ </ul>
+ </div>
+ <div id="content">
+ <div id="postslist">
+
+ <div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2016-05-12.html">ThinkPad X1 Yoga初体验</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#device-review</span>
+ <span class="right" id="">2016-05-12/2018-10-11</span></div>
+ </div><div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2016-04-09.html">The MIDI File Format Specification and MIDI Implementation in QMidiPlayer</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#devel #qmidiplayer #midi</span>
+ <span class="right" id="">2016-04-09/2018-10-11</span></div>
+ </div><div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2016-03-26.html">ACM校赛水题组酱油记</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#contest #acmicpc</span>
+ <span class="right" id="">2016-03-26/2018-10-11</span></div>
+ </div><div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2016-02-18.html">Cross Noodles Recooked</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#devel #js #webgl</span>
+ <span class="right" id="">2016-02-18/2018-10-11</span></div>
+ </div><div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2016-02-14.html">Why Do I Prefer a Computer over a Girlfriend/<s>(Boyfriend)</s></a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#sophistry</span>
+ <span class="right" id="">2016-02-14/2018-10-11</span></div>
+ </div></div>
+ <div id="insanch" style="height:5em;"></div>
+ <div id="footer">
+ <div id="pagesw" class="TText" style="display:table;width:100%;padding:1em 0;">
+ <span style="display:table-cell;"><a id="prepage" href="/blog/list/4.html">&lt;&lt;</a></span>
+ <span style="text-align:center;display:table-cell;" id="page">6/9</span>
+ <span style="text-align:right;display:table-cell;"><a id="nexpage" href="/blog/list/6.html">&gt;&gt;</a></span>
+ </div>
+ <div style="text-align:center;" class="TText">
+ Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5
+ <br>
+ Content licensed under CC BY-SA 4.0.
+ </div>
+ </div>
+ </div>
+
+
+</body></html> \ No newline at end of file
diff --git a/blog/list/6.html b/blog/list/6.html
new file mode 100644
index 0000000..8a68ee2
--- /dev/null
+++ b/blog/list/6.html
@@ -0,0 +1,123 @@
+<html><head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<meta name="theme-color" content="#000000">
+<title>Chrisoft::Blog</title>
+<script type="text/javascript" src="/panel.js"></script>
+<link rel="stylesheet" type="text/css" href="/common.css">
+<link rel="stylesheet" type="text/css" href="/panel.css">
+<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
+<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
+<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
+<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
+<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
+<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
+<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
+<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
+<link rel="stylesheet" type="text/css" href="/blog/blogext.css">
+<script>
+function ol()
+{
+ window.onresize=function()
+ {
+ if(window.innerWidth<768)
+ setupevents();
+ else unsetevents();
+ }
+ window.onresize();
+}
+function loadTheme(){
+ var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
+ if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
+ var ent="";
+ var d=new Date();
+ if(thm[0]=='z')
+ {
+ var m=d.getMonth()+1;
+ if(m>=3&&m<6)thm='0'+thm[1];
+ else if(m>=6&&m<9)thm='1'+thm[1];
+ else if(m>=9&&m<12)thm='2'+thm[1];
+ else thm='3'+thm[1];
+ }
+ if(thm[1]=='z')
+ {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
+ ent=`theme${thm}`;
+ var R=new RegExp('theme[0-4][ab]');
+ for(var i=0;i<document.styleSheets.length;++i)
+ {
+ if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
+ document.styleSheets[i].disabled=true;
+ else document.styleSheets[i].disabled=false;
+ }
+ var thmcolor="";
+ switch(thm[0])
+ {
+ case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break;
+ case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break;
+ case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break;
+ case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break;
+ }
+ document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor);
+}
+loadTheme();
+</script>
+</head>
+<body onload="ol()" style="overflow-x:hidden;">
+ <div id="panel" class="TText">
+ <ul id="panellist">
+ <li><a href="/"><h1>Chrisoft</h1></a></li>
+ <li><a href="/blog"><h2>Blog</h2></a></li>
+ <li><span>Tags filter</span>
+ <ul id="tagslist">
+
+
+ <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul>
+ </li>
+ </ul>
+ </div>
+ <div id="content">
+ <div id="postslist">
+
+ <div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2016-01-25.html">放假...</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#daily-life</span>
+ <span class="right" id="">2016-01-25/2018-10-11</span></div>
+ </div><div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2016-01-16.html">QMidiPlayer Progress-2016-01-16</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#devel #qmidiplayer</span>
+ <span class="right" id="">2016-01-16/2018-10-11</span></div>
+ </div><div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2016-01-03.html">The Design and The Real Product</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#devel #design</span>
+ <span class="right" id="">2016-01-03/2018-10-11</span></div>
+ </div><div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2015-12-27.html">QMidiPlayer got its repo</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#devel #qmidiplayer</span>
+ <span class="right" id="">2015-12-27/2018-10-11</span></div>
+ </div><div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2015-12-23.html">Chris' First Development Blog</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#devel</span>
+ <span class="right" id="">2015-12-23/2018-10-11</span></div>
+ </div></div>
+ <div id="insanch" style="height:5em;"></div>
+ <div id="footer">
+ <div id="pagesw" class="TText" style="display:table;width:100%;padding:1em 0;">
+ <span style="display:table-cell;"><a id="prepage" href="/blog/list/5.html">&lt;&lt;</a></span>
+ <span style="text-align:center;display:table-cell;" id="page">7/9</span>
+ <span style="text-align:right;display:table-cell;"><a id="nexpage" href="/blog/list/7.html">&gt;&gt;</a></span>
+ </div>
+ <div style="text-align:center;" class="TText">
+ Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5
+ <br>
+ Content licensed under CC BY-SA 4.0.
+ </div>
+ </div>
+ </div>
+
+
+</body></html> \ No newline at end of file
diff --git a/blog/list/7.html b/blog/list/7.html
new file mode 100644
index 0000000..89df55e
--- /dev/null
+++ b/blog/list/7.html
@@ -0,0 +1,123 @@
+<html><head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<meta name="theme-color" content="#000000">
+<title>Chrisoft::Blog</title>
+<script type="text/javascript" src="/panel.js"></script>
+<link rel="stylesheet" type="text/css" href="/common.css">
+<link rel="stylesheet" type="text/css" href="/panel.css">
+<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
+<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
+<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
+<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
+<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
+<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
+<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
+<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
+<link rel="stylesheet" type="text/css" href="/blog/blogext.css">
+<script>
+function ol()
+{
+ window.onresize=function()
+ {
+ if(window.innerWidth<768)
+ setupevents();
+ else unsetevents();
+ }
+ window.onresize();
+}
+function loadTheme(){
+ var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
+ if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
+ var ent="";
+ var d=new Date();
+ if(thm[0]=='z')
+ {
+ var m=d.getMonth()+1;
+ if(m>=3&&m<6)thm='0'+thm[1];
+ else if(m>=6&&m<9)thm='1'+thm[1];
+ else if(m>=9&&m<12)thm='2'+thm[1];
+ else thm='3'+thm[1];
+ }
+ if(thm[1]=='z')
+ {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
+ ent=`theme${thm}`;
+ var R=new RegExp('theme[0-4][ab]');
+ for(var i=0;i<document.styleSheets.length;++i)
+ {
+ if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
+ document.styleSheets[i].disabled=true;
+ else document.styleSheets[i].disabled=false;
+ }
+ var thmcolor="";
+ switch(thm[0])
+ {
+ case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break;
+ case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break;
+ case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break;
+ case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break;
+ }
+ document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor);
+}
+loadTheme();
+</script>
+</head>
+<body onload="ol()" style="overflow-x:hidden;">
+ <div id="panel" class="TText">
+ <ul id="panellist">
+ <li><a href="/"><h1>Chrisoft</h1></a></li>
+ <li><a href="/blog"><h2>Blog</h2></a></li>
+ <li><span>Tags filter</span>
+ <ul id="tagslist">
+
+
+ <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul>
+ </li>
+ </ul>
+ </div>
+ <div id="content">
+ <div id="postslist">
+
+ <div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2015-12-20.html">忙</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#random-xp</span>
+ <span class="right" id="">2015-12-20/2018-10-11</span></div>
+ </div><div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2015-11-22.html">Raspberry Pi2 初体验</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#hands-on #device-review</span>
+ <span class="right" id="">2015-11-22/2018-10-11</span></div>
+ </div><div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2015-11-01.html">Hackathon 2015乱搞记</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#random-xp</span>
+ <span class="right" id="">2015-11-01/2015-11-22</span></div>
+ </div><div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2015-10-31.html">大学入学两个月了……</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#garbage</span>
+ <span class="right" id="">2015-10-31/2018-10-11</span></div>
+ </div><div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2015-10-30.html">First CCPC sightseeing tour</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#contest</span>
+ <span class="right" id="">2015-10-30/2018-10-11</span></div>
+ </div></div>
+ <div id="insanch" style="height:5em;"></div>
+ <div id="footer">
+ <div id="pagesw" class="TText" style="display:table;width:100%;padding:1em 0;">
+ <span style="display:table-cell;"><a id="prepage" href="/blog/list/6.html">&lt;&lt;</a></span>
+ <span style="text-align:center;display:table-cell;" id="page">8/9</span>
+ <span style="text-align:right;display:table-cell;"><a id="nexpage" href="/blog/list/8.html">&gt;&gt;</a></span>
+ </div>
+ <div style="text-align:center;" class="TText">
+ Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5
+ <br>
+ Content licensed under CC BY-SA 4.0.
+ </div>
+ </div>
+ </div>
+
+
+</body></html> \ No newline at end of file
diff --git a/blog/list/8.html b/blog/list/8.html
new file mode 100644
index 0000000..e9d19d1
--- /dev/null
+++ b/blog/list/8.html
@@ -0,0 +1,103 @@
+<html><head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<meta name="theme-color" content="#000000">
+<title>Chrisoft::Blog</title>
+<script type="text/javascript" src="/panel.js"></script>
+<link rel="stylesheet" type="text/css" href="/common.css">
+<link rel="stylesheet" type="text/css" href="/panel.css">
+<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
+<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
+<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
+<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
+<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
+<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
+<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
+<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
+<link rel="stylesheet" type="text/css" href="/blog/blogext.css">
+<script>
+function ol()
+{
+ window.onresize=function()
+ {
+ if(window.innerWidth<768)
+ setupevents();
+ else unsetevents();
+ }
+ window.onresize();
+}
+function loadTheme(){
+ var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
+ if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
+ var ent="";
+ var d=new Date();
+ if(thm[0]=='z')
+ {
+ var m=d.getMonth()+1;
+ if(m>=3&&m<6)thm='0'+thm[1];
+ else if(m>=6&&m<9)thm='1'+thm[1];
+ else if(m>=9&&m<12)thm='2'+thm[1];
+ else thm='3'+thm[1];
+ }
+ if(thm[1]=='z')
+ {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
+ ent=`theme${thm}`;
+ var R=new RegExp('theme[0-4][ab]');
+ for(var i=0;i<document.styleSheets.length;++i)
+ {
+ if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
+ document.styleSheets[i].disabled=true;
+ else document.styleSheets[i].disabled=false;
+ }
+ var thmcolor="";
+ switch(thm[0])
+ {
+ case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break;
+ case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break;
+ case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break;
+ case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break;
+ }
+ document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor);
+}
+loadTheme();
+</script>
+</head>
+<body onload="ol()" style="overflow-x:hidden;">
+ <div id="panel" class="TText">
+ <ul id="panellist">
+ <li><a href="/"><h1>Chrisoft</h1></a></li>
+ <li><a href="/blog"><h2>Blog</h2></a></li>
+ <li><span>Tags filter</span>
+ <ul id="tagslist">
+
+
+ <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul>
+ </li>
+ </ul>
+ </div>
+ <div id="content">
+ <div id="postslist">
+
+ <div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2015-10-29.html">noname01.pas</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#garbage</span>
+ <span class="right" id="">2015-10-29/2018-10-11</span></div>
+ </div></div>
+ <div id="insanch" style="height:5em;"></div>
+ <div id="footer">
+ <div id="pagesw" class="TText" style="display:table;width:100%;padding:1em 0;">
+ <span style="display:table-cell;"><a id="prepage" href="/blog/list/7.html">&lt;&lt;</a></span>
+ <span style="text-align:center;display:table-cell;" id="page">9/9</span>
+ <span style="text-align:right;display:table-cell;"><a id="nexpage" href="#">&gt;&gt;</a></span>
+ </div>
+ <div style="text-align:center;" class="TText">
+ Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5
+ <br>
+ Content licensed under CC BY-SA 4.0.
+ </div>
+ </div>
+ </div>
+
+
+</body></html> \ No newline at end of file
diff --git a/blog/list/acmicpc/0.html b/blog/list/acmicpc/0.html
new file mode 100644
index 0000000..828b468
--- /dev/null
+++ b/blog/list/acmicpc/0.html
@@ -0,0 +1,118 @@
+<html><head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<meta name="theme-color" content="#000000">
+<title>Chrisoft::Blog</title>
+<script type="text/javascript" src="/panel.js"></script>
+<link rel="stylesheet" type="text/css" href="/common.css">
+<link rel="stylesheet" type="text/css" href="/panel.css">
+<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
+<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
+<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
+<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
+<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
+<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
+<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
+<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
+<link rel="stylesheet" type="text/css" href="/blog/blogext.css">
+<script>
+function ol()
+{
+ window.onresize=function()
+ {
+ if(window.innerWidth<768)
+ setupevents();
+ else unsetevents();
+ }
+ window.onresize();
+}
+function loadTheme(){
+ var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
+ if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
+ var ent="";
+ var d=new Date();
+ if(thm[0]=='z')
+ {
+ var m=d.getMonth()+1;
+ if(m>=3&&m<6)thm='0'+thm[1];
+ else if(m>=6&&m<9)thm='1'+thm[1];
+ else if(m>=9&&m<12)thm='2'+thm[1];
+ else thm='3'+thm[1];
+ }
+ if(thm[1]=='z')
+ {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
+ ent=`theme${thm}`;
+ var R=new RegExp('theme[0-4][ab]');
+ for(var i=0;i<document.styleSheets.length;++i)
+ {
+ if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
+ document.styleSheets[i].disabled=true;
+ else document.styleSheets[i].disabled=false;
+ }
+ var thmcolor="";
+ switch(thm[0])
+ {
+ case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break;
+ case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break;
+ case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break;
+ case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break;
+ }
+ document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor);
+}
+loadTheme();
+</script>
+</head>
+<body onload="ol()" style="overflow-x:hidden;">
+ <div id="panel" class="TText">
+ <ul id="panellist">
+ <li><a href="/"><h1>Chrisoft</h1></a></li>
+ <li><a href="/blog"><h2>Blog</h2></a></li>
+ <li><span>Tags filter</span>
+ <ul id="tagslist">
+
+
+ <li id=""><a class="active" href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul>
+ </li>
+ </ul>
+ </div>
+ <div id="content">
+ <div id="postslist">
+
+ <div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2018-05-08.html">Respecting your job</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#sophistry #garbage #acmicpc</span>
+ <span class="right" id="">2018-05-08/2018-10-11</span></div>
+ </div><div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2018-04-22.html">ICPC类比赛中计算几何问题之「乱象」</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#garbage #acmicpc</span>
+ <span class="right" id="">2018-04-22/2018-10-11</span></div>
+ </div><div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2017-05-08.html">2017省赛流水帐</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#contest #acmicpc</span>
+ <span class="right" id="">2017-05-08/2018-10-11</span></div>
+ </div><div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2016-03-26.html">ACM校赛水题组酱油记</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#contest #acmicpc</span>
+ <span class="right" id="">2016-03-26/2018-10-11</span></div>
+ </div></div>
+ <div id="insanch" style="height:5em;"></div>
+ <div id="footer">
+ <div id="pagesw" class="TText" style="display:table;width:100%;padding:1em 0;">
+ <span style="display:table-cell;"><a id="prepage" href="#">&lt;&lt;</a></span>
+ <span style="text-align:center;display:table-cell;" id="page">1/1</span>
+ <span style="text-align:right;display:table-cell;"><a id="nexpage" href="#">&gt;&gt;</a></span>
+ </div>
+ <div style="text-align:center;" class="TText">
+ Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5
+ <br>
+ Content licensed under CC BY-SA 4.0.
+ </div>
+ </div>
+ </div>
+
+
+</body></html> \ No newline at end of file
diff --git a/blog/list/acmicpc/index.html b/blog/list/acmicpc/index.html
new file mode 120000
index 0000000..359ee56
--- /dev/null
+++ b/blog/list/acmicpc/index.html
@@ -0,0 +1 @@
+0.html \ No newline at end of file
diff --git a/blog/list/c++/0.html b/blog/list/c++/0.html
new file mode 100644
index 0000000..c0b6ebb
--- /dev/null
+++ b/blog/list/c++/0.html
@@ -0,0 +1,103 @@
+<html><head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<meta name="theme-color" content="#000000">
+<title>Chrisoft::Blog</title>
+<script type="text/javascript" src="/panel.js"></script>
+<link rel="stylesheet" type="text/css" href="/common.css">
+<link rel="stylesheet" type="text/css" href="/panel.css">
+<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
+<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
+<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
+<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
+<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
+<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
+<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
+<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
+<link rel="stylesheet" type="text/css" href="/blog/blogext.css">
+<script>
+function ol()
+{
+ window.onresize=function()
+ {
+ if(window.innerWidth<768)
+ setupevents();
+ else unsetevents();
+ }
+ window.onresize();
+}
+function loadTheme(){
+ var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
+ if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
+ var ent="";
+ var d=new Date();
+ if(thm[0]=='z')
+ {
+ var m=d.getMonth()+1;
+ if(m>=3&&m<6)thm='0'+thm[1];
+ else if(m>=6&&m<9)thm='1'+thm[1];
+ else if(m>=9&&m<12)thm='2'+thm[1];
+ else thm='3'+thm[1];
+ }
+ if(thm[1]=='z')
+ {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
+ ent=`theme${thm}`;
+ var R=new RegExp('theme[0-4][ab]');
+ for(var i=0;i<document.styleSheets.length;++i)
+ {
+ if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
+ document.styleSheets[i].disabled=true;
+ else document.styleSheets[i].disabled=false;
+ }
+ var thmcolor="";
+ switch(thm[0])
+ {
+ case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break;
+ case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break;
+ case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break;
+ case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break;
+ }
+ document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor);
+}
+loadTheme();
+</script>
+</head>
+<body onload="ol()" style="overflow-x:hidden;">
+ <div id="panel" class="TText">
+ <ul id="panellist">
+ <li><a href="/"><h1>Chrisoft</h1></a></li>
+ <li><a href="/blog"><h2>Blog</h2></a></li>
+ <li><span>Tags filter</span>
+ <ul id="tagslist">
+
+
+ <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a class="active" href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul>
+ </li>
+ </ul>
+ </div>
+ <div id="content">
+ <div id="postslist">
+
+ <div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2016-09-24.html">2-in-1</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#devel #qmidiplayer #c++ #qt</span>
+ <span class="right" id="">2016-09-24/2018-10-11</span></div>
+ </div></div>
+ <div id="insanch" style="height:5em;"></div>
+ <div id="footer">
+ <div id="pagesw" class="TText" style="display:table;width:100%;padding:1em 0;">
+ <span style="display:table-cell;"><a id="prepage" href="#">&lt;&lt;</a></span>
+ <span style="text-align:center;display:table-cell;" id="page">1/1</span>
+ <span style="text-align:right;display:table-cell;"><a id="nexpage" href="#">&gt;&gt;</a></span>
+ </div>
+ <div style="text-align:center;" class="TText">
+ Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5
+ <br>
+ Content licensed under CC BY-SA 4.0.
+ </div>
+ </div>
+ </div>
+
+
+</body></html> \ No newline at end of file
diff --git a/blog/list/c++/index.html b/blog/list/c++/index.html
new file mode 120000
index 0000000..359ee56
--- /dev/null
+++ b/blog/list/c++/index.html
@@ -0,0 +1 @@
+0.html \ No newline at end of file
diff --git a/blog/list/computer-repairing/0.html b/blog/list/computer-repairing/0.html
new file mode 100644
index 0000000..381d74a
--- /dev/null
+++ b/blog/list/computer-repairing/0.html
@@ -0,0 +1,103 @@
+<html><head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<meta name="theme-color" content="#000000">
+<title>Chrisoft::Blog</title>
+<script type="text/javascript" src="/panel.js"></script>
+<link rel="stylesheet" type="text/css" href="/common.css">
+<link rel="stylesheet" type="text/css" href="/panel.css">
+<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
+<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
+<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
+<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
+<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
+<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
+<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
+<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
+<link rel="stylesheet" type="text/css" href="/blog/blogext.css">
+<script>
+function ol()
+{
+ window.onresize=function()
+ {
+ if(window.innerWidth<768)
+ setupevents();
+ else unsetevents();
+ }
+ window.onresize();
+}
+function loadTheme(){
+ var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
+ if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
+ var ent="";
+ var d=new Date();
+ if(thm[0]=='z')
+ {
+ var m=d.getMonth()+1;
+ if(m>=3&&m<6)thm='0'+thm[1];
+ else if(m>=6&&m<9)thm='1'+thm[1];
+ else if(m>=9&&m<12)thm='2'+thm[1];
+ else thm='3'+thm[1];
+ }
+ if(thm[1]=='z')
+ {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
+ ent=`theme${thm}`;
+ var R=new RegExp('theme[0-4][ab]');
+ for(var i=0;i<document.styleSheets.length;++i)
+ {
+ if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
+ document.styleSheets[i].disabled=true;
+ else document.styleSheets[i].disabled=false;
+ }
+ var thmcolor="";
+ switch(thm[0])
+ {
+ case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break;
+ case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break;
+ case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break;
+ case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break;
+ }
+ document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor);
+}
+loadTheme();
+</script>
+</head>
+<body onload="ol()" style="overflow-x:hidden;">
+ <div id="panel" class="TText">
+ <ul id="panellist">
+ <li><a href="/"><h1>Chrisoft</h1></a></li>
+ <li><a href="/blog"><h2>Blog</h2></a></li>
+ <li><span>Tags filter</span>
+ <ul id="tagslist">
+
+
+ <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a class="active" href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul>
+ </li>
+ </ul>
+ </div>
+ <div id="content">
+ <div id="postslist">
+
+ <div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2017-01-09.html">[多大图警告]终究还是改不了修电脑的命</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#computer-repairing #garbage</span>
+ <span class="right" id="">2017-01-09/2018-10-11</span></div>
+ </div></div>
+ <div id="insanch" style="height:5em;"></div>
+ <div id="footer">
+ <div id="pagesw" class="TText" style="display:table;width:100%;padding:1em 0;">
+ <span style="display:table-cell;"><a id="prepage" href="#">&lt;&lt;</a></span>
+ <span style="text-align:center;display:table-cell;" id="page">1/1</span>
+ <span style="text-align:right;display:table-cell;"><a id="nexpage" href="#">&gt;&gt;</a></span>
+ </div>
+ <div style="text-align:center;" class="TText">
+ Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5
+ <br>
+ Content licensed under CC BY-SA 4.0.
+ </div>
+ </div>
+ </div>
+
+
+</body></html> \ No newline at end of file
diff --git a/blog/list/computer-repairing/index.html b/blog/list/computer-repairing/index.html
new file mode 120000
index 0000000..359ee56
--- /dev/null
+++ b/blog/list/computer-repairing/index.html
@@ -0,0 +1 @@
+0.html \ No newline at end of file
diff --git a/blog/list/contest/0.html b/blog/list/contest/0.html
new file mode 100644
index 0000000..08df4bf
--- /dev/null
+++ b/blog/list/contest/0.html
@@ -0,0 +1,113 @@
+<html><head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<meta name="theme-color" content="#000000">
+<title>Chrisoft::Blog</title>
+<script type="text/javascript" src="/panel.js"></script>
+<link rel="stylesheet" type="text/css" href="/common.css">
+<link rel="stylesheet" type="text/css" href="/panel.css">
+<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
+<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
+<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
+<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
+<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
+<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
+<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
+<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
+<link rel="stylesheet" type="text/css" href="/blog/blogext.css">
+<script>
+function ol()
+{
+ window.onresize=function()
+ {
+ if(window.innerWidth<768)
+ setupevents();
+ else unsetevents();
+ }
+ window.onresize();
+}
+function loadTheme(){
+ var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
+ if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
+ var ent="";
+ var d=new Date();
+ if(thm[0]=='z')
+ {
+ var m=d.getMonth()+1;
+ if(m>=3&&m<6)thm='0'+thm[1];
+ else if(m>=6&&m<9)thm='1'+thm[1];
+ else if(m>=9&&m<12)thm='2'+thm[1];
+ else thm='3'+thm[1];
+ }
+ if(thm[1]=='z')
+ {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
+ ent=`theme${thm}`;
+ var R=new RegExp('theme[0-4][ab]');
+ for(var i=0;i<document.styleSheets.length;++i)
+ {
+ if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
+ document.styleSheets[i].disabled=true;
+ else document.styleSheets[i].disabled=false;
+ }
+ var thmcolor="";
+ switch(thm[0])
+ {
+ case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break;
+ case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break;
+ case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break;
+ case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break;
+ }
+ document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor);
+}
+loadTheme();
+</script>
+</head>
+<body onload="ol()" style="overflow-x:hidden;">
+ <div id="panel" class="TText">
+ <ul id="panellist">
+ <li><a href="/"><h1>Chrisoft</h1></a></li>
+ <li><a href="/blog"><h2>Blog</h2></a></li>
+ <li><span>Tags filter</span>
+ <ul id="tagslist">
+
+
+ <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a class="active" href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul>
+ </li>
+ </ul>
+ </div>
+ <div id="content">
+ <div id="postslist">
+
+ <div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2017-05-08.html">2017省赛流水帐</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#contest #acmicpc</span>
+ <span class="right" id="">2017-05-08/2018-10-11</span></div>
+ </div><div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2016-03-26.html">ACM校赛水题组酱油记</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#contest #acmicpc</span>
+ <span class="right" id="">2016-03-26/2018-10-11</span></div>
+ </div><div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2015-10-30.html">First CCPC sightseeing tour</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#contest</span>
+ <span class="right" id="">2015-10-30/2018-10-11</span></div>
+ </div></div>
+ <div id="insanch" style="height:5em;"></div>
+ <div id="footer">
+ <div id="pagesw" class="TText" style="display:table;width:100%;padding:1em 0;">
+ <span style="display:table-cell;"><a id="prepage" href="#">&lt;&lt;</a></span>
+ <span style="text-align:center;display:table-cell;" id="page">1/1</span>
+ <span style="text-align:right;display:table-cell;"><a id="nexpage" href="#">&gt;&gt;</a></span>
+ </div>
+ <div style="text-align:center;" class="TText">
+ Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5
+ <br>
+ Content licensed under CC BY-SA 4.0.
+ </div>
+ </div>
+ </div>
+
+
+</body></html> \ No newline at end of file
diff --git a/blog/list/contest/index.html b/blog/list/contest/index.html
new file mode 120000
index 0000000..359ee56
--- /dev/null
+++ b/blog/list/contest/index.html
@@ -0,0 +1 @@
+0.html \ No newline at end of file
diff --git a/blog/list/daily-life/0.html b/blog/list/daily-life/0.html
new file mode 100644
index 0000000..027e205
--- /dev/null
+++ b/blog/list/daily-life/0.html
@@ -0,0 +1,123 @@
+<html><head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<meta name="theme-color" content="#000000">
+<title>Chrisoft::Blog</title>
+<script type="text/javascript" src="/panel.js"></script>
+<link rel="stylesheet" type="text/css" href="/common.css">
+<link rel="stylesheet" type="text/css" href="/panel.css">
+<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
+<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
+<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
+<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
+<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
+<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
+<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
+<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
+<link rel="stylesheet" type="text/css" href="/blog/blogext.css">
+<script>
+function ol()
+{
+ window.onresize=function()
+ {
+ if(window.innerWidth<768)
+ setupevents();
+ else unsetevents();
+ }
+ window.onresize();
+}
+function loadTheme(){
+ var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
+ if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
+ var ent="";
+ var d=new Date();
+ if(thm[0]=='z')
+ {
+ var m=d.getMonth()+1;
+ if(m>=3&&m<6)thm='0'+thm[1];
+ else if(m>=6&&m<9)thm='1'+thm[1];
+ else if(m>=9&&m<12)thm='2'+thm[1];
+ else thm='3'+thm[1];
+ }
+ if(thm[1]=='z')
+ {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
+ ent=`theme${thm}`;
+ var R=new RegExp('theme[0-4][ab]');
+ for(var i=0;i<document.styleSheets.length;++i)
+ {
+ if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
+ document.styleSheets[i].disabled=true;
+ else document.styleSheets[i].disabled=false;
+ }
+ var thmcolor="";
+ switch(thm[0])
+ {
+ case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break;
+ case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break;
+ case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break;
+ case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break;
+ }
+ document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor);
+}
+loadTheme();
+</script>
+</head>
+<body onload="ol()" style="overflow-x:hidden;">
+ <div id="panel" class="TText">
+ <ul id="panellist">
+ <li><a href="/"><h1>Chrisoft</h1></a></li>
+ <li><a href="/blog"><h2>Blog</h2></a></li>
+ <li><span>Tags filter</span>
+ <ul id="tagslist">
+
+
+ <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a class="active" href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul>
+ </li>
+ </ul>
+ </div>
+ <div id="content">
+ <div id="postslist">
+
+ <div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2018-01-07.html">Trash dump for the fifth semester</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#garbage #daily-life</span>
+ <span class="right" id="">2018-01-07/2018-10-30</span></div>
+ </div><div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2017-06-29.html">Trash dump for the fourth semester</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#garbage #daily-life</span>
+ <span class="right" id="">2017-06-29/2018-10-11</span></div>
+ </div><div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2017-06-09.html">Fuck Windows et cetera</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#daily-life</span>
+ <span class="right" id="">2017-06-08/2018-10-11</span></div>
+ </div><div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2017-01-18.html">Trash dump for the third semester</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#garbage #daily-life</span>
+ <span class="right" id="">2017-01-09/2018-10-11</span></div>
+ </div><div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2016-06-21.html">Trash dump for the first academic year</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#garbage #daily-life</span>
+ <span class="right" id="">2016-06-21/2018-10-11</span></div>
+ </div></div>
+ <div id="insanch" style="height:5em;"></div>
+ <div id="footer">
+ <div id="pagesw" class="TText" style="display:table;width:100%;padding:1em 0;">
+ <span style="display:table-cell;"><a id="prepage" href="#">&lt;&lt;</a></span>
+ <span style="text-align:center;display:table-cell;" id="page">1/2</span>
+ <span style="text-align:right;display:table-cell;"><a id="nexpage" href="/blog/list/daily-life/1.html">&gt;&gt;</a></span>
+ </div>
+ <div style="text-align:center;" class="TText">
+ Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5
+ <br>
+ Content licensed under CC BY-SA 4.0.
+ </div>
+ </div>
+ </div>
+
+
+</body></html> \ No newline at end of file
diff --git a/blog/list/daily-life/1.html b/blog/list/daily-life/1.html
new file mode 100644
index 0000000..d4ecb7a
--- /dev/null
+++ b/blog/list/daily-life/1.html
@@ -0,0 +1,103 @@
+<html><head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<meta name="theme-color" content="#000000">
+<title>Chrisoft::Blog</title>
+<script type="text/javascript" src="/panel.js"></script>
+<link rel="stylesheet" type="text/css" href="/common.css">
+<link rel="stylesheet" type="text/css" href="/panel.css">
+<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
+<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
+<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
+<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
+<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
+<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
+<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
+<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
+<link rel="stylesheet" type="text/css" href="/blog/blogext.css">
+<script>
+function ol()
+{
+ window.onresize=function()
+ {
+ if(window.innerWidth<768)
+ setupevents();
+ else unsetevents();
+ }
+ window.onresize();
+}
+function loadTheme(){
+ var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
+ if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
+ var ent="";
+ var d=new Date();
+ if(thm[0]=='z')
+ {
+ var m=d.getMonth()+1;
+ if(m>=3&&m<6)thm='0'+thm[1];
+ else if(m>=6&&m<9)thm='1'+thm[1];
+ else if(m>=9&&m<12)thm='2'+thm[1];
+ else thm='3'+thm[1];
+ }
+ if(thm[1]=='z')
+ {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
+ ent=`theme${thm}`;
+ var R=new RegExp('theme[0-4][ab]');
+ for(var i=0;i<document.styleSheets.length;++i)
+ {
+ if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
+ document.styleSheets[i].disabled=true;
+ else document.styleSheets[i].disabled=false;
+ }
+ var thmcolor="";
+ switch(thm[0])
+ {
+ case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break;
+ case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break;
+ case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break;
+ case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break;
+ }
+ document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor);
+}
+loadTheme();
+</script>
+</head>
+<body onload="ol()" style="overflow-x:hidden;">
+ <div id="panel" class="TText">
+ <ul id="panellist">
+ <li><a href="/"><h1>Chrisoft</h1></a></li>
+ <li><a href="/blog"><h2>Blog</h2></a></li>
+ <li><span>Tags filter</span>
+ <ul id="tagslist">
+
+
+ <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a class="active" href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul>
+ </li>
+ </ul>
+ </div>
+ <div id="content">
+ <div id="postslist">
+
+ <div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2016-01-25.html">放假...</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#daily-life</span>
+ <span class="right" id="">2016-01-25/2018-10-11</span></div>
+ </div></div>
+ <div id="insanch" style="height:5em;"></div>
+ <div id="footer">
+ <div id="pagesw" class="TText" style="display:table;width:100%;padding:1em 0;">
+ <span style="display:table-cell;"><a id="prepage" href="/blog/list/daily-life/0.html">&lt;&lt;</a></span>
+ <span style="text-align:center;display:table-cell;" id="page">2/2</span>
+ <span style="text-align:right;display:table-cell;"><a id="nexpage" href="#">&gt;&gt;</a></span>
+ </div>
+ <div style="text-align:center;" class="TText">
+ Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5
+ <br>
+ Content licensed under CC BY-SA 4.0.
+ </div>
+ </div>
+ </div>
+
+
+</body></html> \ No newline at end of file
diff --git a/blog/list/daily-life/index.html b/blog/list/daily-life/index.html
new file mode 120000
index 0000000..359ee56
--- /dev/null
+++ b/blog/list/daily-life/index.html
@@ -0,0 +1 @@
+0.html \ No newline at end of file
diff --git a/blog/list/design/0.html b/blog/list/design/0.html
new file mode 100644
index 0000000..d683233
--- /dev/null
+++ b/blog/list/design/0.html
@@ -0,0 +1,103 @@
+<html><head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<meta name="theme-color" content="#000000">
+<title>Chrisoft::Blog</title>
+<script type="text/javascript" src="/panel.js"></script>
+<link rel="stylesheet" type="text/css" href="/common.css">
+<link rel="stylesheet" type="text/css" href="/panel.css">
+<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
+<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
+<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
+<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
+<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
+<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
+<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
+<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
+<link rel="stylesheet" type="text/css" href="/blog/blogext.css">
+<script>
+function ol()
+{
+ window.onresize=function()
+ {
+ if(window.innerWidth<768)
+ setupevents();
+ else unsetevents();
+ }
+ window.onresize();
+}
+function loadTheme(){
+ var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
+ if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
+ var ent="";
+ var d=new Date();
+ if(thm[0]=='z')
+ {
+ var m=d.getMonth()+1;
+ if(m>=3&&m<6)thm='0'+thm[1];
+ else if(m>=6&&m<9)thm='1'+thm[1];
+ else if(m>=9&&m<12)thm='2'+thm[1];
+ else thm='3'+thm[1];
+ }
+ if(thm[1]=='z')
+ {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
+ ent=`theme${thm}`;
+ var R=new RegExp('theme[0-4][ab]');
+ for(var i=0;i<document.styleSheets.length;++i)
+ {
+ if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
+ document.styleSheets[i].disabled=true;
+ else document.styleSheets[i].disabled=false;
+ }
+ var thmcolor="";
+ switch(thm[0])
+ {
+ case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break;
+ case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break;
+ case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break;
+ case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break;
+ }
+ document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor);
+}
+loadTheme();
+</script>
+</head>
+<body onload="ol()" style="overflow-x:hidden;">
+ <div id="panel" class="TText">
+ <ul id="panellist">
+ <li><a href="/"><h1>Chrisoft</h1></a></li>
+ <li><a href="/blog"><h2>Blog</h2></a></li>
+ <li><span>Tags filter</span>
+ <ul id="tagslist">
+
+
+ <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a class="active" href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul>
+ </li>
+ </ul>
+ </div>
+ <div id="content">
+ <div id="postslist">
+
+ <div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2016-01-03.html">The Design and The Real Product</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#devel #design</span>
+ <span class="right" id="">2016-01-03/2018-10-11</span></div>
+ </div></div>
+ <div id="insanch" style="height:5em;"></div>
+ <div id="footer">
+ <div id="pagesw" class="TText" style="display:table;width:100%;padding:1em 0;">
+ <span style="display:table-cell;"><a id="prepage" href="#">&lt;&lt;</a></span>
+ <span style="text-align:center;display:table-cell;" id="page">1/1</span>
+ <span style="text-align:right;display:table-cell;"><a id="nexpage" href="#">&gt;&gt;</a></span>
+ </div>
+ <div style="text-align:center;" class="TText">
+ Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5
+ <br>
+ Content licensed under CC BY-SA 4.0.
+ </div>
+ </div>
+ </div>
+
+
+</body></html> \ No newline at end of file
diff --git a/blog/list/design/index.html b/blog/list/design/index.html
new file mode 120000
index 0000000..359ee56
--- /dev/null
+++ b/blog/list/design/index.html
@@ -0,0 +1 @@
+0.html \ No newline at end of file
diff --git a/blog/list/devel/0.html b/blog/list/devel/0.html
new file mode 100644
index 0000000..50761d9
--- /dev/null
+++ b/blog/list/devel/0.html
@@ -0,0 +1,123 @@
+<html><head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<meta name="theme-color" content="#000000">
+<title>Chrisoft::Blog</title>
+<script type="text/javascript" src="/panel.js"></script>
+<link rel="stylesheet" type="text/css" href="/common.css">
+<link rel="stylesheet" type="text/css" href="/panel.css">
+<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
+<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
+<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
+<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
+<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
+<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
+<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
+<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
+<link rel="stylesheet" type="text/css" href="/blog/blogext.css">
+<script>
+function ol()
+{
+ window.onresize=function()
+ {
+ if(window.innerWidth<768)
+ setupevents();
+ else unsetevents();
+ }
+ window.onresize();
+}
+function loadTheme(){
+ var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
+ if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
+ var ent="";
+ var d=new Date();
+ if(thm[0]=='z')
+ {
+ var m=d.getMonth()+1;
+ if(m>=3&&m<6)thm='0'+thm[1];
+ else if(m>=6&&m<9)thm='1'+thm[1];
+ else if(m>=9&&m<12)thm='2'+thm[1];
+ else thm='3'+thm[1];
+ }
+ if(thm[1]=='z')
+ {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
+ ent=`theme${thm}`;
+ var R=new RegExp('theme[0-4][ab]');
+ for(var i=0;i<document.styleSheets.length;++i)
+ {
+ if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
+ document.styleSheets[i].disabled=true;
+ else document.styleSheets[i].disabled=false;
+ }
+ var thmcolor="";
+ switch(thm[0])
+ {
+ case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break;
+ case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break;
+ case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break;
+ case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break;
+ }
+ document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor);
+}
+loadTheme();
+</script>
+</head>
+<body onload="ol()" style="overflow-x:hidden;">
+ <div id="panel" class="TText">
+ <ul id="panellist">
+ <li><a href="/"><h1>Chrisoft</h1></a></li>
+ <li><a href="/blog"><h2>Blog</h2></a></li>
+ <li><span>Tags filter</span>
+ <ul id="tagslist">
+
+
+ <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a class="active" href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul>
+ </li>
+ </ul>
+ </div>
+ <div id="content">
+ <div id="postslist">
+
+ <div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2018-10-11.html">The stupid blogging system evolved!</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#web #devel #js</span>
+ <span class="right" id="">2018-10-11/2018-10-11</span></div>
+ </div><div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2018-03-17.html">Some rants on SMELT, QMidiPlayer and Virtools</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#devel #qmidiplayer #opengl</span>
+ <span class="right" id="">2018-03-17/2018-10-11</span></div>
+ </div><div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2017-04-11.html">SBS 2.0 is now the default blog browser</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#devel #web</span>
+ <span class="right" id="">2017-04-11/2018-10-11</span></div>
+ </div><div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2016-09-24.html">2-in-1</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#devel #qmidiplayer #c++ #qt</span>
+ <span class="right" id="">2016-09-24/2018-10-11</span></div>
+ </div><div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2016-04-09.html">The MIDI File Format Specification and MIDI Implementation in QMidiPlayer</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#devel #qmidiplayer #midi</span>
+ <span class="right" id="">2016-04-09/2018-10-11</span></div>
+ </div></div>
+ <div id="insanch" style="height:5em;"></div>
+ <div id="footer">
+ <div id="pagesw" class="TText" style="display:table;width:100%;padding:1em 0;">
+ <span style="display:table-cell;"><a id="prepage" href="#">&lt;&lt;</a></span>
+ <span style="text-align:center;display:table-cell;" id="page">1/2</span>
+ <span style="text-align:right;display:table-cell;"><a id="nexpage" href="/blog/list/devel/1.html">&gt;&gt;</a></span>
+ </div>
+ <div style="text-align:center;" class="TText">
+ Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5
+ <br>
+ Content licensed under CC BY-SA 4.0.
+ </div>
+ </div>
+ </div>
+
+
+</body></html> \ No newline at end of file
diff --git a/blog/list/devel/1.html b/blog/list/devel/1.html
new file mode 100644
index 0000000..3f2f505
--- /dev/null
+++ b/blog/list/devel/1.html
@@ -0,0 +1,123 @@
+<html><head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<meta name="theme-color" content="#000000">
+<title>Chrisoft::Blog</title>
+<script type="text/javascript" src="/panel.js"></script>
+<link rel="stylesheet" type="text/css" href="/common.css">
+<link rel="stylesheet" type="text/css" href="/panel.css">
+<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
+<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
+<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
+<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
+<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
+<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
+<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
+<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
+<link rel="stylesheet" type="text/css" href="/blog/blogext.css">
+<script>
+function ol()
+{
+ window.onresize=function()
+ {
+ if(window.innerWidth<768)
+ setupevents();
+ else unsetevents();
+ }
+ window.onresize();
+}
+function loadTheme(){
+ var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
+ if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
+ var ent="";
+ var d=new Date();
+ if(thm[0]=='z')
+ {
+ var m=d.getMonth()+1;
+ if(m>=3&&m<6)thm='0'+thm[1];
+ else if(m>=6&&m<9)thm='1'+thm[1];
+ else if(m>=9&&m<12)thm='2'+thm[1];
+ else thm='3'+thm[1];
+ }
+ if(thm[1]=='z')
+ {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
+ ent=`theme${thm}`;
+ var R=new RegExp('theme[0-4][ab]');
+ for(var i=0;i<document.styleSheets.length;++i)
+ {
+ if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
+ document.styleSheets[i].disabled=true;
+ else document.styleSheets[i].disabled=false;
+ }
+ var thmcolor="";
+ switch(thm[0])
+ {
+ case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break;
+ case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break;
+ case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break;
+ case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break;
+ }
+ document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor);
+}
+loadTheme();
+</script>
+</head>
+<body onload="ol()" style="overflow-x:hidden;">
+ <div id="panel" class="TText">
+ <ul id="panellist">
+ <li><a href="/"><h1>Chrisoft</h1></a></li>
+ <li><a href="/blog"><h2>Blog</h2></a></li>
+ <li><span>Tags filter</span>
+ <ul id="tagslist">
+
+
+ <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a class="active" href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul>
+ </li>
+ </ul>
+ </div>
+ <div id="content">
+ <div id="postslist">
+
+ <div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2016-02-18.html">Cross Noodles Recooked</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#devel #js #webgl</span>
+ <span class="right" id="">2016-02-18/2018-10-11</span></div>
+ </div><div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2016-01-16.html">QMidiPlayer Progress-2016-01-16</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#devel #qmidiplayer</span>
+ <span class="right" id="">2016-01-16/2018-10-11</span></div>
+ </div><div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2016-01-03.html">The Design and The Real Product</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#devel #design</span>
+ <span class="right" id="">2016-01-03/2018-10-11</span></div>
+ </div><div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2015-12-27.html">QMidiPlayer got its repo</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#devel #qmidiplayer</span>
+ <span class="right" id="">2015-12-27/2018-10-11</span></div>
+ </div><div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2015-12-23.html">Chris' First Development Blog</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#devel</span>
+ <span class="right" id="">2015-12-23/2018-10-11</span></div>
+ </div></div>
+ <div id="insanch" style="height:5em;"></div>
+ <div id="footer">
+ <div id="pagesw" class="TText" style="display:table;width:100%;padding:1em 0;">
+ <span style="display:table-cell;"><a id="prepage" href="/blog/list/devel/0.html">&lt;&lt;</a></span>
+ <span style="text-align:center;display:table-cell;" id="page">2/2</span>
+ <span style="text-align:right;display:table-cell;"><a id="nexpage" href="#">&gt;&gt;</a></span>
+ </div>
+ <div style="text-align:center;" class="TText">
+ Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5
+ <br>
+ Content licensed under CC BY-SA 4.0.
+ </div>
+ </div>
+ </div>
+
+
+</body></html> \ No newline at end of file
diff --git a/blog/list/devel/index.html b/blog/list/devel/index.html
new file mode 120000
index 0000000..359ee56
--- /dev/null
+++ b/blog/list/devel/index.html
@@ -0,0 +1 @@
+0.html \ No newline at end of file
diff --git a/blog/list/device-review/0.html b/blog/list/device-review/0.html
new file mode 100644
index 0000000..bfda6bf
--- /dev/null
+++ b/blog/list/device-review/0.html
@@ -0,0 +1,123 @@
+<html><head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<meta name="theme-color" content="#000000">
+<title>Chrisoft::Blog</title>
+<script type="text/javascript" src="/panel.js"></script>
+<link rel="stylesheet" type="text/css" href="/common.css">
+<link rel="stylesheet" type="text/css" href="/panel.css">
+<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
+<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
+<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
+<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
+<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
+<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
+<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
+<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
+<link rel="stylesheet" type="text/css" href="/blog/blogext.css">
+<script>
+function ol()
+{
+ window.onresize=function()
+ {
+ if(window.innerWidth<768)
+ setupevents();
+ else unsetevents();
+ }
+ window.onresize();
+}
+function loadTheme(){
+ var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
+ if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
+ var ent="";
+ var d=new Date();
+ if(thm[0]=='z')
+ {
+ var m=d.getMonth()+1;
+ if(m>=3&&m<6)thm='0'+thm[1];
+ else if(m>=6&&m<9)thm='1'+thm[1];
+ else if(m>=9&&m<12)thm='2'+thm[1];
+ else thm='3'+thm[1];
+ }
+ if(thm[1]=='z')
+ {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
+ ent=`theme${thm}`;
+ var R=new RegExp('theme[0-4][ab]');
+ for(var i=0;i<document.styleSheets.length;++i)
+ {
+ if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
+ document.styleSheets[i].disabled=true;
+ else document.styleSheets[i].disabled=false;
+ }
+ var thmcolor="";
+ switch(thm[0])
+ {
+ case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break;
+ case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break;
+ case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break;
+ case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break;
+ }
+ document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor);
+}
+loadTheme();
+</script>
+</head>
+<body onload="ol()" style="overflow-x:hidden;">
+ <div id="panel" class="TText">
+ <ul id="panellist">
+ <li><a href="/"><h1>Chrisoft</h1></a></li>
+ <li><a href="/blog"><h2>Blog</h2></a></li>
+ <li><span>Tags filter</span>
+ <ul id="tagslist">
+
+
+ <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a class="active" href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul>
+ </li>
+ </ul>
+ </div>
+ <div id="content">
+ <div id="postslist">
+
+ <div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2018-12-06.html">小米 MIX 3 上手体验</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#device-review #hands-on</span>
+ <span class="right" id="">2018-12-06/2018-12-12</span></div>
+ </div><div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2017-12-21.html">为什么我<i>就是不</i>使用Mac</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#garbage #device-review</span>
+ <span class="right" id="">2017-12-21/2018-10-11</span></div>
+ </div><div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2017-02-13.html">[多大图警告]ls /dev</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#device-review</span>
+ <span class="right" id="">2017-02-13/2018-12-09</span></div>
+ </div><div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2016-05-12.html">ThinkPad X1 Yoga初体验</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#device-review</span>
+ <span class="right" id="">2016-05-12/2018-10-11</span></div>
+ </div><div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2015-11-22.html">Raspberry Pi2 初体验</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#hands-on #device-review</span>
+ <span class="right" id="">2015-11-22/2018-10-11</span></div>
+ </div></div>
+ <div id="insanch" style="height:5em;"></div>
+ <div id="footer">
+ <div id="pagesw" class="TText" style="display:table;width:100%;padding:1em 0;">
+ <span style="display:table-cell;"><a id="prepage" href="#">&lt;&lt;</a></span>
+ <span style="text-align:center;display:table-cell;" id="page">1/1</span>
+ <span style="text-align:right;display:table-cell;"><a id="nexpage" href="#">&gt;&gt;</a></span>
+ </div>
+ <div style="text-align:center;" class="TText">
+ Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5
+ <br>
+ Content licensed under CC BY-SA 4.0.
+ </div>
+ </div>
+ </div>
+
+
+</body></html> \ No newline at end of file
diff --git a/blog/list/device-review/index.html b/blog/list/device-review/index.html
new file mode 120000
index 0000000..359ee56
--- /dev/null
+++ b/blog/list/device-review/index.html
@@ -0,0 +1 @@
+0.html \ No newline at end of file
diff --git a/blog/list/garbage/0.html b/blog/list/garbage/0.html
new file mode 100644
index 0000000..fbcd8e3
--- /dev/null
+++ b/blog/list/garbage/0.html
@@ -0,0 +1,123 @@
+<html><head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<meta name="theme-color" content="#000000">
+<title>Chrisoft::Blog</title>
+<script type="text/javascript" src="/panel.js"></script>
+<link rel="stylesheet" type="text/css" href="/common.css">
+<link rel="stylesheet" type="text/css" href="/panel.css">
+<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
+<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
+<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
+<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
+<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
+<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
+<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
+<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
+<link rel="stylesheet" type="text/css" href="/blog/blogext.css">
+<script>
+function ol()
+{
+ window.onresize=function()
+ {
+ if(window.innerWidth<768)
+ setupevents();
+ else unsetevents();
+ }
+ window.onresize();
+}
+function loadTheme(){
+ var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
+ if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
+ var ent="";
+ var d=new Date();
+ if(thm[0]=='z')
+ {
+ var m=d.getMonth()+1;
+ if(m>=3&&m<6)thm='0'+thm[1];
+ else if(m>=6&&m<9)thm='1'+thm[1];
+ else if(m>=9&&m<12)thm='2'+thm[1];
+ else thm='3'+thm[1];
+ }
+ if(thm[1]=='z')
+ {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
+ ent=`theme${thm}`;
+ var R=new RegExp('theme[0-4][ab]');
+ for(var i=0;i<document.styleSheets.length;++i)
+ {
+ if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
+ document.styleSheets[i].disabled=true;
+ else document.styleSheets[i].disabled=false;
+ }
+ var thmcolor="";
+ switch(thm[0])
+ {
+ case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break;
+ case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break;
+ case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break;
+ case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break;
+ }
+ document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor);
+}
+loadTheme();
+</script>
+</head>
+<body onload="ol()" style="overflow-x:hidden;">
+ <div id="panel" class="TText">
+ <ul id="panellist">
+ <li><a href="/"><h1>Chrisoft</h1></a></li>
+ <li><a href="/blog"><h2>Blog</h2></a></li>
+ <li><span>Tags filter</span>
+ <ul id="tagslist">
+
+
+ <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a class="active" href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul>
+ </li>
+ </ul>
+ </div>
+ <div id="content">
+ <div id="postslist">
+
+ <div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/TOP.html">Readme_en</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#garbage</span>
+ <span class="right" id="">2016-02-13/2018-10-11</span></div>
+ </div><div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2018-06-07.html">Should this site still be alive by 2035...</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#sophistry #garbage</span>
+ <span class="right" id="">2018-06-07/2018-10-11</span></div>
+ </div><div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2018-05-18.html">Ideology vs Pragmatism &amp;c.</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#sophistry #garbage</span>
+ <span class="right" id="">2018-05-18/2018-10-11</span></div>
+ </div><div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2018-05-08.html">Respecting your job</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#sophistry #garbage #acmicpc</span>
+ <span class="right" id="">2018-05-08/2018-10-11</span></div>
+ </div><div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2018-05-03.html">Are you an Apple fanboy/fangirl?</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#garbage #interactive</span>
+ <span class="right" id="">2018-05-03/2019-02-10</span></div>
+ </div></div>
+ <div id="insanch" style="height:5em;"></div>
+ <div id="footer">
+ <div id="pagesw" class="TText" style="display:table;width:100%;padding:1em 0;">
+ <span style="display:table-cell;"><a id="prepage" href="#">&lt;&lt;</a></span>
+ <span style="text-align:center;display:table-cell;" id="page">1/4</span>
+ <span style="text-align:right;display:table-cell;"><a id="nexpage" href="/blog/list/garbage/1.html">&gt;&gt;</a></span>
+ </div>
+ <div style="text-align:center;" class="TText">
+ Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5
+ <br>
+ Content licensed under CC BY-SA 4.0.
+ </div>
+ </div>
+ </div>
+
+
+</body></html> \ No newline at end of file
diff --git a/blog/list/garbage/1.html b/blog/list/garbage/1.html
new file mode 100644
index 0000000..a80751e
--- /dev/null
+++ b/blog/list/garbage/1.html
@@ -0,0 +1,123 @@
+<html><head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<meta name="theme-color" content="#000000">
+<title>Chrisoft::Blog</title>
+<script type="text/javascript" src="/panel.js"></script>
+<link rel="stylesheet" type="text/css" href="/common.css">
+<link rel="stylesheet" type="text/css" href="/panel.css">
+<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
+<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
+<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
+<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
+<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
+<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
+<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
+<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
+<link rel="stylesheet" type="text/css" href="/blog/blogext.css">
+<script>
+function ol()
+{
+ window.onresize=function()
+ {
+ if(window.innerWidth<768)
+ setupevents();
+ else unsetevents();
+ }
+ window.onresize();
+}
+function loadTheme(){
+ var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
+ if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
+ var ent="";
+ var d=new Date();
+ if(thm[0]=='z')
+ {
+ var m=d.getMonth()+1;
+ if(m>=3&&m<6)thm='0'+thm[1];
+ else if(m>=6&&m<9)thm='1'+thm[1];
+ else if(m>=9&&m<12)thm='2'+thm[1];
+ else thm='3'+thm[1];
+ }
+ if(thm[1]=='z')
+ {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
+ ent=`theme${thm}`;
+ var R=new RegExp('theme[0-4][ab]');
+ for(var i=0;i<document.styleSheets.length;++i)
+ {
+ if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
+ document.styleSheets[i].disabled=true;
+ else document.styleSheets[i].disabled=false;
+ }
+ var thmcolor="";
+ switch(thm[0])
+ {
+ case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break;
+ case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break;
+ case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break;
+ case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break;
+ }
+ document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor);
+}
+loadTheme();
+</script>
+</head>
+<body onload="ol()" style="overflow-x:hidden;">
+ <div id="panel" class="TText">
+ <ul id="panellist">
+ <li><a href="/"><h1>Chrisoft</h1></a></li>
+ <li><a href="/blog"><h2>Blog</h2></a></li>
+ <li><span>Tags filter</span>
+ <ul id="tagslist">
+
+
+ <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a class="active" href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul>
+ </li>
+ </ul>
+ </div>
+ <div id="content">
+ <div id="postslist">
+
+ <div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2018-04-22.html">ICPC类比赛中计算几何问题之「乱象」</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#garbage #acmicpc</span>
+ <span class="right" id="">2018-04-22/2018-10-11</span></div>
+ </div><div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2018-04-17.html">The "Deepin is spyware" problem</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#linux #garbage #sophistry</span>
+ <span class="right" id="">2018-04-17/2018-10-11</span></div>
+ </div><div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2018-02-05.html">Does gaming make me merrier &amp; more relaxed or the opposite?</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#garbage</span>
+ <span class="right" id="">2018-02-05/2018-10-11</span></div>
+ </div><div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2018-01-07.html">Trash dump for the fifth semester</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#garbage #daily-life</span>
+ <span class="right" id="">2018-01-07/2018-10-30</span></div>
+ </div><div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2017-12-21.html">为什么我<i>就是不</i>使用Mac</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#garbage #device-review</span>
+ <span class="right" id="">2017-12-21/2018-10-11</span></div>
+ </div></div>
+ <div id="insanch" style="height:5em;"></div>
+ <div id="footer">
+ <div id="pagesw" class="TText" style="display:table;width:100%;padding:1em 0;">
+ <span style="display:table-cell;"><a id="prepage" href="/blog/list/garbage/0.html">&lt;&lt;</a></span>
+ <span style="text-align:center;display:table-cell;" id="page">2/4</span>
+ <span style="text-align:right;display:table-cell;"><a id="nexpage" href="/blog/list/garbage/2.html">&gt;&gt;</a></span>
+ </div>
+ <div style="text-align:center;" class="TText">
+ Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5
+ <br>
+ Content licensed under CC BY-SA 4.0.
+ </div>
+ </div>
+ </div>
+
+
+</body></html> \ No newline at end of file
diff --git a/blog/list/garbage/2.html b/blog/list/garbage/2.html
new file mode 100644
index 0000000..cfddbef
--- /dev/null
+++ b/blog/list/garbage/2.html
@@ -0,0 +1,123 @@
+<html><head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<meta name="theme-color" content="#000000">
+<title>Chrisoft::Blog</title>
+<script type="text/javascript" src="/panel.js"></script>
+<link rel="stylesheet" type="text/css" href="/common.css">
+<link rel="stylesheet" type="text/css" href="/panel.css">
+<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
+<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
+<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
+<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
+<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
+<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
+<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
+<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
+<link rel="stylesheet" type="text/css" href="/blog/blogext.css">
+<script>
+function ol()
+{
+ window.onresize=function()
+ {
+ if(window.innerWidth<768)
+ setupevents();
+ else unsetevents();
+ }
+ window.onresize();
+}
+function loadTheme(){
+ var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
+ if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
+ var ent="";
+ var d=new Date();
+ if(thm[0]=='z')
+ {
+ var m=d.getMonth()+1;
+ if(m>=3&&m<6)thm='0'+thm[1];
+ else if(m>=6&&m<9)thm='1'+thm[1];
+ else if(m>=9&&m<12)thm='2'+thm[1];
+ else thm='3'+thm[1];
+ }
+ if(thm[1]=='z')
+ {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
+ ent=`theme${thm}`;
+ var R=new RegExp('theme[0-4][ab]');
+ for(var i=0;i<document.styleSheets.length;++i)
+ {
+ if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
+ document.styleSheets[i].disabled=true;
+ else document.styleSheets[i].disabled=false;
+ }
+ var thmcolor="";
+ switch(thm[0])
+ {
+ case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break;
+ case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break;
+ case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break;
+ case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break;
+ }
+ document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor);
+}
+loadTheme();
+</script>
+</head>
+<body onload="ol()" style="overflow-x:hidden;">
+ <div id="panel" class="TText">
+ <ul id="panellist">
+ <li><a href="/"><h1>Chrisoft</h1></a></li>
+ <li><a href="/blog"><h2>Blog</h2></a></li>
+ <li><span>Tags filter</span>
+ <ul id="tagslist">
+
+
+ <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a class="active" href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul>
+ </li>
+ </ul>
+ </div>
+ <div id="content">
+ <div id="postslist">
+
+ <div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2017-11-25.html">A short post on Cakewalk's death and my music production</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#music #garbage</span>
+ <span class="right" id="">2017-11-25/2018-10-11</span></div>
+ </div><div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2017-06-29.html">Trash dump for the fourth semester</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#garbage #daily-life</span>
+ <span class="right" id="">2017-06-29/2018-10-11</span></div>
+ </div><div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2017-01-18.html">Trash dump for the third semester</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#garbage #daily-life</span>
+ <span class="right" id="">2017-01-09/2018-10-11</span></div>
+ </div><div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2017-01-09.html">[多大图警告]终究还是改不了修电脑的命</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#computer-repairing #garbage</span>
+ <span class="right" id="">2017-01-09/2018-10-11</span></div>
+ </div><div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2016-06-21.html">Trash dump for the first academic year</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#garbage #daily-life</span>
+ <span class="right" id="">2016-06-21/2018-10-11</span></div>
+ </div></div>
+ <div id="insanch" style="height:5em;"></div>
+ <div id="footer">
+ <div id="pagesw" class="TText" style="display:table;width:100%;padding:1em 0;">
+ <span style="display:table-cell;"><a id="prepage" href="/blog/list/garbage/1.html">&lt;&lt;</a></span>
+ <span style="text-align:center;display:table-cell;" id="page">3/4</span>
+ <span style="text-align:right;display:table-cell;"><a id="nexpage" href="/blog/list/garbage/3.html">&gt;&gt;</a></span>
+ </div>
+ <div style="text-align:center;" class="TText">
+ Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5
+ <br>
+ Content licensed under CC BY-SA 4.0.
+ </div>
+ </div>
+ </div>
+
+
+</body></html> \ No newline at end of file
diff --git a/blog/list/garbage/3.html b/blog/list/garbage/3.html
new file mode 100644
index 0000000..d5edd9a
--- /dev/null
+++ b/blog/list/garbage/3.html
@@ -0,0 +1,108 @@
+<html><head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<meta name="theme-color" content="#000000">
+<title>Chrisoft::Blog</title>
+<script type="text/javascript" src="/panel.js"></script>
+<link rel="stylesheet" type="text/css" href="/common.css">
+<link rel="stylesheet" type="text/css" href="/panel.css">
+<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
+<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
+<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
+<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
+<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
+<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
+<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
+<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
+<link rel="stylesheet" type="text/css" href="/blog/blogext.css">
+<script>
+function ol()
+{
+ window.onresize=function()
+ {
+ if(window.innerWidth<768)
+ setupevents();
+ else unsetevents();
+ }
+ window.onresize();
+}
+function loadTheme(){
+ var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
+ if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
+ var ent="";
+ var d=new Date();
+ if(thm[0]=='z')
+ {
+ var m=d.getMonth()+1;
+ if(m>=3&&m<6)thm='0'+thm[1];
+ else if(m>=6&&m<9)thm='1'+thm[1];
+ else if(m>=9&&m<12)thm='2'+thm[1];
+ else thm='3'+thm[1];
+ }
+ if(thm[1]=='z')
+ {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
+ ent=`theme${thm}`;
+ var R=new RegExp('theme[0-4][ab]');
+ for(var i=0;i<document.styleSheets.length;++i)
+ {
+ if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
+ document.styleSheets[i].disabled=true;
+ else document.styleSheets[i].disabled=false;
+ }
+ var thmcolor="";
+ switch(thm[0])
+ {
+ case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break;
+ case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break;
+ case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break;
+ case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break;
+ }
+ document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor);
+}
+loadTheme();
+</script>
+</head>
+<body onload="ol()" style="overflow-x:hidden;">
+ <div id="panel" class="TText">
+ <ul id="panellist">
+ <li><a href="/"><h1>Chrisoft</h1></a></li>
+ <li><a href="/blog"><h2>Blog</h2></a></li>
+ <li><span>Tags filter</span>
+ <ul id="tagslist">
+
+
+ <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a class="active" href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul>
+ </li>
+ </ul>
+ </div>
+ <div id="content">
+ <div id="postslist">
+
+ <div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2015-10-31.html">大学入学两个月了……</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#garbage</span>
+ <span class="right" id="">2015-10-31/2018-10-11</span></div>
+ </div><div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2015-10-29.html">noname01.pas</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#garbage</span>
+ <span class="right" id="">2015-10-29/2018-10-11</span></div>
+ </div></div>
+ <div id="insanch" style="height:5em;"></div>
+ <div id="footer">
+ <div id="pagesw" class="TText" style="display:table;width:100%;padding:1em 0;">
+ <span style="display:table-cell;"><a id="prepage" href="/blog/list/garbage/2.html">&lt;&lt;</a></span>
+ <span style="text-align:center;display:table-cell;" id="page">4/4</span>
+ <span style="text-align:right;display:table-cell;"><a id="nexpage" href="#">&gt;&gt;</a></span>
+ </div>
+ <div style="text-align:center;" class="TText">
+ Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5
+ <br>
+ Content licensed under CC BY-SA 4.0.
+ </div>
+ </div>
+ </div>
+
+
+</body></html> \ No newline at end of file
diff --git a/blog/list/garbage/index.html b/blog/list/garbage/index.html
new file mode 120000
index 0000000..359ee56
--- /dev/null
+++ b/blog/list/garbage/index.html
@@ -0,0 +1 @@
+0.html \ No newline at end of file
diff --git a/blog/list/hands-on/0.html b/blog/list/hands-on/0.html
new file mode 100644
index 0000000..3ea01c5
--- /dev/null
+++ b/blog/list/hands-on/0.html
@@ -0,0 +1,108 @@
+<html><head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<meta name="theme-color" content="#000000">
+<title>Chrisoft::Blog</title>
+<script type="text/javascript" src="/panel.js"></script>
+<link rel="stylesheet" type="text/css" href="/common.css">
+<link rel="stylesheet" type="text/css" href="/panel.css">
+<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
+<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
+<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
+<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
+<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
+<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
+<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
+<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
+<link rel="stylesheet" type="text/css" href="/blog/blogext.css">
+<script>
+function ol()
+{
+ window.onresize=function()
+ {
+ if(window.innerWidth<768)
+ setupevents();
+ else unsetevents();
+ }
+ window.onresize();
+}
+function loadTheme(){
+ var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
+ if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
+ var ent="";
+ var d=new Date();
+ if(thm[0]=='z')
+ {
+ var m=d.getMonth()+1;
+ if(m>=3&&m<6)thm='0'+thm[1];
+ else if(m>=6&&m<9)thm='1'+thm[1];
+ else if(m>=9&&m<12)thm='2'+thm[1];
+ else thm='3'+thm[1];
+ }
+ if(thm[1]=='z')
+ {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
+ ent=`theme${thm}`;
+ var R=new RegExp('theme[0-4][ab]');
+ for(var i=0;i<document.styleSheets.length;++i)
+ {
+ if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
+ document.styleSheets[i].disabled=true;
+ else document.styleSheets[i].disabled=false;
+ }
+ var thmcolor="";
+ switch(thm[0])
+ {
+ case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break;
+ case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break;
+ case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break;
+ case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break;
+ }
+ document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor);
+}
+loadTheme();
+</script>
+</head>
+<body onload="ol()" style="overflow-x:hidden;">
+ <div id="panel" class="TText">
+ <ul id="panellist">
+ <li><a href="/"><h1>Chrisoft</h1></a></li>
+ <li><a href="/blog"><h2>Blog</h2></a></li>
+ <li><span>Tags filter</span>
+ <ul id="tagslist">
+
+
+ <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a class="active" href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul>
+ </li>
+ </ul>
+ </div>
+ <div id="content">
+ <div id="postslist">
+
+ <div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2018-12-06.html">小米 MIX 3 上手体验</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#device-review #hands-on</span>
+ <span class="right" id="">2018-12-06/2018-12-12</span></div>
+ </div><div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2015-11-22.html">Raspberry Pi2 初体验</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#hands-on #device-review</span>
+ <span class="right" id="">2015-11-22/2018-10-11</span></div>
+ </div></div>
+ <div id="insanch" style="height:5em;"></div>
+ <div id="footer">
+ <div id="pagesw" class="TText" style="display:table;width:100%;padding:1em 0;">
+ <span style="display:table-cell;"><a id="prepage" href="#">&lt;&lt;</a></span>
+ <span style="text-align:center;display:table-cell;" id="page">1/1</span>
+ <span style="text-align:right;display:table-cell;"><a id="nexpage" href="#">&gt;&gt;</a></span>
+ </div>
+ <div style="text-align:center;" class="TText">
+ Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5
+ <br>
+ Content licensed under CC BY-SA 4.0.
+ </div>
+ </div>
+ </div>
+
+
+</body></html> \ No newline at end of file
diff --git a/blog/list/hands-on/index.html b/blog/list/hands-on/index.html
new file mode 120000
index 0000000..359ee56
--- /dev/null
+++ b/blog/list/hands-on/index.html
@@ -0,0 +1 @@
+0.html \ No newline at end of file
diff --git a/blog/list/index.html b/blog/list/index.html
new file mode 120000
index 0000000..359ee56
--- /dev/null
+++ b/blog/list/index.html
@@ -0,0 +1 @@
+0.html \ No newline at end of file
diff --git a/blog/list/interactive/0.html b/blog/list/interactive/0.html
new file mode 100644
index 0000000..c3477e2
--- /dev/null
+++ b/blog/list/interactive/0.html
@@ -0,0 +1,103 @@
+<html><head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<meta name="theme-color" content="#000000">
+<title>Chrisoft::Blog</title>
+<script type="text/javascript" src="/panel.js"></script>
+<link rel="stylesheet" type="text/css" href="/common.css">
+<link rel="stylesheet" type="text/css" href="/panel.css">
+<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
+<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
+<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
+<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
+<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
+<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
+<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
+<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
+<link rel="stylesheet" type="text/css" href="/blog/blogext.css">
+<script>
+function ol()
+{
+ window.onresize=function()
+ {
+ if(window.innerWidth<768)
+ setupevents();
+ else unsetevents();
+ }
+ window.onresize();
+}
+function loadTheme(){
+ var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
+ if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
+ var ent="";
+ var d=new Date();
+ if(thm[0]=='z')
+ {
+ var m=d.getMonth()+1;
+ if(m>=3&&m<6)thm='0'+thm[1];
+ else if(m>=6&&m<9)thm='1'+thm[1];
+ else if(m>=9&&m<12)thm='2'+thm[1];
+ else thm='3'+thm[1];
+ }
+ if(thm[1]=='z')
+ {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
+ ent=`theme${thm}`;
+ var R=new RegExp('theme[0-4][ab]');
+ for(var i=0;i<document.styleSheets.length;++i)
+ {
+ if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
+ document.styleSheets[i].disabled=true;
+ else document.styleSheets[i].disabled=false;
+ }
+ var thmcolor="";
+ switch(thm[0])
+ {
+ case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break;
+ case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break;
+ case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break;
+ case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break;
+ }
+ document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor);
+}
+loadTheme();
+</script>
+</head>
+<body onload="ol()" style="overflow-x:hidden;">
+ <div id="panel" class="TText">
+ <ul id="panellist">
+ <li><a href="/"><h1>Chrisoft</h1></a></li>
+ <li><a href="/blog"><h2>Blog</h2></a></li>
+ <li><span>Tags filter</span>
+ <ul id="tagslist">
+
+
+ <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a class="active" href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul>
+ </li>
+ </ul>
+ </div>
+ <div id="content">
+ <div id="postslist">
+
+ <div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2018-05-03.html">Are you an Apple fanboy/fangirl?</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#garbage #interactive</span>
+ <span class="right" id="">2018-05-03/2019-02-10</span></div>
+ </div></div>
+ <div id="insanch" style="height:5em;"></div>
+ <div id="footer">
+ <div id="pagesw" class="TText" style="display:table;width:100%;padding:1em 0;">
+ <span style="display:table-cell;"><a id="prepage" href="#">&lt;&lt;</a></span>
+ <span style="text-align:center;display:table-cell;" id="page">1/1</span>
+ <span style="text-align:right;display:table-cell;"><a id="nexpage" href="#">&gt;&gt;</a></span>
+ </div>
+ <div style="text-align:center;" class="TText">
+ Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5
+ <br>
+ Content licensed under CC BY-SA 4.0.
+ </div>
+ </div>
+ </div>
+
+
+</body></html> \ No newline at end of file
diff --git a/blog/list/interactive/index.html b/blog/list/interactive/index.html
new file mode 120000
index 0000000..359ee56
--- /dev/null
+++ b/blog/list/interactive/index.html
@@ -0,0 +1 @@
+0.html \ No newline at end of file
diff --git a/blog/list/js/0.html b/blog/list/js/0.html
new file mode 100644
index 0000000..314dc01
--- /dev/null
+++ b/blog/list/js/0.html
@@ -0,0 +1,108 @@
+<html><head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<meta name="theme-color" content="#000000">
+<title>Chrisoft::Blog</title>
+<script type="text/javascript" src="/panel.js"></script>
+<link rel="stylesheet" type="text/css" href="/common.css">
+<link rel="stylesheet" type="text/css" href="/panel.css">
+<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
+<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
+<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
+<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
+<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
+<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
+<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
+<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
+<link rel="stylesheet" type="text/css" href="/blog/blogext.css">
+<script>
+function ol()
+{
+ window.onresize=function()
+ {
+ if(window.innerWidth<768)
+ setupevents();
+ else unsetevents();
+ }
+ window.onresize();
+}
+function loadTheme(){
+ var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
+ if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
+ var ent="";
+ var d=new Date();
+ if(thm[0]=='z')
+ {
+ var m=d.getMonth()+1;
+ if(m>=3&&m<6)thm='0'+thm[1];
+ else if(m>=6&&m<9)thm='1'+thm[1];
+ else if(m>=9&&m<12)thm='2'+thm[1];
+ else thm='3'+thm[1];
+ }
+ if(thm[1]=='z')
+ {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
+ ent=`theme${thm}`;
+ var R=new RegExp('theme[0-4][ab]');
+ for(var i=0;i<document.styleSheets.length;++i)
+ {
+ if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
+ document.styleSheets[i].disabled=true;
+ else document.styleSheets[i].disabled=false;
+ }
+ var thmcolor="";
+ switch(thm[0])
+ {
+ case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break;
+ case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break;
+ case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break;
+ case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break;
+ }
+ document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor);
+}
+loadTheme();
+</script>
+</head>
+<body onload="ol()" style="overflow-x:hidden;">
+ <div id="panel" class="TText">
+ <ul id="panellist">
+ <li><a href="/"><h1>Chrisoft</h1></a></li>
+ <li><a href="/blog"><h2>Blog</h2></a></li>
+ <li><span>Tags filter</span>
+ <ul id="tagslist">
+
+
+ <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a class="active" href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul>
+ </li>
+ </ul>
+ </div>
+ <div id="content">
+ <div id="postslist">
+
+ <div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2018-10-11.html">The stupid blogging system evolved!</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#web #devel #js</span>
+ <span class="right" id="">2018-10-11/2018-10-11</span></div>
+ </div><div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2016-02-18.html">Cross Noodles Recooked</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#devel #js #webgl</span>
+ <span class="right" id="">2016-02-18/2018-10-11</span></div>
+ </div></div>
+ <div id="insanch" style="height:5em;"></div>
+ <div id="footer">
+ <div id="pagesw" class="TText" style="display:table;width:100%;padding:1em 0;">
+ <span style="display:table-cell;"><a id="prepage" href="#">&lt;&lt;</a></span>
+ <span style="text-align:center;display:table-cell;" id="page">1/1</span>
+ <span style="text-align:right;display:table-cell;"><a id="nexpage" href="#">&gt;&gt;</a></span>
+ </div>
+ <div style="text-align:center;" class="TText">
+ Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5
+ <br>
+ Content licensed under CC BY-SA 4.0.
+ </div>
+ </div>
+ </div>
+
+
+</body></html> \ No newline at end of file
diff --git a/blog/list/js/index.html b/blog/list/js/index.html
new file mode 120000
index 0000000..359ee56
--- /dev/null
+++ b/blog/list/js/index.html
@@ -0,0 +1 @@
+0.html \ No newline at end of file
diff --git a/blog/list/linux/0.html b/blog/list/linux/0.html
new file mode 100644
index 0000000..1cb5050
--- /dev/null
+++ b/blog/list/linux/0.html
@@ -0,0 +1,103 @@
+<html><head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<meta name="theme-color" content="#000000">
+<title>Chrisoft::Blog</title>
+<script type="text/javascript" src="/panel.js"></script>
+<link rel="stylesheet" type="text/css" href="/common.css">
+<link rel="stylesheet" type="text/css" href="/panel.css">
+<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
+<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
+<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
+<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
+<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
+<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
+<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
+<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
+<link rel="stylesheet" type="text/css" href="/blog/blogext.css">
+<script>
+function ol()
+{
+ window.onresize=function()
+ {
+ if(window.innerWidth<768)
+ setupevents();
+ else unsetevents();
+ }
+ window.onresize();
+}
+function loadTheme(){
+ var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
+ if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
+ var ent="";
+ var d=new Date();
+ if(thm[0]=='z')
+ {
+ var m=d.getMonth()+1;
+ if(m>=3&&m<6)thm='0'+thm[1];
+ else if(m>=6&&m<9)thm='1'+thm[1];
+ else if(m>=9&&m<12)thm='2'+thm[1];
+ else thm='3'+thm[1];
+ }
+ if(thm[1]=='z')
+ {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
+ ent=`theme${thm}`;
+ var R=new RegExp('theme[0-4][ab]');
+ for(var i=0;i<document.styleSheets.length;++i)
+ {
+ if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
+ document.styleSheets[i].disabled=true;
+ else document.styleSheets[i].disabled=false;
+ }
+ var thmcolor="";
+ switch(thm[0])
+ {
+ case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break;
+ case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break;
+ case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break;
+ case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break;
+ }
+ document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor);
+}
+loadTheme();
+</script>
+</head>
+<body onload="ol()" style="overflow-x:hidden;">
+ <div id="panel" class="TText">
+ <ul id="panellist">
+ <li><a href="/"><h1>Chrisoft</h1></a></li>
+ <li><a href="/blog"><h2>Blog</h2></a></li>
+ <li><span>Tags filter</span>
+ <ul id="tagslist">
+
+
+ <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a class="active" href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul>
+ </li>
+ </ul>
+ </div>
+ <div id="content">
+ <div id="postslist">
+
+ <div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2018-04-17.html">The "Deepin is spyware" problem</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#linux #garbage #sophistry</span>
+ <span class="right" id="">2018-04-17/2018-10-11</span></div>
+ </div></div>
+ <div id="insanch" style="height:5em;"></div>
+ <div id="footer">
+ <div id="pagesw" class="TText" style="display:table;width:100%;padding:1em 0;">
+ <span style="display:table-cell;"><a id="prepage" href="#">&lt;&lt;</a></span>
+ <span style="text-align:center;display:table-cell;" id="page">1/1</span>
+ <span style="text-align:right;display:table-cell;"><a id="nexpage" href="#">&gt;&gt;</a></span>
+ </div>
+ <div style="text-align:center;" class="TText">
+ Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5
+ <br>
+ Content licensed under CC BY-SA 4.0.
+ </div>
+ </div>
+ </div>
+
+
+</body></html> \ No newline at end of file
diff --git a/blog/list/linux/index.html b/blog/list/linux/index.html
new file mode 120000
index 0000000..359ee56
--- /dev/null
+++ b/blog/list/linux/index.html
@@ -0,0 +1 @@
+0.html \ No newline at end of file
diff --git a/blog/list/midi/0.html b/blog/list/midi/0.html
new file mode 100644
index 0000000..6857a74
--- /dev/null
+++ b/blog/list/midi/0.html
@@ -0,0 +1,103 @@
+<html><head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<meta name="theme-color" content="#000000">
+<title>Chrisoft::Blog</title>
+<script type="text/javascript" src="/panel.js"></script>
+<link rel="stylesheet" type="text/css" href="/common.css">
+<link rel="stylesheet" type="text/css" href="/panel.css">
+<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
+<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
+<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
+<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
+<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
+<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
+<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
+<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
+<link rel="stylesheet" type="text/css" href="/blog/blogext.css">
+<script>
+function ol()
+{
+ window.onresize=function()
+ {
+ if(window.innerWidth<768)
+ setupevents();
+ else unsetevents();
+ }
+ window.onresize();
+}
+function loadTheme(){
+ var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
+ if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
+ var ent="";
+ var d=new Date();
+ if(thm[0]=='z')
+ {
+ var m=d.getMonth()+1;
+ if(m>=3&&m<6)thm='0'+thm[1];
+ else if(m>=6&&m<9)thm='1'+thm[1];
+ else if(m>=9&&m<12)thm='2'+thm[1];
+ else thm='3'+thm[1];
+ }
+ if(thm[1]=='z')
+ {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
+ ent=`theme${thm}`;
+ var R=new RegExp('theme[0-4][ab]');
+ for(var i=0;i<document.styleSheets.length;++i)
+ {
+ if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
+ document.styleSheets[i].disabled=true;
+ else document.styleSheets[i].disabled=false;
+ }
+ var thmcolor="";
+ switch(thm[0])
+ {
+ case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break;
+ case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break;
+ case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break;
+ case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break;
+ }
+ document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor);
+}
+loadTheme();
+</script>
+</head>
+<body onload="ol()" style="overflow-x:hidden;">
+ <div id="panel" class="TText">
+ <ul id="panellist">
+ <li><a href="/"><h1>Chrisoft</h1></a></li>
+ <li><a href="/blog"><h2>Blog</h2></a></li>
+ <li><span>Tags filter</span>
+ <ul id="tagslist">
+
+
+ <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a class="active" href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul>
+ </li>
+ </ul>
+ </div>
+ <div id="content">
+ <div id="postslist">
+
+ <div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2016-04-09.html">The MIDI File Format Specification and MIDI Implementation in QMidiPlayer</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#devel #qmidiplayer #midi</span>
+ <span class="right" id="">2016-04-09/2018-10-11</span></div>
+ </div></div>
+ <div id="insanch" style="height:5em;"></div>
+ <div id="footer">
+ <div id="pagesw" class="TText" style="display:table;width:100%;padding:1em 0;">
+ <span style="display:table-cell;"><a id="prepage" href="#">&lt;&lt;</a></span>
+ <span style="text-align:center;display:table-cell;" id="page">1/1</span>
+ <span style="text-align:right;display:table-cell;"><a id="nexpage" href="#">&gt;&gt;</a></span>
+ </div>
+ <div style="text-align:center;" class="TText">
+ Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5
+ <br>
+ Content licensed under CC BY-SA 4.0.
+ </div>
+ </div>
+ </div>
+
+
+</body></html> \ No newline at end of file
diff --git a/blog/list/midi/index.html b/blog/list/midi/index.html
new file mode 120000
index 0000000..359ee56
--- /dev/null
+++ b/blog/list/midi/index.html
@@ -0,0 +1 @@
+0.html \ No newline at end of file
diff --git a/blog/list/music/0.html b/blog/list/music/0.html
new file mode 100644
index 0000000..e1fe033
--- /dev/null
+++ b/blog/list/music/0.html
@@ -0,0 +1,103 @@
+<html><head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<meta name="theme-color" content="#000000">
+<title>Chrisoft::Blog</title>
+<script type="text/javascript" src="/panel.js"></script>
+<link rel="stylesheet" type="text/css" href="/common.css">
+<link rel="stylesheet" type="text/css" href="/panel.css">
+<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
+<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
+<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
+<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
+<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
+<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
+<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
+<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
+<link rel="stylesheet" type="text/css" href="/blog/blogext.css">
+<script>
+function ol()
+{
+ window.onresize=function()
+ {
+ if(window.innerWidth<768)
+ setupevents();
+ else unsetevents();
+ }
+ window.onresize();
+}
+function loadTheme(){
+ var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
+ if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
+ var ent="";
+ var d=new Date();
+ if(thm[0]=='z')
+ {
+ var m=d.getMonth()+1;
+ if(m>=3&&m<6)thm='0'+thm[1];
+ else if(m>=6&&m<9)thm='1'+thm[1];
+ else if(m>=9&&m<12)thm='2'+thm[1];
+ else thm='3'+thm[1];
+ }
+ if(thm[1]=='z')
+ {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
+ ent=`theme${thm}`;
+ var R=new RegExp('theme[0-4][ab]');
+ for(var i=0;i<document.styleSheets.length;++i)
+ {
+ if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
+ document.styleSheets[i].disabled=true;
+ else document.styleSheets[i].disabled=false;
+ }
+ var thmcolor="";
+ switch(thm[0])
+ {
+ case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break;
+ case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break;
+ case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break;
+ case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break;
+ }
+ document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor);
+}
+loadTheme();
+</script>
+</head>
+<body onload="ol()" style="overflow-x:hidden;">
+ <div id="panel" class="TText">
+ <ul id="panellist">
+ <li><a href="/"><h1>Chrisoft</h1></a></li>
+ <li><a href="/blog"><h2>Blog</h2></a></li>
+ <li><span>Tags filter</span>
+ <ul id="tagslist">
+
+
+ <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a class="active" href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul>
+ </li>
+ </ul>
+ </div>
+ <div id="content">
+ <div id="postslist">
+
+ <div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2017-11-25.html">A short post on Cakewalk's death and my music production</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#music #garbage</span>
+ <span class="right" id="">2017-11-25/2018-10-11</span></div>
+ </div></div>
+ <div id="insanch" style="height:5em;"></div>
+ <div id="footer">
+ <div id="pagesw" class="TText" style="display:table;width:100%;padding:1em 0;">
+ <span style="display:table-cell;"><a id="prepage" href="#">&lt;&lt;</a></span>
+ <span style="text-align:center;display:table-cell;" id="page">1/1</span>
+ <span style="text-align:right;display:table-cell;"><a id="nexpage" href="#">&gt;&gt;</a></span>
+ </div>
+ <div style="text-align:center;" class="TText">
+ Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5
+ <br>
+ Content licensed under CC BY-SA 4.0.
+ </div>
+ </div>
+ </div>
+
+
+</body></html> \ No newline at end of file
diff --git a/blog/list/music/index.html b/blog/list/music/index.html
new file mode 120000
index 0000000..359ee56
--- /dev/null
+++ b/blog/list/music/index.html
@@ -0,0 +1 @@
+0.html \ No newline at end of file
diff --git a/blog/list/opengl/0.html b/blog/list/opengl/0.html
new file mode 100644
index 0000000..6e4a8d1
--- /dev/null
+++ b/blog/list/opengl/0.html
@@ -0,0 +1,103 @@
+<html><head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<meta name="theme-color" content="#000000">
+<title>Chrisoft::Blog</title>
+<script type="text/javascript" src="/panel.js"></script>
+<link rel="stylesheet" type="text/css" href="/common.css">
+<link rel="stylesheet" type="text/css" href="/panel.css">
+<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
+<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
+<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
+<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
+<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
+<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
+<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
+<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
+<link rel="stylesheet" type="text/css" href="/blog/blogext.css">
+<script>
+function ol()
+{
+ window.onresize=function()
+ {
+ if(window.innerWidth<768)
+ setupevents();
+ else unsetevents();
+ }
+ window.onresize();
+}
+function loadTheme(){
+ var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
+ if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
+ var ent="";
+ var d=new Date();
+ if(thm[0]=='z')
+ {
+ var m=d.getMonth()+1;
+ if(m>=3&&m<6)thm='0'+thm[1];
+ else if(m>=6&&m<9)thm='1'+thm[1];
+ else if(m>=9&&m<12)thm='2'+thm[1];
+ else thm='3'+thm[1];
+ }
+ if(thm[1]=='z')
+ {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
+ ent=`theme${thm}`;
+ var R=new RegExp('theme[0-4][ab]');
+ for(var i=0;i<document.styleSheets.length;++i)
+ {
+ if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
+ document.styleSheets[i].disabled=true;
+ else document.styleSheets[i].disabled=false;
+ }
+ var thmcolor="";
+ switch(thm[0])
+ {
+ case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break;
+ case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break;
+ case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break;
+ case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break;
+ }
+ document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor);
+}
+loadTheme();
+</script>
+</head>
+<body onload="ol()" style="overflow-x:hidden;">
+ <div id="panel" class="TText">
+ <ul id="panellist">
+ <li><a href="/"><h1>Chrisoft</h1></a></li>
+ <li><a href="/blog"><h2>Blog</h2></a></li>
+ <li><span>Tags filter</span>
+ <ul id="tagslist">
+
+
+ <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a class="active" href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul>
+ </li>
+ </ul>
+ </div>
+ <div id="content">
+ <div id="postslist">
+
+ <div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2018-03-17.html">Some rants on SMELT, QMidiPlayer and Virtools</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#devel #qmidiplayer #opengl</span>
+ <span class="right" id="">2018-03-17/2018-10-11</span></div>
+ </div></div>
+ <div id="insanch" style="height:5em;"></div>
+ <div id="footer">
+ <div id="pagesw" class="TText" style="display:table;width:100%;padding:1em 0;">
+ <span style="display:table-cell;"><a id="prepage" href="#">&lt;&lt;</a></span>
+ <span style="text-align:center;display:table-cell;" id="page">1/1</span>
+ <span style="text-align:right;display:table-cell;"><a id="nexpage" href="#">&gt;&gt;</a></span>
+ </div>
+ <div style="text-align:center;" class="TText">
+ Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5
+ <br>
+ Content licensed under CC BY-SA 4.0.
+ </div>
+ </div>
+ </div>
+
+
+</body></html> \ No newline at end of file
diff --git a/blog/list/opengl/index.html b/blog/list/opengl/index.html
new file mode 120000
index 0000000..359ee56
--- /dev/null
+++ b/blog/list/opengl/index.html
@@ -0,0 +1 @@
+0.html \ No newline at end of file
diff --git a/blog/list/qmidiplayer/0.html b/blog/list/qmidiplayer/0.html
new file mode 100644
index 0000000..d3719b6
--- /dev/null
+++ b/blog/list/qmidiplayer/0.html
@@ -0,0 +1,123 @@
+<html><head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<meta name="theme-color" content="#000000">
+<title>Chrisoft::Blog</title>
+<script type="text/javascript" src="/panel.js"></script>
+<link rel="stylesheet" type="text/css" href="/common.css">
+<link rel="stylesheet" type="text/css" href="/panel.css">
+<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
+<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
+<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
+<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
+<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
+<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
+<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
+<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
+<link rel="stylesheet" type="text/css" href="/blog/blogext.css">
+<script>
+function ol()
+{
+ window.onresize=function()
+ {
+ if(window.innerWidth<768)
+ setupevents();
+ else unsetevents();
+ }
+ window.onresize();
+}
+function loadTheme(){
+ var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
+ if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
+ var ent="";
+ var d=new Date();
+ if(thm[0]=='z')
+ {
+ var m=d.getMonth()+1;
+ if(m>=3&&m<6)thm='0'+thm[1];
+ else if(m>=6&&m<9)thm='1'+thm[1];
+ else if(m>=9&&m<12)thm='2'+thm[1];
+ else thm='3'+thm[1];
+ }
+ if(thm[1]=='z')
+ {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
+ ent=`theme${thm}`;
+ var R=new RegExp('theme[0-4][ab]');
+ for(var i=0;i<document.styleSheets.length;++i)
+ {
+ if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
+ document.styleSheets[i].disabled=true;
+ else document.styleSheets[i].disabled=false;
+ }
+ var thmcolor="";
+ switch(thm[0])
+ {
+ case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break;
+ case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break;
+ case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break;
+ case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break;
+ }
+ document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor);
+}
+loadTheme();
+</script>
+</head>
+<body onload="ol()" style="overflow-x:hidden;">
+ <div id="panel" class="TText">
+ <ul id="panellist">
+ <li><a href="/"><h1>Chrisoft</h1></a></li>
+ <li><a href="/blog"><h2>Blog</h2></a></li>
+ <li><span>Tags filter</span>
+ <ul id="tagslist">
+
+
+ <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a class="active" href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul>
+ </li>
+ </ul>
+ </div>
+ <div id="content">
+ <div id="postslist">
+
+ <div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2018-03-17.html">Some rants on SMELT, QMidiPlayer and Virtools</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#devel #qmidiplayer #opengl</span>
+ <span class="right" id="">2018-03-17/2018-10-11</span></div>
+ </div><div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2016-09-24.html">2-in-1</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#devel #qmidiplayer #c++ #qt</span>
+ <span class="right" id="">2016-09-24/2018-10-11</span></div>
+ </div><div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2016-04-09.html">The MIDI File Format Specification and MIDI Implementation in QMidiPlayer</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#devel #qmidiplayer #midi</span>
+ <span class="right" id="">2016-04-09/2018-10-11</span></div>
+ </div><div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2016-01-16.html">QMidiPlayer Progress-2016-01-16</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#devel #qmidiplayer</span>
+ <span class="right" id="">2016-01-16/2018-10-11</span></div>
+ </div><div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2015-12-27.html">QMidiPlayer got its repo</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#devel #qmidiplayer</span>
+ <span class="right" id="">2015-12-27/2018-10-11</span></div>
+ </div></div>
+ <div id="insanch" style="height:5em;"></div>
+ <div id="footer">
+ <div id="pagesw" class="TText" style="display:table;width:100%;padding:1em 0;">
+ <span style="display:table-cell;"><a id="prepage" href="#">&lt;&lt;</a></span>
+ <span style="text-align:center;display:table-cell;" id="page">1/1</span>
+ <span style="text-align:right;display:table-cell;"><a id="nexpage" href="#">&gt;&gt;</a></span>
+ </div>
+ <div style="text-align:center;" class="TText">
+ Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5
+ <br>
+ Content licensed under CC BY-SA 4.0.
+ </div>
+ </div>
+ </div>
+
+
+</body></html> \ No newline at end of file
diff --git a/blog/list/qmidiplayer/index.html b/blog/list/qmidiplayer/index.html
new file mode 120000
index 0000000..359ee56
--- /dev/null
+++ b/blog/list/qmidiplayer/index.html
@@ -0,0 +1 @@
+0.html \ No newline at end of file
diff --git a/blog/list/qt/0.html b/blog/list/qt/0.html
new file mode 100644
index 0000000..945af5c
--- /dev/null
+++ b/blog/list/qt/0.html
@@ -0,0 +1,103 @@
+<html><head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<meta name="theme-color" content="#000000">
+<title>Chrisoft::Blog</title>
+<script type="text/javascript" src="/panel.js"></script>
+<link rel="stylesheet" type="text/css" href="/common.css">
+<link rel="stylesheet" type="text/css" href="/panel.css">
+<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
+<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
+<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
+<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
+<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
+<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
+<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
+<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
+<link rel="stylesheet" type="text/css" href="/blog/blogext.css">
+<script>
+function ol()
+{
+ window.onresize=function()
+ {
+ if(window.innerWidth<768)
+ setupevents();
+ else unsetevents();
+ }
+ window.onresize();
+}
+function loadTheme(){
+ var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
+ if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
+ var ent="";
+ var d=new Date();
+ if(thm[0]=='z')
+ {
+ var m=d.getMonth()+1;
+ if(m>=3&&m<6)thm='0'+thm[1];
+ else if(m>=6&&m<9)thm='1'+thm[1];
+ else if(m>=9&&m<12)thm='2'+thm[1];
+ else thm='3'+thm[1];
+ }
+ if(thm[1]=='z')
+ {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
+ ent=`theme${thm}`;
+ var R=new RegExp('theme[0-4][ab]');
+ for(var i=0;i<document.styleSheets.length;++i)
+ {
+ if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
+ document.styleSheets[i].disabled=true;
+ else document.styleSheets[i].disabled=false;
+ }
+ var thmcolor="";
+ switch(thm[0])
+ {
+ case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break;
+ case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break;
+ case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break;
+ case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break;
+ }
+ document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor);
+}
+loadTheme();
+</script>
+</head>
+<body onload="ol()" style="overflow-x:hidden;">
+ <div id="panel" class="TText">
+ <ul id="panellist">
+ <li><a href="/"><h1>Chrisoft</h1></a></li>
+ <li><a href="/blog"><h2>Blog</h2></a></li>
+ <li><span>Tags filter</span>
+ <ul id="tagslist">
+
+
+ <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a class="active" href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul>
+ </li>
+ </ul>
+ </div>
+ <div id="content">
+ <div id="postslist">
+
+ <div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2016-09-24.html">2-in-1</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#devel #qmidiplayer #c++ #qt</span>
+ <span class="right" id="">2016-09-24/2018-10-11</span></div>
+ </div></div>
+ <div id="insanch" style="height:5em;"></div>
+ <div id="footer">
+ <div id="pagesw" class="TText" style="display:table;width:100%;padding:1em 0;">
+ <span style="display:table-cell;"><a id="prepage" href="#">&lt;&lt;</a></span>
+ <span style="text-align:center;display:table-cell;" id="page">1/1</span>
+ <span style="text-align:right;display:table-cell;"><a id="nexpage" href="#">&gt;&gt;</a></span>
+ </div>
+ <div style="text-align:center;" class="TText">
+ Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5
+ <br>
+ Content licensed under CC BY-SA 4.0.
+ </div>
+ </div>
+ </div>
+
+
+</body></html> \ No newline at end of file
diff --git a/blog/list/qt/index.html b/blog/list/qt/index.html
new file mode 120000
index 0000000..359ee56
--- /dev/null
+++ b/blog/list/qt/index.html
@@ -0,0 +1 @@
+0.html \ No newline at end of file
diff --git a/blog/list/random-xp/0.html b/blog/list/random-xp/0.html
new file mode 100644
index 0000000..df19b9a
--- /dev/null
+++ b/blog/list/random-xp/0.html
@@ -0,0 +1,113 @@
+<html><head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<meta name="theme-color" content="#000000">
+<title>Chrisoft::Blog</title>
+<script type="text/javascript" src="/panel.js"></script>
+<link rel="stylesheet" type="text/css" href="/common.css">
+<link rel="stylesheet" type="text/css" href="/panel.css">
+<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
+<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
+<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
+<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
+<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
+<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
+<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
+<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
+<link rel="stylesheet" type="text/css" href="/blog/blogext.css">
+<script>
+function ol()
+{
+ window.onresize=function()
+ {
+ if(window.innerWidth<768)
+ setupevents();
+ else unsetevents();
+ }
+ window.onresize();
+}
+function loadTheme(){
+ var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
+ if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
+ var ent="";
+ var d=new Date();
+ if(thm[0]=='z')
+ {
+ var m=d.getMonth()+1;
+ if(m>=3&&m<6)thm='0'+thm[1];
+ else if(m>=6&&m<9)thm='1'+thm[1];
+ else if(m>=9&&m<12)thm='2'+thm[1];
+ else thm='3'+thm[1];
+ }
+ if(thm[1]=='z')
+ {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
+ ent=`theme${thm}`;
+ var R=new RegExp('theme[0-4][ab]');
+ for(var i=0;i<document.styleSheets.length;++i)
+ {
+ if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
+ document.styleSheets[i].disabled=true;
+ else document.styleSheets[i].disabled=false;
+ }
+ var thmcolor="";
+ switch(thm[0])
+ {
+ case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break;
+ case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break;
+ case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break;
+ case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break;
+ }
+ document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor);
+}
+loadTheme();
+</script>
+</head>
+<body onload="ol()" style="overflow-x:hidden;">
+ <div id="panel" class="TText">
+ <ul id="panellist">
+ <li><a href="/"><h1>Chrisoft</h1></a></li>
+ <li><a href="/blog"><h2>Blog</h2></a></li>
+ <li><span>Tags filter</span>
+ <ul id="tagslist">
+
+
+ <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a class="active" href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul>
+ </li>
+ </ul>
+ </div>
+ <div id="content">
+ <div id="postslist">
+
+ <div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2018-01-05.html">Now using reverse proxy to deliver content</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#web #random-xp</span>
+ <span class="right" id="">2018-01-05/2018-10-11</span></div>
+ </div><div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2015-12-20.html">忙</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#random-xp</span>
+ <span class="right" id="">2015-12-20/2018-10-11</span></div>
+ </div><div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2015-11-01.html">Hackathon 2015乱搞记</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#random-xp</span>
+ <span class="right" id="">2015-11-01/2015-11-22</span></div>
+ </div></div>
+ <div id="insanch" style="height:5em;"></div>
+ <div id="footer">
+ <div id="pagesw" class="TText" style="display:table;width:100%;padding:1em 0;">
+ <span style="display:table-cell;"><a id="prepage" href="#">&lt;&lt;</a></span>
+ <span style="text-align:center;display:table-cell;" id="page">1/1</span>
+ <span style="text-align:right;display:table-cell;"><a id="nexpage" href="#">&gt;&gt;</a></span>
+ </div>
+ <div style="text-align:center;" class="TText">
+ Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5
+ <br>
+ Content licensed under CC BY-SA 4.0.
+ </div>
+ </div>
+ </div>
+
+
+</body></html> \ No newline at end of file
diff --git a/blog/list/random-xp/index.html b/blog/list/random-xp/index.html
new file mode 120000
index 0000000..359ee56
--- /dev/null
+++ b/blog/list/random-xp/index.html
@@ -0,0 +1 @@
+0.html \ No newline at end of file
diff --git a/blog/list/sophistry/0.html b/blog/list/sophistry/0.html
new file mode 100644
index 0000000..419e79b
--- /dev/null
+++ b/blog/list/sophistry/0.html
@@ -0,0 +1,123 @@
+<html><head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<meta name="theme-color" content="#000000">
+<title>Chrisoft::Blog</title>
+<script type="text/javascript" src="/panel.js"></script>
+<link rel="stylesheet" type="text/css" href="/common.css">
+<link rel="stylesheet" type="text/css" href="/panel.css">
+<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
+<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
+<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
+<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
+<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
+<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
+<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
+<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
+<link rel="stylesheet" type="text/css" href="/blog/blogext.css">
+<script>
+function ol()
+{
+ window.onresize=function()
+ {
+ if(window.innerWidth<768)
+ setupevents();
+ else unsetevents();
+ }
+ window.onresize();
+}
+function loadTheme(){
+ var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
+ if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
+ var ent="";
+ var d=new Date();
+ if(thm[0]=='z')
+ {
+ var m=d.getMonth()+1;
+ if(m>=3&&m<6)thm='0'+thm[1];
+ else if(m>=6&&m<9)thm='1'+thm[1];
+ else if(m>=9&&m<12)thm='2'+thm[1];
+ else thm='3'+thm[1];
+ }
+ if(thm[1]=='z')
+ {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
+ ent=`theme${thm}`;
+ var R=new RegExp('theme[0-4][ab]');
+ for(var i=0;i<document.styleSheets.length;++i)
+ {
+ if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
+ document.styleSheets[i].disabled=true;
+ else document.styleSheets[i].disabled=false;
+ }
+ var thmcolor="";
+ switch(thm[0])
+ {
+ case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break;
+ case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break;
+ case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break;
+ case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break;
+ }
+ document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor);
+}
+loadTheme();
+</script>
+</head>
+<body onload="ol()" style="overflow-x:hidden;">
+ <div id="panel" class="TText">
+ <ul id="panellist">
+ <li><a href="/"><h1>Chrisoft</h1></a></li>
+ <li><a href="/blog"><h2>Blog</h2></a></li>
+ <li><span>Tags filter</span>
+ <ul id="tagslist">
+
+
+ <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a class="active" href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul>
+ </li>
+ </ul>
+ </div>
+ <div id="content">
+ <div id="postslist">
+
+ <div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2018-06-07.html">Should this site still be alive by 2035...</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#sophistry #garbage</span>
+ <span class="right" id="">2018-06-07/2018-10-11</span></div>
+ </div><div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2018-06-05.html">Software Project Management in the Free Software World</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#sophistry</span>
+ <span class="right" id="">2018-06-05/2018-10-16</span></div>
+ </div><div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2018-05-18.html">Ideology vs Pragmatism &amp;c.</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#sophistry #garbage</span>
+ <span class="right" id="">2018-05-18/2018-10-11</span></div>
+ </div><div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2018-05-08.html">Respecting your job</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#sophistry #garbage #acmicpc</span>
+ <span class="right" id="">2018-05-08/2018-10-11</span></div>
+ </div><div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2018-04-17.html">The "Deepin is spyware" problem</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#linux #garbage #sophistry</span>
+ <span class="right" id="">2018-04-17/2018-10-11</span></div>
+ </div></div>
+ <div id="insanch" style="height:5em;"></div>
+ <div id="footer">
+ <div id="pagesw" class="TText" style="display:table;width:100%;padding:1em 0;">
+ <span style="display:table-cell;"><a id="prepage" href="#">&lt;&lt;</a></span>
+ <span style="text-align:center;display:table-cell;" id="page">1/2</span>
+ <span style="text-align:right;display:table-cell;"><a id="nexpage" href="/blog/list/sophistry/1.html">&gt;&gt;</a></span>
+ </div>
+ <div style="text-align:center;" class="TText">
+ Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5
+ <br>
+ Content licensed under CC BY-SA 4.0.
+ </div>
+ </div>
+ </div>
+
+
+</body></html> \ No newline at end of file
diff --git a/blog/list/sophistry/1.html b/blog/list/sophistry/1.html
new file mode 100644
index 0000000..7c53715
--- /dev/null
+++ b/blog/list/sophistry/1.html
@@ -0,0 +1,103 @@
+<html><head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<meta name="theme-color" content="#000000">
+<title>Chrisoft::Blog</title>
+<script type="text/javascript" src="/panel.js"></script>
+<link rel="stylesheet" type="text/css" href="/common.css">
+<link rel="stylesheet" type="text/css" href="/panel.css">
+<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
+<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
+<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
+<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
+<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
+<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
+<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
+<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
+<link rel="stylesheet" type="text/css" href="/blog/blogext.css">
+<script>
+function ol()
+{
+ window.onresize=function()
+ {
+ if(window.innerWidth<768)
+ setupevents();
+ else unsetevents();
+ }
+ window.onresize();
+}
+function loadTheme(){
+ var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
+ if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
+ var ent="";
+ var d=new Date();
+ if(thm[0]=='z')
+ {
+ var m=d.getMonth()+1;
+ if(m>=3&&m<6)thm='0'+thm[1];
+ else if(m>=6&&m<9)thm='1'+thm[1];
+ else if(m>=9&&m<12)thm='2'+thm[1];
+ else thm='3'+thm[1];
+ }
+ if(thm[1]=='z')
+ {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
+ ent=`theme${thm}`;
+ var R=new RegExp('theme[0-4][ab]');
+ for(var i=0;i<document.styleSheets.length;++i)
+ {
+ if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
+ document.styleSheets[i].disabled=true;
+ else document.styleSheets[i].disabled=false;
+ }
+ var thmcolor="";
+ switch(thm[0])
+ {
+ case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break;
+ case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break;
+ case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break;
+ case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break;
+ }
+ document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor);
+}
+loadTheme();
+</script>
+</head>
+<body onload="ol()" style="overflow-x:hidden;">
+ <div id="panel" class="TText">
+ <ul id="panellist">
+ <li><a href="/"><h1>Chrisoft</h1></a></li>
+ <li><a href="/blog"><h2>Blog</h2></a></li>
+ <li><span>Tags filter</span>
+ <ul id="tagslist">
+
+
+ <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a class="active" href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul>
+ </li>
+ </ul>
+ </div>
+ <div id="content">
+ <div id="postslist">
+
+ <div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2016-02-14.html">Why Do I Prefer a Computer over a Girlfriend/<s>(Boyfriend)</s></a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#sophistry</span>
+ <span class="right" id="">2016-02-14/2018-10-11</span></div>
+ </div></div>
+ <div id="insanch" style="height:5em;"></div>
+ <div id="footer">
+ <div id="pagesw" class="TText" style="display:table;width:100%;padding:1em 0;">
+ <span style="display:table-cell;"><a id="prepage" href="/blog/list/sophistry/0.html">&lt;&lt;</a></span>
+ <span style="text-align:center;display:table-cell;" id="page">2/2</span>
+ <span style="text-align:right;display:table-cell;"><a id="nexpage" href="#">&gt;&gt;</a></span>
+ </div>
+ <div style="text-align:center;" class="TText">
+ Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5
+ <br>
+ Content licensed under CC BY-SA 4.0.
+ </div>
+ </div>
+ </div>
+
+
+</body></html> \ No newline at end of file
diff --git a/blog/list/sophistry/index.html b/blog/list/sophistry/index.html
new file mode 120000
index 0000000..359ee56
--- /dev/null
+++ b/blog/list/sophistry/index.html
@@ -0,0 +1 @@
+0.html \ No newline at end of file
diff --git a/blog/list/web/0.html b/blog/list/web/0.html
new file mode 100644
index 0000000..11fc115
--- /dev/null
+++ b/blog/list/web/0.html
@@ -0,0 +1,113 @@
+<html><head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<meta name="theme-color" content="#000000">
+<title>Chrisoft::Blog</title>
+<script type="text/javascript" src="/panel.js"></script>
+<link rel="stylesheet" type="text/css" href="/common.css">
+<link rel="stylesheet" type="text/css" href="/panel.css">
+<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
+<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
+<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
+<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
+<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
+<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
+<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
+<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
+<link rel="stylesheet" type="text/css" href="/blog/blogext.css">
+<script>
+function ol()
+{
+ window.onresize=function()
+ {
+ if(window.innerWidth<768)
+ setupevents();
+ else unsetevents();
+ }
+ window.onresize();
+}
+function loadTheme(){
+ var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
+ if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
+ var ent="";
+ var d=new Date();
+ if(thm[0]=='z')
+ {
+ var m=d.getMonth()+1;
+ if(m>=3&&m<6)thm='0'+thm[1];
+ else if(m>=6&&m<9)thm='1'+thm[1];
+ else if(m>=9&&m<12)thm='2'+thm[1];
+ else thm='3'+thm[1];
+ }
+ if(thm[1]=='z')
+ {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
+ ent=`theme${thm}`;
+ var R=new RegExp('theme[0-4][ab]');
+ for(var i=0;i<document.styleSheets.length;++i)
+ {
+ if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
+ document.styleSheets[i].disabled=true;
+ else document.styleSheets[i].disabled=false;
+ }
+ var thmcolor="";
+ switch(thm[0])
+ {
+ case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break;
+ case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break;
+ case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break;
+ case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break;
+ }
+ document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor);
+}
+loadTheme();
+</script>
+</head>
+<body onload="ol()" style="overflow-x:hidden;">
+ <div id="panel" class="TText">
+ <ul id="panellist">
+ <li><a href="/"><h1>Chrisoft</h1></a></li>
+ <li><a href="/blog"><h2>Blog</h2></a></li>
+ <li><span>Tags filter</span>
+ <ul id="tagslist">
+
+
+ <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a class="active" href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul>
+ </li>
+ </ul>
+ </div>
+ <div id="content">
+ <div id="postslist">
+
+ <div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2018-10-11.html">The stupid blogging system evolved!</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#web #devel #js</span>
+ <span class="right" id="">2018-10-11/2018-10-11</span></div>
+ </div><div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2018-01-05.html">Now using reverse proxy to deliver content</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#web #random-xp</span>
+ <span class="right" id="">2018-01-05/2018-10-11</span></div>
+ </div><div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2017-04-11.html">SBS 2.0 is now the default blog browser</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#devel #web</span>
+ <span class="right" id="">2017-04-11/2018-10-11</span></div>
+ </div></div>
+ <div id="insanch" style="height:5em;"></div>
+ <div id="footer">
+ <div id="pagesw" class="TText" style="display:table;width:100%;padding:1em 0;">
+ <span style="display:table-cell;"><a id="prepage" href="#">&lt;&lt;</a></span>
+ <span style="text-align:center;display:table-cell;" id="page">1/1</span>
+ <span style="text-align:right;display:table-cell;"><a id="nexpage" href="#">&gt;&gt;</a></span>
+ </div>
+ <div style="text-align:center;" class="TText">
+ Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5
+ <br>
+ Content licensed under CC BY-SA 4.0.
+ </div>
+ </div>
+ </div>
+
+
+</body></html> \ No newline at end of file
diff --git a/blog/list/web/index.html b/blog/list/web/index.html
new file mode 120000
index 0000000..359ee56
--- /dev/null
+++ b/blog/list/web/index.html
@@ -0,0 +1 @@
+0.html \ No newline at end of file
diff --git a/blog/list/webgl/0.html b/blog/list/webgl/0.html
new file mode 100644
index 0000000..2704318
--- /dev/null
+++ b/blog/list/webgl/0.html
@@ -0,0 +1,103 @@
+<html><head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<meta name="theme-color" content="#000000">
+<title>Chrisoft::Blog</title>
+<script type="text/javascript" src="/panel.js"></script>
+<link rel="stylesheet" type="text/css" href="/common.css">
+<link rel="stylesheet" type="text/css" href="/panel.css">
+<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
+<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
+<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
+<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
+<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
+<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
+<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
+<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
+<link rel="stylesheet" type="text/css" href="/blog/blogext.css">
+<script>
+function ol()
+{
+ window.onresize=function()
+ {
+ if(window.innerWidth<768)
+ setupevents();
+ else unsetevents();
+ }
+ window.onresize();
+}
+function loadTheme(){
+ var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
+ if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
+ var ent="";
+ var d=new Date();
+ if(thm[0]=='z')
+ {
+ var m=d.getMonth()+1;
+ if(m>=3&&m<6)thm='0'+thm[1];
+ else if(m>=6&&m<9)thm='1'+thm[1];
+ else if(m>=9&&m<12)thm='2'+thm[1];
+ else thm='3'+thm[1];
+ }
+ if(thm[1]=='z')
+ {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
+ ent=`theme${thm}`;
+ var R=new RegExp('theme[0-4][ab]');
+ for(var i=0;i<document.styleSheets.length;++i)
+ {
+ if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
+ document.styleSheets[i].disabled=true;
+ else document.styleSheets[i].disabled=false;
+ }
+ var thmcolor="";
+ switch(thm[0])
+ {
+ case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break;
+ case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break;
+ case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break;
+ case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break;
+ }
+ document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor);
+}
+loadTheme();
+</script>
+</head>
+<body onload="ol()" style="overflow-x:hidden;">
+ <div id="panel" class="TText">
+ <ul id="panellist">
+ <li><a href="/"><h1>Chrisoft</h1></a></li>
+ <li><a href="/blog"><h2>Blog</h2></a></li>
+ <li><span>Tags filter</span>
+ <ul id="tagslist">
+
+
+ <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a class="active" href="/blog/list/webgl">webgl</a></li></ul>
+ </li>
+ </ul>
+ </div>
+ <div id="content">
+ <div id="postslist">
+
+ <div class="block TText" id="" style="display:block;">
+ <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2016-02-18.html">Cross Noodles Recooked</a></h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#devel #js #webgl</span>
+ <span class="right" id="">2016-02-18/2018-10-11</span></div>
+ </div></div>
+ <div id="insanch" style="height:5em;"></div>
+ <div id="footer">
+ <div id="pagesw" class="TText" style="display:table;width:100%;padding:1em 0;">
+ <span style="display:table-cell;"><a id="prepage" href="#">&lt;&lt;</a></span>
+ <span style="text-align:center;display:table-cell;" id="page">1/1</span>
+ <span style="text-align:right;display:table-cell;"><a id="nexpage" href="#">&gt;&gt;</a></span>
+ </div>
+ <div style="text-align:center;" class="TText">
+ Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5
+ <br>
+ Content licensed under CC BY-SA 4.0.
+ </div>
+ </div>
+ </div>
+
+
+</body></html> \ No newline at end of file
diff --git a/blog/list/webgl/index.html b/blog/list/webgl/index.html
new file mode 120000
index 0000000..359ee56
--- /dev/null
+++ b/blog/list/webgl/index.html
@@ -0,0 +1 @@
+0.html \ No newline at end of file
diff --git a/blog/post/.htaccess b/blog/post/.htaccess
new file mode 100644
index 0000000..2651228
--- /dev/null
+++ b/blog/post/.htaccess
@@ -0,0 +1 @@
+Header set Cache-Control no-cache
diff --git a/blog/post/2015-10-29.html b/blog/post/2015-10-29.html
new file mode 100644
index 0000000..f6dd0a5
--- /dev/null
+++ b/blog/post/2015-10-29.html
@@ -0,0 +1,130 @@
+<html><head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<meta name="theme-color" content="#000000">
+<title>Chrisoft::Blog</title>
+<script type="text/javascript" src="/panel.js"></script>
+<script type="text/javascript" src="/blog/footnoter.js"></script>
+<script type="text/javascript" src="/blog/aes-js.js"></script>
+<script type="text/javascript" src="/blog/scrypt.js"></script>
+<script type="text/javascript" src="/blog/sha256.js"></script>
+<script type="text/javascript" src="/blog/decryptor.js"></script>
+<link rel="stylesheet" type="text/css" href="/common.css">
+<link rel="stylesheet" type="text/css" href="/panel.css">
+<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
+<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
+<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
+<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
+<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
+<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
+<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
+<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
+<link rel="stylesheet" type="text/css" href="/blog/blogext.css">
+<script>
+function ol()
+{
+ window.onresize=function()
+ {
+ if(window.innerWidth<768)
+ setupevents();
+ else unsetevents();
+ }
+ window.onresize();
+ _decryptonload();
+}
+function loadTheme(){
+ var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
+ if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
+ var ent="";
+ var d=new Date();
+ if(thm[0]=='z')
+ {
+ var m=d.getMonth()+1;
+ if(m>=3&&m<6)thm='0'+thm[1];
+ else if(m>=6&&m<9)thm='1'+thm[1];
+ else if(m>=9&&m<12)thm='2'+thm[1];
+ else thm='3'+thm[1];
+ }
+ if(thm[1]=='z')
+ {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
+ ent=`theme${thm}`;
+ var R=new RegExp('theme[0-4][ab]');
+ for(var i=0;i<document.styleSheets.length;++i)
+ {
+ if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
+ document.styleSheets[i].disabled=true;
+ else document.styleSheets[i].disabled=false;
+ }
+ var thmcolor="";
+ switch(thm[0])
+ {
+ case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break;
+ case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break;
+ case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break;
+ case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break;
+ }
+ document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor);
+}
+loadTheme();
+</script>
+</head>
+<body onload="ol()" style="overflow-x:hidden;">
+ <div id="panel" class="TText">
+ <ul id="panellist">
+ <li><a href="/"><h1>Chrisoft</h1></a></li>
+ <li><a href="/blog"><h2>Blog</h2></a></li>
+ <li><a href="#"><h3 id="title">noname01.pas</h3></a></li>
+ <li><span>Tags</span>
+ <ul id="tagslist">
+ <li><a href="/blog/list/garbage/">garbage</a></li></ul>
+ </li>
+ <li id="tocouter" style="display: none;">
+ <span>Table of Contents</span>
+ <ul id="tocroot">
+ </ul>
+ </li>
+ <li style="margin-left:-0.5em"><a id="prevp">Prev post</a></li>
+ <li style="margin-left:-0.5em"><a id="nextp" href="2015-10-30.html">Next post</a></li>
+ </ul>
+ </div>
+ <div id="content">
+ <h2 id="titleh" class="TText" style="font-wight:normal;">noname01.pas</h2>
+ <div id="datetags" class="TText" style="margin-bottom:1em;">2015-10-29<br>#garbage</div>
+ <hr><div id="article" class="TText">
+<article>
+(这么怀旧的标题是不是会有些人看起来相当有感触呢……)<br>
+花了半个多小时的时间把这个极其简陋的blog系统搭起来了。<br>
+45分钟前这个东西其实还不存在呢……<br>
+<br>
+这大约是我第四次尝试养成不定时写东西的习惯……<br>
+总之希望这次能够坚持下去……<br>
+明天先把CCPC和Hackathon的事情po上来…嗯…就先这样。<br>
+End of the first blog post
+</article>
+</div><br><hr>
+ <div class="TText" id="notediv" style="font-size:80%;"></div>
+ <div id="insanch" style="height:3em;"></div>
+ <div id="footer" style="">
+ <div id="pagesw" class="TText" style="width:100%;height:0.5em;"></div>
+ <div style="text-align:center;" class="TText">
+ Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5
+ <br>
+ Content licensed under CC BY-SA 4.0. <span id="purgep" style="display:none;font-size:70%;">This page has passphrase(s) stored. Click <a href="javascript:_purgep()">here</a> to purge.</span>
+ </div>
+ </div>
+ <div id="cmdbuf" class="TText" style="transition:500ms;padding:1em;font-size:2em;color:white;position:absolute;background-color:rgba(0,0,0,0.6);left:50%;top:50%;transform:translate(-50%,-50%);pointer-events:none;opacity:0;">
+ </div>
+ </div>
+ <div id="decryptui" style="display:none;opacity:0;color:white;z-index:1000;position:fixed;left:0;top:0;width:100%;height:100%;background-color:rgba(0,0,0,0.4);transition:opacity 0.5s;">
+ <div id="decryptdlg" class="TText" style="padding:10px 20px;position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);background-color:rgba(0,0,0,0.6);">
+ <div id="keyhint" style="margin-bottom:8px;"></div>
+ <div style="margin-bottom:8px;">Key: <input id="keyinp" type="text" style="color:#fff;"></div>
+ <div style="height:2.25em;">
+ <button id="btndecrypt" onclick="decryptor(decid,document.getElementById('keyinp').value);" style="position:absolute;left:20px;">Decrypt</button>
+ <button onclick="hidedecryptui();" style="position:absolute;right:20px;">Cancel</button>
+ </div>
+
+ </div>
+
+
+</div></body></html> \ No newline at end of file
diff --git a/blog/post/2015-10-30.html b/blog/post/2015-10-30.html
new file mode 100644
index 0000000..8329511
--- /dev/null
+++ b/blog/post/2015-10-30.html
@@ -0,0 +1,198 @@
+<html><head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<meta name="theme-color" content="#000000">
+<title>Chrisoft::Blog</title>
+<script type="text/javascript" src="/panel.js"></script>
+<script type="text/javascript" src="/blog/footnoter.js"></script>
+<script type="text/javascript" src="/blog/aes-js.js"></script>
+<script type="text/javascript" src="/blog/scrypt.js"></script>
+<script type="text/javascript" src="/blog/sha256.js"></script>
+<script type="text/javascript" src="/blog/decryptor.js"></script>
+<link rel="stylesheet" type="text/css" href="/common.css">
+<link rel="stylesheet" type="text/css" href="/panel.css">
+<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
+<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
+<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
+<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
+<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
+<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
+<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
+<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
+<link rel="stylesheet" type="text/css" href="/blog/blogext.css">
+<script>
+function ol()
+{
+ window.onresize=function()
+ {
+ if(window.innerWidth<768)
+ setupevents();
+ else unsetevents();
+ }
+ window.onresize();
+ _decryptonload();
+}
+function loadTheme(){
+ var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
+ if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
+ var ent="";
+ var d=new Date();
+ if(thm[0]=='z')
+ {
+ var m=d.getMonth()+1;
+ if(m>=3&&m<6)thm='0'+thm[1];
+ else if(m>=6&&m<9)thm='1'+thm[1];
+ else if(m>=9&&m<12)thm='2'+thm[1];
+ else thm='3'+thm[1];
+ }
+ if(thm[1]=='z')
+ {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
+ ent=`theme${thm}`;
+ var R=new RegExp('theme[0-4][ab]');
+ for(var i=0;i<document.styleSheets.length;++i)
+ {
+ if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
+ document.styleSheets[i].disabled=true;
+ else document.styleSheets[i].disabled=false;
+ }
+ var thmcolor="";
+ switch(thm[0])
+ {
+ case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break;
+ case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break;
+ case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break;
+ case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break;
+ }
+ document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor);
+}
+loadTheme();
+</script>
+</head>
+<body onload="ol()" style="overflow-x:hidden;">
+ <div id="panel" class="TText">
+ <ul id="panellist">
+ <li><a href="/"><h1>Chrisoft</h1></a></li>
+ <li><a href="/blog"><h2>Blog</h2></a></li>
+ <li><a href="#"><h3 id="title">First CCPC sightseeing tour</h3></a></li>
+ <li><span>Tags</span>
+ <ul id="tagslist">
+ <li><a href="/blog/list/contest/">contest</a></li></ul>
+ </li>
+ <li id="tocouter">
+ <span>Table of Contents</span>
+ <ul id="tocroot">
+ <li><a class="toctarg" href="#tocanch0">流水账</a></li><li><a class="toctarg" href="#tocanch1">非流水账部分</a></li><li><ul class="tocnode"><li><a class="toctarg" href="#tocanch2">关于这次比赛</a></li><li><a class="toctarg" href="#tocanch3">关于ACM和OI的联系</a></li><li><a class="toctarg" href="#tocanch4">「撕逼」和SDU对ACM的态度</a></li></ul></li></ul>
+ </li>
+ <li style="margin-left:-0.5em"><a id="prevp" href="2015-10-29.html">Prev post</a></li>
+ <li style="margin-left:-0.5em"><a id="nextp" href="2015-10-31.html">Next post</a></li>
+ </ul>
+ </div>
+ <div id="content">
+ <h2 id="titleh" class="TText" style="font-wight:normal;">First CCPC sightseeing tour</h2>
+ <div id="datetags" class="TText" style="margin-bottom:1em;">2015-10-30<br>#contest</div>
+ <hr><div id="article" class="TText">
+<article>
+<reduced>本文讲述的是发生于2015-10-15~2015-10-20的事情。</reduced><br>
+<reduced>如果您不愿意看流水账,请直接跳到「非流水账」部分</reduced><br>
+<h2 id="tocanch0" class="tvis">流水账</h2>
+  其实还得从军训期间的某一天说起……<br>
+  那天计算机的辅导员把「有过信息学竞赛经验」的同学叫到一起开了个会,大致就是说有这么一个比赛,
+今年刚开始办。虽然是国赛但是因为「没名气」<a id="n1" href="#note1" class="note">[1]</a>
+,所以学校并不是十分重视<a id="n2" href="#note2" class="note">[2]</a>
+,于是就要从大一里面选出一个队来参加。<br>
+  选拔赛之前我在教学楼里迷路了(没找到3区的入口……),迟到了半个小时,最后竟然还迷迷糊糊地拿了Rank2……
+(题目都是超级大水题……),然后就被抓去参加CCPC了……<br>
+  我知道我所在的一个「神秘组织」(BKT)中有两个搞ACM的,FDU的jjy神犇没得到参赛机会(有点可惜),
+然而「神秘的裙主」BL也要来CCPC<a id="n3" href="#note3" class="note">[3]</a>
+,我就抱着一种「爆零也要面基」的想法确认参赛了。<br>
+  作为一个懒蛋,选拔赛之后到比赛之前我根本没有去过ACM实验室,也没有好好刷过题什么的,
+只是简单地找了找之前写代码的感觉……稀里糊涂地就混到了10月15号。。。<br>
+  在火车上我才遇到了我队的队友——两只泰山学堂的大爷(然而他们两个并没有准备模板)。
+学长还教了我们一种神奇的纸牌——UNO。。。(据说是一种坑队友的游戏,确实是这样<a id="n4" href="#note4" class="note">[4]</a>……)
+然后在火车上我也没怎么休息,一直在偷听学长们的谈话……(关于对谈话内容的思考,请看非流水账部分)<br>
+  颠了13小时之后终于到了南阳。第一届CCPC的承办学校是被誉为「二本中的小清华」<a id="n5" href="#note5" class="note">[5]</a>
+的南阳理工学院——额,似乎比我们的中心校区要大(现在的二本学校就是这么厉害……)。<br>
+  然后就是一串程序化流程了——领胸牌什么的。非常有趣的是本次比赛选手的队服是粉色的,<b>粉色的</b>!
+同时我也看到了参赛队员名单。队名有不少非常奇葩的:什么「问我资磁不资磁」/「黑化肥发灰会挥发」之类……
+名单里面除了上面提到的BL之外,我还发现了一位高中的学长,于是面基名单又加长了……<br>
+  第一天(15号)晚上到第二天全天(16号)没有任何安排,于是就颓废了一天。为了获得一种「我们有模板!」
+的安慰,16号晚上我手抄了8份模板……<br>
+  十七号的热身赛,只有三道题目。第一题是道水二分,一开始是那位莱芜的爷爷写的,但是他调了十来分钟没过样例,
+于是就找我来写……然后我用了十分钟多一点就A掉了。。。中间我们浪费了很多时间去想第三题,然而其实根本不会……
+(虽然大致知道是dp+数学)第二题说是暴力,但是需要记忆化,由于我太2b就写了个L^3的裸暴力,
+还以为能卡时过,结果就T了。。。然后加记忆化,还没加完3个小时就过去了……(jjy提醒的测测先返回T还是先返回WA也没测……)
+结束后一看榜,发现好像卡线有铜牌,于是我们就天真地以为明天加强一下合作就真的能拿铜牌了……<br>
+  一直到热身赛结束之前都没能见成BL。那位高中学长倒是见了一次,还是像两三年以前一样的受QAQ……
+由于能自由支配的时间基本都过去了,面基似乎就要不了了之了,于是热身赛后的晚饭结束后,
+跟队友扔下一句「在食堂楼下等我」就去找BL了。因为从前通过一个叫「左一是BL.png」的文件已经见过BL了,
+而BL(包括BKT的其他成员)还从来没有见过我(现在的样子),所以我就按着BL给的坐标和左一是BL.png去找BL了……
+当我接近BL的位置时,已经可以看出BL的激动程度爆表了……我十分清楚地记得BL说了一句「你就是……?」,
+我的回应则是傻傻地把脖子上挂的胸牌翻过来给BL看……<a id="n6" href="#note6" class="note">[6]</a><br>
+  晚上去围观泰山学堂大爷,发现那位来自莱芜的爷爷实在是太神了,<i><b>太!神!了!</b></i>
+简单地讲就是<b>√编程 √Linux √编曲 √绘画 √有钱</b>(人家用的是<i>wacom平板电脑</i>……而且玩的东西普遍超极高端……)。<br>
+  八点左右,BL来消息问能不能来我们宾馆再见一面,这么好的机会怎么能随意扔掉!于是我就(无视了晚上还要洗澡的事情)
+同意了。过了十来分钟,BL到了。<strike>(BL真的是<b>太!萌!了!</b>)</strike>
+我们愉♂悦地洽♂谈了一个多小时(BL语)。话题有很多,从BL的WP到学校搞ACM的情况都聊过。
+嗯……我相信BL看到了一个真实世界的Chris,这也是我通过这次面基想要达到的……<a id="n7" href="#note7" class="note">[7]</a><br>
+  第二天正式比赛,然而晚上还是没有好好睡一觉(标准结局),第二天就那么进了赛场……我们按照一般的思路开始浏览题目,
+看完A题我就发现其实就是转转转,然后就开始写,写了不到一半,一只泰山学堂爷就跟我说「L题就是读入n输出2n+1!」这是我瞟了一眼
+board,发现L题已经绿了一排了……于是就火速写掉了L题。然后A题也很快A掉了。H题就是4×4数独,一开始由我来写,结果dfs写的过于丑陋然后还WA了,
+找了半天找不到错在哪,队友把我的dfs重写了一遍就A掉了……G题也是相当暴力的floodfill,我们队是莱芜的学堂爷
+写的这道题,活生生写了200多行代码(他说他懒得写循环就把许多循环展开写了……),到最后我们都完全看不懂了。结果还WA了。。。
+然后发现题目少读了一块,于是这位爷爷就把代码变成了300行然后A掉了这道题……D题是一道加了一点点额外的规定的背包,其实我们应该是写对了,
+结果最后不知道是什么原因还是WA掉了。C题也是dp。标算是N^2的,我当时给写成了N^3的(没错,是我这个dp白痴写的),T掉了。
+结果我们到最后还是没有人知道他们是如何优化成N^2的<a id="n8" href="#note8" class="note">[8]</a>。其他题我们根本没有尝试,
+但是知道E题是缩点,K题和I题都是dp(到底有多少dp……),仅此而已……<br>
+  以上大概就是我们这个临时组起来的队<a id="n9" href="#note9" class="note">[9]</a>的比赛历程。其实这次比赛还有一些比较有趣的事情,
+比如:
+<ul>
+<li>我们前2.5h A了四道题,后2.5h A了零道题。</li>
+<li>我们的学长在封榜之前一直被我们碾压,然而最后一小时A掉了两道题所以还是把我们虐了。</li>
+<li>山东大学威海分校碾压了山东大学。</li>
+<li>上海交大AK了。</li>
+</ul>
+  最后的结果就是我们差三四名铜牌(嗯,这次是卡线没铜牌),而我们的学长拿到了铜牌。其实也挺可惜的,我们当时以为没什么希望了就开始乱交G题H题,
+结果最后竟然都A掉了……然后罚时就无法直视了2333333<br>
+<h2 id="tocanch1" class="tvis">非流水账部分</h2>
+<h4 id="tocanch2" class="tvis">关于这次比赛</h4>
+  其实这次比赛基本就是来人家学校观光+刷经验(误)的,毕竟我们的ACM历程甚至还没有正式开始(因为我们还不是ACM实验室的成员)。<br>
+  以前对ACM比赛的认识基本局限于「一道题不是全对就是全错」上。甚至连可以带模板都不了解。我问我的队友有没有准备模板的时候有一个还问我
+「卧槽可以带模板?!」然后我们一个个比赛前又都没有刷题……各种直接或间接的原因就导致了后半场比赛一题也没做出来这样的惨状……
+<h4 id="tocanch3" class="tvis">关于ACM和OI的联系</h4>
+  这方面持经验论的人好像不少……甚至有「没搞过OI就不要搞ACM了」这样的言论。但是我对这种经验论是坚决反对的。<br>
+  首先我承认我的OI搞的算是十分惨的了(如果不惨哪里还回来SDU这种学校)。我依然可以回忆起高中的时候一位位「零基础」大爷水平纷纷超过我的情景……<br>
+  然后要拿出来的是一个在我们高中要被用烂的例子——某零基础选手一年拿NOI金牌的故事,长话短说——他的水平基本可以吊打山东所有往届选手。<br>
+  有经验固然是好的,但是我认为主要还是看个人学习的欲望吧——有多少前OI选手大学之后根本没有去打ACM,而World Final赛场里面又有多少是有OI经验的选手呢?
+<h4 id="tocanch4" class="tvis">「撕逼」和SDU对ACM的态度</h4>
+  在火车上「偷听」到学长的谈话,似乎最近ACM实验室发生了什么「撕逼」事件。大致就是中心校区那边有两个大神从来不来这边训练,但是最后组队赛做的非常好,
+然后辅导员说平时没来训练不准去比赛,最后演化成的一场撕逼大战……好像双方都闹得十分不愉快的样子。<br>
+  其实这里面能折射出SDU对ACM的态度——其实SDU根本就不重视ACM。如果他们能够把各个校区的大神聚集起来,那么SDU绝对不是一个只进过两次WF的弱校。<br>
+  然而领导层看重的是什么?请自行了解「山大博科本升专事件」……
+</article>
+</div><br><hr>
+ <div class="TText" id="notediv" style="font-size:80%;"><span class="TText"><a id="note1" href="#n1">[1]</a>: 大概是不会有公司认然后增加就业率这样的吧……<br></span><span class="TText"><a id="note2" href="#n2">[2]</a>: 其实SDU本来就不重视ACM……<br></span><span class="TText"><a id="note3" href="#n3">[3]</a>: <a href="http://blog.blumia.net/2015/10/21/%E9%9D%A2%E5%9F%BA%E8%B5%9B%E8%B5%9B%E5%90%8E%E6%9C%89%E6%84%9F/">友情链接</a><br></span><span class="TText"><a id="note4" href="#n4">[4]</a>: 有一次我一下子被加了16张牌。<br></span><span class="TText"><a id="note5" href="#n5">[5]</a>: 来自某南阳同学。<br></span><span class="TText"><a id="note6" href="#n6">[6]</a>: 从这里大概可以看出当时是有多基♂动……<br></span><span class="TText"><a id="note7" href="#n7">[7]</a>: 同时这次面基还产生了「左一是BL右一是Chris.jpg」。<br></span><span class="TText"><a id="note8" href="#n8">[8]</a>: 我们好弱……<br></span><span class="TText"><a id="note9" href="#n9">[9]</a>: 我们在到火车站前都没有见过面说过话,感受一下。<br></span></div>
+ <div id="insanch" style="height:3em;"></div>
+ <div id="footer" style="">
+ <div id="pagesw" class="TText" style="width:100%;height:0.5em;"></div>
+ <div style="text-align:center;" class="TText">
+ Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5
+ <br>
+ Content licensed under CC BY-SA 4.0. <span id="purgep" style="display:none;font-size:70%;">This page has passphrase(s) stored. Click <a href="javascript:_purgep()">here</a> to purge.</span>
+ </div>
+ </div>
+ <div id="cmdbuf" class="TText" style="transition:500ms;padding:1em;font-size:2em;color:white;position:absolute;background-color:rgba(0,0,0,0.6);left:50%;top:50%;transform:translate(-50%,-50%);pointer-events:none;opacity:0;">
+ </div>
+ </div>
+ <div id="decryptui" style="display:none;opacity:0;color:white;z-index:1000;position:fixed;left:0;top:0;width:100%;height:100%;background-color:rgba(0,0,0,0.4);transition:opacity 0.5s;">
+ <div id="decryptdlg" class="TText" style="padding:10px 20px;position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);background-color:rgba(0,0,0,0.6);">
+ <div id="keyhint" style="margin-bottom:8px;"></div>
+ <div style="margin-bottom:8px;">Key: <input id="keyinp" type="text" style="color:#fff;"></div>
+ <div style="height:2.25em;">
+ <button id="btndecrypt" onclick="decryptor(decid,document.getElementById('keyinp').value);" style="position:absolute;left:20px;">Decrypt</button>
+ <button onclick="hidedecryptui();" style="position:absolute;right:20px;">Cancel</button>
+ </div>
+
+ </div>
+
+
+</div></body></html> \ No newline at end of file
diff --git a/blog/post/2015-10-31.html b/blog/post/2015-10-31.html
new file mode 100644
index 0000000..0615a80
--- /dev/null
+++ b/blog/post/2015-10-31.html
@@ -0,0 +1,172 @@
+<html><head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<meta name="theme-color" content="#000000">
+<title>Chrisoft::Blog</title>
+<script type="text/javascript" src="/panel.js"></script>
+<script type="text/javascript" src="/blog/footnoter.js"></script>
+<script type="text/javascript" src="/blog/aes-js.js"></script>
+<script type="text/javascript" src="/blog/scrypt.js"></script>
+<script type="text/javascript" src="/blog/sha256.js"></script>
+<script type="text/javascript" src="/blog/decryptor.js"></script>
+<link rel="stylesheet" type="text/css" href="/common.css">
+<link rel="stylesheet" type="text/css" href="/panel.css">
+<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
+<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
+<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
+<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
+<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
+<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
+<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
+<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
+<link rel="stylesheet" type="text/css" href="/blog/blogext.css">
+<script>
+function ol()
+{
+ window.onresize=function()
+ {
+ if(window.innerWidth<768)
+ setupevents();
+ else unsetevents();
+ }
+ window.onresize();
+ _decryptonload();
+}
+function loadTheme(){
+ var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
+ if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
+ var ent="";
+ var d=new Date();
+ if(thm[0]=='z')
+ {
+ var m=d.getMonth()+1;
+ if(m>=3&&m<6)thm='0'+thm[1];
+ else if(m>=6&&m<9)thm='1'+thm[1];
+ else if(m>=9&&m<12)thm='2'+thm[1];
+ else thm='3'+thm[1];
+ }
+ if(thm[1]=='z')
+ {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
+ ent=`theme${thm}`;
+ var R=new RegExp('theme[0-4][ab]');
+ for(var i=0;i<document.styleSheets.length;++i)
+ {
+ if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
+ document.styleSheets[i].disabled=true;
+ else document.styleSheets[i].disabled=false;
+ }
+ var thmcolor="";
+ switch(thm[0])
+ {
+ case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break;
+ case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break;
+ case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break;
+ case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break;
+ }
+ document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor);
+}
+loadTheme();
+</script>
+</head>
+<body onload="ol()" style="overflow-x:hidden;">
+ <div id="panel" class="TText">
+ <ul id="panellist">
+ <li><a href="/"><h1>Chrisoft</h1></a></li>
+ <li><a href="/blog"><h2>Blog</h2></a></li>
+ <li><a href="#"><h3 id="title">大学入学两个月了……</h3></a></li>
+ <li><span>Tags</span>
+ <ul id="tagslist">
+ <li><a href="/blog/list/garbage/">garbage</a></li></ul>
+ </li>
+ <li id="tocouter">
+ <span>Table of Contents</span>
+ <ul id="tocroot">
+ <li><a class="toctarg" href="#tocanch0">军训</a></li><li><a class="toctarg" href="#tocanch1">习惯新生活</a></li><li><a class="toctarg" href="#tocanch2">为各种人解决各种问题</a></li><li><a class="toctarg" href="#tocanch3">个人事务</a></li><li><a class="toctarg" href="#tocanch4">关于「零基础学软件专业」的讨论</a></li></ul>
+ </li>
+ <li style="margin-left:-0.5em"><a id="prevp" href="2015-10-30.html">Prev post</a></li>
+ <li style="margin-left:-0.5em"><a id="nextp" href="2015-11-01.html">Next post</a></li>
+ </ul>
+ </div>
+ <div id="content">
+ <h2 id="titleh" class="TText" style="font-wight:normal;">大学入学两个月了……</h2>
+ <div id="datetags" class="TText" style="margin-bottom:1em;">2015-10-31<br>#garbage</div>
+ <hr><div id="article" class="TText">
+<article>
+  大学入学两个月了。据我所知,THU刚刚考完线性代数。而我们学校才正式上课一个月。这就是差距……<br>
+  好吧……这两个月我干了些什么?
+<h2 id="tocanch0" class="tvis">军训</h2>
+  SDU的军训长是出了名的。三周的军训,估计也就是军/警校的军训比我们长了。<br>
+  由于高中逃掉了军训,所以我一开始甚至怀疑我能否撑下这三周来……尤其是第一天就被教官因为我喊不出声干之后。
+但是后来我发现似乎没有想象中的那么坏。<s>由于智力不够,</s>军训到了10天以后我就开始天天练习坐姿了。
+我们教官似乎是我们这一片最好的(事实证明确实是这样,我们的休息总是最多的……),以至于最后我跟我们排教官成了深♂交的好友。
+军训的时候他照顾我,军训完了还带我去参加Hackathon 2015,我认为我十分有感谢他的必要。<br>
+  军训完被晒黑了QAQ,尤其是某些部位那种黑一块白一块的……现在正努力恢复中……<br>
+<h2 id="tocanch1" class="tvis">习惯新生活</h2>
+  其实没什么好习惯的,初中和高中出去夏令营好几次了,就当是超长的夏令营就是了。<br>
+  SDU的要求也不像其他某些学校那么严,没什么强制自习之类的规定,再加上宿舍网还不错,于是我就没去自习过几次……
+<a id="n1" href="#note1" class="note">[1]</a>(美中不足是冬天晚上会停电……)<br>
+  宿舍里有个话唠+游戏狂的结果就是:他不打游戏的时候一直在bb,打游戏的时候就自带解说……<br>
+<h2 id="tocanch2" class="tvis">为各种人解决各种问题</h2>
+  有些东西是藏不住的。过来没多久人人都知道我曾经接触过编程这方面的东西了。然后就有各种奇奇怪怪的请求,
+比如有个人军训的时候让我给他讲了一个下午的C++,到最近有人要我给他装Linux虚拟机,甚至还有让我帮他搞他的Android App作业的……<br>
+  其实这方面跟我的预想是有不小差距的。开学前我竟然天真地以为软件专业的有很多有过经验的,
+然而来了之后却发现零基础的同学占了绝大多数<a id="n2" href="#note2" class="note">[2]</a>。
+关于这方面的事情我会在本文后面做更多的描述。
+<h2 id="tocanch3" class="tvis">个人事务</h2>
+  这个范围太广了。从日常的学习,到<s>吃饭睡觉打电脑</s>都包括了。随便挑几条列一列好了:
+<ul>
+<li>BLR3的开发。</li>
+<li>英文Java书刷出去~60%(~500页)。(然而我还是不会Java,<s>我写出来的还是C++</s>)</li>
+<li>乱搞自己的小站点(地址?127.0.0.1...)。</li>
+<li>高数。总有一种高数要挂的感觉……</li>
+<li>英语。有模糊出国意愿的我开始学托福了……</li>
+<li>几次比赛。请参阅最近的其他文章。</li>
+</ul>
+<h2 id="tocanch4" class="tvis">关于「零基础学软件专业」的讨论</h2>
+  很多人问我「我什么都不会该怎么学这个啊」这样的问题。这个问题我实在难以回答。我刚开始学的时候不也是零基础吗?
+而且我当时年纪还更小呢……<br>
+  最近有不少人跟我说「类」这个东西难以理解,我想这个锅得甩给学院一种奇特的急于求成的心态。据我了解,
+上来就教Java的软件学院除了SDU其他都是专科学校(或者其他类似等级的东西)……<a id="n3" href="#note3" class="note">[3]</a>
+其他正常一点的学校都是从C语言(一种<i>比较</i>类似Java但没有「类」这个概念的编程语言)教起的。我刚学编程的时候,
+哪里知道「类」是个什么东西啊?都是以后慢慢才理解的。对于学院的这种策略我实在表示不解……<br>
+  接下来我要试图对「我什么都不会该怎么学这个啊」做出正面的回答了。<br><br>
+  如果问这个问题的人对做开发者感兴趣,那么「学会」的最大障碍基本就清除了。接下来的任务<i>我认为主要</i>是:
+<ul>
+<li>找一些质量比较高的代码,一个字一个字地敲到IDE里面。对初学者来讲教科书上的代码就算高质量代码了。</li>
+<li>(确定你敲的能够准确无误地运行之后)开始在原来的框架上对你敲进去的代码进行增改。比如原本有个计算a+b的程序,
+你可以把它改成能够计算a+b a-b a*b a/b a%b等等。</li>
+<li>在你觉得自己获得了一些经验之后,开始尝试写自己的代码。</li>
+</ul>
+  以上其实就是我学习这些东西的过程。如果你以后打算学习一个新的库的用法,也可以使用类似的方法。
+<s>(我自认为是比较有效的)</s><br><br>
+  如果很不幸,你对做一个开发者并没有任何兴趣……<br>
+  那么我的建议是:转专业。<br>
+  毕竟SDU是提供这么一个机会的。不转白不转。学了四年自己不感兴趣的东西是什么样的一种体验……
+</article>
+</div><br><hr>
+ <div class="TText" id="notediv" style="font-size:80%;"><span class="TText"><a id="note1" href="#n1">[1]</a>: 有一种要呆在宿舍里发霉的感觉……<br></span><span class="TText"><a id="note2" href="#n2">[2]</a>: 毕竟是学费高得要死没人报的专业,其实有很多人是调剂过来的……<br></span><span class="TText"><a id="note3" href="#n3">[3]</a>: <s>所以SDU软件学院也是辣鸡专科学校</s><br></span></div>
+ <div id="insanch" style="height:3em;"></div>
+ <div id="footer" style="">
+ <div id="pagesw" class="TText" style="width:100%;height:0.5em;"></div>
+ <div style="text-align:center;" class="TText">
+ Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5
+ <br>
+ Content licensed under CC BY-SA 4.0. <span id="purgep" style="display:none;font-size:70%;">This page has passphrase(s) stored. Click <a href="javascript:_purgep()">here</a> to purge.</span>
+ </div>
+ </div>
+ <div id="cmdbuf" class="TText" style="transition:500ms;padding:1em;font-size:2em;color:white;position:absolute;background-color:rgba(0,0,0,0.6);left:50%;top:50%;transform:translate(-50%,-50%);pointer-events:none;opacity:0;">
+ </div>
+ </div>
+ <div id="decryptui" style="display:none;opacity:0;color:white;z-index:1000;position:fixed;left:0;top:0;width:100%;height:100%;background-color:rgba(0,0,0,0.4);transition:opacity 0.5s;">
+ <div id="decryptdlg" class="TText" style="padding:10px 20px;position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);background-color:rgba(0,0,0,0.6);">
+ <div id="keyhint" style="margin-bottom:8px;"></div>
+ <div style="margin-bottom:8px;">Key: <input id="keyinp" type="text" style="color:#fff;"></div>
+ <div style="height:2.25em;">
+ <button id="btndecrypt" onclick="decryptor(decid,document.getElementById('keyinp').value);" style="position:absolute;left:20px;">Decrypt</button>
+ <button onclick="hidedecryptui();" style="position:absolute;right:20px;">Cancel</button>
+ </div>
+
+ </div>
+
+
+</div></body></html> \ No newline at end of file
diff --git a/blog/post/2015-11-01.html b/blog/post/2015-11-01.html
new file mode 100644
index 0000000..e697372
--- /dev/null
+++ b/blog/post/2015-11-01.html
@@ -0,0 +1,165 @@
+<html><head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<meta name="theme-color" content="#000000">
+<title>Chrisoft::Blog</title>
+<script type="text/javascript" src="/panel.js"></script>
+<script type="text/javascript" src="/blog/footnoter.js"></script>
+<script type="text/javascript" src="/blog/aes-js.js"></script>
+<script type="text/javascript" src="/blog/scrypt.js"></script>
+<script type="text/javascript" src="/blog/sha256.js"></script>
+<script type="text/javascript" src="/blog/decryptor.js"></script>
+<link rel="stylesheet" type="text/css" href="/common.css">
+<link rel="stylesheet" type="text/css" href="/panel.css">
+<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
+<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
+<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
+<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
+<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
+<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
+<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
+<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
+<link rel="stylesheet" type="text/css" href="/blog/blogext.css">
+<script>
+function ol()
+{
+ window.onresize=function()
+ {
+ if(window.innerWidth<768)
+ setupevents();
+ else unsetevents();
+ }
+ window.onresize();
+ _decryptonload();
+}
+function loadTheme(){
+ var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
+ if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
+ var ent="";
+ var d=new Date();
+ if(thm[0]=='z')
+ {
+ var m=d.getMonth()+1;
+ if(m>=3&&m<6)thm='0'+thm[1];
+ else if(m>=6&&m<9)thm='1'+thm[1];
+ else if(m>=9&&m<12)thm='2'+thm[1];
+ else thm='3'+thm[1];
+ }
+ if(thm[1]=='z')
+ {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
+ ent=`theme${thm}`;
+ var R=new RegExp('theme[0-4][ab]');
+ for(var i=0;i<document.styleSheets.length;++i)
+ {
+ if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
+ document.styleSheets[i].disabled=true;
+ else document.styleSheets[i].disabled=false;
+ }
+ var thmcolor="";
+ switch(thm[0])
+ {
+ case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break;
+ case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break;
+ case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break;
+ case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break;
+ }
+ document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor);
+}
+loadTheme();
+</script>
+</head>
+<body onload="ol()" style="overflow-x:hidden;">
+ <div id="panel" class="TText">
+ <ul id="panellist">
+ <li><a href="/"><h1>Chrisoft</h1></a></li>
+ <li><a href="/blog"><h2>Blog</h2></a></li>
+ <li><a href="#"><h3 id="title">Hackathon 2015乱搞记</h3></a></li>
+ <li><span>Tags</span>
+ <ul id="tagslist">
+ <li><a href="/blog/list/random-xp/">random-xp</a></li></ul>
+ </li>
+ <li id="tocouter">
+ <span>Table of Contents</span>
+ <ul id="tocroot">
+ <li><a class="toctarg" href="#tocanch0">这是一次什么性质的比赛</a></li><li><a class="toctarg" href="#tocanch1">???</a></li><li><a class="toctarg" href="#tocanch2">后续</a></li></ul>
+ </li>
+ <li style="margin-left:-0.5em"><a id="prevp" href="2015-10-31.html">Prev post</a></li>
+ <li style="margin-left:-0.5em"><a id="nextp" href="2015-11-22.html">Next post</a></li>
+ </ul>
+ </div>
+ <div id="content">
+ <h2 id="titleh" class="TText" style="font-wight:normal;">Hackathon 2015乱搞记</h2>
+ <div id="datetags" class="TText" style="margin-bottom:1em;">2015-11-01<br>#random-xp</div>
+ <hr><div id="article" class="TText">
+<article>
+填坑日期:2015-11-22<br>
+比赛日期:2015-10-24~2015-10-25(正好是我生日那天开始的……)<br>
+<h2 id="tocanch0" class="tvis">这是一次什么性质的比赛</h2>
+  实话讲我是第一次参加这种类型的比赛。大概就是几个人一队,给一个泛泛的话题然后爱做什么就做什么那样的比赛……
+这个比赛在全国有好几个赛区,济南大概是奖项最坑的一个……然后发现参赛的很多(~70%)都是SDU的学生……
+另一些则是附近某些软件企业的员工。<a id="n1" href="#note1" class="note">[1]</a><br>
+  带我来参加这次比赛的是军训时带我的排长,「阳哥」。没有他的帮助我认为我……甚至连有这个比赛都不知道。
+<h2 id="tocanch1" class="tvis">???</h2>
+  由于之前对这类比赛一无所知,所以比赛前感到很虚。本来打算找一找往年的题目的,结果又因为懒而取消了……<br>
+  比赛给的话题是「技术改变生活」。题目后面举了一些「改变了生活的技术」的例子,包括什么全系投影之类的。
+这么高大上的东西我们怎么可能会啊。于是就开始「埋头苦想」做个什么好……<br>
+  就那么沉默了一段时间之后,阳哥问我之前有没有什么做完的东西。我说我最近做的东西不是完成度太低就是完全不符合题目要求。
+然后我给他看了一眼BLR2。他认为这个可以交。(但是我不这么认为!)后来我又想了想……想到了WHG3D。<br>
+  WHG3D是一个我的早已停滞的工程。最早公开发布的版本是在2011年10月4日(4年了……)。这个工程大概活跃了1年多吧……
+然后今年4月移动硬盘报废,所有WHG3D的源程序数据全部丢失了。再加上发布的版本里面都用了Hide script(当时我还不是
+「开源的狂热追随者」),所以这个工程活过来的可能性已经是几乎没有了。然而最后一个发布出去的版本其实还是可以用的。
+折腾了一番,把最后的版本从onedrive上拖了下来,稍微演示了一下。然后阳哥决定就交这个了……<br>
+  然而我想,就交这么一个之前的东西,不太好吧……于是就开始想再做个什么东西。结果在上厕所的时候想起了核逸飞<a id="n2" href="#note2" class="note">[2]</a><br>
+写的metro版程序员老黄历丢了,我就打算用Qt重写一个……<br>
+  作品提交完毕之后据说会有一次初筛。出人意料的是我们提交的两个东西竟然都通过了……<a id="n3" href="#note3" class="note">[3]</a><br>
+于是就得上去展示。WHG3D的展示基本都是阳哥一人包办的,我只是负责在旁边玩游戏(以及说这游戏坑)。老黄历的展示就是我自己了。
+虽然没怎么感觉紧张,但是最后还是忘记了安利自己的github……(噗……)<br>
+  然后就是颁奖。当我们第一次听到我们队的名字的时候还没怎么感到惊讶(毕竟有我一个大一的,搞个最佳新人奖也不是什么出人意料的)。
+但是第二次听到我们队的名字的时候就感觉有点可怕了。结果后来又第三次听到了我们队的名字。等我们领完第三个奖,主持人说「我觉得你们可以留步了,
+因为下一个奖还是你们的」,跟你讲我当时就是这个表情:<br>
+<div align="center"><img src="//filestorage.chrisoft.org/blog/img/e1.gif" decoding="async"></div>
+  于是最后我们就拿了四个奖:最佳新人奖,最佳创意奖,最佳技术奖,二等奖……<a id="n4" href="#note4" class="note">[4]</a><br>
+  有理由相信这四个奖除了第一个都是WHG3D赚到的。因为 1.WHG3D更吸引人(尤其是来自游戏厂商的评委)…… 2.展示做的相对比较好……<br>
+  奖发完之后有好多人来要我的联系方式的……由于才大一,不想被「那些」东西打搅太多,就统一只留了个gmail。后来甚至那个游戏厂商的评委来找我们聊天,
+说「对游戏制作有热情很好」之类的话。<a id="n5" href="#note5" class="note">[5]</a><br>
+  我们的作品其实很渣……以下是给我留下深刻印象、感觉真正能拿奖的作品:
+<ul>
+<li>一个难以关掉的闹钟(对于我这种跟粘在床上的人可能比较有用)</li>
+<li>一个分享旧书的系统(虽然好像已经有人做过了,但是感觉想法不错)</li>
+<li>etc...</li>
+</ul>
+<h2 id="tocanch2" class="tvis">后续</h2>
+  我很清楚地知道<a id="n6" href="#note6" class="note">[6]</a>这些奖是公司试图得到廉价苦力的方式之一。过了几天我的gmail里果然
+收到了「想跟你合作一个项目」这样的邮件。以下是我的回信:<br>
+  「抱歉,我现在还只是一名大一的本科新生,时间安排比较紧张,可能无法和您合作。非常抱歉。」<br>
+  在一个有deadline的环境下工作其实不是我理想的工作方式。我希望有一张更加「自由」的时间表,比如我甚至曾经yy过以后去当中小学老师(……),
+然后空余事件写写代码这样的。这样似乎更接近我内在的风格。<br>
+  BLR工程结束之前我不会轻易开别的坑的。BLR会结束吗?(喂别这么早立flag啊……)<br>
+</article>
+</div><br><hr>
+ <div class="TText" id="notediv" style="font-size:80%;"><span class="TText"><a id="note1" href="#n1">[1]</a>: 这些人中有一部分来的目的是「为了找回自己想写什么就写什么的感觉」。<br></span><span class="TText"><a id="note2" href="#n2">[2]</a>: 化名。slyz核能的掌控者。<br></span><span class="TText"><a id="note3" href="#n3">[3]</a>: 后来发现所有提交的作品都通过了……<br></span><span class="TText"><a id="note4" href="#n4">[4]</a>: 一共拿了9k奖金……<br></span><span class="TText"><a id="note5" href="#n5">[5]</a>: 其实他不知道我现在的热情其实不在游戏制作上而是在……乱搞上。<br></span><span class="TText"><a id="note6" href="#n6">[6]</a>: "I know darn well"<br></span></div>
+ <div id="insanch" style="height:3em;"></div>
+ <div id="footer" style="">
+ <div id="pagesw" class="TText" style="width:100%;height:0.5em;"></div>
+ <div style="text-align:center;" class="TText">
+ Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5
+ <br>
+ Content licensed under CC BY-SA 4.0. <span id="purgep" style="display:none;font-size:70%;">This page has passphrase(s) stored. Click <a href="javascript:_purgep()">here</a> to purge.</span>
+ </div>
+ </div>
+ <div id="cmdbuf" class="TText" style="transition:500ms;padding:1em;font-size:2em;color:white;position:absolute;background-color:rgba(0,0,0,0.6);left:50%;top:50%;transform:translate(-50%,-50%);pointer-events:none;opacity:0;">
+ </div>
+ </div>
+ <div id="decryptui" style="display:none;opacity:0;color:white;z-index:1000;position:fixed;left:0;top:0;width:100%;height:100%;background-color:rgba(0,0,0,0.4);transition:opacity 0.5s;">
+ <div id="decryptdlg" class="TText" style="padding:10px 20px;position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);background-color:rgba(0,0,0,0.6);">
+ <div id="keyhint" style="margin-bottom:8px;"></div>
+ <div style="margin-bottom:8px;">Key: <input id="keyinp" type="text" style="color:#fff;"></div>
+ <div style="height:2.25em;">
+ <button id="btndecrypt" onclick="decryptor(decid,document.getElementById('keyinp').value);" style="position:absolute;left:20px;">Decrypt</button>
+ <button onclick="hidedecryptui();" style="position:absolute;right:20px;">Cancel</button>
+ </div>
+
+ </div>
+
+
+</div></body></html> \ No newline at end of file
diff --git a/blog/post/2015-11-22.html b/blog/post/2015-11-22.html
new file mode 100644
index 0000000..5968642
--- /dev/null
+++ b/blog/post/2015-11-22.html
@@ -0,0 +1,176 @@
+<html><head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<meta name="theme-color" content="#000000">
+<title>Chrisoft::Blog</title>
+<script type="text/javascript" src="/panel.js"></script>
+<script type="text/javascript" src="/blog/footnoter.js"></script>
+<script type="text/javascript" src="/blog/aes-js.js"></script>
+<script type="text/javascript" src="/blog/scrypt.js"></script>
+<script type="text/javascript" src="/blog/sha256.js"></script>
+<script type="text/javascript" src="/blog/decryptor.js"></script>
+<link rel="stylesheet" type="text/css" href="/common.css">
+<link rel="stylesheet" type="text/css" href="/panel.css">
+<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
+<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
+<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
+<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
+<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
+<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
+<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
+<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
+<link rel="stylesheet" type="text/css" href="/blog/blogext.css">
+<script>
+function ol()
+{
+ window.onresize=function()
+ {
+ if(window.innerWidth<768)
+ setupevents();
+ else unsetevents();
+ }
+ window.onresize();
+ _decryptonload();
+}
+function loadTheme(){
+ var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
+ if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
+ var ent="";
+ var d=new Date();
+ if(thm[0]=='z')
+ {
+ var m=d.getMonth()+1;
+ if(m>=3&&m<6)thm='0'+thm[1];
+ else if(m>=6&&m<9)thm='1'+thm[1];
+ else if(m>=9&&m<12)thm='2'+thm[1];
+ else thm='3'+thm[1];
+ }
+ if(thm[1]=='z')
+ {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
+ ent=`theme${thm}`;
+ var R=new RegExp('theme[0-4][ab]');
+ for(var i=0;i<document.styleSheets.length;++i)
+ {
+ if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
+ document.styleSheets[i].disabled=true;
+ else document.styleSheets[i].disabled=false;
+ }
+ var thmcolor="";
+ switch(thm[0])
+ {
+ case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break;
+ case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break;
+ case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break;
+ case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break;
+ }
+ document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor);
+}
+loadTheme();
+</script>
+</head>
+<body onload="ol()" style="overflow-x:hidden;">
+ <div id="panel" class="TText">
+ <ul id="panellist">
+ <li><a href="/"><h1>Chrisoft</h1></a></li>
+ <li><a href="/blog"><h2>Blog</h2></a></li>
+ <li><a href="#"><h3 id="title">Raspberry Pi2 初体验</h3></a></li>
+ <li><span>Tags</span>
+ <ul id="tagslist">
+ <li><a href="/blog/list/hands-on/">hands-on</a></li><li><a href="/blog/list/device-review/">device-review</a></li></ul>
+ </li>
+ <li id="tocouter" style="display: none;">
+ <span>Table of Contents</span>
+ <ul id="tocroot">
+ </ul>
+ </li>
+ <li style="margin-left:-0.5em"><a id="prevp" href="2015-11-01.html">Prev post</a></li>
+ <li style="margin-left:-0.5em"><a id="nextp" href="2015-12-20.html">Next post</a></li>
+ </ul>
+ </div>
+ <div id="content">
+ <h2 id="titleh" class="TText" style="font-wight:normal;">Raspberry Pi2 初体验</h2>
+ <div id="datetags" class="TText" style="margin-bottom:1em;">2015-11-22<br>#hands-on #device-review</div>
+ <hr><div id="article" class="TText">
+<article>
+  前几天(11月8号)<s>陪伴了</s>我<s>3年</s>的Galaxy S3从床上摔下来坏掉了。外屏连裂缝都没有,内屏完全废掉了,
+只有一部分屏幕能显示出颜色不对的画面。网上一查S3没有单独卖的屏幕,而换掉整个前面板需要花掉450(真·450)。<a id="n1" href="#note1" class="note">[1]</a>于是我开始考虑买一台新的设备……
+浏览了一些手机的价格,发现都跟抢钱一样贵。后来突然想到了一直想要一块树莓派,于是就跟我妈「谈了个条件」:买了这个之后两年内不买手机。<a id="n2" href="#note2" class="note">[2]</a>
+然后就把树莓派买下来了……(RPi+屏幕+usb wifi=~600RMB)<br>
+  树莓派可以说是我等得最焦急的一个快递。在快递来之前我已经把Raspbian镜像下好了。然而我在拿到这块大英帝国设计,
+天朝制造的板子之后还是有点不知所措<a id="n3" href="#note3" class="note">[3]</a>。上来先往SD卡写系统。然而dd完毕之后卡住不退出了。
+我看似乎4.3G的镜像已经完整地写入进去了。于是试着拿它启动树莓派,结果启动的时候一开始应该看见一个彩色的方块,那个方块却被奇特地拉长了。
+方块消失之后屏幕上就变成了无法理解的东西。我以为是dd爆炸的原因,于是就重新写了好几遍SD卡。然而每次都卡在最后。由于屏幕上显示的东西实在无法看清,
+我就试着拿ssh连接它,结果成功了。我才知道这个跟SD卡没关系。然而屏幕是在电脑上试过,没问题的。
+后来才知道这其实是config.txt里面显示屏分辨率的问题……(1024x600的非标准分辨率需要用特殊的方式设定)于是在config.txt里设置了正确的分辨率,
+终于见到了正常的终端和图形界面。<br>
+  Class 4的SD卡实在是太慢了。于是我把系统移到了U盘,启动速度有了质的提升。现在我的文件系统分配是这样的:<br>
+<pre>  mmcblk0p1 /boot 60M
+  mmcblk0p2 /home ~16G
+  sda2 / ~8G
+</pre>
+  为了实现体验Gnome3的触屏体验的愿望,我把系统滚到了testing(stretch),然后装了Gnome 3.18。然而不幸的是,即使是2代的Raspberry Pi,
+带动Gnome3这个超重量级桌面环境还是相当有压力。然而压力却全在CPU上而不在RAM上——1G RAM仅使用了200MB,
+gnome-shell的CPU占用在登陆几分钟之后就一直在20%以上。不过,Gnome3的触屏体验还是不错的(在不卡的前提下)。
+为了获得一个实用性较强的桌面环境,我还是回到了LXDE……<br>
+  各项功能基本都调试完毕之后,我开始了解关于板上GPIO的知识。GPIO这东西还是很神奇的……很久之前我有一种模糊的用什么设备实现一个自动弹钢琴的机器的想法,
+现在发现GPIO真的可以直接实现……<br>
+  昨天晚上用装快递的盒子给它做了个简陋的壳子。感觉还是可以的……(图见下)<br>
+  现在差不多就研究到这里……开始学习python并研究RPi的其他用途……!<br>
+<table style="max-width:90%;margin:auto;">
+<tbody><tr>
+<td>
+<a href="//filestorage.chrisoft.org/blog/img/rpi_1.jpg"><img src="//filestorage.chrisoft.org/blog/img/rpi_1.jpg" width="50%" decoding="async"></a><br>
+Gnome3.18 on Raspberry Pi 2<br>
+</td>
+<td>
+<a href="//filestorage.chrisoft.org/blog/img/rpi_2.jpg"><img src="//filestorage.chrisoft.org/blog/img/rpi_2.jpg" width="50%" decoding="async"></a><br>
+Browsing the web with Iceweasel<br>
+</td>
+</tr>
+<tr>
+<td>
+<a href="//filestorage.chrisoft.org/blog/img/rpi_3.jpg"><img src="//filestorage.chrisoft.org/blog/img/rpi_3.jpg" width="50%" decoding="async"></a><br>
+The simple box<br>
+</td>
+<td>
+<a href="//filestorage.chrisoft.org/blog/img/rpi_4.png"><img src="//filestorage.chrisoft.org/blog/img/rpi_4.png" width="50%" decoding="async"></a><br>
+LXDE Desktop<br>
+</td>
+</tr>
+<tr>
+<td>
+<a href="//filestorage.chrisoft.org/blog/img/rpi_5.png"><img src="//filestorage.chrisoft.org/blog/img/rpi_5.png" width="50%" decoding="async"></a><br>
+screenfetch<br>
+</td>
+</tr>
+</tbody></table>
+
+</article>
+</div><br><hr>
+ <div class="TText" id="notediv" style="font-size:80%;"><span class="TText"><a id="note1" href="#n1">[1]</a>: 2016-02-21补记:现在那台S3已经满血复活了……
+大概是一亲戚有台闲置的手机问我要不要,我一看是台S3……然后就把外屏换了。<s>(于是就这么白赚了一台树莓派)</s><br></span><span class="TText"><a id="note2" href="#n2">[2]</a>: <s>其实现在有点后悔这个条件……</s><br></span><span class="TText"><a id="note3" href="#n3">[3]</a>: 以至于手上被板子划了个口子……<br></span></div>
+ <div id="insanch" style="height:3em;"></div>
+ <div id="footer" style="">
+ <div id="pagesw" class="TText" style="width:100%;height:0.5em;"></div>
+ <div style="text-align:center;" class="TText">
+ Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5
+ <br>
+ Content licensed under CC BY-SA 4.0. <span id="purgep" style="display:none;font-size:70%;">This page has passphrase(s) stored. Click <a href="javascript:_purgep()">here</a> to purge.</span>
+ </div>
+ </div>
+ <div id="cmdbuf" class="TText" style="transition:500ms;padding:1em;font-size:2em;color:white;position:absolute;background-color:rgba(0,0,0,0.6);left:50%;top:50%;transform:translate(-50%,-50%);pointer-events:none;opacity:0;">
+ </div>
+ </div>
+ <div id="decryptui" style="display:none;opacity:0;color:white;z-index:1000;position:fixed;left:0;top:0;width:100%;height:100%;background-color:rgba(0,0,0,0.4);transition:opacity 0.5s;">
+ <div id="decryptdlg" class="TText" style="padding:10px 20px;position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);background-color:rgba(0,0,0,0.6);">
+ <div id="keyhint" style="margin-bottom:8px;"></div>
+ <div style="margin-bottom:8px;">Key: <input id="keyinp" type="text" style="color:#fff;"></div>
+ <div style="height:2.25em;">
+ <button id="btndecrypt" onclick="decryptor(decid,document.getElementById('keyinp').value);" style="position:absolute;left:20px;">Decrypt</button>
+ <button onclick="hidedecryptui();" style="position:absolute;right:20px;">Cancel</button>
+ </div>
+
+ </div>
+
+
+</div></body></html> \ No newline at end of file
diff --git a/blog/post/2015-12-20.html b/blog/post/2015-12-20.html
new file mode 100644
index 0000000..840373e
--- /dev/null
+++ b/blog/post/2015-12-20.html
@@ -0,0 +1,136 @@
+<html><head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<meta name="theme-color" content="#000000">
+<title>Chrisoft::Blog</title>
+<script type="text/javascript" src="/panel.js"></script>
+<script type="text/javascript" src="/blog/footnoter.js"></script>
+<script type="text/javascript" src="/blog/aes-js.js"></script>
+<script type="text/javascript" src="/blog/scrypt.js"></script>
+<script type="text/javascript" src="/blog/sha256.js"></script>
+<script type="text/javascript" src="/blog/decryptor.js"></script>
+<link rel="stylesheet" type="text/css" href="/common.css">
+<link rel="stylesheet" type="text/css" href="/panel.css">
+<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
+<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
+<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
+<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
+<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
+<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
+<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
+<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
+<link rel="stylesheet" type="text/css" href="/blog/blogext.css">
+<script>
+function ol()
+{
+ window.onresize=function()
+ {
+ if(window.innerWidth<768)
+ setupevents();
+ else unsetevents();
+ }
+ window.onresize();
+ _decryptonload();
+}
+function loadTheme(){
+ var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
+ if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
+ var ent="";
+ var d=new Date();
+ if(thm[0]=='z')
+ {
+ var m=d.getMonth()+1;
+ if(m>=3&&m<6)thm='0'+thm[1];
+ else if(m>=6&&m<9)thm='1'+thm[1];
+ else if(m>=9&&m<12)thm='2'+thm[1];
+ else thm='3'+thm[1];
+ }
+ if(thm[1]=='z')
+ {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
+ ent=`theme${thm}`;
+ var R=new RegExp('theme[0-4][ab]');
+ for(var i=0;i<document.styleSheets.length;++i)
+ {
+ if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
+ document.styleSheets[i].disabled=true;
+ else document.styleSheets[i].disabled=false;
+ }
+ var thmcolor="";
+ switch(thm[0])
+ {
+ case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break;
+ case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break;
+ case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break;
+ case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break;
+ }
+ document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor);
+}
+loadTheme();
+</script>
+</head>
+<body onload="ol()" style="overflow-x:hidden;">
+ <div id="panel" class="TText">
+ <ul id="panellist">
+ <li><a href="/"><h1>Chrisoft</h1></a></li>
+ <li><a href="/blog"><h2>Blog</h2></a></li>
+ <li><a href="#"><h3 id="title">忙</h3></a></li>
+ <li><span>Tags</span>
+ <ul id="tagslist">
+ <li><a href="/blog/list/random-xp/">random-xp</a></li></ul>
+ </li>
+ <li id="tocouter" style="display: none;">
+ <span>Table of Contents</span>
+ <ul id="tocroot">
+ </ul>
+ </li>
+ <li style="margin-left:-0.5em"><a id="prevp" href="2015-11-22.html">Prev post</a></li>
+ <li style="margin-left:-0.5em"><a id="nextp" href="2015-12-23.html">Next post</a></li>
+ </ul>
+ </div>
+ <div id="content">
+ <h2 id="titleh" class="TText" style="font-wight:normal;">忙</h2>
+ <div id="datetags" class="TText" style="margin-bottom:1em;">2015-12-20<br>#random-xp</div>
+ <hr><div id="article" class="TText">
+
+最近突然感到前所未有的忙。是因为之前太颓废了吗?<br>
+下面随便列一下
+<ul>
+<li>数学英语网课</li>
+<li>数学作业卷 29号前补完</li>
+<li>英语两个Presentation(作为组长的我还没开始准备。。。)</li>
+<li>java实验报告一堆</li>
+<li>...</li>
+</ul>
+。。。做完这些就没事了吗?我突然想起军训的时候听到的一句话「更苦的永远在明天」。。。<br>
+不知所措的Chris在手机上ssh连接电脑睡前临时所记 於2015-12-20凌晨<br>
+<hr>
+2016-01-04 补<br>
+然后到现在我才做了上面事情的一件半。。。
+<article>
+</article></div><br><hr>
+ <div class="TText" id="notediv" style="font-size:80%;"></div>
+ <div id="insanch" style="height:3em;"></div>
+ <div id="footer" style="">
+ <div id="pagesw" class="TText" style="width:100%;height:0.5em;"></div>
+ <div style="text-align:center;" class="TText">
+ Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5
+ <br>
+ Content licensed under CC BY-SA 4.0. <span id="purgep" style="display:none;font-size:70%;">This page has passphrase(s) stored. Click <a href="javascript:_purgep()">here</a> to purge.</span>
+ </div>
+ </div>
+ <div id="cmdbuf" class="TText" style="transition:500ms;padding:1em;font-size:2em;color:white;position:absolute;background-color:rgba(0,0,0,0.6);left:50%;top:50%;transform:translate(-50%,-50%);pointer-events:none;opacity:0;">
+ </div>
+ </div>
+ <div id="decryptui" style="display:none;opacity:0;color:white;z-index:1000;position:fixed;left:0;top:0;width:100%;height:100%;background-color:rgba(0,0,0,0.4);transition:opacity 0.5s;">
+ <div id="decryptdlg" class="TText" style="padding:10px 20px;position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);background-color:rgba(0,0,0,0.6);">
+ <div id="keyhint" style="margin-bottom:8px;"></div>
+ <div style="margin-bottom:8px;">Key: <input id="keyinp" type="text" style="color:#fff;"></div>
+ <div style="height:2.25em;">
+ <button id="btndecrypt" onclick="decryptor(decid,document.getElementById('keyinp').value);" style="position:absolute;left:20px;">Decrypt</button>
+ <button onclick="hidedecryptui();" style="position:absolute;right:20px;">Cancel</button>
+ </div>
+
+ </div>
+
+
+</div></body></html> \ No newline at end of file
diff --git a/blog/post/2015-12-23.html b/blog/post/2015-12-23.html
new file mode 100644
index 0000000..5f5b374
--- /dev/null
+++ b/blog/post/2015-12-23.html
@@ -0,0 +1,127 @@
+<html><head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<meta name="theme-color" content="#000000">
+<title>Chrisoft::Blog</title>
+<script type="text/javascript" src="/panel.js"></script>
+<script type="text/javascript" src="/blog/footnoter.js"></script>
+<script type="text/javascript" src="/blog/aes-js.js"></script>
+<script type="text/javascript" src="/blog/scrypt.js"></script>
+<script type="text/javascript" src="/blog/sha256.js"></script>
+<script type="text/javascript" src="/blog/decryptor.js"></script>
+<link rel="stylesheet" type="text/css" href="/common.css">
+<link rel="stylesheet" type="text/css" href="/panel.css">
+<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
+<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
+<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
+<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
+<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
+<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
+<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
+<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
+<link rel="stylesheet" type="text/css" href="/blog/blogext.css">
+<script>
+function ol()
+{
+ window.onresize=function()
+ {
+ if(window.innerWidth<768)
+ setupevents();
+ else unsetevents();
+ }
+ window.onresize();
+ _decryptonload();
+}
+function loadTheme(){
+ var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
+ if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
+ var ent="";
+ var d=new Date();
+ if(thm[0]=='z')
+ {
+ var m=d.getMonth()+1;
+ if(m>=3&&m<6)thm='0'+thm[1];
+ else if(m>=6&&m<9)thm='1'+thm[1];
+ else if(m>=9&&m<12)thm='2'+thm[1];
+ else thm='3'+thm[1];
+ }
+ if(thm[1]=='z')
+ {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
+ ent=`theme${thm}`;
+ var R=new RegExp('theme[0-4][ab]');
+ for(var i=0;i<document.styleSheets.length;++i)
+ {
+ if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
+ document.styleSheets[i].disabled=true;
+ else document.styleSheets[i].disabled=false;
+ }
+ var thmcolor="";
+ switch(thm[0])
+ {
+ case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break;
+ case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break;
+ case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break;
+ case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break;
+ }
+ document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor);
+}
+loadTheme();
+</script>
+</head>
+<body onload="ol()" style="overflow-x:hidden;">
+ <div id="panel" class="TText">
+ <ul id="panellist">
+ <li><a href="/"><h1>Chrisoft</h1></a></li>
+ <li><a href="/blog"><h2>Blog</h2></a></li>
+ <li><a href="#"><h3 id="title">Chris' First Development Blog</h3></a></li>
+ <li><span>Tags</span>
+ <ul id="tagslist">
+ <li><a href="/blog/list/devel/">devel</a></li></ul>
+ </li>
+ <li id="tocouter" style="display: none;">
+ <span>Table of Contents</span>
+ <ul id="tocroot">
+ </ul>
+ </li>
+ <li style="margin-left:-0.5em"><a id="prevp" href="2015-12-20.html">Prev post</a></li>
+ <li style="margin-left:-0.5em"><a id="nextp" href="2015-12-27.html">Next post</a></li>
+ </ul>
+ </div>
+ <div id="content">
+ <h2 id="titleh" class="TText" style="font-wight:normal;">Chris' First Development Blog</h2>
+ <div id="datetags" class="TText" style="margin-bottom:1em;">2015-12-23<br>#devel</div>
+ <hr><div id="article" class="TText">
+<article>
+The development blog was established today... Cheers!<br>
+A 99% bug-free <a href="//filestorage.chrisoft.org/blog/data/midiread.c">midiread.c</a> was completed. The one I wrote in 2012 was a total disaster...<br>
+Perhaps a new project is going to start soon...<br><br>
+
+P.S.: I haven't pushed anything to my github repos for a fairly long time...
+</article>
+</div><br><hr>
+ <div class="TText" id="notediv" style="font-size:80%;"></div>
+ <div id="insanch" style="height:3em;"></div>
+ <div id="footer" style="">
+ <div id="pagesw" class="TText" style="width:100%;height:0.5em;"></div>
+ <div style="text-align:center;" class="TText">
+ Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5
+ <br>
+ Content licensed under CC BY-SA 4.0. <span id="purgep" style="display:none;font-size:70%;">This page has passphrase(s) stored. Click <a href="javascript:_purgep()">here</a> to purge.</span>
+ </div>
+ </div>
+ <div id="cmdbuf" class="TText" style="transition:500ms;padding:1em;font-size:2em;color:white;position:absolute;background-color:rgba(0,0,0,0.6);left:50%;top:50%;transform:translate(-50%,-50%);pointer-events:none;opacity:0;">
+ </div>
+ </div>
+ <div id="decryptui" style="display:none;opacity:0;color:white;z-index:1000;position:fixed;left:0;top:0;width:100%;height:100%;background-color:rgba(0,0,0,0.4);transition:opacity 0.5s;">
+ <div id="decryptdlg" class="TText" style="padding:10px 20px;position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);background-color:rgba(0,0,0,0.6);">
+ <div id="keyhint" style="margin-bottom:8px;"></div>
+ <div style="margin-bottom:8px;">Key: <input id="keyinp" type="text" style="color:#fff;"></div>
+ <div style="height:2.25em;">
+ <button id="btndecrypt" onclick="decryptor(decid,document.getElementById('keyinp').value);" style="position:absolute;left:20px;">Decrypt</button>
+ <button onclick="hidedecryptui();" style="position:absolute;right:20px;">Cancel</button>
+ </div>
+
+ </div>
+
+
+</div></body></html> \ No newline at end of file
diff --git a/blog/post/2015-12-27.html b/blog/post/2015-12-27.html
new file mode 100644
index 0000000..e0f7515
--- /dev/null
+++ b/blog/post/2015-12-27.html
@@ -0,0 +1,127 @@
+<html><head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<meta name="theme-color" content="#000000">
+<title>Chrisoft::Blog</title>
+<script type="text/javascript" src="/panel.js"></script>
+<script type="text/javascript" src="/blog/footnoter.js"></script>
+<script type="text/javascript" src="/blog/aes-js.js"></script>
+<script type="text/javascript" src="/blog/scrypt.js"></script>
+<script type="text/javascript" src="/blog/sha256.js"></script>
+<script type="text/javascript" src="/blog/decryptor.js"></script>
+<link rel="stylesheet" type="text/css" href="/common.css">
+<link rel="stylesheet" type="text/css" href="/panel.css">
+<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
+<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
+<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
+<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
+<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
+<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
+<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
+<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
+<link rel="stylesheet" type="text/css" href="/blog/blogext.css">
+<script>
+function ol()
+{
+ window.onresize=function()
+ {
+ if(window.innerWidth<768)
+ setupevents();
+ else unsetevents();
+ }
+ window.onresize();
+ _decryptonload();
+}
+function loadTheme(){
+ var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
+ if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
+ var ent="";
+ var d=new Date();
+ if(thm[0]=='z')
+ {
+ var m=d.getMonth()+1;
+ if(m>=3&&m<6)thm='0'+thm[1];
+ else if(m>=6&&m<9)thm='1'+thm[1];
+ else if(m>=9&&m<12)thm='2'+thm[1];
+ else thm='3'+thm[1];
+ }
+ if(thm[1]=='z')
+ {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
+ ent=`theme${thm}`;
+ var R=new RegExp('theme[0-4][ab]');
+ for(var i=0;i<document.styleSheets.length;++i)
+ {
+ if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
+ document.styleSheets[i].disabled=true;
+ else document.styleSheets[i].disabled=false;
+ }
+ var thmcolor="";
+ switch(thm[0])
+ {
+ case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break;
+ case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break;
+ case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break;
+ case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break;
+ }
+ document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor);
+}
+loadTheme();
+</script>
+</head>
+<body onload="ol()" style="overflow-x:hidden;">
+ <div id="panel" class="TText">
+ <ul id="panellist">
+ <li><a href="/"><h1>Chrisoft</h1></a></li>
+ <li><a href="/blog"><h2>Blog</h2></a></li>
+ <li><a href="#"><h3 id="title">QMidiPlayer got its repo</h3></a></li>
+ <li><span>Tags</span>
+ <ul id="tagslist">
+ <li><a href="/blog/list/devel/">devel</a></li><li><a href="/blog/list/qmidiplayer/">qmidiplayer</a></li></ul>
+ </li>
+ <li id="tocouter" style="display: none;">
+ <span>Table of Contents</span>
+ <ul id="tocroot">
+ </ul>
+ </li>
+ <li style="margin-left:-0.5em"><a id="prevp" href="2015-12-23.html">Prev post</a></li>
+ <li style="margin-left:-0.5em"><a id="nextp" href="2016-01-03.html">Next post</a></li>
+ </ul>
+ </div>
+ <div id="content">
+ <h2 id="titleh" class="TText" style="font-wight:normal;">QMidiPlayer got its repo</h2>
+ <div id="datetags" class="TText" style="margin-bottom:1em;">2015-12-27<br>#devel #qmidiplayer</div>
+ <hr><div id="article" class="TText">
+<article>
+A new project has started.<br>
+<a href="https://github.com/chirs241097/QMidiPlayer">QMidiPlayer</a><br>
+Motived by the fact that there's no suitable midi player for linux and
+based on my recented work, this project started as my minimal contribution to
+the opensource community...
+</article>
+</div><br><hr>
+ <div class="TText" id="notediv" style="font-size:80%;"></div>
+ <div id="insanch" style="height:3em;"></div>
+ <div id="footer" style="">
+ <div id="pagesw" class="TText" style="width:100%;height:0.5em;"></div>
+ <div style="text-align:center;" class="TText">
+ Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5
+ <br>
+ Content licensed under CC BY-SA 4.0. <span id="purgep" style="display:none;font-size:70%;">This page has passphrase(s) stored. Click <a href="javascript:_purgep()">here</a> to purge.</span>
+ </div>
+ </div>
+ <div id="cmdbuf" class="TText" style="transition:500ms;padding:1em;font-size:2em;color:white;position:absolute;background-color:rgba(0,0,0,0.6);left:50%;top:50%;transform:translate(-50%,-50%);pointer-events:none;opacity:0;">
+ </div>
+ </div>
+ <div id="decryptui" style="display:none;opacity:0;color:white;z-index:1000;position:fixed;left:0;top:0;width:100%;height:100%;background-color:rgba(0,0,0,0.4);transition:opacity 0.5s;">
+ <div id="decryptdlg" class="TText" style="padding:10px 20px;position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);background-color:rgba(0,0,0,0.6);">
+ <div id="keyhint" style="margin-bottom:8px;"></div>
+ <div style="margin-bottom:8px;">Key: <input id="keyinp" type="text" style="color:#fff;"></div>
+ <div style="height:2.25em;">
+ <button id="btndecrypt" onclick="decryptor(decid,document.getElementById('keyinp').value);" style="position:absolute;left:20px;">Decrypt</button>
+ <button onclick="hidedecryptui();" style="position:absolute;right:20px;">Cancel</button>
+ </div>
+
+ </div>
+
+
+</div></body></html> \ No newline at end of file
diff --git a/blog/post/2016-01-03.html b/blog/post/2016-01-03.html
new file mode 100644
index 0000000..b60e695
--- /dev/null
+++ b/blog/post/2016-01-03.html
@@ -0,0 +1,147 @@
+<html><head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<meta name="theme-color" content="#000000">
+<title>Chrisoft::Blog</title>
+<script type="text/javascript" src="/panel.js"></script>
+<script type="text/javascript" src="/blog/footnoter.js"></script>
+<script type="text/javascript" src="/blog/aes-js.js"></script>
+<script type="text/javascript" src="/blog/scrypt.js"></script>
+<script type="text/javascript" src="/blog/sha256.js"></script>
+<script type="text/javascript" src="/blog/decryptor.js"></script>
+<link rel="stylesheet" type="text/css" href="/common.css">
+<link rel="stylesheet" type="text/css" href="/panel.css">
+<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
+<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
+<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
+<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
+<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
+<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
+<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
+<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
+<link rel="stylesheet" type="text/css" href="/blog/blogext.css">
+<script>
+function ol()
+{
+ window.onresize=function()
+ {
+ if(window.innerWidth<768)
+ setupevents();
+ else unsetevents();
+ }
+ window.onresize();
+ _decryptonload();
+}
+function loadTheme(){
+ var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
+ if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
+ var ent="";
+ var d=new Date();
+ if(thm[0]=='z')
+ {
+ var m=d.getMonth()+1;
+ if(m>=3&&m<6)thm='0'+thm[1];
+ else if(m>=6&&m<9)thm='1'+thm[1];
+ else if(m>=9&&m<12)thm='2'+thm[1];
+ else thm='3'+thm[1];
+ }
+ if(thm[1]=='z')
+ {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
+ ent=`theme${thm}`;
+ var R=new RegExp('theme[0-4][ab]');
+ for(var i=0;i<document.styleSheets.length;++i)
+ {
+ if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
+ document.styleSheets[i].disabled=true;
+ else document.styleSheets[i].disabled=false;
+ }
+ var thmcolor="";
+ switch(thm[0])
+ {
+ case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break;
+ case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break;
+ case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break;
+ case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break;
+ }
+ document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor);
+}
+loadTheme();
+</script>
+</head>
+<body onload="ol()" style="overflow-x:hidden;">
+ <div id="panel" class="TText">
+ <ul id="panellist">
+ <li><a href="/"><h1>Chrisoft</h1></a></li>
+ <li><a href="/blog"><h2>Blog</h2></a></li>
+ <li><a href="#"><h3 id="title">The Design and The Real Product</h3></a></li>
+ <li><span>Tags</span>
+ <ul id="tagslist">
+ <li><a href="/blog/list/devel/">devel</a></li><li><a href="/blog/list/design/">design</a></li></ul>
+ </li>
+ <li id="tocouter" style="display: none;">
+ <span>Table of Contents</span>
+ <ul id="tocroot">
+ </ul>
+ </li>
+ <li style="margin-left:-0.5em"><a id="prevp" href="2015-12-27.html">Prev post</a></li>
+ <li style="margin-left:-0.5em"><a id="nextp" href="2016-01-16.html">Next post</a></li>
+ </ul>
+ </div>
+ <div id="content">
+ <h2 id="titleh" class="TText" style="font-wight:normal;">The Design and The Real Product</h2>
+ <div id="datetags" class="TText" style="margin-bottom:1em;">2016-01-03<br>#devel #design</div>
+ <hr><div id="article" class="TText">
+<article>
+&nbsp;&nbsp;Well, QMidiPlayer is now in active development. Now it is in its
+alpha stage. Comparing the original design and the real product resulted in
+a great surprise to me.
+<table style="max-width:90%;margin:auto;text-align:center;">
+<tbody><tr><td>
+<img src="//filestorage.chrisoft.org/blog/img/design.jpg" alt="design" width="50%" decoding="async"><br>
+The design
+</td></tr>
+<tr><td>
+<img src="//filestorage.chrisoft.org/blog/img/real.png" alt="real" width="70%" decoding="async"><br>
+The real product
+</td></tr>
+</tbody></table>
+&nbsp;&nbsp;For the main window, the real thing is almost identical to the design.
+Other windows also strongly resemble their design.<br>
+&nbsp;&nbsp;So what's the point?<br>
+<table style="max-width:90%;margin:auto;text-align:center;">
+<tbody><tr><td>
+<i>A good design, not necessary to be opulent, wants to be realized.</i>
+</td></tr>
+<tr><td>
+<i>A good programmer, not necessary to be brilliant, should be faithful to the design.</i>
+</td></tr>
+</tbody></table>
+But if you are a designer <i>and</i> programmer...
+</article>
+</div><br><hr>
+ <div class="TText" id="notediv" style="font-size:80%;"></div>
+ <div id="insanch" style="height:3em;"></div>
+ <div id="footer" style="">
+ <div id="pagesw" class="TText" style="width:100%;height:0.5em;"></div>
+ <div style="text-align:center;" class="TText">
+ Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5
+ <br>
+ Content licensed under CC BY-SA 4.0. <span id="purgep" style="display:none;font-size:70%;">This page has passphrase(s) stored. Click <a href="javascript:_purgep()">here</a> to purge.</span>
+ </div>
+ </div>
+ <div id="cmdbuf" class="TText" style="transition:500ms;padding:1em;font-size:2em;color:white;position:absolute;background-color:rgba(0,0,0,0.6);left:50%;top:50%;transform:translate(-50%,-50%);pointer-events:none;opacity:0;">
+ </div>
+ </div>
+ <div id="decryptui" style="display:none;opacity:0;color:white;z-index:1000;position:fixed;left:0;top:0;width:100%;height:100%;background-color:rgba(0,0,0,0.4);transition:opacity 0.5s;">
+ <div id="decryptdlg" class="TText" style="padding:10px 20px;position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);background-color:rgba(0,0,0,0.6);">
+ <div id="keyhint" style="margin-bottom:8px;"></div>
+ <div style="margin-bottom:8px;">Key: <input id="keyinp" type="text" style="color:#fff;"></div>
+ <div style="height:2.25em;">
+ <button id="btndecrypt" onclick="decryptor(decid,document.getElementById('keyinp').value);" style="position:absolute;left:20px;">Decrypt</button>
+ <button onclick="hidedecryptui();" style="position:absolute;right:20px;">Cancel</button>
+ </div>
+
+ </div>
+
+
+</div></body></html> \ No newline at end of file
diff --git a/blog/post/2016-01-16.html b/blog/post/2016-01-16.html
new file mode 100644
index 0000000..81d740e
--- /dev/null
+++ b/blog/post/2016-01-16.html
@@ -0,0 +1,139 @@
+<html><head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<meta name="theme-color" content="#000000">
+<title>Chrisoft::Blog</title>
+<script type="text/javascript" src="/panel.js"></script>
+<script type="text/javascript" src="/blog/footnoter.js"></script>
+<script type="text/javascript" src="/blog/aes-js.js"></script>
+<script type="text/javascript" src="/blog/scrypt.js"></script>
+<script type="text/javascript" src="/blog/sha256.js"></script>
+<script type="text/javascript" src="/blog/decryptor.js"></script>
+<link rel="stylesheet" type="text/css" href="/common.css">
+<link rel="stylesheet" type="text/css" href="/panel.css">
+<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
+<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
+<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
+<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
+<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
+<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
+<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
+<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
+<link rel="stylesheet" type="text/css" href="/blog/blogext.css">
+<script>
+function ol()
+{
+ window.onresize=function()
+ {
+ if(window.innerWidth<768)
+ setupevents();
+ else unsetevents();
+ }
+ window.onresize();
+ _decryptonload();
+}
+function loadTheme(){
+ var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
+ if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
+ var ent="";
+ var d=new Date();
+ if(thm[0]=='z')
+ {
+ var m=d.getMonth()+1;
+ if(m>=3&&m<6)thm='0'+thm[1];
+ else if(m>=6&&m<9)thm='1'+thm[1];
+ else if(m>=9&&m<12)thm='2'+thm[1];
+ else thm='3'+thm[1];
+ }
+ if(thm[1]=='z')
+ {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
+ ent=`theme${thm}`;
+ var R=new RegExp('theme[0-4][ab]');
+ for(var i=0;i<document.styleSheets.length;++i)
+ {
+ if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
+ document.styleSheets[i].disabled=true;
+ else document.styleSheets[i].disabled=false;
+ }
+ var thmcolor="";
+ switch(thm[0])
+ {
+ case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break;
+ case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break;
+ case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break;
+ case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break;
+ }
+ document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor);
+}
+loadTheme();
+</script>
+</head>
+<body onload="ol()" style="overflow-x:hidden;">
+ <div id="panel" class="TText">
+ <ul id="panellist">
+ <li><a href="/"><h1>Chrisoft</h1></a></li>
+ <li><a href="/blog"><h2>Blog</h2></a></li>
+ <li><a href="#"><h3 id="title">QMidiPlayer Progress-2016-01-16</h3></a></li>
+ <li><span>Tags</span>
+ <ul id="tagslist">
+ <li><a href="/blog/list/devel/">devel</a></li><li><a href="/blog/list/qmidiplayer/">qmidiplayer</a></li></ul>
+ </li>
+ <li id="tocouter" style="display: none;">
+ <span>Table of Contents</span>
+ <ul id="tocroot">
+ </ul>
+ </li>
+ <li style="margin-left:-0.5em"><a id="prevp" href="2016-01-03.html">Prev post</a></li>
+ <li style="margin-left:-0.5em"><a id="nextp" href="2016-01-25.html">Next post</a></li>
+ </ul>
+ </div>
+ <div id="content">
+ <h2 id="titleh" class="TText" style="font-wight:normal;">QMidiPlayer Progress-2016-01-16</h2>
+ <div id="datetags" class="TText" style="margin-bottom:1em;">2016-01-16<br>#devel #qmidiplayer</div>
+ <hr><div id="article" class="TText">
+<article>
+&nbsp;&nbsp;QMidiPlayer 0.6.2-2 beta is out! Find more about it
+<a href="http://chrisoft.org/QMidiPlayer/">here</a>.<br>
+&nbsp;&nbsp;This version has reached a fairly stable stage (in Linux) and has
+experimental Windows support. It has been the default midi player on my Debian
+sid for a few days.<br>
+&nbsp;&nbsp;So the next big feature is visualization. It's progressing, too.
+Have a look at the picture below.<br>
+<table style="max-width:90%;margin:auto;text-align:center;">
+<tbody><tr><td>
+<img src="//filestorage.chrisoft.org/blog/img/visualtest.png" width="90%" decoding="async">
+Primitive 3D MIDI visualization test
+</td></tr>
+</tbody></table>
+&nbsp;&nbsp;It's still primitive, but it already has everything required to
+go mature -- tight timing, time stamp synchronization, etc.<br>
+&nbsp;&nbsp;Well, I still hope that this tiny project can get into the official
+Debian repository... Is it a vain hope?
+</article>
+</div><br><hr>
+ <div class="TText" id="notediv" style="font-size:80%;"></div>
+ <div id="insanch" style="height:3em;"></div>
+ <div id="footer" style="">
+ <div id="pagesw" class="TText" style="width:100%;height:0.5em;"></div>
+ <div style="text-align:center;" class="TText">
+ Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5
+ <br>
+ Content licensed under CC BY-SA 4.0. <span id="purgep" style="display:none;font-size:70%;">This page has passphrase(s) stored. Click <a href="javascript:_purgep()">here</a> to purge.</span>
+ </div>
+ </div>
+ <div id="cmdbuf" class="TText" style="transition:500ms;padding:1em;font-size:2em;color:white;position:absolute;background-color:rgba(0,0,0,0.6);left:50%;top:50%;transform:translate(-50%,-50%);pointer-events:none;opacity:0;">
+ </div>
+ </div>
+ <div id="decryptui" style="display:none;opacity:0;color:white;z-index:1000;position:fixed;left:0;top:0;width:100%;height:100%;background-color:rgba(0,0,0,0.4);transition:opacity 0.5s;">
+ <div id="decryptdlg" class="TText" style="padding:10px 20px;position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);background-color:rgba(0,0,0,0.6);">
+ <div id="keyhint" style="margin-bottom:8px;"></div>
+ <div style="margin-bottom:8px;">Key: <input id="keyinp" type="text" style="color:#fff;"></div>
+ <div style="height:2.25em;">
+ <button id="btndecrypt" onclick="decryptor(decid,document.getElementById('keyinp').value);" style="position:absolute;left:20px;">Decrypt</button>
+ <button onclick="hidedecryptui();" style="position:absolute;right:20px;">Cancel</button>
+ </div>
+
+ </div>
+
+
+</div></body></html> \ No newline at end of file
diff --git a/blog/post/2016-01-25.html b/blog/post/2016-01-25.html
new file mode 100644
index 0000000..c1d2542
--- /dev/null
+++ b/blog/post/2016-01-25.html
@@ -0,0 +1,194 @@
+<html><head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<meta name="theme-color" content="#000000">
+<title>Chrisoft::Blog</title>
+<script type="text/javascript" src="/panel.js"></script>
+<script type="text/javascript" src="/blog/footnoter.js"></script>
+<script type="text/javascript" src="/blog/aes-js.js"></script>
+<script type="text/javascript" src="/blog/scrypt.js"></script>
+<script type="text/javascript" src="/blog/sha256.js"></script>
+<script type="text/javascript" src="/blog/decryptor.js"></script>
+<link rel="stylesheet" type="text/css" href="/common.css">
+<link rel="stylesheet" type="text/css" href="/panel.css">
+<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
+<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
+<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
+<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
+<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
+<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
+<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
+<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
+<link rel="stylesheet" type="text/css" href="/blog/blogext.css">
+<script>
+function ol()
+{
+ window.onresize=function()
+ {
+ if(window.innerWidth<768)
+ setupevents();
+ else unsetevents();
+ }
+ window.onresize();
+ _decryptonload();
+}
+function loadTheme(){
+ var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
+ if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
+ var ent="";
+ var d=new Date();
+ if(thm[0]=='z')
+ {
+ var m=d.getMonth()+1;
+ if(m>=3&&m<6)thm='0'+thm[1];
+ else if(m>=6&&m<9)thm='1'+thm[1];
+ else if(m>=9&&m<12)thm='2'+thm[1];
+ else thm='3'+thm[1];
+ }
+ if(thm[1]=='z')
+ {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
+ ent=`theme${thm}`;
+ var R=new RegExp('theme[0-4][ab]');
+ for(var i=0;i<document.styleSheets.length;++i)
+ {
+ if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
+ document.styleSheets[i].disabled=true;
+ else document.styleSheets[i].disabled=false;
+ }
+ var thmcolor="";
+ switch(thm[0])
+ {
+ case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break;
+ case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break;
+ case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break;
+ case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break;
+ }
+ document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor);
+}
+loadTheme();
+</script>
+</head>
+<body onload="ol()" style="overflow-x:hidden;">
+ <div id="panel" class="TText">
+ <ul id="panellist">
+ <li><a href="/"><h1>Chrisoft</h1></a></li>
+ <li><a href="/blog"><h2>Blog</h2></a></li>
+ <li><a href="#"><h3 id="title">放假...</h3></a></li>
+ <li><span>Tags</span>
+ <ul id="tagslist">
+ <li><a href="/blog/list/daily-life/">daily-life</a></li></ul>
+ </li>
+ <li id="tocouter" style="display: none;">
+ <span>Table of Contents</span>
+ <ul id="tocroot">
+ </ul>
+ </li>
+ <li style="margin-left:-0.5em"><a id="prevp" href="2016-01-16.html">Prev post</a></li>
+ <li style="margin-left:-0.5em"><a id="nextp" href="2016-02-14.html">Next post</a></li>
+ </ul>
+ </div>
+ <div id="content">
+ <h2 id="titleh" class="TText" style="font-wight:normal;">放假...</h2>
+ <div id="datetags" class="TText" style="margin-bottom:1em;">2016-01-25<br>#daily-life</div>
+ <hr><div id="article" class="TText">
+<article>
+  嘛……大一上学期就这么结束了。(其实按说是21号考完java就结束了)<br>
+  这个学期……似乎什么都没有做呢。哦不对……似乎又做了很多……<br>
+<hr>
+  正如上篇「忙」所记,最后那几天事情确实非常多。然而还好都在各自的deadline前完成了。其实我大概就是那种
+「非得等到快结束才下决心去做」的人……(通俗地讲,拖延症)
+<ul>
+<li>英语网课我是在deadline前一天完成的</li>
+<li>数学作业卷稍早一些……deadline 2天前</li>
+<li>Presentation都是在还有10小时就要上台的时候定的稿……(苦了我们组另外三位(女性)组员了(呸))</li>
+<li>7篇java实验报告是一晚上刷完的(其中有4篇由于做实验时根本没写或者写完扔机房电脑上了是现写的代码……)</li>
+</ul>
+  最终Presentation的效果还是很不错的,java也拿了个不错的分数。这也许是我应对强制性工作的方式?
+(我在自己要做的事情上是很少拖延的……)<br>
+  最可怕的其实在于todo队列里东西很多和很少的时候都不知道该做什么。<br>
+<hr>
+  个人没有建立全方面的TODO列表的习惯(最多也就是在一个project里列一个很小的TODO列表),
+因为感觉立了flag不收非常不爽……<br>
+  然而,这个样子的坏处就是过段时间回过头来看的时候容易有一种「这么长时间我究竟做了什么?」的感觉。<br>
+  不过多亏了曾经的Google Code和现在的GitHub,这一年我做过的事情大多数还是可以追溯的……<br>
+<hr>
+  正如开头所说,大学第一个学期过去了。混完这一个学期,明显感到大学生活经验严重不足……<br>
+  这个学期去自习的次数……如果算上脚趾的话应该可以叫屈指可数了。不知道出于什么原因,我们宿舍的学习热情似乎十分低迷。
+其中有2人甚至整个学期没有去过一次自习室(跟我们对门的宿舍一比简直是天壤之别)。周末的生活经常就是完全在宿舍度过的……
+一下课就全体冲回宿舍该干嘛干嘛了:打游戏(包括QQ农场),跟女友聊天,看动画片/电影,等等。也许全宿舍在平时写过代码的只有我一个。<br>
+  值得一提的是,不知何时LOL这个游戏突然在临近的宿舍之间流行了起来。本来我们宿舍是只有一个人打过LOL的(到11月的时候还因为
+「不想继续坑队友」删除了游戏)。12月左右LOL在我们宿舍的普及率瞬间就达到了4/6。对门宿舍则全军覆没(然而似乎并没有影响到人家的自习频率……)。
+此后就经常听见在一些人在午夜因为自己或者队友被干掉发出的鬼哭狼嚎。由于我高中偷偷体验过类似游戏(感受到了强烈的智商碾压),
+并且十分厌恶打游戏时大喊大叫,所以对该游戏的态度不可避免地变得比较糟糕。当然,不可否认这款游戏相当成功。<br>
+  由于参加CCPC错过了所谓的「百团大战」,其他什么组织也没有加入过。所以这学期空余的时间是实实在在的「我自己的时间」。
+然而,这些时间里被睡过去的占了20%(事实上,就在我打出这几行字的时候还是困)。其他时间,大概就是敲敲自己的代码,在wikipedia上乱逛,
+然后玩些诸如扫雷、纸牌之类的小游戏……<br>
+  反观一些去了神校的高中同学,比如PKU的xtt,人家现在有工作。其他也无需多说了(简直就是人生赢家啊啊啊……)。<br>
+  似乎只有在进行现实与理想的比较,或者人与人的比较的时候才能意识到自己是多么的sb。<br>
+  这学期好像也没涨多少经验。<br>
+<hr>
+  说到理想与现实的比较……可能要提到一个「人」。了解相关情况的人可能已经知道我要提到的「人」是谁了。<br>
+  简而言之,<br>
+<ul>
+<li>我反对草率地开坑。并且更加反对草率地开坑后轻易弃坑的行为。</li>
+<li>我反对仅仅是为了「装B」或者是通过什么答辩而造轮子的行为。</li>
+</ul>
+  首先我承认我在刚上高中的时候做出过开坑后弃坑的行为。当时也许还可以把锅扔给「年少轻狂」。然而,作为大学生,
+尤其是还没有确认自己是否有填坑能力的时候,再把锅扔给「年少轻狂」,恐怕有些不合适。其次,开坑不填,
+牺牲的是自己或者团队的信用。作为大学生,不应该不清楚诚信的作用。至于我期待这人的作品很久最后等到的却是已弃坑的消息的时候沮丧的心情,
+应该不用再描述太多了。<br>
+  对于第二条,如果拆开来看,造轮子有正面和反面两种解释<a id="n1" href="#note1" class="note">[1]</a>,
+而用来装B的话……多半只能适用用反面解释了。<br>
+  「你们看我这个东西完全没有用别人的库诶我好牛逼啊。」<br>
+  如果是为了通过什么答辩,则我认为此行为更加不可理解。在这种开发时间有限的情况下,不光造出来的轮子质量无法保证,
+就连软件能按时作成都是相当困难的。几个心血来潮的大学生一年开发出来的库的质量跟一群人6年开发出来的库的质量相比,结果可想而知。<br>
+  当然,关于这里提到的「那个人」,事情还有很多。我似乎无法找到能让此人完全接受不同观点的方法
+(此人「似乎是看到有和自己想法不一样的地方就拒绝接受了」(BL语))。<br>
+  「我不听我不听我不听我不听我不听」<br>
+  「好好好我听不就是了么」<br>
+  (以上是BL对此人的高还原度模仿)<br>
+  (虽然到最后其实还是没听)<a id="n2" href="#note2" class="note">[2]</a><br>
+<hr>
+  这是另一个跟上面提到的那个「人」有关系的部分。<br>
+  「分身」这个词,上次使用应该是在高中搞OI没退役的时候。当时只是一个开玩笑用的词语而已。<br>
+  于是现在我终于见到对自己有分身深信不疑的人了。不仅如此,此人也相信别人也有「分身」。<br>
+  在此我不想在这一方面做过深的探讨,但是总的来说……我认为这是一种人格分裂。<br>
+  虽然很多人在网上的说话风格跟平常说话的风格大不相同(包括我),但是认同自己不同情况下完全不是同一个人的
+人,似乎不多。<br>
+  关于这点,可能既能天天见面,又能经常通过网络聊天的朋友的发言权更大吧。<br>
+  总之,不管在哪里,我都坚持同一套原则。如果有人试图破坏我的原则,那我以后只好对他敬而远之咯。<br>
+<hr>
+  写到最后,感觉好像还有什么要写的东西没有表达出来……<br>
+  这个学期的成绩还算能看……不过如果真的说到出国的话,托福好像还没看多少呢……<br>
+  最近在网上乱逛的时候突然有一种感叹:博士好多啊……<a id="n3" href="#note3" class="note">[3]</a><br>
+  虽然我不是非常在意这个,但是我的学位能爬到多高呢?<br>
+  爬得越高 摔得越惨<br>
+  (齐鲁软件学院不是大专啊喂……)
+</article>
+</div><br><hr>
+ <div class="TText" id="notediv" style="font-size:80%;"><span class="TText"><a id="note1" href="#n1">[1]</a>: 其实关于reinventing the wheel,还有几种变体。如果以后我在这方面还有想说的东西的话可能会专门写一篇东西……<br></span><span class="TText"><a id="note2" href="#n2">[2]</a>: 毕竟人家已经说过了,不稀罕我这个「用户」,那我还是用「随他去吧」的态度来对待此人吧。<br></span><span class="TText"><a id="note3" href="#n3">[3]</a>: KDE论坛的一个管理员是生物学领域的博士……还有cello作者,etc.<br></span></div>
+ <div id="insanch" style="height:3em;"></div>
+ <div id="footer" style="">
+ <div id="pagesw" class="TText" style="width:100%;height:0.5em;"></div>
+ <div style="text-align:center;" class="TText">
+ Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5
+ <br>
+ Content licensed under CC BY-SA 4.0. <span id="purgep" style="display:none;font-size:70%;">This page has passphrase(s) stored. Click <a href="javascript:_purgep()">here</a> to purge.</span>
+ </div>
+ </div>
+ <div id="cmdbuf" class="TText" style="transition:500ms;padding:1em;font-size:2em;color:white;position:absolute;background-color:rgba(0,0,0,0.6);left:50%;top:50%;transform:translate(-50%,-50%);pointer-events:none;opacity:0;">
+ </div>
+ </div>
+ <div id="decryptui" style="display:none;opacity:0;color:white;z-index:1000;position:fixed;left:0;top:0;width:100%;height:100%;background-color:rgba(0,0,0,0.4);transition:opacity 0.5s;">
+ <div id="decryptdlg" class="TText" style="padding:10px 20px;position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);background-color:rgba(0,0,0,0.6);">
+ <div id="keyhint" style="margin-bottom:8px;"></div>
+ <div style="margin-bottom:8px;">Key: <input id="keyinp" type="text" style="color:#fff;"></div>
+ <div style="height:2.25em;">
+ <button id="btndecrypt" onclick="decryptor(decid,document.getElementById('keyinp').value);" style="position:absolute;left:20px;">Decrypt</button>
+ <button onclick="hidedecryptui();" style="position:absolute;right:20px;">Cancel</button>
+ </div>
+
+ </div>
+
+
+</div></body></html> \ No newline at end of file
diff --git a/blog/post/2016-02-14.html b/blog/post/2016-02-14.html
new file mode 100644
index 0000000..b47d4f1
--- /dev/null
+++ b/blog/post/2016-02-14.html
@@ -0,0 +1,126 @@
+<html><head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<meta name="theme-color" content="#000000">
+<title>Chrisoft::Blog</title>
+<script type="text/javascript" src="/panel.js"></script>
+<script type="text/javascript" src="/blog/footnoter.js"></script>
+<script type="text/javascript" src="/blog/aes-js.js"></script>
+<script type="text/javascript" src="/blog/scrypt.js"></script>
+<script type="text/javascript" src="/blog/sha256.js"></script>
+<script type="text/javascript" src="/blog/decryptor.js"></script>
+<link rel="stylesheet" type="text/css" href="/common.css">
+<link rel="stylesheet" type="text/css" href="/panel.css">
+<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
+<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
+<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
+<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
+<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
+<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
+<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
+<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
+<link rel="stylesheet" type="text/css" href="/blog/blogext.css">
+<script>
+function ol()
+{
+ window.onresize=function()
+ {
+ if(window.innerWidth<768)
+ setupevents();
+ else unsetevents();
+ }
+ window.onresize();
+ _decryptonload();
+}
+function loadTheme(){
+ var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
+ if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
+ var ent="";
+ var d=new Date();
+ if(thm[0]=='z')
+ {
+ var m=d.getMonth()+1;
+ if(m>=3&&m<6)thm='0'+thm[1];
+ else if(m>=6&&m<9)thm='1'+thm[1];
+ else if(m>=9&&m<12)thm='2'+thm[1];
+ else thm='3'+thm[1];
+ }
+ if(thm[1]=='z')
+ {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
+ ent=`theme${thm}`;
+ var R=new RegExp('theme[0-4][ab]');
+ for(var i=0;i<document.styleSheets.length;++i)
+ {
+ if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
+ document.styleSheets[i].disabled=true;
+ else document.styleSheets[i].disabled=false;
+ }
+ var thmcolor="";
+ switch(thm[0])
+ {
+ case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break;
+ case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break;
+ case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break;
+ case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break;
+ }
+ document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor);
+}
+loadTheme();
+</script>
+</head>
+<body onload="ol()" style="overflow-x:hidden;">
+ <div id="panel" class="TText">
+ <ul id="panellist">
+ <li><a href="/"><h1>Chrisoft</h1></a></li>
+ <li><a href="/blog"><h2>Blog</h2></a></li>
+ <li><a href="#"><h3 id="title">Why Do I Prefer a Computer over a Girlfriend/<s>(Boyfriend)</s></h3></a></li>
+ <li><span>Tags</span>
+ <ul id="tagslist">
+ <li><a href="/blog/list/sophistry/">sophistry</a></li></ul>
+ </li>
+ <li id="tocouter" style="display: none;">
+ <span>Table of Contents</span>
+ <ul id="tocroot">
+ </ul>
+ </li>
+ <li style="margin-left:-0.5em"><a id="prevp" href="2016-01-25.html">Prev post</a></li>
+ <li style="margin-left:-0.5em"><a id="nextp" href="2016-02-18.html">Next post</a></li>
+ </ul>
+ </div>
+ <div id="content">
+ <h2 id="titleh" class="TText" style="font-wight:normal;">Why Do I Prefer a Computer over a Girlfriend/<s>(Boyfriend)</s></h2>
+ <div id="datetags" class="TText" style="margin-bottom:1em;">2016-02-14<br>#sophistry</div>
+ <hr><div id="article" class="TText">
+<article>
+<p>
+Let's start with a picture.
+</p>
+<img src="//filestorage.chrisoft.org/blog/img/gf2.png" alt="" style="display:block;margin:auto;" decoding="async">
+</article>
+</div><br><hr>
+ <div class="TText" id="notediv" style="font-size:80%;"></div>
+ <div id="insanch" style="height:3em;"></div>
+ <div id="footer" style="">
+ <div id="pagesw" class="TText" style="width:100%;height:0.5em;"></div>
+ <div style="text-align:center;" class="TText">
+ Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5
+ <br>
+ Content licensed under CC BY-SA 4.0. <span id="purgep" style="display:none;font-size:70%;">This page has passphrase(s) stored. Click <a href="javascript:_purgep()">here</a> to purge.</span>
+ </div>
+ </div>
+ <div id="cmdbuf" class="TText" style="transition:500ms;padding:1em;font-size:2em;color:white;position:absolute;background-color:rgba(0,0,0,0.6);left:50%;top:50%;transform:translate(-50%,-50%);pointer-events:none;opacity:0;">
+ </div>
+ </div>
+ <div id="decryptui" style="display:none;opacity:0;color:white;z-index:1000;position:fixed;left:0;top:0;width:100%;height:100%;background-color:rgba(0,0,0,0.4);transition:opacity 0.5s;">
+ <div id="decryptdlg" class="TText" style="padding:10px 20px;position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);background-color:rgba(0,0,0,0.6);">
+ <div id="keyhint" style="margin-bottom:8px;"></div>
+ <div style="margin-bottom:8px;">Key: <input id="keyinp" type="text" style="color:#fff;"></div>
+ <div style="height:2.25em;">
+ <button id="btndecrypt" onclick="decryptor(decid,document.getElementById('keyinp').value);" style="position:absolute;left:20px;">Decrypt</button>
+ <button onclick="hidedecryptui();" style="position:absolute;right:20px;">Cancel</button>
+ </div>
+
+ </div>
+
+
+</div></body></html> \ No newline at end of file
diff --git a/blog/post/2016-02-18.html b/blog/post/2016-02-18.html
new file mode 100644
index 0000000..5d4f155
--- /dev/null
+++ b/blog/post/2016-02-18.html
@@ -0,0 +1,143 @@
+<html><head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<meta name="theme-color" content="#000000">
+<title>Chrisoft::Blog</title>
+<script type="text/javascript" src="/panel.js"></script>
+<script type="text/javascript" src="/blog/footnoter.js"></script>
+<script type="text/javascript" src="/blog/aes-js.js"></script>
+<script type="text/javascript" src="/blog/scrypt.js"></script>
+<script type="text/javascript" src="/blog/sha256.js"></script>
+<script type="text/javascript" src="/blog/decryptor.js"></script>
+<link rel="stylesheet" type="text/css" href="/common.css">
+<link rel="stylesheet" type="text/css" href="/panel.css">
+<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
+<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
+<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
+<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
+<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
+<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
+<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
+<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
+<link rel="stylesheet" type="text/css" href="/blog/blogext.css">
+<script>
+function ol()
+{
+ window.onresize=function()
+ {
+ if(window.innerWidth<768)
+ setupevents();
+ else unsetevents();
+ }
+ window.onresize();
+ _decryptonload();
+}
+function loadTheme(){
+ var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
+ if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
+ var ent="";
+ var d=new Date();
+ if(thm[0]=='z')
+ {
+ var m=d.getMonth()+1;
+ if(m>=3&&m<6)thm='0'+thm[1];
+ else if(m>=6&&m<9)thm='1'+thm[1];
+ else if(m>=9&&m<12)thm='2'+thm[1];
+ else thm='3'+thm[1];
+ }
+ if(thm[1]=='z')
+ {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
+ ent=`theme${thm}`;
+ var R=new RegExp('theme[0-4][ab]');
+ for(var i=0;i<document.styleSheets.length;++i)
+ {
+ if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
+ document.styleSheets[i].disabled=true;
+ else document.styleSheets[i].disabled=false;
+ }
+ var thmcolor="";
+ switch(thm[0])
+ {
+ case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break;
+ case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break;
+ case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break;
+ case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break;
+ }
+ document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor);
+}
+loadTheme();
+</script>
+</head>
+<body onload="ol()" style="overflow-x:hidden;">
+ <div id="panel" class="TText">
+ <ul id="panellist">
+ <li><a href="/"><h1>Chrisoft</h1></a></li>
+ <li><a href="/blog"><h2>Blog</h2></a></li>
+ <li><a href="#"><h3 id="title">Cross Noodles Recooked</h3></a></li>
+ <li><span>Tags</span>
+ <ul id="tagslist">
+ <li><a href="/blog/list/devel/">devel</a></li><li><a href="/blog/list/js/">js</a></li><li><a href="/blog/list/webgl/">webgl</a></li></ul>
+ </li>
+ <li id="tocouter" style="display: none;">
+ <span>Table of Contents</span>
+ <ul id="tocroot">
+ </ul>
+ </li>
+ <li style="margin-left:-0.5em"><a id="prevp" href="2016-02-14.html">Prev post</a></li>
+ <li style="margin-left:-0.5em"><a id="nextp" href="2016-03-26.html">Next post</a></li>
+ </ul>
+ </div>
+ <div id="content">
+ <h2 id="titleh" class="TText" style="font-wight:normal;">Cross Noodles Recooked</h2>
+ <div id="datetags" class="TText" style="margin-bottom:1em;">2016-02-18<br>#devel #js #webgl</div>
+ <hr><div id="article" class="TText">
+<article>
+<p>
+It's a pure coincidence. Miss Sixty-one made a request for the original Virtools version of "Cross Noodles" yesterday
+but I couldn't find it. However I decided to make a replica because I am fiddling with html5 and javascript these days
+and I am really interested in WebGL. So here is the result:
+</p>
+<a href="//filestorage.chrisoft.org/blog/img/crossnoodlesjs.png">
+<img src="//filestorage.chrisoft.org/blog/img/crossnoodlesjs.png" alt="Cross Noodles JS screenshot" width="50%" style="display:block;margin:auto;" decoding="async">
+</a>
+<span style="display:block;text-align:center;">Cross Noodles JS screenshot</span>
+<p>
+It's pretty awesome, huh? And it runs on mobile platforms, too.
+</p>
+<a href="//filestorage.chrisoft.org/blog/img/cnjsmobile.png">
+<img src="//filestorage.chrisoft.org/blog/img/cnjsmobile.png" alt="Cross Noodles JS screenshot on Galaxy S3" width="50%" style="display:block;margin:auto;" decoding="async">
+</a>
+<span style="display:block;text-align:center;">Cross Noodles JS screenshot on Galaxy S3</span>
+<p>
+Despite being a replica, there are new things in it. Two new modes are added and the game is made more balanced. The new
+version has higher efficiency, wider browser support and improved playability.
+</p>
+<a href="/CrossNoodlesJS">Try it now!
+</a></article><a href="/CrossNoodlesJS">
+</a></div><br><hr>
+ <div class="TText" id="notediv" style="font-size:80%;"></div>
+ <div id="insanch" style="height:3em;"></div>
+ <div id="footer" style="">
+ <div id="pagesw" class="TText" style="width:100%;height:0.5em;"></div>
+ <div style="text-align:center;" class="TText">
+ Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5
+ <br>
+ Content licensed under CC BY-SA 4.0. <span id="purgep" style="display:none;font-size:70%;">This page has passphrase(s) stored. Click <a href="javascript:_purgep()">here</a> to purge.</span>
+ </div>
+ </div>
+ <div id="cmdbuf" class="TText" style="transition:500ms;padding:1em;font-size:2em;color:white;position:absolute;background-color:rgba(0,0,0,0.6);left:50%;top:50%;transform:translate(-50%,-50%);pointer-events:none;opacity:0;">
+ </div>
+ </div>
+ <div id="decryptui" style="display:none;opacity:0;color:white;z-index:1000;position:fixed;left:0;top:0;width:100%;height:100%;background-color:rgba(0,0,0,0.4);transition:opacity 0.5s;">
+ <div id="decryptdlg" class="TText" style="padding:10px 20px;position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);background-color:rgba(0,0,0,0.6);">
+ <div id="keyhint" style="margin-bottom:8px;"></div>
+ <div style="margin-bottom:8px;">Key: <input id="keyinp" type="text" style="color:#fff;"></div>
+ <div style="height:2.25em;">
+ <button id="btndecrypt" onclick="decryptor(decid,document.getElementById('keyinp').value);" style="position:absolute;left:20px;">Decrypt</button>
+ <button onclick="hidedecryptui();" style="position:absolute;right:20px;">Cancel</button>
+ </div>
+
+ </div>
+
+
+</div></body></html> \ No newline at end of file
diff --git a/blog/post/2016-03-26.html b/blog/post/2016-03-26.html
new file mode 100644
index 0000000..20be317
--- /dev/null
+++ b/blog/post/2016-03-26.html
@@ -0,0 +1,151 @@
+<html><head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<meta name="theme-color" content="#000000">
+<title>Chrisoft::Blog</title>
+<script type="text/javascript" src="/panel.js"></script>
+<script type="text/javascript" src="/blog/footnoter.js"></script>
+<script type="text/javascript" src="/blog/aes-js.js"></script>
+<script type="text/javascript" src="/blog/scrypt.js"></script>
+<script type="text/javascript" src="/blog/sha256.js"></script>
+<script type="text/javascript" src="/blog/decryptor.js"></script>
+<link rel="stylesheet" type="text/css" href="/common.css">
+<link rel="stylesheet" type="text/css" href="/panel.css">
+<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
+<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
+<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
+<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
+<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
+<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
+<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
+<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
+<link rel="stylesheet" type="text/css" href="/blog/blogext.css">
+<script>
+function ol()
+{
+ window.onresize=function()
+ {
+ if(window.innerWidth<768)
+ setupevents();
+ else unsetevents();
+ }
+ window.onresize();
+ _decryptonload();
+}
+function loadTheme(){
+ var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
+ if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
+ var ent="";
+ var d=new Date();
+ if(thm[0]=='z')
+ {
+ var m=d.getMonth()+1;
+ if(m>=3&&m<6)thm='0'+thm[1];
+ else if(m>=6&&m<9)thm='1'+thm[1];
+ else if(m>=9&&m<12)thm='2'+thm[1];
+ else thm='3'+thm[1];
+ }
+ if(thm[1]=='z')
+ {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
+ ent=`theme${thm}`;
+ var R=new RegExp('theme[0-4][ab]');
+ for(var i=0;i<document.styleSheets.length;++i)
+ {
+ if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
+ document.styleSheets[i].disabled=true;
+ else document.styleSheets[i].disabled=false;
+ }
+ var thmcolor="";
+ switch(thm[0])
+ {
+ case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break;
+ case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break;
+ case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break;
+ case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break;
+ }
+ document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor);
+}
+loadTheme();
+</script>
+</head>
+<body onload="ol()" style="overflow-x:hidden;">
+ <div id="panel" class="TText">
+ <ul id="panellist">
+ <li><a href="/"><h1>Chrisoft</h1></a></li>
+ <li><a href="/blog"><h2>Blog</h2></a></li>
+ <li><a href="#"><h3 id="title">ACM校赛水题组酱油记</h3></a></li>
+ <li><span>Tags</span>
+ <ul id="tagslist">
+ <li><a href="/blog/list/contest/">contest</a></li><li><a href="/blog/list/acmicpc/">acmicpc</a></li></ul>
+ </li>
+ <li id="tocouter" style="display: none;">
+ <span>Table of Contents</span>
+ <ul id="tocroot">
+ </ul>
+ </li>
+ <li style="margin-left:-0.5em"><a id="prevp" href="2016-02-18.html">Prev post</a></li>
+ <li style="margin-left:-0.5em"><a id="nextp" href="2016-04-09.html">Next post</a></li>
+ </ul>
+ </div>
+ <div id="content">
+ <h2 id="titleh" class="TText" style="font-wight:normal;">ACM校赛水题组酱油记</h2>
+ <div id="datetags" class="TText" style="margin-bottom:1em;">2016-03-26<br>#contest #acmicpc</div>
+ <hr><div id="article" class="TText">
+<article>
+<p>废话少说直接上图(...)</p>
+<img src="//filestorage.chrisoft.org/blog/img/resultnew.png" alt="" width="72%" style="display:block;margin:auto;" decoding="async">
+<p>什么?我在哪个队里?当然是那个没有楼上的队了……(都怪我们队的大神(tui)yxz要取这么一个队名)</p>
+<p>总之,水过去了……</p>
+<p>
+简单写一下题目思路……
+</p><ul>
+ <li>A: 嗯这是个好题(呸)……注意good morningood morning的情况就好了。</li>
+ <li>B: 暴搜(yxz神犇要写非常厉害的状态存储方式……)</li>
+ <li>C: 语文题 模拟……(全场就我们一个队过了这题也是非常奇怪的事情)</li>
+ <li>D: 暴力会T……然后我们很容易能发现加起来的一串数是有周期的 T=lcm(a,b)</li>
+ <li>E: 博弈论 这题应该算是瞎猫撞上死耗子了……puts(!(n&amp;1)&amp;&amp;!(m&amp;1)?"A...":"D...")</li>
+ <li>F: 又是一道语文题 然而其实还是暴力……(Naive的我还以为这题会因为浮点数操作太多而T掉QAQ)</li>
+ <li>G: 这题跟SDTSC 2014 R2某题几乎一样,不过数据比较水,所以也不用什么加了特技的高斯消元,搞出矩阵然后暴力高斯消元就好了(然而最后高斯消元没打出来………瞬间感觉渣爆了)</li>
+ <li>H: 新生组就是这么多暴力题……</li>
+ <li>I: 多边形面积……从一个点切成一堆三角形然后叉积。嗯好高中的东西大概还没忘光</li>
+ <li>J: 这题的关系网其实是一棵树 然后就是类似dp的东西……(然而由于当时意识模糊WA掉了。。。)</li>
+ <li>K: 找a/b的最大值……每次最后一题都一定是水题吗。。。</li>
+</ul>
+<p></p>
+<p><s>听说有学长放言如果有队伍AK就直播日狗,没能满足他的愿望,真是抱歉(……)</s></p>
+<p>
+然后最近其实有点忙,再加上等新笔记本<s>(借口)</s>,所以感觉有些方面还是努力不够……
+</p>
+<p>
+<reduced><s>
+(于是看新笔记本到了之后我又会编出什么新的借口)
+</s></reduced>
+</p>
+</article>
+</div><br><hr>
+ <div class="TText" id="notediv" style="font-size:80%;"></div>
+ <div id="insanch" style="height:3em;"></div>
+ <div id="footer" style="">
+ <div id="pagesw" class="TText" style="width:100%;height:0.5em;"></div>
+ <div style="text-align:center;" class="TText">
+ Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5
+ <br>
+ Content licensed under CC BY-SA 4.0. <span id="purgep" style="display:none;font-size:70%;">This page has passphrase(s) stored. Click <a href="javascript:_purgep()">here</a> to purge.</span>
+ </div>
+ </div>
+ <div id="cmdbuf" class="TText" style="transition:500ms;padding:1em;font-size:2em;color:white;position:absolute;background-color:rgba(0,0,0,0.6);left:50%;top:50%;transform:translate(-50%,-50%);pointer-events:none;opacity:0;">
+ </div>
+ </div>
+ <div id="decryptui" style="display:none;opacity:0;color:white;z-index:1000;position:fixed;left:0;top:0;width:100%;height:100%;background-color:rgba(0,0,0,0.4);transition:opacity 0.5s;">
+ <div id="decryptdlg" class="TText" style="padding:10px 20px;position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);background-color:rgba(0,0,0,0.6);">
+ <div id="keyhint" style="margin-bottom:8px;"></div>
+ <div style="margin-bottom:8px;">Key: <input id="keyinp" type="text" style="color:#fff;"></div>
+ <div style="height:2.25em;">
+ <button id="btndecrypt" onclick="decryptor(decid,document.getElementById('keyinp').value);" style="position:absolute;left:20px;">Decrypt</button>
+ <button onclick="hidedecryptui();" style="position:absolute;right:20px;">Cancel</button>
+ </div>
+
+ </div>
+
+
+</div></body></html> \ No newline at end of file
diff --git a/blog/post/2016-04-09.html b/blog/post/2016-04-09.html
new file mode 100644
index 0000000..56d4aea
--- /dev/null
+++ b/blog/post/2016-04-09.html
@@ -0,0 +1,186 @@
+<html><head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<meta name="theme-color" content="#000000">
+<title>Chrisoft::Blog</title>
+<script type="text/javascript" src="/panel.js"></script>
+<script type="text/javascript" src="/blog/footnoter.js"></script>
+<script type="text/javascript" src="/blog/aes-js.js"></script>
+<script type="text/javascript" src="/blog/scrypt.js"></script>
+<script type="text/javascript" src="/blog/sha256.js"></script>
+<script type="text/javascript" src="/blog/decryptor.js"></script>
+<link rel="stylesheet" type="text/css" href="/common.css">
+<link rel="stylesheet" type="text/css" href="/panel.css">
+<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
+<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
+<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
+<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
+<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
+<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
+<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
+<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
+<link rel="stylesheet" type="text/css" href="/blog/blogext.css">
+<script>
+function ol()
+{
+ window.onresize=function()
+ {
+ if(window.innerWidth<768)
+ setupevents();
+ else unsetevents();
+ }
+ window.onresize();
+ _decryptonload();
+}
+function loadTheme(){
+ var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
+ if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
+ var ent="";
+ var d=new Date();
+ if(thm[0]=='z')
+ {
+ var m=d.getMonth()+1;
+ if(m>=3&&m<6)thm='0'+thm[1];
+ else if(m>=6&&m<9)thm='1'+thm[1];
+ else if(m>=9&&m<12)thm='2'+thm[1];
+ else thm='3'+thm[1];
+ }
+ if(thm[1]=='z')
+ {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
+ ent=`theme${thm}`;
+ var R=new RegExp('theme[0-4][ab]');
+ for(var i=0;i<document.styleSheets.length;++i)
+ {
+ if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
+ document.styleSheets[i].disabled=true;
+ else document.styleSheets[i].disabled=false;
+ }
+ var thmcolor="";
+ switch(thm[0])
+ {
+ case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break;
+ case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break;
+ case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break;
+ case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break;
+ }
+ document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor);
+}
+loadTheme();
+</script>
+</head>
+<body onload="ol()" style="overflow-x:hidden;">
+ <div id="panel" class="TText">
+ <ul id="panellist">
+ <li><a href="/"><h1>Chrisoft</h1></a></li>
+ <li><a href="/blog"><h2>Blog</h2></a></li>
+ <li><a href="#"><h3 id="title">The MIDI File Format Specification and MIDI Implementation in QMidiPlayer</h3></a></li>
+ <li><span>Tags</span>
+ <ul id="tagslist">
+ <li><a href="/blog/list/devel/">devel</a></li><li><a href="/blog/list/qmidiplayer/">qmidiplayer</a></li><li><a href="/blog/list/midi/">midi</a></li></ul>
+ </li>
+ <li id="tocouter">
+ <span>Table of Contents</span>
+ <ul id="tocroot">
+ <li><a class="toctarg" href="#tocanch0">Abstract</a></li><li><a class="toctarg" href="#tocanch1"></a></li></ul>
+ </li>
+ <li style="margin-left:-0.5em"><a id="prevp" href="2016-03-26.html">Prev post</a></li>
+ <li style="margin-left:-0.5em"><a id="nextp" href="2016-05-12.html">Next post</a></li>
+ </ul>
+ </div>
+ <div id="content">
+ <h2 id="titleh" class="TText" style="font-wight:normal;">The MIDI File Format Specification and MIDI Implementation in QMidiPlayer</h2>
+ <div id="datetags" class="TText" style="margin-bottom:1em;">2016-04-09<br>#devel #qmidiplayer #midi</div>
+ <hr><div id="article" class="TText">
+<article>
+<style>
+article h2,article h3{border-bottom:1px solid #c0c0c0;overflow:hidden;}
+</style>
+
+<h2 id="tocanch0" class="tvis">Abstract</h2>
+<p>
+This article is intended to be a reliable MIDI file format and implementation reference.
+It takes QMidiPlayer as an example to illustrate how a basic software-based MIDI implementation works.
+For the Chinese version, please visit &lt;Chinese version link here&gt;.
+</p>
+
+<div style="padding:7px;border:1px solid #aaa;display:table;">
+<div style="text-align:center;">
+<b>Contents</b> [<a href="#" onclick="var e=document.getElementById(&quot;toc&quot;);if(e.style.display==&quot;block&quot;){e.style.display=&quot;none&quot;;this.innerHTML=&quot;show&quot;;}else {e.style.display=&quot;block&quot;;this.innerHTML=&quot;hide&quot;;}">hide</a>]
+</div>
+<style scoped="">
+ul{list-style-type:none;}
+</style>
+<ul style="font-size:0.9em;display:block;" id="toc">
+ <li>1 Data Representations
+ <ul>
+ <li>1.1 Binary values</li>
+ <li>1.2 Variable length values</li>
+ </ul>
+ </li>
+ <li>2 Chunks
+ <ul>
+ <li>2.1 Header chunk</li>
+ <li>2.2 Track chunks</li>
+ </ul>
+ </li>
+ <li>3 Events
+ <ul>
+ <li>3.1 MIDI events
+ <ul>
+ <li>3.1.1 Running status</li>
+ </ul>
+ </li>
+ <li>3.2 Meta events</li>
+ <li>3.3 SysEx events</li>
+ </ul>
+ </li>
+ <li>4 Common MIDI Implementations
+ <ul>
+ <li>4.1 Pre-GM</li>
+ <li>4.2 GM</li>
+ <li>4.3 GS</li>
+ <li>4.4 XG</li>
+ <li>4.5 GM2</li>
+ </ul>
+ </li>
+ <li>5 Implementation details in QMidiPlayer</li>
+ <li>6 Appendix
+ <ul>
+ <li>6.1 List of known SysEx's</li>
+ <li>6.2 Instrument list</li>
+ <li>6.3 MIDI Effects</li>
+ </ul>
+ </li>
+ <li>7 References</li>
+</ul>
+</div>
+
+<h2 id="tocanch1" class="tvis"></h2>
+<article>
+</article></article></div><br><hr>
+ <div class="TText" id="notediv" style="font-size:80%;"></div>
+ <div id="insanch" style="height:3em;"></div>
+ <div id="footer" style="">
+ <div id="pagesw" class="TText" style="width:100%;height:0.5em;"></div>
+ <div style="text-align:center;" class="TText">
+ Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5
+ <br>
+ Content licensed under CC BY-SA 4.0. <span id="purgep" style="display:none;font-size:70%;">This page has passphrase(s) stored. Click <a href="javascript:_purgep()">here</a> to purge.</span>
+ </div>
+ </div>
+ <div id="cmdbuf" class="TText" style="transition:500ms;padding:1em;font-size:2em;color:white;position:absolute;background-color:rgba(0,0,0,0.6);left:50%;top:50%;transform:translate(-50%,-50%);pointer-events:none;opacity:0;">
+ </div>
+ </div>
+ <div id="decryptui" style="display:none;opacity:0;color:white;z-index:1000;position:fixed;left:0;top:0;width:100%;height:100%;background-color:rgba(0,0,0,0.4);transition:opacity 0.5s;">
+ <div id="decryptdlg" class="TText" style="padding:10px 20px;position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);background-color:rgba(0,0,0,0.6);">
+ <div id="keyhint" style="margin-bottom:8px;"></div>
+ <div style="margin-bottom:8px;">Key: <input id="keyinp" type="text" style="color:#fff;"></div>
+ <div style="height:2.25em;">
+ <button id="btndecrypt" onclick="decryptor(decid,document.getElementById('keyinp').value);" style="position:absolute;left:20px;">Decrypt</button>
+ <button onclick="hidedecryptui();" style="position:absolute;right:20px;">Cancel</button>
+ </div>
+
+ </div>
+
+
+</div></body></html> \ No newline at end of file
diff --git a/blog/post/2016-05-12.html b/blog/post/2016-05-12.html
new file mode 100644
index 0000000..37be45a
--- /dev/null
+++ b/blog/post/2016-05-12.html
@@ -0,0 +1,406 @@
+<html><head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<meta name="theme-color" content="#000000">
+<title>Chrisoft::Blog</title>
+<script type="text/javascript" src="/panel.js"></script>
+<script type="text/javascript" src="/blog/footnoter.js"></script>
+<script type="text/javascript" src="/blog/aes-js.js"></script>
+<script type="text/javascript" src="/blog/scrypt.js"></script>
+<script type="text/javascript" src="/blog/sha256.js"></script>
+<script type="text/javascript" src="/blog/decryptor.js"></script>
+<link rel="stylesheet" type="text/css" href="/common.css">
+<link rel="stylesheet" type="text/css" href="/panel.css">
+<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
+<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
+<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
+<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
+<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
+<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
+<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
+<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
+<link rel="stylesheet" type="text/css" href="/blog/blogext.css">
+<script>
+function ol()
+{
+ window.onresize=function()
+ {
+ if(window.innerWidth<768)
+ setupevents();
+ else unsetevents();
+ }
+ window.onresize();
+ _decryptonload();
+}
+function loadTheme(){
+ var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
+ if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
+ var ent="";
+ var d=new Date();
+ if(thm[0]=='z')
+ {
+ var m=d.getMonth()+1;
+ if(m>=3&&m<6)thm='0'+thm[1];
+ else if(m>=6&&m<9)thm='1'+thm[1];
+ else if(m>=9&&m<12)thm='2'+thm[1];
+ else thm='3'+thm[1];
+ }
+ if(thm[1]=='z')
+ {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
+ ent=`theme${thm}`;
+ var R=new RegExp('theme[0-4][ab]');
+ for(var i=0;i<document.styleSheets.length;++i)
+ {
+ if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
+ document.styleSheets[i].disabled=true;
+ else document.styleSheets[i].disabled=false;
+ }
+ var thmcolor="";
+ switch(thm[0])
+ {
+ case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break;
+ case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break;
+ case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break;
+ case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break;
+ }
+ document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor);
+}
+loadTheme();
+</script>
+</head>
+<body onload="ol()" style="overflow-x:hidden;">
+ <div id="panel" class="TText">
+ <ul id="panellist">
+ <li><a href="/"><h1>Chrisoft</h1></a></li>
+ <li><a href="/blog"><h2>Blog</h2></a></li>
+ <li><a href="#"><h3 id="title">ThinkPad X1 Yoga初体验</h3></a></li>
+ <li><span>Tags</span>
+ <ul id="tagslist">
+ <li><a href="/blog/list/device-review/">device-review</a></li></ul>
+ </li>
+ <li id="tocouter">
+ <span>Table of Contents</span>
+ <ul id="tocroot">
+ <li><a class="toctarg" href="#tocanch0">我为什么选择X1 Yoga</a></li><li><a class="toctarg" href="#tocanch1">我拿到的机型的配置</a></li><li><a class="toctarg" href="#tocanch2">初次见面</a></li><li><a class="toctarg" href="#tocanch3">安装Arch Linux</a></li><li><a class="toctarg" href="#tocanch4">Random comments on this laptop</a></li></ul>
+ </li>
+ <li style="margin-left:-0.5em"><a id="prevp" href="2016-04-09.html">Prev post</a></li>
+ <li style="margin-left:-0.5em"><a id="nextp" href="2016-06-21.html">Next post</a></li>
+ </ul>
+ </div>
+ <div id="content">
+ <h2 id="titleh" class="TText" style="font-wight:normal;">ThinkPad X1 Yoga初体验</h2>
+ <div id="datetags" class="TText" style="margin-bottom:1em;">2016-05-12<br>#device-review</div>
+ <hr><div id="article" class="TText">
+<article>
+<p>
+4天前,期望已久的ThinkPad终于拿到手了。说起这个大件,其实是2月份就看中了。
+然后3月初联系了在美国的亲戚购买,到5月8号拿到手。中间还经历了N次立「马上就能拿到新机了!」
+的flag然后秒收的事情。不过最后总算还是拿到了。。。
+</p>
+
+<h3 id="tocanch0" class="tvis">我为什么选择X1 Yoga</h3>
+<p>
+2016年寒假开始之前我有一种比较模糊的想(从美国)买新笔记本的想法。当时预选的机型是ThinkPad
+X1 Carbon和ThinkPad P50(虽然更早的时候有考虑过Mac Book Pro,但是后来感觉用不起……)。
+后来放弃了P50,因为感觉自己可能需要一台更侧重便携性的机型。然后就剩下X1 Carbon了。这时,
+第一代X1 Yoga出现在了我的视野中。看到加个100刀就能买到一台带笔的2 in 1我当时也是相当心动的。
+再加上后来联想迟迟不在美国发售搭载skylake CPU的第四代X1 Carbon而同样搭载6代core i CPU的X1
+Yoga已经开卖,我就<s>一狠心</s>购买了2000刀的顶配X1 Yoga。后来一看X1
+Carbon在美国上市的时候发现前代有的触摸屏被砍掉了,我感觉我做的选择还是正确的。
+</p>
+至于为什么选择联想/ThinkPad,我想这大概属于信仰问题的范畴,这里就不再多说了。
+
+<h3 id="tocanch1" class="tvis">我拿到的机型的配置</h3>
+<ul>
+ <li>CPU: i7-6600U</li>
+ <li>GPU: intel HD 520</li>
+ <li>RAM: Samsung 16GB (2x8GB) DDR3 1867MHz</li>
+ <li>SSD: Samsung NVMe 512GB</li>
+ <li>Input: Wacom touchscreen/digitizer, UltraNav, Synaptics(Validity) fingerprint reader</li>
+ <li>Display: 14' WQHD 2560x1440</li>
+ <li>OS: Windows 10 Pro</li>
+</ul>
+<p>
+ 比较遗憾的是这台机器没有使用搭载Intel Iris Graphics 540的i7-6660U或者i7-6650U。
+(从intel ark来看,它们的价格只比i7-6600U高22美元。。。<s>某想:学霸机用什么iris显卡</s>)
+</p>
+<p>
+ 因为基本是一开卖就订的货,当时并没有配备移动数据模块。所以后面的那个SIM卡槽目前就只能当摆设了。。。
+</p>
+<p>
+ 顺带一提,国内没有这个配置的卖(联想在国内似乎不提供网页上的定制服务)。国内的低一档的版本要
+12999元(i7-6500U, 8G RAM, 256G SATA SSD, W10 Home)。在美国购买上面的配置税后价格2100美元。
+此时的汇率大概在1:6.49左右。
+</p>
+
+<h3 id="tocanch2" class="tvis">初次见面</h3>
+<p>
+X1 Yoga的包装盒可以称得上是简洁而精美。大概是有一种机器被两片纸板盖住,
+然后掀起纸板机器自动升起的结构,看起来感觉很厉害的样子。盒子里面只有三样东西:机器本体,
+电源适配器和一张纸(设置指南+保修信息+安全提示)。不出意料的是这些东西全部来自中国。
+</p>
+
+<p>
+开机经过简单的设置之后就看到了既熟悉又陌生的Windows 10的界面(因为我在微软发布Windows 10
+之前就将日常工作完全迁移到了linux下进行了)。用惯了debian的我一时间竟然不知道这系统能做什么事情了。
+打开设备管理器然后在里面随便乱看了看,然后找了个测SSD速度的软件测了下速。发现连续读取居然达到了
+2.4GB/s。(果然时代不同了...) 512GB的硬盘Windows下显示可用475.69GB,Windows吃掉24GB之后
+还有450GB左右,还算可以吧(Windows的体积越来越大了。。。)。
+</p>
+
+<p>
+因为不知道做什么所以后面就开始感受windows 10的触屏体验了。虽然我经常说windows是辣鸡操作系统,
+但是讲道理的话windows 10的触屏体验还是极佳的。毕竟<s>老板</s>微软还是向里面倾注了相当多的心血的。
+</p>
+
+<p>
+系统默认的缩放比例是200%。像我这个第一次碰非手持式高分辨率设备的怎么能忍受高分屏被这样地浪费掉,
+于是我把缩放比例调到了150%。(大概默认的200%是考虑到触摸操作情况下字大些比较好)
+</p>
+
+<h3 id="tocanch3" class="tvis">安装Arch Linux</h3>
+<p>
+大概是因为机器太新,我在这台机器上安装Arch Linux的时候遇到了不少麻烦……
+</p>
+<p>
+本来以为在这台机器上安装Arch Linux就跟在老机器上一样简单。于是就用道听途说的方法关闭了<s>Restricted</s> Secure boot,dd出来一张arch启动盘然后插上去从那张盘启动。
+结果选择arch linux dual iso之后直接黑屏,CPU风扇狂转……
+</p>
+<p>
+后来我换了Debian live的镜像,发现可以启动起来。于是我就想先把系统bootstrap起来好了。
+所以就开始在debian里面bootstrap Arch Linux。但是由于Debian live是从BIOS模式启动起来的,所以GRUB安装失败了。
+然后我就又搞了一张支持UEFI启动的ubuntu live来安装GRUB。整个过程看起来似乎非常成功。结果启动进GRUB之后屏幕只有以下这几行:
+</p><pre>Welcome to GRUB!
+error: disk `' not found
+Entering rescue mode...
+grub rescue&gt; _
+</pre>
+ls的结果有一个(hd0),ls (hd0)的结果是unknown file system。UEFI经验几乎为零的我只好又向google求救。
+结果是Arch Linux里面的GRUB版本还不支持NVMe的SSD。于是我就不得不选择通过EFIStub来直接引导内核了。
+于是装了一个EFI Shell,开始试验如何科学地引导内核。只加root=和initrd=直接跪掉了,现象和arch安装盘无法引导的现象一模一样。
+遂上google搜索解决方案。搜到最多的结果是关闭acpi(acpi=off)和关闭Kernel mode setting (nomodeset i915.modeset=0)。
+然而这两个内核选项都没起到什么作用(acpi=off能让内核启动起来但是在加载intel hd audio驱动时会出一个Kernel Oops然后就卡住了,
+而nomodeset完全没有作用)。于是我就不得不试着搜一下在同机型上安装Linux的经验,然后就搜到了<a href="https://wiki.archlinux.org/index.php/Lenovo_Thinkpad_Yoga_260">这个</a>——
+使用同代CPU,配置几乎相同的ThinkPad Yoga 260。这里面说要想启动需要加这个内核参数:intel_pstate=no_hwp。
+于是我就「抱着试一试的心态」试了一发。结果果然启动成功了……<a id="n1" href="#note1" class="note">[1]</a>
+<p></p>
+<p>
+现在内核启动成功了,大概就可以开始试图添加efi启动项了。bcfg添加启动项成功,添加内核参数却总是失败(原因不明的Invalid arguments)。
+然后又试了试换到arch里面用efibootmgr添加efi项,结果发现不管怎么弄添加出来的项目的磁盘UUID都是0。
+(大概跟<a href="https://github.com/rhinstaller/efibootmgr/issues/4">一个efibootmgr中和NVMe硬盘的bug</a>有关,然而这个bug已经是两年之前的了,也许不是同一个bug)。后来我还试了bcfg添加启动项,efibootmgr添加内核参数,但是总是不成功。
+这是时间已经到了凌晨00:30,此时我却突发奇想要试一下ubuntu里面的efibootmgr。结果是ubuntu里面的efibootmgr添加成功了!
+白费了我试各种添加启动项方法的一个半小时……
+</p>
+<p>
+进入系统之后发现触摸屏和笔无法使用,其他常用功能都基本正常。于是又去google这个问题。查到的临时解决方案是刷一个触摸屏固件然后reset一发。
+长期方案是使用4.6-RC4以上的内核和0.32以上的wacom x11驱动。照做之后,一切正常。
+</p>
+<p>
+然后可以谈谈Linux下的使用体验了。
+</p>
+<p>
+首先先提一句,读完这里你有可能以为我在运行桌面环境期间没遇到什么大问题。但事实恰恰相反:我<s>身经百战</s>已经习惯一天不崩溃就不正常的Debian sid里面的KDE Plasma5,所以说<s>见得多</s>不会对那些日常崩溃大惊小怪了而已。。。
+</p>
+<p>
+因为我长期以来认为GNOME3是专门为触摸体验优化过的桌面环境,所以我先安装了GNOME3。
+GNOME3现在是一个特技非常多,但可调整的选项相对较少的桌面环境。虽然触摸体验当然不如Windows10强,但是也是相当不错的。顺带提一句,
+我在桌面电脑上使用GNOME3的时候习惯使用两个GNOME3的扩展:Dash to dock和Hide top bar。事实证明这两个扩展并不是非常适合触屏环境
+(无法使用触摸手势调出隐藏的顶栏或者dock)。<br>
+比较尴尬的是GNOME3的缩放比例只能是整数而且在GUI里面只能调成1或者2……<br>
+而Qt5(Plasma 5)的情况则比较惨烈。大部分界面(其实就是用传统Qt Widgets实现的部分)完全不支持反方向滚动和多点触控不说,高DPI缩放还只放大文字不放大图标。
+QML的部分则还好。然而现在用QML的做界面的Qt程序还是太少了。<br>
+补:现在我又把plasma5作为了我的主要桌面环境。然后还是发现了一坨问题:
+</p><ul>
+<li>有些Gtk+ 2程序能够正常缩放(比如geany),有些则不能(GIMP)。</li>
+<li>Qt4太惨了,不说了(缩放按钮文字不缩放按钮是什么情况?)。</li>
+<li>当时版本的Chrome需要打开Material design in the browser's top chrome这个选项才能变得对触屏友好,现在似乎不需要了。</li>
+</ul>
+<p></p>
+<h3 id="tocanch4" class="tvis">Random comments on this laptop</h3>
+由于联想众所周知的坑爹特性,各位实际拿到机器质量参差不齐。我算是运气比较好每次拿到的都不是次品的,所以以下内容仅供参考。<br>
+另外,下面主要是负面评价。正面评价的话联想官网上面已经吹的够多了就不用我再说了。。。
+<ul>
+<li>
+Yoga系列的转轴仍然是个问题<br>
+从外观上看,X1 Yoga 1st Gen.仍然采用的是类似初代Ideapad Yoga的转轴。虽然可靠性暂时没有什么可质疑的,但是在所谓的「站立模式」
+下,一戳屏幕就会晃,令人不爽。Yoga 900换了类似表链的转轴,不知道这方面有没有改进。
+</li>
+<li>
+屏幕<br>
+X1 Yoga似乎是第一台有采用OLED屏幕型号的笔记本。然而又是因为买的太早,我拿到的是用IPS屏的版本。
+这个屏幕在室内用调到最高亮度有点太亮,室外的话又看不太清……这个就比较尴尬了。另外光线传感器在Linux下不可用(或者是我没找到可以让它工作的正确姿势)。
+</li>
+<li>
+外壳<br>
+碳纤维的外壳是完美的指纹收集器。然后对像我这样的强迫症患者来说这简直就是灾难。
+当然黑色外壳上如果落了任何灰都是十分明显的。所以说……
+</li>
+<li>
+小红点/指点杆<br>
+其实我买ThinkPad有一部分原因是朝着这个小红点来的。毕竟是个几乎不用动手就能让鼠标跑遍全屏的指点设备。
+再加上几年老ThinkPad R52的使用经历,我用小红点可以说是相当习惯了。然而X1 Yoga上的小红点默认速度出奇得慢。另外就是小红点太容易脏了。。。
+</li>
+<li>
+指纹识别<br>
+2016年发布的ThinkPad几乎全部使用了与旧代ThinkPad不同的指纹识别模块,其更接近于现在手机上的指纹识别模块。
+然而,带来的问题是linux下并不能使用指纹识别。<br>
+lsusb结果如下:
+<pre>Bus 001 Device 005: ID 138a:0090 Validity Sensors, Inc.
+</pre>
+<a href="https://bugs.freedesktop.org/show_bug.cgi?id=94536">libfprint上对应的bug report</a><br>
+在Windows下用的感觉是识别率还可以。然而手上有水的时候识别率就会大幅度下降,这对我这种手汗多的用户来说无疑是一个坏消息。。。<br>
+UPD 2016-10-11: 似乎到现在联想内部的人除了问了一下synaptics他们有没有Linux驱动并回答「否」之外,并没有对解决这个问题作出任何贡献……然而根据小道消息
+synaptics正在开发一个Linux用的闭源驱动程序。。。虽然没有ETA但是总比没有驱动强。
+</li>
+<li>
+温度、散热和性能<br>
+我的这台X1 Yoga非常完美地继承了上台ThinkPad R52散热辣鸡的特性。当时编译内核的时候(那时用的还是电池,单线程编译),温度直逼70℃。<br>
+另外,奇葩的散热孔位置导致使用「站立模式」和「平板模式」时不能进行负载大的工作,否则热风直接吹到手上……(图见下)<br>
+平常时一般40℃~45℃左右(额……环境温度是四大火炉之一济南夏天的温度,所以还说得过去)。<br>
+然后在下面的图中还可以看到令人感动的铜管和风扇。(感觉这个铜管跟风扇省得简直可以跟某船早期产品媲美,当然我这是低压U,人家那却是高压四核i7,不烧才怪。)<br>
+至于性能嘛……因为是一颗低压U,也就不用期望太高了是吧。四线程编译Linux 4.3用时302秒。作为对比,旧笔记本上的未超频i7-2960XM八线程编译用了117秒。即使后者也用四线程来编译,差距还是有的。
+如果拿实际应用情形来说的话,i7-6600U的性能还勉强够用。开DAW堆个30来个合成器还是带得动的。(就是混音的时候温度会很高,能到70℃以上)<br>
+至于显卡,本来没报多大希望,因为是HD 520。然而装上我的魔改版Compiz之后却发现这显卡还是可以的,2k屏Compiz打开各种常用功能还能稳60fps,i7-2960XM上的HD 3000到1080P屏幕上就开始卡了……(HD 3000都是多老的东西了....)
+</li>
+<li>
+电池<br>
+联想官方声称电池能用11个小时。然而我还没有能达到过这个数字。目前把电量用到最低的时候就一次:某次切比赛4个半小时高强度工作<s>(打表)</s>用到27%。
+不过那次是在Windows下。在Linux下的时候就算把它满电放在那也从来没有显示过电池剩余10小时以上过,甚至是不开X只用tty的时候。(我的旧笔记本去年这时候电池损耗显示50%在tty下还能撑7个小时呢……)
+</li>
+<li><s>联想的新logo太丑啦</s></li>
+</ul>
+下面给出几个可供同型号/类似型号机型参考的链接:
+<ul>
+<li><a href="https://www.reddit.com/r/thinkpad/comments/45fbv5/comments_on_ubuntu_on_the_x1_yoga/">A Reddit thread about the X1 Yoga</a></li>
+<li><a href="https://wiki.archlinux.org/index.php/Lenovo_Thinkpad_Yoga_260">ThinkPad Yoga 260 on Arch Wiki</a></li>
+<li><a href="https://blog.phoenixlzx.com/2015/12/28/returning-to-archlinux-with-thinkpad-x1-carbon-2015/">某触关于X1 Carbon 3rd Gen.的文章</a> X1 Carbon 3rd Gen.跟X1 Carbon 4th Gen./X1 Yoga 1st Gen.还是有些差别的,所以仅供参考。</li>
+<li><a href="https://bugzilla.kernel.org/show_bug.cgi?id=110941">关于Linux内核中跟hwp有关bug的信息</a></li>
+</ul>
+<p>
+补记于20160713: jx老板要买笔记本问清洁工有没有什么建议,在调查了Dell XPS, ThinkPad X1 Carbon, Surface Pro, hp Spectre之后跟老板提了ThinkPad X1 yoga。然后就把本来无触屏/笔需求的老板骗上了ThinkPad X1 yoga的不归路。老板已于昨日剁手。清洁工获得精英阶级机友*1。
+</p>
+<p>
+UPD: 20161011: 8月底还是没忍住剁了一片WWAN卡(因为没钱所以买的是华为ME906s)。然后在新学期开学时装作新生办了张联通28元套餐卡。
+测速结果还是相当感人的(Rx ~100Mbps Tx 50+Mbps然而不知道为什么上传测试总是无法完成,最后平均速度不断往下掉)。尴尬的是在Linux下只能收发短信,
+无法用(或者我没搞成)NetworkManager+ModemManager联网……于是这个功能又变成Windows only的了。。。
+</p>
+下面是各种图片
+<table style="max-width:90%;margin:auto;">
+<tbody><tr>
+<td>
+<a href="//filestorage.chrisoft.org/blog/img/x1_1.jpg"><img src="//filestorage.chrisoft.org/blog/img/x1_1.jpg" width="50%" decoding="async"></a><br>
+包装盒外部<br>
+</td>
+<td>
+<a href="//filestorage.chrisoft.org/blog/img/x1_2.jpg"><img src="//filestorage.chrisoft.org/blog/img/x1_2.jpg" width="50%" decoding="async"></a><br>
+包装盒拿掉顶盖<br>
+</td>
+</tr>
+<tr>
+<td>
+<a href="//filestorage.chrisoft.org/blog/img/x1_3.jpg"><img src="//filestorage.chrisoft.org/blog/img/x1_3.jpg" width="50%" decoding="async"></a><br>
+还是包装盒……<br>
+</td>
+<td>
+<a href="//filestorage.chrisoft.org/blog/img/x1_4.jpg"><img src="//filestorage.chrisoft.org/blog/img/x1_4.jpg" width="50%" decoding="async"></a><br>
+<br>
+</td>
+</tr>
+<tr>
+<td>
+<a href="//filestorage.chrisoft.org/blog/img/x1_5.jpg"><img src="//filestorage.chrisoft.org/blog/img/x1_5.jpg" width="50%" decoding="async"></a><br>
+稍微侧过来一点……<br>
+</td>
+<td>
+<a href="//filestorage.chrisoft.org/blog/img/x1_6.jpg"><img src="//filestorage.chrisoft.org/blog/img/x1_6.jpg" width="50%" decoding="async"></a><br>
+「帐幕模式」<br>
+</td>
+</tr>
+<tr>
+<td>
+<a href="//filestorage.chrisoft.org/blog/img/x1_7.jpg"><img src="//filestorage.chrisoft.org/blog/img/x1_7.jpg" width="50%" decoding="async"></a><br>
+平板模式<br>
+</td>
+<td>
+<a href="//filestorage.chrisoft.org/blog/img/x1_8.jpg"><img src="//filestorage.chrisoft.org/blog/img/x1_8.jpg" width="50%" decoding="async"></a><br>
+奇葩的出风口位置<br>
+</td>
+</tr>
+<tr>
+<td>
+<a href="//filestorage.chrisoft.org/blog/img/x1_9.jpg"><img src="//filestorage.chrisoft.org/blog/img/x1_9.jpg" width="50%" decoding="async"></a><br>
+一侧的接口<br>
+</td>
+<td>
+<a href="//filestorage.chrisoft.org/blog/img/x1_10.jpg"><img src="//filestorage.chrisoft.org/blog/img/x1_10.jpg" width="50%" decoding="async"></a><br>
+另一侧的接口<br>
+</td>
+</tr>
+<tr>
+<td>
+<a href="//filestorage.chrisoft.org/blog/img/x1yogaarch0.png"><img src="//filestorage.chrisoft.org/blog/img/x1yogaarch0.png" width="50%" decoding="async"></a><br>
+Arch Linux GNOME3截图
+</td>
+<td>
+<a href="//filestorage.chrisoft.org/blog/img/x1yogaarch.png"><img src="//filestorage.chrisoft.org/blog/img/x1yogaarch.png" width="50%" decoding="async"></a><br>
+Arch Linux Plasma5的截图
+</td>
+</tr>
+<tr>
+<td>
+<a href="//filestorage.chrisoft.org/blog/img/x1yogaw10.png"><img src="//filestorage.chrisoft.org/blog/img/x1yogaw10.png" width="50%" decoding="async"></a><br>
+Windows 10下的截图
+</td>
+<td>
+<a href="//filestorage.chrisoft.org/blog/img/x1yogaopened.jpg"><img src="//filestorage.chrisoft.org/blog/img/x1yogaopened.jpg" width="50%" decoding="async"></a><br>
+拆机图——背面概览
+</td>
+</tr>
+<tr>
+<td>
+<a href="//filestorage.chrisoft.org/blog/img/x1yogathermal.jpg"><img src="//filestorage.chrisoft.org/blog/img/x1yogathermal.jpg" width="50%" decoding="async"></a><br>
+铜管、风扇和CPU
+</td>
+<td>
+<a href="//filestorage.chrisoft.org/blog/img/x1yogassd.jpg"><img src="//filestorage.chrisoft.org/blog/img/x1yogassd.jpg" width="50%" decoding="async"></a><br>
+Samsung PCIe NVMe SSD
+</td>
+</tr>
+<tr>
+<td>
+<a href="//filestorage.chrisoft.org/blog/img/x1ltespeedtest.png"><img src="//filestorage.chrisoft.org/blog/img/x1ltespeedtest.png" width="50%" decoding="async"></a><br>
+ME906s LTE模块速度测试
+</td>
+<td>
+&nbsp;
+</td>
+</tr>
+</tbody></table>
+</article>
+</div><br><hr>
+ <div class="TText" id="notediv" style="font-size:80%;"><span class="TText"><a id="note1" href="#n1">[1]</a>: 该bug在linux 4.6 RC-2中已经得到了修复。现在在skylake平台CPU上不再需要intel_pstate=no_hwp这个参数了。<br></span></div>
+ <div id="insanch" style="height:3em;"></div>
+ <div id="footer" style="">
+ <div id="pagesw" class="TText" style="width:100%;height:0.5em;"></div>
+ <div style="text-align:center;" class="TText">
+ Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5
+ <br>
+ Content licensed under CC BY-SA 4.0. <span id="purgep" style="display:none;font-size:70%;">This page has passphrase(s) stored. Click <a href="javascript:_purgep()">here</a> to purge.</span>
+ </div>
+ </div>
+ <div id="cmdbuf" class="TText" style="transition:500ms;padding:1em;font-size:2em;color:white;position:absolute;background-color:rgba(0,0,0,0.6);left:50%;top:50%;transform:translate(-50%,-50%);pointer-events:none;opacity:0;">
+ </div>
+ </div>
+ <div id="decryptui" style="display:none;opacity:0;color:white;z-index:1000;position:fixed;left:0;top:0;width:100%;height:100%;background-color:rgba(0,0,0,0.4);transition:opacity 0.5s;">
+ <div id="decryptdlg" class="TText" style="padding:10px 20px;position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);background-color:rgba(0,0,0,0.6);">
+ <div id="keyhint" style="margin-bottom:8px;"></div>
+ <div style="margin-bottom:8px;">Key: <input id="keyinp" type="text" style="color:#fff;"></div>
+ <div style="height:2.25em;">
+ <button id="btndecrypt" onclick="decryptor(decid,document.getElementById('keyinp').value);" style="position:absolute;left:20px;">Decrypt</button>
+ <button onclick="hidedecryptui();" style="position:absolute;right:20px;">Cancel</button>
+ </div>
+
+ </div>
+
+
+</div></body></html> \ No newline at end of file
diff --git a/blog/post/2016-06-21.html b/blog/post/2016-06-21.html
new file mode 100644
index 0000000..b3fea73
--- /dev/null
+++ b/blog/post/2016-06-21.html
@@ -0,0 +1,703 @@
+<html><head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<meta name="theme-color" content="#000000">
+<title>Chrisoft::Blog</title>
+<script type="text/javascript" src="/panel.js"></script>
+<script type="text/javascript" src="/blog/footnoter.js"></script>
+<script type="text/javascript" src="/blog/aes-js.js"></script>
+<script type="text/javascript" src="/blog/scrypt.js"></script>
+<script type="text/javascript" src="/blog/sha256.js"></script>
+<script type="text/javascript" src="/blog/decryptor.js"></script>
+<link rel="stylesheet" type="text/css" href="/common.css">
+<link rel="stylesheet" type="text/css" href="/panel.css">
+<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
+<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
+<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
+<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
+<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
+<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
+<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
+<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
+<link rel="stylesheet" type="text/css" href="/blog/blogext.css">
+<script>
+function ol()
+{
+ window.onresize=function()
+ {
+ if(window.innerWidth<768)
+ setupevents();
+ else unsetevents();
+ }
+ window.onresize();
+ _decryptonload();
+}
+function loadTheme(){
+ var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
+ if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
+ var ent="";
+ var d=new Date();
+ if(thm[0]=='z')
+ {
+ var m=d.getMonth()+1;
+ if(m>=3&&m<6)thm='0'+thm[1];
+ else if(m>=6&&m<9)thm='1'+thm[1];
+ else if(m>=9&&m<12)thm='2'+thm[1];
+ else thm='3'+thm[1];
+ }
+ if(thm[1]=='z')
+ {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
+ ent=`theme${thm}`;
+ var R=new RegExp('theme[0-4][ab]');
+ for(var i=0;i<document.styleSheets.length;++i)
+ {
+ if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
+ document.styleSheets[i].disabled=true;
+ else document.styleSheets[i].disabled=false;
+ }
+ var thmcolor="";
+ switch(thm[0])
+ {
+ case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break;
+ case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break;
+ case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break;
+ case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break;
+ }
+ document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor);
+}
+loadTheme();
+</script>
+</head>
+<body onload="ol()" style="overflow-x:hidden;">
+ <div id="panel" class="TText">
+ <ul id="panellist">
+ <li><a href="/"><h1>Chrisoft</h1></a></li>
+ <li><a href="/blog"><h2>Blog</h2></a></li>
+ <li><a href="#"><h3 id="title">Trash dump for the first academic year</h3></a></li>
+ <li><span>Tags</span>
+ <ul id="tagslist">
+ <li><a href="/blog/list/garbage/">garbage</a></li><li><a href="/blog/list/daily-life/">daily-life</a></li></ul>
+ </li>
+ <li id="tocouter">
+ <span>Table of Contents</span>
+ <ul id="tocroot">
+ <li><a class="toctarg" href="#tocanch0">课程相关</a></li><li><ul class="tocnode"><li><a class="toctarg" href="#tocanch1">关于这学期的「高级程序设计语言」</a></li></ul></li><li><a class="toctarg" href="#tocanch2">ACM相关</a></li><li><ul class="tocnode"><li><a class="toctarg" href="#tocanch3">省赛</a></li><li><a class="toctarg" href="#tocanch4">暑期集训</a></li><li><ul class="tocnode"><li><a class="toctarg" href="#tocanch5">Codeforces</a></li><li><a class="toctarg" href="#tocanch6">多校联合</a></li><li><a class="toctarg" href="#tocanch7">自己的能力有何长进?</a></li></ul></li></ul></li><li><a class="toctarg" href="#tocanch8">其他乱七八糟的事情</a></li><li><ul class="tocnode"><li><a class="toctarg" href="#tocanch9">关于我的兴趣爱好</a></li><li><ul class="tocnode"><li><a class="toctarg" href="#tocanch10">有关游戏</a></li><li><ul class="tocnode"><li><a class="toctarg" href="#tocanch11">Portal 1&amp;2</a></li><li><a class="toctarg" href="#tocanch12">「真正的」解谜类游戏</a></li><li><a class="toctarg" href="#tocanch13">平台类游戏</a></li><li><a class="toctarg" href="#tocanch14">STG</a></li></ul></li></ul></li><li><a class="toctarg" href="#tocanch15">关于几个坑(第一类)</a></li><li><ul class="tocnode"><li><a class="toctarg" href="#tocanch16">QMP</a></li><li><a class="toctarg" href="#tocanch17">BLR</a></li><li><a class="toctarg" href="#tocanch18">SMELT</a></li><li><a class="toctarg" href="#tocanch19">chrisoft.org</a></li><li><a class="toctarg" href="#tocanch20">OJ</a></li></ul></li><li><a class="toctarg" href="#tocanch21">关于几个坑(第二类)</a></li><li><ul class="tocnode"><li><a class="toctarg" href="#tocanch22">钢琴以及其他有关音乐的东西</a></li><li><a class="toctarg" href="#tocanch23">東方project</a></li><li><a class="toctarg" href="#tocanch24">绘画?</a></li><li><a class="toctarg" href="#tocanch25">第三门语言?</a></li></ul></li><li><a class="toctarg" href="#tocanch26">神秘组织「BKT」</a></li><li><a class="toctarg" href="#tocanch27">一些非常奇怪的东西</a></li><li><a class="toctarg" href="#tocanch28">宿舍和宿舍风气</a></li><li><a class="toctarg" href="#tocanch29">钱</a></li><li><a class="toctarg" href="#tocanch30">关于我自己的健康状况</a></li><li><a class="toctarg" href="#tocanch31">技能树</a></li><li><a class="toctarg" href="#tocanch32">未来?</a></li><li><ul class="tocnode"><li><a class="toctarg" href="#tocanch33">出国?</a></li><li><a class="toctarg" href="#tocanch34">靠ACM吃饭?</a></li><li><a class="toctarg" href="#tocanch35">考研/保研?</a></li><li><a class="toctarg" href="#tocanch36">直接工作?</a></li><li><a class="toctarg" href="#tocanch37">「自由职业」?</a></li><li><a class="toctarg" href="#tocanch38">曾经考虑过的「最佳选项」?</a></li><li><a class="toctarg" href="#tocanch39">结论</a></li></ul></li><li><a class="toctarg" href="#tocanch40">其他生活垃圾</a></li><li><ul class="tocnode"><li><a class="toctarg" href="#tocanch41">校园改造</a></li><li><a class="toctarg" href="#tocanch42">天气</a></li><li><a class="toctarg" href="#tocanch43">假期的宿舍环境</a></li></ul></li><li><a class="toctarg" href="#tocanch44">后记</a></li></ul></li></ul>
+ </li>
+ <li style="margin-left:-0.5em"><a id="prevp" href="2016-05-12.html">Prev post</a></li>
+ <li style="margin-left:-0.5em"><a id="nextp" href="2016-09-24.html">Next post</a></li>
+ </ul>
+ </div>
+ <div id="content">
+ <h2 id="titleh" class="TText" style="font-wight:normal;">Trash dump for the first academic year</h2>
+ <div id="datetags" class="TText" style="margin-bottom:1em;">2016-06-21<br>#garbage #daily-life</div>
+ <hr><div id="article" class="TText">
+<article>
+本文是垃圾桶系列的第一篇。<br>
+至于为什么要叫「垃圾桶系列」...也许您已经注意到了Nonsense Blog文章列表头部的内容:<br>
+<pre>WARNING: You've entered the dangerous zone.
+I occasionally empty the trash in my brain here...
+Browse with care!
+Most posts are in Chinese...
+</pre>
+(也许等到时间充裕的时候我会翻修一遍我的主页,如果这事能成的话以后blog可能就不分Development Blog和Nonsense Blog了。)<br>
+在正式开始倒垃圾之前,我想我有可能有必要对这个「垃圾桶系列」作出更多解释:
+<ul>
+ <li>逻辑可能非常混乱。</li>
+ <li>可能包含只适用于某些特定环境/地区、无法被圈外人士理解的用语。</li>
+ <li>请自行识别玩笑话和非玩笑话。</li>
+ <li>这些内容可能会引起您的不适。</li>
+</ul>
+好了,现在开始倒垃圾!<br>
+...突然又没有头绪了...<br>
+几天前规划这个系列的时候不是还想了好多要写的东西的来着吗……<br>
+<a id="n1" href="#note1" class="note">[1]</a>
+<a id="n2" href="#note2" class="note">[2]</a>
+<div style="padding:7px;border:1px solid #aaa;display:table;">
+<div style="text-align:center;">
+<b>Contents</b> [<a href="javascript:void(0);" onclick="var e=document.getElementById(&quot;toc&quot;);if(e.style.display==&quot;block&quot;){e.style.display=&quot;none&quot;;this.innerHTML=&quot;show&quot;;}else {e.style.display=&quot;block&quot;;this.innerHTML=&quot;hide&quot;;}">hide</a>]
+</div>
+<ul class="headless" style="font-size:0.9em;display:block;list-style-type:none;" id="toc">
+ <li>课程相关</li>
+ <li>ACM相关
+ <ul class="headless">
+ <li>省赛</li>
+ <li>暑期集训</li>
+ </ul>
+ </li>
+ <li>其他乱七八糟的事情
+ <ul class="headless">
+ <li>关于我的兴趣爱好</li>
+ <li>关于几个坑(第一类)
+ <ul class="headless">
+ <li>QMP</li>
+ <li>BLR</li>
+ <li>SMELT</li>
+ <li>chrisoft.org</li>
+ <li>OJ</li>
+ </ul>
+ </li>
+ <li>关于几个坑(第二类)
+ <ul class="headless">
+ <li>钢琴以及其他有关音乐的东西</li>
+ <li>東方project</li>
+ <li>绘画?</li>
+ <li>第三门语言?</li>
+ </ul>
+ </li>
+ <li>「神秘组织」BKT</li>
+ <li>一些非常奇怪的东西</li>
+ <li>宿舍和宿舍风气</li>
+ <li>钱</li>
+ <li>关于我自己的健康状况</li>
+ <li>「技能树」</li>
+ <li>「回滚」</li>
+ <li>未来?</li>
+ <li>其他生活垃圾
+ <ul class="headless">
+ <li>校园改造</li>
+ <li>天气</li>
+ <li>假期的宿舍环境</li>
+
+ </ul>
+ </li>
+</ul>
+</li></ul></div>
+<style>
+article h2,article h3{border-bottom:1px solid #c0c0c0;overflow:hidden;}
+</style>
+<h2 id="tocanch0" class="tvis">课程相关</h2>
+<p>
+ 这个学期在我以为它还没开始多久的时候就要结束了。于是现在我来随便看看这学期都学了些什么……
+</p>
+<ul>
+ <li>高等数学(微积分):一脸懵b。上学期的东西好像还没全搞懂呢……</li>
+ <li>英语:吔屎啦学术英语!(希望还能像上学期一样预习一天混到第三)</li>
+ <li>高级(<s>搞基</s>)程序设计语言:课程设计。交QMP水过。这课很奇怪。详情后述。</li>
+ <li>离散数学:这是一门我平常认真听课完成作业结果分数没不听课天天打游戏作业全靠抄我的的同学分数高的课。纯粹的玄学。另外考试题里根本没考重点好吧……</li>
+ <li>线性代数:乱搞OpenGL的时候接触过一些。然后课也好好听了作业也每次都100分,然而到最后考试的时候依然是一脸懵b。</li>
+ <li>中国近代史纲要:<s>社会主义好 社会主义好 社会主义国家人民地位高</s></li>
+ <li>形势(<s>式</s>)与政策:同上。</li>
+ <li>体育:<s>这科估计又要挂</s>。</li>
+</ul>
+好的上面是出分之前写的。现在出分了……
+<ul>
+ <li>高等数学(微积分):谢天谢地我及格了……(没那么惨)</li>
+ <li>英语:希望实现了。</li>
+ <li>高级(<s>搞基</s>)程序设计语言:时至今日这门课成绩还没出。很奇怪。</li>
+ <li>离散数学:任何人应该都能看出来写上面的部分时候其实这科已经出成绩了。</li>
+ <li>线性代数:分数出乎意料的高。</li>
+ <li>中国近代史纲要:及格就好</li>
+ <li>形势(<s>式</s>)与政策:同上。</li>
+ <li>体育:同上。</li>
+</ul>
+<p>
+ 另外这学期考了个四级。裸考。这种东西对于我来说应该是不起眼到可以忽略的工作才对……<br>
+</p>
+<p>
+ <s>这学期真是收货颇丰啊</s>
+</p>
+<p>
+ 然而真正的战斗才刚刚开始。看了下学期的课表之后发现多了好多高(ke)大(yi)上(qiao)的课。
+所以说下学期可能会十分有趣……
+</p>
+<h3 id="tocanch1" class="tvis">关于这学期的「高级程序设计语言」</h3>
+<p>
+这课特别扯蛋。
+</p>
+<p>
+第一节课:我们这学期这课就是做课设。你们就做这个xxx、xxx和xxx,或者xxxxxx就行了。<br>
+第二、三节课:给什么都不懂的同学们拆了一个短信加密的安卓应用。同学们全程懵b。跟同学们透露「我是搞信息安全的,此前对安卓开发一无所知,我也是刚开始学安卓的」。讲怎么装Android Studio。<br>
+第四节课:批判在他自己开放的ssh服务器里搞破坏的未知人士。点评课设方案。讲怎么装Android Studio。<br>
+第五节课:讲怎么装Android Studio。<br>
+第六节课:告诉同学如果还是装不上Android Studio,就去群共享里面下一个虚拟机的硬盘。然后演示如何使用这个文件。<br>
+第七节课:讲怎么装Android Studio。这次甚至做了一遍现场演示:从0开始到生成一个可用的hello world安卓程序包……<br>
+隔了七八周之后上了第八节课(最后一节课):说「我会尽力阻止那些想要不及格的同学的!」。<br>
+第八节课之后又过几个星期:在群里通知说最终文档下学期再交也可以……<br>
+</p>
+<p>
+好啊,合着你就讲了大半学期如何安装Android Studio<s>,甚至没讲如何启动</s>!
+</p>
+<p>
+另外难道我们学校就真的是专科学校,学生这么多节课都不会装一个Android Studio?还是门外的墙在搞鬼?
+</p>
+<h2 id="tocanch2" class="tvis">ACM相关</h2>
+<p>
+ 一句话概括:<s>玩得挺爽</s>。
+</p>
+<p>
+ 托队友的福,我们队在校赛的新生组和高年级组中分别拿到了第一名和第二名。
+ 有关新生组我已经记了在<a href="https://chrisoft.org/blog/blogreader.php?p=2016-03-26">该文章</a>中记录了相关的内容。
+而高年级组就懒得记了,反正是挂星队……(嗯……挂星第二。)
+</p>
+<p>
+ 然后提一下我们校赛的赞助商——「计蒜客」。先不考虑它还赞助了什么,光看奖品:第一名是他们的文化衫,一等奖便签笔记本,二等奖鼠标垫,
+三等奖一元包邮的usb灯。。。这tm是在逗我?至于其他地方,除了比赛时使用的印着他们logo的气球和题目清单上他们的logo之外,我就不清楚他们还赞助了什么了……
+</p>
+<h3 id="tocanch3" class="tvis">省赛</h3>
+<p>
+ 其实感觉这个没什么好写的,<s>无非又是一次酱油而已</s>。不过不得不提的是……由于一些原因,山大大概要连续几年丢省赛冠军了。
+</p>
+<p>
+ 省赛之后我们“迷之小队”也差不多成型了。虽然省赛当时分组有些许不同,但是「主力队员」都在(我竟然把自己当成主力队员 我竟然说我们队的那位女性队员不是主力队员,kerh!)。
+希望这个小队能一路走到最后。
+</p>
+<p><s>奖品不错,有了人生第一条200元以上的耳机。给浪潮一个好评。</s></p>
+<h3 id="tocanch4" class="tvis">暑期集训</h3>
+<p>
+ 这个比较令人头疼,因为没办法回家。其实没办法回家还是次要的,主要是学校环境有点太……
+</p>
+<p>
+ 然后就是集训期间有些奇奇怪怪的限制。另外我还曾经根据以往的经验怀疑这种集训是否真正有效。不过作为一个声称过要洗心革面、重新做人的小辈来说,
+我还是shut up and do my job吧...
+</p>
+<p>
+ 上次宿舍停电之后就把主要的设备都搬到实验室去了。于是似乎提前进入了暑假集训的生活模式。不过根据这几天收集到的数据来看,貌似颓废的有点多了,而且颇有
+「越到期末我越浪」的意味……<s>注意及时刹车。</s>
+</p>
+<p>希望暑假集训过去之后自己能取得一点长进。</p>
+<p>(听说一个特别厉害的上学年因为特殊原因休学的学长马上要回归了,鸭梨大...)</p>
+<hr>
+<p>
+所以我在7月9号坐着从家到济南的小火车过来之后,暑假集训也就正式拉开了序幕……<br>
+学校里面没有放假之前想象的那么坏。除了食堂关了一个之外其他常用部门基本都是维持全速运转的(对我来说除了食堂之外还有什么「常用部门」……)。
+暑假留校的学生也有很多,正午食堂的拥挤程度跟上学期间几乎没有差别……<br>
+</p>
+<p>
+上面提到的那个学长也回来了……感觉就像那种什么都懂的那种。。很厉害。然后看起来每天比我们这种咸鱼忙多了。最近似乎在研究数论。<br>
+</p>
+<hr>
+<a id="n3" href="#note3" class="note">[3]</a>
+<h4 id="tocanch5" class="tvis">Codeforces</h4>
+<p>
+由于现在不怎么能熬过整场午夜场cf,所以说没怎么打。到写这段的时间才打了两场。第一场小涨74。第二场好不容易遇到了现在万年不遇的夜晚黄金时段场,结果却很搞笑,
+AB题由于被std::vector坑最后测试全掉了。本以为掉分已经是板上钉钉的事……最后发现rating变化竟然为0。所以也算是守住了没掉分吧。(苦笑)
+</p>
+<p>
+<s>看着队友马上就要创造三个月橙名的记录。。在为他感到高兴的同时也为自己的智障感到有点心酸……</s>
+</p>
+<h4 id="tocanch6" class="tvis">多校联合</h4>
+<p>
+难度约等于区域赛的比赛。由于被<s>错误地</s>划入了「水平较高的新生」里面,我被要求跟学长们一起打。
+</p>
+<p>
+然后这些比赛真是除了那么几个签到题之外什么都不会啊!……所以已经打过去的两场,我都只是「做了一点微小的工作,很惭愧」。比赛的后面的三个多小时基本就是对着某道题乱搞,到最后还一直过不了。
+虽然题目过不了,但是精力已经砸在上面了。。所以最近几天感觉身体被掏空……
+</p>
+<h4 id="tocanch7" class="tvis">自己的能力有何长进?</h4>
+<a id="n4" href="#note4" class="note">[4]</a>
+<p>
+暑假结束,2015级的队伍也都差不多已经定型。我们队的组合还是……相当有趣的吧。我搞大模拟和计算几何<a id="n5" href="#note5" class="note">[5]</a>,fy专门推数学题,<s>剩下的统统推给yxz</s>
+<a id="n6" href="#note6" class="note">[6]</a>。。。
+</p>
+<p>
+所以方向既然已经确定,剩下要做什么也就自然不用说了。
+</p>
+<p>
+<s>最近几次练习的计算几何最后都被我怼出来了好开心 虽然也有搞出过奇奇怪怪的可持久化数据结构和dp</s>
+</p>
+<p>所以我初中和高中到底都干了些啥?</p>
+<p>另外我还发现了一件事情<a id="n7" href="#note7" class="note">[7]</a></p>
+<h2 id="tocanch8" class="tvis">其他乱七八糟的事情</h2>
+<h3 id="tocanch9" class="tvis">关于我的兴趣爱好</h3>
+<p>
+ 说实话这东西要是真写可能要写一篇,说不定还得分上中下……所以这里就简单记一点。。跟最近关系密切一些的。
+</p>
+<p>
+ 为了写这部分专门回忆了一下我的兴趣爱好的变化。结果发现内容似乎并没有什么变化——至少从我有记忆以来。用一个词来概括的话当然就是高中说的「颓废」咯。
+这个「颓废」对我来说,大致包含以下几个方面:
+</p>
+<ul>
+ <li>写代码。是的你没看错,<b>写代码</b>。一般限定于填自己挖的坑这一方面。</li>
+ <li>打游戏。</li>
+ <li>在视频网站上瞎逛或者看电视。</li>
+ <li>听音乐或者自己乱搞音乐。</li>
+</ul>
+<p>
+ 虽然内容几乎没变,但是组成比例还是发生了翻天覆地的变化。从高一下学期开始,我已经将写代码当成了我的主要「娱乐活动」。所以这以后其他项目的时间占用比例被大大压缩了。
+然而高二之后,乱搞音乐的时间又有所上升。另外一个就是这几件事情有个共同点:对我来说有一定中毒性——一旦开始就根本停不下来的那种……
+</p>
+<h4 id="tocanch10" class="tvis">有关游戏</h4>
+<p>
+ 游戏是人类的天性之一。显然我也不例外。虽说父母极力反对我玩(电脑)游戏<a id="n8" href="#note8" class="note">[8]</a>并且我也尽量满足他们的意愿
+<a id="n9" href="#note9" class="note">[9]</a>。前段时间我在某群里声称自己几乎不玩游戏了然后被人说all work and mo play makes chris a dull boy,其实这话只对了一半。
+实际情况是是我玩的东西人家都觉得太low看不上……
+</p>
+现在我仍然时常玩而且玩的时候会有「根本停不下来」效果的游戏只有以下五类:
+<ul>
+ <li>Minecraft 最近买了正版(Java版) (不知道为什么目前这个游戏普遍被认为是小学生的标志...)</li>
+ <li>Beat Hazard (我打通这首曲子就不玩了!)</li>
+ <li>塔防 尤其是BTD系列...最近有些中毒……</li>
+ <li>各种规则的纸牌 (维基百科说这是解谜类游戏,然而人家都认为这只是休闲益智小游戏...)</li>
+ <li>扫雷...</li>
+</ul>
+后来人家看我净玩些这种弱智小游戏,也有向我安利一些游戏的...
+<h5 id="tocanch11" class="tvis">Portal 1&amp;2</h5>
+<p>
+ 当时别人告诉我这两个加起来只要¥16时,我一时冲动,就买了。也正是这时候我有了自己的steam账号……
+</p>
+<p>
+ 实话讲,这是一对不错的游戏。不过玩的时候的感觉是自己不仅手残而且智障……虽然通关之后回过来一看:诶,才砸了4.6个小时(数据获取于2016-07-21 0:31:50)在Portal 1上,还没某些人一天
+砸在LOL上的时间多呢……<br>
+</p>
+<p>
+ 最近没什么时间,Portal 2估计是暂时不会去玩的。
+</p>
+<h5 id="tocanch12" class="tvis">「真正的」解谜类游戏</h5>
+<p>
+三个字:真jb难。(诶这好像是四个字……)大概也不是难……但是总觉得不适合我。。。
+</p>
+<p>
+一个例子说明一切问题:一段时间前BLBLB很热情地安利了Snakebird并发了一份共产版。第一次打开我就见识到了「别人所说的解谜游戏」的威力——lv3就卡关了……
+<a id="n10" href="#note10" class="note">[10]</a>然后乱按了接近一个小时之后没有任何进展。。于是就去找BLBLB要答案了……
+经过BLBLB的指点之后得到了200%智力加成并顺便过掉了lv4。然后又卡在了lv5。lv5我两天开了n次游戏,结果发现一直在重复同样的情况<a id="n11" href="#note11" class="note">[11]</a>。
+于是这次就删游戏了……从此这个例子成为了我自己津津乐道的自黑话题……
+</p>
+<p>
+好吧……也许我并不太喜欢玩这类游戏的原因不止是自己智商低。。也许还有一点自己太急于求成的原因在里面<a id="n12" href="#note12" class="note">[12]</a>。
+这种容易一关卡几天的游戏对我来说简直就是灾难……所以说即使我智力没这么低下,那种对我来说有些难度的解谜游戏在我这里最终都脱离不了被删除的命运吧。
+</p>
+<h5 id="tocanch13" class="tvis">平台类游戏</h5>
+<p>
+这个说来也是比较可笑……因为我一看之前收藏的那一堆flash游戏里面,超过一半都是平台类游戏<a id="n13" href="#note13" class="note">[13]</a>。
+不过,这一大坨平台类游戏里面,我通关的不超过1/3。虽然里面并没有I wanna be这样的虐手游戏……但是还是有那种需要不断尝试才能通过的部分。基于前面提到的对短时间无法看到任何进展这种情况的反感,
+现在这种游戏我也不怎么玩了。
+</p>
+<h5 id="tocanch14" class="tvis">STG</h5>
+<p>
+那么这个类别对我来说就是纯粹的虐手了。我接触的第一个STG是当时家里第一台电脑上预装的联想OEM游戏「烈焰战机」。也忘了打了多少次通关的了
+<a id="n14" href="#note14" class="note">[14]</a>,总之打了很多很多把(当时的我比现在有耐心。。)。后来熟悉套路了就基本能把把通了。
+即使到现在还是基本能把把通。所以说我当然相信这方面熟能生巧。然而现在我没有那么多耐心了。于是像东方project这样的需要非常多练习才能成为大触的STG我大概只能当个娱乐玩家打打easy和normal吧。。。
+</p>
+<h3 id="tocanch15" class="tvis">关于几个坑(第一类)</h3>
+<p>
+先写几句总结性的话。。。<br>
+客观地讲,这个学年这些坑还是有一些进度的。然而,大多都集中在上学期。下学期开始之后,ACM实验室里面的事情逐渐多了起来。起初还有机会每天挤出时间写「每日开发任务」。
+后来接近期末了,空余时间也就更少了,「每日开发任务」的内容开始变得越来越水最后直接消失了……更多详细内容见下。
+</p>
+<h4 id="tocanch16" class="tvis">QMP</h4>
+<p>
+这是个新坑。大概是上学期快要接近期末的时候开起来的。开坑标志大致就是某天心血来潮想起了那个一直爆炸的midi读取器然后想要重写。
+于是就1天写完了文件读取1天写完了CLI版播放程序1天套上了Qt GUI壳。然后就给自己挖了这么巨大的一个坑。
+</p>
+<p>
+<i>似乎</i>我开这个坑还跟Zumn的那个「高级可视化MIDI播放器」有一些联系,后来有次好像还制造了相当紧张的气氛。但是鉴于QQ智障的消息同步机制现在我也无从查证。而且作为一个非常标准的INT*,
+其实我在说话的当时是很少考虑自己和别人的感受的……<a id="n15" href="#note15" class="note">[15]</a>
+所以现在也都忘记当时是什么情况了。<a id="n16" href="#note16" class="note">[16]</a>
+不过作为目标不同的两个工程。。还是不要做什么比较的好。
+</p>
+<p>
+说到目标……当时一度扯着要进Debian官方源。BLBLB也一直那么说(虽然不知道是不是开玩笑)。现在不再抱有那种幻想了。更为实际的目标大概就是提供一个稳定的可供日常使用的MIDI播放器吧。
+</p>
+<p>
+<s>这个坑好像是影响BLR进度的罪魁祸首。另外它好像莫名其妙地抢走了当前的开发焦点。</s>
+</p>
+<h4 id="tocanch17" class="tvis">BLR</h4>
+<p>
+这坑坑了……
+</p>
+<p>
+「BLR3 coming this summer」的目标是不可能完成了。。。能什么时候开始继续搞还不知道呢……
+</p>
+<p>
+实话说……BLR2到BLR3的跨度对像我这样的个人开发者来说,实在是有点太大了。从一个完全由写死的C++代码堆起来的游戏到一个由脚本和扩展驱动的引擎,还要内置什么调试支持和命令行……
+现在感觉想想都有点可怕。而且伪ASM写关卡有点过于蛋疼了……
+</p>
+<p>
+有时间再搞。(有时间不知道要等到什么时候了……)
+</p>
+<h4 id="tocanch18" class="tvis">SMELT</h4>
+<p>
+SMELT其实最初是作为给BLR3用的一个hge的替代品出现的。也算是我造的众多轮子中的一个吧……<a id="n17" href="#note17" class="note">[17]</a>
+用OpenGL 2.0的版本差不多也就那样了。DirectX(9)版还没怎么动。另外有打算折腾一个用OpenGL ES 2的版本。不过没有计划搞用DirectX10+或者Vulkan的版本……
+另外那段时间瞎搞CrossNoodlesJS的时候曾经扬言要搞smelt.js,现在从时间的角度来看……大概也就是玩笑而已。
+</p>
+<p>
+值得一提的是在QMP的可视化的开发过程中,SMELT的API也获得了一定的扩充。一部分现在写在QMP里面的辅助功能将会在以后合并到SMELT的扩展中。
+</p>
+<h4 id="tocanch19" class="tvis">chrisoft.org</h4>
+<p>
+这个可能不能算一个坑。因为大概就是闲得没事的时候来乱搞一下而已……
+</p>
+<p>
+要说变化……当然也是不小的。这个学年几乎翻修了整个站点,获得了域名,新增了blog和library模块。<a id="n18" href="#note18" class="note">[18]</a>
+</p>
+<p>
+说到博客。。这里面还有几个寒假开的大坑没填呢……<a id="n19" href="#note19" class="note">[19]</a>
+</p>
+<h4 id="tocanch20" class="tvis">OJ</h4>
+<p>
+这是个还没开的坑。前几天发现所谓的SDUOJ上线了。看现在这个状况。。。完成度还是unusable。<a id="n20" href="#note20" class="note">[20]</a>
+再加上最近了解到cgi这种东西居然如此方便……就有了用C/C++写OJ的想法。但是现在对于这种比较复杂的网站开发还没什么经验。。估计开发的时候得请教BLBLB吧。
+</p>
+<p>
+目前的计划是分三个部分:页面生成器,评测任务分发与结果汇总程序和评测端。更详细的路线图等真正开坑再说吧。。
+</p>
+<h3 id="tocanch21" class="tvis">关于几个坑(第二类)</h3>
+<h4 id="tocanch22" class="tvis">钢琴以及其他有关音乐的东西</h4>
+<p>
+先谈谈钢琴。。。这个本来我是有计划在暑假期间试图拾起来一部分的,结先谈谈钢琴。。。这个本来我是有计划在暑假期间试图拾起来一部分的,结果现在暑假几乎没了,计划也差不多泡汤了。
+今年五一和暑假前这两次回家各摸了一次琴,发现……忘得没有像想象中的那样彻底。
+很多当时能够演奏的曲目现在几乎弹不出来了。(于是这个锅我也可以甩给没有时间吗……)
+</p>
+<p>
+其他跟音乐有关的东西,则玩的不少。Steam春节特惠期间一狠心剁了SONAR Pro<a id="n21" href="#note21" class="note">[21]</a>。虽说只花了~330大洋,算是DAW里的顶级白菜价,然而还是肉疼。
+大部分时间都用在乱搞别人的曲目上了,自己编的曲目可以说是少之又少而且大部分现在仍然处于烂尾状态。总之根据「开心就好」的宗旨(什么时候有这种宗旨了?)。。玩得还是比较开心的。
+</p>
+<p>
+认识的人里面不少都拥有了MIDI键盘。然而我的那台10多年的PSR-275估计是没法带到学校的……一是61键太大,运输相当困难。二是家里人反对(或者至少是不支持)我玩音乐这方面的东西,
+所以我要是说要把这货带到学校肯定又要被打了。。。所以我先将就着用其他输入方式吧……
+</p>
+<h4 id="tocanch23" class="tvis">東方project</h4>
+<a id="n22" href="#note22" class="note">[22]</a>
+<p>
+其实吧……我也不知道这个坑我到底算入了还是没入。说入了吧……其实主要也就是能记住个人物设定听个音乐什么的,游戏本身打的并不多而且水平也十分糟糕;说没入吧。。。反正看有段时间的中毒情况也不能说没入。
+这就比较尴尬了……
+</p>
+<p>
+如果要说起源的话。。这坑我是从音乐真正入起来的。<a id="n23" href="#note23" class="note">[23]</a>毕竟东方系列的音乐知名度也不算低,而且其音乐也经常渗透到圈外。所以说对于我这种当时(高中以后)比较喜欢看鬼畜的来说,
+听到几首出自东方的bgm也算正常。但是真正知道这些bgm出自哪里是在听了某群<a id="n24" href="#note24" class="note">[24]</a>群共享里面的两个MIDI
+(「琪露诺.mid」和「蕾米莉亚.mid」)之后(大概是2012年12月?)。当时就觉得挺好听……然后很巧的是文件名正好是这两个bgm所有者的名字。。然后我就去搜了一下。大概就是这么莫名其妙地入坑了。
+</p>
+<p>
+当然,作为一个INT*、一个相当标准的thinker,我还没达到能作出「此生无悔入东方 来世愿生幻想乡」这种决定的程度……(而且好像这句话会引起争议……贴吧那些破事咱不懂)
+在下面会提到的「回滚」完成之后,我算是向爬出这个坑迈出了一步吧……
+</p>
+<p>
+至于最近……废了一个下午通了th15无欠easy...然后其他就是听听bgm或者丢到DAW里乱搞一番了(th06/07的原曲快被我毁的差不多了……)。
+</p>
+<p>
+至今玩通的作有th04e th05n th06n th08n th09n th10n th15e无欠。(th06 extra借着旧版本wine的自带减速通过一次……全程&lt;10fps我现在也是很佩服我当时的耐心。。)
+</p>
+<h4 id="tocanch24" class="tvis">绘画?</h4>
+<p>
+首先声明……本人手残一枚。某些人曾经看到过的那几张图都是我高三的时候自习课无聊把纸按在打印出来的图上描的。。。。
+</p>
+<p>
+其实如果去翻影像资料的话……可以发现我<i>曾经</i>还是会过画画的……但是不知道什么时候退化成了只会画基本几何图形的水平。然后设计也是一团糟,当时设计的图标被别人评价是一坨来着……
+<a id="n25" href="#note25" class="note">[25]</a>
+</p>
+<p>
+本以为X1 yoga来了之后可以拿这货的数位屏玩一玩,但是到现在还都是只用来写字……
+</p>
+<p>
+所以现在我很好奇那些大触是无师自通还是从什么地方学的……如果是学的话又是从哪里如何学到的。。当然如果是无师自通的话我只好自认倒霉了。
+</p>
+<h4 id="tocanch25" class="tvis">第三门语言?</h4>
+<p>
+初中毕业的时候就有过这种打算,高中以后这种想法更是没有消失过。与大多数跟我在同一圈内的人不同,我一直是想学法语的,而他们大部分都出于一种圈内众所周知的原因学了一种圈内众所周知的语言
+(那门语言我也就是刚刚认全它的字母表的程度)。。。法语的话……现在也就是只能看懂一点点句子,懂一点点语法的程度。要是自己写的话,估计一句都写不出来……主要还是词汇量严重不足。
+然而买参考书的事情已经拖到了现在。。。
+</p>
+<p>
+不过话说回来,我现在英语也就是个「半吊子」水平呢,学什么法语啊……以后会去法国吗?<a id="n26" href="#note26" class="note">[26]</a>
+</p>
+<h3 id="tocanch26" class="tvis">神秘组织「BKT」</h3>
+<a id="n27" href="#note27" class="note">[27]</a>
+<br><encrypted hint="The full name of BKT <br>with space stripped and <br>all letters in lowercase?" hash="454d2df9d1048b3fdd0d5c6799b834921432fce94b500ba16d057c10b0feea66" encont="VWg32D4U8Axy64+iLJvnEFZg9WmhI3dmzJnWv9/QgLwb+ZPaVzGgVlpYVDwR0J1nqYMZLQQdcJ20DBpy2RhC25kHMWlKmLMTLnvUzRx3hXLbeimzk98pqRq7KntVrUQHrWrkdLIrYelIPLr50fTXNKw+o95SkII7XMhrX9KR5DoZOkkW3WF4X/2PQXtafSMAN3ZEzJovASkSFqPXp6+czXR0OBMAJndz0fnjSEUQTrF3BS2hRHFpB2qVW7/UjomzRS+ib9upFpSlEhDOtiXEElowAhujQxAZkqsuxL/JjFELnTykLvahRc15injvjnYnkNvO1qSkWwnM1xoucQz57TElUKwg/9eyvhIttYeYBMBp56CmjJ+oLcvcylSxI7ZPLP8SkEouLD/60/s7xsAa1vDNraIyhoNsvdb4VI0fpexAIck2GPCJ+ujtaETZeKt5FNnjhV+vKzRbTo1HgKIcztAWzqxlzfEfNC17e1/pSkmavFypQP7aKP1y++wYyXbnyfGJVzHn194X1aspjL2+/eKqKh/AxiKDQmNorzIkdYnGMx13Mft6M/Wvh1Pm75/Yzve1P0PRRYTd9ydOtQEsi54kf9fi1KT/rL1L9qXP9QX4Kpx4o/Kkt7CUiU9gAN9M3M98ZlAPRCw5WJdI+medjlIcwegPerc8SFBTKNgW0Aq9FeSYxu3V2x3G4w/7fLRc8xcpuRUXCbxRXwol3eSiMJP8AFpdqRTSGYsEzUboJH0k/RvMhdEVlcCdotdcapID2iNELa79Ak4ej8T+CL99bZY/q6koBmdMCok04qxJ1PsHIlgbuD/Vz5aXH3xCGKjaNC7+F4mm1sUjsyJbRxGu/yL5dyTUpTDbmUxgWPaMv4+mZVpwYDERHDxc+8OFccmOpiqAIiy8v1w4K5Da8S5Dm7+wSOCD+HeS3XAe7dBDc/RpuwbdmaLmQyId2RXwxx63pB6Ho0YJxgcRiBTXhFFyfeE0wqnMpzIITXaFdUimu/xJnc6IdbwoE1yWn4Lwkz/M9MDzHZ2nhTwgA38C6fqQt2Y0jqywmZohfcSqQQGacqlML0QkV8BDX9paOM4zGksr0EeHsCqv97h1Plqj4HSpe8pL9idbStpgK8we7KF3ckRDpBeJV/GGqX/y8LgEAu7VSRU7aQCfOpebGeynLCiN6coJWA0Gwnu1Awi3fPAZsXsZxP9cLZtaiMHi5X//QGPJpAGhHHpKQvihZNQB564ZMb9XGPbm01knl01pzNWD1WVF6nDT+jiF4oOX0Tn4ESaNLdrNBZcPnQCtFT36QBYQxBmLPfSQgxBHWTrtajxdullr+kEujvJV7ISR8S5jejH/eE5+4UZs5/3V+IZ54+scJaTR5JFQWMOO0cOy/euVYt2NwalFW9FfpTcDlAgWG8Z/ZJq9EyIyNK7Kar9zStOaC882NGtP4RIQF3rB3yHOBkmu9Axa+JfZn5AUGmsgVhyAd467u7m9lsVxQsqM2lyd3zoSsM3SLuMSINWELP1Dt1BWVevTklKzdIrD7z4hQ808lHT9vy1PbxSSCJ8gk+2QmfuhNg4LGd7ZNgU+CAMhM7Zb819H+OxIvt76lknyJTyuoDsvmzMiQMspqo02/+duvycVqBsW3JnxGN9HQSN7B+jAg7RBZfI263wtOM4m4IN5YqQQZEkpRWvH3hRtCNgUoq5iB/vgO8+n9fgjhpQF4XrCEX9BLPwjjDJmfzstAGmgeKiJxvA2agbVqTdjIdqwoN2qt+Tbw4S4CeFjraickGJXC9c/RfZnDvSfdDjZSvq8q85Vf7Xd5PpdmWlLUmmlXqt0Hud8kFLo1pvIII11wWB5vfzFtZZ2HQXl9O3UkegQcOIeWRy69tdL5HWi9tR6HXdT4nY0YJx3QBGGKn1lUwZPlfzcdaxEH1sNCjRBsU9juTsCMvRRAbV4BD6Ux07pNM31AYVsmH+hfcYGDGwQpHbVRU2X1uhygqwv+I8oCnu400fc6n0Ef+6ReLvTLo5NumvWiFQq6N8/9786HpihM+VxWYicMuUeYkWDeUQdl32etQGnt3MInjVqRHFcefVv1RdYjST1/MiMNyy60TRkpx3B3EbSVncn6Z5FMeJpE14BfZkMLSL8oQeYKTx3TXUbl8PBwQV6ZwWhwypfW/HhIVDkYouSAnVkGI59YIspOKCILUunZ//sRhVnijv5RoWoPs/JNYcGIiez9KskazT0PfFNOMe/Cxdxz5M8LN+MGUT46ujHyR5nVjoNfc8n0jedM7lzY+YY6j0ZHIapC9daB+RT0IrbalrOCLJ/jhw26SpTtqhjYP3vzmCvIZq8mRQyYy+FoFu4FsNfvNGCTlDFItUTXXwxDEc90u+nZiBxBbMdP1e6f/gvZM4Z1oeQladow4C72CG0VHD5EvVMbdJDkp8uP8dz93zAVNZj3afJreDZ20YP3lj4/Bjq1hgYmfmYhwmgEngDe1DunY5/+Mt7vbqOLzony7wrkLHwERaEjNv+LOmwi0vQkbbYgO0u5jXnSxEsq21M3Z1+U0vFO9MJzmMu2rJV0x+7YBKoleEOUy9aXgMbgER8u+WDlzjzOBIQNa0nKS4z4IKxQk6rUUunSNlPdwMGoqiFLlSGYF2+9F7uwsJF/Ur3irJtzIigfFwdG/WZTmwayEcXoGAVPCe5noDXE+2pX3oZpnknQfJTnUAejkh9Qvd5gs2At++8bbrQIMo9VDyVEAC9Fms1o2GZq7A4290NlEDuf6nXDjDiD1e/TPSMi/v/8AfvrHfYtf/E63ta8i0NINLuLz55u9Wuhpo1IayISkFL2ZNEHls2wCTtP0l3XVWUW9r983+Z+Dubv810hTeZAWsp8tua2pwoQQBrzTSPbmqZO7qRcPbrsBq2AjGydJew1ybtpaarWBqbqObSOUuez1duLr8ICy4f6a6OiC/UbxhGLO1HCBZYWJtG13GGACTJfKkpGrnA3JUNQBnNIKPNAsadGQYJyizHDEWMVisiaao7hC07TBdfrM2R8QYRb6dk/ndtSm/34PtrQdn724kfIiqmmP3E9x0yoSJbSlId27xTf6yyoFLDwVXjawl7RQf0yjJfFFraufLHtGBUWKj/8ZqCRnSpbnTvifSb4a5brDBqKWHGU8poMyJUasdYPr3HCGoxiSDOAeEQGoXg1JsZ2kp/aJkAgV/W4hzFDgwiasq14Ps/4/wGpgC4dfDG1zZ3tg04cMKmetwkbxmMXClrmL5dQImdPx0EsgAaHYYshdZrgzTOuRUVnNfzxEoxoC16K64FCfe8Vfyk0KyU0v40Y1X6RC9/BggS/cwJzPD7GM7BFr6ayE2PfnQWNnvHDUFUnRyvWh5MGRV+vYK7VshsWra7P1tjMoTWSGTts8tN1gtl5gU0A43I+carfActtoj43RQv8vBx9zeTbkNTj9l8MeC9hAw3EY5h1S0tq1GHHPgvaykRJzIHsPoMYDMVyvGDUzS/C1U5ipE2fAvQhid22AnbXHPfO+ouf9zSjoP6EJAZ0LTmKhxabFg7TuJO9QFhSTjnjCcbYAtgMLa8teYhDI8pdSWL6PPgmTw7LZzqzuqq2MoP/glrQPlHRwvDqXShYsdaM3aoKuROCy2xjxBfiYsOkneR4CLzY/yabuPFO/m8/LQpWPGl63fdfpdYM2NkIl1Q5ZOswipIJAXtbnF9EM88WjOoZVrs1ORaLlrFWYTPHnnGsA9Y8hjFmd2DqVPLrNnVRFVAZPPXyYd1X+OiLRd9v/BNziqAvIT7HA9CgRPn71Xb9pvkFbj24c2xSxqXJ6rMbb8TvcvThZ4p7HonfH5Ce4esqDew624NrhBVJigkjmJlfBs7D1k0V1DJ2OlHr65ZThGSTeeyZnnW10CX4z/AufaXTticyzgqrGx5SbSA/gT0wFe9Yft6ko1vzUa20H30K9oyxR5xgI5R2xhxAvAvX9TEySvoBr1qzq990SPGwffsgfCGKZybSy+vvxzgkJqipRMzaMQEYl4xYXiBXjvQYTsC5rJHXdRDDIQMKwyGvvlSqnM5t99Ua30tJNN0C9dCwRPdi74B84UJ/V+rnKVGw7LFpkPBEUuQwSiUbGdG4UtsQr4ACIiLkuQMa6jO6O7UThgEKeBEJyJBoL2BCLBjJUnPj0wkvoqGgGvnkSNZMN2hzCoSHMLNFm7ykNM2MFvxufiUPkYBFu5A0lJBd5oX5a2KfkEOoiAv9Tg4+3dY+M/JHkoC6jsiRX6pl04uLNUtXqyvH0jf7ivxqJcI2l/guQHmg7prAaXdzp05MtjF4gGBuZqAeAX/rWGQw4y6YtM98HiSCn6pij48wYzjy/DuUxiygL/RBfGrd9rSADFn9x1CV2vEThEFTzdG0hyVTzZG+PDDvu4MhxJs2VgTcM1udQUbVLI9ysjXNL4oqtzUZUfZ2Jq9+7lAWNyQda/6VZEPMmr8nEOhuzdpGbgyhT7gwnQEcefSb+Q9c6cr3UhLEVcSmuUvPmUe10ZdmIVzaU1p1qt55Mej7RaeRwf4pAFeuYVkaAHqGjaCzqtoGKaeRGawEAA+GKwrOVT0ioN9G3v3grZVLYL3gQqKiCcDqXPqzLFMQFs7N9l5NSUqf9/Pb57+k5hUa6HzhgSTEivxQMJJtcQJIEBkW/cnQw8wKOtO3wb9OsO7ZRtHCZ81vEecv/2hRcM0/snvhyiiHeTYYxvTU9b8d1X+pISIDc93EWRCL+2vcoQmOseaVgQkxp8cY4lI87CeT9/ZpqAQkKPcieFCbPCMpHRzB76zL74U6/w/nrdA+0Kd2kts9gp0Njy1sj6T2Ivla7ZgMyGodXcW572+npP6MEAuPa8kVsxJGkZeXRp335DNL0VS5CKQm1gwoyWm99DBY/2Zkx4D1lUYbQ84OTI4unuh/mOZDOiCJgaePai98GUQTWfipd2LIXE+VzE1qHz6Y7WQ0fUDWDl2U1d5KQvKWVIhkSBo3o4aZdYnlw/U89W8FAABMmFlPu2b7amxCr4ER6aQVTtz3ojYVFpPgHXPpu/sa1idRavi1IfaZS/WFbZ0NUmjP69s9Xkyl7X7dffYNFtKf+y3MgIeIYhlngBDImiUfmk5j87jrKjuyHT4IMPyAglrIMSwve/wi6RkCnXvfGP4B7CU8KG5L88V6WzXYYMXfGhGrk0On9BLHCptPnQE6g39SJogzbaW6w3rSp30/gBGXVAF6zAp0DQTSOHQaAY2MhNghFhFmpVlbF3SRMTQ83Qe6RaGY5iLic1D9wmO6IHmh1q+Uiepv5GT3ocgl3DKor192czyyZjOTzMa4OJcdYYuojbM3pm3Dq4Eu6IBBCr4HT8qSjPizWcNEdWGpyCUTj66AnL17RcYiC+5BUIZJD7K3jfXhmcPiXq+MDxcUF1fBgTB6fHeyUlAiEGDZwZZWsnswhWCL6aT8jqncYJ0/EKoO/unqS68q698E63cEk5SYZPkBzC3AWC5PUM5OXOP0AwmC5Tes5YlevbYsfOj6NpGjyOJF5Fb5rxZfCfHq+68AcnmfPW/ddh3rHaiO/dyvwA5v0ojNxoKEoVkkoBy1aSRVLf6Xom081OOiXwRz7i+jfVldgYF/q3qptv8BhAD5piO1x2sENyQl52ruPBlAtCTo6Tz2upNQAtt8cHuAuivHoBcEp7wunaMz5UOQJr+zuqGBNp9LQq1iwx1Gqxab3HOUjX3p+3qxgKuKNPCPwSaVGARbc9lm+vJE3nN46XRa8IkoAgI/NExYJhgNhJSOS0CM6he9+6Maht827UtU69J+mucKmRBYRkhBUwRBhlZYpP0kvbq66eSDJkkd+ae3mWhw2ApD9PAk5QKmkRRTHIRt2TQcYnEXNMYTafEFjiTUhWr94pWivv0yYcpb9wzwztUB2+xjdE0eGOU1h1+99YcJDwbAo8L/X7c+1KtBQoEdq1IvQy9WVAATzNy3AywAmBk6Y/5RN+FVKVTbrlaDxo2mbcZpksduT5uBhCTHgNWRhIDQ5ZxOFo8IW2/sHSgXRZup7Mgwh51sAShVCQrSH0rxKJzf00wk/Bzb/mBRtSGqhsiVwmBlxE8wWyLzeNhtJNiYMiWYkleA++QkekHKUiDFTVXrqoJwQSWFrt8BDR2WeALORwONPe8O23s49p1dfXYKvEEuQs3rLaBRcMEJ/0zBFdcQOWvDjuPmVTG96lQopc/Q4iLzGs85KdfQYA7EOZnm7yyCCmZLI5r2NpYgnDR4ZBwflBYjBBalqzAox7p2K2DumE5HoQZa0Cn8Z5jI41o+XiDSg8P0cdLJQIbVvi7HgbPBwp6LPSoWQ3EXClLSP887eS1Hv8gq2n7NDIMS6y5jw+QPSkKgvHR7SWuo+R+X3iRXsq+6s8VCSNCVpjzHZgv5elx2SSiHpJYbmEdnLD7POHA" enid="0">This section is encrypted. Click <a href="javascript:void(0)" onclick="decryptui(0)">here</a>
+to decrypt. <noscript>Note that you need have JavaScript enabled for decryption.</noscript></encrypted><br>
+一些额外的话
+<a id="n28" href="#note28" class="note">[28]</a>
+<h3 id="tocanch27" class="tvis">一些非常奇怪的东西</h3>
+<s>(好吧……我忘记当时在目录里写下这个项目的时候想着这部分要写什么的了……)</s><br>
+<p>
+(现在大概又想起来了……所以说这部分大概就写一下。。。)<br>
+某女装的zumn<br>
+和<br>
+某出柜的jngsas<br>
+吧(
+</p>
+<p>
+对于第一个我想可以用一张图概括。。。<br>
+<img src="//filestorage.chrisoft.org/blog/img/tsz.png" width="20%" decoding="async"><br>
+——你说你当年多硬朗的汉子怎么就玩起了女装呢<br>
+</p>
+<p>
+上面这段聊天记录采自我们的主角第一次在某群po出他的女装照的时候……然后现在的情况是。。这位玩的越来越欢了(<a href="//filestorage.chrisoft.org/blog/img/tsf.png">边立flag边收</a>(
+</p>
+<p>
+虽然并不是要把这位姥爷拉出来批判一番或者以任何形式表示反对其他人异装……但是现在的我应该最好还是跟这种做法划清界限。。。<br>
+(现在的我?)
+</p>
+<p>
+<s>卧槽好像又立了一个flag 吓得我赶紧把桌布换成了ThinkPad的默认黑壁纸(</s>
+</p>
+<s>不要点这个脚注</s>
+<a id="n29" href="#note29" class="note">[29]</a><br>
+<hr>
+<p>
+好现在来看第二个……
+</p>
+其实这块重点不是jngsas,而是为了声明……<br><br>
+<em>我的性取向是null</em>
+<br><br>
+……然后祝他们幸福。<a id="n30" href="#note30" class="note">[30]</a>
+<h3 id="tocanch28" class="tvis">宿舍和宿舍风气</h3>
+<encrypted hint="请用基本拉丁字母输入我的<br>一个含一个希腊字母的网名" hash="39932de669f3e48d5fe22219188e19a02d45352fae101df1761e4014607566ae" encont="gekNt94fGQSLkMCHmr/tLxv/aFA15af2cz7hTV/13SpRcV2bSNmr4R8xae0pgLJPEJwQi8VBTiwN0RQpWOivuI8cYdGBF81ghvt854xo9Xto0u1q3ymBwZke1IA4s16G5T9sjffuSNRxaI44/SHwQhXyG81ivmAGi8qGRmkV/THsVRzWBGY6iVz6Tp1kCnjm+rdDRGk3TyZAPo/GDzYutzbnXRPnK3r7kVEu6UNAnP/Xm0hkAECnh2s5Tj4q8Yf/CBSSeOiEVJhxToQvkUaLgMZw02JLGTuWFZbQ+nijsTGlxutMjUa/X2AiThuIUqDj8HYLDiutEep488sW0hjzqnsP8GzTBRZXaVnXfS11jmMJ7FR0oQDfDgcfTd8h9JR2XLnrz5hPXyvk5aScVswGZ4VAtautIlJ+1FLW73W8+LhVdD2LPzURth7IOktNaU3Rrqjt0CuRJPvkSQdJaWPZePo/twGgtw2RIccdBvFrDMaI2Fd1GxybnhRZY3eXT5DmSv1ggkQo/12v27BDQKS7ChHGTW6k6JchqFV/t3WxENi2l1G2cgSK8ytzJKSlXrPpoV4u0fAJfgwryjjw3SiOEn4eoPlu0Ust0nS3VJBEx1Yk+ZgtRAfhHOlqVccZtq6qmjHilXs0CS1g2Z8E6JJtszoBfUjZ/FGCW/2chnsEQ/Mjf2b4rHB4ZpOKkaSZtRPEfmJLWDbtEc1ilrd8d4ezEwXKQDcJSkNNC0cNBGxfbI+RhmRtS422TSIFPPPci2Cf4JKs0p7tZvuHSqUJlcYbCA+i+WBTd0AxNze7ko74vuL+WAhTfBHqIs4zcDEBWnA3wJHTR+XOR2au5e+uz9rJFVWiHkBOtRvhbkLDfNGixah1P+ioy+LkY+uFx/iosBD7X7hr+IS/lvVwJontx9x60Zp8JpUA6mt0n+RyBfNialrmC07zL6tRdbrFK9YSg/RemJ/0QshY1z0Os3y7WAQRpOZFYBpydiLewZbFj2dub4nN36Fx5xEiK4VCasn7ViOhubvALfn9B19DYk6baopu1trVFgC+6gB9kqboSSFxHEGC/IAAyNv+fnnRiahOU6IHzC7XiN5aWywQwM4U5DbHo+6H87NU0HRWyowybjlChVhO3U/hKbvEBVQ35TG58IvIHyUZ4BDgn3PNzIcZU+rcmgXby+N1Kt884QkL0C0Ab3F8STW/xyrw3x4/n4F2SiP1vUejCYJymkPeUB+Dz2zTZoGWiqpNaevAiqWqxp/akbtKUXKcrnsMwDw41kIAeLvHiSDow3oP7tjSKfvVFw9MhBYSOd71HpRz/9VCD9QTsPnE8wHUVoZpI2u9bINGtjs4+ZYbsl1dRAMdQQfcZ9rhaKDTjsJJuNzwYcWbyeVeE4r0n7ZETNp/KJT3wOlRq81aWezwqKuwFPrQmmb9MjaldriJAkAsO+PCopIDeB3IKI7gJEVMkYXgQz/+zTRdEplWgPI22h0/CjvHTwIOJ9u0VH59ylutoq3hit68IzTEd+FSBrZUpLHYN53MVkHcUbPfwTUllNGOY4nB3EmuqJWfSYq5O1hea6u258RcnVEVZsPOl5g8e3wGx1+ha8/qWizigEatqk1l2wX3RmP745km/MBVpAGrNPNRprpNo91A63PThChtickQ13cWhVYAP6jJddJwUx3NSxEjRh+aDVvAiVuUlKC8H60JyNSzIykNtSorfsfh0I1AgU0mJIto1IcNNEVQyidfvnTtneXYZ3Ngbp3kgOmr+ZkB4Rh1GHrOq9yJBktzYTvR0qcg8Vla8mSX6uyFBemC8DptBJatEqqitg32xIVnaXFNeybdXAx4pAFH28qDPdfR/SIQ4g16JVMXJaPr5nC/ZokPqhpEfS+fJ07HOK1OPt/sqzxNL2Ce3gcTgO3DP9tDmzKYfbXnSQxbRHQ2x8YXdrg84b8YFz5tzyahEk8EO3iV6RM/Nr7xkSC9RGxvLL5ohZ1yQUwY7fMt/uBBTlly69htNtTMVOnpyLxCdTiWA62D031YuBwtGKfRUZcA697onAy9N504jyoA5z6b5HUFogwlbnZ4ioPpG704QyVkO/rXOlbizTwv" enid="1">This section is encrypted. Click <a href="javascript:void(0)" onclick="decryptui(1)">here</a>
+to decrypt. <noscript>Note that you need have JavaScript enabled for decryption.</noscript></encrypted>
+<h3 id="tocanch29" class="tvis">钱</h3>
+<p>
+日常生活方面,我几乎毫无疑问的是全班最节俭的了——一不出去浪二没有各种买买买,三在食堂一顿从未花到过10元以上。这些因素综合起来的结果是本学年下半学期我总共只花掉了不到1600元。
+第一学期的数字甚至比这还要小。
+</p>
+<p>
+然而在电子设备方面……我花钱可是真不含糊的。。一台X1 yoga就把上学期赚的9k全甩走了<s>(还倒赔了不少)</s>。然后又把旧笔记本升级改造成「台式机」花掉5k,买各种各样的板子(树莓派,ipc主板,WWAN卡)又花掉小1k。。。
+还有1k3的SONAR Platinum。。<s>我真败家……</s>
+</p>
+<p>
+当然我感觉这些钱应该也算花在该花的地方了吧。
+</p>
+<h3 id="tocanch30" class="tvis">关于我自己的健康状况</h3>
+<encrypted hint="php?" hash="2cfe798301e9d0db91f3c012440cb773831244877ae799f260a69741ed1569f8" encont="rfTzpb8xSYVcnlEWm+mJVtBOYCdGRGiIzA7vxET0tyOusF2KGYYqaP3PNppXk9E+HsjsmMriSS3fMgvo0irwJeE2EHWl/WRLWGaexxuHtLACT3MBzcWp/UcwxqBiMynETaJH5erHqrM6vSJH50rYl5lF58jG+gKfH1i7RBFgXJJfSjy9MTLOHDVmyvxjb96xIuDaexCLg8itfoIeoa7k4UfP7eFb7wLqobDmRr8iEAAmEWuYLqBoSf7QAKRSoFIHmxX+63deeapihtwcpOJjFYveNwffHFXoEN5FLbflxtC+UmeF+lDCYZkRapfgODYK4cnCre3JiULK8RTjCtRMCD5F5960Vcums214PwBzSqvi9nMV7qnVoMIX4yDtPa0R4OtIdSlXStbXZ82bkbFg/o6yxqrjxaF5YBVV4AN9wgKGCMuu8ZuNRDd8Bsgb3BJqXFTyd6NQqrPpOyI8fyDKjK7rvrK5HXqOlHZ+yNYuRqNHLRBtWIv36CEKmetkMy/tZJ+Crx188T/kOyixhudEN/aNDwdwq6R512u0dbtWbjalh5Bhzv8MERqJA5lfRPE24NrUoG9jhXrOrzUBfpYtqF9xlHLfiJD5v9sgGnNMHyFMA4qM9jttUZ12XsxngksYLdIeZkYOXHWm4kidcrvtMxgE0FYdwIFqVt9Q/e0W8Um7RIa4QIuTX2WC4jALG/VJuQCaITlyXD6ZLgp1wtHFoLRuvnQB9yMfO/O+/3z3BMp3Fv87JQzo49aErpC0zOMRzOQsybDr/luZBoLofiFkpS7JzQS1/K6zUk1MnR/2e4pXu2ukU8sMdgB+fWJAMWbVk9a5nZcF5Ti7Z/NtRyGBmfpYEAhoBKo2DYJSeZChhGpXb40XGdG1zE3H2oJk+cFGb0Jl3scEOmR6izrRLfgCaElTFI22A3A6JbrZzEU7p+boREsLyibINZ6pQ8PjCx3V4yfyMGNJus//3c4IUpbLpYht0crCylJeiLLbC4U8gNcykETMoU0ehiH08c95xGMJ3wp6F5yod6LsFzMG0Louk8h0VfxtI6j2AsmBG7GUee2F5MDmDNPmWbr5oAdH1aq2HgmP0AMWIzCsY2vP5HaW0FkoBm+fRUauiN1abq0GBP3Ajhg0G2UhHSwi/uaHcuq+OS5qZ/3A5ab5ccgvIp6J0PuhCoKknw4oI7wif5hSQOYtOVX45J+jn+NC4Ev5di49i9A4UwuMaUJstRauNzzanN+ZHq12aIWAHbN3ziwitFmvunWFDW4gh/mBHcrf6b3yz2GjKuZQjpWGVKfoKEDJPTNfn7Pc0JsObnKj9jStNDjbYEZKwsEjf87VsGtzoGAU/9buNoZIm/eIrqPeLLg+NLTw26RWeQ2t2i766aW7Fv7eNJhoIP3DXP/vssQg3+1UX8rC4I1ZvDbye9Uh82CN1MuK4np1xHRk4LXBUDWk/R5pMUZx7xU6guVT6mLo3zD78DgCdpidIIwVzmM6uxTXaX5KPvEGgmEDViiu6ttQUL3yMJsktlpO6KwGpddg8FEQEfp6vX4AygOcCbVgwOZgX8mxWsMsZGgoP4CEDPVnneQvla4zVJnR9X/wa0sI6vp7WO/8I3Xid4i9P9+CZg6hnvh7DlyIZcIMopV8Hx//nBIc3SRX8cXMuT3HidFVPTYbw5ToWPNcEzEXw0/SK6h3u63B18TDRWJOEVr/Hy8VK7zQboBnwKO6ejt7KSJszJ4ieWFN0OlNwfjkT1L0DXlaJNfYoiqmlWBF1BxJmhFsfgiXQ0aYILbjwJkSi0oq51rGXpSiqHaSNnuL+qfPuPBXzv3gmw5mWyeIsIRoLGSJvnpaXUWs6aWSTVvTtKmacOc703I5EpAa8Oc2TU5J9xxXD/bmZoTSRa9Bhudy5I1j6fjsxopAZ63pshgSTa6wclU6YzukEizcV+rhw5r5QHHHdl9zwCniZGKTp0aSW/Xnk0ZOK7wFhbjSnGAmhvBZ5AiervgdPVLQDOh+LvQ3YUKT9FF1jJKRqtTOkTR7J8j+yW1pigzwqrff9bWoHGkqneORMblUPy922eSxsgyLaxQ9IMZmq8o9YIPOMSa4IFWZor/PMyxdp3Nj4SVxBJq4kT9C6nttU5OsmP1MIYXzf22yRFUe7Z+1mGuzE6dAd0zNhqsktG9ROLsVXWP3n9cQSG1dV5I7hI3fySY4oFSpzLXiPlwLXb7/A0nxStB1UH5tG+27f9PQBfEiUCGtws6k1ZaIKJyxE/ISKgUDx/UpiADiV2kG/zz4lXSO" enid="2">This section is encrypted. Click <a href="javascript:void(0)" onclick="decryptui(2)">here</a>
+to decrypt. <noscript>Note that you need have JavaScript enabled for decryption.</noscript></encrypted>
+<h3 id="tocanch31" class="tvis">技能树</h3>
+<p>
+作为一个一向「不务正业」的人,不可缺少的一点就是「在技能树上乱点」(语出BLBLB),虽然我的技能树可能没前面提到的那位的枝叶繁茂。。。
+</p>
+<p>
+那么下面简单列一下这学年我都点了些什么技能……<a id="n31" href="#note31" class="note">[31]</a>
+</p><ul>
+<li>C/C++:QMP/BLR/SMELT:4</li>
+<li>OpenGL 2.0-:SMELT/Compiz:3</li>
+<li>OpenGL 3.0+:CrossNoodlesJS/Compiz:5</li>
+<li>HTML:chrisoft.org:3</li>
+<li>CSS:chrisoft.org:1</li>
+<li>JavaScript:chrisoft.org:5</li>
+<li>PHP:chrisoft.org:3</li>
+<li>Algorithm/DataStructure:ACM:6</li>
+<li>Python:ACM/乱搞:7</li>
+<li>Bash:乱搞:4</li>
+<li>SONAR/composing:乱搞:1</li>
+<li>Electronics:乱搞:5</li>
+</ul>
+<p></p>
+<p>
+因为垃圾桶不是个立flag的好地方,而且写下这段文字的时候,已经距创建本文档有快半年的时间了……所以就不立什么flag了。
+</p>
+<p>
+<s>顺便提一句,你一定要问我对乱点技能树资磁不资磁……年轻人就是要努力提高志己的姿势水平嘛……我怎么能不支持呢?</s>
+</p>
+<h3 id="tocanch32" class="tvis">未来?</h3>
+<p>
+也许对一个刚刚大一结束的我来说,谈未来有点为时尚早。但是在我发现大学一年来我没有取得什么「全新突破性」的进展之后,
+深切感到了一种「自己不会四年下来就这样了吧」的危机。所以打算找个目标为自己提供动力……
+</p>
+<h5 id="tocanch33" class="tvis">出国?</h5>
+<p>
+如果是去说英语的国家的话,那么语言应该不是什么大问题。然而看到国外强校的要求和自己有点尴尬的GPA,还有某仍未解决的挂掉的体育,
+感觉这条路黯淡了不少……
+</p>
+<p>
+如果要走这条路的话,可能真的得「苦练硬气功」吧<a id="n32" href="#note32" class="note">[32]</a>。。。
+</p>
+<h5 id="tocanch34" class="tvis">靠ACM吃饭?</h5>
+<p>
+也许是目前看来最有希望的一条路。如果搞出大新闻可以有很多可供选择的选项呢……
+</p>
+<p>
+然而想要搞出大新闻必须改变现在处于半抱大腿状态的现状……好像还是得苦练硬气功。。。
+</p>
+<h5 id="tocanch35" class="tvis">考研/保研?</h5>
+<p>
+体育挂了你还想保研?
+</p>
+<p>
+研究生考试考政治你还敢去玩?
+</p>
+<h5 id="tocanch36" class="tvis">直接工作?</h5>
+<p>……去奇怪的公司当苦力?</p>
+<h5 id="tocanch37" class="tvis">「自由职业」?</h5>
+<p>=啃老?</p>
+<h5 id="tocanch38" class="tvis">曾经考虑过的「最佳选项」?</h5>
+<a id="n33" href="#note33" class="note">[33]</a>
+<p>
+这种工作真的好找?
+</p>
+<p>
+真的会有自由时间?
+</p>
+<p>
+想搞什么?
+</p>
+<h4 id="tocanch39" class="tvis">结论</h4>
+<p>看来还是得苦练硬气功……</p>
+<h3 id="tocanch40" class="tvis">其他生活垃圾</h3>
+<h4 id="tocanch41" class="tvis">校园改造</h4>
+<p>
+都说一图胜千言,这里有好几张图。
+</p>
+<a href="//filestorage.chrisoft.org/blog/img/p1.jpg">破碎的道路</a><br>
+<a href="//filestorage.chrisoft.org/blog/img/p2.jpg">几天后上图中的路的景象</a><br>
+<a href="//filestorage.chrisoft.org/blog/img/p3.jpg">宿舍楼走廊</a><br>
+<a href="//filestorage.chrisoft.org/blog/img/p4.jpg">满是泥巴的路</a><br>
+<a href="//filestorage.chrisoft.org/blog/img/p5.jpg">教学楼内</a><br>
+<a href="//filestorage.chrisoft.org/blog/img/p6.jpg">刚刚经历了世界末日的宿舍楼</a>
+<p>
+——来自一所一放假就施工的高校。
+</p>
+<h4 id="tocanch42" class="tvis">天气</h4>
+<p>
+虽然济南是否能上榜四大火炉一直是一个有争论的话题,但是对于一个家在海边,没见过几次40度高温的我来说,济南还是让我开了眼。
+加上宿舍楼还没有空调<a id="n34" href="#note34" class="note">[34]</a>,所以如何在这种环境中存活下来,也变成了一个相当具有挑战性的话题。
+当时因为没有属于自己的床,所以没好意思在有空调的实验室睡。于是就只能在宿舍里面想办法苟。一次偶然的机会,
+我发现某室友在宿舍中留下的密封袋,在里面灌上水之后枕着非常爽。<a id="n35" href="#note35" class="note">[35]</a>
+于是买了个注水枕(冰枕),配合上扇子等等传统的消暑工具,苟过了我在济南度过的第一个夏天。
+</p>
+<h4 id="tocanch43" class="tvis">假期的宿舍环境</h4>
+<p>
+放了假,宿舍楼的公共区域清扫的频率也降低了。于是垃圾桶溢出这种事情就变成了常事。有时还经常见到硕鼠的光顾。宿舍里则是小强泛滥。
+基于一种大多数人都有的、来历不明的对小强的恶心,我一开始拿他们并无办法。到后来眼看小强数量马上就要达到环境承载量、
+开门的时候可能会有小强直接掉下来的时候,我直接祭出了最后手段:生化武器。你别说这东西倒还真管用。
+第二天早上宿舍就遍地都是小强的尸体,清扫出去之后,此后相当长的一段时间再也没有见到过小强。
+</p>
+<p>
+后来在自己贮存在宿舍的棉棒里发现了小强的卵鞘……一包几乎没用过的棉签就这么丢掉了。。。
+</p>
+<h3 id="tocanch44" class="tvis">后记</h3>
+<p>
+自6月21日开始写这篇「垃圾桶」到今天基本完成,已过去了半年零三天。这段时间里,除了少量的那么几天,自己实在是怠惰得不得了。
+再也找不到高三的那种为一个明确的目标奋斗的那种感觉了呢。
+</p>
+<p>
+<s>啥?我高三奋斗过?</s>
+</p>
+<p style="text-align:right;">
+2016-12-24
+</p>
+</article>
+</div><br><hr>
+ <div class="TText" id="notediv" style="font-size:80%;"><span class="TText"><a id="note1" href="#n1">[1]</a>: 本文的标题于20160713由Trash dump for June 2016改为了Trash dump for the first academic year……(大概是读了BLBLB的什么东西受到了某种刺激..)于是这篇文章的完成显得更加遥遥无期了。。。<br></span><span class="TText"><a id="note2" href="#n2">[2]</a>:
+@160721002529<br>
+诶呀我果然还是太懒了呀……看起来这个垃圾桶的坑是越来越大感觉要填不完了。。。<br>
+不过最近也挺忙的……被多校联合虐完又去切cf然后差点掉分……感觉身体被掏空。(算是给自己找个借口。。)
+<br></span><span class="TText"><a id="note3" href="#n3">[3]</a>: 补记於2016-07-24 01:06 地狱般的宿舍<br></span><span class="TText"><a id="note4" href="#n4">[4]</a>: 嗯……此部分为2016/11/04补记<br></span><span class="TText"><a id="note5" href="#n5">[5]</a>: <s>大概是把写游戏的时候积累的经验搬过来</s><br></span><span class="TText"><a id="note6" href="#n6">[6]</a>: 其实大概是我跟他谁会谁写...<br></span><span class="TText"><a id="note7" href="#n7">[7]</a>: 来自强省强校、校内相对较弱的yxz还是直接秒杀来自弱省强校的渣渣我<br></span><span class="TText"><a id="note8" href="#n8">[8]</a>: 比较传统的父母一般都会持有像「玩物丧志」、「不许说脏话」这样的观点。<br></span><span class="TText"><a id="note9" href="#n9">[9]</a>: 在他们能管到的时候。希望他们看不到这篇博客!<br></span><span class="TText"><a id="note10" href="#n10">[10]</a>: 这游戏关卡是从0开始计数的所以其实是第四关。。诶我好像还在为我的低智商辩解...<br></span><span class="TText"><a id="note11" href="#n11">[11]</a>: 人类总是在重复同样的悲剧<br></span><span class="TText"><a id="note12" href="#n12">[12]</a>: 一般一局纸牌类游戏我不会玩10分钟以上,有难度的规则的不会玩30分钟以上<br></span><span class="TText"><a id="note13" href="#n13">[13]</a>: 这里面还有一半是超过仿Super Mario World的游戏……<br></span><span class="TText"><a id="note14" href="#n14">[14]</a>: 通关大概是2004年左右的事情。当时大概是我爸先通了然后不久之后我也通了……<br></span><span class="TText"><a id="note15" href="#n15">[15]</a>: 大概是……只管把自己当时想说的吐出来,根本不在意别人或自己的感受(这也是为什么我是--T-而不是--F-)<br></span><span class="TText"><a id="note16" href="#n16">[16]</a>: 虽然不知道是不是INT*都是这样,但是我个人是基本上不计前嫌的——只要现在没有什么问题的话<br></span><span class="TText"><a id="note17" href="#n17">[17]</a>: INTP就喜欢造轮子2333。
+<a href="https://www.16personalities.com/intp-strengths-and-weaknesses">reference</a>(@Loathe Rules and Guidelines)<br></span><span class="TText"><a id="note18" href="#n18">[18]</a>: 具体的变更可以在<a href="https://chrisoft.org/History">这里</a>看到。<br></span><span class="TText"><a id="note19" href="#n19">[19]</a>: 由于可以归咎于性格的表达困难和懒。<br></span><span class="TText"><a id="note20" href="#n20">[20]</a>: 这跟去年学长说的完全不一样啊喂……<br></span><span class="TText"><a id="note21" href="#n21">[21]</a>: 在家里人不知情的情况下。<br></span><span class="TText"><a id="note22" href="#n22">[22]</a>: 这个部分可能会脱离「本学年」的namespace。<br></span><span class="TText"><a id="note23" href="#n23">[23]</a>: 知道東方project这个东西的存在则可以回到2010年。当时看见pz在打th08。我从他那里拷了一份,
+后来还专门从网上下了bgm播放器来听bgm……不过当时听了并没有什么感觉……<br></span><span class="TText"><a id="note24" href="#n24">[24]</a>: 忘记是哪个群了……有可能是BKT也可能是某当时只有3人的小群。<br></span><span class="TText"><a id="note25" href="#n25">[25]</a>: 不过我就是喜欢那种风格……想要图?没有!。。<br></span><span class="TText"><a id="note26" href="#n26">[26]</a>: 最近那真乱。<br></span><span class="TText"><a id="note27" href="#n27">[27]</a>: WARNING: 这个部分的内容是我试图在理解自己……所以说可能会比较奇怪。<br></span><span class="TText"><a id="note28" href="#n28">[28]</a>:
+仅仅是能互相开玩笑的,不能算什么朋友。我认为真正的朋友无需互相隐藏什么,更不用以谎言互相欺骗。这么来看的话,我的身边大概从来没有过「真正的朋友」吧。2016-07-27 3:52:19
+<br></span><span class="TText"><a id="note29" href="#n29">[29]</a>:
+然而我当年也不是什么「多硬朗的汉子」(现在也不是(
+<br></span><span class="TText"><a id="note30" href="#n30">[30]</a>: md我的毒奶真是……果然就分了。不过这大约是个必然事件吧。<br></span><span class="TText"><a id="note31" href="#n31">[31]</a>: 格式:技能:来历:点数,点数大致对应about页面skills里面的打分<br></span><span class="TText"><a id="note32" href="#n32">[32]</a>: watch?v=a0nbfIRycco<br></span><span class="TText"><a id="note33" href="#n33">[33]</a>: 如果你不知道最佳选项是什么:找个在中学教计算机课的工作,自由时间搞自己想搞的东西。<br></span><span class="TText"><a id="note34" href="#n34">[34]</a>: 正在安装。<br></span><span class="TText"><a id="note35" href="#n35">[35]</a>: 然而那个密封袋在后来换水的时候炸掉了……<br></span></div>
+ <div id="insanch" style="height:3em;"></div>
+ <div id="footer" style="">
+ <div id="pagesw" class="TText" style="width:100%;height:0.5em;"></div>
+ <div style="text-align:center;" class="TText">
+ Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5
+ <br>
+ Content licensed under CC BY-SA 4.0. <span id="purgep" style="display:none;font-size:70%;">This page has passphrase(s) stored. Click <a href="javascript:_purgep()">here</a> to purge.</span>
+ </div>
+ </div>
+ <div id="cmdbuf" class="TText" style="transition:500ms;padding:1em;font-size:2em;color:white;position:absolute;background-color:rgba(0,0,0,0.6);left:50%;top:50%;transform:translate(-50%,-50%);pointer-events:none;opacity:0;">
+ </div>
+ </div>
+ <div id="decryptui" style="display:none;opacity:0;color:white;z-index:1000;position:fixed;left:0;top:0;width:100%;height:100%;background-color:rgba(0,0,0,0.4);transition:opacity 0.5s;">
+ <div id="decryptdlg" class="TText" style="padding:10px 20px;position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);background-color:rgba(0,0,0,0.6);">
+ <div id="keyhint" style="margin-bottom:8px;"></div>
+ <div style="margin-bottom:8px;">Key: <input id="keyinp" type="text" style="color:#fff;"></div>
+ <div style="height:2.25em;">
+ <button id="btndecrypt" onclick="decryptor(decid,document.getElementById('keyinp').value);" style="position:absolute;left:20px;">Decrypt</button>
+ <button onclick="hidedecryptui();" style="position:absolute;right:20px;">Cancel</button>
+ </div>
+
+ </div>
+
+
+</div></body></html> \ No newline at end of file
diff --git a/blog/post/2016-09-24.html b/blog/post/2016-09-24.html
new file mode 100644
index 0000000..0de4d43
--- /dev/null
+++ b/blog/post/2016-09-24.html
@@ -0,0 +1,230 @@
+<html><head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<meta name="theme-color" content="#000000">
+<title>Chrisoft::Blog</title>
+<script type="text/javascript" src="/panel.js"></script>
+<script type="text/javascript" src="/blog/footnoter.js"></script>
+<script type="text/javascript" src="/blog/aes-js.js"></script>
+<script type="text/javascript" src="/blog/scrypt.js"></script>
+<script type="text/javascript" src="/blog/sha256.js"></script>
+<script type="text/javascript" src="/blog/decryptor.js"></script>
+<link rel="stylesheet" type="text/css" href="/common.css">
+<link rel="stylesheet" type="text/css" href="/panel.css">
+<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
+<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
+<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
+<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
+<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
+<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
+<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
+<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
+<link rel="stylesheet" type="text/css" href="/blog/blogext.css">
+<script>
+function ol()
+{
+ window.onresize=function()
+ {
+ if(window.innerWidth<768)
+ setupevents();
+ else unsetevents();
+ }
+ window.onresize();
+ _decryptonload();
+}
+function loadTheme(){
+ var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
+ if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
+ var ent="";
+ var d=new Date();
+ if(thm[0]=='z')
+ {
+ var m=d.getMonth()+1;
+ if(m>=3&&m<6)thm='0'+thm[1];
+ else if(m>=6&&m<9)thm='1'+thm[1];
+ else if(m>=9&&m<12)thm='2'+thm[1];
+ else thm='3'+thm[1];
+ }
+ if(thm[1]=='z')
+ {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
+ ent=`theme${thm}`;
+ var R=new RegExp('theme[0-4][ab]');
+ for(var i=0;i<document.styleSheets.length;++i)
+ {
+ if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
+ document.styleSheets[i].disabled=true;
+ else document.styleSheets[i].disabled=false;
+ }
+ var thmcolor="";
+ switch(thm[0])
+ {
+ case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break;
+ case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break;
+ case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break;
+ case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break;
+ }
+ document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor);
+}
+loadTheme();
+</script>
+</head>
+<body onload="ol()" style="overflow-x:hidden;">
+ <div id="panel" class="TText">
+ <ul id="panellist">
+ <li><a href="/"><h1>Chrisoft</h1></a></li>
+ <li><a href="/blog"><h2>Blog</h2></a></li>
+ <li><a href="#"><h3 id="title">2-in-1</h3></a></li>
+ <li><span>Tags</span>
+ <ul id="tagslist">
+ <li><a href="/blog/list/devel/">devel</a></li><li><a href="/blog/list/qmidiplayer/">qmidiplayer</a></li><li><a href="/blog/list/c++/">c++</a></li><li><a href="/blog/list/qt/">qt</a></li></ul>
+ </li>
+ <li id="tocouter">
+ <span>Table of Contents</span>
+ <ul id="tocroot">
+ <li><a class="toctarg" href="#tocanch0">UPD 2016-10-28</a></li><li><ul class="tocnode"><li><a class="toctarg" href="#tocanch1">BUT THAT'S NOT THE END OF THE STORY.</a></li></ul></li><li><a class="toctarg" href="#tocanch2">UPD@2016-12-28</a></li></ul>
+ </li>
+ <li style="margin-left:-0.5em"><a id="prevp" href="2016-06-21.html">Prev post</a></li>
+ <li style="margin-left:-0.5em"><a id="nextp" href="2017-01-09.html">Next post</a></li>
+ </ul>
+ </div>
+ <div id="content">
+ <h2 id="titleh" class="TText" style="font-wight:normal;">2-in-1</h2>
+ <div id="datetags" class="TText" style="margin-bottom:1em;">2016-09-24<br>#devel #qmidiplayer #c++ #qt</div>
+ <hr><div id="article" class="TText">
+<article>
+<p>
+The visualization plugin for QMidiPlayer in Linux has suffered from a dbus-related bug for a long time:
+after you have opened the visualization window, close it and try to bring it up again, it will either
+result in several lines of dbus warning which suggests there's a bug in the program (on Debian sid),
+or simply a crash (on Arch Linux).
+</p>
+<p>
+Well, I have to admit the design of QMidiPlayer's visualization architecture is pretty weird:
+the visualization plugin spawns its own thread and do almost everything in it. After doing some
+research on the Internet, I realized that everyone suggests that Qt and SDL <i>shouldn't</i> be
+used together, "use QtOpenGL instead". However I thought that will hang the main UI thread and
+I just don't believe in the myth.
+</p>
+<p>
+So I started my investigation in early May. I even opened an related issue on github. Unfortunately nobody
+offered help. So I had to solve the issue myself. First I had a look into the dbus warnings:
+</p><pre style="white-space: pre-wrap;">process &lt;PID&gt;: arguments to dbus_connection_unref() were incorrect, assertion "connection-&gt;generation == _dbus_current_generation" failed in file ../../dbus/dbus-connection.c line 2822.
+This is normally a bug in some application using the D-Bus library.
+</pre>
+<p></p>
+<p>
+Qt definitely uses dbus. After spitting these into stderr, QMidiPlayer crashes instantly in the
+QDBusConnection thread. Googling the warning turned out nothing. Then I came across with this blog post
+from a KDE developer:<br>
+<a href="https://blogs.kde.org/2009/03/26/how-crash-almost-every-qtkde-application-and-how-fix-it-0">https://blogs.kde.org/2009/03/26/how-crash-almost-every-qtkde-application-and-how-fix-it-0</a>
+</p>
+<p>
+Unfortunately, after applying the "fix", the bug didn't change even a little bit. So I had to move on.
+</p>
+<h3 id="tocanch0" class="tvis">UPD 2016-10-28</h3>
+<p>
+After several months' idleness of the investigation due to the lack of idea, I suddenly decided to have
+a look at all dbus calls when QMidiPlayer crashes. Then I found the following dbus call:
+</p><pre style="white-space: pre-wrap;">path=/org/freedesktop/ScreenSaver; interface=org.freedesktop.ScreenSaver; method=Inhibit;
+string "My SDL application"
+string "Playing a game"
+</pre>
+<p></p>
+<p>
+Apparently SDL is also using dbus to do some dirty work -- disabling the screen saver! So I appended
+SDL_EnableScreenSaver in SMELT's init function. Unfortunately, nothing happened again. However I've
+guessed out the cause to the problem: <b>both Qt and SDL try to initialize a dbus connection in <i>one</i>
+process, which is not allowed. So I have to get rid of either one of them.</b>
+</p>
+<p>
+Therefore I began to port the SMELT engine to GLFW. After two days of work, the port was finished and it worked
+like a charm -- I have solved the problem!
+</p>
+<h4 id="tocanch1" class="tvis">BUT THAT'S NOT THE END OF THE STORY.</h4>
+<p>
+Driven by the unstoppable merriness after fixing a long-existed bug, I started to build GLFW version of
+SMELT for Windows. The process was painful but finally I managed to do it successfully. After that
+it's time to compile the visualization library. A beautiful DLL file, sized 1096192 bytes, was produced.
+This build is almost 4x smaller than the previous failed mingw build and I regarded this as a omen of
+fortune.
+</p>
+<p>
+I put the DLL file into the plugin folder of QMidiPlayer and launched the application. No errors occured
+as the mingw build once caused and the plugin showed up correctly in the plugin manager. I was so excited
+that I turned on the plugin immediately and I couldn't wait to announce the result to my friends. However
+when I hit the visualization I was greeted by a déjà vu scene.
+</p>
+<img src="//filestorage.chrisoft.org/blog/img/qmpcrash.png" alt="" width="70%" decoding="async">
+<p>
+And this nasty little dialog from the Windows 2000 era.
+</p>
+<img src="//filestorage.chrisoft.org/blog/img/couldntbewritten.png" alt="" width="40%" decoding="async">
+<p>
+So another tale of a battle between a fierce bug and me is due to happen. <s>Stay tuned and watch the fight!</s>
+</p>
+<a id="n1" href="#note1" class="note">[1]</a>
+<h3 id="tocanch2" class="tvis">UPD@2016-12-28</h3>
+<p>
+So the bug has been (mostly) fixed by the following two commits!<br>
+<a href="https://github.com/chirs241097/QMidiPlayer/commit/b79c4b7e3cab3711e87ba9e28fa8423a84ea7efa">b79c4b7e3cab3711e87ba9e28fa8423a84ea7efa@QMidiPlayer</a><br>
+<a href="https://github.com/BearKidsTeam/SMELT/commit/b13f72857af93489f535b84d62882f681dc84a73">b13f72857af93489f535b84d62882f681dc84a73@SMELT</a><br>
+</p>
+<p>
+Basically the most tough part to debug is caused by the stupidest typo...
+</p><pre style="padding-left:20px;border:1px white solid;">@@ -62,7 +62,7 @@ bool SMELT_IMPL::smInit()
+ else if(i==0x80000004)
+ memcpy(cpuName+32, CPUInfo, sizeof(CPUInfo));
+ }
+ - while(*cpuName=' ')++cpuName;
+ + while(*cpuName==' ')++cpuName;
+ smLog("%s:" SLINE ": CPU: %s\n", SYS_SDL_SRCFN,cpuName);
+ free(loced);
+</pre>
+<p></p>
+<p>
+This naïve mistake screwed up the memory and this should be the cause that made the debugger report different stack traces in different build modes...
+(that reminds me of the experience of screwing up the call stack, in which the backtrace was filled up by "0x0000000000000000 in ??()"...)
+</p>
+<p>
+After having fixed this, it was much easier to debug the application. Soon afterwards the first working visualization plugin for QMP on Windows
+came out.
+</p>
+<p>
+Finally I have to make more complaints about the develop environment for a cross-platform C++ application developer in Microsoft Windows.
+It's bloated, complicated and confusing. I wonder whether Microsoft is deliberately making it difficult in order to force more developers
+to migrate to C#/.Net. What a big ambition Microsoft is bearing!
+</p>
+<article>
+</article></article></div><br><hr>
+ <div class="TText" id="notediv" style="font-size:80%;"><span class="TText"><a id="note1" href="#n1">[1]</a>:
+ Current status of the bug in Windows:<br>
+ Release build QMidiPlayer+Release build plugin=crash at somewhere in visualization.dll.<br>
+ Release build QMidiPlayer+Debug build plugin=crash at somewhere in Qt5Core.dll.<br>
+ Debug build QMidiPlayer+Debug build plugin=crash instantly on launch at plugin initialization.<br>
+I have totally no idea about what to do next.
+<br></span></div>
+ <div id="insanch" style="height:3em;"></div>
+ <div id="footer" style="">
+ <div id="pagesw" class="TText" style="width:100%;height:0.5em;"></div>
+ <div style="text-align:center;" class="TText">
+ Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5
+ <br>
+ Content licensed under CC BY-SA 4.0. <span id="purgep" style="display:none;font-size:70%;">This page has passphrase(s) stored. Click <a href="javascript:_purgep()">here</a> to purge.</span>
+ </div>
+ </div>
+ <div id="cmdbuf" class="TText" style="transition:500ms;padding:1em;font-size:2em;color:white;position:absolute;background-color:rgba(0,0,0,0.6);left:50%;top:50%;transform:translate(-50%,-50%);pointer-events:none;opacity:0;">
+ </div>
+ </div>
+ <div id="decryptui" style="display:none;opacity:0;color:white;z-index:1000;position:fixed;left:0;top:0;width:100%;height:100%;background-color:rgba(0,0,0,0.4);transition:opacity 0.5s;">
+ <div id="decryptdlg" class="TText" style="padding:10px 20px;position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);background-color:rgba(0,0,0,0.6);">
+ <div id="keyhint" style="margin-bottom:8px;"></div>
+ <div style="margin-bottom:8px;">Key: <input id="keyinp" type="text" style="color:#fff;"></div>
+ <div style="height:2.25em;">
+ <button id="btndecrypt" onclick="decryptor(decid,document.getElementById('keyinp').value);" style="position:absolute;left:20px;">Decrypt</button>
+ <button onclick="hidedecryptui();" style="position:absolute;right:20px;">Cancel</button>
+ </div>
+
+ </div>
+
+
+</div></body></html> \ No newline at end of file
diff --git a/blog/post/2017-01-09.html b/blog/post/2017-01-09.html
new file mode 100644
index 0000000..6b1ea2a
--- /dev/null
+++ b/blog/post/2017-01-09.html
@@ -0,0 +1,243 @@
+<html><head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<meta name="theme-color" content="#000000">
+<title>Chrisoft::Blog</title>
+<script type="text/javascript" src="/panel.js"></script>
+<script type="text/javascript" src="/blog/footnoter.js"></script>
+<script type="text/javascript" src="/blog/aes-js.js"></script>
+<script type="text/javascript" src="/blog/scrypt.js"></script>
+<script type="text/javascript" src="/blog/sha256.js"></script>
+<script type="text/javascript" src="/blog/decryptor.js"></script>
+<link rel="stylesheet" type="text/css" href="/common.css">
+<link rel="stylesheet" type="text/css" href="/panel.css">
+<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
+<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
+<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
+<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
+<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
+<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
+<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
+<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
+<link rel="stylesheet" type="text/css" href="/blog/blogext.css">
+<script>
+function ol()
+{
+ window.onresize=function()
+ {
+ if(window.innerWidth<768)
+ setupevents();
+ else unsetevents();
+ }
+ window.onresize();
+ _decryptonload();
+}
+function loadTheme(){
+ var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
+ if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
+ var ent="";
+ var d=new Date();
+ if(thm[0]=='z')
+ {
+ var m=d.getMonth()+1;
+ if(m>=3&&m<6)thm='0'+thm[1];
+ else if(m>=6&&m<9)thm='1'+thm[1];
+ else if(m>=9&&m<12)thm='2'+thm[1];
+ else thm='3'+thm[1];
+ }
+ if(thm[1]=='z')
+ {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
+ ent=`theme${thm}`;
+ var R=new RegExp('theme[0-4][ab]');
+ for(var i=0;i<document.styleSheets.length;++i)
+ {
+ if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
+ document.styleSheets[i].disabled=true;
+ else document.styleSheets[i].disabled=false;
+ }
+ var thmcolor="";
+ switch(thm[0])
+ {
+ case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break;
+ case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break;
+ case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break;
+ case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break;
+ }
+ document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor);
+}
+loadTheme();
+</script>
+</head>
+<body onload="ol()" style="overflow-x:hidden;">
+ <div id="panel" class="TText">
+ <ul id="panellist">
+ <li><a href="/"><h1>Chrisoft</h1></a></li>
+ <li><a href="/blog"><h2>Blog</h2></a></li>
+ <li><a href="#"><h3 id="title">[多大图警告]终究还是改不了修电脑的命</h3></a></li>
+ <li><span>Tags</span>
+ <ul id="tagslist">
+ <li><a href="/blog/list/computer-repairing/">computer-repairing</a></li><li><a href="/blog/list/garbage/">garbage</a></li></ul>
+ </li>
+ <li id="tocouter" style="display: none;">
+ <span>Table of Contents</span>
+ <ul id="tocroot">
+ </ul>
+ </li>
+ <li style="margin-left:-0.5em"><a id="prevp" href="2016-09-24.html">Prev post</a></li>
+ <li style="margin-left:-0.5em"><a id="nextp" href="2017-01-18.html">Next post</a></li>
+ </ul>
+ </div>
+ <div id="content">
+ <h2 id="titleh" class="TText" style="font-wight:normal;">[多大图警告]终究还是改不了修电脑的命</h2>
+ <div id="datetags" class="TText" style="margin-bottom:1em;">2017-01-09<br>#computer-repairing #garbage</div>
+ <hr><div id="article" class="TText">
+<article>
+<blockquote class="twitter-tweet" data-lang="en"><p lang="zh" dir="ltr">一张贴膜引发的血案</p>— Chris Xiong (@chirs241097) <a href="https://twitter.com/chirs241097/status/817406091004739585">January 6, 2017</a></blockquote>
+<script async="" src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
+
+<p>
+于是又是一顿折腾。
+</p>
+<p>
+一月六日购得X1 yoga用贴膜一张。到货后决定撕除原来的防眩膜,把新到的膜直接贴在屏幕上。撕膜时过于暴力已经起开了屏幕顶端的几个卡扣。
+贴膜的时候却又发现这张新膜真的是「天衣无缝」——宽度恰好与屏幕等同,稍有偏差便无法贴合。于是无数次尝试之后终于似乎找到了正确的位置。
+后来在排气泡的时候发现有个气泡十分倔强,丝毫没有往外跑的意思。接下来就开始上手……然后就听到了清脆的一声响。
+</p>
+<p>
+「咔」
+</p>
+<p>
+起初我以为只是外面的一层玻璃断了,没什么大碍,然后我很快发现情况比这要复杂一些……
+</p>
+<p>
+——Wacom的所有东西都不能用了啊啊啊!!!
+</p>
+<p>
+然后我就慌了。。也不管什么贴膜了,先修屏幕啊。于是开始寻找附近的联想服务提供商,突然想到我这种海外购买而且还是「蓄意损坏」的大概与保修无缘……
+就开始考虑自己动手的事情了。
+</p>
+<p>
+X宝上一通乱搜之后找到几家卖对应型号屏幕的店。X1 yoga的屏幕并不分内外屏而是只有一个屏幕总成——这也就意味着在更换的时候需要带着下面并没有损坏的、
+那块2560x1440的高分屏一起换掉……这价格要上天啊!!不管了,救电脑要紧。。。没有Wacom的X1 yoga跟咸鱼X1 carbon有什么区别……于是随便找了家店谈妥之后,
+950大洋瞬间甩走了……
+</p>
+<p>
+等到货的同时就开始拆电脑。联想有一个好,几乎所有型号机器的维修指南都可以在<a href="www.lenovoservicetraining.com">这里</a>找到。
+下载了所有X1 yoga的教程之后就开始学习……然后就瞬间感觉自己成为专业的维修人士了。。
+</p>
+<p>
+拆机过程还是比较顺利的,<s>毕竟小时候拆了家里的那么多东西,</s><span style="position:relative;">虽然后来装起来而且仍然能正常工作的没有几个。<span style="position:absolute;left:0;right:0;top:45%;bottom:35%;border-top:1px solid #FFF;border-bottom:1px solid #FFF;"></span></span>
+</p>
+<p>
+装起来就有些困难了。虽然对于教学视频里面的专业人士来说都相当简单,但是对我来说还是……嗯一开始还打算把LTE模块的天线塞进屏幕壳,后来走线时似乎不小心走到了本来应该是卡扣所在的地方,
+于是就糊掉了两个卡扣,这也直接导致了后来组装起来之后屏幕关不紧而且侧面有些许漏光这些后果。不过,总算还是装起来了……而上面那个问题,也许只有502之类的东西能解决了。。。
+</p>
+<p>
+总结一下,现在所有功能都能正常使用,除了因为上述原因导致的屏幕翻折时屏幕一角会稍稍翘起以及侧面漏光之外,没有太大问题。差不多就写这么多<reduced><s>后天还要考离散数学</s></reduced>,下面是放图时间(图片排列按照时间顺序)。
+</p>
+<table style="max-width:90%;margin:auto;">
+<tbody><tr>
+<td>
+<a href="//filestorage.chrisoft.org/blog/img/IMG_20170107_183057.jpg"><img src="//filestorage.chrisoft.org/blog/img/IMG_20170107_183057.jpg" width="50%" decoding="async"></a><br>
+刚拆下主板<br>
+</td>
+<td>
+<a href="//filestorage.chrisoft.org/blog/img/IMG_20170107_183300.jpg"><img src="//filestorage.chrisoft.org/blog/img/IMG_20170107_183300.jpg" width="50%" decoding="async"></a><br>
+取下屏幕后<br>
+</td>
+</tr>
+<tr>
+<td>
+<a href="//filestorage.chrisoft.org/blog/img/IMG_20170107_185104.jpg"><img src="//filestorage.chrisoft.org/blog/img/IMG_20170107_185104.jpg" width="50%" decoding="async"></a><br>
+LCD面板分离<br>
+</td>
+<td>
+<a href="//filestorage.chrisoft.org/blog/img/IMG_20170107_214649.jpg"><img src="//filestorage.chrisoft.org/blog/img/IMG_20170107_214649.jpg" width="50%" decoding="async"></a><br>
+感人的风扇<br>
+</td>
+</tr>
+<tr>
+<td>
+<a href="//filestorage.chrisoft.org/blog/img/IMG_20170107_214705.jpg"><img src="//filestorage.chrisoft.org/blog/img/IMG_20170107_214705.jpg" width="50%" decoding="async"></a><br>
+<s>铜!!</s><br>
+</td>
+<td>
+<a href="//filestorage.chrisoft.org/blog/img/IMG_20170107_214726.jpg"><img src="//filestorage.chrisoft.org/blog/img/IMG_20170107_214726.jpg" width="50%" decoding="async"></a><br>
+照相机、麦克风以及传感器们<br>
+</td>
+</tr>
+<tr>
+<td>
+<a href="//filestorage.chrisoft.org/blog/img/IMG_20170107_220652_1.jpg"><img src="//filestorage.chrisoft.org/blog/img/IMG_20170107_220652_1.jpg" width="50%" decoding="async"></a><br>
+上:i7-2670QM,下:i7-6600U。6600U迷一般的封装。<br>
+</td>
+<td>
+<a href="//filestorage.chrisoft.org/blog/img/IMG_20170107_223551.jpg"><img src="//filestorage.chrisoft.org/blog/img/IMG_20170107_223551.jpg" width="50%" decoding="async"></a><br>
+这次可以把它拿出来拍了。<br>
+</td>
+</tr>
+<tr>
+<td>
+<a href="//filestorage.chrisoft.org/blog/img/IMG_20170107_223605.jpg"><img src="//filestorage.chrisoft.org/blog/img/IMG_20170107_223605.jpg" width="50%" decoding="async"></a><br>
+背面应该是为1TB的型号留的空间。<br>
+</td>
+<td>
+<a href="//filestorage.chrisoft.org/blog/img/IMG_20170107_223727.jpg"><img src="//filestorage.chrisoft.org/blog/img/IMG_20170107_223727.jpg" width="50%" decoding="async"></a><br>
+WLAN网卡和一只扬声器。<br>
+</td>
+</tr>
+<tr>
+<td>
+<a href="//filestorage.chrisoft.org/blog/img/IMG_20170107_224008.jpg"><img src="//filestorage.chrisoft.org/blog/img/IMG_20170107_224008.jpg" width="50%" decoding="async"></a><br>
+主板背面<br>
+</td>
+<td>
+<a href="//filestorage.chrisoft.org/blog/img/IMG_20170107_224141.jpg"><img src="//filestorage.chrisoft.org/blog/img/IMG_20170107_224141.jpg" width="50%" decoding="async"></a><br>
+主板正面<br>
+</td>
+</tr>
+<tr>
+<td>
+<a href="//filestorage.chrisoft.org/blog/img/IMG_20170109_092341.jpg"><img src="//filestorage.chrisoft.org/blog/img/IMG_20170109_092341.jpg" width="50%" decoding="async"></a><br>
+<s>挖矿卡</s><br>
+</td>
+<td>
+<a href="//filestorage.chrisoft.org/blog/img/IMG_20170109_230933.jpg"><img src="//filestorage.chrisoft.org/blog/img/IMG_20170109_230933.jpg" width="50%" decoding="async"></a><br>
+<s>尸体纪念</s><br>
+</td>
+</tr>
+</tbody></table>
+<div style="text-align:center;max-width:90%;"><a href="//filestorage.chrisoft.org/blog/img/IMG_20170107_224932.jpg"><img width="50%" src="//filestorage.chrisoft.org/blog/img/IMG_20170107_224932.jpg" decoding="async"></a></div>
+<p>
+最后奉劝大家不要像我一样暴力地使用或者对待电脑,<s>否则「世界阻止虐待电脑协会」的人会找上门来的!</s>
+</p>
+<blockquote class="twitter-tweet" data-lang="en"><p lang="zh" dir="ltr">自己动手修好了电脑然而耐久度下降了999点(所以世间最不幸的事情都无过于做一台属于我的电脑这话果然是真的啊( <a href="https://t.co/kuL5c5tXrs">pic.twitter.com/kuL5c5tXrs</a></p>— Chris Xiong (@chirs241097) <a href="https://twitter.com/chirs241097/status/818447177374572544">January 9, 2017</a></blockquote>
+<script async="" src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
+</article>
+</div><br><hr>
+ <div class="TText" id="notediv" style="font-size:80%;"></div>
+ <div id="insanch" style="height:3em;"></div>
+ <div id="footer" style="">
+ <div id="pagesw" class="TText" style="width:100%;height:0.5em;"></div>
+ <div style="text-align:center;" class="TText">
+ Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5
+ <br>
+ Content licensed under CC BY-SA 4.0. <span id="purgep" style="display:none;font-size:70%;">This page has passphrase(s) stored. Click <a href="javascript:_purgep()">here</a> to purge.</span>
+ </div>
+ </div>
+ <div id="cmdbuf" class="TText" style="transition:500ms;padding:1em;font-size:2em;color:white;position:absolute;background-color:rgba(0,0,0,0.6);left:50%;top:50%;transform:translate(-50%,-50%);pointer-events:none;opacity:0;">
+ </div>
+ </div>
+ <div id="decryptui" style="display:none;opacity:0;color:white;z-index:1000;position:fixed;left:0;top:0;width:100%;height:100%;background-color:rgba(0,0,0,0.4);transition:opacity 0.5s;">
+ <div id="decryptdlg" class="TText" style="padding:10px 20px;position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);background-color:rgba(0,0,0,0.6);">
+ <div id="keyhint" style="margin-bottom:8px;"></div>
+ <div style="margin-bottom:8px;">Key: <input id="keyinp" type="text" style="color:#fff;"></div>
+ <div style="height:2.25em;">
+ <button id="btndecrypt" onclick="decryptor(decid,document.getElementById('keyinp').value);" style="position:absolute;left:20px;">Decrypt</button>
+ <button onclick="hidedecryptui();" style="position:absolute;right:20px;">Cancel</button>
+ </div>
+
+ </div>
+
+
+</div></body></html> \ No newline at end of file
diff --git a/blog/post/2017-01-18.html b/blog/post/2017-01-18.html
new file mode 100644
index 0000000..d42c03c
--- /dev/null
+++ b/blog/post/2017-01-18.html
@@ -0,0 +1,509 @@
+<html><head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<meta name="theme-color" content="#000000">
+<title>Chrisoft::Blog</title>
+<script type="text/javascript" src="/panel.js"></script>
+<script type="text/javascript" src="/blog/footnoter.js"></script>
+<script type="text/javascript" src="/blog/aes-js.js"></script>
+<script type="text/javascript" src="/blog/scrypt.js"></script>
+<script type="text/javascript" src="/blog/sha256.js"></script>
+<script type="text/javascript" src="/blog/decryptor.js"></script>
+<link rel="stylesheet" type="text/css" href="/common.css">
+<link rel="stylesheet" type="text/css" href="/panel.css">
+<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
+<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
+<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
+<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
+<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
+<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
+<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
+<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
+<link rel="stylesheet" type="text/css" href="/blog/blogext.css">
+<script>
+function ol()
+{
+ window.onresize=function()
+ {
+ if(window.innerWidth<768)
+ setupevents();
+ else unsetevents();
+ }
+ window.onresize();
+ _decryptonload();
+}
+function loadTheme(){
+ var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
+ if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
+ var ent="";
+ var d=new Date();
+ if(thm[0]=='z')
+ {
+ var m=d.getMonth()+1;
+ if(m>=3&&m<6)thm='0'+thm[1];
+ else if(m>=6&&m<9)thm='1'+thm[1];
+ else if(m>=9&&m<12)thm='2'+thm[1];
+ else thm='3'+thm[1];
+ }
+ if(thm[1]=='z')
+ {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
+ ent=`theme${thm}`;
+ var R=new RegExp('theme[0-4][ab]');
+ for(var i=0;i<document.styleSheets.length;++i)
+ {
+ if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
+ document.styleSheets[i].disabled=true;
+ else document.styleSheets[i].disabled=false;
+ }
+ var thmcolor="";
+ switch(thm[0])
+ {
+ case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break;
+ case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break;
+ case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break;
+ case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break;
+ }
+ document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor);
+}
+loadTheme();
+</script>
+</head>
+<body onload="ol()" style="overflow-x:hidden;">
+ <div id="panel" class="TText">
+ <ul id="panellist">
+ <li><a href="/"><h1>Chrisoft</h1></a></li>
+ <li><a href="/blog"><h2>Blog</h2></a></li>
+ <li><a href="#"><h3 id="title">Trash dump for the third semester</h3></a></li>
+ <li><span>Tags</span>
+ <ul id="tagslist">
+ <li><a href="/blog/list/garbage/">garbage</a></li><li><a href="/blog/list/daily-life/">daily-life</a></li></ul>
+ </li>
+ <li id="tocouter">
+ <span>Table of Contents</span>
+ <ul id="tocroot">
+ <li><a class="toctarg" href="#tocanch0">课程相关</a></li><li><a class="toctarg" href="#tocanch1">ACM相关</a></li><li><ul class="tocnode"><li><a class="toctarg" href="#tocanch2">多校联合&amp;网络赛</a></li><li><a class="toctarg" href="#tocanch3">区域赛</a></li><li><a class="toctarg" href="#tocanch4">CCPC</a></li><li><a class="toctarg" href="#tocanch5">实验室纳新</a></li></ul></li><li><a class="toctarg" href="#tocanch6">其他乱七八糟的事情</a></li><li><ul class="tocnode"><li><a class="toctarg" href="#tocanch7">课余时间</a></li><li><a class="toctarg" href="#tocanch8">有进度的坑</a></li><li><ul class="tocnode"><li><a class="toctarg" href="#tocanch9">QMP</a></li><li><a class="toctarg" href="#tocanch10">SMELT</a></li><li><a class="toctarg" href="#tocanch11">chrisoft.org</a></li><li><a class="toctarg" href="#tocanch12">Compiz</a></li></ul></li><li><a class="toctarg" href="#tocanch13">无进度的坑</a></li><li><ul class="tocnode"><li><a class="toctarg" href="#tocanch14">BLR</a></li><li><a class="toctarg" href="#tocanch15">OJ</a></li></ul></li><li><a class="toctarg" href="#tocanch16">第二类坑</a></li><li><ul class="tocnode"><li><a class="toctarg" href="#tocanch17">绘画</a></li><li><a class="toctarg" href="#tocanch18">钢琴以及其他音乐相关</a></li></ul></li></ul></li><li><a class="toctarg" href="#tocanch19">上次就在这里的东西</a></li><li><a class="toctarg" href="#tocanch20">婊一婊辣鸡专科学校</a></li><li><ul class="tocnode"><li><a class="toctarg" href="#tocanch21">20170201补</a></li></ul></li><li><a class="toctarg" href="#tocanch22">神秘内容</a></li><li><a class="toctarg" href="#tocanch23">「技能树」</a></li><li><a class="toctarg" href="#tocanch24">生活垃圾</a></li><li><ul class="tocnode"><li><a class="toctarg" href="#tocanch25">造电脑</a></li><li><a class="toctarg" href="#tocanch26">修电脑</a></li></ul></li><li><a class="toctarg" href="#tocanch27">后记</a></li></ul>
+ </li>
+ <li style="margin-left:-0.5em"><a id="prevp" href="2017-01-09.html">Prev post</a></li>
+ <li style="margin-left:-0.5em"><a id="nextp" href="2017-02-13.html">Next post</a></li>
+ </ul>
+ </div>
+ <div id="content">
+ <h2 id="titleh" class="TText" style="font-wight:normal;">Trash dump for the third semester</h2>
+ <div id="datetags" class="TText" style="margin-bottom:1em;">2017-01-09<br>#garbage #daily-life</div>
+ <hr><div id="article" class="TText">
+<article>
+<p>
+从本学期开始,垃圾桶改为每学期一期。(目录消失啦,看左边吧。)
+</p>
+<style>
+article h2,article h3{border-bottom:1px solid #c0c0c0;overflow:hidden;}
+</style>
+<h2 id="tocanch0" class="tvis">课程相关</h2>
+<p>
+都说文化课最重要……<a id="n1" href="#note1" class="note">[1]</a>
+</p>
+<ul>
+ <li>概率论与数理统计:一开始听起来都是高中内容,后来出去比了个赛回来就啥都听不懂了……成绩混到了中间。</li>
+ <li>离散数学:一个班没有两个相同答案的组合分析和得分全靠rand()的代数系统。竟然混到了前1/5。</li>
+ <li>数据结构:非常幸运没被逐<a id="n2" href="#note2" class="note">[2]</a>。也许是本学期唯一一门能A+的课……</li>
+ <li>计算机组成原理:大概是吃着老本混到了1/4处。讲Cache的时候出去比赛然后回来又是一脸智障……</li>
+ <li>软件开发环境:考试的时候周围都在拿着手机抄的一门课……大概跟软件工程那课有一定交集。最后要求交一个C#做的工程,于是我就用1天用现成的库拼了一个C# IRC server/client...混到了前1/5。</li>
+ <li>高级程序设计语言(C++):不知道是不是教这课的那货看了我的About-skills,竟然给了跟我更新得分之前一样的分数。自然我是不信我在<em>他的</em>那份试题上只能得那个分数的。对于此结果我保留使用任何手段处置的权利。</li>
+</ul>
+<p>
+考了CET6,如果能给用户评论的话肯定是差评。<s>因为用户体验竟然跟CET4几乎无任何差别。</s>
+</p>
+<p>
+最后再插一句,实验室一位学习靠前的学长的Web技术课程被给了68分,查证之后发现是分数输入反了。后面的婊一婊辣鸡专科学校部分有更多精彩内容。
+</p>
+<h2 id="tocanch1" class="tvis">ACM相关</h2>
+<p>
+这学期的比赛比较多……尽管并非作为学校的一队,我们队还是得到了不少出去比赛的机会。
+</p>
+<h3 id="tocanch2" class="tvis">多校联合&amp;网络赛</h3>
+<p>
+这些比赛当中主力队还是学长的队伍。我们队虽然被要求跟着一起打但是工作无非就是打打酱油,帮学长们快速搞定水题而已。期间也有几次靠队内力量搞定了几道银牌题但是数量自然还是太少。
+绝大多数的情况还是搞完水题就开始强怼某一个「看起来能做」的题,结果到比赛结束还怼不出来。最终靠着<s>(单切的中立)</s>学长拿到了所有区域赛的名额。嗯……一想到下回区域赛切名额的任务有很大概率要落到自己队头上就感到后背发凉。。。
+</p>
+<h3 id="tocanch3" class="tvis">区域赛</h3>
+<p>
+当时被问到要去北京/沈阳还是去青岛的时候,我个人几乎是瞬间选择了队伍数极多的青岛——因为队伍多获奖名额也多。而且青岛赛区时间和北京赛区时间冲突,北京的神校既然到了哪里都是虐场,为何不在家门口虐呢?
+事实证明他们就是不想在家门口虐场:看到参赛队伍名单之后发现几乎所有学校的一队就选择了青岛——大概是有同样的想法吧。。。
+</p>
+<p>
+到青岛之后感觉就来到了甘谷县<a id="n3" href="#note3" class="note">[3]</a>。A题水过,B题又是魔方自然就交给了我们的宇宙首领<a id="n4" href="#note4" class="note">[4]</a>,
+C是什么鬼高数题到最后我们也没搞出来,更智障的是连规律都没发现。F题看着很长其实是辣鸡模拟,我写了个乱搞水了过去,然后就是全场9个队中第二个AC的(要不是一开始静态分配内存炸了应该能抢到一血……)。
+宇宙首领很快就看出G是一道费用流,然而浮点数的流量再加上我那个智障的费用流模板导致比赛时不是T就是WA,最后ABF3题侥幸没打铁。。。值得一提的是K题这道K-d树的题有好多队排两遍序水了过去……包括我校拿银的队伍。
+</p>
+<p>
+最后的总结就是……大概是天要亡我吧。。。当然作为被这场比赛的出题人出的省选题虐过的我还是对这家伙有点怨念的:为什么要出这种一大堆浮点数结果的题啊。。。
+</p>
+<h3 id="tocanch4" class="tvis">CCPC</h3>
+<p>
+中立他们队在CCPC的分赛区中切到了决赛的名额然后决定把这个名额让给我们队。。
+</p>
+<p>
+江南的冬天真是太冷了……整个人都冻成了智障。。。
+</p>
+<p>
+总之最后宇宙首领搞出了3道比较厉害的题,我搞了两道题(没记错好像是HJ?嗯……H和J题都不是1A应该就是我搞的了)混到了铜。当时因为智障连如何搞最小环都不知道了,以及大概到现在都还没完全理解B题为什么那样正着来一次反着来一次就行……
+</p>
+<p>
+于是两场全国级的现场赛过后,自己的2016「赛季」就以全是铜牌的结果结束了。大致回忆一下,这学期似乎也就只有比赛前那段经常在Virtual Judge上做虚拟赛的时间真正在努力吧。随着学长的最后一个真正出成绩的学期结束,
+自己要出成绩的一年也正式开始了。<s>希望自己到时候不会因为切不到名额而被殴打(</s>
+</p>
+<p>
+顺带提一下cf(三亿码农的枪战梦想)。
+</p>
+<p>
+因为时间的原因,这学期只打了5场cf,大致坐稳了蓝名的rating还获得了成就「第一次掉分」。<s>收获颇丰啊。</s>
+</p>
+<p>
+寒假大概会virtual participate几场错过了的而且看起来质量不错的比赛。
+</p>
+<h3 id="tocanch5" class="tvis">实验室纳新</h3>
+<p>
+新学年开始,又到了纳新的季节……我主动背了新生赛命题的锅并确定<s>钦点</s>了题目<a id="n5" href="#note5" class="note">[5]</a>。
+最后的榜单虽然看起来相当正常但是还是有点出乎意料——可能是题目真的偏难了一点的原因。
+</p>
+<p>
+至于后来面试的事情,则与我没什么关系了。唯一要提到的大概是一位来自潍坊的女性选手,经历在某种程度上与我有些相似吧。
+当然好像她不是我这种的乱搞型选手。
+</p>
+<p>
+不得不感叹的是今年软件学院真的比计算机学院弱了好多,大部分有基础的dalao都去了远在青岛的计算机学院。而到明年的某个时刻,我所在的队也会因为同样的原因而被拆散……希望这并不能真正拆散我们。
+</p>
+<p>
+纳新结束之后竟然也有了当时学长们的那种「进final就靠你们了」的那种感觉呢。
+</p>
+<h2 id="tocanch6" class="tvis">其他乱七八糟的事情</h2>
+<h3 id="tocanch7" class="tvis">课余时间</h3>
+<p>
+这学期依旧常驻实验室。所以课余时间无非还是写代码乱搞音乐打游戏。然而最近<s>在我的带领下</s>听朝鲜神曲成了实验室的一种新的娱乐方式,而且直接导致现在实验室部分成员可以直接使用来自朝鲜歌曲空耳的词汇交流。。。
+</p>
+<p>
+总体来说,实验室的生活自然比每天呆在宿舍看剧有趣得多,还可以围观其他人搞事情<s>(比如制作烤树莓派啊什么的)</s>。第一次在实验室通宵打cf应该也是一次十分有趣的经历吧。
+</p>
+<p>
+<s>好像自己的课余时间不是在实验室乱搞就是在宿舍睡觉?</s>
+</p>
+<h3 id="tocanch8" class="tvis">有进度的坑</h3>
+<h4 id="tocanch9" class="tvis">QMP</h4>
+<p>
+本学期仅有9次commit。但对于我这种一次commit不只做一件事的人来说,这并不代表做的事情不多。可能由于修复了两个玄学的<a id="n6" href="#note6" class="note">[6]</a>bug的原因<a id="n7" href="#note7" class="note">[7]</a>,
+甚至有一种改进很大的错觉……
+</p>
+<p>
+寒假把文件格式API搞完然后上0.9吧。
+<s>一学期才从0.8.2 alpha变成0.8.3 alpha你搞个毛线啊</s>
+</p>
+<p>
+使用QtQuick的版本已经好久没有动静了。。。
+</p>
+<p>
+播放器核心代码已经快跟主窗口代码粘成一坨啦!。。。
+</p>
+<p>
+SonarQube说你的代码可靠性和安全性都是D呢!。。。
+</p>
+<h4 id="tocanch10" class="tvis">SMELT</h4>
+<p>
+最大的新闻应该就是为了修复QMP的玄学bug之一而诞生的GLFW移植版了。然而内部仍然在使用OpenGL 2.0。使用OpenGL 3.1的版本虽然开了个头但是此后就再也没有动过了……
+</p>
+<p>
+<s>到头来还不过是一个只有我自己会用的引擎</s>
+</p>
+<h4 id="tocanch11" class="tvis">chrisoft.org</h4>
+<p>
+简单实现了一下留言,搞了个简单的使用cf API的cf rating比较器,改了改online music player,允许使用异或加密来加密博客内容。大概没什么别的了。
+</p>
+<p>
+昨天刚被61小姐黑了我那「html5+表格布局,全球首创」的主页。该抽出点时间稍微改改了……<a id="n8" href="#note8" class="note">[8]</a>
+</p>
+<h4 id="tocanch12" class="tvis">Compiz</h4>
+<p>
+本来打算在dev blog里单独写一篇关于这个的文章……然而又感觉没什么好写的于是丢到垃圾桶里来了。
+</p>
+<p>
+Compiz是Ubuntu Unity桌面环境的默认窗口管理器。作为我使用的第一个日常使用的发行版,当时还是基本没什么经验。于是整日瞎搞,
+后来就有了这两篇(<a href="//filestorage.chrisoft.org/blog/img/ubuntucompiz.png">1</a>, <a href="//filestorage.chrisoft.org/blog/img/ubuntucompiz1.png">2</a>)QQ空间日志……
+<a id="n9" href="#note9" class="note">[9]</a>
+</p>
+<p>
+大概是出于自己有一部分「源码级用户」属性的原因,Compiz将使用的OpenGL版本迁移到新版后,我就一直在寻找一种把compiz原来的插件带回到系统中来的方法。
+因为当时甚至不知道OpenGL各个版本之间有什么不同,最后我选择了直接fork掉了最后一个使用旧版OpenGL API的版本——于是就有了Compiz 0.9.7.99。
+大致做的一些工作就是将旧的"unsupported"分类里面和一部分只存在于Compiz的git repo而从未进过包的插件移植到了0.9.7的API下并整合了进来。
+稍稍优化了一下内部的OpenGL调用,将几个后来版本的新功能移植了回来。同时还自己增加了几个自用的功能,比如自定义expo插件的显示布局,
+以及一种新的窗口切换高亮方式等等。嗯……其实也没做太多工作。
+</p>
+<p>
+Compiz大概是我使用OpenGL的开端——尽管我所fork的Compiz版本中使用了大量过时的OpenGL API并且直接或者间接导致我后来写的一些OpenGL代码都有一股「Compiz味」,
+但是也为我后来学习新版OpenGL打下了基础。
+</p>
+<p>
+这里再写一下Compiz的现状。自gtk3和qt5、以及两大DE,GNOME和KDE全面开始支持wayland以来,Compiz的开发就没有再像之前一样受到重视了。
+Canonical自己雇来的、专门维护Compiz的Sam Spilsbury也离开了Canonical并且曾经声明不会再继续开发Compiz。<a id="n10" href="#note10" class="note">[10]</a>
+此后compiz的repo一直是处于一年没几次commit的半死不活状态。然而去年中旬,Sam Spilsbury回来了,并且接连搞了好几个大新闻(blur以及animationsplus被移植到了新OpenGL API上)。
+于是我也稍微起了兴致,准备试图寻找开发者合并我的expo插件自定义布局的功能(因为想着如果加入这个功能我就可以直接使用aur中的compiz包了)。然而可能是因为姿势有误,
+这个提议因为长时间无人理会,已经从问题列表中消失了。后来我试图在Arch Linux上编译最新的compiz源代码,发现blur插件并不能正常工作——模糊方式一旦选择高斯模糊compiz就会立刻崩溃。
+这无疑相当于给我浇了一盆冷水。而我自己的fork最近也只是尽力让它仍然能够编译而已,并且那个版本与KDE还出现了某些程度的不相容。再看到lp:compiz中依然半死不活的repo……sigh。
+</p>
+<p>
+顺便一提,为了解决compiz和kde的不相容,今天上午我迁移到了kwin。然而在此之前我都是在KDE中使用compiz的。希望有一天我还能用上compiz。
+</p>
+<h3 id="tocanch13" class="tvis">无进度的坑</h3>
+<h4 id="tocanch14" class="tvis">BLR</h4>
+<p>
+<s>这鸽子已经死了大伙散了吧</s>
+</p>
+<p>
+<s>不不不,大概还有一口气……</s>
+</p>
+<p>
+总体来说感觉自己当时的设想有点过大了……还要搞什么插件系统、js关卡文件的。写了QMP的插件系统我才真正搞有了动态库的经验……
+</p>
+<p>
+<s>类似汇编的关卡文件大概可以去死了</s>
+</p>
+<h4 id="tocanch15" class="tvis">OJ</h4>
+<p>
+和某不断开OJ坑但是鸽掉的dalao不同,我是根本还没有开坑。不过架构倒是确定了一点。当时写完cf rating比较器就感觉「哇前后端分离真是太好了」。
+于是就决定用C++(cgi)写后端,用户端js负责生成页面了……
+</p>
+<p>
+然后还大致决定通过在UML(User Mode Linux,不是Universal Modeling Language...)内运行评测程序的方法来实行隔离。
+</p>
+<p>
+<s>最后的决定是:接着鸽下去吧</s>
+</p>
+<h3 id="tocanch16" class="tvis">第二类坑</h3>
+<h4 id="tocanch17" class="tvis">绘画</h4>
+<p>
+曾经一直说自己不会画画<s>(不对啊不是本来就不会吗)</s>,但是却买了一台带数位屏的笔记本。于是一直在试图寻找它的用武之地。半年来一直没什么发现,
+直到我看到了<a href="http://www.spi-inc.org/projects/osunix/">这个页面</a>……
+</p>
+<p>
+这是啥?OSUNIX?<s>跟osu!有什么关系?</s>banner怎么能这么萌?怎么看都不像操作系统的banner啊……
+</p>
+<p>
+这张图大概是为数不多的我刚看到就有描一张的冲动的图之一吧。后来想找全图当头像,然而发现OSUNIX这个项目其实已经消失好久了,仿佛在互联网上已经几乎完全消失了一般。
+在web.archive.org上能找到的为数不多的相关信息中的图也全都挂了,能找到的唯一一张相关图片是一个16px的favicon……于是我就有了把这张图补全的计划。
+</p>
+<p>
+画了大约一天时间照着原图描完之后,大概就开始补了。因为之前从未有自行绘制任务的经验,所以最后很多部分都是靠别人的意见和自己枚举确定的。。。
+于是有了<a href="/data/osunix-logo_sq_thicken.png">这张图</a>。
+</p>
+<p>
+后来把这张图丢到了我所在的群里,得到的反馈有点出乎意料——竟然有一群人要我开始上色,还莫名带起了一波群内改名片的节奏<a id="n11" href="#note11" class="note">[11]</a>。
+在我声明完整的线稿完成之前不会上色之后,有两位dalao等不及了(<s>控制不住自己的触手</s>)<a id="n12" href="#note12" class="note">[12]</a>。
+至于后来发生的事情,就是我的笔记本碎屏了……
+</p>
+<p>
+现在笔记本屏修好了但是画下去的兴致也消了一半。当时刚乱涂完脑袋之后兴致勃勃地带着图发了一条推:「不会只是懒得学习的借口」。这话是没错,但是现在你就真的已经会了吗?
+</p>
+<p>
+<s>🍍曾经说等我完成就开始画自己的设定图,我要尽早让他实现这个愿望。</s>
+</p>
+<h4 id="tocanch18" class="tvis">钢琴以及其他音乐相关</h4>
+<p>
+大概搞出了th06~08的bgm remix。说是remix其实大概只是让原版OST有一种近几作OST的风味而已了。然后还搞出了th07 remix版bgm包。th08的remix版bgm包最近也可能着手搞一搞。
+</p>
+<p>
+自己的作品则因为在学校没有合适的输入设备还依旧鸽着……
+</p>
+<p>
+学期末的时候突然对ragtime中毒了起来。后来打印了The Entertainer和Maple Leaf Rag的谱子准备寒假回家拾一下放下很久的钢琴……
+(不过The Entertainer我之前是练过的呢……)
+</p>
+<p>
+暂时没有再学一种乐器的想法。
+</p>
+<h2 id="tocanch19" class="tvis">上次就在这里的东西</h2>
+<p>
+那个东西指的是「神秘组织」BKT。
+</p>
+<encrypted hint="和上次密码一样" hash="5ce53fdbcc6a1f7b63d9e104e9073ae213daac41ea86f4ec4462584322c51afe" encont="VWg32D4Z6ihx44ejMJbqKWpuwmesIGxn9qrZisbaoqYe94XdSz+hWGBWaCAd0aRkhaYaCiERTa60LTB80D9A67sGPE1EsJQYG0DR4hGbFfxNzbBqX2HL9RDFcGfRII/kqVHuc4knbdRRMILh09XOP6k8o/lMkY0jX8leU+606gggO2Mc1H1DXu+dTmdUfQg6MlZ/IDqslayWzE5MRMmHqSBLQmYUXidQtrTeAxMQJ9VNYk2vJxVdWwa/PcPC4cGjO3KlM7WeQ/m/Yl7S03zecwccUEe9IEMx6NMqtOXJ/j0W3mC4kHZWhVyQX+gwPnUYk9nhyqSiUQjhyxsLRg/g2DwaUaAt0da0uhIvs4S1CMpd7a+TlZKyNcj+5FOLBWP7zHjLbsLc/bJytqIHXcwfyfHloKQIkGH/N0J+01XTAQA4E7ZGOr/u4oS0SjqGQs8qPp+9iijmCk4hdus5vsNi8ZVvysEx7qBmMlUbRSWUQBzykBz+aYuEGZAuw4tk2hyf8ZjRfW+rzLZB4ttPmePb97X3EGOs70fRVysys3N/X+OaLX4qMoArH5XbszaUzfu5xZ3hABGNRsoxN6as3WMo5OY4N67NpfjmyudDkP7lkqtj4VTaQWtrbQL/51AhUvs5sdEcOWlmHA5EBrU+pnn+QbSKIniZo0q/tIrb9ioXyxy9Gvea0czS6yrB+BkY2iXOTbv3SY0X0Smvh5i2SFUHPaDwDm1UqzTXGYkzzmXaKGsb+gHBhNA1mOmCrOxGb78i1iZWIJXqDUg2jMfDCIJ4YKwPqLglAENpCaAZ7Ldb2doGIX0buSPYzYaFHkxzG7nrNwTHF7681sUjtSpfRAG49RboeAHJpjbVmlhAW/GtvKmyak5dYy4eHxFj+8S6c8KMpguxmM1pvnQaKJPk8S9rm5eNRvmv+Fel30Ee7sF8c/RpujXKm6jFQyIdNXj6j3G7xmOM4BolhFolwGrr3TVElCLWh8vB6XUhGj6PJhyey0rquILQEO8sQzkFVzX/gS/I7Mn0OZwTZOogE0EB3+CRkE43q6+xqbYuQv+sZDp09ADZuf/8nm6tAvcueOFEfU5Dk0fH1inYqa4ydErhqnXOBfcnqCUhN885VMx5q7sSDkAQ7zPrENnVz3O/mI5Hc92ZKDNQBBTNZ7znY8/LQSHytOlRNzO2CplsiexX9hjUZvapAhLAwxyqUnJbO9Fykvxac1ypcRJP2Sr9fYVKy9dEFNAQK7Og1CJ5iDoPz4rh/AUZ7RO16lnqyfLo0GuIJUvJIo+oCOl8uF/PLmeyc3NK15NRjg1JEpjR6ZXgdBtTiWTRAowshOhQzL+S0ydsTTr/WH1x0VJr3fbd3o6Wv/RmR6+pvoUZN+n1t9bRu87qHNzeuZggCeo1+jRp6RVEQNATAp7JTidMSYSdNbcgCcLVXOxQheyDEa7/sKobbX26JCLN+W4l7PSBkflJEhV9R0DvTeLIu9XcspoXf7fb6zfk8kJ7nLOsNrJ3MpnUD40FpBs6RoeLoinVeva+0F1+f4dkkx+cnmA3UUH+NOhPr5fphZfSEW9QAaK4F21qEWeqQf5nrR5rqIBmyJbU3TXrZkWe+HYv3XQNL6Mz8/EnuYdU33w/zY6HG0Zi91OGmbEzYN6pfEjfPv9cm2VMUfJ5voIHOKx6FHlgJ3KwvBYabuF4/4oGb8uJUOjfrPpe26VovV+8e10XeMxFxAUHEQ1FWW/PEJ3Lkd57JTyb8A0IW9bY+9DDawZLpq3hVPsDz4rG7kA+VdRcDfM0Qun0Ez+/L9/3+eMrA6q1l9Y3+lMhIGTvK7gcbu4N3Gsskiood/VMgSlR07TB3etVW3vOnqfw/503IZ82EXqwbdV44nmmyNR7MXFrxHIac3Dc2YgvlKed/Ok7pKi8ffM8IRRwJXQZmhEwmWtdFpc2PdMdMlfVzQ6rD6OsJ9cbixXmTbpEBT5rlhuxSSjuzqUDhctAwdJ3LRzszCyz0y1+TKz3eciJJd0djwSOhgJV6Z5g8dN5Ie32KoA+UuPiD59odwflZ8fEI61GEpk+HsAKnTlrbnRfdN5qyDBWiRL5xsKPARy54T1phC3ExGXRVVcm/rhBD8tuK3EAWoMOCQTxvTyXEzR1b1wXu8fM5QJ4fRqm+SBYYdfjLFHkWJORJlViBKtzUZckN66JEkeieuIBOhgB9BG5IYrWau2ITZdVejbHnZRODgeUb/EpXNz0bTcyvbhhSOTkU0memealuCIZDxlQKcxajB70aLkaO9xZqwN+Yr/1Uus9Y847gKG4AnOoQZk+2jNKfYqZehaM+C9nSuxwzXFhE3BZckneshvLCasXtJTYdBWnLpdMYQdiJxlD5ajMbFstCMRiPQjgY5ZESJpWx+IA9NNKqtmRslOzDBnIYIpXCJJd/N8wUrpTnh/mNLBNqeDl7Kv/jh0MS4J6L8F6bo66GPSolQqaFHQmT1Lcno9uynGsaB5NR0QYOT3id7jAHxWDkNv8J0xvd0jQsLnyiuAW6zXlUhkLn2xk0ZxUSEDyJtYB0mgq+LNg/xCmToR1b2lHZmsiQW9jhSI5tInetmWMNFF3L8lyHUFn1hm+TVOnQ3ioeM5Ecw8JqZGFCWuBWmu850nt88lE91D3ials+6mlRGkcCf6WYXYfwWcdmmkbBBK6r4XVM9usR1gVmnnIPfse1nJ36n4PH8cy28n37PzME6mgQ+FYKh3rTAL/XGJd6EX19IZuvslw6VSEC4e8TyiPUFvYK+T97PyArzKUwGSD7+2yuWEDrg9Gft2bbAsS38fC4LlZXLLqLV4hmqE9Rml5qBl/PUlvXne9Uen583yB+DyivOFchhOsAngC8P2k3oYgTCFSzA+tZVWPOr2wdtnQUkOodGmGEduor2TX8dq+NXax+IDFdgqljzZ5b/YEfVwslcazG/dDqZbDojaQ5s/IOvZSghK6U27AAcQnaeXdgM8eB1v+avzPfZemeXMwrXPIadU0nOeWhD3kVZteKToL8NndrhliGoIyq3E5NVqQqsc+NcSeuIt4bBP3+P2JmzZt6iM+Jl5YhIg8FoPl+n+VvHuaByknAQabrDgraWKR5fWD7nQIB5qjqprrGmYYuOR9ThVIdly7Pc+cuqwpUepKntaG2ahmuLzeKWoUuCPaOOMwNYfq35gy4UhOeZwzmF3bxxHfOgsaZ8iF2vYm1/Uvmg2XQPL20jhakgEuW86hcN8DRha0cyl/g7xxQ42HNxc1nu5BL9BmpIoPtEGzpkhtlbqM6hhRsHc/Ic5dFo/9WpPG5sjx8K1sZRObV0wrNXR56o5typyjO6++I9zgwQ7fSjtxOCC6CCsKg3bQWHAqA7CkGn831VG2oWlttgI8Hf6dSii8vqgYx08Lw1tAHO2gwJb2ZUVxq++ex0Zy34wZ/FvSbAc5sJUEMKPovkNJL+0F9UtwvCT9A6Z3dkh5HHFWj7dzUlCjoYarnZxH1f9YjPZeXnKPkGsz2WOKVSWgJJdPaJaJpNyFKetD+dS+C309dDVOTJEs5msfbk+TokpEZHk5KeLjr6hOB+xUUGju1KWanndhDdiM47nx3HjbbvTl5HefkdgVIhjNRooOKhv1Gr8XIm3lvXEIkupqlC/CwXSsfJT2f4SqAZLS0O1mXr7Z5wKBQOA3Pg82HDU5//jTyVchJHCvVhMlIYdkeHnETxC226ouCQeNeseKKwahqIGBQcRKMW5QOqqtdmk=" enid="0">This section is encrypted. Click <a href="javascript:void(0)" onclick="decryptui(0)">here</a>
+to decrypt. <noscript>Note that you need have JavaScript enabled for decryption.</noscript></encrypted>
+<h2 id="tocanch20" class="tvis">婊一婊辣鸡专科学校</h2>
+<p>
+对于大部分大学生来说,一般不会允许外界人随意抹黑自己的学校的……然而当你看到以下这段话的时候,也许就明白我为什么要写这一段了。
+</p>
+<p style="margin-left:4em;margin-right:4em;border:1px white solid;">
+山大一到教育厅,所有招生的人便都看着他笑,有的叫道:“山大,你明年又要多省断档了!”他不回答,对柜里说:“温两碗酒,要一碟茴香豆。”
+便排出一叠学费。他们又高声嚷道:“你一定又偷了人家的东西了!”山大睁大眼睛说:“你怎么这样凭空污人清白……”“什么清白?
+我前天亲眼看见你收了孩子的钱,没办好事,吊着打。”山大已便涨红了脸,额上青筋条条绽出,争辩道:“收钱不能算偷……收学费!
+……读书人的事,能算偷么?”接连便是难懂的话,什么“学费座谈会”,什么“软件园博科培训机构”之类,引得众人都哄笑起来。
+</p>
+<p>
+所以这里就着重婊一下辣鸡专科学校出租校内资源给社会组织的行为。
+</p>
+<p>
+我入学的第一个学期,上面段子中的「软件园博科培训机构」风波刚刚平息。进入ACM实验室不久,我就开始好奇我们实验室楼上几层是什么实验室。
+后来根据很长时间的观察,发现2楼门牌是「IBM实验室」的房间从未开过门。后来一问学长,得到的是一个无比简短的回答:「租出去了」。在我试图追问之前,
+他先反问了一句「卧槽,你竟然不知道?三区上面几层楼好几个房间里面都不是我们学校的人啊」。这是我对辣鸡专科学校「出租校区换钱」的最初认识。
+</p>
+<p>
+好几个月过去,这件事也逐渐被淡忘了。直到一天早上,我像往常一样在实验室里面做我自己的事情,突然闯进来一群人——学长说除了管教学楼钥匙的一人之外他们都不认识,
+开始在我们实验室中四处拍照——好似买房人看新房一般。然后这群人就说着笑着出去了。
+</p>
+<p>
+晚上,传来了我们实验室被在全校范围内通报批评的消息。于是我们恍然大悟——怪不得不认识呢啊,原来是校级领导啊。但是让人感觉很奇怪的是与我们相邻的有些实验室,
+情况比我们实验室还要糟糕,却没有被通报。这让我们实验室成员不禁有了「实验室要被压榨」的感觉……大致是这样的:(选自聊天记录,为帮助读者理解上下文稍有改动)
+</p>
+<div style="margin-left:4em;margin-right:4em;border:1px white solid;">
+<p>
+——哈哈哈 当时博科那事情是一个老师和某导员串通外面的什么机构搞的
+</p>
+<p>
+——后来算是被压住了
+</p>
+<p>
+——然而现在学校里带人来搞事情
+</p>
+<p>
+——很强
+</p>
+<p>
+——后台挺硬
+</p>
+<p>
+——看我们占着教学楼主门对着的大房间不爽了吧
+</p>
+<p>
+——「这种黄金地段怎么能让你们这种不赚钱的辣鸡实验室占着」
+</p>
+<p>
+——反正我们现在知道的情况是 我们实验室所在的教学楼三区的4-6层 很多房间里面都不是我们学校内部的人
+</p>
+<p>
+——终于要对其他楼层下手了呢
+</p>
+</div>
+<p>
+后来的事情大概是,在实验室负责人也就是计算机学院2015级的辅导员的求情下,并作出了一系列「保证」之后,我们实验室苟活了下来。
+当然,可以预料到的是这一系列保证让我们这个本身就几乎没有任何经费的实验室的生存空间更小了一些。
+</p>
+<p>
+虽然不是很清楚学校为什么会这么做,但是我不得不说,依我的角度看,把一个租来的校区里的房间租出去赚钱是一种很蠢的行为。
+另外学校怎么会缺钱呢?<s>软件学院学生的学费都交到哪里去了?</s>
+</p>
+<p>
+当然,辣鸡专科学校一向不缺槽点。还有「翻脸不认人」的老师以及「瞎几把给分」之类的事情,这里由于各种原因就不再多写了。
+</p>
+<h3 id="tocanch21" class="tvis">20170201补</h3>
+<p>
+昨日听闻<a href="//filestorage.chrisoft.org/blog/img/ljzkxx.png">一事</a>
+(<a href="https://mp.weixin.qq.com/s?__biz=MjM5NzMxOTQ1Ng==&amp;mid=2649504416&amp;idx=1&amp;sn=d7e8cb3d8d85ec14b8539f0532ac11e3&amp;chksm=bec35cef89b4d5f98ca7e48f75ce833c1f4b000e0c9b09a9ef71efd9202952f84a6fee473414&amp;scene=21#wechat_redirect">原文链接</a>),
+深感辣鸡专科学校大去之势不远矣。呜乎哀哉!
+</p>
+<p>
+这大概是入学以来我第一次后悔来到这里。
+</p>
+<h2 id="tocanch22" class="tvis">神秘内容</h2>
+<encrypted hint="b******phi" hash="5be136371f1b6925c4ac672a7f31c9c327a3bededdc935d785c7004478053a47" encont="Lvt/LfQA64K8Q7m1EBseDcAlE8yDV3ctlZIBpJQ5achEZz9iQiKDf9gJTGOkAiQ2n82nF8AnyKg8eMVOQbCoFwiq6fsNt6kD32I7c+EMwcvbFhLvfN6ZyrOAzTzbCxAMtKtdVkiPQII9yvmANyer9MIe3MNSB5NTtQFMfzfhaProdeKUFQMRvcv4EbN43s9ig2TGkQ/ilmVp/NlxEYFvcWh/QXdczCnOzW6RhTvtMuyQFaSarfzNOGKxKpereTMVfyXGnuy5Lqb2YORhQoAe+2xLMZ66u9It1Tj+CPAhviN48oJGZzBjA7RegitAZ310LQp0oGtHZt+4Uj4ndsL8mL3kURqpzEtBlyVPHXZYf8qwmB232QZFsVZ4Wk2dcDKXeRfuJFfXbE+2EJDsiFng5ItXsg2cAQgrV3a294OV0+bd5QJx8nLSl0kWpk9SdlI3rf6heups6+IlGsCjfImcpdd6LzAHu7syoz3F0CeHD3bELh8jzupCa3MnpGMs/JikdOss+ryMJiScdFEU2i4z7yfHq26ZhpAkfya1+CMBZgvspESYg6LMXEzjCoEbx/ZwihMh0gUd9xGpr+HMN3mfgtfM2LM6NHdN/CDqvR0AX3ktAPKe6T57N46Z9GxFQsrng76kQaH/ygeawmCP8fQ18VEXhnmtOhLLcgrCbVhdt9N72MzBgqeEeGIEmZTcNu6vVGmrcdTHGh8SqWJGOs16TADbJrFPRhyVy13O7MWHJFa5ECmpDEoOSq2AzL5DlQk6oiItH9oUNWiBeALCg4gHqJrWx4Pi4vkVSZgBNgZNHWy/0soQ552pshofyvV1Esr+4g6JWQdQDyRGKgeK0I8EHcOhWSknGQ9fiTbEWhFzLMkWdTc30ZwxidOHiH2+koefTTv1dUysxLLVnf6ODzFd" enid="1">This section is encrypted. Click <a href="javascript:void(0)" onclick="decryptui(1)">here</a>
+to decrypt. <noscript>Note that you need have JavaScript enabled for decryption.</noscript></encrypted>
+<h2 id="tocanch23" class="tvis">「技能树」</h2>
+<p>
+到了大二才发现自己的技能树既不深又不广,还有救吗?
+</p>
+<ul>
+<li>node.js是什么?节点 点 鸡丝?<s>后端居然能用C/C++以外的语言写?</s>
+<a id="n13" href="#note13" class="note">[13]</a></li>
+<li>shift-and竟然是字符串匹配算法?</li>
+<li>用个vim还要看小抄?</li>
+<li>OpenGL|ES版的SMELT写过了?<s>不对好像连OpenGL|ES版的三角都还没画</s></li>
+<li>Maple Leaf Rag弹哪里去了?</li>
+<li>说好的学法语呢?</li>
+<li><s>Linux竟然能跑在硬盘主控上?</s></li>
+<li>……</li>
+</ul>
+<p>
+所以最后得出的结论还是:
+</p>
+<p>人比人,气死人。</p>
+<h2 id="tocanch24" class="tvis">生活垃圾</h2>
+<h3 id="tocanch25" class="tvis">造电脑</h3>
+<p>
+没错我造了台配置奇葩的电脑,而且很可能就是现在提供你所阅读的页面的那一台。
+<a id="n14" href="#note14" class="note">[14]</a>
+</p>
+<p>
+如果你发现了我的主页上About部分的隐藏内容,应该已经知道这台机器的配置了。
+<s>好像一不小心泄露了什么秘密?</s>考虑到还有人没有发现,在此重新列一遍。
+</p>
+<ul>
+<li>CPU: Intel Core i7-2960XM</li>
+<li>RAM: 16GB (2x 8GB) DDR3L-1600 Samsung RAM</li>
+<li>Motherboard: Supermicro X9SCV-QV4</li>
+<li>Graphics card: NVIDIA GTX960 by ZOTAC</li>
+<li>Display: 1280x720@10.1in with 10 point multitouch</li>
+<li>/dev/sda: Crucial M4-CT256M4SSD2 (256GiB)</li>
+<li>/dev/sdb: HGST HTS721010A9E630 (1TiB)</li>
+<li>/dev/sdc: Hitachi HTS725032A9A364 (320GiB)</li>
+<li>OS: Debian GNU/Linux sid (unstable) amd64</li>
+<li>PSU: Cooler Master 500W ATX</li>
+</ul>
+<p>
+当然你要问我为什么造了这么一台配置不平衡的电脑,我也不好回答。主要是……为了重复利用已有的零件吧。
+总体来说,只有主板和显卡是新组件。显卡是为了玩CUDA买的。大概就是这样。
+</p>
+<p>
+主板是基于QM67平台,给1U服务器用的。然而很显然插上显卡之后是没有1U机箱可以塞下这个奇形怪状的东西的。
+于是……它就常年裸露着板卡工作。(图可以在一篇相对较新的文章「ls /dev」中看到)
+</p>
+<p>
+因为装的是Debian sid所以一般每个月会滚一次系统顺便做些小维护然后重启一次。所以作为一台服务器,
+它的uptime并不算长。最长的记录也就45d左右。
+</p>
+<h3 id="tocanch26" class="tvis">修电脑</h3>
+<p>
+另一篇文章「终究还是改不了修电脑的命」已经描述了整个事件的大致经过。这里要说的是后续。
+</p>
+<p>
+后续还是比较惨的。因为x宝的屏幕装上之后,发现对触摸不灵敏而且笔会在悬停高度相对较高时跑到某个固定的线上。
+所以决定去找客服。然后就发现联保服务(对于国外购置的机型)需要提供税单。然后一查价格,2k1。
+</p>
+<p>
+这下好!当时偷掉的税差不多都回来了……
+</p>
+<p>
+然而修完之后,原来的问题依然存在(虽然变得十分轻微)。
+</p>
+<p>
+大概是一辈子也不敢再撕防眩膜了。
+</p>
+<h2 id="tocanch27" class="tvis">后记</h2>
+<p>
+这次的垃圾桶从1月9日开坑到6月10日最终完成总共用了……5月零1天!<s>比起上次来讲真是不小的进步呢!</s>
+</p>
+<p>
+然后就发现又快要开新的垃圾桶了。那我们下篇垃圾桶再见(
+</p>
+</article>
+</div><br><hr>
+ <div class="TText" id="notediv" style="font-size:80%;"><span class="TText"><a id="note1" href="#n1">[1]</a>: <s>所以这就是你把这条放在第一位然后上课天天玩手机的理由?</s><br></span><span class="TText"><a id="note2" href="#n2">[2]</a>: 实验室学长曾经半开玩笑地说谁数据结构低于90就立刻逐出实验室。<br></span><span class="TText"><a id="note3" href="#n3">[3]</a>: https://youtu.be/ecVZLfeaPj0?t=103<br></span><span class="TText"><a id="note4" href="#n4">[4]</a>: https://youtu.be/Gbo6AEH9GmI?t=22<br></span><span class="TText"><a id="note5" href="#n5">[5]</a>: 虽然中间进行了类似投票选题的环节但是因为大家命题热情并不高所以不得不硬点。题目与结果等位于<a href="https://chrisoft.org/labselectionround/">https://chrisoft.org/labselectionround/</a>。<br></span><span class="TText"><a id="note6" href="#n6">[6]</a>: <s>曾经有人认为只有女装debug才能修好的</s><br></span><span class="TText"><a id="note7" href="#n7">[7]</a>: <a href="https://chrisoft.org/blog/dblogreader.php?p=2016-09-24">这篇文章</a>里有更多关于它们的信息。<br></span><span class="TText"><a id="note8" href="#n8">[8]</a>: 已于1月20日完成。<br></span><span class="TText"><a id="note9" href="#n9">[9]</a>: 嗯,我的QQ空间已经被关闭,所以不需要亲自去看了。另外这两篇文章均为直接存档。写作时其中包含一些错误,未予纠正。<br></span><span class="TText"><a id="note10" href="#n10">[10]</a>: https://answers.launchpad.net/compiz/+question/235670<br></span><span class="TText"><a id="note11" href="#n11">[11]</a>: 虽然不知道他们到底是为了刻意刁难我还是……<br></span><span class="TText"><a id="note12" href="#n12">[12]</a>: <a href="https://twitter.com/BLumiaW/status/806914034289119233">dalao 1</a>和<a href="https://twitter.com/oioga/status/807871221345886209">dalao 2</a><br></span><span class="TText"><a id="note13" href="#n13">[13]</a>: 嗯……我的网站上曾经有一个bash写的后端脚本<br></span><span class="TText"><a id="note14" href="#n14">[14]</a>: 截至2017上半年<br></span></div>
+ <div id="insanch" style="height:3em;"></div>
+ <div id="footer" style="">
+ <div id="pagesw" class="TText" style="width:100%;height:0.5em;"></div>
+ <div style="text-align:center;" class="TText">
+ Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5
+ <br>
+ Content licensed under CC BY-SA 4.0. <span id="purgep" style="display:none;font-size:70%;">This page has passphrase(s) stored. Click <a href="javascript:_purgep()">here</a> to purge.</span>
+ </div>
+ </div>
+ <div id="cmdbuf" class="TText" style="transition:500ms;padding:1em;font-size:2em;color:white;position:absolute;background-color:rgba(0,0,0,0.6);left:50%;top:50%;transform:translate(-50%,-50%);pointer-events:none;opacity:0;">
+ </div>
+ </div>
+ <div id="decryptui" style="display:none;opacity:0;color:white;z-index:1000;position:fixed;left:0;top:0;width:100%;height:100%;background-color:rgba(0,0,0,0.4);transition:opacity 0.5s;">
+ <div id="decryptdlg" class="TText" style="padding:10px 20px;position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);background-color:rgba(0,0,0,0.6);">
+ <div id="keyhint" style="margin-bottom:8px;"></div>
+ <div style="margin-bottom:8px;">Key: <input id="keyinp" type="text" style="color:#fff;"></div>
+ <div style="height:2.25em;">
+ <button id="btndecrypt" onclick="decryptor(decid,document.getElementById('keyinp').value);" style="position:absolute;left:20px;">Decrypt</button>
+ <button onclick="hidedecryptui();" style="position:absolute;right:20px;">Cancel</button>
+ </div>
+
+ </div>
+
+
+</div></body></html> \ No newline at end of file
diff --git a/blog/post/2017-02-13.html b/blog/post/2017-02-13.html
new file mode 100644
index 0000000..f4a9f8b
--- /dev/null
+++ b/blog/post/2017-02-13.html
@@ -0,0 +1,649 @@
+<html><head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<meta name="theme-color" content="#000000">
+<title>Chrisoft::Blog</title>
+<script type="text/javascript" src="/panel.js"></script>
+<script type="text/javascript" src="/blog/footnoter.js"></script>
+<script type="text/javascript" src="/blog/aes-js.js"></script>
+<script type="text/javascript" src="/blog/scrypt.js"></script>
+<script type="text/javascript" src="/blog/sha256.js"></script>
+<script type="text/javascript" src="/blog/decryptor.js"></script>
+<link rel="stylesheet" type="text/css" href="/common.css">
+<link rel="stylesheet" type="text/css" href="/panel.css">
+<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
+<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
+<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
+<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
+<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
+<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
+<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
+<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
+<link rel="stylesheet" type="text/css" href="/blog/blogext.css">
+<script>
+function ol()
+{
+ window.onresize=function()
+ {
+ if(window.innerWidth<768)
+ setupevents();
+ else unsetevents();
+ }
+ window.onresize();
+ _decryptonload();
+}
+function loadTheme(){
+ var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
+ if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
+ var ent="";
+ var d=new Date();
+ if(thm[0]=='z')
+ {
+ var m=d.getMonth()+1;
+ if(m>=3&&m<6)thm='0'+thm[1];
+ else if(m>=6&&m<9)thm='1'+thm[1];
+ else if(m>=9&&m<12)thm='2'+thm[1];
+ else thm='3'+thm[1];
+ }
+ if(thm[1]=='z')
+ {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
+ ent=`theme${thm}`;
+ var R=new RegExp('theme[0-4][ab]');
+ for(var i=0;i<document.styleSheets.length;++i)
+ {
+ if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
+ document.styleSheets[i].disabled=true;
+ else document.styleSheets[i].disabled=false;
+ }
+ var thmcolor="";
+ switch(thm[0])
+ {
+ case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break;
+ case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break;
+ case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break;
+ case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break;
+ }
+ document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor);
+}
+loadTheme();
+</script>
+</head>
+<body onload="ol()" style="overflow-x:hidden;">
+ <div id="panel" class="TText">
+ <ul id="panellist">
+ <li><a href="/"><h1>Chrisoft</h1></a></li>
+ <li><a href="/blog"><h2>Blog</h2></a></li>
+ <li><a href="#"><h3 id="title">[多大图警告]ls /dev</h3></a></li>
+ <li><span>Tags</span>
+ <ul id="tagslist">
+ <li><a href="/blog/list/device-review/">device-review</a></li></ul>
+ </li>
+ <li id="tocouter">
+ <span>Table of Contents</span>
+ <ul id="tocroot">
+ <li><a class="toctarg" href="#tocanch0">Overview</a></li><li><a class="toctarg" href="#tocanch1">Actively used devices</a></li><li><ul class="tocnode"><li><a class="toctarg" href="#tocanch2">/dev/computer/srv0 -&gt; ../comp7</a></li><li><ul class="tocnode"><li><a class="toctarg" href="#tocanch3">Gallery</a></li></ul></li><li><a class="toctarg" href="#tocanch4">/dev/computer/tio0 -&gt; ../comp6</a></li><li><a class="toctarg" href="#tocanch5"><s>/dev/mobi/mob0 -&gt; </s>../mobi7</a></li><li><ul class="tocnode"><li><a class="toctarg" href="#tocanch6">UPD 2017-03-12</a></li></ul></li><li><a class="toctarg" href="#tocanch7">/dev/mobi/mob0 -&gt; ../mobi8</a></li><li><a class="toctarg" href="#tocanch8">/dev/mobi/ipod0 -&gt; ../ipod0</a></li><li><a class="toctarg" href="#tocanch9">/dev/arm/rpi0 -&gt; ../rpi0</a></li><li><a class="toctarg" href="#tocanch10">/dev/printer/lp0 -&gt; ../lp0</a></li><li><a class="toctarg" href="#tocanch11">/dev/input/kb0 -&gt; ../uhid0</a></li></ul></li><li><a class="toctarg" href="#tocanch12">Deprecated/Inactive devices</a></li><li><ul class="tocnode"><li><a class="toctarg" href="#tocanch13">/dev/comp0../dev/comp4</a></li><li><ul class="tocnode"><li><a class="toctarg" href="#tocanch14">/dev/comp0</a></li><li><a class="toctarg" href="#tocanch15">/dev/comp1</a></li><li><a class="toctarg" href="#tocanch16">/dev/comp2</a></li><li><a class="toctarg" href="#tocanch17">/dev/comp3</a></li><li><a class="toctarg" href="#tocanch18">/dev/comp4</a></li><li><a class="toctarg" href="#tocanch19">/dev/comp5</a></li></ul></li><li><a class="toctarg" href="#tocanch20">/dev/mobi0../dev/mobi6</a></li><li><ul class="tocnode"><li><a class="toctarg" href="#tocanch21">/dev/mobi0</a></li><li><a class="toctarg" href="#tocanch22">/dev/mobi1</a></li><li><a class="toctarg" href="#tocanch23">/dev/mobi2</a></li><li><a class="toctarg" href="#tocanch24">/dev/mobi3</a></li><li><a class="toctarg" href="#tocanch25">/dev/mobi4</a></li><li><a class="toctarg" href="#tocanch26">/dev/mobi5</a></li><li><a class="toctarg" href="#tocanch27">/dev/mobi6</a></li></ul></li></ul></li></ul>
+ </li>
+ <li style="margin-left:-0.5em"><a id="prevp" href="2017-01-18.html">Prev post</a></li>
+ <li style="margin-left:-0.5em"><a id="nextp" href="2017-04-11.html">Next post</a></li>
+ </ul>
+ </div>
+ <div id="content">
+ <h2 id="titleh" class="TText" style="font-wight:normal;">[多大图警告]ls /dev</h2>
+ <div id="datetags" class="TText" style="margin-bottom:1em;">2017-02-13<br>#device-review</div>
+ <hr><div id="article" class="TText">
+<p>
+有人跟我说:「对你来说你的电脑就像你的老婆一样!」。当然我是不肯承认这句话的了。
+</p>
+<p>
+但是每次提到自己的那些绝大多数都相当寒酸设备还是会像如数家珍一般……
+</p>
+<p>
+于是就有了这篇用来「数家珍」的文章。
+</p>
+<h2 id="tocanch0" class="tvis">Overview</h2>
+<p>
+因为没有专门拍合照,所以临时找了张不知道什么时候随便拍的「工作状态」的桌面做概览。
+</p>
+<div style="text-align:center;max-width:90%;"><a href="//filestorage.chrisoft.org/blog/img/IMG20161026162018.jpg"><img width="50%" src="//filestorage.chrisoft.org/blog/img/IMG20161026162018.jpg" decoding="async"></a></div>
+<p>
+图中可见我的最常用的几样设备(如果算上拍照的时候拿在手里的小米MAX的话):
+</p>
+<ul>
+<li>/dev/comp6</li>
+<li>/dev/comp7</li>
+<li>/dev/rpi0</li>
+</ul>
+<p>
+……以及我的平时超乱的机位……
+</p>
+<h2 id="tocanch1" class="tvis">Actively used devices</h2>
+<h3 id="tocanch2" class="tvis">/dev/computer/srv0 -&gt; ../comp7</h3>
+<div style="text-align:center;max-width:90%;"><a href="//filestorage.chrisoft.org/blog/img/IMG_20170120_174538_1.jpg"><img width="50%" src="//filestorage.chrisoft.org/blog/img/IMG_20170120_174538_1.jpg" decoding="async"></a>
+<br><reduced>寒假最后一次离开实验室之前所摄</reduced>
+</div>
+<p>
+嗯……这是台很有来头的组装机。它大概继承了/dev/comp4的几乎全部血统……
+</p>
+<ul>
+<li>CPU: Intel Core i7-2960XM</li>
+<li>RAM: 16GB (2x 8GB) DDR3L-1600 Samsung RAM</li>
+<li>Motherboard: Supermicro X9SCV-QV4</li>
+<li>Graphics card: NVIDIA GTX960 by ZOTAC</li>
+<li>Display: 1280x720@10.1in with 10 point multitouch</li>
+<li>/dev/sda: Crucial M4-CT256M4SSD2 (256GiB)</li>
+<li>/dev/sdb: HGST HTS721010A9E630 (1TiB)</li>
+<li>/dev/sdc: Hitachi HTS725032A9A364 (320GiB)</li>
+<li>OS: Debian GNU/Linux sid (unstable) amd64</li>
+<li>PSU: Cooler Master 500W ATX</li>
+</ul>
+<p>
+该机於2016-08-17初步组装完成,2016-08-21加装独立显卡后定型。走线混乱不堪,板卡全部裸露在外,<s>大概是实验室最大的安全隐患</s>。
+</p>
+<p>
+此机器作为我的<s>宏伟的</s>「(伪)c/s结构」
+<a id="n1" href="#note1" class="note">[1]</a>
+的一部分,乃是计划之初提供计算力的一台机器。结果等到美梦成真、计划开始执行之日,
+这台机器却变成了www服务器+ssh服务器+文件服务器+备用机+……剩余算力出租。
+现在上面跑着chrisoft.org的www服务器;ssh服务对内部开放,同时通过ssh进行文件共享。两台VirtualBox虚拟机常年跑着
+(BLOJserver, jxserver)当作「出租」<a id="n2" href="#note2" class="note">[2]</a>的剩余算力。不时在上面做一些编译软件包之类的事情。
+又因为显卡的原因,有时在上面跑waifu2x服务器,玩玩torch(CUDA啥都不会),渲染(网上下载的或者自己乱搞的、根本不能看的)blender文件,
+或者<s>颓废</s><a id="n3" href="#note3" class="note">[3]</a>。
+</p>
+<p>
+当然这台机器的配置也是相当奇葩的了——移动平台的CPU配了块中级桌面显卡,还有那块500W的电源……
+</p>
+<p>
+虽然在2017年,i7-2960XM这颗5年多前发布的CPU并没有出众的性能——其在某些跑分上甚至被skylake的最初级四核i7(i7-6700HQ)随意碾压,
+但是这也确实是我用过的最快的一颗CPU了。再加上没有了外壳的束缚,散热得以改善,这颗CPU在Timed Linux Kernel Compilation v4.3测试中跑到了134.506s的结果。
+这个结果甚至接近了被Intel列做「高端桌面处理器」的i7-3820的134.27s。嗯……虽然一个linux内核编译时长并不能说明其在所有应用场景下的性能表现...
+</p>
+<p>
+这台机器还有一个「致命」的缺陷——没有USB3.0接口。这只能责怪Cougar Point这个最后一代全USB 2.0的PCH了。唯一的PCIe接口又被用于显卡。
+但是,它还有一个空闲的SATA 3.0和两个空闲的SATA 2.0。<s>所以还需要什么USB 3.0呢</s>
+</p><p>
+即便如此,它也曾经是一台万能的机器。它可以通过wine近乎完美地运行SONAR Producer X2并使用所有我常用的VST/DirectX插件(所以它也曾是我的数字音乐工作站)、
+可以双开虚拟机不影响日常工作、可以开着Ultra级别的shader在60fps下运行Minecraft(当然。。分辨率只有1280x720)。
+然而最后还是因为屏幕太小外加懒得在两个设备之间切换彻底沦为了服务器+备用机。
+</p>
+<p>
+<s>最近发现在某些单线程应用场景下,发现i7-6600U的性能超过了这台机器的i7-2960XM。</s>
+</p>
+<p>
+Wait... i7-2960<i>XM</i>, paired with a GTX960 on a desktop machine??? Are you kidding?
+</p>
+<p>
+Well, the cause of the strange collocation is actually the shortage of money. The 2960XM, which was purchased in 2016 for
+only 1500CNY was a real bargin and I want to reuse it. However I just can't bear the performance of HD3000 Graphics. So
+the motherboard used here is a mini-ITX one with a rPGA 988B socket, which is used by some relatively older Intel core i
+series CPUs, and a PCI-e 2.0 x16 slot. The spec of the mother board can be found
+<a href="https://www.supermicro.com/products/motherboard/xeon/qm67/x9scv-qv4.cfm">here</a>.
+</p>
+<h4 id="tocanch3" class="tvis">Gallery</h4>
+<table style="max-width:90%;margin:auto;">
+<tbody><tr>
+<td>
+<a href="//filestorage.chrisoft.org/blog/img/IMG_20170120_174709_1.jpg"><img src="//filestorage.chrisoft.org/blog/img/IMG_20170120_174709_1.jpg" width="50%" decoding="async"></a><br>
+混乱<br>
+</td>
+<td>
+<a href="//filestorage.chrisoft.org/blog/img/IMG20160930125925.jpg"><img src="//filestorage.chrisoft.org/blog/img/IMG20160930125925.jpg" width="50%" decoding="async"></a><br>
+主板<br>
+</td>
+</tr>
+</tbody></table>
+<h3 id="tocanch4" class="tvis">/dev/computer/tio0 -&gt; ../comp6</h3>
+<div style="text-align:center;max-width:90%;"><a href="//filestorage.chrisoft.org/blog/img/IMG_20161231_210242.jpg"><img width="50%" src="//filestorage.chrisoft.org/blog/img/IMG_20161231_210242.jpg" decoding="async"></a>
+<br>烧水的/dev/comp6
+</div>
+<p>
+<a href="https://chrisoft.org/blog/blogreader.php?p=2016-05-12">先前写过的体验文</a>
+</p>
+<p>
+X1 yoga 2nd gen在CES 2017上亮相之后大概我这种1st gen顶配用户就要开始咒骂渣想为何不在1st gen上用Iris集显了。
+<s>不过不也就是一个15w TDP CPU的集显吗,不就是多了一倍的EU吗,反正都是辣鸡i卡性能能好到哪里去(我如是自我安慰道)</s>
+</p>
+<p>
+<s>不对人家2nd gen上都有thunderbolt和USB type-C了你说说你当时就不能再等一年吗</s>
+</p>
+<p>
+好吧上面都是玩笑话。<s>(毕竟把现在这台刚用了半年多点的机器出掉再麻烦人家从美帝带一台2nd gen也不是什么实际的想法)</s>
+但是X1 yoga 2nd gen确实不错地确解决了当时我在体验文中写道的痛点。
+</p>
+<p>
+视线回到我自己的这台上来。
+</p>
+<ul>
+<li>CPU: Intel Core i7-6600U</li>
+<li>RAM: 16GB DDR3L-1866 Samsung</li>
+<li>Graphics card: Intel HD Graphics 520</li>
+<li>/dev/nvme0: Samsung 512GB MZ-VKV5120</li>
+<li>OS1: Windows 10 Insider Pro x64</li>
+<li>OS2: Arch Linux x86-64</li>
+</ul>
+<p>
+这台彻头彻尾的学霸机被我用成了移动工作站。现在它是我的数字音频工作站,数字图像工作站——当然也是我用来生产辣鸡代码的设备。
+虽然我曾经瞧不上低电压处理器的性能,但是skylake-U的性能还是改变了我对(一部分)低电压CPU的看法(因为4.5w TDP的*-Y实在是……)。
+至少无论是从参数还是从日常表现来看,i7-6600U可以力压i5-4200H这种用在入门游戏本上的标压CPU<s>(但是人家有独显呀)</s>。
+</p>
+<p>
+当然显卡是个蛋疼之处。<s>集显就是集显,HD系列就是进化到HD1020也没用。</s><a id="n4" href="#note4" class="note">[4]</a>
+虽然HD520与我曾经忍受过的HD3000有显著的提升,但是大概还没达到能让Intel的GT2级别集显摆脱它的恶名的程度。
+</p>
+<p>
+碎屏事件发生过后,换上的屏幕有一点轻微的问题。大概是笔悬停较高的时候指针有一定概率乱跑。<s>但是因为自己不会画画而且问题只出现悬停在最高限度时,
+所以无伤大雅</s>。后来问了一下同机型的jx说是也有类似问题。难道这是Wacom AES屏的通病?
+</p>
+<p>
+至于系统,也是烦人之处之一。习惯了Linux下的工作方式然而SONAR steam最新版又无法正常在wine中运行,再加上堪忧的触屏支持,
+于是不得不保留自带的Windows 10 Pro系统。而WSL的完成度也是众人皆知。二者无法相互替代,虚拟机的集成度又无法令人满意,所以不得不选择双系统。
+后来<s>为了追求活在边缘上的刺激</s>进了insider fast ring,没为微软的测试做什么贡献倒是有这么两点感受:
+1. Insider fast比arch linux这种滚动发行版还能炸,2. <s>大概微软是真抠门到不给测试部门发工资了</s>。
+</p>
+<p>
+<s>我也是当时购机时加了$30升上Windows 10 Pro的用户啊,微软你就不能解决一下用户的问题吗(</s>
+</p>
+<h3 id="tocanch5" class="tvis"><s>/dev/mobi/mob0 -&gt; </s>../mobi7</h3>
+<div style="text-align:center;max-width:90%;"><a href="//filestorage.chrisoft.org/blog/img/20160926_164023.jpg"><img width="50%" src="//filestorage.chrisoft.org/blog/img/20160926_164023.jpg" decoding="async"></a>
+<br>遍体鳞伤的/dev/mobi7 GT-I9300(/dev/mobi5)摄
+</div>
+<p>
+如果你想知道前面那些质量差到不行的照片是什么设备拍摄的,那么答案来了,就是上图里的这台小米MAX。
+</p>
+<p>
+如果要问我对这台手机有什么评价,回答大概是这样的:
+</p>
+<p>
+小米辣鸡 <span style="font-size:141%">小米辣鸡</span> <span style="font-size:200%">小米辣鸡</span>
+</p>
+<p>
+要说这台辣鸡,啊不,小米,的身世,倒也是奇特无比。2016年暑假前一段时间,我爸突然要求换手机而且指明了要这款小米MAX。基于以往对廉价产品的偏见我试图说服他换一款买,
+但最终还是拗不过,买了。谁知道到货之后他说原来手机上东西太多不想移了……所以准备让我用这台小米MAX。……好像我原来手机里的东西不多似的!
+但是考虑到自己还在用4年多前的一台连LTE网络都不支持的Galaxy S3,我还是换上了这台小米MAX。
+</p>
+<p>
+于是我用上了这台当时让我有过能改变我对小米看法幻想的小米MAX。事实证明,这确实是个幻想。首先遇到的,就是辣鸡系统MIUI。握日,这系统真的能用?刷掉!
+然后就发现小米MAX锁了bootloader。解锁申请里我留下了愤怒的几个字:「刷机!!!」。一天不太到的时间过去,批了(效率值得称赞)。刷上CyanogenMod 13.1,一切又变得熟悉了起来。
+我也在一段时间内忘了这是一台廉价的小米……直到——
+</p>
+<p>
+啪!一天中午在实验室起身吃饭的时候它因为其巨大的体型从裤兜里滑了出来,摔在了瓷砖地面上。然后屏幕就……变成了上图里的那样。此后它还拥有了一项特殊属性:
+可以徒手拆机。哇,这可真是「可靠的品质」呢。
+</p>
+<p>
+这个样子还能用?于是在奸商那里花了200来大洋换了屏幕(在js竟然也只要200大洋……这是什么辣鸡屏?),奸商还非常贴心地贴了钢化膜。这下我想这东西大概再还能撑个两年再报废吧。
+然而,抛开中间屏幕上再次莫名其妙地出现裂纹一事,最近又一次事件可以说彻底打消了这个念头。
+</p>
+<p>
+实际上这只是一次普通的误拖电源线致使手机坠落事件。我的Galaxy S3遇到过不止一次,但这台小米MAX连一次都经受不住。现在屏幕又碎了——不过这不是重点。
+重点是后面的Micro USB几乎变成了「Zero Insertion Force」接口(literally),插拔时几乎无任何阻力。于是我现在想通了,大概这东西设计寿命应该也就一年吧。
+毕竟小米还要让他们的米粉购买新品。
+</p>
+<p>
+作为曾经的CyanogenMod的忠实用户,现在的系统当然是Lineage OS 14.1。至少用着它的时候能让我暂时忘记手里的手机是辣鸡小米。
+</p>
+<p>
+一个同学的红米note用了一年不到出现了电源键难以按下的情况。后来那位同学购入了小米5。我问他为何仍然选择小米的时候他的回答不出意料——「因为性价比高啊!」
+于是我想知道一部能用4年以上3k左右的手机,和一部只能苟活一年的千元机,到底哪个更合算。
+</p>
+<p>
+<s>最后希望那位同学的小米5能活过一年(毕竟小米5是1.5k+)</s>
+</p>
+<h4 id="tocanch6" class="tvis">UPD 2017-03-12</h4>
+<p>
+RIP小米MAX。它的使命结束于它从小米官网消失的同一天。
+</p>
+<p>
+大概从两周前开始,这部手机开始出现无故自动重启或者关机的现象。有时可能我刚放下它,再拿起来的时候就关机了……有时还会陷入重启循环。
+后来这种情况的发生频率变到了一天十多次。这显然是让人无法接受的。为了排除是软件原因导致的故障,我甚至刷回了原版的MIUI系统,
+但情况未有任何改善。于是我就购入了/dev/mobi8,到货之后这台小米MAX就光荣<s>牺牲</s>退役了。
+</p>
+<h3 id="tocanch7" class="tvis">/dev/mobi/mob0 -&gt; ../mobi8</h3>
+<p>
+新设备。1568元购入,3月8日到手。因为时间仓促(那段时间因为辣鸡小米整天重启去了,所以很多时间段都是基本处于失联状态,不得不迅速购入新机)
+而又没有预算,就随便买了这台SM-N9100(trlteduoszc)。可能这个选择也有点Galaxy S III时代对三星的好感在里边。说到这里就想到一些非常有趣的事情:
+因为最近的地区局势的原因,出现了很多「买xx的就是傻逼」这样的言论。还好我周围的人都比较宽容,没有因为这个说我是傻逼的。
+</p>
+<p>
+大概是因为都在清仓,所以很幸运地没有买到假货或者翻新品。然而因为是中国专供机型所以也不好找第三方ROM。
+<a id="n5" href="#note5" class="note">[5]</a>
+</p>
+<p>
+<s>发现这东西的性能还是比现在某些所谓的千元旗舰强的,所以大概以后没钱的话还是会遵从这种购机策略吧。</s>
+</p>
+<blockquote class="twitter-tweet" data-lang="en"><p lang="zh" dir="ltr">庆祝逃离辣鸡小米 <a href="https://t.co/kYGXSkRNjW">pic.twitter.com/kYGXSkRNjW</a></p>— Chris Xiong (@chirs241097) <a href="https://twitter.com/chirs241097/status/839623511098347520">March 8, 2017</a></blockquote>
+<script async="" src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
+<h3 id="tocanch8" class="tvis">/dev/mobi/ipod0 -&gt; ../ipod0</h3>
+<div style="text-align:center;max-width:90%;"><a href="//filestorage.chrisoft.org/blog/img/IMG20160919212614.jpg"><img width="50%" src="//filestorage.chrisoft.org/blog/img/IMG20160919212614.jpg" decoding="async"></a>
+</div>
+<p>
+特别经典的iPod,经典到它的名字就叫iPod Classic。
+</p>
+<ul>
+<li>Original iPod 6th gen 1st rev</li>
+<li>Replaced with rev 2 logic board</li>
+<li>120GB kingspec SSD</li>
+</ul>
+<p>
+这是我唯一的一台苹果设备。因为是亲戚所送的港行,所以当时自家并没有花一分钱。后来升级SSD、换电池和更换主板花掉了800大洋……
+<s>现在处于外壳S/N与机器显示不匹配的状态</s>。
+</p>
+<p>
+几乎陪伴了我高三的每个晚上。现在却被冷落了。
+</p>
+<h3 id="tocanch9" class="tvis">/dev/arm/rpi0 -&gt; ../rpi0</h3>
+<p>
+<a href="https://chrisoft.org/blog/blogreader.php?p=2015-11-22">初体验</a>
+</p>
+<p>
+吃灰专业户。买的时候是被一种奇葩的「代替智能手机的智能部分」思路指导的。
+<a id="n6" href="#note6" class="note">[6]</a>
+因为没钱就只买了一块板和一块屏。到货之后才发现没有合适的电源。
+那就先用电脑的USB输出苟着吧……于是用是能用,
+但是频率只能设定为700MHz,否则根本看不到红灯亮(供电不足)。
+也没有class 10的SD卡,那就随便拿一个class 4的插上用吧。
+之后还因为实在无法忍受class 4 SD卡的速度把除了内核以外的系统全都迁移到了U盘上。
+</p>
+<p>
+有天发现移动电源的2A输出能为rpi提供足够的电流。于是我的rpi就真的试图开始
+用它来完成某些智能手机上的「智能功能」<s>(比如浏览网页,在上面安装KDE等等)</s>。
+再后来开始将其作为移动代码设备……直到我获得了/dev/mobi6,/dev/rpi0再次被打入冷宫。
+在供电不足的rpi2上跑KDE真是作死啊。
+</p>
+<p>
+吃了一段时间的灰之后,它又被拿出来挂了一段时间www服务器。后来又被我拿来研究<s>(玩)</s>
+MAX7219芯片。本来想写个小库方便操作7219控制的显示屏的,后来懒了就只写了几个娱乐用的小程序。
+</p>
+<p>
+偶然发现rpi的Experimental OpenGL Driver进入raspbian testing之后,果断打开之,
+发现SMELT OpenGL版可以运行在这个驱动上。(嗯……此时SMELT还只有OpenGL 2.0版)
+激动万分的我立刻在上面编译了QMidiPlayer并发现包括可视化在内的功能全都正常正常工作。
+感到一丝莫名的欣慰之后就发现使用rpi原生OpenGL驱动的程序,比如minecraft-pi,无法使用了。
+不过我在minecraft-pi里面做过的事情也就是写了个python脚本到处乱放TNT吧……
+</p>
+<p>
+以后说不定会有/dev/rpi1../dev/rpi3组成集群来搞事情。
+</p>
+<h3 id="tocanch10" class="tvis">/dev/printer/lp0 -&gt; ../lp0</h3>
+<p>
+一台EPSON L360墨仓式多功能一体机。廉价产品。打印效果尚可。
+曾经两次因为长时间不使用导致打印出来的稿件缺色。于是现在放在实验室当作公用打印机。
+但是好像因为驱动原因大家都在用旁边的HP LaserJet 1020Plus(公物)。
+</p>
+<p>
+<s>曾经拿它的扫描仪扫描过一些自己不堪入目的手稿。</s>
+</p>
+<h3 id="tocanch11" class="tvis">/dev/input/kb0 -&gt; ../uhid0</h3>
+<div style="text-align:center;max-width:90%;"><a href="//filestorage.chrisoft.org/blog/img/IMG_20161218_094943.jpg"><img width="50%" src="//filestorage.chrisoft.org/blog/img/IMG_20161218_094943.jpg" decoding="async"></a>
+<br>Cherry MX Board 2.0 - black keyswitches (不要在意键盘布局)
+</div>
+<p>
+大概是价格最亲民的Cherry键盘。因为不想买花哨且过于廉价的国内某些奇怪厂商的产品选择了这把Cherry。
+也许是因为外形太低调刚拿到时甚至被身边「不识货」的人当作了普通的薄膜键盘。
+</p>
+<p>
+<s>对我来说还是硬一点黑轴爽,比红青茶什么的不知道高到那里去了</s>
+</p>
+<h2 id="tocanch12" class="tvis">Deprecated/Inactive devices</h2>
+<h3 id="tocanch13" class="tvis">/dev/comp0../dev/comp4</h3>
+<h4 id="tocanch14" class="tvis">/dev/comp0</h4>
+<p>
+家里的第一台计算机是这台2003年8k大洋购入的联想1+1电脑。由于年代久远且其尸体早已不见踪影,现在只能回忆起如下的大致配置:
+</p>
+<ul>
+<li>CPU: Pentium 4 2.0GHz</li>
+<li>RAM: 512MiB, upgraded from 256MiB</li>
+<li>Graphics card: GeForce2 MX400</li>
+<li>HDD: 80GiB, upgraded from 40GiB</li>
+<li>Display: 17in flat CRT 1024x768</li>
+<li>Modem: 56kbps</li>
+<li>OS: Windows XP</li>
+</ul>
+<p>
+ 大概当时用这个价买到这种配置的电脑应该还算值了吧……毕竟在此不久之前还是一个Windows98品牌机随便上8k的时代。
+当然大概受于当时那个时代的限制,这台电脑的配置还是相当感人的——尤其是这块GeForce2 MX400辣鸡显卡。。。
+大概只能玩自带的「联想幸福之家」中的VB写的、使用DX7.0的烈焰战机这样的游戏了。
+</p>
+<h4 id="tocanch15" class="tvis">/dev/comp1</h4>
+<p>
+ASUS A8M
+</p>
+<ul>
+ <li>CPU: Mobile AMD Sempron 3200+</li>
+ <li>RAM: 3GiB, upgraded from 512MiB</li>
+ <li>Chipset/Graphics adapter: Geforce Go 6100</li>
+ <li>HDD: None, formerly 320GiB upgraded from 80GiB</li>
+ <li>Display: 14in 1280x800</li>
+ <li>Connectivity: Realtek Ethernet &amp; Motorola 56K modem, empty WLAN card slot</li>
+ <li>OS: None. formerly Windows 7 x64, Debian amd64, Windows XP and DOS(stock OS).</li>
+</ul>
+<p>
+公物。它的配置单上简直清楚地写着「千万别用我做办公以外的事情」。原装的80GiB硬盘坏掉了。后来临时插上自己的一块320GiB的硬盘顶着。
+这台电脑闲置之后就没有把硬盘继续给它用的理由了。
+</p>
+<p>
+大概就是这台电脑给我留下了「AMD是辣鸡」的印象。Windows Vista x64装上直接蓝屏,Windows 7 x64好一些,只会在全屏看视频的时候蓝屏。
+<a id="n7" href="#note7" class="note">[7]</a>
+Debian amd64则在安装的时候直接kernel panic(后来加了点内核参数,解决了kernel panic然后安装成功了,然而XFCE都卡到不能用……)。
+</p>
+<p>
+由于自己的疏忽,它经历过一次任何笔记本都无法承受的沉重打击:从屋的一端飞到另一端然后砸在墙上。不过对于磐石来说,这大概不是什么太大的问题——
+造成的损失也就只有转轴断裂、屏幕与机身脱离而已(嗯……排线还连着)。当时被吓成智障的我用颤抖的双手将它从地上拿起后,试探性地按了一下电源键。
+看到Windows 7的开机动画之后我的心情是无法用语言描述的。
+</p>
+<p>
+不过也有很多关于这台机器的美好的回忆呢(<a id="n8" href="#note8" class="note">[8]</a>
+</p>
+<h4 id="tocanch16" class="tvis">/dev/comp2</h4>
+<p>
+ThinkPad R52
+</p>
+<ul>
+ <li>CPU: Intel Pentium M 725(?) 1.6GHz</li>
+ <li>RAM: 1.25GiB, upgraded from 256MiB</li>
+ <li>Chipset/Graphics adapter: ATI Mobility Radeon X300 64MB</li>
+ <li>HDD: Toshiba 40GiB PATA</li>
+ <li>Display: 14in 1024x768</li>
+ <li>Connectivity: Broadcom Gigabit Ethernet &amp; Intel 802.11 a/b/g</li>
+ <li>OS: Windows XP Home</li>
+</ul>
+<p>
+还是公物。虽然各种小毛病不算少,但是它的各方面的设计还是培养起了我对ThinkPad的好感。
+</p>
+<p>
+作为标准的商务机,配置自然是比较尴尬的了。尤其是升级后1.25GiB的内存,看着就令人不爽。
+拿到这台机器的时候电池应该已经有了数百次的充放电循环,用电池只能撑半个小时左右。
+另外一点就是PATA硬盘速率实在是太感人了。真是怀念那个分辨率1024x768就觉得高的时代啊。
+</p>
+<p>
+带我入了Ballance/Virtools还有Beat Hazard的坑。所以到底是该感谢它呢,还是……
+</p>
+<h4 id="tocanch17" class="tvis">/dev/comp3</h4>
+<p>
+Lenovo IdeaCentre K300
+</p>
+<ul>
+ <li>CPU: Intel Core 2 Quad Q8300 2.5GHz</li>
+ <li>RAM: 4GiB -&gt; 8GiB -&gt; 4GiB</li>
+ <li>Graphics adapter: NVIDIA Geforce GT320/li&gt;
+ </li><li>HDD: 128GiB M4 SSD+500GiB Hitachi HDD</li>
+ <li>Display: 22in 1920x1080</li>
+ <li>OS: Windows 7 Ultimate/Debian sid</li>
+</ul>
+<p>
+家里目前的的台式机。2009年春节花费8k大洋购入(辣鸡联想真坑爹)。入门级CPU,辣鸡显卡。自带两条三星2GiB DDR3-1033 RAM,
+后加装了两条Kingston 2GiB DDR3-1033 RAM。至于后来RAM容量为何又缩回了4GiB,原因其实是里面的两条「三星原装内存」坏掉了,
+一旦插上进Windows就各种蓝屏,进Linux就不断Kernel Panic...
+</p>
+<p>
+<s>虽然现在看来是如此不济的一台电脑,原来也有同时跑8台虚拟机的辉煌历史。</s>除WHG3D外,我的大部分Virtools作品都是在这台电脑上完成的。
+</p>
+<h4 id="tocanch18" class="tvis">/dev/comp4</h4>
+<p>
+Lenovo IdeaPad Y570, disassembled
+</p>
+<ul>
+ <li>CPU: Intel Core i7-2670QM -&gt; Intel Core i7-2960XM</li>
+ <li>RAM: 4GiB -&gt; 8GiB -&gt; 12GiB -&gt; 16GiB</li>
+ <li>Graphics adapter: Intel HD 3000/NVIDIA Geforce GT555M</li>
+ <li>HDD: 750GB Hitachi HDD -&gt; 256GiB M4 SSD</li>
+ <li>Display: 15in 1366x768</li>
+ <li>OS: Windows 7 Ultimate -&gt; Windows 8 Pro/Ubuntu (12.04 -&gt; 12.10) -&gt; Windows 8.1 Pro/Ubuntu dev branch -&gt; Windows 10 Pro/Debian sid</li>
+</ul>
+<p>
+把这台机器称作是<code>/dev/comp7</code>它爹也不为过。因为那台机器的CPU、内存条、硬盘都来自这台机器。而这台机器的零件现在静静地躺在实验室的某个纸箱里。
+</p>
+<p>
+该机于2012年7月购入。中间经过几次升级终于成为了最后的配置。即使从现在的需求上来看,这台机器的配置依然能够满足我的要求。只不过最后一次升级CPU的时候把转轴处的螺丝口弄断了3根……
+于是后来就彻底下定决心把它改装成了一台「台式机」了。
+</p>
+<p>
+大概也是一台很有故事的机器吧。陪我度过了高中搞OI的两个多春秋,领我进入了神妙的Linux/FOSS世界,带我认识了许多素未谋面的人,在上面编写了我的第一个工程……
+</p>
+<p>
+然后就再也不是那个1024x768分辨率都觉得大的时代了。
+</p>
+<p>
+<s>啊……不说了。再说就要开始怀古伤今了(呸</s>
+</p>
+<h4 id="tocanch19" class="tvis">/dev/comp5</h4>
+<p>
+Dell inspiron 14-5458
+</p>
+<ul>
+ <li>CPU: Intel Core i7-5500U</li>
+ <li>RAM: 4GiB</li>
+ <li>Graphics adapter: Intel HD 5500/NVIDIA Geforce GT920M</li>
+ <li>HDD: 1TiB HDD</li>
+ <li>Display: 14in 1366x768</li>
+ <li>OS: Windows 10</li>
+</ul>
+<p>
+亲戚的电脑,借给家里人用的。
+</p>
+<p>
+实际情况是当初想送给我当大学用的机器,但是看到这个极不平衡的配置<s>(以及因为戒不掉的SSD毒)</s>,我决定还是继续用我自己的机器。
+</p>
+<p>
+<s>都哪年了还出1366x768@14的电脑,辣鸡傻多戴。</s>
+</p>
+<h3 id="tocanch20" class="tvis">/dev/mobi0../dev/mobi6</h3>
+<h4 id="tocanch21" class="tvis">/dev/mobi0</h4>
+<p>
+Unknown MTK cellphone
+</p>
+<p>
+2008年购入。当年典型的采用MTK解决方案的山寨机。在那个诺基亚仍然是手机行业霸主的时代,它依然是众多山寨手机厂商的山寨对象。
+这台手机的LOGO就是NOKI∧。从主屏幕到菜单都仿的相当神似。然而深入到各个应用内部就十分粗糙了。
+</p>
+<p>
+这部具有翻盖+触屏+全键盘的神奇机器的最终命运是相当悲惨的:偷看小说时被母上大人夺去,摔了个粉身碎骨。从此再也没有在移动设备上阅读过小说。
+</p>
+<h4 id="tocanch22" class="tvis">/dev/mobi1</h4>
+<p>
+LG T310 (<a href="http://www.gsmarena.com/lg_cookie_style_t310-3458.php">gsmarena</a>)
+</p>
+<p>
+2010年OI夏令营前购入。从外观到UI上讲都是小孩子用的手机。
+</p>
+<p>
+现在触摸屏报废,躺在卧室的抽屉里。
+</p>
+<h4 id="tocanch23" class="tvis">/dev/mobi2</h4>
+<p>
+NOKIA C5-03 (<a href="http://www.gsmarena.com/nokia_c5_03-3578.php">gsmarena</a>)
+</p>
+<p>
+2011年春购入。家里第一台智能手机。
+</p>
+<p>
+成功搭上了s60v5的末班车。这也是第一台使我家路由器的WLAN不再形同虚设的设备。
+这台机器大概塑造了我的很多使用习惯,这些习惯一直延续至今。<s>包括拿手机听收音机。</s>
+</p>
+<p>
+存活到了现在。中间摔过无数次还曾掉到过热水里。后来触摸屏失效过一次,x宝上花15元购入零件后自己动手搞定。现在仍是一台备用机。
+</p>
+<h4 id="tocanch24" class="tvis">/dev/mobi3</h4>
+<p>
+NOKIA 500 (<a href="http://www.gsmarena.com/nokia_500-4085.php">gsmarena</a>)
+</p>
+<p>
+2012年春购入。当时Symbian已步入末年。本着体验WP的心态走进NOKIA体验店,得出WP是辣鸡的结论后,花了800大洋收了这部基于
+Symbian^3的入门级手机。
+</p>
+<p>
+从硬件上要说这台机器是C5-03的马甲一点也不过分。维基百科上都说C5-03的Successor就是NOKIA 500。
+不过从系统上来说用户体验的进步还是显而易见的。
+</p>
+<p>
+依然存活。大一的时候做过一段时间主力机。<s>你看人家诺基亚800元的机器质量都这么好,辣鸡小米。</s>
+</p>
+<h4 id="tocanch25" class="tvis">/dev/mobi4</h4>
+<p>
+Blackberry curve 8900 (<a href="http://www.gsmarena.com/blackberry_curve_8900-2604.php">gsmarena</a>)
+</p>
+<p>
+2014年获得的亲戚淘汰下来的黑莓。虽然从未做过自己的主力机,但是在高三的时候,有很长一段时间被我藏在课桌里用来消磨时间。
+<s>怀念那个在教室电脑上偷插网卡用来共享WiFi和把手机藏在教室电脑主机上充电的时代。</s>
+</p>
+<p>
+也算让我体验了手机的另一种交互方式吧。现仍然存活,只是电池不太能苟了。
+</p>
+<h4 id="tocanch26" class="tvis">/dev/mobi5</h4>
+<p>
+Samsung Galaxy S3 (<a href="http://www.gsmarena.com/samsung_i9300_galaxy_s_iii-4238.php">gsmarena</a>)
+</p>
+<p>
+2012年底以4kRMB购入。至今仍是我使用过的最贵的手机。
+</p>
+<p>
+陪我度过了无聊高三的另一半。上语文课我这个语文倒数和全班语文第一联机打MCPE就是用的它(语文老师则对我们两个直接选择视而不见,
+当然原因是不同的)。半夜用Root Explorer自带的编辑器写MCPE的JavaScript Mod(当时用的还是BlockLauncher)到四点的也是它。
+大一时从上铺掉下来,外屏毫发无伤内屏却坏了<a id="n9" href="#note9" class="note">[9]</a>
+的也是它。
+</p>
+<p>
+发布接近5年了,在LineageOS活跃用户数排行中它依然位居第二
+<a id="n10" href="#note10" class="note">[10]</a>。
+现在它仍然每天为我接收消息。
+</p>
+<h4 id="tocanch27" class="tvis">/dev/mobi6</h4>
+<p>
+</p><div style="text-align:center;max-width:90%;"><a href="//filestorage.chrisoft.org/blog/img/IMG00034-20150826-1529.jpg">
+<img src="//filestorage.chrisoft.org/blog/img/IMG00034-20150826-1529.jpg" width="40%" decoding="async"></a><br>
+<reduced>/dev/mobi5与/dev/mobi6的合照,/dev/mobi4所摄<reduced>
+</reduced></reduced></div>
+Samsung Galaxy Tab 2 7.0 (<a href="http://www.gsmarena.com/samsung_galaxy_tab_2_7_0_p3100-4543.php">gsmarena</a>)
+<p></p>
+<p>
+又是一台亲戚淘汰的产品。2014年获得。严格来讲这是一台平板,而不是手机。然而它在/dev/mobi5屏幕报废的这段时间内,确实是作为主力机的身份存在的。
+</p>
+<p>
+不过这个系列当年的定位也决定了它现在只能吃灰的命运。
+</p>
+</div><br><hr>
+ <div class="TText" id="notediv" style="font-size:80%;"><span class="TText"><a id="note1" href="#n1">[1]</a>: 大致是购置ThinkPad X1 yoga前提出的构想:一台固定机器提供较高的计算性能,另一台轻便机器提供便携性。<br></span><span class="TText"><a id="note2" href="#n2">[2]</a>: 其实都是免费的啦……<br></span><span class="TText"><a id="note3" href="#n3">[3]</a>: =打游戏<br></span><span class="TText"><a id="note4" href="#n4">[4]</a>: 我怎么觉得这会成为一个flag……<br></span><span class="TText"><a id="note5" href="#n5">[5]</a>: 虽然自己编译LineageOS从过程上来讲不算太复杂,但是毕竟没那个时间,主力设备也折腾不起,万一砖了那就是严重事故了。<br></span><span class="TText"><a id="note6" href="#n6">[6]</a>: 当时正值唯一一部安卓手机/dev/mobi5阵亡<br></span><span class="TText"><a id="note7" href="#n7">[7]</a>: 这大概也脱离不了它用的辣鸡nVIDIA集显的原因。<br></span><span class="TText"><a id="note8" href="#n8">[8]</a>: 比如小学半夜跟我爸俩人在上面打暴力摩托什么的<br></span><span class="TText"><a id="note9" href="#n9">[9]</a>: 见<a href="https://chrisoft.org/blog/post/2015-11-22">这篇文章</a><br></span><span class="TText"><a id="note10" href="#n10">[10]</a>: 数据来自<a href="https://stats.lineageos.org/">stats.lineageos.org</a><br></span></div>
+ <div id="insanch" style="height:3em;"></div>
+ <div id="footer" style="">
+ <div id="pagesw" class="TText" style="width:100%;height:0.5em;"></div>
+ <div style="text-align:center;" class="TText">
+ Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5
+ <br>
+ Content licensed under CC BY-SA 4.0. <span id="purgep" style="display:none;font-size:70%;">This page has passphrase(s) stored. Click <a href="javascript:_purgep()">here</a> to purge.</span>
+ </div>
+ </div>
+ <div id="cmdbuf" class="TText" style="transition:500ms;padding:1em;font-size:2em;color:white;position:absolute;background-color:rgba(0,0,0,0.6);left:50%;top:50%;transform:translate(-50%,-50%);pointer-events:none;opacity:0;">
+ </div>
+ </div>
+ <div id="decryptui" style="display:none;opacity:0;color:white;z-index:1000;position:fixed;left:0;top:0;width:100%;height:100%;background-color:rgba(0,0,0,0.4);transition:opacity 0.5s;">
+ <div id="decryptdlg" class="TText" style="padding:10px 20px;position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);background-color:rgba(0,0,0,0.6);">
+ <div id="keyhint" style="margin-bottom:8px;"></div>
+ <div style="margin-bottom:8px;">Key: <input id="keyinp" type="text" style="color:#fff;"></div>
+ <div style="height:2.25em;">
+ <button id="btndecrypt" onclick="decryptor(decid,document.getElementById('keyinp').value);" style="position:absolute;left:20px;">Decrypt</button>
+ <button onclick="hidedecryptui();" style="position:absolute;right:20px;">Cancel</button>
+ </div>
+
+ </div>
+
+
+</div></body></html> \ No newline at end of file
diff --git a/blog/post/2017-04-11.html b/blog/post/2017-04-11.html
new file mode 100644
index 0000000..9d6fc84
--- /dev/null
+++ b/blog/post/2017-04-11.html
@@ -0,0 +1,161 @@
+<html><head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<meta name="theme-color" content="#000000">
+<title>Chrisoft::Blog</title>
+<script type="text/javascript" src="/panel.js"></script>
+<script type="text/javascript" src="/blog/footnoter.js"></script>
+<script type="text/javascript" src="/blog/aes-js.js"></script>
+<script type="text/javascript" src="/blog/scrypt.js"></script>
+<script type="text/javascript" src="/blog/sha256.js"></script>
+<script type="text/javascript" src="/blog/decryptor.js"></script>
+<link rel="stylesheet" type="text/css" href="/common.css">
+<link rel="stylesheet" type="text/css" href="/panel.css">
+<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
+<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
+<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
+<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
+<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
+<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
+<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
+<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
+<link rel="stylesheet" type="text/css" href="/blog/blogext.css">
+<script>
+function ol()
+{
+ window.onresize=function()
+ {
+ if(window.innerWidth<768)
+ setupevents();
+ else unsetevents();
+ }
+ window.onresize();
+ _decryptonload();
+}
+function loadTheme(){
+ var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
+ if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
+ var ent="";
+ var d=new Date();
+ if(thm[0]=='z')
+ {
+ var m=d.getMonth()+1;
+ if(m>=3&&m<6)thm='0'+thm[1];
+ else if(m>=6&&m<9)thm='1'+thm[1];
+ else if(m>=9&&m<12)thm='2'+thm[1];
+ else thm='3'+thm[1];
+ }
+ if(thm[1]=='z')
+ {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
+ ent=`theme${thm}`;
+ var R=new RegExp('theme[0-4][ab]');
+ for(var i=0;i<document.styleSheets.length;++i)
+ {
+ if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
+ document.styleSheets[i].disabled=true;
+ else document.styleSheets[i].disabled=false;
+ }
+ var thmcolor="";
+ switch(thm[0])
+ {
+ case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break;
+ case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break;
+ case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break;
+ case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break;
+ }
+ document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor);
+}
+loadTheme();
+</script>
+</head>
+<body onload="ol()" style="overflow-x:hidden;">
+ <div id="panel" class="TText">
+ <ul id="panellist">
+ <li><a href="/"><h1>Chrisoft</h1></a></li>
+ <li><a href="/blog"><h2>Blog</h2></a></li>
+ <li><a href="#"><h3 id="title">SBS 2.0 is now the default blog browser</h3></a></li>
+ <li><span>Tags</span>
+ <ul id="tagslist">
+ <li><a href="/blog/list/devel/">devel</a></li><li><a href="/blog/list/web/">web</a></li></ul>
+ </li>
+ <li id="tocouter" style="display: none;">
+ <span>Table of Contents</span>
+ <ul id="tocroot">
+ </ul>
+ </li>
+ <li style="margin-left:-0.5em"><a id="prevp" href="2017-02-13.html">Prev post</a></li>
+ <li style="margin-left:-0.5em"><a id="nextp" href="2017-05-08.html">Next post</a></li>
+ </ul>
+ </div>
+ <div id="content">
+ <h2 id="titleh" class="TText" style="font-wight:normal;">SBS 2.0 is now the default blog browser</h2>
+ <div id="datetags" class="TText" style="margin-bottom:1em;">2017-04-11<br>#devel #web</div>
+ <hr><div id="article" class="TText">
+<article>
+<p>
+As you may have noticed, the blog system has been fully revamped. The new system
+-- the Stupid Blogging System 2.0 -- uses the same design as the new home page
+and assemblies the page dynamically in the browser using AJAX. The backend is
+written in C++ with a snake oil "cgilib" and its source code can be found
+<a href="/blog/cgi-src">here</a>. All frontend and backend code is licensed
+under the Expat (MIT) license (possibly because the code is way too useless for
+general-purpose web application development).
+</p>
+<p>
+One of the biggest changes brought to the visitors by SBS2.0 is the tags
+support. Now you can filter the posts through a single tag of your choice. By
+far the filter only accepts a single tag. Although adding support of multi-tags
+filter is fairly easy, I haven't found the reason to implement it yet.
+</p>
+<p>
+Obviously this won't work if you disable JS in your browser. Also, due to the
+usage of some ES6 features, it requires an ES6-enabled browser. The frontend is
+developed with the help of Chrome 56 and Firefox 52. Microsoft Edge doesn't like
+my code. I don't have any Apple iOS/macOS devices so I didn't test it in Safari.
+Sorry to Microsoft and Apple fanboys and fangirls!
+</p>
+<p>
+SBS2.0 is still shit compared to any other blogging systems.
+</p>
+<table>
+<tbody><tr>
+<td>Backend: </td>
+<td>cgi programs written in pure C++</td>
+</tr>
+<tr>
+<td>Frontend: </td>
+<td>Vanilla JS(ES5+some ES6 features)+HTML5+CSS3</td>
+</tr>
+<tr>
+<td>Officially supported browsers: </td>
+<td>Chrome 56+ &amp; Firefox 51+</td>
+</tr>
+</tbody></table>
+</article>
+</div><br><hr>
+ <div class="TText" id="notediv" style="font-size:80%;"></div>
+ <div id="insanch" style="height:3em;"></div>
+ <div id="footer" style="">
+ <div id="pagesw" class="TText" style="width:100%;height:0.5em;"></div>
+ <div style="text-align:center;" class="TText">
+ Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5
+ <br>
+ Content licensed under CC BY-SA 4.0. <span id="purgep" style="display:none;font-size:70%;">This page has passphrase(s) stored. Click <a href="javascript:_purgep()">here</a> to purge.</span>
+ </div>
+ </div>
+ <div id="cmdbuf" class="TText" style="transition:500ms;padding:1em;font-size:2em;color:white;position:absolute;background-color:rgba(0,0,0,0.6);left:50%;top:50%;transform:translate(-50%,-50%);pointer-events:none;opacity:0;">
+ </div>
+ </div>
+ <div id="decryptui" style="display:none;opacity:0;color:white;z-index:1000;position:fixed;left:0;top:0;width:100%;height:100%;background-color:rgba(0,0,0,0.4);transition:opacity 0.5s;">
+ <div id="decryptdlg" class="TText" style="padding:10px 20px;position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);background-color:rgba(0,0,0,0.6);">
+ <div id="keyhint" style="margin-bottom:8px;"></div>
+ <div style="margin-bottom:8px;">Key: <input id="keyinp" type="text" style="color:#fff;"></div>
+ <div style="height:2.25em;">
+ <button id="btndecrypt" onclick="decryptor(decid,document.getElementById('keyinp').value);" style="position:absolute;left:20px;">Decrypt</button>
+ <button onclick="hidedecryptui();" style="position:absolute;right:20px;">Cancel</button>
+ </div>
+
+ </div>
+
+
+</div></body></html> \ No newline at end of file
diff --git a/blog/post/2017-05-08.html b/blog/post/2017-05-08.html
new file mode 100644
index 0000000..0725132
--- /dev/null
+++ b/blog/post/2017-05-08.html
@@ -0,0 +1,407 @@
+<html><head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<meta name="theme-color" content="#000000">
+<title>Chrisoft::Blog</title>
+<script type="text/javascript" src="/panel.js"></script>
+<script type="text/javascript" src="/blog/footnoter.js"></script>
+<script type="text/javascript" src="/blog/aes-js.js"></script>
+<script type="text/javascript" src="/blog/scrypt.js"></script>
+<script type="text/javascript" src="/blog/sha256.js"></script>
+<script type="text/javascript" src="/blog/decryptor.js"></script>
+<link rel="stylesheet" type="text/css" href="/common.css">
+<link rel="stylesheet" type="text/css" href="/panel.css">
+<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
+<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
+<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
+<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
+<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
+<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
+<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
+<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
+<link rel="stylesheet" type="text/css" href="/blog/blogext.css">
+<script>
+function ol()
+{
+ window.onresize=function()
+ {
+ if(window.innerWidth<768)
+ setupevents();
+ else unsetevents();
+ }
+ window.onresize();
+ _decryptonload();
+}
+function loadTheme(){
+ var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
+ if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
+ var ent="";
+ var d=new Date();
+ if(thm[0]=='z')
+ {
+ var m=d.getMonth()+1;
+ if(m>=3&&m<6)thm='0'+thm[1];
+ else if(m>=6&&m<9)thm='1'+thm[1];
+ else if(m>=9&&m<12)thm='2'+thm[1];
+ else thm='3'+thm[1];
+ }
+ if(thm[1]=='z')
+ {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
+ ent=`theme${thm}`;
+ var R=new RegExp('theme[0-4][ab]');
+ for(var i=0;i<document.styleSheets.length;++i)
+ {
+ if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
+ document.styleSheets[i].disabled=true;
+ else document.styleSheets[i].disabled=false;
+ }
+ var thmcolor="";
+ switch(thm[0])
+ {
+ case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break;
+ case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break;
+ case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break;
+ case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break;
+ }
+ document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor);
+}
+loadTheme();
+</script>
+</head>
+<body onload="ol()" style="overflow-x:hidden;">
+ <div id="panel" class="TText">
+ <ul id="panellist">
+ <li><a href="/"><h1>Chrisoft</h1></a></li>
+ <li><a href="/blog"><h2>Blog</h2></a></li>
+ <li><a href="#"><h3 id="title">2017省赛流水帐</h3></a></li>
+ <li><span>Tags</span>
+ <ul id="tagslist">
+ <li><a href="/blog/list/contest/">contest</a></li><li><a href="/blog/list/acmicpc/">acmicpc</a></li></ul>
+ </li>
+ <li id="tocouter">
+ <span>Table of Contents</span>
+ <ul id="tocroot">
+ <li><a class="toctarg" href="#tocanch0">「一句话题解」和其他</a></li></ul>
+ </li>
+ <li style="margin-left:-0.5em"><a id="prevp" href="2017-04-11.html">Prev post</a></li>
+ <li style="margin-left:-0.5em"><a id="nextp" href="2017-06-09.html">Next post</a></li>
+ </ul>
+ </div>
+ <div id="content">
+ <h2 id="titleh" class="TText" style="font-wight:normal;">2017省赛流水帐</h2>
+ <div id="datetags" class="TText" style="margin-bottom:1em;">2017-05-08<br>#contest #acmicpc</div>
+ <hr><div id="article" class="TText">
+<article>
+<script async="" src="//cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML" charset="utf-8"></script>
+提要:
+<ul>
+ <li><s>虽然又双叒丢了冠军但是大概是大学打的最刺激的一场比赛</s>(单从比赛本身来讲)</li>
+ <li><s>到底是7个赞助商辣鸡还是主办方太抠</s></li>
+ <li><s>裁判组垃圾</s></li>
+ <li><s>我太辣鸡,还是队友new bee</s></li>
+ <li>为Pz默哀</li>
+</ul>
+<p>
+对于我这种五一假期早早就翘了OS课实验跑回家拒绝训练的咸鱼来说,好像根本没把这种级别的比赛当回事
+<s>(原因自然是因为我有队友的大腿可抱啦)</s>。所以赛前的一切事务也没怎么上心……
+包括<enlarged>起队名</enlarged>这种「重要事务」。因为某种所谓的「传统」,
+辣鸡专科学校的队伍在省赛的时候总想用队名搞事情,
+<a id="n1" href="#note1" class="note">[1]</a>
+征集搞事所用「系列」时我随手发了个「宇宙××」系列,然后就莫名其妙得票最高了。
+可是某个可恶的宇宙××,竟然违背汹涌的民意搞「暗箱操作」。于是我们被钦定了这么一个队名……
+</p>
+<div style="text-align:center;">
+ <img width="40%" src="//filestorage.chrisoft.org/blog/img/csc.png" decoding="async">
+</div>
+<p>
+嗯这是我们实验室的某个真·linguist在比赛结束后偷偷告诉我的。二?<s>所以#2的命运应该是从这时确定的……</s>
+</p>
+<p>后来几人为了抗议队名钦定发生了下图中的事件……</p>
+<div style="text-align:center;">
+ <img width="40%" src="//filestorage.chrisoft.org/blog/img/20170508_144329.jpg" decoding="async">
+ <br>
+ <reduced>图中所示为宇宙××的机位……</reduced>
+</div>
+<p>
+好吧下面开始进入正题……坐着辣鸡专科学校的校车颠了5个多小时到了青岛,然后发现司机不知道路……
+后来历尽曲折,顺着某条羊肠小道准备接近目的地的时候却发现需要爬一个我们的辣鸡校车爬不上去的坡……
+于是就被逐下车了。
+</p>
+<p>
+青岛的气候不知道比济南高到那里去了(虽然午间太阳下当然还是晒)。
+办入住手续的时候看到了大概是跟他的gf在一起的Pz。想跟他说几句话的时候这家伙却说要上厕所然后走开了。
+嗯……大概是嫌我太弱不要我了。然后就开过来一辆客货两用车,后备箱掀开一看,里面居然满满的都是盒饭,
+也就是我们的午饭……主办方印象分-- 当然原谅色选手服之类的事情就不用说了。网上都说烂了。<s>我再帮他说一遍,
+我等于……我也等于……我也有责任吧?</s>
+</p>
+<p>
+正午时分终于进了入住的房间,感觉环境还不错。<s>就是电视太辣鸡了,啥都没有的安卓系统+只有模拟信号。</s>
+然而我们却没有时间享受一下床的温暖,因为<enlarged>12:40就要集合去参加开幕式和热身赛</enlarged>?!?
+而且房间只有一把椅子,所以我只能看着先抢走椅子的队友兼室友宇宙××吃盒饭……
+然后他就连续不断地吃到了十二点半……于是我不得不缩在床边用一种奇怪的姿势吃盒饭。。。还好最后没有出事。
+</p>
+<p>
+开幕式上讲的东西都是老生常谈,当然除了一个浪潮某领导所说的「青岛离山东太远」之外。
+<s>可以看出这个家伙肯定是青岛直辖的坚定支持者。</s>热身赛则是三个中文大水题。1h不到AK后开始乱搞。
+测了测机器性能发现i5-6600竟然比不上i7-6600U……然后发现用的是对skylake超不友好的4.4版本的kernel。
+赛场布局十分紧凑,各种用料也是相当节省(这当然不是夸主办方的话)。
+键盘也是十分古老的布局,用宇宙××的话来讲「1/4的时间在用来删除打错的字符」……然而最后还是只能认栽。
+弃疗之后准备离场,却被告知不可离场。于是开始寻找有没有什么可以玩的东西,然后就发现了扫雷。
+结果一局都没玩完就被通知可以走了,也是相当的尴尬。
+</p>
+<p>
+晚上回去之后以为官方提供的晚饭也是辣鸡盒饭,所以我们队三人果断点了外卖。
+后来发现虽然官方晚餐实际上并不是盒饭,但也是转一圈下来就没什么可吃的东西了的那种。
+后来的时间就变得十分无聊。宇宙××看着电视上播放的一部叫做《产科医生》的电视剧入迷,我则在……不好,
+因为当时太困所以什么都想不起来了……后来发生的事情就是躺在床上一闭眼就丧失了对外界的感知……
+</p>
+<p>
+关于比赛过程,请见下方的『「一句话题解」与其他』段。
+</p>
+<p>
+闭幕式,三大段广告之后开始揭榜。主办方将4:3的内容伸长到一块分辨率超低的竖长条形屏幕上,
+他们这是生怕有人能看清吗……揭榜主持人是令人吃惊的不专业
+<a id="n2" href="#note2" class="note">[2]</a>,
+滚榜程序也是错误百出(乱来的颜色等等)。
+</p>
+<p>
+最后因为61分钟的用时被SKD-1864踩,rank 2。Pz则比较惨。作为老同学我表示心情还是十分复杂的。
+当然了,到了区域赛难度的比赛,如果我们还是现在这个水平,他肯定还是可以随意虐爆我们。
+</p>
+<p>
+还有我真是太辣鸡了所有签到题都要错几次(
+</p>
+<h2 id="tocanch0" class="tvis">「一句话题解」和其他</h2>
+<p>
+正如你看到的这里是一句话题解区域其实这里不仅包含题解还包含一句话题目描述和解题时的心路历程之类题目出场顺序按照解题顺序排列
+</p>
+<ul>
+<li>
+ Y:
+ <p class="nospace">
+ <span>问键盘上某个字母键的左边或右边是什么键。</span><br>
+ <span>当我看到宇宙××坐在键盘前写下<code>#include&lt;map&gt;</code>的一刻我就知道大事不好了</span>
+ <span>因为我已经隐约看到了屏幕上即将出现的类似<code>m['Q']='W';m['W']='E';</code>之类的语句</span>
+ <span>于是果断抢走机位用不到10行秒掉了这道题。</span>
+ </p>
+</li>
+<li>
+ Z:
+ <p class="nospace">
+ <span>给定两个字符串判断第二个是否可能为由第一个交换两个不同位置的元素得来。</span><br>
+ <span>因为字符串长度1000所以打算冒个险试试STL瞎搞然后就TLE了后来用聪明的方法重写了一遍AC</span>
+ <span>聪明的方法是计算两个字符串有多少个位置字符不同若为2个则一定可</span>
+ <span>若为0个且有元素在串中出现超过一次则也可</span>
+ <span>因为题目只要求交换的元素所处位置不同并未要求交换的元素不同</span>
+ <span>其他情况则不可。</span>
+ </p>
+</li>
+<li>
+ X:
+ <p class="nospace">
+ <span>佳佳的魔法药水原题。</span><br>
+ <span>首先更正一下这题大概是某古代OI网站上的一次模拟赛题目</span>
+ <span>然后就是宇宙××说这道题他已经做烂了所以就让他再施展一次吧</span>
+ <span>其实还不就是个最短路</span>
+ <span>当年写树形DP写到炸。</span>
+ </p>
+</li>
+<li>
+ I:
+ <p class="nospace">
+ <span>求fib(x)%2的值。</span><br>
+ <span>若x%3不为0则为1否则为0</span>
+ <span>虽然x可以有1000位但是被3整除的数的规律应该是小学知识吧</span>
+ <span>然后我就因为把<code>while(~scanf())</code>写成<code>while(scanf())</code></span>
+ <span>结果TLE了一发。</span>
+ </p>
+</li>
+<li>
+ F:
+ <p class="nospace">
+ <span>对于给定abc问以下命题是否成立对于任意x若a*x^2+b*x+c=0则x是整数。</span><br>
+ <span>一眼看上去是初中数学对吧</span>
+ <span>但是它其实是高中数学因为题目中并没有限定x是实数</span>
+ <span>虽然我在写第一版代码的时候还只有初中知识水平但是WA了数发之后瞬间具有了高中知识水平</span>
+ <span>到最后发现其实我连小学文化都没有因为我以为a=b=c=0时x可以取任何数于是我就认为任何数等于任何整数</span>
+ <span>改正之后发现仍然WA于是不得不认为出题人没有高中文化水平改掉了Δ&lt;0的特判</span>
+ <span>事实证明出题人就是没有高中文化水平。</span>
+ </p>
+</li>
+<li>
+ G:
+ <p class="nospace">
+ <span>给定nm求sum(i^m%(10^?+7),1,n)。</span><br>
+ <span>宇宙××乍一看卧槽矩阵快速幂然后就开始推</span>
+ <span>结果发现m在[0,10]内于是宇宙××果断开始写暴力</span>
+ <span>然而为什么一句话描述中10的指数是问号呢因为题目上写的是8</span>
+ <span>而第一次提交的大佬队也是最后的rank1队写的8WA了改成9就A了于是他们非常愤怒</span>
+ <span>而因为这支大佬队就在我们左前方所以我们很幸运。</span>
+ </p>
+</li>
+<li>
+ J:
+ <p class="nospace">
+ <span>有N种商品每种有c<sub>i</sub>个每个的基础价值为v<sub>i</sub>且可以为负</span>
+ <span>在第j天你要售出一种商品得到j*v<sub>i</sub>的价值</span>
+ <span>你可以选择从某天之后不再出售任何商品或者直到所有商品售完为止</span>
+ <span>确定一种出售商品的顺序以获得的最大价值。</span><br>
+ <span>贪心价值为正的货物一定售出且基础价值越高的越晚售出</span>
+ <span>此后按剩余物品价值递减的顺序在首部添加价值为负数的商品直到总价值开始减少为止</span>
+ <span>伟大的宇宙××很快就1A了这道题。</span>
+ </p>
+</li>
+<li>
+ C:
+ <p class="nospace">
+ <span>数轴上有N个点第i个点位于p<sub>i</sub>处对于每个点每秒会分裂为两个并分别移动到原位置正负一处</span>
+ <span>问T秒后w位置有多少个点。</span><br>
+ <span>组合数学乱搞这种东西当然不是我做的啦</span>
+ <span>我也不知道他们第一发发生了什么。</span>
+ </p>
+</li>
+<li>
+ D:
+ <p class="nospace">
+ <span>一个六边形地图可以向左下右下或者正下方走问从某起点走到另一点有多少种方案。</span><br>
+ <span>递推式是很明显的但是N<sup>2</sup>的复杂度在10<sup>5</sup>的数据下肯定炸</span>
+ <span>于是就开始试图化简或者找规律然而都没卵用</span>
+ <span>最后听了伟大的宇宙××的建议把坐标系换成平面直角系然后枚举斜向走的步数和位置</span>
+ <span>虽然我一开始也这么想了但是感觉坐标变换会比较食屎于是就没搞</span>
+ <span>但是听宇宙××这么一说不表示一下也不好于是就假装算了一下结果发现特别简单</span>
+ <span>然后就去打代码这次我的代码竟然1A了真是不容易啊哦不还是因为伟大的宇宙××英明可惜就是不知道错。</span>
+ </p>
+</li>
+<li>
+ K:
+ <p class="nospace">
+ <span>你有T分钟解N道题第i道题在第m分钟解出得到的分数是a<sub>i</sub>-d<sub>i</sub>*m</span>
+ <span>第i题需要c<sub>i</sub>分钟解出</span>
+ <span>你不能同时解多道题问在最优策略下你能得到多少分。</span><br>
+ <span>看上去非常dp的一道题于是自然就交给宇宙××了</span>
+ <span>但是N可以到2000所以根本没法表示状态</span>
+ <span>突然宇宙××灵光一现想起了他之前知道的某种全序关系</span>
+ <span>对于两个题目若其中某个在另一个之前解出这两题的总分更高则在最后顺序中这两题的顺序与此时相同</span>
+ <span>然后这道题就转换成了一个普通的背包了</span>
+ <span>伟大的宇宙××就把它1A了。</span>
+ </p>
+</li>
+<li>
+ A:
+ <p class="nospace">
+ <span>变种Nim在产生一堆空堆前选手可以选择一种额外的操作让所有石子堆中的石子个数减少K</span>
+ <span>已知初始时石子堆数n为质数给定初始状态问何方必胜。</span><br>
+ <span>不怎么会博弈的我只能打酱油</span>
+ <span>显然要分n=2和其他情况讨论</span>
+ <span>专注数学题100年的队友推出了结论然后WA了</span>
+ <span>于是开始对n&gt;3尝试打表不过发现与结论无异</span>
+ <span>后来又尝试各种更改仍然都是WA</span>
+ <span>然而我们三个zz一直没有发现n=2其实就是wythoff问题</span>
+ <span>到比赛结束前20分钟左右宇宙××拯救了世界大呼eureka</span>
+ <span>于是到283分钟6发过掉了这道题。</span>
+ </p>
+</li>
+<li>
+ B:
+ <p class="nospace">
+ <span>对于给定的Nd求存在多少长度为N位的允许有前导零的数满足</span>
+ <span>它的平方的最后N位的每一位与原数中对应位差距不超过d</span>
+ <span>数字之间的差是循环的且N&lt;=18。</span><br>
+ <span>虽然我一开始以为这道题不可做但是最后被我们戏剧性地搞了出来</span>
+ <span>题目给出了提示d=0时可能的序列只有4种</span>
+ <span>所以我认为d&gt;0的序列可以由这四个序列衍生出来</span>
+ <span>但题目未给出序列足够位数的内容所以我想出了在序列前枚举添加数字并验证性质的扩展方式</span>
+ <span>然而我觉得并没有什么卵用所以我也没告诉队友</span>
+ <span>然而宇宙××这时告诉我可以用这种方法推出任意d的情况而且他认为这就是正解</span>
+ <span>不过我感觉这样肯定无法解出因为按照我的想法结果的规模是指数级增长的</span>
+ <span>但是宇宙××坚持我写一发试试而且还强迫我手写了高精度</span>
+ <span>写完之后发现对于一个d可以由N=18推出其他任何情况的答案于是计划打表</span>
+ <span>然而发现答案规模真的是按位增长的跑了好久得出了d=1 N=17时的结果大约为1.8*10^8左右</span>
+ <span>然后这时候电脑就开始卡起来了一看内存已经几乎占满交换空间也用了80%以上了</span>
+ <span>这时候我一看打出来的那一部分表</span>
+ <span>我草这怎么都是乘以3啊</span>
+ <span>我草这怎么都这么多0啊</span>
+ <span>我草这不是乘以5吗</span>
+ <span>于是就发现了规律</span>
+ <span>然后就过了</span>
+ <span>后就过了</span>
+ <span>就过了</span>
+ <span>过了</span>
+ <span>了。</span>
+ </p><div>
+\[ ans =
+\begin{cases}
+4 &amp;\text{if } d=0
+\\
+4\times 3^{n-1} &amp; \text{if } d=1
+\\
+8\times 5^{n-1} &amp; \text{if } d=2
+\\
+8\times 7^{n-1} &amp; \text{if } d=3
+\end{cases}
+\]
+ </div>
+ <p></p>
+</li>
+</ul>
+<p>
+所以上面就是所有的「一句话题解」了。E和H都没做所以当然没有。然而值得注意的是出题人还是不太用心,
+不仅没有高中文化水平不知道复数,把10^9+7打成10^8+7,还把E题题意写错了(H%lim应为a[e[i]]%lim否则样例错误)。
+大概是主办方没有请出题人亲临现场,裁判组也不知道错。(虽然我们给威海校赛出题的时候也发生了类似的事故……
+但是这是省赛啊,ICPC官网上比赛名录中有的比赛啊 <s>而且我当时也知道错了</s>)
+像主办方太抠这样的事情倒是次要的,中间提交长时间不返回结果也不太重要,
+但我希望以后的省赛不要出现题目出错裁判组不负责任的情况了。
+</p>
+<p>
+所以,连续第三年,山大又丢了冠军。于是明年继续努力吧。不过依今年的情况看,明年我们大概就不是主力队了……
+</p>
+<p>
+外部链接
+</p>
+<ul>
+<li><a href="https://www.zhihu.com/question/59433867">相关知乎问题</a></li>
+<li><a href="http://acm.qust.edu.cn/ranklist/"><s>最终榜单(已失效)</s></a> <a href="//filestorage.chrisoft.org/blog/data/sdcpc2017ranklist.html">镜像</a></li>
+</ul>
+<p>
+最后放几张旅游照片
+</p>
+<div style="text-align:center;">
+ <img width="80%" src="//filestorage.chrisoft.org/blog/img/20170506_101422.jpg" decoding="async">
+ <br>
+ <img width="40%" src="//filestorage.chrisoft.org/blog/img/20170507_080324.jpg" decoding="async">
+ <img width="40%" src="//filestorage.chrisoft.org/blog/img/20170507_080334.jpg" decoding="async">
+ <br>
+ <img width="80%" src="//filestorage.chrisoft.org/blog/img/20170507_144512.jpg" decoding="async">
+ <br>
+ <img width="80%" src="//filestorage.chrisoft.org/blog/img/20170508_074642.jpg" decoding="async">
+ <br>
+ <img width="80%" src="//filestorage.chrisoft.org/blog/img/20170508_074729.jpg" decoding="async">
+</div>
+</article>
+</div><br><hr>
+ <div class="TText" id="notediv" style="font-size:80%;"><span class="TText"><a id="note1" href="#n1">[1]</a>: 好吧其实我个人不喜欢这种搞事……<br></span><span class="TText"><a id="note2" href="#n2">[2]</a>: 表现为因没有排练导致的对ACM系列比赛揭榜的基本规则的完全不了解<br></span></div>
+ <div id="insanch" style="height:3em;"></div>
+ <div id="footer" style="">
+ <div id="pagesw" class="TText" style="width:100%;height:0.5em;"></div>
+ <div style="text-align:center;" class="TText">
+ Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5
+ <br>
+ Content licensed under CC BY-SA 4.0. <span id="purgep" style="display:none;font-size:70%;">This page has passphrase(s) stored. Click <a href="javascript:_purgep()">here</a> to purge.</span>
+ </div>
+ </div>
+ <div id="cmdbuf" class="TText" style="transition:500ms;padding:1em;font-size:2em;color:white;position:absolute;background-color:rgba(0,0,0,0.6);left:50%;top:50%;transform:translate(-50%,-50%);pointer-events:none;opacity:0;">
+ </div>
+ </div>
+ <div id="decryptui" style="display:none;opacity:0;color:white;z-index:1000;position:fixed;left:0;top:0;width:100%;height:100%;background-color:rgba(0,0,0,0.4);transition:opacity 0.5s;">
+ <div id="decryptdlg" class="TText" style="padding:10px 20px;position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);background-color:rgba(0,0,0,0.6);">
+ <div id="keyhint" style="margin-bottom:8px;"></div>
+ <div style="margin-bottom:8px;">Key: <input id="keyinp" type="text" style="color:#fff;"></div>
+ <div style="height:2.25em;">
+ <button id="btndecrypt" onclick="decryptor(decid,document.getElementById('keyinp').value);" style="position:absolute;left:20px;">Decrypt</button>
+ <button onclick="hidedecryptui();" style="position:absolute;right:20px;">Cancel</button>
+ </div>
+
+ </div>
+
+
+</div></body></html> \ No newline at end of file
diff --git a/blog/post/2017-06-09.html b/blog/post/2017-06-09.html
new file mode 100644
index 0000000..a20e560
--- /dev/null
+++ b/blog/post/2017-06-09.html
@@ -0,0 +1,254 @@
+<html><head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<meta name="theme-color" content="#000000">
+<title>Chrisoft::Blog</title>
+<script type="text/javascript" src="/panel.js"></script>
+<script type="text/javascript" src="/blog/footnoter.js"></script>
+<script type="text/javascript" src="/blog/aes-js.js"></script>
+<script type="text/javascript" src="/blog/scrypt.js"></script>
+<script type="text/javascript" src="/blog/sha256.js"></script>
+<script type="text/javascript" src="/blog/decryptor.js"></script>
+<link rel="stylesheet" type="text/css" href="/common.css">
+<link rel="stylesheet" type="text/css" href="/panel.css">
+<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
+<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
+<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
+<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
+<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
+<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
+<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
+<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
+<link rel="stylesheet" type="text/css" href="/blog/blogext.css">
+<script>
+function ol()
+{
+ window.onresize=function()
+ {
+ if(window.innerWidth<768)
+ setupevents();
+ else unsetevents();
+ }
+ window.onresize();
+ _decryptonload();
+}
+function loadTheme(){
+ var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
+ if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
+ var ent="";
+ var d=new Date();
+ if(thm[0]=='z')
+ {
+ var m=d.getMonth()+1;
+ if(m>=3&&m<6)thm='0'+thm[1];
+ else if(m>=6&&m<9)thm='1'+thm[1];
+ else if(m>=9&&m<12)thm='2'+thm[1];
+ else thm='3'+thm[1];
+ }
+ if(thm[1]=='z')
+ {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
+ ent=`theme${thm}`;
+ var R=new RegExp('theme[0-4][ab]');
+ for(var i=0;i<document.styleSheets.length;++i)
+ {
+ if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
+ document.styleSheets[i].disabled=true;
+ else document.styleSheets[i].disabled=false;
+ }
+ var thmcolor="";
+ switch(thm[0])
+ {
+ case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break;
+ case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break;
+ case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break;
+ case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break;
+ }
+ document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor);
+}
+loadTheme();
+</script>
+</head>
+<body onload="ol()" style="overflow-x:hidden;">
+ <div id="panel" class="TText">
+ <ul id="panellist">
+ <li><a href="/"><h1>Chrisoft</h1></a></li>
+ <li><a href="/blog"><h2>Blog</h2></a></li>
+ <li><a href="#"><h3 id="title">Fuck Windows et cetera</h3></a></li>
+ <li><span>Tags</span>
+ <ul id="tagslist">
+ <li><a href="/blog/list/daily-life/">daily-life</a></li></ul>
+ </li>
+ <li id="tocouter">
+ <span>Table of Contents</span>
+ <ul id="tocroot">
+ <li><a class="toctarg" href="#tocanch0">Fuck Windows...</a></li><li><a class="toctarg" href="#tocanch1">...和其他</a></li><li><ul class="tocnode"><li><a class="toctarg" href="#tocanch2">a</a></li><li><a class="toctarg" href="#tocanch3">b</a></li><li><a class="toctarg" href="#tocanch4">c</a></li><li><a class="toctarg" href="#tocanch5">d</a></li><li><a class="toctarg" href="#tocanch6">z</a></li></ul></li></ul>
+ </li>
+ <li style="margin-left:-0.5em"><a id="prevp" href="2017-05-08.html">Prev post</a></li>
+ <li style="margin-left:-0.5em"><a id="nextp" href="2017-06-29.html">Next post</a></li>
+ </ul>
+ </div>
+ <div id="content">
+ <h2 id="titleh" class="TText" style="font-wight:normal;">Fuck Windows et cetera</h2>
+ <div id="datetags" class="TText" style="margin-bottom:1em;">2017-06-08<br>#daily-life</div>
+ <hr><div id="article" class="TText">
+<article>
+<b>警告:本文某些部分有很重的戾气。小心阅读。</b>
+<h2 id="tocanch0" class="tvis">Fuck Windows...</h2>
+<p>
+两个月前,我的X1 yoga上的Windows 10 Pro Insider (16170)爆炸了。
+具体表现为一旦试图安装新的Insider版本就会在第二次重启后进度达到60%左右(具体数值是浮动的)
+时绿屏(图可见我于5月16日发出的tweet)。由于完全无法查出原因(错误信息过于模糊而且无法找到内存转储),
+一直没修好。一直拖到16170过期(开始每几个小时重启一次)之后,我对它依然束手无策。
+于是5月16日一气之下就重置了Windows安装。此后的几天,除了从零开始配置环境
+(最大的东西是SONAR以及它的各种外围软件,其次是各种开发环境)可以把人累死之外,还算是风平浪静的。
+</p>
+<p>
+今天闲来无事装了个rEFInd,终于改变了这台机器买来之后开机F12选择系统的情况。然后进了一趟Windows
+(此时是16199),发现M$推送了16215,于是就点了安装睡午觉去了。醒来一看,为什么还是16199?
+难道以前相同的惨剧又在我的电脑上发生了一次?于是在我的监督下,我又让它安装了一次。
+发现这次的现象倒与上次不同了:这次会在安装进行到7%处时卡很久然后突然重启。众所周知,
+正常情况下第一次重启应该在30%附近。重启之后它就……它就回滚了。
+</p>
+<p>
+不过幸好16199大概是slow ring的更新,过期时间在12月。不然我大概最近又要Reset Windows了……
+</p>
+<p>
+所以微软这几年下来,换了CEO,依然在变得越来越艹蛋。虽然新CEO声称"M$ &lt;3 Linux"
+<a id="n1" href="#note1" class="note">[1]</a>,
+但作出的事情却更像在挤压Linux的生存空间<a id="n2" href="#note2" class="note">[2]</a>。然而他们自己的系统,
+即使抛开「自由」不谈,也在变得越来越不值得信任。
+比如最近在16199上一个我经常使用的小程序竟然会炸掉GDI并因此导致屏幕上所有元素闪烁/错位。
+</p>
+<p>
+于是现在有点后悔当时为什么没有坚持自己的「方针」,拒绝购买预装Windows的电脑了。
+当然如果购买Mac的话,只是将自己从一个泥潭中拉进另一个泥潭而已。所以,我似乎并没有太多选择……
+</p>
+<p>
+现在我保留Windows仅有的目的是为了使用SONAR和编译一部分项目的Windows版。
+如果这个平台继续如此令人失望下去的话,我不得不考虑放弃这两项活动或者寻求替代方案了。
+</p>
+<p>
+哦,还有一点。我在Feedback Hub里写的所有反馈都如同石沉大海。大概实际上并没有微软的员工去读它们吧。
+</p>
+<h2 id="tocanch1" class="tvis">...和其他</h2>
+<h3 id="tocanch2" class="tvis">a</h3>
+<p>
+陕西邀请赛跪了。
+</p>
+<p>
+总之,只能怪自己太弱。继续努力吧。
+</p>
+<p>
+(回来之后还因为「铺张浪费」<s>、「公然违反中央八项规定」</s>被批判了一番。)
+</p>
+<h3 id="tocanch3" class="tvis">b</h3>
+<p>
+ACM队里的队友耍起了朋友。他来实验室的频率显著降低以及日常行为的微妙变化暴露了他
+<a id="n3" href="#note3" class="note">[3]</a>。
+</p>
+<p>
+虽然,都大学了,谈恋爱大概也是很多人todo list上的一件事,但我希望这并不会影响我们队的正常学习和交流。
+</p>
+<p>
+最后,作为一个asexual个体,一个彻底的旁观者,祝他们幸福<a id="n4" href="#note4" class="note">[4]</a>。
+</p>
+<h3 id="tocanch4" class="tvis">c</h3>
+<p>
+说一说校赛的事情。从校赛的组织来看实验室的目前状况。
+</p>
+<p>
+关于此事,本来是想写一篇独立的文章的。最后……懒。
+</p>
+<p>
+作为校赛组织方中出题组核心成员和一名重度拖延症患者,不到最后一刻我是不会提供题目的终稿的。
+最后也因为这些,在题目上出了一些问题。主要责任在我……大概太不会甩锅而且过于放任实验室其他队伍了吧。
+因为并不信任实验室其他成员的英语水平<a id="n5" href="#note5" class="note">[5]</a>,
+从题目描述到最后的LaTeX文档,都是我一人包办的。最后累趴了才赶完终稿……
+</p>
+<p>
+大概还要怪自己对别人太宽松<s>(心太软)</s>了吧。我下达测题任务时,分了3个等级:
+</p>
+<ol>
+<li>写出6道题的代码</li>
+<li>写出7道题的思路</li>
+<li>写出全部题目的抽象描述</li>
+</ol>
+<p>
+依照校赛题目的难度,15级实验室的大部分成员就是在三个小时内写出除防AK题之外的所有题目的代码也应该并不是什么问题。
+然而,我得到的回应却是几个「请假」的请求和寥寥无几的几个人发来的签到题思路。发来代码的更是凤毛麟角。
+实话讲,只要有任何人认真地阅读过题目,应该就能避免出现在印刷版试题上的愚蠢错误。然而事实并没有如此理想。
+</p>
+<p>
+然后实验室的现状就是,常驻的没几个,干「正事」的更少,大概只剩一两个了吧。
+当然其他成员在宿舍到底是在修炼还是在打游戏还是在谈朋友我也不清楚,不好妄加评价。
+</p>
+<p>
+不过最后,抱怨是没用的,得作出改变才行。顺便提醒一下有心脏缺陷的自己继续这么干下去随时有猝死的危险。
+</p>
+<p>
+<a href="/sduacm2017/">相关链接</a>
+</p>
+<p>
+(最后顺便吐槽一下用了我们出的题目的SDU威海校区给的报酬没有一分到我手上)
+<a id="n6" href="#note6" class="note">[6]</a>
+</p>
+<h3 id="tocanch5" class="tvis">d</h3>
+<p>
+最担心的事情还是发生了:实验室被「没收」了。
+</p>
+<p>
+依据学校的「最新规划」,三区的所有大房间都将被收回改造成所谓的展室。所有实验室均需从剩余的小房间中重新申请。
+</p>
+<p>
+我以前说过什么来着?
+</p>
+<blockquote>
+<p>
+——看我们占着教学楼主门对着的大房间不爽了吧
+</p>
+<p>
+——「这种黄金地段怎么能让你们这种不赚钱的辣鸡实验室占着」
+</p>
+</blockquote>
+<p>
+然而现在的情况还是稍微与预想的有点区别的——被拿来做了可能一年都用不到一次的展室。
+大概又是哪个领导搞的面子工程中的一环吧。不过结果都是大同小异:我们被赶走了。
+</p>
+<p>
+暑假开始之前就要被逐走,于是暑期集训又成了一个问题。情况甚至没有上个暑假乐观。
+</p>
+<p>
+mdzz辣鸡专科学校 都要消失的校区了 搞什么展室 搞你的章丘校区去啊cnbb
+</p>
+<h3 id="tocanch6" class="tvis">z</h3>
+<p>
+org.christine.switch() is now implemented. Just imagine that.
+</p>
+</article>
+</div><br><hr>
+ <div class="TText" id="notediv" style="font-size:80%;"><span class="TText"><a id="note1" href="#n1">[1]</a>: I'd just like to interject for a moment. ...<br></span><span class="TText"><a id="note2" href="#n2">[2]</a>: WSL<br></span><span class="TText"><a id="note3" href="#n3">[3]</a>: 使我在他正式宣布此事之前注意到了<br></span><span class="TText"><a id="note4" href="#n4">[4]</a>: <s>乌鸦嘴失效!</s><br></span><span class="TText"><a id="note5" href="#n5">[5]</a>: 除了水平超强的ldc,没有安排给他是考虑到他的个人原因。<br></span><span class="TText"><a id="note6" href="#n6">[6]</a>: 当然如果能全进实验室经费我也是高兴的,然而……<br></span></div>
+ <div id="insanch" style="height:3em;"></div>
+ <div id="footer" style="">
+ <div id="pagesw" class="TText" style="width:100%;height:0.5em;"></div>
+ <div style="text-align:center;" class="TText">
+ Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5
+ <br>
+ Content licensed under CC BY-SA 4.0. <span id="purgep" style="display:none;font-size:70%;">This page has passphrase(s) stored. Click <a href="javascript:_purgep()">here</a> to purge.</span>
+ </div>
+ </div>
+ <div id="cmdbuf" class="TText" style="transition:500ms;padding:1em;font-size:2em;color:white;position:absolute;background-color:rgba(0,0,0,0.6);left:50%;top:50%;transform:translate(-50%,-50%);pointer-events:none;opacity:0;">
+ </div>
+ </div>
+ <div id="decryptui" style="display:none;opacity:0;color:white;z-index:1000;position:fixed;left:0;top:0;width:100%;height:100%;background-color:rgba(0,0,0,0.4);transition:opacity 0.5s;">
+ <div id="decryptdlg" class="TText" style="padding:10px 20px;position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);background-color:rgba(0,0,0,0.6);">
+ <div id="keyhint" style="margin-bottom:8px;"></div>
+ <div style="margin-bottom:8px;">Key: <input id="keyinp" type="text" style="color:#fff;"></div>
+ <div style="height:2.25em;">
+ <button id="btndecrypt" onclick="decryptor(decid,document.getElementById('keyinp').value);" style="position:absolute;left:20px;">Decrypt</button>
+ <button onclick="hidedecryptui();" style="position:absolute;right:20px;">Cancel</button>
+ </div>
+
+ </div>
+
+
+</div></body></html> \ No newline at end of file
diff --git a/blog/post/2017-06-29.html b/blog/post/2017-06-29.html
new file mode 100644
index 0000000..c60f9bb
--- /dev/null
+++ b/blog/post/2017-06-29.html
@@ -0,0 +1,698 @@
+<html><head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<meta name="theme-color" content="#000000">
+<title>Chrisoft::Blog</title>
+<script type="text/javascript" src="/panel.js"></script>
+<script type="text/javascript" src="/blog/footnoter.js"></script>
+<script type="text/javascript" src="/blog/aes-js.js"></script>
+<script type="text/javascript" src="/blog/scrypt.js"></script>
+<script type="text/javascript" src="/blog/sha256.js"></script>
+<script type="text/javascript" src="/blog/decryptor.js"></script>
+<link rel="stylesheet" type="text/css" href="/common.css">
+<link rel="stylesheet" type="text/css" href="/panel.css">
+<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
+<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
+<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
+<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
+<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
+<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
+<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
+<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
+<link rel="stylesheet" type="text/css" href="/blog/blogext.css">
+<script>
+function ol()
+{
+ window.onresize=function()
+ {
+ if(window.innerWidth<768)
+ setupevents();
+ else unsetevents();
+ }
+ window.onresize();
+ _decryptonload();
+}
+function loadTheme(){
+ var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
+ if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
+ var ent="";
+ var d=new Date();
+ if(thm[0]=='z')
+ {
+ var m=d.getMonth()+1;
+ if(m>=3&&m<6)thm='0'+thm[1];
+ else if(m>=6&&m<9)thm='1'+thm[1];
+ else if(m>=9&&m<12)thm='2'+thm[1];
+ else thm='3'+thm[1];
+ }
+ if(thm[1]=='z')
+ {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
+ ent=`theme${thm}`;
+ var R=new RegExp('theme[0-4][ab]');
+ for(var i=0;i<document.styleSheets.length;++i)
+ {
+ if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
+ document.styleSheets[i].disabled=true;
+ else document.styleSheets[i].disabled=false;
+ }
+ var thmcolor="";
+ switch(thm[0])
+ {
+ case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break;
+ case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break;
+ case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break;
+ case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break;
+ }
+ document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor);
+}
+loadTheme();
+</script>
+</head>
+<body onload="ol()" style="overflow-x:hidden;">
+ <div id="panel" class="TText">
+ <ul id="panellist">
+ <li><a href="/"><h1>Chrisoft</h1></a></li>
+ <li><a href="/blog"><h2>Blog</h2></a></li>
+ <li><a href="#"><h3 id="title">Trash dump for the fourth semester</h3></a></li>
+ <li><span>Tags</span>
+ <ul id="tagslist">
+ <li><a href="/blog/list/garbage/">garbage</a></li><li><a href="/blog/list/daily-life/">daily-life</a></li></ul>
+ </li>
+ <li id="tocouter">
+ <span>Table of Contents</span>
+ <ul id="tocroot">
+ <li><a class="toctarg" href="#tocanch0">课程相关</a></li><li><a class="toctarg" href="#tocanch1">ACM相关</a></li><li><ul class="tocnode"><li><a class="toctarg" href="#tocanch2">校赛</a></li><li><ul class="tocnode"><li><a class="toctarg" href="#tocanch3">榜单</a></li><li><a class="toctarg" href="#tocanch4">「<s>Net&nbsp;Celebrity</s>」??</a></li></ul></li><li><a class="toctarg" href="#tocanch5">省赛</a></li><li><a class="toctarg" href="#tocanch6">陕西邀请赛</a></li><li><a class="toctarg" href="#tocanch7">实验室没收与暑期集训</a></li><li><a class="toctarg" href="#tocanch8">真的成为运维了?</a></li><li><a class="toctarg" href="#tocanch9">以后我们还存在吗? &amp; 再谈SDU对ACM的态度</a></li><li><a class="toctarg" href="#tocanch10">170722补</a></li><li><a class="toctarg" href="#tocanch11">Yet Another addition...</a></li></ul></li><li><a class="toctarg" href="#tocanch12">各种坑</a></li><li><ul class="tocnode"><li><a class="toctarg" href="#tocanch13">QMP</a></li><li><a class="toctarg" href="#tocanch14">SMELT</a></li><li><a class="toctarg" href="#tocanch15">chrisoft.org</a></li><li><a class="toctarg" href="#tocanch16">其他</a></li></ul></li><li><a class="toctarg" href="#tocanch17">弃用QQ与Reddit中毒 &amp; SNS</a></li><li><a class="toctarg" href="#tocanch18">Gaming? WTF?</a></li><li><a class="toctarg" href="#tocanch19">「Freedom」</a></li><li><ul class="tocnode"><li><a class="toctarg" href="#tocanch20">2017-08-23补记</a></li><li><a class="toctarg" href="#tocanch21">Who controls who</a></li><li><a class="toctarg" href="#tocanch22">Myths about the GPL</a></li><li><a class="toctarg" href="#tocanch23">Attempted assassination by Open Source</a></li><li><a class="toctarg" href="#tocanch24">Closing this part</a></li></ul></li><li><a class="toctarg" href="#tocanch25">接着婊辣鸡专科学校</a></li><li><ul class="tocnode"><li><a class="toctarg" href="#tocanch26">山东挖地大学</a></li><li><a class="toctarg" href="#tocanch27">山东inf个校区大学</a></li><li><a class="toctarg" href="#tocanch28">山东草(4)房子大学</a></li><li><a class="toctarg" href="#tocanch29">山东不准坐高铁大学</a></li><li><a class="toctarg" href="#tocanch30">Closing...</a></li></ul></li><li><a class="toctarg" href="#tocanch31">Other random stuff</a></li><li><ul class="tocnode"><li><a class="toctarg" href="#tocanch32">贴吧 &amp; Ballance</a></li><li><a class="toctarg" href="#tocanch33">「实名制」</a></li><li><a class="toctarg" href="#tocanch34">"The Hatred"</a></li><li><ul class="tocnode"><li><a class="toctarg" href="#tocanch35">the Apple Hatred</a></li><li><a class="toctarg" href="#tocanch36">the JavaScript Hatred</a></li><li><a class="toctarg" href="#tocanch37">the Microsoft Hatred</a></li><li><a class="toctarg" href="#tocanch38">the &lt;insert Chinese mobile phone brand here&gt; Hatred</a></li></ul></li></ul></li><li><a class="toctarg" href="#tocanch39">生活垃圾</a></li><li><ul class="tocnode"><li><a class="toctarg" href="#tocanch40">宿舍?寝室?</a></li><li><a class="toctarg" href="#tocanch41">Side B</a></li></ul></li></ul>
+ </li>
+ <li style="margin-left:-0.5em"><a id="prevp" href="2017-06-09.html">Prev post</a></li>
+ <li style="margin-left:-0.5em"><a id="nextp" href="2017-11-25.html">Next post</a></li>
+ </ul>
+ </div>
+ <div id="content">
+ <h2 id="titleh" class="TText" style="font-wight:normal;">Trash dump for the fourth semester</h2>
+ <div id="datetags" class="TText" style="margin-bottom:1em;">2017-06-29<br>#garbage #daily-life</div>
+ <hr><div id="article" class="TText">
+<article>
+<style>
+article h2,article h3{border-bottom:1px solid #c0c0c0;overflow:hidden;}
+</style>
+<h2 id="tocanch0" class="tvis">课程相关</h2>
+<s>于是这学期上了些什么课来着……</s>
+<ul>
+<li>数据结构课设:Qt瞎搞蒙混过关,期间数次试图装13<s>(未果)</s></li>
+<li>面向对象:对象?考试的时候写上的东西大概都是现编的。求过(</li>
+<li>数据库:别人小学就会的东西,我现在还不会。考试大概是混过去的。</li>
+<li>操作系统:没<s>钱</s>买中文课本又听不太懂老师标准的济南普通话,试卷只好用全英文作答了(</li>
+<li>马克思:??????(a.k.a.马季恨<a id="n1" href="#note1" class="note">[1]</a>):??????</li>
+</ul>
+<p>
+ 结果就是除了OS上了90之外其他全在80上下。当然马季恨是光荣地以69的高分拿到了倒数第七。
+</p>
+<h2 id="tocanch1" class="tvis">ACM相关</h2>
+<p>
+虽然在夹缝中零星地做了一些题目……但是感觉自己的水平依旧辣鸡。。。<s>只能寄希望于暑期集训了。</s>
+</p>
+<h3 id="tocanch2" class="tvis">校赛</h3>
+<p>
+轮到我们这一届办校赛了。于是又有一大堆事情「很自然地」落到了自己的头上……
+于是不论是题面数据环境配置抑或PC^2服务器配置之类的脏活就都我一个人包了。
+当然该吐槽的我都在上一篇里面一吐为快了,这里讲点有意思的事情(
+</p>
+<h4 id="tocanch3" class="tvis">榜单</h4>
+<p>
+如果你不知道在哪里看榜单的话<a href="https://chrisoft.org/sduacm2017/">点我</a>。
+</p>
+<p>
+首先要吐槽的就是夺冠大热门「粉粉哒小裙子」队新生组被压了。<s>叫你们占着这么好的队名不女装参赛,哼!</s>
+然而这3位dalao的实力在高年级组还是得到了施展……挂星拿到了第一。
+</p>
+<p>
+然后就是一些奇奇怪怪的牢骚啦,比如「新生组G题辣鸡数据居然把|S|^2的暴力都放过去了。该打,该打!」,
+以及「新生组B题才3队过?仿佛在逗我笑」之类。<s>另外到场的队伍都至少通过了一题,看我们题目出的多好。</s>
+</p>
+<h4 id="tocanch4" class="tvis">「<s>Net&nbsp;Celebrity</s>」??</h4>
+<p>
+嗯……事情大概是这样的:在校赛前我由于不可抗力当了一回主播(
+</p>
+<p>
+因为辣鸡专科学校两地办学,所以宣讲会在青岛定为观看济南的实时直播……
+</p>
+<p>为防瞎各位看官的眼,不直接放图。以下这些被安卓的「绿化」JPEG压缩算法压绿了的图盗自某智障<s>学长</s>的qq空间。</p>
+<p>
+ <a href="//filestorage.chrisoft.org/blog/img/yzg0.jpg">图1</a>
+ <a href="//filestorage.chrisoft.org/blog/img/yzg1.jpg">图2</a>
+ <a href="//filestorage.chrisoft.org/blog/img/yzg2.jpg">图3</a>
+</p>
+<p>
+ <reduced>什么?哪个是我?<s>我怎么知道</s></reduced>
+</p>
+<p>
+ 另外不要在意为什么我们实验室的人都穿得这么奇怪。<s>大概是一种文化吧</s>
+</p>
+<h3 id="tocanch5" class="tvis">省赛</h3>
+<p>
+ 该说的都差不多在流水帐里记过了。
+</p>
+<p>
+ 虽然拿第二其实是意料之中的事情……但是第一的归属却是意料之外的。。。
+</p>
+<p>
+ 明年……再战?
+</p>
+<h3 id="tocanch6" class="tvis">陕西邀请赛</h3>
+<p>
+ 太丢人了不说了。
+</p>
+<p>
+ <s>某「学长」开一题WA一题好像不足以当作什么用来吹嘘的资本</s>
+</p>
+<h3 id="tocanch7" class="tvis">实验室没收与暑期集训</h3>
+<p>
+ 关于实验室没收的背景,请参照<a href="/blog/post/2017-06-09#tocanch5">此段</a>。
+</p>
+<p>
+ 于是实验室消失已经是板上钉钉的事情了,现在我们的地位大概相当于「钉子户」之类的东西吧。
+ 大约7月8日左右就要被正式赶走了。到时候又可以感受一下烈日之下搬运东西的快感了。
+</p>
+<p>
+ 这一届的暑期集训也就因此成了一个比去年更加棘手的问题。去年还「仅仅」是校区装修,今年活动场地却直接被剥夺了。
+ 作为「补偿」,学校给我们提供了一个有一大堆他们制定的规矩的机房——这也就意味着再也不可能晚上留在实验室打cf,
+ 更别提在里面吃东西了<a id="n2" href="#note2" class="note">[2]</a>。
+</p>
+<p>
+ 在这样的地方……大概是很难进wf的。
+</p>
+<h3 id="tocanch8" class="tvis">真的成为运维了?</h3>
+<p>
+ 最初听说要成为SDUOJ运维的时候,我是拒绝的。因为我一向对网站运维这方面的工作没有太大兴趣——
+ 从我自己的网站有多辣鸡这点上大家应该也能看出来。然而实验室里面大概没有其他的合适人选……
+ 所以这事又「很自然」地落到我的头上了。
+</p>
+<p>
+ 然后<a href="//filestorage.chrisoft.org/blog/img/Screenshot_20170702_225150.png">这里</a>是我在给现任运维当助手时做的一点微小的工作之一。
+ (这样的页面还有数百页……大概多亏了这些testbot才造成了这个辣鸡OJ有上万提交的假象(
+</p>
+<p>
+ <s>(所以叫我这种具有极强破坏性的人来做运维真的不担心我给服务器换上Debian Experimental吗)</s>
+</p>
+<p>
+ 呃……我们回到正题上来。即将由我来维护的,是几个刚刚毕业的学长<a id="n3" href="#note3" class="note">[3]</a>几年前用Django写的一个实训项目。
+ 然而我并没有用Django做过任何有用的东西。当前这个版本最初上线的时候,很多功能还未实现,ranklist东西一多就卡到爆炸,
+ 以及随便几个同时提交就能让整个网站崩掉……这些问题都被现任运维解决掉了。不过依然有很多待解决的问题,
+ 比如用AJAX的页面竟然不存页面状态之类的……
+</p>
+<p>
+ 大概熟悉我的都知道我有一个挖了很久的坑没填……嗯这坑就是自己的OJ。然而看看现在的状况,大概填坑形势还是不容乐观的。
+</p>
+<h3 id="tocanch9" class="tvis">以后我们还存在吗? &amp; 再谈SDU对ACM的态度</h3>
+<p>
+ 2016级软工这边的纳新与入门工作结果,几乎只能用「惨烈」来形容。一个学期下来,最后一次讨论班只有3个人来了……简直凄惨无比。
+ 所以到底是什么原因把SE的新人都吓跑了呢?16级CS的dalao一个个都太强或许是原因之一,另一个原因就是我们讲东西的速度可能太快了。
+ 当然有竞赛经验的dalao去CS还是很正常的,毕竟也就只有我这种脑抽的来SE了。最后大家实在看不下去,就又搞了个第二次纳新。
+ 于是现在又有很多吃瓜群众进入了新人群……希望他们这次不要被我们吓跑。
+</p>
+<p>
+ 诶……我刚才在说什么?<i>如果</i>实验室本身已经不存在了,纳新还有任何意义吗?
+ 假设暑假结束之后,我们并没有申请到实验室,这样SDUACM实验室就成了一个名存实亡的团体。大家就可以收拾东西回宿舍与「其他人」一同堕落了(
+</p>
+<p>
+ 所以现在看着SDU在山东省内第一的地位受到来自省内各种不论一本或是二本的高校威胁,
+ 感觉这也是不可避免的事情啊。毕竟实验室的负责人已经尽力了,但是学校的态度有谁能改变呢?
+</p>
+<h3 id="tocanch10" class="tvis">170722补</h3>
+<p>
+ 几天前SDU换了校长。而我们的实验室也还在苟活着。不过每天都这么胆战心惊地生活在不确定性当中,多少会让人感觉到有些奇怪。
+ 就此结束吧,日渐黯淡的现实……
+</p>
+<h3 id="tocanch11" class="tvis">Yet Another addition...</h3>
+<p>
+ 从现在的情况来看……以前的担心<a id="n4" href="#note4" class="note">[4]</a>可能要成为现实了。
+</p>
+<p>
+ 总的来说,大概是因为对面队伍有稳定而且靠谱的代码输出而我们队没有吧……并且人家队伍交流更加频繁,我们队则更像……三个人在单打独斗一样。但是没有Deep♂Dark♂Fantasy那样的个人实力恐怕这种模式是行不通的……毕竟一般情况下「一支队」还是大于「3个人」的<a id="n5" href="#note5" class="note">[5]</a>。
+</p>
+<h2 id="tocanch12" class="tvis">各种坑</h2>
+<h3 id="tocanch13" class="tvis">QMP</h3>
+<p>
+ <s>越来越感觉自己写的是一坨完全没有意义的辣鸡。</s>倒也不完全是,至少目前情况正在改善……
+</p>
+<p>
+ 按照🍍的建议改掉了曾经引以为豪实际却乱成智障的主界面,为了MIDI映射器API重写了整个MIDI映射模块,
+ 还有各种重构和古代遗留问题的修补……
+</p>
+<p>
+ 说起来QMP也有一岁半多了呢……<s>怎么还不上1.0呢</s>
+</p>
+<h3 id="tocanch14" class="tvis">SMELT</h3>
+<p>
+ ...gg了?
+</p>
+<p>
+ 这个从开始就作为「附属工程」存在的东西,从能用之后就几乎再也没怎么动过。
+</p>
+<p>
+ "'It just works'? Fuck that!"
+ <a id="n6" href="#note6" class="note">[6]</a>
+</p>
+<h3 id="tocanch15" class="tvis">chrisoft.org</h3>
+<p>
+ 最大的变化大概就是抛弃了旧的辣鸡php博客系统,换上了崭新的SBS (the stupid blogging system)。
+ 其次就是加入的一堆小页面应用,比如扫雷和排序的声音之类的吧。
+</p>
+<p>
+ 所以我即使是一个js hater也没有阻止我写js上瘾(
+</p>
+<p>
+ 另外还搭了一个piwik<s>用来满足自己的好奇心和虚荣心</s>。
+</p>
+<h3 id="tocanch16" class="tvis">其他</h3>
+<p>
+ 在上面没有列出的项目,基本都处于停滞状态或者没有任何值得一提的变化。
+</p>
+<p>
+ <s>反正BLR也没有人期待,鸽就鸽了吧。</s>
+</p>
+<p>
+ <s>OJ什么的还是接着用现在这个吧。</s>
+</p>
+<p>
+ Compiz? 它因为依赖库版本变化炸了我都懒得重新编译它。
+</p>
+<p>
+ 钢琴键盘还是砸过的。
+</p>
+<p>
+ 画画?有想法……
+</p>
+<p>
+ 啊……差点忘了还有自己那个从来还没有成功启动过的LineageOS for Galaxy Note4 (SM-N9100)……
+</p>
+<p>
+ <s>OPL?</s>
+</p>
+<h2 id="tocanch17" class="tvis">弃用QQ与Reddit中毒 &amp; SNS</h2>
+<p>
+ 手机QQ已经卸了2个多月了,并没有感到什么不适。也许我这种跟大多数同学交集不多的人,
+ 并不需要什么这样的社交网络吧。当然为了看不时从某班级群发出来的通知,
+ 电脑的虚拟机里面还是有装TIM的。
+</p>
+<p>
+ 现在的主力IM是discord。虽然依然是专有软件,但是从伦理道德上讲,显然比TX不知道高到哪里去了。
+ 而且易用性又比Tox这种的强不少(感觉Tox这样的去中心化IM大概需要跟某些离线联系方式比如email配合使用)。
+ 不过我个人还是更倾向于写email的,甚至说我更倾向于使用snail mail都不为过。因为作为IM,
+ 可以为每条消息思考的时间不长、没有时间考证,容易说出不符合事实/不合适甚至「引发战争」的话。
+ 而写信,不管是email还是snail mail,可以用来斟酌的时间就长得多了。
+</p>
+<p>
+ 至于Reddit中毒,则完全是用来补上以前用来刷QQ的时间的。 linuxmemes, ProgrammerHumor, softwaregore
+ 这几个sub一看就能一整天(
+</p>
+<p>
+ SNS也从QQ空间换成了Twitter。虽然这其实是相当长时间之前的事情了,但是定期去刷Twitter,
+ 却是最近才多出来的行为。以前那些只不过是自己偶尔上去随便发一点东西而已。
+</p>
+<p>
+ 说起来为什么要避开使用主流软件呢?大概是因为我太不(想)入流了吧……
+</p>
+<h2 id="tocanch18" class="tvis">Gaming? WTF?</h2>
+<p>
+ 一段时间前更新了Steam个人简介,内容如下:
+</p>
+<blockquote>
+ <s>No information given. </s>
+ <br>
+ This account is setup for using Cakewalk SONAR only. I don't play games on steam.
+ <br>
+ Favourite games are minesweeper, patience(klondike, freecell, spider, simple simon &amp;c.) and Minecraft. Sometimes kill time with Bloons games from Ninja Kiwi.
+</blockquote>
+<p>
+ 从这段简介里面大概能看出我对大部分大众化游戏大概没什么兴趣了(<reduced>不过MC是真让人中毒啊(</reduced>
+</p>
+<p>
+ 同很多性格相似的人一样,极其反感其他人打游戏时大喊大叫的行为。
+</p>
+<p>
+ 曾经沉迷平台类游戏,后来发现自己手残,大概一个也通关不了,遂放弃之。
+</p>
+<p>
+ 对解谜类无感,因为自己智商不够。
+</p>
+<p>
+ 策略类游戏只玩塔防。
+</p>
+<p>
+ 动作类游戏大概能把我的心脏病吓出来(
+</p>
+<p>
+ 东方真的打不动啊。
+</p>
+<p>
+ 剩下大概就是扫雷纸牌了(
+</p>
+<h2 id="tocanch19" class="tvis">「Freedom」</h2>
+<p>
+ 很显然在这里讨论「那个」自由是不正确的。所以这里只讨论自由软件。
+ <a id="n7" href="#note7" class="note">[7]</a>
+</p>
+<p>
+ 生在一个遍地是专有软件、几乎无人了解自由软件或者将其直接与免费/开源/强Copyleft协议等价起来的环境中,
+ 我所处的环境和rms年轻时所处的环境还是相当不同的。可以说是一个对自由软件非常不友好的年代。
+</p>
+<p>
+ 在这样的环境当中,同时作为一个软件开发者和使用者,想要做到自己对软件相关权利的「觉醒」,可能也不是一件十分容易的事情。
+</p>
+<p>
+ 显然,我在义务教育阶段被强制要求学习某些专有软件的使用时,并没有人来阻止我。然而<s>最终我还是被选中作为拯救附近的仍然在专有软件地狱中的灵魂的那个人了</s>。
+</p>
+<p>WTF上面那堆东西看起来像邪教中招者的胡言乱语,而且怎么这么中二啊(</p>
+<p>
+ 但是无论如何,我还是不能胜任这个角色的。因为我仍然为了「方便」而以「自由」为代价作出了妥协。比如手里这台带有无法完全禁用的Intel ME的笔记本(
+</p>
+<p>
+ 最后,在写了上面这一坨完全意义不明的东西之后,希望那些并不真正了解软件自由却对软件自由有偏见的人去真正了解一下它。
+</p>
+<p>
+ 顺便 DRM、Intel ME之类拖人类发展后腿的东西应该拉出来批斗一下了(
+</p>
+<p>
+ <reduced>上面这些,当/r/linuxmemes或者/r/BashRMS看就好(</reduced>
+</p>
+<!-- .......................................................................................... -->
+<h3 id="tocanch20" class="tvis">2017-08-23补记</h3>
+<p>
+ 显然我并不是一个free software activist,但是最近我却又跟别人讲起「为什么不要视GPL为虎狼」
+之类的话题……总之是想试图破除一些对自由软件的偏见吧(
+</p>
+<h3 id="tocanch21" class="tvis">Who controls who</h3>
+<p>
+ 对于自由软件来说,是用户控制软件。而对于专有软件来说,是软件反过来控制用户。
+</p>
+<p>
+ 一个比较极端的例子:某流氓公司的不给钱玩/用你麻痹策略(
+</p>
+<h3 id="tocanch22" class="tvis">Myths about the GPL</h3>
+<p>
+ 作为法律条文,GPL自然也是属于一看就不想让人读的那种(
+</p>
+<p>
+ 但是宁可读一下<a href="https://www.gnu.org/licenses/gpl-faq.en.html">GPL的FAQ</a>,
+ 也不要去相信那些诸如「GPL是癌症」之类的传言啊(
+</p>
+<h3 id="tocanch23" class="tvis">Attempted assassination by Open Source</h3>
+<p>
+ 最近几年,「开源」的理念很是流行。包括某些大公司在内都在极力推崇这个概念。
+ MIT协议的大热可以从侧面证明这点。反而对于「自由」,他们则闭口不谈。
+</p>
+<p>
+ (<s>然后他们就拿着社区努力的成果放回他们用来束缚用户的专有软件里。</s>)
+</p>
+<h3 id="tocanch24" class="tvis">Closing this part</h3>
+<p>
+ <s>大概这种「自由」,只有陷入FSF邪教中的人才会认同吧(</s>
+</p>
+<p>
+ <s>不、我还没有陷入……我的电脑上还有Windows呢(</s>
+</p>
+<h2 id="tocanch25" class="tvis">接着婊辣鸡专科学校</h2>
+<h3 id="tocanch26" class="tvis">山东挖地大学</h3>
+<p>
+ ——为什么每个假期都要挖地啊 经费多到爆炸吗(
+</p>
+<p>
+ 所以经费那么多能不能帮忙改善一下生活环境啊(
+</p>
+<h3 id="tocanch27" class="tvis">山东inf个校区大学</h3>
+<p>
+ 8个校区……(不包含前途未卜的章丘校区)
+</p>
+<p>
+ 虽然说有了章丘校区之后可能会缩成3个但是从各种迹象来看都让人怀疑是用来施展无处利用的经费的啊(
+</p>
+<h3 id="tocanch28" class="tvis">山东草(4)房子大学</h3>
+<p>
+ 该名称起源于实验室被干事件。不过校长换了之后上面好像消停了一段时间。不知道我们还能苟活多久(
+</p>
+<h3 id="tocanch29" class="tvis">山东不准坐高铁大学</h3>
+<p>
+ 起源于比赛坐高铁动车或飞机均不给报销(不论是去青岛还是去南宁)。至于原因,说是「超标」。
+ 翻译成人话就是「你们学生坐什么高铁和飞机啊」。
+</p>
+<p>
+ 说起来高铁也算近年来中国为数不多的真正「正果」之一吧。然而……sigh.
+</p>
+<p>
+ 最近比赛发现到很多地方的非高铁动车车次越来越少了。大概以后出去只能坐长途车了。
+</p>
+<h3 id="tocanch30" class="tvis">Closing...</h3>
+<p>
+ 虽然辣鸡专科学校依然sucks,但是最近也许有好转的迹象……不过还是有待观察(
+</p>
+<h2 id="tocanch31" class="tvis">Other random stuff</h2>
+<h3 id="tocanch32" class="tvis">贴吧 &amp; Ballance</h3>
+<p>
+ 作为一个珍爱生命的SE专业学生,当然早已退出了百度产品的泥潭。
+</p>
+<p>
+ 不过历史虽然可以被淡忘,但是不可能被抹去的。
+</p>
+<p>
+ 这里是一些当时我混迹Ballance吧时的黑历史。
+</p>
+<encrypted hint="Type in the phrase &quot;Yes, do as I say!&quot; to read this section." hash="c793bbe932401b1b094d82d86cb1815f438913d1614d2cbf8ec5e7885aeab11f" encont="g6ZQrTW5Xt1hqCsn+ypUCvy1Y1u7IfItqqx/lZlRg18DQy5Vj0w35a4RPMBdorz55mhtI0Sr3/SmZnhZNVaLwMYtElVnuwrQhp0ihtTKSQOVhvu4oJNPt0koiztD42nSdVkXHOwQfwYyy1EbDLLOwfF0E+C6u9ONiBtm3BhmSvIpCA/eX6cACt7WdvR1O4MeL/W5lIfirYwRbiN0yKXJmtCTcG3ecr8PlsbJUg6Ei7oYDphG8WkGljOnDz17aJyRz+/cn3BzT+Ut9PWu1SAAU6GtEiMjbKYIRg8R9B0j1YqzLIuy1fXZKMymy5xGBZSccEGyCbUlMQ3xzC6x77wfvXCKgLymnakCADuDqkLInRVT4v6yvEXaVt3/XnVhPYqM6ZnvcUMob+sk+/xqn0NSG5rPlTcgdrUeKlseQZtvLtafIB28uWMqRI8FbdTvrDMxJcJWcsqgPVcS9PZz1ojOs6gHakoCgZQUsz6ILPoJThyfnVtmZxamtrejreWHYLiQ1vd0eZ5wSxYXVcxqu3O0I9DPX/bUS2gngoDGR83bcLk/JDWuBjkimrFInHT5KJgydsteHcfaJSMVNTAf87PzWjJkRFwXTB1lpRA2aAOAqudtYHqi3FMbDb2GH6C3pMYQw5Wiyey62lBoVjf1kLlqrYvunknBq9nVgnsqmTdVR+4F1y4q1zujTvkqKuPT0zwxs0KfWAeB/6bfy+Sck8MRwnqwlMXfptCXuMOmRwSJioDtI8oOdK/69HhiJUk+QnNZpYhIRi4ou7lVBmbhI8mpzdTT2sEjahNvL3KALXxftgtVoyYn771aFH9QEo67zSlRhrLV/dIrsF5J5gg+S8x7qqOcrE3DO8rdPyIbBDuQ+seI4xtnFfJpvVlixp0MLcVOWL2p1+XaM0ZEeDEM1ARYSkObroAX1SmXgnMHGOAkG3pTQ7Krxfy4GZDN8WXJlI4gKE9j+yiAOgrQpLGc/t4wf11W5/OerCd7RNAHraLmsDFFZOm0pMooj1D1enJe0hQM8HtgupD21GRC43M6L4J+GrnMXt3377JFURbzA1GoYxBJwMXFKz3I0/psI23M+2/hKJK+LOWi0IjXTJRdgqqz59NqtvHHEIXA8s5vxHLi3NNBaBT7fIlIVk3FKGMZa30NRF5jEDfa+KA6bqgbCRWZw4uq8poHBuXpC58TO0//Qxuh+SrFJkBRbTyjK9ECqvjvyhsfKrI2+niGGLYV3kjiX4ZJFEn90cL2F+xMmP1FSnbVVWzf+ab+Qv4vCiEcLFJC5hXkvHS8glzLlsR2uoZ03kciiQHDWx+SeCHxkqYoQnNisK3bFwAErrb0IEYjV+U70+jICLcWk/xcGSf5nqWizXCHCiMAhuzzP6A9j6WzeTqqy8inbf3Dajdd+37PFhgt6MQWxESrxgeTyHwoc5i9tpq7P0OZKwO6/US5wew5f8CVBIbwV0dz5dCdfv+g33g+Je/Vo6CMccqC8GZksFyNTXlSprT2JGCZELiWF8a7mhiDqhYt4Mp1v8nZxRKR7gCEg7OD1cj6hui8salhMl/uTH0sOCzryjTGqy3kFiyJD56xJA45JGJhsd31fge/2riR+4kToqp+vfzaXEzKZKUtsCIhx9mVKJnkO/8a7NJvZnNFQ0GybG2ZDed4znGTV9mo/7aUqLfN+PAR5sqIevEB4cOSnivvnLMRyOmuyAYKEuxYDoP2Bf4hFVDEbau1SFZOLSkqyaP92FG7V+n3i6TXdbUjFOpAYWETTmCAUrWcNJ/anCHOCWBreb5i0Q3vYNAuq8odz7JXUuM5QMHVJIHNLtNCZY2CAuHmdDvcUz0RI6ApndE9HQ+C2XboeUyvocO5M7Ak8LTvIQW1WFIh3xPCikjC9JeLxTAUV57LqLNqeMIO5wpwZek5VkNf/C5+5vE3Ot0532FwfRIcI27iOGp2AWSkxOJuLvz828MMpYQDw6m6NvfQnZIrAhtpQJBwYqr0yDyybxe9vjN0FeG8q1mVqhJM1qliG+ORYUsK17Xu03jNRfKP7UfNgKikM6xhWTgT9XRAqeZ/WQdIZAkypMaR2phnKuB7Cw6PxObNsUY6repR906nFbJnM1hyhuEyr/5MHvh9B/8NcOhQ6ygEj4DBDLtRhSmn58DIp+3v49TKzHFIORJRtEZbqoKkLODLAKn4sPBxMQlfzNMBIoWyD8nlKrb2VMfpqt9KQRbeJjH/BDGsYBBIUqtPKbaf7wWWeCuAuVh39fUpkfFLALASzIp9Jtoz+WnuCSlU+HCVsUGA1Qzri5qpc6dNL1YC+YGbkzCIQGYB90BbXiTx4myzm7Zs7xE4rI+2rR/60NnAhBRq1/3Nq3k33NVNlyGgM13ohFU7S6zGvgvlY1tE88jlIOBaEpUoya81uUW6x3DuxtN+sr1JxcrCQKpTolm0f2UIz+FXV2NMpSRl3NNeaiGoep949nCsgXEMWKJWmSCRDMM9Png/IA140gw8bz/kYaiZiHTPX6ZohdALLSmT43xzSvb4UKJVG3TeF4NoXRrgvwm516OVtJ6S7sH8JpwY1l6aBFX+wzHos8RrJqRpWcxZ2d/Yjs1EbOLbRTeijGdiJ/GAJZh9gpNTveh+/wdIUScn7KzIUL9LWl1zfsoA2tPkbdpmLJLJou1xFo2p27cvNmfPMfW3gw2P8Ufda2v+ZpFmlX/stUaqhCM/Kb07R3w1v0Yw/wdYkrvxIL5iXUP8rf/z1kL28b9G7YimJza2KcP1dRwfg34ksT6aeZwEHjE1lVjzBOx6Fxj4Bceq0v9x8u7bEjTc5SbwANVhLJ2+dCWE2L0sD5RlNL337xtYM6hd28D4BeVFKo1WC7Pbz5ZZuuG7wUGpWzKPt+L1PXV+B6Wpx6AtnytZsQiFSDUsM78CDHCSSl3Z5rWeQ+LJSkceHUQabzMjajt1c9fesl5jJwSAxakPOZbIYY9XenS4ZGNkGF3STOKpBtpAEYW/X/906vB7DbdvRW2T0I5DiVZ1wGCH3BamG0slcj30w8QLz0eslUQy7ltoKaNSywLutWhPYAfmVG/cIhrSvmZSz4H9DfOmQaX/s2EfFdxXP7IUvIrwo7t2ao9TbWvZ48S7WhCh86RJu4JSTMVO6A7lsPcAFWQkQAzKEh81CQQHLHtKFplOBvwY/trx2ywwWFWIfoQ/itypVw2sdwQqf9OiMXZVq2uYoMEth8X51erjid45PmouQwTT0rd8RA08fkNwTbRzs1EuaUs2lJ534L/m8NOP6E+SSfGTFihhQWAossFK3ji9v+pgO9aqP24CkoyBJ/CkF6pie++xvwRI18cfQtMx5pYoZrQgue3Jjlmv8Rza6eftG4QMKtC936lKzb/RTBzZ8vGB8E9F5LDAvS/3XjKOMJ4dyn0hd9SwP0o1rf8VI/bdGEuZP441lK19pG8ywAXfhivvZDUYmFSayFfR/5Ahs0Bl44Bp+mIqm9XhBsXIpadcNBYUXai3S2MpgpJ6TUSe4A7zUlgJz3JUX/cctFOzi0UJhtx1CxMJJw+dxA6ybWXIMsuE/8EUQFESvfeAN1J/85LhpVFYfQKc03dFc0zmIgo8HVWjqObQjPlWz3lr9hEcmmDftv6k2f7cl64Y6AYdVgOgTH98DG9dKmnYGEmcvpCk4kkZrlbz0ZF3hloJh3myozb46LV3lTrIATxXBmOQji4CWzhkQihBaIilV5uoh05LQjAMU9A8pu9BLaUeGI/Qfv9L7Js8ml7Jt0nir2nk/LA8EknuCaqHwf+BRKyt0lI7RJYL46H/yTtY4Fljwt/IVb8cJVHqD0d00LnVTykSpmffSGpXOFnqKVdrgYhJEa1ceJPe9K/IS2siIsSE9QKuz1IsTnHqYXvigJEBR+C2ZlsBIaAdxgcqAg0yHXtgk26+EKXaC6S2iAeuwMZHH8rCWLLMfxKrnMMAtUAKrT4DN8fxlGpqZ8jUbCG+aTADx6/B1OyW2NBQsdEP7cFnd+WiCpGrht8n4tWiHmb4MzGZTR+7rMsiIvy9QFbzv5vHNE5XXMR5yjvTft4SyXQ5FSRkaZDFZituk5lg94iFPgZuBs8pIKtj7DAT4Rtm76HFVkiZCUU3XkqsdF98cxR8AZYTd8YxYC/XN8xNq4iY4ON4wPjmxmJyId8DTuPOjwIw+i21I7OzMAeKQO771IMFxSZ8bOlCnVTtieOLs0js81C5Z/6tpyPDO6IE61KQpW25aguyp+i3wQejhEM6Xt9BKa6/WJiAIp5MgYTbEDPrkRLR5rxKCdHNzzdN1NnZ0KGqr838x7UJ8SXBUVsO1DLY/FVYwd6/AoHEYiY0foTkwNoMoZ2OfXwmnGc5qEV1Enii9DKB8QFQHSbZlyDkLCQN7uH6kcSxyxxRFTv3plf5AJk6d1cPEUipRilECgaVg3H6fPck26Kap7W3qyJfy+h2HNGG1LB0bcFDaMqNFniWyASfQkKMveOeOp7M5Jfzs379Tsy8vvCxInWkZIPR3Z/8FTOebS3k43N8t2Svt883N2EYqxSB6ZOHCBCUlBcOnmJo2wy7rUvt5kSQA3yGQTnZsQyqqhw867PA1WJ1Yg03ao4YPPhKtFxntofJcltw9naUvKsvEXpHHGTC3obxsm9mxh2w7vtLUlO4ZreVEAmN0B31rklbT/D3iyGaO5obf29NAr21l2kvDav894U9aBYsMwH85vV9cwPDYu6f2AWpSvGbCNm5IvbWo27oTHYEUtvlaDhllWzcwD0xEPYMN1RGQRC/bDku/jMTmCkSbexa7kHHDVDFG1/2LUxXloBB3amLLIZY6hNNbP/zuQWaxWQUy/KHspwv3eSq6Hspxt79W46mti3E/BWFP0Fi514LcNOSSHGGFB8STrL3FLdTM++epJT4RhtUQYX8k0U79ucQ6Mh8kdGXW38Oo1TrXyqhJoljwJRaGjwXFv4lZ9SNtsSwXVqY0jZ5V5vAjPs04nV+0UN0x6n+41NC65AdytbCJ63Th+0Dw+WNyYVSmAC3mUB/VMWevPPimya7RcEVxbCx6lx5qln/TBxyoNWGa/EDM0QnU+aSqWYaQ+Uwnuc22fCqa4oVBsTL5Q+J8IYyZ982Wqz56cObKV/2s5cvMLI1V6r2g1Xq7LArE7lrPK+Tk5YTdPbIupotUXCrFGjaMF2jwPaH9Gz3Lv4btByzfk1yz/bFhEWBNoRNummjdnMNehGMJocDn6BOSJ/jrG0J18V5sNWvX/1y+mlKDe2eeYJy2TwfnQ0wqSR5fUW0xNFJ7fRcJIbz0cnH8oyQaTLytUlxPsPJjOWq0W9p0OXuwB8J9LraV7kIsC16zlKfTZZlNUNSM2iwr+juJktMs3eVCiv+2QlQIPGpKqU0umV9wCo+iPgQm9iQR7BKIJ94nVspF4u+0zzZqjJwKRcVB93erEtS04F+vHPv8KbdB2tBqClp4n5c+K6UbRfyztV9H8pYYDYARbdzrTsMWDE8RQRiOgE1e4p4mpmvI2f6Y50Ae1ttaTRJRsWcXeNAf1wX1XSrMYsC4J6YIdio01JSuAV7cUKRloMkXMDWTv325LapR1bzxvLvti1uX6XEUViV2l2DvOcxX61xN/a9ftO5bt0dKd76lhWGSbzPHR2c2435ltL29yFbRwuLb97MitDSov6JDLuAyKFP+f4bcwzxVGI76saKvk0S4uV1YYo2SC2plPZhCCg93Sej822yDghpgdnUpfXxfhmG+obGV9Tnvg9H2/sYyzYNN1oIvQNylcVk8nSeMX2mc/4Vni/FivCHbezOkl93QFRJr8wZdiTDh98A2i5Ty4lLdkzNBI/hKpEyl/kZjbmdDOUjbHbV6Gbd4OISUfvjoFSq95DcfkaZqkrTP61IVHNk5kMXcz9bTXK5SqRK70P6YmlQo4G3JZBGi00AW/IBvLrOG/s4iaRqKYRtrvPSJ+BQblgmPwb6kmZFMzeeFmzXK0OBT2aaSwswQZNI88dyxGla9+gaDCSbA2e8wAP+plF0OKLapIk/OiSwZyNufzkj9gXtkDRJPTkKUobPCf36ERr+8AXf9/hynsSZ88XWiH8ehmcL+ohpvenYUhvqTtqr2WAoOysbaQ6DfzN0wKTmvW8fe4VRbYqaiUEuSrMSUYMKM6euByLv9dmgx4Tm3K2e2BWKGpTe2tu4QqLN2YPGBupaQls+jZVJeKIpPFqC90+9XZ+RCL/gevWVnQQZPqdwBS/wMcWyMX2mmzKq2UsCyjxT96RbyqkiV2NfgHUa6GbeS7KGGq10RN0VzU7fBNRi0+/kK9vXSMK2pqjlXVczqsJK6r4QARTWjlle8Heb2RYkz89o+NLkhX0ue7EQhNT1tJIQ8nIhHLT5p7/LrvglPNZ8vxcVpfCs7NklgmJ7c/732U7K3SduIM0w48s17+Y4R2ZzYuxCDBHn6Duf/GBWe2UGLe+dUg8lB56JRLDajYatZUSYnYm6kSYm6a84jlgeeEKnvKRXtaHmUxIvpF2ERb5EXeIYI3+J4zLQunxp4flOLKzO5NWcLWKkEJ1UeQOaXNeXOAb/izI9VWMMs18bdJggUJpCBqEAS9JEnqK9vPb8d1sZ/kRzVwkBMYXK8/3r9UlSx0cKXgIfxLxRZ9ZjW430SFBYPphmj5I1BhyL8tHcQz4C2ucauqRa1uhvFnssI66IcGvm/ck7D6KHagIJ1+JcIYRkWscY130yQ7DxPNzW2fc7VuZvZy7/Iilcra9+7B/PkKKE/FNEuStiHIU23hsFC+VJFg2wF+fyXjMK54oVxFfqibchcK53zjuooN39VUeAq03ArZ0o2xD7dOr3KXNFzxtp0JRXairbNpeIgfSExfWfqHsxxb2KmxQqrgAK7u9EqdORACl+nkyNAKi9WB10SUAOF/nggxuIFY8iSvFBS+FY9yZdjkR05cREagaNJsTnj7yjc1/90SNCTi/gNKfEK4C6SRjd30ZY75hz6chSCnqQxXn231mglNgtHQvy0Qr2tNlCLUJPN7Riqe7MLKp/W48iuiK5yfpC3qvktOPn4JBeXPcuJO+T0cbPwGEvakd6i1wWYu7nCIp6cd65WzfaKdouyWZG9J/6G6/aB2zwR0kIRiSWUx+vf/X3F9GMbMqKbZ7x3pEWTN4D2WAeiaNvgCzlfIzD350ecEQuOgoPcLts36GZXjzQymdwSfNVeLF3nn7qucozikcVbI8xW9oUxQ+kl3U31AkQxMNwUmtVT9bGKTwQZMMf9caNpZcsT5i0ZatijIW0ZLWLh/PH2fiO1LRRyBJEncKOrvpaVxxA42MRbZotprEhFvmM0KHazme+mZXkRoHOjDMkDsMFdV/XzI+tZzQj0ybzoxTmAmktaXfB8NcSZm9FeZIAu6jQKN6gRLdfncmgUskc7ZKcCyLMta0AHvFectePsEyzfe6c6+JFVyaMCQw2Fglqs9v/9GP5MEZsofeN+iEtg8Z+F4nTbHtpYuqjl/me38hxCzvEimdTbUWD/li/KkWEW5D8mZE1rX2lY+6KOOxNqYKygCcm8knS2q6uj/bnsRq5hJadQPI/FtSUkSqmKOAfB27vPwCU0/T8vUAXa5b0corIbipXEWOieI1NDKRnIGE8Znl6mKgqxin3zjzAfqKRqRwxaBakTBozYLTujrd7kdXPqRuDfSo8uPhtvbvZCfzCf0EXAKUdsoowvyNDqhtTsVCuDHqUUhSHHLpDW9P5G2emXTnk7dhMkYp33EXQpuAozvMCNCB6L7eLj8PadyBZKbpKDs2ys4r+R2HJx5E/M+578TjUuLMfmNR9pkTr6nthb9W5qGNc8sSluaMRWTIXkpCgSZRiqiWillqoP2ZFAcL3XavqPxgoUE3ne3MnAek58zrEK98mb/xys0zwkMZvbQUzDE+3rHplYBifiVhZPWWrjZVdnDXrqTgwcbT/mWX8EtqSVtgMxRnIr1CnSL7nY4VuCj8FuoGzF2dnL6EaGjD108y+0zzeqoiEFyVShgFRONSJJIxako8E7IioW4f2PYk52zsT3BoVRp71HHeG+m0dQFX35u4NRKg0YSFrlb+Gak4aERkI9Tqp9o/hSZIAUo33szaWemzm+nx98keHgQKMmKVp3xevVHccIiJ6KDs343C67SEQNXVgiRrQTAqRz3HDaQktG6EUxj/R4olVY7iuFn8ofD4eDJGTnSjA8o+fGjmgL926A+eXTEAvSlICJ+MWr81WctM5CM9vkyjq0gICQFbOibWkqqcvkAIdnJgjxxr0aRl3w6unnFuI0W+0KH6UNwpa6q4u9WI04lcF3b/AesJqYSALLkJc8MFm+58H+IbrpMBXmf41Z6BUprlbLVjlW11+YdG6M1nH8MgbdttN+rYYgw2f63GPb1oK7Hh8ag4KwjB/QIpX1JUgMkj/9vLNTPkV8FwJ/4mDh1j/lq46x5kkfHWK+6uVUvmjXDzhR72AbotbZmbVaaUcvesjNKDIRI3rFh/ZEkY+55egvDUykqz2i6C0YlNTQcaxii0IYzQEyhrpW4skncEEFSMriOTYo4kEtK2laCUhJuCELe4pdigKYE1SHMdw5TMv077o5/mbWFB0V+F+AGIyDb02n2JFM4GLv5YJzMtdEJOHSgmdeOFTDqw5C0YOwikPRQFwjyaRg1rDslG0rCElkBCsemEBuW2j8olPuG+mS0MX6+MelDge1VSM2XVxgSs2uDSidRpizQcPWMEfJb8Z+Nbhk9XE+RLlmErZnxgmFluYNzF/hULVefZJH2D7iNubQl108ThpQ00yUEbwNk0AWMZZXjrxs0zVWrBThaSDAu9eFYmJdn2QWQGYzZZSpYPimzG+To+zj/jWVlaF0rsT0yii80GiCUE7RSZ0JidsVTnzTIwLt3Qn+lXpODSSrlKS1JOm0r/PSoYYoPFxynTokiRuszSjZBbG0/Ks6JyKK8D3vAQm8BbLob0HyVTD/UW5PHxUfcrt6JX+8hwHQRKSxmcP6Nwx4+IBKdmtz8tVMa6/CGoL4GX7/4DaA140QBrZzE09spUO1Us77+1vXQmjKK/rC+o7XbE9zMm6V/6Am+wgjVK9ohDQwzdHiuiBLJuX8L3ox6vC3UgGriO+7fuQT/MoKYGT6IpyoD8m5ZmHkwLonzJ7sGmmFIo/PS/lEO2ffk3ccyArwqwsJHVJ17jrwIwIpnPExPBiQpmof+TGFSfWUS8qGCpig+wTq51rhshNe9IVqgyHkqyuyEDlooS3QkEcJqQSlzu+F08XCXcLkq1fPEDjj/XZs4/UhRK58xJfOMtZ7CfBpfSf/EaKZ94F8BFB8tvwE7gVbOf7LhVqnM9iJ83/k05GzGdLEBaLIXdWmQZfdS/sTDkDwp6dlp/GMUeHcVuQ6kXdH+OvkZ3DEnY3c4IA7Qnq4tKuIoAczVjJV1ZhLs8ion+UJYYAA0DLgIYdIfOt4zRbMLTY3U6xXKsRtKwybQbWCdaz9/W5Nlx/It/ezfY9w9z83zSKn+cFyFy5mAJm64ML8xhrsd4q3HtKJlLx98hJcOHGUODawryzNCFZZMNCASiHfg8hQGPLsCoRit+3Sa9wDWIG4cBnVttZEIi38VDIhd5hJnRhRVhq+9gGx7ooSZBcvnqhVkknl1fS81PZ2wjUxhzoVAq6PO0qPtBdvnHo2o4YVnbE+ptoqAvyLtyzj9jJZX7kuImjwJgVKitRjt4trkyAABBwbrJmqdn/4fbyBswFOiFgiwWqzQmjg7L81AuOnSZ0OAwI6iOVPoFYofEtonKiHUBh84dHF02RSvzYH8JhDKn0T/YDisfD+h/R8enEaKmcyxJQSgfGm7AFPmtFy1rrBhQVWoscozHhWHQ4Vlb+3VUQm0Ey+3CnTmuK1XnK7xbQCbsF95tY/1f78xoRn6M=" enid="0">This section is encrypted. Click <a href="javascript:void(0)" onclick="decryptui(0)">here</a>
+to decrypt. <noscript>Note that you need have JavaScript enabled for decryption.</noscript></encrypted>
+<h3 id="tocanch33" class="tvis">「实名制」</h3>
+<p>
+国内的实名制,大概起初是为了公共安全和一些其他众所周知却又不可告人的目的设立的。
+后来又披上了「便利」的外衣:比如坐高铁刷个身份证就能进站啊之类的。但是现在的各种便利,
+几乎都是建立在牺牲了什么东西的基础上的。
+</p>
+<p>
+至于实名制牺牲了什么,我想大家都很清楚。
+</p>
+<p>
+当然我也不是全面反对实名制,我只有一个需求:获得我的信息的实体能够取得我的信任。
+这个要求并不高吧?
+</p>
+<h3 id="tocanch34" class="tvis">"The Hatred"</h3>
+<blockquote>
+ <p>
+ WARNING: don't take this part too seriously (except the Apple part).
+ However if you have to do so and I accidentally poked fun at your beloved thing,
+ please don't chase after and bash me. I still program a lot in Javascript anyway.
+ </p>
+</blockquote>
+<h4 id="tocanch35" class="tvis">the Apple Hatred</h4>
+<blockquote>
+<p>
+He figured out a way to make computers that are jails for their users and make them so shiny
+that millions of fools would beg to be jailed.
+</p>
+<div class="rightaligned">--Richard Stallman on Steve Jobs
+<a id="n8" href="#note8" class="note">[8]</a>
+</div>
+</blockquote>
+<blockquote>
+ 「此恨绵绵无绝期」
+<div class="rightaligned">--《长恨歌》的错误用法</div>
+</blockquote>
+<ol>
+ <li>
+ 限制用户/开发者
+ <p>
+ 苹果设备限制用户是出了名的。它甚至连用户使用的音乐格式都要限制<a id="n9" href="#note9" class="note">[9]</a>。
+ 而我从获得第一台也是最后一台我的苹果设备——iPod Classic之后,也是立即对这有了体会:
+ 为什么一定要用iTunes才能放东西进去?为什么苹果认为ogg不是音频文件?更多例子还有iOS的强制更新以及不能降级等等。
+ </p>
+ <p>
+ 关于后者,单是Safari/WebKit独霸整个iOS平台这件事就能说明了。
+ </p>
+ <p>
+ 另外,#RightToRepair。
+ </p>
+ </li>
+ <li>
+ 高到离谱的价格
+ <p>
+ ——我为什么要花大价钱买一台配置上不如其他设备而且会把我的选择权夺走的设备呢?
+ </p>
+ </li>
+ <li>
+ 莫名其妙的「闭环」
+ <blockquote>
+ <p>
+ As the weeks and months roll on you become convinced that your
+ Mac is superior hardware to all other hardware – and that Mac OS
+ is doubly superior to all other Operating Systems. This
+ conviction quickly turns into an annoying habit where, every
+ time a friend mentions a computer problem, you snarkily suggest
+ getting a Mac.
+ </p>
+ <p>
+ You die alone. With your Mac. Because nobody likes you.
+ </p>
+ <p>
+ Game fucking over.
+ </p>
+ <div class="rightaligned">--"Linux is Badass" by Bryan Lunduke</div>
+ </blockquote>
+ <p>
+ 苹果的产品是毒品:能让人产生快感并且致人上瘾。
+ 一旦成瘾,使用者会不惜一切代价使用更多毒品。但是我们都知道大概是没有对使用者有利的毒品的。
+ </p>
+ <p>
+ 更为可怕的是因为没有东西约束这特殊的毒品,它的使用者会跟苹果一道,大肆宣传这毒品的「好处」……
+ 结果可想而知。
+ </p>
+ <p>
+ 也许正像rms所说的那样,正因为苹果给用户精心打造的「铁牢」如此诱人,
+ 以至于他们都争先恐后地往这铁牢里挤……吧。
+ </p>
+ <p>
+ 看到实验室内好几人都先后换上了苹果全家桶,我感觉我可能有必要担心他们的健康状况,因为……
+ </p>
+ </li>
+ <li>
+ 平均素质不高的用户群体(尤指「果粉」)
+ <p>
+ ……当一个鸦片成瘾者对你叙述吸鸦片的种种好处时,你会作何想法?
+ </p>
+ <p>
+ 「这人完了」
+ </p>
+ <p>
+ 这与上文中不幸在Linux is BadAss - the Adventure选择了购买一台mac的玩家最后的结局是差不多的……
+ 某种程度上。
+ </p>
+ <p>
+ 还有那堪比高中英语老师解读错误的完型填空答案的洗地能力。
+ </p>
+ </li>
+ <li>
+ 远未达到垄断地位的垄断之梦
+ <p>
+ 这里要说的是前段时间闹得很凶的「苹果税」事件。感谢61小姐的提醒。
+ </p>
+ <p>
+ 说起来这也是正常的——要知道「微软税」的存在大概比「苹果税」要早得多了。
+ </p>
+ <p>
+ 要说原因,大概这段的标题已经点到了。
+ </p>
+ </li>
+ 以上内容,只是我个人的拙见。果粉们当然会认为这是一派胡言。嗯……
+</ol>
+<h4 id="tocanch36" class="tvis">the JavaScript Hatred</h4>
+<ul>
+ <li>node_modules</li>
+ <p>
+ 说实话我当时以为服务端跑js就是个笑话,谁知道现在不仅成了气候,而且闹了个大笑话
+ <a id="n10" href="#note10" class="note">[10]</a>……
+ </p>
+ <p>
+ </p><pre>du -sh node_modules</pre>
+ <p></p>
+ <li>jQuery Everything</li>
+ <p>
+ stackoverflow综合征?(
+ </p>
+ <li>Javascript truth table</li>
+ <p>
+ Makes shit sense.
+ </p>
+ <li>jsFuck</li>
+ <p>
+ <a href="https://www.destroyallsoftware.com/talks/wat">Wat</a>
+ </p>
+</ul>
+<h4 id="tocanch37" class="tvis">the Microsoft Hatred</h4>
+<p>
+ Microsoft, better known as M$, has done many unethical things.
+</p>
+<ul>
+ <li>NSA+GFW/Windows</li>
+ <p>
+ 广为流传的meme。由于各国的法律,大公司被要求向国家情报机构提供信息是……可以理解(但(已自我审查))的行为…?
+ </p>
+ <li><s>Safe</s>Restricted Boot</li>
+ <p>
+ ——<em>我</em>的电脑为什么一定要安装<em>你</em>的系统?
+ </p>
+ <li>Ad Bus</li>
+ <p>
+ 某媒体称Windows 10为「广告大巴车」。
+ </p>
+ <p>
+ ——事实上这个评价一点也不过分。开始菜单中默认推送的广告和一些莫名其妙的通知真是让人想把电脑砸掉。
+ </p>
+ <p>
+ <reduced>Cannonical曾经也在Unity Dash搜索中植入广告……<s>果然是一种要被M$收购的信号啊</s>
+ (不过还好现在默认关闭了(</reduced>
+ </p>
+ <li>Shrink Drive</li>
+ <p>
+ 丑名昭著的Onedrive(skydrive)容量缩水事件。
+ </p>
+ <li>WSL -- toybox of nonsense</li>
+ <p>
+ WSL成了Windows吸引开发者的又一个噱头。可惜这种东西大概只能作为现有Windows开发者的玩具而已。
+ </p>
+ <p>
+ 然而前段时间的WSL还不支持UNIX sockets……(现在似乎支持了(
+ </p>
+</ul>
+<h4 id="tocanch38" class="tvis">the &lt;insert Chinese mobile phone brand here&gt; Hatred</h4>
+<p>
+ 其实也没什么。毕竟有个小米这样的搅浑水的拉低大家的价格水平还是不错的事情。
+ <reduced>甚至苹果都曾被一度拉下水推出了iPhone 5c,然而后来看透了我们穷人的钱是没什么好赚的。</reduced>
+</p>
+<p>
+ 当然,只要质量上去了,有话还是可以好好说的。
+ <reduced>曾经对华为有过些许好感,但在发现华为水军及P10闪存门后这种好感迅速消解了。</reduced>
+</p>
+<h2 id="tocanch39" class="tvis">生活垃圾</h2>
+<h3 id="tocanch40" class="tvis">宿舍?寝室?</h3>
+<p>
+ 由于个人的语言习惯,更常把这个东西叫做「宿舍」。然而我发现也许叫「寝室」可能更合适一点。
+</p>
+<p>
+ 因为我每天只在23:00-8:00在里面睡个觉呀(
+</p>
+<h3 id="tocanch41" class="tvis">Side B</h3>
+<p>
+ Broken pipe.
+</p>
+<encrypted hint="Don't read it." hash="6a3c5979d02cf25274065788a7128d2a7734bea70bcf7fff2afe1f5bfe9a3e86" encont="XEYqv08FzpVV0TD3zCHqVDBcjI+evdHu5FSev6OLJyXylkQ5fe3hPHPx6Wbxo3C4kvbrwy0F+G02aKu41tjuAEPu/ZPkeZ2V1CnRVE6FXgAzn1jfSqoiKWq/QYzTizh/IdavQQnQhgg6D4QRlZmeP7NJGoKCjfcW+UtI8+SucTUSAIp9z1XcOZQ+75vwSiodNwOH50hs5l2w4HUzwyGv/JJQDUGZWT9vnQ3bgJXOiGzl0RtMMNE=" enid="1">This section is encrypted. Click <a href="javascript:void(0)" onclick="decryptui(1)">here</a>
+to decrypt. <noscript>Note that you need have JavaScript enabled for decryption.</noscript></encrypted>
+<p>
+ Did you regret reading it?
+</p>
+<p>
+ You did, didn't you?
+</p>
+</article>
+</div><br><hr>
+ <div class="TText" id="notediv" style="font-size:80%;"><span class="TText"><a id="note1" href="#n1">[1]</a>: <a href="https://youtu.be/lgOMx8kWLtU?t=8">https://youtu.be/lgOMx8kWLtU?t=8</a><br></span><span class="TText"><a id="note2" href="#n2">[2]</a>: 嗯……我希望不要禁止在里面喝水。<br></span><span class="TText"><a id="note3" href="#n3">[3]</a>: 2013级<br></span><span class="TText"><a id="note4" href="#n4">[4]</a>: 被挤到二队<br></span><span class="TText"><a id="note5" href="#n5">[5]</a>: 对BLumia的博文的可能不准确的引用<br></span><span class="TText"><a id="note6" href="#n6">[6]</a>: from <a href="https://github.com/BryanLunduke/LinuxIsBadass">Linux is Badass</a><br></span><span class="TText"><a id="note7" href="#n7">[7]</a>: 我很明显地感受到自己已经开始向熟悉的人「传教」了……虽然没达到「软件自由活动家」的程度但是大概也是没救了(<br></span><span class="TText"><a id="note8" href="#n8">[8]</a>: <a href="https://youtu.be/fkkDvKGcNSo?t=1081">https://youtu.be/fkkDvKGcNSo?t=1081</a><br></span><span class="TText"><a id="note9" href="#n9">[9]</a>: 来自61小姐对iOS的抗诉<br></span><span class="TText"><a id="note10" href="#n10">[10]</a>: 指reddit上及其他地方的关于node_modules的meme<br></span></div>
+ <div id="insanch" style="height:3em;"></div>
+ <div id="footer" style="">
+ <div id="pagesw" class="TText" style="width:100%;height:0.5em;"></div>
+ <div style="text-align:center;" class="TText">
+ Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5
+ <br>
+ Content licensed under CC BY-SA 4.0. <span id="purgep" style="display:none;font-size:70%;">This page has passphrase(s) stored. Click <a href="javascript:_purgep()">here</a> to purge.</span>
+ </div>
+ </div>
+ <div id="cmdbuf" class="TText" style="transition:500ms;padding:1em;font-size:2em;color:white;position:absolute;background-color:rgba(0,0,0,0.6);left:50%;top:50%;transform:translate(-50%,-50%);pointer-events:none;opacity:0;">
+ </div>
+ </div>
+ <div id="decryptui" style="display:none;opacity:0;color:white;z-index:1000;position:fixed;left:0;top:0;width:100%;height:100%;background-color:rgba(0,0,0,0.4);transition:opacity 0.5s;">
+ <div id="decryptdlg" class="TText" style="padding:10px 20px;position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);background-color:rgba(0,0,0,0.6);">
+ <div id="keyhint" style="margin-bottom:8px;"></div>
+ <div style="margin-bottom:8px;">Key: <input id="keyinp" type="text" style="color:#fff;"></div>
+ <div style="height:2.25em;">
+ <button id="btndecrypt" onclick="decryptor(decid,document.getElementById('keyinp').value);" style="position:absolute;left:20px;">Decrypt</button>
+ <button onclick="hidedecryptui();" style="position:absolute;right:20px;">Cancel</button>
+ </div>
+
+ </div>
+
+
+</div></body></html> \ No newline at end of file
diff --git a/blog/post/2017-11-25.html b/blog/post/2017-11-25.html
new file mode 100644
index 0000000..a3e1a14
--- /dev/null
+++ b/blog/post/2017-11-25.html
@@ -0,0 +1,208 @@
+<html><head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<meta name="theme-color" content="#000000">
+<title>Chrisoft::Blog</title>
+<script type="text/javascript" src="/panel.js"></script>
+<script type="text/javascript" src="/blog/footnoter.js"></script>
+<script type="text/javascript" src="/blog/aes-js.js"></script>
+<script type="text/javascript" src="/blog/scrypt.js"></script>
+<script type="text/javascript" src="/blog/sha256.js"></script>
+<script type="text/javascript" src="/blog/decryptor.js"></script>
+<link rel="stylesheet" type="text/css" href="/common.css">
+<link rel="stylesheet" type="text/css" href="/panel.css">
+<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
+<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
+<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
+<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
+<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
+<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
+<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
+<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
+<link rel="stylesheet" type="text/css" href="/blog/blogext.css">
+<script>
+function ol()
+{
+ window.onresize=function()
+ {
+ if(window.innerWidth<768)
+ setupevents();
+ else unsetevents();
+ }
+ window.onresize();
+ _decryptonload();
+}
+function loadTheme(){
+ var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
+ if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
+ var ent="";
+ var d=new Date();
+ if(thm[0]=='z')
+ {
+ var m=d.getMonth()+1;
+ if(m>=3&&m<6)thm='0'+thm[1];
+ else if(m>=6&&m<9)thm='1'+thm[1];
+ else if(m>=9&&m<12)thm='2'+thm[1];
+ else thm='3'+thm[1];
+ }
+ if(thm[1]=='z')
+ {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
+ ent=`theme${thm}`;
+ var R=new RegExp('theme[0-4][ab]');
+ for(var i=0;i<document.styleSheets.length;++i)
+ {
+ if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
+ document.styleSheets[i].disabled=true;
+ else document.styleSheets[i].disabled=false;
+ }
+ var thmcolor="";
+ switch(thm[0])
+ {
+ case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break;
+ case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break;
+ case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break;
+ case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break;
+ }
+ document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor);
+}
+loadTheme();
+</script>
+</head>
+<body onload="ol()" style="overflow-x:hidden;">
+ <div id="panel" class="TText">
+ <ul id="panellist">
+ <li><a href="/"><h1>Chrisoft</h1></a></li>
+ <li><a href="/blog"><h2>Blog</h2></a></li>
+ <li><a href="#"><h3 id="title">A short post on Cakewalk's death and my music production</h3></a></li>
+ <li><span>Tags</span>
+ <ul id="tagslist">
+ <li><a href="/blog/list/music/">music</a></li><li><a href="/blog/list/garbage/">garbage</a></li></ul>
+ </li>
+ <li id="tocouter">
+ <span>Table of Contents</span>
+ <ul id="tocroot">
+ <li><a class="toctarg" href="#tocanch0">Death of Cakewalk</a></li><li><a class="toctarg" href="#tocanch1">My music production</a></li><li><a class="toctarg" href="#tocanch2">Future choice of DAW</a></li></ul>
+ </li>
+ <li style="margin-left:-0.5em"><a id="prevp" href="2017-06-29.html">Prev post</a></li>
+ <li style="margin-left:-0.5em"><a id="nextp" href="2017-12-21.html">Next post</a></li>
+ </ul>
+ </div>
+ <div id="content">
+ <h2 id="titleh" class="TText" style="font-wight:normal;">A short post on Cakewalk's death and my music production</h2>
+ <div id="datetags" class="TText" style="margin-bottom:1em;">2017-11-25<br>#music #garbage</div>
+ <hr><div id="article" class="TText">
+<article>
+<h2 id="tocanch0" class="tvis">Death of Cakewalk</h2>
+<div style="border:1px gray solid;padding:1em;">
+Cakewalk died.<br>
+Imagine your old trustworthy friend suddenly passed away.<br>
+It started as the feeling in a harsh winter.<br>
+Then there was anger.<br>
+But finally it all ended in pure voidness.<br>
+So long, Cakewalk!
+</div>
+<p>
+As stated by Gibson
+<a href="https://www.cakewalk.com/Gibson-Announcement">here</a>,
+Cakewalk was SIGKILL'ed, perhaps due to insufficient resources,
+or a dangling pointer. Anyway, it was finally killed, with all
+development and vending activity ended.
+</p>
+<p>
+I encountered Cakewalk in 2009, when I was skimming through an old
+magazine on computer software from 1998. There was an article about
+Cakewalk Pro Audio 5.0. Back then I was using a piece of software
+called "Music Maker DX" to edit MIDI files. After that I started
+using CWPA 9.0, which was, obviously, pirated. I used external
+synthesizer such as Timidity to produce audio files, because I had
+no idea about what I was really doing at that time.
+</p>
+<p>
+I thought CWPA 9.0 was the last version of Cakewalk, and that Cakewalk
+has long been dead, until somewhere in 2011 I found that they had
+renamed their product to SONAR. So I tried SONAR 6 (which is, again,
+pirated) and was fascinated immediately.
+</p>
+<p>
+In 2014, I started to try (pirated) SONAR X2 Producer. After a (really
+long) trial period of a year or so, in 2015, I finally purchased SONAR
+Professional from Steam. Soon after, I got the SONAR Platinum Lifepass,
+which hopefully is a penance of my earlier piracy. I made my major
+production during this period.
+</p>
+<p>
+And then it was the saddening story at the beginning of this article.
+</p>
+<p>
+I've tried multiple DAWs, namely FL Studio, Cubase and even OpenMPT
+(which is actually a tracker). Only SONAR deserves the words "it just
+feels right" for me. It is also my first time feeling saddened by the
+death of a proprietary software. If Microsoft ceased the development
+of Windows, I would be much happier.
+</p>
+<h2 id="tocanch1" class="tvis">My music production</h2>
+<p>
+I'm going to pause any music production of mine, not only to mourn the
+death of Cakewalk, but also due to my lack of time and inspiration.
+</p>
+<p>
+Most of my current works are arrangements and "reverse engineering"
+(「耳コピ」) of Touhou project's in-game music, with a few original
+but mostly unfinished works. Therefore, to review the basic music
+theory, regain my piano skills and to learn from the works of great
+predecessors might be the most appropriate choice for me. Although
+I have an extremely small range of audiences, it's my duty to make
+sure that they won't be pissed off after listening to my works.
+So I guess those steps are also a must before resuming my identity
+of a music producer.
+</p>
+<h2 id="tocanch2" class="tvis">Future choice of DAW</h2>
+<p>
+<b>Cubase</b> is another classic DAW. It's even older than Cakewalk.
+It has aggressive DRM measures, which makes Steinberg much safer
+from piracy than Cakewalk. Apparently that DRM is also the center
+of controversy over Steinberg. I've got many of Steinberg's instruments.
+</p>
+<p>
+<b>Reaper</b> looks nice and is fairly priced. Might have a try later on.
+</p>
+<p>
+<b>FL Studio</b>. Doesn't feel right for me.
+</p>
+<p>
+<b>OpenMPT</b>? ...
+</p>
+<p>
+<b><s>Vocaloid</s></b>. That's not a DAW.
+</p>
+<p>
+Contact me if you have other suggestions.
+</p>
+</article>
+</div><br><hr>
+ <div class="TText" id="notediv" style="font-size:80%;"></div>
+ <div id="insanch" style="height:3em;"></div>
+ <div id="footer" style="">
+ <div id="pagesw" class="TText" style="width:100%;height:0.5em;"></div>
+ <div style="text-align:center;" class="TText">
+ Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5
+ <br>
+ Content licensed under CC BY-SA 4.0. <span id="purgep" style="display:none;font-size:70%;">This page has passphrase(s) stored. Click <a href="javascript:_purgep()">here</a> to purge.</span>
+ </div>
+ </div>
+ <div id="cmdbuf" class="TText" style="transition:500ms;padding:1em;font-size:2em;color:white;position:absolute;background-color:rgba(0,0,0,0.6);left:50%;top:50%;transform:translate(-50%,-50%);pointer-events:none;opacity:0;">
+ </div>
+ </div>
+ <div id="decryptui" style="display:none;opacity:0;color:white;z-index:1000;position:fixed;left:0;top:0;width:100%;height:100%;background-color:rgba(0,0,0,0.4);transition:opacity 0.5s;">
+ <div id="decryptdlg" class="TText" style="padding:10px 20px;position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);background-color:rgba(0,0,0,0.6);">
+ <div id="keyhint" style="margin-bottom:8px;"></div>
+ <div style="margin-bottom:8px;">Key: <input id="keyinp" type="text" style="color:#fff;"></div>
+ <div style="height:2.25em;">
+ <button id="btndecrypt" onclick="decryptor(decid,document.getElementById('keyinp').value);" style="position:absolute;left:20px;">Decrypt</button>
+ <button onclick="hidedecryptui();" style="position:absolute;right:20px;">Cancel</button>
+ </div>
+
+ </div>
+
+
+</div></body></html> \ No newline at end of file
diff --git a/blog/post/2017-12-21.html b/blog/post/2017-12-21.html
new file mode 100644
index 0000000..8e1733c
--- /dev/null
+++ b/blog/post/2017-12-21.html
@@ -0,0 +1,995 @@
+<html><head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<meta name="theme-color" content="#000000">
+<title>Chrisoft::Blog</title>
+<script type="text/javascript" src="/panel.js"></script>
+<script type="text/javascript" src="/blog/footnoter.js"></script>
+<script type="text/javascript" src="/blog/aes-js.js"></script>
+<script type="text/javascript" src="/blog/scrypt.js"></script>
+<script type="text/javascript" src="/blog/sha256.js"></script>
+<script type="text/javascript" src="/blog/decryptor.js"></script>
+<link rel="stylesheet" type="text/css" href="/common.css">
+<link rel="stylesheet" type="text/css" href="/panel.css">
+<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
+<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
+<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
+<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
+<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
+<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
+<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
+<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
+<link rel="stylesheet" type="text/css" href="/blog/blogext.css">
+<script>
+function ol()
+{
+ window.onresize=function()
+ {
+ if(window.innerWidth<768)
+ setupevents();
+ else unsetevents();
+ }
+ window.onresize();
+ _decryptonload();
+}
+function loadTheme(){
+ var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
+ if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
+ var ent="";
+ var d=new Date();
+ if(thm[0]=='z')
+ {
+ var m=d.getMonth()+1;
+ if(m>=3&&m<6)thm='0'+thm[1];
+ else if(m>=6&&m<9)thm='1'+thm[1];
+ else if(m>=9&&m<12)thm='2'+thm[1];
+ else thm='3'+thm[1];
+ }
+ if(thm[1]=='z')
+ {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
+ ent=`theme${thm}`;
+ var R=new RegExp('theme[0-4][ab]');
+ for(var i=0;i<document.styleSheets.length;++i)
+ {
+ if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
+ document.styleSheets[i].disabled=true;
+ else document.styleSheets[i].disabled=false;
+ }
+ var thmcolor="";
+ switch(thm[0])
+ {
+ case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break;
+ case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break;
+ case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break;
+ case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break;
+ }
+ document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor);
+}
+loadTheme();
+</script>
+</head>
+<body onload="ol()" style="overflow-x:hidden;">
+ <div id="panel" class="TText">
+ <ul id="panellist">
+ <li><a href="/"><h1>Chrisoft</h1></a></li>
+ <li><a href="/blog"><h2>Blog</h2></a></li>
+ <li><a href="#"><h3 id="title">为什么我<i>就是不</i>使用Mac</h3></a></li>
+ <li><span>Tags</span>
+ <ul id="tagslist">
+ <li><a href="/blog/list/garbage/">garbage</a></li><li><a href="/blog/list/device-review/">device-review</a></li></ul>
+ </li>
+ <li id="tocouter">
+ <span>Table of Contents</span>
+ <ul id="tocroot">
+ <li><a class="toctarg" href="#tocanch0">前言</a></li><li><a class="toctarg" href="#tocanch1">美观与显示效果</a></li><li><a class="toctarg" href="#tocanch2">系统功能</a></li><li><a class="toctarg" href="#tocanch3">生产力应用支持与兼容性</a></li><li><a class="toctarg" href="#tocanch4">系统稳定性</a></li><li><a class="toctarg" href="#tocanch5">可扩展性</a></li><li><a class="toctarg" href="#tocanch6">其他有关用户体验的部分</a></li><li><ul class="tocnode"><li><a class="toctarg" href="#tocanch7">关于字体</a></li><li><a class="toctarg" href="#tocanch8">关于程序安装</a></li><li><a class="toctarg" href="#tocanch9">关于“清理内存”</a></li><li><a class="toctarg" href="#tocanch10">硬件部分</a></li></ul></li><li><a class="toctarg" href="#tocanch11">结论</a></li><li><a class="toctarg" href="#tocanch12">后记</a></li><li><a class="toctarg" href="#tocanch13">附:关于Mac的使用体验</a></li><li><a class="toctarg" href="#tocanch14">真正的结论</a></li></ul>
+ </li>
+ <li style="margin-left:-0.5em"><a id="prevp" href="2017-11-25.html">Prev post</a></li>
+ <li style="margin-left:-0.5em"><a id="nextp" href="2018-01-05.html">Next post</a></li>
+ </ul>
+ </div>
+ <div id="content">
+ <h2 id="titleh" class="TText" style="font-wight:normal;">为什么我<i>就是不</i>使用Mac</h2>
+ <div id="datetags" class="TText" style="margin-bottom:1em;">2017-12-21<br>#garbage #device-review</div>
+ <hr><div id="article" class="TText">
+<article>
+<p>
+<a id="disclaimer"></a>
+声明:本文的写作仅是为了陈述<i>我</i>为何不使用Mac的原因。如果你认为我在试图说服你
+(或者其他人)不要使用Mac,你可能需要<a href="http://cn.uncyclopedia.wikia.com/wiki/%E5%B0%84%E6%9D%80">接受治疗</a>。
+</p>
+<p>
+前段时间<s>(嗯……大约有半年了吧)</s>一个在中南大学的朋友给我发了一篇他的同学的文章。
+当时并没有注意。最近在地址栏里却又发现了这篇文章。读后感到自己的受到了「冒犯」
+(开个玩笑)。于是现在就写这么一篇某种程度上类似《檄英王鸡》的玩笑文章。
+仅仅是为了表达一点自己的想法(以及娱乐)。
+</p>
+<p>
+<a href="https://www.tail0r.com/why-choose-mac/">原文链接</a>
+</p>
+<style>
+table,td,th{border:1px solid grey;}
+table{border-collapse:collapse;width:98%;}
+td{padding:1em;}
+</style>
+<table>
+<tbody><tr>
+<td width="56%"><p>
+最近很多同学来问我下一台电脑是否应该购买 Mac,于是我决定写一篇文章说一说。
+</p></td>
+<td width="44%"><p>
+如果是我的话,我会直接让他们<s>滚蛋</s>买啊,看别人花大钱什么的是最令人愉快的事情之一了。
+</p></td>
+</tr>
+<tr>
+<td><p>
+我一直认为,电脑是手机之外最重要的生产力工具,
+</p></td>
+<td><p>
+wat? 手机是生产力工具?请用您的iPhone X制作一张报名表,或者用它写一段树分治?
+(窃笑)
+<a id="n1" href="#note1" class="note">[1]</a>
+</p></td>
+</tr>
+<tr>
+<td>
+而<u>一个先进的生产力工具应该具备的特性是:强大的生产力、愉快的用户体验、高度可定制性、
+较低的维护成本</u>。
+</td>
+<td>
+1. 喂,这个其实是看人而不是看设备的吧(<br>
+2. 「此网页遇到了问题」<br>
+3. 听说你跟LFS比<a href="#customization" id="custa">可定制性</a>(逃<br>
+4. Do you want to install the updates now or try tonight?
+</td>
+</tr>
+<tr>
+<td>
+对于操作系统平台而言,即是<u>优秀的用户体验(美观性和功能性)、丰富的生产力 App 支持、
+坚固的系统内核以及系统的自动维护能力</u>。
+</td>
+<td>
+1. <a href="#tocanch13">见下</a><br>
+2. vim(和emacs)用户:被称为「App」的东西竟然有生产力?<br>
+3. 听说不需要密码就能登陆root账户的系统内核很坚固(<br>
+4. Do you want to install the updates now or try tonight? ×2
+</td>
+</tr>
+<tr>
+<td>
+因为操作系统从底层决定了一台电脑是否是合格的生产力工具,因此本文将着重于比较 Windows
+和 macOS 操作系统(考虑到大多数人不会使用 Linux),并在篇末用较少的篇幅提及硬件的部分。
+</td>
+<td>
+真不巧,我不是这位作者所说的「大多数人」(<br>
+<a href="http://harmful.cat-v.org/software/operating-systems/osx/">
+worst *nix variant still in use</a>
+</td>
+</tr>
+<tr>
+<td>
+<h2 id="tocanch0" class="tvis">前言</h2>
+<p>
+本文作者 Frederic,致力于通过各种折腾提高效率、优化体验。三年前前一直使用 Windows
+系统,之后在 MacBook Pro 上使用 macOS 至今。
+对两个操作系统的特性及应用支持均具有较为深厚的了解。
+(声明:由于这三年基本没有接触过 Windows 了,部分观点可能具有一定局限性)
+</p>
+</td>
+<td>
+<h2 class="notoc">前言</h2>
+<p>
+本文作者 Chris,致力于乱搞和写bug。6年前主要使用Windows系统,此后入坑Linux
+并将其作为自己的主要工作环境。(发行版使用路线: Ubuntu -&gt; Debian -&gt; Arch -&gt;
+Gentoo)。期间无数次帮助操作自己的电脑甚至不如我熟练的Mac用户解决各种问题。
+(声明:<a href="#disclaimer">上面已经写过了</a>)
+</p>
+</td>
+</tr>
+<tr>
+<td>
+<h2 id="tocanch1" class="tvis">美观与显示效果</h2>
+<p>
+作为一个有着美学执念的人,我决定美观性放在第一个来说。下图为 Windows 10 和 macOS
+Sierra 的 UI 对比图。总体来说,Windows的界面已经被彻底扁平化,运用简单的图标、
+大面积的色块,层级表现不明显,主色调为“科技蓝”;而 macOS Sierra
+基本保持了拟物化的的风格和比较浓郁的阴影效果(这是与 iOS 不同的地方),
+更加注重细节的精美,主色调为灰色。
+</p>
+<div style="margin:auto;text-align:center;"><a href="//filestorage.chrisoft.org/blog/img/wcm_a.png">
+<img src="//filestorage.chrisoft.org/blog/img/wcm_a.png" width="90%" decoding="async"></a>
+<br>系统桌面对比图(左为 Windows 10,右为 macOS Sierra)</div>
+<p>
+如果你能接受微软的直男审美呢,选择 Windows 倒也不错,否则还是选择 macOS 吧。
+</p>
+</td>
+<td>
+<h2 class="notoc">美观与显示效果</h2>
+<blockquote>
+<p>
+"shiny jails"
+</p>
+<div class="rightaligned">--Richard Stallman
+<a id="n2" href="#note2" class="note">[2]</a>
+</div>
+</blockquote>
+<p>
+恕我直言,用电脑这么多年,我还没有找到真正符合我的审美的设计理念。如果非要说的话,
+Haiku和Mac OS 9可能有这种资格。于是,我选择破罐破摔。
+</p>
+<div style="margin:auto;text-align:center;"><a href="//filestorage.chrisoft.org/blog/img/gentoodesktop.png">
+<img src="//filestorage.chrisoft.org/blog/img/gentoodesktop.png" width="80%" decoding="async"></a>
+<br>我的桌面</div>
+</td>
+</tr>
+<tr>
+<td>
+<p>
+此外,<u>Windows 10 没有色彩管理系统</u>,这对于影像和设计工作者来说简直是噩梦,
+而 macOS 拥有完善的色彩管理功能,这也是为什么影像与设计工作者大多采用 Mac 的原因之一。
+颇为有趣的是,曾经的 Windows Vista 是有色彩管理功能的,不过微软后来居然把它取消了。
+</p>
+</td>
+<td>
+<p>
+Fiction. 微软从1998年添加此功能之后从未取消过。
+所以这并不是为什么影像与设计工作者大多采用 Mac 的原因之一。
+</p>
+<div style="margin:auto;text-align:center;"><a href="//filestorage.chrisoft.org/blog/img/fiction.png">
+<img src="//filestorage.chrisoft.org/blog/img/fiction.png" width="80%" decoding="async"></a>
+<br>Windows 10 的色彩管理系统</div>
+</td>
+</tr>
+<tr>
+<td><p>
+值得一提的是,目前在售的 MacBook 全部配备了视网膜 IPS 屏,这意味着无论从哪个角度看,
+屏幕色彩总是一致的,并且显示效果清晰细腻;相比之下,许多在售的其他笔记本不仅分辨率过低、
+甚至没有配备 IPS 屏。(当然也脱不开价格因素的影响)
+</p></td>
+<td><p>
+如果用买MacBook的钱,买一台屏幕辣鸡的笔记本,在2017年也不是什么容易事。
+</p></td>
+</tr>
+<tr>
+<td>
+<h2 id="tocanch2" class="tvis">系统功能</h2>
+<p>
+macOS 和 Windows 的操作习惯确有诸多不相似之处,不过在经过了一段时间过后,
+最终都会慢慢适应。举例来说,macOS 没有提供文件的剪切功能(Cmd+X)而仅仅提供了复制
+(Cmd+C),这使得我们在移动文件时只能先拷贝再删除、或者直接在两个文件夹间拖动文件。
+不过,macOS 并不像 iOS 一样封闭,你可以安装 TotalFinder
+等插件给你的系统加上文件剪切功能。
+</p>
+</td>
+<td>
+<h2 class="notoc">系统功能</h2>
+<p>
+我只需要以下3样东西就可以完成我的工作:
+</p>
+<ul>
+<li>编辑器</li>
+<li>工具链</li>
+<li>www浏览器</li>
+</ul>
+<p>
+……至于操作习惯的问题,如果遇到一个系统要求用户适应系统的情况,这个系统的<a id="customization" href="#custa">可定制性</a>,
+就大打折扣了:真正可定制性高的系统应当允许用户改变系统的行为以适应自己的操作习惯,而不是强迫用户去适应系统。
+</p>
+</td>
+</tr>
+<tr>
+<td>
+<p>
+要说 macOS 的大杀器,就不得不提到时光机:Time Machine。Time Machine
+不仅仅实现了自动的的系统完整备份,它更可以让你随时找到同一份文件在几天前的版本,
+从此写文档不用再把文件名改成 v1.0、v1.1、v1.2 了,以前的版本想找回随时可以找回。
+同样可以找回多天前误删的文件哦。也许这样听着并不是很伟大的功能,但关键时刻可以救命。
+</p>
+</td>
+<td>
+<div style="margin:auto;text-align:center;"><a href="https://i.redd.it/05b6u19pseoz.png">
+<img src="https://i.redd.it/05b6u19pseoz.png" width="80%" decoding="async"></a>
+<br><i>real</i> version control <br><reduced>(使用Time Machine应当被视为最后一个的变种)</reduced></div>
+<p>
+另外,微软早在Windows ME<a id="n3" href="#note3" class="note">[3]</a>里就加入了类似的功能(虽然没有人用)……
+</p>
+</td>
+</tr>
+<tr>
+<td>
+<p>
+此外,macOS 有一个你用了再也离不开的功能:Spotlight 搜索。它其实就是一个全局的搜索功能,
+不过它可以在几秒钟之内找遍你电脑上所有的文件,不仅支持搜索文件名、文件内容,
+更可以进行各种类型的筛选。除此之外,它还能提供词典释义、货币转换和快速计算等功能。
+</p>
+<div style="margin:auto;text-align:center;"><a href="//filestorage.chrisoft.org/blog/img/wcm_b.png">
+<img src="//filestorage.chrisoft.org/blog/img/wcm_b.png" width="50%" decoding="async"></a>
+<br>Spotlight 搜索文件</div>
+<div style="margin:auto;text-align:center;"><a href="//filestorage.chrisoft.org/blog/img/wcm_c.png">
+<img src="//filestorage.chrisoft.org/blog/img/wcm_c.png" width="50%" decoding="async"></a>
+<br>Spotlight 快速进行货币计算</div>
+<p>
+Spotlight 可以通过键盘快捷键迅速唤出,让你快速找到你想找的内容。
+</p>
+</td>
+<td>
+<p>
+I have that exact shit called krunner.
+</p>
+<div style="margin:auto;text-align:center;"><a href="//filestorage.chrisoft.org/blog/img/krunner.png">
+<img src="//filestorage.chrisoft.org/blog/img/krunner.png" width="50%" decoding="async"></a>
+<br>KRunner</div>
+</td>
+</tr>
+<tr>
+<td><p>
+今年秋天,macOS 的更新将会开始采用 <u>APFS 文件系统</u>。作为苹果最新研发的文件系统,
+它的性能已经在 iOS 设备上得到了充分证明。加持了 APFS 文件系统的 macOS
+在文件读写方面将会与 Windows 拉开很大的一段距离,并且难以超越。
+</p></td>
+<td>
+<p>
+<a href="https://www.phoronix.com/scan.php?page=article&amp;item=macos-sierra-ubuntu&amp;num=2">请</a>
+<a href="http://www.insanelymac.com/forum/topic/308077-file-system-speed-test-hfs-ntfs-extfat-fat32/">用</a>
+<a href="https://www.phoronix.com/scan.php?page=article&amp;item=macos-1013-linux&amp;num=2">数据</a>
+说话。
+</p>
+<p>
+简单地做几点分析:
+</p>
+<ul>
+<li>OSX 10.10和2015年的Windows系统在自家文件系统上的性能都不如外来的文件系统</li>
+<li>macOS 10.12被Ubuntu 16.04 LTS吊着打</li>
+<li>「加持」了APFS的macOS 10.13依然在除SQLite以外的所有项目上被使用ext4的Ubuntu吊打</li>
+</ul>
+<p>
+虽然可以看出Apple从用户体验的角度对APFS做了专门的改进,但是在与ext4这种10年「高龄」
+的文件系统的对决中依然惨败的结果下,我还真不敢相信「macOS 在文件读写方面将会与 Windows
+拉开很大的一段距离,并且难以超越」这样的论断,毕竟微软也不是吃素的。
+</p>
+</td>
+</tr>
+<tr>
+<td>
+<h2 id="tocanch3" class="tvis">生产力应用支持与兼容性</h2>
+<p>
+谈到 macOS 与 Windows,有一个绕不开的话题就是软件的兼容性。
+这在许多年前是一个挺大的问题,不过现在已经基本不存在了。不仅你需要的大多数 App 都在
+Mac 上有对应的版本,甚至比 Windows 版更加好用。就连大多数银行也支持在 Mac
+上登陆网银了。(具体支持请百度查询)即使没有 Mac 版,通常你也能找到功能相似的工具。
+退一万步说,如果你一定要用一个 Windows 上的应用,VMware Fusion 虚拟机也能帮你实现。
+</p>
+<div style="margin:auto;text-align:center;"><a href="//filestorage.chrisoft.org/blog/img/wcm_d.jpg">
+<img src="//filestorage.chrisoft.org/blog/img/wcm_d.jpg" width="30%" decoding="async"></a>
+<br>VMware Fusion 实现的 macOS 中运行 Windows</div>
+</td>
+<td>
+<h2 class="notoc">生产力应用支持与兼容性</h2>
+<ul>
+<li>Mac上的vim比Windows版更加好用吗?</li>
+<li>VMWare Fusion……买不起买不起。<s>我用Virtualbox。</s></li>
+<li>(我的工作已经很大程度上脱离了Windows)</li>
+</ul>
+</td>
+</tr>
+<tr>
+<td>
+<p>
+相反,很多优秀的生产力应用仅仅有 macOS 版本而没有 Windows 版本,有了这些应用的加持,
+你的 Mac 会变得非常好用,比如:Alfred、MindNode、Reeder、Daisy Disk、Bartender、
+Divvy、Paste、aText……之后我会单独写几篇文章来介绍我使用的优秀生产力工具。
+在我的寻找和调教后,<u>即使是挑剔的我也要感慨:这真的是一台效率神器</u>。
+如果你是开发者或者设计师,强烈推荐一个好工具库:<a href="https://github.com/jaywcjlove/awesome-mac">awesome-mac – GitHub</a>
+(如访问速度过慢,<a href="https://git.admirable.one/mirror/Awesome-Mac">点此访问镜像</a>)
+它列出了诸多 macOS 上的神器。截止这篇文章发表前,它已经有 13,000 个 star 数,
+可见其受欢迎的程度。
+</p>
+<div style="margin:auto;text-align:center;"><a href="//filestorage.chrisoft.org/blog/img/wcm_e.png">
+<img src="//filestorage.chrisoft.org/blog/img/wcm_e.png" width="60%" decoding="async"></a>
+<br>我的一部分效率工具</div>
+</td>
+<td>
+<p>
+因为并没有一台可以自己随意折腾的Mac,所以这些名字对我来说都十分陌生,
+但是我随便挑了一个看起来有意思的名字谷歌了一下之后……有点想笑。
+</p>
+<div style="margin:auto;text-align:center;"><a href="//filestorage.chrisoft.org/blog/img/filelight.png">
+<img src="//filestorage.chrisoft.org/blog/img/filelight.png" width="80%" decoding="async"></a>
+<br>Daisy Disk vs Filelight</div>
+<p>仅这一个应用,就有以下诸多槽点:</p>
+<ul>
+<li>界面与Filelight几乎一模一样。</li>
+<li>挑剔的您认为查看磁盘使用情况的应用是生产力工具?</li>
+<li>4年后,会不会有人把我的自由软件「移植」到Mac上然后卖钱?</li>
+</ul>
+</td>
+</tr>
+<tr>
+<td>
+<p>
+就像 iOS 之于安卓,相比 Windows 来说,macOS 的应用支持不仅完全不输 Windows,
+并且质量更加优秀。
+</p>
+</td>
+<td>
+<p>
+得益于苹果的严格监管,App Store里的平均应用质量确实高出一截。然而,App Store
+之外就是一番熟悉的景象了。
+<a id="n4" href="#note4" class="note">[4]</a>
+</p>
+</td>
+</tr>
+<tr>
+<td>
+<p>
+另外一个不能忽略的问题是,即使是同款软件,在 Windows 和 macOS
+上的设计逻辑也天差地别。有个古老的段子,形容 macOS 和 Windows 的区别:
+</p>
+<blockquote>
+PC 用户有三宝:补丁、皮肤、注册表;<br><br>
+Mac 用户折腾少:触控、热键、免打扰。</blockquote>
+</td>
+<td>
+<p>
+首先,以PC和Mac区分电脑是一种过时的方式。这种方式起源于IBM PC时代,
+而「PC」一词早已早已不再是IBM PC的代称。依我来看,所有「个人计算机」都应被称为PC,
+而PC和Mac的区别,如今不过是苹果的营销用语罢了。
+</p>
+<p>
+至于那个段子,<a href="https://support.apple.com/en-us/HT208315">看看就好</a>。
+</p>
+</td>
+</tr>
+<tr>
+<td>
+<p>
+这样的情况源于 macOS 约定俗成的开发原则——效率。macOS 的效率优先级非常高,
+而繁复冗杂的娱乐功能恰恰和效率对立,想要融入 macOS 的生态体系,必须遵循苹果的要求,
+和效率无关的内容自然成为被砍掉的对象。以 QQ 举例,大家都知道腾讯什么功能都往 PC QQ
+上堆,以至于腾讯最后为厌倦了复杂的、效率为首的用户单独推出了轻聊版;而<u>在 QQ for Mac
+上,至今没有 QQ 秀等功能,一切功能以聊天为中心,爱钱如命的腾讯甚至丝毫不推销增值服务。</u>
+</p>
+<p>
+哦,顺便一说,<u>macOS 上所有软件都是没有弹窗的</u>。是的,尽管这很难相信,
+但基本所有国内流氓厂商到 Mac 上都安分了。
+</p>
+</td>
+<td>
+<p>
+因为即使是国产厂商也懂得「放弃广告比放弃用户值」这种非常浅显的道理吧(
+<a id="n5" href="#note5" class="note">[5]</a>
+</p>
+<p>
+另外,一同学天天抱怨Mac上的QQ辣鸡(比如天天掉线啦,没有群视频啦之类)。
+<s>可见其信仰不足,急需充值。</s>
+</p>
+</td>
+</tr>
+<tr>
+<td>
+<h2 id="tocanch4" class="tvis">系统稳定性</h2>
+<p>
+众所周知,Windows 是最容易崩溃、重装频繁、饱受病毒和恶意软件困扰的操作系统之一。
+客观的说,一个合格的生产力工具不应该总是需要你去维护(包括杀毒、重装系统等)。
+从这个角度,给 Windows 打负分也不为过。相比之下,macOS <u>更稳定、更少被病毒侵扰、
+几乎不需要重新安装系统</u>。这同样是你抛弃 Windows、投入 Mac 怀抱的原因之一。
+</p>
+</td>
+<td>
+<h2 class="notoc">系统稳定性</h2>
+<p>
+因为恶意软件的作者也知道用哪个操作系统的人多啊(</p><p>
+<s>假如原文的传教十分成功,macOS的份额和Windows交换之后,是谁更容易出问题还说不定呢。</s>
+</p>
+</td>
+</tr>
+<tr>
+<td><p>
+我的 MacBook 用了三年,来除了一次因为排查问题而重装了一次之外,没有重新安装过操作系统
+(那次是因为雷蛇云驱动,这是我见过史上最糟糕的驱动)。三年的时间,如果是 Windows
+系统已经被折腾的重装几遍了吧。这几乎说得上是生活方式上的差异了(偷笑)
+</p></td>
+<td><p>
+非常抱歉打击这位作者的自信,但是我家里的台式机(目前主要是家里人在用)的Windows 7已经
+7年没有重装过了——是的,从第一次安装系统以来。但是,我想这主要还是个人的使用习惯问题。
+如果你非要用电脑做奇怪的事情,三天两头重装个系统也就不值得奇怪了。
+<a id="n6" href="#note6" class="note">[6]</a>
+</p><p>
+另外,这是一台联网的电脑,而且上面没有装杀毒软件喔。
+</p><p>
+<reduced>最后我认为,不论一个人是因为什么原因而逃离Windows,
+如果连Windows的日常维护都无法做到的话,可能不太适合从事这个行业的工作。
+</reduced>
+<s>我怎么又开始把其他人都想得跟自己一样了。</s>
+</p></td>
+</tr>
+<tr>
+<td><p>
+如你所见,<u>几乎所有的大规模网络攻击都是针对 Windows 的。</u>在我三年使用 Mac 的时间里,
+并没有安装杀毒软件(事实上Mac 几乎不需要杀毒软件,当然 360 不会这么告诉你【摊手】),
+却用的比那些安装了一堆杀软的同学安稳的多。
+</p>
+<div style="margin:auto;text-align:center;"><a href="//filestorage.chrisoft.org/blog/img/wcm_f.jpg">
+<img src="//filestorage.chrisoft.org/blog/img/wcm_f.jpg" width="60%" decoding="async"></a>
+<br>前阵子肆虐的勒索病毒</div>
+</td>
+<td><p>
+而Linux上就连数量可怜的几个恶意软件都有重大bug,比如<a href="https://labs.bitdefender.com/2015/11/linux-ransomware-debut-fails-on-predictable-encryption-key/">某勒索软件</a>,
+它竟然像我一样写<code>srand(time(NULL));</code>,最终导致这个可怜的作者也许连一分钱都没有收到。好惨啊。
+</p></td>
+</tr>
+<tr>
+<td>
+<h2 id="tocanch5" class="tvis">可扩展性</h2>
+<p>
+对于极客来说,可扩展性是很有必要的。在 macOS 上,有 brew 等优秀的包管理工具,
+它类似于其他 Linux 操作系统中的easy_install、yum 等等。它省去了繁琐的安装和配置步骤,
+让你愉快地体验开发者的智慧;而在 Windows 下……我记得是没有的。如果有的话,欢迎在评论区留言。
+</p>
+</td>
+<td>
+<h2 class="notoc">可扩展性</h2>
+<p>
+「其他Linux操作系统」,macOS……也是Linux吗?(facepalm)
+</p>
+<p>
+抱歉我不能在您的评论区留言,但是Windows有nuget(以及WSL)。
+</p>
+</td>
+</tr>
+<tr>
+<td>
+<p>
+考虑到 macOS 是类 UNIX 操作系统,基本上你的 Linux 知识都可以用在你的 MacBook 上,
+非常美妙。并且,很多适用于 Linux 的神器都能在 macOS 上运行。对于极客和开发者来说,
+这无疑是非常令人激动的。
+</p>
+<p>
+重新强调一次:虽然都是苹果的亲儿子,但 macOS 比 iOS 开放多了。
+macOS 有一系列自我保护机制,保证系统功能不被恶意程序破坏,但你可以“合法”地关闭这些保护,
+并进行高级定制。
+</p>
+<div style="margin:auto;text-align:center;"><a href="//filestorage.chrisoft.org/blog/img/wcm_g.png">
+<img src="//filestorage.chrisoft.org/blog/img/wcm_g.png" width="60%" decoding="async"></a>
+<br>关闭系统完整性保护(SIP)</div>
+</td>
+<td>
+<p>
+<b>注意了!果粉看过来!OS X早在2007年就<a href="https://arstechnica.com/gadgets/2007/08/mac-os-x-leopard-receives-unix-03-certification/">取得了UNIX 03认证</a>。</b>
+所以把macOS称为「类UNIX」是对这个伟大的操作系统的贬低(
+</p>
+<p>至于Linux的兼容性的话,微软的WSL可能是一个更好的选择,因为macOS是macOS,
+而WSL是以兼容Linux为目的的。</p>
+<div style="margin:auto;text-align:center;"><a href="//filestorage.chrisoft.org/blog/img/apple-bc.jpg">
+<img src="//filestorage.chrisoft.org/blog/img/apple-bc.jpg" width="60%" decoding="async"></a>
+<br><reduced>是啊,Linux的知识都可以应用过来,成功率甚至更高呢(</reduced></div>
+<p><reduced>顺便,您的zsh提示符主题的powerline字体显示有点小问题,看着有点难受。
+<s>可能这才是这个主题本来的样子?</s></reduced></p>
+</td>
+</tr>
+<tr>
+<td>
+<h2 id="tocanch6" class="tvis">其他有关用户体验的部分</h2>
+<h3 id="tocanch7" class="tvis">关于字体</h3>
+<p>
+客观的说,尽管微软也做出了一些努力,即使到了 2017 年,<u>Windows
+在字体渲染方面也依然被 macOS 完爆十条街</u>。macOS 的字体渲染精美、忠于字形,
+像印刷品一般精致;而微软为了兼容低端设备,则对字体进行了诸多不合理的调整,
+并且显示效果非常差劲。相信使用过 macOS 和 Windows 的同学一眼就能认出来同样一款字体的截图,
+哪张来自 Windows,哪张来自 Mac。
+</p>
+</td>
+<td>
+<h2 class="notoc">其他有关用户体验的部分</h2>
+<h3 class="notoc">关于字体</h3>
+<div style="margin:auto;text-align:center;"><a href="//filestorage.chrisoft.org/blog/img/apple-aa.png">
+<img src="//filestorage.chrisoft.org/blog/img/apple-aa.png" width="80%" decoding="async"></a>
+<br><reduced>请问这是什么印刷品,非法出版物?</reduced></div>
+<p>
+看到上图的时候我甚至曾经怀疑了我的眼睛,但是……
+<s>毕竟Apple也是用FreeType的,我们不要开这种无聊的玩笑了。</s>
+</p>
+</td>
+</tr>
+<tr>
+<td>
+<h3 id="tocanch8" class="tvis">关于程序安装</h3>
+<p>
+此外,<u>大多数 macOS 的应用程序安装流程是直接拖动 app 到“应用程序”文件夹,然后就完成了。</u>
+如果需要删除,把 app 拖到废纸篓即可。这是其他操作系统都没有的愉悦体验,<u>即使是国内软件,
+也不用担心被安装全家桶</u>。(坦诚地说,我还是建议安装一个 AppDelete,它能帮你找到 App
+在其他目录下生成的文件,并把它们一并清理掉。使用方法也很简单,拖进去就行了,不用像
+Windows 一样走一遍“卸载向导”之类的)
+</p>
+<div style="margin:auto;text-align:center;"><a href="//filestorage.chrisoft.org/blog/img/wcm_h.png">
+<img src="//filestorage.chrisoft.org/blog/img/wcm_h.png" width="60%" decoding="async"></a>
+<br>拖动安装 App</div>
+</td>
+<td>
+<h3 class="notoc">关于程序安装</h3>
+<p>
+如果读者不清楚macOS为何能实现这样的安装方式,我可以在此对着左边的果粉班门弄斧一把,
+任何不当之处请不吝赐教:macOS中文件夹也存在类型,文件名以.app结尾的文件夹实质上是程序包,
+里面含有程序的可执行文件,依赖的库以及资源等等。
+</p>
+<p>
+但这种安装方式在解决了(苹果当年当众嘲笑过的)DLL Hell的同时,带来了另一个问题,
+如果毫不相干的应用A和B同时使用了系统并为提供的库libX,那么libX将在磁盘上有两个版本。
+这样也彻底抵消了动态链接为数不多的几个好处之一。(最近Linux上兴起的snap,flatpak等等也有类似的情况。)
+</p>
+<p>
+所以我并不能看到这种安装方式的任何好处。<s>我选择Portage。</s>
+</p>
+</td>
+</tr>
+<tr>
+<td>
+<h3 id="tocanch9" class="tvis">关于“清理内存”</h3>
+<p>“清理内存”大概算是国内各个奇葩厂商培养出来的用户习惯:在桌面上强行放个按钮,
+点一下清理内存,还时不时提醒你电脑又可以提速了【滑稽】。电脑是提速了,
+可你他喵的总是烦我,我工作效率下降了啊。macOS 会自动调配内存资源,无需手动干预
+(而且内存管理逻辑和 Windows 完全不同),因此完全不需要弄个小气泡小火箭什么的清理内存。
+</p></td>
+<td>
+<h3 class="notoc">关于“清理内存”</h3>
+<p>
+我现在的RAM内存使用率连超过20%的时候都很少有。<s>等于我这台电脑,花了八千块,用到的功能,
+连八分之一都不到!</s>
+</p>
+</td>
+</tr>
+<tr>
+<td>
+<h3 id="tocanch10" class="tvis">硬件部分</h3>
+<p>首先说说触摸板吧。相信每个用过 MacBook 的人都会有这样的体会:MacBook
+的触摸板是世界上最好用的触摸板,没有之一。它的触摸感非常美妙、手势功能也非常实用。
+在不干重活儿的情况下,使用 MacBook 可以几个月不用鼠标,
+而这对于其他厂商的笔记本来说是很难想象的。
+</p>
+<div style="margin:auto;text-align:center;"><a href="//filestorage.chrisoft.org/blog/img/wcm_i.png">
+<img src="//filestorage.chrisoft.org/blog/img/wcm_i.png" width="60%" decoding="async"></a>
+<br>MacBook Pro</div>
+</td>
+<td>
+<h3 class="notoc">硬件部分</h3>
+<p>
+MacBook的触摸板<i>确实</i>非常好用。尤其是手势操作的整合度,令人印象十分深刻。
+<b>但是!</b>这一切其实都得归功于软件(macOS),而不是硬件。因为从硬件的角度来讲,
+那不过是一块相当普通的Synaptics触摸板<a id="n7" href="#note7" class="note">[7]</a>而已。
+对于一些Linux发行版来说,touchegg可以实现同样的功能(然而整合度并没有macOS那么高)。
+</p>
+<p>
+另外,几个月不用鼠标这件事,大概作者是不知道或者不习惯ThinkPad的「小红点」指点杆
+<a id="n8" href="#note8" class="note">[8]</a>。
+如果熟练运用小红点的话手几乎不用动就能让鼠标跑遍整个屏幕,我还用它打Minecraft呢(
+</p>
+</td>
+</tr>
+<tr>
+<td>
+<p>
+其次是硬件外观。MacBook 的轻便程度很难有能与之比肩的竞争对手。即便有,
+在工业设计的美观度上它们也统统输给了 MacBook,尽管我不得不承认最近苹果为了让 MacBook
+Pro 更薄而缩水硬件配置的做法非常愚蠢。
+</p>
+<div style="margin:auto;text-align:center;"><a href="//filestorage.chrisoft.org/blog/img/wcm_j.png">
+<img src="//filestorage.chrisoft.org/blog/img/wcm_j.png" width="60%" decoding="async"></a>
+<br>MacBook Pro</div>
+</td>
+<td>
+<p>
+首先,这段话作为作者的个人看法,是没有什么好评价的。但是当我每次将我的
+ThinkPad X1 Yoga变为平板,从机器侧面抽出笔来做笔记的时候,总能看到附近几个Mac
+用户投来的羡慕的眼光。顺便,14寸的X1y比当前13寸的MBP要轻100g喔。
+</p>
+<p>
+然后就是有关Touch Bar的起源……
+</p>
+<div style="margin:auto;text-align:center;"><a href="//filestorage.chrisoft.org/blog/img/x1c2kb.png">
+<img src="//filestorage.chrisoft.org/blog/img/x1c2kb.png" width="60%" decoding="async"></a>
+<br>Keyboard of ThinkPad X1 Carbon 2nd Gen.</div>
+<p>
+上图是2014年发布的ThinkPad X1 Carbon第二代的键盘。
+这个被联想称作「Adaptive Keyboard」的东西,一开始与Touch Bar一样,毁誉参半。
+然而非常不幸的是联想为了保留某些按键而对键盘布局做出的智障改动
+<a id="n9" href="#note9" class="note">[9]</a>
+使得负面评价很快就压过了正面的评价。因此联想在下一代的X1 Carbon当中不得不取消了这个「改进」。
+</p>
+<p>
+客观地讲,苹果经常不是第一个使用某种技术或者设计的公司,但几乎总是第一个取得成功的公司,
+这是非常有趣的一个事实。
+</p>
+</td>
+</tr>
+<tr>
+<td>
+<p>
+最后提一下安全性:得益于软硬件的结合,理论上即便你的 MacBook 丢失,盗贼也无法提取数据。
+你还可以开启固件密码,它能阻止 Mac 从启动磁盘以外的任何设备启动。
+这样盗贼既无法获得你的数据、又无法从其他设备启动,可以说是一点用都没有了。
+如果资金充裕的话,你大可以直接去 Apple Store 购买一台新的 MacBook,然后通过 Time
+Machine 恢复备份,你就得到了一台一模一样的电脑。
+</p>
+</td>
+<td>
+<ul>
+<li>基于Intel ME的防丢失,<a href="https://en.wikipedia.org/wiki/Intel_Management_Engine#SA-00086">恐怕</a>并<a href="https://www.theregister.co.uk/2017/12/06/intel_management_engine_pwned_by_buffer_overflow/">不是什么好东西</a>
+<a id="n10" href="#note10" class="note">[10]</a>
+</li>
+<li>「资金充裕的话」,假设不成立。</li>
+</ul>
+<p>
+顺便提一个几个月前发生的小事,某同学崭新的MacBookPro13,2被<a id="n11" href="#note11" class="note">[11]</a>浇上了一点(&lt;100ml)水,
+吓得3天没敢开机,结果开机之后发现还是挂了,于是只好<s>强忍着疼痛</s>去Genius Bar修。
+</p>
+<p>
+我有一次不小心打翻了杯子把半杯热水浇到了电脑上,水自己从排水孔流了出来。
+半小时不到我就继续我的工作了。<s>高下立判。</s>
+</p>
+</td>
+</tr>
+<tr>
+<td><p>
+友情提醒一下:现代的 MacBook 内部结构已经全部焊死,因此你无法进行添加内存和硬盘、更换
+CPU等操作。建议购买时直接升级到够用的配置,免得以后后悔:MacBook 的闪存是苹果订制的,
+性能非常好,但 256GB 可能不够用,强烈建议升级到512GB 或更高;8GB
+内存对于一般用户已经够用,不过对于专业用户,强烈建议升级到 16GB。
+</p>
+<p>
+客观的说,Mac 是为工作而生的,在你做出了诸多个性化的设置之后,
+它会成为你非常美妙的工作伙伴。然而,它并不适合大型 PC 游戏玩家,因此对于这部分重度
+PC 游戏玩家来说,我的建议是换成 MacBook + PS4 的搭配。如果你执意要用 PC 玩大型游戏,
+或许还是应该考虑购买一台专门的游戏本(或台式机)。说到底,鱼和熊掌从来都不是兼得的。
+</p>
+</td>
+<td>
+<p>
+这里我来做一个消费者经常做的简单的对比(显然我在买电脑前也做过这种对比)。
+下面有四台电脑的配置单。所有图片均制作于2017-12-23。
+</p>
+<p>
+(顺便羡慕一下可以同时买得起MacBook+PS4的,这已经远远超越Pay Station级别了。)
+</p>
+</td>
+</tr>
+<tr>
+<td colspan="2">
+<table>
+<tbody><tr>
+<th>Configuration Item</th>
+<th><a href="//filestorage.chrisoft.org/blog/img/mbp15-config.png">MacBook Pro 15</a></th>
+<th></th>
+<th><a href="//filestorage.chrisoft.org/blog/img/p51-config.png">ThinkPad P51 Workstation</a></th>
+</tr>
+<tr>
+<th>CPU</th>
+<td><a href="https://ark.intel.com/products/97462/Intel-Core-i7-7920HQ-Processor-8M-Cache-up-to-4_10-GHz">Intel Core i7-7920HQ 4C8T, 3.1GHz, 4.1GHz, 8MB</a></td>
+<td>&lt;&lt;</td>
+<td><a href="https://ark.intel.com/products/97468/Intel-Xeon-Processor-E3-1535M-v6-8M-Cache-3_10-GHz">Intel Xeon E3-1535M v6 4C8T, 3.1GHz, 4.2GHz, 8MB</a></td>
+</tr>
+<tr>
+<th>RAM</th>
+<td>16GiB LPDDR3 2133MHz</td>
+<td>&lt;&lt;</td>
+<td>64GiB DDR4 2400MHz with ECC</td>
+</tr>
+<tr>
+<th>Graphics</th>
+<td>Radeon Pro 560</td>
+<td>≈<a id="n12" href="#note12" class="note">[12]</a></td>
+<td>Quadro M2200 Mobile</td>
+</tr>
+<tr>
+<th>Display</th>
+<td>15.4", 2880×1800, Wide colour (P3) gamut</td>
+<td>&lt;</td>
+<td>15.6", 3840×2160, IPS</td>
+</tr>
+<tr>
+<th>Storage</th>
+<td>2TB PCIe NVMe SSD</td>
+<td>&lt;&lt;</td>
+<td>2*1TB PCIe NVMe SSD+1TB HDD, optional RAID</td>
+</tr>
+<tr>
+<th>Extra Features</th>
+<td>macOS</td>
+<td>??</td>
+<td>Color Sensor, WWAN</td>
+</tr>
+<tr>
+<th>Price</th>
+<td>$4,199.00</td>
+<td>&gt;</td>
+<td>$3,851.10<a id="n13" href="#note13" class="note">[13]</a></td>
+</tr>
+</tbody></table><br>
+<table>
+<tbody><tr>
+<th>Configuration Item</th>
+<th><a href="//filestorage.chrisoft.org/blog/img/mbp13-config.png">MacBook Pro 13</a></th>
+<th></th>
+<th><a href="//filestorage.chrisoft.org/blog/img/spectre-config.png">HP Spectre x360</a></th>
+</tr>
+<tr>
+<th>CPU</th>
+<td><a href="https://ark.intel.com/products/97541/Intel-Core-i7-7567U-Processor-4M-Cache-up-to-4_00-GHz">Intel Core i7-7567U 2C4T, 3.5GHz, 4.0GHz, 4MB</a></td>
+<td>&lt;</td>
+<td><a href="https://ark.intel.com/products/122589/Intel-Core-i7-8550U-Processor-8M-Cache-up-to-4_00-GHz">Intel Core i7-8550U 4C8T, 1.8GHz, 4.2GHz, 8MB</a></td>
+</tr>
+<tr>
+<th>RAM</th>
+<td>16GiB LPDDR3 2133MHz</td>
+<td>≈</td>
+<td>16GiB LPDDR3 2133MHz</td>
+</tr>
+<tr>
+<th>Graphics</th>
+<td>Intel Iris Plus Graphics 650</td>
+<td>&gt;</td>
+<td>Intel UHD Graphics 620</td>
+</tr>
+<tr>
+<th>Display</th>
+<td>13.3", 2560×1600, Wide colour (P3) gamut</td>
+<td>&lt;</td>
+<td>13.3", 3840×2160, touch screen</td>
+</tr>
+<tr>
+<th>Storage</th>
+<td>1TB PCIe NVMe SSD</td>
+<td>≈</td>
+<td>1TB PCIe NVMe SSD</td>
+</tr>
+<tr>
+<th>Extra Features</th>
+<td>macOS</td>
+<td>??</td>
+<td>Convertible, Pen</td>
+</tr>
+<tr>
+<th>Price</th>
+<td>$2,899.00</td>
+<td>&gt;&gt;</td>
+<td>$1,669.99</td>
+</tr>
+</tbody></table>
+</td>
+</tr>
+<tr>
+<td></td>
+<td>
+<p>
+在对macOS没有需求的情况下,我不知道什么人<a id="n14" href="#note14" class="note">[14]</a>
+会购买MacBook。(尽管许多MacBook用户告诉我macOS &gt;&gt; everything,
+但是这与我的个人体验并不完全相符。)
+</p>
+</td>
+</tr>
+<tr>
+<td>
+<h2 id="tocanch11" class="tvis">结论</h2>
+<p>
+对于多媒体和设计、以及计算机行业学习者、工作者(事实上 Mac 是这些行业里的标配),
+我强烈建议购买一台 Mac 作为工作机。坦诚地说,我建议所有不用电脑玩游戏的用户都购买一台
+Mac,因为它真的是一款易用、优雅、省心的生产力机器。
+</p>
+</td>
+<td>
+<p>
+原作者所说确为事实。我曾经见过中南大学苹果实验室的照片。<s>隔着屏幕都能闻到钱味。</s>
+即使像我所在的穷人实验室MacBook的份额也高达30%左右。
+</p>
+<p>但是我的结论嘛……很显然当然是我不会使用Mac啦!</p>
+</td>
+</tr>
+<tr>
+<td>
+<p>无意冒犯,但<u>买了 MacBook 之后就别双系统安装 Windows 了,因为真的不需要,
+而且看起来真的很 unprofessional。</u></p>
+</td>
+<td>
+<p>
+这个我可以说1000个同意。尤其是看到数字图像处理老师在MacBook Pro
+上运行Windows 10使用MS Office 2003之后。因此每次有MacBook用户找我安装Windows系统时
+<a id="n15" href="#note15" class="note">[15]</a>,
+我都会先花10分钟来劝说他们不要这样做。
+</p>
+<p>
+顺便我也建议Mac用户不要双系统安装Linux,因为这样你会失去使用Mac的唯一好处。
+</p>
+</td>
+</tr>
+<tr>
+<td>
+「:grin:只有两者都用过才有权利谈好与不好。神烦那种都没用过 Mac 的天天喷苹果。」
+</td>
+<td>
+<p><reduced>(本来这个格子应该和下面合为一体的,奈何我水平太低,做不到啊)</reduced></p>
+</td>
+</tr><tr>
+<td colspan="2">
+<h2 id="tocanch12" class="tvis">后记</h2>
+<p>
+我用过的第一台Mac是家里人办公室的一台运行Mac OS 9的Power Macintosh G3。
+(如果作者没有留级的话)这台电脑的岁数可能比原文的作者都大呢:)。它有一个<a href="https://en.wikipedia.org/wiki/Apple_USB_Mouse">圆形的鼠标</a>。
+</p>
+<p>
+后来我因为各种各样的原因,或长或短地使用过以下Mac型号:
+</p>
+<ul>
+<li>MacBookPro8,1</li>
+<li>MacBookPro10,2</li>
+<li>MacBookAir5,1</li>
+<li>MacBookPro12,1</li>
+</ul>
+<p>
+单纯从系统用户的角度讲,OS X(macOS)做得还是相当出色的,比如我就觉得Finder
+的使用方式十分顺手,甚至想在Linux下也拥有类似操作逻辑的文件管理器(与此同时,
+也有很多人觉得这种设计反人类),Mission Control有助于提升工作效率等等
+<a id="n16" href="#note16" class="note">[16]</a>。
+</p>
+<p>
+然而到了我真正需要工作的地方时,我甚至开始怀疑我会不会用电脑了<reduced><s>大概就是不会</s></reduced>。
+我曾经在上面提到的一台MacBook上试图将我的工程移植到OS X(当时的称呼)。然后就有了我「不堪回首的」、
+「有史以来最差的C++开发体验」(XCode不听使唤,QtCreator bug层出不穷等等,
+最后我用qmake+make生成了一个根本不能用的可执行文件)。
+</p>
+<p>
+我在高中最后一年时,曾经(用接近一年的时间)非常认真地考虑过下一台电脑会不会是
+MacBook Pro。纠结之处当然还是集中在价格上(当时还有可以自己加内存的MBP卖,
+所以不需要像现在一样加8GB RAM就要多$200,或者1520人民币)。然而当 ThinkPad X1 Carbon 4th Gen.
+和ThinkPad X1 Yoga 1st Gen. 亮相CES 2016<a id="n17" href="#note17" class="note">[17]</a>
+的时候,我大概就有了最终的决定了。
+</p>
+<div style="margin:auto;text-align:center;"><a href="//filestorage.chrisoft.org/blog/img/applecurse.png">
+<img src="//filestorage.chrisoft.org/blog/img/applecurse.png" width="50%" decoding="async"></a>
+<br><reduced>乱入的花絮</reduced></div>
+<h2 id="tocanch13" class="tvis">附:关于Mac的使用体验</h2>
+<div style="margin:auto;text-align:center;"><a href="//filestorage.chrisoft.org/blog/img/brokenmac.jpg">
+<img src="//filestorage.chrisoft.org/blog/img/brokenmac.jpg" width="50%" decoding="async"></a>
+<br><reduced><s>broken mac</s></reduced></div>
+<p>除了不愉快的开发经验之外,我使用Mac的其他经历还算正常。但是在reddit的softwaregore
+subbredit中,来自macOS的software gore和来自Windows的software gore明显不成比例……
+按道理来说应该与用户比例类似才对,然而刷那个subreddit给我的感受是……Mac用户和其他电脑用户比例可达1:1。
+<s>强烈建议苹果的测试人员多刷一刷reddit。</s>
+</p>
+<h2 id="tocanch14" class="tvis">真正的结论</h2>
+<p>
+<s>穷人就是事多。要我也是Pay Station,管它什么配置性价比系统的,
+先把所有品牌的顶配笔记本全都买到手再说。哪个用着不爽砸哪个。</s>
+</p>
+</td>
+</tr>
+</tbody></table>
+</article>
+</div><br><hr>
+ <div class="TText" id="notediv" style="font-size:80%;"><span class="TText"><a id="note1" href="#n1">[1]</a>: <a href="https://www.reddit.com/r/softwaregore/comments/6jjfik/111_84_call_911_thanks_siri/"><s>现在的siri是不是只需要说一声「给我写个树分治」就行啊</s></a><br></span><span class="TText"><a id="note2" href="#n2">[2]</a>: <a href="https://youtu.be/fkkDvKGcNSo?t=1081">https://youtu.be/fkkDvKGcNSo?t=1081</a><br></span><span class="TText"><a id="note3" href="#n3">[3]</a>: 史上最辣鸡的操作系统之一。<br></span><span class="TText"><a id="note4" href="#n4">[4]</a>: 顺便,我为数不多的Mac App Store使用体验几乎全是噩梦级的,
+可能是苹果发现了我是用不起苹果的低端人口了吧。<br></span><span class="TText"><a id="note5" href="#n5">[5]</a>: 尽管他们不在意我这样的Linux用户,但我也不在意他们呀(<br></span><span class="TText"><a id="note6" href="#n6">[6]</a>: 认识一个不愿透露姓名的dalao,一天可以重装7次系统,还不是Windows。<br></span><span class="TText"><a id="note7" href="#n7">[7]</a>: 虽然它面积超大,还有Taptic Engine的配合(尽管Taptic Engine的效果并没有给我留下深刻的印象)<br></span><span class="TText"><a id="note8" href="#n8">[8]</a>: 不习惯小红点的ThinkPad用户实在太多,以至于联想现在甚至认为小红点只为情怀而存在的了<br></span><span class="TText"><a id="note9" href="#n9">[9]</a>: 还有一个不能忽视的原因是ThinkPad死忠粉似乎不多<br></span><span class="TText"><a id="note10" href="#n10">[10]</a>: 我的辣鸡电脑上也有Intel的AMT,现在我正试图想办法屏蔽掉它。<br></span><span class="TText"><a id="note11" href="#n11">[11]</a>: 非常有意思的是,
+这里的主语是「另一个崭新的MacBookPro13,2用户」<br></span><span class="TText"><a id="note12" href="#n12">[12]</a>: <a href="https://technical.city/en/video/Radeon-Pro-560-vs-Quadro-M2200-Mobile">https://technical.city/en/video/Radeon-Pro-560-vs-Quadro-M2200-Mobile</a><br></span><span class="TText"><a id="note13" href="#n13">[13]</a>: Base Price是逗人玩的,不需要注册直接Checkout购买就是Your Price的价格<br></span><span class="TText"><a id="note14" href="#n14">[14]</a>: 上半年,一个学长抱着
+「不准自己打游戏」的思路买了一台MacBookPro11,4,现在他表示十分后悔。<br></span><span class="TText"><a id="note15" href="#n15">[15]</a>: 并且我在安装完毕后从来都不给他们使用非法方式激活,
+因为我没有理由怀疑一个MacBook用户负担不起Windows7旗舰版的授权费用<br></span><span class="TText"><a id="note16" href="#n16">[16]</a>: 虽然这个东西其实应该视为UNIX系系统常有的工作区的一种<br></span><span class="TText"><a id="note17" href="#n17">[17]</a>: <s>并且看到美帝良心想在美帝的售价之后</s><br></span></div>
+ <div id="insanch" style="height:3em;"></div>
+ <div id="footer" style="">
+ <div id="pagesw" class="TText" style="width:100%;height:0.5em;"></div>
+ <div style="text-align:center;" class="TText">
+ Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5
+ <br>
+ Content licensed under CC BY-SA 4.0. <span id="purgep" style="display:none;font-size:70%;">This page has passphrase(s) stored. Click <a href="javascript:_purgep()">here</a> to purge.</span>
+ </div>
+ </div>
+ <div id="cmdbuf" class="TText" style="transition:500ms;padding:1em;font-size:2em;color:white;position:absolute;background-color:rgba(0,0,0,0.6);left:50%;top:50%;transform:translate(-50%,-50%);pointer-events:none;opacity:0;">
+ </div>
+ </div>
+ <div id="decryptui" style="display:none;opacity:0;color:white;z-index:1000;position:fixed;left:0;top:0;width:100%;height:100%;background-color:rgba(0,0,0,0.4);transition:opacity 0.5s;">
+ <div id="decryptdlg" class="TText" style="padding:10px 20px;position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);background-color:rgba(0,0,0,0.6);">
+ <div id="keyhint" style="margin-bottom:8px;"></div>
+ <div style="margin-bottom:8px;">Key: <input id="keyinp" type="text" style="color:#fff;"></div>
+ <div style="height:2.25em;">
+ <button id="btndecrypt" onclick="decryptor(decid,document.getElementById('keyinp').value);" style="position:absolute;left:20px;">Decrypt</button>
+ <button onclick="hidedecryptui();" style="position:absolute;right:20px;">Cancel</button>
+ </div>
+
+ </div>
+
+
+</div></body></html> \ No newline at end of file
diff --git a/blog/post/2018-01-05.html b/blog/post/2018-01-05.html
new file mode 100644
index 0000000..b5731e2
--- /dev/null
+++ b/blog/post/2018-01-05.html
@@ -0,0 +1,184 @@
+<html><head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<meta name="theme-color" content="#000000">
+<title>Chrisoft::Blog</title>
+<script type="text/javascript" src="/panel.js"></script>
+<script type="text/javascript" src="/blog/footnoter.js"></script>
+<script type="text/javascript" src="/blog/aes-js.js"></script>
+<script type="text/javascript" src="/blog/scrypt.js"></script>
+<script type="text/javascript" src="/blog/sha256.js"></script>
+<script type="text/javascript" src="/blog/decryptor.js"></script>
+<link rel="stylesheet" type="text/css" href="/common.css">
+<link rel="stylesheet" type="text/css" href="/panel.css">
+<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
+<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
+<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
+<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
+<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
+<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
+<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
+<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
+<link rel="stylesheet" type="text/css" href="/blog/blogext.css">
+<script>
+function ol()
+{
+ window.onresize=function()
+ {
+ if(window.innerWidth<768)
+ setupevents();
+ else unsetevents();
+ }
+ window.onresize();
+ _decryptonload();
+}
+function loadTheme(){
+ var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
+ if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
+ var ent="";
+ var d=new Date();
+ if(thm[0]=='z')
+ {
+ var m=d.getMonth()+1;
+ if(m>=3&&m<6)thm='0'+thm[1];
+ else if(m>=6&&m<9)thm='1'+thm[1];
+ else if(m>=9&&m<12)thm='2'+thm[1];
+ else thm='3'+thm[1];
+ }
+ if(thm[1]=='z')
+ {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
+ ent=`theme${thm}`;
+ var R=new RegExp('theme[0-4][ab]');
+ for(var i=0;i<document.styleSheets.length;++i)
+ {
+ if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
+ document.styleSheets[i].disabled=true;
+ else document.styleSheets[i].disabled=false;
+ }
+ var thmcolor="";
+ switch(thm[0])
+ {
+ case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break;
+ case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break;
+ case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break;
+ case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break;
+ }
+ document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor);
+}
+loadTheme();
+</script>
+</head>
+<body onload="ol()" style="overflow-x:hidden;">
+ <div id="panel" class="TText">
+ <ul id="panellist">
+ <li><a href="/"><h1>Chrisoft</h1></a></li>
+ <li><a href="/blog"><h2>Blog</h2></a></li>
+ <li><a href="#"><h3 id="title">Now using reverse proxy to deliver content</h3></a></li>
+ <li><span>Tags</span>
+ <ul id="tagslist">
+ <li><a href="/blog/list/web/">web</a></li><li><a href="/blog/list/random-xp/">random-xp</a></li></ul>
+ </li>
+ <li id="tocouter">
+ <span>Table of Contents</span>
+ <ul id="tocroot">
+ <li><a class="toctarg" href="#tocanch0">……现在开始使用反向代理了!</a></li></ul>
+ </li>
+ <li style="margin-left:-0.5em"><a id="prevp" href="2017-12-21.html">Prev post</a></li>
+ <li style="margin-left:-0.5em"><a id="nextp" href="2018-01-07.html">Next post</a></li>
+ </ul>
+ </div>
+ <div id="content">
+ <h2 id="titleh" class="TText" style="font-wight:normal;">Now using reverse proxy to deliver content</h2>
+ <div id="datetags" class="TText" style="margin-bottom:1em;">2018-01-05<br>#web #random-xp</div>
+ <hr><div id="article" class="TText">
+<article>
+<p>
+Now I'm using apache2 as a reverse proxy server on Conoha to
+deliver the content of <code>chrisoft.org</code>. As the
+network link between my local server and Conoha is prone to
+high delay (especially when using IPv6, which is default...),
+you may notice a major slow down when browsing this site.
+</p>
+<p>
+Anyway, it's the first time this stupid website can be accessed
+again outsite the stupid university since the 19th National
+Congress of the Communist Party of China.
+<reduced>Long live the CPC!</reduced>
+</p>
+<p>
+I've also enforced TLS even further: now any http traffic to
+<code>chrisoft.org</code> will be redirected to use https instead.
+However I loosened the enforcement on the original server.
+(http traffic directly to the original server will not be redirected)
+</p>
+<p>
+The original server is now located at <code>a.chrisoft.org</code>
+(it's also at <code>b.chrisoft.org</code>, without the corresponding
+SSL certificate).
+You may still access it directly if you are inside the StupiD University
+or have proper IPv6 access. (Uncommon ports and ports vital to
+infrastructure management such as 22, 1024 and 25565 are not yet
+blocked, so I might setup a webserver on port 10243(h2/https) and
+10248(http) for file delivery later.) Also I may consider enabling
+caching if the load time is intolerable.
+</p>
+<p>
+Below is a Chinese translation (with extra stupid content if you
+know Chinese).
+</p>
+<h2 id="tocanch0" class="tvis">……现在开始使用反向代理了!</h2>
+<p>
+我用Conoha上的VPS搭了一个Apache反向代理,目前<code>chrisoft.org</code>
+的全部内容均由这个反向代理提供。然而因为辣鸡专科学校到Conoha机房的网络延迟相当高
+(默认使用的IPv6延迟相对IPv4更高……),所以访问速度可能会受到影响……
+</p>
+<p>
+不过这个网站总算在十九大之后重见天日了。<reduced>中国共产党万岁!</reduced>
+</p>
+<p>
+另外强制https方面做得更严了。现在任何到<a>chrisoft.org</a>
+的http流量均会被强制转向https。(不过到原服务器的要求放宽了。)
+</p>
+<p>
+现在原服务器在<code>a.chrisoft.org</code>这里(其实也在
+<code>b.chrisoft.org</code>上,然而这个其实并没有什么实际用途,也没有相应的SSL证书)。
+如果你身处辣鸡专科学校内,或者有合适的IPv6访问,大概还是能直接访问原服务器的。
+(辣鸡专科学校并没有屏蔽不常见或者一些管理用的端口,比如22,1024和25565。
+所以我以后可能还会在这里放一些文件服务器之类的。)如果页面加载速度太慢的话,
+我可能还需要考虑启用Apache的缓存功能。
+</p>
+<p>
+最后立flag祝自己考试全挂(
+</p>
+<p>
+<a href="//filestorage.chrisoft.org/blog/img/conoha_conoha.png">Conoha now redirects me to
+their new landing page...</a>
+</p>
+</article>
+</div><br><hr>
+ <div class="TText" id="notediv" style="font-size:80%;"></div>
+ <div id="insanch" style="height:3em;"></div>
+ <div id="footer" style="">
+ <div id="pagesw" class="TText" style="width:100%;height:0.5em;"></div>
+ <div style="text-align:center;" class="TText">
+ Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5
+ <br>
+ Content licensed under CC BY-SA 4.0. <span id="purgep" style="display:none;font-size:70%;">This page has passphrase(s) stored. Click <a href="javascript:_purgep()">here</a> to purge.</span>
+ </div>
+ </div>
+ <div id="cmdbuf" class="TText" style="transition:500ms;padding:1em;font-size:2em;color:white;position:absolute;background-color:rgba(0,0,0,0.6);left:50%;top:50%;transform:translate(-50%,-50%);pointer-events:none;opacity:0;">
+ </div>
+ </div>
+ <div id="decryptui" style="display:none;opacity:0;color:white;z-index:1000;position:fixed;left:0;top:0;width:100%;height:100%;background-color:rgba(0,0,0,0.4);transition:opacity 0.5s;">
+ <div id="decryptdlg" class="TText" style="padding:10px 20px;position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);background-color:rgba(0,0,0,0.6);">
+ <div id="keyhint" style="margin-bottom:8px;"></div>
+ <div style="margin-bottom:8px;">Key: <input id="keyinp" type="text" style="color:#fff;"></div>
+ <div style="height:2.25em;">
+ <button id="btndecrypt" onclick="decryptor(decid,document.getElementById('keyinp').value);" style="position:absolute;left:20px;">Decrypt</button>
+ <button onclick="hidedecryptui();" style="position:absolute;right:20px;">Cancel</button>
+ </div>
+
+ </div>
+
+
+</div></body></html> \ No newline at end of file
diff --git a/blog/post/2018-01-07.html b/blog/post/2018-01-07.html
new file mode 100644
index 0000000..07f4e8b
--- /dev/null
+++ b/blog/post/2018-01-07.html
@@ -0,0 +1,444 @@
+<html><head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<meta name="theme-color" content="#000000">
+<title>Chrisoft::Blog</title>
+<script type="text/javascript" src="/panel.js"></script>
+<script type="text/javascript" src="/blog/footnoter.js"></script>
+<script type="text/javascript" src="/blog/aes-js.js"></script>
+<script type="text/javascript" src="/blog/scrypt.js"></script>
+<script type="text/javascript" src="/blog/sha256.js"></script>
+<script type="text/javascript" src="/blog/decryptor.js"></script>
+<link rel="stylesheet" type="text/css" href="/common.css">
+<link rel="stylesheet" type="text/css" href="/panel.css">
+<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
+<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
+<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
+<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
+<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
+<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
+<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
+<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
+<link rel="stylesheet" type="text/css" href="/blog/blogext.css">
+<script>
+function ol()
+{
+ window.onresize=function()
+ {
+ if(window.innerWidth<768)
+ setupevents();
+ else unsetevents();
+ }
+ window.onresize();
+ _decryptonload();
+}
+function loadTheme(){
+ var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
+ if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
+ var ent="";
+ var d=new Date();
+ if(thm[0]=='z')
+ {
+ var m=d.getMonth()+1;
+ if(m>=3&&m<6)thm='0'+thm[1];
+ else if(m>=6&&m<9)thm='1'+thm[1];
+ else if(m>=9&&m<12)thm='2'+thm[1];
+ else thm='3'+thm[1];
+ }
+ if(thm[1]=='z')
+ {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
+ ent=`theme${thm}`;
+ var R=new RegExp('theme[0-4][ab]');
+ for(var i=0;i<document.styleSheets.length;++i)
+ {
+ if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
+ document.styleSheets[i].disabled=true;
+ else document.styleSheets[i].disabled=false;
+ }
+ var thmcolor="";
+ switch(thm[0])
+ {
+ case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break;
+ case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break;
+ case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break;
+ case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break;
+ }
+ document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor);
+}
+loadTheme();
+</script>
+</head>
+<body onload="ol()" style="overflow-x:hidden;">
+ <div id="panel" class="TText">
+ <ul id="panellist">
+ <li><a href="/"><h1>Chrisoft</h1></a></li>
+ <li><a href="/blog"><h2>Blog</h2></a></li>
+ <li><a href="#"><h3 id="title">Trash dump for the fifth semester</h3></a></li>
+ <li><span>Tags</span>
+ <ul id="tagslist">
+ <li><a href="/blog/list/garbage/">garbage</a></li><li><a href="/blog/list/daily-life/">daily-life</a></li></ul>
+ </li>
+ <li id="tocouter">
+ <span>Table of Contents</span>
+ <ul id="tocroot">
+ <li><a class="toctarg" href="#tocanch0">课程相关</a></li><li><ul class="tocnode"><li><a class="toctarg" href="#tocanch1">分专业方向</a></li></ul></li><li><a class="toctarg" href="#tocanch2">ACM相关</a></li><li><ul class="tocnode"><li><a class="toctarg" href="#tocanch3">南宁邀请赛</a></li><li><a class="toctarg" href="#tocanch4">网络赛</a></li><li><a class="toctarg" href="#tocanch5">沈阳ICPC</a></li><li><a class="toctarg" href="#tocanch6">秦皇岛CCPC</a></li><li><a class="toctarg" href="#tocanch7">北京ICPC</a></li><li><a class="toctarg" href="#tocanch8">上海ICPC ECL-Final</a></li><li><a class="toctarg" href="#tocanch9">More rants on internal relationship</a></li><li><a class="toctarg" href="#tocanch10">投不投?</a></li></ul></li><li><a class="toctarg" href="#tocanch11">各种坑</a></li><li><ul class="tocnode"><li><a class="toctarg" href="#tocanch12">QMP</a></li><li><a class="toctarg" href="#tocanch13">chrisoft.org</a></li><li><a class="toctarg" href="#tocanch14">PCD</a></li><li><a class="toctarg" href="#tocanch15">Android</a></li><li><a class="toctarg" href="#tocanch16">"DAPS"</a></li></ul></li><li><a class="toctarg" href="#tocanch17">Distro-hopping</a></li><li><a class="toctarg" href="#tocanch18">正體字 Masterrace</a></li><li><a class="toctarg" href="#tocanch19">Interest shift</a></li><li><ul class="tocnode"><li><a class="toctarg" href="#tocanch20">Classical Music</a></li><li><a class="toctarg" href="#tocanch21">"Detoxification" and "the Switch"</a></li></ul></li><li><a class="toctarg" href="#tocanch22">Is this world broken?</a></li><li><ul class="tocnode"><li><a class="toctarg" href="#tocanch23">Everyone's got Depression</a></li><li><a class="toctarg" href="#tocanch24">Cheating, Inqeuity and Shamelessness</a></li></ul></li><li><a class="toctarg" href="#tocanch25">《我的性格和我的情绪》</a></li><li><ul class="tocnode"><li><a class="toctarg" href="#tocanch26">My "forks"</a></li></ul></li></ul>
+ </li>
+ <li style="margin-left:-0.5em"><a id="prevp" href="2018-01-05.html">Prev post</a></li>
+ <li style="margin-left:-0.5em"><a id="nextp" href="2018-02-05.html">Next post</a></li>
+ </ul>
+ </div>
+ <div id="content">
+ <h2 id="titleh" class="TText" style="font-wight:normal;">Trash dump for the fifth semester</h2>
+ <div id="datetags" class="TText" style="margin-bottom:1em;">2018-01-07<br>#garbage #daily-life</div>
+ <hr><div id="article" class="TText">
+<article>
+<style>
+article h2,article h3{border-bottom:1px solid #c0c0c0;overflow:hidden;}
+</style>
+<p>
+这个系列的文章自开始写作以来,似乎都没有按照一开始预想的「这学期发生了什么」
+这样的思路来写。而是变成了「这学期发生了什么+这学期的各种胡言乱语的聚集地」……
+于是有了单独拆出一个Chris' Random Rants主题的想法……
+</p>
+<p>但是实现应该不是近期的事情了。</p>
+<h2 id="tocanch0" class="tvis">课程相关</h2>
+<ul>
+<li>软件工程:这tm是啥?</li>
+<li>计算机网络:上了一学期依然听不懂dalao的谈话。二个半小时预习。</li>
+<li>数据库课程设计:交了个烂尾的东西上去。</li>
+<li>数字图像处理:傅立叶一出来就知道没有什么好事……以及,Sobel是谁啊(</li>
+<li>人机交互技术:虽然讲课的时候一直在讲「前景色和背景色不要太相似」
+这样的东西,然而最后的考试题是类似这样的:
+「请你把复习提纲上的某一个题默写出来」。</li>
+<li>Web技术:「Java脚本」?</li>
+</ul>
+<p>
+<s>计网你才预习了两个小时就混到1/10真的好吗</s>
+</p>
+<p>
+<s>数字图像处理gg了吧 应有的报应(</s>
+</p>
+<p>
+<s>可以看出辣鸡专科学校学生的平均水平了。</s>
+</p>
+<h3 id="tocanch1" class="tvis">分专业方向</h3>
+<p>
+可能是辣鸡专科学校软件学院的特色。辣鸡专科学校软件工程专业的学生在大三开始前会被要求在以下方向中选择一个
+(方向名后列出的是相应方向开设的课程):
+</p>
+<table style="width:98%;"><tbody><tr>
+<td style="vertical-align:top;">
+<ul>
+<li>信息安全
+<ul>
+ <li>信息安全导论</li>
+ <li>网络攻击与防范</li>
+ <li>操作系统安全</li>
+ <li>安全协议与标准</li>
+</ul></li>
+<li>媒体与可视化
+<ul>
+ <li>人机交互技术</li>
+ <li>数字图像处理</li>
+ <li>多媒体技术</li>
+ <li>计算机图形学</li>
+</ul></li>
+<li>数据科学
+<ul>
+ <li>数据科学导论</li>
+ <li>非关系型数据库</li>
+ <li>Web数据管理</li>
+ <li>数据仓库与数据挖掘</li>
+</ul></li>
+<li>智能软件
+<ul>
+ <li>算法设计与分析</li>
+ <li>生物信息学</li>
+ <li>运筹学</li>
+ <li>计算智能</li>
+</ul></li>
+</ul>
+</td>
+<td style="vertical-align:top;">
+<ul><li>物联网与嵌入式软件
+<ul>
+ <li>嵌入式系统原理及应用</li>
+ <li>移动互联网开发技术</li>
+ <li>操作系统开发技术</li>
+ <li>物联网工程</li>
+</ul></li>
+<li>软件与服务
+<ul>
+ <li>服务计算概论</li>
+ <li>现代Web编程</li>
+ <li>服务开发技术</li>
+ <li>软件服务工程</li>
+</ul></li>
+<li>软件工程技术与方法
+<ul>
+ <li>人机交互技术</li>
+ <li>软件体系结构</li>
+ <li>现代软件开发技术</li>
+ <li>软件过程管理</li>
+</ul></li>
+</ul>
+</td>
+</tr></tbody></table>
+<p>
+不同方向的专业课程时间一定是冲突的。<s>这有效阻止了选别的方向课的行为
+(虽然并不能阻止蹭课)。</s>
+至于在辣鸡专科学校的计算机科学与技术学院,这些课程大多属于限选课,
+可以自由组合。而且还有不少软件学院根本不开的课。
+这也许是辣鸡专科学校计科和软件为数不多的真正区别之一。
+</p>
+<p>看起来大部分专业都是二水+二非水的组合,而且分布在上下学期之后几乎都是每个学期一水+一非水。
+(当然,似乎也有全是水课的……)以下是我对这些专业的看法:
+</p>
+<ul>
+ <li>信息安全:惹不起,惹不起。</li>
+ <li>媒体与可视化:据说选了会变成不会画画的数媒专业生(</li>
+ <li>数据科学:大数据和周易有什么区别?(另外数据库已经悉数还给老师了……)</li>
+ <li>智能软件:虽然算法课和运筹学<s>yun()</s>值得一上,然而另外的课……都是些什么东西?</li>
+ <li>物联网与嵌入式软件:除了操作系统开发技术想学以外,似乎没什么吸引人的<a id="n1" href="#note1" class="note">[1]</a></li>
+ <li>软件与服务:这都是些啥?</li>
+ <li>软件工程技术与方法:这又是些啥?<s>另外我不想当PM(</s></li>
+</ul>
+<p>
+ 所以最后还是选了自己有一点微小的成果并且认为有「搞头」的媒体与可视化方向。
+ <s>于是我就变成不会画画的数媒专业生了(</s>不过从课名就能看出来,
+ 人机交互技术和多媒体技术是彻头彻尾的水课。<s>我也希望能借此机会学一点其他的东西。</s>
+</p>
+<h2 id="tocanch2" class="tvis">ACM相关</h2>
+<h3 id="tocanch3" class="tvis">南宁邀请赛</h3>
+<p>
+<s>这次比赛之后我就再也不写<b>trie树</b>了。简直心理阴影。</s>
+</p>
+<p>
+卡在是个人都会的题上。铜牌滚粗。
+</p>
+<h3 id="tocanch4" class="tvis">网络赛</h3>
+<p>
+网络赛总体还算顺利。(除了几次推辣鸡规律被学弟碾压之外(
+</p>
+<p>
+广西网络赛值得吐槽一下。是个学校就AK了是什么情况?
+(结果最后还剩一题AK时辣鸡专科学校的选手觉得稳了于是开始争抢名额,
+导致仍然在试图写最后一题的杨老爹和我写不下去,直接投降)
+</p>
+<h3 id="tocanch5" class="tvis">沈阳ICPC</h3>
+<p>
+前期优势很大。39分钟3题的时候感觉这把稳了。哪知道39分钟却成为了失去生命迹象的时间。
+</p>
+<p>
+F题别人看来完全是纯套路的递推,而我上了数据挖掘然后挖出了一堆垃圾。
+对着垃圾看了好久才发现数据挖掘的程序写错了。于是挖出了正确的数据之后开始盯着结果发呆。
+最后(!!)终于发现了相邻两个数的比例收敛于sqrt(3)+2(……)。强行写了一发之后WA,
+最后不得不用<code>bc</code>打出了sqrt(3)+2小数点后100位塞进Java的BigDecimal里乱搞,
+竟然混过了这道题(不然的话本赛季首铁在这里就收了)。
+</p>
+<p>
+G其实就是个bfs。当我在想bfs的时候队友却来告诉我这题可以用后缀数组的倍增思路搞并且坚持要我写……
+于是我在被F搞没蓝之后又写了一大堆垃圾。最后实在受不了于是把这一大堆垃圾交还给了出「思路」
+的队友。结果当然是……并没有什么卵用。
+</p>
+<p>
+H的dp搞了8发也没过。而且三个人都一致觉得当时写得很对……
+</p>
+<p>
+C题那个计算几何红书上有原题和完整代码(……)。虽然我们没带红书然而我想到了正解。
+结果因为一直被拉着写G导致没有得到施展。
+</p>
+<p>
+到火车站准备滚粗的时候,宇宙苟突然拿出电脑开始施展起他的G来。
+而且40分钟就施展完了过了样例觉得很自豪(顺便还觉得我很辣鸡),然而最后题挂出来一交,
+T(标)L(准)E(结局)。
+</p>
+<p>铜牌滚粗。</p>
+<h3 id="tocanch6" class="tvis">秦皇岛CCPC</h3>
+<p>银牌滚粗。</p>
+<p>
+大致情况是再过一道最大独立集的题就可以金了,然后最后3分钟发现抄错了模板……
+</p>
+<h3 id="tocanch7" class="tvis">北京ICPC</h3>
+<p>
+这把总体一直苟在前1/5,还算比较稳的。
+</p>
+<p>
+但是比较可恶的是宇宙苟把H题的辣鸡dp写成了线段树。快写完的时候才发现问题。
+然后我看不下去了,就开始施展G。然而看到我们快掉到#30的我心态爆炸,
+WA了5发之后才发现<b>写错了bfs</b>。
+</p>
+<p>
+然而这时宇宙苟又想到了<b>二维线段树</b>来搞H……还好他过了一会发现了这搞不得。
+(要是没发现的话估计G就过不了了(
+</p>
+<p>
+于是又用另外3发找到了G题的坑,最后过掉了G。不过H题就这么永远离开了我们。
+</p>
+<p>银牌滚粗。
+<a id="n2" href="#note2" class="note">[2]</a></p>
+<h3 id="tocanch8" class="tvis">上海ICPC ECL-Final</h3>
+<p>成功完成打铁梦想。</p>
+<p>
+12小时的火车到上海之后,唯一想做的事情就是睡觉。面基什么的,根本没去想。
+</p>
+<p>
+第二天早上醒来,发现在上海的jjy在群里找我。我立刻感觉大事不妙:
+「这是要玩真的吗……然而我现在只想睡觉呀(」。一会就得知jjy已经在旅馆楼下了。
+我才拖着100t重的身体起来洗漱穿衣出门。然后就见到了已经看了好久金鱼的jjy。
+(当然,没见到61有点遗憾。然而这是在意料之中的事,毕竟离得有点远。)
+</p>
+<p>
+和jjy聊了很多。基本都是些过往经历和未来打算的事。不过我目前……
+对未来实在是没什么完整的打算。大概与我的随遇而安的特点有点关系吧。
+谁知道这样好不好呢。当然作为一个在辣鸡专科学校为能否顺利毕业发愁的菜鸡,
+是无法体会到申到cmu的dalao的烦恼的。
+</p>
+<p>
+当然我们也聊到了ACM的事情。能够有这么一个「偷窥」
+到FDU校队的日常的机会也可以说是三生有幸了。不过关于这些我在这里并不想写太多。
+只能说从一个侧面证明了主导谈话的人往往具有更丰富的经验这个猜想吧。
+</p>
+<p>
+至于更早的ballance/virtools之类的事,就完全没有提到了。
+</p>
+<a id="n3" href="#note3" class="note">[3]</a>
+<h3 id="tocanch9" class="tvis">More rants on internal relationship</h3>
+<p>
+名额分配的过程中,又不可避免地出现了利益冲突。毕竟对人类这种终究是自私的动物来说,
+想要摆脱天性还是有点难度的吧。
+</p>
+<h3 id="tocanch10" class="tvis">投不投?</h3>
+<p>
+<s>不!</s>
+</p>
+<p>
+当然现在的状态可以说是类似已经入土又被强行挖出来了一样。
+</p>
+<h2 id="tocanch11" class="tvis">各种坑</h2>
+<h3 id="tocanch12" class="tvis">QMP</h3>
+<p>
+用 "modern" OpenGL 重写了SMELT。于是QMP的可视化的性能也有了些许提升。
+除此之外,应该只有bug fix了。
+</p>
+<h3 id="tocanch13" class="tvis">chrisoft.org</h3>
+<p>
+加上了piwik,然后又删掉了。<a id="n4" href="#note4" class="note">[4]</a>
+</p>
+<p>
+为庆祝十九大胜利召开,辣鸡专科学校<b>永久</b>封锁了所有(非官方控制的主机占用的)外网IP的常用TCP端口。
+<a id="n5" href="#note5" class="note">[5]</a>于是被迫上了反代。
+</p>
+<p>
+有位学长玩笑开得好:「『世界一流大学』的天机不可泄露啊!」
+</p>
+<h3 id="tocanch14" class="tvis">PCD</h3>
+<p>
+凉了。想什么呢你!
+</p>
+<h3 id="tocanch15" class="tvis">Android</h3>
+<p>
+试图给我的 Galaxy Note 4 适配 Lineage OS 15.1 ,奈何编译出的系统总是无法启动。
+</p>
+<p>
+帮 android-x86 修复了 iio 传感器的 HAL (后来维护者发现了 intel 官方仍在维护的相关项目……
+于是相当于没卵用)。又加了几个内核配置之类的东西(合进去的也就几行)。
+</p>
+<h3 id="tocanch16" class="tvis">"DAPS"</h3>
+<p>
+依然在做几乎只有自己一个人听的「Touhou BGM Remix」。(所以这个动力到底是哪来的,应该也是未解之谜之一。)
+</p>
+<p>
+至于自作曲,寒假试着搞了一个。然而因为自己已经几乎将所有乐理和键盘乐器的使用姿势如数还给了老师,
+所以……
+</p>
+<p>
+顺便在空闲时间练了 Maple Leaf Rag 。<s>发现基本功倒退严重,也许我应该滚回练习哈农和车尔尼。</s>
+</p>
+<h2 id="tocanch17" class="tvis">Distro-hopping</h2>
+<p>
+2017年11月4日夜,我最近的一次 distro-hopping 开始了。4天后<a id="n6" href="#note6" class="note">[6]</a>,
+一切终于就绪。我正式成为了Gentoo Linux用户。
+</p>
+<p>
+我日常使用的发行版只替换过三次: Ubuntu -&gt; Debian -&gt; Arch -&gt; Gentoo 。除第一次外,
+每次更换发行版的原因都只是为了「尝鲜」(第一次是因为当时系统已经处在彻底爆炸的边缘,不换不行了)
+<a id="n7" href="#note7" class="note">[7]</a>。
+而且每次都做了备份——为自己随时可能感到后悔铺好了后路。然而很快习惯新的环境之后,
+<a id="n8" href="#note8" class="note">[8]</a>
+这些备份都无一例外地进了<code>/dev/null</code>。
+</p>
+<p>
+自然「难装」并不是我换发行版的唯一标准,至少发行版的特点也是一个重要的考虑因素:
+<a id="n9" href="#note9" class="note">[9]</a>
+比如 Arch 虽然不支持部分更新,但是上游更新进源经常比 Debian sid 快好多;或者 Gentoo
+虽然编译耗时,但是可以用 USE flag 将不需要的功能排除在外之类。
+</p>
+<p>
+当然我不会像真正的 "distro-hopper" 一样三天换两次系统。
+主要原因是因为我更习惯自行配置系统,所以不需要纠结于「 Linux Mint 好还是 Manjaro 好」
+这种问题上。其次自然就是因为懒了(
+</p>
+<h2 id="tocanch18" class="tvis">正體字 Masterrace</h2>
+<p>
+<s>顯然,標題是用來引戰的;而且我這次也做了一回標題黨。</s>
+</p>
+<blockquote>
+「漢字簡化後,親不見,愛無心,產不生,廠空空,麵無麥,運無車,導無道,兒無首,佇無腳,
+飛單翼,湧無力,有雲無雨,開關無門,鄉里無郎,義成兇,魔仍是魔。」
+<div style="text-align:right;">——有些年頭的段子</div>
+</blockquote>
+<p>
+其實作爲一門語言,有變化才是正常的。沒有變化的語言那是已經消亡的語言。漢字的簡化,
+自古有之。政府簡化文字的初衷是好的。整理已有的俗字並且將其標準化也是好的。
+我主要反對的,在於「生造」出的簡化字。
+</p>
+<p>
+事實上漢字經過上千年的演化,象形的特徵有減弱的趨勢。比如我想現代人很少有看到「門」和
+「戶」的時候能想到後者其實是前者的半邊,如此等等。
+</p>
+<p>
+color/colour
+</p>
+<p>
+政治因素?
+</p>
+<h2 id="tocanch19" class="tvis">Interest shift</h2>
+<h3 id="tocanch20" class="tvis">Classical Music</h3>
+<h3 id="tocanch21" class="tvis">"Detoxification" and "the Switch"</h3>
+<h2 id="tocanch22" class="tvis">Is this world broken?</h2>
+<h3 id="tocanch23" class="tvis">Everyone's got Depression</h3>
+<h3 id="tocanch24" class="tvis">Cheating, Inqeuity and Shamelessness</h3>
+<h2 id="tocanch25" class="tvis">《我的性格和我的情绪》</h2>
+<h3 id="tocanch26" class="tvis">My "forks"</h3>
+</article>
+</div><br><hr>
+ <div class="TText" id="notediv" style="font-size:80%;"><span class="TText"><a id="note1" href="#n1">[1]</a>: <s>我是Internet of shiT的信徒</s><br></span><span class="TText"><a id="note2" href="#n2">[2]</a>: 非常搞笑的是在board.acmicpc.info的榜上我们居然是金。
+但是在看到只有爆零的队伍打铁之后就知道被逗了。<br></span><span class="TText"><a id="note3" href="#n3">[3]</a>: 以下部分为2018年10月底补写。拖延症晚期已经没得治了。
+以及,我可能已经搞不清为什么当时把这些主题列在这里了。<br></span><span class="TText"><a id="note4" href="#n4">[4]</a>: 说实话像咱这种破站的访问记录实在没什么好看的。<br></span><span class="TText"><a id="note5" href="#n5">[5]</a>: 在十九大期间,连教务网站都必须在校园网内访问。<br></span><span class="TText"><a id="note6" href="#n6">[6]</a>: 实际上这4天中有3天我没有用电脑<br></span><span class="TText"><a id="note7" href="#n7">[7]</a>: 其实是「听说这个发行版好难装啊,我要试试」(<br></span><span class="TText"><a id="note8" href="#n8">[8]</a>: 实际情况是因为自己懒得恢复备份,所以不得不试着习惯新的环境
+<s>(当然我也不知道为什么我会觉得恢复备份比配置新的环境麻烦)</s><br></span><span class="TText"><a id="note9" href="#n9">[9]</a>: 因此我并不会在日常使用的环境上安装LFS。<br></span></div>
+ <div id="insanch" style="height:3em;"></div>
+ <div id="footer" style="">
+ <div id="pagesw" class="TText" style="width:100%;height:0.5em;"></div>
+ <div style="text-align:center;" class="TText">
+ Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5
+ <br>
+ Content licensed under CC BY-SA 4.0. <span id="purgep" style="display:none;font-size:70%;">This page has passphrase(s) stored. Click <a href="javascript:_purgep()">here</a> to purge.</span>
+ </div>
+ </div>
+ <div id="cmdbuf" class="TText" style="transition:500ms;padding:1em;font-size:2em;color:white;position:absolute;background-color:rgba(0,0,0,0.6);left:50%;top:50%;transform:translate(-50%,-50%);pointer-events:none;opacity:0;">
+ </div>
+ </div>
+ <div id="decryptui" style="display:none;opacity:0;color:white;z-index:1000;position:fixed;left:0;top:0;width:100%;height:100%;background-color:rgba(0,0,0,0.4);transition:opacity 0.5s;">
+ <div id="decryptdlg" class="TText" style="padding:10px 20px;position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);background-color:rgba(0,0,0,0.6);">
+ <div id="keyhint" style="margin-bottom:8px;"></div>
+ <div style="margin-bottom:8px;">Key: <input id="keyinp" type="text" style="color:#fff;"></div>
+ <div style="height:2.25em;">
+ <button id="btndecrypt" onclick="decryptor(decid,document.getElementById('keyinp').value);" style="position:absolute;left:20px;">Decrypt</button>
+ <button onclick="hidedecryptui();" style="position:absolute;right:20px;">Cancel</button>
+ </div>
+
+ </div>
+
+
+</div></body></html> \ No newline at end of file
diff --git a/blog/post/2018-02-05.html b/blog/post/2018-02-05.html
new file mode 100644
index 0000000..1476c38
--- /dev/null
+++ b/blog/post/2018-02-05.html
@@ -0,0 +1,265 @@
+<html><head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<meta name="theme-color" content="#000000">
+<title>Chrisoft::Blog</title>
+<script type="text/javascript" src="/panel.js"></script>
+<script type="text/javascript" src="/blog/footnoter.js"></script>
+<script type="text/javascript" src="/blog/aes-js.js"></script>
+<script type="text/javascript" src="/blog/scrypt.js"></script>
+<script type="text/javascript" src="/blog/sha256.js"></script>
+<script type="text/javascript" src="/blog/decryptor.js"></script>
+<link rel="stylesheet" type="text/css" href="/common.css">
+<link rel="stylesheet" type="text/css" href="/panel.css">
+<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
+<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
+<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
+<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
+<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
+<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
+<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
+<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
+<link rel="stylesheet" type="text/css" href="/blog/blogext.css">
+<script>
+function ol()
+{
+ window.onresize=function()
+ {
+ if(window.innerWidth<768)
+ setupevents();
+ else unsetevents();
+ }
+ window.onresize();
+ _decryptonload();
+}
+function loadTheme(){
+ var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
+ if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
+ var ent="";
+ var d=new Date();
+ if(thm[0]=='z')
+ {
+ var m=d.getMonth()+1;
+ if(m>=3&&m<6)thm='0'+thm[1];
+ else if(m>=6&&m<9)thm='1'+thm[1];
+ else if(m>=9&&m<12)thm='2'+thm[1];
+ else thm='3'+thm[1];
+ }
+ if(thm[1]=='z')
+ {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
+ ent=`theme${thm}`;
+ var R=new RegExp('theme[0-4][ab]');
+ for(var i=0;i<document.styleSheets.length;++i)
+ {
+ if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
+ document.styleSheets[i].disabled=true;
+ else document.styleSheets[i].disabled=false;
+ }
+ var thmcolor="";
+ switch(thm[0])
+ {
+ case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break;
+ case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break;
+ case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break;
+ case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break;
+ }
+ document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor);
+}
+loadTheme();
+</script>
+</head>
+<body onload="ol()" style="overflow-x:hidden;">
+ <div id="panel" class="TText">
+ <ul id="panellist">
+ <li><a href="/"><h1>Chrisoft</h1></a></li>
+ <li><a href="/blog"><h2>Blog</h2></a></li>
+ <li><a href="#"><h3 id="title">Does gaming make me merrier &amp; more relaxed or the opposite?</h3></a></li>
+ <li><span>Tags</span>
+ <ul id="tagslist">
+ <li><a href="/blog/list/garbage/">garbage</a></li></ul>
+ </li>
+ <li id="tocouter">
+ <span>Table of Contents</span>
+ <ul id="tocroot">
+ <li><a class="toctarg" href="#tocanch0">
+Disclaimer: What this article is and what it is not
+</a></li><li><a class="toctarg" href="#tocanch1">"Playing saps the will"</a></li><li><a class="toctarg" href="#tocanch2">Clumsy me</a></li><li><a class="toctarg" href="#tocanch3">Finally...</a></li><li><a class="toctarg" href="#tocanch4">The Touhou project and Clumsy me cont'd</a></li></ul>
+ </li>
+ <li style="margin-left:-0.5em"><a id="prevp" href="2018-01-07.html">Prev post</a></li>
+ <li style="margin-left:-0.5em"><a id="nextp" href="2018-03-17.html">Next post</a></li>
+ </ul>
+ </div>
+ <div id="content">
+ <h2 id="titleh" class="TText" style="font-wight:normal;">Does gaming make me merrier &amp; more relaxed or the opposite?</h2>
+ <div id="datetags" class="TText" style="margin-bottom:1em;">2018-02-05<br>#garbage</div>
+ <hr><div id="article" class="TText">
+<article>
+<h2 id="tocanch0" class="tvis">
+Disclaimer: What this article is and what it is not
+</h2>
+<p>
+ </p><ul>
+ <li>It's abount my current status.</li>
+ <li>It expresses my fear of losing interest on everything.</li>
+ <li>It doesn't speak bad of the game industry.</li>
+ <li>Nor do I try to convince you to behave like me. Although it
+ saves money, it's horrible.
+ </li>
+ </ul>
+<p></p>
+<h2 id="tocanch1" class="tvis">"Playing saps the will"</h2>
+<p>
+The heading is a literal translation of the Chinese idiom 「玩物丧志」.
+80% of the parents in China believes in this phrase, mine included.
+So I was strictly kept away from most ways of entertainment in my early
+years. During this period I developed distinct interests among the age
+group such as disassembling gadgets, programming and some music skills.
+Also due to the same reason, I've never had or even touched any device whose
+sole functionality is gaming (i.e. a gaming console, or even a Tamagotchi).
+</p>
+<p>
+The only way to play video games I was aware of then was to go to a stupid
+website within a intranet of my area. There was a deeply hidden link where a
+lot of flash games are hosted. There were plenty mockups of the Super Mario
+series, 「魔塔」<a id="n1" href="#note1" class="note">[1]</a>
+replicas and some strategic games, which definitely contributed to the
+shaping of my game preferences.
+</p>
+<p>
+The only non-flash game played by me when I was in the elementary school was
+Road Rash 2002.
+</p>
+<p>
+The only non-flash game I played during junior high school was Ballance.
+(although I also played a custom map (the tower defense one) for Warcraft
+III, a little Red Alert 2 and beat hazard, these never became my dominating
+game choice.) I played through the main content in the first month. But as
+for the DLC (Level 13, 「速度」/"Sudu"), I didn't pass it until the last day
+of Feburary this year. After going through the first 12 levels, I devoted
+myself to modding and later, cloning the entire game. I even made a new
+but somehow stupid game with the same engine called WHG3D. I still faced the
+pressure from my parents because they didn't want me do such "improper
+business".
+</p>
+<p>
+Of course I played solitaire and minesweeper, but at this time I wasn't
+aware of the actual rules of minesweeper so all I did was clicking randomly.
+</p>
+<h2 id="tocanch2" class="tvis">Clumsy me</h2>
+<p>
+After getting into senior high school, and later, the StupiD University,
+I got more time of my own. I was able to play more than ever, but suddenly
+I found out I was too clumsy to play...
+</p>
+<p>
+I tried...
+</p>
+<ul>
+ <li>osu! but I was so clumsy that I couldn't play even with a
+touchscreen at the lowest difficulty.</li>
+ <li>the Touhou project but I am so clumsy that I couldn't even make it
+through the normal difficulty of most releases. More on this later.</li>
+ <li>Minecraft but I was constantly killed by myself using custom potions
+</li>
+ <li>Snakebird but I was so dumb that I couldn't even make it through the
+fifth level.</li>
+ <li>Portal and Portal 2 but I always got stuck in infinite loops.</li>
+ <li>Neverball but I don't even know how to jump properly.</li>
+</ul>
+<p>
+These games are actually playable for me:
+</p>
+<ul>
+ <li>Minesweeper: finally I am not clicking randomly anymore. I tried to
+be hardcore at this one but my highscores were capped at 130 seconds on
+hard. Not even close to 100 seconds.</li>
+ <li>2048: once you get the trick, you can pass it infinity times.</li>
+ <li>Patience: although I have little patience, I play patience. If I
+got stuck, I just redeal.</li>
+ <li>Minecraft: still I was constantly killed by myself using custom
+potions.</li>
+ <li>sequels of BTD: these games suck and lags a lot.</li>
+ <li>chrome://dino: not really playable. I don't know what the fifth
+digit of the score is for because I can literally see nothing after reaching
+2400.</li>
+</ul>
+<h2 id="tocanch3" class="tvis">Finally...</h2>
+<p>
+ All of these leads to my current situation: I still play those
+"playable" games. For example I can reach round 100 in BMC with a level 35
+city on most maps with ease and I can get to 4096 in 2048 without much
+effort, but I always suffer from a strong feeling of voidness
+<a id="n2" href="#note2" class="note">[2]</a>
+ after stopping playing. I am unsure about the source of such feeling, but
+it is definitely related to playing games. The feeling is so strong that I
+often stuck for hours before I can actually start getting my jobs done.
+</p>
+<p>
+ Probably due to the fear of creating more voidness, I refuse to learn
+playing a new game. Also I am gradually losing interest in the games I am
+still playing. This could be concerning because once I lost interest in
+every game I may be bored to death. All I can do now is to hope that I
+would have developed other interests to entertain myself then.
+</p>
+<h2 id="tocanch4" class="tvis">The Touhou project and Clumsy me cont'd</h2>
+<p>
+ I came across this when I was in junior high school. At that time I
+thought this was merely girls shooting unknown substance while avoiding
+other unknown substance coming in all directions.
+</p>
+<p>
+ Later I found the music of this series interesting and started actually
+playing it. Before long I started adoring those cute <a id="n3" href="#note3" class="note">[3]</a> characters as well.
+I changed my wallpapers on all my devices to pictures of those characters
+so that I can see them everywhere. Also I my favourite playlists were
+replaced by the in-game music.
+</p>
+<p>
+ But all of these can't hide the fact that I suck at this game. I can't
+play through the Normal difficulty of most releases, some not even the Easy
+difficulty. This is probably due to some erroneous mechanics of my control
+system -- sometimes when my intent was to press a certain key, I may press
+another one instead. <a id="n4" href="#note4" class="note">[4]</a>Strangely this happens only when
+I am playing games, it seldom happens when I am typing. Just in case you
+are wondering, I type faster than most Chinese computer users, at around
+330 cpm or 66 wpm. However this doesn't help me become a decent gamer.
+</p>
+<p>
+What makes everything even worse is that I've got heart disease, making it
+impossible for me to play any games that require high tension or may
+cause great excitement. These games may really harm me.
+</p>
+<p>
+Any advice on how to fix me is highly appreciated.
+</p>
+</article>
+</div><br><hr>
+ <div class="TText" id="notediv" style="font-size:80%;"><span class="TText"><a id="note1" href="#n1">[1]</a>: lit. "Magic Tower", an RPG game<br></span><span class="TText"><a id="note2" href="#n2">[2]</a>: Something like extreme boredom, but not exactly.<br></span><span class="TText"><a id="note3" href="#n3">[3]</a>: In a oriental
+way -- a Japonic way to be more specific <br></span><span class="TText"><a id="note4" href="#n4">[4]</a>: Also applicable to mouse clicks. When I try
+to activate a certain ability in BTD, I may find myself dying just because
+I was hitting the wrong button.<br></span></div>
+ <div id="insanch" style="height:3em;"></div>
+ <div id="footer" style="">
+ <div id="pagesw" class="TText" style="width:100%;height:0.5em;"></div>
+ <div style="text-align:center;" class="TText">
+ Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5
+ <br>
+ Content licensed under CC BY-SA 4.0. <span id="purgep" style="display:none;font-size:70%;">This page has passphrase(s) stored. Click <a href="javascript:_purgep()">here</a> to purge.</span>
+ </div>
+ </div>
+ <div id="cmdbuf" class="TText" style="transition:500ms;padding:1em;font-size:2em;color:white;position:absolute;background-color:rgba(0,0,0,0.6);left:50%;top:50%;transform:translate(-50%,-50%);pointer-events:none;opacity:0;">
+ </div>
+ </div>
+ <div id="decryptui" style="display:none;opacity:0;color:white;z-index:1000;position:fixed;left:0;top:0;width:100%;height:100%;background-color:rgba(0,0,0,0.4);transition:opacity 0.5s;">
+ <div id="decryptdlg" class="TText" style="padding:10px 20px;position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);background-color:rgba(0,0,0,0.6);">
+ <div id="keyhint" style="margin-bottom:8px;"></div>
+ <div style="margin-bottom:8px;">Key: <input id="keyinp" type="text" style="color:#fff;"></div>
+ <div style="height:2.25em;">
+ <button id="btndecrypt" onclick="decryptor(decid,document.getElementById('keyinp').value);" style="position:absolute;left:20px;">Decrypt</button>
+ <button onclick="hidedecryptui();" style="position:absolute;right:20px;">Cancel</button>
+ </div>
+
+ </div>
+
+
+</div></body></html> \ No newline at end of file
diff --git a/blog/post/2018-03-17.html b/blog/post/2018-03-17.html
new file mode 100644
index 0000000..aa9734f
--- /dev/null
+++ b/blog/post/2018-03-17.html
@@ -0,0 +1,172 @@
+<html><head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<meta name="theme-color" content="#000000">
+<title>Chrisoft::Blog</title>
+<script type="text/javascript" src="/panel.js"></script>
+<script type="text/javascript" src="/blog/footnoter.js"></script>
+<script type="text/javascript" src="/blog/aes-js.js"></script>
+<script type="text/javascript" src="/blog/scrypt.js"></script>
+<script type="text/javascript" src="/blog/sha256.js"></script>
+<script type="text/javascript" src="/blog/decryptor.js"></script>
+<link rel="stylesheet" type="text/css" href="/common.css">
+<link rel="stylesheet" type="text/css" href="/panel.css">
+<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
+<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
+<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
+<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
+<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
+<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
+<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
+<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
+<link rel="stylesheet" type="text/css" href="/blog/blogext.css">
+<script>
+function ol()
+{
+ window.onresize=function()
+ {
+ if(window.innerWidth<768)
+ setupevents();
+ else unsetevents();
+ }
+ window.onresize();
+ _decryptonload();
+}
+function loadTheme(){
+ var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
+ if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
+ var ent="";
+ var d=new Date();
+ if(thm[0]=='z')
+ {
+ var m=d.getMonth()+1;
+ if(m>=3&&m<6)thm='0'+thm[1];
+ else if(m>=6&&m<9)thm='1'+thm[1];
+ else if(m>=9&&m<12)thm='2'+thm[1];
+ else thm='3'+thm[1];
+ }
+ if(thm[1]=='z')
+ {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
+ ent=`theme${thm}`;
+ var R=new RegExp('theme[0-4][ab]');
+ for(var i=0;i<document.styleSheets.length;++i)
+ {
+ if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
+ document.styleSheets[i].disabled=true;
+ else document.styleSheets[i].disabled=false;
+ }
+ var thmcolor="";
+ switch(thm[0])
+ {
+ case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break;
+ case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break;
+ case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break;
+ case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break;
+ }
+ document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor);
+}
+loadTheme();
+</script>
+</head>
+<body onload="ol()" style="overflow-x:hidden;">
+ <div id="panel" class="TText">
+ <ul id="panellist">
+ <li><a href="/"><h1>Chrisoft</h1></a></li>
+ <li><a href="/blog"><h2>Blog</h2></a></li>
+ <li><a href="#"><h3 id="title">Some rants on SMELT, QMidiPlayer and Virtools</h3></a></li>
+ <li><span>Tags</span>
+ <ul id="tagslist">
+ <li><a href="/blog/list/devel/">devel</a></li><li><a href="/blog/list/qmidiplayer/">qmidiplayer</a></li><li><a href="/blog/list/opengl/">opengl</a></li></ul>
+ </li>
+ <li id="tocouter" style="display: none;">
+ <span>Table of Contents</span>
+ <ul id="tocroot">
+ </ul>
+ </li>
+ <li style="margin-left:-0.5em"><a id="prevp" href="2018-02-05.html">Prev post</a></li>
+ <li style="margin-left:-0.5em"><a id="nextp" href="2018-04-17.html">Next post</a></li>
+ </ul>
+ </div>
+ <div id="content">
+ <h2 id="titleh" class="TText" style="font-wight:normal;">Some rants on SMELT, QMidiPlayer and Virtools</h2>
+ <div id="datetags" class="TText" style="margin-bottom:1em;">2018-03-17<br>#devel #qmidiplayer #opengl</div>
+ <hr><div id="article" class="TText">
+<article>
+<p>
+Well, I have to admit that creating a new blog post but not writing the
+actual content until more than a month later is <b>bullshit</b>. I've
+almost forgotten what I was thinking about when I created the post...
+</p>
+<p>
+But as you can tell from my recent activity, development of QMidiPlayer
+seemed to be stalled. No new features has been added since the rewrite
+of the MIDI mapper. However the rewrite is actually for the next planned
+major feature: an OPL3 emulator plugin and probably a VST host plugin.
+I spent one third of my winter break on reading the specs of the YMF262
+chip but made no real progress, which is a real shame.
+</p>
+<p>
+As for SMELT, I ported it to OpenGL 3.3+ but this is definitely not in
+my original schedule. The initial port has a whole bunch of bugs and
+quirks, also its performance was poor. Most of these were fixed later on
+with the help of <a href="https://github.com/apitrace/apitrace">apitrace</a>.
+However currently the new port still makes way more OpenGL calls than
+expected.
+</p>
+<p>
+Planned features for SMELT include vertex array switching, material,
+lighting and custom shaders. Adding these features will likely make the
+older version deprecated though. Plus there's no strong demand for these
+features. Therefore they may not be added any time soon.
+</p>
+<p>
+The Virtools part is an entirely accident. 2jjy and I suddenly got excited
+with the Virtools SDK and decided to find out what can it achieve. Before
+long 2jjy managed to analyze the internal structure of a Virtools
+<i>behavior</i>. These data determines how the behavior graph is presented
+in the schemetic interface. Checking 'hide script representation in
+schemetic' while saving simply discards these data, effectively obfuscating
+the script. The final tool we made public reconstructs the base of this
+structure using the logic of the script and tries to arrange behavior
+building blocks in a more human-readable way. It definitely helps future
+analysis of our old pal (Ballance), but not so much in my opinion. Porting
+the custom DLLs used by Ballance to a "newer" Virtools verion might be way
+more important.
+</p>
+<p>
+The tool has been
+<a href="https://github.com/BearKidsTeam/VirtoolsScriptDeobfuscation">made public</a>.
+As the job it does falls into a "grey zone", we don't know whether it is
+legally acceptable to use it. Use at your own risk!
+</p>
+</article>
+<!--
+vim:syntax=html
+-->
+</div><br><hr>
+ <div class="TText" id="notediv" style="font-size:80%;"></div>
+ <div id="insanch" style="height:3em;"></div>
+ <div id="footer" style="">
+ <div id="pagesw" class="TText" style="width:100%;height:0.5em;"></div>
+ <div style="text-align:center;" class="TText">
+ Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5
+ <br>
+ Content licensed under CC BY-SA 4.0. <span id="purgep" style="display:none;font-size:70%;">This page has passphrase(s) stored. Click <a href="javascript:_purgep()">here</a> to purge.</span>
+ </div>
+ </div>
+ <div id="cmdbuf" class="TText" style="transition:500ms;padding:1em;font-size:2em;color:white;position:absolute;background-color:rgba(0,0,0,0.6);left:50%;top:50%;transform:translate(-50%,-50%);pointer-events:none;opacity:0;">
+ </div>
+ </div>
+ <div id="decryptui" style="display:none;opacity:0;color:white;z-index:1000;position:fixed;left:0;top:0;width:100%;height:100%;background-color:rgba(0,0,0,0.4);transition:opacity 0.5s;">
+ <div id="decryptdlg" class="TText" style="padding:10px 20px;position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);background-color:rgba(0,0,0,0.6);">
+ <div id="keyhint" style="margin-bottom:8px;"></div>
+ <div style="margin-bottom:8px;">Key: <input id="keyinp" type="text" style="color:#fff;"></div>
+ <div style="height:2.25em;">
+ <button id="btndecrypt" onclick="decryptor(decid,document.getElementById('keyinp').value);" style="position:absolute;left:20px;">Decrypt</button>
+ <button onclick="hidedecryptui();" style="position:absolute;right:20px;">Cancel</button>
+ </div>
+
+ </div>
+
+
+</div></body></html> \ No newline at end of file
diff --git a/blog/post/2018-04-17.html b/blog/post/2018-04-17.html
new file mode 100644
index 0000000..59b99f0
--- /dev/null
+++ b/blog/post/2018-04-17.html
@@ -0,0 +1,214 @@
+<html><head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<meta name="theme-color" content="#000000">
+<title>Chrisoft::Blog</title>
+<script type="text/javascript" src="/panel.js"></script>
+<script type="text/javascript" src="/blog/footnoter.js"></script>
+<script type="text/javascript" src="/blog/aes-js.js"></script>
+<script type="text/javascript" src="/blog/scrypt.js"></script>
+<script type="text/javascript" src="/blog/sha256.js"></script>
+<script type="text/javascript" src="/blog/decryptor.js"></script>
+<link rel="stylesheet" type="text/css" href="/common.css">
+<link rel="stylesheet" type="text/css" href="/panel.css">
+<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
+<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
+<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
+<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
+<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
+<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
+<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
+<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
+<link rel="stylesheet" type="text/css" href="/blog/blogext.css">
+<script>
+function ol()
+{
+ window.onresize=function()
+ {
+ if(window.innerWidth<768)
+ setupevents();
+ else unsetevents();
+ }
+ window.onresize();
+ _decryptonload();
+}
+function loadTheme(){
+ var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
+ if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
+ var ent="";
+ var d=new Date();
+ if(thm[0]=='z')
+ {
+ var m=d.getMonth()+1;
+ if(m>=3&&m<6)thm='0'+thm[1];
+ else if(m>=6&&m<9)thm='1'+thm[1];
+ else if(m>=9&&m<12)thm='2'+thm[1];
+ else thm='3'+thm[1];
+ }
+ if(thm[1]=='z')
+ {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
+ ent=`theme${thm}`;
+ var R=new RegExp('theme[0-4][ab]');
+ for(var i=0;i<document.styleSheets.length;++i)
+ {
+ if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
+ document.styleSheets[i].disabled=true;
+ else document.styleSheets[i].disabled=false;
+ }
+ var thmcolor="";
+ switch(thm[0])
+ {
+ case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break;
+ case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break;
+ case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break;
+ case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break;
+ }
+ document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor);
+}
+loadTheme();
+</script>
+</head>
+<body onload="ol()" style="overflow-x:hidden;">
+ <div id="panel" class="TText">
+ <ul id="panellist">
+ <li><a href="/"><h1>Chrisoft</h1></a></li>
+ <li><a href="/blog"><h2>Blog</h2></a></li>
+ <li><a href="#"><h3 id="title">The "Deepin is spyware" problem</h3></a></li>
+ <li><span>Tags</span>
+ <ul id="tagslist">
+ <li><a href="/blog/list/linux/">linux</a></li><li><a href="/blog/list/garbage/">garbage</a></li><li><a href="/blog/list/sophistry/">sophistry</a></li></ul>
+ </li>
+ <li id="tocouter" style="display: none;">
+ <span>Table of Contents</span>
+ <ul id="tocroot">
+ </ul>
+ </li>
+ <li style="margin-left:-0.5em"><a id="prevp" href="2018-03-17.html">Prev post</a></li>
+ <li style="margin-left:-0.5em"><a id="nextp" href="2018-04-22.html">Next post</a></li>
+ </ul>
+ </div>
+ <div id="content">
+ <h2 id="titleh" class="TText" style="font-wight:normal;">The "Deepin is spyware" problem</h2>
+ <div id="datetags" class="TText" style="margin-bottom:1em;">2018-04-17<br>#linux #garbage #sophistry</div>
+ <hr><div id="article" class="TText">
+<article>
+<p>
+WARNING: this article contains strong words. Beware.
+</p>
+<p>
+Nowadays we can get in touch with people thousands of miles away really
+easily, which is not even imaginable just a few decades ago. Thanks to
+that, I visit reddit regularly and found some dispute about the only
+"sane" Chinese Linux distro arouse:
+</p>
+<blockquote>
+<a href="https://www.youtube.com/watch?v=v25Dy66AtNI">
+https://www.youtube.com/watch?v=v25Dy66AtNI
+</a><br>
+<a href="https://www.youtube.com/watch?v=tllqWzO8Bqw">
+https://www.youtube.com/watch?v=tllqWzO8Bqw
+</a>
+</blockquote>
+<p>
+Although I've never actually used Deepin as my daily driver, nor am I
+affiliated with the company that develops it, seeing Chinese being
+discredited in these posts made me want to say something for Deepin.
+However I found that I had literally nothing to say.
+</p>
+<p>
+Dispite of the clickbait nature of the video's title, deploying tracking
+code without notifying the user is blaspheming the user's trust in the
+software. However what really triggered me is their offical statement:
+</p>
+<blockquote>
+<p>
+Recently, there is saying that Linux Deepin is spyware. The logic is that Deepin has cnzz.com links in its website and Appstore, and since cnzz will collect some client information in the browser, thus Linux Deepin is spyware. It is really a serious problem, since nobody wants to have his/her private information leaked, as in the Facebook event.
+</p>
+<p>
+Deepin has to inform all those interested that our Appstore backend is a website and cnzz is a famous internet statistics analysis service provider that collects website anonymous usage information such as browser user agents, resolution, etc. and which is just a same product as Google Analytics. Deepin uses cnzz to collect website access information and so to know how to improve our website experience and detect website problems. No private information can be collected this way just by the data above mentioned.
+</p>
+<p>
+We hope this clarifies the spyware thing above and make the promise again that Deepin has not collected user private information in the past and will not collect user private information in the future.
+</p>
+
+Enjoy Linux Deepin~
+</blockquote>
+<p>
+This is utter nonsense. And it's even worse than nothing. It is same as
+saying "you dumbass chose to trust us and this is what you deserve."
+</p>
+<p>
+Also someone on reddit pointed out that Deepin comes with Google Chrome
+preinstalled and they distribute it from their own servers (almost
+certainly without Google's permission), which is explictly prohibited
+in the EULA of Google Chrome. What they could thinking should be like
+"fuck those legal stuff. Google won't give us a shit and let's provide
+maximum convience to our users!".
+</p>
+<p>
+So you might be wondering why I still refer it as "the only sane Chinese
+distro". Well, you might agree if you know something about other Chinese
+distros such as Start OS and Kylin OS. The latter is essentially the
+Chinese version of the Red Star OS. It has a very Windows 7-ish look
+and feel, which can be described as photocopying.
+</p>
+<p>
+Start OS (formerly known as ylmf OS) has a similiar history as Linux
+Deepin: they both emerged from organizations that produced pirated
+Windows XP using Ghost from Symentec. They started their own OS after
+the largest organization doing pirated Windows copies was taken down by the
+government. Start OS has been inactive for quite some time though.
+</p>
+<p>
+Deepin, however, really made some progress. At least they are developing
+decent software, not applying a Windows XP theme on Ubuntu and rebrand it.
+I actually used components from Deepin on my Debian machine for over a
+year (until KDE finally revamped their counterparts). Deepin managed to get
+a stable and fairly large user base. Then they seemed start doing what
+every single Chinese technology company have done: making software use the
+user. (In China, you don't use computer. The computer uses you! Seems
+familiar, right?)
+</p>
+<blockquote>
+Even though I am Chinese, I found some Chinese companies being over
+ambitious disturbing. And some of them don't really comply with the rules.
+(GPL violations of Allwinner and Xiaomi are infamous examples.)
+</blockquote>
+<p>
+Above is an excerpt from my unposted reply to the reddit post. The Chinese
+government seems acquiescent with that, for its own purposes. Shame on that.
+</p>
+<p>
+But trustworthy Chinese still exist, right?
+</p>
+</article>
+<!--
+vim:syntax=html
+-->
+</div><br><hr>
+ <div class="TText" id="notediv" style="font-size:80%;"></div>
+ <div id="insanch" style="height:3em;"></div>
+ <div id="footer" style="">
+ <div id="pagesw" class="TText" style="width:100%;height:0.5em;"></div>
+ <div style="text-align:center;" class="TText">
+ Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5
+ <br>
+ Content licensed under CC BY-SA 4.0. <span id="purgep" style="display:none;font-size:70%;">This page has passphrase(s) stored. Click <a href="javascript:_purgep()">here</a> to purge.</span>
+ </div>
+ </div>
+ <div id="cmdbuf" class="TText" style="transition:500ms;padding:1em;font-size:2em;color:white;position:absolute;background-color:rgba(0,0,0,0.6);left:50%;top:50%;transform:translate(-50%,-50%);pointer-events:none;opacity:0;">
+ </div>
+ </div>
+ <div id="decryptui" style="display:none;opacity:0;color:white;z-index:1000;position:fixed;left:0;top:0;width:100%;height:100%;background-color:rgba(0,0,0,0.4);transition:opacity 0.5s;">
+ <div id="decryptdlg" class="TText" style="padding:10px 20px;position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);background-color:rgba(0,0,0,0.6);">
+ <div id="keyhint" style="margin-bottom:8px;"></div>
+ <div style="margin-bottom:8px;">Key: <input id="keyinp" type="text" style="color:#fff;"></div>
+ <div style="height:2.25em;">
+ <button id="btndecrypt" onclick="decryptor(decid,document.getElementById('keyinp').value);" style="position:absolute;left:20px;">Decrypt</button>
+ <button onclick="hidedecryptui();" style="position:absolute;right:20px;">Cancel</button>
+ </div>
+
+ </div>
+
+
+</div></body></html> \ No newline at end of file
diff --git a/blog/post/2018-04-22.html b/blog/post/2018-04-22.html
new file mode 100644
index 0000000..7311f13
--- /dev/null
+++ b/blog/post/2018-04-22.html
@@ -0,0 +1,188 @@
+<html><head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<meta name="theme-color" content="#000000">
+<title>Chrisoft::Blog</title>
+<script type="text/javascript" src="/panel.js"></script>
+<script type="text/javascript" src="/blog/footnoter.js"></script>
+<script type="text/javascript" src="/blog/aes-js.js"></script>
+<script type="text/javascript" src="/blog/scrypt.js"></script>
+<script type="text/javascript" src="/blog/sha256.js"></script>
+<script type="text/javascript" src="/blog/decryptor.js"></script>
+<link rel="stylesheet" type="text/css" href="/common.css">
+<link rel="stylesheet" type="text/css" href="/panel.css">
+<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
+<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
+<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
+<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
+<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
+<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
+<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
+<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
+<link rel="stylesheet" type="text/css" href="/blog/blogext.css">
+<script>
+function ol()
+{
+ window.onresize=function()
+ {
+ if(window.innerWidth<768)
+ setupevents();
+ else unsetevents();
+ }
+ window.onresize();
+ _decryptonload();
+}
+function loadTheme(){
+ var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
+ if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
+ var ent="";
+ var d=new Date();
+ if(thm[0]=='z')
+ {
+ var m=d.getMonth()+1;
+ if(m>=3&&m<6)thm='0'+thm[1];
+ else if(m>=6&&m<9)thm='1'+thm[1];
+ else if(m>=9&&m<12)thm='2'+thm[1];
+ else thm='3'+thm[1];
+ }
+ if(thm[1]=='z')
+ {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
+ ent=`theme${thm}`;
+ var R=new RegExp('theme[0-4][ab]');
+ for(var i=0;i<document.styleSheets.length;++i)
+ {
+ if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
+ document.styleSheets[i].disabled=true;
+ else document.styleSheets[i].disabled=false;
+ }
+ var thmcolor="";
+ switch(thm[0])
+ {
+ case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break;
+ case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break;
+ case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break;
+ case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break;
+ }
+ document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor);
+}
+loadTheme();
+</script>
+</head>
+<body onload="ol()" style="overflow-x:hidden;">
+ <div id="panel" class="TText">
+ <ul id="panellist">
+ <li><a href="/"><h1>Chrisoft</h1></a></li>
+ <li><a href="/blog"><h2>Blog</h2></a></li>
+ <li><a href="#"><h3 id="title">ICPC类比赛中计算几何问题之「乱象」</h3></a></li>
+ <li><span>Tags</span>
+ <ul id="tagslist">
+ <li><a href="/blog/list/garbage/">garbage</a></li><li><a href="/blog/list/acmicpc/">acmicpc</a></li></ul>
+ </li>
+ <li id="tocouter" style="display: none;">
+ <span>Table of Contents</span>
+ <ul id="tocroot">
+ </ul>
+ </li>
+ <li style="margin-left:-0.5em"><a id="prevp" href="2018-04-17.html">Prev post</a></li>
+ <li style="margin-left:-0.5em"><a id="nextp" href="2018-05-03.html">Next post</a></li>
+ </ul>
+ </div>
+ <div id="content">
+ <h2 id="titleh" class="TText" style="font-wight:normal;">ICPC类比赛中计算几何问题之「乱象」</h2>
+ <div id="datetags" class="TText" style="margin-bottom:1em;">2018-04-22<br>#garbage #acmicpc</div>
+ <hr><div id="article" class="TText">
+<style>
+frac{
+ text-indent:0;
+ display:inline-block;
+ font-size:50%;
+ text-align:center;
+ position:relative;
+ top:4px;
+}
+frac>sup{
+ display:block;
+ border-bottom:1px solid;
+ font:inherit;
+}
+frac>sub{
+ display:block;
+ font:inherit;
+}
+</style>
+<article>
+<p>
+虽然我还从未在博客里面写过一篇仅与ACM/ICPC相关的文章,但是今天情况发生了改变……
+</p>
+<p>
+今天打某神奇的「2018 ACM-ICPC 中国大学生程序设计竞赛暨丝绸之路程序设计竞赛」时,
+遇到如下一题:
+</p>
+<blockquote>
+在三维空间内给出一个平面和N个点,在给定平面内移动的速度为v<sub>2</sub>,在其余位置移动速度为v<sub>1</sub>,
+求按一定顺序走遍N个点并回到起点的最短所需时间。
+</blockquote>
+<p>
+当然原题面大约是六级不到500的人写的,所以猜题意用了不少时间。但是摸清题意之后,
+不就是计算几何套裸的TSP吗……于是让队友先写好TSP模板然后我去推计算几何的部分了。
+</p>
+<p>
+一开始非常智障地以为直接把点在平面上的投影点当落脚点就可以了,然而发现WA样例……
+(虽然已经猜到了结果)于是假设每一端分别少走一段距离,如下图:
+</p>
+<div style="text-align:center;">
+<img src="//filestorage.chrisoft.org/blog/img/180422-geomp.svg" alt="" width="80%" decoding="async">
+</div>
+<p>
+此情形下每侧用时的变化量
+Δt=<frac><sup>p</sup><sub>cosα×v<sub>1</sub></sub></frac>-<frac><sup>p×tanα</sup><sub>v<sub>2</sub></sub></frac>。
+Δt'=p<frac><sup>sinα×v<sub>2</sub>-sin<sup>2</sup>α×v<sub>1</sub>-cos<sup>2</sup>α×v<sub>1</sub></sup><sub>cos<sup>2</sup>α×v<sub>1</sub>×v<sub>2</sub></sub></frac>
+=p<frac><sup>sinα×v<sub>2</sub>-v<sub>1</sub></sup><sub>cos<sup>2</sup>α×v<sub>1</sub>×v<sub>2</sub></sub></frac>
+所以极值在sinα=<frac><sup>v<sub>1</sub></sup><sub>v<sub>2</sub></sub></frac>时取得。<s>管它是什么极大值还是极小值反正</s>就用它好了。
+</p>
+<p>
+然后因为懒得找模板于是手推了许久点在平面上的投影公式。打完之后发现……TLE!
+然后发现队友写了递归的TSP……重写了非递归TSP之后秒过。<s>顺便还抢到了一血。</s>
+如果一定要看我的辣鸡代码的话,<a href="//filestorage.chrisoft.org/blog/data/180422a.cpp">在这里</a>。
+</p>
+<p>
+于是你就见识到了这道强行结合TSP的计算几何的奇葩题目。
+<a id="n1" href="#note1" class="note">[1]</a>
+17年北京区域赛时也有一个判断线段是否与三角形内部有交集×bfs的题目也是神坑。
+</p>
+<p>
+不过高级别的比赛中的计算几何题目质量还是十分有保证的。像今年WF G题(疑似)用的Voronoi Diagram
+<a id="n2" href="#note2" class="note">[2]</a>以及去年WF的A题。当然今年WF E题这种混合物理的题,
+在官方发布数据之前我大概是过不了样例以外的任何测试点的(<a id="n3" href="#note3" class="note">[3]</a>
+</p>
+</article>
+<!--
+vim:syntax=html
+-->
+</div><br><hr>
+ <div class="TText" id="notediv" style="font-size:80%;"><span class="TText"><a id="note1" href="#n1">[1]</a>: 其实这套题目总体质量并不高……<br></span><span class="TText"><a id="note2" href="#n2">[2]</a>: 「疑似」是因为我还没写<br></span><span class="TText"><a id="note3" href="#n3">[3]</a>: 现在数据发布了,搞到数据立即发现起点坐标读反了以及多写了一对fabs。<s>面向数据编程真好</s>。<br></span></div>
+ <div id="insanch" style="height:3em;"></div>
+ <div id="footer" style="">
+ <div id="pagesw" class="TText" style="width:100%;height:0.5em;"></div>
+ <div style="text-align:center;" class="TText">
+ Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5
+ <br>
+ Content licensed under CC BY-SA 4.0. <span id="purgep" style="display:none;font-size:70%;">This page has passphrase(s) stored. Click <a href="javascript:_purgep()">here</a> to purge.</span>
+ </div>
+ </div>
+ <div id="cmdbuf" class="TText" style="transition:500ms;padding:1em;font-size:2em;color:white;position:absolute;background-color:rgba(0,0,0,0.6);left:50%;top:50%;transform:translate(-50%,-50%);pointer-events:none;opacity:0;">
+ </div>
+ </div>
+ <div id="decryptui" style="display:none;opacity:0;color:white;z-index:1000;position:fixed;left:0;top:0;width:100%;height:100%;background-color:rgba(0,0,0,0.4);transition:opacity 0.5s;">
+ <div id="decryptdlg" class="TText" style="padding:10px 20px;position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);background-color:rgba(0,0,0,0.6);">
+ <div id="keyhint" style="margin-bottom:8px;"></div>
+ <div style="margin-bottom:8px;">Key: <input id="keyinp" type="text" style="color:#fff;"></div>
+ <div style="height:2.25em;">
+ <button id="btndecrypt" onclick="decryptor(decid,document.getElementById('keyinp').value);" style="position:absolute;left:20px;">Decrypt</button>
+ <button onclick="hidedecryptui();" style="position:absolute;right:20px;">Cancel</button>
+ </div>
+
+ </div>
+
+
+</div></body></html> \ No newline at end of file
diff --git a/blog/post/2018-05-03.html b/blog/post/2018-05-03.html
new file mode 100644
index 0000000..1cc52bd
--- /dev/null
+++ b/blog/post/2018-05-03.html
@@ -0,0 +1,184 @@
+<html><head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<meta name="theme-color" content="#000000">
+<title>Chrisoft::Blog</title>
+<script type="text/javascript" src="/panel.js"></script>
+<script type="text/javascript" src="/blog/footnoter.js"></script>
+<script type="text/javascript" src="/blog/aes-js.js"></script>
+<script type="text/javascript" src="/blog/scrypt.js"></script>
+<script type="text/javascript" src="/blog/sha256.js"></script>
+<script type="text/javascript" src="/blog/decryptor.js"></script>
+<link rel="stylesheet" type="text/css" href="/common.css">
+<link rel="stylesheet" type="text/css" href="/panel.css">
+<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
+<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
+<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
+<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
+<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
+<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
+<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
+<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
+<link rel="stylesheet" type="text/css" href="/blog/blogext.css">
+<script>
+function ol()
+{
+ window.onresize=function()
+ {
+ if(window.innerWidth<768)
+ setupevents();
+ else unsetevents();
+ }
+ window.onresize();
+ _decryptonload();
+}
+function loadTheme(){
+ var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
+ if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
+ var ent="";
+ var d=new Date();
+ if(thm[0]=='z')
+ {
+ var m=d.getMonth()+1;
+ if(m>=3&&m<6)thm='0'+thm[1];
+ else if(m>=6&&m<9)thm='1'+thm[1];
+ else if(m>=9&&m<12)thm='2'+thm[1];
+ else thm='3'+thm[1];
+ }
+ if(thm[1]=='z')
+ {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
+ ent=`theme${thm}`;
+ var R=new RegExp('theme[0-4][ab]');
+ for(var i=0;i<document.styleSheets.length;++i)
+ {
+ if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
+ document.styleSheets[i].disabled=true;
+ else document.styleSheets[i].disabled=false;
+ }
+ var thmcolor="";
+ switch(thm[0])
+ {
+ case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break;
+ case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break;
+ case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break;
+ case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break;
+ }
+ document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor);
+}
+loadTheme();
+</script>
+</head>
+<body onload="ol()" style="overflow-x:hidden;">
+ <div id="panel" class="TText">
+ <ul id="panellist">
+ <li><a href="/"><h1>Chrisoft</h1></a></li>
+ <li><a href="/blog"><h2>Blog</h2></a></li>
+ <li><a href="#"><h3 id="title">Are you an Apple fanboy/fangirl?</h3></a></li>
+ <li><span>Tags</span>
+ <ul id="tagslist">
+ <li><a href="/blog/list/garbage/">garbage</a></li><li><a href="/blog/list/interactive/">interactive</a></li></ul>
+ </li>
+ <li id="tocouter" style="display: none;">
+ <span>Table of Contents</span>
+ <ul id="tocroot">
+ </ul>
+ </li>
+ <li style="margin-left:-0.5em"><a id="prevp" href="2018-04-22.html">Prev post</a></li>
+ <li style="margin-left:-0.5em"><a id="nextp" href="2018-05-08.html">Next post</a></li>
+ </ul>
+ </div>
+ <div id="content">
+ <h2 id="titleh" class="TText" style="font-wight:normal;">Are you an Apple fanboy/fangirl?</h2>
+ <div id="datetags" class="TText" style="margin-bottom:1em;">2018-05-03<br>#garbage #interactive</div>
+ <hr><div id="article" class="TText">
+<style>
+input[type=radio],input[type=checkbox]{
+ -webkit-appearance:none;
+ -moz-appearance:none;
+ appearance:none;
+ border-radius:10%;
+ width:16px;
+ height:16px;
+ border:1px solid #999;
+ transition:0.2s all linear;
+ outline:none;
+ margin-right:5px;
+ position:relative;
+ top:4px;
+}
+input[type=radio]{
+ border-radius:50%;
+}
+.check:after{
+ color:#999;
+ content:"×";
+ position:absolute;
+ left:50%;
+ top:50%;
+ transform:translate(-50%,-50%);
+ display:none;
+}
+input[type=radio]:checked{
+ border:4px solid #999;
+}
+input[type=checkbox]:checked.check:after{
+ display:block;
+}
+</style>
+<article>
+<p>
+<b>DISCLAIMER:</b> This poll does not send any of your response to the server.
+It is a simple webapp working in your browser. Enjoy.
+</p>
+<script src="/blog/data/poll.js"></script>
+<blockquote>
+<table>
+<tbody><tr>
+<td colspan="2">
+ <div id="page">
+ <div id="qcaption"></div>
+ <form id="qchoices">
+ </form>
+ </div>
+</td>
+</tr>
+<tr>
+<td>
+Score:<span id="score"></span>
+</td>
+<td style="text-align:right;">
+<button onclick="evalq()" id="nextbtn">Next</button>
+</td>
+</tr></tbody></table>
+</blockquote>
+</article>
+<!--
+vim:syntax=html
+-->
+</div><br><hr>
+ <div class="TText" id="notediv" style="font-size:80%;"></div>
+ <div id="insanch" style="height:3em;"></div>
+ <div id="footer" style="">
+ <div id="pagesw" class="TText" style="width:100%;height:0.5em;"></div>
+ <div style="text-align:center;" class="TText">
+ Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5
+ <br>
+ Content licensed under CC BY-SA 4.0. <span id="purgep" style="display:none;font-size:70%;">This page has passphrase(s) stored. Click <a href="javascript:_purgep()">here</a> to purge.</span>
+ </div>
+ </div>
+ <div id="cmdbuf" class="TText" style="transition:500ms;padding:1em;font-size:2em;color:white;position:absolute;background-color:rgba(0,0,0,0.6);left:50%;top:50%;transform:translate(-50%,-50%);pointer-events:none;opacity:0;">
+ </div>
+ </div>
+ <div id="decryptui" style="display:none;opacity:0;color:white;z-index:1000;position:fixed;left:0;top:0;width:100%;height:100%;background-color:rgba(0,0,0,0.4);transition:opacity 0.5s;">
+ <div id="decryptdlg" class="TText" style="padding:10px 20px;position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);background-color:rgba(0,0,0,0.6);">
+ <div id="keyhint" style="margin-bottom:8px;"></div>
+ <div style="margin-bottom:8px;">Key: <input id="keyinp" type="text" style="color:#fff;"></div>
+ <div style="height:2.25em;">
+ <button id="btndecrypt" onclick="decryptor(decid,document.getElementById('keyinp').value);" style="position:absolute;left:20px;">Decrypt</button>
+ <button onclick="hidedecryptui();" style="position:absolute;right:20px;">Cancel</button>
+ </div>
+
+ </div>
+
+
+</div></body></html> \ No newline at end of file
diff --git a/blog/post/2018-05-08.html b/blog/post/2018-05-08.html
new file mode 100644
index 0000000..4773f86
--- /dev/null
+++ b/blog/post/2018-05-08.html
@@ -0,0 +1,331 @@
+<html><head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<meta name="theme-color" content="#000000">
+<title>Chrisoft::Blog</title>
+<script type="text/javascript" src="/panel.js"></script>
+<script type="text/javascript" src="/blog/footnoter.js"></script>
+<script type="text/javascript" src="/blog/aes-js.js"></script>
+<script type="text/javascript" src="/blog/scrypt.js"></script>
+<script type="text/javascript" src="/blog/sha256.js"></script>
+<script type="text/javascript" src="/blog/decryptor.js"></script>
+<link rel="stylesheet" type="text/css" href="/common.css">
+<link rel="stylesheet" type="text/css" href="/panel.css">
+<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
+<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
+<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
+<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
+<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
+<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
+<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
+<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
+<link rel="stylesheet" type="text/css" href="/blog/blogext.css">
+<script>
+function ol()
+{
+ window.onresize=function()
+ {
+ if(window.innerWidth<768)
+ setupevents();
+ else unsetevents();
+ }
+ window.onresize();
+ _decryptonload();
+}
+function loadTheme(){
+ var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
+ if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
+ var ent="";
+ var d=new Date();
+ if(thm[0]=='z')
+ {
+ var m=d.getMonth()+1;
+ if(m>=3&&m<6)thm='0'+thm[1];
+ else if(m>=6&&m<9)thm='1'+thm[1];
+ else if(m>=9&&m<12)thm='2'+thm[1];
+ else thm='3'+thm[1];
+ }
+ if(thm[1]=='z')
+ {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
+ ent=`theme${thm}`;
+ var R=new RegExp('theme[0-4][ab]');
+ for(var i=0;i<document.styleSheets.length;++i)
+ {
+ if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
+ document.styleSheets[i].disabled=true;
+ else document.styleSheets[i].disabled=false;
+ }
+ var thmcolor="";
+ switch(thm[0])
+ {
+ case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break;
+ case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break;
+ case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break;
+ case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break;
+ }
+ document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor);
+}
+loadTheme();
+</script>
+</head>
+<body onload="ol()" style="overflow-x:hidden;">
+ <div id="panel" class="TText">
+ <ul id="panellist">
+ <li><a href="/"><h1>Chrisoft</h1></a></li>
+ <li><a href="/blog"><h2>Blog</h2></a></li>
+ <li><a href="#"><h3 id="title">Respecting your job</h3></a></li>
+ <li><span>Tags</span>
+ <ul id="tagslist">
+ <li><a href="/blog/list/sophistry/">sophistry</a></li><li><a href="/blog/list/garbage/">garbage</a></li><li><a href="/blog/list/acmicpc/">acmicpc</a></li></ul>
+ </li>
+ <li id="tocouter">
+ <span>Table of Contents</span>
+ <ul id="tocroot">
+ <li><a class="toctarg" href="#tocanch0">尊重别人的委托 - 关于题目</a></li><li><a class="toctarg" href="#tocanch1">正直者之死 - 关于F题</a></li><li><a class="toctarg" href="#tocanch2">做最坏的打算 - 关于F题和其他</a></li><li><a class="toctarg" href="#tocanch3">一向阴暗的未来</a></li><li><a class="toctarg" href="#tocanch4">Fun facts &amp;c.</a></li></ul>
+ </li>
+ <li style="margin-left:-0.5em"><a id="prevp" href="2018-05-03.html">Prev post</a></li>
+ <li style="margin-left:-0.5em"><a id="nextp" href="2018-05-18.html">Next post</a></li>
+ </ul>
+ </div>
+ <div id="content">
+ <h2 id="titleh" class="TText" style="font-wight:normal;">Respecting your job</h2>
+ <div id="datetags" class="TText" style="margin-bottom:1em;">2018-05-08<br>#sophistry #garbage #acmicpc</div>
+ <hr><div id="article" class="TText">
+<article>
+<p>
+……所以为什么省赛总结起了一个这种奇怪的标题……
+</p>
+<h2 id="tocanch0" class="tvis">尊重别人的委托 - 关于题目</h2>
+<blockquote>
+<p>
+除非完全失去了对生活的希望,
+不然别人委托的工作还是至少应该抱着敬意来完成的。
+</p>
+</blockquote>
+<p>
+先不论题目质量(10题中有3题可以网络流乱搞过去),题目中明显的失误就有不少。
+虽然这并不在是说北邮的出题人不尊重他们的工作。
+(其实可以看出他们已经努力了,Nice try.)
+</p>
+<div style="text-align:center;"><img src="//filestorage.chrisoft.org/blog/img/sdacm18xa.png" width="50%" decoding="async"><br><i>正式赛B题</i></div>
+<p>
+输出呢?经验是什么?数据范围呢???这种随便过一遍就能审阅出的明显问题,
+出现在省级比赛上,真的不会让人看不起吗?
+裁判组在比赛开始一刻钟有队伍提出质疑之后才(陆续)发现了此题中的各种问题。
+即使是印刷了错误版本的题目,依然不能原谅吧?
+</p>
+<div style="text-align:center;"><img src="//filestorage.chrisoft.org/blog/img/sdacm18xd.png" width="50%" decoding="async"><br><i>Real Contest.</i></div>
+<p>
+Real contest? Faux contest?
+</p>
+<div style="text-align:center;"><img src="//filestorage.chrisoft.org/blog/img/sdacm18xb.png" width="50%" decoding="async"><br><i>用Gill Sans作正文字体?</i></div>
+<p>
+即使用伦敦地铁用的字体也无法改变你英语差的事实。另外,
+1Il只有用游标卡尺才能量出区别的字体用在科技类文本里大概不太好吧?
+</p>
+<div style="text-align:center;"><img src="//filestorage.chrisoft.org/blog/img/sdacm18xc.png" width="50%" decoding="async"><br><i>最好的防AK方式当然是题意杀啦</i></div>
+<p>
+最后是一道没有人能读懂的题。敝校公认英语最强的两位队员没有一个看懂的。
+感兴趣的读者可以挑战一下。<b>要能够解释样例才行喔</b>。
+</p>
+<h2 id="tocanch1" class="tvis">正直者之死 - 关于F题</h2>
+<p>
+于是上面写了那么多,到这里却才是本次省赛真正的亮点。
+下面我就以此题最大受害者
+<a id="n1" href="#note1" class="note">[1]</a>
+的身份来讲述一下F题的故事……
+</p>
+<p>
+首先来看一下题目(图片比较乱…):
+</p>
+<div style="text-align:center;"><img src="//filestorage.chrisoft.org/blog/img/sdacm18xe.png" width="50%" decoding="async"><br><i>F题题面</i></div>
+<p>
+实际上F题是容斥里面比较常规甚至可以说是相当简单的,
+题目本身也可以说是中规中矩。思路其实很明显:设条件
+x<sub>1</sub>≠x<sub>2</sub>
+x<sub>2</sub>≠x<sub>3</sub>
+x<sub>3</sub>≠x<sub>4</sub>
+x<sub>4</sub>≠x<sub>1</sub>
+分别为A, B, C, D,同时也用A, B, C, D表示符合相应条件的集合。
+全集为仅需满足范围限制的四元组构成的集合。
+容易发现答案并不好通过A, B, C, D的集合大小求得。
+正难则反。∁A, ∁B, ∁C, ∁D及它们的交的大小更容易求得,而且
+∁(∁A∪∁B∪∁C∪∁D)恰好为所求的集合。多么基本的容斥……
+</p>
+<p>
+然而事情从这里开始变得诡异了起来。作为一道容斥,
+自然有把代码写成一坨屎的可能性。我的代码很不幸就写成了一坨。
+写到75%的时候觉得头大,于是直接砍掉重练。这次相对来说比较顺利,
+样例也是一发就通过了。然而,
+以往根本不负责数学题的我<a id="n2" href="#note2" class="note">[2]</a>
+对自己写的容斥持怀疑态度,决定写个暴力对拍一下。这下好。
+最水(没样例水)的数据就把我的程序卡掉了。于是就开始挂机找问题。
+这时比赛已经进行到了80分钟,我们队还没有瞟过一眼榜。于是找出榜一看,
+F题已经被过穿了。与此同时我还注意到这题的一血是开场<b>6分钟</b>
+的时候被我校一支相对较弱的挂星队拿到的。这下更好了。
+虽然是基本的容斥,但是按山东选手的水平,也不能6分钟写完吧?
+于是就开始想自己是不是想复杂了,然后就开始试图换思路,
+就有了题面附近大量乱七八糟的草稿以及下面这张图……
+</p>
+<div style="text-align:center;"><img src="//filestorage.chrisoft.org/blog/img/sdacm18xf.png" width="50%" decoding="async"><br><i>wtf???</i></div>
+<p>
+后来甚至想到了把整个区间分8段然后乘法原理强上的思路……
+然而因为依然难写所以也被否决了。此时的我,大概已是意识模糊,不省人事,
+以至于当队友跟我说「还是继续容斥吧」之后,
+我甚至无法用容斥手算出正确的结果了。。。
+最后我就直接宣告死在了这道题上。另外一个队友最后30分钟试图用乘法原理强搞,
+不过到比赛结束也没有搞出来。
+<a id="n3" href="#note3" class="note">[3]</a>
+</p>
+<p>
+当然如果事情就这么结束了的话,也不足以让这题成为本次比赛最大的亮点。
+比赛结束后我问了一下那支6分钟过此题的队伍,得知他们
+<b>直接输出的四个区间长度的积</b>。当时我就立刻晕了:
+莫非是花了四个小时在完全不同的一道题上?不过这题这么短应该不会读错吧?
+于是我试图询问他有没有对循环不等的条件有印象,他表示不知情。我……
+不得不猜测出题人rand生成的数据,
+而且很不幸这10<sup>6</sup>组数据里面没有一组区间有重叠部分的。
+此时我的内心十分平静,甚至想对裁判组施展白帝圣剑:
+F题什么难度你们不知道吗?6分钟被人过了就不看眼他的代码吗?
+<a id="n4" href="#note4" class="note">[4]</a>
+</p>
+<p>
+当然如果这件事情只有这么简单,显然依然不足以让此题成为本次比赛最大的亮点。
+闭幕式之前在山财校园中闲逛时,听到了这样的对话:
+</p>
+<blockquote>
+——「有个队四层循环就过了。」<br>
+——「那有什么,我们队连样例都没过也过了。」
+</blockquote>
+<p>
+听到这段对话的我表面强装镇定,内心早已就地阵亡。
+10<sup>42</sup>的计算量都能过,难道这题T=0?
+</p>
+<p>
+后来通过官方渠道证实,这题在比赛过程中用于评测的数据是全空的。
+还导致了最终裁判组和主办方之间意见的不一致。裁判组最后拒绝签字,
+这其实是负责任的行为,
+但是裁判组也可以以此把锅甩给PC^2和主办方所谓的「技术支持组」了。
+首先,PC^2是一个浑身上下都是bug,设计上也存在一些问题的程序。
+我们在配置17年校赛的时候,就遇到过PC^2无法保存题目名称的bug。
+各种各样的连接问题也是数不胜数,Judge还会爆Java内存。但是即便如此,
+裁判组仍然对此负有不可推卸的责任:如果在6分钟时就发现了问题,
+完全有时间重新上传数据并进行重测,对比赛也不会造成太大影响。
+而事到如今,这个6分钟通过的队伍,
+让大量其他不应该如此快速「通过」此题的队伍「通过」了此题,
+同时也对我们这样完全没有专攻数学题目的队伍造成了不可估量的打击,
+最后还让各方闹翻。这样的疏忽……可以算是epic fail了。
+至于推锅给「技术支持组」,
+一个有多年出题经验的学校把锅丢给一个没几年ACM经验的学校,
+可以说是非常不公了。当然由于我并不清楚这其中的分工,
+所以并不好对此妄加评论。然而我认为主办学校的「技术支持组」,
+本来就不应该负责太多与比赛直接相关的事务。
+</p>
+<p>
+其实可以合理地预测,
+比赛过程中没有验算而且在120分钟内通过此题的队伍,能够通过rejudge的
+也许只是凤毛麟角。
+</p>
+<p>
+至于这题对我队的影响,远没有未过一题这么简单。
+已经理论掉的I题也因此驾鹤西去了。当然,经历了无数次「几乎成功」的失败之后,
+我本人对此早已麻木,也就写不出×乎上那种动情的文字,
+所有的心情只能汇集成一个「sigh」了。
+</p>
+<p>
+然而以后碰到这种情况估计还是会死的。<s>人家就是如此正直,你有什么办法。</s>
+不过讲道理总不能把自己成功的希望寄托在别人的失误上吧(
+</p>
+<h2 id="tocanch2" class="tvis">做最坏的打算 - 关于F题和其他</h2>
+<p>
+事已至此,任何的假设都成了虚拟语态。更应该考虑的显然是找一个合适的解决方案。
+在这个问题上,即使我是「F题最大的受害者」,我仍然是十分理解裁判组的,
+因为类似的事情在我们举办校赛的时候也遇到过。
+所以我也没有像某些参赛者一样去「围攻」裁判组(我甚至没有加群),
+因为我们都清楚被围攻的滋味并不好。从出题人在知乎上的表态看,
+他们也承受着巨大的压力。
+但是F题的问题实际上与出题人的关系不大——更多在于题目配置及比赛过程中的疏忽。
+<a id="n5" href="#note5" class="note">[5]</a>
+</p>
+<p>
+至于在如何处理的问题上,从自私的角度考虑,当然是删除F题对我们最有利:
+<s>因为这样我们队就变成第一了</s>。其实无论是rejudge,维持原判还是直接删除,
+对部分队伍来说都是不公平的。较为公平的解决方案,
+无非是订正数据并延长比赛时间,甚至重赛。
+但是无论是承办方还是从北京远道而来的裁判,谁能承受延时或者重赛的负担呢?
+<a id="n6" href="#note6" class="note">[6]</a>
+</p>
+<p>
+在组织程序设计竞赛的时候,
+负责比赛准备的各方往往对比赛过程中可能发生的各种事故不做太多预案,
+而是更多地依赖提前把问题减少到最少。然而人总是不可避免地犯错,
+PC^2也没有应对这种问题的功能(甚至全部重测的功能)。是时候让PC^2退休了。
+</p>
+<h2 id="tocanch3" class="tvis">一向阴暗的未来</h2>
+<p>
+与山东其他高校不同,山大的ACM实验室似乎即将成为各路教员追逐名利的工具。
+真正一心为了实验室发展的人,不是根本没有,就是完全被边缘化了。
+</p>
+<p>
+当然,在现在各方都没有任何实际行动的前提下,并没有办法得出什么实质性的结论。
+不过,未来悬而未决的感觉也不好啊(
+</p>
+<h2 id="tocanch4" class="tvis">Fun facts &amp;c.</h2>
+<ul>
+<li>苟狗写了全部AC代码。<s>难道我成功培养了新一代代码手</s></li>
+<li>最后半小时队友试图抢救F题时,已经空状态的我在一边理论I题……
+<div style="text-align:center;"><img src="//filestorage.chrisoft.org/blog/img/sdacm18xg.jpg" width="50%" decoding="async"><br><i>没用尺规</i></div>
+<br>
+……实在惭愧
+</li>
+<li>山财,作为一所刚刚开始搞ACM的学校,对这场比赛准备得可以说是很充分,
+也十分有诚意了。为了防止发生去年滚榜时的尴尬情形,
+他们甚至还提前排练了滚榜环节。
+虽然后来发生了各种不可预见的事故导致榜没有滚成,
+但是这不足以彻底抹杀他们为准备这场比赛付出的努力的。
+</li>
+<li>至于北邮,这所已经为山东省赛命题(至少)两年的学校,
+在命题这方面自然也可以说是十分有经验了。即使遇到了各种各样意料之外的事情,
+也不应该完全否定他们的工作——因为出题本身就不是一个容易活啊。
+</li>
+<li>14级学长的自嘲:「有了我们之后就再也没捧过杯」。
+<s>希望明年可以换种方式自嘲。</s></li>
+</ul>
+</article>
+<!--
+vim: syntax=html
+-->
+</div><br><hr>
+ <div class="TText" id="notediv" style="font-size:80%;"><span class="TText"><a id="note1" href="#n1">[1]</a>: 读完这部分之后你就可以知道为什么我可以给自己冠上「最大受害者」的称号了。<br></span><span class="TText"><a id="note2" href="#n2">[2]</a>: FYI,我们队的人员出现了调整,
+原来负责数学题的队友离开了<br></span><span class="TText"><a id="note3" href="#n3">[3]</a>: 尽管在302分钟时发现比赛还没有被关闭就随手交了一发,
+然而那个提交并没有被评测。<br></span><span class="TText"><a id="note4" href="#n4">[4]</a>: 就连在我们校赛的评测过程中,即使会去玩PC^2 Judge里的"I'm bored",
+每个题前几名AC的队伍的代码我们也是会看的。<br></span><span class="TText"><a id="note5" href="#n5">[5]</a>: 另,如果出题组和裁判组是完全不同的两队人,
+他们在比赛前应该有充分的沟通。而且出事之后出题人的道歉也无法代替后者。
+某种程度上我依然认为裁判组应当亲自有诚意、非匿名地正式道歉。<br></span><span class="TText"><a id="note6" href="#n6">[6]</a>: 今年我校校赛时有一位负责人在未与所有其他负责人商讨的情况下,
+因在最后30分钟发现数据出现问题擅自将比赛延长,
+导致实验室内部对此产生争议。<br></span></div>
+ <div id="insanch" style="height:3em;"></div>
+ <div id="footer" style="">
+ <div id="pagesw" class="TText" style="width:100%;height:0.5em;"></div>
+ <div style="text-align:center;" class="TText">
+ Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5
+ <br>
+ Content licensed under CC BY-SA 4.0. <span id="purgep" style="display:none;font-size:70%;">This page has passphrase(s) stored. Click <a href="javascript:_purgep()">here</a> to purge.</span>
+ </div>
+ </div>
+ <div id="cmdbuf" class="TText" style="transition:500ms;padding:1em;font-size:2em;color:white;position:absolute;background-color:rgba(0,0,0,0.6);left:50%;top:50%;transform:translate(-50%,-50%);pointer-events:none;opacity:0;">
+ </div>
+ </div>
+ <div id="decryptui" style="display:none;opacity:0;color:white;z-index:1000;position:fixed;left:0;top:0;width:100%;height:100%;background-color:rgba(0,0,0,0.4);transition:opacity 0.5s;">
+ <div id="decryptdlg" class="TText" style="padding:10px 20px;position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);background-color:rgba(0,0,0,0.6);">
+ <div id="keyhint" style="margin-bottom:8px;"></div>
+ <div style="margin-bottom:8px;">Key: <input id="keyinp" type="text" style="color:#fff;"></div>
+ <div style="height:2.25em;">
+ <button id="btndecrypt" onclick="decryptor(decid,document.getElementById('keyinp').value);" style="position:absolute;left:20px;">Decrypt</button>
+ <button onclick="hidedecryptui();" style="position:absolute;right:20px;">Cancel</button>
+ </div>
+
+ </div>
+
+
+</div></body></html> \ No newline at end of file
diff --git a/blog/post/2018-05-18.html b/blog/post/2018-05-18.html
new file mode 100644
index 0000000..191626f
--- /dev/null
+++ b/blog/post/2018-05-18.html
@@ -0,0 +1,337 @@
+<html><head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<meta name="theme-color" content="#000000">
+<title>Chrisoft::Blog</title>
+<script type="text/javascript" src="/panel.js"></script>
+<script type="text/javascript" src="/blog/footnoter.js"></script>
+<script type="text/javascript" src="/blog/aes-js.js"></script>
+<script type="text/javascript" src="/blog/scrypt.js"></script>
+<script type="text/javascript" src="/blog/sha256.js"></script>
+<script type="text/javascript" src="/blog/decryptor.js"></script>
+<link rel="stylesheet" type="text/css" href="/common.css">
+<link rel="stylesheet" type="text/css" href="/panel.css">
+<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
+<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
+<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
+<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
+<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
+<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
+<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
+<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
+<link rel="stylesheet" type="text/css" href="/blog/blogext.css">
+<script>
+function ol()
+{
+ window.onresize=function()
+ {
+ if(window.innerWidth<768)
+ setupevents();
+ else unsetevents();
+ }
+ window.onresize();
+ _decryptonload();
+}
+function loadTheme(){
+ var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
+ if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
+ var ent="";
+ var d=new Date();
+ if(thm[0]=='z')
+ {
+ var m=d.getMonth()+1;
+ if(m>=3&&m<6)thm='0'+thm[1];
+ else if(m>=6&&m<9)thm='1'+thm[1];
+ else if(m>=9&&m<12)thm='2'+thm[1];
+ else thm='3'+thm[1];
+ }
+ if(thm[1]=='z')
+ {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
+ ent=`theme${thm}`;
+ var R=new RegExp('theme[0-4][ab]');
+ for(var i=0;i<document.styleSheets.length;++i)
+ {
+ if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
+ document.styleSheets[i].disabled=true;
+ else document.styleSheets[i].disabled=false;
+ }
+ var thmcolor="";
+ switch(thm[0])
+ {
+ case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break;
+ case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break;
+ case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break;
+ case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break;
+ }
+ document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor);
+}
+loadTheme();
+</script>
+</head>
+<body onload="ol()" style="overflow-x:hidden;">
+ <div id="panel" class="TText">
+ <ul id="panellist">
+ <li><a href="/"><h1>Chrisoft</h1></a></li>
+ <li><a href="/blog"><h2>Blog</h2></a></li>
+ <li><a href="#"><h3 id="title">Ideology vs Pragmatism &amp;c.</h3></a></li>
+ <li><span>Tags</span>
+ <ul id="tagslist">
+ <li><a href="/blog/list/sophistry/">sophistry</a></li><li><a href="/blog/list/garbage/">garbage</a></li></ul>
+ </li>
+ <li id="tocouter">
+ <span>Table of Contents</span>
+ <ul id="tocroot">
+ <li><a class="toctarg" href="#tocanch0">Preface</a></li><li><a class="toctarg" href="#tocanch1">Ideology vs Pragmatism</a></li><li><a class="toctarg" href="#tocanch2">Free Software vs "Normies"</a></li><li><a class="toctarg" href="#tocanch3">"Free" vs "Open Source"</a></li><li><a class="toctarg" href="#tocanch4">Free software in China</a></li><li><a class="toctarg" href="#tocanch5">Monetization of Free Software</a></li><li><a class="toctarg" href="#tocanch6">Final words</a></li></ul>
+ </li>
+ <li style="margin-left:-0.5em"><a id="prevp" href="2018-05-08.html">Prev post</a></li>
+ <li style="margin-left:-0.5em"><a id="nextp" href="2018-06-05.html">Next post</a></li>
+ </ul>
+ </div>
+ <div id="content">
+ <h2 id="titleh" class="TText" style="font-wight:normal;">Ideology vs Pragmatism &amp;c.</h2>
+ <div id="datetags" class="TText" style="margin-bottom:1em;">2018-05-18<br>#sophistry #garbage</div>
+ <hr><div id="article" class="TText">
+<article>
+<h2 id="tocanch0" class="tvis">Preface</h2>
+<p>
+Born in the 90s, when almost every piece of software around was
+proprietary, I felt *exteremely* lucky that I can now power my life using
+(mostly) free software. Still, I might never be able to understand the case
+in the 70s, in which, according to Richard Stallman, every piece of software
+is basically free.
+</p>
+<h2 id="tocanch1" class="tvis">Ideology vs Pragmatism</h2>
+<p>
+There are Linux distros<a id="n1" href="#note1" class="note">[1]</a>
+whose software repository contains free software only (e.g. Trisquel &amp;
+Parabola). There are also distros that doesn't care much about licenses
+(e.g. ArchLinux). Some distros falls between the two extremes: Debian
+has a <code>main</code> section which is entirely made up of free software,
+but it also has <code>contrib</code> and <code>non-free</code>
+<a id="n2" href="#note2" class="note">[2]</a> sections in their repository, which can be added to the system
+quite easily.
+</p>
+<p>
+To most of us who do not have a requirement on every single piece of
+software being free, we still have to use non-free components -- even to
+make the toaster<a id="n3" href="#note3" class="note">[3]</a> fully working. For
+example, non-free blobs in the Linux kernel and drivers. Using "free" distros
+on these computers essentially cripple the core functionality of that
+computer. If most users require non-free components, it makes sense that
+the distro providers include them in the software repository. As a matter
+of fact, I haven't met any user of a "free" distro outside of GNU.
+<a id="n4" href="#note4" class="note">[4]</a>
+</p>
+<p>
+Using a distro that provides proprietary software should not be considered
+a sin to free software.
+Actually it's a huge step towards freedom in today's world dominated by
+proprietary software. In order to remind the user of this, it is the
+responsibitliy for the distro provider to tell the user about the benefits
+of free software and advocate them contributing to it.
+</p>
+<p>
+Since I've got no mysophobia of proprietary software personally, I don't
+really care about installing proprietary software on my mostly free system.
+I prefer using free software whenever one is available. But if the use of
+free software results in crippling the core functionality (e.g. removing
+firmware blobs from the kernel causing WLAN cards made by Intel not
+working), I may compromise and install a few pieces of proprietary software
+(instead of using an external WLAN card like RMS).
+<a id="n5" href="#note5" class="note">[5]</a>
+</p>
+<h2 id="tocanch2" class="tvis">Free Software vs "Normies"</h2>
+<p>
+The idea of free software won't spread widely if it fails on the "normies".
+Everything about free software is a circlejerk of us <a href="https://stallman.org/articles/on-hacking.html">hackers</a>
+if we ignore the "normies". Sadly that is just the case right now.
+</p>
+<p>
+The major reason that free software fail to become daily driver of most
+people is that probably most free software targets at "mega-nerds" instead
+of the vast amount of computer "normies". These "normies" just use their
+computers either to get their office work done or to browse the web
+(sometimes both). In this sense, free software often offer terrible
+experience: Linux distributions, if not pre-installed by device vendor,
+often have bad out-of-box experience (either missing driver or firmware,
+or the software requiring too much tweaks to make it actually usable).
+Another example is window manager: the most popular window manager used
+by desktop Linux users is i3, whose default interface is obscure to new
+users and needs a lot of configuration before it suits the user. Only
+people that are really keen on tweaking would do that.
+</p>
+<p>
+Things are changing though. Some free software makers, for example the
+GNOME Fundation, are striving to make free software more user-friendly
+and fool-proof. They recently removed the ability to run executables
+directly in the file manager to prevent the user from accently running
+a malicious script that destroys their computer.
+<a id="n6" href="#note6" class="note">[6]</a>
+But in my opinion the components should remain customizable for the users
+who "knows what they are doing".
+</p>
+<h2 id="tocanch3" class="tvis">"Free" vs "Open Source"</h2>
+<p>
+Richard Stallman has made multiple statements on how he dislikes the term
+"Open Source". I pretty much simply repeat one of his points here.
+</p>
+<p>
+"Free" and "Open Source" has a large part in common: in fact, being "free"
+requires the software to be "open source". However the idea laying below
+is very different: The term "open source" is currently being abused by
+gigantic companies as a weasel word to avoid using "free". They often use
+free component in their proprietary products and doesn't want to remind the
+user that there is a free counterpart that doesn't take the freedom from
+them. A famous example of this is Google Chrome and
+Chromium. <a id="n7" href="#note7" class="note">[7]</a> Similarly, Microsoft "loves" Linux because it is "open source",
+not because it is "free".<a id="n8" href="#note8" class="note">[8]</a>
+</p>
+<p>
+On the other hand, Linus seems to be at the opposite end of it.
+<a id="n9" href="#note9" class="note">[9]</a>
+Pleased to learn that this world is never lack of diversity.
+</p>
+<h2 id="tocanch4" class="tvis">Free software in China</h2>
+<p>
+Free software is not having a good time in China:
+</p>
+<ul>
+<li>
+As Chinese use two distinct words for "free" as in beer and "free" as in
+freedom, we should have faced less problems than the English-speaking
+community. Sadly, almost all tranlators used the word for free beer when
+translating "free software".
+</li>
+<li>
+"Thanks" to the crappy copyright law in China, pirating software and
+reverse engineering is explictly allowed with some restrictions, making
+free software a lot less known to the general public
+<a id="n10" href="#note10" class="note">[10]</a>.
+That same crappy copyright law also gave chance to massive GPL violations.
+Examples: <a href="https://linux-sunxi.org/GPL_Violations">AllWinner</a>,
+<a href="https://www.xda-developers.com/gplv2-and-its-infringement-by-xiaomi/">XiaoMi</a>
+and <a href="https://www.xda-developers.com/have-you-paid-your-linux-kernel-source-license-fee/">MediaTek</a><a id="n11" href="#note11" class="note">[11]</a>.
+</li>
+<li>
+As China wasn't actually involved in the software industry until proprietary
+software has almost taken the whole thing, there are misconceptions
+regarding free software in the Chinese community. For example, the
+definition of 'source code' in <i>A Dictionary of Current Chinese</i>
+claims "protecting the source code helps to lower the chance of being
+hacked".
+</li>
+<li>
+Software engineering college in China only teach the process of proprietary
+software engineering. Although they utilize free software a lot through
+out the college, they do not promote the use of free software for 'serious
+work', often putting an emphasis on the strengths of proprietary software.
+</li>
+</ul>
+<p>
+As currently the entire Chinese software industry is really addicted (and
+devoted) to AI, ML, IoT and their 'made in China' nonsense, chance of
+solving these problems seems bleak. Also Chinese doesn't do stuff that
+makes no money, but ...
+</p>
+<h2 id="tocanch5" class="tvis">Monetization of Free Software</h2>
+<p>
+... free software <i>can</i> make money. Ethically.
+</p>
+<p>
+By saying ethically I am not promoting the act of getting a maga-sponsor
+and just doing anything they requested. The only ethical way for free
+software to monetize is probably paid support and donation. Red Hat is a
+well-known company that made sheer amount of money out of free software.
+<sup><s>Sarcasm. You should have known it.</s></sup>
+However, not everyone would succeed following that route (even Microsoft
+failed to figure out how to make it work /s). Thus the choice for the vast
+number of smaller free software projects would be donation. So why is
+accepting donation a good idea?
+</p>
+<ul>
+<li>The user donates what ever they want (money, hardware, code,
+translation etc.) voluntarily, and...</li>
+<li>There's no cap on donation amount, so those who got the fortune may
+donate <a href="https://dot.kde.org/2018/02/19/kde-receives-200000-usd-donation-pineapple-fund">a good deal of stuff</a>.</li>
+<li>Those who don't yet have the ability to donate would not be triggered.
+More over, the spirit of "free as in freedom" remains intact.
+</li>
+</ul>
+<p>
+But when things come to money, people starts getting greedy.
+Don't let your greed ruin the entire project.
+</p>
+<h2 id="tocanch6" class="tvis">Final words</h2>
+<p>
+This article is full of my immature thoughts and rants. Fortunately due to
+the low popularity of this site, they would not be exposed too much.
+Writing such a long article is really a pain in my ass though.
+</p>
+<p>
+If you have different opinions, please consider
+<a href="/#about">telling me about it</a> and probably correcting me if I
+made a mistake.
+</p>
+</article>
+<!--
+vim: syntax=html
+-->
+</div><br><hr>
+ <div class="TText" id="notediv" style="font-size:80%;"><span class="TText"><a id="note1" href="#n1">[1]</a>: By saying "Linux distros" in this article,
+I am refering to GNU/Linux distributions, except Alpine Linux.<br></span><span class="TText"><a id="note2" href="#n2">[2]</a>: They use their very own guideline (DFSG) to determine whether
+a piece of software is free or not. The most famous difference between
+DFSG and GNU's guideline is that according to DFSG, GFDL is a nonfree
+license, which, in my opinion, is pretty ridiculous.
+<i>Such ideology, much hilarious.</i>
+<br></span><span class="TText"><a id="note3" href="#n3">[3]</a>: i.e. computer<br></span><span class="TText"><a id="note4" href="#n4">[4]</a>: There's one exception: Pure OS from Purism, which is tailored for
+their Librem devices. So it runs without proprietary software on their
+devices just find. Of course I haven't seen one of those either because
+I live in China. But I expect my next laptop to be a Librem 13 as long as
+they improve the battery life and make it thinner -- at least on par with the
+ThinkPad X line products.<br></span><span class="TText"><a id="note5" href="#n5">[5]</a>: Yup I may never program OpenGL on a libreboot-ed ThinkPad T400
+or X200. Those ThinkPads were a classic but perform pretty bad whenever
+I do CPU-intense jobs.
+<br></span><span class="TText"><a id="note6" href="#n6">[6]</a>:
+This is half truth, half sarcasm. It <i>does</i> make nautilus fool-proof
+(kind of).
+GNOME is always removing customizability from their desktop environment
+recently, which I can't tell is good or not. This indeed reveals the
+dictatorial decision-making process inside the development cycle.
+<b>However, <a href="https://gitlab.gnome.org/GNOME/nautilus/commit/ce73de0c98f1d32cdafc40775ee59692f5a7288d">
+this change has been reverted a week ago</a>. Cringy.</b>
+<br></span><span class="TText"><a id="note7" href="#n7">[7]</a>: Chromium is actually a pretty nasty example of free
+software: it contains tracking code from Google. Efforts have been made to
+strip those from the browser. The resulting product is called "Iridium".
+<br></span><span class="TText"><a id="note8" href="#n8">[8]</a>: Probably because Microsoft doesn't know
+how to make profit with free software.<br></span><span class="TText"><a id="note9" href="#n9">[9]</a>:
+<a href="https://www.youtube.com/watch?v=bw58LZTuZjA">a</a>
+<a href="https://www.youtube.com/watch?v=b89fKsT1i7s">b</a>
+<br></span><span class="TText"><a id="note10" href="#n10">[10]</a>: also making China an ideal place to reverse engineer something /s.
+<br></span><span class="TText"><a id="note11" href="#n11">[11]</a>: Taiwan (whether a part of
+China or not. No politics here.) has better environment for free software in
+general, but still horrible.<br></span></div>
+ <div id="insanch" style="height:3em;"></div>
+ <div id="footer" style="">
+ <div id="pagesw" class="TText" style="width:100%;height:0.5em;"></div>
+ <div style="text-align:center;" class="TText">
+ Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5
+ <br>
+ Content licensed under CC BY-SA 4.0. <span id="purgep" style="display:none;font-size:70%;">This page has passphrase(s) stored. Click <a href="javascript:_purgep()">here</a> to purge.</span>
+ </div>
+ </div>
+ <div id="cmdbuf" class="TText" style="transition:500ms;padding:1em;font-size:2em;color:white;position:absolute;background-color:rgba(0,0,0,0.6);left:50%;top:50%;transform:translate(-50%,-50%);pointer-events:none;opacity:0;">
+ </div>
+ </div>
+ <div id="decryptui" style="display:none;opacity:0;color:white;z-index:1000;position:fixed;left:0;top:0;width:100%;height:100%;background-color:rgba(0,0,0,0.4);transition:opacity 0.5s;">
+ <div id="decryptdlg" class="TText" style="padding:10px 20px;position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);background-color:rgba(0,0,0,0.6);">
+ <div id="keyhint" style="margin-bottom:8px;"></div>
+ <div style="margin-bottom:8px;">Key: <input id="keyinp" type="text" style="color:#fff;"></div>
+ <div style="height:2.25em;">
+ <button id="btndecrypt" onclick="decryptor(decid,document.getElementById('keyinp').value);" style="position:absolute;left:20px;">Decrypt</button>
+ <button onclick="hidedecryptui();" style="position:absolute;right:20px;">Cancel</button>
+ </div>
+
+ </div>
+
+
+</div></body></html> \ No newline at end of file
diff --git a/blog/post/2018-06-05.html b/blog/post/2018-06-05.html
new file mode 100644
index 0000000..a68f33e
--- /dev/null
+++ b/blog/post/2018-06-05.html
@@ -0,0 +1,216 @@
+<html><head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<meta name="theme-color" content="#000000">
+<title>Chrisoft::Blog</title>
+<script type="text/javascript" src="/panel.js"></script>
+<script type="text/javascript" src="/blog/footnoter.js"></script>
+<script type="text/javascript" src="/blog/aes-js.js"></script>
+<script type="text/javascript" src="/blog/scrypt.js"></script>
+<script type="text/javascript" src="/blog/sha256.js"></script>
+<script type="text/javascript" src="/blog/decryptor.js"></script>
+<link rel="stylesheet" type="text/css" href="/common.css">
+<link rel="stylesheet" type="text/css" href="/panel.css">
+<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
+<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
+<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
+<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
+<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
+<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
+<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
+<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
+<link rel="stylesheet" type="text/css" href="/blog/blogext.css">
+<script>
+function ol()
+{
+ window.onresize=function()
+ {
+ if(window.innerWidth<768)
+ setupevents();
+ else unsetevents();
+ }
+ window.onresize();
+ _decryptonload();
+}
+function loadTheme(){
+ var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
+ if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
+ var ent="";
+ var d=new Date();
+ if(thm[0]=='z')
+ {
+ var m=d.getMonth()+1;
+ if(m>=3&&m<6)thm='0'+thm[1];
+ else if(m>=6&&m<9)thm='1'+thm[1];
+ else if(m>=9&&m<12)thm='2'+thm[1];
+ else thm='3'+thm[1];
+ }
+ if(thm[1]=='z')
+ {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
+ ent=`theme${thm}`;
+ var R=new RegExp('theme[0-4][ab]');
+ for(var i=0;i<document.styleSheets.length;++i)
+ {
+ if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
+ document.styleSheets[i].disabled=true;
+ else document.styleSheets[i].disabled=false;
+ }
+ var thmcolor="";
+ switch(thm[0])
+ {
+ case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break;
+ case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break;
+ case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break;
+ case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break;
+ }
+ document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor);
+}
+loadTheme();
+</script>
+</head>
+<body onload="ol()" style="overflow-x:hidden;">
+ <div id="panel" class="TText">
+ <ul id="panellist">
+ <li><a href="/"><h1>Chrisoft</h1></a></li>
+ <li><a href="/blog"><h2>Blog</h2></a></li>
+ <li><a href="#"><h3 id="title">Software Project Management in the Free Software World</h3></a></li>
+ <li><span>Tags</span>
+ <ul id="tagslist">
+ <li><a href="/blog/list/sophistry/">sophistry</a></li></ul>
+ </li>
+ <li id="tocouter">
+ <span>Table of Contents</span>
+ <ul id="tocroot">
+ <li><a class="toctarg" href="#tocanch0">Project charter. What?</a></li><li><a class="toctarg" href="#tocanch1">Tools and outdated approaches</a></li><li><a class="toctarg" href="#tocanch2">Free software that is...</a></li></ul>
+ </li>
+ <li style="margin-left:-0.5em"><a id="prevp" href="2018-05-18.html">Prev post</a></li>
+ <li style="margin-left:-0.5em"><a id="nextp" href="2018-06-07.html">Next post</a></li>
+ </ul>
+ </div>
+ <div id="content">
+ <h2 id="titleh" class="TText" style="font-wight:normal;">Software Project Management in the Free Software World</h2>
+ <div id="datetags" class="TText" style="margin-bottom:1em;">2018-06-05<br>#sophistry</div>
+ <hr><div id="article" class="TText"><article>
+<p>
+This article is based on a presentation project I did for the software
+project management course. The original presentation can be found
+<a href="//filestorage.chrisoft.org/blog/data/ventriloquist.pdf">here</a><a id="n1" href="#note1" class="note">[1]</a>.
+</p>
+<p>
+As mentioned in <a href="https://chrisoft.org/blog/post/2018-05-18.html#tocanch4">
+another article</a>, software engineering college
+in China (one of which I am currently studying in) mainly deals with
+the development cycle of proprietary programs with a very specific purpose
+(i.e. enterprise software), such as software system for a library or an
+electric grid. Unfortunately, there are very few instances of free
+enterprise software in the wild. Therefore it's safe to assume that I still
+know nothing about the life cycle of a free software project except my own
+experience.
+</p>
+<h2 id="tocanch0" class="tvis">Project charter. What?</h2>
+<p>
+Approximately 50% of the class is focused on the project charter. How the
+charter is issued. Why modifying the charter is vital when the client requests
+to make a change in the requirements. This list can go a lot longer.
+</p>
+<p>
+However, project charter doesn't seem to play an important role in free software
+projects, at least compared to what I have learned. Even some <i>huge</i> free
+software projects such as KDE omits the project charter. Instead they have brief
+description of every sub-projects and use their 'philosophy' to govern the whole
+project.
+</p>
+<p>
+This can lead to problems though. When decisions need to be made, the only ones
+involved are the current maintainers. Free software projects fall into roughly
+four categories according to the way new features are introduced:
+</p>
+<ul>
+<li>Linux kernel/LineageOS: developers submits changes, got reviewed, and
+possibly merged.
+<p>Linux kernel is such a huge and complex project that probably only users
+extremely familiar with it know what new functionality they need. Also
+the code needs to have a reasonable wide range of use cases to be merged.
+This sets a pretty high standard for the contributors. LineageOS, on the
+other hand, is a lot easier to get started. However being mostly a community
+project, they cannot simply get every requested features implemented without
+help.</p>
+</li>
+<li>i3wm: this will never turn into compiz.
+<p>It is important for i3wm not to turn into compiz. However sometimes this
+can be abused for dictatorship over the project (e.g. gogs, which resulted
+in a fork into gitea.<a id="n2" href="#note2" class="note">[2]</a>)</p>
+</li>
+<li>systemd: let's add a email client to this.
+<p><s>j/k.</s></p>
+</li>
+<li><a href="#tocanch2">...</a></li>
+</ul>
+<h2 id="tocanch1" class="tvis">Tools and outdated approaches</h2>
+<p>
+Over the years, the process of building a commercial software has evolved a
+lot. However, the process of building free software seem to be stuck at what
+it was like in the 70s forever: (nearly) everything is still on mailing lists.
+Indeed, VCS, issue tracker and CI simplified a lot of stuff. And the
+infrastructure has also improved a lot from that of the 70s. But we are still
+no where close to a well-organized process. Personnel management is almost
+completely relying on faith. Deadlines can be pushed back again and again.
+That's it.
+</p>
+<h2 id="tocanch2" class="tvis">Free software that is...</h2>
+<p>... developed as if it was proprietary software.</p>
+<p>
+A very typical instance: Android. Repositories are not updated until new
+release comes out. Many related patents are held by Google. Even codename
+needs revealing.
+</p>
+<p>
+Another (less-known) example is Deepin, which one of my friends works for.
+It's infra is far less open to public than that of Debian or even Ubuntu.
+Public opinions are ignored from time to time.
+</p>
+<p>
+While making the project much more better-organized, this approach
+automatically makes the project dictated by the project management team.
+Many benefits of free software doesn't apply to such projects, which
+makes them closer to those 'shared source' software. Although still can be
+forked freely, most forks die out pretty quickly, as these projects tend
+to be pretty large in scale, maintenance of such a project is no trivial task.
+</p>
+<p>
+This is certainly not the best way to do it.
+</p>
+</article>
+<!--
+vim: syntax=html spell spelllang=en_us
+-->
+</div><br><hr>
+ <div class="TText" id="notediv" style="font-size:80%;"><span class="TText"><a id="note1" href="#n1">[1]</a>: I used the term
+"open source" in the original
+presentation, which is more familiar to the audience. But the actual focus
+is the free software world.<br></span><span class="TText"><a id="note2" href="#n2">[2]</a>: The maintainer of gogs is <br></span></div>
+ <div id="insanch" style="height:3em;"></div>
+ <div id="footer" style="">
+ <div id="pagesw" class="TText" style="width:100%;height:0.5em;"></div>
+ <div style="text-align:center;" class="TText">
+ Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5
+ <br>
+ Content licensed under CC BY-SA 4.0. <span id="purgep" style="display:none;font-size:70%;">This page has passphrase(s) stored. Click <a href="javascript:_purgep()">here</a> to purge.</span>
+ </div>
+ </div>
+ <div id="cmdbuf" class="TText" style="transition:500ms;padding:1em;font-size:2em;color:white;position:absolute;background-color:rgba(0,0,0,0.6);left:50%;top:50%;transform:translate(-50%,-50%);pointer-events:none;opacity:0;">
+ </div>
+ </div>
+ <div id="decryptui" style="display:none;opacity:0;color:white;z-index:1000;position:fixed;left:0;top:0;width:100%;height:100%;background-color:rgba(0,0,0,0.4);transition:opacity 0.5s;">
+ <div id="decryptdlg" class="TText" style="padding:10px 20px;position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);background-color:rgba(0,0,0,0.6);">
+ <div id="keyhint" style="margin-bottom:8px;"></div>
+ <div style="margin-bottom:8px;">Key: <input id="keyinp" type="text" style="color:#fff;"></div>
+ <div style="height:2.25em;">
+ <button id="btndecrypt" onclick="decryptor(decid,document.getElementById('keyinp').value);" style="position:absolute;left:20px;">Decrypt</button>
+ <button onclick="hidedecryptui();" style="position:absolute;right:20px;">Cancel</button>
+ </div>
+
+ </div>
+
+
+</div></body></html> \ No newline at end of file
diff --git a/blog/post/2018-06-07.html b/blog/post/2018-06-07.html
new file mode 100644
index 0000000..fc6e175
--- /dev/null
+++ b/blog/post/2018-06-07.html
@@ -0,0 +1,260 @@
+<html><head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<meta name="theme-color" content="#000000">
+<title>Chrisoft::Blog</title>
+<script type="text/javascript" src="/panel.js"></script>
+<script type="text/javascript" src="/blog/footnoter.js"></script>
+<script type="text/javascript" src="/blog/aes-js.js"></script>
+<script type="text/javascript" src="/blog/scrypt.js"></script>
+<script type="text/javascript" src="/blog/sha256.js"></script>
+<script type="text/javascript" src="/blog/decryptor.js"></script>
+<link rel="stylesheet" type="text/css" href="/common.css">
+<link rel="stylesheet" type="text/css" href="/panel.css">
+<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
+<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
+<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
+<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
+<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
+<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
+<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
+<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
+<link rel="stylesheet" type="text/css" href="/blog/blogext.css">
+<script>
+function ol()
+{
+ window.onresize=function()
+ {
+ if(window.innerWidth<768)
+ setupevents();
+ else unsetevents();
+ }
+ window.onresize();
+ _decryptonload();
+}
+function loadTheme(){
+ var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
+ if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
+ var ent="";
+ var d=new Date();
+ if(thm[0]=='z')
+ {
+ var m=d.getMonth()+1;
+ if(m>=3&&m<6)thm='0'+thm[1];
+ else if(m>=6&&m<9)thm='1'+thm[1];
+ else if(m>=9&&m<12)thm='2'+thm[1];
+ else thm='3'+thm[1];
+ }
+ if(thm[1]=='z')
+ {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
+ ent=`theme${thm}`;
+ var R=new RegExp('theme[0-4][ab]');
+ for(var i=0;i<document.styleSheets.length;++i)
+ {
+ if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
+ document.styleSheets[i].disabled=true;
+ else document.styleSheets[i].disabled=false;
+ }
+ var thmcolor="";
+ switch(thm[0])
+ {
+ case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break;
+ case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break;
+ case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break;
+ case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break;
+ }
+ document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor);
+}
+loadTheme();
+</script>
+</head>
+<body onload="ol()" style="overflow-x:hidden;">
+ <div id="panel" class="TText">
+ <ul id="panellist">
+ <li><a href="/"><h1>Chrisoft</h1></a></li>
+ <li><a href="/blog"><h2>Blog</h2></a></li>
+ <li><a href="#"><h3 id="title">Should this site still be alive by 2035...</h3></a></li>
+ <li><span>Tags</span>
+ <ul id="tagslist">
+ <li><a href="/blog/list/sophistry/">sophistry</a></li><li><a href="/blog/list/garbage/">garbage</a></li></ul>
+ </li>
+ <li id="tocouter">
+ <span>Table of Contents</span>
+ <ul id="tocroot">
+ <li><a class="toctarg" href="#tocanch0">「阅读下面材料,根据要求写作:」</a></li><li><a class="toctarg" href="#tocanch1">前言</a></li><li><a class="toctarg" href="#tocanch2">正文</a></li><li><a class="toctarg" href="#tocanch3">後記</a></li></ul>
+ </li>
+ <li style="margin-left:-0.5em"><a id="prevp" href="2018-06-05.html">Prev post</a></li>
+ <li style="margin-left:-0.5em"><a id="nextp" href="2018-10-11.html">Next post</a></li>
+ </ul>
+ </div>
+ <div id="content">
+ <h2 id="titleh" class="TText" style="font-wight:normal;">Should this site still be alive by 2035...</h2>
+ <div id="datetags" class="TText" style="margin-bottom:1em;">2018-06-07<br>#sophistry #garbage</div>
+ <hr><div id="article" class="TText">
+<article>
+<p>
+如果可以有個副標題的話,肯定是「2018年全國一卷高考零分作文」吧。
+</p>
+<h2 id="tocanch0" class="tvis">「阅读下面材料,根据要求写作:」</h2>
+<blockquote>
+<p class="noindent">
+2000年,农历庚辰龙年,人类迈进新千年,中国千万“世纪宝宝”出生。<br>
+2008年,汶川大地震。北京奥运会。<br>
+2013年,“天宫一号”首次太空授课。公路“村村通”接近完成;“精准扶贫”开始推动。<br>
+2017年,网民规模达7.72亿,互联网普及率超全球平均水平。<br>
+2018年,“世纪宝宝”一代长大成人。<br>
+……<br>
+2020年,全面建成小康社会。<br>
+2035年,基本实现社会主义现代化。
+</p>
+<p>
+一代人有一代人的际遇和机缘,使命和挑战,你们与新世纪的中国一路同行,
+成长,和中国的新时代一起追梦、圆梦。以上材料触发了你怎样的联想和思考?
+请据此写一篇文章,想象它装进“时光瓶”留待2035年开启,给那时18岁的一代人阅读。
+</p>
+<p>
+要求:选好角度,确定立意,明确文体,自拟标题,不要套作,不得抄袭,
+不得泄露个人信息;不少于800字。
+</p>
+</blockquote>
+<h2 id="tocanch1" class="tvis">前言</h2>
+<p>
+實際上自我高中畢業以來,
+我一直在觀望高考作文題目並且期望有時間能與廣大考生同題作文,
+但是因爲各種各樣的原因沒有得到實現。看到今年的高考作文,我暗自想到,
+「哇,再這樣下去,高考作文不就跟考研政治一樣了嗎?」於是決心不再拖下去了。
+</p>
+<p>
+提前告知不知情的讀者,我在高中時的作文總是可以把老師氣死的。
+以至於後來習作不交老師也不會來找我麻煩。首要原因,
+大概跟我的生活經歷與周圍大多數同學大不一樣有關係吧。
+然而現在一切都不同了。
+我不再受到立意跟得分直接掛鉤的約束,而可以真正「自由發揮」了。
+但是長期的壓抑讓我在表達自己的想法上有一點困難。
+所以實際能寫成什麼樣子,大概只能看造化了。
+</p>
+<h2 id="tocanch2" class="tvis">正文</h2>
+<a id="n1" href="#note1" class="note">[1]</a>
+<p>
+你好,來自2035年的18歲的朋友。
+</p>
+<p>
+我並不知道你來自何處,爲何性別,或者正在使用何種設備閱讀,
+甚至能否可以看懂這篇文章所用的文字。
+但是,很高興認識你。
+</p>
+<p>
+我並不知道我現在所生活的國家此時是否依然存在。如果回答是肯定的,
+它應該已經實現了它「基本實現社會主義現代化」的目標了吧。
+此時它已經是86歲的高齡,遠超那個只活了69
+<a id="n2" href="#note2" class="note">[2]</a>
+歲的傢伙了吧。
+</p>
+<p>
+抱歉失禮了,但是現在作自我介紹也許還來得及吧。
+這篇文章是一個來自17年前的、沉迷「自由軟體事業」
+而不能維持生計的幻想家寫成的。
+</p>
+<p>
+17年前,我們正無比糾結於「人類與人工智能的關係」以及「人類是否正在變懶」
+這樣的議題上。有人正力圖將生活中的所有瑣事交給時下所流行的「個人助手」來做。
+其他人質疑如此行事是否真的有所裨益,因爲節省出來的時間,
+似乎大部分都被用在爲娛樂網站增加流量上了。而「個人助手」所獲得的數據,
+被如何利用,也不得而知。還有激進者聲稱人工智能將毀滅人類,
+也有玩笑話說人工智能不過是一堆條件分支而已。
+但這樣的爭議,大概並不能持續17年吧。
+</p>
+<p>
+17年前的不久,微軟剛剛收購了GitHub。<a id="n3" href="#note3" class="note">[3]</a>許多人因此落荒而逃,
+卻選擇了一年前剛經歷刪庫風波的GitLab。
+也許我們自然不想看到行業中「神仙打架」的情形。
+更不想被衆位「神仙」在背後榨乾。
+但從一位神仙的光環下轉移到另一位神仙的光環下,
+所處的境地並沒有發生實質性的變化吧。
+這也是Savannah之類存在的理由之一。
+如果我能得知你們的時代除了信神仙之外還有其他選擇,我會十分高興的。
+</p>
+<p>
+17年前,有人爲越來越低的出生率擔憂着。在對立的一面,有人則在1991年就開始了
+「人類自願滅絕運動」。人作爲一種生活在食物鏈頂端的動物,
+控制自己的數量的方法無非以下幾種:內部競爭,自覺控制,或者所謂的「天意」,
+也就是玄學。內部競爭,我們有荒唐的關稅;自覺控制,我們有「計劃生育」;
+而「天意」,大概就反應在最近某些地區無法提振的生育率上了。
+最終人類生育的本能會否被這三樣壓倒,也許只有時間知道答案。
+希望你們給你們的後輩留下的「時光瓶」,也有機會被打開吧。
+</p>
+<p>
+最後,也許你還不知道,這篇文章的題目來自於17年前一個叫「高考作文」的東西。
+自然,我是完全地跑題了。但是,
+我只不過是誠實地寫出了排在我想給你們帶的話中的前幾位而已。
+很不幸的是,出卷人心中所想的政治宣傳目的,在我心中是排不上數的。
+我並不會做夢,只會做自己想做的事。僅此而已。
+</p>
+<h2 id="tocanch3" class="tvis">後記</h2>
+<p>
+也許對大部分人來說,我的關注點實在是過於奇怪了。對語文老師來說,
+這篇則顯然是不折不扣的零分作文嘛:
+</p>
+<ul>
+<li>偏離題意:完全脫離了出題人預設的政治宣傳方向。</li>
+<li>中心不存在:三個完全不相干的點。</li>
+<li>內容不當:第二段和第三段你就能看出我與所謂「主流價值觀」的不合了。
+</li>
+<li>感情虛假:感情?</li>
+<li>不符合文體要求,結構混亂:我只是隨便寫寫而已。</li>
+<li>語言不通順,語病多:也許我用程序設計語言能寫得通順一點?
+<s>不存在的。什麼東西都不會一次通過編譯的。</s></li>
+<li>字跡潦草難辨:雖然說屏幕字體不會「潦草難辨」,
+但是單是使用「已淘汰」的文字就夠了吧。</li>
+<li>深刻:單獨陳列事實。談不上深刻。</li>
+<li>豐富:900字上下,能寫個鬼。</li>
+<li>有文采:沒有。</li>
+<li>有創意:我甚至不知道他在說什麼。</li>
+</ul>
+<p>
+事實上,我在高中甚至寫過一篇叫做「噴當代中國大陸的『考場作文』制度」的文章。
+儘管我個人已經無需因要向語文老師討一點可憐的分數而強迫自己寫出違心的文字
+<a id="n4" href="#note4" class="note">[4]</a>(這可能是高中畢業能夠換來的有限的自由之一:
+可以寫自己真正想寫的東西——儘管還要受到各種「法」的約束),
+我可能依然要站在「關心後代」的角度爲他們擔心一下:
+畢竟以後他們可能就得像對待考研政治一樣處理考場作文了。meh.
+</p>
+<p>
+最後,給後來人留點文字這種本來很正常的行爲,
+一旦因被強行套上什麼東西而政治化,便會讓人覺得十分不適。
+不知道有多少人有和我一樣的看法。
+<a id="n5" href="#note5" class="note">[5]</a>
+</p>
+</article>
+</div><br><hr>
+ <div class="TText" id="notediv" style="font-size:80%;"><span class="TText"><a id="note1" href="#n1">[1]</a>: 如果你認爲我沒有寫標題想扣我兩分,
+文章的標題就是這篇post的標題。<br></span><span class="TText"><a id="note2" href="#n2">[2]</a>: 也可以認爲是74歲,根據不同的計算方式。<br></span><span class="TText"><a id="note3" href="#n3">[3]</a>: 如果你不知道Git是什麼,
+可以想象整個事件的最終結果是自己的所有物品都需要在三家中挑選一家。
+<br></span><span class="TText"><a id="note4" href="#n4">[4]</a>: ……即使在我有必要這麼做的時候,我也盡力避免如此:
+比如乾脆不寫之類。<br></span><span class="TText"><a id="note5" href="#n5">[5]</a>: 如果多數人的看法都是這樣,那麼大致可以說明:
+1)語文老師都是怪物,或/和2)出題人有不可告人的目的<br></span></div>
+ <div id="insanch" style="height:3em;"></div>
+ <div id="footer" style="">
+ <div id="pagesw" class="TText" style="width:100%;height:0.5em;"></div>
+ <div style="text-align:center;" class="TText">
+ Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5
+ <br>
+ Content licensed under CC BY-SA 4.0. <span id="purgep" style="display:none;font-size:70%;">This page has passphrase(s) stored. Click <a href="javascript:_purgep()">here</a> to purge.</span>
+ </div>
+ </div>
+ <div id="cmdbuf" class="TText" style="transition:500ms;padding:1em;font-size:2em;color:white;position:absolute;background-color:rgba(0,0,0,0.6);left:50%;top:50%;transform:translate(-50%,-50%);pointer-events:none;opacity:0;">
+ </div>
+ </div>
+ <div id="decryptui" style="display:none;opacity:0;color:white;z-index:1000;position:fixed;left:0;top:0;width:100%;height:100%;background-color:rgba(0,0,0,0.4);transition:opacity 0.5s;">
+ <div id="decryptdlg" class="TText" style="padding:10px 20px;position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);background-color:rgba(0,0,0,0.6);">
+ <div id="keyhint" style="margin-bottom:8px;"></div>
+ <div style="margin-bottom:8px;">Key: <input id="keyinp" type="text" style="color:#fff;"></div>
+ <div style="height:2.25em;">
+ <button id="btndecrypt" onclick="decryptor(decid,document.getElementById('keyinp').value);" style="position:absolute;left:20px;">Decrypt</button>
+ <button onclick="hidedecryptui();" style="position:absolute;right:20px;">Cancel</button>
+ </div>
+
+ </div>
+
+
+</div></body></html> \ No newline at end of file
diff --git a/blog/post/2018-10-11.html b/blog/post/2018-10-11.html
new file mode 100644
index 0000000..25c4f8b
--- /dev/null
+++ b/blog/post/2018-10-11.html
@@ -0,0 +1,134 @@
+<html><head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<meta name="theme-color" content="#000000">
+<title>Chrisoft::Blog</title>
+<script type="text/javascript" src="/panel.js"></script>
+<script type="text/javascript" src="/blog/footnoter.js"></script>
+<script type="text/javascript" src="/blog/aes-js.js"></script>
+<script type="text/javascript" src="/blog/scrypt.js"></script>
+<script type="text/javascript" src="/blog/sha256.js"></script>
+<script type="text/javascript" src="/blog/decryptor.js"></script>
+<link rel="stylesheet" type="text/css" href="/common.css">
+<link rel="stylesheet" type="text/css" href="/panel.css">
+<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
+<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
+<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
+<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
+<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
+<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
+<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
+<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
+<link rel="stylesheet" type="text/css" href="/blog/blogext.css">
+<script>
+function ol()
+{
+ window.onresize=function()
+ {
+ if(window.innerWidth<768)
+ setupevents();
+ else unsetevents();
+ }
+ window.onresize();
+ _decryptonload();
+}
+function loadTheme(){
+ var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
+ if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
+ var ent="";
+ var d=new Date();
+ if(thm[0]=='z')
+ {
+ var m=d.getMonth()+1;
+ if(m>=3&&m<6)thm='0'+thm[1];
+ else if(m>=6&&m<9)thm='1'+thm[1];
+ else if(m>=9&&m<12)thm='2'+thm[1];
+ else thm='3'+thm[1];
+ }
+ if(thm[1]=='z')
+ {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
+ ent=`theme${thm}`;
+ var R=new RegExp('theme[0-4][ab]');
+ for(var i=0;i<document.styleSheets.length;++i)
+ {
+ if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
+ document.styleSheets[i].disabled=true;
+ else document.styleSheets[i].disabled=false;
+ }
+ var thmcolor="";
+ switch(thm[0])
+ {
+ case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break;
+ case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break;
+ case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break;
+ case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break;
+ }
+ document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor);
+}
+loadTheme();
+</script>
+</head>
+<body onload="ol()" style="overflow-x:hidden;">
+ <div id="panel" class="TText">
+ <ul id="panellist">
+ <li><a href="/"><h1>Chrisoft</h1></a></li>
+ <li><a href="/blog"><h2>Blog</h2></a></li>
+ <li><a href="#"><h3 id="title">The stupid blogging system evolved!</h3></a></li>
+ <li><span>Tags</span>
+ <ul id="tagslist">
+ <li><a href="/blog/list/web/">web</a></li><li><a href="/blog/list/devel/">devel</a></li><li><a href="/blog/list/js/">js</a></li></ul>
+ </li>
+ <li id="tocouter" style="display: none;">
+ <span>Table of Contents</span>
+ <ul id="tocroot">
+ </ul>
+ </li>
+ <li style="margin-left:-0.5em"><a id="prevp" href="2018-06-07.html">Prev post</a></li>
+ <li style="margin-left:-0.5em"><a id="nextp" href="2018-12-06.html">Next post</a></li>
+ </ul>
+ </div>
+ <div id="content">
+ <h2 id="titleh" class="TText" style="font-wight:normal;">The stupid blogging system evolved!</h2>
+ <div id="datetags" class="TText" style="margin-bottom:1em;">2018-10-11<br>#web #devel #js</div>
+ <hr><div id="article" class="TText"><article>
+<p>As you may not have noticed this time, the blogging system I am currently on received yet another major revamp: unlike the previous SBS, which will not work at all if you have JavaScript disabled or trying to browse with lynx/links/w3m, the new SSBS is almost fully static: no JavaScript involved on the client side if you decide not to read my encrypted crap!</p>
+<p>This is a rather small update on the visual side: it shouldn't have a huge impact on the reading experience by only stripping away some animations. More changes are actually under the hood.</p>
+<p>SBS 2.0 is archived and retired immediately. Old URLs will not be redirected. Substantial changes may still come up to the current version and may break unless a complete reload is performed.</p>
+<p>Full changelog below:</p>
+<ul>
+<li>+ Static page generator using node.js.</li>
+<li>+ Content encryption with AES instead of simple XOR.</li>
+<li>+ Decryptor now remembers every correct passphrases in local storage and try to decrypt once the page has been loaded.</li>
+<li>+ Optional custom preprocessor pass for markdown/reStructuredText support.</li>
+<li>- Vim-like command buffer, animations and key bindings removed on the posts listing page.</li>
+</ul>
+<p>The decryptor requires a ES7-enabled browser to work. All testing was done in Chromium 71 and Firefox 62. I don't use 'JavaScript best practices' or 'industrial standard testing processes'. It <em>just</em> works.</p>
+Find out more <a href="https://cgit.chrisoft.org/sbs.git/about/">here</a>.
+</article>
+</div><br><hr>
+ <div class="TText" id="notediv" style="font-size:80%;"></div>
+ <div id="insanch" style="height:3em;"></div>
+ <div id="footer" style="">
+ <div id="pagesw" class="TText" style="width:100%;height:0.5em;"></div>
+ <div style="text-align:center;" class="TText">
+ Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5
+ <br>
+ Content licensed under CC BY-SA 4.0. <span id="purgep" style="display:none;font-size:70%;">This page has passphrase(s) stored. Click <a href="javascript:_purgep()">here</a> to purge.</span>
+ </div>
+ </div>
+ <div id="cmdbuf" class="TText" style="transition:500ms;padding:1em;font-size:2em;color:white;position:absolute;background-color:rgba(0,0,0,0.6);left:50%;top:50%;transform:translate(-50%,-50%);pointer-events:none;opacity:0;">
+ </div>
+ </div>
+ <div id="decryptui" style="display:none;opacity:0;color:white;z-index:1000;position:fixed;left:0;top:0;width:100%;height:100%;background-color:rgba(0,0,0,0.4);transition:opacity 0.5s;">
+ <div id="decryptdlg" class="TText" style="padding:10px 20px;position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);background-color:rgba(0,0,0,0.6);">
+ <div id="keyhint" style="margin-bottom:8px;"></div>
+ <div style="margin-bottom:8px;">Key: <input id="keyinp" type="text" style="color:#fff;"></div>
+ <div style="height:2.25em;">
+ <button id="btndecrypt" onclick="decryptor(decid,document.getElementById('keyinp').value);" style="position:absolute;left:20px;">Decrypt</button>
+ <button onclick="hidedecryptui();" style="position:absolute;right:20px;">Cancel</button>
+ </div>
+
+ </div>
+
+
+</div></body></html> \ No newline at end of file
diff --git a/blog/post/2018-12-06.html b/blog/post/2018-12-06.html
new file mode 100644
index 0000000..13b8a75
--- /dev/null
+++ b/blog/post/2018-12-06.html
@@ -0,0 +1,166 @@
+<html><head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<meta name="theme-color" content="#000000">
+<title>Chrisoft::Blog</title>
+<script type="text/javascript" src="/panel.js"></script>
+<script type="text/javascript" src="/blog/footnoter.js"></script>
+<script type="text/javascript" src="/blog/aes-js.js"></script>
+<script type="text/javascript" src="/blog/scrypt.js"></script>
+<script type="text/javascript" src="/blog/sha256.js"></script>
+<script type="text/javascript" src="/blog/decryptor.js"></script>
+<link rel="stylesheet" type="text/css" href="/common.css">
+<link rel="stylesheet" type="text/css" href="/panel.css">
+<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
+<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
+<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
+<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
+<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
+<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
+<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
+<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
+<link rel="stylesheet" type="text/css" href="/blog/blogext.css">
+<script>
+function ol()
+{
+ window.onresize=function()
+ {
+ if(window.innerWidth<768)
+ setupevents();
+ else unsetevents();
+ }
+ window.onresize();
+ _decryptonload();
+}
+function loadTheme(){
+ var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
+ if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
+ var ent="";
+ var d=new Date();
+ if(thm[0]=='z')
+ {
+ var m=d.getMonth()+1;
+ if(m>=3&&m<6)thm='0'+thm[1];
+ else if(m>=6&&m<9)thm='1'+thm[1];
+ else if(m>=9&&m<12)thm='2'+thm[1];
+ else thm='3'+thm[1];
+ }
+ if(thm[1]=='z')
+ {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
+ ent=`theme${thm}`;
+ var R=new RegExp('theme[0-4][ab]');
+ for(var i=0;i<document.styleSheets.length;++i)
+ {
+ if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
+ document.styleSheets[i].disabled=true;
+ else document.styleSheets[i].disabled=false;
+ }
+ var thmcolor="";
+ switch(thm[0])
+ {
+ case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break;
+ case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break;
+ case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break;
+ case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break;
+ }
+ document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor);
+}
+loadTheme();
+</script>
+</head>
+<body onload="ol()" style="overflow-x:hidden;">
+ <div id="panel" class="TText">
+ <ul id="panellist">
+ <li><a href="/"><h1>Chrisoft</h1></a></li>
+ <li><a href="/blog"><h2>Blog</h2></a></li>
+ <li><a href="#"><h3 id="title">小米 MIX 3 上手体验</h3></a></li>
+ <li><span>Tags</span>
+ <ul id="tagslist">
+ <li><a href="/blog/list/device-review/">device-review</a></li><li><a href="/blog/list/hands-on/">hands-on</a></li></ul>
+ </li>
+ <li id="tocouter">
+ <span>Table of Contents</span>
+ <ul id="tocroot">
+ <li><a class="toctarg" href="#tocanch0">前言</a></li><li><a class="toctarg" href="#tocanch1">购买前</a></li><li><a class="toctarg" href="#tocanch2">剁手</a></li><li><a class="toctarg" href="#tocanch3">到货</a></li><li><a class="toctarg" href="#tocanch4">第一印象</a></li><li><a class="toctarg" href="#tocanch5">「偷工减料」和「虚假宣传」</a></li><li><a class="toctarg" href="#tocanch6">换掉令人<sup>我</sup>痛苦的 MIUI</a></li><li><a class="toctarg" href="#tocanch7">终于,小米脱掉了……</a></li></ul>
+ </li>
+ <li style="margin-left:-0.5em"><a id="prevp" href="2018-10-11.html">Prev post</a></li>
+ <li style="margin-left:-0.5em"><a id="nextp" href="TOP.html">Next post</a></li>
+ </ul>
+ </div>
+ <div id="content">
+ <h2 id="titleh" class="TText" style="font-wight:normal;">小米 MIX 3 上手体验</h2>
+ <div id="datetags" class="TText" style="margin-bottom:1em;">2018-12-06<br>#device-review #hands-on</div>
+ <hr><div id="article" class="TText"><article>
+<h2 id="tocanch0" class="tvis">前言</h2>
+<p>第三次买小米的东西,同时也是第二次买小米的手机。跟很多「米粉」相比, 这个数量应该还不到他们的零头。</p>
+<p>前两次使用小米的产品,印象都不能算好。<a href="https://chrisoft.org/blog/post/2017-02-13.html#tocanch5">小米 MAX</a> 不到一年开始自动重启, 至于小米<del>铁圈</del>圈铁 Pro <a id="n1" href="#note1" class="note">[1]</a>, 说好的大概都是骨灰级米粉。</p>
+<p>怎奈 Galaxy Note 4 里与奔腾 4 一样辣鸡的骁龙 805 实在不争气,不光能让塑料壳手机当暖手宝用,续航更是尿崩。 于是就又有了败家的想法。</p>
+<h2 id="tocanch1" class="tvis">购买前</h2>
+<p>早在去年,我就给自己以后的手机选择立下了三条规矩:</p>
+<ul>
+<li>拒绝任何形式的缺口屏<a id="n2" href="#note2" class="note">[2]</a></li>
+<li>拒绝无 3.5 mm 耳机插孔的机型</li>
+<li>拒绝将两个摄像头纵向排列在背面角落的机型</li>
+</ul>
+<p><a id="n3" href="#note3" class="note">[3]</a></p>
+<p>除此之外还有额外的几条加分项: - 可以有办法获得接近 AOSP 的体验,官方提供则更好。 - OLED 2k 屏 <a id="n4" href="#note4" class="note">[4]</a></p>
+<p>上面的三条规矩的重要程度基本上是递减的:我不能忍受任何屏幕被啃掉一块的机型, 然而耳机插孔和摄像头排列相对就没有那么重要了。尤其是在给 Galaxy Note 4 配上无线充电后,发现 Micro-USB 的使用频率已经非常低了。这么一来后面两个规矩就几乎形同虚设了。</p>
+<p>至于加分项,得益于 Project Treble ,现在的大多数 Android 手机大概都能满足第一项。 第二条则相对比较难以满足了,于是后来它就被拆分成了两个单独的条目。</p>
+<p>机型选择上,首先看上的还是「老朋友」 Nokia 的 Nokia 8,然而该机型在中国实在难以购得。 于是又盯上了它的后续版本 Nokia 8 Sirocco。然而它的价格对于一款采用过时平台的手机来说有点高了。 后来又想到了用了6年多的三星,可惜三星现在的高端机型也是完全买不起的。于是我打算11月中旬去香港的时候顺便看一圈再决定了。 <a id="n5" href="#note5" class="note">[5]</a></p>
+<p>就在这个时候,小米发布了 MIX 3。我向来不是非常关注小米的产品。发布会看了5秒就关掉了, 只看到一个雷军在故宫的什么建筑物前面「做现场的表演」。过了几天看了一眼相关信息,觉得好像还可以(除了犯了规矩的后两条, 以及小米万年的 1080p 屏幕)。于是就计划再给小米一次改变我对它的看法的机会,做了「先买再说,不行7天退货」的打算。</p>
+<p>当然在购买前我已经做好了一部分钱会打水漂的心理准备:因为从来不用前置摄像头, 所以花在这些东西连同被吹得特别厉害的滑盖<a id="n6" href="#note6" class="note">[6]</a> 上的钱就相当于浪费掉了;还有永远不会用到的 16GB 之后的存储空间。<del>这些钱是永远也会不来了。</del></p>
+<h2 id="tocanch2" class="tvis">剁手</h2>
+<p>有着「猴王」美称的雷军怎么可能让我这只不谙世道的小猴子顺利购买他们的最新机型呢。11月1号第一批在最多20秒之后就……没有了。 于是只好等11月11号。</p>
+<p>11月11号的开卖时间是凌晨0点。这对在23:00以后只能在宿舍玩手机的我是极大的一个不利。0点过去了, 小米官网的购买通道果然进入了预期中的无限排队模式。无奈只好试一下小米的×猫官方旗舰店,发现还有货, 不过只剩下了 6/128 和 8/256 的型号。这就让本来计划购买 8/128 版本的我十分为难了。后来在 「既然已经被小米坑了3000多元了,再多被坑400元也不是什么大问题」的思想的唆使下,剁了 8/256 的型号。 (于是永远被浪费掉得存储空间变得更多了)</p>
+<h2 id="tocanch3" class="tvis">到货</h2>
+<p>付款之后,小米迟迟没有发货的迹象。直到15号我的飞机已经在香港落地之后货才发出。当然顺丰依然是跟往常一样快, 似乎根本没有受到「双十一」<a id="n7" href="#note7" class="note">[7]</a>的影响, 第二天就到货了。托了一个同学帮忙去取。他在拿到快递之后的第一句话是「包装好简陋啊」。嗯……不祥的预感。</p>
+<p>从香港回来之后看到了静静躺在我的桌子上的 MIX 3 包装盒,还有一张「价值300元」 <a id="n8" href="#note8" class="note">[8]</a>的小米移动电话卡。开箱做了各种检查之后,发现不幸并没有降临在我的头上。 真是万幸(</p>
+<h2 id="tocanch4" class="tvis">第一印象</h2>
+<ul>
+<li>重。MIX 3 用了一段时间再次拿起 Galaxy Note 4 的时候,会觉得塑料壳手机好轻(</li>
+<li>滑。后盖简直可以当镜子用。比塑料壳手机看起来不知道要高到那里去了。<del>然而滑到不加壳根本不敢用,所以最后还是塑料壳手机。</del> 同时后壳还是指纹收集器。</li>
+</ul>
+<p>整部手机的外形尺寸与 Galaxy Note 4 几乎一致(宽度稍窄,长度略长),却比 Galaxy Note 4 重了 25%。 「半斤米」真是名不虚传。</p>
+<p>没有遇到网传的屏幕左右晃动问题。我手里这台的屏幕晃动幅度不比任何一台曾经用过的滑盖手机大。 1080p 的屏幕当然没有 1440p 的细腻,但是「又不是不能用」(</p>
+<p>至于被小米吹爆的拍照,感觉实际表现一般般。下面这张是从辣鸡专科学校宿舍里拍的 (point-and-shoot,全为自动设定)。 作为对比,右边一张是 Galaxy Note 4 <a id="n9" href="#note9" class="note">[9]</a> 拍的。 (其实我关掉过拍照水印。但是为了拍这张照片专门恢复了全部初始设定。另外我认为拍照上打水印属于作弊行为 —— 与考试在试卷上做答题以外的记号毫无区别。)</p>
+<p>图</p>
+<p>与人眼的感受相比,MIX 3 的图像明显过亮。相比之下 Galaxy Note 4 的结果更接近实际感受(噪点数量不接近)。 <del>至于什么 DxOMark,都是钱买来的,当笑话看就好。</del> <a id="n10" href="#note10" class="note">[10]</a></p>
+<h2 id="tocanch5" class="tvis">「偷工减料」和「虚假宣传」</h2>
+<p>首先放一张扫图跟官方渲染图的叠加照片</p>
+<p>图</p>
+<p>可以看到,四侧边框均有所膨胀(由于对齐问题,左侧的边框比右侧膨胀得多些)。 作为一个3元的方便面包装上能画出牛肉的国家的公民,对这样的「虚假宣传」当然是司空见惯。 但是毕竟苹果都不会拿渲染图来糊弄人,小米这种「果粉」企业,就不能从苹果身上学点好东西吗(</p>
+<p>另外在官网参数的传感器一栏,MIX 3 似乎缺少了气压计和霍尔传感器。当时我在付款后才发现这点。 于是对阉割旗舰机传感器的小米感到失望。然而机器到手之后,发现实际上是有这两个传感器的。 <del>这应该也算虚假宣传吧?</del></p>
+<p>最后,看到 gsmarena 上写的屏幕玻璃是 Corning Gorilla Glass (unspecified version) 就感到了一丝不安。 没过多久我刚离开桌子几步手机就(由于未知的原因)从桌子上掉了下去。背面着地,捡起来一看好像没事。(还好已经套了壳,不然……) 过了几天仔细观察才发现屏幕上已经有了划痕(一处相对不明显的面积约中号记号笔点一个点那么大,另一处是一个凹坑)。 已知是 Corning Gorilla Glass 4 的 Galaxy Note 4 用了一年半还没有什么肉眼可见的划痕。嗯……可以确定 MIX 3 的屏幕玻璃肯定不是 Corning Gorilla Glass 4 了。 <a id="n11" href="#note11" class="note">[11]</a></p>
+<h2 id="tocanch6" class="tvis">换掉令人<sup>我</sup>痛苦的 MIUI</h2>
+<p>可以说 MIUI 是我关于这台手机最担心的特性了。</p>
+<h2 id="tocanch7" class="tvis">终于,小米脱掉了……</h2>
+<p>我给它戴上的「二流品牌」的帽子?</p>
+<p>也许还没有。至少没有完全脱掉。</p>
+</article>
+</div><br><hr>
+ <div class="TText" id="notediv" style="font-size:80%;"><span class="TText"><a id="note1" href="#n1">[1]</a>: <del>听音乐只能听到_Hi_-hat,所以是_Hi_-Res Audio(</del><br></span><span class="TText"><a id="note2" href="#n2">[2]</a>: 圆角屏幕并不在此列<br></span><span class="TText"><a id="note3" href="#n3">[3]</a>: 将符合上面三条的手机筛选出来,你会发现某水果公司生产的奢侈品赫然在列。 当然原因并不全是因为我是 "Apple Hater",主要还是对其他厂商无故跟风的嫌弃(<br></span><span class="TText"><a id="note4" href="#n4">[4]</a>: <s>主要是不想要一台比旧手机屏幕更差的新机(</s><br></span><span class="TText"><a id="note5" href="#n5">[5]</a>: <del>全怪苹果恶意哄抬物价</del> 不过三星的旧机型价格跳水仍然很严重,然而这次不太想买过时平台的机型了。<br></span><span class="TText"><a id="note6" href="#n6">[6]</a>: 我曾经宣称到手就会吧屏幕用502粘起来, 但是现在发现玩起来找回了当年玩高中同学的 Nokia X3 的感觉(lbz是不是打喷嚏了),所以就没有粘。<br></span><span class="TText"><a id="note7" href="#n7">[7]</a>: 有人能告诉我这个东西是怎么被硬生生地从无到有造出来的吗?<br></span><span class="TText"><a id="note8" href="#n8">[8]</a>: 实际价值&lt;10元<br></span><span class="TText"><a id="note9" href="#n9">[9]</a>: 非官方系统 (LineageOS 15.1)<br></span><span class="TText"><a id="note10" href="#n10">[10]</a>: <a href="https://www.gsmarena.com/dxomark_the_iphone_xr_is_unrivaled_among_singlecamera_phones-news-34592.php">一向看不上DxOMark的苹果最终忍不住也来给他们塞钱了</a><br></span><span class="TText"><a id="note11" href="#n11">[11]</a>: 我从不把手机和钥匙放在一起。唯一跟 MIX 3 放在一起的就是 Galaxy Note 4。塑料不可能划伤玻璃, 有作案能力的只剩 Note 4 可怜的两圈金属边框了。<br></span></div>
+ <div id="insanch" style="height:3em;"></div>
+ <div id="footer" style="">
+ <div id="pagesw" class="TText" style="width:100%;height:0.5em;"></div>
+ <div style="text-align:center;" class="TText">
+ Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5
+ <br>
+ Content licensed under CC BY-SA 4.0. <span id="purgep" style="display:none;font-size:70%;">This page has passphrase(s) stored. Click <a href="javascript:_purgep()">here</a> to purge.</span>
+ </div>
+ </div>
+ <div id="cmdbuf" class="TText" style="transition:500ms;padding:1em;font-size:2em;color:white;position:absolute;background-color:rgba(0,0,0,0.6);left:50%;top:50%;transform:translate(-50%,-50%);pointer-events:none;opacity:0;">
+ </div>
+ </div>
+ <div id="decryptui" style="display:none;opacity:0;color:white;z-index:1000;position:fixed;left:0;top:0;width:100%;height:100%;background-color:rgba(0,0,0,0.4);transition:opacity 0.5s;">
+ <div id="decryptdlg" class="TText" style="padding:10px 20px;position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);background-color:rgba(0,0,0,0.6);">
+ <div id="keyhint" style="margin-bottom:8px;"></div>
+ <div style="margin-bottom:8px;">Key: <input id="keyinp" type="text" style="color:#fff;"></div>
+ <div style="height:2.25em;">
+ <button id="btndecrypt" onclick="decryptor(decid,document.getElementById('keyinp').value);" style="position:absolute;left:20px;">Decrypt</button>
+ <button onclick="hidedecryptui();" style="position:absolute;right:20px;">Cancel</button>
+ </div>
+
+ </div>
+
+
+</div></body></html> \ No newline at end of file
diff --git a/blog/post/TOP.html b/blog/post/TOP.html
new file mode 100644
index 0000000..742239e
--- /dev/null
+++ b/blog/post/TOP.html
@@ -0,0 +1,253 @@
+<html><head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<meta name="theme-color" content="#000000">
+<title>Chrisoft::Blog</title>
+<script type="text/javascript" src="/panel.js"></script>
+<script type="text/javascript" src="/blog/footnoter.js"></script>
+<script type="text/javascript" src="/blog/aes-js.js"></script>
+<script type="text/javascript" src="/blog/scrypt.js"></script>
+<script type="text/javascript" src="/blog/sha256.js"></script>
+<script type="text/javascript" src="/blog/decryptor.js"></script>
+<link rel="stylesheet" type="text/css" href="/common.css">
+<link rel="stylesheet" type="text/css" href="/panel.css">
+<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
+<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
+<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
+<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
+<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
+<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
+<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
+<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
+<link rel="stylesheet" type="text/css" href="/blog/blogext.css">
+<script>
+function ol()
+{
+ window.onresize=function()
+ {
+ if(window.innerWidth<768)
+ setupevents();
+ else unsetevents();
+ }
+ window.onresize();
+ _decryptonload();
+}
+function loadTheme(){
+ var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
+ if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
+ var ent="";
+ var d=new Date();
+ if(thm[0]=='z')
+ {
+ var m=d.getMonth()+1;
+ if(m>=3&&m<6)thm='0'+thm[1];
+ else if(m>=6&&m<9)thm='1'+thm[1];
+ else if(m>=9&&m<12)thm='2'+thm[1];
+ else thm='3'+thm[1];
+ }
+ if(thm[1]=='z')
+ {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
+ ent=`theme${thm}`;
+ var R=new RegExp('theme[0-4][ab]');
+ for(var i=0;i<document.styleSheets.length;++i)
+ {
+ if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
+ document.styleSheets[i].disabled=true;
+ else document.styleSheets[i].disabled=false;
+ }
+ var thmcolor="";
+ switch(thm[0])
+ {
+ case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break;
+ case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break;
+ case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break;
+ case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break;
+ }
+ document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor);
+}
+loadTheme();
+</script>
+</head>
+<body onload="ol()" style="overflow-x:hidden;">
+ <div id="panel" class="TText">
+ <ul id="panellist">
+ <li><a href="/"><h1>Chrisoft</h1></a></li>
+ <li><a href="/blog"><h2>Blog</h2></a></li>
+ <li><a href="#"><h3 id="title">Readme_en</h3></a></li>
+ <li><span>Tags</span>
+ <ul id="tagslist">
+ <li><a href="/blog/list/garbage/">garbage</a></li></ul>
+ </li>
+ <li id="tocouter">
+ <span>Table of Contents</span>
+ <ul id="tocroot">
+ <li><a class="toctarg" href="#tocanch0">Early life</a></li><li><ul class="tocnode"><li><a class="toctarg" href="#tocanch1">Preschool and elementary school life</a></li></ul></li><li><a class="toctarg" href="#tocanch2">Known problems</a></li></ul>
+ </li>
+ <li style="margin-left:-0.5em"><a id="prevp" href="2018-12-06.html">Prev post</a></li>
+ <li style="margin-left:-0.5em"><a id="nextp">Next post</a></li>
+ </ul>
+ </div>
+ <div id="content">
+ <h2 id="titleh" class="TText" style="font-wight:normal;">Readme_en</h2>
+ <div id="datetags" class="TText" style="margin-bottom:1em;">2016-02-13<br>#garbage</div>
+ <hr><div id="article" class="TText">
+<article>
+<table style="float:right;width:320px;background-color:rgba(255,255,255,0.2);text-align:left;font-size:0.8em;margin-left:10px;">
+<style>
+td{padding-top:5px;padding-bottom:5px;vertical-align:top;}
+</style>
+<tbody><tr><td colspan="2" style="text-align:center;font-size:1.25em;">
+Chris Xiong<br>熊??
+</td></tr>
+<tr><td colspan="2" style="text-align:center;font-size:1.25em;">
+<p>Photo not available.</p>
+</td></tr>
+<tr><td colspan="2" style="background-color:rgba(124,124,192,0.6);text-align:center;font-size:1.25em;">
+Details
+</td></tr>
+<tr>
+<td>Species</td>
+<td><i>Homo sapiens</i></td>
+</tr>
+<tr>
+<td>Born</td>
+<td>October 24, 1997 (age 18)<br>Dongying, Shandong, China</td>
+</tr>
+<tr>
+<td>Abilities</td>
+<td>Mainly the ability to manipulate electronic devices</td>
+</tr>
+<tr>
+<td>Nationality</td>
+<td>Chinese</td>
+</tr>
+<tr>
+<td>Political party</td>
+<td>None</td>
+</tr>
+<tr>
+<td>Political belief</td>
+<td>Unclear</td>
+</tr>
+<tr>
+<td>Religion</td>
+<td>None</td>
+</tr>
+<tr>
+<td>Occupation</td>
+<td>None</td>
+</tr>
+<tr>
+<td>Sighted at...</td>
+<td>
+Computer room<br>
+Utility room<br>
+<s>E-waste-filled basement<s><br>
+<s>Electrical room<s><br>
+<s>Home<s>
+</s></s></s></s></s></s></td>
+</tr>
+<tr>
+<td>Signature</td>
+<td><img src="/data/chris_xiong_signature.svg" width="160px" alt="Chris_Xiong_Signature" decoding="async"></td>
+</tr>
+<tr>
+<td>Website</td>
+<td><a href="https://chrisoft.org">chrisoft.org</a></td>
+</tr>
+</tbody></table>
+
+<table style="border:1px solid #aaa;display:table;margin:auto;background-color:rgba(0,0,0,0);"><tbody><tr>
+<td>
+<img alt="warning" src="https://upload.wikimedia.org/wikipedia/commons/f/f4/Ambox_content.png" decoding="async">
+</td>
+<td>
+This blog post is written in a mock wikipedia style. However, it's an autobiography.<br>
+<s>For reference only!</s> Just for fun!
+</td>
+</tr>
+</tbody></table>
+
+<p>
+Chris Xiong is a Chinese programmer <s>(now upgrading to a software engineer)</s>. He hasn't make
+any significant contribution to the world of computer yet.
+</p>
+
+<div style="padding:7px;border:1px solid #aaa;display:table;">
+<div style="text-align:center;">
+<b>Contents</b> [<a href="#" onclick="var e=document.getElementById(&quot;toc&quot;);if(e.style.display==&quot;block&quot;){e.style.display=&quot;none&quot;;this.innerHTML=&quot;show&quot;;}else {e.style.display=&quot;block&quot;;this.innerHTML=&quot;hide&quot;;}">hide</a>]
+</div>
+<ul style="font-size:0.9em;display:block;list-style-type:none;" id="toc">
+ <li><a href="#c1">1 Early life</a>
+ <ul>
+ <li><a href="#c1_1">1.1 Preschool and elementary school life</a></li>
+ <li>1.2 Middle school life</li>
+ </ul>
+ </li>
+ <li>2 Current Status
+ <ul>
+ <li>2.1 Education</li>
+ <li>2.2 Hobbies</li>
+ <li>2.3 Entertainment</li>
+ </ul>
+ </li>
+ <li>3 Skills</li>
+ <li>4 Personality</li>
+ <li>5 Works
+ <ul>
+ <li>5.1 Early works</li>
+ <li>5.2 WHG3D</li>
+ <li>5.3 Ballance Remix</li>
+ <li>5.4 the BLR series</li>
+ <li>5.5 FOSS Projects</li>
+ <li>5.6 Other minor works</li>
+ </ul>
+ </li>
+ <li><a href="#c6">6 Known problems</a></li>
+</ul>
+</div>
+<style>
+article h2,article h3{border-bottom:1px solid #c0c0c0;overflow:hidden;}
+</style>
+<h2 id="tocanch0" class="tvis">Early life</h2>
+As a child of two outer party members, Chris Xiong's childhood life differs from most peers.
+As a result, his childhood life is often described as "dull" by others.
+However, he insists that is not the case.
+<h3 id="tocanch1" class="tvis">Preschool and elementary school life</h3>
+Chris Xiong did not go to kindergarten as other childs.
+<h2 id="tocanch2" class="tvis">Known problems</h2>
+<ul>
+<li>The task scheduler is crappy.</li>
+<li>A fault tolerant kernel is needed.</li>
+<li>We need a new execution control module.</li>
+</ul>
+<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>
+<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>
+</article>
+</div><br><hr>
+ <div class="TText" id="notediv" style="font-size:80%;"></div>
+ <div id="insanch" style="height:3em;"></div>
+ <div id="footer" style="">
+ <div id="pagesw" class="TText" style="width:100%;height:0.5em;"></div>
+ <div style="text-align:center;" class="TText">
+ Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5
+ <br>
+ Content licensed under CC BY-SA 4.0. <span id="purgep" style="display:none;font-size:70%;">This page has passphrase(s) stored. Click <a href="javascript:_purgep()">here</a> to purge.</span>
+ </div>
+ </div>
+ <div id="cmdbuf" class="TText" style="transition:500ms;padding:1em;font-size:2em;color:white;position:absolute;background-color:rgba(0,0,0,0.6);left:50%;top:50%;transform:translate(-50%,-50%);pointer-events:none;opacity:0;">
+ </div>
+ </div>
+ <div id="decryptui" style="display:none;opacity:0;color:white;z-index:1000;position:fixed;left:0;top:0;width:100%;height:100%;background-color:rgba(0,0,0,0.4);transition:opacity 0.5s;">
+ <div id="decryptdlg" class="TText" style="padding:10px 20px;position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);background-color:rgba(0,0,0,0.6);">
+ <div id="keyhint" style="margin-bottom:8px;"></div>
+ <div style="margin-bottom:8px;">Key: <input id="keyinp" type="text" style="color:#fff;"></div>
+ <div style="height:2.25em;">
+ <button id="btndecrypt" onclick="decryptor(decid,document.getElementById('keyinp').value);" style="position:absolute;left:20px;">Decrypt</button>
+ <button onclick="hidedecryptui();" style="position:absolute;right:20px;">Cancel</button>
+ </div>
+
+ </div>
+
+
+</div></body></html> \ No newline at end of file
diff --git a/blog/sbs_1/bloglist.php b/blog/sbs_1/bloglist.php
new file mode 100644
index 0000000..32e59b7
--- /dev/null
+++ b/blog/sbs_1/bloglist.php
@@ -0,0 +1,77 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<meta http-equiv="expires" content="Friday 24 October 1997 09:30 GMT">
+<meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Chrisoft::Blog</title>
+ <link rel=stylesheet href='../common.css' type='text/css'>
+ <link rel=stylesheet href='extras.css' type='text/css'>
+ <script type="text/javascript">
+function ol()
+{
+if( navigator.userAgent.match(/Android/i)
+ || navigator.userAgent.match(/webOS/i)
+ || navigator.userAgent.match(/iPhone/i)
+ || navigator.userAgent.match(/iPad/i)
+ || navigator.userAgent.match(/iPod/i)
+ || navigator.userAgent.match(/BlackBerry/i)
+ || navigator.userAgent.match(/Windows Phone/i)
+ )
+ document.getElementById("tab").style.width="96%";
+}
+ </script>
+</head>
+<body onload="ol()">
+ <table id="tab" border="0" style="width:70%;margin:auto;">
+ <tr>
+ <td class="CTitle" style="font-size:2em;" colspan="2">
+ <a href="../">Chrisoft</a>::Blog
+ </td>
+ </tr>
+ <tr>
+ <td class="TText" colspan="2" style="padding:10px;">
+ <div style="font-size:200%">Deprecated. The new blog system is available <a href="/blog">here</a>.</div>
+ WARNING: You've entered the dangerous zone.<br>
+ I occasionally empty the trash in my brain here...<br>
+ Browse with care!<br>
+ Most posts are in Chinese...
+ </td>
+ </tr>
+ <tr><td class="TText" colspan="2">
+ <?php
+ $files=scandir("/var/www/html/blog/content",1);
+ for($i=0,$c=count($files);$i<$c;$i++)
+ {
+ if(!(strstr($files[$i],"txt")))continue;
+ if(strstr($files[$i],"swp"))continue;
+ $fn=sprintf("/var/www/html/blog/content/%s",$files[$i]);
+ $handle=fopen($fn, "r");
+ $title="";$date="";$tags="";
+ if($handle)
+ {
+ $title=fgets($handle,4096);
+ $date=fgets($handle,4096);
+ $tags=fgets($handle,4096);
+ fclose($handle);
+ }
+ if(!strstr($tags,"devel"))
+ {
+ echo "<tr><td class=\"TText\" style=\"width:50%;\">";
+ $cur=sprintf("<a href=\"./blogreader.php?p=%s\">%s</a>",substr($files[$i],0,strlen($files[$i])-4),$title);
+ echo $cur;
+ echo "</td><td class=\"TText\" style=\"width:50%;\">";
+ echo $date;
+ echo "</td></tr>";
+ }
+ }
+ ?>
+ </td></tr>
+ <tr>
+ <td class="TText" colspan="2" style="padding:10px;text-align:center;">
+ Proudly powered by SBS <reduced>(the stupid blogging system)</reduced>.<br>
+ Content licensed under CC BY-SA 4.0.
+ </td>
+ </tr>
+ </table>
+</body>
diff --git a/blog/sbs_1/bloglista.php b/blog/sbs_1/bloglista.php
new file mode 100644
index 0000000..bb762b7
--- /dev/null
+++ b/blog/sbs_1/bloglista.php
@@ -0,0 +1,202 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<meta http-equiv="expires" content="Friday 24 October 1997 09:30 GMT">
+ <title>Chrisoft::Blog</title>
+ <link rel=stylesheet href='../common.css' type='text/css'>
+ <link rel=stylesheet href='extras.css' type='text/css'>
+ <style type="text/css">
+ div#button
+ {
+ display:table;
+ position:fixed;
+ top:50%;
+ margin-top:-3.5em;
+ width:4em;
+ height:7em;
+ text-align:center;
+ font-weight:bold;
+ background-color:rgba(255,204,255,0.5);
+ color:#EE8899;
+ }
+ div#button:hover
+ {
+ background-color:rgba(255,220,255,0.7);
+ color:#FF66CC;
+ }
+ </style>
+ <script type="text/javascript">
+ var titles=[],dates=[],links=[],elems=[],oldelems=[],xs=[],ys=[];
+ var numPost=5;
+ var startIdx=0;
+ var dragging=null;
+ var xp=0,yp=0,xe=0,ye=0;
+ function chk(tx,ty)
+ {
+ for(var i=0;i<xs.length;++i)
+ if(Math.hypot(tx-xs[i],ty-ys[i])<100)return 1;
+ return 0;
+ }
+ function dragInit(e)
+ {
+ dragging=e;xe=xp-dragging.offsetLeft;ye=yp-dragging.offsetTop;
+ e.style.transition="none";
+ }
+ function onMove(e)
+ {
+ xp=document.all?window.event.clientX:e.pageX;
+ yp=document.all?window.event.clientY:e.pageY;
+ if(dragging!==null)
+ {
+ dragging.style.left=(xp-xe)+'px';
+ dragging.style.top=(yp-ye)+'px';
+ }
+ }
+ function initTile(obj,inv)
+ {
+ var t=0;
+ t=Math.random()*window.innerHeight;
+ obj.style.top=t.toString()+'px';
+ t=window.innerWidth+Math.random()*window.innerWidth*0.7+window.innerWidth*0.1;
+ if(inv==1)t-=2*window.innerWidth;
+ obj.style.left=t.toString()+'px';
+ t=Math.random()*360;
+ obj.style.transform='rotate('+t.toString()+'deg)';
+ }
+ function launchTileIn(obj)
+ {
+ var tx=0,ty=0;
+ obj.style.transition="all 0.5s ease-out";
+ do{
+ tx=Math.random()*window.innerHeight*0.35+window.innerHeight*0.35;
+ ty=Math.random()*window.innerWidth*0.6+window.innerWidth*0.1;
+ }while(chk(tx,ty)==1);
+ obj.style.top=tx.toString()+'px';
+ obj.style.left=ty.toString()+'px';
+ xs.push(tx);ys.push(ty);
+ tx=Math.random()*90-45;
+ obj.style.transform='rotate('+tx.toString()+'deg)';
+ }
+ function launchTileOut(obj,inv)
+ {
+ var t=0;
+ obj.style.transition="all 0.5s ease-in";
+ t=Math.random()*window.innerHeight;
+ obj.style.top=t.toString()+'px';
+ t=0-obj.offsetWidth-Math.random()*window.innerWidth;
+ if(inv==1)t=window.innerWidth-t;
+ obj.style.left=t.toString()+'px';
+ t=Math.random()*90-45;
+ obj.style.transform='rotate('+t.toString()+'deg)';
+ }
+ function createTile(id)
+ {
+ var e=document.createElement("table");
+ e.className="TText";
+ e.style.position="fixed";
+ e.style.cursor="move";
+ e.style.boxShadow="1px 1px 1px 1px #333333";
+ e.innerHTML="<tr><td><a href=\""+links[id]+"\">"+titles[id]+"</a></td></tr><tr><td>"+dates[id]+"</td></tr>";
+ e.onmousedown=function(){dragInit(e);return false;};
+ elems.push(e);
+ document.getElementsByTagName("body")[0].appendChild(e);
+ return e;
+ }
+ function createGroup(inv)
+ {
+ xs.length=ys.length=0;
+ for(var i=0;i<numPost;++i)
+ {
+ if(startIdx+i>=titles.length)break;
+ var e=createTile(startIdx+i);
+ initTile(e,inv);
+ }
+ setTimeout(
+ function(){for(var i=0;i<elems.length;++i)launchTileIn(elems[i]);}
+ ,500);
+ }
+ function lastGroup()
+ {
+ if(startIdx-numPost<0)return;
+ oldelems=elems.slice(0);elems.length=0;
+ for(var i=0;i<oldelems.length;++i)launchTileOut(oldelems[i],1);
+ setTimeout(
+ function(){for(var i=0;i<oldelems.length;++i)oldelems[i].remove();}
+ ,500);
+ startIdx-=numPost;
+ createGroup(1);
+ }
+ function nextGroup()
+ {
+ if(startIdx+numPost>=titles.length)return;
+ oldelems=elems.slice(0);elems.length=0;
+ for(var i=0;i<oldelems.length;++i)launchTileOut(oldelems[i],0);
+ setTimeout(
+ function(){for(var i=0;i<oldelems.length;++i)oldelems[i].remove();}
+ ,500);
+ startIdx+=numPost;
+ createGroup(0);
+ }
+ function onWheel(e)
+ {
+ var wdelta=e.wheelDelta||-e.detail;
+ if(wdelta<0)nextGroup();
+ if(wdelta>0)lastGroup();
+ }
+ function init()
+ {
+ document.addEventListener("mousewheel",onWheel,false);
+ document.addEventListener("DOMMouseScroll",onWheel,false);
+ document.onmousemove=onMove;
+ document.onmouseup=function(){dragging=null;};
+ createGroup();
+ }
+ </script>
+</head>
+<body onload="init();">
+ <table border="0" style="width:70%;margin:auto;">
+ <tr>
+ <td class="CTitle" style="font-size:2em;" colspan="2">
+ <a href="../">Chrisoft</a>::Blog
+ </td>
+ </tr>
+ <tr>
+ <td class="TText" colspan="2" style="padding:10px;">
+ WARNING: You've entered the dangerous zone.<br>
+ I occasionally empty the trash in my brain here...<br>
+ Browse with care!<br>
+ Most posts are in Chinese...
+ </td>
+ </tr>
+ </table>
+ <div onmousedown="lastGroup();" id="button" style="left:0;">
+ <span style="display:table-cell;vertical-align:middle;">&lt;</span>
+ </div>
+ <div onmousedown="nextGroup();" id="button" style="right:0;">
+ <span style="display:table-cell;vertical-align:middle;">&gt;</span>
+ </div>
+ <script type="text/javascript">
+ <?php
+ $files=scandir("/var/www/html/blog/content",1);
+ for($i=0,$c=count($files);$i<$c;$i++)
+ {
+ if(!(strstr($files[$i],"txt")))continue;
+ if(strstr($files[$i],"swp"))continue;
+ $fn=sprintf("/var/www/html/blog/content/%s",$files[$i]);
+ $handle=fopen($fn, "r");
+ $title="";$date="";
+ if($handle)
+ {
+ $title=fgets($handle,4096);
+ $date=fgets($handle,4096);
+ fclose($handle);
+ }
+ $title=substr($title,0,strlen($title)-1);
+ $date=substr($date,0,strlen($date)-1);
+ $cur=sprintf("links.push(\"./blogreader.php?p=%s\");titles.push(\"%s\");dates.push(\"%s\");\n",substr($files[$i],0,strlen($files[$i])-4),$title,$date);
+ echo $cur;
+ }
+ ?>
+ </script>
+</body>
diff --git a/blog/sbs_1/blogreader.php b/blog/sbs_1/blogreader.php
new file mode 100644
index 0000000..5f55cc7
--- /dev/null
+++ b/blog/sbs_1/blogreader.php
@@ -0,0 +1,90 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<meta http-equiv="expires" content="Friday 24 October 1997 09:30 GMT">
+<meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Chrisoft::Blog</title>
+ <link rel=stylesheet href='../common.css' type='text/css'>
+ <link rel=stylesheet href='extras.css' type='text/css'>
+ <script type="text/javascript" src="footnoter.js"></script>
+ <script type="text/javascript" src="decryptor.js"></script>
+ <script type="text/javascript">
+function ol()
+{
+if( navigator.userAgent.match(/Android/i)
+ || navigator.userAgent.match(/webOS/i)
+ || navigator.userAgent.match(/iPhone/i)
+ || navigator.userAgent.match(/iPad/i)
+ || navigator.userAgent.match(/iPod/i)
+ || navigator.userAgent.match(/BlackBerry/i)
+ || navigator.userAgent.match(/Windows Phone/i)
+ )
+ document.getElementById("tab").style.width="96%";
+ footnoter();
+}
+ </script>
+</head>
+<body onload="ol()">
+ <table id="tab" border="0" style="width:70%;margin:auto;">
+ <tr>
+ <td class="CTitle" style="font-size:2em;">
+ <a href="../">Chrisoft</a>::<a href="./bloglist.php">Blog</a>
+ </td>
+ </tr>
+ <tr>
+ <td class="TText">
+ <?php
+ require_once("simple_html_dom.php");
+ $path=sprintf("/var/www/html/blog/content/%s.txt",$_GET["p"]);
+ $file=fopen($path,"r");
+ if(!$file)
+ {echo "Invalid parameter...";exit;}
+ $str=fgets($file,4096);
+ echo "<div style=\"text-align:center;font-size:1.7em\">".$str."</div><br>";
+ $str=fgets($file,4096);
+ echo "<div style=\"text-align:center;\">".$str."</div><br>";
+ $str=fgets($file,4096);
+ $str=fread($file,262144);
+ $html=str_get_html($str);
+ $encrypted=$html->find("encrypted");
+ for($i=0;$i<count($encrypted);++$i)
+ {
+ $key=$html->find("encrypted",$i)->key;
+ $html->find("encrypted",$i)->key=null;
+ $cont=$html->find("encrypted",$i)->innertext;
+ $html->find("encrypted",$i)->innertext="Encrypted content here. Click <a href=\"javascript:void(0)\" onclick=\"decryptui(".$i.")\">here</a> to decrypt.";
+ $contarr=str_split($cont);
+ $lcont=count($contarr);
+ $keyarr=str_split($key);
+ $lkey=count($keyarr);
+ $hash=5381;
+ for($j=0;$j<$lcont;++$j)
+ {
+ $hash=(($hash<<5)+$hash)+ord($contarr[$j]);
+ $hash&=0xFFFFFFFF;
+ $contarr[$j]^=$keyarr[$j%$lkey];
+ }
+ $retstr='';
+ array_walk($contarr,function($value)use(&$retstr){$retstr.=chr(ord($value));});
+ $html->find("encrypted",$i)->encont=base64_encode($retstr);
+ $html->find("encrypted",$i)->hash=$hash;
+ $html->find("encrypted",$i)->id="encrypted".$i;
+ }
+ echo $html;
+ fclose($file);
+ ?>
+ </td>
+ </tr>
+ <tr><td><hr><reduced id="notediv"></reduced></td></tr>
+ </table>
+ <div id="decryptui" style="display:none;opacity:0;color:white;z-index:10;position:fixed;left:0;top:0;width:100%;height:100%;background-color:rgba(0,0,0,0.4);transition:opacity 0.5s;">
+ <div class="TText" style="padding:20px;position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);background-color:rgba(0,0,0,0.6);">
+ <span id="keyhint"></span><br><br>
+ Key: <input id="keyinp" type="text"><br><br>
+ <button id="btndecrypt" onclick="decryptor(decid,document.getElementById('keyinp').value);" style="position:absolute;left:20px;">Decrypt</button>
+ <button onclick="hidedecryptui();" style="position:absolute;right:20px;">Cancel</button>
+ </form>
+ </div>
+ </body>
+</html>
diff --git a/blog/sbs_1/blossom.png b/blog/sbs_1/blossom.png
new file mode 100644
index 0000000..6f2c304
--- /dev/null
+++ b/blog/sbs_1/blossom.png
Binary files differ
diff --git a/blog/sbs_1/dbloglist.php b/blog/sbs_1/dbloglist.php
new file mode 100644
index 0000000..c2bd137
--- /dev/null
+++ b/blog/sbs_1/dbloglist.php
@@ -0,0 +1,75 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<meta http-equiv="expires" content="Friday 24 October 1997 09:30 GMT">
+<meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Chrisoft::Development Blog</title>
+ <link rel=stylesheet href='../common.css' type='text/css'>
+ <link rel=stylesheet href='extras.css' type='text/css'>
+ <script type="text/javascript">
+function ol()
+{
+if( navigator.userAgent.match(/Android/i)
+ || navigator.userAgent.match(/webOS/i)
+ || navigator.userAgent.match(/iPhone/i)
+ || navigator.userAgent.match(/iPad/i)
+ || navigator.userAgent.match(/iPod/i)
+ || navigator.userAgent.match(/BlackBerry/i)
+ || navigator.userAgent.match(/Windows Phone/i)
+ )
+ document.getElementById("tab").style.width="96%";
+}
+ </script>
+</head>
+<body onload="ol()">
+ <table id="tab" border="0" style="width:70%;margin:auto;">
+ <tr>
+ <td class="CTitle" style="font-size:2em;" colspan="2">
+ <a href="../">Chrisoft</a>::Development Blog
+ </td>
+ </tr>
+ <tr>
+ <td class="TText" colspan="2" style="padding:10px;">
+ <div style="font-size:200%">Deprecated. The new blog system is available <a href="/blog">here</a>.</div>
+ Development blog.<br>
+ Most posts here are in English...
+ </td>
+ </tr>
+ <tr><td class="TText" colspan="2">
+ <?php
+ $files=scandir("/var/www/html/blog/content",1);
+ for($i=0,$c=count($files);$i<$c;$i++)
+ {
+ if(!(strstr($files[$i],"txt")))continue;
+ if(strstr($files[$i],"swp"))continue;
+ $fn=sprintf("/var/www/html/blog/content/%s",$files[$i]);
+ $handle=fopen($fn, "r");
+ $title="";$date="";$tags="";
+ if($handle)
+ {
+ $title=fgets($handle,4096);
+ $date=fgets($handle,4096);
+ $tags=fgets($handle,4096);
+ fclose($handle);
+ }
+ if(strstr($tags,"devel"))
+ {
+ echo "<tr><td class=\"TText\" style=\"width:50%;\">";
+ $cur=sprintf("<a href=\"./dblogreader.php?p=%s\">%s</a>",substr($files[$i],0,strlen($files[$i])-4),$title);
+ echo $cur;
+ echo "</td><td class=\"TText\" style=\"width:50%;\">";
+ echo $date;
+ echo "</td></tr>";
+ }
+ }
+ ?>
+ </td></tr>
+ <tr>
+ <td class="TText" colspan="2" style="padding:10px;text-align:center;">
+ Proudly powered by SBS <reduced>(the stupid blogging system)</reduced>.<br>
+ Content licensed under CC BY-SA 4.0.
+ </td>
+ </tr>
+ </table>
+</body>
diff --git a/blog/sbs_1/dblogreader.php b/blog/sbs_1/dblogreader.php
new file mode 100644
index 0000000..d252c19
--- /dev/null
+++ b/blog/sbs_1/dblogreader.php
@@ -0,0 +1,90 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<meta http-equiv="expires" content="Friday 24 October 1997 09:30 GMT">
+<meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Chrisoft::Development Blog</title>
+ <link rel=stylesheet href='../common.css' type='text/css'>
+ <link rel=stylesheet href='extras.css' type='text/css'>
+ <script type="text/javascript" src="footnoter.js"></script>
+ <script type="text/javascript" src="decryptor.js"></script>
+ <script type="text/javascript">
+function ol()
+{
+if( navigator.userAgent.match(/Android/i)
+ || navigator.userAgent.match(/webOS/i)
+ || navigator.userAgent.match(/iPhone/i)
+ || navigator.userAgent.match(/iPad/i)
+ || navigator.userAgent.match(/iPod/i)
+ || navigator.userAgent.match(/BlackBerry/i)
+ || navigator.userAgent.match(/Windows Phone/i)
+ )
+ document.getElementById("tab").style.width="96%";
+ footnoter();
+}
+ </script>
+</head>
+<body onload="ol()">
+ <table id="tab" border="0" style="width:70%;margin:auto;">
+ <tr>
+ <td class="CTitle" style="font-size:2em;">
+ <a href="../">Chrisoft</a>::<a href="./dbloglist.php">Development Blog</a>
+ </td>
+ </tr>
+ <tr>
+ <td class="TText">
+ <?php
+ require_once("simple_html_dom.php");
+ $path=sprintf("/var/www/html/blog/content/%s.txt",$_GET["p"]);
+ $file=fopen($path,"r");
+ if(!$file)
+ {echo "Invalid parameter...";exit;}
+ $str=fgets($file,4096);
+ echo "<div style=\"text-align:center;font-size:1.7em\">".$str."</div><br>";
+ $str=fgets($file,4096);
+ echo "<div style=\"text-align:center;\">".$str."</div><br>";
+ $str=fgets($file,4096);
+ $str=fread($file,262144);
+ $html=str_get_html($str);
+ $encrypted=$html->find("encrypted");
+ for($i=0;$i<count($encrypted);++$i)
+ {
+ $key=$html->find("encrypted",$i)->key;
+ $html->find("encrypted",$i)->key=null;
+ $cont=$html->find("encrypted",$i)->innertext;
+ $html->find("encrypted",$i)->innertext="Encrypted content here. Click <a href=\"javascript:void(0)\" onclick=\"decryptui(".$i.")\">here</a> to decrypt.";
+ $contarr=str_split($cont);
+ $lcont=count($contarr);
+ $keyarr=str_split($key);
+ $lkey=count($keyarr);
+ $hash=5381;
+ for($j=0;$j<$lcont;++$j)
+ {
+ $hash=(($hash<<5)+$hash)+ord($contarr[$j]);
+ $hash&=0xFFFFFFFF;
+ $contarr[$j]^=$keyarr[$j%$lkey];
+ }
+ $retstr='';
+ array_walk($contarr,function($value)use(&$retstr){$retstr.=chr(ord($value));});
+ $html->find("encrypted",$i)->encont=base64_encode($retstr);
+ $html->find("encrypted",$i)->hash=$hash;
+ $html->find("encrypted",$i)->id="encrypted".$i;
+ }
+ echo $html;
+ fclose($file);
+ ?>
+ </td>
+ </tr>
+ <tr><td><hr><reduced id="notediv"></reduced></td></tr>
+ </table>
+ <div id="decryptui" style="display:none;opacity:0;color:white;z-index:10;position:fixed;left:0;top:0;width:100%;height:100%;background-color:rgba(0,0,0,0.4);transition:opacity 0.5s;">
+ <div class="TText" style="padding:20px;position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);background-color:rgba(0,0,0,0.6);">
+ <span id="keyhint"></span><br><br>
+ Key: <input id="keyinp" type="text"><br><br>
+ <button id="btndecrypt" onclick="decryptor(decid,document.getElementById('keyinp').value);" style="position:absolute;left:20px;">Decrypt</button>
+ <button onclick="hidedecryptui();">Cancel</button>
+ </form>
+ </div>
+ </body>
+</html>
diff --git a/blog/sbs_1/decryptor.js b/blog/sbs_1/decryptor.js
new file mode 100644
index 0000000..dcd64e3
--- /dev/null
+++ b/blog/sbs_1/decryptor.js
@@ -0,0 +1,73 @@
+//License: Expat(MIT)
+//Chrisoft Xiong 2017
+// http://www.onicos.com/staff/iz/amuse/javascript/expert/utf.txt
+function Utf8ArrayToStr(array){
+ var out,i,len,c;
+ var char2,char3;
+ out="";
+ len=array.length;
+ i=0;
+ while(i<len){
+ c=array[i++];
+ switch(c>>4)
+ {
+ case 0:case 1:case 2:case 3:case 4:case 5:case 6:case 7:
+ // 0xxxxxxx
+ out+=String.fromCharCode(c);
+ break;
+ case 12:case 13:
+ // 110x xxxx 10xx xxxx
+ char2=array[i++];
+ out+=String.fromCharCode(((c&0x1F)<<6)|(char2&0x3F));
+ break;
+ case 14:
+ // 1110 xxxx 10xx xxxx 10xx xxxx
+ char2=array[i++];
+ char3=array[i++];
+ out+=String.fromCharCode(((c&0x0F)<<12)|
+ ((char2&0x3F)<<6)|
+ ((char3&0x3F)<<0));
+ break;
+ }
+ }
+ return out;
+}
+var decid;
+function decryptui(id)
+{
+ document.getElementById("decryptui").style.display="block";
+ document.getElementById("keyinp").focus();
+ setTimeout(function(){document.getElementById("decryptui").style.opacity="1";},20);
+ decid=id;
+ document.getElementById("keyhint").innerHTML="Hint: "+document.getElementById("encrypted"+id).getAttribute("hint");
+ document.getElementById("keyinp").onkeypress=function(e){if(e.keyCode==13)document.getElementById('btndecrypt').click();}
+}
+function hidedecryptui()
+{
+ document.getElementById("decryptui").style.opacity="0";
+ setTimeout(function(){
+ document.getElementById("decryptui").style.display="none";
+ document.getElementById("keyinp").value="";
+ },500);
+}
+function decryptor(id,key)
+{
+ var e=document.getElementById("encrypted"+id);
+ var cont=e.getAttribute("encont");
+ var bc=atob(cont);
+ var b=new Array(bc.length);
+ for(var i=0;i<bc.length;++i)b[i]=bc.charCodeAt(i);
+ var lkey=key.length;
+ var u8arr=new Uint8Array(b);
+ var hash=5381;
+ for(var i=0;i<u8arr.length;++i){u8arr[i]^=key.charCodeAt(i%lkey);hash=(hash*33)+u8arr[i];hash%=4294967296;}
+ if(hash!=parseInt(e.getAttribute("hash")))
+ {
+ alert("The decryption key you have entered could be wrong, please try again.");
+ return;
+ }
+ //e.innerHTML=new TextDecoder("utf-8").decode(u8arr);
+ e.innerHTML=Utf8ArrayToStr(u8arr);
+ footnoter();
+ hidedecryptui();
+}
diff --git a/blog/sbs_1/extras.css b/blog/sbs_1/extras.css
new file mode 100644
index 0000000..6409ebe
--- /dev/null
+++ b/blog/sbs_1/extras.css
@@ -0,0 +1,50 @@
+.CTitle {
+ color: #fff;
+}
+.TText {
+ color: #fff;
+}
+body {
+ background: #000;
+ background-image: url(blossom.png);
+}
+table {
+ background: rgba(0,0,0,0.8);
+}
+p {
+ text-indent: 2em;
+}
+note, .note {
+ vertical-align: super;
+ font-size: 60%;
+}
+reduced, .reduced {
+ font-size: 75%;
+}
+blockquote {
+ padding: 1em;
+ margin-left:4em;margin-right:4em;
+}
+enlarged, .enlarged {
+ font-size: 125%;
+}
+button {
+ border:none;
+ color:white;
+ padding:0.5em 2em;
+ text-align:center;
+ background-color:#C6C;
+ -webkit-transition-duration:0.4s;
+ transition-duration:0.4s;
+}
+button:hover {
+ background-color:#E9E;
+}
+input {
+ border: none;
+ border-bottom: 2px solid #C6C;
+ outline: none !important;
+ background-color: rgba(0,0,0,0) !important;
+ color: white;
+}
+
diff --git a/blog/sbs_1/footnoter.js b/blog/sbs_1/footnoter.js
new file mode 100644
index 0000000..a1b2d8b
--- /dev/null
+++ b/blog/sbs_1/footnoter.js
@@ -0,0 +1,24 @@
+//License: MIT
+//Chrisoft Xiong 2017
+var starting=0;
+function footnoter()
+{
+ var footnotes=document.body.getElementsByTagName("footnote");
+ for(var i=0;i<footnotes.length;++i)
+ {
+ var s=footnotes[i].innerHTML;
+ footnotes[i].innerHTML="";//IE is stupid
+ var a=document.createElement("a");
+ a.setAttribute("id","n"+(starting+i+1));
+ a.setAttribute("href","#note"+(starting+i+1));
+ a.setAttribute("class","note");
+ a.innerHTML="["+(starting+i+1)+"]";
+ footnotes[i].parentNode.insertBefore(a,footnotes[i]);
+ var span=document.createElement("span");
+ span.setAttribute("class","TText");
+ span.innerHTML="<a id=\"note"+(starting+i+1)+"\" href=\"#n"+(starting+i+1)+"\">["+(starting+i+1)+"]</a>: "+s+"<br>";
+ document.getElementById("notediv").appendChild(span);
+ }
+ starting+=footnotes.length;
+ while(footnotes.length)footnotes[0].remove();
+}
diff --git a/blog/sbs_1/simple_html_dom.php b/blog/sbs_1/simple_html_dom.php
new file mode 100644
index 0000000..19e5f66
--- /dev/null
+++ b/blog/sbs_1/simple_html_dom.php
@@ -0,0 +1,975 @@
+<?php
+/*******************************************************************************
+Version: 1.11 ($Rev: 175 $)
+Website: http://sourceforge.net/projects/simplehtmldom/
+Author: S.C. Chen <me578022@gmail.com>
+Acknowledge: Jose Solorzano (https://sourceforge.net/projects/php-html/)
+Contributions by:
+ Yousuke Kumakura (Attribute filters)
+ Vadim Voituk (Negative indexes supports of "find" method)
+ Antcs (Constructor with automatically load contents either text or file/url)
+Licensed under The MIT License
+Redistributions of files must retain the above copyright notice.
+*******************************************************************************/
+
+define('HDOM_TYPE_ELEMENT', 1);
+define('HDOM_TYPE_COMMENT', 2);
+define('HDOM_TYPE_TEXT', 3);
+define('HDOM_TYPE_ENDTAG', 4);
+define('HDOM_TYPE_ROOT', 5);
+define('HDOM_TYPE_UNKNOWN', 6);
+define('HDOM_QUOTE_DOUBLE', 0);
+define('HDOM_QUOTE_SINGLE', 1);
+define('HDOM_QUOTE_NO', 3);
+define('HDOM_INFO_BEGIN', 0);
+define('HDOM_INFO_END', 1);
+define('HDOM_INFO_QUOTE', 2);
+define('HDOM_INFO_SPACE', 3);
+define('HDOM_INFO_TEXT', 4);
+define('HDOM_INFO_INNER', 5);
+define('HDOM_INFO_OUTER', 6);
+define('HDOM_INFO_ENDSPACE',7);
+
+// helper functions
+// -----------------------------------------------------------------------------
+// get html dom form file
+function file_get_html() {
+ $dom = new simple_html_dom;
+ $args = func_get_args();
+ $dom->load(call_user_func_array('file_get_contents', $args), true);
+ return $dom;
+}
+
+// get html dom form string
+function str_get_html($str, $lowercase=true) {
+ $dom = new simple_html_dom;
+ $dom->load($str, $lowercase);
+ return $dom;
+}
+
+// dump html dom tree
+function dump_html_tree($node, $show_attr=true, $deep=0) {
+ $lead = str_repeat(' ', $deep);
+ echo $lead.$node->tag;
+ if ($show_attr && count($node->attr)>0) {
+ echo '(';
+ foreach($node->attr as $k=>$v)
+ echo "[$k]=>\"".$node->$k.'", ';
+ echo ')';
+ }
+ echo "\n";
+
+ foreach($node->nodes as $c)
+ dump_html_tree($c, $show_attr, $deep+1);
+}
+
+// get dom form file (deprecated)
+function file_get_dom() {
+ $dom = new simple_html_dom;
+ $args = func_get_args();
+ $dom->load(call_user_func_array('file_get_contents', $args), true);
+ return $dom;
+}
+
+// get dom form string (deprecated)
+function str_get_dom($str, $lowercase=true) {
+ $dom = new simple_html_dom;
+ $dom->load($str, $lowercase);
+ return $dom;
+}
+
+// simple html dom node
+// -----------------------------------------------------------------------------
+class simple_html_dom_node {
+ public $nodetype = HDOM_TYPE_TEXT;
+ public $tag = 'text';
+ public $attr = array();
+ public $children = array();
+ public $nodes = array();
+ public $parent = null;
+ public $_ = array();
+ private $dom = null;
+
+ function __construct($dom) {
+ $this->dom = $dom;
+ $dom->nodes[] = $this;
+ }
+
+ function __destruct() {
+ $this->clear();
+ }
+
+ function __toString() {
+ return $this->outertext();
+ }
+
+ // clean up memory due to php5 circular references memory leak...
+ function clear() {
+ $this->dom = null;
+ $this->nodes = null;
+ $this->parent = null;
+ $this->children = null;
+ }
+
+ // dump node's tree
+ function dump($show_attr=true) {
+ dump_html_tree($this, $show_attr);
+ }
+
+ // returns the parent of node
+ function parent() {
+ return $this->parent;
+ }
+
+ // returns children of node
+ function children($idx=-1) {
+ if ($idx===-1) return $this->children;
+ if (isset($this->children[$idx])) return $this->children[$idx];
+ return null;
+ }
+
+ // returns the first child of node
+ function first_child() {
+ if (count($this->children)>0) return $this->children[0];
+ return null;
+ }
+
+ // returns the last child of node
+ function last_child() {
+ if (($count=count($this->children))>0) return $this->children[$count-1];
+ return null;
+ }
+
+ // returns the next sibling of node
+ function next_sibling() {
+ if ($this->parent===null) return null;
+ $idx = 0;
+ $count = count($this->parent->children);
+ while ($idx<$count && $this!==$this->parent->children[$idx])
+ ++$idx;
+ if (++$idx>=$count) return null;
+ return $this->parent->children[$idx];
+ }
+
+ // returns the previous sibling of node
+ function prev_sibling() {
+ if ($this->parent===null) return null;
+ $idx = 0;
+ $count = count($this->parent->children);
+ while ($idx<$count && $this!==$this->parent->children[$idx])
+ ++$idx;
+ if (--$idx<0) return null;
+ return $this->parent->children[$idx];
+ }
+
+ // get dom node's inner html
+ function innertext() {
+ if (isset($this->_[HDOM_INFO_INNER])) return $this->_[HDOM_INFO_INNER];
+ if (isset($this->_[HDOM_INFO_TEXT])) return $this->dom->restore_noise($this->_[HDOM_INFO_TEXT]);
+
+ $ret = '';
+ foreach($this->nodes as $n)
+ $ret .= $n->outertext();
+ return $ret;
+ }
+
+ // get dom node's outer text (with tag)
+ function outertext() {
+ if ($this->tag==='root') return $this->innertext();
+
+ // trigger callback
+ if ($this->dom->callback!==null)
+ call_user_func_array($this->dom->callback, array($this));
+
+ if (isset($this->_[HDOM_INFO_OUTER])) return $this->_[HDOM_INFO_OUTER];
+ if (isset($this->_[HDOM_INFO_TEXT])) return $this->dom->restore_noise($this->_[HDOM_INFO_TEXT]);
+
+ // render begin tag
+ $ret = $this->dom->nodes[$this->_[HDOM_INFO_BEGIN]]->makeup();
+
+ // render inner text
+ if (isset($this->_[HDOM_INFO_INNER]))
+ $ret .= $this->_[HDOM_INFO_INNER];
+ else {
+ foreach($this->nodes as $n)
+ $ret .= $n->outertext();
+ }
+
+ // render end tag
+ if(isset($this->_[HDOM_INFO_END]) && $this->_[HDOM_INFO_END]!=0)
+ $ret .= '</'.$this->tag.'>';
+ return $ret;
+ }
+
+ // get dom node's plain text
+ function text() {
+ if (isset($this->_[HDOM_INFO_INNER])) return $this->_[HDOM_INFO_INNER];
+ switch ($this->nodetype) {
+ case HDOM_TYPE_TEXT: return $this->dom->restore_noise($this->_[HDOM_INFO_TEXT]);
+ case HDOM_TYPE_COMMENT: return '';
+ case HDOM_TYPE_UNKNOWN: return '';
+ }
+ if (strcasecmp($this->tag, 'script')===0) return '';
+ if (strcasecmp($this->tag, 'style')===0) return '';
+
+ $ret = '';
+ foreach($this->nodes as $n)
+ $ret .= $n->text();
+ return $ret;
+ }
+
+ function xmltext() {
+ $ret = $this->innertext();
+ $ret = str_ireplace('<![CDATA[', '', $ret);
+ $ret = str_replace(']]>', '', $ret);
+ return $ret;
+ }
+
+ // build node's text with tag
+ function makeup() {
+ // text, comment, unknown
+ if (isset($this->_[HDOM_INFO_TEXT])) return $this->dom->restore_noise($this->_[HDOM_INFO_TEXT]);
+
+ $ret = '<'.$this->tag;
+ $i = -1;
+
+ foreach($this->attr as $key=>$val) {
+ ++$i;
+
+ // skip removed attribute
+ if ($val===null || $val===false)
+ continue;
+
+ $ret .= $this->_[HDOM_INFO_SPACE][$i][0];
+ //no value attr: nowrap, checked selected...
+ if ($val===true)
+ $ret .= $key;
+ else {
+ switch($this->_[HDOM_INFO_QUOTE][$i]) {
+ case HDOM_QUOTE_DOUBLE: $quote = '"'; break;
+ case HDOM_QUOTE_SINGLE: $quote = '\''; break;
+ default: $quote = '';
+ }
+ $ret .= $key.$this->_[HDOM_INFO_SPACE][$i][1].'='.$this->_[HDOM_INFO_SPACE][$i][2].$quote.$val.$quote;
+ }
+ }
+ $ret = $this->dom->restore_noise($ret);
+ return $ret . $this->_[HDOM_INFO_ENDSPACE] . '>';
+ }
+
+ // find elements by css selector
+ function find($selector, $idx=null) {
+ $selectors = $this->parse_selector($selector);
+ if (($count=count($selectors))===0) return array();
+ $found_keys = array();
+
+ // find each selector
+ for ($c=0; $c<$count; ++$c) {
+ if (($levle=count($selectors[0]))===0) return array();
+ if (!isset($this->_[HDOM_INFO_BEGIN])) return array();
+
+ $head = array($this->_[HDOM_INFO_BEGIN]=>1);
+
+ // handle descendant selectors, no recursive!
+ for ($l=0; $l<$levle; ++$l) {
+ $ret = array();
+ foreach($head as $k=>$v) {
+ $n = ($k===-1) ? $this->dom->root : $this->dom->nodes[$k];
+ $n->seek($selectors[$c][$l], $ret);
+ }
+ $head = $ret;
+ }
+
+ foreach($head as $k=>$v) {
+ if (!isset($found_keys[$k]))
+ $found_keys[$k] = 1;
+ }
+ }
+
+ // sort keys
+ ksort($found_keys);
+
+ $found = array();
+ foreach($found_keys as $k=>$v)
+ $found[] = $this->dom->nodes[$k];
+
+ // return nth-element or array
+ if (is_null($idx)) return $found;
+ else if ($idx<0) $idx = count($found) + $idx;
+ return (isset($found[$idx])) ? $found[$idx] : null;
+ }
+
+ // seek for given conditions
+ protected function seek($selector, &$ret) {
+ list($tag, $key, $val, $exp, $no_key) = $selector;
+
+ // xpath index
+ if ($tag && $key && is_numeric($key)) {
+ $count = 0;
+ foreach ($this->children as $c) {
+ if ($tag==='*' || $tag===$c->tag) {
+ if (++$count==$key) {
+ $ret[$c->_[HDOM_INFO_BEGIN]] = 1;
+ return;
+ }
+ }
+ }
+ return;
+ }
+
+ $end = (!empty($this->_[HDOM_INFO_END])) ? $this->_[HDOM_INFO_END] : 0;
+ if ($end==0) {
+ $parent = $this->parent;
+ while (!isset($parent->_[HDOM_INFO_END]) && $parent!==null) {
+ $end -= 1;
+ $parent = $parent->parent;
+ }
+ $end += $parent->_[HDOM_INFO_END];
+ }
+
+ for($i=$this->_[HDOM_INFO_BEGIN]+1; $i<$end; ++$i) {
+ $node = $this->dom->nodes[$i];
+ $pass = true;
+
+ if ($tag==='*' && !$key) {
+ if (in_array($node, $this->children, true))
+ $ret[$i] = 1;
+ continue;
+ }
+
+ // compare tag
+ if ($tag && $tag!=$node->tag && $tag!=='*') {$pass=false;}
+ // compare key
+ if ($pass && $key) {
+ if ($no_key) {
+ if (isset($node->attr[$key])) $pass=false;
+ }
+ else if (!isset($node->attr[$key])) $pass=false;
+ }
+ // compare value
+ if ($pass && $key && $val && $val!=='*') {
+ $check = $this->match($exp, $val, $node->attr[$key]);
+ // handle multiple class
+ if (!$check && strcasecmp($key, 'class')===0) {
+ foreach(explode(' ',$node->attr[$key]) as $k) {
+ $check = $this->match($exp, $val, $k);
+ if ($check) break;
+ }
+ }
+ if (!$check) $pass = false;
+ }
+ if ($pass) $ret[$i] = 1;
+ unset($node);
+ }
+ }
+
+ protected function match($exp, $pattern, $value) {
+ switch ($exp) {
+ case '=':
+ return ($value===$pattern);
+ case '!=':
+ return ($value!==$pattern);
+ case '^=':
+ return preg_match("/^".preg_quote($pattern,'/')."/", $value);
+ case '$=':
+ return preg_match("/".preg_quote($pattern,'/')."$/", $value);
+ case '*=':
+ if ($pattern[0]=='/')
+ return preg_match($pattern, $value);
+ return preg_match("/".$pattern."/i", $value);
+ }
+ return false;
+ }
+
+ protected function parse_selector($selector_string) {
+ // pattern of CSS selectors, modified from mootools
+ $pattern = "/([\w-:\*]*)(?:\#([\w-]+)|\.([\w-]+))?(?:\[@?(!?[\w-]+)(?:([!*^$]?=)[\"']?(.*?)[\"']?)?\])?([\/, ]+)/is";
+ preg_match_all($pattern, trim($selector_string).' ', $matches, PREG_SET_ORDER);
+ $selectors = array();
+ $result = array();
+ //print_r($matches);
+
+ foreach ($matches as $m) {
+ $m[0] = trim($m[0]);
+ if ($m[0]==='' || $m[0]==='/' || $m[0]==='//') continue;
+ // for borwser grnreated xpath
+ if ($m[1]==='tbody') continue;
+
+ list($tag, $key, $val, $exp, $no_key) = array($m[1], null, null, '=', false);
+ if(!empty($m[2])) {$key='id'; $val=$m[2];}
+ if(!empty($m[3])) {$key='class'; $val=$m[3];}
+ if(!empty($m[4])) {$key=$m[4];}
+ if(!empty($m[5])) {$exp=$m[5];}
+ if(!empty($m[6])) {$val=$m[6];}
+
+ // convert to lowercase
+ if ($this->dom->lowercase) {$tag=strtolower($tag); $key=strtolower($key);}
+ //elements that do NOT have the specified attribute
+ if (isset($key[0]) && $key[0]==='!') {$key=substr($key, 1); $no_key=true;}
+
+ $result[] = array($tag, $key, $val, $exp, $no_key);
+ if (trim($m[7])===',') {
+ $selectors[] = $result;
+ $result = array();
+ }
+ }
+ if (count($result)>0)
+ $selectors[] = $result;
+ return $selectors;
+ }
+
+ function __get($name) {
+ if (isset($this->attr[$name])) return $this->attr[$name];
+ switch($name) {
+ case 'outertext': return $this->outertext();
+ case 'innertext': return $this->innertext();
+ case 'plaintext': return $this->text();
+ case 'xmltext': return $this->xmltext();
+ default: return array_key_exists($name, $this->attr);
+ }
+ }
+
+ function __set($name, $value) {
+ switch($name) {
+ case 'outertext': return $this->_[HDOM_INFO_OUTER] = $value;
+ case 'innertext':
+ if (isset($this->_[HDOM_INFO_TEXT])) return $this->_[HDOM_INFO_TEXT] = $value;
+ return $this->_[HDOM_INFO_INNER] = $value;
+ }
+ if (!isset($this->attr[$name])) {
+ $this->_[HDOM_INFO_SPACE][] = array(' ', '', '');
+ $this->_[HDOM_INFO_QUOTE][] = HDOM_QUOTE_DOUBLE;
+ }
+ $this->attr[$name] = $value;
+ }
+
+ function __isset($name) {
+ switch($name) {
+ case 'outertext': return true;
+ case 'innertext': return true;
+ case 'plaintext': return true;
+ }
+ //no value attr: nowrap, checked selected...
+ return (array_key_exists($name, $this->attr)) ? true : isset($this->attr[$name]);
+ }
+
+ function __unset($name) {
+ if (isset($this->attr[$name]))
+ unset($this->attr[$name]);
+ }
+
+ // camel naming conventions
+ function getAllAttributes() {return $this->attr;}
+ function getAttribute($name) {return $this->__get($name);}
+ function setAttribute($name, $value) {$this->__set($name, $value);}
+ function hasAttribute($name) {return $this->__isset($name);}
+ function removeAttribute($name) {$this->__set($name, null);}
+ function getElementById($id) {return $this->find("#$id", 0);}
+ function getElementsById($id, $idx=null) {return $this->find("#$id", $idx);}
+ function getElementByTagName($name) {return $this->find($name, 0);}
+ function getElementsByTagName($name, $idx=null) {return $this->find($name, $idx);}
+ function parentNode() {return $this->parent();}
+ function childNodes($idx=-1) {return $this->children($idx);}
+ function firstChild() {return $this->first_child();}
+ function lastChild() {return $this->last_child();}
+ function nextSibling() {return $this->next_sibling();}
+ function previousSibling() {return $this->prev_sibling();}
+}
+
+// simple html dom parser
+// -----------------------------------------------------------------------------
+class simple_html_dom {
+ public $root = null;
+ public $nodes = array();
+ public $callback = null;
+ public $lowercase = false;
+ protected $pos;
+ protected $doc;
+ protected $char;
+ protected $size;
+ protected $cursor;
+ protected $parent;
+ protected $noise = array();
+ protected $token_blank = " \t\r\n";
+ protected $token_equal = ' =/>';
+ protected $token_slash = " />\r\n\t";
+ protected $token_attr = ' >';
+ // use isset instead of in_array, performance boost about 30%...
+ protected $self_closing_tags = array('img'=>1, 'br'=>1, 'input'=>1, 'meta'=>1, 'link'=>1, 'hr'=>1, 'base'=>1, 'embed'=>1, 'spacer'=>1);
+ protected $block_tags = array('root'=>1, 'body'=>1, 'form'=>1, 'div'=>1, 'span'=>1, 'table'=>1);
+ protected $optional_closing_tags = array(
+ 'tr'=>array('tr'=>1, 'td'=>1, 'th'=>1),
+ 'th'=>array('th'=>1),
+ 'td'=>array('td'=>1),
+ 'li'=>array('li'=>1),
+ 'dt'=>array('dt'=>1, 'dd'=>1),
+ 'dd'=>array('dd'=>1, 'dt'=>1),
+ 'dl'=>array('dd'=>1, 'dt'=>1),
+ 'p'=>array('p'=>1),
+ 'nobr'=>array('nobr'=>1),
+ );
+
+ function __construct($str=null) {
+ if ($str) {
+ if (preg_match("/^http:\/\//i",$str) || is_file($str))
+ $this->load_file($str);
+ else
+ $this->load($str);
+ }
+ }
+
+ function __destruct() {
+ $this->clear();
+ }
+
+ // load html from string
+ function load($str, $lowercase=true) {
+ // prepare
+ $this->prepare($str, $lowercase);
+ // strip out comments
+ $this->remove_noise("'<!--(.*?)-->'is");
+ // strip out cdata
+ $this->remove_noise("'<!\[CDATA\[(.*?)\]\]>'is", true);
+ // strip out <style> tags
+ $this->remove_noise("'<\s*style[^>]*[^/]>(.*?)<\s*/\s*style\s*>'is");
+ $this->remove_noise("'<\s*style\s*>(.*?)<\s*/\s*style\s*>'is");
+ // strip out <script> tags
+ $this->remove_noise("'<\s*script[^>]*[^/]>(.*?)<\s*/\s*script\s*>'is");
+ $this->remove_noise("'<\s*script\s*>(.*?)<\s*/\s*script\s*>'is");
+ // strip out preformatted tags
+ $this->remove_noise("'<\s*(?:code)[^>]*>(.*?)<\s*/\s*(?:code)\s*>'is");
+ // strip out server side scripts
+ $this->remove_noise("'(<\?)(.*?)(\?>)'s", true);
+ // strip smarty scripts
+ $this->remove_noise("'(\{\w)(.*?)(\})'s", true);
+
+ // parsing
+ while ($this->parse());
+ // end
+ $this->root->_[HDOM_INFO_END] = $this->cursor;
+ }
+
+ // load html from file
+ function load_file() {
+ $args = func_get_args();
+ $this->load(call_user_func_array('file_get_contents', $args), true);
+ }
+
+ // set callback function
+ function set_callback($function_name) {
+ $this->callback = $function_name;
+ }
+
+ // remove callback function
+ function remove_callback() {
+ $this->callback = null;
+ }
+
+ // save dom as string
+ function save($filepath='') {
+ $ret = $this->root->innertext();
+ if ($filepath!=='') file_put_contents($filepath, $ret);
+ return $ret;
+ }
+
+ // find dom node by css selector
+ function find($selector, $idx=null) {
+ return $this->root->find($selector, $idx);
+ }
+
+ // clean up memory due to php5 circular references memory leak...
+ function clear() {
+ foreach($this->nodes as $n) {$n->clear(); $n = null;}
+ if (isset($this->parent)) {$this->parent->clear(); unset($this->parent);}
+ if (isset($this->root)) {$this->root->clear(); unset($this->root);}
+ unset($this->doc);
+ unset($this->noise);
+ }
+
+ function dump($show_attr=true) {
+ $this->root->dump($show_attr);
+ }
+
+ // prepare HTML data and init everything
+ protected function prepare($str, $lowercase=true) {
+ $this->clear();
+ $this->doc = $str;
+ $this->pos = 0;
+ $this->cursor = 1;
+ $this->noise = array();
+ $this->nodes = array();
+ $this->lowercase = $lowercase;
+ $this->root = new simple_html_dom_node($this);
+ $this->root->tag = 'root';
+ $this->root->_[HDOM_INFO_BEGIN] = -1;
+ $this->root->nodetype = HDOM_TYPE_ROOT;
+ $this->parent = $this->root;
+ // set the length of content
+ $this->size = strlen($str);
+ if ($this->size>0) $this->char = $this->doc[0];
+ }
+
+ // parse html content
+ protected function parse() {
+ if (($s = $this->copy_until_char('<'))==='')
+ return $this->read_tag();
+
+ // text
+ $node = new simple_html_dom_node($this);
+ ++$this->cursor;
+ $node->_[HDOM_INFO_TEXT] = $s;
+ $this->link_nodes($node, false);
+ return true;
+ }
+
+ // read tag info
+ protected function read_tag() {
+ if ($this->char!=='<') {
+ $this->root->_[HDOM_INFO_END] = $this->cursor;
+ return false;
+ }
+ $begin_tag_pos = $this->pos;
+ $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
+
+ // end tag
+ if ($this->char==='/') {
+ $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
+ $this->skip($this->token_blank_t);
+ $tag = $this->copy_until_char('>');
+
+ // skip attributes in end tag
+ if (($pos = strpos($tag, ' '))!==false)
+ $tag = substr($tag, 0, $pos);
+
+ $parent_lower = strtolower($this->parent->tag);
+ $tag_lower = strtolower($tag);
+
+ if ($parent_lower!==$tag_lower) {
+ if (isset($this->optional_closing_tags[$parent_lower]) && isset($this->block_tags[$tag_lower])) {
+ $this->parent->_[HDOM_INFO_END] = 0;
+ $org_parent = $this->parent;
+
+ while (($this->parent->parent) && strtolower($this->parent->tag)!==$tag_lower)
+ $this->parent = $this->parent->parent;
+
+ if (strtolower($this->parent->tag)!==$tag_lower) {
+ $this->parent = $org_parent; // restore origonal parent
+ if ($this->parent->parent) $this->parent = $this->parent->parent;
+ $this->parent->_[HDOM_INFO_END] = $this->cursor;
+ return $this->as_text_node($tag);
+ }
+ }
+ else if (($this->parent->parent) && isset($this->block_tags[$tag_lower])) {
+ $this->parent->_[HDOM_INFO_END] = 0;
+ $org_parent = $this->parent;
+
+ while (($this->parent->parent) && strtolower($this->parent->tag)!==$tag_lower)
+ $this->parent = $this->parent->parent;
+
+ if (strtolower($this->parent->tag)!==$tag_lower) {
+ $this->parent = $org_parent; // restore origonal parent
+ $this->parent->_[HDOM_INFO_END] = $this->cursor;
+ return $this->as_text_node($tag);
+ }
+ }
+ else if (($this->parent->parent) && strtolower($this->parent->parent->tag)===$tag_lower) {
+ $this->parent->_[HDOM_INFO_END] = 0;
+ $this->parent = $this->parent->parent;
+ }
+ else
+ return $this->as_text_node($tag);
+ }
+
+ $this->parent->_[HDOM_INFO_END] = $this->cursor;
+ if ($this->parent->parent) $this->parent = $this->parent->parent;
+
+ $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
+ return true;
+ }
+
+ $node = new simple_html_dom_node($this);
+ $node->_[HDOM_INFO_BEGIN] = $this->cursor;
+ ++$this->cursor;
+ $tag = $this->copy_until($this->token_slash);
+
+ // doctype, cdata & comments...
+ if (isset($tag[0]) && $tag[0]==='!') {
+ $node->_[HDOM_INFO_TEXT] = '<' . $tag . $this->copy_until_char('>');
+
+ if (isset($tag[2]) && $tag[1]==='-' && $tag[2]==='-') {
+ $node->nodetype = HDOM_TYPE_COMMENT;
+ $node->tag = 'comment';
+ } else {
+ $node->nodetype = HDOM_TYPE_UNKNOWN;
+ $node->tag = 'unknown';
+ }
+
+ if ($this->char==='>') $node->_[HDOM_INFO_TEXT].='>';
+ $this->link_nodes($node, true);
+ $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
+ return true;
+ }
+
+ // text
+ if ($pos=strpos($tag, '<')!==false) {
+ $tag = '<' . substr($tag, 0, -1);
+ $node->_[HDOM_INFO_TEXT] = $tag;
+ $this->link_nodes($node, false);
+ $this->char = $this->doc[--$this->pos]; // prev
+ return true;
+ }
+
+ if (!preg_match("/^[\w-:]+$/", $tag)) {
+ $node->_[HDOM_INFO_TEXT] = '<' . $tag . $this->copy_until('<>');
+ if ($this->char==='<') {
+ $this->link_nodes($node, false);
+ return true;
+ }
+
+ if ($this->char==='>') $node->_[HDOM_INFO_TEXT].='>';
+ $this->link_nodes($node, false);
+ $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
+ return true;
+ }
+
+ // begin tag
+ $node->nodetype = HDOM_TYPE_ELEMENT;
+ $tag_lower = strtolower($tag);
+ $node->tag = ($this->lowercase) ? $tag_lower : $tag;
+
+ // handle optional closing tags
+ if (isset($this->optional_closing_tags[$tag_lower]) ) {
+ while (isset($this->optional_closing_tags[$tag_lower][strtolower($this->parent->tag)])) {
+ $this->parent->_[HDOM_INFO_END] = 0;
+ $this->parent = $this->parent->parent;
+ }
+ $node->parent = $this->parent;
+ }
+
+ $guard = 0; // prevent infinity loop
+ $space = array($this->copy_skip($this->token_blank), '', '');
+
+ // attributes
+ do {
+ if ($this->char!==null && $space[0]==='') break;
+ $name = $this->copy_until($this->token_equal);
+ if($guard===$this->pos) {
+ $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
+ continue;
+ }
+ $guard = $this->pos;
+
+ // handle endless '<'
+ if($this->pos>=$this->size-1 && $this->char!=='>') {
+ $node->nodetype = HDOM_TYPE_TEXT;
+ $node->_[HDOM_INFO_END] = 0;
+ $node->_[HDOM_INFO_TEXT] = '<'.$tag . $space[0] . $name;
+ $node->tag = 'text';
+ $this->link_nodes($node, false);
+ return true;
+ }
+
+ // handle mismatch '<'
+ if($this->doc[$this->pos-1]=='<') {
+ $node->nodetype = HDOM_TYPE_TEXT;
+ $node->tag = 'text';
+ $node->attr = array();
+ $node->_[HDOM_INFO_END] = 0;
+ $node->_[HDOM_INFO_TEXT] = substr($this->doc, $begin_tag_pos, $this->pos-$begin_tag_pos-1);
+ $this->pos -= 2;
+ $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
+ $this->link_nodes($node, false);
+ return true;
+ }
+
+ if ($name!=='/' && $name!=='') {
+ $space[1] = $this->copy_skip($this->token_blank);
+ $name = $this->restore_noise($name);
+ if ($this->lowercase) $name = strtolower($name);
+ if ($this->char==='=') {
+ $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
+ $this->parse_attr($node, $name, $space);
+ }
+ else {
+ //no value attr: nowrap, checked selected...
+ $node->_[HDOM_INFO_QUOTE][] = HDOM_QUOTE_NO;
+ $node->attr[$name] = true;
+ if ($this->char!='>') $this->char = $this->doc[--$this->pos]; // prev
+ }
+ $node->_[HDOM_INFO_SPACE][] = $space;
+ $space = array($this->copy_skip($this->token_blank), '', '');
+ }
+ else
+ break;
+ } while($this->char!=='>' && $this->char!=='/');
+
+ $this->link_nodes($node, true);
+ $node->_[HDOM_INFO_ENDSPACE] = $space[0];
+
+ // check self closing
+ if ($this->copy_until_char_escape('>')==='/') {
+ $node->_[HDOM_INFO_ENDSPACE] .= '/';
+ $node->_[HDOM_INFO_END] = 0;
+ }
+ else {
+ // reset parent
+ if (!isset($this->self_closing_tags[strtolower($node->tag)])) $this->parent = $node;
+ }
+ $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
+ return true;
+ }
+
+ // parse attributes
+ protected function parse_attr($node, $name, &$space) {
+ $space[2] = $this->copy_skip($this->token_blank);
+ switch($this->char) {
+ case '"':
+ $node->_[HDOM_INFO_QUOTE][] = HDOM_QUOTE_DOUBLE;
+ $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
+ $node->attr[$name] = $this->restore_noise($this->copy_until_char_escape('"'));
+ $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
+ break;
+ case '\'':
+ $node->_[HDOM_INFO_QUOTE][] = HDOM_QUOTE_SINGLE;
+ $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
+ $node->attr[$name] = $this->restore_noise($this->copy_until_char_escape('\''));
+ $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
+ break;
+ default:
+ $node->_[HDOM_INFO_QUOTE][] = HDOM_QUOTE_NO;
+ $node->attr[$name] = $this->restore_noise($this->copy_until($this->token_attr));
+ }
+ }
+
+ // link node's parent
+ protected function link_nodes(&$node, $is_child) {
+ $node->parent = $this->parent;
+ $this->parent->nodes[] = $node;
+ if ($is_child)
+ $this->parent->children[] = $node;
+ }
+
+ // as a text node
+ protected function as_text_node($tag) {
+ $node = new simple_html_dom_node($this);
+ ++$this->cursor;
+ $node->_[HDOM_INFO_TEXT] = '</' . $tag . '>';
+ $this->link_nodes($node, false);
+ $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
+ return true;
+ }
+
+ protected function skip($chars) {
+ $this->pos += strspn($this->doc, $chars, $this->pos);
+ $this->char = ($this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
+ }
+
+ protected function copy_skip($chars) {
+ $pos = $this->pos;
+ $len = strspn($this->doc, $chars, $pos);
+ $this->pos += $len;
+ $this->char = ($this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
+ if ($len===0) return '';
+ return substr($this->doc, $pos, $len);
+ }
+
+ protected function copy_until($chars) {
+ $pos = $this->pos;
+ $len = strcspn($this->doc, $chars, $pos);
+ $this->pos += $len;
+ $this->char = ($this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
+ return substr($this->doc, $pos, $len);
+ }
+
+ protected function copy_until_char($char) {
+ if ($this->char===null) return '';
+
+ if (($pos = strpos($this->doc, $char, $this->pos))===false) {
+ $ret = substr($this->doc, $this->pos, $this->size-$this->pos);
+ $this->char = null;
+ $this->pos = $this->size;
+ return $ret;
+ }
+
+ if ($pos===$this->pos) return '';
+ $pos_old = $this->pos;
+ $this->char = $this->doc[$pos];
+ $this->pos = $pos;
+ return substr($this->doc, $pos_old, $pos-$pos_old);
+ }
+
+ protected function copy_until_char_escape($char) {
+ if ($this->char===null) return '';
+
+ $start = $this->pos;
+ while(1) {
+ if (($pos = strpos($this->doc, $char, $start))===false) {
+ $ret = substr($this->doc, $this->pos, $this->size-$this->pos);
+ $this->char = null;
+ $this->pos = $this->size;
+ return $ret;
+ }
+
+ if ($pos===$this->pos) return '';
+
+ if ($this->doc[$pos-1]==='\\') {
+ $start = $pos+1;
+ continue;
+ }
+
+ $pos_old = $this->pos;
+ $this->char = $this->doc[$pos];
+ $this->pos = $pos;
+ return substr($this->doc, $pos_old, $pos-$pos_old);
+ }
+ }
+
+ // remove noise from html content
+ protected function remove_noise($pattern, $remove_tag=false) {
+ $count = preg_match_all($pattern, $this->doc, $matches, PREG_SET_ORDER|PREG_OFFSET_CAPTURE);
+
+ for ($i=$count-1; $i>-1; --$i) {
+ $key = '___noise___'.sprintf('% 3d', count($this->noise)+100);
+ $idx = ($remove_tag) ? 0 : 1;
+ $this->noise[$key] = $matches[$i][$idx][0];
+ $this->doc = substr_replace($this->doc, $key, $matches[$i][$idx][1], strlen($matches[$i][$idx][0]));
+ }
+
+ // reset the length of content
+ $this->size = strlen($this->doc);
+ if ($this->size>0) $this->char = $this->doc[0];
+ }
+
+ // restore noise to html content
+ function restore_noise($text) {
+ while(($pos=strpos($text, '___noise___'))!==false) {
+ $key = '___noise___'.$text[$pos+11].$text[$pos+12].$text[$pos+13];
+ if (isset($this->noise[$key]))
+ $text = substr($text, 0, $pos).$this->noise[$key].substr($text, $pos+14);
+ }
+ return $text;
+ }
+
+ function __toString() {
+ return $this->root->innertext();
+ }
+
+ function __get($name) {
+ switch($name) {
+ case 'outertext': return $this->root->innertext();
+ case 'innertext': return $this->root->innertext();
+ case 'plaintext': return $this->root->text();
+ }
+ }
+
+ // camel naming conventions
+ function childNodes($idx=-1) {return $this->root->childNodes($idx);}
+ function firstChild() {return $this->root->first_child();}
+ function lastChild() {return $this->root->last_child();}
+ function getElementById($id) {return $this->find("#$id", 0);}
+ function getElementsById($id, $idx=null) {return $this->find("#$id", $idx);}
+ function getElementByTagName($name) {return $this->find($name, 0);}
+ function getElementsByTagName($name, $idx=-1) {return $this->find($name, $idx);}
+ function loadFile() {$args = func_get_args();$this->load(call_user_func_array('file_get_contents', $args), true);}
+}
+?> \ No newline at end of file
diff --git a/blog/sbs_2/blogext.css b/blog/sbs_2/blogext.css
new file mode 100644
index 0000000..7b6916c
--- /dev/null
+++ b/blog/sbs_2/blogext.css
@@ -0,0 +1,65 @@
+span.right{
+ display:table-cell;
+ text-align:right;
+ white-space:nowrap;
+ min-width:12em;
+}
+a.toctarg{
+ margin-left:-160px;
+ padding-left:160px !important;
+}
+ul#tagslist{
+ list-style-type:none;
+ padding-left:0;
+}
+ul#tocroot{
+ list-style-type:none;
+ padding-left:24px;
+}
+ul.tocnode{
+ list-style-type:none;
+ padding-left:16px;
+}
+span.left{
+ display:table-cell;
+ text-align:left;
+ text-overflow:ellipsis;
+ overflow:hidden;
+ white-space:nowrap;
+}
+div h3{
+ margin: 0.5em 0;
+}
+#content .block{
+ margin: 1em 0;
+}
+p{
+ text-indent:2em;
+}
+.noindent{
+ text-indent:0 !important;
+}
+note, .note {
+ vertical-align: super;
+ font-size: 60%;
+}
+reduced, .reduced {
+ font-size: 75%;
+}
+enlarged, .enlarged {
+ font-size: 125%;
+}
+blockquote {
+ padding: 1em;
+ margin-left:4em;margin-right:4em;
+}
+.rightaligned {
+ text-align: right;
+}
+.nospace{font-size:0;}
+.nospace>span{font-size:16px;}
+#decryptdlg{max-width:30%;}
+@media (max-width:768px)
+{
+ #decryptdlg{max-width:90%;}
+}
diff --git a/blog/sbs_2/bloglist.js b/blog/sbs_2/bloglist.js
new file mode 100644
index 0000000..c117afb
--- /dev/null
+++ b/blog/sbs_2/bloglist.js
@@ -0,0 +1,216 @@
+//License: Expat(MIT)
+//Chris Xiong 2017
+var pp=5,pn=0,animating,adir=1;
+var t,c,psw,curp,cbuf,cmdtl,flt;
+function request(url,func)
+{
+ var h=new XMLHttpRequest();
+ h.open("GET",url);
+ h.onload=()=>{func(h.response,h.status)};
+ h.send();
+}
+function parsetags(tgs)
+{
+ var r="";
+ var a=tgs.split(",");
+ r="#"+a[0];
+ for(var i=1;i<a.length;++i)r+=" #"+a[i];
+ return r;
+}
+function rmblk(i)
+{
+ var l=c.querySelectorAll("div.pendingrm");
+ if(i>=l.length)
+ {
+ setTimeout(function(){for(var i of l)c.removeChild(i);},500);
+ return;
+ }
+ var e=l.item(i);
+ var w=e.getBoundingClientRect().width;
+ e.style.left=adir*-1.3*w+"px";
+ setTimeout(rmblk,100,i+1);
+}
+function etrblk(i)
+{
+ var l=c.querySelectorAll("div.block:not(.pendingrm)");
+ if(!i)
+ {
+ for(var e of l)
+ if(e.id!="ptemplate")e.style.left=(adir*1.2*e.getBoundingClientRect().width)+"px";
+ }
+ if(i>=l.length)
+ {
+ setTimeout(()=>{animating=false;},500);
+ return;
+ }
+ var e=l.item(i);
+ if(e.id!="ptemplate")
+ e.style.left="0";
+ setTimeout(etrblk,100,i+1);
+}
+function setfilter(f,nlp)
+{
+ if(animating)return;
+ if(f[0]=='#')f=f.substr(1);
+ var ch=document.getElementById('tagslist').children;
+ var ff=false;
+ for(var i=0;i<ch.length;++i)
+ if(ch[i].children[0].innerHTML=="#"+f)
+ if(ch[i].children[0].classList.contains('active'))ch[i].children[0].classList.remove('active'),ff=true;
+ else ch[i].children[0].classList.add('active');else ch[i].children[0].classList.remove('active');
+ flt=f;if(ff)flt="";
+ pn=-1;if(!nlp)loadpage(0);
+}
+function modloc()
+{
+ var base=window.location.toString().substr(0,window.location.toString().search('/blog/list')+10);
+ var ret=base+(flt.length?'/'+flt:'')+'/'+pn;
+ window.history.replaceState("","Chrisoft::Blog",ret);
+}
+function loadpage(_pn)
+{
+ if(animating||_pn==pn)return;
+ if(_pn>pn)adir=1;else adir=-1;
+ pn=_pn;animating=true;modloc();
+ var l=c.querySelectorAll("div.block");
+ for(var i of l)
+ if(i.id!="ptemplate")
+ {
+ i.classList.add("pendingrm");
+ r=i.getBoundingClientRect();
+ i.style.top=(r.top-16)+"px";
+ i.style.left=r.left+"px";
+ i.style.width=r.width+"px";
+ }
+ for(var i of l)if(i.id!="ptemplate")i.style.position="fixed";
+ setTimeout(rmblk,10,0);
+ curp.innerHTML=(pn+1)+"/";
+ request("/blog/cgi-bin/get-archive-list.cgi?pp="+pp+"&pc"+(flt.length?"&f="+flt:""),
+ function(r){curp.innerHTML+=Number(r).toString();});
+ request("/blog/cgi-bin/get-archive-list.cgi?pp="+pp+"&pn="+pn+(flt.length?"&f="+flt:""),
+ function(r,s)
+ {
+ if(s!=200){animating=false;return;}
+ o=JSON.parse(r);
+ for(var i=0;i<o.postsOnPage;++i)
+ {
+ var e=t.cloneNode(true);
+ e.style.display="block";e.id="";
+ e.querySelector("h3").innerHTML='<a href=/blog/post/'+o.posts[i].filename+'>'+o.posts[i].title+'</a>';
+ e.querySelector("span.left").innerHTML=parsetags(o.posts[i].tags);
+ e.querySelector("span.right").innerHTML=o.posts[i].date;
+ c.insertBefore(e,psw);
+ }
+ setTimeout(etrblk,10,0);
+ }
+ );
+}
+function lastpage(){loadpage(pn-1<0?0:pn-1);}
+function nextpage(){request("/blog/cgi-bin/get-archive-list.cgi?pp="+pp+"&pc"+(flt.length?"&f="+flt:""),function(r){var pc=Number(r);if(pn+1<pc)loadpage(pn+1);});}
+function blinit()
+{
+ var parr=window.location.pathname.substr(10).split('/');
+ var pflt="";ppn=0;
+ if(parr.length>1&&parr[1].length)
+ {
+ if(!isNaN(parr[1]))ppn=Number(parr[1]);
+ else if(parr.length>2&&parr[2].length&&!isNaN(parr[2])){pflt=parr[1];ppn=Number(parr[2]);}
+ else if(parr.length>=2)pflt=parr[1];
+ }
+ t=document.getElementById("ptemplate");
+ c=document.getElementById("content");
+ psw=document.getElementById("insanch");
+ curp=document.getElementById("curp");
+ cbuf=document.getElementById("cmdbuf");
+ document.onkeypress=keypress;
+ document.onkeydown=(e)=>{switch(e.key){case "ArrowLeft":lastpage();break;case "ArrowRight":nextpage();break;}};
+ request("/blog/cgi-bin/get-archive-list.cgi?gt",
+ (r)=>
+ {
+ o=JSON.parse(r);
+ for(var i=0;i<o.length;++i)
+ {
+ var l=document.createElement('li');
+ l.innerHTML='<a href="javascript:void(0);" onclick="setfilter(\''+o[i]+'\');">'+o[i]+"</a>";
+ document.getElementById('tagslist').appendChild(l);
+ }
+ pn=-1;setfilter("#"+pflt,true);loadpage(ppn);
+ }
+ );
+}
+
+function showcmdbuf()
+{
+ cbuf.style.opacity="1";
+ if(cmdtl){clearTimeout(cmdtl);cmdtl=0;}
+ cmdtl=setTimeout(execcmd,1000);
+}
+function execcmd()
+{
+ var v=false;
+ switch(cbuf.innerHTML)
+ {
+ case "h":case "k":
+ lastpage();v=true;
+ break;
+ case "j":case "l":
+ nextpage();v=true;
+ break;
+ case "gg":
+ loadpage(0);v=true;
+ break;
+ case "G":
+ v=true;
+ request("/blog/cgi-bin/get-archive-list.cgi?pp="+pp+"&pc",
+ function(r){var pc=Number(r);loadpage(pc-1);}
+ );
+ break;
+ case "xyzzy":
+ cbuf.innerHTML="Going minesweeping!";
+ v=true;setTimeout(()=>{window.location.href="/minesweeper";},500);
+ break;
+ }
+ if(parseInt(cbuf.innerHTML).toString()+"G"==cbuf.innerHTML.trim())
+ {
+ v=true;
+ request("/blog/cgi-bin/get-archive-list.cgi?pp="+pp+"&pc",
+ function(r)
+ {var pc=Number(r),tpn=parseInt(cbuf.innerHTML)-1;if(tpn>=pc)tpn=pc-1;if(tpn<0)tpn=0;loadpage(tpn);}
+ );
+ }
+ if(cbuf.innerHTML[0]==':')
+ {
+ var sparr=cbuf.innerHTML.split(' ');
+ switch(sparr[0])
+ {
+ case ':setfilter':
+ case ':filter':
+ case ':flt':
+ v=true;
+ if(sparr.length<2)
+ {
+ cbuf.innerHTML='require 1 parameter';
+ }
+ else setfilter(sparr[1]);
+ break;
+ case ':nofilter':
+ case ':noflt':
+ v=true;
+ setfilter('');
+ break;
+ }
+ }
+ cbuf.style.opacity="0";
+ if(!v)cbuf.innerHTML="Unknown command.";
+}
+function keypress(e)
+{
+ if(cbuf.style.opacity=="0")cbuf.innerHTML="";
+ if(e.key.length==1)
+ {
+ cbuf.innerHTML+=e.key;showcmdbuf();
+ if(cbuf.innerHTML.length==1&&'hjkl'.search(cbuf.innerHTML)!=-1)
+ execcmd();
+ }
+ if(e.key=="Enter")execcmd();
+}
diff --git a/blog/sbs_2/blogpost.js b/blog/sbs_2/blogpost.js
new file mode 100644
index 0000000..4c17772
--- /dev/null
+++ b/blog/sbs_2/blogpost.js
@@ -0,0 +1,103 @@
+//License: Expat (MIT)
+//Chrisoft Xiong 2017
+var prev,succ,tocid=0,headerlist=[];
+function request(url,func)
+{
+ var h=new XMLHttpRequest();
+ h.open("GET",url);
+ h.onload=()=>{func(h.response,h.status)};
+ h.send();
+}
+function parsetags(tgs)
+{
+ var r="";
+ var a=tgs.split(",");
+ r="#"+a[0];
+ for(var i=1;i<a.length;++i)r+=" #"+a[i];
+ return r;
+}
+function dfs(el,le,p)
+{
+ var e=document.createElement('li');
+ e.innerHTML='<a class="toctarg" href="#tocanch'+tocid+'">'+el.innerHTML+'</a>';
+ le.appendChild(e);
+ el.id='tocanch'+(tocid++);
+ el.classList.add('tvis');
+ var che=null,i;
+ for(i=p+1;i<headerlist.length;)
+ {
+ if(headerlist[i].tagName<=el.tagName)break;
+ if(headerlist[i].classList.contains('notoc'))continue;
+ if(che===null)
+ {
+ var te=document.createElement('li');
+ che=document.createElement('ul');
+ che.classList.add('tocnode');
+ te.appendChild(che);
+ le.appendChild(te);
+ }
+ i=dfs(headerlist[i],che,i);
+ }
+ return i;
+}
+function bpinit()
+{
+ var parr=window.location.pathname.substr(10).split('/');
+ var pflt="";ppn=0;
+ if(parr.length>1&&parr[1].length)
+ {
+ request("/blog/cgi-bin/get-post-content.cgi?p="+parr[1],
+ (r,s)=>
+ {
+ if(s>=400)window.location="/blog";
+ var p1=r.search('\n');
+ var title=r.substr(0,r.search('\n'));
+ var p2=r.substr(p1+1).search('\n');
+ var date=r.substr(p1+1,p2);
+ var p3=r.substr(p1+p2+2).search('\n');
+ var tags=r.substr(p1+p2+2,p3);
+ document.getElementById("title").innerHTML=title;
+ document.getElementById("titleh").innerHTML=title;
+ document.getElementById("datetags").innerHTML=date+"<br>"+parsetags(tags);
+ document.getElementById("article").innerHTML=r.substr(p1+p2+p3+3);
+ var l=document.getElementById("article").querySelectorAll("script");
+ for(var i of l)
+ {
+ var s=document.createElement("script");
+ s.async=true;
+ s.src=i.src;
+ document.getElementById("article").appendChild(s);
+ }
+ var tgs=tags.split(',');
+ for(var i=0;i<tgs.length;++i)
+ {
+ var l=document.createElement('li');
+ l.innerHTML='<a href="/blog/list/'+tgs[i]+'/">'+tgs[i]+"</a>";
+ document.getElementById('tagslist').appendChild(l);
+ }
+ request("/blog/cgi-bin/get-archive-list.cgi?qn="+parr[1],
+ (r,s)=>
+ {
+ if(s>=400)return;
+ var o=JSON.parse(r);
+ prev=o.prev;succ=o.succ;
+ }
+ );
+ l=document.getElementById('article').querySelectorAll('h2,h3,h4,h5,h6');
+ var tocroot=document.getElementById('tocroot');
+ for(var i of l)
+ {
+ if(!i.classList.contains('notoc'))headerlist.push(i);
+ }
+ for(var i=0;i<headerlist.length;)i=dfs(headerlist[i],tocroot,i);
+ if(!tocroot.children.length)document.getElementById('tocouter').style.display='none';
+ for(var i=0;i<tgs.length;++i)
+ footnoter();
+ if(window.location.hash.length&&document.querySelector(window.location.hash))
+ window.scroll(window.scrollX,document.querySelector(window.location.hash).getBoundingClientRect().top);
+ }
+ );
+ }
+}
+function prevpost(){if(prev.length)window.location="/blog/post/"+prev;}
+function succpost(){if(succ.length)window.location="/blog/post/"+succ;}
diff --git a/blog/sbs_2/cgi-bin/.htaccess b/blog/sbs_2/cgi-bin/.htaccess
new file mode 100644
index 0000000..84df3ac
--- /dev/null
+++ b/blog/sbs_2/cgi-bin/.htaccess
@@ -0,0 +1,3 @@
+Options +ExecCGI
+AddHandler cgi-script cgi pl
+
diff --git a/blog/sbs_2/cgi-bin/get-archive-list.cgi b/blog/sbs_2/cgi-bin/get-archive-list.cgi
new file mode 120000
index 0000000..4024897
--- /dev/null
+++ b/blog/sbs_2/cgi-bin/get-archive-list.cgi
@@ -0,0 +1 @@
+../cgi-src/get-archive-list \ No newline at end of file
diff --git a/blog/sbs_2/cgi-bin/get-post-content.cgi b/blog/sbs_2/cgi-bin/get-post-content.cgi
new file mode 120000
index 0000000..17ef753
--- /dev/null
+++ b/blog/sbs_2/cgi-bin/get-post-content.cgi
@@ -0,0 +1 @@
+../cgi-src/get-post-content \ No newline at end of file
diff --git a/blog/sbs_2/cgi-src/cgiutils.hpp b/blog/sbs_2/cgi-src/cgiutils.hpp
new file mode 100644
index 0000000..3eca4dc
--- /dev/null
+++ b/blog/sbs_2/cgi-src/cgiutils.hpp
@@ -0,0 +1,245 @@
+/*
+ * Copyright 2017 Chris Xiong
+ *
+ * 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.
+ */
+#ifndef CGILIB_HPP
+#define CGILIB_HPP
+#include <cstdlib>
+#include <map>
+#include <string>
+#include <vector>
+const char* base64_table="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
+std::string base64_encode(std::string s)
+{
+ std::string r="";
+ for(unsigned i=0;i<s.length();i+=3)
+ {
+ int b=(s[i]&0xFC)>>2;
+ r+=base64_table[b];
+ b=(s[i]&0x03)<<4;
+ if(i+1<s.length())
+ {
+ b|=(s[i+1]&0xF0)>>4;
+ r+=base64_table[b];
+ b=(s[i+1]&0x0F)<<2;
+ if(i+2<s.length())
+ {
+ b|=(s[i+2]&0xC0)>>6;
+ r+=base64_table[b];
+ b=s[i+2]&0x3F;
+ r+=base64_table[b];
+ }else r+=base64_table[b],r+='=';
+ }else r+=base64_table[b],r+="==";
+ }
+ return r;
+}
+void split(std::string s,char c,std::vector<std::string>& v)
+{
+ v.clear();
+ for(size_t anch=0;;)
+ {
+ std::string sec;
+ if(s.find(c,anch)==std::string::npos)
+ sec=s.substr(anch);
+ else sec=s.substr(anch,s.find(c,anch)-anch);
+ v.push_back(sec);
+ if(s.find(c,anch)==std::string::npos)break;
+ anch=s.find(c,anch)+1;
+ }
+}
+std::string trim(std::string s)
+{
+ int l=0;for(;isblank(s[l]);++l)
+ s=s.substr(l);
+ while(isblank(s.back()))s.pop_back();
+ return s;
+}
+class QueryStrParser
+{
+ private:
+ std::map<std::string,std::string> q;
+ void parse(std::string es)
+ {
+ for(size_t anch=0;;)
+ {
+ std::string sec;
+ if(es.find('&',anch)==std::string::npos)
+ sec=es.substr(anch);
+ else sec=es.substr(anch,es.find('&',anch)-anch);
+ if(sec.find('=')==std::string::npos)
+ q[sec.substr(0)]="";
+ else
+ q[sec.substr(0,sec.find('='))]=sec.substr(sec.find('=')+1);
+ if(es.find('&',anch)==std::string::npos)break;
+ anch=es.find('&',anch)+1;
+ }
+ }
+ public:
+ QueryStrParser()
+ {
+ char* e=getenv("QUERY_STRING");
+ if(!e)return;
+ parse(std::string(e));
+ }
+ QueryStrParser(std::string s)
+ {
+ parse(s);
+ }
+ bool exist(std::string s)
+ {
+ return q.find(s)!=q.end();
+ }
+ std::string value(std::string s)
+ {
+ if(!exist(s))return "";
+ return q.find(s)->second;
+ }
+};
+class RequestCookies
+{
+ private:
+ std::map<std::string,std::string> m;
+ void parse(std::string cookie)
+ {
+ std::vector<std::string> v;
+ split(cookie,';',v);
+ }
+ public:
+ RequestCookies()
+ {
+ char* e=getenv("HTTP_COOKIE");
+ if(!e)return;
+ parse(std::string(e));
+ }
+};
+class DOMAttrib
+{
+ private:
+ std::map<std::string,std::string> m;
+ public:
+ DOMAttrib(std::string s="")
+ {
+ for(size_t anch=0;;)
+ {
+ std::string sec;
+ if(s.find('"',anch)==std::string::npos)
+ sec=s.substr(anch);
+ else sec=s.substr(anch,s.find('"',s.find('"',anch)+1)-anch+1);
+ if(sec.find('=')==std::string::npos)
+ m[sec.substr(0)]="";
+ else
+ m[sec.substr(0,sec.find('='))]=sec.substr(sec.find('=')+2),
+ m[sec.substr(0,sec.find('='))].pop_back();
+ if(s.find(' ',anch+sec.length())==std::string::npos)break;
+ anch=s.find(' ',anch+sec.length())+1;
+ }
+ }
+ void setAttrib(std::string a,std::string v){m[a]=v;}
+ void eraseAttrib(std::string a){if(existAttrib(a))m.erase(m.find(a));}
+ bool existAttrib(std::string a){return m.find(a)!=m.end();}
+ std::string getAttrib(std::string a){if(!existAttrib(a))return "";return m[a];}
+ std::string to_string()
+ {
+ std::string r;bool cf=false;
+ for(auto i=m.begin();i!=m.end();++i)
+ {
+ if(cf)r+=' ';else cf=true;
+ r+=i->first+"=\""+i->second+"\"";
+ }
+ return r;
+ }
+};
+static const char* twoxx[]={
+ "OK",
+ "Created",
+ "Accepted",
+ "Non-Authoritative Information",
+ "No Content",
+ "Reset Content",
+ "Partial Content",
+ "Multi-Status",
+ "Already Reported"
+};
+static const char* threexx[]={
+ "Multiple Choices",
+ "Moved Permanently",
+ "Found",
+ "See Other",
+ "Not Modified",
+ "Use Proxy",
+ "???",
+ "Temporary Redirect"
+};
+static const char* fourxx[]={
+ "Bad Request",
+ "Unauthorized",
+ "Payment Required",
+ "Forbidden",
+ "Not Found",
+ "Method Not Allowed",
+ "Not Acceptable",
+ "Proxy Authentication Required",
+ "Request Timeout",
+ "Conflict",
+ "Gone",
+ "Length Required",
+ "Precondition Failed",
+ "Request Entity Too Large",
+ "Request-URI Too Long",
+ "Unsupported Media Type",
+ "Requested Range Not Satisfiable",
+ "Expectation Failed"
+};
+static const char* fivexx[]={
+ "Internal Server Error",
+ "Not Implemented",
+ "Bad Gateway",
+ "Service Unavailable",
+ "Gateway Timeout",
+ "HTTP Version Not Supported"
+};
+class HTTPHeader
+{
+private:
+ int status;
+ std::vector<std::string> hdr;
+public:
+ HTTPHeader(){status=200;}
+ void setStatusCode(int c){status=c;}
+ int statusCode(){return status;}
+ void appendHeader(std::string s){hdr.push_back(s);}
+ void print()
+ {
+ if(status>=200&&status<=208)
+ printf("Status: %d %s\r\n",status,twoxx[status-200]);
+ if(status>=300&&status<=307)
+ printf("Status: %d %s\r\n",status,threexx[status-300]);
+ if(status>=400&&status<=417)
+ printf("Status: %d %s\r\n",status,fourxx[status-400]);
+ if(status>=500&&status<=505)
+ printf("Status: %d %s\r\n",status,fivexx[status-500]);
+ for(unsigned i=0;i<hdr.size();++i)
+ printf("%s\r\n",hdr[i].c_str());
+ printf("\r\n");
+ }
+};
+#endif
diff --git a/blog/sbs_2/cgi-src/get-archive-list b/blog/sbs_2/cgi-src/get-archive-list
new file mode 100755
index 0000000..4285a4d
--- /dev/null
+++ b/blog/sbs_2/cgi-src/get-archive-list
Binary files differ
diff --git a/blog/sbs_2/cgi-src/get-archive-list.cpp b/blog/sbs_2/cgi-src/get-archive-list.cpp
new file mode 100644
index 0000000..28f316d
--- /dev/null
+++ b/blog/sbs_2/cgi-src/get-archive-list.cpp
@@ -0,0 +1,200 @@
+/*
+ * Copyright 2017 Chris Xiong
+ *
+ * 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.
+ */
+/*
+ * Get list of archives
+ * query parameters:
+ * pn=<int>: page number, defaults to 0
+ * pp=<int>: number of posts per page, defaults to 20
+ * pc: if exists, gets how many pages are there from the current pp value
+ * f: tag filter.
+ * gt: get a list of tags used by posts instead.
+ * qn=<filename>: query the neibouring posts of the given post.
+ * returned object:
+ * A number if pc exists denoting number of pages.
+ * Or the following JSON object if gf exists.
+ * ["tag1","tag2",...]
+ * Or the following JSON object if qn exists.
+ * {
+ * "prev": <last post>
+ * "succ": <next post>
+ * }
+ * Otherwise returns archive list in JSON:
+ * {
+ * "postsPerPage": <requested pp>
+ * "postsOnPage": <number of posts on this page>
+ * "page": <requested pn>
+ * "posts": [
+ * {
+ * "filename": ...
+ * "title": ...
+ * "date": ...
+ * "tags": ...
+ * },
+ * ...
+ * ]
+ * }
+ */
+#include <dirent.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <cstdio>
+#include <cstring>
+#include <algorithm>
+#include <functional>
+#include <vector>
+#include <map>
+#include <set>
+#include <string>
+#include "cgiutils.hpp"
+#define stripr(s) s[strlen(s)-1]=='\n'?s[strlen(s)-1]=0:0
+struct post
+{
+ std::string t,d,tg;
+};
+std::map<std::string,post,std::greater<std::string>> f;
+char buf[65536];
+int main(int argc,char** argv,char** envp)
+{
+ struct stat idxs,cdirs;
+ stat("/var/www/html/blog/content/pindex",&idxs);
+ stat("/var/www/html/blog/content",&cdirs);
+ if(cdirs.st_mtim.tv_sec>idxs.st_mtim.tv_sec)
+ system("/var/www/html/blog/content/util/indexer > /dev/null 2> /dev/null");
+ QueryStrParser a;
+ FILE *fidx=fopen("/var/www/html/blog/content/pindex","r");
+ while(fgets(buf,65536,fidx))
+ {
+ stripr(buf);std::vector<std::string> v;
+ split(std::string(buf),'\t',v);
+ if(v.size()==4)
+ f[v[0]]=post{v[1],v[2],v[3]};
+ }
+ fclose(fidx);
+ HTTPHeader h;
+ if(a.exist("gt"))
+ {
+ std::set<std::string> s;
+ std::vector<std::string> v;
+ for(auto i=f.begin();i!=f.end();++i)
+ {
+ split(i->second.tg,',',v);
+ for(size_t j=0;j<v.size();++j)
+ s.insert("\"#"+v[j]+"\"");
+ }
+ h.appendHeader("Content-type: text/plain; charset=utf-8");
+ h.print();
+ printf("[");
+ auto it=s.begin();
+ printf("%s",it->c_str());
+ while(++it!=s.end())printf(",%s",it->c_str());
+ printf("]");
+ }
+ else
+ {
+ if(a.exist("f"))
+ for(auto i=f.begin();i!=f.end();)
+ {
+ std::vector<std::string> v;
+ split(i->second.tg,',',v);
+ std::set<std::string> sv=std::set<std::string>(v.begin(),v.end());
+ if(sv.find(a.value("f"))==sv.end()){auto t=i++;f.erase(t);}
+ else i++;
+ }
+ if(a.exist("pc"))
+ {
+ int pp=0;
+ if(!a.exist("pp"))pp=20;
+ else{
+ try{
+ pp=std::stoi(a.value("pp"));
+ }catch(std::exception e){h.setStatusCode(400);}
+ }
+ if(!pp)h.setStatusCode(400);
+ h.appendHeader("Content-type: text/plain; charset=utf-8");
+ h.print();
+ printf("%lu\n",f.size()/pp+((f.size()%pp)?1:0));
+ return 0;
+ }
+ else if(a.exist("qn"))
+ {
+ if(f.find(a.value("qn"))==f.end())
+ h.setStatusCode(400);
+ h.print();if(h.statusCode()>=400)return 0;
+ auto i=f.find(a.value("qn"));
+ std::string pr="",sc="";
+ auto t=i;if(t!=f.begin())pr=(--t)->first;
+ t=i;if(!(++t==f.end()))sc=t->first;
+ printf("{\"prev\":\"%s\",\"succ\":\"%s\"}",sc.c_str(),pr.c_str());
+ return 0;
+ }
+ else
+ {
+ unsigned pp=20,pn=0;
+ if(!a.exist("pp"))pp=20;
+ else{
+ try{
+ pp=std::stoi(a.value("pp"));
+ }catch(std::exception e){h.setStatusCode(400);}
+ }
+ if(!a.exist("pn"))pn=0;
+ else{
+ try{
+ pn=std::stoi(a.value("pn"));
+ }catch(std::exception e){h.setStatusCode(400);}
+ }
+ if(!pp)h.setStatusCode(400);
+ if(pn>=f.size()/pp+((f.size()%pp)?1:0))h.setStatusCode(400);
+ int rpp=(pn!=f.size()/pp+((f.size()%pp)?1:0)-1)?pp:
+ f.size()-pp*(f.size()/pp+((f.size()%pp)?1:0)-1);
+ h.appendHeader("Content-type: text/plain; charset=utf-8");
+ h.print();
+ if(h.statusCode()>=400)return 0;
+ puts("{");
+ printf("\t\"postsPerPage\":%d,\n",pp);
+ printf("\t\"postsOnPage\":%d,\n",rpp);
+ printf("\t\"page\":%d,\n",pn);
+ puts("\t\"posts\": [");
+ auto it=f.begin();std::advance(it,pn*pp);
+ for(int i=0;i<rpp-1;++i)
+ {
+ puts("\t\t{");
+ printf("\t\t\t\"filename\":\"%s\",\n",it->first.c_str());
+ printf("\t\t\t\"title\":\"%s\",\n",it->second.t.c_str());
+ printf("\t\t\t\"date\":\"%s\",\n",it->second.d.c_str());
+ printf("\t\t\t\"tags\":\"%s\"\n",it->second.tg.c_str());
+ puts("\t\t},");++it;
+ }
+ puts("\t\t{");
+ printf("\t\t\t\"filename\":\"%s\",\n",it->first.c_str());
+ printf("\t\t\t\"title\":\"%s\",\n",it->second.t.c_str());
+ printf("\t\t\t\"date\":\"%s\",\n",it->second.d.c_str());
+ printf("\t\t\t\"tags\":\"%s\"\n",it->second.tg.c_str());
+ puts("\t\t}");
+ puts("\t]");
+ puts("}");
+ }
+ }
+ return 0;
+}
diff --git a/blog/sbs_2/cgi-src/get-post-content b/blog/sbs_2/cgi-src/get-post-content
new file mode 100755
index 0000000..e6701c8
--- /dev/null
+++ b/blog/sbs_2/cgi-src/get-post-content
Binary files differ
diff --git a/blog/sbs_2/cgi-src/get-post-content.cpp b/blog/sbs_2/cgi-src/get-post-content.cpp
new file mode 100644
index 0000000..62cd5d8
--- /dev/null
+++ b/blog/sbs_2/cgi-src/get-post-content.cpp
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2017 Chris Xiong
+ *
+ * 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.
+ */
+/*
+ * Get content of a post
+ * query parameters:
+ * p=<string>: post file name
+ * returned object:
+ * HTML fragment of the post
+ */
+#include <dirent.h>
+#include <cstdio>
+#include <cstring>
+#include <algorithm>
+#include <functional>
+#include <vector>
+#include <string>
+#include "cgiutils.hpp"
+#define stripr(s) s[strlen(s)-1]=='\n'?s[strlen(s)-1]=0:0
+std::vector<std::string> fn;
+char buf[262144];
+size_t sz;
+void encrypt()
+{
+ std::string b(buf,sz);
+ for(size_t p=b.find("<encrypted"),i=0;p!=std::string::npos;p=b.find("<encrypted",p),++i)
+ {
+ size_t tag_end=b.find(">",p);
+ std::string attrib=b.substr(p+11,tag_end-p-11);
+ DOMAttrib a(attrib);
+ std::string cont=b.substr(tag_end+1,b.find("</encrypted>",p)-tag_end-1);
+ unsigned hash=5381;
+ std::string key=a.getAttrib("key");
+ a.eraseAttrib("key");
+ for(size_t j=0;j<cont.length();++j)
+ {
+ hash=((hash<<5)+hash)+*reinterpret_cast<unsigned char*>(&cont[j]);
+ cont[j]^=key[j%key.length()];
+ }
+ a.setAttrib("encont",base64_encode(cont));
+ a.setAttrib("hash",std::to_string(hash));
+ a.setAttrib("id","encrypted"+std::to_string(i));
+ cont="Encrypted content here. Click <a href=\"javascript:void(0)\" onclick=\"decryptui("+std::to_string(i)+")\">here</a> to decrypt.";
+ b.replace(p,b.find("</encrypted>",p)-p,"<encrypted "+a.to_string()+">"+cont);
+ p=b.find("</encrypted>",p);
+ }
+ memcpy(buf,b.c_str(),b.length());sz=b.length();
+}
+int main(int argc,char** argv,char** envp)
+{
+ QueryStrParser a;
+ HTTPHeader h;
+ if(!a.exist("p")){h.setStatusCode(400);h.print();return 0;}
+ FILE* f=fopen(("/var/www/html/blog/content/"+a.value("p")+".txt").c_str(),"r");
+ if(!f){h.setStatusCode(400);h.print();return 0;}
+ h.appendHeader("Content-type: text/plain; charset=utf-8");
+ h.print();
+ sz=fread(buf,sizeof(char),262144,f);
+ encrypt();
+ fwrite(buf,sizeof(char),sz,stdout);
+ fclose(f);
+ return 0;
+}
diff --git a/blog/sbs_2/decryptor.js b/blog/sbs_2/decryptor.js
new file mode 100644
index 0000000..dcd64e3
--- /dev/null
+++ b/blog/sbs_2/decryptor.js
@@ -0,0 +1,73 @@
+//License: Expat(MIT)
+//Chrisoft Xiong 2017
+// http://www.onicos.com/staff/iz/amuse/javascript/expert/utf.txt
+function Utf8ArrayToStr(array){
+ var out,i,len,c;
+ var char2,char3;
+ out="";
+ len=array.length;
+ i=0;
+ while(i<len){
+ c=array[i++];
+ switch(c>>4)
+ {
+ case 0:case 1:case 2:case 3:case 4:case 5:case 6:case 7:
+ // 0xxxxxxx
+ out+=String.fromCharCode(c);
+ break;
+ case 12:case 13:
+ // 110x xxxx 10xx xxxx
+ char2=array[i++];
+ out+=String.fromCharCode(((c&0x1F)<<6)|(char2&0x3F));
+ break;
+ case 14:
+ // 1110 xxxx 10xx xxxx 10xx xxxx
+ char2=array[i++];
+ char3=array[i++];
+ out+=String.fromCharCode(((c&0x0F)<<12)|
+ ((char2&0x3F)<<6)|
+ ((char3&0x3F)<<0));
+ break;
+ }
+ }
+ return out;
+}
+var decid;
+function decryptui(id)
+{
+ document.getElementById("decryptui").style.display="block";
+ document.getElementById("keyinp").focus();
+ setTimeout(function(){document.getElementById("decryptui").style.opacity="1";},20);
+ decid=id;
+ document.getElementById("keyhint").innerHTML="Hint: "+document.getElementById("encrypted"+id).getAttribute("hint");
+ document.getElementById("keyinp").onkeypress=function(e){if(e.keyCode==13)document.getElementById('btndecrypt').click();}
+}
+function hidedecryptui()
+{
+ document.getElementById("decryptui").style.opacity="0";
+ setTimeout(function(){
+ document.getElementById("decryptui").style.display="none";
+ document.getElementById("keyinp").value="";
+ },500);
+}
+function decryptor(id,key)
+{
+ var e=document.getElementById("encrypted"+id);
+ var cont=e.getAttribute("encont");
+ var bc=atob(cont);
+ var b=new Array(bc.length);
+ for(var i=0;i<bc.length;++i)b[i]=bc.charCodeAt(i);
+ var lkey=key.length;
+ var u8arr=new Uint8Array(b);
+ var hash=5381;
+ for(var i=0;i<u8arr.length;++i){u8arr[i]^=key.charCodeAt(i%lkey);hash=(hash*33)+u8arr[i];hash%=4294967296;}
+ if(hash!=parseInt(e.getAttribute("hash")))
+ {
+ alert("The decryption key you have entered could be wrong, please try again.");
+ return;
+ }
+ //e.innerHTML=new TextDecoder("utf-8").decode(u8arr);
+ e.innerHTML=Utf8ArrayToStr(u8arr);
+ footnoter();
+ hidedecryptui();
+}
diff --git a/blog/sbs_2/footnoter.js b/blog/sbs_2/footnoter.js
new file mode 100644
index 0000000..a1b2d8b
--- /dev/null
+++ b/blog/sbs_2/footnoter.js
@@ -0,0 +1,24 @@
+//License: MIT
+//Chrisoft Xiong 2017
+var starting=0;
+function footnoter()
+{
+ var footnotes=document.body.getElementsByTagName("footnote");
+ for(var i=0;i<footnotes.length;++i)
+ {
+ var s=footnotes[i].innerHTML;
+ footnotes[i].innerHTML="";//IE is stupid
+ var a=document.createElement("a");
+ a.setAttribute("id","n"+(starting+i+1));
+ a.setAttribute("href","#note"+(starting+i+1));
+ a.setAttribute("class","note");
+ a.innerHTML="["+(starting+i+1)+"]";
+ footnotes[i].parentNode.insertBefore(a,footnotes[i]);
+ var span=document.createElement("span");
+ span.setAttribute("class","TText");
+ span.innerHTML="<a id=\"note"+(starting+i+1)+"\" href=\"#n"+(starting+i+1)+"\">["+(starting+i+1)+"]</a>: "+s+"<br>";
+ document.getElementById("notediv").appendChild(span);
+ }
+ starting+=footnotes.length;
+ while(footnotes.length)footnotes[0].remove();
+}
diff --git a/blog/sbs_2/index.html b/blog/sbs_2/index.html
new file mode 100644
index 0000000..d7c31c9
--- /dev/null
+++ b/blog/sbs_2/index.html
@@ -0,0 +1 @@
+<script>window.location="list/"</script>
diff --git a/blog/sbs_2/list b/blog/sbs_2/list
new file mode 100644
index 0000000..e1f751e
--- /dev/null
+++ b/blog/sbs_2/list
@@ -0,0 +1,94 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<title>Chrisoft::Blog</title>
+<script type="text/javascript" src="/panel.js"></script>
+<script type="text/javascript" src="/blog/bloglist.js"></script>
+<link rel="stylesheet" type="text/css" href="/common.css">
+<link rel="stylesheet" type="text/css" href="/panel.css">
+<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
+<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
+<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
+<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
+<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
+<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
+<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
+<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
+<link rel="stylesheet" type="text/css" href="/blog/blogext.css">
+<script>
+function ol()
+{
+ window.onresize=function()
+ {
+ if(window.innerWidth<768)
+ setupevents();
+ else unsetevents();
+ }
+ window.onresize();
+ blinit();
+}
+function loadTheme(){
+ var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
+ if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
+ var ent="";
+ var d=new Date();
+ if(thm[0]=='z')
+ {
+ var m=d.getMonth()+1;
+ if(m>=3&&m<6)thm='0'+thm[1];
+ else if(m>=6&&m<9)thm='1'+thm[1];
+ else if(m>=9&&m<12)thm='2'+thm[1];
+ else thm='3'+thm[1];
+ }
+ if(thm[1]=='z')
+ {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
+ ent=`theme${thm}`;
+ var R=new RegExp('theme[0-4][ab]');
+ for(var i=0;i<document.styleSheets.length;++i)
+ {
+ if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
+ document.styleSheets[i].disabled=true;
+ else document.styleSheets[i].disabled=false;
+ }
+}
+loadTheme();
+</script>
+</head>
+<body onload="ol()" style="overflow-x:hidden;">
+ <div id="panel" class="TText">
+ <ul id="panellist">
+ <li><a href="/"><h1>Chrisoft</h1></a></li>
+ <li><a href="/blog"><h2>Blog</h2></a></li>
+ <li><span>Tags filter</span>
+ <ul id="tagslist">
+ </ul>
+ </li>
+ </ul>
+ </div>
+ <div id="content">
+ <div class="block TText" id="ptemplate" style="position:relative;transition:500ms;">
+ <h3 style="line-height:1.5em;">Title</h3>
+ <br>
+ <div style="display:table;width:100%;table-layout:fixed;"><span class="left">tags</span>
+ <span class="right">time</span></div>
+ </div>
+ <div id="insanch" style="height:5em;"></div>
+ <div id="footer" style="">
+ <div id="pagesw" class="TText" style="display:table;width:100%;padding:1em 0;">
+ <span style="display:table-cell;"><a href="javascript:void(0);" onclick="lastpage();">&lt;&lt;</a></span>
+ <span style="text-align:center;display:table-cell;" id="curp"></span>
+ <span style="text-align:right;display:table-cell;"><a href="javascript:void(0);" onclick="nextpage();">&gt;&gt;</a></span>
+ </div>
+ <div style="text-align:center;" class="TText">
+ Proudly powered by SBS <reduced style="font-size:70%;">(the stupid blogging system)</reduced> 2.1
+ <br>
+ Content licensed under CC BY-SA 4.0.
+ </div>
+ </div>
+ <div id="cmdbuf" class="TText" style="transition:500ms;padding:1em;font-size:2em;color:white;position:absolute;background-color:rgba(0,0,0,0.6);left:50%;top:50%;transform:translate(-50%,-50%);pointer-events:none;opacity:0;">
+ </div>
+ </div>
+</body>
+</html>
diff --git a/blog/sbs_2/post b/blog/sbs_2/post
new file mode 100644
index 0000000..4ea512d
--- /dev/null
+++ b/blog/sbs_2/post
@@ -0,0 +1,108 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<title>Chrisoft::Blog</title>
+<script type="text/javascript" src="/panel.js"></script>
+<script type="text/javascript" src="/blog/blogpost.js"></script>
+<script type="text/javascript" src="/blog/footnoter.js"></script>
+<script type="text/javascript" src="/blog/decryptor.js"></script>
+<link rel="stylesheet" type="text/css" href="/common.css">
+<link rel="stylesheet" type="text/css" href="/panel.css">
+<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
+<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
+<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
+<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
+<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
+<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
+<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
+<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
+<link rel="stylesheet" type="text/css" href="/blog/blogext.css">
+<script>
+function ol()
+{
+ window.onresize=function()
+ {
+ if(window.innerWidth<768)
+ setupevents();
+ else unsetevents();
+ }
+ window.onresize();
+ bpinit();
+}
+function loadTheme(){
+ var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
+ if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
+ var ent="";
+ var d=new Date();
+ if(thm[0]=='z')
+ {
+ var m=d.getMonth()+1;
+ if(m>=3&&m<6)thm='0'+thm[1];
+ else if(m>=6&&m<9)thm='1'+thm[1];
+ else if(m>=9&&m<12)thm='2'+thm[1];
+ else thm='3'+thm[1];
+ }
+ if(thm[1]=='z')
+ {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
+ ent=`theme${thm}`;
+ var R=new RegExp('theme[0-4][ab]');
+ for(var i=0;i<document.styleSheets.length;++i)
+ {
+ if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
+ document.styleSheets[i].disabled=true;
+ else document.styleSheets[i].disabled=false;
+ }
+}
+loadTheme();
+</script>
+</head>
+<body onload="ol()" style="overflow-x:hidden;">
+ <div id="panel" class="TText">
+ <ul id="panellist">
+ <li><a href="/"><h1>Chrisoft</h1></a></li>
+ <li><a href="/blog"><h2>Blog</h2></a></li>
+ <li><a href="#"><h3 id="title"></h3></a></li>
+ <li><span>Tags</span>
+ <ul id="tagslist">
+ </ul>
+ </li>
+ <li id="tocouter">
+ <span>Table of Contents</span>
+ <ul id="tocroot">
+ </ul>
+ </li>
+ <li style="margin-left:-0.5em"><a href="javascript:void(0);" onclick="prevpost();">Prev post</a></li>
+ <li style="margin-left:-0.5em"><a href="javascript:void(0);" onclick="succpost();">Next post</a></li>
+ </ul>
+ </div>
+ <div id="content">
+ <h2 id="titleh" class="TText" style="font-wight:normal;"></h2>
+ <div id="datetags" class="TText" style="margin-bottom:1em;"></div>
+ <div id="article" class="TText"></div><br><hr>
+ <div class="TText" id="notediv" style="font-size:80%;"></div>
+ <div id="insanch" style="height:3em;"></div>
+ <div id="footer" style="">
+ <div id="pagesw" class="TText" style="width:100%;height:0.5em;"></div>
+ <div style="text-align:center;" class="TText">
+ Proudly powered by SBS <reduced style="font-size:70%;">(the stupid blogging system)</reduced> 2.1
+ <br>
+ Content licensed under CC BY-SA 4.0.
+ </div>
+ </div>
+ <div id="cmdbuf" class="TText" style="transition:500ms;padding:1em;font-size:2em;color:white;position:absolute;background-color:rgba(0,0,0,0.6);left:50%;top:50%;transform:translate(-50%,-50%);pointer-events:none;opacity:0;">
+ </div>
+ </div>
+ <div id="decryptui" style="display:none;opacity:0;color:white;z-index:10;position:fixed;left:0;top:0;width:100%;height:100%;background-color:rgba(0,0,0,0.4);transition:opacity 0.5s;">
+ <div id="decryptdlg" class="TText" style="padding:10px 20px;position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);background-color:rgba(0,0,0,0.6);">
+ <div id="keyhint" style="margin-bottom:8px;"></div>
+ <div style="margin-bottom:8px;">Key: <input id="keyinp" type="text"></div>
+ <div style="height:2.25em;">
+ <button id="btndecrypt" onclick="decryptor(decid,document.getElementById('keyinp').value);" style="position:absolute;left:20px;">Decrypt</button>
+ <button onclick="hidedecryptui();" style="position:absolute;right:20px;">Cancel</button>
+ </div>
+ </form>
+ </div>
+</body>
+</html>
diff --git a/blog/scrypt.js b/blog/scrypt.js
new file mode 100644
index 0000000..4ab31c8
--- /dev/null
+++ b/blog/scrypt.js
@@ -0,0 +1,452 @@
+"use strict";
+
+(function(root) {
+ var MAX_VALUE = 0x7fffffff;
+
+ // The SHA256 and PBKDF2 implementation are from scrypt-async-js:
+ // See: https://github.com/dchest/scrypt-async-js
+ function SHA256(m) {
+ var K = [
+ 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b,
+ 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01,
+ 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7,
+ 0xc19bf174, 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,
+ 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152,
+ 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147,
+ 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc,
+ 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
+ 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819,
+ 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08,
+ 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f,
+ 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
+ 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
+ ];
+
+ var h0 = 0x6a09e667, h1 = 0xbb67ae85, h2 = 0x3c6ef372, h3 = 0xa54ff53a;
+ var h4 = 0x510e527f, h5 = 0x9b05688c, h6 = 0x1f83d9ab, h7 = 0x5be0cd19;
+ var w = new Array(64);
+
+ function blocks(p) {
+ var off = 0, len = p.length;
+ while (len >= 64) {
+ var a = h0, b = h1, c = h2, d = h3, e = h4, f = h5, g = h6, h = h7, u, i, j, t1, t2;
+
+ for (i = 0; i < 16; i++) {
+ j = off + i*4;
+ w[i] = ((p[j] & 0xff)<<24) | ((p[j+1] & 0xff)<<16) |
+ ((p[j+2] & 0xff)<<8) | (p[j+3] & 0xff);
+ }
+
+ for (i = 16; i < 64; i++) {
+ u = w[i-2];
+ t1 = ((u>>>17) | (u<<(32-17))) ^ ((u>>>19) | (u<<(32-19))) ^ (u>>>10);
+
+ u = w[i-15];
+ t2 = ((u>>>7) | (u<<(32-7))) ^ ((u>>>18) | (u<<(32-18))) ^ (u>>>3);
+
+ w[i] = (((t1 + w[i-7]) | 0) + ((t2 + w[i-16]) | 0)) | 0;
+ }
+
+ for (i = 0; i < 64; i++) {
+ t1 = ((((((e>>>6) | (e<<(32-6))) ^ ((e>>>11) | (e<<(32-11))) ^
+ ((e>>>25) | (e<<(32-25)))) + ((e & f) ^ (~e & g))) | 0) +
+ ((h + ((K[i] + w[i]) | 0)) | 0)) | 0;
+
+ t2 = ((((a>>>2) | (a<<(32-2))) ^ ((a>>>13) | (a<<(32-13))) ^
+ ((a>>>22) | (a<<(32-22)))) + ((a & b) ^ (a & c) ^ (b & c))) | 0;
+
+ h = g;
+ g = f;
+ f = e;
+ e = (d + t1) | 0;
+ d = c;
+ c = b;
+ b = a;
+ a = (t1 + t2) | 0;
+ }
+
+ h0 = (h0 + a) | 0;
+ h1 = (h1 + b) | 0;
+ h2 = (h2 + c) | 0;
+ h3 = (h3 + d) | 0;
+ h4 = (h4 + e) | 0;
+ h5 = (h5 + f) | 0;
+ h6 = (h6 + g) | 0;
+ h7 = (h7 + h) | 0;
+
+ off += 64;
+ len -= 64;
+ }
+ }
+
+ blocks(m);
+
+ var i, bytesLeft = m.length % 64,
+ bitLenHi = (m.length / 0x20000000) | 0,
+ bitLenLo = m.length << 3,
+ numZeros = (bytesLeft < 56) ? 56 : 120,
+ p = m.slice(m.length - bytesLeft, m.length);
+
+ p.push(0x80);
+ for (i = bytesLeft + 1; i < numZeros; i++) { p.push(0); }
+ p.push((bitLenHi>>>24) & 0xff);
+ p.push((bitLenHi>>>16) & 0xff);
+ p.push((bitLenHi>>>8) & 0xff);
+ p.push((bitLenHi>>>0) & 0xff);
+ p.push((bitLenLo>>>24) & 0xff);
+ p.push((bitLenLo>>>16) & 0xff);
+ p.push((bitLenLo>>>8) & 0xff);
+ p.push((bitLenLo>>>0) & 0xff);
+
+ blocks(p);
+
+ return [
+ (h0>>>24) & 0xff, (h0>>>16) & 0xff, (h0>>>8) & 0xff, (h0>>>0) & 0xff,
+ (h1>>>24) & 0xff, (h1>>>16) & 0xff, (h1>>>8) & 0xff, (h1>>>0) & 0xff,
+ (h2>>>24) & 0xff, (h2>>>16) & 0xff, (h2>>>8) & 0xff, (h2>>>0) & 0xff,
+ (h3>>>24) & 0xff, (h3>>>16) & 0xff, (h3>>>8) & 0xff, (h3>>>0) & 0xff,
+ (h4>>>24) & 0xff, (h4>>>16) & 0xff, (h4>>>8) & 0xff, (h4>>>0) & 0xff,
+ (h5>>>24) & 0xff, (h5>>>16) & 0xff, (h5>>>8) & 0xff, (h5>>>0) & 0xff,
+ (h6>>>24) & 0xff, (h6>>>16) & 0xff, (h6>>>8) & 0xff, (h6>>>0) & 0xff,
+ (h7>>>24) & 0xff, (h7>>>16) & 0xff, (h7>>>8) & 0xff, (h7>>>0) & 0xff
+ ];
+ }
+
+ function PBKDF2_HMAC_SHA256_OneIter(password, salt, dkLen) {
+ // compress password if it's longer than hash block length
+ password = password.length <= 64 ? password : SHA256(password);
+
+ var i;
+ var innerLen = 64 + salt.length + 4;
+ var inner = new Array(innerLen);
+ var outerKey = new Array(64);
+ var dk = [];
+
+ // inner = (password ^ ipad) || salt || counter
+ for (i = 0; i < 64; i++) inner[i] = 0x36;
+ for (i = 0; i < password.length; i++) inner[i] ^= password[i];
+ for (i = 0; i < salt.length; i++) inner[64+i] = salt[i];
+ for (i = innerLen - 4; i < innerLen; i++) inner[i] = 0;
+
+ // outerKey = password ^ opad
+ for (i = 0; i < 64; i++) outerKey[i] = 0x5c;
+ for (i = 0; i < password.length; i++) outerKey[i] ^= password[i];
+
+ // increments counter inside inner
+ function incrementCounter() {
+ for (var i = innerLen-1; i >= innerLen-4; i--) {
+ inner[i]++;
+ if (inner[i] <= 0xff) return;
+ inner[i] = 0;
+ }
+ }
+
+ // output blocks = SHA256(outerKey || SHA256(inner)) ...
+ while (dkLen >= 32) {
+ incrementCounter();
+ dk = dk.concat(SHA256(outerKey.concat(SHA256(inner))));
+ dkLen -= 32;
+ }
+ if (dkLen > 0) {
+ incrementCounter();
+ dk = dk.concat(SHA256(outerKey.concat(SHA256(inner))).slice(0, dkLen));
+ }
+
+ return dk;
+ }
+
+ // The following is an adaptation of scryptsy
+ // See: https://www.npmjs.com/package/scryptsy
+ function blockmix_salsa8(BY, Yi, r, x, _X) {
+ var i;
+
+ arraycopy(BY, (2 * r - 1) * 16, _X, 0, 16);
+ for (i = 0; i < 2 * r; i++) {
+ blockxor(BY, i * 16, _X, 16);
+ salsa20_8(_X, x);
+ arraycopy(_X, 0, BY, Yi + (i * 16), 16);
+ }
+
+ for (i = 0; i < r; i++) {
+ arraycopy(BY, Yi + (i * 2) * 16, BY, (i * 16), 16);
+ }
+
+ for (i = 0; i < r; i++) {
+ arraycopy(BY, Yi + (i * 2 + 1) * 16, BY, (i + r) * 16, 16);
+ }
+ }
+
+ function R(a, b) {
+ return (a << b) | (a >>> (32 - b));
+ }
+
+ function salsa20_8(B, x) {
+ arraycopy(B, 0, x, 0, 16);
+
+ for (var i = 8; i > 0; i -= 2) {
+ x[ 4] ^= R(x[ 0] + x[12], 7);
+ x[ 8] ^= R(x[ 4] + x[ 0], 9);
+ x[12] ^= R(x[ 8] + x[ 4], 13);
+ x[ 0] ^= R(x[12] + x[ 8], 18);
+ x[ 9] ^= R(x[ 5] + x[ 1], 7);
+ x[13] ^= R(x[ 9] + x[ 5], 9);
+ x[ 1] ^= R(x[13] + x[ 9], 13);
+ x[ 5] ^= R(x[ 1] + x[13], 18);
+ x[14] ^= R(x[10] + x[ 6], 7);
+ x[ 2] ^= R(x[14] + x[10], 9);
+ x[ 6] ^= R(x[ 2] + x[14], 13);
+ x[10] ^= R(x[ 6] + x[ 2], 18);
+ x[ 3] ^= R(x[15] + x[11], 7);
+ x[ 7] ^= R(x[ 3] + x[15], 9);
+ x[11] ^= R(x[ 7] + x[ 3], 13);
+ x[15] ^= R(x[11] + x[ 7], 18);
+ x[ 1] ^= R(x[ 0] + x[ 3], 7);
+ x[ 2] ^= R(x[ 1] + x[ 0], 9);
+ x[ 3] ^= R(x[ 2] + x[ 1], 13);
+ x[ 0] ^= R(x[ 3] + x[ 2], 18);
+ x[ 6] ^= R(x[ 5] + x[ 4], 7);
+ x[ 7] ^= R(x[ 6] + x[ 5], 9);
+ x[ 4] ^= R(x[ 7] + x[ 6], 13);
+ x[ 5] ^= R(x[ 4] + x[ 7], 18);
+ x[11] ^= R(x[10] + x[ 9], 7);
+ x[ 8] ^= R(x[11] + x[10], 9);
+ x[ 9] ^= R(x[ 8] + x[11], 13);
+ x[10] ^= R(x[ 9] + x[ 8], 18);
+ x[12] ^= R(x[15] + x[14], 7);
+ x[13] ^= R(x[12] + x[15], 9);
+ x[14] ^= R(x[13] + x[12], 13);
+ x[15] ^= R(x[14] + x[13], 18);
+ }
+
+ for (i = 0; i < 16; ++i) {
+ B[i] += x[i];
+ }
+ }
+
+ // naive approach... going back to loop unrolling may yield additional performance
+ function blockxor(S, Si, D, len) {
+ for (var i = 0; i < len; i++) {
+ D[i] ^= S[Si + i]
+ }
+ }
+
+ function arraycopy(src, srcPos, dest, destPos, length) {
+ while (length--) {
+ dest[destPos++] = src[srcPos++];
+ }
+ }
+
+ function checkBufferish(o) {
+ if (!o || typeof(o.length) !== 'number') {
+ return false;
+ }
+ for (var i = 0; i < o.length; i++) {
+ if (typeof(o[i]) !== 'number') { return false; }
+
+ var v = parseInt(o[i]);
+ if (v != o[i] || v < 0 || v >= 256) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ function ensureInteger(value, name) {
+ var intValue = parseInt(value);
+ if (value != intValue) { throw new Error('invalid ' + name); }
+ return intValue;
+ }
+
+ // N = Cpu cost, r = Memory cost, p = parallelization cost
+ // callback(error, progress, key)
+ function scrypt(password, salt, N, r, p, dkLen, callback) {
+
+ if (!callback) { throw new Error('missing callback'); }
+
+ N = ensureInteger(N, 'N');
+ r = ensureInteger(r, 'r');
+ p = ensureInteger(p, 'p');
+
+ dkLen = ensureInteger(dkLen, 'dkLen');
+
+ if (N === 0 || (N & (N - 1)) !== 0) { throw new Error('N must be power of 2'); }
+
+ if (N > MAX_VALUE / 128 / r) { throw new Error('N too large'); }
+ if (r > MAX_VALUE / 128 / p) { throw new Error('r too large'); }
+
+ if (!checkBufferish(password)) {
+ throw new Error('password must be an array or buffer');
+ }
+
+ if (!checkBufferish(salt)) {
+ throw new Error('salt must be an array or buffer');
+ }
+
+ var b = PBKDF2_HMAC_SHA256_OneIter(password, salt, p * 128 * r);
+ var B = new Uint32Array(p * 32 * r)
+ for (var i = 0; i < B.length; i++) {
+ var j = i * 4;
+ B[i] = ((b[j + 3] & 0xff) << 24) |
+ ((b[j + 2] & 0xff) << 16) |
+ ((b[j + 1] & 0xff) << 8) |
+ ((b[j + 0] & 0xff) << 0);
+ }
+
+ var XY = new Uint32Array(64 * r);
+ var V = new Uint32Array(32 * r * N);
+
+ var Yi = 32 * r;
+
+ // scratch space
+ var x = new Uint32Array(16); // salsa20_8
+ var _X = new Uint32Array(16); // blockmix_salsa8
+
+ var totalOps = p * N * 2;
+ var currentOp = 0;
+ var lastPercent10 = null;
+
+ // Set this to true to abandon the scrypt on the next step
+ var stop = false;
+
+ // State information
+ var state = 0;
+ var i0 = 0, i1;
+ var Bi;
+
+ // How many blockmix_salsa8 can we do per step?
+ var limit = parseInt(1000 / r);
+
+ // Trick from scrypt-async; if there is a setImmediate shim in place, use it
+ var nextTick = (typeof(setImmediate) !== 'undefined') ? setImmediate : setTimeout;
+
+ // This is really all I changed; making scryptsy a state machine so we occasionally
+ // stop and give other evnts on the evnt loop a chance to run. ~RicMoo
+ var incrementalSMix = function() {
+ if (stop) {
+ return callback(new Error('cancelled'), currentOp / totalOps);
+ }
+
+ switch (state) {
+ case 0:
+ // for (var i = 0; i < p; i++)...
+ Bi = i0 * 32 * r;
+
+ arraycopy(B, Bi, XY, 0, Yi); // ROMix - 1
+
+ state = 1; // Move to ROMix 2
+ i1 = 0;
+
+ // Fall through
+
+ case 1:
+
+ // Run up to 1000 steps of the first inner smix loop
+ var steps = N - i1;
+ if (steps > limit) { steps = limit; }
+ for (var i = 0; i < steps; i++) { // ROMix - 2
+ arraycopy(XY, 0, V, (i1 + i) * Yi, Yi) // ROMix - 3
+ blockmix_salsa8(XY, Yi, r, x, _X); // ROMix - 4
+ }
+
+ // for (var i = 0; i < N; i++)
+ i1 += steps;
+ currentOp += steps;
+
+ // Call the callback with the progress (optionally stopping us)
+ var percent10 = parseInt(1000 * currentOp / totalOps);
+ if (percent10 !== lastPercent10) {
+ stop = callback(null, currentOp / totalOps);
+ if (stop) { break; }
+ lastPercent10 = percent10;
+ }
+
+ if (i1 < N) {
+ break;
+ }
+
+ i1 = 0; // Move to ROMix 6
+ state = 2;
+
+ // Fall through
+
+ case 2:
+
+ // Run up to 1000 steps of the second inner smix loop
+ var steps = N - i1;
+ if (steps > limit) { steps = limit; }
+ for (var i = 0; i < steps; i++) { // ROMix - 6
+ var offset = (2 * r - 1) * 16; // ROMix - 7
+ var j = XY[offset] & (N - 1);
+ blockxor(V, j * Yi, XY, Yi); // ROMix - 8 (inner)
+ blockmix_salsa8(XY, Yi, r, x, _X); // ROMix - 9 (outer)
+ }
+
+ // for (var i = 0; i < N; i++)...
+ i1 += steps;
+ currentOp += steps;
+
+ // Call the callback with the progress (optionally stopping us)
+ var percent10 = parseInt(1000 * currentOp / totalOps);
+ if (percent10 !== lastPercent10) {
+ stop = callback(null, currentOp / totalOps);
+ if (stop) { break; }
+ lastPercent10 = percent10;
+ }
+
+ if (i1 < N) {
+ break;
+ }
+
+ arraycopy(XY, 0, B, Bi, Yi); // ROMix - 10
+
+ // for (var i = 0; i < p; i++)...
+ i0++;
+ if (i0 < p) {
+ state = 0;
+ break;
+ }
+
+ b = [];
+ for (var i = 0; i < B.length; i++) {
+ b.push((B[i] >> 0) & 0xff);
+ b.push((B[i] >> 8) & 0xff);
+ b.push((B[i] >> 16) & 0xff);
+ b.push((B[i] >> 24) & 0xff);
+ }
+
+ var derivedKey = PBKDF2_HMAC_SHA256_OneIter(password, b, dkLen);
+
+ // Done; don't break (which would reschedule)
+ return callback(null, 1.0, derivedKey);
+ }
+
+ // Schedule the next steps
+ nextTick(incrementalSMix);
+ }
+
+ // Bootstrap the incremental smix
+ incrementalSMix();
+ }
+
+ // node.js
+ if (typeof(exports) !== 'undefined') {
+ module.exports = scrypt;
+
+ // RequireJS/AMD
+ // http://www.requirejs.org/docs/api.html
+ // https://github.com/amdjs/amdjs-api/wiki/AMD
+ } else if (typeof(define) === 'function' && define.amd) {
+ define(scrypt);
+
+ // Web Browsers
+ } else if (root) {
+
+ // If there was an existing library "scrypt", make sure it is still available
+ if (root.scrypt) {
+ root._scrypt = root.scrypt;
+ }
+
+ root.scrypt = scrypt;
+ }
+
+})(this);
diff --git a/blog/sha256.js b/blog/sha256.js
new file mode 100644
index 0000000..65ed579
--- /dev/null
+++ b/blog/sha256.js
@@ -0,0 +1,172 @@
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+/* SHA-256 (FIPS 180-4) implementation in JavaScript (c) Chris Veness 2002-2017 */
+/* MIT Licence */
+/* www.movable-type.co.uk/scripts/sha256.html */
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+
+'use strict';
+
+/**
+ * SHA-256 hash function reference implementation.
+ *
+ * This is an annotated direct implementation of FIPS 180-4, without any optimisations. It is
+ * intended to aid understanding of the algorithm rather than for production use.
+ *
+ * While it could be used where performance is not critical, I would recommend using the ‘Web
+ * Cryptography API’ (developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/digest) for the browser,
+ * or the ‘crypto’ library (nodejs.org/api/crypto.html#crypto_class_hash) in Node.js.
+ *
+ * See csrc.nist.gov/groups/ST/toolkit/secure_hashing.html
+ * csrc.nist.gov/groups/ST/toolkit/examples.html
+ */
+class Sha256 {
+
+ /**
+ * Generates SHA-256 hash of string.
+ *
+ * @param {string} msg - (Unicode) string to be hashed.
+ * @param {Object} [options]
+ * @param {string} [options.msgFormat=string] - Message format: 'string' for JavaScript string
+ * (gets converted to UTF-8 for hashing); 'hex-bytes' for string of hex bytes ('616263' ≡ 'abc') .
+ * @param {string} [options.outFormat=hex] - Output format: 'hex' for string of contiguous
+ * hex bytes; 'hex-w' for grouping hex bytes into groups of (4 byte / 8 character) words.
+ * @returns {string} Hash of msg as hex character string.
+ */
+ static hash(msg, options) {
+ const defaults = { msgFormat: 'string', outFormat: 'hex' };
+ const opt = Object.assign(defaults, options);
+
+ // note use throughout this routine of 'n >>> 0' to coerce Number 'n' to unsigned 32-bit integer
+
+ switch (opt.msgFormat) {
+ default: // default is to convert string to UTF-8, as SHA only deals with byte-streams
+ case 'string': msg = utf8Encode(msg); break;
+ case 'hex-bytes':msg = hexBytesToString(msg); break; // mostly for running tests
+ }
+
+ // constants [§4.2.2]
+ const K = [
+ 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
+ 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
+ 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
+ 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
+ 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
+ 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
+ 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
+ 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 ];
+
+ // initial hash value [§5.3.3]
+ const H = [
+ 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19 ];
+
+ // PREPROCESSING [§6.2.1]
+
+ msg += String.fromCharCode(0x80); // add trailing '1' bit (+ 0's padding) to string [§5.1.1]
+
+ // convert string msg into 512-bit blocks (array of 16 32-bit integers) [§5.2.1]
+ const l = msg.length/4 + 2; // length (in 32-bit integers) of msg + ‘1’ + appended length
+ const N = Math.ceil(l/16); // number of 16-integer (512-bit) blocks required to hold 'l' ints
+ const M = new Array(N); // message M is N×16 array of 32-bit integers
+
+ for (let i=0; i<N; i++) {
+ M[i] = new Array(16);
+ for (let j=0; j<16; j++) { // encode 4 chars per integer (64 per block), big-endian encoding
+ M[i][j] = (msg.charCodeAt(i*64+j*4+0)<<24) | (msg.charCodeAt(i*64+j*4+1)<<16)
+ | (msg.charCodeAt(i*64+j*4+2)<< 8) | (msg.charCodeAt(i*64+j*4+3)<< 0);
+ } // note running off the end of msg is ok 'cos bitwise ops on NaN return 0
+ }
+ // add length (in bits) into final pair of 32-bit integers (big-endian) [§5.1.1]
+ // note: most significant word would be (len-1)*8 >>> 32, but since JS converts
+ // bitwise-op args to 32 bits, we need to simulate this by arithmetic operators
+ const lenHi = ((msg.length-1)*8) / Math.pow(2, 32);
+ const lenLo = ((msg.length-1)*8) >>> 0;
+ M[N-1][14] = Math.floor(lenHi);
+ M[N-1][15] = lenLo;
+
+
+ // HASH COMPUTATION [§6.2.2]
+
+ for (let i=0; i<N; i++) {
+ const W = new Array(64);
+
+ // 1 - prepare message schedule 'W'
+ for (let t=0; t<16; t++) W[t] = M[i][t];
+ for (let t=16; t<64; t++) {
+ W[t] = (Sha256.σ1(W[t-2]) + W[t-7] + Sha256.σ0(W[t-15]) + W[t-16]) >>> 0;
+ }
+
+ // 2 - initialise working variables a, b, c, d, e, f, g, h with previous hash value
+ let a = H[0], b = H[1], c = H[2], d = H[3], e = H[4], f = H[5], g = H[6], h = H[7];
+
+ // 3 - main loop (note '>>> 0' for 'addition modulo 2^32')
+ for (let t=0; t<64; t++) {
+ const T1 = h + Sha256.Σ1(e) + Sha256.Ch(e, f, g) + K[t] + W[t];
+ const T2 = Sha256.Σ0(a) + Sha256.Maj(a, b, c);
+ h = g;
+ g = f;
+ f = e;
+ e = (d + T1) >>> 0;
+ d = c;
+ c = b;
+ b = a;
+ a = (T1 + T2) >>> 0;
+ }
+
+ // 4 - compute the new intermediate hash value (note '>>> 0' for 'addition modulo 2^32')
+ H[0] = (H[0]+a) >>> 0;
+ H[1] = (H[1]+b) >>> 0;
+ H[2] = (H[2]+c) >>> 0;
+ H[3] = (H[3]+d) >>> 0;
+ H[4] = (H[4]+e) >>> 0;
+ H[5] = (H[5]+f) >>> 0;
+ H[6] = (H[6]+g) >>> 0;
+ H[7] = (H[7]+h) >>> 0;
+ }
+
+ // convert H0..H7 to hex strings (with leading zeros)
+ for (let h=0; h<H.length; h++) H[h] = ('00000000'+H[h].toString(16)).slice(-8);
+
+ // concatenate H0..H7, with separator if required
+ const separator = opt.outFormat=='hex-w' ? ' ' : '';
+
+ return H.join(separator);
+
+ /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+
+ function utf8Encode(str) {
+ try {
+ return new TextEncoder().encode(str, 'utf-8').reduce((prev, curr) => prev + String.fromCharCode(curr), '');
+ } catch (e) { // no TextEncoder available?
+ return unescape(encodeURIComponent(str)); // monsur.hossa.in/2012/07/20/utf-8-in-javascript.html
+ }
+ }
+
+ function hexBytesToString(hexStr) { // convert string of hex numbers to a string of chars (eg '616263' -> 'abc').
+ const str = hexStr.replace(' ', ''); // allow space-separated groups
+ return str=='' ? '' : str.match(/.{2}/g).map(byte => String.fromCharCode(parseInt(byte, 16))).join('');
+ }
+ }
+
+
+
+ /**
+ * Rotates right (circular right shift) value x by n positions [§3.2.4].
+ * @private
+ */
+ static ROTR(n, x) {
+ return (x >>> n) | (x << (32-n));
+ }
+
+
+ /**
+ * Logical functions [§4.1.2].
+ * @private
+ */
+ static Σ0(x) { return Sha256.ROTR(2, x) ^ Sha256.ROTR(13, x) ^ Sha256.ROTR(22, x); }
+ static Σ1(x) { return Sha256.ROTR(6, x) ^ Sha256.ROTR(11, x) ^ Sha256.ROTR(25, x); }
+ static σ0(x) { return Sha256.ROTR(7, x) ^ Sha256.ROTR(18, x) ^ (x>>>3); }
+ static σ1(x) { return Sha256.ROTR(17, x) ^ Sha256.ROTR(19, x) ^ (x>>>10); }
+ static Ch(x, y, z) { return (x & y) ^ (~x & z); } // 'choice'
+ static Maj(x, y, z) { return (x & y) ^ (x & z) ^ (y & z); } // 'majority'
+
+}