{"data":[{"title":"在 VPS 上用 Nginx 和 HTTPS 部署 Hexo 生成的页面","url":"/posts/Hexo-on-VPS-with-Nginx-and-HTTPS/","content":"这个页面记录的方案已经被作者放弃，并且由于时间久远，作者不能保证此页面内容的正确与否，请不要完全参考。昨天听说微软要收购 GitHub 了，对于我一个专业微软受害者，虽然它洗白了，但还是有着本能的不信任。同时软粉认软做父的样子我是断然接受不了的（“我微软爸爸天下第一！”“你怎么能不喜欢我微软爸爸呢！”“我微软爸爸什么时候坑过你！”），你自己喜欢就喜欢，我讨厌是我的事情，希望各位嘴下留情，不要给我喷成筛子。\n要说我受害的经历能说好几篇博客，最常见的比如说昨天答辩 PPT 轮到我时候就崩溃了（我可以确定不是我 PPT 的问题，因为关掉所有的 PowerPoint 再打开就没问题了）（“再碰这辣鸡玩意我就是狗！”）。再比如说那个出了名不靠谱的自动更新，你见过更新更新失败回滚回滚失败的嘛？合着我一小时只能对着电脑发呆看你自爆？（当然软粉肯定不承认：“我们更新都成功了！”，这玩意还心诚则灵？反正我被坑了）。倒不是说它收购 GitHub 罪大恶极了，只不过是我自己觉得不舒服就是了，至于普罗大众该干什么干什么，不要管我。\n然后我就把我还算有价值的东西——我的网站，搬到了 VPS 上面，搬迁过程相对简单，用 git 做这个同步肯定是不现实的，因为你想像 GitHub 一样可以直接用 hexo-deployer-git push 的话，你需要建立的是裸仓库，也就是正常的 .git 目录里面的东西，很显然这不是网站内容。看了一圈其他的同步方式，rsync 看起来是最合适的一个了，然后就尝试了一下。\n用 Rsync 上传 Hexo 生成的网页\n首先需要安装 hexo-deployer-rsync，另外也要在自己的电脑和 VPS 上面安装 rsync，首先进入你的 Hexo 站点目录，然后：\n$ npm i -s hexo-deployer-rsync\n\n根据发行版不同使用不同的命令安装 rsync：\nArchlinux / Manjaro / Antergos：\n# pacman -S rsync\n\nDebian / Ubuntu / LinuxMint / Deepin：\n# apt install rsync\n\nRed Hat / CentOS / Fedora（如果找不到 yum 就换成 dnf）：\n# yum install rsync\n\n接下来和很多网上的文章说的不一样，很多人把这里的设置理解成要在 VPS 上面开启一个 rsync 的服务器，实际上不是，rsync可以通过任意一个用户和 ssh 密钥连接到服务器然后复制文件。\n首先打开 你自己的电脑 上的 ~/.ssh/id_rsa.pub 获取你自己的公钥（当然你可能用的不是 RSA，自己改），然后复制这个文件，添加到 服务器 里面你要使用的用户（不建议 root 敢死队，你平时的用户就可以了）的 ~/.ssh/authorized_keys 文件里，每个密钥单独粘贴一行。如果你设置过 ssh 免密码登录的话，这一步应该做过了。\n然后打开 Hexo 站点的 _config.yml，修改 deploy 字段，如果没有设置过的话那就改成这样：\ndeploy:\n  type: rsync\n  host: YOUR VPS IP # 你的服务器的 IP 地址\n  user: YOUR USERNAME # 你刚刚复制密钥的那个用户\n  root: YOUR DESTINATION # 你想把文件上传到哪里，比如我的是 `~/stackharbor.alynx.xyz/`\n  port: 22 # 这是 ssh 默认的端口，如果你修改了，这里也要改\n  args: --progress # 额外的 rsync 参数，我这里添加了一个进度条参数，你也可以不设置\n  delete: true # 是否删除旧的文件\n  verbose: true # 是否同步时显示详细状态\n  ignore_errors: false # 忽略错误\n\n当然很多人可能已经有一个 git 的部署设置了，那也很简单，设置成一个数组就行了，像这样：\ndeploy:\n  - type: git\n    repo: # 像这样设置多个 git 仓库，`名称: 地址,分支`，逗号后面没有空格。\n      github: git@github.com:XXXXXX/XXXXXX.git,branch\n      coding: git@git.coding.net:XXXXXXX/XXXXXXX,coding-pages\n    message: Site updated by Hexo at {{ now('YYYY-MM-DD HH:mm:ss') }}.\n  - type: rsync\n    host: YOUR VPS IP # 你的服务器的 IP 地址\n    user: YOUR USERNAME # 你刚刚复制密钥的那个用户\n    root: YOUR DESTINATION # 你想把文件上传到哪里，比如我的是 `~/stackharbor.alynx.xyz/`\n    port: 22 # 这是 ssh 默认的端口，如果你修改了，这里也要改\n    args: --progress # 额外的 rsync 参数，我这里添加了一个进度条参数，你也可以不设置\n    delete: true # 是否删除旧的文件\n    verbose: true # 是否同步时显示详细状态\n    ignore_errors: false # 忽略错误\n\n这样就行了，运行 hexo deploy 应该就能看到 rsync 的同步状态了。如果你有其他的不使用 Hexo 的网页，可以用命令：\n$ rsync -azv --delete SOURCE USERNAME@IPADDRESS:DESTINATION\n\n\n上传到服务器上，如果有 git 仓库最好用 --exclude=.git 排除掉，顺便 SOURCE 目录一般不要用 / 结尾，原因参见 这里。\n这个时候我还没有把 DNS 从 GitHub Pages 转到我的服务器上，结果生米煮成了熟饭，只能往下继续了。\n用 Let's Encrypt 生成 SSL 证书\nHTTPS 需要有可信机构签发的证书，Let's Encrypt 就是一个免费提供这种服务的网站，不过官方推荐的步骤只能对每个域名单独生成证书，比如 alynx.xyz 和 sh.alynx.xyz 需要两个证书，这里介绍生成通配符证书的办法，比如对 *.alynx.xyz 生成一个证书，可以用在所有三级子域名：\n下载 certbot-auto\ncertbot-auto 是用来验证生成证书的交互命令行工具，似乎一般软件源里的版本都不够高，不能生成通配符证书，这里手动下载新版：\n$ wget https://dl.eff.org/certbot-auto\n$ chmod +x ./certbot-auto\n\n手动生成证书\n生成证书的话需要我们手动操作，命令如下（用你的域名替换掉 example.com）：\n# ./certbot-auto certonly --manual --preferred-challenges=dns --server=https://acme-v02.api.letsencrypt.org/directory -d *.example.com -d example.com\n\n这里 certonly 表示我们只需要生成证书，我们不需要它帮我们改服务器配置。--manual 表示手动配置参数。生成证书需要你证明域名属于你，由于我们是通配符自然不能一个一个页面去放文件验证（默认的验证方法，类似 Google 的页面验证），所以用 --preferred-challenges=dns 设置为验证 DNS 记录。--server=https://acme-v02.api.letsencrypt.org/directory 表示使用第二版的 api 服务器，默认的第一版是不支持通配符证书的签发的。最后 -d *.example.com -d example.com 添加你的域名，需要注意的是只包含 *.example.com 的证书是不能用在 example.com 上的，所以我们把两个都写上，生成的证书就会同时包含两个域名。\nSaving debug log to /var/log/letsencrypt/letsencrypt.log\nPlugins selected: Authenticator manual, Installer None\nEnter email address (used for urgent renewal and security notices) (Enter 'c' to\ncancel): YOUR EMAIL\n\n这里会让你输入你的邮箱。\n-------------------------------------------------------------------------------\nPlease read the Terms of Service at\nhttps://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must\nagree in order to register with the ACME server at\nhttps://acme-v02.api.letsencrypt.org/directory\n-------------------------------------------------------------------------------\n(A)gree/(C)ancel: A\n\n这里输入 A 表示同意条款。\n-------------------------------------------------------------------------------\nWould you be willing to share your email address with the Electronic Frontier\nFoundation, a founding partner of the Let's Encrypt project and the non-profit\norganization that develops Certbot? We'd like to send you email about EFF and\nour work to encrypt the web, protect its users and defend digital rights.\n-------------------------------------------------------------------------------\n(Y)es/(N)o: N\n\n这里问你要不要把邮箱发给 EFF，我不想发就输入了 N。\nObtaining a new certificate\nPerforming the following challenges:\ndns-01 challenge for alynx.xyz\ndns-01 challenge for alynx.xyz\n\n-------------------------------------------------------------------------------\nNOTE: The IP of this machine will be publicly logged as having requested this\ncertificate. If you're running certbot in manual mode on a machine that is not\nyour server, please ensure you're okay with that.\n\nAre you OK with your IP being logged?\n-------------------------------------------------------------------------------\n(Y)es/(N)o: Y\n\n这里显示了需要验证的次数，因为我们有两个所以要验证两次，然后为了限制申请次数防止刷证书，这里它会记录你申请证书的 IP，输入 Y。\n-------------------------------------------------------------------------------\nPlease deploy a DNS TXT record under the name\n_acme-challenge.alynx.xyz with the following value:\n\nYX3oQEVGxLolEVtiFDF4JCKe1tqB7B-9pwis8zuQZkc\n\nBefore continuing, verify the record is deployed.\n-------------------------------------------------------------------------------\nPress Enter to Continue\n\n这里是第一次验证，先别急着回车，去你的 DNS 服务商那里添加一条到 _acme-challenge 的内容为 YX3oQEVGxLolEVtiFDF4JCKe1tqB7B-9pwis8zuQZkc（你的内容不一定和我的一样）的 TXT 记录，然后用 dig -t txt _acme-challenge.example.com @8.8.8.8，检查是否更新完成，最好多查几次，防止缓存导致失败。有消息说国内的 DNS 是访问不到的，我这里用的 CloudFlare。\n-------------------------------------------------------------------------------\nPlease deploy a DNS TXT record under the name\n_acme-challenge.alynx.xyz with the following value:\n\nlKuF76a3GRy7y3M-FVDJ3kif0FQJJwZQUROc6cgG_lk\n\nBefore continuing, verify the record is deployed.\n-------------------------------------------------------------------------------\nPress Enter to Continue\nWaiting for verification...\nCleaning up challenges\n\nIMPORTANT NOTES:\n - Congratulations! Your certificate and chain have been saved at:\n   /etc/letsencrypt/live/example.com/fullchain.pem\n   Your key file has been saved at:\n   /etc/letsencrypt/live/example.com/privkey.pem\n   Your cert will expire on 2018-09-02. To obtain a new or tweaked\n   version of this certificate in the future, simply run certbot-auto\n   again. To non-interactively renew *all* of your certificates, run\n   \"certbot-auto renew\"\n - If you like Certbot, please consider supporting our work by:\n\n   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate\n   Donating to EFF:                    https://eff.org/donate-le\n\n又是一次验证，把刚才的记录内容改成新的， 按照评论的指正，这里是可以建立两个同名记录的，所以不需要修改两次，这里可以再添加一条同样名字但内容不同的记录，然后多 dig 几次再回车，如果没通过重新运行命令会从记录 IP 那里开始。\n需要注意 certbot 似乎会很弱智的用 Nginx 服务的目录的名字作为它认为的你的域名，所以最好在开启 Nginx 之前设置它，它每次都把我的域名当成 stackharbor.alynx.xyz 也是把我气个半死。\n设置 Nginx\n这里稍微复杂一点啦，因为我还有另一个页面。\n首先我们要安装 Nginx，我的习惯肯定是安装包管理里面的然后用 systemd 管理，我是 Debian9，你们看着来。\n强制 HTTPS\n首先我们要把所有的 HTTP 请求定向到 HTTPS 上，编辑 /etc/nginx/nginx.conf，在 include /etc/nginx/sites-enabled/*; 前面插入：\n# Forward all HTTP requests to HTTPS.\nserver {\n\tlisten 80 default_server;\n\tlisten [::]:80 default_server;\n\treturn 301 https://$host$request_uri;\n}\n\n这段表示所有 80 端口的请求都被 301 永久重定向到 https 的网址上面。\n配置虚拟主机\n然后在 /etc/nginx/sites-available/ 下面创建一个文件，名字可以随意，我用的是我的域名，然后编辑它：\n# Forward www domain to non-www domain.\nserver {\n\t# Must set ssl with a HTTPS request.\n\tlisten 443 ssl http2;\n\tlisten [::]:443 ssl http2;\n\n\tssl_certificate /etc/letsencrypt/live/alynx.xyz/fullchain.pem;\n\tssl_certificate_key /etc/letsencrypt/live/alynx.xyz/privkey.pem;\n\tssl_dhparam /etc/ssl/certs/dhparam.pem;\n\tssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';\n\tssl_prefer_server_ciphers on;\n\tssl_protocols TLSv1 TLSv1.1 TLSv1.2;\n\tssl_session_cache shared:SSL:50m;\n\tssl_session_timeout 1d;\n\tssl_stapling on;\n\tssl_stapling_verify on;\n\tssl_trusted_certificate /etc/letsencrypt/live/alynx.xyz/fullchain.pem;\n\tadd_header Strict-Transport-Security max-age=60;\n\n\tserver_name www.example.com;\n\treturn 301 https://example.com$request_uri;\n}\n\nserver {\n\t# SSL configuration\n\tlisten 443 ssl http2;\n\tlisten [::]:443 ssl http2;\n\n\tssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;\n\tssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;\n\tssl_dhparam /etc/ssl/certs/dhparam.pem;\n\tssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';\n\tssl_prefer_server_ciphers on;\n\tssl_protocols TLSv1 TLSv1.1 TLSv1.2;\n\tssl_session_cache shared:SSL:50m;\n\tssl_session_timeout 1d;\n\tssl_stapling on;\n\tssl_stapling_verify on;\n\tssl_trusted_certificate /etc/letsencrypt/live/example.com/fullchain.pem;\n\tadd_header Strict-Transport-Security max-age=60;\n\n\t# Note: You should disable gzip for SSL traffic.\n\t# See: https://bugs.debian.org/773332\n\t#\n\t# Read up on ssl_ciphers to ensure a secure configuration.\n\t# See: https://bugs.debian.org/765782\n\n\troot /home/example/example.com/;\n\n\t# Add index.php to the list if you are using PHP\n\tindex index.html index.htm index.nginx-debian.html;\n\terror_page 404 404.html;\n\tserver_name example.com;\n\n\tlocation / {\n\t\t# First attempt to serve request as file, then\n\t\t# as directory, then fall back to displaying a 404.\n\t\ttry_files $uri $uri/ =404;\n\t}\n}\n\n首先你看到的 ssl 那一大片都是用来加密的，总之你需要把 example.com 换成你的域名（因为 certbot 生成的证书所在的目录是域名的名字）。然后这里第一个 server 的作用是把 www.example.com 重定向到 example.com（因为 80 （HTTP）已经被强制转到 443 （HTTPS）了所以一定要写 443 和 ssl 的配置），如果你想反过来，那就把 return 那一句加上 www. 然后把上下两块的 server_name 那一行对调。\nroot 选项设置成你要作为网页目录的路径，比如之前你 Hexo 上传到了家目录下的子目录这里要对应。\n接下来创建密钥，Nginx 默认的编码长度太弱，使用 2048 位的：\n# openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048\n\n然后创建软连接使配置生效，并重启 Nginx：\n# ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/\n# systemctl restart nginx\n\n如果你还有其他的页面，放在另一个目录里，然后再创建一份配置文件，当然这次只要有第二个 server 字段就好了，修改路径，然后连接重启。\n自动更新证书\n安全起见，Let's Encrypt 签发的证书只有 90 天有效期，官方推荐使用自动定期刷新的方式更新证书，只需要建立一个定时任务运行 /PATH/TO/certbot-auto renew --pre-hook \"systemctl stop nginx\" --post-hook \"systemctl start nginx\"（如果你用的不是 systemd 管理 Nginx 记得换成其它的停止和启动 Nginx 的命令）。很大可能你知道怎么用 crontab 做这件事情，但我使用 systemd-timer 做。\n首先建立 /lib/systemd/system/certbot-renew.service 这个文件，内容如下：\n[Unit]\nDescription=Updates cert file via certbot\n\n[Service]\nType=oneshot\nExecStart=/home/alynx/certbot-auto renew --pre-hook \"systemctl stop nginx\" --post-hook \"systemctl start nginx\"\n\n然后建立对应的 timer /lib/systemd/system/certbot-renew.timer，内容如下：\n[Unit]\nDescription=Updates cert files via certbot every week\n\n[Timer]\nOnBootSec=1min\nOnUnitActiveSec=1week\nUnit=certbot-renew.service\n\n[Install]\nWantedBy=multi-user.target\n\n这个 timer 会在启动 1 分钟之后运行 certbot-renew.service，同时每周运行一次来确保你的证书会被刷新。\n启动它：\n# systemctl enable certbot-renew.timer --now\n\n然后更新你的 DNS 的 A 记录和 AAAA 记录，生效就可以了。\n有备无患咯！\n更新：我的 VPS 被墙了，算了，噗。\n"},{"title":"无尽的咏叹回荡于伽蓝之世界中 —— 有关 ARIA","url":"/posts/Endless-ARIA/","content":"大约从我写好 ARIA （指把我自己的网站换成它做主题）到现在为止已经有一个月了，这一个月里它有了 20 个 Star、4 个 Issue 和 128 个 Commit（都是我自己，残念啊）。大概算是我现在最得意的项目，当然不排除以后也是。\n虽然这么说有点敷衍，但是我是和一些无聊的人进行了一点无谓的争执 —— 我讨厌辩论，所以尽可能把这种冲动压制在一点 —— 所以我现在来写这篇文章，聊聊那些代码里面没有告诉你的事情。写点经过脑子的思考总是有用处的，不仅是对自己而言。\n我已经不太记得当初自己选择 Hexo 的理由了，大概是因为 2016 年的时候比较热门的静态博客生成器就是 Jekyll、Octopress 和 Hexo 吧。我不太注意 Pelican 是什么时候出现的，至于 Hugo，没记错的话 Hexo 冲上 staticgen 前三的时候，Go 语言还是个尝鲜的状态，然后才有了 Hugo。那时候大概还没有 React.js，所以也就没有 Gatesby。\nHexo 当初打出的招牌就是它比 Jekyll 和 Octopress 快，当然现在 Octopress 已经式微了，Jekyll 作为 GitHub 钦定的生成器还是好好的。选择了 Hexo 才发现相比其他生成器，Tommy351 是台湾人这一点让它有更好的中文文档支持 —— 对一个新手来说还是很重要的。习惯了之后就没有必要换另一个的代价，何况它们并没有太大的吸引力。我对 Go 并不是很感兴趣，Hugo 的“第一快”和 Hexo 的“飞快”比起来也并不是一个充足的理由。至于 Gatesby —— 我还要学 React，然后 AJAX 获取数据更新页面然后突然换掉地址栏地址这种行为单纯的觉得不舒服。\n所以 Hexo 看起来完全够用，还要算上各种奇怪的插件，不同的模板和预处理器，另外我是因为 Hexo 才对 Node.js 产生好感的。\n那为什么要自己写一个主题呢，一部分的原因是已经用腻了 NexT，老实说我不是很喜欢这个名字，很想问问作者是不是在看了乔布斯传里面的 NeXT 才想了这么一个名字。它让我想起一个观点叫做“第一个把女人比作花的是天才，第二个把女人比作花的是庸材，第三个把女人比作花的是蠢材”，感谢语文老师。\n不过说到底起什么名字是人家的自由，也不能不说它是个不错的主题。然而人是一种不做点什么就不好感知自己存在的生物，因此做这个项目除了因为 NexT 几个 Scheme 和遗留代码混在一起让我觉得难以掌握，以及 Swig 已经被废弃了但这个主题却很难迁移的强迫症之外，还有“我做是为了证明我能做”的念头，最后就是深层次的“让痛苦来证明我还活着”（黑执事 1 的结尾？）。\n虽说如此，我一直没有足够的动力来写，最后只能是碌碌无为地做一些其他的事情。\n直到听说 Kalafina 要解散的时候，我觉得自己应该给她们做点什么，虽然自己好像什么也做不到，但是给自己的主题起个名字总是可以的吧。那张红色封面（指 5th Anniversary LIVE SELECTION 2009-2012）的 ARIA 是我至今听过的最出色的 LIVE，甚至超出录音室的版本。\n\n在写 ARIA 的时候我给自己定了几个目标，比如说我实在是受不了许多主题高喊着一个比一个简洁然后却很丑的状况（这个观点也是在别人那里看到的，一群人自以为是简洁，实际是简陋），所以就算做的复杂一点（并没有这个能力）也要让它看起来优雅（emm 如果大家觉得现在的样子符合这个标准的话）；再比如我也不想编辑一份超过 500 行的配置文件，在一大堆应该保持默认值的选项里找几个人人都想改的选项实在是太愚蠢了（“你为什么非要过那 1% 的生活？”）（前面只是玩梗），如果大家都这样设置，那就写死到代码里好了，如果人人都想改成另一种选项，那应该把那种设置成默认值；最后就是如果可能的话尽量不要用 position: fixed; 或者 position: absolute; 还有 position: float; 这种属性，即使用一些比较新的 CSS 属性（IE 10 以下的不配看我的网站！），因为它们对我来说太不直观又难以驾驭了。\n然后就是选择模板和预处理器了，ejs 这种又挫又丑的东西我是不会去用的，然后看起来 Hexo 的 Nunjucks 插件还算能用（当然并不好用，都没人更新了还占着最好的名字，于是我只能自己写了一个，这是后话），唯一对 Nunjucks 不满的地方大概是它的关键字是 Python 风格（我讨厌这两种叫做 Python 的语言）。CSS 预处理器看起来在 Sass 和 Less 之间有个更好的选择叫做 Stylus（也是 Node 社区比较喜欢用的），既然这次是自己写样式了，纠结了好久我还是没有添加 Bootstrap。\n参照的原型是 hexo-theme-hueman，我很喜欢它的风格，但是看起来 ppoffice 维护了好几个主题，但是哪个都不是很精细好用，当然随着我的设计进行 ARIA 和 Hueman 产生了不一样的设计，我比较喜欢现在的样子。\n在艰难地摸掉了 Hexo、hexo-renderer-nunjucks（就是这个坑货不更新还占着好名字） 和 Stylus 的一些坑之后，开始正式的进入到编写阶段，果然对于我而言 CSS 才是最难驾驭的语言，不过还是顶着各种困难把它做成了我想要的样子（优秀的前端工程师想要什么样就做成什么样，我是做成什么样就算什么样），其中的经历不太想多说，比如 Hexo 的中文文档没有告诉我 page.posts 是个什么类型（不是 Array，ejs （就是嵌入的 JavaScript）可以迭代，但是 Nunjucks 却不行），英文文档又出现了 Array of ???，请问 ??? 是什么？点击链接又跳转到了 Hexo 的一个叫做 Warehouse 的子项目，这又是什么？后来终于我在 Issue 列表里找到了答案，这是个数据库，为了能让 Nunjucks 和 Swig 迭代，作者又添加了个 toArray() 方法。再比如 hexo-renderer-nunjucks 的版本卡在 Nunjucks 2，我又自己写了个插件支持 Nunjucks 3。还有自己差不多完全重写了一个用来搜索的 js。好在最后是做出来了。\n比起做加法，做减法看起来更难一点，首先由于翻转的 CSS 动画莫名的消耗了 chrome 的性能，让我把它改成了可选项。然后觉得按钮鼠标覆盖转两圈太花哨了，改成了阴影。然后踢掉了不必要的自定义不蒜子字符串的设置项。最后怎么看那个灰色的“阅读原文”按钮怎么觉得它和风格不搭，同时又和文章标题功能重复，终于下决心把它删掉了。大约是一边狂奔一边丢掉所有东西的人生的剪短缩影。\n这就是你现在看到的它的样子，没有什么文章头图这种设计，纯粹是因为这个写起来太不直观，文章的核心始终是在文字内容上，为什么非要花时间去找一张图片搭配给它做头图呢？比起这个，各种链接的变色的细节才是我想要的。说到底，还是为了在这个世界里留下一点自己独特（固执）的存在。\n如果说还有什么要加进去的话，短期内是自定义字体的设计，现在的字体顺序是我最喜欢的字体排在最前面，但看起来似乎大家有不一样的喜好。\n请务必记住我对这个世界无尽的咏叹，记住这个在深夜里写一点话的孤独的灵魂。\n"},{"title":"GitHub Pages 自定义域名启用 HTTPS（非 CloudFlare）","url":"/posts/Custom-GitHub-Pages-Domain-with-HTTPS/","content":"在 GitHub Pages 支持自定义域名开启 HTTPS 之前，我是使用 CloudFlare 的 CDN 中转来启用 HTTPS 的，缺点也很明显，就是面对国内访问的时候 CloudFlare 的 CDN 简直是逆加速，还不如直连 GitHub 的速度呢。\nGitHub 在 2016 年开启了 *.github.io 域名的 HTTPS 访问，在今年的 5 月 1 日，终于开启了对自定义域名的 HTTPS 支持。这篇文章将会介绍一下开启的办法和中间容易踩的坑。\n有关为什么要启用 HTTPS 就不多说了，HTTPS 会对传输的内容进行加密，最常见的就是防止无良运营商拦截你的流量添加广告了，也能防止用户接触被劫持的页面而上当受骗，同时不会对浏览造成什么太大的代价。\n按照 GitHub 给出的说明，似乎我什么都不做就能开启 HTTPS 了，仔细尝试了却发现不是这样。\n首先如果你开启了 CloudFlare 的 CDN 和 HTTPS，建议把它们关闭。CloudFlare 的 HTTPS 加密在 Crypto 面板里，找到第一项 SSL，设置成 Off，然后如果你在 Page Rules 里面添加了 Always HTTPS 之类的选项，可以删除，因为我们可以用 GitHub 提供的 Enforce HTTPS 选项进行跳转。然后去到 DNS 面板，看到那几朵红色的云朵了吗？它们代表访问时候会首先使用 CloudFlare 的 CDN，考虑到受众，这里可以点击让它变成灰色的 DNS Only，从而加快访问速度……\n然后如果你是设置 A 记录来跳转到 GitHub Pages 的话，需要修改成新的 IP 地址，GitHub 提供了下面四个 IP，不过我是比较喜欢设置 CNAME 啦：\n\n185.199.108.153\n\n185.199.109.153\n\n185.199.110.153\n\n185.199.111.153\n\n\n如果是 CNAME 的记录就简单啦（虽然 GitHub 文档里推荐的是 ALIAS 或者 ANAME 不过大部分的 DNS 都只有 CNAME 吧），保持你之前 你的用户名.github.io 的模式就行啦，比如我是 AlynxZhou.github.io。\n由于 DNS 多级缓存的存在，DNS 有关的设置需要一定时间来生效，最长大概需要 24 小时，不过一般都是很快的。\n然后我们需要去到你开启 Pages 服务的仓库，点击 Settings 面板往下拉，找到 GitHub Pages 一节的 Custom Domain 选项。重点在这里啦！如果你什么都不做，会发现下面 Enforce HTTPS 的选项是灰色的，边上可能还写着说您使用了自定义域名不能开启，难道是虚假宣传？实际上你需要 先去掉你的自定义域名，然后再添加回来，这里才能开启，至于你问我为什么，我也不知道。\n所以首先我们把这个框里面的自定义域名删掉，然后 save，然后可以访问一下 https://你的用户名.github.io/（如果这不是用户主页的话后面要加上仓库名字）测试一下。然后回来再次添加自定义域名，保存。 应该可以发现 Enforce HTTPS 边上的小字变成了 正在处理您的 HTTPS 加密证书（大意），因为这个是 GitHub 和 Let's Encrypt 这个授权验证机构合作推出的服务，证书需要进行处理，大概一小时之内就可以完成，然后这次访问 https://你的自定义域名/，地址栏里应该就会出现小锁头，表示已经加密，就可以放心的勾选 Enforce HTTPS 啦！\n"},{"title":"写给新手的 Linux 手册 1","url":"/posts/Linux-Manual-for-Newbies-1/","content":"恰如字面意思，这是一篇写给新人的 Linux 指南，当然，不要指望从我这里得到什么详细的配置教程，最起码我没有打算在这篇文章里把你能遇到的 Linux 配置情况全部说清楚。我想在这篇文章里讲述的是一种理解方法或者说是一种 Linux 思维，换个更简单的说法是——它能在 Linux 向你吐出一堆牢骚的时候明白它在说什么，以及一个有经验的 Linux 用户这个时候会做什么，有经验的 Linux 用户是如何学习他们没有接触过的 Linux 知识的。\n准备好了，就继续吧。\n开宗明义（开篇劝退）\n本页面不适用于如下类型人员：\n\n脑残微软粉丝\n如果你觉得微软爸爸什么都是好的或者你已经完全被微软圈养，现在关闭还来得及，微软不会让你在 Linux 下运行 VS 或者 Office 的，没必要找不痛快。\n\n认为电脑应该听我的，或者说稍微有一点不一样就觉得是 Linux 的问题的人\n我不想多说什么，如果你觉得程序员改一下按钮的样式你就不会用想骂人的话，我不想认识这样的蠢货。工具是听从你的命令去帮你解决问题的，如果它工作了，你应该感激它，如果出错了，很大程度上是你给的指令有问题。\n\n强行用 Windows 思维去使用 Linux 的人\n你不能强行用一把十字花的螺丝刀去拧一字的螺丝对吧。使用 Linux 就要有 Linux 的思维，当然用你熟悉的东西去类比是可以的，事实上我经常这么做，但是在遇到不一样的时候应该以现实情况为准，否则同第二条。\n\n没事闲的/听说这东西很少人用/打算用这玩意装X的\n如果你抱着这样的想法我劝你把这种精力放在打游戏上去，很显然你的学习动力是不长久的并且很容易演化成第二种。或者觉得这东西没有达到你想要的装X效果然后再装模作样的黑一通假装自己多么了不起——趁早滚开，Linux 用户们不是觉得 Linux 不能被批评，但前提是被批评的部分确实不好用。\n\n\n因此本手册适合于那些确实有实际需求——Linux 从被创造出来就是一个务实的项目——并且能够接受新事物的新手，如果你确实想要了解这个系统的方方面面，必读的读物是鸟哥的 Linux 私房菜，虽然它看起来很厚，但是语言风趣，读下去不是很困难。\n我该选择什么版本的 Linux？\n和你常见的桌面操作系统不一样，Linux 本身不是一个操作系统——它只是一个操作系统内核，可以操作计算机硬件资源。我们通常把基于 Linux 内核的，由内核和其他常见的一系列软件组成的操作系统也叫做 Linux。因为大部分的组件和内核一样都是开放源代码软件，所以任何有能力的人都可以组织他们自己的操作系统，这被称为 Linux 发行版。不同发行版之间可能存在着配置上的些微差异或者用等价的软件替换掉另一部分软件，当然，它们之间大体上是相似的，学到的知识也都通用。\n如果你需要从头选择一个发行版，选择的条件有以下几个：\n\n尽量选择最新的版本，或者支持期较长的版本中的最新版本。\n\n  过于老旧的版本通常已经失去维护，继续向下看你会发现这是很恐怖的事情。\n\n尽量选择用户比较多的发行版本。\n\n  使用的人数越多，代表你出现问题时可能寻找到解决方案的机率也越大。\n\n尽量选择你更熟悉的发行版。\n\n  这个不用多说了吧。\n如果你打算在自己的电脑上使用 Linux，推荐的版本有 Ubuntu，LinuxMint，Fedora，openSUSE。\n如果你打算在远程服务器上使用 Linux，推荐的版本有 Debian，Ubuntu Server, CentOS。\n特别需要注意的是 Ubuntu 16.04 之前的版本，Debian 8 之前的版本，CentOS 7 之前的版本由于时间过久，不建议现在选择，同时有些网站使用的是这些系统的开发代号而不是版本号，可自行搜索对照。如果你需要接手一台比较旧的服务器，请自己上网搜索或者参阅鸟哥网站，本手册不加讲解。\nArch Linux 或者 Gentoo Linux 一类需要使用者有较强能力的高定制性发行版不建议新人使用，如果你对自己的学习能力有信心，希望随时使用最新版本的软件，并且能够判断互联网上的消息有效期，可以考虑使用 Arch Linux，但是请务必多阅读 Arch Wiki。\n以上安装镜像的唯一可靠下载渠道为官方网站（已给出）或者官方指定的镜像站，请务必不要在来历不明的位置下载。\n我该怎样连接到我的服务器？SSH 又是什么？\n有关 SSH 的介绍来自维基百科：\n\nSecure Shell（安全外壳协议，简称 SSH）是一种加密的网络传输协议，可在不安全的网络中为网络服务提供安全的传输环境。SSH 通过在网络中创建安全隧道来实现 SSH 客户端与服务器之间的连接。虽然任何网络服务都可以通过 SSH 实现安全传输，SSH 最常见的用途是远程登录系统，人们通常利用 SSH 来传输命令行界面和远程执行命令。使用频率最高的场合类 Unix 系统，但是 Windows 操作系统也能有限度地使用 SSH。2015 年，微软宣布将在未来的操作系统中提供原生 SSH 协议支持。\n在设计上，SSH 是 Telnet 和非安全 shell 的替代品。Telnet 和 Berkeley rlogin、rsh、rexec等协议采用明文传输，使用不可靠的密码，容易遭到监听、嗅探和中间人攻击。SSH 旨在保证非安全网络环境（例如互联网）中信息加密完整可靠。\n\n简单说的话，SSH 是一个协议，在操作系统上有对应的实现软件，用来在你和服务器之间传递消息，SSH 也是 UNIX 世界里最常用的远程控制协议，如果你对命令行界面有所了解，SSH 实际上是把远程 Shell 的输出传送给你，然后把你的输入传递给远程 Shell（在这里传递命令行的原因是网络通常不足以满足传递图形界面的带宽，字符更节省数据流量）。\n需要注意的一点是 SSH 界面的回显是由远程计算机控制的，也就是说只有远程端收到了你的输入并返回给你确认信号之后你的屏幕上才会出现输入，这种设计避免了由于网络延迟带来的输入混乱，但也因此在网络不好的时候会产生延迟，不要认为是你的计算机卡住了。\nSSH 分为两个部分，客户端程序 ssh 和服务端程序 sshd，同样地在 Linux 下面也有两个配置文件 /etc/ssh/ssh_config 和 /etc/ssh/sshd_config，一般情况下不需要修改客户端的配置，你需要修改的是 服务器端 的 /etc/ssh/sshd_config。同时服务器端需要将 sshd 作为一个 daemon （守护进程，可以理解为 Windows 里面的服务，在特定的时候由操作系统启动并完成一定工作的程序）启动于后台。在较新的 Linux 发行版中统一使用 Systemd 作为启动管理程序，使用下面的命令将 sshd 添加到开机启动列表并现在启动它：\n# systemctl enable sshd --now\n\n# 是 Shell 提示符，不要复制它，不理解往后看。\n通常情况下你不需要修改 sshd 的配置，默认 sshd 会监听 22 号端口，如果你知道主机名称和主机上一个账户的名字/密码，就可以在客户机上运行：\n$ ssh username@hostname\n\n连接到远程主机。hostname可以是域名或者 IP 地址。\n最常见的配置更改是改变 sshd 监听的端口，需要你修改 /etc/ssh/sshd_config，找到 #Port 22 这一行，删除掉前面的 # 以取消注释，然后修改 22 为你想要的值（端口范围为 0 - 65535，需要注意的是一些常见端口已经有使用比如 80 是 http 服务的端口，如果你的服务器上有这些服务运行记得避开）。之后用 systemctl restart sshd 重启 sshd 服务。如果你要连接到一个不是使用 22 端口的 sshd，使用 ssh -p xxx username@hostname，xxx 是你服务器的端口号。\nssh 还带有一个叫做 sftp 的客户端程序，可以在本机和远程之间传递文件，具体用法请自行搜索。\nShell 和终端都是什么？为什么我输入密码没有反应？\nShell 是一个程序（废话），它接受用户的指令并传递给内核，以便完成交互，常见的 Shell 有多种，互相之间基本兼容，通常指的是文字界面的 Shell，用户通过 Shell 执行各种其他程序。\nLinux 是可以没有图形界面的（与 Windows 不同），没有桌面环境的情况下 Linux 会提供叫做 tty 的字符界面，但是字符界面毕竟功能有限（只能显示英文数字，不能显示中文等复杂字符），所以我们常用桌面环境下叫做终端模拟器的程序开启一个在图形环境下的字符界面模拟器来执行各种操作，这个程序简称终端 Terminal。之所以使用字符界面的原因是图形环境通常为了做到简单易用而限制了其功能，Shell 操作相对稳定高效并且能做到各种复杂的操作，并且在服务器上没有必要开启图形界面浪费资源，所以使用 Linux 务必要掌握 Shell 的用法。\n最常见的 Shell 叫做 bash，一般交互方式是这样的：\nusername@hostname currentdir $ command --args filename\n\nusername@hostname currentdir $ 是提示符，每次出现它就代表现在掌握权回到了 Shell 上，你可以输入指令了，其中 currentdir 表示了你当前的路径，$ 在有些 Shell 里会显示为 %，但是当它是 # 的时候说明你现在不是一般用户而是 root 用户，需要注意的是这个提示符是可以改变样式的。\n在 Linux 下你可以直接在提示符后面输入指令来进行操作，通常第一个位置是指令名称，比如 cp 代表复制，第二个位置是参数，一般以 - 开头，比如 -R 表示递归地复制子目录和目录里的文件，多个参数可以合并写比如 -Ri, 最后一般会接操作的文件名，对于复制来说，第一个是被复制的文件的路径，第二个是复制到的目的地，如果是文件表示复制过后改成这个名字，如果是目录就是将这个文件复制到那个目录下。各个部分之间用空白符分割比如空格或者 Tab，对于 Shell 而言连续的空白符会被识别为一个，如果文件名里有空格，用反斜杠转义。\n常见的命令有很多，但是要介绍的是 man 这个指令，如果你不知道一个命令的用法，只需要运行 man 指令名 就可以获取到内置的帮助文件。\npwd 输出当前所在的路径。ls 指令列出目录下的文件（如果不指定目录则列出当前目录），常见的用法是 ls -alh，表示列出隐藏文件（-a），显示文件权限、所有者等详细信息（-l），将文件大小显示为人类易读格式（-h）。mv 移动文件，用法类似 cp（Linux 下没有重命名命令，将一个文件移动到另一个名字即为重命名）。rm 删除文件，要注意这个命令没有二次确认，同时 -rf 参数表示递归强制删除，慎用！\ncat 输出一个文件的内容，当然这个文件最好是纯文本（和 猫 没有关系！），less 也会输出文件内容，但是它增加了翻页功能（cat 是一股脑倒出来，less 则是让你一页一页看）。\n当你运行一个程序的时候，Shell 需要获取到这个文件的位置，Shell 有一个 $PATH 变量，当你只输入一个程序的名字而不是完整路径时，Shell 会逐个搜索 $PATH 的目录，这些目录大部分是系统存放可执行程序的位置。同时注意当前目录不在这个变量里，你可以使用相对路径（. 表示当前目录，.. 表示上一层目录，~ 表示家目录（这个只有 Shell 支持））如 ./a.out 运行当前目录下的文件，当然你也可以使用从根目录开始的绝对路径。\n有些程序可能需要在后台运行，但是用 Shell 启动的程序一般在父进程也就是 Shell 退出的时候就会结束。对于有些没有提供以 daemon 方式运行的程序，可以尝试 screen 或者是 tmux 这一类终端复用器，他们可以保存 Shell 会话到后台，具体用法请自行搜索。\nUNIX 哲学里面，如果一个程序不是以输出信息为目的或者需要显示进度信息，那么 “没有消息就是最好的消息”，没有输出是成功的，有输出一般是报错，复制粘贴谷歌一下。\n最后有关不显示密码的问题，Linux Shell 下输入密码就是不显示的！！！不会显示星号或者圆点！！！这样可以保证安全。\n我该如何编辑文件？怎样安装我需要的软件？\n首先我在这里不会介绍 vim，不仅仅是因为我是 emacs 用户，而是因为 vim 对于新人而言实在是太难以学习了（除非你想让新手产生一串随机字符串（“Q：如何产生一串随机字符串？A：让新手退出 vim”））。新人一般是没有接触过模式化编辑器的。如果你需要编辑配置文件，使用 nano 这个程序就好了，nano filename 编辑文件就像记事本一样简单，同时它的快捷键都会列在屏幕下方。\n有关安装软件，请把 Windows 安装包有关的思维全部忘掉。Linux 的软件包管理方式大概可以类比为应用商店，由于大部分的软件都是开源的，每个发行版都会维护自己的一个软件仓库，使用包管理程序就可以自动下载并安装到统一位置，安装的位置都是维护者写好的，并且在数据库里有所记录，所以不需要担心卸载的时候有残留（至于什么软件安装到系统盘会影响速度的说法更是无稽之谈）。也不太需要担心软件占用过多空间，Linux 下有良好的库共享机制，所以一般软件的体积远小于 Windows（由于 Windows 缺乏有效的包管理机制，开发者一般会将所有的依赖库打包到程序安装包，造成空间浪费）。\nLinux 下的包管理主要有两种常见软件，Debian、Ubuntu、LinuxMint 使用 Debian 的 dpkg 和 apt-get，CentOS、Fedora、openSUSE 使用 RedHat 的 rpm 和 yum，具体使用方法请自行搜索，简单用法比如安装 nginx 使用 apt-get install nginx 或者 yum install nginx，便会自动从镜像站下载安装（镜像站是为了加快下载速度在全球各地建立的软件仓库的克隆）。\n如果你需要一个软件，首先检查软件源里是否已经有这个软件，版本是否符合要求（有些发行版为了维持稳定，不会在软件源里使用最新版软件），如果没有，搜索你所使用的发行版是否有常见的第三方源包含这些软件。请把在官网下载的安装包作为最后选项使用，因为这些下载的安装包不会被包管理所管理，需要自行删除及检查残留，相比起来包管理是自动化并且可靠的。\n如果你使用一个停止维护的发行版本，通常软件源已经无人维护，也就是说没人可以保证你使用的软件是安全的（甚至可能是无法使用的）。另外有关系统升级，Linux 升级的主动权掌握在你的手里（没有被 Windows 强制更新 然后 更新失败 然后 回滚 然后 回滚失败 所支配的恐惧了哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈这世界上还有什么东西比微软的更新更不靠谱的吗），并且你可以随时打断更新流程（在不影响系统的情况下）（除了内核及相关部分更新，大部份的安装操作 不需要重新启动）（服务器很少重启）。另外如果不是新版本软件有什么必须的功能，最好不要 更新服务器上的软件。如果你习惯了一个还在维护中的不是最新的软件，Linux 和开发者不会强迫你为了新功能而更新，因为这些新功能你可能不会用到，还可能影响到系统稳定性，当然，如果有安全更新比如修复了漏洞一类的最好更新一下。\nroot 是谁？权限是什么？为什么没有 CDDEFG 盘？\n简而言之，root 是一个 UID（User ID）为 0 的特殊用户，一般用于系统管理操作，它可以操作系统的任何部分即使这些部分不是属于它的（你的我的都是我的）。因此我们不建议在日常操作中使用 root，并且需要给 root 设置复杂的密码。否则一旦入侵者掌握了 root，你的机器就变成了他的。日常使用 root 则很容易对系统造成损坏（系统不控制 root 的行为）。平时我们使用自己的用户，需要进行高权限操作比如安装软件（Linux 下安装软件是全局的也就是说你要修改不属于自己的部分）时使用 sudo 命令，sudo 会以 root 权限运行后面的命令，同时要求你输入自己的密码。但是只有列在 sudoers 文件里面的用户可以使用 sudo，具体的用法阅读 这里。\n权限则是用来管理用户对于文件的操作的。使用 ls -alh 的时候可以看到第一列都是文件的权限，一般看起来像是 -rwxr-xr-x，每一位是一个信息，内容如下：\n\n第一位表示的是文件类型，- 表示这是一个普通文件，l 表示这是一个连接文件（link），d 表示这是一个目录（dir）。\n\n第二到四位是文件所有者对于文件的权限（ls -l 的第三列是文件所有者），r 表示可以读，w 表示可以写，x 表示这个文件是可以运行的（当然能不能运行还要看文件内容，比如图片当然不能执行了）。如果没有某项权限，该位置为 -。\n\n第五到八位是文件所属用户组对于文件的权限，含义同上。\n\n最后三位是既不是所有者也不属于该用户组内的其他用户对于文件的权限。\n\n\n如果你需要修改一个文件的权限（前提是你对这个文件有写权限），使用 chmod num file，其中 num 对应原则如下：\n\nr =&gt; 4，w =&gt; 2, x =&gt; 1\n\n每一组加起来获得一个和，第一位不考虑，例如 -rwxr-xr-x 除去第一位，换算成 755。\n\n\n如果想递归改变一个目录，使用选项 -R。\n任何情况下 不要 将文件权限设置为 777 虽然你可能看到网络上有些不会用 Linux 的蠢货为了方便这样做，这意味着任何人都有权限修改这个文件，一旦入侵者在其中加入恶意代码，而你使用 root 执行了它，那么恶意代码就有了 root 权限，可以破坏或窃取任何数据。\n有关目录结构：Linux 使用目录树组织目录结构，与 Windows 不同，如果你需要访问一个设备上的文件，你需要把设备挂载到某个目录（相当于把设备自己的树枝接到总树上的某一枝干上，当然接到哪里不一定是固定的），Linux 下有一些约定的结构，通常我们把 /（根目录）放在一个分区上（其他目录都是接在根目录下面），然后把 /home 放在另一个分区里（通常储存了用户们自己的文件），这样一旦需要重新安装，只需要清空根目录所在分区，保留用户数据文件（同时把自己的文件不放在自己的家目录也是不明智的）。更多复杂的解释参见 这里 和 这里。\n如何管理系统？\n现在的发行版通常使用 Systemd 作为启动后的第一个进程，并且由它后台管理启动项，因此如果你使用的是我所列出的较新发行版本，一旦上网搜索到的说明让你使用 rc.local、/etc/init.d/xxx start，直接关掉，他们过时了。\n一般你所需的开机启动的程序比如 http 服务器 nginx，在打包的时候都会有一个 service 文件供 Systemd 使用，Systemd 主要通过 systemctl 这个指令来控制，常见用法如下：\n\nsystemctl enable nginx 表示将 nginx.service 添加到启动列表里（.service 可以省略），如果想同时立刻启动它，在后面附加参数 --now。\n\nsystemctl start nginx 表示立即启动 nginx（并不影响系统重启后的操作。）（这里的启动是指由 Systemd 管理，并不是 Shell，可以理解为后台服务）。\n\nsystemctl stop nginx 立即停止 nginx。\n\nsystemctl disable nginx 将 nginx 从开机启动列表里去除，也即下一次启动系统时不启动它。加上 --now 可以同时停止它。\n\nsystemctl status nginx 查看 nginx 当前的运行状态信息。\n\n\n如果要阅读日志，使用 journalctl 命令。更多详细介绍参见 这里。\n提问的艺术\nLinux 开发者们一般都是凭借兴趣和对写程序的热情进行开发的，或者说他们不像微软和苹果的员工拿了你的钱替你解决问题，唯一让他们解决问题的动力就是写出完美的程序。因此一旦你发现了问题求助于他们，请注意你的语气，这里没有人亏欠你什么，最好进行建设性的发言，并且给出足够的信息，方便其他人帮你解决。如果一上来就吐槽但是问题却是你自己的话，做好挨骂的心理准备。\n最后，有关 “世界上最好的两种语言” Python……\n所有使用 Python 却不指明具体版本的人都是耍流氓！由于 Python2 和 Python3 语法任性的不兼容，而有些发行版默认的 python 链接到 python3 有些还抱着 python2，建议在运行有关指令时使用具体的 python2 或者 python3 而不是 python。同样，使用 pip（Python 的包管理器，安装 Python 一些库的时候尽量用这个）的时候也要指定 pip2 或者 pip3（Python 两个版本有不同的目录，装错了没人管你）。\n不要修改系统默认的 Python 版本，除非你想让用 Python 编写的系统软件崩溃！\n虽然我是不建议使用 Python2 这个即将停止支持的语言，但是只要你编写的时候加上文件头：\n#!/usr/bin/env python2\n\n就不会造成太大问题（Python3 用户把 python2 换成 python3）。\n最后，Linux 下的文件请一律使用 无 BOM 的 UTF-8 编码（自己查这是什么！）。\n不懂的一定要多搜索！搜索引擎（谷歌，必应）是好工具，不搜索永远也学不会。\n"},{"title":"Kalafina, My Music Life","url":"/posts/Kalafina-My-Music-Life/","content":"美好的东西总是在结束的时候才更显珍贵。\n满天\n满天思念化作繁星我想不是所有人都能理解我此刻的心情。消息来的很突然，但是却不出乎意料。\n从梶浦由纪退出事务所的时候，大家就知道会发生这样的事情了吧。\n可是我还没有去听过一场 Kalafina 的演唱会现场。\n明明想好了即使其他歌手的演唱会都不去，K 团的现场也要去。\nKalafina 不只是一个演唱动漫音乐的歌手组合，在我心里歌曲和音乐始终是有分别的，因为当我把 Kalafina 划分进音乐的时候，其他的无论怎样，都只能是歌曲了。\n\nTo The Beginning\n奇迹还会最后降临一次吧梶浦由纪退出事务所的时候，我觉得自己的半个世界崩塌了。\n当然梶浦还是能继续作曲的，可是 K 团怎么办呢。Twitter 下面已经有粉丝评论“我不会听没有梶浦先生的 Kalafina 歌曲”。\n说到底，Kalafina 成立开始就是由梶浦由纪负责的，选拔歌手也好作词作曲也好。\n梶浦由纪是伟大的音乐家，Kalafina 则是有完美的和声和演唱能力。\n梶浦和 K 团就是天作之合。\n在我没有看过 Fate 的时候就这么认为，看了 Fate 以后更加坚定。\n\nARIA\n没有你的未来 此刻刚刚开始我曾经一度失望。\n我以为没有歌手能够把 LIVE 做到和 CD 一样好。\n这很难吗？或者说难道不应该吗？\n一个乐器演奏者永远不懂，我从来不相信演奏者会把自己演奏需要修饰这一点暴露出来，如果现场演奏，就是做到最好，或者和录音一样。\n可是我听了一些在 CD 中有完美音色的歌手的 LIVE 之后放弃了。\n有些没有修正的版本连音调都是不准的，有些虽然准了或者修准了，但是其感情表达远远不能和 CD 相比。\n也许本来如此吧，也许在现场控制自己的嗓子是很困难的事情吧。我这样欺骗自己。\n直到我重新发现 Kalafina。\n如果你也如此绝望，我希望你去听现场版的 ARIA。\n最好的版本是在 5th Anniversary LIVE SELECTION 2009-2012 这张专辑里，LIVE 中夹杂的情感粒度，细节的强弱音色，甚至超过了原版的听感，原版的感情太柔和了，LIVE 淋漓尽致的表现了黑暗中的抗争感。当然 Kalafina LIVE THE BEST 2015 \"Red Day\" 是另一个让人震撼的版本，虽然这个版本 Hikaru 是感冒嗓子沙哑的时候，但是她对声音的控制已经让人觉得惊艳了，甚至说可以超过其他我听过的 LIVE 的一般水平。\n顺便说一下，Kalafina 最开始的时候只有两个人，Wakana 和 Keiko，Hikaru 是后来在参选者中选出来的，Maya 短暂的加入之后就单飞了，在 ARIA 原版发布的时候是四个人的版本，LIVE 的时候只有三个。\n三个人的版本能够超越四个人的版本，并且让我惊讶的是 Hikaru 对感情的表达，彻底让我爱上了这首歌，即使这些部分原本大概不是她的。\n我大概知道为什么梶浦由纪会把她从三万名参选者中选出来了。\n\n君が光に変えて行く\n为了这份渺茫的信念 你将化作光芒将它们照亮在我爱上 Kalafina 的时候，我是没有看过空之境界的，也没有看过 Fate。\n那个时候我还不知道这些曲子是为了什么而写，我也不知道歌词是什么意思。\n即使现在我会把一首曲子的词放到很大比重，也不影响。\n真正的音乐不需要通过歌词来讲述曲子的内容，实际上我喜欢的这些曲子里，发音、以及伴奏和人声交替出现的时间才是令人着迷的地方，这大概也是梶浦语出现的原因。\n当我开始看空之境界的时候，也是许久之后重新听到这些曲子。还是那些熟悉的旋律，熟悉到即使是今天，我也可以跟着这些曲子发音。\n因为在开始的那些时候，也是这样的。\n大概就是过了这么久的时候，才发现自己兜了一个圈子，自己中间听的这么多，结果在一开始就遇上了自己的最爱，但是只有在期年之后，才能再次认识到她的美。\n君将化作光明。\n\n傷跡\n我从寂静中迈步而出 走向未曾见过的爱情我还能多说什么呢？\n有些曲子在一开始是听不懂的，只有在经历了够多，回想起来的时候才懂。\n我相信她们分开，是被迫的而不是因为出现了裂痕。\n\nLacrimosa\n想再一次爱上这眩目的世界镇魂曲。\n如果可以重来一次，我愿意用一切作为代价。\n那个时候我不知道什么是 Bilibili，唯一看过的动漫是黑执事，Kalafina 的曲子是我听过最初听过的 JPOP。\n天空上冷酷无情的众神啊！\n\n辉く空の静寂には\n有多么爱 有多么狂 似如就像这胸膛即将要烧尽狂乱一样很抱歉，我真的很抱歉。\n想哭，但是却哭不出来。当我想写的时候，才发现自己语无伦次。\n没有人会看的吧，或者没有人会同意的吧，因为他们不理解啊。\n那个阳光明媚的、美好却又有着无尽哀伤的夏天。\n那些睡眠被梦魔偷走的夜晚。\n那时候少年还不知道，就像遇见初恋一样的，Kalafina 会如此的重新塑造了他的音乐风格，音乐审美。\n他会因为这个开始看动漫，开始把学会日语作为一个目标，开始深深地沉迷进音乐里，把演奏的爱好珍视如生命。\n他会在多年之后再次深深折服于 Kalafina 的曲子。\n这是他最爱的曲子。\n这一直是他最爱的曲子。\nKalafina 是他最爱的 Musician，不是 Singer。\nKalafina 和梶浦由纪是他未来最爱的 Musician。\n既然没有办法重来一次，那就当现在是最美好的结局吧。能够遇见 Kalafina 是最幸运的事情了，就像遇上了音乐。\n璀璨的天空，静寂中。\nAlynx Zhou\nA Musician\n"},{"title":"コラージュ（卫宫家今天的饭 ED）曲谱","url":"/posts/Emiya-Menu-ED/","content":"コラージュ TV动画 卫宫家今天的饭 ED 曲谱 扒谱 Alynx Zhou\n\n数字谱：\n35[1]4 6[1]4 #5[1]3 5[1]5\n35[1]4 6[1]4 #5[1]3 5[1]5\n35[1]4 6[1]4 #5[1]3 5[1]5\n35[1]4 6[1]4\n\n555432123 4321232 (66)1(7)12\n55567[1]121 123411(7)1\n\n555432123 4321232 (66)1(7)12\n55567[1]121 123411(7)1\n\n511 1511 1511 (55)21\n(76)32 265 67[1] 123431(6)122\n\n23#4 5[2#1] 77766 23#455#433#4#4\n23#45#43#1 #12365#4#2 #23#4522(7)233\n\n23#4 5[2#1] 77766 23#455#433#4#4\n23#45#43#1 #1236[#12] 23#4522#12 23#4522#12\n\n"},{"title":"CoffeeScript 的静态方法和静态变量（类方法和类变量）","url":"/posts/Coffee-Static-Varible-Method/","content":"CoffeeScript 的静态方法和静态变量其实就是 ES6 里面的静态方法和静态变量，但是本身 ES6 应该只实现了静态方法，静态变量的定义方法并不直观，同时加上 CoffeeScript 的语法就更不好得知如何实现，coffeescript.org 似乎也没有对这方面进行过多介绍。网上搜索到的办法大部分只介绍了如何创建静态变量和静态方法，但也就到此为止了，对于其应用的写法，比如如何在实例方法里操作静态变量和如何在静态方法里操作静态变量的区别并没有详细说明。这次打算把自己写 coffee-telegram-bot 时尝试出的办法记录下来。\n静态变量\n很遗憾这里没有 static 这么简单的关键字，即使是在 EMCAScript 里 static 这个关键字也只是用来修饰静态方法，用 static 修饰变量仍然是个提案。首先还是来说如何在常规的 JavaScript 里使用静态变量（只考虑 ES6 之后的情况，因为多亏了 CoffeeScript，我也没有写过 ES5），它是如此的简单而又奇怪，简单是因为即使是我这样又笨又懒的人看过一遍也能在 Node 里完整地默写出来不报错，但是这是有原因的——因为它实在是太古怪了以至于你看一眼就忘不了它：\nclass Test {\n  constructor() {\n    ++Test.counter;\n  }\n}\nTest.counter = 0;\nlet t = new Test();\nconsole.log(Test.counter);\n// 输出 1\n\n没错这段代码是如此的直观，以至于我都不需要写注释来解释每一句干了什么，我敢肯定你有任何一点面向对象的基础都能明白，如果你对任何一个部分表示不理解，我建议你仔细去学习一个面向对象的程序语言—— Java 是个好选择因为它很成熟，同时是个严格的面向对象的程序语言。\n当然，JavaScript 并不是那么纯粹的语言或者说它几乎什么都能做一点并且这个趋势越来越大，所以你并不需要深入的面向对象知识也能看懂上面那一段代码。在 ES6 中实现一个类变量或者叫静态变量就是这个简单地两步：第一在类定义的方法内直接使用类的名字来访问静态成员——你没看错，这里没有 this ——毕竟这里的 this 在上下文中大多数指的还是实例而不是类本身。第二在类定义的外部给你想要的变量进行一个初始化（赋初值）。\n我敢肯定对于 JavaScript 这样一门号称“一切能够用 JavaScript 实现的最终都会用 JavaScript 实现”的语言而言肯定不只这么一种实现类变量的方法，但是最起码对我而言这是最直观的一种，我相信对于一切有一点 JavaScript 基础的人而言这也都是最直观的一种，如果你想问为什么没有更直观的在类定义内部实现的像 Java 或者什么一样的写法，很抱歉，暂时没有，或许你可以等到 ES7 的时代再来学习 JavaScript，当然到那个时候你又会被这门语言其他的问题纠结到 ES8，这很现实，这是一个不完美但同时不断高速进化的语言，它越来越广泛的应用逼着它去填由于愚蠢的商业手段导致的停滞不前带来的坑，当然最起码——JavaScript 虽然出生仓促，但基础并不很糟，或者说它有着各种奇特的实现不断让人燃烧自己的脑细胞。\n好了是时候回到今天的主题了，我觉得我从来就不是一个合格的 JavaScript 程序员因为我喜欢 CoffeeScript——这大概是原罪，特别是在一群 TypeScript 的好战分子眼里——我没有说 TypeScript 不好，但是我只是很喜欢 CoffeeScript 的语法糖以及动态类型带来的天马行空或者乱七八糟的写法——你何必把一只泥沼里的乌龟拉去杀死放在庙里供奉呢？\nCoffeeScript 的官网虽然没有明说，但是它确实有简化这部份的语法糖：\n你只需要像写一个方法一样写一个变量，把它放在和方法一个层次上，然后要在开头加上 @，无论你使用 :  还是 = 来赋值都没有关系。在实例方法中使用时的写法有点变化，你不应该用 @ 因为它不属于当前实例这个 this，它属于 this 的 constructor 也就是说 @constructor，CoffeeScript 编译器会正确的把这个替换成类的名字——没办法，JavaScript 并没有代词指代这种情况。\n\n    ++@constructor.counter\nt = new Test()\nconsole.log(Test.counter)\n# 输出 1\n\" data-info=\"language-CoffeeScript\" data-lang=\"CoffeeScript\" class=\"code-block\">class Test\n  @counter: 0\n  constructor: () -&gt;\n    ++@constructor.counter\nt = new Test()\nconsole.log(Test.counter)\n# 输出 1\n\n编译出来的结果是这样的，虽然有着浓浓的咖啡味道但是也不难懂：\n// Generated by CoffeeScript 2.1.1\n(function() {\n  var Test, t;\n  Test = (function() {\n    class Test {\n      constructor() {\n        ++this.constructor.counter;\n      }\n    };\n    Test.counter = 0;\n    return Test;\n  }).call(this);\n  t = new Test();\n  console.log(Test.counter);\n  // 输出 1\n}).call(this);\n\n实际上如果你只是想 创造 一个属于类的变量还有一种写法，但是严格来讲它并不属于类变量而是访问原型上的一个变量（不要忘了 JavaScript 的原型链），这个变量仍然会实例化，之所以在这里提起是因为网上很多搜索结果把这个也称作类变量，我认为是不正确的。\n\n    ++@counter\nt = new Test()\nconsole.log(Test::counter)\n# 输出 0\n\" data-info=\"language-CoffeeScript\" data-lang=\"CoffeeScript\" class=\"code-block\">class Test\n  counter: 0\n  constructor: () -&gt;\n    ++@counter\nt = new Test()\nconsole.log(Test::counter)\n# 输出 0\n\n不推荐这个写法并不是因为它用了一个 C++ 常见的符号 ::，而是因为它只能让你访问到一个原型上的变量，最后仍然会被实例化，也没有直观的语法糖让你在方法里修改它（大概直接写 Test:: 可行？）。\n静态方法\n有了前面的基础静态方法无论是在原生 JavaScript 里面还是 CoffeeScript 都变得相当直观——大概只需要一个例子：\n在 CoffeeScript 中和处理静态变量很类似，都是简单地在前面加上 @，当然如果你要在静态方法里操作静态变量不需要写 @constructor 而是直接写 @，因为这个时候上下文的 this 就是这个类本身——严格来说这也是不对的，能够绑定到这个上下文的原因是 CoffeeScript 编译的时候增加的函数作用域——这是个好东西，咖啡味。换句话说 ES6 这里根本就没有和 this 扯上关系，它只能傻乎乎的用类本名，CoffeeScript 在这里自己多搞了一点，用这个来变通，翻译成 JavaScript 的时候再替换掉文本。\n\n    console.log(@counter)\n  constructor: () ->\n    ++@constructor.counter\nt = new Test()\nTest.printCounter()\n# 输出 1\n\" data-info=\"language-CoffeeScript\" data-lang=\"CoffeeScript\" class=\"code-block\">class Test\n  @counter: 0\n  @printCounter: () =&gt;\n    console.log(@counter)\n  constructor: () -&gt;\n    ++@constructor.counter\nt = new Test()\nTest.printCounter()\n# 输出 1\n\n编译成 JavaScript 之后是这样的，static 关键字终于出来刷存在感了：\n// Generated by CoffeeScript 2.1.1\n(function() {\n  var Test, t;\n  Test = (function() {\n    class Test {\n      static printCounter() {\n        return console.log(Test.counter);\n      }\n      constructor() {\n        ++this.constructor.counter;\n      }\n    };\n    Test.counter = 0;\n    return Test;\n  }).call(this);\n  t = new Test();\n  Test.printCounter();\n  // 输出 1\n}).call(this);\n\n总结\n事实上到上面已经靠几个例子说明了正确的用法，但是由于还有交叉处理的部分，简单总结一下。\n1.把变量写在类定义里面属性的层次并且在变量名前面加上 @ 会在 CoffeeScript 里产生一个静态变量。\n2.在方法名前面加 @ 会在 CoffeeScript 里产生一个静态方法。\n3.在静态方法中操作静态变量只需要像在实例方法中操作实例变量一样使用 this，这个作用域就是类定义的上下文，CoffeeScript 自动把 @ 替换成类的名字以便符合 ES6 语法。\n4.在实例方法中操作静态变量需要使用 @constructor，原因是这个时候的 this 是实例本身而不是类，类在 CoffeeScript 里绑定到了 this.constructor，编译时自动替换成类的名字（因为 ES6 只能这样访问类变量而不是用一个引用）。\n5.在静态方法中操作实例变量……根本没有这样的用法好吧！！！\n碎碎念\n明明是凑数的文章却偏偏写了这么多，反正大概是没有人看的，毕竟 CoffeeScript 是要凉了，就像那些激进分子希望的一样，光是喜欢又有什么用呢？他们是不会管你喜欢不喜欢的，他们不喜欢就得了。短期内倒是希望 Atom 能搞点什么大新闻，可以不要让 VSCode 激进分子在我这边黑 Atom，我就是喜欢用 Atom 不喜欢用 VSCode，就算你觉得 Atom 有很多缺点可是我觉得它足够合适乃至我可以接受它的缺点，在我这边吵除了生气以外还能有什么作用不成？所以我讨厌辩论，光是说，却没什么实际作用。或者这大概是软粉和微软受害者的冲突而已？最近没得东西写出来，还是去推一推 Fate/Stay Night 或者打一打 CSGO 好了。\n"},{"title":"StackHarbor 的 2017 尾记","url":"/posts/2017-Tail/","content":"\n回到住处，掀出电脑，拉开在超市买的一听可口可乐的拉环，还有一个半小时，现在该写2017年的年终总结了。时间刚刚好。\n一直拖一直拖，拖到最后却发现把想说的都丢在了路上。\n想起来才发现好久以来都是“你也牵过手，是左手牵右手”，无所谓，没人看的。\n今晚月色真美，你的学校也是，虽然从北京来到南京也没能逃过雾霾，河北省可以不背锅了这次。\n喝可口可乐也会醉吗？\n有好多事情没有做呢，明年再说吧。我又不是个精力充沛的人。\n其实很想做一个深情又优雅的人啊，可以唱深情的歌，但是总是做不到的吧，提速提的再快也只能发现优雅的人他的高贵大概是天生的，再努力的结果也只是让你更清楚的认识到这中间的差距不是靠努力就能实现的。\n我曾经如此觊觎日月的光辉。\n我曾经如此渴望爱情的甜美。\n我曾经如此在乎他人的感受。\n我曾经如此高估自己的才华。\n能怎么样呢，有时候样子是装给别人看的，还有时候样子是装给自己看的，要么改变样子成为自己想要的，要么坦然接受自己现在的样子，做到任何一个是勇气，做不到任何一个，只能是自己给自己笑话好了。\n爱一个人是那么容易的事情么？\n也许对于18岁的自己来说是的吧，但是毕竟没有人永远18岁啊。\n以前就想不明白，想恋爱怎么也会是负担。但是想多了就不敢了啊。\n做选择为什么这么难呢。\n世界说这世界并不像你想像的那么友好。\n世界说它总是对你带有敌意。\n世界说你所珍视的最后总是只对你自己有意义。\n世界说每个人都会投入生活的洪流，最后被生活碾碎。\n世界说生命不断进化，但是世界永远循环往复。\n世界说我爱你因为你就是世界。\n生命如此漫长，漫长到我们不得不寻找一些事情，给他们附加上别的意义。人类就是这样一种脆弱而又倔强的物种啊，我们提出了自己是谁的终极问题，然后发现这个问题并不能推导，我们必须通过实践，认识不同的人，建立重要的关系，给事物附上属于自己的意义。生命是漫长的，但它的漫长不过是让我们有机会做完所有自己要做的事情，才能更好的认清我们自己。\n哪怕前面五个悍匪端起P90 Rush B，也要握紧手里的M4A1-S。早就过了可笑的追逐最强的年龄，到现在才无可救药的开始喜欢超电磁炮，即使她不是最强，即使在剧情里出现了越来越多更强的人，可是我还是喜欢她啊。\n一个好故事比什么都值钱，一个会讲故事的人也是。对于StackHarbor而言，又增加了一年呢，又要开始讲述新的故事。\n请原谅我这个不熟练的讲述者吧，因为我爱这世界。我不仅爱它的每一次相聚，也爱每一次分离，我不但歌颂每一个新生命的诞生，我也歌颂每一个生命的离去。即使知道前面是洪流，我也要追逐爱情。\n2018，新的一年，请多指教，当然，请不要忘记先看最新版的About Me。\n我爱你，因为你就是世界。\n"},{"title":"忧从中来，不可断绝","url":"/posts/Song-And-Sadness/","content":"\n那个弹吉他的人在我的隔壁。\n老实说他弹的很一般，但却让在琴房待了一下午一晚上的我决定多待一会。开始他只是练音阶和唱音高，但是后来他唱了几首歌，有董小姐，有不再见，还有我没听过的。\n虽然中间不是很连贯，有的地方还要重来，而且还隔着琴房的隔音墙。但是在这个普通的周六晚上却让我有了想哭的冲动。\n也许歌者无意但听者有心。当一首歌被写出来的时候，它纪录的不过是创作者的故事，但是当它被人听到的时候，就不再是只属于作者的了。喜欢听歌不过是因为想从其中听到自己的故事。\n有些歌曲听过了才会明白。有些故事经历过了才会懂。\n在这个特殊的日子里听到一段段歌声。\n他不需要知道我为什么哭泣。\n不如永远不见。\n"},{"title":"冬天来了","url":"/posts/Winter-is-Coming/","content":"生活好像脱缰的野马，你我都不是熟练的骑师。\n昨天在外面冻了一天，今天又搞了乱七八糟的代码，所以就头疼了一天。\n每天还是睡不醒的样子，12点睡7点起，真想找个时间好好睡他十二个小时。\n昨天从东区招新回来睡了两个小时又起来去写网站到晚上十一点，今天起来上课就听说有的社团招完新第一次例会都开过的，想想我连短信都没有发，强忍着头痛拉完了群，又开始想在哪里组织活动。人一多就很难找到共同的时间，也许是我本来就不适合做这些事情，回头看仅有的四个活动室又都被选了好时间，看来都是用的脚本，又得给自己加需求了。\n没什么比一次热水澡更治愈了。\n还有一周时间要看大物和模电，又头疼。\n总有乱七八糟的无聊事情。我的bot还没加功能呢。\n如果人也有发情期，我觉得是在冬天。\n不知道为什么寒冷的气温反而能激发人恋爱的欲望，比起暴露的夏天，在这个温度里互相拥抱更加舒适，即使彼此都穿的臃肿。\n这才是恋爱和失恋的季节。每到这个温度孤独就违背自然规律从坚冰融化成海浪，后一阵总来的比前一阵猛烈。\nWelcome to the StackHarbor, sir/madam, a unreal harbor which belongs to the void sea, here's your hot milk, hope the wave sound and cold rain won't distrub your dream, good night.\n"},{"title":"我生气了！！！","url":"/posts/I-Am-Angry/","content":"\nI AM ANGRY!!!这里多了一只发怒的猹喵。愤怒能抑制懒惰。\n我发现可能是我的C++老师有着过于清奇的脑回路，几条没头没脑的作业评语毁了人的好心情。\n算了，不值得。\n你本来就没什么好心情。\n既然见面了，人们往往还是要从天气谈起。\n很抱歉这里没什么好天气，先是雾霾又是下雨，霾里藏雨真是可怕。\n生活总是在极端之间摇摆，中音谱号露脸的机会总是最少的，又好比剪指甲，太长了刮键盘恶心，太短了又会按的手指疼。\n我刚刚剪的有点短。\n希望什么的总是 不存在的，一件事情并不会因为在脑海里排练多次就会完美发生。\n也有可能连发生这件事情的机会都消失了。\n没有脑子，僵尸是什么时候干掉小推车的？\n再次体会到没有分析清楚就做事情的痛苦（由于冲动选择更新StackHarbor，这一条痛苦*2）。\n反正烦恼会解决烦恼，新的刚来到，旧的就忘掉。\n有时候听懂一首歌真的是不开心的事情，你仔细一听，这歌词说的，哦不对骂的，不就是我吗？\n为爱情折腰确实是一直以来戒不掉的癖好。\n你那也配叫爱情。\n你那也配叫编程。\n你那也配叫音乐。\n你那也配叫文学。\n真嫉妒啊。\n说好听点活着就是要不断突破自己，说不好听就是你做了这么多最后还是觉得一事无成，你还是看着那些早就自我实现的人，一边安慰性的嫌弃他们，一边羡慕的等着自己的运气。\n想来想去，想了好多，最后决定什么也不做，这算是逃避吗？\n你可真是唯心主义啊。\n谁管他别人怎么说，反正自己认为自己漂亮地struggle。\n嘴上说着不相信命运，心里比谁都希望一切顺利，一切顺利不就是不需要自己努力的代名词。\n所谓的赏析有点多余，不就是心里想着“哎呀这个太好了一下就把我心里想的没想的都说清楚了长的都是一样的嘴可是我怎么就说不出这样的话呢”。\n愤怒过后也有空窗期。\n该睡觉了，晚安，我跟自己说。\n明天又是早八点到晚六点不停转。\n美好的一周又要从一节C++开始了。\n还是相信命运吧，毕竟除了明天我们一无所有。\n期待明天不是因为信心漫漫，也可能是因为别无选择。\n开始时捱一些苦，栽种绝处的花。\n幸得艰辛的引路甜蜜不致太寡。\n你说，这开始的苦怎么就这么长呢。\n"},{"title":"Be Brave","url":"/posts/Be-Brave/","content":"It's really hard for me to type something in this post, all I want but can't express is fearness.\n\n\nDon't know how to express, I think if to express is a kind of ability, I must lose this for a long time.\nAll I am trying to do is just like a man who cannot swim but trying his best in water, you cannot say he did nothing to help himself, but in fact his work did nothing.\nI am really afraid of losing control of everything I can reach, I want everything go as my thought, even a little difference can drive me crazy.\nI have no time can express except the darkest night, everyone lives in everyday works so hard, I cannot give them a sad face.\nI give it to myself. I am trying to be the most perfect and attractive to other people. I know I always fail.\nI know I did things wrongly, but I need chance to redo.\nChances are expensive, but only you get chances can you make changes.\nAll things go like this must have reasons.\nSometimes I find myself boring.\nI did lots of things to find other interests to support life.\nI listen to music, but I find I got crazy and press next in 30 seconds for a song. I cannot keep listening to even one song, I just feel tired.\nI read books, sometimes I can read them quickly, but most I cannot read even one page.\nI cannot write even one line of code.\nI play games from day to day, but not so happy.\nI want to stay alone while I want someone can stay with me.\nI nearly get the one, I nearly lose the one, I don't want to lose the one, I must regain the one.\nBut how can I get a chance?\nWill there be a person from the future telling me that the result?\nI know no one can lives in his fifteen forever.\nI used to think little about the far future.\nNow I still think little, but a little bit further.\nTotally out of my control, the future.\nGirl inside.\nMaybe I can only write such boring things now.\nSorry.\nBe brave, just two simple words, but how can I keep brave while facing uncertainty?\nI still trying to make me seems perfect.\nI know only in this way can I regain chance.\nJust for a chance.\nLeave tears and fearness to myself, I won't let others see.\nBut who can wipe my tears when I wake from dream in midnight?\n"},{"title":"Dirty Words","url":"/posts/Dirty-Words/","content":"I'm so honor that I can speak another language when they ask me to shut up with their language.There are some ways to fight against with them, but only when you have enough power, sadly.\nI feel so lucky, though I cannot speak English so good, but if you are with me, I believe you can feel what I wanna say.\nAnd it seems that they do not care about English essay.\nI don't know how to say in normal words, oh yes they won't let you say.\nWhat could let a man give up his native language speaking something?\nThere is examine everywhere, and what's more horrible, the people in this \"wonderful\" land developed a kind of \"self-examine\".\nBecause abnormal things happen every day.\nInside their border. some words even some people can disappear suddenly, just because they are something different from the main idea. Even the minority is correct.\nOut of the border, they cannot simply remove it, but they block their people from watching.\nI were able not to speak those, because I am a poor programing monkey(or cat)? I am so tiny so weak. The old saying goes that \"Being quiet will save your life\". I should just write my code and live my poor life.\nBut I can't.\nFirstly they blocked words negative to them, I said nothing, because I don't believe those words, partly they taught everyone those are fake.\nSecondly they blocked colorful hairs on TV, I said nothing, because I don't like colorful head.\nThirdly they said gay and lesbian are abnormal, I said nothing, because I am not one of them.\nBut finally when you want to say some words, they just disappear, like you never live.\nThat's interesting? You and many people before you developed tools, you wanna to build a dream world, you believe that every one in the world shoud be friendly, because we are all mankind, we should love each other and be brothers or sisters, aren't we?\nAnd what do you think when you see devil destroyed your world?\nConstructors are great, who can only make problems to others is shit.\nThat's when self-examine come into existance.\nWhat a strong life a man is!\nEven your mouth loses your voice, you eyes lose your vision, you ears can hear nothing but \"positive energy.\"\nIf the so-called positive energy is everywhere, where could negative energy be? Your heart? My heart?\nRemove the speaking function of your mouth and leave eating here, isn't it good?\nBut we are not born like these!\nThere are days we say everything we want on the Internet, but you see, a post with hundreds of thousands of reposts were removed, you find you are so tiny.\nTogether we stand but then get killed?\nOr most of the people have a hard mind and a soft heart? Just some cheap words can let people believe a bad man is for their peace.\nSorry I never eat chicken soup.\nIf you did something with a totally wrong direction and think your practice can let others respect you, you are a totally dog shit. If you asked a group of people doing wrong thing for you, you are totally a son of the bitch.\nIf not, what should we do for the people in the correct direction?\nDon't disturb me with these silly things you made. Do what you should do.\n"},{"title":"你的名字。","url":"/posts/Your-Name/","content":"老实说我也许是个对电影没什么品味的人，但是在看了这个之后总觉得要写点什么。\n不过参考现在的时间和我黑暗中可怜的盲打能力（最后想起来我的LED灯），这篇文章不会很长。\n某种意义上来讲，虽然我是属于认为“生活就是应该有情调”的那种人，但是我的生活却一直没什么情调。最好的例子就是在看电影上，我是个几乎没去过几次电影院的人，但是看完《你的名字。》之后，我最后悔的是当时没能和你一起去电影院看，当然考虑到时间和空间确实是没有可能性，所以改成寒假一起看了《爱乐之城》。\n没忍住在pt上找到了片源挂下来，然后一直看到深夜，这也是少有的让我看一遍就感触颇深的剧情。\n上一次听到这样的曲子是什么时候来呢？大概是未闻花名的片头，略带慵懒的男声，给人的感觉像是和煦的阳光照在身上。不同的是这一次我想流泪。\n前一小时欢乐而又离奇的叙事，和后四十分钟虽然长，但是却能让人一直保持紧张的高潮。\n看了整部电影，有情感共鸣的是三叶第一次看到东京的时候。\n没错我想说这和我一年前的感受是一样的。\n仿佛走进了Minecraft的巨大化地图，当然还有并行的轨道列车，以及复杂的道路。\n能把生活中最有特色的部分提取出来才是真正的艺术。\n当然，还有泷与三叶第一次在电车上见面，以及两人在错过之后的转身而遇。\n有人说是故弄玄虚，但我以为这是绝妙之处。\n有一些文化是只有东方人才能理解的，东方文化的含蓄，对宿命和缘分的看中。\n三叶站在泷的面前却因为第一句话受阻而脸红不敢开口。\n似乎一切都没有改变，却又遇见了系守的那对情侣，抬头只看见无法确认的背影。\n在电车上偶然看见，仿佛突然想起一切般寻找，明明就在对面，眼泪溢满眼眶又不敢确认而错过。\n最后仍旧是羁绊而回头。\n“从你的前前前世开始，我便一直在寻找着你的踪迹。”即使我不记得你的名字，那就让我再大声的问你一次吧。”\n灯灭了呢。\n不知不觉，已经过了一个月，很长？很短？我是给自己定了永远的时间线呢。\n今晚月色真好。\n晚安。\n"},{"title":"突然更新","url":"/posts/An-Update/","content":"谨以这篇没营养的更新表明我现在闲着。嘛，好久不见，我还是那只猹喵Alynx，本着我一向诚实的原则，丑话说在前头，这篇间隔许久的更新注定是没营养的，如果你珍惜你的流量的话——\nWindows用户/大部分Linux用户请按右上角X，macOS用户/Ubuntu用户/自己偏要把关闭按钮挪到左面的用户请按左上角X，Android/iOS用户请按home键并把您的浏览器从多任务界面除去。Windows Phone用户（如果有的话）请把手机摔掉，并感谢我（而不是微软爸爸）给了你一个冠冕堂皇换Android/iOS设备的理由。\n如果您还没有坚定您的决心，实验七写完了吗？实验七50页的坑爹说明都看懂啦？没看懂还不赶紧把你打印出来的实验七说明撕了，回去高中找你的语文老师承认没好好学习语文的错误！\n顺便补充一句把这种垃圾实验说明打印出来本身就是对树木的不尊重了，你看我知道我写的东西很垃圾，所以我从来不打印纸质版，都是放在网站上做电子版。\n如果你成功越过了上面的重重挑战，很好，~~和我一起打开Steam，来一盘紧张刺激的CS:GO/Dota2，今天的更新到此结束，谢谢大家。~~让我们往下继续。\n今天是（日期自己看发布日期！）多云转晴，空气还是凉爽的，难得的好天气，虽然走在外面还是会出点汗。\n杯子里的冰咖啡在冰块化开之后稀释成了红茶般的颜色。\n“下面插播一条新闻，您正在阅读的这篇文章由于 1. 写作者播放器播放的音乐不对 2. 写作者困了想睡觉了 3. 写作者的输入法罢工了 而推迟更新日期到无限期。”\n（搞什么啊！现在的新闻都这么没劲了啊！骗鬼呢！）\n可是也许我想说的本来就没什么想说的，或者说我能在这里写出来点什么东西真的该感谢从小学到高中的语文老师们，我知道我不是个什么有文学天赋的学生，如果有，也被我放到代码里面了。\n说正经的，从上一次更新到这次更新的漫长时间里我都做了什么呢？（观众：我们对你吃了啥喝了啥和机友搞了啥没兴趣！骗人呢这不是！我：说实话我对我吃了啥也没兴趣，毕竟东区食堂就剰那么两样能吃的了。）\n上个可怜的三天假期花了两天时间从pt上拖下了高清的EVA，占据了我相当可观的一块硬盘空间，然后把这个套着热血OP实际是导演作死的意识流神作看完了。TV + 旧剧场版（最后那个大白丽求导演别吓宝宝了行不） + 三部新剧场版。\n“福音战士新剧场版:||，现已与 科学超电磁炮3/科学超电磁炮剧场版 一起加入您的有生之年套餐！”\n具体内容不评价了，毕竟EVA的分析已经有好多了，我自觉没有那个水平，你说我的感受？上面那句还不够吗？\n这个可怜的假期则是昨天半夜看了下载好的攻壳机动队2017，又把可怜的宝宝吓得不轻（别嫌弃喵确实比看上去要胆子小，求抱抱）。好在看完这个没有让我产生补番的冲动。\n（难道你这么多天不更新除了看番看电影就没干别的嘛！！！）\n当然有啊，写那个该死的实验七嘛，虽然没写完呢还（懒）。\n还有准备口琴社团的建立啊，终于开始步上正轨了，建成的时候还需要人捧场呢。\n还有直播啊，初生牛犊不怕虎的在B站录C语言入门教程，具体的原因嘛，嘿嘿嘿嘿嘿不告诉你们。\n想看的点击这里也许能访问到我的Bilibili主页。\n（所以你今天写这个更新到底是要干啥啊！）\n不干啥啊，表示我现在（仅仅是现在）很闲（其实就是心里想偷懒）啊。\n如果真的想看严肃的/文学性的/技术流的/音乐向的，放心，接下来我会督促自己往下写的，不会这么长时间断更了。\n哦对，快要高考了是吧。送给学弟学妹们一句话，考试放松点，报志愿谨慎点。\n毕竟你要考试紧张了没发挥好，报志愿再不上心，今年8月份你可能就在北交大军训咯（笑哭），虽然17届在学校军训不用去怀柔也没有散训（怨念啊！），可是你们还有月考啊！还有除了计算机与信息技术什么都学就是不学计算机与信息技术的计算机与信息技术学院啊（仅限大一大类招生）！还有我们假期少啊！\n玩笑归玩笑，该考虑的还是要好好考虑的，毕竟你活着不应该是只为了学习或者工作，相反，工作和学习是为了更好的生活。\n那么今天这个没营养的更新就这样结束了，饥饿的猹喵要去觅食并准备今晚的直播了。\n"},{"title":"灰色情人节","url":"/posts/Grey-Valentine-s-Day/","content":"感冒 + 鼻炎 = 浪费纸张，另外也许大脑缺氧会导致胡思乱想，很疲惫又无法入睡。\n终于回到了温暖的季节，天气好的让人觉得继续躲在屋子里面就是浪费了大好时光。\n可是自己一个人走在温暖的阳光下却感觉像是暴露在射线下一样难以忍受。\n所有的人离预期似乎都有差距，接近预期的却又很难制造交集。\n比起跨越千里的车票，直达对方内心的车票更加贵重些吧。\n灰色的情人节，把黑色的爱给白色的你。\n"},{"title":"使用 GDB 进行简单的 C 语言程序调试","url":"/posts/Using-Gdb/","content":"事实证明有时候无聊的东西反而变成了一篇博文，谁叫恶趣味的C语言作业非要求用word写实验报告，本猹宁可先写成Markdown再复制粘贴过去。\n首先按照惯例应该介绍下GDB，搭配GCC使用的调试器，也是众多使用GCC为编译器的IDE的默认调试器（大概？），虽然无聊的实验报告模板还很搞笑的写了一个部分叫XXX调试器和VC6.0的比较（看戏的内心：我看过两年学生出生时间比VC6还晚的时候这些课还怎么拿VC6讲）。\n所以掌握GDB的使用还是很有必要的，毕竟掌握某个使用GDB的IDE终究只是掌握了一个图形壳子，原理估计还是要深入一层到直接用GDB（强行接入正经模式）。\n这里只是按照实验报告的要求写一下断点调试和单步执行的用法（PS：Word实在是太难用了，字号缩进和标题序号就没有按照我想要的方式工作过。\n\n准备\n调试模式编译程序\n首先应该明确调试的实现方式，GDB能够暂时的停下程序操作程序其实是通过向编译过程中的二进制流中添加钩子（HOOKS）来实现的。但是对于一个正常的，打算释出给用户使用的程序而言不应该以调试模式编译，因为这些添加进去的钩子不但会增大文件体积，还会降低程序的运行效率。所以GCC默认编译程序的时候时不会添加这个钩子的，需要的时候以-g参数来启用调试模式。\n本例中以文件Lab2.c为例，使用命令\n$ gcc -std=c11 -g -o lab Lab2.c\n\n将它编译到可执行文件lab。\n用GDB打开程序。\n打开程序的命令很简单，就是$ gdb lab，但是有可能遇到的问题是程序要处理命令行参数，在使用GDB的时候是不能直接在命令行后面附加程序参数的，需要使用参数可以在打开GDB之后输入set args 参数1 参数2 ...附加上参数。\n用GDB打开程序之后是一个交互界面，显示了一些信息和(gdb)这个提示符，表示你现在是在和GDB进行交互而不是程序。这个时候程序是不会运行的。\n\nThis is free software: you are free to change and redistribute it.\nThere is NO WARRANTY, to the extent permitted by law.  Type &quot;show copying&quot;\nand &quot;show warranty&quot; for details.\nThis GDB was configured as &quot;x86_64-pc-linux-gnu&quot;.\nType &quot;show configuration&quot; for configuration details.\nFor bug reporting instructions, please see:\n.\nFind the GDB manual and other documentation resources online at:\n.\nFor help, type &quot;help&quot;.\nType &quot;apropos word&quot; to search for commands related to &quot;word&quot;...\nReading symbols from lab...done.\n(gdb)\n\" class=\"code-block\">GNU gdb (GDB) 7.12.1\nCopyright (C) 2017 Free Software Foundation, Inc.\nLicense GPLv3+: GNU GPL version 3 or later &lt;http://gnu.org/licenses/gpl.html&gt;\nThis is free software: you are free to change and redistribute it.\nThere is NO WARRANTY, to the extent permitted by law.  Type \"show copying\"\nand \"show warranty\" for details.\nThis GDB was configured as \"x86_64-pc-linux-gnu\".\nType \"show configuration\" for configuration details.\nFor bug reporting instructions, please see:\n&lt;http://www.gnu.org/software/gdb/bugs/&gt;.\nFind the GDB manual and other documentation resources online at:\n&lt;http://www.gnu.org/software/gdb/documentation/&gt;.\nFor help, type \"help\".\nType \"apropos word\" to search for commands related to \"word\"...\nReading symbols from lab...done.\n(gdb)\n\n调试\n设置断点\n首先使用break指令就可以添加一个断点，断点顾名思义就是程序运行到这个位置会暂停下来交给GDB，这样你才能够在程序运行到一半的时候查看一些可疑的变量，断点是针对函数使用的，比如我想在所有的printf()进入的时候暂停，可以使用：\n(gdb) break printf\n\n显示的是这样的：\n(gdb) break printf\nBreakpoint 1 at 0x400540\n\n当然接下来可以继续添加更多的断点。\n然后使用run就可以让程序跑起来：\n(gdb) run\nStarting program: /home/alynx/Homework/实验材料（学生版）/实验2/lab\n[实验2说明]本练习运行一个三重for循环, 循环结构如下:\nint count = 0;\nfor(int i=0; j&lt;LoopEnd1; i++)\n{\n\t//第一重循环体\n\tfor(int j=0; j&lt;LoopEnd2; j++)\n\t{\n\t\t//第二重循环体\n\t\tfor(int s=0; s&lt;LoopEnd3; s++)\n\t\t{\n\t\t\tcount++;//第三重循环体\n\t\t}\n\t}\n}\n\nBreakpoint 1, 0x00007ffff7a86e00 in printf () from /usr/lib/libc.so.6\n\n这时候使用print指令可以打印任意的内容：\n} 0x7ffff7a86e00 \n\" class=\"code-block\">(gdb) print printf\n$1 = {&lt;text variable, no debug info&gt;} 0x7ffff7a86e00 &lt;printf&gt;\n\n使用bt指令可以显示出程序的栈（Backtrace）：\n(gdb) bt\n#0  0x00007ffff7a86e00 in printf () from /usr/lib/libc.so.6\n#1  0x0000000000400745 in main (argc=1, argv=0x7fffffffe078) at Lab2.c:26\n\n输入c就是继续运行程序的意思。但是step指令的功能更加有用，顾名思义这个就是单步运行，每次只运行一行代码，这是个step-in的模式，即如果该行有函数则进入函数内一行一行运行，而next则是step-over的模式，即如果该行有函数会运行函数返回结果而不是进入函数内部。\n(gdb) step\nSingle stepping until exit from function printf,\nwhich has no line number information.\nmain (argc=1, argv=0x7fffffffe078) at Lab2.c:27\n27\t    scanf(\"%d\", &amp;LoopEnd1);\n\n如果不输入指令直接回车，就是重复上一条指令，程序运行结束之后可以使用quit指令退出GDB。\n\n好了本猹要去补作业了。\n"},{"title":"口琴曲谱：sister's noise","url":"/posts/Sister-s-Noise/","content":"半音阶口琴，sister's noise 数字谱，喵自整理版，txt下载点击这里，读谱方式点击这里。\n;;sister's noise 半音阶口琴\n\n[#5#55#5 #6#7]{#1} [#7#755]\n[#3#3#2#3]{#1}[#7#6#6#5#6#7]\n[#7#6#5#35#55#5#2 5#5#35#5#3]\n[#35#5#35#5#7#7]{#1}[#7#6]\n[#5#5#5#5 #6#7]{#1} [#7#755]\n[#3#3#2#3]{#1}[#7#6#6#6]{#2}[#7]\n[#7#6#5 5#55]\n[5#2#6#55#5 #6#5#6#7 #6#7]{#25 544}\n\n{11}[4 34336] {11}[4 545#66]\n{11}[4 34335 45556 652#66]\n{11}[4 34336] {11}[4] {21}[#6#76]\n{11}[4 3431 5434 3322]\n[21] #6[12 234 3451]\n[123 345 5#664]\n[444 45#5 55#5#2]\n[#2#6#55#5#6 #5#6#6#7#755]\n\n[#5#55#5 #6#7]{#1} [#7#755]\n[#3#3#2#3]{#1}[#7#6#6#5#6#7]\n[#7#6#5#35#55#5#2 5#5#35#5#3]\n[#35#5#35#5#7#7]{#1}[#7#6]\n[#5#5#5#5 #6#7]{#1} [#7#755]\n[#3#3#2#3]{#1}[#7#6#6#6]{#2}[#7]\n[#7#6#5 5#55]\n[5#2#6#55#5 #6#5#6#7 #6#7]{#25 544}\n\n{11}[4 454336] {11}[4 545#66]\n{11}[4 34335 45556 652#66]\n{11}[4 54336] {11}[4] {21}[#6#76]\n{11}[4 3431 5434 3322]\n[21] #6[12 234 3451]\n[123 345 5#664]\n[444 45#5 55#5#2]\n[#2#6#55#5#6 #5#6#6#7#755]\n\n[#5#55#5 #6#7]{#1} [#7#755]\n[#3#3#2#3]{#1}[#7#6#6#5#6#7]\n[#7#6#5#35#55#5#2 5#5#35#5#3]\n[#35#5#35#5#7#7]{#1}[#7#6]\n[#5#5#5#5 #6#7]{#1} [#7#755]\n[#3#3#2#3]{#1}[#7#6#6#6]{#2}[#7]\n[#7#6#5 5#55]\n[5#2#6#55#5 #6#5#6#7 #6#7]{#25 544}\n\n;; 电吉他solo。\n\n;;#5 #35#5#65#2[#6]#2[#7] [#7]#25#6#7#2[#3] #7[#3#2#1]#7[#2#1]#7#6#7#5\n;;#65 #554545#554#2[#7]#2#3[#5#6#7]#2 #7#5#4#3  5#55452[7]4\n;;4[#7] 5#2 #7#6#55 #6[#2 /*5#55*/ 4]{#1}[#7#6#6 5#5#6]#1#7#6 [1235]\n\n[555 671 77#4#4]\n[3323]{1}[766567]\n[7653#45#452 #453#453]\n[3#453#4577#776]\n\n[#5#55#5 #6#7]{#1} [#7#755]\n[#3#3#2#3]{#1}[#7#6#6#5#6#7]\n[#7#6#5#35#55#5#2 5#5#35#5#3]\n[#35#5#35#5#7#7]{#1}[#7#6]\n[#5#5#5#5 #6#7]{#1} [#7#755]\n[#3#3#2#3]{#1}[#7#6#6#6]{#2}[#7]\n[#7#6#5 5#55]\n[5#2#6#55#5 #6#5#6#7 #6#55#5 544]\n[#3#7#6#5#6#7 #6#7]{#25 544}\n\n"},{"title":"口琴曲谱：LEVEL5 -judgelight-","url":"/posts/LEVEL5-judgelight/","content":"半音阶口琴，LEVEL5 -judgelight- 数字谱，喵自整理版，txt下载点击这里，读谱方式点击这里。\n;;LEVEL5 -judgelight- 半音阶口琴\n\n7#67[#1#2 #27#6#5#4#2 #4#2#4#5#2]\n[#23#4#57 #6#5#4#1 #23#2]\n7#67[#1#2 #27#6#5#4#2 5#5#6]{#1#1#2}[7]\n[7#6#5 7] {#1}[7#6#4 #67#5]\n\n[#2#2]7 7[#1#2#1#4#1] 77#5 #5#67[#1#1#2#2]\n[3#2#1] 7[#1#2]#6 [#1]7#67#5 #5#6 #67#67#5\n[#2#2]#5 [#2#23 #2#2]#6#6 [#4#4#4 #43#2] 77#1#2\n#5#67 7 #5#67 7[#1]7 [#1#1]7 [#1#13#2]\n\n7#67[#1#2 #27#6#5#4#2 #4#2#4#5#2]\n[#23#4#57 #6#5#4#1 #23#2]\n7#67[#1#2 #27#6#5#4#2 5#5#6]{#1#1#2}[7]\n[7#6#5 7] {#1}[7#6#4 #67#5]\n\n[1]7[123] [3]{1}[7653 53563]\n[3456]{1} [7652 343]\n[1]7[123] [3]{1}[7653 #567]{2231}\n{1}[76] {1} {21}[75 7]{1}[6]\n\n[#2#2]7 7[#1#2#1#4#1] 77#5 #5#67[#1#1#2#2]\n[3#2#1] 7[#1#2]#6 [#1]7#67#5 #5#6 #67#67#5\n[#2#2]#5 [#2#23 #2#2]#6#6 [#4#4#4 #43#2] 77#1#2\n#5#67 7 #5#67 7[#1]7 [#1#1]7 [#1#13#2]\n\n7#67[#1#2 #27#6#5#4#2 #4#2#4#5#2]\n[#23#4#57 #6#5#4#1 #23#2]\n7#67[#1#2 #27#6#5#4#2 5#5#6]{#1#1#2}[7]\n[7#6#5 7] {#1}[7#6#4 #67#5]\n\n[1]7[123] [3]{1}[7653 53563]\n[3456]{1} [7652 343]\n[1]7[123] [3]{1}[7653 #567]{2231}\n{1}[76] {1} {21}[75 7]{1}[6]\n{1}[76] {3} {21}[75 7]{1}[6]\n\n;; 下面是电吉他solo，再下面\n\n7#67[#1#2 #27#6#5#4#2 #4#2#4#5#2]\n[#23#4#57 #6#5#4#1 #23#2]\n7#67[#1#2 #27#6#5#4#2 5#5#6]{#1#1#2}[7]\n[7#6#5 7] {#1}[7#6#4 #67#5]\n\n7#67[#1#2 #27#6#5#4#2 #4#2#4#5#2]\n[#23#4#57 #6#5#4#1 #23#2]\n7#67[#1#2 #27#6#5#4#2 5#5#6]{#1#1#2}[7]\n[7#6#5 7] {#1}[7#6#4 #67#5]\n\n[1]7[123] [3]{1}[7653 53563]\n[3456]{1} [7652 343]\n[1]7[123] [3]{1}[7653 #567]{2231}\n{1}[76] {1} {21}[75 7]{1}[6]\n{1}[76] {3} {21}[75 7]{1}[6]\n\n"},{"title":"口琴曲谱：only my railgun","url":"/posts/Only-My-Railgun/","content":"半音阶口琴，only my railgun 数字谱，pdf下载点击这里，txt下载点击这里，读谱方式点击这里。\n;;Only My Railgun 半音阶口琴\n\n[7#6#4] [#4#5#5] [#4#4#5#5] [#4#4#5#5]\n[#5#5#67]{#1} [#6#4]{3 #1 #1 #1 #2}\n[7#6#4] [#4#5#5] [#4#4#5#5] [#4#4#5#5]\n[#5#5#67]{#1}[#5] [#5#67]{#1}[#6#4#2#4]\n[#4#5#5] [7#6#4#2#4] [#4#5#5]\n\n[#5] [#55#5#6#5] [#55#5#6#7]\n[#7]{#1}[#7#6#7#6#5]{#2}[#7]\n[#5] [#55#5#6#5] [#55#5#6#7#3] [#6#55#5544]\n[#7#7#7#7#7] [#7#6#55] [5]{#2 #2}\n{#2} {#2#1}[#7#6] {#1}[#7#6#5] [55#3#5]\n[#5#5#5#5#5] [#5#67#6#6#4#4]\n[#4#3#3#2#35#5]\n[#5#55#35]\n\n[7#6#4] [#4#5#5] [#4#4#5#5] [#4#4#5#5]\n[#5#5#67]{#1} [#6#4]{3 #1 #1 #1 #2}\n[7#6#4] [#4#5#5] [#4#4#5#5] [#4#4#5#5]\n[#5#5#67]{#1}[#5] [#5#67]{#1}[#6#4#2]\n[7#6#4] [#4#5#5] [#4#4#5#5] [#4#4#5#5]\n[#5#5#67]{#1} [#6#4]{3 #1 #1 #1 #2}\n[7#6#4] [#4#5#5] [#4#4#5#5] [#4#4#5#5]\n[#5#5#67]{#1}[#5] [#5#67]{#1}[#6#4#2#4]\n[#4#5#5] [7#6#4#2#4] [#4#5#5]\n\n[#5] [#55#5#6#5] [#55#5#6#7]\n[#7]{#1}[#7#6#7#6#5]{#2}[#7]\n[#5] [#55#5#6#5] [#55#5#6#7#3] [#6#55#5544]\n[#7#7#7#7#7] [#7#6#55] [5]{#2 #2}\n{#2} {#2#1}[#7#6] {#1}[#7#6#5] [55#3#5]\n[#5#5#5#5#5] [#5#67#6#6#4#4]\n[#4#3#3#2#35#5]\n[#5#55#35]\n\n[7#6#4] [#4#5#5] [#4#4#5#5] [#4#4#5#5]\n[#5#5#67]{#1} [#6#4]{3 #1 #1 #1 #2}\n[7#6#4] [#4#5#5] [#4#4#5#5] [#4#4#5#5]\n[#5#5#67]{#1}[#5] [#5#67]{#1}[#6#4#2]\n[7#6#4] [#4#5#5] [#4#4#5#5] [#4#4#5#5]\n[#5#5#67]{#1} [#6#4]{3 #1 #1 #1 #2}\n[7#6#4] [#4#5#5] [#4#4#5#5] [#4#4#5#5]\n[#5#5#67]{#1}[#5] [#5#67]{#1}[#6#4#2#4]\n[#4#5#5] [7#6#4#2#4] [#4#5#5]\n\n;; 小提琴solo，不适合口琴演奏。\n\n;;[#4 #2#2] 7[#1#2] [#1]7 #67#6#5 #4#5#4#5 #6#5#4#5 #4#2#1#2 #1{7 #5} #2#1{7 #5}#2 #1{7 #5 #6}#1{7 #5 #6} {7}#1#2#3#4 #3#2#3#4 #5#4#3#4 #3#2#3#2 #3#4#5#4 #3#4#3#2 #3#2#1#2 #1{7#5} {#6 7} #1 #2#4#5\n;;#5 7 [#2 #5 #2#5#67 #6 #4 #1 #4 #6 7] {#1 #1 #2 3 #4 3 #2 #1} [7 #6 #5 #4 #6 #6 #5 #4 #5] [#5]{#5} {#4 3 #2 #1 #2 3 #2 #1#2#1} [7]{#1}[7] [#6#5#6] [7]{#1}[7] [#6] [#3]{#3 #1}[#5]{#1}[#5#3#1#3#1]#5 #3#5#3#1 #2(#6) #25#6[#2]#6[#2 5 #6 5 #6]{#2}\n\n;; 简化过的口琴版本，仍然不适合演奏。\n;;[#4 #2#2] 7[#1#2#2] [#1]7 #67#6#5 #4#5#6#5#4#2 #1#2#1{7 #5} #2#1{7 #5}#2 #1{7 #5 #6}#1{7 #5 #6} {7}#1#2#3#4 #3#2#5#4#3#2 #1#2 #1{7#5} {#5} #2#4#5\n;;#5 7 [#2 #5 #2#5#67 #6 #4 #1 #4 #6 7] {#1 #1 #2 3 #4 3 #2 #1} [7 #6 #5 #4 #6 #6 #5 #4 #5] [#5]{#5} {#4 3 #2 #1 #2 #1} [7] [#6] [7] [#6] [#3]{#3 #1}[#5]{#1}[#5#3#1#3#1]#5 #3#5#3#1 #2(#6) #2#6[#2]#6[#2 #6]{#2}\n\n;;#2#5 #5#67#6#4#2#4 [#1 #1]7#67[#1 #1]7#67[#1 #2 #2]\n;;#57[#2 #2 #1]7#67[#1]#5 #3#4#5#5545\n\n\n[#664] [455] [4455] [4455]\n[556#6#7] [64]{#2 1 1 1 2}\n[#664] [455] [4455] [4455]\n[556#6#75] [56#6#7642]\n[#664] [455] [4455] [4455]\n[556#6#7] [64]{#2 1 1 1 2}\n[#664] [455] [4455] [4455]\n[556#6#75] [56#6#7]{2 #2 2}\n\n[7#6#4] [#4#5#5] [#4#4#5#5] [#4#4#5#5]\n[#5#5#67]{#1} [#6#4]{3 #1 #1 #1 #2}\n[7#6#4] [#4#5#5] [#4#4#5#5] [#4#4#5#5]\n[#5#5#67]{#1}[#5] [#5#67]{#1}[#6#4#2]\n[7#6#4] [#4#5#5] [#4#4#5#5] [#4#4#5#5]\n[#5#5#67]{#1} [#6#4]{3 #1 #1 #1 #2}\n[7#6#4] [#4#5#5] [#4#4#5#5] [#4#4#5#5]\n[#5#5#67]{#1}[#5] [#5#67]{#1}[#6#4#2#4]\n[#4#5#5] [7#6#4#2#4] [#4#5#5]\n\n"},{"title":"喵的曲谱说明以及目录","url":"/posts/Music-Score/","content":"以十六孔琴、标准音高为准，非口琴常用音高，十二孔请自行移调！\n大部分乐谱经本人手动整理，如有不符合说明的情况请自行处理或者等待更新！\n乐谱为逐句调整，无省略。\n(低音)    中音    [高音]    {倍高音}\n目录\nonly my railgun\n科学超电磁炮 OP1 fripSideLEVEL5 -judgelight-\n科学超电磁炮 OP2 fripSidesister's noise\n科学超电磁炮S OP1 fripSide\n"},{"title":"Linux下使Steam调用Bumblebee使用独显","url":"/posts/Steam-with-Bumblebee/","content":"买了个罗技G502，想想这鼠标狙击键要在fps游戏里才能发挥作用于是入了l4d2的坑，Steam购买，没想到P530核显实在是吃不动这货，FPS上30都很困难，于是研究了一下怎么样调用Bumblebee来使用独显。\n要使用独显首先你得保证你有个独显（这不是废话吗），我的独显是Nvidia Quadro M1000M，虽然是工作站显卡，但是玩游戏应该能达到GTX960左右的性能吧，然后你得安装Bumblebee（我只弄过N卡的，A卡不清楚），但是不是简单的安装Bumblebee这个包，按照ArchWiki，需要安装的包有bumblebee bbswitch primus virtualgl lib32-primus lib32-virtualgl mesa nvidia nvidia-settings lib32-nvidia-utils lib32-mesa，各个包的作用在下面：\n\nbumblebee\n\n主要的程序啦，用来建立一个独立的X服务器做渲染。\n\nbbswitch\n\n用来切换nvidia卡的开关状态，有了它才能保证不用的时候关闭nvidia卡省电。\n\nprimus virtualgl\n\n这两个分别是不同的桥接器，可以二选一，也可以都用，ArchWiki介绍的是virtualgl的optirun，但是primus是未来的默认选项，性能更好，Steam也推荐用primus。\n\nlib32-primus lib32-virtualgl\n\n这两个是32位库，因为Steam和大部分上面的游戏都是32位的。\n\nmesa nvidia nvidia-settings lib32-nvidia-utils lib32-mesa\n\nmesa是开源的OpenGL标准实现，另外的则是 I卡的驱动（官方开源）和 N卡的闭源驱动（性能较好），N卡的设置，以及它们对应的32位库。\n更新：I 卡推荐用内核实现了，不用装那个了。\n接下来将你的用户加入bumblebee组，启动bumblebeed：\n# gpasswd -a user bumblebee\n# systemctl enable bumblebeed --now\n\n然后测试：\n\n64位$ optirun glxspheres64\n\n32位$ optirun glxspheres32\n\n\n需要独显运行的程序直接用$ optirun %command%就好啦，当然把optirun换成primusrun就是用primus啦。\n对于Steam单独的游戏设置，只要在游戏上右键点Properties，打开的窗口选择SET LAUNCH OPTIONS，输入primusrun %command%，运行游戏的时候就是用primusrun运行了。我这里l4d2可以稳定60FPS。\n但是还有一些需要启动器启动的，比如Minecraft，采用Hello Minecraft Launcher，用$ optirun java -jar HMCL.jar启动了启动器，但是启动器却不会用optirun去运行游戏本体，解决办法也很简单：\n首先$ optirun bash，在这个bash里面用$ optirun java -jar HMCL.jar启动启动器，再打开游戏就是独显啦！\n~~本来$ optirun status是应该能查看N卡状态的，但是Arch似乎没法运行这个命令，可以用$ cat /proc/acpi/bbswitch查看ON/OFF。~~这里是我记错了，应该是用$ optirun --status查看N卡状态。\n对于一些版本比较老的bumblebee，optirun开启了独显后没法自动关掉它，是一个bug，手动关闭需要：\n# rmmod nvidia_modeset nvidia &amp;&amp; sudo tee /proc/acpi/bbswitch &lt;&lt;&lt;OFF\n\n但是新版已经解决了这个bug。\n如果你想开启N卡的设置，不能简单地运行nvidia-settings，因为这时候N卡并没有开启，也没有连接到当前的桌面上，使用$ optirun nvidia-settings -c :8就可以开启了。\n参考了Steam的说明，现在剩余的问题就是玩游戏太热了。\n"},{"title":"碎碎念","url":"/posts/Some-Words/","content":"我还是会回头、注视，街上每一个像曾经的她的人，但即使我活在过去，心里也很清楚，她的打扮早已不是那时候原来的样子了。没有什么好说的，无非是些碎碎念，本猹发现自己似乎有了不用 HHKB 就没法安心写代码写网站的毛病。\n叫喊着假期要学新语言选择了 Node.js 作为新目标，当然有很大的原因是 Hexo，然后发现自己还是 Too young too simple, sometimes naive 面对这么一个硬骨头无从下口，想要搞懂 Node 看来必须了解 Javascript，而 Javascript 似乎是个非常广阔的东西自己并没有找到详尽的参考，回头又发现前端的 Javascript 好多地方是不能直接拿到后端的 Node.js 上用的，然后抱着瞧一瞧看一看的思维由掉进了 CoffeeScript 的坑，用了两天时间看完了 Coffee 官网上的教程之后觉得不甚了解又想用这货写点什么，昨晚玩着 UNO 就突发奇想开了个新坑想用 CoffeeScript 实现一个联机的 UNO 游戏，仔细想了想发现需要了解的还有很多，打算边走边看（弃坑什么的才不会呢！），好像似乎大概也就是自己写个 HTTP Server 用来交换信息再写个 HTML5 的界面然后可能还会有基于 Electron 的应用（神啊我再也不给自己立 Flag 了杀了我吧！）。\n然后说着上次的换编辑器，大概是用上了 Atom，好多地方还得适应，首先就是不像 Emacs 几乎一套快捷键全搞定了，然后模仿 Emacs 键位的插件多多少少有些问题，某个插件导致 CPU 占用率上升，这个还没排除，总之以后有时间会解决的，最近光是把 Gentoo 换回 Arch Linux 就够折腾的了。\n接下来是重点！电磁炮真是太可爱了！\n具体怎么掉进 某科学的超电磁炮/科学超电磁炮 的坑说来很离奇。考完思修的下午紧接着就是两天周末休息，于是舍友高喊着应该看番放松一下，又补充了一句不看柯南，然后我就想起来说看电磁炮怎么样我一直想看（其实最早知道超炮还是 Android吧 的帖子 安吧基佬眼中的世界，其中有一幅 安吧基佬听到电磁炮 上面就是炮姐），结果舍友拒绝了，我就说那我自己看好了，打开 Bilibili 看了一集，又看了一集，又看了一集，又看了一集……然后发现由于实在太过好看剧情连贯发现自己根本停不下来，从六点一直刷到晚上十二点半刷了1-17集（其实二周目的时候发现自己不小心漏掉了第四集所以是看了16集），第二天早上起床还是没忍住用了一上午刷完了超炮第一季觉得这大概就是所谓的发现了自己的本命番的感觉美琴是真爱啊，然后决定把超炮S缓存下来留到回家的火车上看。这之间因为不过瘾又把魔法禁书目录小说/动漫里面美琴出现的地方都刷了一遍，了解了剧情走向也有点失望，于是又把科学超电磁炮的漫画刷了一遍（我也不知道窝一个从来不看漫画的人为什么会破例！)。\n话说回来窝站得是坚定的黑琴党（毕竟黑琴党头顶青天脚踩类人猿），河马这直男癌+后宫小说的风格还是让人觉得黑琴的结局会是 Bad End…… 总之说到这一点还是要吐一大堆槽，超炮是神作，但是原作魔禁一点也不对我的胃口，当麻人确实很好，但这种嘴炮+右手的刷级开后宫+魔法侧大比重+各种乱七八糟的圣人魔神总感觉是进入了网络小说的套路（没错还有重要一点是窝炮姐后期居然被魔神和某新晋后宫男的恶心后宫吊打！而且也很不爽炮姐被作者划归到当麻的后宫里！美琴是黑子的！当麻快回家抱你的小黄书去！）。我还是喜欢看科学侧的事情多一点。反正这里我个人给入坑的人一点提示，如果你是魔禁入坑的话就把魔禁的小说和动漫看完就好了，但是你要是超炮入坑的建议按照超炮、超炮ova、超炮S的正常顺序看完超炮动漫然后追超炮的92话漫画连载，然后就可以等天国的魔禁三出了之后的超炮三了（魔禁小说最近几卷作的死导致销量下滑所以我觉得魔禁三是有希望的），千万别碰魔禁一点以防止你被恶心到！\n就算希望渺茫，我也坚信美琴对当麻并不是喜欢，只是因为遇到了力量比自己强的人，关系比较密切而已，美琴和黑子也并不是同性恋，只是恰巧最合适自己的人性别相同而已。黑子才是在美琴心中特别的存在吧。我宁可不要什么天国的魔禁三，也要黑琴的 Happy End。\n我们喜欢的不是什么科学侧的超电磁炮、常盘台的王牌、无敌的电击公主、被电子宠爱的天赐之子，这些都是御坂美琴这个特殊的形象的一个剪影而已，她既有这些优点，也是爱好幼稚、个性难以捉摸、有教科书式傲娇、为了别人不惜牺牲生命的人。\n千万句Bilibili也抵不上一句Ouneisama。\n自己整理的超电磁炮有关的歌单本来想贴上来的，但是由于版权原因无法生成外链播放器，那就贴这首吧。\n你指尖跃动的电光，是我此生不变的信仰，唯我超电磁炮永世长存！\n"},{"title":"一些想法","url":"/posts/Some-Thoughts/","content":"话是怎么说的来着，生命在于折腾。骑磨烤柿也不能阻止折腾党的决心。\n其实是排着的日程太多了，不得不记录一下。\n上次终于把用 tkinter 写的 GUI 程序搞出来了，打算有时间写一篇来记录一下基础用法，但是这很明显是个浩大的工程，怎么也得考完试在说。\n成功跳坑到 Atom，之前一直心水这货的设计理念，最近下载了尝试一下，成功掉进了这货的设计里（没错默认的 One Dark 主题就是好看极了我就是喜欢看脸来打我啊）。菜单卡顿的问题在我从源里安装了 electron（风扇在咆哮）之后就不见了，甚至比 Sublime 还要快。弃 Emacs 坑的原因主要是各种玄学问题没发解决，比如那个奇葩的 C-g 要按两次才会生效，另外我这里 Emacs 包多了以后启动比 Atom 还慢……以及那些跟我说应该回 vim 坑的……我有一句妈买批不知当讲不当讲，hjkl 实在是太反人类了本猹接受不能。\n嗯，所以 Atom 暂时看起来没有什么严重的问题，更新了这么久 bug 应该也修复了不少，接下来要是有什么紧要的事情，那就是给 Atom 搞一套 Emacs 风格的快捷键，鼠标操作比起键盘快捷键操作明显难受的多，默认的 Atom 走的是 Windows 风格的自带的快捷键，感觉实在是不怎么样，好在 Atom 的定制化直追 Emacs，应该不成问题，然后就是要学 js 啦（总给自己开新坑系列），前端的事情这里也用得上，假期有时间打算看一看 Node.js。\n能想起来的大概就是这些了，迫不及待的想要考完试回家玩……让本猹抽到个白骑士·月光好不好啊……\n哦对了，这篇是 Build with Atom, a hackable text editor for the 21st Century.\n\n"},{"title":"StackHarbor 的 2016 尾记","url":"/posts/2016-Tail/","content":"\n大象永远不会遗忘。转眼间时光飞逝，站在了2016的尾巴上（2016：好疼！），仔细想想似乎也没什么好说的，无非是考完了高考，上了大学，写了一堆乱七八糟的代码，比如这个，嘴上天天说要做的事情还是有不少没做，比如改一改Emacs配置（这种flag成本太高了立不得），还有根本就立不了的flag一大堆，说穿了也还是自己太弱了吧。\n**本文搭配音乐食用应该更佳，为了照顾流量党和用户体验，没有设置自动播放，请手动播放后继续！**如果你伴随着音乐看完了这篇文章觉得没有达到预期，那么我只能告诉你：最终解释权归本人所有！\n\n有些事，每天挂在嘴边也还是做不到，比如脱单，当然，希望在新的一年里收获感情，不要再让我孤独地等下去了，反正都知道我自己没办法出手，这个障碍还是要靠别人帮我克服。\n有些话，即使在心里重复了无数遍，也没办法说出口。\n有些人，即使离的再远，再久没有联系，好像已经完全的脱离了生活，也能在不经意间触动你。\n大象永远不会遗忘。\n给这一年分一个词语的话，我觉得是“改变”。\n成长是一个自然的过程，但是成熟却常常意味着与自然相反，nature如果排序的话，肯定要排在mature的后面。\n不出意料地写了自己的第一个带GUI的程序，虽然还是一个随意的作品，仅仅在今年结束前几天才成型，但我还是愿意把它当作自己今年编程的一个标志吧，没有写过的人不会懂，没有自己摸索写代码经历的人也不会懂。\n都写了那么多程序了，这么一个玩具值得这么高兴嘛。\n当然值得。\n假如你在最忙的时间里依然保持着对编程的热爱，那你就能理解。当一个人在上学放学的路上在口袋里装着写满代码的本子，没有键盘拿手机ssh也要把程序写出来的时候，能够轻松的理解更多他还不能理解的代码和工具就是他的追求，GUI就是这个追求路上的里程碑。\n这个GUI编程不是像大部分一样，想当然地伴随着程序出现，也不是玩具积木一样在一些工具的指导下拼接出来的，在写这个程序之前，起码要做的准备是在CLI下理解一个语言，然后把GUI作为一个工具，让程序能跟大部分人更好交流的一个实现方案。\n扯远了，总之我很高兴自己摸索了一个新领域，在以前根本不敢想的。编码为的是一种热爱，是为了能够取悦自己，在一行行的代码里找到问题所在并去解决它本身就是一种愉悦，或者说是自然的反应，而不是为了实现别的目的去驱使自己。\n值得高兴的是提了第一个有意义的PR，给NexT主题的，但是现在还是没有被合并进去，这个东西对我而言主要的意义是为了添加这个脚本，我在短时间内大概理清了NexT所用语言的组织形式和实现的结构，在之前并没有深入理解过yaml和javascript、swig的前提下，把这个脚本加进了正确的位置，并给它添加了开关，虽然最后实现的代码很简单，但是理清问题也是我想要的能力之一。\n唉，说了这么多废话，又没有人给我稿费，要不还是多写点技术性文章吧，还能提高点逼格，作为一只猹，本猹还是要多学习。\n那些在某个晚上充满灯光的屋子里坐在窗边想到的话都去哪里了呢？有些自己也觉得没头没脑的，有些实在是本猹愚钝驾驭不了的，索性放出去玩好了，至于剩下灵光一现拍脑袋能写出来的，贴上来了也没有人看，看了也没有人说好，有人说好也不会说出来。\n但是我还是要再打一回脸了，如果有人看见上面那句感兴趣了，想说好了想留言了，我觉得不错，推荐你看的是**这篇**，无所谓，我又不是老罗卖情怀，能打脸就自觉打咯，不过你要是吐槽或者灌水就算了。\n展望2017，还能期望什么呢？反正都是靠自己付出获得的，听英语作业到吐血，终于把自己听力提高一点了，写了好多行代码，终于让自己的能力又上升一级了，吐槽是要吐的，但是光吐槽不干活可不怎么样，浪费时间就更不好了。\n如果你热爱一样东西，就应该能够拼尽全力，否则就是不够热爱，丢掉也不可惜，送给有选择困难和疑似心理障碍的自己。\n庆幸这半年认识了好多对我很好的人，比如一直一起上课的战神，自己肯定是没有看上去那么强，甚至很脆弱，总是犯各种各样的毛病，也许没有人陪的话我自己是活不下去的。再比如对我特别好的曹学姐和森神，以及虎哥，真的不知道说什么来谢谢你们，还认识了许多关系不错的朋友，比如某熊和男神，不多说了你们都懂啦，反正我是蠢喵，猹不猹的先一边子去吧……不行我这里要说的还有一群dalao比如范神、博神和某HHKB大佬，本猹还是要给各位dalao递递猹，能得到dalao夸奖肯定是本猹很开心的事情啦。\n所以说呢，如果2017有什么好期待的事情的话……唉太羞耻了不能说。\n算了太羞耻了还是要说的，藏的太深维持两面人格实在是太累了本猹受不了啦。我作为一个多年没有经验的隐S，还是想要一个合拍的抖M啦！（必须是妹子！能拿绳子捆起来玩的！）（上面那句话不要误解，我对LGBT群体没有歧视，但是我觉得无缘无故的给性取向正常的人扣个不正常的帽子，硬要把人掰弯可不能接受了，平等可不是说Gay就能随便调戏直男的好吗……）\n心理年龄大了？反正现在是没有当初折腾刷机的精力了，一切都顺顺利利的就好了，实在不行就得降低点自己的期待，满足感是个好东西。\n新的一年，唯愿再无波澜。\n"},{"title":"初雪","url":"/posts/First-Snow/","content":"2016年的第一场雪？仔细想想也许不对，实际意义上的第一场雪，在每年一月份还没开春的时候就应该下完了，这怎么能叫做第一场雪呢？\n索性人类是一种充满了双重标准的物种，或者说是一种以自我为标准的物种，所以他们任性的把自己觉得是第一场雪的雪叫做第一场雪。然而，这确实是我在北京经历的第一场雪，虽然它以雨的第一形态来到世界上，在众人熟睡的时候再变为雪在空中飞舞，也许是过于流恋世界上的景色，在人们都起床之后它却忘了收起自己的踪迹，留下漫天雪花随着风飘动。\n只是雪太小了，小的不足以吸收掉外界的声音，小的不足以覆盖一个个温暖的梦在雪层下生长发芽。\n听说家里那边也下雪了，下的很大，同样的地点不同的人在同样厚的雪面上做着相同的嬉笑打闹。\n傍晚昏暗的天空下，人们撑起伞阻滞被风吹起的雪花钻进眼睛里。低头看见路上一双双脚移动，不小心四只鞋子两两相对，每双鞋子都想要移动给对方避让，一个往左一个往右，却偏偏又撞在一起，只好抬开伞尴尬的说一句对不起。\n真的很累。\n还是想要曾经的大雪，一片一片的雪花飞舞，落在身上，可以不大伞，尽情的接纳着大雪。\n曾经以为埋在雪面下的梦，现在依旧在那片雪面下生长着，温暖而美好，让人想抛开现实，回到那个风雪不停息的夜晚，那个日光黯淡下来路灯亮起的时候，那份美好幸福的期待，迎着寒风生长。\n"},{"title":"生活在BJTU","url":"/posts/BJTU-Life/","content":"闲扯\n每一次更新都仿佛时隔多年，当然这次不全是因为懒。之前大学第一个月并没有带来自己的电脑，靠着树莓派和机房的电脑怎么折腾也都觉得劳心费力。就算没有产出，到底也是把网站的域名转移到了alynx.xyz。顺便还把多年不换的昵称从头到脚折腾着换了一遍，Alynx 这个名字看起来更像是一个正规的英文名了。\n天气转凉，我要去把阳台的门关好再回来继续。\n生活\n作为一只没有出过远门的、来自三线城市的学生喵，去帝都上学也许是一件大事。高考前心心念念要去魔都，高考后却阴差阳错全部选择了帝都。这自然要归功于 Hack Ghost 这只学霸。\n当然帝都的生活也不完全是雾霾、拥挤，这里有着和家乡相似的气温，有着植满树和草地的学校（以至于让我对我的高中产生了深深的嫌弃……没有树荫的路也能叫人行道？？？），这里有最适合计算机专业发展的环境。也许我是一个天性容易满足的人，虽然宿舍很小很破，但我也没有觉得不适；学校的位置紧靠着西直门交通枢纽，加上学生卡交通卡二合一，可以让我无数次的跟城郊的同学开玩笑说“进城”是什么意思。同样也有一群性格各异的舍友，每天行走在不同课程的路上，也要作为一个除了Minecraft不玩其他游戏的人看着舍友一起打别的游戏，还要忍受不能理解的游戏激动时的叫喊。可能这样的生活并没有什么特别之处，但每一天都过着自己选择的生活，有什么不能满足的呢?\n值得说的还有热心的学长学姐，也许不能简单地把他们对我们的帮助归结于程序员圈子里的互帮互助，但是在陌生的环境，这种帮助更有着特殊的意义，也许我们没有办法把这些感情完全的还给你们，最好的办法就是像你们一样，帮助以后的学弟学妹了吧。\n学习\n没错，我爱学习，学习使我快乐！专业选的好年年像高考可不是说着玩的！能理解为什么计算机学院要学习工科化学工程制图大学物理吗？？？！！！可怕……当然最坑的还是作业……放了个假微积分线性代数作业像是打了鸡血一样！默默在汽车上写了一下午微积分的我眼泪留下来……\n当然说回来最激动人心的还是专业课了……计算机基础课现正式更名为听常老师谈人生……C语言课就是懂得人昏昏欲睡不懂的一脸懵逼……当然我是会点还得认真听课的那种，所以我现在最轻松的科目莫名的变成了专业课么……你们别怀疑，我来自一个只有数学物理化学竞赛的三线城市，计算机竞赛是个啥？能吃吗？我可以保证我玩这些都是为了兴趣不是为了竞赛！！！\n所以少年我们一起去明湖边讨论C语言吧！（此处应该有个梗）\n"},{"title":"会发说说报时的树莓派","url":"/posts/RPi-QZone-Bot/","content":"此方案已经被作者废弃且由于时间久远，记录的事物可能已经改变，作者不能保证此时页面内容完全正确，请不要完全参考。由于WebQQ的验证码机制更新，QQLib的作者已于2016年8月17日更新源代码，本页也随之更新！请之前使用过的朋友用# pip3 uninstall qqlib卸载旧版，再重新安装最新版的QQLib，使用本页最新的Python脚本！\n\nHello，最近好久没有更新博客了，因为一直没有发现什么好玩的东西来写（其实就是因为懒）。那么前天终于发现了一个好东西，就是这个QQLib for Python，可以通过Python在QQ空间发说说的库。\n说到找这个东西的原因嘛……由于一些你懂得的原因，Telegram被封锁是日益严重啊。我以前写了个非常有用的TeleBot跑在树莓派上，无奈身边用Telegram的人太少（无法装X），所以最开始想在树莓派上跑一个微信公众号来玩。然后发现微信的Api要求你指定一个域名，可是我树莓派跑在家里电信是不会白给我一个固定ip的（555……），为了解决这个问题我还特地造了个轮子，用Python自己封装了一个CloudXNS的Api用来定期ddns更新A记录，脚本写好了之后上网搜了一下发现有人说你在自己家里跑httpd被抓到是会被电信查水表的……虽然没有法律明文规定，但是就是这样，嗯，这背后一定有肮脏的PY交易（和谐）。于是微信公众号的计划就这样流产了……正好L Giki说他和他的朋友实现了一个QQ的聊天机器人，然而他们是PHP党……而且实现方法很复杂，主要是腾讯丧心病狂的加密……还有webQQ协议已经被腾讯阉割的不成样子了。百般无奈之时发现了这个GitHub项目，本着有轮子就不要自己造的原则，我决定写一个定期发说说的程序运行在树莓派上，那就是这样。\n老规矩，这个脚本不是很长，下面贴上来吧，它的名字叫做qclock.py（2016-08-17更新）：\n#!/usr/bin/env python3\n#-*- coding: utf-8 -*-\n\n### Filename: qclock.py\n## Created by Alynx Zhou\n# alynxzhou@gmail.com, http://alynx.xyz/\n\nimport os\nimport time\nimport qqlib\nfrom qqlib import qzone\n\nQQ_NUM = 1234567890\nQQ_PASSWD = \"MyPassWord.\"\n\nqz = qzone.QZone(QQ_NUM, QQ_PASSWD)\n\ntry:\n    qz.login()\nexcept qqlib.NeedVerifyCode as nvc:\n    # Get a verify code.\n    verifier = nvc.verifier\n    with open(\"verify.jpg\", \"wb\") as verify_jpg:\n        verify_jpg.write(verifier.image)\n    print(\"Saved verify photo to verify.jpg, please open it by yourself.\")\n    vcode = input(\"Enter verify code here: \")\n    try:\n        # Test verify code.\n        kw = verifier.verify(vcode)\n    except qqlib.VerifyCodeError as vce:\n        os.remove(\"verify.jpg\")\n        raise vce(\"Wrong verify code!\")\n    else:\n        # Finish login.\n        qz.login()\n        os.remove(\"verify.jpg\")\n\nprint(\"Login finished.\")\n\nunit = \"°C\"\n\ndef get_temp():\n    # Get internal CPU temperature.\n    with open(\"/sys/class/thermal/thermal_zone0/temp\") as temp_open:\n        temp = float(temp_open.read())/1000\n    return temp\n\n# Loop to get time and feed to qzone.\ntry:\n    while True:\n        tm = time.localtime()\n        if tm.tm_min == 0:\n            qz.feed(\"树莓派自动报时：\\n现在是%d年%d月%d日 %d时整。\\nCPU温度为%.2f%s。\"%(tm.tm_year, tm.tm_mon, tm.tm_mday, tm.tm_hour, get_temp(), unit))\n            print(\"Feeded at %d-%.2d-%.d %.2d:%.2d.\"%(tm.tm_year, tm.tm_mon, tm.tm_mday, tm.tm_hour, tm.tm_min))\n        elif tm.tm_min == 30:\n            qz.feed(\"树莓派自动报时：\\n现在是%d年%d月%d日 %d时%d分。\\nCPU温度为%.2f%s。\"%(tm.tm_year, tm.tm_mon, tm.tm_mday, tm.tm_hour, tm.tm_min, get_temp(), unit))\n            print(\"Feeded at %d-%.2d-%.d %.2d:%.2d.\"%(tm.tm_year, tm.tm_mon, tm.tm_mday, tm.tm_hour, tm.tm_min))\n        # Use 60 to keep only one feed in the minute.\n        time.sleep(60)\nexcept KeyboardInterrupt:\n    exit()\n\n当然，下载链接在这里（2016-08-17更新）。\n使用的时候先把QQ_NUM的值修改为你打算用来装X发说说的QQ号码，QQ_PASSWD的值则是你QQ的密码咯。这里建议各位不要使用自己用的QQ号做实验，而是另申请QQ号来作报时～不然谁知道腾讯哪天会不会找个什么理由关闭webQQ再冻结你的QQ号呢～\n然后就是一句话的……不对！你还需要先安装QQLib啊，就像下面这样：\n# pip3 install git+https://github.com/gera2ld/qqlib.git\n\n然后一句话运行起来：\n$ python3 ./qclock.py\n\n保持它不要关闭，最好的办法还是GNU Screen啊～\n每到整点和半点你的树莓派就会自动发一条说说报时并附上当前的CPU温度～如果你想做更多的话完全可以自己扩展我这个脚本。记住那个time.sleep(60)的60不是随便能改的，一分钟一次的循环不会特别耗资源，如果你改小了间隔，可能会导致一分钟内它走了两次循环，发了两条说说。时间的精确度保持在分钟级别。\n然后，我用来测试的QQ号是3530795351，这是它的QQ空间，欢迎围观效果。\n好啦，这个脚本就先介绍到这里了，我要去继续完善更多功能咯，首先还是要搞好我的Emacs，然后，我不是针对腾讯，我是说BAT这三个货都是辣鸡！\n"},{"title":"如果时光停滞三年","url":"/posts/Three-Years/","content":"\nYou know how the time flies.\nOnly yesterday was the time of our lives.\nWe were born and raised in a summur haze.\nBound by the surprise of our glory days.\n\n偶然看到朋友在空间里发出的一张图片，他突发奇想在自己高中的招生网站上输入了自己当初的准考证号，然后惊讶的发现弹出的消息是您已被XX市高级中学录取。\n也许，三年并不是很长？因为我翻遍了歌单，也没有找到一首以这段时间为主题的歌曲。人们总是追求长久，再久一点，十年都不够，偏要再加一个十一年。\n一切的一切仿佛停滞在了三年前的那个时刻。那个时刻我们又都在做什么呢？\n做着什么样的事，听着什么样的歌，玩着什么样的游戏，用着什么样的手机，和什么样的人做朋友，过着怎样的一种生活。\n有一个瞬间叫做往事历历在目，也有现在这个瞬间叫做难以记起。是因为时间太久，久的我们都忘记了？肯定不是。\n就像是海边拾贝壳的孩子，收获颇丰，但当大人让他介绍一下自己的收获的时候，他却挠了挠头。\n也许是每一块贝壳都带着大自然相同程度的鬼斧神工，带着它引人注目的闪光点，所以他并不知道从哪一个说起，太多的话想一起挤出来，于是就变成了哑口无言。\n三年前带着自己的迷惑走进接下来的人生，然后到了现在发现回忆起的只有三年前的迷惑。三年的时间改变了你我，却没能改变天边那一抹晚霞。\n有的人像断了线的风筝，走了就再也没办法追回来。三年前就觉得自己受到过最深的伤害的人，三年后再看也觉得只是那么回事。\n以后的路还长着呢，不能把跤都先跌够了。万一下一个修养地的风景更好呢，是吧。\n时间是最好的催眠药，有时候真担心自己突然醒来，发现做了一个好长好长的梦，梦里自己经历了三年时光，醒来却发现还是三年前那个早上，看着闹钟担心自己即将迟到。\n时间过得飞快，三年前还在说着今后的计划，回过头来看当初的话好像刚刚说完。就像是那个错觉，自己还是拿着三年前的录取通知，紧张的担心着自己被分到哪一个班级，里面有多少曾经认识的人。\n还好，这一切都过去了，噩梦也好美梦也罢。时间没有停滞，总之我们顺利的来到了下一个阶段，有失去也有收获，没什么嘛，人要学会知足。\n再多的代价也没有办法让时间停滞三年，没有办法换回三年的第二次经历。当然我想没有人愿意拿自己三年收获的友谊、知识和财富，去碰个运气来试试召回离开的那些人。\n怎样的痛苦也都化作了痛哭排出心灵。\n你看那陀螺即将停止。\n醒来吧。\n"},{"title":"用OpenWrt将树莓派打造成一台便携无线路由器","url":"/posts/RPi-Router/","content":"呐，眼看就要过年，本喵决定将去年失败的树莓派路由器计划重新提上日程，因为本喵过完年之后总要去姥爷家里住几天，他家里有网络，但是却没有路由器，而每天开着电脑插着随身WiFi实在太不环保。去年受到垃圾网卡坑害没有成功，幸好本喵朋友今年推荐了一个pi上使用超稳定的网卡，决定一不做二不休，干脆用OpenWrt和一直在吃灰的一代Pi B+，组成一个易于配置和使用的路由器。来吧，带着你聪明的头脑和灵巧的双手，还有你的树莓派，我们来Happy Wi-Fi！\n介绍下OpenWrt，它是一个针对路由器的Linux发行版，具有功能灵活强大，美观易于配置等特点，许多智能路由的固件也是基于OpenWrt修改，比如小米路由器，极路由。\n工欲善其事，必先利其器，首先我们来准备下必要设备：\n\nRaspberry Pi一个（理论各版本均可，但考虑到USB无线网卡，Pi Zero可能有些不方便，另外我示范中用的Pi B+，2B步骤相同，不过由于架构不同，下载的文件有区别。）。\n\n装有Linux的电脑一台，当然你也要能熟练运用Linux（别他喵的说你他喵玩Pi玩的是他喵的Win10 IOT，他喵的你看我他喵打这么多他喵就知道那货他喵的是微软他喵的糊弄人的东西！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！）。\n\nMicroSD卡一张（用做OpenWrt的TF卡不需要太大容量，毕竟img本身只有76M，但是玩Pi的都知道要选择一张大品牌高速的卡保证兼容性和性能，我一直用三星的卡觉得很好，根据大家评价闪迪的比较常用。）。\n\n一台已经能正常使用的家用路由器，用于Pi的网线和电源（电源尽量选择5V 2A的，这样可以保证电流足够）。\n\n一张无线网卡（他喵的不要上了一些商家的当买那个他喵的EDUP的树莓派专用网卡！ 根本就是噱头！这货 根本不是树莓派专用，只是能够被Linux直接驱动起来的一个，一些商家就骗新手说是树莓派专用。如果你用这货开AP就等着5秒钟必挂吧！ 尽量先试验你手头的所有无线网卡，确定都不可以之后再购买！Pi的配件也都是玩家们自己试出来的。我用的是朋友推荐的网件Netgear WNA1100无线网卡，不但稳定还比EDUP便宜。有需要的朋友可以私信或评论要购买地址。）\n\n\n好啦，接下来介绍下正式过程：\n\n下载并刷入镜像；\n\nOptional：调整分区大小；\n\n\n连接电脑进行初次必要调试；\n\n连接路由器进行主要调试；\n\n建立AP并调节WiFi；\n\n分离广域网WAN接口和局域网LAN；\n\n连接ADSL开始工作！\n\n已知小问题及解决办法。\n\n\n\n下面正式开始：\n下载并刷入镜像\n首先，我们要去OpenWrt的官网获取官方编译好的img镜像。下面有两个子目录，pi1对应的是bcm2708，pi2对应的是bcm2709，点击进入之后点击 openwrt-15.05.1-brcm2708-bcm2708-sdcard-vfat-ext4.img 即可开始下载，pi2对应的只是把2708全部换成了2709。\nPS 请务必选择带有sdcard-vfat-ext4的镜像。\nPPS 由于国内网络的特殊性，可能导致下载奇慢，可以复制下载地址之后利用百度云的离线下载。\n\n下载到本地之后呢，我们要用读卡器把MicroSD卡连接上电脑，用 lsblk -f 查看一下SD卡的设备名，一般是/dev/sdb，如果你的系统自动挂载了SD卡，请务必用umount卸载。\n\n随后我们要用dd命令把img文件烧录进SD卡！命令如下：\n# dd if=/你的/img文件/存放的/路径/openwrt-15.05-brcm2708-bcm2708-sdcard-vfat-ext4.img of=/dev/sd你的设备路径 conv=fsync\n\n记住要用root用户或者sudo来执行才能具有权限！Pi2用户记得把2708换成2709！\nPS 不要在意下图中有一个bs=2M的参数，那个是可选的！\nPPS 好久之前B+用OpenWrt不能启动的bug在15.05里已经修复啦！如果你还遇到接电源后红绿灯都长亮不灭不能启动的话，可以试试重新刷写一次镜像，一般都会有效。\n\n完事以后多执行几次sync是个好习惯：\n# sync\n\n下面可以把卡拔下来插到Pi里面啦！当然如果你想调整分区（可选）请往下看——\n调节分区\n为什么要调节分区呢？相信我，用一下\n# fdisk -l /dev/sdb\n\n你就明白了。。。\n\n😂这磔磔磔磔这这。。。这开发者是喝着冰啤酒吃着火锅唱着歌做的img吗？（别看我！我写东西时候从来不吃东西不唱歌！！！别看我！！！真的没有……）这这这分区位置都是什么鬼！！！根本都不整齐强迫症不能忍！！！还有这么大点的根分区虽然绝对够用了但是怎么能体现本喵是用2GB存储卡的有钱人（手动斜眼滑稽）呢？\n好了扯淡结束，调节分区大小的方法很多种，最简单的是用gparted图形化界面调整。但是我在这里用了笨方法，即fdisk+tar。实际上会这个的人一定也会用gparted（“胡扯，你就没用过！”“嘘……我用Gentoo不想编译。”）。\n首先我们要把读卡器接上电脑，之后把其中的文件备份出来，调整好分区大小后在放回去。\n首先挂载boot分区并进入～\n# mount /dev/sdb1 /mnt &amp;&amp; cd /mnt\n\n开始用tar备份～注意后面的几个参数，它们可以保证所有文件的属性不变之类的，我会告诉你我朋友把系统从hdd搬到ssd也用的这个命令？\n# tar -cpvzf ~/opboot.tar.gz ./\n\n之后回到家目录并卸载这个分区：\n# cd ~ &amp;&amp; umount /mnt\n\n接着root分区也是一样：\n# mount /dev/sdb2 /mnt &amp;&amp; cd /mnt\n# tar -cpvzf ~/oproot.tar.gz ./\n# cd ~ &amp;&amp; umount /mnt\n\n\n接下来就可以用fdisk了，这里我给boot分区分100M，root分区分768M（openwrt的软件都很小的，默认的分区大小就够用了。），剩下1G单独划分一个分区留着备用。\n# fdisk /dev/sdb\n\n首先按o新建一个分区表，之后按n新建分区，分区类型p，分区号1，起始位置默认，结束位置输入+100M回车，之后按t，c，将分区类型修改为FAT。\n再按n新建分区，分区类型p，分区号2，起始位置默认，结束位置输入+768M回车.\n最后再按n，一路回车默认即可。\n之后按a，选择1，将boot分区的可启动标志打开。\n按w退出并写入更改。\n\n接下来我们用mkfs格式化分区～这里boot分区必须是vfat格式，root分区必须是ext4格式，第三个分区可以随意，但我也格式化成ext4。\n# mkfs.vfat /dev/sdb1\n# mkfs.ext4 /dev/sdb2\n# mkfs.ext4 /dev/sdb3\n\n接下来自然是把备份的文件放回去：\n# mount /dev/sdb1 /mnt &amp;&amp; cd /mnt\n\n这次用tar -x：\n# tar -xpvzf ~/opboot.tar.gz ./\n# cd ~ &amp;&amp; umount /mnt\n# mount /dev/sdb2 /mnt &amp;&amp; cd /mnt\n# tar -cpvzf ~/oproot.tar.gz ./\n# cd ~ &amp;&amp; umount /mnt\n\n\n连接电脑进行初次必要调试\n先别急着把你的pi插到路由器上，op默认pi的ip是192.168.1.1，要知道大部分家里的路由器的ip也是这个，所以我们先把它用网线接到电脑上，开机后修改下ip。\n\n关掉你的无线连接，给pi连上电源，打开浏览器输入192.168.1.1回车，你会看到luci登陆界面，点击Login登入。\n接着按照屏幕上指示，我们去设置路由器登陆的密码，点击Go to password configuration\n\n进入密码设置页面，在password里输入两次密码，滚动到最下端点击Save and apply。\n接下来去调节接口的ip，因为一会要通过这个接口上网，同时也要设置下DNS和网关。在顶栏点击Network——Interface，点击页面中LAN后面的Edit。\n在进入的页面中设置IP，设为你路由器网段下的一个没有被占用的ip即可，我设置为 192.168.1.234 ，之后下面的netmask选择 255.255.255.0 ，gateway输入路由器地址 192.168.1.1 ，DNS也输入 192.168.1.1 。\n\n好啦，现在树莓派基本的设置已经完成了，接下来可以关机接到路由器上了。什么？你说OpenWrt没有关机？好吧没办法，因为我也不知道怎么办，我用OpenWrt一直都是拔电源，没什么问题。\n连接路由器进行主要调试\n现在我们把pi拿出来～无线网卡插到pi上，pi插到网线上，网线插到路由器上，电源线插到pi上，开机！\n\n稍等一会绿灯熄灭，这时候通过家庭局域网应该能连接上Pi了，同样，打开浏览器 192.168.1.234 （按照你刚才设置的ip来），输入密码点击Login。\n是不是觉得满屏英文很不爽呢？没关系，我们先来安装中文语言。切换到System——Softwave，点击该页面的 Update list ，当然你也可以 ssh root@192.168.1.234 ，登入之后执行 opkg update ，效果是一样的，这个命令就等价于Linux里的 apt-get update ， pacman -Syy ， emerge --sync ，opkg就是openwrt的包管理。当然我比较偏好ssh，因为可以即时看到命令反馈，而luci基于网页，命令执行过程会表现为刷新，会像卡住一样。\n\n执行完了之后会输出信息 。\n\n接下来在Filter里面输入chinese，点击Find package，稍等一会点击下面的Available packages，就能看到所有包名含有chinese的包啦，我们要安装的是 luci-i18n-base-zh-cn 和 luci-i18n-firewall-zh-cn ，点击名字左侧Install，弹出框里点确定稍等即可。\n\n\n现在我们切换到System——System里，点击Language and style选项卡里面的Language，看看里面是不是有一个普通话的选项了？选中之后点击Save and apply，还没有变成中文就Logout一下看看！\n等进去以后我们再进入系统——系统里，第一个选项卡基本设置，把里面的时区改为Asia/Shanghai，再点击上面的同步浏览器时间，最后在主机名里给你的pi设置一个独特的名字！\n\n下面开始安装一些必要的软件包！据我统计有 kmod-usb2 、 kmod-usb-ohci 、 kmod-usb-ohci 、 kmod-ath9k-common 、 kmod-ath9k-htc （ath9k这两个包是我的网卡对应的驱动，你的网卡需要什么驱动要根据你的芯片来定！我真的不知道你用的什么网卡！）、 hostapd 。什么？你问我怎么安？过滤器在那！都是中文难道还看不懂吗？自己搜索一下！\n当然我更喜欢ssh一条命令解决：\n# opkg install kmod-usb2 kmod-usb-ohci kmod-usb-ohci kmod-ath9k-common kmod-ath9k-htc hostapd\n\n建立AP并调节WiFi\n安装完成之后我们来开启wifi！首先这个必须要ssh连接上去了，电脑就是\n$ ssh root@你的pi的ip地址\n\n手机可以用juicessh，良心软件。\n登陆进你的pi后执行\n /etc/config/wireless\n\" class=\"code-block\"># wifi detect &gt; /etc/config/wireless\n\n建立wifi配置文件。\n接着还没完 ，\n需要用vi编辑这个文件，不然wifi默认是关闭的（不会用vi/vim的同学悲剧了。。。很简单进去之后按i才可以开始编辑，编辑完按[Esc]再输入:wq即可保存，另外反正我是Emacser～别打我！）。\n# vi /etc/config/wireless\n\n注释掉option disabled 1的那一行（注释的意思就是在那一行开头输入个‘#’！你要会用vim直接把光标定位到那里，按dd把那行删了也行！）。\n\n现在系统——重启——执行重启，之后LuCI的网络里应该能看到无线了。点击修改来编辑一下。\n首先要注意wifi信道不能设置为auto，这是个bug。\n\n下面的ESSID就是你的WiFi显示的名字，自己设定好。之后去无线安全，加密选择WPA-PSK/WPA2-PSK Mixed Mode，密码自然是你的密码咯～\n\n接着就能搜索并连接到wifi了～\n\n分离WAN口和LAN口。\n现在Wi-Fi和有线网卡都在LAN这个网段下，要做便携路由器自然要有个WAN口，首先你要通过Wi-Fi连接，再登陆LuCI，先去到网络——接口，点击添加新接口，接口名称输入wan，协议选择pppoe，之后再去修改LAN，把IP和WAN错开，比如我设置为192.168.234.234，再把网关和DNS都清空（因为接下来pi就是网关了喵～）之后在物理设置里取消勾选eth0，再把桥接也取消，保存！\n连接ADSL开始工作\n把Pi和ADSL Modem连接，开机，即可作为无线路由器使用！\n已知问题和注意事项\n\n调节完成后dropbear（轻量的ssh服务器端）不能开机自启动，需要在系统——管理权里保存应用一下。\n\nwifi信道不能设置为auto。\n\nWAN口ip和LAN口ip最好不要在一个网段下。\n\n2016-02-08:新bug！WiFi地区代码如果不是默认的00--World的话，可能导致无线网卡挂掉！我改成CN之后挂了2333～另dropbear的bug似乎一代二代都有。\n\n\n搬运自我的Lofter，转载请注明出处。\n原文写于2016-02-06_21:10:25\n"},{"title":"动态？静态？","url":"/posts/Dynamic-or-Static/","content":"本来hexo静态博客用的好好的，结果在静好的鼓动下又想试试动态站，选择困难又犯了……\n静态站相比动态站的优点就是资源消耗小（就是几个html也不用cpu运算啊）所以可以挂到pages上去，省了vps的开销，并且文件都是Markdown的文本文件，自从用了Gentoo我就更喜欢文本文件的管理方式了，对数据库没什么好感，在本地用Emacs写也很棒。而且我不会用PHP，所以还不如静态站简单粗暴来得好一点。\n但是静态站是不能交互的，这导致的最大的缺点就是没有自己的评论系统一类的。虽然Disqus做的很好但是国情需要啊喂，还有就是现在它默认变成了引导用户注册！考虑了一下受众我还是放弃了……多说比较接地气，但是它的服务质量始终不能让人放心……GitHub上有一个comment(it)，把评论直接作为commit推上去，不过目前仅支持jekyll……其他的动态服务比如不蒜子数据统计还是很可靠，搜索页有现成的Local Search让它变成静态的，所以最不靠谱的还是多说？\n如果换成动态站的话首先是模板的问题，hexo的NexT主题的动画实在是很精致，但整个主题有点太简洁了，其实并不符合我的预期。虽然typecho有一个足以以假乱真的移植版，但是还是有些细节不一样，一旦找到合适的新主题也许我会切换过去，但是这样就要放弃Markdown文本文件……同样的还要租vps……我是个穷人……\n但显然动态站可以更好地支持自建评论系统，不过为了这么一个特性见过去是否有点得不偿失？\n目前为止hexo都可以很好的满足需求，如果有了新的需求我想我会换成动态站？不过最好的办法也许是自己造轮子？把静态部分和动态部分分开？这样就可以保持hexo目前的特性？\n"},{"title":"批量改名——Hrit.py","url":"/posts/Hrit/","content":"此方案已经被作者废弃且由于时间久远，记录的事物可能已经改变，作者不能保证此时页面内容完全正确，请不要完全参考。起因\n记得以前读过一篇文章，大意说是懒人推动了社会进步，觉得言之有理。你想，要不是因为原始人懒得天天找吃的，怎么会出现培养出的农作物？要不是人们懒得自己搬庄稼走路，怎么会驯化马？要不是人们懒得自己养马，怎么会出现汽车？\n好了还是不要瞎扯了，总而言之对于我这么一个懒+强迫症晚期+半吊子程序员（？），当然在写网站的时候得把网站组织的有条理，所以肯定不能把所有的文章里的图片都堆到images/目录里就得了，幸好hexo提供了所谓的资源文件夹的方式，在新建Markdown文件的时候会自动建立同名的资源文件夹，只需编辑站点配置文件_config.yml开启如下项即可。\npost_asset_folder: true    #开启资源文件夹\n\nOK!这时候我天真的觉得只要把图片按数字命名为1.jpg、2.png之类的丢到对应资源文件夹里即可！然而生活远没有这么美好……首先在资源文件夹里的图片如果想在文章和首页的摘要里都显示的话就不能简单的用Markdown引用图片的语法，必须要用hexo的asset_img标签。\n![图片名称](图片名称)\n\n我开始方了，难道要我自己一个个手动打成这个标签……\n还没完，如果你的访客想下载一些图片，如果恰好你不同资源文件夹里都有一个1.jpg，他下载这两个的时候就会都保存为1.jpg……那不就乱套了么……\n所以我想要是能一次性给某个文件夹下的文件改名为 文件夹名_数字.扩展名 并且还能自动输出成hexo标签该多好啊……本着Linux用户没有轮子自己造的精神我决定写个程序解决这个问题（Windows用户应该习惯于找别的东西解决吧……没有就自认倒霉一个一个手动改？想想就麻烦……）\n行动\n于是乎高三党为了珍惜劳动节唯一一天假期（喵的一天也叫假期！！！）果断决定写代码，开始想想这个简单工作适合shell script但是我不会写shell脚本也不会正则表达式……（观众：你说你一个不用Win只用Linux的人不会shell脚本和正则？！我：我真不会……别打我……）那似乎我会的剩下就是C和Python了……你叫我这么一个C语言水平已经退化到HelloWorld的家伙拿C写个程序处理字符串和文件？好吧刚才的观众们你们麻烦往死里打……所以只剩下Python比较熟练了。最后也是这么做的。\n成果\n那这样就轮到今天的主角登场了——hrit！\n为什么叫这个名字呢？因为它是Hexo Rename Images Tool！当然使用了os、time和argprase的它其实能给所有文件命名……（hrit：人家只是个不到100行代码的小脚本……我：嘘……观众：他在那！！！）\n所以先贴代码：\n#!/usr/bin/env python3\n#-*- coding:utf-8 -*-\n\n### Filename:hrit.py\n## Created by Alynx Zhou\n# alynxzhou@gmail.com, http://alynx.xyz/\n\nimport os\nimport time\nimport argparse\n\n### Deal with the argument.\nparser = argparse.ArgumentParser(description=\"hrit -- Hexo Rename Images Tool.\")\nparser.add_argument(\"-f\",\"--forehead\",action=\"store\",type=str,help=\"The string will be added to the begin of the file name.Default is the directory name(dir).\")\nparser.add_argument(\"-m\",\"--middle\",action=\"store\",default='_',type=str,help=\"This will be put between the head and the tail.Default '_'\")\nparser.add_argument(\"-n\",\"--number\",action=\"store_true\",help=\"If this argument is set,the file name between the head and the last dot will be set as an increasing number.\")\n#parser.add_argument(\"dir\",action=\"store\",nargs='?',default=\"./\",type=str,help=\"The directory to work.\")\nparser.add_argument(\"dir\",action=\"store\",type=str,help=\"The directory to work.\")\nargs = parser.parse_args()\n\n### Remember the original path.\nopath = os.getcwd()\n\n### Change directory.\nprint(\"Entering directory %s …\"%(args.dir))\ntry:\n    os.chdir(args.dir)\nexcept FileNotFoundError:\n    print(\"ERROR!Can't find directory %s !\"%(args.dir))\n    print(\"Quiting…\")\n    exit()\ncurdir = os.getcwd()\n\n### Ask.\nprint(\"Now it is going to work in \")\nprint(\"=====================================================\")\nprint(\"%s\"%(curdir))\nprint(\"=====================================================\")\nprint(\"Please check weither it is the exact directory you want!\")\nprint(\"Work in other directories can be dangerous and hard to fix(For instance,/,/home,/usr,etc.)!\")\nanswer = input(\"Continue?[y/N] \")\nif answer != 'y' and answer != \"yes\":\n    print(\"Quiting…\")\n    os.chdir(opath)\n    exit()\n\nprint(\"Wating 5 seconds to regret…\")\nilist = [\"5…\",\"5 4…\",\"5 4 3…\",\"5 4 3 2…\",\"5 4 3 2 1…\"]\nfor i in ilist:\n    print(\"%s\\r\"%(i),end=\"\")\n    time.sleep(1)\nprint(\"5 4 3 2 1…Start!\\n\")\n\n### Get dir.\nif args.forehead == None:\n    forehead = curdir.split(os.sep)[-1]\nelse:\n    forehead = args.forehead\n\n### List files.\nfilelist = os.listdir(curdir)\nprint(\"Found files:%s.\\n\"%(filelist))\n\n### Rename.\nif args.number == True:\n    ## Number name.\n    number = 1\n    for file in filelist:\n        filel = file.split('.')\n        if len(filel) == 1:\n            ## Without extand name.\n            newname = forehead + args.middle + str(number)\n        else:\n            ## With extand name.\n            newname = forehead + args.middle + str(number) + '.' + filel[-1]\n\n        os.renames(file,newname)\n        print(\"Renamed %s to %s.\"%(file,newname))\n        number = number + 1\nelse:\n    for file in filelist:\n        newname = forehead + args.middle + file\n\n        os.renames(file,newname)\n        print(\"Renamed %s to %s.\"%(file,newname))\n\n### Get new file list.\nnewlist = os.listdir(curdir)\nprint(\"\\nNow you can copy the follow hexo tags to your markdown post.\\n\")\nfor new in newlist:\n    print(\"{%% asset_img %s %s %%}\\n\"%(new,new))\n\n### Go back to original path.\nos.chdir(opath)\n\n好了亲爱的观众们我知道你们又要抱怨你们的Vim/Emacs设置了代码自动缩进粘贴Python很麻烦……（你说你用Sublime Text或者Notepad++？好吧自便。你说你用记事本？这我就不能忍了，哪凉快哪呆着去！→_→）我就大发慈悲把源文件传上来吧，右键点击这里另存为即可。然后拷贝到你的PATH中任意一个目录。\n接下来说用法～什么用法？直接执行hrit -h不就有用法了吗？\n总而言之hrit会以一个文件夹为单位把里面所有的文件按照指定的规则重命名，所以最后必须接一个文件夹参数比如./test/，没有设置默认./的原因是为了安全～hrit将文件名分为五部分操作，前缀、连接符、后缀、英文句点和扩展名。然后如果指定了 -f 前缀 的话文件都会被添加上同一前缀，没有-f则默认以当前目录名为前缀。 * -m 连接符* 指定连接符，默认是“_”。最后hrit会把原本的文件名（包括句点和扩展名）一起接上作为后缀。如果开启了 -n 它会用从1开始递增的数字作为后缀，并连接上句点和原本的扩展名（如果你非要把文件命名为aaa.bb.c那hrit只会把.c连接上……）。\n下面示范一下，进入我饱经摧残的test/目录。\n$ cd test/ &amp;&amp; ls -alh\ntotal 8.0K\ndrwxr-xr-x 2 shax shax 4.0K May  2 21:58 .\ndrwxr-xr-x 3 shax shax 4.0K May  2 11:44 ..\n-rw-r--r-- 1 shax shax    0 May  2 21:58 aaa\n-rw-r--r-- 1 shax shax    0 May  2 21:58 bb.b\n-rw-r--r-- 1 shax shax    0 May  2 21:58 c.c.c\n\n下面执行下\n$ hrit ./\nEntering directory ./ …\nNow it is going to work in\n=====================================================\n/home/shax/ProgramPractice/hrit/test\n=====================================================\nPlease check weither it is the exact directory you want!\nWork in other directories can be dangerous and hard to fix(For instance,/,/home,/usr,etc.)!\nContinue?[y/N] y\nWating 5 seconds to regret…\n5 4 3 2 1…Start!\n\nFound files:['aaa', 'c.c.c', 'bb.b'].\n\nRenamed aaa to test_aaa.\nRenamed c.c.c to test_c.c.c.\nRenamed bb.b to test_bb.b.\n\nNow you can copy the follow hexo tags to your markdown post.\n\n![test_c.c.c](test_c.c.c)\n\n![test_bb.b](test_bb.b)\n\n![test_aaa](test_aaa)\n\n为了防止搞错了目录设置了一个确认和5秒反悔时间。\n下面试试 -f\n$ hrit -f xxx ./\nEntering directory ./ …\nNow it is going to work in\n=====================================================\n/home/shax/ProgramPractice/hrit/test\n=====================================================\nPlease check weither it is the exact directory you want!\nWork in other directories can be dangerous and hard to fix(For instance,/,/home,/usr,etc.)!\nContinue?[y/N] y\nWating 5 seconds to regret…\n5 4 3 2 1…Start!\n\nFound files:['test_c.c.c', 'test_bb.b', 'test_aaa'].\n\nRenamed test_c.c.c to xxx_test_c.c.c.\nRenamed test_bb.b to xxx_test_bb.b.\nRenamed test_aaa to xxx_test_aaa.\n\nNow you can copy the follow hexo tags to your markdown post.\n\n![xxx_test_c.c.c](xxx_test_c.c.c)\n\n![xxx_test_aaa](xxx_test_aaa)\n\n![xxx_test_bb.b](xxx_test_bb.b)\n\n最后 -n\n$ hrit -n ./\nEntering directory ./ …\nNow it is going to work in\n=====================================================\n/home/shax/ProgramPractice/hrit/test\n=====================================================\nPlease check weither it is the exact directory you want!\nWork in other directories can be dangerous and hard to fix(For instance,/,/home,/usr,etc.)!\nContinue?[y/N] y\nWating 5 seconds to regret…\n5 4 3 2 1…Start!\n\nFound files:['xxx_test_c.c.c', 'xxx_test_aaa', 'xxx_test_bb.b'].\n\nRenamed xxx_test_c.c.c to test_1.c.\nRenamed xxx_test_aaa to test_2.\nRenamed xxx_test_bb.b to test_3.b.\n\nNow you can copy the follow hexo tags to your markdown post.\n\n![test_2](test_2)\n\n![test_1.c](test_1.c)\n\n![test_3.b](test_3.b)\n\n不错吧，这样以后直接把所有图片拷贝到资源文件夹里用hrit -n ./xxxx/即可批量命名了～然后直接把输出的标签拷贝到Markdown文件～\n最后说一个小插曲，开始我设置了询问继续和五秒倒计时的时候其实并不觉得有什么用……直到某次调试时不小心在home下执行了hrit……幸好有5秒按Ctrl+C，顿时觉得自己真是太机智了。\n"},{"title":"Three Trees","url":"/posts/Three-Trees/","content":"\n拍摄于 2016 年 4 月 2 日，三棵开放的树自左而右展现出红、绿、白三种不同的颜色。\n使用 Moto X Style 拍摄。\n\n\n"},{"title":"角落里的那棵树","url":"/posts/Corner-Tree/","content":"\n如果不是因为角落里的那棵树又开了花，我也许不会意识到春天来了，而只任凭它悄悄从屋外溜过。\n那是一棵不知名的树。虽然是树，却并不比周围的灌木显眼几分，甚至直到它所有的花苞绽放时，人们的目光也只会被那两棵仍未开放的玉兰夺走。\n所以我一直怀疑，除了我以外，是不是只有它一个人孤芳自赏。但即使如此也不能让它辜负时光，这是它的春天，但不属于我。\n\n所谓杏花春雨，雨确实是第一场春雨，但它是不是杏花却无人知晓。这场春雨把它的花瓣种到了它周围的每一片土地上－－不要担心，留在树上的更多一些。\n雨停了，天是蓝色的，极好极好的阳光又落在它身上，风一吹似乎能听见花朵歌唱的声音。似乎它没有花香，但对于我这么一个从来就不能欣赏花香的鼻子，这或许更是一种怜悯。\n\n树，也会有前世今生吗？我固执地想。也许你的前世是一棵胡杨？它一如沉默。偏偏我总是认为沉默的人都是因为天机不可泄露，所以我想，答案是肯定的。\n那么它的前世就一定是一棵胡杨，对，就是那种生长在沙漠中一千年不死，死后一千年不倒，倒后一千年不朽的“神树”。那这些花瓣就是它的眼泪了？我想。孤单而耀眼地走完了三千年执着守候的前世，今生才甘心做一株角落里的小树，好让自己有足够的时间，把前世的眼泪一片片地流光。\n\n我无数次地想象自己在树下，风一吹过，漫天的花瓣飘落。喂，你等了前世，又等了今生，等的又是什么呢？\n它不说，但我看到了它的倔强，无论是前世三千年的生命，还是今生。即使每片花只有三秒在风中飞舞，它也要让自己在有限的时光里尽情的灿烂。\n\n夜晚的风吹来慵懒的凉意，如果有机会，我一定要坐在那里静静地想，从黄昏到天明，把天上的云朵化成繁星。或许冥冥之中自有定数，让每一个执着等待的人都成为了一棵树，这样才能一直等下去，好让等到的那一天恢复成青春年华，相守共度？又或许因为每对相互等待的人都变成了两颗相互守望的数，无法动身相见，所以才有了这世上的遍地繁荫？那么树，你所等待的树又在哪里呢？\n我不知道当年是怎样两个人怀着相思种下了这一堆树，但我痴痴地相信，假使我见到另一棵树，应该和它一样，亭亭如盖了。\n\n写于2016年4月1日。\n"},{"title":"Title_Nil_1","url":"/posts/Title-Nil-1/","content":"\nSay to me.\nWhy are you so tired?\nWhy are you so lonely?\nNo,No.\nThere's no need to say.\nWhat I need to konw is that you are really tired,really longly,really.\nYou said you wanna love,to be love.\nBut no one cares you every time every thing.\nWho cares you?Who cares?\nHowever,whenever I see your eyes,deep dark.\nI see,you mean you understand.\nYou mean you believe.\nYou mean you konw no one would love a silly man.\nYou mean it's true that no one loves a person who lives by computer,phone,harmonica.\nYou mean it's true that no one konws what you need.\nThey have already got and sent what you want from or to other one.\nYou consider them as everyting while they consider you as nothing.\nThe world is so hard,it makes you hard to find it.\nIt was hidden under the dirt,was hidden on the cloud,was hidden behind one's back,was hidden in one's heart.\nYou can feel the deeply bad of the world.\nThough your heart believe the future,your body say it can't wait.\nYour body can wait while your heart can't.\nHuman being is strange,you can't look through them via scanf,#define.\nSo many stories,some times they are pleasant,but most not.\nStories start,stories stop.\nEndless stories.\nIt seems that you can only tell the words to yourself,and your chair.\nYou wanna cry,but no tears.\nLet it out,let it go.\nI have the arms you want.\nWhy no snow comes after the cloud?\nWhy no death comes after the pain?\nWhy no love comes after the significant care?\nI konw you want to ask,being sorry for my poor head.\nYou have nothing but you want everything.\nTo the whole world,you maybe one person.\nBut to whom,you are the whole world?\nYou said you want it simple,for human beings are so complex.\nBut you can't.\nDon't cry.\nTo you,to me.\nTo yourself,to myself.\nYou are myself,I'm yourself.\nYou can get it one day,maybe.\n2016-01-10\n转载自我的LOFTER\n"},{"title":"半音阶口琴杂谈（三）","url":"/posts/CHarmonica-Talk-3/","content":"好啦，琴也买了也试了，该谈谈五线谱了。\n别一提蝌蚪就头疼，半音阶吹简谱比认线谱还难，这里直接引用我在贴吧的回复：\n\n\n半音阶是固定调乐器，和钢琴类似。简谱用的首调唱名，如果你按简谱吹半音阶遇到不是C调的曲子，只有两种办法，一个是分别练各常用调的音阶，很麻烦，而且每练一种就相当于新学一遍口琴，互相之间没帮助不说，还容易让你弄乱吹吸顺序。。。完全不适合半音阶，要不就把谱子转为C调，方便一点，不过需要一定乐理知识，搞不好会乱 ，我倒是自己做了个转调卡方便转换。而五线谱是首调，不同的调子也就是C调音升升降降，你读出来的音就是半音阶和钢琴上的音，一一对应，吹起来容易的多，而且半音阶经常吹古典乐曲，那些都是小提琴五线谱。所以学点乐理和五线谱还是有好处的，不然你找个C调的简谱吹吹，坑死人啊。。。五线谱就难在一开始读的很慢，需要大量练习（这个我也不行。。。），所以一开始学半音阶口琴就尽量接触五线谱，简谱基本是为以后提高设障碍。但是像十孔这种有不同调子的乐器和简谱一样用的是首调，用简谱可能比线谱还舒服，不过国外还是线谱用的多。\n\n还不明白？举个例子，宋冬野的《斑马，斑马》，是G调简谱，你用半音阶标准把位是不能直接上的，因为那是C调的，你吹的do频率是C，la频率是A（口琴一般440-447Hz内，大部分443或444），而简谱是首调唱名，本例中do频率是G，所以不行，除非你再练一个G调的吹法，那十二个调就得十二种把位，加上口琴有吹吸半音阶有推键很麻烦，搞不好会乱套，所以不适合。或者你把G调转换成C调（我就这么办），不过需要一定乐理知识和计算能力……\n那线谱就不一样了，它采用首调唱名，你读出来的就是半音阶上要吹的音，一招鲜吃遍天。\n所以学线谱有好处，虽然开始慢但是慢慢当成能力去提升，不必着急。\n口琴还有BD谱，不过不推荐常用，它像吉他六线谱，只记录奏法没有音高，而且人家六线谱可以记录时值，BD谱不但不行而且不一样的口琴孔数不同都不通用……所以需要时拿它记一两个奏法（就像弦乐器里的指法符号）得了，别当正式谱用。\n搬运自我的LOFTER\n"},{"title":"半音阶口琴杂谈（二）","url":"/posts/CHarmonica-Talk-2/","content":"唉懒真是没办法，这都隔好几天了。\n接着说吧，给新手的建议。你肯定得知道买什么琴去哪买吧。有同学会说了，我家边上小学对面有个琴行！好的在你出门之前把下面这句话念十遍。\n不要在琴行买口琴！\n\n（当然此句针对大陆，你说你住香港台湾日本德国出门就是谷口通利神马的自动忽视。）\n记住了吗？因为口琴在大部分琴行还只属于玩具，我们这一要口琴出来的都是敦煌小蜜蜂（东方乐器的业余和儿童用口琴），**半音阶只有天鹅1040-6，偏偏天鹅大家公认膜片超好其他超烂，而十孔的半音阶1040没膜片！！！**所以还是求助万能的淘宝吧。\n新手的话SUZUKI的SCX-64当然第一选择，可以培养正确的气息，换句话就是你能随心驾驭SCX-64就能差不多驾驭别的琴，最起码不会把别的琴吹坏，但是反之如果一开始吹粗旷的琴换成细腻型的肯定不适应。价格1110左右，实在不行就买SCX-48，800多应该就OK。但是不管你以后喜欢几孔的口琴，准备一把16孔的肯定错不了 。\n当然肯定有同学说一上来就这么贵的我接受不了啊。那千元以内的进口琴还有三款HOHNER的，270D大概900？270的升级版，圆孔交错式，据说是用螺丝固定？不过270D和270这种木格琴大家打死也不会让你拆就是了，木头磨着磨着就没了 ，我同学买了270，700多感觉不错，虽然HOHNER的做工没有SUZUKI好，但也很精致了，如果说SCX声音是甜美型，270的声音就是沧桑型，有点沙哑尖刻，估计硬汉会喜欢。500左右有D48，除了吹嘴是塑料的其他都不错，螺丝别上太紧。\n有人说这个价位还买不起？那我送你一个字攒……便宜点还能接受的国产琴就是东方的梦想者，国产里面最好的一把琴了大概，400以内，除了 推键不太顺需要油声音发尖低音fa不好吹 以外还可以，不像其他国产琴培养你毁琴气息，新手阶段你的问题绝对比这把琴的问题多，不用顾虑。再便宜就何来257，除了没吹嘴，大概200～300。\n之后是去哪买的问题，买梦想者就去东方乐器专营店，孔总人很好，东方售后也让你没有后顾之忧，毕竟厂家直销。接着其他琴就是海盗（小海盗de口琴舰队）鱼哥（鱼哥口琴店）二选一（似乎贴吧里还推荐一家叫玛纳？）但是鱼哥那主要卖铃木的，海盗比较全一点，如果两家都有实在不知道买哪家的就挑近的买（两家差价基本可以忽略），鱼哥在长沙海盗在大连（东方在江苏）。都是贴吧里口碑店，最好不要海淘或者去不知名的店，因为售后什么的可能没有。\n好了今天就说这么多，有人问为什么不推荐千元以上的琴，因为演奏级的琴不一定好控制，新手需要的是基本功，等你玩到一定程度觉得琴不适合你了，肯定会换琴的，那时候再说也不迟。\n搬运自我的LOFTER\n"},{"title":"半音阶口琴杂谈（一）","url":"/posts/CHarmonica-Talk-1/","content":"当然是随便谈谈自学半音阶口琴的体会，不对的欢迎指正。\n首先拿过来一把琴当然要试试有没有质量问题咯，先从中音（口琴上的中音是其他乐器的高音，就是5 6 7 8孔）C调#C调吹吸吹吸吹吸吸吹试一遍就是do，re，mi，fa，sol，la，si ，do，气流大小按照吹口哨再大一点，之后倍低音（如果有），这两个比较好吹。高音（9 10 11 12）需要你把气流加快，不然反而易啸叫（但啸叫不太可能是琴的毛病），至少我的SCX-64是，而SCX据说可以养成正确的气息。低音区（1 2 3 4）比较难搞，某些琴新手刚拿过来低音re，fa几乎是不响的，这时候放缓气流扩大口腔捏住鼻子一般都能响，不过以后不要捏鼻子，慢慢会好的。一些国产琴这个问题可能比较严重，先忍着，等你后期有动手能力了调大Gap会好一点（新手不许拆琴！！！否则等于撕钞票！！！）。等有资金了还是买把进口琴，一般会好很多，但半音阶的低音还是对气息要求很高，练习时多注意就好了。\n然后是练习，这个一定不能少，虽然它不能决定一切，但练习时间够了你自然会感觉有提高。鱼哥说练习应该是大块时间的，但我的经历是学习太紧，只能利用下课十分钟吹。而且我觉得口琴的优势就是小，方便随时练习。秘诀是练习时找好侧重点，比如吸气断音，不要没有目的瞎吹，还不如不练，然后心无旁骛，才会保证练习高质量，这也是大触的意思。另外要养成看五线谱和背谱的习惯，好处下次再说。\nPS 哪位朋友推荐下好用的电脑排五线谱的软件，我最近看许多吉他谱应该都是一个软件排的，很整齐，不知道有没有五线谱的，方便自己整理分享。另外我通常在Linux下，所以最好支持Linux，实在没有一个需要的库比较少的win程序也行，我试试wine。谢谢了。\n搬运自我的LOFTER\n"},{"title":"Words That I Couldn't Say","url":"/posts/Words-Say-1/","content":"2015.01.01\nPlay \n又是新的一年呢。\n本来打算昨天弄这些，但是各种原因的不想动。\n那就今天吧，把这一年经过想说的一些精挑细选出来。\nPlay \n无故头疼，不舒服。\nIBus搞什么，乱七八糟。\n本来由于身体不舒服加上不愿意就决定不去漫展的，最后还是去了。\n人比想象的要多许多，去了之后才发现还有另一个不愿意去的理由——舍不得花钱，本来打算留着钱买树莓派的，但看见了好多喜欢的东西，还是要买。\n以上废话。\n买回来的东西全是黑执事有关的，异常的喜欢夏尔。\n一半因为本来就喜欢黑执事，另一半是因为突然理解了喜欢夏尔的理由。\n外表越坚强，就越是为了掩饰内心的脆弱。\n以前不明白。\nPlay \n即使所有人都背叛了，还有执事君不会背叛。\n可是却不是所有人都有执事君呢。\n一次又一次的Ctrl+C终止音乐，然后去换成另一首。\nPlay \n为什么。\n想看下雪，把一切都掩盖掉。\n全部化为静谧。\n可是却没有雪。\n肩膀又痛，不过不管它。\n没有雪，而且连星空都没有。\n手指敲打键盘，如同音符在琴键上跳动，习惯。\nPlay \n平安夜那天，我看着许许多多的人路过，各种各样的。\n眼睛只能看到别人，却不能看到自己。\n我站在那里等，但直到所有人走开，不得不离去，也没有等到一个主动和我说Merry Christmas的人。\n所以只能一遍一遍对自己重复。\n记得么，曾经总是读错Christmas，从来没有记过它该怎么Spell。\n但想说时它却自己正确的蹦了出来，是圣子显灵还是自动补全？\n在Shell里可以一直下去，但当我在生活里迷茫的时候，我下意识的去按却没有按到。\n生活不是zsh，连bash都不是。\n残缺的事情，残缺的灵魂永远都不能自动补全呢。\nMerry Christmas.\n他说他的名字是Merry。\nMerry，Merry.\n“你要告诉我什么事？”\n“那天，你走之后的事。”\n“吉尔伽美什为了你第一次违逆了他的父亲，他父亲从来不许外人到他家吃饭。”\n“吉尔伽美什为了你拔光了他家花园的花，他从格兰仕那里要来种子后就疯狂地种了整整一园的矢车菊，只是为了送你一盆纽约最好的花。”\n“吉尔伽美什每次到Merry只坐你坐的那个位子，只喝伏特加。”\n“吉尔伽美什经常盯着银头发的人看个不停，”\n“吉尔伽美什从那次之后就开始涉足政治，他越来越铁石心肠，越来越让人琢磨不透。”\n“你以为他为什么会变成这样？你以为他为你所做的一切都是理所当然吗？”\n“你为什么要糟蹋他的感情？”\n“他是爱你的啊，漆拉。”\n“他深爱着着你啊……”\nWords That We Couldn't Say.\n矢车菊的花语，遇见幸福。\n可是你真的只能让人遇见幸福么？\n花盆下的设计图，设计图下的照片，照片背后的那句话。\n没有弹孔，没有鲜血。\nPlay \n既然从开始就知道会有这样的结局，那也一定要继续下去。\n既然以笑得最幸福的方式开始，那么即使以哭得最悲伤的方式结束也要继续下去吧。\n我累了。\n在那一刻。\n就算再不愿意，我也绝不允许你用那种口气来对我说话。\n还有，我的事情有我自己的打算，我的决定有我自己的审美。\n所以你最好不要发表意见。\nKeep sclient.\nPlay \n总有一天会回头再看见这些东西，只有那时才能发现它们有多可笑。\n有时候，想象就该是想象，变成现实就失去了那份美好。\nPlay \n意思是说，成熟就是能明确在什么情况下该做什么事并且敢去做？\n抱歉，我一直都想，但一直都做不到，那种无力感。\n我累了，需要休息。\n我相信等我做到，还会再来一次的，没有失败。但不是现在。\n我有我的想法，行动。我可以忍受别人惹怒我但不能一次又一次的忍受别人打破我的底线但还装成自己是受害者一样。我不允许别人质疑否认背叛放弃，再也不会允许。\n所以2015，愿一切安好。\n搬运自我的LOFTER\n"},{"title":"Arch Linux安装手札","url":"/posts/Arch-Install/","content":"由于时间久远，记录的事物可能已经改变，作者不能保证此时页面内容完全正确，请不要完全参考。一入Arch深似海，不挂全需人品高～家里添了台联想昭阳E49,奔腾2020M,2G内存。早就想写一篇安装手札来做LOFTER的开篇了～我没那么多脑洞……代码还是有的……\nArch的安装出了名的难，没安过三次不要说你会Arch，但安装完你会对Linux有更好理解，如同打通任督二脉～我这次是第四次成功了～感谢好朋友Maxfan的帮助～另外LOFTER真的很不错～   \n下面正文开始～   \n到Arch的下载页面下载最新的镜像，Windows下用Win32diskmanager写入U盘，Linux下用   \n# dd if=~/archlinux-2014.07.03.iso of=/dev/sdb\n\n写入U盘。   \n开机按选择U盘引导， Boot Arch Linux(x86_64) ，root自动登录。可以手机看Arch Wiki新手指南。~/有一份英文的install.txt，可以在tty2打开看。   \n首先   \n# iw dev\n\n记下无线接口名。本例为 wlp2s0    \n# wifi-menu wlp2s0\n\n选择无线网，两次ok，键入密码连接。   \n# ping -c 3 www.baidu.com\n\n确定是否已联网。   \n# cfdisk\n\n听说高手都用fdisk分区，我习惯cfdisk，反正不从头分，在末尾的空闲分区划分70G/dev/sda3作为/，3G/dev/sda4swap，都是主分区。由于Arch用pacstrap安装基本系统，所以单/分区也能保留/home重装～只要删掉其他目录即可。千万不要乱按Bootable！给我惹了好大麻烦……   \n# partprobe\n\n让内核重新读取分区表。   \n# mkfs.brtfs /dev/sda3\n# mkswap /dev/sda4\n# swapon /dev/sda4\n\n根目录用btrfs，由于btrfs不能用交换文件，所以分交换分区并启用。   \n# mount /dev/sda3 /mnt\n\n挂载到/mnt。   \n# nano /etc/pacman.d/mirrorlist\n\n安装前需要编辑 /etc/pacman.d/mirrorlist , mirrorlist文件也会被pacstrap复制到新系统。到镜像列表生成器生成中国源列表添加到前面。   \n# pacman -Syy\n\n更新pacman数据。   \n# pacstrap -i /mnt base base-devel\n\n安装基本系统到/mnt，sudo什么的都在base-devel里。   \n> /mnt/etc/fstab\n# nano /mnt/etc/fstab\n\" data-info=\"language-bash\" data-lang=\"bash\" class=\"code-block\"># genfstab -p -U /mnt &gt;&gt; /mnt/etc/fstab\n# nano /mnt/etc/fstab\n\n生成fstab并检查一下。   \n# arch-chroot /mnt /bin/bash\n\nchroot到新系统的bash shell，初步认为arch-chroot的特点是可以运行systemd。   \n# nano /etc/locale.gen\n\n编辑本地化标准，去掉en_US.UTF-8和zh_CN.UTF-8前的#。执行   \n# locale-gen\n\n应用更改。   \n /etc/locale.conf\n\" data-info=\"language-bash\" data-lang=\"bash\" class=\"code-block\"># echo LANG=en_US.UTF-8 &gt; /etc/locale.conf\n\n设置LANG变量，在此设置中文会使tty乱码。   \n# ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime\n\n设置时区，这里设为中国上海(UTC+8:00)。   \n# hwclock --systohc --utc\n\n设置硬件时间为UTC，稍后再把Windows改为UTC。   \n /etc/hostname\n\" data-info=\"language-bash\" data-lang=\"bash\" class=\"code-block\"># echo ShaX-Laptop &gt; /etc/hostname\n\n设置主机名为ShaX-Laptop。   \n# nano /etc/hosts\n\n127.0.0.1一行最后按键入ShaX-Laptop。   \n# pacman -S iw wpa_supplicant dialog\n\n为新系统安装联网所需组件，第一次虚拟机安装时忘了配置网络，结果一pacman -S就满屏错误……   \n# pacman -S ntfs-3g vim zsh\n\n安装必需软件，ntfs-3g可以让Linux读取NTFS。   \n# passwd\n\n设置root密码。   \n# pacman -S grub\n\n安装GRUB。为了能用Windows引导GRUB，选择安装到PBR。   \n# chattr -i /boot/grub/i386-pc/core.img\n# grub-install --target=i386-pc --recheck --debug --force /dev/sda3\n# chattr +i /boot/grub/i386-pc/core.img\n# grub-mkconfig -o /boot/grub/grub.cfg\n\n为了防止由于硬盘文件移动导致找不到GRUB核心文件，给它添加i(不可动)标记。建立GRUB配置文件。   \n# mount /dev/sda1 /mnt\n\n挂载C盘到/mnt。   \n# mkdir /mnt/NST\n# dd if=/dev/sda3 of=/mnt/NST/Linux.mbr bs=446 count=1\n\n将前446字节的loader写到C:\\NST\\Linux.mbr。   \n# umount /mnt\n# exit\n\n退出chroot。   \n# umount /mnt\n# reboot\n\n不要忘了拔出U盘，进入Windows。   \n打开regedit，定位到HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\TimeZoneInformation\\，新建DWORD值RealTimeIsUniversal，键值设为1。以应用UTC。   \n下载安装EasyBCD软件，添加启动项→GNU/Linux→选GRUB2，名称添Arch Linux，添加。然后去C:\\NST\\把生成的另一个文件名复制，删掉，把Linux.mbr重命名为那个，因为EasyBCD默认有bug不能正确识别，所以我们手动替换即可。   \n重启按进入BIOS，硬件时钟倒设8小时为UTC。   \n选择Arch Linux进入GRUB引导。   \n先用root登录，wifi-menu连接网络，创建用户shax并添加密码。   \n# useradd -m shax\n# passwd shax\n\n参数-m的作用是自动在/home下建立以用户名为名的主文件夹。然后   \n# visudo\n\n修改可以提权的用户，光标定位到root ALL=(ALL) ALL一行，按i键进入编辑模式，将该行修改为root ALL=(ALL) NOPASSWD: ALL，以关闭密码保护，在这一行下面添加shax ALL=(ALL) NOPASSWD: ALL，给shax开放权限。按键退出编辑模式，输入:wq回车以保存并退出。   \n# logout\n\n以shax登录。执行   \n$ sudo pacman -S xf86-video-intel xorg-server xorg-server-utils xorg-utils xorg-xinit alsa-utils xf86-input-synaptics\n\n安装显声卡触摸板驱动和X接口。   \n$ sudo pacman -S acpi\n\n安装高级电源管理支持(?)。   \n$ sudo pacman -S gnome gdm wqy-microhei\n\n安装GNOME3桌面环境和它对应的登录管理器GDM以及好看的中文字体文泉驿微米黑。   \n$ cp /etc/skel/.xinitrc ~/\n\n复制一份X样板文件到主目录，不要加sudo，否则所有者会变成root。   \n$ nano ~/.xinitrc\n\n去掉exec gnome-session前的#。   \n$ sudo systemctl enable gdm\n\n开机自动启动登录管理器。   \n$ startx\n\n启动X会话。   \n在Settings→Language&amp;Location里全部修改为汉语&amp;中国。包括右上角的Login。   \n右上角点击用户名选logout重新登录。   \n登录后打开终端，输入   \n$ sudo pacman -S ibus-libpinyin\n\n安装ibus-libpinyin中文输入法，之后去设置里添加即可。   \n$ sudo nano /etc/pacman.conf\n\n添加如下以安装yaourt。   \n[archlinuxcn]\n#The Chinese Arch Linux communities packages.\nSigLevel = Optional TrustAll\nServer = http://repo.archlinuxcn.org/$arch\n\n$ sudo pacman -Syu yaourt\n\n可以自动安装AUR工具yaourt。   \n再次感谢好友Maxfan。   \n欢迎关注Arch Linux官网   \n中文官网   \n中文wiki   \n2014-07-28 17:00   \nAlynx Zhou   \nA Coder &amp; Dreamer   \n搬运于我的LOFTER   \n"},{"title":"你好，世界。","url":"/posts/Hello-My-World/","content":"So， 喵's StackHarbor 就算是正式开站了，当然在部署过程中有很多有趣的事情值得我专门写一篇日志来记录一下，不过在Coder的世界里面\"Every thing is based on Hello World\"，所以还是以后再说那个。   \n\nint main(void) {\n    printf(&quot;Hello World!\\n&quot;);\n    return 0;\n}\n\" data-info=\"language-c\" data-lang=\"c\" class=\"code-block\">#include &lt;stdio.h&gt;\nint main(void) {\n    printf(\"Hello World!\\n\");\n    return 0;\n}\n\n说起建网站的想法还要追溯到中考刚刚结束的时候，好朋友 Hackghost 跟我说他要建立一个自己的网站用来写博客。当然当时的我什么都不知道，不过好歹或多或少参与了他网站的建设。再后来自己开始用Linux，对于建站自然也是略知一二。不过对于一个高中生而言租用域名和VPS的钱也不是很轻易就能负担的起的。直到今年的愚人节那天Google到GitHub Page服务可以用来托管静态网站，于是抑制不住的在GoDaddy上租用了一年期的 sxshax.xyz 这个域名（现在换成了三年期的alynx.xyz），折腾了一天把这个小站打造成了还比较满意的样子。   \n#!/usr/bin/env python3\n#-*- coding: utf-8 -*-\n\nprint(\"Hello World!\")\n\n但是就算你读到这里，朋友，你一定还是一直有一个疑问：“这个网站究竟是用来做什么的呢？”   \n简而言之，这是一个名叫 Alynx Zhou 的人利用 alynx.xyz 这个域名及hexo和GitHub Page还有Spacemacs、Gentoo GNU/Linux建立的一个名叫 喵's StackHarbor 的网站，他在这里用他还很生疏的Markdown，记录下他生活中每天的迷茫与感慨、愉悦与忧伤。   \n我知道你要问：“为什么要叫做这么一个拗口的名字呢？”   \n如果非要深究，大约有三点原因：  \n\n我在网易云音乐上的口琴电台叫做 喵's Harmonica 。\n\nStack意为堆栈，计算机术语。\n\nHarbor意为港湾。\n\n\n总是有人说有了社交圈就够了，没有必要自己建一个Blog用来写东西，但对我来说。QQ贴吧微博或多或少都是说给别人看的，但网站是属于自己的，我可以记录我自己的想法，喜不喜欢则是你的自由。   \n所以说，这个名字的寓意，无非是即使一个行走在漫漫星海边缘的小人物，也可以在互联网上拥有属于自己的一片避风港。   \nSo my friend, where's your harbor?   \n"}]}