menu

Chancel - 陷阱

rss_feed lightbulb_outline

陷阱列表(19)

Cent7OS安装指定版本MySQL方法

MySQL有许多版本,分为付费跟收费的版本,简单罗列如下

  • MySQL Community Server
    • 社区版本,开源免费,但不提供官方技术支持。
  • MySQL Enterprise Edition
    • 企业版本,需付费,可以试用30天。
  • MySQL Cluster
    • 集群版,开源免费。可将几个MySQL Server封装成一个Server。
  • MySQL Cluster CGE
    • 高级集群版,需付费。
  • MySQL Workbench(GUI TOOL)
    • 一款专为MySQL设计的ER/数据库建模工具。它是著名的数据库设计工具DBDesigner4的继任者。
  • MySQL Workbench OSS
    • MySQL Workbench社区版
  • MySQL Workbench SE
    • MySQL Workbench商用版
  • MySQL Community Server
    • 开源免费的,这也是我们通常用的MySQL的版本。根据不同的操作系统平台细分为多个版本

安装指定版本的方法也很简单

  1. MySQL官网下载合适系统版本的repo库

  2. 将下载的repo包安装到仓库

     # 先查看repo包包含哪些包
     rpm -qpl mysql80-community-release-el7-1.noarch.rpm
     # 安装repo
     rpm -ivh mysql80-community-release-el7-1.noarch.rpm
    
  3. 指定我们要的版本,编辑完成后保存即可

     # enabled=0禁用版本,enabled=1启用指定版本
     vim /etc/yum.repos.d/mysql-community.repo
    
  4. 查询已经启用的版本

     yum repolist enabled | grep mysql
    
  5. 如果输出里面有你要的版本,那就直接安装就OK了

     yum install mysql-community-server
    

DATABASE2020-01-08 14:33:37

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子类对象转换成包含外键对象的键值类型对象

PYTHON2020-01-07 17:08:15

Mariadb - 配置远程访问显示"connect reset"错误

今天在内网机器上搭建一个测试MariaDB数据库,按照习惯配置远程访问

CREATE USER chancel@chancel IDENTIFIED BY 'chancel';
GRANT ALL PRIVILEGES ON chancel_api.* TO 'chancel'@'192.168.11.13' IDENTIFIED BY 'chancel' WITH GRANT OPTION;

然后在远程机器上访问到时候弹出了connect reset,这很明显说连接到端口就被拒绝了,看了下防火墙也是打开3306的默认端口,猜测下可能是MariaDB的问题

查查3306端口的情况

chancel@chancel-nas /etc/mysql/mariadb.conf.d » netstat -ntulp | grep 3306
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
tcp        0      127.0.0.1:3306            0.0.0.0:*               LISTEN

显然说db绑定了127.0.0.1的本地端口导致外网连接不了,找一下MariaDB到配置文件,编辑‘127.0.0.1’并改成'0.0.0.0'即可

chancel@chancel-nas ~» vim  /etc/mysql/mariadb.conf.d/50-server.cnf

...
bind-address        = 0.0.0.0 # 编辑‘127.0.0.1’并改成'0.0.0.0'即可
...

DATABASE2020-01-07 17:05:19

Widnows - HTTPS双向认证客户端证书无法正常显示问题

因为工作项目牵扯到一个客户端认证,网站做了一个基本的HTTPS双向认证,测试没有问题,测试效果如下

结果正式使用之后发现部分Windows7无法在访问网站的时候正确出现证书选择,明明证书已经安装了,Google了很久也没有查到相关资料(可能自定义客户端证书用的人不多)

访问网站之后直接被判定为没有证书,效果如下

这个问题困扰了整整一周,连chrome都差编译出来看看到底里面为什么没调到证书,最后发现一个规律

在重启之后的前半分钟(不太固定)证书是能正确显示的,这个线索很重要,提示了应该是某个服务破坏了证书的验证机制,遂逐个逐个服务关掉

在关掉一个服务之后果然证书就正常了,如图

至于原因还没有找到,后面再详细看看这个服务是做什么的(但其实应该是某些流氓软件篡改了系统设置,因为测试正常安装的Windows7并没有这个问题)

Other操作系统2019-12-20 17:14:45

Gnome - 设置默认打开文件/文件夹的程序

最近Gnome从Chrome打开下载文件的文件夹总是用VSCODE打开让我惊呆了

查了一下资料,根据reddit.com提供的资料我们可以重新设置打开文件夹的工具为org.gnome.Nautilus.desktop

在终端执行

gio mime inode/directory org.gnome.Nautilus.desktop

Other操作系统2019-10-29 15:13:05

Gnome - 动画卡顿不流畅

昨天Manjaro更换下桌面系统,切换到Gnome之后感觉还不错,但有点小问题,按Super键的时候进入菜单的动画很卡顿,搜索更卡顿,只要涉及到动画部分都很卡顿

上网查找了一下,发现这个Bug提了很久但还没解决,在论坛处看到一个临时解决方案,实测是有效果的

Gnome提问问题链接:Fix for GNOME 3.24 animation stutter/lag with Nvidia

问题中描述的临时解决方案:[SOLVED] Animation lag after GNOME 3.24 Update

解决步骤

  1. 下载 PKGBUILD.zip这两个包
  2. 解压出来,切换到解压后的目录
  3. 运行makepkg -i,然后按下ALT+F2输入r点击确定重启Gnome界面

再测试动画是否依旧不流畅

Other操作系统2019-10-12 10:37:14

Fedora30 - Firewalld 9个Zones的使用

在一台实验机器上尝试了一下最新版本的Fedora(非beta版),然后使用以下设置并不能在其他机器连接Fedora的sshd服务

sudo firewall-cmd --permanent --zone=public --add-port=22/tcp
sudo firewall-cmd --reload

检查并确认了sshd服务正在运行,尝试关闭防火墙能连接,打开防火墙就无法连接,以前在低版本的Fedora上并没有遇到这种情况,尝试关闭SeLinux

sudo vim /etc/sysconfig/selinux

SELINUX=disabled

重启机器发现无效,看来不是selinux在搞事,尝试数次无果后翻搜索引擎,在官方文档中发现了猫腻

5.1. Getting Started with firewalld

原来最新版本的Firewalld已经学习Windows的网络情景模式(暂时就他妈这样叫吧,我也不知道这他妈操蛋玩意有什么好学的,而且还一次性给你分9个!)

[chancel@localhost ~]$ firewall-cmd --get-zones
FedoraServer FedoraWorkstation block dmz drop external home internal public trusted work

查阅官网,简单解释下这几个情景模式

  • drop:只管发送数据包不管收,收到就扔掉
  • block:icmp-host-prohibited和icmp6-adm-prohibited黑名单模式
  • public:公共网络,不信任局域网内任何机器
  • external:不信任来自网关的所有数据包
  • dmz:有限的公开(什么军事模式??)
  • work:用于工作区(公司网络),基本信任局域网内所有电脑
  • home:家庭网络
  • internal:内部网络(我没看出来他妈的跟work模式有什么区别)
  • trusted:完全信任(那我他妈关了不就行了!!)

借鉴学习其他系统的网络管理模式不错啊,但这9个模式是认真的吗?而且找了半天才发现怎么操作情景模式

 # 查看默认zone
[root@localhost ~]# firewall-cmd --get-default-zone     
public

# 将默认的zone修改为work
[root@localhost ~]# firewall-cmd --set-default-zone=work     
success

# 查看默认的zone
[root@localhost ~]# firewall-cmd --get-default-zone      
work

结合情景模式,你就知道怎么开放ssh了...(心力交瘁的凌晨39分)

Other操作系统2019-10-09 00:39:54

VSCODE - JavaScript格式化分号自动添加分号问题

当我们使用VSCODE自动格式化JavaScript时,通常会使用到VeTur和Prettier两款插件进行格式化,但我的项目是两个,一个基于Flask搭建的API系统(通过meta引入Vue),一个基于Vue-Cli搭建的SPA应用

这个时候设置项就很奇怪了,在非Vue文件里,需要在设置setting.json中添加如下prettier配置,可强制所有HTML文件的JavaScript不带分号

{
  "python.linting.pylintEnabled": true,
   ......
  "prettier.semi": false, // 使用prettier格式化HTML文件时不带分号  
  "prettier.singleQuote": true, // 使用prettier格式化HTML文件时强制使用单引号
   ......
}

当你的项目是Vue脚手架搭建的时候,上面的设置又是无效的,因为使用到VeTur进行格式化Vue文件,所以需要把prettier设置项引入vetur.format.defaultFormatterOptions

{
    "window.zoomLevel": 0,
    ......
    "vetur.format.defaultFormatter.js": "vscode-typescript",
    "vetur.format.defaultFormatterOptions": {
        "prettier": {
            "semi": false,          // 使用prettier格式化HTML文件时不带分号
            "singleQuote": true     // 使用prettier格式化HTML文件时强制使用单引号
        },
        ......
    },
}

JavaScript编程陷阱2019-09-27 10:45:28

Git - 分支meger与rebase的区别

meger与rebase工作场景相似,都是从一个分支获取另外一个分支的提交并合并到当前分支,但他们有细微的差别

meger rebase
创建新Commit ×
保留各个分支commit历史 ×
冲突文件需要重新添加 ×

合并时发现冲突

meger

  • 修改冲突文件
  • git commit

rebase

  • 修改冲突文件
  • git add [files]
  • git rebase --continue(或git rebase --skip)

OtherGit2019-09-24 14:09:16

Amimate.css - z-index异常失效的问题

今天工作状态不太好,发现博客无法填写留言(是不是又错过了什么?),MDUI的弹出对话框模态化阴影盖住了弹出框,仔细查看发现是所有弹出框都有这个问题,联想到最近涉及全局修改的只有添加了特效Amimate了

去掉特效之后果然就解(确)决(定)了这个问题,然后仔细看了看,经过翻资料翻文档之后并无所获,css这块一直都不熟,从搜索结果来看起来很可能是transform引起的问题

APP.VUE特效代码摘录

    <div v-bind:style="styleObject">
      <keep-alive>
        <router-view class="animated bounceInUp animate-css" v-if="$route.meta.keepAlive"></router-view>
      </keep-alive>
      <router-view  class="animated bounceInUp animate-css" v-if="!$route.meta.keepAlive"></router-view>
    </div>

用DevTools仔细查找发现了CSS类 animated 有一个animation-fill-mode的属性,这个属性为None时这个问题就消失了

所以在APP.VUE文件添加一个样式解决这个问题

.animated{
  animation-fill-mode:none
}

原因还需要再查一下

Other2019-09-09 17:47:03

搜索

分类

15 Other
1 JavaScript
2 DATABASE
1 PYTHON

标签