变量

马哥博客作业第三周

戏子无情 提交于 2020-04-06 02:09:08
正则表达式 一.文本编辑工具 1.文本编辑之神vim 1.1 vim的三种模式: 命令或普通(Normal)模式:默认模式,可以实现移动光标,剪切/粘贴文本 插入(Insert)或编辑模式:用于修改文本 扩展命令(extended command )或命令(末)行模式:保存,退出等 1.2 模式切换: 插入模式 --- ESC-----> 命令模式 命令模式 ---- : ----> 扩展命令模式 扩展命令模式 ----ESC,enter----> 命令模式 1.3 扩展模式的基本命令 w 写(存)磁盘文件 wq 写入并退出 x 写入并退出 X 加密 q 退出 q! 不存盘退出,即使更改都将丢失 r filename 读文件内容到当前文件中 w filename 将当前文件内容写入另一个文件 !command 执行命令 r!command 读入命令的输出 1.4 命令模式的基本命令 ZZ 保存退出 ZQ 不保存退出 1.4.2 光标跳转 字符间跳转: h: 左 L: 右 j: 下 k: 上 单词间跳转: w:下一个单词的词首 e:当前或下一单词的词尾 b:当前或前一个单词的词首 当前页跳转: H:页首 M:页中间行 L:页底 zt:将光标所在当前行移到屏幕顶端 zz:将光标所在当前行移到屏幕中间 zb:将光标所在当前行移到屏幕底端 行首行尾跳转: ^ 跳转至行首的第一个非空白字符

原子性,有序性,可见性

纵饮孤独 提交于 2020-04-06 01:01:14
synchronized (原子性 有序性 可见性) volatile (原子性 可见性) 1.volatile本质是在告诉jvm当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取;synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住。 2.volatile仅能使用在变量级别;synchronized则可以使用在变量、方法、和类级别的。 3.volatile仅能实现变量的修改可见性,并不能保证原子性;而synchronized则可以保证变量的修改可见性和原子性。 4.volatile不会造成线程的阻塞;synchronized可能会造成线程的阻塞。 5.volatile标记的变量不会被编译器优化;synchronized标记的变量可以被编译器优化。 原子性:所谓原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束 例如:int i = 1; 该语句为原子操作,因为执行这句话后i的值一定是等于1. 反例:int i= 0; i++ ; 其中 i++不是原子操作,在多线程中会有线程安全问题,i++其实分为三个步骤,1. 读取变量i的值;2:对i进行加一的操作;3.将计算后的值再赋值给变量i synchronized :能保证原子操作。1、锁住主内存,2、执行工作内 3、将工作内存写入主内存。4.释放锁

技术大牛详谈如何正确使用 Volatile 变量

旧时模样 提交于 2020-04-05 23:05:26
Java 语言中的 volatile 变量可以被看作是一种 “程度较轻的 synchronized”;与 synchronized 块相比,volatile 变量所需的编码较少,并且运行时开销也较少,但是它所能实现的功能也仅是 synchronized 的一部分。 本文介绍了几种有效使用 volatile 变量的模式,并强调了几种不适合使用 volatile 变量的情形。 锁提供了两种主要特性:互斥(mutual exclusion) 和可见性(visibility)。互斥即一次只允许一个线程持有某个特定的锁,因此可使用该特性实现对共享数据的协调访问协议,这样,一次就只有一个线程能够使用该共享数据。 可见性要更加复杂一些,它必须确保释放锁之前对共享数据做出的更改对于随后获得该锁的另一个线程是可见的 —— 如果没有同步机制提供的这种可见性保证,线程看到的共享变量可能是修改前的值或不一致的值,这将引发许多严重问题。 Volatile 变量 Volatile 变量具有 synchronized 的可见性特性,但是不具备原子特性。这就是说线程能够自动发现 volatile 变量的最新值。 Volatile 变量可用于提供线程安全,但是只能应用于非常有限的一组用例:多个变量之间或者某个变量的当前值与修改后值之间没有约束。因此,单独使用 volatile 还不足以实现计数器

web开发中防止SQL注入

泪湿孤枕 提交于 2020-04-05 23:04:52
web开发中防止SQL注入 一、SQL注入简介 SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编写时的疏忽,通过SQL语句,实现无账号登录,甚至篡改数据库。 二、SQL注入攻击的总体思路 1.寻找到SQL注入的位置 2.判断服务器类型和后台数据库类型 3.针对不同的服务器和数据库特点进行SQL注入攻击 三、SQL注入攻击实例 比如在一个登录界面,要求输入用户名和密码: 可以这样输入实现免帐号登录: 用户名: ‘or 1 = 1 – 密 码: 点登陆,如若没有做特殊处理,那么这个非法用户就很得意的登陆进去了.(当然现在的有些语言的数据库API已经处理了这些问题) 这是为什么呢? 下面我们分析一下: 从理论上说,后台认证程序中会有如下的SQL语句: String sql = "select * from user_table where username= ' "+userName+" ' and password=' "+password+" '"; 当输入了上面的用户名和密码,上面的SQL语句变成: SELECT * FROM user_table WHERE username= '’or 1 = 1 -- and password='’ """ 分析SQL语句: 条件后面username=”or 1=1 用户名等于 ” 或1=1

Javascript函数声明与递归调用

元气小坏坏 提交于 2020-04-05 23:02:55
Javascript的函数的声明方式和调用方式已经是令人厌倦的老生常谈了,但有些东西就是这样的,你来说一遍然后我再说一遍。每次看到书上或博客里写的Javascript函数有四种调用方式,我就会想起孔乙己:茴字有四种写法,你造吗? 尽管缺陷有一堆,但Javascript还是令人着迷的。Javascript众多优美的特性的核心,是作为顶级对象(first-class objects)的函数。函数就像其他普通对象一样被创建、被分配给变量、作为参数被传递、作为返回值以及持有属性和方法。函数作为顶级对象,赋予了Javascript强大的函数式编程能力,也带来了不太容易控制的灵活性。 1、函数声明 变量式声明先创建一个匿名函数,然后把它赋值给一个指定的变量: var f = function () { // function body }; 通常我们不必关心等号右边表达式的作用域是全局还是某个闭包内,因为它只能通过等号左边的变量f来引用,应该关注的是变量f的作用域。如果f指向函数的引用被破坏(f = null),且函数没有被赋值给任何其它变量或对象属性,匿名函数会因为失去所有引用而被垃圾回收机制销毁。 也可以使用函数表达式创建函数: function f() { // function body } 与变量式不同的是,这种声明方式会为函数的一个内置属性name赋值

脚本编程(一)

∥☆過路亽.° 提交于 2020-04-05 19:33:05
脚本编程(一) 啰里啰唆:每周的最后一天都特别难受。墨迹扣不出文章。 一、概况 注释是以 # 开都的, # 开头不一定都是注释 SHELL 是解释型语言 SHELL 脚本第一句以 #!/bin/bash 开头 SHELL 脚本需要具有执行权限 一般以 .sh 结尾 别名在脚本中无效。在脚本中不能使用别名。 bash 使用技巧: -n 检查语法 , 无法无法检测处命令错误,同时只是检查语法不会真正执行脚本。 -x 逐行执行,逐行显示执行结果 脚本中的错误: 1 、语法错误,会导致后续的命令无法继续执行。可以通过 bash -n 选项来检查 提示的错误行不一定是准确的。 2 、命令错误,后续的命令还可以继续执行。无法通过 bash -n 选项来检查错误,可以使用 set -e 或者 set -o errexit 来设定遇到错误命令后退出 3 、逻辑错误,只能使用 bash -x 选项来检查错误。 变量: 变量表示命名的内存空间,讲数据放在内存空间中,通过 "$ 变量名 " 引用 , 从而获取数据 内置环境变量: PS1 SHELL HASTNAME $$ $? 自定义变量: [set] NAME=VALUE set 可以省略 变量类型: 字符型:默认都是字符型 数值:整型、 bash 不支持浮点型 静态编译语言,使用变量前,先声明变量类型,之后类型不能改变,在编译时执行检查, JAVA

解密PHP伪类型和伪变量的含义

非 Y 不嫁゛ 提交于 2020-04-05 18:06:22
伪类型是PHP 文档里用于表示参数可以使用的类型或者函数的返回类型。 它们不是 PHP 的数据类型。 只是文档说明,相当于注释。 所以理解的重点就是伪类型就是代码注释,用于说明函数的参数和返回类型的。 由于PHP的伪类型中有 array 和 object,而php基本数据类型中也有他们,导致了人们容易混淆。所以在概念上首先要明确。伪类型是文档注释,不是数据类型。 一、伪类型含义 mixed mixed 说明一个参数可以接受多种不同的(不一定是所有的)类型。 number number 说明一个参数可以是 integer 或者 float。 callback callable说明参数类型是回调类型 array|object array|object 意思是参数既可以是 array 也可以是 object。 void void 指定函数的返回类型为空,即该函数不返回值。 ... 在函数的参数列表中使用,...表示等等的意思。表示该函数接收任意数量的参数。 二、其他 伪类型不仅可以标注函数的参数,也可以标注函数的返回类型。 如何增加文档注释,一般是在开发工具中的函数头部输入 /** 然后直接回车即可生成。 三、示例 如内置函数array_push的文档如下: /** * Push elements onto the end of array * @link https://php.net

变量定义和赋值(上)

流过昼夜 提交于 2020-04-05 17:31:55
一、变量的定义 1.变量: 实际上就是在内存中找一个空闲的地方,按照其要存放的数据类型开辟一片空间,用于存放数据,并给这个内存地址空间取一个名称,即是变量名。 2.语法格式要求为:数据类型 变量名; ①最后的分号千万不要丢了。变量的定义是一个语句,C 语言中,语句都是以分号结尾的。 ②“数据类型”表示想要存储什么类型的数据就定义什么类型的变量。想要存储整数就定义成 int 型;想要存储小数就定义成 float 型或 double 型;想要存储字符就定义成 char 型......。 ③“变量名”就是你想给这个变量起个什么名字,通常都是用字母。 二、变量的赋值 1.什么是赋值: 变量是一个存放数据的内存单元,当定义好一个变量后系统会存一个值进去,这个值往往是已经存在于该内存空间的垃圾值(系统分配的一个无意义的值)。将一个数放到一个变量中,这个过程叫“赋值”。“赋”即“给予”的意思,所以“给变量赋值”意思就是将一个值传给一个变量。 2.怎么赋值: ①赋值运算符= ②赋值的格式是:变量名 = 要赋的值;它的意思是将=右边的数字赋给左边的变量。比如:i = 3;这就表示将 3 赋给了变量 i,此时 i 就等于 3 了。 ③注意:这里的=跟数学中的“等于号”是不一样的。C 语言中=表示赋值,即将右边的值赋给左边的变量,而不是左边的变量等于右边的值。 C语言中表示相等的是双等号==

Android config Android.mk parameter

…衆ロ難τιáo~ 提交于 2020-04-05 16:47:50
0x00 LOCAL_PATH 根据 Android 构建系统要求,Android.mk 文档必须以 LOCAL_PATH 变量的定义开头。 LOCAL_PATH := $(call my-dir) Android 构建系统利用 LOCAL_PATH 来定位源文件。因为将改变量设置为硬编码值不合适,所以 Android 构建系统提供了一个名为 my-dir 的宏功能。通过将该变量设置为 my-dir 宏功能的返回值,可以将其放在当前目录下。 0x01 CLEAR_VARS Android 构建系统将 CLEAR_VARS 变量设置为 clear-vars.mk 片段的位置。包含 Makefile 片段可以清除除了 LOCAL_PATH 以外的LOCAL_name 变量,例如 LOCAL_MODULE 与 LOCAL_SRC_FILE 等。 Include $(CLEAR_VARS) 这样做是因为 Android 构建系统可以在单次执行中解析多个构建文件和模式定义,LOCAL_<name> 是全局变量。清除它们可以避免冲突,每一个原生组件被称为一个模块。 0x02 LOCAL_MODULE 改变了是用来给这些模块设定一个唯一的名称。下面的代码将该模块的名称设为 hello-jni: LOCAL_MODULE := hello-jni 因为模块名称也被用于给构建过程的所生成的文件命名

c语言-指针

孤街醉人 提交于 2020-04-05 15:34:03
指针 一、指针的地址 1、变量的地址 计算机中,数据存储在内存中,内存可划分为若干存储单元,每个单元可以存放8位二进制数,即1个字节。内存单元采用线性地址编码,每个单元具有唯一一个地址编码。 【1】变量的地址: 系统 为变量分配的内存单元的地址(内存中每一个字节都有一个编号, 就是“地址”,是一个 无符号整型数 ) 【2】变量的有关概念 存储内容:数据值 空间大小:数据类型 空间位置:地址 生存周期:存储类别 2、变量的访问方式 【1】直接访问 int a; float b; a = 3; //直接将3放入a的地址 b = 4; 【2】间接访问:定义一个变量p,存放a的地址,通过p来访问a 3、指针变量: 存放地址的变量 例:p为指针变量,它存放整型变量a的首地址,就称指针变量p 指向 整型变量a 二、指针变量的定义与引用 指针变量在使用前必须定义,使其指向特定类型的变量,指针变量存放地址,必须定义为“指针类型”。 1、定义方法   类型符 *指针变量名 指针变量的类型 所指向的内存中存放的数据的类型 int *p1,*p2; char *ps; float *pf1,*pf2; 2、指针变量的赋值 【1】指针变量的值为地址,是一个无符号整数, 但不能直接将整型常量赋给指针变量 。 注:变量的类型必须与指针变量的类型相同,若不赋值,则指针变量的值是随机的( 会很危险