html还原设计图开发心历路程

准备开发环境

开发工具: vscode
插件

photoshop: 用于查看设计图稿字体,字体大小,间距

从设计图稿入手,寻找组件

横向列表:

Read more   2021/7/7 posted in  大前端

用sketch原型工具3秒制作一个按钮

效果参考如下

第一秒:画一个矩形,填充圆角和绿色

矩形

圆角和绿色

取消掉边框

第二秒:填充文字,注意参考线居中对齐

第三秒:欣赏成果

2021/6/2 posted in  sketch

三分钟制作一个iOS全局弹窗

效果图如下:

分析所需的ui元素

元素 样式 控件
弹窗标题 黑色加粗 UILabel
弹窗内容 灰色正常 UILabel
关闭按钮 红底白字圆角 UIButton
弹窗白底 白底圆角 UIView
弹窗半透明背景 黑色半透明 UIController>UIView
Read more   2021/5/21 posted in  iOS 三分钟系列

OSX使用代码代替storyboard构建项目,并添加NSSplitView组件

众所周知,storyboard能够加速界面开发,但在项目变大时,其会出现难以维护的窘境,这种情况下去storyboard就是必经之路了

创建案例项目

删除项目设置中引用的Main.storyboard

删除Main.storyboard文件,效果如下

Read more   2020/12/17 posted in  mac&ios

linux系统编程之多进程和管道(pip)

管道一般用于linux程序进程间通信

创建进程

fork()函数

#include <stdio.h>

void main()
{
    if (fork())
      printf("PARENT\n");                                                                                                         
    else
      printf("CHILD\n");
}

fork()执行后,当前进程将被复制出一个新的进程,返回值非0表示仍在父进程执行,返回0表示程序执行已进入子进程内,执行效果参考如下

可以看到父子进程的代码都被执行了

Read more   2020/9/20 posted in  系统编程

三分钟上手java多线程控制技术

java相比python、php等脚本语言一个非常重要的区别就是java拥有真正的多线程控制技术,掌握多线程技术对于使用java语言至关重要

默认行为

  • 主线程会等待所有子线程执行完成后退出
  • 多个线程无序执行

创建线程

实现Runnable接口,在线程中执行的代码放到Runnable接口实现中,为实现类起个名字比如MyRunner:

public class MyRunner implements Runnable {
    @Override
    public void run() {
      // 在线程中执行的代码
      System.out.println("running in a thread, name: " + Thread.currentThread().getName());
    }
}

创建线程对象java.lang.Thread,并将MyRunner作为线程执行体,然后调用Thread.start()方法启动线程

public class MyThread {
    public static void main(String[] args) {
      new Thread(new MyRunner()).start();
      new Thread(new MyRunner()).start();
      new Thread(new MyRunner()).start();
      new Thread(new MyRunner()).start();

      System.out.println("Main thread exit");
    }
}

执行效果参考如下

可以看到这里主线程代码先执行完毕然后进入等待,子线程执行完成后,主线程退出

Read more   2020/8/10 posted in  JAVA

14/24 设计模式之状态模式 State Pattern

类别:行为型设计模式

目的:对象在不同状态下表现出一组不同的行为,运行状态可以进行切换

完整代码参考:https://ct0-my.sharepoint.com/:u:/g/personal/neatlife_ct0_onmicrosoft_com/EdRVuEVbcBhDtqc8HEttwCMBcOSst1opDQw02Wfbqhah0Q?e=pnYxZx

典型场景

角色:护士、患者
场景:患者会根据自生的状态对护士的照顾做出不同的行为

患者处于稳定状态

  1. 护士带患者去散步,患者将处于稳定状态
  2. 给稳定患者供氧,患者将从稳定状态转为不稳定状态

患者处于不稳定状态

  1. 护士带患者去散步,患者将继续处于不稳定状态,情况可能家中
  2. 给稳定患者供氧,患者将从不稳定状态转为稳定状态

模式实现

护士类Nurse.java

public class Nurse {

    PatientStateBehavior state;
    StablePatientStateBehavior stablePatientState = new StablePatientStateBehavior(this);
    UnStablePatientStateBehavior unStablePatientState = new UnStablePatientStateBehavior(this);

    public void setState (PatientStateBehavior state) {
        this.state = state;
    }

    public void supplyOxygen () {
        state.supplyOxygen();
    }

    public void walking() {
        state.walking();
    }
}
Read more   2020/5/19 posted in  设计模式 JAVA

python高性能之路:使用C/C++编写扩展

脚本语言一般使用c等静态语言编写扩展提高性能,下面使用cpp编写一个实现两数之和的python扩展函数

完成案例代码参考:https://1drv.ms/u/s!AquRvPzqx59RjAZ3wk6qpzqEDgF9?e=jZe5hu

构建python环境

减少扩展开发对系统python的影响,建议使用venv创建一个新的python开发环境

virtualenv ~/develop/venvpy3

操作效果如下

使用命令source ~/develop/venvpy3/bin/activate激活即可

创建扩展文件sumext.cpp

sumext.cpp

#include <iostream>
#include <stdio.h>
#include <Python.h>

using namespace std;

主要是引入依赖的Python.h文件头即可,其它头文件按需引入使用

Read more   2020/4/27 posted in  python 源码分析

mysql查询优化相关技术

  1. 查询优化
    1. SQL查询执行顺序
    2. Where条件相关性能问题
    3. 子查询(in/exist)相关
    4. 分组排序相关
  2. 索引优化
  3. 事务

0x01 SQL查询执行顺序

执行顺序 SQL关键字 执行内容 说明
8 SELECT 根据选择的字段,结果写入虚拟表T8
9 DISTINCT 字段 对SELECT的结果T8执行去重后, 写入虚拟表T9
1 FROM 左表 as a 对FROM中的左表与右表执行笛卡尔积,生成虚拟表T1 每步操作结果都会生成一个虚拟表, 这里用T加执行顺序号来命名
3 LEFT JOIN 右表 as b 如指定了左外连接,会将左表中存在,但右表不存在的行,添加到T2表,生成虚拟表T3; 如果FROM中包含多个表, 则会将T3与下一表重复执行步骤1~3 Join类型: Inner: 内联接, 等值连接 Outer: 外连接, 常用的Left join(以左表记录为基准), Right join(以右表记录为基准)
2 ON a.id = b.id 对T1表应用on条件筛选, 符合条件的行写入虚拟表T2 Inner jojn中on 与where条件效果相同; left join中on与where条件效果不同;
4 WHERE 条件 对T3表应用where条件过滤, 符合条件的记录写入T4表
5 GROUP BY 字段 根据group by中字段 , 对T4执行分组,生成虚拟表T5 注意:不在GROUP BY中的字段,如果出现在SELECT中,都要使用聚合类函数,不推荐下面的写法: Select a,b, sum(c) from t Group by a
6 WITH ROLLUP [CUBE] 对T5结果,按不同维度执行统计,生成虚拟表T6 GROUP BY ROLLUP(A,B,C) 结果 (A,B,C),(A,B), (A) GROUP BY CUBE(A,B,C)结果 (A,B,C),(A,B)(A,C),(B,C)(A),(B),(C)
7 HAVING 条件 对T6结果执行过滤,结果写入虚拟表T7
10 ORDER BY 字段 对DISTINCT后的结果T9, 执行排序后写入虚拟表T10 这部分可以使用字段别名, 字段运算或按字段顺序号执行排序操作
11 LIMIT 对T10取出指定行数据记录后,返回最终结果
Read more   2020/4/17 posted in  规范 SQL

13/24 设计模式之装饰器模式 Decorator Pattern

类别:结构型设计模式

目的:在不改变对象对外接口的限定下,动态对对象的行为(方法)进行一次/多次增强

完整代码参考:https://1drv.ms/u/s!AquRvPzqx59RjABb2hfszxx7JUQu?e=5pPGPv

典型场景

蛋糕上需要添加一些装饰,这里假设蛋糕10块钱,每个装饰品的添加都需要支付一些额外的费用,比如添加添加糖果需要加2块钱,添加蜡烛需要1.5,既要加糖果、又要蜡烛就要多支付3.5元(2+1.5)

用代码表示这些不同状态的蛋糕很容易想到使用class表示,一个class表示一种蛋糕:

class 作用
BaseCake.java 基本蛋糕 10块
CakeWithCandy.java 加糖果的蛋糕 10+2=12块
CakeWithCandle.java 加蜡烛的蛋糕 10+1.5=11.5块
CakeWithCandyAndCandle.java 加糖果和蜡烛的蛋糕 10+2+1.5=13.5块
Read more   2020/4/5 posted in  设计模式 JAVA

12/24 设计模式之适配器模式 Adapter Pattern

类别:结构型设计模式

目的:将历史遗留代码(通常是一个library)/三方代码转换成一个新接口,使得可以在使用这个新接口的项目中使用

完整代码参考:https://1drv.ms/u/s!AquRvPzqx59Ri3_qC9egk9qojRQp?e=oiO1Jh

典型场景

这里拿一个系统中的支付模块举例,一个支付模块会对接多个支付比如微信,支付宝等

基本事实

在现有代码中,已在使用一种支付方式处理订单,对应的支付接口Pay.java参考如下

public interface Pay {
    void setAmount(Integer amount);
    void makePayment();
}

上面这个接口的实现PayImpl.java

public class PayImpl implements Pay {
    @Override
    public void setAmount(Integer amount) {
        System.out.println("set pay impl");
    }

    @Override
    public void makePayment() {
        System.out.println("make payment");
    }
}

serviceMyService.java中使用支付方式处理订单,参考如下:

Read more   2020/3/28 posted in  设计模式 JAVA

11/24 设计模式之模板方法模式 Template Method Pattern

类别:行为型设计模式

目的:定一个代码模板,确保代码执行时会把模板中的代码一并执行,降低漏写约定代码的可能

完整代码参考:https://1drv.ms/u/s!AquRvPzqx59Ri3796seig6pm77ZO?e=gYrllO

典型场景

这里拿集成支付网关举例,比如业务中对支付的抽象如下

方法 作用
create 发起支付
query 查询订单
refund 退款

在上面执行的每一步进行日志记录

对应的接口Pay.java参考如下

public interface Pay {
    void create();

    void query();

    void refund();
}

实现一个支付方式,比如支付宝支付,在每一个支付步骤进行日志记录,参考如下:

Read more   2020/3/26 posted in  设计模式 JAVA