麻绳先生

做一些记录性的工作

习近平发表二〇二一年新年贺词

新年前夕,国家主席习近平通过中央广播电视总台和互联网,发表了二〇二一年新年贺词。全文如下:

大家好!2021年的脚步越来越近,我在北京向大家致以新年的美好祝福!

2020年是极不平凡的一年。面对突如其来的新冠肺炎疫情,我们以人民至上、生命至上诠释了人间大爱,用众志成城、坚忍不拔书写了抗疫史诗。在共克时艰的日子里,有逆行出征的豪迈,有顽强不屈的坚守,有患难与共的担当,有英勇无畏的牺牲,有守望相助的感动。从白衣天使到人民子弟兵,从科研人员到社区工作者,从志愿者到工程建设者,从古稀老人到“90后”、“00后”青年一代,无数人以生命赴使命、用挚爱护苍生,将涓滴之力汇聚成磅礴伟力,构筑起守护生命的铜墙铁壁。一个个义无反顾的身影,一次次心手相连的接力,一幕幕感人至深的场景,生动展示了伟大抗疫精神。平凡铸就伟大,英雄来自人民。每个人都了不起!向所有不幸感染的病患者表示慰问!向所有平凡的英雄致敬!我为伟大的祖国和人民而骄傲,为自强不息的民族精神而自豪!

艰难方显勇毅,磨砺始得玉成。我们克服疫情影响,统筹疫情防控和经济社会发展取得重大成果。“十三五”圆满收官,“十四五”全面擘画。新发展格局加快构建,高质量发展深入实施。我国在世界主要经济体中率先实现正增长,预计2020年国内生产总值迈上百万亿元新台阶。粮食生产喜获“十七连丰”。“天问一号”、“嫦娥五号”、“奋斗者”号等科学探测实现重大突破。海南自由贸易港建设蓬勃展开。我们还抵御了严重洪涝灾害,广大军民不畏艰险,同心协力抗洪救灾,努力把损失降到了最低。我到13个省区市考察时欣喜看到,大家认真细致落实防疫措施,争分夺秒复工复产,全力以赴创新创造,神州大地自信自强、充满韧劲,一派只争朝夕、生机勃勃的景象。

2020年,全面建成小康社会取得伟大历史性成就,决战脱贫攻坚取得决定性胜利。我们向深度贫困堡垒发起总攻,啃下了最难啃的“硬骨头”。历经8年,现行标准下近1亿农村贫困人口全部脱贫,832个贫困县全部摘帽。这些年,我去了全国14个集中连片特困地区,乡亲们愚公移山的干劲,广大扶贫干部倾情投入的奉献,时常浮现在脑海。我们还要咬定青山不放松,脚踏实地加油干,努力绘就乡村振兴的壮美画卷,朝着共同富裕的目标稳步前行。

今年,我们隆重庆祝深圳等经济特区建立40周年、上海浦东开发开放30周年。置身春潮涌动的南海之滨、绚丽多姿的黄浦江畔,令人百感交集,先行先试变成了示范引领,探索创新成为了创新引领。改革开放创造了发展奇迹,今后还要以更大气魄深化改革、扩大开放,续写更多“春天的故事”。

大道不孤,天下一家。经历了一年来的风雨,我们比任何时候都更加深切体会到人类命运共同体的意义。我同国际上新老朋友进行了多次通话,出席了多场“云会议”,谈得最多的就是和衷共济、团结抗疫。疫情防控任重道远。世界各国人民要携起手来,风雨同舟,早日驱散疫情的阴霾,努力建设更加美好的地球家园。

2021年是中国共产党百年华诞。百年征程波澜壮阔,百年初心历久弥坚。从上海石库门到嘉兴南湖,一艘小小红船承载着人民的重托、民族的希望,越过急流险滩,穿过惊涛骇浪,成为领航中国行稳致远的巍巍巨轮。胸怀千秋伟业,恰是百年风华。我们秉持以人民为中心,永葆初心、牢记使命,乘风破浪、扬帆远航,一定能实现中华民族伟大复兴。

站在“两个一百年”的历史交汇点,全面建设社会主义现代化国家新征程即将开启。征途漫漫,惟有奋斗。我们通过奋斗,披荆斩棘,走过了万水千山。我们还要继续奋斗,勇往直前,创造更加灿烂的辉煌!

此时此刻,华灯初上,万家团圆。新年将至,惟愿山河锦绣、国泰民安!惟愿和顺致祥、幸福美满!

谢谢大家!

来源:新华社

本期编辑:胡程远、李娜

leetcode216

这是因为疫情原因,离开校园,无法获得密钥发布文章的8个多月以来,第一篇文章。
以此测试一下博客环境是否正常。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Solution {
List<List<Integer>> result = new LinkedList<>();
public List<List<Integer>> combinationSum3(int k, int n) {
backtrace(new LinkedList<Integer>(), 1, k, n, k);
return result;
}
public void backtrace(List<Integer> path, int start, int k, int n, int old){
if(k == 0 && path.size() == old && n == 0){
result.add(new LinkedList<Integer>(path));
return;
}
if(start > 9 || k < 0) return;
for(int i = start; i < 10 && i <= n; ++i){
path.add(i);
backtrace(path, i+1, k-1, n-i, old);
path.remove(path.size()-1);
}
}
}

PyQt5小程序上传图片到七牛云

github地址
https://github.com/zkalan/qiniu-image.git

绘制软件界面

使用Qt Designer绘制程序界面,设置图标,修改控件id等。这个过程还包括几个配置步骤:

  • 在pycharm中安装PyQt5
  • 在pycharm中安装PyQt5-tools
  • 配置pycharm,方便的通过tools界面启动dedigner和其他工具

slots和signals

这是两个PyQt中的概念,signal就是信号,是动作的发出者;slot就是槽,是动作的相应者。代码如下:

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
71
72
73
74
# -*- coding: utf-8 -*-
import sys, os
if hasattr(sys, 'frozen'):
os.environ['PATH'] = sys._MEIPASS + ";" + os.environ['PATH']
from ui import mainwindow
from PyQt5 import QtGui, QtCore
from PyQt5.QtWidgets import QMainWindow, QApplication, QMessageBox, QFileDialog
from utils import uploadtoqiniu

class WindowService(QMainWindow, mainwindow.Ui_MainWindow):
def __init__(self):
super(WindowService, self).__init__()
self.setupUi(self)
# bind slots and signals
self.pb_select.clicked.connect(self.pb_select_service)

self.pb_copy_url.clicked.connect(self.pb_copy_url_service)
self.pb_copy_markdown.clicked.connect(self.pb_copy_markdown_service)
self.pb_upload.clicked.connect(self.pb_upload_service)

def pb_select_service(self):
filename, filetype = QFileDialog.getOpenFileName(self,
'选择文件',
os.getcwd(),
"Images (*.jpg;*.jpeg;*.gif;*.png;*.ico);;All Files (*)")
if filename == '':
print('filename is' + filename)
return
self.le_selectimage.setText(filename)
print('filename is' + filename)
print('文件筛选器类型:', filetype)

def pb_upload_service(self):
filepath = self.le_selectimage.text()
if filepath == '':
self.maessage_box('select a image')
else:
if os.path.exists('settings.cfg'):
back_url = uploadtoqiniu.upload(filepath)
self.le_url.setText(back_url)
self.le_md.setText('![](' + back_url + ')')
img = QtGui.QImage(filepath)
scale = img.size().width()/411 if ((img.size().width()/411) > (img.size().height()/201)) else img.size().height()/201
scale_width = img.size().width()/scale
scale_height = img.size().height() / scale
size = QtCore.QSize(scale_width, scale_height)
image = QtGui.QPixmap.fromImage(img.scaled(size, QtCore.Qt.IgnoreAspectRatio))
self.l_preview.setPixmap(image)
print(image.size())
print(type(image.size()))
self.maessage_box('Success')
else:
self.maessage_box('check setting.cfg')

def pb_copy_url_service(self):
clipboard = QApplication.clipboard()
url = self.le_url.text()
clipboard.setText(url)
self.maessage_box('copy to clipkboard')

def pb_copy_markdown_service(self):
clipboard = QApplication.clipboard()
md_url = self.le_md.text()
clipboard.setText(md_url)
self.maessage_box('copy to clipkboard')

def maessage_box(self, message, title='information'):
box = QMessageBox(self)
box.setIcon(QMessageBox.Information)
box.setText(message)
box.setWindowTitle(title)
box.setStandardButtons(QMessageBox.Ok)
box.button(QMessageBox.Ok).animateClick(2*1000)
box.exec_()

使用pyinstaller打包

pyinstaller打包总是问题百出,PyQt5自己也有不少bug。遇到这些问题

ImportError: unable to find Qt5Core.dll on PATH

解决办法如下

https://blog.csdn.net/zwyact/article/details/99778898
在主程序中pyqt5库import之前就对系统变量进行手动设置

1
2
3
import sys, os
if hasattr(sys, 'frozen'):
os.environ['PATH'] = sys._MEIPASS + ";" + os.environ['PATH']

NameError: name ‘exit’ is not defined

解决办法就是这样写sys.exit

效果预览

settings.cfg是配置文件,其中需要配置各个字段。可以配置是否使用水印。

主界面

上传图片

上传完图片还能快速获取访问链接。

github地址
https://github.com/zkalan/qiniu-image.git

(no title)

SparkSQL介绍

Spark SQL是Spark用来处理结构化数据的一个模块,它提供了两个编程抽象:DataSet和DataFrame。

Hive SQL转化为MapReduce,然后提交给集群执行,但是MapReduce计算模型执行效率太低,于是诞生了Spark SQL。

将Spark SQL转化为RDD,然后提交给集群执行,效率很高!

RDD DataSet DataFrame

DataFrame是一个分布式数据容器,更像传统关系数据库的二维表。DataSet是DataFrame API最新扩展,是强类型的数据结构,类似于类的概念。

SparkSQL编程

SparkSession

SparkSession是SparkContext和HiveContext的结合,实际计算由SparkContext负责。

val df = spark.read.json(filepath)

org.sparl.sql.DataFrame=[age:bigint,name:string]

df.show

df.createTempView()

spark.sql(“select * from student”).show

df.createGlobalTempView()

DSL风格语法

df.printSchema

df.select(“name”).show()

import spark,implicits._

DataSet基本操作

df.rdd

自定义用户聚合函数,有强类型和弱类型。

(no title)

Java虚拟机——内存区域与内存溢出异常(一)

运行时数据区

运行时数据区

程序计数器

每条线程都需要有一个独立的程序计数器,各条线程之间计数器互不影响,独立存储,被称为线程私有内存。

如果线程正在执行的是一个Java方法,这个计数器记录的时正在执行的虚拟机字节码指令的地址;如果正在执行的时Native方法,这个计数器值则为空(Undefined)。此内存区域是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。

Java虚拟机栈

也是线程私有,它的生命周期与线程相同。虚拟机栈描述的是Java方法执行的内存模型:每个方法执行都会创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。常说的“栈”一般指的是虚拟机栈中的局部变量表。

局部变量表u从南方了编译期可知的各类基本数据类型、对象引用、returnAddress类型。

局部变量表所需的内存空间在编译期间完成分配,在方法运行期间不会改变大小,但所处的栈顶可能动态扩展。

如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常;如果虚拟机栈动态扩展时无法申请足够的内存,就会抛出OutOfMemoryError异常。

本地方法栈

虚拟机栈为虚拟机执行Java方法服务,也就是字节码,而本地方法栈则为虚拟机使用到的Native方法服务。

Java堆

所有线程共享的一块区域。

此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。

Java堆是垃圾收集管理的主要区域,因此还被称为“GC堆”(Garbage Collected Heap)。

根据虚拟机规范的规定,Java堆可以处于物理上不连续的内存空间中,只需要逻辑连续;在实现时,既可以是固定大小的,也可以是可扩展的,通过-Xmx和-Xms控制。

方法区

线程共享区域。主要用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。虽然Java虚拟机将方法区描述为堆的逻辑部分,但是他还有一个名字叫做Non-Heap,目的应该是与堆进行区分。

Java虚拟机规范对方法区的限制非常宽松,除了和Java堆一样不需要连续的存储空间,还可以选择不实现垃圾回收

运行时常量池

是方法区的一部分。Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池(Constant Pool Table),用于存放编译期生成的各种字面量和符号引用,这部分信息在类加载后进入方法去的运行时常量池存放。

运行时常量池相对于Class文件常量池的另外的一个重要特征就是具备动态性,java语言并不要求常量只有编译期才能产生,也就是并非预置入Class文件中常量池的内容才能进入方法区运行时常量池,运行期间也可能有新的常量放入池中,这种特性被开发人员利用较多的就是String.intern()。

直接内存

Direct Memory并不是虚拟机运行时数据区的一部分,也不是Java虚拟机规范中定义的内存区域,但是这部分内存使用频繁,也可能导致OOM异常。

NIO类引入了一种基于通道和缓冲区的IO方式,可以使用Native函数库直接分配堆外内存,然后通过一个存储在Java堆中的DirectByteBuffer对象作为这块内存的引用进行操作,这样能在一定程度提升性能,避免了在Java堆和Native堆中来回复制数据。

直接内存的分配不受Java堆大小限制,所以-Xmx等参数信息再加直接内存可能导致总和大于物理内存限制,导致OOM异常。