menu

Chancel - 技巧

rss_feed lightbulb_outline

技巧列表(49)

ArchLinux - Manjaro创建交换区文件并设置休眠

设置Manjaro的休眠分为三步,第一步是创建swapfile交换区,第二步是修改引导内核,第三步则是修改HOOKS钩子

第一步我们需要创建swapfile文件区(如果是swap分区,请参考本文结合资料引用处的ArchWiki进行设置)

# 查看swap分区信息(没有设置则没有输出)
swapon --show

# 创建大小为0的文件
sudo truncate -s 0 /swapfile

# 使用fallocate 创建指定大小的文件(单位M或者G)
# 1. 如果文件系统不是F2FS,使用下面的命令即可
sudo fallocate -l 32G /swapfile
# 2. 如果文件系统是F2FS,使用下面的命令
dd if=/dev/zero of=/swapfile bs=1G count=32 status=progress

# 授权并格式化
sudo chmod 600 /swapfile
sudo mkswap /swapfile

# 启用swap
sudo swapon /swapfile

# 查看swap分区信息(如有输出则说明成功)
swapon --show

sudo vim /etc/fstab

# 开机挂载swapfile文件
/swapfile none swap defaults 0 0

第二步我们获取swapfile文件所在分区UUID与swapfile文件的偏移量

# 查询所有分区的UUID
sudo lsblk -f
# 查询swapfile文件的偏移量,第一行的physical_offset即为偏移量
sudo filefrag -v /swapfile

利用已知的分区UUID以及文件偏移量,我们重新设置内核参数并生成grub引导

sudo vim /etc/default/grub

# 假设原来的GRUB_CMDLINE_LINUX_DEFAULT值为
GRUB_CMDLINE_LINUX_DEFAULT=”quiet intel_pstate=enable”
# 修改后的值内容(其实就是追加到GRUB_CMDLINE_LINUX_DEFAULT值后面)
GRUB_CMDLINE_LINUX_DEFAULT=“quiet intel_pstate=enable resume=UUID=[前面swapfile文件所在分区的UUID]resume_offset=[swapfile文件的偏移量]" 

 sudo update-grub

第三步配置initramfs的resume钩子并重新生成 initramfs 镜像

sudo vim /etc/mkinitcpio.conf

# 假设原来HOOKS的值如下
HOOKS="base udev autodetect modconf block filesystems keyboard fsck"
# 修改后的值如下(假如使用lvm分区,则要注意将resume放到lvm后面
HOOKS="base udev resume autodetect modconf block filesystems keyboard fsck"

# 重新生成initramfs镜像(51是我的Linux内核版本号,可以使用uname -a查看)
mkinitcpio -p linux51

此时休眠就可以正常使用了

资料参考

休眠设置 - Arch Wiki

swap - Arch wiki

其他技巧Linux Server2019-10-12 14:13:08

Python - Flask SQLAIchemy 给Model对象增加一个转换所有对象属性(包括外键表)为键值类型的方法to_dict()

后台项目使用SQLAIchemy作为ORM框架,为了方便直接返回数据对象,在Model处加了一个自定义的 to_dict方法

to_dict方法将所有的colunm转换成键值类型

这样一来,根据条件查询结果之后只需要直接 to_dict() 并dump成Json即可返回给前台所有数据对象

示例代码如下

from flask_sqlalchemy import SQLAlchemy
Model = SQLAlchemy().Model
Model.to_dict = lambda self: {c.name: getattr(self, c.name, None) for c in self.__table__.columns}

# 文章类型表
class TArticleType(Model):
    __tablename__ = 't_article_type'

    id = Column(INTEGER(3), primary_key=True)
    t_type = Column(String(255), nullable=False)

# 文章表
class TArticle(Model):
    __tablename__ = 't_articles'

    id = Column(INTEGER(10), primary_key=True)
    a_title = Column(String(50), nullable=False)
    a_type = Column(ForeignKey('t_article_type.id'),
                    nullable=False, index=True)
    update_time = Column(DateTime)

    t_article_type = relationship('TArticleType')

但这样有个缺陷,我返回文章列表的时候,前台需要根据 a_type 的值再次请求查询文章类型名称,后台需要增加接口提供给前台查询对应ID的文章类型名称

显而易见,在查询文章的时候,我希望直接返回文章的类型信息(包括id和类型名称),一开始做的方案是直接在查询的时候手动添加一次查询文章类型表的操作,如下

articles = TArticle.query.filter().order_by(desc(table_obj.id)).limit(10)
for art in articles:
    art.a_type = TArticleType.query.filter(TArticleType.id == art.a_type).first()
_list = []
for _new in articles:
    _list.append(_new.to_dict())
return json.dumps(_list, ensure_ascii=False, default=lambda obj: obj.__dict__)

然而分页已经做了全局封装,没有机会这样手动修改返回对象代码,更多的情况是调用封装好的分页方法将对象传进去,如下

 return get_table_page_data(TArticle)

即使我们修改了 get_table_page_data 方法,还需要修改to_dict()方法,目前to_dict()方法只是转换了所有的colunm,并不包含自定义元素

那么既然要修改to_dict方法,不如直接在to_dict里将外键列表也转换成一个属性,代码如下

def to_dict(self):
    _dict = {}
    for c in self.__table__.columns:
        _dict[c.name] =  getattr(self, c.name, None)
    # 循环遍历属性,获取Model对象的属性
    for attr in dir(self):
        if isinstance(getattr(self,attr),Model):
            _dict[attr] = getattr(self,attr).to_dict()
    return _dict

Model.to_dict = to_dict

至此,完成了一个自动将Model子类对象转换成包含外键对象的键值类型对象

后端技术Program Language2019-11-22 12:29:32

Wol - 远程唤醒计算机

经常做过Wol远程唤醒,但没细究过里面的设置,这里归纳一下如何设置以及为什么要这样设置,以一台Windows10的机器为例子

首先我们需要更改BIOS设置,大部分情况下只需要注意打开有以下关键字的选项为Enabled状态即可

  • Wake on lan

其次是开机后在Windows10里,按Win+X打开快捷菜单,按M打开设备管理器,找到网络设配器并展开,选择你的网卡,有线网卡通常是Realtek开头的,右键打开属性对话框,选择选项卡电源管理

勾选如下两个选项

  • 允许计算机关闭此设备以节约电源(这里可以理解为接管网卡电源)
  • 允许此设备唤醒计算机

可选选项

  • 只允许幻数据包唤醒计算机(不勾选则任何数据包都可以激活你的电脑,勾选则只允许魔术包激活你的计算机)

再选中高级选项卡,查看以下两个值,确保是 Enabled状态

  • Wake on Magic Packet
  • Wake on pattern match

确保下面这个选项是 Disabled状态(有些计算机没有这个选项也很正常,注意,此选项若是启用,则在关机一段时间后无法唤醒)

  • Wake on lan after shutdown

关机后,查看网口提示灯是否亮着,如果亮着则说明设置成功,但请注意如果网口提示灯没有亮并不代表失败!

有些机型是默认设置即使开启WOL唤醒网口提示灯也不会亮的,我们需要尝试使用唤醒计算机来最终确认是否设置成功

发送WOL包的方法很多,这里以Ubuntu 18.04为例子,安装etherwake并发送wol包

chancel@chancel-nas ~ » sudo apt install etherwake                                                                                                                                      100 ↵ Reading package lists... Done
Building dependency tree
Reading state information... Done
...
Processing triggers for man-db (2.8.3-2ubuntu0.1) ...
chancel@chancel-nas ~ » ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 70:85:c2:82:20:27 brd ff:ff:ff:ff:ff:ff
    inet 192.168.11.11/24 brd 192.168.11.255 scope global enp1s0
       valid_lft forever preferred_lft forever
    inet6 fe80::7285:c2ff:fe82:2027/64 scope link
       valid_lft forever preferred_lft forever
chancel@chancel-nas ~ » sudo etherwake -i enp1s0 -b 3C:97:3E:E0:01:DC

其他技巧2019-11-10 23:42:51

Webmin - 基于Web网站的系统管理工具

Webmin is a web-based system administration tool for Unix-like servers, and services with over 1,000,000 installations worldwide. Using it, it is possible to configure operating system internals, such as users, disk quotas, services or configuration files, as well as modify, and control open-source apps, such as BIND DNS Server, Apache HTTP Server, PHP, MySQL, and many more.

强大而灵活的基于Web的服务器管理控制面板

个人一直很喜欢宝塔面板,但出于对国产软件的无信心,一直想找一款类似的程序(开源更好)来替代宝塔面板,无意间发现了Webmin如获至宝!

安装方法也很简单,Linux大部分发行版直接运行 setup.sh 按照提示一步一步安装

Webmin - Powerful and flexible web-based server management control panel

由于支持主题更改(重点!)所以界面UI选择空间非常大,这里可以参考以下二款主题!

Official theme for the best server management panel of the 21st Century

BWTheme - A simple and beautiful theme for Webmin and Usermin made using Bootstrap and Font Awesome

Web网站Linux Server2019-10-30 11:12:11

Nounplus/Grammar Check Online.. - 英文语法检查工具

Smart Grammar Checker Online Tool free - nounplus

  • 一款在线web检查英文语法工具

gingersoftware

  • 支持多个平台的英文语法检查工具

Grammarly Spell Checker - Chrome插件

  • Chrome扩展插件检查英文语法

以上均为工具,仅适用于英文不太好的水平

Web网站English2019-10-17 16:04:40

Git - Bash脚本判断本地仓库代码是否需要更新

今晚找到一个不错的脚本,在这里分享一下

#!/bin/sh

UPSTREAM=${1:-'@{u}'}
LOCAL=$(git rev-parse @)
REMOTE=$(git rev-parse "$UPSTREAM")
BASE=$(git merge-base @ "$UPSTREAM")

if [ $LOCAL = $REMOTE ]; then
    echo "Up-to-date"
elif [ $LOCAL = $BASE ]; then
    echo "Need to pull"
elif [ $REMOTE = $BASE ]; then
    echo "Need to push"
else
    echo "Diverged"
fi

执行这个脚本就可以获取到Github远程仓库与本地仓库的版本差别

注意git的旧版本不允许使用@,所以你可能需要使用@ {0}

后端技术Git2019-10-16 17:49:36

Vim - 忘记sudo之后如何保存需要root权限的文件?

在Linux下编辑文件保存时经常会遇到

"readonly-file-name" E212: Can't open file for writing

这个时候就很尴尬了,尤其是修改很大的文件,无法保存是一件头疼的事情,一般这种情况下你只好先另存文件再重新打开编辑文件,对于只是忘了敲sudo命令来说这样的操作太过于繁琐了

其实Vim是支持在编辑状态下直接获取Root权限而无需退出Vim的,只需要在Vim里执行这行命令即可

:w !sudo tee %

后端技术Linux Server2019-10-16 17:49:16

Git Stash - 不提交代码保存当前代码的修改并切换分支进行其他工作

Git 工具 - 储藏(Stashing)

经常有这样的事情发生,当你正在进行项目中某一部分的工作,里面的东西处于一个比较杂乱的状态,而你想转到其他分支上进行一些工作。问题是,你不想提交进行了一半的工作,否则以后你无法回到这个工作点。解决这个问题的办法就是git stash命令。

重点

  • git stash: 备份当前的工作区的内容,从最近的一次提交中读取相关内容,让工作区保证和上次提交的内容一致。同时,将当前的工作区内容保存到Git栈中
  • git stash pop: 从Git栈中读取最近一次保存的内容,恢复工作区的相关内容。由于可能存在多个Stash的内容,所以用栈来管理,pop会从最近的一个stash中读取内容并恢复
  • git stash list: 显示Git栈内的所有备份,可以利用这个列表来决定从那个地方恢复
  • git stash clear: 清空Git栈

例子

# chancel @ chancel-cp in /tmp/stash on git:master o [12:04:03] 
$ git status
On branch master
nothing to commit, working tree clean

# chancel @ chancel-cp in /tmp/stash on git:master o [12:05:11] C:130
$ echo "I'm fine,fuck you" > hello.py

# chancel @ chancel-cp in /tmp/stash on git:master x [12:05:17] 
$ ll
total 8.0K
-rw-r--r-- 1 chancel chancel  4  9月  6 12:03 123.txt
-rw-r--r-- 1 chancel chancel 18  9月  6 12:05 hello.py

# chancel @ chancel-cp in /tmp/stash on git:master x [12:05:18] 
$ git add .

# chancel @ chancel-cp in /tmp/stash on git:master x [12:05:21] 
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   hello.py


# chancel @ chancel-cp in /tmp/stash on git:master x [12:05:24] 
$ git stash
Saved working directory and index state WIP on master: a404cee first commit

# chancel @ chancel-cp in /tmp/stash on git:master o [12:05:37] 
$ git status
On branch master
nothing to commit, working tree clean

# chancel @ chancel-cp in /tmp/stash on git:master o [12:05:41] 
$ ll     
total 4.0K
-rw-r--r-- 1 chancel chancel 4  9月  6 12:03 123.txt

# chancel @ chancel-cp in /tmp/stash on git:master o [12:05:54] 
$ echo "hello" > hello.txt

# chancel @ chancel-cp in /tmp/stash on git:master x [12:06:17] 
$ ll 
total 8.0K
-rw-r--r-- 1 chancel chancel 4  9月  6 12:03 123.txt
-rw-r--r-- 1 chancel chancel 6  9月  6 12:06 hello.txt

# chancel @ chancel-cp in /tmp/stash on git:master x [12:06:21] 
$ git add hello.txt 

# chancel @ chancel-cp in /tmp/stash on git:master x [12:06:26] 
$ git stash
Saved working directory and index state WIP on master: a404cee first commit

# chancel @ chancel-cp in /tmp/stash on git:master x [12:07:20] 
$ ll
total 8.0K
-rw-r--r-- 1 chancel chancel 4  9月  6 12:03 123.txt
-rw-r--r-- 1 chancel chancel 6  9月  6 12:07 hello.txt


# chancel @ chancel-cp in /tmp/stash on git:master x [12:07:45] 
$ git stash pop
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   hello.txt

Dropped refs/stash@{0} (b9963709ffa5959d2341b31378d9b3457a2b9798)

# chancel @ chancel-cp in /tmp/stash on git:master x [12:07:56] 
$ ll
total 8.0K
-rw-r--r-- 1 chancel chancel 4  9月  6 12:03 123.txt
-rw-r--r-- 1 chancel chancel 6  9月  6 12:07 hello.txt

# chancel @ chancel-cp in /tmp/stash on git:master x [12:07:58] 
$ git stash pop
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   hello.py
    new file:   hello.txt

Dropped refs/stash@{0} (172bdcff963c2786becbb9acd526d968b279b3e0)

# chancel @ chancel-cp in /tmp/stash on git:master x [12:08:02] 
$ ll
total 12K
-rw-r--r-- 1 chancel chancel  4  9月  6 12:03 123.txt
-rw-r--r-- 1 chancel chancel 18  9月  6 12:08 hello.py
-rw-r--r-- 1 chancel chancel  6  9月  6 12:07 hello.txt

后端技术Git2019-10-16 17:48:46

Windows - 快速定位占用端口程序

使用netstat -aon|findstr <port>即可可以查询到占用端口程序的PID

使用tasklist|findstr <pid>即可看到占用程序的相关信息

PS C:\Users\ycs10> netstat -aon|findstr "3389"
  TCP    0.0.0.0:3389           0.0.0.0:0              LISTENING       1380
  TCP    192.168.11.193:9434    192.168.11.155:3389    ESTABLISHED     4088
  TCP    192.168.11.193:11526   192.168.11.214:3389    ESTABLISHED     4088
  TCP    [::]:3389              [::]:0                 LISTENING       1380
  UDP    0.0.0.0:3389           *:*                                    1380
  UDP    [::]:3389              *:*                                    1380
PS C:\Users\ycs10> tasklist|findstr "1380"
svchost.exe                   1380 Services                   0     15,464 K
chrome.exe                   13808 Console                    1     13,440

其他技巧CMD Shell2019-10-16 17:47:41

“crontab -e” 的使用

crontab -e 与 修改/etc/crontab文件的格式是有差异的

# /etc/crontab文件 定时每天早上5点使用root用户执行脚本
0  5  *  *  * root bash /opt/script/xswl.sh

# crontab -e指令直接进入vi编辑模式,不再需要填写用户,因为这是当前用户的定时任务
0 5 * * * bash /opt/script/xswl.sh

添加之后两者均要检查

  • crond服务是否已经运行
  • 脚本"xswl.sh"是否有执行权限

后端技术Linux Server2019-10-16 17:46:07

搜索

分类

3 Web网站
5 Github Star
24 工具软件
5 其他技巧
12 后端技术

标签