精华内容
参与话题
问答
  • 博客文章《完成端口详解》配套代码

    千次下载 热门讨论 2011-10-31 17:50:38
    这份代码是我博客里的文章《完成端口详解 - 手把手教你玩转网络编程系列之三》的配套代码 里面的代码包括VC++2008/VC++2010编写的完成端口服务器端的代码,还包括一个对服务器端进行压力测试的客户端,都是经过我...
  • #{}和${}的区别

    简单区分两者关系:
    #{}里面的值相当于加上双引号。也就是说它进行了sql预编译
    ${}里面的值就相当于直接取值。也就是没有进行sql预编译

    • #{}的例子
    select * from t_user where username = #{username}
    //相当于 select * from t_user where username = 'username'
    
    • ${}的例子
    select * from t_user where username = ${username}
    //相当于 select * from t_user where username = username
    

    很明显使用${}很可能造成sql注入问题,假设一个登录需求,我们需要验证用户名和密码登录如果我们使用 ${},那岂不是只要知道用户名就可以随意登录系统了吗!但是如果我们使用#{}就可以进行sql预编译,避免了sql注入问题!

    //sql编译之后为:select * from t_user where username = 用户名 and password = 1 or 1 = 1
    select * from t_user where username = ${username} and password = ${1 or 1 = 1}
    
    //sql编译之后为:select * from t_user where username = '值' and password = '1 or 1 = 1'
    select * from t_user where username = #{username} and password = #{1 or 1 = 1}
    

    像使用Mybatis的时候进行排序(ORDER BY ${age})需要动态参数时注意,用 ${}而不是#{}

    最后总结一个下两者区别:

    1. #{}是进行sql预编译的,可以防止sql注入问题
    2. ${}是不进行sql预编译的,不能防止sql注入问题
    3. $方式一般用于传入数据库对象,例如传入表名.
    4. 一般能用#{}就不要使用${}
    5. 当我们使用ORDER BY进行排序的时候使用${}而不是使用#{}
    展开全文
  • STM32 GPIO详解

    万次阅读 多人点赞 2020-07-10 13:52:57
    目录 01、I/O接口电路 1.1、普通输入 1.2、普通输出 1.3、模拟输入 1.4、复用输出 02、管脚复用和重映射 2.1、STMF10X系列 2.1、STMF20X系列 03、相关名词解释 下文将根据STM32F207参考手的中GPIO框图... 上

    目录

    01、I/O接口电路

    1.1、普通输入

    1.2、普通输出

    1.3、模拟输入

    1.4、复用输出

    02、管脚复用和重映射

    2.1、STMF10X系列

    2.1、STMF20X系列

    03、相关名词解释


    下文将根据STM32F207参考手的中GPIO框图讲解GPIO功能。

    01、I/O接口电路

    带FT的是说明可以容忍5V电压的,I/O电路框图

    1.1、普通输入

    普通输入模式下,上拉和下拉电阻(微弱)的存在,共分3种模式

    1. 浮空输入,不使能上拉电阻,不使能下拉电阻

    2. 上拉输入,使能上拉电阻

    3. 下拉输入,使能下拉电阻

    从上面框图得知,输出缓存是被禁止的

    1.2、普通输出

    普通输入模式下,上拉和下拉电阻(微弱)的存在。主要是由于P-MOS和N-MOS的存在分为下列两种模式

    1. 开漏模式:输出寄存器是 0 时,激活 N-MOS, 而输出寄存器是 1 时,端口保持高阻态(P-MOS 不会被使能)

    2. 推挽输出: 输出寄存器是 0 时,激活 N-MOS, 而输出寄存器是 1 时,激活 P-MOS

    从上面的框图得知,

    1、在普通输出模式中,TTL施密特触发器是打开的,所以读输入数据寄存器,可以得到 I/O 的状态。

    2、驱动GPIO输出,我们可以采用输出寄存器也可以使用位段

    1.3、模拟输入

    模拟输入上拉电阻和下拉电阻是没有用的

    高阻态下模拟输入

    从上面框图得知

    1. 弱上拉和下拉电阻禁止

    2. 施密特触发器停用,施密特触发器输出值强制为0

    3. 输出缓存被禁止

    4. 读输入数据期存器, 读到的值为0

    注意:IO配置成模拟输入时,不能容忍5V电压

    1.4、复用输出

    复用输出框图

    从上图框图中可以得到5条信息

    1. 输出缓存被来自外设的信号驱动(发送数据器使能和数据),也即是位设置/清除寄存器和输出数据寄存器在这里是无用的

    2. 由于P-MOS和N-MOS使能,仍然可以配置成推挽输出和开漏输出

    3. 上拉电阻和下拉电阻使能,可以进行配置

    4. TTL施密特触发器使能

    5. 可以通过读输入数据寄存器, 可以得到 I/O 的状态

     

    02、管脚复用和重映射

    管脚复用和重映射(其实是一回事),STMF10X系列叫重映射,STMF20X系列叫管脚复用,也就是复用功能

    2.1、STMF10X系列

    STM32上有很多I/O口,也有很多的内置外设想I2C,ADC,ISP,USART等,为了节省引出管脚,这些内置外设基本上是与I/O口共用管脚的,也就是I/O管脚的复用功能。但是STM32还有一特别之处就是:很多复用内置的外设的I/O引脚可以通过重映射功能,从不同的I/O管脚引出,即复用功能的引脚是可通过程序改变的。

    三个红框交汇处.STM32F103VCT6这个CPU的USART1接的是PB6/PB7但是上电初始化后默认功能并非是USART1.所以想要用串口功能.必须用端口重映射。

    STM32的单片机每个功能模块有自己的时钟系统,所以要想要调用STM32单片机的功能模块时必须先配置对应时钟,然后才能去操作相应的功能模块.端口重映射也一样.如图示:

    重映射步骤为:

    1.打开重映射时钟和USART重映射后的I/O口引脚时钟, 

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB |RCC_APB2Periph_AFIO,ENABLE);

    2.I/O口重映射开启.

    GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE);

    3.配制重映射引脚, 这里只需配置重映射后的I/O,原来的不需要去配置.​​​​​​​

    GPIO_InitStructure.GPIO_Pin =GPIO_Pin_6;
    GPIO_InitStructure.GPIO_Mode =GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz;
    GPIO_Init(GPIOB,&GPIO_InitStructure);
    
    GPIO_InitStructure.GPIO_Pin =GPIO_Pin_7;
    GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOB,&GPIO_InitStructure);

    2.1STMF20X系列

    STMF20X系列(包括之后的40系列)是没有重映射的说法,只有统一的称为复用功能。

    从上图看出F10X系列会有专门的普通IO寄存器,会有复用寄存器,使用库函数如下:

    void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalStateNewState)

     

    从上图F20X系列使用了复用功能寄存器,然不是像F10系列存在专门的复用寄存器,F20X系列GPIO复用的功能更广。

    备注:要先配置GPIO为复用功能,再调用复用的库函数

     

    03、相关名词解释

    GPIO模式名字解释

    GPIO_Mode

    全拼

    描述

    GPIO_Mode_AIN

    Analogue  In

    模拟输入

    GPIO_Mode_IN_FLOATING

    Float  In

    浮空输入

    GPIO_Mode_IPD

    In Pull Down

    下拉输入

    GPIO_Mode_IPU

    In Pull Up

    上拉输入

    GPIO_Mode_Out_OD

    Out Drain

    开漏输出

    GPIO_Mode_Out_PP

    Push Pull

    推挽输出

    GPIO_Mode_AF_OD

    Alternate Function

    复用开漏输出

    GPIO_Mode_AF_PP

    Alternate Function

    复用推挽输出

    F20系列:GPIO共有四种功能​​​​​​​

    typedef enum
    { 
      GPIO_Mode_IN   = 0x00, /*!< GPIO Input Mode */
      GPIO_Mode_OUT  = 0x01, /*!< GPIO Output Mode */
      GPIO_Mode_AF   = 0x02, /*!< GPIO Alternate function Mode */
      GPIO_Mode_AN   = 0x03  /*!< GPIO Analog Mode */
    }GPIOMode_TypeDef;
    

    GPIO状态

    推挽输出

    可以输出强高低电平,连接数字器件。

    开漏输出

    只可以输出强低电平,高电平需要外部电阻拉高,输出端相当于三极管的集电极,要得到高电平,需要上拉电阻,适合做电流型的驱动,其吸收电流negligence相对强(一般20ma以内)

    高阻态

    高阻态是一个数字电路里常见的术语,指的是电路的一种输出状态,既不是高电平也不是低电平,如果高阻态再输入下一级电路的话,对下级电路无任何影响,和没接一样,如果用万用表测的话有可能是高电平也有可能是低电平,随它后面接的东西定的。如果设置为浮空输入,也就是既没有上拉电阻,没有下拉电阻。可以认为是高阻态。

     

    点击查看本文所在的专辑,STM32F207教程

     

    关注公众号,第一时间收到文章更新。评论区不能及时看到,需要交流可以到公众号沟通

    展开全文
  • Linux中top命令参数详解

    万次阅读 多人点赞 2019-07-31 19:28:22
    top命令用法 top命令经常用来监控linux的系统状况,是常用的性能分析工具,能够实时显示系统中各个进程的资源占用情况。 top的使用方式 top [-d number] | top [-bnp] 参数解释: -d:number代表秒数,表示top...

    top命令用法

    top命令经常用来监控linux的系统状况,是常用的性能分析工具,能够实时显示系统中各个进程的资源占用情况。

    top的使用方式 top [-d number] | top [-bnp]

    参数解释:

    -d:number代表秒数,表示top命令显示的页面更新一次的间隔。默认是5秒。 -b:以批次的方式执行top。 -n:与-b配合使用,表示需要进行几次top命令的输出结果。 -p:指定特定的pid进程号进行观察。

    在top命令显示的页面还可以输入以下按键执行相应的功能(注意大小写区分的):

    ?:显示在top当中可以输入的命令 P:以CPU的使用资源排序显示 M:以内存的使用资源排序显示 N:以pid排序显示 T:由进程使用的时间累计排序显示 k:给某一个pid一个信号。可以用来杀死进程 r:给某个pid重新定制一个nice值(即优先级) q:退出top(用ctrl+c也可以退出top)。

    top各输出参数含义

    下面是使用top命令来进行性能检测的截图:

    图一(ubuntu):

    图二(centos):

    一、top前5行统计信息

    第1行:top - 05:43:27 up 4:52, 2 users, load average: 0.58, 0.41, 0.30 
    第1行是任务队列信息,其参数如下:

    内容 含义
    05:43:27 表示当前时间
    up 4:52 系统运行时间 格式为时:分
    2 users 当前登录用户数
    load average: 0.58, 0.41, 0.30 系统负载,即任务队列的平均长度。 三个数值分别为 1分钟、5分钟、15分钟前到现在的平均值。

    load average: 如果这个数除以逻辑CPU的数量,结果高于5的时候就表明系统在超负荷运转了。 

    第2行:Tasks: 159 total, 1 running, 158 sleeping, 0 stopped, 0 zombie 
    第3行:%Cpu(s): 37.0 us, 3.7 sy, 0.0 ni, 59.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st 
    第2、3行为进程和CPU的信息 
    当有多个CPU时,这些内容可能会超过两行,其参数如下:

    内容 含义
    159 total 进程总数
    1 running 正在运行的进程数
    158 sleeping 睡眠的进程数
    0 stopped 停止的进程数
    0 zombie 僵尸进程数
    37.0 us 用户空间占用CPU百分比
    3.7 sy 内核空间占用CPU百分比
    0.0 ni 用户进程空间内改变过优先级的进程占用CPU百分比
    59.3 id 空闲CPU百分比
    0.0 wa 等待输入输出的CPU时间百分比
    0.0 hi 硬中断(Hardware IRQ)占用CPU的百分比
    0.0 si 软中断(Software Interrupts)占用CPU的百分比
    0.0 st  


    第4行:KiB Mem: 1530752 total, 1481968 used, 48784 free, 70988 buffers 
    第5行:KiB Swap: 3905532 total, 267544 used, 3637988 free. 617312 cached Mem 
    第4、5行为内存信息 
    其参数如下:

    内容 含义
    KiB Mem: 1530752 total 物理内存总量
    1481968 used 使用的物理内存总量
    48784 free 空闲内存总量
    70988 buffers(buff/cache) 用作内核缓存的内存量
    KiB Swap: 3905532 total 交换区总量
    267544 used 使用的交换区总量
    3637988 free 空闲交换区总量
    617312 cached Mem 缓冲的交换区总量。
    3156100 avail Mem 代表可用于进程下一次分配的物理内存数量

    上述最后提到的缓冲的交换区总量,这里解释一下,所谓缓冲的交换区总量,即内存中的内容被换出到交换区,而后又被换入到内存,但使用过的交换区尚未被覆盖,该数值即为这些内容已存在于内存中的交换区的大小。相应的内存再次被换出时可不必再对交换区写入。 

    计算可用内存数有一个近似的公式: 
    第四行的free + 第四行的buffers + 第五行的cached

    二、进程信息

    列名 含义
    PID 进程id
    PPID 父进程id
    RUSER Real user name
    UID 进程所有者的用户id
    USER 进程所有者的用户名
    GROUP 进程所有者的组名
    TTY 启动进程的终端名。不是从终端启动的进程则显示为 ?
    PR 优先级
    NI nice值。负值表示高优先级,正值表示低优先级
    P 最后使用的CPU,仅在多CPU环境下有意义
    %CPU 上次更新到现在的CPU时间占用百分比
    TIME 进程使用的CPU时间总计,单位秒
    TIME+ 进程使用的CPU时间总计,单位1/100秒
    %MEM 进程使用的物理内存百分比
    VIRT 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
    SWAP 进程使用的虚拟内存中,被换出的大小,单位kb
    RES 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
    CODE 可执行代码占用的物理内存大小,单位kb
    DATA 可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb
    SHR 共享内存大小,单位kb
    nFLT 页面错误次数
    nDRT 最后一次写入到现在,被修改过的页面数。
    S 进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程
    COMMAND 命令名/命令行
    WCHAN 若该进程在睡眠,则显示睡眠中的系统函数名
    Flags 任务标志

    其他

    默认进入top时,各进程是按照CPU的占用量来排序的。

    1、在top基本视图中,按键盘数字“1”可以监控每个逻辑CPU的状况: 

     
    2、敲击键盘‘b’(打开关闭加亮效果)top视图变换如下: 

    PID为16283为当前top视图中唯一的运行态进程。也可以敲击键盘‘y’来打开或者关闭运行态进程的加亮效果。

    3、敲击键盘‘x’(打开/关闭排序列的加亮效果),top视图变换如下: 

    可以看到现在是按"%CPU"进行排序的,可以按”shift+>”或者”shift+<”左右改变排序序列。

    4、改变进程显示字段

    在top基本视图中,敲击”f”进入另一个视图,在这里可以编辑基本视图中的显示字段:

     

    用上下键选择选项,按下空格键可以决定是否在基本视图中显示这个选项。

    top命令是一个非常强大的功能,但是它监控的最小单位是进程,如果想监控更小单位时,就需要用到ps或者netstate命令来满足我们的要求。

    参考文献

    1、https://blog.csdn.net/quiet_girl/article/details/50668126

    2、http://www.zhimengzhe.com/linux/298422.html

    展开全文
  • ViewPager 详解(一)---基本入门

    万次阅读 多人点赞 2014-08-09 09:48:01
    前言:这两天研究研究ViewPager滚动功能,现在很多的app都有用到这个功能,我们的大虾米也有这个模块。要研究就彻底的研究研究,我从不满足于一个功能...1、《ViewPager 详解(一)---基本入门》 2、《ViewPager 详...

    前言:这两天研究研究ViewPager滚动功能,现在很多的app都有用到这个功能,我们的大虾米也有这个模块。要研究就彻底的研究研究,我从不满足于一个功能只是简单的应用,要学就学的彻底,所以我打算将ViewPager 分几篇写,研究的哪个程度就写到哪个程度吧。今天是第一篇,基本入门篇 。

     

     

    相关文章:

    1、《ViewPager 详解(一)---基本入门》

    2、《ViewPager 详解(二)---详解四大函数》

    3、《ViewPager 详解(三)---PagerTabStrip与PagerTitleStrip添加标题栏的异同》

    4、《ViewPager 详解(四)----自主实现滑动指示条》

    5、《ViewPager 详解(五)-----使用Fragment实现ViewPager滑动》

     

    首先让大家有个全局的认识,直接上个项目,看看仅仅通过这几行代码,竟然就能完成如此强悍的功能。下篇再结合API仔细讲讲为什么要这么写。

    效果图:

    实现了三个view间的相互滑动

                         第一个VIEW向第二个VIEW滑动       第二个VIEW向第三个VIEW滑动

       

    一、新建项目,引入ViewPager控件

    ViewPager。它是google SDk中自带的一个附加包的一个类,可以用来实现屏幕间的切换。

    1.在主布局文件里加入

     

     

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        tools:context="com.example.testviewpage_1.MainActivity" >
    
    <android.support.v4.view.ViewPager
        android:id="@+id/viewpager"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center" />
    
    </RelativeLayout>

     

    其中 <android.support.v4.view.ViewPager /> 是ViewPager对应的组件,要将其放到想要滑动的位置

    2、新建三个layout,用于滑动切换的视图

    从效果图中也可以看到,我们的三个视图都非常简单,里面没有任何的控件,大家当然可以往里添加各种控件,但这里是个DEMO,只详解原理即可,所以我这里仅仅用背景来区别不用layout布局。

    布局代码分别如下:

    layout1.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:background="#ffffff"
        android:orientation="vertical" >
        
    
    </LinearLayout>

    layout2.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:background="#ffff00"
        android:orientation="vertical" >
        
    
    </LinearLayout>
    

    layout3.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:background="#ff00ff"
        android:orientation="vertical" >
        
    
    </LinearLayout>
    
    

     

    二、代码实战

    先上整体代码,然后逐步讲解。

    package com.example.testviewpage_1;
    /**
     * @author  harvic
     * @date 2014.8.9
     */
    import java.util.ArrayList;
    import java.util.List;
    import java.util.zip.Inflater;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.support.v4.view.PagerAdapter;
    import android.support.v4.view.ViewPager;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    
    
    public class MainActivity extends Activity {
    
    	private View view1, view2, view3;
    	private ViewPager viewPager;  //对应的viewPager
    	
    	private List<View> viewList;//view数组
       
       
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            
            viewPager = (ViewPager) findViewById(R.id.viewpager);
            LayoutInflater inflater=getLayoutInflater();
            view1 = inflater.inflate(R.layout.layout1, null);
            view2 = inflater.inflate(R.layout.layout2,null);
            view3 = inflater.inflate(R.layout.layout3, null);
            
            viewList = new ArrayList<View>();// 将要分页显示的View装入数组中
    		viewList.add(view1);
    		viewList.add(view2);
    		viewList.add(view3);
    		
    		
    		PagerAdapter pagerAdapter = new PagerAdapter() {
    			
    			@Override
    			public boolean isViewFromObject(View arg0, Object arg1) {
    				// TODO Auto-generated method stub
    				return arg0 == arg1;
    			}
    			
    			@Override
    			public int getCount() {
    				// TODO Auto-generated method stub
    				return viewList.size();
    			}
    			
    			@Override
    			public void destroyItem(ViewGroup container, int position,
    					Object object) {
    				// TODO Auto-generated method stub
    				container.removeView(viewList.get(position));
    			}
    			
    			@Override
    			public Object instantiateItem(ViewGroup container, int position) {
    				// TODO Auto-generated method stub
    				container.addView(viewList.get(position));
    				
    				
    				return viewList.get(position);
    			}
    		};
    		
    		
    		viewPager.setAdapter(pagerAdapter);
    		
        }
    
    
    }

    代码量很小,全部放在了OnCreate()函数中。

     

    1、先看声明的变量的意义:

     

     

    private View view1, view2, view3;
    private List<View> viewList;//view数组
    private ViewPager viewPager;  //对应的viewPager

     

    首先viewPager对应 <android.support.v4.view.ViewPager/>控件。

    view1,view2 ,view3对应我们的三个layout,即layout1.xml,layout2.xml,layout3.xml

    viewList是一个View数组,盛装上面的三个VIEW

    2、接下来是他们的初始化过程:

     

    viewPager = (ViewPager) findViewById(R.id.viewpager);
    LayoutInflater inflater=getLayoutInflater();
    view1 = inflater.inflate(R.layout.layout1, null);
    view2 = inflater.inflate(R.layout.layout2,null);
    view3 = inflater.inflate(R.layout.layout3, null);
    
    viewList = new ArrayList<View>();// 将要分页显示的View装入数组中
    viewList.add(view1);
    viewList.add(view2);
    viewList.add(view3);

    初始化过程难度不大,就是将资源与变量联系起来布局,最后将实例化的view1,view2,view3添加到viewList中

     

    3、PageAdapter——PageView的适配器

     

    适配器这个东东想必大家都不莫生,在ListView中也有适配器,listView通过重写GetView()函数来获取当前要加载的Item。而PageAdapter不太相同,毕竟PageAdapter是单个VIew的合集。

    PageAdapter 必须重写的四个函数:

     

    • boolean isViewFromObject(View arg0, Object arg1)
    • int getCount() 
    • void destroyItem(ViewGroup container, int position,Object object)
    • Object instantiateItem(ViewGroup container, int position)

     

    先看看各个函数,我们上面都做了什么吧:

     

    @Override
    public int getCount() {
    	// TODO Auto-generated method stub
    	return viewList.size();
    }

    getCount():返回要滑动的VIew的个数

     

     

    @Override
    public void destroyItem(ViewGroup container, int position,
    		Object object) {
    	// TODO Auto-generated method stub
    	container.removeView(viewList.get(position));
    }
    

    destroyItem():从当前container中删除指定位置(position)的View;

     

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
    	// TODO Auto-generated method stub
    		container.addView(viewList.get(position));
    		
    		
    		return viewList.get(position);
    	}
    };

    instantiateItem():做了两件事,第一:将当前视图添加到container中,第二:返回当前View

     

    @Override
    public boolean isViewFromObject(View arg0, Object arg1) {
    	// TODO Auto-generated method stub
    	return arg0 == arg1;
    }

    isViewFromObject():对于这个函数就先不做讲解,大家目前先知道它要这样重写就行了,后面我们会对它进行改写。

     

    下一篇,我将仔细讲解这几个函数的意义,与有关Key的知识,当然最后也会有个例子给大家。这篇就到这了。

     

    源码地址:http://download.csdn.net/detail/harvic880925/7733249

     

    请大家尊重原创者版权,转载请标明出处:http://blog.csdn.net/harvic880925/article/details/38453725  万分感激!!!!!

    如果你喜欢我的文章,你可能更喜欢我的公众号

    启舰杂谈

     

    展开全文
  • C语言 sizeof操作符详解

    万次阅读 多人点赞 2012-02-09 21:33:59
    sizeof,一个其貌不扬的家伙,引无数菜鸟竟折腰,小虾我当初也没少犯迷糊,秉着“ 辛苦我一个,幸福千万人”的伟大思想,我决定将其尽可能详细的总结一下。 但当我总结的时候才发现,这个问题既可以简单,又可以复杂...
  • web.xml的加载过程配置详解

    万次阅读 多人点赞 2017-12-02 09:24:31
    一:web.xml加载过程  简单说一下,web.xml的加载过程。当我们启动一个WEB项目容器时,容器包括(JBoss,Tomcat等)。首先会去读取web.xml配置文件里的配置,当这一步骤没有出错并且完成之后,项目才能正常的被启动...
  • Maven之(六)setting.xml配置文件详解

    万次阅读 多人点赞 2016-05-24 09:51:24
    鉴于CSDN对**版权保护的不作为**以及落后的运营手段,本博客将于近期关闭,并清空全部文章。 原有文章将会经过再次的校对、整理,转移至本人在**简书**的[博客空间](https://www.jianshu.com/u/3ec23ef9a408... ...
  • HttpServletRequest详解

    万次阅读 多人点赞 2019-05-16 09:41:37
    HttpServletRequest详解 HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象提供的方法,可以获得客户端请求的所有信息。 获得...
  • javaCV开发详解之2:推流器实现,推本地摄像头视频到流媒体服务器以及摄像头录制视频功能实现(基于javaCV-FFMPEG、javaCV-openCV) javaCV开发详解之3:收流器实现,录制流媒体服务器的rtsp/rtmp视频文件(基于javaCV...
  • 《TCP/IP详解 卷1:协议》PDF分享

    万次阅读 多人点赞 2019-04-08 21:51:59
    《TCP/IP详解》一共三卷,其中卷二、卷三更多偏重于编程细节,而卷一更多偏重于基础原理,基本上都是通过实验先看现象,然后再来引出其背后的原理,所以如果没有什么基础,还是踏踏实实从头看,这对于网络工程师、...
  • python求和函数sum()详解

    万次阅读 多人点赞 2019-04-06 21:32:44
    python求和函数sum()详解 今天在学习的过程中,误用sum()函数,我又去查了查python sum()函数才恍然大悟。 我本来想算几个Int值相加的和,本以为很简单的事情,结果却很悲伤,例: >>>sum = sum(1,2,3) #...
  • idea(一)使用详解

    万次阅读 多人点赞 2018-06-14 19:10:04
    IDEA的使用总结 idea作为目前java开发最舒服的工具,针对其使用做一些总结,提高开发效率: 安装和激活 初始常用配置 快捷键 常见用法总结 快捷键 加粗 Ctrl + B ...提升标题 Ctrl ...
  • JVM之内存结构详解

    万次阅读 多人点赞 2019-10-18 12:49:05
    今天开始,《JVM详解》系列开启,带大家深入了解JVM相关知识。 我们不能为了面试而面试,但是学习会这些核心知识你必定会成为面试与工作中“最亮的一颗星”。本系列首发于微信公众号“程序新视界”。下面,开启我们...
  • JVM运行原理详解

    万次阅读 多人点赞 2017-05-31 15:01:45
    1.JVM简析: 作为一名Java使用者,掌握JVM的体系结构也是很有必要的。 说起Java,我们首先想到的是Java编程语言,然而事实上,Java是一种技术,它由四方面组成:Java编程语言、Java类文件格式、Java虚拟机和Java...
  • 本博实时更新《Linux设备驱动开发详解(第3版)》(即《Linux设备驱动开发详解:基于最新的Linux 4.0内核》)的最新进展。 目前已经完成稿件。 2015年8月9日,china-pub开始上线预售: ... 2015年8月20日,各路朋友报喜...
  • Java基础篇:反射机制详解

    万次阅读 多人点赞 2018-09-29 10:19:50
    一、什么是反射: 反射是Java的特征之一,是一种间接操作目标对象的机制,核心是JVM在运行的时候才动态加载类,并且对于任意一个类,都能够知道这个类的所有属性和方法,调用方法/访问属性,不需要提前在编译期...
  • Maven使用详解,非常详细

    万次阅读 多人点赞 2017-02-20 15:25:02
    什么是Maven? 如今我们构建一个项目需要用到很多第三方的类库,如写一个使用spring的Web项目就需要引入大量的jar包。一个项目Jar包的数量之多往往让我们瞠目结舌,并且Jar包之间的关系错综复杂,一个Jar包往往又...
  • ViewPager 详解(五)-----使用Fragment实现ViewPager滑动

    万次阅读 多人点赞 2014-08-18 15:03:51
    前言:前几篇文章讲解了ViewPager的普通实现方法,但android官方最推荐的一种实现方法却是使用fragment,下面我们使用fragment来重新实现一下第一篇《ViewPager 详解(一)---基本入门》所实现的效果。 系列文章...
  • Linux从未停歇脚步。Linus Torvalds,世界上最伟大的程序员之一,Linux内核的创始人,Git的缔造者,仍然在没日没夜的合并补丁,升级内核。做技术,从来没有终南捷径,拼的就是坐冷板凳的傻劲。 ...

空空如也

1 2 3 4 5 ... 20
收藏数 1,303,491
精华内容 521,396
关键字:

详解