/images/avatar.jpeg

玩转midi:使用vmpk在Gnu/Linux下弹钢琴

安装

sudo apt-get install vmpk
sudo apt-get install timidity

配置

  • 依次打开 QjackCTL,Qsynth(打开后其它音乐软件会禁声), VMPK,

配置Qsynth:

  • Soundfonts → Open 加载sf2文件,(一般路径为/usr/share/sounds/sf2/FluidR3_GM.sf2)

配置QjackCTL:

  • 1.Start
  • 2.Connect
    • Audio: qsynth match system
    • ALSA: VMPK Output match FLUID Synth(21225)

配置VMPK

  • Edit → Connections → Output MIDI Connection: FLUID Synth → OK

微信小程序开发笔记

├── app.js                  应用程序逻辑
├── app.json                页面路径(默认显示第一个),全局应用程序配置
├── app.wxss                应用程序公共样式
├── pages					页面目录
│   ├── index				index 页面
│   │   ├── index.js         页面入口,index页面逻辑
│   │   ├── index.wxml	   index页面结构
│   │   └── index.wxss	   index页面样式
│   └── logs			logs页面
│       ├── logs.js     逻辑页面
│       ├── logs.json   
│       ├── logs.wxml   结构页面
│       └── logs.wxss   样式页面
└── utils               公共脚本目录
    └── util.js         公共脚本
tooldesc
微信小程序控制台开发管理,数据分析,设置,获取AppID
开发文档API
开发者工具wx小程序IDE
Linux开发者工具
计算器Demo参考sCalc
WeUI
leancloud控制台可作为免费的微信小程序后台数据测试服务器
  • 小程序数据助手

https://mp.weixin.qq.com/debug/wxadoc/analysis/image/weanalytics/a0.png?t=2017526{:height=“200px” width=“400px”}

《有理想的人如何运用老庄的智慧》讲座笔记与总结

  • 时间:2017-09-10
  • 主讲人: 杜保瑞 老师

1、理想与人生的关系是什么?

找到生命的意义,终生努力的目标,时刻清醒自觉,价值判断有据,应对进退合理

  • 找有意义的事全心投入,不好高骛远,也不轻视自己。
  • 有自己的原则,做任何事都不违背自己设定的目标。
  • 有自己的节奏,有目标,找到自己的角色扮演。认同自己,就是尊重自己,即自重。能够不为一些人或事所左右。

2、如何发掘(实现)个人的理想?

先有爱心,愿意付出,愿意忍耐,尊重自己。

Ubuntu16.04 下编译安装tesseract 4.00.00alpha 及测试

  1. 3.05.01 及 以后的版本没有Linux的二进制包,需要编译安装.
# 安装相关组件
sudo apt-get install g++ # or clang++ (presumably)
sudo apt-get install autoconf automake libtool
sudo apt-get install autoconf-archive
sudo apt-get install pkg-config
sudo apt-get install libpng12-dev
sudo apt-get install libjpeg8-dev
sudo apt-get install libtiff5-dev
sudo apt-get install zlib1g-dev
sudo apt-get install libicu-dev
sudo apt-get install libpango1.0-dev
sudo apt-get install libcairo2-dev
  1. 依赖图像库Leptonica,在编译tesseract前先编译Leptonica, 版本对应关系见Compiling#linux,3.05对应leptonica-1.74.tar.gz
wget http://www.leptonica.org/source/leptonica-1.74.tar.gz
tar -xvf leptonica-1.74.tar.gz
cd leptonica-1.74
./configure 
make
make install
  1. 编译安装tesseract 4.00.00alpha
git clone https://github.com/tesseract-ocr/tesseract.git
cd tesseract
./autogen.sh
./configure 
make
make install

python3 调用

sudo pip3 install pytesseract
import pytesseract
vcode = pytesseract.image_to_string(im, lang='eng', config='-psm 12 --tessdata-dir /tessdata/')

基于相同颜色连通像素个数的统计进行图像字符识别

问题: 对如下图中的字符进行识别:

  • 样本:/20170823-%E5%9F%BA%E4%BA%8E%E7%9B%B8%E5%90%8C%E9%A2%9C%E8%89%B2%E8%BF%9E%E9%80%9A%E5%83%8F%E7%B4%A0%E4%B8%AA%E6%95%B0%E7%9A%84%E7%BB%9F%E8%AE%A1%E8%BF%9B%E8%A1%8C%E5%9B%BE%E5%83%8F%E5%AD%97%E7%AC%A6%E8%AF%86%E5%88%AB/ldg_3681.bmp

解题思路:

  • 无论是图像,音频的识别,不外乎是对各种特征(特征向量)进行统计归纳。
  • 放大后的样本:/20170823-%E5%9F%BA%E4%BA%8E%E7%9B%B8%E5%90%8C%E9%A2%9C%E8%89%B2%E8%BF%9E%E9%80%9A%E5%83%8F%E7%B4%A0%E4%B8%AA%E6%95%B0%E7%9A%84%E7%BB%9F%E8%AE%A1%E8%BF%9B%E8%A1%8C%E5%9B%BE%E5%83%8F%E5%AD%97%E7%AC%A6%E8%AF%86%E5%88%AB/3681.png
  • 通过观察,发现这是一张简单的,非常有规律可循的图。 越有规律越容易进行分类。这里的思路就是自左至右依次对相同颜色的像素连通区进行像素个数统计,从而制成像素与字符对应的字典进行识别。

局限性及应对措施:

  • 此种方法只针对’少量的’,’简单的‘字符图形。若字符种类过多,容易造成不同像素个数冲突的问题。
  • 针对冲突问题,一种有限的解决办法即针对’不同’的特征,进行二次验证。

python实现:

from PIL import Image
import numpy as np

class dfs_simple_digital_chacpt(object):
    def __init__(self, path):
        self.white = [238, 238, 238]
        self.row_num = 10
        self.col_num = 40
        self.walked_set = set()
        self.roming_set = set()
        self.dfs_num = 0
        im = Image.open(path)
        self.image_array = np.array(im).tolist()

    def dfs(self, x, y, rgb):
        '''
        desc:用递归实现搜索范围内相同rgb值的像素
        :param x: 
        :param y: 
        :param char: 
        :return: 
        '''
        self.roming_set.add(tuple([x, y]))
        if 0 > x or 0 > y or x >= self.row_num or y >= self.col_num: # 越界检查
            return
        if tuple([x,y]) in self.walked_set: # 重复遍历检查
            return
        if rgb != self.image_array[x][y]: # 目标rgb值检查
            return

        self.walked_set.add(tuple([x, y]))

        self.dfs(x + 1, y, rgb)  # x
        self.dfs(x, y + 1, rgb)  # y
        self.dfs(x - 1, y, rgb)  # -x
        self.dfs(x, y - 1, rgb)  # -y
        self.dfs(x + 1, y + 1, rgb)  # Ⅰ
        self.dfs(x + 1, y - 1, rgb)  # Ⅱ
        self.dfs(x - 1, y - 1, rgb)  # Ⅲ
        self.dfs(x - 1, y + 1, rgb)  # Ⅳ
        return

    def walk(self):
        '''
        desc: 
        :return: 
        '''
        for y in range(self.col_num):
            for x in range(self.row_num):
                rgb = self.image_array[x][y]

                if tuple([x, y]) in self.roming_set:
                    continue
                if rgb != self.white:
                    self.dfs(x, y, rgb)
                    num = len(self.walked_set)
                    print(num)

                    self.walked_set.clear()
        self.roming_set.clear()

if __name__ == '__main__':
    path = ''
    c = dfs_simple_digital_chacpt(path)
    dfs_num = c.walk()

《挑战程序设计(第二版)》(第二章)POJ No.2386

POJ 2386

  • 问题:
  • 有一个大小为N×M的园子,雨后积起了水。八连通的积水被认为是连在一起的。求园子里一共有多少水洼?\
  • 限制条件N,M<=100
  • 输入
W........WW.
.WWW.....WWW
....WW...WW.
.........WW.
.........W..
..W......W..
.W.W.....WW.
W.W.W.....W.
.W.W......W.
..W.......W.
  • 输出: 3
  • 题解:
DFS次数为水洼的个数,
  • POJ No.2386 python 实现:
# POJ No.2386
class poj2386(object):
    def __init__(self, map):
        self.row_num = 10
        self.col_num = 12
        self.m = self.matrix(map.replace('\n',''))
        self.walked_set = set()
        self.dfs_num = 0

    def matrix(self, map):
        '''
        desc: 字符串转数组,方便遍历
        :return ['row0','row1'...]
        '''
        col_num = 0
        matrix = []
        for r in range(self.row_num):
            matrix.append(map[col_num: col_num + self.col_num])
            col_num = col_num + self.col_num
        return matrix

    def dfs(self, x, y, char):
        '''
        desc:用递归实现搜索范围内相同字符
        :param x: 
        :param y: 
        :param char: 
        :return: 
        '''
        if 0 > x or 0 > y or x >= self.row_num  or y >= self.col_num : # 越界检查
            return
        if tuple([x,y]) in self.walked_set: # 重复遍历检查
            return
        if char != self.m[x][y]: # 目标字符检查
            return

        self.walked_set.add(tuple([x, y]))

        self.dfs(x + 1, y, char)  # x
        self.dfs(x, y + 1, char)  # y
        self.dfs(x - 1, y, char)  # -x
        self.dfs(x, y - 1, char)  # -y
        self.dfs(x + 1, y + 1, char)  # Ⅰ
        self.dfs(x + 1, y - 1, char)  # Ⅱ
        self.dfs(x - 1, y - 1, char)  # Ⅲ
        self.dfs(x - 1, y + 1, char)  # Ⅳ
        return

    def walk(self):
        '''
        desc: 对矩阵遍历
        :return: 
        '''
        for x in range(self.row_num-1):
            for y in range(self.col_num-1):
                if tuple([x, y]) in self.walked_set:
                    continue
                if self.m[x][y] == '.':
                    continue
                if self.m[x][y] == 'W':
                    self.dfs(x, y, 'W')
                    self.dfs_num +=1
        return self.dfs_num
if __name__ == '__main__':
    map = '''
W........WW.
.WWW.....WWW
....WW...WW.
.........WW.
.........W..
..W......W..
.W.W.....WW.
W.W.W.....W.
.W.W......W.
..W.......W.
'''
    c = poj2386(map)
    dfs_num = c.walk()
    print(dfs_num)

火车票中的社会工程学信息

火车票脱敏身份证信息还原

  • 经常在朋友圈看到好友晒旅行的火车票. 火车票有我们的姓名及经过脱敏处理的身份证信息, 但仅仅屏蔽了出生的月份日期,通过校验位暴力遍历便可筛选可能的30余组号码.即猜中的概率为3%.如果再通过其它渠道获得如星座等信息.就可将猜中的概率提高10倍,即有三分之一的可能性被猜中.

攻壳机动队 Ghost in the Shell 影评

警告: ↓↓↓大量剧透 ↓↓↓

  • 在未来世界,都市中巨幅全息投影的大规模应用,隐形技术的实战应用,及义体的广泛流行,展现着生物机械技术,影像技术及网络技术的飞速发展。然而科技与伦理道德间的冲突如达摩克利斯之剑悬在社会的肩头。光怪陆离的都市与平民街景的格格不入,也彰显科技的融合,矛盾与冲突。

假使我有了孩子

  • 作为一个20多岁的男人,没有经历过恋爱和爱情,自然也没有孩子。
  • 但是作为曾经是一个无知,愚蠢,懦弱孩子的我,
  • 也许更加深知一个孩子在怎样的成长道路上行进是何等的重要。
  • 假使我有了孩子,我将会更加敏感,敏感气温的变化,及时提醒他增减衣物,因为我的父母总是这样做。
  • 假使我有了孩子,我将从他张开双眼的那天起,培养自己良好的习惯,痛改自己的不良习惯和嗜好,因为他在模仿。
  • 假使我有了孩子,我将会从他对声音有一丝的反应开始,更加注意自己的言谈举止,更加礼貌待人,因为他在倾听。
  • 假使我有了孩子,我将会更加珍惜宝贵的时间,会对无意义的事情说不。因为我伴随他的时间和他的童年一样短暂。
  • 假使我有了孩子,我将不会对某件事过多评论,更不会对某件事轻易对他灌输某种思想,因为他的思想更重要。
  • 假使我有了孩子,我将更加坚持原则,没有底线的人是可怕的人,即使有时不容易,但我不想他变的可怕。
  • 假使我有了孩子,我将会加倍努力的工作,打理好日常一切事物,因为他需要一个温馨和谐的家。
  • 无论他是男是女,是胖或瘦,是亲生亦或领养,我将祝福他的降临和成长。