java遍历目录下的目录和文件
public static void findStrFromManyFiles(String dirName) throws IOException{ File dir = new File(dirName); File[] files = dir.listFiles(); for(int i=0;i<files.length;i++) { if(files[i].isFile()) { //操作文件 }else if(files[i].isDirectory()) { //System.out.println(files[i].getPath()); findStrFromManyFiles(files[i].getPath()); } } } #########################
1.&符号和nohub命令:后台运行程序 2.nohup命令:使进程与终端分离 3.Ctrl + Z,jobs,bg 和 fg命令,控制进程的前后台切换 4.小结 5.jobs命令:显示后台进程状态
访问 MySQL 镜像库地址 拉取mysql5.7版本
docker pull mysql:5.7 如果需要最新版本
docker pull mysql:latest 等待下载 下载完成后查看镜像
docker images 启动docker容器
docker run -d --name mysql5.7 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7 docker run 创建一个新的容器,同时运行这个容器 --name mysqlcontainer1:代表容器的名字 -d 后台运行 -p:代表端口映射,格式为宿主机映射端口:容器内部运行端口 --restart unless-stopped 容器重启策略 -e:代表添加环境变量,MYSQL_ROOT_PASSWORD是root用户的登陆密码123456 \ shell命令换行符 mysql:5.7:表示使用的镜像以及版本号 -v:为启动的容器挂在volume,mysql数据库默认数据目录是容器中的/var/lib/mysql目录,该目录是容器自带的一个volume,如果不为mysql容器单独配置数据目录volume,那么我们会发现重启mysql容器后mysql数据库中数据都丢失了。为了持久化mysql数据,我们在启动mysql容器时添加了-v /data/mysqldata:/var/lib/mysql参数,把主机的/data/mysqldata目录挂载到容器的/var/lib/mysql下 -v /data/mysqldata/log:/var/log/mysql 将日志文件挂载到主机 -v /data/mysqldata/data:/var/lib/mysql 将mysql存储文件挂载到主机 -v /data/mysqldata/conf:/etc/mysql 将配置文件挂载到主机 如果需要持久化mysql的数据,再执行下面的代码
docker run -d --name mysqlcontainer1 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -v /data/mysqldata/log:/var/log/mysql -v /data/mysqldata/data:/var/lib/mysql -v /data/mysqldata/conf:/etc/mysql mysql:5.
Linux top命令详解 一、top命令介绍 top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器。top命令可以动态显示进程的资源使用情况,即可以通过用户按键来不断刷新当前状态。如果在前台执行该命令,它将独占前台,直到用户终止该程序为止。比较准确的说,top命令提供了实时的对系统处理器的状态监视,它将显示系统中CPU最“敏感”的任务列表,该命令可以按CPU使用、内存使用和执行时间来对任务进行排序,而且该命令的很多特性都可以通过交互式命令或者在个人定制文件中进行设定。 二、top命令的参数含义 执行top命令后,默认会出现如下内容:
top – 09:36:15 up 86 days, 5:28, 1 users, load average: 0.02, 0.15, 0.22 Tasks: 194 total, 1 running, 126 sleeping, 0 stopped, 0 zombie Cpu(s): 0.3% us, 1.0% sy, 0.0% ni, 98.7% id, 0.0% wa, 0.1% hi, 0.0% si Mem: 2070564k total, 1340828k used, 729736k free, 168636k buffers Swap: 4192924k total, 0k used, 4192924k free, 894080k cachedPID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1 root 20 0 1696 544 468 S 0 0.
一、if判断语句
if语句是用来进行判断的,其使用格式如下: if 要判断的条件: 条件成立时要做的事 Demo age = input('输入年龄:') #input返回的是字符串类型 if int(age) > 18: #这里对age做强制类型转换 字符串和整数int不可比较 print('你成年了') #前方必须缩进一个Tab键 二、if else
##语法: if 判断条件: 判断条件为True时执行的代码 else: 判断条件为False时执行的代码 Demo age = 17 if int(age) > 18: print('你成年了') else: print('未成年') ##输出结果: 未成年 三、elif
格式 if xxx: 结果1 elif xxx1: 结果2 elif xxx2 结果3 ################################################################## 当xxx满足时,返回结果1,整个if结束 当xxx不满足时,判断xxx1,如果xxx1满足条件,则返回结果2,整个if结束 当xxx,xxx1不满足时,判断xxx2,如果xxx2满足条件,则返回结果3,整个if结束 ################################################################## Demo # elif score = int(input('请输入您的成绩')) if score >= 90: print('优秀') elif score >= 80: print('良好') elif score >= 70: print('中等') elif score >= 60: print('及格') else: print('不及格') 四、for循环
一、什么是GIL
GIL即全局解释锁(global interpreter lock),这个锁环绕着Ruby代码的执行,在一个多线程上下文中,任何时候只有一个线程可以执行Ruby代码。因此即使在多核的机器上运行多线程应用,在特定时间点上也只有一个线程和一个核心在忙碌,GIL一直保护着Ruby内核,以免竞争条件造成数据混乱。
二、GIL产生原因
首先,Ruby线程依托于原生操作系统线程,所以Ruby线程的调度也是源于操作系统的线程调度程序。其次,对于Ruby来说其实没有什么操作是线程安全的,比如最简单的数组附加,如下:
arr = [] arr << ‘str1’ Ruby中的数组附加其实包含许多步骤,在其底层实现上是包含一大堆代码:
VALUE rb_ary_push(VALUE ary, VALUE iterm) { long idx = RARRAY_LEN(ary); ary_ensure_room_for_push(ary, 1); RARRAY_ASET(ary, idx, item); ARY_SET_LEN(ary, idx + 1); return ary; } 这段代码揭示了数据附加包含以下几个步骤:
1. 获取数组当前长度;
2. 检查数组是否有空间容纳新的元素;
3. 将元素附加到数组;
4. 修改数据长度+1。
由于这么一系列操作不是线程安全的,所以在多线程应用中,会频繁发生上下文切换,这样就可能会发生一些匪夷所思的错误,为此,我们需要使这些操作具有原子性,所以我们需要使用GIL来解决这个问题。GIL保卫着系统的内部状态,使用GIL,就不需要在数据结构周围使用任何锁或者同步机制。如果两个线程不能够同时改变内部状态,也就不会有竞争条件发生了。
三、GIL的实现原理
Ruby的线程依托于原生的操作系统的线程,但是当一个Ruby线程希望在其原生操作系统线程中执行代码的时,必须要先获得GIL,如下图所示,在特定时间点上只有一个线程可以获取GIL,于是Ruby的代码执行是完全不能并行的。
那么Ruby如何保证GIL被线程独霸呢?Ruby提供了一个计时器线程,这个线程是仅存在于Ruby内部的原生线程,当Ruby启动并只有主线程运行时,定时器线程处于沉睡状态,但一旦有线程等待GIL,定时器线程就会被唤醒。定时器线程是用于避免一个线程独霸GIL的情况,每经过一定周期,定时器线程在当前持有GIL的线程上设置一个中断标志,Ruby会检查这些中断标志,被设置中断标志的线程会停止运行并释放GIL,这样,别的线程就可以获取GIL继而执行其代码。
四、总结
GIL是Ruby内部实现细节,是为了保证Ruby内部执行的安全,它保证了Ruby中C实现的底层方法的原子性。
PS:以上内容都是基于CRuby的,对于JRuby或者Rubinius来说,它们是可以真正做到多线程并发执行的。
linux 正则表达式 1.1 简介 正则表达式是一种表达式可以查找匹配特定准则的文本,其实现原理通过正则表达式引擎(regular expression engine)实现的 Linux主要有两种表达式引擎:
POSIX基础正则表达式(basic regular expression,BRE)引擎; POSIX扩展正则表达式(extended regular expression,ERE)引擎。 正则表达式的特殊字符的使用: . * [] ^ $ {} \ + ? | ()
2.1 正则表达式的特殊字符的使用说明 2.1.1 . 匹配任意一个字符 #它与*不同,一个.就占一个位置 grep r..t /etc/passwd 2.1.2 *匹配前一个字符若干个(带有oo字符的行)。 #这里注意是三个ooo grep ooo* /etc/passwd 2.1.3 使用^搜索非字母开头的行 grep ^[^a-zA-Z] /etc/passwd 2.1.4 使用$对文本末端进行匹配 cat /etc/passwd |grep bash$ 2.1.5 如果想对特殊字符进行匹配,可以使用\。但是\本身是特殊字符所以需要对\进行转移 cat .bash_profile | grep \\$ 2.1.6 任意字符 [00:33:05][root@tiaoban:~]# grep .
由于我目前的主机是 \(Windows 10\) ,使用 \(VirtualBox\) 运行 \(Ubuntu\) 虚拟机托管应用程序。现在想通过 \(PowerShell\) 连接到 \(Ubuntu\) 虚拟机,可以通过如下步骤。
如果你使用的是没有 \(GUI\) 的 \(Ubuntu\) 服务器,并且想要避免在虚拟机终端上工作的痛苦, 可以使用 \(PowerShell\) 连接到 \(Ubuntu\) 虚拟机。由于 \(VirtualBox\) 虚拟机显示页面中 \(Page Up\) 和 \(Page Down\) 不起作用,显示屏幕太小,即使是 \(VirtualBox\) 增强功能也不能解决这个问题,这时候可以用 \(PowerShell\) 连接虚拟机方便工作。
以下是从建立虚拟机到使用PowerShell SSH连接虚拟机的具体步骤
在 \(VirtualBox\) 上创建 \(Ubuntu\) 虚拟机
在新建的虚拟机上安装 \(Ubuntu\ Server\ LTS\) 镜像(官网下载 ISO 镜像)
启动虚拟机初始化设置并登陆
打开终端,输入如下代码,确保进程 \(sshd\) 正在运行并侦听端口 22
ps aux | grep sshd sudo netstat -plant | grep :22 关闭虚拟机
摘要:简单修改、增加部分页面,了解django开发的过程。(Python 3.9.12,django 4.0.4 )
接前篇,通过命令: django-admin startproject myWebSite 创立了新的站点,cd myWebSite进入到站点根目录,并用命令python manage.py runserver 8080(或其他端口号) 就可使项目运行,然而这只是一个空壳,无任何作用,下面通过一个小应用对开发过程进行介绍。
退出运行状态:当项目运行时,按下键盘上的ctrl和Break键,退出到根目录下。
一、创建一个显示当前日期和时间的网页
1、Django项目由一系列应用程序组成,比如,一个站点分别由不同的版块组成,每一个版块可以是一个独立的站点,它们协同工作,让项目成为一个整体
首先,创建一个应用程序,anaconda promt 中进入到根目录下,输入命令:python manage.py startapp myblogs 这样,在根目录下,有4个文件,其中myblogs和myWebSite是2个文件夹,数据库db.sqlite3,以及manage.py文件。
进入到myWebSite文件夹中:
1)修改setting.py文件如下:
'django.contrib.staticfiles', 'myblogs', #增加此行 ] # 中间略去 N 行 LANGUAGE_CODE = 'zh-hans' #修改为中文,页面显示为中文 TIME_ZONE = 'Asia/Shanghai' #修改时区 2)修改urls.py文件
urlpatterns = [ path('admin/', admin.site.urls),#系统默认 path('myblogs/', include('myblogs.urls')),#在路径“myblogs/”中,找到myblogs.urls文件,并读取urls中的配置() ] 进入到myblogs文件夹中:
1)修改urls.py文件如下:(如果没有,把myWebSite文件夹中的拷贝过来修改)
from django.contrib import admin from django.urls import path from . import views # 导入myblogs文件夹中的views urlpatterns = [ path('admin/', admin.
1.导入jar包 druid-1.1.12.jar 2.定义配置文件 3.加载配置文件 4.获取数据库连接池对象 5.获取连接 package com.czie.druid; import com.alibaba.druid.pool.DruidDataSourceFactory; import javax.sql.DataSource; import java.io.FileInputStream; import java.sql.Connection; import java.util.Properties; /* druid数据连接池演示 */ public class DruidDemo { public static void main(String[] args) throws Exception { //1.导入jar包 //2.定义配置文件 //3. 加载配置文件 Properties prop = new Properties(); prop.load(new FileInputStream(jdbc-demo/src/druid.properties)); //4. 获取连接池对象 DataSource dataSource = DruidDataSourceFactory.createDataSource(prop); //5. 获取数据库连接 Connection Connection connection = dataSource.getConnection(); System.out.println(connection); // 五月 12, 2022 12:11:40 上午 com.alibaba.druid.pool.DruidDataSource info //信息: {dataSource-1} inited //System.