About

Blog

如你所见,如我所想。

Me

Microtaku -> ~(>_<~)

Yuujin

以下为各位线上/线下认识的小伙伴们的真·无序排列:

Posts Tagged “ Linux ”

通过字体文件给 Arch Linux 安装字体

适用情况:

  • 搬运 Windows 那边的字体到 Arch Linux
  • 安装从网上下载的字体文件
  • 其它需要手动安装字体文件的情况

Arch 的字体目录为/usr/share/fonts,安装字体时建议在这里建立单独的文件夹来存放手动安装的字体(比如这里建立了一个winfont文件夹)

sudo mkdir /usr/share/fonts/winfont

将你要安装的字体文件复制到/usr/share/fonts下你建立的文件夹中

sudo cp -r /directory-to-your-font /usr/share/fonts/winfont

(注意这些字体文件的访问权限,至少要普通用户可读才行,否则就用chmod修改一下文件权限)

然后执行

sudo mkfontscale
sudo mkfontdir
sudo fc-cache -fsv

这样就安装完成了。

在 Arch 中安装和使用 virtualenv

刚刚换到 Arch,发现不少东西操作都有点变化。想当然已经解决不了问题了x_x,遂将其记下来。

安装

在Arch仓库里面有俩个virtualenv,根据需要安装即可。

# pacman -S python2-virtualenv

或者

# pacman -S python-virtualenv

前者对应的是python2,后者python3。命令行命令分别是virtualenv2virtualenv

使用

首先为virtualenv创建一个目录:

$ mkdir -p ~/.virtualenvs/my_env

创建虚拟环境

$ virtualenv2 ~/.virtualenvs/my_env

激活环境以供使用(就这步和关闭虚拟环境跟windows下面不一样,让我撞墙好久)

$ source ~/.virtualenvs/my_env/bin/activate

之后你就可以在虚拟环境里面用pip安装你需要的包,以及干各种事情啦。

最后是离开虚拟环境

(my_env)$ deactivate

参考

Arch Wiki:Python VirtualEnv

解决 KDE 应用菜单不显示 wine 程序组的问题

  • KDE版本:4.10.5
  • wine版本:1.7.0

刚用wine装了几个程序,发现K应用菜单里面没有wine程序的这个分类,wine程序全部跑到 Lost + Found 这分组去了。上网搜索一番,没找到问题原因的描述,就找到下面的解决方法,似乎是因为wine没有修改到KDE使用的造成的?

ln -s ~/.config/menus/applications-merged ~/.config/menus/kde-applications-merged

记一次修复 Arch Linux 引导

今天折腾着给移动硬盘装系统,结果进了几下PE把自己本本的引导玩坏了,搞了半天回忆了一下安装系统的过程,终于把系统给重新正常启动了,万分激动啊!


我的本本只有一个 ArchLinux 在上面,硬盘属于混合硬盘,Linux下面会被识别成一个500GB的/sda和20GB的/sdb,前面一个盘有/home,/var两个目录,和swap分区;根目录被我直接放在固态硬盘的/sdb了。

现在问题是引导挂掉了,也就是说GRUB都不能启动了,开机直接黑 >_<

解决步骤

  • 用写过ArchLinux镜像的U盘启动,进入64位的Live系统(我的系统是64位的)
  • 挂载本本上的分区,一定要先挂载根目录

    mount /dev/sdb1 /mnt
    mount /dev/sda3 /mnt/home
    mount /dev/sda2 /mnt/var
    
  • 把根目录切换到本本上的根目录

    arch-chroot /mnt
    
  • 接下来就是grub的操作了,直接安装grub即可。一定要安装到/sda,也就是硬盘前面的那个分区,安装到/sdb里面的引导程序不会被BIOS识别出来,混合硬盘在BIOS里面只被识别为一个硬盘,并不是像在系统里面看到一样是两个,尽管实际上是两个,个人猜想应该是因为硬盘与主板连接的时候只占了一个插槽的原因吧。

    grub-install --target=i386-pc --recheck /dev/sda
    grub-mkconfig -o /boot/grub/grub.cfg
    
  • 至此,引导程序修复完成,回到正常根目录,卸载所有分区,重启就好咯~

    exit
    umount -R /mnt
    reboot
    

个人结论

混合硬盘的 MBR 应该安装在 BIOS 认识的分区上面。

Linux 下通过 cue 分轨到 flac

最近遇到分轨的问题,一个巨大的文件跟着一个cue个人觉得还是不方便,网上查了一下最后翻到了Archwiki上面找到了比较完整的解决办法,把分轨和标签填充一并搞定了,另外顺便把封面嵌入也一起解决。

预备工具

我是直接把wiki里面提到的工具都给安装了,这里给个列表,直接用pacman安装即可。

  • shntool (用于分割音频文件)
  • bchunk (iso/bin文件支持)
  • mac (APE编解码器)
  • flac (flac编码器)
  • wavpack (wav支持)
  • lame (MP3编码器)
  • mp3info (MP3 ID3 1.x标签支持)
  • vorbis-tools (Ogg的额外工具)
  • cuetools (cue,toc 文件解析)

开始分轨

接下来通过cue文件进行分轨,这里是我平常用的方法

shnsplit -f file.cue -o flac -t "%n %t" file.wav 

-f 选项指定用来作为分轨依据的 cue 文件
-o 选项可以指定输出文件格式,这里用的是 flac
-t 用来自定义输出文件的文件名,用一个字符串作为参数,%n 表示轨道编号,%t 表示轨道标题,%a 为专辑名,%p 为表演者。
最后一个参数是被用来分轨的音频文件

执行之后会在当前目录生成分轨后的文件。

标签/封面

使用cuetag一键完成,它会自动根据cue里面的轨道信息和分轨后的文件的名字自动填标签。

cuetag.sh file.cue *.flac

关于添加封面,这里直接使用了ubuntu论坛上找到的现成的脚本,用封面文件作为参数运行脚本之后它会自动把图片嵌入当前目录和子目录的flac文件中。

#!/bin/bash
#
# This script embeds a given image (usually .jpg) as album art in the
# FLAC files in the present directory (and its subdirectories).
#
# Time-stamp: <2011-07-31 20:43:23 (lennart)>

coverart=$1

find . -name "*.flac" -print0 |xargs -0 metaflac --import-picture-from="$coverart" 

至此,一切就搞定啦!

博客诞生记 : 基于 GitHub + Pelican 创建博客的整个过程

很早以前就想搭建一个独立博客,一点点的记录生活与学习,说到底,还不是因为托管博客的限制颇多,编辑体验太差 +_+
本文记录了我建立博客的基本过程,希望能对想要建博客却跟我一样完全不懂web的小白有所帮助。

阅读本文所需技能:

  • 脑补精通 Lv1:脑补基础
  • 举一反三 Lv1:举一反三分之一
  • 英文掌握 Lv2:字母精通
  • Linux掌握 Lv1:会开终端

在谋划阶段,看了不少关于建博的路子,最后图简单我选择了用Pelican在GitHub上搭建博客的路子。

整个过程所在平台:Chakra Linux,Pelican版本:3.2.0


过程概要

  1. Github上创建工程
  2. 安装配置pelican和git,以及准备工作
  3. 开始写博客

详细步骤

在GitHub上创建工程

如果你还没有GitHub账户,去注册一个~

登录GitHub,点击页面顶部的显示你用户名位置右边的创建新工程 (Create a new repo) 按钮,来到创建新工程页面

建立一个名为xxx.github.com的工程,这里我用的是frantic1048,我已经创建好了,所以提示已存在。

填写好工程名后,点击下方的创建工程(Create repository)按钮。

接下来进入项目的设置页面,在GitHub Pages这栏(我因为已经创建过页面了所以有提示"Your site is published at ......"),点击Automatic Page Generator,接下来几步一路continue就可以了,因为生成的页面在随后会被清空。

这步完成之后,通过http://xxx.github.com/或者http://xxx.github.io/就可以访问生成的页面了,如果你遇到404错误,别着急,第一次生成完大概十来分钟才能看到页面,这个时候先来看下一步吧。

安装配置pelican和git,以及准备工作

pelican的安装:根据pelican官方的推荐,我使用pip安装,而pip的安装又依赖distribute,整合3方的安装指南,我使用的终端命令如下:

curl -O http://python-distribute.org/distribute_setup.py
sudo python distribute_setup.py

curl -O https://raw.github.com/pypa/pip/master/contrib/get-pip.py
sudo python get-pip.py

sudo pip install pelican 

git的安装:因为git本身在软件源中,直接用Chakra的软件包管理器pacman安装即可:

sudo pacman -S git

配置git:参考了GitHub的配置指南,设置好用户名和邮箱(这里的邮箱用的是你注册GitHub的那个邮箱)

git config --global user.name "Your Name Here"
git config --global user.email "your_email@example.com"
git config --global push.default simple

安装ssh公钥:用你在注册github时用的Email生成一个ssh公钥私钥对:

ssh-keygen -t rsa -C "your_email@example.com"

Enter passphrase (empty for no passphrase): 输入你在github注册时使用的密码

Enter same passphrase again: 再输一次

然后会看到公钥和私钥分别被保存为id_rsaid_rsa.pub,后者正是我们需要的。打开github网页,在账户设置(Account settings)中找到SSH keys项目,点击添加SSH key(Add SSH key),把idrsa.pub中的内容复制到网页中的key里面。现在回到终端测试一下

ssh -T git@github.com

The authenticity of host 'github.com (204.232.175.90)' can't be established.

RSA key fingerprint is 16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48.

Are you sure you want to continue connecting (yes/no)?

Hi username! You've successfully authenticated, but GitHub does not provide shell access.

看到这个内容的时候,就说明成功了,git配置至此完毕。

现在在你的电脑上创建一个blog目录,用来存放你的博客文件(我这里目录名直接用的“blog”)

mkdir blog
cd blog

用pelican创建一个博客,按照提示一步一步进行,之后还可以在pelicanconf.py这个文件中修改配置

pelican-quickstart

Where do you want to create your new web site? [.](你想在哪里创建你的网站,默认为当前目录)

What will be the title of this web site?(网站的标题是)

Who will be the author of this web site?(网站的作者是)

What will be the default language of this web site? [en](网站的语言是),当然是中文啦,填‘zh’

Do you want to specify a URL prefix? e.g., http://example.com (Y/n) (是否指定域名),Y

What is your URL prefix? (see above example; no trailing slash) (输入域名,不能包含反斜杠‘/’),http://frantic1048.github.io

Do you want to enable article pagination?(是否启用文章分页)

Do you want to generate a Makefile to easily manage your website?(是否生成一个Makefile来管理网站)

Do you want an auto-reload & simpleHTTP script to assist with theme and site development?(是否想有一个自动加载的小型http脚本用来修改主题和站点开发)

Do you want to upload your website using FTP?

Do you want to upload your website using SSH?

Do you want to upload your website using Dropbox?

Do you want to upload your website using S3?

这个时候你会看到blog目录下多了几个Pelican生成的文件,其中的pelicanconf.py就是配置文件

把你的项目clone到blog这个文件夹下面,并进入这个目录,这里我的项目文件夹为“frantic1048.github.com”

cd blog
git clone https://github.com/frantic1048/frantic1048.github.com
cd frantic1048.github.com

清空项目文件(因为之前使用Automatic Page Generator创建出来了一堆不需要的东西):

git rm -rf .  
git checkout --orphan gh-pages

开始写博客

现在,就可以用Pelican开始写博客了,具体怎么写可参看Pelican的文档,这里我用Markdown举例。

进入content目录,用编辑器创建一个文件,写入博客内容并保存为md文件:

Date: 2013-06-06 #日期

Title: My Super Beginng #标题

Tags: Writing, Life #标签

Category: Life #分类

文章内容

写好之后,回到blog目录,将md文件翻译成html静态页面:

cd blog  
make html  

[ ! -d /home/frantic/blog/output ] || find /home/frantic/blog/output -mindepth 1 -delete

pelican /home/frantic/blog/content -o /home/frantic/blog/output -s /home/frantic/blog/pelicanconf.py

Done: Processed 1 articles and 0 pages in 0.32 seconds.

你还可以用这条命令编译:

pelican content

注意,如果你在这里遇到类似下面这样的错误信息,请检查一下你是否安装了markdown(我就是因为这个奇葩的错误提示闹腾了一个多小时),至于为什么这个提示的原因可能会是没安装markdown,参看这里的吐槽

WARNING: Could not process /home/frantic/blog/content/First.md

'bool' object is not callable

现在把生成的页面复制到xxx.github.com目录下,接下来就是上传啦!

进入xxx.github.com目录,提交文章到github:

cd ~/blog/frantic1048.github.com  
git add .
git commit -m "first blog"
git push

过一会儿之后,再访问xxx.github.com,就能够看到你的博客诞生了!

如果你有域名的话,还可以进行域名绑定,在github的项目根目录下创建一个名为“CNAME”的文件,在里面写入你的域名(比如我写的是frantic1048.com),然后push到github,之后进入你的域名服务商那边去,把你的域名对应的ip改成username.github.com对因的ip即可(比如我就填写的frantic1048.github.com对应的ip)接下来就可以用你的域名来访问你的博客了,有的域名服务器可能要过段时间才可以,我的是1分钟不到就能够访问了

后续:

更改主题

Pelican本身提供了不少主题,同时也支持自己制作主题,你可以直接把github上pelican的主题全都clone下来

git clone git://github.com/getpelican/pelican-themes.git

在里面找到一个你喜欢的主题,假如这个主题的目录是 ~/pelican-themes/bootstrap2 ,使用pelican-themes安装这个主题

sudo pelican-themes -i  ~/pelican-themes/bootstrap2

随后就可以用pelican-themes查看已安装的主题

pelican-themes --list --verbose

/usr/lib/python2.7/site-packages/pelican/themes/bootstrap2

/usr/lib/python2.7/site-packages/pelican/themes/notmyidea

/usr/lib/python2.7/site-packages/pelican/themes/simple

要在你的博客中使用安装好的主题,直接在pelicanconf.py文件中修改或者添加THEME项为想要的主题名,例如

THEME = "bootstrap2"

然后执行

make html

重新生成的页面现在使用的就是新指定的主题了

使用插件

Pelican 一开始是将插件内置的, 但是新版本 Pelican将插件隔离了出来, 所以我们要到github上 克隆一份新的插件, 在博客目录执行

git clone git://github.com/getpelican/pelican-plugins.git 

现在我们博客目录就新添了一个 pelican-plugins目录, 我们以配置sitemap插件为例,sitemap插件可以生成 sitemap.xml 供搜索引擎使用

在pelicanconf.py配置文件里加上如下项:

PLUGIN_PATH = u"pelican-plugins"

PLUGINS = ["sitemap"]

配置sitemap 插件

SITEMAP = { "format": "xml", "priorities": { "articles": 0.7, "indexes": 0.5, "pages": 0.3, }, "changefreqs": { "articles": "monthly", "indexes": "daily", "pages": "monthly", }}

然后再执行

make html

就搞定了

添加评论支持

Pelican 使用Disqus评论, 可以在Disqus上申请一个站点, 然后在pelicanconf.py里添加或修改"DISQUS_SITENAME"项的内容为你的Disqus ID :

DISQUS_SITENAME = u"frantic1048"

然后执行

make html

拷贝静态文件

如果我们定义静态的文件, 该如何将它在每次生成的时候拷贝到 output 目录呢, 我们以robots.txt 为例, 在我们的 content/extra 下面我们放了一个定义好的 robots.txt文件, 在pelicanconf.py更改或添加FILES_TO_COPY项:

FILES_TO_COPY = ( ("extra/robots.txt", "robots.txt"),)

这样在每次生成html的时候都会把 content/extra下的 robots.txt 拷贝到 output目录下。

拷贝静态目录

如果是一个静态目录呢?比如有个名为img的目录用来放文章所使用的图片,我们可以在pelicanconf.py里添加或修改STATIC_PATHS项:

STATIC_PATHS = [u"img"]

然后执行

make html

然后 Pelican 就会将img目录拷贝到output/static/下就大功告成了。

启用 Kate 的 Pate 插件

想着用这么久 Kate 写东西,还是不能百分百的满意,毕竟有些功能还是没有,比如 JSLintPEP8 什么的,遂顺手一搜,发现原来 Kate 早就有这些功能的插件了,只是一直没发现,在 Kate 的设置窗口里面的 Application 类别下的 Plugins 里面有个不起眼的 Pyhon Plugins,这就是开启新世界的大门,不料勾上之后却发现了这样的提示。

pate engine could not be initialized
Cannot load kate module

继续在网上搜索了一下,告知用命令行直接启动 Kate 可以看到一些缺失包造成的 import error。发现是这俩个包找不到

  • jedi
  • PyKDE4

jedi一下子就搞定了,然后发现根本找不到 PyKDE4 ,在 Arch 论坛上发现这货改名字了,换成了 kdebindings 开头的包,随后 Pacman -Ss 了一下找出了这货。

pacman -S python-jedi kdebindings-python

这下就没有之前的那些错误了,设置里面也出现了新的功能,新世界探索中……

解决 zip 文件名乱码的小脚本

Linux 下 zip 文件名乱码的问题想必路人皆知,zip 就是事儿多ˊ_>ˋ

一个解压 zip 的小脚本,如果遇到非 gbk 的其他奇葩编码自行改变 codeType 的值尝试即可(:з」∠)

用法:unzip-gbk.py xxx.zip

代码修改自九原笔记,改成了解压到子文件夹。

#!/usr/bin/env python2

# -*- coding: utf-8 -*-

# unzip-gbk.py


import os
import sys
import zipfile

codeType = 'gbk'

print(u'开始提取:' + sys.argv[1])
with zipfile.ZipFile(sys.argv[1], 'r') as file:
  folderName = sys.argv[1].rsplit('.', 1)[0]
  for name in file.namelist():
      utf8Name = os.path.join(folderName, name.decode(codeType))
      pathName = os.path.dirname(utf8Name)
      print(u'正在提取: ' + utf8Name)
      if not os.path.exists(pathName) and pathName != '':
          os.makedirs(pathName)
      data = file.read(name)
      if not os.path.exists(utf8Name):
          with open(utf8Name, 'w') as fo:
            fo.write(data)

解决 rhc 无法创建连接

最近 rhc 忽然连接不上了,提示这样的错误:

A secure connection could not be established to the server (SSL_connect returned=1 errno=0 state=SSLv3 read server hello A: sslv3 alert handshake failure).
You may disable secure connections to your server with the -k (or --insecure) option
'https://openshift.redhat.com/broker/rest/api'.

翻到 Redhat 上一个文章搞定了,是因为最近的 SSLv3 漏洞的原因禁用了 SSLv3,换一个非 SSLv3 的连接协议就好啦~

打开 ~/.openshift/express.conf ,在里面添加以下行即可,我这里是已经有这行只是加了注释,我将其修改成了下面的内容。

ssl_version=tlsv1

再次运行 rhc, 连接成功╮( ̄▽ ̄)╭

Arch Linux 简易打包指南

这两天给 Kreogist µ 打 Arch Linux 包,照着 wiki 跟着搞,同时在肥猫和 Wicast C 及暴君还有 jimmy66 等强力大腿及小伙伴的支持下,几番折腾终于打好了,也算是入了个门。

搞完过来发现也算简单,总体来说其实就是一个 PKGBUILD 文件的编写。就着给 µ 打的这个包写个简单指南。在写的时候实在太不知道怎么写的地方还可以直接参考一下其他软件包的 PKGBUILD 是怎么写的我才不会说呢。

编写 PKGBUILD

在最开头,复制一份原型: /usr/share/pacman/PKGBUILD.proto(同目录下也有其他特别类型的原型),之后就从这个文件开始编写啦。

先读完文件开头那段注释,然后删掉它~

Maintainer

最开头一行注释是维护者的信息,按照它提供的格式填写上有效的信息即可。

pkgname

软件包的名字。只能用 小写字母、数字和@ . _ + - 这些字符,且不允许用.或者-作开头。

另外不要和 AUR 甚至是官方仓库里面的软件包重名了(´・ω・`)

pkgver

软件包的版本,就是你打包的那个软件的版本。可以使用数字和小数点,以及其它字符。进一步的规则可参考:VCS package guidelines - ArchWiki

pkgrel

软件包发行号,一般设为 1,如果你因为某些原因给同版本号的软件进行反复打包,那么每次打包的时候 pkgrel 就应该在原基础上递增一个数字,而在打包新的版本的时候,应该重新设为 1。

epoch

强行干涉包的新旧关系,拥有更大的 epoch 值的包会被认做更新的包(此时无视版本号),可以用在如版本号风格改变等需要的时候。默认值为 0,取值为正整数。一般不会用到。

pkgdesc

软件包的描述信息,最好一句话,且不包含软件的名字。

arch

表示支持的 Arch Linux 的架构,比如 i686x86_64,如果包与平台无关的话就填 any

url

与软件包相关的链接,一般是项目首页什么的。

license

软件发布协议,如果是常见的 GPL 的话可以对照下面填写:

  • (L)GPL - (L)GPLv2 及更新版本。
  • (L)GPL2 - 仅 (L)GPL2
  • (L)GPL3 - (L)GPL3 及更新版本

depends

这是非常重要的一项,需要正确填写上软件的依赖。

对于直接发布可执行程序的话,可以通过 ldd 来看程序连接了哪些库文件,结合搜索判断出具体依赖是什么软件包。你可以用谷歌在 https://www.archlinux.org 上搜索具体库的文件名,一般都能够找到对应的软件包。

如果你已经用 makepkg 打出了 .tar.xz 的包,也可以用 Namcap 来检查依赖是否存在问题,它会提供一些有用的信息帮助修正依赖。对于他的输出含义可以直接参考 ArchWiki

多测试多测试,确保依赖真的没问题。

source

构建软件包需要的文件。可以是一个本地文件,也可以是一个远程文件。 makepkg 会在构建包的时候自动下载填写的远程文件,并且会自动解包压缩文件。

md5sums

对应的 source 里面文件的 md5 校验码。

package()

在构架包的时候执行的函数。你需要把安装软件对应的操作写在这里。函数会在一个 fakeroot 环境下执行,对应的 root 目录就是 $pkgdir,比如你有一个可执行文件名为 $pkgname 要安装到 /usr/bin 下面,对应的命令就可以类似这么写:

install -m=775 $pkgname "${pkgdir}/usr/bin"

-m 选项表示目标文件的权限,和 chmod 参数同理。

常用目录

目录 | 用途
----|--
/etc | 系统关键配置文件,如果件有多个,应该创建合适的子目录来存放
/usr/bin | 二进制文件
/usr/lib | 库
/usr/include | 头文件
/usr/lib/{pkg} | 模块,插件等
/usr/share/doc/{pkg} | 应用程序文档
/usr/share/info | GNU Info 系统文件
/usr/share/man | 手册
/usr/share/{pkg} | 程序数据
/var/lib/{pkg} | 应用持久数据
/etc/{pkg} | {pkg}的配置文件
/opt/{pkg} | 大的独立程序,例如 Java
/usr/share/applications/ | Desktop Entry (.desktop) 文件
/usr/share/icons/ | 图标,存在该目录下对应子目录位置

不该碰的目录:

  • /dev
  • /home
  • /srv
  • /media
  • /mnt
  • /proc
  • /root
  • /selinux
  • /sys
  • /tmp
  • /var/tmp

构建/调试包

在 PKGBUILD 所在目录下执行 makepkg 可以构建出对应的软件包,推荐用 namcap 检测一下构建出来的包有没有更显著的问题。

然后你可以用 pacman -U 命令安装它,看看会不会发生什么奇怪的事情,以及软件是否正常等。

当然还有可能因为 PKGBUILD 没写好,直接就报错不干了,这个时候需要顺着错误信息去修正 PKGBUILD。

发布到 AUR

在 PKGBUILD 所在目录执行 makepkg --source,会生成 .src.tar.gz 源码包,这就是需要上传到 AUR 的东西,注意不要把任何二进制文件加入源码包。

AUR (Arch User Repository) 注册(登入)帐号。进入 Submit 页面,选择好软件包对应的分类,然后添加源码包上传即可。

即使你是要更新一个包,也只需要直接在 Submit 页面上传,包的信息 AUR 会自己处理。

如果觉得每次上传太麻烦,你可以尝试一下 aurupload 来简化发布。

参考文档/维基

需要更详尽的内容以及更复杂的打包请参考以下。

在 Umbrello 的序列图中添加参与者

这几天用 Umbrello 画作业,在画序列图(Sequence diagram)的时候发现工具栏上竟然没有添加参与者(Actor)的按钮。

我感到很是困惑,因为之前画用例图(Use Case diagram)的时候是有的,序列图也是包含参与者这种单位的,然而工具栏却看不到它的身影。先搜索一番还看到有人把这个报成 bug,难道就因为这种小事换工具?脑中浮现隔壁用 Photoshop 画 UML 的家伙的嘲讽。一番摸索后发现了另一种添加参与者的方法:

  1. Tree View 里面,右键戳里面的 Use Case View,选择 New > Actor

  2. 这时 Use Case View 下面会出现一个新的的 Actor,双击它编辑好必要的信息。

  3. 打开要添加 Actor 的的序列图,在 Tree View 里面直接把那个 Actor 托放进编辑区,成了 (。・ω・)ノ

接下来就可以愉快地继续做作业了。

解决 ssh 密码正确却被拒绝连接

服务器( Arch Linux 系统)好久没滚过了,今天上去飞速滚完之后登出。再次 ssh 登录的时候,密码正确,却不断提示 Permission Denied,当时就奇怪了。明明刚刚还能上 (´_`)。

在 Super User 上看到了情形基本一致的问题的解答,遂用 Linode 提供的备胎 lish 登上了服务器,查看了 sshd 配置,果然是登录用到的几个选项没有打开,推测是更新 openssh 的时候配置文件顺带被刷新了。

按照解答操作 sshd 的配置文件 < /etc/ssh/sshd_config >,解注释(设定)了下面这些配置项:

启用密码认证

PasswordAuthentication yes

启用 root 用户登录

PermitRootLogin yes

启用 ssh 密钥登录

PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys

配置文件至此编辑完成。接下来重启一下 sshd 服务:

#systemctl daemon-reload

#systemctl restart sshd.service

再次尝试 ssh 登录,世界和平!

解决一个诡异的 MySQL Workbench 崩溃问题

用 MySQL Workbench 的时候戳了一下选项卡的关闭按钮,它就直接崩溃了。

之后启动 MySQL Workbench 的时候出现以下错误直接崩溃,无论重启动系统,或重新安装它均无法解决。

*** Error in `/usr/bin/mysql-workbench-bin': double free or corruption (out): 0x00000000011a5f00 ***

最后,网上搜到了这个神奇的操作一下子解决了问题,MySQL Workbench 能启动了。

rm ~/.mysql/workbench/wb_options.xml

然而发现之前做了半天的 .mwb 文件打不开了,各种姿势用 MySQL Workbench 打开各种姿势闪退,然后又得执行上面的删除操作才能启动。最后排查发现打开的文件路径全英文的话就没事儿了 (╯°□°)╯︵ ┻━┻

解决 Linux 4.5 接上 Wacom CTL 471 冻结系统的问题

在 Linux 4.3.3 升级 4.4 的时候就遇到这个问题了,系统只要碰着 Wacom CTL 471 板子就立马冻住,或者是提笔就冻,这时候只能强制按电源重启。

当时太懒就一时把内核滚回了 4.3.3 好长时间,最近滚上 4.5 了想着问题大概没有了,然而还是太天真,开机就给我冻住……于是终于不能忍了,得搞定一下才行。顺带记下打内核补丁的姿势。

  • 发行版: Arch Linux
  • 出现问题对应的 linux 版本:linux-4.5.1-1-x86_64
  • Wacom 驱动版本:xf86-input-wacom-0.32.0-1-x86_64
  • Wacom 数位板型号:Wacom CTL-471

先顺着 Wacom Tablet - Arch Wiki 上关于 System Freeze 的解决方案,说是打个内核补丁就好,于是我找到了对应的内核补丁:[PATCH v2] hid: usbhid: hid-core: fix recursive deadlock,然后到后面我准备好源码的时候却发现 4.5 内核已经有这个 patch 了,也就是解决问题这个 patch 还不够。

一路搜索找到 #311 Kernel panic, system freeze since kernel4.4 til 4.5rc6
,问题描述和我的问题非常一致,仔细读下去后闻到了到问题解决的味道,顺着回复跳到了 Bug 1317116 - System freeze when Wacom One Tablet (CTL-471) is attached,读下去看来那个 [PATCH] HID: wacom: fix Bamboo ONE oops 就是解决问题的 patch 了,于是一把复制下来:

fix-Bamboo-ONE-oops.patch
--- a/drivers/hid/wacom_wac.c
+++ b/drivers/hid/wacom_wac.c
@@ -2426,6 +2426,17 @@ void wacom_setup_device_quirks(struct wacom *wacom)
     }
 
    /*
+   * Hack for the Bamboo One:
+    * the device presents a PAD/Touch interface as most Bamboos and even
+    * sends ghosts PAD data on it. However, later, we must disable this
+    * ghost interface, and we can not detect it unless we set it here
+    * to WACOM_DEVICETYPE_PAD or WACOM_DEVICETYPE_TOUCH.
+    */
+   if (features->type == BAMBOO_PEN &&
+       features->pktlen == WACOM_PKGLEN_BBTOUCH3)
+       features->device_type |= WACOM_DEVICETYPE_PAD;
+
+   /*
      * Raw Wacom-mode pen and touch events both come from interface
     * 0, whose HID descriptor has an application usage of 0xFF0D
     * (i.e., WACOM_VENDORDEFINED_PEN). We route pen packets back
-- 

接着装个 abs,它说用来获取 ABS tree 的脚本,ABS tree 是一个树状的包含了 Arch 所有软件包源文件的目录(总之还是看 Arch Build System - Arch Wiki 吧),用它来获取构建 linux 包所需的源文件(像 PKGBUILD 之类的),然后从 abs 同步下来的 /var/abs/ 里面取出 linux 包的目录,复制到准备对 Linux 进行 魔改 打补丁的目录:

sudo pacman -S abs
sudo abs
sudo abs linux
cp -r /var/abs/core/linux ~/arch_packages/

为了确认一下 patch 是没被打上的想先看看源码,先不急着开始构建,把所有源代码先准备好:

makepkg -o # 这个选项下 makepkg 只会下载校验解压好所有源代码/资源文件

结果遇到了 gpg 验证过不去,顺着错误原因搜了一下,将这俩人(Linus TorvaldsGreg Kroah-Hartman)的 gpg 公钥加入自己的 gpg 配置里面就好了,比较懒的话可以直接用带 GUI 的 Kleopatra 完成这一步,在其 Directory Services 的设置里面加入 http://pgp.mit.edu 这个服务器(确保能搜到那俩 key),然后在主界面戳 Lookup Certificates on Server,搜索 key 的后八位(Key ID),比如 00411886,就能够找到对应的证书啦,一键 import 之。

==> Verifying source file signatures with gpg...
    linux-4.5.tar ... FAILED (unknown public key 79BE3E4300411886)
    patch-4.5.1 ... FAILED (unknown public key 38DBBDC86092693E)

然后翻开看了一下 /drivers/hid/wacom_wac.c 对应的 2426 行附近,嗯,patch 没被打上的。把从 bugzilla 那边扒下来的 fix-Bamboo-ONE-oops.patch 放到和 PKGBUILD 相同目录下,然后在 PKGBUILD 里面添加上这个文件和对应的 shasum,并在 prepare() 里面 patch 它,由于个人口味顺带自定义了一下内核名字(修改 pkgbase 的值)。PKGBUILD 的开头看起来像这样(这不是完整的 PKGBUILD!,需要完整的源文件请跳到文末):

PKGBUILD
# $Id: PKGBUILD 265148 2016-04-19 06:55:26Z tpowa $

# Maintainer: Tobias Powalowski <tpowa@archlinux.org>

# Maintainer: Thomas Baechler <thomas@archlinux.org>


#pkgbase=linux               # Build stock -ARCH kernel

pkgbase=linux-Kafuu       # Build kernel with a different name

_srcname=linux-4.5
pkgver=4.5.1
pkgrel=1
arch=('i686' 'x86_64')
url="http://www.kernel.org/"
license=('GPL2')
makedepends=('xmlto' 'docbook-xsl' 'kmod' 'inetutils' 'bc')
options=('!strip')
source=("https://www.kernel.org/pub/linux/kernel/v4.x/${_srcname}.tar.xz"
        "https://www.kernel.org/pub/linux/kernel/v4.x/${_srcname}.tar.sign"
        "https://www.kernel.org/pub/linux/kernel/v4.x/patch-${pkgver}.xz"
        "https://www.kernel.org/pub/linux/kernel/v4.x/patch-${pkgver}.sign"
        # the main kernel config files

        'config' 'config.x86_64'
        # standard config files for mkinitcpio ramdisk

        'linux.preset'
        'change-default-console-loglevel.patch'
        'fix-Bamboo-ONE-oops.patch')

sha256sums=('a40defb401e01b37d6b8c8ad5c1bbab665be6ac6310cdeed59950c96b31a519c'
            'SKIP'
            '060ad091ebfa2b63d62e86beaf68c3a5d4638c506c3ac941c1825ba756e830b1'
            'SKIP'
            '8a8a955f015ee8342701231a63836cec0e300fd7e96d30e8696fde8a383fcdc9'
            '8b60911aad591306336e300e27071f2d108c5016e66a04327b82ac69acbfefff'
            'f0d90e756f14533ee67afda280500511a62465b4f76adcc5effa95a40045179c'
            '1256b241cd477b265a3c2d64bdc19ffe3c9bbcee82ea3994c590c2c76e767d99'
            '7dec753db812bd8a268e50d97cb1704b4ed097746e423720f6872ecf4a14e78c')
validpgpkeys=(
              'ABAF11C65A2970B130ABE3C479BE3E4300411886' # Linus Torvalds

              '647F28654894E3BD457199BE38DBBDC86092693E' # Greg Kroah-Hartman

             )

_kernelname=${pkgbase#linux}

prepare() {
  cd "${srcdir}/${_srcname}"

  # add upstream patch

  patch -p1 -i "${srcdir}/patch-${pkgver}"

  # add latest fixes from stable queue, if needed

  # http://git.kernel.org/?p=linux/kernel/git/stable/stable-queue.git


  # set DEFAULT_CONSOLE_LOGLEVEL to 4 (same value as the 'quiet' kernel param)

  # remove this when a Kconfig knob is made available by upstream

  # (relevant patch sent upstream: https://lkml.org/lkml/2011/7/26/227)

  patch -p1 -i "${srcdir}/change-default-console-loglevel.patch"

  # Fix System freeze with Wacom Bamboo One Tablet

  # Relevant patch: https://bugzilla.redhat.com/show_bug.cgi?id=1317116#c11

  patch -p1 -i "${srcdir}/fix-Bamboo-ONE-oops.patch"

  if [ "${CARCH}" = "x86_64" ]; then
    cat "${srcdir}/config.x86_64" > ./.config
  else
    cat "${srcdir}/config" > ./.config
  fi

  if [ "${_kernelname}" != "" ]; then
    sed -i "s|CONFIG_LOCALVERSION=.*|CONFIG_LOCALVERSION=\"${_kernelname}\"|g" ./.config
    sed -i "s|CONFIG_LOCALVERSION_AUTO=.*|CONFIG_LOCALVERSION_AUTO=n|" ./.config
  fi

  # set extraversion to pkgrel

  sed -ri "s|^(EXTRAVERSION =).*|\1 -${pkgrel}|" Makefile

  # don't run depmod on 'make install'. We'll do this ourselves in packaging

  sed -i '2iexit 0' scripts/depmod.sh

  # get kernel version

  make prepare

  # load configuration

  # Configure the kernel. Replace the line below with one of your choice.

  #make menuconfig # CLI menu for configuration

  #make nconfig # new CLI menu for configuration

  #make xconfig # X-based configuration

  #make oldconfig # using old config from previous kernel version

  # ... or manually edit .config


  # rewrite configuration

  yes "" | make config >/dev/null
}

接下来就可以开始构建内核了,为了更快一点,可以开个 -j8 什么的:

MAKEFLAGS="-j8" makepkg

我可怜的小本本(CPU i5 3337U)跑了有四个小时才跑完,如果你的处理器不是很厉害的话,最好确保一下电源的稳定确保跑过这场马拉松。

跑完之后会构建出三个包,根据设置的 pkgbase 不同,包名也会有所不同,一把安装之即可:

sudo pacman -U linux-Kafuu-4.5.1-1-x86_64.pkg.tar.xz linux-Kafuu-docs-4.5.1-1-x86_64.pkg.tar.xz linux-Kafuu-headers-4.5.1-1-x86_64.pkg.tar.xz

接着别急着重启,先刷新一下引导,在启动项中添加新内核的入口,grub 会自动搞定这件事情:

sudo grub-mkconfig

然后戳开 /boot/grub/grub.cfg 瞅瞅刚添加的内核是不是在启动菜单的第一个选项(看下第一个 menuentry 下是不是有 linux-Kafuu 即可),这样开机的时候直接回车进第一个就是刚刚新鲜的内核了,如果不是的话,那么应该可以在下面的 submenu 里面找到~

最后重启电脑,启动新的内核,接上 Wacom CTL 471 的数据线,世界和平!系统没有再被冻结啦,撒花!

关于打了 patch 的 linux 包源文件戳 gist 链接,你可以下下来 makepkg 直接构建出文中所述没有问题的内核。

另一消息是那个 patch 会并入 linux 4.6,我检查了一下 Arch Linux 中文社区源的 linux-mainline (当前版本是 4.6-rc5)之后发现果然那个 patch 已经打进去了。如果不想自己编译内核的话,可以尝试一下这个包。