首页 文章 精选 留言 我的

精选列表

搜索[基础模型],共10000篇文章
优秀的个人博客,低调大师

Linux基础命令---host域名查询工具

host host是一个常用的DNS查询工具,经常用来查询域名、检查域名解析是否正确。 此命令的适用范围:RedHat、RHEL、Ubuntu、CentOS、Fedora。 1、语法 host [选项] name [server] 2、选项列表 -a 查询所有的信息 -c 设置查询类型 -C 查询完整的SOA记录 -d | -v 显示详细过程 -l 列表模式 -t 选择查询类型:CNAME NS SOA SIG KEY AXFR -w 永久等待 -W 设置等待超时 3、实例1)查询域名 [root@localhost ~]# host www.baidu.com //查询域名信息,显示别名和ip www.baidu.com is an alias for www.a.shifen.com. www.a.shifen.com has address 111.13.100.91 www.a.shifen.com has address 111.13.100.92 2)查询所有信息 [root@localhost ~]# host -a www.baidu.com //查询域名的所有信息 Trying "www.baidu.com" ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 51953 ;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 1, ADDITIONAL: 0 ;; QUESTION SECTION: ;www.baidu.com. IN ANY ;; ANSWER SECTION: www.baidu.com. 696 IN CNAME www.a.shifen.com. www.a.shifen.com. 22 IN A 111.13.100.91 www.a.shifen.com. 22 IN A 111.13.100.92 ;; AUTHORITY SECTION: a.shifen.com. 60 IN SOA ns1.a.shifen.com. baidu_dns_master.baidu.com. 1810060004 5 5 2592000 3600 Received 147 bytes from 172.20.10.1#53 in 10 ms 做了一个Linux学习的平台,目前出来一个雏形,各位可以参考使用 链接:https://pan.baidu.com/s/1GOLVU2CbpBNGtunztVpaCQ 密码:n7bk

优秀的个人博客,低调大师

Docker入门基础之容器使用

Docker简介 Docker 是一个开源的应用容器引擎,基于Go语言并遵从Apache2.0协议开源。 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。 容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。 Ubuntu Docker 安装 1、Docker官方安装方法 Docker 要求 Ubuntu 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的 Ubuntu 版本是否支持 Docker。获取安装包: root@ubuntu:~# wget -qO- https://get.docker.com/ | sh 安装完成后有提示: If you would like to use Docker as a non-root user, you should now consider adding your user to the "docker" group with something like: ​ sudo usermod -aG docker runoob Remember that you will have to log out and back in for this to take effect! 启动docker服务 root@ubuntu:~# sudo service docker start 2、通过安装URLOS获得 URLOS基于Docker运行,安装了URLOS,就等于安装了Docker,我们可以使用URLOS官方安装命令: curl -LO www.urlos.com/iu && sh iu 或 curl -O https://www.urlos.com/install && chmod 544 install && ./install Docker容器使用Docker客户端Docker 客户端非常简单 ,可以直接输入 Docker 命令来查看到 Docker 客户端的所有命令选项。 root@ubuntu:~# docker 可以通过命令docker command --help更深入的了解指定的 Docker 命令使用方法。例如我们要查看docker stats指令的具体使用方法: root@ubuntu:~# docker stats --help 启动容器(交互模式)我们如果要使用版本为16.04的ubuntu系统镜像来运行容器时,命令如下: root@ubuntu:~# docker run -it ubuntu:16.04 sh 如果要使用版本为15.04的ubuntu系统镜像,则命令如下: root@ubuntu:~# docker run -it ubuntu:15.04 sh 各个参数解析: docker: Docker 的二进制执行文件。 run:与前面的 docker 组合来运行一个容器。 -it:其实是两个参数组成, -i 和 -t,-i:允许你对容器内的标准输入 (STDIN) 进行交互。-t:在新容器内指定一个伪终端或终端。 ubuntu:15.04:指定要运行的镜像,Docker首先从本地主机上查找镜像是否存在,如果不存在,Docker 就会从镜像仓库 Docker Hub 下载公共镜像。 sh:执行命令。 将上面的命令稍作修改,在结尾处加上一句命令,执行后: root@ubuntu:~# docker run -it ubuntu:16.04 sh -c "while true; do echo hello urlos; sleep 1; done" hello urlos hello urlos hello urlos hello urlos hello urlos hello urlos ^Croot@ubuntu:~# 我们可以看到终端上不断输出 hello urlos ,这时按键盘Ctrl+c来终止输出。启动容器(后台模式)我们将上面的命令再稍作修改,把 -it 替换为 -d 看看结果: root@ubuntu:~# docker run -d ubuntu:16.04 sh -c "while true; do echo hello urlos; sleep 1; done" 0cf141fd0745fb4dc104bec1a3238a1bd8dad7aa72926dea0a39ddc7ba54fe32 在输出中,我们没有看到期望的"hello world",而是一串长字符0cf141fd0745fb4dc104bec1a3238a1bd8dad7aa72926dea0a39ddc7ba54fe32 这个长字符串叫做容器ID,对每个容器来说都是唯一的,我们可以通过容器ID来查看对应的容器发生了什么。首先,我们需要确认容器有在运行,可以通过 docker ps 来查看: root@ubuntu:~# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 0cf141fd0745 ubuntu:16.04 "sh -c 'while true; …" 2 minutes ago Up 2 minutes hopeful_matsumoto 然后使用 docker logs [ID或者名字]命令,查看容器内的标准输出: root@ubuntu:~# docker logs hopeful_matsumoto hello urlos hello urlos hello urlos hello urlos hello urlos hello urlos hello urlos hello urlos 我们可以看到,在容器内部已经输出了非常多的hello urlos,这说明容器处于后台运行模式。 运行一个WEB应用容器现在我们将在docker容器中运行一个 nginx 应用来运行一个web应用。 首先从Docker Hub公共镜像源中拉取镜像: root@ubuntu:~# docker pull nginx 然后运行这个镜像: root@ubuntu:~# docker run -d -p 8080:80 nginx 参数说明: -d:让容器在后台运行。 -p:让宿主机的8080端口映射给容器内部的80端口。 查看WEB应用容器 使用 docker ps 来查看我们正在运行的容器: root@ubuntu:~# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b394756b6c5d nginx "nginx -g 'daemon of…" 3 seconds ago Up 2 seconds 0.0.0.0:8080->80/tcp elastic_babbage 我们看到端口信息 0.0.0.0:8080->80/tcp,意思是宿主机的8080端口映射给容器内部的80端口。 这时我们可以通过浏览器访问WEB应用: 查看端口的快捷方法通过docker ps命令可以查看到容器的端口映射,docker还提供了另一个快捷方式 docker port,使用 docker port 可以查看指定 (ID 或者名字)容器的某个确定端口映射到宿主机的端口号。 上面我们创建的 web 应用容器 ID 为 b394756b6c5d 容器名为 elastic_babbage。 我可以使用 docker port b394756b6c5d 或 docker port elastic_babbage 来查看容器端口的映射情况。 root@ubuntu:~# docker port b394756b6c5d 80/tcp -> 0.0.0.0:8080 root@ubuntu:~# docker port affectionate_montalcini 80/tcp -> 0.0.0.0:8080 查看 WEB 应用程序日志使用docker logs [ID或者名字]可以查看容器内部的标准输出。 root@ubuntu:~# docker logs b394756b6c5d 192.168.43.131 - - [04/Jun/2019:06:28:42 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:67.0) Gecko/20100101 Firefox/67.0" "-" 2019/06/05 06:28:42 [error] 6#6: *1 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 192.168.43.131, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: "192.168.43.122:8080" 192.168.43.131 - - [04/Jun/2019:06:28:42 +0000] "GET /favicon.ico HTTP/1.1" 404 153 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:67.0) Gecko/20100101 Firefox/67.0" "-" 查看WEB应用程序容器的进程我们还可以使用 docker top 来查看容器内部运行的进程 root@ubuntu:~# docker top b394756b6c5d UID PID PPID C STIME TTY TIME CMD root 2069 2050 0 23:24 ? 00:00:00 nginx: master process nginx -g daemon off; systemd+ 2100 2069 0 23:24 ? 00:00:00 nginx: worker process 停止 WEB 应用容器使用 docker stop [ID或者名字] 命令停止容器 root@ubuntu:~# docker stop b394756b6c5d b394756b6c5d 启动 WEB 应用容器使用 docker start [ID或者名字] 命令启动已经停止的容器 root@ubuntu:~# docker start b394756b6c5d b394756b6c5d 重新启动WEB应用容器我们能还可以使用 docker restart [ID或者名字] 命令重新启动正在运行的容器 root@ubuntu:~# docker restart b394756b6c5d b394756b6c5d docker ps -l 查询最后一次创建的容器: root@ubuntu:~# docker ps -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b394756b6c5d nginx "nginx -g 'daemon of…" 12 minutes ago Up 12 minutes 0.0.0.0:8080->80/tcp elastic_babbage 删除WEB应用容器我们可以使用 docker rm [ID或者名字] 命令来删除不需要的容器注意:删除容器时,容器必须是停止状态,否则会报如下错误: root@ubuntu:~# docker rm b394756b6c5d Error response from daemon: You cannot remove a running container b394756b6c5d95f1d43f11393c169cc73de40938d8f09db81077c8bce6e5881a. Stop the container before attempting removal or force remove 如果要删除正在运行的容器,这时我们只需要加入 -f 参数即可: root@ubuntu:~# docker rm -f b394756b6c5d b394756b6c5d

优秀的个人博客,低调大师

Python3入门(一)基础语法

Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。Python 的设计具有很强的可读性,相比其他语言经常使用英文关键字,其他语言的一些标点符号,它具有比其他语言更有特色语法结构 Python 是一种解释型语言: 这意味着开发过程中没有了编译这个环节。类似于PHP和Perl语言 Python 是交互式语言: 这意味着,您可以在一个 Python 提示符 >>> 后直接执行代码 Python 是面向对象语言: 这意味着Python支持面向对象的风格或代码封装在对象的编程技术 Python 是初学者的语言:Python 对初级程序员而言,是一种伟大的语言,它支持广泛的应用程序开发,从简单的文字处理到 WWW 浏览器再到游戏。 接下来一段时间我将和大家一起学习python,现在开始吧 一、Python标识符 在Python里,标识符由字母、数字、下划线组成。 在Python中,所有标识符可以包括英文、数字、以及下划线(_),但不能以数字开头。 Python中标识符是区分大小写的。 以下划线开头的标识符是有特殊意义的。以单下划线开头_foo的代表不能直接访问的类属性,需要通过类提供的接口进行访问,不能用from xxx或者import * 导入。以双下划线开头的__foo代表类的si'you'che'g私有成员,以双下划线开头和结尾的__foo__代表Python里特殊方法专用的表示,如__init__()代表类的构造函数。 二、Python保留字符 and exec not assert finally or break for pass class from print continue global raise def if return del import try elif in while else is with except lambda yield 三、行和缩进 Python和其他语言最大的区别就是,Python的代码块不使用大括号{}来控制类,函数以及其他逻辑判断,Python最具特色的就是用缩进来写模块。缩进的空白数量是可变的,但是所有代码块语句必须包含相同的缩进空白数量,必须严格执行,比如 if True: print("hello") else: print("no hello") 以下代码会执行错误,提示格式不对 if True: print("hello") else: print("no hello") print("error") 四、多行语句 Python中一般以新的一行作为语句的结束符,但是我们可以使用斜杠\将一行的语句分为多行显示,如下: a = "a" + "b" + "c" + \ "d" + \ "e" print(a) # 输出结果为abcde 语句中包含[]、{}或者()就不用使用多行连接符,如下 days = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'] print(days) # 输出['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'] 五、Python引号 python可以用单引号'、双引号"、三引号"'或"""来表示字符串,其中三引号可以由多行组成,编写多行文本的快捷语法,常用于文档字符串,在文件的特定地点,被当作注释。 word = 'word' sentence = '这是句子' paragraph = """这是一个段落。 包含了多个语句""" 六、Python注释 Python中单行注释采用#开头 # 第一个注释 print('hello') 多行注释采用三个单引号或者三个双引号 ''' 这是多行注释 这是多行注释 ''' 七、Python空行 函数之间或类的方法之间用空行分隔,表示一段新的代码的开始。类和函数入口之间也用一行空行分隔,以突出函数入口的开始。空行与代码缩进不同,空行并不是Python语法的一部分。书写时不插入空行,Python解释器运行也不会出错。但是空行的作用在于分隔两段不同功能或含义的代码,便于日后代码的维护或重构。记住:空行也是程序代码的一部分 八、等待用户输入 下面程序将等待用户输入,按下回车键退出 name = input("Please input your name: ") print("Hello "+name) 八、一行显示多条语句 Python中可以在同一行中使用多条语句,语句直接用;分隔,但是个人不建议这么写,感觉不美观 name = input("Please input your name: "); a = "nihao" print("Hello " + name+", a = "+a) 九、输出语句 Python中通过print输出,这样是换行的,如果不想换行,可以使用逗号 a = "nihao" b = "hello" print(name, a) 本文到此结束啦,如果发现内容有误欢迎指正哦,也希望大家持续关注哦!!!

优秀的个人博客,低调大师

python学习之路——基础语法篇(1)

一、数据类型初识 -数字,包括int(用%d输出),float(用%f输出)age=18-布尔,只有两种取值,True或Falseflag=True-字符串,在python中,字符串是一个类name='张三'-列表,列表里面的内容可以是不同的数据类型l=['张三',18,'李四']-元组,元组和列表的区别在于元组里面的内容不能重复s=(1,2,3,4)-字典,冒号前面的称为键(key),后面的称为值(value)d={'张三':18,'李四':19} 二、变量的定义与输入输出 1.变量的定义 python中的变量定义很简单,不需要像C/JAVA等定义变量类型,也不以分号表示结尾,直接用等号赋值即可: name='张三' age=18 2.变量的输入 使用input函数,input输入默认的是string也就是字符串类型,如果要输入其它类型比如说int类型的数字,需要进行强制类型转换 age= input("age:") if age.isdigit() : # 判断是否为数字 salary = int(salary) # 将string转换为int类型 因为输入的时候可能会输入空格,如果想跳过空格,可以用strip()函数age= input("age:").strip() 3.变量的输出 python的输出是采用格式化输出的方式,如果是字符串类型的变量可以直接输出,并且字符串与其它类型的变量相加会自动将其它类型的变量转换成字符串。 sexb='boy' sexg='girl' print("I am an happy %s" %(sexb)) # I am an happy boy print("I am an happy %s" %(sexg)) # I am an happy girl 或者直接输出: sexb='boy' print("I am an happy",sexb ) # I am an happy boy print("I am an happy"+sexb) # I am an happyboy 需要注意的是,用逗号分隔时会自动加一个空格,用'+'连接时不会加空格,并且python里面的print会自动换行。要想去掉换行就用一个end参数: print("123",end="") # 默认end='\n',即回车换行,现在是以空串结尾 print("456") 三、注释、多行输出及语法 1.注释 python的单行注释用#,多行注释用'''要注释的东西''',在pycharm中注释的快捷键为ctrl+?,若多行注释就选中要注释的代码块,然后按ctrl+? #name="张三" ''' name="张三" age=18 ''' 2.多行输出 多行输出用'''要输出的东西''' menu_bank = ''' 1. aaa 2. bbb 3. ccc 4. ddd''' print(menu) 3.语法 python是通过缩进来检测是否为一个语句块,语句块是以冒号开始,用空格的缩进来表示其语句块内部的语句。 s='b' if 'a'==s:#冒号表示开始 return True#缩进表示if内部的语句 return False python中单引号与双引号的作用相同,用这两种引号括起来的都是字符串。 四、循环 1.for循环 for循环是指依次遍历每一个可迭代对象,可以是列表、元组等: for i in range(5):#这个是指在[0,4]进行循环 if i==3: break# 跳出这层for循环 print(i) n=5 for i in range(n):#也是对[0,4]进行遍历 if i==3: continue# 不继续往下执行,直接执行下一个迭代,即令i=4 print(i) else:# 只有当for循环正常执行结束时才会调用,如果有break或者return等就不会执行 print("正常执行完for循环") 2.while循环 while循环与for类似,只是while只有循环条件,而for除了循环条件还有循环变量: i=0 while i<5: print(i) i+=1 else:# 只有当while循环正常执行结束时才会调用,如果有break或者return等就不会执行 print("正常执行完while循环") 在python中没有i++,i--,++i,--i等。 记录自己的python学习之路,错误的地方欢迎指正~~

优秀的个人博客,低调大师

零基础大数据学习框架

大数据开发最核心的课程就是Hadoop框架,几乎可以说Hadoop就是大数据开发。这个框架就类似于Java应用开发的SSH/SSM框架,都是Apache基金会或者其他Java开源社区团体的能人牛人开发的贡献给大家使用的一种开源Java框架。科多大数据大数据来带你看看。 Java语言是王道就是这个道理,Java的核心代码是开源的,是经过全球能人牛人共同学习共同研发共同检验的,所以说Java是最经得住检验的语言,而且任何人都可以学习Java核心技术并且使用核心技术开发出像android一样的系统和Hadoop一样的框架。如果把编程的世界比作一棵树,那么Java是根,SSH和Hadoop这样的框架都是它开得枝散得叶。 由于大数据开发工程师是目前IT培训界最热门的专业,大数据技术人才是引领智能革命的弄潮儿,是智能时代最直接的受益者,这么重要的

优秀的个人博客,低调大师

建站零基础入门【小白攻略】

使用阿里云建站有多种方式,本篇教程主要介绍自助建站的流程。 建站方式使用阿里云搭建网站有多种方式,您可参照下表选择合适的建站方式:建站方式 优势 适用人群自助建站 服务器购买、网站搭建、网站维护全程自主,弹性灵活。 希望自行设计、有动手意愿的用户。适用于刚接触云计算或对云服务器和建站不太了解的个人或小企业用户。云市场网站模板 即买即用,轻松便捷,后台管理方便,且有专人进行网站维护。 适合无特殊需求的个人和小企业用户,支持 PC、手机、微信等多种渠道,选择多样,成本较低。云市场企业官网定制 即买即用,轻松便捷,后台管理方便,且有专人进行网站维护。 适合看重网站个性化、预算相对充足、希望节省人力、使用需求迫切的企业用户。自助建站步骤步骤1. 选择服务器不同网站类型需要的ECS配置不同,请您

优秀的个人博客,低调大师

Python零基础学习笔记(一)

Python是一种解释型、面相对象、动态数据类型的高级程序设计语言。解释型:没有编译环节交互式:可以在一个python提示符,直接互动执行程序面向对象:支持面向对象的风格或代码封装在对象的编程技术初学者的语言:对初级程序员来说,支持广泛的应用程序开发,从简单的文字处理到www浏览器再到游戏都可以写。 特点: 易于学习:相对较少的关键字,结构简单,明确定义的语法 易于阅读:代码定义更为清晰 易于维护:成功点在于源码相当容易维护 一个广泛的标准库:有丰富的库,跨频台兼容性好unix/windows/macintosh 互动模式: 可移植:基于其开源代码的特性 可扩展:可以在python中调用c和c++语言 数据库:python提供所有主要商业数据库的接口 GUI编程:支持GUI,可以创建和移植到很多系统调用 可嵌入:可以将python嵌入到c/c++程序中 缺点: 运行速度慢 代码不能加密

优秀的个人博客,低调大师

Javascript基础之-强制类型转换(二)

上一章主要讲了转换到数字,字符串和布尔类型的一些知识点,那么这一讲接着上面的继续讲。 思考下面这个问题: console.log(+"123"); // 123 console.log(-"123"); // -123 console.log(+"abc"); // NaN console.log(-"abc"); // NaN +这个很容易理解,就是把字符串转成了数字,而-这个呢,除了把字符串转为数字以外,还会吧这个数字加否。所以无论+还是-都会进行类型转换,唯一的区别,就是-会置否而+不会。 那么+除了当作一元运算符外,还有一个更广为人知的就是作为加法运算符。 那么加法运算符的话,实际上是有两种可能性的,一种是字符串的拼接,另一种就是做运算。接下来咱们就对这方面详细的讲解一下。 先说结论,如果在+的其中有一个操作数是字符串或者可以转为字符串的话,那么就进行字符串拼接。 反之,如果俩都是数字的话,则进行加法运算。 这时候,肯定会有人问,假如说我有其他的数据类型呢,又不是数字又不是字符串,比如说数组啊,对象啊,布尔值啥的, 那么如果是引用数据类型,则先转为基本数据类型,再进行比较。 如果是布尔呢,如果加法的另一边是数字的话,那么他就会转为数字,如果是字符串的话,就直接拼接啦. 上面说了一大堆的理论的东西,想必大家看着也累了。来上例子。 console.log(true + 11); // 12 console.log(true + false); // 1 console.log(true + '11'); // "true11" 这个很明显可以看出,如果操作数是数字的话,或者说,操作数都是字符串的话,那么布尔值会先转为数字,再进行拼接操作,如果有一个操作数是字符串的话,那就不转啦,直接拼接。 那么如果是对象类型,它是先转为基本数据类型,怎么转呢,其实就是先调用valueOf,如果valueOf不存在,或者返回的不是基本数据类型,就调用toString,如果toString也没有或者是返回的不是基本数据类型呢,那估计就直接报错了,看例子。 var obj = { valueOf() { return [2, 3]; }, toString() { return "sss"; } } var obj1 = { valueOf() { return 111; }, toString() { return "abc"; } } var obj2 = { valueOf() { return []; }, toString() { return { abc: 'liuhaitao', } } } console.log(obj + 1); // "sss1" console.log(obj1 + 1); // 112 console.log(obj2 + 1); // "Cannot convert object to primitive value" 那么下面一个例子就很容易理解了。 console.log([1].valueOf()); // [1] console.log([1] + [2]); // 12 因为数组的valueOf的值依然为数组,所以他们转的时候,就会调用toString,所以就转成了字符串啦,俩字符串进行拼接,得到最终结果 减法运算符(-) 很显然,减法运算符就是做减法的,他很单纯,就只是做减法,但是呢,这个有一个知识点,就是,减法里的操作数,如果不是数字的话,那么会先转为数字类型的。 console.log("123" - 0); // 123 console.log([3] - [1]); // 2 console.log({valueOf() { return 3}} - {valueOf() { return 2}}); // 1 这个很明显,第一个和第二个的结果都是转为了数字再进行运算的,那第三个呢,其实这个就是对象的转化方式,如果有valueOf的话,会先执行valueOf找出基本类型值,没有或者不是基本类型值就找toString,最后呢,吧基本类型值转为数字再进行减法运算 。 好了,加法和减法都说完了,那么乘法和除法呢,其实和减法类似,都是转为数字这样的。 console.log("123" * 0); // 0 console.log([3] * [1]); // 3 console.log({valueOf() { return 3}} * {valueOf() { return 2}}); // 6 想看乘法和除法其他的细节和本文关系不是太大,所以就不细讲了,详情请查阅文档ecma文档: https://www.ecma-international.org/ecma-262/5.1/#sec-11.5.1 https://www.ecma-international.org/ecma-262/5.1/#sec-11.5.2 还有本节最后一部分,就是有关于逻辑与(&&)和逻辑或(||) 为啥要特地介绍他俩呢,因为他俩的语法和其他语言的语法特性似乎有那么一些区别。来看代码 var a = 42; var b = "abc"; var c = null; console.log(a || b); // 42 console.log(a && b); // "abc" console.log(c || b); // "abc" console.log(c && b); // null 这一块可以看出,他和其他语言的不同之处在于,他的运算的结果,并不是true和false,而是具体的值,也就是说 ||符号的时候,如果第一个操作数是true,则返回第一个操作数,如果是false返回第二个, &&相反,如果第一个操作数是true,则返回第二个操作数,如果是false则返回第一个。 那这个有啥用呢? 其实可以利用这个的特性简化我们的代码,比如说 function exec () { console.log('exec'); } true && exec(); // exec var a = undefined; var b = a || 10; console.log(b); // 10 这个代表了应用的两个方面,&&可以做函数执行的前置判断,后面那个呢,可以做缺省时的默认值,你可以仔细观察一下,在一些压缩代码工具,压缩完后的代码,很多都把if 条件判断改成了&&,这次知道原因了吧。 参考书籍《你不知道的Javascript中卷》 参考文章:https://codeburst.io/javascript-why-does-3-true-4-and-7-other-tricky-equations-9dd13cb2a92a 本文转载自http://www.lht.ren/article/8/

优秀的个人博客,低调大师

Javascript基础之-强制类型转换(一)

转换为字符串规则如下图代码: console.log(String(undefined)); // "undefined" console.log(String(null)); // "null" console.log(String(true)); // "true" console.log(String(+0)); // "0" console.log(String(-0)); // "0" console.log(String(-20)); // "-20" console.log(String(Infinity)); // "Infinity" console.log(String(new Number(123))) // 123 console.log(String(new Object())) // [object Object] console.log(100000000000000000000000000000); // 1e+29 大致就是普通其他基本类型转为字符串的话,就直接转为其值的字符串表达形式, 如果是基本类型的封装对象,会先拆封,然后再转为字符串, 如果是普通对象,则会调用其内部[class]的值, 如果是极大数和级小数,将会进行一些转化,具体规则请参考ecma 官方文档https://www.ecma-internationa... 请思考下面的代码 var obj = { toString() { return "toString"; } } console.log(String(obj)) // toString var obj1 = Object.create(null); obj1.valueOf = function() { return "valueOf"; } console.log(String(obj1)); // valueOf 上面这个代码似乎可以看出,实际上普通对象转为字符串的过程,似乎就是toString()的一个过程,也就是调用其内部toString()的一个过程 如果toString()没有咋办,调用valueOf,如果这个也没有呢,就直接报错了。 转换为数字的规则 普通转换为数字的规则如下: console.log(Number(true)); // 1 console.log(Number(0b1101)) // 13 console.log(Number(false)); // 0 console.log(Number("123")); //123 console.log(Number("123a")); //NaN console.log(Number(undefined)); // NaN console.log(Number(null)); // 0 不过呢,如果是对象类型的咋办呢,实际上同上的一点是,如果是基本类型封装后的对象,会先拆封,也就是转为基本类型值,然后再转为数字,比如说 console.log(Number(new String("123123"))); // 123123 console.log(Number([1])); // 1 console.log(Number([1, 3])); // NaN 可能你会疑惑,说,为啥数组只有一个数据的时候可以转换,有两个数据的时候就是NaN了呢,原因在这里,看代码 console.log([1].valueOf()); // [1] console.log([1, 3].valueOf()); // [1, 3] console.log([1].toString()); // 1 console.log([1, 3].toString()); //1, 3 可以看到,valueOf没有返回基本类型值,所以转而使用toString转为基本类型值,这俩字符串再转为数字的结果就一目了然了,和上面的是一样的 那么转为数字的过程中,valueOf和toString是哪个先执行的呢? 看代码 var a = { valueOf() { return 2; }, toString() { return 3; } } var b = { valueOf() { return [1, 3]; }, toString() { return 3; } } var c = { toString() { return 3; } } var d = Object.create(null); console.log(Number(a)); // 2 console.log(Number(b)); // 3 console.log(Number(c)); // 3 console.log(Number(d)); // Uncaught TypeError: Cannot convert object to primitive value 这个其实就说明了一个问题,就是说对象转数字的时候,会先找valueOf(),如果valueOf()没有,或者是说转的是非基本数据类型的,将会使用toString(),最后基本类型专成数字类型的,如果valueOf和toString()都没有,就直接报错了 转化为数字呢,除了以上使用Number(),还可以使用+符号,这个也可以实现从其他类型转换到字符串 console.log(+"abc"); // NaN console.log(+"1111"); //1111 console.log(+[1]); // 1 var obj = { valueOf() { return "1111"; } } console.log(+obj); // 1111 如果原数据类型是Date,那么可以用Number或者+转为以微秒为单位的unix时间戳 var d = new Date( "Mon, 18 Aug 2014 08:53:06 CDT" ); console.log(+d); // 1408369986000 console.log(Number(d)); //1408369986000 parseInt和Number()的区别:看例子 var a = "123abc"; console.log(+a); // NaN console.log(parseInt(a)); // 123 console.log(parseInt("abc123")); // NaN 实际上,parseInt会从左往右进行解析,找到非字符串的时候停止,如果一开始就不可转为数字,那么就返回NaN parseInt其他一些坑点,这里就不细说了,想看的,可以找《你不知道的Javascript》了解细节 // 0 ("0" 来自于 "0.000008") console.log(parseInt( 0.000008 )); // 8 ("8" 来自于 "8e-7") console.log(parseInt( 0.0000008 )); // 250 ("fa" 来自于 "false") console.log(parseInt( false, 16 )); // 15 ("f" 来自于 "function..") console.log(parseInt( parseInt, 16 )); console.log(parseInt( "0x10" )); // 16 console.log(parseInt( "103", 2 )); // 2 转化为布尔值 下面是假值列表,理论上说,除了以下内容以外的值都是true console.log(Boolean(undefined)); console.log(Boolean(null)); console.log(Boolean(false)); console.log(Boolean(+0)); console.log(Boolean(-0)); console.log(Boolean(NaN)); console.log(Boolean("")); 这里有一点需要说明,规范里有提到,所有的对象都是true,所以这方面尤其需要注意的就是下面的例子了 console.log(Boolean(new Boolean(false))); // true console.log(Boolean(new String(""))); // true console.log(Boolean(new Number(0))); // true 返回的都是true,虽然他是对假值得封装,但是他们是对象,是对象就返回true,所以用假值对象或者其他看起来像价值的字符串来进行if判断是不靠谱的 var bObj = new Boolean(false); var a = []; var d = {}; var e = function() {} var f = "false"; var g = "0"; var h = "''"; if (a && d && e && f && g && h) { console.log('all right'); // all right } 一般显式的吧数据转为布尔型,除了使用Boolean()以外,还可以使用!!符号,也就是连着反转两次 console.log(!!undefined); // falseconsole.log(!!new Boolean(false)); // true 好了就到这里了,这一次因为东西比较零散,准备了一阵子,希望大家有所收获 参考书籍《你不知道的Javascript中卷》 本文转载自http://www.lht.ren/article/5/

优秀的个人博客,低调大师

Android 基础动画之 scale 渐变缩放

小菜最近在学习 ViewPager 的小动画,说来惭愧,工作这么久了一直没有认真了解过动画这部分,今天特意学习一下 Android 的基本动画。 Android 的基本的动画包括 alpha(透明度)/ scale(缩放)/ translate(位移) / rotate(旋转)四种,小菜今天学习一下 scale 渐变缩放动画效果。 Activity 绑定动画事件: mBtn1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mV1.startAnimation(AnimationUtils.loadAnimation(AnimActivity.this, R.anim.anim_scale)); } }); layout.xml 显示动画效果 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Button android:id="@+id/anim_btn1" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="40dp" android:text="开始动画" /> <View android:id="@+id/anim_v1" android:layout_width="300dp" android:layout_height="150dp" android:layout_gravity="center" android:background="@color/colorAccent" /> </LinearLayout> anim.xml 设置动画属性 <?xml version="1.0" encoding="utf-8"?> <scale xmlns:android="http://schemas.android.com/apk/res/android" android:duration="3500" android:fromXScale="0.0" android:fromYScale="0.0" android:pivotX="100%p" android:pivotY="100%p" android:toXScale="1.0" android:toYScale="1.0" /> 代码很简单,小菜接下来逐条学习一下 anim_scale 中各条属性: 1. android:duration="3500" duration 代表动画过程中持续时常; 2. android:fromXScale="0.0" fromXScale 代表初始时横向 View 比例,0.0为从没有开始动画,1.0即 View 原尺寸,2.0即 View 原尺寸两倍;建议与 toXScale 共同使用; 3. android:fromYScale="0.0" fromYScale 为初始时纵向 View 比例,与 fromXScale 使用相同; 4. android:toXScale="1.0" toXScale 代表动画过程中横向变化尺寸比例,一般与 fromXScale 共同使用; 5. android:toYScale="1.0" toYScale 代表动画过程中纵向变化尺寸比例,一般与 fromYScale 共同使用; 6. android:pivotX="100%p" android:pivotY="100%p" pivotX 和 pivotY 是小菜重点学习的地方,小菜理解为动画起点坐标,可以为整数值、百分数(或者小数)、百分数p 三种样式。 整数值:android:pivotX="100" 整数值类型是相对于自身 View 来定义,以自身 View 左上角的点为原点,水平向右为正,竖直向下为正的坐标系中计算,设置的整数值为 px,为固定值。 百分数/小数:android:pivotX="100%" 百分数/小数类型是相对于自身 View 来定义,与整数值类似,只是坐标点是以自身 View 尺寸比例来计算而非固定值。 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Button android:id="@+id/anim_btn1" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="40dp" android:text="开始动画" /> <FrameLayout android:layout_width="match_parent" android:layout_height="wrap_content" > <FrameLayout android:layout_width="match_parent" android:layout_height="wrap_content" > <View android:id="@+id/anim_v1" android:layout_width="300dp" android:layout_height="150dp" android:layout_gravity="center" android:background="@color/colorAccent" /> </FrameLayout> <View android:layout_width="match_parent" android:layout_height="1dp" android:background="@android:color/background_dark" /> <View android:layout_width="1dp" android:layout_height="match_parent" android:layout_gravity="center" android:layout_marginRight="150dp" android:background="@android:color/background_dark" /> </FrameLayout> </LinearLayout> 百分数 + p: 这种方式是最特殊的,小菜理解为自身 View 与相对于某个父容器的大小,并非单纯的根据父容器大小尺寸位置。小菜为了测试方便,设置了一个固定的 400dp*400dp 的 LinearLayout,测试百分数 + p 的方式都正常,但是如果设置 View 居中或其他情况时跟小菜想的很有差距,小菜测试了很久,终于有一些了解。 百分比 + p 这种方式是相对的,既与父容器相关也与自身 View 相关,当设置 View 位置为居中或其他位置时,整个移动的坐标系也会变化,原点并非直接父容器左上角而是自身 View 左上角,整个移动布局根据 View 平移;而父容器是一个框架,动画的范围大小为父容器大小且只在父容器中进行展示。如图: 小菜这才了解到刚开始测试时并未设置 LinearLayout 的 gravity 或自身 View 的 layout_gravity 属性,默认是居左上角,此时与父容器左上角重合。 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Button android:id="@+id/anim_btn1" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="40dp" android:text="开始动画" /> <FrameLayout android:layout_width="wrap_content" android:layout_height="wrap_content" > <LinearLayout android:layout_width="400dp" android:layout_height="400dp" android:background="#8099cc00" android:layout_marginLeft="50dp" android:layout_marginTop="125dp" android:gravity="center" android:orientation="horizontal" /> <LinearLayout android:layout_width="400dp" android:layout_height="400dp" android:background="#80008577" android:gravity="center" android:orientation="horizontal" > <View android:id="@+id/anim_v1" android:layout_width="300dp" android:layout_height="150dp" android:background="@color/colorAccent" android:gravity="center" android:text="Hello World!" /> </LinearLayout> <View android:layout_width="4dp" android:layout_height="4dp" android:layout_marginLeft="248dp" android:layout_marginTop="123dp" android:background="@android:color/background_dark" /> <View android:layout_width="4dp" android:layout_height="4dp" android:layout_marginLeft="48dp" android:layout_marginTop="323dp" android:background="@android:color/background_dark" /> <View android:layout_width="4dp" android:layout_height="4dp" android:layout_marginLeft="248dp" android:layout_marginTop="323dp" android:background="@android:color/background_dark" /> <View android:layout_width="4dp" android:layout_height="4dp" android:layout_marginLeft="448dp" android:layout_marginTop="523dp" android:background="@android:color/background_dark" /> </FrameLayout> </LinearLayout> 7. android:interpolator="@android:anim/accelerate_decelerate_interpolator" interpolator 代表缩放动画曲线,即动画由大变小,变换速率等,小菜目前还未学习到,后期补充。 小菜的动画部分是短板,正在从零学习,不对的请多多指正!

优秀的个人博客,低调大师

GeoMesa时空基础及应用场景

PPT下载地址:https://yq.aliyun.com/download/3266 视频回看:https://yq.aliyun.com/live/793 内容概要:GeoMesa是一款开源的基于分布式计算系统的面向海量时空数据查询与分析的工具包。本报告首先介绍了GeoMesa基于HBase系统的整体架构与部署架构,其次,分析了其时空索引原理与算法实现,最后简要介绍了GeoMesa与Spark、Kafka、Lambda等开源系统或架构的整合方式。 讲师:肖斐——阿里云数据库技术专家 直播地址HBase生态+Spark社区钉钉大群方式一:扫码入群看直播方式二:Link入群看直播https://dwz.cn/Fvqv066s 直播时间:每周二 18:00-18:30 分享;18:30- 18:45~ 问答

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册