安装Samba用于本地文件分享

Samba安装

1
2
sudo apt update
sudo apt install samba

配置用户,为用户设置密码

1
sudo smbpasswd -a [user]

编辑配置文件

1
sudo vi /etc/samba/smb.conf

在配置文件末尾增加一段需要分享的目录设置

1
2
3
4
5
6
7
8
[ShareData]
comment = share folder
path = /path/data
available = yes
browseable = yes
writeable = yes
read only = no
valid users = [user]

[ShareData]是访问分享文件时显示的分享名称;path指向分享文件的真实路径;[user]为访问分享文件的用户名,跟上面设置密码时的用户名一致;这一段可以重复添加,有几处需要分享就可以添加几次,保证每个分享名称不一样就可以了。

重启Samba服务

1
sudo service smbd restart

接下来就可以从局域网其他客户端smb://IP访问分享的文件了。

Xcode命令行工具Command Line Tools

一般Xcode安装后,第一次打开时,会弹窗提示安装Command Line Tools,直接安装即可。

如果当时没有安装,后面也可以单独安装。

1
2
3
xcode-select --install	// 安装命令

xcode-select --version // 查看版本

有时Command Line Tools出了问题,可以先尝试恢复默认设置来解决:

1
2
// 恢复默认设置(需要sudo权限)
sudo xcode-select --reset

还是解决不了,可以考虑删掉后重新安装:

1
2
3
4
5
// 强制删除安装目录下的文件
sudo rm -rf /Library/Developer/CommandLineTools

// 重新安装
xcode-select --install

除了终端命令的安装方式,也可以到苹果开发者官网的下载专区搜索Command Line Tools并下载安装包。你也可以去xcodereleases网站找到各种版本Xcode的下载链接。

Qt生成缩略图片存入sqlite

Qt生成缩略图片存入sqlite

新建一个工程pro文件中加入 QT += sql 添加sql支持。

>folded
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
// main.cpp

#include <QApplication>
#include <QtGui>
#include <QSqlDatabase>
#include <QSqlError>
#include <QSqlQuery>

int main(int argc, char *argv[])
{
QApplication a(argc, argv);

//添加数据库,不表
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", "conn1");
db.setDatabaseName("/home/htux/thumbs.sqlite");
if(!db.open()) return 1;

QByteArray baImage;

QString filename = "/home/htux/file2.jpg";
QPixmap pixmapIn(filename);

QBuffer buffer(&baImage);
buffer.open(QIODevice::WriteOnly);

QPixmap pixmapSmall;
//让生成的缩略图高宽都不超过256.
pixmapSmall = pixmapIn.scaled(256,256,
Qt::KeepAspectRatio, Qt::SmoothTransformation);
//保存生成的缩略图到ByteArray, 格式为JPG, 图片质量50.
//图片质量的取值Qt文档中没查到,不过按照国际惯例应该是0-100
//保存几个不同质量的图片看看差别
pixmapSmall.save(&buffer, "JPG",50);
pixmapSmall.save("/home/htux/file2.png", "PNG");
pixmapSmall.save("/home/htux/file2-5.jpg", "JPG", 20);
pixmapSmall.save("/home/htux/file2-5.jpg", "JPG", 50);
pixmapSmall.save("/home/htux/file2-8.jpg", "JPG", 80);

QSqlQuery query(db);

query.exec("CREATE TABLE thumbs "
"(id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,"
" filename VCHAR(20) , thumbnail BLOB);");

QString sql = QString("INSERT INTO thumbs VALUES "
"( NULL , :filename, :thumbnail );");

query.prepare(sql);
query.bindValue(":filename", filename);
query.bindValue(":thumbnail", baImage);

query.exec();

query.exec("select * from thumbs;");

//跳到最后存入的记录
if (!query.last()) return 1;

QPixmap pixmapOut;
//读出存入的图片
pixmapOut.loadFromData(query.value(2).toByteArray());

db.close();
//把图片用Label显示出来.
QLabel label;
label.setPixmap(pixmapOut);
label.show();

return a.exec();
}

QLineEdit获取焦点后全选字符/失去焦点清除选择

一直觉得Chrome的地址栏的体验非常好,获取焦点后自动全选,无论是想复制地址还是重新输入新的地址都帮我们省掉了一步,如何用QLineEdit实现这个特点呢。

网上搜索了一下,发现一篇博客http://www.cnblogs.com/91program/p/5521420.html ,但是这篇博客讲述的方法有点复杂,最后还要通过延时来达到目的,有点怪异。

最后只得查看QLineEdit的类参考仿照Chrome实现,Chrome的地址栏在无焦点状态下鼠标按下不动的时候,地址栏获取了焦点,光标位于鼠标位置;鼠标无移动释放,全选地址栏字符;再次单击,清除全选;鼠标按下移动后释放,则不会全选,而是选择字符;地址栏失去焦点,清除选择。

看起来我们需要判断鼠标按下时的位置与鼠标释放时鼠标有没有移动,申请一个变量m_pressPos来存储鼠标按下时的位置。还需要知道鼠标单击的时候QLineEdit是否已获得焦点,我们用变量m_onFocus来记录。定义一个QLineEdit子类,然后重新实现mousePressEvent,mouseReleaseEvent,focusOutEvent。

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#ifndef URLLINEEDIT_H
#define URLLINEEDIT_H

#include <QLineEdit>

class UrlLineEdit : public QLineEdit
{
Q_OBJECT
public:
UrlLineEdit(QWidget *parent = 0);
~UrlLineEdit();
protected:
void mouseReleaseEvent(QMouseEvent *e);
void mousePressEvent(QMouseEvent *e);
void focusOutEvent( QFocusEvent * e );
private:
bool m_onFocus;
QPoint m_pressPos;
};
#endif // URLLINEEDIT_H

#include "urllineedit.h"
#include <QFocusEvent>

UrlLineEdit::UrlLineEdit(QWidget *parent)
:QLineEdit(parent),
m_onFocus(false)
{

}

UrlLineEdit::~UrlLineEdit()
{

}
void UrlLineEdit::mouseReleaseEvent(QMouseEvent *e)
{
if (e->button() == Qt::LeftButton ){
if( e->pos() == m_pressPos && !m_onFocus){
m_onFocus = true;
selectAll();
update();
} else {
int start = cursorPositionAt(m_pressPos);
setSelection( start , cursorPositionAt(e->pos())-start );
}
}
QLineEdit::mouseReleaseEvent(e);

}

void UrlLineEdit::mousePressEvent(QMouseEvent *e)
{
if (e->button() == Qt::LeftButton){
m_pressPos = e->pos();
setCursorPosition(cursorPositionAt(m_pressPos));
}
QLineEdit::mousePressEvent(e);
}

void UrlLineEdit::focusOutEvent(QFocusEvent *e)
{
m_onFocus = false;
if(!hasSelectedText()){
deselect();
}
QLineEdit::focusOutEvent(e);
}

通过测试基本上是实现了类似Chrome的这个特性。

macOS系统使用技巧

1.tree命令

自定义

mac下默认是没有 tree命令的,不过我们可以使用find命令模拟出tree命令的效果,如显示当前目录的 tree 的命令:

1
$ find . -print | sed -e 's;[^/]*/;|____;g;s;____|; |;g'

当然你也可以写一个别名来快速执行该命令,运行如下命令,将上面这个命令写到~/.bash_profile里,以后直接运行tree命令就更方便了:

1
alias tree="find . -print | sed -e 's;[^/]*/;|____;g;s;____|; |;g'"

安装tree命令行工具

也可以使用 homebrew 安装 tree 命令行:brew install tree

这样就在你的mac上安装了 tree 命令行了。

tree命令行参数(只实用与安装了tree命令行工具):

  • -a 显示所有文件和目录。
  • -A 使用ASNI绘图字符显示树状图而非以ASCII字符组合。
  • -C 在文件和目录清单加上色彩,便于区分各种类型。
  • -d 显示目录名称而非内容。
  • -D 列出文件或目录的更改时间。
  • -f 在每个文件或目录之前,显示完整的相对路径名称。
  • -F 在执行文件,目录,Socket,符号连接,管道名称名称,各自加上”*”,”/“,”=”,”@”,”|”号。
  • -g 列出文件或目录的所属群组名称,没有对应的名称时,则显示群组识别码。
  • -i 不以阶梯状列出文件或目录名称。
  • -I 不显示符合范本样式的文件或目录名称。
  • -l 如遇到性质为符号连接的目录,直接列出该连接所指向的原始目录。
  • -n 不在文件和目录清单加上色彩。
  • -N 直接列出文件和目录名称,包括控制字符。
  • -p 列出权限标示。
  • -P 只显示符合范本样式的文件或目录名称。
  • -q 用”?”号取代控制字符,列出文件和目录名称。
  • -s 列出文件或目录大小。
  • -t 用文件和目录的更改时间排序。
  • -u 列出文件或目录的拥有者名称,没有对应的名称时,则显示用户识别码。
  • -x 将范围局限在现行的文件系统中,若指定目录下的某些子目录,其存放于另一个文件系统上,则将该子目录予以排除在寻找范围外。

2.改变APP图标

最近发现有些APP图标实在是难看,忍不住想换个标,就在网上查了下资料,MacOS系统提供了生成icns的命令,我们需要准备一张png的图,这张图最小要1024*1024的分辨率。

制作步骤:

  1. 找图
    找一张分辨率1024*1024的png图片

  2. 建图片集目录
    打开终端输入以下命令:
    mkdir xxx. iconset
    注意:必须以.iconset后缀结尾

  3. 转换图片
    把原图片转为不同大小的图片,并放入上面的创建的目录中
    sips -z 16 16 pic.png –out xxx.iconset/icon_16x16.png
    sips -z 32 32 pic.png –out xxx.iconset/icon_16x16@2x.png
    sips -z 32 32 pic.png –out xxx.iconset/icon_32x32.png
    sips -z 64 64 pic.png –out xxx.iconset/icon_32x32@2x.png
    sips -z 128 128 pic.png –out xxx.iconset/icon_128x128.png
    sips -z 256 256 pic.png –out xxx.iconset/icon_128x128@2x.png
    sips -z 256 256 pic.png –out xxx.iconset/icon_256x256.png
    sips -z 512 512 pic.png –out xxx.iconset/icon_256x256@2x.png
    sips -z 512 512 pic.png –out xxx.iconset/icon_512x512.png
    sips -z 1024 1024 pic.png –out xxx.iconset/icon_512x512@2x.png
    @2x 的是为retina屏准备的,以上命令执行完后去目录里看下图片是否生成好了

  4. 生成图标
    这一步就是制作icns的最后一步了
    在命令行中输入一下命令
    iconutil -c icns xxx.iconset -o xxx.icns
    这时,目录中就会出现你要的icns图标文件了

  5. 替换图标
    在应用程序中找到想要替换的APP,右键,显示简介,然后把刚才的icns文件拖到简介里就可以了,替换完了之后需要把APP退出后才能看到新的图标。

批量制作

可以把制作过程写成一个shell文件,保存成.sh文件,这样就可以批量生成不同大小的图片并执行iconutil命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#!/bin/sh
if [ x"$1" = x ]; then
echo "\033[31m 请输入要转换的图片全名(PNG格式的图片) \033[0m"
exit
fi
echo $1
newstr=$(tr '[A-Z]' '[a-z]' <<<"$1")
if [[ $newstr != *.png ]]; then
echo "\033[31m 图片不是png格式 \033[0m"
exit
fi

if [ x"$2" = x ]; then
echo "\033[31m 请输入iconset目录(命名方式xxx.iconset, 务必以 .iconset 结尾) \033[0m"
exit
fi

if [[ $2 != *.iconset ]]; then
echo "\033[31m iconset目录命令不规范 \033[0m"
exit
fi
# 生成的图片名
name_array=("icon_16x16.png" "icon_16x16@2x.png" "icon_32x32.png" "icon_32x32@2x.png" "icon_128x128.png" "icon_128x128@2x.png" "icon_256x256.png" "icon_256x256@2x.png" "icon_512x512.png" "icon_512x512@2x.png")
#尺寸
size_array=("16" "32" "32" "64" "128" "256" "256" "512" "512" "1024")

# 创建 iconset 目录
if [ ! -d $2 ]; then
mkdir $2
fi

for ((i = 0; i < ${#name_array[@]}; ++i)); do
m_dir=$2/${name_array[i]}
sips -z ${size_array[i]} ${size_array[i]} $1 --out $m_dir
done
# 生成icns 命令
iconutil -c icns $2 -o ${2%*".iconset"}.icns
# 生成完之后删除 iconset 文件夹
rm -rf $2;

图标下载

当然,你也可以去下载现成的 macOS Big Sur - Replacements Icons

图标还原

如果想恢复成默认图标,只需要在对应的APP图标上“右键”>“显示简介”,然后选中左上角的图标,按delete键就好了

3 关于.DS_Store 文件

阻止 DS_Store 文件的自动生成

DS_Store 文件是由系统自动创建的,它的存在有时候会对某些场景下的用户体验产生一些负面的影响。

为了加快网络磁盘的浏览速度,苹果提供了针对通过SMB共享的网络磁盘上DS_Store文件的阻止生成方案:

  1. 在「访达」中打开「应用程序」 > 「实用工具」 > 「终端」。

  2. 输入以下命令:

1
defaults write com.apple.desktopservices DSDontWriteNetworkStores -bool TRUE
  1. 然后退出登录 macOS 账户并重新登录。

要重新启用,请输入以下命令:

1
defaults write com.apple.desktopservices DSDontWriteNetworkStores -bool FALSE

但是,以上命令只是针对网络磁盘,想要阻止本地磁盘中 DS_Store 文件的自动生成?

唯一的方式就是停止使用「访达」,不过我想大家应该不会考虑这么做。

如何删除 DS_Store 文件

首先,要声明的一点是,删除 DS_Store 文件完全是安全的操作,它不会损害电脑,也不会造成个人数据丢失。删除后,「访达」在打开文件夹是会以默认显示模式显示文件夹。在你进行某些「访达」操作后,系统又会在后台自动创建 DS_Store 文件。

如果你想删除 DS_Store 文件,可以通过「终端」App 进行删除。

  1. 在「访达」中打开「应用程序」> 「实用工具」 > 「终端」。
  2. 定位到你要删除 .DS_Store 文件的文件夹目录下。
  3. 在「终端」里输入cd命令,跟上你的目录文件夹路径,例如: cd /Users/username/pictures
  4. 回车。
  5. 输入命令 find . -name '.DS_Store' -type f -delete
  6. 再次回车。

到这里,当前文件夹目录下的所有 .DS_Store 文件都会消失。

让你的各种网络密码无法被人破解

让你的各种网络密码无法被人破解

互联网产品各种各样,我们也就拥有了各种各样的帐号密码。网银密码,网站密码等等,大家一般化为了好记,都设置同一个密码,或者很简单的密码。这样就造成自己的帐号被黑客窃取。密码要想不被黑客猜中,有几点非常重要的注意事项

1、不要靠字典中的单词:如果你的密码可以在单词书中找到,那就和没有一样。黑客们经常借助词典以及词汇的变体测试密码.如果你不属于这一类,他们通常就会放弃。

2、一个密码绝对不要使用两次:人们喜欢在不同的网站使用同一密码,这可让黑客有了可乘之机。如果你的LinkedIn账户遭泄露,可能没什么损失;但他们会利用该密码尝试你的电子邮箱、银行账户等一切存储资产及重要个人数据的地方。

3、设置密码短语。密码越长,破解的时间也越长。如果不想让黑客在24小时内能破解你的密码,密码长度应该超过14个字符。因为长密码难于记忆,可考虑用喜欢的电影台词、歌词或一首诗的首字母拼接在一起。

4、胡乱敲击键盘:对于敏感的账户,格罗斯曼先生建议随机乱敲键盘,并间或敲击Shift和Alt键,然后将结果复制到一个文本,存入一个有密码保护的U盘。

5、安全存储你的密码。不要将密码放在收件箱或桌面。如果恶意软件感染电脑,你就完蛋了。格罗斯曼先生将密码文件存入加密U盘,使用帐户时,他把这些密码复制粘贴过去。即便黑客利用键盘记录软件,同样无法捕捉到他的密码。科克先生则把密码提示保存一张纸上,把敏感的信息和互联网彻底隔离。

6、不要依赖密码管理器。密码保护软件可使用户将所有用户名和密码存储在同一区域。有些程序还能为你创建强大的密码,只要你输入主密码,就能帮你自动登录网站。如LastPass、SplashData和AgileBits等等。科克先生认为,即使加密后,密码仍然留在计算机里。如果电脑遭到盗窃,等于丢失所有密码。而且密码管理器不一定靠谱,今年初在阿姆斯特丹举行的安全会议上,黑客们就演示了破解手机密码管理器的技术。

7、安全问题最好答非所问。网站的验证问题经常问道“你最喜欢什么颜色?”“你在哪所中学就读?”,这些问题的答案局限性太大,很容易在互联网上找到。今年初,一名黑客利用米特?罗姆尼(Mitt Romney)最喜欢的宠物的名字破解其Hotmail和Dropbox帐户。比较安全的做法是密码提示和问题无关。如果安全问题问出生医院的名称,你的回答可以是最喜欢的歌词。

8、使用不同的浏览器。不同的网络活动要用不同的浏览器。选择一个浏览器做乱七八糟的事情,如浏览网上论坛、新闻网站、博客等不重要的事情。第二个浏览器用于登录网上银行或收发电子邮件。这样浏览器被攻击后,银行帐户就不一定会泄露。Accuvant Labs去年研究发现,在其所调查的火狐、谷歌Chrome及微软Internet Explorer浏览器中,Chrome最安全。

9、别乱分享你的信息。不要经常利用真实的E-mail地址注册网上帐户。很多“一次性”e-mail地址是最佳选择,如10minutemail.com提供的地址,用户注册、确认在线账户后,这些电子邮件地址会自我销毁。

10、输入任何密码之前一定要搞清楚你当前访问的地址是你想要访问的地址,特别是现在的应用总喜欢用内置的浏览器打开网址,像微信、各个邮箱客户端,打开的网站并不会显示url地址,这样很容易就会碰到李鬼而没有发现。博主最近邮件收到一封自称是纪委的调查邮件,附件是一张二维码,扫码后转到到网易邮箱登录界面,因为是微信打开的网址,所以没有显示地址,用浏览器打开后发现是李鬼,随便用一个账号密码登录之后显示密码错误,然后就转跳到李逵哪里去了。

地址访问截图

最后分享一下我的密码设置规则:

我的网络账户被分为3个等级:

1 普通账户,用在一些普通论坛上,比如某一天搜到一个需要的文件在一个论坛里,但是必须注册账户才能下载,这时候就可以用普通账户,可以选择一个统一的账户名和密码,我的用户名就是redtux,密码是好多年前在一个网站上看到的一句话的首字母缩写。用户名要选择一个不容易重复的,我的这个组合用了10多年了,很多时候在一个网站注册的时候发现用户名已经注册了,我就用我的固定账户密码登录就可以进去了。

2 知名一点的账户,QQ,微信,百度,网易之类,用普通账户的密码跟对应网站的名字组合,比如网易密码可以是 普通密码@WangYi,你只要记住一个固定的组合规则,登录的时候就自动能生成密码。

3 涉及财产安全的,银行类,支付宝类的,方法同2,但是生成规则更复杂一点,比如可以加入更多的特殊符号。

这样子就只要记住一个密码和2种规则,就能保证所有账户的密码都不一样,如果其中一个网站被暴库也能保证其他网站的账号安全。