About

Blog

如你所见,如我所想。

Me

Microtaku -> ~(>_<~)

Yuujin

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

Posts Tagged “ 日常 ”

通过字体文件给 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" 

至此,一切就搞定啦!

给 Windows 添加用 Notepad++ 打开的右键菜单

操作很简单:

创建一个文本文件,键入以下内容后保存为reg文件,最后双击添加注册表项即可

注意:最下面一行中的文件目录为你的电脑上的Notepad++可执行文件所在位置

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\*\shell\notepad++]
@="Edit with Notepad++"

[HKEY_CLASSES_ROOT\*\shell\notepad++\command]
@="\"C:\\Program Files (x86)\\notepad++\\notepad++.exe\" %1"

图片转HTML(支持动画)

也许是受到很久以前看到的这玩意儿的原因:The Shapes of CSS

现在开脑洞写了个自动转换,顺便支持了动画……嗯,纯 CSS (:з」∠)

主要步骤就是用 Python 读图片,然后把像素全转写成 CSS 的 box-shadow ,最后构建一个完整的 HTML 文件输出。

然后用浏览器打开生成的 HTML 文件,就直接看到图片了,如果输入是一个文件夹的话,就以文件夹里面的图片为帧生成一个带动画的 HTML。

之后再更新就丢这儿了: img2html

#!/usr/bin/env python3

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


## @package img2html

#  Usage        : img2html.py file1|dir1 [file2|dir2 ...]

#  Description  : generate html uses box-shadow to show picture

#                 or a html to show your image sequence in a folder as css animation

#  Dependencies : Python Image Library, Python 3

#  Note         : Take care of the Super-High-Energy output ( >﹏<。)

#  Date         : 2014-12-19

#  Author       : frantic1048



import sys
import os
from PIL import Image
from string import Template

class UnknownColorMode(Exception): pass

## @var tHTML template for constructing entire html document

tHTML = Template('''
<!doctype html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>~ ${name} ~</title>
</head>
<body>
  <style type="text/css">${css}</style>
  <div id="image_kun"></div>
</body>
</html>''')

## @var tCSSStatic template for constructing static image's css code

tCSSStatic = Template('''
@charset "utf-8";
body{
  display:flex;
  justify-content:center;
  align-items:center;
}
#image_kun{
  height: ${height}px;
  width: ${width}px;
  position:relative;
}
#image_kun::after{
  position:absolute;
  height:1px;
  width:1px;
  background:${firstPixel};
  margin:0;
  padding:0;
  content:"\\200B";/*ZWS*/
  box-shadow:
  ${boxshadow};
}
''')

## @var tCSSAnimation template for constructing image sequence's css animation code

tCSSAnimation = Template('''
@charset "utf-8";
body{
  display:flex;
  justify-content:center;
  align-items:center;
}
#image_kun{
  height: ${height}px;
  width: ${width}px;
  position:relative;
}
#image_kun::after{
  position:absolute;
  height:1px;
  width:1px;
  background:transparent;
  margin:0;
  padding:0;
  content:"\\200B";/*ZWS*/
  animation:ayaya ${animationLength} step-end infinite alternate;
}
${animationKeyFrames}
  ''')

## @var tCSSKeyframes template entire CSS keyframes rule

tCSSKeyframes = Template('@keyframes ayaya {${keyframes}}')

## @var tCSSKeyframe template for a single CSS keyframe

tCSSKeyframe = Template('${percentage}% {${keyframeRule}}\n')

## @var tCSSKeyframeRule template for a single CSS keyframe inner rule

tCSSKeyframeRule = Template('background:${firstPixel};box-shadow:${boxshadow};')

## ensure no trailiing slash in directory name

def toRegularDirName(dirName):
    if (os.path.split(dirName)[-1] == ''):
      return os.path.split(dirName)[0]
    else:
      return dirName

## write str to a file,named as <exportFileName>.html

def toFile (str,exportFileName):
  with open (exportFileName,'w') as html:
    html.write(str)

## construct HEX Color value for a pixel

#  @param pixel a RGB mode pixel object to be converted

#  @return CSS hex format color value

def toHexColor (pixel):
  return '#{0:02x}{1:02x}{2:02x}'.format(*pixel[:])

## construct RGBA Color value for a pixel

#  @param pixel a RGBA mode pixle object to be comverted

#  @return CSS rgba format color value

def toRGBAColor (pixel):
  return 'rgba({0},{1},{2},{3})'.format(*pixel[:])

def toCSSColor (pixel, mode):
  if (mode == 'RGB'):
    return toHexColor(pixel)
  elif (mode == 'RGBA'):
    return toRGBAColor(pixel)
  else:
    raise UnknownColorMode

## construct single box-shadow param

#  @param color valid CSS color

def toBoxShadowParam (x, y, color):
  return format('%spx %spx 0 %s'%(x, y, color))

## process single image file to html

#  @param fileName input file's name

#  @param export output callback(doc, exportFileName):

#    doc : generated html string

#    exportFileName : output filename

def mipaStatic(fileName,export=''):
  with Image.open(fileName) as im:
    ## what called magic

    boxshadow = ''

    ## file name as sysname

    exportFileName = fileName+'.html'
    title = os.path.split(fileName)[-1]

    ## image size

    width, height = im.size[0], im.size[1]

    #ensure RGB(A) mode

    if (im.mode != 'RGBA' or im.mode != 'RGB'):
      im.convert('RGB')

    firstPixel = toCSSColor(im.getpixel((0,0)), im.mode)
    for y in range(0, height):
      for x in range(0, width):
        color = toCSSColor(im.getpixel((x, y)), im.mode)
        #link magic

        boxshadow += toBoxShadowParam(x, y, color)

        #add a spliter if not the end

        if (not (y == height-1 and x == width-1)):
          #keep a '\n' for text editor ˊ_>ˋ

          boxshadow += ',' + '\n'

    doc = tHTML.substitute(name = title, css = tCSSStatic.substitute(width = width, height = height, boxshadow = boxshadow, firstPixel=firstPixel))
    if (export==''):
      print(doc)
    else:
      export(doc, exportFileName)


## process a image folder

#  files in folder will processed to an animated html

#  process order is filename asend

#  @param dirName input file's name

#  @param export output callback, call with generated html as a string argument

def mipaAnimation(dirName,export=''):
  dirName = toRegularDirName(dirName)
  title = os.path.basename(dirName)
  exportFileName = title + '.html'

  files = os.listdir(dirName)
  files.sort()

  FPS = 24
  mode = ''
  width, height = 0, 0
  frameCount = 0
  keyframeRules = []
  keyframe = ''

  for f in files:
    try:
      with Image.open(os.path.join(dirName, f)) as im:

        if (export!=''):print('processing file --> ' + f)

        frameCount+=1

        #ensure RGB(A) mode

        if (im.mode != 'RGBA' or im.mode != 'RGB'):
          im.convert('RGB');

        #collect animation info

        if (width == 0) : width, height = im.size[0], im.size[1]
        if (mode == '') : mode = im.mode

        firstPixel = toCSSColor(im.getpixel((0,0)), mode)
        boxshadow = ''
        for y in range(0, height):
          for x in range(0, width):
            color = toCSSColor(im.getpixel((x, y)), mode)
            #link magic

            boxshadow += toBoxShadowParam(x, y, color)

            #add a spliter if not the end

            if (not (y == height-1 and x == width-1)):
              #keep a '\n' for text editor ˊ_>ˋ

              boxshadow += ',' + '\n'
        keyframeRules.append(tCSSKeyframeRule.substitute(firstPixel=firstPixel,boxshadow=boxshadow))
    except:
      pass

  percentUnit= 100/frameCount
  for i in range(0,frameCount):
    if (i == frameCount - 1):
      pc = '100'
    elif (i == 0):
      pc = '0'
    else:
      pc = str(percentUnit * i)
    keyframe += tCSSKeyframe.substitute(percentage = pc, keyframeRule = keyframeRules[i])

  if (export!=''):print('generating document...')
  doc = tHTML.substitute(name = title, css = tCSSAnimation.substitute(animationLength = str((1000 / FPS) * frameCount) + 'ms',
                                                                          animationKeyFrames = tCSSKeyframes.substitute(keyframes = keyframe),
                                                                          height = height,
                                                                          width = width))
  #output

  if (export==''):
    print(doc)
  else:
    print('Start exporting...')
    export(doc, exportFileName)
    print('Finished exporting !\nenjoy with your magical ' + exportFileName + ' _(:з」∠)_')


for path in sys.argv[1:]:
  if os.path.isfile(path):
    ##export to stdout

    #mipaStatic(path)


    ##export to autonamed file

    mipaStatic(path,toFile)
  elif os.path.isdir(path):
    #mipaAnimation(path)

    mipaAnimation(path,toFile)