Other

汇编学习

一. 计算机组成简单学习 1. 计算机如何与内存通信 2. 计算机的总线 逻辑划分:地址总线 数据总线 控制总线 2.1 三类总线各自的功能 3. CPU有存储器的读写 CPU想读取数据,必须与外部器件进行三类信息的交互 存储单元的地址(地址信息) 器件的选择,读或者写命令(控制信息) 读或写的数据(数据信息) 过程图: 3.1 内存地址空间 3.2 内存地址空间的分配方案 DOS的基本语法规则 二. 进入DEBUG 要观察计算机内部的情况,可直接进入 DEBUG。如果要调试及观察可执行文件,则要在 DEBUG 后加上文件名和扩展名 .EXE。我们先观察,因此直接键入 DEBUG 进入系统,如图所示。 DEBUG 的提示符是小短线 - ,在其后输入命令。 (1)R 命令——查看和修改寄存器 R 命令有两种用法:直接键入 R —— 将显示 CPU 所有的寄存器和标志位; 修改寄存器 —— 在 R 后跟写寄存器名(比如 R AX),回车后先显示寄存器的内容,在冒号后键入新的值;再用 R 命令就可看到修改后的内容了。如图所示,使用 R AX 将 AX 寄存器的值改为 1234H。 观察上图,由于此时 DEBUG 进入的是操作系统环境,R 命令显示的是系统下的寄存器的值。可看出,AX、BX、CX、DX 均为 0,如果将 AX 寄存器的值修改为 1234H,执行 R AX 之后在冒号后输入 1234 即可。注意,DEBUG 下的数据都是十六进制数。

记录一次Ubuntu 20.04 编译安装 ibus-libpinyin

记录一次Ubuntu 20.04 编译安装 ibus-libpinyin 1. 卸载 ibus-libpinyin 记得备份词库 sudo apt-get --purge remove ibus-libpinyin sudo apt-get autoremove 2. 安装依赖 sudo apt install gnome-common build-essential git autogen sudo apt install libibus-1.0-dev libsqlite3-dev sqlite3 libdb-dev libpinyin13-dev libsoup2.4-dev libjson-glib-dev 3.下载源码 mkdir /tmp/libpinyin cd /tmp/libpinyin git clone https://github.com/libpinyin/ibus-libpinyin.git cd /tmp/libpinyin/ibus-libpinyin 4. 编译安装 ./autogen.sh --prefix=/usr --enable-cloud-input-mode # 启用云拼音输入 make sudo make install 5. 卸载依赖 sudo apt purge --auto-remove libibus-1.0-dev libsqlite3-dev sqlite3 libdb-dev libpinyin13-dev libsoup2.

构建aarch64环境Mysql8.0的Docker镜像

1. 获取构建mysql镜像的脚本 git clone https://github.com/docker-library/mysql.git 2.预先下载 gosu-arm64、gosu-arm64.asc ,并放到mysql/8.0目录下 wget -c https://github.com/tianon/gosu/releases/download/1.14/gosu-arm64 wget -c https://github.com/tianon/gosu/releases/download/1.14/gosu-arm64.asc  3.修改Dockerfile.oracle,使用本地下载的gosu 1 # 2 # NOTE: THIS DOCKERFILE IS GENERATED VIA apply-templates.sh 3 # 4 # PLEASE DO NOT EDIT IT DIRECTLY. 5 # 6 7 FROM oraclelinux:8-slim 8 9 RUN set -eux; \ 10 groupadd --system --gid 999 mysql; \ 11 useradd --system --uid 999 --gid 999 --home-dir /var/lib/mysql --no-create-home mysql; \ 12 \ 13 mkdir /var/lib/mysql /var/run/mysqld; \ 14 chown mysql:mysql /var/lib/mysql /var/run/mysqld; \ 15 # ensure that /var/run/mysqld (used for socket and lock files) is writable regardless of the UID our mysqld instance ends up having at runtime 16 chmod 1777 /var/lib/mysql /var/run/mysqld; \ 17 \ 18 mkdir /docker-entrypoint-initdb.

编译llvm源码

起因 最近几天因为公司服务器的libstdc++.so版本太低,导致我想用clangd进行代码不全的时候没法运行,因为官网上的clangd 14二进制包需要glibc2.28的东西,所以索性就自己用llvm的源码编译clangd和配套的东西,基本上花了一个多星期,主要事件就在等编译了,中间遇到了一些很坑的地方,记录下方便别人躲坑。 llvm cmake编译官网链接 编译llvm的基本流程 mkdir ~/llvm-release 1.下载llvm的源代码 git clone https://gitee.com/mirrors/LLVM.git LLVM 2.编译一个第一阶段的 clang 什么是第一阶段的clang cd LLVM mkdir clang-1ststage-build cmake -DCMAKE_BUILD_TYPE=Release -DLLVM_TARGETS_TO_BUILD=X86 -DLLVM_BUILD_LLVM_DYLIB=TRUE -DLLVM_ENABLE_PROJECTS=clang;clang-tools-extra -S llvm -B clang-1ststage-build cd clang-1ststage-build make -j CMAKE_BUILD_TYPE 设置编译类型,一般选Release 就行 LLVM_TARGETS_TO_BUILD 编译器支持的架构平台,这里我只配置了x86 ---- LLVM_BUILD_LLVM_DYLIB 设置是否使用llvm的动态库,强烈建议打开,不然编译出来的第一阶段的二进制超级大,而且运行起来十分慢 ---- LLVM_ENABLE_PROJECTS 要编译的二进制 ---- 3.编译libcxx 上面的编译完以后就有了一个可用的clang二进制,然后我想编译c++库,让clang通过使用libc++来支持高版本的c++ 回到llvm源码根目录 ```bash mkdir libcxx-build cmake -DCMAKE_INSTALL_PREFIX=~/llvm-release -DCMAKE_BUILD_TYPE=Release -DLLVM_TARGETS_TO_BUILD=X86 -DLLVM_BUILD_LLVM_DYLIB=TRUE -DLLVM_ENABLE_RUNTIMES=libc;libcxx;libcxxabi -S runtimes -B libcxx-build make -j make install 4.

一个SpringBoot框架web程序部署简单脚本

一个SpringBoot框架web程序部署简单脚本 #!/usr/bin/bash usage(){ echo usage ./shellfile option appfilename echo options:[stop/start/retsart/backup] } appstop(){ if [ -f $1 ] then echo to stop app with:$1 filename=$1 pids=`jps -mlvV | grep ${filename##*/} | awk '{print $1}'` for i in $pids do kill $i if [ $? == 0 ] then echo quiet exit ok! else kill -9 $i echo force exit ok! fi done else echo file:$1 is not found fi } appstart(){ if [ -f $1 ] then filename=$1 #后台运行java程序 pid=`nohup java -jar ${filename##*/} > .

JAVA中Calendar与Date类型

1.参考文档:  Java之Date类和Calendar类的区别  Java日期处理的十个坑  SimpleDateFormat线程不安全及解决办法 2.背景:  《java核心技术1》 中,类库的设计者希望能够将时间点和日期分开:一个是用来表示时间点的Date类,一个是用来表示大家熟悉的日历表示法的GregorianCalendar类,事实上,GregorianCalendar类拓展了一个更加通用的Calendar类,这个类描述了日历的一般属性。  在JDK1.0中,Date类是唯一的一个代表时间的类,但是由于Date类不便于实现国际化,所以从JDK1.1版本开始,推荐使用Calendar类进行时间和 日期处理 。 主要区别:java.util.Date是个日期数据;java.util.Calendar 用于日期相关的计算; 3.常用时间函数与注意事项 3.1 Date与Calendar之间的区别与转换  查看代码 //1. 两个对象之间的不同 Date date=new Date(); // Sun Apr 17 22:05:46 CST 2022 Calendar ca=Calendar.getInstance(); //java.util.GregorianCalendar[time=1650204346836,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id=Asia/Shanghai,offset=28800000,dstSavings=0,useDaylight=false,transitions=19, // lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2022,MONTH=3,WEEK_OF_YEAR=17,WEEK_OF_MONTH=4,DAY_OF_MONTH=17,DAY_OF_YEAR=107,DAY_OF_WEEK=1,DAY_OF_WEEK_IN_MONTH=3,AM_PM=1,HOUR=10,HOUR_OF_DAY=22,MINUTE=5,SECOND=46,MILLISECOND=836,ZONE_OFFSET=28800000,DST_OFFSET=0] System.out.println(date); System.out.println(ca); //2.两者之间的相互转换 Date caDate=ca.getTime(); Calendar cb=Calendar.getInstance(); cb.setTime(date); System.out.println(caDate); //Sun Apr 17 22:05:46 CST 2022 System.out.println(cb); // cb 与ca一致 3.2、Date常用函数  Date类常用的构造器:到目前为止,还有两个构造器是推荐使用,其他的构造器已经过时就不在此说明:    new Date() 分配Date对象并初始化此对象,以表示分配它的时间(精确到毫秒Sun Apr 17 22:12:08 CST 2022);   new Date(long value) 构造函数接收一个参数,该参数是从1970年1月1日起的毫秒数。   Date中常用方法

4.1python学习笔记

logging日志模块细节 用Python写代码的时候,在想看的地方写个print xx 就能在控制台上显示打印信息,这样子就能知道它是什么 了,但是当我需要看大量的地方或者在一个文件中查看的时候,这时候print就不大方便了,所以Python引入了 logging模块来记录我想要的信息。 print也可以输入日志,logging相对print来说更好控制输出在哪个地方,怎么输出及控制消息级别来过滤掉 那些不需要的信息。 日志级别 级别排序:CRITICAL > ERROR > WARNING > INFO > DEBUG #日志级别(默认值为logging.WARNING),系统内置的级别有六种:DEBUG、INFO、WARNING、ERROR以及CRITICAL,系统会输出到控制台或者保存到日志文件的日志信息一定是等于或者高于当前等级的信息,例如 当level=logging.WARNING时,只会输出或者保存WARNING、ERROR和CRITICAL级别的信息,其他级别的 日志信息不会显示或保存,这也是level这个参数控制输出的意义所在。 名词解释 Logging.Formatter:这个类配置了日志的格式, 在里面自定义设置日期和时间,输出日志的时候将会按照设置的格式显示内容。 Logging.Logger:Logger是Logging模块的主体,进行以下三项工作: 1. 为程序提供记录日志的接口 2. 判断日志所处级别,并判断是否要过滤 3. 根据其日志级别将该条日志分发给不同handler 常用函数有: Logger.setLevel() 设置日志级别 Logger.addHandler() 和 Logger.removeHandler() 添加和删除一个Handler Logger.addFilter() 添加一个Filter,过滤作用 Logging.Handler:Handler基于日志级别对日志进行分发,如设置为WARNING级别的Handler只会处理WARNING及以上级别的日志。 常用函数有: setLevel() 设置级别 setFormatter() 设置Formatter 基本使用 import logging # 1.logger对象:负责产生日志 logger = logging.getLogger('程序功能说明') # 2.filter对象:过滤日志(了解) # 3.handler对象:控制日志输出的位置(文件/终端) hd1 = logging.FileHandler('a.log',encoding='utf-8') # 输出到文件中 hd2 = logging.StreamHandler() # 输出到终端 # 4.

Java 运算符 练习

//1、(操作符)有如下代码: int a = 5; // 5 6 5 6 int b = (a++)+(--a)+(++a); // 5+5+6=16 //问执行完之后,b 的结果是多少? System.out.println(b的结果为+b);  //2、(基本类型的运算)一家商场在举行打折促销,所有商品都进行8折优惠。一位程序员把这个逻辑写成: //short price = ...;//先计算出原价 //short realPrice = price *8/ 10; //再计算出打折之后的价格//问:这段代码是否正确?//如果正确,假设price为100,那计算之后的realPrice值为多少? //不正确类型不兼容 //如果不正确,应该怎么改正? double price = 100; double realpric = price * 8/10; System.out.println(realPrice为:+realpric);    /*3、关于运算符的作业现有一个五位数彩票号码:25515程序输出该彩票号码中的数字及相关信息(1)在主类的main方法中声明一个用于存放彩票号码的int型变量表示ticketNumber并存放彩票号码,通过运算符计算出彩票号码中个位、十位、百位、千位和万位上的数字用byte型变量a1、a2、a3,a4和a5存放*/ int ticketNumber=25515; System.out.println(彩票号码:+ticketNumber); byte a1,a2,a3,a4,a5; a1=(byte)(ticketNumber/10000); System.out.println(万位:+a1); a2=(byte)(ticketNumber/1000%10);System.out.println(千位:+a2); a3=(byte)(ticketNumber/100%10);System.out.println(百位:+a3); a4=(byte)(ticketNumber/10%10);System.out.println(十位:+a4); a5=(byte)(ticketNumber/1%10);System.out.println(个位:+a5); }}