欢迎使用 MWeb

MWeb 是专业的 Markdown 写作、记笔记、静态博客生成软件,目前已支持 Mac,iPad 和 iPhone。MWeb 有以下特色:

软件本身:

  • 使用原生的 macOS 技术打造,追求与系统的完美结合。
  • 原则上,首先是追求界面简洁和高性能,然后才是强大易用,功能全面。

Markdown 语法:

  • 使用 GitHub Flavored Markdown 语法,简称 GFM 语法。
  • 支持表格、TOC、LaTeX、代码块、任务列表、脚注等。
  • 画图库支持 mermaid, viz, ECharts, PlantUML, Sequence, Flow。

Markdown 辅助:

  • 支持截图并粘贴、复制并粘贴、拖拽等方式插入图片并直接显示在编辑器内。
  • 在兼容 Markdown 语法的情况下支持设置图片宽度。
  • 好用的表格插入和 LaTeX 书写辅助。

Markdown 输出:

  • 支持导出为图片、HTML、Epub、PDF、RTF、Docx。
  • 支持发布到 WordPress、支持 Metaweblog API 协议的服务、Wordpress.com、印象笔记(Evernote)、Blogger、Medium、Tumblr、语雀、Ghost、少数派 Matrix。
  • 图片上传服务(图床)支持 Imgur、七牛云、又拍云、腾讯云 COS、阿里云 OSS、SM.MS和自定义的图床服务。

Markdown 笔记:

  • 强大的文档库支持分类树和标签管理文档,文档可归类于多个分类,可以把分类整个导出为 Epub、PDF 和生成静态网站。非常合适用于笔记、个人知识收集、管理和输出。
  • 快速笔记:随意增加笔记及图片等素材,支持以天为单位把增加的素材组合在一个文档内,方便整理及记录历史收集情况。
  • 快速搜索:目前已支持全局快捷键调出搜索。

外部 Markdown 文档:

  • 外部 Markdown 文档使用外部模式管理。外部模式使用目录树的方式编辑和管理你的 Markdown 文档,还能很好的支持 GitBook、Jekyll、Hexo 等等编辑和图片插入。

MWeb 文档:

如果要更详细了解 MWeb,建议你一定要去看一下官网的帮助文档,网址为:https://zh.mweb.im/help.html。我们建议在使用文档库之前,一定要阅读一下 MWeb 文档库详细介绍 这篇文章,以便更好的使用文档库。

帮助我们改进 MWeb

如果你喜欢 MWeb,想让它变得更好,你可以:

  1. 推荐 MWeb,让更多的人知道。
  2. 给我们发反馈和建议:coderforart+2333@gmail.com
  3. 在 Mac App Store 上评价 (如果是在 MAS 上购买的话)。

Piwigo Sylvia theme专辑图片垂直居中

修改 themes/Sylvia/theme.css

.thumbnailCategory .illustration {
    background: transparent url(images/cat_top-left.gif) no-repeat scroll left top;
    padding: 0 5px 0 10px;
    margin: 0 !important;
    text-align: center;
    line-height:145px;
}

.thumbnailCategory .illustration a {
    display: block;
    margin: 0 auto;
    padding: 20px 4px 0;
    border: 0;
}

.thumbnailCategory .illustration a img {
    display: inline-block;
    vertical-align: middle;
}

centOS7下SVN的安装和使用

转载:du_xian_sheng@CSDN

1. 安装

CentOS通过yum安装subversion。

# yum install subversion

subversion安装在/bin目录,查看目录命令:

# which svnserve
/usr/bin/svnserve

检查一下subversion是否安装成功。不要使用1.8版本

# svnserve --version
svnserve, version 1.7.14 (r1542130)

2. 建立版本库

subversion默认以/var/svn作为数据根目录,可以通过/etc/sysconfig/svnserve修改这个默认位置。

# vim /etc/sysconfig/svnserve

文件内容 OPTIONS=”-r /var/svn” 可修改

使用svnadmin建立版本库svntest。

# mkdir -p /var/svn/svntest //递归创建多个目录
# svnadmin create /var/svn/svntest
# ll /data/svn/svntest //查看目录中内容
drwxr-xr-x. 2 root root  51 Nov 10 14:42 conf
drwxr-sr-x. 6 root root 4096 Nov 10 14:42 db
-r--r--r--. 1 root root    2 Nov 10 14:42 format
drwxr-xr-x. 2 root root 4096 Nov 10 14:42 hooks
drwxr-xr-x. 2 root root  39 Nov 10 14:42 locks
-rw-r--r--. 1 root root  229 Nov 10 14:42 README.txt

3. 配置

#cd /var/svn/svntest

a、编辑用户文件passwd,新增两个用户:admin和guest。

# vim conf/passwd
[users]
admin = admin
guest = guest

b、编辑权限文件authz,用户admin设置可读写权限,guest设置只读权限。

# vim conf/authz
[/]
admin = rw
guest = r

c、编辑svnserve.conf:

# vim conf/svnserve.conf
[general]
anon-access = none #控制非鉴权用户访问版本库的权限
auth-access = write #控制鉴权用户访问版本库的权限
password-db = passwd #指定用户名口令文件名
authz-db = authz #指定权限配置文件名
//realm = svntest #指定版本库的认证域,即在登录时提示的认证域名称 //测试不需要

 4. SVN服务

启动SVN服务。

# systemctl start svnserve.service

检查服务是否启动成功。

# ps aux | grep svn
root 16349 0.0 0.1 162180 900 ? Ss 15:01 0:00 /usr/bin/svnserve --daemon --pid-file=/run/svnserve/svnserve.pid -r /opt/svn

通过netstat可以看到SVN打开了3690端口。

# netstat -tnlp
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:3690 0.0.0.0:* LISTEN 16349/svnserve

设置成开机启动。

# systemctl enable svnserve.service

5. 更改防火墙设置大坑,注意阿里云要开相应端口3690

# vim /etc/sysconfig/iptables

添加一下两行 vim操作 yy p

-A INPUT -m state –state NEW -m tcp -p tcp –dport 3690 -j ACCEPT
-A OUTPUT -m state –state NEW -m tcp -p tcp –dport 3690 -j ACCEPT //不需要

然后退出编辑,重启防火墙

查看 

# iptables -L -n
# service iptables restart //这是centOS6 的命令
# /bin/systemctl restart iptables.service

6. 客户端测试

客户端可以通过TortoriseSVN测试。

Linux下客户端使用SVN

将文件checkout到本地目录svn666

svn checkout svn://127.0.0.1 ./svn666

有修改的时候

# svn add * //添加文件
# svn commit -m '这是注释内容' //提交
# svn update //更新

网段划分例子

将172.17.0.0划分为14个子网(实际是16个),请计算出子网的子网掩码,以及在每个子网中主机IP地址的子网如下:

172.17.0.0/20
有效的地址范围是:172.17.0.1-172.17.15.254
172.17.16.0/20
有效的地址范围是:172.17.16.1-172.17.31.254
172.17.32.0/20
有效的地址范围是:172.17.32.1-172.17.47.254
172.17.48.0/20
有效的地址范围是:172.17.48.1-172.17.63.254
172.17.64.0/20
有效的地址范围是:172.17.64.1-172.17.79.254
172.17.80.0/20
有效的地址范围是:172.17.80.1-172.17.95.254
172.17.96.0/20
有效的地址范围是:172.17.96.1-172.17.111.254
172.17.112.0/20
有效的地址范围是:172.17.112.1-172.17.127.254
172.17.128.0/20
有效的地址范围是:172.17.128.1-172.17.143.254
172.17.144.0/20
有效的地址范围是:172.17.144.1-172.17.159.254
172.17.160.0/20
有效的地址范围是:172.17.160.1-172.17.175.254
172.17.176.0/20
有效的地址范围是:172.17.176.1-172.17.191.254
172.17.192.0/20
有效的地址范围是:172.17.192.1-172.17.207.254
172.17.208.0/20
有效的地址范围是:172.17.208.1-172.17.223.254
172.17.224.0/20
有效的地址范围是:172.17.224.1-172.17.239.254
172.17.240.0/20
有效的地址范围是:172.17.240.1-172.17.255.254

Mac 终端里神秘的 bogon 及解决方法

如题,Mac 下的终端经常有时候前面的计算机名会错误的显示成 bogon. 这是因为终端会先向 DNS 请求查询当前 IP 的反向域名解析的结果,如果查询不到再显示我们设置的计算机名。而由于我们的 DNS 错误地将保留地址反向的 NS 查询结果返回了 bogon. 其中 bogon 本应该用来指虚假的 IP 地址,而非保留 IP 地址。因此就出现了会时不时地打印 bogon 这种奇怪名字作为计算机名的现象了。那么如何让终端只显示我们想要的计算机名而不总是从 DNS 返回结果呢?

解决方案:在终端中执行以下命令即可(需要输入一次管理员密码)

sudo hostname your-desired-host-name
sudo scutil --set LocalHostName $(hostname)
sudo scutil --set HostName $(hostname)

Linux下DNS查询

一般来说linux下查询域名解析有两种选择,nslookup或者dig,而在使用上我觉得dig更加方便顺手。

如果是在debian下的话,只要装上dnsutils这个包就可以使用dig命令了。最基本的使用方式就是

dig www.oolec.com

即查询域名的A记录,查询的dns服务器将采用系统配置的服务器,即/etc/resovle.conf 中的。如果要查询其他类型的记录,比如MX,CNAME,NS,PTR等,只需将类型加在命令后面即可

dig www.oolec.com mx
dig www.oolec.com ns

此外,如果你是一个系统管理员,部署好了一台dns服务器之后想对它进行解析测试,就必须要显式指定待测试的dns服务器地址了,例如

dig @202.106.0.20 www.oolec.com a

默认情况下dig将采用udp协议进行查询,如果要采用tcp方式,可以加上 +tcp参数

dig www.oolec.com a +tcp

另外一个重要的功能是+trace参数,使用这个参数之后将显示从根域逐级查询的过程

dig www.oolec.com a +trace

比如,对域名www.linuxers.cn A记录的trace查询可以看到根域.,顶级域.cn,以及linuxers.cn的域名权威服务器的地址及其各自的返回结果,这样对于追踪dns解析中的问题有很大的帮助。

dig www.linuxers.cn a +trace

datatable实现纵向单元格合并

转载:bird_tp@CSDN

实现效果如下:

在 drawCallback 函数里重画表格,引入以下代码即可

var api = this.api();
var rows = api.rows({ page: 'current' }).nodes();

var idx = 0;    // 第一列进行合并
var last = null;
var tr = null;
var ltd = null;

api.column(idx, { page: 'current' }).data().each(function (group, i) {
    tr = $(rows[i]);
    var td = $("td:eq(" + idx + ")", tr);
    if (last !== group) {
        td.attr("rowspan", 1);
        td.text(group);
        ltd = td;
        last = group;
        td.css("vertical-align", "middle");
    } else {
        ltd.attr("rowspan", parseInt(ltd.attr("rowspan")) + 1);
        td.remove();
    }
});

Delphi XE移动开发,将文件打包到程序中

用Delphi XE做移动开发的时候,有些情况下可能需要我们把一些文件打包到安装程序中,如网页、图片、数据库文件等,那么如何实现呢

1.首先,打开菜单 Project – Deployment

2.点击添加按钮,选择要添加的文件(文件最好放在工程目录中,这样,即使该工程在其他电脑上打开,也能找到该文件)

3.修改Remote Path:

    当开发Android程序时,Remote Path修改为 assets\internal\ 

    当开发iOS程序时,Remote Path修改为 StartUp\Documents

4.程序中使用文件的方法:

    首先,需要引用 System.IOUtils 文件,这样才能使用TPath类

    TPath.Combine(TPath.GetDocumentsPath,’a.htm’)

    或

    TPath.GetDocumentsPath + PathDelim + ‘a.htm’

    获取文件的绝对路径,然后就可以使用这个路径对文件进行操作了

linux下安装Gogs

1. 安装git
sudo apt-get install git
2.创建用户
sudo adduser git
passwd git….
su git
cd ~
3.下载最新版gogs
wget https://dl.gogs.io/gogs_v0.8.10_linux_amd64.zip
unzip ./gogs_v0.8.10_linux_amd64.zip
4.运行gogs
./gogs web
然后打开浏览器,http://服务器IP:3000/,默认就进入安装配置界面,进行简单的配置。

把/usr/local/src/gogs/scripts/init/centos/gogs拷贝到/etc/init.d/,并且增加x权限
5.自动运行
将 scripts/systemd/gogs.service 文件复制到 /lib/systemd/system
systemctl enable gogs.service

C++ 基于OpenCV的照片换背景色

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace std;
using namespace cv;

void ChangeImgBG();
Mat HandleImgData(Mat &img);
/*
图片背景替换
知识点:分水岭分割、高斯模糊
处理步骤:数据组装-KMeans分割-背景消除-生成遮罩-模糊-输出
*/
void ChangeImgBG()
{
    const char *win1 = "window1";
    const char *win2 = "window2";
    const char *win3 = "window3";
    const char *win4 = "window4";
    const char *win5 = "window5";
    const char *win6 = "window6";
    namedWindow(win1, WINDOW_AUTOSIZE); //创建窗口 win1
    namedWindow(win2, WINDOW_AUTOSIZE); //创建窗口 win2
    namedWindow(win3, WINDOW_AUTOSIZE); //创建窗口 win3
    namedWindow(win4, WINDOW_AUTOSIZE); //创建窗口 win4
    namedWindow(win5, WINDOW_AUTOSIZE); //创建窗口 win5
    namedWindow(win6, WINDOW_AUTOSIZE); //创建窗口 win6

    Mat img1, img2;
    //加载图片
    img1 = imread("pph.jpg");
    if (img1.empty())
    {
        cout << "image not found..." << endl;
        exit(0); //如果图片不存在,退出程序
    }
    img2 = img1.clone();
    //显示原始图片
    imshow(win1, img1);
    //组装数据
    Mat points = HandleImgData(img1);

    //Kmeans处理
    int numCluster = 4;
    Mat labels;
    Mat centers;
    TermCriteria termCriteria = TermCriteria(TermCriteria::EPS + TermCriteria::COUNT, 10, 0.1);

    kmeans(points, numCluster, labels, termCriteria, 3, KMEANS_PP_CENTERS, centers);
    //遮罩
    Mat mask = Mat::zeros(img1.size(), CV_8UC1);
    int index = img1.rows * 2 + 2;
    int cindex = labels.at(index, 0); //背景设置为0
    int height = img1.rows;
    int width = img1.cols;

    for (int row = 0; row < height; row++)
    {
        for (int col = 0; col < width; col++)
        {
            index = row * width + col;
            int label = labels.at(index, 0);
            if (label == cindex)
            {
                img2.at(row, col)[0] = 0;
                img2.at(row, col)[1] = 0;
                img2.at(row, col)[2] = 0;
                mask.at(row, col) = 0;
            }
            else
            {
                mask.at(row, col) = 255;
            }
        }
    }

    //腐蚀
    Mat k = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));
    erode(mask, mask, k);
    imshow(win4, mask);

    //高斯模糊
    GaussianBlur(mask, mask, Size(3, 3), 0, 0);
    imshow(win5, mask);

    //通道混合
    RNG rng(12345);

    //背景颜色调整
    Vec3b color;
    /*color[0] = rng.uniform(255, 255);
    color[1] = rng.uniform(255, 255);
    color[2] = rng.uniform(255, 255);*/
    color[0] = 255;
    color[1] = 255;
    color[2] = 255;

    Mat result(img1.size(), img1.type());

    double d1 = 0.0;
    int r = 0, g = 0, b = 0;
    int r1 = 0, g1 = 0, b1 = 0;
    int r2 = 0, g2 = 0, b2 = 0;

    for (int row = 0; row < height; row++)
    {
        for (int col = 0; col < width; col++)
        {
            int m = mask.at(row, col);
            if (m == 255)
            {
                result.at(row, col) = img1.at(row, col); //前景
            }
            else if (m == 0)
            {
                result.at(row, col) = color; //背景
            }
            else
            {
                d1 = m / 255.0;
                b1 = img1.at(row, col)[0];
                g1 = img1.at(row, col)[1];
                r1 = img1.at(row, col)[2];

                b2 = color[0];
                g2 = color[1];
                r2 = color[2];

                b = b1 * d1 + b2 * (1.0 - d1);
                g = g1 * d1 + g2 * (1.0 - d1);
                r = r1 * d1 + r2 * (1.0 - d1);

                result.at(row, col)[0] = b;
                result.at(row, col)[1] = g;
                result.at(row, col)[2] = r;
            }
        }
    }

    //输出
    imshow(win2, mask);
    imshow(win3, img2);
    imshow(win6, result);
    //保存处理后的图片
    imwrite("pph_bg_white.jpg", result);
}

//组装样本数据
Mat HandleImgData(Mat &img)
{
    int width = img.cols;
    int height = img.rows;
    int count1 = width * height;
    int channels1 = img.channels();

    Mat points(count1, channels1, CV_32F, Scalar(10));
    int index = 0;
    for (int row = 0; row < height; row++)
    {
        for (int col = 0; col < width; col++)
        {
            index = row * width + col;
            Vec3b bgr = img.at(row, col);
            points.at(index, 0) = static_cast(bgr[0]);
            points.at(index, 1) = static_cast(bgr[1]);
            points.at(index, 2) = static_cast(bgr[2]);
        }
    }
    return points;
}

int main()
{
    ChangeImgBG();

    waitKey(0);
    return 0;
}