诡异的EOF Exception

近日在写一个简单的HTTP代码中遇到了诡异的EOFException,当读取ResponseCode的时候就抛出了EOF异常,感觉很诡异,下面进行问题还原,以及分析和解决过程. 问题 有问题的代码如下: private void testEcho() { String payload = "The quick brown fox jumps over the lazy dog."; try { HttpURLConnection conn = null; BufferedReader br = null; try { String ep = Base64.encodeToString(payload.getBytes(), Base64.URL_SAFE); URL u = new URL("http://httpbin.org/get?p=" + ep + "&key=testEcho"); conn = (HttpURLConnection) u.openConnection(); conn.setRequestMethod("GET"); conn.setDoInput(true); conn.setDoOutput(false); conn.connect(); if (conn.getResponseCode() != HttpURLConnection.HTTP_OK) { Log.e(TAG, "http res " + conn.getResponseCode() + ", msg : " + conn.

嵌入式Linux——printk:printk打印机制分析

简介: 本文主要介绍printk打印机制,并结合内核代码分析其打印的原理。 Linux内核:linux-2.6.22.6 所用开发板:JZ2440 V3(S3C2440A) 声明: 韦东山老师的驱动调试视频让我对printk机制有了更深刻的了解,以前我只是在写驱动的时候用到了printk,认为他其实就是与printf一样的一个打印的函数。但当我对printk函数分析过后我发现他们还是有区别的。而具体的区别我会在文中介绍。 printk代码分析: 下面我们直接从printk的代码开始分析来了解printk的打印机制(而同时我会在分析代码时会补充一些其他的知识点)。 /** * printk - 打印内核信息 * @fmt: 字符串格式 * * printk函数可以被任何上下文调用。在printk中我们试着去获取控制台的信号量。如果我们成功了,那么我们将记录输出信息同时调用控制台驱动。 * 如果我们成功了,那么我们将记录输出信息同时调用控制台驱动。如果我们失败,我们将输出信息放到log_buf中然后返回。 * 控制台信号量的当前拥有者将注意到在release_console_sem()函数中新的输出信息,将他们在释放之前输出到控制台。 * * See also: * printf(3) */ asmlinkage int printk(const char *fmt, ...) { va_list args; int r; va_start(args, fmt); //将fmt后的参数信息保存到args中 r = vprintk(fmt, args); va_end(args); //将参数args设为0 return r; } 我很注重看一个函数上面的注释,因为这个注释可以告诉我们很多有用的信息。比如上面的注释中我们知道了,printk主要做两件事情:第一件就是将信息记录到log中,而第二件事就是调用控制台驱动来将信息输出。所以我们在下面的分析代码时就有了方向,即从上面两个方向找相应的代码并做相关的说明。而从printk的代码中我们并没有看到上面说的这两件事,那么这些代码一定在最主要的vprintk函数里了。 vprintk函数(由于分析的需要我会删除一些代码): asmlinkage int vprintk(const char *fmt, va_list args) { unsigned long flags; int printed_len; char *p; static char printk_buf[1024]; //从这里看printk_buf的大小为1k static int log_level_unknown = 1; preempt_disable(); //禁止内核抢占 /* 禁止本地中断,加自旋锁 */ raw_local_irq_save(flags); lockdep_off(); spin_lock(&logbuf_lock); printk_cpu = smp_processor_id(); /* 将输出信息放到printk_buf中,并返回放入字符的个数 */ printed_len = vscnprintf(printk_buf, sizeof(printk_buf), fmt, args); /* * 将输出信息从printk_buf中拷贝到log_buf中。 * 如果调用者没有为输出信息提供合适的日志级别,我们将为他设置默认的日志级别。 */ for (p = printk_buf; *p; p++) { if (log_level_unknown) { //如果日志级别未知,即没有设定 /* 在一行的开始位置没有发现日志级别信号 */ if (printk_time) { int loglev_char; char tbuf[50], *tp; unsigned tlen; unsigned long long t; unsigned long nanosec_rem; /* * 强制添加日志级别 */ if (p[0] == '<' && p[1] >='0' && p[1] <= '7' && p[2] == '>') { loglev_char = p[1]; p += 3; printed_len -= 3; } else { loglev_char = default_message_loglevel + '0'; } t = printk_clock(); //获得时钟信息 nanosec_rem = do_div(t, 1000000000); tlen = sprintf(tbuf, "

【操作系统】CPU中的时间片的概念

时间片的概念是什么? 时间片即CPU分配给各个程序的时间,每个线程被分配一个时间段,称作它的时间片,即该进程允许运行的时间,使各个程序从表面上看是同时进行的。如果在时间片结束时进程还在运行,则CPU将被剥夺并分配给另一个进程。如果进程在时间片结束前阻塞或结束,则CPU当即进行切换。而不会造成CPU资源浪费。在宏观上:我们可以同时打开多个应用程序,每个程序并行不悖,同时运行。但在微观上:由于只有一个CPU,一次只能处理程序要求的一部分,如何处理公平,一种方法就是引入时间片,每个程序轮流执行。

根据OSS子账户获取STS的TOKEN

前言 目前来说,很多公司都使用者阿里云的资源,对象存储(OSS)就是其中一个我们经常使用的一个资源,在这个使用的过程中,如果我们想要做到一些安全管理(Security Token Service,简称 STS),以及资源的访问控制(Resource Access Management,简称 RAM),这里面也就是官方描述的RAM和STS。 如果你们平台对接很多个合作方,每个合作方又不想从阿里云中重新购买一个新的阿里云的oss,又想实现对每个合作方的资源的一个访问控制,以及权限管理,那么通过这种结合RAM和STS的方式,就非常容易解决这个问题。 阿里云的官方文档并未给出根据子账户的信息如何获取sts的token的例子,获取sts的token的流程有涉及到加签以及urlencode的处理,以及HMAC-SHA1算法的处理,所以这里面有一些坑,由于网上也没有找到详细的例子,官方也没给出例子,直是简单说了这个流程,所以自己倒腾了半天,才整理出来,并拿到生产上使用,下面结合代码说一下这个整体的实现流程。 实现逻辑 下面这个是官方给出的实现说明 根据子账户获取STS的TOKEN 生成sts的toke的工具类 import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.text.SimpleDateFormat; import java.util.Date; import java.util.TimeZone; import java.util.UUID; import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; import org.apache.commons.codec.binary.Base64; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; /** * @ClassName: GenTempOssUtil * @Description: 生成临时的oss信息 * @author wenhuixiang * @date 2018年5月30日 下午4:35:10 * */ public class GenTempOssUtil { private static final String ENCODING = "UTF-8"; private static final String STANDARD_DATE_FORMAT_UTC = "

【学习笔记】struts2项目部署出错解决思路,非程序错误

Type Exception Report Message Illegal char <:> at index 3: jar:file:\D:\jee-oxygen\eclipse-workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp4\wtpwebapps\UpDownloadFile_Struts2\WEB-INF\lib\struts2-core-2.3.34.jar Description The server encountered an unexpected condition that prevented it from fulfilling the request. Exception java.nio.file.InvalidPathException: Illegal char <:> at index 3: jar:file:\D:\jee-oxygen\eclipse-workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp4\wtpwebapps\UpDownloadFile_Struts2\WEB-INF\lib\struts2-core-2.3.34.jar java.base/sun.nio.fs.WindowsPathParser.normalize(WindowsPathParser.java:182) java.base/sun.nio.fs.WindowsPathParser.parse(WindowsPathParser.java:153) java.base/sun.nio.fs.WindowsPathParser.parse(WindowsPathParser.java:77) java.base/sun.nio.fs.WindowsPath.parse(WindowsPath.java:92) java.base/sun.nio.fs.WindowsFileSystem.getPath(WindowsFileSystem.java:229) java.base/java.io.File.toPath(File.java:2300) java.base/java.util.zip.ZipFile$Source.get(ZipFile.java:951) java.base/java.util.zip.ZipFile.<init>(ZipFile.java:216) java.base/java.util.zip.ZipFile.<init>(ZipFile.java:148) java.base/java.util.jar.JarFile.<init>(JarFile.java:324) java.base/java.util.jar.JarFile.<init>(JarFile.java:295) java.base/java.util.jar.JarFile.<init>(JarFile.java:234) com.opensymphony.xwork2.util.fs.JarEntryRevision.needsReloading(JarEntryRevision.java:76) com.opensymphony.xwork2.util.fs.DefaultFileManager.fileNeedsReloading(DefaultFileManager.java:66) com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.needsReload(XmlConfigurationProvider.java:397) org.apache.struts2.config.StrutsXmlConfigurationProvider.needsReload(StrutsXmlConfigurationProvider.java:169) com.opensymphony.xwork2.config.ConfigurationManager.needReloadContainerProviders(ConfigurationManager.java:215) com.opensymphony.xwork2.config.ConfigurationManager.conditionalReload(ConfigurationManager.java:179) com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:73) org.apache.struts2.dispatcher.Dispatcher.getContainer(Dispatcher.java:978) org.apache.struts2.dispatcher.ng.PrepareOperations.createActionContext(PrepareOperations.java:81) org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:89) 环境 jre1.9 ,Tomcat9.0 ,struts2.3 一.检查是不是struts包冲突,或者配置有问题 解决办法:官网下载struts-2.3.34-all.zip,解压 打开里面的【struts-2.3.34】-->【apps】-->【struts2-blank.war】-->【WEB-INF】-->【lib】, 复制粘贴到项目的【WebContent】-->【lib】下 (先清空原先的jar包,buildPath里面的引用也要删除),然后在add to buildPath; 复制空项目里面的“web.xml”到本项目的【WEB-INF】下,删除掉不必要的内容,只保留filter 复制空项目中的“struts.xml”到本项目中src下,修改删除掉不必要的内容

PHP中json返回的数据中带有bom头

做项目时碰到这么一个问题php后台返回的接口,前台无法识别,bejson也无法解析。 错误效果如下,解析时 json里面的字段前面有红点。 请求的json格式如下; 经过两天的挖坑发现是返回的内容里面,包含bom格式的编码。 解决方法去掉bom编码,(通过转化成utf8编码格式,从而达到去除utf-8-bom的作用) 实现思路是:(由于不知道data数组里面的哪一个标签前面出现了bom编码,因此递归data数组,去掉bom标签) public function checkBom($arr){ foreach ($arr as $k => $v){ if(is_array($v)){ $arr[$k] = $this->checkBom($v); }else{ $encode = mb_detect_encoding($v, array("ASCII","UTF-8","GB2312","GBK","BIG5")); //获取编码,编码格式 if($encode == 'UTF-8' ){ $arr[$k] = @iconv('UTF-8',"GBK",$arr[$k]); //转换编码,去掉bom编码。 $arr[$k] = @iconv('GBK',"UTF-8",$arr[$k]); } } } return $arr; }

Python 环境下的三种基础结构

众所周知,在我们的程序世界里有三大结构:顺序结构、分支结构、循环结构。 我们来逐一看一下。 顺序结构 自上而下地执行编写的代码 分支结构 根据不同的情况,走对应的分支,执行不同的代码 在Python里面,常用 if elif else 的搭配 单分支结构 当满足某一条件,即判断条件内容为真值时,所执行后续语句块 适用于 满足单一条件时 使用 if <判断条件>: <语句块> 双分支结构 满足该条件,及不满足时,执行各自不同的代码块 适用于 对某一条件满足与否时有不同的处理方式时 使用 if <判断条件>: <语句块> else : <语句块> 多分支结构 条件众多,分别满足时,执行各自的代码块 适用于 对于判断条件不唯一时 使用 if <判断语句1>: <代码块> elif <判断语句2>: <代码块> ... else: <代码块> 对于分支结构,多种选择方式,以及存在可省略的语句和条件,造就了 程序的灵活性。合理的使用,会造就更整洁、更高效的程序。 循环结构 多次执行对应的代码块,可分为 有限循环 或 无限循环 无限循环 while 不做次数限制,根据条件决定是否继续。若满足条件,则仍循环对应代码块 适用于 不能准确的确定循环次数,需要根据情况判断时 使用 while <条件>: <代码块> 有限循环 常用 for i in range( ) 来执行确定次数的循环,也可通过 for i in <字符串、列表、文件等> 来遍历对应的内容

linux centos7无法连接ssh

在centos7连接ssh时,参考了以下博文,终于完美解决 https://blog.csdn.net/trackle400/article/details/52755571 1、 首先,要确保CentOS7安装了 openssh-server,在终端中输入 yum list installed | grep openssh-server 此处显示已经安装了 openssh-server,如果又没任何输出显示表示没有安装 openssh-server,通过输入 yum install openssh-server 来进行安装openssh-server 2、 找到了 /etc/ssh/ 目录下的sshd服务配置文件 sshd_config,用Vim编辑器打开 将文件中,关于监听端口、监听地址前的 # 号去除 然后开启允许远程登录 最后,开启使用用户名密码来作为连接验证 保存文件,退出 3、 开启 sshd 服务,输入 sudo service sshd start 检查 sshd 服务是否已经开启,输入ps -e | grep sshd 或者输入netstat -an | grep 22 检查 22 号端口是否开启监听 4、 在Vmware Workstation中,查看CentOS7的属性,发现网络连接方式是采用的 NAT 方式连接的 5、 在Vmware Workstation中,点击编辑=》虚拟网络编辑器,进入虚拟网络编辑器,查看发现 NAT 模式的连接采用的网络适配器名称为VMnet8 6、在 windows 主机中,在命令行中输入ipconfig 查看主机IP,找到 VMnet8 的连接信息,此处 ip 为192.

在cmd/bat脚本中获取当前脚本文件所在目录

Q:在Win7/Win10中以管理员身份运行在cmd/bat脚本时,如何获取当前脚本文件所在目录? 当我们在Win7/Win10中使用鼠标右键的“以管理员身份运行”以管理员身份运行cmd/bat脚本时,系统默认进入的目录是C:\Windows\System32目录,因此cmd脚本文件中的相应命令因路径不对提示找不到要执行的程序文件等提示。 netpay_Service.exe -install netpay_Monitor.exe -installA:解决办法:使用cd /d %~dp0,先进入cmd/bat脚本所在的目录,再去执行其他命令。 netpay_Service.exe -install netpay_Monitor.exe -install 这个脚本在xp、2000、2003等系统中都可以正常双击运行。在win7/Win10系统中双击运行时,会以普通用户身份运行,此时所获取的文件路径的确是当前路径,而不是C:\Windows\System32。但是运行到安装netpay_Service.exe -install 的系统服务时,普通用户显然权限是不够的。 于是在InstllSvc_En.cmd右键选择“以管理员身份运行”,此时又会出问题,win7/win10可能出于安全问题考虑,此时获得的目录是C:\Windows\System32,于是提示netpay_Service.exe命令无效或程序文件不存在,执行出错。 此时在脚本开始尝试加入命令cd %cd%,来获取当前路径,实验得知,这行语句在xp等系统中有效,但是在win7/win10中依然无效。得到的目录依然是C:\Windows\System32。 百度一下才知道要使用cd /d %~dp0命令来获取脚本所在的目录。在脚本最开始添加cd /d %~dp0即可,如下: cd /d %~dp0 netpay_Service.exe -install netpay_Monitor.exe -install 在Windows XP~Windows 10系统上运行此脚本,确认都没有问题。下面对命令中涉及到的参数做一解释。 一、关于cd的/d参数 关于cd 的/d参数,在cmd中敲入cd /? 可以看到/d参数的解释如下: 使用 /D 命令行开关,除了改变驱动器的当前目录之外,还可改变当前驱动器。这句话不太好理解,我做个试验: 通常我们在xp系统中打开cmd窗口时,会显示 C:\users\Administrator> 如果我们执行“cd e:\xxx”命令,发现目录依然还是在C:\users\Administrator 此时,我们键入e:,不但会切换到d盘,而且会会发现E盘上的当前目录为e:/xxx。 C:\users\Administrator>cd e:\xxx C:\users\Administrator>e: e:\xxx> 下面语句我们就能看到/d参数的作用了。发现加了/d参数之后直接切换到e:\xxx目录了。 C:\users\Administrator>cd /d e:\xxx e:\xxx> 结论:不加/d参数只能在同一驱动器的目录之间切换,加上/d参数则能在不同驱动器之间的目录之间切换。 二、关于%~dp0的批处理命令的详细解释 对此命令并不清楚,以下内容都来自百度搜索结果: %~dp0 “d”为Drive的缩写,即为驱动器,磁盘、“p”为Path缩写,即为路径,目录 cd是转到这个目录,不过我觉得cd /d %~dp0 还好些 选项语法: ~0 - 删除任何引号("),扩充 %0 %~f0 - 将 %0 扩充到一个完全合格的路径名(“f”是file,即文件) %~d0 - 仅将 %0 扩充到一个驱动器号 %~p0 - 仅将 %0 扩充到一个路径 %~n0 - 仅将 %0 扩充到一个文件名(“n”是name 文件名) %~x0 - 仅将 %0 扩充到一个文件扩展名 %~s0 - 扩充的路径只含有短名(“s”为Short,短的) %~a0 - 将 %0 扩充到文件的文件属性(“a”为attribute,即属性) %~t0 - 将 %0 扩充到文件的日期/时间(“t”time) %~z0 - 将 %0 扩充到文件的大小(Size 大小) %~$PATH:0 - 查找列在路径环境变量的目录,并将 %0 扩充到找到的第一个完全合格的名称。如果环境变量名未被定义,或者没有找到文件,此组合键会扩充到空字符串,可以组合修饰符来得到多重结果: %~dp0 - 仅将 %0 扩充到一个驱动器号和路径 %~nx0 - 仅将 %0 扩充到一个文件名和扩展名 %~fs0 - 仅将 %0 扩充到一个带有短名的完整路径名 %~dp$PATH:0 - 查找列在路径环境变量的目录,并将 %I 扩充到找到的第一个驱动器号和路径。 %~ftza0 - 将 %0 扩充到类似输出线路的 DIR %0为当前批处理文件,如果0换成1为第一个文件,2为第2个 ********************************************************************************************* %0 代指批处理文件自身 %~d0 是指批处理所在的盘符 %~dp0 是盘符加路径 cd %~dp0 就是进入批处理所在目录了

可以在html下运行的vue的helloworld

<span style="font-size:14px;"><!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>HelloWorld</title> <link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css"> <script src="https://unpkg.com/vue/dist/vue.js"></script> <script src="https://unpkg.com/element-ui/lib/index.js"></script> <script src="https://unpkg.com/axios/dist/axios.min.js"></script> <script src="https://cdn.bootcss.com/Sortable/1.6.0/Sortable.js"></script> </head> <body> <div id="app"> <el-table :data="tableData" stripe style="width: 100%"> <el-table-column prop="date" label="日期" width="180"> </el-table-column> <el-table-column prop="name" label="姓名" width="180"> </el-table-column> <el-table-column prop="address" label="地址"> </el-table-column> <el-table-column prop="img" label="图片"> <template scope="scope"> <img :src="scope.row.img" width="120" height="80" /> </template> </el-table-column> </el-table> </div> <script> var testVue = new Vue({ el:'#app', data(){ return { tableData: [{ date: '2016-05-02', name: '王小虎', address: '上海市普陀区金沙江路 1518 弄', img:"

Linux 路由表详解及 route 命令详解

参考资料 Linux 内核的路由表 通过 route 命令查看 Linux 内核的路由表: [root@VM_139_74_centos ~]# route Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface default gateway 0.0.0.0 UG 0 0 0 eth0 10.0.0.10 10.139.128.1 255.255.255.255 UGH 0 0 0 eth0 10.139.128.0 0.0.0.0 255.255.224.0 U 0 0 0 eth0 link-local 0.0.0.0 255.255.0.0 U 1002 0 0 eth0 172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0 172.18.0.0 0.0.0.0 255.255.0.0 U 0 0 0 br-0ab63c131848 172.

算法笔记(一)害死人不偿命的(3n+1)猜想

算法算是我比较薄弱的部分了,所以万丈高楼平地起,我要从最基本的算法学起来。做项目和有算法思想是不一样的,我会变得更好。 每天一道算法题: 输入一个数,偶数时则砍掉一半;奇数时,则(3n+1)砍掉一半,最后直到得到1.问,进行了多少次? 思路:对于3n+1这样的题目,我第一感觉就是将运算部分封装起来,然后主函数循环调用 书给的答案: #include <cstdio.h> int main() { int n, step; scanf("%d", &n); while(n != 1) { if(n % 2== 0) n=n/2; else n = (3*n +1)/2; step++; } printf("%d\n", step); return 0; } 我的答案: #include <iostream> using namespace std; int pat(int n) { if(n%2==0) { return n/2; }else return (3*n+1)/2; } int main() { int n1,i=0; cin >> n1; while(n1 != 1){ n1 = pat(n1); i++;

【Hive】解析json(get_json_object)

get_json_object(string json_string, string path) 说明: 第一个参数填写json对象变量,第二个参数使用$表示json变量标识,然后用 . 或 [] 读取对象或数组;如果输入的json字符串无效,那么返回NULL。 每次只能返回一个数据项。 举例: data 为 test表中的字段,数据结构如下: data = { "store": { "fruit":[{"weight":8,"type":"apple"}, {"weight":9,"type":"pear"}], "bicycle":{"price":19.95,"color":"red"} }, "email":"amy@only_for_json_udf_test.net", "owner":"amy" } 1.get单层值 hive> select get_json_object(data, '$.owner') from test; 结果:amy 2.get多层值. hive> select get_json_object(data, '$.store.bicycle.price') from test; 结果:19.95 3.get数组值[] hive> select get_json_object(data, '$.store.fruit[0]') from test; 结果:{"weight":8,"type":"apple"}

php生成唯一的八位英文+数字邀请码实现

/**生成单个邀请码 * @return string */ public static function make_invite_code(){ $code="ABCDEFGHIGKLMNOPQRSTUVWXYZ"; $rand=$code[rand(0,25)].strtoupper(dechex(date('m'))) .date('d').substr(time(),-5) .substr(microtime(),2,5).sprintf('%02d',rand(0,99)); for( $a = md5( $rand, true ), $s = '0123456789ABCDEFGHIJKLMNOPQRSTUV', $d = '', $f = 0; $f < 8; $g = ord( $a[ $f ] ), // ord()函数获取首字母的 的 ASCII值 $d .= $s[ ( $g ^ ord( $a[ $f + 8 ] ) ) - $g & 0x1F ], //按位亦或,按位与。 $f++ ); return $d; }

Easy h-index(水题)

题目链接:http://exam.upc.edu.cn/problem.php?id=7034 思路:从大到小枚举h,主要是理解题目,要求至少有h篇 引文不低于h 的论文 真的坑,我一直都在错,错得我都怀疑人生了。 #include<bits/stdc++.h> using namespace std; typedef long long ll; ll a[250005]; int main() { ll n; while(scanf("%lld",&n)!=EOF){ ll sum=0; for(int i=0;i<=n;i++){ scanf("%lld",&a[i]); } for(int i=n;i>=0;i--){ sum+=a[i]; if(sum>=i){ printf("%d\n",i);break; } } } return 0; }

Flutter App (一) —— ListView以及GridView的列表展示与Item点击事件

欢迎来到xhu_ww的博客 本文章为作者在学习Flutter 时的学习总结,在本文中你可了解到以下内容: Flutter的安装与项目创建Flutter中ListView的使用Flutter中GridView的使用Flutter中Text控件的使用Flutter中Image控件的使用Flutter中控件的点击事件Flutter中Dialog的展示 1. Flutter的安装与使用 能查看本文,相信你对Flutter 已经有了一定的了解,在此就不用对Flutter 进行介绍了。如果完全不了解可以查看: Flutter 官网 1.1 Flutter的安装 虽然 Flutter 官方文档 已有详细的安装介绍与使用教程了,但我还是对在 Windows Android Studio 中的使用作一下简单介绍。 1.1.1 获取Flutter SDK SDK下载地址:https://flutter.io/sdk-archive/ 点击链接进入官网选择自己系统对应的SDK,下载最新版SDK,并解压。记录本文时下载的版本为Beta v0.3.2。 1.1.2 配置环境变量 将下载好的SDK zip文件解压后,点击 “控制面板>用户帐户>用户帐户>更改我的环境变量” 将Flutter SDK bin文件所在路径 如H:\flutter\bin 添加进Path环境变量中。 DOS命令行中输入以下命令可判断是否成功并查看flutter的命令用法。 flutter 1.1.3 Android Studio的配置 Xcode中的配置方式参考:https://flutter.io/setup-macos/进行配置 在Android Studio中 点击 “File>Settings>Plugins>Browse repositories” 搜索 Flutter 安装插件,然后重启Android Studio即可。 1.2 Flutter App的创建 在Android Studio 中点击 “File>New>New Flutter Project” 选择 Flutter Application 然后 下一步。如果环境变量配置成功,在Flutter SDK path 那一栏会自动选中本地Flutter所在的位置。

JSCPC 2018 A——Easy h-index

题目描述: The h-index of an author is the largest h where he has at least h papers with citations not less than h. Bobo has published many papers. Given a0,a1,a2,…,an which means Bobo has published ai papers with citations exactly i, find the h-index of Bobo. 输入: The input consists of several test cases and is terminated by end-of-file. The first line of each test case contains an integer n.

江苏省赛 JSCPC2018 A. Easy h-index

题目 A. Easy h-index The h-index of an author is the largest h where he has at least h papers with citations not less than h. Bobo has published many papers. Given a0,a1,a2,…,an which means Bobo has published ai papers with citations exactly i, find the h-index of Bobo. Input The input consists of several test cases and is terminated by end-of-file. The first line of each test case contains an integer n.

mybatis 查询条件包含list

1、查询条件 private List<String> birthdayCon; // 生日条件:01-12,格式如:01,02 private Integer ageMin; // 最小年龄 private Integer ageMax; // 最大年龄 private List<Map<String, Object>> cityCon;// 城市条件 2、mybatis如下: <select id="selectFor" resultType="java.lang.Long" parameterType="com.test.Query"> select DISTINCT(u.user_id) as userId FROM t_user u LEFT JOIN t_user_info info ON u.user_id = info.user_id LEFT JOIN t_order o on u.user_id = o.user_id <where> <if test="storeId != null and storeId != ''">and u.store_id = #{storeId}</if> <if test="sex != null and sex != ''">and u.