精华内容
下载资源
问答
  • 区块链为每一笔交易盖上时间戳

    千次阅读 2018-09-07 09:49:11
    黄老邪在传授记账方法时,要求居民将发生在桃花岛上的每一笔交易都记录下来,并且要求他们将交易发生的时间也一并记录在账本上,这就相当于区块链为每一笔交易在发生时盖上了时间戳(这里有时间戳是什么的介绍...

    黄老邪在传授记账方法时,要求居民将发生在桃花岛上的每一笔交易都记录下来,并且要求他们将交易发生的时间也一并记录在账本上,这就相当于区块链为每一笔交易在发生时盖上了时间戳(这里有时间戳是什么的介绍http://www.868qkl.com/shenme/timestamp.html)。

    在区块链中,时间戳的应用是对每一次交易记录的认证,它就像交易合同公证一样,能够显示交易记录的真实性。时间戳作为区块元数据的一部分,具有天然的时间特性。从某种意义上讲,区块链的本质可以被理解为构造了一个永不停息、无坚不摧的时间戳系统。

    在现实经济交易中,常常会出现信息欺诈等虚假交易现象。为了减少这些不法行为给交易中诚实守信的一方带来的损失,人们通常会寻求有公信力的第三方机构对交易进行核验。区块链通过时间戳来保证分布式账本的唯一性,避免双花问题的产生。时间戳从区块生成的一刻起就存在于区块之中,它扮演了区块链中的公证人的角色。与现有的公证机制相比,基于时间戳的公证系统更为经济,并且完全可信。

    区块链中的时间戳比传统的公证制度更为可信,是因为时间签名是直接写在区块链上的,区块链中已经生成的区块不能以任何方式进行修改。一旦区块被修改,生成的哈希值就无法匹配,操纵行为也将由此而被系统检测到。区块链根据分布式的协议,构建了一个分布式的开放结构体系,交换的信息可以通过分布式记账的方式确定信息数据内容,加盖时间戳后生成区块数据,再通过分布式广播发送给各个节点,最终实现分布式存储。

    对数据应用安全散列算法加盖时间戳,并将该随机哈希值在全网中进行广播能够证实一组数据在某一时刻是真实存在的,因为数据只有在该时刻的确存在,才能获取相应的随机哈希值。每个时间戳会将前一个时间戳纳入其随机哈希值之中,每一个后面位置的时间戳都会对前面的时间戳进行增强,这一过程不断重复、依次推进,最终形成一个完整的链条。时间戳与哈希算法、Merkle树共同作用,增强了区块链的安全性能。

    时间戳证明存在性的功能可能是区块链的另一种用途,它或许会彻底改变人类的未来。由于区块哈希值的不可伪造性,一个区块能提供出哈希值即可证明区块哈希值存在于该区块生成时刻之后,就像你在一张白纸上写下了一串数字,说明的是数字出现的时间晚于白纸——这也称为时间点后向证明。时间点前向证明则需要构造一个包含数字摘要的交易,当该交易进入区块后,便可以证明你在该区块时刻之前拥有该数字摘要。

    展开全文
  • Android:手把手教你写一个完整的自定义View

    万次阅读 多人点赞 2017-03-14 10:11:27
    今天,我将手把手教你写一个自定义View,并理清自定义View所有应该的注意点 阅读本文前,请先阅读我系列自定义View文章 自定义View基础 - 最易懂的自定义View原理系列(1) 自定义View Measure过程 - 最...

    前言

    • 自定义View是Android开发者必须了解的基础
    • 今天,我将手把手教你写一个自定义View,并理清自定义View所有应该的注意点

    阅读本文前,请先阅读我写的一系列自定义View文章
    自定义View基础 - 最易懂的自定义View原理系列(1)
    自定义View Measure过程 - 最易懂的自定义View原理系列(2)
    自定义View Layout过程 - 最易懂的自定义View原理系列(3)
    自定义View Draw过程- 最易懂的自定义View原理系列(4)


    目录

    目录


    1. 自定义View的分类

    自定义View一共分为两大类,具体如下图:
    分类


    2. 具体介绍 & 使用场景

    对于自定义View的类型介绍及使用场景如下图:
    具体介绍 & 使用场景


    3. 使用注意点

    在使用自定义View时有很多注意点(坑),希望大家要非常留意:
    使用注意点

    3.1 支持特殊属性

    • 支持wrap_content
      如果不在onMeasure()中对wrap_content作特殊处理,那么wrap_content属性将失效

    具体原因请看文章:为什么你的自定义View wrap_content不起作用?

    • 支持padding & margin
      如果不支持,那么paddingmargin(ViewGroup情况)的属性将失效
    1. 对于继承View的控件,padding是在draw()中处理
    2. 对于继承ViewGroup的控件,padding和margin会直接影响measure和layout过程

    3.2 多线程应直接使用post方式

    View的内部本身提供了post系列的方法,完全可以替代Handler的作用,使用起来更加方便、直接。

    3.3 避免内存泄露

    主要针对View中含有线程或动画的情况:当View退出或不可见时,记得及时停止该View包含的线程和动画,否则会造成内存泄露问题

    启动或停止线程/ 动画的方式:

    1. 启动线程/ 动画:使用view.onAttachedToWindow(),因为该方法调用的时机是当包含View的Activity启动的时刻
    2. 停止线程/ 动画:使用view.onDetachedFromWindow(),因为该方法调用的时机是当包含View的Activity退出或当前View被remove的时刻

    3.4 处理好滑动冲突

    当View带有滑动嵌套情况时,必须要处理好滑动冲突,否则会严重影响View的显示效果。


    4. 具体实例

    接下来,我将用自定义View中最常用的继承View来说明自定义View的具体应用和需要注意的点

    4.1 继承VIew的介绍

    Paste_Image.png

    在下面的例子中,我将讲解:

    • 如何实现一个基本的自定义View(继承VIew)

    • 如何自身支持wrap_content & padding属性

    • 如何为自定义View提供自定义属性(如颜色等等)

    • 实例说明:画一个实心圆

    4.2 具体步骤

    1. 创建自定义View类(继承View类)
    2. 布局文件添加自定义View组件
    3. 注意点设置(支持wrap_content & padding属性自定义属性等等)

    下面我将逐个步骤进行说明:
    步骤1:创建自定义View类(继承View类)

    CircleView.java

    // 用于绘制自定义View的具体内容
    // 具体绘制是在复写的onDraw()内实现
    
    public class CircleView extends View {
    
        // 设置画笔变量
        Paint mPaint1;
    
        // 自定义View有四个构造函数
        // 如果View是在Java代码里面new的,则调用第一个构造函数
        public CircleView(Context context){
            super(context);
    
            // 在构造函数里初始化画笔的操作
            init();
        }
    
    
    // 如果View是在.xml里声明的,则调用第二个构造函数
    // 自定义属性是从AttributeSet参数传进来的
        public CircleView(Context context,AttributeSet attrs){
            super(context, attrs);
            init();
    
        }
    
    // 不会自动调用
    // 一般是在第二个构造函数里主动调用
    // 如View有style属性时
        public CircleView(Context context,AttributeSet attrs,int defStyleAttr ){
            super(context, attrs,defStyleAttr);
            init();
        }
    
    
        //API21之后才使用
        // 不会自动调用
        // 一般是在第二个构造函数里主动调用
        // 如View有style属性时
        public  CircleView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
            super(context, attrs, defStyleAttr, defStyleRes);
        }
    
        // 画笔初始化
        private void init() {
    
            // 创建画笔
            mPaint1 = new Paint ();
            // 设置画笔颜色为蓝色
            mPaint1.setColor(Color.BLUE);
            // 设置画笔宽度为10px
            mPaint1.setStrokeWidth(5f);
            //设置画笔模式为填充
            mPaint1.setStyle(Paint.Style.FILL);
    
        }
    
    
        // 复写onDraw()进行绘制  
        @Override
        protected void onDraw(Canvas canvas) {
    
            super.onDraw(canvas);
    
           // 获取控件的高度和宽度
            int width = getWidth();
            int height = getHeight();
    
            // 设置圆的半径 = 宽,高最小值的2分之1
            int r = Math.min(width, height)/2;
    
            // 画出圆(蓝色)
            // 圆心 = 控件的中央,半径 = 宽,高最小值的2分之1
            canvas.drawCircle(width/2,height/2,r,mPaint1);
    
        }
    
    }
    

    特别注意:

    1. View的构造函数一共有4个,具体使用请看:深入理解View的构造函数
      理解View的构造函数
    2. 对于绘制内容为何在复写onDraw()里实现,具体请看我写的文章:自定义View Draw过程- 最易懂的自定义View原理系列(4)

    步骤2:在布局文件中添加自定义View类的组件

    activity_main.xml

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context="scut.carson_ho.diy_view.MainActivity">
    
    <!-- 注意添加自定义View组件的标签名:包名 + 自定义View类名-->
        <!--  控件背景设置为黑色-->
        <scut.carson_ho.diy_view.CircleView
            android:layout_width="match_parent"
            android:layout_height="150dp"
            android:background="#000000"
    
    </RelativeLayout>
    

    步骤3:在MainActivity类设置显示

    MainActivity.java

    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
        }
    }
    

    效果图

    好了,至此,一个基本的自定义View已经实现了。接下来继续看自定义View所有应该注意的点:

    • 如何手动支持wrap_content属性
    • 如何手动支持padding属性
    • 如何为自定义View提供自定义属性(如颜色等等)

    a. 手动支持wrap_content属性

    先来看wrap_content & match_parent属性的区别

    // 视图的宽和高被设定成刚好适应视图内容的最小尺寸
    android:layout_width="wrap_content"
    
    // 视图的宽和高延伸至充满整个父布局
    android:layout_width="match_parent"
    // 在Android API 8之前叫作"fill_parent"
    

    如果不手动设置支持wrap_content属性,那么wrap_content属性是不会生效(显示效果同match_parent

    具体原因 & 解决方案请看我写的文章:为什么你的自定义View wrap_content不起作用?

    b. 支持padding属性

    padding属性:用于设置控件内容相对控件边缘的边距;

    区别与margin属性(同样称为:边距):控件边缘相对父控件的边距(父控件控制),具体区别如下:

    Paste_Image.png

    如果不手动设置支持padding属性,那么padding属性在自定义View中是不会生效的。

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context="scut.carson_ho.diy_view.MainActivity">
    
        <scut.carson_ho.diy_view.CircleView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            /**  添加Padding属性,但不会生效 **/
            android:padding="20dp"
             />
    </RelativeLayout>
    
    

    解决方案

    绘制时考虑传入的padding属性值(四个方向)。

    在自定义View类的复写onDraw()进行设置

    CircleView.java

    // 仅看复写的onDraw()
    @Override
        protected void onDraw(Canvas canvas) {
    
            super.onDraw(canvas);
    
            // 获取传入的padding值
            final int paddingLeft = getPaddingLeft();
            final int paddingRight = getPaddingRight();
            final int paddingTop = getPaddingTop();
            final int paddingBottom = getPaddingBottom();
    
    
            // 获取绘制内容的高度和宽度(考虑了四个方向的padding值)
            int width = getWidth() - paddingLeft - paddingRight ;
            int height = getHeight() - paddingTop - paddingBottom ;
    
            // 设置圆的半径 = 宽,高最小值的2分之1
            int r = Math.min(width, height)/2;
    
            // 画出圆(蓝色)
            // 圆心 = 控件的中央,半径 = 宽,高最小值的2分之1
            canvas.drawCircle(paddingLeft+width/2,paddingTop+height/2,r,mPaint1);
    
        }
    

    效果图

    c. 提供自定义属性

    系统自带属性,如

    // 基本是以android开头
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="#000000"
            android:padding="30dp"
    
    
    • 但有些时候需要一些系统所没有的属性,称为自定义属性
    • 使用步骤有如下:
      1. 在values目录下创建自定义属性的xml文件
      2. 在自定义View的构造方法中解析自定义属性的值
      3. 在布局文件中使用自定义属性

    下面我将对每个步骤进行具体介绍

    步骤1:在values目录下创建自定义属性的xml文件

    attrs_circle_view.xml

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <!--自定义属性集合:CircleView-->
        <!--在该集合下,设置不同的自定义属性-->
        <declare-styleable name="CircleView">
            <!--在attr标签下设置需要的自定义属性-->
            <!--此处定义了一个设置图形的颜色:circle_color属性,格式是color,代表颜色-->
            <!--格式有很多种,如资源id(reference)等等-->
            <attr name="circle_color" format="color"/>
    
        </declare-styleable>
    </resources>
    

    对于自定义属性类型 & 格式如下:

    <-- 1. reference:使用某一资源ID -->
    <declare-styleable name="名称">
        <attr name="background" format="reference" />
    </declare-styleable>
    // 使用格式
    <ImageView
        android:layout_width="42dip"
        android:layout_height="42dip"
        android:background="@drawable/图片ID" />
    
    <--  2. color:颜色值 -->
    <declare-styleable name="名称">
        <attr name="textColor" format="color" />
    </declare-styleable>
    // 格式使用
    <TextView
        android:layout_width="42dip"
        android:layout_height="42dip"
        android:textColor="#00FF00" />
    
    <-- 3. boolean:布尔值 -->
    <declare-styleable name="名称">
        <attr name="focusable" format="boolean" />
    </declare-styleable>
    // 格式使用
    <Button
        android:layout_width="42dip"
        android:layout_height="42dip"
        android:focusable="true" />
    
    <-- 4. dimension:尺寸值 -->
    <declare-styleable name="名称">
        <attr name="layout_width" format="dimension" />
    </declare-styleable>
    // 格式使用:
    <Button
        android:layout_width="42dip"
        android:layout_height="42dip" />
    
    <-- 5. float:浮点值 -->
    <declare-styleable name="AlphaAnimation">
        <attr name="fromAlpha" format="float" />
        <attr name="toAlpha" format="float" />
    </declare-styleable>
    // 格式使用
    <alpha
        android:fromAlpha="1.0"
        android:toAlpha="0.7" />
    
    <-- 6. integer:整型值 -->
    <declare-styleable name="AnimatedRotateDrawable">
        <attr name="frameDuration" format="integer" />
        <attr name="framesCount" format="integer" />
    </declare-styleable>
    // 格式使用
    <animated-rotate
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:frameDuration="100"
        android:framesCount="12"
     />
    
    <-- 7. string:字符串 -->
    <declare-styleable name="MapView">
        <attr name="apiKey" format="string" />
    </declare-styleable>
    // 格式使用
    <com.google.android.maps.MapView
     android:apiKey="0jOkQ80oD1JL9C6HAja99uGXCRiS2CGjKO_bc_g" />
    
    <-- 8. fraction:百分数 -->
    <declare-styleable name="RotateDrawable">
        <attr name="pivotX" format="fraction" />
        <attr name="pivotY" format="fraction" />
    </declare-styleable>
    // 格式使用
    <rotate
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:pivotX="200%"
        android:pivotY="300%"
     />
    
    
    <-- 9. enum:枚举值 -->
    <declare-styleable name="名称">
        <attr name="orientation">
            <enum name="horizontal" value="0" />
            <enum name="vertical" value="1" />
        </attr>
    </declare-styleable>
    // 格式使用
    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
    />
    
    <-- 10. flag:位或运算 -->
    <declare-styleable name="名称">
        <attr name="windowSoftInputMode">
            <flag name="stateUnspecified" value="0" />
            <flag name="stateUnchanged" value="1" />
            <flag name="stateHidden" value="2" />
            <flag name="stateAlwaysHidden" value="3" />
            <flag name="stateVisible" value="4" />
            <flag name="stateAlwaysVisible" value="5" />
            <flag name="adjustUnspecified" value="0x00" />
            <flag name="adjustResize" value="0x10" />
            <flag name="adjustPan" value="0x20" />
            <flag name="adjustNothing" value="0x30" />
        </attr>
    </declare-styleable>、
    // 使用
    <activity
        android:name=".StyleAndThemeActivity"
        android:label="@string/app_name"
        android:windowSoftInputMode="stateUnspecified | stateUnchanged | stateHidden" >
    
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    
    
    
    <-- 特别注意:属性定义时可以指定多种类型值 -->
    <declare-styleable name="名称">
        <attr name="background" format="reference|color" />
    </declare-styleable>
    // 使用
    <ImageView
        android:layout_width="42dip"
        android:layout_height="42dip"
        android:background="@drawable/图片ID|#00FF00" />
    

    步骤2:在自定义View的构造方法中解析自定义属性的值

    此处是需要解析circle_color属性的值

    // 该构造函数需要重写
      public CircleView(Context context, AttributeSet attrs) {
    
            this(context, attrs,0);
            // 原来是:super(context,attrs);
            init();
    
    
    public CircleView(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
    
            // 加载自定义属性集合CircleView
            TypedArray a = context.obtainStyledAttributes(attrs,R.styleable.CircleView);
    
            // 解析集合中的属性circle_color属性
            // 该属性的id为:R.styleable.CircleView_circle_color
            // 将解析的属性传入到画圆的画笔颜色变量当中(本质上是自定义画圆画笔的颜色)
            // 第二个参数是默认设置颜色(即无指定circle_color情况下使用)
            mColor = a.getColor(R.styleable.CircleView_circle_color,Color.RED);
    
            // 解析后释放资源
            a.recycle();
    
            init();
    
    
    

    步骤3:在布局文件中使用自定义属性

    activity_main.xml

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
      <!--必须添加schemas声明才能使用自定义属性-->
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context="scut.carson_ho.diy_view.MainActivity"
        >
      
    <!-- 注意添加自定义View组件的标签名:包名 + 自定义View类名-->
        <!--  控件背景设置为黑色-->
        <scut.carson_ho.diy_view.CircleView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
    
            android:background="#000000"
            android:padding="30dp"
    
        <!--设置自定义颜色-->
            app:circle_color="#FF4081"
             />
    </RelativeLayout>
    

    Paste_Image.png

    至此,一个较为规范的自定义View已经完成了。

    完整代码下载

    Carson_Ho的github:自定义View的具体应用


    5. 总结


    请帮顶 / 评论点赞!因为你们的赞同/鼓励是我写作的最大动力!

    展开全文
  • 今天在看Oracle的BackupGroundProcess,里边有段是到为什么先日志后数据的: LGWR, on the other hand, does lots of sequential writes to the redo log. This is an important distinction and one of ...

    今天在看Oracle的BackupGroundProcess,里边有一段是写到为什么先写日志后写数据的:

    LGWR, on the other hand, does lots of sequential writes to the redo log. This is an important distinction and one of the reasons that Oracle has a redo log and the LGWR process as well as the DBWn process. Scattered writes are significantly slower than sequential writes. By having the SGA buffer dirty blocks and the LGWR process do large sequential writes that can re-create these dirty buffers, we achieve an increase in performance.

     

    其实SQL Server也是一样,每一个SQL Server的数据库都会按照其修改数据(insert,update,delete)的顺序将对应的日志记录到日志文件.SQL Server使用了Write-Ahead logging技术来保证了事务日志的原子性和持久性.而这项技术不仅仅保证了ACID中的原子性(A)和持久性(D),还大大减少了IO操作,把对数据的修改提交到磁盘的工作交给lazy-writer和checkpoint.

    预写式日志(Write-Ahead Logging (WAL))

    SQL Server使用了WAL来确保了事务的原子性和持久性.实际上,不光是SQL Server,基本上主流的关系数据库包括oracle,mysql,db2都使用了WAL技术.

    WAL的核心思想是:在数据写入到数据库之前,先写入到日志.

    因为对于数据的每笔修改都记录在日志中,所以将对于数据的修改实时写入到磁盘并没有太大意义,即使当SQL Server发生意外崩溃时,在恢复(recovery)过程中那些不该写入已经写入到磁盘的数据会被回滚(RollBack),而那些应该写入磁盘却没有写入的数据会被重做(Redo)。从而保证了持久性(Durability)

    但WAL不仅仅是保证了原子性和持久性。还会提高性能.

    硬盘是通过旋转来读取数据,通过WAL技术,每次提交的修改数据的事务并不会马上反映到数据库中,而是先记录到日志.在随后的CheckPoint和lazy Writer中一并提交,如果没有WAL技术则需要每次提交数据时写入数据库:

    而使用WAL合并写入,会大大减少磁盘IO:

    也许你会有疑问,那每次对于修改的数据还是会写入日志文件.同样消耗磁盘IO。上篇文章讲过,每一笔写入日志的记录都是按照先后顺序,给定顺序编号的LSN进行写入的,日志只会写入到日志文件的逻辑末端。而不像数据那样,可能会写到磁盘的各个地方.所以,写入日志的开销会比写入数据的开销小很多。

    SQL Server修改数据的步骤

    SQL Server对于数据的修改,会分为以下几个步骤顺序执行:

    1.在SQL Server的缓冲区的日志中写入”Begin Tran”记录

    2.在SQL Server的缓冲区的日志页写入要修改的信息

    3.在SQL Server的缓冲区将要修改的数据写入数据页

    4.在SQL Server的缓冲区的日志中写入”Commit”记录

    5.将缓冲区的日志写入日志文件

    6.发送确认信息(ACK)到客户端(SMSS,ODBC等)

    可以看到,事务日志并不是一步步写入磁盘.而是首先写入缓冲区后,一次性写入日志到磁盘.这样既能在日志写入磁盘这块减少IO,还能保证日志LSN的顺序.

    上面的步骤可以看出,即使事务已经到了Commit阶段,也仅仅只是把缓冲区的日志页写入日志,并没有把数据写入数据库.那将要修改的数据页写入数据库是在何时发生的呢?

    Lazy Writer和CheckPoint

    上面提到,SQL Server修改数据的步骤中并没有包含将数据实际写入到磁盘的过程.实际上,将缓冲区内的页写入到磁盘是通过两个过程中的一个实现:

    这两个过程分别为:

    1.CheckPoint

    2.Lazy Writer

    任何在缓冲区被修改的页都会被标记为“脏”页。将这个脏页写入到数据磁盘就是CheckPoint或者Lazy Writer的工作.

    当事务遇到Commit时,仅仅是将缓冲区的所有日志页写入磁盘中的日志文件:

    而直到Lazy Writer或CheckPoint时,才真正将缓冲区的数据页写入磁盘文件:

    前面说过,日志文件中的LSN号是可以比较的,如果LSN2>LSN1,则说明LSN2的发生时间晚于LSN1的发生时间。CheckPoint或Lazy Writer通过将日志文件末尾的LSN号和缓冲区中数据文件的LSN进行对比,只有缓冲区内LSN号小于日志文件末尾的LSN号的数据才会被写入到磁盘中的数据库。因此确保了WAL(在数据写入到数据库之前,先写入日志)。

    Lazy Writer和CheckPoint的区别

    Lazy Writer和CheckPoint往往容易混淆。因为Lazy Writer和CheckPoint都是将缓冲区内的“脏”页写入到磁盘文件当中。但这也仅仅是他们唯一的相同点了。

    Lazy Writer存在的目的是对缓冲区进行管理。当缓冲区达到某一临界值时,Lazy Writer会将缓冲区内的脏页存入磁盘文件中,而将未修改的页释放并回收资源。

    而CheckPoint存在的意义是减少服务器的恢复时间(Recovery Time).CheckPoint就像他的名字指示的那样,是一个存档点.CheckPoint会定期发生.来将缓冲区内的“脏”页写入磁盘。但不像Lazy Writer,Checkpoint对SQL Server的内存管理毫无兴趣。所以CheckPoint也就意味着在这个点之前的所有修改都已经保存到了磁盘.这里要注意的是:CheckPoint会将所有缓冲区的脏页写入磁盘,不管脏页中的数据是否已经Commit。这意味着有可能已经写入磁盘的“脏页”会在之后回滚(RollBack).不过不用担心,如果数据回滚,SQL Server会将缓冲区内的页再次修改,并写入磁盘。

    通过CheckPoint的运作机制可以看出,CheckPoint的间歇(Recovery Interval)长短有可能会对性能产生影响。这个CheckPoint的间歇是一个服务器级别的参数。可以通过sp_config进行配置,也可以在SSMS中进行配置:

    恢复间歇的默认参数是0,意味着由SQL Server来管理这个回复间隔。而自己设置恢复间隔也是需要根据具体情况来进行界定。更短的恢复间歇意味这更短的恢复时间和更多的磁盘IO,而更长的恢复间歇则带来更少的磁盘IO占用和更长的恢复时间.

    SQL Server原理讲解来源于:http://www.uml.org.cn/sjjm/201203021.asp

    展开全文
  • 毛笔运

    千次阅读 2011-07-04 14:03:46
    毛笔字运的要求是中锋铺毫,既要让毫在点画中间运行,又要灵活自如。指导学生运时,要一边讲一边示范,注意以下四点。 1.逆锋起笔。指起笔时笔锋要“欲左先右,欲右先左;欲上先下,欲下先上”,做到起笔...

    写毛笔字运笔的要求是中锋铺毫,既要让笔毫在点画中间运行,又要灵活自如。指导学生运笔时,要一边讲一边示范,注意以下四点。

      1.逆锋起笔。指起笔时笔锋要“欲左先右,欲右先左;欲上先下,欲下先上”,做到起笔藏锋。

      2.回锋收笔。指写横和竖到尽头要收笔时,将笔略微提起,使笔锋回转。

      3.中锋运笔。指行笔时锋尖始终从笔画中间运行,使写出的字笔韵光洁,骨肉匀称,饱满生神。

      4.毛笔在蘸墨时,要不断地转动笔杆,使笔毛保持正直,四面吸匀墨汁。

     

     

       谈起毛笔的运笔,无论是起笔、行笔和收笔,转锋(圆笔)和折锋(方笔),还是提笔和按笔,或者是疾锋和徐锋,都应遵循一个重要法则,这就是中锋运笔,它是中国书法用笔的传统技法,是一切运笔技巧的根本和灵魂。正如清代笪重光在《书筏》中所说:“能运中锋,虽败笔亦圆;不会中锋,即佳颖亦劣。优劣之根,断在于此。”

        何谓中锋?汉代蔡邕在《九势》中说:“令笔心常在点画中行。”这就是说,中锋运笔时,让笔头的中心锋芒(笔心、锋尖)始终在笔画的中心移动,这样墨汁能均匀地从笔锋的两边渗到纸上,四面俱到。写出的笔画充实、圆满,具有立体厚实感,产生“引筋入骨”“玉润珠圆”的效果。

        古人常以“如锥画沙”来形容中锋运笔的方法。试想,当一根铁锥在平整的沙面上划过去后,会产生一道中间深凹,两边渐浅的锥槽体形。由于光线作用,深的地方就显得暗,而浅的地方就显得明一些,这种深浅明暗的作用,就会产生一种立体感,这与中锋行笔的情境有异曲同工之妙。由于笔锋处吃墨较多而色深,笔锋的两侧相对的吃墨较少而色浅。由于深浅明暗的作用,书写出来笔画的效果必然产生立体感。不妨拿起笔试一试,按中锋运笔方法写一笔画,晾干后从纸背面看,而隐约见到在笔画的中间有一道颜色较深的墨线,这就是中锋运行的路线。

        由于中锋运笔写出的字沉着有力,四面势全,所以古人提出要“笔笔中锋”。这就是说,中锋运笔要贯穿运笔的全过程和全部技能技巧中。

    要做到中锋行笔,关键在笔直,笔直则锋正,锋正即为中锋。因此初学写字,要注意把笔执正。当然,所谓“笔直”,并非笔管始终垂直于纸面,而是随着笔锋的运行,笔管也在向相反的方向运动,但从笔管运动方向垂直的左右(或前后)两边看,笔管又总是端正的。

        从理论上解释中锋的含义并不困难,但在实际书写过程中,要使笔尖经常保持在笔画之中运行,并非是一件容易的事。因为毛笔柔软而富有弹性,当笔锋接触纸面时,就自然形成一个偏侧状态,在书写过程中,在不断的笔画交替过程中,笔锋也无时不向偏侧的方向转化。那么怎样才能使笔尖经常保持在笔画的中间运行呢?可以通过不断调整笔锋来实现。具体方法是:通过提笔和按笔的交替运用,利用笔毫的自然弹性,使铺锋后“跌倒”的笔毫迅速“站立起来”(裹锋);通过揉动笔锋(衄笔)和让笔锋与纸面磨擦(挫笔),产生一种“屋漏痕迹”;通过笔锋往往复复的重复运行,来弥补残缺不全的笔画;总之,通过以上这样上下、左右、前后六个动作的协调运用,可以将散乱、纠缠、偏侧的笔锋调整过去,保持笔笔中锋。当然这些运作都是在运笔过程中一刹那间完成的,有时甚至肉眼不能察觉,但只要精通了这些方法,就能保证始终运用中锋行笔,写出饱满有力的笔画。

        总之,中锋运笔是笔法的根本,但不是唯一的运笔方法。要使笔画富于变化还必须掌握“偏锋”、“侧锋”等运笔方法。

        与中锋互为对应的就是偏锋运笔。所谓偏锋,就是运笔时让笔头的中心锋芒偏向笔画的一侧运行,使笔锋卧倒,像拖地板一样平拖过去。偏锋用得好,写出的笔画锋棱外露,姿态妍丽,富于变化。但用得不好就会导致一边充实一边枯涩偏薄,墨不入纸,笔画显得扁平无力,所以有人主张少用,初学者尤不宜多用。

        介于中锋和偏锋之间还有一种运笔方法叫做“侧锋”。有很多人把“侧锋”与“偏锋”混为一谈,是不全面的,“侧锋”虽含有“偏锋”的成份,本质上却是有区别的。

        “永字八法”中把“点”称为“侧”法,就包含着以侧取势的意思,“横画须直入笔锋,竖画须横入笔锋”的“逆势切入法”。这其中的“侧入”、“横入”、“直入”、“切入”都是一个意思,即用方笔,像刀切一样侧向入纸。这时笔锋往往形成一偏侧状态,再利用笔锋的自然弹性,和手腕的提按衄挫动作,立即或逐步将这偏侧的笔锋揉入收回到笔画的中心,平铺于纸上,这就是侧锋运笔。方笔在折、钩、捺、挑等折角处的棱角往往就是侧然所产生的效果。也可以这么说,所谓侧锋就是能表现出方笔效果的折锋运笔法。侧锋运笔尽管在一定程度上带有偏锋的成份,但其本质上区别就在于:偏锋是一偏到底,而侧锋则是笔锋由偏锋转中锋的过渡;偏锋的笔锋僵卧于纸上平拖过去,而侧锋用笔却卧而能起,让笔锋基本上站立着走的。

    中锋、侧锋、偏锋既有区别又有联系。中锋运笔,笔锋平铺于纸上,写出的笔画圆融;侧锋运笔,笔锋斜铺于纸上,写出的笔画方劲;偏锋运笔,笔锋卧伏于纸上,写出的笔画扁平。侧锋中含有偏锋的成份,通过调锋,最终还要回归到中锋上来。


    展开全文
  • 1.1 hbase内部原理1.1.1 系统架构 Client ...1 保证任何时候,集群中只有个master 2 存贮所有Region的寻址入口—-root表在哪台服务器上。 3 实时监控Region Server的状态,将Region server的上线
  • 据说美国宇航员在太空很郁闷,失重条件下钢笔和圆珠总是不了字。美国科学家花费了X年时间X多经费(最近个在农大演讲的我国某专家已经加码到100亿美元)终于研制出能在失重条件下使用的钢笔。而与此同时,苏联...
  • 写一个带有验证码的登录界面

    千次阅读 2019-05-21 22:59:33
    首先验证码的形成,我们写一个servlet类 package servlet; import javax.imageio.ImageIO; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet....
  • 在2019年的最后天,有感而发

    千次阅读 多人点赞 2020-01-24 00:54:27
    又到一年的年底了,回首看自己匆忙度过的这几年,几乎所有时间都在工作、在公司、在客户那,不仅感慨自己的职业生涯,太悲催了,做的技术太容易被利用,这几年光帮别人挣的盆满钵满,自己还是苦的一笔,穷的要死。...
  • 推荐给IT项目经理的好书

    万次阅读 2018-03-21 11:46:34
    原文地址:http://www.cnblogs.com/cbook/archive/2011/01/19/1939060.html(防止原文作者删除、只能拷贝份了)推荐给IT项目经理的好书清理电脑,十数年来,无数资料,近来每天抽空好好整理整理, 做IT的特别是整...
  • java学习的第个东西《飞机大战》

    万次阅读 多人点赞 2016-04-26 23:27:27
    java学习的第个东西《飞机大战》
  • CSDN封声明

    千次阅读 多人点赞 2018-01-31 23:16:23
    经过反复思考之后,由于CSDN越来越违背程序无偿、开源初衷,比如下载分再也不能设置为0,图片再也不能设置为无水印等待,下定决心对CSDN封,下次再编程记录的话,将会在开源中国另起炉灶!...
  • 章: 利用神经网络识别手写数字

    万次阅读 2017-03-28 11:35:51
    人类视觉系统是大自然的大奇迹。 考虑下面的手写数字序列: 大部分人能够毫不费力的识别出这些数字是 504192。这种简单性只是个幻觉。在我们大脑各半球,有个主要的视觉皮层,即V1,它包含1.4...
  • 作用 主要提供给英语一般但生活中需要用iPad阅读电子文本的人,这个分屏很纯粹! https://github.com/qizhemotuosangeyan/translateTools 这个是使用截图,目前版本V0.1 还有很多不完善的地方,请留下您宝贵的建议...
  • OCR(联机手写汉字识别)

    万次阅读 2005-09-01 14:57:00
    必须指出的是,输入的作用不只是输入字符的图形,还要据此对该字符加以识别,并用机内代码来表示,以便于对输入的文字作进一步处理。电子计算机是西方发明的,用键盘来打印拼音文字在西方已有很长的历史,因此采用...
  • 对五险一金以及个人所得税模模糊糊在毕业找工作容易踩坑,下面把自己查阅的一些资料在下面,...养老保险只要累计缴满十五年,当你达到法定退休年龄并退休以后,就可以每个月领取一笔钱啦,这笔钱也就是我们说的退休金
  • 嵌入式软件工程师面试的问题和解析(

    万次阅读 多人点赞 2016-05-31 17:09:10
    0x3132(0x32是低位,0x31是高位),把它赋值给个short变量,那么它在内存中的存储可能有如下种情况: (1)、大端 字节(Big-endian): ----------------->>>>>>>>内存地址增大方向 short变量地址  0x1000...
  • 前几天看了篇关于动画的博客叫手摸手教你 Slack 的 Loading 动画,看着挺炫,但是是安卓版的,寻思的着仿造着写一篇iOS版的,下面是我这个动画的分解~ 老规矩先上图和demo地址:刚看到这个动画的时候,脑海里...
  • 超长的篇 Django 立项博客,学习来吧,微微型 CSDN 项目
  • 近来陆续有不少师弟师妹校友求分享各种资料和经验,想来手头上确实还有一些资源,也包括当初博主的师兄师姐们以及某些无私的大牛们分享的资料,经面经以及感想。于是翻出来看看,倒是也勾起了不少博主当初找工作...
  • Vue: export default中的name属性到底有啥作用呢?

    万次阅读 多人点赞 2018-10-31 11:08:01
    又开始个全新的项目,每天都要元气满满呀~在划分模块和创建单页面组件时,常常到name。嵌套路由中,index.vue极为常见,那么在vue中,export default { name: 'xxx'} 中的name到底有啥作用呢? 开始 还是先...
  • 写一手好字:硬笔书法轻松自学指南(知乎周刊 Plus) 知乎编辑团队 楷书,认知好字的范本 2017-03-16 《黄自元间架结构九十二法》 选本好字帖 2017-03-16 先谈书体。 前人对练习书法的程序,各有主张。有的认为...
  • 绝对受用的求职经验分享感谢天津大学这篇求职经历的那位研究生。目录关于我的系列文章的解释和说明我的求职历程及经验分享():求职历程总结我的求职历程及经验分享(二):前期准备我的求职历程及经验分享(三...
  • 难道在公司基本上无法告老退休,金融危机时不时来次,企业时不时也来次战略调整,就会被辞退了,。那这种经济团体是人性化的吗?这是个大课题~~--------------------------------------------------------------...
  • 【转】腾讯、百度、网易游戏、华为Offer及经面经  [题注】:转载的目的是告诫自己,认清差距、时时警示自己,要加油!...这个帖子花了我个夜晚的时间,不是为了炫耀,只是为了能给那些“迷惘”的
  • 个十多年做技术的朋友 13:37:42在?...时序图只是帮助把类图中的方法调用关系展现出来,辅助完成类图开发的作用个十多年做技术的朋友 13:56:46流程图呢?个十多年做技术的朋友 13:57:09我最关注
  • Android 框架炼成 教你如何组件间通信框架EventBus

    万次阅读 多人点赞 2014-11-20 09:27:58
    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/41096639 ,本文出自:【张鸿洋的博客】1、概述关于Eventbus的介绍,前面已经有篇:Android EventBus实战 没听过你就out了和Android ...
  • 4 “最后的堡垒”——脱机手写汉字识别4.1 攻克...但是由于手写汉字字形变化大,上章中介绍的各种印刷汉字识别特征和方法不完全适用,目前也还没有一套行之有效的识别方法。这是汉字识别最困难的问题,被认为是模式识
  • 非特定人脱机手写汉字识别

    千次阅读 2005-09-01 15:18:00
    陈友斌 丁晓青 吴佑寿 、汉字识别概述 汉字已有数千年的历史,也是世界上使用人数最多的文字,对于中华民族灿烂文化的形成和发展有着不可磨灭的功勋,并将继续发挥重要的、其它文字形式难以取代的作用。...
  • SDRAM的读写

    千次阅读 2010-05-18 19:15:00
    但是在CAS发出之后,仍要经过一定的时间才能有数据输出,从CAS与读取命令发出到第一笔数据输出的这段时间,被定义为CL(CAS Latency,CAS潜伏期)。由于CL只在读取时出现,所以CL又被称为读取潜伏期(RL,Read Lat
  • 详解MFC画笔的使用

    千次阅读 2014-09-21 13:14:18
    (3)画图、文字等; (4)释放句柄:ReleaseDC(hwnd,hDC); 那么,如果想要画条,则: HDC hdc; hdc = ::GetDC(m_hWnd); MoveToEx(hdc, m_ptOrigin.x, m_ptOrigin.y, NULL); LineTo(hdc, point.x,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 57,373
精华内容 22,949
关键字:

一笔两写的作用